From 69d9bbb400e6d1e712c56d58caeaf422bbff2e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 14 Apr 2024 13:27:46 +0200 Subject: [PATCH] Unhardcode support power blocked cursor. --- .../GrantExternalConditionPower.cs | 4 -- .../Traits/SupportPowers/NukePower.cs | 2 +- .../SupportPowers/SelectDirectionalTarget.cs | 2 +- .../Traits/SupportPowers/SpawnActorPower.cs | 3 -- .../Traits/SupportPowers/SupportPower.cs | 6 ++- .../SupportPowers/SupportPowerManager.cs | 8 ++-- .../20231010/AddSupportPowerBlockedCursor.cs | 38 +++++++++++++++++++ OpenRA.Mods.Common/UpdateRules/UpdatePath.cs | 1 + mods/ra/maps/bomber-john/rules.yaml | 1 + mods/ra/rules/misc.yaml | 1 + mods/ra/rules/structures.yaml | 1 + 11 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 OpenRA.Mods.Common/UpdateRules/Rules/20231010/AddSupportPowerBlockedCursor.cs diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs index bc2cc971a9..f159baa795 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs @@ -47,10 +47,6 @@ namespace OpenRA.Mods.Common.Traits "This requires the actor to have the WithSpriteBody trait or one of its derivatives.")] public readonly string Sequence = "active"; - [CursorReference] - [Desc("Cursor to display when there are no units to apply the condition in range.")] - public readonly string BlockedCursor = "move-blocked"; - public readonly string FootprintImage = "overlay"; [SequenceReference(nameof(FootprintImage))] diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs index 55830e35e5..a7a3307622 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs @@ -219,7 +219,7 @@ namespace OpenRA.Mods.Common.Traits readonly NukePowerInfo info; public SelectNukePowerTarget(string order, SupportPowerManager manager, NukePowerInfo info, MouseButton button) - : base(order, manager, info.Cursor, button) + : base(order, manager, info, button) { this.info = info; } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SelectDirectionalTarget.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SelectDirectionalTarget.cs index 6aca3ec2cd..2e23705f0c 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SelectDirectionalTarget.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SelectDirectionalTarget.cs @@ -116,7 +116,7 @@ namespace OpenRA.Mods.Common.Traits string IOrderGenerator.GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { - return world.Map.Contains(cell) ? cursor : "generic-blocked"; + return world.Map.Contains(cell) ? info.Cursor : info.BlockedCursor; } bool IOrderGenerator.HandleKeyPress(KeyInput e) { return false; } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SpawnActorPower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SpawnActorPower.cs index 737f1fbada..b08a1d4834 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SpawnActorPower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SpawnActorPower.cs @@ -46,9 +46,6 @@ namespace OpenRA.Mods.Common.Traits [PaletteReference] public readonly string EffectPalette = null; - [Desc("Cursor to display when the location is unsuitable.")] - public readonly string BlockedCursor = "move-blocked"; - public override object Create(ActorInitializer init) { return new SpawnActorPower(init.Self, this); } } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs index b49c43c925..bc17fdec01 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs @@ -46,6 +46,10 @@ namespace OpenRA.Mods.Common.Traits [Desc("Cursor to display for using this support power.")] public readonly string Cursor = "ability"; + [CursorReference] + [Desc("Cursor when unable to activate on this position. ")] + public readonly string BlockedCursor = "generic-blocked"; + [Desc("If set to true, the support power will be fully charged when it becomes available. " + "Normal rules apply for subsequent charges.")] public readonly bool StartFullyCharged = false; @@ -209,7 +213,7 @@ namespace OpenRA.Mods.Common.Traits public virtual void SelectTarget(Actor self, string order, SupportPowerManager manager) { - self.World.OrderGenerator = new SelectGenericPowerTarget(order, manager, info.Cursor, MouseButton.Left); + self.World.OrderGenerator = new SelectGenericPowerTarget(order, manager, info, MouseButton.Left); } public virtual void Activate(Actor self, Order order, SupportPowerManager manager) diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs index 5fa46f4cd9..19e46b7a11 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs @@ -283,12 +283,12 @@ namespace OpenRA.Mods.Common.Traits public class SelectGenericPowerTarget : OrderGenerator { readonly SupportPowerManager manager; - readonly string cursor; + readonly SupportPowerInfo info; readonly MouseButton expectedButton; public string OrderKey { get; } - public SelectGenericPowerTarget(string order, SupportPowerManager manager, string cursor, MouseButton button) + public SelectGenericPowerTarget(string order, SupportPowerManager manager, SupportPowerInfo info, MouseButton button) { // Clear selection if using Left-Click Orders if (Game.Settings.Game.UseClassicMouseStyle) @@ -296,7 +296,7 @@ namespace OpenRA.Mods.Common.Traits this.manager = manager; OrderKey = order; - this.cursor = cursor; + this.info = info; expectedButton = button; } @@ -319,7 +319,7 @@ namespace OpenRA.Mods.Common.Traits protected override IEnumerable RenderAnnotations(WorldRenderer wr, World world) { yield break; } protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { - return world.Map.Contains(cell) ? cursor : "generic-blocked"; + return world.Map.Contains(cell) ? info.Cursor : info.BlockedCursor; } } } diff --git a/OpenRA.Mods.Common/UpdateRules/Rules/20231010/AddSupportPowerBlockedCursor.cs b/OpenRA.Mods.Common/UpdateRules/Rules/20231010/AddSupportPowerBlockedCursor.cs new file mode 100644 index 0000000000..38b6b3f075 --- /dev/null +++ b/OpenRA.Mods.Common/UpdateRules/Rules/20231010/AddSupportPowerBlockedCursor.cs @@ -0,0 +1,38 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * 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, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; + +namespace OpenRA.Mods.Common.UpdateRules.Rules +{ + public class AddSupportPowerBlockedCursor : UpdateRule + { + public override string Name => "Add SpawnActorPower/GrantExternalConditionPower BlockedCursor."; + + public override string Description => + "SpawnActorPower and GrantExternalConditionPower field BlockedCursor changed its default value."; + + public override IEnumerable UpdateActorNode(ModData modData, MiniYamlNodeBuilder actorNode) + { + foreach (var power in new List { "SpawnActorPower", "GrantExternalConditionPower" }) + { + foreach (var spawnActorPower in actorNode.ChildrenMatching(power)) + { + var cursor = spawnActorPower.LastChildMatching("BlockedCursor"); + if (cursor != null && !cursor.IsRemoval()) + yield break; + var blockedCursorNode = new MiniYamlNodeBuilder("BlockedCursor", new MiniYamlBuilder("move-blocked")); + spawnActorPower.AddNode(blockedCursorNode); + } + } + } + } +} diff --git a/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs b/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs index bb504b32b3..58718c7d42 100644 --- a/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs +++ b/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs @@ -87,6 +87,7 @@ namespace OpenRA.Mods.Common.UpdateRules new RemoveConyardChronoReturnAnimation(), new RemoveEditorSelectionLayerProperties(), new AddMarkerLayerOverlay(), + new AddSupportPowerBlockedCursor(), // Execute these rules last to avoid premature yaml merge crashes. new ReplaceCloakPalette(), diff --git a/mods/ra/maps/bomber-john/rules.yaml b/mods/ra/maps/bomber-john/rules.yaml index 93ebe932fd..5f50ebf178 100644 --- a/mods/ra/maps/bomber-john/rules.yaml +++ b/mods/ra/maps/bomber-john/rules.yaml @@ -110,6 +110,7 @@ Player: OnFireSound: ironcur9.aud Dimensions: 3, 3 Footprint: _x_ xxx _x_ + BlockedCursor: move-blocked Production: Produces: Building LobbyPrerequisiteCheckbox@GLOBALBOUNTY: diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml index 7c9035b66b..31e843745b 100644 --- a/mods/ra/rules/misc.yaml +++ b/mods/ra/rules/misc.yaml @@ -382,6 +382,7 @@ powerproxy.sonarpulse: EffectPalette: moveflash SupportPowerPaletteOrder: 80 EffectSequence: idle + BlockedCursor: move-blocked powerproxy.paratroopers: AlwaysVisible: diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index d3ef5fc4d8..ca8851fbed 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -450,6 +450,7 @@ IRON: SupportPowerPaletteOrder: 10 Dimensions: 3, 3 Footprint: _x_ xxx _x_ + BlockedCursor: move-blocked SupportPowerChargeBar: InfiltrateForSupportPowerReset: Types: SpyInfiltrate