├── .vs
└── N64noAAPatcher
│ └── v16
│ └── .suo
├── App.config
├── AppState.cs
├── Form1.Designer.cs
├── Form1.cs
├── Form1.resx
├── Interfaces
└── IRomConverter.cs
├── LICENSE
├── LinkedList.cs
├── N64Converter.cs
├── N64noAAPatcher.csproj
├── N64noAAPatcher.sln
├── PatchMachine.cs
├── Program.cs
├── Properties
├── AssemblyInfo.cs
├── Resources.Designer.cs
├── Resources.resx
├── Settings.Designer.cs
└── Settings.settings
├── README.md
├── bin
└── Debug
│ ├── System.Windows.Forms.TextBox,
│ └── additionals
│ ├── System.Windows.Forms.TextBox,
│ ├── rn64crc.exe
│ └── u64aap.exe
└── obj
└── Debug
├── .NETFramework,Version=v4.7.2.AssemblyAttributes.cs
├── DesignTimeResolveAssemblyReferences.cache
├── DesignTimeResolveAssemblyReferencesInput.cache
└── N64noAAPatcher.csproj.FileListAbsolute.txt
/.vs/N64noAAPatcher/v16/.suo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrdemkin/N64noAAPatcher/1608df466fac329258f8329c7a878abafb4caf19/.vs/N64noAAPatcher/v16/.suo
--------------------------------------------------------------------------------
/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/AppState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace N64noAAPatcher
8 | {
9 | public class AppState
10 | {
11 | enum States : short { Launch, FilesReady, AllReady, Running, Stopped }
12 |
13 | States CurrentState;
14 |
15 | public AppState() {
16 | this.CurrentState = States.Launch;
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Form1.Designer.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace N64noAAPatcher
3 | {
4 | partial class Form1
5 | {
6 | ///
7 | /// Обязательная переменная конструктора.
8 | ///
9 | private System.ComponentModel.IContainer components = null;
10 |
11 | ///
12 | /// Освободить все используемые ресурсы.
13 | ///
14 | /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
15 | protected override void Dispose(bool disposing)
16 | {
17 | if (disposing && (components != null))
18 | {
19 | components.Dispose();
20 | }
21 | base.Dispose(disposing);
22 | }
23 |
24 | #region Код, автоматически созданный конструктором форм Windows
25 |
26 | ///
27 | /// Требуемый метод для поддержки конструктора — не изменяйте
28 | /// содержимое этого метода с помощью редактора кода.
29 | ///
30 | private void InitializeComponent()
31 | {
32 | this.addFileBtn = new System.Windows.Forms.Button();
33 | this.chooseOutputBtn = new System.Windows.Forms.Button();
34 | this.outputPath = new System.Windows.Forms.TextBox();
35 | this.filesListView = new System.Windows.Forms.ListView();
36 | this.Start = new System.Windows.Forms.Button();
37 | this.RemoveFromListBtn = new System.Windows.Forms.Button();
38 | this.AddDirBtn = new System.Windows.Forms.Button();
39 | this.outputPathLabel = new System.Windows.Forms.Label();
40 | this.FilesTableLable = new System.Windows.Forms.Label();
41 | this.mainProgressBar = new System.Windows.Forms.ProgressBar();
42 | this.SuspendLayout();
43 | //
44 | // addFileBtn
45 | //
46 | this.addFileBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
47 | this.addFileBtn.Location = new System.Drawing.Point(545, 6);
48 | this.addFileBtn.Name = "addFileBtn";
49 | this.addFileBtn.Size = new System.Drawing.Size(75, 23);
50 | this.addFileBtn.TabIndex = 0;
51 | this.addFileBtn.Text = "Add file";
52 | this.addFileBtn.UseVisualStyleBackColor = true;
53 | this.addFileBtn.Click += new System.EventHandler(this.addFileBtn_Click);
54 | //
55 | // chooseOutputBtn
56 | //
57 | this.chooseOutputBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
58 | this.chooseOutputBtn.Location = new System.Drawing.Point(545, 35);
59 | this.chooseOutputBtn.Name = "chooseOutputBtn";
60 | this.chooseOutputBtn.Size = new System.Drawing.Size(75, 23);
61 | this.chooseOutputBtn.TabIndex = 1;
62 | this.chooseOutputBtn.Text = "Choose output";
63 | this.chooseOutputBtn.UseVisualStyleBackColor = true;
64 | this.chooseOutputBtn.Click += new System.EventHandler(this.chooseOutputBtn_Click);
65 | //
66 | // outputPath
67 | //
68 | this.outputPath.Location = new System.Drawing.Point(8, 38);
69 | this.outputPath.Name = "outputPath";
70 | this.outputPath.Size = new System.Drawing.Size(529, 20);
71 | this.outputPath.TabIndex = 2;
72 | //
73 | // filesListView
74 | //
75 | this.filesListView.HideSelection = false;
76 | this.filesListView.Location = new System.Drawing.Point(8, 92);
77 | this.filesListView.MultiSelect = false;
78 | this.filesListView.Name = "filesListView";
79 | this.filesListView.Size = new System.Drawing.Size(529, 199);
80 | this.filesListView.TabIndex = 3;
81 | this.filesListView.UseCompatibleStateImageBehavior = false;
82 | this.filesListView.View = System.Windows.Forms.View.List;
83 | //
84 | // Start
85 | //
86 | this.Start.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
87 | this.Start.Location = new System.Drawing.Point(545, 297);
88 | this.Start.Name = "Start";
89 | this.Start.Size = new System.Drawing.Size(75, 23);
90 | this.Start.TabIndex = 4;
91 | this.Start.Text = "Start";
92 | this.Start.UseVisualStyleBackColor = true;
93 | this.Start.Click += new System.EventHandler(this.startBtn_Click);
94 | //
95 | // RemoveFromListBtn
96 | //
97 | this.RemoveFromListBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
98 | this.RemoveFromListBtn.Location = new System.Drawing.Point(545, 92);
99 | this.RemoveFromListBtn.Name = "RemoveFromListBtn";
100 | this.RemoveFromListBtn.Size = new System.Drawing.Size(75, 23);
101 | this.RemoveFromListBtn.TabIndex = 5;
102 | this.RemoveFromListBtn.Text = "Remove";
103 | this.RemoveFromListBtn.UseVisualStyleBackColor = true;
104 | this.RemoveFromListBtn.Click += new System.EventHandler(this.RemoveFromList);
105 | //
106 | // AddDirBtn
107 | //
108 | this.AddDirBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
109 | this.AddDirBtn.Location = new System.Drawing.Point(454, 6);
110 | this.AddDirBtn.Name = "AddDirBtn";
111 | this.AddDirBtn.Size = new System.Drawing.Size(79, 23);
112 | this.AddDirBtn.TabIndex = 6;
113 | this.AddDirBtn.Text = "Add directory";
114 | this.AddDirBtn.UseVisualStyleBackColor = true;
115 | this.AddDirBtn.Click += new System.EventHandler(this.AddDirBtn_Click);
116 | //
117 | // outputPathLabel
118 | //
119 | this.outputPathLabel.AutoSize = true;
120 | this.outputPathLabel.Location = new System.Drawing.Point(6, 19);
121 | this.outputPathLabel.Name = "outputPathLabel";
122 | this.outputPathLabel.Size = new System.Drawing.Size(66, 13);
123 | this.outputPathLabel.TabIndex = 7;
124 | this.outputPathLabel.Text = "Output path:";
125 | //
126 | // FilesTableLable
127 | //
128 | this.FilesTableLable.AutoSize = true;
129 | this.FilesTableLable.Location = new System.Drawing.Point(6, 73);
130 | this.FilesTableLable.Name = "FilesTableLable";
131 | this.FilesTableLable.Size = new System.Drawing.Size(83, 13);
132 | this.FilesTableLable.TabIndex = 8;
133 | this.FilesTableLable.Text = "Files to process:";
134 | //
135 | // mainProgressBar
136 | //
137 | this.mainProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
138 | this.mainProgressBar.Location = new System.Drawing.Point(8, 297);
139 | this.mainProgressBar.Name = "mainProgressBar";
140 | this.mainProgressBar.Size = new System.Drawing.Size(529, 23);
141 | this.mainProgressBar.TabIndex = 9;
142 | //
143 | // Form1
144 | //
145 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
146 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
147 | this.ClientSize = new System.Drawing.Size(626, 334);
148 | this.Controls.Add(this.mainProgressBar);
149 | this.Controls.Add(this.FilesTableLable);
150 | this.Controls.Add(this.outputPathLabel);
151 | this.Controls.Add(this.AddDirBtn);
152 | this.Controls.Add(this.RemoveFromListBtn);
153 | this.Controls.Add(this.Start);
154 | this.Controls.Add(this.filesListView);
155 | this.Controls.Add(this.outputPath);
156 | this.Controls.Add(this.chooseOutputBtn);
157 | this.Controls.Add(this.addFileBtn);
158 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
159 | this.MaximizeBox = false;
160 | this.Name = "Form1";
161 | this.Text = "N64noAAPatcher v0.1";
162 | this.Load += new System.EventHandler(this.Form1_Load);
163 | this.ResumeLayout(false);
164 | this.PerformLayout();
165 |
166 | }
167 |
168 | #endregion
169 |
170 | private System.Windows.Forms.Button addFileBtn;
171 | private System.Windows.Forms.Button chooseOutputBtn;
172 | private System.Windows.Forms.TextBox outputPath;
173 | private System.Windows.Forms.ListView filesListView;
174 | private System.Windows.Forms.Button Start;
175 | private System.Windows.Forms.Button RemoveFromListBtn;
176 | private System.Windows.Forms.Button AddDirBtn;
177 | private System.Windows.Forms.Label outputPathLabel;
178 | private System.Windows.Forms.Label FilesTableLable;
179 | private System.Windows.Forms.ProgressBar mainProgressBar;
180 | }
181 | }
182 |
183 |
--------------------------------------------------------------------------------
/Form1.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Data;
5 | using System.Drawing;
6 | using System.IO;
7 | using System.Linq;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 | using System.Windows.Forms;
11 | using RomConverter;
12 |
13 | namespace N64noAAPatcher
14 | {
15 | public partial class Form1 : Form
16 | {
17 | bool isStarted, needDoJob;
18 | string lastAddFilePath;
19 | PatchMachine pMachine;
20 | public Form1()
21 | {
22 | if (!Init())
23 | {
24 | Application.Exit();
25 | }
26 | }
27 |
28 | private bool Init()
29 | {
30 | //init this in form? Great idea!
31 | //check additionals
32 | if (!File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "additionals\\u64aap.exe")))
33 | {
34 | MessageBox.Show($"u64aap not found at path: {Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "additionals\\u64aap.exe")}");
35 | return false;
36 | }
37 | if (!File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "additionals\\rn64crc.exe")))
38 | {
39 | MessageBox.Show($"rn64crc not found at path: {Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "additionals\\rn64crc.exe")}");
40 | return false;
41 | }
42 | this.needDoJob = true;
43 | this.isStarted = false;
44 | this.lastAddFilePath = string.Empty;
45 | InitializeComponent();
46 | //generate list
47 | pMachine = new PatchMachine();
48 | pMachine.OnFilesListChanged += FillTableFiles;
49 | pMachine.OnFilesListChanged += SetActiveStartBtn;
50 | SetActiveStartBtn();
51 | return true;
52 | }
53 |
54 | private void addFileBtn_Click(object sender, EventArgs e)
55 | {
56 | lastAddFilePath = chooseFileToAddDialog();
57 | if (string.IsNullOrEmpty(lastAddFilePath))
58 | {
59 | lastAddFilePath = string.Empty; return;
60 | }
61 | pMachine.AddFileToPatch(lastAddFilePath);
62 | }
63 |
64 | private void chooseOutputBtn_Click(object sender, EventArgs e)
65 | {
66 | string nextPath = chooseOutputPathDialog();
67 | if (string.IsNullOrEmpty(nextPath)) return;
68 | outputPath.Text = nextPath;
69 | }
70 |
71 | private void startBtn_Click(object sender, EventArgs e)
72 | {
73 | if (pMachine.GetFilesToPatch().Count > 0) StartJob();
74 | else
75 | {
76 | MessageBox.Show("Please add rom files first.");
77 | }
78 | }
79 |
80 | private string chooseFileToAddDialog()
81 | {
82 | string filePath = string.Empty;
83 | using (var openDialog = new OpenFileDialog())
84 | {
85 | openDialog.InitialDirectory = string.IsNullOrEmpty(lastAddFilePath) ? "c:\\" : lastAddFilePath;
86 | openDialog.Filter = "n64 files (*z64)|*.z64|All files (*.*)|*.*";
87 | openDialog.FilterIndex = 2;
88 | openDialog.RestoreDirectory = true;
89 |
90 | if (openDialog.ShowDialog() == DialogResult.OK)
91 | {
92 | filePath = openDialog.FileName;
93 |
94 | //for future inhouse path
95 | /*var fileStream = openFileDialog.OpenFile();
96 |
97 | using (StreamReader reader = new StreamReader(fileStream))
98 | {
99 | fileContent = reader.ReadToEnd();
100 | }*/
101 | }
102 | }
103 | return filePath;
104 | }
105 |
106 | private string chooseOutputPathDialog()
107 | {
108 |
109 | string outputPath = string.Empty;
110 | using (var openDialog = new FolderBrowserDialog())
111 | {
112 | DialogResult result = openDialog.ShowDialog();
113 |
114 | if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(openDialog.SelectedPath))
115 | {
116 | outputPath = openDialog.SelectedPath;
117 | }
118 | }
119 | return outputPath;
120 | }
121 |
122 | private void FillTableFiles()
123 | {
124 | filesListView.Items.Clear();
125 | //make it global variable
126 | ListViewItem[] lItems = new ListViewItem[pMachine.GetFilesToPatch().Count];
127 | for (int i = 0; i < pMachine.GetFilesToPatch().Count; i++)
128 | {
129 | lItems[i] = new ListViewItem(pMachine.GetFilesToPatch().ElementAt(i));
130 | }
131 |
132 | filesListView.Items.AddRange(lItems);
133 | /*if (filesListView.Items.Count > 0)
134 | {
135 | UnlockRemoveUI();
136 | }
137 | else
138 | {
139 | LockRemoveUI();
140 | }*/
141 | }
142 |
143 | private void SetActiveStartBtn()
144 | {
145 | if (pMachine == null) { this.Start.Enabled = false; return; }
146 | this.Start.Enabled = pMachine.GetFilesToPatch().Count > 0;
147 | }
148 |
149 | short progressCounter;
150 | private void StartJob()
151 | {
152 | if (isStarted)
153 | {
154 | this.isStarted = !this.isStarted;
155 | needDoJob = false;
156 | //TODO: STOP PROCESS
157 | }
158 | else
159 | {
160 | if (pMachine.GetFilesToPatch().Count == 0)
161 | {
162 | MessageBox.Show("Files to patch is empty! Add at least one file.");
163 | return;
164 | }
165 | if (string.IsNullOrEmpty(outputPath.Text))
166 | {
167 | MessageBox.Show("Output path is incorrect or empty.");
168 | return;
169 | }
170 | progressCounter = (short)pMachine.GetFilesToPatch().Count;
171 | mainProgressBar.Maximum = progressCounter;
172 | mainProgressBar.Minimum = 0;
173 | mainProgressBar.Value = 0;
174 | this.isStarted = !this.isStarted;
175 | LockUI();
176 | N64 converter = new N64();
177 | string baseTempPath = outputPath.Text;
178 | string newOutputPath = string.Empty;
179 | while (pMachine.GetFilesToPatch().Count > 0 && needDoJob)
180 | {
181 | if (!pMachine.isRunning)
182 | {
183 | RemoveLastFile(newOutputPath);
184 | string path = pMachine.GetNext();
185 | newOutputPath = Path.Combine(baseTempPath, $"{Path.GetFileNameWithoutExtension(path)}_temp.z64");
186 | converter.Convert(path, newOutputPath);
187 | pMachine.StartCmdProcess(CmdAppType.Patcher, $"-i \"{newOutputPath}\" -o \"{this.outputPath.Text}\\{Path.GetFileNameWithoutExtension(path)}_noAA.z64\"");
188 | pMachine.StartCmdProcess(CmdAppType.CRC, $"\"{this.outputPath.Text}\\{Path.GetFileNameWithoutExtension(path)}_noAA.z64\"");
189 | //pMachine.StartCmdProcess($"--df-off -i \"{newOutputPath}\" -o \"{this.outputPath.Text}\\{Path.GetFileNameWithoutExtension(path)}_noAA.z64\"");
190 | }
191 | mainProgressBar.Value = progressCounter - pMachine.GetFilesToPatch().Count;
192 | FillTableFiles();
193 | }
194 | RemoveLastFile(newOutputPath);
195 | SoftResetAppState();
196 | }
197 | /*foreach (var path in pMachine.GetFilesToPatch())
198 | {
199 | pMachine.StartCmdProcess($"--df-off -i {path} -o {this.outputPath.Text}\\{Path.GetFileNameWithoutExtension(path)}_noAA.z64");
200 | }*/
201 | }
202 |
203 | private void RemoveLastFile(string filePAth)
204 | {
205 | if (File.Exists(filePAth))
206 | {
207 | File.Delete(filePAth);
208 | }
209 | }
210 |
211 | private void RemoveFromList(object sender, EventArgs e)
212 | {
213 | if (pMachine.GetFilesToPatch().Count == 0) return;
214 | foreach (var lview in filesListView.SelectedIndices)
215 | {
216 | pMachine.RemoveFileFromPatch((int)lview);
217 | }
218 | }
219 |
220 | private void LockUI()
221 | {
222 | AddDirBtn.Enabled = false;
223 | outputPath.Enabled = false;
224 | addFileBtn.Enabled = false;
225 | chooseOutputBtn.Enabled = false;
226 | RemoveFromListBtn.Enabled = false;
227 | Start.Text = "Stop";
228 | }
229 |
230 |
231 | private void UnlockUI()
232 | {
233 | AddDirBtn.Enabled = true;
234 | outputPath.Enabled = true;
235 | addFileBtn.Enabled = true;
236 | chooseOutputBtn.Enabled = true;
237 | RemoveFromListBtn.Enabled = true;
238 | Start.Text = "Start";
239 | needDoJob = true;
240 | }
241 |
242 | private void LockRemoveUI()
243 | {
244 | RemoveFromListBtn.Enabled = false;
245 | }
246 |
247 | public void UnlockRemoveUI()
248 | {
249 | RemoveFromListBtn.Enabled = true;
250 | }
251 |
252 | private void SoftResetAppState()
253 | {
254 | this.isStarted = false;
255 | needDoJob = true;
256 | mainProgressBar.Value = 0;
257 | UnlockUI();
258 | }
259 |
260 | private void HardResetAppState()
261 | {
262 | //SoftResetAppState();
263 | }
264 |
265 | private void Form1_Load(object sender, EventArgs e)
266 | {
267 |
268 | }
269 |
270 | private void AddDirBtn_Click(object sender, EventArgs e)
271 | {
272 | string pathForSearch = chooseOutputPathDialog();
273 | //TODO: make this with search pattern
274 | var tempArray = Directory.GetFiles(pathForSearch, "*.z64", SearchOption.AllDirectories);
275 | List filesPathes = new List();
276 | filesPathes.AddRange(tempArray);
277 | tempArray = Directory.GetFiles(pathForSearch, "*.v64", SearchOption.AllDirectories);
278 | filesPathes.AddRange(tempArray);
279 | tempArray = Directory.GetFiles(pathForSearch, "*.n64", SearchOption.AllDirectories);
280 | filesPathes.AddRange(tempArray);
281 |
282 | foreach (var path in filesPathes)
283 | {
284 | pMachine.AddFileToPatch(path);
285 | }
286 | filesPathes.Clear();
287 | }
288 | }
289 | }
290 |
--------------------------------------------------------------------------------
/Form1.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
--------------------------------------------------------------------------------
/Interfaces/IRomConverter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace RomConverter
3 | {
4 | public interface IRomConverter
5 | {
6 | bool Convert(string inputPath, string outputPath);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 mrdemkin
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/LinkedList.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace N64noAAPatcher.Collections
8 | {
9 | class Node
10 | {
11 |
12 | }
13 | public class LinkedList
14 | {
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/N64Converter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 |
5 | namespace RomConverter
6 | {
7 | public class N64 : IRomConverter
8 | {
9 | enum RomType
10 | {
11 | n64, z64, v64, Unknown
12 | }
13 |
14 | public N64()
15 | {
16 | }
17 |
18 | private RomType GetRomFormat(string romHeader)
19 | {
20 | Console.WriteLine($"GetRomFormat: {romHeader}");
21 | switch (romHeader)
22 | {
23 | case "40-12-37-80":
24 | return RomType.n64;
25 | case "80-37-12-40":
26 | return RomType.z64;
27 | case "37-80-40-12":
28 | return RomType.v64;
29 | default:
30 | return RomType.Unknown;
31 | }
32 | }
33 |
34 | private byte[] ReadFullBytes(string inputFilePath)
35 | {
36 | return File.ReadAllBytes(inputFilePath);
37 | }
38 |
39 | private byte[] ReadFirstBytes(string inputFilePath, short bytesCount)
40 | {
41 | byte[] buffer = new byte[bytesCount];
42 | try
43 | {
44 | using (FileStream fs = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
45 | {
46 | var bytes_read = fs.Read(buffer, 0, buffer.Length);
47 | fs.Close();
48 |
49 | if (bytes_read != buffer.Length)
50 | {
51 | return null;
52 | }
53 | return buffer;
54 | }
55 | }
56 | catch (System.UnauthorizedAccessException ex)
57 | {
58 | Console.WriteLine(ex.Message);
59 | }
60 | return null;
61 | }
62 |
63 | private bool WriteBytesToPath(string outputPathFile, byte[] bytes)
64 | {
65 | bool result = true;
66 | try
67 | {
68 | File.WriteAllBytes(outputPathFile, bytes);
69 | /*using (FileStream fs = new FileStream(outputPathFile, FileMode.OpenOrCreate, FileAccess.Write))
70 | {
71 | fs.Write(bytes, 0, bytes.Length);
72 | fs.Close();
73 | }*/
74 | }
75 | catch (System.Exception ex)
76 | {
77 | Console.WriteLine(ex.Message);
78 | result = false;
79 | }
80 | return result;
81 | }
82 |
83 | ///
84 | /// For V64 to Z64
85 | ///
86 | ///
87 | private byte[] SwapWord(byte[] bytes)
88 | {
89 | for (int i = 0; i < bytes.Length; i += 2)
90 | SwapWord(bytes, i, i + 1);
91 |
92 | return bytes;
93 | }
94 |
95 | private byte[] SwapWord(byte[] bytes, int a, int b)
96 | {
97 | byte temp = bytes[a];
98 | bytes[a] = bytes[b];
99 | bytes[b] = temp;
100 | //(bytes[a], bytes[b]) = (bytes[b], bytes[a]);
101 |
102 | return bytes;
103 | }
104 |
105 | ///
106 | /// For N64 to Z64
107 | ///
108 | ///
109 | private byte[] SwapWordD(byte[] bytes)
110 | {
111 | for (int i = 0; i < bytes.Length; i += 4)
112 | {
113 | SwapWord(bytes, i, i + 3);
114 | SwapWord(bytes, i + 1, i + 2);
115 | }
116 |
117 | return bytes;
118 | }
119 |
120 | public bool Convert(string inputPath, string outputFilePath)
121 | {
122 | //check path
123 | //check rom format
124 | try
125 | {
126 | byte[] fullBytes = ReadFullBytes(inputPath);
127 | byte[] bytes = ReadFirstBytes(inputPath, 4);
128 | Console.WriteLine($"FULL: {fullBytes[0]}:{fullBytes[1]}:{fullBytes[2]}:{fullBytes[3]}");
129 | Console.WriteLine($"NOFU: {bytes[0]}:{bytes[1]}:{bytes[2]}:{bytes[3]}");
130 | if (bytes == null)
131 | {
132 | //unable to read file for some reason or file is shoter than 4 bytes
133 | return false;
134 | }
135 | RomType romType = GetRomFormat(BitConverter.ToString(bytes));
136 | switch (romType)
137 | {
138 | case RomType.Unknown:
139 | default:
140 | return false;
141 | case RomType.z64:
142 | //just copy file rom
143 | break;
144 | case RomType.n64:
145 | fullBytes = SwapWordD(fullBytes);
146 | break;
147 | case RomType.v64:
148 | fullBytes = SwapWord(fullBytes);
149 | break;
150 | }
151 | //return WriteBytesToPath(Path.Combine(outputPath, $"{Path.GetFileNameWithoutExtension(inputPath)}_temp.z64"), bytes);
152 | return WriteBytesToPath(outputFilePath, fullBytes);
153 | }
154 | catch (System.Exception e)
155 | {
156 | Console.WriteLine(e.Message);
157 | return false;
158 | }
159 | }
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/N64noAAPatcher.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {FDE5B870-7133-40C9-A0F9-D3723FBD1FE5}
8 | WinExe
9 | N64noAAPatcher
10 | N64noAAPatcher
11 | v4.7.2
12 | 512
13 | true
14 | true
15 |
16 |
17 | AnyCPU
18 | true
19 | full
20 | false
21 | bin\Debug\
22 | DEBUG;TRACE
23 | prompt
24 | 4
25 |
26 |
27 | AnyCPU
28 | pdbonly
29 | true
30 | bin\Release\
31 | TRACE
32 | prompt
33 | 4
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Form
52 |
53 |
54 | Form1.cs
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | Form1.cs
64 |
65 |
66 | ResXFileCodeGenerator
67 | Resources.Designer.cs
68 | Designer
69 |
70 |
71 | True
72 | Resources.resx
73 |
74 |
75 | SettingsSingleFileGenerator
76 | Settings.Designer.cs
77 |
78 |
79 | True
80 | Settings.settings
81 | True
82 |
83 |
84 |
85 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/N64noAAPatcher.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.31129.286
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "N64noAAPatcher", "N64noAAPatcher.csproj", "{FDE5B870-7133-40C9-A0F9-D3723FBD1FE5}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {FDE5B870-7133-40C9-A0F9-D3723FBD1FE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {FDE5B870-7133-40C9-A0F9-D3723FBD1FE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {FDE5B870-7133-40C9-A0F9-D3723FBD1FE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {FDE5B870-7133-40C9-A0F9-D3723FBD1FE5}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {F7B790E2-69E4-430E-8BFC-BB9947B88C28}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/PatchMachine.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Win32.SafeHandles;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Diagnostics;
5 | using System.IO;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace N64noAAPatcher
11 | {
12 | enum CmdAppType
13 | {
14 | Patcher, CRC
15 | }
16 |
17 | class PatchMachine
18 | {
19 | static System.Diagnostics.Process cmdProcess;
20 | SafeProcessHandle cmdHandle;
21 | public bool isRunning;
22 |
23 | public Action OnFilesListChanged;
24 | //private Queue filesToPatch;
25 | //for removing any items
26 | private List filesToPatch;
27 | public PatchMachine() {
28 | filesToPatch = new List();
29 | }
30 |
31 | public void AddFileToPatch(string path)
32 | {
33 | //if file exists
34 | filesToPatch.Add(path);
35 | OnFilesListChanged?.Invoke();
36 | }
37 |
38 | public void RemoveFileFromPatch(string path)
39 | {
40 | //if file exists
41 | filesToPatch.Remove(path);
42 | OnFilesListChanged?.Invoke();
43 | }
44 |
45 | public void RemoveFileFromPatch(int index)
46 | {
47 | //if file exists
48 | filesToPatch.RemoveAt(index);
49 | OnFilesListChanged?.Invoke();
50 | }
51 |
52 | public string GetNext()
53 | {
54 | var value = filesToPatch.First();
55 | filesToPatch.RemoveAt(0);
56 | return value;
57 | }
58 |
59 | public List GetFilesToPatch()
60 | {
61 | return this.filesToPatch;
62 | }
63 |
64 | public void StartCmdProcess(CmdAppType cmdType, string strCmdText)
65 | {
66 | switch (cmdType)
67 | {
68 | case CmdAppType.Patcher:
69 | StartConvertCmd(strCmdText);
70 | break;
71 | case CmdAppType.CRC:
72 | StartCrcCmd(strCmdText);
73 | break;
74 | }
75 | }
76 |
77 | private void StartCmdProcess(string arguments)
78 | {
79 | try
80 | {
81 | if (cmdProcess != null) StopCmdProcess();
82 | cmdProcess = new System.Diagnostics.Process();
83 | cmdProcess.StartInfo.FileName = "CMD.exe";
84 | cmdProcess.StartInfo.Arguments = arguments;
85 | cmdProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
86 | if (cmdProcess.Start())
87 | {
88 | cmdHandle = cmdProcess.SafeHandle;
89 | isRunning = true;
90 | }
91 | cmdProcess.WaitForExit(4000);
92 | StopCmdProcess();
93 | }
94 | catch (Exception e)
95 | {
96 | Console.WriteLine(e.Message);
97 | }
98 | }
99 |
100 | private void StartCrcCmd(string strCmdText)
101 | {
102 | StartCmdProcess($"/k cd {Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)}\\additionals && rn64crc.exe {strCmdText} -u");
103 | }
104 |
105 | private void StartConvertCmd(string strCmdText)
106 | {
107 | StartCmdProcess($"/k cd {Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)}\\additionals && u64aap.exe --df-off {strCmdText}");
108 | return;
109 | try
110 | {
111 | if (cmdProcess != null) StopCmdProcess();
112 | cmdProcess = new System.Diagnostics.Process();
113 | cmdProcess.StartInfo.FileName = "CMD.exe";
114 | cmdProcess.StartInfo.Arguments = $"/k cd {Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)}\\additionals && u64aap.exe {strCmdText}";
115 | cmdProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
116 | if (cmdProcess.Start())
117 | {
118 | cmdHandle = cmdProcess.SafeHandle;
119 | isRunning = true;
120 | }
121 | cmdProcess.WaitForExit(6000);
122 | StopCmdProcess();
123 | }
124 | catch (Exception e)
125 | {
126 | Console.WriteLine(e.Message);
127 | }
128 | }
129 |
130 | public void StopCmdProcess()
131 | {
132 | if (cmdProcess != null)
133 | {
134 | try
135 | {
136 | cmdProcess?.CloseMainWindow();
137 | cmdProcess?.Close();
138 | cmdProcess?.Dispose();
139 | cmdProcess = null;
140 | isRunning = false;
141 | }
142 | catch (Exception e)
143 | {
144 | Console.WriteLine($"Unable to stop CMD process: {e.Message}");
145 | cmdProcess = null;
146 | isRunning = false;
147 | }
148 |
149 | try
150 | {
151 | if (cmdHandle != null && !cmdHandle.IsClosed)
152 | {
153 | cmdHandle.Close();
154 | cmdHandle.Dispose();
155 | }
156 | }
157 | catch (Exception e)
158 | {
159 | Console.WriteLine($"Unable to dispose CMD descriptor: {e.Message}");
160 | cmdHandle = null;
161 | }
162 | }
163 | }
164 | }
165 | }
166 |
--------------------------------------------------------------------------------
/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using System.Windows.Forms;
6 |
7 | namespace N64noAAPatcher
8 | {
9 | static class Program
10 | {
11 | ///
12 | /// Главная точка входа для приложения.
13 | ///
14 | [STAThread]
15 | static void Main()
16 | {
17 | Application.EnableVisualStyles();
18 | Application.SetCompatibleTextRenderingDefault(false);
19 | Application.Run(new Form1());
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // Общие сведения об этой сборке предоставляются следующим набором
6 | // набора атрибутов. Измените значения этих атрибутов для изменения сведений,
7 | // связанных со сборкой.
8 | [assembly: AssemblyTitle("N64noAAPatcher")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("N64noAAPatcher")]
13 | [assembly: AssemblyCopyright("Copyright © 2021")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
18 | // для компонентов COM. Если необходимо обратиться к типу в этой сборке через
19 | // COM, следует установить атрибут ComVisible в TRUE для этого типа.
20 | [assembly: ComVisible(false)]
21 |
22 | // Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
23 | [assembly: Guid("fde5b870-7133-40c9-a0f9-d3723fbd1fe5")]
24 |
25 | // Сведения о версии сборки состоят из указанных ниже четырех значений:
26 | //
27 | // Основной номер версии
28 | // Дополнительный номер версии
29 | // Номер сборки
30 | // Редакция
31 | //
32 | // Можно задать все значения или принять номера сборки и редакции по умолчанию
33 | // используя "*", как показано ниже:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // Этот код создан программным средством.
4 | // Версия среды выполнения: 4.0.30319.42000
5 | //
6 | // Изменения в этом файле могут привести к неправильному поведению и будут утрачены, если
7 | // код создан повторно.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 |
12 | namespace N64noAAPatcher.Properties
13 | {
14 | ///
15 | /// Класс ресурсов со строгим типом для поиска локализованных строк и пр.
16 | ///
17 | // Этот класс был автоматически создан при помощи StronglyTypedResourceBuilder
18 | // класс с помощью таких средств, как ResGen или Visual Studio.
19 | // Для добавления или удаления члена измените файл .ResX, а затем перезапустите ResGen
20 | // с параметром /str или заново постройте свой VS-проект.
21 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
22 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
23 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
24 | internal class Resources
25 | {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources()
33 | {
34 | }
35 |
36 | ///
37 | /// Возврат кэшированного экземпляра ResourceManager, используемого этим классом.
38 | ///
39 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
40 | internal static global::System.Resources.ResourceManager ResourceManager
41 | {
42 | get
43 | {
44 | if ((resourceMan == null))
45 | {
46 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("N64noAAPatcher.Properties.Resources", typeof(Resources).Assembly);
47 | resourceMan = temp;
48 | }
49 | return resourceMan;
50 | }
51 | }
52 |
53 | ///
54 | /// Переопределяет свойство CurrentUICulture текущего потока для всех
55 | /// подстановки ресурсов с помощью этого класса ресурсов со строгим типом.
56 | ///
57 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
58 | internal static global::System.Globalization.CultureInfo Culture
59 | {
60 | get
61 | {
62 | return resourceCulture;
63 | }
64 | set
65 | {
66 | resourceCulture = value;
67 | }
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 |
12 | namespace N64noAAPatcher.Properties
13 | {
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
17 | {
18 |
19 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
20 |
21 | public static Settings Default
22 | {
23 | get
24 | {
25 | return defaultInstance;
26 | }
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # N64noAAPatcher
2 | Simple Windows app for patching any n64 ROM to disable AA
3 |
4 | ## Description
5 | I made this little app just to automate tasks that I need to do for several hundred ROM-files. I'm not sure if it will be useful to anyone. However, if there are requests, I can improve the application by adding features and fixing it.
6 |
7 | ## Features
8 | - Convert *.n64 and *.v64 to *.z64
9 | - Disable AA in ROM
10 | - Update checksum of ROM
11 | - Save result file
12 |
13 | ## Issues
14 | - Because all work in main thread, after click "Start" button UI no respond.
15 | - CLI-apps run just with timeout
16 | - Optimization needed
17 | - If some ROMs not in output path, then input ROM not compatible with noAA fix or something wrong with input ROM-file
18 |
19 | ## How to use
20 | - Run N64noAAPActher.exe
21 | - Add files or directory with files (subdirectories are allow)
22 | - Choose output path
23 | - Click "Start" button
24 | - Be patient ;)
--------------------------------------------------------------------------------
/bin/Debug/System.Windows.Forms.TextBox,:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrdemkin/N64noAAPatcher/1608df466fac329258f8329c7a878abafb4caf19/bin/Debug/System.Windows.Forms.TextBox,
--------------------------------------------------------------------------------
/bin/Debug/additionals/System.Windows.Forms.TextBox,:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrdemkin/N64noAAPatcher/1608df466fac329258f8329c7a878abafb4caf19/bin/Debug/additionals/System.Windows.Forms.TextBox,
--------------------------------------------------------------------------------
/bin/Debug/additionals/rn64crc.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrdemkin/N64noAAPatcher/1608df466fac329258f8329c7a878abafb4caf19/bin/Debug/additionals/rn64crc.exe
--------------------------------------------------------------------------------
/bin/Debug/additionals/u64aap.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrdemkin/N64noAAPatcher/1608df466fac329258f8329c7a878abafb4caf19/bin/Debug/additionals/u64aap.exe
--------------------------------------------------------------------------------
/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs:
--------------------------------------------------------------------------------
1 | //
2 | using System;
3 | using System.Reflection;
4 | [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
5 |
--------------------------------------------------------------------------------
/obj/Debug/DesignTimeResolveAssemblyReferences.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrdemkin/N64noAAPatcher/1608df466fac329258f8329c7a878abafb4caf19/obj/Debug/DesignTimeResolveAssemblyReferences.cache
--------------------------------------------------------------------------------
/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrdemkin/N64noAAPatcher/1608df466fac329258f8329c7a878abafb4caf19/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
--------------------------------------------------------------------------------
/obj/Debug/N64noAAPatcher.csproj.FileListAbsolute.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mrdemkin/N64noAAPatcher/1608df466fac329258f8329c7a878abafb4caf19/obj/Debug/N64noAAPatcher.csproj.FileListAbsolute.txt
--------------------------------------------------------------------------------