Author: tschmitz
Date: Fri Aug 19 01:39:39 2011
New Revision: 50846

URL: http://svn.gna.org/viewcvs/wesnoth?rev=50846&view=rev
Log:
Changed mapbuilder/validate _visitor implementations.

Modified:
    trunk/src/whiteboard/mapbuilder_visitor.cpp
    trunk/src/whiteboard/mapbuilder_visitor.hpp
    trunk/src/whiteboard/validate_visitor.cpp
    trunk/src/whiteboard/validate_visitor.hpp

Modified: trunk/src/whiteboard/mapbuilder_visitor.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/mapbuilder_visitor.cpp?rev=50846&r1=50845&r2=50846&view=diff
==============================================================================
--- trunk/src/whiteboard/mapbuilder_visitor.cpp (original)
+++ trunk/src/whiteboard/mapbuilder_visitor.cpp Fri Aug 19 01:39:39 2011
@@ -18,13 +18,9 @@
  */
 
 #include "mapbuilder_visitor.hpp"
+
 #include "action.hpp"
-#include "attack.hpp"
-#include "move.hpp"
-#include "recall.hpp"
-#include "recruit.hpp"
 #include "side_actions.hpp"
-#include "suppose_dead.hpp"
 #include "utility.hpp"
 
 #include "foreach.hpp"
@@ -37,11 +33,10 @@
 {
 
 mapbuilder_visitor::mapbuilder_visitor(unit_map& unit_map)
-       : visitor()
-       , unit_map_(unit_map)
+       : unit_map_(unit_map)
        , applied_actions_()
-       , mode_(BUILD_PLANNED_MAP)
        , resetters_()
+       , acted_this_turn_()
 {
 }
 
@@ -56,107 +51,48 @@
        int current_side = resources::controller->current_side();
        foreach(unit& u, *resources::units)
        {
-               if(u.side() != current_side)
-                       resetters_.push_back(new unit_movement_resetter(u));
+               resetters_.push_back(new unit_movement_resetter(u,false));
+               //make sure current team's units are not reset to full moves on 
first turn
+               if(u.side() == current_side)
+                       acted_this_turn_.insert(&u);
        }
 }
 
 void mapbuilder_visitor::build_map()
 {
-       //Temporarily reset all units' moves to full EXCEPT for the ones on 
current_team.
        reset_moves();
-
-       mode_ = BUILD_PLANNED_MAP;
        visit_all();
 }
 
 bool mapbuilder_visitor::visit(size_t, team&, side_actions&, 
side_actions::iterator itor)
 {
-       if((*itor)->is_valid())
-               (*itor)->accept(*this);
+       action_ptr act = *itor;
+       unit* u = act->get_unit();
+
+       if(acted_this_turn_.find(u) == acted_this_turn_.end())
+       {
+               u->set_movement(u->total_movement());
+               acted_this_turn_.insert(u);
+       }
+       validate(itor);
+       if(act->is_valid())
+       {
+               act->apply_temp_modifier(unit_map_);
+               applied_actions_.push_back(act);
+       }
        return true;
 }
 
-void mapbuilder_visitor::visit_move(move_ptr move)
-{
-       if(mode_ == BUILD_PLANNED_MAP)
-       {
-               move->apply_temp_modifier(unit_map_);
-               //remember which actions we applied, so we can unapply them 
later
-               applied_actions_.push_back(move);
-       }
-       else if (mode_ == RESTORE_NORMAL_MAP)
-       {
-               move->remove_temp_modifier(unit_map_);
-       }
-}
-
-void mapbuilder_visitor::visit_attack(attack_ptr attack)
-{
-       if(mode_ == BUILD_PLANNED_MAP)
-       {
-               attack->apply_temp_modifier(unit_map_);
-               //remember which actions we applied, so we can unapply them 
later
-               applied_actions_.push_back(attack);
-       }
-       else if (mode_ == RESTORE_NORMAL_MAP)
-       {
-               attack->remove_temp_modifier(unit_map_);
-       }
-}
-
-void mapbuilder_visitor::visit_recruit(recruit_ptr recruit)
-{
-       if(mode_ == BUILD_PLANNED_MAP)
-       {
-               recruit->apply_temp_modifier(unit_map_);
-               //remember which actions we applied, so we can unapply them 
later
-               applied_actions_.push_back(recruit);
-       }
-       else if (mode_ == RESTORE_NORMAL_MAP)
-       {
-               recruit->remove_temp_modifier(unit_map_);
-       }
-}
-
-void mapbuilder_visitor::visit_recall(recall_ptr recall)
-{
-       if(mode_ == BUILD_PLANNED_MAP)
-       {
-               recall->apply_temp_modifier(unit_map_);
-               //remember which actions we applied, so we can unapply them 
later
-               applied_actions_.push_back(recall);
-       }
-       else if (mode_ == RESTORE_NORMAL_MAP)
-       {
-               recall->remove_temp_modifier(unit_map_);
-       }
-}
-
-void mapbuilder_visitor::visit_suppose_dead(suppose_dead_ptr sup_d)
-{
-       if(mode_ == BUILD_PLANNED_MAP)
-       {
-               sup_d->apply_temp_modifier(unit_map_);
-               //remember which actions we applied, so we can unapply them 
later
-               applied_actions_.push_back(sup_d);
-       }
-       else if(mode_ == RESTORE_NORMAL_MAP)
-       {
-               sup_d->remove_temp_modifier(unit_map_);
-       }
-}
+bool mapbuilder_visitor::post_visit_team(size_t, team&, side_actions&)
+       {acted_this_turn_.clear();   return true;}
 
 void mapbuilder_visitor::restore_normal_map()
 {
-       mode_ = RESTORE_NORMAL_MAP;
-       action_queue::const_reverse_iterator rit;
-       action_queue::const_reverse_iterator end = applied_actions_.rend();
        //applied_actions_ contain only the actions that we applied to the unit 
map
-       for (rit = applied_actions_.rbegin(); rit != end; ++rit)
+       BOOST_REVERSE_FOREACH(action_ptr act, applied_actions_)
        {
-               assert((*rit)->is_valid());
-               (*rit)->accept(*this);
+               assert(act->is_valid());
+               act->remove_temp_modifier(unit_map_);
        }
 }
 

Modified: trunk/src/whiteboard/mapbuilder_visitor.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/mapbuilder_visitor.hpp?rev=50846&r1=50845&r2=50846&view=diff
==============================================================================
--- trunk/src/whiteboard/mapbuilder_visitor.hpp (original)
+++ trunk/src/whiteboard/mapbuilder_visitor.hpp Fri Aug 19 01:39:39 2011
@@ -36,40 +36,26 @@
  * and reverts all changes on destruction.
  */
 class mapbuilder_visitor
-       : private visitor
-       , private enable_visit_all<mapbuilder_visitor>
+       : private enable_visit_all<mapbuilder_visitor>
 {
        friend class enable_visit_all<mapbuilder_visitor>;
-
-       friend class validate_visitor;
 
 public:
        mapbuilder_visitor(unit_map& unit_map);
        virtual ~mapbuilder_visitor();
 
-       /**
-        * Calls the appropriate visit_* method on each of the actions 
contained in the
-        * side_actions objects of every team whose turn comes earlier in the 
turn order,
-        * including (and stopping at) the viewer's team.
-        */
+       ///builds every team's actions as far into the future as possible, in 
the correct order
        void build_map();
 
 private:
-       virtual void visit_move(move_ptr move);
-       virtual void visit_attack(attack_ptr attack);
-       virtual void visit_recruit(recruit_ptr recruit);
-       virtual void visit_recall(recall_ptr recall);
-       virtual void visit_suppose_dead(suppose_dead_ptr sup_d);
-
        //"Inherited" from enable_visit_all
        bool visit(size_t team_index, team&, side_actions&, 
side_actions::iterator);
-       bool pre_visit_team(size_t team_index, team& t, side_actions& sa)
-               {return 
enable_visit_all<mapbuilder_visitor>::pre_visit_team(team_index,t,sa);}
-       bool post_visit_team(size_t team_index, team&, side_actions&)
-               {return team_index != viewer_team();} //< Stop after visiting 
viewer_team
+       bool post_visit_team(size_t team_index, team&, side_actions&);
 
-       //Helper fcn: Temporarily resets all units' moves to max EXCEPT for
-       //the ones controlled by the player whose turn it is currently.
+       //For validate_visitor to override
+       virtual void validate(side_actions::iterator const&) {};
+
+       //Helper fcn: Arranges for all units' MP to be restored upon destruction
        void reset_moves();
 
        void restore_normal_map();
@@ -78,15 +64,11 @@
 
        action_queue applied_actions_;
 
-       enum mapbuilder_mode {
-               BUILD_PLANNED_MAP,
-               RESTORE_NORMAL_MAP
-       };
-
-       mapbuilder_mode mode_;
-
        //Used by reset_moves()
        boost::ptr_vector<unit_movement_resetter> resetters_;
+
+       //Used by visit()
+       std::set<unit const*> acted_this_turn_;
 };
 
 }

Modified: trunk/src/whiteboard/validate_visitor.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/validate_visitor.cpp?rev=50846&r1=50845&r2=50846&view=diff
==============================================================================
--- trunk/src/whiteboard/validate_visitor.cpp (original)
+++ trunk/src/whiteboard/validate_visitor.cpp Fri Aug 19 01:39:39 2011
@@ -38,7 +38,7 @@
 {
 
 validate_visitor::validate_visitor(unit_map& unit_map)
-       : builder_(unit_map)
+       : builder_(unit_map,*this)
        , viewer_actions_(*viewer_actions())
        , actions_to_erase_()
        , arg_itor_()
@@ -52,10 +52,7 @@
 
 bool validate_visitor::validate_actions()
 {
-       //Temporarily reset all units' moves to full EXCEPT for the ones on 
viewer_side().
-       builder_.reset_moves();
-
-       visit_all();
+       builder_.build_map();
 
        //FIXME: by reverse iterating this can be done in a more efficiant way
        // by using the iterator returned by remove_action it could even be 
done in visit_all above
@@ -170,12 +167,12 @@
                // Now call the superclass to apply the result of this move to 
the unit map,
                // so that further pathfinding takes it into account.
                move->set_valid(true);
-               builder_.visit_move(move);
                break;
        case OBSTRUCTED:
                move->set_valid(false);
                break;
        case WORTHLESS:
+               move->set_valid(false);
                // Erase only if no previous invalid actions are planned for 
this unit -- otherwise, just mark it invalid.
                // Otherwise, we wouldn't be able to keep invalid actions that 
depend on previous invalid actions.
                if(viewer_team() == move->team_index() //< Don't mess with any 
other team's queue -- only our own
@@ -184,7 +181,6 @@
                        LOG_WB << "Worthless invalid move detected, adding to 
actions_to_erase_.\n";
                        actions_to_erase_.insert(move);
                }
-               else move->set_valid(false);
                break;
        }
 }
@@ -250,11 +246,7 @@
                recruit->set_valid(false);
        }
 
-       if (recruit->is_valid())
-       {
-               builder_.visit_recruit(recruit);
-       }
-       else
+       if(!recruit->is_valid())
        {
                if(viewer_team() == recruit->team_index()) //< Don't mess with 
any other team's queue -- only our own
                {
@@ -297,11 +289,7 @@
                recall->set_valid(false);
        }
 
-       if (recall->is_valid())
-       {
-               builder_.visit_recall(recall);
-       }
-       else
+       if(!recall->is_valid())
        {
                if(viewer_team() == recall->team_index()) //< Don't mess with 
any other team's queue -- only our own
                {
@@ -341,13 +329,7 @@
                sup_d->unit_ = NULL;
        }
 
-       if(sup_d->valid_)
-       {
-               // Now call the superclass to apply the result of this move to 
the unit map,
-               // so that further pathfinding takes it into account.
-               builder_.visit_suppose_dead(sup_d);
-       }
-       else
+       if(!sup_d->valid_)
        {
                if(viewer_team() == sup_d->team_index()) //< Don't mess with 
any other team's queue -- only our own
                {
@@ -357,4 +339,10 @@
        }
 }
 
+void validate_visitor::helper::validate(side_actions::iterator const& itor)
+{
+       parent_.arg_itor_ = itor;
+       (*itor)->accept(parent_);
+}
+
 }//end namespace wb

Modified: trunk/src/whiteboard/validate_visitor.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/validate_visitor.hpp?rev=50846&r1=50845&r2=50846&view=diff
==============================================================================
--- trunk/src/whiteboard/validate_visitor.hpp (original)
+++ trunk/src/whiteboard/validate_visitor.hpp Fri Aug 19 01:39:39 2011
@@ -36,10 +36,7 @@
  */
 class validate_visitor
        : private visitor
-       , private enable_visit_all<validate_visitor>
 {
-       friend class enable_visit_all<validate_visitor>;
-
 public:
        explicit validate_visitor(unit_map& unit_map);
        virtual ~validate_visitor();
@@ -57,19 +54,27 @@
 
        enum VALIDITY {VALID, OBSTRUCTED, WORTHLESS};
        VALIDITY evaluate_move_validity(move_ptr);
+
        bool no_previous_invalids(side_actions::iterator const&);
 
-       //"Inherited" from enable_visit_all
-       bool visit(size_t team_index, team& t, side_actions& sa, 
side_actions::iterator itor)
-               { arg_itor_=itor;   return 
visitor::visit(team_index,t,sa,itor); }
+       struct helper: public mapbuilder_visitor
+       {
+               helper(unit_map& umap, validate_visitor& parent)
+                               : mapbuilder_visitor(umap)
+                               , parent_(parent)
+                       {}
+               virtual void validate(side_actions::iterator const& itor);
+               validate_visitor& parent_;
+       };
+       friend struct helper;
 
-       mapbuilder_visitor builder_;
+       helper builder_;
 
        side_actions& viewer_actions_;
 
        std::set<action_ptr> actions_to_erase_;
 
-       //Parameter for the visit_***() fcns -- see validate_actions()
+       //Parameter for the visit_***() fcns -- see helper::validate()
        side_actions::iterator arg_itor_;
 };
 


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to