summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorplanetmaker <planetmaker@openttd.org>2011-09-11 09:31:57 +0000
committerplanetmaker <planetmaker@openttd.org>2011-09-11 09:31:57 +0000
commit3b70f697e1c08cda55a4729636120170b9c79bcc (patch)
treed753003f3f95c82abcf77849211d360f86573ffc
parentbc52aa11a6d273f603e8aa195221904757192a14 (diff)
downloadopenttd-3b70f697e1c08cda55a4729636120170b9c79bcc.tar.xz
(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
-rw-r--r--src/newgrf.cpp20
-rw-r--r--src/newgrf.h23
-rw-r--r--src/newgrf_canal.h15
3 files changed, 40 insertions, 18 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index b19030033..056e1f7b6 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -1650,15 +1650,15 @@ static ChangeInfoResult CanalChangeInfo(uint id, int numinfo, int prop, ByteRead
}
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 @@ static void CalculateRefitMasks()
}
}
+/** 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 @@ static void AfterLoadGRFs()
/* Polish engines */
FinaliseEngineArray();
+ /* Set the actually used Canal properties */
+ FinaliseCanals();
+
/* Set the block size in the depot windows based on vehicle sprite sizes */
InitDepotWindowBlockSizes();
diff --git a/src/newgrf.h b/src/newgrf.h
index faf489b74..92f8994a5 100644
--- 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 @@ struct GRFFile {
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
diff --git a/src/newgrf_canal.h b/src/newgrf_canal.h
index 1a0dc2cf0..e3a971caf 100644
--- 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.