diff --git a/ExploreForm.Designer.cs b/ExploreForm.Designer.cs index cf2f9ad..f743e46 100644 --- a/ExploreForm.Designer.cs +++ b/ExploreForm.Designer.cs @@ -103,6 +103,8 @@ this.ListContextCopyPathMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ListContextCopyFileListMenu = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.ListContextOpenFileLocationMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ListContextOpenFileLocationSeparator = new System.Windows.Forms.ToolStripSeparator(); this.ListContextRenameMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ListContextReplaceMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ListContextDeleteMenu = new System.Windows.Forms.ToolStripMenuItem(); @@ -118,8 +120,7 @@ this.SaveFileDialog = new System.Windows.Forms.SaveFileDialog(); this.OpenFileDialog = new System.Windows.Forms.OpenFileDialog(); this.FolderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); - this.ListContextOpenFileLocationSeparator = new System.Windows.Forms.ToolStripSeparator(); - this.ListContextOpenFileLocationMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ListContextExtractUncompressedMenu = new System.Windows.Forms.ToolStripMenuItem(); this.MainMenu.SuspendLayout(); this.MainToolbar.SuspendLayout(); this.StatusBar.SuspendLayout(); @@ -714,6 +715,7 @@ this.toolStripSeparator2, this.ListContextExportXmlMenu, this.ListContextExtractRawMenu, + this.ListContextExtractUncompressedMenu, this.ListContextExtractAllMenu, this.toolStripSeparator5, this.ListContextImportXmlMenu, @@ -731,7 +733,7 @@ this.ListContextEditSeparator, this.ListContextSelectAllMenu}); this.ListContextMenu.Name = "MainContextMenu"; - this.ListContextMenu.Size = new System.Drawing.Size(208, 392); + this.ListContextMenu.Size = new System.Drawing.Size(208, 414); // // ListContextViewMenu // @@ -841,6 +843,18 @@ this.toolStripSeparator6.Name = "toolStripSeparator6"; this.toolStripSeparator6.Size = new System.Drawing.Size(204, 6); // + // ListContextOpenFileLocationMenu + // + this.ListContextOpenFileLocationMenu.Name = "ListContextOpenFileLocationMenu"; + this.ListContextOpenFileLocationMenu.Size = new System.Drawing.Size(207, 22); + this.ListContextOpenFileLocationMenu.Text = "Open File Location"; + this.ListContextOpenFileLocationMenu.Click += new System.EventHandler(this.ListContextOpenFileLocationMenu_Click); + // + // ListContextOpenFileLocationSeparator + // + this.ListContextOpenFileLocationSeparator.Name = "ListContextOpenFileLocationSeparator"; + this.ListContextOpenFileLocationSeparator.Size = new System.Drawing.Size(204, 6); + // // ListContextRenameMenu // this.ListContextRenameMenu.Image = ((System.Drawing.Image)(resources.GetObject("ListContextRenameMenu.Image"))); @@ -935,17 +949,12 @@ this.TreeContextCollapseAllMenu.Text = "Collapse All"; this.TreeContextCollapseAllMenu.Click += new System.EventHandler(this.TreeContextCollapseAllMenu_Click); // - // ListContextOpenFileLocationSeparator + // ListContextExtractUncompressedMenu // - this.ListContextOpenFileLocationSeparator.Name = "ListContextOpenFileLocationSeparator"; - this.ListContextOpenFileLocationSeparator.Size = new System.Drawing.Size(204, 6); - // - // ListContextOpenFileLocationMenu - // - this.ListContextOpenFileLocationMenu.Name = "ListContextOpenFileLocationMenu"; - this.ListContextOpenFileLocationMenu.Size = new System.Drawing.Size(207, 22); - this.ListContextOpenFileLocationMenu.Text = "Open File Location"; - this.ListContextOpenFileLocationMenu.Click += new System.EventHandler(this.ListContextOpenFileLocationMenu_Click); + this.ListContextExtractUncompressedMenu.Name = "ListContextExtractUncompressedMenu"; + this.ListContextExtractUncompressedMenu.Size = new System.Drawing.Size(207, 22); + this.ListContextExtractUncompressedMenu.Text = "Extract Uncompressed..."; + this.ListContextExtractUncompressedMenu.Click += new System.EventHandler(this.ListContextExtractUncompressedMenu_Click); // // ExploreForm // @@ -1070,5 +1079,6 @@ private System.Windows.Forms.ColumnHeader MainPathColumnHeader; private System.Windows.Forms.ToolStripMenuItem ListContextOpenFileLocationMenu; private System.Windows.Forms.ToolStripSeparator ListContextOpenFileLocationSeparator; + private System.Windows.Forms.ToolStripMenuItem ListContextExtractUncompressedMenu; } } \ No newline at end of file diff --git a/ExploreForm.cs b/ExploreForm.cs index 0f6f18e..8df3806 100644 --- a/ExploreForm.cs +++ b/ExploreForm.cs @@ -1396,6 +1396,7 @@ namespace CodeWalker ListContextExportXmlMenu.Enabled = canexportxml; ListContextExtractRawMenu.Enabled = isfile; + ListContextExtractUncompressedMenu.Enabled = isfile; ListContextImportRawMenu.Visible = canimport; ListContextImportXmlMenu.Visible = canimport; @@ -1474,6 +1475,93 @@ namespace CodeWalker return; } + + RpfResourceFileEntry rrfe = file.File as RpfResourceFileEntry; + if (rrfe != null) //add resource header if this is a resource file. + { + data = ResourceBuilder.Compress(data); + data = ResourceBuilder.AddResourceHeader(rrfe, data); + } + + + SaveFileDialog.FileName = file.Name; + if (SaveFileDialog.ShowDialog() == DialogResult.OK) + { + string path = SaveFileDialog.FileName; + try + { + File.WriteAllBytes(path, data); + } + catch (Exception ex) + { + MessageBox.Show("Error saving file " + path + ":\n" + ex.ToString()); + } + } + } + } + else + { + if (FolderBrowserDialog.ShowDialog() != DialogResult.OK) return; + string folderpath = FolderBrowserDialog.SelectedPath; + if (!folderpath.EndsWith("\\")) folderpath += "\\"; + + StringBuilder errors = new StringBuilder(); + + for (int i = 0; i < MainListView.SelectedIndices.Count; i++) + { + var idx = MainListView.SelectedIndices[i]; + if ((idx < 0) || (idx >= CurrentFiles.Count)) continue; + var file = CurrentFiles[idx]; + if (file.Folder == null) + { + var path = folderpath + file.Name; + var data = GetFileData(file); + if (data == null) + { + errors.AppendLine("Unable to extract file: " + file.Path); + continue; + } + try + { + RpfResourceFileEntry rrfe = file.File as RpfResourceFileEntry; + if (rrfe != null) //add resource header if this is a resource file. + { + data = ResourceBuilder.Compress(data); + data = ResourceBuilder.AddResourceHeader(rrfe, data); + } + + File.WriteAllBytes(path, data); + } + catch (Exception ex) + { + errors.AppendLine("Error saving file " + path + ":\n" + ex.ToString()); + } + } + } + + string errstr = errors.ToString(); + if (!string.IsNullOrEmpty(errstr)) + { + MessageBox.Show("Errors were encountered:\n" + errstr); + } + } + } + private void ExtractUncompressed() + { + if (MainListView.SelectedIndices.Count == 1) + { + var idx = MainListView.SelectedIndices[0]; + if ((idx < 0) || (idx >= CurrentFiles.Count)) return; + var file = CurrentFiles[idx]; + if (file.Folder == null) + { + byte[] data = GetFileData(file); + if (data == null) + { + MessageBox.Show("Unable to extract file: " + file.Path); + return; + } + SaveFileDialog.FileName = file.Name; if (SaveFileDialog.ShowDialog() == DialogResult.OK) { @@ -1551,6 +1639,13 @@ namespace CodeWalker } try { + RpfResourceFileEntry rrfe = file.File as RpfResourceFileEntry; + if (rrfe != null) //add resource header if this is a resource file. + { + data = ResourceBuilder.Compress(data); + data = ResourceBuilder.AddResourceHeader(rrfe, data); + } + File.WriteAllBytes(path, data); } catch (Exception ex) @@ -2056,6 +2151,11 @@ namespace CodeWalker ExtractRaw(); } + private void ListContextExtractUncompressedMenu_Click(object sender, EventArgs e) + { + ExtractUncompressed(); + } + private void ListContextExtractAllMenu_Click(object sender, EventArgs e) { ExtractAll(); diff --git a/ExploreForm.resx b/ExploreForm.resx index 2bcc009..8f03b52 100644 --- a/ExploreForm.resx +++ b/ExploreForm.resx @@ -258,16 +258,6 @@ GvZP7/3NqMHOyEACQlVVHxGjBiOpbdu1KIokGRDjZCqQj/3WzsPozi3L8oNTCXEyAqDv+93PykyM7hyb OEgy37QlAVUSCxs9tKCADeqLDGjzT4Gu676IErtUgaDbuTwDCUhYccAhyS2wicsjWZXIJ9R1vYsbPdjm ePJI4uQjAWAz8UYNxvNEhJNVrq7ziMzzN2pq/DDMhNNPcE6+bs69AUIIBqGH+5QgAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADVSURBVDhPpVIxDoMwDORJfQN7pI5hz1pmytSJ7/EFhrYZ - MqSVgDXlIhslaoga9aQTsn1nOyFVDsuynNd1HTe6gCPyJDnGJrpN0+T6vnd1Xe9EjDzqJP0GJkAkhIjM - TOSpSXoTrMmTu+7qHvene9m3/7aX1udRh44sMXBWnsZmJmKuQUeWGFiPRaGZKaXMN/hrg3meTygopbyo - 6A7IbIdh2KekmPwLR+amaaI4+Q6OzDiGMcafNWD8EnNmrbVFnaRppBr8bGaETYrNDG4CFpsZMJaZq+oD - NQar60zqQI0AAAAASUVORK5CYII= @@ -287,6 +277,16 @@ lVY67e7NJiI/2QxXrEetVVZsAY5938U5NzUbthbgknMW7735iOnYsB0AqBXXlJL5jOnYsDUBqA1uMcbh mYyuz6aAU/M9hKDP3GR0ffYegNrwXEpRADdZr5+aAlB7UAB3j1V/Anh1j1UD4Fub4YrN8HPL9gAVE1vf J6IiRgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADVSURBVDhPpVIxDoMwDORJfQN7pI5hz1pmytSJ7/EFhrYZ + MqSVgDXlIhslaoga9aQTsn1nOyFVDsuynNd1HTe6gCPyJDnGJrpN0+T6vnd1Xe9EjDzqJP0GJkAkhIjM + TOSpSXoTrMmTu+7qHvene9m3/7aX1udRh44sMXBWnsZmJmKuQUeWGFiPRaGZKaXMN/hrg3meTygopbyo + 6A7IbIdh2KekmPwLR+amaaI4+Q6OzDiGMcafNWD8EnNmrbVFnaRppBr8bGaETYrNDG4CFpsZMJaZq+oD + NQar60zqQI0AAAAASUVORK5CYII= @@ -300,7 +300,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADo - HwAAAk1TRnQBSQFMAgEBGAEAAZABAAGQAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + HwAAAk1TRnQBSQFMAgEBGAEAAZgBAAGYAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAAXADAAEBAQABCAYAARwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA diff --git a/Readme.txt b/Readme.txt index 08c0821..8eba5c9 100644 --- a/Readme.txt +++ b/Readme.txt @@ -74,6 +74,56 @@ CodeWalker.exe explorer Alternatively, run the CodeWalker Explorer batch file in the program's directory. +Main Toolbar: +------------- +The main toolbar is used to access most of the editing features in CodeWalker. Shortcuts for new, open and +create files are provided. The selection mode can be changed with the "pointer" button. Move, rotate and +scale buttons provide access to the different editing widget modes. +Other shortcuts on the toolbar include buttons to open the Selection Info window, and the Project window. +See the tooltips on the toolbar items for hints. + + +Project Window: +--------------- +The project window is the starting point for editing files in CodeWalker. Project files can be created, +and files can be added to them. It is recommended to create and save a project file before adding files +to be edited and saved. +The tree view displays the files in the current project, and their contents. + + +YMAP editing: +------------- +New YMAP files can be created via the project window, and existing ymap files can be edited. +To edit an existing single player YMAP, first change codewalker DLC level to patchday2ng, and enable DLC. +Open the toolbar, and enable Entity selection mode. Enable the Move widget with the toolbar Move button. +Open the project window with the toolbar button. Changes made while the project window is open are +automatically added to the project. +Select an entity to edit by right clicking when the entity is moused over, and its bounding box shown in +white. Move, rotate and/or scale the selected entity with the widget. When the first change is made, the +entity's YMAP will be added to the current project. If no project is open, a new one will be created. +The edited YMAP file can be saved to the drive using the File menu in the project window. +After saving the file, it needs to be added into the mods folder. Using OpenIV, find the existing YMAP +file using the search function (note: the correct path for the edited YMAP can be found in the selection +info window in CodeWalker, when an entity is selected, look for YMap>RpfFileEntry in the selection info +property grid). Replace the edited YMAP into a copy of the correct archive in the /mods folder. +Newly created YMAPs can be added to DLC archives in the same manner. + + +Traffic Paths (YND) editing: +---------------------------- +[TODO - write this!] + + +Train Tracks editing: +--------------------- +[TODO - write this!] + + +Scenario Regions (YMT) editing: +------------------------------- +[TODO: write this!] + + Regarding game files: (FYI) ----------------------------