Rewrite ActorInit queries.
This commit is contained in:
@@ -68,8 +68,8 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
if (!string.IsNullOrEmpty(info.OverridePalette))
|
||||
{
|
||||
var owner = init.Get<OwnerInit>().Value(wr.World);
|
||||
palette = wr.Palette(info.OverridePaletteIsPlayerPalette ? info.OverridePalette + owner.InternalName : info.OverridePalette);
|
||||
var ownerName = init.Get<OwnerInit>().InternalName;
|
||||
palette = wr.Palette(info.OverridePaletteIsPlayerPalette ? info.OverridePalette + ownerName : info.OverridePalette);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -278,7 +278,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
public Building(ActorInitializer init, BuildingInfo info)
|
||||
{
|
||||
self = init.Self;
|
||||
topLeft = init.Get<LocationInit, CPos>();
|
||||
topLeft = init.GetValue<LocationInit, CPos>(info);
|
||||
Info = info;
|
||||
influence = self.World.WorldActor.Trait<BuildingInfluence>();
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Primitives;
|
||||
using OpenRA.Traits;
|
||||
@@ -43,7 +44,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
var init = actor.Init<FreeActorInit>();
|
||||
if (init != null)
|
||||
return init.Value(world);
|
||||
return init.Value;
|
||||
|
||||
return true;
|
||||
},
|
||||
@@ -63,7 +64,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
public FreeActor(ActorInitializer init, FreeActorInfo info)
|
||||
: base(info)
|
||||
{
|
||||
allowSpawn = !init.Contains<FreeActorInit>() || init.Get<FreeActorInit>().ActorValue;
|
||||
allowSpawn = init.GetValue<FreeActorInit, bool>(info, true);
|
||||
}
|
||||
|
||||
protected override void TraitEnabled(Actor self)
|
||||
@@ -92,13 +93,14 @@ namespace OpenRA.Mods.Common.Traits
|
||||
public readonly bool ActorValue = true;
|
||||
public FreeActorInit() { }
|
||||
public FreeActorInit(bool init) { ActorValue = init; }
|
||||
public bool Value(World world) { return ActorValue; }
|
||||
public bool Value { get { return ActorValue; } }
|
||||
}
|
||||
|
||||
public class ParentActorInit : IActorInit<Actor>
|
||||
public class ParentActorInit : IActorInit
|
||||
{
|
||||
public readonly Actor ActorValue;
|
||||
public ParentActorInit(Actor parent) { ActorValue = parent; }
|
||||
public Actor Value(World world) { return ActorValue; }
|
||||
readonly Actor value;
|
||||
public ParentActorInit(Actor init) { value = init; }
|
||||
|
||||
public Lazy<Actor> Value(World world) { return new Lazy<Actor>(() => value); }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,22 +20,26 @@ namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
public bool IsValidTarget(ActorInfo actorInfo, Actor saboteur) { return false; } // TODO: bridges don't support frozen under fog
|
||||
|
||||
public override object Create(ActorInitializer init) { return new LegacyBridgeHut(init); }
|
||||
public override object Create(ActorInitializer init) { return new LegacyBridgeHut(init, this); }
|
||||
}
|
||||
|
||||
class LegacyBridgeHut : IDemolishable
|
||||
{
|
||||
public readonly Bridge FirstBridge;
|
||||
public readonly Bridge Bridge;
|
||||
public Bridge FirstBridge { get; private set; }
|
||||
public Bridge Bridge { get; private set; }
|
||||
public DamageState BridgeDamageState { get { return Bridge.AggregateDamageState(); } }
|
||||
public bool Repairing { get { return repairDirections > 0; } }
|
||||
int repairDirections = 0;
|
||||
|
||||
public LegacyBridgeHut(ActorInitializer init)
|
||||
public LegacyBridgeHut(ActorInitializer init, LegacyBridgeHutInfo info)
|
||||
{
|
||||
Bridge = init.Get<ParentActorInit>().ActorValue.Trait<Bridge>();
|
||||
Bridge.AddHut(this);
|
||||
FirstBridge = Bridge.Enumerate(0, true).Last();
|
||||
var bridge = init.GetOrDefault<ParentActorInit>(info);
|
||||
init.World.AddFrameEndTask(_ =>
|
||||
{
|
||||
Bridge = bridge.Value(init.World).Value.Trait<Bridge>();
|
||||
Bridge.AddHut(this);
|
||||
FirstBridge = Bridge.Enumerate(0, true).Last();
|
||||
});
|
||||
}
|
||||
|
||||
public void Repair(Actor repairer)
|
||||
|
||||
@@ -23,10 +23,10 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
public LineBuildDirectionInit() { }
|
||||
public LineBuildDirectionInit(LineBuildDirection init) { value = init; }
|
||||
public LineBuildDirection Value(World world) { return value; }
|
||||
public LineBuildDirection Value { get { return value; } }
|
||||
}
|
||||
|
||||
public class LineBuildParentInit : IActorInit<Actor[]>
|
||||
public class LineBuildParentInit : IActorInit<string[]>
|
||||
{
|
||||
[FieldFromYamlKey]
|
||||
public readonly string[] ParentNames = new string[0];
|
||||
@@ -35,7 +35,8 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
public LineBuildParentInit() { }
|
||||
public LineBuildParentInit(Actor[] init) { parents = init; }
|
||||
public Actor[] Value(World world)
|
||||
public string[] Value { get { return ParentNames; } }
|
||||
public Actor[] ActorValue(World world)
|
||||
{
|
||||
if (parents != null)
|
||||
return parents;
|
||||
@@ -79,8 +80,9 @@ namespace OpenRA.Mods.Common.Traits
|
||||
public LineBuild(ActorInitializer init, LineBuildInfo info)
|
||||
{
|
||||
this.info = info;
|
||||
if (init.Contains<LineBuildParentInit>())
|
||||
parentNodes = init.Get<LineBuildParentInit>().Value(init.World);
|
||||
var lineBuildParentInit = init.GetOrDefault<LineBuildParentInit>(info);
|
||||
if (lineBuildParentInit != null)
|
||||
parentNodes = lineBuildParentInit.ActorValue(init.World);
|
||||
}
|
||||
|
||||
void INotifyLineBuildSegmentsChanged.SegmentAdded(Actor self, Actor segment)
|
||||
|
||||
@@ -61,15 +61,15 @@ namespace OpenRA.Mods.Common.Traits
|
||||
: base(wr, ai, info, init)
|
||||
{
|
||||
this.info = info;
|
||||
var owner = init.Get<OwnerInit>().Value(wr.World);
|
||||
var faction = init.Get<FactionInit>().Value(wr.World);
|
||||
var ownerName = init.Get<OwnerInit>().InternalName;
|
||||
var faction = init.Get<FactionInit>().Value;
|
||||
|
||||
var rsi = ai.TraitInfo<RenderSpritesInfo>();
|
||||
|
||||
if (!string.IsNullOrEmpty(info.SequencePalette))
|
||||
palette = wr.Palette(info.SequencePaletteIsPlayerPalette ? info.SequencePalette + owner.InternalName : info.SequencePalette);
|
||||
palette = wr.Palette(info.SequencePaletteIsPlayerPalette ? info.SequencePalette + ownerName : info.SequencePalette);
|
||||
else
|
||||
palette = wr.Palette(rsi.Palette ?? rsi.PlayerPalette + owner.InternalName);
|
||||
palette = wr.Palette(rsi.Palette ?? rsi.PlayerPalette + ownerName);
|
||||
|
||||
preview = new Animation(wr.World, rsi.GetImage(ai, wr.World.Map.Rules.Sequences, faction));
|
||||
preview.PlayRepeating(info.Sequence);
|
||||
|
||||
Reference in New Issue
Block a user