Fix CursorForOrderString to work with orders + preliminary e6 fixes

This commit is contained in:
Paul Chote
2010-07-23 17:11:52 +12:00
parent 5019bb8b6e
commit 71420df0f3
25 changed files with 179 additions and 93 deletions

View File

@@ -56,8 +56,8 @@ namespace OpenRA.Orders
public string GetCursor( World world, int2 xy, MouseInput mi )
{
var c = Order(world, xy, mi)
.Select(o => o.Subject.traits.WithInterface<IProvideCursor>()
.Select(pc => pc.CursorForOrderString(o.OrderString, o.Subject, o.TargetLocation)).FirstOrDefault(a => a != null))
.Select(o => o.Subject.traits.WithInterface<IOrderCursor>()
.Select(pc => pc.CursorForOrder(o.Subject, o)).FirstOrDefault(a => a != null))
.FirstOrDefault(a => a != null);
return c ??

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Traits
public virtual object Create(ActorInitializer init) { return new Mobile(init, this); }
}
public class Mobile : IIssueOrder, IResolveOrder, IOccupySpace, IMove, IProvideCursor, INudge
public class Mobile : IIssueOrder, IResolveOrder, IOccupySpace, IMove, IOrderCursor, INudge
{
public readonly Actor self;
public readonly MobileInfo Info;
@@ -112,12 +112,12 @@ namespace OpenRA.Traits
}
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
if (s != "Move")
if (order.OrderString != "Move")
return null;
return (CanEnterCell(location)) ? "move" : "move-blocked";
return (CanEnterCell(order.TargetLocation)) ? "move" : "move-blocked";
}
public int2 TopLeft { get { return toCell; } }

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Traits
public readonly string[] Produces = { };
}
public class Production : IIssueOrder, IResolveOrder, ITags, IProvideCursor
public class Production : IIssueOrder, IResolveOrder, ITags, IOrderCursor
{
public virtual int2? CreationLocation( Actor self, ActorInfo producee )
{
@@ -99,9 +99,9 @@ namespace OpenRA.Traits
return null;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Deploy") ? "deploy" : null;
return (order.OrderString == "Deploy") ? "deploy" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Traits
public interface IRender { IEnumerable<Renderable> Render(Actor self); }
public interface IIssueOrder { Order IssueOrder( Actor self, int2 xy, MouseInput mi, Actor underCursor ); }
public interface IResolveOrder { void ResolveOrder(Actor self, Order order); }
public interface IProvideCursor { string CursorForOrderString(string s, Actor a, int2 location); }
public interface IOrderCursor { string CursorForOrder(Actor self, Order order); }
public interface INotifySold { void Selling( Actor self ); void Sold( Actor self ); }
public interface INotifyDamage { void Damaged(Actor self, AttackInfo e); }

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.Aftermath
public readonly int ChargeTime = 120; // Seconds
}
class ChronoshiftDeploy : IIssueOrder, IResolveOrder, ITick, IPips, IProvideCursor
class ChronoshiftDeploy : IIssueOrder, IResolveOrder, ITick, IPips, IOrderCursor
{
// Recharge logic
[Sync]
@@ -67,9 +67,9 @@ namespace OpenRA.Mods.Aftermath
}
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Deploy") ? "deploy" : null;
return (order.OrderString == "Deploy") ? "deploy" : null;
}
// Display 5 pips indicating the current charge status

View File

@@ -23,32 +23,25 @@ namespace OpenRA.Mods.RA.Activities
public IActivity Tick(Actor self)
{
if (target == null || target.IsDead) return NextActivity;
var damage = -self.Info.Traits.Get<EngineerCaptureInfo>().EngineerDamage;
if (self.Owner.Stances[ target.Owner ] == Stance.Ally)
var damage = self.Info.Traits.Get<EngineerCaptureInfo>().EngineerDamage;
if (target.Health - damage <= 0)
{
if (target.Health == target.Info.Traits.Get<OwnedActorInfo>().HP)
return NextActivity;
target.InflictDamage(self, damage, null);
target.World.AddFrameEndTask(w =>
{
// momentarily remove from world so the ownership queries don't get confused
w.Remove(target);
target.Owner = self.Owner;
w.Add(target);
foreach (var t in target.traits.WithInterface<INotifyCapture>())
t.OnCapture(target, self);
});
target.InflictDamage(self, target.Health - damage, null);
}
else
{
if (target.Health - damage <= 0)
{
target.World.AddFrameEndTask(w =>
{ // momentarily remove from world so the ownership queries don't get confused
w.Remove(target);
target.Owner = self.Owner;
w.Add(target);
foreach (var t in target.traits.WithInterface<INotifyCapture>())
t.OnCapture(target, self);
});
target.InflictDamage(self, target.Health - damage, null);
}
else
target.InflictDamage(self, damage, null);
}
target.InflictDamage(self, damage, null);
// the engineer is sacrificed.
self.World.AddFrameEndTask(w => w.Remove(self));

View File

@@ -0,0 +1,37 @@
#region Copyright & License Information
/*
* Copyright 2007-2010 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 LICENSE.
*/
#endregion
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Activities
{
class RepairBuilding : IActivity
{
Actor target;
public RepairBuilding(Actor target) { this.target = target; }
public IActivity NextActivity { get; set; }
public IActivity Tick(Actor self)
{
if (target == null || target.IsDead) return NextActivity;
if (target.Health == target.GetMaxHP())
return NextActivity;
target.InflictDamage(self, -target.GetMaxHP(), null);
self.World.AddFrameEndTask(w => w.Remove(self));
return NextActivity;
}
public void Cancel(Actor self) { target = null; NextActivity = null; }
}
}

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Mods.RA
public virtual object Create(ActorInitializer init) { return new AttackBase(init.self); }
}
public class AttackBase : IIssueOrder, IResolveOrder, ITick, IExplodeModifier, IProvideCursor
public class AttackBase : IIssueOrder, IResolveOrder, ITick, IExplodeModifier, IOrderCursor
{
public Target target;
@@ -253,9 +253,9 @@ namespace OpenRA.Mods.RA
target = Target.None;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
switch (s)
switch (order.OrderString)
{
case "Attack": return "attack";
case "Heal": return "heal";

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Mods.RA
public readonly float C4Delay = 0;
}
class C4Demolition : IIssueOrder, IResolveOrder, IProvideCursor
class C4Demolition : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
@@ -42,9 +42,9 @@ namespace OpenRA.Mods.RA
}
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "C4") ? "c4" : null;
return (order.OrderString == "C4") ? "c4" : null;
}
}
}

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA
public readonly int UnloadFacing = 0;
}
public class Cargo : IPips, IIssueOrder, IResolveOrder, IProvideCursor
public class Cargo : IPips, IIssueOrder, IResolveOrder, IOrderCursor
{
List<Actor> cargo = new List<Actor>();
@@ -49,9 +49,9 @@ namespace OpenRA.Mods.RA
}
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Deploy") ? "deploy" : null;
return (order.OrderString == "Deploy") ? "deploy" : null;
}
public bool IsFull(Actor self)

View File

@@ -15,7 +15,7 @@ namespace OpenRA.Mods.RA
{
class ConstructionYardInfo : TraitInfo<ConstructionYard> { }
public class ConstructionYard : IIssueOrder, IResolveOrder, IProvideCursor
public class ConstructionYard : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
@@ -27,9 +27,9 @@ namespace OpenRA.Mods.RA
return null;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Deploy") ? "deploy" : null;
return (order.OrderString == "Deploy") ? "deploy" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -19,37 +19,30 @@ namespace OpenRA.Mods.RA
public readonly int EngineerDamage = 300;
}
class EngineerCapture : IIssueOrder, IResolveOrder, IProvideCursor
class EngineerCapture : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right) return null;
if (underCursor == null) return null;
if (self.Owner.Stances[underCursor.Owner] != Stance.Enemy) return null;
if (!underCursor.traits.Contains<Building>()) return null;
// todo: other bits
if (underCursor.Owner == null) return null; // don't allow capturing of bridges, etc.
var isCapture = underCursor.Health <= self.Info.Traits.Get<EngineerCaptureInfo>().EngineerDamage;
var isCapture = underCursor.Health <= self.Info.Traits.Get<EngineerCaptureInfo>().EngineerDamage &&
self.Owner.Stances[underCursor.Owner] != Stance.Ally;
var isHeal = self.Owner.Stances[underCursor.Owner] == Stance.Ally;
return new Order(isCapture ? "Capture" :
isHeal ? "Repair" : "Infiltrate",
return new Order(isCapture ? "Capture" : "Infiltrate",
self, underCursor);
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Infiltrate") ? "enter" :
(s == "Repair") ? "goldwrench" :
(s == "Capture") ? "capture" : null;
return (order.OrderString == "Infiltrate") ? "enter" :
(order.OrderString == "Capture") ? "capture" : null;
}
public void ResolveOrder(Actor self, Order order)
{
if (order.OrderString == "Infiltrate" || order.OrderString == "Capture" || order.OrderString == "Repair")
if (order.OrderString == "Infiltrate" || order.OrderString == "Capture")
{
self.CancelActivity();
self.QueueActivity(new Move(order.TargetActor, 1));

View File

@@ -0,0 +1,59 @@
#region Copyright & License Information
/*
* Copyright 2007-2010 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 LICENSE.
*/
#endregion
using OpenRA.Mods.RA.Activities;
using OpenRA.Traits;
using OpenRA.Traits.Activities;
namespace OpenRA.Mods.RA
{
class EngineerRepairInfo : TraitInfo<EngineerRepair>
{
public readonly bool RepairsBridges = true;
}
class EngineerRepair : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right) return null;
if (underCursor == null) return null;
if (!CanRepair(self, underCursor)) return null;
return new Order("EngineerRepair", self, underCursor);
}
bool CanRepair(Actor self, Actor a)
{
if (!a.traits.Contains<Building>()) return false;
bool bridge = a.traits.Contains<Bridge>() && !self.Info.Traits.Get<EngineerRepairInfo>().RepairsBridges;
return (bridge || self.Owner.Stances[a.Owner] == Stance.Ally);
}
public string CursorForOrder(Actor self, Order order)
{
if (order.OrderString != "EngineerRepair") return null;
if (order.TargetActor == null) return null;
return (order.TargetActor.Health == order.TargetActor.GetMaxHP()) ? "goldwrench-blocked" : "goldwrench";
}
public void ResolveOrder(Actor self, Order order)
{
if (order.OrderString == "EngineerRepair" && order.TargetActor.Health < order.TargetActor.GetMaxHP())
{
self.CancelActivity();
self.QueueActivity(new Move(order.TargetActor, 1));
self.QueueActivity(new RepairBuilding(order.TargetActor));
}
}
}
}

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA
public object Create(ActorInitializer init) { return new Harvester(init.self, this); }
}
public class Harvester : IIssueOrder, IResolveOrder, INotifyDamage, IPips, IRenderModifier, IExplodeModifier, IProvideCursor
public class Harvester : IIssueOrder, IResolveOrder, INotifyDamage, IPips, IRenderModifier, IExplodeModifier, IOrderCursor
{
Dictionary<ResourceTypeInfo, int> contents = new Dictionary<ResourceTypeInfo, int>();
@@ -104,10 +104,10 @@ namespace OpenRA.Mods.RA
return null;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Deliver") ? "enter" :
(s == "Harvest") ? "attackmove" : null;
return (order.OrderString == "Deliver") ? "enter" :
(order.OrderString == "Harvest") ? "attackmove" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA
public override object Create( ActorInitializer init ) { return new Helicopter( init ); }
}
class Helicopter : Aircraft, ITick, IIssueOrder, IResolveOrder, IProvideCursor
class Helicopter : Aircraft, ITick, IIssueOrder, IResolveOrder, IOrderCursor
{
public IDisposable reservation;
@@ -51,9 +51,9 @@ namespace OpenRA.Mods.RA
return null;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Enter") ? "enter" : null;
return (order.OrderString == "Enter") ? "enter" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA
public readonly string[] RearmBuildings = { "fix" };
}
class Minelayer : IIssueOrder, IResolveOrder, IProvideCursor
class Minelayer : IIssueOrder, IResolveOrder, IOrderCursor
{
/* [Sync] when sync can cope with arrays! */ public int2[] minefield = null;
[Sync] int2 minefieldStart;
@@ -39,9 +39,9 @@ namespace OpenRA.Mods.RA
return null;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "BeginMinefield") ? "ability" : null;
return (order.OrderString == "BeginMinefield") ? "ability" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -209,6 +209,8 @@
<Compile Include="PaletteFromCurrentTheatre.cs" />
<Compile Include="Widgets\Delegates\OrderButtonsChromeDelegate.cs" />
<Compile Include="RadarColorFromTerrain.cs" />
<Compile Include="EngineerRepair.cs" />
<Compile Include="Activities\RepairBuilding.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">

View File

@@ -19,7 +19,7 @@ namespace OpenRA.Mods.RA
public readonly PipType ColorOfCargoPip = PipType.Green;
}
class Passenger : IIssueOrder, IResolveOrder, IProvideCursor
class Passenger : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
@@ -41,9 +41,9 @@ namespace OpenRA.Mods.RA
//return new Order("EnterTransport", self, underCursor);
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "EnterTransport") ? "enter" : null;
return (order.OrderString == "EnterTransport") ? "enter" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -20,7 +20,7 @@ namespace OpenRA.Mods.RA
public override object Create( ActorInitializer init ) { return new Plane( init ); }
}
public class Plane : Aircraft, IIssueOrder, IResolveOrder, IProvideCursor
public class Plane : Aircraft, IIssueOrder, IResolveOrder, IOrderCursor
{
public IDisposable reservation;
@@ -41,9 +41,9 @@ namespace OpenRA.Mods.RA
return null;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Enter") ? "enter" : null;
return (order.OrderString == "Enter") ? "enter" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA
{
class RepairableInfo : TraitInfo<Repairable> { public readonly string[] RepairBuildings = { "fix" }; }
class Repairable : IIssueOrder, IResolveOrder, IProvideCursor
class Repairable : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
@@ -31,9 +31,9 @@ namespace OpenRA.Mods.RA
return null;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Enter") ? "enter" : null;
return (order.OrderString == "Enter") ? "enter" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA
public readonly string[] Buildings = { "spen", "syrd" };
}
class RepairableNear : IIssueOrder, IResolveOrder, IProvideCursor
class RepairableNear : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
@@ -36,9 +36,9 @@ namespace OpenRA.Mods.RA
return null;
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Enter") ? "enter" : null;
return (order.OrderString == "Enter") ? "enter" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -16,7 +16,7 @@ namespace OpenRA.Mods.RA
{
class SpyInfo : TraitInfo<Spy> { }
class Spy : IIssueOrder, IResolveOrder, IProvideCursor
class Spy : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
@@ -28,9 +28,9 @@ namespace OpenRA.Mods.RA
return new Order("Infiltrate", self, underCursor);
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
return (s == "Infiltrate") ? "enter" : null;
return (order.OrderString == "Infiltrate") ? "enter" : null;
}
public void ResolveOrder(Actor self, Order order)

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA
public readonly string[] NoTransformSounds = null;
}
class TransformsOnDeploy : IIssueOrder, IResolveOrder, IProvideCursor
class TransformsOnDeploy : IIssueOrder, IResolveOrder, IOrderCursor
{
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
@@ -70,17 +70,17 @@ namespace OpenRA.Mods.RA
}
}
public string CursorForOrderString(string s, Actor a, int2 location)
public string CursorForOrder(Actor self, Order order)
{
if (s != "DeployTransform")
if (order.OrderString != "DeployTransform")
return null;
var depInfo = a.Info.Traits.Get<TransformsOnDeployInfo>();
var depInfo = self.Info.Traits.Get<TransformsOnDeployInfo>();
var transInfo = Rules.Info[depInfo.TransformsInto];
if (transInfo.Traits.Contains<BuildingInfo>())
{
var bi = transInfo.Traits.Get<BuildingInfo>();
if (!a.World.CanPlaceBuilding(depInfo.TransformsInto, bi, a.Location + new int2(depInfo.Offset[0], depInfo.Offset[1]), a))
if (!self.World.CanPlaceBuilding(depInfo.TransformsInto, bi, self.Location + new int2(depInfo.Offset[0], depInfo.Offset[1]), self))
return "deploy-blocked";
}
return "deploy";

View File

@@ -123,6 +123,7 @@ E6:
TakeCover:
Passenger:
ColorOfCargoPip: Yellow
EngineerRepair:
EngineerCapture:
EngineerDamage: 9999999
-AutoTarget:

View File

@@ -119,6 +119,7 @@ E6:
Speed: 4
Passenger:
ColorOfCargoPip: Yellow
EngineerRepair:
EngineerCapture:
TakeCover:
-AutoTarget: