diff --git a/OpenRA.Game/Traits/World/Country.cs b/OpenRA.Game/Traits/World/Country.cs index 2921e04fc1..9d3ba3c395 100644 --- a/OpenRA.Game/Traits/World/Country.cs +++ b/OpenRA.Game/Traits/World/Country.cs @@ -18,6 +18,12 @@ namespace OpenRA.Traits [Desc("This is the internal name for owner checks.")] public readonly string Race = null; + [Desc("The side that the country belongs to. For example, England belongs to the 'Allies' side.")] + public readonly string Side = null; + + [Translate] + public readonly string Description = null; + public readonly bool Selectable = true; } diff --git a/OpenRA.Game/Widgets/ButtonWidget.cs b/OpenRA.Game/Widgets/ButtonWidget.cs index c041f790fa..b6e564ed58 100644 --- a/OpenRA.Game/Widgets/ButtonWidget.cs +++ b/OpenRA.Game/Widgets/ButtonWidget.cs @@ -47,6 +47,7 @@ namespace OpenRA.Widgets public readonly string TooltipContainer; public readonly string TooltipTemplate = "BUTTON_TOOLTIP"; [Translate] public string TooltipText; + public Func GetTooltipText; // Equivalent to OnMouseUp, but without an input arg public Action OnClick = () => {}; @@ -68,6 +69,7 @@ namespace OpenRA.Widgets OnKeyPress = _ => OnClick(); IsDisabled = () => Disabled; IsHighlighted = () => Highlighted; + GetTooltipText = () => TooltipText; tooltipContainer = Exts.Lazy(() => Ui.Root.Get(TooltipContainer)); } @@ -102,6 +104,7 @@ namespace OpenRA.Widgets TooltipTemplate = other.TooltipTemplate; TooltipText = other.TooltipText; + GetTooltipText = other.GetTooltipText; TooltipContainer = other.TooltipContainer; tooltipContainer = Exts.Lazy(() => Ui.Root.Get(TooltipContainer)); @@ -177,19 +180,23 @@ namespace OpenRA.Widgets public override void MouseEntered() { - if (TooltipContainer == null) return; + if (TooltipContainer == null || GetTooltipText() == null) + return; + tooltipContainer.Value.SetTooltip(TooltipTemplate, - new WidgetArgs() {{ "button", this }}); + new WidgetArgs { { "button", this } }); } public override void MouseExited() { - if (TooltipContainer == null) return; + if (TooltipContainer == null || !tooltipContainer.IsValueCreated) + return; + tooltipContainer.Value.RemoveTooltip(); } public override int2 ChildOrigin { get { return RenderOrigin + - ((Depressed) ? new int2(VisualHeight, VisualHeight) : new int2(0, 0)); } } + (Depressed ? new int2(VisualHeight, VisualHeight) : new int2(0, 0)); } } public override void Draw() { @@ -209,10 +216,10 @@ namespace OpenRA.Widgets DrawBackground(rb, disabled, Depressed, Ui.MouseOverWidget == this, highlighted); if (Contrast) font.DrawTextWithContrast(text, position + stateOffset, - disabled ? colordisabled : color, contrast, 2); + disabled ? colordisabled : color, contrast, 2); else font.DrawText(text, position + stateOffset, - disabled ? colordisabled : color); + disabled ? colordisabled : color); } public override Widget Clone() { return new ButtonWidget(this); } diff --git a/OpenRA.Game/Widgets/ChromeMetrics.cs b/OpenRA.Game/Widgets/ChromeMetrics.cs index 86779d7ff2..dd91767285 100644 --- a/OpenRA.Game/Widgets/ChromeMetrics.cs +++ b/OpenRA.Game/Widgets/ChromeMetrics.cs @@ -33,5 +33,17 @@ namespace OpenRA.Widgets { return FieldLoader.GetValue(key, data[key]); } + + public static bool TryGet(string key, out T result) + { + string s; + if (!data.TryGetValue(key, out s)) + { + result = default(T); + return false; + } + result = FieldLoader.GetValue(key, s); + return true; + } } } diff --git a/OpenRA.Game/Widgets/DropDownButtonWidget.cs b/OpenRA.Game/Widgets/DropDownButtonWidget.cs index 06c11d07d5..103ad10d8a 100644 --- a/OpenRA.Game/Widgets/DropDownButtonWidget.cs +++ b/OpenRA.Game/Widgets/DropDownButtonWidget.cs @@ -19,12 +19,19 @@ namespace OpenRA.Widgets { Widget panel; MaskWidget fullscreenMask; + Widget panelRoot; + + public string PanelRoot; [ObjectCreator.UseCtor] public DropDownButtonWidget(Ruleset modRules) : base(modRules) { } - protected DropDownButtonWidget(DropDownButtonWidget widget) : base(widget) { } + protected DropDownButtonWidget(DropDownButtonWidget widget) + : base(widget) + { + PanelRoot = widget.PanelRoot; + } public override void Draw() { @@ -34,7 +41,7 @@ namespace OpenRA.Widgets var image = ChromeProvider.GetImage("scrollbar", IsDisabled() ? "down_pressed" : "down_arrow"); var rb = RenderBounds; var color = GetColor(); - var colordisabled = GetColorDisabled(); + var colorDisabled = GetColorDisabled(); WidgetUtils.DrawRGBA( image, stateOffset + new float2( rb.Right - rb.Height + 4, @@ -42,7 +49,7 @@ namespace OpenRA.Widgets WidgetUtils.FillRectWithColor(new Rectangle(stateOffset.X + rb.Right - rb.Height, stateOffset.Y + rb.Top + 3, 1, rb.Height - 6), - IsDisabled() ? colordisabled : color); + IsDisabled() ? colorDisabled : color); } public override Widget Clone() { return new DropDownButtonWidget(this); } @@ -61,8 +68,8 @@ namespace OpenRA.Widgets if (panel == null) return; - Ui.Root.RemoveChild(fullscreenMask); - Ui.Root.RemoveChild(panel); + panelRoot.RemoveChild(fullscreenMask); + panelRoot.RemoveChild(panel); panel = fullscreenMask = null; } @@ -80,11 +87,17 @@ namespace OpenRA.Widgets if (onCancel != null) fullscreenMask.OnMouseDown += _ => onCancel(); - Ui.Root.AddChild(fullscreenMask); + panelRoot = PanelRoot == null ? Ui.Root : Ui.Root.Get(PanelRoot); + + panelRoot.AddChild(fullscreenMask); var oldBounds = panel.Bounds; - panel.Bounds = new Rectangle(RenderOrigin.X, RenderOrigin.Y + Bounds.Height, oldBounds.Width, oldBounds.Height); - Ui.Root.AddChild(panel); + panel.Bounds = new Rectangle( + RenderOrigin.X - panelRoot.RenderOrigin.X, + RenderOrigin.Y + Bounds.Height - panelRoot.RenderOrigin.Y, + oldBounds.Width, + oldBounds.Height); + panelRoot.AddChild(panel); } public void ShowDropDown(string panelTemplate, int maxHeight, IEnumerable options, Func setupItem) @@ -116,14 +129,14 @@ namespace OpenRA.Widgets var panel = (ScrollPanelWidget)Ui.LoadWidget(panelTemplate, null, new WidgetArgs() {{ "substitutions", substitutions }}); - var headerTemplate = panel.Get("HEADER"); + var headerTemplate = panel.GetOrNull("HEADER"); var itemTemplate = panel.Get("TEMPLATE"); panel.RemoveChildren(); foreach (var kv in groups) { var group = kv.Key; - if (group.Length > 0) + if (group.Length > 0 && headerTemplate != null) { var header = ScrollItemWidget.Setup(headerTemplate, () => true, () => {}); header.Get("LABEL").GetText = () => group; diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 475955e31a..4ed8a1ab5a 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -223,6 +223,7 @@ + diff --git a/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs index df1be7331c..3c94c6065b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs @@ -19,9 +19,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var label = widget.Get("LABEL"); var font = Game.Renderer.Fonts[label.Font]; - var labelWidth = font.Measure(button.TooltipText).X; + var text = button.GetTooltipText(); + var labelWidth = font.Measure(text).X; - label.GetText = () => button.TooltipText; + label.GetText = () => text; label.Bounds.Width = labelWidth; widget.Bounds.Width = 2 * label.Bounds.X + labelWidth; diff --git a/OpenRA.Mods.Common/Widgets/Logic/CountryTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/CountryTooltipLogic.cs new file mode 100644 index 0000000000..d5f51e46e5 --- /dev/null +++ b/OpenRA.Mods.Common/Widgets/Logic/CountryTooltipLogic.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic +{ + public class CountryTooltipLogic + { + [ObjectCreator.UseCtor] + public CountryTooltipLogic(Widget widget, ButtonWidget button) + { + var lines = button.GetTooltipText().Replace("\\n", "\n").Split('\n'); + + var header = widget.Get("HEADER"); + var headerLine = lines[0]; + var headerFont = Game.Renderer.Fonts[header.Font]; + var headerSize = headerFont.Measure(headerLine); + header.Bounds.Width += headerSize.X; + header.Bounds.Height += headerSize.Y; + header.GetText = () => headerLine; + + if (lines.Length > 1) + { + var description = widget.Get("DESCRIPTION"); + var descriptionLines = lines.Skip(1).ToArray(); + var descriptionFont = Game.Renderer.Fonts[description.Font]; + description.Bounds.Y += header.Bounds.Y + header.Bounds.Height; + description.Bounds.Width += descriptionLines.Select(l => descriptionFont.Measure(l).X).Max(); + description.Bounds.Height += descriptionFont.Measure(descriptionLines.First()).Y * descriptionLines.Length; + description.GetText = () => string.Join("\n", descriptionLines); + + widget.Bounds.Width = Math.Max(header.Bounds.X + header.Bounds.Width, description.Bounds.X + description.Bounds.Width); + widget.Bounds.Height = description.Bounds.Y + description.Bounds.Height; + } + else + { + widget.Bounds.Width = header.Bounds.X + header.Bounds.Width; + widget.Bounds.Height = header.Bounds.Y + header.Bounds.Height; + } + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.RA/Widgets/Logic/Ingame/AddRaceSuffixLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/Ingame/AddRaceSuffixLogic.cs index 6f0ae48745..834ff49bf6 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/Ingame/AddRaceSuffixLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/Ingame/AddRaceSuffixLogic.cs @@ -18,7 +18,11 @@ namespace OpenRA.Mods.RA.Widgets.Logic [ObjectCreator.UseCtor] public AddRaceSuffixLogic(Widget widget, World world) { - var suffix = "-" + world.LocalPlayer.Country.Race; + string race; + if (!ChromeMetrics.TryGet("RaceSuffix-" + world.LocalPlayer.Country.Race, out race)) + race = world.LocalPlayer.Country.Race; + var suffix = "-" + race; + if (widget is ButtonWidget) ((ButtonWidget)widget).Background += suffix; else if (widget is ImageWidget) diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index ffc9332412..2802bd7f23 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -49,7 +49,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic readonly Widget chatTemplate; readonly ScrollPanelWidget players; - readonly Dictionary countryNames; + + readonly Dictionary countries = new Dictionary(); readonly ColorPreviewManagerWidget colorPreview; @@ -142,10 +143,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic colorPreview = lobby.Get("COLOR_MANAGER"); colorPreview.Color = Game.Settings.Player.Color; - countryNames = modRules.Actors["world"].Traits.WithInterface() - .Where(c => c.Selectable) - .ToDictionary(a => a.Race, a => a.Name); - countryNames.Add("random", "Any"); + countries.Add("random", new LobbyCountry { Name = "Any" }); + foreach (var c in modRules.Actors["world"].Traits.WithInterface().Where(c => c.Selectable)) + countries.Add(c.Race, new LobbyCountry { Name = c.Name, Side = c.Side, Description = c.Description }); var gameStarting = false; Func configurationDisabled = () => !Game.IsHost || gameStarting || @@ -691,7 +691,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic LobbyUtils.SetupEditableNameWidget(template, slot, client, orderManager); LobbyUtils.SetupEditableColorWidget(template, slot, client, orderManager, colorPreview); - LobbyUtils.SetupEditableFactionWidget(template, slot, client, orderManager, countryNames); + LobbyUtils.SetupEditableFactionWidget(template, slot, client, orderManager, countries); LobbyUtils.SetupEditableTeamWidget(template, slot, client, orderManager, Map); LobbyUtils.SetupEditableSpawnWidget(template, slot, client, orderManager, Map); LobbyUtils.SetupEditableReadyWidget(template, slot, client, orderManager, Map); @@ -707,7 +707,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic LobbyUtils.SetupKickWidget(template, slot, client, orderManager, lobby, () => panel = PanelType.Kick, () => panel = PanelType.Players); LobbyUtils.SetupColorWidget(template, slot, client); - LobbyUtils.SetupFactionWidget(template, slot, client, countryNames); + LobbyUtils.SetupFactionWidget(template, slot, client, countries); LobbyUtils.SetupTeamWidget(template, slot, client); LobbyUtils.SetupSpawnWidget(template, slot, client); LobbyUtils.SetupReadyWidget(template, slot, client); @@ -810,4 +810,11 @@ namespace OpenRA.Mods.RA.Widgets.Logic public Action OnClick; } } + + public class LobbyCountry + { + public string Name; + public string Description; + public string Side; + } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs index c022822c1b..b7216a5200 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs @@ -105,21 +105,25 @@ namespace OpenRA.Mods.RA.Widgets.Logic } public static void ShowRaceDropDown(DropDownButtonWidget dropdown, Session.Client client, - OrderManager orderManager, Dictionary countryNames) + OrderManager orderManager, Dictionary countries) { Func setupItem = (race, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, () => client.Country == race, () => orderManager.IssueOrder(Order.Command("race {0} {1}".F(client.Index, race)))); - item.Get("LABEL").GetText = () => countryNames[race]; + var country = countries[race]; + item.Get("LABEL").GetText = () => country.Name; var flag = item.Get("FLAG"); flag.GetImageCollection = () => "flags"; flag.GetImageName = () => race; + item.GetTooltipText = () => country.Description; return item; }; - dropdown.ShowDropDown("RACE_DROPDOWN_TEMPLATE", 150, countryNames.Keys, setupItem); + var options = countries.GroupBy(c => c.Value.Side).ToDictionary(g => g.Key ?? "", g => g.Select(c => c.Key)); + + dropdown.ShowDropDown("RACE_DROPDOWN_TEMPLATE", 150, options, setupItem); } public static void ShowColorDropDown(DropDownButtonWidget color, Session.Client client, @@ -389,21 +393,25 @@ namespace OpenRA.Mods.RA.Widgets.Logic color.GetColor = () => c.Color.RGB; } - public static void SetupEditableFactionWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, Dictionary countryNames) + public static void SetupEditableFactionWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, + Dictionary countries) { var dropdown = parent.Get("FACTION"); dropdown.IsDisabled = () => s.LockRace || orderManager.LocalClient.IsReady; - dropdown.OnMouseDown = _ => ShowRaceDropDown(dropdown, c, orderManager, countryNames); - SetupFactionWidget(dropdown, s, c, countryNames); + dropdown.OnMouseDown = _ => ShowRaceDropDown(dropdown, c, orderManager, countries); + var factionDescription = countries[c.Country].Description; + dropdown.GetTooltipText = () => factionDescription; + SetupFactionWidget(dropdown, s, c, countries); } - public static void SetupFactionWidget(Widget parent, Session.Slot s, Session.Client c, Dictionary countryNames) + public static void SetupFactionWidget(Widget parent, Session.Slot s, Session.Client c, + Dictionary countries) { - var factionname = parent.Get("FACTIONNAME"); - factionname.GetText = () => countryNames[c.Country]; - var factionflag = parent.Get("FACTIONFLAG"); - factionflag.GetImageName = () => c.Country; - factionflag.GetImageCollection = () => "flags"; + var factionName = parent.Get("FACTIONNAME"); + factionName.GetText = () => countries[c.Country].Name; + var factionFlag = parent.Get("FACTIONFLAG"); + factionFlag.GetImageName = () => c.Country; + factionFlag.GetImageCollection = () => "flags"; } public static void SetupEditableTeamWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map) diff --git a/mods/cnc/chrome/settings.yaml b/mods/cnc/chrome/settings.yaml index 7ddfa6d05d..83549370a8 100644 --- a/mods/cnc/chrome/settings.yaml +++ b/mods/cnc/chrome/settings.yaml @@ -169,6 +169,7 @@ Container@SETTINGS_PANEL: Y: 205 Width: 70 Height: 25 + IgnoreChildMouseOver: true Children: ColorBlock@COLORBLOCK: X: 5 diff --git a/mods/d2k/chrome/lobby-playerbin.yaml b/mods/d2k/chrome/lobby-playerbin.yaml index 2a2f254c87..89fb9f82b5 100644 --- a/mods/d2k/chrome/lobby-playerbin.yaml +++ b/mods/d2k/chrome/lobby-playerbin.yaml @@ -51,6 +51,7 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 190 Width: 80 Height: 25 + IgnoreChildMouseOver: true Children: ColorBlock@COLORBLOCK: X: 5 @@ -61,6 +62,7 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 280 Width: 130 Height: 25 + IgnoreChildMouseOver: true Children: Image@FACTIONFLAG: Width: 23 diff --git a/mods/ra/bits/armordropicon.shp b/mods/ra/bits/armordropicon.shp new file mode 100644 index 0000000000..c8002e8f7e Binary files /dev/null and b/mods/ra/bits/armordropicon.shp differ diff --git a/mods/ra/chrome.yaml b/mods/ra/chrome.yaml index 7b967849dd..8e92077628 100644 --- a/mods/ra/chrome.yaml +++ b/mods/ra/chrome.yaml @@ -336,10 +336,21 @@ strategic: strategic.png player_owned: 96,0,32,32 flags: buttons.png - allies: 30,112,30,15 soviet: 0,112,30,15 + allies: 30,112,30,15 random: 60,112,30,15 spectator: 60,112,30,15 + + russia: 0,127,30,15 + ukraine: 30,127,30,15 + england: 60,127,30,15 + + germany: 0,142,30,15 + spain: 30,142,30,15 + france: 60,142,30,15 + + turkey: 0,157,30,15 + greece: 30,157,30,15 music: musicplayer.png pause: 0,0,25,25 @@ -351,10 +362,10 @@ music: musicplayer.png slowmo: 168,0,25,25 scrollbar: buttons.png - down_arrow: 16,140,16,16 - down_pressed: 16,140,16,16 - up_arrow: 32,140,16,16 - up_pressed: 32,140,16,16 + down_arrow: 116,140,16,16 + down_pressed: 116,140,16,16 + up_arrow: 132,140,16,16 + up_pressed: 132,140,16,16 # A copy of dialog3 (pressed button) progressbar-bg: dialog.png @@ -728,10 +739,10 @@ checkbox: dialog.png corner-br: 767,127,1,1 checkbox-bits: buttons.png - checked: 0,157,16,16 - checked-disabled: 0,173,16,16 - crossed: 16,157,16,16 - crossed-disabled: 16,173,16,16 + checked: 100,157,16,16 + checked-disabled: 100,173,16,16 + crossed: 116,157,16,16 + crossed-disabled: 116,173,16,16 checkbox-hover: dialog.png background: 641,129,126,126 diff --git a/mods/ra/chrome/lobby-playerbin.yaml b/mods/ra/chrome/lobby-playerbin.yaml index 845f5c6158..20ea8f4c9a 100644 --- a/mods/ra/chrome/lobby-playerbin.yaml +++ b/mods/ra/chrome/lobby-playerbin.yaml @@ -51,6 +51,7 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 190 Width: 80 Height: 25 + IgnoreChildMouseOver: true Children: ColorBlock@COLORBLOCK: X: 5 @@ -61,6 +62,10 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 280 Width: 130 Height: 25 + IgnoreChildMouseOver: true + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: FACTION_DESCRIPTION_TOOLTIP + PanelRoot: FACTION_DROPDOWN_PANEL_ROOT # ensure that tooltips for the options are on top of the dropdown panel Children: Image@FACTIONFLAG: Width: 30 @@ -326,12 +331,27 @@ ScrollPanel@LOBBY_PLAYER_BIN: ScrollPanel@RACE_DROPDOWN_TEMPLATE: Width: DROPDOWN_WIDTH Children: + ScrollItem@HEADER: + BaseName: scrollheader + Width: PARENT_RIGHT-27 + Height: 13 + X: 2 + Y: 0 + Visible: false + Children: + Label@LABEL: + Font: TinyBold + Width: PARENT_RIGHT + Height: 10 + Align: Center ScrollItem@TEMPLATE: Width: PARENT_RIGHT-27 Height: 25 X: 2 Y: 0 Visible: false + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: FACTION_DESCRIPTION_TOOLTIP Children: Image@FLAG: X: 5 @@ -341,5 +361,4 @@ ScrollPanel@RACE_DROPDOWN_TEMPLATE: Label@LABEL: X: 40 Width: 60 - Height: 25 - + Height: 25 \ No newline at end of file diff --git a/mods/ra/chrome/lobby.yaml b/mods/ra/chrome/lobby.yaml index 52d7c90458..0c16938d15 100644 --- a/mods/ra/chrome/lobby.yaml +++ b/mods/ra/chrome/lobby.yaml @@ -48,7 +48,7 @@ Background@SERVER_LOBBY: Text: Team Align: Center Font: Bold - Label@LABEL_LOBBY_TEAM: + Label@LABEL_LOBBY_SPAWN: X: 478 Width: 48 Height: 25 @@ -141,5 +141,5 @@ Background@SERVER_LOBBY: Text: Disconnect Font: Bold Key: escape + Container@FACTION_DROPDOWN_PANEL_ROOT: TooltipContainer@TOOLTIP_CONTAINER: - diff --git a/mods/ra/chrome/settings.yaml b/mods/ra/chrome/settings.yaml index a335cc12f6..7e544d3603 100644 --- a/mods/ra/chrome/settings.yaml +++ b/mods/ra/chrome/settings.yaml @@ -182,6 +182,7 @@ Background@SETTINGS_PANEL: Y: 205 Width: 70 Height: 25 + IgnoreChildMouseOver: true Children: ColorBlock@COLORBLOCK: X: 5 diff --git a/mods/ra/chrome/tooltips.yaml b/mods/ra/chrome/tooltips.yaml index d203552b5d..5b78684304 100644 --- a/mods/ra/chrome/tooltips.yaml +++ b/mods/ra/chrome/tooltips.yaml @@ -185,4 +185,23 @@ Background@SUPPORT_POWER_TOOLTIP: X: 7 Y: 22 Font: TinyBold + VAlign: Top + +Background@FACTION_DESCRIPTION_TOOLTIP: + Logic: CountryTooltipLogic + Background: dialog4 + Children: + Label@HEADER: + X: 7 + Y: 6 + Width: 8 + Height: 12 + Font: Bold + VAlign: Top + Label@DESCRIPTION: + X: 14 + Y: 0 + Width: 15 + Height: 14 + Font: TinyBold VAlign: Top \ No newline at end of file diff --git a/mods/ra/maps/allies-02/map.yaml b/mods/ra/maps/allies-02/map.yaml index 2fa4aed415..4b24264b43 100644 --- a/mods/ra/maps/allies-02/map.yaml +++ b/mods/ra/maps/allies-02/map.yaml @@ -982,6 +982,18 @@ Rules: HIJACKER: Buildable: Prerequisites: ~disabled + FACF: + Buildable: + Prerequisites: ~disabled + WEAF: + Buildable: + Prerequisites: ~disabled + SYRF: + Buildable: + Prerequisites: ~disabled + DOMF: + Buildable: + Prerequisites: ~disabled Sequences: diff --git a/mods/ra/maps/allies-03a/map.yaml b/mods/ra/maps/allies-03a/map.yaml index b29d35bc4f..81a6c0a560 100644 --- a/mods/ra/maps/allies-03a/map.yaml +++ b/mods/ra/maps/allies-03a/map.yaml @@ -1578,6 +1578,18 @@ Rules: SHOK: Buildable: Prerequisites: ~disabled + FACF: + Buildable: + Prerequisites: ~disabled + WEAF: + Buildable: + Prerequisites: ~disabled + SYRF: + Buildable: + Prerequisites: ~disabled + DOMF: + Buildable: + Prerequisites: ~disabled Sequences: diff --git a/mods/ra/maps/survival01/map.yaml b/mods/ra/maps/survival01/map.yaml index 163875e09b..d3f13892d0 100644 --- a/mods/ra/maps/survival01/map.yaml +++ b/mods/ra/maps/survival01/map.yaml @@ -1262,8 +1262,10 @@ Rules: ParachuteSequence: parach AFLD.mission: Inherits: AFLD - -AirstrikePower: - -ParatroopersPower: + -AirstrikePower@spyplane: + -ParatroopersPower@paratroopers + -ParatroopersPower@armordrop: + -AirstrikePower@parabombs: -SupportPowerChargeBar: RenderBuilding: Image: AFLD @@ -1351,6 +1353,18 @@ Rules: DTRK: Buildable: Prerequisites: ~disabled + FACF: + Buildable: + Prerequisites: ~disabled + WEAF: + Buildable: + Prerequisites: ~disabled + SYRF: + Buildable: + Prerequisites: ~disabled + DOMF: + Buildable: + Prerequisites: ~disabled Sequences: diff --git a/mods/ra/metrics.yaml b/mods/ra/metrics.yaml index a44bdc1b66..ce65490323 100644 --- a/mods/ra/metrics.yaml +++ b/mods/ra/metrics.yaml @@ -24,3 +24,10 @@ Metrics: SpawnColor: 255,255,255 SpawnContrastColor: 0,0,0 SpawnLabelOffset: 0,1 + RaceSuffix-allies: allies + RaceSuffix-england: allies + RaceSuffix-france: allies + RaceSuffix-germany: allies + RaceSuffix-soviet: soviet + RaceSuffix-russia: soviet + RaceSuffix-ukraine: soviet diff --git a/mods/ra/rules/ai.yaml b/mods/ra/rules/ai.yaml index 40f7b33ba5..9e3ce98d22 100644 --- a/mods/ra/rules/ai.yaml +++ b/mods/ra/rules/ai.yaml @@ -62,8 +62,8 @@ Player: ttnk: 10% stnk: 5% SquadSize: 20 - SupportPowerDecision@Airstrike: - OrderName: AirstrikePowerInfoOrder + SupportPowerDecision@spyplane: + OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy @@ -71,8 +71,8 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 - SupportPowerDecision@Paratroopers: - OrderName: ParatroopersPowerInfoOrder + SupportPowerDecision@paratroopers: + OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -86,7 +86,31 @@ Player: Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 - SupportPowerDecision@NukePower: + SupportPowerDecision@armordrop: + OrderName: RussiaArmorDrop + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 10c0 + Consideration@2: + Against: Enemy + Types: Vehicle, Tank, Infantry, Defense + Attractiveness: -10 + TargetMetric: None + CheckRadius: 10c0 + SupportPowerDecision@parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: @@ -180,8 +204,8 @@ Player: ca: 10% pt: 10% SquadSize: 40 - SupportPowerDecision@Airstrike: - OrderName: AirstrikePowerInfoOrder + SupportPowerDecision@spyplane: + OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy @@ -189,8 +213,8 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 - SupportPowerDecision@Paratroopers: - OrderName: ParatroopersPowerInfoOrder + SupportPowerDecision@paratroopers: + OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -204,7 +228,31 @@ Player: Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 - SupportPowerDecision@NukePower: + SupportPowerDecision@armordrop: + OrderName: RussiaArmorDrop + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 10c0 + Consideration@2: + Against: Enemy + Types: Vehicle, Tank, Infantry, Defense + Attractiveness: -10 + TargetMetric: None + CheckRadius: 10c0 + SupportPowerDecision@parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: @@ -297,8 +345,8 @@ Player: ca: 10% pt: 10% SquadSize: 10 - SupportPowerDecision@Airstrike: - OrderName: AirstrikePowerInfoOrder + SupportPowerDecision@spyplane: + OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy @@ -306,8 +354,8 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 - SupportPowerDecision@Paratroopers: - OrderName: ParatroopersPowerInfoOrder + SupportPowerDecision@paratroopers: + OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -321,7 +369,31 @@ Player: Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 - SupportPowerDecision@NukePower: + SupportPowerDecision@armordrop: + OrderName: RussiaArmorDrop + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 10c0 + Consideration@2: + Against: Enemy + Types: Vehicle, Tank, Infantry, Defense + Attractiveness: -10 + TargetMetric: None + CheckRadius: 10c0 + SupportPowerDecision@parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: @@ -389,8 +461,8 @@ Player: ca: 20% pt: 10% SquadSize: 1 - SupportPowerDecision@Airstrike: - OrderName: AirstrikePowerInfoOrder + SupportPowerDecision@spyplane: + OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy @@ -398,8 +470,8 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 - SupportPowerDecision@Paratroopers: - OrderName: ParatroopersPowerInfoOrder + SupportPowerDecision@paratroopers: + OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -413,7 +485,31 @@ Player: Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 - SupportPowerDecision@NukePower: + SupportPowerDecision@armordrop: + OrderName: RussiaArmorDrop + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 10c0 + Consideration@2: + Against: Enemy + Types: Vehicle, Tank, Infantry, Defense + Attractiveness: -10 + TargetMetric: None + CheckRadius: 10c0 + SupportPowerDecision@parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index a4644dd6ad..ccb29745a9 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -147,6 +147,15 @@ TimedUpgradeBar: Upgrade: invulnerability MustBeDestroyed: + Parachutable: + ParachuteOffset: 0,0,200 + KilledOnImpassableTerrain: true + ParachuteSequence: parach + ShadowSequence: + GroundCorpseSequence: + GroundCorpsePalette: + WaterCorpseSequence: + WaterCorpsePalette: ^Infantry: AppearsOnRadar: diff --git a/mods/ra/rules/infantry.yaml b/mods/ra/rules/infantry.yaml index dbad3a1819..1bbac45f1b 100644 --- a/mods/ra/rules/infantry.yaml +++ b/mods/ra/rules/infantry.yaml @@ -194,7 +194,7 @@ SPY: Queue: Infantry BuildAtProductionType: Soldier BuildPaletteOrder: 90 - Prerequisites: dome, ~tent, ~techlevel.medium + Prerequisites: ~!infantry.england, dome, ~tent, ~techlevel.medium Valued: Cost: 500 -Tooltip: @@ -226,6 +226,17 @@ SPY: Weapon: SilencedPPK AttackFrontal: +SPY.England: + Inherits: SPY + RenderDisguise: + Image: spy + Buildable: + Prerequisites: ~infantry.england, dome, ~tent, ~techlevel.medium + Valued: + Cost: 250 + DisguiseToolTip: + Name: British Spy + E7: Inherits: ^Infantry Buildable: diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml index 33164ed75f..3984bd1897 100644 --- a/mods/ra/rules/misc.yaml +++ b/mods/ra/rules/misc.yaml @@ -78,10 +78,6 @@ CRATE: RevealMapCrateAction: SelectionShares: 1 Effect: reveal-map - SupportPowerCrateAction@parabombs: - SelectionShares: 5 - Proxy: powerproxy.parabombs - Effect: parabombs DuplicateUnitCrateAction: SelectionShares: 10 MaxAmount: 5 @@ -94,51 +90,51 @@ CRATE: GiveUnitCrateAction@jeep: SelectionShares: 7 Units: jeep - ValidRaces: allies + ValidRaces: allies, england, france, germany Prerequisites: techlevel.low GiveUnitCrateAction@arty: SelectionShares: 6 Units: arty - ValidRaces: allies + ValidRaces: allies, england, france, germany Prerequisites: techlevel.medium, dome GiveUnitCrateAction@v2rl: SelectionShares: 6 Units: v2rl - ValidRaces: soviet + ValidRaces: soviet, russia, ukraine Prerequisites: techlevel.medium, dome GiveUnitCrateAction@1tnk: SelectionShares: 5 Units: 1tnk - ValidRaces: allies + ValidRaces: allies, england, france, germany Prerequisites: techlevel.low GiveUnitCrateAction@2tnk: SelectionShares: 4 Units: 2tnk - ValidRaces: allies + ValidRaces: allies, england, france, germany Prerequisites: techlevel.medium, fix GiveUnitCrateAction@3tnk: SelectionShares: 4 Units: 3tnk - ValidRaces: soviet + ValidRaces: soviet, russia, ukraine Prerequisites: techlevel.medium, fix GiveUnitCrateAction@4tnk: SelectionShares: 3 Units: 4tnk - ValidRaces: soviet + ValidRaces: soviet, russia, ukraine Prerequisites: techlevel.unrestricted, fix, techcenter GiveUnitCrateAction@squadlight: SelectionShares: 7 Units: e1,e1,e1,e3,e3 - ValidRaces: allies, soviet + ValidRaces: allies, england, france, germany, soviet, russia, ukraine GiveUnitCrateAction@squadheavyallies: SelectionShares: 7 Units: e1,e1,e1,e1,e3,e3,e3,e6,medi - ValidRaces: allies + ValidRaces: allies, england, france, germany TimeDelay: 4500 GiveUnitCrateAction@squadheavysoviet: SelectionShares: 7 Units: e1,e1,e4,e4,e3,e3,e3 - ValidRaces: soviet + ValidRaces: soviet, russia, ukraine TimeDelay: 4500 GrantUpgradeCrateAction@invuln: SelectionShares: 5 diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 2e787fb0c7..57ac362df8 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -56,7 +56,7 @@ GAP: Buildable: Queue: Defense BuildPaletteOrder: 110 - Prerequisites: atek, ~structures.allies, ~techlevel.unrestricted + Prerequisites: atek, ~!structures.france, ~structures.allies, ~techlevel.unrestricted Building: Footprint: _ x Dimensions: 1,2 @@ -81,6 +81,19 @@ GAP: MustBeDestroyed: RequiredForShortGame: false +GAP.France: + Inherits: GAP + RenderBuilding: + Image: gap + Tooltip: + Name: Advanced Gap Generator + Buildable: + Prerequisites: atek, ~structures.france, ~techlevel.unrestricted + RevealsShroud: + Range: 10c0 + CreatesShroud: + Range: 10c0 + SPEN: Inherits: ^Building InfiltrateForSupportPower: @@ -133,6 +146,30 @@ SPEN: ProductionBar: Power: Amount: -30 + ProvidesCustomPrerequisite@soviet: + Race: soviet, russia, ukraine + Prerequisite: ships.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: ships.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: ships.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: ships.ukraine + ProvidesCustomPrerequisite@sovietstructure: + RequiresPrerequisites: structures.soviet + Prerequisite: ships.soviet + ProvidesCustomPrerequisite@sovietvanillastructure: + RequiresPrerequisites: structures.sovietvanilla + Prerequisite: ships.sovietvanilla + ProvidesCustomPrerequisite@russianstructure: + RequiresPrerequisites: structures.russia + Prerequisite: ships.russia + ProvidesCustomPrerequisite@ukrainianstructure: + RequiresPrerequisites: structures.ukraine + Prerequisite: ships.ukraine SYRD: Inherits: ^Building @@ -186,6 +223,36 @@ SYRD: ProductionBar: Power: Amount: -30 + ProvidesCustomPrerequisite@allies: + Race: allies, england, france, germany + Prerequisite: ships.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: ships.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: ships.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: ships.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: ships.germany + ProvidesCustomPrerequisite@alliedstructure: + RequiresPrerequisites: structures.allies + Prerequisite: ships.allies + ProvidesCustomPrerequisite@alliedvanillastructure: + RequiresPrerequisites: structures.alliesvanilla + Prerequisite: ships.alliesvanilla + ProvidesCustomPrerequisite@englishstructure: + RequiresPrerequisites: structures.england + Prerequisite: ships.england + ProvidesCustomPrerequisite@frenchstructure: + RequiresPrerequisites: structures.france + Prerequisite: ships.france + ProvidesCustomPrerequisite@germanstructure: + RequiresPrerequisites: structures.germany + Prerequisite: ships.germany IRON: Inherits: ^Building @@ -238,7 +305,7 @@ PDOX: Buildable: Queue: Defense BuildPaletteOrder: 120 - Prerequisites: atek, ~structures.allies, ~techlevel.unrestricted + Prerequisites: atek, ~structures.allies, ~!structures.germany, ~techlevel.unrestricted BuildLimit: 1 Valued: Cost: 1500 @@ -278,6 +345,20 @@ PDOX: MustBeDestroyed: RequiredForShortGame: false +PDOX.Germany: + Inherits: PDOX + Buildable: + Prerequisites: atek, ~structures.germany, ~techlevel.unrestricted + RenderBuilding: + Image: pdox + Tooltip: + Name: Advanced Chronosphere + Description: Teleports a large group of units across the\nmap for a short time. Requires power to operate.\n Special Ability: Chronoshift\n\nMaximum 1 can be built + ChronoshiftPower: + Description: Advanced Chronoshift + LongDesc: Teleports a large group of units across the\nmap for 20 seconds. + Range: 2 + TSLA: Inherits: ^Defense Buildable: @@ -691,17 +772,59 @@ WEAP: Production: Produces: Vehicle ProvidesCustomPrerequisite@allies: - Race: allies + Race: allies, england, france, germany Prerequisite: vehicles.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: vehicles.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: vehicles.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: vehicles.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: vehicles.germany ProvidesCustomPrerequisite@soviet: - Race: soviet + Race: soviet, russia, ukraine Prerequisite: vehicles.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: vehicles.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: vehicles.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: vehicles.ukraine ProvidesCustomPrerequisite@alliedstructure: RequiresPrerequisites: structures.allies Prerequisite: vehicles.allies + ProvidesCustomPrerequisite@alliedvanillastructure: + RequiresPrerequisites: structures.alliesvanilla + Prerequisite: vehicles.alliesvanilla + ProvidesCustomPrerequisite@englishstructure: + RequiresPrerequisites: structures.england + Prerequisite: vehicles.england + ProvidesCustomPrerequisite@frenchstructure: + RequiresPrerequisites: structures.france + Prerequisite: vehicles.france + ProvidesCustomPrerequisite@germanstructure: + RequiresPrerequisites: structures.germany + Prerequisite: vehicles.germany ProvidesCustomPrerequisite@sovietstructure: RequiresPrerequisites: structures.soviet Prerequisite: vehicles.soviet + ProvidesCustomPrerequisite@sovietvanillastructure: + RequiresPrerequisites: structures.sovietvanilla + Prerequisite: vehicles.sovietvanilla + ProvidesCustomPrerequisite@russianstructure: + RequiresPrerequisites: structures.russia + Prerequisite: vehicles.russia + ProvidesCustomPrerequisite@ukrainianstructure: + RequiresPrerequisites: structures.ukraine + Prerequisite: vehicles.ukraine PrimaryBuilding: ProductionBar: Power: @@ -717,11 +840,32 @@ FACT: BuildPaletteOrder: 1000 Prerequisites: ~disabled ProvidesCustomPrerequisite@allies: - Race: allies + Race: allies, england, france, germany Prerequisite: structures.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: structures.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: structures.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: structures.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: structures.germany ProvidesCustomPrerequisite@soviet: - Race: soviet + Race: soviet, russia, ukraine Prerequisite: structures.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: structures.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: structures.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: structures.ukraine Health: HP: 1500 Armor: @@ -863,6 +1007,36 @@ HPAD: PrimaryBuilding: Power: Amount: -10 + ProvidesCustomPrerequisite@allies: + Race: allies, england, france, germany + Prerequisite: aircraft.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: aircraft.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: aircraft.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: aircraft.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: aircraft.germany + ProvidesCustomPrerequisite@alliedstructure: + RequiresPrerequisites: structures.allies + Prerequisite: aircraft.allies + ProvidesCustomPrerequisite@alliedvanillastructure: + RequiresPrerequisites: structures.alliesvanilla + Prerequisite: aircraft.alliesvanilla + ProvidesCustomPrerequisite@englishstructure: + RequiresPrerequisites: structures.england + Prerequisite: aircraft.england + ProvidesCustomPrerequisite@frenchstructure: + RequiresPrerequisites: structures.france + Prerequisite: aircraft.france + ProvidesCustomPrerequisite@germanstructure: + RequiresPrerequisites: structures.germany + Prerequisite: aircraft.germany AFLD: Inherits: ^Building @@ -893,7 +1067,33 @@ AFLD: Production: Produces: Aircraft, Plane Reservable: - AirstrikePower: + ProvidesCustomPrerequisite@soviet: + Race: soviet, russia, ukraine + Prerequisite: aircraft.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: aircraft.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: aircraft.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: aircraft.ukraine + ProvidesCustomPrerequisite@sovietstructure: + RequiresPrerequisites: structures.soviet + Prerequisite: aircraft.soviet + ProvidesCustomPrerequisite@sovietvanillastructure: + RequiresPrerequisites: structures.sovietvanilla + Prerequisite: aircraft.sovietvanilla + ProvidesCustomPrerequisite@russianstructure: + RequiresPrerequisites: structures.russia + Prerequisite: aircraft.russia + ProvidesCustomPrerequisite@ukrainianstructure: + RequiresPrerequisites: structures.ukraine + Prerequisite: aircraft.ukraine + AirstrikePower@spyplane: + OrderName: SovietSpyPlane + Prerequisites: aircraft.sovietvanilla Icon: spyplane ChargeTime: 180 Description: Spy Plane @@ -906,7 +1106,9 @@ AFLD: QuantizedFacings: 8 DisplayBeacon: true BeaconPoster: camicon - ParatroopersPower: + ParatroopersPower@paratroopers: + OrderName: SovietParatroopers + Prerequisites: aircraft.sovietvanilla Icon: paratroopers ChargeTime: 360 Description: Paratroopers @@ -918,6 +1120,35 @@ AFLD: CameraActor: camera.paradrop DisplayBeacon: true BeaconPoster: pinficon + ParatroopersPower@armordrop: + OrderName: RussiaArmorDrop + Prerequisites: aircraft.russia + Icon: armordrop + ChargeTime: 450 + Description: Armor Airdrop + LongDesc: Badgers drop a pair of\nHeavy Tanks anywhere on the map. + DropItems: 3TNK,3TNK + SquadSize: 2 + SelectTargetSound: slcttgt1.aud + AllowImpassableCells: false + QuantizedFacings: 8 + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: armordropicon + AirstrikePower@parabombs: + OrderName: UkraineParabombs + Prerequisites: aircraft.ukraine + Icon: parabombs + ChargeTime: 270 + Description: Parabombs + LongDesc: A Badger drops a load of parachuted\nbombs on your target. + SelectTargetSound: slcttgt1.aud + CameraActor: camera + CameraRemoveDelay: 150 + UnitType: badr.bomber + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: pbmbicon ProductionBar: SupportPowerChargeBar: PrimaryBuilding: @@ -1050,6 +1281,30 @@ BARR: ProductionBar: ProvidesCustomPrerequisite: Prerequisite: barracks + ProvidesCustomPrerequisite@soviet: + Race: soviet, russia, ukraine + Prerequisite: infantry.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: infantry.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: infantry.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: infantry.ukraine + ProvidesCustomPrerequisite@sovietstructure: + RequiresPrerequisites: structures.soviet + Prerequisite: infantry.soviet + ProvidesCustomPrerequisite@sovietvanillastructure: + RequiresPrerequisites: structures.sovietvanilla + Prerequisite: infantry.sovietvanilla + ProvidesCustomPrerequisite@russianstructure: + RequiresPrerequisites: structures.russia + Prerequisite: infantry.russia + ProvidesCustomPrerequisite@ukrainianstructure: + RequiresPrerequisites: structures.ukraine + Prerequisite: infantry.ukraine Power: Amount: -20 @@ -1119,8 +1374,38 @@ TENT: Produces: Infantry, Soldier PrimaryBuilding: ProductionBar: - ProvidesCustomPrerequisite: + ProvidesCustomPrerequisite@barracks: Prerequisite: barracks + ProvidesCustomPrerequisite@allies: + Race: allies, england, france, germany + Prerequisite: infantry.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: infantry.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: infantry.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: infantry.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: infantry.germany + ProvidesCustomPrerequisite@alliedstructure: + RequiresPrerequisites: structures.allies + Prerequisite: infantry.allies + ProvidesCustomPrerequisite@alliedvanillastructure: + RequiresPrerequisites: structures.alliesvanilla + Prerequisite: infantry.alliesvanilla + ProvidesCustomPrerequisite@englishstructure: + RequiresPrerequisites: structures.england + Prerequisite: infantry.england + ProvidesCustomPrerequisite@frenchstructure: + RequiresPrerequisites: structures.france + Prerequisite: infantry.france + ProvidesCustomPrerequisite@germanstructure: + RequiresPrerequisites: structures.germany + Prerequisite: infantry.germany Power: Amount: -20 @@ -1157,21 +1442,24 @@ FIX: FACF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 Buildable: BuildPaletteOrder: 940 Queue: Defense - Prerequisites: ~disabled + Prerequisites: ~structures.alliesvanilla, ~techlevel.medium Tooltip: Icon: fake-icon Name: Fake Construction Yard Description: Looks like a Construction Yard. + GenericName: Construction Yard + GenericVisibility: Enemy + GenericStancePrefix: False Building: Footprint: xxx xxx xxx Dimensions: 3,3 -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 Bib: @@ -1179,28 +1467,29 @@ FACF: Image: FACT Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: WEAF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 Buildable: BuildPaletteOrder: 920 - Prerequisites: ~disabled + Prerequisites: ~structures.alliesvanilla, ~techlevel.medium Queue: Defense Tooltip: Icon: fake-icon Name: Fake War Factory Description: Looks like a War Factory. + GenericName: War Factory + GenericVisibility: Enemy + GenericStancePrefix: False Building: Footprint: xxx xxx Dimensions: 3,2 -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 Bib: @@ -1209,22 +1498,23 @@ WEAF: Image: WEAP Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: SYRF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 Buildable: BuildPaletteOrder: 900 Queue: Defense - Prerequisites: ~disabled + Prerequisites: ~structures.alliesvanilla, ~techlevel.medium Tooltip: Icon: fake-icon Name: Fake Shipyard Description: Looks like a Shipyard. + GenericName: Shipyard + GenericVisibility: Enemy + GenericStancePrefix: False TargetableBuilding: TargetTypes: Ground, Water Building: @@ -1234,21 +1524,19 @@ SYRF: TerrainTypes: Water -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 RenderBuilding: Image: SYRD Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: SPEF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 TargetableBuilding: TargetTypes: Ground, Water Buildable: @@ -1259,6 +1547,9 @@ SPEF: Icon: fake-icon Name: Fake Sub Pen Description: Looks like a Sub Pen. + GenericName: Sub Pen + GenericVisibility: Enemy + GenericStancePrefix: False Building: Footprint: xxx xxx xxx Dimensions: 3,3 @@ -1266,35 +1557,36 @@ SPEF: TerrainTypes: Water -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 RenderBuilding: Image: SPEN Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: DOMF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 Tooltip: Icon: fake-icon Name: Fake Radar Dome Description: Looks like a Radar Dome. + GenericName: Radar Dome + GenericVisibility: Enemy + GenericStancePrefix: False Buildable: BuildPaletteOrder: 930 Queue: Defense - Prerequisites: ~disabled + Prerequisites: ~structures.alliesvanilla, ~techlevel.medium Building: Footprint: xx xx Dimensions: 2,2 -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 Bib: @@ -1302,8 +1594,6 @@ DOMF: Image: DOME Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: SBAG: diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index 2d6d57aa24..cc4ffa01aa 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -420,7 +420,7 @@ MNLY.AP: Mine: MINP MineImmune: LimitedAmmo: - Ammo: 3 + Ammo: 5 DetectCloaked: Range: 5 CloakTypes: Mine @@ -454,7 +454,7 @@ MNLY.AT: Mine: MINV MineImmune: LimitedAmmo: - Ammo: 3 + Ammo: 5 DetectCloaked: Range: 5 CloakTypes: Mine @@ -635,7 +635,7 @@ DTRK: Buildable: Queue: Vehicle BuildPaletteOrder: 170 - Prerequisites: stek, ~vehicles.soviet, ~techlevel.unrestricted + Prerequisites: stek, ~vehicles.ukraine, ~techlevel.unrestricted Valued: Cost: 2500 Tooltip: @@ -666,7 +666,7 @@ CTNK: Buildable: Queue: Vehicle BuildPaletteOrder: 210 - Prerequisites: atek, pdox, ~vehicles.allies, ~techlevel.unrestricted + Prerequisites: atek, pdox, ~vehicles.germany, ~techlevel.unrestricted Valued: Cost: 1350 Tooltip: @@ -704,9 +704,9 @@ QTNK: Buildable: Queue: Vehicle BuildPaletteOrder: 200 - Prerequisites: fix, stek, ~vehicles.soviet, ~techlevel.unrestricted + Prerequisites: fix, stek, ~vehicles.russia, ~techlevel.unrestricted Valued: - Cost: 2500 + Cost: 2000 Tooltip: Name: MAD Tank Description: Deals seismic damage to nearby vehicles\nand structures.\n Strong vs Vehicles, Buildings\n Weak vs Infantry @@ -734,7 +734,7 @@ STNK: Buildable: Queue: Vehicle BuildPaletteOrder: 140 - Prerequisites: atek, ~vehicles.allies, ~techlevel.unrestricted + Prerequisites: atek, ~vehicles.england, ~techlevel.unrestricted Valued: Cost: 1350 Tooltip: diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index a5094986a2..3d9681f316 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -95,9 +95,38 @@ World: Country@0: Name: Allies Race: allies + Side: Allies + Description: Allies: Deception\nSpecial Ability: Can build fake structures Country@1: + Name: England + Race: england + Side: Allies + Description: England: Espionage\nSpecial Unit: British Spy\nSpecial Unit: Phase Transport + Country@2: + Name: France + Race: france + Side: Allies + Description: France: Concealment\nSpecial Structure: Advanced Gap Generator\nSpecial Unit: Mobile Gap Generator + Country@3: + Name: Germany + Race: germany + Side: Allies + Description: Germany: Technology\nSpecial Structure: Advanced Chronosphere\nSpecial Unit: Chrono Tank + Country@4: Name: Soviet Race: soviet + Side: Soviet + Description: Soviet: Infantry\nSpecial Ability: Paradrop\nSpecial Ability: Spy Plane + Country@5: + Name: Russia + Race: russia + Side: Soviet + Description: Russia: Tanks\nSpecial Ability: Armor Airdrop\nSpecial Unit: MAD Tank + Country@6: + Name: Ukraine + Race: ukraine + Side: Soviet + Description: Ukraine: Demolitions\nSpecial Ability: Parabombs\nSpecial Unit: Demolition Truck DomainIndex: SmudgeLayer@SCORCH: Type: Scorch @@ -139,12 +168,12 @@ World: MPStartUnits@mcvonly: Class: none ClassName: MCV Only - Races: soviet, allies + Races: allies, england, france, germany, soviet, russia, ukraine BaseActor: mcv MPStartUnits@lightallies: Class: light ClassName: Light Support - Races: allies + Races: allies, england, france, germany BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,jeep,1tnk InnerSupportRadius: 3 @@ -152,7 +181,7 @@ World: MPStartUnits@lightsoviet: Class: light ClassName: Light Support - Races: soviet + Races: soviet, russia, ukraine BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,apc,ftrk InnerSupportRadius: 3 @@ -160,7 +189,7 @@ World: MPStartUnits@heavyallies: Class: heavy ClassName: Heavy Support - Races: allies + Races: allies, england, france, germany BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,jeep,1tnk,2tnk,2tnk,2tnk InnerSupportRadius: 3 @@ -168,7 +197,7 @@ World: MPStartUnits@heavysoviet: Class: heavy ClassName: Heavy Support - Races: soviet + Races: soviet, russia, ukraine BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,apc,ftrk,3tnk,3tnk InnerSupportRadius: 3 diff --git a/mods/ra/sequences/misc.yaml b/mods/ra/sequences/misc.yaml index e101b030f7..547869035d 100644 --- a/mods/ra/sequences/misc.yaml +++ b/mods/ra/sequences/misc.yaml @@ -141,6 +141,10 @@ beacon: Start: 0 Length: * Offset: 0,-42 + armordropicon: lores-pinficon + Start: 0 + Length: * + Offset: 0,-42 clock: beaconclock Start: 0 Length: * @@ -516,6 +520,8 @@ icon: Start: 0 paratroopers: pinficon Start: 0 + armordrop: armordropicon + Start: 0 gps: gpssicon Start: 0 parabombs: pbmbicon diff --git a/mods/ra/uibits/buttons.png b/mods/ra/uibits/buttons.png index 16b9674eb6..e98f5306e1 100644 Binary files a/mods/ra/uibits/buttons.png and b/mods/ra/uibits/buttons.png differ diff --git a/mods/ra/voices.yaml b/mods/ra/voices.yaml index 39d5ebd718..cd628a67d7 100644 --- a/mods/ra/voices.yaml +++ b/mods/ra/voices.yaml @@ -1,7 +1,12 @@ GenericVoice: Variants: - soviet: .r01,.r03 allies: .v01,.v03 + england: .v01,.v03 + france: .v01,.v03 + germany: .v01,.v03 + soviet: .r01,.r03 + russia: .r01,.r03 + ukraine: .r01,.r03 Voices: Select: await1,ready,report1,yessir1 Move: ackno,affirm1,noprob,overout,ritaway,roger,ugotit @@ -12,8 +17,13 @@ GenericVoice: VehicleVoice: Variants: - soviet: .r00,.r02 allies: .v00,.v02 + england: .v00,.v02 + france: .v00,.v02 + germany: .v00,.v02 + soviet: .r00,.r02 + russia: .r00,.r02 + ukraine: .r00,.r02 Voices: Select: vehic1,yessir1,report1,await1 Move: ackno,affirm1 diff --git a/mods/ra/weapons.yaml b/mods/ra/weapons.yaml index 3cf3f2fa20..b92d0ee5ca 100644 --- a/mods/ra/weapons.yaml +++ b/mods/ra/weapons.yaml @@ -1109,9 +1109,8 @@ ParaBomb: Velocity: 43 Acceleration: 0 Warhead@1Dam: SpreadDamage - Spread: 256 - Damage: 50 - Falloff: 1000, 368, 135, 50, 18, 7, 0 + Spread: 768 + Damage: 300 DeathType: 4 Versus: None: 30