Renormalize line endings and fix copyright headers again.

This commit is contained in:
Paul Chote
2011-04-07 21:15:42 +12:00
parent 1a49b46af1
commit b0425aff3b
144 changed files with 8076 additions and 7746 deletions

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
widget.GetWidget<LabelWidget>("CONNECTING_DESC").GetText = () =>
"Connecting to {0}:{1}...".F(host, port);
}
}
}
public class ConnectionFailedDelegate : IWidgetDelegate

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
{
[ObjectCreator.UseCtor]
public DeveloperModeDelegate( [ObjectCreator.Param] World world )
{
{
var devmodeBG = Widget.RootWidget.GetWidget("INGAME_ROOT").GetWidget("DEVELOPERMODE_BG");
var devModeButton = Widget.RootWidget.GetWidget<ButtonWidget>("INGAME_DEVELOPERMODE_BUTTON");
@@ -65,15 +65,15 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
devmodeBG.GetWidget<CheckboxWidget>("ENABLE_TECH").OnChange += _ => Order(world, "DevEnableTech");
devmodeBG.GetWidget<CheckboxWidget>("UNLIMITED_POWER").BindReadOnly(devTrait, "UnlimitedPower");
devmodeBG.GetWidget<CheckboxWidget>("UNLIMITED_POWER").OnChange += _ => Order(world, "DevUnlimitedPower");
devmodeBG.GetWidget<CheckboxWidget>("BUILD_ANYWHERE").BindReadOnly(devTrait, "BuildAnywhere");
devmodeBG.GetWidget<CheckboxWidget>("UNLIMITED_POWER").OnChange += _ => Order(world, "DevUnlimitedPower");
devmodeBG.GetWidget<CheckboxWidget>("BUILD_ANYWHERE").BindReadOnly(devTrait, "BuildAnywhere");
devmodeBG.GetWidget<CheckboxWidget>("BUILD_ANYWHERE").OnChange += _ => Order(world, "DevBuildAnywhere");
devmodeBG.GetWidget<ButtonWidget>("GIVE_EXPLORATION").OnMouseUp = mi =>
{
world.IssueOrder(new Order("DevGiveExploration", world.LocalPlayer.PlayerActor, false));
return true;
devmodeBG.GetWidget<ButtonWidget>("GIVE_EXPLORATION").OnMouseUp = mi =>
{
world.IssueOrder(new Order("DevGiveExploration", world.LocalPlayer.PlayerActor, false));
return true;
};
devModeButton.IsVisible = () => { return world.LobbyInfo.GlobalSettings.AllowCheats; };

View File

@@ -31,44 +31,44 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
public GameInitDelegate([ObjectCreator.Param] Widget widget)
{
Info = (widget as GameInitInfoWidget);
}
public void Init()
{
Game.ConnectionStateChanged += orderManager =>
{
Widget.CloseWindow();
switch (orderManager.Connection.ConnectionState)
{
case ConnectionState.PreConnecting:
Widget.OpenWindow("MAINMENU_BG");
break;
case ConnectionState.Connecting:
Widget.OpenWindow("CONNECTING_BG",
new Dictionary<string, object> { { "host", orderManager.Host }, { "port", orderManager.Port } });
break;
case ConnectionState.NotConnected:
Widget.OpenWindow("CONNECTION_FAILED_BG",
new Dictionary<string, object> { { "orderManager", orderManager } });
break;
case ConnectionState.Connected:
var lobby = Game.OpenWindow(orderManager.world, "SERVER_LOBBY");
lobby.GetWidget<ChatDisplayWidget>("CHAT_DISPLAY").ClearChat();
lobby.GetWidget("CHANGEMAP_BUTTON").Visible = true;
lobby.GetWidget("LOCKTEAMS_CHECKBOX").Visible = true;
lobby.GetWidget("ALLOWCHEATS_CHECKBOX").Visible = true;
lobby.GetWidget("DISCONNECT_BUTTON").Visible = true;
break;
}
};
if (FileSystem.Exists(Info.TestFile))
ContinueLoading();
else
{
MainMenuButtonsDelegate.DisplayModSelector();
ShowInstallMethodDialog();
}
}
public void Init()
{
Game.ConnectionStateChanged += orderManager =>
{
Widget.CloseWindow();
switch (orderManager.Connection.ConnectionState)
{
case ConnectionState.PreConnecting:
Widget.OpenWindow("MAINMENU_BG");
break;
case ConnectionState.Connecting:
Widget.OpenWindow("CONNECTING_BG",
new Dictionary<string, object> { { "host", orderManager.Host }, { "port", orderManager.Port } });
break;
case ConnectionState.NotConnected:
Widget.OpenWindow("CONNECTION_FAILED_BG",
new Dictionary<string, object> { { "orderManager", orderManager } });
break;
case ConnectionState.Connected:
var lobby = Game.OpenWindow(orderManager.world, "SERVER_LOBBY");
lobby.GetWidget<ChatDisplayWidget>("CHAT_DISPLAY").ClearChat();
lobby.GetWidget("CHANGEMAP_BUTTON").Visible = true;
lobby.GetWidget("LOCKTEAMS_CHECKBOX").Visible = true;
lobby.GetWidget("ALLOWCHEATS_CHECKBOX").Visible = true;
lobby.GetWidget("DISCONNECT_BUTTON").Visible = true;
break;
}
};
if (FileSystem.Exists(Info.TestFile))
ContinueLoading();
else
{
MainMenuButtonsDelegate.DisplayModSelector();
ShowInstallMethodDialog();
}
}
void ShowInstallMethodDialog()
@@ -116,8 +116,8 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
};
Action onComplete = () =>
{
if (!error)
{
if (!error)
Game.RunAfterTick(ContinueLoading);
};
@@ -221,6 +221,6 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
wc.CancelAsync();
cancelled = true;
}
}
}
}
}

View File

@@ -112,15 +112,15 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
if (Game.IsHost)
orderManager.IssueOrder(Order.Command(
"lockteams {0}".F(!orderManager.LobbyInfo.GlobalSettings.LockTeams)));
};
var allowCheats = lobby.GetWidget<CheckboxWidget>("ALLOWCHEATS_CHECKBOX");
allowCheats.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.AllowCheats;
allowCheats.OnChange += _ =>
{
if (Game.IsHost)
orderManager.IssueOrder(Order.Command(
"allowcheats {0}".F(!orderManager.LobbyInfo.GlobalSettings.AllowCheats)));
};
var allowCheats = lobby.GetWidget<CheckboxWidget>("ALLOWCHEATS_CHECKBOX");
allowCheats.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.AllowCheats;
allowCheats.OnChange += _ =>
{
if (Game.IsHost)
orderManager.IssueOrder(Order.Command(
"allowcheats {0}".F(!orderManager.LobbyInfo.GlobalSettings.AllowCheats)));
};
var startGameButton = lobby.GetWidget("START_GAME_BUTTON");

View File

@@ -8,7 +8,7 @@
*/
#endregion
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Server;
@@ -185,25 +185,25 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
{
var dc = widget.GetWidget("DIRECTCONNECT_BG");
dc.GetWidget<TextFieldWidget>("SERVER_ADDRESS").Text = Game.Settings.Player.LastServer;
dc.GetWidget("JOIN_BUTTON").OnMouseUp = mi =>
{
var address = dc.GetWidget<TextFieldWidget>("SERVER_ADDRESS").Text;
var cpts = address.Split(':').ToArray();
if (cpts.Length < 1 || cpts.Length > 2)
return true;
int port;
if (cpts.Length != 2 || !int.TryParse(cpts[1], out port))
port = 1234;
Game.Settings.Player.LastServer = address;
Game.Settings.Save();
Widget.CloseWindow();
Game.JoinServer(cpts[0], port);
return true;
dc.GetWidget<TextFieldWidget>("SERVER_ADDRESS").Text = Game.Settings.Player.LastServer;
dc.GetWidget("JOIN_BUTTON").OnMouseUp = mi =>
{
var address = dc.GetWidget<TextFieldWidget>("SERVER_ADDRESS").Text;
var cpts = address.Split(':').ToArray();
if (cpts.Length < 1 || cpts.Length > 2)
return true;
int port;
if (cpts.Length != 2 || !int.TryParse(cpts[1], out port))
port = 1234;
Game.Settings.Player.LastServer = address;
Game.Settings.Save();
Widget.CloseWindow();
Game.JoinServer(cpts[0], port);
return true;
};
dc.GetWidget("CANCEL_BUTTON").OnMouseUp = mi =>

View File

@@ -164,9 +164,9 @@ namespace OpenRA.Mods.RA.Widgets
int updateTicks = 0;
public override void Tick()
{
var hasRadarNew = world
.ActorsWithTrait<ProvidesRadar>()
{
var hasRadarNew = world
.ActorsWithTrait<ProvidesRadar>()
.Any(a => a.Actor.Owner == world.LocalPlayer && a.Trait.IsActive);
if (hasRadarNew != hasRadar)

View File

@@ -1,123 +1,133 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using OpenRA.Graphics;
using OpenRA.Traits;
using OpenRA.Widgets;
namespace OpenRA.Mods.RA.Widgets
{
public class StrategicProgressWidget : Widget
{
bool Initialised = false;
readonly World world;
readonly WorldRenderer worldRenderer;
[ObjectCreator.UseCtor]
public StrategicProgressWidget([ObjectCreator.Param] World world, [ObjectCreator.Param] WorldRenderer worldRenderer)
{
IsVisible = () => true;
this.world = world;
this.worldRenderer = worldRenderer;
}
public override void DrawInner()
{
if (!Initialised)
Init();
if (!IsVisible()) return;
int2 offset = int2.Zero;
var svc = world.players.Select(p => p.Value.PlayerActor.TraitOrDefault<StrategicVictoryConditions>()).FirstOrDefault();
var totalWidth = (svc.Total + svc.TotalCritical)*32;
int curX = -(totalWidth / 2);
foreach (var a in world.Actors.Where(a => !a.Destroyed && a.HasTrait<StrategicPoint>() && !a.TraitOrDefault<StrategicPoint>().Critical))
{
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "unowned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
if (a.Owner == worldRenderer.world.LocalPlayer || (a.Owner.Stances[world.LocalPlayer] == Stance.Ally && world.LocalPlayer.Stances[a.Owner] == Stance.Ally))
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "player_owned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
else if (!a.Owner.NonCombatant)
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "enemy_owned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
curX += 32;
}
foreach (var a in world.Actors.Where(a => !a.Destroyed && a.HasTrait<StrategicPoint>() && a.TraitOrDefault<StrategicPoint>().Critical))
{
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "critical_unowned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
if (a.Owner == world.LocalPlayer || (a.Owner.Stances[world.LocalPlayer] == Stance.Ally && world.LocalPlayer.Stances[a.Owner] == Stance.Ally))
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "player_owned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
else if (!a.Owner.NonCombatant)
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "enemy_owned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
curX += 32;
}
offset += new int2(0, 32);
var pendingWinner = FindFirstWinningPlayer(world);
if (pendingWinner == null) return;
svc = pendingWinner.PlayerActor.TraitOrDefault<StrategicVictoryConditions>();
if (world.LocalPlayer != null)
{
var tc = "";
if (pendingWinner != world.LocalPlayer && (pendingWinner.Stances[world.LocalPlayer] != Stance.Ally || world.LocalPlayer.Stances[pendingWinner] != Stance.Ally))
{
// losing
tc = "Strategic defeat in " +
((svc.CriticalTicksLeft > svc.TicksLeft) ? WidgetUtils.FormatTime(svc.CriticalTicksLeft) : WidgetUtils.FormatTime(svc.TicksLeft));
}else
{
// winning
tc = "Strategic victory in " +
((svc.CriticalTicksLeft > svc.TicksLeft) ? WidgetUtils.FormatTime(svc.CriticalTicksLeft) : WidgetUtils.FormatTime(svc.TicksLeft));
}
var size = Game.Renderer.BoldFont.Measure(tc);
Game.Renderer.BoldFont.DrawText(tc, offset + new float2(RenderBounds.Left - size.X / 2 + 1, RenderBounds.Top + 1), Color.Black);
Game.Renderer.BoldFont.DrawText(tc, offset + new float2(RenderBounds.Left - size.X / 2, RenderBounds.Top), Color.WhiteSmoke);
offset += new int2(0, size.Y + 1);
}
}
public Player FindFirstWinningPlayer(World world)
{
// loop through all players, see who is 'winning' and get the one with the shortest 'time to win'
int shortest = int.MaxValue;
Player shortestPlayer = null;
foreach (var p in world.players.Select(p => p.Value).Where(p => !p.NonCombatant))
{
var svc = p.PlayerActor.TraitOrDefault<StrategicVictoryConditions>();
if (svc.HoldingCritical && svc.CriticalTicksLeft > 0 && svc.CriticalTicksLeft < shortest)
{
shortest = svc.CriticalTicksLeft;
shortestPlayer = p;
}
if (svc.Holding && svc.TicksLeft > 0 && svc.TicksLeft < shortest)
{
shortest = svc.TicksLeft;
shortestPlayer = p;
}
}
return shortestPlayer;
}
private void Init()
{
IsVisible = () => (world.Actors.Where(a => a.HasTrait<StrategicVictoryConditions>()).Any() && world.Actors.Where(a => a.HasTrait<StrategicPoint>()).Any());
Initialised = true;
}
}
}
#region Copyright & License Information
/*
* Copyright 2007-2011 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 COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using OpenRA.Graphics;
using OpenRA.Traits;
using OpenRA.Widgets;
namespace OpenRA.Mods.RA.Widgets
{
public class StrategicProgressWidget : Widget
{
bool Initialised = false;
readonly World world;
readonly WorldRenderer worldRenderer;
[ObjectCreator.UseCtor]
public StrategicProgressWidget([ObjectCreator.Param] World world, [ObjectCreator.Param] WorldRenderer worldRenderer)
{
IsVisible = () => true;
this.world = world;
this.worldRenderer = worldRenderer;
}
public override void DrawInner()
{
if (!Initialised)
Init();
if (!IsVisible()) return;
int2 offset = int2.Zero;
var svc = world.players.Select(p => p.Value.PlayerActor.TraitOrDefault<StrategicVictoryConditions>()).FirstOrDefault();
var totalWidth = (svc.Total + svc.TotalCritical)*32;
int curX = -(totalWidth / 2);
foreach (var a in world.Actors.Where(a => !a.Destroyed && a.HasTrait<StrategicPoint>() && !a.TraitOrDefault<StrategicPoint>().Critical))
{
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "unowned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
if (a.Owner == worldRenderer.world.LocalPlayer || (a.Owner.Stances[world.LocalPlayer] == Stance.Ally && world.LocalPlayer.Stances[a.Owner] == Stance.Ally))
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "player_owned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
else if (!a.Owner.NonCombatant)
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "enemy_owned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
curX += 32;
}
foreach (var a in world.Actors.Where(a => !a.Destroyed && a.HasTrait<StrategicPoint>() && a.TraitOrDefault<StrategicPoint>().Critical))
{
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "critical_unowned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
if (a.Owner == world.LocalPlayer || (a.Owner.Stances[world.LocalPlayer] == Stance.Ally && world.LocalPlayer.Stances[a.Owner] == Stance.Ally))
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "player_owned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
else if (!a.Owner.NonCombatant)
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("strategic", "enemy_owned"), offset + new float2(RenderBounds.Left + curX, RenderBounds.Top));
curX += 32;
}
offset += new int2(0, 32);
var pendingWinner = FindFirstWinningPlayer(world);
if (pendingWinner == null) return;
svc = pendingWinner.PlayerActor.TraitOrDefault<StrategicVictoryConditions>();
if (world.LocalPlayer != null)
{
var tc = "";
if (pendingWinner != world.LocalPlayer && (pendingWinner.Stances[world.LocalPlayer] != Stance.Ally || world.LocalPlayer.Stances[pendingWinner] != Stance.Ally))
{
// losing
tc = "Strategic defeat in " +
((svc.CriticalTicksLeft > svc.TicksLeft) ? WidgetUtils.FormatTime(svc.CriticalTicksLeft) : WidgetUtils.FormatTime(svc.TicksLeft));
}else
{
// winning
tc = "Strategic victory in " +
((svc.CriticalTicksLeft > svc.TicksLeft) ? WidgetUtils.FormatTime(svc.CriticalTicksLeft) : WidgetUtils.FormatTime(svc.TicksLeft));
}
var size = Game.Renderer.BoldFont.Measure(tc);
Game.Renderer.BoldFont.DrawText(tc, offset + new float2(RenderBounds.Left - size.X / 2 + 1, RenderBounds.Top + 1), Color.Black);
Game.Renderer.BoldFont.DrawText(tc, offset + new float2(RenderBounds.Left - size.X / 2, RenderBounds.Top), Color.WhiteSmoke);
offset += new int2(0, size.Y + 1);
}
}
public Player FindFirstWinningPlayer(World world)
{
// loop through all players, see who is 'winning' and get the one with the shortest 'time to win'
int shortest = int.MaxValue;
Player shortestPlayer = null;
foreach (var p in world.players.Select(p => p.Value).Where(p => !p.NonCombatant))
{
var svc = p.PlayerActor.TraitOrDefault<StrategicVictoryConditions>();
if (svc.HoldingCritical && svc.CriticalTicksLeft > 0 && svc.CriticalTicksLeft < shortest)
{
shortest = svc.CriticalTicksLeft;
shortestPlayer = p;
}
if (svc.Holding && svc.TicksLeft > 0 && svc.TicksLeft < shortest)
{
shortest = svc.TicksLeft;
shortestPlayer = p;
}
}
return shortestPlayer;
}
private void Init()
{
IsVisible = () => (world.Actors.Where(a => a.HasTrait<StrategicVictoryConditions>()).Any() && world.Actors.Where(a => a.HasTrait<StrategicPoint>()).Any());
Initialised = true;
}
}
}

View File

@@ -1,123 +1,133 @@
using System;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Network;
using OpenRA.Orders;
using OpenRA.Widgets;
namespace OpenRA.Mods.RA.Widgets
{
public class WorldCommandWidget : Widget
{
public World World { get { return OrderManager.world; } }
public string AttackMoveKey = "a";
public string StopKey = "s";
public string ScatterKey = "x";
public string DeployKey = "f";
public string BaseCycleKey = "backspace";
public readonly OrderManager OrderManager;
[ObjectCreator.UseCtor]
public WorldCommandWidget([ObjectCreator.Param] OrderManager orderManager )
{
OrderManager = orderManager;
}
public override void DrawInner() { }
public override string GetCursor(int2 pos) { return null; }
public override bool HandleKeyPressInner(KeyInput e)
{
if (World == null) return false;
if (World.LocalPlayer == null) return false;
return ProcessInput(e);
}
bool ProcessInput(KeyInput e)
{
if (e.Modifiers == Modifiers.None && e.Event == KeyInputEvent.Down)
{
if (e.KeyName == BaseCycleKey)
return CycleBases();
if (!World.Selection.Actors.Any())
return false;
if (e.KeyName == AttackMoveKey)
return PerformAttackMove();
if (e.KeyName == StopKey)
return PerformStop();
if (e.KeyName == ScatterKey)
return PerformScatter();
if (e.KeyName == DeployKey)
return PerformDeploy();
}
return false;
}
// todo: take ALL this garbage and route it through the OrderTargeter stuff.
bool PerformAttackMove()
{
World.OrderGenerator = new GenericSelectTarget(World.Selection.Actors, "AttackMove",
"attackmove", MouseButton.Right);
return true;
}
void PerformKeyboardOrderOnSelection(Func<Actor, Order> f)
{
var orders = World.Selection.Actors.Select(f).ToArray();
foreach (var o in orders) World.IssueOrder(o);
World.PlayVoiceForOrders(orders);
}
bool PerformStop()
{
PerformKeyboardOrderOnSelection(a => new Order("Stop", a, false));
return true;
}
bool PerformScatter()
{
PerformKeyboardOrderOnSelection(a => new Order("Scatter", a, false));
return true;
}
bool PerformDeploy()
{
/* hack: two orders here -- DeployTransform and Unload. */
PerformKeyboardOrderOnSelection(a => new Order("DeployTransform", a, false));
PerformKeyboardOrderOnSelection(a => new Order("Unload", a, false));
return true;
}
bool CycleBases()
{
var bases = World.ActorsWithTrait<BaseBuilding>()
.Where( a => a.Actor.Owner == World.LocalPlayer ).ToArray();
if (!bases.Any()) return true;
var next = bases
.Select(b => b.Actor)
.SkipWhile(b => !World.Selection.Actors.Contains(b))
.Skip(1)
.FirstOrDefault();
if (next == null)
next = bases.Select(b => b.Actor).First();
World.Selection.Combine(World, new Actor[] { next }, false, true);
Game.viewport.Center(World.Selection.Actors);
return true;
}
}
#region Copyright & License Information
/*
* Copyright 2007-2011 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 COPYING.
*/
#endregion
using System;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Network;
using OpenRA.Orders;
using OpenRA.Widgets;
namespace OpenRA.Mods.RA.Widgets
{
public class WorldCommandWidget : Widget
{
public World World { get { return OrderManager.world; } }
public string AttackMoveKey = "a";
public string StopKey = "s";
public string ScatterKey = "x";
public string DeployKey = "f";
public string BaseCycleKey = "backspace";
public readonly OrderManager OrderManager;
[ObjectCreator.UseCtor]
public WorldCommandWidget([ObjectCreator.Param] OrderManager orderManager )
{
OrderManager = orderManager;
}
public override void DrawInner() { }
public override string GetCursor(int2 pos) { return null; }
public override bool HandleKeyPressInner(KeyInput e)
{
if (World == null) return false;
if (World.LocalPlayer == null) return false;
return ProcessInput(e);
}
bool ProcessInput(KeyInput e)
{
if (e.Modifiers == Modifiers.None && e.Event == KeyInputEvent.Down)
{
if (e.KeyName == BaseCycleKey)
return CycleBases();
if (!World.Selection.Actors.Any())
return false;
if (e.KeyName == AttackMoveKey)
return PerformAttackMove();
if (e.KeyName == StopKey)
return PerformStop();
if (e.KeyName == ScatterKey)
return PerformScatter();
if (e.KeyName == DeployKey)
return PerformDeploy();
}
return false;
}
// todo: take ALL this garbage and route it through the OrderTargeter stuff.
bool PerformAttackMove()
{
World.OrderGenerator = new GenericSelectTarget(World.Selection.Actors, "AttackMove",
"attackmove", MouseButton.Right);
return true;
}
void PerformKeyboardOrderOnSelection(Func<Actor, Order> f)
{
var orders = World.Selection.Actors.Select(f).ToArray();
foreach (var o in orders) World.IssueOrder(o);
World.PlayVoiceForOrders(orders);
}
bool PerformStop()
{
PerformKeyboardOrderOnSelection(a => new Order("Stop", a, false));
return true;
}
bool PerformScatter()
{
PerformKeyboardOrderOnSelection(a => new Order("Scatter", a, false));
return true;
}
bool PerformDeploy()
{
/* hack: two orders here -- DeployTransform and Unload. */
PerformKeyboardOrderOnSelection(a => new Order("DeployTransform", a, false));
PerformKeyboardOrderOnSelection(a => new Order("Unload", a, false));
return true;
}
bool CycleBases()
{
var bases = World.ActorsWithTrait<BaseBuilding>()
.Where( a => a.Actor.Owner == World.LocalPlayer ).ToArray();
if (!bases.Any()) return true;
var next = bases
.Select(b => b.Actor)
.SkipWhile(b => !World.Selection.Actors.Contains(b))
.Skip(1)
.FirstOrDefault();
if (next == null)
next = bases.Select(b => b.Actor).First();
World.Selection.Combine(World, new Actor[] { next }, false, true);
Game.viewport.Center(World.Selection.Actors);
return true;
}
}
}