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