From af270a63addf27c7469f424a0c1e3f60638fdf58 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 1 Jun 2022 01:21:58 +0100 Subject: [PATCH] Industry: Apply anim tile masking when loading prior version saves --- src/newgrf_industrytiles.cpp | 27 +++++++++++++++++++++++++++ src/newgrf_industrytiles.h | 1 + src/saveload/afterload.cpp | 4 ++++ src/saveload/extended_ver_sl.cpp | 1 + src/saveload/extended_ver_sl.h | 1 + 5 files changed, 34 insertions(+) diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp index c7b3e7ac5c..fb02689ac1 100644 --- a/src/newgrf_industrytiles.cpp +++ b/src/newgrf_industrytiles.cpp @@ -459,3 +459,30 @@ void AnalyseIndustryTileSpriteGroups() } } } + +void ApplyIndustryTileAnimMasking() +{ + for (Industry *ind : Industry::Iterate()) { + const IndustrySpec *spec = GetIndustrySpec(ind->type); + + if (ind->selected_layout == 0 || ind->selected_layout > spec->layouts.size()) continue; + + uint64 mask = spec->layout_anim_masks[ind->selected_layout - 1]; + + uint idx = 0; + for (IndustryTileLayoutTile it : spec->layouts[ind->selected_layout - 1]) { + if (it.gfx == 0xFF) continue; + + TileIndex tile = AddTileIndexDiffCWrap(ind->location.tile, it.ti); + if (!IsValidTile(tile) || !ind->TileBelongsToIndustry(tile)) break; + + IndustryGfx gfx = GetTranslatedIndustryTileID(it.gfx); + if (gfx != GetIndustryGfx(tile)) break; + + if (HasBit(mask, idx)) DeleteAnimatedTile(tile); + + idx++; + if (idx == 64) break; + } + } +} diff --git a/src/newgrf_industrytiles.h b/src/newgrf_industrytiles.h index f7b5cd499d..ba5752cd13 100644 --- a/src/newgrf_industrytiles.h +++ b/src/newgrf_industrytiles.h @@ -77,5 +77,6 @@ void TriggerIndustryTile(TileIndex t, IndustryTileTrigger trigger); void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger); void AnalyseIndustryTileSpriteGroups(); +void ApplyIndustryTileAnimMasking(); #endif /* NEWGRF_INDUSTRYTILES_H */ diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 40505dbde5..542040cb34 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -4051,6 +4051,10 @@ bool AfterLoadGame() } } + if (SlXvIsFeatureMissing(XSLFI_INDUSTRY_ANIM_MASK)) { + ApplyIndustryTileAnimMasking(); + } + InitializeRoadGUI(); /* This needs to be done after conversion. */ diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index f258fb611e..868785e426 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -172,6 +172,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_MORE_STATION_TYPES, XSCF_NULL, 1, 1, "more_station_types", nullptr, nullptr, nullptr }, { XSLFI_RV_ORDER_EXTRA_FLAGS, XSCF_IGNORABLE_UNKNOWN, 1, 1, "rv_order_extra_flags", nullptr, nullptr, nullptr }, { XSLFI_GRF_ROADSTOPS, XSCF_NULL, 1, 1, "grf_road_stops", nullptr, nullptr, nullptr }, + { XSLFI_INDUSTRY_ANIM_MASK, XSCF_IGNORABLE_ALL, 1, 1, "industry_anim_mask", nullptr, nullptr, nullptr }, { XSLFI_SCRIPT_INT64, XSCF_NULL, 1, 1, "script_int64", nullptr, nullptr, nullptr }, { XSLFI_NULL, XSCF_NULL, 0, 0, nullptr, nullptr, nullptr, nullptr },// This is the end marker }; diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 8aa4a491ab..a134ca2f3a 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -125,6 +125,7 @@ enum SlXvFeatureIndex { XSLFI_MORE_STATION_TYPES, ///< More station types (field widening) XSLFI_RV_ORDER_EXTRA_FLAGS, ///< Road vehicle order extra flags XSLFI_GRF_ROADSTOPS, ///< NewGRF road stops + XSLFI_INDUSTRY_ANIM_MASK, ///< Industry tile animation masking XSLFI_SCRIPT_INT64, ///< See: SLV_SCRIPT_INT64