Try again, with less fail.

This commit is contained in:
Paul Chote
2010-09-18 19:56:03 +12:00
parent 8455dadb3c
commit 4cb26c0e3c
9 changed files with 21 additions and 75 deletions

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Traits
public object Create(ActorInitializer init) { return new Building(init); } public object Create(ActorInitializer init) { return new Building(init); }
} }
public class Building : INotifyDamage, IResolveOrder, IRenderModifier, IOccupySpace public class Building : INotifyDamage, IResolveOrder, IOccupySpace
{ {
readonly Actor self; readonly Actor self;
public readonly BuildingInfo Info; public readonly BuildingInfo Info;
@@ -47,11 +47,6 @@ namespace OpenRA.Traits
readonly PowerManager PlayerPower; readonly PowerManager PlayerPower;
public bool Disabled
{
get { return self.TraitsImplementing<IDisable>().Any(t => t.Disabled); }
}
public Building(ActorInitializer init) public Building(ActorInitializer init)
{ {
this.self = init.self; this.self = init.self;
@@ -99,16 +94,6 @@ namespace OpenRA.Traits
} }
} }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{
foreach (var a in r)
{
yield return a;
if (Disabled)
yield return a.WithPalette("disabled");
}
}
public int2 TopLeft public int2 TopLeft
{ {
get { return topLeft; } get { return topLeft; }

View File

@@ -26,7 +26,6 @@ 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; } }
@@ -67,9 +66,6 @@ namespace OpenRA.Traits
totalDrained = 0; totalDrained = 0;
foreach (var kv in PowerDrain) foreach (var kv in PowerDrain)
{ {
if (Overrides.Keys.Contains(kv.Key))
continue;
var p = kv.Value; var p = kv.Value;
if (p > 0) if (p > 0)
totalProvided += p; totalProvided += p;
@@ -106,46 +102,6 @@ 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

@@ -222,8 +222,7 @@ namespace OpenRA.Traits
protected static bool IsDisabledBuilding(Actor a) protected static bool IsDisabledBuilding(Actor a)
{ {
var building = a.TraitOrDefault<Building>(); return a.TraitsImplementing<IDisable>().Any(d => d.Disabled);
return building != null && building.Disabled;
} }
protected virtual void BuildUnit( string name ) protected virtual void BuildUnit( string name )

View File

@@ -23,8 +23,8 @@ namespace OpenRA.Traits
bool UpdateActive(Actor self) bool UpdateActive(Actor self)
{ {
// Check if powered // Check if powered
var b = self.Trait<Building>(); if (self.TraitsImplementing<IDisable>().Any(d => d.Disabled))
if (b.Disabled) return false; return false;
var isJammed = self.World.Queries.WithTrait<JamsRadar>().Any(a => self.Owner != a.Actor.Owner var isJammed = self.World.Queries.WithTrait<JamsRadar>().Any(a => self.Owner != a.Actor.Owner
&& (self.Location - a.Actor.Location).Length < a.Actor.Info.Traits.Get<JamsRadarInfo>().Range); && (self.Location - a.Actor.Location).Length < a.Actor.Info.Traits.Get<JamsRadarInfo>().Range);

View File

@@ -104,8 +104,7 @@ namespace OpenRA.Traits
// Takes 0.3ms on pchote's machine -- calling it every tick for every active special power is retarded // Takes 0.3ms on pchote's machine -- calling it every tick for every active special power is retarded
var buildings = TechTree.GatherBuildings(Owner); var buildings = TechTree.GatherBuildings(Owner);
return effectivePrereq.All(a => buildings[a].Any(b => !b.TraitsImplementing<IDisable>().All(d => d.Disabled)));
return effectivePrereq.All(a => buildings[a].Any(b => !b.Trait<Building>().Disabled));
} }
public void FinishActivate() public void FinishActivate()

View File

@@ -11,6 +11,7 @@
using System; using System;
using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Activities;
using OpenRA.Traits; using OpenRA.Traits;
using System.Linq;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
{ {
@@ -45,7 +46,7 @@ namespace OpenRA.Mods.RA
protected override void QueueAttack( Actor self, Order order ) protected override void QueueAttack( Actor self, Order order )
{ {
if (self.HasTrait<Building>() && self.Trait<Building>().Disabled) if (self.TraitsImplementing<IDisable>().Any(d => d.Disabled))
return; return;
const int RangeTolerance = 1; /* how far inside our maximum range we should try to sit */ const int RangeTolerance = 1; /* how far inside our maximum range we should try to sit */

View File

@@ -17,15 +17,17 @@ namespace OpenRA.Mods.RA
public object Create(ActorInitializer init) { return new CanPowerDown(init); } public object Create(ActorInitializer init) { return new CanPowerDown(init); }
} }
public class CanPowerDown : IResolveOrder public class CanPowerDown : IResolveOrder, IDisable
{ {
[Sync] [Sync]
bool disabled = false; bool disabled = false;
int normalPower = 0;
readonly PowerManager PlayerPower; readonly PowerManager PlayerPower;
public CanPowerDown(ActorInitializer init) public CanPowerDown(ActorInitializer init)
{ {
PlayerPower = init.self.Owner.PlayerActor.Trait<PowerManager>(); PlayerPower = init.self.Owner.PlayerActor.Trait<PowerManager>();
normalPower = init.self.Info.Traits.Get<BuildingInfo>().Power;
} }
public bool Disabled { get { return disabled; } } public bool Disabled { get { return disabled; } }
@@ -37,10 +39,7 @@ namespace OpenRA.Mods.RA
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.UpdateActor(self, disabled ? 0 : normalPower);
PlayerPower.Disable(self, "PowerDown");
else
PlayerPower.RemoveDisable(self, "PowerDown");
} }
} }
} }

View File

@@ -36,7 +36,14 @@ namespace OpenRA.Mods.RA.Render
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{ {
return r.Select(a => a.WithPos(a.Pos - Origin)); var disabled = self.TraitsImplementing<IDisable>().Any(d => d.Disabled);
foreach (var a in r)
{
var ret = a.WithPos(a.Pos - Origin);
yield return ret;
if (disabled)
yield return ret.WithPalette("disabled").WithZOffset(-1);
}
} }
public RenderBuilding( ActorInitializer init, Func<int> baseFacing ) public RenderBuilding( ActorInitializer init, Func<int> baseFacing )

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA
public bool Disabled public bool Disabled
{ {
get { return power.IsPowered(self); } get { return power.PowerProvided < power.PowerDrained; }
} }
} }
} }