Remove some bogosity from RenderBuilding

This commit is contained in:
Paul Chote
2011-04-16 11:19:37 +12:00
parent 1c2574f4f4
commit 7b0a9136ab
6 changed files with 37 additions and 43 deletions

View File

@@ -23,43 +23,27 @@ namespace OpenRA.Mods.RA.Render
{ {
public readonly bool HasMakeAnimation = true; public readonly bool HasMakeAnimation = true;
public readonly float2 Origin = float2.Zero; 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<Renderable> RenderPreview(ActorInfo building, string Tileset) public override IEnumerable<Renderable> RenderPreview(ActorInfo building, string Tileset)
{ {
var rb = building.Traits.Get<RenderBuildingInfo>();
return base.RenderPreview(building, Tileset) return base.RenderPreview(building, Tileset)
.Select(a => a.WithPos(a.Pos + rb.Origin)); .Select(a => a.WithPos(a.Pos + building.Traits.Get<RenderBuildingInfo>().Origin));
} }
} }
public class RenderBuilding : RenderSimple, INotifyDamage, INotifySold, IRenderModifier public class RenderBuilding : RenderSimple, INotifyDamage, INotifySold, IRenderModifier
{ {
readonly float2 Origin; readonly RenderBuildingInfo Info;
public RenderBuilding( ActorInitializer init ) public RenderBuilding( ActorInitializer init, RenderBuildingInfo info )
: this( init, () => 0 ) : this(init, info, () => 0) { }
{
Origin = init.self.Info.Traits.Get<RenderBuildingInfo>().Origin;
}
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{
var disabled = self.TraitsImplementing<IDisable>().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, Func<int> baseFacing ) public RenderBuilding( ActorInitializer init, RenderBuildingInfo info, Func<int> baseFacing )
: base(init.self, baseFacing) : base(init.self, baseFacing)
{ {
Info = info;
var self = init.self; var self = init.self;
// Work around a bogus crash // Work around a bogus crash
anim.PlayRepeating( NormalizeSequence(self, "idle") ); 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 // Can't call Complete() from ctor because other traits haven't been inited yet
self.QueueActivity(new CallFunc(() => self.World.AddFrameEndTask( _ => Complete( self ) ))); self.QueueActivity(new CallFunc(() => self.World.AddFrameEndTask( _ => Complete( self ) )));
} }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{
var disabled = self.TraitsImplementing<IDisable>().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 ) void Complete( Actor self )
{ {
anim.PlayRepeating( NormalizeSequence(self, "idle") ); anim.PlayRepeating( NormalizeSequence(self, "idle") );
@@ -119,7 +115,7 @@ namespace OpenRA.Mods.RA.Render
public virtual void Selling( Actor self ) public virtual void Selling( Actor self )
{ {
if( self.Info.Traits.Get<RenderBuildingInfo>().HasMakeAnimation ) if( Info.HasMakeAnimation )
anim.PlayBackwardsThen( "make", null ); anim.PlayBackwardsThen( "make", null );
foreach (var s in self.Info.Traits.Get<BuildingInfo>().SellSounds) foreach (var s in self.Info.Traits.Get<BuildingInfo>().SellSounds)

View File

@@ -13,14 +13,14 @@ namespace OpenRA.Mods.RA.Render
class RenderBuildingChargeInfo : RenderBuildingInfo class RenderBuildingChargeInfo : RenderBuildingInfo
{ {
public readonly string ChargeAudio = "tslachg2.aud"; 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 */ /* used for tesla */
public class RenderBuildingCharge : RenderBuilding public class RenderBuildingCharge : RenderBuilding
{ {
public RenderBuildingCharge( ActorInitializer init ) public RenderBuildingCharge( ActorInitializer init, RenderBuildingInfo info )
: base(init) : base(init, info)
{ {
} }

View File

@@ -14,15 +14,15 @@ namespace OpenRA.Mods.RA.Render
{ {
class RenderBuildingOreInfo : RenderBuildingInfo 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 class RenderBuildingOre : RenderBuilding, INotifyBuildComplete, INotifyCapture
{ {
PlayerResources PlayerResources; PlayerResources PlayerResources;
public RenderBuildingOre( ActorInitializer init ) public RenderBuildingOre( ActorInitializer init, RenderBuildingInfo info )
: base(init) : base(init, info)
{ {
PlayerResources = init.self.Owner.PlayerActor.Trait<PlayerResources>(); PlayerResources = init.self.Owner.PlayerActor.Trait<PlayerResources>();
} }
@@ -34,7 +34,7 @@ namespace OpenRA.Mods.RA.Render
} }
public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner) public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner)
{ {
PlayerResources = newOwner.PlayerActor.Trait<PlayerResources>(); PlayerResources = newOwner.PlayerActor.Trait<PlayerResources>();
} }
} }

View File

@@ -15,15 +15,13 @@ namespace OpenRA.Mods.RA.Render
{ {
class RenderBuildingTurretedInfo : RenderBuildingInfo 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 class RenderBuildingTurreted : RenderBuilding, INotifyBuildComplete
{ {
public RenderBuildingTurreted( ActorInitializer init ) public RenderBuildingTurreted( ActorInitializer init, RenderBuildingInfo info )
: base(init, () => init.self.Trait<Turreted>().turretFacing) : base(init, info, () => init.self.Trait<Turreted>().turretFacing) { }
{
}
public void BuildingComplete( Actor self ) public void BuildingComplete( Actor self )
{ {

View File

@@ -16,7 +16,7 @@ namespace OpenRA.Mods.RA.Render
{ {
class RenderBuildingWallInfo : RenderBuildingInfo 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 class RenderBuildingWall : RenderBuilding, INotifyBuildComplete
@@ -24,8 +24,8 @@ namespace OpenRA.Mods.RA.Render
string seqName; string seqName;
int adjacentWalls = 0; int adjacentWalls = 0;
public RenderBuildingWall( ActorInitializer init ) public RenderBuildingWall( ActorInitializer init, RenderBuildingInfo info )
: base(init) : base(init, info)
{ {
seqName = "idle"; seqName = "idle";
} }

View File

@@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA.Render
{ {
class RenderWarFactoryInfo : RenderBuildingInfo 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 */ /* get around unverifiability */
IEnumerable<Renderable> BaseBuildingPreview(ActorInfo building, string tileset) IEnumerable<Renderable> BaseBuildingPreview(ActorInfo building, string tileset)
@@ -45,8 +45,8 @@ namespace OpenRA.Mods.RA.Render
[Sync] [Sync]
int2 openExit; int2 openExit;
public RenderWarFactory(ActorInitializer init) public RenderWarFactory(ActorInitializer init, RenderBuildingInfo info)
: base(init) : base(init, info)
{ {
roof = new Animation(GetImage(init.self)); roof = new Animation(GetImage(init.self));
} }