Made PowerManager optional for traits who do not require it.

This commit is contained in:
Andre Mohren
2018-07-22 12:08:58 +02:00
committed by Paul Chote
parent dcf93203ea
commit 81e1b39bb9
6 changed files with 38 additions and 26 deletions

View File

@@ -199,7 +199,7 @@ namespace OpenRA.Mods.Common.AI
bool HasSufficientPowerForActor(ActorInfo actorInfo) bool HasSufficientPowerForActor(ActorInfo actorInfo)
{ {
return (actorInfo.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault) return playerPower == null || (actorInfo.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault)
.Sum(p => p.Amount) + playerPower.ExcessPower) >= minimumExcessPower; .Sum(p => p.Amount) + playerPower.ExcessPower) >= minimumExcessPower;
} }
@@ -212,7 +212,7 @@ namespace OpenRA.Mods.Common.AI
a => a.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount)); a => a.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount));
// First priority is to get out of a low power situation // First priority is to get out of a low power situation
if (playerPower.ExcessPower < minimumExcessPower) if (playerPower != null && playerPower.ExcessPower < minimumExcessPower)
{ {
if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount) > 0) if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount) > 0)
{ {
@@ -318,7 +318,7 @@ namespace OpenRA.Mods.Common.AI
// Will this put us into low power? // Will this put us into low power?
var actor = world.Map.Rules.Actors[name]; var actor = world.Map.Rules.Actors[name];
if (playerPower.ExcessPower < minimumExcessPower || !HasSufficientPowerForActor(actor)) if (playerPower != null && (playerPower.ExcessPower < minimumExcessPower || !HasSufficientPowerForActor(actor)))
{ {
// Try building a power plant instead // Try building a power plant instead
if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(pi => pi.Amount) > 0) if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(pi => pi.Amount) > 0)

View File

@@ -330,7 +330,7 @@ namespace OpenRA.Mods.Common.AI
{ {
Player = p; Player = p;
IsEnabled = true; IsEnabled = true;
playerPower = p.PlayerActor.Trait<PowerManager>(); playerPower = p.PlayerActor.TraitOrDefault<PowerManager>();
playerResource = p.PlayerActor.Trait<PlayerResources>(); playerResource = p.PlayerActor.Trait<PlayerResources>();
harvManager = new AIHarvesterManager(this, p); harvManager = new AIHarvesterManager(this, p);

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Attach this to the player actor (not a building!) to define a new shared build queue.", [Desc("Attach this to the player actor (not a building!) to define a new shared build queue.",
"Will only work together with the Production: trait on the actor that actually does the production.", "Will only work together with the Production: trait on the actor that actually does the production.",
"You will also want to add PrimaryBuildings: to let the user choose where new units should exit.")] "You will also want to add PrimaryBuildings: to let the user choose where new units should exit.")]
public class ClassicProductionQueueInfo : ProductionQueueInfo, Requires<TechTreeInfo>, Requires<PowerManagerInfo>, Requires<PlayerResourcesInfo> public class ClassicProductionQueueInfo : ProductionQueueInfo, Requires<TechTreeInfo>, Requires<PlayerResourcesInfo>
{ {
[Desc("If you build more actors of the same type,", "the same queue will get its build time lowered for every actor produced there.")] [Desc("If you build more actors of the same type,", "the same queue will get its build time lowered for every actor produced there.")]
public readonly bool SpeedUp = false; public readonly bool SpeedUp = false;

View File

@@ -121,7 +121,6 @@ namespace OpenRA.Mods.Common.Traits
self = init.Self; self = init.Self;
Info = info; Info = info;
playerResources = playerActor.Trait<PlayerResources>(); playerResources = playerActor.Trait<PlayerResources>();
playerPower = playerActor.Trait<PowerManager>();
developerMode = playerActor.Trait<DeveloperMode>(); developerMode = playerActor.Trait<DeveloperMode>();
Faction = init.Contains<FactionInit>() ? init.Get<FactionInit, string>() : self.Owner.Faction.InternalName; Faction = init.Contains<FactionInit>() ? init.Get<FactionInit, string>() : self.Owner.Faction.InternalName;
@@ -135,6 +134,11 @@ namespace OpenRA.Mods.Common.Traits
void INotifyCreated.Created(Actor self) void INotifyCreated.Created(Actor self)
{ {
// Special case handling is required for the Player actor.
// Created is called before Player.PlayerActor is assigned,
// so we must query other player traits from self, knowing that
// it refers to the same actor as self.Owner.PlayerActor
playerPower = (self.Info.Name == "player" ? self : self.Owner.PlayerActor).TraitOrDefault<PowerManager>();
productionTraits = self.TraitsImplementing<Production>().ToArray(); productionTraits = self.TraitsImplementing<Production>().ToArray();
} }
@@ -152,7 +156,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
ClearQueue(); ClearQueue();
playerPower = newOwner.PlayerActor.Trait<PowerManager>(); playerPower = newOwner.PlayerActor.TraitOrDefault<PowerManager>();
playerResources = newOwner.PlayerActor.Trait<PlayerResources>(); playerResources = newOwner.PlayerActor.Trait<PlayerResources>();
developerMode = newOwner.PlayerActor.Trait<DeveloperMode>(); developerMode = newOwner.PlayerActor.Trait<DeveloperMode>();
@@ -522,7 +526,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
get get
{ {
return (pm.PowerState == PowerState.Normal) ? RemainingTime : return (pm == null || pm.PowerState == PowerState.Normal) ? RemainingTime :
RemainingTime * Queue.Info.LowPowerSlowdown; RemainingTime * Queue.Info.LowPowerSlowdown;
} }
} }
@@ -570,7 +574,7 @@ namespace OpenRA.Mods.Common.Traits
if (Paused) if (Paused)
return; return;
if (pm.PowerState != PowerState.Normal) if (pm != null && pm.PowerState != PowerState.Normal)
{ {
if (--Slowdown <= 0) if (--Slowdown <= 0)
Slowdown = Queue.Info.LowPowerSlowdown; Slowdown = Queue.Info.LowPowerSlowdown;

View File

@@ -255,10 +255,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
template.Get<LabelWidget>("CASH").GetText = () => "$" + (res.Cash + res.Resources); template.Get<LabelWidget>("CASH").GetText = () => "$" + (res.Cash + res.Resources);
template.Get<LabelWidget>("EARNED_MIN").GetText = () => AverageEarnedPerMinute(res.Earned); template.Get<LabelWidget>("EARNED_MIN").GetText = () => AverageEarnedPerMinute(res.Earned);
var powerRes = player.PlayerActor.Trait<PowerManager>(); var powerRes = player.PlayerActor.TraitOrDefault<PowerManager>();
var power = template.Get<LabelWidget>("POWER"); if (powerRes != null)
power.GetText = () => powerRes.PowerDrained + "/" + powerRes.PowerProvided; {
power.GetColor = () => GetPowerColor(powerRes.PowerState); var power = template.Get<LabelWidget>("POWER");
power.GetText = () => powerRes.PowerDrained + "/" + powerRes.PowerProvided;
power.GetColor = () => GetPowerColor(powerRes.PowerState);
}
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>(); var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
if (stats == null) return template; if (stats == null) return template;

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
var world = player.World; var world = player.World;
var mapRules = world.Map.Rules; var mapRules = world.Map.Rules;
var pm = player.PlayerActor.Trait<PowerManager>(); var pm = player.PlayerActor.TraitOrDefault<PowerManager>();
var pr = player.PlayerActor.Trait<PlayerResources>(); var pr = player.PlayerActor.Trait<PlayerResources>();
widget.IsVisible = () => getTooltipIcon() != null && getTooltipIcon().Actor != null; widget.IsVisible = () => getTooltipIcon() != null && getTooltipIcon().Actor != null;
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ActorInfo lastActor = null; ActorInfo lastActor = null;
Hotkey lastHotkey = Hotkey.Invalid; Hotkey lastHotkey = Hotkey.Invalid;
var lastPowerState = pm.PowerState; var lastPowerState = pm == null ? PowerState.Normal : pm.PowerState;
tooltipContainer.BeforeRender = () => tooltipContainer.BeforeRender = () =>
{ {
@@ -64,7 +64,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
return; return;
var hotkey = tooltipIcon.Hotkey != null ? tooltipIcon.Hotkey.GetValue() : Hotkey.Invalid; var hotkey = tooltipIcon.Hotkey != null ? tooltipIcon.Hotkey.GetValue() : Hotkey.Invalid;
if (actor == lastActor && hotkey == lastHotkey && pm.PowerState == lastPowerState) if (actor == lastActor && hotkey == lastHotkey && (pm == null || pm.PowerState == lastPowerState))
return; return;
var tooltip = actor.TraitInfos<TooltipInfo>().FirstOrDefault(info => info.EnabledByDefault); var tooltip = actor.TraitInfos<TooltipInfo>().FirstOrDefault(info => info.EnabledByDefault);
@@ -92,19 +92,23 @@ namespace OpenRA.Mods.Common.Widgets.Logic
requiresLabel.Text = prereqs.Any() ? requiresFormat.F(prereqs.JoinWith(", ")) : ""; requiresLabel.Text = prereqs.Any() ? requiresFormat.F(prereqs.JoinWith(", ")) : "";
var requiresSize = requiresFont.Measure(requiresLabel.Text); var requiresSize = requiresFont.Measure(requiresLabel.Text);
var power = actor.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(i => i.Amount); var powerSize = new int2(0, 0);
powerLabel.Text = power.ToString(); if (pm != null)
powerLabel.GetColor = () => ((pm.PowerProvided - pm.PowerDrained) >= -power || power > 0) {
? Color.White : Color.Red; var power = actor.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(i => i.Amount);
powerLabel.Visible = power != 0; powerLabel.Text = power.ToString();
powerIcon.Visible = power != 0; powerLabel.GetColor = () => ((pm.PowerProvided - pm.PowerDrained) >= -power || power > 0)
var powerSize = font.Measure(powerLabel.Text); ? Color.White : Color.Red;
powerLabel.Visible = power != 0;
powerIcon.Visible = power != 0;
powerSize = font.Measure(powerLabel.Text);
}
var buildTime = tooltipIcon.ProductionQueue == null ? 0 : tooltipIcon.ProductionQueue.GetBuildTime(actor, buildable); var buildTime = tooltipIcon.ProductionQueue == null ? 0 : tooltipIcon.ProductionQueue.GetBuildTime(actor, buildable);
var timeMultiplier = pm.PowerState != PowerState.Normal ? tooltipIcon.ProductionQueue.Info.LowPowerSlowdown : 1; var timeMultiplier = pm != null && pm.PowerState != PowerState.Normal ? tooltipIcon.ProductionQueue.Info.LowPowerSlowdown : 1;
timeLabel.Text = formatBuildTime.Update(buildTime * timeMultiplier); timeLabel.Text = formatBuildTime.Update(buildTime * timeMultiplier);
timeLabel.TextColor = (pm.PowerState != PowerState.Normal && tooltipIcon.ProductionQueue.Info.LowPowerSlowdown > 1) ? Color.Red : Color.White; timeLabel.TextColor = (pm != null && pm.PowerState != PowerState.Normal && tooltipIcon.ProductionQueue.Info.LowPowerSlowdown > 1) ? Color.Red : Color.White;
var timeSize = font.Measure(timeLabel.Text); var timeSize = font.Measure(timeLabel.Text);
costLabel.Text = cost.ToString(); costLabel.Text = cost.ToString();
@@ -127,7 +131,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
lastActor = actor; lastActor = actor;
lastHotkey = hotkey; lastHotkey = hotkey;
lastPowerState = pm.PowerState; if (pm != null)
lastPowerState = pm.PowerState;
}; };
} }