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