1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

fix: monthly monsters aren't linked with other map objects at creation, leaving Nullkiller unable to see the next danger after killing a monthly monster;

2 minor log trace renaming to make them easier to spot in logs when debugging
This commit is contained in:
Mircea TheHonestCTO
2025-08-11 21:02:27 +02:00
parent a6df82c616
commit 77a8b0f8e6
5 changed files with 38 additions and 7 deletions

View File

@@ -791,7 +791,7 @@ bool CGameInfoCallback::isTeleportEntrancePassable(const CGTeleport * obj, Playe
return obj && obj->isEntrance() && !isTeleportChannelImpassable(obj->channel, player);
}
void CGameInfoCallback::getFreeTiles(std::vector<int3> & tiles) const
void CGameInfoCallback::getFreeTiles(std::vector<int3> & tiles, bool skipIfNearbyBlocked) const
{
std::vector<int> floors;
floors.reserve(gameState().getMap().levels());
@@ -808,7 +808,38 @@ void CGameInfoCallback::getFreeTiles(std::vector<int3> & tiles) const
{
tinfo = getTile(int3 (xd,yd,zd));
if (tinfo->isLand() && tinfo->getTerrain()->isPassable() && !tinfo->blocked()) //land and free
tiles.emplace_back(xd, yd, zd);
{
bool nearbyMonsterOrBlocked = false;
if (skipIfNearbyBlocked)
{
FowTilesType nearbyTiles;
getTilesInRange( nearbyTiles, int3 (xd,yd,zd), 1, ETileVisibility::REVEALED);
for (auto & nearbyTile : nearbyTiles)
{
auto nearbyTileInfo = getTile(nearbyTile);
if (nearbyTileInfo->isLand() && nearbyTileInfo->getTerrain()->isPassable() && !nearbyTileInfo->blocked())
continue;
else
{
std::ostringstream tPos;
tPos << "(" << xd << "," << yd << "," << zd << ")";
std::ostringstream nearbyTPos;
nearbyTPos << "(" << nearbyTile.x << "," << nearbyTile.y << "," << nearbyTile.z << ")";
logGlobal->trace("Skipping free tile %d because nearby tile %s is blocked", tPos.str(), nearbyTPos.str());
nearbyMonsterOrBlocked = true;
break;
}
}
}
// Ensure that CGameHandler::spawnWanderingMonsters won't set a random monster next to another monster
// because Nullkiller AI is not able to go to one monster without falling into the attack range of the nearby one
// See GraphPaths::addChainInfo if(node.linkDanger > 0) (no link between random monsters and map monsters)
if (!nearbyMonsterOrBlocked)
tiles.emplace_back(xd, yd, zd);
}
}
}
}

View File

@@ -102,7 +102,7 @@ public:
bool isTeleportEntrancePassable(const CGTeleport * obj, PlayerColor player) const override;
//used for random spawns
void getFreeTiles(std::vector<int3> &tiles) const;
void getFreeTiles(std::vector<int3> &tiles, bool skipIfNearbyBlocked) const;
void getTilesInRange(FowTilesType & tiles, const int3 & pos, int radius, ETileVisibility mode, std::optional<PlayerColor> player = std::optional<PlayerColor>(), int3::EDistanceFormula formula = int3::DIST_2D) const override;
void getAllTiles(FowTilesType &tiles, std::optional<PlayerColor> player, int level, const std::function<bool(const TerrainTile *)> & filter) const override;