Merge pull request #5133 from ScottNZ/new-menu

Add singleplayer mission menu to ra/td
This commit is contained in:
Paul Chote
2014-04-19 19:38:36 +12:00
35 changed files with 443 additions and 23 deletions

View File

@@ -103,6 +103,7 @@ NEW:
Removed Mobile Radar Jammer's jamming effect for allied missiles.
Increased the HP of husks from 140 to 280.
Fixed incorrect Red Alert dialog corners.
Added a singleplayer mission menu.
Tiberian Dawn:
Engineers can now regain control over husks.
Chinook rotors now counter-rotate.
@@ -132,6 +133,7 @@ NEW:
The chance of artillery exploding on death has been reduced from 100% to 75%.
Fixed Chinook being unable to land on tiberium.
Commando will no longer shoot at vehicles or buildings.
Added a singleplayer mission menu.
Engine:
The contents of OpenRA.FileFormats.dll have been merged into OpenRA.Game.exe, and namespaces reorganized.
Converted Aircraft CruiseAltitude to world coordinates.

View File

@@ -45,10 +45,12 @@ namespace OpenRA
public static DatabaseReader GeoIpDatabase;
public static void JoinServer(string host, int port, string password)
public static OrderManager JoinServer(string host, int port, string password)
{
JoinInner(new OrderManager(host, port, password,
new ReplayRecorderConnection(new NetworkConnection(host, port), ChooseReplayFilename)));
var om = new OrderManager(host, port, password,
new ReplayRecorderConnection(new NetworkConnection(host, port), ChooseReplayFilename));
JoinInner(om);
return om;
}
static string ChooseReplayFilename()

View File

@@ -24,7 +24,7 @@ namespace OpenRA
Folders, MapFolders, Rules, ServerTraits,
Sequences, VoxelSequences, Cursors, Chrome, Assemblies, ChromeLayout,
Weapons, Voices, Notifications, Music, Movies, Translations, TileSets,
ChromeMetrics, PackageContents, LuaScripts, MapCompatibility;
ChromeMetrics, PackageContents, LuaScripts, MapCompatibility, Missions;
public readonly Dictionary<string, string> Packages;
public readonly MiniYaml LoadScreen;
@@ -62,6 +62,7 @@ namespace OpenRA
ChromeMetrics = YamlList(yaml, "ChromeMetrics");
PackageContents = YamlList(yaml, "PackageContents");
LuaScripts = YamlList(yaml, "LuaScripts");
Missions = YamlList(yaml, "Missions");
LoadScreen = yaml["LoadScreen"];
LobbyDefaults = yaml["LobbyDefaults"];

View File

@@ -381,6 +381,7 @@
<Compile Include="Widgets\BuildPaletteWidget.cs" />
<Compile Include="Widgets\LogicTickerWidget.cs" />
<Compile Include="Widgets\Logic\KickSpectatorsLogic.cs" />
<Compile Include="Widgets\Logic\MissionBrowserLogic.cs" />
<Compile Include="Widgets\Logic\IngameMenuLogic.cs" />
<Compile Include="Widgets\Logic\IrcLogic.cs" />
<Compile Include="Widgets\Logic\KickClientLogic.cs" />

View File

@@ -8,6 +8,7 @@
*/
#endregion
using System.Linq;
using System.Net;
using OpenRA.Widgets;
@@ -15,7 +16,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{
public class MainMenuLogic
{
protected enum MenuType { Main, Extras, None }
protected enum MenuType { Main, Singleplayer, Extras, None }
protected MenuType menuType = MenuType.Main;
Widget rootMenu;
@@ -30,7 +31,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var mainMenu = widget.Get("MAIN_MENU");
mainMenu.IsVisible = () => menuType == MenuType.Main;
mainMenu.Get<ButtonWidget>("SINGLEPLAYER_BUTTON").OnClick = StartSkirmishGame;
mainMenu.Get<ButtonWidget>("SINGLEPLAYER_BUTTON").OnClick = () => menuType = MenuType.Singleplayer;
mainMenu.Get<ButtonWidget>("MULTIPLAYER_BUTTON").OnClick = () =>
{
@@ -61,6 +62,26 @@ namespace OpenRA.Mods.RA.Widgets.Logic
mainMenu.Get<ButtonWidget>("QUIT_BUTTON").OnClick = Game.Exit;
// Singleplayer menu
var singleplayerMenu = widget.Get("SINGLEPLAYER_MENU");
singleplayerMenu.IsVisible = () => menuType == MenuType.Singleplayer;
var missionsButton = singleplayerMenu.Get<ButtonWidget>("MISSIONS_BUTTON");
missionsButton.OnClick = () =>
{
menuType = MenuType.None;
Ui.OpenWindow("MISSIONBROWSER_PANEL", new WidgetArgs
{
{ "onExit", () => menuType = MenuType.Singleplayer },
{ "onStart", RemoveShellmapUI }
});
};
missionsButton.Disabled = !Game.modData.Manifest.Missions.Any();
singleplayerMenu.Get<ButtonWidget>("SKIRMISH_BUTTON").OnClick = StartSkirmishGame;
singleplayerMenu.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => menuType = MenuType.Main;
// Extras menu
var extrasMenu = widget.Get("EXTRAS_MENU");
extrasMenu.IsVisible = () => menuType == MenuType.Extras;

View File

@@ -0,0 +1,110 @@
#region Copyright & License Information
/*
* Copyright 2007-2014 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.IO;
using System.Linq;
using System.Net;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Network;
using OpenRA.Widgets;
namespace OpenRA.Mods.RA.Widgets.Logic
{
public class MissionBrowserLogic
{
readonly Action onStart;
readonly ScrollPanelWidget descriptionPanel;
readonly LabelWidget description;
readonly SpriteFont descriptionFont;
MapPreview selectedMapPreview;
[ObjectCreator.UseCtor]
public MissionBrowserLogic(Widget widget, Action onStart, Action onExit)
{
this.onStart = onStart;
var missionList = widget.Get<ScrollPanelWidget>("MISSION_LIST");
var template = widget.Get<ScrollItemWidget>("MISSION_TEMPLATE");
widget.Get("MISSION_INFO").IsVisible = () => selectedMapPreview != null;
var previewWidget = widget.Get<MapPreviewWidget>("MISSION_PREVIEW");
previewWidget.Preview = () => selectedMapPreview;
descriptionPanel = widget.Get<ScrollPanelWidget>("MISSION_DESCRIPTION_PANEL");
description = widget.Get<LabelWidget>("MISSION_DESCRIPTION");
descriptionFont = Game.Renderer.Fonts[description.Font];
var yaml = new MiniYaml(null, Game.modData.Manifest.Missions.Select(MiniYaml.FromFile).Aggregate(MiniYaml.MergeLiberal)).NodesDict;
var missionMapPaths = yaml["Missions"].Nodes.Select(n => Path.GetFullPath(n.Key));
var maps = Game.modData.MapCache
.Where(p => p.Status == MapStatus.Available && missionMapPaths.Contains(Path.GetFullPath(p.Map.Path)))
.Select(p => p.Map);
missionList.RemoveChildren();
foreach (var m in maps)
{
var map = m;
var item = ScrollItemWidget.Setup(template,
() => selectedMapPreview != null && selectedMapPreview.Uid == map.Uid,
() => SelectMap(map),
StartMission);
item.Get<LabelWidget>("TITLE").GetText = () => map.Title;
missionList.AddChild(item);
}
if (maps.Any())
SelectMap(maps.First());
widget.Get<ButtonWidget>("STARTGAME_BUTTON").OnClick = StartMission;
widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
{
Game.Disconnect();
Ui.CloseWindow();
onExit();
};
}
void SelectMap(Map map)
{
selectedMapPreview = Game.modData.MapCache[map.Uid];
var text = map.Description != null ? map.Description.Replace("\\n", "\n") : "";
text = WidgetUtils.WrapText(text, description.Bounds.Width, descriptionFont);
description.Text = text;
description.Bounds.Height = descriptionFont.Measure(text).Y;
descriptionPanel.Layout.AdjustChildren();
}
void StartMission()
{
OrderManager om = null;
Action lobbyReady = null;
lobbyReady = () =>
{
Game.LobbyInfoChanged -= lobbyReady;
onStart();
om.IssueOrder(Order.Command("state {0}".F(Session.ClientState.Ready)));
};
Game.LobbyInfoChanged += lobbyReady;
om = Game.JoinServer(IPAddress.Loopback.ToString(), Game.CreateLocalServer(selectedMapPreview.Uid), "");
}
}
}

View File

@@ -110,6 +110,38 @@ Container@MENU_BACKGROUND:
Width:140
Height:35
Text:Quit
Container@SINGLEPLAYER_MENU:
Width:PARENT_RIGHT
Visible:False
Children:
Label@SINGLEPLAYER_MENU_TITLE:
X:0
Y:0-30
Width:PARENT_RIGHT
Height:20
Text:Singleplayer
Align:Center
Font:Bold
Contrast:True
Button@SKIRMISH_BUTTON:
X:150
Y:0
Width:140
Height:35
Text:Skirmish
Button@MISSIONS_BUTTON:
X:300
Y:0
Width:140
Height:35
Text:Missions
Button@BACK_BUTTON:
Key:escape
X:600
Y:0
Width:140
Height:35
Text:Back
Container@EXTRAS_MENU:
Width:PARENT_RIGHT
Visible:False

View File

@@ -0,0 +1,82 @@
Container@MISSIONBROWSER_PANEL:
Logic:MissionBrowserLogic
X:(WINDOW_RIGHT - WIDTH)/2
Y:(WINDOW_BOTTOM - HEIGHT)/2
Width:629
Height:399
Children:
Label@MISSIONBROWSER_LABEL_TITLE:
Y:0-25
Width:PARENT_RIGHT
Text:Missions
Align:Center
Font:BigBold
Background@BG:
Width:629
Height:360
Background:panel-black
Children:
ScrollPanel@MISSION_LIST:
X:15
Y:15
Width:260
Height:330
Children:
ScrollItem@MISSION_TEMPLATE:
Width:PARENT_RIGHT-27
Height:25
X:2
Y:0
Visible:False
Children:
Label@TITLE:
X:10
Width:PARENT_RIGHT-20
Height:25
Container@MISSION_INFO:
X:290
Y:15
Width:324
Height:334
Children:
Background@MISSION_BG:
X:0
Y:0
Width:324
Height:160
Background:panel-gray
Children:
MapPreview@MISSION_PREVIEW:
X:2
Y:2
Width:PARENT_RIGHT-4
Height:PARENT_BOTTOM-4
IgnoreMouseOver:True
IgnoreMouseInput:True
ShowSpawnPoints:False
ScrollPanel@MISSION_DESCRIPTION_PANEL:
X:0
Y:171
Width:324
Height:159
Children:
Label@MISSION_DESCRIPTION:
X:5
Y:5
Width:290
VAlign:Top
Button@BACK_BUTTON:
X:0
Y:359
Width:140
Height:35
Text:Back
Font:Bold
Key:escape
Button@STARTGAME_BUTTON:
X:PARENT_RIGHT - 140
Y:359
Width:140
Height:35
Text:Start Game
Font:Bold

BIN
mods/cnc/maps/gdi01/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,7 +6,7 @@ RequiresMod: cnc
Title: Storm the Beachhead
Description: Conversion of the first GDI Mission
Description: Use the units provided to protect the Mobile Construction Vehicle. (MCV)\n\nYou should then deploy the MCV by double clicking on it.\n\nThen you can begin to build up a base. Start with a Power Plant.\n\nFinally, search out and destroy all enemy Nod units in the surrounding area.
Author: Westwood Studios

BIN
mods/cnc/maps/gdi02/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,6 +6,8 @@ RequiresMod: cnc
Title: Knock out the Refinery
Description: Defend your position, deploy the MCV, then build a sizable force to search out and destroy the Nod base in the area.\n\nAll Nod units and structures must be either destroyed or captured to complete objective.
Author: Westwood Studios
Tileset: TEMPERAT

BIN
mods/cnc/maps/gdi03/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,7 +6,7 @@ RequiresMod: cnc
Title: Destroy The SAM Sites
Description: Build up forces to destroy Nod base. Once all Nod SAM sites are neutralized then air support will be provided to combat obstacles such as turrets. Destroy all units and structures to complete the mission objective.
Description: Build up forces to destroy Nod base.\n\nOnce all Nod SAM sites are neutralized then air support will be provided to combat obstacles such as turrets.\n\nDestroy all units and structures to complete the mission objective.
Author: Westwood Studios

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,7 +6,7 @@ RequiresMod: cnc
Title: Get the Rods back (a)
Description: Nod has captured classified GDI property. You must find and retrieve the stolen equipment. It is being transported in a shipping crate. Use the new APC to strategically transport infantry through Nod forces.
Description: Nod has captured classified GDI property.\n\nYou must find and retrieve the stolen equipment.\n\nIt is being transported in a shipping crate.\n\nUse the new APC to strategically transport infantry through Nod forces.
Author: Westwood Studios

BIN
mods/cnc/maps/nod01/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,7 +6,7 @@ RequiresMod: cnc
Title: Nikoomba's Demise
Description: In order for the Brotherhood to gain a foothold, we must begin by eliminating certain elements. Nikoomba, the nearby village's leader, is one such element. His views and ours do not coincide. He and his whole group must be eliminated.
Description: In order for the Brotherhood to gain a foothold, we must begin by eliminating certain elements.\n\nNikoomba, the nearby village's leader, is one such element.\n\nHis views and ours do not coincide.\n\nHe and his whole group must be eliminated.
Author: Westwood Studios

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,7 +6,7 @@ RequiresMod: cnc
Title: Sudanese Prison Break (a)
Description: GDI has established a prison camp, where they are detaining some of the local political leaders. Kane wishes to liberate these victims. Destroy the GDI forces and capture the prison, do not destroy it.
Description: GDI has established a prison camp, where they are detaining some of the local political leaders.\n\nKane wishes to liberate these victims.\n\nDestroy the GDI forces and capture the prison, do not destroy it.
Author: Westwood Studios

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,7 +6,7 @@ RequiresMod: cnc
Title: Sudanese Prison Break (b)
Description: GDI has established a prison camp, where they are detaining some of the local political leaders. Kane wishes to liberate these victims. Destroy the GDI forces and capture the prison, do not destroy it.
Description: GDI has established a prison camp, where they are detaining some of the local political leaders.\n\nKane wishes to liberate these victims.\n\nDestroy the GDI forces and capture the prison, do not destroy it.
Author: Westwood Studios

8
mods/cnc/missions.yaml Normal file
View File

@@ -0,0 +1,8 @@
Missions:
mods/cnc/maps/gdi01
mods/cnc/maps/gdi02
mods/cnc/maps/gdi03
mods/cnc/maps/gdi04a
mods/cnc/maps/nod01
mods/cnc/maps/nod03a
mods/cnc/maps/nod03b

View File

@@ -98,6 +98,7 @@ ChromeLayout:
mods/cnc/chrome/tooltips.yaml
mods/cnc/chrome/irc.yaml
mods/cnc/chrome/assetbrowser.yaml
mods/cnc/chrome/missionbrowser.yaml
Weapons:
mods/cnc/weapons.yaml
@@ -184,3 +185,6 @@ LuaScripts:
mods/common/lua/rules.lua
mods/common/lua/production.lua
mods/common/lua/facing.lua
Missions:
mods/cnc/missions.yaml

View File

@@ -67,6 +67,40 @@ Container@MAINMENU:
Height:30
Text:Quit
Font:Bold
Background@SINGLEPLAYER_MENU:
Width:PARENT_RIGHT
Height:PARENT_BOTTOM
Children:
Label@SINGLEPLAYER_MENU_TITLE:
X:0
Y:20
Width:200
Height:30
Text:Singleplayer
Align:Center
Font:Bold
Button@SKIRMISH_BUTTON:
X:PARENT_RIGHT/2-WIDTH/2
Y:60
Width:140
Height:30
Text:Skirmish
Font:Bold
Button@MISSIONS_BUTTON:
X:PARENT_RIGHT/2-WIDTH/2
Y:100
Width:140
Height:30
Text:Missions
Font:Bold
Button@BACK_BUTTON:
X:PARENT_RIGHT/2-WIDTH/2
Key:escape
Y:260
Width:140
Height:30
Text:Back
Font:Bold
Background@EXTRAS_MENU:
Width:PARENT_RIGHT
Height:PARENT_BOTTOM

View File

@@ -85,6 +85,7 @@ ChromeLayout:
mods/d2k/chrome/tooltips.yaml
mods/ra/chrome/assetbrowser.yaml
mods/ra/chrome/irc.yaml
mods/ra/chrome/missionbrowser.yaml
Weapons:
mods/d2k/weapons.yaml

View File

@@ -80,6 +80,40 @@ Container@MAINMENU:
Height:30
Text:Quit
Font:Bold
Background@SINGLEPLAYER_MENU:
Width:PARENT_RIGHT
Height:PARENT_BOTTOM
Children:
Label@SINGLEPLAYER_MENU_TITLE:
X:0
Y:20
Width:200
Height:30
Text:Singleplayer
Align:Center
Font:Bold
Button@SKIRMISH_BUTTON:
X:PARENT_RIGHT/2-WIDTH/2
Y:60
Width:140
Height:30
Text:Skirmish
Font:Bold
Button@MISSIONS_BUTTON:
X:PARENT_RIGHT/2-WIDTH/2
Y:100
Width:140
Height:30
Text:Missions
Font:Bold
Button@BACK_BUTTON:
X:PARENT_RIGHT/2-WIDTH/2
Key:escape
Y:260
Width:140
Height:30
Text:Back
Font:Bold
Background@EXTRAS_MENU:
Width:PARENT_RIGHT
Height:PARENT_BOTTOM

View File

@@ -0,0 +1,78 @@
Background@MISSIONBROWSER_PANEL:
Logic:MissionBrowserLogic
X:(WINDOW_RIGHT - WIDTH)/2
Y:(WINDOW_BOTTOM - HEIGHT)/2
Width:634
Height:440
Children:
Label@MISSIONBROWSER_LABEL_TITLE:
X:0
Y:20
Width:PARENT_RIGHT
Height:25
Text:Missions
Align:Center
Font:Bold
ScrollPanel@MISSION_LIST:
X:20
Y:50
Width:260
Height:330
Children:
ScrollItem@MISSION_TEMPLATE:
Width:PARENT_RIGHT-27
Height:25
X:2
Y:0
Children:
Label@TITLE:
X:10
Width:PARENT_RIGHT-20
Height:25
Container@MISSION_INFO:
X:290
Y:50
Width:324
Height:330
Children:
Background@MISSION_BG:
X:0
Y:0
Width:324
Height:160
Background:dialog3
Children:
MapPreview@MISSION_PREVIEW:
X:2
Y:2
Width:PARENT_RIGHT-4
Height:PARENT_BOTTOM-4
IgnoreMouseOver:True
IgnoreMouseInput:True
ShowSpawnPoints:False
ScrollPanel@MISSION_DESCRIPTION_PANEL:
X:0
Y:170
Width:324
Height:160
Children:
Label@MISSION_DESCRIPTION:
X:5
Y:5
Width:290
VAlign:Top
Button@STARTGAME_BUTTON:
X:PARENT_RIGHT - 140 - 130
Y:PARENT_BOTTOM - 45
Width:120
Height:25
Text:Start Game
Font:Bold
Button@BACK_BUTTON:
X:PARENT_RIGHT - 140
Y:PARENT_BOTTOM - 45
Width:120
Height:25
Text:Back
Font:Bold
Key:escape

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,7 +6,7 @@ RequiresMod: ra
Title: Allies 01: In the thick of it
Description: In the thick of it
Description: Rescue Einstein from the Headquarters inside this Soviet complex.\n\nOnce found, evacuate him via the helicopter at the signal flare.\n\nEinstein and Tanya must be kept alive at all costs.\n\nBeware the Soviet's Tesla Coils.\n\nDirect Tanya to destroy the westmost power plants to take them off-line.
Author: Westwood Studios

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -1,4 +1,4 @@
Selectable: True
Selectable: False
MapFormat: 6
@@ -6,7 +6,7 @@ RequiresMod: ra
Title: Allies 02: Five to one
Description: Five to one
Description: A critical supply convoy is due through this area in 25 minutes, but Soviet forces have blocked the road in several places.\n\nUnless you can clear them out, those supplies will never make it to the front.\n\nThe convoy will come from the northwest, and time is short so work quickly.
Author: Westwood Studios

3
mods/ra/missions.yaml Normal file
View File

@@ -0,0 +1,3 @@
Missions:
mods/ra/maps/allies-01-classic
mods/ra/maps/allies-02-classic

View File

@@ -99,6 +99,7 @@ ChromeLayout:
mods/ra/chrome/tooltips.yaml
mods/ra/chrome/assetbrowser.yaml
mods/ra/chrome/irc.yaml
mods/ra/chrome/missionbrowser.yaml
Weapons:
mods/ra/weapons.yaml
@@ -181,3 +182,6 @@ LuaScripts:
mods/common/lua/rules.lua
mods/common/lua/production.lua
mods/common/lua/facing.lua
Missions:
mods/ra/missions.yaml

View File

@@ -124,6 +124,7 @@ ChromeLayout:
mods/ra/chrome/tooltips.yaml
mods/ra/chrome/assetbrowser.yaml
mods/ra/chrome/irc.yaml
mods/ra/chrome/missionbrowser.yaml
Weapons:
mods/ts/weapons.yaml