diff options
-rw-r--r-- | ai/default/default.c | 11 | ||||
-rw-r--r-- | aircraft_cmd.c | 34 |
2 files changed, 21 insertions, 24 deletions
diff --git a/ai/default/default.c b/ai/default/default.c index b8160d2bd..44fb1572d 100644 --- a/ai/default/default.c +++ b/ai/default/default.c @@ -1,4 +1,4 @@ -/* $Id: ai_old.c 2701 2005-07-24 14:12:37Z tron $ */ +/* $Id$ */ #include "../../stdafx.h" #include "../../openttd.h" @@ -191,7 +191,7 @@ static int AiChooseAircraftToBuild(int32 money, byte flag) if (i>=253) continue; } - ret = DoCommandByTile(0, i, 0, 0, CMD_BUILD_AIRCRAFT); + ret = DoCommandByTile(0, i, 0, DC_QUERY_COST, CMD_BUILD_AIRCRAFT); if (!CmdFailed(ret) && ret <= money && ret >= best_veh_cost) { best_veh_cost = ret; best_veh_index = i; @@ -3502,10 +3502,11 @@ static void AiStateBuildAircraftVehicles(Player *p) tile = TILE_ADD(p->ai.src.use_tile, ToTileIndexDiff(ptr->tileoffs)); veh = AiChooseAircraftToBuild(p->player_money, p->ai.build_kind!=0 ? 1 : 0); - if (veh == -1) { - return; - } + if (veh == -1) return; + /* XXX - Have the AI pick the hangar terminal in an airport. Eg get airport-type + * and offset to the FIRST depot because the AI picks the st->xy tile */ + tile += ToTileIndexDiff(GetAirport(GetStation(_m[tile].m2)->airport_type)->airport_depots[0]); if (CmdFailed(DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_AIRCRAFT))) return; loco_id = _new_aircraft_id; diff --git a/aircraft_cmd.c b/aircraft_cmd.c index 825707dc1..14379d5b2 100644 --- a/aircraft_cmd.c +++ b/aircraft_cmd.c @@ -165,17 +165,15 @@ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2) if (!IsEngineBuildable(p1, VEH_Aircraft)) return CMD_ERROR; - // Workaround: TODO: make AI players try to build planes in a hangar instead of just an airport tile. - if (!IsAircraftHangarTile(tile) && IS_HUMAN_PLAYER(_current_player)) return CMD_ERROR; - - if (!IsTileOwner(tile, _current_player) && IS_HUMAN_PLAYER(_current_player)) return CMD_ERROR; - - SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); - value = EstimateAircraftCost(p1); + // to just query the cost, it is not neccessary to have a valid tile (automation/AI) if (flags & DC_QUERY_COST) return value; + if (!IsAircraftHangarTile(tile) || !IsTileOwner(tile, _current_player)) return CMD_ERROR; + + SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); + avi = AircraftVehInfo(p1); // allocate 2 or 3 vehicle structs, depending on type if (!AllocateVehicles(vl, (avi->subtype & 1) == 0 ? 3 : 2) || @@ -253,23 +251,21 @@ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2) _new_aircraft_id = v->index; - // the old AI doesn't click on a tile to build airplanes, so the below code will - // never work. Therefore just assume the AI's planes always come from Hangar0 - v->u.air.pos = _is_old_ai_player ? 0 : MAX_ELEMENTS; + v->u.air.pos = MAX_ELEMENTS; - /* When we click on hangar we know the tile (it is in var 'tile')it is on. By that we know - its position in the array of depots the airport has.....we can search - ->layout for #th position of depot. Since layout must start with depots, it is simple - */ + /* When we click on hangar we know the tile it is on. By that we know + * its position in the array of depots the airport has.....we can search + * layout for #th position of depot. Since layout must start with a listing + * of all depots, it is simple */ { const Station* st = GetStation(_m[tile].m2); - const AirportFTAClass* Airport = GetAirport(st->airport_type); + const AirportFTAClass* apc = GetAirport(st->airport_type); uint i; - for (i = 0; i < Airport->nof_depots; i++) { - if (st->airport_tile + ToTileIndexDiff(Airport->airport_depots[i]) == tile) { - assert(Airport->layout[i].heading == HANGAR); - v->u.air.pos = Airport->layout[i].position; + for (i = 0; i < apc->nof_depots; i++) { + if (st->airport_tile + ToTileIndexDiff(apc->airport_depots[i]) == tile) { + assert(apc->layout[i].heading == HANGAR); + v->u.air.pos = apc->layout[i].position; break; } } |