#region Copyright & License Information /* * Copyright 2007-2018 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.Linq; using OpenRA.Primitives; namespace OpenRA { public interface IActorInitializer { World World { get; } T Get() where T : IActorInit; U Get() where T : IActorInit; bool Contains() where T : IActorInit; } public class ActorInitializer : IActorInitializer { public readonly Actor Self; public World World { get { return Self.World; } } internal TypeDictionary Dict; public ActorInitializer(Actor actor, TypeDictionary dict) { Self = actor; 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 interface IActorInit { } public interface IActorInit : IActorInit { T Value(World world); } public class LocationInit : IActorInit { [FieldFromYamlKey] readonly CPos value = CPos.Zero; public LocationInit() { } public LocationInit(CPos init) { value = init; } public CPos Value(World world) { return value; } } public class OwnerInit : IActorInit { [FieldFromYamlKey] public readonly string PlayerName = "Neutral"; Player player; public OwnerInit() { } public OwnerInit(string playerName) { PlayerName = playerName; } public OwnerInit(Player player) { this.player = player; PlayerName = player.InternalName; } public Player Value(World world) { if (player != null) return player; return world.Players.First(x => x.InternalName == PlayerName); } } }