From 95b5e1856ed012c62056fa47a08c7ec50e569e25 Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Sun, 14 Apr 2013 21:52:07 +1200 Subject: [PATCH 1/5] Make MRJ jam radar --- mods/ra/rules/vehicles.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index b937292539..d00df0b815 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -537,7 +537,7 @@ MRJ: Cost: 1000 Tooltip: Name: Mobile Radar Jammer - Description: Unarmed + Description: Jams nearby enemy radar domes. Buildable: Queue: Vehicle BuildPaletteOrder: 1000 @@ -558,6 +558,8 @@ MRJ: Explodes: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall + JamsRadar: + Range: 15 1TNK.Husk: Inherits: ^Husk From 88b59d5033f69a386438b57ef9e31b57edf192c1 Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Sat, 20 Apr 2013 00:43:51 +1200 Subject: [PATCH 2/5] Add missile jamming to MRJ --- OpenRA.Mods.RA/Effects/Missile.cs | 34 +++++++++++++++++++++------- OpenRA.Mods.RA/JamsMissiles.cs | 32 ++++++++++++++++++++++++++ OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 3 ++- mods/ra/rules/vehicles.yaml | 12 ++++++---- 4 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 OpenRA.Mods.RA/JamsMissiles.cs diff --git a/OpenRA.Mods.RA/Effects/Missile.cs b/OpenRA.Mods.RA/Effects/Missile.cs index 88bedf524a..82af5b8151 100755 --- a/OpenRA.Mods.RA/Effects/Missile.cs +++ b/OpenRA.Mods.RA/Effects/Missile.cs @@ -41,8 +41,9 @@ namespace OpenRA.Mods.RA.Effects public readonly Color ContrailColor = Color.White; public readonly bool ContrailUsePlayerColor = false; public readonly int ContrailDelay = 1; + public readonly bool Jammable = true; - public IEffect Create(ProjectileArgs args) { return new Missile( this, args ); } + public IEffect Create(ProjectileArgs args) { return new Missile(this, args); } } class Missile : IEffect @@ -90,27 +91,44 @@ namespace OpenRA.Mods.RA.Effects const int MissileCloseEnough = 7; int ticksToNextSmoke; - public void Tick( World world ) + public void Tick(World world) { t += 40; // In pixels var dist = Args.target.CenterLocation + offset - PxPosition; - var targetAltitude = 0; + var targetAltitude = 0; if (Args.target.IsValid && Args.target.IsActor && Args.target.Actor.HasTrait()) - targetAltitude = Args.target.Actor.Trait().Altitude; + targetAltitude = Args.target.Actor.Trait().Altitude; - Altitude += Math.Sign(targetAltitude - Altitude); + var jammed = Info.Jammable && world.ActorsWithTrait().Any(tp => + (tp.Actor.CenterLocation - PxPosition).ToCVec().Length <= tp.Trait.Range - if (Args.target.IsValid) + && (tp.Actor.Owner.Stances[Args.firedBy.Owner] != Stance.Ally + || (tp.Actor.Owner.Stances[Args.firedBy.Owner] == Stance.Ally && tp.Trait.AlliedMissiles)) + + && world.SharedRandom.Next(100 / tp.Trait.Chance) == 0); + + if (!jammed) + { + Altitude += Math.Sign(targetAltitude - Altitude); + if (Args.target.IsValid) + Facing = Traits.Util.TickFacing(Facing, + Traits.Util.GetFacing(dist, Facing), + Info.ROT); + } + else + { + Altitude += world.SharedRandom.Next(-1, 2); Facing = Traits.Util.TickFacing(Facing, - Traits.Util.GetFacing(dist, Facing), + Facing + world.SharedRandom.Next(-20, 21), Info.ROT); + } anim.Tick(); - if (dist.LengthSquared < MissileCloseEnough * MissileCloseEnough && Args.target.IsValid ) + if (dist.LengthSquared < MissileCloseEnough * MissileCloseEnough && Args.target.IsValid) Explode(world); // TODO: Replace this with a lookup table diff --git a/OpenRA.Mods.RA/JamsMissiles.cs b/OpenRA.Mods.RA/JamsMissiles.cs new file mode 100644 index 0000000000..34c8f0be15 --- /dev/null +++ b/OpenRA.Mods.RA/JamsMissiles.cs @@ -0,0 +1,32 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using OpenRA; +using OpenRA.Traits; + +class JamsMissilesInfo : ITraitInfo +{ + public readonly int Range = 0; + public readonly bool AlliedMissiles = true; + public readonly int Chance = 100; + + public object Create(ActorInitializer init) { return new JamsMissiles(this); } +} + +class JamsMissiles +{ + readonly JamsMissilesInfo info; + + public int Range { get { return info.Range; } } + public bool AlliedMissiles { get { return info.AlliedMissiles; } } + public int Chance { get { return info.Chance; } } + + public JamsMissiles(JamsMissilesInfo info) { this.info = info; } +} \ No newline at end of file diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 7f6c9ee5d3..737680152a 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -1,4 +1,4 @@ - + Debug @@ -233,6 +233,7 @@ + diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index d00df0b815..90bc492d64 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -490,7 +490,7 @@ MGG: Inherits: ^Vehicle Buildable: Queue: Vehicle - BuildPaletteOrder: 150 + BuildPaletteOrder: 160 Prerequisites: atek Owner: allies Hotkey: y @@ -537,11 +537,13 @@ MRJ: Cost: 1000 Tooltip: Name: Mobile Radar Jammer - Description: Jams nearby enemy radar domes. + Description: Jams enemy radar and deflects missiles.\n Unarmed Buildable: Queue: Vehicle - BuildPaletteOrder: 1000 - Owner: None + BuildPaletteOrder: 150 + Prerequisites: atek + Owner: allies + Hotkey: m Health: HP: 200 Armor: @@ -560,6 +562,8 @@ MRJ: EmptyWeapon: UnitExplodeSmall JamsRadar: Range: 15 + JamsMissiles: + Range: 3 1TNK.Husk: Inherits: ^Husk From 4d2ccb811ae5d7c05a8a00c2d4eaecfcb1cc421a Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Sat, 20 Apr 2013 02:54:40 +1200 Subject: [PATCH 3/5] Add RenderJammerCircle --- OpenRA.Mods.RA/JamsMissiles.cs | 29 +++++++------ OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 1 + OpenRA.Mods.RA/RenderJammerCircle.cs | 63 ++++++++++++++++++++++++++++ mods/ra/rules/vehicles.yaml | 1 + 4 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 OpenRA.Mods.RA/RenderJammerCircle.cs diff --git a/OpenRA.Mods.RA/JamsMissiles.cs b/OpenRA.Mods.RA/JamsMissiles.cs index 34c8f0be15..0f04fdd1ef 100644 --- a/OpenRA.Mods.RA/JamsMissiles.cs +++ b/OpenRA.Mods.RA/JamsMissiles.cs @@ -11,22 +11,25 @@ using OpenRA; using OpenRA.Traits; -class JamsMissilesInfo : ITraitInfo +namespace OpenRA.Mods.RA { - public readonly int Range = 0; - public readonly bool AlliedMissiles = true; - public readonly int Chance = 100; + class JamsMissilesInfo : ITraitInfo + { + public readonly int Range = 0; + public readonly bool AlliedMissiles = true; + public readonly int Chance = 100; - public object Create(ActorInitializer init) { return new JamsMissiles(this); } -} + public object Create(ActorInitializer init) { return new JamsMissiles(this); } + } -class JamsMissiles -{ - readonly JamsMissilesInfo info; + class JamsMissiles + { + readonly JamsMissilesInfo info; - public int Range { get { return info.Range; } } - public bool AlliedMissiles { get { return info.AlliedMissiles; } } - public int Chance { get { return info.Chance; } } + public int Range { get { return info.Range; } } + public bool AlliedMissiles { get { return info.AlliedMissiles; } } + public int Chance { get { return info.Chance; } } - public JamsMissiles(JamsMissilesInfo info) { this.info = info; } + public JamsMissiles(JamsMissilesInfo info) { this.info = info; } + } } \ No newline at end of file diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 737680152a..9af3413a88 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -302,6 +302,7 @@ + diff --git a/OpenRA.Mods.RA/RenderJammerCircle.cs b/OpenRA.Mods.RA/RenderJammerCircle.cs new file mode 100644 index 0000000000..b70c985f92 --- /dev/null +++ b/OpenRA.Mods.RA/RenderJammerCircle.cs @@ -0,0 +1,63 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Drawing; +using OpenRA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA +{ + //todo: remove all the Render*Circle duplication + class RenderJammerCircleInfo : TraitInfo, IPlaceBuildingDecoration + { + public void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation) + { + var jamsMissiles = ai.Traits.GetOrDefault(); + if (jamsMissiles != null) + RenderJammerCircle.DrawRangeCircle(wr, centerLocation.ToFloat2(), jamsMissiles.Range, Color.Red); + + var jamsRadar = ai.Traits.GetOrDefault(); + if (jamsRadar != null) + RenderJammerCircle.DrawRangeCircle(wr, centerLocation.ToFloat2(), jamsRadar.Range, Color.Blue); + + foreach (var a in w.ActorsWithTrait()) + if (a.Actor.Owner == a.Actor.World.LocalPlayer) + a.Trait.RenderBeforeWorld(wr, a.Actor); + } + } + + public class RenderJammerCircle : IPreRenderSelection + { + public void RenderBeforeWorld(WorldRenderer wr, Actor self) + { + if (self.Owner != self.World.LocalPlayer) + return; + + var jamsMissiles = self.Info.Traits.GetOrDefault(); + if (jamsMissiles != null) + DrawRangeCircle(wr, self.CenterLocation.ToFloat2(), jamsMissiles.Range, Color.Red); + + var jamsRadar = self.Info.Traits.GetOrDefault(); + if (jamsRadar != null) + DrawRangeCircle(wr, self.CenterLocation.ToFloat2(), jamsRadar.Range, Color.Blue); + } + + public static void DrawRangeCircle(WorldRenderer wr, float2 location, int range, Color color) + { + wr.DrawRangeCircleWithContrast( + Color.FromArgb(128, color), + location, + range, + Color.FromArgb(96, Color.Black), + 1); + } + } +} + diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index 90bc492d64..c3d6028568 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -564,6 +564,7 @@ MRJ: Range: 15 JamsMissiles: Range: 3 + RenderJammerCircle: 1TNK.Husk: Inherits: ^Husk From f41b03cdfa8b5621e0d1f92d0d059f530f4cf77e Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Sat, 20 Apr 2013 02:54:55 +1200 Subject: [PATCH 4/5] Fix JamsRadar jamming allies --- OpenRA.Mods.RA/ProvidesRadar.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.RA/ProvidesRadar.cs b/OpenRA.Mods.RA/ProvidesRadar.cs index 05be93ab1a..7ab699db49 100755 --- a/OpenRA.Mods.RA/ProvidesRadar.cs +++ b/OpenRA.Mods.RA/ProvidesRadar.cs @@ -26,14 +26,14 @@ namespace OpenRA.Mods.RA // Check if powered if (self.IsDisabled()) return false; - var isJammed = self.World.ActorsWithTrait().Any(a => self.Owner != a.Actor.Owner - && (self.Location - a.Actor.Location).Length < a.Actor.Info.Traits.Get().Range); + var isJammed = self.World.ActorsWithTrait().Any(a => a.Actor.Owner.Stances[self.Owner] != Stance.Ally + && (self.Location - a.Actor.Location).Length <= a.Actor.Info.Traits.Get().Range); return !isJammed; } } - class JamsRadarInfo : TraitInfo { public readonly int Range = 0; } + class JamsRadarInfo : TraitInfo { public readonly int Range = 0; } class JamsRadar { } } From 51b485dd2ea5ee2dfc22c49ae0b45edec25483cf Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Sat, 20 Apr 2013 03:26:28 +1200 Subject: [PATCH 5/5] Adjust MRJ tooltip description --- mods/ra/rules/vehicles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index c3d6028568..d35f345e27 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -537,7 +537,7 @@ MRJ: Cost: 1000 Tooltip: Name: Mobile Radar Jammer - Description: Jams enemy radar and deflects missiles.\n Unarmed + Description: Jams nearby enemy radar domes\nand deflects incoming missiles.\n Unarmed Buildable: Queue: Vehicle BuildPaletteOrder: 150