Browse Source

Separate search and spawn logic for town portal

pull/3431/head
ephphatha 4 years ago committed by Anders Jenbo
parent
commit
9201a27b99
  1. 60
      Source/missiles.cpp

60
Source/missiles.cpp

@ -2071,32 +2071,40 @@ void AddWeapexp(Missile &missile, Point dst, Direction /*midir*/)
void AddTown(Missile &missile, Point dst, Direction /*midir*/)
{
Point target = dst;
if (currlevel != 0) {
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) {
target = dst + Displacement { CrawlTable[ck - 1], CrawlTable[ck] };
if (!InDungeonBounds(target))
continue;
if (currlevel == 0) {
missile.position.tile = dst;
missile.position.start = dst;
} else {
std::optional<Point> targetPosition = FindClosestValidPosition(
[](Point target) {
if (!InDungeonBounds(target)) {
return false;
}
if (dObject[target.x][target.y] != 0) {
return false;
}
if (dPlayer[target.x][target.y] != 0) {
return false;
}
if (TileContainsMissile(target)) {
return false;
}
int dp = dPiece[target.x][target.y];
if (nSolidTable[dp] || nMissileTable[dp]) {
return false;
}
return !CheckIfTrig(target);
},
dst, 0, 5);
int dp = dPiece[target.x][target.y];
if (!TileContainsMissile(target) && !nSolidTable[dp] && !nMissileTable[dp] && dObject[target.x][target.y] == 0 && dPlayer[target.x][target.y] == 0) {
if (!CheckIfTrig(target)) {
missile.position.tile = target;
missile.position.start = target;
missile._miDelFlag = false;
i = 6;
break;
}
}
}
if (targetPosition) {
missile.position.tile = *targetPosition;
missile.position.start = *targetPosition;
missile._miDelFlag = false;
} else {
missile._miDelFlag = true;
}
} else {
missile.position.tile = target;
missile.position.start = target;
}
missile._mirange = 100;
@ -2110,9 +2118,9 @@ void AddTown(Missile &missile, Point dst, Direction /*midir*/)
PutMissile(missile);
if (missile._misource == MyPlayerId && !missile._miDelFlag && currlevel != 0) {
if (!setlevel) {
NetSendCmdLocParam3(true, CMD_ACTIVATEPORTAL, target, currlevel, leveltype, 0);
NetSendCmdLocParam3(true, CMD_ACTIVATEPORTAL, missile.position.tile, currlevel, leveltype, 0);
} else {
NetSendCmdLocParam3(true, CMD_ACTIVATEPORTAL, target, setlvlnum, leveltype, 1);
NetSendCmdLocParam3(true, CMD_ACTIVATEPORTAL, missile.position.tile, setlvlnum, leveltype, 1);
}
}
}

Loading…
Cancel
Save