Browse Source

Speed up DeadItem

Previously, the same tiles were rechecked over and over again.

O(k^3) -> O(k^2)

This changes the visitation order but we agreed in #7215 that
we don't care.
pull/7322/head
Gleb Mazovetskiy 2 years ago
parent
commit
bf98d9f533
  1. 28
      Source/player.cpp

28
Source/player.cpp

@ -302,29 +302,23 @@ void RespawnDeadItem(Item &&itm, Point target)
NetSendCmdPItem(false, CMD_SPAWNITEM, target, Items[ii]); NetSendCmdPItem(false, CMD_SPAWNITEM, target, Items[ii]);
} }
void DeadItem(Player &player, Item &&itm, Displacement direction) void DeadItem(Player &player, Item &&item, Displacement direction)
{ {
if (itm.isEmpty()) if (item.isEmpty())
return; return;
const Point playerTile = player.position.tile; const Point playerTile = player.position.tile;
const Point target = playerTile + direction; if (direction != Displacement { 0, 0 }) {
const Point target = playerTile + direction;
if (direction != Displacement { 0, 0 } && ItemSpaceOk(target)) { if (ItemSpaceOk(target)) {
RespawnDeadItem(std::move(itm), target); RespawnDeadItem(std::move(item), target);
return; return;
}
} }
for (int k = 1; k < 50; k++) { std::optional<Point> dropPoint = FindClosestValidPosition(ItemSpaceOk, playerTile, 1, 50);
for (int j = -k; j <= k; j++) { if (dropPoint) {
for (int i = -k; i <= k; i++) { RespawnDeadItem(std::move(item), *dropPoint);
Point next = playerTile + Displacement { i, j };
if (ItemSpaceOk(next)) {
RespawnDeadItem(std::move(itm), next);
return;
}
}
}
} }
} }

Loading…
Cancel
Save