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