(svn r635) Fix choosing a spritegroup from deterministic variational spritegroups if there is no structure to search (i.e. in purchase lists) (pasky)
authortron
Mon, 15 Nov 2004 20:52:11 +0000
changeset 433 a2cbd6cf3f37
parent 432 e229fe4dece6
child 434 0b2cd3b0a284
(svn r635) Fix choosing a spritegroup from deterministic variational spritegroups if there is no structure to search (i.e. in purchase lists) (pasky)
engine.c
station_cmd.c
--- a/engine.c	Mon Nov 15 20:45:25 2004 +0000
+++ b/engine.c	Mon Nov 15 20:52:11 2004 +0000
@@ -255,22 +255,36 @@
 			struct SpriteGroup *target;
 			int value = -1;
 
-			//debug("[%p] Having fun resolving variable %x", dsg->variable);
+			//debug("[%p] Having fun resolving variable %x", veh, dsg->variable);
 
 			if ((dsg->variable >> 6) == 0) {
 				/* General property */
 				value = GetDeterministicSpriteValue(dsg->variable);
 
 			} else {
-				/* Station-specific property. */
+				/* Vehicle-specific property. */
+
+				if (veh == NULL) {
+					/* We are in a purchase list of something,
+					 * and we are checking for something undefined.
+					 * That means we should get the first target
+					 * (NOT the default one). */
+					if (dsg->num_ranges > 0) {
+						target = &dsg->ranges[0].group;
+					} else {
+						target = dsg->default_group;
+					}
+					return ResolveVehicleSpriteGroup(target, NULL);
+				}
+
 				if (dsg->var_scope == VSG_SCOPE_PARENT) {
 					/* First engine in the vehicle chain */
-					if (veh != NULL && veh->type == VEH_Train)
+					if (veh->type == VEH_Train)
 						veh = GetFirstVehicleInChain(veh);
 				}
 
 				if (dsg->variable == 0x40) {
-					if (veh && veh->type == VEH_Train) {
+					if (veh->type == VEH_Train) {
 						Vehicle *u = GetFirstVehicleInChain(veh);
 						byte chain_before = 0, chain_after = 0;
 
@@ -293,7 +307,7 @@
 					// TTDPatch runs on little-endian arch;
 					// Variable is 0x80 + offset in TTD's vehicle structure
 					switch (dsg->variable - 0x80) {
-#define veh_prop(id_, value_) case id_: if (veh != NULL) value = value_; break /* XXX factorise "if" */
+#define veh_prop(id_, value_) case id_: value = value_; break
 						veh_prop(0x00, veh->type);
 						veh_prop(0x01, veh->subtype);
 						veh_prop(0x04, veh->index);
--- a/station_cmd.c	Mon Nov 15 20:45:25 2004 +0000
+++ b/station_cmd.c	Mon Nov 15 20:52:11 2004 +0000
@@ -1023,6 +1023,19 @@
 				value = GetDeterministicSpriteValue(dsg->variable);
 
 			} else {
+				if (stat == NULL) {
+					/* We are in a build dialog of something,
+					 * and we are checking for something undefined.
+					 * That means we should get the first target
+					 * (NOT the default one). */
+					if (dsg->num_ranges > 0) {
+						target = &dsg->ranges[0].group;
+					} else {
+						target = dsg->default_group;
+					}
+					return ResolveStationSpriteGroup(target, NULL);
+				}
+
 				/* Station-specific property. */
 				if (dsg->var_scope == VSG_SCOPE_PARENT) {
 					/* TODO: Town structure. */
@@ -1039,25 +1052,25 @@
 						// Variable is 0x70 + offset in the TTD's station structure
 						switch (dsg->variable - 0x70) {
 							case 0x80:
-								if (stat) value = stat->facilities;
+								value = stat->facilities;
 								break;
 							case 0x81:
-								if (stat) value = stat->airport_type;
+								value = stat->airport_type;
 								break;
 							case 0x82:
-								if (stat) value = stat->truck_stop_status;
+								value = stat->truck_stop_status;
 								break;
 							case 0x83:
-								if (stat) value = stat->bus_stop_status;
+								value = stat->bus_stop_status;
 								break;
 							case 0x86:
-								if (stat) value = stat->airport_flags & 0xFFFF;
+								value = stat->airport_flags & 0xFFFF;
 								break;
 							case 0x87:
-								if (stat) value = stat->airport_flags & 0xFF;
+								value = stat->airport_flags & 0xFF;
 								break;
 							case 0x8A:
-								if (stat) value = stat->build_date;
+								value = stat->build_date;
 								break;
 						}
 					}