diff --git a/src/disaster_cmd.cpp b/src/disaster_cmd.cpp --- a/src/disaster_cmd.cpp +++ b/src/disaster_cmd.cpp @@ -307,17 +307,28 @@ static bool DisasterTick_Ufo(DisasterVeh } 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++; + } + + if (n == 0) { + /* If there are no targetable road vehicles, destroy the UFO. */ + delete v; + return false; } - 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);