From b620e8107fb422ca2f327bf621b008a3ca747930 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Thu, 19 Oct 2017 14:04:36 +0300 Subject: [PATCH] Added GrantRandomCondition trait. --- OpenRA.Mods.Common/OpenRA.Mods.Common.csproj | 1 + .../Traits/Conditions/GrantRandomCondition.cs | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 OpenRA.Mods.Common/Traits/Conditions/GrantRandomCondition.cs diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index f61fd348f6..58d2580718 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -301,6 +301,7 @@ + diff --git a/OpenRA.Mods.Common/Traits/Conditions/GrantRandomCondition.cs b/OpenRA.Mods.Common/Traits/Conditions/GrantRandomCondition.cs new file mode 100644 index 0000000000..f035376f50 --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Conditions/GrantRandomCondition.cs @@ -0,0 +1,47 @@ +#region Copyright & License Information +/* + * Copyright 2007-2018 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 System.Linq; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Conditions +{ + [Desc("Grants a random condition from a predefined list to the actor when created.")] + public class GrantRandomConditionInfo : ITraitInfo + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("List of conditions to grant from.")] + public readonly string[] Conditions = null; + + public object Create(ActorInitializer init) { return new GrantRandomCondition(init.Self, this); } + } + + public class GrantRandomCondition : INotifyCreated + { + readonly GrantRandomConditionInfo info; + + public GrantRandomCondition(Actor self, GrantRandomConditionInfo info) + { + this.info = info; + } + + void INotifyCreated.Created(Actor self) + { + if (!info.Conditions.Any()) + return; + + var condition = info.Conditions.Random(self.World.SharedRandom); + var conditionManager = self.Trait(); + conditionManager.GrantCondition(self, condition); + } + } +}