From cc355124729268e458abf59136140fdfb72f2c87 Mon Sep 17 00:00:00 2001 From: Mustafa Alperen Seki Date: Sun, 23 Feb 2020 16:31:19 +0100 Subject: [PATCH] Add a trait to reveal the whole map when conditions are met. --- OpenRA.Mods.Common/Traits/RevealsMap.cs | 76 +++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 OpenRA.Mods.Common/Traits/RevealsMap.cs diff --git a/OpenRA.Mods.Common/Traits/RevealsMap.cs b/OpenRA.Mods.Common/Traits/RevealsMap.cs new file mode 100644 index 0000000000..2f2c673ccb --- /dev/null +++ b/OpenRA.Mods.Common/Traits/RevealsMap.cs @@ -0,0 +1,76 @@ +#region Copyright & License Information +/* + * Copyright 2007-2020 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 +{ + [Desc("Reveals shroud and fog across the whole map while active.")] + public class RevealsMapInfo : ConditionalTraitInfo + { + [Desc("Stance the watching player needs to see the shroud removed.")] + public readonly Stance ValidStances = Stance.Ally; + + [Desc("Can this actor reveal shroud generated by the `GeneratesShroud` trait?")] + public readonly bool RevealGeneratedShroud = true; + + public override object Create(ActorInitializer init) { return new RevealsMap(this); } + } + + public class RevealsMap : ConditionalTrait, INotifyKilled, INotifyActorDisposing + { + readonly Shroud.SourceType type; + + public RevealsMap(RevealsMapInfo info) + : base(info) + { + type = info.RevealGeneratedShroud ? Shroud.SourceType.Visibility + : Shroud.SourceType.PassiveVisibility; + } + + protected void AddCellsToPlayerShroud(Actor self, Player p, PPos[] uv) + { + if (!Info.ValidStances.HasStance(p.Stances[self.Owner])) + return; + + p.Shroud.AddSource(this, type, uv); + } + + protected void RemoveCellsFromPlayerShroud(Actor self, Player p) { p.Shroud.RemoveSource(this); } + + protected PPos[] ProjectedCells(Actor self) + { + var map = self.World.Map; + return map.ProjectedCellBounds.ToArray(); + } + + void INotifyActorDisposing.Disposing(Actor self) + { + RemoveCellsFromPlayerShroud(self, self.Owner); + } + + void INotifyKilled.Killed(Actor self, AttackInfo e) + { + RemoveCellsFromPlayerShroud(self, self.Owner); + } + + protected override void TraitEnabled(Actor self) + { + AddCellsToPlayerShroud(self, self.Owner, ProjectedCells(self)); + } + + protected override void TraitDisabled(Actor self) + { + RemoveCellsFromPlayerShroud(self, self.Owner); + } + } +}