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: