├── .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 --------------------------------------------------------------------------------