@@ -20,6 +20,7 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
{
|
{
|
||||||
readonly ParachutableInfo parachutableInfo;
|
readonly ParachutableInfo parachutableInfo;
|
||||||
readonly Animation parachute;
|
readonly Animation parachute;
|
||||||
|
readonly Animation shadow;
|
||||||
readonly WVec parachuteOffset;
|
readonly WVec parachuteOffset;
|
||||||
readonly Actor cargo;
|
readonly Actor cargo;
|
||||||
WPos pos;
|
WPos pos;
|
||||||
@@ -37,6 +38,13 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
parachute.PlayThen("open", () => parachute.PlayRepeating("idle"));
|
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)
|
if (parachutableInfo != null)
|
||||||
parachuteOffset = parachutableInfo.ParachuteOffset;
|
parachuteOffset = parachutableInfo.ParachuteOffset;
|
||||||
|
|
||||||
@@ -51,6 +59,9 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
if (parachute != null)
|
if (parachute != null)
|
||||||
parachute.Tick();
|
parachute.Tick();
|
||||||
|
|
||||||
|
if (shadow != null)
|
||||||
|
shadow.Tick();
|
||||||
|
|
||||||
pos -= fallRate;
|
pos -= fallRate;
|
||||||
|
|
||||||
if (pos.Z <= 0)
|
if (pos.Z <= 0)
|
||||||
@@ -75,18 +86,23 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
if (!rc.Any())
|
if (!rc.Any())
|
||||||
yield break;
|
yield break;
|
||||||
|
|
||||||
var shadow = wr.Palette(parachutableInfo.ParachuteShadowPalette);
|
var parachuteShadowPalette = wr.Palette(parachutableInfo.ParachuteShadowPalette);
|
||||||
foreach (var c in rc)
|
foreach (var c in rc)
|
||||||
{
|
{
|
||||||
if (!c.IsDecoration)
|
if (!c.IsDecoration && shadow == null)
|
||||||
yield return c.WithPalette(shadow).WithZOffset(c.ZOffset - 1).AsDecoration();
|
yield return c.WithPalette(parachuteShadowPalette).WithZOffset(c.ZOffset - 1).AsDecoration();
|
||||||
|
|
||||||
yield return c.OffsetBy(pos - c.Pos);
|
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)
|
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;
|
yield return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,10 +28,18 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
[Desc("Requires the sub-sequences \"open\" and \"idle\".")]
|
[Desc("Requires the sub-sequences \"open\" and \"idle\".")]
|
||||||
public readonly string ParachuteSequence = null;
|
public readonly string ParachuteSequence = null;
|
||||||
|
[Desc("Optional, otherwise defaults to the palette the actor is using.")]
|
||||||
public readonly string ParachutePalette = null;
|
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 string ParachuteShadowPalette = "shadow";
|
||||||
|
|
||||||
public readonly WVec ParachuteOffset = WVec.Zero;
|
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); }
|
public object Create(ActorInitializer init) { return new Parachutable(init, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
mods/ra/bits/parach-shadow.shp
Normal file
BIN
mods/ra/bits/parach-shadow.shp
Normal file
Binary file not shown.
@@ -179,6 +179,7 @@
|
|||||||
ParachuteOffset: 0,0,427
|
ParachuteOffset: 0,0,427
|
||||||
KilledOnImpassableTerrain: true
|
KilledOnImpassableTerrain: true
|
||||||
ParachuteSequence: parach
|
ParachuteSequence: parach
|
||||||
|
ShadowSequence: parach-shadow
|
||||||
|
|
||||||
^Ship:
|
^Ship:
|
||||||
AppearsOnRadar:
|
AppearsOnRadar:
|
||||||
|
|||||||
@@ -370,6 +370,11 @@ parach:
|
|||||||
Start: 5
|
Start: 5
|
||||||
Length: 11
|
Length: 11
|
||||||
|
|
||||||
|
parach-shadow:
|
||||||
|
idle:
|
||||||
|
Start: 0
|
||||||
|
Length: *
|
||||||
|
|
||||||
atomicup:
|
atomicup:
|
||||||
idle:
|
idle:
|
||||||
Start: 0
|
Start: 0
|
||||||
|
|||||||
Reference in New Issue
Block a user