changeset 13959:1956f0f15f37 draft

(svn r18495) -Codechange: make sure we don't taint the vehicle cache with finding refit options and unmagify a constant
author rubidium <rubidium@openttd.org>
date Sun, 13 Dec 2009 22:19:19 +0000
parents 158476c4d72c
children c57dcc0026df
files src/vehicle_gui.cpp
diffstat 1 files changed, 12 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -156,6 +156,9 @@
 	DrawSprite(SPR_BLOT, pal, x, y);
 }
 
+/** Maximum number of refit cycles we try, to prevent infinite loops. */
+static const int MAX_REFIT_CYCLE = 16;
+
 struct RefitOption {
 	CargoID cargo;
 	byte subtype;
@@ -200,11 +203,15 @@
 
 				u->cargo_type = cid;
 
-				for (refit_cyc = 0; refit_cyc < 16 && num_lines < max_lines; refit_cyc++) {
+				for (refit_cyc = 0; refit_cyc < MAX_REFIT_CYCLE && num_lines < max_lines; refit_cyc++) {
 					bool duplicate = false;
 					uint16 callback;
 
 					u->cargo_subtype = refit_cyc;
+
+					/* Make sure we don't pick up anything cached. */
+					u->First()->InvalidateNewGRFCache();
+					u->InvalidateNewGRFCache();
 					callback = GetVehicleCallback(CBID_VEHICLE_CARGO_SUFFIX, 0, 0, u->engine_type, u);
 
 					if (callback == 0xFF) callback = CALLBACK_FAILED;
@@ -227,6 +234,10 @@
 				/* Reset the vehicle's cargo type */
 				u->cargo_type    = temp_cargo;
 				u->cargo_subtype = temp_subtype;
+
+				/* And make sure we haven't tainted the cache */
+				u->First()->InvalidateNewGRFCache();
+				u->InvalidateNewGRFCache();
 			} else {
 				/* No cargo suffix callback -- use no subtype */
 				bool duplicate = false;