From 3149f3efa281fdbf1f22659699067d3ed511a264 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 23 Dec 2010 14:25:39 +1300 Subject: [PATCH] fix up some of the capturing duplication --- OpenRA.Game/Actor.cs | 12 ++++++++++++ OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs | 14 +++----------- OpenRA.Mods.RA/Activities/CaptureBuilding.cs | 1 + OpenRA.Mods.RA/OreRefineryDockAction.cs | 12 ++---------- OpenRA.Mods.RA/ProximityCapturable.cs | 14 +++++++++----- 5 files changed, 27 insertions(+), 26 deletions(-) diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 571a1a919a..702fb2b1ee 100755 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -189,5 +189,17 @@ namespace OpenRA Destroyed = true; } ); } + + // todo: move elsewhere. + public void ChangeOwner(Player newOwner) + { + World.AddFrameEndTask(w => + { + // momentarily remove from world so the ownership queries don't get confused + w.Remove(this); + Owner = newOwner; + w.Add(this); + }); + } } } diff --git a/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs b/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs index 750a12edff..bac9671519 100644 --- a/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs +++ b/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs @@ -84,17 +84,9 @@ namespace OpenRA.Mods.Cnc } public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner) - { - if (dockedHarv == null) - return; - - dockedHarv.World.AddFrameEndTask(w => - { - // momentarily remove from world so the ownership queries don't get confused - w.Remove(dockedHarv); - dockedHarv.Owner = captor.Owner; - w.Add(dockedHarv); - }); + { + if (dockedHarv != null) + dockedHarv.ChangeOwner(newOwner); } } } diff --git a/OpenRA.Mods.RA/Activities/CaptureBuilding.cs b/OpenRA.Mods.RA/Activities/CaptureBuilding.cs index 419f0ff204..fc8a880682 100644 --- a/OpenRA.Mods.RA/Activities/CaptureBuilding.cs +++ b/OpenRA.Mods.RA/Activities/CaptureBuilding.cs @@ -29,6 +29,7 @@ namespace OpenRA.Mods.RA.Activities if( !target.Trait().OccupiedCells().Any( x => x == self.Location ) ) return NextActivity; + // todo: clean this up self.World.AddFrameEndTask(w => { // momentarily remove from world so the ownership queries don't get confused diff --git a/OpenRA.Mods.RA/OreRefineryDockAction.cs b/OpenRA.Mods.RA/OreRefineryDockAction.cs index aec268a308..2951637a22 100644 --- a/OpenRA.Mods.RA/OreRefineryDockAction.cs +++ b/OpenRA.Mods.RA/OreRefineryDockAction.cs @@ -53,16 +53,8 @@ namespace OpenRA.Mods.RA public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner) { - if (dockedHarv == null) - return; - - dockedHarv.World.AddFrameEndTask(w => - { - // momentarily remove from world so the ownership queries don't get confused - w.Remove(dockedHarv); - dockedHarv.Owner = captor.Owner; - w.Add(dockedHarv); - }); + if (dockedHarv != null) + dockedHarv.ChangeOwner(newOwner); } } } diff --git a/OpenRA.Mods.RA/ProximityCapturable.cs b/OpenRA.Mods.RA/ProximityCapturable.cs index 44a47de647..e69a8db810 100644 --- a/OpenRA.Mods.RA/ProximityCapturable.cs +++ b/OpenRA.Mods.RA/ProximityCapturable.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Linq; using OpenRA.Effects; using OpenRA.Traits; @@ -137,11 +134,18 @@ namespace OpenRA.Mods.RA }); } + static bool AreMutualAllies(Player a, Player b) + { + return a.Stances[b] == Stance.Ally && + b.Stances[a] == Stance.Ally; + } + public static bool IsClear(Actor self, Player currentOwner, int range, Player originalOwner) { var unitsInRange = self.World.FindUnitsInCircle(self.CenterLocation, Game.CellSize * range); - return unitsInRange.Where(a => !a.Destroyed && a.IsInWorld && a != self && !a.Owner.NonCombatant && a.Owner != originalOwner).Where(a => a.Owner != currentOwner).All(a => (a.Owner.Stances[currentOwner] == Stance.Ally) && (currentOwner.Stances[a.Owner] == Stance.Ally)); + return unitsInRange.Where(a => !a.Destroyed && a.IsInWorld && a != self && !a.Owner.NonCombatant && a.Owner != originalOwner) + .Where(a => a.Owner != currentOwner).All(a => AreMutualAllies(a.Owner, currentOwner)); } // TODO exclude other NeutralActor that arent permanent