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