Added multiplier modifier traits, removing GainsStatUpgrades, InvulnerabilityUpgrade, & Invulnerable.

This commit is contained in:
atlimit8
2015-06-27 11:40:52 -05:00
parent b4031c6e9b
commit daec860192
27 changed files with 473 additions and 217 deletions

View File

@@ -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" />

View File

@@ -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; }
}
}

View 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(); }
}
}

View 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(); }
}
}

View 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 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(); }
}
}

View 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>();
}
}
}

View 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 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(); }
}
}

View 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(); }
}
}

View File

@@ -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];
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}

View File

@@ -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" />

View File

@@ -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;
}
}
}

View File

@@ -831,7 +831,8 @@ Rules:
Health:
HP: 125
^Bridge:
Invulnerable:
DamageMultiplier@INVULNERABLE:
Modifier: 0
Sequences:

View File

@@ -295,7 +295,8 @@ Rules:
Tooltip:
Name: Nikoomba
^Bridge:
Invulnerable:
DamageMultiplier@INVULNERABLE:
Modifier: 0
^CivBuilding:
MustBeDestroyed:
^CivInfantry:

View File

@@ -530,7 +530,8 @@ Rules:
GenericVisibility: Enemy
ShowOwnerRow: false
^Bridge:
Invulnerable:
DamageMultiplier@INVULNERABLE:
Modifier: 0
E2:
Buildable:
Prerequisites: ~pyle

View File

@@ -162,7 +162,8 @@ C17:
Cargo:
MaxWeight: 10
PipCount: 10
Invulnerable:
DamageMultiplier@INVULNERABLE:
Modifier: 0
Contrail@1:
Offset: -261,-650,0
TrailLength: 15

View File

@@ -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

View File

@@ -85,7 +85,8 @@ frigate:
Cargo:
MaxWeight: 20
PipCount: 10
Invulnerable:
DamageMultiplier@INVULNERABLE:
Modifier: 0
FlyAwayOnIdle:
RejectsOrders:

View File

@@ -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

View File

@@ -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

View File

@@ -645,9 +645,9 @@ Rules:
Buildable:
Prerequisites: ~disabled
MustBeDestroyed:
InvulnerabilityUpgrade@UNKILLABLE:
DamageMultiplier@UNKILLABLE:
UpgradeTypes: unkillable
UpgradeMinEnabledLevel: 1
Modifier: 0, 0
RenderSprites:
Image: SNIPER
SPY:

View File

@@ -641,7 +641,8 @@ Rules:
Name: Strategic Point
RevealsShroud:
Range: 20c0
Invulnerable:
DamageMultiplier@INVULNERABLE:
Modifier: 0
-Selectable:
-TargetableBuilding:
Player:

View File

@@ -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

View File

@@ -403,7 +403,8 @@ CTFLAG:
Name: Flag
Bib:
HasMinibib: Yes
Invulnerable:
DamageMultiplier@INVULNERABLE:
Modifier: 0
-Selectable:
-TargetableBuilding:

View File

@@ -648,7 +648,7 @@ DTRK:
Weapon: MiniNuke
EmptyWeapon: MiniNuke
DemoTruck:
-InvulnerabilityUpgrade@IRONCURTAIN:
-DamageMultiplier@IRONCURTAIN:
KillsSelf:
UpgradeTypes: invulnerability
UpgradeMinEnabledLevel: 1

View File

@@ -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