1 /*
2 *
3 * Iter Vehemens ad Necem (IVAN)
4 * Copyright (C) Timo Kiviluoto
5 * Released under the GNU General
6 * Public License
7 *
8 * See LICENSING which should be included
9 * along with this file for more details
10 *
11 */
12
13 #ifndef __NONHUMAN_H__
14 #define __NONHUMAN_H__
15
16 #include "char.h"
17
CHARACTER(nonhumanoid,character)18 CHARACTER(nonhumanoid, character)
19 {
20 public:
21 virtual void Save(outputfile&) const;
22 virtual void Load(inputfile&);
23 void CalculateUnarmedDamage();
24 void CalculateKickDamage();
25 void CalculateBiteDamage();
26 void CalculateUnarmedToHitValue();
27 void CalculateKickToHitValue();
28 void CalculateBiteToHitValue();
29 void CalculateUnarmedAPCost();
30 void CalculateKickAPCost();
31 void CalculateBiteAPCost();
32 double GetUnarmedDamage() const { return UnarmedDamage; }
33 int GetUnarmedMinDamage() const;
34 int GetUnarmedMaxDamage() const;
35 double GetKickDamage() const { return KickDamage; }
36 int GetKickMinDamage() const;
37 int GetKickMaxDamage() const;
38 double GetBiteDamage() const { return BiteDamage; }
39 int GetBiteMinDamage() const;
40 int GetBiteMaxDamage() const;
41 double GetUnarmedToHitValue() const { return UnarmedToHitValue; }
42 double GetKickToHitValue() const { return KickToHitValue; }
43 double GetBiteToHitValue() const { return BiteToHitValue; }
44 long GetUnarmedAPCost() const { return UnarmedAPCost; }
45 long GetKickAPCost() const { return KickAPCost; }
46 long GetBiteAPCost() const { return BiteAPCost; }
47 virtual void Kick(lsquare*, int, truth = false);
48 virtual truth Hit(character*, v2, int, int = 0);
49 virtual void UnarmedHit(character*, v2, int, truth = false);
50 virtual void InitSpecialAttributes();
51 virtual double GetTimeToKill(ccharacter*, truth) const;
52 virtual int GetAttribute(int, truth = true) const;
53 virtual truth EditAttribute(int, int);
54 virtual void EditExperience(int, double, double);
55 virtual int DrawStats(truth) const;
56 virtual void Bite(character*, v2, int, truth = false);
57 virtual int GetCarryingStrength() const;
58 virtual void CalculateBattleInfo();
59 void CalculateUnarmedAttackInfo();
60 void CalculateKickAttackInfo();
61 void CalculateBiteAttackInfo();
62 virtual truth UseMaterialAttributes() const;
63 virtual void AddSpecialStethoscopeInfo(felist&) const;
64 virtual truth EditAllAttributes(int);
65 virtual void AddAttributeInfo(festring&) const;
66 virtual void AddAttackInfo(felist&) const;
67 protected:
68 double StrengthExperience;
69 double AgilityExperience;
70 double UnarmedDamage;
71 double KickDamage;
72 double BiteDamage;
73 double UnarmedToHitValue;
74 double KickToHitValue;
75 double BiteToHitValue;
76 long UnarmedAPCost;
77 long KickAPCost;
78 long BiteAPCost;
79 };
80
CHARACTER(frog,nonhumanoid)81 CHARACTER(frog, nonhumanoid)
82 {
83 public:
84 virtual truth IsFrog() const { return true; }
85 virtual truth MoveRandomly() { return MoveRandomlyInRoom(); }
86 };
87
CHARACTER(billswill,nonhumanoid)88 CHARACTER(billswill, nonhumanoid)
89 {
90 protected:
91 virtual int GetBodyPartWobbleData(int) const;
92 virtual cchar* FirstPersonBiteVerb() const;
93 virtual cchar* FirstPersonCriticalBiteVerb() const;
94 virtual cchar* ThirdPersonBiteVerb() const;
95 virtual cchar* ThirdPersonCriticalBiteVerb() const;
96 virtual truth AttackIsBlockable(int) const { return false; }
97 virtual truth AttackMayDamageArmor() const { return false; }
98 };
99
CHARACTER(mommo,nonhumanoid)100 CHARACTER(mommo, nonhumanoid)
101 {
102 protected:
103 virtual int GetBodyPartWobbleData(int) const;
104 virtual truth CanVomit() const { return true; }
105 virtual void CreateCorpse(lsquare*);
106 virtual truth Hit(character*, v2, int, int = 0);
107 virtual void GetAICommand();
108 };
109
CHARACTER(feline,nonhumanoid)110 CHARACTER(feline, nonhumanoid)
111 {
112 public:
113 virtual truth Catches(item*);
114 };
115
CHARACTER(canine,nonhumanoid)116 CHARACTER(canine, nonhumanoid)
117 {
118 public:
119 virtual truth Catches(item*);
120 };
121
CHARACTER(wolf,canine)122 CHARACTER(wolf, canine)
123 {
124 protected:
125 virtual col16 GetSkinColor() const;
126 };
127
CHARACTER(dog,canine)128 CHARACTER(dog, canine)
129 {
130 public:
131 virtual void BeTalkedTo();
132 protected:
133 virtual void CreateCorpse(lsquare*);
134 virtual bodypart* MakeBodyPart(int) const;
135 virtual void GetAICommand();
136 };
137
CHARACTER(spider,nonhumanoid)138 CHARACTER(spider, nonhumanoid)
139 {
140 public:
141 virtual truth IsSpider() const { return true; }
142 protected:
143 virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int);
144 virtual void GetAICommand();
145 virtual bodypart* MakeBodyPart(int) const;
146 };
147
CHARACTER(jackal,canine)148 CHARACTER(jackal, canine)
149 {
150 };
151
CHARACTER(ass,nonhumanoid)152 CHARACTER(ass, nonhumanoid)
153 {
154 };
155
CHARACTER(bear,nonhumanoid)156 CHARACTER(bear, nonhumanoid)
157 {
158 };
159
CHARACTER(dolphin,nonhumanoid)160 CHARACTER(dolphin, nonhumanoid)
161 {
162 protected:
163 virtual int GetSpecialBodyPartFlags(int) const;
164 virtual void SpecialTurnHandler() { UpdatePictures(); }
165 };
166
CHARACTER(bat,nonhumanoid)167 CHARACTER(bat, nonhumanoid)
168 {
169 public:
170 virtual void GetAICommand();
171 protected:
172 virtual bodypart* MakeBodyPart(int) const;
173 };
174
CHARACTER(vampirebat,bat)175 CHARACTER(vampirebat, bat)
176 {
177 protected:
178 virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int);
179 };
180
CHARACTER(nerfbat,bat)181 CHARACTER(nerfbat, bat)
182 {
183 protected:
184 virtual int TakeHit(character*, item*, bodypart*, v2, double, double, int, int, int, truth, truth);
185 };
186
CHARACTER(fruitbat,bat)187 CHARACTER(fruitbat, bat)
188 {
189 public:
190 virtual void GetAICommand();
191 virtual truth IsRetreating() const;
192 };
193
CHARACTER(largecat,feline)194 CHARACTER(largecat, feline)
195 {
196 public:
197 largecat() : Lives(7) { }
198 virtual void Save(outputfile&) const;
199 virtual void Load(inputfile&);
200 virtual truth SpecialSaveLife();
201 protected:
202 int Lives;
203 };
204
CHARACTER(largerat,nonhumanoid)205 CHARACTER(largerat, nonhumanoid)
206 {
207 };
208
CHARACTER(mammoth,nonhumanoid)209 CHARACTER(mammoth, nonhumanoid)
210 {
211 };
212
CHARACTER(unicorn,nonhumanoid)213 CHARACTER(unicorn, nonhumanoid)
214 {
215 public:
216 virtual int TakeHit(character*, item*, bodypart*, v2, double, double, int, int, int, truth, truth);
217 virtual truth SpecialEnemySightedReaction(character*);
218 protected:
219 void MonsterTeleport(cchar*);
220 };
221
CHARACTER(lion,feline)222 CHARACTER(lion, feline)
223 {
224 };
225
CHARACTER(carnivorousplant,nonhumanoid)226 CHARACTER(carnivorousplant, nonhumanoid)
227 {
228 protected:
229 virtual col16 GetTorsoSpecialColor() const;
230 virtual void GetAICommand();
231 virtual void CreateCorpse(lsquare*);
232 };
233
CHARACTER(buffalo,nonhumanoid)234 CHARACTER(buffalo, nonhumanoid)
235 {
236 };
237
CHARACTER(snake,nonhumanoid)238 CHARACTER(snake, nonhumanoid)
239 {
240 protected:
241 virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int);
242 virtual bodypart* MakeBodyPart(int) const;
243 };
244
CHARACTER(ostrich,nonhumanoid)245 CHARACTER(ostrich, nonhumanoid)
246 {
247 public:
248 ostrich() : HasDroppedBananas(false) { }
249 virtual void Save(outputfile&) const;
250 virtual void Load(inputfile&);
251 protected:
252 virtual truth HandleCharacterBlockingTheWay(character*, v2, int);
253 virtual void GetAICommand();
254 truth HasDroppedBananas;
255 };
256
CHARACTER(chameleon,nonhumanoid)257 CHARACTER(chameleon, nonhumanoid)
258 {
259 public:
260 virtual int TakeHit(character*, item*, bodypart*, v2, double, double, int, int, int, truth, truth);
261 virtual truth SpecialEnemySightedReaction(character*);
262 protected:
263 virtual col16 GetSkinColor() const;
264 virtual void SpecialTurnHandler() { UpdatePictures(); }
265 };
266
CHARACTER(floatingeye,nonhumanoid)267 CHARACTER(floatingeye, nonhumanoid)
268 {
269 public:
270 floatingeye() : NextWayPoint(0) { }
271 virtual truth Hit(character*, v2, int, int = 0);
272 virtual int TakeHit(character*, item*, bodypart*, v2, double, double, int, int, int, truth, truth);
273 virtual void SetWayPoints(const fearray<packv2>&);
274 virtual void Save(outputfile&) const;
275 virtual void Load(inputfile&);
276 virtual truth IsSpy() const { return true; }
277 virtual truth CanAttack() const { return false; }
278 protected:
279 virtual void GetAICommand();
280 std::vector<v2> WayPoints;
281 uint NextWayPoint;
282 };
283
CHARACTER(eddy,nonhumanoid)284 CHARACTER(eddy, nonhumanoid)
285 {
286 public:
287 virtual truth Hit(character*, v2, int, int = 0);
288 protected:
289 virtual int GetBodyPartWobbleData(int) const;
290 virtual bodypart* MakeBodyPart(int) const;
291 virtual void GetAICommand();
292 };
293
CHARACTER(mushroom,nonhumanoid)294 CHARACTER(mushroom, nonhumanoid)
295 {
296 public:
297 virtual void Save(outputfile&) const;
298 virtual void Load(inputfile&);
299 void SetSpecies(int);
300 int GetSpecies() const { return Species; }
301 virtual truth IsMushroom() const { return true; }
302 protected:
303 virtual void PostConstruct();
304 virtual void GetAICommand();
305 virtual col16 GetTorsoMainColor() const { return Species; }
306 int Species;
307 };
308
CHARACTER(magicmushroom,mushroom)309 CHARACTER(magicmushroom, mushroom)
310 {
311 protected:
312 virtual bodypart* MakeBodyPart(int) const;
313 virtual void GetAICommand();
314 };
315
CHARACTER(twoheadedmoose,nonhumanoid)316 CHARACTER(twoheadedmoose, nonhumanoid)
317 {
318 public:
319 virtual truth Hit(character*, v2, int, int = 0);
320 };
321
CHARACTER(magpie,nonhumanoid)322 CHARACTER(magpie, nonhumanoid)
323 {
324 public:
325 virtual void GetAICommand();
326 virtual truth IsRetreating() const;
327 protected:
328 virtual cchar* FirstPersonBiteVerb() const;
329 virtual cchar* FirstPersonCriticalBiteVerb() const;
330 virtual cchar* ThirdPersonBiteVerb() const;
331 virtual cchar* ThirdPersonCriticalBiteVerb() const;
332 virtual bodypart* MakeBodyPart(int) const;
333 };
334
CHARACTER(skunk,nonhumanoid)335 CHARACTER(skunk, nonhumanoid)
336 {
337 public:
338 virtual void GetAICommand();
339 };
340
CHARACTER(invisiblestalker,nonhumanoid)341 CHARACTER(invisiblestalker, nonhumanoid)
342 {
343 public:
344 virtual void GetAICommand();
345 };
346
CHARACTER(largecreature,nonhumanoid)347 CHARACTER(largecreature, nonhumanoid)
348 {
349 public:
350 virtual void CalculateSquaresUnder() { SquaresUnder = 4; }
351 virtual int GetSquareIndex(v2) const;
352 virtual int GetNeighbourSquares() const { return 12; }
353 virtual int GetExtendedNeighbourSquares() const { return 16; }
354 virtual square* GetNeighbourSquare(int) const;
355 virtual lsquare* GetNeighbourLSquare(int) const;
356 virtual wsquare* GetNeighbourWSquare(int) const;
357 virtual int CalculateNewSquaresUnder(lsquare**, v2) const;
358 virtual truth IsFreeForMe(square*) const;
359 virtual truth CanMoveOn(const lsquare*) const;
360 virtual truth CanMoveOn(const square*) const;
361 virtual void PutTo(v2);
362 virtual void Remove();
363 virtual truth CreateRoute();
364 virtual truth CanTheoreticallyMoveOn(const lsquare*) const;
365 virtual int GetFlySymbolSquareIndex() const { return 1; }
366 virtual int GetSwimmingSymbolSquareIndex() const { return 3; }
367 virtual int GetUnconsciousSymbolSquareIndex() const { return 2; }
368 virtual truth PlaceIsIllegal(v2, v2) const;
369 truth PartCanMoveOn(const lsquare*) const;
370 virtual truth IsLarge() const { return true; }
371 protected:
372 virtual truth CanVomit() const { return false; }
373 virtual bodypart* MakeBodyPart(int) const;
374 virtual void CreateCorpse(lsquare*);
375 virtual void LoadSquaresUnder();
376 };
377
CHARACTER(elpuri,largecreature)378 CHARACTER(elpuri, largecreature)
379 {
380 public:
381 elpuri() : Active(false) { }
382 virtual void Save(outputfile&) const;
383 virtual void Load(inputfile&);
384 virtual truth Hit(character*, v2, int, int = 0);
385 virtual int ReceiveBodyPartDamage(character*, int, int, int, int = 8, truth = false, truth = false, truth = true, truth = false);
386 virtual truth SpecialEnemySightedReaction(character*);
387 virtual truth MustBeRemovedFromBone() const;
388 virtual truth TryToRiseFromTheDead();
389 virtual truth IsFrog() const { return true; }
390 protected:
391 virtual void GetAICommand();
392 virtual void CreateCorpse(lsquare*);
393 truth Active;
394 };
395
CHARACTER(genetrixvesana,largecreature)396 CHARACTER(genetrixvesana, largecreature)
397 {
398 public:
399 genetrixvesana() : TurnsExisted(0) { }
400 virtual void Save(outputfile&) const;
401 virtual void Load(inputfile&);
402 virtual void FinalProcessForBone();
403 protected:
404 virtual void GetAICommand();
405 virtual void CreateCorpse(lsquare*);
406 virtual truth MustBeRemovedFromBone() const;
407 long TurnsExisted;
408 };
409
CHARACTER(hedgehog,nonhumanoid)410 CHARACTER(hedgehog, nonhumanoid)
411 {
412 public:
413 virtual void SpecialBodyDefenceEffect(character*, bodypart*, int);
414 };
415
CHARACTER(bunny,nonhumanoid)416 CHARACTER(bunny, nonhumanoid)
417 {
418 public:
419 virtual truth CheckIfSatiated() { return GetNP() > BLOATED_LEVEL; }
420 virtual void SignalNaturalGeneration();
421 virtual truth IsBunny() const { return true; }
422 virtual truth Catches(item*);
423 protected:
424 truth CheckForMatePartner();
425 virtual void GetAICommand();
426 };
427
CHARACTER(vladimir,largecreature)428 CHARACTER(vladimir, largecreature)
429 {
430 public:
431 virtual truth MustBeRemovedFromBone() const;
432 virtual col16 GetSkinColor() const;
433 virtual void SpecialTurnHandler() { UpdatePictures(); }
434 };
435
CHARACTER(hattifattener,nonhumanoid)436 CHARACTER(hattifattener, nonhumanoid)
437 {
438 public:
439 truth Hit(character*, v2, int, int = 0) { return false; }
440 protected:
441 virtual int GetBodyPartWobbleData(int) const;
442 virtual int GetSpecialBodyPartFlags(int) const;
443 virtual void GetAICommand();
444 virtual void CreateCorpse(lsquare*);
445 };
446
CHARACTER(blinkdog,dog)447 CHARACTER(blinkdog, dog)
448 {
449 public:
450 blinkdog();
451 virtual void Save(outputfile&) const;
452 virtual void Load(inputfile&);
453 virtual int TakeHit(character*, item*, bodypart*, v2, double, double, int, int, int, truth, truth);
454 virtual truth SpecialEnemySightedReaction(character*);
455 protected:
456 virtual bodypart* MakeBodyPart(int) const;
457 void MonsterTeleport(cchar*);
458 truth SummonFriend();
459 int SummonModifier;
460 };
461
CHARACTER(mysticfrog,frog)462 CHARACTER(mysticfrog, frog)
463 {
464 public:
465 virtual void GetAICommand();
466 protected:
467 virtual int GetBodyPartWobbleData(int) const;
468 virtual bodypart* MakeBodyPart(int) const;
469 int GetSpellAPCost() const { return 1500; }
470 };
471
CHARACTER(lobhse,largecreature)472 CHARACTER(lobhse, largecreature)
473 {
474 public:
475 lobhse() : TurnsExisted(0) { }
476 virtual void Save(outputfile&) const;
477 virtual void Load(inputfile&);
478 virtual void Bite(character*, v2, int, truth = false);
479 virtual truth IsSpider() const { return true; }
480 virtual void FinalProcessForBone();
481 protected:
482 virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int);
483 virtual void GetAICommand();
484 virtual void CreateCorpse(lsquare*);
485 virtual truth MustBeRemovedFromBone() const;
486 virtual bodypart* MakeBodyPart(int) const;
487 long TurnsExisted;
488 };
489
CHARACTER(mindworm,nonhumanoid)490 CHARACTER(mindworm, nonhumanoid)
491 {
492 protected:
493 virtual void GetAICommand();
494 virtual truth TryToImplantLarvae(character*);
495 virtual void PsiAttack(character*);
496 };
497
CHARACTER(fusanga,largecreature)498 CHARACTER(fusanga, largecreature)
499 {
500 public:
501 virtual col16 GetSkinColor() const;
502 virtual bodypart* MakeBodyPart(int) const;
503 virtual void SpecialTurnHandler() { UpdatePictures(); }
504 virtual truth IsMushroom() const { return true; }
505 protected:
506 virtual truth AllowExperience() const { return false; }
507 virtual void GetAICommand();
508 virtual void CreateCorpse(lsquare*);
509 virtual truth MustBeRemovedFromBone() const;
510 };
511
512 #endif
513