Convert AffectedByPowerOutage from disabler to conditional condition granter.
This commit is contained in:
@@ -15,23 +15,39 @@ using OpenRA.Traits;
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("Disables the actor when a power outage is triggered (see `InfiltrateForPowerOutage` for more information).")]
|
||||
public class AffectedByPowerOutageInfo : ITraitInfo
|
||||
public class AffectedByPowerOutageInfo : ConditionalTraitInfo
|
||||
{
|
||||
public object Create(ActorInitializer init) { return new AffectedByPowerOutage(init.Self); }
|
||||
[GrantedConditionReference]
|
||||
[Desc("The condition to grant while there is a power outage.")]
|
||||
public readonly string Condition = null;
|
||||
|
||||
public override object Create(ActorInitializer init) { return new AffectedByPowerOutage(init.Self, this); }
|
||||
}
|
||||
|
||||
public class AffectedByPowerOutage : INotifyOwnerChanged, ISelectionBar, IPowerModifier, IDisable
|
||||
public class AffectedByPowerOutage : ConditionalTrait<AffectedByPowerOutageInfo>, INotifyOwnerChanged, ISelectionBar, INotifyCreated, INotifyAddedToWorld
|
||||
{
|
||||
PowerManager playerPower;
|
||||
ConditionManager conditionManager;
|
||||
int token = ConditionManager.InvalidConditionToken;
|
||||
|
||||
public AffectedByPowerOutage(Actor self)
|
||||
public AffectedByPowerOutage(Actor self, AffectedByPowerOutageInfo info)
|
||||
: base(info)
|
||||
{
|
||||
playerPower = self.Owner.PlayerActor.Trait<PowerManager>();
|
||||
}
|
||||
|
||||
void INotifyAddedToWorld.AddedToWorld(Actor self) { UpdateStatus(self); }
|
||||
protected override void TraitEnabled(Actor self) { UpdateStatus(self); }
|
||||
protected override void TraitDisabled(Actor self) { Revoke(self); }
|
||||
|
||||
void INotifyCreated.Created(Actor self)
|
||||
{
|
||||
conditionManager = self.TraitOrDefault<ConditionManager>();
|
||||
}
|
||||
|
||||
float ISelectionBar.GetValue()
|
||||
{
|
||||
if (playerPower.PowerOutageRemainingTicks <= 0)
|
||||
if (IsTraitDisabled || playerPower.PowerOutageRemainingTicks <= 0)
|
||||
return 0;
|
||||
|
||||
return (float)playerPower.PowerOutageRemainingTicks / playerPower.PowerOutageTotalTicks;
|
||||
@@ -44,19 +60,30 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
bool ISelectionBar.DisplayWhenEmpty { get { return false; } }
|
||||
|
||||
int IPowerModifier.GetPowerModifier()
|
||||
public void UpdateStatus(Actor self)
|
||||
{
|
||||
return playerPower.PowerOutageRemainingTicks > 0 ? 0 : 100;
|
||||
if (!IsTraitDisabled && playerPower.PowerOutageRemainingTicks > 0)
|
||||
Grant(self);
|
||||
else
|
||||
Revoke(self);
|
||||
}
|
||||
|
||||
public bool Disabled
|
||||
void Grant(Actor self)
|
||||
{
|
||||
get { return playerPower.PowerOutageRemainingTicks > 0; }
|
||||
if (token == ConditionManager.InvalidConditionToken)
|
||||
token = conditionManager.GrantCondition(self, Info.Condition);
|
||||
}
|
||||
|
||||
void Revoke(Actor self)
|
||||
{
|
||||
if (token != ConditionManager.InvalidConditionToken)
|
||||
token = conditionManager.RevokeCondition(self, token);
|
||||
}
|
||||
|
||||
void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
|
||||
{
|
||||
playerPower = newOwner.PlayerActor.Trait<PowerManager>();
|
||||
UpdateStatus(self);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,11 +141,11 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
void UpdatePowerOutageActors()
|
||||
{
|
||||
var actors = self.World.ActorsHavingTrait<AffectedByPowerOutage>()
|
||||
.Where(a => !a.IsDead && a.IsInWorld && a.Owner == self.Owner);
|
||||
var traitPairs = self.World.ActorsWithTrait<AffectedByPowerOutage>()
|
||||
.Where(p => !p.Actor.IsDead && p.Actor.IsInWorld && p.Actor.Owner == self.Owner);
|
||||
|
||||
foreach (var a in actors)
|
||||
UpdateActor(a);
|
||||
foreach (var p in traitPairs)
|
||||
p.Trait.UpdateStatus(p.Actor);
|
||||
}
|
||||
|
||||
void IResolveOrder.ResolveOrder(Actor self, Order order)
|
||||
|
||||
@@ -933,3 +933,12 @@
|
||||
Palette: disabled
|
||||
GrantConditionOnDisabled@IDISABLE:
|
||||
Condition: disabled
|
||||
|
||||
^DisabledByPowerOutage:
|
||||
AffectedByPowerOutage:
|
||||
Condition: power-outage
|
||||
InfiltrateForPowerOutage:
|
||||
DisableOnCondition@POWER_OUTAGE:
|
||||
RequiresCondition: power-outage
|
||||
Power:
|
||||
RequiresCondition: !power-outage
|
||||
|
||||
@@ -1304,6 +1304,7 @@ AFLD:
|
||||
POWR:
|
||||
Inherits: ^Building
|
||||
Inherits@IDISABLE: ^DisabledOverlay
|
||||
Inherits@POWER_OUTAGE: ^DisabledByPowerOutage
|
||||
Buildable:
|
||||
Queue: Building
|
||||
BuildPaletteOrder: 10
|
||||
@@ -1327,8 +1328,6 @@ POWR:
|
||||
Bib:
|
||||
Power:
|
||||
Amount: 100
|
||||
InfiltrateForPowerOutage:
|
||||
AffectedByPowerOutage:
|
||||
Targetable:
|
||||
TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate
|
||||
ScalePowerWithHealth:
|
||||
@@ -1339,6 +1338,7 @@ POWR:
|
||||
APWR:
|
||||
Inherits: ^Building
|
||||
Inherits@IDISABLE: ^DisabledOverlay
|
||||
Inherits@POWER_OUTAGE: ^DisabledByPowerOutage
|
||||
Buildable:
|
||||
Queue: Building
|
||||
BuildPaletteOrder: 110
|
||||
@@ -1366,8 +1366,6 @@ APWR:
|
||||
Bib:
|
||||
Power:
|
||||
Amount: 200
|
||||
InfiltrateForPowerOutage:
|
||||
AffectedByPowerOutage:
|
||||
Targetable:
|
||||
TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate
|
||||
ScalePowerWithHealth:
|
||||
|
||||
@@ -954,3 +954,12 @@
|
||||
Palette: disabled
|
||||
GrantConditionOnDisabled@IDISABLE:
|
||||
Condition: disabled
|
||||
|
||||
^DisabledByPowerOutage:
|
||||
AffectedByPowerOutage:
|
||||
Condition: power-outage
|
||||
InfiltrateForPowerOutage:
|
||||
DisableOnCondition@POWER_OUTAGE:
|
||||
RequiresCondition: power-outage
|
||||
Power:
|
||||
RequiresCondition: !power-outage
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
GAPOWR:
|
||||
Inherits: ^Building
|
||||
Inherits@IDISABLE: ^DisabledOverlay
|
||||
Inherits@POWER_OUTAGE: ^DisabledByPowerOutage
|
||||
Buildable:
|
||||
Queue: Building
|
||||
BuildPaletteOrder: 10
|
||||
@@ -32,8 +33,6 @@ GAPOWR:
|
||||
Bounds: 90, 48, 0, -6
|
||||
Power:
|
||||
Amount: 100
|
||||
InfiltrateForPowerOutage:
|
||||
AffectedByPowerOutage:
|
||||
PowerTooltip:
|
||||
Targetable:
|
||||
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
|
||||
@@ -43,7 +42,7 @@ GAPOWR:
|
||||
Conditions:
|
||||
powrup: powrup.a
|
||||
Power@pluga:
|
||||
RequiresCondition: powrup.a
|
||||
RequiresCondition: powrup.a && !power-outage
|
||||
Amount: 50
|
||||
WithIdleOverlay@pluga:
|
||||
RequiresCondition: powrup.a
|
||||
@@ -58,7 +57,7 @@ GAPOWR:
|
||||
PauseOnCondition: disabled
|
||||
Sequence: idle-powrupb
|
||||
Power@plugb:
|
||||
RequiresCondition: powrup.b
|
||||
RequiresCondition: powrup.b && !power-outage
|
||||
Amount: 50
|
||||
ProvidesPrerequisite@buildingname:
|
||||
SelectionDecorations:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
NAPOWR:
|
||||
Inherits: ^Building
|
||||
Inherits@IDISABLE: ^DisabledOverlay
|
||||
Inherits@POWER_OUTAGE: ^DisabledByPowerOutage
|
||||
Buildable:
|
||||
Queue: Building
|
||||
BuildPaletteOrder: 20
|
||||
@@ -29,8 +30,6 @@ NAPOWR:
|
||||
Sequence: idle-lights
|
||||
Power:
|
||||
Amount: 100
|
||||
InfiltrateForPowerOutage:
|
||||
AffectedByPowerOutage:
|
||||
Targetable:
|
||||
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
|
||||
ScalePowerWithHealth:
|
||||
@@ -41,6 +40,7 @@ NAPOWR:
|
||||
NAAPWR:
|
||||
Inherits: ^Building
|
||||
Inherits@IDISABLE: ^DisabledOverlay
|
||||
Inherits@POWER_OUTAGE: ^DisabledByPowerOutage
|
||||
Buildable:
|
||||
Queue: Building
|
||||
BuildPaletteOrder: 120
|
||||
@@ -69,8 +69,6 @@ NAAPWR:
|
||||
Sequence: idle-lights
|
||||
Power:
|
||||
Amount: 200
|
||||
InfiltrateForPowerOutage:
|
||||
AffectedByPowerOutage:
|
||||
Targetable:
|
||||
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
|
||||
ScalePowerWithHealth:
|
||||
|
||||
Reference in New Issue
Block a user