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

Reply via email to