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 __HUMAN_H__
14 #define __HUMAN_H__
15 
16 #include "char.h"
17 #include "confdef.h"
18 
CHARACTER(humanoid,character)19 CHARACTER(humanoid, character)
20 {
21  public:
22   friend class rightarm;
23   friend class leftarm;
24   humanoid() : CurrentRightSWeaponSkill(0), CurrentLeftSWeaponSkill(0) { }
25   humanoid(const humanoid&);
26   virtual ~humanoid();
27   virtual truth CanWield() const;
28   virtual truth Hit(character*, v2, int, int = 0);
29   virtual int GetSize() const;
30   head* GetHead() const { return static_cast<head*>(*BodyPartSlot[HEAD_INDEX]); }
31   arm* GetRightArm() const { return static_cast<arm*>(*BodyPartSlot[RIGHT_ARM_INDEX]); }
32   arm* GetLeftArm() const { return static_cast<arm*>(*BodyPartSlot[LEFT_ARM_INDEX]); }
33   groin* GetGroin() const { return static_cast<groin*>(*BodyPartSlot[GROIN_INDEX]); }
34   leg* GetRightLeg() const { return static_cast<leg*>(*BodyPartSlot[RIGHT_LEG_INDEX]); }
35   leg* GetLeftLeg() const { return static_cast<leg*>(*BodyPartSlot[LEFT_LEG_INDEX]); }
36   item* GetHelmet() const { return GetHead() ? GetHead()->GetHelmet() : 0; }
37   item* GetAmulet() const { return GetHead() ? GetHead()->GetAmulet() : 0; }
38   item* GetCloak() const { return GetHumanoidTorso() ? GetHumanoidTorso()->GetCloak() : 0; }
39   item* GetBodyArmor() const { return GetHumanoidTorso() ? GetHumanoidTorso()->GetBodyArmor() : 0; }
40   item* GetBelt() const { return GetHumanoidTorso() ? GetHumanoidTorso()->GetBelt() : 0; }
41   item* GetRightWielded() const { return GetRightArm() ? GetRightArm()->GetWielded() : 0; }
42   item* GetLeftWielded() const { return GetLeftArm() ? GetLeftArm()->GetWielded() : 0; }
43   item* GetRightRing() const { return GetRightArm() ? GetRightArm()->GetRing() : 0; }
44   item* GetLeftRing() const { return GetLeftArm() ? GetLeftArm()->GetRing() : 0; }
45   item* GetRightGauntlet() const { return GetRightArm() ? GetRightArm()->GetGauntlet() : 0; }
46   item* GetLeftGauntlet() const { return GetLeftArm() ? GetLeftArm()->GetGauntlet() : 0; }
47   item* GetRightBoot() const { return GetRightLeg() ? GetRightLeg()->GetBoot() : 0; }
48   item* GetLeftBoot() const { return GetLeftLeg() ? GetLeftLeg()->GetBoot() : 0; }
49   void SetHelmet(item* What) { GetHead()->SetHelmet(What); }
50   void SetAmulet(item* What) { GetHead()->SetAmulet(What); }
51   void SetCloak(item* What) { GetHumanoidTorso()->SetCloak(What); }
52   void SetBodyArmor(item* What) { GetHumanoidTorso()->SetBodyArmor(What); }
53   void SetBelt(item* What) { GetHumanoidTorso()->SetBelt(What); }
54   void SetRightWielded(item* What) { GetRightArm()->SetWielded(What); }
55   void SetLeftWielded(item* What) { GetLeftArm()->SetWielded(What); }
56   void SetRightRing(item* What) { GetRightArm()->SetRing(What); }
57   void SetLeftRing(item* What) { GetLeftArm()->SetRing(What); }
58   void SetRightGauntlet(item* What) { GetRightArm()->SetGauntlet(What); }
59   void SetLeftGauntlet(item* What) { GetLeftArm()->SetGauntlet(What); }
60   void SetRightBoot(item* What) { GetRightLeg()->SetBoot(What); }
61   void SetLeftBoot(item* What) { GetLeftLeg()->SetBoot(What); }
62   arm* GetMainArm() const;
63   arm* GetSecondaryArm() const;
64   virtual truth ReceiveDamage(character*, int, int, int = ALL, int = 8, truth = false, truth = false, truth = false, truth = true);
65   virtual truth BodyPartIsVital(int) const;
66   virtual truth BodyPartCanBeSevered(int) const;
67   virtual item* GetMainWielded() const;
68   virtual item* GetSecondaryWielded() const;
69   virtual cchar* GetEquipmentName(int) const;
70   virtual bodypart* GetBodyPartOfEquipment(int) const;
71   virtual item* GetEquipment(int) const;
72   virtual int GetEquipments() const { return 13; }
73   virtual truth SwitchToCraft(recipedata rpd);
74   virtual void SwitchToDig(item*, v2);
75   virtual int GetUsableLegs() const;
76   virtual int GetUsableArms() const;
77   virtual truth CheckKick() const;
78   virtual int OpenMultiplier() const;
79   virtual int CloseMultiplier() const;
80   virtual truth CheckThrow() const;
81   virtual truth CheckOffer() const;
82   virtual sorter EquipmentSorter(int) const;
83   virtual void SetEquipment(int, item*);
84   virtual void DrawSilhouette(truth) const;
85   virtual int GetGlobalResistance(int) const;
86   virtual truth TryToRiseFromTheDead();
87   virtual truth HandleNoBodyPart(int);
88   virtual void Kick(lsquare*, int, truth = false);
89   virtual double GetTimeToKill(ccharacter*, truth) const;
90   virtual int GetAttribute(int, truth = true) const;
91   virtual truth EditAttribute(int, int);
92   virtual void EditExperience(int, double, double);
93   virtual int DrawStats(truth) const;
94   virtual void Bite(character*, v2, int, truth = false);
95   virtual int GetCarryingStrength() const;
96   virtual int GetRandomStepperBodyPart() const;
97   virtual int CheckForBlock(character*, item*, double, int, int, int);
98   virtual truth AddSpecialSkillInfo(felist&) const;
99   virtual truth CheckBalance(double);
100   virtual long GetMoveAPRequirement(int) const;
101   virtual v2 GetEquipmentPanelPos(int) const;
102   virtual truth EquipmentEasilyRecognized(int) const;
103   sweaponskill* GetCurrentRightSWeaponSkill() const { return CurrentRightSWeaponSkill; }
104   void SetCurrentRightSWeaponSkill(sweaponskill* What) { CurrentRightSWeaponSkill = What; }
105   sweaponskill* GetCurrentLeftSWeaponSkill() const { return CurrentLeftSWeaponSkill; }
106   void SetCurrentLeftSWeaponSkill(sweaponskill* What) { CurrentLeftSWeaponSkill = What; }
107   virtual void SWeaponSkillTick();
108   virtual void Save(outputfile&) const;
109   virtual void Load(inputfile&);
110   virtual void SignalEquipmentAdd(int);
111   virtual void SignalEquipmentRemoval(int, citem*);
112   virtual void DrawBodyParts(blitdata&) const;
113   virtual truth CanUseStethoscope(truth) const;
114   virtual truth IsUsingArms() const;
115   virtual truth IsUsingLegs() const;
116   virtual truth IsUsingHead() const;
117   virtual void CalculateBattleInfo();
118   virtual void CalculateBodyParts();
119   virtual void CalculateAllowedWeaponSkillCategories();
120   virtual truth HasALeg() const { return HasAUsableLeg(); }
121   virtual void AddSpecialEquipmentInfo(festring&, int) const;
122   virtual void CreateInitialEquipment(int);
123   virtual festring GetBodyPartName(int, truth = false) const;
124   virtual void CreateBlockPossibilityVector(blockvector&, double) const;
125   virtual item* SevereBodyPart(int, truth = false, stack* = 0);
126   virtual int GetSWeaponSkillLevel(citem*) const;
127   virtual truth UseMaterialAttributes() const;
128   virtual void CalculateDodgeValue();
129   virtual truth CheckZap();
130   virtual truth IsHumanoid() const { return true; }
131   virtual truth CheckTalk();
132   virtual truth CheckIfEquipmentIsNotUsable(int) const;
133   virtual void AddSpecialStethoscopeInfo(felist&) const;
134   virtual item* GetPairEquipment(int) const;
135   virtual truth HasHead() const { return truth(GetHead()); }
136   virtual cfestring& GetStandVerb() const;
137   virtual head* Behead();
138   virtual void AddAttributeInfo(festring&) const;
139   virtual void AddAttackInfo(felist&) const;
140   virtual void AddDefenceInfo(felist&) const;
141   virtual void DetachBodyPart();
142   virtual void SetFireToBodyPart();
143   virtual int GetRandomApplyBodyPart() const;
144   void EnsureCurrentSWeaponSkillIsCorrect(sweaponskill*&, citem*);
145   virtual int GetSumOfAttributes() const;
146   virtual truth CheckConsume(cfestring&) const;
147   virtual truth CanConsume(material*) const;
148   virtual truth PreProcessForBone();
149   virtual void FinalProcessForBone();
150   virtual void StayOn(liquid*);
151   virtual head* GetVirtualHead() const { return GetHead(); }
152   virtual character* CreateZombie() const;
153   virtual void LeprosyHandler();
154   virtual void DropRandomNonVitalBodypart();
155   virtual void DropBodyPart(int);
156   virtual void DuplicateEquipment(character*, ulong);
157   virtual int GetAttributeAverage() const;
158   virtual truth CanVomit() const;
159   virtual truth CheckApply() const;
160   virtual truth CanForceVomit() const { return CanVomit() && HasAUsableArm(); }
161   virtual truth IsTransparent() const;
162   virtual void ModifySituationDanger(double&) const;
163   virtual int RandomizeTryToUnStickBodyPart(ulong) const;
164   virtual truth AllowUnconsciousness() const;
165   virtual truth CanChokeOnWeb(web*) const;
166   virtual truth BrainsHurt() const;
167   virtual truth IsHeadless() const;
168   virtual cchar* GetRunDescriptionLine(int) const;
169   virtual cchar* GetNormalDeathMessage() const;
170   virtual void ApplySpecialAttributeBonuses();
171   virtual truth MindWormCanPenetrateSkull(mindworm*) const;
172   truth HasSadistWeapon() const;
173   truth CheckAIZapOpportunity();
174   virtual truth HasSadistAttackMode() const;
175   truth AutoPlayAIequip();
176   static v2 GetSilhouetteWhere(){return SilhouetteWhere;}
177   static v2 GetSilhouetteWhereDefault(){return SilhouetteWhereDefault;}
178   static void SetSilhouetteWhere(v2 pos){SilhouetteWhere=pos;}
179  protected:
180   virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int);
181   virtual v2 GetBodyPartBitmapPos(int, truth = false) const;
182   virtual col16 GetBodyPartColorB(int, truth = false) const;
183   virtual col16 GetBodyPartColorC(int, truth = false) const;
184   virtual col16 GetBodyPartColorD(int, truth = false) const;
185   virtual int GetBodyPartSparkleFlags(int) const;
186   virtual long GetBodyPartSize(int, int) const;
187   virtual long GetBodyPartVolume(int) const;
188   virtual bodypart* MakeBodyPart(int) const;
189   virtual cfestring& GetDeathMessage() const;
190   truth HasAUsableArm() const;
191   truth HasAUsableLeg() const;
192   truth HasTwoUsableLegs() const;
193   truth CanAttackWithAnArm() const;
194   truth RightArmIsUsable() const;
195   truth LeftArmIsUsable() const;
196   truth RightLegIsUsable() const;
197   truth LeftLegIsUsable() const;
198   std::list<sweaponskill*> SWeaponSkill;
199   sweaponskill* CurrentRightSWeaponSkill;
200   sweaponskill* CurrentLeftSWeaponSkill;
201   static cint DrawOrder[];
202   static v2 SilhouetteWhereDefault;
203   static v2 SilhouetteWhere;
204 };
205 
CHARACTER(playerkind,humanoid)206 CHARACTER(playerkind, humanoid)
207 {
208  public:
209   playerkind();
210   playerkind(const playerkind&);
211   virtual void Save(outputfile&) const;
212   virtual void Load(inputfile&);
213   virtual void SetSoulID(ulong);
214   virtual truth SuckSoul(character*);
215   virtual truth TryToRiseFromTheDead();
216   virtual void FinalProcessForBone();
217   virtual void BeTalkedTo();
218   virtual truth IsHuman() const { return true; }
219   virtual col16 GetHairColor() const { return HairColor; }
220   virtual col16 GetEyeColor() const { return EyeColor; }
221   virtual v2 GetHeadBitmapPos() const;
222   virtual v2 GetRightArmBitmapPos() const;
223   virtual v2 GetLeftArmBitmapPos() const;
224   virtual int GetNaturalSparkleFlags() const;
225   virtual truth IsPlayerKind() const { return true; }
226   virtual double GetNaturalExperience(int) const;
227   virtual int GetTalent() const { return Talent; }
228   virtual int GetWeakness() const { return Weakness; }
229  protected:
230   virtual bodypart* MakeBodyPart(int) const;
231   virtual void PostConstruct();
232   ulong SoulID;
233   col16 HairColor;
234   col16 EyeColor;
235   int Talent;
236   int Weakness;
237   truth IsBonePlayer;
238   truth IsClone;
239 };
240 
CHARACTER(petrus,humanoid)241 CHARACTER(petrus, humanoid)
242 {
243  public:
244   petrus();
245   virtual ~petrus();
246   virtual void Save(outputfile&) const;
247   virtual void Load(inputfile&);
248   virtual void BeTalkedTo();
249   truth HealFully(character*);
250   virtual void FinalProcessForBone();
251   virtual truth MoveTowardsHomePos();
252  protected:
253   virtual void CreateCorpse(lsquare*);
254   virtual void GetAICommand();
255   ulong LastHealed;
256 };
257 
CHARACTER(farmer,humanoid)258 CHARACTER(farmer, humanoid)
259 {
260  public:
261   virtual v2 GetHeadBitmapPos() const;
262   virtual v2 GetRightArmBitmapPos() const;
263   virtual v2 GetLeftArmBitmapPos() const { return GetRightArmBitmapPos(); }
264 };
265 
CHARACTER(guard,humanoid)266 CHARACTER(guard, humanoid)
267 {
268  public:
269   guard() : NextWayPoint(0) { }
270   virtual void Save(outputfile&) const;
271   virtual void Load(inputfile&);
272   virtual void GetAICommand();
273   virtual void SetWayPoints(const fearray<packv2>&);
274   virtual truth MoveTowardsHomePos();
275   virtual void BeTalkedTo();
276  protected:
277   std::vector<v2> WayPoints;
278   uint NextWayPoint;
279 };
280 
CHARACTER(shopkeeper,humanoid)281 CHARACTER(shopkeeper, humanoid)
282 {
283  public:
284   shopkeeper();
285  protected:
286   virtual void GetAICommand() { StandIdleAI(); }
287 };
288 
CHARACTER(priest,humanoid)289 CHARACTER(priest, humanoid)
290 {
291  protected:
292   virtual void GetAICommand();
293   virtual void BeTalkedTo();
294   void CallForMonsters();
295 };
296 
CHARACTER(oree,humanoid)297 CHARACTER(oree, humanoid)
298 {
299  public:
300   virtual void Bite(character*, v2, int, truth = false);
301   virtual void GetAICommand();
302  protected:
303   virtual cchar* FirstPersonBiteVerb() const;
304   virtual cchar* FirstPersonCriticalBiteVerb() const;
305   virtual cchar* ThirdPersonBiteVerb() const;
306   virtual cchar* ThirdPersonCriticalBiteVerb() const;
307   virtual cchar* BiteNoun() const;
308   void CallForMonsters();
309 };
310 
CHARACTER(darkknight,humanoid)311 CHARACTER(darkknight, humanoid)
312 {
313  public:
314   virtual truth SpecialEnemySightedReaction(character*);
315   virtual truth CheckForUsefulItemsOnGround(truth = true);
316  protected:
317   virtual int ModifyBodyPartHitPreference(int, int) const;
318   virtual int ModifyBodyPartToHitChance(int, int) const;
319   virtual truth CanPanicFromSeveredBodyPart() const { return false; }
320   virtual void SpecialBodyPartSeverReaction();
321 };
322 
CHARACTER(ennerbeast,humanoid)323 CHARACTER(ennerbeast, humanoid)
324 {
325  public:
326   virtual truth Hit(character*, v2, int, int = 0);
327   virtual truth MustBeRemovedFromBone() const;
328  protected:
329   virtual bodypart* MakeBodyPart(int) const;
330   virtual void GetAICommand();
331   virtual truth AttackIsBlockable(int) const { return false; }
332 };
333 
CHARACTER(ennerchild,humanoid)334 CHARACTER(ennerchild, humanoid)
335 {
336  public:
337   virtual truth Hit(character*, v2, int, int = 0);
338   virtual truth MustBeRemovedFromBone() const;
339   virtual truth ReceiveDamage(character*, int, int, int = ALL, int = 8, truth = false, truth = false, truth = false, truth = true);
340  protected:
341   virtual bodypart* MakeBodyPart(int) const;
342   virtual void GetAICommand();
343   virtual truth AttackIsBlockable(int) const { return false; }
344 };
345 
CHARACTER(skeleton,humanoid)346 CHARACTER(skeleton, humanoid)
347 {
348  public:
349   virtual void BeTalkedTo();
350   virtual item* SevereBodyPart(int, truth = false, stack* = 0);
351   virtual truth BodyPartIsVital(int) const;
352   virtual long GetBodyPartVolume(int) const;
353  protected:
354   virtual void CreateCorpse(lsquare*);
355 };
356 
CHARACTER(goblin,humanoid)357 CHARACTER(goblin, humanoid)
358 {
359  public:
360   virtual void GetAICommand();
361 };
362 
CHARACTER(golem,humanoid)363 CHARACTER(golem, humanoid)
364 {
365  public:
366   golem();
367   virtual truth MoveRandomly();
368   virtual truth CheckForUsefulItemsOnGround(truth = true) { return false; }
369   virtual void BeTalkedTo();
370   virtual void Save(outputfile&) const;
371   virtual void Load(inputfile&);
372   void SetItemVolume(long What) { ItemVolume = What; }
373  protected:
374   virtual truth AddAdjective(festring&, truth) const;
375   virtual material* CreateBodyPartMaterial(int, long) const;
376   virtual void CreateCorpse(lsquare*);
377   long ItemVolume;
378 };
379 
CHARACTER(communist,humanoid)380 CHARACTER(communist, humanoid)
381 {
382  public:
383   virtual truth MoveRandomly();
384   virtual void BeTalkedTo();
385   virtual truth BoundToUse(citem*, int) const;
386   virtual truth MustBeRemovedFromBone() const;
387  protected:
388   virtual truth ShowClassDescription() const;
389 };
390 
CHARACTER(hunter,humanoid)391 CHARACTER(hunter, humanoid)
392 {
393  public:
394   virtual void BeTalkedTo();
395  protected:
396   virtual void CreateBodyParts(int);
397 };
398 
CHARACTER(slave,playerkind)399 CHARACTER(slave, playerkind)
400 {
401  public:
402   virtual void BeTalkedTo();
403   virtual void GetAICommand();
404   virtual col16 GetHairColor() const { return humanoid::GetHairColor(); }
405   virtual col16 GetEyeColor() const { return humanoid::GetEyeColor(); }
406  protected:
407   virtual void PostConstruct();
408 };
409 
CHARACTER(petrusswife,humanoid)410 CHARACTER(petrusswife, humanoid)
411 {
412  public:
413   petrusswife() : GiftTotal(0) { }
414   virtual truth MoveRandomly() { return MoveRandomlyInRoom(); }
415   virtual truth SpecialEnemySightedReaction(character*);
416   virtual void Save(outputfile&) const;
417   virtual void Load(inputfile&);
418   virtual void BeTalkedTo();
419  protected:
420   int GiftTotal;
421 };
422 
CHARACTER(housewife,humanoid)423 CHARACTER(housewife, humanoid)
424 {
425  public:
426   virtual truth SpecialEnemySightedReaction(character*);
427   virtual void CreateInitialEquipment(int);
428  protected:
429   virtual int GetHairColor() const;
430   virtual v2 GetHeadBitmapPos() const;
431 };
432 
CHARACTER(femaleslave,humanoid)433 CHARACTER(femaleslave, humanoid)
434 {
435  public:
436   virtual void BeTalkedTo();
437  protected:
438   virtual void GetAICommand() { StandIdleAI(); }
439 };
440 
CHARACTER(librarian,humanoid)441 CHARACTER(librarian, humanoid)
442 {
443  public:
444   virtual void BeTalkedTo();
445  protected:
446   virtual void GetAICommand() { StandIdleAI(); }
447 };
448 
CHARACTER(zombie,humanoid)449 CHARACTER(zombie, humanoid)
450 {
451  public:
452   virtual void BeTalkedTo();
453   virtual truth BodyPartIsVital(int) const;
454   virtual void CreateBodyParts(int);
455   virtual truth AllowSpoil() const { return GetConfig() != ZOMBIE_OF_KHAZ_ZADM; }
456   void SetDescription(cfestring What) { Description = What; }
457   virtual void Save(outputfile&) const;
458   virtual void Load(inputfile&);
459   virtual festring GetZombieDescription() const;
460  protected:
461   virtual void PostConstruct();
462   virtual void AddPostFix(festring&, int) const;
463   virtual void GetAICommand();
464   virtual truth AllowExperience() const { return GetConfig() == ZOMBIE_OF_KHAZ_ZADM; }
465   festring Description;
466 };
467 
CHARACTER(ghost,humanoid)468 CHARACTER(ghost, humanoid)
469 {
470  public:
471   ghost() : Active(true) { }
472   virtual truth BodyPartIsVital(int) const;
473 //  virtual void CreateBodyParts(int); // as per zombies, in case some body parts are missing?
474   void SetDescription(cfestring What) { Description = What; }
475   virtual festring GetGhostDescription() const;
476   virtual void AddName(festring&, int) const;
477   virtual void Save(outputfile&) const;
478   virtual void Load(inputfile&);
479   void SetOwnerSoul(cfestring& What) { OwnerSoul = What; }
480   virtual truth IsNameable() const { return OwnerSoul.IsEmpty(); }
481   virtual truth RaiseTheDead(character*);
482   virtual int ReceiveBodyPartDamage(character*, int, int, int, int = 8, truth = false, truth = false, truth = true, truth = false);
483   virtual truth SpecialEnemySightedReaction(character*);
484   void SetIsActive(truth What) { Active = What; }
485   virtual truth IsPolymorphable() const { return MaxHP < 100; }
486  protected:
487   virtual truth AllowExperience() const { return false; }
488   virtual cchar* FirstPersonUnarmedHitVerb() const;
489   virtual cchar* FirstPersonCriticalUnarmedHitVerb() const;
490   virtual cchar* ThirdPersonUnarmedHitVerb() const;
491   virtual cchar* ThirdPersonCriticalUnarmedHitVerb() const;
492   virtual truth AttackIsBlockable(int) const { return false; }
493   virtual truth AttackMayDamageArmor() const { return false; }
494   virtual void GetAICommand();
495   festring OwnerSoul;
496   truth Active;
497   festring Description;
498 };
499 
CHARACTER(bonesghost,ghost)500 CHARACTER(bonesghost, ghost)
501 {
502  public:
503   virtual col16 GetHairColor() const { return HairColor; }
504   virtual col16 GetEyeColor() const { return EyeColor; }
505   virtual v2 GetHeadBitmapPos() const;
506   virtual v2 GetRightArmBitmapPos() const;
507   virtual v2 GetLeftArmBitmapPos() const;
508   virtual void Save(outputfile&) const;
509   virtual void Load(inputfile&);
510   virtual void PostConstruct();
511   virtual truth IsPolymorphable() const { return false; }
512  protected:
513   col16 HairColor;
514   col16 EyeColor;
515 };
516 
CHARACTER(xinrochghost,ghost)517 CHARACTER(xinrochghost, ghost)
518 {
519  public:
520   virtual truth IsNameable() const { return false; }
521   virtual truth IsPolymorphable() const { return false; }
522   virtual truth CheckForUsefulItemsOnGround(truth = true) { return false; }
523  protected:
524   virtual void GetAICommand();
525   virtual void CreateCorpse(lsquare*);
526 };
527 
CHARACTER(imp,humanoid)528 CHARACTER(imp, humanoid)
529 {
530  public:
531   virtual truth SpecialEnemySightedReaction(character*);
532  protected:
533   virtual truth CanVomit() const { return true; }
534   virtual void PostConstruct();
535 };
536 
CHARACTER(crimsonimp,imp)537 CHARACTER(crimsonimp, imp)
538 {
539  protected:
540   virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int);
541   virtual void CreateCorpse(lsquare*);
542 };
543 
CHARACTER(mirrorimp,imp)544 CHARACTER(mirrorimp, imp)
545 {
546  public:
547   virtual truth IsMagicDrinker() const { return true; }
548   virtual truth DrinkMagic(const beamdata&);
549  protected:
550   virtual void CreateCorpse(lsquare*);
551 };
552 
CHARACTER(mistress,humanoid)553 CHARACTER(mistress, humanoid)
554 {
555  public:
556   virtual int TakeHit(character*, item*, bodypart*, v2, double, double, int, int, int, truth, truth);
557   virtual truth ReceiveDamage(character*, int, int, int = ALL, int = 8, truth = false, truth = false, truth = false, truth = true);
558   virtual truth AllowEquipment(citem*, int) const;
559 };
560 
CHARACTER(werewolfhuman,humanoid)561 CHARACTER(werewolfhuman, humanoid)
562 {
563 };
564 
CHARACTER(werewolfwolf,humanoid)565 CHARACTER(werewolfwolf, humanoid)
566 {
567  public:
568   virtual festring GetKillName() const;
569   virtual void GetAICommand();
570  protected:
571   virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int);
572 };
573 
CHARACTER(vampire,humanoid)574 CHARACTER(vampire, humanoid)
575 {
576  protected:
577   virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int);
578 };
579 
CHARACTER(kobold,humanoid)580 CHARACTER(kobold, humanoid)
581 {
582 };
583 
CHARACTER(gibberling,humanoid)584 CHARACTER(gibberling, humanoid)
585 {
586 };
587 
CHARACTER(angel,humanoid)588 CHARACTER(angel, humanoid)
589 {
590  public:
591   angel() : LastHealed(0) { }
592   virtual void Load(inputfile&);
593   virtual void Save(outputfile&) const;
594   virtual truth AttachBodyPartsOfFriendsNear();
595   virtual truth BodyPartIsVital(int) const;
596   virtual int GetAttribute(int, truth = true) const;
597   virtual col24 GetBaseEmitation() const;
598   virtual truth CanCreateBodyPart(int) const;
599   virtual cfestring& GetStandVerb() const { return character::GetStandVerb(); }
600   virtual void FinalProcessForBone();
601   virtual void CreateInitialEquipment(int);
602  protected:
603   virtual int GetTorsoMainColor() const;
604   virtual int GetArmMainColor() const;
605   virtual void GetAICommand();
606   ulong LastHealed;
607 };
608 
CHARACTER(kamikazedwarf,humanoid)609 CHARACTER(kamikazedwarf, humanoid)
610 {
611  public:
612   virtual truth Hit(character*, v2, int, int = 0);
613   virtual truth CheckForUsefulItemsOnGround(truth = true) { return false; }
614   virtual void GetAICommand();
615   virtual void CreateInitialEquipment(int);
616   virtual truth IsKamikazeDwarf() const { return true; }
617   virtual void SingRandomSong();
618  protected:
619   virtual int GetTorsoMainColor() const;
620   virtual int GetGauntletColor() const;
621   virtual int GetLegMainColor() const;
622   virtual int GetWSkillHits() const { return 10000; }
623   virtual truth IsElite() const { return false; }
624 };
625 
CHARACTER(genie,humanoid)626 CHARACTER(genie, humanoid)
627 {
628  public:
629   virtual truth BodyPartIsVital(int) const;
630   virtual int GetAttribute(int, truth = true) const;
631   virtual truth CanCreateBodyPart(int) const;
632   virtual cfestring& GetStandVerb() const { return character::GetStandVerb(); }
633 };
634 
CHARACTER(orc,humanoid)635 CHARACTER(orc, humanoid)
636 {
637  public:
638   virtual truth MoveRandomly();
639  protected:
640   virtual void PostConstruct();
641 };
642 
CHARACTER(cossack,humanoid)643 CHARACTER(cossack, humanoid)
644 {
645  public:
646   virtual void GetAICommand();
647 };
648 
CHARACTER(bananagrower,humanoid)649 CHARACTER(bananagrower, humanoid)
650 {
651  public:
652   virtual void Save(outputfile&) const;
653   virtual void Load(inputfile&);
654   virtual void BeTalkedTo();
655   virtual festring& ProcessMessage(festring&) const;
656   virtual truth IsBananaGrower() const { return true; }
657   festring GetProfession() const { return Profession; }
658   virtual void SetFeedingSumo(truth What) { FeedingSumo = What; }
659  protected:
660   virtual truth HandleCharacterBlockingTheWay(character*, v2, int);
661   virtual void PostConstruct();
662   virtual void GetAICommand();
663   void RandomizeProfession();
664   festring Profession;
665   truth HasDroppedBananas;
666   truth FeedingSumo;
667 };
668 
CHARACTER(imperialist,humanoid)669 CHARACTER(imperialist, humanoid)
670 {
671  public:
672   virtual void GetAICommand() { StandIdleAI(); }
673   virtual void BeTalkedTo();
674   virtual void DisplayStethoscopeInfo(character*) const;
675 };
676 
CHARACTER(smith,humanoid)677 CHARACTER(smith, humanoid)
678 {
679  public:
680   virtual void BeTalkedTo();
681   virtual void GetAICommand() { StandIdleAI(); }
682 };
683 
CHARACTER(elder,humanoid)684 CHARACTER(elder, humanoid)
685 {
686  public:
687   elder() : HasBeenSpokenTo(false) { }
688   virtual void Save(outputfile&) const;
689   virtual void Load(inputfile&);
690  protected:
691   virtual void GetAICommand();
692   virtual void CreateBodyParts(int);
693   virtual void BeTalkedTo();
694   truth HasBeenSpokenTo;
695 };
696 
CHARACTER(encourager,humanoid)697 CHARACTER(encourager, humanoid)
698 {
699  /*public:
700   encourager() : LastHit(0) { }
701   virtual void Save(outputfile&) const;
702   virtual void Load(inputfile&);
703   virtual void FinalProcessForBone();
704  protected:
705   virtual void GetAICommand();
706   ulong LastHit;*/
707  protected:
708   virtual void GetAICommand() { StandIdleAI(); }
709 };
710 
CHARACTER(darkmage,humanoid)711 CHARACTER(darkmage, humanoid)
712 {
713  protected:
714   virtual void GetAICommand();
715   int GetSpellAPCost() const;
716 };
717 
CHARACTER(necromancer,humanoid)718 CHARACTER(necromancer, humanoid)
719 {
720  public:
721   virtual truth TryToRaiseZombie();
722   virtual void RaiseSkeleton();
723   virtual void BeTalkedTo();
724  protected:
725   virtual void GetAICommand();
726   int GetSpellAPCost() const;
727 };
728 
CHARACTER(sumowrestler,humanoid)729 CHARACTER(sumowrestler, humanoid)
730 {
731  public:
732   virtual void BeTalkedTo();
733   virtual truth CheckIfSatiated() { return GetNP() > BLOATED_LEVEL; }
734   virtual truth IsSumoWrestler() const { return true; }
735   virtual truth EquipmentIsAllowed(int) const;
736  protected:
737   virtual void GetAICommand();
738 };
739 
CHARACTER(tourist,humanoid)740 CHARACTER(tourist, humanoid)
741 {
742  public:
743   virtual void BeTalkedTo();
744   virtual character* GetLeader() const;
745  protected:
746   virtual void GetAICommand();
747 };
748 
CHARACTER(veterankamikazedwarf,kamikazedwarf)749 CHARACTER(veterankamikazedwarf, kamikazedwarf)
750 {
751  protected:
752   virtual void PostConstruct();
753   virtual int GetTorsoMainColor() const;
754   virtual int GetGauntletColor() const;
755   virtual int GetLegMainColor() const;
756   virtual int GetWSkillHits() const { return 50000; }
757   virtual truth IsElite() const { return true; }
758 };
759 
CHARACTER(archangel,angel)760 CHARACTER(archangel, angel)
761 {
762  public:
763   virtual void CreateInitialEquipment(int);
764  protected:
765   virtual int GetTorsoMainColor() const;
766   virtual int GetArmMainColor() const;
767 };
768 
CHARACTER(tailor,humanoid)769 CHARACTER(tailor, humanoid)
770 {
771  public:
772   virtual void BeTalkedTo();
773   virtual void GetAICommand() { StandIdleAI(); }
774 };
775 
CHARACTER(siren,humanoid)776 CHARACTER(siren, humanoid)
777 {
778  public:
779   virtual void GetAICommand();
780   virtual truth MoveRandomly();
781  protected:
782   virtual void PostConstruct();
783   virtual truth TryToSing();
784 };
785 
CHARACTER(punisher,humanoid)786 CHARACTER(punisher, humanoid)
787 {
788 };
789 
CHARACTER(child,humanoid)790 CHARACTER(child, humanoid)
791 {
792  public:
793   virtual truth MoveRandomly();
794   virtual truth IsKing() const { return GetConfig() == KING; }
795   virtual truth MustBeRemovedFromBone() const;
796  protected:
797   virtual void BeTalkedTo();
798 };
799 
CHARACTER(bum,humanoid)800 CHARACTER(bum, humanoid)
801 {
802 };
803 
CHARACTER(nihil,humanoid)804 CHARACTER(nihil, humanoid)
805 {
806  public:
807   virtual truth BodyPartIsVital(int) const;
808   virtual truth CanCreateBodyPart(int) const;
809   virtual int GetAttribute(int, truth = true) const;
810   virtual col24 GetBaseEmitation() const { return MakeRGB24(150, 110, 110); }
811   virtual cfestring& GetStandVerb() const { return character::GetStandVerb(); }
812 };
813 
CHARACTER(terra,priest)814 CHARACTER(terra, priest)
815 {
816  public:
817   terra() : HasBeenSpokenTo(false) { }
818   virtual void Save(outputfile&) const;
819   virtual void Load(inputfile&);
820  protected:
821   virtual void BeTalkedTo();
822   truth HasBeenSpokenTo;
823 };
824 
CHARACTER(aslonawizard,humanoid)825 CHARACTER(aslonawizard, humanoid)
826 {
827  public:
828   aslonawizard() : HasBeenSpokenTo(false) { }
829   virtual void Save(outputfile&) const;
830   virtual void Load(inputfile&);
831  protected:
832   virtual void GetAICommand();
833   int GetSpellAPCost() const;
834   virtual void BeTalkedTo();
835   virtual void CreateCorpse(lsquare*);
836   truth HasBeenSpokenTo;
837 };
838 
CHARACTER(aslonacaptain,guard)839 CHARACTER(aslonacaptain, guard)
840 {
841  public:
842   aslonacaptain() : HasBeenSpokenTo(false) { }
843   virtual void Save(outputfile&) const;
844   virtual void Load(inputfile&);
845  protected:
846   virtual void BeTalkedTo();
847   truth HasBeenSpokenTo;
848 };
849 
CHARACTER(aslonapriest,priest)850 CHARACTER(aslonapriest, priest)
851 {
852  public:
853   aslonapriest() : HasBeenSpokenTo(false) { }
854   virtual void Save(outputfile&) const;
855   virtual void Load(inputfile&);
856  protected:
857   virtual void BeTalkedTo();
858   truth HasBeenSpokenTo;
859 };
860 
CHARACTER(gasghoul,zombie)861 CHARACTER(gasghoul, zombie)
862 {
863  public:
864   virtual int TakeHit(character*, item*, bodypart*, v2, double, double, int, int, int, truth, truth);
865   virtual truth AllowSpoil() const { return false; }
866 };
867 
CHARACTER(harvan,humanoid)868 CHARACTER(harvan, humanoid)
869 {
870  public:
871   virtual truth SpecialEnemySightedReaction(character*);
872   virtual void BeTalkedTo();
873   virtual void GetAICommand() { StandIdleAI(); }
874 };
875 
CHARACTER(lordregent,humanoid)876 CHARACTER(lordregent, humanoid)
877 {
878  public:
879   virtual void BeTalkedTo();
880   virtual void GetAICommand() { StandIdleAI(); }
881  protected:
882   virtual void SpecialBodyPartSeverReaction();
883 };
884 
885 #endif
886