Romloader omega refactor: Use CoreLoadParameters for PSX

This commit is contained in:
nattthebear 2020-07-11 18:47:46 -04:00
parent 6657917281
commit 86ac6eadcc
3 changed files with 75 additions and 116 deletions

View File

@ -43,6 +43,7 @@ namespace BizHawk.Client.Common
{
public Disc DiscData { get; set; }
public DiscType DiscType { get; set; }
public string DiscName { get; set; }
}
private class RomGameFake : IRomGame
{
@ -231,11 +232,25 @@ namespace BizHawk.Client.Common
return true;
}
private List<Disc> DiscsFromXml(XmlGame xmlGame, string systemId, DiscType diskType)
=> xmlGame.AssetFullPaths.Where(path => Disc.IsValidExtension(Path.GetExtension(path)))
.Select(path => diskType.Create(path, str => DoLoadErrorCallback(str, systemId, LoadErrorType.DiscError)))
.Where(disc => disc != null)
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)
{
@ -328,7 +343,8 @@ namespace BizHawk.Client.Common
new DiscGame
{
DiscData = disc,
DiscType = new DiscIdentifier(disc).DetectDiscType()
DiscType = new DiscIdentifier(disc).DetectDiscType(),
DiscName = Path.GetFileNameWithoutExtension(path)
}
},
DeterministicEmulationRequested = Deterministic
@ -344,15 +360,7 @@ namespace BizHawk.Client.Common
nextEmulator = new Saturnus(MakeCLP<Saturnus, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game));
break;
case "PSX":
nextEmulator = new Octoshock(
nextComm,
new List<Disc> { disc },
new List<string> { Path.GetFileNameWithoutExtension(path) },
null,
GetCoreSettings<Octoshock, Octoshock.Settings>(),
GetCoreSyncSettings<Octoshock, Octoshock.SyncSettings>(),
DiscHashWarningText(game, discHash)
);
nextEmulator = new Octoshock(MakeCLP<Octoshock, Octoshock.Settings, Octoshock.SyncSettings>(game));
break;
case "PCFX":
nextEmulator = new Tst(MakeCLP<Tst, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game));
@ -382,41 +390,7 @@ namespace BizHawk.Client.Common
private void LoadM3U(string path, CoreComm nextComm, HawkFile file, out IEmulator nextEmulator, out GameInfo game)
{
// HACK ZONE - currently only psx supports m3u
using var sr = new StreamReader(path);
var m3u = M3U_File.Read(sr);
if (m3u.Entries.Count == 0) throw new InvalidOperationException("Can't load an empty M3U");
// load discs for all the m3u
m3u.Rebase(Path.GetDirectoryName(path));
var discs = new List<Disc>();
var discNames = new List<string>();
var swRomDetails = new StringWriter();
foreach (var e in m3u.Entries)
{
var disc = DiscType.SonyPSX.Create(e.Path, str => DoLoadErrorCallback(str, "PSX", LoadErrorType.DiscError));
discs.Add(disc);
discNames.Add(Path.GetFileNameWithoutExtension(e.Path));
var discHash = new DiscHasher(disc).Calculate_PSX_BizIDHash().ToString("X8");
swRomDetails.WriteLine(Path.GetFileName(e.Path));
swRomDetails.WriteLine(DiscHashWarningText(Database.CheckDatabase(discHash), discHash));
swRomDetails.WriteLine("-------------------------");
}
game = new GameInfo
{
Name = Path.GetFileNameWithoutExtension(file.Name),
System = "PSX"
};
nextEmulator = new Octoshock(
nextComm,
discs,
discNames,
null,
GetCoreSettings<Octoshock, Octoshock.Settings>(),
GetCoreSyncSettings<Octoshock, Octoshock.SyncSettings>(),
swRomDetails.ToString()
);
throw new NotImplementedException("M3U not supported!");
}
private void LoadOther(string path, CoreComm nextComm, bool forceAccurateCore, HawkFile file, out IEmulator nextEmulator, out RomGame rom, out GameInfo game, out bool cancel)
@ -596,17 +570,6 @@ namespace BizHawk.Client.Common
GetCoreSyncSettings<AmstradCPC, AmstradCPC.AmstradCPCSyncSettings>()
);
return;
case "PSX":
nextEmulator = new Octoshock(
nextComm,
null,
null,
rom.FileData,
GetCoreSettings<Octoshock, Octoshock.Settings>(),
GetCoreSyncSettings<Octoshock, Octoshock.SyncSettings>(),
"PSX etc."
);
return;
case "Arcade":
nextEmulator = new MAME(
file.Directory,
@ -673,7 +636,7 @@ 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<TSetting, TSync> MakeCLP<TEmulator, TSetting, TSync>(GameInfo g, IEnumerable<Disc> disques)
CoreLoadParameters<TSetting, TSync> MakeCLP<TEmulator, TSetting, TSync>(GameInfo g, DiscType type, string systemId)
where TEmulator : IEmulator
{
return new CoreLoadParameters<TSetting, TSync>
@ -682,15 +645,8 @@ namespace BizHawk.Client.Common
Game = g,
Settings = GetCoreSettings<TEmulator, TSetting>(),
SyncSettings = GetCoreSyncSettings<TEmulator, TSync>(),
Discs = disques
.Select(d =>
(IDiscGame)new DiscGame
{
DiscData = d,
DiscType = new DiscIdentifier(d).DetectDiscType()
})
.ToList(),
DeterministicEmulationRequested = Deterministic
Discs = DiscsFromXml(xmlGame, systemId, type),
DeterministicEmulationRequested = Deterministic,
};
}
@ -810,52 +766,18 @@ namespace BizHawk.Client.Common
);
return true;
case "PSX":
var entries = xmlGame.AssetFullPaths;
var discs = new List<Disc>();
var discNames = new List<string>();
var swRomDetails = new StringWriter();
foreach (var e in entries)
{
var disc = DiscType.SonyPSX.Create(e, str => DoLoadErrorCallback(str, "PSX", LoadErrorType.DiscError));
discs.Add(disc);
discNames.Add(Path.GetFileNameWithoutExtension(e));
var discHash = new DiscHasher(disc).Calculate_PSX_BizIDHash().ToString("X8");
swRomDetails.WriteLine(Path.GetFileName(e));
swRomDetails.WriteLine(DiscHashWarningText(Database.CheckDatabase(discHash), discHash));
swRomDetails.WriteLine("-------------------------");
}
// todo: copy pasta from PSX .cue section
game = new GameInfo
{
Name = Path.GetFileNameWithoutExtension(file.Name),
System = "PSX"
};
nextEmulator = new Octoshock(
nextComm,
discs,
discNames,
null,
GetCoreSettings<Octoshock, Octoshock.Settings>(),
GetCoreSyncSettings<Octoshock, Octoshock.SyncSettings>(),
swRomDetails.ToString()
);
nextEmulator = new Octoshock(MakeCLP<Octoshock, Octoshock.Settings, Octoshock.SyncSettings>(game, DiscType.SonyPSX, "PSX"));
return true;
case "SAT":
var saturnDiscs = DiscsFromXml(xmlGame, "SAT", DiscType.SegaSaturn);
if (saturnDiscs.Count == 0) return false;
nextEmulator = new Saturnus(MakeCLP<Saturnus, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game, saturnDiscs));
nextEmulator = new Saturnus(MakeCLP<Saturnus, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game, DiscType.SegaSaturn, "SAT"));
return true;
case "PCFX":
var pcfxDiscs = DiscsFromXml(xmlGame, "PCFX", DiscType.PCFX);
if (pcfxDiscs.Count == 0) return false;
nextEmulator = new Tst(MakeCLP<Tst, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game, pcfxDiscs));
nextEmulator = new Tst(MakeCLP<Tst, NymaCore.NymaSettings, NymaCore.NymaSyncSettings>(game, DiscType.PCFX, "PCFX"));
return true;
case "GEN":
{
var genDiscs = DiscsFromXml(xmlGame, "GEN", DiscType.MegaCD);
var genRoms = xmlGame.Assets.Where(kvp => !Disc.IsValidExtension(kvp.Key)).ToList();
if (genDiscs.Count == 0 && genRoms.Count == 0) return false;
var clp = MakeCLP<GPGX, GPGX.GPGXSettings, GPGX.GPGXSyncSettings>(game, genDiscs);
var clp = MakeCLP<GPGX, GPGX.GPGXSettings, GPGX.GPGXSyncSettings>(game, DiscType.MegaCD, "GEN");
clp.Roms.AddRange(genRoms.Select(kvp => new RomGameFake
{
RomData = kvp.Value,
@ -1131,10 +1053,5 @@ namespace BizHawk.Client.Common
.ToList();
public static readonly string RomFilter = RomFSFilterSet.ToString("Everything");
private static string DiscHashWarningText(GameInfo game, string discHash)
=> game == null || game.IsRomStatusBad() || game.Status == RomStatus.NotInDatabase
? "Disc could not be identified as known-good. Look for a better rip."
: $"Disc was identified (99.99% confidently) as known good with disc id hash CRC32:{discHash}\nNonetheless it could be an unrecognized romhack or patched version.\nAccording to redump.org, the ideal hash for entire disc is: CRC32:{game.GetStringValue("dh")}\nThe file you loaded hasn't been hashed entirely (it would take too long)\nCompare it with the full hash calculated by the PSX menu's Hash Discs tool";
}
}

View File

@ -44,13 +44,54 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
//note: its annoying that we have to have a disc before constructing this.
//might want to change that later. HOWEVER - we need to definitely have a region, at least
public Octoshock(CoreComm comm, List<Disc> discs, List<string> discNames, byte[] exe, Octoshock.Settings settings, Octoshock.SyncSettings syncSettings, string romDetails)
[CoreConstructor("PSX")]
public Octoshock(CoreLoadParameters<Octoshock.Settings, Octoshock.SyncSettings> lp)
{
Load(comm, discs, discNames, exe, settings, syncSettings, null, romDetails);
string romDetails;
if (lp.Discs.Count > 0)
{
string DiscHashWarningText(GameInfo game, string discHash)
{
if (game == null || game.IsRomStatusBad() || game.Status == RomStatus.NotInDatabase)
{
return "Disc could not be identified as known-good. Look for a better rip.";
}
else
{
return $"Disc was identified (99.99% confidently) as known good with disc id hash CRC32:{discHash}\n"
+ "Nonetheless it could be an unrecognized romhack or patched version.\n"
+ $"According to redump.org, the ideal hash for entire disc is: CRC32:{game.GetStringValue("dh")}\n"
+ "The file you loaded hasn't been hashed entirely (it would take too long)\n"
+ "Compare it with the full hash calculated by the PSX menu's Hash Discs tool";
}
}
var sw = new StringWriter();
foreach (var d in lp.Discs)
{
var discHash = new DiscHasher(d.DiscData).Calculate_PSX_BizIDHash().ToString("X8");
sw.WriteLine(Path.GetFileName(d.DiscName));
sw.WriteLine(DiscHashWarningText(Database.CheckDatabase(discHash), discHash));
sw.WriteLine("-------------------------");
}
romDetails = sw.ToString();
}
else
{
romDetails = "PSX exe";
}
Load(
lp.Comm,
lp.Discs.Select(d => d.DiscData).ToList(),
lp.Discs.Select(d => d.DiscName).ToList(),
lp.Roms.FirstOrDefault()?.RomData, lp.Settings, lp.SyncSettings, null, romDetails);
OctoshockDll.shock_PowerOn(psx);
}
void Load(CoreComm comm, List<Disc> discs, List<string> discNames, byte[] exe, Octoshock.Settings settings, Octoshock.SyncSettings syncSettings, PSF psf, string romDetails)
void Load(
CoreComm comm, List<Disc> discs, List<string> discNames, byte[] exe,
Octoshock.Settings settings, Octoshock.SyncSettings syncSettings, PSF psf, string romDetails)
{
RomDetails = romDetails;
ConnectTracer();

View File

@ -15,6 +15,7 @@ namespace BizHawk.Emulation.Cores
{
Disc DiscData { get; }
DiscType DiscType { get; }
public string DiscName { get; set; }
}
public class CoreLoadParameters<TSettiing, TSync>
{