Add support for thirdparty missions.

This commit is contained in:
Paul Chote
2014-10-11 13:52:49 +13:00
parent a870a6e023
commit bba17b93e1
3 changed files with 60 additions and 34 deletions

View File

@@ -85,7 +85,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ "onStart", RemoveShellmapUI } { "onStart", RemoveShellmapUI }
}); });
}; };
missionsButton.Disabled = !Game.modData.Manifest.Missions.Any();
var hasCampaign = Game.modData.Manifest.Missions.Any();
var hasMissions = Game.modData.MapCache
.Any(p => p.Status == MapStatus.Available && p.Map.Type == "Mission" && !p.Map.Selectable);
missionsButton.Disabled = !hasCampaign && !hasMissions;
singleplayerMenu.Get<ButtonWidget>("SKIRMISH_BUTTON").OnClick = StartSkirmishGame; singleplayerMenu.Get<ButtonWidget>("SKIRMISH_BUTTON").OnClick = StartSkirmishGame;

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
@@ -29,6 +30,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic
readonly ButtonWidget stopVideoButton; readonly ButtonWidget stopVideoButton;
readonly VqaPlayerWidget videoPlayer; readonly VqaPlayerWidget videoPlayer;
readonly ScrollPanelWidget missionList;
readonly ScrollItemWidget headerTemplate;
readonly ScrollItemWidget template;
MapPreview selectedMapPreview; MapPreview selectedMapPreview;
bool showVideoPlayer; bool showVideoPlayer;
@@ -38,10 +43,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
this.onStart = onStart; this.onStart = onStart;
var missionList = widget.Get<ScrollPanelWidget>("MISSION_LIST"); missionList = widget.Get<ScrollPanelWidget>("MISSION_LIST");
var headerTemplate = widget.Get<ScrollItemWidget>("HEADER"); headerTemplate = widget.Get<ScrollItemWidget>("HEADER");
var template = widget.Get<ScrollItemWidget>("TEMPLATE"); template = widget.Get<ScrollItemWidget>("TEMPLATE");
var title = widget.GetOrNull<LabelWidget>("MISSIONBROWSER_TITLE"); var title = widget.GetOrNull<LabelWidget>("MISSIONBROWSER_TITLE");
if (title != null) if (title != null)
@@ -66,43 +71,42 @@ namespace OpenRA.Mods.RA.Widgets.Logic
stopVideoButton.IsVisible = () => showVideoPlayer; stopVideoButton.IsVisible = () => showVideoPlayer;
stopVideoButton.OnClick = StopVideo; stopVideoButton.OnClick = StopVideo;
var yaml = new MiniYaml(null, Game.modData.Manifest.Missions.Select(MiniYaml.FromFile).Aggregate(MiniYaml.MergeLiberal)).ToDictionary(); var allMaps = new List<Map>();
missionList.RemoveChildren(); missionList.RemoveChildren();
var selectedFirst = false; // Add a group for each campaign
foreach (var kv in yaml) if (Game.modData.Manifest.Missions.Any())
{ {
var header = ScrollItemWidget.Setup(headerTemplate, () => true, () => {}); var yaml = Game.modData.Manifest.Missions.Select(MiniYaml.FromFile).Aggregate(MiniYaml.MergeLiberal);
header.Get<LabelWidget>("LABEL").GetText = () => kv.Key;
missionList.AddChild(header);
var missionMapPaths = kv.Value.Nodes.Select(n => Platform.ResolvePath(n.Key)); foreach (var kv in yaml)
var maps = Game.modData.MapCache
.Where(p => p.Status == MapStatus.Available && missionMapPaths.Contains(Path.GetFullPath(p.Map.Path)))
.Select(p => p.Map);
foreach (var m in maps)
{ {
var map = m; var missionMapPaths = kv.Value.Nodes.Select(n => Path.GetFullPath(n.Key));
var item = ScrollItemWidget.Setup(template, var maps = Game.modData.MapCache
() => selectedMapPreview != null && selectedMapPreview.Uid == map.Uid, .Where(p => p.Status == MapStatus.Available && missionMapPaths.Contains(Path.GetFullPath(p.Map.Path)))
() => SelectMap(map), .Select(p => p.Map);
StartMission);
item.Get<LabelWidget>("TITLE").GetText = () => map.Title; CreateMissionGroup(kv.Key, maps);
missionList.AddChild(item); allMaps.AddRange(maps);
if (!selectedFirst)
{
SelectMap(map);
selectedFirst = true;
}
} }
} }
// Add an additional group for loose missions
// Loose missions must define Type: Mission and Selectable: false.
var looseMissions = Game.modData.MapCache
.Where(p => p.Status == MapStatus.Available && p.Map.Type == "Mission" && !p.Map.Selectable && !allMaps.Contains(p.Map))
.Select(p => p.Map);
if (looseMissions.Any())
{
CreateMissionGroup("Missions", looseMissions);
allMaps.AddRange(looseMissions);
}
if (allMaps.Any())
SelectMap(allMaps.First());
widget.Get<ButtonWidget>("STARTGAME_BUTTON").OnClick = StartMission; widget.Get<ButtonWidget>("STARTGAME_BUTTON").OnClick = StartMission;
widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
@@ -114,6 +118,26 @@ namespace OpenRA.Mods.RA.Widgets.Logic
}; };
} }
void CreateMissionGroup(string title, IEnumerable<Map> maps)
{
var header = ScrollItemWidget.Setup(headerTemplate, () => true, () => {});
header.Get<LabelWidget>("LABEL").GetText = () => title;
missionList.AddChild(header);
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);
}
}
float cachedSoundVolume; float cachedSoundVolume;
float cachedMusicVolume; float cachedMusicVolume;
void SelectMap(Map map) void SelectMap(Map map)

View File

@@ -1,6 +1,3 @@
Allied Campaign: Allied Campaign:
./mods/ra/maps/allies-01-classic ./mods/ra/maps/allies-01-classic
./mods/ra/maps/allies-02-classic ./mods/ra/maps/allies-02-classic
Missions:
./mods/ra/maps/intervention