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/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 7ff12e31dc..ee96b6545c 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -366,7 +366,7 @@ - + diff --git a/OpenRA.Mods.Common/Traits/PaletteEffects/RotationPaletteEffect.cs b/OpenRA.Mods.Common/Traits/PaletteEffects/RotationPaletteEffect.cs new file mode 100644 index 0000000000..34c63d6a80 --- /dev/null +++ b/OpenRA.Mods.Common/Traits/PaletteEffects/RotationPaletteEffect.cs @@ -0,0 +1,105 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Palette effect used for sprinkle \"animations\".")] + class RotationPaletteEffectInfo : ITraitInfo + { + [Desc("Defines to which palettes this effect should be applied to.", + "If none specified, it applies to all palettes not explicitly excluded.")] + public readonly HashSet Palettes = new HashSet(); + + [Desc("Defines for which tileset IDs this effect should be loaded.", + "If none specified, it applies to all tileset IDs not explicitly excluded.")] + public readonly HashSet Tilesets = new HashSet(); + + [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 HashSet ExcludeTilesets = new HashSet(); + + [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 RotationPaletteEffect(init.World, this); } + } + + class RotationPaletteEffect : ITick, IPaletteModifier + { + readonly RotationPaletteEffectInfo info; + readonly uint[] rotationBuffer; + readonly bool validTileset; + readonly string tilesetId; + float t = 0; + + public RotationPaletteEffect(World world, RotationPaletteEffectInfo info) + { + this.info = info; + rotationBuffer = new uint[info.RotationRange]; + tilesetId = world.TileSet.Id; + + validTileset = IsValidTileset(); + } + + bool IsValidTileset() + { + if (info.Tilesets.Count == 0 && info.ExcludeTilesets.Count == 0) + return true; + + return info.Tilesets.Contains(tilesetId) && !info.ExcludeTilesets.Contains(tilesetId); + } + + public void Tick(Actor self) + { + if (!validTileset) + return; + + t += info.RotationStep; + } + + public void AdjustPalette(IReadOnlyDictionary palettes) + { + if (!validTileset) + return; + + var rotate = (int)t % info.RotationRange; + if (rotate == 0) + return; + + foreach (var kvp in palettes) + { + if ((info.Palettes.Count > 0 && !info.Palettes.Any(kvp.Key.StartsWith)) + || (info.ExcludePalettes.Count > 0 && info.ExcludePalettes.Any(kvp.Key.StartsWith))) + continue; + + var palette = kvp.Value; + + for (var i = 0; i < info.RotationRange; i++) + rotationBuffer[(rotate + i) % info.RotationRange] = palette[info.RotationBase + i]; + + for (var i = 0; i < info.RotationRange; i++) + palette[info.RotationBase + i] = rotationBuffer[i]; + } + } + } +} diff --git a/OpenRA.Mods.Common/Traits/PaletteEffects/WaterPaletteRotation.cs b/OpenRA.Mods.Common/Traits/PaletteEffects/WaterPaletteRotation.cs deleted file mode 100644 index bb973554be..0000000000 --- a/OpenRA.Mods.Common/Traits/PaletteEffects/WaterPaletteRotation.cs +++ /dev/null @@ -1,63 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System.Collections.Generic; -using System.Linq; -using OpenRA.Graphics; -using OpenRA.Traits; - -namespace OpenRA.Mods.Common.Traits -{ - [Desc("Palette effect used for sprinkle \"animations\" on terrain tiles.")] - class WaterPaletteRotationInfo : ITraitInfo - { - public readonly HashSet ExcludePalettes = new HashSet(); - - public object Create(ActorInitializer init) { return new WaterPaletteRotation(init.World, this); } - } - - class WaterPaletteRotation : ITick, IPaletteModifier - { - readonly WaterPaletteRotationInfo info; - readonly World world; - float t = 0; - - public WaterPaletteRotation(World world, WaterPaletteRotationInfo info) - { - this.world = world; - this.info = info; - } - - public void Tick(Actor self) { t += .25f; } - - uint[] temp = new uint[7]; /* allocating this on the fly actually hurts our profile */ - - public void AdjustPalette(IReadOnlyDictionary palettes) - { - var rotate = (int)t % 7; - if (rotate == 0) - return; - - foreach (var kvp in palettes) - { - if (info.ExcludePalettes.Contains(kvp.Key)) - 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 < 7; i++) - palette[world.TileSet.WaterPaletteRotationBase + i] = temp[i]; - } - } - } -} diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 7138902dc0..b6b42cecfd 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -2051,6 +2051,13 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + // WaterPaletteRotation renamed to RotationPaletteEffect + if (engineVersion < 20150903) + { + if (depth == 1 && node.Key == "WaterPaletteRotation") + node.Key = "RotationPaletteEffect"; + } + UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); } } diff --git a/mods/cnc/rules/palettes.yaml b/mods/cnc/rules/palettes.yaml index e789ef80f7..819c0ddfc2 100644 --- a/mods/cnc/rules/palettes.yaml +++ b/mods/cnc/rules/palettes.yaml @@ -72,6 +72,7 @@ MenuEffect: Desaturated CloakPaletteEffect: FlashPaletteEffect: - WaterPaletteRotation: - ExcludePalettes: effect + RotationPaletteEffect@water: + 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..56813c0b4e 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,15 @@ RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 PlayerHighlightPalette: MenuPaletteEffect: - WaterPaletteRotation: - ExcludePalettes: player, effect + RotationPaletteEffect@defaultwater: + Palettes: terrain + ExcludeTilesets: DESERT + RotationPaletteEffect@actorswater: + Palettes: player, effect + RotationPaletteEffect@desertwater: + Palettes: terrain + Tilesets: DESERT + 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: