Implementation of the automated D2k Carryall

Closes #2246
This commit is contained in:
Matthijs Benschop
2014-11-20 16:14:29 +01:00
parent 71a8815ffb
commit 2d380c64bd
22 changed files with 681 additions and 21 deletions

View File

@@ -14,7 +14,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA.Activities
{
class HeliFly : Activity
public class HeliFly : Activity
{
readonly Helicopter helicopter;
readonly Target target;

View File

@@ -0,0 +1,45 @@
#region Copyright & License Information
/*
* Copyright 2007-2014 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 System.Collections.Generic;
using OpenRA.Traits;
using OpenRA.Mods.RA.Activities;
using OpenRA.Mods.RA.Traits;
namespace OpenRA.Mods.RA.Activities
{
public class HeliFlyCircle : Activity
{
readonly Helicopter helicopter;
public HeliFlyCircle(Actor self)
{
helicopter = self.Trait<Helicopter>();
}
public override Activity Tick(Actor self)
{
if (IsCanceled)
return NextActivity;
if (HeliFly.AdjustAltitude(self, helicopter, helicopter.Info.CruiseAltitude))
return this;
var move = helicopter.FlyStep(helicopter.Facing);
helicopter.SetPosition(self, helicopter.CenterPosition + move);
var desiredFacing = helicopter.Facing + 64;
helicopter.Facing = Util.TickFacing(helicopter.Facing, desiredFacing, helicopter.ROT / 3);
return this;
}
}
}

View File

@@ -13,7 +13,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA.Activities
{
class HeliLand : Activity
public class HeliLand : Activity
{
bool requireSpace;

View File

@@ -9,6 +9,7 @@
#endregion
using System.Drawing;
using OpenRA.Mods.Common;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Activities
@@ -55,7 +56,14 @@ namespace OpenRA.Mods.RA.Activities
self.SetTargetLine(Target.FromActor(proc), Color.Green, false);
if (self.Location != proc.Location + iao.DeliverOffset)
{
var notify = self.TraitsImplementing<INotifyHarvesterAction>();
var next = new DeliverResources();
foreach (var n in notify)
n.MovingToRefinery(self, proc.Location + iao.DeliverOffset, next);
return Util.SequenceActivities(movement.MoveTo(proc.Location + iao.DeliverOffset, 0), this);
}
if (!isDocking)
{

View File

@@ -111,6 +111,12 @@ namespace OpenRA.Mods.RA.Activities
harv.LastOrderLocation = path[0];
self.SetTargetLine(Target.FromCell(self.World, path[0]), Color.Red, false);
var notify = self.TraitsImplementing<INotifyHarvesterAction>();
var next = new FindResources();
foreach (var n in notify)
n.MovingToResources(self, path[0], next);
return Util.SequenceActivities(mobile.MoveTo(path[0], 1), new HarvestResource(), new FindResources());
}
@@ -163,7 +169,7 @@ namespace OpenRA.Mods.RA.Activities
harv.AcceptResource(resource);
foreach (var t in self.TraitsImplementing<INotifyHarvest>())
foreach (var t in self.TraitsImplementing<INotifyHarvesterAction>())
t.Harvested(self, resource);
return Util.SequenceActivities(new Wait(harvInfo.LoadTicksPerBale), this);

View File

@@ -176,7 +176,12 @@ namespace OpenRA.Mods.RA
var territory = self.World.WorldActor.TraitOrDefault<ResourceClaimLayer>();
if (territory != null) territory.ClaimResource(self, moveTo);
self.QueueActivity(new FindResources());
var notify = self.TraitsImplementing<INotifyHarvesterAction>();
var next = new FindResources();
foreach (var n in notify)
n.MovingToResources(self, moveTo, next);
self.QueueActivity(next);
return;
}
}
@@ -302,6 +307,11 @@ namespace OpenRA.Mods.RA
self.QueueActivity(mobile.MoveTo(loc, 0));
self.SetTargetLine(Target.FromCell(self.World, loc), Color.Red);
var notify = self.TraitsImplementing<INotifyHarvesterAction>();
var next = new FindResources();
foreach (var n in notify)
n.MovingToResources(self, loc, next);
LastOrderLocation = loc;
}
else
@@ -341,9 +351,18 @@ namespace OpenRA.Mods.RA
self.CancelActivity();
self.QueueActivity(new DeliverResources());
var notify = self.TraitsImplementing<INotifyHarvesterAction>();
var next = new FindResources();
foreach (var n in notify)
n.MovingToResources(self, order.TargetLocation, next);
}
else if (order.OrderString == "Stop" || order.OrderString == "Move")
{
var notify = self.TraitsImplementing<INotifyHarvesterAction>();
foreach (var n in notify)
n.MovementCancelled(self);
// Turn off idle smarts to obey the stop/move:
idleSmart = false;
}

View File

@@ -476,6 +476,7 @@
<Compile Include="UtilityCommands\ExportCharacterSeparatedRules.cs" />
<Compile Include="UtilityCommands\Extensions.cs" />
<Compile Include="Lint\CheckMapRules.cs" />
<Compile Include="Activities\Air\HeliFlyCircle.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">

View File

@@ -10,6 +10,7 @@
using OpenRA.Graphics;
using OpenRA.Traits;
using OpenRA.Mods.Common;
namespace OpenRA.Mods.RA.Render
{
@@ -19,7 +20,7 @@ namespace OpenRA.Mods.RA.Render
public override object Create(ActorInitializer init) { return new RenderHarvester(init.self, this); }
}
class RenderHarvester : RenderUnit, INotifyHarvest
class RenderHarvester : RenderUnit, INotifyHarvesterAction
{
Harvester harv;
RenderHarvesterInfo info;
@@ -51,5 +52,9 @@ namespace OpenRA.Mods.RA.Render
if (DefaultAnimation.CurrentSequence.Name != "harvest")
PlayCustomAnim(self, "harvest");
}
public void MovingToResources(Actor self, CPos targetCell, Activity next) { }
public void MovingToRefinery(Actor self, CPos targetCell, Activity next) { }
public void MovementCancelled(Actor self) { }
}
}

View File

@@ -9,6 +9,7 @@
#endregion
using OpenRA.Graphics;
using OpenRA.Mods.Common;
using OpenRA.Mods.Common.Traits.Render;
using OpenRA.Traits;
@@ -26,7 +27,7 @@ namespace OpenRA.Mods.RA.Render
public object Create(ActorInitializer init) { return new WithHarvestAnimation(init.self, this); }
}
class WithHarvestAnimation : INotifyHarvest
class WithHarvestAnimation : INotifyHarvesterAction
{
WithHarvestAnimationInfo info;
Animation anim;
@@ -55,5 +56,9 @@ namespace OpenRA.Mods.RA.Render
visible = true;
anim.PlayThen(info.Sequence, () => visible = false);
}
public void MovingToResources(Actor self, CPos targetCell, Activity next) { }
public void MovingToRefinery(Actor self, CPos targetCell, Activity next) { }
public void MovementCancelled(Actor self) { }
}
}

View File

@@ -18,7 +18,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA.Traits
{
class HelicopterInfo : AircraftInfo, IMoveInfo
public class HelicopterInfo : AircraftInfo, IMoveInfo
{
[Desc("Allow the helicopter land after it has no more commands.")]
public readonly bool LandWhenIdle = true;
@@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA.Traits
public override object Create(ActorInitializer init) { return new Helicopter(init, this); }
}
class Helicopter : Aircraft, ITick, IResolveOrder, IMove
public class Helicopter : Aircraft, ITick, IResolveOrder, IMove
{
public HelicopterInfo Info;
Actor self;