From 9d9dd8a0fdddc13bd4b42471f3c1de1148331878 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sun, 12 Jul 2020 07:08:52 -0400 Subject: [PATCH] More romloader stuff It'll all come together eventually --- src/BizHawk.Client.Common/RomLoader.cs | 128 +++++++++++++++---------- 1 file changed, 77 insertions(+), 51 deletions(-) diff --git a/src/BizHawk.Client.Common/RomLoader.cs b/src/BizHawk.Client.Common/RomLoader.cs index f97d1c1ac5..bbad086361 100644 --- a/src/BizHawk.Client.Common/RomLoader.cs +++ b/src/BizHawk.Client.Common/RomLoader.cs @@ -89,6 +89,37 @@ namespace BizHawk.Client.Common return e.Settings; } + private class CoreLoadParametersShort + { + public CoreComm Comm { get; set; } + public GameInfo Game { get; set; } + public List Roms { get; set; } = new List(); + public List Discs { get; set; } = new List(); + } + + private T MakeCore(CoreLoadParametersShort clps) + where T : IEmulator + { + // TODO: Lots of stuff + var ctor = typeof(T) + .GetConstructors() + .Select(c => new { c, p = c.GetParameters() }) + .Where(a => a.p.Length == 1) + .Select(a => new { a.c, p = a.p[0] }) + .Where(a => a.p.ParameterType.IsGenericType && a.p.ParameterType.GetGenericTypeDefinition() == typeof(CoreLoadParameters<,>)) + .Single(); + + var clp = (dynamic)Activator.CreateInstance(ctor.p.ParameterType); + clp.Comm = clps.Comm; + clp.Game = clps.Game; + clp.Roms = clps.Roms; + clp.Discs = clps.Discs; + clp.DeterministicEmulationRequested = Deterministic; + clp.Settings = (dynamic)GetCoreSettings(typeof(T), ctor.p.ParameterType.GetGenericArguments()[0]); + clp.SyncSettings = (dynamic)GetCoreSyncSettings(typeof(T), ctor.p.ParameterType.GetGenericArguments()[1]); + return (T)ctor.c.Invoke(new[] { clp }); + } + // For not throwing errors but simply outputting information to the screen public Action MessageCallback { get; set; } @@ -229,26 +260,6 @@ namespace BizHawk.Client.Common return true; } - private List DiscsFromXml(XmlGame xmlGame, string systemId, DiscType diskType) - { - return xmlGame - .AssetFullPaths - .Where(path => Disc.IsValidExtension(Path.GetExtension(path))) - .Select(path => new - { - d = diskType.Create(path, str => DoLoadErrorCallback(str, systemId, LoadErrorType.DiscError)), - p = path, - }) - .Where(a => a.d != null) - .Select(a => (IDiscGame)new DiscGame - { - DiscData = a.d, - DiscType = diskType, - DiscName = Path.GetFileNameWithoutExtension(a.p) - }) - .ToList(); - } - private bool LoadDisc(string path, CoreComm nextComm, HawkFile file, string ext, out IEmulator nextEmulator, out GameInfo game) { //--- load the disc in a context which will let us abort if it's going to take too long @@ -326,15 +337,13 @@ namespace BizHawk.Client.Common } } - CoreLoadParameters MakeCLP(GameInfo g) + TEmulator MakeCoreFromCds(GameInfo g) where TEmulator : IEmulator { - return new CoreLoadParameters + var clps = new CoreLoadParametersShort { Comm = nextComm, Game = g, - Settings = GetCoreSettings(), - SyncSettings = GetCoreSyncSettings(), Discs = { new DiscGame @@ -344,23 +353,23 @@ namespace BizHawk.Client.Common DiscName = Path.GetFileNameWithoutExtension(path) } }, - DeterministicEmulationRequested = Deterministic }; + return MakeCore(clps); } switch (game.System) { case "GEN": - nextEmulator = new GPGX(MakeCLP(game)); + nextEmulator = MakeCoreFromCds(game); break; case "SAT": - nextEmulator = new Saturnus(MakeCLP(game)); + nextEmulator = MakeCoreFromCds(game); break; case "PSX": - nextEmulator = new Octoshock(MakeCLP(game)); + nextEmulator = MakeCoreFromCds(game); break; case "PCFX": - nextEmulator = new Tst(MakeCLP(game)); + nextEmulator = MakeCoreFromCds(game); break; case "PCE": // TODO: this is clearly not used, its set to PCE by code above case "PCECD": @@ -374,8 +383,8 @@ namespace BizHawk.Client.Common GetCoreSettings(), GetCoreSyncSettings() ), - CoreNames.HyperNyma => new HyperNyma(MakeCLP(game)), - _ => new TurboNyma(MakeCLP(game)), + CoreNames.HyperNyma => MakeCoreFromCds(game), + _ => MakeCoreFromCds(game), }; break; default: @@ -616,18 +625,45 @@ namespace BizHawk.Client.Common var xmlGame = XmlGame.Create(file); // if load fails, are we supposed to retry as a bsnes XML???????? game = xmlGame.GI; - CoreLoadParameters MakeCLP(GameInfo g, DiscType type, string systemId) + List DiscsFromXml(string systemId, DiscType diskType) + { + return xmlGame + .AssetFullPaths + .Where(path => Disc.IsValidExtension(Path.GetExtension(path))) + .Select(path => new + { + d = diskType.Create(path, str => DoLoadErrorCallback(str, systemId, LoadErrorType.DiscError)), + p = path, + }) + .Where(a => a.d != null) + .Select(a => (IDiscGame)new DiscGame + { + DiscData = a.d, + DiscType = diskType, + DiscName = Path.GetFileNameWithoutExtension(a.p) + }) + .ToList(); + } + + TEmulator MakeCoreFromXml(GameInfo g, DiscType type, string systemId) where TEmulator : IEmulator { - return new CoreLoadParameters + var clps = new CoreLoadParametersShort { Comm = nextComm, Game = g, - Settings = GetCoreSettings(), - SyncSettings = GetCoreSyncSettings(), - Discs = DiscsFromXml(xmlGame, systemId, type), - DeterministicEmulationRequested = Deterministic, + Roms = xmlGame.Assets + .Where(kvp => !Disc.IsValidExtension(kvp.Key)) + .Select(kvp => (IRomGame)new RomGameFake + { + RomData = kvp.Value, + FileData = kvp.Value, // TODO: Hope no one needed anything special here + Extension = Path.GetExtension(kvp.Key) + }) + .ToList(), + Discs = DiscsFromXml(systemId, type), }; + return MakeCore(clps); } switch (game.System) @@ -746,27 +782,17 @@ namespace BizHawk.Client.Common ); return true; case "PSX": - nextEmulator = new Octoshock(MakeCLP(game, DiscType.SonyPSX, "PSX")); + nextEmulator = MakeCoreFromXml(game, DiscType.SonyPSX, "PSX"); return true; case "SAT": - nextEmulator = new Saturnus(MakeCLP(game, DiscType.SegaSaturn, "SAT")); + nextEmulator = MakeCoreFromXml(game, DiscType.SegaSaturn, "SAT"); return true; case "PCFX": - nextEmulator = new Tst(MakeCLP(game, DiscType.PCFX, "PCFX")); + nextEmulator = MakeCoreFromXml(game, DiscType.PCFX, "PCFX"); return true; case "GEN": - { - var genRoms = xmlGame.Assets.Where(kvp => !Disc.IsValidExtension(kvp.Key)).ToList(); - var clp = MakeCLP(game, DiscType.MegaCD, "GEN"); - clp.Roms.AddRange(genRoms.Select(kvp => new RomGameFake - { - RomData = kvp.Value, - FileData = kvp.Value, // TODO: Hope no one needed anything special here - Extension = Path.GetExtension(kvp.Key) - })); - nextEmulator = new GPGX(clp); + nextEmulator = MakeCoreFromXml(game, DiscType.MegaCD, "GEN"); return true; - } case "Game Gear": var leftBytesGG = xmlGame.Assets[0].Value; var rightBytesGG = xmlGame.Assets[1].Value;