diff --git a/OpenRA.Game/PathFinder.cs b/OpenRA.Game/PathFinder.cs index 0ba5b4a399..5cf8c0acc8 100644 --- a/OpenRA.Game/PathFinder.cs +++ b/OpenRA.Game/PathFinder.cs @@ -52,15 +52,16 @@ namespace OpenRA public List FindUnitPath(int2 from, int2 target, Actor self) { - var umt = self.traits.Get().GetMovementType(); + // Todo: Reenable cache on something that isn't umt + //var umt = self.traits.Get().GetMovementType(); using (new PerfSample("find_unit_path")) { - var cached = CachedPaths.FirstOrDefault(p => p.from == from && p.to == target && p.umt == umt); - if (cached != null) - { - cached.tick = Game.LocalTick; - return new List(cached.result); - } + //var cached = CachedPaths.FirstOrDefault(p => p.from == from && p.to == target && p.umt == umt); + //if (cached != null) + //{ + // cached.tick = Game.LocalTick; + // return new List(cached.result); + //} var pb = FindBidiPath( PathSearch.FromPoint(self, target, from, true) @@ -71,8 +72,8 @@ namespace OpenRA CheckSanePath2(pb, from, target); - CachedPaths.RemoveAll(p => Game.LocalTick - p.tick > MaxPathAge); - CachedPaths.Add(new CachedPath { from = from, to = target, umt = umt, result = pb, tick = Game.LocalTick }); + //CachedPaths.RemoveAll(p => Game.LocalTick - p.tick > MaxPathAge); + //CachedPaths.Add(new CachedPath { from = from, to = target, umt = umt, result = pb, tick = Game.LocalTick }); return new List(pb); } } diff --git a/OpenRA.Game/PathSearch.cs b/OpenRA.Game/PathSearch.cs index bd7c8e657b..66a80802a5 100755 --- a/OpenRA.Game/PathSearch.cs +++ b/OpenRA.Game/PathSearch.cs @@ -81,8 +81,6 @@ namespace OpenRA public int2 Expand( World world ) { - var umt = self.traits.Get().GetMovementType(); - var p = queue.Pop(); cellInfo[ p.Location.X, p.Location.Y ].Seen = true; diff --git a/OpenRA.Game/Traits/Activities/Move.cs b/OpenRA.Game/Traits/Activities/Move.cs index f1ab35d87c..2ce112741b 100755 --- a/OpenRA.Game/Traits/Activities/Move.cs +++ b/OpenRA.Game/Traits/Activities/Move.cs @@ -227,8 +227,7 @@ namespace OpenRA.Traits.Activities public void TickMove( Actor self, Mobile mobile, Move parent ) { - var umt = self.Info.Traits.Get().MovementType; - moveFraction += (int)Util.GetEffectiveSpeed(self, umt); + moveFraction += (int)mobile.MovementSpeedForCell(self, self.Location); if( moveFraction >= moveFractionTotal ) moveFraction = moveFractionTotal; UpdateCenterLocation( self, mobile ); diff --git a/OpenRA.Game/Traits/Mobile.cs b/OpenRA.Game/Traits/Mobile.cs index 9b652d08ad..5cc51983a6 100644 --- a/OpenRA.Game/Traits/Mobile.cs +++ b/OpenRA.Game/Traits/Mobile.cs @@ -20,22 +20,27 @@ using System.Collections.Generic; using System.Linq; +using System; using OpenRA.GameRules; +using OpenRA.FileFormats; namespace OpenRA.Traits { public class MobileInfo : ITraitInfo, ITraitPrerequisite { - public readonly UnitMovementType MovementType = UnitMovementType.Wheel; + public readonly TerrainType[] TerrainTypes; + public readonly float[] TerrainSpeeds; public readonly int WaitAverage = 60; public readonly int WaitSpread = 20; - public virtual object Create(ActorInitializer init) { return new Mobile(init); } + public virtual object Create(ActorInitializer init) { return new Mobile(init, this); } } public class Mobile : IIssueOrder, IResolveOrder, IOccupySpace, IMove { public readonly Actor self; + public readonly Dictionary TerrainCost; + public readonly Dictionary TerrainSpeed; [Sync] int2 __fromCell, __toCell; @@ -59,11 +64,23 @@ namespace OpenRA.Traits AddInfluence(); } - public Mobile(ActorInitializer init) + public Mobile(ActorInitializer init, MobileInfo info) { this.self = init.self; this.__fromCell = this.__toCell = init.location; AddInfluence(); + + TerrainCost = new Dictionary(); + TerrainSpeed = new Dictionary(); + + if (info.TerrainTypes.Count() != info.TerrainSpeeds.Count()) + throw new InvalidOperationException("Mobile TerrainType/TerrainSpeed length missmatch"); + + for (int i = 0; i < info.TerrainTypes.Count(); i++) + { + TerrainCost.Add(info.TerrainTypes[i], 1f/info.TerrainSpeeds[i]); + TerrainSpeed.Add(info.TerrainTypes[i], info.TerrainSpeeds[i]); + } } public void SetPosition(Actor self, int2 cell) @@ -85,8 +102,7 @@ namespace OpenRA.Traits if (!mi.Modifiers.HasModifier(Modifiers.Alt)) return null; if (!CanEnterCell(underCursor.Location, null, true)) return null; } - var umt = self.Info.Traits.Get().MovementType; - if (Util.GetEffectiveSpeed(self,umt) == 0) return null; /* allow disabling move orders from modifiers */ + if (MovementSpeedForCell(self, self.Location) == 0) return null; /* allow disabling move orders from modifiers */ if (xy == toCell) return null; return new Order("Move", self, xy, mi.Modifiers.HasModifier(Modifiers.Shift)); } @@ -114,11 +130,6 @@ namespace OpenRA.Traits : new[] { fromCell, toCell }; } - public UnitMovementType GetMovementType() - { - return self.Info.Traits.Get().MovementType; - } - public bool CanEnterCell(int2 p) { return CanEnterCell(p, null, true); @@ -149,19 +160,37 @@ namespace OpenRA.Traits return MovementCostForCell(self, cell) < float.PositiveInfinity; } - public float MovementCostForCell(Actor self, int2 cell) + public virtual float MovementCostForCell(Actor self, int2 cell) { if (!self.World.Map.IsInMap(cell.X,cell.Y)) return float.PositiveInfinity; var type = self.World.TileSet.GetTerrainType(self.World.Map.MapTiles[cell.X, cell.Y]); - var umt = self.Info.Traits.Get().MovementType; - - // Todo: Cache cost for each terraintype - return (float)Rules.TerrainTypes[type].GetCost(umt)* - self.World.WorldActor.traits.WithInterface().Aggregate(1f, (a, x) => a * x.GetCost(cell,self)); + return (float)TerrainCost[type]* + self.World.WorldActor.traits.WithInterface() + .Select(t => t.GetCost(cell, self)) + .Product(); } + public virtual float MovementSpeedForCell(Actor self, int2 cell) + { + var unitInfo = self.Info.Traits.GetOrDefault(); + if( unitInfo == null || !self.World.Map.IsInMap(cell.X,cell.Y)) + return 0f; + + var type = self.World.TileSet.GetTerrainType(self.World.Map.MapTiles[cell.X, cell.Y]); + var terrain = TerrainSpeed[type]*self.World.WorldActor.traits + .WithInterface() + .Select(t => t.GetSpeedModifier(self.Location, self)) + .Product(); + + var modifier = self.traits + .WithInterface() + .Select(t => t.GetSpeedModifier()) + .Product(); + return unitInfo.Speed * terrain * modifier; + } + public IEnumerable GetCurrentPath(Actor self) { var move = self.GetCurrentActivity() as Activities.Move; diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 3c44d1bc84..f341f6c76e 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -107,9 +107,9 @@ namespace OpenRA.Traits public interface ITags { IEnumerable GetTags(); } public interface IMove { - UnitMovementType GetMovementType(); bool CanEnterCell(int2 location); float MovementCostForCell(Actor self, int2 cell); + float MovementSpeedForCell(Actor self, int2 cell); IEnumerable GetCurrentPath(Actor self); void SetPosition(Actor self, int2 cell); } diff --git a/OpenRA.Game/Traits/Util.cs b/OpenRA.Game/Traits/Util.cs index f87bb9391c..0bf8bfc186 100755 --- a/OpenRA.Game/Traits/Util.cs +++ b/OpenRA.Game/Traits/Util.cs @@ -138,27 +138,6 @@ namespace OpenRA.Traits return new Renderable(s, loc.Round(), pal); } - public static float GetEffectiveSpeed(Actor self, UnitMovementType umt) - { - var unitInfo = self.Info.Traits.GetOrDefault(); - if( unitInfo == null ) return 0f; - - var terrain = 1f; - if (umt != UnitMovementType.Fly) - { - var tt = self.World.GetTerrainType(self.Location); - terrain = Rules.TerrainTypes[tt].GetSpeedModifier(umt)*self.World.WorldActor.traits - .WithInterface() - .Select(t => t.GetSpeedModifier(self.Location, self)) - .Product(); - } - var modifier = self.traits - .WithInterface() - .Select(t => t.GetSpeedModifier()) - .Product(); - return unitInfo.Speed * terrain * modifier; - } - public static IActivity SequenceActivities(params IActivity[] acts) { return acts.Reverse().Aggregate( diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 002c698535..09ad3f37c7 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -98,8 +98,10 @@ namespace OpenRA.Traits if (content[p.X,p.Y].type == null) return 1.0f; - var umt = forActor.traits.Get().GetMovementType(); - return content[p.X,p.Y].type.GetSpeedModifier(umt); + // Todo: Reenable based off something that isn't umt + return 1f; + //var umt = forActor.traits.Get().GetMovementType(); + //return content[p.X,p.Y].type.GetSpeedModifier(umt); } public float GetCost(int2 p, Actor forActor) @@ -107,8 +109,10 @@ namespace OpenRA.Traits if (content[p.X,p.Y].type == null) return 1.0f; - var umt = forActor.traits.Get().GetMovementType(); - return content[p.X,p.Y].type.GetCost(umt); + // Todo: Reenable based off something that isn't umt + return 1f; + //var umt = forActor.traits.Get().GetMovementType(); + //return content[p.X,p.Y].type.GetCost(umt); } Sprite[] ChooseContent(ResourceType t) diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index c235a4c943..4682807132 100755 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -48,13 +48,16 @@ namespace OpenRA Rules.TerrainTypes[world.TileSet.GetTerrainType(world.Map.MapTiles[a.X, a.Y])] .Buildable; } - + public static bool IsActorCrushableByActor(this World world, Actor a, Actor b) { - var movement = b.traits.GetOrDefault(); - return movement != null && world.IsActorCrushableByMovementType(a, movement.GetMovementType()); + return false; + //var movement = b.traits.GetOrDefault(); + //return movement != null && world.IsActorCrushableByMovementType(a, movement.GetMovementType()); } + // Todo: Reenable crushing based on actor, not umt + /* public static bool IsActorPathableToCrush(this World world, Actor a, UnitMovementType umt) { return a != null && @@ -68,7 +71,7 @@ namespace OpenRA a.traits.WithInterface() .Any(c => c.IsCrushableBy(umt, a.Owner)); } - + */ public static IEnumerable FindUnitsAtMouse(this World world, int2 mouseLocation) { var loc = mouseLocation + Game.viewport.Location; diff --git a/OpenRA.Mods.Cnc/MobileAir.cs b/OpenRA.Mods.Cnc/MobileAir.cs index 1c6378c139..7aff58c4ca 100644 --- a/OpenRA.Mods.Cnc/MobileAir.cs +++ b/OpenRA.Mods.Cnc/MobileAir.cs @@ -39,7 +39,7 @@ namespace OpenRA.Traits { MobileAirInfo Info; public MobileAir (ActorInitializer init, MobileAirInfo info) - : base(init) + : base(init, info) { Info = info; } @@ -62,13 +62,26 @@ namespace OpenRA.Traits return self.World.WorldActor.traits.Get().GetUnitsAt(p).Count() == 0; } - public float MovementCostForCell(Actor self, int2 cell) + public override float MovementCostForCell(Actor self, int2 cell) { if (!self.World.Map.IsInMap(cell.X,cell.Y)) return float.PositiveInfinity; return self.World.WorldActor.traits.WithInterface().Aggregate(1f, (a, x) => a * x.GetCost(cell,self)); } + + public override float MovementSpeedForCell(Actor self, int2 cell) + { + var unitInfo = self.Info.Traits.GetOrDefault(); + if( unitInfo == null || !self.World.Map.IsInMap(cell.X,cell.Y)) + return 0f; + + var modifier = self.traits + .WithInterface() + .Select(t => t.GetSpeedModifier()) + .Product(); + return unitInfo.Speed * modifier; + } public override IEnumerable OccupiedCells() { @@ -76,8 +89,6 @@ namespace OpenRA.Traits return new int2[] {}; } - public int2 TopLeft { get { return toCell; } } - public IEnumerable OccupiedAirCells() { return (fromCell == toCell) diff --git a/OpenRA.Mods.RA/Activities/Fly.cs b/OpenRA.Mods.RA/Activities/Fly.cs index bef5862549..84be5585db 100644 --- a/OpenRA.Mods.RA/Activities/Fly.cs +++ b/OpenRA.Mods.RA/Activities/Fly.cs @@ -19,6 +19,7 @@ #endregion using System; +using System.Linq; using OpenRA.GameRules; using OpenRA.Traits; @@ -66,7 +67,8 @@ namespace OpenRA.Mods.RA.Activities public static void Fly(Actor self, int desiredAltitude ) { var unit = self.traits.Get(); - var speed = .2f * Util.GetEffectiveSpeed(self, UnitMovementType.Fly); + var mobile = self.traits.WithInterface().FirstOrDefault(); + var speed = .2f * mobile.MovementSpeedForCell(self, self.Location); var angle = unit.Facing / 128f * Math.PI; var aircraft = self.traits.Get(); diff --git a/OpenRA.Mods.RA/Activities/HeliAttack.cs b/OpenRA.Mods.RA/Activities/HeliAttack.cs index 1d4edcfec3..4f636d2148 100644 --- a/OpenRA.Mods.RA/Activities/HeliAttack.cs +++ b/OpenRA.Mods.RA/Activities/HeliAttack.cs @@ -59,8 +59,9 @@ namespace OpenRA.Mods.RA.Activities var desiredFacing = Util.GetFacing(dist, unit.Facing); Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get().ROT); - var rawSpeed = .2f * Util.GetEffectiveSpeed(self, UnitMovementType.Fly); - + var mobile = self.traits.WithInterface().FirstOrDefault(); + var rawSpeed = .2f * mobile.MovementSpeedForCell(self, self.Location); + if (!float2.WithinEpsilon(float2.Zero, dist, range * Game.CellSize)) self.CenterLocation += (rawSpeed / dist.Length) * dist; diff --git a/OpenRA.Mods.RA/Activities/HeliFly.cs b/OpenRA.Mods.RA/Activities/HeliFly.cs index 1d95a61152..d2f04f8082 100644 --- a/OpenRA.Mods.RA/Activities/HeliFly.cs +++ b/OpenRA.Mods.RA/Activities/HeliFly.cs @@ -63,7 +63,8 @@ namespace OpenRA.Mods.RA.Activities Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get().ROT); - var rawSpeed = .2f * Util.GetEffectiveSpeed(self, UnitMovementType.Fly); + var mobile = self.traits.WithInterface().FirstOrDefault(); + var rawSpeed = .2f * mobile.MovementSpeedForCell(self, self.Location); self.CenterLocation += (rawSpeed / dist.Length) * dist; aircraft.Location = Util.CellContaining(self.CenterLocation); diff --git a/OpenRA.Mods.RA/Activities/Land.cs b/OpenRA.Mods.RA/Activities/Land.cs index 46f138bfd0..c17a4fad48 100644 --- a/OpenRA.Mods.RA/Activities/Land.cs +++ b/OpenRA.Mods.RA/Activities/Land.cs @@ -19,6 +19,7 @@ #endregion using System; +using System.Linq; using OpenRA.GameRules; using OpenRA.Traits; @@ -57,7 +58,8 @@ namespace OpenRA.Mods.RA.Activities var desiredFacing = Util.GetFacing(d, unit.Facing); Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get().ROT); - var speed = .2f * Util.GetEffectiveSpeed(self, UnitMovementType.Fly); + var mobile = self.traits.WithInterface().FirstOrDefault(); + var speed = .2f * mobile.MovementSpeedForCell(self, self.Location); var angle = unit.Facing / 128f * Math.PI; self.CenterLocation += speed * -float2.FromAngle((float)angle); diff --git a/OpenRA.Mods.RA/Activities/ReturnToBase.cs b/OpenRA.Mods.RA/Activities/ReturnToBase.cs index 56e31495ca..5654cb3060 100644 --- a/OpenRA.Mods.RA/Activities/ReturnToBase.cs +++ b/OpenRA.Mods.RA/Activities/ReturnToBase.cs @@ -53,7 +53,9 @@ namespace OpenRA.Mods.RA.Activities var landPos = dest.CenterLocation; var unit = self.traits.Get(); - var speed = .2f * Util.GetEffectiveSpeed(self, UnitMovementType.Fly); + var mobile = self.traits.WithInterface().FirstOrDefault(); + var speed = .2f * mobile.MovementSpeedForCell(self, self.Location); + var approachStart = landPos - new float2(unit.Altitude * speed, 0); var turnRadius = (128f / self.Info.Traits.Get().ROT) * speed / (float)Math.PI; diff --git a/OpenRA.Mods.RA/Aircraft.cs b/OpenRA.Mods.RA/Aircraft.cs index e2bfa89be8..fe9f3c4e1e 100755 --- a/OpenRA.Mods.RA/Aircraft.cs +++ b/OpenRA.Mods.RA/Aircraft.cs @@ -70,11 +70,23 @@ namespace OpenRA.Mods.RA return new float2[] { move.Pos }; } - public UnitMovementType GetMovementType() { return UnitMovementType.Fly; } public bool CanEnterCell(int2 location) { return true; } public float MovementCostForCell(Actor self, int2 cell) { return 1f; } + public float MovementSpeedForCell(Actor self, int2 cell) + { + var unitInfo = self.Info.Traits.GetOrDefault(); + if( unitInfo == null) + return 0f; + + var modifier = self.traits + .WithInterface() + .Select(t => t.GetSpeedModifier()) + .Product(); + return unitInfo.Speed * modifier; + } + int2[] noCells = new int2[] { }; public IEnumerable OccupiedCells() { return noCells; } } diff --git a/OpenRA.Mods.RA/BridgeLayer.cs b/OpenRA.Mods.RA/BridgeLayer.cs index e0ab1e91dc..86b087359b 100644 --- a/OpenRA.Mods.RA/BridgeLayer.cs +++ b/OpenRA.Mods.RA/BridgeLayer.cs @@ -92,17 +92,19 @@ namespace OpenRA.Mods.RA public float GetCost(int2 p, Actor forActor) { - var umt = forActor.traits.Get().GetMovementType(); - if (customTerrain[p.X, p.Y] != null) - return customTerrain[p.X,p.Y].GetCost(p,umt); + // Todo: Do we even need to reenable this since cost = 100% for everything? + //var umt = forActor.traits.Get().GetMovementType(); + //if (customTerrain[p.X, p.Y] != null) + // return customTerrain[p.X,p.Y].GetCost(p,umt); return 1f; } public float GetSpeedModifier(int2 p, Actor forActor) { - var umt = forActor.traits.Get().GetMovementType(); - if (customTerrain[p.X, p.Y] != null) - return customTerrain[p.X,p.Y].GetSpeedModifier(p,umt); + // Todo: Do we even need to reenable this since cost = 100% for everything? + //var umt = forActor.traits.Get().GetMovementType(); + //if (customTerrain[p.X, p.Y] != null) + // return customTerrain[p.X,p.Y].GetSpeedModifier(p,umt); return 1f; } diff --git a/OpenRA.Mods.RA/Helicopter.cs b/OpenRA.Mods.RA/Helicopter.cs index b8344c5bda..b42bcf012f 100644 --- a/OpenRA.Mods.RA/Helicopter.cs +++ b/OpenRA.Mods.RA/Helicopter.cs @@ -110,7 +110,8 @@ namespace OpenRA.Mods.RA return; var Info = self.Info.Traits.Get(); - var rawSpeed = .2f * Util.GetEffectiveSpeed(self, UnitMovementType.Fly); + var mobile = self.traits.WithInterface().FirstOrDefault(); + var rawSpeed = .2f * mobile.MovementSpeedForCell(self, self.Location); var otherHelis = self.World.FindUnitsInCircle(self.CenterLocation, Info.IdealSeparation) .Where(a => a.traits.Contains()); diff --git a/OpenRA.Mods.RA/Passenger.cs b/OpenRA.Mods.RA/Passenger.cs index bf9eb07277..2eb6673a0b 100644 --- a/OpenRA.Mods.RA/Passenger.cs +++ b/OpenRA.Mods.RA/Passenger.cs @@ -44,8 +44,9 @@ namespace OpenRA.Mods.RA if (cargo == null || cargo.IsFull(underCursor)) return null; - var umt = self.traits.Get().GetMovementType(); - if (!underCursor.Info.Traits.Get().PassengerTypes.Contains(umt)) + // Todo: Use something better for cargo management + //var umt = self.traits.Get().GetMovementType(); + //if (!underCursor.Info.Traits.Get().PassengerTypes.Contains(umt)) return null; return new Order("EnterTransport", self, underCursor); diff --git a/mods/cnc/defaults.yaml b/mods/cnc/defaults.yaml index 59bea365da..43bb721679 100644 --- a/mods/cnc/defaults.yaml +++ b/mods/cnc/defaults.yaml @@ -1,9 +1,12 @@ + +### Todo: Need a ^Tank default for MovementType: Track ^Vehicle: Category: Vehicle Unit: ROT: 5 Mobile: - MovementType: Wheel + TerrainTypes: Clear, Rough, Road, Tree, Water, Rock, Wall, Ore, Beach, River, Special + TerrainSpeeds: 60%, 40%, 100%, 0%, 0%, 0%, 0%, 50%, 40%, 0%, 100% Selectable: Voice: VehicleVoice Repairable: @@ -15,13 +18,47 @@ GainsExperience: GivesExperience: +^Tank: + Category: Vehicle + Unit: + ROT: 5 + Mobile: + TerrainTypes: Clear, Rough, Road, Tree, Water, Rock, Wall, Ore, Beach, River, Special + TerrainSpeeds: 80%, 70%, 100%, 0%, 0%, 0%, 0%, 70%, 70%, 0%, 100% + Selectable: + Voice: VehicleVoice + Repairable: + Chronoshiftable: + Passenger: + IronCurtainable: + HiddenUnderFog: + RevealsShroud: + GainsExperience: + GivesExperience: + +^Helicopter: + Category: Plane + Unit: + TargetType: Air + Selectable: + Voice: VehicleVoice + HiddenUnderFog: + RevealsShroud: + GainsExperience: + GivesExperience: + MobileAir: + TerrainTypes: Clear, Rough, Road, Tree, Water, Rock, Wall, Ore, Beach, River, Special + TerrainSpeeds: 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100% + AvoidsAA: + ^Infantry: Category: Infantry Unit: Armor: none Sight: 4 Mobile: - MovementType: Foot + TerrainTypes: Clear, Rough, Road, Tree, Water, Rock, Wall, Ore, Beach, River, Special + TerrainSpeeds: 90%, 80%, 100%, 0%, 0%, 0%, 0%, 90%, 80%, 0%, 100% Selectable: RenderInfantry: AutoTarget: @@ -33,17 +70,6 @@ GivesExperience: SharesCell: -^Ship: - Category: Ship - Unit: - Mobile: - MovementType: Float - Selectable: - HiddenUnderFog: - RevealsShroud: - GainsExperience: - GivesExperience: - ^Plane: Category: Plane Unit: diff --git a/mods/cnc/vehicles.yaml b/mods/cnc/vehicles.yaml index 070273e3a5..a438d12026 100644 --- a/mods/cnc/vehicles.yaml +++ b/mods/cnc/vehicles.yaml @@ -26,7 +26,7 @@ MCV: MustBeDestroyed: HARV: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon: harvicnh BuildPaletteOrder: 10 @@ -48,12 +48,10 @@ HARV: Crewed: yes Sight: 4 Speed: 6 - Mobile: - MovementType: Track RenderUnit: APC: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon: apcicnh BuildPaletteOrder: 30 @@ -68,8 +66,6 @@ APC: ROT: 5 Sight: 5 Speed: 15 - Mobile: - MovementType: Track AttackBase: PrimaryWeapon: MachineGun PrimaryOffset: 0,0,0,-4 @@ -83,7 +79,7 @@ APC: UnloadFacing: 220 ARTY: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon:artyicnh BuildPaletteOrder: 40 @@ -99,8 +95,6 @@ ARTY: ROT: 2 Sight: 6 Speed: 6 - Mobile: - MovementType: Track AttackBase: PrimaryWeapon: Ballistic RenderUnit: @@ -108,7 +102,7 @@ ARTY: AutoTarget: FTNK: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon: ftnkicnh BuildPaletteOrder: 50 @@ -211,7 +205,7 @@ JEEP: AutoTarget: LTNK: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon: ltnkicnh BuildPaletteOrder: 30 @@ -226,8 +220,6 @@ LTNK: Crewed: yes Sight: 4 Speed: 9 - Mobile: - MovementType: Track Turreted: ROT: 5 AttackTurreted: @@ -242,7 +234,7 @@ LTNK: EmptyWeapon: UnitExplodeSmall MTNK: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon: mtnkicnh BuildPaletteOrder: 30 @@ -257,8 +249,6 @@ MTNK: Crewed: yes Sight: 5 Speed: 9 - Mobile: - MovementType: Track Turreted: ROT: 5 AttackTurreted: @@ -273,7 +263,7 @@ MTNK: EmptyWeapon: UnitExplodeSmall HTNK: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon: htnkicnh BuildPaletteOrder: 60 @@ -288,8 +278,6 @@ HTNK: Crewed: yes Sight: 6 Speed: 3 - Mobile: - MovementType: Track Turreted: ROT: 2 AttackTurreted: @@ -308,7 +296,7 @@ HTNK: EmptyWeapon: UnitExplodeSmall MSAM: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon: msamicnh BuildPaletteOrder: 50 @@ -323,8 +311,6 @@ MSAM: Crewed: yes Sight: 6 Speed: 6 - Mobile: - MovementType: Track Turreted: ROT: 5 AttackTurreted: @@ -335,7 +321,7 @@ MSAM: AutoTarget: MLRS: - Inherits: ^Vehicle + Inherits: ^Tank Buildable: Icon: mlrsicnh BuildPaletteOrder: 60 @@ -350,8 +336,6 @@ MLRS: Crewed: yes Sight: 10 Speed: 6 - Mobile: - MovementType: Track Turreted: ROT: 5 AttackTurreted: @@ -381,15 +365,13 @@ STNK: CloakDelay: 2.0 CloakSound: appear1.aud UncloakSound: appear1.aud - Mobile: - MovementType: Track AttackBase: PrimaryWeapon: 227mm RenderUnit: AutoTarget: TRAN: - Inherits: ^Plane + Inherits: ^Helicopter Buildable: Icon:tranicnh BuildPaletteOrder: 10 @@ -406,10 +388,6 @@ TRAN: ROT: 5 Sight: 8 Speed: 15 -# Helicopter: - AvoidsAA: - MobileAir: - MovementType: Fly RenderUnitRotor: PrimaryOffset: 0,14,0,-4 SecondaryOffset: 0,-14,0,-2 @@ -419,7 +397,7 @@ TRAN: Passengers: 5 HELI: - Inherits: ^Plane + Inherits: ^Helicopter Buildable: Icon: heliicnh BuildPaletteOrder: 20 @@ -442,15 +420,12 @@ HELI: SecondaryWeapon: HighV PrimaryOffset: -5,0,0,2 SecondaryOffset: 5,0,0,2 -# Helicopter: - MobileAir: - MovementType: Fly RenderUnitRotor: PrimaryOffset: 0,0,0,-2 WithShadow: ORCA: - Inherits: ^Plane + Inherits: ^Helicopter Buildable: Icon: orcaicnh BuildPaletteOrder: 20 @@ -473,9 +448,6 @@ ORCA: SecondaryWeapon: Rockets.Orca PrimaryOffset: -5,0,0,2 SecondaryOffset: 5,0,0,2 -# Helicopter: - MobileAir: - MovementType: Fly RenderUnit: WithShadow: