More romloader stuff

It'll all come together eventually
This commit is contained in:
nattthebear 2020-07-12 07:08:52 -04:00
parent 9ee4821148
commit 9d9dd8a0fd
1 changed files with 77 additions and 51 deletions

View File

@ -89,6 +89,37 @@ namespace BizHawk.Client.Common
return e.Settings; return e.Settings;
} }
private class CoreLoadParametersShort
{
public CoreComm Comm { get; set; }
public GameInfo Game { get; set; }
public List<IRomGame> Roms { get; set; } = new List<IRomGame>();
public List<IDiscGame> Discs { get; set; } = new List<IDiscGame>();
}
private T MakeCore<T>(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 // For not throwing errors but simply outputting information to the screen
public Action<string> MessageCallback { get; set; } public Action<string> MessageCallback { get; set; }
@ -229,26 +260,6 @@ namespace BizHawk.Client.Common
return true; return true;
} }
private List<IDiscGame> 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) 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 //--- 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<TSetting, TSync> MakeCLP<TEmulator, TSetting, TSync>(GameInfo g) TEmulator MakeCoreFromCds<TEmulator>(GameInfo g)
where TEmulator : IEmulator where TEmulator : IEmulator
{ {
return new CoreLoadParameters<TSetting, TSync> var clps = new CoreLoadParametersShort
{ {
Comm = nextComm, Comm = nextComm,
Game = g, Game = g,
Settings = GetCoreSettings<TEmulator, TSetting>(),
SyncSettings = GetCoreSyncSettings<TEmulator, TSync>(),
Discs = Discs =
{ {
new DiscGame new DiscGame
@ -344,23 +353,23 @@ namespace BizHawk.Client.Common
DiscName = Path.GetFileNameWithoutExtension(path) DiscName = Path.GetFileNameWithoutExtension(path)
} }
}, },
DeterministicEmulationRequested = Deterministic
}; };
return MakeCore<TEmulator>(clps);
} }
switch (game.System) switch (game.System)
{ {
case "GEN": case "GEN":
nextEmulator = new GPGX(MakeCLP<GPGX, GPGX.GPGXSettings, GPGX.GPGXSyncSettings>(game)); nextEmulator = MakeCoreFromCds<GPGX>(game);
break; break;
case "SAT": case "SAT":
nextEmulator = new Saturnus(MakeCLP<Saturnus, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game)); nextEmulator = MakeCoreFromCds<Saturnus>(game);
break; break;
case "PSX": case "PSX":
nextEmulator = new Octoshock(MakeCLP<Octoshock, Octoshock.Settings, Octoshock.SyncSettings>(game)); nextEmulator = MakeCoreFromCds<Octoshock>(game);
break; break;
case "PCFX": case "PCFX":
nextEmulator = new Tst(MakeCLP<Tst, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game)); nextEmulator = MakeCoreFromCds<Tst>(game);
break; break;
case "PCE": // TODO: this is clearly not used, its set to PCE by code above case "PCE": // TODO: this is clearly not used, its set to PCE by code above
case "PCECD": case "PCECD":
@ -374,8 +383,8 @@ namespace BizHawk.Client.Common
GetCoreSettings<PCEngine, PCEngine.PCESettings>(), GetCoreSettings<PCEngine, PCEngine.PCESettings>(),
GetCoreSyncSettings<PCEngine, PCEngine.PCESyncSettings>() GetCoreSyncSettings<PCEngine, PCEngine.PCESyncSettings>()
), ),
CoreNames.HyperNyma => new HyperNyma(MakeCLP<HyperNyma, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game)), CoreNames.HyperNyma => MakeCoreFromCds<HyperNyma>(game),
_ => new TurboNyma(MakeCLP<TurboNyma, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game)), _ => MakeCoreFromCds<TurboNyma>(game),
}; };
break; break;
default: 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???????? var xmlGame = XmlGame.Create(file); // if load fails, are we supposed to retry as a bsnes XML????????
game = xmlGame.GI; game = xmlGame.GI;
CoreLoadParameters<TSetting, TSync> MakeCLP<TEmulator, TSetting, TSync>(GameInfo g, DiscType type, string systemId) List<IDiscGame> 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<TEmulator>(GameInfo g, DiscType type, string systemId)
where TEmulator : IEmulator where TEmulator : IEmulator
{ {
return new CoreLoadParameters<TSetting, TSync> var clps = new CoreLoadParametersShort
{ {
Comm = nextComm, Comm = nextComm,
Game = g, Game = g,
Settings = GetCoreSettings<TEmulator, TSetting>(), Roms = xmlGame.Assets
SyncSettings = GetCoreSyncSettings<TEmulator, TSync>(), .Where(kvp => !Disc.IsValidExtension(kvp.Key))
Discs = DiscsFromXml(xmlGame, systemId, type), .Select(kvp => (IRomGame)new RomGameFake
DeterministicEmulationRequested = Deterministic, {
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<TEmulator>(clps);
} }
switch (game.System) switch (game.System)
@ -746,27 +782,17 @@ namespace BizHawk.Client.Common
); );
return true; return true;
case "PSX": case "PSX":
nextEmulator = new Octoshock(MakeCLP<Octoshock, Octoshock.Settings, Octoshock.SyncSettings>(game, DiscType.SonyPSX, "PSX")); nextEmulator = MakeCoreFromXml<Octoshock>(game, DiscType.SonyPSX, "PSX");
return true; return true;
case "SAT": case "SAT":
nextEmulator = new Saturnus(MakeCLP<Saturnus, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game, DiscType.SegaSaturn, "SAT")); nextEmulator = MakeCoreFromXml<Saturnus>(game, DiscType.SegaSaturn, "SAT");
return true; return true;
case "PCFX": case "PCFX":
nextEmulator = new Tst(MakeCLP<Tst, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game, DiscType.PCFX, "PCFX")); nextEmulator = MakeCoreFromXml<Tst>(game, DiscType.PCFX, "PCFX");
return true; return true;
case "GEN": case "GEN":
{ nextEmulator = MakeCoreFromXml<GPGX>(game, DiscType.MegaCD, "GEN");
var genRoms = xmlGame.Assets.Where(kvp => !Disc.IsValidExtension(kvp.Key)).ToList();
var clp = MakeCLP<GPGX, GPGX.GPGXSettings, GPGX.GPGXSyncSettings>(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);
return true; return true;
}
case "Game Gear": case "Game Gear":
var leftBytesGG = xmlGame.Assets[0].Value; var leftBytesGG = xmlGame.Assets[0].Value;
var rightBytesGG = xmlGame.Assets[1].Value; var rightBytesGG = xmlGame.Assets[1].Value;