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 __CHAR_H__
14 #define __CHAR_H__
15 
16 #include "bodypart.h"
17 #include "script.h"
18 #include "wskill.h"
19 #include "save.h"
20 #include "craft.h"
21 
22 #define CHAR_PERSONAL_PRONOUN GetPersonalPronoun(true).CStr()
23 #define CHAR_POSSESSIVE_PRONOUN GetPossessivePronoun(true).CStr()
24 #define CHAR_OBJECT_PRONOUN GetObjectPronoun(true).CStr()
25 #define CHAR_PERSONAL_PRONOUN_THIRD_PERSON_VIEW GetPersonalPronoun(false).CStr()
26 #define CHAR_POSSESSIVE_PRONOUN_THIRD_PERSON_VIEW GetPossessivePronoun(false).CStr()
27 #define CHAR_OBJECT_PRONOUN_THIRD_PERSON_VIEW GetObjectPronoun(false).CStr()
28 
29 class go;
30 class team;
31 class wsquare;
32 class cweaponskill;
33 class action;
34 class characterprototype;
35 class web;
36 class mindworm;
37 
38 struct homedata;
39 struct trapdata;
40 struct blitdata;
41 
42 typedef std::vector<std::pair<double, int>> blockvector;
43 typedef truth (item::*sorter)(ccharacter*) const;
44 typedef truth (character::*petmanagementfunction)();
45 typedef character* (*characterspawner)(int, int);
46 typedef character* (*charactercloner)(ccharacter*);
47 
APBonus(int Attribute)48 inline int APBonus(int Attribute)
49 {
50   return Attribute >= 10 ? 90 + Attribute : 50 + Attribute * 5;
51 }
52 
53 struct expid
54 {
55   bool operator<(expid) const;
56   int ActID, SrcID;
57 };
58 
59 inline bool expid::operator<(expid E) const
60 {
61   return ActID != E.ActID ? ActID < E.ActID : SrcID < E.SrcID;
62 }
63 
64 RAW_SAVE_LOAD(expid)
65 
66 typedef std::map<expid, double> expmodifiermap;
67 
68 struct characterdatabase : public databasebase
69 {
70   typedef characterprototype prototype;
71   void InitDefaults(const prototype*, int);
AllowRandomInstantiationcharacterdatabase72   truth AllowRandomInstantiation() const { return CanBeGenerated && !IsUnique; }
73   void PostProcess();
74   const prototype* ProtoType;
75   double NaturalExperience[ATTRIBUTES];
76   ulong Flags;
77   truth IsAbstract;
78   truth CanRead;
79   truth CanBeGenerated;
80   truth CanOpen;
81   truth IsUnique;
82   truth IsNameable;
83   truth IsPolymorphable;
84   truth CanUseEquipment;
85   truth CanKick;
86   truth CanTalk;
87   truth CanBeWished;
88   truth CreateDivineConfigurations;
89   truth CreateGolemMaterialConfigurations;
90   truth CanBeCloned;
91   truth CanZap;
92   truth HasALeg;
93   truth IgnoreDanger;
94   truth IsExtraCoward;
95   truth SpillsBlood;
96   truth HasEyes;
97   truth HasHead;
98   truth CanThrow;
99   truth UsesNutrition;
100   truth BodyPartsDisappearWhenSevered;
101   truth CanBeConfused;
102   truth CanApply;
103   truth BiteCapturesBodyPart;
104   truth IsPlant;
105   truth DestroysWalls;
106   truth IsRooted;
107   truth HasSecondaryMaterial;
108   truth IsImmuneToLeprosy;
109   truth AutomaticallySeen;
110   truth CanHear;
111   truth WillCarryItems;
112   truth Sweats;
113   truth IsImmuneToItemTeleport;
114   truth AlwaysUseMaterialAttributes;
115   truth IsEnormous;
116   truth IsExtraFragile;
117   truth AllowUnconsciousness;
118   truth CanChoke;
119   truth IsImmuneToStickiness;
120   truth ForceCustomStandVerb;
121   truth VomittingIsUnhealthy;
122   int DefaultEndurance;
123   int DefaultPerception;
124   int DefaultIntelligence;
125   int DefaultWisdom;
126   int DefaultWillPower;
127   int DefaultCharisma;
128   int DefaultMana;
129   int DefaultArmStrength;
130   int DefaultLegStrength;
131   int DefaultDexterity;
132   int DefaultAgility;
133   long DefaultMoney;
134   int TotalSize;
135   int Sex;
136   int CriticalModifier;
137   festring StandVerb;
138   int Frequency;
139   int EnergyResistance;
140   int FireResistance;
141   int PoisonResistance;
142   int ElectricityResistance;
143   int AcidResistance;
144   int SoundResistance;
145   int ConsumeFlags;
146   long TotalVolume;
147   packv2 HeadBitmapPos;
148   packv2 TorsoBitmapPos;
149   packv2 ArmBitmapPos;
150   packv2 LegBitmapPos;
151   packv2 RightArmBitmapPos;
152   packv2 LeftArmBitmapPos;
153   packv2 RightLegBitmapPos;
154   packv2 LeftLegBitmapPos;
155   packv2 GroinBitmapPos;
156   packcol16 ClothColor;
157   packcol16 SkinColor;
158   packcol16 CapColor;
159   packcol16 HairColor;
160   packcol16 EyeColor;
161   packcol16 TorsoMainColor;
162   packcol16 BeltColor;
163   packcol16 BootColor;
164   packcol16 TorsoSpecialColor;
165   packcol16 ArmMainColor;
166   packcol16 GauntletColor;
167   packcol16 ArmSpecialColor;
168   packcol16 LegMainColor;
169   packcol16 LegSpecialColor;
170   col24 BaseEmitation;
171   truth UsesLongArticle;
172   festring Adjective;
173   truth UsesLongAdjectiveArticle;
174   festring NameSingular;
175   festring NamePlural;
176   festring PostFix;
177   int ArticleMode;
178   int BaseUnarmedStrength;
179   int BaseBiteStrength;
180   int BaseKickStrength;
181   int BonusBiteStrength;
182   int AttackStyle;
183   long ClassStates;
184   fearray<festring> Alias;
185   contentscript<item> Helmet;
186   contentscript<item> Amulet;
187   contentscript<item> Cloak;
188   contentscript<item> BodyArmor;
189   contentscript<item> Belt;
190   contentscript<item> RightWielded;
191   contentscript<item> LeftWielded;
192   contentscript<item> RightRing;
193   contentscript<item> LeftRing;
194   contentscript<item> RightGauntlet;
195   contentscript<item> LeftGauntlet;
196   contentscript<item> RightBoot;
197   contentscript<item> LeftBoot;
198   int AttributeBonus;
199   fearray<long> KnownCWeaponSkills;
200   fearray<long> CWeaponSkillHits;
201   int RightSWeaponSkillHits;
202   int LeftSWeaponSkillHits;
203   int PanicLevel;
204   fearray<contentscript<item>> Inventory;
205   int DangerModifier;
206   festring DefaultName;
207   fearray<festring> FriendlyReplies;
208   fearray<festring> HostileReplies;
209   int FleshMaterial;
210   festring DeathMessage;
211   int HPRequirementForGeneration;
212   int DayRequirementForGeneration;
213   int AttackWisdomLimit;
214   int AttachedGod;
215   packv2 WieldedPosition;
216   int NaturalSparkleFlags;
217   int MoveType;
218   int BloodMaterial;
219   int VomitMaterial;
220   int PolymorphIntelligenceRequirement;
221   ulong DefaultCommandFlags;
222   ulong ConstantCommandFlags;
223   festring ForceVomitMessage;
224   int SweatMaterial;
225   fearray<festring> ScienceTalkAdjectiveAttribute;
226   fearray<festring> ScienceTalkSubstantiveAttribute;
227   fearray<festring> ScienceTalkPrefix;
228   fearray<festring> ScienceTalkName;
229   int ScienceTalkPossibility;
230   int ScienceTalkIntelligenceModifier;
231   int ScienceTalkWisdomModifier;
232   int ScienceTalkCharismaModifier;
233   int ScienceTalkIntelligenceRequirement;
234   int ScienceTalkWisdomRequirement;
235   int ScienceTalkCharismaRequirement;
236   int DisplacePriority;
237   festring RunDescriptionLineOne;
238   festring RunDescriptionLineTwo;
239   truth AllowPlayerToChangeEquipment;
240   int TamingDifficulty;
241   truth IsMasochist;
242   truth IsSadist;
243   truth IsCatacombCreature;
244   truth CreateUndeadConfigurations;
245   truth UndeadVersions;
246   int UndeadAttributeModifier;
247   int UndeadVolumeModifier;
248   truth UndeadCopyMaterials;
249   truth GhostCopyMaterials;
250   truth CanBeGeneratedOnlyInTheCatacombs;
251   truth IsAlcoholic;
252   truth IsUndead;
253   truth IsImmuneToWhipOfThievery;
254   fearray<int> AllowedDungeons;
255 };
256 
257 class characterprototype
258 {
259  public:
260   friend class databasecreator<character>;
261   friend class protosystem;
262   characterprototype(const characterprototype*, characterspawner, charactercloner, cchar*);
263   character* Spawn(int Config = 0, int SpecialFlags = 0) const { return Spawner(Config, SpecialFlags); }
264   character* SpawnAndLoad(inputfile&) const;
Clone(ccharacter * Char)265   character* Clone(ccharacter* Char) const { return Cloner(Char); }
GetIndex()266   int GetIndex() const { return Index; }
GetBase()267   const characterprototype* GetBase() const { return Base; }
GetClassID()268   cchar* GetClassID() const { return ClassID; }
269   int CreateSpecialConfigurations(characterdatabase**, int, int);
ChooseBaseForConfig(characterdatabase ** TempConfig,int,int)270   const characterdatabase* ChooseBaseForConfig(characterdatabase** TempConfig, int, int) { return *TempConfig; }
GetConfigData()271   const characterdatabase*const* GetConfigData() const { return ConfigData; }
GetConfigSize()272   int GetConfigSize() const { return ConfigSize; }
273  private:
274   int Index;
275   const characterprototype* Base;
276   characterdatabase** ConfigData;
277   characterdatabase** ConfigTable[CONFIG_TABLE_SIZE];
278   int ConfigSize;
279   characterspawner Spawner;
280   charactercloner Cloner;
281   cchar* ClassID;
282 };
283 
284 class rpdata;
285 class character : public entity, public id
286 {
287  public:
288   friend class databasecreator<character>;
289   friend class corpse;
290   typedef characterprototype prototype;
291   typedef characterdatabase database;
292   character();
293   character(ccharacter&);
294   virtual ~character();
295   virtual void Save(outputfile&) const;
296   virtual void Load(inputfile&);
CanWield()297   virtual truth CanWield() const { return false; }
Catches(item *)298   virtual truth Catches(item*) { return false; }
299   truth CheckDeath(cfestring&, ccharacter* = 0, ulong = 0);
300   truth DodgesFlyingItem(item*, double);
301   virtual truth Hit(character*, v2, int, int = 0) = 0;
302   truth ReadItem(item*);
303   truth TestForPickup(item*) const;
304   void ThrowItem(int, item*);
305   truth TryMove(v2, truth, truth, truth* =NULL);
306   truth HasHeadOfElpuri() const;
307   truth HasGoldenEagleShirt() const;
308   truth HasEncryptedScroll() const;
309   truth HasPetrussNut() const;
310   truth RemoveEncryptedScroll();
311   truth HasShadowVeil() const;
312   truth HasLostRubyFlamingSword() const;
313   truth RemoveShadowVeil(character*);
314   truth HasNuke() const;
315   truth RemoveNuke(character*);
316   truth HasWeepObsidian() const;
317   truth RemoveWeepObsidian(character*);
318   truth HasMuramasa() const;
319   truth RemoveMuramasa(character*);
320   truth HasMasamune() const;
321   truth RemoveMasamune(character*);
IsPlayer()322   truth IsPlayer() const { return Flags & C_PLAYER; }
GetFlags()323   ulong GetFlags() const { return Flags; } //mainly for debugging
324   truth Engrave(cfestring&);
325   void AddScoreEntry(cfestring&, double = 1., truth = true) const;
GetAP()326   long GetAP() const { return AP; }
GetNP()327   long GetNP() const { return NP; }
GetStack()328   stack* GetStack() const { return Stack; }
GetBurdenState()329   int GetBurdenState() const { return BurdenState; }
MakesBurdened(long What)330   truth MakesBurdened(long What) const { return long(GetCarryingStrength()) * 2500 < What; }
331   virtual int TakeHit(character*, item*, bodypart*, v2, double, double, int, int, int, truth, truth);
332   int GetLOSRange() const;
GetLOSRangeSquare()333   int GetLOSRangeSquare() const { return GetLOSRange() * GetLOSRange(); }
GetESPRange()334   int GetESPRange() const { return GetAttribute(INTELLIGENCE) / 3; }
GetESPRangeSquare()335   int GetESPRangeSquare() const { return GetESPRange() * GetESPRange(); }
GetTeleportRange()336   int GetTeleportRange() const { return GetAttribute(INTELLIGENCE); }
GetTeleportRangeSquare()337   int GetTeleportRangeSquare() const { return GetTeleportRange() * GetTeleportRange(); }
338   void AddMissMessage(ccharacter*) const;
339   void AddPrimitiveHitMessage(ccharacter*, cfestring&, cfestring&, int) const;
340   void AddWeaponHitMessage(ccharacter*, citem*, int, truth = false) const;
341   virtual void BeTalkedTo();
342   void ReceiveDarkness(long);
343   void Die(ccharacter* = 0, cfestring& = CONST_S(""), ulong = 0);
344   void HasBeenHitByItem(character*, item*, int, double, int);
345   void Hunger();
346   void Move(v2, truth, truth = false);
347   virtual truth MoveRandomly();
348   void ReceiveNutrition(long);
349   void ReceiveOmmelUrine(long);
350   void ReceiveOmmelBlood(long);
351   void ReceivePepsi(long);
352   void ReceiveSchoolFood(long);
353   void Regenerate();
SetAP(long What)354   void SetAP(long What) { AP = What; }
355   void SetNP(long);
356   void Vomit(v2, int, truth = true);
357   virtual void Be();
358   truth Polymorph(character*, int);
359   void BeKicked(character*, item*, bodypart*, v2, double, double, int, int, truth, truth);
360   void FallTo(character*, v2);
361   truth CheckCannibalism(cmaterial*) const;
ActivateTemporaryState(long What)362   void ActivateTemporaryState(long What) { TemporaryState |= What; }
363   void DeActivateTemporaryState(long What);
ActivateEquipmentState(long What)364   void ActivateEquipmentState(long What) { EquipmentState |= What; }
DeActivateEquipmentState(long What)365   void DeActivateEquipmentState(long What) { EquipmentState &= ~What; }
366   truth TemporaryStateIsActivated(long What) const;
EquipmentStateIsActivated(long What)367   truth EquipmentStateIsActivated(long What) const { return EquipmentState & What; }
368   truth StateIsActivated(long What) const;
369   truth LoseConsciousness(int, truth = false);
370   void SetTemporaryStateCounter(long, int);
371   void DeActivateVoluntaryAction(cfestring& = CONST_S(""));
372   void ActionAutoTermination();
GetTeam()373   team* GetTeam() const { return Team; }
374   void SetTeam(team*);
375   void ChangeTeam(team*);
376   virtual int GetMoveEase() const;
GetDodgeValue()377   double GetDodgeValue() const { return DodgeValue; }
GetMoney()378   long GetMoney() const { return Money; }
SetMoney(long What)379   void SetMoney(long What) { Money = What; }
EditMoney(long What)380   void EditMoney(long What) { Money += What; }
381   truth Displace(character*, truth = false);
382   truth CheckStarvationDeath(cfestring&);
383   void ShowNewPosInfo() const;
384   void Hostility(character*);
385   stack* GetGiftStack() const;
386   truth MoveRandomlyInRoom();
387   std::list<character*>::iterator GetTeamIterator();
388   void SetTeamIterator(std::list<character*>::iterator);
389   void ReceiveKoboldFlesh(long);
390   truth ChangeRandomAttribute(int);
391   int RandomizeReply(long&, int);
392   virtual void CreateInitialEquipment(int);
393   void DisplayInfo(festring&);
SpecialEnemySightedReaction(character *)394   virtual truth SpecialEnemySightedReaction(character*) { return false; }
395   void TestWalkability();
396   void EditAP(long);
397   void EditNP(long);
398   void SetSize(int);
399   virtual int GetSize() const;
GetTorso()400   torso* GetTorso() const { return static_cast<torso*>(*BodyPartSlot[TORSO_INDEX]); }
GetHumanoidTorso()401   humanoidtorso* GetHumanoidTorso() const { return static_cast<humanoidtorso*>(*BodyPartSlot[TORSO_INDEX]); }
SetTorso(torso * What)402   void SetTorso(torso* What) { SetBodyPart(TORSO_INDEX, What); }
GetBodyPart(int I)403   bodypart* GetBodyPart(int I) const { return static_cast<bodypart*>(*BodyPartSlot[I]); }
404   void SetBodyPart(int, bodypart*);
405   material* SetMainMaterial(material*, int = 0);  // NOTE: Do not reuse the old materials!
406   void ChangeMainMaterial(material*, int = 0);
407   material* SetSecondaryMaterial(material*, int = 0);
408   void RestoreHP();
409   void RestoreLivingHP();
RestoreStamina()410   void RestoreStamina() { Stamina = MaxStamina; }
411   virtual truth ReceiveDamage(character*, int, int, int = ALL, int = 8, truth = false, truth = false, truth = false, truth = true);
412   virtual int ReceiveBodyPartDamage(character*, int, int, int, int = 8, truth = false, truth = false, truth = true, truth = false);
BodyPartIsVital(int)413   virtual truth BodyPartIsVital(int) const { return true; }
414   void RestoreBodyParts();
GetAssignedName()415   cfestring& GetAssignedName() const { return AssignedName; }
SetAssignedName(cfestring & What)416   void SetAssignedName(cfestring& What) { AssignedName = What; }
417   festring GetDescription(int) const;
418   festring GetPersonalPronoun(truth = true) const;
419   festring GetPossessivePronoun(truth = true) const;
420   festring GetObjectPronoun(truth = true) const;
421   festring GetWorldShapeDescription() const;
422   virtual truth BodyPartCanBeSevered(int) const;
423   virtual void AddName(festring&, int) const;
424   void ReceiveHeal(long);
GetMainWielded()425   virtual item* GetMainWielded() const { return 0; }
GetSecondaryWielded()426   virtual item* GetSecondaryWielded() const { return 0; }
427   int GetHungerState() const;
428   truth ConsumeItem(item*, cfestring&, truth = false);
429   virtual truth CanConsume(material*) const;
GetAction()430   action* GetAction() const { return Action; }
SetAction(action * What)431   void SetAction(action* What) { Action = What; }
SwitchToCraft(recipedata rpd)432   virtual bool SwitchToCraft(recipedata rpd) { return false; }
SwitchToDig(item *,v2)433   virtual void SwitchToDig(item*, v2) { }
SetRightWielded(item *)434   virtual void SetRightWielded(item*) { }
SetLeftWielded(item *)435   virtual void SetLeftWielded(item*) { }
436   truth IsAboveUsefulItem();
437   void GoOn(go*, truth = false);
438   virtual truth CheckKick() const;
OpenMultiplier()439   virtual int OpenMultiplier() const { return 2; }
CloseMultiplier()440   virtual int CloseMultiplier() const { return 2; }
441   virtual truth CheckThrow() const;
CheckOffer()442   virtual truth CheckOffer() const { return true; }
443   int GetTemporaryStateCounter(long) const;
444   void EditTemporaryStateCounter(long, int);
445   static truth AllowDamageTypeBloodSpill(int);
446   int GetResistance(int) const;
GetGlobalResistance(int Type)447   virtual int GetGlobalResistance(int Type) const { return GetResistance(Type); }
448   virtual cchar* GetEquipmentName(int) const;
GetBodyPartOfEquipment(int)449   virtual bodypart* GetBodyPartOfEquipment(int) const { return 0; }
GetEquipment(int)450   virtual item* GetEquipment(int) const { return 0; }
GetEquipments()451   virtual int GetEquipments() const { return 0; }
EquipmentSorter(int)452   virtual sorter EquipmentSorter(int) const { return 0; }
SetEquipment(int,item *)453   virtual void SetEquipment(int, item*) { }
454   truth IsESPBlockedByEquipment () const;
455   void AddHealingLiquidConsumeEndMessage() const;
456   void AddSchoolFoodConsumeEndMessage() const;
457   void AddSchoolFoodHitMessage() const;
458   void AddOmmelConsumeEndMessage() const;
459   void AddPepsiConsumeEndMessage() const;
460   void AddCocaColaConsumeEndMessage() const;
461   void AddFrogFleshConsumeEndMessage() const;
462   void AddKoboldFleshConsumeEndMessage() const;
463   void AddKoboldFleshHitMessage() const;
464   void AddBoneConsumeEndMessage() const;
465   void AddBlackUnicornConsumeEndMessage() const;
466   void AddGrayUnicornConsumeEndMessage() const;
467   void AddWhiteUnicornConsumeEndMessage() const;
468   void AddOmmelBoneConsumeEndMessage() const;
469   void AddLiquidHorrorConsumeEndMessage() const;
470   void PrintInfo() const;
471   virtual item* SevereBodyPart(int, truth = false, stack* = 0);
472   virtual void IgniteBodyPart(int, int);
473   virtual truth TryToRiseFromTheDead();
474   virtual truth RaiseTheDead(character*);
475   bodypart* CreateBodyPart(int, int = 0);
EquipmentIsAllowed(int)476   virtual truth EquipmentIsAllowed(int) const { return true; }
477   truth CanUseEquipment(int) const;
478   void MemorizeEquipedItems();
GetDataBase()479   const database* GetDataBase() const { return DataBase; }
SetParameters(int)480   void SetParameters(int) { }
481   virtual double GetNaturalExperience(int) const;
482   DATA_BASE_VALUE(const prototype*, ProtoType);
483   DATA_BASE_VALUE(int, Config);
484   DATA_BASE_VALUE(int, DefaultEndurance);
485   DATA_BASE_VALUE(int, DefaultPerception);
486   DATA_BASE_VALUE(int, DefaultIntelligence);
487   DATA_BASE_VALUE(int, DefaultWisdom);
488   DATA_BASE_VALUE(int, DefaultWillPower);
489   DATA_BASE_VALUE(int, DefaultCharisma);
490   DATA_BASE_VALUE(int, DefaultMana);
491   DATA_BASE_VALUE(int, DefaultArmStrength);
492   DATA_BASE_VALUE(int, DefaultLegStrength);
493   DATA_BASE_VALUE(int, DefaultDexterity);
494   DATA_BASE_VALUE(int, DefaultAgility);
495   DATA_BASE_VALUE(long, DefaultMoney);
496   DATA_BASE_VALUE(int, TotalSize);
497   DATA_BASE_TRUTH(CanRead);
498   DATA_BASE_VALUE(int, Sex);
499   DATA_BASE_TRUTH(CanBeGenerated);
500   DATA_BASE_VALUE(int, CriticalModifier);
501   DATA_BASE_TRUTH(CanOpen);
502   DATA_BASE_VALUE(int, EnergyResistance);
503   DATA_BASE_VALUE(int, FireResistance);
504   DATA_BASE_VALUE(int, PoisonResistance);
505   DATA_BASE_VALUE(int, ElectricityResistance);
506   DATA_BASE_VALUE(int, AcidResistance);
507   DATA_BASE_VALUE(int, SoundResistance);
508   DATA_BASE_VALUE(int, ConsumeFlags);
509   DATA_BASE_VALUE(long, TotalVolume);
510   virtual DATA_BASE_VALUE(v2, HeadBitmapPos);
511   virtual DATA_BASE_VALUE(v2, TorsoBitmapPos);
512   virtual DATA_BASE_VALUE(v2, ArmBitmapPos);
513   virtual DATA_BASE_VALUE(v2, LegBitmapPos);
514   virtual DATA_BASE_VALUE(v2, RightArmBitmapPos);
515   virtual DATA_BASE_VALUE(v2, LeftArmBitmapPos);
516   virtual DATA_BASE_VALUE(v2, RightLegBitmapPos);
517   virtual DATA_BASE_VALUE(v2, LeftLegBitmapPos);
518   virtual DATA_BASE_VALUE(v2, GroinBitmapPos);
519   virtual DATA_BASE_VALUE(col16, ClothColor);
520   virtual DATA_BASE_VALUE(col16, SkinColor);
521   virtual DATA_BASE_VALUE(col16, CapColor);
522   virtual DATA_BASE_VALUE(col16, HairColor);
523   virtual DATA_BASE_VALUE(col16, EyeColor);
524   virtual DATA_BASE_VALUE(col16, TorsoMainColor);
525   virtual DATA_BASE_VALUE(col16, BeltColor);
526   virtual DATA_BASE_VALUE(col16, BootColor);
527   virtual DATA_BASE_VALUE(col16, TorsoSpecialColor);
528   virtual DATA_BASE_VALUE(col16, ArmMainColor);
529   virtual DATA_BASE_VALUE(col16, GauntletColor);
530   virtual DATA_BASE_VALUE(col16, ArmSpecialColor);
531   virtual DATA_BASE_VALUE(col16, LegMainColor);
532   virtual DATA_BASE_VALUE(col16, LegSpecialColor);
533   virtual DATA_BASE_TRUTH(IsNameable);
534   virtual DATA_BASE_VALUE(col24, BaseEmitation); // devirtualize ASAP
535   DATA_BASE_TRUTH(UsesLongArticle);
536   DATA_BASE_VALUE(cfestring&, Adjective);
537   DATA_BASE_TRUTH(UsesLongAdjectiveArticle);
538   DATA_BASE_VALUE(cfestring&, NameSingular);
539   DATA_BASE_VALUE(cfestring&, NamePlural);
540   DATA_BASE_VALUE(cfestring&, PostFix);
541   DATA_BASE_VALUE(int, ArticleMode);
542   DATA_BASE_TRUTH(CanZap);
543   virtual DATA_BASE_TRUTH(IsPolymorphable);
544   DATA_BASE_VALUE(int, BaseUnarmedStrength);
545   DATA_BASE_VALUE(int, BaseBiteStrength);
546   DATA_BASE_VALUE(int, BaseKickStrength);
547   DATA_BASE_VALUE(int, BonusBiteStrength);
548   DATA_BASE_VALUE(int, AttackStyle);
549   DATA_BASE_TRUTH(CanUseEquipment);
550   DATA_BASE_TRUTH(CanKick);
551   DATA_BASE_TRUTH(CanTalk);
552   DATA_BASE_TRUTH(CanBeWished);
553   DATA_BASE_VALUE(long, ClassStates);
554   DATA_BASE_VALUE(const fearray<festring>&, Alias);
555   DATA_BASE_TRUTH(CreateGolemMaterialConfigurations);
556   DATA_BASE_VALUE(const fearray<long>&, KnownCWeaponSkills);
557   DATA_BASE_VALUE(const fearray<long>&, CWeaponSkillHits);
558   DATA_BASE_VALUE(int, RightSWeaponSkillHits);
559   DATA_BASE_VALUE(int, LeftSWeaponSkillHits);
560   DATA_BASE_VALUE(int, PanicLevel);
561   DATA_BASE_TRUTH(CanBeCloned);
562   DATA_BASE_VALUE(cfestring&, DefaultName);
563   DATA_BASE_VALUE(const fearray<festring>&, FriendlyReplies);
564   DATA_BASE_VALUE(const fearray<festring>&, HostileReplies);
565   DATA_BASE_VALUE(int, FleshMaterial);
566   virtual DATA_BASE_TRUTH(HasALeg);
567   virtual DATA_BASE_VALUE(cfestring&, DeathMessage);
568   DATA_BASE_VALUE(int, HPRequirementForGeneration);
569   DATA_BASE_TRUTH(IsExtraCoward);
570   DATA_BASE_TRUTH(SpillsBlood);
571   DATA_BASE_TRUTH(HasEyes);
572   virtual DATA_BASE_TRUTH(HasHead);
573   DATA_BASE_TRUTH(CanThrow);
574   DATA_BASE_TRUTH(UsesNutrition);
575   DATA_BASE_VALUE(int, AttackWisdomLimit);
576   DATA_BASE_TRUTH(IsUnique);
577   DATA_BASE_VALUE(int, AttachedGod);
578   DATA_BASE_TRUTH(BodyPartsDisappearWhenSevered);
579   DATA_BASE_VALUE(int, Frequency);
580   DATA_BASE_TRUTH(CanBeConfused);
581   DATA_BASE_TRUTH(CanApply);
582   DATA_BASE_VALUE(v2, WieldedPosition);
583   virtual DATA_BASE_VALUE(int, NaturalSparkleFlags);
584   DATA_BASE_TRUTH(IgnoreDanger);
585   DATA_BASE_TRUTH(BiteCapturesBodyPart);
586   DATA_BASE_TRUTH(IsPlant);
587   DATA_BASE_TRUTH(DestroysWalls);
588   DATA_BASE_TRUTH(IsRooted);
589   DATA_BASE_VALUE(int, BloodMaterial);
590   DATA_BASE_VALUE(int, VomitMaterial);
591   DATA_BASE_TRUTH(AutomaticallySeen);
592   DATA_BASE_VALUE(ulong, DefaultCommandFlags);
593   DATA_BASE_TRUTH(WillCarryItems);
594   DATA_BASE_VALUE(int, SweatMaterial);
595   DATA_BASE_TRUTH(Sweats);
596   DATA_BASE_TRUTH(IsImmuneToItemTeleport);
597   DATA_BASE_TRUTH(AlwaysUseMaterialAttributes);
598   DATA_BASE_TRUTH(IsEnormous);
599   DATA_BASE_VALUE(const fearray<festring>&, ScienceTalkAdjectiveAttribute);
600   DATA_BASE_VALUE(const fearray<festring>&, ScienceTalkSubstantiveAttribute);
601   DATA_BASE_VALUE(const fearray<festring>&, ScienceTalkPrefix);
602   DATA_BASE_VALUE(const fearray<festring>&, ScienceTalkName);
603   DATA_BASE_VALUE(int, ScienceTalkPossibility);
604   DATA_BASE_VALUE(int, ScienceTalkIntelligenceModifier);
605   DATA_BASE_VALUE(int, ScienceTalkWisdomModifier);
606   DATA_BASE_VALUE(int, ScienceTalkCharismaModifier);
607   DATA_BASE_VALUE(int, ScienceTalkIntelligenceRequirement);
608   DATA_BASE_VALUE(int, ScienceTalkWisdomRequirement);
609   DATA_BASE_VALUE(int, ScienceTalkCharismaRequirement);
610   DATA_BASE_TRUTH(IsExtraFragile);
611   DATA_BASE_TRUTH(IsImmuneToStickiness);
612   DATA_BASE_VALUE(festring, ForceVomitMessage);
613   DATA_BASE_TRUTH(CanChoke);
614   DATA_BASE_VALUE(int, DisplacePriority);
615   DATA_BASE_VALUE(cfestring&, RunDescriptionLineOne);
616   DATA_BASE_VALUE(cfestring&, RunDescriptionLineTwo);
617   DATA_BASE_TRUTH(ForceCustomStandVerb);
618   DATA_BASE_TRUTH(VomittingIsUnhealthy);
619   DATA_BASE_TRUTH(AllowPlayerToChangeEquipment);
620   DATA_BASE_VALUE(int, TamingDifficulty);
621   DATA_BASE_TRUTH(IsMasochist);
622   DATA_BASE_TRUTH(IsSadist);
623   DATA_BASE_TRUTH(IsCatacombCreature);
624   DATA_BASE_TRUTH(CreateUndeadConfigurations);
625   DATA_BASE_TRUTH(UndeadVersions);
626   DATA_BASE_VALUE(int, UndeadAttributeModifier);
627   DATA_BASE_VALUE(int, UndeadVolumeModifier);
628   DATA_BASE_TRUTH(UndeadCopyMaterials);
629   DATA_BASE_TRUTH(GhostCopyMaterials);
630   DATA_BASE_TRUTH(CanBeGeneratedOnlyInTheCatacombs);
631   DATA_BASE_TRUTH(IsAlcoholic);
632   DATA_BASE_TRUTH(IsUndead);
633   DATA_BASE_TRUTH(IsImmuneToWhipOfThievery);
634   DATA_BASE_VALUE(const fearray<int>&, AllowedDungeons);
GetType()635   int GetType() const { return GetProtoType()->GetIndex(); }
636   void TeleportRandomly(truth = false);
637   void DoDetecting();
638   truth TeleportNear(character*);
InitSpecialAttributes()639   virtual void InitSpecialAttributes() { }
640   virtual void Kick(lsquare*, int, truth = false) = 0;
641   virtual int GetAttribute(int, truth = true) const;
642   virtual truth EditAttribute(int, int);
643   virtual void EditExperience(int, double, double);
644   truth RawEditAttribute(double&, int) const;
645   void DrawPanel(truth) const;
646   virtual int DrawStats(truth) const = 0;
647   virtual int GetCarryingStrength() const = 0;
648   static truth DamageTypeAffectsInventory(int);
649   virtual int GetRandomStepperBodyPart() const;
GetMotherEntity()650   entity* GetMotherEntity() const { return MotherEntity; }
SetMotherEntity(entity * What)651   void SetMotherEntity(entity* What) { MotherEntity = What; }
652   virtual int CheckForBlock(character*, item*, double, int, int, int);
653   int CheckForBlockWithArm(character*, item*, arm*, double, int, int, int);
654   void AddBlockMessage(ccharacter*, citem*, cfestring&, truth) const;
GetPolymorphBackup()655   character* GetPolymorphBackup() const { return PolymorphBackup; }
SetPolymorphBackup(character * What)656   void SetPolymorphBackup(character* What) { PolymorphBackup = What; }
GetCWeaponSkill(int I)657   cweaponskill* GetCWeaponSkill(int I) const { return &CWeaponSkill[I]; }
AddSpecialSkillInfo(felist &)658   virtual truth AddSpecialSkillInfo(felist&) const { return false; }
659   virtual truth CheckBalance(double);
660   long GetStateAPGain(long) const;
661   virtual long GetMoveAPRequirement(int) const;
662   virtual void SignalEquipmentAdd(int);
663   virtual void SignalEquipmentRemoval(int, citem*);
664   void BeginTemporaryState(long, int);
665   void GainIntrinsic(long);
666   void HandleStates();
667   void PrintBeginPolymorphControlMessage() const;
668   void PrintEndPolymorphControlMessage() const;
669   void PrintBeginLifeSaveMessage() const;
670   void PrintEndLifeSaveMessage() const;
671   void PrintBeginLycanthropyMessage() const;
672   void PrintEndLycanthropyMessage() const;
673   void PrintBeginHasteMessage() const;
674   void PrintEndHasteMessage() const;
675   void PrintBeginSlowMessage() const;
676   void PrintEndSlowMessage() const;
677   void PrintBeginSearchingMessage() const;
678   void PrintEndSearchingMessage() const;
679   void PrintBeginHiccupsMessage() const;
680   void PrintEndHiccupsMessage() const;
681   void PrintBeginVampirismMessage() const;
682   void PrintEndVampirismMessage() const;
683   void PrintBeginFearlessMessage() const;
684   void PrintEndFearlessMessage() const;
685   void PrintBeginFastingMessage() const;
686   void PrintEndFastingMessage() const;
687   void EndPolymorph();
688   character* ForceEndPolymorph();
689   void LycanthropyHandler();
690   void SearchingHandler();
691   void SaveLife();
692   void BeginInvisibility();
693   void BeginInfraVision();
694   void BeginESP();
695   void EndInvisibility();
696   void EndInfraVision();
697   void EndESP();
698   void HiccupsHandler();
699   void BeginEthereality();
700   void EndEthereality();
701   void BeginSwimming();
702   void EndSwimming();
703   void VampirismHandler();
704   character* PolymorphRandomly(int, int, int);
EquipmentEasilyRecognized(int)705   virtual truth EquipmentEasilyRecognized(int) const { return true; }
706   void StartReading(item*, long);
707   void DexterityAction(int);
708   void IntelligenceAction(int);
SWeaponSkillTick()709   virtual void SWeaponSkillTick() { }
710   void PrintBeginInvisibilityMessage() const;
711   void PrintEndInvisibilityMessage() const;
712   void PrintBeginInfraVisionMessage() const;
713   void PrintEndInfraVisionMessage() const;
714   void PrintBeginESPMessage() const;
715   void PrintEndESPMessage() const;
716   void PrintBeginEtherealityMessage() const;
717   void PrintEndEtherealityMessage() const;
718   void PrintBeginSwimmingMessage() const;
719   void PrintEndSwimmingMessage() const;
720   truth CanBeSeenByPlayer(truth = false, truth = false) const;
721   truth CanBeSeenBy(ccharacter*, truth = false, truth = false) const;
722   void AttachBodyPart(bodypart*);
723   truth HasAllBodyParts() const;
724   truth HasFire() const;
725   truth IsBurning() const;
726   bodypart* FindRandomOwnBodyPart(truth) const;
727   bodypart* GenerateRandomBodyPart();
728   void PrintBeginPoisonedMessage() const;
729   void PrintEndPoisonedMessage() const;
730   truth IsWarm() const;
731   truth IsWarmBlooded() const;
732   void CalculateEquipmentState();
733   void Draw(blitdata&) const;
734   virtual void DrawBodyParts(blitdata&) const;
735   god* GetMasterGod() const;
736   void PoisonedHandler();
737   void PrintBeginTeleportMessage() const;
738   void PrintEndTeleportMessage() const;
739   void TeleportHandler();
740   void PrintBeginDetectMessage() const;
741   void PrintEndDetectMessage() const;
742   void DetectHandler();
743   void PrintEndTeleportControlMessage() const;
744   void PrintBeginTeleportControlMessage() const;
745   void PolymorphHandler();
746   void PrintEndPolymorphMessage() const;
747   void PrintBeginPolymorphMessage() const;
748   void PrintBeginPolymorphLockMessage() const;
749   void PrintEndPolymorphLockMessage() const;
750   void PolymorphLockHandler();
751   void PrintBeginRegenerationMessage() const;
752   void PrintEndRegenerationMessage() const;
753   void PrintBeginDiseaseImmunityMessage() const;
754   void PrintEndDiseaseImmunityMessage() const;
755   void PrintBeginTeleportLockMessage() const;
756   void PrintEndTeleportLockMessage() const;
757   virtual void DisplayStethoscopeInfo(character*) const;
758   virtual truth CanUseStethoscope(truth) const;
759   virtual truth IsUsingArms() const;
760   virtual truth IsUsingLegs() const;
761   virtual truth IsUsingHead() const;
GetDungeon()762   dungeon* GetDungeon() const { return static_cast<level*>(GetSquareUnder()->GetArea())->GetDungeon(); }
GetLevel()763   level* GetLevel() const { return static_cast<level*>(GetSquareUnder()->GetArea()); }
GetArea()764   area* GetArea() const { return GetSquareUnder()->GetArea(); }
765   virtual square* GetNeighbourSquare(int) const;
766   virtual lsquare* GetNeighbourLSquare(int) const;
767   virtual wsquare* GetNeighbourWSquare(int) const;
768   stack* GetStackUnder(int I = 0) const { return static_cast<lsquare*>(GetSquareUnder(I))->GetStack(); }
769   stack* GetStackUnderSafely() const;
GetNearSquare(v2 Pos)770   square* GetNearSquare(v2 Pos) const { return GetSquareUnder()->GetArea()->GetSquare(Pos); }
GetNearSquare(int x,int y)771   square* GetNearSquare(int x, int y) const { return GetSquareUnder()->GetArea()->GetSquare(x, y); }
GetNearLSquare(v2 Pos)772   lsquare* GetNearLSquare(v2 Pos) const { return static_cast<lsquare*>(GetSquareUnder()->GetArea()->GetSquare(Pos)); }
GetNearLSquare(int x,int y)773   lsquare* GetNearLSquare(int x, int y) const { return static_cast<lsquare*>(GetSquareUnder()->GetArea()->GetSquare(x, y)); }
774   wsquare* GetNearWSquare(v2) const;
775   wsquare* GetNearWSquare(int, int) const;
776   v2 GetPos(int I = 0) const { return GetSquareUnder(I)->GetPos(); }
777   v2 GetPosSafely() const;
778   square* GetSquareUnder(int I = 0) const { return !MotherEntity ? SquareUnder[I] : MotherEntity->GetSquareUnderEntity(I); }
779   square* GetSquareUnderSafely() const;
780   virtual square* GetSquareUnderEntity(int I = 0) const { return GetSquareUnder(I); }
781   lsquare* GetLSquareUnder(int I = 0) const { return static_cast<lsquare*>(GetSquareUnder(I)); }
782   int GetRandomNonVitalBodyPart() const;
783   void TeleportSomePartsAway(int);
784   virtual void SignalVolumeAndWeightChange();
SignalBodyPartVolumeAndWeightChange()785   virtual void SignalBodyPartVolumeAndWeightChange() { }
786   void CalculateVolumeAndWeight();
GetVolume()787   long GetVolume() const { return Volume; }
GetBodyVolume()788   long GetBodyVolume() const { return BodyVolume; }
GetWeight()789   long GetWeight() const { return Weight; }
GetCarriedWeight()790   long GetCarriedWeight() const { return CarriedWeight; }
791   virtual void SignalEmitationIncrease(col24);
792   virtual void SignalEmitationDecrease(col24);
793   void CalculateEmitation();
794   void CalculateAll();
795   void CalculateHP();
796   void CalculateMaxHP();
GetHP()797   int GetHP() const { return HP; }
GetMaxHP()798   int GetMaxHP() const { return MaxHP; }
799   int GetTotalCharacterWeight() const;
800   void CalculateBodyPartMaxHPs(ulong = MAY_CHANGE_HPS|CHECK_USABILITY);
IsInitializing()801   truth IsInitializing() const { return Flags & C_INITIALIZING; }
IsInNoMsgMode()802   truth IsInNoMsgMode() const { return Flags & C_IN_NO_MSG_MODE; }
803   truth ActivateRandomState(int, int, long = 0);
804   long GetRandomState(int) const;
805   truth GainRandomIntrinsic(int);
806   virtual void CalculateBattleInfo() = 0;
807   void CalculateBurdenState();
808   virtual void CalculateDodgeValue();
CalculateBodyParts()809   virtual void CalculateBodyParts() { BodyParts = 1; }
810   virtual void CalculateAllowedWeaponSkillCategories();
GetBodyParts()811   int GetBodyParts() const { return BodyParts; }
GetAllowedWeaponSkillCategories()812   int GetAllowedWeaponSkillCategories() const { return AllowedWeaponSkillCategories; }
813   double GetRelativeDanger(ccharacter*, truth = false) const;
814   double GetTimeToDie(ccharacter*, int, double, truth, truth) const;
815   virtual double GetTimeToKill(ccharacter*, truth) const = 0;
AddSpecialEquipmentInfo(festring &,int)816   virtual void AddSpecialEquipmentInfo(festring&, int) const { }
817   virtual festring GetBodyPartName(int, truth = false) const;
818   item* SearchForItem(ulong) const;
819   truth SearchForItem(citem*) const;
820   item* SearchForItem(const sweaponskill*) const;
821   truth ContentsCanBeSeenBy(ccharacter*) const;
822   festring GetBeVerb() const;
CreateBlockPossibilityVector(blockvector &,double)823   virtual void CreateBlockPossibilityVector(blockvector&, double) const { }
SpecialUnarmedEffect(character *,v2,int,int,truth)824   virtual truth SpecialUnarmedEffect(character*, v2, int, int, truth) { return false; }
SpecialKickEffect(character *,v2,int,int,truth)825   virtual truth SpecialKickEffect(character*, v2, int, int, truth) { return false; }
SpecialBiteEffect(character *,v2,int,int,truth,truth,int)826   virtual truth SpecialBiteEffect(character*, v2, int, int, truth, truth, int) { return false; }
827   truth HitEffect(character*, item*, v2, int, int, int, truth, truth, int);
828   void WeaponSkillHit(item*, int, int);
829   character* Duplicate(ulong = 0);
830   room* GetRoom(int I = 0) const { return GetLSquareUnder(I)->GetRoom(); }
831   truth TryToEquip(item*, truth onlyIfEmpty=false, int onlyAt=-1);
832   truth TryToConsume(item*);
833   void UpdateESPLOS() const;
834   int GetCWeaponSkillLevel(citem*) const;
GetSWeaponSkillLevel(citem *)835   virtual int GetSWeaponSkillLevel(citem*) const { return 0; }
836   void PrintBeginPanicMessage() const;
837   void PrintEndPanicMessage() const;
838   void CheckPanic(int);
839   character* DuplicateToNearestSquare(character*, ulong = 0);
840   void SignalSpoil();
841   void SignalSpoilLevelChange();
842   void SignalBurnLevelChange();
843   virtual truth UseMaterialAttributes() const = 0;
IsPolymorphed()844   truth IsPolymorphed() const { return Flags & C_POLYMORPHED; }
845   truth IsInBadCondition() const;
IsInBadCondition(int HP)846   truth IsInBadCondition(int HP) const { return HP * 3 < MaxHP; }
847   int GetCondition() const;
848   void UpdatePictures();
849   truth CanHeal() const;
850   void SetGoingTo(v2);
851   int GetRelation(ccharacter*) const;
852   truth CalculateAttributeBonuses();
853   void ApplyEquipmentAttributeBonuses(item*);
854   void ReceiveAntidote(long);
855   void AddAntidoteConsumeEndMessage() const;
856   truth IsDead() const;
857   void AddOriginalBodyPartID(int, ulong);
858   void AddToInventory(const fearray<contentscript<item>>&, int);
859   truth HasHadBodyPart(citem*) const;
860   void ProcessAndAddMessage(festring) const;
861   virtual truth CheckZap();
862   void SetEndurance(int);
863   void SetPerception(int);
864   void SetIntelligence(int);
865   void SetWisdom(int);
866   void SetWillPower(int);
867   void SetCharisma(int);
868   void SetMana(int);
869   void DamageAllItems(character*, int, int);
870   truth Equips(citem*) const;
871   void PrintBeginConfuseMessage() const;
872   void PrintEndConfuseMessage() const;
873   v2 ApplyStateModification(v2) const;
874   void AddConfuseHitMessage() const;
875   item* SelectFromPossessions(cfestring&, sorter = 0);
876   truth SelectFromPossessions(itemvector&, cfestring&, int, sorter = 0);
877   truth EquipsSomething(sorter = 0);
878   truth CheckTalk();
CanCreateBodyPart(int)879   virtual truth CanCreateBodyPart(int) const { return true; }
HandleCharacterBlockingTheWay(character *,v2,int)880   virtual truth HandleCharacterBlockingTheWay(character*, v2, int) { return false; }
881   virtual festring& ProcessMessage(festring&) const;
IsHumanoid()882   virtual truth IsHumanoid() const { return false; }
IsHuman()883   virtual truth IsHuman() const { return false; }
884   truth IsOnGround() const;
CheckIfEquipmentIsNotUsable(int)885   virtual truth CheckIfEquipmentIsNotUsable(int) const { return false; }
886   virtual truth MoveTowardsHomePos();
SetWayPoints(const fearray<packv2> &)887   virtual void SetWayPoints(const fearray<packv2>&) { }
888   truth TryToChangeEquipment(stack*, stack*, int);
889   void PrintBeginParasitizedMessage() const;
890   void PrintEndParasitizedMessage() const;
891   void ParasitizedHandler();
892   void PrintBeginMindwormedMessage() const;
893   void PrintEndMindwormedMessage() const;
894   void MindwormedHandler();
895   truth CanFollow() const;
896   truth LeftOversAreUnique() const;
897   virtual festring GetKillName() const;
898   festring GetPanelName() const;
899   virtual void AddSpecialStethoscopeInfo(felist&) const = 0;
GetPairEquipment(int)900   virtual item* GetPairEquipment(int) const { return 0; }
901   bodypart* HealHitPoint();
902   void HealBurntBodyParts(long);
903   void CreateHomeData();
904   room* GetHomeRoom() const;
905   truth HomeDataIsValid() const;
906   void SetHomePos(v2);
907   void RemoveHomeData();
GetID()908   ulong GetID() const { return ID; }
909   void _BugWorkaround_PlayerDup(ulong key);
910   void AddESPConsumeMessage() const;
911   const std::list<ulong>& GetOriginalBodyPartID(int) const;
912   void GetHitByExplosion(const explosion*, int);
CanBePoisoned()913   truth CanBePoisoned() const { return TorsoIsAlive(); }
CanBeParasitized()914   truth CanBeParasitized() const { return TorsoIsAlive(); }
915   void SortAllItems(const sortdata&);
916   character* GetRandomNeighbourEnemy() const;
917   void Search(int);
918   character* GetRandomNeighbour(int = (HOSTILE|UNCARING|FRIEND)) const;
919   virtual truth IsRetreating() const;
IsMushroom()920   virtual truth IsMushroom() const { return false; }
IsMagicDrinker()921   virtual truth IsMagicDrinker() const { return false; }
DrinkMagic(const beamdata &)922   virtual truth DrinkMagic(const beamdata&) { return IsMagicDrinker(); }
923   void ResetStates();
Behead()924   virtual head* Behead() { return 0; }
925   void PrintBeginGasImmunityMessage() const;
926   void PrintEndGasImmunityMessage() const;
927   void ShowAdventureInfo() const;
928   void ShowAdventureInfoAlt() const;
BoundToUse(citem *,int)929   virtual truth BoundToUse(citem*, int) const { return false; }
IsBananaGrower()930   virtual truth IsBananaGrower() const { return false; }
931   virtual int GetRandomApplyBodyPart() const;
GetTalent()932   virtual int GetTalent() const { return 0; }
GetWeakness()933   virtual int GetWeakness() const { return 0; }
934 #ifdef WIZARD
935   virtual void AddAttributeInfo(festring&) const;
936   virtual void AddAttackInfo(felist&) const = 0;
937   virtual void AddDefenceInfo(felist&) const;
938   virtual void DetachBodyPart();
939   virtual void SetFireToBodyPart();
940 #endif
941   void ReceiveHolyBanana(long);
942   void AddHolyBananaConsumeEndMessage() const;
943   virtual truth PreProcessForBone();
944   truth PostProcessForBone(double&, int&);
945   truth PostProcessForBone();
946   virtual void FinalProcessForBone();
947   virtual truth EditAllAttributes(int);
948   virtual void SetSoulID(ulong);
SuckSoul(character *)949   virtual truth SuckSoul(character*) { return false; }
950   virtual truth MustBeRemovedFromBone() const;
TorsoIsAlive()951   truth TorsoIsAlive() const { return GetTorso()->IsAlive(); }
PictureUpdatesAreForbidden()952   truth PictureUpdatesAreForbidden() const { return Flags & C_PICTURE_UPDATES_FORBIDDEN; }
GetUsableArms()953   virtual int GetUsableArms() const { return 0; }
954   truth IsPet() const;
955   virtual void PutTo(v2);
956   void PutTo(lsquare*);
957   void PutNear(v2);
958   void PutToOrNear(v2);
959   virtual void Remove();
IsSmall()960   truth IsSmall() const { return SquaresUnder == 1; }
961   truth IsOver(v2) const;
962   truth IsOver(citem*) const;
963   truth SquareUnderCanBeSeenByPlayer(truth) const;
964   truth SquareUnderCanBeSeenBy(ccharacter*, truth) const;
965   int GetDistanceSquareFrom(ccharacter*) const;
966   virtual truth CanTheoreticallyMoveOn(const lsquare*) const;
967   virtual truth CanMoveOn(const lsquare*) const;
968   virtual truth CanMoveOn(const square*) const;
969   truth CanMoveOn(const olterrain*) const;
970   truth CanMoveOn(const oterrain*) const;
IsMainPos(v2 What)971   truth IsMainPos(v2 What) const { return GetPos() == What; }
CalculateSquaresUnder()972   virtual void CalculateSquaresUnder() { SquaresUnder = 1; }
GetSquaresUnder()973   int GetSquaresUnder() const { return SquaresUnder; }
GetSquareIndex(v2)974   virtual int GetSquareIndex(v2) const { return 0; }
GetNeighbourSquares()975   virtual int GetNeighbourSquares() const { return 8; }
GetExtendedNeighbourSquares()976   virtual int GetExtendedNeighbourSquares() const { return 9; }
977   virtual int CalculateNewSquaresUnder(lsquare**, v2) const;
978   virtual truth IsFreeForMe(square*) const;
979   void SendNewDrawRequest() const;
GetNaturalNeighbourSquare(int I)980   square* GetNaturalNeighbourSquare(int I) const { return character::GetNeighbourSquare(I); }
GetNaturalNeighbourLSquare(int I)981   lsquare* GetNaturalNeighbourLSquare(int I) const { return character::GetNeighbourLSquare(I); }
982   void SignalStepFrom(lsquare**);
SpecialBodyDefenceEffect(character *,bodypart *,int)983   virtual void SpecialBodyDefenceEffect(character*, bodypart*, int) { }
984   virtual int GetSumOfAttributes() const;
IsGoingSomeWhere()985   truth IsGoingSomeWhere() const { return GoingTo != ERROR_V2; }
986   virtual truth CreateRoute();
987   void TerminateGoingTo();
IsSpy()988   virtual truth IsSpy() const { return false; }
IsKing()989   virtual truth IsKing() const { return false; }
IsLarge()990   virtual truth IsLarge() const { return false; }
991   truth CheckForFood(int);
992   truth CheckForFoodInSquare(v2);
CheckIfSatiated()993   virtual truth CheckIfSatiated() { return GetNP() > SATIATED_LEVEL; }
SignalNaturalGeneration()994   virtual void SignalNaturalGeneration() { }
IsBunny()995   virtual truth IsBunny() const { return false; }
IsFrog()996   virtual truth IsFrog() const { return false; }
IsSpider()997   virtual truth IsSpider() const { return false; }
998   void SetConfig(int, int = 0);
GetBodyPartSlot(int I)999   bodypartslot* GetBodyPartSlot(int I) { return &BodyPartSlot[I]; }
1000   virtual truth CheckConsume(cfestring&) const;
GetTameSymbolSquareIndex()1001   virtual int GetTameSymbolSquareIndex() const { return 0; }
GetFlySymbolSquareIndex()1002   virtual int GetFlySymbolSquareIndex() const { return 0; }
GetSwimmingSymbolSquareIndex()1003   virtual int GetSwimmingSymbolSquareIndex() const { return 0; }
GetUnconsciousSymbolSquareIndex()1004   virtual int GetUnconsciousSymbolSquareIndex() const { return 0; }
PlaceIsIllegal(v2 Pos,v2 Illegal)1005   virtual truth PlaceIsIllegal(v2 Pos, v2 Illegal) const { return Pos == Illegal; }
1006   liquid* CreateBlood(long) const;
1007   void SpillFluid(character*, liquid*, int = 0);
1008   virtual void StayOn(liquid*);
GetVirtualHead()1009   virtual head* GetVirtualHead() const { return 0; }
1010   truth IsAlly(ccharacter*) const;
CanVomit()1011   virtual truth CanVomit() const { return TorsoIsAlive(); }
GetLastAcidMsgMin()1012   ulong GetLastAcidMsgMin() const { return LastAcidMsgMin; }
SetLastAcidMsgMin(ulong What)1013   void SetLastAcidMsgMin(ulong What) { LastAcidMsgMin = What; }
AllowSpoil()1014   virtual truth AllowSpoil() const { return false; }
1015   void Disappear(corpse*, cchar*, truth (item::*)() const);
1016   void ResetSpoiling();
1017   void ResetBurning();
1018   void ResetLivingBurning();
1019   void RemoveBurns();
1020   void ResetThermalEnergies();
1021   virtual character* GetLeader() const;
1022   int GetMoveType() const;
IsSumoWrestler()1023   virtual truth IsSumoWrestler() const { return false; }
InitMaterials(const materialscript *,const materialscript *,truth)1024   void InitMaterials(const materialscript*, const materialscript*, truth) { }
1025   item* SearchForItem(ccharacter*, sorter) const;
CreateZombie()1026   virtual character* CreateZombie() const { return 0; }
1027   virtual festring GetZombieDescription() const;
1028   virtual festring GetGhostDescription() const;
CanAttack()1029   virtual truth CanAttack() const { return true; }
1030   truth DetectMaterial(cmaterial*) const;
1031   truth CheckIfTooScaredToHit(ccharacter*) const;
1032   void PrintBeginLevitationMessage() const;
1033   void PrintEndLevitationMessage() const;
1034   void EditDealExperience(long);
1035   int RawEditExperience(double&, double, double, double) const;
1036   virtual void LeprosyHandler();
1037   virtual void TryToInfectWithLeprosy(ccharacter*);
1038   void PrintBeginLeprosyMessage() const;
1039   void PrintEndLeprosyMessage() const;
1040   void SignalGeneration();
1041   void CheckIfSeen();
1042   void SignalSeen();
1043   truth HasBeenSeen() const;
1044   int GetPolymorphIntelligenceRequirement() const;
1045   void RemoveAllItems();
1046   int CalculateWeaponSkillHits(ccharacter*) const;
1047   void DonateEquipmentTo(character*);
1048   void ReceivePeaSoup(long);
1049   void AddPeaSoupConsumeEndMessage() const;
1050   void CalculateMaxStamina();
1051   void EditStamina(int, truth);
1052   void RegenerateStamina();
1053   void BeginPanic();
1054   void EndPanic();
1055   int GetTirednessState() const;
GetStamina()1056   int GetStamina() const { return Stamina; }
GetMaxStamina()1057   int GetMaxStamina() const { return MaxStamina; }
SetGenerationDanger(double What)1058   void SetGenerationDanger(double What) { GenerationDanger = What; }
GetGenerationDanger()1059   double GetGenerationDanger() const { return GenerationDanger; }
1060   void ReceiveBlackUnicorn(long);
1061   void ReceiveGrayUnicorn(long);
1062   void ReceiveWhiteUnicorn(long);
1063   void ReceiveSickness(long);
1064   void DecreaseStateCounter(long, int);
1065   truth IsImmuneToLeprosy() const;
1066   bodypart* SearchForOriginalBodyPart(int) const;
1067   void SetLifeExpectancy(int, int);
1068   virtual void DuplicateEquipment(character*, ulong);
1069   virtual void SignalDisappearance();
1070   virtual truth HornOfFearWorks() const;
1071   virtual truth CanHear() const;
1072   void BeginLeprosy();
1073   void EndLeprosy();
1074   void ReceiveOmmelCerumen(long);
1075   void ReceiveOmmelSweat(long);
1076   void ReceiveOmmelTears(long);
1077   void ReceiveOmmelSnot(long);
1078   void ReceiveOmmelBone(long);
1079   truth IsSameAs(ccharacter*) const;
1080   ulong GetCommandFlags() const;
SetCommandFlags(ulong What)1081   void SetCommandFlags(ulong What) { CommandFlags = What; }
1082   ulong GetPossibleCommandFlags() const;
1083   ulong GetConstantCommandFlags() const;
AllowEquipment(citem *,int)1084   virtual truth AllowEquipment(citem*, int) const { return true; }
1085   truth ChatMenu();
1086   truth ChangePetEquipment();
1087   truth TakePetItems();
1088   truth GivePetItems();
1089   truth IssuePetCommands();
1090   truth ChatIdly();
1091   truth EquipmentScreen(stack*, stack*);
1092   ulong GetManagementFlags() const;
1093   cchar* GetVerbalBurdenState() const;
1094   col16 GetVerbalBurdenStateColor() const;
1095   virtual int GetAttributeAverage() const;
1096   virtual cfestring& GetStandVerb() const;
1097   virtual truth CheckApply() const;
CanForceVomit()1098   virtual truth CanForceVomit() const { return CanVomit(); }
1099   void EndLevitation();
1100   virtual truth CanMove() const;
1101   void CalculateEnchantments();
1102   truth GetNewFormForPolymorphWithControl(character*&);
1103   liquid* CreateSweat(long) const;
1104   truth IsTemporary() const;
1105   truth TeleportRandomItem(truth);
1106   truth HasClearRouteTo(v2) const;
1107   virtual truth IsTransparent() const;
1108   void SignalPossibleTransparencyChange();
1109   int GetCursorData() const;
1110   void TryToName();
1111   double GetSituationDanger(ccharacter*, v2, v2, truth) const;
1112   virtual void ModifySituationDanger(double&) const;
1113   void LycanthropySituationDangerModifier(double&) const;
1114   void PoisonedSituationDangerModifier(double&) const;
1115   void PolymorphingSituationDangerModifier(double&) const;
1116   void PanicSituationDangerModifier(double&) const;
1117   void ConfusedSituationDangerModifier(double&) const;
1118   void ParasitizedSituationDangerModifier(double&) const;
1119   void LeprosySituationDangerModifier(double&) const;
1120   void HiccupsSituationDangerModifier(double&) const;
1121   truth TryToTalkAboutScience();
1122   truth IsUsingWeaponOfCategory(int) const;
IsKamikazeDwarf()1123   virtual truth IsKamikazeDwarf() const { return false; }
1124   void AddRandomScienceName(festring&) const;
IsStuck()1125   truth IsStuck() const { return truth(TrapData); }
1126   festring GetTrapDescription() const;
1127   truth TryToUnStickTraps(v2);
1128   void RemoveTrap(ulong);
1129   void AddTrap(ulong, ulong);
1130   truth IsStuckToTrap(ulong) const;
1131   void RemoveTraps();
1132   void RemoveTraps(int);
1133   int RandomizeHurtBodyPart(ulong) const;
RandomizeTryToUnStickBodyPart(ulong)1134   virtual int RandomizeTryToUnStickBodyPart(ulong) const { return NONE_INDEX; }
1135   truth BodyPartIsStuck(int) const;
1136   void PrintAttribute(cchar*, int, int, int) const;
1137   virtual truth AllowUnconsciousness() const;
1138   truth CanPanic() const;
1139   int GetRandomBodyPart(ulong = ALL_BODYPART_FLAGS) const;
CanChokeOnWeb(web *)1140   virtual truth CanChokeOnWeb(web*) const { return CanChoke(); }
BrainsHurt()1141   virtual truth BrainsHurt() const { return false; }
IsHeadless()1142   virtual truth IsHeadless() const { return false; }
1143   truth IsSwimming() const;
1144   truth IsAnimated() const;
IsPlayerKind()1145   virtual truth IsPlayerKind() const { return false; }
1146   truth HasBodyPart(sorter) const;
1147   truth PossessesItem(sorter) const;
IsFlying()1148   truth IsFlying() const { return GetMoveType() & FLY; }
1149   virtual cchar* GetRunDescriptionLine(int) const;
1150   void VomitAtRandomDirection(int);
SpecialSaveLife()1151   virtual truth SpecialSaveLife() { return false; }
1152   void RemoveLifeSavers();
1153   virtual ccharacter* FindCarrier() const;
1154   virtual cchar* GetNormalDeathMessage() const;
1155   virtual bool IsConscious() const;
1156   void ForcePutNear(v2);
ApplySpecialAttributeBonuses()1157   virtual void ApplySpecialAttributeBonuses() { }
1158   void ReceiveMustardGas(int, long);
1159   void ReceiveMustardGasLiquid(int, long);
1160   void ReceiveFlames(long);
1161   truth IsBadPath(v2) const;
1162   double& GetExpModifierRef(expid);
1163   truth ForgetRandomThing();
1164   void ApplyAllGodsKnownBonus();
1165   item* GiveMostExpensiveItem(character*);
1166   void ReceiveItemAsPresent(item*);
1167   item* FindMostExpensiveItem() const;
1168   truth ReceiveSirenSong(character* Siren);
1169   character* GetNearestEnemy() const;
IsInfectedByMindWorm()1170   truth IsInfectedByMindWorm() const { return !CounterToMindWormHatch; }
SetCounterToMindWormHatch(int What)1171   void SetCounterToMindWormHatch(int What) { CounterToMindWormHatch = What; }
GetCounterToMindWormHatch()1172   int GetCounterToMindWormHatch() const { return CounterToMindWormHatch; }
1173   truth MindWormCanPenetrateSkull(mindworm*) const;
1174   truth CanTameWithDulcis(const character*) const;
1175   truth CanTameWithLyre(const character*) const;
1176   truth CanTameWithScroll(const character*) const;
1177   truth CanTameWithResurrection(const character*) const;
IsCharmable()1178   truth IsCharmable() const { return GetTamingDifficulty() != NO_TAMING; }
1179   truth CheckSadism();
HasSadistAttackMode()1180   virtual truth HasSadistAttackMode() const { return IsUsingLegs(); }
1181   truth CheckForBeverage();
1182   void Haste();
1183   void Slow();
1184   void SignalBurn();
1185   void Extinguish(truth);
1186   truth IsBurnt() const;
1187   truth IsPlayerAutoPlay();
1188   truth CheckAIZapOpportunity();
1189   int GetAdjustedStaminaCost(int, int);
1190   truth TryToStealFromShop(character*, item*);
GetMyVomitMaterial()1191   int GetMyVomitMaterial() { return MyVomitMaterial; }
SetNewVomitMaterial(int What)1192   void SetNewVomitMaterial(int What) { MyVomitMaterial = What; }
1193   festring GetHitPointDescription() const;
1194   truth WillGetTurnSoon() const;
SetFeedingSumo(truth What)1195   virtual void SetFeedingSumo(truth What) { return; }
1196  protected:
1197   static truth DamageTypeDestroysBodyPart(int);
1198   virtual void LoadSquaresUnder();
1199   virtual bodypart* MakeBodyPart(int) const;
SpecialTurnHandler()1200   virtual void SpecialTurnHandler() { }
1201   void Initialize(int, int);
PostConstruct()1202   virtual void PostConstruct() { }
1203   void LoadDataBaseStats();
1204   virtual v2 GetBodyPartBitmapPos(int, truth = false) const;
1205   virtual col16 GetBodyPartColorA(int, truth = false) const;
1206   virtual col16 GetBodyPartColorB(int, truth = false) const;
1207   virtual col16 GetBodyPartColorC(int, truth = false) const;
1208   virtual col16 GetBodyPartColorD(int, truth = false) const;
1209   virtual int GetBodyPartSparkleFlags(int) const;
1210   virtual long GetBodyPartSize(int, int) const;
1211   virtual long GetBodyPartVolume(int) const;
1212   void UpdateBodyPartPicture(int I, truth);
1213   int ChooseBodyPartToReceiveHit(double, double);
1214   virtual void CreateBodyParts(int);
1215   virtual material* CreateBodyPartMaterial(int, long) const;
ShowClassDescription()1216   virtual truth ShowClassDescription() const { return true; }
1217   void SeekLeader(ccharacter*);
1218   virtual truth CheckForUsefulItemsOnGround(truth = true);
1219   truth CheckForDoors();
1220   truth CheckForEnemies(truth, truth, truth, truth = false);
1221   truth FollowLeader(character*);
1222   void StandIdleAI();
1223   virtual void CreateCorpse(lsquare*);
1224   void GetPlayerCommand();
1225 
1226   truth AutoPlayAICommand(int&);
1227   truth AutoPlayAIPray();
1228   bool AutoPlayAIChkInconsistency();
1229   static void AutoPlayAIDebugDrawSquareRect(v2 v2SqrPos, col16 color, int iPrintIndex=-1, bool bWide=false, bool bKeepColor=false);
1230   static void AutoPlayAIDebugDrawOverlay();
1231   static bool AutoPlayAICheckAreaLevelChangedAndReset();
1232   truth AutoPlayAIDropThings();
1233   bool IsAutoplayAICanPickup(item* it,bool bPlayerHasLantern);
1234   truth AutoPlayAIEquipAndPickup(bool bPlayerHasLantern);
1235   int   AutoPlayAIFindWalkDist(v2 v2To);
1236   truth AutoPlayAITestValidPathTo(v2 v2To);
1237   truth AutoPlayAINavigateDungeon(bool bPlayerHasLantern);
1238   truth AutoPlayAISetAndValidateKeepGoingTo(v2 v2KGTo);
1239   void AutoPlayAITeleport(bool bDeathCountBased);
1240   void AutoPlayAIReset(bool bFailedToo);
1241 
1242   virtual void GetAICommand();
1243   truth MoveTowardsTarget(truth);
1244   virtual cchar* FirstPersonUnarmedHitVerb() const;
1245   virtual cchar* FirstPersonCriticalUnarmedHitVerb() const;
1246   virtual cchar* ThirdPersonUnarmedHitVerb() const;
1247   virtual cchar* ThirdPersonCriticalUnarmedHitVerb() const;
1248   virtual cchar* FirstPersonKickVerb() const;
1249   virtual cchar* FirstPersonCriticalKickVerb() const;
1250   virtual cchar* ThirdPersonKickVerb() const;
1251   virtual cchar* ThirdPersonCriticalKickVerb() const;
1252   virtual cchar* FirstPersonBiteVerb() const;
1253   virtual cchar* FirstPersonCriticalBiteVerb() const;
1254   virtual cchar* ThirdPersonBiteVerb() const;
1255   virtual cchar* ThirdPersonCriticalBiteVerb() const;
1256   virtual cchar* UnarmedHitNoun() const;
1257   virtual cchar* KickNoun() const;
1258   virtual cchar* BiteNoun() const;
AttackIsBlockable(int)1259   virtual truth AttackIsBlockable(int) const { return true; }
AttackMayDamageArmor()1260   virtual truth AttackMayDamageArmor() const { return true; }
GetSpecialBodyPartFlags(int)1261   virtual int GetSpecialBodyPartFlags(int) const { return ST_NORMAL; }
GetBodyPartWobbleData(int)1262   virtual int GetBodyPartWobbleData(int) const { return 0; }
ModifyBodyPartHitPreference(int,int Modifier)1263   virtual int ModifyBodyPartHitPreference(int, int Modifier) const { return Modifier; }
ModifyBodyPartToHitChance(int,int Chance)1264   virtual int ModifyBodyPartToHitChance(int, int Chance) const { return Chance; }
CanPanicFromSeveredBodyPart()1265   virtual truth CanPanicFromSeveredBodyPart() const { return true; }
SpecialBodyPartSeverReaction()1266   virtual void SpecialBodyPartSeverReaction() { }
1267   truth AttackAdjacentEnemyAI();
1268   double RandomizeBabyExperience(double);
1269   static truth IsLimbIndex(int);
AllowExperience()1270   virtual truth AllowExperience() const { return true; }
FindProtoType()1271   virtual const prototype* FindProtoType() const { return &ProtoType; }
1272   static const prototype ProtoType;
1273   stack* Stack;
1274   long NP, AP;
1275   long TemporaryState;
1276   int TemporaryStateCounter[STATES];
1277   team* Team;
1278   v2 GoingTo;
1279   double RandomMoveDir;
1280   long Money;
1281   int MyVomitMaterial;
1282   std::list<character*>::iterator TeamIterator;
1283   bodypartslot* BodyPartSlot;
1284   festring AssignedName;
1285   action* Action;
1286   const database* DataBase;
1287   double BaseExperience[BASE_ATTRIBUTES];
1288   std::list<ulong>* OriginalBodyPartID;
1289   entity* MotherEntity;
1290   character* PolymorphBackup;
1291   cweaponskill* CWeaponSkill;
1292   long EquipmentState;
1293   square** SquareUnder;
1294   long Volume;
1295   long Weight;
1296   long CarriedWeight;
1297   long BodyVolume;
1298   int HP;
1299   int MaxHP;
1300   int BurdenState;
1301   double DodgeValue;
1302   int AllowedWeaponSkillCategories;
1303   int BodyParts;
1304   long RegenerationCounter;
1305   int AttributeBonus[BASE_ATTRIBUTES];
1306   int CarryingBonus;
1307   homedata* HomeData;
1308   ulong ID;
1309   int SquaresUnder;
1310   std::vector<v2> Route;
1311   std::set<v2> Illegal;
1312   ulong LastAcidMsgMin;
1313   int Stamina;
1314   int MaxStamina;
1315   int BlocksSinceLastTurn;
1316   double GenerationDanger;
1317   ulong CommandFlags;
1318   ulong WarnFlags;
1319   int ScienceTalks;
1320   trapdata* TrapData;
1321   expmodifiermap ExpModifierMap;
1322   int CounterToMindWormHatch;
1323   ulong MemorizedEquippedItemIDs[MAX_EQUIPMENT_SLOTS];
1324   v2 v2HoldPos;
NeedsBurningPostFix()1325   virtual truth NeedsBurningPostFix() const { return false; }
1326 };
1327 
1328 #ifdef __FILE_OF_STATIC_CHARACTER_PROTOTYPE_DEFINITIONS__
1329 #define CHARACTER_PROTO(name, base)\
1330 template<> const characterprototype\
1331   name##sysbase::ProtoType(&base::ProtoType,\
1332                            reinterpret_cast<characterspawner>(&name##sysbase::Spawn),\
1333                            reinterpret_cast<charactercloner>(&name##sysbase::Clone), #name);
1334 #else
1335 #define CHARACTER_PROTO(name, base)
1336 #endif
1337 
1338 #define CHARACTER(name, base)\
1339 class name;\
1340 typedef sysbase<name, base, characterprototype> name##sysbase;\
1341 CHARACTER_PROTO(name, base)\
1342 class name : public name##sysbase
1343 
1344 #endif
1345