Skip to content

Commit

Permalink
Implement campaign tag selector
Browse files Browse the repository at this point in the history
  • Loading branch information
SadPencil committed Nov 16, 2022
1 parent cff4c53 commit 51208f1
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 41 deletions.
2 changes: 2 additions & 0 deletions ClientCore/ClientConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,8 @@ public string GetThemePath(string themeName)

public string AllowedCustomGameModes => clientDefinitionsIni.GetStringValue(SETTINGS, "AllowedCustomGameModes", "Standard,Custom Map");

public bool CampaignTagSelectorEnabled => clientDefinitionsIni.GetBooleanValue(SETTINGS, "CampaignTagSelectorEnabled", false);

public string GetGameExecutableName()
{
string[] exeNames = clientDefinitionsIni.GetStringValue(SETTINGS, "GameExecutableNames", "Game.exe").Split(',');
Expand Down
70 changes: 52 additions & 18 deletions DXMainClient/DXGUI/Generic/CampaignSelector.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
using ClientCore;
using Microsoft.Xna.Framework;
using System;
using System;
using System.Collections.Generic;
using DTAClient.Domain;
using System.IO;
using System.Linq;
using ClientCore;
using ClientGUI;
using Rampastring.XNAUI.XNAControls;
using Rampastring.XNAUI;
using Rampastring.Tools;
using ClientUpdater;
using DTAClient.Domain;
using Localization;
using Microsoft.Xna.Framework;
using Rampastring.Tools;
using Rampastring.XNAUI;
using Rampastring.XNAUI.XNAControls;

namespace DTAClient.DXGUI.Generic
{
Expand All @@ -34,7 +35,8 @@ public CampaignSelector(WindowManager windowManager, DiscordHandler discordHandl

private DiscordHandler discordHandler;

private List<Mission> Missions = new List<Mission>();
private List<Mission> allMissions = new List<Mission>();
private List<Mission> lbCampaignListMissions = new List<Mission>();
private XNAListBox lbCampaignList;
private XNAClientButton btnLaunch;
private XNATextBlock tbMissionDescription;
Expand Down Expand Up @@ -199,7 +201,7 @@ private void LbCampaignList_SelectedIndexChanged(object sender, EventArgs e)
return;
}

Mission mission = Missions[lbCampaignList.SelectedIndex];
Mission mission = lbCampaignListMissions[lbCampaignList.SelectedIndex];

if (string.IsNullOrEmpty(mission.Scenario))
{
Expand All @@ -221,14 +223,14 @@ private void LbCampaignList_SelectedIndexChanged(object sender, EventArgs e)

private void BtnCancel_LeftClick(object sender, EventArgs e)
{
Enabled = false;
Disable();
}

private void BtnLaunch_LeftClick(object sender, EventArgs e)
{
int selectedMissionId = lbCampaignList.SelectedIndex;

Mission mission = Missions[selectedMissionId];
Mission mission = lbCampaignListMissions[selectedMissionId];

if (!ClientConfiguration.Instance.ModMode &&
(!Updater.IsFileNonexistantOrOriginal(mission.Scenario) || AreFilesModified()))
Expand Down Expand Up @@ -313,7 +315,7 @@ private void LaunchMission(Mission mission)
UserINISettings.Instance.Difficulty.Value = trbDifficultySelector.Value;
UserINISettings.Instance.SaveSettings();

((MainMenuDarkeningPanel)Parent).Hide();
Disable();

discordHandler?.UpdatePresence(mission.GUIName, difficultyName, mission.IconPath, true);
GameProcessLogic.GameProcessExited += GameProcessExited_Callback;
Expand All @@ -340,7 +342,7 @@ private void ReadMissionList()
{
ParseBattleIni("INI/Battle.ini");

if (Missions.Count == 0)
if (allMissions.Count == 0)
ParseBattleIni("INI/" + ClientConfiguration.Instance.BattleFSFileName);
}

Expand All @@ -360,7 +362,7 @@ private bool ParseBattleIni(string path)
return false;
}

if (Missions.Count > 0)
if (lbCampaignListMissions.Count > 0)
{
throw new InvalidOperationException("Loading multiple Battle*.ini files is not supported anymore.");
}
Expand All @@ -381,9 +383,41 @@ private bool ParseBattleIni(string path)
continue;

var mission = new Mission(battleIni, battleSection, i);
allMissions.Add(mission);
}

LoadMissionsWithFilter(null);

Missions.Add(mission);
Logger.Log("Finished parsing " + path + ".");
return true;
}

/// <summary>
/// Load or re-load missons with selected tags.
/// </summary>
/// <param name="selectedTags">Missions with at lease one of which tags to be shown. As an exception, null means show all missions.</param>
public void LoadMissionsWithFilter(ISet<string> selectedTags)
{
lbCampaignListMissions.Clear();

lbCampaignList.IsChangingSize = true;

lbCampaignList.Clear();
lbCampaignList.SelectedIndex = -1;

// The following two lines are handled by LbCampaignList_SelectedIndexChanged
// tbMissionDescription.Text = string.Empty;
// btnLaunch.AllowClick = false;

// Select missions with the filter
if (selectedTags != null)
lbCampaignListMissions = allMissions.Where(mission => mission.Tags.Intersect(selectedTags).Any()).ToList();
else
lbCampaignListMissions = allMissions.ToList();

// Update lbCampaignList with selected missions
foreach (Mission mission in lbCampaignListMissions)
{
var item = new XNAListBoxItem();
item.Text = mission.GUIName;
if (!mission.Enabled)
Expand All @@ -408,10 +442,10 @@ private bool ParseBattleIni(string path)
lbCampaignList.AddItem(item);
}

Logger.Log("Finished parsing " + path + ".");
return true;
}
lbCampaignList.IsChangingSize = false;

lbCampaignList.TopIndex = 0;
}
public override void Draw(GameTime gameTime)
{
base.Draw(gameTime);
Expand Down
85 changes: 85 additions & 0 deletions DXMainClient/DXGUI/Generic/CampaignTagSelector.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ClientCore;
using ClientGUI;
using DTAClient.Domain;
using Localization;
using Microsoft.Xna.Framework;
using Rampastring.Tools;
using Rampastring.XNAUI;
using Rampastring.XNAUI.XNAControls;

namespace DTAClient.DXGUI.Generic
{
public class CampaignTagSelector : INItializableWindow
{
private const int DEFAULT_WIDTH = 576;
private const int DEFAULT_HEIGHT = 475;
private string _iniSectionName;
private DiscordHandler discordHandler;

public CampaignTagSelector(WindowManager windowManager, string iniName, DiscordHandler discordHandler) : base(windowManager)
{
_iniSectionName = iniName;
this.discordHandler = discordHandler;
}
protected XNAClientButton btnCancel;
protected XNAClientButton btnShowAllMission;
public override void Initialize()
{
CampaignSelector = new CampaignSelector(WindowManager, discordHandler);
DarkeningPanel.AddAndInitializeWithControl(WindowManager, CampaignSelector);
CampaignSelector.Disable();

Name = _iniSectionName;

if (!ClientConfiguration.Instance.CampaignTagSelectorEnabled) return;

ClientRectangle = new Rectangle(0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT);
BorderColor = UISettings.ActiveSettings.PanelBorderColor;

base.Initialize();

WindowManager.CenterControlOnScreen(this);

btnCancel = FindChild<XNAClientButton>(nameof(btnCancel));
btnCancel.LeftClick += BtnCancel_LeftClick;
btnShowAllMission = FindChild<XNAClientButton>(nameof(btnShowAllMission));
btnShowAllMission.LeftClick += (sender, e) =>
{
CampaignSelector.LoadMissionsWithFilter(null);
CampaignSelector.Enable();
Disable();
};

const string TagButtonsPrefix = "ButtonTag_";
var tagButtons = FindChildrenStartWith<XNAClientButton>(TagButtonsPrefix);
foreach (var tagButton in tagButtons)
{
string tagName = tagButton.Name.Substring(TagButtonsPrefix.Length);
tagButton.LeftClick += (sender, e) =>
{
CampaignSelector.LoadMissionsWithFilter(new HashSet<string>() { tagName });
CampaignSelector.Enable();
Disable();
};
}
}

private void BtnCancel_LeftClick(object sender, EventArgs e)
{
Disable();
}

public void Open()
{
if (ClientConfiguration.Instance.CampaignTagSelectorEnabled)
Enable();
else
CampaignSelector.Enable();
}

CampaignSelector CampaignSelector;
}
}
31 changes: 14 additions & 17 deletions DXMainClient/DXGUI/Generic/LoadingScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
using Rampastring.Tools;
using ClientUpdater;
using SkirmishLobby = DTAClient.DXGUI.Multiplayer.GameLobby.SkirmishLobby;
using System.Collections.Generic;
using Rampastring.XNAUI.XNAControls;

namespace DTAClient.DXGUI.Generic
{
Expand Down Expand Up @@ -131,21 +133,22 @@ private void Finish()

topBar.SetSecondarySwitch(cncnetLobby);

var campaignTagSelector = new CampaignTagSelector(WindowManager, nameof(CampaignTagSelector), discordHandler);

var mainMenu = new MainMenu(WindowManager, skirmishLobby, lanLobby,
topBar, optionsWindow, cncnetLobby, cncnetManager, discordHandler);
topBar, optionsWindow, cncnetLobby, campaignTagSelector, cncnetManager, discordHandler);
WindowManager.AddAndInitializeControl(mainMenu);

DarkeningPanel.AddAndInitializeWithControl(WindowManager, skirmishLobby);

DarkeningPanel.AddAndInitializeWithControl(WindowManager, cncnetGameLoadingLobby);

DarkeningPanel.AddAndInitializeWithControl(WindowManager, cncnetGameLobby);

DarkeningPanel.AddAndInitializeWithControl(WindowManager, cncnetLobby);

DarkeningPanel.AddAndInitializeWithControl(WindowManager, lanLobby);
List<XNAControl> controlsToBeInitialized = new List<XNAControl>()
{
skirmishLobby, cncnetGameLoadingLobby, cncnetGameLobby, cncnetLobby, lanLobby, optionsWindow, campaignTagSelector,
};

DarkeningPanel.AddAndInitializeWithControl(WindowManager, optionsWindow);
foreach (var control in controlsToBeInitialized)
{
DarkeningPanel.AddAndInitializeWithControl(WindowManager, control);
control.Disable();
}

WindowManager.AddAndInitializeControl(privateMessagingPanel);
privateMessagingPanel.AddChild(pmWindow);
Expand All @@ -154,13 +157,7 @@ private void Finish()
topBar.SetOptionsWindow(optionsWindow);

WindowManager.AddAndInitializeControl(gipw);
skirmishLobby.Disable();
cncnetLobby.Disable();
cncnetGameLobby.Disable();
cncnetGameLoadingLobby.Disable();
lanLobby.Disable();
pmWindow.Disable();
optionsWindow.Disable();

WindowManager.AddAndInitializeControl(topBar);
topBar.AddPrimarySwitchable(mainMenu);
Expand Down
6 changes: 5 additions & 1 deletion DXMainClient/DXGUI/Generic/MainMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class MainMenu : XNAWindow, ISwitchable
public MainMenu(WindowManager windowManager, SkirmishLobby skirmishLobby,
LANLobby lanLobby, TopBar topBar, OptionsWindow optionsWindow,
CnCNetLobby cncnetLobby,
CampaignTagSelector campaignTagSelector,
CnCNetManager connectionManager, DiscordHandler discordHandler) : base(windowManager)
{
this.skirmishLobby = skirmishLobby;
Expand All @@ -47,6 +48,7 @@ public MainMenu(WindowManager windowManager, SkirmishLobby skirmishLobby,
this.connectionManager = connectionManager;
this.optionsWindow = optionsWindow;
this.cncnetLobby = cncnetLobby;
this.campaignTagSelector = campaignTagSelector;
this.discordHandler = discordHandler;
cncnetLobby.UpdateCheck += CncnetLobby_UpdateCheck;
isMediaPlayerAvailable = IsMediaPlayerAvailable();
Expand All @@ -62,6 +64,8 @@ public MainMenu(WindowManager windowManager, SkirmishLobby skirmishLobby,

private SkirmishLobby skirmishLobby;

private CampaignTagSelector campaignTagSelector;

private LANLobby lanLobby;

private CnCNetManager connectionManager;
Expand Down Expand Up @@ -783,7 +787,7 @@ private void BtnOptions_LeftClick(object sender, EventArgs e)
=> optionsWindow.Open();

private void BtnNewCampaign_LeftClick(object sender, EventArgs e)
=> innerPanel.Show(innerPanel.CampaignSelector);
=> campaignTagSelector.Open();

private void BtnLoadGame_LeftClick(object sender, EventArgs e)
=> innerPanel.Show(innerPanel.GameLoadingWindow);
Expand Down
4 changes: 0 additions & 4 deletions DXMainClient/DXGUI/Generic/MainMenuDarkeningPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ public MainMenuDarkeningPanel(WindowManager windowManager, DiscordHandler discor

private DiscordHandler discordHandler;

public CampaignSelector CampaignSelector;
public GameLoadingWindow GameLoadingWindow;
public StatisticsWindow StatisticsWindow;
public UpdateQueryWindow UpdateQueryWindow;
Expand All @@ -40,9 +39,6 @@ public override void Initialize()
PanelBackgroundDrawMode = PanelBackgroundImageDrawMode.STRETCHED;
Alpha = 1.0f;

CampaignSelector = new CampaignSelector(WindowManager, discordHandler);
AddChild(CampaignSelector);

GameLoadingWindow = new GameLoadingWindow(WindowManager, discordHandler);
AddChild(GameLoadingWindow);

Expand Down
4 changes: 3 additions & 1 deletion DXMainClient/Domain/Mission.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Rampastring.Tools;
using System;
using System.Collections.Generic;

namespace DTAClient.Domain
{
Expand All @@ -22,7 +23,7 @@ public Mission(IniFile iniFile, string sectionName, int index)
Enabled = iniFile.GetBooleanValue(sectionName, nameof(Enabled), true);
BuildOffAlly = iniFile.GetBooleanValue(sectionName, nameof(BuildOffAlly), false);
PlayerAlwaysOnNormalDifficulty = iniFile.GetBooleanValue(sectionName, nameof(PlayerAlwaysOnNormalDifficulty), false);

Tags = iniFile.GetStringValue(sectionName, nameof(Tags), string.Empty).Split(',');
GUIDescription = GUIDescription.Replace("@", Environment.NewLine);
}

Expand All @@ -38,5 +39,6 @@ public Mission(IniFile iniFile, string sectionName, int index)
public bool Enabled { get; }
public bool BuildOffAlly { get; }
public bool PlayerAlwaysOnNormalDifficulty { get; }
public string[] Tags { get; }
}
}

0 comments on commit 51208f1

Please sign in to comment.