Browse Source

Use FindClosestValidPosition for casting firewall

pull/3431/head
ephphatha 4 years ago committed by Anders Jenbo
parent
commit
958602d600
  1. 43
      Source/missiles.cpp

43
Source/missiles.cpp

@ -2503,35 +2503,26 @@ void AddIdentify(Missile &missile, Point /*dst*/, Direction /*midir*/)
void AddFirewallC(Missile &missile, Point dst, Direction midir)
{
missile._miDelFlag = true;
for (int i = 0; i < 6; i++) {
int k = CrawlNum[i];
int ck = k + 2;
for (auto j = static_cast<uint8_t>(CrawlTable[k]); j > 0; j--, ck += 2) {
Point target = dst + Displacement { CrawlTable[ck - 1], CrawlTable[ck] };
if (!InDungeonBounds(target))
continue;
std::optional<Point> spreadPosition = FindClosestValidPosition(
[start = missile.position.start](Point target) {
return start != target && IsTileNotSolid(target) && InDungeonBounds(target) && dObject[target.x][target.y] == 0 && LineClearMissile(start, target);
},
dst, 0, 5);
if (LineClearMissile(missile.position.start, target)) {
if (missile.position.start != target && IsTileNotSolid(target) && dObject[target.x][target.y] == 0) {
missile.var1 = target.x;
missile.var2 = target.y;
missile.var5 = target.x;
missile.var6 = target.y;
missile._miDelFlag = false;
i = 6;
break;
}
}
}
if (!spreadPosition) {
missile._miDelFlag = true;
return;
}
if (!missile._miDelFlag) {
missile.var3 = static_cast<int>(Left(Left(midir)));
missile.var4 = static_cast<int>(Right(Right(midir)));
missile._mirange = 7;
UseMana(missile._misource, SPL_FIREWALL);
}
missile._miDelFlag = false;
missile.var1 = spreadPosition->x;
missile.var2 = spreadPosition->y;
missile.var5 = spreadPosition->x;
missile.var6 = spreadPosition->y;
missile.var3 = static_cast<int>(Left(Left(midir)));
missile.var4 = static_cast<int>(Right(Right(midir)));
missile._mirange = 7;
UseMana(missile._misource, SPL_FIREWALL);
}
void AddInfra(Missile &missile, Point /*dst*/, Direction /*midir*/)

Loading…
Cancel
Save