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"); throw new InvalidOperationException("Already got 8 players");
} }
static int ChooseFreePalette() static string ChooseFreePalette()
{ {
// TODO: FIX
for (var i = 0; i < 8; i++) for (var i = 0; i < 8; i++)
if (lobbyInfo.Clients.All(c => c.Palette != i)) //if (lobbyInfo.Clients.All(c => c.Palette != i))
return i; return "player"+i;
throw new InvalidOperationException("No free palettes"); 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" ); SendChatTo( conn, "You can't change your color after the game has started" );
return true; return true;
} }
int pali;
int pal;
if (!int.TryParse(s, out pal) || pal < 0 || pal > 7) if (!int.TryParse(s, out pali) || pali < 0 || pali > 7)
{ {
Console.WriteLine("Invalid palette: {0}", s); Console.WriteLine("Invalid palette: {0}", s);
return false; return false;
} }
string pal = "player"+pali;
if (lobbyInfo.Clients.Where( c => c != GetClient(conn) ).Any( c => c.Palette == pal )) 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" ); 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 class Client
{ {
public int Index; public int Index;
public int Palette; public string Palette;
public int Race; public int Race;
// public int SpawnPoint; // public int SpawnPoint;
public string Name; public string Name;

View File

@@ -39,21 +39,9 @@ namespace OpenRa
typing += c; 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) 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) public void AddLine(Color c, string from, string text)

View File

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

View File

@@ -98,14 +98,14 @@ namespace OpenRa.Effects
if (Projectile.High || Projectile.Arcing) if (Projectile.High || Projectile.Arcing)
{ {
if (Projectile.Shadow) 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)); 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); yield return new Renderable(anim.Image, highPos - .5f * anim.Image.size, Owner.Palette);
} }
else 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() 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; } } public Player Owner { get { return null; } }

View File

@@ -29,7 +29,7 @@ namespace OpenRa.Effects
{ {
if (remainingTicks % 2 == 0) if (remainingTicks % 2 == 0)
foreach (var r in target.Render()) 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() 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() 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() public IEnumerable<Renderable> Render()
{ {
yield return new Renderable(anim.Image, 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() 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; var y = d.Y;
while( y >= 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; prev.Y += 8;
} }
} }
@@ -58,26 +58,26 @@ namespace OpenRa.Effects
var y = i * d.Y / d.X; var y = i * d.Y / d.X;
if( y <= prev.Y - 8 ) 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; prev.Y -= 8;
while( y <= 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; prev.Y -= 8;
} }
} }
else if( y >= 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; prev.Y += 8;
while( y >= 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; prev.Y += 8;
} }
} }
else 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; prev.X += 8;
} }

View File

@@ -2,45 +2,42 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using OpenRa.FileFormats; using OpenRa.FileFormats;
using OpenRa.Traits; using OpenRa.Traits;
using System;
namespace OpenRa.Graphics namespace OpenRa.Graphics
{ {
public enum PaletteType
{
Gold, Blue, Red, Orange, Teal, Salmon, Green, Gray,
Shadow, Invuln, Disabled, Highlight, Shroud, Chrome,
Terrain
};
class HardwarePalette : Sheet class HardwarePalette : Sheet
{ {
const int maxEntries = 16; const int maxEntries = 32;
int allocated = 0; 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) public HardwarePalette(Renderer renderer, Map map)
: base(renderer,new Size(256, maxEntries)) : base(renderer,new Size(256, maxEntries))
{ {
palettes = new Dictionary<string, Palette>();
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)
} }
public Palette GetPalette(string name)
public int AddPalette(Palette p)
{ {
for (int i = 0; i < 256; i++) try { return palettes[name]; }
this[new Point(i, allocated)] = p.GetColor(i); 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++; return allocated++;
} }

View File

@@ -35,7 +35,6 @@ namespace OpenRa.Graphics
sprite = new Sprite(sheet, rect, TextureChannel.Alpha); sprite = new Sprite(sheet, rect, TextureChannel.Alpha);
mapOnlySprite = new Sprite(mapOnlySheet, 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); shroudColor = Color.FromArgb(alpha, Color.Black);
} }
@@ -58,7 +57,6 @@ namespace OpenRa.Graphics
.Select(a => Color.FromArgb(alpha, pal.GetColor(a))).ToArray(); .Select(a => Color.FromArgb(alpha, pal.GetColor(a))).ToArray();
}); });
Color[] playerColors;
static Color shroudColor; static Color shroudColor;
public void InvalidateOre() { oreLayer = null; } public void InvalidateOre() { oreLayer = null; }
@@ -107,7 +105,7 @@ namespace OpenRa.Graphics
foreach (var a in world.Queries.WithTrait<Unit>()) foreach (var a in world.Queries.WithTrait<Unit>())
*(c + (a.Actor.Location.Y * bitmapData.Stride >> 2) + a.Actor.Location.X) = *(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 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++) 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)); var b = world.WorldActor.traits.Get<BuildingInfluence>().GetBuildingAt(new int2(x, y));
if (b != null) if (b != null)
*(c + (y * bitmapData.Stride >> 2) + x) = *(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) public void Draw(RectangleF rect, bool mapOnly)
{ {
rgbaRenderer.DrawSprite(mapOnly ? mapOnlySprite : sprite, 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(); rgbaRenderer.Flush();
} }
} }

View File

@@ -49,7 +49,7 @@ namespace OpenRa.Graphics
{ {
var location = new int2(x, y); var location = new int2(x, y);
spriteRenderer.DrawSprite(smudgeSprites[tr.smudge - 1], spriteRenderer.DrawSprite(smudgeSprites[tr.smudge - 1],
Game.CellSize * (float2)location, 0); Game.CellSize * (float2)location, "terrain");
} }
var o = tr.overlay; 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.overlayIsOre[o]) spriteIndex = map.MapTiles[x,y].density - 1;
else if (Ore.overlayIsGems[o]) spriteIndex = map.MapTiles[x,y].density - 1; else if (Ore.overlayIsGems[o]) spriteIndex = map.MapTiles[x,y].density - 1;
spriteRenderer.DrawSprite(sprites[spriteIndex], 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); 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) if (s.sheet != currentSheet)
Flush(); Flush();
currentSheet = s.sheet; 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; nv += 4; ni += 6;
if (++sprites >= spritesPerBatch) if (++sprites >= spritesPerBatch)
Flush(); Flush();

View File

@@ -15,7 +15,7 @@ namespace OpenRa.Graphics
Map map; Map map;
OverlayRenderer overlayRenderer; OverlayRenderer overlayRenderer;
public TerrainRenderer(World world, Renderer renderer) public TerrainRenderer(World world, Renderer renderer, WorldRenderer wr)
{ {
this.renderer = renderer; this.renderer = renderer;
this.map = world.Map; this.map = world.Map;
@@ -34,7 +34,9 @@ namespace OpenRa.Graphics
for( int i = map.XOffset ; i < map.XOffset + map.Width; i++ ) for( int i = map.XOffset ; i < map.XOffset + map.Width; i++ )
{ {
Sprite tile = tileMapping[map.MapTiles[i, j]]; 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; nv += 4;
ni += 6; ni += 6;
} }

View File

@@ -80,7 +80,7 @@ namespace OpenRa.Graphics
} }
var c = Game.chrome.HitTest(mousePos) ? Cursor.Default : Game.controller.ChooseCursor( world ); 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(); cursorRenderer.Flush();
renderer.EndFrame(); renderer.EndFrame();

View File

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

View File

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

View File

@@ -5,6 +5,7 @@ using OpenRa.GameRules;
using OpenRa.Graphics; using OpenRa.Graphics;
using OpenRa.Traits; using OpenRa.Traits;
using OpenRa.FileFormats; using OpenRa.FileFormats;
using System.Drawing;
namespace OpenRa namespace OpenRa
{ {
@@ -13,7 +14,7 @@ namespace OpenRa
public class Player public class Player
{ {
public Actor PlayerActor; public Actor PlayerActor;
public PaletteType Palette; public string Palette;
public int Kills; public int Kills;
public string PlayerName; public string PlayerName;
public string InternalName; public string InternalName;
@@ -27,7 +28,18 @@ namespace OpenRa
public int PowerDrained = 0; public int PowerDrained = 0;
public World World { get { return PlayerActor.World; } } 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 Shroud Shroud;
public Player( World world, int index, Session.Client client ) public Player( World world, int index, Session.Client client )
@@ -37,7 +49,7 @@ namespace OpenRa
this.Index = index; this.Index = index;
this.InternalName = "Multi{0}".F(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.PlayerName = client != null ? client.Name : "Player {0}".F(index+1);
this.Race = client != null ? (Race)client.Race : Race.Allies; this.Race = client != null ? (Race)client.Race : Race.Allies;
} }
@@ -160,10 +172,10 @@ namespace OpenRa
Race = (Race)client.Race; 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)); Game.chat.AddLine(this, "has changed color to {0}".F(client.Palette));
Palette = (PaletteType)client.Palette; Palette = client.Palette;
} }
} }
} }

View File

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

View File

@@ -36,7 +36,7 @@ namespace OpenRa.Traits
public IEnumerable<Renderable> Render(Actor self) public IEnumerable<Renderable> Render(Actor self)
{ {
foreach (var t in TileSprites[state]) 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) public int StateFromTemplate(TileTemplate t)

View File

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

View File

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

View File

@@ -7,10 +7,9 @@ namespace OpenRa.Traits
{ {
class PaletteFromFileInfo : ITraitInfo class PaletteFromFileInfo : ITraitInfo
{ {
public readonly string Name = "Undefined"; public readonly string Name = null;
public readonly string Theatre = "Undefined"; public readonly string Theatre = null;
public readonly string Filename = ""; public readonly string Filename = null;
public readonly string Remap = "";
public object Create(Actor self) { return new PaletteFromFile(self, this); } public object Create(Actor self) { return new PaletteFromFile(self, this); }
} }
@@ -18,11 +17,11 @@ namespace OpenRa.Traits
{ {
public PaletteFromFile(Actor self, PaletteFromFileInfo info) public PaletteFromFile(Actor self, PaletteFromFileInfo info)
{ {
Log.Write("Created palette"); if (info.Theatre == null ||
if (info.Theatre == "Undefined" ||
info.Theatre.ToLowerInvariant() == self.World.Map.Theater.ToLowerInvariant()) 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; return rs;
if (self.Owner == self.World.LocalPlayer) if (self.Owner == self.World.LocalPlayer)
return rs.Select(a => a.WithPalette(PaletteType.Shadow)); return rs.Select(a => a.WithPalette("shadow"));
else else
return new Renderable[] { }; return new Renderable[] { };
} }

View File

@@ -71,10 +71,10 @@ namespace OpenRa.Traits
{ {
public readonly Sprite Sprite; public readonly Sprite Sprite;
public readonly float2 Pos; public readonly float2 Pos;
public readonly PaletteType Palette; public readonly string Palette;
public readonly int ZOffset; 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; Sprite = sprite;
Pos = pos; Pos = pos;
@@ -82,10 +82,10 @@ namespace OpenRa.Traits
ZOffset = zOffset; ZOffset = zOffset;
} }
public Renderable(Sprite sprite, float2 pos, PaletteType palette) public Renderable(Sprite sprite, float2 pos, string palette)
: this(sprite, pos, palette, 0) { } : 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 WithZOffset(int newOffset) { return new Renderable(Sprite, Pos, Palette, newOffset); }
public Renderable WithPos(float2 newPos) { return new Renderable(Sprite, newPos, Palette, ZOffset); } 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) 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; var loc = location - 0.5f * s.size;
return new Renderable(s, loc.Round(), pal); return new Renderable(s, loc.Round(), pal);
} }

View File

@@ -14,7 +14,7 @@ namespace OpenRa.Traits
{ {
var unit = self.traits.Get<Unit>(); 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 var flyingSprites = (unit.Altitude <= 0) ? r
: r.Select(a => a.WithPos(a.Pos - new float2(0, unit.Altitude)).WithZOffset(3)); : 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 j = 0; j < 128; j++)
for (var i = 0; i < 128; i++) for (var i = 0; i < 128; i++)
if (world.WorldActor.traits.Get<UnitInfluence>().GetUnitsAt(new int2(i, j)).Any()) 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 ) public void DrawBuildingGrid( World world, string name, BuildingInfo bi )
@@ -51,7 +51,7 @@ namespace OpenRa
foreach( var t in Footprint.Tiles( name, bi, topLeft ) ) foreach( var t in Footprint.Tiles( name, bi, topLeft ) )
spriteRenderer.DrawSprite( ( isCloseEnough && world.IsCellBuildable( t, bi.WaterBound spriteRenderer.DrawSprite( ( isCloseEnough && world.IsCellBuildable( t, bi.WaterBound
? UnitMovementType.Float : UnitMovementType.Wheel ) && !world.Map.ContainsResource( t ) ) ? UnitMovementType.Float : UnitMovementType.Wheel ) && !world.Map.ContainsResource( t ) )
? buildOk : buildBlocked, Game.CellSize * t, 0 ); ? buildOk : buildBlocked, Game.CellSize * t, "terrain" );
spriteRenderer.Flush(); spriteRenderer.Flush();
} }

View File

@@ -26,7 +26,7 @@ namespace OpenRa.Mods.RA.Effects
public IEnumerable<Renderable> Render() public IEnumerable<Renderable> Render()
{ {
yield return new Renderable(anim.Image, 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() 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() public IEnumerable<Renderable> Render()
{ {
foreach (var r in a.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() public IEnumerable<Renderable> Render()
{ {
var pos = location - new float2(0, altitude); 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(anim.Image, pos - .5f * anim.Image.size, owner.Palette, 2);
yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size, owner.Palette, 3); 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() public IEnumerable<Renderable> Render()
{ {
yield return new Renderable(doors.Image, 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: WaterPaletteRotation:
BuildingInfluence: BuildingInfluence:
UnitInfluence: UnitInfluence:
PaletteFromFile@1: PaletteFromFile@terrain_temperat:
Name: terrain Name: terrain
Filename: temperat_ra.pal
PaletteFromFile@player_temperat:
Name: player
Theatre: temperat 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: