add a customizable parachute shadow

closes #3335
This commit is contained in:
Matthias Mailänder
2014-07-01 21:21:09 +02:00
parent 18a77e0039
commit 4a7687d7e4
5 changed files with 35 additions and 5 deletions

View File

@@ -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;
} }
} }

View File

@@ -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); }
} }

Binary file not shown.

View File

@@ -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:

View File

@@ -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