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