added infantry taking cover behavior

This commit is contained in:
Chris Forbes
2009-12-17 21:52:39 +13:00
parent 36e788b685
commit ac2b666366
9 changed files with 184 additions and 16 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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