BWAPI
|
00001 #pragma once 00002 00003 #include "Interface.h" 00004 #include <assert.h> 00005 00006 #include "RequirementGroup.h" 00007 #include "TypeSafeEnum.h" 00008 #include "UnitGroup.h" 00009 00010 struct TaskTypeDef 00011 { 00012 enum type 00013 { 00014 Highest = 0, 00015 BuildOrder, 00016 Expansion, 00017 Army, 00018 MacroUrgent, 00019 MacroExtraProduction, 00020 MacroTech, 00021 Medium, 00022 Worker, 00023 Defense, 00024 Scout, 00025 Supply, 00026 RefineryManager, 00027 Lowest 00028 }; 00029 }; 00030 typedef SafeEnum<TaskTypeDef> TaskType; 00031 00032 class Task 00033 { 00034 public: 00035 Task(TaskType priority) 00036 : mPaused(false) 00037 , mStopped(false) 00038 , mCanceled(false) 00039 , mCompleted(false) 00040 , mTaskType(priority) 00041 {} 00042 00043 virtual ~Task() {}; 00044 00045 virtual int getEndTime() const = 0; 00046 virtual int getEndTime(Unit unit) const = 0; 00047 00048 virtual TaskType getType() const { return mTaskType; } 00049 virtual int getPriority(Unit unit) const = 0; 00050 00051 virtual Position getStartLocation(Unit unit) const = 0; 00052 virtual Position getEndLocation(Unit unit) const = 0; 00053 00054 // return values are whether it has units to relinquish 00055 virtual bool preUpdate() = 0; 00056 virtual bool update() = 0; 00057 00058 virtual bool waitingForUnit(Unit unit) const = 0; 00059 virtual void giveUnit(Unit unit) = 0; 00060 virtual void returnUnit(Unit unit) = 0; 00061 virtual bool morph(Unit unit, BWAPI::UnitType previousType) = 0; 00062 virtual UnitGroup getFinishedUnits() = 0; 00063 00064 virtual std::string getTaskName() const = 0; 00065 virtual std::string getOutputName() const = 0; 00066 00067 virtual int dispatchTime() const { return Requirement::maxTime; } 00068 virtual int startTime() const { return Requirement::maxTime; } 00069 00070 virtual bool hasDispatched() const { return false; } 00071 virtual bool inProgress() const { return false; } 00072 00073 bool isPaused() const { return mPaused; } 00074 bool isStopped() const { return mStopped; } 00075 bool isCanceled() const { return mCanceled; } 00076 bool isCompleted() const { return mCompleted; } 00077 bool hasEnded() const { return mCompleted || mCanceled; } 00078 bool shouldReturnUnit() const { return hasEnded() || mStopped || mPaused; } 00079 00080 void pause() { mPaused = true; } 00081 void stop() { mStopped = true; mPaused = false; } 00082 void cancel() { mCanceled = true; } 00083 void resume() { mPaused = false; mStopped = false; } 00084 00085 virtual void setRequiredSatisfyTime(RequirementGroup requirements, int time, int delay) {}; 00086 virtual void updateRequirements() {}; 00087 void updateRequirements(std::tr1::function<bool (RequirementGroup)> updateFunction) 00088 { 00089 for(std::list<RequirementGroup>::iterator it = mRequirements.begin(); it != mRequirements.end();) 00090 { 00091 if(updateFunction(*it)) 00092 it = mRequirements.erase(it); 00093 else 00094 ++it; 00095 } 00096 } 00097 00098 protected: 00099 void complete() { mCompleted = true; } 00100 00101 void clearRequirements() { mRequirements.clear(); } 00102 void addRequirement(RequirementGroup requirement) { mRequirements.push_back(requirement); } 00103 00104 std::list<RequirementGroup> mRequirements; 00105 00106 private: 00107 bool mPaused; 00108 bool mStopped; 00109 bool mCanceled; 00110 bool mCompleted; 00111 00112 TaskType mTaskType; 00113 }; 00114 00115 typedef std::tr1::shared_ptr<Task> TaskPointer;