mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
This commit is contained in:
parent
fd361b104d
commit
6f290da200
|
@ -162,12 +162,14 @@ static EngineID AiChooseTrainToBuild(RailType railtype, int32 money, byte flag,
|
||||||
static EngineID AiChooseRoadVehToBuild(CargoID cargo, int32 money, TileIndex tile)
|
static EngineID AiChooseRoadVehToBuild(CargoID cargo, int32 money, TileIndex tile)
|
||||||
{
|
{
|
||||||
EngineID best_veh_index = INVALID_ENGINE;
|
EngineID best_veh_index = INVALID_ENGINE;
|
||||||
int32 best_veh_cost = 0;
|
int32 best_veh_rating = 0;
|
||||||
EngineID i = ROAD_ENGINES_INDEX;
|
EngineID i = ROAD_ENGINES_INDEX;
|
||||||
EngineID end = i + NUM_ROAD_ENGINES;
|
EngineID end = i + NUM_ROAD_ENGINES;
|
||||||
|
|
||||||
for (; i != end; i++) {
|
for (; i != end; i++) {
|
||||||
|
const RoadVehicleInfo *rvi = RoadVehInfo(i);
|
||||||
const Engine* e = GetEngine(i);
|
const Engine* e = GetEngine(i);
|
||||||
|
int32 rating;
|
||||||
int32 ret;
|
int32 ret;
|
||||||
|
|
||||||
if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
|
if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
|
||||||
|
@ -175,13 +177,17 @@ static EngineID AiChooseRoadVehToBuild(CargoID cargo, int32 money, TileIndex til
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip vehicles which can't take our cargo type */
|
/* Skip vehicles which can't take our cargo type */
|
||||||
if (RoadVehInfo(i)->cargo_type != cargo) continue;
|
if (rvi->cargo_type != cargo) continue;
|
||||||
|
|
||||||
|
/* Rate and compare the engine by speed & capacity */
|
||||||
|
rating = rvi->max_speed * rvi->capacity;
|
||||||
|
if (rating <= best_veh_rating) continue;
|
||||||
|
|
||||||
ret = DoCommand(tile, i, 0, 0, CMD_BUILD_ROAD_VEH);
|
ret = DoCommand(tile, i, 0, 0, CMD_BUILD_ROAD_VEH);
|
||||||
if (!CmdFailed(ret) && ret <= money && ret >= best_veh_cost) {
|
if (CmdFailed(ret) || ret > money) continue;
|
||||||
best_veh_cost = ret;
|
|
||||||
best_veh_index = i;
|
best_veh_rating = rating;
|
||||||
}
|
best_veh_index = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
return best_veh_index;
|
return best_veh_index;
|
||||||
|
|
|
@ -232,27 +232,39 @@ EngineID AiNew_PickVehicle(Player *p)
|
||||||
// Not supported yet
|
// Not supported yet
|
||||||
return INVALID_ENGINE;
|
return INVALID_ENGINE;
|
||||||
} else {
|
} else {
|
||||||
|
EngineID best_veh_index = INVALID_ENGINE;
|
||||||
|
int32 best_veh_rating = 0;
|
||||||
EngineID start = ROAD_ENGINES_INDEX;
|
EngineID start = ROAD_ENGINES_INDEX;
|
||||||
EngineID end = ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES;
|
EngineID end = ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES;
|
||||||
EngineID i;
|
EngineID i;
|
||||||
|
|
||||||
// Let's check it backwards.. we simply want to best engine available..
|
// Let's check it backwards.. we simply want to best engine available..
|
||||||
for (i = end - 1; i >= start; i--) {
|
for (i = start; i != end; i--) {
|
||||||
|
const RoadVehicleInfo *rvi = RoadVehInfo(i);
|
||||||
const Engine* e = GetEngine(i);
|
const Engine* e = GetEngine(i);
|
||||||
|
int32 rating;
|
||||||
int32 ret;
|
int32 ret;
|
||||||
|
|
||||||
/* Skip vehicles which can't take our cargo type */
|
/* Skip vehicles which can't take our cargo type */
|
||||||
if (RoadVehInfo(i)->cargo_type != p->ainew.cargo) continue;
|
if (rvi->cargo_type != p->ainew.cargo) continue;
|
||||||
|
|
||||||
// Is it availiable?
|
// Is it availiable?
|
||||||
// Also, check if the reliability of the vehicle is above the AI_VEHICLE_MIN_RELIABILTY
|
// Also, check if the reliability of the vehicle is above the AI_VEHICLE_MIN_RELIABILTY
|
||||||
if (!HASBIT(e->player_avail, _current_player) || e->reliability * 100 < AI_VEHICLE_MIN_RELIABILTY << 16) continue;
|
if (!HASBIT(e->player_avail, _current_player) || e->reliability * 100 < AI_VEHICLE_MIN_RELIABILTY << 16) continue;
|
||||||
|
|
||||||
|
/* Rate and compare the engine by speed & capacity */
|
||||||
|
rating = rvi->max_speed * rvi->capacity;
|
||||||
|
if (rating <= best_veh_rating) continue;
|
||||||
|
|
||||||
// Can we build it?
|
// Can we build it?
|
||||||
ret = AI_DoCommand(0, i, 0, DC_QUERY_COST, CMD_BUILD_ROAD_VEH);
|
ret = AI_DoCommand(0, i, 0, DC_QUERY_COST, CMD_BUILD_ROAD_VEH);
|
||||||
if (!CmdFailed(ret)) return i;
|
if (CmdFailed(ret)) continue;
|
||||||
|
|
||||||
|
best_veh_rating = rating;
|
||||||
|
best_veh_index = i;
|
||||||
}
|
}
|
||||||
// We did not find a vehicle :(
|
|
||||||
return INVALID_ENGINE;
|
return best_veh_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue