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 __BODYPART_H__
14 #define __BODYPART_H__
15 
16 #include "item.h"
17 #include "save.h"
18 
19 class humanoid;
20 class sweaponskill;
21 
22 struct scar
23 {
24   int Severity;
25   mutable bitmap* PanelBitmap;
26 };
27 
28 outputfile& operator<<(outputfile&, const scar&);
29 inputfile& operator>>(inputfile&, scar&);
30 
31 struct damageid
32 {
33   int SrcID, Amount;
34 };
35 
36 RAW_SAVE_LOAD(damageid)
37 
ITEM(bodypart,item)38 ITEM(bodypart, item)
39 {
40  public:
41   friend class corpse;
42   bodypart() : Master(0) { }
43   bodypart(const bodypart&);
44   virtual ~bodypart();
45   virtual void Save(outputfile&) const;
46   virtual void Load(inputfile&);
47   virtual int GetGraphicsContainerIndex() const;
48   character* GetMaster() const { return Master; }
49   humanoid* GetHumanoidMaster() const;
50   void SetMaster(character* What) { Master = What; }
51   virtual int GetStrengthValue() const;
52   int GetMaxHP() const { return MaxHP; }
53   void SetHP(int);
54   int GetHP() const { return HP; }
55   void EditHP(int, int);
56   void IncreaseHP();
57   virtual int GetTotalResistance(int) const { return 0; }
58   virtual truth ReceiveDamage(character*, int, int, int);
59   cfestring& GetOwnerDescription() const { return OwnerDescription; }
60   void SetOwnerDescription(cfestring& What) { OwnerDescription = What; }
61   truth IsUnique() const { return Flags & UNIQUE; }
62   void SetIsUnique(truth);
63   virtual void DropEquipment(stack* = 0) { }
64   virtual void InitSpecialAttributes() { }
65   virtual void SignalEquipmentAdd(gearslot*);
66   virtual void SignalEquipmentRemoval(gearslot*, citem*);
67   virtual void Mutate();
68   long GetBodyPartVolume() const { return BodyPartVolume; }
69   long GetCarriedWeight() const { return CarriedWeight; }
70   virtual item* GetEquipment(int) const { return 0; }
71   virtual int GetEquipments() const { return 0; }
72   virtual void CalculateVolumeAndWeight();
73   virtual void CalculateEmitation();
74   void CalculateMaxHP(ulong = MAY_CHANGE_HPS|CHECK_USABILITY);
75   virtual void SignalVolumeAndWeightChange();
76   void FastRestoreHP();
77   void RestoreHP();
78   virtual void CalculateDamage() { }
79   virtual void CalculateToHitValue() { }
80   virtual void CalculateAPCost() { }
81   void CalculateAttackInfo();
82   double GetTimeToDie(int, double, double, truth, truth) const;
83   virtual double GetRoughChanceToHit(double, double) const;
84   cfestring& GetBodyPartName() const { return GetNameSingular(); }
85   void RandomizePosition();
86   void ResetPosition() { SpecialFlags &= ~0x7; }
87   virtual void SignalSpoil(material*);
88   virtual truth CanBePiledWith(citem*, ccharacter*) const;
89   truth IsAlive() const;
90   void SpillBlood(int);
91   void SpillBlood(int, v2);
92   virtual void Be();
93   int GetConditionColorIndex() const;
94   void SetBitmapPos(v2 What) { BitmapPos = What; }
95   void SetSpecialFlags(int What) { SpecialFlags = What; }
96   void SetWobbleData(int What) { WobbleData = What; }
97   void SetMaterialColorB(col16 What) { ColorB = What; }
98   void SetMaterialColorC(col16 What) { ColorC = What; }
99   void SetMaterialColorD(col16 What) { ColorD = What; }
100   virtual void SignalEnchantmentChange();
101   virtual void CalculateAttributeBonuses() { }
102   virtual void SignalSpoilLevelChange(material*);
103   virtual void SignalBurnLevelChange();
104   virtual void SignalBurnLevelTransitionMessage();
105   virtual truth CanBeEatenByAI(ccharacter*) const;
106   virtual truth DamageArmor(character*, int, int) { return false; }
107   truth CanBeSevered(int) const;
108   virtual truth EditAllAttributes(int) { return false; }
109   virtual void Draw(blitdata&) const;
110   void SetSparkleFlags(int);
111   virtual int GetSpecialFlags() const;
112   virtual truth IsRepairable(ccharacter*) const;
113   truth IsWarm() const;
114   truth IsWarmBlooded() const;
115   truth UseMaterialAttributes() const;
116   truth CanRegenerate() const;
117   virtual square* GetSquareUnder(int = 0) const;
118   virtual lsquare* GetLSquareUnder(int = 0) const;
119   virtual item* GetArmorToReceiveFluid(truth) const { return 0; }
120   virtual void SpillFluid(character*, liquid*, int = 0);
121   void StayOn(liquid*);
122   void SetBloodMaterial(int What) { BloodMaterial = What; }
123   int GetBloodMaterial() const { return BloodMaterial; }
124   liquid* CreateBlood(long) const;
125   virtual truth UpdateArmorPictures() { return false; }
126   virtual void DrawArmor(blitdata&) const { }
127   virtual void UpdatePictures();
128   item* GetExternalBodyArmor() const;
129   item* GetExternalCloak() const;
130   item* GetExternalHelmet() const;
131   item* GetExternalBelt() const;
132   virtual void ReceiveAcid(material*, cfestring&, long);
133   virtual void ReceiveHeat(material*, cfestring&, long);
134   virtual truth ShowFluids() const { return false; }
135   virtual void TryToRust(long);
136   virtual truth TestActivationEnergy(int);
137   virtual truth AllowFluidBe() const;
138   virtual material* RemoveMaterial(material*);
139   virtual void CopyAttributes(const bodypart*) { }
140   virtual void DestroyBodyPart(stack*);
141   virtual void SetLifeExpectancy(int, int);
142   virtual void SpecialEatEffect(character*, int);
143   virtual character* GetBodyPartMaster() const { return Master; }
144   virtual truth AllowFluids() const { return true; }
145   truth IsBadlyHurt() const { return Flags & BADLY_HURT; }
146   truth IsStuck() const { return Flags & STUCK; }
147   truth IsUsable() const { return !(Flags & (BADLY_HURT|STUCK)); }
148   virtual void SignalPossibleUsabilityChange() { UpdateFlags(); }
149   void SetIsInfectedByLeprosy(truth);
150   virtual int GetSparkleFlags() const;
151   virtual truth MaterialIsChangeable(ccharacter*) const;
152   virtual void RemoveRust();
153   virtual void RemoveBurns();
154   virtual item* Fix();
155   virtual long GetFixPrice() const;
156   virtual truth IsFixableBySmith(ccharacter*) const;
157   virtual truth IsFixableByTailor(ccharacter*) const;
158   virtual void SignalMaterialChange();
159   void SetNormalMaterial(int What) { NormalMaterial = What; }
160   virtual truth IsBroken() const { return HP < MaxHP; }
161   virtual truth IsDestroyable(ccharacter*) const;
162   void DrawScars(cblitdata&) const;
163   static truth DamageTypeCanScar(int);
164   void GenerateScar(int, int);
165   int CalculateScarAttributePenalty(int) const;
166   int CalculateBurnAttributePenalty(int) const;
167   virtual void SignalBurn(material*);
168   virtual void Extinguish(truth);
169   virtual void AddSpecialExtinguishMessageForPF();
170   virtual void AddExtinguishMessage();
171  protected:
172   virtual alpha GetMaxAlpha() const;
173   virtual void GenerateMaterials() { }
174   virtual void AddPostFix(festring&, int) const;
175   virtual truth ShowMaterial() const;
176   virtual int GetArticleMode() const;
177   virtual col16 GetMaterialColorA(int) const;
178   virtual col16 GetMaterialColorB(int) const { return ColorB; }
179   virtual col16 GetMaterialColorC(int) const { return ColorC; }
180   virtual col16 GetMaterialColorD(int) const { return ColorD; }
181   virtual v2 GetBitmapPos(int) const { return BitmapPos; }
182   virtual int GetWobbleData() const { return WobbleData; }
183   void UpdateArmorPicture(graphicdata&, item*, int, v2 (item::*)(int) const, truth = false) const;
184   void DrawEquipment(const graphicdata&, blitdata&) const;
185   void UpdateFlags();
186   truth MasterIsAnimated() const;
187   void SignalAnimationStateChange(truth);
188   virtual truth AddAdjective(festring&, truth) const;
189   void RemoveDamageIDs(int);
190   void AddDamageID(int, int);
191   festring OwnerDescription;
192   character* Master;
193   long CarriedWeight;
194   long BodyPartVolume;
195   packv2 BitmapPos;
196   packcol16 ColorB;
197   packcol16 ColorC;
198   packcol16 ColorD;
199   ushort SpecialFlags;
200   short HP;
201   short MaxHP;
202   short BloodMaterial;
203   short NormalMaterial;
204   uchar SpillBloodCounter;
205   uchar WobbleData;
206   std::vector<scar> Scar;
207   std::deque<damageid> DamageID;
208 };
209 
ITEM(head,bodypart)210 ITEM(head, bodypart)
211 {
212  public:
213   head();
214   head(const head&);
215   virtual ~head();
216   virtual void Save(outputfile&) const;
217   virtual void Load(inputfile&);
218   virtual int GetTotalResistance(int) const;
219   void SetHelmet(item* What) { HelmetSlot.PutInItem(What); }
220   item* GetHelmet() const { return *HelmetSlot; }
221   void SetAmulet(item* What) { AmuletSlot.PutInItem(What); }
222   item* GetAmulet() const { return *AmuletSlot; }
223   virtual void DropEquipment(stack* = 0);
224   virtual int GetBodyPartIndex() const;
225   double GetBiteDamage() const { return BiteDamage; }
226   int GetBiteMinDamage() const;
227   int GetBiteMaxDamage() const;
228   double GetBiteToHitValue() const { return BiteToHitValue; }
229   long GetBiteAPCost() const { return BiteAPCost; }
230   virtual void InitSpecialAttributes();
231   virtual item* GetEquipment(int) const;
232   virtual int GetEquipments() const { return 2; }
233   int GetBaseBiteStrength() const { return BaseBiteStrength; }
234   void SetBaseBiteStrength(long What) { BaseBiteStrength = What; }
235   int GetBonusBiteStrength() const { return BonusBiteStrength; }
236   void SetBonusBiteStrength(long What) { BonusBiteStrength = What; }
237   virtual void CalculateDamage();
238   virtual void CalculateToHitValue();
239   virtual void CalculateAPCost();
240   virtual truth DamageArmor(character*, int, int);
241   virtual head* Behead();
242   virtual item* GetArmorToReceiveFluid(truth) const;
243   virtual void SignalPossibleUsabilityChange();
244   virtual truth IsHelmet(ccharacter*) const { return true; }
245  protected:
246   void UpdateHeadArmorPictures(graphicdata&) const;
247   gearslot HelmetSlot;
248   gearslot AmuletSlot;
249   int BaseBiteStrength;
250   int BonusBiteStrength;
251   double BiteToHitValue;
252   double BiteDamage;
253   long BiteAPCost;
254 };
255 
ITEM(torso,bodypart)256 ITEM(torso, bodypart)
257 {
258  public:
259   virtual int GetBodyPartIndex() const;
260   virtual double GetRoughChanceToHit(double, double) const;
261 };
262 
ITEM(normaltorso,torso)263 ITEM(normaltorso, torso)
264 {
265  public:
266   virtual int GetGraphicsContainerIndex() const;
267   virtual int GetTotalResistance(int) const;
268 };
269 
ITEM(humanoidtorso,torso)270 ITEM(humanoidtorso, torso)
271 {
272  public:
273   humanoidtorso();
274   humanoidtorso(const humanoidtorso&);
275   virtual ~humanoidtorso();
276   virtual void Save(outputfile&) const;
277   virtual void Load(inputfile&);
278   virtual int GetTotalResistance(int) const;
279   void SetBodyArmor(item* What) { BodyArmorSlot.PutInItem(What); }
280   item* GetBodyArmor() const { return *BodyArmorSlot; }
281   void SetCloak(item* What) { CloakSlot.PutInItem(What); }
282   item* GetCloak() const { return *CloakSlot; }
283   void SetBelt(item* What) { BeltSlot.PutInItem(What); }
284   item* GetBelt() const { return *BeltSlot; }
285   virtual void DropEquipment(stack* = 0);
286   virtual item* GetEquipment(int) const;
287   virtual int GetEquipments() const { return 3; }
288   virtual void SignalEquipmentAdd(gearslot*);
289   virtual void SignalVolumeAndWeightChange();
290   virtual truth DamageArmor(character*, int, int);
291   virtual item* GetArmorToReceiveFluid(truth) const;
292  protected:
293   void UpdateTorsoArmorPictures(graphicdata&, graphicdata&, graphicdata&) const;
294   gearslot BodyArmorSlot;
295   gearslot CloakSlot;
296   gearslot BeltSlot;
297 };
298 
ITEM(arm,bodypart)299 ITEM(arm, bodypart)
300 {
301  public:
302   arm() : StrengthBonus(0), DexterityBonus(0) { }
303   arm(const arm&);
304   virtual ~arm();
305   virtual void Save(outputfile&) const;
306   virtual void Load(inputfile&);
307   virtual int GetTotalResistance(int) const;
308   double GetWieldedDamage() const;
309   double GetWieldedToHitValue() const;
310   void SetWielded(item* What) { WieldedSlot.PutInItem(What); }
311   item* GetWielded() const { return *WieldedSlot; }
312   void SetGauntlet(item* What) { GauntletSlot.PutInItem(What); }
313   item* GetGauntlet() const { return *GauntletSlot; }
314   void SetRing(item* What) { RingSlot.PutInItem(What); }
315   item* GetRing() const { return *RingSlot; }
316   virtual void DropEquipment(stack* = 0);
317   double GetUnarmedToHitValue() const;
318   double GetUnarmedDamage() const;
319   void Hit(character*, v2, int, int = 0);
320   int GetAttribute(int, truth = true) const;
321   truth EditAttribute(int, int);
322   void EditExperience(int, double, double);
323   void SetStrength(int What) { StrengthExperience = What * EXP_MULTIPLIER; }
324   void SetDexterity(int What) { DexterityExperience = What * EXP_MULTIPLIER; }
325   virtual void InitSpecialAttributes();
326   virtual void Mutate();
327   virtual arm* GetPairArm() const { return 0; }
328   long GetWieldedAPCost() const;
329   long GetUnarmedAPCost() const;
330   virtual item* GetEquipment(int) const;
331   virtual int GetEquipments() const { return 3; }
332   int GetBaseUnarmedStrength() const { return BaseUnarmedStrength; }
333   void SetBaseUnarmedStrength(long What) { BaseUnarmedStrength = What; }
334   virtual void CalculateDamage();
335   virtual void CalculateToHitValue();
336   virtual void CalculateAPCost();
337   double GetDamage() const { return Damage; }
338   int GetMinDamage() const;
339   int GetMaxDamage() const;
340   double GetToHitValue() const { return ToHitValue; }
341   long GetAPCost() const { return APCost; }
342   truth PairArmAllowsMelee() const;
343   virtual void SignalVolumeAndWeightChange();
344   truth TwoHandWieldIsActive() const;
345   double GetBlockChance(double) const;
346   int GetBlockCapability() const;
347   void WieldedSkillHit(int);
348   double GetBlockValue() const;
349   void ApplyEquipmentAttributeBonuses(item*);
350   virtual void CalculateAttributeBonuses();
351   int GetWieldedHitStrength() const;
352   virtual void SignalEquipmentAdd(gearslot*);
353   virtual void SignalEquipmentRemoval(gearslot*, citem*);
354   void ApplyDexterityPenalty(item*);
355   void ApplyStrengthBonus(item*);
356   void ApplyDexterityBonus(item*);
357   virtual truth DamageArmor(character*, int, int);
358   truth CheckIfWeaponTooHeavy(cchar*) const;
359   virtual truth EditAllAttributes(int);
360   void AddAttackInfo(felist&) const;
361   void AddDefenceInfo(felist&) const;
362   void UpdateWieldedPicture();
363   void DrawWielded(blitdata&) const;
364   virtual truth IsRightArm() const { return 0; }
365   virtual void UpdatePictures();
366   virtual double GetTypeDamage(ccharacter*) const;
367   virtual item* GetArmorToReceiveFluid(truth) const;
368   virtual void CopyAttributes(const bodypart*);
369   double GetStrengthExperience() const { return StrengthExperience; }
370   double GetDexterityExperience() const { return DexterityExperience; }
371   virtual void SignalPossibleUsabilityChange();
372   virtual truth IsAnimated() const;
373   truth HasSadistWeapon() const;
374  protected:
375   virtual sweaponskill** GetCurrentSWeaponSkill() const { return 0; }
376   void UpdateArmArmorPictures(graphicdata&, graphicdata&, int) const;
377   int GetCurrentSWeaponSkillBonus() const;
378   gearslot WieldedSlot;
379   gearslot GauntletSlot;
380   gearslot RingSlot;
381   double StrengthExperience;
382   double DexterityExperience;
383   int BaseUnarmedStrength;
384   double Damage;
385   double ToHitValue;
386   long APCost;
387   int StrengthBonus;
388   int DexterityBonus;
389   graphicdata WieldedGraphicData;
390 };
391 
ITEM(rightarm,arm)392 ITEM(rightarm, arm)
393 {
394  public:
395   rightarm();
396   rightarm(const rightarm&);
397   virtual int GetBodyPartIndex() const;
398   virtual arm* GetPairArm() const;
399   virtual truth IsRightArm() const { return true; }
400   virtual int GetSpecialFlags() const;
401  protected:
402   virtual sweaponskill** GetCurrentSWeaponSkill() const;
403 };
404 
ITEM(leftarm,arm)405 ITEM(leftarm, arm)
406 {
407  public:
408   leftarm();
409   leftarm(const leftarm&);
410   virtual int GetBodyPartIndex() const;
411   virtual arm* GetPairArm() const;
412   virtual truth IsRightArm() const { return false; }
413   virtual int GetSpecialFlags() const;
414  protected:
415   virtual sweaponskill** GetCurrentSWeaponSkill() const;
416 };
417 
ITEM(groin,bodypart)418 ITEM(groin, bodypart)
419 {
420  public:
421   virtual int GetTotalResistance(int) const;
422   virtual int GetBodyPartIndex() const;
423   virtual truth DamageArmor(character*, int, int);
424   virtual int GetSpecialFlags() const;
425   virtual item* GetArmorToReceiveFluid(truth) const;
426   void UpdateGroinArmorPictures(graphicdata&) const;
427 };
428 
ITEM(leg,bodypart)429 ITEM(leg, bodypart)
430 {
431  public:
432   leg() : StrengthBonus(0), AgilityBonus(0) { }
433   leg(const leg&);
434   virtual ~leg();
435   virtual void Save(outputfile&) const;
436   virtual void Load(inputfile&);
437   virtual int GetTotalResistance(int) const;
438   void SetBoot(item* What) { BootSlot.PutInItem(What); }
439   item* GetBoot() const { return *BootSlot; }
440   virtual void DropEquipment(stack* = 0);
441   double GetKickToHitValue() const { return KickToHitValue; }
442   double GetKickDamage() const { return KickDamage; }
443   int GetKickMinDamage() const;
444   int GetKickMaxDamage() const;
445   int GetAttribute(int, truth = true) const;
446   truth EditAttribute(int, int);
447   void EditExperience(int, double, double);
448   virtual void InitSpecialAttributes();
449   virtual void Mutate();
450   long GetKickAPCost() const { return KickAPCost; }
451   virtual item* GetEquipment(int) const;
452   virtual int GetEquipments() const { return 1; }
453   long GetBaseKickStrength() const { return BaseKickStrength; }
454   void SetBaseKickStrength(long What) { BaseKickStrength = What; }
455   virtual void CalculateDamage();
456   virtual void CalculateToHitValue();
457   virtual void CalculateAPCost();
458   void ApplyEquipmentAttributeBonuses(item*);
459   virtual void CalculateAttributeBonuses();
460   virtual void SignalEquipmentAdd(gearslot*);
461   void ApplyAgilityPenalty(item*);
462   void ApplyStrengthBonus(item*);
463   void ApplyAgilityBonus(item*);
464   virtual void SignalVolumeAndWeightChange();
465   virtual truth DamageArmor(character*, int, int);
466   virtual truth EditAllAttributes(int);
467   void AddAttackInfo(felist&) const;
468   virtual item* GetArmorToReceiveFluid(truth) const;
469   virtual void CopyAttributes(const bodypart*);
470   double GetStrengthExperience() const { return StrengthExperience; }
471   double GetAgilityExperience() const { return AgilityExperience; }
472   virtual void SignalPossibleUsabilityChange();
473  protected:
474   void UpdateLegArmorPictures(graphicdata&, graphicdata&, int) const;
475   gearslot BootSlot;
476   double StrengthExperience;
477   double AgilityExperience;
478   int BaseKickStrength;
479   double KickDamage;
480   double KickToHitValue;
481   long KickAPCost;
482   int StrengthBonus;
483   int AgilityBonus;
484 };
485 
ITEM(rightleg,leg)486 ITEM(rightleg, leg)
487 {
488  public:
489   rightleg();
490   rightleg(const rightleg&);
491   virtual int GetBodyPartIndex() const;
492   virtual int GetSpecialFlags() const;
493  protected:
494 };
495 
ITEM(leftleg,leg)496 ITEM(leftleg, leg)
497 {
498  public:
499   leftleg();
500   leftleg(const leftleg&);
501   virtual int GetBodyPartIndex() const;
502   virtual int GetSpecialFlags() const;
503  protected:
504 };
505 
ITEM(corpse,item)506 ITEM(corpse, item)
507 {
508  public:
509   corpse() = default;
510   corpse(const corpse&);
511   virtual ~corpse();
512   virtual int GetOfferValue(int) const;
513   virtual double GetWeaponStrength() const;
514   virtual truth CanBeEatenByAI(ccharacter*) const;
515   virtual int GetStrengthValue() const;
516   character* GetDeceased() const { return Deceased; }
517   void SetDeceased(character*);
518   virtual void Save(outputfile&) const;
519   virtual void Load(inputfile&);
520   virtual truth IsDestroyable(ccharacter*) const { return true; }
521   virtual long GetTruePrice() const;
522   virtual int GetMaterials() const { return 2; }
523   virtual truth RaiseTheDead(character*);
524   virtual void CalculateVolumeAndWeight();
525   virtual void CalculateEmitation();
526   virtual void SignalSpoil(material*);
527   virtual truth CanBePiledWith(citem*, ccharacter*) const;
528   virtual int GetSpoilLevel() const;
529   virtual material* GetMaterial(int) const;
530   virtual head* Behead();
531   virtual truth CanBeCloned() const;
532   virtual int GetAttachedGod() const;
533   virtual void PreProcessForBone();
534   virtual void PostProcessForBone();
535   virtual void FinalProcessForBone();
536   virtual truth SuckSoul(character*, character* = 0);
537   virtual character* TryNecromancy(character*);
538   virtual void Cannibalize();
539   virtual material* GetConsumeMaterial(ccharacter*, materialpredicate) const;
540   virtual truth DetectMaterial(cmaterial*) const;
541   virtual void SetLifeExpectancy(int, int);
542   virtual void Be();
543   virtual void SignalDisappearance();
544   virtual truth IsValuable() const;
545   virtual truth AddRustLevelDescription(festring&, truth) const { return false; }
546   virtual truth Necromancy(character*);
547   virtual int GetSparkleFlags() const;
548   virtual truth IsRusted() const { return false; }
549   virtual truth IsBurnt() const { return false; }
550   virtual truth CanBeHardened(ccharacter*) const { return false; }
551   virtual truth AddBurnLevelDescription(festring&, truth) const { return false; }
552   virtual void SignalBurn(material*);
553   virtual void Extinguish(truth);
554  protected:
555   virtual void GenerateMaterials() { }
556   virtual col16 GetMaterialColorA(int) const;
557   virtual col16 GetMaterialColorB(int) const;
558   virtual alpha GetAlphaA(int) const;
559   virtual alpha GetAlphaB(int) const;
560   virtual truth ShowMaterial() const { return false; }
561   virtual void AddPostFix(festring&, int) const;
562   virtual v2 GetBitmapPos(int) const;
563   virtual int GetSize() const;
564   virtual int GetArticleMode() const;
565   virtual int GetRustDataA() const;
566   virtual int GetBurnDataA() const;
567   virtual truth AddStateDescription(festring&, truth) const;
568   character* Deceased;
569 };
570 
ITEM(eddytorso,normaltorso)571 ITEM(eddytorso, normaltorso)
572 {
573  protected:
574   virtual int GetClassAnimationFrames() const { return 8; }
575   virtual v2 GetBitmapPos(int) const;
576 };
577 
ITEM(largetorso,normaltorso)578 ITEM(largetorso, normaltorso)
579 {
580  public:
581   virtual void SignalStackAdd(stackslot*, void (stack::*)(item*, truth));
582   virtual int GetSquareIndex(v2) const;
583   virtual void Draw(blitdata&) const;
584   virtual void CalculateSquaresUnder() { SquaresUnder = 4; }
585  protected:
586   virtual v2 GetBitmapPos(int I) const { return GetLargeBitmapPos(BitmapPos, I); }
587   virtual void ModifyAnimationFrames(int& AF) const { AF <<= 2; }
588 };
589 
ITEM(largecorpse,corpse)590 ITEM(largecorpse, corpse)
591 {
592  public:
593   virtual void SignalStackAdd(stackslot*, void (stack::*)(item*, truth));
594   virtual int GetSquareIndex(v2) const;
595   virtual void Draw(blitdata&) const;
596   virtual void CalculateSquaresUnder() { SquaresUnder = 4; }
597  protected:
598   virtual v2 GetBitmapPos(int I) const { return GetLargeBitmapPos(item::GetBitmapPos(I), I); }
599   virtual void ModifyAnimationFrames(int& AF) const { AF <<= 2; }
600 };
601 
ITEM(ennerhead,head)602 ITEM(ennerhead, head)
603 {
604  protected:
605   virtual int GetClassAnimationFrames() const { return 32; }
606   virtual v2 GetBitmapPos(int) const;
607 };
608 
ITEM(playerkindhead,head)609 ITEM(playerkindhead, head)
610 {
611  public:
612   playerkindhead() = default;
613   playerkindhead(const playerkindhead& Head) : mybase(Head) { }
614   virtual void Save(outputfile&) const;
615   virtual void Load(inputfile&);
616   virtual truth UpdateArmorPictures();
617   virtual void DrawArmor(blitdata&) const;
618   virtual truth ShowFluids() const { return true; }
619   virtual truth IsAnimated() const { return true; }
620  protected:
621   graphicdata HelmetGraphicData;
622 };
623 
ITEM(playerkindtorso,humanoidtorso)624 ITEM(playerkindtorso, humanoidtorso)
625 {
626  public:
627   playerkindtorso() = default;
628   playerkindtorso(const playerkindtorso& Torso) : mybase(Torso) { }
629   virtual void Save(outputfile&) const;
630   virtual void Load(inputfile&);
631   virtual truth UpdateArmorPictures();
632   virtual void DrawArmor(blitdata&) const;
633   virtual void SignalVolumeAndWeightChange();
634   virtual truth ShowFluids() const { return true; }
635   virtual truth IsAnimated() const { return true; }
636  protected:
637   graphicdata TorsoArmorGraphicData;
638   graphicdata CloakGraphicData;
639   graphicdata BeltGraphicData;
640 };
641 
ITEM(playerkindrightarm,rightarm)642 ITEM(playerkindrightarm, rightarm)
643 {
644  public:
645   playerkindrightarm() = default;
646   playerkindrightarm(const playerkindrightarm& Arm) : mybase(Arm) { }
647   virtual void Save(outputfile&) const;
648   virtual void Load(inputfile&);
649   virtual truth UpdateArmorPictures();
650   virtual void DrawArmor(blitdata&) const;
651   virtual truth ShowFluids() const { return true; }
652   virtual truth IsAnimated() const { return true; }
653  protected:
654   graphicdata ArmArmorGraphicData;
655   graphicdata GauntletGraphicData;
656 };
657 
ITEM(playerkindleftarm,leftarm)658 ITEM(playerkindleftarm, leftarm)
659 {
660  public:
661   playerkindleftarm() = default;
662   playerkindleftarm(const playerkindleftarm& Arm) : mybase(Arm) { }
663   virtual void Save(outputfile&) const;
664   virtual void Load(inputfile&);
665   virtual truth UpdateArmorPictures();
666   virtual void DrawArmor(blitdata&) const;
667   virtual truth ShowFluids() const { return true; }
668   virtual truth IsAnimated() const { return true; }
669  protected:
670   graphicdata ArmArmorGraphicData;
671   graphicdata GauntletGraphicData;
672 };
673 
ITEM(playerkindgroin,groin)674 ITEM(playerkindgroin, groin)
675 {
676  public:
677   playerkindgroin() = default;
678   playerkindgroin(const playerkindgroin& Groin) : mybase(Groin) { }
679   virtual void Save(outputfile&) const;
680   virtual void Load(inputfile&);
681   virtual truth UpdateArmorPictures();
682   virtual void DrawArmor(blitdata&) const;
683   virtual truth ShowFluids() const { return true; }
684   virtual truth IsAnimated() const { return true; }
685  protected:
686   graphicdata GroinArmorGraphicData;
687 };
688 
ITEM(playerkindrightleg,rightleg)689 ITEM(playerkindrightleg, rightleg)
690 {
691  public:
692   playerkindrightleg() = default;
693   playerkindrightleg(const playerkindrightleg& Leg) : mybase(Leg) { }
694   virtual void Save(outputfile&) const;
695   virtual void Load(inputfile&);
696   virtual truth UpdateArmorPictures();
697   virtual void DrawArmor(blitdata&) const;
698   virtual truth ShowFluids() const { return true; }
699   virtual truth IsAnimated() const { return true; }
700  protected:
701   graphicdata LegArmorGraphicData;
702   graphicdata BootGraphicData;
703 };
704 
ITEM(playerkindleftleg,leftleg)705 ITEM(playerkindleftleg, leftleg)
706 {
707  public:
708   playerkindleftleg() = default;
709   playerkindleftleg(const playerkindleftleg& Leg) : mybase(Leg) { }
710   virtual void Save(outputfile&) const;
711   virtual void Load(inputfile&);
712   virtual truth UpdateArmorPictures();
713   virtual void DrawArmor(blitdata&) const;
714   virtual truth ShowFluids() const { return true; }
715   virtual truth IsAnimated() const { return true; }
716  protected:
717   graphicdata LegArmorGraphicData;
718   graphicdata BootGraphicData;
719 };
720 
ITEM(magicmushroomtorso,normaltorso)721 ITEM(magicmushroomtorso, normaltorso)
722 {
723  protected:
724   virtual int GetClassAnimationFrames() const { return 64; }
725   virtual v2 GetBitmapPos(int) const;
726 };
727 
ITEM(fusangatorso,largetorso)728 ITEM(fusangatorso, largetorso)
729 {
730   // TODO: Animated largetorso.
731  /*protected:
732   virtual int GetClassAnimationFrames() const { return 64; }
733   virtual v2 GetBitmapPos(int) const;*/
734 };
735 
ITEM(dogtorso,normaltorso)736 ITEM(dogtorso, normaltorso)
737 {
738  protected:
739   virtual void Draw(blitdata&) const;
740   virtual int GetClassAnimationFrames() const { return 16; }
741   virtual v2 GetBitmapPos(int) const;
742 };
743 
ITEM(blinkdogtorso,dogtorso)744 ITEM(blinkdogtorso, dogtorso)
745 {
746  protected:
747   virtual alpha GetAlphaA(int) const;
748   virtual int GetClassAnimationFrames() const { return 64; }
749 };
750 
ITEM(mysticfrogtorso,normaltorso)751 ITEM(mysticfrogtorso, normaltorso)
752 {
753  public:
754   virtual truth AllowAlphaEverywhere() const { return true; }
755  protected:
756   virtual int GetClassAnimationFrames() const { return 128; }
757   virtual col16 GetOutlineColor(int) const;
758   virtual alpha GetOutlineAlpha(int) const;
759 };
760 
ITEM(lobhsetorso,largetorso)761 ITEM(lobhsetorso, largetorso)
762 {
763  protected:
764   virtual int GetClassAnimationFrames() const { return 32; }
765   virtual col16 GetMaterialColorD(int) const;
766 };
767 
ITEM(battorso,normaltorso)768 ITEM(battorso, normaltorso)
769 {
770  protected:
771   virtual int GetClassAnimationFrames() const { return 16; }
772   virtual v2 GetBitmapPos(int) const;
773 };
774 
ITEM(spidertorso,normaltorso)775 ITEM(spidertorso, normaltorso)
776 {
777  protected:
778   virtual int GetClassAnimationFrames() const { return 16; }
779   virtual v2 GetBitmapPos(int) const;
780 };
781 
ITEM(snaketorso,normaltorso)782 ITEM(snaketorso, normaltorso)
783 {
784  protected:
785   virtual int GetClassAnimationFrames() const { return 32; }
786   virtual v2 GetBitmapPos(int) const;
787 };
788 
ITEM(magpietorso,normaltorso)789 ITEM(magpietorso, normaltorso)
790 {
791  protected:
792   virtual int GetClassAnimationFrames() const { return 16; }
793   virtual v2 GetBitmapPos(int) const;
794 };
795 
796 #endif
797