From 134783ff364f94d07c837be85b78fe920268cee8 Mon Sep 17 00:00:00 2001 From: adelikat Date: Sun, 29 Dec 2013 23:54:40 +0000 Subject: [PATCH] a round of code cleanup on RomLoader --- BizHawk.Client.Common/RomLoader.cs | 245 ++++++++++++++--------------- 1 file changed, 118 insertions(+), 127 deletions(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 29e71e9a3c..a60ba4a97b 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -1,50 +1,53 @@ using System; -using System.Collections.Generic; -using System.Linq; +using System.IO; using BizHawk.Common; using BizHawk.Emulation.Common; -using BizHawk.Emulation.DiscSystem; -using System.IO; +using BizHawk.Emulation.Cores.Atari.Atari2600; +using BizHawk.Emulation.Cores.Atari.Atari7800; +using BizHawk.Emulation.Cores.Calculators; +using BizHawk.Emulation.Cores.ColecoVision; +using BizHawk.Emulation.Cores.Computers.Commodore64; using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; +using BizHawk.Emulation.Cores.Intellivision; +using BizHawk.Emulation.Cores.Nintendo.Gameboy; +using BizHawk.Emulation.Cores.Nintendo.GBA; +using BizHawk.Emulation.Cores.Nintendo.N64; +using BizHawk.Emulation.Cores.Nintendo.NES; +using BizHawk.Emulation.Cores.Nintendo.SNES; +using BizHawk.Emulation.Cores.PCEngine; +using BizHawk.Emulation.Cores.Sega.MasterSystem; using BizHawk.Emulation.Cores.Sega.Saturn; using BizHawk.Emulation.Cores.Sony.PSP; using BizHawk.Emulation.Cores.Sony.PSX; -using BizHawk.Emulation.Cores.PCEngine; -using BizHawk.Emulation.Cores.Nintendo.Gameboy; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Sega.MasterSystem; -using BizHawk.Emulation.Cores.Nintendo.NES; -using BizHawk.Emulation.Cores.Intellivision; -using BizHawk.Emulation.Cores.ColecoVision; -using BizHawk.Emulation.Cores.Nintendo.GBA; -using BizHawk.Emulation.Cores.Atari.Atari7800; -using BizHawk.Emulation.Cores.Computers.Commodore64; -using BizHawk.Emulation.Cores.Calculators; -using BizHawk.Emulation.Cores.Atari.Atari2600; -using BizHawk.Emulation.Cores.Nintendo.N64; +using BizHawk.Emulation.DiscSystem; namespace BizHawk.Client.Common { public class RomLoader { // helper methods for the settings events - - object GetCoreSettings() + private object GetCoreSettings() where T : IEmulator { var e = new SettingsLoadArgs(typeof(T)); if (OnLoadSettings != null) + { OnLoadSettings(this, e); + } + return e.Settings; } - object GetCoreSyncSettings() + private object GetCoreSyncSettings() where T : IEmulator { var e = new SettingsLoadArgs(typeof(T)); if (OnLoadSyncSettings != null) + { OnLoadSyncSettings(this, e); + } + return e.Settings; } @@ -85,17 +88,17 @@ namespace BizHawk.Client.Common Settings = null; } } + public delegate void SettingsLoadEventHandler(object sender, SettingsLoadArgs e); public event SettingsLoadEventHandler OnLoadSettings; public event SettingsLoadEventHandler OnLoadSyncSettings; - public delegate void LoadErrorEventHandler(object sener, RomErrorArgs e); public event LoadErrorEventHandler OnLoadError; - public Func ChooseArchive; + public Func ChooseArchive { get; set; } - public Action CoreCommMessageCallback; // TODO: eww, do we have to do this? + public Action CoreCommMessageCallback { get; set; } // TODO: eww, do we have to do this? private int? HandleArchive(HawkFile file) { @@ -116,10 +119,10 @@ namespace BizHawk.Client.Common } // TODO I'm in mainform.cs and here, move me to a common place that both can call, static method on the config object? - private void CommitCoreSettingsToConfig() + private static void CommitCoreSettingsToConfig() { // save settings object - Type t = Global.Emulator.GetType(); + var t = Global.Emulator.GetType(); Global.Config.PutCoreSettings(Global.Emulator.GetSettings(), t); // don't trample config with loaded-from-movie settings @@ -160,7 +163,7 @@ namespace BizHawk.Client.Common // if we have an archive and need to bind something, then pop the dialog if (file.IsArchive && !file.IsBound) { - var result = ChooseArchive(file); + var result = HandleArchive(file); if (result.HasValue) { file.BindArchiveMember(result.Value); @@ -223,105 +226,92 @@ namespace BizHawk.Client.Common switch (game.System) { case "GEN": - { - var genesis = new GPGX( + var genesis = new GPGX( nextComm, null, disc, "GEN", GetCoreSettings()); - nextEmulator = genesis; - } + nextEmulator = genesis; break; case "SAT": - { - var saturn = new Yabause(nextComm, disc, GetCoreSyncSettings()); - nextEmulator = saturn; - } + nextEmulator = new Yabause(nextComm, disc, GetCoreSyncSettings()); break; case "PSP": - { - var psp = new PSP(nextComm, file.Name); - nextEmulator = psp; - } + nextEmulator = new PSP(nextComm, file.Name); break; case "PSX": - { - var psx = new Octoshock(nextComm); - nextEmulator = psx; - psx.LoadCuePath(file.CanonicalFullPath); - nextEmulator.CoreComm.RomStatusDetails = "PSX etc."; - } + nextEmulator = new Octoshock(nextComm); + (nextEmulator as Octoshock).LoadCuePath(file.CanonicalFullPath); + nextEmulator.CoreComm.RomStatusDetails = "PSX etc."; break; case "PCE": case "PCECD": + var biosPath = Global.FirmwareManager.Request("PCECD", "Bios"); + if (!File.Exists(biosPath)) { - var biosPath = Global.FirmwareManager.Request("PCECD", "Bios"); - if (File.Exists(biosPath) == false) - { - ThrowLoadError("PCE-CD System Card not found. Please check the BIOS path in Config->Paths->PC Engine." - , game.System); - return false; - } - - rom = new RomGame(new HawkFile(biosPath)); - - if (rom.GameInfo.Status == RomStatus.BadDump) - { - ThrowLoadError( - "The PCE-CD System Card you have selected is known to be a bad dump. This may cause problems playing PCE-CD games.\n\n" - + "It is recommended that you find a good dump of the system card. Sorry to be the bearer of bad news!" - , game.System); - } - else if (rom.GameInfo.NotInDatabase) - { - ThrowLoadError( - "The PCE-CD System Card you have selected is not recognized in our database. That might mean it's a bad dump, or isn't the correct rom." - , game.System); - } - else if (rom.GameInfo["BIOS"] == false) - { - ThrowLoadError( - "The PCE-CD System Card you have selected is not a BIOS image. You may have selected the wrong rom." - , game.System); - } - - if (rom.GameInfo["SuperSysCard"]) - { - game.AddOption("SuperSysCard"); - } - - if (game["NeedSuperSysCard"] && game["SuperSysCard"] == false) - { - ThrowLoadError( - "This game requires a version 3.0 System card and won't run with the system card you've selected. Try selecting a 3.0 System Card in Config->Paths->PC Engine." - , game.System); - } - - game.FirmwareHash = Util.Hash_SHA1(rom.RomData); - nextEmulator = new PCEngine(nextComm, game, disc, rom.RomData, GetCoreSettings()); - break; + ThrowLoadError("PCE-CD System Card not found. Please check the BIOS path in Config->Paths->PC Engine.", game.System); + return false; } + + rom = new RomGame(new HawkFile(biosPath)); + + if (rom.GameInfo.Status == RomStatus.BadDump) + { + ThrowLoadError( + "The PCE-CD System Card you have selected is known to be a bad dump. This may cause problems playing PCE-CD games.\n\n" + + "It is recommended that you find a good dump of the system card. Sorry to be the bearer of bad news!", + game.System); + } + else if (rom.GameInfo.NotInDatabase) + { + ThrowLoadError( + "The PCE-CD System Card you have selected is not recognized in our database. That might mean it's a bad dump, or isn't the correct rom.", + game.System); + } + else if (rom.GameInfo["BIOS"] == false) + { + ThrowLoadError( + "The PCE-CD System Card you have selected is not a BIOS image. You may have selected the wrong rom.", + game.System); + } + + if (rom.GameInfo["SuperSysCard"]) + { + game.AddOption("SuperSysCard"); + } + + if (game["NeedSuperSysCard"] && game["SuperSysCard"] == false) + { + ThrowLoadError( + "This game requires a version 3.0 System card and won't run with the system card you've selected. Try selecting a 3.0 System Card in Config->Paths->PC Engine.", + game.System); + } + + game.FirmwareHash = Util.Hash_SHA1(rom.RomData); + nextEmulator = new PCEngine(nextComm, game, disc, rom.RomData, GetCoreSettings()); + break; } } else if (file.Extension.ToLower() == ".xml") { try { - var XMLG = XmlGame.Create(file); // if load fails, are we supposed to retry as a bsnes XML???????? - game = XMLG.GI; + var xmlGame = XmlGame.Create(file); // if load fails, are we supposed to retry as a bsnes XML???????? + game = xmlGame.GI; switch (game.System) { case "DGB": - - var L = Database.GetGameInfo(XMLG.Assets["LeftRom"], "left.gb"); - var R = Database.GetGameInfo(XMLG.Assets["RightRom"], "right.gb"); - - var gbl = new GambatteLink(nextComm, L, XMLG.Assets["LeftRom"], R, XMLG.Assets["RightRom"], + var left = Database.GetGameInfo(xmlGame.Assets["LeftRom"], "left.gb"); + var right = Database.GetGameInfo(xmlGame.Assets["RightRom"], "right.gb"); + nextEmulator = new GambatteLink( + nextComm, + left, + xmlGame.Assets["LeftRom"], + right, + xmlGame.Assets["RightRom"], GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = gbl; // other stuff todo break; - default: return false; } @@ -336,7 +326,7 @@ namespace BizHawk.Client.Common rom = new RomGame(file); game = rom.GameInfo; - bool isXml = false; + var isXml = false; // other xml has already been handled if (file.Extension.ToLower() == ".xml") @@ -350,14 +340,14 @@ namespace BizHawk.Client.Common case "SNES": { // need to get rid of this hack at some point - ((CoreFileProvider)nextComm.CoreFileProvider).SubfileDirectory = Path.GetDirectoryName(path.Replace("|", string.Empty)); //Dirty hack to get around archive filenames (since we are just getting the directory path, it is safe to mangle the filename - + ((CoreFileProvider)nextComm.CoreFileProvider).SubfileDirectory = Path.GetDirectoryName(path.Replace("|", String.Empty)); // Dirty hack to get around archive filenames (since we are just getting the directory path, it is safe to mangle the filename var snes = new LibsnesCore(nextComm, GetCoreSettings(), GetCoreSyncSettings()); nextEmulator = snes; - byte[] romData = isXml ? null : rom.FileData; - byte[] xmlData = isXml ? rom.FileData : null; + var romData = isXml ? null : rom.FileData; + var xmlData = isXml ? rom.FileData : null; snes.Load(game, romData, Deterministic, xmlData); } + break; case "SMS": case "SG": @@ -365,7 +355,10 @@ namespace BizHawk.Client.Common nextEmulator = new SMS(nextComm, game, rom.RomData, GetCoreSettings(), GetCoreSyncSettings()); break; case "A26": - nextEmulator = new Atari2600(nextComm, game, rom.FileData, + nextEmulator = new Atari2600( + nextComm, + game, + rom.FileData, GetCoreSettings(), GetCoreSyncSettings()); break; @@ -375,16 +368,17 @@ namespace BizHawk.Client.Common nextEmulator = new PCEngine(nextComm, game, rom.RomData, GetCoreSettings()); break; case "GEN": - { - // nextEmulator = new Genesis(nextComm, game, rom.RomData); - nextEmulator = new GPGX(nextComm, rom.RomData, null, "GEN", GetCoreSyncSettings()); - break; - } + // nextEmulator = new Genesis(nextComm, game, rom.RomData); + nextEmulator = new GPGX(nextComm, rom.RomData, null, "GEN", GetCoreSyncSettings()); + break; case "TI83": nextEmulator = new TI83(nextComm, game, rom.RomData); break; case "NES": - nextEmulator = new NES(nextComm, game, rom.FileData, + nextEmulator = new NES( + nextComm, + game, + rom.FileData, GetCoreSettings(), Global.MovieSession.Movie.Header.BoardProperties); break; @@ -392,10 +386,12 @@ namespace BizHawk.Client.Common case "GBC": if (!Global.Config.GB_AsSGB) { - var gb = new Gameboy(nextComm, game, rom.FileData, + nextEmulator = new Gameboy( + nextComm, + game, + rom.FileData, GetCoreSettings(), GetCoreSyncSettings()); - nextEmulator = gb; } else { @@ -410,33 +406,26 @@ namespace BizHawk.Client.Common catch { // failed to load SGB bios. to avoid catch-22, disable SGB mode - ThrowLoadError("Failed to load a GB rom in SGB mode. Disabling SGB Mode." - , game.System); + ThrowLoadError("Failed to load a GB rom in SGB mode. Disabling SGB Mode.", game.System); Global.Config.GB_AsSGB = false; throw; } } + break; case "Coleco": - { - var c = new ColecoVision(nextComm, game, rom.RomData, GetCoreSyncSettings()); - nextEmulator = c; - } + nextEmulator = new ColecoVision(nextComm, game, rom.RomData, GetCoreSyncSettings()); break; case "INTV": - { - var intv = new Intellivision(nextComm, game, rom.RomData); - nextEmulator = intv; - } + nextEmulator = new Intellivision(nextComm, game, rom.RomData); break; case "A78": var gamedbpath = Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "EMU7800.csv"); - var a78 = new Atari7800(nextComm, game, rom.RomData, gamedbpath); - nextEmulator = a78; + nextEmulator = new Atari7800(nextComm, game, rom.RomData, gamedbpath); break; case "C64": - C64 c64 = new C64(nextComm, game, rom.RomData, rom.Extension); - c64.HardReset(); + var c64 = new C64(nextComm, game, rom.RomData, rom.Extension); + c64.HardReset(); // TODO: The core should be responsible for this! nextEmulator = c64; break; case "GBA": @@ -446,17 +435,18 @@ namespace BizHawk.Client.Common gba.Load(rom.RomData); nextEmulator = gba; } + break; case "N64": Global.Game = game; nextEmulator = new N64(nextComm, game, rom.RomData, GetCoreSyncSettings()); break; - case "DEBUG": if (VersionInfo.INTERIM) { nextEmulator = LibRetroEmulator.CreateDebug(nextComm, rom.RomData); } + break; } } @@ -472,6 +462,7 @@ namespace BizHawk.Client.Common ThrowLoadError("Exception during loadgame:\n\n" + ex, "NULL"); return false; } + Rom = rom; LoadedEmulator = nextEmulator; NextComm = nextComm;