Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make AppearsOnRadar Conditional & Player Stance Awear #13386

Merged
merged 2 commits into from Aug 25, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions OpenRA.Game/Support/VariableExpression.cs
Expand Up @@ -20,6 +20,8 @@ namespace OpenRA.Support
{
public abstract class VariableExpression
{
public static readonly IReadOnlyDictionary<string, int> NoVariables = new ReadOnlyDictionary<string, int>(new Dictionary<string, int>());

public readonly string Expression;
readonly HashSet<string> variables = new HashSet<string>();
public IEnumerable<string> Variables { get { return variables; } }
Expand Down
4 changes: 1 addition & 3 deletions OpenRA.Mods.Common/Traits/Conditions/ConditionalTrait.cs
Expand Up @@ -18,8 +18,6 @@ namespace OpenRA.Mods.Common.Traits
/// <summary>Use as base class for *Info to subclass of ConditionalTrait. (See ConditionalTrait.)</summary>
public abstract class ConditionalTraitInfo : IObservesVariablesInfo, IRulesetLoaded
{
protected static readonly IReadOnlyDictionary<string, int> NoConditions = new ReadOnlyDictionary<string, int>(new Dictionary<string, int>());

[ConsumedConditionReference]
[Desc("Boolean expression defining the condition to enable this trait.")]
public readonly BooleanExpression RequiresCondition = null;
Expand All @@ -33,7 +31,7 @@ public abstract class ConditionalTraitInfo : IObservesVariablesInfo, IRulesetLoa

public virtual void RulesetLoaded(Ruleset rules, ActorInfo ai)
{
EnabledByDefault = RequiresCondition == null || RequiresCondition.Evaluate(NoConditions);
EnabledByDefault = RequiresCondition == null || RequiresCondition.Evaluate(VariableExpression.NoVariables);
}
}

Expand Down
Expand Up @@ -28,7 +28,7 @@ public abstract class PausableConditionalTraitInfo : ConditionalTraitInfo
public override void RulesetLoaded(Ruleset rules, ActorInfo ai)
{
base.RulesetLoaded(rules, ai);
PausedByDefault = PauseOnCondition != null && PauseOnCondition.Evaluate(NoConditions);
PausedByDefault = PauseOnCondition != null && PauseOnCondition.Evaluate(VariableExpression.NoVariables);
}
}

Expand Down
24 changes: 15 additions & 9 deletions OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs
Expand Up @@ -18,38 +18,44 @@

namespace OpenRA.Mods.Common.Traits.Radar
{
public class AppearsOnRadarInfo : ITraitInfo
public class AppearsOnRadarInfo : ConditionalTraitInfo
{
public readonly bool UseLocation = false;

public object Create(ActorInitializer init) { return new AppearsOnRadar(this); }
[Desc("Player stances who can view this actor on radar.")]
public readonly Stance ValidStances = Stance.Ally | Stance.Neutral | Stance.Enemy;

public override object Create(ActorInitializer init) { return new AppearsOnRadar(this); }
}

public class AppearsOnRadar : IRadarSignature, INotifyCreated
public class AppearsOnRadar : ConditionalTrait<AppearsOnRadarInfo>, IRadarSignature
{
readonly AppearsOnRadarInfo info;
static readonly IEnumerable<Pair<CPos, Color>> NoCells = Enumerable.Empty<Pair<CPos, Color>>();
IRadarColorModifier modifier;

Color currentColor = Color.Transparent;
Func<Pair<CPos, SubCell>, Pair<CPos, Color>> cellToSignature;

public AppearsOnRadar(AppearsOnRadarInfo info)
{
this.info = info;
}
: base(info) { }

public void Created(Actor self)
protected override void Created(Actor self)
{
base.Created(self);
modifier = self.TraitsImplementing<IRadarColorModifier>().FirstOrDefault();
}

public IEnumerable<Pair<CPos, Color>> RadarSignatureCells(Actor self)
{
var viewer = self.World.RenderPlayer ?? self.World.LocalPlayer;
if (IsTraitDisabled || (viewer != null && !Info.ValidStances.HasStance(self.Owner.Stances[viewer])))
return NoCells;

var color = Game.Settings.Game.UsePlayerStanceColors ? self.Owner.PlayerStanceColor(self) : self.Owner.Color.RGB;
if (modifier != null)
color = modifier.RadarColorOverride(self, color);

if (info.UseLocation)
if (Info.UseLocation)
return new[] { Pair.New(self.Location, color) };

// PERF: Cache cellToSignature delegate to avoid allocations as color does not change often.
Expand Down