diff --git a/OpenRA.Mods.RA/Effects/Parachute.cs b/OpenRA.Mods.RA/Effects/Parachute.cs index cf94fe6e18..3f86af57e6 100644 --- a/OpenRA.Mods.RA/Effects/Parachute.cs +++ b/OpenRA.Mods.RA/Effects/Parachute.cs @@ -20,6 +20,7 @@ namespace OpenRA.Mods.RA.Effects { readonly ParachutableInfo parachutableInfo; readonly Animation parachute; + readonly Animation shadow; readonly WVec parachuteOffset; readonly Actor cargo; WPos pos; @@ -37,6 +38,13 @@ namespace OpenRA.Mods.RA.Effects parachute.PlayThen("open", () => parachute.PlayRepeating("idle")); } + var shadowSprite = parachutableInfo != null ? parachutableInfo.ShadowSequence : null; + if (shadowSprite != null) + { + shadow = new Animation(cargo.World, shadowSprite); + shadow.PlayRepeating("idle"); + } + if (parachutableInfo != null) parachuteOffset = parachutableInfo.ParachuteOffset; @@ -51,6 +59,9 @@ namespace OpenRA.Mods.RA.Effects if (parachute != null) parachute.Tick(); + if (shadow != null) + shadow.Tick(); + pos -= fallRate; if (pos.Z <= 0) @@ -75,18 +86,23 @@ namespace OpenRA.Mods.RA.Effects if (!rc.Any()) yield break; - var shadow = wr.Palette(parachutableInfo.ParachuteShadowPalette); + var parachuteShadowPalette = wr.Palette(parachutableInfo.ParachuteShadowPalette); foreach (var c in rc) { - if (!c.IsDecoration) - yield return c.WithPalette(shadow).WithZOffset(c.ZOffset - 1).AsDecoration(); + if (!c.IsDecoration && shadow == null) + yield return c.WithPalette(parachuteShadowPalette).WithZOffset(c.ZOffset - 1).AsDecoration(); yield return c.OffsetBy(pos - c.Pos); } - var palette = !string.IsNullOrEmpty(parachutableInfo.ParachutePalette) ? wr.Palette(parachutableInfo.ParachutePalette) : rc.First().Palette; + var shadowPalette = !string.IsNullOrEmpty(parachutableInfo.ShadowPalette) ? wr.Palette(parachutableInfo.ShadowPalette) : rc.First().Palette; + if (shadow != null) + foreach (var r in shadow.Render(pos, parachuteOffset, 1, shadowPalette, 1f)) + yield return r; + + var parachutePalette = !string.IsNullOrEmpty(parachutableInfo.ParachutePalette) ? wr.Palette(parachutableInfo.ParachutePalette) : rc.First().Palette; if (parachute != null) - foreach (var r in parachute.Render(pos, parachuteOffset, 1, palette, 1f)) + foreach (var r in parachute.Render(pos, parachuteOffset, 1, parachutePalette, 1f)) yield return r; } } diff --git a/OpenRA.Mods.RA/Parachutable.cs b/OpenRA.Mods.RA/Parachutable.cs index e4d630d3f9..b8d0d39c44 100644 --- a/OpenRA.Mods.RA/Parachutable.cs +++ b/OpenRA.Mods.RA/Parachutable.cs @@ -28,10 +28,18 @@ namespace OpenRA.Mods.RA [Desc("Requires the sub-sequences \"open\" and \"idle\".")] public readonly string ParachuteSequence = null; + [Desc("Optional, otherwise defaults to the palette the actor is using.")] public readonly string ParachutePalette = null; + [Desc("Used to clone the actor with this palette and render it with a visual offset below.")] public readonly string ParachuteShadowPalette = "shadow"; + public readonly WVec ParachuteOffset = WVec.Zero; + [Desc("Alternative to ParachuteShadowPalette which disables it and allows to set a custom sprite sequence instead.")] + public readonly string ShadowSequence = null; + [Desc("Optional, otherwise defaults to the palette the actor is using.")] + public readonly string ShadowPalette = null; + public object Create(ActorInitializer init) { return new Parachutable(init, this); } } diff --git a/mods/ra/bits/parach-shadow.shp b/mods/ra/bits/parach-shadow.shp new file mode 100644 index 0000000000..7d848c88a4 Binary files /dev/null and b/mods/ra/bits/parach-shadow.shp differ diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 5d3eeba251..0f5d0eac3d 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -179,6 +179,7 @@ ParachuteOffset: 0,0,427 KilledOnImpassableTerrain: true ParachuteSequence: parach + ShadowSequence: parach-shadow ^Ship: AppearsOnRadar: diff --git a/mods/ra/sequences/misc.yaml b/mods/ra/sequences/misc.yaml index c18d94299d..1092fbf7ae 100644 --- a/mods/ra/sequences/misc.yaml +++ b/mods/ra/sequences/misc.yaml @@ -370,6 +370,11 @@ parach: Start: 5 Length: 11 +parach-shadow: + idle: + Start: 0 + Length: * + atomicup: idle: Start: 0