From 4f0bfa91ab9af4d0ff53f8cebf6890f25563a563 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 13 Apr 2008 19:46:26 +0000 Subject: [PATCH] (svn r12696) -Fix: loading ancient savegames could result in invalid orders in order lists with all related problems. --- src/openttd.cpp | 65 +++++++++++++++++++++++++---------------------- src/order_cmd.cpp | 4 +-- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/openttd.cpp b/src/openttd.cpp index 13edd24231..3d138d7f7e 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -2301,6 +2301,40 @@ bool AfterLoadGame() } } + + if (CheckSavegameVersion(93)) { + /* Rework of orders. */ + Order *order; + FOR_ALL_ORDERS(order) order->ConvertFromOldSavegame(); + + Vehicle *v; + FOR_ALL_VEHICLES(v) { + if (v->orders != NULL && !v->orders->IsValid()) v->orders = NULL; + + v->current_order.ConvertFromOldSavegame(); + if (v->type == VEH_ROAD && v->IsPrimaryVehicle() && v->prev_shared == NULL) { + FOR_VEHICLE_ORDERS(v, order) order->SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); + } + } + } else if (CheckSavegameVersion(94)) { + /* Unload and transfer are now mutual exclusive. */ + Order *order; + FOR_ALL_ORDERS(order) { + if ((order->GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) { + order->SetUnloadType(OUFB_TRANSFER); + order->SetLoadType(OLFB_NO_LOAD); + } + } + + Vehicle *v; + FOR_ALL_VEHICLES(v) { + if ((v->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) { + v->current_order.SetUnloadType(OUFB_TRANSFER); + v->current_order.SetLoadType(OLFB_NO_LOAD); + } + } + } + if (CheckSavegameVersion(84)) { /* Update go to buoy orders because they are just waypoints */ Order *order; @@ -2445,37 +2479,6 @@ bool AfterLoadGame() } } - if (CheckSavegameVersion(93)) { - /* Rework of orders. */ - Order *order; - FOR_ALL_ORDERS(order) order->ConvertFromOldSavegame(); - - Vehicle *v; - FOR_ALL_VEHICLES(v) { - v->current_order.ConvertFromOldSavegame(); - if (v->type == VEH_ROAD && v->IsPrimaryVehicle() && v->prev_shared == NULL) { - FOR_VEHICLE_ORDERS(v, order) order->SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); - } - } - } else if (CheckSavegameVersion(94)) { - /* Unload and transfer are now mutual exclusive. */ - Order *order; - FOR_ALL_ORDERS(order) { - if ((order->GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) { - order->SetUnloadType(OUFB_TRANSFER); - order->SetLoadType(OLFB_NO_LOAD); - } - } - - Vehicle *v; - FOR_ALL_VEHICLES(v) { - if ((v->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) { - v->current_order.SetUnloadType(OUFB_TRANSFER); - v->current_order.SetLoadType(OLFB_NO_LOAD); - } - } - } - return InitializeWindowsAndCaches(); } diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 1929760c34..ccb104d2a3 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -216,9 +216,7 @@ Order UnpackOldOrder(uint16 packed) * Sanity check * TTD stores invalid orders as OT_NOTHING with non-zero flags/station */ - if (!order.IsValid() && (order.GetLoadType() != 0 || order.GetUnloadType() != 0 || order.GetDestination() != 0)) { - order.MakeDummy(); - } + if (!order.IsValid() && packed != 0) order.MakeDummy(); return order; }