Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }