Browse Source

Remove dead missile code

pull/2597/head
Anders Jenbo 5 years ago
parent
commit
f289fbcec5
  1. 7
      Source/dead.cpp
  2. 182
      Source/misdat.cpp
  3. 16
      Source/misdat.h
  4. 300
      Source/missiles.cpp
  5. 17
      Source/missiles.h
  6. 65
      Source/monster.cpp
  7. 4
      Source/scrollrt.cpp

7
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();

182
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<T, 16> maybeAutofill(std::initializer_list<T> list)
MissileFileData::MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags,
std::initializer_list<uint8_t> animDelay, std::initializer_list<uint8_t> animLen,
std::initializer_list<int16_t> animWidth, std::initializer_list<int16_t> 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)
{
}

16
Source/misdat.h

@ -135,23 +135,15 @@ struct MissileFileData {
uint8_t animName;
uint8_t animFAmt;
MissileDataFlags flags;
std::array<std::unique_ptr<byte[]>, 16> animData;
std::array<uint8_t, 16> animDelay = {};
std::array<uint8_t, 16> animLen = {};
std::array<int16_t, 16> animWidth = {};
std::array<int16_t, 16> 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<std::unique_ptr<byte[]>, 16> animData;
MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags,
std::initializer_list<uint8_t> animDelay, std::initializer_list<uint8_t> animLen,
std::initializer_list<int16_t> animWidth, std::initializer_list<int16_t> animWidth2);
int16_t animWidth, int16_t animWidth2);
void LoadGFX();

300
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<uint8_t>(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<Direction>(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<uint8_t>(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;

17
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);

65
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();

4
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 };

Loading…
Cancel
Save