diff --git a/Source/itemdat.cpp b/Source/itemdat.cpp index 3e5181e2563..2c87c5dc750 100644 --- a/Source/itemdat.cpp +++ b/Source/itemdat.cpp @@ -428,7 +428,7 @@ const PLStruct ItemSuffixes[] = { /** Contains the data related to each unique item ID. */ const UniqueItem UniqueItems[] = { // clang-format off -// UIName, UIItemId, UIMinLvl, UINumPL, UIValue, { ItemPower[0], ItemPower[1], ItemPower[2], ItemPower[3], ItemPower[4], ItemPower[5] } +// UIName, UIItemId, UIMinLvl, UINumPL, UIValue, { ItemPower[0], ItemPower[1], ItemPower[2], ItemPower[3], ItemPower[4], ItemPower[5] } // TRANSLATORS: Unique Item section { N_("The Butcher's Cleaver"), UITYPE_CLEAVER, 1, 3, 3650, { { IPL_STR, 10, 10 }, { IPL_SETDAM, 4, 24 }, { IPL_SETDUR, 10, 10 }, { }, { }, { } } }, { N_("The Undead Crown"), UITYPE_SKCROWN, 1, 3, 16650, { { IPL_RNDSTEALLIFE }, { IPL_SETAC, 8, 8 }, { IPL_INVCURS, 77 }, { }, { }, { } } }, diff --git a/Source/misdat.cpp b/Source/misdat.cpp index 39e895f88b3..fcbca78fb95 100644 --- a/Source/misdat.cpp +++ b/Source/misdat.cpp @@ -16,7 +16,7 @@ namespace devilution { /** Data related to each missile ID. */ MissileData MissilesData[] = { // clang-format off -// mAddProc, mProc, name, mDraw, mType, damageType, mFileNum, mlSFX, miSFX, MovementDistribution; +// mAddProc, mProc, name, mDraw, mType, damageType, mFileNum, mlSFX, miSFX, MovementDistribution; { &AddArrow, &MI_Arrow, MissileID::Arrow, true, 0, DamageType::Physical, MFILE_ARROWS, SFX_NONE, SFX_NONE, MissileMovementDistribution::Blockable }, { &AddFirebolt, &MI_Firebolt, MissileID::Firebolt, true, 1, DamageType::Fire, MFILE_FIREBA, LS_FBOLT1, LS_FIRIMP2, MissileMovementDistribution::Blockable }, { &AddGuardian, &MI_Guardian, MissileID::Guardian, true, 1, DamageType::Physical, MFILE_GUARD, LS_GUARD, LS_GUARDLAN, MissileMovementDistribution::Disabled }, diff --git a/Source/monstdat.cpp b/Source/monstdat.cpp index df54482c725..59e27c3ee8b 100644 --- a/Source/monstdat.cpp +++ b/Source/monstdat.cpp @@ -336,7 +336,7 @@ const _monster_id MonstConvTbl[] = { /** Contains the data related to each unique monster ID. */ const UniqueMonsterData UniqueMonstersData[] = { // clang-format off -// mtype, mName, mTrnName, mlevel, mmaxhp, mAi, mint, mMinDamage, mMaxDamage, mMagicRes, monsterPack, customToHit, customArmorClass, mtalkmsg +// mtype, mName, mTrnName, mlevel, mmaxhp, mAi, mint, mMinDamage, mMaxDamage, mMagicRes, monsterPack, customToHit, customArmorClass, mtalkmsg // TRANSLATORS: Unique Monster Block start { MT_NGOATMC, P_("monster", "Gharbad the Weak"), "bsdb", 4, 120, AI_GARBUD, 3, 8, 16, IMMUNE_LIGHTNING, UniqueMonsterPack::None, 0, 0, TEXT_GARBUD1 }, { MT_SKING, P_("monster", "Skeleton King"), "genrl", 0, 240, AI_SKELKING, 3, 6, 16, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING, UniqueMonsterPack::Independent, 0, 0, TEXT_NONE }, diff --git a/Source/objdat.cpp b/Source/objdat.cpp index b726762917e..37ba8a1d80a 100644 --- a/Source/objdat.cpp +++ b/Source/objdat.cpp @@ -158,119 +158,128 @@ const _object_id ObjTypeConv[] = { OBJ_L5SARC, }; +namespace { +constexpr auto Animated = ObjectDataFlags::Animated; +constexpr auto Solid = ObjectDataFlags::Solid; +constexpr auto MissilesPassThrough = ObjectDataFlags::MissilesPassThrough; +constexpr auto Light = ObjectDataFlags::Light; +constexpr auto Trap = ObjectDataFlags::Trap; +constexpr auto Breakable = ObjectDataFlags::Breakable; +} // namespace + /** Contains the data related to each object ID. */ const ObjectData AllObjects[109] = { // clang-format off - // ofindex, ominlvl, omaxlvl, olvltype, otheme, oquest, oAnimFlag, oAnimDelay, oAnimLen, oAnimWidth, oSolidFlag, oMissFlag, oLightFlag, oBreak, oSelFlag, oTrapFlag - { OFILE_L1BRAZ, 0, 0, DTYPE_CATHEDRAL, THEME_NONE, Q_INVALID, true, 1, 26, 64, true, true, false, 0, 0, false }, - { OFILE_L1DOORS, 0, 0, DTYPE_CATHEDRAL, THEME_NONE, Q_INVALID, false, 1, 0, 64, false, false, true, 0, 3, true }, - { OFILE_L1DOORS, 0, 0, DTYPE_CATHEDRAL, THEME_NONE, Q_INVALID, false, 2, 0, 64, false, false, true, 0, 3, true }, - { OFILE_SKULFIRE, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, true, 2, 11, 96, true, true, false, 0, 0, false }, - { OFILE_LEVER, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 1, 96, true, true, true, 0, 1, true }, - { OFILE_CHEST1, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, true }, - { OFILE_CHEST2, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, true }, - { OFILE_CHEST3, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, true }, - { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 0, 0, 0, false, false, false, 0, 0, false }, - { OFILE_CANDLE2, 0, 0, DTYPE_NONE, THEME_SHRINE, Q_PWATER, true, 2, 4, 96, true, true, true, 0, 0, false }, - { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 0, 0, 0, false, false, false, 0, 0, false }, - { OFILE_BANNER, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, false, 2, 0, 96, true, true, true, 0, 0, false }, - { OFILE_BANNER, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 0, false }, - { OFILE_BANNER, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, false, 3, 0, 96, true, true, true, 0, 0, false }, - { OFILE_SKULPILE, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 1, 96, true, true, true, 0, 0, false }, - { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 0, 0, 0, false, false, false, 0, 0, false }, - { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 0, 0, 0, false, false, false, 0, 0, false }, - { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 0, 0, 0, false, false, false, 0, 0, false }, - { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 0, 0, 0, false, false, false, 0, 0, false }, - { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 0, 0, 0, false, false, false, 0, 0, false }, - { OFILE_CRUXSK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 15, 96, true, false, true, 1, 3, false }, - { OFILE_CRUXSK2, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 15, 96, true, false, true, 1, 3, false }, - { OFILE_CRUXSK3, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 15, 96, true, false, true, 1, 3, false }, - { OFILE_ROCKSTAN, 5, 5, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 0, false }, - { OFILE_ANGEL, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, false, true, 0, 0, false }, - { OFILE_BOOK2, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 3, false }, - { OFILE_BURNCROS, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, true, 0, 10, 160, true, false, false, 0, 0, false }, - { OFILE_NUDE2, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, true, 3, 6, 128, true, false, true, 0, 0, false }, - { OFILE_SWITCH4, 16, 16, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, true }, - { OFILE_TNUDEM, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, false, 1, 0, 128, true, false, true, 0, 0, false }, - { OFILE_TNUDEM, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, false, 2, 0, 128, true, false, true, 0, 0, false }, - { OFILE_TNUDEM, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, false, 3, 0, 128, true, false, true, 0, 0, false }, - { OFILE_TNUDEM, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, false, 4, 0, 128, true, false, true, 0, 0, false }, - { OFILE_TNUDEW, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, false, 1, 0, 128, true, false, true, 0, 0, false }, - { OFILE_TNUDEW, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, false, 2, 0, 128, true, false, true, 0, 0, false }, - { OFILE_TNUDEW, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, false, 3, 0, 128, true, false, true, 0, 0, false }, - { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, false, 1, 0, 128, false, true, true, 0, 0, false }, - { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, false, 2, 0, 128, false, true, true, 0, 0, false }, - { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, false, 3, 0, 128, false, true, true, 0, 0, false }, - { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, false, 4, 0, 128, false, true, true, 0, 0, false }, - { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, false, 5, 0, 128, false, true, true, 0, 0, false }, - { OFILE_BOOK2, 6, 6, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 4, 0, 96, true, true, true, 0, 3, false }, - { OFILE_L2DOORS, 0, 0, DTYPE_CATACOMBS, THEME_NONE, Q_INVALID, false, 1, 0, 64, false, false, true, 0, 3, true }, - { OFILE_L2DOORS, 0, 0, DTYPE_CATACOMBS, THEME_NONE, Q_INVALID, false, 2, 0, 64, false, false, true, 0, 3, true }, - { OFILE_WTORCH4, 5, 8, DTYPE_NONE, THEME_NONE, Q_INVALID, true, 1, 9, 96, false, true, false, 0, 0, false }, - { OFILE_WTORCH3, 5, 8, DTYPE_NONE, THEME_NONE, Q_INVALID, true, 1, 9, 96, false, true, false, 0, 0, false }, - { OFILE_WTORCH1, 5, 8, DTYPE_NONE, THEME_NONE, Q_INVALID, true, 1, 9, 96, false, true, false, 0, 0, false }, - { OFILE_WTORCH2, 5, 8, DTYPE_NONE, THEME_NONE, Q_INVALID, true, 1, 9, 96, false, true, false, 0, 0, false }, - { OFILE_SARC, 1, 4, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 5, 128, true, true, true, 0, 3, true }, - { OFILE_FLAME1, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 20, 96, false, true, true, 0, 0, false }, - { OFILE_LEVER, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 2, 96, true, true, true, 0, 1, true }, - { OFILE_MINIWATR, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, true, 1, 10, 64, true, false, true, 0, 0, false }, - { OFILE_BOOK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 3, false }, - { OFILE_TRAPHOLE, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 64, false, true, true, 0, 0, false }, - { OFILE_TRAPHOLE, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 2, 0, 64, false, true, true, 0, 0, false }, - { OFILE_BCASE, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, false, true, 0, 0, false }, - { OFILE_WEAPSTND, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, false, true, 0, 0, false }, - { OFILE_BARREL, 1, 15, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 9, 96, true, true, true, 1, 3, false }, - { OFILE_BARRELEX, 1, 15, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 10, 96, true, true, true, 1, 3, false }, - { OFILE_LSHRINEG, 0, 0, DTYPE_NONE, THEME_SHRINE, Q_INVALID, false, 1, 11, 128, false, false, true, 0, 3, false }, - { OFILE_RSHRINEG, 0, 0, DTYPE_NONE, THEME_SHRINE, Q_INVALID, false, 1, 11, 128, false, false, true, 0, 3, false }, - { OFILE_BOOK2, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, false, 4, 0, 96, true, true, true, 0, 3, false }, - { OFILE_BCASE, 0, 0, DTYPE_NONE, THEME_LIBRARY, Q_INVALID, false, 3, 0, 96, false, false, true, 0, 3, false }, - { OFILE_BCASE, 0, 0, DTYPE_NONE, THEME_LIBRARY, Q_INVALID, false, 4, 0, 96, false, false, true, 0, 3, false }, - { OFILE_BOOK2, 0, 0, DTYPE_NONE, THEME_LIBRARY, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 3, false }, - { OFILE_CANDLE2, 0, 0, DTYPE_NONE, THEME_LIBRARY, Q_INVALID, true, 2, 4, 96, true, true, true, 0, 0, false }, - { OFILE_BLOODFNT, 0, 0, DTYPE_NONE, THEME_BLOODFOUNTAIN, Q_INVALID, true, 2, 10, 96, true, true, true, 0, 3, false }, - { OFILE_DECAP, 13, 15, DTYPE_NONE, THEME_DECAPITATED, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, false }, - { OFILE_CHEST1, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, true }, - { OFILE_CHEST2, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, true }, - { OFILE_CHEST3, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, true }, - { OFILE_BOOK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_BLIND, false, 1, 0, 96, true, true, true, 0, 3, false }, - { OFILE_BOOK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_BLOOD, false, 4, 0, 96, true, true, true, 0, 3, false }, - { OFILE_PEDISTL, 0, 0, DTYPE_NONE, THEME_NONE, Q_BLOOD, false, 1, 0, 96, true, true, true, 0, 3, false }, - { OFILE_L3DOORS, 0, 0, DTYPE_CAVES, THEME_NONE, Q_INVALID, false, 1, 0, 64, false, false, true, 0, 3, true }, - { OFILE_L3DOORS, 0, 0, DTYPE_CAVES, THEME_NONE, Q_INVALID, false, 2, 0, 64, false, false, true, 0, 3, true }, - { OFILE_PFOUNTN, 0, 0, DTYPE_NONE, THEME_PURIFYINGFOUNTAIN, Q_INVALID, true, 2, 10, 128, true, true, true, 0, 3, false }, - { OFILE_ARMSTAND, 0, 0, DTYPE_NONE, THEME_ARMORSTAND, Q_INVALID, false, 1, 0, 96, true, false, true, 0, 3, false }, - { OFILE_ARMSTAND, 0, 0, DTYPE_NONE, THEME_ARMORSTAND, Q_INVALID, false, 2, 0, 96, true, false, true, 0, 0, false }, - { OFILE_GOATSHRN, 0, 0, DTYPE_NONE, THEME_GOATSHRINE, Q_INVALID, true, 2, 10, 96, true, true, true, 0, 3, false }, - { OFILE_CAULDREN, 13, 15, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, false, true, 0, 3, false }, - { OFILE_MFOUNTN, 0, 0, DTYPE_NONE, THEME_MURKYFOUNTAIN, Q_INVALID, true, 2, 10, 128, true, true, true, 0, 3, false }, - { OFILE_TFOUNTN, 0, 0, DTYPE_NONE, THEME_TEARFOUNTAIN, Q_INVALID, true, 2, 4, 128, true, true, true, 0, 3, false }, - { OFILE_ALTBOY, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, false, 1, 0, 128, true, true, true, 0, 0, false }, - { OFILE_MCIRL, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, false, 1, 0, 96, false, true, true, 0, 0, false }, - { OFILE_MCIRL, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, false, 1, 0, 96, false, true, true, 0, 0, false }, - { OFILE_BKSLBRNT, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 3, false }, - { OFILE_CANDLE2, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, true, 2, 4, 96, true, true, true, 0, 0, false }, - { OFILE_BOOK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_WARLORD, false, 4, 0, 96, true, true, true, 0, 3, false }, - { OFILE_ARMSTAND, 0, 0, DTYPE_NONE, THEME_NONE, Q_WARLORD, false, 1, 0, 96, true, false, true, 0, 3, false }, - { OFILE_WEAPSTND, 0, 0, DTYPE_NONE, THEME_NONE, Q_WARLORD, false, 1, 0, 96, true, false, true, 0, 3, false }, - { OFILE_BURNCROS, 0, 0, DTYPE_NONE, THEME_BRNCROSS, Q_INVALID, true, 0, 10, 160, true, false, false, 0, 0, false }, - { OFILE_WEAPSTND, 0, 0, DTYPE_NONE, THEME_WEAPONRACK, Q_INVALID, false, 1, 0, 96, true, false, true, 0, 3, false }, - { OFILE_WEAPSTND, 0, 0, DTYPE_NONE, THEME_WEAPONRACK, Q_INVALID, false, 2, 0, 96, true, false, true, 0, 0, false }, - { OFILE_MUSHPTCH, 0, 0, DTYPE_NONE, THEME_NONE, Q_MUSHROOM, false, 1, 0, 96, true, true, true, 0, 3, true }, - { OFILE_LZSTAND, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, false, 1, 0, 128, true, false, true, 0, 3, false }, - { OFILE_DECAP, 9, 9, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 2, 0, 96, true, true, true, 0, 1, false }, - { OFILE_CHEST3, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 1, true }, - { OFILE_BCASE, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 2, 0, 96, true, false, true, 0, 0, false }, - { OFILE_POD, 17, 20, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 9, 96, true, true, true, 1, 3, false }, - { OFILE_PODEX, 17, 20, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 10, 96, true, true, true, 1, 3, false }, - { OFILE_URN, 21, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 9, 96, true, true, true, 1, 3, false }, - { OFILE_URNEX, 21, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 10, 96, true, true, true, 1, 3, false }, - { OFILE_L5BOOKS, 21, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 0, 96, true, true, true, 0, 3, false }, - { OFILE_L5CANDLE, 21, 23, DTYPE_NONE, THEME_NONE, Q_INVALID, true, 2, 4, 96, true, true, true, 0, 0, false }, - { OFILE_L5DOORS, 0, 0, DTYPE_CRYPT, THEME_NONE, Q_INVALID, false, 1, 0, 64, false, false, true, 0, 3, true }, - { OFILE_L5DOORS, 0, 0, DTYPE_CRYPT, THEME_NONE, Q_INVALID, false, 2, 0, 64, false, false, true, 0, 3, true }, - { OFILE_L5LEVER, 24, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 1, 96, true, true, true, 0, 1, true }, - { OFILE_L5SARC, 21, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, false, 1, 5, 128, true, true, true, 0, 3, true }, +// _object_id ofindex, minlvl, maxlvl, olvltype, otheme, oquest, flags, animDelay, animLen, animWidth, selFlag +/*OBJ_L1LIGHT*/ { OFILE_L1BRAZ, 0, 0, DTYPE_CATHEDRAL, THEME_NONE, Q_INVALID, Animated | Solid | MissilesPassThrough, 1, 26, 64, 0 }, +/*OBJ_L1LDOOR*/ { OFILE_L1DOORS, 0, 0, DTYPE_CATHEDRAL, THEME_NONE, Q_INVALID, Light | Trap, 1, 0, 64, 3 }, +/*OBJ_L1RDOOR*/ { OFILE_L1DOORS, 0, 0, DTYPE_CATHEDRAL, THEME_NONE, Q_INVALID, Light | Trap, 2, 0, 64, 3 }, +/*OBJ_SKFIRE*/ { OFILE_SKULFIRE, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, Animated | Solid | MissilesPassThrough, 2, 11, 96, 0 }, +/*OBJ_LEVER*/ { OFILE_LEVER, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 1, 96, 1 }, +/*OBJ_CHEST1*/ { OFILE_CHEST1, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 1 }, +/*OBJ_CHEST2*/ { OFILE_CHEST2, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 1 }, +/*OBJ_CHEST3*/ { OFILE_CHEST3, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 1 }, +/*OBJ_CANDLE1*/ { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, {}, 0, 0, 0, 0 }, +/*OBJ_CANDLE2*/ { OFILE_CANDLE2, 0, 0, DTYPE_NONE, THEME_SHRINE, Q_PWATER, Animated | Solid | MissilesPassThrough | Light, 2, 4, 96, 0 }, +/*OBJ_CANDLEO*/ { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, {}, 0, 0, 0, 0 }, +/*OBJ_BANNERL*/ { OFILE_BANNER, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, Solid | MissilesPassThrough | Light, 2, 0, 96, 0 }, +/*OBJ_BANNERM*/ { OFILE_BANNER, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 0, 96, 0 }, +/*OBJ_BANNERR*/ { OFILE_BANNER, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, Solid | MissilesPassThrough | Light, 3, 0, 96, 0 }, +/*OBJ_SKPILE*/ { OFILE_SKULPILE, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 1, 96, 0 }, +/*OBJ_SKSTICK1*/ { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, {}, 0, 0, 0, 0 }, +/*OBJ_SKSTICK2*/ { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, {}, 0, 0, 0, 0 }, +/*OBJ_SKSTICK3*/ { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, {}, 0, 0, 0, 0 }, +/*OBJ_SKSTICK4*/ { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, {}, 0, 0, 0, 0 }, +/*OBJ_SKSTICK5*/ { OFILE_L1BRAZ, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, {}, 0, 0, 0, 0 }, +/*OBJ_CRUX1*/ { OFILE_CRUXSK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | Light | Breakable, 1, 15, 96, 3 }, +/*OBJ_CRUX2*/ { OFILE_CRUXSK2, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | Light | Breakable, 1, 15, 96, 3 }, +/*OBJ_CRUX3*/ { OFILE_CRUXSK3, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | Light | Breakable, 1, 15, 96, 3 }, +/*OBJ_STAND*/ { OFILE_ROCKSTAN, 5, 5, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 0, 96, 0 }, +/*OBJ_ANGEL*/ { OFILE_ANGEL, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | Light, 1, 0, 96, 0 }, +/*OBJ_BOOK2L*/ { OFILE_BOOK2, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 0, 96, 3 }, +/*OBJ_BCROSS*/ { OFILE_BURNCROS, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Animated | Solid, 0, 10, 160, 0 }, +/*OBJ_NUDEW2R*/ { OFILE_NUDE2, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Animated | Solid | Light, 3, 6, 128, 0 }, +/*OBJ_SWITCHSKL*/ { OFILE_SWITCH4, 16, 16, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 1 }, +/*OBJ_TNUDEM1*/ { OFILE_TNUDEM, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, Solid | Light, 1, 0, 128, 0 }, +/*OBJ_TNUDEM2*/ { OFILE_TNUDEM, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, Solid | Light, 2, 0, 128, 0 }, +/*OBJ_TNUDEM3*/ { OFILE_TNUDEM, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, Solid | Light, 3, 0, 128, 0 }, +/*OBJ_TNUDEM4*/ { OFILE_TNUDEM, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, Solid | Light, 4, 0, 128, 0 }, +/*OBJ_TNUDEW1*/ { OFILE_TNUDEW, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, Solid | Light, 1, 0, 128, 0 }, +/*OBJ_TNUDEW2*/ { OFILE_TNUDEW, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, Solid | Light, 2, 0, 128, 0 }, +/*OBJ_TNUDEW3*/ { OFILE_TNUDEW, 13, 15, DTYPE_NONE, THEME_TORTURE, Q_BUTCHER, Solid | Light, 3, 0, 128, 0 }, +/*OBJ_TORTURE1*/ { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, MissilesPassThrough | Light, 1, 0, 128, 0 }, +/*OBJ_TORTURE2*/ { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, MissilesPassThrough | Light, 2, 0, 128, 0 }, +/*OBJ_TORTURE3*/ { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, MissilesPassThrough | Light, 3, 0, 128, 0 }, +/*OBJ_TORTURE4*/ { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, MissilesPassThrough | Light, 4, 0, 128, 0 }, +/*OBJ_TORTURE5*/ { OFILE_TSOUL, 13, 15, DTYPE_NONE, THEME_NONE, Q_BUTCHER, MissilesPassThrough | Light, 5, 0, 128, 0 }, +/*OBJ_BOOK2R*/ { OFILE_BOOK2, 6, 6, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light, 4, 0, 96, 3 }, +/*OBJ_L2LDOOR*/ { OFILE_L2DOORS, 0, 0, DTYPE_CATACOMBS, THEME_NONE, Q_INVALID, Light | Trap, 1, 0, 64, 3 }, +/*OBJ_L2RDOOR*/ { OFILE_L2DOORS, 0, 0, DTYPE_CATACOMBS, THEME_NONE, Q_INVALID, Light | Trap, 2, 0, 64, 3 }, +/*OBJ_TORCHL*/ { OFILE_WTORCH4, 5, 8, DTYPE_NONE, THEME_NONE, Q_INVALID, Animated | MissilesPassThrough, 1, 9, 96, 0 }, +/*OBJ_TORCHR*/ { OFILE_WTORCH3, 5, 8, DTYPE_NONE, THEME_NONE, Q_INVALID, Animated | MissilesPassThrough, 1, 9, 96, 0 }, +/*OBJ_TORCHL2*/ { OFILE_WTORCH1, 5, 8, DTYPE_NONE, THEME_NONE, Q_INVALID, Animated | MissilesPassThrough, 1, 9, 96, 0 }, +/*OBJ_TORCHR2*/ { OFILE_WTORCH2, 5, 8, DTYPE_NONE, THEME_NONE, Q_INVALID, Animated | MissilesPassThrough, 1, 9, 96, 0 }, +/*OBJ_SARC*/ { OFILE_SARC, 1, 4, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 5, 128, 3 }, +/*OBJ_FLAMEHOLE*/ { OFILE_FLAME1, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, MissilesPassThrough | Light, 1, 20, 96, 0 }, +/*OBJ_FLAMELVR*/ { OFILE_LEVER, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 2, 96, 1 }, +/*OBJ_WATER*/ { OFILE_MINIWATR, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Animated | Solid | Light, 1, 10, 64, 0 }, +/*OBJ_BOOKLVR*/ { OFILE_BOOK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 0, 96, 3 }, +/*OBJ_TRAPL*/ { OFILE_TRAPHOLE, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, MissilesPassThrough | Light, 1, 0, 64, 0 }, +/*OBJ_TRAPR*/ { OFILE_TRAPHOLE, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, MissilesPassThrough | Light, 2, 0, 64, 0 }, +/*OBJ_BOOKSHELF*/ { OFILE_BCASE, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | Light, 1, 0, 96, 0 }, +/*OBJ_WEAPRACK*/ { OFILE_WEAPSTND, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | Light, 1, 0, 96, 0 }, +/*OBJ_BARREL*/ { OFILE_BARREL, 1, 15, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Breakable, 1, 9, 96, 3 }, +/*OBJ_BARRELEX*/ { OFILE_BARRELEX, 1, 15, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Breakable, 1, 10, 96, 3 }, +/*OBJ_SHRINEL*/ { OFILE_LSHRINEG, 0, 0, DTYPE_NONE, THEME_SHRINE, Q_INVALID, Light, 1, 11, 128, 3 }, +/*OBJ_SHRINER*/ { OFILE_RSHRINEG, 0, 0, DTYPE_NONE, THEME_SHRINE, Q_INVALID, Light, 1, 11, 128, 3 }, +/*OBJ_SKELBOOK*/ { OFILE_BOOK2, 0, 0, DTYPE_NONE, THEME_SKELROOM, Q_INVALID, Solid | MissilesPassThrough | Light, 4, 0, 96, 3 }, +/*OBJ_BOOKCASEL*/ { OFILE_BCASE, 0, 0, DTYPE_NONE, THEME_LIBRARY, Q_INVALID, Light, 3, 0, 96, 3 }, +/*OBJ_BOOKCASER*/ { OFILE_BCASE, 0, 0, DTYPE_NONE, THEME_LIBRARY, Q_INVALID, Light, 4, 0, 96, 3 }, +/*OBJ_BOOKSTAND*/ { OFILE_BOOK2, 0, 0, DTYPE_NONE, THEME_LIBRARY, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 0, 96, 3 }, +/*OBJ_BOOKCANDLE*/ { OFILE_CANDLE2, 0, 0, DTYPE_NONE, THEME_LIBRARY, Q_INVALID, Animated | Solid | MissilesPassThrough | Light, 2, 4, 96, 0 }, +/*OBJ_BLOODFTN*/ { OFILE_BLOODFNT, 0, 0, DTYPE_NONE, THEME_BLOODFOUNTAIN, Q_INVALID, Animated | Solid | MissilesPassThrough | Light, 2, 10, 96, 3 }, +/*OBJ_DECAP*/ { OFILE_DECAP, 13, 15, DTYPE_NONE, THEME_DECAPITATED, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 0, 96, 1 }, +/*OBJ_TCHEST1*/ { OFILE_CHEST1, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 1 }, +/*OBJ_TCHEST2*/ { OFILE_CHEST2, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 1 }, +/*OBJ_TCHEST3*/ { OFILE_CHEST3, 1, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 1 }, +/*OBJ_BLINDBOOK*/ { OFILE_BOOK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_BLIND, Solid | MissilesPassThrough | Light, 1, 0, 96, 3 }, +/*OBJ_BLOODBOOK*/ { OFILE_BOOK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_BLOOD, Solid | MissilesPassThrough | Light, 4, 0, 96, 3 }, +/*OBJ_PEDESTAL*/ { OFILE_PEDISTL, 0, 0, DTYPE_NONE, THEME_NONE, Q_BLOOD, Solid | MissilesPassThrough | Light, 1, 0, 96, 3 }, +/*OBJ_L3LDOOR*/ { OFILE_L3DOORS, 0, 0, DTYPE_CAVES, THEME_NONE, Q_INVALID, Light | Trap, 1, 0, 64, 3 }, +/*OBJ_L3RDOOR*/ { OFILE_L3DOORS, 0, 0, DTYPE_CAVES, THEME_NONE, Q_INVALID, Light | Trap, 2, 0, 64, 3 }, +/*OBJ_PURIFYINGFTN*/ { OFILE_PFOUNTN, 0, 0, DTYPE_NONE, THEME_PURIFYINGFOUNTAIN, Q_INVALID, Animated | Solid | MissilesPassThrough | Light, 2, 10, 128, 3 }, +/*OBJ_ARMORSTAND*/ { OFILE_ARMSTAND, 0, 0, DTYPE_NONE, THEME_ARMORSTAND, Q_INVALID, Solid | Light, 1, 0, 96, 3 }, +/*OBJ_ARMORSTANDN*/ { OFILE_ARMSTAND, 0, 0, DTYPE_NONE, THEME_ARMORSTAND, Q_INVALID, Solid | Light, 2, 0, 96, 0 }, +/*OBJ_GOATSHRINE*/ { OFILE_GOATSHRN, 0, 0, DTYPE_NONE, THEME_GOATSHRINE, Q_INVALID, Animated | Solid | MissilesPassThrough | Light, 2, 10, 96, 3 }, +/*OBJ_CAULDRON*/ { OFILE_CAULDREN, 13, 15, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | Light, 1, 0, 96, 3 }, +/*OBJ_MURKYFTN*/ { OFILE_MFOUNTN, 0, 0, DTYPE_NONE, THEME_MURKYFOUNTAIN, Q_INVALID, Animated | Solid | MissilesPassThrough | Light, 2, 10, 128, 3 }, +/*OBJ_TEARFTN*/ { OFILE_TFOUNTN, 0, 0, DTYPE_NONE, THEME_TEARFOUNTAIN, Q_INVALID, Animated | Solid | MissilesPassThrough | Light, 2, 4, 128, 3 }, +/*OBJ_ALTBOY*/ { OFILE_ALTBOY, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, Solid | MissilesPassThrough | Light, 1, 0, 128, 0 }, +/*OBJ_MCIRCLE1*/ { OFILE_MCIRL, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, MissilesPassThrough | Light, 1, 0, 96, 0 }, +/*OBJ_MCIRCLE2*/ { OFILE_MCIRL, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, MissilesPassThrough | Light, 1, 0, 96, 0 }, +/*OBJ_STORYBOOK*/ { OFILE_BKSLBRNT, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 0, 96, 3 }, +/*OBJ_STORYCANDLE*/ { OFILE_CANDLE2, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, Animated | Solid | MissilesPassThrough | Light, 2, 4, 96, 0 }, +/*OBJ_STEELTOME*/ { OFILE_BOOK1, 0, 0, DTYPE_NONE, THEME_NONE, Q_WARLORD, Solid | MissilesPassThrough | Light, 4, 0, 96, 3 }, +/*OBJ_WARARMOR*/ { OFILE_ARMSTAND, 0, 0, DTYPE_NONE, THEME_NONE, Q_WARLORD, Solid | Light, 1, 0, 96, 3 }, +/*OBJ_WARWEAP*/ { OFILE_WEAPSTND, 0, 0, DTYPE_NONE, THEME_NONE, Q_WARLORD, Solid | Light, 1, 0, 96, 3 }, +/*OBJ_TBCROSS*/ { OFILE_BURNCROS, 0, 0, DTYPE_NONE, THEME_BRNCROSS, Q_INVALID, Animated | Solid, 0, 10, 160, 0 }, +/*OBJ_WEAPONRACK*/ { OFILE_WEAPSTND, 0, 0, DTYPE_NONE, THEME_WEAPONRACK, Q_INVALID, Solid | Light, 1, 0, 96, 3 }, +/*OBJ_WEAPONRACKN*/ { OFILE_WEAPSTND, 0, 0, DTYPE_NONE, THEME_WEAPONRACK, Q_INVALID, Solid | Light, 2, 0, 96, 0 }, +/*OBJ_MUSHPATCH*/ { OFILE_MUSHPTCH, 0, 0, DTYPE_NONE, THEME_NONE, Q_MUSHROOM, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 3 }, +/*OBJ_LAZSTAND*/ { OFILE_LZSTAND, 0, 0, DTYPE_NONE, THEME_NONE, Q_BETRAYER, Solid | Light, 1, 0, 128, 3 }, +/*OBJ_SLAINHERO*/ { OFILE_DECAP, 9, 9, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light, 2, 0, 96, 1 }, +/*OBJ_SIGNCHEST*/ { OFILE_CHEST3, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 0, 96, 1 }, +/*OBJ_BOOKSHELFR*/ { OFILE_BCASE, 0, 0, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | Light, 2, 0, 96, 0 }, +/*OBJ_POD*/ { OFILE_POD, 17, 20, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Breakable, 1, 9, 96, 3 }, +/*OBJ_PODEX*/ { OFILE_PODEX, 17, 20, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Breakable, 1, 10, 96, 3 }, +/*OBJ_URN*/ { OFILE_URN, 21, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Breakable, 1, 9, 96, 3 }, +/*OBJ_URNEX*/ { OFILE_URNEX, 21, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Breakable, 1, 10, 96, 3 }, +/*OBJ_L5BOOKS*/ { OFILE_L5BOOKS, 21, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light, 1, 0, 96, 3 }, +/*OBJ_L5CANDLE*/ { OFILE_L5CANDLE, 21, 23, DTYPE_NONE, THEME_NONE, Q_INVALID, Animated | Solid | MissilesPassThrough | Light, 2, 4, 96, 0 }, +/*OBJ_L5LDOOR*/ { OFILE_L5DOORS, 0, 0, DTYPE_CRYPT, THEME_NONE, Q_INVALID, Light | Trap, 1, 0, 64, 3 }, +/*OBJ_L5RDOOR*/ { OFILE_L5DOORS, 0, 0, DTYPE_CRYPT, THEME_NONE, Q_INVALID, Light | Trap, 2, 0, 64, 3 }, +/*OBJ_L5LEVER*/ { OFILE_L5LEVER, 24, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 1, 96, 1 }, +/*OBJ_L5SARC*/ { OFILE_L5SARC, 21, 24, DTYPE_NONE, THEME_NONE, Q_INVALID, Solid | MissilesPassThrough | Light | Trap, 1, 5, 128, 3 }, // clang-format on }; /** Maps from object_graphic_id to object CEL name. */ diff --git a/Source/objdat.h b/Source/objdat.h index 15f0bf2b421..d04d133e3f5 100644 --- a/Source/objdat.h +++ b/Source/objdat.h @@ -8,6 +8,7 @@ #include #include "levels/gendung.h" +#include "utils/enum_traits.h" namespace devilution { @@ -242,23 +243,58 @@ enum quest_id : int8_t { Q_INVALID = -1, }; +enum class ObjectDataFlags : uint8_t { + Animated = 1U, + Solid = 1U << 1, + MissilesPassThrough = 1U << 2, + Light = 1U << 3, + Trap = 1U << 4, + Breakable = 1U << 5, +}; +use_enum_as_flags(ObjectDataFlags); + struct ObjectData { object_graphic_id ofindex; - int8_t ominlvl; - int8_t omaxlvl; + int8_t minlvl; + int8_t maxlvl; dungeon_type olvltype; theme_id otheme; quest_id oquest; - bool oAnimFlag; - int oAnimDelay; // Tick length of each frame in the current animation - int oAnimLen; // Number of frames in current animation - uint16_t oAnimWidth; - bool oSolidFlag; - bool oMissFlag; - bool oLightFlag; - int8_t oBreak; // TODO Create enum - int8_t oSelFlag; // TODO Create enum - bool oTrapFlag; + ObjectDataFlags flags; + uint8_t animDelay; // Tick length of each frame in the current animation + uint8_t animLen; // Number of frames in current animation + uint8_t animWidth; + int8_t selFlag; // TODO Create enum + + [[nodiscard]] bool isAnimated() const + { + return HasAnyOf(flags, ObjectDataFlags::Animated); + } + + [[nodiscard]] bool isSolid() const + { + return HasAnyOf(flags, ObjectDataFlags::Solid); + } + + [[nodiscard]] bool missilesPassThrough() const + { + return HasAnyOf(flags, ObjectDataFlags::MissilesPassThrough); + } + + [[nodiscard]] bool isLight() const + { + return HasAnyOf(flags, ObjectDataFlags::Light); + } + + [[nodiscard]] bool isTrap() const + { + return HasAnyOf(flags, ObjectDataFlags::Trap); + } + + [[nodiscard]] bool isBreakable() const + { + return HasAnyOf(flags, ObjectDataFlags::Breakable); + } }; extern const _object_id ObjTypeConv[]; diff --git a/Source/objects.cpp b/Source/objects.cpp index 393828214c3..addfc3d7e99 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -584,7 +584,7 @@ void AddObjTraps() if (triggerObject == nullptr || GenerateRnd(100) >= rndv) continue; - if (!AllObjects[triggerObject->_otype].oTrapFlag) + if (!AllObjects[triggerObject->_otype].isTrap()) continue; Object *trapObject = nullptr; @@ -789,25 +789,25 @@ void SetupObject(Object &object, Point position, _object_id ot) object._oAnimData = std::nullopt; } } - object._oAnimFlag = objectData.oAnimFlag; + object._oAnimFlag = objectData.isAnimated(); if (object._oAnimFlag) { - object._oAnimDelay = objectData.oAnimDelay; + object._oAnimDelay = objectData.animDelay; object._oAnimCnt = GenerateRnd(object._oAnimDelay); - object._oAnimLen = objectData.oAnimLen; + object._oAnimLen = objectData.animLen; object._oAnimFrame = GenerateRnd(object._oAnimLen - 1) + 1; } else { object._oAnimDelay = 1000; object._oAnimCnt = 0; - object._oAnimLen = objectData.oAnimLen; - object._oAnimFrame = objectData.oAnimDelay; + object._oAnimLen = objectData.animLen; + object._oAnimFrame = objectData.animDelay; } - object._oAnimWidth = objectData.oAnimWidth; - object._oSolidFlag = objectData.oSolidFlag; - object._oMissFlag = objectData.oMissFlag; - object._oLight = objectData.oLightFlag; + object._oAnimWidth = objectData.animWidth; + object._oSolidFlag = objectData.isSolid() ? 1 : 0; + object._oMissFlag = objectData.missilesPassThrough() ? 1 : 0; + object._oLight = objectData.isLight() ? 1 : 0; object._oDelFlag = false; - object._oBreak = objectData.oBreak; - object._oSelFlag = objectData.oSelFlag; + object._oBreak = objectData.isBreakable() ? 1 : 0; + object._oSelFlag = objectData.selFlag; object._oPreFlag = false; object._oTrapFlag = false; object._oDoorFlag = false; @@ -3678,7 +3678,7 @@ void LoadLevelObjects(uint16_t filesWidths[65]) for (const ObjectData objectData : AllObjects) { if (leveltype == objectData.olvltype) { - filesWidths[objectData.ofindex] = objectData.oAnimWidth; + filesWidths[objectData.ofindex] = objectData.animWidth; } } @@ -3700,28 +3700,28 @@ void InitObjectGFX() uint16_t filesWidths[65] = {}; if (IsAnyOf(currlevel, 4, 8, 12)) { - filesWidths[OFILE_BKSLBRNT] = AllObjects[OBJ_STORYBOOK].oAnimWidth; - filesWidths[OFILE_CANDLE2] = AllObjects[OBJ_STORYCANDLE].oAnimWidth; + filesWidths[OFILE_BKSLBRNT] = AllObjects[OBJ_STORYBOOK].animWidth; + filesWidths[OFILE_CANDLE2] = AllObjects[OBJ_STORYCANDLE].animWidth; } for (const ObjectData objectData : AllObjects) { - if (objectData.ominlvl != 0 && currlevel >= objectData.ominlvl && currlevel <= objectData.omaxlvl) { + if (objectData.minlvl != 0 && currlevel >= objectData.minlvl && currlevel <= objectData.maxlvl) { if (IsAnyOf(objectData.ofindex, OFILE_TRAPHOLE, OFILE_TRAPHOLE) && leveltype == DTYPE_HELL) { continue; } - filesWidths[objectData.ofindex] = objectData.oAnimWidth; + filesWidths[objectData.ofindex] = objectData.animWidth; } if (objectData.otheme != THEME_NONE) { for (int j = 0; j < numthemes; j++) { if (themes[j].ttype == objectData.otheme) { - filesWidths[objectData.ofindex] = objectData.oAnimWidth; + filesWidths[objectData.ofindex] = objectData.animWidth; } } } if (objectData.oquest != Q_INVALID && Quests[objectData.oquest].IsAvailable()) { - filesWidths[objectData.ofindex] = objectData.oAnimWidth; + filesWidths[objectData.ofindex] = objectData.animWidth; } } @@ -3977,7 +3977,7 @@ void SetMapObjects(const uint16_t *dunData, int startx, int starty) auto objectId = static_cast(SDL_SwapLE16(objectLayer[j * width + i])); if (objectId != 0) { const ObjectData &objectData = AllObjects[ObjTypeConv[objectId]]; - filesWidths[objectData.ofindex] = objectData.oAnimWidth; + filesWidths[objectData.ofindex] = objectData.animWidth; } } } diff --git a/tools/cpp_format_struct_table.py b/tools/cpp_format_struct_table.py index 8eaaba0186b..f1538db38f3 100755 --- a/tools/cpp_format_struct_table.py +++ b/tools/cpp_format_struct_table.py @@ -17,6 +17,7 @@ def Main(): root.joinpath("Source/itemdat.cpp"), root.joinpath("Source/misdat.cpp"), root.joinpath("Source/monstdat.cpp"), + root.joinpath("Source/objdat.cpp"), root.joinpath("Source/spelldat.cpp"), ], ) @@ -61,16 +62,18 @@ def Process(path: str): prev_state = state state = ProcessLine(input[i], state, columns_state) if prev_state != state: + columns_state.has_header = False for j in range(begin, i): output_line = FormatLine(input[j], prev_state, columns_state) output_lines.append(output_line) columns_state = ColumnsState() begin = i + columns_state.has_header = False for j in range(begin, len(input)): output_line = FormatLine(input[j], state, columns_state) output_lines.append(output_line) - with open(path, "w", encoding="utf-8", newline='') as f: + with open(path, "w", encoding="utf-8", newline="") as f: f.writelines(f"{line}\r\n" for line in output_lines) @@ -319,11 +322,14 @@ def FormatLine(line: str, line_state: LineState, state: ColumnsState) -> str: return line if row.header: - return "// " + " ".join( - FormatColumn(column.rstrip(), align, width) - for column, width, align in zip( - row.columns, [state.widths[0] - 1, *state.widths[1:]], state.aligns - ) + return ( + "// " + + " ".join( + FormatColumn(column.rstrip(), align, width) + for column, width, align in zip( + row.columns, [state.widths[0] - 1, *state.widths[1:]], state.aligns + ) + ).rstrip() ) result = []