Browse Source

Separate search and spawn logic for AddRune

pull/3431/head
ephphatha 4 years ago committed by Anders Jenbo
parent
commit
07843bd007
  1. 38
      Source/missiles.cpp

38
Source/missiles.cpp

@ -693,23 +693,29 @@ void SetMissAnim(Missile &missile, int animtype)
void AddRune(Missile &missile, Point dst, missile_id missileID)
{
if (LineClearMissile(missile.position.start, dst)) {
for (int i = 0; i < 10; 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;
int dp = dPiece[target.x][target.y];
if (nSolidTable[dp] || dObject[target.x][target.y] != 0 || TileContainsMissile(target))
continue;
std::optional<Point> runePosition = FindClosestValidPosition(
[](Point target) {
if (!InDungeonBounds(target)) {
return false;
}
if (dObject[target.x][target.y] != 0) {
return false;
}
if (TileContainsMissile(target)) {
return false;
}
if (nSolidTable[dPiece[target.x][target.y]]) {
return false;
}
return true;
},
dst, 0, 9);
missile.position.tile = target;
missile.var1 = missileID;
missile._mlid = AddLight(target, 8);
return;
}
if (runePosition) {
missile.position.tile = *runePosition;
missile.var1 = missileID;
missile._mlid = AddLight(missile.position.tile, 8);
return;
}
}

Loading…
Cancel
Save