Color picker update with team color presets. Bots added will use available team color presets by default
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user