Implement ground-level bridge destruction and repair.

This commit is contained in:
Paul Chote
2016-11-11 19:07:12 +00:00
parent 1101218962
commit 69e3c538d9
15 changed files with 648 additions and 156 deletions

View File

@@ -17,7 +17,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Can enter a LegacyBridgeHut to trigger a repair.")]
[Desc("Can enter a BridgeHut or LegacyBridgeHut to trigger a repair.")]
class RepairsBridgesInfo : ITraitInfo
{
[VoiceReference] public readonly string Voice = "Action";
@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits
"Possible values are Exit, Suicide, Dispose.")]
public readonly EnterBehaviour EnterBehaviour = EnterBehaviour.Dispose;
[Desc("Cursor to use when targeting a LegacyBridgeHut of an unrepaired bridge.")]
[Desc("Cursor to use when targeting an unrepaired bridge.")]
public readonly string TargetCursor = "goldwrench";
[Desc("Cursor to use when repairing is denied.")]
@@ -66,10 +66,14 @@ namespace OpenRA.Mods.Common.Traits
return null;
var legacyHut = order.TargetActor.TraitOrDefault<LegacyBridgeHut>();
if (legacyHut == null)
return null;
if (legacyHut != null)
return legacyHut.BridgeDamageState == DamageState.Undamaged || legacyHut.Repairing || legacyHut.Bridge.IsDangling ? null : info.Voice;
return legacyHut.BridgeDamageState == DamageState.Undamaged || legacyHut.Repairing || legacyHut.Bridge.IsDangling ? null : info.Voice;
var hut = order.TargetActor.TraitOrDefault<BridgeHut>();
if (hut != null)
return hut.BridgeDamageState == DamageState.Undamaged || hut.Repairing ? null : info.Voice;
return null;
}
public void ResolveOrder(Actor self, Order order)
@@ -77,10 +81,18 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderString == "RepairBridge")
{
var legacyHut = order.TargetActor.TraitOrDefault<LegacyBridgeHut>();
if (legacyHut == null)
return;
if (legacyHut.BridgeDamageState == DamageState.Undamaged || legacyHut.Repairing || legacyHut.Bridge.IsDangling)
var hut = order.TargetActor.TraitOrDefault<BridgeHut>();
if (legacyHut != null)
{
if (legacyHut.BridgeDamageState == DamageState.Undamaged || legacyHut.Repairing || legacyHut.Bridge.IsDangling)
return;
}
else if (hut != null)
{
if (hut.BridgeDamageState == DamageState.Undamaged || hut.Repairing)
return;
}
else
return;
self.SetTargetLine(Target.FromOrder(self.World, order), Color.Yellow);
@@ -102,22 +114,36 @@ namespace OpenRA.Mods.Common.Traits
public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor)
{
var legacyHut = target.TraitOrDefault<LegacyBridgeHut>();
if (legacyHut == null)
return false;
// Require force attack to heal partially damaged bridges to avoid unnecessary cursor noise
var damage = legacyHut.BridgeDamageState;
if (!modifiers.HasModifier(TargetModifiers.ForceAttack) && damage != DamageState.Dead)
return false;
// Obey force moving onto bridges
if (modifiers.HasModifier(TargetModifiers.ForceMove))
return false;
// Can't repair a bridge that is undamaged, already under repair, or dangling
if (damage == DamageState.Undamaged || legacyHut.Repairing || legacyHut.Bridge.IsDangling)
cursor = info.TargetBlockedCursor;
var legacyHut = target.TraitOrDefault<LegacyBridgeHut>();
var hut = target.TraitOrDefault<BridgeHut>();
if (legacyHut != null)
{
// Require force attack to heal partially damaged bridges to avoid unnecessary cursor noise
var damage = legacyHut.BridgeDamageState;
if (!modifiers.HasModifier(TargetModifiers.ForceAttack) && damage != DamageState.Dead)
return false;
// Can't repair a bridge that is undamaged, already under repair, or dangling
if (damage == DamageState.Undamaged || legacyHut.Repairing || legacyHut.Bridge.IsDangling)
cursor = info.TargetBlockedCursor;
}
else if (hut != null)
{
// Require force attack to heal partially damaged bridges to avoid unnecessary cursor noise
var damage = hut.BridgeDamageState;
if (hut.Info.RequireForceAttackForHeal && !modifiers.HasModifier(TargetModifiers.ForceAttack) && damage != DamageState.Dead)
return false;
// Can't repair a bridge that is undamaged, already under repair, or dangling
if (damage == DamageState.Undamaged || hut.Repairing)
cursor = info.TargetBlockedCursor;
}
else
return false;
return true;
}