diff --git a/Source/dead.cpp b/Source/dead.cpp index f6b54407e..959594c1a 100644 --- a/Source/dead.cpp +++ b/Source/dead.cpp @@ -45,13 +45,6 @@ void InitDead() mtypes[LevelMonsterTypes[i].mtype] = nd; } - for (auto &dead : Dead[nd].data) - dead = MissileSpriteData[MFILE_BLODBUR].animData[0].get(); - Dead[nd].frame = 8; - Dead[nd].width = 128; - Dead[nd].translationPaletteIndex = 0; - nd++; - for (auto &dead : Dead[nd].data) dead = MissileSpriteData[MFILE_SHATTER1].animData[0].get(); diff --git a/Source/misdat.cpp b/Source/misdat.cpp index 460fd4cd1..c09e37aad 100644 --- a/Source/misdat.cpp +++ b/Source/misdat.cpp @@ -32,9 +32,9 @@ MissileDataStruct MissileData[] = { { &AddFiremove, &MI_Firemove, MIS_FIREMOVE, true, 1, MISR_FIRE, MFILE_FIREWAL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Unblockable }, { &AddChain, &MI_Chain, MIS_CHAIN, true, 1, MISR_LIGHTNING, MFILE_LGHNING, LS_LNING1, LS_ELECIMP1, MissileMovementDistrubution::Disabled }, { nullptr, nullptr, MIS_SENTINAL, true, 1, MISR_LIGHTNING, MFILE_LGHNING, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddBloodStar, &MI_Blood, MIS_BLODSTAR, true, 2, MISR_NONE, MFILE_BLOOD, LS_BLODSTAR, LS_BLSIMPT, MissileMovementDistrubution::Disabled }, - { &AddBone, &MI_Blood, MIS_BONE, true, 2, MISR_NONE, MFILE_BONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddMetlHit, &MI_Blood, MIS_METLHIT, true, 2, MISR_NONE, MFILE_METLHIT, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_BLODSTAR, true, 2, MISR_NONE, MFILE_BLOOD, LS_BLODSTAR, LS_BLSIMPT, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_BONE, true, 2, MISR_NONE, MFILE_BONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_METLHIT, true, 2, MISR_NONE, MFILE_METLHIT, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddRhino, &MI_Rhino, MIS_RHINO, true, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddMagmaball, &MI_Firebolt, MIS_MAGMABALL, true, 1, MISR_FIRE, MFILE_MAGBALL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddLightctrl, &MI_Lightctrl, MIS_LIGHTCTRL2, false, 1, MISR_LIGHTNING, MFILE_THINLGHT, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, @@ -44,47 +44,47 @@ MissileDataStruct MissileData[] = { { &AddTeleport, &MI_Teleport, MIS_TELEPORT, false, 1, MISR_NONE, MFILE_NONE, LS_ELEMENTL, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddLArrow, &MI_LArrow, MIS_FARROW, true, 0, MISR_FIRE, MFILE_FARROW, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, { nullptr, nullptr, MIS_DOOMSERP, false, 1, MISR_MAGIC, MFILE_DOOM, LS_DSERP, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddFireWallA, &MI_Firewall, MIS_FIREWALLA, true, 2, MISR_FIRE, MFILE_FIREWAL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_FIREWALLA, true, 2, MISR_FIRE, MFILE_FIREWAL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddStone, &MI_Stone, MIS_STONE, false, 1, MISR_MAGIC, MFILE_NONE, LS_SCURIMP, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddDummy, &MI_Dummy, MIS_NULL_1F, true, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_NULL_1F, true, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { nullptr, nullptr, MIS_INVISIBL, false, 1, MISR_NONE, MFILE_NONE, LS_INVISIBL, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddGolem, &MI_Golem, MIS_GOLEM, false, 1, MISR_NONE, MFILE_NONE, LS_GOLUM, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddEtherealize, &MI_Etherealize, MIS_ETHEREALIZE, true, 1, MISR_NONE, MFILE_ETHRSHLD, LS_ETHEREAL, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddBlodbur, &MI_Blood, MIS_BLODBUR, true, 2, MISR_NONE, MFILE_BLODBUR, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_ETHEREALIZE, true, 1, MISR_NONE, MFILE_ETHRSHLD, LS_ETHEREAL, SFX_NONE, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_BLODBUR, true, 2, MISR_NONE, MFILE_BLODBUR, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddBoom, &MI_Boom, MIS_BOOM, true, 2, MISR_NONE, MFILE_NEWEXP, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddHeal, &MI_Dummy, MIS_HEAL, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddHeal, nullptr, MIS_HEAL, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddFirewallC, &MI_FirewallC, MIS_FIREWALLC, false, 1, MISR_FIRE, MFILE_FIREWAL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddInfra, &MI_Infra, MIS_INFRA, false, 1, MISR_NONE, MFILE_NONE, LS_INFRAVIS, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddIdentify, &MI_Dummy, MIS_IDENTIFY, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddIdentify, nullptr, MIS_IDENTIFY, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddWave, &MI_Wave, MIS_WAVE, true, 1, MISR_FIRE, MFILE_FIREWAL, LS_FLAMWAVE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddNova, &MI_Nova, MIS_NOVA, true, 1, MISR_LIGHTNING, MFILE_LGHNING, LS_NOVA, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddBlodboil, &MI_Blodboil, MIS_BLODBOIL, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddApoca, &MI_Apoca, MIS_APOCA, true, 1, MISR_MAGIC, MFILE_NEWEXP, LS_APOC, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddRepair, &MI_Dummy, MIS_REPAIR, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddRecharge, &MI_Dummy, MIS_RECHARGE, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddDisarm, &MI_Dummy, MIS_DISARM, false, 2, MISR_NONE, MFILE_NONE, LS_TRAPDIS, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddRepair, nullptr, MIS_REPAIR, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddRecharge, nullptr, MIS_RECHARGE, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddDisarm, nullptr, MIS_DISARM, false, 2, MISR_NONE, MFILE_NONE, LS_TRAPDIS, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddFlame, &MI_Flame, MIS_FLAME, true, 1, MISR_FIRE, MFILE_INFERNO, LS_SPOUTSTR, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddFlamec, &MI_Flamec, MIS_FLAMEC, false, 1, MISR_FIRE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddFireman, &MI_Fireman, MIS_FIREMAN, true, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, - { &AddKrull, &MI_Krull, MIS_KRULL, true, 0, MISR_FIRE, MFILE_KRULL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, + { nullptr, nullptr, MIS_FIREMAN, true, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, + { nullptr, nullptr, MIS_KRULL, true, 0, MISR_FIRE, MFILE_KRULL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddCbolt, &MI_Cbolt, MIS_CBOLT, true, 1, MISR_LIGHTNING, MFILE_MINILTNG, LS_CBOLT, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddHbolt, &MI_Hbolt, MIS_HBOLT, true, 1, MISR_NONE, MFILE_HOLY, LS_HOLYBOLT, LS_ELECIMP1, MissileMovementDistrubution::Blockable }, - { &AddResurrect, &MI_Dummy, MIS_RESURRECT, false, 1, MISR_MAGIC, MFILE_NONE, SFX_NONE, LS_RESUR, MissileMovementDistrubution::Disabled }, - { &AddTelekinesis, &MI_Dummy, MIS_TELEKINESIS, false, 1, MISR_NONE, MFILE_NONE, LS_ETHEREAL, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddResurrect, nullptr, MIS_RESURRECT, false, 1, MISR_MAGIC, MFILE_NONE, SFX_NONE, LS_RESUR, MissileMovementDistrubution::Disabled }, + { &AddTelekinesis, nullptr, MIS_TELEKINESIS, false, 1, MISR_NONE, MFILE_NONE, LS_ETHEREAL, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddLArrow, &MI_LArrow, MIS_LARROW, true, 0, MISR_LIGHTNING, MFILE_LARROW, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddAcid, &MI_Firebolt, MIS_ACID, true, 1, MISR_ACID, MFILE_ACIDBF, LS_ACID, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddMisexp, &MI_Acidsplat, MIS_MISEXP3, true, 2, MISR_ACID, MFILE_ACIDSPLA, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddAcidpud, &MI_Acidpud, MIS_ACIDPUD, true, 2, MISR_ACID, MFILE_ACIDPUD, LS_PUDDLE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddHealOther, &MI_Dummy, MIS_HEALOTHER, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddHealOther, nullptr, MIS_HEALOTHER, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddElement, &MI_Element, MIS_ELEMENT, true, 1, MISR_FIRE, MFILE_FIRERUN, LS_ELEMENTL, SFX_NONE, MissileMovementDistrubution::Unblockable }, { &AddResurrectBeam, &MI_ResurrectBeam, MIS_RESURRECTBEAM, true, 1, MISR_NONE, MFILE_RESSUR1, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddBoneSpirit, &MI_Bonespirit, MIS_BONESPIRIT, true, 1, MISR_MAGIC, MFILE_SKLBALL, LS_BONESP, LS_BSIMPCT, MissileMovementDistrubution::Blockable }, { &AddWeapexp, &MI_Weapexp, MIS_WEAPEXP, true, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddRportal, &MI_Rportal, MIS_RPORTAL, true, 2, MISR_NONE, MFILE_RPORTAL, LS_SENTINEL, LS_ELEMENTL, MissileMovementDistrubution::Disabled }, { &AddBoom, &MI_Boom, MIS_BOOM2, true, 2, MISR_NONE, MFILE_FIREPLAR, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddDiabApoca, &MI_Dummy, MIS_DIABAPOCA, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddMana, &MI_Dummy, MIS_MANA, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddMagi, &MI_Dummy, MIS_MAGI, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddDiabApoca, nullptr, MIS_DIABAPOCA, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddMana, nullptr, MIS_MANA, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddMagi, nullptr, MIS_MAGI, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddLightningWall, &MI_LightningWall, MIS_LIGHTWALL, true, 1, MISR_LIGHTNING, MFILE_LGHNING, LS_LMAG, LS_ELECIMP1, MissileMovementDistrubution::Disabled }, { &AddFirewallC, &MI_LightningWallC, MIS_LIGHTNINGWALL, false, 1, MISR_LIGHTNING, MFILE_LGHNING, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddNova, &MI_FireNova, MIS_IMMOLATION, true, 1, MISR_FIRE, MFILE_FIREBA, LS_FBOLT1, LS_FIRIMP2, MissileMovementDistrubution::Disabled }, @@ -95,15 +95,15 @@ MissileDataStruct MissileData[] = { { &AddHbolt, &MI_Hbolt, MIS_HBOLTARROW, true, 1, MISR_NONE, MFILE_HOLY, LS_HOLYBOLT, LS_ELECIMP1, MissileMovementDistrubution::Blockable }, { &AddWarp, &MI_Teleport, MIS_WARP, false, 1, MISR_NONE, MFILE_NONE, LS_ETHEREAL, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddReflection, &MI_Reflect, MIS_REFLECT, false, 1, MISR_NONE, MFILE_REFLECT, LS_MSHIELD, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddBerserk, &MI_Dummy, MIS_BERSERK, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddBerserk, nullptr, MIS_BERSERK, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddRing, &MI_FireRing, MIS_FIRERING, false, 1, MISR_FIRE, MFILE_FIREWAL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddStealPotions, &MI_Dummy, MIS_STEALPOTS, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddManaTrap, &MI_Dummy, MIS_MANATRAP, false, 1, MISR_NONE, MFILE_NONE, IS_CAST7, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddRing, &MI_LightningRing, MIS_LIGHTRING, false, 1, MISR_LIGHTNING, MFILE_LGHNING, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddStealPotions, nullptr, MIS_STEALPOTS, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddManaTrap, nullptr, MIS_MANATRAP, false, 1, MISR_NONE, MFILE_NONE, IS_CAST7, SFX_NONE, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_LIGHTRING, false, 1, MISR_LIGHTNING, MFILE_LGHNING, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddSearch, &MI_Search, MIS_SEARCH, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { nullptr, nullptr, MIS_FLASHFR, false, 1, MISR_MAGIC, MFILE_BLUEXFR, SFX_NONE, LS_ELECIMP1, MissileMovementDistrubution::Disabled }, { nullptr, nullptr, MIS_FLASHBK, false, 1, MISR_MAGIC, MFILE_BLUEXBK, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddImmolation, &MI_Immolation, MIS_IMMOLATION2, true, 1, MISR_FIRE, MFILE_FIREBA, LS_FBOLT1, LS_FIRIMP2, MissileMovementDistrubution::Disabled }, + { nullptr, nullptr, MIS_IMMOLATION2, true, 1, MISR_FIRE, MFILE_FIREBA, LS_FBOLT1, LS_FIRIMP2, MissileMovementDistrubution::Disabled }, { &AddFireRune, &MI_Rune, MIS_RUNEFIRE, true, 1, MISR_NONE, MFILE_RUNE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddLightningRune, &MI_Rune, MIS_RUNELIGHT, true, 1, MISR_NONE, MFILE_RUNE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddGreatLightningRune, &MI_Rune, MIS_RUNENOVA, true, 1, MISR_NONE, MFILE_RUNE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, @@ -111,8 +111,8 @@ MissileDataStruct MissileData[] = { { &AddStoneRune, &MI_Rune, MIS_RUNESTONE, true, 1, MISR_NONE, MFILE_RUNE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddRuneExplosion, &MI_HiveExplode, MIS_HIVEEXP, true, 1, MISR_FIRE, MFILE_BIGEXP, LS_NESTXPLD, LS_NESTXPLD, MissileMovementDistrubution::Disabled }, { &AddHorkSpawn, &MI_HorkSpawn, MIS_HORKDMN, true, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddJester, &MI_Dummy, MIS_JESTER, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddHiveExplosion, &MI_Dummy, MIS_HIVEEXP2, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddJester, nullptr, MIS_JESTER, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddHiveExplosion, nullptr, MIS_HIVEEXP2, false, 2, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddFlare, &MI_Firebolt, MIS_LICH, true, 1, MISR_MAGIC, MFILE_LICH, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddFlare, &MI_Firebolt, MIS_PSYCHORB, true, 1, MISR_MAGIC, MFILE_BONEDEMON, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddFlare, &MI_Firebolt, MIS_NECROMORB, true, 1, MISR_MAGIC, MFILE_NECROMORB, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Blockable }, @@ -129,67 +129,67 @@ MissileDataStruct MissileData[] = { /** Data related to each missile graphic ID. */ MissileFileData MissileSpriteData[] = { // clang-format off - // name, animName, animFAmt, flags, animDelay[16], animLen[16], animWidth[16], animWidth2[16] - { "Arrows", MFILE_ARROWS, 1, MissileDataFlags::NotAnimated, { 0 }, { 16 }, { 96 }, { 16 } }, - { "Fireba", MFILE_FIREBA, 16, MissileDataFlags::None, { 0 }, { 14 }, { 96 }, { 16 } }, - { "Guard", MFILE_GUARD, 3, MissileDataFlags::None, { 1 }, { 15, 14, 3 }, { 96 }, { 16 } }, - { "Lghning", MFILE_LGHNING, 1, MissileDataFlags::None, { 0 }, { 8 }, { 96 }, { 16 } }, - { "Firewal", MFILE_FIREWAL, 2, MissileDataFlags::None, { 0 }, { 13, 11 }, { 128 }, { 32 } }, - { "MagBlos", MFILE_MAGBLOS, 1, MissileDataFlags::None, { 1 }, { 10 }, { 128 }, { 32 } }, - { "Portal", MFILE_PORTAL, 2, MissileDataFlags::None, { 0, 1 }, { 16 }, { 96 }, { 16 } }, - { "Bluexfr", MFILE_BLUEXFR, 1, MissileDataFlags::None, { 0 }, { 19 }, { 160 }, { 48 } }, - { "Bluexbk", MFILE_BLUEXBK, 1, MissileDataFlags::None, { 0 }, { 19 }, { 160 }, { 48 } }, - { "Manashld", MFILE_MANASHLD, 1, MissileDataFlags::NotAnimated, { 0 }, { 1 }, { 96 }, { 16 } }, - { "Blood", MFILE_BLOOD, 4, MissileDataFlags::None, { 0 }, { 15, 8, 8, 8 }, { 96, 128, 128, 128 }, { 16, 32, 32, 32 } }, - { "Bone", MFILE_BONE, 3, MissileDataFlags::None, { 2 }, { 8 }, { 128 }, { 32 } }, - { "Metlhit", MFILE_METLHIT, 3, MissileDataFlags::None, { 2 }, { 10 }, { 96 }, { 16 } }, - { "Farrow", MFILE_FARROW, 16, MissileDataFlags::None, { 0 }, { 4 }, { 96 }, { 16 } }, - { "Doom", MFILE_DOOM, 9, MissileDataFlags::NoGraphics, { 1 }, { 15 }, { 96 }, { 16 } }, - { " ", MFILE_0F, 1, MissileDataFlags::NoGraphics, { 0 }, { 0 }, { 0 }, { 0 } }, - { "Blodbur", MFILE_BLODBUR, 2, MissileDataFlags::None, { 2 }, { 8 }, { 128 }, { 32 } }, - { "Newexp", MFILE_NEWEXP, 1, MissileDataFlags::None, { 1 }, { 15 }, { 96 }, { 16 } }, - { "Shatter1", MFILE_SHATTER1, 1, MissileDataFlags::None, { 1 }, { 12 }, { 128 }, { 32 } }, - { "Bigexp", MFILE_BIGEXP, 1, MissileDataFlags::None, { 0 }, { 15 }, { 160 }, { 48 } }, - { "Inferno", MFILE_INFERNO, 1, MissileDataFlags::None, { 0 }, { 20 }, { 96 }, { 16 } }, - { "Thinlght", MFILE_THINLGHT, 1, MissileDataFlags::NoGraphics, { 0 }, { 8 }, { 96 }, { 16 } }, - { "Flare", MFILE_FLARE, 1, MissileDataFlags::None, { 0 }, { 16 }, { 128 }, { 32 } }, - { "Flareexp", MFILE_FLAREEXP, 1, MissileDataFlags::None, { 0 }, { 7 }, { 128 }, { 32 } }, - { "Magball", MFILE_MAGBALL, 8, MissileDataFlags::NoGraphics, { 1 }, { 16 }, { 128 }, { 32 } }, - { "Krull", MFILE_KRULL, 1, MissileDataFlags::NoGraphics, { 0 }, { 14 }, { 96 }, { 16 } }, - { "Miniltng", MFILE_MINILTNG, 1, MissileDataFlags::None, { 1 }, { 8 }, { 64 }, { 0 } }, - { "Holy", MFILE_HOLY, 16, MissileDataFlags::None, { 1, 0 }, { 14 }, { 96 }, { 16 } }, - { "Holyexpl", MFILE_HOLYEXPL, 1, MissileDataFlags::None, { 0 }, { 8 }, { 160 }, { 48 } }, - { "Larrow", MFILE_LARROW, 16, MissileDataFlags::None, { 0 }, { 4 }, { 96 }, { 16 } }, - { "Firarwex", MFILE_FIRARWEX, 1, MissileDataFlags::None, { 0 }, { 6 }, { 64 }, { 0 } }, - { "Acidbf", MFILE_ACIDBF, 16, MissileDataFlags::NoGraphics, { 0 }, { 8 }, { 96 }, { 16 } }, - { "Acidspla", MFILE_ACIDSPLA, 1, MissileDataFlags::NoGraphics, { 0 }, { 8 }, { 96 }, { 16 } }, - { "Acidpud", MFILE_ACIDPUD, 2, MissileDataFlags::NoGraphics, { 0 }, { 9, 4 }, { 96 }, { 16 } }, - { "Ethrshld", MFILE_ETHRSHLD, 1, MissileDataFlags::None, { 0 }, { 1 }, { 96 }, { 16 } }, - { "Firerun", MFILE_FIRERUN, 8, MissileDataFlags::None, { 1 }, { 12 }, { 96 }, { 16 } }, - { "Ressur1", MFILE_RESSUR1, 1, MissileDataFlags::None, { 0 }, { 16 }, { 96 }, { 16 } }, - { "Sklball", MFILE_SKLBALL, 9, MissileDataFlags::None, { 1 }, { 16, 16, 16, 16, 16, 16, 16, 16, 8 }, { 96 }, { 16 } }, - { "Rportal", MFILE_RPORTAL, 2, MissileDataFlags::None, { 0 }, { 16 }, { 96 }, { 16 } }, - { "Fireplar", MFILE_FIREPLAR, 1, MissileDataFlags::NoGraphics, { 1 }, { 17 }, { 160 }, { 48 } }, - { "Scubmisb", MFILE_SCUBMISB, 1, MissileDataFlags::NoGraphics, { 0 }, { 16 }, { 96 }, { 16 } }, - { "Scbsexpb", MFILE_SCBSEXPB, 1, MissileDataFlags::NoGraphics, { 0 }, { 6 }, { 128 }, { 32 } }, - { "Scubmisc", MFILE_SCUBMISC, 1, MissileDataFlags::NoGraphics, { 0 }, { 16 }, { 96 }, { 16 } }, - { "Scbsexpc", MFILE_SCBSEXPC, 1, MissileDataFlags::NoGraphics, { 0 }, { 6 }, { 128 }, { 32 } }, - { "Scubmisd", MFILE_SCUBMISD, 1, MissileDataFlags::NoGraphics, { 0 }, { 16 }, { 96 }, { 16 } }, - { "Scbsexpd", MFILE_SCBSEXPD, 1, MissileDataFlags::NoGraphics, { 0 }, { 6 }, { 128 }, { 32 } }, - { "spawns", MFILE_SPAWNS, 8, MissileDataFlags::NoGraphics, { 0 }, { 9 }, { 96 }, { 16 } }, - { "reflect", MFILE_REFLECT, 1, MissileDataFlags::NotAnimated, { 0 }, { 1 }, { 160 }, { 64 } }, - { "ms_ora", MFILE_LICH, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, { 96 }, { 8 } }, - { "ms_bla", MFILE_MSBLA, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, { 96 }, { 8 } }, - { "ms_reb", MFILE_NECROMORB, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, { 96 }, { 8 } }, - { "ms_yeb", MFILE_ARCHLICH, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, { 96 }, { 8 } }, - { "rglows1", MFILE_RUNE, 1, MissileDataFlags::None, { 0 }, { 10 }, { 96 }, { 8 } }, - { "ex_yel2", MFILE_EXYEL2, 1, MissileDataFlags::NoGraphics, { 0 }, { 10 }, { 220 }, { 78 } }, - { "ex_blu2", MFILE_EXBL2, 1, MissileDataFlags::NoGraphics, { 0 }, { 10 }, { 212 }, { 86 } }, - { "ex_red3", MFILE_EXRED3, 1, MissileDataFlags::NoGraphics, { 0 }, { 7 }, { 292 }, { 114 } }, - { "ms_blb", MFILE_BONEDEMON, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, { 96 }, { 8 } }, - { "ex_ora1", MFILE_EXORA1, 1, MissileDataFlags::NoGraphics, { 0 }, { 13 }, { 96 }, { -12 } }, - { "ex_blu3", MFILE_EXBL3, 1, MissileDataFlags::NoGraphics, { 0 }, { 7 }, { 292 }, { 114 } }, - { "", MFILE_NONE, 0, MissileDataFlags::None, }, + // name, animName, animFAmt, flags, animDelay[16], animLen[16], animWidth,' animWidth2 + { "Arrows", MFILE_ARROWS, 1, MissileDataFlags::NotAnimated, { 0 }, { 16 }, 96, 16 }, + { "Fireba", MFILE_FIREBA, 16, MissileDataFlags::None, { 0 }, { 14 }, 96, 16 }, + { "Guard", MFILE_GUARD, 3, MissileDataFlags::None, { 1 }, { 15, 14, 3 }, 96, 16 }, + { "Lghning", MFILE_LGHNING, 1, MissileDataFlags::None, { 0 }, { 8 }, 96, 16 }, + { "Firewal", MFILE_FIREWAL, 2, MissileDataFlags::None, { 0 }, { 13, 11 }, 128, 32 }, + { "MagBlos", MFILE_MAGBLOS, 1, MissileDataFlags::None, { 1 }, { 10 }, 128, 32 }, + { "Portal", MFILE_PORTAL, 2, MissileDataFlags::None, { 0, 1 }, { 16 }, 96, 16 }, + { "Bluexfr", MFILE_BLUEXFR, 1, MissileDataFlags::None, { 0 }, { 19 }, 160, 48 }, + { "Bluexbk", MFILE_BLUEXBK, 1, MissileDataFlags::None, { 0 }, { 19 }, 160, 48 }, + { "Manashld", MFILE_MANASHLD, 1, MissileDataFlags::NotAnimated, { 0 }, { 1 }, 96, 16 }, + { "Blood", MFILE_BLOOD, 4, MissileDataFlags::NoGraphics, { 0 }, { 15 }, 96, 16 }, + { "Bone", MFILE_BONE, 3, MissileDataFlags::NoGraphics, { 2 }, { 8 }, 128, 32 }, + { "Metlhit", MFILE_METLHIT, 3, MissileDataFlags::NoGraphics, { 2 }, { 10 }, 96, 16 }, + { "Farrow", MFILE_FARROW, 16, MissileDataFlags::None, { 0 }, { 4 }, 96, 16 }, + { "Doom", MFILE_DOOM, 9, MissileDataFlags::NoGraphics, { 1 }, { 15 }, 96, 16 }, + { " ", MFILE_0F, 1, MissileDataFlags::NoGraphics, { 0 }, { 0 }, 0, 0 }, + { "Blodbur", MFILE_BLODBUR, 2, MissileDataFlags::NoGraphics, { 2 }, { 8 }, 128, 32 }, + { "Newexp", MFILE_NEWEXP, 1, MissileDataFlags::None, { 1 }, { 15 }, 96, 16 }, + { "Shatter1", MFILE_SHATTER1, 1, MissileDataFlags::None, { 1 }, { 12 }, 128, 32 }, + { "Bigexp", MFILE_BIGEXP, 1, MissileDataFlags::None, { 0 }, { 15 }, 160, 48 }, + { "Inferno", MFILE_INFERNO, 1, MissileDataFlags::None, { 0 }, { 20 }, 96, 16 }, + { "Thinlght", MFILE_THINLGHT, 1, MissileDataFlags::NoGraphics, { 0 }, { 8 }, 96, 16 }, + { "Flare", MFILE_FLARE, 1, MissileDataFlags::None, { 0 }, { 16 }, 128, 32 }, + { "Flareexp", MFILE_FLAREEXP, 1, MissileDataFlags::None, { 0 }, { 7 }, 128, 32 }, + { "Magball", MFILE_MAGBALL, 8, MissileDataFlags::NoGraphics, { 1 }, { 16 }, 128, 32 }, + { "Krull", MFILE_KRULL, 1, MissileDataFlags::NoGraphics, { 0 }, { 14 }, 96, 16 }, + { "Miniltng", MFILE_MINILTNG, 1, MissileDataFlags::None, { 1 }, { 8 }, 64, 0 }, + { "Holy", MFILE_HOLY, 16, MissileDataFlags::None, { 1, 0 }, { 14 }, 96, 16 }, + { "Holyexpl", MFILE_HOLYEXPL, 1, MissileDataFlags::None, { 0 }, { 8 }, 160, 48 }, + { "Larrow", MFILE_LARROW, 16, MissileDataFlags::None, { 0 }, { 4 }, 96, 16 }, + { "Firarwex", MFILE_FIRARWEX, 1, MissileDataFlags::NoGraphics, { 0 }, { 6 }, 64, 0 }, + { "Acidbf", MFILE_ACIDBF, 16, MissileDataFlags::NoGraphics, { 0 }, { 8 }, 96, 16 }, + { "Acidspla", MFILE_ACIDSPLA, 1, MissileDataFlags::NoGraphics, { 0 }, { 8 }, 96, 16 }, + { "Acidpud", MFILE_ACIDPUD, 2, MissileDataFlags::NoGraphics, { 0 }, { 9, 4 }, 96, 16 }, + { "Ethrshld", MFILE_ETHRSHLD, 1, MissileDataFlags::NoGraphics, { 0 }, { 1 }, 96, 16 }, + { "Firerun", MFILE_FIRERUN, 8, MissileDataFlags::None, { 1 }, { 12 }, 96, 16 }, + { "Ressur1", MFILE_RESSUR1, 1, MissileDataFlags::None, { 0 }, { 16 }, 96, 16 }, + { "Sklball", MFILE_SKLBALL, 9, MissileDataFlags::None, { 1 }, { 16, 16, 16, 16, 16, 16, 16, 16, 8 }, 96, 16 }, + { "Rportal", MFILE_RPORTAL, 2, MissileDataFlags::None, { 0 }, { 16 }, 96, 16 }, + { "Fireplar", MFILE_FIREPLAR, 1, MissileDataFlags::NoGraphics, { 1 }, { 17 }, 160, 48 }, + { "Scubmisb", MFILE_SCUBMISB, 1, MissileDataFlags::NoGraphics, { 0 }, { 16 }, 96, 16 }, + { "Scbsexpb", MFILE_SCBSEXPB, 1, MissileDataFlags::NoGraphics, { 0 }, { 6 }, 128, 32 }, + { "Scubmisc", MFILE_SCUBMISC, 1, MissileDataFlags::NoGraphics, { 0 }, { 16 }, 96, 16 }, + { "Scbsexpc", MFILE_SCBSEXPC, 1, MissileDataFlags::NoGraphics, { 0 }, { 6 }, 128, 32 }, + { "Scubmisd", MFILE_SCUBMISD, 1, MissileDataFlags::NoGraphics, { 0 }, { 16 }, 96, 16 }, + { "Scbsexpd", MFILE_SCBSEXPD, 1, MissileDataFlags::NoGraphics, { 0 }, { 6 }, 128, 32 }, + { "spawns", MFILE_SPAWNS, 8, MissileDataFlags::NoGraphics, { 0 }, { 9 }, 96, 16 }, + { "reflect", MFILE_REFLECT, 1, MissileDataFlags::NotAnimated, { 0 }, { 1 }, 160, 64 }, + { "ms_ora", MFILE_LICH, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, 96, 8 }, + { "ms_bla", MFILE_MSBLA, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, 96, 8 }, + { "ms_reb", MFILE_NECROMORB, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, 96, 8 }, + { "ms_yeb", MFILE_ARCHLICH, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, 96, 8 }, + { "rglows1", MFILE_RUNE, 1, MissileDataFlags::None, { 0 }, { 10 }, 96, 8 }, + { "ex_yel2", MFILE_EXYEL2, 1, MissileDataFlags::NoGraphics, { 0 }, { 10 }, 220, 78 }, + { "ex_blu2", MFILE_EXBL2, 1, MissileDataFlags::NoGraphics, { 0 }, { 10 }, 212, 86 }, + { "ex_red3", MFILE_EXRED3, 1, MissileDataFlags::NoGraphics, { 0 }, { 7 }, 292, 114 }, + { "ms_blb", MFILE_BONEDEMON, 16, MissileDataFlags::NoGraphics, { 0 }, { 15 }, 96, 8 }, + { "ex_ora1", MFILE_EXORA1, 1, MissileDataFlags::NoGraphics, { 0 }, { 13 }, 96, -12 }, + { "ex_blu3", MFILE_EXBL3, 1, MissileDataFlags::NoGraphics, { 0 }, { 7 }, 292, 114 }, + { "", MFILE_NONE, 0, MissileDataFlags::None, { }, { }, 0, 0 }, // clang-format on }; @@ -216,15 +216,15 @@ std::array maybeAutofill(std::initializer_list list) MissileFileData::MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags, std::initializer_list animDelay, std::initializer_list animLen, - std::initializer_list animWidth, std::initializer_list animWidth2) + int16_t animWidth, int16_t animWidth2) : name(name) , animName(animName) , animFAmt(animFAmt) , flags(flags) , animDelay(maybeAutofill(animDelay)) , animLen(maybeAutofill(animLen)) - , animWidth(maybeAutofill(animWidth)) - , animWidth2(maybeAutofill(animWidth2)) + , animWidth(animWidth) + , animWidth2(animWidth2) { } diff --git a/Source/misdat.h b/Source/misdat.h index aad115e91..949530fa3 100644 --- a/Source/misdat.h +++ b/Source/misdat.h @@ -135,23 +135,15 @@ struct MissileFileData { uint8_t animName; uint8_t animFAmt; MissileDataFlags flags; - std::array, 16> animData; std::array animDelay = {}; std::array animLen = {}; - std::array animWidth = {}; - std::array animWidth2 = {}; - - MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags) - : name(name) - , animName(animName) - , animFAmt(animFAmt) - , flags(flags) - { - } + int16_t animWidth; + int16_t animWidth2; + std::array, 16> animData; MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags, std::initializer_list animDelay, std::initializer_list animLen, - std::initializer_list animWidth, std::initializer_list animWidth2); + int16_t animWidth, int16_t animWidth2); void LoadGFX(); diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 645f78b4d..b2f5b3b3d 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -618,8 +618,8 @@ void SetMissAnim(int mi, int animtype) Missiles[mi]._miAnimData = MissileSpriteData[animtype].animData[dir].get(); Missiles[mi]._miAnimDelay = MissileSpriteData[animtype].animDelay[dir]; Missiles[mi]._miAnimLen = MissileSpriteData[animtype].animLen[dir]; - Missiles[mi]._miAnimWidth = MissileSpriteData[animtype].animWidth[dir]; - Missiles[mi]._miAnimWidth2 = MissileSpriteData[animtype].animWidth2[dir]; + Missiles[mi]._miAnimWidth = MissileSpriteData[animtype].animWidth; + Missiles[mi]._miAnimWidth2 = MissileSpriteData[animtype].animWidth2; Missiles[mi]._miAnimCnt = 0; Missiles[mi]._miAnimFrame = 1; } @@ -740,36 +740,6 @@ void FireballUpdate(int i, Displacement offset, bool alwaysDelete) PutMissile(i); } -void MissileRing(int i, int type) -{ - Missiles[i]._miDelFlag = true; - int8_t src = Missiles[i]._micaster; - uint8_t lvl = src > 0 ? Players[src]._pLevel : currlevel; - int dmg = 16 * (GenerateRndSum(10, 2) + lvl + 2) / 2; - - int k = CrawlNum[3]; - int ck = k + 2; - for (auto j = static_cast(CrawlTable[k]); j > 0; j--, ck += 2) { - int tx = Missiles[i]._miVar1 + CrawlTable[ck - 1]; - int ty = Missiles[i]._miVar2 + CrawlTable[ck]; - if (!InDungeonBounds({ tx, ty })) - continue; - int dp = dPiece[tx][ty]; - if (nSolidTable[dp]) - continue; - if (dObject[tx][ty] != 0) - continue; - if (!LineClearMissile(Missiles[i].position.tile, { tx, ty })) - continue; - if (nMissileTable[dp] || Missiles[i].limitReached) { - Missiles[i].limitReached = true; - continue; - } - - AddMissile({ tx, ty }, { tx, ty }, 0, type, TARGET_BOTH, src, dmg, Missiles[i]._mispllvl); - } -} - bool GrowWall(int playerId, Point position, Point target, missile_id type, int spellLevel, int damage) { int dp = dPiece[position.x][position.y]; @@ -1664,33 +1634,6 @@ void AddRuneExplosion(int mi, Point src, Point /*dst*/, int /*midir*/, int8_t mi Missiles[mi]._mirange = Missiles[mi]._miAnimLen - 1; } -void AddImmolation(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int /*dam*/) -{ - if (src == dst) { - dst += static_cast(midir); - } - int sp = 16; - if (mienemy == TARGET_MONSTERS) { - sp += std::min(Missiles[mi]._mispllvl * 2, 34); - - int dmg = 2 * (Players[id]._pLevel + GenerateRndSum(10, 2)) + 4; - Missiles[mi]._midam = ScaleSpellEffect(dmg, Missiles[mi]._mispllvl); - - UseMana(id, SPL_FIREBALL); - } - UpdateMissileVelocity(mi, src, dst, sp); - SetMissDir(mi, GetDirection16(src, dst)); - Missiles[mi]._mirange = 256; - Missiles[mi]._miVar1 = src.x; - Missiles[mi]._miVar2 = src.y; - Missiles[mi]._miVar3 = 0; - Missiles[mi]._miVar4 = src.x; - Missiles[mi]._miVar5 = src.y; - Missiles[mi]._miVar6 = 2; - Missiles[mi]._miVar7 = 2; - Missiles[mi]._mlid = AddLight(src, 8); -} - void AddFireNova(int mi, Point src, Point dst, int midir, int8_t mienemy, int /*id*/, int /*dam*/) { if (src == dst) { @@ -2012,15 +1955,6 @@ void AddMagmaball(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy* Missiles[mi]._mlid = AddLight(src, 8); } -void AddKrull(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int /*dam*/) -{ - UpdateMissileVelocity(mi, src, dst, 16); - Missiles[mi]._mirange = 256; - Missiles[mi]._miVar1 = src.x; - Missiles[mi]._miVar2 = src.y; - PutMissile(mi); -} - void AddTeleport(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/) { Missiles[mi]._miDelFlag = true; @@ -2344,34 +2278,6 @@ void AddChain(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy* UseMana(id, SPL_CHAIN); } -void AddBloodStar(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int /*dam*/) -{ - SetMissDir(mi, dst.x); - Missiles[mi]._midam = 0; - Missiles[mi]._miLightFlag = true; - Missiles[mi]._mirange = 250; -} - -void AddBone(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int /*dam*/) -{ - if (dst.x > 3) - dst.x = 2; - SetMissDir(mi, dst.x); - Missiles[mi]._midam = 0; - Missiles[mi]._miLightFlag = true; - Missiles[mi]._mirange = 250; -} - -void AddMetlHit(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int /*dam*/) -{ - if (dst.x > 3) - dst.x = 2; - SetMissDir(mi, dst.x); - Missiles[mi]._midam = 0; - Missiles[mi]._miLightFlag = true; - Missiles[mi]._mirange = Missiles[mi]._miAnimLen; -} - namespace { void InitMissileAnimationFromMonster(MissileStruct &mis, int midir, const MonsterStruct &mon, MonsterGraphic graphic) { @@ -2415,18 +2321,6 @@ void AddRhino(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int i PutMissile(mi); } -void AddFireman(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int id, int /*dam*/) -{ - auto &monster = Monsters[id]; - - UpdateMissileVelocity(mi, src, dst, 16); - InitMissileAnimationFromMonster(Missiles[mi], midir, monster, MonsterGraphic::Walk); - if (monster._uniqtype != 0) - Missiles[mi]._miUniqTrans = monster._uniqtrans + 1; - dMonster[monster.position.tile.x][monster.position.tile.y] = 0; - PutMissile(mi); -} - void AddFlare(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int /*dam*/) { if (src == dst) { @@ -2471,15 +2365,6 @@ void AddAcid(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, in PutMissile(mi); } -void AddFireWallA(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int dam) -{ - Missiles[mi]._midam = dam; - Missiles[mi].position.velocity = { 0, 0 }; - Missiles[mi]._mirange = 50; - Missiles[mi]._miVar1 = Missiles[mi]._mirange - Missiles[mi]._miAnimLen; - Missiles[mi]._miVar2 = 0; -} - void AddAcidpud(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int /*dam*/) { Missiles[mi].position.velocity = { 0, 0 }; @@ -2564,39 +2449,6 @@ void AddGolem(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, i UseMana(id, SPL_GOLEM); } -void AddEtherealize(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t mienemy, int id, int /*dam*/) -{ - auto &player = Players[id]; - - int range = 8 * player._pLevel; - Missiles[mi]._mirange = ScaleSpellEffect(range, Missiles[mi]._mispllvl); - - Missiles[mi]._mirange += Missiles[mi]._mirange * player._pISplDur / 128; - Missiles[mi]._miVar1 = player._pHitPoints; - Missiles[mi]._miVar2 = player._pHPBase; - if (mienemy == TARGET_MONSTERS) - UseMana(id, SPL_ETHEREALIZE); -} - -void AddDummy(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int /*dam*/) -{ - Missiles[mi]._miDelFlag = true; -} - -void AddBlodbur(int mi, Point src, Point /*dst*/, int /*midir*/, int8_t /*mienemy*/, int id, int dam) -{ - Missiles[mi]._midam = dam; - Missiles[mi].position.tile = src; - Missiles[mi].position.start = src; - Missiles[mi]._misource = id; - if (dam == 1) - SetMissDir(mi, 0); - else - SetMissDir(mi, 1); - Missiles[mi]._miLightFlag = true; - Missiles[mi]._mirange = Missiles[mi]._miAnimLen; -} - void AddBoom(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int dam) { Missiles[mi].position.tile = dst; @@ -3059,10 +2911,6 @@ int AddMissile(Point src, Point dst, int midir, int mitype, int8_t micaster, int return mi; } -void MI_Dummy(int i) -{ -} - void MI_Golem(int mi) { int src = Missiles[mi]._misource; @@ -3324,17 +3172,6 @@ void MI_Lightball(int i) PutMissile(i); } -void MI_Krull(int i) -{ - Missiles[i]._mirange--; - Missiles[i].position.traveled += Missiles[i].position.velocity; - UpdateMissilePos(i); - CheckMissileCol(i, Missiles[i]._midam, Missiles[i]._midam, false, Missiles[i].position.tile, false); - if (Missiles[i]._mirange == 0) - Missiles[i]._miDelFlag = true; - PutMissile(i); -} - void MI_Acidpud(int i) { Missiles[i]._mirange--; @@ -3465,35 +3302,6 @@ void MI_HiveExplode(int i) PutMissile(i); } -void MI_Immolation(int i) -{ - if (Missiles[i]._miVar7 < 0) { - int v = 2 * Missiles[i]._miVar6; - Missiles[i]._miVar6 = v; - Missiles[i]._miVar7 = v; - Missiles[i]._mimfnum = left[Missiles[i]._mimfnum]; - } else { - Missiles[i]._miVar7--; - } - - Displacement offset = Missiles[i].position.velocity; - - switch (Missiles[i]._mimfnum) { - case DIR_S: - case DIR_N: - offset.deltaY = 0; - break; - case DIR_W: - case DIR_E: - offset.deltaX = 0; - break; - default: - break; - } - - FireballUpdate(i, offset, true); -} - void MI_LightningArrow(int i) { Missiles[i]._mirange--; @@ -3577,12 +3385,32 @@ void MI_Reflect(int i) void MI_FireRing(int i) { - MissileRing(i, MIS_FIREWALL); -} + Missiles[i]._miDelFlag = true; + int8_t src = Missiles[i]._micaster; + uint8_t lvl = src > 0 ? Players[src]._pLevel : currlevel; + int dmg = 16 * (GenerateRndSum(10, 2) + lvl + 2) / 2; -void MI_LightningRing(int i) -{ - MissileRing(i, MIS_LIGHTWALL); + int k = CrawlNum[3]; + int ck = k + 2; + for (auto j = static_cast(CrawlTable[k]); j > 0; j--, ck += 2) { + int tx = Missiles[i]._miVar1 + CrawlTable[ck - 1]; + int ty = Missiles[i]._miVar2 + CrawlTable[ck]; + if (!InDungeonBounds({ tx, ty })) + continue; + int dp = dPiece[tx][ty]; + if (nSolidTable[dp]) + continue; + if (dObject[tx][ty] != 0) + continue; + if (!LineClearMissile(Missiles[i].position.tile, { tx, ty })) + continue; + if (nMissileTable[dp] || Missiles[i].limitReached) { + Missiles[i].limitReached = true; + continue; + } + + AddMissile({ tx, ty }, { tx, ty }, 0, MIS_FIREWALL, TARGET_BOTH, src, dmg, Missiles[i]._mispllvl); + } } void MI_Search(int i) @@ -3889,35 +3717,6 @@ void MI_Manashield(int i) PutMissile(i); } -void MI_Etherealize(int i) -{ - Missiles[i]._mirange--; - - auto &player = Players[Missiles[i]._misource]; - - Missiles[i].position.tile = player.position.tile; - Missiles[i].position.traveled.deltaX = player.position.offset.deltaX << 16; - Missiles[i].position.traveled.deltaY = player.position.offset.deltaY << 16; - if (player._pmode == PM_WALK3) { - Missiles[i].position.start = player.position.future; - } else { - Missiles[i].position.start = player.position.tile; - } - UpdateMissilePos(i); - if (player._pmode == PM_WALK3) { - if (player._pdir == DIR_W) - Missiles[i].position.tile.x++; - else - Missiles[i].position.tile.y++; - } - player._pSpellFlags |= 1; - if (Missiles[i]._mirange == 0 || player._pHitPoints <= 0) { - Missiles[i]._miDelFlag = true; - player._pSpellFlags &= ~0x1; - } - PutMissile(i); -} - void MI_Firemove(int i) { constexpr int ExpLight[14] = { 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 12 }; @@ -4044,16 +3843,6 @@ void MI_Chain(int mi) Missiles[mi]._miDelFlag = true; } -void MI_Blood(int i) -{ - Missiles[i]._mirange--; - if (Missiles[i]._mirange == 0) - Missiles[i]._miDelFlag = true; - if (Missiles[i]._miAnimFrame == Missiles[i]._miAnimLen) - Missiles[i]._miPreFlag = true; - PutMissile(i); -} - void MI_Weapexp(int i) { constexpr int ExpLight[10] = { 9, 10, 11, 12, 11, 10, 8, 6, 4, 2 }; @@ -4229,38 +4018,6 @@ void MI_Rhino(int i) PutMissile(i); } -void MI_Fireman(int i) -{ - UpdateMissilePos(i); - Point a = Missiles[i].position.tile; - Missiles[i].position.traveled += Missiles[i].position.velocity; - UpdateMissilePos(i); - auto &monster = Monsters[Missiles[i]._misource]; - Point b = Missiles[i].position.tile; - int enemy = monster._menemy; - Point c = (monster._mFlags & MFLAG_TARGETS_MONSTER) == 0 ? Players[enemy].position.tile : Monsters[enemy].position.tile; - - int j = 0; - if (b != a && (((Missiles[i]._miVar1 & 1) != 0 && a.WalkingDistance(c) >= 4) || Missiles[i]._miVar2 > 1) && IsTileAvailable(monster, a)) { - MissToMonst(i, a); - Missiles[i]._miDelFlag = true; - } else if ((monster._mFlags & MFLAG_TARGETS_MONSTER) == 0) { - j = dPlayer[b.x][b.y]; - } else { - j = dMonster[b.x][b.y]; - } - if (!PosOkMissile(b) || (j > 0 && (Missiles[i]._miVar1 & 1) == 0)) { - Missiles[i].position.velocity *= -1; - Missiles[i]._mimfnum = opposite[Missiles[i]._mimfnum]; - Missiles[i]._miAnimData = monster.MType->GetAnimData(MonsterGraphic::Walk).CelSpritesForDirections[Missiles[i]._mimfnum]->Data(); - Missiles[i]._miVar2++; - if (j > 0) - Missiles[i]._miVar1 |= 1; - } - MoveMissilePos(i); - PutMissile(i); -} - void MI_FirewallC(int i) { Missiles[i]._mirange--; @@ -4732,7 +4489,8 @@ void ProcessMissiles() for (int i = 0; i < ActiveMissileCount; i++) { auto &missile = Missiles[ActiveMissiles[i]]; - MissileData[missile._mitype].mProc(ActiveMissiles[i]); + if (MissileData[missile._mitype].mProc != nullptr) + MissileData[missile._mitype].mProc(ActiveMissiles[i]); if (missile._miAnimFlags == MissileDataFlags::NotAnimated) continue; diff --git a/Source/missiles.h b/Source/missiles.h index 77b941606..617831bae 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -159,7 +159,6 @@ void AddSpecArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int i void AddWarp(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddLightningWall(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddRuneExplosion(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddImmolation(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddFireNova(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddLightningArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddMana(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); @@ -172,7 +171,6 @@ void AddArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i void AddRndTeleport(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddFirebolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id, int dam); void AddMagmaball(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddKrull(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddTeleport(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddLightball(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddFirewall(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); @@ -188,20 +186,12 @@ void AddManashield(int mi, Point src, Point dst, int midir, int8_t mienemy, int void AddFiremove(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddGuardian(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddChain(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddBloodStar(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddBone(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddMetlHit(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddRhino(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddFireman(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddFlare(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddAcid(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddFireWallA(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddAcidpud(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddStone(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddGolem(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddEtherealize(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddDummy(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); -void AddBlodbur(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddBoom(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddHeal(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddHealOther(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); @@ -227,14 +217,12 @@ void AddBoneSpirit(int mi, Point src, Point dst, int midir, int8_t mienemy, int void AddRportal(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); void AddDiabApoca(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam); int AddMissile(Point src, Point dst, int midir, int mitype, int8_t micaster, int id, int midam, int spllvl); -void MI_Dummy(int i); void MI_Golem(int mi); void MI_Manashield(int i); void MI_LArrow(int i); void MI_Arrow(int i); void MI_Firebolt(int i); void MI_Lightball(int i); -void MI_Krull(int i); void MI_Acidpud(int i); void MI_Firewall(int i); void MI_Fireball(int i); @@ -242,11 +230,9 @@ void MI_HorkSpawn(int mi); void MI_Rune(int i); void MI_LightningWall(int i); void MI_HiveExplode(int i); -void MI_Immolation(int i); void MI_LightningArrow(int i); void MI_Reflect(int i); void MI_FireRing(int i); -void MI_LightningRing(int i); void MI_Search(int i); void MI_LightningWallC(int i); void MI_FireNova(int i); @@ -256,11 +242,9 @@ void MI_Lightning(int i); void MI_Town(int i); void MI_Flash(int i); void MI_Flash2(int i); -void MI_Etherealize(int i); void MI_Firemove(int i); void MI_Guardian(int i); void MI_Chain(int mi); -void MI_Blood(int i); void MI_Weapexp(int i); void MI_Misexp(int i); void MI_Acidsplat(int i); @@ -268,7 +252,6 @@ void MI_Teleport(int i); void MI_Stone(int i); void MI_Boom(int i); void MI_Rhino(int i); -void MI_Fireman(int i); void MI_FirewallC(int i); void MI_Infra(int i); void MI_Apoca(int i); diff --git a/Source/monster.cpp b/Source/monster.cpp index 7d4df8921..fa3625f36 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -2941,61 +2941,6 @@ void StormAi(int i) AiRangedAvoidance(i, MIS_LIGHTCTRL2, true, 4, 0); } -void FiremanAi(int i) -{ - assert(i >= 0 && i < MAXMONSTERS); - auto &monster = Monsters[i]; - - if (monster._mmode != MM_STAND || monster._msquelch == 0) - return; - - int pnum = monster._menemy; - int fx = monster.enemyPosition.x; - int fy = monster.enemyPosition.y; - int xd = monster.position.tile.x - fx; - int yd = monster.position.tile.y - fy; - - Direction md = GetMonsterDirection(monster); - if (monster._mgoal == MGOAL_NORMAL) { - if (LineClearMissile(monster.position.tile, { fx, fy }) - && AddMissile(monster.position.tile, { fx, fy }, md, MIS_FIREMAN, pnum, i, 0, 0) != -1) { - monster._mmode = MM_CHARGE; - monster._mgoal = MGOAL_ATTACK2; - monster._mgoalvar1 = 0; - } - } else if (monster._mgoal == MGOAL_ATTACK2) { - if (monster._mgoalvar1 == 3) { - monster._mgoal = MGOAL_NORMAL; - StartFadeout(monster, md, true); - } else if (LineClearMissile(monster.position.tile, { fx, fy })) { - StartRangedAttack(monster, MIS_KRULL, 4); - monster._mgoalvar1++; - } else { - AiDelay(monster, GenerateRnd(10) + 5); - monster._mgoalvar1++; - } - } else if (monster._mgoal == MGOAL_RETREAT) { - StartFadein(monster, md, false); - monster._mgoal = MGOAL_ATTACK2; - } - monster._mdir = md; - AdvanceRndSeed(); - if (monster._mmode != MM_STAND) - return; - - if (abs(xd) < 2 && abs(yd) < 2 && monster._mgoal == MGOAL_NORMAL) { - MonsterAttackPlayer(i, monster._menemy, monster.mHit, monster.mMinDamage, monster.mMaxDamage); - monster._mgoal = MGOAL_RETREAT; - if (!RandomWalk(i, opposite[md])) { - StartFadein(monster, md, false); - monster._mgoal = MGOAL_ATTACK2; - } - } else if (!RandomWalk(i, md) && (monster._mgoal == MGOAL_NORMAL || monster._mgoal == MGOAL_RETREAT)) { - StartFadein(monster, md, false); - monster._mgoal = MGOAL_ATTACK2; - } -} - void GharbadAi(int i) { assert(i >= 0 && i < MAXMONSTERS); @@ -3610,7 +3555,7 @@ void (*AiProc[])(int i) = { &SuccubusAi, &SneakAi, &StormAi, - &FiremanAi, + nullptr, &GharbadAi, &AcidAvoidanceAi, &AcidAi, @@ -3827,12 +3772,6 @@ void InitMonsterGFX(int monst) MissileSpriteData[MFILE_MAGBALL].LoadGFX(); if (mtype >= MT_STORM && mtype <= MT_MAEL) MissileSpriteData[MFILE_THINLGHT].LoadGFX(); - if (mtype == MT_SUCCUBUS) { - MissileSpriteData[MFILE_FLARE].LoadGFX(); - MissileSpriteData[MFILE_FLAREEXP].LoadGFX(); - } - if (mtype >= MT_INCIN && mtype <= MT_HELLBURN) - MissileSpriteData[MFILE_KRULL].LoadGFX(); if (mtype == MT_SNOWWICH) { MissileSpriteData[MFILE_SCUBMISB].LoadGFX(); MissileSpriteData[MFILE_SCBSEXPB].LoadGFX(); @@ -3845,8 +3784,6 @@ void InitMonsterGFX(int monst) MissileSpriteData[MFILE_SCUBMISC].LoadGFX(); MissileSpriteData[MFILE_SCBSEXPC].LoadGFX(); } - if (mtype >= MT_INCIN && mtype <= MT_HELLBURN) - MissileSpriteData[MFILE_KRULL].LoadGFX(); if ((mtype >= MT_NACID && mtype <= MT_XACID) || mtype == MT_SPIDLORD) { MissileSpriteData[MFILE_ACIDBF].LoadGFX(); MissileSpriteData[MFILE_ACIDSPLA].LoadGFX(); diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index db45d1849..acaa41efc 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -417,9 +417,9 @@ void DrawMonster(const Surface &out, int x, int y, int mx, int my, const Monster */ void DrawPlayerIconHelper(const Surface &out, int pnum, missile_graphic_id missileGraphicId, int x, int y, bool lighting) { - x += CalculateWidth2(Players[pnum].AnimInfo.pCelSprite->Width()) - MissileSpriteData[missileGraphicId].animWidth2[0]; + x += CalculateWidth2(Players[pnum].AnimInfo.pCelSprite->Width()) - MissileSpriteData[missileGraphicId].animWidth2; - int width = MissileSpriteData[missileGraphicId].animWidth[0]; + int width = MissileSpriteData[missileGraphicId].animWidth; byte *pCelBuff = MissileSpriteData[missileGraphicId].animData[0].get(); CelSprite cel { pCelBuff, width };