Rewrite ActorInit queries.

This commit is contained in:
Paul Chote
2020-05-24 22:28:16 +01:00
committed by teinarss
parent 626b40f31b
commit 7c6ec577dc
66 changed files with 332 additions and 265 deletions

View File

@@ -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);
}
}
}