Move weapon/turret definitions out of AttackBase.
Weapons are now defined with the Armament trait and turret parameters live in Turreted. This has the side effect of allowing any number and distribution of weapons and turrets.
This commit is contained in:
@@ -24,19 +24,17 @@ namespace OpenRA.Mods.RA.Render
|
||||
public RenderBuildingSeparateTurret(ActorInitializer init, RenderBuildingInfo info)
|
||||
: base(init, info)
|
||||
{
|
||||
var turreted = init.self.Trait<Turreted>();
|
||||
var attack = init.self.Trait<AttackBase>();
|
||||
var self = init.self;
|
||||
var turreted = self.TraitsImplementing<Turreted>();
|
||||
|
||||
var turretAnim = new Animation(GetImage(init.self), () => turreted.turretFacing);
|
||||
turretAnim.Play("turret");
|
||||
|
||||
for( var i = 0; i < attack.Turrets.Count; i++ )
|
||||
var i = 0;
|
||||
foreach (var t in turreted)
|
||||
{
|
||||
var turret = attack.Turrets[i];
|
||||
anims.Add( "turret_{0}".F(i),
|
||||
new AnimationWithOffset(turretAnim,
|
||||
() => Combat.GetTurretPosition(init.self, null, turret).ToFloat2(),
|
||||
null));
|
||||
var anim = new Animation(GetImage(self), () => t.turretFacing);
|
||||
anim.Play("turret");
|
||||
|
||||
anims.Add("turret_{0}".F(i++), new AnimationWithOffset(anim,
|
||||
() => t.PxPosition(self, null).ToFloat2(), null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using OpenRA.Mods.RA.Buildings;
|
||||
using OpenRA.Traits;
|
||||
|
||||
@@ -26,7 +27,8 @@ namespace OpenRA.Mods.RA.Render
|
||||
|
||||
static Func<int> MakeTurretFacingFunc(Actor self)
|
||||
{
|
||||
var turreted = self.Trait<Turreted>();
|
||||
// Turret artwork is baked into the sprite, so only the first turret makes sense.
|
||||
var turreted = self.TraitsImplementing<Turreted>().FirstOrDefault();
|
||||
return () => turreted.turretFacing;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,9 +31,10 @@ namespace OpenRA.Mods.RA.Render
|
||||
|
||||
spinnerAnim.PlayRepeating("spinner");
|
||||
|
||||
var turret = new Turret(info.Offset);
|
||||
anims.Add("spinner", new AnimationWithOffset(
|
||||
spinnerAnim,
|
||||
() => Combat.GetTurretPosition( self, facing, new Turret(info.Offset)).ToFloat2(),
|
||||
() => turret.PxPosition(self, facing).ToFloat2(),
|
||||
null ) { ZOffset = 1 } );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
@@ -24,20 +26,30 @@ namespace OpenRA.Mods.RA.Render
|
||||
: base(self)
|
||||
{
|
||||
var facing = self.Trait<IFacing>();
|
||||
var turreted = self.Trait<Turreted>();
|
||||
var attack = self.Trait<AttackBase>();
|
||||
var turreted = self.TraitsImplementing<Turreted>();
|
||||
|
||||
var turretAnim = new Animation(GetImage(self), () => turreted.turretFacing );
|
||||
turretAnim.Play( "turret" );
|
||||
|
||||
for( var i = 0; i < attack.Turrets.Count; i++ )
|
||||
var i = 0;
|
||||
foreach (var t in turreted)
|
||||
{
|
||||
var turret = attack.Turrets[i];
|
||||
anims.Add( "turret_{0}".F(i),
|
||||
new AnimationWithOffset( turretAnim,
|
||||
() => Combat.GetTurretPosition( self, facing, turret ).ToFloat2(),
|
||||
null));
|
||||
var turret = t;
|
||||
|
||||
var anim = new Animation(GetImage(self), () => turret.turretFacing);
|
||||
anim.Play("turret");
|
||||
|
||||
anims.Add("turret_{0}".F(i++), new AnimationWithOffset(anim,
|
||||
() => turret.PxPosition(self, facing).ToFloat2() + RecoilOffset(self, turret), null));
|
||||
}
|
||||
}
|
||||
|
||||
float2 RecoilOffset(Actor self, Turreted t)
|
||||
{
|
||||
var a = self.TraitsImplementing<Armament>()
|
||||
.OrderByDescending(w => w.Recoil)
|
||||
.FirstOrDefault(w => w.Info.Turret == t.info.Turret);
|
||||
if (a == null)
|
||||
return float2.Zero;
|
||||
|
||||
return a.RecoilPxOffset(self, t.turretFacing).ToFloat2();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
using System;
|
||||
using OpenRA.Mods.RA;
|
||||
|
||||
namespace OpenRA.Mods.RA.Render
|
||||
{
|
||||
@@ -27,25 +29,25 @@ namespace OpenRA.Mods.RA.Render
|
||||
|
||||
public WithMuzzleFlash(Actor self)
|
||||
{
|
||||
var attack = self.Trait<AttackBase>();
|
||||
var render = self.Trait<RenderSimple>();
|
||||
var facing = self.TraitOrDefault<IFacing>();
|
||||
var turreted = self.TraitOrDefault<Turreted>();
|
||||
var getFacing = turreted != null ? () => turreted.turretFacing :
|
||||
facing != null ? (Func<int>)(() => facing.Facing) : () => 0;
|
||||
|
||||
foreach (var w in attack.Weapons)
|
||||
foreach( var b in w.Barrels )
|
||||
var arms = self.TraitsImplementing<Armament>();
|
||||
foreach (var a in arms)
|
||||
foreach(var b in a.Barrels)
|
||||
{
|
||||
var barrel = b;
|
||||
var turret = w.Turret;
|
||||
var turreted = self.TraitsImplementing<Turreted>()
|
||||
.FirstOrDefault(t => t.info.Turret == a.Info.Turret);
|
||||
var getFacing = turreted != null ? () => turreted.turretFacing :
|
||||
facing != null ? (Func<int>)(() => facing.Facing) : () => 0;
|
||||
|
||||
var muzzleFlash = new Animation(render.GetImage(self), getFacing);
|
||||
muzzleFlash.Play("muzzle");
|
||||
|
||||
muzzleFlashes.Add("muzzle{0}".F(muzzleFlashes.Count), new AnimationWithOffset(
|
||||
muzzleFlash,
|
||||
() => Combat.GetBarrelPosition(self, facing, turret, barrel).ToFloat2(),
|
||||
() => a.MuzzlePxPosition(self, facing, barrel).ToFloat2(),
|
||||
() => !isShowing));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,9 +30,10 @@ namespace OpenRA.Mods.RA.Render
|
||||
|
||||
rotorAnim = new Animation(rs.GetImage(self));
|
||||
rotorAnim.PlayRepeating("rotor");
|
||||
var turret = new Turret(info.Offset);
|
||||
rs.anims.Add(info.Id, new AnimationWithOffset(
|
||||
rotorAnim,
|
||||
() => Combat.GetTurretPosition( self, facing, new Turret(info.Offset)).ToFloat2(),
|
||||
() => turret.PxPosition(self, facing).ToFloat2(),
|
||||
null ) { ZOffset = 1 } );
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user