summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ai/trolly/trolly.c70
1 files changed, 41 insertions, 29 deletions
diff --git a/ai/trolly/trolly.c b/ai/trolly/trolly.c
index 8cfd12fd5..9bd581a8e 100644
--- a/ai/trolly/trolly.c
+++ b/ai/trolly/trolly.c
@@ -430,18 +430,24 @@ static void AiNew_State_LocateRoute(Player *p)
// is.
if (p->ainew.from_type == AI_CITY && p->ainew.tbt == AI_BUS) {
- int max_cargo = GetTown(p->ainew.from_ic)->max_pass + GetTown(p->ainew.temp)->max_pass;
- max_cargo -= GetTown(p->ainew.from_ic)->act_pass + GetTown(p->ainew.temp)->act_pass;
+ const Town* town_from = GetTown(p->ainew.from_ic);
+ const Town* town_temp = GetTown(p->ainew.temp);
+ uint distance = DistanceManhattan(town_from->xy, town_temp->xy);
+ int max_cargo;
+
+ max_cargo = town_from->max_pass + town_temp->max_pass;
+ max_cargo -= town_from->act_pass + town_temp->act_pass;
+
// max_cargo is now the amount of cargo we can move between the two cities
// If it is more than the distance, we allow it
- if (DistanceManhattan(GetTown(p->ainew.from_ic)->xy, GetTown(p->ainew.temp)->xy) <= max_cargo * AI_LOCATEROUTE_BUS_CARGO_DISTANCE) {
+ if (distance <= max_cargo * AI_LOCATEROUTE_BUS_CARGO_DISTANCE) {
// We found a good city/industry, save the data of it
p->ainew.to_ic = p->ainew.temp;
p->ainew.state = AI_STATE_FIND_STATION;
DEBUG(ai,1)(
"[AiNew - LocateRoute] Found bus-route of %d tiles long (from %d to %d)",
- DistanceManhattan(GetTown(p->ainew.from_ic)->xy, GetTown(p->ainew.temp)->xy),
+ distance,
p->ainew.from_ic,
p->ainew.temp
);
@@ -452,17 +458,20 @@ static void AiNew_State_LocateRoute(Player *p)
return;
}
} else if (p->ainew.tbt == AI_TRUCK) {
+ const Industry* ind_from = GetIndustry(p->ainew.from_ic);
+ const Industry* ind_temp = GetIndustry(p->ainew.temp);
bool found = false;
int max_cargo = 0;
- int i;
+ uint i;
+
// TODO: in max_cargo, also check other cargo (beside [0])
// First we check if the from_ic produces cargo that this ic accepts
- if (GetIndustry(p->ainew.from_ic)->produced_cargo[0] != CT_INVALID && GetIndustry(p->ainew.from_ic)->total_production[0] != 0) {
- for (i=0;i<3;i++) {
- if (GetIndustry(p->ainew.temp)->accepts_cargo[i] == CT_INVALID) break;
- if (GetIndustry(p->ainew.from_ic)->produced_cargo[0] == GetIndustry(p->ainew.temp)->accepts_cargo[i]) {
+ if (ind_from->produced_cargo[0] != CT_INVALID && ind_from->total_production[0] != 0) {
+ for (i = 0; i < lengthof(ind_temp->accepts_cargo); i++) {
+ if (ind_temp->accepts_cargo[i] == CT_INVALID) break;
+ if (ind_from->produced_cargo[0] == ind_temp->accepts_cargo[i]) {
// Found a compatbiel industry
- max_cargo = GetIndustry(p->ainew.from_ic)->total_production[0] - GetIndustry(p->ainew.from_ic)->total_transported[0];
+ max_cargo = ind_from->total_production[0] - ind_from->total_transported[0];
found = true;
p->ainew.from_deliver = true;
p->ainew.to_deliver = false;
@@ -470,14 +479,14 @@ static void AiNew_State_LocateRoute(Player *p)
}
}
}
- if (!found && GetIndustry(p->ainew.temp)->produced_cargo[0] != CT_INVALID && GetIndustry(p->ainew.temp)->total_production[0] != 0) {
+ if (!found && ind_temp->produced_cargo[0] != CT_INVALID && ind_temp->total_production[0] != 0) {
// If not check if the current ic produces cargo that the from_ic accepts
- for (i=0;i<3;i++) {
- if (GetIndustry(p->ainew.from_ic)->accepts_cargo[i] == CT_INVALID) break;
- if (GetIndustry(p->ainew.temp)->produced_cargo[0] == GetIndustry(p->ainew.from_ic)->accepts_cargo[i]) {
+ for (i = 0; i < lengthof(ind_from->accepts_cargo); i++) {
+ if (ind_from->accepts_cargo[i] == CT_INVALID) break;
+ if (ind_temp->produced_cargo[0] == ind_from->accepts_cargo[i]) {
// Found a compatbiel industry
found = true;
- max_cargo = GetIndustry(p->ainew.temp)->total_production[0] - GetIndustry(p->ainew.temp)->total_transported[0];
+ max_cargo = ind_temp->total_production[0] - ind_temp->total_transported[0];
p->ainew.from_deliver = false;
p->ainew.to_deliver = true;
break;
@@ -487,19 +496,21 @@ static void AiNew_State_LocateRoute(Player *p)
if (found) {
// Yeah, they are compatible!!!
// Check the length against the amount of goods
- if (DistanceManhattan(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy) > AI_LOCATEROUTE_TRUCK_MIN_DISTANCE &&
- DistanceManhattan(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy) <= max_cargo * AI_LOCATEROUTE_TRUCK_CARGO_DISTANCE) {
+ uint distance = DistanceManhattan(ind_from->xy, ind_temp->xy);
+
+ if (distance > AI_LOCATEROUTE_TRUCK_MIN_DISTANCE &&
+ distance <= max_cargo * AI_LOCATEROUTE_TRUCK_CARGO_DISTANCE) {
p->ainew.to_ic = p->ainew.temp;
if (p->ainew.from_deliver) {
- p->ainew.cargo = GetIndustry(p->ainew.from_ic)->produced_cargo[0];
+ p->ainew.cargo = ind_from->produced_cargo[0];
} else {
- p->ainew.cargo = GetIndustry(p->ainew.temp)->produced_cargo[0];
+ p->ainew.cargo = ind_temp->produced_cargo[0];
}
p->ainew.state = AI_STATE_FIND_STATION;
DEBUG(ai,1)(
"[AiNew - LocateRoute] Found truck-route of %d tiles long (from %d to %d)",
- DistanceManhattan(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy),
+ distance,
p->ainew.from_ic,
p->ainew.temp
);
@@ -564,7 +575,6 @@ static void AiNew_State_FindStation(Player *p)
TileIndex new_tile = 0;
byte direction = 0;
Town *town = NULL;
- Industry *industry = NULL;
assert(p->ainew.state == AI_STATE_FIND_STATION);
if (p->ainew.from_tile == 0) {
@@ -573,8 +583,7 @@ static void AiNew_State_FindStation(Player *p)
town = GetTown(p->ainew.from_ic);
tile = town->xy;
} else {
- industry = GetIndustry(p->ainew.from_ic);
- tile = industry->xy;
+ tile = GetIndustry(p->ainew.from_ic)->xy;
}
} else if (p->ainew.to_tile == 0) {
// Second we scan for a station in the to-city
@@ -582,8 +591,7 @@ static void AiNew_State_FindStation(Player *p)
town = GetTown(p->ainew.to_ic);
tile = town->xy;
} else {
- industry = GetIndustry(p->ainew.to_ic);
- tile = industry->xy;
+ tile = GetIndustry(p->ainew.to_ic)->xy;
}
} else {
// Unsupported request
@@ -721,9 +729,11 @@ static void AiNew_State_FindPath(Player *p)
if (p->ainew.temp == -1) {
// Init path_info
if (p->ainew.from_tile == AI_STATION_RANGE) {
+ const Industry* i = GetIndustry(p->ainew.from_ic);
+
// For truck routes we take a range around the industry
- p->ainew.path_info.start_tile_tl = GetIndustry(p->ainew.from_ic)->xy - TileDiffXY(1, 1);
- p->ainew.path_info.start_tile_br = GetIndustry(p->ainew.from_ic)->xy + TileDiffXY(GetIndustry(p->ainew.from_ic)->width, GetIndustry(p->ainew.from_ic)->height) + TileDiffXY(1, 1);
+ p->ainew.path_info.start_tile_tl = i->xy - TileDiffXY(1, 1);
+ p->ainew.path_info.start_tile_br = i->xy + TileDiffXY(i->width + 1, i->height + 1);
p->ainew.path_info.start_direction = p->ainew.from_direction;
} else {
p->ainew.path_info.start_tile_tl = p->ainew.from_tile;
@@ -732,8 +742,10 @@ static void AiNew_State_FindPath(Player *p)
}
if (p->ainew.to_tile == AI_STATION_RANGE) {
- p->ainew.path_info.end_tile_tl = GetIndustry(p->ainew.to_ic)->xy - TileDiffXY(1, 1);
- p->ainew.path_info.end_tile_br = GetIndustry(p->ainew.to_ic)->xy + TileDiffXY(GetIndustry(p->ainew.to_ic)->width, GetIndustry(p->ainew.to_ic)->height) + TileDiffXY(1, 1);
+ const Industry* i = GetIndustry(p->ainew.to_ic);
+
+ p->ainew.path_info.end_tile_tl = i->xy - TileDiffXY(1, 1);
+ p->ainew.path_info.end_tile_br = i->xy + TileDiffXY(i->width + 1, i->height + 1);
p->ainew.path_info.end_direction = p->ainew.to_direction;
} else {
p->ainew.path_info.end_tile_tl = p->ainew.to_tile;