diff --git a/OpenRA.Mods.RA/Effects/TeslaZap.cs b/OpenRA.Mods.RA/Effects/TeslaZap.cs index 39b3c64c79..3d9a25c801 100755 --- a/OpenRA.Mods.RA/Effects/TeslaZap.cs +++ b/OpenRA.Mods.RA/Effects/TeslaZap.cs @@ -29,27 +29,35 @@ namespace OpenRA.Mods.RA.Effects class TeslaZap : IEffect { readonly ProjectileArgs Args; + readonly TeslaZapInfo Info; + IEnumerable renderables; int timeUntilRemove = 2; // # of frames bool doneDamage = false; - - readonly List renderables = new List(); + bool initialized = false; public TeslaZap(TeslaZapInfo info, ProjectileArgs args) { Args = args; - var bright = SequenceProvider.GetSequence(info.Image, "bright"); - var dim = SequenceProvider.GetSequence(info.Image, "dim"); - - for( var n = 0; n < info.DimZaps; n++ ) - renderables.AddRange(DrawZapWandering(args.src, args.dest, dim)); - for( var n = 0; n < info.BrightZaps; n++ ) - renderables.AddRange(DrawZapWandering(args.src, args.dest, bright)); + Info = info; } - public void Tick( World world ) + public IEnumerable GenerateRenderables(WorldRenderer wr) { - if( timeUntilRemove <= 0 ) - world.AddFrameEndTask( w => w.Remove( this ) ); + var bright = SequenceProvider.GetSequence(Info.Image, "bright"); + var dim = SequenceProvider.GetSequence(Info.Image, "dim"); + + for (var n = 0; n < Info.DimZaps; n++) + foreach (var z in DrawZapWandering(wr, Args.src, Args.dest, dim)) + yield return z; + for (var n = 0; n < Info.BrightZaps; n++) + foreach (var z in DrawZapWandering(wr, Args.src, Args.dest, bright)) + yield return z; + } + + public void Tick(World world) + { + if (timeUntilRemove <= 0) + world.AddFrameEndTask(w => w.Remove(this)); --timeUntilRemove; if (!doneDamage) @@ -62,9 +70,18 @@ namespace OpenRA.Mods.RA.Effects } } - public IEnumerable Render(WorldRenderer wr) { return renderables; } + public IEnumerable Render(WorldRenderer wr) + { + if (!initialized) + { + renderables = GenerateRenderables(wr); + initialized = true; + } - static IEnumerable DrawZapWandering(PPos from, PPos to, Sequence s) + return renderables; + } + + static IEnumerable DrawZapWandering(WorldRenderer wr, PPos from, PPos to, Sequence s) { var z = float2.Zero; /* hack */ var dist = to - from; @@ -76,22 +93,22 @@ namespace OpenRA.Mods.RA.Effects var p1 = from.ToFloat2() + (1 / 3f) * dist.ToFloat2() + Game.CosmeticRandom.Gauss1D(1) * .2f * dist.Length * norm; var p2 = from.ToFloat2() + (2 / 3f) * dist.ToFloat2() + Game.CosmeticRandom.Gauss1D(1) * .2f * dist.Length * norm; - renderables.AddRange(DrawZap(from.ToFloat2(), p1, s, out p1)); - renderables.AddRange(DrawZap(p1, p2, s, out p2)); - renderables.AddRange(DrawZap(p2, to.ToFloat2(), s, out z)); + renderables.AddRange(DrawZap(wr, from.ToFloat2(), p1, s, out p1)); + renderables.AddRange(DrawZap(wr, p1, p2, s, out p2)); + renderables.AddRange(DrawZap(wr, p2, to.ToFloat2(), s, out z)); } else { var p1 = from.ToFloat2() + (1 / 2f) * dist.ToFloat2() + Game.CosmeticRandom.Gauss1D(1) * .2f * dist.Length * norm; - renderables.AddRange(DrawZap(from.ToFloat2(), p1, s, out p1)); - renderables.AddRange(DrawZap(p1, to.ToFloat2(), s, out z)); + renderables.AddRange(DrawZap(wr, from.ToFloat2(), p1, s, out p1)); + renderables.AddRange(DrawZap(wr, p1, to.ToFloat2(), s, out z)); } return renderables; } - static IEnumerable DrawZap(float2 from, float2 to, Sequence s, out float2 p) + static IEnumerable DrawZap(WorldRenderer wr, float2 from, float2 to, Sequence s, out float2 p) { var dist = to - from; var q = new float2(-dist.Y, dist.X); @@ -105,7 +122,7 @@ namespace OpenRA.Mods.RA.Effects .OrderBy(t => Math.Abs(float2.Dot(z + new float2(t[0], t[1]), q) + c)).First(); rs.Add(new Renderable(s.GetSprite(step[4]), z + new float2(step[2], step[3]), - PaletteReference.FromName("effect"), (int)from.Y)); + wr.Palette("effect"), (int)from.Y)); z += new float2(step[0], step[1]); if( rs.Count >= 1000 ) break;