/** ** Find the closest piece of terrain with the given flags. ** ** @param movemask The movement mask to reach that location. ** @param resmask Result tile mask. ** @param range Maximum distance for the search. ** @param player Only search fields explored by player ** @param startPos Map start position for the search. ** ** @param terrainPos OUT: Map position of tile. ** ** @note Movement mask can be 0xFFFFFFFF to have no effect ** Range is not circular, but square. ** Player is ignored if nil(search the entire map) ** ** @return True if wood was found. */ bool FindTerrainType(int movemask, int resmask, int range, const CPlayer &player, const Vec2i &startPos, Vec2i *terrainPos) { TerrainTraversal terrainTraversal; terrainTraversal.SetSize(Map.Info.MapWidth, Map.Info.MapHeight); terrainTraversal.Init(); terrainTraversal.PushPos(startPos); TerrainFinder terrainFinder(player, range, movemask & ~(MapFieldLandUnit | MapFieldAirUnit | MapFieldSeaUnit), resmask, terrainPos); return terrainTraversal.Run(terrainFinder); }
static bool FindNearestReachableTerrainType(int movemask, int resmask, int range, const CPlayer &player, const Vec2i &startPos, Vec2i *terrainPos) { TerrainTraversal terrainTraversal; terrainTraversal.SetSize(Map.Info.MapWidth, Map.Info.MapHeight); terrainTraversal.Init(); Assert(Map.Field(startPos)->CheckMask(resmask)); terrainTraversal.PushPos(startPos); NearReachableTerrainFinder nearReachableTerrainFinder(player, range, movemask, resmask, terrainPos); return terrainTraversal.Run(nearReachableTerrainFinder); }
bool AiForce::NewRallyPoint(const Vec2i &startPos, Vec2i *resultPos) { Assert(this->Units.size() > 0); const CUnit &leader = *(this->Units[0]); const int distance = leader.MapDistanceTo(startPos); WaitOnRallyPoint = AI_WAIT_ON_RALLY_POINT; TerrainTraversal terrainTraversal; terrainTraversal.SetSize(Map.Info.MapWidth, Map.Info.MapHeight); terrainTraversal.Init(); Assert(Map.Info.IsPointOnMap(startPos)); terrainTraversal.PushPos(startPos); AiForceRallyPointFinder aiForceRallyPointFinder(leader, distance, leader.tilePos, resultPos); return terrainTraversal.Run(aiForceRallyPointFinder); }