Switch-Toolbox/Toolbox/GUI/Settings.cs
KillzXGaming 61550ac786 Alot of Pokemon additions.
Redid gfmdl parser completely. This allows the file to be rebuilt for custom models which will be coming soon.
Textures now load in the gfmdl section to easily edit without touching bntx.
Added a basic material editor (more like a viewer atm) for gfbmdl.
Added a Pokemon viewer (requires game path to be set). This shows icons of all the pokemon and opens the archive they are located in.
Start to parse GFBANIM. Not previewable yet because of rotations breaking. If anyone wants to help though be my guest :)
Basic GFBANIMCFG support. It can be used to view animation file names.
2019-11-26 19:54:59 -05:00

695 lines
26 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Toolbox.Library;
using Toolbox.Library.Forms;
namespace Toolbox
{
public partial class Settings : STForm
{
private bool IsStartup = false;
public Settings()
{
CanResize = false;
IsStartup = true;
InitializeComponent();
stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor;
Text = "Settings";
foreach (Runtime.ViewportShading shading in Enum.GetValues(typeof(Runtime.ViewportShading)))
{
shadingComboBox.Items.Add(shading.ToString());
}
foreach (Runtime.CameraMovement shading in Enum.GetValues(typeof(Runtime.CameraMovement)))
{
camMoveComboBox.Items.Add(shading.ToString());
}
foreach (FormThemes.Preset themes in Enum.GetValues(typeof(FormThemes.Preset)))
{
formThemeCB.Items.Add(themes);
}
foreach (TEX_FORMAT format in Enum.GetValues(typeof(TEX_FORMAT)))
{
preferredTexFormatCB.Items.Add(format);
}
uvChannelRB.Checked = true;
uvChannelRB.Visible = false;
uvChannelRB2.Visible = false;
uvChannelRB3.Visible = false;
normalsLineUD.Value = (decimal)Runtime.normalsLineLength;
normalPointsCB.Checked = Runtime.renderNormalsPoints;
vtxColorCB.Checked = Runtime.renderVertColor;
gridColorPB.BackColor = Runtime.gridSettings.color;
gridCellCountUD.Value = Runtime.gridSettings.CellAmount;
gridCellSizeUD.Value = (decimal)Runtime.gridSettings.CellSize;
bgGradientTop.BackColor = Runtime.backgroundGradientTop;
bgGradientBottom.BackColor = Runtime.backgroundGradientBottom;
preferredTexFormatCB.SelectedItem = Runtime.PreferredTexFormat;
formThemeCB.SelectedItem = FormThemes.ActivePreset;
chkBoxNormalMap.Checked = Runtime.useNormalMap;
chkBoxDisplayModels.Checked = Runtime.RenderModels;
chkBoxDisplayWireframe.Checked = Runtime.RenderModelWireframe;
chkBoxSpecular.Checked = Runtime.renderSpecular;
chkBoxStereoscopy.Checked = Runtime.stereoscopy;
chkBoxDisplayPolyCount.Checked = Runtime.DisplayPolyCount;
camNearNumUD.Value = (decimal)Runtime.CameraNear;
camFarNumUD.Value = (decimal)Runtime.CameraFar;
previewScaleUD.Value = (decimal)Runtime.previewScale;
yazoCompressionLevelUD.Value = Runtime.Yaz0CompressionLevel;
enableVersionCheckCHK.Checked = Runtime.EnableVersionCheck;
chkBoxEnablePBR.Checked = Runtime.EnablePBR;
chkBoxMdiMaximized.Checked = Runtime.MaximizeMdiWindow;
chkBoxDisplayBones.Checked = Runtime.renderBones;
boneSizeUD.Value = (decimal)Runtime.bonePointSize;
cameraMaxSpeedUD.Value = (decimal)Runtime.MaxCameraSpeed;
boneXRayChk.Checked = Runtime.boneXrayDisplay;
mk8DPathTB.Text = Runtime.Mk8dGamePath;
mk8PathTB.Text = Runtime.Mk8GamePath;
SMOPathTB.Text = Runtime.SmoGamePath;
botwGamePathTB.Text = Runtime.BotwGamePath;
tpGamePathTB.Text = Runtime.TpGamePath;
modelLoadArchive.Checked = Runtime.ObjectEditor.OpenModelsOnOpen;
specularCubemapPathTB.Text = System.IO.Path.GetFileName(Runtime.PBR.SpecularCubeMapPath);
diffuseCubemapPathTB.Text = System.IO.Path.GetFileName(Runtime.PBR.DiffuseCubeMapPath);
chkUseSkyobx.Checked = Runtime.PBR.UseSkybox;
chkDiffyseSkybox.Checked = Runtime.PBR.UseDiffuseSkyTexture;
chkDiffyseSkybox.Enabled = chkUseSkyobx.Checked;
chkBotwFileTable.Checked = Runtime.ResourceTables.BotwTable;
chkTpFileTable.Checked = Runtime.ResourceTables.TpTable;
chkFrameCamera.Checked = Runtime.FrameCamera;
chkAlwaysCompressOnSave.Checked = Runtime.AlwaysCompressOnSave;
displayBoundingBoxeChk.Checked = Runtime.renderBoundingBoxes;
mk8DPathTB.ReadOnly = true;
mk8PathTB.ReadOnly = true;
SMOPathTB.ReadOnly = true;
GLSLVerLabel.Text = $"Open GL Version: {Runtime.GLSLVersion}";
openGLVerLabel.Text = $"GLSL Version: {Runtime.openGLVersion}";
shadingComboBox.SelectedIndex = (int)Runtime.viewportShading;
camMoveComboBox.SelectedIndex = (int)Runtime.cameraMovement;
IsStartup = false;
}
private void shadingComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
Runtime.viewportShading = (Runtime.ViewportShading)shadingComboBox.SelectedIndex;
if (Runtime.viewportShading == Runtime.ViewportShading.UVCoords ||
Runtime.viewportShading == Runtime.ViewportShading.UVTestPattern)
{
uvChannelRB.Visible = true;
uvChannelRB2.Visible = true;
uvChannelRB3.Visible = true;
}
else
{
uvChannelRB.Visible = false;
uvChannelRB2.Visible = false;
uvChannelRB3.Visible = false;
}
UpdateViewportSettings();
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
Runtime.useNormalMap = chkBoxNormalMap.Checked;
UpdateViewportSettings();
}
private void chkBoxDisplayModels_CheckedChanged(object sender, EventArgs e)
{
Runtime.RenderModels = chkBoxDisplayModels.Checked;
UpdateViewportSettings();
}
private void chkBoxDisplayWireframe_CheckedChanged(object sender, EventArgs e)
{
Runtime.RenderModelWireframe = chkBoxDisplayWireframe.Checked;
UpdateViewportSettings();
}
private void camMoveComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
Runtime.cameraMovement = (Runtime.CameraMovement)camMoveComboBox.SelectedIndex;
UpdateViewportSettings(true);
}
private void checkBox1_CheckedChanged_1(object sender, EventArgs e)
{
Runtime.stereoscopy = chkBoxStereoscopy.Checked;
UpdateViewportSettings(true);
}
private void camNearNumUD_ValueChanged(object sender, EventArgs e)
{
Runtime.CameraNear = (float)camNearNumUD.Value;
UpdateViewportSettings(true);
}
private void camFarNumUD_ValueChanged(object sender, EventArgs e)
{
Runtime.CameraFar = (float)camFarNumUD.Value;
UpdateViewportSettings(true);
}
private void btnSave_Click(object sender, EventArgs e)
{
UpdateViewportSettings(true);
Config.Save();
this.Close();
}
private void chkBoxDisplayPolyCount_CheckedChanged(object sender, EventArgs e)
{
Runtime.DisplayPolyCount = chkBoxDisplayPolyCount.Checked;
}
private void Settings_Load(object sender, EventArgs e)
{
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
Runtime.previewScale = (float)previewScaleUD.Value;
UpdateViewportSettings();
}
private void yazoCompressionLevelUD_ValueChanged(object sender, EventArgs e)
{
Runtime.Yaz0CompressionLevel = (int)yazoCompressionLevelUD.Value;
}
private void checkBox1_CheckedChanged_2(object sender, EventArgs e)
{
Runtime.EnableVersionCheck = enableVersionCheckCHK.Checked;
}
private void chkBoxEnablePBR_CheckedChanged(object sender, EventArgs e)
{
Runtime.EnablePBR = chkBoxEnablePBR.Checked;
UpdateViewportSettings();
}
private void UpdateViewportSettings(bool UpdateRuntimeValues = false)
{
if (IsStartup)
return;
Viewport viewport = LibraryGUI.GetActiveViewport();
if (viewport == null)
return;
if (UpdateRuntimeValues) //Update only if necessary since it can be slow
viewport.LoadViewportRuntimeValues();
viewport.UpdateViewport();
}
private void formThemeCB_SelectedIndexChanged(object sender, EventArgs e)
{
if (formThemeCB.SelectedIndex >= 0 && !IsStartup)
{
var result = MessageBox.Show("Changing themes will require to restart the program. Do you want to restart now?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
FormThemes.ActivePreset = (FormThemes.Preset)formThemeCB.SelectedItem;
if (result == DialogResult.Yes)
{
Config.Save();
this.Close();
Application.Restart();
Environment.Exit(0);
}
}
}
private void chkBoxMdiMaximized_CheckedChanged_3(object sender, EventArgs e)
{
Runtime.MaximizeMdiWindow = chkBoxMdiMaximized.Checked;
}
private void preferredTexFormatCB_SelectedIndexChanged(object sender, EventArgs e)
{
if (preferredTexFormatCB.SelectedIndex >= 0)
{
Runtime.PreferredTexFormat = (TEX_FORMAT)preferredTexFormatCB.SelectedItem;
}
}
private void bgGradientTop_Click(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
if (dlg.ShowDialog() == DialogResult.OK)
Runtime.backgroundGradientTop = dlg.Color;
bgGradientTop.BackColor = Runtime.backgroundGradientTop;
UpdateViewportSettings();
}
private void bgGradientBottom_Click(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
if (dlg.ShowDialog() == DialogResult.OK)
Runtime.backgroundGradientBottom = dlg.Color;
bgGradientBottom.BackColor = Runtime.backgroundGradientBottom;
UpdateViewportSettings();
}
#region Grid Settings
private void girdCellSizeUD_ValueChanged(object sender, EventArgs e)
{
Runtime.gridSettings.CellSize = (float)gridCellSizeUD.Value;
UpdateViewportGrid();
}
private void gridCellCountUD_ValueChanged(object sender, EventArgs e)
{
Runtime.gridSettings.CellAmount = (uint)gridCellCountUD.Value;
UpdateViewportGrid();
}
private void gridColorPB_Click(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
if (dlg.ShowDialog() == DialogResult.OK)
Runtime.gridSettings.color = dlg.Color;
gridColorPB.BackColor = Runtime.gridSettings.color;
UpdateViewportGrid();
}
private void UpdateViewportGrid()
{
if (IsStartup)
return;
Viewport viewport = LibraryGUI.GetActiveViewport();
if (viewport == null)
return;
viewport.UpdateGrid();
}
#endregion
private void vtxColorCB_CheckedChanged(object sender, EventArgs e)
{
Runtime.renderVertColor = vtxColorCB.Checked;
UpdateViewportSettings();
}
private void normalPointsCB_CheckedChanged(object sender, EventArgs e)
{
Runtime.renderNormalsPoints = normalPointsCB.Checked;
UpdateViewportSettings();
}
private void normalsLineUD_ValueChanged(object sender, EventArgs e)
{
Runtime.normalsLineLength = (float)normalsLineUD.Value;
UpdateViewportSettings();
}
private void chkBoxDisplayBones_CheckedChanged(object sender, EventArgs e)
{
Runtime.renderBones = chkBoxDisplayBones.Checked;
UpdateViewportSettings();
}
private void boneSizeUD_ValueChanged(object sender, EventArgs e)
{
Runtime.bonePointSize = (float)boneSizeUD.Value;
UpdateViewportSettings();
}
private void redChannelBtn_Click(object sender, EventArgs e) {
if (Runtime.renderR) {
Runtime.renderR = false;
redChannelBtn.BackColor = FormThemes.BaseTheme.DisabledBorderColor;
redChannelBtn.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
}
else {
Runtime.renderR = true;
redChannelBtn.BackColor = Color.FromArgb(192, 0, 0);
redChannelBtn.ForeColor = FormThemes.BaseTheme.FormForeColor;
}
UpdateViewportSettings();
}
private void greenChannelBtn_Click(object sender, EventArgs e) {
if (Runtime.renderG)
{
Runtime.renderG = false;
greenChannelBtn.BackColor = FormThemes.BaseTheme.DisabledBorderColor;
greenChannelBtn.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
}
else
{
Runtime.renderG = true;
greenChannelBtn.BackColor = Color.FromArgb(0, 192, 0);
greenChannelBtn.ForeColor = FormThemes.BaseTheme.FormForeColor;
}
UpdateViewportSettings();
}
private void blueChannelBtn_Click(object sender, EventArgs e) {
if (Runtime.renderB)
{
Runtime.renderB = false;
blueChannelBtn.BackColor = FormThemes.BaseTheme.DisabledBorderColor;
blueChannelBtn.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
}
else
{
Runtime.renderB = true;
blueChannelBtn.BackColor = Color.FromArgb(0, 0, 192);
blueChannelBtn.ForeColor = FormThemes.BaseTheme.FormForeColor;
}
UpdateViewportSettings();
}
private void alphaChannelBtn_Click(object sender, EventArgs e) {
if (Runtime.renderAlpha)
{
Runtime.renderAlpha = false;
alphaChannelBtn.BackColor = FormThemes.BaseTheme.DisabledBorderColor;
alphaChannelBtn.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
}
else
{
Runtime.renderAlpha = true;
alphaChannelBtn.BackColor = Color.Silver;
alphaChannelBtn.ForeColor = FormThemes.BaseTheme.FormForeColor;
}
UpdateViewportSettings();
}
private void cameraMaxSpeedUD_ValueChanged(object sender, EventArgs e) {
Runtime.MaxCameraSpeed = (float)cameraMaxSpeedUD.Value;
}
private void boneXRayChk_CheckedChanged(object sender, EventArgs e) {
Runtime.boneXrayDisplay = boneXRayChk.Checked;
UpdateViewportSettings();
}
private void mk8PathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK) {
mk8PathTB.Text = sfd.SelectedPath;
Runtime.Mk8GamePath = mk8PathTB.Text;
}
}
private void mk8DPathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
mk8DPathTB.Text = sfd.SelectedPath;
Runtime.Mk8dGamePath = mk8DPathTB.Text;
}
}
private void SMOPathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
SMOPathTB.Text = sfd.SelectedPath;
Runtime.SmoGamePath = SMOPathTB.Text;
}
}
private void tpGamePathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
tpGamePathTB.Text = sfd.SelectedPath;
Runtime.TpGamePath = tpGamePathTB.Text;
}
}
private void botwGamePathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
if (!IsValidBotwDirectory(sfd.SelectedPath))
throw new Exception("Invalid path choosen. Make sure you have atleast an RSTB file in the path! |System/Resource/ResourceSizeTable.product.srsizetable|");
botwGamePathTB.Text = sfd.SelectedPath;
Runtime.BotwGamePath = botwGamePathTB.Text;
}
}
private void displayBoundingBoxeChk_CheckedChanged(object sender, EventArgs e) {
Runtime.renderBoundingBoxes = displayBoundingBoxeChk.Checked;
}
private void modelLoadArchive_CheckedChanged(object sender, EventArgs e) {
Runtime.ObjectEditor.OpenModelsOnOpen = modelLoadArchive.Checked;
}
private void cubemapPathTB_Click(object sender, EventArgs e) {
OpenFileDialog sfd = new OpenFileDialog();
sfd.Filter = "DDS |*.dds;";
if (sfd.ShowDialog() == DialogResult.OK)
{
if (IsValidCubeMap(sfd.FileName))
{
specularCubemapPathTB.Text = System.IO.Path.GetFileName(sfd.FileName);
Runtime.PBR.SpecularCubeMapPath = sfd.FileName;
RenderTools.ResetSpecularCubeMap();
UpdateViewportSettings();
}
else
MessageBox.Show("Invalid cube map file. Make sure it is a DDS with a cube map.");
}
}
private void diffuseCubemapPathTBB_Click(object sender, EventArgs e) {
OpenFileDialog sfd = new OpenFileDialog();
sfd.Filter = "DDS |*.dds;";
if (sfd.ShowDialog() == DialogResult.OK)
{
if (IsValidCubeMap(sfd.FileName))
{
diffuseCubemapPathTB.Text = System.IO.Path.GetFileName(sfd.FileName);
Runtime.PBR.DiffuseCubeMapPath = sfd.FileName;
RenderTools.ResetDiffuseCubeMap();
UpdateViewportSettings();
}
else
MessageBox.Show("Invalid cube map file. Make sure it is a DDS with a cube map.");
}
}
private bool IsValidCubeMap(string FilePath)
{
try
{
DDS dds = new DDS(FilePath);
if (dds.ArrayCount == 6)
return true;
return false;
}
catch
{
return false;
}
}
private void chkUseSkyobx_CheckedChanged(object sender, EventArgs e) {
Runtime.PBR.UseSkybox = chkUseSkyobx.Checked;
chkDiffyseSkybox.Enabled = chkUseSkyobx.Checked;
UpdateViewportSettings();
}
private void chkDiffyseSkybox_CheckedChanged(object sender, EventArgs e) {
Runtime.PBR.UseDiffuseSkyTexture = chkDiffyseSkybox.Checked;
UpdateViewportSettings();
}
private void clearSettingToolStripMenuItem_Click(object sender, EventArgs e)
{
// Try to cast the sender to a ToolStripItem
ToolStripItem menuItem = sender as ToolStripItem;
if (menuItem != null)
{
// Retrieve the ContextMenuStrip that owns this ToolStripItem
ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip;
if (owner != null)
{
// Get the control that is displaying this context menu
Control sourceControl = owner.SourceControl;
switch (sourceControl.Name)
{
case "diffuseCubemapPathTB":
diffuseCubemapPathTB.Text = "";
Runtime.PBR.DiffuseCubeMapPath = "";
RenderTools.ResetDiffuseCubeMap();
break;
case "specularCubemapPathTB":
specularCubemapPathTB.Text = "";
Runtime.PBR.SpecularCubeMapPath = "";
RenderTools.ResetSpecularCubeMap();
break;
case "mk8DPathTB":
mk8DPathTB.Text = "";
Runtime.Mk8dGamePath = "";
break;
case "mk8PathTB":
mk8PathTB.Text = "";
Runtime.Mk8GamePath = "";
break;
case "SMOPathTB":
SMOPathTB.Text = "";
Runtime.SmoGamePath = "";
break;
case "tpGamePathTB":
tpGamePathTB.Text = "";
Runtime.TpGamePath = "";
break;
case "botwGamePathTB":
botwGamePathTB.Text = "";
Runtime.BotwGamePath = "";
break;
case "pathPokemonSwShTB":
pathPokemonSwShTB.Text = "";
Runtime.PkSwShGamePath = "";
break;
}
}
}
}
private void specularCubemapPathTB_TextChanged(object sender, EventArgs e)
{
}
private void uvChannelRB_CheckedChanged(object sender, EventArgs e) {
Runtime.uvChannel = Runtime.UVChannel.Channel1;
UpdateViewportSettings();
}
private void uvChannelRB2_CheckedChanged(object sender, EventArgs e) {
Runtime.uvChannel = Runtime.UVChannel.Channel2;
UpdateViewportSettings();
}
private void uvChannelRB3_CheckedChanged(object sender, EventArgs e) {
Runtime.uvChannel = Runtime.UVChannel.Channel3;
UpdateViewportSettings();
}
private void chkBotwFileTable_CheckedChanged(object sender, EventArgs e) {
if (!System.IO.Directory.Exists(Runtime.BotwGamePath) || !IsValidBotwDirectory(Runtime.BotwGamePath))
{
FolderSelectDialog sfd = new FolderSelectDialog();
sfd.Title = "Select Modded Game Path!!!";
if (sfd.ShowDialog() == DialogResult.OK)
{
if (!IsValidBotwDirectory(sfd.SelectedPath))
throw new Exception($"Invalid path choosen. Make sure you have atleast an RSTB file in the path! |{sfd.SelectedPath}/System/Resource/ResourceSizeTable.product.srsizetable|");
botwGamePathTB.Text = sfd.SelectedPath;
Runtime.BotwGamePath = botwGamePathTB.Text;
}
}
Runtime.ResourceTables.BotwTable = chkBotwFileTable.Checked;
}
private bool IsValidBotwDirectory(string GamePath)
{
//This is the only file i care about
string RstbPath = System.IO.Path.Combine($"{GamePath}",
"System", "Resource", "ResourceSizeTable.product.srsizetable");
return System.IO.File.Exists(RstbPath);
}
private bool IsValidTPHDDirectory(string GamePath)
{
//This is the only file i care about
string DecompressedSizeList = System.IO.Path.Combine($"{GamePath}", "DecompressedSizeList.txt");
string FileSizeList = System.IO.Path.Combine($"{GamePath}", "FileSizeList.txt");
return System.IO.File.Exists(DecompressedSizeList) && System.IO.File.Exists(FileSizeList);
}
private void chkTpFileTable_CheckedChanged(object sender, EventArgs e) {
if (!System.IO.Directory.Exists(Runtime.TpGamePath) || !IsValidTPHDDirectory(Runtime.TpGamePath))
{
FolderSelectDialog sfd = new FolderSelectDialog();
sfd.Title = "Select Modded Game Path!!!";
if (sfd.ShowDialog() == DialogResult.OK)
{
if (!IsValidTPHDDirectory(sfd.SelectedPath))
throw new Exception($"Invalid path choosen. Make sure you have atleast a FileSizeList.txt and DecompressedSizeList.txt file in the path!");
tpGamePathTB.Text = sfd.SelectedPath;
Runtime.TpGamePath = tpGamePathTB.Text;
}
}
Runtime.ResourceTables.TpTable = chkTpFileTable.Checked;
}
private void chkFrameCamera_CheckedChanged(object sender, EventArgs e) {
Runtime.FrameCamera = chkFrameCamera.Checked;
}
private void chkAlwaysCompressOnSave_CheckedChanged(object sender, EventArgs e) {
Runtime.AlwaysCompressOnSave = chkAlwaysCompressOnSave.Checked;
}
private void pathPokemonSwShTB_TextChanged(object sender, EventArgs e)
{
}
private void pathPokemonSwShTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
if (!IsValidPokemonSwShDirectory(sfd.SelectedPath))
throw new Exception("Invalid path choosen. You need Bin/appli/icon_pokemon atleast for pokemon icons");
pathPokemonSwShTB.Text = sfd.SelectedPath;
Runtime.PkSwShGamePath = pathPokemonSwShTB.Text;
}
}
private bool IsValidPokemonSwShDirectory(string GamePath)
{
//Search for pokemon icons
string RstbPath = System.IO.Path.Combine($"{GamePath}",
"Bin", "appli", "icon_pokemon", "poke_icon_0000_00s_n.bntx");
return System.IO.File.Exists(RstbPath);
}
}
}