ScummVM API documentation
creature.h
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 modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (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, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef ULTIMA4_GAME_CREATURE_H
23#define ULTIMA4_GAME_CREATURE_H
24
25#include "ultima/ultima4/game/object.h"
26#include "ultima/ultima4/map/movement.h"
27#include "ultima/ultima4/filesys/savegame.h"
28#include "ultima/ultima4/core/types.h"
29
30namespace Ultima {
31namespace Ultima4 {
32
33class CombatController;
34class ConfigElement;
35class Tile;
36
37typedef unsigned short CreatureId;
39typedef Common::Array<class Creature *> CreatureVector;
40
41#define MAX_CREATURES 128
42
43/* Creatures on world map */
44
45#define MAX_CREATURES_ON_MAP 4
46#define MAX_CREATURE_DISTANCE 16
47
48/* Creature ids */
49
50typedef enum {
51 HORSE1_ID = 0,
52 HORSE2_ID = 1,
53
54 MAGE_ID = 2,
55 BARD_ID = 3,
56 FIGHTER_ID = 4,
57 DRUID_ID = 5,
58 TINKER_ID = 6,
59 PALADIN_ID = 7,
60 RANGER_ID = 8,
61 SHEPHERD_ID = 9,
62
63 GUARD_ID = 10,
64 VILLAGER_ID = 11,
65 SINGINGBARD_ID = 12,
66 JESTER_ID = 13,
67 BEGGAR_ID = 14,
68 CHILD_ID = 15,
69 BULL_ID = 16,
70 LORDBRITISH_ID = 17,
71
72 PIRATE_ID = 18,
73 NIXIE_ID = 19,
74 GIANT_SQUID_ID = 20,
75 SEA_SERPENT_ID = 21,
76 SEAHORSE_ID = 22,
77 WHIRLPOOL_ID = 23,
78 STORM_ID = 24,
79 RAT_ID = 25,
80 BAT_ID = 26,
81 GIANT_SPIDER_ID = 27,
82 GHOST_ID = 28,
83 SLIME_ID = 29,
84 TROLL_ID = 30,
85 GREMLIN_ID = 31,
86 MIMIC_ID = 32,
87 REAPER_ID = 33,
88 INSECT_SWARM_ID = 34,
89 GAZER_ID = 35,
90 PHANTOM_ID = 36,
91 ORC_ID = 37,
92 SKELETON_ID = 38,
93 ROGUE_ID = 39,
94 PYTHON_ID = 40,
95 ETTIN_ID = 41,
96 HEADLESS_ID = 42,
97 CYCLOPS_ID = 43,
98 WISP_ID = 44,
99 EVILMAGE_ID = 45,
100 LICH_ID = 46,
101 LAVA_LIZARD_ID = 47,
102 ZORN_ID = 48,
103 DAEMON_ID = 49,
104 HYDRA_ID = 50,
105 DRAGON_ID = 51,
106 BALRON_ID = 52
107} CreatureType;
108
109typedef enum {
110 MATTR_STEALFOOD = 0x1,
111 MATTR_STEALGOLD = 0x2,
112 MATTR_CASTS_SLEEP = 0x4,
113 MATTR_UNDEAD = 0x8,
114 MATTR_GOOD = 0x10,
115 MATTR_WATER = 0x20,
116 MATTR_NONATTACKABLE = 0x40,
117 MATTR_NEGATE = 0x80,
118 MATTR_CAMOUFLAGE = 0x100,
119 MATTR_NOATTACK = 0x200,
120 MATTR_AMBUSHES = 0x400,
121 MATTR_RANDOMRANGED = 0x800,
122 MATTR_INCORPOREAL = 0x1000,
123 MATTR_NOCHEST = 0x2000,
124 MATTR_DIVIDES = 0x4000,
125 MATTR_SPAWNSONDEATH = 0x8000,
126 MATTR_FORCE_OF_NATURE = 0x10000
127} CreatureAttrib;
128
129typedef enum {
130 MATTR_STATIONARY = 0x1,
131 MATTR_WANDERS = 0x2,
132 MATTR_SWIMS = 0x4,
133 MATTR_SAILS = 0x8,
134 MATTR_FLIES = 0x10,
135 MATTR_TELEPORT = 0x20,
136 MATTR_CANMOVECREATURES = 0x40,
137 MATTR_CANMOVEAVATAR = 0x80
138} CreatureMovementAttrib;
139
140typedef enum {
141 MSTAT_DEAD,
142 MSTAT_FLEEING,
143 MSTAT_CRITICAL,
144 MSTAT_HEAVILYWOUNDED,
145 MSTAT_LIGHTLYWOUNDED,
146 MSTAT_BARELYWOUNDED
147} CreatureStatus;
148
159class Creature : public Object {
161
162public:
167
168 void load(const ConfigElement &conf);
169
170 // Accessor methods
171 virtual Common::String getName() const {
172 return _name;
173 }
174 virtual const Common::String &getHitTile() const {
175 return _rangedHitTile;
176 }
177 virtual const Common::String &getMissTile() const {
178 return _rangedMissTile;
179 }
180 CreatureId getId() const {
181 return _id;
182 }
183 CreatureId getLeader() const {
184 return _leader;
185 }
186 virtual int getHp() const {
187 return _hp;
188 }
189 virtual int getXp() const {
190 return _xp;
191 }
192 virtual const Common::String &getWorldrangedtile() const {
193 return _worldRangedTile;
194 }
195 SlowedType getSlowedType() const {
196 return _slowedType;
197 }
198 int getEncounterSize() const {
199 return _encounterSize;
200 }
201 byte getResists() const {
202 return _resists;
203 }
204
205 // Setters
206 void setName(Common::String s) {
207 _name = s;
208 }
209 void setHitTile(const Common::String &t) {
210 _rangedHitTile = t;
211 }
212 void setMissTile(const Common::String &t) {
213 _rangedMissTile = t;
214 }
215 virtual void setHp(int points) {
216 _hp = points;
217 }
218
219 // Query methods
220 bool isGood() const {
221 return _mAttr & MATTR_GOOD;
222 }
223 bool isEvil() const {
224 return !isGood();
225 }
226 bool isUndead() const {
227 return _mAttr & MATTR_UNDEAD;
228 }
229 bool leavesChest() const {
230 return !isAquatic() && !(_mAttr & MATTR_NOCHEST);
231 }
232 bool isAquatic() const {
233 return _mAttr & MATTR_WATER;
234 }
235 bool wanders() const {
236 return _movementAttr & MATTR_WANDERS;
237 }
238 bool isStationary() const {
239 return _movementAttr & MATTR_STATIONARY;
240 }
241 bool flies() const {
242 return _movementAttr & MATTR_FLIES;
243 }
244 bool teleports() const {
245 return _movementAttr & MATTR_TELEPORT;
246 }
247 bool swims() const {
248 return _movementAttr & MATTR_SWIMS;
249 }
250 bool sails() const {
251 return _movementAttr & MATTR_SAILS;
252 }
253 bool walks() const {
254 return !(flies() || swims() || sails());
255 }
256 bool divides() const {
257 return _mAttr & MATTR_DIVIDES;
258 }
259 bool spawnsOnDeath() const {
260 return _mAttr & MATTR_SPAWNSONDEATH;
261 }
262 bool canMoveOntoCreatures() const {
263 return _movementAttr & MATTR_CANMOVECREATURES;
264 }
265 bool canMoveOntoPlayer() const {
266 return _movementAttr & MATTR_CANMOVEAVATAR;
267 }
268 bool isAttackable() const;
269 bool willAttack() const {
270 return !(_mAttr & MATTR_NOATTACK);
271 }
272 bool stealsGold() const {
273 return _mAttr & MATTR_STEALGOLD;
274 }
275 bool stealsFood() const {
276 return _mAttr & MATTR_STEALFOOD;
277 }
278 bool negates() const {
279 return _mAttr & MATTR_NEGATE;
280 }
281 bool camouflages() const {
282 return _mAttr & MATTR_CAMOUFLAGE;
283 }
284 bool ambushes() const {
285 return _mAttr & MATTR_AMBUSHES;
286 }
287 bool isIncorporeal() const {
288 return _mAttr & MATTR_INCORPOREAL;
289 }
290 bool hasRandomRanged() const {
291 return _mAttr & MATTR_RANDOMRANGED;
292 }
293 bool leavesTile() const {
294 return _leavesTile;
295 }
296 bool castsSleep() const {
297 return _mAttr & MATTR_CASTS_SLEEP;
298 }
299 bool isForceOfNature() const {
300 return _mAttr & MATTR_FORCE_OF_NATURE;
301 }
302 int getDamage() const;
303 const Common::String &getCamouflageTile() const {
304 return _camouflageTile;
305 }
306 void setRandomRanged();
307 int setInitialHp(int hp = -1);
308
315
322
323 /* combat methods */
324 void act(CombatController *controller);
325
329 virtual void addStatus(StatusType status);
330 void applyTileEffect(TileEffect effect);
331 virtual int getAttackBonus() const;
332 virtual int getDefense() const;
333 bool divide();
334 bool spawnOnDeath();
335 virtual CreatureStatus getState() const;
336 StatusType getStatus() const;
337 bool isAsleep() const;
338
344
345 Creature *nearestOpponent(int *dist, bool ranged);
346 virtual void putToSleep();
347 virtual void removeStatus(StatusType status);
348 virtual void setStatus(StatusType status);
349 virtual void wakeUp();
350
360 virtual bool applyDamage(int damage, bool byplayer = true);
361 virtual bool dealDamage(Creature *m, int damage);
362
363 // Properties
364protected:
365 Common::String _name;
366 Common::String _rangedHitTile;
367 Common::String _rangedMissTile;
368 CreatureId _id;
369 Common::String _camouflageTile;
370 CreatureId _leader;
371 int _baseHp;
372 int _hp;
373 StatusList _status;
374 int _xp;
375 byte _ranged;
376 Common::String _worldRangedTile;
377 bool _leavesTile;
378 CreatureAttrib _mAttr;
379 CreatureMovementAttrib _movementAttr;
380 SlowedType _slowedType;
381 int _encounterSize;
382 byte _resists;
383 CreatureId _spawn;
384};
385
390public:
391 static CreatureMgr *getInstance();
392
393 void loadAll();
394
400
406 Creature *getById(CreatureId id);
407
414
419
424
429
430private:
431 CreatureMgr() {}
432
433 // disallow assignments, copy construction
434 CreatureMgr(const CreatureMgr &);
435 const CreatureMgr &operator=(const CreatureMgr &);
436
437 static CreatureMgr *_instance;
438
439 CreatureMap _creatures;
440};
441
442bool isCreature(Object *punknown);
443
444#define creatureMgr (CreatureMgr::getInstance())
445
446} // End of namespace Ultima4
447} // End of namespace Ultima
448
449#endif
Definition: array.h:52
Definition: str.h:59
Definition: combat_controller.h:59
Definition: config.h:126
Definition: creature.h:159
virtual void addStatus(StatusType status)
Creature(MapTile tile=MapTile(0))
virtual bool applyDamage(int damage, bool byplayer=true)
Definition: creature.h:389
Creature * getByTile(MapTile tile)
Creature * randomForDungeon(int dnglevel)
Creature * getByName(Common::String name)
Creature * randomForTile(const Tile *tile)
Creature * getById(CreatureId id)
Definition: map_tile.h:34
Definition: object.h:43
Definition: tile.h:64