(gecko) Add support for custom order generators
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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); }
|
||||||
|
|||||||
@@ -38,4 +38,4 @@ namespace OpenRA.Mods.RA
|
|||||||
RemainingTicks = duration;
|
RemainingTicks = duration;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user