diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 7277ff803..b8f34bc7f 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -748,7 +748,6 @@ bool GrowWall(int playerId, Point position, Point target, missile_id type, int s return true; } - /** * @brief Find parent missile (uses _miVar4) * @@ -2078,7 +2077,7 @@ void AddLightning(MissileStruct &missile, Point dst, Direction /*midir*/) missile._mlid = AddLight(missile.position.tile, 4); } -void AddMisexp(MissileStruct &missile, Point dst, Direction /*midir*/) +void AddMisexp(MissileStruct &missile, Point /*dst*/, Direction /*midir*/) { if (missile._micaster != TARGET_MONSTERS && missile._misource >= 0) { switch (Monsters[missile._misource].MType->mtype) { @@ -2099,10 +2098,12 @@ void AddMisexp(MissileStruct &missile, Point dst, Direction /*midir*/) } } - missile.position.tile = Missiles[dst.x].position.tile; - missile.position.start = Missiles[dst.x].position.start; - missile.position.offset = Missiles[dst.x].position.offset; - missile.position.traveled = Missiles[dst.x].position.traveled; + int mx = FindParent(missile); + assert(mx != -1); // AddMisexp will always be called with a parent associated to the missile. + missile.position.tile = Missiles[mx].position.tile; + missile.position.start = Missiles[mx].position.start; + missile.position.offset = Missiles[mx].position.offset; + missile.position.traveled = Missiles[mx].position.traveled; missile._mirange = missile._miAnimLen; } @@ -3041,17 +3042,19 @@ void MI_Firebolt(int i) missile.position.traveled = { omx, omy }; UpdateMissilePos(missile); missile.position.StopMissile(); + missile._miVar4 = -(AvailableMissiles[0] + 1); + Point dst = { 0, 0 }; auto dir = static_cast(missile._mimfnum); switch (missile._mitype) { case MIS_FIREBOLT: case MIS_MAGMABALL: - AddMissile(missile.position.tile, { i, 0 }, dir, MIS_MISEXP, missile._micaster, missile._misource, 0, 0); + AddMissile(missile.position.tile, dst, dir, MIS_MISEXP, missile._micaster, missile._misource, 0, 0); break; case MIS_FLARE: - AddMissile(missile.position.tile, { i, 0 }, dir, MIS_MISEXP2, missile._micaster, missile._misource, 0, 0); + AddMissile(missile.position.tile, dst, dir, MIS_MISEXP2, missile._micaster, missile._misource, 0, 0); break; case MIS_ACID: - AddMissile(missile.position.tile, { i, 0 }, dir, MIS_MISEXP3, missile._micaster, missile._misource, 0, 0); + AddMissile(missile.position.tile, dst, dir, MIS_MISEXP3, missile._micaster, missile._misource, 0, 0); break; case MIS_BONESPIRIT: SetMissDir(missile, 8); @@ -3060,23 +3063,24 @@ void MI_Firebolt(int i) PutMissile(missile); return; case MIS_LICH: - AddMissile(missile.position.tile, { i, 0 }, dir, MIS_EXORA1, missile._micaster, missile._misource, 0, 0); + AddMissile(missile.position.tile, dst, dir, MIS_EXORA1, missile._micaster, missile._misource, 0, 0); break; case MIS_PSYCHORB: - AddMissile(missile.position.tile, { i, 0 }, dir, MIS_EXBL2, missile._micaster, missile._misource, 0, 0); + AddMissile(missile.position.tile, dst, dir, MIS_EXBL2, missile._micaster, missile._misource, 0, 0); break; case MIS_NECROMORB: - AddMissile(missile.position.tile, { i, 0 }, dir, MIS_EXRED3, missile._micaster, missile._misource, 0, 0); + AddMissile(missile.position.tile, dst, dir, MIS_EXRED3, missile._micaster, missile._misource, 0, 0); break; case MIS_ARCHLICH: - AddMissile(missile.position.tile, { i, 0 }, dir, MIS_EXYEL2, missile._micaster, missile._misource, 0, 0); + AddMissile(missile.position.tile, dst, dir, MIS_EXYEL2, missile._micaster, missile._misource, 0, 0); break; case MIS_BONEDEMON: - AddMissile(missile.position.tile, { i, 0 }, dir, MIS_EXBL3, missile._micaster, missile._misource, 0, 0); + AddMissile(missile.position.tile, dst, dir, MIS_EXBL3, missile._micaster, missile._misource, 0, 0); break; default: break; } + missile._miVar4 = 0; if (missile._mlid != NO_LIGHT) AddUnLight(missile._mlid); PutMissile(missile);