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