diff --git a/Source/missiles.cpp b/Source/missiles.cpp index e525fade7..19751c17c 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3810,40 +3810,53 @@ void MI_Search(int i) AutoMapShowItems = false; } -void MI_LightningWallC(int i) +bool GrowWall(int playerId, Point position, Point target, missile_id type, int spellLevel, int damage) { - int tx, ty; + int dp = dPiece[position.x][position.y]; + assert(dp <= MAXTILES && dp >= 0); - missile[i]._mirange--; - int id = missile[i]._misource; - int lvl = (id > -1) ? plr[id]._pLevel : 0; + if (nMissileTable[dp] || !InDungeonBounds(target)) { + return false; + } - int dmg = 16 * (GenerateRnd(10) + GenerateRnd(10) + lvl + 2); + AddMissile(position, position, plr[playerId]._pdir, type, TARGET_BOTH, playerId, damage, spellLevel); + return true; +} + +void MI_LightningWallC(int i) +{ + missile[i]._mirange--; if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; return; } - int dp = dPiece[missile[i]._miVar1][missile[i]._miVar2]; - assert(dp <= MAXTILES && dp >= 0); - Point t = Point { missile[i]._miVar1, missile[i]._miVar2 } + (Direction)missile[i]._miVar3; - if (!nMissileTable[dp] && missile[i]._miVar8 == 0 && InDungeonBounds(t)) { - AddMissile({ missile[i]._miVar1, missile[i]._miVar2 }, { missile[i]._miVar1, missile[i]._miVar2 }, plr[id]._pdir, MIS_LIGHTWALL, TARGET_BOTH, id, dmg, missile[i]._mispllvl); - missile[i]._miVar1 = t.x; - missile[i]._miVar2 = t.y; - } else { - missile[i]._miVar8 = 1; + int id = missile[i]._misource; + int lvl = (id > -1) ? plr[id]._pLevel : 0; + int dmg = 16 * (GenerateRnd(10) + GenerateRnd(10) + lvl + 2); + + { + Point position = { missile[i]._miVar1, missile[i]._miVar2 }; + Point target = position + static_cast(missile[i]._miVar3); + + if (missile[i]._miVar8 == 0 && GrowWall(id, position, target, MIS_LIGHTWALL, missile[i]._mispllvl, dmg)) { + missile[i]._miVar1 = target.x; + missile[i]._miVar2 = target.y; + } else { + missile[i]._miVar8 = 1; + } } - dp = dPiece[missile[i]._miVar5][missile[i]._miVar6]; - assert(dp <= MAXTILES && dp >= 0); - t = Point { missile[i]._miVar5, missile[i]._miVar6 } + (Direction)missile[i]._miVar4; - if (!nMissileTable[dp] && missile[i]._miVar7 == 0 && InDungeonBounds(t)) { - AddMissile({ missile[i]._miVar5, missile[i]._miVar6 }, { missile[i]._miVar5, missile[i]._miVar6 }, plr[id]._pdir, MIS_LIGHTWALL, TARGET_BOTH, id, dmg, missile[i]._mispllvl); - missile[i]._miVar5 = t.x; - missile[i]._miVar6 = t.y; - } else { - missile[i]._miVar7 = 1; + { + Point position = { missile[i]._miVar5, missile[i]._miVar6 }; + Point target = position + static_cast(missile[i]._miVar4); + + if (missile[i]._miVar7 == 0 && GrowWall(id, position, target, MIS_LIGHTWALL, missile[i]._mispllvl, dmg)) { + missile[i]._miVar5 = target.x; + missile[i]._miVar6 = target.y; + } else { + missile[i]._miVar7 = 1; + } } } @@ -4504,35 +4517,36 @@ void MI_Fireman(int i) void MI_FirewallC(int i) { - int dp, tx, ty; - missile[i]._mirange--; - int id = missile[i]._misource; if (missile[i]._mirange == 0) { missile[i]._miDelFlag = true; return; } - int dp = dPiece[missile[i]._miVar1][missile[i]._miVar2]; - assert(dp <= MAXTILES && dp >= 0); - Point t = Point { missile[i]._miVar1, missile[i]._miVar2 } + (Direction)missile[i]._miVar3; - if (!nMissileTable[dp] && missile[i]._miVar8 == 0 && InDungeonBounds(t)) { - AddMissile({ missile[i]._miVar1, missile[i]._miVar2 }, { missile[i]._miVar1, missile[i]._miVar2 }, plr[id]._pdir, MIS_FIREWALL, TARGET_BOTH, id, 0, missile[i]._mispllvl); - missile[i]._miVar1 = t.x; - missile[i]._miVar2 = t.y; - } else { - missile[i]._miVar8 = 1; + int id = missile[i]._misource; + + { + Point position = { missile[i]._miVar1, missile[i]._miVar2 }; + Point target = position + static_cast(missile[i]._miVar3); + + if (missile[i]._miVar8 == 0 && GrowWall(id, position, target, MIS_FIREWALL, missile[i]._mispllvl, 0)) { + missile[i]._miVar1 = target.x; + missile[i]._miVar2 = target.y; + } else { + missile[i]._miVar8 = 1; + } } - dp = dPiece[missile[i]._miVar5][missile[i]._miVar6]; - assert(dp <= MAXTILES && dp >= 0); - t = Point { missile[i]._miVar5, missile[i]._miVar6 } + (Direction)missile[i]._miVar4; - if (!nMissileTable[dp] && missile[i]._miVar7 == 0 && InDungeonBounds(t)) { - AddMissile({ missile[i]._miVar5, missile[i]._miVar6 }, { missile[i]._miVar5, missile[i]._miVar6 }, plr[id]._pdir, MIS_FIREWALL, TARGET_BOTH, id, 0, missile[i]._mispllvl); - missile[i]._miVar5 = t.x; - missile[i]._miVar6 = t.y; - } else { - missile[i]._miVar7 = 1; + { + Point position = { missile[i]._miVar5, missile[i]._miVar6 }; + Point target = position + static_cast(missile[i]._miVar4); + + if (missile[i]._miVar7 == 0 && GrowWall(id, position, target, MIS_FIREWALL, missile[i]._mispllvl, 0)) { + missile[i]._miVar5 = target.x; + missile[i]._miVar6 = target.y; + } else { + missile[i]._miVar7 = 1; + } } }