diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 779f4b61c8..801c8486b9 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -1,4 +1,4 @@ - + Debug @@ -230,6 +230,7 @@ + @@ -260,7 +261,4 @@ --> - - - \ No newline at end of file diff --git a/OpenRA.Game/Traits/Player/PlaceBuilding.cs b/OpenRA.Game/Traits/Player/PlaceBuilding.cs index df12436cf1..0fa1c01d8e 100644 --- a/OpenRA.Game/Traits/Player/PlaceBuilding.cs +++ b/OpenRA.Game/Traits/Player/PlaceBuilding.cs @@ -82,7 +82,7 @@ namespace OpenRA.Traits var producers = self.World.Queries.OwnedBy[ self.Owner ].WithTrait() .Where( x => x.Actor.Info.Traits.Get().Produces.Contains( unit.Category ) ) .ToList(); - var producer = producers.Where( x => x.Trait.IsPrimary ).Concat( producers ) + var producer = producers.Where( x => x.Actor.IsPrimaryBuilding() ).Concat( producers ) .FirstOrDefault(); if( producer.Actor != null ) diff --git a/OpenRA.Game/Traits/Player/ProductionQueue.cs b/OpenRA.Game/Traits/Player/ProductionQueue.cs index 88ad8df9df..87779f5d5c 100644 --- a/OpenRA.Game/Traits/Player/ProductionQueue.cs +++ b/OpenRA.Game/Traits/Player/ProductionQueue.cs @@ -170,7 +170,7 @@ namespace OpenRA.Traits var producers = self.World.Queries.OwnedBy[self.Owner] .WithTrait() .Where(x => producerTypes.Contains(x.Actor.Info)) - .OrderByDescending(x => x.Trait.IsPrimary ? 1 : 0) // prioritize the primary. + .OrderByDescending(x => x.Actor.IsPrimaryBuilding() ? 1 : 0 ) // prioritize the primary. .ToArray(); if (producers.Length == 0) diff --git a/OpenRA.Game/Traits/PrimaryBuilding.cs b/OpenRA.Game/Traits/PrimaryBuilding.cs new file mode 100644 index 0000000000..a260a5a426 --- /dev/null +++ b/OpenRA.Game/Traits/PrimaryBuilding.cs @@ -0,0 +1,77 @@ +#region Copyright & License Information +/* + * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see LICENSE. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; + +namespace OpenRA.Traits +{ + class PrimaryBuildingInfo : TraitInfo { } + + class PrimaryBuilding : IIssueOrder, IResolveOrder, IOrderCursor, ITags + { + bool isPrimary = false; + public bool IsPrimary { get { return isPrimary; } } + + public IEnumerable GetTags() + { + yield return (isPrimary) ? TagType.Primary : TagType.None; + } + + public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) + { + if (mi.Button == MouseButton.Right && underCursor == self) + return new Order("PrimaryProducer", self); + return null; + } + + public string CursorForOrder(Actor self, Order order) + { + return (order.OrderString == "PrimaryProducer") ? "deploy" : null; + } + + public void ResolveOrder(Actor self, Order order) + { + if (order.OrderString == "PrimaryProducer") + SetPrimaryProducer(self, !isPrimary); + } + + public void SetPrimaryProducer(Actor self, bool state) + { + if (state == false) + { + isPrimary = false; + return; + } + + // Cancel existing primaries + foreach (var p in self.Info.Traits.Get().Produces) + foreach (var b in self.World.Queries.OwnedBy[self.Owner] + .WithTrait() + .Where(x => x.Trait.IsPrimary + && (x.Actor.Info.Traits.Get().Produces.Contains(p)))) + b.Trait.SetPrimaryProducer(b.Actor, false); + + isPrimary = true; + + var eva = self.World.WorldActor.Info.Traits.Get(); + Sound.PlayToPlayer(self.Owner, eva.PrimaryBuildingSelected); + } + } + + static class PrimaryExts + { + public static bool IsPrimaryBuilding(this Actor a) + { + var pb = a.traits.Get(); + return pb != null && pb.IsPrimary; + } + } +} diff --git a/OpenRA.Game/Traits/Production.cs b/OpenRA.Game/Traits/Production.cs index 21d77d4623..9a6849611d 100755 --- a/OpenRA.Game/Traits/Production.cs +++ b/OpenRA.Game/Traits/Production.cs @@ -20,13 +20,12 @@ namespace OpenRA.Traits { public readonly float[] SpawnOffsets; // in px relative to CenterLocation public readonly int[] ExitCells; // in cells relative to TopLeft, supports a list for multiple exits - public readonly bool EnablePrimary = true; public readonly string[] Produces = { }; public virtual object Create(ActorInitializer init) { return new Production(this); } } - public class Production : IIssueOrder, IResolveOrder, ITags, IOrderCursor + public class Production { public readonly List> Spawns = new List>(); public Production(ProductionInfo info) @@ -111,56 +110,6 @@ namespace OpenRA.Traits return false; } - // "primary building" crap - perhaps this should be split? - bool isPrimary = false; - public bool IsPrimary { get { return isPrimary; } } - public IEnumerable GetTags() - { - yield return (isPrimary) ? TagType.Primary : TagType.None; - } - - public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) - { - if (mi.Button == MouseButton.Right && underCursor == self && self.Info.Traits.Get().EnablePrimary) - return new Order("PrimaryProducer", self); - return null; - } - - public string CursorForOrder(Actor self, Order order) - { - return (order.OrderString == "PrimaryProducer") ? "deploy" : null; - } - - public void ResolveOrder(Actor self, Order order) - { - if (order.OrderString == "PrimaryProducer") - SetPrimaryProducer(self, !isPrimary); - } - - public void SetPrimaryProducer(Actor self, bool state) - { - if (state == false) - { - isPrimary = false; - return; - } - - // Cancel existing primaries - foreach (var p in self.Info.Traits.Get().Produces) - { - foreach (var b in self.World.Queries.OwnedBy[self.Owner] - .WithTrait() - .Where(x => x.Trait.IsPrimary - && (x.Actor.Info.Traits.Get().Produces.Contains(p)))) - { - b.Trait.SetPrimaryProducer(b.Actor, false); - } - } - isPrimary = true; - - var eva = self.World.WorldActor.Info.Traits.Get(); - Sound.PlayToPlayer(self.Owner,eva.PrimaryBuildingSelected); - } } } diff --git a/mods/cnc/structures.yaml b/mods/cnc/structures.yaml index 054906adf7..cd99df3fb1 100644 --- a/mods/cnc/structures.yaml +++ b/mods/cnc/structures.yaml @@ -17,7 +17,6 @@ FACT: AllowsBuildingRepair: Production: Produces: Building,Defense - EnablePrimary: false Transforms: IntoActor: mcv Offset:1,1 @@ -160,6 +159,7 @@ PYLE: Produces: Infantry SpawnOffsets: -10,2, 7,7 ExitCells: 0,1, 1,1 + PrimaryBuilding: HAND: Inherits: ^Building @@ -188,6 +188,7 @@ HAND: Produces: Infantry SpawnOffsets: 12,24 ExitCells:1,2 + PrimaryBuilding: AFLD: Inherits: ^Building @@ -218,6 +219,8 @@ AFLD: Produces: Vehicle SpawnOffsets: -24,0 ExitCells:3,1 + PrimaryBuilding: + WEAP: Inherits: ^Building Buildable: @@ -247,6 +250,8 @@ WEAP: Produces: Vehicle SpawnOffsets: -8,-8 ExitCells: 0,2 + PrimaryBuilding: + HQ: RequiresPower: CanPowerDown: @@ -346,6 +351,7 @@ HPAD: SpawnOffsets: 0,-6 ExitCells: 0,0 Produces: Plane + PrimaryBuilding: BelowUnits: Reservable: RepairsUnits: diff --git a/mods/ra/structures.yaml b/mods/ra/structures.yaml index abf5023f72..c650a733bc 100644 --- a/mods/ra/structures.yaml +++ b/mods/ra/structures.yaml @@ -81,6 +81,7 @@ SPEN: SpawnOffsets: 0,-5, 0,-5, 0,0, 0,0 ExitCells: -1,2, 3,2, 0,0, 2,0 Produces: Ship + PrimaryBuilding: IronCurtainable: -EmitInfantryOnSell: RepairsUnits: @@ -115,6 +116,7 @@ SYRD: Produces: Ship SpawnOffsets: -25,23, 26,23, -22,-25, 23,-25 ExitCells: 0,2, 2,2, 0,0, 2,0 + PrimaryBuilding: IronCurtainable: -EmitInfantryOnSell: RepairsUnits: @@ -451,6 +453,7 @@ WEAP: SpawnOffsets: 5,0 ExitCells: 1,1 Produces: Vehicle + PrimaryBuilding: IronCurtainable: FACT: @@ -468,7 +471,6 @@ FACT: Bib: Production: Produces: Building,Defense - EnablePrimary: false IronCurtainable: Valued: Cost: 2500 @@ -567,6 +569,7 @@ HPAD: SpawnOffsets: 0,-6 ExitCells: 0,0 Produces: Plane + PrimaryBuilding: BelowUnits: Reservable: IronCurtainable: @@ -595,6 +598,7 @@ AFLD: Produces: Plane SpawnOffsets: 0,4 ExitCells: 1,1 + PrimaryBuilding: BelowUnits: Reservable: IronCurtainable: @@ -697,6 +701,7 @@ BARR: SpawnOffsets: -4,19, -17,15 ExitCells: 0,2, 0,2 Produces: Infantry + PrimaryBuilding: IronCurtainable: TENT: @@ -726,6 +731,7 @@ TENT: Produces: Infantry SpawnOffsets: -1,19, -17,15 ExitCells: 0,2, 0,2 + PrimaryBuilding: IronCurtainable: KENN: @@ -750,6 +756,7 @@ KENN: SpawnOffsets: 0,0 ExitCells: 0,0 Produces: Infantry + PrimaryBuilding: IronCurtainable: -EmitInfantryOnSell: