public MainWindow() { InitializeComponent(); _propertyGrid = new PropertyGrid(); AddTypeDescriptorAttributes(); ApplyStyleToPropertyGrid(); System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost(); host.Child = _propertyGrid; propertyGridHost.Children.Add(host); if (File.Exists(NAMES_FILE_NAME)) { NameResolver.UseDictionary(JsonConvert.DeserializeObject <Dictionary <ulong, NameResolver.NameStruct> >(File.ReadAllText(NAMES_FILE_NAME))); } if (File.Exists(SETTINGS_FILE_NAME)) { _settings = JsonConvert.DeserializeObject <Settings>(File.ReadAllText(SETTINGS_FILE_NAME)) ?? Settings.Default; } else { _settings = Settings.Default; } }
public Form1() { InitializeComponent(); if (!Directory.Exists(Constants.FileStructure.OUTPUT_FOLDER_NAME)) { Directory.CreateDirectory(Constants.FileStructure.OUTPUT_FOLDER_NAME); } exportToolStripMenuItem.Click += ExportToolStripMenuItem_Click; NameResolver.UseDictionary(JsonConvert.DeserializeObject <Dictionary <ulong, NameResolver.NameStruct> >(File.ReadAllText(NAMES_FILE_NAME))); FactResolver.UseDictionary(JsonConvert.DeserializeObject <Dictionary <ulong, string> >(File.ReadAllText(FACTS_FILE_NAME))); //Make rightclick select node. Better usability of context menu EditorTree.NodeMouseClick += (sender, args) => EditorTree.SelectedNode = args.Node; //Add Hexeditor as editor for byte arrays TypeDescriptor.AddAttributes(typeof(byte[]), new EditorAttribute(typeof(HexEditor), typeof(UITypeEditor))); TypeDescriptor.AddAttributes(typeof(CharacterCustomizationAppearances.AppearanceSection), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(CharacterCustomizationAppearances.Section), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemData.NextItemEntry), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemData.ItemFlags), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemData), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemData.HeaderThing), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemData.ItemInnerData), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemData.SimpleItemData), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemData.ModableItemData), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemData.ItemModData), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(Inventory.SubInventory), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(ItemDropStorage), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); TypeDescriptor.AddAttributes(typeof(FactsTable.FactEntry), new TypeConverterAttribute(typeof(ExpandableObjectConverter))); //Settings var interfaceType = typeof(INodeParser); var types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass); if (File.Exists(SETTINGS_FILE_NAME)) { _settings = JsonConvert.DeserializeObject <Settings>(File.ReadAllText(SETTINGS_FILE_NAME)); foreach (var type in types) { var instance = (INodeParser)Activator.CreateInstance(type); _parserConfig.Add(new ParserConfig(instance, _settings.EnabledParsers.Contains(instance.Guid))); } } else { foreach (var type in types) { var instance = Activator.CreateInstance(type); _parserConfig.Add(new ParserConfig((INodeParser)instance, true)); } _settings = new Settings(); _settings.EnabledParsers.AddRange(_parserConfig.Where(p => p.Enabled = true).Select(p => p.Parser.Guid)); } dataGridView1.DataSource = _parserConfig; _saveFileCompressionHelper = new SaveFileCompressionHelper(); }
public Form1() { InitializeComponent(); if (!Directory.Exists(Constants.FileStructure.OUTPUT_FOLDER_NAME)) { Directory.CreateDirectory(Constants.FileStructure.OUTPUT_FOLDER_NAME); } exportToolStripMenuItem.Click += ExportToolStripMenuItem_Click; tsmiImport.Click += ImportBinaryClick; NameResolver.UseDictionary(JsonConvert.DeserializeObject <Dictionary <ulong, NameResolver.NameStruct> >(File.ReadAllText(NAMES_FILE_NAME))); FactResolver.UseDictionary(JsonConvert.DeserializeObject <Dictionary <ulong, string> >(File.ReadAllText(FACTS_FILE_NAME))); //Make rightclick select node. Better usability of context menu EditorTree.NodeMouseClick += (sender, args) => EditorTree.SelectedNode = args.Node; SetPropertyEditControlSettings(); //Settings var interfaceType = typeof(INodeParser); var types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass && p != typeof(DefaultParser)); if (File.Exists(SETTINGS_FILE_NAME)) { _settings = JsonConvert.DeserializeObject <Settings>(File.ReadAllText(SETTINGS_FILE_NAME)); foreach (var type in types) { var instance = (INodeParser)Activator.CreateInstance(type); _parserConfig.Add(new ParserConfig(instance, _settings.EnabledParsers.Contains(instance.Guid))); cbStartInSaves.Checked = _settings.StartInSavesFolder; } } else { foreach (var type in types) { var instance = Activator.CreateInstance(type); _parserConfig.Add(new ParserConfig((INodeParser)instance, true)); } _settings = new Settings(); _settings.EnabledParsers.AddRange(_parserConfig.Where(p => p.Enabled = true).Select(p => p.Parser.Guid)); } dataGridView1.DataSource = _parserConfig; }
private void openSaveButton_Click(object sender, EventArgs e) { var fileWindow = new OpenFileDialog(); fileWindow.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Saved Games\\CD Projekt Red\\Cyberpunk 2077\\"; fileWindow.Filter = "Cyberpunk 2077 Save File|*.dat"; if (fileWindow.ShowDialog() == DialogResult.OK) { loadingSave = true; //Initialize NameResolver & FactResolver dictionaries, build parsers list & load save file NameResolver.UseDictionary(JsonConvert.DeserializeObject <Dictionary <ulong, NameResolver.NameStruct> >(CP2077SaveEditor.Properties.Resources.ItemNames)); FactResolver.UseDictionary(JsonConvert.DeserializeObject <Dictionary <ulong, string> >(CP2077SaveEditor.Properties.Resources.Facts)); var parsers = new List <INodeParser>(); parsers.AddRange(new INodeParser[] { new CharacterCustomizationAppearancesParser(), new InventoryParser(), new ItemDataParser(), new FactsDBParser(), new FactsTableParser(), new GameSessionConfigParser(), new ItemDropStorageManagerParser(), new ItemDropStorageParser(), new StatsSystemParser(), new ScriptableSystemsContainerParser() }); var newSave = new SaveFileHelper(parsers); newSave.LoadPCSaveFile(new MemoryStream(File.ReadAllBytes(fileWindow.FileName))); activeSaveFile = newSave; //Appearance parsing RefreshAppearanceValues(); //Inventory parsing moneyUpDown.Enabled = false; moneyUpDown.Value = 0; containersListBox.Items.Clear(); foreach (Inventory.SubInventory container in activeSaveFile.GetInventoriesContainer().SubInventories) { var containerID = container.InventoryId.ToString(); if (containerID == "1") { containerID = "Player Inventory"; } containersListBox.Items.Add(containerID); } if (containersListBox.Items.Count > 0) { containersListBox.SelectedIndex = 0; } //Facts parsing RefreshFacts(); //These lines may look redundant, but they initialize the factsListView so that the render thread doesn't freeze when selecting the Quest Facts tab for the first time. //Since the render thread will be frozen here anyways while everything loads, it's best to do this here. factsSaveButton.Visible = false; factsPanel.Visible = true; factsPanel.Visible = false; factsSaveButton.Visible = true; //Player stats parsing var profics = activeSaveFile.GetPlayerDevelopmentData().Value.Proficiencies; levelUpDown.Value = profics[Array.FindIndex(profics, x => x.Type == CyberCAT.Core.DumpedEnums.gamedataProficiencyType.Level)].CurrentLevel; streetCredUpDown.Value = profics[Array.FindIndex(profics, x => x.Type == CyberCAT.Core.DumpedEnums.gamedataProficiencyType.StreetCred)].CurrentLevel; var attrs = activeSaveFile.GetPlayerDevelopmentData().Value.Attributes; bodyUpDown.Value = attrs[Array.FindIndex(attrs, x => x.AttributeName == CyberCAT.Core.DumpedEnums.gamedataStatType.Strength)].Value; reflexesUpDown.Value = attrs[Array.FindIndex(attrs, x => x.AttributeName == CyberCAT.Core.DumpedEnums.gamedataStatType.Reflexes)].Value; technicalAbilityUpDown.Value = attrs[Array.FindIndex(attrs, x => x.AttributeName == CyberCAT.Core.DumpedEnums.gamedataStatType.TechnicalAbility)].Value; intelligenceUpDown.Value = attrs[Array.FindIndex(attrs, x => x.AttributeName == CyberCAT.Core.DumpedEnums.gamedataStatType.Intelligence)].Value; coolUpDown.Value = attrs[Array.FindIndex(attrs, x => x.AttributeName == CyberCAT.Core.DumpedEnums.gamedataStatType.Cool)].Value; if (activeSaveFile.GetPlayerDevelopmentData().Value.LifePath == CyberCAT.Core.DumpedEnums.gamedataLifePath.Nomad) { lifePathBox.SelectedIndex = 0; } else if (activeSaveFile.GetPlayerDevelopmentData().Value.LifePath == CyberCAT.Core.DumpedEnums.gamedataLifePath.StreetKid) { lifePathBox.SelectedIndex = 1; } else { lifePathBox.SelectedIndex = 2; } var points = activeSaveFile.GetPlayerDevelopmentData().Value.DevPoints; perkPointsUpDown.Value = points[Array.FindIndex(points, x => x.Type == CyberCAT.Core.DumpedEnums.gamedataDevelopmentPointType.Primary)].Unspent; attrPointsUpDown.Value = points[Array.FindIndex(points, x => x.Type == null)].Unspent; //Update controls loadingSave = false; editorPanel.Enabled = true; optionsPanel.Enabled = true; filePathLabel.Text = Path.GetFileName(Path.GetDirectoryName(fileWindow.FileName)); statusLabel.Text = "Save file loaded."; SwapTab(statsButton, statsPanel); } }