diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 97e4a8566c..ade911e8dd 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -352,7 +352,7 @@ namespace OpenRa.Game return; } - Actor unit; + Actor newActor; if (producerTypes.Contains("spen") || producerTypes.Contains("syrd")) { @@ -362,9 +362,9 @@ namespace OpenRa.Game if (space == null) return; - unit = new Actor(name, space.Value, player); - var mobile = unit.traits.Get(); - mobile.facing = SharedRandom.Next(256); + newActor = new Actor(name, space.Value, player); + var unit = newActor.traits.Get(); + unit.Facing = SharedRandom.Next(256); } else { @@ -372,26 +372,27 @@ namespace OpenRa.Game if (UnitInfluence.GetUnitAt(productionPoint) != null) return; - unit = new Actor(name, (1 / 24f * producer.CenterLocation).ToInt2(), player); + newActor = new Actor(name, (1 / 24f * producer.CenterLocation).ToInt2(), player); var rp = producer.traits.GetOrDefault(); - var dest = rp != null ? rp.rallyPoint : (unit.Location + new int2(0, 3)); + var dest = rp != null ? rp.rallyPoint : (newActor.Location + new int2(0, 3)); - var mobile = unit.traits.GetOrDefault(); - if (mobile != null) + var unit = newActor.traits.Get(); + var mobile = newActor.traits.GetOrDefault(); + if( mobile != null ) { - mobile.facing = 128; + unit.Facing = 128; mobile.QueueActivity(new Traits.Activities.Move(dest, 1)); } - var heli = unit.traits.GetOrDefault(); + var heli = newActor.traits.GetOrDefault(); if (heli != null) { - heli.facing = 20; + unit.Facing = 20; heli.targetLocation = dest; } } - world.Add(unit); + world.Add(newActor); player.FinishProduction(Rules.UnitCategory[name]); if (producer.traits.Contains()) diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 5066fefc11..ed3731d607 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -159,6 +159,7 @@ + diff --git a/OpenRa.Game/Traits/AcceptsOre.cs b/OpenRa.Game/Traits/AcceptsOre.cs index dad718450c..85f77109bd 100644 --- a/OpenRa.Game/Traits/AcceptsOre.cs +++ b/OpenRa.Game/Traits/AcceptsOre.cs @@ -14,8 +14,9 @@ namespace OpenRa.Game.Traits w => { /* create the free harvester! */ var harvester = new Actor("harv", self.Location + new int2(1, 2), self.Owner); + var unit = harvester.traits.Get(); var mobile = harvester.traits.Get(); - mobile.facing = 64; + unit.Facing = 64; mobile.QueueActivity(new Harvest()); w.Add(harvester); }); diff --git a/OpenRa.Game/Traits/Activities/Attack.cs b/OpenRa.Game/Traits/Activities/Attack.cs index 31db0f3ce9..f059af9a7e 100644 --- a/OpenRa.Game/Traits/Activities/Attack.cs +++ b/OpenRa.Game/Traits/Activities/Attack.cs @@ -21,6 +21,8 @@ namespace OpenRa.Game.Traits.Activities public IActivity Tick( Actor self, Mobile mobile ) { + var unit = self.traits.Get(); + if (Target == null || Target.IsDead) return NextActivity; @@ -30,7 +32,7 @@ namespace OpenRa.Game.Traits.Activities var desiredFacing = Util.GetFacing((Target.Location - self.Location).ToFloat2(), 0); var renderUnit = self.traits.WithInterface().First(); - if (Util.QuantizeFacing(mobile.facing, renderUnit.anim.CurrentSequence.Length) + if (Util.QuantizeFacing(unit.Facing, renderUnit.anim.CurrentSequence.Length) != Util.QuantizeFacing(desiredFacing, renderUnit.anim.CurrentSequence.Length)) { return new Turn( desiredFacing ) { NextActivity = this }; diff --git a/OpenRa.Game/Traits/Activities/DeliverOre.cs b/OpenRa.Game/Traits/Activities/DeliverOre.cs index 4b7f197e01..cf75faffed 100644 --- a/OpenRa.Game/Traits/Activities/DeliverOre.cs +++ b/OpenRa.Game/Traits/Activities/DeliverOre.cs @@ -23,6 +23,8 @@ namespace OpenRa.Game.Traits.Activities public IActivity Tick( Actor self, Mobile mobile ) { + var unit = self.traits.Get(); + if( isDone ) { self.traits.Get().Deliver( self, refinery ); @@ -61,7 +63,7 @@ namespace OpenRa.Game.Traits.Activities // no refineries reachable? return null; } - else if( mobile.facing != 64 ) + else if( unit.Facing != 64 ) return new Turn( 64 ) { NextActivity = this }; var renderUnit = self.traits.WithInterface().First(); diff --git a/OpenRa.Game/Traits/Activities/Harvest.cs b/OpenRa.Game/Traits/Activities/Harvest.cs index 0a9c906014..8caa545956 100644 --- a/OpenRa.Game/Traits/Activities/Harvest.cs +++ b/OpenRa.Game/Traits/Activities/Harvest.cs @@ -12,6 +12,8 @@ namespace OpenRa.Game.Traits.Activities public IActivity Tick( Actor self, Mobile mobile ) { + var unit = self.traits.Get(); + if( isHarvesting ) return null; if( NextActivity != null ) @@ -26,7 +28,7 @@ namespace OpenRa.Game.Traits.Activities if( Rules.Map.ContainsResource( self.Location ) && Rules.Map.Harvest( self.Location, out isGem ) ) { - var harvestAnim = "harvest" + Util.QuantizeFacing( mobile.facing, 8 ); + var harvestAnim = "harvest" + Util.QuantizeFacing( unit.Facing, 8 ); var renderUnit = self.traits.WithInterface().First(); /* better have one of these! */ if( harvestAnim != renderUnit.anim.CurrentSequence.Name ) { diff --git a/OpenRa.Game/Traits/Activities/Move.cs b/OpenRa.Game/Traits/Activities/Move.cs index e4c86cee46..bdbb717fb6 100755 --- a/OpenRa.Game/Traits/Activities/Move.cs +++ b/OpenRa.Game/Traits/Activities/Move.cs @@ -51,6 +51,8 @@ namespace OpenRa.Game.Traits.Activities public IActivity Tick( Actor self, Mobile mobile ) { + var unit = self.traits.Get(); + if( move != null ) { move.TickMove( self, mobile, this ); @@ -79,8 +81,8 @@ namespace OpenRa.Game.Traits.Activities return null; int2 dir = nextCell.Value - mobile.fromCell; - var firstFacing = Util.GetFacing( dir, mobile.facing ); - if( firstFacing != mobile.facing ) + var firstFacing = Util.GetFacing( dir, unit.Facing ); + if( firstFacing != unit.Facing ) { path.Add( nextCell.Value ); @@ -92,8 +94,8 @@ namespace OpenRa.Game.Traits.Activities move = new MoveFirstHalf( CenterOfCell( mobile.fromCell ), BetweenCells( mobile.fromCell, mobile.toCell ), - mobile.facing, - mobile.facing, + unit.Facing, + unit.Facing, 0 ); Game.UnitInfluence.Update( mobile ); @@ -183,13 +185,14 @@ namespace OpenRa.Game.Traits.Activities void UpdateCenterLocation( Actor self, Mobile mobile ) { + var unit = self.traits.Get(); var frac = (float)moveFraction / moveFractionTotal; self.CenterLocation = float2.Lerp( from, to, frac ); if( moveFraction >= moveFractionTotal ) - mobile.facing = toFacing & 0xFF; + unit.Facing = toFacing & 0xFF; else - mobile.facing = ( fromFacing + ( toFacing - fromFacing ) * moveFraction / moveFractionTotal ) & 0xFF; + unit.Facing = ( fromFacing + ( toFacing - fromFacing ) * moveFraction / moveFractionTotal ) & 0xFF; } protected abstract MovePart OnComplete( Actor self, Mobile mobile, Move parent ); @@ -204,6 +207,8 @@ namespace OpenRa.Game.Traits.Activities protected override MovePart OnComplete( Actor self, Mobile mobile, Move parent ) { + var unit = self.traits.Get(); + var nextCell = parent.PopPath( self, mobile ); if( nextCell != null ) { @@ -212,8 +217,8 @@ namespace OpenRa.Game.Traits.Activities var ret = new MoveFirstHalf( BetweenCells( mobile.fromCell, mobile.toCell ), BetweenCells( mobile.toCell, nextCell.Value ), - mobile.facing, - Util.GetNearestFacing( mobile.facing, Util.GetFacing( nextCell.Value - mobile.toCell, mobile.facing ) ), + unit.Facing, + Util.GetNearestFacing( unit.Facing, Util.GetFacing( nextCell.Value - mobile.toCell, unit.Facing ) ), moveFraction - moveFractionTotal ); mobile.fromCell = mobile.toCell; mobile.toCell = nextCell.Value; @@ -226,8 +231,8 @@ namespace OpenRa.Game.Traits.Activities var ret2 = new MoveSecondHalf( BetweenCells( mobile.fromCell, mobile.toCell ), CenterOfCell( mobile.toCell ), - mobile.facing, - mobile.facing, + unit.Facing, + unit.Facing, moveFraction - moveFractionTotal ); mobile.fromCell = mobile.toCell; Game.UnitInfluence.Update( mobile ); diff --git a/OpenRa.Game/Traits/Activities/Turn.cs b/OpenRa.Game/Traits/Activities/Turn.cs index 5b607ee4c1..c99b5cabf0 100755 --- a/OpenRa.Game/Traits/Activities/Turn.cs +++ b/OpenRa.Game/Traits/Activities/Turn.cs @@ -18,16 +18,20 @@ namespace OpenRa.Game.Traits.Activities public IActivity Tick( Actor self, Mobile mobile ) { - if( desiredFacing == mobile.facing ) + var unit = self.traits.Get(); + + if( desiredFacing == unit.Facing ) return NextActivity; - Util.TickFacing( ref mobile.facing, desiredFacing, self.unitInfo.ROT ); + Util.TickFacing( ref unit.Facing, desiredFacing, self.unitInfo.ROT ); return null; } public void Cancel( Actor self, Mobile mobile ) { - desiredFacing = mobile.facing; + var unit = self.traits.Get(); + + desiredFacing = unit.Facing; NextActivity = null; } } diff --git a/OpenRa.Game/Traits/AttackTurreted.cs b/OpenRa.Game/Traits/AttackTurreted.cs index e20abb8ab3..69903afbac 100755 --- a/OpenRa.Game/Traits/AttackTurreted.cs +++ b/OpenRa.Game/Traits/AttackTurreted.cs @@ -35,9 +35,9 @@ namespace OpenRa.Game.Traits public void DoAttack( Actor self ) { - var rut = self.traits.GetOrDefault(); + var unit = self.traits.Get(); - if( self.unitInfo.Primary != null && CheckFire( self, self.unitInfo.Primary, ref primaryFireDelay, + if( self.unitInfo.Primary != null && CheckFire( self, unit, self.unitInfo.Primary, ref primaryFireDelay, self.unitInfo.PrimaryOffset ) ) { secondaryFireDelay = Math.Max( 4, secondaryFireDelay ); @@ -45,7 +45,7 @@ namespace OpenRa.Game.Traits return; } - if (self.unitInfo.Secondary != null && CheckFire(self, self.unitInfo.Secondary, ref secondaryFireDelay, + if (self.unitInfo.Secondary != null && CheckFire(self, unit, self.unitInfo.Secondary, ref secondaryFireDelay, self.unitInfo.SecondaryOffset ?? self.unitInfo.PrimaryOffset)) { if (self.unitInfo.SecondaryOffset != null) secondaryRecoil = 1; @@ -54,7 +54,7 @@ namespace OpenRa.Game.Traits } } - bool CheckFire( Actor self, string weaponName, ref int fireDelay, int[] offset ) + bool CheckFire( Actor self, Unit unit, string weaponName, ref int fireDelay, int[] offset ) { if( fireDelay > 0 ) return false; var weapon = Rules.WeaponInfo[ weaponName ]; @@ -63,7 +63,7 @@ namespace OpenRa.Game.Traits fireDelay = weapon.ROF; Game.world.Add( new Bullet( weaponName, self.Owner, self, - self.CenterLocation.ToInt2() + Util.GetTurretPosition( self, offset, 0f ).ToInt2(), + self.CenterLocation.ToInt2() + Util.GetTurretPosition( self, unit, offset, 0f ).ToInt2(), target.CenterLocation.ToInt2() ) ); return true; diff --git a/OpenRa.Game/Traits/Helicopter.cs b/OpenRa.Game/Traits/Helicopter.cs index c54d007113..471e73809e 100644 --- a/OpenRa.Game/Traits/Helicopter.cs +++ b/OpenRa.Game/Traits/Helicopter.cs @@ -8,7 +8,6 @@ namespace OpenRa.Game.Traits { class Helicopter : ITick, IOrder { - public int facing; public int altitude; public int2 targetLocation; @@ -32,16 +31,18 @@ namespace OpenRa.Game.Traits public void Tick(Actor self) { + var unit = self.traits.Get(); + if (self.Location != targetLocation) { var dist = Game.CellSize * (targetLocation + new float2(.5f,.5f)) - self.CenterLocation; - var desiredFacing = Util.GetFacing(dist, facing); - Util.TickFacing(ref facing, desiredFacing, + var desiredFacing = Util.GetFacing(dist, unit.Facing); + Util.TickFacing(ref unit.Facing, desiredFacing, self.unitInfo.ROT); // .6f going the wrong way; .8f going sideways, 1f going forward. var rawSpeed = .2f * (self.unitInfo as UnitInfo.VehicleInfo).Speed; - var angle = (facing - desiredFacing) / 128f * Math.PI; + var angle = (unit.Facing - desiredFacing) / 128f * Math.PI; var scale = .4f + .6f * (float)Math.Cos(angle); if (altitude > CruiseAltitude / 2) // do some movement. diff --git a/OpenRa.Game/Traits/InfantrySquad.cs b/OpenRa.Game/Traits/InfantrySquad.cs index 2a05288db7..68ca9674de 100644 --- a/OpenRa.Game/Traits/InfantrySquad.cs +++ b/OpenRa.Game/Traits/InfantrySquad.cs @@ -80,7 +80,7 @@ namespace OpenRa.Game.Traits anim.Tick(); var d = (desiredLocation - location); - facing = /*Util.GetFacing(d, facing); */ self.traits.Get().facing; + facing = /*Util.GetFacing(d, facing); */ self.traits.Get().Facing; if (float2.WithinEpsilon(d, float2.Zero, .1f)) PlaySequence("stand", true); diff --git a/OpenRa.Game/Traits/Mobile.cs b/OpenRa.Game/Traits/Mobile.cs index 3bddabd6ea..6482e0c607 100644 --- a/OpenRa.Game/Traits/Mobile.cs +++ b/OpenRa.Game/Traits/Mobile.cs @@ -15,7 +15,6 @@ namespace OpenRa.Game.Traits int2 __fromCell; public int2 fromCell { get { return __fromCell; } set { Game.UnitInfluence.Remove( this ); __fromCell = value; Game.UnitInfluence.Add( this ); } } public int2 toCell { get { return self.Location; } set { Game.UnitInfluence.Remove( this ); self.Location = value; Game.UnitInfluence.Add( this ); } } - public int facing; public int Voice = Game.CosmeticRandom.Next(2); IActivity currentActivity; diff --git a/OpenRa.Game/Traits/RenderUnit.cs b/OpenRa.Game/Traits/RenderUnit.cs index 98e2be0c74..14f7e97adf 100644 --- a/OpenRa.Game/Traits/RenderUnit.cs +++ b/OpenRa.Game/Traits/RenderUnit.cs @@ -18,12 +18,11 @@ namespace OpenRa.Game.Traits void PlayFacingAnim(Actor self) { - var mobile = self.traits.GetOrDefault(); - var heli = self.traits.GetOrDefault(); + var unit = self.traits.Get(); anim.PlayFetchIndex("idle", () => Util.QuantizeFacing( - mobile != null ? mobile.facing : heli.facing, + unit.Facing, anim.CurrentSequence.Length )); } diff --git a/OpenRa.Game/Traits/RenderUnitMuzzleFlash.cs b/OpenRa.Game/Traits/RenderUnitMuzzleFlash.cs index 194cc8d2c8..424410fe93 100644 --- a/OpenRa.Game/Traits/RenderUnitMuzzleFlash.cs +++ b/OpenRa.Game/Traits/RenderUnitMuzzleFlash.cs @@ -20,9 +20,9 @@ namespace OpenRa.Game.Traits () => { var attack = self.traits.WithInterface().First(); - var mobile = self.traits.WithInterface().First(); + var unit = self.traits.Get(); return (Util.QuantizeFacing( - mobile.facing, 8)) * 6 + (int)(attack.primaryRecoil * 5.9f); + unit.Facing, 8)) * 6 + (int)(attack.primaryRecoil * 5.9f); }); } diff --git a/OpenRa.Game/Traits/RenderUnitRotor.cs b/OpenRa.Game/Traits/RenderUnitRotor.cs index 7dcd0ef412..21ea82fa62 100755 --- a/OpenRa.Game/Traits/RenderUnitRotor.cs +++ b/OpenRa.Game/Traits/RenderUnitRotor.cs @@ -25,22 +25,24 @@ namespace OpenRa.Game.Traits public override IEnumerable> Render(Actor self) { + var unit = self.traits.Get(); + yield return Util.CenteredShadow(self, anim.Image, self.CenterLocation); yield return Util.CenteredShadow(self, rotorAnim.Image, self.CenterLocation - + Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, 0)); + + Util.GetTurretPosition(self, unit, self.unitInfo.PrimaryOffset, 0)); if (self.unitInfo.SecondaryOffset != null) yield return Util.CenteredShadow(self, (secondRotorAnim ?? rotorAnim).Image, self.CenterLocation - + Util.GetTurretPosition(self, self.unitInfo.SecondaryOffset, 0)); + + Util.GetTurretPosition(self, unit, self.unitInfo.SecondaryOffset, 0)); var heli = self.traits.Get(); var p = self.CenterLocation - new float2( 0, heli.altitude ); yield return Util.Centered(self, anim.Image, p); - yield return Util.Centered(self, rotorAnim.Image, p - + Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, 0)); + yield return Util.Centered(self, rotorAnim.Image, p + + Util.GetTurretPosition( self, unit, self.unitInfo.PrimaryOffset, 0 ) ); if (self.unitInfo.SecondaryOffset != null) yield return Util.Centered(self, (secondRotorAnim ?? rotorAnim).Image, p - + Util.GetTurretPosition(self, self.unitInfo.SecondaryOffset, 0)); + + Util.GetTurretPosition( self, unit, self.unitInfo.SecondaryOffset, 0 ) ); } public override void Tick(Actor self) diff --git a/OpenRa.Game/Traits/RenderUnitTurreted.cs b/OpenRa.Game/Traits/RenderUnitTurreted.cs index bcdac9a98d..42354c1a18 100644 --- a/OpenRa.Game/Traits/RenderUnitTurreted.cs +++ b/OpenRa.Game/Traits/RenderUnitTurreted.cs @@ -36,19 +36,19 @@ namespace OpenRa.Game.Traits public override IEnumerable> Render(Actor self) { - var mobile = self.traits.Get(); + var unit = self.traits.Get(); var attack = self.traits.WithInterface().FirstOrDefault(); yield return Util.Centered(self, anim.Image, self.CenterLocation); yield return Util.Centered(self, turretAnim.Image, self.CenterLocation - + Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, attack.primaryRecoil)); + + Util.GetTurretPosition(self, unit, self.unitInfo.PrimaryOffset, attack.primaryRecoil)); if (self.unitInfo.SecondaryOffset != null) yield return Util.Centered(self, turretAnim.Image, self.CenterLocation - + Util.GetTurretPosition(self, self.unitInfo.SecondaryOffset, attack.secondaryRecoil)); + + Util.GetTurretPosition(self, unit, self.unitInfo.SecondaryOffset, attack.secondaryRecoil)); if (muzzleFlash != null && attack.primaryRecoil > 0) yield return Util.Centered(self, muzzleFlash.Image, self.CenterLocation - + Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, attack.primaryRecoil)); + + Util.GetTurretPosition(self, unit, self.unitInfo.PrimaryOffset, attack.primaryRecoil)); } public override void Tick(Actor self) diff --git a/OpenRa.Game/Traits/Turreted.cs b/OpenRa.Game/Traits/Turreted.cs index 12d68e26f2..7bad6cdf2b 100644 --- a/OpenRa.Game/Traits/Turreted.cs +++ b/OpenRa.Game/Traits/Turreted.cs @@ -16,7 +16,7 @@ namespace OpenRa.Game.Traits public void Tick( Actor self ) { - var df = desiredFacing ?? ( self.traits.Contains() ? self.traits.Get().facing : turretFacing ); + var df = desiredFacing ?? ( self.traits.Contains() ? self.traits.Get().Facing : turretFacing ); Util.TickFacing( ref turretFacing, df, self.unitInfo.ROT ); } } diff --git a/OpenRa.Game/Traits/Unit.cs b/OpenRa.Game/Traits/Unit.cs new file mode 100755 index 0000000000..b144a0b6a1 --- /dev/null +++ b/OpenRa.Game/Traits/Unit.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OpenRa.Game.Traits +{ + class Unit + { + public int Facing; + + public Unit( Actor self ) { } + } +} diff --git a/OpenRa.Game/Traits/Util.cs b/OpenRa.Game/Traits/Util.cs index 7e823ad347..65fa119ae0 100755 --- a/OpenRa.Game/Traits/Util.cs +++ b/OpenRa.Game/Traits/Util.cs @@ -86,12 +86,12 @@ namespace OpenRa.Game.Traits return RotateVectorByFacing(new float2(0, recoil * self.unitInfo.Recoil), quantizedFacing, .7f); } - public static float2 GetTurretPosition(Actor self, int[] offset, float recoil) + public static float2 GetTurretPosition(Actor self, Unit unit, int[] offset, float recoil) { - var ru = self.traits.WithInterface().FirstOrDefault(); - if (ru == null) return int2.Zero; /* things that don't have a rotating base don't need the turrets repositioned */ + if( unit == null ) return int2.Zero; /* things that don't have a rotating base don't need the turrets repositioned */ - var bodyFacing = self.traits.Contains() ? self.traits.Get().facing : self.traits.Get().facing; + var ru = self.traits.WithInterface().FirstOrDefault(); + var bodyFacing = unit.Facing; var quantizedFacing = QuantizeFacing(bodyFacing, ru.anim.CurrentSequence.Length) * (256 / ru.anim.CurrentSequence.Length); return (RotateVectorByFacing(new float2(offset[0], offset[1]), quantizedFacing, .7f) + GetRecoil(self, recoil)) diff --git a/campaignUnits.ini b/campaignUnits.ini index 64ae191618..ed5c1a2351 100755 --- a/campaignUnits.ini +++ b/campaignUnits.ini @@ -175,4 +175,4 @@ Image=FCOM TRUK [TRUK] -Traits=Mobile, RenderUnit \ No newline at end of file +Traits=Unit, Mobile, RenderUnit \ No newline at end of file diff --git a/units.ini b/units.ini index 97d71908b4..bfcdec7bad 100755 --- a/units.ini +++ b/units.ini @@ -15,52 +15,52 @@ MNLY [V2RL] Description=V2 Rocket -Traits=Mobile, RenderUnit, AttackBase +Traits=Unit, Mobile, AttackBase, RenderUnit [1TNK] Description=Light Tank -Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted +Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted Recoil=2; [2TNK] Description=Medium Tank -Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted +Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted Recoil=3; [3TNK] Description=Heavy Tank -Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted +Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted Recoil=3; [4TNK] Description=Mammoth Tank -Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted +Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted [MRJ] Description=Radar Jammer -Traits=Mobile, RenderUnitTurreted +Traits=Unit, Mobile, RenderUnitTurreted PrimaryOffset=0,4,0,-6 [MGG] Description=Mobile Gap Generator -Traits=Mobile, RenderUnitTurreted +Traits=Unit, Mobile, RenderUnitTurreted PrimaryOffset=0,6,0,-3 [ARTY] Description=Artillery -Traits=Mobile, RenderUnit, AttackBase +Traits=Unit, Mobile, AttackBase, RenderUnit [HARV] Description=Ore Truck -Traits=Harvester, Mobile, RenderUnit +Traits=Unit, Mobile, Harvester, RenderUnit [MCV] Description=Mobile Construction Vehicle -Traits=Mobile, McvDeploy, RenderUnit +Traits=Unit, Mobile, McvDeploy, RenderUnit [JEEP] Description=Ranger -Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted +Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted PrimaryOffset=0,0,0,-2 MuzzleFlash=yes [APC] Description=Armored Personnel Carrier -Traits=Mobile, AttackBase, RenderUnitMuzzleFlash +Traits=Unit, Mobile, AttackBase, RenderUnitMuzzleFlash PrimaryOffset=0,0,0,-4 MuzzleFlash=yes [MNLY] Description=Minelayer -Traits=Mobile, RenderUnit +Traits=Unit, Mobile, RenderUnit @@ -77,29 +77,29 @@ PT Description=Submarine WaterBound=yes BuiltAt=spen -Traits=Mobile, RenderUnit +Traits=Unit, Mobile, RenderUnit [DD] Description=Destroyer WaterBound=yes BuiltAt=syrd -Traits=Mobile, RenderUnit +Traits=Unit, Mobile, RenderUnit [CA] Description=Cruiser WaterBound=yes BuiltAt=syrd -Traits=Mobile, Turreted, RenderUnitTurreted, AttackTurreted +Traits=Unit, Mobile, Turreted, AttackTurreted, RenderUnitTurreted PrimaryOffset=0,17,0,-2 SecondaryOffset=0,-17,0,-2 Recoil=3 [LST] Description=Transport WaterBound=yes -Traits=Mobile, RenderUnit +Traits=Unit, Mobile, RenderUnit [PT] Description=Gunboat WaterBound=yes BuiltAt=syrd -Traits=Mobile, RenderUnit +Traits=Unit, Mobile, RenderUnit @@ -118,27 +118,27 @@ HIND [MIG] Description=Mig Attack Plane BuiltAt=afld -Traits=Mobile, RenderUnit +Traits=Unit, Mobile, RenderUnit [YAK] Description=Yak Attack Plane BuiltAt=afld -Traits=Mobile, RenderUnit +Traits=Unit, Mobile, RenderUnit [TRAN] Description=Transport Helicopter PrimaryOffset=0,14,0,-4 SecondaryOffset=0,-14,0,-2 BuiltAt=hpad -Traits=Helicopter, RenderUnitRotor +Traits=Unit, Helicopter, RenderUnitRotor SecondaryAnim=rotor2 [HELI] Description=Longbow BuiltAt=hpad -Traits=Helicopter, RenderUnitRotor +Traits=Unit, Helicopter, RenderUnitRotor PrimaryOffset=0,0,0,-2 [HIND] Description=Hind BuiltAt=hpad -Traits=Helicopter, RenderUnitRotor +Traits=Unit, Helicopter, RenderUnitRotor @@ -399,19 +399,19 @@ Description=Attack Dog BuiltAt=KENN [E1] Description=Rifle Infantry -Traits=InfantrySquad,Mobile +Traits=Unit, Mobile, InfantrySquad SquadSize=3 [E2] Description=Grenadier [E3] Description=Rocket Soldier -Traits=InfantrySquad,Mobile +Traits=Unit, Mobile, InfantrySquad SquadSize=2 [E4] Description=Flamethrower [E6] Description=Engineer -Traits=InfantrySquad,Mobile +Traits=Unit, Mobile, InfantrySquad [SPY] Description=Spy [THF] @@ -505,4 +505,4 @@ ImpactSound=kaboom25 WaterImpactSound=splash9 [General] -OreChance=.02 \ No newline at end of file +OreChance=.02