From ca055eb7bb78ab2718b3730ea338a0831a8912b0 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Tue, 18 Aug 2015 19:54:50 +0200 Subject: [PATCH] Refactored WaterPaletteRotation Moved RotationBase from tileset definition to WaterPaletteRotation effect. Unhardcoded rotation range and rotation rate. Added possibility to exclude Tilesets from effect. Fixed RA water palette rotation for actors on desert maps (#8872). --- OpenRA.Game/Map/TileSet.cs | 1 - .../PaletteEffects/WaterPaletteRotation.cs | 37 ++++++++++++++----- mods/cnc/rules/palettes.yaml | 3 +- mods/cnc/tilesets/desert.yaml | 1 - mods/cnc/tilesets/jungle.yaml | 1 - mods/cnc/tilesets/snow.yaml | 1 - mods/cnc/tilesets/temperat.yaml | 1 - mods/cnc/tilesets/winter.yaml | 1 - mods/ra/rules/palettes.yaml | 17 +++++++-- mods/ra/tilesets/desert.yaml | 1 - 10 files changed, 42 insertions(+), 22 deletions(-) diff --git a/OpenRA.Game/Map/TileSet.cs b/OpenRA.Game/Map/TileSet.cs index 35dbe6391b..5ae0d38808 100644 --- a/OpenRA.Game/Map/TileSet.cs +++ b/OpenRA.Game/Map/TileSet.cs @@ -171,7 +171,6 @@ namespace OpenRA public readonly int SheetSize = 512; public readonly string Palette; public readonly string PlayerPalette; - public readonly int WaterPaletteRotationBase = 0x60; public readonly Color[] HeightDebugColors = new[] { Color.Red }; public readonly string[] EditorTemplateOrder; public readonly bool IgnoreTileSpriteOffsets; diff --git a/OpenRA.Mods.Common/Traits/PaletteEffects/WaterPaletteRotation.cs b/OpenRA.Mods.Common/Traits/PaletteEffects/WaterPaletteRotation.cs index bb973554be..9366e12dc4 100644 --- a/OpenRA.Mods.Common/Traits/PaletteEffects/WaterPaletteRotation.cs +++ b/OpenRA.Mods.Common/Traits/PaletteEffects/WaterPaletteRotation.cs @@ -15,11 +15,24 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - [Desc("Palette effect used for sprinkle \"animations\" on terrain tiles.")] + [Desc("Palette effect used for sprinkle \"animations\".")] class WaterPaletteRotationInfo : ITraitInfo { + [Desc("Defines which palettes should be excluded from this effect.")] public readonly HashSet ExcludePalettes = new HashSet(); + [Desc("Don't apply the effect for these tileset IDs.")] + public readonly string[] ExcludeTilesets = { }; + + [Desc("Palette index of first RotationRange color.")] + public readonly int RotationBase = 0x60; + + [Desc("Range of colors to rotate.")] + public readonly int RotationRange = 7; + + [Desc("Step towards next color index per tick.")] + public readonly float RotationStep = .25f; + public object Create(ActorInitializer init) { return new WaterPaletteRotation(init.World, this); } } @@ -28,35 +41,39 @@ namespace OpenRA.Mods.Common.Traits readonly WaterPaletteRotationInfo info; readonly World world; float t = 0; + uint[] temp; public WaterPaletteRotation(World world, WaterPaletteRotationInfo info) { this.world = world; this.info = info; + + temp = new uint[info.RotationRange]; /* allocating this on the fly actually hurts our profile */ } - public void Tick(Actor self) { t += .25f; } - - uint[] temp = new uint[7]; /* allocating this on the fly actually hurts our profile */ + public void Tick(Actor self) + { + t += info.RotationStep; + } public void AdjustPalette(IReadOnlyDictionary palettes) { - var rotate = (int)t % 7; + var rotate = (int)t % info.RotationRange; if (rotate == 0) return; foreach (var kvp in palettes) { - if (info.ExcludePalettes.Contains(kvp.Key)) + if (info.ExcludePalettes.Contains(kvp.Key) || info.ExcludeTilesets.Contains(world.TileSet.Id)) continue; var palette = kvp.Value; - for (var i = 0; i < 7; i++) - temp[(rotate + i) % 7] = palette[world.TileSet.WaterPaletteRotationBase + i]; + for (var i = 0; i < info.RotationRange; i++) + temp[(rotate + i) % info.RotationRange] = palette[info.RotationBase + i]; - for (var i = 0; i < 7; i++) - palette[world.TileSet.WaterPaletteRotationBase + i] = temp[i]; + for (var i = 0; i < info.RotationRange; i++) + palette[info.RotationBase + i] = temp[i]; } } } diff --git a/mods/cnc/rules/palettes.yaml b/mods/cnc/rules/palettes.yaml index e789ef80f7..89827675e8 100644 --- a/mods/cnc/rules/palettes.yaml +++ b/mods/cnc/rules/palettes.yaml @@ -73,5 +73,6 @@ CloakPaletteEffect: FlashPaletteEffect: WaterPaletteRotation: - ExcludePalettes: effect + ExcludePalettes: effect, chrome + RotationBase: 32 diff --git a/mods/cnc/tilesets/desert.yaml b/mods/cnc/tilesets/desert.yaml index 8f701b694f..99ac158dce 100644 --- a/mods/cnc/tilesets/desert.yaml +++ b/mods/cnc/tilesets/desert.yaml @@ -2,7 +2,6 @@ General: Name: Desert Id: DESERT Palette: desert.pal - WaterPaletteRotationBase: 32 EditorTemplateOrder: Terrain, Debris, Road, Cliffs, Beach, River, Bridge Terrain: diff --git a/mods/cnc/tilesets/jungle.yaml b/mods/cnc/tilesets/jungle.yaml index 159338d2ae..6ac22b82df 100644 --- a/mods/cnc/tilesets/jungle.yaml +++ b/mods/cnc/tilesets/jungle.yaml @@ -2,7 +2,6 @@ General: Name: Jungle Id: JUNGLE Palette: jungle.pal - WaterPaletteRotationBase: 32 EditorTemplateOrder: Terrain, Debris, Road, Cliffs, Beach, River, Bridge Terrain: diff --git a/mods/cnc/tilesets/snow.yaml b/mods/cnc/tilesets/snow.yaml index e5c63e7a47..1b9bb99754 100644 --- a/mods/cnc/tilesets/snow.yaml +++ b/mods/cnc/tilesets/snow.yaml @@ -2,7 +2,6 @@ General: Name: Snow Id: SNOW Palette: snow.pal - WaterPaletteRotationBase: 32 EditorTemplateOrder: Terrain, Debris, Road, Cliffs, Beach, River, Bridge Terrain: diff --git a/mods/cnc/tilesets/temperat.yaml b/mods/cnc/tilesets/temperat.yaml index c52dd85935..ed055b6e4a 100644 --- a/mods/cnc/tilesets/temperat.yaml +++ b/mods/cnc/tilesets/temperat.yaml @@ -2,7 +2,6 @@ General: Name: Temperate Id: TEMPERAT Palette: temperat.pal - WaterPaletteRotationBase: 32 EditorTemplateOrder: Terrain, Debris, Road, Cliffs, Beach, River, Bridge Terrain: diff --git a/mods/cnc/tilesets/winter.yaml b/mods/cnc/tilesets/winter.yaml index df72d2ae41..41777bce49 100644 --- a/mods/cnc/tilesets/winter.yaml +++ b/mods/cnc/tilesets/winter.yaml @@ -2,7 +2,6 @@ General: Name: Winter Id: WINTER Palette: winter.pal - WaterPaletteRotationBase: 32 EditorTemplateOrder: Terrain, Debris, Road, Cliffs, Beach, River, Bridge Terrain: diff --git a/mods/ra/rules/palettes.yaml b/mods/ra/rules/palettes.yaml index 16878f3e3c..ce48348e28 100644 --- a/mods/ra/rules/palettes.yaml +++ b/mods/ra/rules/palettes.yaml @@ -1,7 +1,8 @@ ^Palettes: - PlayerPaletteFromCurrentTileset: + PaletteFromFile@player: Name: player - ShadowIndex: 3,4 + Filename: temperat.pal + ShadowIndex: 4 PaletteFromCurrentTileset: Name: terrain ShadowIndex: 3,4 @@ -66,8 +67,16 @@ RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 PlayerHighlightPalette: MenuPaletteEffect: - WaterPaletteRotation: - ExcludePalettes: player, effect + WaterPaletteRotation@defaultwater: + ExcludePalettes: chrome + ExcludeTilesets: DESERT + WaterPaletteRotation@actorswater: + ExcludePalettes: chrome, terrain + ExcludeTilesets: TEMPERAT, SNOW, INTERIOR + WaterPaletteRotation@desertwater: + ExcludePalettes: chrome, effect, player + ExcludeTilesets: TEMPERAT, SNOW, INTERIOR + RotationBase: 32 LightPaletteRotator: ExcludePalettes: terrain, effect ChronoshiftPaletteEffect: diff --git a/mods/ra/tilesets/desert.yaml b/mods/ra/tilesets/desert.yaml index 2afd0f8597..db84afc260 100644 --- a/mods/ra/tilesets/desert.yaml +++ b/mods/ra/tilesets/desert.yaml @@ -3,7 +3,6 @@ General: Id: DESERT Palette: desert.pal PlayerPalette: temperat.pal - WaterPaletteRotationBase: 32 EditorTemplateOrder: Terrain, Debris, Road, Cliffs, Water Cliffs, Beach, River, Bridge Terrain: