Rewrite ActorInit queries.
This commit is contained in:
@@ -9,17 +9,21 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using OpenRA.Primitives;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA
|
||||
{
|
||||
public interface IActorInitializer
|
||||
{
|
||||
World World { get; }
|
||||
T Get<T>() where T : IActorInit;
|
||||
U Get<T, U>() where T : IActorInit<U>;
|
||||
bool Contains<T>() where T : IActorInit;
|
||||
T GetOrDefault<T>(TraitInfo info) where T : IActorInit;
|
||||
T Get<T>(TraitInfo info) where T : IActorInit;
|
||||
U GetValue<T, U>(TraitInfo info) where T : IActorInit<U>;
|
||||
U GetValue<T, U>(TraitInfo info, U fallback) where T : IActorInit<U>;
|
||||
bool Contains<T>(TraitInfo info) where T : IActorInit;
|
||||
}
|
||||
|
||||
public class ActorInitializer : IActorInitializer
|
||||
@@ -35,16 +39,39 @@ namespace OpenRA
|
||||
Dict = dict;
|
||||
}
|
||||
|
||||
public T Get<T>() where T : IActorInit { return Dict.Get<T>(); }
|
||||
public U Get<T, U>() where T : IActorInit<U> { return Dict.Get<T>().Value(World); }
|
||||
public bool Contains<T>() where T : IActorInit { return Dict.Contains<T>(); }
|
||||
public T GetOrDefault<T>(TraitInfo info) where T : IActorInit
|
||||
{
|
||||
return Dict.GetOrDefault<T>();
|
||||
}
|
||||
|
||||
public T Get<T>(TraitInfo info) where T : IActorInit
|
||||
{
|
||||
var init = GetOrDefault<T>(info);
|
||||
if (init == null)
|
||||
throw new InvalidOperationException("TypeDictionary does not contain instance of type `{0}`".F(typeof(T)));
|
||||
|
||||
return init;
|
||||
}
|
||||
|
||||
public U GetValue<T, U>(TraitInfo info) where T : IActorInit<U>
|
||||
{
|
||||
return Get<T>(info).Value;
|
||||
}
|
||||
|
||||
public U GetValue<T, U>(TraitInfo info, U fallback) where T : IActorInit<U>
|
||||
{
|
||||
var init = GetOrDefault<T>(info);
|
||||
return init != null ? init.Value : fallback;
|
||||
}
|
||||
|
||||
public bool Contains<T>(TraitInfo info) where T : IActorInit { return GetOrDefault<T>(info) != null; }
|
||||
}
|
||||
|
||||
public interface IActorInit { }
|
||||
|
||||
public interface IActorInit<T> : IActorInit
|
||||
{
|
||||
T Value(World world);
|
||||
T Value { get; }
|
||||
}
|
||||
|
||||
public class LocationInit : IActorInit<CPos>
|
||||
@@ -54,23 +81,23 @@ namespace OpenRA
|
||||
|
||||
public LocationInit() { }
|
||||
public LocationInit(CPos init) { value = init; }
|
||||
public CPos Value(World world) { return value; }
|
||||
public CPos Value { get { return value; } }
|
||||
}
|
||||
|
||||
public class OwnerInit : IActorInit<Player>
|
||||
public class OwnerInit : IActorInit
|
||||
{
|
||||
[FieldFromYamlKey]
|
||||
public readonly string PlayerName = "Neutral";
|
||||
public readonly string InternalName = "Neutral";
|
||||
|
||||
Player player;
|
||||
|
||||
public OwnerInit() { }
|
||||
public OwnerInit(string playerName) { PlayerName = playerName; }
|
||||
public OwnerInit(string playerName) { InternalName = playerName; }
|
||||
|
||||
public OwnerInit(Player player)
|
||||
{
|
||||
this.player = player;
|
||||
PlayerName = player.InternalName;
|
||||
InternalName = player.InternalName;
|
||||
}
|
||||
|
||||
public Player Value(World world)
|
||||
@@ -78,7 +105,7 @@ namespace OpenRA
|
||||
if (player != null)
|
||||
return player;
|
||||
|
||||
return world.Players.First(x => x.InternalName == PlayerName);
|
||||
return world.Players.First(x => x.InternalName == InternalName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user