1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #ifndef SCUMM_HE_MOONBASE_AI_DEFENCEUNIT_H
24 #define SCUMM_HE_MOONBASE_AI_DEFENCEUNIT_H
25 
26 namespace Scumm {
27 
28 class AI;
29 
30 enum {
31 	DUT_ANTI_AIR = 1,
32 	DUT_SHIELD = 2,
33 	DUT_MINE = 3,
34 	DUT_HUB = 4,
35 	DUT_TOWER = 5,
36 	DUT_BRIDGE = 6,
37 	DUT_ENERGY = 7,
38 	DUT_OFFENSE = 8,
39 	DUT_CRAWLER = 9
40 };
41 
42 enum {
43 	DUS_ON = 1,
44 	DUS_OFF = 2,
45 	DUS_DESTROYED = 3
46 };
47 
48 class DefenseUnit {
49 private:
50 	int _id;
51 	Common::Point _pos;
52 	int _distanceTo;
53 	int _state;
54 	int _radius;
55 	int _armor;
56 	int _cost;
57 
58 protected:
59 	AI *_ai;
60 
61 public:
62 	DefenseUnit(AI *ai);
63 	DefenseUnit(DefenseUnit *inUnit, AI *ai);
64 
65 	virtual ~DefenseUnit();
66 
setID(int id)67 	void setID(int id) { _id = id; }
setDistanceTo(int distanceTo)68 	void setDistanceTo(int distanceTo) { _distanceTo = distanceTo; }
setState(int state)69 	void setState(int state) { _state = state; }
setRadius(int radius)70 	void setRadius(int radius) { _radius = radius; }
setArmor(int armor)71 	void setArmor(int armor) { _armor = armor; }
setDamage(int damage)72 	void setDamage(int damage) { _armor -= damage; }
setPos(int x,int y)73 	void setPos(int x, int y) {
74 		_pos.x = x;
75 		_pos.y = y;
76 	}
setCost(int cost)77 	void setCost(int cost) { _cost = cost; }
78 
getID()79 	int getID() const { return _id; }
getDistanceTo()80 	int getDistanceTo() const { return _distanceTo; }
getState()81 	int getState() const { return _state; }
getRadius()82 	int getRadius() const { return _radius; }
getArmor()83 	int getArmor() const { return _armor; }
getPosX()84 	int getPosX() const { return _pos.x; }
getPosY()85 	int getPosY() const { return _pos.y; }
getCost()86 	int getCost() const { return _cost; }
87 
88 	virtual int getType() const = 0;
89 
90 	virtual Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) = 0;
91 	virtual int selectWeapon(int index) = 0;
92 };
93 
94 class AntiAirUnit : public DefenseUnit {
95 private:
96 
97 public:
98 	AntiAirUnit(AI *ai);
99 	AntiAirUnit(DefenseUnit *inUnit, AI *ai);
getType()100 	int getType() const override { return DUT_ANTI_AIR; }
101 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
102 	int selectWeapon(int index) override;
103 };
104 
105 class ShieldUnit : public DefenseUnit {
106 private:
107 
108 public:
109 	ShieldUnit(AI *ai);
110 	ShieldUnit(DefenseUnit *inUnit, AI *ai);
getType()111 	int getType() const override { return DUT_SHIELD; }
112 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
113 	int selectWeapon(int index) override;
114 };
115 
116 class MineUnit : public DefenseUnit {
117 private:
118 
119 public:
120 	MineUnit(AI *ai);
121 	MineUnit(DefenseUnit *inUnit, AI *ai);
getType()122 	int getType() const override { return DUT_MINE; }
123 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
124 	int selectWeapon(int index) override;
125 };
126 
127 class HubUnit : public DefenseUnit {
128 private:
129 
130 public:
131 	HubUnit(AI *ai);
132 	HubUnit(DefenseUnit *inUnit, AI *ai);
getType()133 	int getType() const override { return DUT_HUB; }
134 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
135 	int selectWeapon(int index) override;
136 };
137 
138 class TowerUnit : public DefenseUnit {
139 private:
140 
141 public:
142 	TowerUnit(AI *ai);
143 	TowerUnit(DefenseUnit *inUnit, AI *ai);
getType()144 	int getType() const override { return DUT_TOWER; }
145 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
146 	int selectWeapon(int index) override;
147 };
148 
149 class BridgeUnit : public DefenseUnit {
150 private:
151 
152 public:
153 	BridgeUnit(AI *ai);
154 	BridgeUnit(DefenseUnit *inUnit, AI *ai);
getType()155 	int getType() const override { return DUT_BRIDGE; }
156 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
157 	int selectWeapon(int index) override;
158 };
159 
160 class EnergyUnit : public DefenseUnit {
161 private:
162 
163 public:
164 	EnergyUnit(AI *ai);
165 	EnergyUnit(DefenseUnit *inUnit, AI *ai);
getType()166 	int getType() const override { return DUT_ENERGY; }
167 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
168 	int selectWeapon(int index) override;
169 };
170 
171 class OffenseUnit : public DefenseUnit {
172 private:
173 
174 public:
175 	OffenseUnit(AI *ai);
176 	OffenseUnit(DefenseUnit *inUnit, AI *ai);
getType()177 	int getType() const override { return DUT_OFFENSE; }
178 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
179 	int selectWeapon(int index) override;
180 };
181 
182 class CrawlerUnit : public DefenseUnit {
183 private:
184 
185 public:
186 	CrawlerUnit(AI *ai);
187 	CrawlerUnit(DefenseUnit *inUnit, AI *ai);
getType()188 	int getType() const override { return DUT_CRAWLER; }
189 	Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) override;
190 	int selectWeapon(int index) override;
191 };
192 
193 } // End of namespace Scumm
194 
195 #endif
196