BWAPI
SPAR/AIModule/SparAIModule/DecisionMaking/Layer2Actions/Interface/Actions/TacticalAction.h
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines