(gecko) Add support for custom order generators

This commit is contained in:
Chris Forbes
2010-11-02 13:35:26 +13:00
parent 7762241653
commit bc7cf09287
4 changed files with 71 additions and 28 deletions

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Graphics
} }
Sprite[] LoadCursors(string filename) Sprite[] LoadCursors(string filename)
{ {
try try
{ {
var shp = new Dune2ShpReader(FileSystem.OpenWithExts(filename, exts)); var shp = new Dune2ShpReader(FileSystem.OpenWithExts(filename, exts));

View File

@@ -17,31 +17,61 @@ namespace OpenRA.Orders
{ {
class UnitOrderGenerator : IOrderGenerator class UnitOrderGenerator : IOrderGenerator
{ {
public IEnumerable<Order> Order( World world, int2 xy, MouseInput mi ) public IEnumerable<Order> Order( World world, int2 xy, MouseInput mi )
{ {
var underCursor = world.FindUnitsAtMouse(mi.Location) var custom = world.WorldActor.TraitOrDefault<ICustomUnitOrderGenerator>();
.Where(a => a.Info.Traits.Contains<TargetableInfo>()) if (custom != null)
.OrderByDescending(a => a.Info.Traits.Contains<SelectableInfo>() ? a.Info.Traits.Get<SelectableInfo>().Priority : int.MinValue) {
.FirstOrDefault(); var customOrders = custom.Order(world, xy, mi);
var orders = world.Selection.Actors
.Select(a => OrderForUnit(a, xy, mi, underCursor))
.Where(o => o != null)
.ToArray();
var actorsInvolved = orders.Select(o => o.self).Distinct();
if (actorsInvolved.Any())
yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor,
string.Join(",", actorsInvolved.Select(a => a.ActorID.ToString()).ToArray()));
foreach( var o in orders ) foreach (var o in customOrders)
yield return CheckSameOrder( o.iot, o.trait.IssueOrder( o.self, o.iot, o.target ) ); yield return o;
}
else
{
var underCursor = world.FindUnitsAtMouse(mi.Location)
.Where(a => a.Info.Traits.Contains<TargetableInfo>())
.OrderByDescending(
a =>
a.Info.Traits.Contains<SelectableInfo>()
? a.Info.Traits.Get<SelectableInfo>().Priority
: int.MinValue)
.FirstOrDefault();
var orders = world.Selection.Actors
.Select(a => OrderForUnit(a, xy, mi, underCursor))
.Where(o => o != null)
.ToArray();
var actorsInvolved = orders.Select(o => o.self).Distinct();
if (actorsInvolved.Any())
yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor,
string.Join(",", actorsInvolved.Select(a => a.ActorID.ToString()).ToArray()))
;
foreach (var o in orders)
yield return CheckSameOrder(o.iot, o.trait.IssueOrder(o.self, o.iot, o.target));
}
} }
public void Tick( World world ) {} public void Tick( World world )
{
var custom = world.WorldActor.TraitOrDefault<ICustomUnitOrderGenerator>();
if (custom != null)
{
custom.Tick(world);
}
}
public void RenderBeforeWorld( WorldRenderer wr, World world )
{
var custom = world.WorldActor.TraitOrDefault<ICustomUnitOrderGenerator>();
if (custom != null)
{
custom.RenderBeforeWorld(wr, world);
return;
}
public void RenderBeforeWorld( WorldRenderer wr, World world )
{
foreach (var a in world.Selection.Actors) foreach (var a in world.Selection.Actors)
if (!a.Destroyed) if (!a.Destroyed)
foreach (var t in a.TraitsImplementing<IPreRenderSelection>()) foreach (var t in a.TraitsImplementing<IPreRenderSelection>())
@@ -50,8 +80,15 @@ namespace OpenRA.Orders
Game.Renderer.Flush(); Game.Renderer.Flush();
} }
public void RenderAfterWorld( WorldRenderer wr, World world ) public void RenderAfterWorld( WorldRenderer wr, World world )
{ {
var custom = world.WorldActor.TraitOrDefault<ICustomUnitOrderGenerator>();
if (custom != null)
{
custom.RenderAfterWorld(wr, world);
return;
}
foreach (var a in world.Selection.Actors) foreach (var a in world.Selection.Actors)
if (!a.Destroyed) if (!a.Destroyed)
foreach (var t in a.TraitsImplementing<IPostRenderSelection>()) foreach (var t in a.TraitsImplementing<IPostRenderSelection>())
@@ -60,8 +97,14 @@ namespace OpenRA.Orders
Game.Renderer.Flush(); Game.Renderer.Flush();
} }
public string GetCursor( World world, int2 xy, MouseInput mi ) public string GetCursor( World world, int2 xy, MouseInput mi )
{ {
var custom = world.WorldActor.TraitOrDefault<ICustomUnitOrderGenerator>();
if (custom != null)
{
return custom.GetCursor(world, xy, mi);
}
var underCursor = world.FindUnitsAtMouse(mi.Location) var underCursor = world.FindUnitsAtMouse(mi.Location)
.Where(a => a.Info.Traits.Contains<TargetableInfo>()) .Where(a => a.Info.Traits.Contains<TargetableInfo>())
.OrderByDescending(a => a.Info.Traits.Contains<SelectableInfo>() ? a.Info.Traits.Get<SelectableInfo>().Priority : int.MinValue) .OrderByDescending(a => a.Info.Traits.Contains<SelectableInfo>() ? a.Info.Traits.Get<SelectableInfo>().Priority : int.MinValue)

View File

@@ -51,7 +51,7 @@ namespace OpenRA.Traits
} }
public interface IOrderCursor { string CursorForOrder(Actor self, Order order); } public interface IOrderCursor { string CursorForOrder(Actor self, Order order); }
public interface IOrderVoice { string VoicePhraseForOrder(Actor self, Order order); } public interface IOrderVoice { string VoicePhraseForOrder(Actor self, Order order); }
public interface ICustomUnitOrderGenerator : IOrderGenerator {};
public interface INotifySold { void Selling( Actor self ); void Sold( Actor self ); } public interface INotifySold { void Selling( Actor self ); void Sold( Actor self ); }
public interface INotifyDamage { void Damaged(Actor self, AttackInfo e); } public interface INotifyDamage { void Damaged(Actor self, AttackInfo e); }
public interface INotifyBuildComplete { void BuildingComplete(Actor self); } public interface INotifyBuildComplete { void BuildingComplete(Actor self); }

View File

@@ -38,4 +38,4 @@ namespace OpenRA.Mods.RA
RemainingTicks = duration; RemainingTicks = duration;
} }
} }
} }