diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs
index b30ec763d1..bfee489da4 100644
--- a/OpenRA.Game/Chrome.cs
+++ b/OpenRA.Game/Chrome.cs
@@ -289,7 +289,6 @@ namespace OpenRA
});
}
-
var f = renderer.BoldFont;
f.DrawText("Name", new int2(r.Left + 40, r.Top + 50), Color.White);
f.DrawText("Color", new int2(r.Left + 140, r.Top + 50), Color.White);
diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs
index c154084e2a..6386aed463 100644
--- a/OpenRA.Game/Graphics/Viewport.cs
+++ b/OpenRA.Game/Graphics/Viewport.cs
@@ -130,9 +130,9 @@ namespace OpenRA.Graphics
}
Game.chrome.DrawWidgets(world);
- if( Chrome.rootWidget.GetWidget( "SERVER_LOBBY" ).Visible )
+ if (Chrome.rootWidget.GetWidget("SERVER_LOBBY").Visible)
Game.chrome.DrawLobby();
- else if( Chrome.rootWidget.GetWidget( "MAP_CHOOSER" ).Visible )
+ else if (Chrome.rootWidget.GetWidget("MAP_CHOOSER").Visible)
Game.chrome.DrawMapChooser();
Timer.Time( "widgets: {0}" );
diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs
index 9d02b54ff8..682d18fdd3 100755
--- a/OpenRA.Game/Network/UnitOrders.cs
+++ b/OpenRA.Game/Network/UnitOrders.cs
@@ -48,6 +48,14 @@ namespace OpenRA.Network
Game.SyncLobbyInfo(order.TargetString);
break;
}
+ case "SetStance":
+ {
+ var targetPlayer = order.Player.World.players[order.TargetLocation.X];
+ order.Player.Stances[targetPlayer] = (Stance)order.TargetLocation.Y;
+ Game.Debug("{0} has set diplomatic stance vs {1} to {2}".F(
+ order.Player.PlayerName, targetPlayer.PlayerName, (Stance)order.TargetLocation.Y));
+ break;
+ }
default:
{
if( !order.IsImmediate )
diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj
index 6cf57e3eda..574419dde8 100755
--- a/OpenRA.Game/OpenRA.Game.csproj
+++ b/OpenRA.Game/OpenRA.Game.csproj
@@ -89,6 +89,7 @@
+
diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs
index 67fe015f9f..ba06076cb9 100644
--- a/OpenRA.Game/Traits/TraitsInterfaces.cs
+++ b/OpenRA.Game/Traits/TraitsInterfaces.cs
@@ -44,6 +44,7 @@ namespace OpenRA.Traits
public interface INotifyProduction { void UnitProduced(Actor self, Actor other); }
public interface IAcceptThief { void OnSteal(Actor self, Actor thief); }
public interface IAcceptSpy { void OnInfiltrate(Actor self, Actor spy); }
+ public interface INotifyEnterCell { void OnEnterCell(Actor self, int2 cell); }
public interface ICustomTerrain
{
diff --git a/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs b/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs
new file mode 100644
index 0000000000..02ff0b1fa9
--- /dev/null
+++ b/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs
@@ -0,0 +1,127 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+using OpenRA.Traits;
+
+namespace OpenRA.Widgets.Delegates
+{
+ public class DiplomacyDelegate : IWidgetDelegate
+ {
+ static List controls = new List();
+
+ public DiplomacyDelegate()
+ {
+ var diplomacyBG = Chrome.rootWidget.GetWidget("DIPLOMACY_BG");
+
+ Chrome.rootWidget.GetWidget("INGAME_DIPLOMACY_BUTTON").OnMouseUp = mi =>
+ {
+ diplomacyBG.Visible = !diplomacyBG.Visible;
+ if (diplomacyBG.Visible)
+ LayoutDialog(diplomacyBG);
+ return true;
+ };
+ }
+
+ void LayoutDialog(Widget bg)
+ {
+ bg.Children.RemoveAll(w => controls.Contains(w));
+ controls.Clear();
+
+ var unwantedPlayers = new[] { Game.world.NeutralPlayer, Game.world.LocalPlayer };
+ var y = 50;
+ var margin = 20;
+ var labelWidth = (bg.Bounds.Width - 3 * margin) / 3;
+
+ var ts = new LabelWidget
+ {
+ Bold = true,
+ Bounds = new Rectangle(bg.Bounds.X + margin + labelWidth + 10, bg.Bounds.Y + y, labelWidth, 25),
+ Text = "Their Stance",
+ Align = "Left",
+ };
+
+ bg.AddChild(ts);
+ controls.Add(ts);
+
+ var ms = new LabelWidget
+ {
+ Bold = true,
+ Bounds = new Rectangle(bg.Bounds.X + margin + 2 * labelWidth + 20, bg.Bounds.Y + y, labelWidth, 25),
+ Text = "My Stance",
+ Align = "Left",
+ };
+
+ bg.AddChild(ms);
+ controls.Add(ms);
+
+ y += 35;
+
+ foreach (var p in Game.world.players.Values.Except(unwantedPlayers))
+ {
+ var pp = p;
+ var label = new LabelWidget
+ {
+ Bounds = new Rectangle(bg.Bounds.X + margin, bg.Bounds.Y + y, labelWidth, 25),
+ Id = "DIPLOMACY_PLAYER_LABEL_{0}".F(p.Index),
+ Text = p.PlayerName,
+ Align = "Left",
+ Bold = true,
+ };
+
+ bg.AddChild(label);
+ controls.Add(label);
+
+ var theirStance = new LabelWidget
+ {
+ Bounds = new Rectangle(bg.Bounds.X + margin + labelWidth + 10, bg.Bounds.Y + y, labelWidth, 25),
+ Id = "DIPLOMACY_PLAYER_LABEL_THEIR_{0}".F(p.Index),
+ Text = p.PlayerName,
+ Align = "Left",
+ Bold = false,
+
+ GetText = () => pp.Stances[ Game.world.LocalPlayer ].ToString(),
+ };
+
+ bg.AddChild(theirStance);
+ controls.Add(theirStance);
+
+ var myStance = new ButtonWidget
+ {
+ Bounds = new Rectangle(bg.Bounds.X + margin + 2 * labelWidth + 20, bg.Bounds.Y + y, labelWidth, 25),
+ Id = "DIPLOMACY_PLAYER_LABEL_THEIR_{0}".F(p.Index),
+ Text = Game.world.LocalPlayer.Stances[ pp ].ToString(),
+ };
+
+ myStance.OnMouseUp = mi => { CycleStance(pp, myStance); return true; };
+
+ bg.AddChild(myStance);
+ controls.Add(myStance);
+
+ y += 35;
+ }
+ }
+
+ Stance GetNextStance(Stance s)
+ {
+ switch (s)
+ {
+ case Stance.Ally: return Stance.Enemy;
+ case Stance.Enemy: return Stance.Neutral;
+ case Stance.Neutral: return Stance.Ally;
+ default:
+ throw new ArgumentException();
+ }
+ }
+
+ void CycleStance(Player p, ButtonWidget bw)
+ {
+ var nextStance = GetNextStance(Game.world.LocalPlayer.Stances[p]);
+ Game.IssueOrder(new Order("SetStance", Game.world.LocalPlayer.PlayerActor,
+ new int2(p.Index, (int)nextStance)));
+
+ bw.Text = nextStance.ToString();
+ }
+ }
+}
diff --git a/OpenRA.Game/Widgets/Delegates/IngameChromeDelegate.cs b/OpenRA.Game/Widgets/Delegates/IngameChromeDelegate.cs
index 5cdcfebdea..6f33131af7 100644
--- a/OpenRA.Game/Widgets/Delegates/IngameChromeDelegate.cs
+++ b/OpenRA.Game/Widgets/Delegates/IngameChromeDelegate.cs
@@ -28,9 +28,10 @@ namespace OpenRA.Widgets.Delegates
public IngameChromeDelegate()
{
var r = Chrome.rootWidget;
- var gameRoot = r.GetWidget("INGAME_ROOT");
+ var gameRoot = r.GetWidget("INGAME_ROOT");
var optionsBG = gameRoot.GetWidget("INGAME_OPTIONS_BG");
- r.GetWidget("INGAME_OPTIONS_BUTTON").OnMouseUp = mi => {
+
+ r.GetWidget("INGAME_OPTIONS_BUTTON").OnMouseUp = mi => {
optionsBG.Visible = !optionsBG.Visible;
return true;
};
diff --git a/OpenRA.Game/Widgets/LabelWidget.cs b/OpenRA.Game/Widgets/LabelWidget.cs
index c1b1ece9ef..a6c580cf9a 100644
--- a/OpenRA.Game/Widgets/LabelWidget.cs
+++ b/OpenRA.Game/Widgets/LabelWidget.cs
@@ -29,11 +29,16 @@ namespace OpenRA.Widgets
public string Align = "Left";
public bool Bold = true;
public Func GetText;
+
+ public LabelWidget()
+ : base()
+ {
+ GetText = () => { return Text; };
+ }
public override void Initialize()
{
base.Initialize();
- GetText = () => {return Text;};
}
public override void Draw(World world)
diff --git a/mods/ra/menus.yaml b/mods/ra/menus.yaml
index 5a7a522828..6001a2628f 100644
--- a/mods/ra/menus.yaml
+++ b/mods/ra/menus.yaml
@@ -386,6 +386,23 @@ Container:
Width:160
Height:25
Text:Quit
+ Background@DIPLOMACY_BG:
+ Id:DIPLOMACY_BG
+ Delegate:DiplomacyDelegate
+ X:(WINDOW_RIGHT - WIDTH)/2
+ Y:(WINDOW_BOTTOM - HEIGHT)/2
+ Width:450
+ Height:400
+ Visible:false
+ Children:
+ Label@LABEL_TITLE:
+ Id:LABEL_TITLE
+ X:(PARENT_RIGHT - WIDTH)/2
+ Y:20
+ Width:250
+ Height:25
+ Text:Diplomacy
+ Align:Center
Background@PERF_BG:
ClickThrough:true
Id:PERF_BG