diff --git a/OpenRA.Mods.Common/Traits/SmokeTrailWhenDamaged.cs b/OpenRA.Mods.Common/Traits/SmokeTrailWhenDamaged.cs deleted file mode 100644 index 98e60175cb..0000000000 --- a/OpenRA.Mods.Common/Traits/SmokeTrailWhenDamaged.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2020 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.Mods.Common.Traits.Render; -using OpenRA.Traits; - -namespace OpenRA.Mods.Common.Traits -{ - class SmokeTrailWhenDamagedInfo : TraitInfo, Requires - { - [Desc("Position relative to body")] - public readonly WVec Offset = WVec.Zero; - - public readonly int Interval = 3; - - public readonly string Sprite = "smokey"; - - [SequenceReference(nameof(Sprite))] - public readonly string Sequence = "idle"; - - public readonly string Palette = "effect"; - - public readonly DamageState MinDamage = DamageState.Heavy; - - public override object Create(ActorInitializer init) { return new SmokeTrailWhenDamaged(init.Self, this); } - } - - class SmokeTrailWhenDamaged : ITick - { - readonly SmokeTrailWhenDamagedInfo info; - readonly BodyOrientation body; - readonly Func getFacing; - int ticks; - - public SmokeTrailWhenDamaged(Actor self, SmokeTrailWhenDamagedInfo info) - { - this.info = info; - body = self.Trait(); - getFacing = RenderSprites.MakeFacingFunc(self); - } - - void ITick.Tick(Actor self) - { - if (--ticks <= 0) - { - var position = self.CenterPosition; - if (position.Z > 0 && self.GetDamageState() >= info.MinDamage && !self.World.FogObscures(self)) - { - var offset = info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation)); - var pos = position + body.LocalToWorld(offset); - self.World.AddFrameEndTask(w => w.Add(new SpriteEffect(pos, getFacing(), w, info.Sprite, info.Sequence, info.Palette))); - } - - ticks = info.Interval; - } - } - } -} diff --git a/OpenRA.Mods.Common/UpdateRules/Rules/20201213/RemoveSmokeTrailWhenDamaged.cs b/OpenRA.Mods.Common/UpdateRules/Rules/20201213/RemoveSmokeTrailWhenDamaged.cs new file mode 100644 index 0000000000..0a25bad053 --- /dev/null +++ b/OpenRA.Mods.Common/UpdateRules/Rules/20201213/RemoveSmokeTrailWhenDamaged.cs @@ -0,0 +1,105 @@ +#region Copyright & License Information +/* + * Copyright 2007-2021 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.Collections.Generic; +using System.Linq; + +namespace OpenRA.Mods.Common.UpdateRules.Rules +{ + public class RemoveSmokeTrailWhenDamaged : UpdateRule + { + public override string Name { get { return "'SmokeTrailWhenDamaged' has been removed in favor of using 'LeavesTrails'."; } } + public override string Description + { + get + { + return "'SmokeTrailWhenDamaged' was removed."; + } + } + + readonly Dictionary> locations = new Dictionary>(); + + public override IEnumerable AfterUpdate(ModData modData) + { + if (locations.Any()) + yield return "Some actor(s) defined a MinDamage of neither 'Heavy' nor 'Undamaged' on SmokeTrailWhenDamaged before update.\n" + + "Review the following definitions and add custom GrandConditionOnDamageState configs as required:\n" + + UpdateUtils.FormatMessageList(locations.Select( + kv => kv.Key + ":\n" + UpdateUtils.FormatMessageList(kv.Value))); + + locations.Clear(); + } + + public override IEnumerable UpdateActorNode(ModData modData, MiniYamlNode actorNode) + { + var locationKey = "{0} ({1})".F(actorNode.Key, actorNode.Location.Filename); + var anyConditionalSmokeTrail = false; + + foreach (var smokeTrail in actorNode.ChildrenMatching("SmokeTrailWhenDamaged")) + { + var spriteNode = smokeTrail.LastChildMatching("Sprite"); + if (spriteNode != null) + smokeTrail.RenameChildrenMatching("Sprite", "Image"); + else + smokeTrail.AddNode("Image", FieldSaver.FormatValue("smokey")); + + var intervalNode = smokeTrail.LastChildMatching("Interval"); + if (intervalNode != null) + { + var interval = intervalNode.NodeValue(); + smokeTrail.RenameChildrenMatching("Interval", "MovingInterval"); + smokeTrail.AddNode("StationaryInterval", FieldSaver.FormatValue(interval)); + } + else + { + smokeTrail.AddNode("MovingInterval", FieldSaver.FormatValue(3)); + smokeTrail.AddNode("StationaryInterval", FieldSaver.FormatValue(3)); + } + + var minDamageNode = smokeTrail.LastChildMatching("MinDamage"); + var isConditional = true; + if (minDamageNode != null) + { + var minDamage = minDamageNode.NodeValue(); + if (minDamage == "Undamaged") + isConditional = false; + else if (minDamage != "Heavy") + locations.GetOrAdd(locationKey).Add(smokeTrail.Key); + + smokeTrail.RemoveNode(minDamageNode); + } + + smokeTrail.AddNode("SpawnAtLastPosition", FieldSaver.FormatValue(false)); + smokeTrail.AddNode("TrailWhileStationary", FieldSaver.FormatValue(true)); + smokeTrail.AddNode("Type", FieldSaver.FormatValue("CenterPosition")); + + if (isConditional) + { + smokeTrail.AddNode("RequiresCondition", FieldSaver.FormatValue("enable-smoke")); + anyConditionalSmokeTrail = true; + } + + smokeTrail.RenameChildrenMatching("Sequence", "Sequences"); + smokeTrail.RenameChildrenMatching("Offset", "Offsets"); + smokeTrail.RenameKey("LeavesTrails"); + } + + if (anyConditionalSmokeTrail) + { + var grantCondition = new MiniYamlNode("GrantConditionOnDamageState@SmokeTrail", ""); + grantCondition.AddNode("Condition", FieldSaver.FormatValue("enable-smoke")); + actorNode.AddNode(grantCondition); + } + + yield break; + } + } +} diff --git a/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs b/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs index c15fe60b4f..a27d43f449 100644 --- a/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs +++ b/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs @@ -93,6 +93,7 @@ namespace OpenRA.Mods.Common.UpdateRules new ReplaceResourceValueModifiers(), new RemoveResourceType(), new ConvertBoundsToWDist(), + new RemoveSmokeTrailWhenDamaged(), }) }; diff --git a/mods/ra/rules/aircraft.yaml b/mods/ra/rules/aircraft.yaml index 862f4f97e6..b146fb59bc 100644 --- a/mods/ra/rules/aircraft.yaml +++ b/mods/ra/rules/aircraft.yaml @@ -24,16 +24,26 @@ BADR: Offset: -432,-560,0 SpawnActorOnDeath: Actor: BADR.Husk - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition + RequiresCondition: enable-smoke + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition + RequiresCondition: enable-smoke -EjectOnDeath: RejectsOrders: GivesExperience: Experience: 1000 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke BADR.Bomber: Inherits: BADR @@ -103,9 +113,13 @@ MIG: Offset: -598,683,0 SpawnActorOnDeath: Actor: MIG.Husk - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition + RequiresCondition: enable-smoke ProducibleWithLevel: Prerequisites: aircraft.upgraded Rearmable: @@ -114,6 +128,8 @@ MIG: Position: BottomLeft Margin: 4, 3 RequiresSelection: true + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke YAK: Inherits: ^Plane @@ -173,9 +189,13 @@ YAK: Offset: -853,0,0 SpawnActorOnDeath: Actor: YAK.Husk - SmokeTrailWhenDamaged: - Offset: -853,0,0 - Interval: 2 + LeavesTrails: + Offsets: -853,0,0 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition + RequiresCondition: enable-smoke ProducibleWithLevel: Prerequisites: aircraft.upgraded Selectable: @@ -187,6 +207,8 @@ YAK: Margin: 4, 3 RequiresSelection: true PipCount: 6 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke TRAN: Inherits: ^Helicopter @@ -299,8 +321,15 @@ HELI: AmmoCondition: ammo SpawnActorOnDeath: Actor: HELI.Husk - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + SpawnAtLastPosition: False + Type: CenterPosition + RequiresCondition: enable-smoke + TrailWhileStationary: True + StationaryInterval: 3 ProducibleWithLevel: Prerequisites: aircraft.upgraded Selectable: @@ -311,6 +340,8 @@ HELI: Position: BottomLeft Margin: 4, 3 RequiresSelection: true + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke HIND: Inherits: ^Helicopter @@ -372,8 +403,15 @@ HIND: WithMuzzleOverlay: SpawnActorOnDeath: Actor: HIND.Husk - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + SpawnAtLastPosition: False + Type: CenterPosition + RequiresCondition: enable-smoke + TrailWhileStationary: True + StationaryInterval: 3 ProducibleWithLevel: Prerequisites: aircraft.upgraded Selectable: @@ -385,6 +423,8 @@ HIND: Margin: 4, 3 RequiresSelection: true PipCount: 6 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke U2: Inherits: ^NeutralPlane @@ -408,12 +448,18 @@ U2: Offset: -725,-683,0 SpawnActorOnDeath: Actor: U2.Husk - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition + RequiresCondition: enable-smoke RejectsOrders: Interactable: -MapEditorData: + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke MH60: Inherits: ^Helicopter @@ -474,8 +520,15 @@ MH60: WithMuzzleOverlay: SpawnActorOnDeath: Actor: MH60.Husk - SmokeTrailWhenDamaged: - Offset: -427,0,0 + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + SpawnAtLastPosition: False + Type: CenterPosition + RequiresCondition: enable-smoke + TrailWhileStationary: True + StationaryInterval: 3 ProducibleWithLevel: Prerequisites: aircraft.upgraded Selectable: @@ -487,3 +540,5 @@ MH60: Margin: 4, 3 RequiresSelection: true PipCount: 6 + GrantConditionOnDamageState@SmokeTrail: + Condition: enable-smoke diff --git a/mods/ra/rules/husks.yaml b/mods/ra/rules/husks.yaml index 59d62efea0..4317efa42d 100644 --- a/mods/ra/rules/husks.yaml +++ b/mods/ra/rules/husks.yaml @@ -135,14 +135,18 @@ BADR.Husk: Aircraft: TurnSpeed: 20 Speed: 149 - SmokeTrailWhenDamaged@0: - Offset: -432,560,0 - Interval: 2 - MinDamage: Undamaged - SmokeTrailWhenDamaged@1: - Offset: -432,-560,0 - Interval: 2 - MinDamage: Undamaged + LeavesTrails@0: + Offsets: -432,560,0 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition + LeavesTrails@1: + Offsets: -432,-560,0 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition RenderSprites: Image: badr -RevealOnDeath: @@ -158,10 +162,12 @@ MIG.Husk: Aircraft: TurnSpeed: 20 Speed: 186 - SmokeTrailWhenDamaged: - Offset: -853,0,171 - Interval: 2 - MinDamage: Undamaged + LeavesTrails: + Offsets: -853,0,171 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition RevealsShroud: MinRange: 11c0 Range: 13c0 @@ -182,10 +188,12 @@ YAK.Husk: Aircraft: TurnSpeed: 20 Speed: 149 - SmokeTrailWhenDamaged: - Offset: -853,0,0 - Interval: 2 - MinDamage: Undamaged + LeavesTrails: + Offsets: -853,0,0 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition RevealsShroud: MinRange: 9c0 Range: 11c0 @@ -207,9 +215,14 @@ HELI.Husk: WithIdleOverlay: Offset: 0,0,85 Sequence: rotor - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + SpawnAtLastPosition: False + Type: CenterPosition + TrailWhileStationary: True + StationaryInterval: 3 RevealsShroud: MinRange: 10c0 Range: 12c0 @@ -230,9 +243,14 @@ HIND.Husk: Speed: 112 WithIdleOverlay: Sequence: rotor - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + SpawnAtLastPosition: False + Type: CenterPosition + TrailWhileStationary: True + StationaryInterval: 3 RevealsShroud: MinRange: 8c0 Range: 10c0 @@ -255,10 +273,12 @@ U2.Husk: Offset: -725,683,0 Contrail@2: Offset: -725,-683,0 - SmokeTrailWhenDamaged: - Offset: -1c43,0,0 - Interval: 2 - MinDamage: Undamaged + LeavesTrails: + Offsets: -1c43,0,0 + MovingInterval: 2 + Image: smokey + SpawnAtLastPosition: False + Type: CenterPosition RenderSprites: Image: u2 @@ -442,9 +462,14 @@ MH60.Husk: Speed: 112 WithIdleOverlay: Sequence: rotor - SmokeTrailWhenDamaged: - Offset: -427,0,0 - MinDamage: Undamaged + LeavesTrails: + Offsets: -427,0,0 + Image: smokey + MovingInterval: 3 + SpawnAtLastPosition: False + Type: CenterPosition + TrailWhileStationary: True + StationaryInterval: 3 RevealsShroud: MinRange: 8c0 Range: 10c0 diff --git a/mods/ts/rules/aircraft.yaml b/mods/ts/rules/aircraft.yaml index 76630e0843..e9d9c6761c 100644 --- a/mods/ts/rules/aircraft.yaml +++ b/mods/ts/rules/aircraft.yaml @@ -63,9 +63,11 @@ DPOD2: HitShape: Interactable: WithShadow: - SmokeTrailWhenDamaged: - Sprite: largesmoke - MinDamage: Undamaged + LeavesTrails: + Image: largesmoke + MovingInterval: 3 + SpawnAtLastPosition: False + Type: CenterPosition FallsToEarth: Explosion: DropPodExplode Moves: true