#region Copyright & License Information /* * Copyright 2007-2019 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, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. */ #endregion using System; using System.Collections.Generic; using System.Drawing; using OpenRA.Graphics; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Graphics { public interface IActorPreview { void Tick(); IEnumerable Render(WorldRenderer wr, WPos pos); IEnumerable ScreenBounds(WorldRenderer wr, WPos pos); } public class ActorPreviewInitializer : IActorInitializer { public readonly ActorInfo Actor; public readonly WorldRenderer WorldRenderer; public World World { get { return WorldRenderer.World; } } readonly TypeDictionary dict; public ActorPreviewInitializer(ActorInfo actor, WorldRenderer worldRenderer, TypeDictionary dict) { Actor = actor; WorldRenderer = worldRenderer; this.dict = dict; } public T Get() where T : IActorInit { return dict.Get(); } public U Get() where T : IActorInit { return dict.Get().Value(World); } public bool Contains() where T : IActorInit { return dict.Contains(); } public Func GetOrientation() { var facingInfo = Actor.TraitInfoOrDefault(); if (facingInfo == null) return () => WRot.Zero; // Dynamic facing takes priority var dynamicInit = dict.GetOrDefault(); if (dynamicInit != null) { // TODO: Account for terrain slope var getFacing = dynamicInit.Value(null); return () => WRot.FromFacing(getFacing()); } // Fall back to initial actor facing if an Init isn't available var facingInit = dict.GetOrDefault(); var facing = facingInit != null ? facingInit.Value(null) : facingInfo.GetInitialFacing(); var orientation = WRot.FromFacing(facing); return () => orientation; } public Func GetFacing() { var facingInfo = Actor.TraitInfoOrDefault(); if (facingInfo == null) return () => 0; // Dynamic facing takes priority var dynamicInit = dict.GetOrDefault(); if (dynamicInit != null) return dynamicInit.Value(null); // Fall back to initial actor facing if an Init isn't available var facingInit = dict.GetOrDefault(); var facing = facingInit != null ? facingInit.Value(null) : facingInfo.GetInitialFacing(); return () => facing; } public DamageState GetDamageState() { var health = dict.GetOrDefault(); if (health == null) return DamageState.Undamaged; var hf = health.Value(null); if (hf <= 0) return DamageState.Dead; if (hf < 25) return DamageState.Critical; if (hf < 50) return DamageState.Heavy; if (hf < 75) return DamageState.Medium; if (hf < 100) return DamageState.Light; return DamageState.Undamaged; } } }