Skip to content

Commit

Permalink
Implement CampaignTagSelector
Browse files Browse the repository at this point in the history
  • Loading branch information
SadPencil committed Mar 7, 2023
1 parent 5febc13 commit c500b57
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 25 deletions.
2 changes: 2 additions & 0 deletions ClientCore/ClientConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,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
1 change: 1 addition & 0 deletions DXMainClient/DXGUI/GameClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ private IServiceProvider BuildServiceProvider(WindowManager windowManager)
.AddSingletonXnaControl<CnCNetGameLoadingLobby>()
.AddSingletonXnaControl<CnCNetLobby>()
.AddSingletonXnaControl<GameInProgressWindow>()
.AddSingletonXnaControl<CampaignTagSelector>()
.AddSingletonXnaControl<SkirmishLobby>()
.AddSingletonXnaControl<MainMenu>()
.AddSingletonXnaControl<MapPreviewBox>()
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;

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

public CampaignTagSelector(WindowManager windowManager, DiscordHandler discordHandler)
: base(windowManager)
{
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;
}
}
10 changes: 8 additions & 2 deletions DXMainClient/DXGUI/Generic/MainMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ public MainMenu(
TopBar topBar,
OptionsWindow optionsWindow,
CnCNetLobby cncnetLobby,
CnCNetManager connectionManager,
CampaignTagSelector campaignTagSelector,
CnCNetManager connectionManager,
DiscordHandler discordHandler,
CnCNetGameLoadingLobby cnCNetGameLoadingLobby,
CnCNetGameLobby cnCNetGameLobby,
Expand All @@ -57,6 +58,7 @@ GameInProgressWindow gameInProgressWindow
this.connectionManager = connectionManager;
this.optionsWindow = optionsWindow;
this.cncnetLobby = cncnetLobby;
this.campaignTagSelector = campaignTagSelector;
this.discordHandler = discordHandler;
this.skirmishLobby = skirmishLobby;
this.cnCNetGameLoadingLobby = cnCNetGameLoadingLobby;
Expand All @@ -78,6 +80,8 @@ GameInProgressWindow gameInProgressWindow

private SkirmishLobby skirmishLobby;

private CampaignTagSelector campaignTagSelector;

private LANLobby lanLobby;

private CnCNetManager connectionManager;
Expand Down Expand Up @@ -548,6 +552,7 @@ private void Clean()
/// </summary>
public void PostInit()
{
DarkeningPanel.AddAndInitializeWithControl(WindowManager, campaignTagSelector);
DarkeningPanel.AddAndInitializeWithControl(WindowManager, skirmishLobby);
DarkeningPanel.AddAndInitializeWithControl(WindowManager, cnCNetGameLoadingLobby);
DarkeningPanel.AddAndInitializeWithControl(WindowManager, cnCNetGameLobby);
Expand All @@ -561,6 +566,7 @@ public void PostInit()
topBar.SetOptionsWindow(optionsWindow);
WindowManager.AddAndInitializeControl(gameInProgressWindow);

campaignTagSelector.Disable();
skirmishLobby.Disable();
cncnetLobby.Disable();
cnCNetGameLobby.Disable();
Expand Down Expand Up @@ -829,7 +835,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 c500b57

Please sign in to comment.