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:
Paul Chote
2020-06-02 19:37:18 +01:00
committed by teinarss
parent 4df5ac0385
commit b38018af9c
28 changed files with 365 additions and 306 deletions

View File

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