added infantry taking cover behavior
This commit is contained in:
@@ -111,10 +111,13 @@ namespace OpenRa.Game
|
|||||||
public void InflictDamage(Actor attacker, int damage, WarheadInfo warhead)
|
public void InflictDamage(Actor attacker, int damage, WarheadInfo warhead)
|
||||||
{
|
{
|
||||||
/* todo: auto-retaliate, etc */
|
/* todo: auto-retaliate, etc */
|
||||||
/* todo: death sequence for infantry based on inflictor */
|
|
||||||
|
|
||||||
if (IsDead) return; /* overkill! don't count extra hits as more kills! */
|
if (IsDead) return; /* overkill! don't count extra hits as more kills! */
|
||||||
|
|
||||||
|
/* apply the damage modifiers, if we have any. */
|
||||||
|
damage = (int)traits.WithInterface<IDamageModifier>().Aggregate(
|
||||||
|
(float)damage, (a, t) => t.GetDamageModifier() * a);
|
||||||
|
|
||||||
Health -= damage;
|
Health -= damage;
|
||||||
if (Health <= 0)
|
if (Health <= 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -183,6 +183,7 @@
|
|||||||
<Compile Include="Traits\RenderUnitSpinner.cs" />
|
<Compile Include="Traits\RenderUnitSpinner.cs" />
|
||||||
<Compile Include="Traits\RenderUnitTurreted.cs" />
|
<Compile Include="Traits\RenderUnitTurreted.cs" />
|
||||||
<Compile Include="Traits\SeedsOre.cs" />
|
<Compile Include="Traits\SeedsOre.cs" />
|
||||||
|
<Compile Include="Traits\TakeCover.cs" />
|
||||||
<Compile Include="Traits\TraitsInterfaces.cs" />
|
<Compile Include="Traits\TraitsInterfaces.cs" />
|
||||||
<Compile Include="Traits\Tree.cs" />
|
<Compile Include="Traits\Tree.cs" />
|
||||||
<Compile Include="Traits\Turreted.cs" />
|
<Compile Include="Traits\Turreted.cs" />
|
||||||
|
|||||||
@@ -168,7 +168,11 @@ namespace OpenRa.Game.Traits.Activities
|
|||||||
var oldFraction = moveFraction;
|
var oldFraction = moveFraction;
|
||||||
var oldTotal = moveFractionTotal;
|
var oldTotal = moveFractionTotal;
|
||||||
|
|
||||||
moveFraction += ( self.Info as MobileInfo ).Speed;
|
var actualSpeed = (int)self.traits.WithInterface<ISpeedModifier>().Aggregate(
|
||||||
|
(float)(self.Info as MobileInfo).Speed,
|
||||||
|
(a, t) => t.GetSpeedModifier() * a);
|
||||||
|
|
||||||
|
moveFraction += actualSpeed;
|
||||||
UpdateCenterLocation( self, mobile );
|
UpdateCenterLocation( self, mobile );
|
||||||
if( moveFraction >= moveFractionTotal )
|
if( moveFraction >= moveFractionTotal )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -48,8 +48,12 @@ namespace OpenRa.Game.Traits
|
|||||||
Util.TickFacing(ref unit.Facing, desiredFacing,
|
Util.TickFacing(ref unit.Facing, desiredFacing,
|
||||||
self.Info.ROT);
|
self.Info.ROT);
|
||||||
|
|
||||||
|
var actualSpeed = self.traits.WithInterface<ISpeedModifier>().Aggregate(
|
||||||
|
(float)(self.Info as MobileInfo).Speed,
|
||||||
|
(a, t) => t.GetSpeedModifier() * a);
|
||||||
|
|
||||||
// .6f going the wrong way; .8f going sideways, 1f going forward.
|
// .6f going the wrong way; .8f going sideways, 1f going forward.
|
||||||
var rawSpeed = .2f * (self.Info as VehicleInfo).Speed;
|
var rawSpeed = .2f * actualSpeed;
|
||||||
var angle = (unit.Facing - desiredFacing) / 128f * Math.PI;
|
var angle = (unit.Facing - desiredFacing) / 128f * Math.PI;
|
||||||
var scale = .4f + .6f * (float)Math.Cos(angle);
|
var scale = .4f + .6f * (float)Math.Cos(angle);
|
||||||
|
|
||||||
|
|||||||
@@ -26,10 +26,13 @@ namespace OpenRa.Game.Traits
|
|||||||
if (float2.WithinEpsilon(self.CenterLocation, Util.CenterOfCell(mobile.toCell), 2)) return false;
|
if (float2.WithinEpsilon(self.CenterLocation, Util.CenterOfCell(mobile.toCell), 2)) return false;
|
||||||
var dir = Util.QuantizeFacing(self.traits.Get<Unit>().Facing, 8);
|
var dir = Util.QuantizeFacing(self.traits.Get<Unit>().Facing, 8);
|
||||||
|
|
||||||
if (anim.CurrentSequence.Name.StartsWith("run-"))
|
var takeCover = self.traits.GetOrDefault<TakeCover>();
|
||||||
anim.ReplaceAnim("run-" + dir);
|
var prefix = (takeCover != null && takeCover.IsProne) ? "crawl-" : "run-";
|
||||||
|
|
||||||
|
if (anim.CurrentSequence.Name.StartsWith(prefix))
|
||||||
|
anim.ReplaceAnim(prefix + dir);
|
||||||
else
|
else
|
||||||
anim.PlayRepeating("run-" + dir);
|
anim.PlayRepeating(prefix + dir);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -40,7 +43,11 @@ namespace OpenRa.Game.Traits
|
|||||||
{
|
{
|
||||||
var dir = Util.QuantizeFacing(self.traits.Get<Unit>().Facing, 8);
|
var dir = Util.QuantizeFacing(self.traits.Get<Unit>().Facing, 8);
|
||||||
inAttack = true;
|
inAttack = true;
|
||||||
anim.PlayThen("shoot-" + dir, () => inAttack = false);
|
|
||||||
|
var takeCover = self.traits.GetOrDefault<TakeCover>();
|
||||||
|
var prefix = (takeCover != null && takeCover.IsProne) ? "prone-shoot-" : "shoot-";
|
||||||
|
|
||||||
|
anim.PlayThen(prefix + dir, () => inAttack = false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Tick(Actor self)
|
public override void Tick(Actor self)
|
||||||
|
|||||||
43
OpenRa.Game/Traits/TakeCover.cs
Normal file
43
OpenRa.Game/Traits/TakeCover.cs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using OpenRa.Game.GameRules;
|
||||||
|
|
||||||
|
namespace OpenRa.Game.Traits
|
||||||
|
{
|
||||||
|
// infantry prone behavior
|
||||||
|
class TakeCover : ITick, INotifyDamageEx, IDamageModifier, ISpeedModifier
|
||||||
|
{
|
||||||
|
const int defaultProneTime = 100; /* ticks, =4s */
|
||||||
|
const float proneDamage = .5f;
|
||||||
|
const float proneSpeed = .5f;
|
||||||
|
|
||||||
|
int remainingProneTime = 0;
|
||||||
|
|
||||||
|
public bool IsProne { get { return remainingProneTime > 0; } }
|
||||||
|
|
||||||
|
public TakeCover(Actor self) {}
|
||||||
|
|
||||||
|
public void Damaged(Actor self, int damage, WarheadInfo warhead)
|
||||||
|
{
|
||||||
|
remainingProneTime = defaultProneTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Tick(Actor self)
|
||||||
|
{
|
||||||
|
if (IsProne)
|
||||||
|
--remainingProneTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float GetDamageModifier()
|
||||||
|
{
|
||||||
|
return IsProne ? proneDamage : 1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float GetSpeedModifier()
|
||||||
|
{
|
||||||
|
return IsProne ? proneSpeed : 1f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,4 +21,6 @@ namespace OpenRa.Game.Traits
|
|||||||
interface INotifyAttack { void Attacking(Actor self); }
|
interface INotifyAttack { void Attacking(Actor self); }
|
||||||
interface IRenderModifier { IEnumerable<Tuple<Sprite, float2, int>>
|
interface IRenderModifier { IEnumerable<Tuple<Sprite, float2, int>>
|
||||||
ModifyRender( Actor self, IEnumerable<Tuple<Sprite, float2, int>> r ); }
|
ModifyRender( Actor self, IEnumerable<Tuple<Sprite, float2, int>> r ); }
|
||||||
|
interface IDamageModifier { float GetDamageModifier(); }
|
||||||
|
interface ISpeedModifier { float GetSpeedModifier(); }
|
||||||
}
|
}
|
||||||
|
|||||||
104
sequences.xml
104
sequences.xml
@@ -422,6 +422,22 @@
|
|||||||
<sequence name="die4" start="328" length="12" />
|
<sequence name="die4" start="328" length="12" />
|
||||||
<sequence name="die5" start="340" length="18" />
|
<sequence name="die5" start="340" length="18" />
|
||||||
<sequence name="die6" start="0" length="14" src="electro" />
|
<sequence name="die6" start="0" length="14" src="electro" />
|
||||||
|
<sequence name="crawl-0" start="144" length="4" />
|
||||||
|
<sequence name="crawl-1" start="148" length="4" />
|
||||||
|
<sequence name="crawl-2" start="152" length="4" />
|
||||||
|
<sequence name="crawl-3" start="156" length="4" />
|
||||||
|
<sequence name="crawl-4" start="160" length="4" />
|
||||||
|
<sequence name="crawl-5" start="164" length="4" />
|
||||||
|
<sequence name="crawl-6" start="168" length="4" />
|
||||||
|
<sequence name="crawl-7" start="172" length="4" />
|
||||||
|
<sequence name="prone-shoot-0" start="192" length="10" />
|
||||||
|
<sequence name="prone-shoot-1" start="202" length="10" />
|
||||||
|
<sequence name="prone-shoot-2" start="212" length="10" />
|
||||||
|
<sequence name="prone-shoot-3" start="222" length="10" />
|
||||||
|
<sequence name="prone-shoot-4" start="232" length="10" />
|
||||||
|
<sequence name="prone-shoot-5" start="242" length="10" />
|
||||||
|
<sequence name="prone-shoot-6" start="252" length="10" />
|
||||||
|
<sequence name="prone-shoot-7" start="262" length="10" />
|
||||||
</unit>
|
</unit>
|
||||||
<unit name="e6">
|
<unit name="e6">
|
||||||
<sequence name="stand" start="0" length="8" />
|
<sequence name="stand" start="0" length="8" />
|
||||||
@@ -440,6 +456,14 @@
|
|||||||
<sequence name="die5" start="182" length="18" />
|
<sequence name="die5" start="182" length="18" />
|
||||||
<sequence name="run-5" start="46" length="8" />
|
<sequence name="run-5" start="46" length="8" />
|
||||||
<sequence name="die6" start="0" length="14" src="electro" />
|
<sequence name="die6" start="0" length="14" src="electro" />
|
||||||
|
<sequence name="crawl-0" start="82" length="4" />
|
||||||
|
<sequence name="crawl-1" start="86" length="4" />
|
||||||
|
<sequence name="crawl-2" start="90" length="4" />
|
||||||
|
<sequence name="crawl-3" start="94" length="4" />
|
||||||
|
<sequence name="crawl-4" start="98" length="4" />
|
||||||
|
<sequence name="crawl-5" start="102" length="4" />
|
||||||
|
<sequence name="crawl-6" start="106" length="4" />
|
||||||
|
<sequence name="crawl-7" start="110" length="4" />
|
||||||
</unit>
|
</unit>
|
||||||
<unit name="ca">
|
<unit name="ca">
|
||||||
<sequence name="idle" start="0" length="16" />
|
<sequence name="idle" start="0" length="16" />
|
||||||
@@ -476,6 +500,14 @@
|
|||||||
<sequence name="die3" start="209" length="8" />
|
<sequence name="die3" start="209" length="8" />
|
||||||
<sequence name="die4" start="217" length="12" />
|
<sequence name="die4" start="217" length="12" />
|
||||||
<sequence name="die5" start="229" length="18" />
|
<sequence name="die5" start="229" length="18" />
|
||||||
|
<sequence name="crawl-0" start="130" length="4" />
|
||||||
|
<sequence name="crawl-1" start="134" length="4" />
|
||||||
|
<sequence name="crawl-2" start="138" length="4" />
|
||||||
|
<sequence name="crawl-3" start="142" length="4" />
|
||||||
|
<sequence name="crawl-4" start="146" length="4" />
|
||||||
|
<sequence name="crawl-5" start="150" length="4" />
|
||||||
|
<sequence name="crawl-6" start="154" length="4" />
|
||||||
|
<sequence name="crawl-7" start="158" length="4" />
|
||||||
</unit>
|
</unit>
|
||||||
<unit name="explosion">
|
<unit name="explosion">
|
||||||
<sequence name="1" start="0" length="4" src="piff" />
|
<sequence name="1" start="0" length="4" src="piff" />
|
||||||
@@ -651,6 +683,22 @@
|
|||||||
<sequence name="die4" start="440" length="12" />
|
<sequence name="die4" start="440" length="12" />
|
||||||
<sequence name="die5" start="452" length="18" />
|
<sequence name="die5" start="452" length="18" />
|
||||||
<sequence name="die6" start="0" length="14" src="electro" />
|
<sequence name="die6" start="0" length="14" src="electro" />
|
||||||
|
<sequence name="crawl-0" start="240" length="4" />
|
||||||
|
<sequence name="crawl-1" start="244" length="4" />
|
||||||
|
<sequence name="crawl-2" start="248" length="4" />
|
||||||
|
<sequence name="crawl-3" start="252" length="4" />
|
||||||
|
<sequence name="crawl-4" start="256" length="4" />
|
||||||
|
<sequence name="crawl-5" start="260" length="4" />
|
||||||
|
<sequence name="crawl-6" start="264" length="4" />
|
||||||
|
<sequence name="crawl-7" start="268" length="4" />
|
||||||
|
<sequence name="prone-shoot-0" start="288" length="12" />
|
||||||
|
<sequence name="prone-shoot-1" start="300" length="12" />
|
||||||
|
<sequence name="prone-shoot-2" start="312" length="12" />
|
||||||
|
<sequence name="prone-shoot-3" start="324" length="12" />
|
||||||
|
<sequence name="prone-shoot-4" start="336" length="12" />
|
||||||
|
<sequence name="prone-shoot-5" start="348" length="12" />
|
||||||
|
<sequence name="prone-shoot-6" start="360" length="12" />
|
||||||
|
<sequence name="prone-shoot-7" start="372" length="12" />
|
||||||
</unit>
|
</unit>
|
||||||
<unit name="bomb">
|
<unit name="bomb">
|
||||||
<sequence name="idle" start="0" length="8" />
|
<sequence name="idle" start="0" length="8" />
|
||||||
@@ -700,6 +748,22 @@
|
|||||||
<sequence name="die4" start="312" length="12" />
|
<sequence name="die4" start="312" length="12" />
|
||||||
<sequence name="die5" start="324" length="18" />
|
<sequence name="die5" start="324" length="18" />
|
||||||
<sequence name="die6" start="0" length="14" src="electro" />
|
<sequence name="die6" start="0" length="14" src="electro" />
|
||||||
|
<sequence name="crawl-0" start="144" length="4" />
|
||||||
|
<sequence name="crawl-1" start="148" length="4" />
|
||||||
|
<sequence name="crawl-2" start="152" length="4" />
|
||||||
|
<sequence name="crawl-3" start="156" length="4" />
|
||||||
|
<sequence name="crawl-4" start="160" length="4" />
|
||||||
|
<sequence name="crawl-5" start="164" length="4" />
|
||||||
|
<sequence name="crawl-6" start="168" length="4" />
|
||||||
|
<sequence name="crawl-7" start="172" length="4" />
|
||||||
|
<sequence name="prone-shoot-0" start="192" length="8" />
|
||||||
|
<sequence name="prone-shoot-1" start="200" length="8" />
|
||||||
|
<sequence name="prone-shoot-2" start="208" length="8" />
|
||||||
|
<sequence name="prone-shoot-3" start="216" length="8" />
|
||||||
|
<sequence name="prone-shoot-4" start="224" length="8" />
|
||||||
|
<sequence name="prone-shoot-5" start="232" length="8" />
|
||||||
|
<sequence name="prone-shoot-6" start="240" length="8" />
|
||||||
|
<sequence name="prone-shoot-7" start="248" length="8" />
|
||||||
</unit>
|
</unit>
|
||||||
<unit name="litning">
|
<unit name="litning">
|
||||||
<sequence name="bright" start="0" length="4" />
|
<sequence name="bright" start="0" length="4" />
|
||||||
@@ -729,6 +793,22 @@
|
|||||||
<sequence name="die4" start="286" length="12" />
|
<sequence name="die4" start="286" length="12" />
|
||||||
<sequence name="die5" start="298" length="18" />
|
<sequence name="die5" start="298" length="18" />
|
||||||
<sequence name="die6" start="0" length="14" src="electro" />
|
<sequence name="die6" start="0" length="14" src="electro" />
|
||||||
|
<sequence name="crawl-0" start="128" length="4" />
|
||||||
|
<sequence name="crawl-1" start="132" length="4" />
|
||||||
|
<sequence name="crawl-2" start="136" length="4" />
|
||||||
|
<sequence name="crawl-3" start="140" length="4" />
|
||||||
|
<sequence name="crawl-4" start="144" length="4" />
|
||||||
|
<sequence name="crawl-5" start="148" length="4" />
|
||||||
|
<sequence name="crawl-6" start="152" length="4" />
|
||||||
|
<sequence name="crawl-7" start="156" length="4" />
|
||||||
|
<sequence name="prone-shoot-0" start="176" length="7" />
|
||||||
|
<sequence name="prone-shoot-1" start="183" length="7" />
|
||||||
|
<sequence name="prone-shoot-2" start="190" length="7" />
|
||||||
|
<sequence name="prone-shoot-3" start="197" length="7" />
|
||||||
|
<sequence name="prone-shoot-4" start="204" length="7" />
|
||||||
|
<sequence name="prone-shoot-5" start="211" length="7" />
|
||||||
|
<sequence name="prone-shoot-6" start="218" length="7" />
|
||||||
|
<sequence name="prone-shoot-7" start="225" length="7" />
|
||||||
</unit>
|
</unit>
|
||||||
<unit name="e4">
|
<unit name="e4">
|
||||||
<sequence name="stand" start="0" length="8" />
|
<sequence name="stand" start="0" length="8" />
|
||||||
@@ -755,6 +835,22 @@
|
|||||||
<sequence name="die4" start="440" length="12" />
|
<sequence name="die4" start="440" length="12" />
|
||||||
<sequence name="die5" start="452" length="18" />
|
<sequence name="die5" start="452" length="18" />
|
||||||
<sequence name="die6" start="0" length="14" src="electro" />
|
<sequence name="die6" start="0" length="14" src="electro" />
|
||||||
|
<sequence name="crawl-0" start="208" length="4" />
|
||||||
|
<sequence name="crawl-1" start="212" length="4" />
|
||||||
|
<sequence name="crawl-2" start="216" length="4" />
|
||||||
|
<sequence name="crawl-3" start="220" length="4" />
|
||||||
|
<sequence name="crawl-4" start="224" length="4" />
|
||||||
|
<sequence name="crawl-5" start="228" length="4" />
|
||||||
|
<sequence name="crawl-6" start="232" length="4" />
|
||||||
|
<sequence name="crawl-7" start="236" length="4" />
|
||||||
|
<sequence name="prone-shoot-0" start="256" length="16" />
|
||||||
|
<sequence name="prone-shoot-1" start="272" length="16" />
|
||||||
|
<sequence name="prone-shoot-2" start="288" length="16" />
|
||||||
|
<sequence name="prone-shoot-3" start="304" length="16" />
|
||||||
|
<sequence name="prone-shoot-4" start="320" length="16" />
|
||||||
|
<sequence name="prone-shoot-5" start="336" length="16" />
|
||||||
|
<sequence name="prone-shoot-6" start="352" length="16" />
|
||||||
|
<sequence name="prone-shoot-7" start="368" length="16" />
|
||||||
</unit>
|
</unit>
|
||||||
<unit name="fb1">
|
<unit name="fb1">
|
||||||
<sequence name="idle" start="0" length="8" />
|
<sequence name="idle" start="0" length="8" />
|
||||||
@@ -775,5 +871,13 @@
|
|||||||
<sequence name="die4" start="163" length="12" />
|
<sequence name="die4" start="163" length="12" />
|
||||||
<sequence name="die5" start="175" length="18" />
|
<sequence name="die5" start="175" length="18" />
|
||||||
<sequence name="die6" start="0" length="14" src="electro" />
|
<sequence name="die6" start="0" length="14" src="electro" />
|
||||||
|
<sequence name="crawl-0" start="72" length="4" />
|
||||||
|
<sequence name="crawl-1" start="76" length="4" />
|
||||||
|
<sequence name="crawl-2" start="80" length="4" />
|
||||||
|
<sequence name="crawl-3" start="84" length="4" />
|
||||||
|
<sequence name="crawl-4" start="88" length="4" />
|
||||||
|
<sequence name="crawl-5" start="92" length="4" />
|
||||||
|
<sequence name="crawl-6" start="96" length="4" />
|
||||||
|
<sequence name="crawl-7" start="100" length="4" />
|
||||||
</unit>
|
</unit>
|
||||||
</sequences>
|
</sequences>
|
||||||
18
units.ini
18
units.ini
@@ -524,47 +524,47 @@ Traits=Unit, Mobile, RenderInfantry
|
|||||||
LongDesc=Anti-infantry unit. Not fooled by the \nSpy's disguise.\n Strong vs Infantry\n Weak vs Vehicles
|
LongDesc=Anti-infantry unit. Not fooled by the \nSpy's disguise.\n Strong vs Infantry\n Weak vs Vehicles
|
||||||
[E1]
|
[E1]
|
||||||
Description=Rifle Infantry
|
Description=Rifle Infantry
|
||||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||||
LongDesc=General-purpose infantry. Strong vs Infantry\n Weak vs Vehicles
|
LongDesc=General-purpose infantry. Strong vs Infantry\n Weak vs Vehicles
|
||||||
[E2]
|
[E2]
|
||||||
Description=Grenadier
|
Description=Grenadier
|
||||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||||
FireDelay=15
|
FireDelay=15
|
||||||
LongDesc=Infantry armed with grenades. \n Strong vs Buildings, Infantry\n Weak vs Vehicles
|
LongDesc=Infantry armed with grenades. \n Strong vs Buildings, Infantry\n Weak vs Vehicles
|
||||||
[E3]
|
[E3]
|
||||||
Description=Rocket Soldier
|
Description=Rocket Soldier
|
||||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||||
PrimaryOffset=0,0,0,-13
|
PrimaryOffset=0,0,0,-13
|
||||||
LongDesc=Anti-tank/Anti-aircraft infantry.\n Strong vs Tanks, Aircraft\n Weak vs Infantry
|
LongDesc=Anti-tank/Anti-aircraft infantry.\n Strong vs Tanks, Aircraft\n Weak vs Infantry
|
||||||
[E4]
|
[E4]
|
||||||
Description=Flamethrower
|
Description=Flamethrower
|
||||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||||
FireDelay=8
|
FireDelay=8
|
||||||
LongDesc=Advanced Anti-infantry unit.\n Strong vs Infantry, Buildings\n Weak vs Vehicles
|
LongDesc=Advanced Anti-infantry unit.\n Strong vs Infantry, Buildings\n Weak vs Vehicles
|
||||||
[E6]
|
[E6]
|
||||||
Description=Engineer
|
Description=Engineer
|
||||||
Traits=Unit, Mobile, RenderInfantry
|
Traits=Unit, Mobile, RenderInfantry, TakeCover
|
||||||
Voice=EngineerVoice
|
Voice=EngineerVoice
|
||||||
LongDesc=Infiltrates and captures enemy structures.\n Strong vs Nothing\n Weak vs Everything
|
LongDesc=Infiltrates and captures enemy structures.\n Strong vs Nothing\n Weak vs Everything
|
||||||
[SPY]
|
[SPY]
|
||||||
Description=Spy
|
Description=Spy
|
||||||
Voice=SpyVoice
|
Voice=SpyVoice
|
||||||
Traits=Unit, Mobile, RenderInfantry
|
Traits=Unit, Mobile, RenderInfantry, TakeCover
|
||||||
LongDesc=Infiltrates enemy structures to gather \nintelligence. Exact effect depends on the \nbuilding infiltrated.\n Strong vs Nothing\n Weak vs Everything\n Special Ability: Disguised
|
LongDesc=Infiltrates enemy structures to gather \nintelligence. Exact effect depends on the \nbuilding infiltrated.\n Strong vs Nothing\n Weak vs Everything\n Special Ability: Disguised
|
||||||
[THF]
|
[THF]
|
||||||
Description=Thief
|
Description=Thief
|
||||||
Voice=ThiefVoice
|
Voice=ThiefVoice
|
||||||
Traits=Unit, Mobile, RenderInfantry
|
Traits=Unit, Mobile, RenderInfantry, TakeCover
|
||||||
LongDesc=Infiltrates enemy refineries & \nsilos, and steals money stored there.\n Unarmed
|
LongDesc=Infiltrates enemy refineries & \nsilos, and steals money stored there.\n Unarmed
|
||||||
[E7]
|
[E7]
|
||||||
Description=Tanya
|
Description=Tanya
|
||||||
Voice=TanyaVoice
|
Voice=TanyaVoice
|
||||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||||
LongDesc=Elite commando infantry, armed with \ndual pistols and C4.\n Strong vs Infantry, Buildings\n Weak vs Vehicles\n Special Ability: Destroy Building with C4
|
LongDesc=Elite commando infantry, armed with \ndual pistols and C4.\n Strong vs Infantry, Buildings\n Weak vs Vehicles\n Special Ability: Destroy Building with C4
|
||||||
[MEDI]
|
[MEDI]
|
||||||
Description=Medic
|
Description=Medic
|
||||||
Voice=MedicVoice
|
Voice=MedicVoice
|
||||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||||
LongDesc=Heals nearby infantry.\n Strong vs Nothing\n Weak vs Everything
|
LongDesc=Heals nearby infantry.\n Strong vs Nothing\n Weak vs Everything
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user