diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index b4dc3ae87c..891e8c8839 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -331,6 +331,7 @@ + diff --git a/OpenRA.Mods.Common/Traits/CashTrickler.cs b/OpenRA.Mods.Common/Traits/CashTrickler.cs index bbc181e704..741bbbc000 100644 --- a/OpenRA.Mods.Common/Traits/CashTrickler.cs +++ b/OpenRA.Mods.Common/Traits/CashTrickler.cs @@ -15,7 +15,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Lets the actor generate cash in a set periodic time.")] - class CashTricklerInfo : ITraitInfo + class CashTricklerInfo : ConditionalTraitInfo { [Desc("Number of ticks to wait between giving money.")] public readonly int Period = 50; @@ -23,23 +23,25 @@ namespace OpenRA.Mods.Common.Traits public readonly int Amount = 15; [Desc("Whether to show the cash tick indicators (+$15 rising from actor).")] public readonly bool ShowTicks = true; - [Desc("Amount of money awarded for capturing the actor.")] - public readonly int CaptureAmount = 0; - public object Create(ActorInitializer init) { return new CashTrickler(this); } + public override object Create(ActorInitializer init) { return new CashTrickler(this); } } - class CashTrickler : ITick, ISync, INotifyCapture + class CashTrickler : ConditionalTrait, ITick, ISync { readonly CashTricklerInfo info; [Sync] int ticks; public CashTrickler(CashTricklerInfo info) + : base(info) { this.info = info; } public void Tick(Actor self) { + if (IsTraitDisabled) + return; + if (--ticks < 0) { ticks = info.Period; @@ -48,15 +50,6 @@ namespace OpenRA.Mods.Common.Traits } } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) - { - if (info.CaptureAmount > 0) - { - newOwner.PlayerActor.Trait().GiveCash(info.CaptureAmount); - MaybeAddCashTick(self, info.CaptureAmount); - } - } - void MaybeAddCashTick(Actor self, int amount) { if (info.ShowTicks) diff --git a/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs b/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs new file mode 100644 index 0000000000..3e6d572ac7 --- /dev/null +++ b/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs @@ -0,0 +1,70 @@ +#region Copyright & License Information +/* + * Copyright 2007-2017 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, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common.Effects; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Lets the actor grant cash when captured.")] + public class GivesCashOnCaptureInfo : ConditionalTraitInfo + { + [Desc("Whether to show the cash tick indicators rising from the actor.")] + public readonly bool ShowTicks = true; + + [Desc("How long to show the Amount tick indicator when enabled.")] + public readonly int DisplayDuration = 30; + + [Desc("Amount of money awarded for capturing the actor.")] + public readonly int Amount = 0; + + public override object Create(ActorInitializer init) { return new GivesCashOnCapture(this); } + } + + public class GivesCashOnCapture : ConditionalTrait, INotifyCapture + { + readonly GivesCashOnCaptureInfo info; + + public GivesCashOnCapture(GivesCashOnCaptureInfo info) + : base(info) + { + this.info = info; + } + + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + { + if (IsTraitDisabled) + return; + + var resources = newOwner.PlayerActor.Trait(); + var amount = info.Amount; + + if (amount < 0) + { + // Check whether the amount of cash to be removed would exceed available player cash, in that case only remove all the player cash + amount = Math.Min(resources.Cash + resources.Resources, -amount); + resources.TakeCash(amount); + + // For correct cash tick display + amount = -amount; + } + else + resources.GiveCash(amount); + + if (!info.ShowTicks) + return; + + self.World.AddFrameEndTask(w => w.Add( + new FloatingText(self.CenterPosition, self.Owner.Color.RGB, FloatingText.FormatCashTick(amount), info.DisplayDuration))); + } + } +} diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index b04f124f06..0f6a1dff81 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -720,6 +720,29 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + // Capture bonus was decoupled from CashTrickler to a separate trait. + if (engineVersion < 20170108 && depth == 0) + { + var trickler = node.Value.Nodes.FirstOrDefault(n => n.Key == "CashTrickler"); + if (trickler != null) + { + var capture = trickler.Value.Nodes.FirstOrDefault(n => n.Key == "CaptureAmount"); + if (capture != null) + { + var gcoc = new MiniYamlNode("GivesCashOnCapture", ""); + gcoc.Value.Nodes.Add(capture); + trickler.Value.Nodes.Remove(capture); + + var show = trickler.Value.Nodes.FirstOrDefault(n => n.Key == "ShowTicks"); + if (show != null) + gcoc.Value.Nodes.Add(show); + + node.Value.Nodes.Add(gcoc); + RenameNodeKey(capture, "Amount"); + } + } + } + UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); } diff --git a/mods/ra/rules/civilian.yaml b/mods/ra/rules/civilian.yaml index ddad7f75cf..92b5a43b0e 100644 --- a/mods/ra/rules/civilian.yaml +++ b/mods/ra/rules/civilian.yaml @@ -366,13 +366,14 @@ OILB: CashTrickler: Period: 375 Amount: 100 - CaptureAmount: 100 Tooltip: Name: Oil Derrick Explodes: Weapon: BarrelExplode GpsDot: String: Oil + GivesCashOnCapture: + Amount: 100 BR1: Inherits: ^Bridge