diff --git a/OpenRA.FileFormats/Palette.cs b/OpenRA.FileFormats/Palette.cs index 08effa4285..1202dc8f70 100644 --- a/OpenRA.FileFormats/Palette.cs +++ b/OpenRA.FileFormats/Palette.cs @@ -76,6 +76,13 @@ namespace OpenRA.FileFormats colors = (uint[])p.colors.Clone(); } + public Palette(uint[] data) + { + if (data.Length != 256) + throw new InvalidDataException("Attempting to create palette with incorrect array size"); + colors = (uint[])data.Clone(); + } + public ColorPalette AsSystemPalette() { ColorPalette pal; diff --git a/OpenRA.Mods.RA/FogPalette.cs b/OpenRA.Mods.RA/FogPalette.cs new file mode 100644 index 0000000000..642bb4e684 --- /dev/null +++ b/OpenRA.Mods.RA/FogPalette.cs @@ -0,0 +1,44 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 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.Drawing; +using OpenRA.FileFormats; +using OpenRA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA +{ + class FogPaletteInfo : ITraitInfo + { + public readonly string Name = "fog"; + public object Create(ActorInitializer init) { return new FogPalette(this); } + } + + class FogPalette : IPalette + { + readonly FogPaletteInfo info; + + public FogPalette(FogPaletteInfo info) { this.info = info; } + + public void InitPalette(WorldRenderer wr) + { + var c = new[] { + Color.Transparent, Color.Green, + Color.Blue, Color.Yellow, + Color.FromArgb(128,0,0,0), + Color.FromArgb(128,0,0,0), + Color.FromArgb(128,0,0,0), + Color.FromArgb(64,0,0,0) + }; + + wr.AddPalette(info.Name, new Palette(Exts.MakeArray(256, i => (uint)c[i % 8].ToArgb())), false); + } + } +} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 3553a0b857..0be9b84bb3 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -407,6 +407,7 @@ + diff --git a/OpenRA.Mods.RA/PaletteFromRGBA.cs b/OpenRA.Mods.RA/PaletteFromRGBA.cs index 9fd84ba698..4f8a33c14f 100644 --- a/OpenRA.Mods.RA/PaletteFromRGBA.cs +++ b/OpenRA.Mods.RA/PaletteFromRGBA.cs @@ -38,28 +38,14 @@ namespace OpenRA.Mods.RA this.info = info; } - public void InitPalette( WorldRenderer wr ) + public void InitPalette(WorldRenderer wr) { - if (info.Tileset == null || info.Tileset.ToLowerInvariant() == world.Map.Tileset.ToLowerInvariant()) - { - // TODO: This shouldn't rely on a base palette - var pal = wr.GetPalette("terrain"); - wr.AddPalette(info.Name, new Palette(pal, new SingleColorRemap(Color.FromArgb(info.A, info.R, info.G, info.B))), info.AllowModifiers); - } - } - } + // Enable palette only for a specific tileset + if (info.Tileset != null && info.Tileset.ToLowerInvariant() != world.Map.Tileset.ToLowerInvariant()) + return; - class SingleColorRemap : IPaletteRemap - { - Color c; - public SingleColorRemap(Color c) - { - this.c = c; - } - - public Color GetRemappedColor(Color original, int index) - { - return original.A > 0 ? c : original; + var c = (uint)((info.A << 24) | (info.R << 16) | (info.G << 8) | info.B); + wr.AddPalette(info.Name, new Palette(Exts.MakeArray(256, i => (i == 0) ? 0 : c)), info.AllowModifiers); } } } diff --git a/OpenRA.Mods.RA/ShroudPalette.cs b/OpenRA.Mods.RA/ShroudPalette.cs index a8858b12d6..5437a1987f 100644 --- a/OpenRA.Mods.RA/ShroudPalette.cs +++ b/OpenRA.Mods.RA/ShroudPalette.cs @@ -18,8 +18,6 @@ namespace OpenRA.Mods.RA class ShroudPaletteInfo : ITraitInfo { public readonly string Name = "shroud"; - public readonly bool IsFog = false; - public object Create(ActorInitializer init) { return new ShroudPalette(this); } } @@ -31,34 +29,16 @@ namespace OpenRA.Mods.RA public void InitPalette(WorldRenderer wr) { - var pal = wr.GetPalette("terrain"); - wr.AddPalette(info.Name, new Palette(pal, new ShroudPaletteRemap(info.IsFog)), false); - } - } + var c = new[] { + Color.Transparent, Color.Green, + Color.Blue, Color.Yellow, + Color.Black, + Color.FromArgb(128,0,0,0), + Color.Transparent, + Color.Transparent + }; - class ShroudPaletteRemap : IPaletteRemap - { - bool isFog; - - public ShroudPaletteRemap(bool isFog) { this.isFog = isFog; } - public Color GetRemappedColor(Color original, int index) - { - if (isFog) - return new[] { - Color.Transparent, Color.Green, - Color.Blue, Color.Yellow, - Color.FromArgb(128,0,0,0), - Color.FromArgb(128,0,0,0), - Color.FromArgb(128,0,0,0), - Color.FromArgb(64,0,0,0)}[index % 8]; - else - return new[] { - Color.Transparent, Color.Green, - Color.Blue, Color.Yellow, - Color.Black, - Color.FromArgb(128,0,0,0), - Color.Transparent, - Color.Transparent}[index % 8]; + wr.AddPalette(info.Name, new Palette(Exts.MakeArray(256, i => (uint)c[i % 8].ToArgb())), false); } } } diff --git a/mods/cnc/rules/system.yaml b/mods/cnc/rules/system.yaml index b03db10d59..09e55fe797 100644 --- a/mods/cnc/rules/system.yaml +++ b/mods/cnc/rules/system.yaml @@ -109,10 +109,8 @@ World: G: 0 B: 0 A: 180 - ShroudPalette@shroud: - ShroudPalette@fog: - IsFog: yes - Name: fog + ShroudPalette: + FogPalette: Country@gdi: Name: GDI Race: gdi diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index f00901c7f9..8376d71d8f 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -304,10 +304,8 @@ World: G: 0 B: 0 A: 180 - ShroudPalette@shroud: - ShroudPalette@fog: - IsFog: yes - Name: fog + ShroudPalette: + FogPalette: Country@Atreides: Name: Atreides Race: atreides diff --git a/mods/ra/rules/system.yaml b/mods/ra/rules/system.yaml index 729edaf08f..e99790cfe0 100644 --- a/mods/ra/rules/system.yaml +++ b/mods/ra/rules/system.yaml @@ -259,10 +259,8 @@ World: G: 0 B: 0 A: 180 - ShroudPalette@shroud: - ShroudPalette@fog: - IsFog: yes - Name: fog + ShroudPalette: + FogPalette: Country@0: Name: Allies Race: allies