#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.Collections.Generic; using System.Drawing; using OpenRA.Graphics; using OpenRA.Mods.Common.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Part of the combat overlay from DeveloperMode. Attach this to the world actor.")] public class WarheadDebugOverlayInfo : ITraitInfo { public readonly int DisplayDuration = 25; public object Create(ActorInitializer init) { return new WarheadDebugOverlay(this); } } public class WarheadDebugOverlay : IPostRender { class WHImpact { public readonly WPos CenterPosition; public readonly WDist[] Range; public readonly Color Color; public int Time; public WDist OuterRange { get { return Range[Range.Length - 1]; } } public WHImpact(WPos pos, WDist[] range, int time, Color color) { CenterPosition = pos; Range = range; Color = color; Time = time; } } readonly WarheadDebugOverlayInfo info; readonly List impacts = new List(); public WarheadDebugOverlay(WarheadDebugOverlayInfo info) { this.info = info; } public void AddImpact(WPos pos, WDist[] range, Color color) { impacts.Add(new WHImpact(pos, range, info.DisplayDuration, color)); } public void RenderAfterWorld(WorldRenderer wr, Actor self) { foreach (var i in impacts) { var alpha = 255.0f * i.Time / info.DisplayDuration; var rangeStep = alpha / i.Range.Length; RangeCircleRenderable.DrawRangeCircle(wr, i.CenterPosition, i.OuterRange, 1, Color.FromArgb((int)alpha, i.Color), 0, i.Color); foreach (var r in i.Range) { var tl = wr.ScreenPosition(i.CenterPosition - new WVec(r.Length, r.Length, 0)); var br = wr.ScreenPosition(i.CenterPosition + new WVec(r.Length, r.Length, 0)); var rect = RectangleF.FromLTRB(tl.X, tl.Y, br.X, br.Y); Game.Renderer.WorldRgbaColorRenderer.FillEllipse(rect, Color.FromArgb((int)alpha, i.Color)); alpha -= rangeStep; } if (!wr.World.Paused) i.Time--; } impacts.RemoveAll(i => i.Time == 0); } } }