diff --git a/OpenRa.Game/Traits/Infantry.cs b/OpenRa.Game/Traits/Infantry.cs index 9697605c55..0c4d5e5530 100644 --- a/OpenRa.Game/Traits/Infantry.cs +++ b/OpenRa.Game/Traits/Infantry.cs @@ -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 CrushableBy() diff --git a/OpenRa.Game/UnitInfluenceMap.cs b/OpenRa.Game/UnitInfluenceMap.cs index 6d5e5975ff..de3ecf044b 100644 --- a/OpenRa.Game/UnitInfluenceMap.cs +++ b/OpenRa.Game/UnitInfluenceMap.cs @@ -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().Any())) + { + // Are there any units in the same cell that can crush this? + foreach( var ios in a.traits.WithInterface() ) + 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()) + { + crush.OnCrush(crusher); + } + } + } + } SanityCheck(); } diff --git a/units.ini b/units.ini index 3e806737d3..99dba0767b 100755 --- a/units.ini +++ b/units.ini @@ -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