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