private bool LoadGameFromDat(DatFileLoader dfl, DatDir parentDir) { if (dfl.Next != "(") { _errorReport?.Invoke(dfl.Filename, "( not found after game, on line " + dfl.LineNumber); return(false); } dfl.Gn(); string sNext = dfl.Next.ToLower(); if (sNext != "name") { _errorReport?.Invoke(dfl.Filename, "Name not found as first object in ( ), on line " + dfl.LineNumber); return(false); } string name = dfl.GnRest(); int nameLength = name.Length; if (nameLength > 4 && name.ToLower().Substring(nameLength - 4, 4) == ".zip") { name = name.Substring(0, nameLength - 4); } dfl.Gn(); DatDir dDir = new DatDir(DatFileType.UnSet) { Name = name, DGame = new DatGame() }; while (dfl.Next != ")") { switch (dfl.Next.ToLower()) { case "file": dfl.Gn(); if (!LoadFileFromDat(dfl, dDir)) { return(false); } dfl.Gn(); break; case "rom": dfl.Gn(); if (!LoadFileFromDat(dfl, dDir)) { return(false); } dfl.Gn(); break; default: _errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in game, on line " + dfl.LineNumber); dfl.Gn(); break; } } parentDir.ChildAdd(dDir); return(true); }
public static bool ReadDat(string strFilename, ReportError errorReport, out DatHeader datHeader) { datHeader = new DatHeader { BaseDir = new DatDir(DatFileType.UnSet), Filename = strFilename }; using (DatFileLoader dfl = new DatFileLoader()) { dfl.LoadDat(strFilename); dfl.Gn(); while (!dfl.EndOfStream()) { switch (dfl.Next.ToLower()) { case "[credits]": //getcredits if (!LoadCredits(dfl, datHeader, errorReport)) { return(false); } break; case "[dat]": //getdat if (!LoadDat(dfl, datHeader, errorReport)) { return(false); } break; case "[emulator]": //emulator if (!LoadEmulator(dfl, datHeader, errorReport)) { return(false); } break; case "[games]": //games if (!LoadGame(dfl, datHeader.BaseDir, errorReport)) { return(false); } break; case "[resources]": //resources if (!LoadGame(dfl, datHeader.BaseDir, errorReport)) { return(false); } break; case "[disks]": //games if (!LoadDisks(dfl, datHeader.BaseDir, errorReport)) { return(false); } break; default: errorReport?.Invoke(dfl.Filename, "Unknown Line " + dfl.Next + " , " + dfl.LineNumber); return(false); } } } return(true); }
private static bool LoadHeaderFromDat(DatFileLoader dfl, string filename, DatHeader datHeader, ReportError errorReport) { if (dfl.Next != "(") { errorReport?.Invoke(dfl.Filename, "( not found after DOSCenter, on line " + dfl.LineNumber); return(false); } dfl.Gn(); datHeader.Filename = filename; while (dfl.Next != ")") { string nextstr = dfl.Next.ToLower(); if ((nextstr.Length > 5) && (nextstr.Substring(0, 5) == "name:")) // this is needed as there is no space after 'name:' { datHeader.Name = (dfl.Next.Substring(5) + " " + dfl.GnRest()).Trim(); dfl.Gn(); } else { switch (nextstr) { case "name": case "name:": datHeader.Name = dfl.GnRest(); dfl.Gn(); break; case "description": case "description:": datHeader.Description = dfl.GnRest(); dfl.Gn(); break; case "version": case "version:": datHeader.Version = dfl.GnRest(); dfl.Gn(); break; case "date": case "date:": datHeader.Date = dfl.GnRest(); dfl.Gn(); break; case "author": case "author:": datHeader.Author = dfl.GnRest(); dfl.Gn(); break; case "homepage": case "homepage:": datHeader.Homepage = dfl.GnRest(); dfl.Gn(); break; case "comment": case "comment:": datHeader.Comment = dfl.GnRest(); dfl.Gn(); break; default: errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in DOSReader, on line " + dfl.LineNumber); dfl.Gn(); break; } } } return(true); }
private static bool LoadDisks(DatFileLoader dfl, DatDir parentDir, ReportError errorReport) { if (dfl.Next.ToLower() != "[disks]") { errorReport?.Invoke(dfl.Filename, "Looking for [DISKS] but found " + dfl.Next + " , " + dfl.LineNumber); return(false); } while (!dfl.EndOfStream()) { string line = dfl.Gn(); if (line.Substring(0, 1) == "[") { return(true); } string[] parts = line.Split('¬'); // 1 parent name = clone of // 2 parent description = description (from parent) // 3 game name = name (game) // 4 game description = description // 5 rom name = name (rom) // 6 rom crc = crc // 7 rom size = size // 8 romof name = romof // 9 merge name = merge string ParentName = parts[1]; string ParentDescription = parts[2]; string GameName = parts[3]; string GameDescription = parts[4]; string romName = parts[5]; string romCRC = parts[6]; string romSize = parts[7]; string romOf = parts[8]; string merge = parts[9]; int index; DatDir dDir; DatDir searchDir = new DatDir(DatFileType.Dir) { Name = GameName }; if (parentDir.ChildNameSearch(searchDir, out index) != 0) { dDir = new DatDir(DatFileType.UnSet) { Name = GameName, DGame = new DatGame() }; DatGame dGame = dDir.DGame; dGame.Description = GameDescription; if (ParentName != GameName) { dGame.CloneOf = ParentName; } parentDir.ChildAdd(dDir); } else { dDir = (DatDir)parentDir.Child(index); // need to check everything matches } DatFile dRom = new DatFile(DatFileType.UnSet) { isDisk = true, Name = VarFix.CleanCHD(romName), SHA1 = VarFix.CleanMD5SHA1(romCRC, 40), Merge = merge }; // dRom.Size = VarFix.ULong(romSize); // check romof=ParentName dDir.ChildAdd(dRom); } return(true); }
private static bool LoadDiskFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport) { dfl.Gn(); if (dfl.Next != "(") { errorReport?.Invoke(dfl.Filename, "( not found after rom, on line " + dfl.LineNumber); return(false); } dfl.Gn(); if (dfl.Next.ToLower() != "name") { errorReport?.Invoke(dfl.Filename, "Name not found as first object in ( ), on line " + dfl.LineNumber); return(false); } DatFile dRom = new DatFile(DatFileType.UnSet) { Name = VarFix.CleanCHD(dfl.Gn()), isDisk = true }; dfl.Gn(); while (dfl.Next != ")") { switch (dfl.Next.ToLower()) { case "sha1": dRom.SHA1 = VarFix.CleanMD5SHA1(dfl.Gn(), 40); break; case "md5": dRom.MD5 = VarFix.CleanMD5SHA1(dfl.Gn(), 32); break; case "region": dRom.Region = VarFix.String(dfl.Gn()); break; case "merge": dRom.Merge = VarFix.String(dfl.Gn()); break; case "index": dfl.Gn(); break; case "flags": dRom.Status = VarFix.ToLower(dfl.Gn()); break; case "nodump": dRom.Status = "nodump"; break; default: errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in rom, on line " + dfl.LineNumber); break; } dfl.Gn(); } parentDir.ChildAdd(dRom); return(true); }
private static bool LoadRomFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport) { dfl.Gn(); if (dfl.Next != "(") { errorReport?.Invoke(dfl.Filename, "( not found after rom, on line " + dfl.LineNumber); return(false); } dfl.Gn(); if (dfl.Next.ToLower() != "name") { errorReport?.Invoke(dfl.Filename, "Name not found as first object in ( ), on line " + dfl.LineNumber); return(false); } DatFile dRom = new DatFile(DatFileType.UnSet) { Name = dfl.Gn() }; dfl.Gn(); while (dfl.Next != ")") { switch (dfl.Next.ToLower()) { case "size": dRom.Size = VarFix.ULong(dfl.Gn()); break; case "hash": dfl.Gn(); break; case "crc": case "crc32": dRom.CRC = VarFix.CleanMD5SHA1(dfl.Gn(), 8); break; case "sha1": dRom.SHA1 = VarFix.CleanMD5SHA1(dfl.Gn(), 40); break; case "md5": dRom.MD5 = VarFix.CleanMD5SHA1(dfl.Gn(), 32); break; case "merge": dRom.Merge = VarFix.String(dfl.Gn()); break; case "flags": string flags = VarFix.ToLower(dfl.Gn()); if (string.IsNullOrWhiteSpace(dRom.Status)) { dRom.Status = flags; } break; case "date": dfl.Gn(); break; case "bios": dfl.Gn(); break; case "region": dfl.Gn(); break; case "regiona": case "regionb": while (dfl.Next != ")") { dfl.Gn(); } continue; case "offs": dfl.Gn(); break; case "nodump": dRom.Status = "nodump"; break; case "baddump": dRom.Status = "baddump"; break; default: errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in rom, on line " + dfl.LineNumber); break; } dfl.Gn(); } parentDir.ChildAdd(dRom); return(true); }
private static bool LoadGameFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport) { dfl.Gn(); if (dfl.Next != "(") { errorReport?.Invoke(dfl.Filename, "( not found after game, on line " + dfl.LineNumber); return(false); } dfl.Gn(); string snext = dfl.Next.ToLower(); string pathextra = ""; if (snext == "rebuildto") { pathextra = dfl.Gn(); dfl.Gn(); snext = dfl.Next.ToLower(); } if (snext != "name") { errorReport?.Invoke(dfl.Filename, "Name not found as first object in ( ), on line " + dfl.LineNumber); return(false); } string name = dfl.GnRest(); name = Path.Combine(pathextra, name); dfl.Gn(); DatDir dDir = new DatDir(DatFileType.UnSet) { Name = name, DGame = new DatGame() }; DatGame dGame = dDir.DGame; while (dfl.Next != ")" && !dfl.EndOfStream()) { switch (dfl.Next.ToLower()) { case "romof": dGame.RomOf = dfl.GnRest(); break; case "description": string description = dfl.GnRestQ(); int idx1 = description.IndexOf("\""); if (idx1 != -1) { int idx2 = description.IndexOf("\"", idx1 + 1); if (idx2 != -1) { description = description.Substring(idx1 + 1, idx2 - idx1 - 1); } } dGame.Description = description; break; case "sourcefile": dGame.SourceFile = dfl.GnRest(); break; case "cloneof": dGame.CloneOf = dfl.GnRest(); break; case "sampleof": dGame.SampleOf = dfl.GnRest(); break; case "board": dGame.Board = dfl.GnRest(); break; case "year": dGame.Year = dfl.GnRest(); break; case "manufacturer": dGame.Manufacturer = dfl.GnRest(); break; case "history": dGame.History = dfl.GnRest(); break; case "isdevice": dGame.IsDevice = dfl.GnRest(); break; case "serial": case "rebuildto": case "sample": case "biosset": case "chip": case "video": case "sound": case "input": case "dipswitch": case "driver": case "display": case "comment": case "releaseyear": case "releasemonth": case "releaseday": case "genre": case "developer": case "publisher": case "homepage": case "users": case "version": case "license": case "device_ref": case "driverstatus": case "ismechanical": case "#": // comments dfl.GnRest(); break; case "name": string tmpName = dfl.GnRest(); errorReport?.Invoke(dfl.Filename, "Error: multiple names found in one game '" + tmpName + "' will be ignored, on line " + dfl.LineNumber); break; case "rom": if (!LoadRomFromDat(dfl, dDir, errorReport)) { return(false); } break; case "disk": if (!LoadDiskFromDat(dfl, dDir, errorReport)) { return(false); } break; case "archive": if (!LoadArchiveFromDat(dfl, errorReport)) { return(false); } break; default: errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in game, on line " + dfl.LineNumber); break; } dfl.Gn(); } parentDir.ChildAdd(dDir); return(true); }
private static bool LoadHeaderFromDat(DatFileLoader dfl, string filename, DatHeader datHeader, ReportError errorReport) { dfl.Gn(); if (dfl.Next != "(") { errorReport?.Invoke(dfl.Filename, "( not found after clrmamepro, on line " + dfl.LineNumber); return(false); } dfl.Gn(); datHeader.Filename = filename; while (dfl.Next != ")") { switch (dfl.Next.ToLower()) { case "name": datHeader.Name = dfl.GnRest(); break; case "description": datHeader.Description = dfl.GnRest(); break; case "category": datHeader.Category = dfl.GnRest(); break; case "version": datHeader.Version = dfl.GnRest(); break; case "date": datHeader.Date = dfl.GnRest(); break; case "author": datHeader.Author = dfl.GnRest(); break; case "email": datHeader.Email = dfl.GnRest(); break; case "homepage": datHeader.Homepage = dfl.GnRest(); break; case "url": datHeader.URL = dfl.GnRest(); break; case "comment": datHeader.Comment = dfl.GnRest(); break; case "header": datHeader.Header = dfl.GnRest(); break; case "forcezipping": datHeader.Compression = dfl.GnRest(); break; case "forcepacking": datHeader.Compression = dfl.GnRest(); break; // incorrect usage case "forcemerging": datHeader.MergeType = dfl.GnRest(); break; case "forcenodump": datHeader.NoDump = dfl.GnRest(); break; case "dir": datHeader.Dir = dfl.GnRest(); break; case "games": dfl.GnRest(); break; default: errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in clrmamepro, on line " + dfl.LineNumber); break; } dfl.Gn(); } return(true); }