summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbjarni <bjarni@openttd.org>2006-08-30 23:01:45 +0000
committerbjarni <bjarni@openttd.org>2006-08-30 23:01:45 +0000
commite2f8ef4f725b991e6f082e7f746024951ad48a14 (patch)
tree6a3d86da825371df4091d7d15c07bafed940be72
parent65c03f32ee5adb8a3b51aaebd46d6aa84ad9f15c (diff)
downloadopenttd-e2f8ef4f725b991e6f082e7f746024951ad48a14.tar.xz
(svn r6249) -Fix: fixed assert when pressing goto depot in an empty list (forgot to disable the button in this condition)
-Code cleanup r6246: simplified SendAllVehiclesToDepot() and moved an { in PlayerVehWndProc()
-rw-r--r--vehicle.c35
-rw-r--r--vehicle_gui.c52
2 files changed, 39 insertions, 48 deletions
diff --git a/vehicle.c b/vehicle.c
index 0913c701c..38fae976e 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) {
+ const Vehicle *v;
+
/* 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;
- }
+ 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 CMD_ERROR;
}
- return 0;
+
+ return (flags & DC_EXEC) ? 0 : CMD_ERROR;
}
diff --git a/vehicle_gui.c b/vehicle_gui.c
index dd9b39154..b79ae41d6 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);