diff --git a/aircraft_cmd.c b/aircraft_cmd.c index 74912fd5ba..b51edefd93 100644 --- a/aircraft_cmd.c +++ b/aircraft_cmd.c @@ -1212,14 +1212,39 @@ static void ProcessAircraftOrder(Vehicle *v) order = GetVehicleOrder(v, v->cur_order_index); - if (order == NULL) { - v->current_order.type = OT_NOTHING; - v->current_order.flags = 0; + if (order == NULL|| (order->type == OT_DUMMY && !CheckForValidOrders(v))) { + /* + * We do not have an order. This can be divided into two cases: + * 1) we are heading to an invalid station. In this case we must + * find another airport to go to. If there is nowhere to go, + * we will destroy the aircraft as it otherwise will enter + * the holding pattern for the first airport, which can cause + * the plane to go into an undefined state when building an + * airport with the same StationID. + * 2) we are (still) heading to a (still) valid airport, then we + * can continue going there. This can happen when you are + * changing the aircraft's orders while in-flight or in for + * example a depot. However, when we have a current order to + * go to a depot, we have to keep that order so the aircraft + * actually stops. + */ + const Station *st = GetStation(v->u.air.targetairport); + if (!IsValidStation(st) || st->airport_tile == 0) { + int32 ret; + PlayerID old_player = _current_player; + + _current_player = v->owner; + ret = DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_SEND_AIRCRAFT_TO_HANGAR); + _current_player = old_player; + + if (CmdFailed(ret)) CrashAirplane(v); + } else if (v->current_order.type != OT_GOTO_DEPOT) { + v->current_order.type = OT_NOTHING; + v->current_order.flags = 0; + } return; } - if (order->type == OT_DUMMY && !CheckForValidOrders(v)) CrashAirplane(v); - if (order->type == v->current_order.type && order->flags == v->current_order.flags && order->dest == v->current_order.dest) diff --git a/newgrf_gui.c b/newgrf_gui.c index 1c7ec6334f..59550f17ee 100644 --- a/newgrf_gui.c +++ b/newgrf_gui.c @@ -465,6 +465,9 @@ static void NewGRFWndProc(Window *w, WindowEvent *e) break; case WE_DESTROY: + if (!WP(w, newgrf_d).execute) { + CopyGRFConfigList(WP(w, newgrf_d).orig_list, *WP(w, newgrf_d).list); + } /* Remove the temporary copy of grf-list used in window */ ClearGRFConfigList(WP(w, newgrf_d).list); break; diff --git a/video/cocoa_v.m b/video/cocoa_v.m index 65bb021dfb..6e5cd54c29 100644 --- a/video/cocoa_v.m +++ b/video/cocoa_v.m @@ -503,12 +503,12 @@ static bool QZ_PollEvent(void) break; case NSLeftMouseDown: + pt = QZ_GetMouseLocation(event); if (!([ event modifierFlags ] & NSCommandKeyMask) || !QZ_MouseIsInsideView(&pt)) { [NSApp sendEvent:event]; } - pt = QZ_GetMouseLocation(event); if (!QZ_MouseIsInsideView(&pt)) { QZ_ShowMouse(); break; diff --git a/win32.c b/win32.c index f655ec0c9d..a0160da033 100644 --- a/win32.c +++ b/win32.c @@ -662,8 +662,11 @@ DIR *opendir(const wchar_t *path) d = dir_calloc(); if (d != NULL) { wchar_t search_path[MAX_PATH]; - /* build search path for FindFirstFile */ - _snwprintf(search_path, lengthof(search_path), L"%s\\*", path); + bool slash = path[wcslen(path) - 1] == L'\\'; + + /* build search path for FindFirstFile, try not to append additional slashes + * as it throws Win9x off its groove for root directories */ + _snwprintf(search_path, lengthof(search_path), L"%s%s*", path, slash ? L"" : L"\\"); *lastof(search_path) = '\0'; d->hFind = FindFirstFileW(search_path, &d->fd);