1
0
Fork 0

Change: Iterate group vehicle lists for DisasterTick_Ufo and DisasterTick_Big_Ufo

As a compromise, the result of this change differs from the original. The iteration order changed from lowest to highest vehicle index to lowest to highest company index plus the order at which each vehicle was added to each list regardless of their indexes.
pull/10548/head
SamuXarick 2023-12-28 17:58:12 +00:00
parent 2ce3d10584
commit fc7fd4655c
1 changed files with 43 additions and 27 deletions

View File

@ -334,9 +334,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
v->state = 1;
uint n = 0; // Total number of targetable road vehicles.
for (const RoadVehicle *u : RoadVehicle::Iterate()) {
if (u->IsFrontEngine()) n++;
}
for (const Company *c : Company::Iterate()) n += (uint)c->group_all[VEH_ROAD].vehicle_list.size();
if (n == 0) {
/* If there are no targetable road vehicles, destroy the UFO. */
@ -345,13 +343,17 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
}
n = RandomRange(n); // Choose one of them.
for (const RoadVehicle *u : RoadVehicle::Iterate()) {
for (const Company *c : Company::Iterate()) {
const VehicleList &vehicle_list = c->group_all[VEH_ROAD].vehicle_list;
for (const Vehicle *vehicle : vehicle_list) {
const RoadVehicle *u = RoadVehicle::From(vehicle);
/* Find (n+1)-th road vehicle. */
if (u->IsFrontEngine() && (n-- == 0)) {
if (n-- == 0) {
/* Target it. */
v->dest_tile = u->index;
v->age = 0;
break;
return true;
}
}
}
@ -544,14 +546,18 @@ static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
v->state = 2;
for (Vehicle *target : Vehicle::Iterate()) {
if (target->IsGroundVehicle()) {
for (const Company *c : Company::Iterate()) {
for (VehicleType type = VEH_TRAIN; type <= VEH_ROAD; type++) {
const VehicleList &vehicle_list = c->group_all[type].vehicle_list;
for (const Vehicle *vehicle : vehicle_list) {
Vehicle *target = Vehicle::Get(vehicle->index);
if (Delta(target->x_pos, v->x_pos) + Delta(target->y_pos, v->y_pos) <= 12 * (int)TILE_SIZE) {
target->breakdown_ctr = 5;
target->breakdown_delay = 0xF0;
}
}
}
}
Town *t = ClosestTownFromTile(v->dest_tile, UINT_MAX);
SetDParam(0, t->index);
@ -581,16 +587,20 @@ static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
v->state = 1;
const auto is_valid_target = [](const Train *t) {
return t->IsFrontEngine() // Only the engines
&& Company::IsHumanID(t->owner) // Don't break AIs
&& IsPlainRailTile(t->tile) // No tunnels
return IsPlainRailTile(t->tile) // No tunnels
&& (t->vehstatus & VS_CRASHED) == 0; // Not crashed
};
uint n = 0; // Total number of targetable trains.
for (const Train *t : Train::Iterate()) {
for (const Company *c : Company::Iterate()) {
if (!Company::IsHumanID(c->index)) continue;
const VehicleList &vehicle_list = c->group_all[VEH_TRAIN].vehicle_list;
for (const Vehicle *vehicle : vehicle_list) {
const Train *t = Train::From(Vehicle::Get(vehicle->index));
if (is_valid_target(t)) n++;
}
}
if (n == 0) {
/* If there are no targetable trains, destroy the UFO. */
@ -599,13 +609,19 @@ static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
}
n = RandomRange(n); // Choose one of them.
for (const Train *t : Train::Iterate()) {
for (const Company *c : Company::Iterate()) {
if (!Company::IsHumanID(c->index)) continue; // Don't break AIs
const VehicleList &vehicle_list = c->group_all[VEH_TRAIN].vehicle_list;
for (const Vehicle *vehicle : vehicle_list) {
const Train *t = Train::From(Vehicle::Get(vehicle->index));
/* Find (n+1)-th train. */
if (is_valid_target(t) && (n-- == 0)) {
/* Target it. */
v->dest_tile = t->tile;
v->age = 0;
break;
return true;
}
}
}
}