Skip to content

Commit

Permalink
Add support for TS-style tinted target flashes.
Browse files Browse the repository at this point in the history
  • Loading branch information
pchote committed Jul 3, 2021
1 parent 092a7ce commit 0eca9f3
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 9 deletions.
22 changes: 20 additions & 2 deletions OpenRA.Game/Traits/Player/FrozenActorLayer.cs
Expand Up @@ -76,6 +76,9 @@ public class FrozenActor
static readonly Rectangle[] NoBounds = new Rectangle[0];

int flashTicks;
TintModifiers flashModifiers;
float3 flashTint;
float? flashAlpha;

public FrozenActor(Actor actor, ICreatesFrozenActors frozenTrait, PPos[] footprint, Player viewer, bool startsRevealed)
{
Expand Down Expand Up @@ -176,9 +179,20 @@ public void Invalidate()
Owner = null;
}

public void Flash()
public void Flash(Color color, float alpha)
{
flashTicks = 5;
flashModifiers = TintModifiers.ReplaceColor;
flashTint = new float3(color.R, color.G, color.B) / 255f;
flashAlpha = alpha;
}

public void Flash(float3 tint)
{
flashTicks = 5;
flashModifiers = TintModifiers.None;
flashTint = tint;
flashAlpha = null;
}

public IEnumerable<IRenderable> Render(WorldRenderer wr)
Expand All @@ -192,7 +206,11 @@ public IEnumerable<IRenderable> Render(WorldRenderer wr)
.Select(r =>
{
var mr = (IModifyableRenderable)r;
return mr.WithTint(float3.Ones, mr.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(0.5f);
mr = mr.WithTint(flashTint, mr.TintModifiers | flashModifiers);
if (flashAlpha.HasValue)
mr = mr.WithAlpha(flashAlpha.Value);
return mr;
}));
}

Expand Down
35 changes: 30 additions & 5 deletions OpenRA.Mods.Common/Effects/FlashTarget.cs
Expand Up @@ -13,21 +13,25 @@
using System.Linq;
using OpenRA.Effects;
using OpenRA.Graphics;
using OpenRA.Primitives;

namespace OpenRA.Mods.Common.Effects
{
public class FlashTarget : IEffect
{
readonly Actor target;
readonly Player player;
readonly int count;
readonly int interval;

readonly TintModifiers modifiers;
readonly float3 tint;
readonly float? alpha;

int tick;

public FlashTarget(Actor target, Player asPlayer = null, int count = 2, int interval = 2, int delay = 0)
FlashTarget(Actor target, int count, int interval, int delay)
{
this.target = target;
player = asPlayer;
this.count = count;
this.interval = interval;
tick = -delay;
Expand All @@ -38,6 +42,24 @@ public FlashTarget(Actor target, Player asPlayer = null, int count = 2, int inte
});
}

public FlashTarget(Actor target, Color color, float alpha, int count, int interval, int delay)
: this(target, count, interval, delay)
{
modifiers = TintModifiers.ReplaceColor;
tint = new float3(color.R, color.G, color.B) / 255f;
this.alpha = alpha;
}

public FlashTarget(Actor target, float3 tint, int count, int interval, int delay)
: this(target, count, interval, delay)
{
this.tint = tint;
}

// Legacy shim
public FlashTarget(Actor target, Player asPlayer = null, int count = 2, int interval = 2, int delay = 0)
: this(target, asPlayer?.Color ?? Color.White, 0.5f, count, interval, delay) { }

public void Tick(World world)
{
if (++tick >= count * interval || !target.IsInWorld)
Expand All @@ -48,13 +70,16 @@ public IEnumerable<IRenderable> Render(WorldRenderer wr)
{
if (target.IsInWorld && tick >= 0 && tick % interval == 0)
{
var color = player == null ? float3.Ones : new float3(player.Color.R, player.Color.G, player.Color.B) / 255f;
return target.Render(wr)
.Where(r => !r.IsDecoration && r is IModifyableRenderable)
.Select(r =>
{
var mr = (IModifyableRenderable)r;
return mr.WithTint(color, mr.TintModifiers | TintModifiers.ReplaceColor).WithAlpha(0.5f);
mr = mr.WithTint(tint, mr.TintModifiers | modifiers);
if (alpha.HasValue)
mr = mr.WithAlpha(alpha.Value);
return mr;
});
}

Expand Down
40 changes: 38 additions & 2 deletions OpenRA.Mods.Common/Traits/World/OrderEffects.cs
Expand Up @@ -10,10 +10,13 @@
#endregion

using OpenRA.Mods.Common.Effects;
using OpenRA.Primitives;
using OpenRA.Traits;

namespace OpenRA.Mods.Common.Traits
{
public enum ActorFlashType { Overlay, Tint }

[Desc("Renders an effect at the order target locations.")]
public class OrderEffectsInfo : TraitInfo
{
Expand All @@ -28,6 +31,27 @@ public class OrderEffectsInfo : TraitInfo
[Desc("The palette to use.")]
public readonly string TerrainFlashPalette;

[Desc("The type of effect to apply to targeted (frozen) actors. Accepts values Overlay and Tint.")]
public readonly ActorFlashType ActorFlashType = ActorFlashType.Overlay;

[Desc("The overlay color to display when ActorFlashType is Overlay.")]
public readonly Color ActorFlashOverlayColor = Color.White;

[Desc("The overlay transparency to display when ActorFlashType is Overlay.")]
public readonly float ActorFlashOverlayAlpha = 0.5f;

[Desc("The tint to apply when ActorFlashType is Tint.")]
public readonly float3 ActorFlashTint = new float3(1.4f, 1.4f, 1.4f);

[Desc("Number of times to flash (frozen) actors.")]
public readonly int ActorFlashCount = 2;

[Desc("Number of ticks between (frozen) actor flashes.")]
public readonly int ActorFlashInterval = 2;

[Desc("Delay in ticks befor the first (frozen) actor flash.")]
public readonly int ActorFlashDelay = 0;

public override object Create(ActorInitializer init)
{
return new OrderEffects(this);
Expand All @@ -47,13 +71,25 @@ bool INotifyOrderIssued.OrderIssued(World world, Target target)
{
if (target.Type == TargetType.Actor)
{
world.AddFrameEndTask(w => w.Add(new FlashTarget(target.Actor)));
if (info.ActorFlashType == ActorFlashType.Overlay)
world.AddFrameEndTask(w => w.Add(new FlashTarget(
target.Actor, info.ActorFlashOverlayColor, info.ActorFlashOverlayAlpha,
info.ActorFlashCount, info.ActorFlashInterval, info.ActorFlashDelay)));
else
world.AddFrameEndTask(w => w.Add(new FlashTarget(
target.Actor, info.ActorFlashTint,
info.ActorFlashCount, info.ActorFlashInterval, info.ActorFlashDelay)));

return true;
}

if (target.Type == TargetType.FrozenActor)
{
target.FrozenActor.Flash();
if (info.ActorFlashType == ActorFlashType.Overlay)
target.FrozenActor.Flash(info.ActorFlashOverlayColor, info.ActorFlashOverlayAlpha);
else
target.FrozenActor.Flash(info.ActorFlashTint);

return true;
}

Expand Down
1 change: 1 addition & 0 deletions mods/ts/rules/world.yaml
Expand Up @@ -388,6 +388,7 @@ World:
TerrainFlashImage: moveflsh
TerrainFlashSequence: idle
TerrainFlashPalette: moveflash
ActorFlashType: Tint

EditorWorld:
Inherits: ^BaseWorld
Expand Down

0 comments on commit 0eca9f3

Please sign in to comment.