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