diff --git a/OpenRa.Game/Effects/Corpse.cs b/OpenRa.Game/Effects/Corpse.cs index f37a1116b3..470a790f12 100755 --- a/OpenRa.Game/Effects/Corpse.cs +++ b/OpenRa.Game/Effects/Corpse.cs @@ -15,7 +15,8 @@ namespace OpenRa.Game.Effects public Corpse(Actor fromActor, int death) { - anim = new Animation(fromActor.LegacyInfo.Image ?? fromActor.LegacyInfo.Name); + var info = fromActor.Info.Traits.WithInterface().First(); + anim = new Animation(info.Image ?? fromActor.Info.Name); anim.PlayThen("die{0}".F(death + 1), () => Game.world.AddFrameEndTask(w => w.Remove(this))); diff --git a/OpenRa.Game/GameRules/NewUnitInfo.cs b/OpenRa.Game/GameRules/NewUnitInfo.cs index 3d80aba9f1..62cee867be 100755 --- a/OpenRa.Game/GameRules/NewUnitInfo.cs +++ b/OpenRa.Game/GameRules/NewUnitInfo.cs @@ -10,9 +10,13 @@ namespace OpenRa.Game.GameRules { public readonly string Parent; public readonly TypeDictionary Traits = new TypeDictionary(); + public readonly string Name; - public NewUnitInfo( MiniYaml node ) + public NewUnitInfo( string name, MiniYaml node ) { + Name = name; + + // todo: make inheritance actually work MiniYaml inherit; if( node.Nodes.TryGetValue( "Inherits", out inherit ) ) { diff --git a/OpenRa.Game/GameRules/Rules.cs b/OpenRa.Game/GameRules/Rules.cs index 30c9781e35..d7200d93ec 100755 --- a/OpenRa.Game/GameRules/Rules.cs +++ b/OpenRa.Game/GameRules/Rules.cs @@ -97,7 +97,7 @@ namespace OpenRa.Game NewUnitInfo = new Dictionary(); foreach( var kv in MiniYaml.FromFile( "ra.yaml" ) ) - NewUnitInfo.Add( kv.Key.ToLowerInvariant(), new NewUnitInfo( kv.Value ) ); + NewUnitInfo.Add(kv.Key.ToLowerInvariant(), new NewUnitInfo(kv.Key.ToLowerInvariant(), kv.Value)); } static void LoadCategories(params string[] types) diff --git a/OpenRa.Game/Traits/AutoTarget.cs b/OpenRa.Game/Traits/AutoTarget.cs index f247ca218a..29d588a8f3 100644 --- a/OpenRa.Game/Traits/AutoTarget.cs +++ b/OpenRa.Game/Traits/AutoTarget.cs @@ -15,7 +15,8 @@ namespace OpenRa.Game.Traits float GetMaximumRange(Actor self) { - return new[] { self.LegacyInfo.Primary, self.LegacyInfo.Secondary } + var info = self.Info.Traits.WithInterface().First(); + return new[] { info.PrimaryWeapon, info.SecondaryWeapon } .Where(w => w != null) .Max(w => Rules.WeaponInfo[w].Range); } diff --git a/OpenRa.Game/Traits/LimitedAmmo.cs b/OpenRa.Game/Traits/LimitedAmmo.cs index 3e8536b948..5d1a705e6d 100644 --- a/OpenRa.Game/Traits/LimitedAmmo.cs +++ b/OpenRa.Game/Traits/LimitedAmmo.cs @@ -17,14 +17,14 @@ namespace OpenRa.Game.Traits public LimitedAmmo(Actor self) { - ammo = self.LegacyInfo.Ammo; + ammo = self.Info.Traits.Get().Ammo; this.self = self; } public bool HasAmmo() { return ammo > 0; } public bool GiveAmmo() { - if (ammo >= self.LegacyInfo.Ammo) return false; + if (ammo >= self.Info.Traits.Get().Ammo) return false; ++ammo; return true; } @@ -33,7 +33,8 @@ namespace OpenRa.Game.Traits public IEnumerable GetPips(Actor self) { - return Graphics.Util.MakeArray(self.LegacyInfo.Ammo, + var maxAmmo = self.Info.Traits.Get().Ammo; + return Graphics.Util.MakeArray(maxAmmo, i => ammo > i ? PipType.Green : PipType.Transparent); } } diff --git a/OpenRa.Game/Traits/RenderUnitMuzzleFlash.cs b/OpenRa.Game/Traits/RenderUnitMuzzleFlash.cs index 118abcbe18..53211abcf6 100644 --- a/OpenRa.Game/Traits/RenderUnitMuzzleFlash.cs +++ b/OpenRa.Game/Traits/RenderUnitMuzzleFlash.cs @@ -15,8 +15,6 @@ namespace OpenRa.Game.Traits public RenderUnitMuzzleFlash(Actor self) : base(self) { - if (!self.LegacyInfo.MuzzleFlash) throw new InvalidOperationException("wtf??"); - var unit = self.traits.Get(); var attack = self.traits.WithInterface().First(); diff --git a/OpenRa.Game/Traits/RenderUnitRotor.cs b/OpenRa.Game/Traits/RenderUnitRotor.cs index ef4f70431b..a8d6b75f23 100755 --- a/OpenRa.Game/Traits/RenderUnitRotor.cs +++ b/OpenRa.Game/Traits/RenderUnitRotor.cs @@ -4,6 +4,9 @@ namespace OpenRa.Game.Traits { class RenderUnitRotorInfo : RenderUnitInfo { + public readonly int[] PrimaryOffset = { 0, 0 }; + public readonly int[] SecondaryOffset = null; + public override object Create(Actor self) { return new RenderUnitRotor(self); } } @@ -15,21 +18,22 @@ namespace OpenRa.Game.Traits : base(self) { var unit = self.traits.Get(); + var info = self.Info.Traits.Get(); - rotorAnim = new Animation(self.LegacyInfo.Name); + rotorAnim = new Animation(info.Image ?? self.Info.Name); rotorAnim.PlayRepeating("rotor"); anims.Add( "rotor_1", new AnimationWithOffset( rotorAnim, - () => Util.GetTurretPosition( self, unit, self.LegacyInfo.RotorOffset, 0 ), + () => Util.GetTurretPosition( self, unit, info.PrimaryOffset, 0 ), null ) ); - if (self.LegacyInfo.RotorOffset2 == null) return; + if (info.SecondaryOffset == null) return; - secondRotorAnim = new Animation( self.LegacyInfo.Name ); + secondRotorAnim = new Animation(info.Image ?? self.Info.Name); secondRotorAnim.PlayRepeating( "rotor2" ); anims.Add( "rotor_2", new AnimationWithOffset( secondRotorAnim, - () => Util.GetTurretPosition(self, unit, self.LegacyInfo.RotorOffset2, 0), + () => Util.GetTurretPosition(self, unit, info.SecondaryOffset, 0), null ) ); } diff --git a/OpenRa.Game/Traits/RenderUnitSpinner.cs b/OpenRa.Game/Traits/RenderUnitSpinner.cs index 54794eb915..f0415e816b 100755 --- a/OpenRa.Game/Traits/RenderUnitSpinner.cs +++ b/OpenRa.Game/Traits/RenderUnitSpinner.cs @@ -1,10 +1,12 @@ using System.Collections.Generic; +using System.Linq; using OpenRa.Game.Graphics; namespace OpenRa.Game.Traits { class RenderUnitSpinnerInfo : RenderUnitInfo { + public readonly int[] Offset = { 0, 0 }; public override object Create(Actor self) { return new RenderUnitSpinner(self); } } @@ -14,12 +16,13 @@ namespace OpenRa.Game.Traits : base(self) { var unit = self.traits.Get(); + var info = self.Info.Traits.Get(); - var spinnerAnim = new Animation( self.LegacyInfo.Name ); + var spinnerAnim = new Animation( info.Image ?? self.Info.Name ); spinnerAnim.PlayRepeating( "spinner" ); anims.Add( "spinner", new AnimationWithOffset( spinnerAnim, - () => Util.GetTurretPosition( self, unit, self.LegacyInfo.PrimaryOffset, 0 ), + () => Util.GetTurretPosition( self, unit, info.Offset, 0 ), null ) ); } } diff --git a/OpenRa.Game/Traits/Turreted.cs b/OpenRa.Game/Traits/Turreted.cs index cacb90e7aa..3df089fae2 100644 --- a/OpenRa.Game/Traits/Turreted.cs +++ b/OpenRa.Game/Traits/Turreted.cs @@ -1,8 +1,12 @@ - +using System.Linq; + namespace OpenRa.Game.Traits { class TurretedInfo : ITraitInfo { + public readonly int ROT = 0; + public readonly int InitialFacing = 128; + public object Create(Actor self) { return new Turreted(self); } } @@ -14,13 +18,13 @@ namespace OpenRa.Game.Traits public Turreted(Actor self) { - turretFacing = self.LegacyInfo.InitialFacing; + turretFacing = self.Info.Traits.Get().InitialFacing; } public void Tick( Actor self ) { var df = desiredFacing ?? ( self.traits.Contains() ? self.traits.Get().Facing : turretFacing ); - Util.TickFacing( ref turretFacing, df, self.LegacyInfo.ROT ); + Util.TickFacing(ref turretFacing, df, self.Info.Traits.Get().ROT); } } } diff --git a/RulesConverter/Program.cs b/RulesConverter/Program.cs index 0ff9208a33..7dc38d3f6f 100644 --- a/RulesConverter/Program.cs +++ b/RulesConverter/Program.cs @@ -70,6 +70,17 @@ namespace RulesConverter { "Image", "Image" } } }, + { "RenderUnitSpinner", new PL { + { "Image", "Image" }, + { "Offset", "PrimaryOffset" } } + }, + + { "RenderUnitRotor", new PL { + { "Image", "Image" }, + { "PrimaryOffset", "RotorOffset" }, + { "SecondaryOffset", "RotorOffset2" } } + }, + { "Buildable", new PL { { "TechLevel", "TechLevel" }, { "Tab", "$Tab" }, @@ -136,8 +147,6 @@ namespace RulesConverter traitMap["RenderInfantry"] = traitMap["RenderBuilding"]; traitMap["RenderUnitMuzzleFlash"] = traitMap["RenderBuilding"]; traitMap["RenderUnitReload"] = traitMap["RenderBuilding"]; - traitMap["RenderUnitRotor"] = traitMap["RenderBuilding"]; - traitMap["RenderUnitSpinner"] = traitMap["RenderBuilding"]; traitMap["RenderUnitTurreted"] = traitMap["RenderBuilding"]; traitMap["AttackTurreted"] = traitMap["AttackBase"]; diff --git a/ra.yaml b/ra.yaml index 086b7975eb..51defaa4c3 100644 --- a/ra.yaml +++ b/ra.yaml @@ -175,6 +175,7 @@ MRJ: ROT: 5 Speed: 9 RenderUnitSpinner: + Offset: 0,4,0,-6 Repairable: Chronoshiftable: Passenger: @@ -202,6 +203,7 @@ MGG: ROT: 5 Speed: 9 RenderUnitSpinner: + Offset: 0,6,0,-3 Repairable: Chronoshiftable: Passenger: @@ -624,6 +626,8 @@ TRAN: ROT: 5 Speed: 12 RenderUnitRotor: + PrimaryOffset: 0,14,0,-4 + SecondaryOffset: 0,-14,0,-2 WithShadow: Cargo: PassengerTypes: Foot @@ -653,6 +657,7 @@ HELI: ROT: 4 Speed: 16 RenderUnitRotor: + PrimaryOffset: 0,0,0,-2 WithShadow: LimitedAmmo: Ammo: 6