BWAPI
|
00001 #pragma once 00002 #include "../../../../PerceptualState/PerceptualState.h" 00003 #include "../../../../PerceptualState/Locations/Static/StaticLocation.h" 00004 #include "../../../../PerceptualState/Locations/Static/PrimitiveLocation.h" 00005 #include "../../../../Utils/Event.h" 00006 #include "../../../../Utils/Process.h" 00007 #include "../../../../SparAIContainer.h" 00008 #include "../../../../UnitManager.h" 00009 #include "../ActionResources.h" 00010 00011 //#include "../../../../Planning/Exp/Bindings.h" 00012 //#include "../../../../Planning/Exp/ILogicalExp.h" 00013 //#include "../../../../Planning/Exp/Logical/AndExp.h" 00014 //#include "../../../../Planning/Exp/IEffect.h" 00015 //#include "../../../../Planning/World/IClosedWorld.h" 00016 00017 //#include "../../Layer3Tactical/Script/World.h" // Let's happily break encapsulation 00018 00019 namespace layer2 00020 { 00024 class TacticalAction : public virtual Process 00025 { 00026 public: 00030 TacticalAction(unsigned int priority) 00031 : Process(Spar) 00032 , m_id(s_nextId++) 00033 , m_priority(priority) 00034 , m_isCancelling(false) 00035 { 00036 } 00037 00038 virtual ~TacticalAction() 00039 { 00040 } 00041 00042 virtual std::string getName() const = 0; 00043 00044 unsigned int getPriority() const 00045 { 00046 return m_priority; 00047 } 00048 00049 void cancel() 00050 { 00051 if (!m_isCancelling && !isTerminated()) 00052 { 00053 SPAR_LOG(LogTypes::LAYER_2_DECISION, "Cancelling action: %s", getObjectDescription(this).c_str()); 00054 00055 m_isCancelling = true; 00056 00057 cancelSpecificImpl(); 00058 } 00059 } 00060 00061 // Failures are action-dependent 00062 00063 static const TerminationMode Cancelled; 00064 00065 static const TerminationMode AllUnitsDestroyed; 00066 00067 friend std::ostream& operator<<(std::ostream& out, const TacticalAction& action) 00068 { 00069 action.output(out); 00070 return out; 00071 } 00072 00074 // GUI // 00076 virtual std::set<BWAPI::Unit*> getCommandedUnits() const 00077 { 00078 return std::set<BWAPI::Unit*>(); 00079 } 00080 00081 protected: 00082 virtual void executeImpl() 00083 { 00084 SPAR_LOG(LogTypes::LAYER_2_DECISION, "Executing action: %s", getObjectDescription(this).c_str()); 00085 00086 executeCommonImpl(); 00087 executeSpecificImpl(); 00088 } 00089 00090 // THIS METHOD SHOULD ONLY BE CALLED FROM executeImpl() 00091 virtual void executeCommonImpl() 00092 { 00093 Process::executeImpl(); 00094 } 00095 00096 // THIS METHOD SHOULD ONLY BE CALLED FROM executeImpl() 00097 virtual void executeSpecificImpl() = 0; 00098 00099 virtual void terminateImpl() 00100 { 00101 terminateSpecificImpl(); 00102 terminateCommonImpl(); 00103 } 00104 00105 // THIS METHOD SHOULD ONLY BE CALLED FROM terminateImpl() 00106 virtual void terminateCommonImpl() 00107 { 00108 Process::terminateImpl(); 00109 } 00110 00111 // THIS METHOD SHOULD ONLY BE CALLED FROM terminateImpl() 00112 virtual void terminateSpecificImpl() = 0; 00113 00114 virtual void cancelSpecificImpl() = 0; 00115 00116 virtual void output(std::ostream& out) const 00117 { 00118 out << "#" << m_id << " (P" << m_priority << ")- "; 00119 } 00120 00121 unsigned int m_priority; // higher value -> more priority 00122 const unsigned int m_id; 00123 bool m_isCancelling; 00124 00125 private: 00126 static unsigned int s_nextId; 00127 }; 00128 }