Convert SelfHealing to upgrades.

This commit is contained in:
Paul Chote
2014-09-26 22:20:41 +12:00
parent 56332251f5
commit 372d03c320
8 changed files with 59 additions and 44 deletions

View File

@@ -563,6 +563,18 @@ namespace OpenRA.Mods.Common.UtilityCommands
} }
} }
if (engineVersion < 20140927)
{
if (depth == 0)
node.Value.Nodes.RemoveAll(n => n.Key == "SelfHealingTech");
if (depth == 2 && node.Key == "RequiresTech" && parentKey.StartsWith("SelfHealing"))
{
node.Key = "RequiresUpgrade";
node.Value.Value = "selfhealing-needs-reconfiguration";
}
}
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
} }
} }

View File

@@ -21,31 +21,49 @@ namespace OpenRA.Mods.RA
public readonly float HealIfBelow = .5f; public readonly float HealIfBelow = .5f;
public readonly int DamageCooldown = 0; public readonly int DamageCooldown = 0;
[Desc("The Type defined by SelfHealingTech required to enable this.")] [Desc("Enable only if this upgrade is enabled.")]
public readonly string RequiresTech = null; public readonly string RequiresUpgrade = null;
public virtual object Create(ActorInitializer init) { return new SelfHealing(this); } public virtual object Create(ActorInitializer init) { return new SelfHealing(init.self, this); }
} }
class SelfHealing : ITick, ISync, INotifyDamage class SelfHealing : ITick, ISync, INotifyDamage, IUpgradable
{ {
readonly SelfHealingInfo info;
readonly Health health;
[Sync] int ticks; [Sync] int ticks;
[Sync] int damageTicks; [Sync] int damageTicks;
SelfHealingInfo Info; [Sync] bool disabled;
public SelfHealing(SelfHealingInfo info) { Info = info; }
public SelfHealing(Actor self, SelfHealingInfo info)
{
this.info = info;
health = self.Trait<Health>();
// Disable if an upgrade is required
disabled = info.RequiresUpgrade != null;
}
public bool AcceptsUpgrade(string type)
{
return type == info.RequiresUpgrade;
}
public void UpgradeAvailable(Actor self, string type, bool available)
{
if (type == info.RequiresUpgrade)
disabled = !available;
}
public void Tick(Actor self) public void Tick(Actor self)
{ {
if (self.IsDead()) if (self.IsDead() || disabled)
return; return;
if (Info.RequiresTech != null && !self.World.ActorsWithTrait<SelfHealingTech>() if (health.HP >= info.HealIfBelow * health.MaxHP)
.Any(a => !a.Actor.IsDead() && a.Actor.Owner.IsAlliedWith(self.Owner) && Info.RequiresTech == a.Trait.Type))
return;
var health = self.Trait<Health>();
if (health.HP >= Info.HealIfBelow*health.MaxHP)
return; return;
if (damageTicks > 0) if (damageTicks > 0)
@@ -56,35 +74,15 @@ namespace OpenRA.Mods.RA
if (--ticks <= 0) if (--ticks <= 0)
{ {
ticks = Info.Ticks; ticks = info.Ticks;
self.InflictDamage(self, -Info.Step, null); self.InflictDamage(self, -info.Step, null);
} }
} }
public void Damaged(Actor self, AttackInfo e) public void Damaged(Actor self, AttackInfo e)
{ {
if (e.Damage > 0) if (e.Damage > 0)
damageTicks = Info.DamageCooldown; damageTicks = info.DamageCooldown;
}
}
[Desc("Attach this to an actor required as prerequisite for all owned units to regenerate health.")]
class SelfHealingTechInfo : ITraitInfo
{
public readonly string Type = null;
public object Create(ActorInitializer init) { return new SelfHealingTech(this); }
}
class SelfHealingTech
{
public string Type { get { return info.Type; } }
readonly SelfHealingTechInfo info;
public SelfHealingTech(SelfHealingTechInfo info)
{
this.info = info;
} }
} }
} }

View File

@@ -177,7 +177,10 @@
Ticks: 100 Ticks: 100
HealIfBelow: 1 HealIfBelow: 1
DamageCooldown: 125 DamageCooldown: 125
RequiresTech: InfantryHealing RequiresUpgrade: hospitalheal
GlobalUpgradable:
Upgrades: hospitalheal
Prerequisites: hosp
UpdatesPlayerStatistics: UpdatesPlayerStatistics:
Huntable: Huntable:
LuaScriptEvents: LuaScriptEvents:

View File

@@ -31,3 +31,5 @@ Player:
ProvidesTechPrerequisite@all: ProvidesTechPrerequisite@all:
Name: Unrestricted Name: Unrestricted
Prerequisites: techlevel.low, techlevel.medium, techlevel.high, techlevel.superweapons Prerequisites: techlevel.low, techlevel.medium, techlevel.high, techlevel.superweapons
GlobalUpgradeManager:

View File

@@ -27,8 +27,6 @@ HOSP:
Dimensions: 2,2 Dimensions: 2,2
Health: Health:
HP: 1000 HP: 1000
SelfHealingTech:
Type: InfantryHealing
Tooltip: Tooltip:
Name: Hospital Name: Hospital
LeavesHusk: LeavesHusk:

View File

@@ -83,8 +83,6 @@ HOSP:
ExternalCapturable: ExternalCapturable:
ExternalCapturableBar: ExternalCapturableBar:
EngineerRepairable: EngineerRepairable:
SelfHealingTech:
Type: InfantryHealing
Tooltip: Tooltip:
Name: Hospital Name: Hospital
RevealsShroud: RevealsShroud:

View File

@@ -166,7 +166,10 @@
Ticks: 100 Ticks: 100
HealIfBelow: 1 HealIfBelow: 1
DamageCooldown: 125 DamageCooldown: 125
RequiresTech: InfantryHealing RequiresUpgrade: hospitalheal
GlobalUpgradable:
Upgrades: hospitalheal
Prerequisites: hosp
Huntable: Huntable:
LuaScriptEvents: LuaScriptEvents:
ScriptTriggers: ScriptTriggers:

View File

@@ -72,3 +72,4 @@ Player:
ProvidesTechPrerequisite@unrestricted: ProvidesTechPrerequisite@unrestricted:
Name: Unrestricted Name: Unrestricted
Prerequisites: techlevel.infonly, techlevel.low, techlevel.medium, techlevel.unrestricted Prerequisites: techlevel.infonly, techlevel.low, techlevel.medium, techlevel.unrestricted
GlobalUpgradeManager: