#include "lua/modules/items.hpp" #include #include #include #include "data/file.hpp" #include "itemdat.h" #include "items.h" #include "lua/metadoc.hpp" #include "player.h" #include "utils/utf8.hpp" namespace devilution { namespace { void InitItemUserType(sol::state_view &lua) { // Create a new usertype for Item with no constructor sol::usertype itemType = lua.new_usertype(sol::no_constructor); // Member variables LuaSetDocProperty(itemType, "seed", "number", "Randomly generated identifier", &Item::_iSeed); LuaSetDocProperty(itemType, "createInfo", "number", "Creation flags", &Item::getAllCreationFlags); LuaSetDocProperty(itemType, "type", "ItemType", "Item type", &Item::_itype); LuaSetDocProperty(itemType, "animFlag", "boolean", "Animation flag", &Item::_iAnimFlag); LuaSetDocProperty(itemType, "position", "Point", "Item world position", &Item::position); // TODO: Add AnimationInfo usertype // LuaSetDocProperty(itemType, "animInfo", "AnimationInfo", "Animation information", &Item::AnimInfo); LuaSetDocProperty(itemType, "delFlag", "boolean", "Deletion flag", &Item::_iDelFlag); LuaSetDocProperty(itemType, "selectionRegion", "number", "Selection region", &Item::selectionRegion); LuaSetDocProperty(itemType, "postDraw", "boolean", "Post-draw flag", &Item::_iPostDraw); LuaSetDocProperty(itemType, "identified", "boolean", "Identified flag", &Item::_iIdentified); LuaSetDocProperty(itemType, "magical", "number", "Item quality", &Item::_iMagical); LuaSetDocProperty(itemType, "name", "string", "Item name", [](const Item &i) { return std::string_view(i._iName); }, [](Item &i, std::string_view val) { CopyUtf8(i._iName, val, sizeof(i._iName)); }); LuaSetDocProperty(itemType, "iName", "string", "Identified item name", [](const Item &i) { return std::string_view(i._iIName); }, [](Item &i, std::string_view val) { CopyUtf8(i._iIName, val, sizeof(i._iIName)); }); LuaSetDocProperty(itemType, "loc", "ItemEquipType", "Equipment location", &Item::_iLoc); LuaSetDocProperty(itemType, "class", "ItemClass", "Item class", &Item::_iClass); LuaSetDocProperty(itemType, "curs", "number", "Cursor index", &Item::_iCurs); LuaSetDocProperty(itemType, "value", "number", "Item value", &Item::_ivalue); LuaSetDocProperty(itemType, "ivalue", "number", "Identified item value", &Item::_iIvalue); LuaSetDocProperty(itemType, "minDam", "number", "Minimum damage", &Item::_iMinDam); LuaSetDocProperty(itemType, "maxDam", "number", "Maximum damage", &Item::_iMaxDam); LuaSetDocProperty(itemType, "AC", "number", "Armor class", &Item::_iAC); LuaSetDocProperty(itemType, "flags", "ItemSpecialEffect", "Special effect flags", &Item::_iFlags); LuaSetDocProperty(itemType, "miscId", "ItemMiscID", "Miscellaneous ID", &Item::_iMiscId); LuaSetDocProperty(itemType, "spell", "SpellID", "Spell", &Item::_iSpell); LuaSetDocProperty(itemType, "IDidx", "ItemIndex", "Base item index", &Item::IDidx); LuaSetDocProperty(itemType, "charges", "number", "Number of charges", &Item::_iCharges); LuaSetDocProperty(itemType, "maxCharges", "number", "Maximum charges", &Item::_iMaxCharges); LuaSetDocProperty(itemType, "durability", "number", "Durability", &Item::_iDurability); LuaSetDocProperty(itemType, "maxDur", "number", "Maximum durability", &Item::_iMaxDur); LuaSetDocProperty(itemType, "PLDam", "number", "Damage % bonus", &Item::_iPLDam); LuaSetDocProperty(itemType, "PLToHit", "number", "Chance to hit bonus", &Item::_iPLToHit); LuaSetDocProperty(itemType, "PLAC", "number", "Armor class % bonus", &Item::_iPLAC); LuaSetDocProperty(itemType, "PLStr", "number", "Strength bonus", &Item::_iPLStr); LuaSetDocProperty(itemType, "PLMag", "number", "Magic bonus", &Item::_iPLMag); LuaSetDocProperty(itemType, "PLDex", "number", "Dexterity bonus", &Item::_iPLDex); LuaSetDocProperty(itemType, "PLVit", "number", "Vitality bonus", &Item::_iPLVit); LuaSetDocProperty(itemType, "PLFR", "number", "Fire resistance bonus", &Item::_iPLFR); LuaSetDocProperty(itemType, "PLLR", "number", "Lightning resistance bonus", &Item::_iPLLR); LuaSetDocProperty(itemType, "PLMR", "number", "Magic resistance bonus", &Item::_iPLMR); LuaSetDocProperty(itemType, "PLMana", "number", "Mana bonus", &Item::_iPLMana); LuaSetDocProperty(itemType, "PLHP", "number", "Life bonus", &Item::_iPLHP); LuaSetDocProperty(itemType, "PLDamMod", "number", "Damage modifier bonus", &Item::_iPLDamMod); LuaSetDocProperty(itemType, "PLGetHit", "number", "Damage from enemies bonus", &Item::_iPLGetHit); LuaSetDocProperty(itemType, "PLLight", "number", "Light bonus", &Item::_iPLLight); LuaSetDocProperty(itemType, "splLvlAdd", "number", "Spell level bonus", &Item::_iSplLvlAdd); LuaSetDocProperty(itemType, "request", "boolean", "Request flag", &Item::_iRequest); LuaSetDocProperty(itemType, "uid", "number", "Unique item ID", &Item::_iUid); LuaSetDocProperty(itemType, "fMinDam", "number", "Fire minimum damage", &Item::_iFMinDam); LuaSetDocProperty(itemType, "fMaxDam", "number", "Fire maximum damage", &Item::_iFMaxDam); LuaSetDocProperty(itemType, "lMinDam", "number", "Lightning minimum damage", &Item::_iLMinDam); LuaSetDocProperty(itemType, "lMaxDam", "number", "Lightning maximum damage", &Item::_iLMaxDam); LuaSetDocProperty(itemType, "PLEnAc", "number", "Damage target AC bonus", &Item::_iPLEnAc); LuaSetDocProperty(itemType, "prePower", "ItemEffectType", "Prefix power", &Item::_iPrePower); LuaSetDocProperty(itemType, "sufPower", "ItemEffectType", "Suffix power", &Item::_iSufPower); LuaSetDocProperty(itemType, "vAdd1", "number", "Value addition 1", &Item::_iVAdd1); LuaSetDocProperty(itemType, "vMult1", "number", "Value multiplier 1", &Item::_iVMult1); LuaSetDocProperty(itemType, "vAdd2", "number", "Value addition 2", &Item::_iVAdd2); LuaSetDocProperty(itemType, "vMult2", "number", "Value multiplier 2", &Item::_iVMult2); LuaSetDocProperty(itemType, "minStr", "number", "Minimum strength required", &Item::_iMinStr); LuaSetDocProperty(itemType, "minMag", "number", "Minimum magic required", &Item::_iMinMag); LuaSetDocProperty(itemType, "minDex", "number", "Minimum dexterity required", &Item::_iMinDex); LuaSetDocProperty(itemType, "statFlag", "boolean", "Equippable flag", &Item::_iStatFlag); LuaSetDocProperty(itemType, "damAcFlags", "ItemSpecialEffectHf", "Secondary special effect flags", &Item::_iDamAcFlags); LuaSetDocProperty(itemType, "buff", "number", "Secondary creation flags", &Item::getAllCreationFlags2); // Member functions LuaSetDocFn(itemType, "pop", "() -> Item", "Clears this item and returns the old value", &Item::pop); LuaSetDocFn(itemType, "clear", "() -> void", "Resets the item", &Item::clear); LuaSetDocFn(itemType, "isEmpty", "() -> boolean", "Checks whether this item is empty", &Item::isEmpty); LuaSetDocFn(itemType, "isEquipment", "() -> boolean", "Checks if item is equipment", &Item::isEquipment); LuaSetDocFn(itemType, "isWeapon", "() -> boolean", "Checks if item is a weapon", &Item::isWeapon); LuaSetDocFn(itemType, "isArmor", "() -> boolean", "Checks if item is armor", &Item::isArmor); LuaSetDocFn(itemType, "isGold", "() -> boolean", "Checks if item is gold", &Item::isGold); LuaSetDocFn(itemType, "isHelm", "() -> boolean", "Checks if item is a helm", &Item::isHelm); LuaSetDocFn(itemType, "isShield", "() -> boolean", "Checks if item is a shield", &Item::isShield); LuaSetDocFn(itemType, "isJewelry", "() -> boolean", "Checks if item is jewelry", &Item::isJewelry); LuaSetDocFn(itemType, "isScroll", "() -> boolean", "Checks if item is a scroll", &Item::isScroll); LuaSetDocFn(itemType, "isScrollOf", "(spell: SpellID) -> boolean", "Checks if item is a scroll of a given spell", &Item::isScrollOf); LuaSetDocFn(itemType, "isRune", "() -> boolean", "Checks if item is a rune", &Item::isRune); LuaSetDocFn(itemType, "isRuneOf", "(spell: SpellID) -> boolean", "Checks if item is a rune of a given spell", &Item::isRuneOf); LuaSetDocFn(itemType, "isUsable", "() -> boolean", "Checks if item is usable", &Item::isUsable); LuaSetDocFn(itemType, "keyAttributesMatch", "(seed: number, idx: number, createInfo: number) -> boolean", "Checks if key attributes match", &Item::keyAttributesMatch); LuaSetDocFn(itemType, "getTextColor", "() -> UiFlags", "Gets the text color", &Item::getTextColor); LuaSetDocFn(itemType, "getTextColorWithStatCheck", "() -> UiFlags", "Gets the text color with stat check", &Item::getTextColorWithStatCheck); LuaSetDocFn(itemType, "setNewAnimation", "(showAnimation: boolean) -> void", "Sets the new animation", &Item::setNewAnimation); LuaSetDocFn(itemType, "updateRequiredStatsCacheForPlayer", "(player: Player) -> void", "Updates the required stats cache", &Item::updateRequiredStatsCacheForPlayer); LuaSetDocFn(itemType, "getName", "() -> string", "Gets the translated item name", &Item::getName); } void RegisterItemTypeEnum(sol::state_view &lua) { lua.new_enum("ItemType", { { "Misc", ItemType::Misc }, { "Sword", ItemType::Sword }, { "Axe", ItemType::Axe }, { "Bow", ItemType::Bow }, { "Mace", ItemType::Mace }, { "Shield", ItemType::Shield }, { "LightArmor", ItemType::LightArmor }, { "Helm", ItemType::Helm }, { "MediumArmor", ItemType::MediumArmor }, { "HeavyArmor", ItemType::HeavyArmor }, { "Staff", ItemType::Staff }, { "Gold", ItemType::Gold }, { "Ring", ItemType::Ring }, { "Amulet", ItemType::Amulet }, { "None", ItemType::None }, }); } void RegisterItemEquipTypeEnum(sol::state_view &lua) { lua.new_enum("ItemEquipType", { { "None", ILOC_NONE }, { "OneHand", ILOC_ONEHAND }, { "TwoHand", ILOC_TWOHAND }, { "Armor", ILOC_ARMOR }, { "Helm", ILOC_HELM }, { "Ring", ILOC_RING }, { "Amulet", ILOC_AMULET }, { "Unequipable", ILOC_UNEQUIPABLE }, { "Belt", ILOC_BELT }, { "Invalid", ILOC_INVALID }, }); } void RegisterItemClassEnum(sol::state_view &lua) { lua.new_enum("ItemClass", { { "None", ICLASS_NONE }, { "Weapon", ICLASS_WEAPON }, { "Armor", ICLASS_ARMOR }, { "Misc", ICLASS_MISC }, { "Gold", ICLASS_GOLD }, { "Quest", ICLASS_QUEST }, }); } void RegisterItemSpecialEffectEnum(sol::state_view &lua) { lua.new_enum("ItemSpecialEffect", { { "None", ItemSpecialEffect::None }, { "RandomStealLife", ItemSpecialEffect::RandomStealLife }, { "RandomArrowVelocity", ItemSpecialEffect::RandomArrowVelocity }, { "FireArrows", ItemSpecialEffect::FireArrows }, { "FireDamage", ItemSpecialEffect::FireDamage }, { "LightningDamage", ItemSpecialEffect::LightningDamage }, { "DrainLife", ItemSpecialEffect::DrainLife }, { "MultipleArrows", ItemSpecialEffect::MultipleArrows }, { "Knockback", ItemSpecialEffect::Knockback }, { "StealMana3", ItemSpecialEffect::StealMana3 }, { "StealMana5", ItemSpecialEffect::StealMana5 }, { "StealLife3", ItemSpecialEffect::StealLife3 }, { "StealLife5", ItemSpecialEffect::StealLife5 }, { "QuickAttack", ItemSpecialEffect::QuickAttack }, { "FastAttack", ItemSpecialEffect::FastAttack }, { "FasterAttack", ItemSpecialEffect::FasterAttack }, { "FastestAttack", ItemSpecialEffect::FastestAttack }, { "FastHitRecovery", ItemSpecialEffect::FastHitRecovery }, { "FasterHitRecovery", ItemSpecialEffect::FasterHitRecovery }, { "FastestHitRecovery", ItemSpecialEffect::FastestHitRecovery }, { "FastBlock", ItemSpecialEffect::FastBlock }, { "LightningArrows", ItemSpecialEffect::LightningArrows }, { "Thorns", ItemSpecialEffect::Thorns }, { "NoMana", ItemSpecialEffect::NoMana }, { "HalfTrapDamage", ItemSpecialEffect::HalfTrapDamage }, { "TripleDemonDamage", ItemSpecialEffect::TripleDemonDamage }, { "ZeroResistance", ItemSpecialEffect::ZeroResistance }, }); } void RegisterItemMiscIDEnum(sol::state_view &lua) { lua.new_enum("ItemMiscID", { { "None", IMISC_NONE }, { "FullHeal", IMISC_FULLHEAL }, { "Heal", IMISC_HEAL }, { "Mana", IMISC_MANA }, { "FullMana", IMISC_FULLMANA }, { "ElixirStr", IMISC_ELIXSTR }, { "ElixirMag", IMISC_ELIXMAG }, { "ElixirDex", IMISC_ELIXDEX }, { "ElixirVit", IMISC_ELIXVIT }, { "Rejuv", IMISC_REJUV }, { "FullRejuv", IMISC_FULLREJUV }, { "Scroll", IMISC_SCROLL }, { "ScrollT", IMISC_SCROLLT }, { "Staff", IMISC_STAFF }, { "Book", IMISC_BOOK }, { "Ring", IMISC_RING }, { "Amulet", IMISC_AMULET }, { "Unique", IMISC_UNIQUE }, }); } void RegisterSpellIDEnum(sol::state_view &lua) { lua.new_enum("SpellID", { { "Null", SpellID::Null }, { "Firebolt", SpellID::Firebolt }, { "Healing", SpellID::Healing }, { "Lightning", SpellID::Lightning }, { "Flash", SpellID::Flash }, { "Identify", SpellID::Identify }, { "FireWall", SpellID::FireWall }, { "TownPortal", SpellID::TownPortal }, { "StoneCurse", SpellID::StoneCurse }, { "Infravision", SpellID::Infravision }, { "Phasing", SpellID::Phasing }, { "ManaShield", SpellID::ManaShield }, { "Fireball", SpellID::Fireball }, { "Guardian", SpellID::Guardian }, { "ChainLightning", SpellID::ChainLightning }, { "FlameWave", SpellID::FlameWave }, { "DoomSerpents", SpellID::DoomSerpents }, { "BloodRitual", SpellID::BloodRitual }, { "Nova", SpellID::Nova }, { "Invisibility", SpellID::Invisibility }, { "Inferno", SpellID::Inferno }, { "Golem", SpellID::Golem }, { "Rage", SpellID::Rage }, { "Teleport", SpellID::Teleport }, { "Apocalypse", SpellID::Apocalypse }, { "Etherealize", SpellID::Etherealize }, { "ItemRepair", SpellID::ItemRepair }, { "StaffRecharge", SpellID::StaffRecharge }, { "TrapDisarm", SpellID::TrapDisarm }, { "Elemental", SpellID::Elemental }, { "ChargedBolt", SpellID::ChargedBolt }, { "HolyBolt", SpellID::HolyBolt }, { "Resurrect", SpellID::Resurrect }, { "Telekinesis", SpellID::Telekinesis }, { "HealOther", SpellID::HealOther }, { "BloodStar", SpellID::BloodStar }, { "BoneSpirit", SpellID::BoneSpirit }, { "Mana", SpellID::Mana }, { "Magi", SpellID::Magi }, { "Jester", SpellID::Jester }, { "LightningWall", SpellID::LightningWall }, { "Immolation", SpellID::Immolation }, { "Warp", SpellID::Warp }, { "Reflect", SpellID::Reflect }, { "Berserk", SpellID::Berserk }, { "RingOfFire", SpellID::RingOfFire }, { "Search", SpellID::Search }, { "RuneOfFire", SpellID::RuneOfFire }, { "RuneOfLight", SpellID::RuneOfLight }, { "RuneOfNova", SpellID::RuneOfNova }, { "RuneOfImmolation", SpellID::RuneOfImmolation }, { "RuneOfStone", SpellID::RuneOfStone }, { "Invalid", SpellID::Invalid }, }); } void RegisterItemIndexEnum(sol::state_view &lua) { lua.new_enum<_item_indexes>("ItemIndex", { { "Gold", IDI_GOLD }, { "Warrior", IDI_WARRIOR }, { "WarriorShield", IDI_WARRSHLD }, { "WarriorClub", IDI_WARRCLUB }, { "Rogue", IDI_ROGUE }, { "Sorcerer", IDI_SORCERER }, { "Cleaver", IDI_CLEAVER }, { "FirstQuest", IDI_FIRSTQUEST }, { "SkeletonKingCrown", IDI_SKCROWN }, { "InfravisionRing", IDI_INFRARING }, { "Rock", IDI_ROCK }, { "OpticAmulet", IDI_OPTAMULET }, { "TruthRing", IDI_TRING }, { "Banner", IDI_BANNER }, { "HarlequinCrest", IDI_HARCREST }, { "SteelVeil", IDI_STEELVEIL }, { "GoldenElixir", IDI_GLDNELIX }, { "Anvil", IDI_ANVIL }, { "Mushroom", IDI_MUSHROOM }, { "Brain", IDI_BRAIN }, { "FungalTome", IDI_FUNGALTM }, { "SpectralElixir", IDI_SPECELIX }, { "BloodStone", IDI_BLDSTONE }, { "MapOfDoom", IDI_MAPOFDOOM }, { "LastQuest", IDI_LASTQUEST }, { "Ear", IDI_EAR }, { "Heal", IDI_HEAL }, { "Mana", IDI_MANA }, { "Identify", IDI_IDENTIFY }, { "Portal", IDI_PORTAL }, { "ArmorOfValor", IDI_ARMOFVAL }, { "FullHeal", IDI_FULLHEAL }, { "FullMana", IDI_FULLMANA }, { "Griswold", IDI_GRISWOLD }, { "Lightforge", IDI_LGTFORGE }, { "LazarusStaff", IDI_LAZSTAFF }, { "Resurrect", IDI_RESURRECT }, { "Oil", IDI_OIL }, { "ShortStaff", IDI_SHORTSTAFF }, { "BardSword", IDI_BARDSWORD }, { "BardDagger", IDI_BARDDAGGER }, { "RuneBomb", IDI_RUNEBOMB }, { "Theodore", IDI_THEODORE }, { "Auric", IDI_AURIC }, { "Note1", IDI_NOTE1 }, { "Note2", IDI_NOTE2 }, { "Note3", IDI_NOTE3 }, { "FullNote", IDI_FULLNOTE }, { "BrownSuit", IDI_BROWNSUIT }, { "GreySuit", IDI_GREYSUIT }, { "Book1", IDI_BOOK1 }, { "Book2", IDI_BOOK2 }, { "Book3", IDI_BOOK3 }, { "Book4", IDI_BOOK4 }, { "Barbarian", IDI_BARBARIAN }, { "ShortBattleBow", IDI_SHORT_BATTLE_BOW }, { "RuneOfStone", IDI_RUNEOFSTONE }, { "SorcererDiablo", IDI_SORCERER_DIABLO }, { "ArenaPotion", IDI_ARENAPOT }, { "None", IDI_NONE }, }); } void RegisterItemEffectTypeEnum(sol::state_view &lua) { lua.new_enum("ItemEffectType", { { "ToHit", IPL_TOHIT }, { "ToHitCurse", IPL_TOHIT_CURSE }, { "DamagePercent", IPL_DAMP }, { "DamagePercentCurse", IPL_DAMP_CURSE }, { "ToHitDamagePercent", IPL_TOHIT_DAMP }, { "ToHitDamagePercentCurse", IPL_TOHIT_DAMP_CURSE }, { "ArmorClassPercent", IPL_ACP }, { "ArmorClassPercentCurse", IPL_ACP_CURSE }, { "FireResist", IPL_FIRERES }, { "LightningResist", IPL_LIGHTRES }, { "MagicResist", IPL_MAGICRES }, { "AllResist", IPL_ALLRES }, { "SpellLevelAdd", IPL_SPLLVLADD }, { "Charges", IPL_CHARGES }, { "FireDamage", IPL_FIREDAM }, { "LightningDamage", IPL_LIGHTDAM }, { "Strength", IPL_STR }, { "StrengthCurse", IPL_STR_CURSE }, { "Magic", IPL_MAG }, { "MagicCurse", IPL_MAG_CURSE }, { "Dexterity", IPL_DEX }, { "DexterityCurse", IPL_DEX_CURSE }, { "Vitality", IPL_VIT }, { "VitalityCurse", IPL_VIT_CURSE }, { "Attributes", IPL_ATTRIBS }, { "AttributesCurse", IPL_ATTRIBS_CURSE }, { "GetHitCurse", IPL_GETHIT_CURSE }, { "GetHit", IPL_GETHIT }, { "Life", IPL_LIFE }, { "LifeCurse", IPL_LIFE_CURSE }, { "Mana", IPL_MANA }, { "ManaCurse", IPL_MANA_CURSE }, { "Durability", IPL_DUR }, { "DurabilityCurse", IPL_DUR_CURSE }, { "Indestructible", IPL_INDESTRUCTIBLE }, { "Light", IPL_LIGHT }, { "LightCurse", IPL_LIGHT_CURSE }, { "MultipleArrows", IPL_MULT_ARROWS }, { "FireArrows", IPL_FIRE_ARROWS }, { "LightningArrows", IPL_LIGHT_ARROWS }, { "Thorns", IPL_THORNS }, { "NoMana", IPL_NOMANA }, { "Fireball", IPL_FIREBALL }, { "AbsorbHalfTrap", IPL_ABSHALFTRAP }, { "Knockback", IPL_KNOCKBACK }, { "StealMana", IPL_STEALMANA }, { "StealLife", IPL_STEALLIFE }, { "TargetArmorClass", IPL_TARGAC }, { "FastAttack", IPL_FASTATTACK }, { "FastRecover", IPL_FASTRECOVER }, { "FastBlock", IPL_FASTBLOCK }, { "DamageModifier", IPL_DAMMOD }, { "RandomArrowVelocity", IPL_RNDARROWVEL }, { "SetDamage", IPL_SETDAM }, { "SetDurability", IPL_SETDUR }, { "NoMinimumStrength", IPL_NOMINSTR }, { "Spell", IPL_SPELL }, { "OneHand", IPL_ONEHAND }, { "3xDamageVsDemons", IPL_3XDAMVDEM }, { "AllResistZero", IPL_ALLRESZERO }, { "DrainLife", IPL_DRAINLIFE }, { "RandomStealLife", IPL_RNDSTEALLIFE }, { "SetArmorClass", IPL_SETAC }, { "AddArmorClassLife", IPL_ADDACLIFE }, { "AddManaArmorClass", IPL_ADDMANAAC }, { "ArmorClassCurse", IPL_AC_CURSE }, { "LastDiablo", IPL_LASTDIABLO }, { "FireResistCurse", IPL_FIRERES_CURSE }, { "LightResistCurse", IPL_LIGHTRES_CURSE }, { "MagicResistCurse", IPL_MAGICRES_CURSE }, { "Devastation", IPL_DEVASTATION }, { "Decay", IPL_DECAY }, { "Peril", IPL_PERIL }, { "Jesters", IPL_JESTERS }, { "Crystalline", IPL_CRYSTALLINE }, { "Doppelganger", IPL_DOPPELGANGER }, { "ArmorClassDemon", IPL_ACDEMON }, { "ArmorClassUndead", IPL_ACUNDEAD }, { "ManaToLife", IPL_MANATOLIFE }, { "LifeToMana", IPL_LIFETOMANA }, { "Invalid", IPL_INVALID }, }); } void RegisterItemSpecialEffectHfEnum(sol::state_view &lua) { lua.new_enum("ItemSpecialEffectHf", { { "None", ItemSpecialEffectHf::None }, { "Devastation", ItemSpecialEffectHf::Devastation }, { "Decay", ItemSpecialEffectHf::Decay }, { "Peril", ItemSpecialEffectHf::Peril }, { "Jesters", ItemSpecialEffectHf::Jesters }, { "Doppelganger", ItemSpecialEffectHf::Doppelganger }, { "ACAgainstDemons", ItemSpecialEffectHf::ACAgainstDemons }, { "ACAgainstUndead", ItemSpecialEffectHf::ACAgainstUndead }, }); } void AddItemDataFromTsv(const std::string_view path, const int32_t baseMappingId) { DataFile dataFile = DataFile::loadOrDie(path); LoadItemDatFromFile(dataFile, path, baseMappingId); } void AddUniqueItemDataFromTsv(const std::string_view path, const int32_t baseMappingId) { DataFile dataFile = DataFile::loadOrDie(path); LoadUniqueItemDatFromFile(dataFile, path, baseMappingId); } } // namespace sol::table LuaItemModule(sol::state_view &lua) { InitItemUserType(lua); RegisterItemTypeEnum(lua); RegisterItemEquipTypeEnum(lua); RegisterItemClassEnum(lua); RegisterItemSpecialEffectEnum(lua); RegisterItemMiscIDEnum(lua); RegisterSpellIDEnum(lua); RegisterItemIndexEnum(lua); RegisterItemEffectTypeEnum(lua); RegisterItemSpecialEffectHfEnum(lua); sol::table table = lua.create_table(); LuaSetDocFn(table, "addItemDataFromTsv", "(path: string, baseMappingId: number)", AddItemDataFromTsv); LuaSetDocFn(table, "addUniqueItemDataFromTsv", "(path: string, baseMappingId: number)", AddUniqueItemDataFromTsv); return table; } } // namespace devilution