public static void Main(string[] args) { PackFile exported = null; bool showManager = (args.Length > 0 && args[0].Equals("-g")); if (showManager) { DBTableDisplay display = new DBTableDisplay(); display.ShowDialog(); } else { bool export = (args.Length > 0 && args[0].Equals("-x")); Console.WriteLine("exporting undecoded to file"); exported = new PackFile("undecoded.pack", new PFHeader("PFH4")); DBTypeMap.Instance.initializeFromFile("master_schema.xml"); foreach (Game game in Game.Games) { LoadGameLocationFromFile(game); if (game.IsInstalled) { foreach (string packFileName in Directory.EnumerateFiles(game.DataDirectory, "*pack")) { Console.WriteLine("checking {0}", packFileName); PackFile packFile = new PackFileCodec().Open(packFileName); foreach (VirtualDirectory dir in packFile.Root.Subdirectories.Values) { if (dir.Name.Equals("db")) { foreach (PackedFile dbFile in dir.AllFiles) { if (dbFile.Name.Contains("models_naval")) { continue; } // DBFileHeader header = PackedFileDbCodec.readHeader(dbFile); DBFile decoded = PackedFileDbCodec.Decode(dbFile); DBFileHeader header = PackedFileDbCodec.readHeader(dbFile); if (decoded == null && header.EntryCount != 0) { Console.WriteLine("failed to read {0} in {1}", dbFile.FullPath, packFile); if (export) { String exportFileName = String.Format("db/{0}_{1}_{2}", game.Id, dbFile.Name, Path.GetFileName(packFileName)).ToLower(); PackedFile exportedDbFile = new PackedFile(exportFileName, false) { Data = dbFile.Data }; exported.Add(exportedDbFile); } else { string key = DBFile.Typename(dbFile.FullPath); bool unicode = false; if (game == Game.ETW || game == Game.NTW || game == Game.STW) { unicode = true; } DecodeTool.DecodeTool decoder = new DecodeTool.DecodeTool(unicode) { TypeName = key, Bytes = dbFile.Data }; decoder.ShowDialog(); } } } } } } if (export) { new PackFileCodec().Save(exported); } } else { Console.Error.WriteLine("Game {0} not installed in {1}", game, game.GameDirectory); } } } }
public void Open() { #if DEBUG Console.WriteLine("Opening {0}", CurrentPackedFile.FullPath); #endif string key = DBFile.Typename(CurrentPackedFile.FullPath); if (!DBTypeMap.Instance.IsSupported(key)) { ShowDBFileNotSupportedMessage("Sorry, this db file isn't supported yet.\r\n\r\nCurrently supported files:\r\n"); if (Settings.Default.ShowDecodeToolOnError) { var decoder = new DecodeTool.DecodeTool { TypeName = key, Bytes = CurrentPackedFile.Data }; decoder.ShowDialog(); if (!DBTypeMap.Instance.IsSupported(key)) { return; } } else { return; } } try { EditedFile = PackedFileDbCodec.Decode(CurrentPackedFile); } catch { if (Settings.Default.ShowDecodeToolOnError) { var decoder = new DecodeTool.DecodeTool { TypeName = key, Bytes = CurrentPackedFile.Data }; decoder.ShowDialog(); try { EditedFile = PackedFileDbCodec.Decode(CurrentPackedFile); } catch { return; } } else { return; } } if (EditedFile == null) { return; } Codec = PackedFileDbCodec.FromFilename(CurrentPackedFile.FullPath); TypeInfo info = EditedFile.CurrentType; dataGridView.EndEdit(); dataGridView.Columns.Clear(); if (currentDataTable != null) { currentDataTable.DataSet.Clear(); currentDataTable.Clear(); } CreateDataTable(); for (int i = 0; i < EditedFile.CurrentType.Fields.Count; i++) { dataGridView.Columns.Add(CreateColumn(i)); } DataSet currentDataSet = new DataSet(info.Name + "_DataSet"); currentDataSet.Tables.Add(currentDataTable); dataGridView.DataSource = new BindingSource(currentDataSet, info.Name + "_DataTable"); FirstColumnAsRowHeader = Settings.Default.UseFirstColumnAsRowHeader; FillRowHeaders(); addNewRowButton.Enabled = true; importButton.Enabled = true; exportButton.Enabled = true; dataGridView.Visible = true; unsupportedDBErrorTextBox.Visible = false; // cannot edit contained complex types foreach (FieldInfo f in EditedFile.CurrentType.Fields) { if (f is ListType) { Console.WriteLine("cannot edit this"); ReadOnly = true; break; } } }