a round of code cleanup on RomLoader
This commit is contained in:
parent
dae86e770c
commit
134783ff36
|
@ -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<T>()
|
||||
private object GetCoreSettings<T>()
|
||||
where T : IEmulator
|
||||
{
|
||||
var e = new SettingsLoadArgs(typeof(T));
|
||||
if (OnLoadSettings != null)
|
||||
{
|
||||
OnLoadSettings(this, e);
|
||||
}
|
||||
|
||||
return e.Settings;
|
||||
}
|
||||
|
||||
object GetCoreSyncSettings<T>()
|
||||
private object GetCoreSyncSettings<T>()
|
||||
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<HawkFile, int?> ChooseArchive;
|
||||
public Func<HawkFile, int?> ChooseArchive { get; set; }
|
||||
|
||||
public Action<string> CoreCommMessageCallback; // TODO: eww, do we have to do this?
|
||||
public Action<string> 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<GPGX>());
|
||||
nextEmulator = genesis;
|
||||
}
|
||||
nextEmulator = genesis;
|
||||
break;
|
||||
case "SAT":
|
||||
{
|
||||
var saturn = new Yabause(nextComm, disc, GetCoreSyncSettings<Yabause>());
|
||||
nextEmulator = saturn;
|
||||
}
|
||||
nextEmulator = new Yabause(nextComm, disc, GetCoreSyncSettings<Yabause>());
|
||||
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<PCEngine>());
|
||||
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<PCEngine>());
|
||||
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<GambatteLink>(),
|
||||
GetCoreSyncSettings<GambatteLink>());
|
||||
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<LibsnesCore>(), GetCoreSyncSettings<LibsnesCore>());
|
||||
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<SMS>(), GetCoreSyncSettings<SMS>());
|
||||
break;
|
||||
case "A26":
|
||||
nextEmulator = new Atari2600(nextComm, game, rom.FileData,
|
||||
nextEmulator = new Atari2600(
|
||||
nextComm,
|
||||
game,
|
||||
rom.FileData,
|
||||
GetCoreSettings<Atari2600>(),
|
||||
GetCoreSyncSettings<Atari2600>());
|
||||
break;
|
||||
|
@ -375,16 +368,17 @@ namespace BizHawk.Client.Common
|
|||
nextEmulator = new PCEngine(nextComm, game, rom.RomData, GetCoreSettings<PCEngine>());
|
||||
break;
|
||||
case "GEN":
|
||||
{
|
||||
// nextEmulator = new Genesis(nextComm, game, rom.RomData);
|
||||
nextEmulator = new GPGX(nextComm, rom.RomData, null, "GEN", GetCoreSyncSettings<GPGX>());
|
||||
break;
|
||||
}
|
||||
// nextEmulator = new Genesis(nextComm, game, rom.RomData);
|
||||
nextEmulator = new GPGX(nextComm, rom.RomData, null, "GEN", GetCoreSyncSettings<GPGX>());
|
||||
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<NES>(),
|
||||
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<Gameboy>(),
|
||||
GetCoreSyncSettings<Gameboy>());
|
||||
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<ColecoVision>());
|
||||
nextEmulator = c;
|
||||
}
|
||||
nextEmulator = new ColecoVision(nextComm, game, rom.RomData, GetCoreSyncSettings<ColecoVision>());
|
||||
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<N64>());
|
||||
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;
|
||||
|
|
Loading…
Reference in New Issue