private static void InitCeoMap(EsfFile esfFile) { if (!(esfFile.RootNode is ParentNode campaignSaveGame)) { return; } CeoMapNameKey.Clear(); CeoMapEquipmentCodeKey.Clear(); var compressedData = campaignSaveGame.Children[3]; var campaignEnv = compressedData.Children[3]; var campaignModel = campaignEnv.Children[6]; var ceoSystemManagement = campaignModel.Children[7]; var ceoSystemCeos = ceoSystemManagement.Children[1]; var allOwnedCeos = ceoSystemCeos.Children[0]; Debug.WriteLine("总CEO:{0}", allOwnedCeos.Children.Count); for (var i = 0; i < allOwnedCeos.Children.Count; i++) { var ownedCeo = allOwnedCeos.Children[i]; var ceo = ownedCeo.Children[0]; var ceoDes = ownedCeo.Children[1]; String name = ownedCeo.AllNodes[0].ToString(); String name2 = ceoDes.AllNodes[0].ToString(); var ceoCode = ceo.AllNodes[0].ToString(); var equipmentCode = ceo.AllNodes[5].ToString(); if ("0" == equipmentCode) { continue; } if (!CeoMapNameKey.ContainsKey(name)) { CeoMapNameKey.Add(name, ceo); if (name.StartsWith("3k_main_ceo_trait_personality") || name.StartsWith("3k_ytr_ceo_trait_personality")) { //Debug.WriteLine(name); } } // else // { // Debug.WriteLine("已存在[{0}]/[{1}],未添加[{2}]/[{3}]", name2, CeoMapNameKey[name2], name2, code); // } if (!CeoMapEquipmentCodeKey.ContainsKey(equipmentCode)) { CeoMapEquipmentCodeKey.Add(equipmentCode, name); } // else // { // Debug.WriteLine("已存在[{0}]/[{1}],未添加[{2}]/[{3}]", code, CeoMapCodeKey[code], code, name2); // } } Debug.WriteLine("加载name数量:{0}", CeoMapNameKey.Count); Debug.WriteLine("加载code数量:{0}", CeoMapEquipmentCodeKey.Count); }
public static void Main(string[] args) { OpenFileDialog openDialog = new OpenFileDialog(); if (openDialog.ShowDialog() == DialogResult.OK) { string saveFile = openDialog.FileName; EsfFile file = EsfCodecUtil.LoadEsfFile(saveFile); ParentNode parent = file.RootNode as ParentNode; for (int i = 0; i < pathToCamera.Length; i++) { if (parent == null) { break; } parent = parent[pathToCamera[i]]; } if (parent == null || parent.Values.Count == 0) { MessageBox.Show("Could not find path to camera in save file :("); return; } EsfValueNode <uint> node = parent.Values[0] as EsfValueNode <uint>; node.FromString("1"); SaveFileDialog saveDialog = new SaveFileDialog { InitialDirectory = Path.GetDirectoryName(openDialog.FileName) }; if (saveDialog.ShowDialog() == DialogResult.OK) { EsfCodecUtil.WriteEsfFile(saveDialog.FileName, file); } } }
// 打开文件 private void OpenFile(string openFilename) { string text = _statusLabel.Text; try { _fileToolStripMenuItem.Enabled = false; _optionsToolStripMenuItem.Enabled = false; _statusLabel.Text = $"Loading {openFilename}"; LogFileWriter logFileWriter = null; if (_writeLogFileToolStripMenuItem.Checked) { logFileWriter = new LogFileWriter(openFilename + ".xml"); } EditedFile = EsfCodecUtil.LoadEsfFile(openFilename); FileName = openFilename; logFileWriter?.Close(); // 自定义检索 try { Tw3kSearch.SearchFaction(EditedFile); } catch (Exception e) { Debug.WriteLine(e); throw; } // 自定义换词条 // ChangePersonality(EditedFile, 101, CeoCategory.Personality, // "3k_main_ceo_trait_personality_kind", "3k_main_ceo_trait_personality_humble", // "3k_main_ceo_trait_personality_fraternal"); Text = $"{Path.GetFileName(openFilename)} - EditSF {Application.ProductVersion}"; foreach (ToolStripItem dropDownItem in _bookmarksToolStripMenuItem.DropDownItems) { if (dropDownItem is BookmarkItem) { dropDownItem.Enabled = true; } } } catch (Exception value) { _statusLabel.Text = text; Console.WriteLine(value); } finally { _fileToolStripMenuItem.Enabled = true; _optionsToolStripMenuItem.Enabled = true; } }
public string RunTest(string file, ToolStripProgressBar progress, ToolStripStatusLabel statusLabel) { string originalTitle = statusLabel.Text; statusLabel.Text = string.Format("Loading file {0}", Path.GetFileName(file)); Application.DoEvents(); string result; // ProgressUpdater updater = new ProgressUpdater(progress); using (Stream s = File.OpenRead(file)) { try { EsfCodec codec = EsfCodecUtil.GetCodec(File.OpenRead(file)); if (codec != null) { //updater.StartLoading(file, codec); TestsRun++; EsfFile esfFile = new EsfFile(s, codec); string testFileName = file + "_test"; EsfCodecUtil.WriteEsfFile(testFileName, esfFile); // using (BinaryWriter writer = new BinaryWriter(File.Create(testFileName))) { // codec.EncodeRootNode(writer, esfFile.RootNode); // } statusLabel.Text = string.Format("Saving file {0}", Path.GetFileName(file)); Application.DoEvents(); using (Stream reloadStream = File.OpenRead(testFileName)) { EsfFile reloadedFile = new EsfFile(reloadStream, codec); if (esfFile.Equals(reloadedFile)) { TestSuccesses++; result = string.Format("success Test {0}", file); } else { result = string.Format("FAIL Test {0}: Reload of save file different from original", file); } } Application.DoEvents(); File.Delete(testFileName); } else { result = string.Format("not running test on {0}", file); } } catch (Exception e) { result = string.Format("FAIL Test of {0}: {1}", file, e); } s.Close(); //updater.LoadingFinished(); } statusLabel.Text = originalTitle; return(result); }
public string RunTest(string file, ToolStripProgressBar progress, ToolStripStatusLabel statusLabel) { string text = statusLabel.Text; statusLabel.Text = $"Loading file {Path.GetFileName(file)}"; Application.DoEvents(); string result; using (Stream stream = File.OpenRead(file)) { try { EsfCodec codec = EsfCodecUtil.GetCodec(File.OpenRead(file)); if (codec != null) { TestsRun++; EsfFile esfFile = new EsfFile(stream, codec); string text2 = file + "_test"; EsfCodecUtil.WriteEsfFile(text2, esfFile); statusLabel.Text = $"Saving file {Path.GetFileName(file)}"; Application.DoEvents(); using (Stream stream2 = File.OpenRead(text2)) { EsfFile obj = new EsfFile(stream2, codec); if (esfFile.Equals(obj)) { TestSuccesses++; result = $"success Test {file}"; } else { result = $"FAIL Test {file}: Reload of save file different from original"; } } Application.DoEvents(); File.Delete(text2); } else { result = $"not running test on {file}"; } } catch (Exception arg) { result = $"FAIL Test of {file}: {arg}"; } stream.Close(); } statusLabel.Text = text; return(result); }
public static void SearchFaction(EsfFile esfFile) { if (!(esfFile.RootNode is ParentNode campaignSaveGame)) { return; } InitCeoMap(esfFile); var compressedData = campaignSaveGame.Children[3]; var campaignEnv = compressedData.Children[3]; var campaignModel = campaignEnv.Children[6]; var world = campaignModel.Children[5]; var characterGenerator = world.Children[12]; var persistentCharacterStorage = characterGenerator.Children[0]; var characters = persistentCharacterStorage.Children[0]; for (var i = 0; i < characters.Children.Count - 1; i++) { var character = characters.Children[i]; var persistentCharacter = character.Children[0]; var characterIndex = persistentCharacter.AllNodes[0].ToString(); var templateName = persistentCharacter.AllNodes[10].ToString(); var persistentCharacterFactionLink = persistentCharacter.Children[0]; var characterArtSetInfo = persistentCharacter.Children[2]; var persistentRetinue = persistentCharacter.Children[6]; var faction = persistentCharacterFactionLink.AllNodes[0].ToString(); var characterName = characterArtSetInfo.Values[0] as StringNode; //判断派系 1刘备 4袁绍 if (!faction.Equals("2")) { continue; } //判断模板 // String templateName = template.ToString(); // if (templateName.Contains("xu_you")) // { Debug.WriteLine(characterIndex); Debug.WriteLine(templateName); ChangePersonality(esfFile, characterIndex, CeoCategory.personality, "", "", "", "3k_ytr_ceo_trait_personality_heaven_honest", "", "", ""); // } } }
public static void Main(string[] args) { AbcaFileCodec codec = new AbcaFileCodec { Header = new EsfHeader { ID = 0xABCA } }; RecordNode root = new RecordNode(codec) { Name = "root" }; RecordNode child = new RecordNode(codec) { Name = "copySource" }; EsfValueNode <string> utf16String = (EsfValueNode <string>)codec.CreateValueNode(EsfType.UTF16); utf16String.Value = "utf16"; child.Value.Add(utf16String); root.Value.Add(child); child = new RecordNode(codec) { Name = "copyTarget" }; EsfValueNode <string> copyString = (EsfValueNode <string>)utf16String.CreateCopy(); // copyString.Value = "copy"; copyString.FromString("copy"); child.Value.Add(copyString); root.Value.Add(child); // this is needed for the file to create the record nodes properly SortedList <int, string> nodeNames = new SortedList <int, string>(); nodeNames.Add(0, "root"); nodeNames.Add(1, "copySource"); nodeNames.Add(2, "copyTarget"); // this property needs to be added to the EsfFileCodec, getting and setting EsfFileCodec#nodeNames codec.NodeNames = nodeNames; EsfFile file = new EsfFile(root, codec); EsfCodecUtil.WriteEsfFile("string_container.esf", file); }
private void OpenFile(string openFilename) { string oldStatus = statusLabel.Text; try { fileToolStripMenuItem.Enabled = false; optionsToolStripMenuItem.Enabled = false; // EsfCodec codec = EsfCodecUtil.GetCodec(stream); // updater.StartLoading(openFilename, codec); statusLabel.Text = string.Format("Loading {0}", openFilename); LogFileWriter logger = null; if (writeLogFileToolStripMenuItem.Checked) { logger = new LogFileWriter(openFilename + ".xml"); //codec.NodeReadFinished += logger.WriteEntry; //codec.Log += logger.WriteLogEntry; } EditedFile = EsfCodecUtil.LoadEsfFile(openFilename); //updater.LoadingFinished(); FileName = openFilename; if (logger != null) { logger.Close(); //codec.NodeReadFinished -= logger.WriteEntry; //codec.Log -= logger.WriteLogEntry; } Text = string.Format("{0} - EditSF {1}", Path.GetFileName(openFilename), Application.ProductVersion); foreach (ToolStripItem item in bookmarksToolStripMenuItem.DropDownItems) { if (item is BookmarkItem) { item.Enabled = true; } } } catch (Exception exception) { statusLabel.Text = oldStatus; Console.WriteLine(exception); } finally { fileToolStripMenuItem.Enabled = true; optionsToolStripMenuItem.Enabled = true; } }
public void TestEquals() { EsfNode valueNode = new IntNode { Value = 1 }; EsfNode valueNode2 = new IntNode { Value = 1 }; assertEqual(valueNode, valueNode2); List <EsfNode> nodeList1 = new List <EsfNode>(); nodeList1.Add(valueNode); List <EsfNode> nodeList2 = new List <EsfNode>(); nodeList2.Add(valueNode); RecordNode node = new RecordNode(null) { Name = "name", Value = nodeList1 }; EsfNode node2 = new RecordNode(null) { Name = "nodename", Value = nodeList2 }; assertNotEqual(node, node2); node = new RecordNode(null) { Name = "nodename", Value = nodeList1 }; assertEqual(node, node2); AbcaFileCodec codec = new AbcaFileCodec(); EsfFile file = new EsfFile(node, codec); AbceCodec codec2 = new AbceCodec(); EsfFile file2 = new EsfFile(node2, codec2); assertNotEqual(file, file2); file2.Codec = codec; assertEqual(file, file2); }
static void testNew(string filename) { using (FileStream logStream = File.Create(filename + "_log.txt"), addressStream = File.Create(filename + "_address.txt")) { logWriter = new StreamWriter(logStream); addressLogWriter = new StreamWriter(addressStream); EsfFile file = null; DateTime start = DateTime.Now; try { Console.WriteLine("reading {0}", filename); using (FileStream stream = File.OpenRead(filename)) { EsfCodec codec = EsfCodecUtil.GetCodec(stream); TicToc timer = new TicToc(); codec.NodeReadStarting += timer.Tic; codec.NodeReadFinished += timer.Toc; // codec.NodeReadFinished += OutputNodeEnd; file = EsfCodecUtil.LoadEsfFile(filename); forceDecode(file.RootNode); //file = new EsfFile(stream, codec); timer.DumpAll(); } Console.WriteLine("{0} read in {1} seconds", file, (DateTime.Now.Ticks - start.Ticks) / 10000000); Console.WriteLine("Reading finished, saving now"); } catch (Exception e) { Console.WriteLine("Read failed: {0}, {1}", filename, e); } try { string saveFile = filename + "_save"; if (file != null) { EsfCodecUtil.WriteEsfFile(saveFile, file); } //File.Delete(saveFile); } catch (Exception e) { Console.WriteLine("Write {0} failed: {1}", filename, e); } logWriter.Flush(); addressLogWriter.Flush(); } }
private void OpenFile(string openFilename) { string oldStatus = statusLabel.Text; try { menuStrip1.Enabled = false; var stream = File.OpenRead(openFilename); //EsfCodec codec = EsfCodecUtil.GetCodec(stream); //updater.StartLoading(openFilename, codec); statusLabel.Text = string.Format("Loading {0}", openFilename); LogFileWriter logger = null; if (writeLogFileToolStripMenuItem.Checked) { logger = new LogFileWriter(openFilename + ".xml"); //codec.NodeReadFinished += logger.WriteEntry; //codec.Log += logger.WriteLogEntry; } EditedFile = EsfCodecUtil.LoadEsfFile(openFilename); //EditedFile = new EsfFile(codec.Parse(stream), codec); //updater.LoadingFinished(); FileName = openFilename; if (logger != null) { logger.Close(); //codec.NodeReadFinished -= logger.WriteEntry; //codec.Log -= logger.WriteLogEntry; } Text = string.Format("{0} - EditSFCharacters {1}", Path.GetFileName(openFilename), Application.ProductVersion); } catch (Exception exception) { statusLabel.Text = oldStatus; Console.WriteLine(exception); } finally { menuStrip1.Enabled = true; } }
private static bool ChangePersonality(EsfFile esfFile, String characterIndex, String ceoCategory, String personality1, String personality2, String personality3, String personality4, String personality5, String personality6, String personality7) { if (!(esfFile.RootNode is ParentNode campaignSaveGame)) { return(false); } var compressedData = campaignSaveGame.Children[3]; var campaignEnv = compressedData.Children[3]; var campaignModel = campaignEnv.Children[6]; var ceoSystemManagement = campaignModel.Children[7]; var ceoSystemModel = ceoSystemManagement.Children[0]; var ceoSystemCeos = ceoSystemManagement.Children[1]; var charactersConnectedCeoManagement = ceoSystemModel.Children[2]; var charactersConnectedCeoManagementChildren = charactersConnectedCeoManagement.Children; ParentNode character = null; foreach (var c in charactersConnectedCeoManagementChildren) { if (c.AllNodes[0].ToString().Equals(characterIndex)) { character = c; } } if (character == null) { return(false); } var management = character.Children[0]; //装备管理 var equipmentManager = management.Children[1]; var equipmentSlotsBlocks = equipmentManager.Children[0]; //ceo关系管理 var ceoOwnerShipManager = management.Children[3]; var ceoPoolBlocks = ceoOwnerShipManager.Children[0]; //遍历获取装备槽和ceo池 ParentNode equipmentSlotsBlock = null; ParentNode ceoPoolBlock = null; foreach (var block in equipmentSlotsBlocks.Children) { String blockCategory = block.AllNodes[0].ToString(); if (blockCategory == ceoCategory) { equipmentSlotsBlock = block; } } foreach (var block in ceoPoolBlocks.Children) { String blockCategory = block.AllNodes[0].ToString(); if (blockCategory == ceoCategory) { ceoPoolBlock = block; } } return(ChangePersonality(equipmentSlotsBlock, ceoPoolBlock, personality1, personality2, personality3, personality4, personality5, personality6, personality7)); }