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)
|
||||
{
|
||||
/* todo: auto-retaliate, etc */
|
||||
/* todo: death sequence for infantry based on inflictor */
|
||||
|
||||
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;
|
||||
if (Health <= 0)
|
||||
{
|
||||
|
||||
@@ -183,6 +183,7 @@
|
||||
<Compile Include="Traits\RenderUnitSpinner.cs" />
|
||||
<Compile Include="Traits\RenderUnitTurreted.cs" />
|
||||
<Compile Include="Traits\SeedsOre.cs" />
|
||||
<Compile Include="Traits\TakeCover.cs" />
|
||||
<Compile Include="Traits\TraitsInterfaces.cs" />
|
||||
<Compile Include="Traits\Tree.cs" />
|
||||
<Compile Include="Traits\Turreted.cs" />
|
||||
|
||||
@@ -168,7 +168,11 @@ namespace OpenRa.Game.Traits.Activities
|
||||
var oldFraction = moveFraction;
|
||||
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 );
|
||||
if( moveFraction >= moveFractionTotal )
|
||||
{
|
||||
|
||||
@@ -48,8 +48,12 @@ namespace OpenRa.Game.Traits
|
||||
Util.TickFacing(ref unit.Facing, desiredFacing,
|
||||
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.
|
||||
var rawSpeed = .2f * (self.Info as VehicleInfo).Speed;
|
||||
var rawSpeed = .2f * actualSpeed;
|
||||
var angle = (unit.Facing - desiredFacing) / 128f * Math.PI;
|
||||
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;
|
||||
var dir = Util.QuantizeFacing(self.traits.Get<Unit>().Facing, 8);
|
||||
|
||||
if (anim.CurrentSequence.Name.StartsWith("run-"))
|
||||
anim.ReplaceAnim("run-" + dir);
|
||||
var takeCover = self.traits.GetOrDefault<TakeCover>();
|
||||
var prefix = (takeCover != null && takeCover.IsProne) ? "crawl-" : "run-";
|
||||
|
||||
if (anim.CurrentSequence.Name.StartsWith(prefix))
|
||||
anim.ReplaceAnim(prefix + dir);
|
||||
else
|
||||
anim.PlayRepeating("run-" + dir);
|
||||
anim.PlayRepeating(prefix + dir);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -40,7 +43,11 @@ namespace OpenRa.Game.Traits
|
||||
{
|
||||
var dir = Util.QuantizeFacing(self.traits.Get<Unit>().Facing, 8);
|
||||
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)
|
||||
|
||||
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 IRenderModifier { IEnumerable<Tuple<Sprite, float2, int>>
|
||||
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="die5" start="340" length="18" />
|
||||
<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 name="e6">
|
||||
<sequence name="stand" start="0" length="8" />
|
||||
@@ -440,6 +456,14 @@
|
||||
<sequence name="die5" start="182" length="18" />
|
||||
<sequence name="run-5" start="46" length="8" />
|
||||
<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 name="ca">
|
||||
<sequence name="idle" start="0" length="16" />
|
||||
@@ -476,6 +500,14 @@
|
||||
<sequence name="die3" start="209" length="8" />
|
||||
<sequence name="die4" start="217" length="12" />
|
||||
<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 name="explosion">
|
||||
<sequence name="1" start="0" length="4" src="piff" />
|
||||
@@ -651,6 +683,22 @@
|
||||
<sequence name="die4" start="440" length="12" />
|
||||
<sequence name="die5" start="452" length="18" />
|
||||
<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 name="bomb">
|
||||
<sequence name="idle" start="0" length="8" />
|
||||
@@ -700,6 +748,22 @@
|
||||
<sequence name="die4" start="312" length="12" />
|
||||
<sequence name="die5" start="324" length="18" />
|
||||
<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 name="litning">
|
||||
<sequence name="bright" start="0" length="4" />
|
||||
@@ -729,6 +793,22 @@
|
||||
<sequence name="die4" start="286" length="12" />
|
||||
<sequence name="die5" start="298" length="18" />
|
||||
<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 name="e4">
|
||||
<sequence name="stand" start="0" length="8" />
|
||||
@@ -755,6 +835,22 @@
|
||||
<sequence name="die4" start="440" length="12" />
|
||||
<sequence name="die5" start="452" length="18" />
|
||||
<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 name="fb1">
|
||||
<sequence name="idle" start="0" length="8" />
|
||||
@@ -775,5 +871,13 @@
|
||||
<sequence name="die4" start="163" length="12" />
|
||||
<sequence name="die5" start="175" length="18" />
|
||||
<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>
|
||||
</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
|
||||
[E1]
|
||||
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
|
||||
[E2]
|
||||
Description=Grenadier
|
||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
||||
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||
FireDelay=15
|
||||
LongDesc=Infantry armed with grenades. \n Strong vs Buildings, Infantry\n Weak vs Vehicles
|
||||
[E3]
|
||||
Description=Rocket Soldier
|
||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
||||
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||
PrimaryOffset=0,0,0,-13
|
||||
LongDesc=Anti-tank/Anti-aircraft infantry.\n Strong vs Tanks, Aircraft\n Weak vs Infantry
|
||||
[E4]
|
||||
Description=Flamethrower
|
||||
Traits=Unit, Mobile, RenderInfantry, AttackBase
|
||||
Traits=Unit, Mobile, RenderInfantry, AttackBase, TakeCover
|
||||
FireDelay=8
|
||||
LongDesc=Advanced Anti-infantry unit.\n Strong vs Infantry, Buildings\n Weak vs Vehicles
|
||||
[E6]
|
||||
Description=Engineer
|
||||
Traits=Unit, Mobile, RenderInfantry
|
||||
Traits=Unit, Mobile, RenderInfantry, TakeCover
|
||||
Voice=EngineerVoice
|
||||
LongDesc=Infiltrates and captures enemy structures.\n Strong vs Nothing\n Weak vs Everything
|
||||
[SPY]
|
||||
Description=Spy
|
||||
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
|
||||
[THF]
|
||||
Description=Thief
|
||||
Voice=ThiefVoice
|
||||
Traits=Unit, Mobile, RenderInfantry
|
||||
Traits=Unit, Mobile, RenderInfantry, TakeCover
|
||||
LongDesc=Infiltrates enemy refineries & \nsilos, and steals money stored there.\n Unarmed
|
||||
[E7]
|
||||
Description=Tanya
|
||||
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
|
||||
[MEDI]
|
||||
Description=Medic
|
||||
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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user