diff options
author | rubidium <rubidium@openttd.org> | 2009-12-13 22:19:19 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-12-13 22:19:19 +0000 |
commit | f9970ac6460a8d84b6286a2c440dc2d2310d1f56 (patch) | |
tree | 835194fd0d6f795841139750e46e967c04ad9713 | |
parent | c2ec2e2db3f632ed6e52f83403e9d689a80b9b14 (diff) | |
download | openttd-f9970ac6460a8d84b6286a2c440dc2d2310d1f56.tar.xz |
(svn r18495) -Codechange: make sure we don't taint the vehicle cache with finding refit options and unmagify a constant
-rw-r--r-- | src/vehicle_gui.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 012475d21..614259e34 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -156,6 +156,9 @@ static void DrawVehicleProfitButton(const Vehicle *v, int x, int y) 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 @@ static RefitList *BuildRefitList(const Vehicle *v) 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 @@ static RefitList *BuildRefitList(const Vehicle *v) /* 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; |