From a96d67c5e7eba1be9a3627bb3941da704e41854a Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 20 Mar 2010 17:32:15 +1300 Subject: [PATCH] DeliverOre hacking --- OpenRA.Game/Traits/Activities/DeliverOre.cs | 55 ++++++++++++--------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/OpenRA.Game/Traits/Activities/DeliverOre.cs b/OpenRA.Game/Traits/Activities/DeliverOre.cs index 1656c7125e..454b83f6ad 100644 --- a/OpenRA.Game/Traits/Activities/DeliverOre.cs +++ b/OpenRA.Game/Traits/Activities/DeliverOre.cs @@ -36,6 +36,33 @@ namespace OpenRA.Traits.Activities this.refinery = refinery; } + Actor ChooseRefinery(Actor self) + { + var mobile = self.traits.Get(); + + var search = new PathSearch + { + heuristic = PathSearch.DefaultEstimator(self.Location), + umt = mobile.GetMovementType(), + checkForBlocked = false, + }; + var refineries = self.World.Queries.OwnedBy[self.Owner] + .Where(x => x.traits.Contains()) + .ToList(); + if (refinery != null) + search.AddInitialCell(self.World, refinery.Location + refinery.traits.Get().DeliverOffset); + else + foreach (var r in refineries) + search.AddInitialCell(self.World, r.Location + r.traits.Get().DeliverOffset); + + var path = self.World.PathFinder.FindPath(search); + path.Reverse(); + if (path.Count != 0) + return refineries.FirstOrDefault(x => x.Location + x.traits.Get().DeliverOffset == path[0]); + else + return null; + } + public IActivity Tick( Actor self ) { var mobile = self.traits.Get(); @@ -48,31 +75,11 @@ namespace OpenRA.Traits.Activities if( refinery == null || self.Location != refinery.Location + refinery.traits.Get().DeliverOffset ) { - var search = new PathSearch - { - heuristic = PathSearch.DefaultEstimator( self.Location ), - umt = mobile.GetMovementType(), - checkForBlocked = false, - }; - var refineries = self.World.Queries.OwnedBy[self.Owner] - .Where(x => x.traits.Contains()) - .ToList(); - if( refinery != null ) - search.AddInitialCell(self.World, refinery.Location + refinery.traits.Get().DeliverOffset); - else - foreach( var r in refineries ) - search.AddInitialCell(self.World, r.Location + r.traits.Get().DeliverOffset); + refinery = ChooseRefinery(self); + if (refinery == null) + return this; // todo: back off for a while! - var path = self.World.PathFinder.FindPath( search ); - path.Reverse(); - if( path.Count != 0 ) - { - refinery = refineries.FirstOrDefault(x => x.Location + x.traits.Get().DeliverOffset == path[0]); - return new Move( () => path ) { NextActivity = this }; - } - else - // no refineries reachable? - return this; + return new Move(refinery.Location + refinery.traits.Get().DeliverOffset, 0) { NextActivity = this }; } else if (!isDocking) {