C4 demolishable bridges
This commit is contained in:
@@ -41,8 +41,12 @@ namespace OpenRA.Mods.RA.Activities
|
||||
.Concat(self.Owner.PlayerActor.TraitsImplementing<IDamageModifier>())
|
||||
.Select(t => t.GetDamageModifier(self, null)).Product();
|
||||
|
||||
var demolishable = target.Actor.TraitOrDefault<IDemolishable>();
|
||||
if (demolishable == null || !demolishable.IsValidTarget(target.Actor, self))
|
||||
return;
|
||||
|
||||
if (modifier > 0)
|
||||
target.Actor.Kill(self);
|
||||
demolishable.Demolish(target.Actor, self);
|
||||
})));
|
||||
|
||||
return NextActivity;
|
||||
|
||||
@@ -288,5 +288,13 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
return damage;
|
||||
}
|
||||
|
||||
public void Demolish(Actor saboteur)
|
||||
{
|
||||
// TODO: completely destroy long bridges in a chain reaction
|
||||
Combat.DoExplosion(saboteur, "Demolish", self.CenterPosition);
|
||||
self.World.WorldActor.Trait<ScreenShaker>().AddEffect(15, self.CenterPosition, 6);
|
||||
self.Kill(saboteur);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA
|
||||
public object Create(ActorInitializer init) { return new BridgeHut(init); }
|
||||
}
|
||||
|
||||
class BridgeHut
|
||||
class BridgeHut : IDemolishable
|
||||
{
|
||||
public Bridge bridge;
|
||||
|
||||
@@ -31,6 +31,16 @@ namespace OpenRA.Mods.RA
|
||||
bridge.Repair(repairer, true, true);
|
||||
}
|
||||
|
||||
public void Demolish(Actor self, Actor saboteur)
|
||||
{
|
||||
bridge.Demolish(saboteur);
|
||||
}
|
||||
|
||||
public bool IsValidTarget(Actor self, Actor saboteur)
|
||||
{
|
||||
return BridgeDamageState == DamageState.Undamaged;
|
||||
}
|
||||
|
||||
public DamageState BridgeDamageState { get { return bridge.AggregateDamageState(); } }
|
||||
}
|
||||
}
|
||||
|
||||
34
OpenRA.Mods.RA/Buildings/Demolishable.cs
Normal file
34
OpenRA.Mods.RA/Buildings/Demolishable.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2013 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.Traits;
|
||||
using OpenRA.FileFormats;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
[Desc("Handle demolitions from C4 explosives.")]
|
||||
public class DemolishableInfo : TraitInfo<Demolishable> { }
|
||||
|
||||
public class Demolishable : IDemolishable
|
||||
{
|
||||
public Demolishable() { }
|
||||
|
||||
public void Demolish(Actor self, Actor saboteur)
|
||||
{
|
||||
self.Kill(saboteur);
|
||||
}
|
||||
|
||||
public bool IsValidTarget(Actor self, Actor saboteur)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +56,10 @@ namespace OpenRA.Mods.RA
|
||||
if (target.Type != TargetType.Actor)
|
||||
return;
|
||||
|
||||
var demolishable = order.TargetActor.TraitOrDefault<IDemolishable>();
|
||||
if (demolishable == null || !demolishable.IsValidTarget(target.Actor, self))
|
||||
return;
|
||||
|
||||
if (!order.Queued)
|
||||
self.CancelActivity();
|
||||
|
||||
|
||||
@@ -125,12 +125,8 @@ namespace OpenRA.Mods.RA.Missions
|
||||
startJeep.QueueActivity(new Turn(128));
|
||||
startJeep.QueueActivity(new CallFunc(() =>
|
||||
{
|
||||
var bridge = world.Actors
|
||||
.Where(a => a.HasTrait<Bridge>() && !a.IsDead())
|
||||
.ClosestTo(startJeep);
|
||||
Combat.DoExplosion(bridge, "Demolish", bridge.CenterPosition);
|
||||
world.WorldActor.Trait<ScreenShaker>().AddEffect(15, bridge.CenterPosition, 6);
|
||||
bridge.Kill(bridge);
|
||||
var bridge = world.Actors.Where(a => a.HasTrait<BridgeHut>()).ClosestTo(startJeep);
|
||||
bridge.Trait<BridgeHut>().Demolish(bridge, startJeep);
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
@@ -484,6 +484,7 @@
|
||||
<Compile Include="Effects\Rank.cs" />
|
||||
<Compile Include="ShroudRenderer.cs" />
|
||||
<Compile Include="Render\WithCrateBody.cs" />
|
||||
<Compile Include="Buildings\Demolishable.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
|
||||
|
||||
Reference in New Issue
Block a user