From bfb07e9948552c63d0c58cf70426a248089901a0 Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Sun, 9 Dec 2012 21:22:19 +1300 Subject: [PATCH] Add support for mission difficulties --- OpenRA.Game/Map.cs | 2 ++ OpenRA.Game/Network/Session.cs | 1 + OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs | 19 ++++++++++++ OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs | 30 +++++++++++++++++++ mods/d2k/bits/TURRET1.aud | Bin 7100 -> 0 bytes mods/ra/chrome/lobby.yaml | 7 +++++ mods/ra/maps/allies-01/map.yaml | 2 ++ mods/ra/maps/allies-02/map.yaml | 2 ++ mods/ra/maps/allies-03/map.yaml | 2 ++ 9 files changed, 65 insertions(+) delete mode 100644 mods/d2k/bits/TURRET1.aud diff --git a/OpenRA.Game/Map.cs b/OpenRA.Game/Map.cs index e60a4dbbc9..a38f2897cc 100644 --- a/OpenRA.Game/Map.cs +++ b/OpenRA.Game/Map.cs @@ -37,6 +37,7 @@ namespace OpenRA public string Description; public string Author; public string Tileset; + public string[] Difficulties; [FieldLoader.Ignore] public Lazy> Actors; @@ -178,6 +179,7 @@ namespace OpenRA "Description", "Author", "Tileset", + "Difficulties", "MapSize", "Bounds", "UseAsShellmap", diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index 305b92a49f..30f7ae16d5 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -78,6 +78,7 @@ namespace OpenRA.Network public bool LockTeams = true; // don't allow team changes after game start. public bool AllowCheats = false; public bool Dedicated; + public string Difficulty; } public Session(string[] mods) diff --git a/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs index ad9cfbb15d..cd0c4ca720 100644 --- a/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs @@ -317,6 +317,25 @@ namespace OpenRA.Mods.RA.Server server.SyncLobbyInfo(); return true; }}, + { "difficulty", + s => + { + if (!client.IsAdmin) + { + server.SendChatTo(conn, "Only the host can set that option"); + return true; + } + if ((server.Map.Difficulties == null && s != null) || (server.Map.Difficulties != null && !server.Map.Difficulties.Contains(s))) + { + server.SendChatTo(conn, "Unsupported difficulty selected: {0}".F(s)); + server.SendChatTo(conn, "Supported difficulties: {0}".F(server.Map.Difficulties.JoinWith(","))); + return true; + } + + server.lobbyInfo.GlobalSettings.Difficulty = s; + server.SyncLobbyInfo(); + return true; + }}, { "kick", s => { diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index 57a49a23cb..89a60acf7c 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -156,6 +156,27 @@ namespace OpenRA.Mods.RA.Widgets.Logic allowCheats.OnClick = () => orderManager.IssueOrder(Order.Command( "allowcheats {0}".F(!orderManager.LobbyInfo.GlobalSettings.AllowCheats))); + var difficulty = lobby.Get("DIFFICULTY_DROPDOWNBUTTON"); + difficulty.IsVisible = () => Map != null && Map.Difficulties != null && Map.Difficulties.Any(); + difficulty.IsDisabled = () => !Game.IsHost || gameStarting || orderManager.LocalClient == null || orderManager.LocalClient.IsReady; + difficulty.GetText = () => orderManager.LobbyInfo.GlobalSettings.Difficulty; + difficulty.OnMouseDown = _ => + { + var options = Map.Difficulties.Select(d => new DifficultyDropDownOption + { + Title = d, + IsSelected = () => orderManager.LobbyInfo.GlobalSettings.Difficulty == d, + OnClick = () => orderManager.IssueOrder(Order.Command("difficulty {0}".F(d))) + }); + Func setupItem = (option, template) => + { + var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick); + item.Get("LABEL").GetText = () => option.Title; + return item; + }; + difficulty.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem); + }; + var startGameButton = lobby.Get("START_GAME_BUTTON"); startGameButton.IsVisible = () => Game.IsHost; startGameButton.IsDisabled = () => gameStarting; @@ -249,6 +270,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic var title = Ui.Root.Get("TITLE"); title.Text = orderManager.LobbyInfo.GlobalSettings.ServerName; + + orderManager.LobbyInfo.GlobalSettings.Difficulty = Map.Difficulties != null && Map.Difficulties.Any() ? Map.Difficulties.First() : null; } void UpdatePlayerList() @@ -444,5 +467,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic { orderManager.IssueOrder(Order.Command("ready")); } + + class DifficultyDropDownOption + { + public string Title; + public Func IsSelected; + public Action OnClick; + } } } diff --git a/mods/d2k/bits/TURRET1.aud b/mods/d2k/bits/TURRET1.aud deleted file mode 100644 index 7b89d0ca4ea0d71456740c09bd4513001486ff55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7100 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 diff --git a/mods/ra/chrome/lobby.yaml b/mods/ra/chrome/lobby.yaml index b908c3bf44..a57f11c6d8 100644 --- a/mods/ra/chrome/lobby.yaml +++ b/mods/ra/chrome/lobby.yaml @@ -426,6 +426,13 @@ Background@SERVER_LOBBY: Height:25 Text:Disconnect Font:Bold + DropDownButton@DIFFICULTY_DROPDOWNBUTTON: + X:PARENT_RIGHT-154 + Y:PARENT_BOTTOM-219+25 + Width:120 + Height:25 + Font:Bold + Visible:false Checkbox@ALLOWCHEATS_CHECKBOX: X: PARENT_RIGHT-154 Y: PARENT_BOTTOM-229 diff --git a/mods/ra/maps/allies-01/map.yaml b/mods/ra/maps/allies-01/map.yaml index c16e3b5433..46bcb19d27 100644 --- a/mods/ra/maps/allies-01/map.yaml +++ b/mods/ra/maps/allies-01/map.yaml @@ -20,6 +20,8 @@ UseAsShellmap: False Type: Campaign +Difficulties: Normal + Players: PlayerReference@Neutral: Name: Neutral diff --git a/mods/ra/maps/allies-02/map.yaml b/mods/ra/maps/allies-02/map.yaml index e7733e6e99..e9422b4fbd 100644 --- a/mods/ra/maps/allies-02/map.yaml +++ b/mods/ra/maps/allies-02/map.yaml @@ -20,6 +20,8 @@ UseAsShellmap: False Type: Campaign +Difficulties: Normal + Players: PlayerReference@Neutral: Name: Neutral diff --git a/mods/ra/maps/allies-03/map.yaml b/mods/ra/maps/allies-03/map.yaml index 6812f755e8..5f04bc5f60 100644 --- a/mods/ra/maps/allies-03/map.yaml +++ b/mods/ra/maps/allies-03/map.yaml @@ -20,6 +20,8 @@ UseAsShellmap: False Type: Campaign +Difficulties: Normal + Players: PlayerReference@Neutral: Name: Neutral