changeset 18097:e4e1c72dc4c5 draft

(svn r22918) -Fix: [NewGRF] Properties for feature 0x05 were not zeroed for each NewGRF, thus waterfeatures could glitch when the properties were set by a previous NewGRF and the NewGRF assumed the properties to be unmodified
author planetmaker <planetmaker@openttd.org>
date Sun, 11 Sep 2011 09:31:57 +0000
parents 059e50cd234e
children 2b072edcd664
files src/newgrf.cpp src/newgrf.h src/newgrf_canal.h
diffstat 3 files changed, 40 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -1650,15 +1650,15 @@
 	}
 
 	for (int i = 0; i < numinfo; i++) {
-		WaterFeature *wf = &_water_feature[id + i];
+		CanalProperties *cp = &_cur.grffile->canal_local_properties[id + i];
 
 		switch (prop) {
 			case 0x08:
-				wf->callback_mask = buf->ReadByte();
+				cp->callback_mask = buf->ReadByte();
 				break;
 
 			case 0x09:
-				wf->flags = buf->ReadByte();
+				cp->flags = buf->ReadByte();
 				break;
 
 			default:
@@ -7656,6 +7656,17 @@
 	}
 }
 
+/** Set to use the correct action0 properties for each canal feature */
+static void FinaliseCanals()
+{
+	for (uint i = 0; i < CF_END; i++) {
+		if (_water_feature[i].grffile != NULL) {
+			_water_feature[i].callback_mask = _water_feature[i].grffile->canal_local_properties[i].callback_mask;
+			_water_feature[i].flags = _water_feature[i].grffile->canal_local_properties[i].flags;
+		}
+	}
+}
+
 /** Check for invalid engines */
 static void FinaliseEngineArray()
 {
@@ -8348,6 +8359,9 @@
 	/* Polish engines */
 	FinaliseEngineArray();
 
+	/* Set the actually used Canal properties */
+	FinaliseCanals();
+
 	/* Set the block size in the depot windows based on vehicle sprite sizes */
 	InitDepotWindowBlockSizes();
 
--- a/src/newgrf.h
+++ b/src/newgrf.h
@@ -16,6 +16,27 @@
 #include "rail_type.h"
 #include "fileio_type.h"
 
+/**
+ * List of different canal 'features'.
+ * Each feature gets an entry in the canal spritegroup table
+ */
+enum CanalFeature {
+	CF_WATERSLOPE,
+	CF_LOCKS,
+	CF_DIKES,
+	CF_ICON,
+	CF_DOCKS,
+	CF_RIVER_SLOPE,
+	CF_RIVER_EDGE,
+	CF_END,
+};
+
+/** Canal properties local to the NewGRF */
+struct CanalProperties {
+	uint8 callback_mask;  ///< Bitmask of canal callbacks that have to be called.
+	uint8 flags;          ///< Flags controlling display.
+};
+
 enum GrfLoadingStage {
 	GLS_FILESCAN,
 	GLS_SAFETYSCAN,
@@ -104,6 +125,8 @@
 	RailTypeLabel *railtype_list;
 	RailType railtype_map[RAILTYPE_END];
 
+	CanalProperties canal_local_properties[CF_END]; ///< Canal properties as set by this NewGRF
+
 	struct LanguageMap *language_map; ///< Mappings related to the languages.
 
 	int traininfo_vehicle_pitch;  ///< Vertical offset for draing train images in depot GUI and vehicle details
--- a/src/newgrf_canal.h
+++ b/src/newgrf_canal.h
@@ -16,21 +16,6 @@
 #include "tile_type.h"
 #include "newgrf_generic.h"
 
-/**
- * List of different canal 'features'.
- * Each feature gets an entry in the canal spritegroup table
- */
-enum CanalFeature {
-	CF_WATERSLOPE,
-	CF_LOCKS,
-	CF_DIKES,
-	CF_ICON,
-	CF_DOCKS,
-	CF_RIVER_SLOPE,
-	CF_RIVER_EDGE,
-	CF_END,
-};
-
 /** Flags controlling the display of canals. */
 enum CanalFeatureFlag {
 	CFF_HAS_FLAT_SPRITE = 0, ///< Additional flat ground sprite in the beginning.