/// <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; } }
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},"); } } }