mirror of https://github.com/OpenTTD/OpenTTD
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
parent
2ce3d10584
commit
fc7fd4655c
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue