changeset 12199:8e20cb543b87 draft

(svn r16613) -Fix [NewGRF]: some of the var action 2 80+ variables contained wrong results due to OpenTTD codechanges
author yexo <yexo@openttd.org>
date Sun, 21 Jun 2009 10:11:04 +0000
parents b730a91b2202
children abcb7c9c1d4d
files src/newgrf_engine.cpp src/order_base.h src/order_cmd.cpp
diffstat 3 files changed, 44 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -130,10 +130,18 @@
 
 static int MapOldSubType(const Vehicle *v)
 {
-	if (v->type != VEH_TRAIN) return v->subtype;
-	if (IsTrainEngine(v)) return 0;
-	if (IsFreeWagon(v)) return 4;
-	return 2;
+	switch (v->type) {
+		case VEH_TRAIN:
+			if (IsTrainEngine(v)) return 0;
+			if (IsFreeWagon(v)) return 4;
+			return 2;
+		case VEH_ROAD:
+		case VEH_SHIP:     return 0;
+		case VEH_AIRCRAFT:
+		case VEH_DISASTER: return v->subtype;
+		case VEH_EFFECT:   return v->subtype << 1;
+		default: NOT_REACHED();
+	}
 }
 
 
@@ -687,12 +695,12 @@
 
 	/* General vehicle properties */
 	switch (variable - 0x80) {
-		case 0x00: return v->type;
+		case 0x00: return v->type + 2;
 		case 0x01: return MapOldSubType(v);
 		case 0x04: return v->index;
 		case 0x05: return GB(v->index, 8, 8);
-		case 0x0A: return v->current_order.Pack();
-		case 0x0B: return GB(v->current_order.Pack(), 8, 8);
+		case 0x0A: return v->current_order.MapOldOrder();
+		case 0x0B: return v->current_order.GetDestination();
 		case 0x0C: return v->GetNumOrders();
 		case 0x0D: return v->cur_order_index;
 		case 0x10: return v->load_unload_time_rem;
--- a/src/order_base.h
+++ b/src/order_base.h
@@ -233,6 +233,13 @@
 	uint32 Pack() const;
 
 	/**
+	 * Pack this order into a 16 bits integer as close to the TTD
+	 * representation as possible.
+	 * @return the TTD-like packed representation.
+	 */
+	uint16 MapOldOrder() const;
+
+	/**
 	 * Converts this order from an old savegame's version;
 	 * it moves all bits to the new location.
 	 */
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -129,6 +129,28 @@
 	return this->dest << 16 | this->flags << 8 | this->type;
 }
 
+uint16 Order::MapOldOrder() const
+{
+	uint16 order = this->GetType();
+	switch (this->type) {
+		case OT_GOTO_STATION:
+			if (this->GetUnloadType() & OUFB_UNLOAD) SetBit(order, 5);
+			if (this->GetLoadType() & OLFB_FULL_LOAD) SetBit(order, 6);
+			if (this->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) SetBit(order, 7);
+			order |= GB(this->GetDestination(), 0, 8) << 8;
+			break;
+		case OT_GOTO_DEPOT:
+			if (!(this->GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) SetBit(order, 6);
+			SetBit(order, 7);
+			order |= GB(this->GetDestination(), 0, 8) << 8;
+			break;
+		case OT_LOADING:
+			if (this->GetLoadType() & OLFB_FULL_LOAD) SetBit(order, 6);
+			break;
+	}
+	return order;
+}
+
 Order::Order(uint32 packed)
 {
 	this->type    = (OrderType)GB(packed,  0,  8);