diff options
author | planetmaker <planetmaker@openttd.org> | 2011-09-11 09:31:57 +0000 |
---|---|---|
committer | planetmaker <planetmaker@openttd.org> | 2011-09-11 09:31:57 +0000 |
commit | 3b70f697e1c08cda55a4729636120170b9c79bcc (patch) | |
tree | d753003f3f95c82abcf77849211d360f86573ffc | |
parent | bc52aa11a6d273f603e8aa195221904757192a14 (diff) | |
download | openttd-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.cpp | 20 | ||||
-rw-r--r-- | src/newgrf.h | 23 | ||||
-rw-r--r-- | src/newgrf_canal.h | 15 |
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. |