diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 1d672dff30..ce4c980fff 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -800,6 +800,7 @@ + diff --git a/OpenRA.Mods.Common/Traits/Buildings/LineBuild.cs b/OpenRA.Mods.Common/Traits/Buildings/LineBuild.cs index ee52a2dbd1..f31642e77c 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/LineBuild.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/LineBuild.cs @@ -15,6 +15,15 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { + public enum LineBuildDirection { Unset, X, Y } + public class LineBuildDirectionInit : IActorInit + { + [FieldFromYamlKey] readonly LineBuildDirection value = LineBuildDirection.Unset; + public LineBuildDirectionInit() { } + public LineBuildDirectionInit(LineBuildDirection init) { value = init; } + public LineBuildDirection Value(World world) { return value; } + } + public class LineBuildParentInit : IActorInit { [FieldFromYamlKey] public readonly string[] ParentNames = new string[0]; diff --git a/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnLineBuildDirection.cs b/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnLineBuildDirection.cs new file mode 100644 index 0000000000..e8ee3eaf8a --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnLineBuildDirection.cs @@ -0,0 +1,51 @@ +#region Copyright & License Information +/* + * Copyright 2007-2017 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, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + public class GrantConditionOnLineBuildDirectionInfo : ITraitInfo, Requires + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("Condition to grant.")] + public readonly string Condition = null; + + [FieldLoader.Require] + [Desc("Line build direction to trigger the condition.")] + public readonly LineBuildDirection Direction = LineBuildDirection.X; + + public object Create(ActorInitializer init) { return new GrantConditionOnLineBuildDirection(init, this); } + } + + public class GrantConditionOnLineBuildDirection : INotifyCreated + { + readonly GrantConditionOnLineBuildDirectionInfo info; + readonly LineBuildDirection direction; + + public GrantConditionOnLineBuildDirection(ActorInitializer init, GrantConditionOnLineBuildDirectionInfo info) + { + this.info = info; + direction = init.Get().Value(init.World); + } + + void INotifyCreated.Created(Actor self) + { + if (direction != info.Direction) + return; + + var conditionManager = self.TraitOrDefault(); + if (conditionManager != null && !string.IsNullOrEmpty(info.Condition)) + conditionManager.GrantCondition(self, info.Condition); + } + } +} diff --git a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs index 2fe669ee23..8f7eac28c3 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs @@ -103,6 +103,7 @@ namespace OpenRA.Mods.Common.Traits new LocationInit(t.First), new OwnerInit(order.Player), new FactionInit(faction), + new LineBuildDirectionInit(t.First.X == order.TargetLocation.X ? LineBuildDirection.Y : LineBuildDirection.X), new LineBuildParentInit(new[] { t.Second, placed }) }); }