├── .gitattributes ├── .gitignore ├── LanguageFiles └── zh_cn.lang ├── README.md ├── TeconMoon's WiiVC Injector.sln ├── TeconMoon's WiiVC Injector ├── App.config ├── Build.cs ├── BuildBatch.cs ├── BuildEvent.cs ├── BuildSource.cs ├── BuildSpawn.cs ├── BuildStep.cs ├── BuildSystemType.cs ├── Form1.Designer.cs ├── Form1.cs ├── Form1.resx ├── Form2.Designer.cs ├── Form2.cs ├── Form2.resx ├── LogLevels.cs ├── Program.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ ├── Settings.settings │ └── app.manifest ├── Resources │ ├── TOOLDIR.zip │ ├── autoscroll.png │ ├── clearbuildoutput.png │ ├── gc.ttf │ ├── ids.csv │ ├── universal_Wii_WiiWare_template_bootTvTex.png │ ├── universal_Wii_WiiWare_template_iconTex.png │ ├── wii.ttf │ └── wiiware.png ├── SplitButton.cs ├── TeconMoon's WiiVC Injector.csproj ├── Tga.cs ├── Trt.cs ├── Utils.cs ├── WiiU.ico └── Win32Native.cs └── nintendontvalues.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | project.fragment.lock.json 46 | artifacts/ 47 | 48 | *_i.c 49 | *_p.c 50 | *_i.h 51 | *.ilk 52 | *.meta 53 | *.obj 54 | *.pch 55 | *.pdb 56 | *.pgc 57 | *.pgd 58 | *.rsp 59 | *.sbr 60 | *.tlb 61 | *.tli 62 | *.tlh 63 | *.tmp 64 | *.tmp_proj 65 | *.log 66 | *.vspscc 67 | *.vssscc 68 | .builds 69 | *.pidb 70 | *.svclog 71 | *.scc 72 | 73 | # Chutzpah Test files 74 | _Chutzpah* 75 | 76 | # Visual C++ cache files 77 | ipch/ 78 | *.aps 79 | *.ncb 80 | *.opendb 81 | *.opensdf 82 | *.sdf 83 | *.cachefile 84 | *.VC.db 85 | *.VC.VC.opendb 86 | 87 | # Visual Studio profiler 88 | *.psess 89 | *.vsp 90 | *.vspx 91 | *.sap 92 | 93 | # TFS 2012 Local Workspace 94 | $tf/ 95 | 96 | # Guidance Automation Toolkit 97 | *.gpState 98 | 99 | # ReSharper is a .NET coding add-in 100 | _ReSharper*/ 101 | *.[Rr]e[Ss]harper 102 | *.DotSettings.user 103 | 104 | # JustCode is a .NET coding add-in 105 | .JustCode 106 | 107 | # TeamCity is a build add-in 108 | _TeamCity* 109 | 110 | # DotCover is a Code Coverage Tool 111 | *.dotCover 112 | 113 | # NCrunch 114 | _NCrunch_* 115 | .*crunch*.local.xml 116 | nCrunchTemp_* 117 | 118 | # MightyMoose 119 | *.mm.* 120 | AutoTest.Net/ 121 | 122 | # Web workbench (sass) 123 | .sass-cache/ 124 | 125 | # Installshield output folder 126 | [Ee]xpress/ 127 | 128 | # DocProject is a documentation generator add-in 129 | DocProject/buildhelp/ 130 | DocProject/Help/*.HxT 131 | DocProject/Help/*.HxC 132 | DocProject/Help/*.hhc 133 | DocProject/Help/*.hhk 134 | DocProject/Help/*.hhp 135 | DocProject/Help/Html2 136 | DocProject/Help/html 137 | 138 | # Click-Once directory 139 | publish/ 140 | 141 | # Publish Web Output 142 | *.[Pp]ublish.xml 143 | *.azurePubxml 144 | # TODO: Comment the next line if you want to checkin your web deploy settings 145 | # but database connection strings (with potential passwords) will be unencrypted 146 | #*.pubxml 147 | *.publishproj 148 | 149 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 150 | # checkin your Azure Web App publish settings, but sensitive information contained 151 | # in these scripts will be unencrypted 152 | PublishScripts/ 153 | 154 | # NuGet Packages 155 | *.nupkg 156 | # The packages folder can be ignored because of Package Restore 157 | **/packages/* 158 | # except build/, which is used as an MSBuild target. 159 | !**/packages/build/ 160 | # Uncomment if necessary however generally it will be regenerated when needed 161 | #!**/packages/repositories.config 162 | # NuGet v3's project.json files produces more ignoreable files 163 | *.nuget.props 164 | *.nuget.targets 165 | 166 | # Microsoft Azure Build Output 167 | csx/ 168 | *.build.csdef 169 | 170 | # Microsoft Azure Emulator 171 | ecf/ 172 | rcf/ 173 | 174 | # Windows Store app package directories and files 175 | AppPackages/ 176 | BundleArtifacts/ 177 | Package.StoreAssociation.xml 178 | _pkginfo.txt 179 | 180 | # Visual Studio cache files 181 | # files ending in .cache can be ignored 182 | *.[Cc]ache 183 | # but keep track of directories ending in .cache 184 | !*.[Cc]ache/ 185 | 186 | # Others 187 | ClientBin/ 188 | ~$* 189 | *~ 190 | *.dbmdl 191 | *.dbproj.schemaview 192 | *.jfm 193 | *.pfx 194 | *.publishsettings 195 | node_modules/ 196 | orleans.codegen.cs 197 | 198 | # Since there are multiple workflows, uncomment next line to ignore bower_components 199 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 200 | #bower_components/ 201 | 202 | # RIA/Silverlight projects 203 | Generated_Code/ 204 | 205 | # Backup & report files from converting an old project file 206 | # to a newer Visual Studio version. Backup files are not needed, 207 | # because we have git ;-) 208 | _UpgradeReport_Files/ 209 | Backup*/ 210 | UpgradeLog*.XML 211 | UpgradeLog*.htm 212 | 213 | # SQL Server files 214 | *.mdf 215 | *.ldf 216 | 217 | # Business Intelligence projects 218 | *.rdl.data 219 | *.bim.layout 220 | *.bim_*.settings 221 | 222 | # Microsoft Fakes 223 | FakesAssemblies/ 224 | 225 | # GhostDoc plugin setting file 226 | *.GhostDoc.xml 227 | 228 | # Node.js Tools for Visual Studio 229 | .ntvs_analysis.dat 230 | 231 | # Visual Studio 6 build log 232 | *.plg 233 | 234 | # Visual Studio 6 workspace options file 235 | *.opt 236 | 237 | # Visual Studio LightSwitch build output 238 | **/*.HTMLClient/GeneratedArtifacts 239 | **/*.DesktopClient/GeneratedArtifacts 240 | **/*.DesktopClient/ModelManifest.xml 241 | **/*.Server/GeneratedArtifacts 242 | **/*.Server/ModelManifest.xml 243 | _Pvt_Extensions 244 | 245 | # Paket dependency manager 246 | .paket/paket.exe 247 | paket-files/ 248 | 249 | # FAKE - F# Make 250 | .fake/ 251 | 252 | # JetBrains Rider 253 | .idea/ 254 | *.sln.iml 255 | 256 | # CodeRush 257 | .cr/ 258 | 259 | # Python Tools for Visual Studio (PTVS) 260 | __pycache__/ 261 | *.pyc -------------------------------------------------------------------------------- /LanguageFiles/zh_cn.lang: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/LanguageFiles/zh_cn.lang -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TeconMoon-s-WiiVC-Injector-Mod 2 | TeconMoon's WiiVC Injector Mod is a modification version of TeconMoon's WiiVC Injector which is created by TeconMoon(GBAtemp.net) originally. 3 | 4 | The original release post is https://gbatemp.net/threads/release-wiivc-injector-script-gc-wii-homebrew-support.483577/. 5 | 6 | Many thanks to TeconMoon for this great work and sharing. 7 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26730.16 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TeconMoon's WiiVC Injector", "TeconMoon's WiiVC Injector\TeconMoon's WiiVC Injector.csproj", "{8228DC31-4869-4C1C-8AED-D7ED37ECF3B9}" 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 | {8228DC31-4869-4C1C-8AED-D7ED37ECF3B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {8228DC31-4869-4C1C-8AED-D7ED37ECF3B9}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {8228DC31-4869-4C1C-8AED-D7ED37ECF3B9}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {8228DC31-4869-4C1C-8AED-D7ED37ECF3B9}.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 = {03A3BE64-2666-450F-A28D-333D71299683} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/BuildBatch.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Linq; 3 | using System.Windows.Forms; 4 | using TeconMoon_s_WiiVC_Injector.Utils.Build; 5 | 6 | namespace TeconMoon_s_WiiVC_Injector 7 | { 8 | partial class WiiVC_Injector 9 | { 10 | private void BatchBuild() 11 | { 12 | if (!Program.BatchBuildList.Any()) 13 | { 14 | return; 15 | } 16 | 17 | if (IsBuilding) 18 | { 19 | Program.BatchBuildList.Clear(); 20 | return; 21 | } 22 | 23 | BuildOutput.ResetText(); 24 | 25 | BatchBuildSucceedList.Clear(); 26 | BatchBuildFailedList.Clear(); 27 | BatchBuildInvalidList.Clear(); 28 | BatchBuildSkippedList.Clear(); 29 | 30 | PreBuild = (s, e) => 31 | { 32 | BuildOutput.ResetText(); 33 | PrintBuildOverview(); 34 | }; 35 | 36 | PostBuild += WiiVC_Injector_PostBuild; 37 | 38 | PromptForSucceed = false; 39 | BatchBuildNext(); 40 | } 41 | 42 | private bool BatchBuildCurrent() 43 | { 44 | // Switch to Source Files Tab. 45 | MainTabs.SelectedIndex = MainTabs.TabPages.IndexOfKey("SourceFilesTab"); 46 | 47 | // Auto generate images. 48 | GenerateImage.PerformClick(); 49 | 50 | // Switch to Build Tab. 51 | MainTabs.SelectedIndex = MainTabs.TabPages.IndexOfKey("BuildTab"); 52 | 53 | // Check if everything is ready. 54 | if (TheBigOneTM.Enabled && !IsBuilding) 55 | { 56 | // Ready to rumble. :) 57 | return BuildAnsync(); 58 | } 59 | 60 | return false; 61 | } 62 | 63 | private void BatchBuildNext() 64 | { 65 | while (Program.BatchBuildList.Any()) 66 | { 67 | string game = Program.BatchBuildList[0]; 68 | 69 | // Search for second disc 70 | if (GCRetail.Checked) 71 | { 72 | string[] discs = SearchGCDiscs(game); 73 | game = discs[0]; 74 | if (discs.Length > 1) 75 | { 76 | OpenGC2.FileName = discs[1]; 77 | SelectGC2Source(discs[1]); 78 | } 79 | } 80 | 81 | if (SelectGameSource(game, true)) 82 | { 83 | if (Directory.Exists(GetOutputFolder())) 84 | { 85 | AppendBuildOutput( 86 | string.Format( 87 | Trt.Tr("Title output folder already exists: {0}\nSkipping: {1}.\n"), 88 | GetOutputFolder(), game), 89 | BuildOutputType.Error); 90 | 91 | BatchBuildSkippedList.Add(game); 92 | Program.BatchBuildList.RemoveAt(0); 93 | continue; 94 | } 95 | else 96 | { 97 | BatchBuildCurrent(); 98 | PreBuild = null; 99 | break; 100 | } 101 | } 102 | 103 | AppendBuildOutput( 104 | string.Format(Trt.Tr("Invalid Title: {0}.\n"), game), 105 | BuildOutputType.Error); 106 | 107 | BatchBuildInvalidList.Add(game); 108 | Program.BatchBuildList.RemoveAt(0); 109 | } 110 | 111 | if (!Program.BatchBuildList.Any()) 112 | { 113 | PostBuild -= WiiVC_Injector_PostBuild; 114 | 115 | if (!InClosing) 116 | { 117 | MessageBox.Show(string.Format( 118 | Trt.Tr("All conversions have been completed.\nSucceed: {0}.\nFailed: {1}.\nSkipped: {2}.\nInvalid: {3}."), 119 | BatchBuildSucceedList.Count, 120 | BatchBuildFailedList.Count, 121 | BatchBuildSkippedList.Count, 122 | BatchBuildInvalidList.Count)); 123 | } 124 | } 125 | } 126 | 127 | private void WiiVC_Injector_PostBuild(object sender, bool e) 128 | { 129 | if (e) 130 | { 131 | BatchBuildSucceedList.Add(Program.BatchBuildList[0]); 132 | } 133 | else 134 | { 135 | BatchBuildFailedList.Add(Program.BatchBuildList[0]); 136 | } 137 | 138 | Program.BatchBuildList.RemoveAt(0); 139 | 140 | if (LastBuildCancelled) 141 | { 142 | BatchBuildSkippedList.AddRange(Program.BatchBuildList); 143 | Program.BatchBuildList.Clear(); 144 | } 145 | 146 | BatchBuildNext(); 147 | } 148 | } 149 | } -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/BuildEvent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TeconMoon_s_WiiVC_Injector 4 | { 5 | partial class WiiVC_Injector 6 | { 7 | private event EventHandler PreBuild; 8 | private event EventHandler PostBuild; 9 | } 10 | } -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/BuildSource.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 TeconMoon_s_WiiVC_Injector 8 | { 9 | partial class WiiVC_Injector 10 | { 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/BuildSpawn.cs: -------------------------------------------------------------------------------- 1 | using LogLevels; 2 | using System; 3 | using System.Diagnostics; 4 | using TeconMoon_s_WiiVC_Injector.Utils.Build; 5 | 6 | namespace TeconMoon_s_WiiVC_Injector 7 | { 8 | partial class WiiVC_Injector 9 | { 10 | public string SpawnFile { get; set; } 11 | public string SpawnArgs { get; set; } 12 | 13 | private bool BuildSpawn() 14 | { 15 | bool exitNormally = true; 16 | 17 | ProcessStartInfo spawnInfo = new ProcessStartInfo(SpawnFile, SpawnArgs); 18 | 19 | if (HideProcess) 20 | { 21 | spawnInfo.CreateNoWindow = true; 22 | spawnInfo.WindowStyle = ProcessWindowStyle.Hidden; 23 | } 24 | 25 | spawnInfo.UseShellExecute = false; 26 | spawnInfo.RedirectStandardOutput = true; 27 | spawnInfo.RedirectStandardError = true; 28 | 29 | BuildOutputBuffer buildOutputBuffer = new BuildOutputBuffer(); 30 | buildOutputBuffer.FlushBuffer += (s, e) => 31 | { 32 | BeginInvoke(ActBuildOutput, e); 33 | }; 34 | 35 | if (currentLogLevel <= LogLevel.Debug) 36 | { 37 | BeginInvoke(ActBuildOutput, new BuildOutputItem() 38 | { 39 | Output = Trt.Tr("Executing:") + ' ' + SpawnFile + Environment.NewLine 40 | + Trt.Tr("Args:") + ' ' + SpawnArgs + Environment.NewLine, 41 | OutputType = BuildOutputType.Exec 42 | }); 43 | } 44 | 45 | try 46 | { 47 | Process spawner = Process.Start(spawnInfo); 48 | System.Timers.Timer OutputPumpTimer = new System.Timers.Timer(); 49 | 50 | spawner.OutputDataReceived += (s, d) => 51 | { 52 | if (currentLogLevel <= LogLevel.Debug) 53 | { 54 | lock (buildOutputBuffer) 55 | { 56 | buildOutputBuffer.AppendOutput(d.Data, BuildOutputType.Normal); 57 | } 58 | } 59 | }; 60 | 61 | spawner.ErrorDataReceived += (s, d) => 62 | { 63 | // 64 | // Whatever, the error information should be printed. 65 | // 66 | lock (buildOutputBuffer) 67 | { 68 | buildOutputBuffer.AppendOutput(d.Data, BuildOutputType.Error); 69 | } 70 | }; 71 | 72 | OutputPumpTimer.Interval = 100; 73 | OutputPumpTimer.Elapsed += (sender, e) => 74 | { 75 | lock (buildOutputBuffer) 76 | { 77 | buildOutputBuffer.Flush(); 78 | } 79 | }; 80 | OutputPumpTimer.Start(); 81 | 82 | spawner.BeginOutputReadLine(); 83 | spawner.BeginErrorReadLine(); 84 | 85 | while (!spawner.WaitForExit(500)) 86 | { 87 | if (LastBuildCancelled) 88 | { 89 | spawner.CloseMainWindow(); 90 | if (!spawner.WaitForExit(100)) 91 | { 92 | spawner.Kill(); 93 | } 94 | 95 | exitNormally = false; 96 | } 97 | } 98 | 99 | OutputPumpTimer.Stop(); 100 | 101 | spawner.Close(); 102 | 103 | lock (buildOutputBuffer) 104 | { 105 | buildOutputBuffer.Flush(); 106 | } 107 | } 108 | catch (Exception ex) 109 | { 110 | Console.WriteLine("BuildSpawn exception: " + ex.Message); 111 | 112 | if (ThrowProcessException) 113 | { 114 | throw ex; 115 | } 116 | 117 | exitNormally = false; 118 | } 119 | 120 | if (!exitNormally && ThrowProcessException) 121 | { 122 | throw new Exception(NormalizeCmdlineArg(SpawnFile) 123 | + Trt.Tr(" does not exit normally.")); 124 | } 125 | 126 | return exitNormally; 127 | } 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/BuildStep.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 TeconMoon_s_WiiVC_Injector 8 | { 9 | class BuildStep 10 | { 11 | public delegate bool BuildAction(); 12 | 13 | public BuildAction Action { get; set; } 14 | public string Description { get; set; } 15 | public int ProgressWeight { get; set; } 16 | 17 | public bool Execute() 18 | { 19 | return Action(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/BuildSystemType.cs: -------------------------------------------------------------------------------- 1 | namespace TeconMoon_s_WiiVC_Injector 2 | { 3 | enum BuildSystemType 4 | { 5 | wii, 6 | gcn, 7 | dol, 8 | wiiware, 9 | }; 10 | } -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Form2.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace TeconMoon_s_WiiVC_Injector 2 | { 3 | partial class SDCardMenu 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SDCardMenu)); 32 | this.DriveBox = new System.Windows.Forms.ComboBox(); 33 | this.SDCardText = new System.Windows.Forms.Label(); 34 | this.ReloadDrives = new System.Windows.Forms.Button(); 35 | this.NintendontUpdate = new System.Windows.Forms.Button(); 36 | this.ActionStatus = new System.Windows.Forms.Label(); 37 | this.GenerateConfig = new System.Windows.Forms.Button(); 38 | this.LanguageBox = new System.Windows.Forms.ComboBox(); 39 | this.LanguageText = new System.Windows.Forms.Label(); 40 | this.VideoText = new System.Windows.Forms.Label(); 41 | this.VideoForceMode = new System.Windows.Forms.ComboBox(); 42 | this.VideoTypeMode = new System.Windows.Forms.ComboBox(); 43 | this.VideoWidth = new System.Windows.Forms.TrackBar(); 44 | this.VideoWidthText = new System.Windows.Forms.Label(); 45 | this.WidthNumber = new System.Windows.Forms.Label(); 46 | this.MemcardText = new System.Windows.Forms.Label(); 47 | this.MemcardBlocks = new System.Windows.Forms.ComboBox(); 48 | this.MemcardMulti = new System.Windows.Forms.CheckBox(); 49 | this.NintendontOptions = new System.Windows.Forms.CheckedListBox(); 50 | this.Format = new System.Windows.Forms.LinkLabel(); 51 | ((System.ComponentModel.ISupportInitialize)(this.VideoWidth)).BeginInit(); 52 | this.SuspendLayout(); 53 | // 54 | // DriveBox 55 | // 56 | this.DriveBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 57 | this.DriveBox.FormattingEnabled = true; 58 | this.DriveBox.Location = new System.Drawing.Point(15, 29); 59 | this.DriveBox.Name = "DriveBox"; 60 | this.DriveBox.Size = new System.Drawing.Size(253, 26); 61 | this.DriveBox.TabIndex = 0; 62 | this.DriveBox.SelectedIndexChanged += new System.EventHandler(this.DriveBox_SelectedIndexChanged); 63 | // 64 | // SDCardText 65 | // 66 | this.SDCardText.Location = new System.Drawing.Point(12, 9); 67 | this.SDCardText.Name = "SDCardText"; 68 | this.SDCardText.Size = new System.Drawing.Size(145, 17); 69 | this.SDCardText.TabIndex = 1; 70 | this.SDCardText.Text = "Choose your SD Card"; 71 | // 72 | // ReloadDrives 73 | // 74 | this.ReloadDrives.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 75 | this.ReloadDrives.Location = new System.Drawing.Point(15, 65); 76 | this.ReloadDrives.Name = "ReloadDrives"; 77 | this.ReloadDrives.Size = new System.Drawing.Size(174, 33); 78 | this.ReloadDrives.TabIndex = 2; 79 | this.ReloadDrives.Text = "Reload Drive List"; 80 | this.ReloadDrives.UseVisualStyleBackColor = true; 81 | this.ReloadDrives.Click += new System.EventHandler(this.ReloadDrives_Click); 82 | // 83 | // NintendontUpdate 84 | // 85 | this.NintendontUpdate.AutoSize = true; 86 | this.NintendontUpdate.Location = new System.Drawing.Point(15, 141); 87 | this.NintendontUpdate.Name = "NintendontUpdate"; 88 | this.NintendontUpdate.Size = new System.Drawing.Size(472, 28); 89 | this.NintendontUpdate.TabIndex = 4; 90 | this.NintendontUpdate.Text = "Download Latest Nintendont from GitHub"; 91 | this.NintendontUpdate.UseVisualStyleBackColor = true; 92 | this.NintendontUpdate.Click += new System.EventHandler(this.NintendontUpdate_Click); 93 | // 94 | // ActionStatus 95 | // 96 | this.ActionStatus.Location = new System.Drawing.Point(16, 108); 97 | this.ActionStatus.Name = "ActionStatus"; 98 | this.ActionStatus.Size = new System.Drawing.Size(471, 30); 99 | this.ActionStatus.TabIndex = 5; 100 | this.ActionStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 101 | // 102 | // GenerateConfig 103 | // 104 | this.GenerateConfig.AutoSize = true; 105 | this.GenerateConfig.Location = new System.Drawing.Point(15, 179); 106 | this.GenerateConfig.Name = "GenerateConfig"; 107 | this.GenerateConfig.Size = new System.Drawing.Size(472, 28); 108 | this.GenerateConfig.TabIndex = 7; 109 | this.GenerateConfig.Text = "Generate Nintendont Config File (nincfg.bin)"; 110 | this.GenerateConfig.UseVisualStyleBackColor = true; 111 | this.GenerateConfig.Click += new System.EventHandler(this.GenerateConfig_Click); 112 | // 113 | // LanguageBox 114 | // 115 | this.LanguageBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 116 | this.LanguageBox.FormattingEnabled = true; 117 | this.LanguageBox.Items.AddRange(new object[] { 118 | "Automatic", 119 | "English", 120 | "German", 121 | "French", 122 | "Spanish", 123 | "Italian", 124 | "Dutch"}); 125 | this.LanguageBox.Location = new System.Drawing.Point(12, 544); 126 | this.LanguageBox.Name = "LanguageBox"; 127 | this.LanguageBox.Size = new System.Drawing.Size(231, 26); 128 | this.LanguageBox.TabIndex = 8; 129 | // 130 | // LanguageText 131 | // 132 | this.LanguageText.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 133 | this.LanguageText.Location = new System.Drawing.Point(12, 511); 134 | this.LanguageText.Name = "LanguageText"; 135 | this.LanguageText.Size = new System.Drawing.Size(231, 25); 136 | this.LanguageText.TabIndex = 9; 137 | this.LanguageText.Text = "Language"; 138 | this.LanguageText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 139 | // 140 | // VideoText 141 | // 142 | this.VideoText.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 143 | this.VideoText.Location = new System.Drawing.Point(256, 402); 144 | this.VideoText.Name = "VideoText"; 145 | this.VideoText.Size = new System.Drawing.Size(231, 33); 146 | this.VideoText.TabIndex = 11; 147 | this.VideoText.Text = "Video Mode"; 148 | this.VideoText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 149 | // 150 | // VideoForceMode 151 | // 152 | this.VideoForceMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 153 | this.VideoForceMode.FormattingEnabled = true; 154 | this.VideoForceMode.Items.AddRange(new object[] { 155 | "Auto", 156 | "Force", 157 | "Force (Deflicker)", 158 | "None"}); 159 | this.VideoForceMode.Location = new System.Drawing.Point(256, 436); 160 | this.VideoForceMode.Name = "VideoForceMode"; 161 | this.VideoForceMode.Size = new System.Drawing.Size(231, 26); 162 | this.VideoForceMode.TabIndex = 10; 163 | this.VideoForceMode.SelectedIndexChanged += new System.EventHandler(this.VideoForceMode_SelectedIndexChanged); 164 | // 165 | // VideoTypeMode 166 | // 167 | this.VideoTypeMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 168 | this.VideoTypeMode.FormattingEnabled = true; 169 | this.VideoTypeMode.Items.AddRange(new object[] { 170 | "Auto", 171 | "NTSC", 172 | "MPAL", 173 | "PAL50", 174 | "PAL60"}); 175 | this.VideoTypeMode.Location = new System.Drawing.Point(256, 463); 176 | this.VideoTypeMode.Name = "VideoTypeMode"; 177 | this.VideoTypeMode.Size = new System.Drawing.Size(231, 26); 178 | this.VideoTypeMode.TabIndex = 12; 179 | this.VideoTypeMode.SelectedIndexChanged += new System.EventHandler(this.VideoTypeMode_SelectedIndexChanged); 180 | // 181 | // VideoWidth 182 | // 183 | this.VideoWidth.AutoSize = false; 184 | this.VideoWidth.BackColor = System.Drawing.SystemColors.Control; 185 | this.VideoWidth.Enabled = false; 186 | this.VideoWidth.LargeChange = 10; 187 | this.VideoWidth.Location = new System.Drawing.Point(256, 546); 188 | this.VideoWidth.Maximum = 720; 189 | this.VideoWidth.Minimum = 640; 190 | this.VideoWidth.Name = "VideoWidth"; 191 | this.VideoWidth.Size = new System.Drawing.Size(231, 26); 192 | this.VideoWidth.SmallChange = 2; 193 | this.VideoWidth.TabIndex = 13; 194 | this.VideoWidth.TickFrequency = 2; 195 | this.VideoWidth.Value = 640; 196 | this.VideoWidth.Scroll += new System.EventHandler(this.VideoWidth_Scroll); 197 | // 198 | // VideoWidthText 199 | // 200 | this.VideoWidthText.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 201 | this.VideoWidthText.Enabled = false; 202 | this.VideoWidthText.Location = new System.Drawing.Point(256, 490); 203 | this.VideoWidthText.Name = "VideoWidthText"; 204 | this.VideoWidthText.Size = new System.Drawing.Size(231, 30); 205 | this.VideoWidthText.TabIndex = 14; 206 | this.VideoWidthText.Text = "Video Width"; 207 | this.VideoWidthText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 208 | // 209 | // WidthNumber 210 | // 211 | this.WidthNumber.Location = new System.Drawing.Point(256, 521); 212 | this.WidthNumber.Name = "WidthNumber"; 213 | this.WidthNumber.Size = new System.Drawing.Size(231, 24); 214 | this.WidthNumber.TabIndex = 15; 215 | this.WidthNumber.Text = "Auto"; 216 | this.WidthNumber.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 217 | // 218 | // MemcardText 219 | // 220 | this.MemcardText.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 221 | this.MemcardText.Enabled = false; 222 | this.MemcardText.Location = new System.Drawing.Point(12, 402); 223 | this.MemcardText.Name = "MemcardText"; 224 | this.MemcardText.Size = new System.Drawing.Size(231, 33); 225 | this.MemcardText.TabIndex = 16; 226 | this.MemcardText.Text = "Memcard Blocks"; 227 | this.MemcardText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 228 | // 229 | // MemcardBlocks 230 | // 231 | this.MemcardBlocks.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 232 | this.MemcardBlocks.Enabled = false; 233 | this.MemcardBlocks.FormattingEnabled = true; 234 | this.MemcardBlocks.Items.AddRange(new object[] { 235 | "59", 236 | "123", 237 | "251", 238 | "507 (Unstable)", 239 | "1019 (Unstable)", 240 | "2043 (Unstable)"}); 241 | this.MemcardBlocks.Location = new System.Drawing.Point(12, 443); 242 | this.MemcardBlocks.Name = "MemcardBlocks"; 243 | this.MemcardBlocks.Size = new System.Drawing.Size(231, 26); 244 | this.MemcardBlocks.TabIndex = 17; 245 | // 246 | // MemcardMulti 247 | // 248 | this.MemcardMulti.Enabled = false; 249 | this.MemcardMulti.Location = new System.Drawing.Point(12, 477); 250 | this.MemcardMulti.Name = "MemcardMulti"; 251 | this.MemcardMulti.Size = new System.Drawing.Size(231, 26); 252 | this.MemcardMulti.TabIndex = 18; 253 | this.MemcardMulti.Text = "Memcard Multi"; 254 | this.MemcardMulti.UseVisualStyleBackColor = false; 255 | // 256 | // NintendontOptions 257 | // 258 | this.NintendontOptions.CheckOnClick = true; 259 | this.NintendontOptions.FormattingEnabled = true; 260 | this.NintendontOptions.Items.AddRange(new object[] { 261 | "Cheats", 262 | "Memcard Emulation", 263 | "Cheat Path", 264 | "Force Widescreen", 265 | "Force Progressive", 266 | "Unlock Read Speed", 267 | "OSReport", 268 | "WiiU Widescreen", 269 | "Log", 270 | "Auto Video Width", 271 | "Patch PAL50", 272 | "TRI Arcade Mode", 273 | "Wiimote CC Rumble", 274 | "Skip IPL"}); 275 | this.NintendontOptions.Location = new System.Drawing.Point(15, 219); 276 | this.NintendontOptions.MultiColumn = true; 277 | this.NintendontOptions.Name = "NintendontOptions"; 278 | this.NintendontOptions.Size = new System.Drawing.Size(472, 179); 279 | this.NintendontOptions.TabIndex = 6; 280 | this.NintendontOptions.SelectedIndexChanged += new System.EventHandler(this.NintendontOptions_SelectedIndexChanged); 281 | this.NintendontOptions.DoubleClick += new System.EventHandler(this.NintendontOptions_DoubleClick); 282 | // 283 | // Format 284 | // 285 | this.Format.AutoSize = true; 286 | this.Format.Location = new System.Drawing.Point(200, 72); 287 | this.Format.Name = "Format"; 288 | this.Format.Size = new System.Drawing.Size(287, 18); 289 | this.Format.TabIndex = 19; 290 | this.Format.TabStop = true; 291 | this.Format.Text = "Use this to format your SD Card"; 292 | this.Format.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.Format_LinkClicked); 293 | // 294 | // SDCardMenu 295 | // 296 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; 297 | this.ClientSize = new System.Drawing.Size(499, 585); 298 | this.Controls.Add(this.Format); 299 | this.Controls.Add(this.MemcardMulti); 300 | this.Controls.Add(this.MemcardBlocks); 301 | this.Controls.Add(this.MemcardText); 302 | this.Controls.Add(this.WidthNumber); 303 | this.Controls.Add(this.VideoWidthText); 304 | this.Controls.Add(this.VideoWidth); 305 | this.Controls.Add(this.VideoTypeMode); 306 | this.Controls.Add(this.VideoText); 307 | this.Controls.Add(this.VideoForceMode); 308 | this.Controls.Add(this.LanguageText); 309 | this.Controls.Add(this.LanguageBox); 310 | this.Controls.Add(this.GenerateConfig); 311 | this.Controls.Add(this.NintendontOptions); 312 | this.Controls.Add(this.ActionStatus); 313 | this.Controls.Add(this.NintendontUpdate); 314 | this.Controls.Add(this.ReloadDrives); 315 | this.Controls.Add(this.SDCardText); 316 | this.Controls.Add(this.DriveBox); 317 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; 318 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 319 | this.Margin = new System.Windows.Forms.Padding(4); 320 | this.MaximizeBox = false; 321 | this.MinimizeBox = false; 322 | this.Name = "SDCardMenu"; 323 | this.ShowInTaskbar = false; 324 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 325 | this.Text = "Nintendont SD Card Menu..."; 326 | this.Load += new System.EventHandler(this.SDCardMenu_Load); 327 | ((System.ComponentModel.ISupportInitialize)(this.VideoWidth)).EndInit(); 328 | this.ResumeLayout(false); 329 | this.PerformLayout(); 330 | 331 | } 332 | 333 | #endregion 334 | 335 | private System.Windows.Forms.ComboBox DriveBox; 336 | private System.Windows.Forms.Label SDCardText; 337 | private System.Windows.Forms.Button ReloadDrives; 338 | private System.Windows.Forms.Button NintendontUpdate; 339 | private System.Windows.Forms.Label ActionStatus; 340 | private System.Windows.Forms.Button GenerateConfig; 341 | private System.Windows.Forms.ComboBox LanguageBox; 342 | private System.Windows.Forms.Label LanguageText; 343 | private System.Windows.Forms.Label VideoText; 344 | private System.Windows.Forms.ComboBox VideoForceMode; 345 | private System.Windows.Forms.ComboBox VideoTypeMode; 346 | private System.Windows.Forms.TrackBar VideoWidth; 347 | private System.Windows.Forms.Label VideoWidthText; 348 | private System.Windows.Forms.Label WidthNumber; 349 | private System.Windows.Forms.Label MemcardText; 350 | private System.Windows.Forms.ComboBox MemcardBlocks; 351 | private System.Windows.Forms.CheckBox MemcardMulti; 352 | private System.Windows.Forms.CheckedListBox NintendontOptions; 353 | private System.Windows.Forms.LinkLabel Format; 354 | } 355 | } -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Form2.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | using System.IO; 11 | using System.Net; 12 | using System.Diagnostics; 13 | using TeconMoon_s_WiiVC_Injector.Utils; 14 | 15 | namespace TeconMoon_s_WiiVC_Injector 16 | { 17 | public partial class SDCardMenu : Form 18 | { 19 | public SDCardMenu() 20 | { 21 | InitializeComponent(); 22 | 23 | if (Trt.IsValidate) 24 | { 25 | Trt.TranslateForm(this); 26 | } 27 | } 28 | string SelectedDriveLetter; 29 | bool DriveSpecified; 30 | 31 | //Load Drives and set drive variable on load 32 | private void SDCardMenu_Load(object sender, EventArgs e) 33 | { 34 | ReloadDriveList(); 35 | SpecifyDrive(); 36 | MemcardBlocks.SelectedIndex = 0; 37 | VideoForceMode.SelectedIndex = 0; 38 | VideoTypeMode.SelectedIndex = 0; 39 | LanguageBox.SelectedIndex = 0; 40 | NintendontOptions.SetItemChecked(9, true); 41 | } 42 | 43 | //Callable voids for commands 44 | public void SpecifyDrive() 45 | { 46 | if (DriveBox.SelectedValue != null) 47 | { 48 | SelectedDriveLetter = DriveBox.SelectedValue.ToString().Substring(0, 3); 49 | DriveSpecified = true; 50 | } 51 | else 52 | { 53 | SelectedDriveLetter = ""; 54 | DriveSpecified = false; 55 | } 56 | } 57 | public void ReloadDriveList() 58 | { 59 | DriveBox.DataSource = DriveInfo.GetDrives().Where(d => d.IsReady && d.DriveType == DriveType.Removable).Select(d => d.Name + " (" + d.VolumeLabel + ")").ToList(); 60 | } 61 | public void CheckForBoxes() 62 | { 63 | if (NintendontOptions.GetItemChecked(1)) 64 | { 65 | MemcardText.Enabled = true; 66 | MemcardBlocks.Enabled = true; 67 | MemcardMulti.Enabled = true; 68 | } 69 | else 70 | { 71 | MemcardText.Enabled = false; 72 | MemcardBlocks.Enabled = false; 73 | MemcardMulti.Checked = false; 74 | MemcardMulti.Enabled = false; 75 | } 76 | if (NintendontOptions.GetItemChecked(9)) 77 | { 78 | VideoWidth.Enabled = false; 79 | VideoWidthText.Enabled = false; 80 | WidthNumber.Text = Trt.Tr("Auto"); 81 | } 82 | else 83 | { 84 | VideoWidth.Enabled = true; 85 | VideoWidthText.Enabled = true; 86 | WidthNumber.Text = VideoWidth.Value.ToString(); 87 | } 88 | } 89 | public static byte[] StringToByteArray(string hex) 90 | { 91 | return Enumerable.Range(0, hex.Length).Where(x => x % 2 == 0).Select(x => Convert.ToByte(hex.Substring(x, 2), 16)).ToArray(); 92 | } 93 | public static bool CheckForInternetConnection() 94 | { 95 | try 96 | { 97 | using (var client = new WebClient()) 98 | { 99 | using (client.OpenRead("http://clients3.google.com/generate_204")) 100 | { 101 | return true; 102 | } 103 | } 104 | } 105 | catch 106 | { 107 | return false; 108 | } 109 | } 110 | 111 | //Reload Drives when selected 112 | private void ReloadDrives_Click(object sender, EventArgs e) 113 | { 114 | ReloadDriveList(); 115 | SpecifyDrive(); 116 | } 117 | //Specify Drive variable when a drive is selected 118 | private void DriveBox_SelectedIndexChanged(object sender, EventArgs e) 119 | { 120 | SpecifyDrive(); 121 | } 122 | 123 | 124 | //Changing config options 125 | public void NintendontOptions_SelectedIndexChanged(object sender, EventArgs e) 126 | { 127 | CheckForBoxes(); 128 | } 129 | private void NintendontOptions_DoubleClick(object sender, EventArgs e) 130 | { 131 | CheckForBoxes(); 132 | } 133 | private void VideoForceMode_SelectedIndexChanged(object sender, EventArgs e) 134 | { 135 | if (VideoForceMode.SelectedIndex == 0) 136 | { 137 | VideoTypeMode.SelectedIndex = 0; 138 | VideoTypeMode.Enabled = false; 139 | } 140 | else if (VideoForceMode.SelectedIndex == 3) 141 | { 142 | VideoTypeMode.SelectedIndex = 0; 143 | VideoTypeMode.Enabled = false; 144 | } 145 | else 146 | { 147 | VideoTypeMode.SelectedIndex = 1; 148 | VideoTypeMode.Enabled = true; 149 | } 150 | } 151 | private void VideoWidth_Scroll(object sender, EventArgs e) 152 | { 153 | WidthNumber.Text = VideoWidth.Value.ToString(); 154 | } 155 | private void VideoTypeMode_SelectedIndexChanged(object sender, EventArgs e) 156 | { 157 | if (VideoForceMode.SelectedIndex != 0 & VideoForceMode.SelectedIndex != 3 & VideoTypeMode.SelectedIndex == 0) 158 | { 159 | VideoTypeMode.SelectedIndex = 1; 160 | } 161 | } 162 | 163 | //Buttons that make changes to SD Card 164 | private void NintendontUpdate_Click(object sender, EventArgs e) 165 | { 166 | if (DriveSpecified) 167 | { 168 | if (CheckForInternetConnection() == false) 169 | { 170 | DialogResult dialogResult = MessageBox.Show( 171 | Trt.Tr("Your internet connection could not be verified, do you wish to try and download Nintendont anyways?"), 172 | Trt.Tr("Internet Connection Verification Failed"), MessageBoxButtons.YesNo); 173 | if (dialogResult == DialogResult.No) 174 | { 175 | goto skipnintendontdownload; 176 | } 177 | } 178 | ActionStatus.Text = Trt.Tr("Downloading..."); 179 | ActionStatus.Refresh(); 180 | Directory.CreateDirectory(SelectedDriveLetter + "apps\\nintendont"); 181 | var client = new WebClient(); 182 | client.DownloadFile("https://raw.githubusercontent.com/FIX94/Nintendont/master/loader/loader.dol", SelectedDriveLetter + "apps\\nintendont\\boot.dol"); 183 | client.DownloadFile("https://raw.githubusercontent.com/FIX94/Nintendont/master/nintendont/meta.xml", SelectedDriveLetter + "apps\\nintendont\\meta.xml"); 184 | client.DownloadFile("https://raw.githubusercontent.com/FIX94/Nintendont/master/nintendont/icon.png", SelectedDriveLetter + "apps\\nintendont\\icon.png"); 185 | ActionStatus.Text = ""; 186 | MessageBox.Show(Trt.Tr("Download complete.")); 187 | } 188 | else 189 | { 190 | MessageBox.Show(Trt.Tr("Drive not specified, nowhere to download contents")); 191 | } 192 | skipnintendontdownload:; 193 | } 194 | private void GenerateConfig_Click(object sender, EventArgs e) 195 | { 196 | if (DriveSpecified == false) 197 | { 198 | MessageBox.Show(Trt.Tr("Drive not specified, nowhere to place generated config")); 199 | goto SkipGeneration; 200 | } 201 | int DecOffset09 = 0; 202 | int DecOffset0A_0C = 0; 203 | int DecOffset0D = 0; 204 | int DecOffset0F = 0; 205 | uint DecOffset10_13 = 0; 206 | int DecOffset21C = 0; 207 | int DecOffset21D = 0; 208 | string HexOffset09; 209 | string HexOffset0A_0C; 210 | string HexOffset0D; 211 | string HexOffset0F; 212 | string HexOffset10_13; 213 | string HexOffset21C; 214 | string HexOffset21D; 215 | 216 | //09 Offsets 217 | //TRI Arcade Mode 218 | if (NintendontOptions.GetItemChecked(11)) 219 | { 220 | DecOffset09 = DecOffset09 + 1; 221 | } 222 | //Wiimote CC Rumble 223 | if (NintendontOptions.GetItemChecked(12)) 224 | { 225 | DecOffset09 = DecOffset09 + 2; 226 | } 227 | //Skip IPL 228 | if (NintendontOptions.GetItemChecked(13)) 229 | { 230 | DecOffset09 = DecOffset09 + 4; 231 | } 232 | //convert to hex string 233 | HexOffset09 = DecOffset09.ToString("X"); 234 | HexOffset09 = HexOffset09.PadLeft(2, '0'); 235 | 236 | //0A-0C Offsets 237 | //Cheats 238 | if (NintendontOptions.GetItemChecked(0)) 239 | { 240 | DecOffset0A_0C = DecOffset0A_0C + 256; 241 | } 242 | //Memcard Emu 243 | if (NintendontOptions.GetItemChecked(1)) 244 | { 245 | DecOffset0A_0C = DecOffset0A_0C + 2049; 246 | } 247 | //Memcard Multi 248 | if (MemcardMulti.Checked) 249 | { 250 | DecOffset0A_0C = DecOffset0A_0C + 2097152; 251 | } 252 | //Cheat Path 253 | if (NintendontOptions.GetItemChecked(2)) 254 | { 255 | DecOffset0A_0C = DecOffset0A_0C + 4097; 256 | } 257 | //Force Widescreen 258 | if (NintendontOptions.GetItemChecked(3)) 259 | { 260 | DecOffset0A_0C = DecOffset0A_0C + 8193; 261 | } 262 | //Force Progressive 263 | if (NintendontOptions.GetItemChecked(4)) 264 | { 265 | DecOffset0A_0C = DecOffset0A_0C + 16387; 266 | } 267 | //Unlock Read Speed 268 | if (NintendontOptions.GetItemChecked(5)) 269 | { 270 | DecOffset0A_0C = DecOffset0A_0C + 65540; 271 | } 272 | //OSReport 273 | if (NintendontOptions.GetItemChecked(6)) 274 | { 275 | DecOffset0A_0C = DecOffset0A_0C + 131076; 276 | } 277 | //WiiU Widescreen 278 | if (NintendontOptions.GetItemChecked(7)) 279 | { 280 | DecOffset0A_0C = DecOffset0A_0C + 8388612; 281 | } 282 | //Log 283 | if (NintendontOptions.GetItemChecked(8)) 284 | { 285 | DecOffset0A_0C = DecOffset0A_0C + 1048594; 286 | } 287 | //convert to hex string 288 | HexOffset0A_0C = DecOffset0A_0C.ToString("X"); 289 | HexOffset0A_0C = HexOffset0A_0C.PadLeft(6, '0'); 290 | 291 | //0D Offsets 292 | //Video Force Options 293 | //Auto 294 | if (VideoForceMode.SelectedIndex == 0) 295 | { 296 | DecOffset0D = 0; 297 | } 298 | //Force 299 | if (VideoForceMode.SelectedIndex == 1) 300 | { 301 | DecOffset0D = 1; 302 | } 303 | //Force (Deflicker) 304 | if (VideoForceMode.SelectedIndex == 2) 305 | { 306 | DecOffset0D = 5; 307 | } 308 | //None 309 | if (VideoForceMode.SelectedIndex == 3) 310 | { 311 | DecOffset0D = 2; 312 | } 313 | //convert to hex string 314 | HexOffset0D = DecOffset0D.ToString("X"); 315 | HexOffset0D = HexOffset0D.PadLeft(2, '0'); 316 | 317 | //0F Offsets 318 | //Video Mode Options 319 | //None 320 | if (VideoTypeMode.SelectedIndex == 0) 321 | { 322 | DecOffset0F = 16; 323 | } 324 | //NTSC 325 | if (VideoTypeMode.SelectedIndex == 1) 326 | { 327 | DecOffset0F = 20; 328 | } 329 | //MPAL 330 | if (VideoTypeMode.SelectedIndex == 2) 331 | { 332 | DecOffset0F = 24; 333 | } 334 | //PAL50 335 | if (VideoTypeMode.SelectedIndex == 3) 336 | { 337 | DecOffset0F = 17; 338 | } 339 | //PAL60 340 | if (VideoTypeMode.SelectedIndex == 4) 341 | { 342 | DecOffset0F = 18; 343 | } 344 | //Patch PAL50 345 | if (NintendontOptions.GetItemChecked(10)) 346 | { 347 | DecOffset0F = DecOffset0F + 32; 348 | } 349 | //convert to hex string 350 | HexOffset0F = DecOffset0F.ToString("X"); 351 | HexOffset0F = HexOffset0F.PadLeft(2, '0'); 352 | 353 | //10-13 Offsets 354 | //Language Selection 355 | //Automatic 356 | if (LanguageBox.SelectedIndex == 0) 357 | { 358 | DecOffset10_13 = 4294967295; 359 | } 360 | //English 361 | if (LanguageBox.SelectedIndex == 1) 362 | { 363 | DecOffset10_13 = 0; 364 | } 365 | //German 366 | if (LanguageBox.SelectedIndex == 2) 367 | { 368 | DecOffset10_13 = 1; 369 | } 370 | //French 371 | if (LanguageBox.SelectedIndex == 3) 372 | { 373 | DecOffset10_13 = 2; 374 | } 375 | //Spanish 376 | if (LanguageBox.SelectedIndex == 4) 377 | { 378 | DecOffset10_13 = 3; 379 | } 380 | //Italian 381 | if (LanguageBox.SelectedIndex == 5) 382 | { 383 | DecOffset10_13 = 4; 384 | } 385 | //Dutch 386 | if (LanguageBox.SelectedIndex == 6) 387 | { 388 | DecOffset10_13 = 5; 389 | } 390 | //convert to hex string 391 | HexOffset10_13 = DecOffset10_13.ToString("X"); 392 | HexOffset10_13 = HexOffset10_13.PadLeft(8, '0'); 393 | 394 | //21C Offsets 395 | //Memcard Blocks 396 | //59 397 | if (MemcardBlocks.SelectedIndex == 0) 398 | { 399 | DecOffset21C = 0; 400 | } 401 | //123 402 | if (MemcardBlocks.SelectedIndex == 1) 403 | { 404 | DecOffset21C = 1; 405 | } 406 | //251 407 | if (MemcardBlocks.SelectedIndex == 2) 408 | { 409 | DecOffset21C = 2; 410 | } 411 | //507 412 | if (MemcardBlocks.SelectedIndex == 3) 413 | { 414 | DecOffset21C = 3; 415 | } 416 | //1019 417 | if (MemcardBlocks.SelectedIndex == 4) 418 | { 419 | DecOffset21C = 4; 420 | } 421 | //2043 422 | if (MemcardBlocks.SelectedIndex == 5) 423 | { 424 | DecOffset21C = 5; 425 | } 426 | //convert to hex string 427 | HexOffset21C = DecOffset21C.ToString("X"); 428 | HexOffset21C = HexOffset21C.PadLeft(2, '0'); 429 | 430 | //21D Offsets 431 | //Video Width 432 | if (NintendontOptions.GetItemChecked(9)) 433 | { 434 | DecOffset21D = 0; 435 | } 436 | else 437 | { 438 | DecOffset21D = VideoWidth.Value - 600; 439 | } 440 | //convert to hex string 441 | HexOffset21D = DecOffset21D.ToString("X"); 442 | HexOffset21D = HexOffset21D.PadLeft(2, '0'); 443 | 444 | //Output Hex File 445 | string config = "01070CF60000000800" + HexOffset09 + HexOffset0A_0C + HexOffset0D + "00" + HexOffset0F + HexOffset10_13 + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + HexOffset21C + HexOffset21D + "0000"; 446 | File.WriteAllBytes(SelectedDriveLetter + "nincfg.bin", StringToByteArray(config)); 447 | 448 | MessageBox.Show(Trt.Tr("Config generation complete.")); 449 | SkipGeneration:; 450 | } 451 | 452 | private void Format_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 453 | { 454 | Process.Start("http://www.ridgecrop.demon.co.uk/index.htm?guiformat.htm"); 455 | Process.Start("http://www.ridgecrop.demon.co.uk/guiformat.exe"); 456 | } 457 | } 458 | } 459 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Form2.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 | 121 | 122 | 123 | AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 124 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 125 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAABw 126 | AAMEjQE9BI8A2ACDAOsBfQBQAHwACAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 127 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 128 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 129 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 130 | AAAU/wAAAAAAAAOIACMAlwDGAZoA/QGbAP8AgwD/AIQA/wCDANMAfwA2AAAAAAAAAAAAAAAAAAAAAAAA 131 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 132 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 133 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 134 | AAAAAAAAAAAAAAAAAAAAAAAAAZMAFwKZAIsAngD/AaAA/wCfAP8EnwD/AIUA/wCIAP8AiAD/AYkA/wCI 135 | AJ0AiQAcAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 136 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 137 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 138 | AAAAAAAAAAAAAAAAAAAAAAAAAJgAAAAAAAAAAAAAAJwAggClAOwApgD/AKcA/wCkAP8BpAD/BKIA/wCH 139 | AP8AiwD/AIoA/wCMAP8AjgD/AI8A7wCOAIkAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 140 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 141 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 142 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQAAAAAAAAB5AAIAnwA7AKUA3ACsAP8ArQD/AKsA/wCr 143 | AP8AqAD/AKgA/wKmAP8AigD/AI0A/wCOAP8AjwD/AJEA/wCTAP8AlAD/AJMA3wCQADsAaAABAAAAAACX 144 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 145 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 146 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmwAAAAAAAACZACkApQDJAKkA/gCr 147 | AP8AsAD/ALEA/wCuAP8ArgD/AKwA/wCrAP8CqgD/AI0A/wCQAP8AkQD/AJMA/wCUAP8AlgD/AJYA/wCZ 148 | AP8AmAD+AJgAxQCPACAAAAAAAJcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 149 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 150 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZcAAAAAAAAAAAAAAJwAFQCf 151 | AIQApAD/AKYA/wCsAP8ArwD/ALQA/wC1AP8AtQD/ALIA/wCwAP8AsAD/Aa8A/wCQAP8AkgD/AJQA/wCV 152 | AP8AlgD/AJoA/wCcAP8AnAD/AJ0A/wCeAP8AnwD/AJsAdwCcABEAAAAAAKEAAACZAAAAAAAAAAAAAAAA 153 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 154 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIoAAAAA 155 | AAAAAAAAAJsAegCeAOoAogD/AKQA/wCpAP8ArwD/ALMA/wC4AP8AugD/ALgA/wC4AP8AtQD/AbQA/wa0 156 | AP8AkgD/AJUA/wCWAP8AmAD/AJsA/wCcAP8AngD/AKAA/wChAP8AowD/AKQA/wCjAP8ApADjAJ4AYgAA 157 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 158 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 159 | AAAAjwAAAAAAAASLAAMAlgA7AJoA4QCcAP8AoAD/AKQA/wCoAP8ArgD/ALMA/wC5AP8AvgD/AL0A/wC+ 160 | AP8AugD/ALkA/wC3AP8CuQD/AJMA/wCXAP8AmQD/AJsA/wCdAP8AnwD/AKIA/wCkAP8ApQD/AKUA/wCn 161 | AP8ApgD/AKgA/wCoAP8ApQDJAKMALAAAAAAAAAAAAJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 162 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 163 | AAAAAAAAAAAAAAAAAAAA/wAAAAAAAACQACEAlQDFAJcA/QCaAP8AngD/AKMA/wCoAP8ArAD/ALIA/wC4 164 | AP8AvgD/AMMA/wDBAP8AwwD/AMAA/wC/AP8AvQD/ALoA/wCTAP8AmAD/AJsA/wCdAP8AnwD/AKMA/wCl 165 | AP8AqAD/AKkA/wCpAP8AqwD/AKoA/wCtAP8ArAD/AKoA/wCsAPcAqQCuAIgACAAAAAAApgAAAAAAAAAA 166 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 167 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAFgCQAIgAkwD/AJYA/wCYAP8AnQD/AKIA/wCn 168 | AP8AqwD/ALEA/wC3AP8AvQD/AMMA/wDIAP8AxwD/AMgA/wDFAP8AwgD/GbwW/1G5SPpyrGX2Jpwk/wGb 169 | Af8AnwD/AKIA/wCmAP8ApwD/AKoA/wCsAP8ArgD/AK8A/wCwAP8AsQD/ALAA/wCvAP8AsAD/AK8A/wCs 170 | AP0ApwBcAJoACAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 171 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIYAAAAAAAAAAAAAAIkAfgCOAOsAkAD/AJMA/wCY 172 | AP8AnAD/AKAA/wCmAP8AqwD/ALAA/wC2AP8AvAD/AMEA/wDIAP8AzAD/AMwA/wDPAP8DwAP/crhu/3Oe 173 | b+FziF84ZWdiL2uMaNN3tGv/EJwQ/wCjAP8AqAD/AKoA/wCtAP8ArwD/ALEA/wCyAP8AtAD/ALYA/wCz 174 | AP8AtQD/ALQA/wCzAP8AsQD/AK4A/wCxAN0ApQBHAAAAAACtAAAAmwAAAAAAAAAAAAAAAAAAAAAAAAAA 175 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQAAAAAAAACGAAEAhAA5AIgA2QCM 176 | AP8AjwD/AJIA/wCXAP8AmwD/AJ8A/wCkAP8AqgD/AK8A/wC0AP8AuwD/AMEA/wDIAP8AzgD/ANIA/wfJ 177 | B/9EtUT/nqih6XN/c3kAAAAAAAAAAAAAAAAAAAAAYV1fbJ6sl+ZSpFH/DKUM/wCrAP8AsAD/ALIA/wC1 178 | AP8AtwD/ALgA/wC5AP8AuAD/ALgA/wC5AP8AtwD/ALYA/wC1AP8AtAD/ALIA/wCrAKEAqQAcAAAAAAAA 179 | AAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAB3 180 | ACUAgQDGAIYA/gCJAP8AjQD/AJEA/wCVAP8AmgD/AJ8A/wCjAP8AqAD/AK4A/wCzAP8AugD/AL8A/wDF 181 | AP8AzwD/AMoA/z25QP+PrpD/g4eBgXN5axQAAAAAAAAAAFErSQBYRGAAZ3lOAAAAAABYU04Sen53e4+q 182 | j/9Oq07/AKkA/wC1AP8AtwD/ALoA/wC7AP8AvQD/AL0A/wC+AP8AvAD/ALwA/wC6AP8AuQD/ALkA/wC2 183 | AP8AsgD/AK0A8QCmAI0AAAAAAAAAAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6 184 | AAAAAAAAAHcAFAB7AIEAgQD/AIQA/wCIAP8AiwD/AJAA/wCUAP8AmQD/AJ0A/wCiAP8ApwD/AK0A/wCz 185 | AP8AuAD/AMAA/wDFAP8AxgD/GLoW/3OvcP6XnJHHNkMuJQAAAABZWU8AAAAAAAAAAAAAAAAAAAAAAAAA 186 | AAAAAAAATEpNAAAAAAAqERgijpmJxoKrev4cqB3/ALQB/wC9AP8AvgD/AMAA/wDAAP8AwQD/AMAA/wC/ 187 | AP8AvgD/AL4A/wC+AP8AuwD/ALgA/wCyAP8ArAD/AKcA6wCiAEIAjwAEAAAAAACYAAAAAAAAAAAAAAAA 188 | AAAAAAAAAAAAAAAAAAAAAAAAAXoAbAB9AOkAgAD/AIIA/wCGAP8AiQD/AI4A/wCSAP8AlgD/AJwA/wCg 189 | AP8ApgD/AKsA/wCxAP8AtwD/AL4A/wDEAP8Gsgf/arll/4Gicth4gGw4AAAAAQAAAABld2IAAAAAAAAA 190 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdV04AAAAAAAAAAAF1b2s6YptZ20fENP8IrAn/AL0A/wDE 191 | AP8AwwD/AMMA/wDEAP8AwwD/AMIA/wDBAP8AwQD/AL8A/wC5AP8AtQD/ALEA/wCrAP8ApgD/AKIAyACc 192 | ACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9AOoAfwD/AIIA/wCEAP8AiAD/AIwA/wCR 193 | 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 221 | AAAAAAAAcTZoAAAAAAACuwneAMEA/wDSAP8AzQD/AMkA/wDCAP8AvwD/ALgA/wCzAP8ApgCzAAAAAAAA 222 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjQDhAI0A/wCRAP8AlAD/AJoA/wCfAP8ApAD/AKsA/wCm 223 | AP8ArQDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9IBjAHgAPAA4gD/AOIA/wDhAP8A4AD/AN8A/wDf 224 | AP8A3gD/Ad0A/wTdAP8O3AD/ANMA/wDgAP8A4gD/AOMA/wDkAP8A5gD/AOUA/wDmAP8A5gD/AOYA/wDk 225 | AO4A3AGCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbsF3ADCAP8A0wD/AM4A/wDKAP8AxgD/AMAA/wC6 226 | AP8AtAD/AKcAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA4QCQAP8AkgD/AJcA/wCc 227 | AP8AogD/AKgA/wCvAP8AqQD/AK0A4AAAAAAAAAAAAAAAAAAAAAAMrgAOAtYA4ADjAP8A4wD/AOIA/wDh 228 | AP8A4QD/AOAA/wDfAP8A3gD/AN4A/wLdAP8E3AD/FdwG/wDWAP8A4wD/AOMA/wDlAP8A5QD/AOUA/wDm 229 | AP8A5gD/AOUA/wDlAP8A5gD/AOYA/wHeAtoUrxYPAAAAAAAAAAAAAAAAAAAAAAG8ANsAwwD/ANUA/wDP 230 | AP8AywD/AMYA/wDBAP8AvAD/ALgA/wCnALIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACS 231 | AOEAkQD/AJQA/wCaAP8AnwD/AKUA/wCqAP8AswD/AKsA/wCtAOAAAAAAAAAAAAAAAAAAAAAABq0AGAHZ 232 | AOkA4gD/AOIA/wDiAP8A4QD/AOEA/wDfAP8A3wD/AN4A/wHeAP8C3QD/AtwA/xnbCf8A1wD/AOUA/wDl 233 | AP8A5QD/AOUA/wDlAP8A5gD/AOUA/wDlAP8A5QD/AOUA/wDmAP8A4QPtAbwYGwAAAAAAAAAAAAAAAAAA 234 | AAABvAPZAMMA/wDWAP8A0AD/AMkA/wDHAP8AwQD/AL0A/wC4AP8AqACyAAAAAAAAAAAAAAAAAAAAAAAA 235 | AAAAAAAAAAAAAAAAAAAAlADhAJMA/wCXAP8AnAD/AKIA/wCoAP8ArQD/ALUA/wCuAP8ArADgAAAAAAAA 236 | AAAAAAAAAAAAAA2sABcB2gDpAOIA/wDiAP8A4gD/AOEA/wDhAP8A3wD/AN4A/wDeAP8D3QD/A9wA/wXc 237 | AP8b2wv/ANkA/wDlAP8A5gD/AOUA/wDlAP8A5QD/AOUA/wDlAP8A5QD/AOYA/wDlAP8A5gD/AOAD7AC8 238 | GhsAAAAAAAAAAAAAAAAAAAAAAb0C1wDDAP8A1wD/ANEA/wDMAP8AxwD/AMEA/wC9AP8AuAD/AagAsgAA 239 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZYA4QCWAP8AmAD/AJ4A/wCkAP8AqgD/ALEA/wC4 240 | AP8AsAD/AK0A4AAAAAAAAAAAAAAAAAAAAAAIrgAYAdsA6QDiAP8A4gD/AOEA/wDhAP8A4AD/AN8A/wDe 241 | AP8B3gD/Ad0A/wLcAP8B3AD/GNsK/wDcAP8A5QD/AOUA/wDmAP8A5gD/AOUA/wDmAP8A5QD/AOUA/wDm 242 | AP8A5gD/AOUA/wDgBO0AsyEcAAAAAAAAAAAAAAAAAAAAAAK8ANUAxAD/ANYA/wDRAP8AzQD/AMcA/wDB 243 | AP8AvgD/ALgA/wCpALIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYAOEAlwD/AJsA/wCh 244 | AP8ApgD/AKwA/wCzAP8AugD/ALIA/wCtAOAAAAAAAAAAAAAAAAAAAAAAD60DGALcAOkA4gD/AOIA/wDh 245 | AP8A4QD/AOAA/wDfAP8A3wD/Ad4A/wDdAP8B3AD/A9wA/xHbAf8A3gD/AOUA/wDlAP8A5QD/AOUA/wDl 246 | AP8A5QD/AOUA/wDlAP8A5gD/AOYA/wDlAP8A3wTtAKsnGgDoAAAAqx0AAAAAAAAAAAACvADVAMUA/wDV 247 | AP8A0QD/AM0A/wDIAP8AwwD/AL4A/wC4AP8BqgCyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 248 | AAAAmgDhAJkA/wCdAP8AogD/AKkA/wCuAP8AtQD/AL0A/wC0AP8ArADgAAAAAAAAAAAAAAAAAAAAABOr 249 | EBgC2wLpAOIA/wDiAP8A4QD/AOAA/wDgAP8A3wD/AN4A/wDeAP8A3gD/Ad0A/wHdAP8L3AD/AN8A/wDl 250 | AP8A5QD/AOUA/wDmAP8A5QD/AOUA/wDmAP8A5QD/AOUA/wDlAP8A5QD/AOIC+gDVBl8AAAAAAAAAAAAA 251 | AAAAAAAAArwA0wDEAP8A1QD/ANAA/wDMAP8AyAD/AMIA/wC9AP8AuAD/AKgAsQAAAAAAAAAAAAAAAAAA 252 | AAAAAAAAAAAAAAAAAAAAAAAAAJwA4QCbAP8AngD/AKUA/wCqAP8AsAD/ALgA/wC/AP8AtgD/AKoA4AAA 253 | AAAAAAAAAAAAAAAAAAAVqRQYAtsC6gDiAP8A4gD/AOEA/wDhAP8A4AD/AN8A/wDfAP8A3gD/AN4A/wDe 254 | AP8A3QD/CdwA/wDgAP8A5QD/AOUA/wDlAP8A5QD/AOYA/wDmAP8A5QD/AOYA/wDlAP8A5QD/AOQA/wDk 255 | AP8A4wD/AN4BwADYACkAAAAAAAAAAAC6ANEAxAD/ANQA/wDPAP8AywD/AMYA/wDDAP8AvQD/ALkA/wGn 256 | ALEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfAOEAnQD/AKAA/wCmAP8ArQD/ALIA/wC6 257 | AP8AwQD/ALgA/wCqAOAAAAAAAAAAAAAAAAAAAAAAFacPGQLbAuoA4gD/AOIA/wDiAP8A4QD/AOAA/wDf 258 | AP8A3wD/AN4A/wDeAP8A3gD/AN4A/wDfAP8A2AD/AOYA/wDlAP8A5QD/AOUA/wDlAP8A5gD/AOUA/wDl 259 | AP8A5AD/AOQA/wDjAP8A4gD/AOAA/wDfAP8A3gD1ANwApwAAAAABugDOAMMA/wDTAP8AzwD/AMoA/wDG 260 | AP8AwgD/AL4A/wC5AP8ApwCxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoADgAJ8A/wCi 261 | AP8AqAD/AK0A/wC0AP8AvAD/AMMA/wC5AP8AqQDgAAAAAAAAAAAAAAAAAAAAABCoHRkC3APqAOIA/wDi 262 | AP8A4gD/AOEA/wDgAP8A3wD/AN8A/wDeAP8A3gD/AN4A/yDbIf+Wy5X/tMKz/zDOL/8C4AL/AOYA/wDl 263 | AP8A5QD/AOYA/wDkAP8A5AD/AOIA/wDhAP8A4AD/AN8A/wDdAP8A3AD/ANoA/wDZAP8A2wDxAMYB5gDA 264 | AP8A0AD/AMwA/wDJAP8AxQD/AMEA/wC9AP8AuQD/AKcAsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 265 | AAAAAAAAAKAA4AChAP8ApAD/AKoA/wCvAP8AtgD/AL0A/wDEAP8AugD/AacA4AAAAAAAAAAAAAAAAAAA 266 | AAASqBMZAtwC6gDjAP8A4gD/AOIA/wDhAP8A4QD/AOAA/wDfAP8A3wD/B94H/4bNhv+9xb3/x8XH/8XE 267 | xf/ExMP/l8SW/xbKFf8A5wD/AOYA/wDlAP8A4gD/AOEA/wDgAP8A3gD/AN0A/wDdAP8A2wD/ANgA/wDZ 268 | AP8A1gD/ANQA/wDTAP8AygD/AM0A/wDKAP8AxwD/AMMA/wDAAP8AuwD/ALgA/wCmALEAAAAAAAAAAAAA 269 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACiAOAAowD/AKUA/wCqAP8AsAD/ALgA/wC+AP8AxQD/ALsA/wCl 270 | AOAAAAAAAAAAAAAAAAAAAAAABa8JGQHdAeoA4wD/AOIA/wDiAP8A4QD/AOEA/wDgAP8I3wj/TdVN/8bF 271 | xf/Ixcj/xcXF/8XFxf/FxcX/xcXF/8bFxv/Oxs7/YL5e/w3YDf8A4gD/AOAA/wDeAP8A3QD/ANsA/wDa 272 | AP8A2QD/ANgA/wDWAP8A1AD/ANQA/wDRAP8AzgD/AM4A/wDLAP8AyAD/AMUA/wDBAP8AvgD/ALoA/wC2 273 | AP8ApQCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAowDgAKQA/wCmAP8ArAD/ALEA/wC5 274 | AP8AvwD/AMYA/wC8AP8AowDgAAAAAAAAAAAAAAAAAAAAAACuAhkA3QDqAOMA/wDjAP8A4gD/AOIA/wDi 275 | AP9A1ED/rsiu/8fFx//FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8fFx/+yw7L/VcNU/wDV 276 | AP8A3QD/ANoA/wDYAP8A1wD/ANUA/wDVAP8A0wD/ANEA/wDRAP8AzgD/AMwA/wDJAP8AxwD/AMUA/wDD 277 | AP8AwAD/ALwA/wC4AP8AtQD/AKQAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMA4ACk 278 | AP8ApwD/AKwA/wCzAP8AuQD/AL8A/wDIAP8AvAD/AaMA4AAAAAAAAAAAAAAAAAAAAAAAuAEZAN4A6wDj 279 | AP8A4wD/AOEA/xnbGf+JyYn/y8PL/8XFxf/ExMT/xMTE/8XFxf/FxcX/xMTE/8TExP/ExMT/xMTE/8TE 280 | xP/ExMT/xMTE/8vFy/+ZvJn/IMQe/wDTAP8A1wD/ANMA/wDSAP8A0gD/ANAA/wDOAP8AywD/AMwA/wDJ 281 | AP8AxgD/AMQA/wDDAP8AwQD/AL4A/wC6AP8AtwD/ALIA/wCkALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 282 | AAAAAAAAAAAAAAClAOAApQD/AKgA/wCuAP8AtAD/ALoA/wDAAP8AyAD/ALwA/wGgAOAAAAAAAAAAAAAA 283 | AAAAAAAAAbgBGgDeAOsA5QD/AtsB/3zLe/++xL7/yMXI/8TExP/ExMT/xMTE/8XFxf/ExMT/xcXF/8XF 284 | xf/ExMT/xMTE/8XFxf/FxcX/xcXF/8TExP/ExMT/xsXG/8DDwP+Ev4P/BrwE/wDRAP8AzgD/AMwA/wDM 285 | AP8AywD/AMkA/wDIAP8AxgD/AMQA/wDCAP8AwAD/AL4A/wC8AP8AuAD/ALQA/wCxAP8AowCwAAAAAAAA 286 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABogDgAKYA/wCpAP8ArgD/ALQA/wC5AP8AwQD/AMgA/wC8 287 | AP8AoADgAAAAAAAAAAAAAAAAAAAAAAHAAxoL3gvsQdBA/77Evv/HxMj/xcXF/8XFxf/ExMT/xMTE/8TE 288 | xP/ExMT/xcXF/8TExP/ExMT/xMTE/8TExP/FxcX/xcXF/8TExP/ExMT/xMTE/8TExP/ExMT/x8XH/8PD 289 | w/9EtEL/CMQI/wDKAP8AxwD/AMcA/wDGAP8AxAD/AMMA/wDCAP8AvwD/AL4A/wC7AP8AuAD/ALUA/wCx 290 | AP8ArgD/AKAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMA4ACmAP8AqQD/AK4A/wC0 291 | AP8AugD/AMEA/wDHAP8AuwD/AZ4A4AAAAAAAAAAAAAAAAAAAAAAyYj0Kc410vsXDxf/Hxsf/xcXF/8XF 292 | xf/FxcX/xcXF/8TExP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF 293 | xf/ExMT/xcXF/8XFxf/Gxcb/yMfI/5y5m/8ysTH/ALwA/wDFAP8AwgD/AMEA/wC/AP8AvwD/AL0A/wC7 294 | AP8AuAD/ALYA/wCzAP8ArgD/AKsA/wCgAK4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACj 295 | AOAApwD/AKoA/wCvAP8AtAD/ALoA/wDBAP8AxgD/ALoA/wCdAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 296 | AABRX1BdrLGq4b7Bvv/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF 297 | xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8bFxv/CxMP/t7u253yJgG5LQklGq6yq2nascv8Yshf/ALwA/wC/ 298 | AP8AvAD/ALwA/wC6AP8AtwD/ALUA/wCyAP8ArwD/AK0A/wCqAP8AnwCuAAAAAAAAAAAAAAAAAAAAAAAA 299 | AAAAAAAAAAAAAAAAAAAApQDfAKYA/wCqAP8ArgD/ALQA/wC6AP8AvwD/AMYA/wC4AP8AmQDfAAAAAACR 300 | AAAAAAAAAAAAAFkyTgBMdFEAAAAAADtBNBB9gHtwqbWl/8rIyv/DxcT/v8bC/8DGwv/BxsP/wMbD/7/G 301 | wv/AxsL/wsXD/8TFxf/FxcX/xMXE/8PFxP/DxcT/w8XE/8jHyf+2vrP/iJmEfGOEZRMAAAAAAAAAAC8m 302 | KAyCfH9fi56H/W2xa/8AqQD/ALwA/wC4AP8AuAD/ALUA/wCyAP8AsAD/AK0A/wCrAP8AqAD/AJ0ArgAA 303 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaIA3wCmAP8AqgD/AK4A/wC0AP8AuQD/AL8A/wDD 304 | AP8FtQX/BJoE9QCcAC4AAAAAAAAAAACeAAAAAAAAAAAAAAAAAABOMFUAAAAAAA8ADRqJmIO+tL21/bnJ 305 | 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 375 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 376 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 377 | AAAAAAAAUklNAAAAAAAAAAAAWmtWLlSAS8o/qB3/GrcA/wfCAP8CzAD/ANMA/wDWAP8A2gD/ANsA/wDd 378 | AP8A4AD/AOEA/wDiAP8A5QD/B9UI/y2INZk+Z0QbAAAAAAAAAABZLF4AAAAAAAAAAAAAAAAAAAAAAAAA 379 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 380 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 381 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0VLAAAAAAAAAAAAY2NhcU2WNuksrQz/D7wA/wTI 382 | AP8A0gD/ANUA/wDYAP8A3AD/AN8A/wDiAP8F1wb/GrAc1GEjeToAAAAAS0BoAEtJSQAAAAAAAAAAAAAA 383 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 384 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 385 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 386 | AABYTlwTUnVFgkWXLf8aswH/B78A/wLLAP8A0wD/ANgA/wDbAP8gpiPqOXg/R3wAoQQAAAAAG9RgAAAA 387 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 388 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 389 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 390 | AAAAAAAAAAAAAAAAAAAAAAAAc51CAAAAAABcM2oeTIQ9xSikCP0MtwD/A8QB/wvDC+86gDiRAAAAAAAA 391 | AABYRGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 392 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 393 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 394 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRRlcAAAAAAF4AfAM9cjI9HJgV2ySP 395 | GZNHWUwcAAAAAAAAAABjNFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 396 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 397 | AAAAAAAA////+B/////////wD////////8AD////////gAH///////wAAD//////+AAAH//////gAAAH 398 | /////8AAAAP////+AAAAAP////wAAAAAP///8AAAAAAP///gAAAAAAf//wAAA8AAAf/+AAAH4AAA//gA 399 | AB/4AAAf8AAAP/wAAA/wAAH+f4AAD/AAA/w/wAAP8AAP8A/wAA/wAB/gA/gAD/AA/wAA/wAP8AH+AAB/ 400 | gA/wA/gAAB/AD/AD8AAAD8AP8APAAAADwA/wA8AAAAPAD/ADwAAAA8AP8APAAAADwA/wA8AAAAPAD/AD 401 | wAAAA8AP8APAAAAAwA/wA8AAAABAD/ADwAAAAAAP8APAAAAAAA/wA8AAAAAAD/ADwAAAAAAP8APAAAAA 402 | AA/wA8AAAAAAD/ADwAAAAAAP8APAAAAAAA/wA/AAAAAAD/AD+AAAGAAP8AH+AAB+AA/wAH+AAP+AD/AA 403 | H+AH/+AP8AAP8A/38A/wAAP8P8H8D/AAAP5/AP8P8AAAP/wAP8/4AAAf+AAP//8AAAfgAAP//4AAA4AA 404 | A///4AAAAAAH///wAAAAAA////wAAAAAf////wAAAAD/////wAAAA//////gAAAH//////gAAD////// 405 | /gAAf///////gAH////////AA/////////Af////////+D////8= 406 | 407 | 408 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/LogLevels.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using TeconMoon_s_WiiVC_Injector; 5 | 6 | namespace LogLevels 7 | { 8 | public class LogLevel : IEquatable 9 | { 10 | private static Dictionary levels = new Dictionary(){ 11 | {Trt.Tr("Debug"), 1}, 12 | {Trt.Tr("Info"), 2} 13 | }; 14 | 15 | private LogLevel(string name) 16 | { 17 | Name = name; 18 | Level = levels[name]; 19 | } 20 | 21 | public string Name { get; set; } 22 | public int Level { get; set; } 23 | 24 | public static LogLevel Debug { get { return new LogLevel(Trt.Tr("Debug")); } } 25 | public static LogLevel Info { get { return new LogLevel(Trt.Tr("Info")); } } 26 | 27 | public static LogLevel getLogLevelByName(string name) 28 | { 29 | LogLevel result = null; 30 | if(levels.ContainsKey(name)) 31 | result = new LogLevel(name); 32 | 33 | return result; 34 | } 35 | 36 | public static LogLevel getLogLevelByLevel(int level) 37 | { 38 | return (from k in levels.Keys 39 | where levels[k] == level 40 | select new LogLevel(k)).DefaultIfEmpty(null).First(); 41 | } 42 | 43 | public static string[] Names => levels.Keys.ToArray(); 44 | 45 | public override bool Equals(object obj) 46 | { 47 | return this.Equals(obj as LogLevel); 48 | } 49 | 50 | public bool Equals(LogLevel p) 51 | { 52 | // If parameter is null, return false. 53 | if (Object.ReferenceEquals(p, null)) 54 | { 55 | return false; 56 | } 57 | 58 | // Optimization for a common success case. 59 | if (Object.ReferenceEquals(this, p)) 60 | { 61 | return true; 62 | } 63 | 64 | // If run-time types are not exactly the same, return false. 65 | if (this.GetType() != p.GetType()) 66 | { 67 | return false; 68 | } 69 | 70 | // Return true if the fields match. 71 | // Note that the base class is not invoked because it is 72 | // System.Object, which defines Equals as reference equality. 73 | return (Level == p.Level); 74 | } 75 | 76 | public override int GetHashCode() 77 | { 78 | int hashCode = 1635173235; 79 | hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Name); 80 | hashCode = hashCode * -1521134295 + Level.GetHashCode(); 81 | return hashCode; 82 | } 83 | 84 | public static bool operator ==(LogLevel lhs, LogLevel rhs) 85 | { 86 | if (Object.ReferenceEquals(lhs, null)) 87 | { 88 | if (Object.ReferenceEquals(rhs, null)) 89 | { 90 | // null == null = true. 91 | return true; 92 | } 93 | 94 | // Only the left side is null. 95 | return false; 96 | } 97 | 98 | return lhs.Level.Equals(rhs.Level); 99 | } 100 | 101 | public static bool operator !=(LogLevel lhs, LogLevel rhs) 102 | { 103 | return !(lhs == rhs); 104 | } 105 | 106 | public static bool operator >(LogLevel lhs, LogLevel rhs) 107 | { 108 | if (lhs == rhs) 109 | return false; 110 | 111 | if (Object.ReferenceEquals(lhs, null)) 112 | return false; 113 | 114 | if (Object.ReferenceEquals(rhs, null)) 115 | return false; 116 | 117 | return lhs.Level > rhs.Level; 118 | } 119 | 120 | public static bool operator <(LogLevel lhs, LogLevel rhs) 121 | { 122 | if (lhs == rhs) 123 | return false; 124 | 125 | if (Object.ReferenceEquals(lhs, null)) 126 | return false; 127 | 128 | if (Object.ReferenceEquals(rhs, null)) 129 | return false; 130 | 131 | 132 | return lhs.Level < rhs.Level; 133 | } 134 | 135 | public static bool operator >=(LogLevel lhs, LogLevel rhs) 136 | { 137 | if (lhs == rhs) 138 | return true; 139 | 140 | if (Object.ReferenceEquals(lhs, null)) 141 | return false; 142 | 143 | if (Object.ReferenceEquals(rhs, null)) 144 | return false; 145 | 146 | 147 | return lhs.Level >= rhs.Level; 148 | } 149 | 150 | public static bool operator <=(LogLevel lhs, LogLevel rhs) 151 | { 152 | if (lhs == rhs) 153 | return true; 154 | 155 | if (Object.ReferenceEquals(lhs, null)) 156 | return false; 157 | 158 | if (Object.ReferenceEquals(rhs, null)) 159 | return false; 160 | 161 | 162 | return lhs.Level <= rhs.Level; 163 | } 164 | 165 | } 166 | } -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Diagnostics; 5 | using System.Globalization; 6 | using System.IO; 7 | using System.Windows.Forms; 8 | using TeconMoon_s_WiiVC_Injector.Utils; 9 | 10 | namespace TeconMoon_s_WiiVC_Injector 11 | { 12 | static class Program 13 | { 14 | public static int ModVersion { get; } = 13; 15 | 16 | public static string Version => System.Reflection.Assembly.GetExecutingAssembly() 17 | .GetName().Version.ToString() + " mod " + ModVersion; 18 | 19 | public static List BatchBuildList { get; } = new List(); 20 | 21 | public static bool AppendBatchBuildList(string item) 22 | { 23 | if (File.Exists(item)) 24 | { 25 | string fileExtension = new FileInfo(item).Extension; 26 | 27 | if (fileExtension.Equals(".iso", StringComparison.OrdinalIgnoreCase) 28 | || fileExtension.Equals(".wbfs", StringComparison.OrdinalIgnoreCase)) 29 | { 30 | BatchBuildList.Add(item); 31 | return true; 32 | } 33 | } 34 | 35 | return false; 36 | } 37 | 38 | /// 39 | /// Check for if .Net v3.5 component is installed. 40 | /// 41 | private static bool CheckForNet35() 42 | { 43 | if (Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5") == null) 44 | { 45 | MessageBox.Show( 46 | Trt.Tr(".NET Framework 3.5 was not detected on your machine, which is required by programs used during the build process.\n\nYou should be able to enable this in \"Programs and Features\" under \"Turn Windows features on or off\", or download it from Microsoft.\n\nClick OK to close the injector and open \"Programs and Features\"..."), 47 | Trt.Tr(".NET Framework v3.5 not found...")); 48 | 49 | Process.Start("appwiz.cpl"); 50 | return false; 51 | } 52 | 53 | return true; 54 | } 55 | 56 | private static bool CheckRuntimeEnvironment() 57 | { 58 | if (!CheckForNet35()) 59 | { 60 | return false; 61 | } 62 | 63 | return true; 64 | } 65 | 66 | /// 67 | /// The main entry point for the application. 68 | /// 69 | [STAThread] 70 | static void Main(string[] args) 71 | { 72 | Application.EnableVisualStyles(); 73 | Application.SetCompatibleTextRenderingDefault(false); 74 | 75 | foreach (string arg in args) 76 | { 77 | if (!arg.StartsWith("-") && !arg.StartsWith("/")) 78 | { 79 | AppendBatchBuildList(arg); 80 | continue; 81 | } 82 | 83 | if (arg.Substring(1).Equals("langtemplate", StringComparison.OrdinalIgnoreCase)) 84 | { 85 | TranslationTemplate translationTemplate = TranslationTemplate.CreateTemplate( 86 | Application.StartupPath + @"\language.lang", 87 | "TeconMoon-s-WiiVC-Injector-Mod-Language", 88 | "English(en-us)", 89 | Version, 90 | "robin"); 91 | translationTemplate.AppendFormTranslation(new WiiVC_Injector()); 92 | translationTemplate.AppendFormTranslation(new SDCardMenu()); 93 | translationTemplate.AppendStringResourceTranslation( 94 | Properties.Resources.ResourceManager.GetResourceSet( 95 | CultureInfo.InvariantCulture, false, false)); 96 | return; 97 | } 98 | } 99 | 100 | if (!CheckRuntimeEnvironment()) 101 | { 102 | return; 103 | } 104 | 105 | Application.Run(new WiiVC_Injector()); 106 | } 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("TeconMoon's WiiVC Injector Mod")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("TeconMoon's WiiVC Injector Mod")] 13 | [assembly: AssemblyCopyright("")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("8228dc31-4869-4c1c-8aed-d7ed37ecf3b9")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("3.0.1.0")] 36 | [assembly: AssemblyFileVersion("3.0.1.0")] 37 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/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 | 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 | 121 | This is not a valid WAV file. It will not be loaded. 122 | Consider converting it with something like Audacity. 123 | 124 | 125 | 2nd GameCube Disc Image has not been specified 126 | 127 | 128 | Conversion Complete! Your packed game can be found here: 129 | 130 | 131 | Only 4 characters can be used, try again. Example: The Star Fox 64 (USA) Channel's Title ID is NADE01, so you would specify NADE as the Title ID 132 | 133 | 134 | Drive not specified, nowhere to place generated config 135 | 136 | 137 | (One-Time Download) Downloading base files from Nintendo... (cos.xml) 138 | 139 | 140 | (One-Time Download) Downloading base files from Nintendo... (dmcu.d.hex) 141 | 142 | 143 | iconTex.png downloaded from Cucholix's Repo 144 | 145 | 146 | The Wii U Common Key has been verified. 147 | 148 | 149 | Converting all image sources to expected TGA specification 150 | 151 | 152 | 153 | ..\Resources\clearbuildoutput.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 154 | 155 | 156 | Saving files from Nintendo for future use... 157 | 158 | 159 | Invalid Title ID 160 | 161 | 162 | Auto 163 | 164 | 165 | This is not a GameCube image. It will not be loaded. 166 | 167 | 168 | (One-Time Download) Downloading base files from Nintendo... (fw.img) 169 | 170 | 171 | Boot Sound has not been specified 172 | 173 | 174 | Icon has not been specified 175 | 176 | 177 | STOP 178 | 179 | 180 | Make sure your Banner is 1280x720 (16:9) to prevent distortion 181 | 182 | 183 | Build cancelled. 184 | 185 | 186 | (One-Time Download) Downloading base files from Nintendo... (bootLogoTex.tga) 187 | 188 | 189 | Your internet connection could not be verified, do you wish to try and download the necessary base files from Nintendo anyways? (This is a one-time download) 190 | 191 | 192 | Args: 193 | 194 | 195 | Check your hard drive space 196 | 197 | 198 | The Wii Video Mode Changer will now be launched. I recommend using the Smart Patcher option. 199 | 200 | If you're scared and don't know what you're doing, close the patcher window and nothing will be patched. 201 | 202 | Click OK to continue... 203 | 204 | 205 | TitleID... 206 | 207 | 208 | The Title Key has been verified. 209 | 210 | 211 | (One-Time Download) Downloading base files from Nintendo... (fw.tmd) 212 | 213 | 214 | boot.dol 215 | 216 | 217 | Your sound file will be cut off if it's longer than 6 seconds to prevent the Wii U from not loading it. When the Wii U plays the boot sound, it will fade out once it's done loading the game (usually after about 5 seconds). You can not change this. 218 | 219 | 220 | BUILD 221 | 222 | 223 | Specify your boot sound 224 | 225 | 226 | Stop Sound 227 | 228 | 229 | Wii Dumps (*.iso,*.wbfs)|*.iso;*.wbfs 230 | 231 | 232 | Closing 233 | 234 | 235 | This is not a GameCube image. It will not be loaded. 236 | 237 | 238 | (One-Time Download) Downloading base files from Nintendo... (bootMovie.h264) 239 | 240 | 241 | Title ID specification cancelled, reselect vWii NAND Title Launcher to specify 242 | 243 | 244 | Generating app.xml and meta.xml 245 | 246 | 247 | Play Sound 248 | 249 | 250 | Failed to download base files using JNUSTool, conversion will not continue 251 | 252 | 253 | Nintendont Forwarder (*.dol)|*.dol 254 | 255 | 256 | (One-Time Download) Downloading base files from Nintendo... (bootSound.btsnd) 257 | 258 | 259 | GamePad Banner has not been specified 260 | 261 | 262 | (One-Time Download) Downloading base files from Nintendo... (deint.txt) 263 | 264 | 265 | (One-Time Download) Downloading base files from Nintendo... (htk.bin) 266 | 267 | 268 | Banner has not been specified 269 | 270 | 271 | . 272 | 273 | Install your title using WUP Installer GX2 with signature patches enabled (CBHC, Haxchi, etc). Make sure you have signature patches enabled when launching your title. 274 | 275 | Click OK to continue... 276 | 277 | 278 | Please select your game before using this option 279 | 280 | 281 | Conversion complete... 282 | 283 | 284 | Conversion Complete... 285 | 286 | 287 | (Optional) Line 2 288 | 289 | 290 | Processing game for NFS Conversion 291 | 292 | 293 | Converting processed game to NFS format 294 | 295 | 296 | Copying base files to temporary build directory 297 | 298 | 299 | (One-Time Download) Downloading base files from Nintendo... (nn_hai_user.rpl) 300 | 301 | 302 | Your image will be converted to PNG (Lossless) to be later processed. 303 | 304 | 305 | Config generation complete. 306 | 307 | 308 | Specify your game file 309 | 310 | 311 | Download complete. 312 | 313 | 314 | (One-Time Download) Downloading base files from Nintendo... (boot.bin) 315 | 316 | 317 | bootTvTex.png downloaded from Cucholix's Repo 318 | 319 | 320 | (One-Time Download) Downloading base files from Nintendo... (c2w.img) 321 | 322 | 323 | XXXX 324 | 325 | 326 | <- Specify custom main.dol file 327 | 328 | 329 | .NET Framework 3.5 was not detected on your machine, which is required by programs used during the build process. 330 | 331 | You should be able to enable this in "Programs and Features" under "Turn Windows features on or off", or download it from Microsoft. 332 | 333 | Click OK to close the injector and open "Programs and Features"... 334 | 335 | 336 | N/A 337 | 338 | 339 | Are you sure you want to close? 340 | 341 | 342 | ..\Resources\TOOLDIR.zip;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 343 | 344 | 345 | Specify your GameCube game's 2nd disc 346 | 347 | 348 | Are you sure to cancel the current build progress? 349 | 350 | 351 | (One-Time Download) Downloading base files from Nintendo... (banner.gsh / fade.gsh) 352 | 353 | 354 | All conversions have been completed. 355 | Succeed: {0}. 356 | Failed: {1}. 357 | Skipped: {2}. 358 | Invalid: {3}. 359 | 360 | 361 | Make sure your GamePad Banner is 854x480 (16:9) to prevent distortion 362 | 363 | 364 | (One-Time Download) Downloading base files from Nintendo... 365 | 366 | 367 | Make sure your icon is 128x128 (1:1) to prevent distortion 368 | 369 | 370 | Internet Connection Verification Failed 371 | 372 | 373 | Conversion Complete 374 | 375 | 376 | Cucholix's Repo does not have assets for your game. You will need to provide your own. Would you like to visit the GBAtemp request thread? 377 | 378 | 379 | Executing: 380 | 381 | 382 | Output folder selection has been cancelled, conversion will not continue. 383 | 384 | 385 | Enter your WAD's Title ID 386 | 387 | 388 | Make sure your Logo is 170x42 to prevent distortion 389 | 390 | 391 | Game file has not been specified 392 | 393 | 394 | Game... 395 | 396 | 397 | Drive not specified, nowhere to download contents 398 | 399 | 400 | (One-Time Download) Downloading base files from Nintendo... (frisbiiU.rpx) 401 | 402 | 403 | GameCube Dumps (*.gcm,*.iso)|*.gcm;*.iso 404 | 405 | 406 | (One-Time Download) Downloading base files from Nintendo... (font.bin) 407 | 408 | 409 | This is not a Wii image. It will not be loaded. 410 | 411 | 412 | The Wii U Starbuck Ancast Key you have provided is incorrect 413 | (MD5 Hash verification failed) 414 | 415 | 416 | Converting user provided sound to btsnd format 417 | 418 | 419 | Enter your installed Wii Channel's 4-letter Title ID. If you don't know it, open a WAD for the channel in something like ShowMiiWads to view it. 420 | 421 | 422 | GameCube Disk 2 (*.gcm,*.iso)|*.gcm;*.iso 423 | 424 | 425 | Stop building 426 | 427 | 428 | Specify your replacement Nintendont Forwarder 429 | 430 | 431 | Game not found on Repo 432 | 433 | 434 | Can't create the specified output directory, conversion will not continue. 435 | Additional error information: 436 | 437 | 438 | DOL Files (*.dol)|*.dol 439 | 440 | 441 | .NET Framework v3.5 not found... 442 | 443 | 444 | Downloading... 445 | 446 | 447 | Encrypting contents into installable WUP Package 448 | 449 | 450 | The Title Key you have provided is incorrect 451 | (MD5 Hash verification failed) 452 | 453 | 454 | game 455 | 456 | 457 | Your hard drive may be low on space. The conversion process involves temporary files that can amount to more than double the size of your game. If you continue without clearing some hard drive space, the conversion may fail. Do you want to continue anyways? 458 | 459 | 460 | Conversion will now continue... 461 | 462 | 463 | NULL 464 | 465 | 466 | The Wii U Common Key you have provided is incorrect 467 | (MD5 Hash verification failed) 468 | 469 | 470 | ..\Resources\autoscroll.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 471 | 472 | 473 | Build succeed. 474 | 475 | 476 | Build failed. 477 | 478 | 479 | Auto generated. 480 | 481 | 482 | Create temporary directory failed, it may be caused by low space on hard drive, permission denied or invalid path name. 483 | 484 | 485 | Error 486 | 487 | 488 | Force 489 | 490 | 491 | Force (Deflicker) 492 | 493 | 494 | None 495 | 496 | 497 | 507 (Unstable) 498 | 499 | 500 | 1019 (Unstable) 501 | 502 | 503 | 2043 (Unstable) 504 | 505 | 506 | Automatic 507 | 508 | 509 | English 510 | 511 | 512 | German 513 | 514 | 515 | French 516 | 517 | 518 | Spanish 519 | 520 | 521 | Italian 522 | 523 | 524 | Dutch 525 | 526 | 527 | Cheats 528 | 529 | 530 | Memcard Emulation 531 | 532 | 533 | Cheat Path 534 | 535 | 536 | Force Widescreen 537 | 538 | 539 | Force Progressive 540 | 541 | 542 | Unlock Read Speed 543 | 544 | 545 | OSReport 546 | 547 | 548 | WiiU Widescreen 549 | 550 | 551 | Log 552 | 553 | 554 | Auto Video Width 555 | 556 | 557 | Patch PAL50 558 | 559 | 560 | TRI Arcade Mode 561 | 562 | 563 | Wiimote CC Rumble 564 | 565 | 566 | Skip IPL 567 | 568 | 569 | Download Error 570 | 571 | 572 | Failed to connect to Cucholix's Repo. 573 | 574 | 575 | failed. 576 | 577 | 578 | done. 579 | 580 | 581 | Checking temporary directory 582 | 583 | 584 | Checking free disk space 585 | 586 | 587 | Checking output directory 588 | 589 | 590 | Checking JNUS stuffs 591 | 592 | 593 | terminated unexpectedly: 594 | 595 | 596 | Left [{0}]. 597 | 598 | 599 | ..\Resources\ids.csv;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 600 | 601 | 602 | Debug 603 | 604 | 605 | Info 606 | 607 | 608 | Invalid Title: {0}. 609 | 610 | 611 | does not exit normally. 612 | 613 | 614 | Download background from GameTDB.com 615 | 616 | 617 | Use default background 618 | 619 | 620 | ..\Resources\universal_Wii_WiiWare_template_bootTvTex.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 621 | 622 | 623 | ..\Resources\universal_Wii_WiiWare_template_iconTex.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 624 | 625 | 626 | Fail to download images from GameTDB.com. 627 | 628 | 629 | Processing [{0}] [{1}]... 630 | 631 | 632 | Title output folder already exists: {0} 633 | Skipping: {1}. 634 | 635 | 636 | 637 | Injector version: {0} 638 | 639 | 640 | Build type: {0} 641 | 642 | 643 | Batch build: {0} 644 | 645 | 646 | Yes 647 | 648 | 649 | No 650 | 651 | 652 | Build options: 653 | 654 | 655 | Build time(UTC): {0} 656 | 657 | 658 | {0}(Available free space: {1}) 659 | 660 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/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 | namespace TeconMoon_s_WiiVC_Injector.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.3.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Properties/app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 47 | 54 | 55 | 69 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Resources/TOOLDIR.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/Resources/TOOLDIR.zip -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Resources/autoscroll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/Resources/autoscroll.png -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Resources/clearbuildoutput.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/Resources/clearbuildoutput.png -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Resources/gc.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/Resources/gc.ttf -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Resources/universal_Wii_WiiWare_template_bootTvTex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/Resources/universal_Wii_WiiWare_template_bootTvTex.png -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Resources/universal_Wii_WiiWare_template_iconTex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/Resources/universal_Wii_WiiWare_template_iconTex.png -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Resources/wii.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/Resources/wii.ttf -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Resources/wiiware.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/Resources/wiiware.png -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/SplitButton.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Windows.Forms; 4 | 5 | namespace TeconMoon_s_WiiVC_Injector 6 | { 7 | namespace Utils 8 | { 9 | namespace WinForms 10 | { 11 | internal class SplitButton : Button 12 | { 13 | public SplitButton() 14 | { 15 | // 16 | // McAfee(lovesafe 16R22, up-to-date, 5/28/2020) 17 | // will kill us because the following line: 18 | // 19 | // ImageAlign = ContentAlignment.MiddleRight; 20 | // 21 | // Indeed, you can't set any button's ImageAlign property 22 | // in THIS project. I have tested this class in a new emtpy 23 | // winform project, and it's for free to use ImageAlign. 24 | // 25 | typeof(SplitButton).GetProperty("ImageAlign") 26 | .SetValue(this, ContentAlignment.MiddleRight); 27 | 28 | // 29 | // But the magic is that after the reflection method used, 30 | // here you can call ImageAlign = ContentAlignment.MiddleRight 31 | // without any problem now. And it's not the problem of the 32 | // code order. If the reflection method was not called before 33 | // it, we will still be killed even if you put it to 34 | // last line of the function. 35 | // So what the hell is in McAfee's virus signature database... 36 | // 37 | // ImageAlign = ContentAlignment.MiddleRight; 38 | 39 | TextImageRelation = TextImageRelation.TextBeforeImage; 40 | 41 | // 42 | // Assign slpit image. 43 | // 44 | Image = CreateSplitImage(); 45 | 46 | splitWidth = SplitWidth; 47 | marginTop = MarginTop; 48 | marginBottom = MarginBottom; 49 | } 50 | 51 | // 52 | // Create a triangle image. 53 | // 54 | private static Image CreateSplitImage() 55 | { 56 | int splitImgWidth = 8; 57 | int splitImgHeight = 4; 58 | Bitmap bitmap = new Bitmap(splitImgWidth, splitImgHeight); 59 | Point[] points = { 60 | new Point(0, 0), 61 | new Point(splitImgWidth, 0), 62 | new Point(splitImgWidth / 2, splitImgHeight) }; 63 | 64 | using (Graphics graphics = Graphics.FromImage(bitmap)) 65 | { 66 | graphics.FillPolygon( 67 | new SolidBrush(Color.Black), 68 | points); 69 | } 70 | 71 | return bitmap; 72 | } 73 | 74 | // 75 | // With the reflection method, using this property will casue 76 | // a performance issue. 77 | // 78 | private int SplitWidth 79 | { 80 | get 81 | { 82 | dynamic margin = typeof(SplitButton).GetProperty("Margin").GetValue(this); 83 | return Image.Width + margin.Left + margin.Right; 84 | } 85 | } 86 | 87 | // 88 | // With the reflection method, using this property will casue 89 | // a performance issue. 90 | // 91 | private int MarginTop 92 | { 93 | get 94 | { 95 | dynamic margin = typeof(SplitButton).GetProperty("Margin").GetValue(this); 96 | return margin.Top; 97 | } 98 | } 99 | 100 | // 101 | // Can't get bottom to work even using reflection under McAfee. 102 | // 103 | private int MarginBottom => MarginTop; 104 | 105 | // 106 | // Cache the properties, but bewared that if the margin 107 | // is changed at runtime, these cached values will not 108 | // be updated. Adding an event handler for margin changed 109 | // will do it well, but it's unnecessary for us here. 110 | // 111 | private readonly int splitWidth = 0; 112 | private readonly int marginTop = 0; 113 | private readonly int marginBottom = 0; 114 | 115 | public ContextMenuStrip SplitMenu { get; set; } 116 | 117 | protected override void OnClick(EventArgs e) 118 | { 119 | Point clickPoint = PointToClient(new Point(MousePosition.X, MousePosition.Y)); 120 | 121 | if (clickPoint.X < (Width - splitWidth)) 122 | { 123 | base.OnClick(e); 124 | } 125 | else 126 | { 127 | ShowButtonMenu(); 128 | } 129 | } 130 | 131 | protected override void OnPaint(PaintEventArgs pevent) 132 | { 133 | base.OnPaint(pevent); 134 | 135 | // 136 | // If you see any 'Weird' codes, that is because CRAZY McAfee. 137 | // 138 | pevent.Graphics.DrawLine( 139 | new Pen(Color.Black, 1), 140 | Width - splitWidth, 141 | marginTop, 142 | Width - splitWidth, 143 | Height - marginBottom); 144 | } 145 | 146 | private void ShowButtonMenu() 147 | { 148 | SplitMenu?.Show( 149 | this, new Point(0, this.Height), 150 | ToolStripDropDownDirection.BelowRight); 151 | } 152 | } 153 | } 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/TeconMoon's WiiVC Injector.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {8228DC31-4869-4C1C-8AED-D7ED37ECF3B9} 8 | WinExe 9 | TeconMoon_s_WiiVC_Injector 10 | TeconMoon%27s WiiVC Injector Mod 11 | v4.6.1 12 | 512 13 | true 14 | false 15 | 16 | C:\Users\Khade\Desktop\ 17 | true 18 | Disk 19 | false 20 | Foreground 21 | 7 22 | Days 23 | false 24 | false 25 | true 26 | 1 27 | 1.0.0.%2a 28 | false 29 | true 30 | true 31 | 32 | 33 | AnyCPU 34 | true 35 | full 36 | false 37 | bin\Debug\ 38 | DEBUG;TRACE 39 | prompt 40 | 4 41 | 42 | 43 | AnyCPU 44 | pdbonly 45 | true 46 | bin\Release\ 47 | TRACE 48 | prompt 49 | 4 50 | 51 | 52 | WiiU.ico 53 | 54 | 55 | 56 | 8B2598DF212C90E8BD2B80161EEBF23E278C0C9B 57 | 58 | 59 | TeconMoon%27s WiiVC Injector_TemporaryKey.pfx 60 | 61 | 62 | false 63 | 64 | 65 | false 66 | 67 | 68 | LocalIntranet 69 | 70 | 71 | 72 | Properties\app.manifest 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | Form 93 | 94 | 95 | Form 96 | 97 | 98 | Form 99 | 100 | 101 | Form 102 | 103 | 104 | Form 105 | 106 | 107 | 108 | 109 | 110 | Component 111 | 112 | 113 | 114 | Form 115 | 116 | 117 | Form1.cs 118 | 119 | 120 | Form 121 | 122 | 123 | Form2.cs 124 | 125 | 126 | 127 | 128 | True 129 | True 130 | Resources.resx 131 | 132 | 133 | 134 | 135 | 136 | Form1.cs 137 | Designer 138 | 139 | 140 | Form2.cs 141 | 142 | 143 | ResXFileCodeGenerator 144 | Designer 145 | Resources.Designer.cs 146 | 147 | 148 | 149 | SettingsSingleFileGenerator 150 | Settings.Designer.cs 151 | 152 | 153 | True 154 | Settings.settings 155 | True 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | False 179 | Microsoft .NET Framework 4.6.1 %28x86 and x64%29 180 | true 181 | 182 | 183 | False 184 | .NET Framework 3.5 SP1 185 | false 186 | 187 | 188 | 189 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Tga.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Drawing.Imaging; 4 | using System.IO; 5 | using System.Text; 6 | 7 | namespace ImageUtils 8 | { 9 | 10 | class Tga 11 | { 12 | 13 | public static Image loadTga(string path) 14 | { 15 | using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) 16 | { 17 | return loadTga(stream); 18 | } 19 | } 20 | 21 | public static Image loadTga(Stream stream) 22 | { 23 | Bitmap result = null; 24 | 25 | BinaryReader reader = new BinaryReader(stream); 26 | 27 | byte idFieldLength = (byte)stream.ReadByte(); 28 | byte colorMap = (byte)stream.ReadByte(); 29 | byte imageType = (byte)stream.ReadByte(); 30 | reader.BaseStream.Position = 0xC; 31 | int width = reader.ReadUInt16(); 32 | reader.BaseStream.Position = 0xE; 33 | int height = reader.ReadUInt16(); 34 | reader.BaseStream.Position = 0x10; 35 | byte bpp = (byte)stream.ReadByte(); 36 | reader.BaseStream.Position = 0x11; 37 | byte flags = (byte)stream.ReadByte(); 38 | 39 | if(colorMap > 0 || bpp < 16 || imageType > 3) { 40 | throw new InvalidDataException("Unsupported TGA file."); 41 | } 42 | 43 | if (idFieldLength > 0) 44 | { 45 | stream.Read(new byte[idFieldLength], 0, idFieldLength); 46 | } 47 | 48 | byte[] line = new byte[width * (bpp / 8)]; 49 | 50 | result = new Bitmap(width, height); 51 | for (int y = height - 1; y >= 0; y--) 52 | { 53 | switch (bpp) 54 | { 55 | case 16: 56 | int hi, lo; 57 | for (int x = 0; x < width; x++) 58 | { 59 | hi = stream.ReadByte(); 60 | lo = stream.ReadByte(); 61 | 62 | Color pixel = Color.FromArgb(255, 63 | (byte)(((lo & 0x7F) >> 2) << 3), 64 | (byte)((((lo & 0x3) << 3) + ((hi & 0xE0) >> 5)) << 3), 65 | (byte)((hi & 0x1F) << 3) 66 | ); 67 | result.SetPixel(x, y, pixel); 68 | } 69 | break; 70 | case 24: 71 | stream.Read(line, 0, line.Length); 72 | for (int x = 0; x < width; x++) 73 | { 74 | Color pixel = Color.FromArgb(255, 75 | line[x * 3 + 2], 76 | line[x * 3 + 1], 77 | line[x * 3] 78 | ); 79 | result.SetPixel(x, y, pixel); 80 | } 81 | break; 82 | case 32: 83 | stream.Read(line, 0, line.Length); 84 | for (int x = 0; x < width; x++) 85 | { 86 | Color pixel = Color.FromArgb(line[x * 4 + 3], 87 | line[x * 4 + 2], 88 | line[x * 4 + 1], 89 | line[x * 4]); 90 | result.SetPixel(x, y, pixel); 91 | } 92 | break; 93 | } 94 | } 95 | 96 | switch((flags >> 4) & 0x3) 97 | { 98 | case 1: 99 | result.RotateFlip(RotateFlipType.RotateNoneFlipX); 100 | break; 101 | case 2: 102 | result.RotateFlip(RotateFlipType.RotateNoneFlipY); 103 | break; 104 | case 3: 105 | result.RotateFlip(RotateFlipType.RotateNoneFlipXY); 106 | break; 107 | } 108 | 109 | 110 | return result; 111 | } 112 | 113 | public static void saveTGA(Image image, PixelFormat pixelFormat, string path) 114 | { 115 | Bitmap bitmap = (Bitmap)image; 116 | 117 | byte entryPerPixel; 118 | byte bpp; 119 | 120 | switch (pixelFormat) 121 | { 122 | case PixelFormat.Format32bppArgb: 123 | entryPerPixel = 8; 124 | bpp = 32; 125 | break; 126 | case PixelFormat.Format24bppRgb: 127 | entryPerPixel = 0; 128 | bpp = 24; 129 | break; 130 | default: 131 | throw new InvalidDataException("Unsupported bpp."); 132 | } 133 | 134 | using (Stream file = File.Create(path)) 135 | { 136 | using (BinaryWriter writer = new BinaryWriter(file)) 137 | { 138 | // Header 139 | writer.Write(new byte[] 140 | { 141 | 0, // ID length 142 | 0, // no color map 143 | 2, // uncompressed, true color 144 | 0, 0, 0, 0, 145 | 0, 146 | 0, 0, 0, 0, // x and y origin 147 | (byte)(bitmap.Width & 0x00FF), 148 | (byte)((bitmap.Width & 0xFF00) >> 8), 149 | (byte)(bitmap.Height & 0x00FF), 150 | (byte)((bitmap.Height & 0xFF00) >> 8), 151 | bpp, 152 | entryPerPixel 153 | }); 154 | 155 | // Image 156 | for (int y = 0; y < bitmap.Height; y++) 157 | { 158 | for (int x = 0; x < bitmap.Width; x++) 159 | { 160 | Color c = bitmap.GetPixel(x, bitmap.Height - y - 1); 161 | writer.Write(new[] 162 | { 163 | c.B, 164 | c.G, 165 | c.R 166 | }); 167 | 168 | if (bpp == 32) 169 | { 170 | writer.Write(c.A); 171 | } 172 | } 173 | } 174 | 175 | // Footer 176 | writer.Write(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }); 177 | writer.Write(Encoding.ASCII.GetBytes("TRUEVISION-XFILE")); 178 | writer.Write(new byte[] { 46, 0 }); 179 | } 180 | } 181 | } 182 | 183 | } 184 | 185 | } -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Trt.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | using TeconMoon_s_WiiVC_Injector.Utils; 3 | 4 | namespace TeconMoon_s_WiiVC_Injector 5 | { 6 | static class Trt 7 | { 8 | private static TranslationTemplate Tt { get; } = TranslationTemplate.LoadTemplate( 9 | Application.StartupPath + @"\language.lang", true); 10 | 11 | public static bool IsValidate 12 | { 13 | get 14 | { 15 | return Tt.IsValidate; 16 | } 17 | } 18 | 19 | static public void TranslateForm(Form form) 20 | { 21 | Tt.TranslateForm(form); 22 | } 23 | 24 | static public string Tr(string s) 25 | { 26 | return Tt.Tr(s); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Utils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Drawing; 5 | using System.Drawing.Imaging; 6 | using System.Drawing.Text; 7 | using System.Globalization; 8 | using System.IO; 9 | using System.Linq; 10 | using System.Reflection; 11 | using System.Resources; 12 | using System.Runtime.InteropServices; 13 | using System.Text; 14 | using System.Threading; 15 | using System.Windows.Forms; 16 | 17 | namespace TeconMoon_s_WiiVC_Injector 18 | { 19 | namespace Utils 20 | { 21 | namespace Build 22 | { 23 | enum BuildOutputType 24 | { 25 | Normal, 26 | Succeed, 27 | Error, 28 | Step, 29 | Exec, 30 | }; 31 | 32 | class BuildOutputItem 33 | { 34 | public string Output { get; set; } 35 | public BuildOutputType OutputType { get; set; } 36 | }; 37 | 38 | class BuildOutputBuffer 39 | { 40 | public BuildOutputBuffer(int initialCapacity = 16 * 1024) 41 | { 42 | stringBuilder = new StringBuilder(initialCapacity); 43 | } 44 | 45 | public event EventHandler FlushBuffer; 46 | 47 | private List buildOutputItems = new List(); 48 | private StringBuilder stringBuilder; 49 | 50 | private bool OutputCanbeCached(BuildOutputType outputType) 51 | { 52 | if (buildOutputItems.Any()) 53 | { 54 | return buildOutputItems.Last().OutputType == outputType; 55 | } 56 | 57 | return false; 58 | } 59 | 60 | private void FlushCache() 61 | { 62 | if (buildOutputItems.Any()) 63 | { 64 | buildOutputItems.Last().Output = stringBuilder.ToString(); 65 | } 66 | 67 | stringBuilder.Clear(); 68 | } 69 | 70 | public void AppendOutput(string output, BuildOutputType outputType, bool appendNewline = true) 71 | { 72 | if (String.IsNullOrEmpty(output)) 73 | { 74 | return; 75 | } 76 | 77 | if (!OutputCanbeCached(outputType)) 78 | { 79 | FlushCache(); 80 | 81 | buildOutputItems.Add(new BuildOutputItem() 82 | { 83 | OutputType = outputType 84 | }); 85 | } 86 | 87 | stringBuilder.Append(output); 88 | if (appendNewline) 89 | { 90 | stringBuilder.Append(Environment.NewLine); 91 | } 92 | } 93 | 94 | public void Flush() 95 | { 96 | FlushCache(); 97 | 98 | EventHandler handler = FlushBuffer; 99 | if (handler == null) 100 | { 101 | buildOutputItems.Clear(); 102 | return; 103 | } 104 | 105 | while (buildOutputItems.Any()) 106 | { 107 | BuildOutputItem item = buildOutputItems.First(); 108 | handler.Invoke(this, item); 109 | buildOutputItems.Remove(item); 110 | } 111 | } 112 | } 113 | } 114 | 115 | class Draw 116 | { 117 | // Get a adjusted font which is fit to specified width and height. 118 | // Using Graphics's method. 119 | // Modified from MSDN: https://msdn.microsoft.com/en-us/library/bb986765.aspx 120 | public static Font GetGraphicAdjustedFont( 121 | Graphics g, 122 | string graphicString, 123 | Font originalFont, 124 | int containerWidth, 125 | int containerHeight, 126 | int maxFontSize, 127 | int minFontSize, 128 | StringFormat stringFormat, 129 | bool smallestOnFail 130 | ) 131 | { 132 | Font testFont = null; 133 | // We utilize MeasureString which we get via a control instance 134 | for (int adjustedSize = maxFontSize; adjustedSize >= minFontSize; adjustedSize--) 135 | { 136 | testFont = new Font(originalFont.Name, adjustedSize, originalFont.Style); 137 | 138 | // Test the string with the new size 139 | SizeF adjustedSizeNew = g.MeasureString( 140 | graphicString, 141 | testFont, 142 | containerWidth, 143 | stringFormat); 144 | 145 | if (containerWidth > Convert.ToInt32(adjustedSizeNew.Width) && 146 | containerHeight > Convert.ToInt32(adjustedSizeNew.Height)) 147 | { 148 | // Good font, return it 149 | return testFont; 150 | } 151 | } 152 | 153 | // If you get here there was no fontsize that worked 154 | // return minimumSize or original? 155 | if (smallestOnFail) 156 | { 157 | return testFont; 158 | } 159 | else 160 | { 161 | return originalFont; 162 | } 163 | } 164 | 165 | // Get a adjusted font which is fit to specified width and height. 166 | // Using TextRenderer's method. 167 | public static Font GetTextRendererAdjustedFont( 168 | Graphics g, 169 | string text, 170 | Font originalFont, 171 | int containerWidth, 172 | int containerHeight, 173 | int maxFontSize, 174 | int minFontSize, 175 | TextFormatFlags flags, 176 | bool smallestOnFail 177 | ) 178 | { 179 | Font testFont = null; 180 | // We utilize MeasureText which we get via a control instance 181 | for (int adjustedSize = maxFontSize; adjustedSize >= minFontSize; adjustedSize--) 182 | { 183 | testFont = new Font(originalFont.Name, adjustedSize, originalFont.Style); 184 | 185 | // Test the string with the new size 186 | Size adjustedSizeNew = TextRenderer.MeasureText( 187 | g, 188 | text, 189 | testFont, 190 | new Size(containerWidth, containerHeight), 191 | flags); 192 | 193 | if (containerWidth > adjustedSizeNew.Width && 194 | containerHeight > adjustedSizeNew.Height) 195 | { 196 | // Good font, return it 197 | return testFont; 198 | } 199 | } 200 | 201 | // If you get here there was no fontsize that worked 202 | // return minimumSize or original? 203 | if (smallestOnFail) 204 | { 205 | return testFont; 206 | } 207 | else 208 | { 209 | return originalFont; 210 | } 211 | } 212 | 213 | // Draw a string in a specified rectangle with 214 | // a specified font with max font size that can 215 | // fit to the rectangle. 216 | public static void ImageDrawString( 217 | ref Bitmap bitmap, 218 | string s, 219 | Rectangle rectangle, 220 | Font font, 221 | Color foreColor, 222 | bool adjustedFontByTextRenderer, 223 | bool drawStringByTextRenderer 224 | ) 225 | { 226 | StringFormat stringFormat = StringFormat.GenericDefault; 227 | 228 | using (Graphics graphics = Graphics.FromImage(bitmap)) 229 | { 230 | TextFormatFlags flags = TextFormatFlags.HorizontalCenter 231 | | TextFormatFlags.VerticalCenter 232 | | TextFormatFlags.WordBreak; 233 | 234 | if (!adjustedFontByTextRenderer) 235 | { 236 | font = GetGraphicAdjustedFont( 237 | graphics, 238 | s, 239 | font, 240 | rectangle.Width, 241 | rectangle.Height, 242 | 100, 8, 243 | stringFormat, 244 | true); 245 | } 246 | else 247 | { 248 | // Can't get the correct word break output 249 | // if we use GetGraphicAdjustedFont. 250 | // But it's really more slower than 251 | // GetGraphicAdjustedFont. 252 | font = GetTextRendererAdjustedFont( 253 | graphics, 254 | s, 255 | font, 256 | rectangle.Width, 257 | rectangle.Height, 258 | 64, 8, 259 | flags, 260 | true); 261 | } 262 | 263 | if (!drawStringByTextRenderer) 264 | { 265 | SizeF sizeF = graphics.MeasureString(s, font, rectangle.Width); 266 | 267 | RectangleF rectF = new RectangleF( 268 | rectangle.X + (rectangle.Width - sizeF.Width) / 2, 269 | rectangle.Y + (rectangle.Height - sizeF.Height) / 2, 270 | sizeF.Width, 271 | sizeF.Height); 272 | 273 | graphics.DrawString( 274 | s, 275 | font, 276 | new SolidBrush(foreColor), 277 | rectF, 278 | stringFormat); 279 | } 280 | else 281 | { 282 | // Poor draw performance, both for speed and output result. 283 | Size size = TextRenderer.MeasureText( 284 | graphics, 285 | s, 286 | font, 287 | new Size(rectangle.Width, rectangle.Height), 288 | flags); 289 | 290 | Rectangle rect = new Rectangle( 291 | rectangle.X + (rectangle.Width - size.Width) / 2, 292 | rectangle.Y + (rectangle.Height - size.Height) / 2, 293 | size.Width, 294 | size.Height); 295 | 296 | TextRenderer.DrawText( 297 | graphics, 298 | s, 299 | font, 300 | rect, 301 | foreColor, 302 | flags); 303 | } 304 | } 305 | } 306 | 307 | public static void SetGraphicsBestQuility(ref Graphics gfx) 308 | { 309 | gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 310 | gfx.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 311 | gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 312 | gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 313 | gfx.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 314 | } 315 | 316 | public static Image ResizeAndFitImage(Image image, Size newSize) 317 | { 318 | return ResizeAndFitImage(image, newSize, newSize); 319 | } 320 | 321 | public static Image ResizeAndFitImage(Image image, Size newSize, Size fillSize) 322 | { 323 | Bitmap result = new Bitmap(fillSize.Width, fillSize.Height); 324 | result.SetResolution(image.HorizontalResolution, image.VerticalResolution); 325 | 326 | Graphics gfx = Graphics.FromImage(result); 327 | SetGraphicsBestQuility(ref gfx); 328 | gfx.FillRectangle(Brushes.White, 0, 0, fillSize.Width, fillSize.Height); 329 | 330 | using (ImageAttributes wrapMode = new ImageAttributes()) 331 | { 332 | wrapMode.SetWrapMode(System.Drawing.Drawing2D.WrapMode.TileFlipXY); 333 | 334 | int y = (fillSize.Height / 2) - newSize.Height / 2; 335 | int x = (fillSize.Width / 2) - newSize.Width / 2; 336 | 337 | Rectangle destRect = new Rectangle(x, y, newSize.Width, newSize.Height); 338 | gfx.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); 339 | } 340 | 341 | gfx.Dispose(); 342 | image.Dispose(); 343 | return result; 344 | } 345 | } 346 | 347 | public static class RichTextBoxExtensions 348 | { 349 | public static void AppendText(this RichTextBox box, string text, Color color) 350 | { 351 | AppendText(box, text, color, null); 352 | } 353 | 354 | public static void AppendText(this RichTextBox box, string text, Color color, Font font) 355 | { 356 | Win32Native.LockWindowUpdate(box.Handle); 357 | int savedSelectionStart = box.SelectionStart; 358 | int savedSelectionLength = box.SelectionLength; 359 | box.SelectionStart = box.TextLength; 360 | box.SelectionLength = 0; 361 | 362 | box.SelectionColor = color; 363 | if (font != null) 364 | { 365 | box.SelectionFont = font; 366 | } 367 | 368 | box.AppendText(text); 369 | box.SelectionColor = box.ForeColor; 370 | box.SelectionFont = box.Font; 371 | box.SelectionStart = savedSelectionStart; 372 | box.SelectionLength = savedSelectionLength; 373 | Win32Native.LockWindowUpdate(IntPtr.Zero); 374 | } 375 | } 376 | 377 | class StringEx 378 | { 379 | // Check if the input byte array is GB2312 encoded. 380 | static public bool IsGB2312EncodingArray(byte[] b) 381 | { 382 | int i = 0; 383 | while (i < b.Length) 384 | { 385 | if (b[i] <= 127) 386 | { 387 | ++i; 388 | continue; 389 | } 390 | 391 | if (b[i] >= 176 && b[i] <= 247) 392 | { 393 | if (i == b.Length - 1) 394 | { 395 | return false; 396 | } 397 | ++i; 398 | 399 | if (b[i] < 160 || b[i] > 254) 400 | { 401 | return false; 402 | } 403 | 404 | ++i; 405 | } 406 | else 407 | { 408 | return false; 409 | } 410 | } 411 | 412 | return true; 413 | } 414 | 415 | // Get a probably encoding object for input array. 416 | static public Encoding GetArrayEncoding(byte[] b) 417 | { 418 | if (IsGB2312EncodingArray(b)) 419 | { 420 | return Encoding.GetEncoding("GB2312"); 421 | } 422 | 423 | // We assume it is utf8 by default. 424 | return Encoding.UTF8; 425 | } 426 | 427 | // Read a string from a binary stream. 428 | static public string ReadStringFromBinaryStream(BinaryReader reader, long position, bool peek = false) 429 | { 430 | long oldPosition = 0; 431 | 432 | if (peek) 433 | { 434 | oldPosition = reader.BaseStream.Position; 435 | } 436 | 437 | reader.BaseStream.Position = position; 438 | ArrayList readBuffer = new ArrayList(); 439 | byte b; 440 | while ((b = reader.ReadByte()) != 0) 441 | { 442 | readBuffer.Add(b); 443 | } 444 | 445 | if (peek) 446 | { 447 | reader.BaseStream.Position = oldPosition; 448 | } 449 | 450 | byte[] readBytes = readBuffer.OfType().ToArray(); 451 | return Encoding.Default.GetString(Encoding.Convert( 452 | GetArrayEncoding(readBytes), 453 | Encoding.Default, 454 | readBytes)); 455 | } 456 | } 457 | 458 | class TranslationTemplate 459 | { 460 | protected const string SectionResource = "@Resource"; 461 | protected const string KeyFormTitle = "@Title"; 462 | protected const string KeyLanguage = "language"; 463 | protected const string KeyVerion = "verion"; 464 | protected const string KeyAuthor = "author"; 465 | 466 | private readonly bool cacheEnabled = false; 467 | private ReaderWriterLockSlim trStrResCacheLock = new ReaderWriterLockSlim(); 468 | private Dictionary trStrResCache = new Dictionary(); 469 | 470 | private delegate void TrControl(Control control); 471 | 472 | private struct SpecialControlTr 473 | { 474 | public Type controlType; 475 | public TrControl trControl; 476 | }; 477 | 478 | private IniFile TemplateFile 479 | { 480 | get; 481 | set; 482 | } 483 | 484 | public bool IsValidate 485 | { 486 | get 487 | { 488 | if (String.IsNullOrWhiteSpace(TemplateFileName)) 489 | { 490 | return false; 491 | } 492 | 493 | return File.Exists(TemplateFileName); 494 | } 495 | } 496 | 497 | public string TemplateFileName 498 | { 499 | get 500 | { 501 | return TemplateFile != null ? TemplateFile.FileName : ""; 502 | } 503 | } 504 | 505 | private TranslationTemplate(string templateFile, bool enableCache) 506 | { 507 | TemplateFile = new IniFile(templateFile); 508 | cacheEnabled = enableCache; 509 | } 510 | 511 | static public TranslationTemplate LoadTemplate(string templateFilePath, bool enableCache) 512 | { 513 | return new TranslationTemplate(templateFilePath, enableCache); 514 | } 515 | 516 | public static TranslationTemplate CreateTemplate( 517 | string templateFilePath, 518 | string appName, 519 | string defaultLanguageName, 520 | string version, 521 | string author 522 | ) 523 | { 524 | TranslationTemplate template = new TranslationTemplate(templateFilePath, false); 525 | 526 | template.TemplateFile.CurrentSection = appName; 527 | template.TemplateFile.WriteStringValue(KeyLanguage, defaultLanguageName); 528 | template.TemplateFile.WriteStringValue(KeyVerion, version); 529 | template.TemplateFile.WriteStringValue(KeyAuthor, author); 530 | 531 | return template; 532 | } 533 | 534 | public void AppendFormTranslation(Form form) 535 | { 536 | TemplateFile.CurrentSection = form.Name; 537 | TemplateFile.WriteStringValue(KeyFormTitle, form.Text); 538 | 539 | foreach (Control control in form.Controls) 540 | { 541 | AppendControlTranslation(control); 542 | } 543 | } 544 | 545 | private void AppendControlTranslation(Control control) 546 | { 547 | if (!String.IsNullOrEmpty(control.Text)) 548 | { 549 | TemplateFile.WriteStringValue(control.Name, control.Text); 550 | } 551 | 552 | foreach (Control subControl in control.Controls) 553 | { 554 | AppendControlTranslation(subControl); 555 | } 556 | 557 | ToolStrip toolStrip = control as ToolStrip; 558 | if (toolStrip != null) 559 | { 560 | foreach (ToolStripItem item in toolStrip.Items) 561 | { 562 | AppendToolStripItemTranslation(item); 563 | } 564 | } 565 | } 566 | 567 | private void AppendToolStripItemTranslation(ToolStripItem item) 568 | { 569 | if (!String.IsNullOrEmpty(item.Text)) 570 | { 571 | TemplateFile.WriteStringValue(item.Name, item.Text); 572 | } 573 | } 574 | 575 | public void AppendStringResourceTranslation(ResourceSet resourceSet) 576 | { 577 | TemplateFile.CurrentSection = SectionResource; 578 | 579 | foreach (DictionaryEntry dictionaryEntry in resourceSet) 580 | { 581 | if (dictionaryEntry.Value is string) 582 | { 583 | TemplateFile.WriteStringValue( 584 | dictionaryEntry.Key.ToString(), 585 | dictionaryEntry.Value.ToString()); 586 | } 587 | } 588 | } 589 | 590 | public void TranslateForm(Form form) 591 | { 592 | TemplateFile.CurrentSection = form.Name; 593 | _TranslateControl(form, KeyFormTitle); 594 | 595 | foreach (Control control in form.Controls) 596 | { 597 | TranslateControl(control); 598 | } 599 | } 600 | 601 | private void TranslateControl(Control control) 602 | { 603 | _TranslateControl(control); 604 | 605 | foreach (Control subControl in control.Controls) 606 | { 607 | TranslateControl(subControl); 608 | } 609 | 610 | SpecialControlTr[] specialControlTrs = new SpecialControlTr[] 611 | { 612 | new SpecialControlTr 613 | { 614 | controlType = typeof(ToolStrip), 615 | trControl = TranslateToolStrip 616 | }, 617 | new SpecialControlTr 618 | { 619 | controlType = typeof(ComboBox), 620 | trControl = TranslateComboBox 621 | }, 622 | new SpecialControlTr 623 | { 624 | controlType = typeof(CheckedListBox), 625 | trControl = TranslateCheckedListBox 626 | }, 627 | }; 628 | 629 | foreach (SpecialControlTr sTr in specialControlTrs) 630 | { 631 | if (control.GetType() == sTr.controlType) 632 | { 633 | sTr.trControl(control); 634 | break; 635 | } 636 | } 637 | } 638 | 639 | private void _TranslateControl(Control control) 640 | { 641 | _TranslateControl(control, control.Name); 642 | } 643 | 644 | private void _TranslateControl(Control control, string id) 645 | { 646 | string translation = TemplateFile.ReadStringValue(id, 1024); 647 | 648 | if (!String.IsNullOrEmpty(translation)) 649 | { 650 | control.Text = translation; 651 | } 652 | } 653 | 654 | private void TranslateToolStrip(Control control) 655 | { 656 | ToolStrip toolStrip = control as ToolStrip; 657 | 658 | if (toolStrip != null) 659 | { 660 | foreach (ToolStripItem item in toolStrip.Items) 661 | { 662 | TranslateToolStripItem(item); 663 | } 664 | } 665 | } 666 | 667 | private void TranslateToolStripItem(ToolStripItem item) 668 | { 669 | TranslateToolStripItem(item, item.Name); 670 | } 671 | 672 | private void TranslateToolStripItem(ToolStripItem item, string id) 673 | { 674 | string translation = TemplateFile.ReadStringValue(id, 1024); 675 | 676 | if (!String.IsNullOrEmpty(translation)) 677 | { 678 | item.Text = translation; 679 | } 680 | 681 | if (item is ToolStripComboBox) 682 | { 683 | ToolStripComboBox comboBox = item as ToolStripComboBox; 684 | for (int i = 0; i < comboBox.Items.Count; ++i) 685 | { 686 | comboBox.Items[i] = Tr(comboBox.Items[i] as string); 687 | } 688 | } 689 | } 690 | 691 | private void TranslateComboBox(Control control) 692 | { 693 | ComboBox comboBox = control as ComboBox; 694 | 695 | if (comboBox == null || comboBox.Items == null) 696 | { 697 | return; 698 | } 699 | 700 | for (int i = 0; i < comboBox.Items.Count; ++i) 701 | { 702 | comboBox.Items[i] = Tr(comboBox.Items[i] as string); 703 | } 704 | } 705 | 706 | private void TranslateCheckedListBox(Control control) 707 | { 708 | CheckedListBox checkedListBox = control as CheckedListBox; 709 | 710 | if (checkedListBox == null || checkedListBox.Items == null) 711 | { 712 | return; 713 | } 714 | 715 | for (int i = 0; i < checkedListBox.Items.Count; ++i) 716 | { 717 | checkedListBox.Items[i] = Tr(checkedListBox.Items[i] as string); 718 | } 719 | } 720 | 721 | public string Tr(string s) 722 | { 723 | if (!IsValidate || String.IsNullOrEmpty(s)) 724 | { 725 | return s; 726 | } 727 | 728 | if (cacheEnabled) 729 | { 730 | trStrResCacheLock.EnterReadLock(); 731 | 732 | try 733 | { 734 | if (trStrResCache.ContainsKey(s)) 735 | { 736 | return trStrResCache[s]; 737 | } 738 | } 739 | finally 740 | { 741 | trStrResCacheLock.ExitReadLock(); 742 | } 743 | } 744 | 745 | // 746 | // issue#3: Reported by @JueLuo99 at github.com. 747 | // Use CultureInfo.InvariantCulture instead of 748 | // CultureInfo.CurrentCulture when call 749 | // ResourceManager.GetResourceSet, because 750 | // ResourceManager.GetResourceSet may return 751 | // null which is influenced by the language 752 | // setting of OS. 753 | // 754 | ResourceSet resourceSet = Properties.Resources.ResourceManager.GetResourceSet( 755 | CultureInfo.InvariantCulture, true, false); 756 | 757 | string trS = (from DictionaryEntry r in resourceSet 758 | where r.Value is string 759 | && s.Equals((r.Value as string).Replace("\r\n", "\n")) 760 | select TrId(r.Key.ToString())).DefaultIfEmpty(s).First(); 761 | 762 | if (cacheEnabled) 763 | { 764 | trStrResCacheLock.EnterWriteLock(); 765 | 766 | try 767 | { 768 | trStrResCache.Add(s, trS); 769 | } 770 | finally 771 | { 772 | trStrResCacheLock.ExitWriteLock(); 773 | } 774 | } 775 | return trS; 776 | } 777 | 778 | private string TrId(string id) 779 | { 780 | string s = TemplateFile.ReadStringValue(SectionResource, id, 1024); 781 | 782 | if (String.IsNullOrEmpty(s)) 783 | { 784 | return Properties.Resources.ResourceManager.GetString(id); 785 | } 786 | 787 | return s; 788 | } 789 | } 790 | 791 | class IniFile 792 | { 793 | public string FileName 794 | { 795 | get; 796 | protected set; 797 | } 798 | 799 | public string CurrentSection 800 | { 801 | get; 802 | set; 803 | } 804 | 805 | public IniFile(string iniFile) 806 | { 807 | FileName = iniFile; 808 | } 809 | 810 | public bool WriteStringValue(string key, string value) 811 | { 812 | return WriteStringValue(CurrentSection, key, value); 813 | } 814 | 815 | public bool WriteStringValue(string section, string key, string value) 816 | { 817 | return Win32Native.WritePrivateProfileString( 818 | section, 819 | key, 820 | value.Replace("\r", "\\r").Replace("\n", "\\n"), 821 | FileName); 822 | } 823 | 824 | public string ReadStringValue(string key, int maxLength, string defaultValue = "") 825 | { 826 | return ReadStringValue(CurrentSection, key, maxLength, defaultValue); 827 | } 828 | 829 | public string ReadStringValue(string section, string key, int maxLength, string defaultValue = "") 830 | { 831 | StringBuilder buffer = new StringBuilder(maxLength); 832 | buffer.Length = maxLength; 833 | string value = buffer.ToString(0, maxLength); 834 | int length = (int)Win32Native.GetPrivateProfileString( 835 | section, 836 | key, 837 | defaultValue, 838 | value, 839 | (uint)maxLength, 840 | FileName); 841 | return value.Substring(0, length) 842 | .Replace("\\r", "\r") 843 | .Replace("\\n", "\n"); 844 | } 845 | 846 | public string[] GetSections() 847 | { 848 | string value = new StringBuilder(65535).ToString(0, 65535); 849 | if (Win32Native.GetPrivateProfileString(null, null, "", value, 65535, FileName) != 0) 850 | { 851 | return StringsFromMultiString(value); 852 | } 853 | 854 | return new string[0]; 855 | } 856 | 857 | private static string[] StringsFromMultiString(string s) 858 | { 859 | string[] raw = s.Split('\0'); 860 | return raw.Take(raw.Length - 2).ToArray(); 861 | } 862 | } 863 | 864 | class TitleIdMap 865 | { 866 | public static Dictionary BuildIdMap() 867 | { 868 | Dictionary result = new Dictionary(); 869 | 870 | // McAfee dislikes ids.csv... 871 | using (var stream = new MemoryStream(Properties.Resources.ids)) 872 | using (var reader = new StreamReader(stream)) 873 | { 874 | while (!reader.EndOfStream) 875 | { 876 | string line = reader.ReadLine(); 877 | string[] ids = line.Split(','); 878 | foreach(string id in ids) 879 | { 880 | string[] mappedIds = ids.Where(val => val != id).ToArray(); 881 | result.Add(id, mappedIds); 882 | } 883 | } 884 | } 885 | 886 | return result; 887 | } 888 | } 889 | 890 | class Resources 891 | { 892 | public static Stream getResouceStream(string fileName) 893 | { 894 | string resourceName = Assembly.GetExecutingAssembly().GetManifestResourceNames().Single(str => str.EndsWith("Resources." + fileName)); 895 | return Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); 896 | } 897 | } 898 | 899 | class Fonts 900 | { 901 | public static PrivateFontCollection craeteNewFontCollection(string fontName) 902 | { 903 | PrivateFontCollection result = new PrivateFontCollection(); 904 | using (var stream = Resources.getResouceStream(fontName)) 905 | { 906 | IntPtr data = Marshal.AllocCoTaskMem((int)stream.Length); 907 | byte[] fontdata = new byte[stream.Length]; 908 | stream.Read(fontdata, 0, (int)stream.Length); 909 | Marshal.Copy(fontdata, 0, data, (int)stream.Length); 910 | result.AddMemoryFont(data, (int)stream.Length); 911 | } 912 | 913 | return result; 914 | } 915 | } 916 | 917 | class Misc 918 | { 919 | public static string NormalizePath(string path) 920 | { 921 | return Path.GetFullPath(new Uri(path).LocalPath) 922 | .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); 923 | } 924 | 925 | public static bool PathEquals(string path1, string path2, bool fsCaseInsensitive = true) 926 | { 927 | string canonicalName1 = NormalizePath(path1); 928 | string canonicalName2 = NormalizePath(path2); 929 | 930 | return canonicalName1.Equals( 931 | canonicalName2, 932 | fsCaseInsensitive 933 | ? StringComparison.OrdinalIgnoreCase 934 | : StringComparison.Ordinal); 935 | } 936 | 937 | public static string GetLengthString(long length) 938 | { 939 | // >= 1GB 940 | if (length >= 1024 * 1024 * 1024) 941 | { 942 | return $"{length / 1024.0 / 1024.0 / 1024.0:0.##} GB"; 943 | } 944 | 945 | // >= 1MB 946 | if (length >= 1024 * 1024) 947 | { 948 | return $"{length / 1024.0 / 1024.0:0.##} MB"; 949 | } 950 | 951 | // >= 1KB 952 | if (length >= 1024) 953 | { 954 | return $"{length / 1024.0:0.##} KB"; 955 | } 956 | 957 | return $"{length} Bytes"; 958 | } 959 | } 960 | } 961 | } -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/WiiU.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timefox/TeconMoon-s-WiiVC-Injector-Mod/5fe2b874ca2f05a266bb51cc0f6f58709d71fd90/TeconMoon's WiiVC Injector/WiiU.ico -------------------------------------------------------------------------------- /TeconMoon's WiiVC Injector/Win32Native.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | 4 | namespace TeconMoon_s_WiiVC_Injector 5 | { 6 | class Win32Native 7 | { 8 | [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 9 | internal static extern bool WritePrivateProfileString( 10 | string lpAppName, string lpKeyName, string lpString, string lpFileName); 11 | 12 | [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 13 | internal static extern uint GetPrivateProfileString( 14 | string lpAppName, string lpKeyName, string lpDefault, string lpReturnedString, 15 | uint nSize, string lpFileName); 16 | 17 | [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 18 | internal static extern IntPtr LockWindowUpdate(IntPtr Handle); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /nintendontvalues.txt: -------------------------------------------------------------------------------- 1 | Nintendont Config Offsets 2 | (overlapping values seem to just be added together) 3 | 4 | 09: 5 | 01 = triforce mode 6 | 02 = Wii Remote Rumble 7 | 04 = skip ipl 8 | 9 | 0A-0C: Options 10 | 000000 = None 11 | 000100 = Cheats 12 | 000801 = Memcard Emu 13 | 200000 = Memcard Multi (Requires Memcard Emu) 14 | 001001 = Cheat Path 15 | 002001 = Force Widescreen 16 | 004003 = Force Progressive 17 | 010004 = Unlock Read Speed 18 | 020004 = OSReport 19 | 800004 = WiiU Widescreen 20 | 100012 = Log 21 | 22 | 0D: Video 23 | 00 = Auto 24 | 01 = Force 25 | 05 = Force (Deflicker) 26 | 02 = None 27 | 28 | 0F: Video Modes 29 | 10 = None (When not using Force options) 30 | 14 = NTSC 31 | 18 = MPAL 32 | 11 = PAL50 33 | 12 = PAL60 34 | 20 = Patch PAL50 (Add when mixed with a forced video mode) 35 | 34 = Example: NTSC + Patch Pal50 36 | 37 | 38 | 10-13: Language 39 | 0000 = English 40 | 0001 = German 41 | 0002 = French 42 | 0003 = Spanish 43 | 0004 = Italian 44 | 0005 = Dutch 45 | FFFF = Auto 46 | 47 | 21C: Memcard Blocks 48 | 00 = 59 49 | 01 = 123 50 | 02 = 251 51 | 03 = 507 (Unstable) 52 | 04 = 1019 (Unstable) 53 | 05 = 2043 (Unstable) 54 | 55 | 21D: Video Width 56 | 00 = Auto 57 | 28 = 640 58 | 78 = 720 59 | 60 | 21E: Video Offset (won't use) 61 | EC: -20 62 | ED: -19 63 | EE: -18 64 | EF: -17 65 | F0: -16 66 | F1: -15 67 | F2: -14 68 | F3: -13 69 | F4: -12 70 | F5: -11 71 | F6: -10 72 | F7: -09 73 | F8: -08 74 | F9: -07 75 | FA: -06 76 | FB: -05 77 | FC: -04 78 | FD: -03 79 | FE: -02 80 | FF: -01 81 | 00: +00 82 | 01: +01 83 | 02: +02 84 | 03: +03 85 | 04: +04 86 | 05: +05 87 | 06: +06 88 | 07: +07 89 | 08: +08 90 | 09: +09 91 | 0A: +10 92 | 0B: +11 93 | 0C: +12 94 | 0D: +13 95 | 0E: +14 96 | 0F: +15 97 | 10: +16 98 | 11: +17 99 | 12: +18 100 | 13: +19 101 | 14: +20 --------------------------------------------------------------------------------