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

Reduce casts of traits that are already known to be IDisabledTraits #20361

Merged
merged 3 commits into from Oct 14, 2022
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
20 changes: 20 additions & 0 deletions OpenRA.Game/Exts.cs
Expand Up @@ -538,6 +538,26 @@ public static T FirstEnabledTraitOrDefault<T>(this T[] ts)
return default(T);
}

public static T FirstEnabledConditionalTraitOrDefault<T>(this IEnumerable<T> ts) where T : IDisabledTrait
{
// PERF: Avoid LINQ.
foreach (var t in ts)
if (!t.IsTraitDisabled)
return t;

return default(T);
}

public static T FirstEnabledConditionalTraitOrDefault<T>(this T[] ts) where T : IDisabledTrait
{
// PERF: Avoid LINQ.
foreach (var t in ts)
if (!t.IsTraitDisabled)
return t;

return default(T);
}

public static LineSplitEnumerator SplitLines(this string str, char separator)
{
return new LineSplitEnumerator(str.AsSpan(), separator);
Expand Down
Expand Up @@ -37,7 +37,7 @@ public void Chronoshift(LuaTable unitLocationPairs, int duration = 0, bool killC
}

var cs = actor.TraitsImplementing<Chronoshiftable>()
.FirstEnabledTraitOrDefault();
.FirstEnabledConditionalTraitOrDefault();

if (cs != null && cs.CanChronoshiftTo(actor, cell))
cs.Teleport(actor, cell, duration, killCargo, Self);
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Cnc/Traits/SupportPowers/ChronoshiftPower.cs
Expand Up @@ -90,7 +90,7 @@ public override void Activate(Actor self, Order order, SupportPowerManager manag
foreach (var target in UnitsInRange(order.ExtraLocation))
{
var cs = target.TraitsImplementing<Chronoshiftable>()
.FirstEnabledTraitOrDefault();
.FirstEnabledConditionalTraitOrDefault();

if (cs == null)
continue;
Expand Down
7 changes: 3 additions & 4 deletions OpenRA.Mods.Common/Activities/Attack.cs
Expand Up @@ -51,7 +51,7 @@ public Attack(Actor self, in Target target, bool allowMovement, bool forceAttack
this.targetLineColor = targetLineColor;
this.forceAttack = forceAttack;

attackTraits = self.TraitsImplementing<AttackFrontal>().ToArray().Where(Exts.IsTraitEnabled);
attackTraits = self.TraitsImplementing<AttackFrontal>().ToArray().Where(t => !t.IsTraitDisabled);
revealsShroud = self.TraitsImplementing<RevealsShroud>().ToArray();
facing = self.Trait<IFacing>();
positionable = self.Trait<IPositionable>();
Expand All @@ -67,8 +67,7 @@ public Attack(Actor self, in Target target, bool allowMovement, bool forceAttack

// Lambdas can't use 'in' variables, so capture a copy for later
var rangeTarget = target;
lastVisibleMaximumRange = attackTraits.Where(x => !x.IsTraitDisabled)
.Min(x => x.GetMaximumRangeVersusTarget(rangeTarget));
lastVisibleMaximumRange = attackTraits.Min(x => x.GetMaximumRangeVersusTarget(rangeTarget));

if (target.Type == TargetType.Actor)
{
Expand Down Expand Up @@ -176,7 +175,7 @@ protected virtual AttackStatus TickAttack(Actor self, AttackFrontal attack)
return AttackStatus.UnableToAttack;

var rs = revealsShroud
.Where(Exts.IsTraitEnabled)
.Where(t => !t.IsTraitDisabled)
.MaxByOrDefault(s => s.Range);

// Default to 2 cells if there are no active traits
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Activities/Move/Move.cs
Expand Up @@ -310,7 +310,7 @@ bool CellIsEvacuating(Actor self, CPos cell)
{
foreach (var actor in self.World.ActorMap.GetActorsAt(cell))
{
if (!(actor.OccupiesSpace is Mobile move) || !move.IsTraitEnabled() || !move.IsLeaving())
if (!(actor.OccupiesSpace is Mobile move) || move.IsTraitDisabled || !move.IsLeaving())
return false;
}

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Orders/GlobalButtonOrderGenerator.cs
Expand Up @@ -96,7 +96,7 @@ protected override string GetCursor(World world, CPos cell, int2 worldPixel, Mou

var cursor = OrderInner(world, mi)
.SelectMany(o => o.Subject.TraitsImplementing<Sellable>())
.Where(Exts.IsTraitEnabled)
.Where(t => !t.IsTraitDisabled)
.Select(si => si.Info.Cursor)
.FirstOrDefault();

Expand Down
Expand Up @@ -32,7 +32,7 @@ public DemolitionProperties(ScriptContext context, Actor self)
public void Demolish(Actor target)
{
// NB: Scripted actions get no visible targetlines.
var demolition = demolitions.FirstEnabledTraitOrDefault();
var demolition = demolitions.FirstEnabledConditionalTraitOrDefault();
if (demolition != null)
Self.QueueActivity(demolition.GetDemolishActivity(Self, Target.FromActor(target), null));
}
Expand Down
Expand Up @@ -185,7 +185,7 @@ public string TooltipName
{
get
{
var tooltip = tooltips.FirstEnabledTraitOrDefault();
var tooltip = tooltips.FirstEnabledConditionalTraitOrDefault();

return tooltip?.Info.Name;
}
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs
Expand Up @@ -325,7 +325,7 @@ public override bool Tick(Actor self)
if (target.Type == TargetType.FrozenActor && !attack.Info.TargetFrozenActors && !forceAttack)
{
var rs = revealsShroud
.Where(Exts.IsTraitEnabled)
.Where(t => !t.IsTraitDisabled)
.MaxByOrDefault(s => s.Range);

// Default to 2 cells if there are no active traits
Expand Down
4 changes: 2 additions & 2 deletions OpenRA.Mods.Common/Traits/AutoTarget.cs
Expand Up @@ -179,7 +179,7 @@ public AutoTarget(ActorInitializer init, AutoTargetInfo info)
: base(info)
{
var self = init.Self;
ActiveAttackBases = self.TraitsImplementing<AttackBase>().ToArray().Where(Exts.IsTraitEnabled);
ActiveAttackBases = self.TraitsImplementing<AttackBase>().ToArray().Where(t => !t.IsTraitDisabled);

stance = init.GetValue<StanceInit, UnitStance>(self.Owner.IsBot || !self.Owner.Playable ? info.InitialStanceAI : info.InitialStance);

Expand All @@ -195,7 +195,7 @@ protected override void Created(Actor self)
activeTargetPriorities =
self.TraitsImplementing<AutoTargetPriority>()
.OrderByDescending(ati => ati.Info.Priority).ToArray()
.Where(Exts.IsTraitEnabled).Select(atp => atp.Info);
.Where(t => !t.IsTraitDisabled).Select(atp => atp.Info);

overrideAutoTarget = self.TraitsImplementing<IOverrideAutoTarget>().ToArray();
notifyStanceChanged = self.TraitsImplementing<INotifyStanceChanged>().ToArray();
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/BotModules/HarvesterBotModule.cs
Expand Up @@ -126,7 +126,7 @@ void IBotTick.BotTick(IBot bot)
}

// Less harvesters than refineries - build a new harvester
var unitBuilder = requestUnitProduction.FirstOrDefault(Exts.IsTraitEnabled);
var unitBuilder = requestUnitProduction.FirstEnabledTraitOrDefault();
if (unitBuilder != null && Info.HarvesterTypes.Count > 0)
{
var harvInfo = AIUtils.GetInfoByCommonName(Info.HarvesterTypes, player);
Expand Down
Expand Up @@ -110,7 +110,7 @@ void IBotTick.BotTick(IBot bot)
// No construction yards - Build a new MCV
if (ShouldBuildMCV())
{
var unitBuilder = requestUnitProduction.FirstOrDefault(Exts.IsTraitEnabled);
var unitBuilder = requestUnitProduction.FirstEnabledTraitOrDefault();
if (unitBuilder != null)
{
var mcvInfo = AIUtils.GetInfoByCommonName(Info.McvTypes, player);
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Buildings/Exit.cs
Expand Up @@ -66,7 +66,7 @@ public static IEnumerable<Exit> Exits(this Actor actor, string productionType =
return Enumerable.Empty<Exit>();

var all = actor.TraitsImplementing<Exit>()
.Where(Exts.IsTraitEnabled);
.Where(t => !t.IsTraitDisabled);

if (string.IsNullOrEmpty(productionType))
return all;
Expand Down
4 changes: 2 additions & 2 deletions OpenRA.Mods.Common/Traits/CaptureManager.cs
Expand Up @@ -93,11 +93,11 @@ void INotifyCreated.Created(Actor self)

enabledCapturable = self.TraitsImplementing<Capturable>()
.ToArray()
.Where(Exts.IsTraitEnabled);
.Where(t => !t.IsTraitDisabled);

enabledCaptures = self.TraitsImplementing<Captures>()
.ToArray()
.Where(Exts.IsTraitEnabled);
.Where(t => !t.IsTraitDisabled);

RefreshCaptures();
RefreshCapturable();
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Mobile.cs
Expand Up @@ -604,7 +604,7 @@ public void RemoveInfluence()

Activity WrapMove(Activity inner)
{
var moveWrapper = moveWrappers.FirstOrDefault(Exts.IsTraitEnabled);
var moveWrapper = moveWrappers.FirstEnabledTraitOrDefault();
if (moveWrapper != null)
return moveWrapper.WrapMove(inner);

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/RejectsOrders.cs
Expand Up @@ -40,7 +40,7 @@ public static class RejectsOrdersExts
{
public static bool AcceptsOrder(this Actor self, string orderString)
{
var rejectsOrdersTraits = self.TraitsImplementing<RejectsOrders>().Where(Exts.IsTraitEnabled).ToArray();
var rejectsOrdersTraits = self.TraitsImplementing<RejectsOrders>().Where(t => !t.IsTraitDisabled).ToArray();
if (rejectsOrdersTraits.Length == 0)
return true;

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Render/ReloadArmamentsBar.cs
Expand Up @@ -42,7 +42,7 @@ public ReloadArmamentsBar(Actor self, ReloadArmamentsBarInfo info)
void INotifyCreated.Created(Actor self)
{
// Name check can be cached but enabled check can't.
armaments = self.TraitsImplementing<Armament>().Where(a => info.Armaments.Contains(a.Info.Name)).ToArray().Where(Exts.IsTraitEnabled);
armaments = self.TraitsImplementing<Armament>().Where(a => info.Armaments.Contains(a.Info.Name)).ToArray().Where(t => !t.IsTraitDisabled);
}

float ISelectionBar.GetValue()
Expand Down
11 changes: 4 additions & 7 deletions OpenRA.Mods.Common/Traits/Render/RenderDebugState.cs
Expand Up @@ -32,7 +32,7 @@ class RenderDebugState : INotifyAddedToWorld, INotifyOwnerChanged, INotifyCreate
readonly SpriteFont font;
readonly Actor self;
readonly WVec offset;
SquadManagerBotModule ai;
SquadManagerBotModule[] squadManagerModules;

Color color;
string tagString;
Expand All @@ -52,7 +52,7 @@ public RenderDebugState(Actor self, RenderDebugStateInfo info)

void INotifyCreated.Created(Actor self)
{
ai = self.Owner.PlayerActor.TraitsImplementing<SquadManagerBotModule>().FirstOrDefault(Exts.IsTraitEnabled);
squadManagerModules = self.Owner.PlayerActor.TraitsImplementing<SquadManagerBotModule>().ToArray();
}

void INotifyAddedToWorld.AddedToWorld(Actor self)
Expand Down Expand Up @@ -86,11 +86,8 @@ IEnumerable<IRenderable> IRenderAnnotationsWhenSelected.RenderAnnotations(Actor
if (!self.Owner.IsBot)
yield break;

if (ai == null)
yield break;

var squads = ai.Squads;
var squad = squads.FirstOrDefault(x => x.Units.Contains(self));
var squads = squadManagerModules.FirstEnabledConditionalTraitOrDefault()?.Squads;
var squad = squads?.FirstOrDefault(x => x.Units.Contains(self));
if (squad == null)
yield break;

Expand Down
6 changes: 3 additions & 3 deletions OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs
Expand Up @@ -62,7 +62,7 @@ public void Forward(Actor self, Action onComplete)
if (token == Actor.InvalidConditionToken)
token = self.GrantCondition(info.Condition);

var wsb = wsbs.FirstEnabledTraitOrDefault();
var wsb = wsbs.FirstEnabledConditionalTraitOrDefault();

if (wsb == null)
return;
Expand All @@ -88,7 +88,7 @@ public void Reverse(Actor self, Action onComplete)
if (token == Actor.InvalidConditionToken)
token = self.GrantCondition(info.Condition);

var wsb = wsbs.FirstEnabledTraitOrDefault();
var wsb = wsbs.FirstEnabledConditionalTraitOrDefault();

if (wsb == null)
return;
Expand Down Expand Up @@ -117,7 +117,7 @@ public void Reverse(Actor self, Activity activity, bool queued = true)
// (sell/transform/etc) runs. This causes visual glitches that we attempt to minimize
// by forcing the animation to frame 0 and regranting the make condition.
// These workarounds will break the actor if the followup activity doesn't dispose it!
wsbs.FirstEnabledTraitOrDefault()?.DefaultAnimation.PlayFetchIndex(info.Sequence, () => 0);
wsbs.FirstEnabledConditionalTraitOrDefault()?.DefaultAnimation.PlayFetchIndex(info.Sequence, () => 0);

token = self.GrantCondition(info.Condition);

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs
Expand Up @@ -64,7 +64,7 @@ ImpactActorType ActorTypeAtImpact(World world, WPos pos, Actor firedBy)
if (!AffectsParent && victim == firedBy)
continue;

var activeShapes = victim.TraitsImplementing<HitShape>().Where(Exts.IsTraitEnabled);
var activeShapes = victim.TraitsImplementing<HitShape>().Where(t => !t.IsTraitDisabled);
if (!activeShapes.Any(s => s.DistanceFromEdge(victim, pos).Length <= 0))
continue;

Expand Down