Replace IActorInit with an abstract class.
A shared ValueActorInit<T> is introduced to reduce duplication in the most common init cases, and an ActorInitActorReference allow actors to be referenced by map.yaml name.
This commit is contained in:
@@ -50,7 +50,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
},
|
||||
(actor, value) =>
|
||||
{
|
||||
actor.ReplaceInit(new FreeActorInit(value));
|
||||
actor.ReplaceInit(new FreeActorInit(this, value));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -87,20 +87,15 @@ namespace OpenRA.Mods.Common.Traits
|
||||
}
|
||||
}
|
||||
|
||||
public class FreeActorInit : IActorInit<bool>
|
||||
public class FreeActorInit : ValueActorInit<bool>
|
||||
{
|
||||
[FieldFromYamlKey]
|
||||
public readonly bool ActorValue = true;
|
||||
public FreeActorInit() { }
|
||||
public FreeActorInit(bool init) { ActorValue = init; }
|
||||
public bool Value { get { return ActorValue; } }
|
||||
public FreeActorInit(TraitInfo info, bool value)
|
||||
: base(info, value) { }
|
||||
}
|
||||
|
||||
public class ParentActorInit : IActorInit
|
||||
public class ParentActorInit : ValueActorInit<ActorInitActorReference>
|
||||
{
|
||||
readonly Actor value;
|
||||
public ParentActorInit(Actor init) { value = init; }
|
||||
|
||||
public Lazy<Actor> Value(World world) { return new Lazy<Actor>(() => value); }
|
||||
public ParentActorInit(Actor value)
|
||||
: base(value) { }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,10 +33,10 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
public LegacyBridgeHut(ActorInitializer init, LegacyBridgeHutInfo info)
|
||||
{
|
||||
var bridge = init.GetOrDefault<ParentActorInit>(info);
|
||||
var bridge = init.Get<ParentActorInit>(info).Value;
|
||||
init.World.AddFrameEndTask(_ =>
|
||||
{
|
||||
Bridge = bridge.Value(init.World).Value.Trait<Bridge>();
|
||||
Bridge = bridge.Actor(init.World).Value.Trait<Bridge>();
|
||||
Bridge.AddHut(this);
|
||||
FirstBridge = Bridge.Enumerate(0, true).Last();
|
||||
});
|
||||
|
||||
@@ -16,33 +16,29 @@ using OpenRA.Traits;
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
public enum LineBuildDirection { Unset, X, Y }
|
||||
public class LineBuildDirectionInit : IActorInit<LineBuildDirection>
|
||||
public class LineBuildDirectionInit : ValueActorInit<LineBuildDirection>
|
||||
{
|
||||
[FieldFromYamlKey]
|
||||
readonly LineBuildDirection value = LineBuildDirection.Unset;
|
||||
|
||||
public LineBuildDirectionInit() { }
|
||||
public LineBuildDirectionInit(LineBuildDirection init) { value = init; }
|
||||
public LineBuildDirection Value { get { return value; } }
|
||||
public LineBuildDirectionInit(LineBuildDirection value)
|
||||
: base(value) { }
|
||||
}
|
||||
|
||||
public class LineBuildParentInit : IActorInit<string[]>
|
||||
public class LineBuildParentInit : ValueActorInit<string[]>
|
||||
{
|
||||
[FieldFromYamlKey]
|
||||
public readonly string[] ParentNames = new string[0];
|
||||
|
||||
readonly Actor[] parents = null;
|
||||
|
||||
public LineBuildParentInit() { }
|
||||
public LineBuildParentInit(Actor[] init) { parents = init; }
|
||||
public string[] Value { get { return ParentNames; } }
|
||||
public LineBuildParentInit(Actor[] value)
|
||||
: base(new string[0])
|
||||
{
|
||||
parents = value;
|
||||
}
|
||||
|
||||
public Actor[] ActorValue(World world)
|
||||
{
|
||||
if (parents != null)
|
||||
return parents;
|
||||
|
||||
var sma = world.WorldActor.Trait<SpawnMapActors>();
|
||||
return ParentNames.Select(n => sma.Actors[n]).ToArray();
|
||||
return value.Select(n => sma.Actors[n]).ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user