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:
-rw-r--r--Apps/NesMiniApplication.cs34
-rw-r--r--ConfigIni.cs164
-rw-r--r--MainForm.cs137
-rw-r--r--NesMenuFolder.cs4
-rw-r--r--WorkerForm.cs72
5 files changed, 325 insertions, 86 deletions
diff --git a/Apps/NesMiniApplication.cs b/Apps/NesMiniApplication.cs
index d2b21946..3b0ab9bf 100644
--- a/Apps/NesMiniApplication.cs
+++ b/Apps/NesMiniApplication.cs
@@ -14,7 +14,39 @@ namespace com.clusterrr.hakchi_gui
{
public class NesMiniApplication : INesMenuElement
{
- public readonly static string GamesDirectory = Path.Combine(Program.BaseDirectoryExternal, "games");
+ public static string GamesDirectory
+ {
+ get
+ {
+ switch (ConfigIni.ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ case MainForm.ConsoleType.Famicom:
+ return Path.Combine(Program.BaseDirectoryExternal, "games");
+ case MainForm.ConsoleType.SNES:
+ case MainForm.ConsoleType.SuperFamicom:
+ return Path.Combine(Program.BaseDirectoryExternal, "games_snes");
+ }
+ }
+ }
+ public static string GamesCloverPath
+ {
+ get
+ {
+ switch (ConfigIni.ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ case MainForm.ConsoleType.Famicom:
+ return "/usr/share/games/nes/kachikachi";
+ case MainForm.ConsoleType.SNES:
+ case MainForm.ConsoleType.SuperFamicom:
+ return "/usr/share/games";
+ }
+ }
+ }
+
const string DefaultReleaseDate = "1900-01-01";
const string DefaultPublisher = "UNKNOWN";
diff --git a/ConfigIni.cs b/ConfigIni.cs
index e0fa1649..0f5a5778 100644
--- a/ConfigIni.cs
+++ b/ConfigIni.cs
@@ -8,9 +8,16 @@ namespace com.clusterrr.hakchi_gui
public class ConfigIni
{
public static bool FirstRun = true;
- public static string SelectedGames = "default";
- public static string HiddenGames = "";
- public static bool CustomFlashed = false;
+ public static string SelectedGamesNes = "default";
+ public static string SelectedGamesSnes = "default";
+ public static string HiddenGamesNes = "";
+ public static string HiddenGamesFamicom = "";
+ public static string HiddenGamesSnes = "";
+ public static string HiddenGamesSuperFamicom = "";
+ public static bool CustomFlashedNes = false;
+ public static bool CustomFlashedFamicom = false;
+ public static bool CustomFlashedSnes = false;
+ public static bool CustomFlashedSuperFamicom = false;
public static bool UseFont = true;
public static bool ResetHack = true;
public static bool AutofireHack = false;
@@ -30,6 +37,114 @@ namespace com.clusterrr.hakchi_gui
public static bool TelnetServer = false;
public static string Language = "";
+ public static bool CustomFlashed
+ {
+ get
+ {
+ switch (ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ return CustomFlashedNes;
+ case MainForm.ConsoleType.Famicom:
+ return CustomFlashedFamicom;
+ case MainForm.ConsoleType.SNES:
+ return CustomFlashedSnes;
+ case MainForm.ConsoleType.SuperFamicom:
+ return CustomFlashedSuperFamicom;
+ }
+ }
+ set
+ {
+ switch (ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ CustomFlashedNes = value;
+ break;
+ case MainForm.ConsoleType.Famicom:
+ CustomFlashedFamicom = value;
+ break;
+ case MainForm.ConsoleType.SNES:
+ CustomFlashedSnes = value;
+ break;
+ case MainForm.ConsoleType.SuperFamicom:
+ CustomFlashedSuperFamicom = value;
+ break;
+ }
+ }
+ }
+
+ public static string SelectedGames
+ {
+ get
+ {
+ switch (ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ case MainForm.ConsoleType.Famicom:
+ return SelectedGamesNes;
+ case MainForm.ConsoleType.SNES:
+ case MainForm.ConsoleType.SuperFamicom:
+ return SelectedGamesSnes;
+ }
+ }
+ set
+ {
+ switch (ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ case MainForm.ConsoleType.Famicom:
+ ConfigIni.SelectedGamesNes = value;
+ break;
+ case MainForm.ConsoleType.SNES:
+ case MainForm.ConsoleType.SuperFamicom:
+ ConfigIni.SelectedGamesSnes = value;
+ break;
+ }
+ }
+ }
+
+ public static string HiddenGames
+ {
+ get
+ {
+ switch (ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ return ConfigIni.HiddenGamesNes;
+ case MainForm.ConsoleType.Famicom:
+ return ConfigIni.HiddenGamesFamicom;
+ case MainForm.ConsoleType.SNES:
+ return ConfigIni.HiddenGamesSnes;
+ case MainForm.ConsoleType.SuperFamicom:
+ return ConfigIni.HiddenGamesSuperFamicom;
+ }
+ }
+ set
+ {
+ switch (ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ ConfigIni.HiddenGamesNes = value;
+ break;
+ case MainForm.ConsoleType.Famicom:
+ ConfigIni.HiddenGamesFamicom = value;
+ break;
+ case MainForm.ConsoleType.SNES:
+ ConfigIni.HiddenGamesSnes = value;
+ break;
+ case MainForm.ConsoleType.SuperFamicom:
+ ConfigIni.HiddenGamesSuperFamicom = value;
+ break;
+ }
+ }
+ }
+
public static void Load()
{
Debug.WriteLine("Loading config");
@@ -65,14 +180,34 @@ namespace com.clusterrr.hakchi_gui
Language = value;
break;
case "selectedgames":
- SelectedGames = value;
+ SelectedGamesNes = value;
+ break;
+ case "selectedgamessnes":
+ SelectedGamesSnes = value;
break;
case "hiddengames":
- HiddenGames = value;
+ HiddenGamesNes = value;
+ break;
+ case "hiddengamesfamicom":
+ HiddenGamesFamicom = value;
+ break;
+ case "hiddengamessnes":
+ HiddenGamesSnes = value;
+ break;
+ case "hiddengamessuperfamicom":
+ HiddenGamesSuperFamicom = value;
+ break;
+ case "customflashednes":
+ CustomFlashedNes = !value.ToLower().Equals("false");
+ break;
+ case "customflashedfamicom":
+ CustomFlashedFamicom = !value.ToLower().Equals("false");
+ break;
+ case "customflashedsnes":
+ CustomFlashedSnes = !value.ToLower().Equals("false");
break;
- case "custom2flashed":
- CustomFlashed = !value.ToLower().Equals("false");
- FirstRun = false;
+ case "customflashedsuperfamicom":
+ CustomFlashedSuperFamicom = !value.ToLower().Equals("false");
break;
case "usefont":
UseFont = !value.ToLower().Equals("false");
@@ -136,9 +271,16 @@ namespace com.clusterrr.hakchi_gui
var configLines = new List<string>();
configLines.Add("[Config]");
configLines.Add(string.Format("Language={0}", Language));
- configLines.Add(string.Format("SelectedGames={0}", SelectedGames));
- configLines.Add(string.Format("HiddenGames={0}", HiddenGames));
- configLines.Add(string.Format("Custom2Flashed={0}", CustomFlashed));
+ configLines.Add(string.Format("SelectedGames={0}", SelectedGamesNes));
+ configLines.Add(string.Format("SelectedGamesSnes={0}", SelectedGamesSnes));
+ configLines.Add(string.Format("HiddenGames={0}", HiddenGamesNes));
+ configLines.Add(string.Format("HiddenGamesFamicom={0}", HiddenGamesFamicom));
+ configLines.Add(string.Format("HiddenGamesSnes={0}", HiddenGamesSnes));
+ configLines.Add(string.Format("HiddenGamesSuperFamicom={0}", HiddenGamesSuperFamicom));
+ configLines.Add(string.Format("CustomFlashedNes={0}", CustomFlashedNes));
+ configLines.Add(string.Format("CustomFlashedFamicom={0}", CustomFlashedFamicom));
+ configLines.Add(string.Format("CustomFlashedSnes={0}", CustomFlashedSnes));
+ configLines.Add(string.Format("CustomFlashedSuperFamicom={0}", CustomFlashedSuperFamicom));
configLines.Add(string.Format("UseFont={0}", UseFont));
configLines.Add(string.Format("ResetHack={0}", ResetHack));
configLines.Add(string.Format("AutofireHack={0}", AutofireHack));
diff --git a/MainForm.cs b/MainForm.cs
index 17641b0a..d24e388a 100644
--- a/MainForm.cs
+++ b/MainForm.cs
@@ -26,8 +26,6 @@ namespace com.clusterrr.hakchi_gui
public const long DefaultMaxGamesSize = 300;
public static IEnumerable<string> InternalMods;
public static ClovershellConnection Clovershell;
- //readonly string UBootDump;
- public static string KernelDump;
mooftpserv.Server ftpServer;
static NesDefaultGame[] defaultNesGames = new NesDefaultGame[] {
@@ -62,7 +60,7 @@ namespace com.clusterrr.hakchi_gui
new NesDefaultGame { Code = "CLV-P-NACDE", Name = "TECMO BOWL", Size =568276 },
new NesDefaultGame { Code = "CLV-P-NACHE", Name = "DOUBLE DRAGON II: The Revenge", Size = 578900 }
};
- NesDefaultGame[] defaultFamicomGames = new NesDefaultGame[] {
+ static NesDefaultGame[] defaultFamicomGames = new NesDefaultGame[] {
new NesDefaultGame { Code = "CLV-P-HAAAJ", Name = "スーパーマリオブラザーズ", Size = 596775 },
new NesDefaultGame { Code = "CLV-P-HAACJ", Name = "スーパーマリオブラザーズ3", Size = 1411534 },
new NesDefaultGame { Code = "CLV-P-HAADJ", Name = "スーパーマリオUSA", Size = 1501542 },
@@ -94,7 +92,7 @@ namespace com.clusterrr.hakchi_gui
new NesDefaultGame { Code = "CLV-P-HACLJ", Name = "ダウンタウン熱血行進曲 それゆけ大運動会", Size = 587083 },
new NesDefaultGame { Code = "CLV-P-HACPJ", Name = "アトランチスの謎", Size = 376213 }
};
- NesDefaultGame[] defaultSnesGames = new NesDefaultGame[]
+ static NesDefaultGame[] defaultSnesGames = new NesDefaultGame[]
{
new NesDefaultGame { Code = "CLV-P-SAAAE", Name = "Super Mario World", Size = 2979540 },
new NesDefaultGame { Code = "CLV-P-SAABE", Name = "F-ZERO", Size = 2770166 },
@@ -142,10 +140,9 @@ namespace com.clusterrr.hakchi_gui
{
try
{
- KernelDump = Path.Combine(Path.Combine(Program.BaseDirectoryExternal, "dump"), "kernel.img");
+ SyncConsoleType();
InternalMods = from m in Directory.GetFiles(Path.Combine(Program.BaseDirectoryInternal, "mods/hmods")) select Path.GetFileNameWithoutExtension(m);
LoadGames();
- SyncConsoleType();
LoadPresets();
LoadLanguages();
var version = Assembly.GetExecutingAssembly().GetName().Version;
@@ -164,9 +161,7 @@ namespace com.clusterrr.hakchi_gui
epilepsyProtectionToolStripMenuItem.Checked = ConfigIni.AntiArmetLevel > 0;
selectButtonCombinationToolStripMenuItem.Enabled = resetUsingCombinationOfButtonsToolStripMenuItem.Checked = ConfigIni.ResetHack;
enableAutofireToolStripMenuItem.Checked = ConfigIni.AutofireHack;
- useXYOnClassicControllerAsAutofireABToolStripMenuItem.Checked = ConfigIni.AutofireXYHack;
- nESMiniToolStripMenuItem.Checked = ConfigIni.ConsoleType == ConsoleType.NES;
- famicomMiniToolStripMenuItem.Checked = ConfigIni.ConsoleType == ConsoleType.Famicom;
+ useXYOnClassicControllerAsAutofireABToolStripMenuItem.Checked = ConfigIni.AutofireXYHack;
upABStartOnSecondControllerToolStripMenuItem.Checked = ConfigIni.FcStart;
compressGamesIfPossibleToolStripMenuItem.Checked = ConfigIni.Compress;
@@ -236,21 +231,43 @@ namespace com.clusterrr.hakchi_gui
try
{
ConfigIni.CustomFlashed = true; // Just in case of new installation
+ // Trying to autodetect console type
var customFirmware = Clovershell.ExecuteSimple("[ -d /var/lib/hakchi/firmware/ ] && [ -f /var/lib/hakchi/firmware/*.hsqs ] && echo YES || echo NO");
if (customFirmware == "NO")
{
+ var board = Clovershell.ExecuteSimple("cat /etc/clover/boardtype", 500, true);
var region = Clovershell.ExecuteSimple("cat /etc/clover/REGION", 500, true);
+ Debug.WriteLine(string.Format("Detected board: {0}", board));
Debug.WriteLine(string.Format("Detected region: {0}", region));
- if (region == "JPN")
- Invoke(new Action(delegate
- {
- famicomMiniToolStripMenuItem.PerformClick();
- }));
- if (region == "EUR_USA")
- Invoke(new Action(delegate
- {
- nESMiniToolStripMenuItem.PerformClick();
- }));
+ switch (board)
+ {
+ default:
+ case "dp-nes":
+ case "dp-hvc":
+ switch(region)
+ {
+ case "EUR_USA":
+ ConfigIni.ConsoleType = ConsoleType.NES;
+ break;
+ case "JPN":
+ ConfigIni.ConsoleType = ConsoleType.Famicom;
+ break;
+ }
+ break;
+ case "dp-shvc":
+ switch (region)
+ {
+ case "USA":
+ case "EUR":
+ ConfigIni.ConsoleType = ConsoleType.SNES;
+ break;
+ case "JPN":
+ ConfigIni.ConsoleType = ConsoleType.SuperFamicom;
+ break;
+ }
+ break;
+ }
+ Invoke(new Action(SyncConsoleType));
}
WorkerForm.GetMemoryStats();
new Thread(RecalculateSelectedGamesThread).Start();
@@ -379,13 +396,24 @@ namespace com.clusterrr.hakchi_gui
void LoadHidden()
{
checkedListBoxDefaultGames.Items.Clear();
- var hidden = ConfigIni.HiddenGames.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
NesDefaultGame[] games = null;
- if (ConfigIni.ConsoleType == ConsoleType.NES) games = defaultNesGames;
- if (ConfigIni.ConsoleType == ConsoleType.Famicom) games = defaultFamicomGames;
- if (ConfigIni.ConsoleType == ConsoleType.SNES) games = defaultSnesGames;
+ switch (ConfigIni.ConsoleType)
+ {
+ case ConsoleType.NES:
+ games = defaultNesGames;
+ break;
+ case ConsoleType.Famicom:
+ games = defaultFamicomGames;
+ break;
+ case ConsoleType.SNES:
+ games = defaultSnesGames;
+ break;
+ case ConsoleType.SuperFamicom:
+ //games = defaultSuperFamicomGames;
+ break;
+ }
foreach (var game in games.OrderBy(o => o.Name))
- checkedListBoxDefaultGames.Items.Add(game, !hidden.Contains(game.Code));
+ checkedListBoxDefaultGames.Items.Add(game, !ConfigIni.HiddenGames.Contains(game.Code));
}
void LoadPresets()
@@ -597,6 +625,7 @@ namespace com.clusterrr.hakchi_gui
}
ConfigIni.SelectedGames = string.Join(";", selected.ToArray());
selected.Clear();
+
foreach (NesDefaultGame game in checkedListBoxDefaultGames.Items)
selected.Add(game.Code);
foreach (NesDefaultGame game in checkedListBoxDefaultGames.CheckedItems)
@@ -737,7 +766,7 @@ namespace com.clusterrr.hakchi_gui
DialogResult RequireKernelDump()
{
- if (File.Exists(KernelDump)) return DialogResult.OK; // OK - already dumped
+ if (File.Exists(WorkerForm.KernelDump)) return DialogResult.OK; // OK - already dumped
// Asking user to dump kernel
if (MessageBox.Show(Resources.NoKernelWarning, Resources.NoKernel, MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
== System.Windows.Forms.DialogResult.Yes)
@@ -790,11 +819,9 @@ namespace com.clusterrr.hakchi_gui
bool DoKernelDump()
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.DumpingKernel;
workerForm.Task = WorkerForm.Tasks.DumpKernel;
- //workerForm.UBootDump = UBootDump;
- workerForm.KernelDump = KernelDump;
workerForm.Start();
return workerForm.DialogResult == DialogResult.OK;
}
@@ -805,7 +832,7 @@ namespace com.clusterrr.hakchi_gui
saveDumpFileDialog.DefaultExt = "bin";
if (saveDumpFileDialog.ShowDialog() != DialogResult.OK)
return false;
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.DumpingNand;
workerForm.Task = WorkerForm.Tasks.DumpNand;
workerForm.NandDump = saveDumpFileDialog.FileName;
@@ -819,7 +846,7 @@ namespace com.clusterrr.hakchi_gui
openDumpFileDialog.DefaultExt = "bin";
if (openDumpFileDialog.ShowDialog() != DialogResult.OK)
return false;
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = "...";
workerForm.Task = WorkerForm.Tasks.FlashNand;
workerForm.NandDump = openDumpFileDialog.FileName;
@@ -833,7 +860,7 @@ namespace com.clusterrr.hakchi_gui
saveDumpFileDialog.DefaultExt = "hsqs";
if (saveDumpFileDialog.ShowDialog() != DialogResult.OK)
return false;
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.DumpingNand;
workerForm.Task = WorkerForm.Tasks.DumpNandB;
workerForm.NandDump = saveDumpFileDialog.FileName;
@@ -843,10 +870,9 @@ namespace com.clusterrr.hakchi_gui
bool FlashCustomKernel()
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.FlasingCustom;
workerForm.Task = WorkerForm.Tasks.FlashKernel;
- workerForm.KernelDump = KernelDump;
workerForm.Mod = "mod_hakchi";
workerForm.hmodsInstall = new List<string>(InternalMods);
workerForm.Config = null;
@@ -863,10 +889,9 @@ namespace com.clusterrr.hakchi_gui
bool MembootOriginalKernel()
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.Membooting;
workerForm.Task = WorkerForm.Tasks.Memboot;
- workerForm.KernelDump = KernelDump;
workerForm.Mod = null;
workerForm.Config = null;
workerForm.Games = null;
@@ -876,10 +901,9 @@ namespace com.clusterrr.hakchi_gui
bool MembootCustomKernel()
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.Membooting;
workerForm.Task = WorkerForm.Tasks.Memboot;
- workerForm.KernelDump = KernelDump;
workerForm.Mod = "mod_hakchi";
workerForm.Config = null;
workerForm.Games = null;
@@ -889,10 +913,9 @@ namespace com.clusterrr.hakchi_gui
bool UploadGames()
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.UploadingGames;
workerForm.Task = WorkerForm.Tasks.UploadGames;
- workerForm.KernelDump = KernelDump;
workerForm.Mod = "mod_hakchi";
workerForm.Config = ConfigIni.GetConfigDictionary();
workerForm.Games = new NesMenuCollection();
@@ -912,7 +935,6 @@ namespace com.clusterrr.hakchi_gui
workerForm.FoldersMode = ConfigIni.FoldersMode;
workerForm.MaxGamesPerFolder = ConfigIni.MaxGamesPerFolder;
- workerForm.MainForm = this;
workerForm.Start();
return workerForm.DialogResult == DialogResult.OK;
}
@@ -921,7 +943,7 @@ namespace com.clusterrr.hakchi_gui
{
SaveConfig();
ICollection<NesMiniApplication> addedApps;
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.LoadingGames;
workerForm.Task = WorkerForm.Tasks.AddGames;
workerForm.GamesToAdd = files;
@@ -976,10 +998,9 @@ namespace com.clusterrr.hakchi_gui
bool FlashOriginalKernel(bool boot = true)
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.FlasingOriginal;
workerForm.Task = WorkerForm.Tasks.FlashKernel;
- workerForm.KernelDump = KernelDump;
workerForm.Mod = null;
workerForm.Start();
var result = workerForm.DialogResult == DialogResult.OK;
@@ -993,10 +1014,9 @@ namespace com.clusterrr.hakchi_gui
bool Uninstall()
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.Uninstalling;
workerForm.Task = WorkerForm.Tasks.Memboot;
- workerForm.KernelDump = KernelDump;
workerForm.Mod = "mod_uninstall";
workerForm.Start();
return workerForm.DialogResult == DialogResult.OK;
@@ -1004,10 +1024,9 @@ namespace com.clusterrr.hakchi_gui
bool InstallMods(string[] mods)
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.InstallingMods;
workerForm.Task = WorkerForm.Tasks.Memboot;
- workerForm.KernelDump = KernelDump;
workerForm.Mod = "mod_hakchi";
workerForm.hmodsInstall = new List<string>(mods);
workerForm.Start();
@@ -1016,10 +1035,9 @@ namespace com.clusterrr.hakchi_gui
bool UninstallMods(string[] mods)
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.UninstallingMods;
workerForm.Task = WorkerForm.Tasks.Memboot;
- workerForm.KernelDump = KernelDump;
workerForm.Mod = "mod_hakchi";
workerForm.hmodsUninstall = new List<string>(mods);
workerForm.Start();
@@ -1028,7 +1046,7 @@ namespace com.clusterrr.hakchi_gui
bool DownloadAllCovers()
{
- var workerForm = new WorkerForm();
+ var workerForm = new WorkerForm(this);
workerForm.Text = Resources.DownloadAllCoversTitle;
workerForm.Task = WorkerForm.Tasks.DownloadAllCovers;
workerForm.Games = new NesMenuCollection();
@@ -1042,7 +1060,7 @@ namespace com.clusterrr.hakchi_gui
private void dumpKernelToolStripMenuItem_Click(object sender, EventArgs e)
{
- if (File.Exists(KernelDump))
+ if (File.Exists(WorkerForm.KernelDump))
{
MessageBox.Show(Resources.ReplaceKernelQ, Resources.Warning, MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
@@ -1086,7 +1104,7 @@ namespace com.clusterrr.hakchi_gui
private void membootOriginalKernelToolStripMenuItem_Click(object sender, EventArgs e)
{
- if (!File.Exists(KernelDump))
+ if (!File.Exists(WorkerForm.KernelDump))
{
MessageBox.Show(Resources.NoKernelYouNeed, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
@@ -1103,7 +1121,7 @@ namespace com.clusterrr.hakchi_gui
private void flashOriginalKernelToolStripMenuItem_Click(object sender, EventArgs e)
{
- if (!File.Exists(KernelDump))
+ if (!File.Exists(WorkerForm.KernelDump))
{
MessageBox.Show(Resources.NoKernelYouNeed, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
@@ -1117,7 +1135,7 @@ namespace com.clusterrr.hakchi_gui
private void uninstallToolStripMenuItem_Click(object sender, EventArgs e)
{
- if (!File.Exists(KernelDump))
+ if (!File.Exists(WorkerForm.KernelDump))
{
MessageBox.Show(Resources.NoKernelYouNeed, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
@@ -1188,18 +1206,20 @@ namespace com.clusterrr.hakchi_gui
static ConsoleType lastConsoleType = ConsoleType.Unknown;
public void SyncConsoleType()
{
+ if (lastConsoleType == ConfigIni.ConsoleType) return;
nESMiniToolStripMenuItem.Checked = ConfigIni.ConsoleType == ConsoleType.NES;
famicomMiniToolStripMenuItem.Checked = ConfigIni.ConsoleType == ConsoleType.Famicom;
sNESMiniToolStripMenuItem.Checked = ConfigIni.ConsoleType == ConsoleType.SNES;
superFamicomMiniToolStripMenuItem.Checked = ConfigIni.ConsoleType == ConsoleType.SuperFamicom;
- if (lastConsoleType == ConfigIni.ConsoleType) return;
- ConfigIni.HiddenGames = "";
LoadHidden();
+ LoadGames();
+ lastConsoleType = ConfigIni.ConsoleType;
}
private void nESMiniToolStripMenuItem_Click(object sender, EventArgs e)
{
if (nESMiniToolStripMenuItem.Checked) return;
+ SaveConfig();
ConfigIni.ConsoleType = ConsoleType.NES;
SyncConsoleType();
}
@@ -1207,6 +1227,7 @@ namespace com.clusterrr.hakchi_gui
private void famicomMiniToolStripMenuItem_Click(object sender, EventArgs e)
{
if (famicomMiniToolStripMenuItem.Checked) return;
+ SaveConfig();
ConfigIni.ConsoleType = ConsoleType.Famicom;
SyncConsoleType();
}
@@ -1214,6 +1235,7 @@ namespace com.clusterrr.hakchi_gui
private void sNESMiniToolStripMenuItem_Click(object sender, EventArgs e)
{
if (sNESMiniToolStripMenuItem.Checked) return;
+ SaveConfig();
ConfigIni.ConsoleType = ConsoleType.SNES;
SyncConsoleType();
}
@@ -1221,6 +1243,7 @@ namespace com.clusterrr.hakchi_gui
private void superFamicomMiniToolStripMenuItem_Click(object sender, EventArgs e)
{
if (superFamicomMiniToolStripMenuItem.Checked) return;
+ SaveConfig();
ConfigIni.ConsoleType = ConsoleType.SuperFamicom;
SyncConsoleType();
}
@@ -1272,7 +1295,7 @@ namespace com.clusterrr.hakchi_gui
private void MainForm_Shown(object sender, EventArgs e)
{
- if (ConfigIni.FirstRun && !File.Exists(KernelDump))
+ if (ConfigIni.FirstRun && !File.Exists(WorkerForm.KernelDump))
{
MessageBox.Show(this, Resources.FirstRun + "\r\n\r\n" + Resources.Donate, Resources.Hello, MessageBoxButtons.OK, MessageBoxIcon.Information);
ConfigIni.FirstRun = false;
diff --git a/NesMenuFolder.cs b/NesMenuFolder.cs
index 8f5db232..494ef501 100644
--- a/NesMenuFolder.cs
+++ b/NesMenuFolder.cs
@@ -237,7 +237,7 @@ namespace com.clusterrr.hakchi_gui
"Exec=/bin/chmenu {1:D3} {8}\n" +
"Path=/var/lib/clover/profiles/0/FOLDER\n" +
"Name={2}\n" +
- "Icon=/usr/share/games/nes/kachikachi/{0}/{0}.png\n\n" +
+ "Icon={9}/{0}/{0}.png\n\n" +
"[X-CLOVER Game]\n" +
"Code={0}\n" +
"TestID=777\n" +
@@ -251,7 +251,7 @@ namespace com.clusterrr.hakchi_gui
"Copyright=hakchi2 ©2017 Alexey 'Cluster' Avdyukhin\n",
Code, ChildIndex, Name ?? Code, Players, ReleaseDate,
prefix + (Name ?? Code).ToLower(), (Publisher ?? "").ToUpper(),
- Simultaneous, Initial)
+ Simultaneous, Initial, NesMiniApplication.GamesCloverPath)
);
Image.Save(IconPath, ImageFormat.Png);
ImageThumbnail.Save(ThumnnailIconPath, ImageFormat.Png);
diff --git a/WorkerForm.cs b/WorkerForm.cs
index 9a022995..a90d3277 100644
--- a/WorkerForm.cs
+++ b/WorkerForm.cs
@@ -22,7 +22,24 @@ namespace com.clusterrr.hakchi_gui
public enum Tasks { DumpKernel, FlashKernel, DumpNand, FlashNand, DumpNandB, Memboot, UploadGames, DownloadAllCovers, AddGames };
public Tasks Task;
//public string UBootDump;
- public string KernelDump;
+ public static string KernelDump
+ {
+ get
+ {
+ switch (ConfigIni.ConsoleType)
+ {
+ default:
+ case MainForm.ConsoleType.NES:
+ return Path.Combine(Path.Combine(Program.BaseDirectoryExternal, "dump"), "kernel.img");
+ case MainForm.ConsoleType.Famicom:
+ return Path.Combine(Path.Combine(Program.BaseDirectoryExternal, "dump"), "kernel_famicom.img");
+ case MainForm.ConsoleType.SNES:
+ return Path.Combine(Path.Combine(Program.BaseDirectoryExternal, "dump"), "kernel_snes.img");
+ case MainForm.ConsoleType.SuperFamicom:
+ return Path.Combine(Path.Combine(Program.BaseDirectoryExternal, "dump"), "kernel_super_famicom.img");
+ }
+ }
+ }
public string NandDump;
public string Mod = null;
public Dictionary<string, string> Config = null;
@@ -32,7 +49,7 @@ namespace com.clusterrr.hakchi_gui
public IEnumerable<string> GamesToAdd;
public NesMenuCollection.SplitStyle FoldersMode = NesMenuCollection.SplitStyle.Auto;
public int MaxGamesPerFolder = 35;
- public MainForm MainForm;
+ private MainForm MainForm;
Thread thread = null;
Fel fel = null;
@@ -55,22 +72,22 @@ namespace com.clusterrr.hakchi_gui
readonly string kernelPatched;
readonly string ramdiskPatched;
readonly string tempHmodsDirectory;
- readonly string cloverconDriverPath;
readonly string argumentsFilePath;
readonly string transferDirectory;
string tempGamesDirectory;
//string originalGamesConfigDirectory;
//string hiddenPath;
- string[] correctKernels;
+ Dictionary<MainForm.ConsoleType, string[]> correctKernels = new Dictionary<MainForm.ConsoleType, string[]>();
const long maxCompressedsRamfsSize = 30 * 1024 * 1024;
string selectedFile = null;
public NesMiniApplication[] addedApplications;
public static int NandCTotal, NandCUsed, NandCFree, WritedGamesSize, SaveStatesSize;
public const long ReservedMemory = 10;
- public WorkerForm()
+ public WorkerForm(MainForm parentForm)
{
InitializeComponent();
+ MainForm = parentForm;
DialogResult = DialogResult.None;
baseDirectoryInternal = Program.BaseDirectoryInternal;
baseDirectoryExternal = Program.BaseDirectoryExternal;
@@ -94,17 +111,17 @@ namespace com.clusterrr.hakchi_gui
toolsDirectory = Path.Combine(baseDirectoryInternal, "tools");
kernelPatched = Path.Combine(kernelDirectory, "patched_kernel.img");
ramdiskPatched = Path.Combine(kernelDirectory, "kernel.img-ramdisk_mod.gz");
- cloverconDriverPath = Path.Combine(hakchiDirectory, "clovercon.ko");
argumentsFilePath = Path.Combine(hakchiDirectory, "extra_args");
transferDirectory = Path.Combine(hakchiDirectory, "transfer");
tempHmodsDirectory = Path.Combine(transferDirectory, "hmod");
- correctKernels
- = new string[] {
- "5cfdca351484e7025648abc3b20032ff", "07bfb800beba6ef619c29990d14b5158", // NES Mini
- "ac8144c3ea4ab32e017648ee80bdc230", // Famicom Mini
+
+ correctKernels[MainForm.ConsoleType.NES] = new string[] { "5cfdca351484e7025648abc3b20032ff", "07bfb800beba6ef619c29990d14b5158" }; // NES Mini
+ correctKernels[MainForm.ConsoleType.Famicom] = new string[] { "ac8144c3ea4ab32e017648ee80bdc230" }; // Famicom Mini
+ correctKernels[MainForm.ConsoleType.SNES] = new string[] {
"d76c2a091ebe7b4614589fc6954653a5", // SNES Mini (EUR)
"449b711238575763c6701f5958323d48" // SNES Mini (USA)
};
+ correctKernels[MainForm.ConsoleType.SuperFamicom] = new string[] { }; // SNES Mini (USA)
}
public DialogResult Start()
@@ -394,7 +411,8 @@ namespace com.clusterrr.hakchi_gui
var md5 = System.Security.Cryptography.MD5.Create();
var hash = BitConverter.ToString(md5.ComputeHash(kernel)).Replace("-", "").ToLower();
- if (!correctKernels.Contains(hash))
+ var matchedKernels = from k in correctKernels where k.Value.Contains(hash) select k.Key;
+ if (matchedKernels.Count() == 0)
{
if (MessageBoxFromThread(this, Resources.MD5Failed + " " + hash + "\r\n" + Resources.MD5Failed2 +
"\r\n" + Resources.DoYouWantToContinue, Resources.Warning, MessageBoxButtons.YesNo,
@@ -405,6 +423,15 @@ namespace com.clusterrr.hakchi_gui
return;
}
}
+ else
+ {
+ var console = matchedKernels.First();
+ if (console != ConfigIni.ConsoleType)
+ {
+ ConfigIni.ConsoleType = console;
+ Invoke(new Action(MainForm.SyncConsoleType));
+ }
+ }
Directory.CreateDirectory(Path.GetDirectoryName(KernelDump));
File.WriteAllBytes(KernelDump, kernel);
@@ -662,7 +689,7 @@ namespace com.clusterrr.hakchi_gui
public void UploadGames()
{
- const string gamesPath = "/usr/share/games/nes/kachikachi";
+ string gamesPath = NesMiniApplication.GamesCloverPath;
const string rootFsPath = "/var/lib/hakchi/rootfs";
const string installPath = "/var/lib/hakchi";
int progress = 0;
@@ -748,7 +775,20 @@ namespace com.clusterrr.hakchi_gui
startProgress = progress;
foreach (var originalCode in originalGames.Keys)
{
- clovershell.ExecuteSimple(string.Format(@"mkdir -p ""{2}{3}/{1}/{0}/"" && rsync -ac ""{3}/{0}/"" ""{2}{3}/{1}/{0}/"" && sed -i -e 's/\/usr\/bin\/clover-kachikachi/\/bin\/clover-kachikachi-wr/g' ""{2}{3}/{1}/{0}/{0}.desktop""", originalCode, originalGames[originalCode], rootFsPath, gamesPath), 5000, true);
+ string originalSyncCode = "";
+ switch (ConfigIni.ConsoleType)
+ {
+ case MainForm.ConsoleType.NES:
+ case MainForm.ConsoleType.Famicom:
+ originalSyncCode = @"mkdir -p ""{2}{3}/{1}/{0}/"" && rsync -ac ""{3}/{0}/"" ""{2}{3}/{1}/{0}/"" && sed -i -e 's/\/usr\/bin\/clover-kachikachi/\/bin\/clover-kachikachi-wr/g' ""{2}{3}/{1}/{0}/{0}.desktop""";
+ break;
+ case MainForm.ConsoleType.SNES:
+ case MainForm.ConsoleType.SuperFamicom:
+ originalSyncCode = @"mkdir -p ""{2}{3}/{1}/{0}/"" && rsync -ac ""{3}/{0}/"" ""{2}{3}/{1}/{0}/""";
+ break;
+ }
+ clovershell.ExecuteSimple(string.Format(originalSyncCode,
+ originalCode, originalGames[originalCode], rootFsPath, gamesPath), 5000, true);
progress += 2;
SetProgress(progress, maxProgress);
};
@@ -787,7 +827,7 @@ namespace com.clusterrr.hakchi_gui
}
}
clovershell.Execute("cat > /tmp/config", config, null, null, 1000, true);
- clovershell.Execute("source /etc/preinit && script_init && source /tmp/config && source $preinit.d/pffff_config", null, null, null, 30000, true);
+ clovershell.Execute("temppath=/tmp && source /etc/preinit && script_init && source /tmp/config && source $preinit.d/pffff_config", null, null, null, 30000, true);
config.Dispose();
if (reboot)
{
@@ -896,7 +936,9 @@ namespace com.clusterrr.hakchi_gui
Directory.CreateDirectory(tempDirectory);
Directory.CreateDirectory(kernelDirectory);
Directory.CreateDirectory(ramfsDirectory);
- if (!ExecuteTool("unpackbootimg.exe", string.Format("-i \"{0}\" -o \"{1}\"", KernelDump, kernelDirectory)))
+ string KernelDumpTemp = Path.Combine(tempDirectory, "kernel.img");
+ File.Copy(KernelDump, KernelDumpTemp);
+ if (!ExecuteTool("unpackbootimg.exe", string.Format("-i \"{0}\" -o \"{1}\"", KernelDumpTemp, kernelDirectory)))
throw new Exception("Can't unpack kernel image");
if (!ExecuteTool("lzop.exe", string.Format("-d \"{0}\" -o \"{1}\"",
Path.Combine(kernelDirectory, "kernel.img-ramdisk.gz"), initramfs_cpio)))