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