Add crush check and move crush effect into a custom warhead

This commit is contained in:
Paul Chote
2009-12-22 23:56:39 -08:00
parent 0b0a1fe11d
commit 9da1da8102
3 changed files with 34 additions and 2 deletions

View File

@@ -7,7 +7,11 @@ namespace OpenRa.Game.Traits
{
class Infantry : ICrushable
{
public Infantry(Actor self){}
readonly Actor self;
public Infantry(Actor self)
{
this.self = self;
}
public bool IsCrushableByFriend()
{
@@ -22,7 +26,7 @@ namespace OpenRa.Game.Traits
public void OnCrush(Actor crusher)
{
Sound.Play("squishy2.aud");
self.InflictDamage(crusher, self.Health, Rules.WarheadInfo["Crush"]);
}
public IEnumerable<UnitMovementType> CrushableBy()

View File

@@ -22,6 +22,29 @@ namespace OpenRa.Game
public void Tick()
{
// Does this belong here?
// Get the crushable actors
foreach (var a in Game.world.Actors.Where(b => b.traits.WithInterface<ICrushable>().Any()))
{
// Are there any units in the same cell that can crush this?
foreach( var ios in a.traits.WithInterface<IOccupySpace>() )
foreach( var cell in ios.OccupiedCells() )
{
// There should only be one (counterexample: An infantry and a tank try to pick up a crate at the same time.)
// If there is more than one, do action on the first crusher
var crusher = GetUnitsAt(cell).Where(b => a != b && Game.IsActorCrushableByActor(a, b)).FirstOrDefault();
if (crusher != null)
{
Log.Write("{0} crushes {1}", crusher.Info.Name, a.Info.Name);
// Apply the crush action
foreach (var crush in a.traits.WithInterface<ICrushable>())
{
crush.OnCrush(crusher);
}
}
}
}
SanityCheck();
}

View File

@@ -657,6 +657,7 @@ Super
Organic
Nuke
UnitExplodeWarhead
Crush
[HE]
ImpactSound=kaboom25
@@ -669,6 +670,10 @@ Explosion=8
InfDeath=3
ImpactSound=kaboom15
[Crush]
Verses=100%,100%,100%,100%,100%
ImpactSound=squishy2
[General]
OreChance=.02
LowPowerSlowdown=3