diff --git a/OpenRA.Mods.RA/Effects/Parachute.cs b/OpenRA.Mods.RA/Effects/Parachute.cs index 1767e334a7..b614161533 100644 --- a/OpenRA.Mods.RA/Effects/Parachute.cs +++ b/OpenRA.Mods.RA/Effects/Parachute.cs @@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA.Effects { public class Parachute : IEffect { - readonly Animation paraAnim; + readonly Animation parachute; readonly WVec parachuteOffset; readonly Actor cargo; WPos pos; @@ -29,9 +29,12 @@ namespace OpenRA.Mods.RA.Effects this.cargo = cargo; var parachutableInfo = cargo.Info.Traits.GetOrDefault(); - var sprite = parachutableInfo != null ? parachutableInfo.ParachuteSprite : "parach"; - paraAnim = new Animation(cargo.World, sprite); - paraAnim.PlayThen("open", () => paraAnim.PlayRepeating("idle")); + var parachuteSprite = parachutableInfo != null ? parachutableInfo.ParachuteSequence : null; + if (parachuteSprite != null) + { + parachute = new Animation(cargo.World, parachuteSprite); + parachute.PlayThen("open", () => parachute.PlayRepeating("idle")); + } if (parachutableInfo != null) parachuteOffset = parachutableInfo.ParachuteOffset; @@ -44,7 +47,8 @@ namespace OpenRA.Mods.RA.Effects public void Tick(World world) { - paraAnim.Tick(); + if (parachute != null) + parachute.Tick(); pos -= fallRate; @@ -79,8 +83,9 @@ namespace OpenRA.Mods.RA.Effects yield return c.OffsetBy(pos - c.Pos); } - foreach (var r in paraAnim.Render(pos, parachuteOffset, 1, rc.First().Palette, 1f)) - yield return r; + if (parachute != null) + foreach (var r in parachute.Render(pos, parachuteOffset, 1, rc.First().Palette, 1f)) + yield return r; } } } diff --git a/OpenRA.Mods.RA/Parachutable.cs b/OpenRA.Mods.RA/Parachutable.cs index 75e2586b67..76a1b9eeba 100644 --- a/OpenRA.Mods.RA/Parachutable.cs +++ b/OpenRA.Mods.RA/Parachutable.cs @@ -26,7 +26,8 @@ namespace OpenRA.Mods.RA public readonly string WaterCorpseSequence = "small_splash"; public readonly string WaterCorpsePalette = "effect"; - public readonly string ParachuteSprite = "parach"; + [Desc("Requires the sub-sequences \"open\" and \"idle\".")] + public readonly string ParachuteSequence = null; public readonly WVec ParachuteOffset = WVec.Zero; public object Create(ActorInitializer init) { return new Parachutable(init, this); } diff --git a/OpenRA.Utility/UpgradeRules.cs b/OpenRA.Utility/UpgradeRules.cs index 80c7df9c69..12551fb493 100644 --- a/OpenRA.Utility/UpgradeRules.cs +++ b/OpenRA.Utility/UpgradeRules.cs @@ -263,6 +263,9 @@ namespace OpenRA.Utility if (subnode.Key == "Offset") subnode.Key = "ParachuteOffset"; } + + if (depth == 2 && node.Key == "ParachuteSprite") + node.Key = "ParachuteSequence"; } UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); diff --git a/mods/d2k/bits/parach.shp b/mods/d2k/bits/parach.shp deleted file mode 100644 index 6ab15cd9ca..0000000000 Binary files a/mods/d2k/bits/parach.shp and /dev/null differ diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index ea847021f2..5d3eeba251 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -177,6 +177,8 @@ InfDeaths: 6 Parachutable: ParachuteOffset: 0,0,427 + KilledOnImpassableTerrain: true + ParachuteSequence: parach ^Ship: AppearsOnRadar: diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml index ba8c2109f7..93051c793f 100644 --- a/mods/ra/rules/misc.yaml +++ b/mods/ra/rules/misc.yaml @@ -60,6 +60,9 @@ CRATE: Crate: Lifetime: 120 TerrainTypes: Clear, Rough, Road, Water, Ore, Beach + Parachutable: + KilledOnImpassableTerrain: false + ParachuteSequence: parach GiveCashCrateAction: Amount: 1000 SelectionShares: 50