1 #ifndef KAIK_UNITHANDLER_HDR
2 #define KAIK_UNITHANDLER_HDR
3 
4 #include <vector>
5 
6 namespace springLegacyAI {
7 	struct UnitDef;
8 } // namespace springLegacyAI
9 
10 class CMetalMaker;
11 struct AIClasses;
12 struct BuilderTracker;
13 struct BuildTask;
14 struct TaskPlan;
15 struct UpgradeTask;
16 
17 class CUnitHandler {
18 	public:
19 		CR_DECLARE(CUnitHandler)
20 
21 		CUnitHandler(AIClasses* ai);
22 		~CUnitHandler();
23 
24 		void UnitCreated(int unit);
25 		void UnitDestroyed(int unit);
26 
27 		void IdleUnitUpdate(int);
28 		void IdleUnitAdd(int unit, int);
29 		void IdleUnitRemove(int unit);
30 		int GetIU(UnitCategory);
31 		int NumIdleUnits(UnitCategory);
32 		// used to track stuck workers
33 		void UnitMoveFailed(int unit);
34 
35 		void MMakerAdd(int unit);
36 		void MMakerRemove(int unit);
37 		void MMakerUpdate(int);
38 
39 		void BuildTaskCreate(int id);
40 		void BuildTaskRemove(int id);
41 		void BuildTaskRemove(BuilderTracker* builderTracker);
42 		bool BuildTaskAddBuilder (int builder, UnitCategory);
43 		void BuildTaskAddBuilder(BuildTask* buildTask, BuilderTracker* builderTracker);
44 		BuildTask* GetBuildTask(int buildTaskId);
45 		BuildTask* BuildTaskExist(float3 pos, const UnitDef* builtdef);
46 
47 		void TaskPlanCreate(int builder, float3 pos, const UnitDef* builtdef);
48 		void TaskPlanRemove(BuilderTracker* builderTracker);
49 		bool TaskPlanExist(float3 pos, const UnitDef* builtdef);
50 		void TaskPlanAdd(TaskPlan* taskPlan, BuilderTracker* builderTracker);
51 		TaskPlan* GetTaskPlan(int taskPlanId);
52 
53 		BuilderTracker* GetBuilderTracker(int builder);
54 
55 		void NukeSiloAdd(int siloID);
56 		void NukeSiloRemove(int siloID);
57 		void MetalExtractorAdd(int extractorID);
58 		void MetalExtractorRemove(int extractorID);
59 		int GetOldestMetalExtractor(void);
60 
61 		void FactoryAdd(int id);
62 		void FactoryRemove(int id);
63 		bool FactoryBuilderAdd(int builder);
64 		bool FactoryBuilderAdd(BuilderTracker* builderTracker);
65 		void FactoryBuilderRemove(BuilderTracker* builderTracker);
66 
67 		UpgradeTask* CreateUpgradeTask(int oldBuildingID, const float3& oldBuildingPos, const UnitDef* newBuildingDef);
68 		UpgradeTask* FindUpgradeTask(int oldBuildingID);
69 		void RemoveUpgradeTask(UpgradeTask* task);
70 		bool AddUpgradeTaskBuilder(UpgradeTask* task, int builderID);
71 		void UpdateUpgradeTasks(int frame);
72 
73 		// use this to tell the tracker that the builder is on a reclaim job
74 		void BuilderReclaimOrder(int builderId, const float3&);
75 
76 		bool VerifyOrder(BuilderTracker* builderTracker);
77 		void ClearOrder(BuilderTracker* builderTracker, bool reportError);
78 		void DecodeOrder(BuilderTracker* builderTracker, bool reportError);
79 
80 		std::vector<std::list<int> > IdleUnits;
81 		std::vector<std::list<BuildTask> > BuildTasks;
82 		std::vector<std::list<TaskPlan> > TaskPlans;
83 		std::vector<std::list<int> > AllUnitsByCat;
84 		std::vector<std::list<int> > AllUnitsByType;
85 
86 		std::list<Factory> Factories;
87 		std::list<NukeSilo> NukeSilos;
88 		std::vector<MetalExtractor> MetalExtractors;
89 
90 		std::list<integer2> Limbo;
91 		std::list<BuilderTracker*> BuilderTrackers;
92 
93 		CMetalMaker* metalMaker;
94 
95 		int lastCapturedUnitFrame;
96 		int lastCapturedUnitID;
97 
98 	private:
99 		AIClasses* ai;
100 		int taskPlanCounter;
101 
102 		std::map<int, UpgradeTask*> upgradeTasks;
103 };
104 
105 
106 #endif
107