From be9948426c811b7f7942d3d587393a721a801c23 Mon Sep 17 00:00:00 2001 From: Curtis S Date: Sat, 10 Sep 2011 16:41:40 -0600 Subject: [PATCH] 1078: Added ally repairing for CNC and RA --- .../Buildings/RepairableBuilding.cs | 48 +++++++++++------- OpenRA.Mods.RA/Effects/RepairIndicator.cs | 34 ++++++++----- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 1 + OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs | 24 ++++----- OpenRA.Mods.RA/Player/AllyRepair.cs | 35 +++++++++++++ mods/cnc/bits/allyrepair.shp | Bin 0 -> 3635 bytes mods/cnc/rules/system.yaml | 1 + mods/cnc/sequences/misc.yaml | 6 +++ mods/ra/bits/allyrepair.shp | Bin 0 -> 3635 bytes mods/ra/rules/system.yaml | 1 + mods/ra/sequences.yaml | 6 +++ 11 files changed, 115 insertions(+), 41 deletions(-) create mode 100644 OpenRA.Mods.RA/Player/AllyRepair.cs create mode 100644 mods/cnc/bits/allyrepair.shp create mode 100644 mods/ra/bits/allyrepair.shp diff --git a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs index 1c0554207b..a3d24fc7b4 100755 --- a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs +++ b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs @@ -22,11 +22,11 @@ namespace OpenRA.Mods.RA.Buildings public object Create(ActorInitializer init) { return new RepairableBuilding(init.self, this); } } - public class RepairableBuilding : ITick, IResolveOrder, ISync + public class RepairableBuilding : ITick, ISync { [Sync] - bool isRepairing = false; - + public Player Repairer = null; + Health Health; RepairableBuildingInfo Info; public RepairableBuilding(Actor self, RepairableBuildingInfo info) @@ -34,42 +34,56 @@ namespace OpenRA.Mods.RA.Buildings Health = self.Trait(); Info = info; } - - public void ResolveOrder(Actor self, Order order) + + public void RepairBuilding(Actor self, Player p) { - if (order.OrderString == "Repair") + if (self.HasTrait()) { - isRepairing = !isRepairing; - if (isRepairing) - Sound.PlayToPlayer(self.Owner, self.World.WorldActor.Info.Traits.Get().Repairing); + if (self.AppearsFriendlyTo(p.PlayerActor)) + { + if (Repairer == p) + Repairer = null; + + else + { + Repairer = p; + Sound.PlayToPlayer(Repairer, p.World.WorldActor.Info.Traits.Get().Repairing); + + self.World.AddFrameEndTask( + w => w.Add(new RepairIndicator(self, p))); + } + } } } int remainingTicks; public void Tick(Actor self) { - if (!isRepairing) return; + if (Repairer == null) return; if (remainingTicks == 0) { + if (Repairer.WinState != WinState.Undefined) + { + Repairer = null; + return; + } + var buildingValue = self.GetSellValue(); var hpToRepair = Math.Min(Info.RepairStep, Health.MaxHP - Health.HP); var cost = (hpToRepair * Info.RepairPercent * buildingValue) / (Health.MaxHP * 100); - if (!self.Owner.PlayerActor.Trait().TakeCash(cost)) + if (!Repairer.PlayerActor.Trait().TakeCash(cost)) { remainingTicks = 1; return; } - self.World.AddFrameEndTask( - w => w.Add(new RepairIndicator(self, Info.RepairInterval / 2))); - self.InflictDamage(self, -hpToRepair, null); if (Health.DamageState == DamageState.Undamaged) { - isRepairing = false; + Repairer = null; return; } @@ -79,7 +93,7 @@ namespace OpenRA.Mods.RA.Buildings --remainingTicks; } } - public class AllowsBuildingRepairInfo : TraitInfo {} - public class AllowsBuildingRepair {} + public class AllowsBuildingRepairInfo : TraitInfo { } + public class AllowsBuildingRepair { } } diff --git a/OpenRA.Mods.RA/Effects/RepairIndicator.cs b/OpenRA.Mods.RA/Effects/RepairIndicator.cs index 4b177f00f3..fe021a5bf1 100755 --- a/OpenRA.Mods.RA/Effects/RepairIndicator.cs +++ b/OpenRA.Mods.RA/Effects/RepairIndicator.cs @@ -18,27 +18,37 @@ namespace OpenRA.Mods.RA.Effects { class RepairIndicator : IEffect { - int framesLeft; - Actor a; - Animation anim = new Animation("select"); + Actor building; + Player player; + Animation anim = new Animation("allyrepair"); - public RepairIndicator(Actor a, int frames) - { - this.a = a; anim.PlayRepeating("repair"); - framesLeft = frames; + public RepairIndicator(Actor building, Player player) + { + this.building = building; + this.player = player; + anim.PlayRepeating("repair"); } - public void Tick( World world ) + public void Tick(World world) { - if (--framesLeft == 0 || !a.IsInWorld || a.IsDead()) + if (!building.IsInWorld || + building.IsDead() || + building.Trait().Repairer == null || + building.Trait().Repairer != player) world.AddFrameEndTask(w => w.Remove(this)); + + anim.Tick(); } public IEnumerable Render() { - if (!a.Destroyed) - yield return new Renderable(anim.Image, - a.CenterLocation - .5f * anim.Image.size, "chrome", (int)a.CenterLocation.Y); + if (!building.Destroyed) + { + var palette = building.Trait().Palette(player); + + yield return new Renderable(anim.Image, + building.CenterLocation - .5f * anim.Image.size, palette, (int)building.CenterLocation.Y); + } } } } diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 3ba1f5c060..db6d0d8a17 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -72,6 +72,7 @@ + diff --git a/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs b/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs index 4740d38d0c..c91640398f 100644 --- a/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs @@ -31,36 +31,36 @@ namespace OpenRA.Mods.RA.Orders if (mi.Button == MouseButton.Left) { var underCursor = world.FindUnitsAtMouse(mi.Location) - .Where(a => a.Owner == world.LocalPlayer && a.HasTrait()).FirstOrDefault(); + .Where(a => a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && a.HasTrait()).FirstOrDefault(); if (underCursor == null) yield break; - + if (underCursor.Info.Traits.Contains() - && underCursor.GetDamageState() > DamageState.Undamaged) - yield return new Order("Repair", underCursor, false); + && underCursor.GetDamageState() > DamageState.Undamaged) + yield return new Order("RepairBuilding", world.LocalPlayer.PlayerActor, false) { TargetActor = underCursor }; } } - public void Tick( World world ) + public void Tick(World world) { - if( !PlayerIsAllowedToRepair( world ) ) + if (!PlayerIsAllowedToRepair(world)) world.CancelInputMode(); } - public static bool PlayerIsAllowedToRepair( World world ) - { + public static bool PlayerIsAllowedToRepair(World world) + { return world.ActorsWithTrait() - .Any(a => a.Actor.Owner == world.LocalPlayer); + .Any(a => a.Actor.AppearsFriendlyTo(world.LocalPlayer.PlayerActor)); } - public void RenderAfterWorld( WorldRenderer wr, World world ) { } - public void RenderBeforeWorld( WorldRenderer wr, World world ) { } + public void RenderAfterWorld(WorldRenderer wr, World world) { } + public void RenderBeforeWorld(WorldRenderer wr, World world) { } public string GetCursor(World world, int2 xy, MouseInput mi) { mi.Button = MouseButton.Left; - return OrderInner(world, xy, mi).Any() + return OrderInner(world, xy, mi).Any() ? "repair" : "repair-blocked"; } } diff --git a/OpenRA.Mods.RA/Player/AllyRepair.cs b/OpenRA.Mods.RA/Player/AllyRepair.cs new file mode 100644 index 0000000000..628c17d054 --- /dev/null +++ b/OpenRA.Mods.RA/Player/AllyRepair.cs @@ -0,0 +1,35 @@ +#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; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Mods.RA.Effects; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA +{ + class AllyRepairInfo : TraitInfo { } + + class AllyRepair : IResolveOrder + { + public void ResolveOrder(Actor self, Order order) + { + if (order.OrderString == "RepairBuilding") + { + var building = order.TargetActor; + + if (building.HasTrait()) + if (building.AppearsFriendlyTo(self)) + building.Trait().RepairBuilding(building, self.Owner); + } + } + + } +} diff --git a/mods/cnc/bits/allyrepair.shp b/mods/cnc/bits/allyrepair.shp new file mode 100644 index 0000000000000000000000000000000000000000..6dfc1e53f20402d6f20d1c152cdb5882480dc664 GIT binary patch literal 3635 zcmeH}y^Y*36odsB2N*D5#Rjem2g0%dcfkg(3T3Y2Iv`Ue3|NF+j=$mGi4-^RI&rW( z+)~nT-pqS^%hk)G@w$9V^N(fOb+LZR^Y52Dzkkm2+m}3l|C*M!kI=3jyJ&o)F^^%) z?wp&00n8tBY%$LNx&wi^9V{#}SwN2)W4yocg&mO4P5hJRY}EVX@T0IX2R!fecebni z3r(1pr#z6*Aaw#7bK|-}8^O}>p^L_XB$Tm~VC86*2fWG0amzrfzY2nk*@2r-B~wT} zV{(O8k?dc0H(%QA!L9HahV`w+F#@NzCzd7LLzMEmz|<7c7oe-nr@eQZVvQ2EB% zXzesvW25$M3Yrkr$Z<;CEPEr`RdzAa`5ju=Cb9;ivlhsYvPKw!)*jA_f2w0KN|&&w zNw|T8N*$S6x!J{6;6D(P-^6y zyWBPZ6og{I#$pw!_9-N}VwA>;TYZ{l_}HPwTcjaJqDs#)L-PKLDL}v!`As*FQd7%0 zPpZ;w{*#;bk-NOz-oJRLktJ=1nAJ#JHAXZow(F|BS>r&}Z46-kxJTqf7VRp##Fc%6 z79>2%T0qa^b!F;ht%xx3$j=kG zHAT7jZ%^dWsP1bc>*xQ{t6R3dtxaM`W;v90Z5+6GT`!oGutuq5h|0sam=`7Rz?~jHrz3`bW%?j5`;< z?rLOt8^NIoDJw?_RDJ@nk*BaUu#~54DQiav932~L3>+!omax69DFs-BWf-CUV5Xn` zRVa(kcQY6|V!t|qu7;1~M}V<2)&oNuS=U{s8h9hGQr8LFooV)k&a9EUJlD^>dRj4O zDI}wy9Ff5uau6KOPmndCt_wz0sQ;;0+~<&ZUJ%{$Z$xEW*Y7|UEXlZY@$0TemXjkm zG$HZ_HXLI9U_XGS@NptPPGoPC!{T>O