From a3224512ccbc50a2bfaf6b3375db78dc5a807dca Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 6 Apr 2008 07:22:26 +0000 Subject: (svn r12587) -Codechange: unduplicate some code in the Unpack*Order functions and move the 'normal' case Pack/Unpack to Order. --- src/order_cmd.cpp | 82 ++++++++++++++++++++----------------------------------- 1 file changed, 30 insertions(+), 52 deletions(-) (limited to 'src/order_cmd.cpp') diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 70482d453..3dc27670a 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -119,72 +119,51 @@ static bool HasOrderPoolFree(uint amount) return false; } -uint32 PackOrder(const Order *order) +uint32 Order::Pack() const { - return order->dest << 16 | order->flags << 8 | order->type; + return this->dest << 16 | this->flags << 8 | this->type; } -Order UnpackOrder(uint32 packed) +Order::Order(uint32 packed) { - Order order; - order.type = (OrderType)GB(packed, 0, 8); - order.flags = GB(packed, 8, 8); - order.dest = GB(packed, 16, 16); - order.next = NULL; - order.index = 0; // avoid compiler warning - order.refit_cargo = CT_NO_REFIT; - order.refit_subtype = 0; - order.wait_time = 0; - order.travel_time = 0; - return order; + this->type = (OrderType)GB(packed, 0, 8); + this->flags = GB(packed, 8, 8); + this->dest = GB(packed, 16, 16); + this->next = NULL; + this->index = 0; // avoid compiler warning + this->refit_cargo = CT_NO_REFIT; + this->refit_subtype = 0; + this->wait_time = 0; + this->travel_time = 0; } /** * - * Unpacks a order from savegames made with TTD(Patch) + * Unpacks a order from savegames with version 4 and lower * */ -Order UnpackOldOrder(uint16 packed) +static Order UnpackVersion4Order(uint16 packed) { - Order order; - order.type = (OrderType)GB(packed, 0, 4); - order.flags = GB(packed, 4, 4); - order.dest = GB(packed, 8, 8); - order.next = NULL; - - order.refit_cargo = CT_NO_REFIT; - order.refit_subtype = 0; - order.wait_time = 0; - order.travel_time = 0; - order.index = 0; // avoid compiler warning - - // Sanity check - // TTD stores invalid orders as OT_NOTHING with non-zero flags/station - if (!order.IsValid() && (order.flags != 0 || order.dest != 0)) { - order.type = OT_DUMMY; - order.flags = 0; - } - - return order; + return Order(GB(packed, 8, 8) << 16 | GB(packed, 4, 4) << 8 | GB(packed, 0, 4)); } /** * - * Unpacks a order from savegames with version 4 and lower + * Unpacks a order from savegames made with TTD(Patch) * */ -Order UnpackVersion4Order(uint16 packed) +Order UnpackOldOrder(uint16 packed) { - Order order; - order.type = (OrderType)GB(packed, 0, 4); - order.flags = GB(packed, 4, 4); - order.dest = GB(packed, 8, 8); - order.next = NULL; - order.index = 0; // avoid compiler warning - order.refit_cargo = CT_NO_REFIT; - order.refit_subtype = 0; - order.wait_time = 0; - order.travel_time = 0; + Order order = UnpackVersion4Order(packed); + + /* + * Sanity check + * TTD stores invalid orders as OT_NOTHING with non-zero flags/station + */ + if (!order.IsValid() && (order.flags != 0 || order.dest != 0)) { + order.MakeDummy(); + } + return order; } @@ -276,7 +255,7 @@ CommandCost CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) Vehicle *v; VehicleID veh = GB(p1, 0, 16); VehicleOrderID sel_ord = GB(p1, 16, 16); - Order new_order = UnpackOrder(p2); + Order new_order(p2); if (!IsValidVehicleID(veh)) return CMD_ERROR; @@ -1099,7 +1078,7 @@ void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *bak) * in network the commands are queued before send, the second insert always * fails in test mode. By bypassing the test-mode, that no longer is a problem. */ for (uint i = 0; bak->order[i].IsValid(); i++) { - if (!DoCommandP(0, v->index + (i << 16), PackOrder(&bak->order[i]), NULL, + if (!DoCommandP(0, v->index + (i << 16), bak->order[i].Pack(), NULL, CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK)) { break; } @@ -1589,8 +1568,7 @@ static void Load_ORDR() SlArray(orders, len, SLE_UINT32); for (i = 0; i < len; ++i) { - Order *order = new (i) Order(); - order->AssignOrder(UnpackOrder(orders[i])); + new (i) Order(orders[i]); } free(orders); -- cgit v1.2.3-54-g00ecf