#region Copyright & License Information /* * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, * see COPYING. */ #endregion using System; using System.Collections.Generic; using System.Drawing; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { public class RadarPingsInfo : ITraitInfo { public readonly int FromRadius = 200; public readonly int ToRadius = 15; public readonly int ShrinkSpeed = 4; public readonly float RotationSpeed = 0.12f; public object Create(ActorInitializer init) { return new RadarPings(this); } } public class RadarPings : ITick { public readonly List Pings = new List(); readonly RadarPingsInfo info; public WPos? LastPingPosition; public RadarPings(RadarPingsInfo info) { this.info = info; } public void Tick(Actor self) { foreach (var ping in Pings.ToArray()) if (!ping.Tick()) Pings.Remove(ping); } public RadarPing Add(Func isVisible, WPos position, Color color, int duration) { var ping = new RadarPing(isVisible, position, color, duration, info.FromRadius, info.ToRadius, info.ShrinkSpeed, info.RotationSpeed); if (ping.IsVisible()) LastPingPosition = ping.Position; Pings.Add(ping); return ping; } public void Remove(RadarPing ping) { Pings.Remove(ping); } } public class RadarPing { public Func IsVisible; public WPos Position; public Color Color; public int Duration; public int FromRadius; public int ToRadius; public int ShrinkSpeed; public float RotationSpeed; int radius; float angle; int tick; public RadarPing(Func isVisible, WPos position, Color color, int duration, int fromRadius, int toRadius, int shrinkSpeed, float rotationSpeed) { IsVisible = isVisible; Position = position; Color = color; Duration = duration; FromRadius = fromRadius; ToRadius = toRadius; ShrinkSpeed = shrinkSpeed; RotationSpeed = rotationSpeed; radius = fromRadius; } public bool Tick() { if (++tick == Duration) return false; radius = Math.Max(radius - ShrinkSpeed, ToRadius); angle -= RotationSpeed; return true; } public IEnumerable Points(float2 center) { yield return center + radius * float2.FromAngle(angle); yield return center + radius * float2.FromAngle((float)(angle + 2 * Math.PI / 3)); yield return center + radius * float2.FromAngle((float)(angle + 4 * Math.PI / 3)); } } }