(svn r11127) -Fix: truncate the result of 8 bits callbacks.
authorrubidium
Tue, 18 Sep 2007 20:41:59 +0000
changeset 8096 9e87db1c5925
parent 8095 1ecfd01f30af
child 8097 68eefbb4ff46
(svn r11127) -Fix: truncate the result of 8 bits callbacks.
src/newgrf_callbacks.h
src/newgrf_spritegroup.cpp
--- a/src/newgrf_callbacks.h	Tue Sep 18 18:55:25 2007 +0000
+++ b/src/newgrf_callbacks.h	Tue Sep 18 20:41:59 2007 +0000
@@ -13,6 +13,9 @@
  * bit is set in the callback flags/trigger for a vehicle, house,
  * industry, etc.
  * Names are formatted as CBID_<CLASS>_<CALLBACK>
+ *
+ * @note Do not forget to add 15 bits callbacks to the switch in
+ *       newgrf_spritegroup.cpp (search for "15 bits callback").
  */
 enum CallbackID {
 	/** Set when using the callback resolve system, but not to resolve a callback. */
--- a/src/newgrf_spritegroup.cpp	Tue Sep 18 18:55:25 2007 +0000
+++ b/src/newgrf_spritegroup.cpp	Tue Sep 18 20:41:59 2007 +0000
@@ -192,7 +192,25 @@
 	if (group->g.determ.num_ranges == 0) {
 		/* nvar == 0 is a special case -- we turn our value into a callback result */
 		nvarzero.type = SGT_CALLBACK;
-		nvarzero.g.callback.result = GB(value, 0, 15);
+		switch (object->callback) {
+			/* All these functions are 15 bit callbacks */
+			case CBID_VEHICLE_REFIT_CAPACITY:
+			case CBID_BUILDING_COLOUR:
+			case CBID_HOUSE_CARGO_ACCEPTANCE:
+			case CBID_INDUSTRY_LOCATION:
+			case CBID_INDTILE_CARGO_ACCEPTANCE:
+			case CBID_VEHICLE_COLOUR_MAPPING:
+			case CBID_HOUSE_PRODUCE_CARGO:
+			case CBID_VEHICLE_SOUND_EFFECT:
+			case CBID_SOUNDS_AMBIENT_EFFECT:
+				nvarzero.g.callback.result = GB(value, 0, 15);
+				break;
+
+			/* The rest is a 8 bit callback, which should be truncated properly */
+			default:
+				nvarzero.g.callback.result = GB(value, 0, 8);
+				break;
+		}
 		return &nvarzero;
 	}