Author: crab
Date: Wed Apr 22 23:32:32 2009
New Revision: 35127
URL: http://svn.gna.org/viewcvs/wesnoth?rev=35127&view=rev
Log:
AI Refactoring: ai_stopunit_result ai action, which allows the ai to concede
all moves and/or attacks of unit
Modified:
trunk/src/ai/ai_actions.cpp
trunk/src/ai/ai_actions.hpp
Modified: trunk/src/ai/ai_actions.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai/ai_actions.cpp?rev=35127&r1=35126&r2=35127&view=diff
==============================================================================
--- trunk/src/ai/ai_actions.cpp (original)
+++ trunk/src/ai/ai_actions.cpp Wed Apr 22 23:32:32 2009
@@ -187,6 +187,12 @@
void ai_attack_result::do_init_for_execution()
{
+}
+
+
+std::ostream &operator<<(std::ostream &s, ai_attack_result const &r) {
+ s << r.do_describe();
+ return s;
}
@@ -554,13 +560,61 @@
{
}
+
+bool ai_stopunit_result::test_unit(unit_map::const_iterator& un, const
unit_map& units, bool /*update_knowledge*/)
+{
+ un = units.find(unit_location_);
+ if (un==units.end()){
+ set_error(E_NO_UNIT);
+ return false;
+ }
+ if (un->second.side()!=get_side()){
+ set_error(E_NOT_OWN_UNIT);
+ return false;
+ }
+ if (un->second.incapacitated()){
+ set_error(E_INCAPACITATED_UNIT);
+ return false;
+ }
+ return true;
+}
+
void ai_stopunit_result::do_check_before()
{
+ DBG_AI_ACTIONS << " check_before " << *this << std::endl;
+ const ai_interface::info& s_info = get_subjective_info();
+ const ai_interface::info& info = get_info();
+
+ const unit_map& s_units = s_info.units;
+ const unit_map& units = info.units;
+
+ unit_map::const_iterator s_unit;
+ unit_map::const_iterator unit;
+ if ( !test_unit(s_unit,s_units) ||
+ ( is_execution() && using_subjective_info() &&
+ !test_unit(unit,units,true) ) ){
+ return;
+ }
+
}
void ai_stopunit_result::do_check_after()
{
+ const ai_interface::info& info = get_info();
+ unit_map::const_iterator un = info.units.find(unit_location_);
+ if (un==info.units.end()){
+ set_error(AI_ACTION_FAILURE);
+ return;
+ }
+ if (remove_movement_ && (un->second.movement_left()!=0) ){
+ set_error(AI_ACTION_FAILURE);
+ return;
+ }
+ if (remove_attacks_ && (un->second.attacks_left()!=0) ) {
+ set_error(AI_ACTION_FAILURE);
+ return;
+ }
}
std::string ai_stopunit_result::do_describe() const
@@ -581,11 +635,27 @@
void ai_stopunit_result::do_execute()
{
+ DBG_AI_ACTIONS << " execute: " << *this << std::endl;
+ assert(is_success());
+ const ai_interface::info& info = get_info();
+ unit_map::iterator un = info.units.find(unit_location_);
+ if (remove_movement_){
+ un->second.set_movement(0);
+ }
+ if (remove_attacks_){
+ un->second.set_attacks(0);
+ }
}
void ai_stopunit_result::do_init_for_execution()
{
+}
+
+
+std::ostream &operator<<(std::ostream &s, ai_stopunit_result const &r) {
+ s << r.do_describe();
+ return s;
}
Modified: trunk/src/ai/ai_actions.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/ai/ai_actions.hpp?rev=35127&r1=35126&r2=35127&view=diff
==============================================================================
--- trunk/src/ai/ai_actions.hpp (original)
+++ trunk/src/ai/ai_actions.hpp Wed Apr 22 23:32:32 2009
@@ -71,7 +71,7 @@
public:
ai_attack_result( unsigned int side,
const map_location& attacker_loc,
- const map_location& defender_loc,
+ const map_location& defender_loc,
int attacker_weapon );
virtual std::string do_describe() const;
protected:
@@ -165,21 +165,28 @@
const map_location& unit_location,
bool remove_movement,
bool remove_attacks );
- virtual std::string do_describe() const;
-protected:
- virtual void do_check_before();
- virtual void do_check_after();
- virtual void do_execute();
- virtual void do_init_for_execution();
-private:
+ static const int E_NO_UNIT = 4002;
+ static const int E_NOT_OWN_UNIT = 4003;
+ static const int E_INCAPACITATED_UNIT = 4004;
+
+ virtual std::string do_describe() const;
+protected:
+ virtual void do_check_before();
+ virtual void do_check_after();
+ virtual void do_execute();
+ virtual void do_init_for_execution();
+private:
+ bool test_unit(unit_map::const_iterator& un, const unit_map& units,
bool update_knowledge = false );
const map_location& unit_location_;
const bool remove_movement_;
const bool remove_attacks_;
};
+std::ostream &operator<<(std::ostream &s, ai_attack_result const &r);
std::ostream &operator<<(std::ostream &s, ai_move_result const &r);
std::ostream &operator<<(std::ostream &s, ai_recruit_result const &r);
+std::ostream &operator<<(std::ostream &s, ai_stopunit_result const &r);
class ai_actions {
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits