@@ -13,108 +13,60 @@ using System.Collections.Generic;
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
|
using OpenRA.Network;
|
||||||
using OpenRA.Widgets;
|
using OpenRA.Widgets;
|
||||||
|
|
||||||
namespace OpenRA.Mods.RA.Widgets.Logic
|
namespace OpenRA.Mods.RA.Widgets.Logic
|
||||||
{
|
{
|
||||||
public class DiplomacyLogic
|
public class DiplomacyLogic
|
||||||
{
|
{
|
||||||
static List<Widget> controls = new List<Widget>();
|
|
||||||
|
|
||||||
readonly World world;
|
readonly World world;
|
||||||
|
|
||||||
|
ScrollPanelWidget diplomacyPanel;
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public DiplomacyLogic(Widget widget, Action onExit, World world)
|
public DiplomacyLogic(Widget widget, Action onExit, World world)
|
||||||
{
|
{
|
||||||
this.world = world;
|
this.world = world;
|
||||||
var root = Ui.Root.Get("DIPLOMACY");
|
|
||||||
var diplomacyBG = root.Get("DIPLOMACY_BG");
|
|
||||||
LayoutDialog(diplomacyBG);
|
|
||||||
|
|
||||||
var close = widget.GetOrNull<ButtonWidget>("CLOSE_DIPLOMACY");
|
diplomacyPanel = widget.Get<ScrollPanelWidget>("DIPLOMACY_PANEL");
|
||||||
if (close != null)
|
|
||||||
close.OnClick = () => { Ui.CloseWindow(); onExit(); };
|
LayoutPlayers();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is shit
|
void LayoutPlayers()
|
||||||
void LayoutDialog(Widget bg)
|
|
||||||
{
|
{
|
||||||
foreach (var c in controls)
|
var teamTemplate = diplomacyPanel.Get<ScrollItemWidget>("TEAM_TEMPLATE");
|
||||||
bg.RemoveChild(c);
|
var players = world.Players.Where(p => p != world.LocalPlayer && !p.NonCombatant);
|
||||||
controls.Clear();
|
var teams = players.GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key);
|
||||||
|
foreach (var t in teams)
|
||||||
var y = 50;
|
|
||||||
var margin = 20;
|
|
||||||
var labelWidth = (bg.Bounds.Width - 3 * margin) / 3;
|
|
||||||
|
|
||||||
var ts = new LabelWidget
|
|
||||||
{
|
{
|
||||||
Font = "Bold",
|
var team = t;
|
||||||
Bounds = new Rectangle(margin + labelWidth + 10, y, labelWidth, 25),
|
var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { });
|
||||||
Text = "Their Stance",
|
tt.IgnoreMouseOver = true;
|
||||||
Align = TextAlign.Left,
|
tt.Get<LabelWidget>("TEAM").GetText = () => team.Key == 0 ? "No Team" : "Team " + team.Key;
|
||||||
};
|
diplomacyPanel.AddChild(tt);
|
||||||
|
foreach (var p in team)
|
||||||
bg.AddChild(ts);
|
|
||||||
controls.Add(ts);
|
|
||||||
|
|
||||||
var ms = new LabelWidget
|
|
||||||
{
|
{
|
||||||
Font = "Bold",
|
var player = p;
|
||||||
Bounds = new Rectangle(margin + 2 * labelWidth + 20, y, labelWidth, 25),
|
diplomacyPanel.AddChild(DiplomaticStatus(player));
|
||||||
Text = "My Stance",
|
|
||||||
Align = TextAlign.Left,
|
|
||||||
};
|
|
||||||
|
|
||||||
bg.AddChild(ms);
|
|
||||||
controls.Add(ms);
|
|
||||||
|
|
||||||
y += 35;
|
|
||||||
|
|
||||||
foreach (var p in world.Players.Where(a => a != world.LocalPlayer && !a.NonCombatant))
|
|
||||||
{
|
|
||||||
var pp = p;
|
|
||||||
var label = new LabelWidget
|
|
||||||
{
|
|
||||||
Bounds = new Rectangle(margin, y, labelWidth, 25),
|
|
||||||
Text = p.PlayerName,
|
|
||||||
Align = TextAlign.Left,
|
|
||||||
Font = "Bold",
|
|
||||||
Color = p.Color.RGB,
|
|
||||||
};
|
|
||||||
|
|
||||||
bg.AddChild(label);
|
|
||||||
controls.Add(label);
|
|
||||||
|
|
||||||
var theirStance = new LabelWidget
|
|
||||||
{
|
|
||||||
Bounds = new Rectangle( margin + labelWidth + 10, y, labelWidth, 25),
|
|
||||||
Text = p.PlayerName,
|
|
||||||
Align = TextAlign.Left,
|
|
||||||
|
|
||||||
GetText = () => pp.Stances[ world.LocalPlayer ].ToString(),
|
|
||||||
};
|
|
||||||
|
|
||||||
bg.AddChild(theirStance);
|
|
||||||
controls.Add(theirStance);
|
|
||||||
|
|
||||||
var myStance = new DropDownButtonWidget
|
|
||||||
{
|
|
||||||
Bounds = new Rectangle( margin + 2 * labelWidth + 20, y, labelWidth, 25),
|
|
||||||
GetText = () => world.LocalPlayer.Stances[ pp ].ToString(),
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!p.World.LobbyInfo.GlobalSettings.FragileAlliances)
|
|
||||||
myStance.Disabled = true;
|
|
||||||
|
|
||||||
myStance.OnMouseDown = mi => ShowDropDown(pp, myStance);
|
|
||||||
|
|
||||||
bg.AddChild(myStance);
|
|
||||||
controls.Add(myStance);
|
|
||||||
|
|
||||||
y += 35;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollItemWidget DiplomaticStatus(Player player)
|
||||||
|
{
|
||||||
|
var playerTemplate = diplomacyPanel.Get<ScrollItemWidget>("PLAYER_TEMPLATE");
|
||||||
|
var pt = ScrollItemWidget.Setup(playerTemplate, () => false, () => { });
|
||||||
|
pt.IgnoreMouseOver = true;
|
||||||
|
LobbyUtils.AddPlayerFlagAndName(pt, player);
|
||||||
|
pt.Get<LabelWidget>("THEIR_STANCE").GetText = () => player.Stances[world.LocalPlayer].ToString();
|
||||||
|
var myStance = pt.Get<DropDownButtonWidget>("MY_STANCE");
|
||||||
|
myStance.GetText = () => world.LocalPlayer.Stances[player].ToString();
|
||||||
|
myStance.IsDisabled = () => !world.LobbyInfo.GlobalSettings.FragileAlliances;
|
||||||
|
myStance.OnMouseDown = mi => ShowDropDown(player, myStance);
|
||||||
|
return pt;
|
||||||
|
}
|
||||||
|
|
||||||
void ShowDropDown(Player p, DropDownButtonWidget dropdown)
|
void ShowDropDown(Player p, DropDownButtonWidget dropdown)
|
||||||
{
|
{
|
||||||
@@ -135,9 +87,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
void SetStance(ButtonWidget bw, Player p, Stance ss)
|
void SetStance(ButtonWidget bw, Player p, Stance ss)
|
||||||
{
|
{
|
||||||
if (!p.World.LobbyInfo.GlobalSettings.FragileAlliances)
|
if (!p.World.LobbyInfo.GlobalSettings.FragileAlliances)
|
||||||
return; // team changes are banned
|
return; // stance changes are banned
|
||||||
|
|
||||||
// NOTE(jsd): Abuse of the type system here with `CPos`
|
// HACK: Abuse of the type system here with `CPos`
|
||||||
world.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, false)
|
world.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, false)
|
||||||
{ TargetLocation = new CPos((int)ss, 0), TargetString = p.InternalName });
|
{ TargetLocation = new CPos((int)ss, 0), TargetString = p.InternalName });
|
||||||
|
|
||||||
|
|||||||
@@ -348,5 +348,16 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
{
|
{
|
||||||
parent.Get<ImageWidget>("STATUS_IMAGE").IsVisible = () => c.IsReady || c.Bot != null;
|
parent.Get<ImageWidget>("STATUS_IMAGE").IsVisible = () => c.IsReady || c.Bot != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void AddPlayerFlagAndName(ScrollItemWidget template, Player player)
|
||||||
|
{
|
||||||
|
var flag = template.Get<ImageWidget>("FLAG");
|
||||||
|
flag.GetImageName = () => player.Country.Race;
|
||||||
|
flag.GetImageCollection = () => "flags";
|
||||||
|
|
||||||
|
var playerName = template.Get<LabelWidget>("PLAYER");
|
||||||
|
playerName.GetText = () => player.PlayerName + (player.WinState == WinState.Undefined ? "" : " (" + player.WinState + ")");
|
||||||
|
playerName.GetColor = () => player.Color.RGB;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
var team = t;
|
var team = t;
|
||||||
var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { });
|
var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { });
|
||||||
tt.IgnoreMouseOver = true;
|
tt.IgnoreMouseOver = true;
|
||||||
tt.Get<LabelWidget>("TEAM").GetText = () => team.Key == 0 ? "No team" : "Team " + team.Key;
|
tt.Get<LabelWidget>("TEAM").GetText = () => team.Key == 0 ? "No Team" : "Team " + team.Key;
|
||||||
playerStatsPanel.AddChild(tt);
|
playerStatsPanel.AddChild(tt);
|
||||||
foreach (var p in team)
|
foreach (var p in team)
|
||||||
{
|
{
|
||||||
@@ -185,7 +185,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
combatStatsHeaders.Visible = true;
|
combatStatsHeaders.Visible = true;
|
||||||
var template = SetupPlayerScrollItemWidget(combatPlayerTemplate, player);
|
var template = SetupPlayerScrollItemWidget(combatPlayerTemplate, player);
|
||||||
|
|
||||||
AddPlayerFlagAndName(template, player);
|
LobbyUtils.AddPlayerFlagAndName(template, player);
|
||||||
|
|
||||||
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
|
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
|
||||||
if (stats == null) return template;
|
if (stats == null) return template;
|
||||||
@@ -205,7 +205,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
productionStatsHeaders.Visible = true;
|
productionStatsHeaders.Visible = true;
|
||||||
var template = SetupPlayerScrollItemWidget(productionPlayerTemplate, player);
|
var template = SetupPlayerScrollItemWidget(productionPlayerTemplate, player);
|
||||||
|
|
||||||
AddPlayerFlagAndName(template, player);
|
LobbyUtils.AddPlayerFlagAndName(template, player);
|
||||||
|
|
||||||
template.Get<ObserverProductionIconsWidget>("PRODUCTION_ICONS").GetPlayer = () => player;
|
template.Get<ObserverProductionIconsWidget>("PRODUCTION_ICONS").GetPlayer = () => player;
|
||||||
template.Get<ObserverSupportPowerIconsWidget>("SUPPORT_POWER_ICONS").GetPlayer = () => player;
|
template.Get<ObserverSupportPowerIconsWidget>("SUPPORT_POWER_ICONS").GetPlayer = () => player;
|
||||||
@@ -218,7 +218,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
economyStatsHeaders.Visible = true;
|
economyStatsHeaders.Visible = true;
|
||||||
var template = SetupPlayerScrollItemWidget(economyPlayerTemplate, player);
|
var template = SetupPlayerScrollItemWidget(economyPlayerTemplate, player);
|
||||||
|
|
||||||
AddPlayerFlagAndName(template, player);
|
LobbyUtils.AddPlayerFlagAndName(template, player);
|
||||||
|
|
||||||
var res = player.PlayerActor.Trait<PlayerResources>();
|
var res = player.PlayerActor.Trait<PlayerResources>();
|
||||||
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
|
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
|
||||||
@@ -246,7 +246,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
basicStatsHeaders.Visible = true;
|
basicStatsHeaders.Visible = true;
|
||||||
var template = SetupPlayerScrollItemWidget(basicPlayerTemplate, player);
|
var template = SetupPlayerScrollItemWidget(basicPlayerTemplate, player);
|
||||||
|
|
||||||
AddPlayerFlagAndName(template, player);
|
LobbyUtils.AddPlayerFlagAndName(template, player);
|
||||||
|
|
||||||
var res = player.PlayerActor.Trait<PlayerResources>();
|
var res = player.PlayerActor.Trait<PlayerResources>();
|
||||||
template.Get<LabelWidget>("CASH").GetText = () => "$" + (res.DisplayCash + res.DisplayOre);
|
template.Get<LabelWidget>("CASH").GetText = () => "$" + (res.DisplayCash + res.DisplayOre);
|
||||||
@@ -293,17 +293,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
return "$" + (world.FrameNumber == 0 ? 0 : earned / (world.FrameNumber / 1500.0)).ToString("F2");
|
return "$" + (world.FrameNumber == 0 ? 0 : earned / (world.FrameNumber / 1500.0)).ToString("F2");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AddPlayerFlagAndName(ScrollItemWidget template, Player player)
|
|
||||||
{
|
|
||||||
var flag = template.Get<ImageWidget>("FLAG");
|
|
||||||
flag.GetImageName = () => player.Country.Race;
|
|
||||||
flag.GetImageCollection = () => "flags";
|
|
||||||
|
|
||||||
var playerName = template.Get<LabelWidget>("PLAYER");
|
|
||||||
playerName.GetText = () => player.PlayerName + (player.WinState == WinState.Undefined ? "" : " (" + player.WinState + ")");
|
|
||||||
playerName.GetColor = () => player.Color.RGB;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Color GetPowerColor(PowerState state)
|
static Color GetPowerColor(PowerState state)
|
||||||
{
|
{
|
||||||
if (state == PowerState.Critical) return Color.Red;
|
if (state == PowerState.Critical) return Color.Red;
|
||||||
|
|||||||
@@ -2,29 +2,94 @@ Container@DIPLOMACY:
|
|||||||
Logic:DiplomacyLogic
|
Logic:DiplomacyLogic
|
||||||
X:25
|
X:25
|
||||||
Y:50
|
Y:50
|
||||||
Width:950
|
Width:540
|
||||||
Height:500
|
Height:400
|
||||||
Visible:false
|
Visible:false
|
||||||
Children:
|
Children:
|
||||||
Background@DIPLOMACY_BG:
|
Background@DIPLOMACY_BG:
|
||||||
X:(WINDOW_RIGHT - WIDTH)/2
|
Width:PARENT_RIGHT
|
||||||
Y:(WINDOW_BOTTOM - HEIGHT)/2
|
Height:PARENT_BOTTOM
|
||||||
Width:450
|
|
||||||
Height:400
|
|
||||||
Children:
|
Children:
|
||||||
Label@LABEL_TITLE:
|
Label@LABEL_TITLE:
|
||||||
X:(PARENT_RIGHT - WIDTH)/2
|
X:(PARENT_RIGHT - WIDTH)/2
|
||||||
Y:20
|
Y:10
|
||||||
Width:250
|
Width:250
|
||||||
Height:25
|
Height:25
|
||||||
Text:Diplomacy
|
Text:Diplomacy
|
||||||
Align:Center
|
Align:Center
|
||||||
Font:Bold
|
Font:Bold
|
||||||
Button@CLOSE_DIPLOMACY:
|
Container@DIPLOMACY_HEADERS:
|
||||||
X:(PARENT_RIGHT - WIDTH)/2
|
X:0
|
||||||
Y:350
|
Y:0
|
||||||
|
Width:PARENT_RIGHT
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
|
Children:
|
||||||
|
Label@PLAYER_HEADER:
|
||||||
|
X:45
|
||||||
|
Y:40
|
||||||
Width:160
|
Width:160
|
||||||
Height:25
|
Height:25
|
||||||
Text:Close
|
|
||||||
Font:Bold
|
Font:Bold
|
||||||
Key:escape
|
Text:Player
|
||||||
|
Label@THEIR_STANCE_HEADER:
|
||||||
|
X:265
|
||||||
|
Y:40
|
||||||
|
Width:80
|
||||||
|
Height:25
|
||||||
|
Font:Bold
|
||||||
|
Text:Their Stance
|
||||||
|
Label@MY_STANCE_HEADER:
|
||||||
|
X:385
|
||||||
|
Y:40
|
||||||
|
Width:60
|
||||||
|
Height:25
|
||||||
|
Font:Bold
|
||||||
|
Text:My Stance
|
||||||
|
ScrollPanel@DIPLOMACY_PANEL:
|
||||||
|
X:25
|
||||||
|
Y:70
|
||||||
|
Width:PARENT_RIGHT-50
|
||||||
|
Height:PARENT_BOTTOM-45-50
|
||||||
|
ItemSpacing:5
|
||||||
|
Children:
|
||||||
|
ScrollItem@TEAM_TEMPLATE:
|
||||||
|
X:0
|
||||||
|
Y:0
|
||||||
|
Width:PARENT_RIGHT-35
|
||||||
|
Height:25
|
||||||
|
Children:
|
||||||
|
Label@TEAM:
|
||||||
|
X:10
|
||||||
|
Y:0
|
||||||
|
Width:PARENT_RIGHT
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
|
Font:Bold
|
||||||
|
ScrollItem@PLAYER_TEMPLATE:
|
||||||
|
X:0
|
||||||
|
Y:0
|
||||||
|
Width:PARENT_RIGHT-35
|
||||||
|
Height:25
|
||||||
|
Children:
|
||||||
|
Image@FLAG:
|
||||||
|
X:20
|
||||||
|
Y:5
|
||||||
|
Width:35
|
||||||
|
Height:PARENT_BOTTOM-5
|
||||||
|
ImageName:random
|
||||||
|
ImageCollection:flags
|
||||||
|
Label@PLAYER:
|
||||||
|
X:55
|
||||||
|
Y:0
|
||||||
|
Width:160
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
|
Font:Bold
|
||||||
|
Label@THEIR_STANCE:
|
||||||
|
X:265
|
||||||
|
Y:0
|
||||||
|
Width:80
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
|
DropDownButton@MY_STANCE:
|
||||||
|
X:345
|
||||||
|
Y:0
|
||||||
|
Width:100
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
@@ -101,7 +101,7 @@ Background@LOBBY_OPTIONS_BIN:
|
|||||||
Y:40
|
Y:40
|
||||||
Width:220
|
Width:220
|
||||||
Height:20
|
Height:20
|
||||||
Text:Team Changes
|
Text:Diplomacy Changes
|
||||||
Label@STARTINGCASH_DESC:
|
Label@STARTINGCASH_DESC:
|
||||||
Y:87
|
Y:87
|
||||||
Width:80
|
Width:80
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ ChromeLayout:
|
|||||||
mods/ra/chrome/gameinit.yaml
|
mods/ra/chrome/gameinit.yaml
|
||||||
mods/ra/chrome/ingame.yaml
|
mods/ra/chrome/ingame.yaml
|
||||||
mods/ra/chrome/ingame-chat.yaml
|
mods/ra/chrome/ingame-chat.yaml
|
||||||
|
mods/ra/chrome/ingame-diplomacy.yaml
|
||||||
mods/ra/chrome/ingame-fmvplayer.yaml
|
mods/ra/chrome/ingame-fmvplayer.yaml
|
||||||
mods/ra/chrome/ingame-menu.yaml
|
mods/ra/chrome/ingame-menu.yaml
|
||||||
mods/ra/chrome/ingame-objectives.yaml
|
mods/ra/chrome/ingame-objectives.yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user