BWAPI
Skynet/Skynet/Task.h
Go to the documentation of this file.
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;
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines