From 2bf7cb1496be4e5cab3567ff1cdd737d45277773 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 28 Jul 2011 23:07:14 +1200 Subject: [PATCH] fix #1052; tidy up *Init; route initial turret facing for husks through new TurretFacingInit --- OpenRA.Game/ActorInitializer.cs | 105 ++++++++---------------------- OpenRA.Game/Traits/ActorStance.cs | 20 ++---- OpenRA.Game/Traits/Health.cs | 22 ++----- OpenRA.Mods.RA/Husk.cs | 16 +---- OpenRA.Mods.RA/LeavesHusk.cs | 15 +++-- OpenRA.Mods.RA/ThrowsParticle.cs | 53 +++++++-------- OpenRA.Mods.RA/Turreted.cs | 17 +++-- 7 files changed, 84 insertions(+), 164 deletions(-) diff --git a/OpenRA.Game/ActorInitializer.cs b/OpenRA.Game/ActorInitializer.cs index 7e5c33554a..465eed6721 100755 --- a/OpenRA.Game/ActorInitializer.cs +++ b/OpenRA.Game/ActorInitializer.cs @@ -17,6 +17,7 @@ namespace OpenRA { public readonly Actor self; public World world { get { return self.World; } } + internal TypeDictionary dict; public ActorInitializer( Actor actor, TypeDictionary dict ) @@ -25,23 +26,9 @@ namespace OpenRA this.dict = dict; } - public T Get() - where T : IActorInit - { - return dict.Get(); - } - - public U Get() - where T : IActorInit - { - return dict.Get().Value( world ); - } - - public bool Contains() - where T : IActorInit - { - return dict.Contains(); - } + public T Get() where T : IActorInit { return dict.Get(); } + public U Get() where T : IActorInit { return dict.Get().Value( world ); } + public bool Contains() where T : IActorInit { return dict.Contains(); } } public interface IActorInit {} @@ -53,91 +40,53 @@ namespace OpenRA public class FacingInit : IActorInit { - [FieldFromYamlKey] - public readonly int value = 128; - + [FieldFromYamlKey] public readonly int value = 128; public FacingInit() { } - - public FacingInit( int init ) - { - value = init; - } - - public int Value( World world ) - { - return value; - } + public FacingInit( int init ) { value = init; } + public int Value( World world ) { return value; } + } + + public class TurretFacingInit : IActorInit + { + [FieldFromYamlKey] public readonly int value = 128; + public TurretFacingInit() { } + public TurretFacingInit( int init ) { value = init; } + public int Value( World world ) { return value; } } public class AltitudeInit : IActorInit { - [FieldFromYamlKey] - public readonly int value = 0; - + [FieldFromYamlKey] public readonly int value = 0; public AltitudeInit() { } - - public AltitudeInit( int init ) - { - value = init; - } - - public int Value( World world ) - { - return value; - } + public AltitudeInit( int init ) { value = init; } + public int Value( World world ) { return value; } } public class LocationInit : IActorInit { - [FieldFromYamlKey] - public readonly int2 value = int2.Zero; - + [FieldFromYamlKey] public readonly int2 value = int2.Zero; public LocationInit() { } - - public LocationInit( int2 init ) - { - value = init; - } - - public int2 Value( World world ) - { - return value; - } + public LocationInit( int2 init ) { value = init; } + public int2 Value( World world ) { return value; } } public class CenterLocationInit : IActorInit { - [FieldFromYamlKey] - public readonly int2 value = int2.Zero; - + [FieldFromYamlKey] public readonly int2 value = int2.Zero; public CenterLocationInit() { } - - public CenterLocationInit( int2 init ) - { - value = init; - } - - public int2 Value( World world ) - { - return value; - } + public CenterLocationInit( int2 init ) { value = init; } + public int2 Value( World world ) { return value; } } public class OwnerInit : IActorInit { - [FieldFromYamlKey] - public readonly string PlayerName = "Neutral"; + [FieldFromYamlKey] public readonly string PlayerName = "Neutral"; Player player; public OwnerInit() { } + public OwnerInit( string playerName ) { this.PlayerName = playerName; } - public OwnerInit( string playerName ) - { - this.PlayerName = playerName; - } - - public OwnerInit( Player player ) - { + public OwnerInit( Player player ) { this.player = player; this.PlayerName = player.InternalName; } diff --git a/OpenRA.Game/Traits/ActorStance.cs b/OpenRA.Game/Traits/ActorStance.cs index dd18a6664a..b82ef17ef4 100644 --- a/OpenRA.Game/Traits/ActorStance.cs +++ b/OpenRA.Game/Traits/ActorStance.cs @@ -15,7 +15,7 @@ namespace OpenRA.Traits { public object Create(ActorInitializer init) { return new ActorStance(init); } } - + public class ActorStance { // Stances modify default actor behavior @@ -31,22 +31,12 @@ namespace OpenRA.Traits // Doesn't do anything... yet public ActorStance(ActorInitializer init) {} } - + public class ActorStanceInit : IActorInit { - [FieldFromYamlKey] - public readonly ActorStance.Stance value = ActorStance.Stance.None; - + [FieldFromYamlKey] public readonly ActorStance.Stance value = ActorStance.Stance.None; public ActorStanceInit() { } - - public ActorStanceInit( ActorStance.Stance init ) - { - value = init; - } - - public ActorStance.Stance Value( World world ) - { - return value; - } + public ActorStanceInit( ActorStance.Stance init ) { value = init; } + public ActorStance.Stance Value( World world ) { return value; } } } diff --git a/OpenRA.Game/Traits/Health.cs b/OpenRA.Game/Traits/Health.cs index f74a8572ab..22d0d27d9e 100755 --- a/OpenRA.Game/Traits/Health.cs +++ b/OpenRA.Game/Traits/Health.cs @@ -133,27 +133,15 @@ namespace OpenRA.Traits DisplayHp = (2 * DisplayHp + hp) / 3; } } - - + public class HealthInit : IActorInit { - [FieldFromYamlKey] - public readonly float value = 1f; - + [FieldFromYamlKey] public readonly float value = 1f; public HealthInit() { } - - public HealthInit( float init ) - { - value = init; - } - - public float Value( World world ) - { - return value; - } + public HealthInit( float init ) { value = init; } + public float Value( World world ) { return value; } } - - + public static class HealthExts { public static bool IsDead(this Actor self) diff --git a/OpenRA.Mods.RA/Husk.cs b/OpenRA.Mods.RA/Husk.cs index 23736981fa..10cabf1d59 100644 --- a/OpenRA.Mods.RA/Husk.cs +++ b/OpenRA.Mods.RA/Husk.cs @@ -89,19 +89,9 @@ namespace OpenRA.Mods.RA public class HuskSpeedInit : IActorInit { - [FieldFromYamlKey] - public readonly int value = 0; - + [FieldFromYamlKey] public readonly int value = 0; public HuskSpeedInit() { } - - public HuskSpeedInit( int init ) - { - value = init; - } - - public int Value( World world ) - { - return value; - } + public HuskSpeedInit( int init ) { value = init; } + public int Value( World world ) { return value; } } } diff --git a/OpenRA.Mods.RA/LeavesHusk.cs b/OpenRA.Mods.RA/LeavesHusk.cs index 060fda54e7..196c0d4627 100644 --- a/OpenRA.Mods.RA/LeavesHusk.cs +++ b/OpenRA.Mods.RA/LeavesHusk.cs @@ -43,8 +43,13 @@ namespace OpenRA.Mods.RA new SkipMakeAnimsInit() }; - if (self.HasTrait()) - td.Add(new FacingInit( self.Trait().Facing )); + var facing = self.TraitOrDefault(); + if (facing != null) + td.Add(new FacingInit( facing.Facing )); + + var turreted = self.TraitOrDefault(); + if (turreted != null) + td.Add( new TurretFacingInit(turreted.turretFacing) ); // Allows the husk to drag to its final position var mobile = self.TraitOrDefault(); @@ -55,11 +60,7 @@ namespace OpenRA.Mods.RA .Select(ihm => ihm.HuskActor(self)) .FirstOrDefault(a => a != null); - var husk = w.CreateActor(huskActor ?? Info.HuskActor, td); - var turreted = self.TraitOrDefault(); - if (turreted != null) - foreach (var p in husk.TraitsImplementing()) - p.InitialFacing = turreted.turretFacing; + w.CreateActor(huskActor ?? Info.HuskActor, td); }); } } diff --git a/OpenRA.Mods.RA/ThrowsParticle.cs b/OpenRA.Mods.RA/ThrowsParticle.cs index 2eb32fcb88..afa49d8f4e 100644 --- a/OpenRA.Mods.RA/ThrowsParticle.cs +++ b/OpenRA.Mods.RA/ThrowsParticle.cs @@ -14,22 +14,20 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA { - class ThrowsParticleInfo : ITraitInfo + class ThrowsParticleInfo : ITraitInfo, Requires { public readonly string Anim = null; public readonly int[] Offset = new[] { 0, 0, 0, 0 }; public readonly int[] Spread = new[] { 0, 0 }; public readonly float Speed = 20; public readonly string AnimKey = null; - public readonly bool UseTurretFacing = true; public readonly float ROT = 15; - public object Create(ActorInitializer init) { return new ThrowsParticle(this); } + public object Create(ActorInitializer init) { return new ThrowsParticle(init, this); } } class ThrowsParticle : ITick { - ThrowsParticleInfo info; float2 pos; float alt; @@ -40,34 +38,29 @@ namespace OpenRA.Mods.RA const float gravity = 1.3f; - public ThrowsParticle(ThrowsParticleInfo info) { this.info = info; } - public float? InitialFacing = null; - + public ThrowsParticle(ActorInitializer init, ThrowsParticleInfo info) + { + var self = init.self; + var ifacing = self.Trait(); + var ru = self.Trait(); + + alt = 0; + facing = Turreted.GetInitialTurretFacing( init, 0 ); + pos = Combat.GetTurretPosition(self, ifacing, new Turret(info.Offset)); + + v = Game.CosmeticRandom.Gauss2D(1) * info.Spread.RelOffset(); + dfacing = Game.CosmeticRandom.Gauss1D(2) * info.ROT; + va = info.Speed; + + var anim = new Animation(ru.GetImage(self), () => (int)facing); + anim.PlayRepeating(info.Anim); + + ru.anims.Add(info.AnimKey, new AnimationWithOffset( + anim, () => pos - new float2(0, alt), null)); + } + public void Tick(Actor self) { - if (info != null) - { - alt = 0; - var ifacing = self.Trait(); - pos = Combat.GetTurretPosition(self, ifacing, new Turret(info.Offset)); - var ru = self.Trait(); - - v = Game.CosmeticRandom.Gauss2D(1) * info.Spread.RelOffset(); - dfacing = Game.CosmeticRandom.Gauss1D(2) * info.ROT; - va = info.Speed; - - if (!info.UseTurretFacing) InitialFacing = null; - facing = InitialFacing ?? ifacing.Facing; - - var anim = new Animation(ru.GetImage(self), () => (int)facing); - anim.PlayRepeating(info.Anim); - - ru.anims.Add(info.AnimKey, new AnimationWithOffset( - anim, () => pos - new float2(0, alt), null)); - - info = null; - } - va -= gravity; alt += va; diff --git a/OpenRA.Mods.RA/Turreted.cs b/OpenRA.Mods.RA/Turreted.cs index 42f8d2f5b8..6f7921abb7 100755 --- a/OpenRA.Mods.RA/Turreted.cs +++ b/OpenRA.Mods.RA/Turreted.cs @@ -22,17 +22,26 @@ namespace OpenRA.Mods.RA public class Turreted : ITick, ISync { - [Sync] - public int turretFacing = 0; + [Sync] public int turretFacing = 0; public int? desiredFacing; TurretedInfo info; IFacing facing; + public static int GetInitialTurretFacing(ActorInitializer init, int def) + { + if (init.Contains()) + return init.Get(); + + if (init.Contains()) + return init.Get(); + + return def; + } + public Turreted(ActorInitializer init, TurretedInfo info) { this.info = info; - turretFacing = info.InitialFacing; - turretFacing = init.Contains() ? init.Get() : info.InitialFacing; + turretFacing = GetInitialTurretFacing(init, info.InitialFacing); facing = init.self.TraitOrDefault(); }