Shift player palette definitions onto the player/client. Needs ui; for now everyone is teal.

This commit is contained in:
Paul Chote
2010-07-16 20:51:20 +12:00
parent 84ac8d9d16
commit 8abc8e03cb
11 changed files with 54 additions and 144 deletions

View File

@@ -20,9 +20,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
namespace OpenRA.FileFormats namespace OpenRA.FileFormats
{ {
public static class FieldLoader public static class FieldLoader
@@ -102,13 +102,14 @@ namespace OpenRA.FileFormats
else if (fieldType == typeof(string)) else if (fieldType == typeof(string))
return x; return x;
else if (fieldType == typeof(System.Drawing.Color)) else if (fieldType == typeof(Color))
{ {
var parts = x.Split(','); var parts = x.Split(',');
if (parts.Length != 3) if (parts.Length == 3)
return InvalidValueAction(x,fieldType, field); return Color.FromArgb(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]));
if (parts.Length == 4)
return System.Drawing.Color.FromArgb(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2])); return Color.FromArgb(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3]));
return InvalidValueAction(x,fieldType, field);
} }
else if (fieldType.IsEnum) else if (fieldType.IsEnum)
@@ -183,6 +184,13 @@ namespace OpenRA.FileFormats
if (v == null) if (v == null)
return ""; return "";
// Color.ToString() does the wrong thing; force it to format as an array
if (f.FieldType == typeof(Color))
{
var c = (Color)v;
return "{0},{1},{2},{3}".F(c.A,c.R,c.G,c.B);
}
return f.FieldType.IsArray return f.FieldType.IsArray
? string.Join(",", ((Array)v).OfType<object>().Select(a => a.ToString()).ToArray()) ? string.Join(",", ((Array)v).OfType<object>().Select(a => a.ToString()).ToArray())
: v.ToString(); : v.ToString();

View File

@@ -37,7 +37,7 @@ namespace OpenRA.FileFormats
public class Client public class Client
{ {
public int Index; public int Index;
public int PaletteIndex; public System.Drawing.Color Color;
public string Country; public string Country;
public int SpawnPoint; public int SpawnPoint;
public string Name; public string Name;

View File

@@ -65,6 +65,8 @@ namespace OpenRA.Graphics
public void AddPalette(string name, Palette pal) public void AddPalette(string name, Palette pal)
{ {
System.Console.WriteLine("Registering Palette "+name);
palette.AddPalette(name, pal); palette.AddPalette(name, pal);
} }

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Network
{ {
var client = Game.LobbyInfo.Clients.FirstOrDefault(c => c.Index == clientId); var client = Game.LobbyInfo.Clients.FirstOrDefault(c => c.Index == clientId);
if (client != null) if (client != null)
Game.AddChatLine(Game.world.PlayerColors()[client.PaletteIndex].Color, Game.AddChatLine(client.Color,
client.Name, order.TargetString); client.Name, order.TargetString);
break; break;
} }
@@ -49,7 +49,7 @@ namespace OpenRA.Network
client == Game.LocalClient || (client.Team == Game.LocalClient.Team && client.Team != 0); client == Game.LocalClient || (client.Team == Game.LocalClient.Team && client.Team != 0);
if (isAlly) if (isAlly)
Game.AddChatLine(Game.world.PlayerColors()[client.PaletteIndex].Color, client.Name + " (Team)", order.TargetString); Game.AddChatLine(client.Color, client.Name + " (Team)", order.TargetString);
} }
break; break;
} }

View File

@@ -36,7 +36,8 @@ namespace OpenRA
public readonly string Palette; public readonly string Palette;
public readonly Color Color; public readonly Color Color;
public readonly Color Color2;
public readonly string PlayerName; public readonly string PlayerName;
public readonly string InternalName; public readonly string InternalName;
public readonly CountryInfo Country; public readonly CountryInfo Country;
@@ -52,14 +53,18 @@ namespace OpenRA
Shroud = new ShroudRenderer(this, world.Map); Shroud = new ShroudRenderer(this, world.Map);
PlayerActor = world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this); PlayerActor = world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this);
Index = index; Index = index;
Palette = pr.Palette; Palette = "player"+index;
Color = world.PlayerColors().Where(c => c.Name == pr.Palette).FirstOrDefault().Color; Color = Util.ArrayToColor(new int[] {93,194,165});
Color2 = Util.ArrayToColor(new int[] {0,32,32});
PlayerName = InternalName = pr.Name; PlayerName = InternalName = pr.Name;
NonCombatant = pr.NonCombatant; NonCombatant = pr.NonCombatant;
Country = world.GetCountries() Country = world.GetCountries()
.FirstOrDefault(c => pr.Race == c.Race); .FirstOrDefault(c => pr.Race == c.Race);
RegisterPlayerColor(world, Palette);
} }
public Player( World world, Session.Client client ) public Player( World world, Session.Client client )
@@ -70,15 +75,26 @@ namespace OpenRA
PlayerActor = world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this); PlayerActor = world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this);
Index = client.Index; Index = client.Index;
Palette = world.PlayerColors()[client.PaletteIndex % world.PlayerColors().Count()].Name; Palette = "player"+client.Index;
Color = world.PlayerColors()[client.PaletteIndex % world.PlayerColors().Count()].Color; Color = Util.ArrayToColor(new int[] {93,194,165});
Color2 = Util.ArrayToColor(new int[] {0,32,32});
PlayerName = client.Name; PlayerName = client.Name;
InternalName = "Multi{0}".F(client.Index); InternalName = "Multi{0}".F(client.Index);
Country = world.GetCountries() Country = world.GetCountries()
.FirstOrDefault(c => client != null && client.Country == c.Race) .FirstOrDefault(c => client != null && client.Country == c.Race)
?? world.GetCountries().Random(world.SharedRandom); ?? world.GetCountries().Random(world.SharedRandom);
RegisterPlayerColor(world, Palette);
} }
public void RegisterPlayerColor(World world, string palette)
{
var info = Rules.Info["world"].Traits.Get<PlayerColorPaletteInfo>();
var newpal = new Palette(world.WorldRenderer.GetPalette(info.BasePalette),
new PlayerColorRemap(Color, Color2, info.SplitRamp));
world.WorldRenderer.AddPalette(palette, newpal);
}
public void GiveAdvice(string advice) public void GiveAdvice(string advice)
{ {
// todo: store the condition or something. // todo: store the condition or something.

View File

@@ -148,7 +148,7 @@ namespace OpenRA.Server
new Session.Client() new Session.Client()
{ {
Index = newConn.PlayerIndex, Index = newConn.PlayerIndex,
PaletteIndex = ChooseFreePalette(), Color = System.Drawing.Color.FromArgb(93,194,165),
Name = "Player {0}".F(1 + newConn.PlayerIndex), Name = "Player {0}".F(1 + newConn.PlayerIndex),
Country = "random", Country = "random",
State = Session.ClientState.NotReady, State = Session.ClientState.NotReady,
@@ -323,6 +323,8 @@ namespace OpenRA.Server
{ "pal", { "pal",
s => s =>
{ {
return true;
/*
int pali; int pali;
if (!int.TryParse(s, out pali)) if (!int.TryParse(s, out pali))
@@ -340,6 +342,7 @@ namespace OpenRA.Server
GetClient(conn).PaletteIndex = pali; GetClient(conn).PaletteIndex = pali;
SyncLobbyInfo(); SyncLobbyInfo();
return true; return true;
*/
}}, }},
{ "map", { "map",
s => s =>

View File

@@ -23,38 +23,11 @@ using OpenRA.FileFormats;
namespace OpenRA.Traits namespace OpenRA.Traits
{ {
public class PlayerColorPaletteInfo : ITraitInfo public class PlayerColorPaletteInfo : TraitInfo<PlayerColorPalette>
{ {
public readonly string Name = null;
public readonly string DisplayName = null;
public readonly string BasePalette = null; public readonly string BasePalette = null;
public readonly int[] Color1 = { 255, 255, 255 };
public readonly int[] Color2 = { 0, 0, 0 };
public readonly bool SplitRamp = false; public readonly bool SplitRamp = false;
public readonly int[] DisplayColor = null;
public readonly bool Playable = true;
public object Create(ActorInitializer init) { return new PlayerColorPalette(init.world, this); }
public Color Color { get { return Util.ArrayToColor(DisplayColor); } }
} }
public class PlayerColorPalette public class PlayerColorPalette {}
{
public PlayerColorPalette(World world, PlayerColorPaletteInfo info)
{
var wr = world.WorldRenderer;
var pal = wr.GetPalette(info.BasePalette);
var newpal = new Palette(pal, new PlayerColorRemap(
Util.ArrayToColor(info.Color1),
Util.ArrayToColor(info.Color2),
info.SplitRamp));
wr.AddPalette(info.Name, newpal);
}
}
} }

View File

@@ -58,7 +58,6 @@ namespace OpenRA.Widgets.Delegates
mapPreview.SpawnColors = () => mapPreview.SpawnColors = () =>
{ {
var spawns = Map.SpawnPoints; var spawns = Map.SpawnPoints;
var playerColors = Game.world.PlayerColors();
var sc = new Dictionary<int2, Color>(); var sc = new Dictionary<int2, Color>();
for (int i = 1; i <= spawns.Count(); i++) for (int i = 1; i <= spawns.Count(); i++)
@@ -66,7 +65,7 @@ namespace OpenRA.Widgets.Delegates
var client = Game.LobbyInfo.Clients.FirstOrDefault(c => c.SpawnPoint == i); var client = Game.LobbyInfo.Clients.FirstOrDefault(c => c.SpawnPoint == i);
if (client == null) if (client == null)
continue; continue;
sc.Add(spawns.ElementAt(i - 1), playerColors[client.PaletteIndex % playerColors.Count()].Color); sc.Add(spawns.ElementAt(i - 1), client.Color);
} }
return sc; return sc;
}; };
@@ -170,10 +169,10 @@ namespace OpenRA.Widgets.Delegates
name.OnLoseFocus = () => name.OnEnterKey(); name.OnLoseFocus = () => name.OnEnterKey();
var color = template.GetWidget<ButtonWidget>("COLOR"); var color = template.GetWidget<ButtonWidget>("COLOR");
color.OnMouseUp = CyclePalette; //color.OnMouseUp = CyclePalette;
var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK"); var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK");
colorBlock.GetColor = () => Game.world.PlayerColors()[c.PaletteIndex % Game.world.PlayerColors().Count].Color; colorBlock.GetColor = () => c.Color;
var faction = template.GetWidget<ButtonWidget>("FACTION"); var faction = template.GetWidget<ButtonWidget>("FACTION");
faction.OnMouseUp = CycleRace; faction.OnMouseUp = CycleRace;
@@ -196,7 +195,7 @@ namespace OpenRA.Widgets.Delegates
template = RemotePlayerTemplate.Clone(); template = RemotePlayerTemplate.Clone();
template.GetWidget<LabelWidget>("NAME").GetText = () => c.Name; template.GetWidget<LabelWidget>("NAME").GetText = () => c.Name;
var color = template.GetWidget<ColorBlockWidget>("COLOR"); var color = template.GetWidget<ColorBlockWidget>("COLOR");
color.GetColor = () => Game.world.PlayerColors()[c.PaletteIndex % Game.world.PlayerColors().Count].Color; color.GetColor = () => c.Color;
var faction = template.GetWidget<LabelWidget>("FACTION"); var faction = template.GetWidget<LabelWidget>("FACTION");
var factionname = faction.GetWidget<LabelWidget>("FACTIONNAME"); var factionname = faction.GetWidget<LabelWidget>("FACTIONNAME");
@@ -224,24 +223,7 @@ namespace OpenRA.Widgets.Delegates
} }
} }
bool PaletteAvailable(int index) { return Game.LobbyInfo.Clients.All(c => c.PaletteIndex != index) && Game.world.PlayerColors()[index % Game.world.PlayerColors().Count].Playable; }
bool SpawnPointAvailable(int index) { return (index == 0) || Game.LobbyInfo.Clients.All(c => c.SpawnPoint != index); } bool SpawnPointAvailable(int index) { return (index == 0) || Game.LobbyInfo.Clients.All(c => c.SpawnPoint != index); }
bool CyclePalette(MouseInput mi)
{
var d = (mi.Button == MouseButton.Left) ? +1 : Game.world.PlayerColors().Count() - 1;
var newIndex = ((int)Game.LocalClient.PaletteIndex + d) % Game.world.PlayerColors().Count();
while (!PaletteAvailable(newIndex) && newIndex != (int)Game.LocalClient.PaletteIndex)
newIndex = (newIndex + d) % Game.world.PlayerColors().Count();
Game.IssueOrder(
Order.Command("pal " + newIndex));
return true;
}
bool CycleRace(MouseInput mi) bool CycleRace(MouseInput mi)
{ {
var countries = CountryNames.Select(a => a.Key); var countries = CountryNames.Select(a => a.Key);

View File

@@ -210,11 +210,6 @@ namespace OpenRA
return new float2(Gauss1D(r, samples), Gauss1D(r, samples)); return new float2(Gauss1D(r, samples), Gauss1D(r, samples));
} }
public static List<PlayerColorPaletteInfo> PlayerColors(this World world)
{
return world.WorldActor.Info.Traits.WithInterface<PlayerColorPaletteInfo>().ToList();
}
public static string FormatTime(int ticks) public static string FormatTime(int ticks)
{ {
var seconds = ticks / 25; var seconds = ticks / 25;

View File

@@ -45,7 +45,7 @@ namespace OpenRA.Mods.RA
{ {
// TODO: This shouldn't rely on a base palette // TODO: This shouldn't rely on a base palette
var wr = world.WorldRenderer; var wr = world.WorldRenderer;
var pal = wr.GetPalette("player0"); var pal = wr.GetPalette("terrain");
wr.AddPalette(info.Name, new Palette(pal, new SingleColorRemap(Color.FromArgb(info.A, info.R, info.G, info.B)))); wr.AddPalette(info.Name, new Palette(pal, new SingleColorRemap(Color.FromArgb(info.A, info.R, info.G, info.B))));
} }
} }

View File

@@ -103,77 +103,8 @@ World:
WaterChance: .2 WaterChance: .2
PaletteFromCurrentTheatre: PaletteFromCurrentTheatre:
Name: terrain Name: terrain
PlayerColorPalette@player0: PlayerColorPalette:
Name: player0
DisplayName: Gold
BasePalette: terrain BasePalette: terrain
DisplayColor: 228, 200, 112
Color1: 246,214,121
Color2: 40,32,8
PlayerColorPalette@player1:
Name: player1
DisplayName: Blue
BasePalette: terrain
DisplayColor: 56, 72, 125
Color1: 30,85,204
Color2: 8,20,52
PlayerColorPalette@player2:
Name: player2
DisplayName: Red
BasePalette: terrain
DisplayColor: 238,0,0
Color1: 255,20,0
Color2: 56,0,0
PlayerColorPalette@player3:
Name: player3
DisplayName: Orange
BasePalette: terrain
DisplayColor: 198,97,0
Color1: 255,107,0
Color2: 56,0,0
PlayerColorPalette@player4:
Name: player4
DisplayName: Teal
BasePalette: terrain
DisplayColor: 28,109,97
Color1: 93,194,165
Color2: 0,32,32
PlayerColorPalette@player5:
Name: player5
DisplayName: Salmon
BasePalette: terrain
DisplayColor: 153,76,53
Color1: 210,153,125
Color2: 56,0,0
PlayerColorPalette@player6:
Name: player6
DisplayName: Green
BasePalette: terrain
DisplayColor: 76,101,60
Color1: 160,240,140
Color2: 20,20,20
PlayerColorPalette@player7:
Name: player7
DisplayName: White
BasePalette: terrain
DisplayColor: 255,255,255
Color1: 255,255,255
Color2: 75,75,75
PlayerColorPalette@player8:
Name: player8
DisplayName: Black
BasePalette: terrain
DisplayColor: 30,30,30
Color1: 80,80,80
Color2: 5,5,5
PlayerColorPalette@neutral:
Name: neutral
DisplayName: Neutral
BasePalette: terrain
DisplayColor: 133,113,101
Color1: 238,238,238
Color2: 44,28,24
Playable: no
PaletteFromFile@chrome: PaletteFromFile@chrome:
Name: chrome Name: chrome
Filename: temperat.pal Filename: temperat.pal