Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/hakchi2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2017-02-05 03:54:45 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2017-02-05 03:54:45 +0300
commit59d95936b60808b1a7ce625a12afcd02d00d1878 (patch)
treea8f9861317198e748ea9c900d4edf1ca7b61f987
parent7a86f21577a23c86bec460da54e9881f6760ea80 (diff)
Optimizations for LARGE amount of games
-rw-r--r--MainForm.Designer.cs11
-rw-r--r--MainForm.cs146
-rw-r--r--MainForm.resx685
-rw-r--r--MessageBoxManager.cs219
-rw-r--r--NesGame.cs42
-rw-r--r--Properties/Resources.Designer.cs45
-rw-r--r--Properties/Resources.resx15
-rw-r--r--Properties/Resources.ru-RU.resx15
-rw-r--r--WorkerForm.cs169
-rw-r--r--hakchi_gui.csproj1
-rw-r--r--mods/mod_transfer/hakchi/init8
11 files changed, 1014 insertions, 342 deletions
diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs
index 2421038f..7832ed1e 100644
--- a/MainForm.Designer.cs
+++ b/MainForm.Designer.cs
@@ -125,6 +125,7 @@
this.checkedListBoxDefaultGames = new System.Windows.Forms.CheckedListBox();
this.timerCalculateGames = new System.Windows.Forms.Timer(this.components);
this.foldersSplitByFirstLetterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.customToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip.SuspendLayout();
this.groupBoxOptions.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxArt)).BeginInit();
@@ -388,12 +389,14 @@
this.automaticToolStripMenuItem,
this.pagesToolStripMenuItem,
this.foldersToolStripMenuItem,
- this.foldersSplitByFirstLetterToolStripMenuItem});
+ this.foldersSplitByFirstLetterToolStripMenuItem,
+ this.customToolStripMenuItem});
this.pagesfoldersTypeToolStripMenuItem.Name = "pagesfoldersTypeToolStripMenuItem";
resources.ApplyResources(this.pagesfoldersTypeToolStripMenuItem, "pagesfoldersTypeToolStripMenuItem");
//
// moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem
//
+ this.moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem.CheckOnClick = true;
resources.ApplyResources(this.moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem, "moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem");
this.moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem.Name = "moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem";
//
@@ -799,6 +802,11 @@
resources.ApplyResources(this.foldersSplitByFirstLetterToolStripMenuItem, "foldersSplitByFirstLetterToolStripMenuItem");
this.foldersSplitByFirstLetterToolStripMenuItem.Name = "foldersSplitByFirstLetterToolStripMenuItem";
//
+ // customToolStripMenuItem
+ //
+ resources.ApplyResources(this.customToolStripMenuItem, "customToolStripMenuItem");
+ this.customToolStripMenuItem.Name = "customToolStripMenuItem";
+ //
// MainForm
//
resources.ApplyResources(this, "$this");
@@ -930,6 +938,7 @@
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
private System.Windows.Forms.ToolStripMenuItem automaticToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem foldersSplitByFirstLetterToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem customToolStripMenuItem;
}
}
diff --git a/MainForm.cs b/MainForm.cs
index 21ef6b3a..871a6fe5 100644
--- a/MainForm.cs
+++ b/MainForm.cs
@@ -17,8 +17,8 @@ namespace com.clusterrr.hakchi_gui
{
public partial class MainForm : Form
{
- readonly string BaseDir;
- readonly string GamesDir;
+ public static string BaseDirectory;
+ public static string GamesDirectory;
//readonly string UBootDump;
readonly string KernelDump;
@@ -93,14 +93,16 @@ namespace com.clusterrr.hakchi_gui
{
InitializeComponent();
ConfigIni.Load();
- BaseDir = Path.GetDirectoryName(Application.ExecutablePath);
- GamesDir = Path.Combine(BaseDir, "games");
- KernelDump = Path.Combine(Path.Combine(BaseDir, "dump"), "kernel.img");
+ BaseDirectory = Path.GetDirectoryName(Application.ExecutablePath);
+ GamesDirectory = Path.Combine(BaseDirectory, "games");
+ KernelDump = Path.Combine(Path.Combine(BaseDirectory, "dump"), "kernel.img");
LoadGames();
LoadHidden();
LoadPresets();
var version = Assembly.GetExecutingAssembly().GetName().Version;
Text = string.Format("hakchi2 - v{0}.{1:D2}", version.Major, version.Build);
+
+ // Some settnigs
useExtendedFontToolStripMenuItem.Checked = ConfigIni.UseFont;
ToolStripMenuItemArmetLevel0.Checked = ConfigIni.AntiArmetLevel == 0;
ToolStripMenuItemArmetLevel1.Checked = ConfigIni.AntiArmetLevel == 1;
@@ -125,6 +127,15 @@ namespace com.clusterrr.hakchi_gui
max80toolStripMenuItem.Checked = ConfigIni.MaxGamesPerFolder == 80;
max90toolStripMenuItem.Checked = ConfigIni.MaxGamesPerFolder == 90;
max100toolStripMenuItem.Checked = ConfigIni.MaxGamesPerFolder == 100;
+
+ // Tweeks for message boxes
+ MessageBoxManager.Yes =MessageBoxManager.Retry = Resources.Yes;
+ MessageBoxManager.No = MessageBoxManager.Ignore = Resources.No;
+ MessageBoxManager.Cancel = Resources.NoForAll;
+ MessageBoxManager.Abort = Resources.YesForAll;
+ MessageBoxManager.Register();
+
+ // Loading games database in background
new Thread(NesGame.LoadCache).Start();
}
catch (Exception ex)
@@ -138,21 +149,24 @@ namespace com.clusterrr.hakchi_gui
{
Debug.WriteLine("Loading games");
var selected = ConfigIni.SelectedGames.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
- Directory.CreateDirectory(GamesDir);
- var gameDirs = Directory.GetDirectories(GamesDir);
+ Directory.CreateDirectory(GamesDirectory);
+ var gameDirs = Directory.GetDirectories(GamesDirectory);
var games = new List<NesGame>();
foreach (var gameDir in gameDirs)
{
try
{
// Removing empty directories without errors
- if (Directory.GetFiles(gameDir, "*.*", SearchOption.AllDirectories).Length == 0)
+ try
{
+ var game = new NesGame(gameDir);
+ games.Add(game);
+ }
+ catch (FileNotFoundException ex) // Remove bad directories if any
+ {
+ Debug.WriteLine(ex.Message + ex.StackTrace);
Directory.Delete(gameDir, true);
- continue;
}
- var game = new NesGame(gameDir);
- games.Add(game);
}
catch (Exception ex)
{
@@ -439,88 +453,6 @@ namespace com.clusterrr.hakchi_gui
return c;
}
- void AddGames(string[] files)
- {
- SaveSelectedGames();
- SaveConfig();
- NesGame nesGame = null;
- foreach (var file in files)
- {
- try
- {
- var nesFileName = file;
- var ext = Path.GetExtension(file).ToLower();
- bool? needPatch = null;
- byte[] rawData = null;
- if (ext == ".7z" || ext == ".zip" || ext == ".rar")
- {
- SevenZipExtractor.SetLibraryPath(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), IntPtr.Size == 8 ? @"tools\7z64.dll" : @"tools\7z.dll"));
- var szExtractor = new SevenZipExtractor(file);
- var filesInArchive = new List<string>();
- foreach (var f in szExtractor.ArchiveFileNames)
- {
- var e = Path.GetExtension(f).ToLower();
- if (e == ".nes" || e == ".fds")
- filesInArchive.Add(f);
- }
- if (filesInArchive.Count == 1)
- {
- nesFileName = filesInArchive[0];
- }
- else
- {
- var fsForm = new SelectFileForm(filesInArchive.ToArray());
- if (fsForm.ShowDialog() == DialogResult.OK)
- nesFileName = (string)fsForm.listBoxFiles.SelectedItem;
- else
- continue;
- }
- var o = new MemoryStream();
- szExtractor.ExtractFile(nesFileName, o);
- rawData = new byte[szExtractor.ArchiveFileData[0].Size];
- o.Seek(0, SeekOrigin.Begin);
- o.Read(rawData, 0, rawData.Length);
- }
- try
- {
- nesGame = new NesGame(GamesDir, nesFileName, false, ref needPatch, this, rawData);
- }
- catch (UnsupportedMapperException ex)
- {
- if (MessageBox.Show(this, string.Format(Resources.MapperNotSupported, Path.GetFileName(file), ex.ROM.Mapper), Resources.AreYouSure, MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
- == DialogResult.Yes)
- nesGame = new NesGame(GamesDir, nesFileName, true, ref needPatch, this, rawData);
- else continue;
- }
- catch (UnsupportedFourScreenException)
- {
- if (MessageBox.Show(this, string.Format(Resources.FourScreenNotSupported, Path.GetFileName(file)), Resources.AreYouSure, MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
- == DialogResult.Yes)
- nesGame = new NesGame(GamesDir, nesFileName, true, ref needPatch, this, rawData);
- else continue;
- }
- ConfigIni.SelectedGames += ";" + nesGame.Code;
- }
- catch (Exception ex)
- {
- Debug.WriteLine(ex.Message + ex.StackTrace);
- MessageBox.Show(this, ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
- continue;
- }
- }
- if (nesGame == null) return; // Nothing happened
- LoadGames();
- if (openFileDialogNes.FileNames.Length == 1)
- {
- for (int i = 1; i < checkedListBoxGames.Items.Count; i++)
- if ((checkedListBoxGames.Items[i] as NesGame).Code == nesGame.Code)
- {
- checkedListBoxGames.SelectedIndex = i;
- break;
- }
- }
- }
-
private void buttonAddGames_Click(object sender, EventArgs e)
{
if (openFileDialogNes.ShowDialog() == DialogResult.OK)
@@ -671,6 +603,34 @@ namespace com.clusterrr.hakchi_gui
return workerForm.DialogResult == DialogResult.OK;
}
+ void AddGames(string[] files)
+ {
+ SaveConfig();
+
+ NesGame nesGame = null;
+ var workerForm = new WorkerForm();
+ workerForm.Text = Resources.LoadingGames;
+ workerForm.Task = WorkerForm.Tasks.AddGames;
+ if (files.Length <= 1)
+ nesGame = workerForm.AddGames(GamesDirectory, files, this);
+ else
+ {
+ workerForm.GamesToAdd = files;
+ workerForm.Start();
+ }
+
+ LoadGames();
+ if (files.Length == 1 && nesGame != null) // if added only one game select it
+ {
+ for (int i = 1; i < checkedListBoxGames.Items.Count; i++)
+ if ((checkedListBoxGames.Items[i] as NesGame).Code == nesGame.Code)
+ {
+ checkedListBoxGames.SelectedIndex = i;
+ break;
+ }
+ }
+ }
+
bool FlashOriginalKernel(bool boot = true)
{
var workerForm = new WorkerForm();
diff --git a/MainForm.resx b/MainForm.resx
index 5367ed28..11d28005 100644
--- a/MainForm.resx
+++ b/MainForm.resx
@@ -120,17 +120,189 @@
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>132, 17</value>
</metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="fileToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>37, 20</value>
+ </data>
+ <data name="fileToolStripMenuItem.Text" xml:space="preserve">
+ <value>&amp;File</value>
+ </data>
+ <data name="kernelToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>52, 20</value>
+ </data>
+ <data name="kernelToolStripMenuItem.Text" xml:space="preserve">
+ <value>&amp;Kernel</value>
+ </data>
+ <data name="consoleTypeToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>325, 22</value>
+ </data>
+ <data name="consoleTypeToolStripMenuItem.Text" xml:space="preserve">
+ <value>Console type</value>
+ </data>
+ <data name="epilepsyProtectionToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>325, 22</value>
+ </data>
+ <data name="epilepsyProtectionToolStripMenuItem.Text" xml:space="preserve">
+ <value>Epilepsy protection</value>
+ </data>
+ <data name="cloverconHackToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>325, 22</value>
+ </data>
+ <data name="cloverconHackToolStripMenuItem.Text" xml:space="preserve">
+ <value>Controller hacks</value>
+ </data>
+ <data name="guiHacksToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>325, 22</value>
+ </data>
+ <data name="guiHacksToolStripMenuItem.Text" xml:space="preserve">
+ <value>GUI hacks</value>
+ </data>
+ <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
+ <value>False</value>
+ </data>
+ <data name="moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>385, 22</value>
+ </data>
+ <data name="moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem.Text" xml:space="preserve">
+ <value>Move original games to root, new games to separate folder</value>
+ </data>
+ <data name="toolStripMenuItem3.Size" type="System.Drawing.Size, System.Drawing">
+ <value>335, 6</value>
+ </data>
+ <data name="disablePagefoldersToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
+ <value>False</value>
+ </data>
+ <data name="disablePagefoldersToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>338, 22</value>
+ </data>
+ <data name="disablePagefoldersToolStripMenuItem.Text" xml:space="preserve">
+ <value>Disable page/folders</value>
+ </data>
+ <data name="automaticToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
+ <value>False</value>
+ </data>
+ <data name="automaticToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>338, 22</value>
+ </data>
+ <data name="automaticToolStripMenuItem.Text" xml:space="preserve">
+ <value>Automatic</value>
+ </data>
+ <data name="pagesToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
+ <value>False</value>
+ </data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="pagesToolStripMenuItem.ImageScaling" type="System.Windows.Forms.ToolStripItemImageScaling, System.Windows.Forms">
+ <value>None</value>
+ </data>
+ <data name="pagesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>338, 22</value>
+ </data>
+ <data name="pagesToolStripMenuItem.Text" xml:space="preserve">
+ <value>Pages, split games equally</value>
+ </data>
+ <data name="foldersToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
+ <value>False</value>
+ </data>
+ <data name="foldersToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>338, 22</value>
+ </data>
+ <data name="foldersToolStripMenuItem.Text" xml:space="preserve">
+ <value>Folders, split games equally</value>
+ </data>
+ <data name="foldersSplitByFirstLetterToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
+ <value>False</value>
+ </data>
+ <data name="foldersSplitByFirstLetterToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>338, 22</value>
+ </data>
+ <data name="foldersSplitByFirstLetterToolStripMenuItem.Text" xml:space="preserve">
+ <value>Folders, split by first letter</value>
+ </data>
+ <data name="customToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
+ <value>False</value>
+ </data>
+ <data name="customToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>385, 22</value>
+ </data>
+ <data name="customToolStripMenuItem.Text" xml:space="preserve">
+ <value>Custom</value>
+ </data>
+ <data name="pagesfoldersTypeToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>325, 22</value>
+ </data>
+ <data name="pagesfoldersTypeToolStripMenuItem.Text" xml:space="preserve">
+ <value>Pages/folders structure</value>
+ </data>
+ <data name="maximumGamesPerFolderToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>325, 22</value>
+ </data>
+ <data name="maximumGamesPerFolderToolStripMenuItem.Text" xml:space="preserve">
+ <value>Maximum games per page/folder</value>
+ </data>
+ <data name="betterPNGCompressionlowerQualityToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>325, 22</value>
+ </data>
+ <data name="betterPNGCompressionlowerQualityToolStripMenuItem.Text" xml:space="preserve">
+ <value>8bit PNG compression (less size/low quality)</value>
+ </data>
+ <data name="globalCommandLineArgumentsexpertsOnluToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>325, 22</value>
+ </data>
+ <data name="globalCommandLineArgumentsexpertsOnluToolStripMenuItem.Text" xml:space="preserve">
+ <value>Global command line arguments (experts only!)</value>
+ </data>
+ <data name="settingsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>61, 20</value>
+ </data>
+ <data name="settingsToolStripMenuItem.Text" xml:space="preserve">
+ <value>&amp;Settings</value>
+ </data>
+ <data name="helpToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>44, 20</value>
+ </data>
+ <data name="helpToolStripMenuItem.Text" xml:space="preserve">
+ <value>&amp;Help</value>
+ </data>
+ <data name="menuStrip.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 0</value>
+ </data>
+ <data name="menuStrip.Size" type="System.Drawing.Size, System.Drawing">
+ <value>609, 24</value>
+ </data>
+ <data name="menuStrip.TabIndex" type="System.Int32, mscorlib">
+ <value>1</value>
+ </data>
+ <data name="menuStrip.Text" xml:space="preserve">
+ <value>menuStrip</value>
+ </data>
+ <data name="&gt;&gt;menuStrip.Name" xml:space="preserve">
+ <value>menuStrip</value>
+ </data>
+ <data name="&gt;&gt;menuStrip.Type" xml:space="preserve">
+ <value>System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;menuStrip.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;menuStrip.ZOrder" xml:space="preserve">
+ <value>6</value>
+ </data>
<data name="addMoreGamesToolStripMenuItem.ShortcutKeys" type="System.Windows.Forms.Keys, System.Windows.Forms">
<value>Ctrl+O</value>
</data>
- <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="addMoreGamesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>236, 22</value>
</data>
<data name="addMoreGamesToolStripMenuItem.Text" xml:space="preserve">
<value>Add more &amp;games</value>
</data>
+ <data name="presetsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
+ <value>236, 22</value>
+ </data>
+ <data name="presetsToolStripMenuItem.Text" xml:space="preserve">
+ <value>Selection presets</value>
+ </data>
<data name="toolStripMenuItem2.Size" type="System.Drawing.Size, System.Drawing">
<value>139, 6</value>
</data>
@@ -146,12 +318,6 @@
<data name="deletePresetToolStripMenuItem.Text" xml:space="preserve">
<value>Delete preset</value>
</data>
- <data name="presetsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>236, 22</value>
- </data>
- <data name="presetsToolStripMenuItem.Text" xml:space="preserve">
- <value>Selection presets</value>
- </data>
<data name="searchToolStripMenuItem.ShortcutKeys" type="System.Windows.Forms.Keys, System.Windows.Forms">
<value>Ctrl+F</value>
</data>
@@ -176,12 +342,6 @@
<data name="exitToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Exit</value>
</data>
- <data name="fileToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>37, 20</value>
- </data>
- <data name="fileToolStripMenuItem.Text" xml:space="preserve">
- <value>&amp;File</value>
- </data>
<data name="dumpKernelToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>179, 22</value>
</data>
@@ -206,12 +366,6 @@
<data name="uninstallToolStripMenuItem.Text" xml:space="preserve">
<value>Uninstall</value>
</data>
- <data name="kernelToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>52, 20</value>
- </data>
- <data name="kernelToolStripMenuItem.Text" xml:space="preserve">
- <value>&amp;Kernel</value>
- </data>
<data name="nESMiniToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>152, 22</value>
</data>
@@ -224,12 +378,6 @@
<data name="famicomMiniToolStripMenuItem.Text" xml:space="preserve">
<value>Famicom Mini</value>
</data>
- <data name="consoleTypeToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>325, 22</value>
- </data>
- <data name="consoleTypeToolStripMenuItem.Text" xml:space="preserve">
- <value>Console type</value>
- </data>
<data name="ToolStripMenuItemArmetLevel0.Size" type="System.Drawing.Size, System.Drawing">
<value>211, 22</value>
</data>
@@ -248,12 +396,6 @@
<data name="ToolStripMenuItemArmetLevel2.Text" xml:space="preserve">
<value>Disable for all games</value>
</data>
- <data name="epilepsyProtectionToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>325, 22</value>
- </data>
- <data name="epilepsyProtectionToolStripMenuItem.Text" xml:space="preserve">
- <value>Epilepsy protection</value>
- </data>
<data name="resetUsingCombinationOfButtonsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>262, 22</value>
</data>
@@ -278,12 +420,6 @@
<data name="upABStartOnSecondControllerToolStripMenuItem.Text" xml:space="preserve">
<value>"Up+A+B = Start" on 2nd controller</value>
</data>
- <data name="cloverconHackToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>325, 22</value>
- </data>
- <data name="cloverconHackToolStripMenuItem.Text" xml:space="preserve">
- <value>Controller hacks</value>
- </data>
<data name="useExtendedFontToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>256, 22</value>
</data>
@@ -302,79 +438,6 @@
<data name="disableMenuMusicToolStripMenuItem.Text" xml:space="preserve">
<value>Disable menu music</value>
</data>
- <data name="guiHacksToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>325, 22</value>
- </data>
- <data name="guiHacksToolStripMenuItem.Text" xml:space="preserve">
- <value>GUI hacks</value>
- </data>
- <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
- <data name="moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
- <value>False</value>
- </data>
- <data name="moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>338, 22</value>
- </data>
- <data name="moveOriginalGamesToRootNewGamesToSpecialFolderToolStripMenuItem.Text" xml:space="preserve">
- <value>Move original games to root, new games to folder</value>
- </data>
- <data name="toolStripMenuItem3.Size" type="System.Drawing.Size, System.Drawing">
- <value>335, 6</value>
- </data>
- <data name="disablePagefoldersToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
- <value>False</value>
- </data>
- <data name="disablePagefoldersToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>338, 22</value>
- </data>
- <data name="disablePagefoldersToolStripMenuItem.Text" xml:space="preserve">
- <value>Disable page/folders</value>
- </data>
- <data name="automaticToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
- <value>False</value>
- </data>
- <data name="automaticToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>338, 22</value>
- </data>
- <data name="automaticToolStripMenuItem.Text" xml:space="preserve">
- <value>Automatic</value>
- </data>
- <data name="pagesToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
- <value>False</value>
- </data>
- <data name="pagesToolStripMenuItem.ImageScaling" type="System.Windows.Forms.ToolStripItemImageScaling, System.Windows.Forms">
- <value>None</value>
- </data>
- <data name="pagesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>338, 22</value>
- </data>
- <data name="pagesToolStripMenuItem.Text" xml:space="preserve">
- <value>Pages, split games equally</value>
- </data>
- <data name="foldersToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
- <value>False</value>
- </data>
- <data name="foldersToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>338, 22</value>
- </data>
- <data name="foldersToolStripMenuItem.Text" xml:space="preserve">
- <value>Folders, split games equally</value>
- </data>
- <data name="foldersSplitByFirstLetterToolStripMenuItem.Enabled" type="System.Boolean, mscorlib">
- <value>False</value>
- </data>
- <data name="foldersSplitByFirstLetterToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>338, 22</value>
- </data>
- <data name="foldersSplitByFirstLetterToolStripMenuItem.Text" xml:space="preserve">
- <value>Folders, split by first letter</value>
- </data>
- <data name="pagesfoldersTypeToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>325, 22</value>
- </data>
- <data name="pagesfoldersTypeToolStripMenuItem.Text" xml:space="preserve">
- <value>Pages/folders structure</value>
- </data>
<data name="max20toolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>152, 22</value>
</data>
@@ -447,30 +510,6 @@
<data name="max100toolStripMenuItem.Text" xml:space="preserve">
<value>100</value>
</data>
- <data name="maximumGamesPerFolderToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>325, 22</value>
- </data>
- <data name="maximumGamesPerFolderToolStripMenuItem.Text" xml:space="preserve">
- <value>Maximum games per page/folder</value>
- </data>
- <data name="betterPNGCompressionlowerQualityToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>325, 22</value>
- </data>
- <data name="betterPNGCompressionlowerQualityToolStripMenuItem.Text" xml:space="preserve">
- <value>8bit PNG compression (less size/low quality)</value>
- </data>
- <data name="globalCommandLineArgumentsexpertsOnluToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>325, 22</value>
- </data>
- <data name="globalCommandLineArgumentsexpertsOnluToolStripMenuItem.Text" xml:space="preserve">
- <value>Global command line arguments (experts only!)</value>
- </data>
- <data name="settingsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>61, 20</value>
- </data>
- <data name="settingsToolStripMenuItem.Text" xml:space="preserve">
- <value>&amp;Settings</value>
- </data>
<data name="gitHubPageWithActualReleasesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>246, 22</value>
</data>
@@ -489,36 +528,6 @@
<data name="aboutToolStripMenuItem.Text" xml:space="preserve">
<value>About...</value>
</data>
- <data name="helpToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>44, 20</value>
- </data>
- <data name="helpToolStripMenuItem.Text" xml:space="preserve">
- <value>&amp;Help</value>
- </data>
- <data name="menuStrip.Location" type="System.Drawing.Point, System.Drawing">
- <value>0, 0</value>
- </data>
- <data name="menuStrip.Size" type="System.Drawing.Size, System.Drawing">
- <value>609, 24</value>
- </data>
- <data name="menuStrip.TabIndex" type="System.Int32, mscorlib">
- <value>1</value>
- </data>
- <data name="menuStrip.Text" xml:space="preserve">
- <value>menuStrip</value>
- </data>
- <data name="&gt;&gt;menuStrip.Name" xml:space="preserve">
- <value>menuStrip</value>
- </data>
- <data name="&gt;&gt;menuStrip.Type" xml:space="preserve">
- <value>System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name="&gt;&gt;menuStrip.Parent" xml:space="preserve">
- <value>$this</value>
- </data>
- <data name="&gt;&gt;menuStrip.ZOrder" xml:space="preserve">
- <value>6</value>
- </data>
<data name="checkedListBoxGames.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>None</value>
</data>
@@ -546,6 +555,258 @@
<data name="groupBoxOptions.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>None</value>
</data>
+ <data name="&gt;&gt;maskedTextBoxReleaseDate.Name" xml:space="preserve">
+ <value>maskedTextBoxReleaseDate</value>
+ </data>
+ <data name="&gt;&gt;maskedTextBoxReleaseDate.Type" xml:space="preserve">
+ <value>System.Windows.Forms.MaskedTextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;maskedTextBoxReleaseDate.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;maskedTextBoxReleaseDate.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <data name="&gt;&gt;label1.Name" xml:space="preserve">
+ <value>label1</value>
+ </data>
+ <data name="&gt;&gt;label1.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label1.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
+ <value>1</value>
+ </data>
+ <data name="&gt;&gt;textBoxGameGenie.Name" xml:space="preserve">
+ <value>textBoxGameGenie</value>
+ </data>
+ <data name="&gt;&gt;textBoxGameGenie.Type" xml:space="preserve">
+ <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;textBoxGameGenie.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;textBoxGameGenie.ZOrder" xml:space="preserve">
+ <value>2</value>
+ </data>
+ <data name="&gt;&gt;label7.Name" xml:space="preserve">
+ <value>label7</value>
+ </data>
+ <data name="&gt;&gt;label7.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label7.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;label7.ZOrder" xml:space="preserve">
+ <value>3</value>
+ </data>
+ <data name="&gt;&gt;label6.Name" xml:space="preserve">
+ <value>label6</value>
+ </data>
+ <data name="&gt;&gt;label6.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label6.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;label6.ZOrder" xml:space="preserve">
+ <value>4</value>
+ </data>
+ <data name="&gt;&gt;radioButtonTwoSim.Name" xml:space="preserve">
+ <value>radioButtonTwoSim</value>
+ </data>
+ <data name="&gt;&gt;radioButtonTwoSim.Type" xml:space="preserve">
+ <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;radioButtonTwoSim.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;radioButtonTwoSim.ZOrder" xml:space="preserve">
+ <value>5</value>
+ </data>
+ <data name="&gt;&gt;buttonGoogle.Name" xml:space="preserve">
+ <value>buttonGoogle</value>
+ </data>
+ <data name="&gt;&gt;buttonGoogle.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;buttonGoogle.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;buttonGoogle.ZOrder" xml:space="preserve">
+ <value>6</value>
+ </data>
+ <data name="&gt;&gt;buttonBrowseImage.Name" xml:space="preserve">
+ <value>buttonBrowseImage</value>
+ </data>
+ <data name="&gt;&gt;buttonBrowseImage.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;buttonBrowseImage.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;buttonBrowseImage.ZOrder" xml:space="preserve">
+ <value>7</value>
+ </data>
+ <data name="&gt;&gt;pictureBoxArt.Name" xml:space="preserve">
+ <value>pictureBoxArt</value>
+ </data>
+ <data name="&gt;&gt;pictureBoxArt.Type" xml:space="preserve">
+ <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;pictureBoxArt.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;pictureBoxArt.ZOrder" xml:space="preserve">
+ <value>8</value>
+ </data>
+ <data name="&gt;&gt;label4.Name" xml:space="preserve">
+ <value>label4</value>
+ </data>
+ <data name="&gt;&gt;label4.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label4.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
+ <value>9</value>
+ </data>
+ <data name="&gt;&gt;textBoxArguments.Name" xml:space="preserve">
+ <value>textBoxArguments</value>
+ </data>
+ <data name="&gt;&gt;textBoxArguments.Type" xml:space="preserve">
+ <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;textBoxArguments.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;textBoxArguments.ZOrder" xml:space="preserve">
+ <value>10</value>
+ </data>
+ <data name="&gt;&gt;label3.Name" xml:space="preserve">
+ <value>label3</value>
+ </data>
+ <data name="&gt;&gt;label3.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label3.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
+ <value>11</value>
+ </data>
+ <data name="&gt;&gt;textBoxPublisher.Name" xml:space="preserve">
+ <value>textBoxPublisher</value>
+ </data>
+ <data name="&gt;&gt;textBoxPublisher.Type" xml:space="preserve">
+ <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;textBoxPublisher.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;textBoxPublisher.ZOrder" xml:space="preserve">
+ <value>12</value>
+ </data>
+ <data name="&gt;&gt;label2.Name" xml:space="preserve">
+ <value>label2</value>
+ </data>
+ <data name="&gt;&gt;label2.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;label2.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
+ <value>13</value>
+ </data>
+ <data name="&gt;&gt;radioButtonTwo.Name" xml:space="preserve">
+ <value>radioButtonTwo</value>
+ </data>
+ <data name="&gt;&gt;radioButtonTwo.Type" xml:space="preserve">
+ <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;radioButtonTwo.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;radioButtonTwo.ZOrder" xml:space="preserve">
+ <value>14</value>
+ </data>
+ <data name="&gt;&gt;radioButtonOne.Name" xml:space="preserve">
+ <value>radioButtonOne</value>
+ </data>
+ <data name="&gt;&gt;radioButtonOne.Type" xml:space="preserve">
+ <value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;radioButtonOne.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;radioButtonOne.ZOrder" xml:space="preserve">
+ <value>15</value>
+ </data>
+ <data name="&gt;&gt;textBoxName.Name" xml:space="preserve">
+ <value>textBoxName</value>
+ </data>
+ <data name="&gt;&gt;textBoxName.Type" xml:space="preserve">
+ <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;textBoxName.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;textBoxName.ZOrder" xml:space="preserve">
+ <value>16</value>
+ </data>
+ <data name="&gt;&gt;labelName.Name" xml:space="preserve">
+ <value>labelName</value>
+ </data>
+ <data name="&gt;&gt;labelName.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;labelName.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;labelName.ZOrder" xml:space="preserve">
+ <value>17</value>
+ </data>
+ <data name="&gt;&gt;labelID.Name" xml:space="preserve">
+ <value>labelID</value>
+ </data>
+ <data name="&gt;&gt;labelID.Type" xml:space="preserve">
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;labelID.Parent" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;labelID.ZOrder" xml:space="preserve">
+ <value>18</value>
+ </data>
+ <data name="groupBoxOptions.Location" type="System.Drawing.Point, System.Drawing">
+ <value>306, 27</value>
+ </data>
+ <data name="groupBoxOptions.Size" type="System.Drawing.Size, System.Drawing">
+ <value>293, 529</value>
+ </data>
+ <data name="groupBoxOptions.TabIndex" type="System.Int32, mscorlib">
+ <value>4</value>
+ </data>
+ <data name="groupBoxOptions.Text" xml:space="preserve">
+ <value>Game options</value>
+ </data>
+ <data name="&gt;&gt;groupBoxOptions.Name" xml:space="preserve">
+ <value>groupBoxOptions</value>
+ </data>
+ <data name="&gt;&gt;groupBoxOptions.Type" xml:space="preserve">
+ <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;groupBoxOptions.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name="&gt;&gt;groupBoxOptions.ZOrder" xml:space="preserve">
+ <value>7</value>
+ </data>
<data name="maskedTextBoxReleaseDate.Location" type="System.Drawing.Point, System.Drawing">
<value>168, 154</value>
</data>
@@ -1029,30 +1290,6 @@
<data name="&gt;&gt;labelID.ZOrder" xml:space="preserve">
<value>18</value>
</data>
- <data name="groupBoxOptions.Location" type="System.Drawing.Point, System.Drawing">
- <value>306, 27</value>
- </data>
- <data name="groupBoxOptions.Size" type="System.Drawing.Size, System.Drawing">
- <value>293, 529</value>
- </data>
- <data name="groupBoxOptions.TabIndex" type="System.Int32, mscorlib">
- <value>4</value>
- </data>
- <data name="groupBoxOptions.Text" xml:space="preserve">
- <value>Game options</value>
- </data>
- <data name="&gt;&gt;groupBoxOptions.Name" xml:space="preserve">
- <value>groupBoxOptions</value>
- </data>
- <data name="&gt;&gt;groupBoxOptions.Type" xml:space="preserve">
- <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name="&gt;&gt;groupBoxOptions.Parent" xml:space="preserve">
- <value>$this</value>
- </data>
- <data name="&gt;&gt;groupBoxOptions.ZOrder" xml:space="preserve">
- <value>7</value>
- </data>
<data name="label5.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>None</value>
</data>
@@ -1113,12 +1350,6 @@
<metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>350, 17</value>
</metadata>
- <data name="toolStripStatusLabelSelected.Size" type="System.Drawing.Size, System.Drawing">
- <value>118, 17</value>
- </data>
- <data name="toolStripStatusLabelSelected.Text" xml:space="preserve">
- <value>toolStripStatusLabel1</value>
- </data>
<data name="statusStrip.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 615</value>
</data>
@@ -1143,6 +1374,12 @@
<data name="&gt;&gt;statusStrip.ZOrder" xml:space="preserve">
<value>2</value>
</data>
+ <data name="toolStripStatusLabelSelected.Size" type="System.Drawing.Size, System.Drawing">
+ <value>118, 17</value>
+ </data>
+ <data name="toolStripStatusLabelSelected.Text" xml:space="preserve">
+ <value>toolStripStatusLabel1</value>
+ </data>
<metadata name="openFileDialogNes.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>459, 17</value>
</metadata>
@@ -1155,6 +1392,15 @@
<metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>592, 17</value>
</metadata>
+ <data name="contextMenuStrip.Size" type="System.Drawing.Size, System.Drawing">
+ <value>141, 70</value>
+ </data>
+ <data name="&gt;&gt;contextMenuStrip.Name" xml:space="preserve">
+ <value>contextMenuStrip</value>
+ </data>
+ <data name="&gt;&gt;contextMenuStrip.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
<data name="selectAllToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 22</value>
</data>
@@ -1173,15 +1419,6 @@
<data name="deleteGameToolStripMenuItem.Text" xml:space="preserve">
<value>Delete game</value>
</data>
- <data name="contextMenuStrip.Size" type="System.Drawing.Size, System.Drawing">
- <value>141, 70</value>
- </data>
- <data name="&gt;&gt;contextMenuStrip.Name" xml:space="preserve">
- <value>contextMenuStrip</value>
- </data>
- <data name="&gt;&gt;contextMenuStrip.Type" xml:space="preserve">
- <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
<metadata name="openFileDialogImage.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>741, 17</value>
</metadata>
@@ -1221,18 +1458,6 @@
<data name="groupBoxDefaultGames.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>None</value>
</data>
- <data name="checkedListBoxDefaultGames.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
- <value>Top, Bottom, Left, Right</value>
- </data>
- <data name="checkedListBoxDefaultGames.Location" type="System.Drawing.Point, System.Drawing">
- <value>5, 49</value>
- </data>
- <data name="checkedListBoxDefaultGames.Size" type="System.Drawing.Size, System.Drawing">
- <value>282, 454</value>
- </data>
- <data name="checkedListBoxDefaultGames.TabIndex" type="System.Int32, mscorlib">
- <value>3</value>
- </data>
<data name="&gt;&gt;checkedListBoxDefaultGames.Name" xml:space="preserve">
<value>checkedListBoxDefaultGames</value>
</data>
@@ -1272,6 +1497,30 @@
<data name="&gt;&gt;groupBoxDefaultGames.ZOrder" xml:space="preserve">
<value>8</value>
</data>
+ <data name="checkedListBoxDefaultGames.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+ <value>Top, Bottom, Left, Right</value>
+ </data>
+ <data name="checkedListBoxDefaultGames.Location" type="System.Drawing.Point, System.Drawing">
+ <value>5, 49</value>
+ </data>
+ <data name="checkedListBoxDefaultGames.Size" type="System.Drawing.Size, System.Drawing">
+ <value>282, 454</value>
+ </data>
+ <data name="checkedListBoxDefaultGames.TabIndex" type="System.Int32, mscorlib">
+ <value>3</value>
+ </data>
+ <data name="&gt;&gt;checkedListBoxDefaultGames.Name" xml:space="preserve">
+ <value>checkedListBoxDefaultGames</value>
+ </data>
+ <data name="&gt;&gt;checkedListBoxDefaultGames.Type" xml:space="preserve">
+ <value>System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="&gt;&gt;checkedListBoxDefaultGames.Parent" xml:space="preserve">
+ <value>groupBoxDefaultGames</value>
+ </data>
+ <data name="&gt;&gt;checkedListBoxDefaultGames.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
<metadata name="timerCalculateGames.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>908, 17</value>
</metadata>
@@ -2824,6 +3073,12 @@
<data name="&gt;&gt;foldersSplitByFirstLetterToolStripMenuItem.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
+ <data name="&gt;&gt;customToolStripMenuItem.Name" xml:space="preserve">
+ <value>customToolStripMenuItem</value>
+ </data>
+ <data name="&gt;&gt;customToolStripMenuItem.Type" xml:space="preserve">
+ <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>MainForm</value>
</data>
diff --git a/MessageBoxManager.cs b/MessageBoxManager.cs
new file mode 100644
index 00000000..98b51c31
--- /dev/null
+++ b/MessageBoxManager.cs
@@ -0,0 +1,219 @@
+#pragma warning disable 0618
+using System;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Security.Permissions;
+
+[assembly: SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode = true)]
+namespace System.Windows.Forms
+{
+ public class MessageBoxManager
+ {
+ private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
+ private delegate bool EnumChildProc(IntPtr hWnd, IntPtr lParam);
+
+ private const int WH_CALLWNDPROCRET = 12;
+ private const int WM_DESTROY = 0x0002;
+ private const int WM_INITDIALOG = 0x0110;
+ private const int WM_TIMER = 0x0113;
+ private const int WM_USER = 0x400;
+ private const int DM_GETDEFID = WM_USER + 0;
+
+ private const int MBOK = 1;
+ private const int MBCancel = 2;
+ private const int MBAbort = 3;
+ private const int MBRetry = 4;
+ private const int MBIgnore = 5;
+ private const int MBYes = 6;
+ private const int MBNo = 7;
+
+
+ [DllImport("user32.dll")]
+ private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
+
+ [DllImport("user32.dll")]
+ private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
+
+ [DllImport("user32.dll")]
+ private static extern int UnhookWindowsHookEx(IntPtr idHook);
+
+ [DllImport("user32.dll")]
+ private static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
+
+ [DllImport("user32.dll", EntryPoint = "GetWindowTextLengthW", CharSet = CharSet.Unicode)]
+ private static extern int GetWindowTextLength(IntPtr hWnd);
+
+ [DllImport("user32.dll", EntryPoint = "GetWindowTextW", CharSet = CharSet.Unicode)]
+ private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength);
+
+ [DllImport("user32.dll")]
+ private static extern int EndDialog(IntPtr hDlg, IntPtr nResult);
+
+ [DllImport("user32.dll")]
+ private static extern bool EnumChildWindows(IntPtr hWndParent, EnumChildProc lpEnumFunc, IntPtr lParam);
+
+ [DllImport("user32.dll", EntryPoint = "GetClassNameW", CharSet = CharSet.Unicode)]
+ private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
+
+ [DllImport("user32.dll")]
+ private static extern int GetDlgCtrlID(IntPtr hwndCtl);
+
+ [DllImport("user32.dll")]
+ private static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem);
+
+ [DllImport("user32.dll", EntryPoint = "SetWindowTextW", CharSet = CharSet.Unicode)]
+ private static extern bool SetWindowText(IntPtr hWnd, string lpString);
+
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct CWPRETSTRUCT
+ {
+ public IntPtr lResult;
+ public IntPtr lParam;
+ public IntPtr wParam;
+ public uint message;
+ public IntPtr hwnd;
+ };
+
+ private static HookProc hookProc;
+ private static EnumChildProc enumProc;
+ [ThreadStatic]
+ private static IntPtr hHook;
+ [ThreadStatic]
+ private static int nButton;
+
+ /// <summary>
+ /// OK text
+ /// </summary>
+ public static string OK = "&OK";
+ /// <summary>
+ /// Cancel text
+ /// </summary>
+ public static string Cancel = "&Cancel";
+ /// <summary>
+ /// Abort text
+ /// </summary>
+ public static string Abort = "&Abort";
+ /// <summary>
+ /// Retry text
+ /// </summary>
+ public static string Retry = "&Retry";
+ /// <summary>
+ /// Ignore text
+ /// </summary>
+ public static string Ignore = "&Ignore";
+ /// <summary>
+ /// Yes text
+ /// </summary>
+ public static string Yes = "&Yes";
+ /// <summary>
+ /// No text
+ /// </summary>
+ public static string No = "&No";
+
+ static MessageBoxManager()
+ {
+ hookProc = new HookProc(MessageBoxHookProc);
+ enumProc = new EnumChildProc(MessageBoxEnumProc);
+ hHook = IntPtr.Zero;
+ }
+
+ /// <summary>
+ /// Enables MessageBoxManager functionality
+ /// </summary>
+ /// <remarks>
+ /// MessageBoxManager functionality is enabled on current thread only.
+ /// Each thread that needs MessageBoxManager functionality has to call this method.
+ /// </remarks>
+ public static void Register()
+ {
+ if (hHook != IntPtr.Zero)
+ throw new NotSupportedException("One hook per thread allowed.");
+ hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());
+ }
+
+ /// <summary>
+ /// Disables MessageBoxManager functionality
+ /// </summary>
+ /// <remarks>
+ /// Disables MessageBoxManager functionality on current thread only.
+ /// </remarks>
+ public static void Unregister()
+ {
+ if (hHook != IntPtr.Zero)
+ {
+ UnhookWindowsHookEx(hHook);
+ hHook = IntPtr.Zero;
+ }
+ }
+
+ private static IntPtr MessageBoxHookProc(int nCode, IntPtr wParam, IntPtr lParam)
+ {
+ if (nCode < 0)
+ return CallNextHookEx(hHook, nCode, wParam, lParam);
+
+ CWPRETSTRUCT msg = (CWPRETSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPRETSTRUCT));
+ IntPtr hook = hHook;
+
+ if (msg.message == WM_INITDIALOG)
+ {
+ int nLength = GetWindowTextLength(msg.hwnd);
+ StringBuilder className = new StringBuilder(10);
+ GetClassName(msg.hwnd, className, className.Capacity);
+ if (className.ToString() == "#32770")
+ {
+ nButton = 0;
+ EnumChildWindows(msg.hwnd, enumProc, IntPtr.Zero);
+ if (nButton == 1)
+ {
+ IntPtr hButton = GetDlgItem(msg.hwnd, MBCancel);
+ if (hButton != IntPtr.Zero)
+ SetWindowText(hButton, OK);
+ }
+ }
+ }
+
+ return CallNextHookEx(hook, nCode, wParam, lParam);
+ }
+
+ private static bool MessageBoxEnumProc(IntPtr hWnd, IntPtr lParam)
+ {
+ StringBuilder className = new StringBuilder(10);
+ GetClassName(hWnd, className, className.Capacity);
+ if (className.ToString() == "Button")
+ {
+ int ctlId = GetDlgCtrlID(hWnd);
+ switch (ctlId)
+ {
+ case MBOK:
+ SetWindowText(hWnd, OK);
+ break;
+ case MBCancel:
+ SetWindowText(hWnd, Cancel);
+ break;
+ case MBAbort:
+ SetWindowText(hWnd, Abort);
+ break;
+ case MBRetry:
+ SetWindowText(hWnd, Retry);
+ break;
+ case MBIgnore:
+ SetWindowText(hWnd, Ignore);
+ break;
+ case MBYes:
+ SetWindowText(hWnd, Yes);
+ break;
+ case MBNo:
+ SetWindowText(hWnd, No);
+ break;
+
+ }
+ nButton++;
+ }
+
+ return true;
+ }
+
+
+ }
+}
diff --git a/NesGame.cs b/NesGame.cs
index ba6d7cfa..eb6bf67d 100644
--- a/NesGame.cs
+++ b/NesGame.cs
@@ -18,6 +18,7 @@ namespace com.clusterrr.hakchi_gui
public class NesGame : INesMenuElement
{
public enum GameType { Cartridge, FDS }
+ public delegate bool NeedPatchDelegate(Form parentForm, string nesFileName);
private string code;
@@ -51,8 +52,8 @@ namespace com.clusterrr.hakchi_gui
get { return args; }
set
{
+ if (args != value) hasUnsavedChanges = true;
args = value;
- hasUnsavedChanges = true;
}
}
private byte players;
@@ -61,8 +62,8 @@ namespace com.clusterrr.hakchi_gui
get { return players; }
set
{
+ if (players != value) hasUnsavedChanges = true;
players = value;
- hasUnsavedChanges = true;
}
}
private bool simultaneous;
@@ -71,8 +72,8 @@ namespace com.clusterrr.hakchi_gui
get { return simultaneous; }
set
{
+ if (simultaneous != value) hasUnsavedChanges = true;
simultaneous = value;
- hasUnsavedChanges = true;
}
}
private string releaseDate;
@@ -81,8 +82,8 @@ namespace com.clusterrr.hakchi_gui
get { return releaseDate; }
set
{
+ if (releaseDate != value) hasUnsavedChanges = true;
releaseDate = value;
- hasUnsavedChanges = true;
}
}
private string publisher;
@@ -91,8 +92,8 @@ namespace com.clusterrr.hakchi_gui
get { return publisher; }
set
{
+ if (publisher != value) hasUnsavedChanges = true;
publisher = value;
- hasUnsavedChanges = true;
}
}
private string gameGenie = "";
@@ -101,8 +102,8 @@ namespace com.clusterrr.hakchi_gui
get { return gameGenie; }
set
{
+ if (gameGenie != value) hasUnsavedChanges = true;
gameGenie = value;
- hasUnsavedChanges = true;
}
}
public string Region
@@ -142,7 +143,7 @@ namespace com.clusterrr.hakchi_gui
IconPath = Path.Combine(path, Code + ".png");
SmallIconPath = Path.Combine(path, Code + "_small.png");
GameGeniePath = Path.Combine(path, GameGenieFileName);
- if (!File.Exists(ConfigPath)) throw new Exception("Invalid game directory: " + path);
+ if (!File.Exists(ConfigPath)) throw new FileNotFoundException("Invalid game directory: " + path);
Name = Code;
Players = 1;
@@ -190,7 +191,7 @@ namespace com.clusterrr.hakchi_gui
hasUnsavedChanges = false;
}
- public NesGame(string gamesDirectory, string nesFileName, bool ignoreMapper, ref bool? needPatch, Form parentForm = null, byte[] rawRomData = null)
+ public NesGame(string gamesDirectory, string nesFileName, bool? ignoreMapper, ref bool? needPatch, NeedPatchDelegate needPatchCallback, Form parentForm = null, byte[] rawRomData = null)
{
uint crc32;
if (!Path.GetExtension(nesFileName).ToLower().Equals(".fds"))
@@ -213,12 +214,13 @@ namespace com.clusterrr.hakchi_gui
var patches = Directory.GetFiles(patchesDirectory, string.Format("{0:X8}*.ips", crc32), SearchOption.AllDirectories);
if (patches.Length > 0 && needPatch != false)
{
- if (needPatch == true || MessageBox.Show(parentForm, string.Format(Resources.PatchQ, Path.GetFileName(nesFileName)), Resources.PatchAvailable, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ if (needPatch == true || ((needPatchCallback != null) && needPatchCallback(parentForm, Path.GetFileName(nesFileName)))) /*MessageBox.Show(parentForm, string.Format(Resources.PatchQ, Path.GetFileName(nesFileName)), Resources.PatchAvailable, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes*/
{
needPatch = true;
var patch = patches[0];
if (rawRomData == null)
rawRomData = File.ReadAllBytes(nesFileName);
+ Debug.WriteLine(string.Format("Patching {0}", nesFileName));
IpsPatcher.Patch(patch, ref rawRomData);
nesFile = new NesFile(rawRomData);
}
@@ -229,15 +231,27 @@ namespace com.clusterrr.hakchi_gui
if (nesFile.Mapper == 88) nesFile.Mapper = 4; // Compatible with MMC3... sometimes
if (nesFile.Mapper == 95) nesFile.Mapper = 4; // Compatible with MMC3
if (nesFile.Mapper == 206) nesFile.Mapper = 4; // Compatible with MMC3
- if (!supportedMappers.Contains(nesFile.Mapper) && !ignoreMapper)
+ if (!supportedMappers.Contains(nesFile.Mapper) && (ignoreMapper != true))
{
Directory.Delete(GamePath, true);
- throw new UnsupportedMapperException(nesFile);
+ if (ignoreMapper != false)
+ throw new UnsupportedMapperException(nesFile);
+ else
+ {
+ Debug.WriteLine(string.Format("Game {0} has mapper #{1}, skipped", nesFileName, nesFile.Mapper));
+ return;
+ }
}
- if (nesFile.Mirroring == NesFile.MirroringType.FourScreenVram && !ignoreMapper)
+ if ((nesFile.Mirroring == NesFile.MirroringType.FourScreenVram) && (ignoreMapper != true))
{
Directory.Delete(GamePath, true);
- throw new UnsupportedFourScreenException(nesFile);
+ if (ignoreMapper != false)
+ throw new UnsupportedFourScreenException(nesFile);
+ else
+ {
+ Debug.WriteLine(string.Format("Game {0} has four-screen mirroring, skipped", nesFileName, nesFile.Mapper));
+ return;
+ }
}
// TODO: Make trainer check. I think that NES Mini doesn't support it.
@@ -324,7 +338,7 @@ namespace com.clusterrr.hakchi_gui
public void Save()
{
if (!hasUnsavedChanges) return;
- Debug.WriteLine("Saving game " + Code);
+ Debug.WriteLine(string.Format("Saving game '{0}' as {1}", Name, Code));
Name = Regex.Replace(Name, @"'(\d)", @"`$1"); // Apostrophe + any number in game name crashes whole system. What. The. Fuck?
File.WriteAllText(ConfigPath, string.Format(
"[Desktop Entry]\n" +
diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs
index b7f9c210..22bc7fea 100644
--- a/Properties/Resources.Designer.cs
+++ b/Properties/Resources.Designer.cs
@@ -472,6 +472,15 @@ namespace com.clusterrr.hakchi_gui.Properties {
}
/// <summary>
+ /// Looks up a localized string similar to Loading games....
+ /// </summary>
+ internal static string LoadingGames {
+ get {
+ return ResourceManager.GetString("LoadingGames", resourceCulture);
+ }
+ }
+
+ /// <summary>
/// Looks up a localized string similar to Sorry, {0} uses mapper #{1} but this mapper is not supported by NES Mini and game probably will not start. Do you want to add this game anyway?.
/// </summary>
internal static string MapperNotSupported {
@@ -508,6 +517,24 @@ namespace com.clusterrr.hakchi_gui.Properties {
}
/// <summary>
+ /// Looks up a localized string similar to No.
+ /// </summary>
+ internal static string No {
+ get {
+ return ResourceManager.GetString("No", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to No for all.
+ /// </summary>
+ internal static string NoForAll {
+ get {
+ return ResourceManager.GetString("NoForAll", resourceCulture);
+ }
+ }
+
+ /// <summary>
/// Looks up a localized string similar to No kernel dump found.
/// </summary>
internal static string NoKernel {
@@ -749,5 +776,23 @@ namespace com.clusterrr.hakchi_gui.Properties {
return ResourceManager.GetString("XpZadig", resourceCulture);
}
}
+
+ /// <summary>
+ /// Looks up a localized string similar to Yes.
+ /// </summary>
+ internal static string Yes {
+ get {
+ return ResourceManager.GetString("Yes", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to Yes for all.
+ /// </summary>
+ internal static string YesForAll {
+ get {
+ return ResourceManager.GetString("YesForAll", resourceCulture);
+ }
+ }
}
}
diff --git a/Properties/Resources.resx b/Properties/Resources.resx
index 5a701994..4fda242c 100644
--- a/Properties/Resources.resx
+++ b/Properties/Resources.resx
@@ -346,4 +346,19 @@
<data name="blank_jp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\images\blank_jp.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="LoadingGames" xml:space="preserve">
+ <value>Loading games...</value>
+ </data>
+ <data name="No" xml:space="preserve">
+ <value>No</value>
+ </data>
+ <data name="NoForAll" xml:space="preserve">
+ <value>No for all</value>
+ </data>
+ <data name="Yes" xml:space="preserve">
+ <value>Yes</value>
+ </data>
+ <data name="YesForAll" xml:space="preserve">
+ <value>Yes for all</value>
+ </data>
</root> \ No newline at end of file
diff --git a/Properties/Resources.ru-RU.resx b/Properties/Resources.ru-RU.resx
index 10386907..105115bd 100644
--- a/Properties/Resources.ru-RU.resx
+++ b/Properties/Resources.ru-RU.resx
@@ -334,4 +334,19 @@
<data name="ParticallyTitle" xml:space="preserve">
<value>Слишком много игр</value>
</data>
+ <data name="LoadingGames" xml:space="preserve">
+ <value>Загружаем игры...</value>
+ </data>
+ <data name="No" xml:space="preserve">
+ <value>Нет</value>
+ </data>
+ <data name="NoForAll" xml:space="preserve">
+ <value>Нет для всех</value>
+ </data>
+ <data name="Yes" xml:space="preserve">
+ <value>Да</value>
+ </data>
+ <data name="YesForAll" xml:space="preserve">
+ <value>Да для всех</value>
+ </data>
</root> \ No newline at end of file
diff --git a/WorkerForm.cs b/WorkerForm.cs
index 00646b0b..62838b61 100644
--- a/WorkerForm.cs
+++ b/WorkerForm.cs
@@ -1,6 +1,7 @@
using com.clusterrr.Famicom;
using com.clusterrr.FelLib;
using com.clusterrr.hakchi_gui.Properties;
+using SevenZip;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -14,7 +15,7 @@ namespace com.clusterrr.hakchi_gui
{
public partial class WorkerForm : Form
{
- public enum Tasks { DumpKernel, FlashKernel, Memboot, DownloadAllCovers };
+ public enum Tasks { DumpKernel, FlashKernel, Memboot, DownloadAllCovers, AddGames };
public Tasks Task;
//public string UBootDump;
public string KernelDump;
@@ -26,12 +27,14 @@ namespace com.clusterrr.hakchi_gui
public bool AutofireHack;
public bool FcStart = true;
public string ExtraCommandLineArguments = null;
+ public string[] GamesToAdd;
Thread thread = null;
Fel fel = null;
const UInt16 vid = 0x1F3A;
const UInt16 pid = 0xEFE8;
+ readonly string baseDirectory;
readonly string fes1Path;
readonly string ubootPath;
readonly string tempDirectory;
@@ -46,27 +49,31 @@ namespace com.clusterrr.hakchi_gui
readonly string ramdiskPatched;
readonly string configPath;
readonly string hiddenPath;
- readonly string gamesDirectory;
+ readonly string tempGamesDirectory;
readonly string cloverconDriverPath;
readonly string argumentsFilePath;
+ readonly string gamesDirectory;
string[] correctKernels;
const int maxRamfsSize = 40 * 1024 * 1024;
DialogResult DeviceWaitResult = DialogResult.None;
+ DialogResult MessageBoxResult = DialogResult.None;
public WorkerForm()
{
InitializeComponent();
DialogResult = DialogResult.None;
- fes1Path = Path.Combine(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "data"), "fes1.bin");
- ubootPath = Path.Combine(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "data"), "uboot.bin");
- tempDirectory = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "temp");
+ baseDirectory = MainForm.BaseDirectory;
+ fes1Path = Path.Combine(Path.Combine(baseDirectory, "data"), "fes1.bin");
+ ubootPath = Path.Combine(Path.Combine(baseDirectory, "data"), "uboot.bin");
+ gamesDirectory = MainForm.GamesDirectory;
+ tempDirectory = Path.Combine(baseDirectory, "temp");
kernelDirectory = Path.Combine(tempDirectory, "kernel");
initramfs_cpio = Path.Combine(kernelDirectory, "initramfs.cpio");
initramfs_cpioPatched = Path.Combine(kernelDirectory, "initramfs_mod.cpio");
ramfsDirectory = Path.Combine(kernelDirectory, "initramfs");
hakchiDirectory = Path.Combine(ramfsDirectory, "hakchi");
- modsDirectory = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "mods");
- toolsDirectory = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "tools");
+ modsDirectory = Path.Combine(baseDirectory, "mods");
+ toolsDirectory = Path.Combine(baseDirectory, "tools");
kernelPatched = Path.Combine(kernelDirectory, "patched_kernel.img");
ramdiskPatched = Path.Combine(kernelDirectory, "kernel.img-ramdisk_mod.gz");
configPath = Path.Combine(hakchiDirectory, "config");
@@ -77,13 +84,13 @@ namespace com.clusterrr.hakchi_gui
"5cfdca351484e7025648abc3b20032ff", "07bfb800beba6ef619c29990d14b5158", // NES Mini
"ac8144c3ea4ab32e017648ee80bdc230" // Famicom Mini
};
- gamesDirectory = Path.Combine(ramfsDirectory, "games");
+ tempGamesDirectory = Path.Combine(ramfsDirectory, "games");
}
public DialogResult Start()
{
SetProgress(0, 1);
- if (Task != Tasks.DownloadAllCovers)
+ if (Task == Tasks.DumpKernel || Task == Tasks.FlashKernel || Task == Tasks.Memboot)
{
if (!WaitingForm.WaitForDevice(vid, pid))
{
@@ -108,13 +115,27 @@ namespace com.clusterrr.hakchi_gui
DeviceWaitResult = WaitingForm.WaitForDevice(vid, pid) ? DialogResult.OK : DialogResult.Abort;
}
+ private delegate void MessageBoxFromThreadDelegate(IWin32Window owner, string text, string caption, MessageBoxButtons buttons,
+ MessageBoxIcon icon, MessageBoxDefaultButton defaultButton);
+ void MessageBoxFromThread(IWin32Window owner, string text, string caption, MessageBoxButtons buttons,
+ MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
+ {
+ if (InvokeRequired)
+ {
+ Invoke(new MessageBoxFromThreadDelegate(MessageBoxFromThread),
+ new object[] { owner, text, caption, buttons, icon, defaultButton });
+ return;
+ }
+ MessageBoxResult = MessageBox.Show(owner, text, caption, buttons, icon, defaultButton);
+ }
+
public void StartThread()
{
fel = new Fel();
SetProgress(0, 1);
try
{
- if (Task != Tasks.DownloadAllCovers)
+ if (Task == Tasks.DumpKernel || Task == Tasks.FlashKernel || Task == Tasks.Memboot)
{
if (!File.Exists(fes1Path)) throw new FileNotFoundException(fes1Path + " not found");
if (!File.Exists(ubootPath)) throw new FileNotFoundException(ubootPath + " not found");
@@ -138,6 +159,9 @@ namespace com.clusterrr.hakchi_gui
case Tasks.DownloadAllCovers:
DownloadAllCovers();
break;
+ case Tasks.AddGames:
+ AddGames(gamesDirectory, GamesToAdd);
+ break;
}
Thread.Sleep(1000);
DialogResult = DialogResult.OK;
@@ -520,7 +544,7 @@ namespace com.clusterrr.hakchi_gui
if (Config != null && Config.ContainsKey("hakchi_remove_thumbnails") && Config["hakchi_remove_thumbnails"])
{
- var thumbnails = Directory.GetFiles(gamesDirectory, "*_small.png", SearchOption.AllDirectories);
+ var thumbnails = Directory.GetFiles(tempGamesDirectory, "*_small.png", SearchOption.AllDirectories);
foreach (var t in thumbnails)
File.WriteAllBytes(t, new byte[0]);
}
@@ -529,7 +553,7 @@ namespace com.clusterrr.hakchi_gui
romFiles.AddRange(Directory.GetFiles(ramfsDirectory, "*.nes", SearchOption.AllDirectories));
romFiles.AddRange(Directory.GetFiles(ramfsDirectory, "*.desktop", SearchOption.AllDirectories));
romFiles.AddRange(Directory.GetFiles(ramfsDirectory, "*.png", SearchOption.AllDirectories));
- romFiles.AddRange(Directory.GetFiles(ramfsDirectory, NesGame.GameGenieFileName, SearchOption.AllDirectories));
+ romFiles.AddRange(Directory.GetFiles(ramfsDirectory, NesGame.GameGenieFileName, SearchOption.AllDirectories));
ramfsFiles = romFiles.OrderBy(o => o).ToArray();
totalFiles = ramfsFiles.Length;
for (int i = 0; i < filesPos; i++)
@@ -653,9 +677,9 @@ namespace com.clusterrr.hakchi_gui
int menuIndex = allMenus.IndexOf(menuCollection);
string targetDirectory;
if (menuIndex == 0)
- targetDirectory = gamesDirectory;
+ targetDirectory = tempGamesDirectory;
else
- targetDirectory = Path.Combine(gamesDirectory, string.Format("sub{0:D3}", menuIndex));
+ targetDirectory = Path.Combine(tempGamesDirectory, string.Format("sub{0:D3}", menuIndex));
if (Directory.Exists(targetDirectory))
return;
foreach (var element in menuCollection)
@@ -710,7 +734,7 @@ namespace com.clusterrr.hakchi_gui
if (element is NesDefaultGame)
{
var game = element as NesDefaultGame;
- var gfilePath = Path.Combine(gamesDirectory, string.Format("gpath-{0}-{1}", game.Code, menuIndex));
+ var gfilePath = Path.Combine(tempGamesDirectory, string.Format("gpath-{0}-{1}", game.Code, menuIndex));
Directory.CreateDirectory(Path.GetDirectoryName(gfilePath));
File.WriteAllText(gfilePath, menuIndex == 0 ? "." : string.Format("sub{0:D3}", menuIndex));
}
@@ -726,7 +750,7 @@ namespace com.clusterrr.hakchi_gui
private bool ExecuteTool(string tool, string args, out byte[] output, string directory = null, bool external = false)
{
var process = new Process();
- var appDirectory = Path.GetDirectoryName(Application.ExecutablePath);
+ var appDirectory = baseDirectory;
var fileName = !external ? Path.Combine(toolsDirectory, tool) : tool;
process.StartInfo.FileName = fileName;
process.StartInfo.Arguments = args;
@@ -812,6 +836,119 @@ namespace com.clusterrr.hakchi_gui
}
}
+ bool YesForAllPatches = false;
+ public NesGame AddGames(string gamesDirectory, string[] files, Form parentForm = null)
+ {
+ NesGame nesGame = null;
+ bool NoForAllUnsupportedMappers = false;
+ YesForAllPatches = false;
+ if (parentForm == null) parentForm = this;
+ int count = 0;
+ foreach (var file in files)
+ {
+ try
+ {
+ var nesFileName = file;
+ var ext = Path.GetExtension(file).ToLower();
+ bool? needPatch = YesForAllPatches ? (bool?)true : null;
+ byte[] rawData = null;
+ if (ext == ".7z" || ext == ".zip" || ext == ".rar")
+ {
+ SevenZipExtractor.SetLibraryPath(Path.Combine(baseDirectory, IntPtr.Size == 8 ? @"tools\7z64.dll" : @"tools\7z.dll"));
+ var szExtractor = new SevenZipExtractor(file);
+ var filesInArchive = new List<string>();
+ foreach (var f in szExtractor.ArchiveFileNames)
+ {
+ var e = Path.GetExtension(f).ToLower();
+ if (e == ".nes" || e == ".fds")
+ filesInArchive.Add(f);
+ }
+ if (filesInArchive.Count == 1)
+ {
+ nesFileName = filesInArchive[0];
+ }
+ else
+ {
+ var fsForm = new SelectFileForm(filesInArchive.ToArray());
+ if (fsForm.ShowDialog() == DialogResult.OK)
+ nesFileName = (string)fsForm.listBoxFiles.SelectedItem;
+ else
+ continue;
+ }
+ var o = new MemoryStream();
+ szExtractor.ExtractFile(nesFileName, o);
+ rawData = new byte[szExtractor.ArchiveFileData[0].Size];
+ o.Seek(0, SeekOrigin.Begin);
+ o.Read(rawData, 0, rawData.Length);
+ }
+ try
+ {
+ nesGame = new NesGame(gamesDirectory, nesFileName, NoForAllUnsupportedMappers ? (bool?)false : null, ref needPatch, needPatchCallback, this, rawData);
+ }
+ catch (Exception ex)
+ {
+ if (ex is UnsupportedMapperException || ex is UnsupportedFourScreenException)
+ {
+ MessageBoxResult = DialogResult.None;
+ MessageBoxFromThread(this,
+ (ex is UnsupportedMapperException)
+ ? string.Format(Resources.MapperNotSupported, Path.GetFileName(file), (ex as UnsupportedMapperException).ROM.Mapper)
+ : string.Format(Resources.FourScreenNotSupported, Path.GetFileName(file)),
+ Resources.AreYouSure,
+ files.Length <= 1 ? MessageBoxButtons.YesNo : MessageBoxButtons.YesNoCancel,
+ MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
+ while (MessageBoxResult == DialogResult.None) Thread.Sleep(100);
+ if (MessageBoxResult == DialogResult.Yes)
+ nesGame = new NesGame(gamesDirectory, nesFileName, true, ref needPatch, needPatchCallback, this, rawData);
+ else if (MessageBoxResult == System.Windows.Forms.DialogResult.Cancel)
+ {
+ NoForAllUnsupportedMappers = true;
+ }
+ }
+ else throw ex;
+ }
+ ConfigIni.SelectedGames += ";" + nesGame.Code;
+ }
+ catch (Exception ex)
+ {
+ if (ex is ThreadAbortException) return null;
+ Debug.WriteLine(ex.Message + ex.StackTrace);
+ MessageBoxFromThread(this, ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
+ }
+ SetProgress(++count, files.Length);
+ }
+ return nesGame; // Last added game if any
+ }
+
+ private bool needPatchCallback(Form parentForm, string nesFileName)
+ {
+ MessageBoxResult = DialogResult.None;
+ if (GamesToAdd == null || GamesToAdd.Length <= 1)
+ {
+ MessageBoxFromThread(parentForm,
+ string.Format(Resources.PatchQ, Path.GetFileName(nesFileName)),
+ Resources.PatchAvailable,
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question,
+ MessageBoxDefaultButton.Button1);
+ while (MessageBoxResult == DialogResult.None) Thread.Sleep(100);
+ return MessageBoxResult == DialogResult.Yes;
+ }
+ else
+ {
+ MessageBoxFromThread(parentForm,
+ string.Format(Resources.PatchQ, Path.GetFileName(nesFileName)),
+ Resources.PatchAvailable,
+ MessageBoxButtons.AbortRetryIgnore,
+ MessageBoxIcon.Question,
+ MessageBoxDefaultButton.Button2);
+ while (MessageBoxResult == DialogResult.None) Thread.Sleep(100);
+ if (MessageBoxResult == DialogResult.Abort)
+ YesForAllPatches = true;
+ return MessageBoxResult != DialogResult.Ignore;
+ }
+ }
+
private void WorkerForm_FormClosing(object sender, FormClosingEventArgs e)
{
if ((thread != null) && (e.CloseReason == CloseReason.UserClosing))
diff --git a/hakchi_gui.csproj b/hakchi_gui.csproj
index 87739256..bf967231 100644
--- a/hakchi_gui.csproj
+++ b/hakchi_gui.csproj
@@ -64,6 +64,7 @@
<DependentUpon>AboutBox.cs</DependentUpon>
</Compile>
<Compile Include="ConfigIni.cs" />
+ <Compile Include="MessageBoxManager.cs" />
<Compile Include="NesDefaultGame.cs" />
<Compile Include="FelLib\AWFELMessage.cs" />
<Compile Include="FelLib\AWFELStandardRequest.cs" />
diff --git a/mods/mod_transfer/hakchi/init b/mods/mod_transfer/hakchi/init
index af644e6b..09d7d812 100644
--- a/mods/mod_transfer/hakchi/init
+++ b/mods/mod_transfer/hakchi/init
@@ -184,9 +184,11 @@ if [ -f $hakchi_extra_script ]; then
. $hakchi_extra_script
fi
-if [ -d /transfer ]; then
- echo Transferring extra data...
- cp -a /transfer/* $installdir/
+if [ "$hakchi_partial_first" == "y" ]; then
+ if [ -d /transfer ]; then
+ echo Transferring extra data...
+ cp -a /transfer/* $installdir/
+ fi
fi
echo Shutting down...