Extendable palette definitions. Contains many regressions, bugs and general hacks

This commit is contained in:
Paul Chote
2010-02-03 23:32:25 +13:00
parent 1e01911b46
commit 6821238710
40 changed files with 311 additions and 160 deletions

View File

@@ -58,11 +58,12 @@ namespace OpenRA.Server
throw new InvalidOperationException("Already got 8 players");
}
static int ChooseFreePalette()
static string ChooseFreePalette()
{
// TODO: FIX
for (var i = 0; i < 8; i++)
if (lobbyInfo.Clients.All(c => c.Palette != i))
return i;
//if (lobbyInfo.Clients.All(c => c.Palette != i))
return "player"+i;
throw new InvalidOperationException("No free palettes");
}
@@ -247,14 +248,15 @@ namespace OpenRA.Server
SendChatTo( conn, "You can't change your color after the game has started" );
return true;
}
int pal;
if (!int.TryParse(s, out pal) || pal < 0 || pal > 7)
int pali;
if (!int.TryParse(s, out pali) || pali < 0 || pali > 7)
{
Console.WriteLine("Invalid palette: {0}", s);
return false;
}
string pal = "player"+pali;
if (lobbyInfo.Clients.Where( c => c != GetClient(conn) ).Any( c => c.Palette == pal ))
{
SendChatTo( conn, "You can't be the same color as another player" );

View File

@@ -20,7 +20,7 @@ namespace OpenRa.FileFormats
public class Client
{
public int Index;
public int Palette;
public string Palette;
public int Race;
// public int SpawnPoint;
public string Name;

View File

@@ -39,21 +39,9 @@ namespace OpenRa
typing += c;
}
public static readonly Color[] paletteColors =
{
Color.FromArgb(228, 200, 112),
Color.FromArgb(56, 72, 125),
Color.FromArgb(238, 0, 0),
Color.FromArgb(198,97,0),
Color.FromArgb(28,109,97),
Color.FromArgb(153,76,53),
Color.FromArgb(76,101,60),
Color.FromArgb(133,113,101),
};
public void AddLine(Player p, string text)
{
AddLine(paletteColors[(int) p.Palette], p.PlayerName, text);
AddLine(p.Color, p.PlayerName, text);
}
public void AddLine(Color c, string from, string text)

View File

@@ -193,7 +193,7 @@ namespace OpenRa
DrawRadar( world );
DrawPower( world );
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "moneybin"), new float2(Game.viewport.Width - 320, 0), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "moneybin"), new float2(Game.viewport.Width - 320, 0), "chrome");
DrawMoney( world );
rgbaRenderer.Flush();
DrawButtons( world );
@@ -316,7 +316,7 @@ namespace OpenRa
DrawDialogBackground(mapRect, panelSprites, false);
rgbaRenderer.DrawSprite(mapChooserSprite,
new float2(mapRect.Location) + new float2(4, 4),
PaletteType.Chrome,
"chrome",
new float2(mapRect.Size) - new float2(8, 8));
rgbaRenderer.Flush();
@@ -350,14 +350,15 @@ namespace OpenRa
AddButton(r, _ => { });
}
bool PaletteAvailable(int palette) { return Game.LobbyInfo.Clients.All(c => c.Palette != palette); }
bool PaletteAvailable(string palette) { return Game.LobbyInfo.Clients.All(c => c.Palette != palette); }
void CyclePalette(bool left)
{
var d = left ? 1 : 7;
var newpalette = ((int)Game.world.LocalPlayer.Palette + d) % 8;
while (!PaletteAvailable(newpalette) && newpalette != (int)Game.world.LocalPlayer.Palette)
newpalette = (newpalette + d) % 8;
// TODO: FIX
var newpalette = 1;//((int)Game.world.LocalPlayer.Palette + d) % 8;
//while (!PaletteAvailable(newpalette) && newpalette != (int)Game.world.LocalPlayer.Palette)
// newpalette = (newpalette + d) % 8;
Game.IssueOrder(
Order.Chat("/pal " + newpalette));
@@ -446,7 +447,7 @@ namespace OpenRa
AddButton(paletteRect, CyclePalette);
shpRenderer.DrawSprite(colorBlock, new float2(paletteRect.Left + 4, paletteRect.Top + 4),
(PaletteType)client.Palette);
client.Palette);
var raceRect = new Rectangle(r.Left + 290, y - 2, 65, 22);
DrawDialogBackground(raceRect, panelSprites, false);
@@ -463,7 +464,7 @@ namespace OpenRa
shpRenderer.DrawSprite(colorBlock, new float2(paletteRect.Left + 4, paletteRect.Top + 4),
(PaletteType)client.Palette);
client.Palette);
renderer.DrawText(((Race)client.Race).ToString(), new int2(r.Left + 300, y), Color.White);
renderer.DrawText(client.State.ToString(), new int2(r.Left + 370, y), Color.White);
@@ -530,12 +531,12 @@ namespace OpenRa
hasRadar = hasNewRadar;
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "left"), radarOrigin, PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "right"), radarOrigin + new float2(201, 0), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bottom"), radarOrigin + new float2(0, 192), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "left"), radarOrigin, "chrome");
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "right"), radarOrigin + new float2(201, 0), "chrome");
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bottom"), radarOrigin + new float2(0, 192), "chrome");
if (radarAnimating)
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bg"), radarOrigin + new float2(9, 0), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bg"), radarOrigin + new float2(9, 0), "chrome");
rgbaRenderer.Flush();
@@ -567,7 +568,7 @@ namespace OpenRa
var producing = queue.CurrentItem(groupName);
var index = q.Key == currentTab ? 2 : (producing != null && producing.Done) ? 1 : 0;
var race = (world.LocalPlayer.Race == Race.Allies) ? "allies" : "soviet";
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer,"tabs-"+tabKeys[index], race+"-"+q.Key), new float2(x, y), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer,"tabs-"+tabKeys[index], race+"-"+q.Key), new float2(x, y), "chrome");
buttons.Add(Pair.New(new RectangleF(x, y, tabWidth, tabHeight),
(Action<bool>)(isLmb => HandleTabClick(groupName))));
@@ -600,7 +601,7 @@ namespace OpenRa
var x = Game.viewport.Width - 65;
foreach (var d in moneyDigits.Reverse())
{
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, digitCollection, (d - '0').ToString()), new float2(x, 6), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, digitCollection, (d - '0').ToString()), new float2(x, 6), "chrome");
x -= 14;
}
}
@@ -655,7 +656,7 @@ namespace OpenRa
lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f);
float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value-indicator.size.X/2, barStart.Y-1);
rgbaRenderer.DrawSprite(indicator, powerDrainLevel, PaletteType.Chrome);
rgbaRenderer.DrawSprite(indicator, powerDrainLevel, "chrome");
rgbaRenderer.Flush();
}
@@ -675,7 +676,7 @@ namespace OpenRa
repairButton.ReplaceAnim(Game.controller.orderGenerator is RepairOrderGenerator ? "pressed" : "normal");
AddButton(repairRect, isLmb => Game.controller.ToggleInputMode<RepairOrderGenerator>());
}
shpRenderer.DrawSprite(repairButton.Image, repairDrawPos, PaletteType.Chrome);
shpRenderer.DrawSprite(repairButton.Image, repairDrawPos, "chrome");
// Sell
Rectangle sellRect = new Rectangle(buttonOrigin.X+40, buttonOrigin.Y,
@@ -686,7 +687,7 @@ namespace OpenRa
sellButton.ReplaceAnim(Game.controller.orderGenerator is SellOrderGenerator ? "pressed" : "normal");
AddButton(sellRect, isLmb => Game.controller.ToggleInputMode<SellOrderGenerator>());
shpRenderer.DrawSprite(sellButton.Image, sellDrawPos, PaletteType.Chrome);
shpRenderer.DrawSprite(sellButton.Image, sellDrawPos, "chrome");
shpRenderer.Flush();
if (Game.Settings.PowerDownBuildings)
@@ -700,7 +701,7 @@ namespace OpenRa
pwrdownButton.ReplaceAnim(Game.controller.orderGenerator is PowerDownOrderGenerator ? "pressed" : "normal");
AddButton(pwrdownRect, isLmb => Game.controller.ToggleInputMode<PowerDownOrderGenerator>());
shpRenderer.DrawSprite(pwrdownButton.Image, pwrdownDrawPos, PaletteType.Chrome);
shpRenderer.DrawSprite(pwrdownButton.Image, pwrdownDrawPos, "chrome");
}
shpRenderer.Flush();
@@ -713,7 +714,7 @@ namespace OpenRa
optionsButton.ReplaceAnim(optionsPressed ? "left-pressed" : "left-normal");
AddButton(optionsRect, isLmb => optionsPressed = !optionsPressed);
shpRenderer.DrawSprite(optionsButton.Image, optionsDrawPos, PaletteType.Chrome);
shpRenderer.DrawSprite(optionsButton.Image, optionsDrawPos, "chrome");
shpRenderer.Flush();
renderer.DrawText("Options", new int2((int)(optionsButton.Image.size.X - renderer.MeasureText("Options").X)/2, -2) , Color.White);
@@ -739,26 +740,26 @@ namespace OpenRa
if (ss.Length > 8)
for( var x = r.Left + (int)ss[2].size.X; x < r.Right - (int)ss[3].size.X; x += (int)ss[8].size.X )
for( var y = r.Top + (int)ss[0].size.Y; y < r.Bottom - (int)ss[1].size.Y; y += (int)ss[8].size.Y )
sr.DrawSprite(ss[8], new float2(x, y), PaletteType.Chrome);
sr.DrawSprite(ss[8], new float2(x, y), "chrome");
//draw borders
for (var y = r.Top + (int)ss[0].size.Y; y < r.Bottom - (int)ss[1].size.Y; y += (int)ss[1].size.Y)
{
sr.DrawSprite(ss[2], new float2(r.Left, y), PaletteType.Chrome);
sr.DrawSprite(ss[3], new float2(r.Right - ss[3].size.X, y), PaletteType.Chrome);
sr.DrawSprite(ss[2], new float2(r.Left, y), "chrome");
sr.DrawSprite(ss[3], new float2(r.Right - ss[3].size.X, y), "chrome");
}
for (var x = r.Left + (int)ss[2].size.X; x < r.Right - (int)ss[3].size.X; x += (int)ss[3].size.X)
{
sr.DrawSprite(ss[0], new float2(x, r.Top), PaletteType.Chrome);
sr.DrawSprite(ss[1], new float2(x, r.Bottom - ss[1].size.Y), PaletteType.Chrome);
sr.DrawSprite(ss[0], new float2(x, r.Top), "chrome");
sr.DrawSprite(ss[1], new float2(x, r.Bottom - ss[1].size.Y), "chrome");
}
sr.DrawSprite(ss[4], new float2(r.Left, r.Top), PaletteType.Chrome);
sr.DrawSprite(ss[5], new float2(r.Right - ss[5].size.X, r.Top), PaletteType.Chrome);
sr.DrawSprite(ss[6], new float2(r.Left, r.Bottom - ss[6].size.Y), PaletteType.Chrome);
sr.DrawSprite(ss[7], new float2(r.Right - ss[7].size.X, r.Bottom - ss[7].size.Y), PaletteType.Chrome);
sr.DrawSprite(ss[4], new float2(r.Left, r.Top), "chrome");
sr.DrawSprite(ss[5], new float2(r.Right - ss[5].size.X, r.Top), "chrome");
sr.DrawSprite(ss[6], new float2(r.Left, r.Bottom - ss[6].size.Y), "chrome");
sr.DrawSprite(ss[7], new float2(r.Right - ss[7].size.X, r.Bottom - ss[7].size.Y), "chrome");
sr.Flush();
renderer.Device.DisableScissor();
@@ -858,7 +859,7 @@ namespace OpenRa
string tooltipItem = null;
// Draw the top border
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "top"), new float2(origin.X - 9, origin.Y - 9), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "top"), new float2(origin.X - 9, origin.Y - 9), "chrome");
// Draw the icons
int lasty = -1;
@@ -867,7 +868,7 @@ namespace OpenRa
// Draw the background for this row
if (y != lasty)
{
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bg-" + (y % 4).ToString()), new float2(origin.X - 9, origin.Y + 48 * y), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bg-" + (y % 4).ToString()), new float2(origin.X - 9, origin.Y + 48 * y), "chrome");
rgbaRenderer.Flush();
lasty = y;
}
@@ -876,7 +877,7 @@ namespace OpenRa
var drawPos = new float2(rect.Location);
var isBuildingSomething = queue.CurrentItem(queueName) != null;
shpRenderer.DrawSprite(tabSprites[item.Name], drawPos, PaletteType.Chrome);
shpRenderer.DrawSprite(tabSprites[item.Name], drawPos, "chrome");
var firstOfThis = queue.AllItems(queueName).FirstOrDefault(a => a.Item == item.Name);
@@ -892,7 +893,7 @@ namespace OpenRa
* NumClockFrames / firstOfThis.TotalTime);
clock.Tick();
shpRenderer.DrawSprite(clock.Image, drawPos, PaletteType.Chrome);
shpRenderer.DrawSprite(clock.Image, drawPos, "chrome");
if (firstOfThis.Done)
{
@@ -934,23 +935,23 @@ namespace OpenRa
while (y < paletteRows)
{
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bg-" + (y % 4).ToString()), new float2(origin.X - 9, origin.Y + 48 * y), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bg-" + (y % 4).ToString()), new float2(origin.X - 9, origin.Y + 48 * y), "chrome");
y++;
}
foreach (var ob in overlayBits)
shpRenderer.DrawSprite(ob.First, ob.Second, PaletteType.Chrome);
shpRenderer.DrawSprite(ob.First, ob.Second, "chrome");
shpRenderer.Flush();
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bottom"), new float2(origin.X - 9, origin.Y - 1 + 48 * y), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bottom"), new float2(origin.X - 9, origin.Y - 1 + 48 * y), "chrome");
// Draw dock
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-top"), new float2(Game.viewport.Width - 14, origin.Y - 23), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-top"), new float2(Game.viewport.Width - 14, origin.Y - 23), "chrome");
for (int i = 0; i < y; i++)
{
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-" + (y % 4).ToString()), new float2(Game.viewport.Width - 14, origin.Y + 48 * i), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-" + (y % 4).ToString()), new float2(Game.viewport.Width - 14, origin.Y + 48 * i), "chrome");
}
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-bottom"), new float2(Game.viewport.Width - 14, origin.Y - 1 + 48 * y), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-bottom"), new float2(Game.viewport.Width - 14, origin.Y - 1 + 48 * y), "chrome");
rgbaRenderer.Flush();
if (tooltipItem != null)
@@ -1054,7 +1055,7 @@ namespace OpenRa
{
var tooltipSprite = ChromeProvider.GetImage(renderer, chromeCollection, "tooltip-bg");
var p = pos.ToFloat2() - new float2(tooltipSprite.size.X, 0);
rgbaRenderer.DrawSprite(tooltipSprite, p, PaletteType.Chrome);
rgbaRenderer.DrawSprite(tooltipSprite, p, "chrome");
rgbaRenderer.Flush();
var info = Rules.Info[unit];
@@ -1104,10 +1105,10 @@ namespace OpenRa
if (numPowers == 0) return;
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-top"), new float2(0, 14), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-top"), new float2(0, 14), "chrome");
for (var i = 1; i < numPowers; i++)
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-middle"), new float2(0, 14 + i * 51), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-bottom"), new float2(0, 14 + numPowers * 51), PaletteType.Chrome);
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-middle"), new float2(0, 14 + i * 51), "chrome");
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-bottom"), new float2(0, 14 + numPowers * 51), "chrome");
rgbaRenderer.Flush();
@@ -1122,14 +1123,14 @@ namespace OpenRa
if (sp.IsAvailable)
{
var drawPos = new float2(5, y);
shpRenderer.DrawSprite(image, drawPos, PaletteType.Chrome);
shpRenderer.DrawSprite(image, drawPos, "chrome");
clock.PlayFetchIndex("idle",
() => (sp.TotalTime - sp.RemainingTime)
* NumClockFrames / sp.TotalTime);
clock.Tick();
shpRenderer.DrawSprite(clock.Image, drawPos, PaletteType.Chrome);
shpRenderer.DrawSprite(clock.Image, drawPos, "chrome");
var rect = new Rectangle(5, y, 64, 48);
if (sp.IsReady)
@@ -1137,7 +1138,7 @@ namespace OpenRa
ready.Play("ready");
shpRenderer.DrawSprite(ready.Image,
drawPos + new float2((64 - ready.Image.size.X) / 2, 2),
PaletteType.Chrome);
"chrome");
}
AddButton(rect, HandleSupportPower(sp));
@@ -1174,7 +1175,7 @@ namespace OpenRa
void DrawSupportPowerTooltip(World world, SupportPower sp, int2 pos)
{
var tooltipSprite = ChromeProvider.GetImage(renderer, chromeCollection, "tooltip-bg");
rgbaRenderer.DrawSprite(tooltipSprite, pos, PaletteType.Chrome);
rgbaRenderer.DrawSprite(tooltipSprite, pos, "chrome");
rgbaRenderer.Flush();
pos += new int2(5, 5);

View File

@@ -98,14 +98,14 @@ namespace OpenRa.Effects
if (Projectile.High || Projectile.Arcing)
{
if (Projectile.Shadow)
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, PaletteType.Shadow);
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, "shadow");
var highPos = pos - new float2(0, (VisualDest - Src).Length * height * 4 * at * (1 - at));
yield return new Renderable(anim.Image, highPos - .5f * anim.Image.size, Owner.Palette);
}
else
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, Projectile.UnderWater ? PaletteType.Shadow : Owner.Palette);
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, Projectile.UnderWater ? "shadow" : Owner.Palette);
}
}
}

View File

@@ -22,7 +22,7 @@ namespace OpenRa.Effects
public IEnumerable<Renderable> Render()
{
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, 0);
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, "effect");
}
public Player Owner { get { return null; } }

View File

@@ -29,7 +29,7 @@ namespace OpenRa.Effects
{
if (remainingTicks % 2 == 0)
foreach (var r in target.Render())
yield return r.WithPalette(PaletteType.Highlight);
yield return r.WithPalette("highlight");
}
}
}

View File

@@ -86,7 +86,7 @@ namespace OpenRa.Effects
public IEnumerable<Renderable> Render()
{
yield return new Renderable(anim.Image, Pos - 0.5f * anim.Image.size - new float2(0, Altitude), 0);
yield return new Renderable(anim.Image, Pos - 0.5f * anim.Image.size - new float2(0, Altitude), "effect");
}
}
}

View File

@@ -24,7 +24,7 @@ namespace OpenRa.Effects
public IEnumerable<Renderable> Render()
{
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, PaletteType.Shadow);
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, "shadow");
}
}
}

View File

@@ -21,7 +21,7 @@ namespace OpenRa.Effects
public IEnumerable<Renderable> Render()
{
yield return new Renderable(anim.Image,
a.CenterLocation - .5f * anim.Image.size, PaletteType.Chrome);
a.CenterLocation - .5f * anim.Image.size, "chrome");
}
}
}

View File

@@ -24,7 +24,7 @@ namespace OpenRa.Effects
public IEnumerable<Renderable> Render()
{
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, 0);
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, "effect");
}
}
}

View File

@@ -46,7 +46,7 @@ namespace OpenRa.Effects
var y = d.Y;
while( y >= prev.Y + 8 )
{
yield return new Renderable( tesla.GetSprite( 2 ), (float2)( from + prev - new int2( 0, 8 ) ), 0 );
yield return new Renderable( tesla.GetSprite( 2 ), (float2)( from + prev - new int2( 0, 8 ) ), "effect");
prev.Y += 8;
}
}
@@ -58,26 +58,26 @@ namespace OpenRa.Effects
var y = i * d.Y / d.X;
if( y <= prev.Y - 8 )
{
yield return new Renderable(tesla.GetSprite(3), (float2)(from + prev - new int2(8, 16)), 0);
yield return new Renderable(tesla.GetSprite(3), (float2)(from + prev - new int2(8, 16)), "effect");
prev.Y -= 8;
while( y <= prev.Y - 8 )
{
yield return new Renderable(tesla.GetSprite(2), (float2)(from + prev - new int2(0, 16)), 0);
yield return new Renderable(tesla.GetSprite(2), (float2)(from + prev - new int2(0, 16)), "effect");
prev.Y -= 8;
}
}
else if( y >= prev.Y + 8 )
{
yield return new Renderable(tesla.GetSprite(0), (float2)(from + prev - new int2(8, 8)), 0);
yield return new Renderable(tesla.GetSprite(0), (float2)(from + prev - new int2(8, 8)), "effect");
prev.Y += 8;
while( y >= prev.Y + 8 )
{
yield return new Renderable(tesla.GetSprite(2), (float2)(from + prev - new int2(0, 8)), 0);
yield return new Renderable(tesla.GetSprite(2), (float2)(from + prev - new int2(0, 8)), "effect");
prev.Y += 8;
}
}
else
yield return new Renderable(tesla.GetSprite(1), (float2)(from + prev - new int2(8, 8)), 0);
yield return new Renderable(tesla.GetSprite(1), (float2)(from + prev - new int2(8, 8)), "effect");
prev.X += 8;
}

View File

@@ -2,45 +2,42 @@ using System.Collections.Generic;
using System.Drawing;
using OpenRa.FileFormats;
using OpenRa.Traits;
using System;
namespace OpenRa.Graphics
{
public enum PaletteType
{
Gold, Blue, Red, Orange, Teal, Salmon, Green, Gray,
Shadow, Invuln, Disabled, Highlight, Shroud, Chrome,
Terrain
};
class HardwarePalette : Sheet
{
const int maxEntries = 16;
const int maxEntries = 32;
int allocated = 0;
// We need to store the Palettes themselves for the remap palettes to work
// We should probably try to fix this somehow
static Dictionary<string, Palette> palettes;
public HardwarePalette(Renderer renderer, Map map)
: base(renderer,new Size(256, maxEntries))
{
Palette pal = new Palette(FileSystem.Open(map.Theater + ".pal"));
AddPalette(pal); // Gold
foreach (string remap in new string[] { "blue", "red", "orange", "teal", "salmon", "green", "gray" })
AddPalette(new Palette(pal, new PlayerColorRemap(FileSystem.Open(remap + ".rem"))));
AddPalette(new Palette(pal, new SingleColorRemap(Color.FromArgb(140, 0, 0, 0)))); // Shadow
AddPalette(new Palette(pal, new SingleColorRemap(Color.FromArgb(128, 128, 0, 0)))); // Invulnerable (Iron Curtain)
AddPalette(new Palette(pal, new SingleColorRemap(Color.FromArgb(180, 0, 0, 0)))); // Disabled / Low power
AddPalette(new Palette(pal, new SingleColorRemap(Color.FromArgb(128, 255, 255, 255)))); // Highlight
AddPalette(new Palette(pal, new ShroudPaletteRemap())); // Shroud
AddPalette(pal); // Chrome (it's like gold, but we're not going to hax it in palettemods)
palettes = new Dictionary<string, Palette>();
}
public int AddPalette(Palette p)
public Palette GetPalette(string name)
{
for (int i = 0; i < 256; i++)
this[new Point(i, allocated)] = p.GetColor(i);
try { return palettes[name]; }
catch (KeyNotFoundException)
{
throw new InvalidOperationException(
"Palette `{0}` does not exist".F(name));
}
}
public int AddPalette(string name, Palette p)
{
palettes.Add(name, p);
for (int i = 0; i < 256; i++)
{
this[new Point(i, allocated)] = p.GetColor(i);
}
return allocated++;
}

View File

@@ -35,7 +35,6 @@ namespace OpenRa.Graphics
sprite = new Sprite(sheet, rect, TextureChannel.Alpha);
mapOnlySprite = new Sprite(mapOnlySheet, rect, TextureChannel.Alpha);
playerColors = Util.MakeArray<Color>(8, b => Color.FromArgb(alpha, Chat.paletteColors[b]));
shroudColor = Color.FromArgb(alpha, Color.Black);
}
@@ -58,7 +57,6 @@ namespace OpenRa.Graphics
.Select(a => Color.FromArgb(alpha, pal.GetColor(a))).ToArray();
});
Color[] playerColors;
static Color shroudColor;
public void InvalidateOre() { oreLayer = null; }
@@ -107,7 +105,7 @@ namespace OpenRa.Graphics
foreach (var a in world.Queries.WithTrait<Unit>())
*(c + (a.Actor.Location.Y * bitmapData.Stride >> 2) + a.Actor.Location.X) =
playerColors[(int)a.Actor.Owner.Palette].ToArgb();
Color.FromArgb(alpha, a.Actor.Owner.Color).ToArgb();
for (var y = world.Map.YOffset; y < world.Map.YOffset + world.Map.Height; y++)
for (var x = world.Map.XOffset; x < world.Map.XOffset + world.Map.Width; x++)
@@ -120,7 +118,7 @@ namespace OpenRa.Graphics
var b = world.WorldActor.traits.Get<BuildingInfluence>().GetBuildingAt(new int2(x, y));
if (b != null)
*(c + (y * bitmapData.Stride >> 2) + x) =
(b.Owner != null ? playerColors[(int)b.Owner.Palette] : colors[4]).ToArgb();
(b.Owner != null ? Color.FromArgb(alpha, b.Owner.Color) : colors[4]).ToArgb();
}
}
@@ -131,7 +129,7 @@ namespace OpenRa.Graphics
public void Draw(RectangleF rect, bool mapOnly)
{
rgbaRenderer.DrawSprite(mapOnly ? mapOnlySprite : sprite,
new float2(rect.X, rect.Y), PaletteType.Chrome, new float2(rect.Width, rect.Height));
new float2(rect.X, rect.Y), "chrome", new float2(rect.Width, rect.Height));
rgbaRenderer.Flush();
}
}

View File

@@ -49,7 +49,7 @@ namespace OpenRa.Graphics
{
var location = new int2(x, y);
spriteRenderer.DrawSprite(smudgeSprites[tr.smudge - 1],
Game.CellSize * (float2)location, 0);
Game.CellSize * (float2)location, "terrain");
}
var o = tr.overlay;
@@ -62,7 +62,7 @@ namespace OpenRa.Graphics
else if (Ore.overlayIsOre[o]) spriteIndex = map.MapTiles[x,y].density - 1;
else if (Ore.overlayIsGems[o]) spriteIndex = map.MapTiles[x,y].density - 1;
spriteRenderer.DrawSprite(sprites[spriteIndex],
Game.CellSize * (float2)location, PaletteType.Terrain);
Game.CellSize * (float2)location, "terrain");
}
}

View File

@@ -54,18 +54,18 @@ namespace OpenRa.Graphics
}
}
public void DrawSprite(Sprite s, float2 location, PaletteType palette)
public void DrawSprite(Sprite s, float2 location, string palette)
{
DrawSprite(s, location, palette, s.size);
}
public void DrawSprite(Sprite s, float2 location, PaletteType palette, float2 size)
public void DrawSprite(Sprite s, float2 location, string palette, float2 size)
{
if (s.sheet != currentSheet)
Flush();
currentSheet = s.sheet;
Util.FastCreateQuad(vertices, indices, location.ToInt2(), s, (int)palette, nv, ni, size);
Util.FastCreateQuad(vertices, indices, location.ToInt2(), s, Game.world.WorldRenderer.GetPaletteIndex(palette), nv, ni, size);
nv += 4; ni += 6;
if (++sprites >= spritesPerBatch)
Flush();

View File

@@ -15,7 +15,7 @@ namespace OpenRa.Graphics
Map map;
OverlayRenderer overlayRenderer;
public TerrainRenderer(World world, Renderer renderer)
public TerrainRenderer(World world, Renderer renderer, WorldRenderer wr)
{
this.renderer = renderer;
this.map = world.Map;
@@ -34,7 +34,9 @@ namespace OpenRa.Graphics
for( int i = map.XOffset ; i < map.XOffset + map.Width; i++ )
{
Sprite tile = tileMapping[map.MapTiles[i, j]];
Util.FastCreateQuad(vertices, indices, Game.CellSize * new float2(i, j), tile, (int)PaletteType.Terrain, nv, ni, tile.size);
//var bar = Game.world.WorldRenderer;
var foo = wr.GetPaletteIndex("terrain");
Util.FastCreateQuad(vertices, indices, Game.CellSize * new float2(i, j), tile, foo, nv, ni, tile.size);
nv += 4;
ni += 6;
}

View File

@@ -80,7 +80,7 @@ namespace OpenRa.Graphics
}
var c = Game.chrome.HitTest(mousePos) ? Cursor.Default : Game.controller.ChooseCursor( world );
cursorRenderer.DrawSprite(c.GetSprite((int)cursorFrame), mousePos + Location - c.GetHotspot(), 0);
cursorRenderer.DrawSprite(c.GetSprite((int)cursorFrame), mousePos + Location - c.GetHotspot(), "cursor");
cursorRenderer.Flush();
renderer.EndFrame();

View File

@@ -24,16 +24,29 @@ namespace OpenRa.Graphics
this.world = world;
this.renderer = renderer;
terrainRenderer = new TerrainRenderer(world, renderer);
terrainRenderer = new TerrainRenderer(world, renderer, this);
spriteRenderer = new SpriteRenderer(renderer, true);
lineRenderer = new LineRenderer(renderer);
uiOverlay = new UiOverlay(spriteRenderer);
palette = new HardwarePalette(renderer, world.Map);
Log.Write("Created worldrenderer");
}
// TODO: Implement
public int GetPaletteIndex(string name)
{
return 0;
}
public Palette GetPalette(string name)
{
return palette.GetPalette(name);
}
public void AddPalette(string name, Palette pal)
{
palette.AddPalette(pal);
palette.AddPalette(name, pal);
}
void DrawSpriteList(RectangleF rect,
@@ -229,7 +242,7 @@ namespace OpenRa.Graphics
var pipImages = new Animation("pips");
pipImages.PlayFetchIndex("groups", () => (int)group);
pipImages.Tick();
spriteRenderer.DrawSprite(pipImages.Image, basePosition + new float2(-8, 1), PaletteType.Chrome);
spriteRenderer.DrawSprite(pipImages.Image, basePosition + new float2(-8, 1), "chrome");
}
void DrawPips(Actor selectedUnit, float2 basePosition)
@@ -244,7 +257,7 @@ namespace OpenRa.Graphics
{
var pipImages = new Animation("pips");
pipImages.PlayRepeating(pipStrings[(int)pip]);
spriteRenderer.DrawSprite(pipImages.Image, pipxyBase + pipxyOffset, PaletteType.Chrome);
spriteRenderer.DrawSprite(pipImages.Image, pipxyBase + pipxyOffset, "chrome");
pipxyOffset += new float2(4, 0);
if (pipxyOffset.X+5 > selectedUnit.GetBounds(false).Width)
@@ -274,7 +287,7 @@ namespace OpenRa.Graphics
var tagImages = new Animation("pips");
tagImages.PlayRepeating(tagStrings[(int)tag]);
spriteRenderer.DrawSprite(tagImages.Image, tagxyBase + tagxyOffset, PaletteType.Chrome);
spriteRenderer.DrawSprite(tagImages.Image, tagxyBase + tagxyOffset, "chrome");
// Increment row
tagxyOffset.Y += 8;

View File

@@ -218,8 +218,11 @@
<Compile Include="Traits\LimitedAmmo.cs" />
<Compile Include="Traits\NukePower.cs" />
<Compile Include="Traits\PaletteFromFile.cs" />
<Compile Include="Traits\PaletteFromRemap.cs" />
<Compile Include="Traits\PaletteFromRGBA.cs" />
<Compile Include="Traits\Passenger.cs" />
<Compile Include="Traits\PlaceBuilding.cs" />
<Compile Include="Traits\ShroudPalette.cs" />
<Compile Include="Traits\SupportPower.cs" />
<Compile Include="Traits\ProvidesRadar.cs" />
<Compile Include="Traits\Repairable.cs" />

View File

@@ -5,6 +5,7 @@ using OpenRa.GameRules;
using OpenRa.Graphics;
using OpenRa.Traits;
using OpenRa.FileFormats;
using System.Drawing;
namespace OpenRa
{
@@ -13,7 +14,7 @@ namespace OpenRa
public class Player
{
public Actor PlayerActor;
public PaletteType Palette;
public string Palette;
public int Kills;
public string PlayerName;
public string InternalName;
@@ -27,7 +28,18 @@ namespace OpenRa
public int PowerDrained = 0;
public World World { get { return PlayerActor.World; } }
public Color Color;
/*
Color.FromArgb(228, 200, 112),
Color.FromArgb(56, 72, 125),
Color.FromArgb(238, 0, 0),
Color.FromArgb(198,97,0),
Color.FromArgb(28,109,97),
Color.FromArgb(153,76,53),
Color.FromArgb(76,101,60),
Color.FromArgb(133,113,101),
*/
public Shroud Shroud;
public Player( World world, int index, Session.Client client )
@@ -37,7 +49,7 @@ namespace OpenRa
this.Index = index;
this.InternalName = "Multi{0}".F(index);
this.Palette = client != null ? (PaletteType)client.Palette : (PaletteType)index;
this.Palette = client != null ? "player"+client.Palette : "player"+index;
this.PlayerName = client != null ? client.Name : "Player {0}".F(index+1);
this.Race = client != null ? (Race)client.Race : Race.Allies;
}
@@ -160,10 +172,10 @@ namespace OpenRa
Race = (Race)client.Race;
}
if (Palette != (PaletteType)client.Palette)
if (Palette != client.Palette)
{
Game.chat.AddLine(this, "has changed color to {0}".F((PaletteType)client.Palette));
Palette = (PaletteType)client.Palette;
Game.chat.AddLine(this, "has changed color to {0}".F(client.Palette));
Palette = client.Palette;
}
}
}

View File

@@ -173,21 +173,21 @@ namespace OpenRa
{
r.DrawSprite(sprites[starti,j],
Game.CellSize * new float2(starti, j),
PaletteType.Shroud,
"shroud",
new float2(Game.CellSize * (i - starti), Game.CellSize));
starti = i+1;
}
r.DrawSprite(sprites[i, j],
Game.CellSize * new float2(i, j),
PaletteType.Shroud);
"shroud");
starti = i+1;
}
if (starti < maxx)
r.DrawSprite(sprites[starti, j],
Game.CellSize * new float2(starti, j),
PaletteType.Shroud,
"shroud",
new float2(Game.CellSize * (maxx - starti), Game.CellSize));
}
}

View File

@@ -36,7 +36,7 @@ namespace OpenRa.Traits
public IEnumerable<Renderable> Render(Actor self)
{
foreach (var t in TileSprites[state])
yield return new Renderable(t.Value, Game.CellSize * t.Key, PaletteType.Gold);
yield return new Renderable(t.Value, Game.CellSize * t.Key, "terrain");
}
public int StateFromTemplate(TileTemplate t)

View File

@@ -125,7 +125,7 @@ namespace OpenRa.Traits
{
yield return a;
if (Disabled)
yield return a.WithPalette(PaletteType.Disabled);
yield return a.WithPalette("disabled");
}
}
}

View File

@@ -25,7 +25,7 @@ namespace OpenRa.Traits
{
if (remainingFrames == 0)
return;
/* TODO: FIX ME
var frac = (float)remainingFrames / chronoEffectLength;
for( var y = 0; y < (int)PaletteType.Chrome; y++ )
for (var x = 0; x < 256; x++)
@@ -35,6 +35,7 @@ namespace OpenRa.Traits
var desat = Color.FromArgb(orig.A, lum, lum, lum);
b.SetPixel(x, y, Graphics.Util.Lerp(frac, orig, desat));
}
*/
}
}
}

View File

@@ -31,7 +31,7 @@ namespace OpenRa.Traits
return rs;
if (self.Owner == self.World.LocalPlayer)
return rs.Select(a => a.WithPalette(PaletteType.Shadow));
return rs.Select(a => a.WithPalette("shadow"));
else
return new Renderable[] { };
}

View File

@@ -7,10 +7,9 @@ namespace OpenRa.Traits
{
class PaletteFromFileInfo : ITraitInfo
{
public readonly string Name = "Undefined";
public readonly string Theatre = "Undefined";
public readonly string Filename = "";
public readonly string Remap = "";
public readonly string Name = null;
public readonly string Theatre = null;
public readonly string Filename = null;
public object Create(Actor self) { return new PaletteFromFile(self, this); }
}
@@ -18,11 +17,11 @@ namespace OpenRa.Traits
{
public PaletteFromFile(Actor self, PaletteFromFileInfo info)
{
Log.Write("Created palette");
if (info.Theatre == "Undefined" ||
if (info.Theatre == null ||
info.Theatre.ToLowerInvariant() == self.World.Map.Theater.ToLowerInvariant())
{
self.World.WorldRenderer.AddPalette(info.Name, new Palette(FileSystem.Open("temperat_ra.pal")));
Log.Write("Loading palette {0} from file {1}", info.Name, info.Filename);
self.World.WorldRenderer.AddPalette(info.Name, new Palette(FileSystem.Open(info.Filename)));
}
}
}

View File

@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;
using OpenRa.FileFormats;
namespace OpenRa.Traits
{
class PaletteFromRGBAInfo : ITraitInfo
{
public readonly string Name = null;
public readonly string Theatre = null;
public readonly int R = 0;
public readonly int G = 0;
public readonly int B = 0;
public readonly int A = 255;
public object Create(Actor self) { return new PaletteFromRGBA(self, this); }
}
class PaletteFromRGBA
{
public PaletteFromRGBA(Actor self, PaletteFromRGBAInfo info)
{
if (info.Theatre == null ||
info.Theatre.ToLowerInvariant() == self.World.Map.Theater.ToLowerInvariant())
{
Log.Write("Loading palette {0} from RGBA {1} {2} {3} {4}",info.Name,info.R,info.G,info.B,info.A);
// TODO: This shouldn't rely on a base palette
var wr = self.World.WorldRenderer;
var pal = wr.GetPalette("player0");
wr.AddPalette(info.Name, new Palette(pal, new SingleColorRemap(Color.FromArgb(info.A, info.R, info.G, info.B))));
}
}
}
}

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using OpenRa.FileFormats;
namespace OpenRa.Traits
{
class PaletteFromRemapInfo : ITraitInfo
{
public readonly string Name = null;
public readonly string Theatre = null;
public readonly string BasePalette = null;
public readonly string Remap = null;
public object Create(Actor self) { return new PaletteFromRemap(self, this); }
}
class PaletteFromRemap
{
public PaletteFromRemap(Actor self, PaletteFromRemapInfo info)
{
if (info.Theatre == null ||
info.Theatre.ToLowerInvariant() == self.World.Map.Theater.ToLowerInvariant())
{
Log.Write("Loading palette {0} from theatre {1} with remap {2}", info.Name, info.BasePalette, info.Remap);
var wr = self.World.WorldRenderer;
var pal = wr.GetPalette(info.BasePalette);
var newpal = (info.Remap == null) ? pal : new Palette(pal, new PlayerColorRemap(FileSystem.Open(info.Remap)));
wr.AddPalette(info.Name, newpal);
}
}
}
}

View File

@@ -34,7 +34,7 @@ namespace OpenRa.Traits
return rs;
if (self.Owner == self.World.LocalPlayer)
return rs.Select(a => a.WithPalette(PaletteType.Shadow));
return rs.Select(a => a.WithPalette("shadow"));
else
return new Renderable[] { };
}

View File

@@ -71,10 +71,10 @@ namespace OpenRa.Traits
{
public readonly Sprite Sprite;
public readonly float2 Pos;
public readonly PaletteType Palette;
public readonly string Palette;
public readonly int ZOffset;
public Renderable(Sprite sprite, float2 pos, PaletteType palette, int zOffset)
public Renderable(Sprite sprite, float2 pos, string palette, int zOffset)
{
Sprite = sprite;
Pos = pos;
@@ -82,10 +82,10 @@ namespace OpenRa.Traits
ZOffset = zOffset;
}
public Renderable(Sprite sprite, float2 pos, PaletteType palette)
public Renderable(Sprite sprite, float2 pos, string palette)
: this(sprite, pos, palette, 0) { }
public Renderable WithPalette(PaletteType newPalette) { return new Renderable(Sprite, Pos, newPalette, ZOffset); }
public Renderable WithPalette(string newPalette) { return new Renderable(Sprite, Pos, newPalette, ZOffset); }
public Renderable WithZOffset(int newOffset) { return new Renderable(Sprite, Pos, Palette, newOffset); }
public Renderable WithPos(float2 newPos) { return new Renderable(Sprite, newPos, Palette, ZOffset); }
}

View File

@@ -120,7 +120,7 @@ namespace OpenRa.Traits
public static Renderable Centered(Actor self, Sprite s, float2 location)
{
var pal = self.Owner == null ? 0 : self.Owner.Palette;
var pal = self.Owner == null ? "player0" : self.Owner.Palette;
var loc = location - 0.5f * s.size;
return new Renderable(s, loc.Round(), pal);
}

View File

@@ -14,7 +14,7 @@ namespace OpenRa.Traits
{
var unit = self.traits.Get<Unit>();
var shadowSprites = r.Select(a => a.WithPalette(PaletteType.Shadow));
var shadowSprites = r.Select(a => a.WithPalette("shadow"));
var flyingSprites = (unit.Altitude <= 0) ? r
: r.Select(a => a.WithPos(a.Pos - new float2(0, unit.Altitude)).WithZOffset(3));

View File

@@ -39,7 +39,7 @@ namespace OpenRa
for (var j = 0; j < 128; j++)
for (var i = 0; i < 128; i++)
if (world.WorldActor.traits.Get<UnitInfluence>().GetUnitsAt(new int2(i, j)).Any())
spriteRenderer.DrawSprite(unitDebug, Game.CellSize * new float2(i, j), 0);
spriteRenderer.DrawSprite(unitDebug, Game.CellSize * new float2(i, j), "terrain");
}
public void DrawBuildingGrid( World world, string name, BuildingInfo bi )
@@ -51,7 +51,7 @@ namespace OpenRa
foreach( var t in Footprint.Tiles( name, bi, topLeft ) )
spriteRenderer.DrawSprite( ( isCloseEnough && world.IsCellBuildable( t, bi.WaterBound
? UnitMovementType.Float : UnitMovementType.Wheel ) && !world.Map.ContainsResource( t ) )
? buildOk : buildBlocked, Game.CellSize * t, 0 );
? buildOk : buildBlocked, Game.CellSize * t, "terrain" );
spriteRenderer.Flush();
}

View File

@@ -26,7 +26,7 @@ namespace OpenRa.Mods.RA.Effects
public IEnumerable<Renderable> Render()
{
yield return new Renderable(anim.Image,
a.CenterLocation - .5f * anim.Image.size + doorOffset, PaletteType.Gold);
a.CenterLocation - .5f * anim.Image.size + doorOffset, "effect");
}
}
}

View File

@@ -28,7 +28,7 @@ namespace OpenRa.Mods.RA.Effects
public IEnumerable<Renderable> Render()
{
yield return new Renderable(anim.Image,offset, PaletteType.Gold);
yield return new Renderable(anim.Image,offset, "effect");
}
}
}

View File

@@ -25,7 +25,7 @@ namespace OpenRa.Mods.RA.Effects
public IEnumerable<Renderable> Render()
{
foreach (var r in a.Render())
yield return r.WithPalette(PaletteType.Invuln);
yield return r.WithPalette("invuln");
}
}
}

View File

@@ -54,7 +54,7 @@ namespace OpenRa.Mods.RA.Effects
public IEnumerable<Renderable> Render()
{
var pos = location - new float2(0, altitude);
yield return new Renderable(anim.Image, location - .5f * anim.Image.size, PaletteType.Shadow, 0);
yield return new Renderable(anim.Image, location - .5f * anim.Image.size, "shadow", 0);
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, owner.Palette, 2);
yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size, owner.Palette, 3);
}

View File

@@ -32,7 +32,7 @@ namespace OpenRa.Mods.RA.Effects
public IEnumerable<Renderable> Render()
{
yield return new Renderable(doors.Image,
a.CenterLocation - .5f * doors.Image.size + doorOffset, PaletteType.Gold);
a.CenterLocation - .5f * doors.Image.size + doorOffset, "effect");
}
}
}

View File

@@ -14,7 +14,75 @@ World:
WaterPaletteRotation:
BuildingInfluence:
UnitInfluence:
PaletteFromFile@1:
PaletteFromFile@terrain_temperat:
Name: terrain
Filename: temperat_ra.pal
PaletteFromFile@player_temperat:
Name: player
Theatre: temperat
Filename: temperat_ra.pal
Filename: temperat.pal
PaletteFromRemap@player0:
Name: player0
BasePalette: player
PaletteFromRemap@player1:
Name: player1
BasePalette: player
Remap: blue.rem
PaletteFromRemap@player2:
Name: player2
BasePalette: player
Remap: red.rem
PaletteFromRemap@player3:
Name: player3
BasePalette: player
Remap: orange.rem
PaletteFromRemap@player4:
Name: player4
BasePalette: player
Remap: teal.rem
PaletteFromRemap@player5:
Name: player5
BasePalette: player
Remap: salmon.rem
PaletteFromRemap@player6:
Name: player6
BasePalette: player
Remap: green.rem
PaletteFromRemap@player7:
Name: player7
BasePalette: player
Remap: gray.rem
PaletteFromFile@chrome:
Name: chrome
Filename: temperat.pal
PaletteFromFile@effect:
Name: effect
Filename: temperat.pal
PaletteFromFile@cursor:
Name: cursor
Filename: temperat.pal
PaletteFromRGBA@shadow:
Name: shadow
R: 0
G: 0
B: 0
A: 140
PaletteFromRGBA@highlight:
Name: highlight
R: 255
G: 255
B: 255
A: 128
PaletteFromRGBA@invuln:
Name: invuln
R: 128
G: 0
B: 0
A: 128
PaletteFromRGBA@disabled:
Name: disabled
R: 0
G: 0
B: 0
A: 180
ShroudPalette: