1
0
Fork 0

(svn r2949) The AI no longer needs to 'cheat' to build aircraft; eg it builds them now from a hangar. Also, to query the price of a new aircraft tile information is not needed

release/0.4.5
Darkvater 2005-09-13 13:30:18 +00:00
parent 2e87864d0b
commit 236abb6a6c
2 changed files with 21 additions and 24 deletions

View File

@ -1,4 +1,4 @@
/* $Id: ai_old.c 2701 2005-07-24 14:12:37Z tron $ */ /* $Id$ */
#include "../../stdafx.h" #include "../../stdafx.h"
#include "../../openttd.h" #include "../../openttd.h"
@ -191,7 +191,7 @@ static int AiChooseAircraftToBuild(int32 money, byte flag)
if (i>=253) continue; 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) { if (!CmdFailed(ret) && ret <= money && ret >= best_veh_cost) {
best_veh_cost = ret; best_veh_cost = ret;
best_veh_index = i; best_veh_index = i;
@ -3502,10 +3502,11 @@ static void AiStateBuildAircraftVehicles(Player *p)
tile = TILE_ADD(p->ai.src.use_tile, ToTileIndexDiff(ptr->tileoffs)); tile = TILE_ADD(p->ai.src.use_tile, ToTileIndexDiff(ptr->tileoffs));
veh = AiChooseAircraftToBuild(p->player_money, p->ai.build_kind!=0 ? 1 : 0); veh = AiChooseAircraftToBuild(p->player_money, p->ai.build_kind!=0 ? 1 : 0);
if (veh == -1) { if (veh == -1) return;
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; if (CmdFailed(DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_AIRCRAFT))) return;
loco_id = _new_aircraft_id; loco_id = _new_aircraft_id;

View File

@ -165,17 +165,15 @@ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (!IsEngineBuildable(p1, VEH_Aircraft)) return CMD_ERROR; 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); 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 (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); avi = AircraftVehInfo(p1);
// allocate 2 or 3 vehicle structs, depending on type // allocate 2 or 3 vehicle structs, depending on type
if (!AllocateVehicles(vl, (avi->subtype & 1) == 0 ? 3 : 2) || 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; _new_aircraft_id = v->index;
// the old AI doesn't click on a tile to build airplanes, so the below code will v->u.air.pos = MAX_ELEMENTS;
// never work. Therefore just assume the AI's planes always come from Hangar0
v->u.air.pos = _is_old_ai_player ? 0 : MAX_ELEMENTS;
/* When we click on hangar we know the tile (it is in var 'tile')it is on. By that we know /* 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 * 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 * 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 Station* st = GetStation(_m[tile].m2);
const AirportFTAClass* Airport = GetAirport(st->airport_type); const AirportFTAClass* apc = GetAirport(st->airport_type);
uint i; uint i;
for (i = 0; i < Airport->nof_depots; i++) { for (i = 0; i < apc->nof_depots; i++) {
if (st->airport_tile + ToTileIndexDiff(Airport->airport_depots[i]) == tile) { if (st->airport_tile + ToTileIndexDiff(apc->airport_depots[i]) == tile) {
assert(Airport->layout[i].heading == HANGAR); assert(apc->layout[i].heading == HANGAR);
v->u.air.pos = Airport->layout[i].position; v->u.air.pos = apc->layout[i].position;
break; break;
} }
} }