Powerdown etc... untested
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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); }
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user