Added multiplier modifier traits, removing GainsStatUpgrades, InvulnerabilityUpgrade, & Invulnerable.
This commit is contained in:
@@ -344,7 +344,6 @@
|
||||
<Compile Include="Traits\Infantry\ScaredyCat.cs" />
|
||||
<Compile Include="Traits\Infantry\TakeCover.cs" />
|
||||
<Compile Include="Traits\Infantry\TerrainModifiesDamage.cs" />
|
||||
<Compile Include="Traits\Invulnerable.cs" />
|
||||
<Compile Include="Traits\JamsMissiles.cs" />
|
||||
<Compile Include="Traits\KillsSelf.cs" />
|
||||
<Compile Include="Traits\AmmoPool.cs" />
|
||||
@@ -357,6 +356,13 @@
|
||||
<Compile Include="Traits\Parachutable.cs" />
|
||||
<Compile Include="Traits\ParaDrop.cs" />
|
||||
<Compile Include="Traits\Passenger.cs" />
|
||||
<Compile Include="Traits\Multipliers\UpgradableMultiplierTrait.cs" />
|
||||
<Compile Include="Traits\Multipliers\DamageMultiplier.cs" />
|
||||
<Compile Include="Traits\Multipliers\FirepowerMultiplier.cs" />
|
||||
<Compile Include="Traits\Multipliers\InaccuracyMultiplier.cs" />
|
||||
<Compile Include="Traits\Multipliers\ReloadDelayMultiplier.cs" />
|
||||
<Compile Include="Traits\Multipliers\SpeedMultiplier.cs" />
|
||||
<Compile Include="Traits\Multipliers\PowerMultiplier.cs" />
|
||||
<Compile Include="Traits\PaletteEffects\CloakPaletteEffect.cs" />
|
||||
<Compile Include="Traits\PaletteEffects\GlobalLightingPaletteEffect.cs" />
|
||||
<Compile Include="Traits\PaletteEffects\FlashPaletteEffect.cs" />
|
||||
@@ -477,7 +483,6 @@
|
||||
<Compile Include="Traits\ProduceableWithLevel.cs" />
|
||||
<Compile Include="Traits\Upgrades\DeployToUpgrade.cs" />
|
||||
<Compile Include="Traits\Upgrades\DisableUpgrade.cs" />
|
||||
<Compile Include="Traits\Upgrades\GainsStatUpgrades.cs" />
|
||||
<Compile Include="Traits\Upgrades\UpgradableTrait.cs" />
|
||||
<Compile Include="Traits\Upgrades\UpgradeActorsNear.cs" />
|
||||
<Compile Include="Traits\Upgrades\UpgradeManager.cs" />
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("This unit cannot be damaged.")]
|
||||
class InvulnerableInfo : TraitInfo<Invulnerable> { }
|
||||
|
||||
class Invulnerable : IDamageModifier
|
||||
{
|
||||
public int GetDamageModifier(Actor attacker, IWarhead warhead) { return 0; }
|
||||
}
|
||||
}
|
||||
31
OpenRA.Mods.Common/Traits/Multipliers/DamageMultiplier.cs
Normal file
31
OpenRA.Mods.Common/Traits/Multipliers/DamageMultiplier.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.GameRules;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("Damage taken by this actor is multiplied based on upgrade level.",
|
||||
"Decrease to increase actor's apparent strength.",
|
||||
"Use 0 to make actor invulnerable.")]
|
||||
public class DamageMultiplierInfo : UpgradeMultiplierTraitInfo, ITraitInfo
|
||||
{
|
||||
public object Create(ActorInitializer init) { return new DamageMultiplier(this, init.Self.Info.Name); }
|
||||
}
|
||||
|
||||
public class DamageMultiplier : UpgradeMultiplierTrait, IDamageModifier
|
||||
{
|
||||
public DamageMultiplier(DamageMultiplierInfo info, string actorType)
|
||||
: base(info, "DamageMultiplier", actorType) { }
|
||||
|
||||
public int GetDamageModifier(Actor attacker, IWarhead warhead) { return GetModifier(); }
|
||||
}
|
||||
}
|
||||
28
OpenRA.Mods.Common/Traits/Multipliers/FirepowerMultiplier.cs
Normal file
28
OpenRA.Mods.Common/Traits/Multipliers/FirepowerMultiplier.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("The firepower of this actor is multiplied based on upgrade level if specified.")]
|
||||
public class FirepowerMultiplierInfo : UpgradeMultiplierTraitInfo, ITraitInfo
|
||||
{
|
||||
public object Create(ActorInitializer init) { return new FirepowerMultiplier(this, init.Self.Info.Name); }
|
||||
}
|
||||
|
||||
public class FirepowerMultiplier : UpgradeMultiplierTrait, IFirepowerModifier
|
||||
{
|
||||
public FirepowerMultiplier(FirepowerMultiplierInfo info, string actorType)
|
||||
: base(info, "FirepowerMultiplier", actorType) { }
|
||||
|
||||
public int GetFirepowerModifier() { return GetModifier(); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("The inaccuracy of this actor is multipled based on upgrade level if specified.")]
|
||||
public class InaccuracyMultiplierInfo : UpgradeMultiplierTraitInfo, ITraitInfo
|
||||
{
|
||||
public object Create(ActorInitializer init) { return new InaccuracyMultiplier(this, init.Self.Info.Name); }
|
||||
}
|
||||
|
||||
public class InaccuracyMultiplier : UpgradeMultiplierTrait, IInaccuracyModifier
|
||||
{
|
||||
public InaccuracyMultiplier(InaccuracyMultiplierInfo info, string actorType)
|
||||
: base(info, "InaccuracyMultiplier", actorType) { }
|
||||
|
||||
public int GetInaccuracyModifier() { return GetModifier(); }
|
||||
}
|
||||
}
|
||||
36
OpenRA.Mods.Common/Traits/Multipliers/PowerMultiplier.cs
Normal file
36
OpenRA.Mods.Common/Traits/Multipliers/PowerMultiplier.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.Mods.Common.Traits;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common
|
||||
{
|
||||
[Desc("The power usage/output of this actor is multiplied based on upgrade level if specified.")]
|
||||
public class PowerMultiplierInfo : UpgradeMultiplierTraitInfo, ITraitInfo
|
||||
{
|
||||
public object Create(ActorInitializer init) { return new PowerMultiplier(init.Self, this); }
|
||||
}
|
||||
|
||||
public class PowerMultiplier : UpgradeMultiplierTrait, IPowerModifier, INotifyOwnerChanged
|
||||
{
|
||||
PowerManager power;
|
||||
|
||||
public PowerMultiplier(Actor self, PowerMultiplierInfo info)
|
||||
: base(info, "PowerMultiplier", self.Info.Name) { power = self.Owner.PlayerActor.Trait<PowerManager>(); }
|
||||
|
||||
public int GetPowerModifier() { return GetModifier(); }
|
||||
protected override void Update(Actor self) { power.UpdateActor(self); }
|
||||
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
|
||||
{
|
||||
power = newOwner.PlayerActor.Trait<PowerManager>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("The reloading time of this actor is multiplied based on upgrade level if specified.")]
|
||||
public class ReloadDelayMultiplierInfo : UpgradeMultiplierTraitInfo, ITraitInfo
|
||||
{
|
||||
public object Create(ActorInitializer init) { return new ReloadDelayMultiplier(this, init.Self.Info.Name); }
|
||||
}
|
||||
|
||||
public class ReloadDelayMultiplier : UpgradeMultiplierTrait, IReloadModifier
|
||||
{
|
||||
public ReloadDelayMultiplier(ReloadDelayMultiplierInfo info, string actorType)
|
||||
: base(info, "ReloadDelayMultiplier", actorType) { }
|
||||
|
||||
public int GetReloadModifier() { return GetModifier(); }
|
||||
}
|
||||
}
|
||||
28
OpenRA.Mods.Common/Traits/Multipliers/SpeedMultiplier.cs
Normal file
28
OpenRA.Mods.Common/Traits/Multipliers/SpeedMultiplier.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("The speed of this actor is multiplied based on upgrade level if specified.")]
|
||||
public class SpeedMultiplierInfo : UpgradeMultiplierTraitInfo, ITraitInfo
|
||||
{
|
||||
public object Create(ActorInitializer init) { return new SpeedMultiplier(this, init.Self.Info.Name); }
|
||||
}
|
||||
|
||||
public class SpeedMultiplier : UpgradeMultiplierTrait, ISpeedModifier
|
||||
{
|
||||
public SpeedMultiplier(SpeedMultiplierInfo info, string actorType)
|
||||
: base(info, "SpeedMultiplier", actorType) { }
|
||||
|
||||
public int GetSpeedModifier() { return GetModifier(); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
public abstract class UpgradeMultiplierTraitInfo
|
||||
{
|
||||
[UpgradeUsedReference]
|
||||
[Desc("Accepted upgrade types.")]
|
||||
public readonly string[] UpgradeTypes = { };
|
||||
|
||||
[Desc("The lowest upgrade level using the scale.")]
|
||||
public readonly int BaseLevel = 1;
|
||||
|
||||
[FieldLoader.Require]
|
||||
[Desc("Percentages to apply with the first being applied at the base level.",
|
||||
"Repeat last entry to accept time extensions.",
|
||||
"If no upgrade types are specified, then the first/only modifier is always applied.")]
|
||||
public readonly int[] Modifier = { };
|
||||
}
|
||||
|
||||
public abstract class UpgradeMultiplierTrait : IUpgradable, IDisabledTrait, ISync
|
||||
{
|
||||
readonly UpgradeMultiplierTraitInfo info;
|
||||
[Sync] int level = 0;
|
||||
[Sync] public bool IsTraitDisabled { get; private set; }
|
||||
public int AdjustedLevel { get { return level - info.BaseLevel; } }
|
||||
public IEnumerable<string> UpgradeTypes { get { return info.UpgradeTypes; } }
|
||||
|
||||
protected UpgradeMultiplierTrait(UpgradeMultiplierTraitInfo info, string modifierType, string actorType)
|
||||
{
|
||||
if (info.Modifier.Length == 0)
|
||||
throw new Exception("No modifiers in " + modifierType + " for " + actorType);
|
||||
this.info = info;
|
||||
IsTraitDisabled = info.UpgradeTypes.Length > 0 && info.BaseLevel > 0;
|
||||
}
|
||||
|
||||
public bool AcceptsUpgradeLevel(Actor self, string type, int level)
|
||||
{
|
||||
return level < info.Modifier.Length + info.BaseLevel;
|
||||
}
|
||||
|
||||
// Override to recieve notice of level change.
|
||||
protected virtual void Update(Actor self) { }
|
||||
|
||||
public void UpgradeLevelChanged(Actor self, string type, int oldLevel, int newLevel)
|
||||
{
|
||||
if (!UpgradeTypes.Contains(type))
|
||||
return;
|
||||
level = newLevel.Clamp(0, Math.Max(info.Modifier.Length + info.BaseLevel - 1, 0));
|
||||
IsTraitDisabled = level < info.BaseLevel;
|
||||
Update(self);
|
||||
}
|
||||
|
||||
public int GetModifier()
|
||||
{
|
||||
return IsTraitDisabled ? 100 : info.Modifier[level - info.BaseLevel];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.GameRules;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("This actor has properties that upgrade when a specific criteria is met.")]
|
||||
public class GainsStatUpgradesInfo : ITraitInfo
|
||||
{
|
||||
public readonly string FirepowerUpgrade = "firepower";
|
||||
public readonly int[] FirepowerModifier = { 110, 115, 120, 130 };
|
||||
|
||||
public readonly string DamageUpgrade = "damage";
|
||||
public readonly int[] DamageModifier = { 91, 87, 83, 65 };
|
||||
|
||||
public readonly string SpeedUpgrade = "speed";
|
||||
public readonly int[] SpeedModifier = { 110, 115, 120, 150 };
|
||||
|
||||
public readonly string ReloadUpgrade = "reload";
|
||||
public readonly int[] ReloadModifier = { 95, 90, 85, 75 };
|
||||
|
||||
public readonly string InaccuracyUpgrade = "inaccuracy";
|
||||
public readonly int[] InaccuracyModifier = { 90, 80, 70, 50 };
|
||||
|
||||
public object Create(ActorInitializer init) { return new GainsStatUpgrades(this); }
|
||||
}
|
||||
|
||||
public class GainsStatUpgrades : IUpgradable, IFirepowerModifier, IDamageModifier, ISpeedModifier, IReloadModifier, IInaccuracyModifier, IDisabledTrait
|
||||
{
|
||||
readonly GainsStatUpgradesInfo info;
|
||||
[Sync] int firepowerLevel = 0;
|
||||
[Sync] int speedLevel = 0;
|
||||
[Sync] int damageLevel = 0;
|
||||
[Sync] int reloadLevel = 0;
|
||||
[Sync] int inaccuracyLevel = 0;
|
||||
public bool IsTraitDisabled { get { return firepowerLevel == 0 && speedLevel == 0 && damageLevel == 0 && reloadLevel == 0 && inaccuracyLevel == 0; } }
|
||||
public IEnumerable<string> UpgradeTypes
|
||||
{
|
||||
get
|
||||
{
|
||||
yield return info.FirepowerUpgrade;
|
||||
yield return info.DamageUpgrade;
|
||||
yield return info.SpeedUpgrade;
|
||||
yield return info.ReloadUpgrade;
|
||||
yield return info.InaccuracyUpgrade;
|
||||
}
|
||||
}
|
||||
|
||||
public GainsStatUpgrades(GainsStatUpgradesInfo info)
|
||||
{
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
public bool AcceptsUpgradeLevel(Actor self, string type, int level)
|
||||
{
|
||||
if (level < 0)
|
||||
return false;
|
||||
|
||||
if (type == info.FirepowerUpgrade)
|
||||
return level <= info.FirepowerModifier.Length;
|
||||
|
||||
if (type == info.DamageUpgrade)
|
||||
return level <= info.DamageModifier.Length;
|
||||
|
||||
if (type == info.SpeedUpgrade)
|
||||
return level <= info.SpeedModifier.Length;
|
||||
|
||||
if (type == info.ReloadUpgrade)
|
||||
return level <= info.ReloadModifier.Length;
|
||||
|
||||
if (type == info.InaccuracyUpgrade)
|
||||
return level <= info.InaccuracyModifier.Length;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void UpgradeLevelChanged(Actor self, string type, int oldLevel, int newLevel)
|
||||
{
|
||||
if (type == info.FirepowerUpgrade)
|
||||
firepowerLevel = newLevel.Clamp(0, info.FirepowerModifier.Length);
|
||||
else if (type == info.DamageUpgrade)
|
||||
damageLevel = newLevel.Clamp(0, info.DamageModifier.Length);
|
||||
else if (type == info.SpeedUpgrade)
|
||||
speedLevel = newLevel.Clamp(0, info.SpeedModifier.Length);
|
||||
else if (type == info.ReloadUpgrade)
|
||||
reloadLevel = newLevel.Clamp(0, info.ReloadModifier.Length);
|
||||
else if (type == info.InaccuracyUpgrade)
|
||||
inaccuracyLevel = newLevel.Clamp(0, info.InaccuracyModifier.Length);
|
||||
}
|
||||
|
||||
public int GetDamageModifier(Actor attacker, IWarhead warhead)
|
||||
{
|
||||
return damageLevel > 0 ? info.DamageModifier[damageLevel - 1] : 100;
|
||||
}
|
||||
|
||||
public int GetFirepowerModifier()
|
||||
{
|
||||
return firepowerLevel > 0 ? info.FirepowerModifier[firepowerLevel - 1] : 100;
|
||||
}
|
||||
|
||||
public int GetSpeedModifier()
|
||||
{
|
||||
return speedLevel > 0 ? info.SpeedModifier[speedLevel - 1] : 100;
|
||||
}
|
||||
|
||||
public int GetReloadModifier()
|
||||
{
|
||||
return reloadLevel > 0 ? info.ReloadModifier[reloadLevel - 1] : 100;
|
||||
}
|
||||
|
||||
public int GetInaccuracyModifier()
|
||||
{
|
||||
return inaccuracyLevel > 0 ? info.InaccuracyModifier[inaccuracyLevel - 1] : 100;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1380,6 +1380,131 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
})));
|
||||
}
|
||||
|
||||
if (engineVersion < 20150711)
|
||||
{
|
||||
if (depth == 0)
|
||||
{
|
||||
var emptyYaml = new MiniYaml(null);
|
||||
|
||||
// Replace -GainsStatUpgrades
|
||||
var trait = node.Value.Nodes.FirstOrDefault(n => n.Key == "-GainsStatUpgrades");
|
||||
if (trait != null)
|
||||
{
|
||||
node.Value.Nodes.Add(new MiniYamlNode("-FirepowerMultiplier@EXPERIENCE", emptyYaml));
|
||||
node.Value.Nodes.Add(new MiniYamlNode("-DamageMultiplier@EXPERIENCE", emptyYaml));
|
||||
node.Value.Nodes.Add(new MiniYamlNode("-SpeedMultiplier@EXPERIENCE", emptyYaml));
|
||||
node.Value.Nodes.Add(new MiniYamlNode("-ReloadDelayMultiplier@EXPERIENCE", emptyYaml));
|
||||
node.Value.Nodes.Add(new MiniYamlNode("-InaccuracyMultiplier@EXPERIENCE", emptyYaml));
|
||||
node.Value.Nodes.Remove(trait);
|
||||
}
|
||||
|
||||
// Replace GainsStatUpgrades
|
||||
trait = node.Value.Nodes.FirstOrDefault(n => n.Key == "GainsStatUpgrades");
|
||||
if (trait != null)
|
||||
{
|
||||
// Common code for making each trait
|
||||
Action<string, string, string> addTrait = (type, newType, values) =>
|
||||
{
|
||||
var upgradeTypes = trait.Value.Nodes.FirstOrDefault(n => n.Key == type + "Upgrade");
|
||||
var modifier = trait.Value.Nodes.FirstOrDefault(n => n.Key == type + "Modifier");
|
||||
|
||||
if (upgradeTypes == null || !string.IsNullOrEmpty(upgradeTypes.Value.Value) || modifier == null || !string.IsNullOrEmpty(modifier.Value.Value))
|
||||
{
|
||||
var yaml = new MiniYaml(null);
|
||||
if (modifier == null)
|
||||
modifier = new MiniYamlNode("Modifier", new MiniYaml(values));
|
||||
else
|
||||
modifier.Key = "Modifier";
|
||||
yaml.Nodes.Add(modifier);
|
||||
|
||||
if (upgradeTypes == null)
|
||||
upgradeTypes = new MiniYamlNode("UpgradeTypes", new MiniYaml(type.ToLowerInvariant()));
|
||||
else
|
||||
upgradeTypes.Key = "UpgradeTypes";
|
||||
yaml.Nodes.Add(upgradeTypes);
|
||||
|
||||
node.Value.Nodes.Add(new MiniYamlNode((newType ?? type) + "Multiplier@EXPERIENCE", yaml));
|
||||
}
|
||||
};
|
||||
|
||||
// Execute common code for each trait
|
||||
addTrait("Firepower", null, "110, 115, 120, 130");
|
||||
addTrait("Damage", null, "91, 87, 83, 65");
|
||||
addTrait("Speed", null, "110, 115, 120, 150");
|
||||
addTrait("Reload", "ReloadTime", "95, 90, 85, 75");
|
||||
addTrait("Inaccuracy", null, "90, 80, 70, 50");
|
||||
|
||||
// Remove GainsStatUpgrades
|
||||
node.Value.Nodes.Remove(trait);
|
||||
}
|
||||
|
||||
// Replace -InvulnerabilityUpgrade
|
||||
trait = node.Value.Nodes.FirstOrDefault(n => n.Key == "-InvulnerabilityUpgrade");
|
||||
if (trait != null)
|
||||
trait.Key = "-DamageMultiplier@INVULNERABILITY_UPGRADE";
|
||||
|
||||
// Replace InvulnerabilityUpgrade with DamageMultiplier@INVULNERABILITY_UPGRADE
|
||||
trait = node.Value.Nodes.FirstOrDefault(n => n.Key == "InvulnerabilityUpgrade");
|
||||
if (trait != null)
|
||||
{
|
||||
trait.Key = "DamageMultiplier@INVULNERABILITY_UPGRADE";
|
||||
trait.Value.Nodes.Add(new MiniYamlNode("Modifier", "0, 0"));
|
||||
|
||||
// Use UpgradeMinEnabledLevel as BaseLevel; otherwise, 1
|
||||
var min = trait.Value.Nodes.FirstOrDefault(n => n.Key == "UpgradeMinEnabledLevel");
|
||||
if (min != null)
|
||||
{
|
||||
if (min.Value.Value != "1")
|
||||
min.Key = "BaseLevel";
|
||||
else
|
||||
trait.Value.Nodes.Remove(min);
|
||||
}
|
||||
|
||||
// Remove since level cap is based of Modifier.Length + BaseLevel
|
||||
trait.Value.Nodes.RemoveAll(n => n.Key == "UpgradeMaxAcceptedLevel");
|
||||
trait.Value.Nodes.RemoveAll(n => n.Key == "UpgradeMaxEnabledLevel");
|
||||
}
|
||||
|
||||
// Replace -InvulnerabilityUpgrade@* with -DamageMultiplier@*
|
||||
foreach (var n in node.Value.Nodes.Where(n => n.Key.StartsWith("-InvulnerabilityUpgrade@")))
|
||||
n.Key = "-DamageMultiplier@" + n.Key.Substring("-InvulnerabilityUpgrade@".Length);
|
||||
|
||||
// Replace InvulnerabilityUpgrade@* with DamageMultiplier@*
|
||||
foreach (var t in node.Value.Nodes.Where(n => n.Key.StartsWith("InvulnerabilityUpgrade@")))
|
||||
{
|
||||
t.Key = "DamageMultiplier@" + t.Key.Substring("InvulnerabilityUpgrade@".Length);
|
||||
t.Value.Nodes.Add(new MiniYamlNode("Modifier", "0, 0"));
|
||||
|
||||
// Use UpgradeMinEnabledLevel as BaseLevel; otherwise, 1
|
||||
var min = t.Value.Nodes.FirstOrDefault(n => n.Key == "UpgradeMinEnabledLevel");
|
||||
if (min != null)
|
||||
{
|
||||
if (min.Value.Value != "1")
|
||||
min.Key = "BaseLevel";
|
||||
else
|
||||
t.Value.Nodes.Remove(min);
|
||||
}
|
||||
|
||||
// Remove since level cap is based of Modifier.Length + BaseLevel
|
||||
t.Value.Nodes.RemoveAll(n => n.Key == "UpgradeMaxAcceptedLevel");
|
||||
t.Value.Nodes.RemoveAll(n => n.Key == "UpgradeMaxEnabledLevel");
|
||||
}
|
||||
|
||||
// Replace -Invulnerable with -DamageMultiplier@INVULNERABLE
|
||||
trait = node.Value.Nodes.FirstOrDefault(n => n.Key == "-Invulnerable");
|
||||
if (trait != null)
|
||||
trait.Key = "-DamageMultiplier@INVULNERABLE";
|
||||
|
||||
// Invulnerable with DamageMultiplier@INVULNERABLE
|
||||
trait = node.Value.Nodes.FirstOrDefault(n => n.Key == "Invulnerable");
|
||||
if (trait != null)
|
||||
{
|
||||
trait.Key = "DamageMultiplier@INVULNERABLE";
|
||||
trait.Value.Nodes.Add(new MiniYamlNode("Modifier", "0"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +98,6 @@
|
||||
<Compile Include="Traits\Infiltration\InfiltrateForPowerOutage.cs" />
|
||||
<Compile Include="Traits\Infiltration\InfiltrateForSupportPower.cs" />
|
||||
<Compile Include="Traits\Infiltration\Infiltrates.cs" />
|
||||
<Compile Include="Traits\InvulnerabilityUpgrade.cs" />
|
||||
<Compile Include="Traits\MadTank.cs" />
|
||||
<Compile Include="Traits\Mine.cs" />
|
||||
<Compile Include="Traits\Minelayer.cs" />
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.Mods.Common.Traits;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
public class InvulnerabilityUpgradeInfo : UpgradableTraitInfo
|
||||
{
|
||||
public override object Create(ActorInitializer init) { return new InvulnerabilityUpgrade(this); }
|
||||
}
|
||||
|
||||
public class InvulnerabilityUpgrade : UpgradableTrait<InvulnerabilityUpgradeInfo>, IDamageModifier
|
||||
{
|
||||
public InvulnerabilityUpgrade(InvulnerabilityUpgradeInfo info)
|
||||
: base(info) { }
|
||||
|
||||
public int GetDamageModifier(Actor attacker, IWarhead warhead)
|
||||
{
|
||||
return IsTraitDisabled ? 100 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -831,7 +831,8 @@ Rules:
|
||||
Health:
|
||||
HP: 125
|
||||
^Bridge:
|
||||
Invulnerable:
|
||||
DamageMultiplier@INVULNERABLE:
|
||||
Modifier: 0
|
||||
|
||||
Sequences:
|
||||
|
||||
|
||||
@@ -295,7 +295,8 @@ Rules:
|
||||
Tooltip:
|
||||
Name: Nikoomba
|
||||
^Bridge:
|
||||
Invulnerable:
|
||||
DamageMultiplier@INVULNERABLE:
|
||||
Modifier: 0
|
||||
^CivBuilding:
|
||||
MustBeDestroyed:
|
||||
^CivInfantry:
|
||||
|
||||
@@ -530,7 +530,8 @@ Rules:
|
||||
GenericVisibility: Enemy
|
||||
ShowOwnerRow: false
|
||||
^Bridge:
|
||||
Invulnerable:
|
||||
DamageMultiplier@INVULNERABLE:
|
||||
Modifier: 0
|
||||
E2:
|
||||
Buildable:
|
||||
Prerequisites: ~pyle
|
||||
|
||||
@@ -162,7 +162,8 @@ C17:
|
||||
Cargo:
|
||||
MaxWeight: 10
|
||||
PipCount: 10
|
||||
Invulnerable:
|
||||
DamageMultiplier@INVULNERABLE:
|
||||
Modifier: 0
|
||||
Contrail@1:
|
||||
Offset: -261,-650,0
|
||||
TrailLength: 15
|
||||
|
||||
@@ -15,7 +15,21 @@
|
||||
400: firepower, damage, speed, reload, inaccuracy, rank
|
||||
800: firepower, damage, speed, reload, inaccuracy, rank
|
||||
1600: firepower, damage, speed, reload, inaccuracy, rank, eliteweapon, selfheal
|
||||
GainsStatUpgrades:
|
||||
FirepowerMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: firepower
|
||||
Modifier: 110, 115, 120, 130
|
||||
DamageMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: damage
|
||||
Modifier: 91, 87, 83, 65
|
||||
SpeedMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: speed
|
||||
Modifier: 110, 115, 120, 150
|
||||
ReloadDelayMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: reload
|
||||
Modifier: 95, 90, 85, 75
|
||||
InaccuracyMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: inaccuracy
|
||||
Modifier: 90, 80, 70, 50
|
||||
SelfHealing@ELITE:
|
||||
Step: 2
|
||||
Ticks: 100
|
||||
|
||||
@@ -85,7 +85,8 @@ frigate:
|
||||
Cargo:
|
||||
MaxWeight: 20
|
||||
PipCount: 10
|
||||
Invulnerable:
|
||||
DamageMultiplier@INVULNERABLE:
|
||||
Modifier: 0
|
||||
FlyAwayOnIdle:
|
||||
RejectsOrders:
|
||||
|
||||
|
||||
@@ -15,7 +15,21 @@
|
||||
400: firepower, damage, speed, reload, inaccuracy, rank
|
||||
800: firepower, damage, speed, reload, inaccuracy, rank
|
||||
1600: firepower, damage, speed, reload, inaccuracy, rank, eliteweapon, selfheal
|
||||
GainsStatUpgrades:
|
||||
FirepowerMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: firepower
|
||||
Modifier: 110, 115, 120, 130
|
||||
DamageMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: damage
|
||||
Modifier: 91, 87, 83, 65
|
||||
SpeedMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: speed
|
||||
Modifier: 110, 115, 120, 150
|
||||
ReloadDelayMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: reload
|
||||
Modifier: 95, 90, 85, 75
|
||||
InaccuracyMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: inaccuracy
|
||||
Modifier: 90, 80, 70, 50
|
||||
SelfHealing@ELITE:
|
||||
Step: 2
|
||||
Ticks: 100
|
||||
|
||||
@@ -1267,17 +1267,17 @@ Rules:
|
||||
Percentage: 0
|
||||
GainsExperience:
|
||||
Upgrades:
|
||||
InvulnerabilityUpgrade@UNKILLABLE:
|
||||
DamageMultiplier@UNKILLABLE:
|
||||
UpgradeTypes: unkillable
|
||||
UpgradeMinEnabledLevel: 1
|
||||
Modifier: 0, 0
|
||||
^Tank:
|
||||
GivesBounty:
|
||||
Percentage: 0
|
||||
GainsExperience:
|
||||
Upgrades:
|
||||
InvulnerabilityUpgrade@UNKILLABLE:
|
||||
DamageMultiplier@UNKILLABLE:
|
||||
UpgradeTypes: unkillable
|
||||
UpgradeMinEnabledLevel: 1
|
||||
Modifier: 0, 0
|
||||
^Infantry:
|
||||
GivesBounty:
|
||||
Percentage: 0
|
||||
@@ -1289,29 +1289,29 @@ Rules:
|
||||
VolumeMultiplier: 0.1
|
||||
DeathSounds@ZAPPED:
|
||||
VolumeMultiplier: 0.1
|
||||
InvulnerabilityUpgrade@UNKILLABLE:
|
||||
DamageMultiplier@UNKILLABLE:
|
||||
UpgradeTypes: unkillable
|
||||
UpgradeMinEnabledLevel: 1
|
||||
Modifier: 0, 0
|
||||
^Ship:
|
||||
GivesBounty:
|
||||
Percentage: 0
|
||||
GainsExperience:
|
||||
Upgrades:
|
||||
InvulnerabilityUpgrade@UNKILLABLE:
|
||||
DamageMultiplier@UNKILLABLE:
|
||||
UpgradeTypes: unkillable
|
||||
UpgradeMinEnabledLevel: 1
|
||||
Modifier: 0, 0
|
||||
^Plane:
|
||||
GivesBounty:
|
||||
Percentage: 0
|
||||
InvulnerabilityUpgrade@UNKILLABLE:
|
||||
DamageMultiplier@UNKILLABLE:
|
||||
UpgradeTypes: unkillable
|
||||
UpgradeMinEnabledLevel: 1
|
||||
Modifier: 0, 0
|
||||
^Building:
|
||||
GivesBounty:
|
||||
Percentage: 0
|
||||
InvulnerabilityUpgrade@UNKILLABLE:
|
||||
DamageMultiplier@UNKILLABLE:
|
||||
UpgradeTypes: unkillable
|
||||
UpgradeMinEnabledLevel: 1
|
||||
Modifier: 0, 0
|
||||
OILB:
|
||||
CashTrickler:
|
||||
ShowTicks: false
|
||||
@@ -1319,7 +1319,8 @@ Rules:
|
||||
Burns:
|
||||
Damage: 0
|
||||
MISS:
|
||||
Invulnerable:
|
||||
DamageMultiplier@INVULNERABLE:
|
||||
Modifier: 0
|
||||
APC:
|
||||
Cargo:
|
||||
InitialUnits: e1, e1, e2, e3, e4
|
||||
|
||||
@@ -645,9 +645,9 @@ Rules:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
MustBeDestroyed:
|
||||
InvulnerabilityUpgrade@UNKILLABLE:
|
||||
DamageMultiplier@UNKILLABLE:
|
||||
UpgradeTypes: unkillable
|
||||
UpgradeMinEnabledLevel: 1
|
||||
Modifier: 0, 0
|
||||
RenderSprites:
|
||||
Image: SNIPER
|
||||
SPY:
|
||||
|
||||
@@ -641,7 +641,8 @@ Rules:
|
||||
Name: Strategic Point
|
||||
RevealsShroud:
|
||||
Range: 20c0
|
||||
Invulnerable:
|
||||
DamageMultiplier@INVULNERABLE:
|
||||
Modifier: 0
|
||||
-Selectable:
|
||||
-TargetableBuilding:
|
||||
Player:
|
||||
|
||||
@@ -16,7 +16,21 @@
|
||||
400: firepower, damage, speed, reload, inaccuracy, rank
|
||||
800: firepower, damage, speed, reload, inaccuracy, rank
|
||||
1600: firepower, damage, speed, reload, inaccuracy, rank, eliteweapon, selfheal
|
||||
GainsStatUpgrades:
|
||||
DamageMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: damage
|
||||
Modifier: 91, 87, 83, 65
|
||||
FirepowerMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: firepower
|
||||
Modifier: 110, 115, 120, 130
|
||||
SpeedMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: speed
|
||||
Modifier: 110, 115, 120, 150
|
||||
ReloadDelayMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: reload
|
||||
Modifier: 95, 90, 85, 75
|
||||
InaccuracyMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: inaccuracy
|
||||
Modifier: 90, 80, 70, 50
|
||||
SelfHealing@ELITE:
|
||||
Step: 2
|
||||
Ticks: 100
|
||||
@@ -39,10 +53,9 @@
|
||||
UpgradeOverlay@IRONCURTAIN:
|
||||
UpgradeTypes: invulnerability
|
||||
UpgradeMinEnabledLevel: 1
|
||||
InvulnerabilityUpgrade@IRONCURTAIN:
|
||||
DamageMultiplier@IRONCURTAIN:
|
||||
UpgradeTypes: invulnerability
|
||||
UpgradeMinEnabledLevel: 1
|
||||
UpgradeMaxAcceptedLevel: 2
|
||||
Modifier: 0, 0
|
||||
TimedUpgradeBar:
|
||||
Upgrade: invulnerability
|
||||
|
||||
|
||||
@@ -403,7 +403,8 @@ CTFLAG:
|
||||
Name: Flag
|
||||
Bib:
|
||||
HasMinibib: Yes
|
||||
Invulnerable:
|
||||
DamageMultiplier@INVULNERABLE:
|
||||
Modifier: 0
|
||||
-Selectable:
|
||||
-TargetableBuilding:
|
||||
|
||||
|
||||
@@ -648,7 +648,7 @@ DTRK:
|
||||
Weapon: MiniNuke
|
||||
EmptyWeapon: MiniNuke
|
||||
DemoTruck:
|
||||
-InvulnerabilityUpgrade@IRONCURTAIN:
|
||||
-DamageMultiplier@IRONCURTAIN:
|
||||
KillsSelf:
|
||||
UpgradeTypes: invulnerability
|
||||
UpgradeMinEnabledLevel: 1
|
||||
|
||||
@@ -13,11 +13,18 @@
|
||||
Upgrades:
|
||||
500: rank, firepower, damage, speed, reload
|
||||
1000: rank, firepower, damage, speed, reload, selfheal, eliteweapon
|
||||
GainsStatUpgrades:
|
||||
FirepowerModifier: 110, 130
|
||||
DamageModifier: 83, 66
|
||||
SpeedModifier: 120, 150
|
||||
ReloadModifier: 90, 75
|
||||
FirepowerMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: firepower
|
||||
Modifier: 110, 130
|
||||
DamageMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: damage
|
||||
Modifier: 83, 66
|
||||
SpeedMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: speed
|
||||
Modifier: 120, 150
|
||||
ReloadDelayMultiplier@EXPERIENCE:
|
||||
UpgradeTypes: reload
|
||||
Modifier: 90, 75
|
||||
SelfHealing@ELITE:
|
||||
Step: 2
|
||||
Ticks: 100
|
||||
|
||||
Reference in New Issue
Block a user