StoicGoose.Unity/Assets/Script/AppMain/Emulator/StoicGooseEmulator/Handle/DatabaseHandler.cs

216 lines
6.7 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
using StoicGoose.Common.Utilities;
public sealed class DatabaseHandler
{
readonly Dictionary<string, DatFile> datFiles = new();
const string ResourceRoot = "StoicGooseUnity/emu/";
public DatabaseHandler()
{
{
string wsc = "Bandai - WonderSwan Color.dat";
GetDatBytes(wsc, out byte[] loadedData);
using (MemoryStream stream = new MemoryStream(loadedData))
{
var root = new XmlRootAttribute("datafile") { IsNullable = true };
var serializer = new XmlSerializer(typeof(DatFile), root);
var reader = XmlReader.Create(stream, new() { DtdProcessing = DtdProcessing.Ignore });
datFiles.Add(Path.GetFileName(wsc), (DatFile)serializer.Deserialize(reader));
}
}
{
string ws = "Bandai - WonderSwan.dat";
GetDatBytes(ws, out byte[] loadedData);
using (MemoryStream stream = new MemoryStream(loadedData))
{
var root = new XmlRootAttribute("datafile") { IsNullable = true };
var serializer = new XmlSerializer(typeof(DatFile), root);
var reader = XmlReader.Create(stream, new() { DtdProcessing = DtdProcessing.Ignore });
datFiles.Add(Path.GetFileName(ws), (DatFile)serializer.Deserialize(reader));
}
}
Log.WriteEvent(LogSeverity.Information, this, $"Loaded {datFiles.Count} .dat file(s) with {datFiles.Sum(x => x.Value.Game.Length)} known game(s).");
foreach (var datFile in datFiles.Select(x => x.Value))
Log.WriteLine($" '{datFile.Header.Name} ({datFile.Header.Version})' from {datFile.Header.Homepage}");
}
bool GetDatBytes(string DatName, out byte[] loadedData)
{
try
{
loadedData = UnityEngine.Resources.Load<UnityEngine.TextAsset>(ResourceRoot + "Dat/" + DatName).bytes;
return true;
}
catch
{
loadedData = null;
return false;
}
}
private DatGame GetGame(uint romCrc32, int romSize)
{
return datFiles.Select(x => x.Value.Game).Select(x => x.FirstOrDefault(x => x.Rom.Any(y => y.Crc.ToLowerInvariant() == $"{romCrc32:x8}" && y.Size.ToLowerInvariant() == $"{romSize:D}"))).FirstOrDefault(x => x != null);
}
public string GetGameTitle(uint romCrc32, int romSize)
{
return GetGame(romCrc32, romSize)?.Name.Replace("&", "&&") ?? "unrecognized game";
}
public class DatHeader
{
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("description")]
public string Description { get; set; }
[XmlElement("category")]
public string Category { get; set; }
[XmlElement("version")]
public string Version { get; set; }
[XmlElement("date")]
public string Date { get; set; }
[XmlElement("author")]
public string Author { get; set; }
[XmlElement("email")]
public string Email { get; set; }
[XmlElement("homepage")]
public string Homepage { get; set; }
[XmlElement("url")]
public string Url { get; set; }
[XmlElement("comment")]
public string Comment { get; set; }
}
public class DatRelease
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("region")]
public string Region { get; set; }
[XmlAttribute("language")]
public string Language { get; set; }
[XmlAttribute("date")]
public string Date { get; set; }
[XmlAttribute("default")]
public string Default { get; set; }
}
public class DatBiosSet
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("description")]
public string Description { get; set; }
[XmlAttribute("default")]
public string Default { get; set; }
}
public class DatRom
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("size")]
public string Size { get; set; }
[XmlAttribute("crc")]
public string Crc { get; set; }
[XmlAttribute("sha1")]
public string Sha1 { get; set; }
[XmlAttribute("md5")]
public string Md5 { get; set; }
[XmlAttribute("merge")]
public string Merge { get; set; }
[XmlAttribute("status")]
public string Status { get; set; }
[XmlAttribute("date")]
public string Date { get; set; }
}
public class DatDisk
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("sha1")]
public string Sha1 { get; set; }
[XmlAttribute("md5")]
public string Md5 { get; set; }
[XmlAttribute("merge")]
public string Merge { get; set; }
[XmlAttribute("status")]
public string Status { get; set; }
}
public class DatSample
{
[XmlAttribute("name")]
public string Name { get; set; }
}
public class DatArchive
{
[XmlAttribute("name")]
public string Name { get; set; }
}
public class DatGame
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("sourcefile")]
public string SourceFile { get; set; }
[XmlAttribute("isbios")]
public string IsBios { get; set; }
[XmlAttribute("cloneof")]
public string CloneOf { get; set; }
[XmlAttribute("romof")]
public string RomOf { get; set; }
[XmlAttribute("sampleof")]
public string SampleOf { get; set; }
[XmlAttribute("board")]
public string Board { get; set; }
[XmlAttribute("rebuildto")]
public string RebuildTo { get; set; }
[XmlElement("year")]
public string Year { get; set; }
[XmlElement("manufacturer")]
public string Manufacturer { get; set; }
[XmlElement("release")]
public DatRelease[] Release { get; set; }
[XmlElement("biosset")]
public DatBiosSet[] BiosSet { get; set; }
[XmlElement("rom")]
public DatRom[] Rom { get; set; }
[XmlElement("disk")]
public DatDisk[] Disk { get; set; }
[XmlElement("sample")]
public DatSample[] Sample { get; set; }
[XmlElement("archive")]
public DatArchive[] Archive { get; set; }
}
[Serializable()]
public class DatFile
{
[XmlElement("header")]
public DatHeader Header { get; set; }
[XmlElement("game")]
public DatGame[] Game { get; set; }
}
}