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 __ITEM_H__
14 #define __ITEM_H__
15 
16 #include <cmath>
17 
18 #include "object.h"
19 #include "lsquare.h"
20 #include "slot.h"
21 #include "lock.h"
22 
23 class felist;
24 class head;
25 class itemprototype;
26 template <class type> class databasecreator;
27 
28 typedef std::vector<item*> itemvector;
29 typedef std::vector<fluid*> fluidvector;
30 typedef truth (rawbitmap::*pixelpredicate)(v2) const;
31 typedef truth (material::*materialpredicate)() const;
32 typedef truth (item::*sorter)(ccharacter*) const;
33 typedef item* (*itemspawner)(int, int);
34 typedef item* (*itemcloner)(citem*);
35 
36 extern materialpredicate TrueMaterialPredicate;
37 
38 struct sortdata
39 {
sortdatasortdata40   sortdata(itemvector& AllItems, ccharacter* Character, truth Recurse, sorter Sorter)
41   : AllItems(AllItems),
42     Character(Character),
43     Recurse(Recurse),
44     Sorter(Sorter) { }
45   itemvector& AllItems;
46   ccharacter* Character;
47   truth Recurse;
48   sorter Sorter;
49 };
50 
51 struct idholder
52 {
idholderidholder53   idholder(ulong ID) : ID(ID) { }
54   idholder* Next;
55   ulong ID;
56 };
57 
58 outputfile& operator<<(outputfile&, const idholder*);
59 inputfile& operator>>(inputfile&, idholder*&);
60 
61 class itemlock
62 {
63  public:
64   typedef itemprototype prototype;
itemlock()65   itemlock() : Locked(false) { }
66   void Save(outputfile&) const;
67   void Load(inputfile&);
68   virtual truth TryKey(item*, character*);
69   virtual int GetVirtualConfig() const = 0;
70   virtual void SetVirtualConfig(int, int = 0) = 0;
71   virtual const prototype* GetVirtualProtoType() const = 0;
72   virtual festring GetVirtualDescription(int) const = 0;
73  protected:
74   virtual void PostConstruct();
75   truth Locked;
76 };
77 
78 typedef lockable<item, itemlock> lockableitem;
79 
80 struct itemdatabase : public databasebase
81 {
82   typedef itemprototype prototype;
83   void InitDefaults(const prototype*, int);
84   truth AllowRandomInstantiation() const;
PostProcessitemdatabase85   void PostProcess() { }
86   const prototype* ProtoType;
87   /* Maintained by configcontainer */
88   long PartialPossibilitySum;
89   long PartialCategoryPossibilitySum;
90   int Possibility;
91   int WeaponCategory;
92   truth IsDestroyable;
93   truth CanBeWished;
94   truth IsMaterialChangeable;
95   truth IsPolymorphSpawnable;
96   truth IsAutoInitializable;
97   truth IsAbstract;
98   truth IsPolymorphable;
99   truth CanBeGeneratedInContainer;
100   truth IsTwoHanded;
101   truth CreateDivineConfigurations;
102   truth CanBeCloned;
103   truth CanBeMirrored;
104   truth AffectsArmStrength;
105   truth AffectsLegStrength;
106   truth AffectsDexterity;
107   truth AffectsAgility;
108   truth AffectsEndurance;
109   truth AffectsPerception;
110   truth AffectsIntelligence;
111   truth AffectsWisdom;
112   truth AffectsWillPower;
113   truth AffectsCharisma;
114   truth AffectsMana;
115   truth PriceIsProportionalToEnchantment;
116   truth CanBeUsedBySmith;
117   truth AffectsCarryingCapacity;
118   truth HandleInPairs;
119   truth CanBeEnchanted;
120   truth IsQuestItem;
121   truth IsGoodWithPlants;
122   truth IsGoodWithUndead;
123   truth CreateLockConfigurations;
124   truth CanBePickedUp;
125   truth HasSecondaryMaterial;
126   truth AllowEquip;
127   truth IsValuable;
128   truth HasNormalPictureDirection;
129   truth IsKamikazeWeapon;
130   truth FlexibilityIsEssential;
131   truth CanBeBroken;
132   truth CanBeBurned;
133   truth CanBePiled;
134   long Category;
135   int EnergyResistance;
136   int FireResistance;
137   int PoisonResistance;
138   int ElectricityResistance;
139   int AcidResistance;
140   int StrengthModifier;
141   int SoundResistance;
142   int FormModifier;
143   int DefaultSize;
144   long DefaultMainVolume;
145   long DefaultSecondaryVolume;
146   v2 BitmapPos;
147   long Price;
148   col24 BaseEmitation;
149   truth UsesLongArticle;
150   festring Adjective;
151   truth UsesLongAdjectiveArticle;
152   festring NameSingular;
153   festring NamePlural;
154   festring PostFix;
155   int ArticleMode;
156   fearray<long> MainMaterialConfig;
157   fearray<long> SecondaryMaterialConfig;
158   fearray<long> MaterialConfigChances;
159   long MaterialConfigChanceSum;
160   fearray<festring> Alias;
161   int OKVisualEffects;
162   int ForcedVisualEffects;
163   int Roundness;
164   long GearStates;
165   int BeamRange;
166   v2 WallBitmapPos;
167   festring FlexibleNameSingular;
168   int MinCharges;
169   int MaxCharges;
170   long StorageVolume;
171   int MaxGeneratedContainedItems;
172   int BaseEnchantment;
173   int InElasticityPenaltyModifier;
174   int DamageDivider;
175   col16 BeamColor;
176   int BeamEffect;
177   int BeamStyle;
178   int WearWisdomLimit;
179   int AttachedGod;
180   int BreakEffectRangeSquare;
181   v2 WieldedBitmapPos;
182   int CoverPercentile;
183   v2 TorsoArmorBitmapPos;
184   v2 ArmArmorBitmapPos;
185   v2 AthleteArmArmorBitmapPos;
186   v2 LegArmorBitmapPos;
187   v2 HelmetBitmapPos;
188   v2 CloakBitmapPos;
189   v2 BeltBitmapPos;
190   v2 GauntletBitmapPos;
191   v2 BootBitmapPos;
192   int ReadDifficulty;
193   int EnchantmentMinusChance;
194   int EnchantmentPlusChance;
195   int TeleportPriority;
196   int DamageFlags;
197   festring BreakMsg;
198   truth IsSadistWeapon;
199   fearray<int> AllowedDungeons;
200   festring DescriptiveInfo;
201 };
202 
203 class itemprototype
204 {
205  public:
206   friend class databasecreator<item>;
207   itemprototype(const itemprototype*, itemspawner, itemcloner, cchar*);
208   item* Spawn(int Config = 0, int SpecialFlags = 0) const { return Spawner(Config, SpecialFlags); }
209   item* SpawnAndLoad(inputfile&) const;
Clone(citem * Item)210   item* Clone(citem* Item) const { return Cloner(Item); }
GetClassID()211   cchar* GetClassID() const { return ClassID; }
GetIndex()212   int GetIndex() const { return Index; }
GetBase()213   const itemprototype* GetBase() const { return Base; }
214   int CreateSpecialConfigurations(itemdatabase**, int, int);
215   const itemdatabase* ChooseBaseForConfig(itemdatabase**, int, int);
GetConfigData()216   const itemdatabase*const* GetConfigData() const { return ConfigData; }
GetConfigSize()217   int GetConfigSize() const { return ConfigSize; }
218  private:
219   int Index;
220   const itemprototype* Base;
221   itemdatabase** ConfigData;
222   itemdatabase** ConfigTable[CONFIG_TABLE_SIZE];
223   int ConfigSize;
224   itemspawner Spawner;
225   itemcloner Cloner;
226   cchar* ClassID;
227 };
228 
229 class item : public object
230 {
231  public:
232   friend class databasecreator<item>;
233   typedef itemprototype prototype;
234   typedef itemdatabase database;
235   item();
236   item(citem&);
237   virtual ~item();
238   virtual double GetWeaponStrength() const;
239   virtual truth Open(character*);
240   truth Consume(character*, long);
IsHeadOfElpuri()241   virtual truth IsHeadOfElpuri() const { return false; }
IsPetrussNut()242   virtual truth IsPetrussNut() const { return false; }
IsGoldenEagleShirt()243   virtual truth IsGoldenEagleShirt() const { return false; }
IsABone()244   virtual truth IsABone() const { return false; }
IsASkull()245   virtual truth IsASkull() const { return false; }
CanBeRead(character *)246   virtual truth CanBeRead(character*) const { return false; }
247   virtual truth Read(character*);
FinishReading(character *)248   virtual void FinishReading(character*) { }
HitEffect(character *,character *,v2,int,int,truth)249   virtual truth HitEffect(character*, character*, v2, int, int, truth) { return false; }
DipInto(liquid *,character *)250   virtual void DipInto(liquid*, character*) { }
251   virtual liquid* CreateDipLiquid(long MaxVolume = 500) { return 0; }
BetterVersion()252   virtual item* BetterVersion() const { return 0; }
253   virtual int GetOfferValue(int) const;
254   virtual void Fly(character*, int, int, truth=false);
255   int HitCharacter(character*, character*, int, double, int);
DogWillCatchAndConsume(ccharacter *)256   virtual truth DogWillCatchAndConsume(ccharacter*) const { return false; }
CatWillCatchAndConsume(ccharacter *)257   virtual truth CatWillCatchAndConsume(ccharacter*) const { return false; }
BunnyWillCatchAndConsume(ccharacter *)258   virtual truth BunnyWillCatchAndConsume(ccharacter*) const { return false; }
259   virtual truth Apply(character*);
Zap(character *,v2,int)260   virtual truth Zap(character*, v2, int) { return false; }
261   virtual truth Polymorph(character*, stack*);
262   virtual truth Polymorph(character*, character*);
263   virtual truth Alchemize(character*, stack*);
264   virtual truth SoftenMaterial();
CheckPickUpEffect(character *)265   virtual truth CheckPickUpEffect(character*) { return true; }
StepOnEffect(character *)266   virtual void StepOnEffect(character*) { }
IsTheAvatar()267   virtual truth IsTheAvatar() const { return false; }
268   virtual void SignalSquarePositionChange(int);
269   virtual truth CanBeEatenByAI(ccharacter*) const;
IsExplosive()270   virtual truth IsExplosive() const { return false; }
271   virtual void SetLabel(cfestring& What);
GetLabel()272   virtual cfestring& GetLabel() const { return label; }
273   bool HasTag(char);
274   void SetTag(char);
275   void ClearTag(char tag);
276   virtual void AddName(festring&, int) const;
AddName(festring & a,int b,int c)277   virtual void AddName(festring& a, int b, int c) const {object::AddName(a,b,c);} //required because of AddName(festring&,int)
278   virtual void Save(outputfile&) const;
279   virtual void Load(inputfile&);
ChargeFully(character *)280   virtual void ChargeFully(character*) { }
SetSize(int Value)281   void SetSize(int Value) { Size = Value; }
GetSize()282   virtual int GetSize() const { return Size; }
GetID()283   ulong GetID() const { return ID; }
284   void _BugWorkaround_ItemDup(ulong key);
285   virtual void TeleportRandomly();
286   virtual int GetStrengthValue() const;
287   slot* GetSlot(int I = 0) const { return Slot[I]; }
SetMainSlot(slot * What)288   void SetMainSlot(slot* What) { Slot[0] = What; }
PlaceToSlot(slot * Slot)289   void PlaceToSlot(slot* Slot) { Slot->PutInItem(this); }
290   virtual void RemoveFromSlot();
291   void MoveTo(stack*);
IsMainSlot(const slot * What)292   truth IsMainSlot(const slot* What) const { return Slot[0] == What; }
293   static cchar* GetItemCategoryName(long);
IsConsumable()294   virtual truth IsConsumable() const { return true; }
295   truth IsEatable(ccharacter*) const;
296   truth IsDrinkable(ccharacter*) const;
297   truth IsValidRecipeIngredient(ccharacter* Eater) const;
IsOpenable(ccharacter *)298   virtual truth IsOpenable(ccharacter*) const { return false; }
IsReadable(ccharacter *)299   virtual truth IsReadable(ccharacter*) const { return false; }
IsDippable(ccharacter *)300   virtual truth IsDippable(ccharacter*) const { return false; }
IsDipDestination(ccharacter *)301   virtual truth IsDipDestination(ccharacter*) const { return false; }
IsAppliable(ccharacter *)302   virtual truth IsAppliable(ccharacter*) const { return false; }
IsZappable(ccharacter *)303   virtual truth IsZappable(ccharacter*) const { return false; }
IsZapWorthy(ccharacter *)304   virtual truth IsZapWorthy(ccharacter*) const { return false; }
IsChargeable(ccharacter *)305   virtual truth IsChargeable(ccharacter*) const { return false; }
IsHelmet(ccharacter *)306   virtual truth IsHelmet(ccharacter*) const { return false; }
IsAmulet(ccharacter *)307   virtual truth IsAmulet(ccharacter*) const { return false; }
IsCloak(ccharacter *)308   virtual truth IsCloak(ccharacter*) const { return false; }
IsBodyArmor(ccharacter *)309   virtual truth IsBodyArmor(ccharacter*) const { return false; }
IsRing(ccharacter *)310   virtual truth IsRing(ccharacter*) const { return false; }
IsGauntlet(ccharacter *)311   virtual truth IsGauntlet(ccharacter*) const { return false; }
IsBelt(ccharacter *)312   virtual truth IsBelt(ccharacter*) const { return false; }
IsBoot(ccharacter *)313   virtual truth IsBoot(ccharacter*) const { return false; }
IsShield(ccharacter *)314   virtual truth IsShield(ccharacter*) const { return false; }
IsWeapon(ccharacter *)315   virtual truth IsWeapon(ccharacter*) const { return false; }
IsArmor(ccharacter *)316   virtual truth IsArmor(ccharacter*) const { return false; }
IsEnchantable(ccharacter *)317   virtual truth IsEnchantable(ccharacter*) const { return CanBeEnchanted(); }
IsRepairable(ccharacter *)318   virtual truth IsRepairable(ccharacter*) const { return IsBroken() || IsRusted() || IsBurnt(); }
IsDecosAdShirt(ccharacter *)319   virtual truth IsDecosAdShirt(ccharacter*) const { return false; }
IsLuxuryItem(ccharacter *)320   virtual truth IsLuxuryItem(ccharacter*) const { return false; }
MaterialIsChangeable(ccharacter *)321   virtual truth MaterialIsChangeable(ccharacter*) const { return IsMaterialChangeable(); }
322   virtual truth IsBeverage(ccharacter*) const;
323   virtual truth CanBeHardened(ccharacter*) const;
324   virtual truth CanBeSoftened() const;
HasLock(ccharacter *)325   virtual truth HasLock(ccharacter*) const { return false; }
326   virtual truth IsOnGround() const;
327   int GetResistance(int) const;
328   virtual void Be();
GetType()329   int GetType() const { return GetProtoType()->GetIndex(); }
330   virtual truth ReceiveDamage(character*, int, int, int = YOURSELF);
RaiseTheDead(character *)331   virtual truth RaiseTheDead(character*) { return false; }
GetBodyPartIndex()332   virtual int GetBodyPartIndex() const { return 0xFF; }
GetDataBase()333   const database* GetDataBase() const { return DataBase; }
CanOpenLockType(int)334   virtual truth CanOpenLockType(int) const { return false; }
IsWhip()335   virtual truth IsWhip() const { return false; }
336   DATA_BASE_VALUE(const prototype*, ProtoType);
337   DATA_BASE_VALUE(int, Config);
338   virtual DATA_BASE_TRUTH_WITH_PARAMETER(IsDestroyable, ccharacter*);
339   DATA_BASE_TRUTH(IsMaterialChangeable);
340   DATA_BASE_VALUE(int, WeaponCategory);
341   DATA_BASE_TRUTH(IsAutoInitializable);
342   DATA_BASE_VALUE(long, Category);
343   DATA_BASE_VALUE(int, EnergyResistance);
344   DATA_BASE_VALUE(int, FireResistance);
345   DATA_BASE_VALUE(int, PoisonResistance);
346   DATA_BASE_VALUE(int, ElectricityResistance);
347   DATA_BASE_VALUE(int, AcidResistance);
348   DATA_BASE_VALUE(int, SoundResistance);
349   DATA_BASE_VALUE(int, StrengthModifier);
350   virtual DATA_BASE_VALUE(int, FormModifier);
351   DATA_BASE_VALUE(int, DefaultSize);
352   DATA_BASE_VALUE(long, DefaultMainVolume);
353   DATA_BASE_VALUE(long, DefaultSecondaryVolume);
354   virtual DATA_BASE_VALUE_WITH_PARAMETER(v2, BitmapPos, int);
355   virtual DATA_BASE_VALUE(long, Price);
356   virtual DATA_BASE_VALUE(col24, BaseEmitation);
357   virtual DATA_BASE_TRUTH(UsesLongArticle);
358   virtual DATA_BASE_VALUE(cfestring&, Adjective);
359   virtual DATA_BASE_TRUTH(UsesLongAdjectiveArticle);
360   virtual DATA_BASE_VALUE(cfestring&, NameSingular);
361   virtual DATA_BASE_VALUE(cfestring&, NamePlural);
362   virtual DATA_BASE_VALUE(cfestring&, PostFix);
363   virtual DATA_BASE_VALUE(int, ArticleMode);
364   DATA_BASE_VALUE(const fearray<long>&, MainMaterialConfig);
365   DATA_BASE_VALUE(const fearray<long>&, SecondaryMaterialConfig);
366   virtual DATA_BASE_VALUE(const fearray<long>&, MaterialConfigChances);
367   virtual DATA_BASE_VALUE(long, MaterialConfigChanceSum);
368   DATA_BASE_TRUTH(IsPolymorphable);
369   virtual DATA_BASE_VALUE(int, OKVisualEffects);
370   DATA_BASE_TRUTH(CanBeGeneratedInContainer);
371   virtual DATA_BASE_VALUE(int, ForcedVisualEffects);
372   DATA_BASE_VALUE(int, Roundness);
373   DATA_BASE_VALUE(long, GearStates);
374   DATA_BASE_TRUTH(IsTwoHanded);
375   DATA_BASE_TRUTH(CanBeBroken);
376   DATA_BASE_TRUTH(CanBeBurned);
377   DATA_BASE_VALUE_WITH_PARAMETER(v2, WallBitmapPos, int);
378   DATA_BASE_VALUE(cfestring&, FlexibleNameSingular);
379   DATA_BASE_TRUTH(CanBePiled);
380   DATA_BASE_TRUTH(AffectsArmStrength);
381   DATA_BASE_TRUTH(AffectsLegStrength);
382   DATA_BASE_TRUTH(AffectsDexterity);
383   DATA_BASE_TRUTH(AffectsAgility);
384   DATA_BASE_TRUTH(AffectsEndurance);
385   DATA_BASE_TRUTH(AffectsPerception);
386   DATA_BASE_TRUTH(AffectsIntelligence);
387   DATA_BASE_TRUTH(AffectsWisdom);
388   DATA_BASE_TRUTH(AffectsWillPower);
389   DATA_BASE_TRUTH(AffectsCharisma);
390   DATA_BASE_TRUTH(AffectsMana);
391   DATA_BASE_TRUTH(AffectsCarryingCapacity);
392   DATA_BASE_VALUE(int, BaseEnchantment);
393   DATA_BASE_TRUTH(PriceIsProportionalToEnchantment);
394   DATA_BASE_VALUE(int, MaxCharges);
395   DATA_BASE_VALUE(int, MinCharges);
396   DATA_BASE_VALUE(int, InElasticityPenaltyModifier);
397   DATA_BASE_VALUE(long, StorageVolume);
398   DATA_BASE_VALUE(int, MaxGeneratedContainedItems);
399   virtual DATA_BASE_TRUTH(CanBeCloned);
400   virtual DATA_BASE_TRUTH(CanBeMirrored);
401   DATA_BASE_VALUE(int, BeamRange);
402   DATA_BASE_TRUTH(CanBeUsedBySmith);
403   DATA_BASE_VALUE(int, DamageDivider);
404   DATA_BASE_TRUTH(HandleInPairs);
405   DATA_BASE_TRUTH(CanBeEnchanted);
406   DATA_BASE_VALUE(long, BeamColor);
407   DATA_BASE_VALUE(int, BeamEffect);
408   DATA_BASE_VALUE(int, BeamStyle);
409   DATA_BASE_VALUE(int, WearWisdomLimit);
410   DATA_BASE_VALUE(int, BreakEffectRangeSquare);
411   virtual DATA_BASE_VALUE_WITH_PARAMETER(v2, WieldedBitmapPos, int);
412   DATA_BASE_TRUTH(IsQuestItem);
413   DATA_BASE_TRUTH(IsGoodWithPlants);
414   DATA_BASE_TRUTH(IsGoodWithUndead);
415   DATA_BASE_TRUTH(CanBePickedUp);
416   DATA_BASE_VALUE(int, CoverPercentile);
417   DATA_BASE_VALUE_WITH_PARAMETER(v2, TorsoArmorBitmapPos, int);
418   DATA_BASE_VALUE_WITH_PARAMETER(v2, ArmArmorBitmapPos, int);
419   DATA_BASE_VALUE_WITH_PARAMETER(v2, AthleteArmArmorBitmapPos, int);
420   DATA_BASE_VALUE_WITH_PARAMETER(v2, LegArmorBitmapPos, int);
421   DATA_BASE_VALUE_WITH_PARAMETER(v2, HelmetBitmapPos, int);
422   DATA_BASE_VALUE_WITH_PARAMETER(v2, CloakBitmapPos, int);
423   DATA_BASE_VALUE_WITH_PARAMETER(v2, BeltBitmapPos, int);
424   DATA_BASE_VALUE_WITH_PARAMETER(v2, GauntletBitmapPos, int);
425   DATA_BASE_VALUE_WITH_PARAMETER(v2, BootBitmapPos, int);
426   DATA_BASE_TRUTH(AllowEquip);
427   DATA_BASE_VALUE(int, ReadDifficulty);
428   DATA_BASE_VALUE(int, EnchantmentMinusChance);
429   DATA_BASE_VALUE(int, EnchantmentPlusChance);
430   virtual DATA_BASE_VALUE(int, TeleportPriority);
431   DATA_BASE_TRUTH(HasNormalPictureDirection);
432   DATA_BASE_VALUE(int, DamageFlags);
433   DATA_BASE_TRUTH(FlexibilityIsEssential);
434   DATA_BASE_VALUE(cfestring&, BreakMsg);
435   DATA_BASE_TRUTH(IsSadistWeapon);
436   DATA_BASE_VALUE(const fearray<int>&, AllowedDungeons);
437   DATA_BASE_VALUE(cfestring&, DescriptiveInfo);
CanBeSoldInLibrary(character * Librarian)438   truth CanBeSoldInLibrary(character* Librarian) const { return CanBeRead(Librarian); }
TryKey(item *,character *)439   virtual truth TryKey(item*, character*) { return false; }
440   long GetBlockModifier() const;
441   truth IsSimilarTo(item*) const;
IsPickable(character *)442   virtual truth IsPickable(character*) const { return true; }
443   truth CanBeSeenByPlayer() const;
444   virtual truth CanBeSeenBy(ccharacter*) const;
445   festring GetDescription(int) const;
446   virtual square* GetSquareUnderEntity(int = 0) const;
447   virtual square* GetSquareUnder(int = 0) const;
448   virtual lsquare* GetLSquareUnder(int = 0) const;
GetLevel()449   level* GetLevel() const { return static_cast<level*>(Slot[0]->GetSquareUnder()->GetArea()); }
GetArea()450   area* GetArea() const { return Slot[0]->GetSquareUnder()->GetArea(); }
451   v2 GetPos(int I = 0) const { return Slot[I]->GetSquareUnder()->GetPos(); }
GetNearSquare(v2 Pos)452   square* GetNearSquare(v2 Pos) const { return Slot[0]->GetSquareUnder()->GetArea()->GetSquare(Pos); }
GetNearSquare(int x,int y)453   square* GetNearSquare(int x, int y) const { return Slot[0]->GetSquareUnder()->GetArea()->GetSquare(x, y); }
GetNearLSquare(v2 Pos)454   lsquare* GetNearLSquare(v2 Pos) const { return static_cast<lsquare*>(Slot[0]->GetSquareUnder()->GetArea()->GetSquare(Pos)); }
GetNearLSquare(int x,int y)455   lsquare* GetNearLSquare(int x, int y) const { return static_cast<lsquare*>(Slot[0]->GetSquareUnder()->GetArea()->GetSquare(x, y)); }
456   virtual void SignalVolumeAndWeightChange();
457   virtual void CalculateVolumeAndWeight();
GetVolume()458   long GetVolume() const { return Volume; }
GetWeight()459   long GetWeight() const { return Weight; }
460   virtual void SignalEmitationIncrease(col24);
461   virtual void SignalEmitationDecrease(col24);
462   col24 GetEmitationDueToBurnLevel();
463   void CalculateAll();
464   virtual void DropEquipment(stack* = 0) { }
IsDangerous(ccharacter *)465   virtual truth IsDangerous(ccharacter*) const { return false; }
NeedDangerSymbol()466   virtual truth NeedDangerSymbol() const { return false; }
467   void WeaponSkillHit(int);
SetTeam(int)468   virtual void SetTeam(int) { }
469   void SpecialGenerationHandler();
470   item* Duplicate(ulong = 0);
SetIsActive(truth)471   virtual void SetIsActive(truth) { }
472   double GetBaseDamage() const;
473   int GetBaseMinDamage() const;
474   int GetBaseMaxDamage() const;
475   int GetBaseToHitValue() const;
476   int GetBaseBlockValue() const;
477   virtual void AddInventoryEntry(ccharacter*, festring&, int, truth) const;
478   long GetNutritionValue() const;
479   virtual void SignalSpoil(material*);
480   virtual truth AllowSpoil() const;
481   item* DuplicateToStack(stack*, ulong = 0);
482   virtual truth CanBePiledWith(citem*, ccharacter*) const;
GetTotalExplosivePower()483   virtual long GetTotalExplosivePower() const { return 0; }
484   virtual void Break(character*, int = YOURSELF);
SetEnchantment(int)485   virtual void SetEnchantment(int) { }
EditEnchantment(int)486   virtual void EditEnchantment(int) { }
487   virtual void SignalEnchantmentChange();
GetTHVBonus()488   virtual double GetTHVBonus() const { return 0.; }
GetDamageBonus()489   virtual double GetDamageBonus() const { return 0.; }
DrawContents(ccharacter *)490   virtual void DrawContents(ccharacter*) { }
491   virtual truth IsBroken() const;
492   virtual truth IsFood() const;
GetEnchantment()493   virtual int GetEnchantment() const { return 0; }
494   long GetEnchantedPrice(int) const;
495   virtual item* Fix();
496   int GetStrengthRequirement() const;
GetInElasticityPenalty(int)497   virtual int GetInElasticityPenalty(int) const { return 0; }
IsFixableBySmith(ccharacter *)498   virtual truth IsFixableBySmith(ccharacter*) const { return false; }
IsFixableByTailor(ccharacter *)499   virtual truth IsFixableByTailor(ccharacter*) const { return false; }
IsOnFire(ccharacter *)500   virtual truth IsOnFire(ccharacter*) const { return !!IsBurning(); }
501   virtual long GetFixPrice() const;
502   virtual void DonateSlotTo(item*);
503   virtual int GetSpoilLevel() const;
504   virtual void SignalSpoilLevelChange(material*);
505   virtual int GetBurnLevel() const;
506   void ResetSpoiling();
507   void ResetBurning();
508   void ResetThermalEnergies();
SetItemsInside(const fearray<contentscript<item>> &,int)509   virtual void SetItemsInside(const fearray<contentscript<item>>&, int) { }
GetCarryingBonus()510   virtual int GetCarryingBonus() const { return 0; }
IsBanana()511   virtual truth IsBanana() const { return false; }
IsMangoSeedling()512   virtual truth IsMangoSeedling() const { return false; }
IsEncryptedScroll()513   virtual truth IsEncryptedScroll() const { return false; }
IsNuke()514   virtual truth IsNuke() const { return false; }
IsWeepObsidian()515   virtual truth IsWeepObsidian() const { return false; }
IsShadowVeil()516   virtual truth IsShadowVeil() const { return false; }
IsLostRubyFlamingSword()517   virtual truth IsLostRubyFlamingSword() const { return false; }
IsRuneSword()518   virtual truth IsRuneSword() const { return false; }
IsMuramasa()519   virtual truth IsMuramasa() const { return false; }
IsMasamune()520   virtual truth IsMasamune() const { return false; }
521   cchar* GetStrengthValueDescription() const;
522   cchar* GetBaseToHitValueDescription() const;
523   cchar* GetBaseBlockValueDescription() const;
524   virtual truth IsInCorrectSlot(int) const;
525   truth IsInCorrectSlot() const;
526   int GetEquipmentIndex() const;
CanBeEquipped(int)527   virtual truth CanBeEquipped(int) const { return true; }
CanBeUnEquipped(int)528   virtual truth CanBeUnEquipped(int) const { return true; }
529   room* GetRoom(int I = 0) const { return GetLSquareUnder(I)->GetRoom(); }
HasBetterVersion()530   virtual truth HasBetterVersion() const { return false; }
531   virtual void SortAllItems(const sortdata&) const;
AllowAlphaEverywhere()532   virtual truth AllowAlphaEverywhere() const { return false; }
533   virtual int GetAttachedGod() const;
534   virtual long GetTruePrice() const;
Search(ccharacter *,int)535   virtual void Search(ccharacter*, int) { }
Behead()536   virtual head* Behead() { return 0; }
IsGorovitsFamilyRelic()537   virtual truth IsGorovitsFamilyRelic() const { return false; }
EffectIsGood()538   virtual truth EffectIsGood() const { return false; }
539 #ifdef WIZARD
540   virtual void AddAttackInfo(felist&) const;
541   void AddMiscellaneousInfo(felist&) const;
542 #endif
543   virtual void PreProcessForBone();
544   virtual void PostProcessForBone();
FinalProcessForBone()545   virtual void FinalProcessForBone() { }
546   virtual truth SuckSoul(character*, character* = 0) { return false; }
547   void SetConfig(int, int = 0);
548   truth SetConfigIfPossible(int, int = 0);
549   god* GetMasterGod() const;
GetCloneMotherID()550   idholder* GetCloneMotherID() const { return CloneMotherID; }
551   virtual void SignalStackAdd(stackslot*, void (stack::*)(item*, truth));
GetSquareIndex(v2)552   virtual int GetSquareIndex(v2) const { return 0; }
553   virtual void Draw(blitdata&) const;
554   v2 GetLargeBitmapPos(v2, int) const;
555   void LargeDraw(blitdata&) const;
556   void DonateIDTo(item*);
557   virtual void SignalRustLevelChange();
558   virtual void SignalBurnLevelChange();
559   virtual void SignalBurnLevelTransitionMessage();
560   virtual void SignalBurn(material*);
561   virtual void AddSpecialExtinguishMessageForPF();
562   virtual void AddExtinguishMessage();
563   virtual void SendNewDrawAndMemorizedUpdateRequest() const;
CalculateSquaresUnder()564   virtual void CalculateSquaresUnder() { SquaresUnder = 1; }
GetSquaresUnder()565   int GetSquaresUnder() const { return SquaresUnder; }
566   virtual void CalculateEmitation();
567   void FillFluidVector(fluidvector&, int = 0) const;
568   virtual void SpillFluid(character*, liquid*, int = 0);
DipIntoVolume()569   virtual long DipIntoVolume() const { return 500; }
570   virtual void TryToRust(long);
571   virtual truth TestActivationEnergy(int);
572   void RemoveFluid(fluid*);
573   void AddFluid(liquid*, festring, int, truth);
574   virtual truth IsAnimated() const;
575   const rawbitmap* GetRawPicture() const;
576   void DrawFluidGearPictures(blitdata&, int = 0) const;
577   void DrawFluidBodyArmorPictures(blitdata&, int) const;
578   void CheckFluidGearPictures(v2, int, truth);
579   void DrawFluids(blitdata&) const;
580   virtual void ReceiveAcid(material*, cfestring&, long);
581   virtual void ReceiveHeat(material*, cfestring&, long);
582   virtual void FightFire(material*, cfestring&, long);
ShowFluids()583   virtual truth ShowFluids() const { return true; }
584   void DonateFluidsTo(item*);
585   void Destroy(character*, int);
AllowFluidBe()586   virtual truth AllowFluidBe() const { return true; }
587   virtual truth IsRusted() const;
588   virtual void RemoveRust();
589   virtual truth IsBurnt() const;
590   virtual void RemoveBurns();
IsBananaPeel()591   virtual truth IsBananaPeel() const { return false; }
592   void SetSpoilPercentage(int);
593   virtual pixelpredicate GetFluidPixelAllowedPredicate() const;
594   void RedistributeFluids();
595   virtual material* GetConsumeMaterial(ccharacter*, materialpredicate = TrueMaterialPredicate) const;
596   virtual material* RemoveMaterial(material*);
597   virtual void Cannibalize();
598   void InitMaterials(material*, truth = true);
599   material* SetMainMaterial(material*, int = 0);
600   virtual void GenerateMaterials();
601   virtual void InitMaterials(const materialscript*, const materialscript*, truth);
GetSquarePosition()602   int GetSquarePosition() const { return (Flags & SQUARE_POSITION_BITS) >> SQUARE_POSITION_SHIFT; }
IsLanternOnWall()603   virtual truth IsLanternOnWall() const { return false; }
DestroyBodyPart(stack *)604   virtual void DestroyBodyPart(stack*) { SendToHell(); }
GetLifeExpectancy()605   int GetLifeExpectancy() const { return LifeExpectancy; }
606   virtual void SetLifeExpectancy(int, int);
NeedsBe()607   int NeedsBe() const { return LifeExpectancy || !!IsBurning(); }
IsVeryCloseToDisappearance()608   truth IsVeryCloseToDisappearance() const { return LifeExpectancy && LifeExpectancy < 10; }
609   truth IsVeryCloseToSpoiling() const;
610   truth IsVeryCloseToBurning() const;
611   virtual truth IsValuable() const;
Necromancy(character *)612   virtual truth Necromancy(character*) { return false; }
CalculateEnchantment()613   virtual void CalculateEnchantment() { }
GetBodyPartMaster()614   virtual character* GetBodyPartMaster() const { return 0; }
AllowFluids()615   virtual truth AllowFluids() const { return false; }
616   int GetHinderVisibilityBonus(ccharacter*) const;
617   virtual DATA_BASE_TRUTH_WITH_PARAMETER(IsKamikazeWeapon, ccharacter*);
618   virtual void AddTrapName(festring&, int) const;
619   int GetMainMaterialRustLevel() const;
HasID(ulong What)620   truth HasID(ulong What) const { return ID == What; }
621   virtual truth Spoils() const;
622   int GetMaxSpoilPercentage() const;
623   truth HasPrice() const;
624   virtual void Disappear();
625   festring GetLocationDescription() const;
626   truth IsEquipped() const;
627   festring GetExtendedDescription() const;
628   virtual ccharacter* FindCarrier() const;
BlockEffect(character *,character *,item *,int type)629   virtual void BlockEffect(character*, character*, item*, int type) { }
WillExplodeSoon()630   virtual bool WillExplodeSoon() const { return false; }
631   virtual const character* GetWearer() const;
SpecialOfferEffect(int)632   virtual bool SpecialOfferEffect(int) { return false; }
BreakEffect(character *,cfestring &)633   virtual void BreakEffect(character*, cfestring&) { return; }
634   void Haste();
635   void Slow();
636   void SendMemorizedUpdateRequest() const;
637   virtual void Ignite();
638   virtual void Extinguish(truth);
SetValidRecipeIngredient(truth b)639   void SetValidRecipeIngredient(truth b){ValidRecipeIngredient=b;}
ResetFlyingThrownStep()640   void ResetFlyingThrownStep() { iRotateFlyingThrownStep = 0; }
641  protected:
642   virtual cchar* GetBreakVerb() const;
643   virtual long GetMaterialPrice() const;
644   void LoadDataBaseStats();
PostConstruct()645   virtual void PostConstruct() { }
646   void Initialize(int, int);
647   virtual int GetGraphicsContainerIndex() const;
648   virtual truth ShowMaterial() const;
AllowSparkling()649   virtual truth AllowSparkling() const { return !Fluid; }
WeightIsIrrelevant()650   virtual truth WeightIsIrrelevant() const { return false; }
FindProtoType()651   virtual const prototype* FindProtoType() const { return &ProtoType; }
652   virtual truth AddStateDescription(festring&, truth) const;
653   virtual void AddContainerPostFix(festring&) const;
654   static const prototype ProtoType;
655   slot** Slot;
656   int Size;
657   ulong ID;
658   const database* DataBase;
659   long Volume;
660   long Weight;
661   idholder* CloneMotherID;
662   fluid** Fluid;
663   int SquaresUnder;
664   int LifeExpectancy;
665   festring label;
666   ulong ItemFlags;
667   int iRotateFlyingThrownStep;
668   truth ValidRecipeIngredient;
NeedsBurningPostFix()669   virtual truth NeedsBurningPostFix() const { return IsBurning(); }
670 };
671 
672 #ifdef __FILE_OF_STATIC_ITEM_PROTOTYPE_DEFINITIONS__
673 #define ITEM_PROTO(name, base)\
674 template<> const itemprototype\
675   name##sysbase::ProtoType(&base::ProtoType,\
676                            reinterpret_cast<itemspawner>(&name##sysbase::Spawn),\
677                            reinterpret_cast<itemcloner>(&name##sysbase::Clone), #name);
678 #else
679 #define ITEM_PROTO(name, base)
680 #endif
681 
682 #define ITEM(name, base)\
683 class name;\
684 typedef sysbase<name, base, itemprototype> name##sysbase;\
685 ITEM_PROTO(name, base)\
686 class name : public name##sysbase
687 
688 #endif
689