summaryrefslogtreecommitdiff
path: root/src/disaster_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/disaster_cmd.cpp')
-rw-r--r--src/disaster_cmd.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/disaster_cmd.cpp b/src/disaster_cmd.cpp
index 38c366ed5..a0998a55d 100644
--- a/src/disaster_cmd.cpp
+++ b/src/disaster_cmd.cpp
@@ -307,17 +307,28 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
}
v->current_order.SetDestination(1);
+ uint n = 0; // Total number of targetable road vehicles.
RoadVehicle *u;
FOR_ALL_ROADVEHICLES(u) {
- if (u->IsFrontEngine()) {
- v->dest_tile = u->index;
- v->age = 0;
- return true;
- }
+ if (u->IsFrontEngine()) n++;
}
- delete v;
- return false;
+ if (n == 0) {
+ /* If there are no targetable road vehicles, destroy the UFO. */
+ delete v;
+ return false;
+ }
+
+ n = RandomRange(n); // Choose one of them.
+ FOR_ALL_ROADVEHICLES(u) {
+ /* Find (n+1)-th road vehicle. */
+ if (u->IsFrontEngine() && (n-- == 0)) break;
+ }
+
+ /* Target it. */
+ v->dest_tile = u->index;
+ v->age = 0;
+ return true;
} else {
/* Target a vehicle */
RoadVehicle *u = RoadVehicle::Get(v->dest_tile);