diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index 6fd143ea12..09d09c6ed2 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -23,43 +23,27 @@ namespace OpenRA.Mods.RA.Render { public readonly bool HasMakeAnimation = true; public readonly float2 Origin = float2.Zero; - public override object Create(ActorInitializer init) { return new RenderBuilding(init);} + public override object Create(ActorInitializer init) { return new RenderBuilding(init, this);} public override IEnumerable RenderPreview(ActorInfo building, string Tileset) { - var rb = building.Traits.Get(); return base.RenderPreview(building, Tileset) - .Select(a => a.WithPos(a.Pos + rb.Origin)); + .Select(a => a.WithPos(a.Pos + building.Traits.Get().Origin)); } } public class RenderBuilding : RenderSimple, INotifyDamage, INotifySold, IRenderModifier { - readonly float2 Origin; + readonly RenderBuildingInfo Info; - public RenderBuilding( ActorInitializer init ) - : this( init, () => 0 ) - { - Origin = init.self.Info.Traits.Get().Origin; - } - - public IEnumerable ModifyRender(Actor self, IEnumerable r) - { - var disabled = self.TraitsImplementing().Any(d => d.Disabled); - foreach (var a in r) - { - var ret = a.WithPos(a.Pos - Origin); - yield return ret; - if (disabled) - yield return ret.WithPalette("disabled").WithZOffset(1); - } - } + public RenderBuilding( ActorInitializer init, RenderBuildingInfo info ) + : this(init, info, () => 0) { } - public RenderBuilding( ActorInitializer init, Func baseFacing ) + public RenderBuilding( ActorInitializer init, RenderBuildingInfo info, Func baseFacing ) : base(init.self, baseFacing) { + Info = info; var self = init.self; - // Work around a bogus crash anim.PlayRepeating( NormalizeSequence(self, "idle") ); @@ -69,7 +53,19 @@ namespace OpenRA.Mods.RA.Render // Can't call Complete() from ctor because other traits haven't been inited yet self.QueueActivity(new CallFunc(() => self.World.AddFrameEndTask( _ => Complete( self ) ))); } - + + public IEnumerable ModifyRender(Actor self, IEnumerable r) + { + var disabled = self.TraitsImplementing().Any(d => d.Disabled); + foreach (var a in r) + { + var ret = a.WithPos(a.Pos - Info.Origin); + yield return ret; + if (disabled) + yield return ret.WithPalette("disabled").WithZOffset(1); + } + } + void Complete( Actor self ) { anim.PlayRepeating( NormalizeSequence(self, "idle") ); @@ -119,7 +115,7 @@ namespace OpenRA.Mods.RA.Render public virtual void Selling( Actor self ) { - if( self.Info.Traits.Get().HasMakeAnimation ) + if( Info.HasMakeAnimation ) anim.PlayBackwardsThen( "make", null ); foreach (var s in self.Info.Traits.Get().SellSounds) diff --git a/OpenRA.Mods.RA/Render/RenderBuildingCharge.cs b/OpenRA.Mods.RA/Render/RenderBuildingCharge.cs index eafde6b651..452bbf528c 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingCharge.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingCharge.cs @@ -13,14 +13,14 @@ namespace OpenRA.Mods.RA.Render class RenderBuildingChargeInfo : RenderBuildingInfo { public readonly string ChargeAudio = "tslachg2.aud"; - public override object Create(ActorInitializer init) { return new RenderBuildingCharge(init); } + public override object Create(ActorInitializer init) { return new RenderBuildingCharge(init, this); } } /* used for tesla */ public class RenderBuildingCharge : RenderBuilding { - public RenderBuildingCharge( ActorInitializer init ) - : base(init) + public RenderBuildingCharge( ActorInitializer init, RenderBuildingInfo info ) + : base(init, info) { } diff --git a/OpenRA.Mods.RA/Render/RenderBuildingOre.cs b/OpenRA.Mods.RA/Render/RenderBuildingOre.cs index 3f22fb9fb7..d91af1271b 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingOre.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingOre.cs @@ -14,15 +14,15 @@ namespace OpenRA.Mods.RA.Render { class RenderBuildingOreInfo : RenderBuildingInfo { - public override object Create(ActorInitializer init) { return new RenderBuildingOre(init); } + public override object Create(ActorInitializer init) { return new RenderBuildingOre(init, this); } } class RenderBuildingOre : RenderBuilding, INotifyBuildComplete, INotifyCapture { PlayerResources PlayerResources; - public RenderBuildingOre( ActorInitializer init ) - : base(init) + public RenderBuildingOre( ActorInitializer init, RenderBuildingInfo info ) + : base(init, info) { PlayerResources = init.self.Owner.PlayerActor.Trait(); } @@ -34,7 +34,7 @@ namespace OpenRA.Mods.RA.Render } public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner) - { + { PlayerResources = newOwner.PlayerActor.Trait(); } } diff --git a/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs b/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs index 5a8e6ba5c1..e64a1d3750 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingTurreted.cs @@ -15,15 +15,13 @@ namespace OpenRA.Mods.RA.Render { class RenderBuildingTurretedInfo : RenderBuildingInfo { - public override object Create(ActorInitializer init) { return new RenderBuildingTurreted( init ); } + public override object Create(ActorInitializer init) { return new RenderBuildingTurreted( init, this ); } } class RenderBuildingTurreted : RenderBuilding, INotifyBuildComplete { - public RenderBuildingTurreted( ActorInitializer init ) - : base(init, () => init.self.Trait().turretFacing) - { - } + public RenderBuildingTurreted( ActorInitializer init, RenderBuildingInfo info ) + : base(init, info, () => init.self.Trait().turretFacing) { } public void BuildingComplete( Actor self ) { diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs index 4634679320..7ecdc1939c 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs @@ -16,7 +16,7 @@ namespace OpenRA.Mods.RA.Render { class RenderBuildingWallInfo : RenderBuildingInfo { - public override object Create(ActorInitializer init) { return new RenderBuildingWall(init); } + public override object Create(ActorInitializer init) { return new RenderBuildingWall( init, this ); } } class RenderBuildingWall : RenderBuilding, INotifyBuildComplete @@ -24,8 +24,8 @@ namespace OpenRA.Mods.RA.Render string seqName; int adjacentWalls = 0; - public RenderBuildingWall( ActorInitializer init ) - : base(init) + public RenderBuildingWall( ActorInitializer init, RenderBuildingInfo info ) + : base(init, info) { seqName = "idle"; } diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs index e8ea26ffec..7252adfdf1 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs @@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA.Render { class RenderWarFactoryInfo : RenderBuildingInfo { - public override object Create(ActorInitializer init) { return new RenderWarFactory(init); } + public override object Create(ActorInitializer init) { return new RenderWarFactory( init, this ); } /* get around unverifiability */ IEnumerable BaseBuildingPreview(ActorInfo building, string tileset) @@ -45,8 +45,8 @@ namespace OpenRA.Mods.RA.Render [Sync] int2 openExit; - public RenderWarFactory(ActorInitializer init) - : base(init) + public RenderWarFactory(ActorInitializer init, RenderBuildingInfo info) + : base(init, info) { roof = new Animation(GetImage(init.self)); }