Add D2k harvester insurance on worm frenzy

This commit is contained in:
penev92
2015-03-14 15:36:32 +02:00
parent 0d05fb5326
commit efee3598f9
4 changed files with 67 additions and 1 deletions

View File

@@ -70,7 +70,23 @@ namespace OpenRA.Mods.D2k.Activities
sandworm.IsAttacking = true;
foreach (var actor in lunch)
actor.World.AddFrameEndTask(_ => actor.Destroy());
{
var actor1 = actor; // loop variable in closure hazard
actor.World.AddFrameEndTask(_ =>
{
actor1.Destroy();
// Harvester insurance
if (!actor1.HasTrait<Harvester>())
return;
var insurance = actor1.Owner.PlayerActor.TraitOrDefault<HarvesterInsurance>();
if (insurance != null)
actor1.World.AddFrameEndTask(__ => insurance.TryActivate());
});
}
positionable.SetPosition(worm, targetLocation);
foreach (var notify in worm.TraitsImplementing<INotifyAttack>())

View File

@@ -79,6 +79,7 @@
<Compile Include="Traits\Buildings\DamagedWithoutFoundation.cs" />
<Compile Include="Traits\Buildings\LaysTerrain.cs" />
<Compile Include="Traits\Carryable.cs" />
<Compile Include="Traits\Player\HarvesterInsurance.cs" />
<Compile Include="Traits\Render\WithCrumbleOverlay.cs" />
<Compile Include="Traits\Render\WithDockingOverlay.cs" />
<Compile Include="Traits\Render\WithDeliveryOverlay.cs" />

View File

@@ -0,0 +1,48 @@
#region Copyright & License Information
/*
* Copyright 2007-2015 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.Linq;
using OpenRA.Mods.Common.Traits;
using OpenRA.Traits;
namespace OpenRA.Mods.D2k.Traits
{
[Desc("A player with this trait will receive a free harvester when his last one gets eaten by a sandworm, provided he has at least one refinery.")]
public class HarvesterInsuranceInfo : ITraitInfo
{
public object Create(ActorInitializer init) { return new HarvesterInsurance(init.Self); }
}
public class HarvesterInsurance
{
readonly Actor self;
public HarvesterInsurance(Actor self)
{
this.self = self;
}
public void TryActivate()
{
var harvesters = self.World.ActorsWithTrait<Harvester>().Where(x => x.Actor.Owner == self.Owner);
if (harvesters.Any())
return;
var refineries = self.World.ActorsWithTrait<Refinery>().Where(x => x.Actor.Owner == self.Owner);
if (!refineries.Any())
return;
var refinery = refineries.First().Actor;
var delivery = refinery.Trait<FreeActorWithDelivery>();
delivery.DoDelivery(refinery.Location + delivery.Info.DeliveryOffset, delivery.Info.Actor,
delivery.Info.DeliveringActor, delivery.Info.InitialActivity);
}
}
}

View File

@@ -73,3 +73,4 @@ Player:
Name: Unrestricted
Prerequisites: techlevel.low, techlevel.medium, techlevel.high, techlevel.superweapons
EnemyWatcher:
HarvesterInsurance: