From a9010d1947bb2fc05959a2b9fb4231dac9ed796c Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 23 Dec 2009 03:49:49 -0800 Subject: [PATCH] AT and AP mine traits --- OpenRa.Game/Game.cs | 8 +++++ OpenRa.Game/OpenRa.Game.csproj | 2 ++ OpenRa.Game/PathSearch.cs | 2 +- OpenRa.Game/Traits/APMine.cs | 41 ++++++++++++++++++++++++ OpenRa.Game/Traits/ATMine.cs | 43 ++++++++++++++++++++++++++ OpenRa.Game/Traits/Infantry.cs | 7 ++++- OpenRa.Game/Traits/TraitsInterfaces.cs | 1 + units.ini | 11 +++++++ 8 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 OpenRa.Game/Traits/APMine.cs create mode 100644 OpenRa.Game/Traits/ATMine.cs diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 427416bef8..c8aa8ed418 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -239,6 +239,14 @@ namespace OpenRa.Game { return IsActorCrushableByMovementType(a, b.traits.WithInterface().FirstOrDefault().GetMovementType()); } + + public static bool IsActorPathableToCrush(Actor a, UnitMovementType umt) + { + return a != null && + a.traits.WithInterface() + .Any(c => c.IsPathableCrush(umt, a.Owner)); + } + public static bool IsActorCrushableByMovementType(Actor a, UnitMovementType umt) { return a != null && diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 8c23fce9d4..ac0c0d34f2 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -162,6 +162,8 @@ + + diff --git a/OpenRa.Game/PathSearch.cs b/OpenRa.Game/PathSearch.cs index 0290d34056..983634cbdf 100755 --- a/OpenRa.Game/PathSearch.cs +++ b/OpenRa.Game/PathSearch.cs @@ -56,7 +56,7 @@ namespace OpenRa.Game } // Replicate real-ra behavior of not being able to enter a cell if there is a mixture of crushable and uncrushable units - if (checkForBlocked && (Game.UnitInfluence.GetUnitsAt(newHere).Any(a => !Game.IsActorCrushableByMovementType(a, umt)))) + if (checkForBlocked && (Game.UnitInfluence.GetUnitsAt(newHere).Any(a => !Game.IsActorPathableToCrush(a, umt)))) continue; if (customBlock != null && customBlock(newHere)) diff --git a/OpenRa.Game/Traits/APMine.cs b/OpenRa.Game/Traits/APMine.cs new file mode 100644 index 0000000000..7dfbbfa7cb --- /dev/null +++ b/OpenRa.Game/Traits/APMine.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRa.Game.GameRules; +using OpenRa.Game.Effects; +namespace OpenRa.Game.Traits +{ + class APMine : ICrushable + { + readonly Actor self; + public APMine(Actor self) + { + this.self = self; + } + + public void OnCrush(Actor crusher) + { + Game.world.AddFrameEndTask(_ => + { + Game.world.Remove(self); + Game.world.Add(new Explosion(self.CenterLocation.ToInt2(), 5, false)); + crusher.InflictDamage(crusher, Rules.General.APMineDamage, Rules.WarheadInfo["APMine"]); + }); + } + + public bool IsPathableCrush(UnitMovementType umt, Player player) + { + return (player != Game.LocalPlayer); // Units should avoid friendly mines + } + + public bool IsCrushableBy(UnitMovementType umt, Player player) + { + // Mines should explode indiscriminantly of player + switch (umt) + { + case UnitMovementType.Foot: return true; + default: return false; + } + } + } +} diff --git a/OpenRa.Game/Traits/ATMine.cs b/OpenRa.Game/Traits/ATMine.cs new file mode 100644 index 0000000000..e81dc51d34 --- /dev/null +++ b/OpenRa.Game/Traits/ATMine.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using OpenRa.Game.GameRules; +using OpenRa.Game.Effects; + +namespace OpenRa.Game.Traits +{ + class ATMine : ICrushable + { + readonly Actor self; + public ATMine(Actor self) + { + this.self = self; + } + + public void OnCrush(Actor crusher) + { + Game.world.AddFrameEndTask(_ => + { + Game.world.Remove(self); + Game.world.Add(new Explosion(self.CenterLocation.ToInt2(), 3, false)); + crusher.InflictDamage(crusher, Rules.General.AVMineDamage, Rules.WarheadInfo["ATMine"]); + }); + } + + public bool IsPathableCrush(UnitMovementType umt, Player player) + { + return (player != Game.LocalPlayer); // Units should avoid friendly mines + } + + public bool IsCrushableBy(UnitMovementType umt, Player player) + { + // Mines should explode indiscriminantly of player + switch (umt) + { + case UnitMovementType.Wheel: + case UnitMovementType.Track: return true; + default: return false; + } + } + } +} diff --git a/OpenRa.Game/Traits/Infantry.cs b/OpenRa.Game/Traits/Infantry.cs index 653c9c2695..43200a940a 100644 --- a/OpenRa.Game/Traits/Infantry.cs +++ b/OpenRa.Game/Traits/Infantry.cs @@ -17,7 +17,12 @@ namespace OpenRa.Game.Traits { self.InflictDamage(crusher, self.Health, Rules.WarheadInfo["Crush"]); } - + + public bool IsPathableCrush(UnitMovementType umt, Player player) + { + return IsCrushableBy(umt, player); + } + public bool IsCrushableBy(UnitMovementType umt, Player player) { if (player == Game.LocalPlayer) return false; diff --git a/OpenRa.Game/Traits/TraitsInterfaces.cs b/OpenRa.Game/Traits/TraitsInterfaces.cs index 952720c7d2..fd3c22a3bc 100644 --- a/OpenRa.Game/Traits/TraitsInterfaces.cs +++ b/OpenRa.Game/Traits/TraitsInterfaces.cs @@ -63,5 +63,6 @@ namespace OpenRa.Game.Traits { void OnCrush(Actor crusher); bool IsCrushableBy(UnitMovementType umt, Player player); + bool IsPathableCrush(UnitMovementType umt, Player player); } } diff --git a/units.ini b/units.ini index a4da075087..63b3ea8524 100755 --- a/units.ini +++ b/units.ini @@ -658,6 +658,8 @@ Organic Nuke UnitExplodeWarhead Crush +APMine +ATMine [HE] ImpactSound=kaboom25 @@ -674,6 +676,15 @@ ImpactSound=kaboom15 Verses=100%,100%,100%,100%,100% ImpactSound=squishy2 +[ATMine] +Verses=0%,0%,100%,100%,0% +ImpactSound=mineblo1 + +[APMine] +Verses=100%,0%,0%,0%,0% +ImpactSound=mine1 +InfDeath=2 + [General] OreChance=.02 LowPowerSlowdown=3