From 93a4dbda4b10d8b26c575e4b16d4505ea881dae5 Mon Sep 17 00:00:00 2001 From: tron Date: Thu, 9 Dec 2004 18:18:21 +0000 Subject: [PATCH] (svn r990) Fix a display bug in the order list: TTD stores invalid orders different than OTTD, this resulted in empty lines in the order list. With the overhaul of the order system this got worse: no line was shown at all. Fix this by sanity checking while loading and convert the orders accordingly. --- oldloader.c | 3 ++- vehicle.c | 20 +++++++++++++++++++- vehicle.h | 3 +++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/oldloader.c b/oldloader.c index 32e8e0abed..522d3ec709 100644 --- a/oldloader.c +++ b/oldloader.c @@ -1400,7 +1400,8 @@ bool LoadOldSaveGame(const char *file) } } - memcpy(_order_array, m->order_list, sizeof(m->order_list)); + for (i = 0; i < lengthof(m->order_list); ++i) + _order_array[i] = UnpackOldOrder(m->order_list[i]); _ptr_to_next_order = _order_array + REMAP_ORDER_IDX(m->ptr_to_next_order); FixTown(_towns, m->town_list, lengthof(m->town_list), m->town_name_type); diff --git a/vehicle.c b/vehicle.c index 003eca6c46..ceb1644076 100644 --- a/vehicle.c +++ b/vehicle.c @@ -16,6 +16,24 @@ #define GEN_HASH(x,y) (((x & 0x1F80)>>7) + ((y & 0xFC0))) +Order UnpackOldOrder(uint16 packed) +{ + Order order; + order.type = (packed & 0x000f); + order.flags = (packed & 0x00f0) >> 4, + order.station = (packed & 0xff00) >> 8; + + // Sanity check + // TTD stores invalid orders as OT_NOTHING with non-zero flags/station + if (order.type == OT_NOTHING && (order.flags != 0 || order.station != 0)) { + order.type = OT_DUMMY; + order.flags = 0; + } + + return order; +} + + void VehicleInTheWayErrMsg(Vehicle *v) { StringID id; @@ -1896,7 +1914,7 @@ static void Load_ORDR() SlArray(orders, len, SLE_UINT16); for (i = 0; i < len; ++i) - _order_array[i] = UnpackOrder(orders[i]); + _order_array[i] = UnpackOldOrder(orders[i]); } const ChunkHandler _veh_chunk_handlers[] = { diff --git a/vehicle.h b/vehicle.h index 178a776353..b1d474d6bd 100644 --- a/vehicle.h +++ b/vehicle.h @@ -28,6 +28,9 @@ static inline Order UnpackOrder(uint16 packed) return order; } +Order UnpackOldOrder(uint16 packed); + + typedef struct VehicleRail { uint16 last_speed; // NOSAVE: only used in UI uint16 crash_anim_pos;