Color picker update with team color presets. Bots added will use available team color presets by default

This commit is contained in:
David Wilson
2018-02-25 12:09:53 +10:00
committed by Paul Chote
parent b383b9abc9
commit 9bc9ce4577
12 changed files with 534 additions and 95 deletions

View File

@@ -161,6 +161,7 @@ namespace OpenRA
public string Name = "Newbie"; public string Name = "Newbie";
public HSLColor Color = new HSLColor(75, 255, 180); public HSLColor Color = new HSLColor(75, 255, 180);
public string LastServer = "localhost:1234"; public string LastServer = "localhost:1234";
public HSLColor[] CustomColors = { };
} }
public class GameSettings public class GameSettings

View File

@@ -24,6 +24,7 @@ namespace OpenRA.Mods.Common
public readonly int Threshold = 0x50; public readonly int Threshold = 0x50;
public readonly float[] HsvSaturationRange = new[] { 0.25f, 1f }; public readonly float[] HsvSaturationRange = new[] { 0.25f, 1f };
public readonly float[] HsvValueRange = new[] { 0.2f, 1.0f }; public readonly float[] HsvValueRange = new[] { 0.2f, 1.0f };
public readonly HSLColor[] TeamColorPresets = { };
double GetColorDelta(Color colorA, Color colorB) double GetColorDelta(Color colorA, Color colorB)
{ {
@@ -86,6 +87,20 @@ namespace OpenRA.Mods.Common
return true; return true;
} }
public HSLColor RandomPresetColor(MersenneTwister random, IEnumerable<Color> terrainColors, IEnumerable<Color> playerColors)
{
if (TeamColorPresets.Any())
{
Color forbidden;
Action<string> ignoreError = _ => { };
foreach (var c in TeamColorPresets.Shuffle(random))
if (IsValid(c.RGB, out forbidden, terrainColors, playerColors, ignoreError))
return c;
}
return RandomValidColor(random, terrainColors, playerColors);
}
public HSLColor RandomValidColor(MersenneTwister random, IEnumerable<Color> terrainColors, IEnumerable<Color> playerColors) public HSLColor RandomValidColor(MersenneTwister random, IEnumerable<Color> terrainColors, IEnumerable<Color> playerColors)
{ {
HSLColor color; HSLColor color;
@@ -142,7 +157,7 @@ namespace OpenRA.Mods.Common
// If we reached the limit (The ii >= 255 prevents too much calculations) // If we reached the limit (The ii >= 255 prevents too much calculations)
if (attempt >= 255) if (attempt >= 255)
{ {
color = RandomValidColor(random, terrainColors, playerColors); color = RandomPresetColor(random, terrainColors, playerColors);
break; break;
} }

View File

@@ -321,7 +321,7 @@ namespace OpenRA.Mods.Common.Server
var terrainColors = tileset.TerrainInfo.Where(ti => ti.RestrictPlayerColor).Select(ti => ti.Color); var terrainColors = tileset.TerrainInfo.Where(ti => ti.RestrictPlayerColor).Select(ti => ti.Color);
var playerColors = server.LobbyInfo.Clients.Select(c => c.Color.RGB) var playerColors = server.LobbyInfo.Clients.Select(c => c.Color.RGB)
.Concat(server.Map.Players.Players.Values.Select(p => p.Color.RGB)); .Concat(server.Map.Players.Players.Values.Select(p => p.Color.RGB));
bot.Color = bot.PreferredColor = validator.RandomValidColor(server.Random, terrainColors, playerColors); bot.Color = bot.PreferredColor = validator.RandomPresetColor(server.Random, terrainColors, playerColors);
server.LobbyInfo.Clients.Add(bot); server.LobbyInfo.Clients.Add(bot);
} }

View File

@@ -19,6 +19,9 @@ namespace OpenRA.Mods.Common.Widgets
{ {
public Func<Color> GetColor; public Func<Color> GetColor;
public Action<MouseInput> OnMouseDown = _ => { };
public Action<MouseInput> OnMouseUp = _ => { };
public ColorBlockWidget() public ColorBlockWidget()
{ {
GetColor = () => Color.White; GetColor = () => Color.White;
@@ -39,5 +42,30 @@ namespace OpenRA.Mods.Common.Widgets
{ {
WidgetUtils.FillRectWithColor(RenderBounds, GetColor()); WidgetUtils.FillRectWithColor(RenderBounds, GetColor());
} }
public override bool HandleMouseInput(MouseInput mi)
{
if (mi.Button != MouseButton.Left)
return false;
if (mi.Event == MouseInputEvent.Down && !TakeMouseFocus(mi))
return false;
if (HasMouseFocus && mi.Event == MouseInputEvent.Up)
{
// Only fire the onMouseUp event if we successfully lost focus, and were pressed
OnMouseUp(mi);
return YieldMouseFocus(mi);
}
if (mi.Event == MouseInputEvent.Down)
{
// OnMouseDown returns false if the button shouldn't be pressed
OnMouseDown(mi);
}
return false;
}
} }
} }

View File

@@ -10,7 +10,11 @@
#endregion #endregion
using System; using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Mods.Common.Lint;
using OpenRA.Mods.Common.Traits; using OpenRA.Mods.Common.Traits;
using OpenRA.Primitives; using OpenRA.Primitives;
using OpenRA.Widgets; using OpenRA.Widgets;
@@ -19,8 +23,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
public class ColorPickerLogic : ChromeLogic public class ColorPickerLogic : ChromeLogic
{ {
static bool paletteTabOpenedLast;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ColorPickerLogic(Widget widget, ModData modData, World world, HSLColor initialColor, Action<HSLColor> onChange, WorldRenderer worldRenderer) public ColorPickerLogic(Widget widget, ModData modData, World world, HSLColor initialColor, Action<HSLColor> onChange, Dictionary<string, MiniYaml> logicArgs)
{ {
string actorType; string actorType;
if (!ChromeMetrics.TryGet("ColorPickerActorType", out actorType)) if (!ChromeMetrics.TryGet("ColorPickerActorType", out actorType))
@@ -47,6 +53,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
mixer.OnChange += () => onChange(mixer.Color); mixer.OnChange += () => onChange(mixer.Color);
if (randomButton != null) if (randomButton != null)
{
randomButton.OnClick = () => randomButton.OnClick = () =>
{ {
// Avoid colors with low sat or lum // Avoid colors with low sat or lum
@@ -57,6 +64,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
mixer.Set(new HSLColor(hue, sat, lum)); mixer.Set(new HSLColor(hue, sat, lum));
hueSlider.Value = hue / 255f; hueSlider.Value = hue / 255f;
}; };
}
// Set the initial state // Set the initial state
var validator = modData.Manifest.Get<ColorValidator>(); var validator = modData.Manifest.Get<ColorValidator>();
@@ -65,6 +73,107 @@ namespace OpenRA.Mods.Common.Widgets.Logic
hueSlider.Value = initialColor.H / 255f; hueSlider.Value = initialColor.H / 255f;
onChange(mixer.Color); onChange(mixer.Color);
// Setup tab controls
var mixerTab = widget.Get("MIXER_TAB");
var paletteTab = widget.Get("PALETTE_TAB");
var paletteTabPanel = widget.Get("PALETTE_TAB_PANEL");
var mixerTabButton = widget.Get<ButtonWidget>("MIXER_TAB_BUTTON");
var paletteTabButton = widget.Get<ButtonWidget>("PALETTE_TAB_BUTTON");
var presetArea = paletteTabPanel.Get<ContainerWidget>("PRESET_AREA");
var customArea = paletteTabPanel.Get<ContainerWidget>("CUSTOM_AREA");
var presetColorTemplate = paletteTabPanel.Get<ColorBlockWidget>("COLORPRESET");
var customColorTemplate = paletteTabPanel.Get<ColorBlockWidget>("COLORCUSTOM");
mixerTab.IsVisible = () => !paletteTabOpenedLast;
mixerTabButton.OnClick = () => paletteTabOpenedLast = false;
mixerTabButton.IsHighlighted = mixerTab.IsVisible;
paletteTab.IsVisible = () => paletteTabOpenedLast;
paletteTabButton.OnClick = () => paletteTabOpenedLast = true;
paletteTabButton.IsHighlighted = paletteTab.IsVisible;
var paletteCols = 8;
var palettePresetRows = 2;
var paletteCustomRows = 1;
MiniYaml yaml;
if (logicArgs.TryGetValue("PaletteColumns", out yaml))
if (!int.TryParse(yaml.Value, out paletteCols))
throw new YamlException("Invalid value for PaletteColumns: {0}".F(yaml.Value));
if (logicArgs.TryGetValue("PalettePresetRows", out yaml))
if (!int.TryParse(yaml.Value, out palettePresetRows))
throw new YamlException("Invalid value for PalettePresetRows: {0}".F(yaml.Value));
if (logicArgs.TryGetValue("PaletteCustomRows", out yaml))
if (!int.TryParse(yaml.Value, out paletteCustomRows))
throw new YamlException("Invalid value for PaletteCustomRows: {0}".F(yaml.Value));
for (var j = 0; j < palettePresetRows; j++)
{
for (var i = 0; i < paletteCols; i++)
{
var colorIndex = j * paletteCols + i;
if (colorIndex >= validator.TeamColorPresets.Length)
break;
var color = validator.TeamColorPresets[colorIndex];
var rgbColor = color.RGB;
var newSwatch = (ColorBlockWidget)presetColorTemplate.Clone();
newSwatch.GetColor = () => rgbColor;
newSwatch.IsVisible = () => true;
newSwatch.Bounds.X = i * newSwatch.Bounds.Width;
newSwatch.Bounds.Y = j * newSwatch.Bounds.Height;
newSwatch.OnMouseUp = m =>
{
mixer.Set(color);
onChange(color);
};
presetArea.AddChild(newSwatch);
}
}
for (var j = 0; j < paletteCustomRows; j++)
{
for (var i = 0; i < paletteCols; i++)
{
var colorIndex = j * paletteCols + i;
var newSwatch = (ColorBlockWidget)customColorTemplate.Clone();
newSwatch.GetColor = () => Game.Settings.Player.CustomColors[colorIndex].RGB;
newSwatch.IsVisible = () => Game.Settings.Player.CustomColors.Length > colorIndex;
newSwatch.Bounds.X = i * newSwatch.Bounds.Width;
newSwatch.Bounds.Y = j * newSwatch.Bounds.Height;
newSwatch.OnMouseUp = m =>
{
var color = Game.Settings.Player.CustomColors[colorIndex];
mixer.Set(color);
onChange(color);
};
customArea.AddChild(newSwatch);
}
}
// Store color button
var storeButton = widget.Get<ButtonWidget>("STORE_BUTTON");
if (storeButton != null)
{
storeButton.OnClick = () =>
{
// Update the custom color list:
// - Remove any duplicates of the new color
// - Add the new color to the end
// - Save the last N colors
Game.Settings.Player.CustomColors = Game.Settings.Player.CustomColors
.Where(c => c != mixer.Color)
.Append(mixer.Color)
.Reverse().Take(paletteCustomRows * paletteCols).Reverse()
.ToArray();
Game.Settings.Save();
};
}
} }
public static void ShowColorDropDown(DropDownButtonWidget color, ColorPreviewManagerWidget preview, World world) public static void ShowColorDropDown(DropDownButtonWidget color, ColorPreviewManagerWidget preview, World world)

View File

@@ -1,44 +1,138 @@
Background@COLOR_CHOOSER: Background@COLOR_CHOOSER:
Logic: ColorPickerLogic Logic: ColorPickerLogic
PaletteColumns: 8
PalettePresetRows: 2
PaletteCustomRows: 1
Background: panel-black Background: panel-black
Width: 311 Width: 311
Height: 140 Height: 148
Children: Children:
Button@RANDOM_BUTTON: Button@RANDOM_BUTTON:
Key: tab Key: tab
X: 235 X: 229
Y: 109 Y: 89
Width: 70 Width: 77
Height: 25 Height: 25
Text: Random Text: Random
Background@HUEBG: Button@STORE_BUTTON:
X: 229
Y: 118
Width: 77
Height: 25
Text: Store
Font: Bold
ActorPreview@PREVIEW:
X: 232
Y: 7
Width: 77
Height: 73
Animate: true
Button@MIXER_TAB_BUTTON:
X: 5
Y: PARENT_BOTTOM - 30
Height: 25
Width: 80
Text: Mixer
Font: Bold
Button@PALETTE_TAB_BUTTON:
X: 90
Y: PARENT_BOTTOM - 30
Height: 25
Width: 80
Text: Palette
Font: Bold
Container@MIXER_TAB:
X: 5
Y: 5
Width: PARENT_RIGHT - 91
Height: PARENT_BOTTOM - 34
Children:
Background@HUEBG:
Background: panel-black
X: 0
Y: 0
Width: PARENT_RIGHT
Height: 17
Children:
HueSlider@HUE:
X: 2
Y: 2
Width: PARENT_RIGHT - 4
Height: PARENT_BOTTOM - 4
Ticks: 5
Background@MIXERBG:
Background: panel-black
X: 0
Y: 22
Width: PARENT_RIGHT
Height: 92
Children:
ColorMixer@MIXER:
X: 2
Y: 2
Width: PARENT_RIGHT - 4
Height: PARENT_BOTTOM - 4
Background@PALETTE_TAB:
Background: panel-black Background: panel-black
X: 5 X: 5
Y: 5 Y: 5
Width: 225 Width: PARENT_RIGHT - 91
Height: 17 Height: PARENT_BOTTOM - 34
Visible: false
Children: Children:
HueSlider@HUE: Container@PALETTE_TAB_PANEL:
X: 2 X: 0
Y: 2 Y: 0
Width: PARENT_RIGHT - 4 Width: PARENT_RIGHT
Height: PARENT_BOTTOM - 4 Height: PARENT_BOTTOM
Ticks: 5 Children:
Background@MIXERBG: Background@PRESET_HEADER:
Background: panel-black Background: panel-black
X: 5 Width: PARENT_RIGHT - 4
Y: 27 Height: 13
Width: 225 X: 2
Height: 107 Y: 2
Children: Children:
ColorMixer@MIXER: Label@LABEL:
X: 2 Font: TinyBold
Y: 2 Width: PARENT_RIGHT
Width: PARENT_RIGHT - 4 Height: 10
Height: PARENT_BOTTOM - 4 Align: Center
ActorPreview@PREVIEW: Text: Preset Colors
X: 230 Container@PRESET_AREA:
Y: 21 Width: PARENT_RIGHT - 4
Width: 80 Height: 58
Height: 73 X: 2
Animate: true Y: 16
Children:
ColorBlock@COLORPRESET:
X: 0
Y: 0
Width: 27
Height: 27
Visible: false
Background@CUSTOM_HEADER:
Background: panel-black
Width: PARENT_RIGHT - 4
Height: 13
X: 2
Y: 71
Children:
Label@LABEL:
Font: TinyBold
Width: PARENT_RIGHT
Height: 10
Align: Center
Text: Custom Colors
Container@CUSTOM_AREA:
Width: PARENT_RIGHT - 4
Height: 31
X: 2
Y: 85
Children:
ColorBlock@COLORCUSTOM:
X: 0
Y: 0
Width: 27
Height: 27
Visible: false

View File

@@ -235,6 +235,7 @@ GameSpeeds:
OrderLatency: 6 OrderLatency: 6
ColorValidator: ColorValidator:
TeamColorPresets: f70606, ff7a22, f8d3b3, f8e947, b6f706, f335a0, a64d6c, ce08f9, f5b2db, 12b572, 380135, 1d06f7, 328dff, 78dbf8, cef6b1, 000000
ModContent: ModContent:
InstallPromptMessage: Tiberian Dawn requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2007 C&C Gold freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc. InstallPromptMessage: Tiberian Dawn requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2007 C&C Gold freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc.

View File

@@ -1,44 +1,138 @@
Background@COLOR_CHOOSER: Background@COLOR_CHOOSER:
Logic: ColorPickerLogic Logic: ColorPickerLogic
PaletteColumns: 8
PalettePresetRows: 2
PaletteCustomRows: 1
Background: dialog2 Background: dialog2
Width: 326 Width: 326
Height: 140 Height: 154
Children: Children:
Button@RANDOM_BUTTON: Button@RANDOM_BUTTON:
Key: tab Key: tab
X: 250 X: 245
Y: 109 Y: 95
Width: 70 Width: 76
Height: 25 Height: 25
Text: Random Text: Random
Font: Bold Font: Bold
Background@HUEBG: Button@STORE_BUTTON:
X: 245
Y: 124
Width: 76
Height: 25
Text: Store
Font: Bold
ActorPreview@PREVIEW:
X: 245
Y: 13
Width: 76
Height: 73
Button@MIXER_TAB_BUTTON:
X: 5
Y: PARENT_BOTTOM - 30
Height: 25
Width: 80
Text: Mixer
Font: Bold
Button@PALETTE_TAB_BUTTON:
X: 85
Y: PARENT_BOTTOM - 30
Height: 25
Width: 80
Text: Palette
Font: Bold
Container@MIXER_TAB:
X: 5
Y: 5
Width: PARENT_RIGHT - 90
Height: PARENT_BOTTOM - 34
Children:
Background@HUEBG:
Background: dialog3
X: 0
Y: 0
Width: PARENT_RIGHT
Height: 17
Children:
HueSlider@HUE:
X: 2
Y: 2
Width: PARENT_RIGHT - 4
Height: PARENT_BOTTOM - 4
Ticks: 5
Background@MIXERBG:
Background: dialog3
X: 0
Y: 22
Width: PARENT_RIGHT
Height: PARENT_BOTTOM - 22
Children:
ColorMixer@MIXER:
X: 2
Y: 2
Width: PARENT_RIGHT - 4
Height: PARENT_BOTTOM - 4
Background@PALETTE_TAB:
Background: dialog3 Background: dialog3
X: 5 X: 5
Y: 5 Y: 5
Width: 240 Width: PARENT_RIGHT - 90
Height: 17 Height: PARENT_BOTTOM - 34
Visible: false
Children: Children:
HueSlider@HUE: Container@PALETTE_TAB_PANEL:
X: 2 X: 0
Y: 2 Y: 0
Width: PARENT_RIGHT - 4 Width: PARENT_RIGHT
Height: PARENT_BOTTOM - 4 Height: PARENT_BOTTOM
Ticks: 5 Children:
Background@MIXERBG: Background@PRESET_HEADER:
Background: dialog3 Background: dialog2
X: 5 Width: PARENT_RIGHT - 4
Y: 27 Height: 13
Width: 240 X: 2
Height: 107 Y: 2
Children: Children:
ColorMixer@MIXER: Label@LABEL:
X: 2 Font: TinyBold
Y: 2 Width: PARENT_RIGHT
Width: PARENT_RIGHT - 4 Height: 10
Height: PARENT_BOTTOM - 4 Align: Center
ActorPreview@PREVIEW: Text: Preset Colors
X: 245 Container@PRESET_AREA:
Y: 21 Width: PARENT_RIGHT - 4
Width: 80 Height: 58
Height: 73 X: 2
Y: 16
Children:
ColorBlock@COLORPRESET:
X: 0
Y: 0
Width: 29
Height: 29
Visible: false
Background@CUSTOM_HEADER:
Background: dialog2
Width: PARENT_RIGHT - 4
Height: 13
X: 2
Y: 75
Children:
Label@LABEL:
Font: TinyBold
Width: PARENT_RIGHT
Height: 10
Align: Center
Text: Custom Colors
Container@CUSTOM_AREA:
Width: PARENT_RIGHT - 4
Height: 31
X: 2
Y: 89
Children:
ColorBlock@COLORCUSTOM:
X: 0
Y: 0
Width: 29
Height: 29
Visible: false

View File

@@ -212,6 +212,7 @@ GameSpeeds:
OrderLatency: 6 OrderLatency: 6
ColorValidator: ColorValidator:
TeamColorPresets: ffc9ca, f53333, ffae00, fff830, 87f506, f872ad, da06f3, ddb8ff, def7b2, 39c46f, 200738, 280df6, 2f86f2, 76d2f8, 498221, 000000
ModContent: ModContent:
InstallPromptMessage: Dune 2000 requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without\nmusic or videos) from an online mirror of the game files.\n\nAdvanced Install includes options for copying the music, videos,\nand other content from an original game disc. InstallPromptMessage: Dune 2000 requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without\nmusic or videos) from an online mirror of the game files.\n\nAdvanced Install includes options for copying the music, videos,\nand other content from an original game disc.

View File

@@ -237,6 +237,7 @@ GameSpeeds:
OrderLatency: 6 OrderLatency: 6
ColorValidator: ColorValidator:
TeamColorPresets: ffc9ca, f50606, 98331f, f57606, f7bb06, f861a4, da06f3, ddb8ff, 06f739, cef7b2, 200738, 280df6, 2f86f2, 76d2f8, 34ba93, 000000
ModContent: ModContent:
InstallPromptMessage: Red Alert requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2008 Red Alert freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc. InstallPromptMessage: Red Alert requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2008 Red Alert freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc.

View File

@@ -1,45 +1,139 @@
Background@COLOR_CHOOSER: Background@COLOR_CHOOSER:
Logic: ColorPickerLogic Logic: ColorPickerLogic
PaletteColumns: 8
PalettePresetRows: 2
PaletteCustomRows: 1
Background: dialog2 Background: dialog2
Width: 326 Width: 326
Height: 140 Height: 154
Children: Children:
Button@RANDOM_BUTTON: Button@RANDOM_BUTTON:
Key: tab Key: tab
X: 250 X: 245
Y: 109 Y: 95
Width: 70 Width: 76
Height: 25 Height: 25
Text: Random Text: Random
Font: Bold Font: Bold
Background@HUEBG: Button@STORE_BUTTON:
X: 245
Y: 124
Width: 76
Height: 25
Text: Store
Font: Bold
ActorPreview@PREVIEW:
X: 245
Y: 16
Width: 76
Height: 74
Animate: true
Button@MIXER_TAB_BUTTON:
X: 5
Y: PARENT_BOTTOM - 30
Height: 25
Width: 80
Text: Mixer
Font: Bold
Button@PALETTE_TAB_BUTTON:
X: 85
Y: PARENT_BOTTOM - 30
Height: 25
Width: 80
Text: Palette
Font: Bold
Container@MIXER_TAB:
X: 5
Y: 5
Width: PARENT_RIGHT - 90
Height: PARENT_BOTTOM - 34
Children:
Background@HUEBG:
Background: dialog3
X: 0
Y: 0
Width: PARENT_RIGHT
Height: 17
Children:
HueSlider@HUE:
X: 2
Y: 2
Width: PARENT_RIGHT - 4
Height: PARENT_BOTTOM - 4
Ticks: 5
Background@MIXERBG:
Background: dialog3
X: 0
Y: 22
Width: PARENT_RIGHT
Height: PARENT_BOTTOM - 22
Children:
ColorMixer@MIXER:
X: 2
Y: 2
Width: PARENT_RIGHT - 4
Height: PARENT_BOTTOM - 4
Background@PALETTE_TAB:
Background: dialog3 Background: dialog3
X: 5 X: 5
Y: 5 Y: 5
Width: 240 Width: PARENT_RIGHT - 90
Height: 17 Height: PARENT_BOTTOM - 34
Visible: false
Children: Children:
HueSlider@HUE: Container@PALETTE_TAB_PANEL:
X: 2 X: 0
Y: 2 Y: 0
Width: PARENT_RIGHT - 4 Width: PARENT_RIGHT
Height: PARENT_BOTTOM - 4 Height: PARENT_BOTTOM
Ticks: 5 Children:
Background@MIXERBG: Background@PRESET_HEADER:
Background: dialog3 Background: dialog2
X: 5 Width: PARENT_RIGHT - 4
Y: 27 Height: 13
Width: 240 X: 2
Height: 107 Y: 2
Children: Children:
ColorMixer@MIXER: Label@LABEL:
X: 2 Font: TinyBold
Y: 2 Width: PARENT_RIGHT
Width: PARENT_RIGHT - 4 Height: 10
Height: PARENT_BOTTOM - 4 Align: Center
ActorPreview@PREVIEW: Text: Preset Colors
X: 245 Container@PRESET_AREA:
Y: 11 Width: PARENT_RIGHT - 4
Width: 80 Height: 58
Height: 74 X: 2
Animate: true Y: 16
Children:
ColorBlock@COLORPRESET:
X: 0
Y: 0
Width: 29
Height: 29
Visible: false
Background@CUSTOM_HEADER:
Background: dialog2
Width: PARENT_RIGHT - 4
Height: 13
X: 2
Y: 75
Children:
Label@LABEL:
Font: TinyBold
Width: PARENT_RIGHT
Height: 10
Align: Center
Text: Custom Colors
Container@CUSTOM_AREA:
Width: PARENT_RIGHT - 4
Height: 31
X: 2
Y: 89
Children:
ColorBlock@COLORCUSTOM:
X: 0
Y: 0
Width: 29
Height: 29
Visible: false

View File

@@ -273,6 +273,7 @@ GameSpeeds:
OrderLatency: 6 OrderLatency: 6
ColorValidator: ColorValidator:
TeamColorPresets: f70606, ff7a22, f8d3b3, f8e947, b6f706, f335a0, a64d6c, ce08f9, f5b2db, 12b572, 380135, 1d06f7, 328dff, 78dbf8, cef6b1, 000000
ModContent: ModContent:
InstallPromptMessage: Tiberian Sun requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2012 Tiberian Sun freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc. InstallPromptMessage: Tiberian Sun requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2012 Tiberian Sun freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc.