From d38ec2893e4e2a50beee4141537d72a37085e09b Mon Sep 17 00:00:00 2001 From: Joris <joris.dauphin@gmail.com> Date: Thu, 14 Jun 2012 12:44:40 +0200 Subject: [PATCH] Some clean up. --- src/ai/ai_building.cpp | 99 ++++++++++++++++++------------------------ src/ai/ai_local.h | 2 +- 2 files changed, 44 insertions(+), 57 deletions(-) diff --git a/src/ai/ai_building.cpp b/src/ai/ai_building.cpp index 0711e2cad..b975e93e1 100644 --- a/src/ai/ai_building.cpp +++ b/src/ai/ai_building.cpp @@ -67,29 +67,22 @@ ** ** @note Can be faster written. */ -static int AiCheckSurrounding(const CUnit &worker, - const CUnitType &type, int x, int y, bool &backupok) +static bool AiCheckSurrounding(const CUnit &worker, const CUnitType &type, int x, int y, bool &backupok) { static int dirs[4][3] = {{1, 0, 0}, {0, 1, Map.Info.MapWidth}, { -1, 0, 0}, {0, -1, -Map.Info.MapWidth} }; int surrounding[1024]; // Max circonference for building - int surroundingnb; - int lastval; - int dir; - int obstacle; - int y_offset; - - int x0 = x - 1; - int y0 = y - 1; - int x1 = x0 + type.TileWidth + 1; - int y1 = y0 + type.TileWidth + 1; + int surroundingnb = 0; + const int x0 = x - 1; + const int y0 = y - 1; + const int x1 = x0 + type.TileWidth + 1; + const int y1 = y0 + type.TileWidth + 1; x = x0; y = y0; - y_offset = y * Map.Info.MapWidth; - dir = -1; - surroundingnb = 0; + int y_offset = y * Map.Info.MapWidth; + int dir = -1; while (dir < 4) { if (Map.Info.IsPointOnMap(x, y)) { if (x == worker.tilePos.x && y == worker.tilePos.y) { @@ -109,14 +102,13 @@ static int AiCheckSurrounding(const CUnit &worker, if ((x == x0 || x == x1) && (y == y0 || y == y1)) { dir++; } - x += dirs[dir][0]; y += dirs[dir][1]; y_offset += dirs[dir][2]; } - lastval = surrounding[surroundingnb - 1]; - obstacle = 0; + int lastval = surrounding[surroundingnb - 1]; + int obstacle = 0; for (int i = 0 ; i < surroundingnb; ++i) { if (lastval && !surrounding[i]) { ++obstacle; @@ -188,12 +180,12 @@ VisitResult BuildingPlaceFinder::Visit(TerrainTraversal &terrainTraversal, const ** @param worker Worker to build building. ** @param type Type of building. ** @param startPos Original position to try building -** @param dpos OUT: Pointer for position returned. -** @param checkSurround +** @param checkSurround Check if the perimeter of the building is free +** @param resultPos OUT: Pointer for position returned. ** -** @return True if place found, false if no found. +** @return True if place found, false if no found. */ -static int AiFindBuildingPlace2(const CUnit &worker, const CUnitType &type, const Vec2i &startPos, const CUnit *startUnit, Vec2i *dpos, bool checkSurround) +static bool AiFindBuildingPlace2(const CUnit &worker, const CUnitType &type, const Vec2i &startPos, const CUnit *startUnit, bool checkSurround, Vec2i *resultPos) { TerrainTraversal terrainTraversal; @@ -211,16 +203,15 @@ static int AiFindBuildingPlace2(const CUnit &worker, const CUnitType &type, cons terrainTraversal.PushPos(it); } } - } else if (Map.Info.IsPointOnMap(startPos)) { - terrainTraversal.PushPos(startPos); } else { - terrainTraversal.PushPos(worker.tilePos); + Assert(Map.Info.IsPointOnMap(startPos)); + terrainTraversal.PushPos(startPos); } - BuildingPlaceFinder buildingPlaceFinder(worker, type, checkSurround, dpos); + BuildingPlaceFinder buildingPlaceFinder(worker, type, checkSurround, resultPos); terrainTraversal.Run(buildingPlaceFinder); - return Map.Info.IsPointOnMap(*dpos); + return Map.Info.IsPointOnMap(*resultPos); } class HallPlaceFinder @@ -288,7 +279,7 @@ VisitResult HallPlaceFinder::Visit(TerrainTraversal &terrainTraversal, const Vec #endif CUnit *mine = ResourceOnMap(pos, resource); if (mine && IsAUsableMine(*mine)) { - if (AiFindBuildingPlace2(worker, type, pos, mine, resultPos, true)) { + if (AiFindBuildingPlace2(worker, type, pos, mine, true, resultPos)) { return VisitResult_Finished; } } @@ -303,7 +294,7 @@ VisitResult HallPlaceFinder::Visit(TerrainTraversal &terrainTraversal, const Vec ** Find building place for hall. (flood fill version) ** ** The best place: -** 1) near to goldmine. +** 1) near to resource. ** !2) near to wood. ** !3) near to worker and must be reachable. ** 4) no enemy near it. @@ -313,6 +304,7 @@ VisitResult HallPlaceFinder::Visit(TerrainTraversal &terrainTraversal, const Vec ** @param worker Worker to build building. ** @param type Type of building. ** @param startPos Start search position (if == -1 then unit X pos used). +** @param resource resource to be near. ** @param resultPos OUT: Pointer for position returned. ** ** @return True if place found, false if not found. @@ -323,19 +315,16 @@ VisitResult HallPlaceFinder::Visit(TerrainTraversal &terrainTraversal, const Vec static int AiFindHallPlace(const CUnit &worker, const CUnitType &type, const Vec2i &startPos, - Vec2i *resultPos, - int resource = GoldCost) + int resource, + Vec2i *resultPos) { TerrainTraversal terrainTraversal; terrainTraversal.SetSize(Map.Info.MapWidth, Map.Info.MapHeight); terrainTraversal.Init(-1); - if (Map.Info.IsPointOnMap(startPos)) { - terrainTraversal.PushPos(startPos); - } else { - terrainTraversal.PushPos(worker.tilePos); - } + Assert(Map.Info.IsPointOnMap(startPos)); + terrainTraversal.PushPos(startPos); HallPlaceFinder hallPlaceFinder(worker, type, resource, resultPos); @@ -366,7 +355,7 @@ VisitResult LumberMillPlaceFinder::Visit(TerrainTraversal &terrainTraversal, con } #endif if (Map.ForestOnMap(pos)) { - if (AiFindBuildingPlace2(worker, type, pos, NULL, resultPos, true)) { + if (AiFindBuildingPlace2(worker, type, pos, NULL, true, resultPos)) { return VisitResult_Finished; } } @@ -396,11 +385,8 @@ static bool AiFindLumberMillPlace(const CUnit &worker, const CUnitType &type, co terrainTraversal.SetSize(Map.Info.MapWidth, Map.Info.MapHeight); terrainTraversal.Init(-1); - if (Map.Info.IsPointOnMap(startPos)) { - terrainTraversal.PushPos(startPos); - } else { - terrainTraversal.PushPos(worker.tilePos); - } + Assert(Map.Info.IsPointOnMap(startPos)); + terrainTraversal.PushPos(startPos); LumberMillPlaceFinder lumberMillPlaceFinder(worker, type, resultPos); @@ -414,53 +400,54 @@ static int AiFindMiningPlace(const CUnit &worker, Vec2i *resultPos) { // look near (mine = ResourceOnMap(pos, resource, false) ? - return AiFindBuildingPlace2(worker, type, startPos, NULL, resultPos, false); + return AiFindBuildingPlace2(worker, type, startPos, NULL, false, resultPos); } /** ** Find free building place. ** -** @param worker Worker to build building. -** @param type Type of building. -** @param nearPos Start search near nearPos position (or worker->X if nearPos is invalid). -** @param dpos Pointer for position returned. +** @param worker Worker to build building. +** @param type Type of building. +** @param nearPos Start search near nearPos position (or worker->X if nearPos is invalid). +** @param resultPos Pointer for position returned. ** ** @return True if place found, false if no found. ** ** @todo Better and faster way to find building place of oil ** platforms Special routines for special buildings. */ -int AiFindBuildingPlace(const CUnit &worker, const CUnitType &type, const Vec2i &nearPos, Vec2i *dpos) +bool AiFindBuildingPlace(const CUnit &worker, const CUnitType &type, const Vec2i &nearPos, Vec2i *resultPos) { // Find a good place for a new hall DebugPrint("%d: Want to build a %s(%s)\n" _C_ AiPlayer->Player->Index _C_ type.Ident.c_str() _C_ type.Name.c_str()); + const Vec2i &startPos = Map.Info.IsPointOnMap(nearPos) ? nearPos : worker.tilePos; + //Mines and Depots for (int i = 1; i < MaxCosts; ++i) { ResourceInfo *resinfo = worker.Type->ResInfo[i]; //Depots if (type.CanStore[i]) { if (resinfo && resinfo->TerrainHarvester) { - return AiFindLumberMillPlace(worker, type, nearPos, dpos); + return AiFindLumberMillPlace(worker, type, startPos, resultPos); } else { - return AiFindHallPlace(worker, type, nearPos, dpos, i); + return AiFindHallPlace(worker, type, startPos, i, resultPos); } - } else + } else { //mines if (type.GivesResource == i) { if (resinfo && resinfo->RefineryHarvester) { //Mine have to be build ONTOP resources - return AiFindMiningPlace(worker, type, nearPos, i, dpos); + return AiFindMiningPlace(worker, type, startPos, i, resultPos); } else { //Mine can be build without resource restrictions: solar panels, etc - const Vec2i &startPos = Map.Info.IsPointOnMap(nearPos) ? nearPos : worker.tilePos; - return AiFindBuildingPlace2(worker, type, startPos, NULL, dpos, true); + return AiFindBuildingPlace2(worker, type, startPos, NULL, true, resultPos); } } + } } - const Vec2i &startPos = Map.Info.IsPointOnMap(nearPos) ? nearPos : worker.tilePos; - return AiFindBuildingPlace2(worker, type, startPos, NULL, dpos, true); + return AiFindBuildingPlace2(worker, type, startPos, NULL, true, resultPos); } //@} diff --git a/src/ai/ai_local.h b/src/ai/ai_local.h index ce45604ea..fbc0c9338 100644 --- a/src/ai/ai_local.h +++ b/src/ai/ai_local.h @@ -406,7 +406,7 @@ extern void AiNewDepotRequest(CUnit &worker); // Buildings // /// Find nice building place -extern int AiFindBuildingPlace(const CUnit &worker, const CUnitType &type, const Vec2i &nearPos, Vec2i *dpos); +extern bool AiFindBuildingPlace(const CUnit &worker, const CUnitType &type, const Vec2i &nearPos, Vec2i *resultPos); // // Forces