BizHawk/ExternalToolProjects/DATParser/DATParserBase.cs

230 lines
4.5 KiB
C#

#nullable disable
using System;
using System.Collections.Generic;
using System.Text;
namespace BizHawk.DATTool
{
public abstract class DATParser
{
/// <summary>
/// Required to generate a GameDB file
/// </summary>
public abstract SystemType SysType { get; set; }
/// <summary>
/// Parses multiple DAT files and returns a single GamesDB format csv string
/// </summary>
public abstract string ParseDAT(string[] filePath);
protected List<string> IncomingData = new List<string>();
protected List<GameDB> Data = new List<GameDB>();
protected StringBuilder sb = new StringBuilder();
protected void AddCommentBlock(string comment)
{
sb.AppendLine(";;;;;;;;;;--------------------------------------------------;;;;;;;;;;");
sb.AppendLine(";;; " + comment.Replace("\r\n", "\r\n;;; "));
sb.AppendLine(";;;;;;;;;;--------------------------------------------------;;;;;;;;;;");
}
protected void AddCommentBlock(string[] comment)
{
sb.AppendLine(";;;;;;;;;;--------------------------------------------------;;;;;;;;;;");
for (int i = 0; i < comment.Length; i++)
{
sb.AppendLine(";;; " + comment[i]);
}
sb.AppendLine(";;;;;;;;;;--------------------------------------------------;;;;;;;;;;");
}
protected void AppendCSVData(List<GameDB> data)
{
if (data == null || data.Count == 0)
{
sb.AppendLine(";");
return;
}
foreach (var d in data)
{
// hash
sb.Append(d.HASH);
sb.Append("\t");
// status
sb.Append(d.Status);
sb.Append("\t");
// name
sb.Append(d.Name);
sb.Append("\t");
// system
sb.Append(d.System);
// additional optional fields
bool[] populated = new bool[4];
if (d.Notes != null)
populated[0] = true;
if (d.MetaData != null)
populated[1] = true;
if (d.Region != null)
populated[2] = true;
if (d.ForcedCore != null)
populated[3] = true;
int last = 0;
for (int i = 3; i >= 0; i--)
{
if (populated[i])
{
last = i;
break;
}
}
int cnt = 0;
// notes
if (d.Notes != null)
{
sb.Append("\t");
sb.Append(d.Notes);
}
else if (cnt++ <= last)
{
sb.Append("\t");
}
// metadata
if (d.MetaData != null)
{
sb.Append("\t");
sb.Append(d.MetaData);
}
else if (cnt++ <= last)
{
sb.Append("\t");
}
// region
if (d.Region != null)
{
sb.Append("\t");
sb.Append(d.Region);
}
else if (cnt++ <= last)
{
sb.Append("\t");
}
// force core
if (d.ForcedCore != null)
{
sb.Append("\t");
sb.Append(d.ForcedCore);
}
sb.Append("\r\n");
}
}
}
/// <summary>
/// DAT data is parsed into this object
/// (every field is not always used)
/// </summary>
public class GameDB
{
// COL0: Hash
public string SHA1 { get; set; }
public string MD5 { get; set; }
public string CRC32 { get; set; }
// COL1: Status code indicator
public string Status { get; set; }
// COL2: Game title
public string Name { get; set; }
// COL3: System code (must match what bizhawk uses in Emulation.Common/Database/Database.cs
public string System { get; set; }
// COL4: Unknown - not currently parsed in database.cs, but some gamedb files use this for publisher/genre/etc
public string Notes { get; set; }
// COL5: Metadata
public string MetaData { get; set; }
// COL6: Region
public string Region { get; set; }
// COL7: Forced Fore
public string ForcedCore { get; set; }
// prefer the strongest hash available
public string HASH
{
get
{
if (!string.IsNullOrWhiteSpace(SHA1))
return "SHA1:" + SHA1;
else if (!string.IsNullOrWhiteSpace(MD5))
return "MD5:" + MD5;
else if (!string.IsNullOrWhiteSpace(CRC32))
return "CRC32:" + CRC32;
throw new InvalidOperationException("No valid hash available?");
}
}
/// <summary>
/// Used to get the correct system code (that each gamedb csv needs)
/// </summary>
public static string GetSystemCode(SystemType type)
{
switch (type)
{
case SystemType.P83:
return "83P";
case SystemType.X32:
return "32X";
default:
return type.ToString();
}
}
}
public enum SystemType
{
SAT,
PSP,
PSX,
GEN,
PCFX,
PCECD,
GB,
GBL,
AppleII,
C64,
ZXSpectrum,
AmstradCPC,
SNES,
NES,
P83,
GBC,
A78,
GBA,
X32,
GG,
SG,
SGX,
A26,
Coleco,
INTV,
N64,
WSWAN,
Lynx,
VB,
UZE,
NGP,
ChannelF,
VEC,
O2,
MSX,
NDS,
Jaguar,
}
}