From 83fc70f4156d08683c9ad09d58e4aae7cecb6cda Mon Sep 17 00:00:00 2001 From: Curtis Shmyr Date: Thu, 11 Oct 2012 21:30:18 -0600 Subject: [PATCH] Added Chrono Tank to Allies --- OpenRA.Mods.RA/ChronoshiftDeploy.cs | 102 ++++++++++++++---- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 3 +- .../Orders/SetChronoTankDestination.cs | 57 ---------- mods/ra/bits/ctnk.shp | Bin 0 -> 13810 bytes mods/ra/bits/ctnkicon.shp | Bin 0 -> 2564 bytes mods/ra/rules/vehicles.yaml | 31 ++++++ mods/ra/sequences.yaml | 5 + mods/ra/weapons.yaml | 31 ++++++ 8 files changed, 152 insertions(+), 77 deletions(-) delete mode 100644 OpenRA.Mods.RA/Orders/SetChronoTankDestination.cs create mode 100644 mods/ra/bits/ctnk.shp create mode 100644 mods/ra/bits/ctnkicon.shp diff --git a/OpenRA.Mods.RA/ChronoshiftDeploy.cs b/OpenRA.Mods.RA/ChronoshiftDeploy.cs index a6837e000b..9be7a0473d 100644 --- a/OpenRA.Mods.RA/ChronoshiftDeploy.cs +++ b/OpenRA.Mods.RA/ChronoshiftDeploy.cs @@ -8,23 +8,34 @@ */ #endregion +using System.Drawing; using System.Collections.Generic; using OpenRA.Effects; using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Orders; using OpenRA.Traits; +using OpenRA.Graphics; namespace OpenRA.Mods.RA { - class ChronoshiftDeployInfo : TraitInfo + class ChronoshiftDeployInfo : ITraitInfo { - public readonly int ChargeTime = 120; // Seconds + public readonly int ChargeTime = 60; // seconds + public readonly int JumpDistance = 10; + public object Create(ActorInitializer init) { return new ChronoshiftDeploy(init.self, this); } } class ChronoshiftDeploy : IIssueOrder, IResolveOrder, ITick, IPips, IOrderVoice, ISync { - // Recharge logic - [Sync] int chargeTick = 0; // How long until we can chronoshift again? + [Sync] int chargeTick = 0; + public readonly ChronoshiftDeployInfo Info; + readonly Actor self; + + public ChronoshiftDeploy(Actor self, ChronoshiftDeployInfo info) + { + this.self = self; + this.Info = info; + } public void Tick(Actor self) { @@ -34,29 +45,28 @@ namespace OpenRA.Mods.RA public IEnumerable Orders { - get { yield return new DeployOrderTargeter( "ChronoshiftDeploy", 5, () => chargeTick <= 0 ); } + get { yield return new DeployOrderTargeter("ChronoshiftJump", 5, () => chargeTick <= 0); } } - public Order IssueOrder( Actor self, IOrderTargeter order, Target target, bool queued ) + public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { - if( order.OrderID == "ChronoshiftDeploy" ) - if (chargeTick <= 0) - self.World.OrderGenerator = new SetChronoTankDestination( self ); + if (order.OrderID == "ChronoshiftJump" && chargeTick <= 0) + self.World.OrderGenerator = new ChronoTankOrderGenerator(self); - return null; + return new Order("ChronoshiftJump", self, false); // Hack until we can return null } public void ResolveOrder(Actor self, Order order) { var movement = self.TraitOrDefault(); - if (order.OrderString == "ChronoshiftSelf" && movement.CanEnterCell(order.TargetLocation)) + if (order.OrderString == "ChronoshiftJump") { - if (self.Owner == self.World.LocalPlayer) - self.World.CancelInputMode(); - - self.CancelActivity(); - self.QueueActivity(new Teleport(null, order.TargetLocation, true)); - chargeTick = 25 * self.Info.Traits.Get().ChargeTime; + if (CanJumpTo(order.TargetLocation)) + { + self.CancelActivity(); + self.QueueActivity(new Teleport(null, order.TargetLocation, true)); + chargeTick = 25 * Info.ChargeTime; + } } } @@ -71,7 +81,7 @@ namespace OpenRA.Mods.RA const int numPips = 5; for (int i = 0; i < numPips; i++) { - if ((1 - chargeTick * 1.0f / (25 * self.Info.Traits.Get().ChargeTime)) * numPips < i + 1) + if ((1 - chargeTick * 1.0f / (25 * Info.ChargeTime)) * numPips < i + 1) { yield return PipType.Transparent; continue; @@ -93,5 +103,61 @@ namespace OpenRA.Mods.RA } } } + + public bool CanJumpTo(CPos xy) + { + var movement = self.TraitOrDefault(); + + if (chargeTick <= 0 // Can jump + && self.World.LocalPlayer.Shroud.IsExplored(xy) // Not in shroud + && movement.CanEnterCell(xy) // Can enter cell + && (self.Location - xy).Length <= Info.JumpDistance) // Within jump range + return true; + else + return false; + } + } + + class ChronoTankOrderGenerator : IOrderGenerator + { + readonly Actor self; + + public ChronoTankOrderGenerator(Actor self) { this.self = self; } + + public IEnumerable Order(World world, CPos xy, MouseInput mi) + { + if (mi.Button == MouseButton.Left) + { + world.CancelInputMode(); + yield break; + } + + var queued = mi.Modifiers.HasModifier(Modifiers.Shift); + + var cinfo = self.Trait(); + if (cinfo.CanJumpTo(xy)) + { + self.World.CancelInputMode(); + yield return new Order("ChronoshiftJump", self, queued) { TargetLocation = xy }; + } + } + + public string GetCursor(World world, CPos xy, MouseInput mi) + { + var cinfo = self.Trait(); + if (cinfo.CanJumpTo(xy)) + return "chrono-target"; + else + return "move-blocked"; + } + + public void Tick(World world) { } + public void RenderAfterWorld(WorldRenderer wr, World world) { } + public void RenderBeforeWorld(WorldRenderer wr, World world) + { + wr.DrawRangeCircle( + Color.FromArgb(128, Color.Magenta), + self.CenterLocation.ToFloat2(), (int)self.Trait().Info.JumpDistance); + } } } diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 9394897ea0..bddb801f01 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -254,7 +254,6 @@ - @@ -435,4 +434,4 @@ copy "$(TargetPath)" "$(SolutionDir)mods/ra/" cd "$(SolutionDir)" - + \ No newline at end of file diff --git a/OpenRA.Mods.RA/Orders/SetChronoTankDestination.cs b/OpenRA.Mods.RA/Orders/SetChronoTankDestination.cs deleted file mode 100644 index 20c8ee01cf..0000000000 --- a/OpenRA.Mods.RA/Orders/SetChronoTankDestination.cs +++ /dev/null @@ -1,57 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 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.Collections.Generic; -using System.Drawing; -using OpenRA.Graphics; -using OpenRA.Traits; - -namespace OpenRA.Mods.RA.Orders -{ - class SetChronoTankDestination : IOrderGenerator - { - public readonly Actor self; - - public SetChronoTankDestination(Actor self) - { - this.self = self; - } - - public IEnumerable Order(World world, CPos xy, MouseInput mi) - { - if (mi.Button == MouseButton.Left) - { - world.CancelInputMode(); - yield break; - } - - var queued = mi.Modifiers.HasModifier(Modifiers.Shift); - if (world.LocalPlayer.Shroud.IsExplored(xy)) - yield return new Order("ChronoshiftSelf", self, queued) { TargetLocation = xy }; - } - - public void Tick( World world ) { } - public void RenderAfterWorld( WorldRenderer wr, World world ) - { - wr.DrawSelectionBox(self, Color.White); - } - - public void RenderBeforeWorld( WorldRenderer wr, World world ) { } - - public string GetCursor(World world, CPos xy, MouseInput mi) - { - if (!world.LocalPlayer.Shroud.IsExplored(xy)) - return "move-blocked"; - - var movement = self.TraitOrDefault(); - return (movement.CanEnterCell(xy)) ? "chrono-target" : "move-blocked"; - } - } -} diff --git a/mods/ra/bits/ctnk.shp b/mods/ra/bits/ctnk.shp new file mode 100644 index 0000000000000000000000000000000000000000..51237f3dd043031ec78e73bf510d37a8fc2fa8ec GIT binary patch literal 13810 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 sT8iK(EP|OnLwr77(QG&o*h#a*QxP@j9Qaks