diff --git a/vehicle.c b/vehicle.c index 0913c701c2..38fae976e3 100644 --- a/vehicle.c +++ b/vehicle.c @@ -1908,31 +1908,22 @@ static void MaybeReplaceVehicle(Vehicle *v) int32 SendAllVehiclesToDepot(byte type, uint32 flags, bool service, PlayerID owner) { const uint subtype = (type != VEH_Aircraft) ? Train_Front : 2; - if (flags & DC_EXEC) { - /* Send all the vehicles to a depot */ - const Vehicle *v; - FOR_ALL_VEHICLES(v) { - if (v->type == type && v->owner == owner && ( - (type == VEH_Train && IsFrontEngine(v)) || - (type != VEH_Train && v->subtype <= subtype))) { - DoCommand(v->tile, v->index, service, flags, CMD_SEND_TO_DEPOT(type)); - } - } - } else { - /* See if we can find a vehicle to send to a depot */ - const Vehicle *v; - FOR_ALL_VEHICLES(v) { - if (v->type == type && v->owner == owner && ( - (type == VEH_Train && IsFrontEngine(v)) || - (type != VEH_Train && v->subtype <= subtype))) { - /* We found one vehicle to send to a depot. No need to search for more. The command is valid */ - if (!DoCommand(v->tile, v->index, service, flags, CMD_SEND_TO_DEPOT(type))) return 0; - } - } + const Vehicle *v; - return CMD_ERROR; + /* Send all the vehicles to a depot */ + FOR_ALL_VEHICLES(v) { + if (v->type == type && v->owner == owner && ( + (type == VEH_Train && IsFrontEngine(v)) || + (type != VEH_Train && v->subtype <= subtype))) { + /* Return 0 if DC_EXEC is not set and a DoCommand() returns 0 (valid goto depot command) */ + /* In this case we know that at least one vehicle can be send to a depot and we will issue the command */ + /* Since we will issue the command nomatter how many vehicles more than one it's valid for, we skip checking the rest */ + /* When DC_EXEC is set, we need to run this loop for all vehicles nomatter return values from each vehicle */ + if (!DoCommand(v->tile, v->index, service, flags, CMD_SEND_TO_DEPOT(type)) && !(flags & DC_EXEC)) return 0; + } } - return 0; + + return (flags & DC_EXEC) ? 0 : CMD_ERROR; } diff --git a/vehicle_gui.c b/vehicle_gui.c index dd9b391542..b79ae41d60 100644 --- a/vehicle_gui.c +++ b/vehicle_gui.c @@ -1268,6 +1268,7 @@ void PlayerVehWndProc(Window *w, WindowEvent *e) SetDParam(0, p->name_1); SetDParam(1, p->name_2); SetDParam(2, w->vscroll.count); + if (vl->list_length == 0) SETBIT(w->disabled_state, 9); if (vehicle_type == VEH_Aircraft) { w->widget[9].unkA = STR_SEND_TO_HANGARS; w->widget[9].tooltips = STR_SEND_TO_HANGARS_TIP; @@ -1404,35 +1405,34 @@ void PlayerVehWndProc(Window *w, WindowEvent *e) } } break; - case 9: /* Left button */ + case 9: { /* Left button */ + uint16 window_type = w->window_number & VLW_FLAGS; if (GB(w->window_number, 0, 8) /* OwnerID */ != _local_player) break; - { - uint16 window_type = w->window_number & VLW_FLAGS; - switch (window_type) { - case VLW_STANDARD: - case VLW_SHARED_ORDERS: { - /* Send to depot */ - const Vehicle *v; - assert(vl->list_length != 0); - v = vl->sort_list[0]; - DoCommandP(v->tile, v->index, window_type | _ctrl_pressed ? 3 : 2, NULL, CMD_SEND_TO_DEPOT(vehicle_type)); - break; - } - - case VLW_STATION_LIST: - /* Build new Vehicle */ - switch (vehicle_type) { - case VEH_Train: ShowBuildTrainWindow(0); break; - case VEH_Road: ShowBuildRoadVehWindow(0); break; - case VEH_Ship: ShowBuildShipWindow(0); break; - case VEH_Aircraft: ShowBuildAircraftWindow(0); break; - default: NOT_REACHED(); break; - } - break; - default: NOT_REACHED(); break; + switch (window_type) { + case VLW_STANDARD: + case VLW_SHARED_ORDERS: { + /* Send to depot */ + const Vehicle *v; + assert(vl->list_length != 0); + v = vl->sort_list[0]; + DoCommandP(v->tile, v->index, window_type | _ctrl_pressed ? 3 : 2, NULL, CMD_SEND_TO_DEPOT(vehicle_type)); + break; } - break; + + case VLW_STATION_LIST: + /* Build new Vehicle */ + switch (vehicle_type) { + case VEH_Train: ShowBuildTrainWindow(0); break; + case VEH_Road: ShowBuildRoadVehWindow(0); break; + case VEH_Ship: ShowBuildShipWindow(0); break; + case VEH_Aircraft: ShowBuildAircraftWindow(0); break; + default: NOT_REACHED(); break; + } + break; + default: NOT_REACHED(); break; } + break; + } case 10: /* Right button */ ShowReplaceVehicleWindow(vehicle_type);