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