Restructuring orders.
This commit is contained in:
73
OpenRa.Game/UnitOrders.cs
Executable file
73
OpenRa.Game/UnitOrders.cs
Executable file
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using OpenRa.Game.Traits;
|
||||
|
||||
namespace OpenRa.Game
|
||||
{
|
||||
static class UnitOrders
|
||||
{
|
||||
public static void ProcessOrder( Order order )
|
||||
{
|
||||
switch( order.OrderString )
|
||||
{
|
||||
case "Move":
|
||||
{
|
||||
var mobile = order.Subject.traits.Get<Mobile>();
|
||||
mobile.Cancel( order.Subject );
|
||||
mobile.QueueActivity( new Mobile.MoveTo( order.TargetLocation ) );
|
||||
|
||||
var attackBase = order.Subject.traits.WithInterface<AttackBase>().FirstOrDefault();
|
||||
if( attackBase != null )
|
||||
attackBase.target = null; /* move cancels attack order */
|
||||
break;
|
||||
}
|
||||
case "Attack":
|
||||
{
|
||||
const int RangeTolerance = 1; /* how far inside our maximum range we should try to sit */
|
||||
var mobile = order.Subject.traits.GetOrDefault<Mobile>();
|
||||
var weapon = order.Subject.unitInfo.Primary ?? order.Subject.unitInfo.Secondary;
|
||||
|
||||
mobile.Cancel( order.Subject );
|
||||
// TODO: this block should be a separate activity; "MoveNear", maybe?
|
||||
{
|
||||
/* todo: choose the appropriate weapon, when only one works against this target */
|
||||
var range = Rules.WeaponInfo[ weapon ].Range;
|
||||
|
||||
mobile.QueueActivity(
|
||||
new Mobile.MoveTo( order.TargetActor,
|
||||
Math.Max( 0, (int)range - RangeTolerance ) ) );
|
||||
}
|
||||
|
||||
order.Subject.traits.Get<AttackTurreted>().target = order.TargetActor;
|
||||
break;
|
||||
}
|
||||
case "DeployMcv":
|
||||
{
|
||||
var mobile = order.Subject.traits.Get<Mobile>();
|
||||
mobile.QueueActivity( new Mobile.Turn( 96 ) );
|
||||
mobile.QueueActivity( new Traits.Activities.DeployMcv() );
|
||||
break;
|
||||
}
|
||||
case "PlaceBuilding":
|
||||
{
|
||||
Game.world.AddFrameEndTask( _ =>
|
||||
{
|
||||
var building = Rules.UnitInfo[ order.TargetString ];
|
||||
Log.Write( "Player \"{0}\" builds {1}", order.Player.PlayerName, building.Name );
|
||||
|
||||
//Adjust placement for cursor to be in middle
|
||||
Game.world.Add( new Actor( building.Name, order.TargetLocation - GameRules.Footprint.AdjustForBuildingSize( building.Name ), order.Player ) );
|
||||
|
||||
Game.controller.orderGenerator = null;
|
||||
Game.worldRenderer.uiOverlay.KillOverlay();
|
||||
} );
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user