Example #1
0
        /// <summary>
        ///     Initialize with stream data
        /// </summary>
        /// <param name="buffer"></param>
        public RDBINFO(Span <byte> buffer)
        {
            //                                                         0      1     2      3      4    5
            var csv = ManagedFSHelper.GetFileList(buffer); // Format,Index,Offset,Length,Name,Path

            foreach (var line in csv)
            {
                var  encodedName = line[4];
                uint ktid;
                if (line.Length > 6) // .bin.info
                {
                    encodedName = line[2];
                    ktid        = uint.Parse(line[1], NumberStyles.HexNumber);
                }
                else // .info
                {
                    if (encodedName.Length == 0)
                    {
                        continue;
                    }
                    ktid = RDB.Hash(line[4]);
                }
                Entries.Add((ktid, line));

                var(name, _)  = RDB.StripName(encodedName);
                NameMap[ktid] = name;
                HashMap[ktid] = encodedName;
            }
        }
Example #2
0
        private static void Main(string[] args)
        {
            Logger.PrintVersion("Nyotengu");
            var flags = CommandLineFlags.ParseFlags <DatabaseFlags>(CommandLineFlags.PrintHelp, args);

            if (flags == null)
            {
                return;
            }

            var files = new HashSet <string>();

            foreach (var path in flags.Paths)
            {
                if (File.Exists(path))
                {
                    files.Add(path);
                }
                if (!Directory.Exists(path))
                {
                    continue;
                }
                foreach (var file in Directory.GetFiles(path))
                {
                    files.Add(file);
                }
            }

            var ndbFiles = new Dictionary <KTIDReference, string>();

            if (flags.NDBPaths != null)
            {
                foreach (var nameFile in flags.NDBPaths.Where(Directory.Exists).SelectMany(Directory.GetFiles).Union(flags.NDBPaths.Where(File.Exists)))
                {
                    ndbFiles[RDB.Hash(Path.GetFileName(nameFile))] = nameFile;
                    if (KTIDReference.TryParse(Path.GetFileNameWithoutExtension(nameFile), NumberStyles.HexNumber, null, out var hashedName))
                    {
                        ndbFiles[hashedName] = nameFile;
                    }
                }
            }

            var filelist     = Cethleann.ManagedFS.Nyotengu.LoadKTIDFileListShared(flags.FileList, flags.GameId);
            var propertyList = Cethleann.ManagedFS.Nyotengu.LoadKTIDFileList(null, "PropertyList");
            var filters      = flags.TypeInfoFilter?.Split(',').Select(x => RDB.Hash(x.Trim())).ToHashSet() ?? new HashSet <KTIDReference>();

            var typeHashes        = new Dictionary <KTIDReference, string>();
            var extraHashes       = new Dictionary <KTIDReference, string>();
            var missingProperties = new HashSet <KTIDReference>();

            foreach (var file in files)
            {
                Logger.Log(ConsoleSwatch.XTermColor.White, true, Console.Error, "Nyotengu", "INFO", file);
                Span <byte> buffer = File.ReadAllBytes(file);
                // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault
                switch (buffer.GetDataType())
                {
                case DataType.OBJDB:
                {
                    ProcessOBJDB(buffer, ndbFiles, filelist, propertyList, filters, flags, missingProperties);
                    break;
                }

                case DataType.NDB:
                {
                    if (flags.HashTypes || flags.HashExtra)
                    {
                        HashNDB(buffer, typeHashes, extraHashes, flags);
                    }
                    else if (flags.CreateFilelist)
                    {
                        NDBFilelist(buffer, Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(file)), flags, filelist);
                    }
                    else
                    {
                        ProcessNDB(buffer, flags);
                    }
                    break;
                }

                default:
                    Logger.Error("Nyotengu", $"Format for {file} is unknown!");
                    break;
                }
            }

            if (flags.HashTypes)
            {
                foreach (var(hash, text) in typeHashes.OrderBy(x => x.Key))
                {
                    Console.WriteLine($"TypeInfo,{hash:x8},{text}");
                }
            }

            if (flags.HashExtra)
            {
                foreach (var(hash, text) in extraHashes.OrderBy(x => x.Key))
                {
                    Console.WriteLine($"Property,{hash:x8},{text}");
                }
            }

            // ReSharper disable once InvertIf
            if (flags.CreateMissingList)
            {
                var location = ManagedFSHelper.GetFileListLocation(null, "MissingProperties", "rdb");
                using var file = File.Open(location, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read);
                file.Seek(0, SeekOrigin.End);
                using var writer = new StreamWriter(file, Encoding.UTF8);
                foreach (var hash in missingProperties)
                {
                    writer.WriteLine($"Property,{hash:x8},");
                }
            }
        }