Powerdown etc... untested

This commit is contained in:
Paul Chote
2010-09-18 16:14:07 +12:00
parent 3c19b3df73
commit 8455dadb3c
5 changed files with 84 additions and 41 deletions

View File

@@ -65,19 +65,12 @@ namespace OpenRA.Traits
public int GetPowerUsage() public int GetPowerUsage()
{ {
var modifier = self if (Info.Power <= 0)
.TraitsImplementing<IPowerModifier>() return Info.Power;
.Select(t => t.GetPowerModifier())
.Product();
if (Info.Power > 0) var health = self.TraitOrDefault<Health>();
{ var healthFraction = (health == null) ? 1f : health.HPFraction;
var health = self.TraitOrDefault<Health>(); return (int)(healthFraction * Info.Power);
var healthFraction = (health == null) ? 1f : health.HPFraction;
return (int)(modifier * healthFraction * Info.Power);
}
else
return (int)(modifier * Info.Power);
} }
public void Damaged(Actor self, AttackInfo e) public void Damaged(Actor self, AttackInfo e)
@@ -85,14 +78,9 @@ namespace OpenRA.Traits
// Power plants lose power with damage // Power plants lose power with damage
if (Info.Power > 0) if (Info.Power > 0)
{ {
var modifier = self
.TraitsImplementing<IPowerModifier>()
.Select(t => t.GetPowerModifier())
.Product();
var health = self.TraitOrDefault<Health>(); var health = self.TraitOrDefault<Health>();
var healthFraction = (health == null) ? 1f : health.HPFraction; var healthFraction = (health == null) ? 1f : health.HPFraction;
PlayerPower.UpdateActor(self, (int)(modifier * healthFraction * Info.Power)); PlayerPower.UpdateActor(self, (int)(healthFraction * Info.Power));
} }
if (e.DamageState == DamageState.Dead) if (e.DamageState == DamageState.Dead)

View File

@@ -11,6 +11,7 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using OpenRA.FileFormats;
namespace OpenRA.Traits namespace OpenRA.Traits
{ {
@@ -25,6 +26,7 @@ namespace OpenRA.Traits
PowerManagerInfo Info; PowerManagerInfo Info;
Player Player; Player Player;
Dictionary<Actor, List<string>> Overrides = new Dictionary<Actor, List<string>>();
Dictionary<Actor, int> PowerDrain = new Dictionary<Actor, int>(); Dictionary<Actor, int> PowerDrain = new Dictionary<Actor, int>();
[Sync] int totalProvided; [Sync] int totalProvided;
public int PowerProvided { get { return totalProvided; } } public int PowerProvided { get { return totalProvided; } }
@@ -41,7 +43,7 @@ namespace OpenRA.Traits
init.world.ActorRemoved += ActorRemoved; init.world.ActorRemoved += ActorRemoved;
} }
public void ActorAdded(Actor a) void ActorAdded(Actor a)
{ {
if (a.Owner != Player || !a.HasTrait<Building>()) if (a.Owner != Player || !a.HasTrait<Building>())
return; return;
@@ -50,16 +52,7 @@ namespace OpenRA.Traits
UpdateTotals(); UpdateTotals();
} }
public void UpdateActor(Actor a, int newPower) void ActorRemoved(Actor a)
{
if (a.Owner != Player || !a.HasTrait<Building>())
return;
Game.Debug("Updated {0}: {1}->{2}",a.Info.Name, PowerDrain[a], newPower);
PowerDrain[a] = newPower;
UpdateTotals();
}
public void ActorRemoved(Actor a)
{ {
if (a.Owner != Player || !a.HasTrait<Building>()) if (a.Owner != Player || !a.HasTrait<Building>())
return; return;
@@ -72,8 +65,12 @@ namespace OpenRA.Traits
{ {
totalProvided = 0; totalProvided = 0;
totalDrained = 0; totalDrained = 0;
foreach (var p in PowerDrain.Values) foreach (var kv in PowerDrain)
{ {
if (Overrides.Keys.Contains(kv.Key))
continue;
var p = kv.Value;
if (p > 0) if (p > 0)
totalProvided += p; totalProvided += p;
else else
@@ -82,6 +79,15 @@ namespace OpenRA.Traits
Game.Debug("Provided: {0} Drained: {1}",totalProvided, totalDrained); Game.Debug("Provided: {0} Drained: {1}",totalProvided, totalDrained);
} }
public void UpdateActor(Actor a, int newPower)
{
if (a.Owner != Player || !a.HasTrait<Building>())
return;
PowerDrain[a] = newPower;
UpdateTotals();
}
int nextPowerAdviceTime = 0; int nextPowerAdviceTime = 0;
bool wasLowPower = false; bool wasLowPower = false;
public void Tick(Actor self) public void Tick(Actor self)
@@ -91,7 +97,6 @@ namespace OpenRA.Traits
nextPowerAdviceTime = 0; nextPowerAdviceTime = 0;
wasLowPower = lowPower; wasLowPower = lowPower;
if (--nextPowerAdviceTime <= 0) if (--nextPowerAdviceTime <= 0)
{ {
if (lowPower) if (lowPower)
@@ -101,6 +106,46 @@ namespace OpenRA.Traits
} }
} }
// Force power down for power-down button, spy, emp, etc
public void Disable(Actor a, string key)
{
Game.Debug("Disabled {0}.{1}",a.Info.Name,key);
if (Overrides.ContainsKey(a))
{
if (Overrides[a].Contains(key))
return;
Overrides[a].Add(key);
}
else
Overrides.Add(a, new List<string>() { key });
UpdateTotals();
}
public void RemoveDisable(Actor a, string key)
{
Game.Debug("Enabled {0}.{1}",a.Info.Name, key);
if (!Overrides.ContainsKey(a) || !Overrides[a].Contains(key))
return;
Overrides[a].Remove(key);
if (Overrides[a].Count == 0)
Overrides.Remove(a);
UpdateTotals();
}
public bool IsPowered(Actor a)
{
if (Overrides.ContainsKey(a))
return false;
return PowerProvided >= PowerDrained;
}
public PowerState GetPowerState() public PowerState GetPowerState()
{ {
if (PowerProvided >= PowerDrained) return PowerState.Normal; if (PowerProvided >= PowerDrained) return PowerState.Normal;

View File

@@ -99,7 +99,6 @@ namespace OpenRA.Traits
public interface IRenderModifier { IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r); } public interface IRenderModifier { IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r); }
public interface IDamageModifier { float GetDamageModifier( WarheadInfo warhead ); } public interface IDamageModifier { float GetDamageModifier( WarheadInfo warhead ); }
public interface ISpeedModifier { float GetSpeedModifier(); } public interface ISpeedModifier { float GetSpeedModifier(); }
public interface IPowerModifier { float GetPowerModifier(); }
public interface IFirepowerModifier { float GetFirepowerModifier(); } public interface IFirepowerModifier { float GetFirepowerModifier(); }
public interface IPaletteModifier { void AdjustPalette(Dictionary<string,Palette> b); } public interface IPaletteModifier { void AdjustPalette(Dictionary<string,Palette> b); }
public interface IPips { IEnumerable<PipType> GetPips(Actor self); } public interface IPips { IEnumerable<PipType> GetPips(Actor self); }

View File

@@ -12,17 +12,23 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
{ {
public class CanPowerDownInfo : TraitInfo<CanPowerDown> { } public class CanPowerDownInfo : ITraitInfo
{
public object Create(ActorInitializer init) { return new CanPowerDown(init); }
}
public class CanPowerDown : IDisable, IPowerModifier, IResolveOrder public class CanPowerDown : IResolveOrder
{ {
[Sync] [Sync]
bool disabled = false; bool disabled = false;
readonly PowerManager PlayerPower;
public CanPowerDown(ActorInitializer init)
{
PlayerPower = init.self.Owner.PlayerActor.Trait<PowerManager>();
}
public bool Disabled { get { return disabled; } } public bool Disabled { get { return disabled; } }
public float GetPowerModifier() { return (disabled) ? 0.0f : 1.0f; }
public void ResolveOrder(Actor self, Order order) public void ResolveOrder(Actor self, Order order)
{ {
if (order.OrderString == "PowerDown") if (order.OrderString == "PowerDown")
@@ -30,6 +36,11 @@ namespace OpenRA.Mods.RA
disabled = !disabled; disabled = !disabled;
var eva = self.World.WorldActor.Info.Traits.Get<EvaAlertsInfo>(); var eva = self.World.WorldActor.Info.Traits.Get<EvaAlertsInfo>();
Sound.PlayToPlayer(self.Owner, disabled ? eva.EnablePower : eva.DisablePower); Sound.PlayToPlayer(self.Owner, disabled ? eva.EnablePower : eva.DisablePower);
if (disabled)
PlayerPower.Disable(self, "PowerDown");
else
PlayerPower.RemoveDisable(self, "PowerDown");
} }
} }
} }

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA
public bool Disabled public bool Disabled
{ {
get { return (power.GetPowerState() != PowerState.Normal); } get { return power.IsPowered(self); }
} }
} }
} }