├── .gitattributes ├── .gitignore ├── BmLauncherAsylumNET6.csproj ├── BmLauncherAsylumNET6.sln ├── LICENSE ├── Program.cs ├── Properties ├── Resources.Designer.cs └── Resources.resx ├── README.md ├── Resources ├── BmCamera.ini ├── BmCompat.ini ├── BmEditor.ini ├── BmEditorUserSettings.ini ├── BmEngine.ini ├── BmGame.ini ├── BmInput.ini ├── BmUI.ini ├── LauncherStart1.png ├── NVSetter.exe ├── NvAPIWrapper.dll ├── UserEngine.ini ├── UserGame.ini ├── UserInput.ini ├── favicon.ico └── nexus_icon.ico ├── _config.yml ├── _layouts └── default.html ├── _sass └── jekyll-theme-minimalist.scss ├── data ├── Graphics.cs ├── GraphicsInterpreter.cs ├── GraphicsWriter.cs ├── GuiInitializer.cs ├── KeybindInterpreter.cs ├── Presets.cs └── WineChecker.cs ├── infrastructure ├── Factory.cs ├── NativeMethods.cs ├── NvidiaWorker.cs └── SysResolutions.cs └── ui ├── BmLauncherForm.Designer.cs ├── BmLauncherForm.cs ├── BmLauncherForm.resx ├── CreditsWindow.Designer.cs ├── CreditsWindow.cs ├── CreditsWindow.resx ├── InputForm.Designer.cs ├── InputForm.cs ├── InputForm.resx ├── KeyHelpForm.Designer.cs ├── KeyHelpForm.cs ├── KeyHelpForm.resx ├── KeybindForm.Designer.cs ├── KeybindForm.cs ├── KeybindForm.resx ├── SpeedrunHint.Designer.cs ├── SpeedrunHint.cs └── SpeedrunHint.resx /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET Core 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # ASP.NET Scaffolding 66 | ScaffoldingReadMe.txt 67 | 68 | # StyleCop 69 | StyleCopReport.xml 70 | 71 | # Files built by Visual Studio 72 | *_i.c 73 | *_p.c 74 | *_h.h 75 | *.ilk 76 | *.meta 77 | *.obj 78 | *.iobj 79 | *.pch 80 | *.pdb 81 | *.ipdb 82 | *.pgc 83 | *.pgd 84 | *.rsp 85 | *.sbr 86 | *.tlb 87 | *.tli 88 | *.tlh 89 | *.tmp 90 | *.tmp_proj 91 | *_wpftmp.csproj 92 | *.log 93 | *.tlog 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Microsoft Azure Build Output 210 | csx/ 211 | *.build.csdef 212 | 213 | # Microsoft Azure Emulator 214 | ecf/ 215 | rcf/ 216 | 217 | # Windows Store app package directories and files 218 | AppPackages/ 219 | BundleArtifacts/ 220 | Package.StoreAssociation.xml 221 | _pkginfo.txt 222 | *.appx 223 | *.appxbundle 224 | *.appxupload 225 | 226 | # Visual Studio cache files 227 | # files ending in .cache can be ignored 228 | *.[Cc]ache 229 | # but keep track of directories ending in .cache 230 | !?*.[Cc]ache/ 231 | 232 | # Others 233 | ClientBin/ 234 | ~$* 235 | *~ 236 | *.dbmdl 237 | *.dbproj.schemaview 238 | *.jfm 239 | *.pfx 240 | *.publishsettings 241 | orleans.codegen.cs 242 | 243 | # Including strong name files can present a security risk 244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 245 | #*.snk 246 | 247 | # Since there are multiple workflows, uncomment next line to ignore bower_components 248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 249 | #bower_components/ 250 | 251 | # RIA/Silverlight projects 252 | Generated_Code/ 253 | 254 | # Backup & report files from converting an old project file 255 | # to a newer Visual Studio version. Backup files are not needed, 256 | # because we have git ;-) 257 | _UpgradeReport_Files/ 258 | Backup*/ 259 | UpgradeLog*.XML 260 | UpgradeLog*.htm 261 | ServiceFabricBackup/ 262 | *.rptproj.bak 263 | 264 | # SQL Server files 265 | *.mdf 266 | *.ldf 267 | *.ndf 268 | 269 | # Business Intelligence projects 270 | *.rdl.data 271 | *.bim.layout 272 | *.bim_*.settings 273 | *.rptproj.rsuser 274 | *- [Bb]ackup.rdl 275 | *- [Bb]ackup ([0-9]).rdl 276 | *- [Bb]ackup ([0-9][0-9]).rdl 277 | 278 | # Microsoft Fakes 279 | FakesAssemblies/ 280 | 281 | # GhostDoc plugin setting file 282 | *.GhostDoc.xml 283 | 284 | # Node.js Tools for Visual Studio 285 | .ntvs_analysis.dat 286 | node_modules/ 287 | 288 | # Visual Studio 6 build log 289 | *.plg 290 | 291 | # Visual Studio 6 workspace options file 292 | *.opt 293 | 294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 295 | *.vbw 296 | 297 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 298 | *.vbp 299 | 300 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 301 | *.dsw 302 | *.dsp 303 | 304 | # Visual Studio 6 technical files 305 | *.ncb 306 | *.aps 307 | 308 | # Visual Studio LightSwitch build output 309 | **/*.HTMLClient/GeneratedArtifacts 310 | **/*.DesktopClient/GeneratedArtifacts 311 | **/*.DesktopClient/ModelManifest.xml 312 | **/*.Server/GeneratedArtifacts 313 | **/*.Server/ModelManifest.xml 314 | _Pvt_Extensions 315 | 316 | # Paket dependency manager 317 | .paket/paket.exe 318 | paket-files/ 319 | 320 | # FAKE - F# Make 321 | .fake/ 322 | 323 | # CodeRush personal settings 324 | .cr/personal 325 | 326 | # Python Tools for Visual Studio (PTVS) 327 | __pycache__/ 328 | *.pyc 329 | 330 | # Cake - Uncomment if you are using it 331 | # tools/** 332 | # !tools/packages.config 333 | 334 | # Tabs Studio 335 | *.tss 336 | 337 | # Telerik's JustMock configuration file 338 | *.jmconfig 339 | 340 | # BizTalk build output 341 | *.btp.cs 342 | *.btm.cs 343 | *.odx.cs 344 | *.xsd.cs 345 | 346 | # OpenCover UI analysis results 347 | OpenCover/ 348 | 349 | # Azure Stream Analytics local run output 350 | ASALocalRun/ 351 | 352 | # MSBuild Binary and Structured Log 353 | *.binlog 354 | 355 | # NVidia Nsight GPU debugger configuration file 356 | *.nvuser 357 | 358 | # MFractors (Xamarin productivity tool) working folder 359 | .mfractor/ 360 | 361 | # Local History for Visual Studio 362 | .localhistory/ 363 | 364 | # Visual Studio History (VSHistory) files 365 | .vshistory/ 366 | 367 | # BeatPulse healthcheck temp database 368 | healthchecksdb 369 | 370 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 371 | MigrationBackup/ 372 | 373 | # Ionide (cross platform F# VS Code tools) working folder 374 | .ionide/ 375 | 376 | # Fody - auto-generated XML schema 377 | FodyWeavers.xsd 378 | 379 | # VS Code files for those working on multiple tools 380 | .vscode/* 381 | !.vscode/settings.json 382 | !.vscode/tasks.json 383 | !.vscode/launch.json 384 | !.vscode/extensions.json 385 | *.code-workspace 386 | 387 | # Local History for Visual Studio Code 388 | .history/ 389 | 390 | # Windows Installer files from build outputs 391 | *.cab 392 | *.msi 393 | *.msix 394 | *.msm 395 | *.msp 396 | 397 | # JetBrains Rider 398 | *.sln.iml 399 | -------------------------------------------------------------------------------- /BmLauncherAsylumNET6.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | Resources\favicon.ico 10 | Neato 11 | neatodev 12 | Batman: Arkham Asylum Advanced Launcher 13 | https://github.com/neatodev/BmLauncherAsylumNET6 14 | https://github.com/neatodev/BmLauncherAsylumNET6 15 | git 16 | en 17 | 1.0.0 18 | 1.0.0 19 | CC BY-NC-SA 4.0 20 | true 21 | neatodev 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | True 37 | True 38 | Resources.resx 39 | 40 | 41 | 42 | 43 | 44 | ResXFileCodeGenerator 45 | Resources.Designer.cs 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /BmLauncherAsylumNET6.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.2.32616.157 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BmLauncherAsylumNET6", "BmLauncherAsylumNET6.csproj", "{F19A0F14-CB46-4C57-99BB-E7B490B36B99}" 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 | {F19A0F14-CB46-4C57-99BB-E7B490B36B99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {F19A0F14-CB46-4C57-99BB-E7B490B36B99}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {F19A0F14-CB46-4C57-99BB-E7B490B36B99}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {F19A0F14-CB46-4C57-99BB-E7B490B36B99}.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 = {0FB4C64D-12C8-4F6D-98BE-4CDF2D411B3B} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using BmLauncherAsylumNET6.infrastructure; 2 | using BmLauncherAsylumNET6.ui; 3 | using NLog; 4 | using NLog.Config; 5 | using NLog.Targets; 6 | using System.Diagnostics; 7 | using System.Globalization; 8 | 9 | namespace BmLauncherAsylumNET6 10 | 11 | { 12 | /// 13 | /// Replacement Application for the original Batman: Arkham Asylum BmLauncher 14 | /// Offers more configuration options, enables compatibility with High-Res Texture Packs 15 | /// and automatically takes care of the ReadOnly properties of each file, removing 16 | /// any requirement to manually edit .ini files. Guarantees a much more comfortable user experience. 17 | /// @author frofoo (https://steamcommunity.com/id/frofoo) 18 | /// 19 | internal static class Program 20 | { 21 | // logger for easy debugging 22 | private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 23 | 24 | public static Factory MyFactory; 25 | 26 | public static BmLauncherForm Client; 27 | 28 | public static NvidiaWorker NvWorker; 29 | 30 | private static readonly string CurrentTime = DateTime.Now.ToString("dd-MM-yy__hh-mm-ss"); 31 | 32 | // Mutex with this applications GUID as name 33 | private static readonly Mutex Mutex = new(true, "{cbb275f6-724f-4e82-a403-e333dcf6c0bf}"); 34 | 35 | [STAThread] 36 | private static void Main(string[] args) 37 | { 38 | if (Mutex.WaitOne(TimeSpan.Zero, true)) 39 | { 40 | SetupLogger(); 41 | logger.Info("Main - Starting logs at {0}, on {1}.", 42 | DateTime.Now.ToString("HH:mm:ss"), DateTime.Now.ToString("D", new CultureInfo("en-GB"))); 43 | 44 | if (args.Contains("-nolauncher")) 45 | { 46 | Mutex.ReleaseMutex(); 47 | LauncherBypass(); 48 | } 49 | else 50 | { 51 | RunWindow(); 52 | Mutex.ReleaseMutex(); 53 | } 54 | } 55 | else 56 | { 57 | NativeMethods.PostMessage((IntPtr)NativeMethods.HwndBroadcast, NativeMethods.WmShowme, IntPtr.Zero, 58 | IntPtr.Zero); 59 | } 60 | } 61 | 62 | private static void SetupLogger() 63 | { 64 | LoggingConfiguration config = new(); 65 | ConsoleTarget logconsole = new("logconsole"); 66 | if (!Directory.Exists("logs")) 67 | { 68 | Directory.CreateDirectory("logs"); 69 | } 70 | 71 | FileTarget logfile = new("logfile") 72 | { 73 | FileName = Directory.GetCurrentDirectory() + "\\logs\\bmlauncher_report__" + CurrentTime + ".log" 74 | }; 75 | DirectoryInfo logDirectory = new(Directory.GetCurrentDirectory() + "\\logs"); 76 | DateTime oldestAllowedArchive = DateTime.Now - new TimeSpan(3, 0, 0, 0); 77 | foreach (FileInfo file in logDirectory.GetFiles()) 78 | { 79 | if (file.CreationTime < oldestAllowedArchive) 80 | { 81 | file.Delete(); 82 | } 83 | } 84 | 85 | config.AddRule(LogLevel.Debug, LogLevel.Warn, logconsole); 86 | config.AddRule(LogLevel.Debug, LogLevel.Warn, logfile); 87 | LogManager.Configuration = config; 88 | } 89 | 90 | private static void DetectTexmod() 91 | { 92 | DirectoryInfo d = new(Directory.GetCurrentDirectory()); 93 | FileInfo[] Files = d.GetFiles("*.exe"); 94 | foreach (FileInfo f in Files) 95 | { 96 | if (f.Name == "texmod_autoload.exe") 97 | { 98 | Factory.TexmodDetected = true; 99 | } 100 | } 101 | } 102 | 103 | public static void LauncherBypass() // Edited from BmLauncherForm.launchButton_Click 104 | { 105 | logger.Info("Launcher bypassed: No configuration changes made."); 106 | 107 | 108 | using (Process launchBmGame = new()) 109 | { 110 | try 111 | { 112 | Factory.InputFileInfo.IsReadOnly = true; 113 | if (Factory.TexmodDetected) 114 | { 115 | launchBmGame.StartInfo.FileName = "texmod_autoload.exe"; 116 | launchBmGame.StartInfo.CreateNoWindow = true; 117 | launchBmGame.Start(); 118 | logger.Info("Launching Texmod. Logging has concluded at {0}, on {1}.", 119 | DateTime.Now.ToString("HH:mm:ss"), DateTime.Now.ToString("D", new CultureInfo("en-GB"))); 120 | LogManager.Flush(); 121 | Application.Exit(); 122 | } 123 | else 124 | { 125 | launchBmGame.StartInfo.FileName = "ShippingPC-BmGame.exe"; 126 | launchBmGame.StartInfo.CreateNoWindow = true; 127 | launchBmGame.Start(); 128 | logger.Info("Launching game application. Logging has concluded at {0}, on {1}.", 129 | DateTime.Now.ToString("HH:mm:ss"), DateTime.Now.ToString("D", new CultureInfo("en-GB"))); 130 | LogManager.Flush(); 131 | Application.Exit(); 132 | } 133 | } 134 | catch (Exception) 135 | { 136 | MessageBox.Show( 137 | "Couldn't find ShippingPC_BmGame.exe or texmod_autoload.exe.\r\nPlease place the Launcher files in the correct folder.\r\n" + 138 | "\r\nThe correct install folder is: \\Batman Arkham Asylum GOTY\\Binaries.", 139 | @"Could not start game!", 140 | MessageBoxButtons.OK, 141 | MessageBoxIcon.Error); 142 | } 143 | } 144 | } 145 | 146 | public static void RunWindow() 147 | { 148 | new SysResolutions().getResolutions(); 149 | Application.EnableVisualStyles(); 150 | Application.SetCompatibleTextRenderingDefault(false); 151 | Client = new BmLauncherForm(); 152 | DetectTexmod(); 153 | MyFactory = new Factory(Client); 154 | MyFactory.readFiles(); 155 | Application.Run(Client); 156 | } 157 | } 158 | } -------------------------------------------------------------------------------- /Properties/Resources.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 BmLauncherAsylumNET6.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BmLauncherAsylumNET6.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized string similar to [BmGame.R3rdPersonCamera] 65 | ///EnableCameraAssist=True 66 | /// 67 | ///[IniVersion] 68 | ///0=1577365085.000000 69 | /// 70 | ///. 71 | /// 72 | internal static string BmCamera { 73 | get { 74 | return ResourceManager.GetString("BmCamera", resourceCulture); 75 | } 76 | } 77 | 78 | /// 79 | /// Looks up a localized string similar to [AppCompat] 80 | ///CPUScore1=1000 81 | ///CPUScore2=720 82 | ///CPUScore3=630 83 | ///CPUScore4=500 84 | ///CPUScore5=275 85 | ///CPUSpeed1=1.8 86 | ///CPUSpeed2=2.4 87 | ///CPUSpeed3=3.0 88 | ///CPUSpeed4=3.5 89 | ///CPUSpeed5=4.0 90 | ///CPUMultiCoreMult=1.75 91 | ///CPUHyperThreadMult=1.15 92 | ///CPUMemory1=0.5 93 | ///CPUMemory2=1.0 94 | ///CPUMemory3=1.0 95 | ///CPUMemory4=2.0 96 | ///CPUMemory5=3.0 97 | ///GPUmemory1=128 98 | ///GPUmemory2=128 99 | ///GPUmemory3=256 100 | ///GPUmemory4=512 101 | ///GPUmemory5=768 102 | ///GPUShader1=2 103 | ///GPUShader2=2 104 | ///GPUShader3=2 105 | ///GPUShader4=3 106 | ///GPUShader5=3 107 | /// 108 | ///[AppCompatGPU-0x10DE] 109 | ///VendorName=NVIDIA 110 | ///VendorMobileTag=Go 111 | ///0x014F [rest of string was truncated]";. 112 | /// 113 | internal static string BmCompat { 114 | get { 115 | return ResourceManager.GetString("BmCompat", resourceCulture); 116 | } 117 | } 118 | 119 | /// 120 | /// Looks up a localized string similar to [AnimSetViewer] 121 | ///CheckSingleInfluenceLOD=True 122 | /// 123 | ///[UnrealEd.KismetBindings] 124 | ///Bindings=(Key="O",SeqObjClassName="Engine.SeqVar_Object") 125 | ///Bindings=(Key="S",SeqObjClassName="Engine.SeqAct_PlaySound") 126 | ///Bindings=(Key="P",SeqObjClassName="Engine.SeqVar_Player") 127 | ///Bindings=(Key="I",SeqObjClassName="Engine.SeqVar_Int") 128 | ///Bindings=(Key="I",bControl=true,SeqObjClassName="Engine.SeqCond_CompareInt") 129 | ///Bindings=(Key="F",SeqObjClassName="Engine.SeqVar_Float") 130 | ///Bindings=(Key="F",bControl=true,SeqObjClassName="Engine.SeqCond_ [rest of string was truncated]";. 131 | /// 132 | internal static string BmEditor { 133 | get { 134 | return ResourceManager.GetString("BmEditor", resourceCulture); 135 | } 136 | } 137 | 138 | /// 139 | /// Looks up a localized string similar to [Editor.EditorUserSettings] 140 | ///AllowFlightCameraToRemapKeys=True 141 | ///PreviewThumbnailBackgroundColor=(R=0,G=0,B=0) 142 | ///PreviewThumbnailTranslucentMaterialBackgroundColor=(R=127,G=127,B=127) 143 | ///bAutoSaveEnable=True 144 | ///AutoSaveTimeMinutes=10 145 | /// 146 | ///[WindowPosManager] 147 | ///DlgAddSpecial=879,571,328,226,0 148 | ///DlgActorSearch=379,262,881,507,0 149 | ///DlgActorFactory=783,544,553,311,0 150 | ///DlgBuildProgress=560,475,806,180,0 151 | ///SurfaceProperties=647,491,514,477,0 152 | ///DockingContainer=64,33,940,1076,0 153 | ///FloatingFrame_DockingContainer=64,33,940,1076,0 154 | ///Dl [rest of string was truncated]";. 155 | /// 156 | internal static string BmEditorUserSettings { 157 | get { 158 | return ResourceManager.GetString("BmEditorUserSettings", resourceCulture); 159 | } 160 | } 161 | 162 | /// 163 | /// Looks up a localized string similar to [URL] 164 | ///Protocol=unreal 165 | ///Name=Player 166 | ///Map=Boot.umap 167 | ///LocalMap=Boot.umap 168 | ///TransitionMap=Entry 169 | ///MapExt=umap 170 | ///EXEName=BmGame.exe 171 | ///DebugEXEName=DEBUG-BmGame.exe 172 | ///SaveExt=usa 173 | ///Port=7777 174 | ///GameName=Batman 175 | ///GameNameShort=Bm 176 | /// 177 | ///[Engine.Engine] 178 | ///NetworkDevice=IpDrv.TcpNetDriver 179 | ///ConsoleClassName=Engine.Console 180 | ///GameViewportClientClassName=BmGame.RGFxGameViewportClient 181 | ///LocalPlayerClassName=Engine.LocalPlayer 182 | ///DataStoreClientClassName=Engine.DataStoreClient 183 | ///StorageDeviceManagerClassName=Engine.StorageDeviceManager 184 | ///La [rest of string was truncated]";. 185 | /// 186 | internal static string BmEngine { 187 | get { 188 | return ResourceManager.GetString("BmEngine", resourceCulture); 189 | } 190 | } 191 | 192 | /// 193 | /// Looks up a localized string similar to [Engine.GameInfo] 194 | ///DefaultGame=BmGame.RGameInfo 195 | ///DefaultServerGame=BmGame.RGameInfo 196 | ///bAdminCanPause=false 197 | ///MaxPlayers=1 198 | ///GameDifficulty=+1.0 199 | ///bChangeLevels=True 200 | ///MaxSpectators=0 201 | ///MaxIdleTime=+0.0 202 | ///MaxTimeMargin=+0.0 203 | ///TimeMarginSlack=+1.35 204 | ///MinTimeMargin=-1.0 205 | ///TotalNetBandwidth=32000 206 | ///MaxDynamicBandwidth=7000 207 | ///MinDynamicBandwidth=4000 208 | /// 209 | ///[Engine.AccessControl] 210 | ///IPPolicies=ACCEPT;* 211 | /// 212 | ///[Engine.GameReplicationInfo] 213 | ///ServerName=Another Server 214 | ///ShortName=Server 215 | ///MessageOfTheDay= 216 | /// 217 | ///[DefaultPlayer] 218 | ///Name=Player 219 | ///t [rest of string was truncated]";. 220 | /// 221 | internal static string BmGame { 222 | get { 223 | return ResourceManager.GetString("BmGame", resourceCulture); 224 | } 225 | } 226 | 227 | /// 228 | /// Looks up a localized string similar to [Engine.PlayerInput] 229 | ///MoveForwardSpeed=1200 230 | ///MoveStrafeSpeed=1200 231 | ///LookRightScale=375 232 | ///LookUpScale=-300 233 | ///MouseSensitivity=30.0 234 | ///DoubleClickTime=0.250000 235 | ///bEnableMouseSmoothing=true 236 | ///Bindings=(Name="Fire",Command="Button bFire | StartFire | OnRelease StopFire") 237 | ///Bindings=(Name="AltFire",Command="StartAltFire | OnRelease StopAltFire") 238 | ///Bindings=(Name="MoveForward",Command="Axis aBaseY Speed=1.0") 239 | ///Bindings=(Name="MoveBackward",Command="Axis aBaseY Speed=-1.0") 240 | ///Bindings=(Name="TurnLeft",Command="Axis aBaseX S [rest of string was truncated]";. 241 | /// 242 | internal static string BmInput { 243 | get { 244 | return ResourceManager.GetString("BmInput", resourceCulture); 245 | } 246 | } 247 | 248 | /// 249 | /// Looks up a localized string similar to [Engine.UIInteraction] 250 | ///UISkinName=DefaultUISkin.DefaultSkin 251 | ///UIJoystickDeadZone=0.9 252 | ///UIAxisMultiplier=1.0 253 | ///AxisRepeatDelay=0.2 254 | ///MouseButtonRepeatDelay=0.15 255 | ///DoubleClickTriggerSeconds=0.5 256 | ///DoubleClickPixelTolerance=1 257 | ///ToolTipInitialDelaySeconds=0.25 258 | ///ToolTipExpirationSeconds=5.0 259 | ///UISoundCueNames=GenericError 260 | ///UISoundCueNames=MouseEnter 261 | ///UISoundCueNames=MouseExit 262 | ///UISoundCueNames=Clicked 263 | ///UISoundCueNames=Focused 264 | ///UISoundCueNames=SceneOpened 265 | ///UISoundCueNames=SceneClosed 266 | ///UISoundCueNames=ListSubmit 267 | ///UISoundCue [rest of string was truncated]";. 268 | /// 269 | internal static string BmUI { 270 | get { 271 | return ResourceManager.GetString("BmUI", resourceCulture); 272 | } 273 | } 274 | 275 | /// 276 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 277 | /// 278 | internal static System.Drawing.Icon favicon { 279 | get { 280 | object obj = ResourceManager.GetObject("favicon", resourceCulture); 281 | return ((System.Drawing.Icon)(obj)); 282 | } 283 | } 284 | 285 | /// 286 | /// Looks up a localized resource of type System.Drawing.Bitmap. 287 | /// 288 | internal static System.Drawing.Bitmap LauncherStart1 { 289 | get { 290 | object obj = ResourceManager.GetObject("LauncherStart1", resourceCulture); 291 | return ((System.Drawing.Bitmap)(obj)); 292 | } 293 | } 294 | 295 | /// 296 | /// Looks up a localized resource of type System.Byte[]. 297 | /// 298 | internal static byte[] NvAPIWrapper { 299 | get { 300 | object obj = ResourceManager.GetObject("NvAPIWrapper", resourceCulture); 301 | return ((byte[])(obj)); 302 | } 303 | } 304 | 305 | /// 306 | /// Looks up a localized resource of type System.Byte[]. 307 | /// 308 | internal static byte[] NVSetter { 309 | get { 310 | object obj = ResourceManager.GetObject("NVSetter", resourceCulture); 311 | return ((byte[])(obj)); 312 | } 313 | } 314 | 315 | /// 316 | /// Looks up a localized string similar to [Configuration] 317 | ///BasedOn=..\BmGame\Config\DefaultEngine.ini 318 | /// 319 | ///[SystemSettings] 320 | ///Fullscreen=True 321 | ///UseVsync=False 322 | ///AllowD3D10=True 323 | ///ResX=1 324 | ///ResY=1 325 | ///EffectsLevel=3 326 | ///MaxMultisamples=1 327 | ///DynamicLights=True 328 | ///DepthOfField=True 329 | ///LensFlares=True 330 | ///Bloom=True 331 | ///DynamicShadows=True 332 | ///MotionBlur=False 333 | ///Distortion=True 334 | ///FogVolumes=True 335 | ///DisableSphericalHarmonicLights=False 336 | ///AmbientOcclusion=True 337 | ///DetailMode=2 338 | ///MaxShadowResolution=1024 339 | ///Stereo=False 340 | ///IniVersion=5.8 341 | /// 342 | ///[Engine.Engine] 343 | ///bOnScreenKismetWarnings=FALSE 344 | ///bSubtitl [rest of string was truncated]";. 345 | /// 346 | internal static string UserEngine { 347 | get { 348 | return ResourceManager.GetString("UserEngine", resourceCulture); 349 | } 350 | } 351 | 352 | /// 353 | /// Looks up a localized string similar to [Configuration] 354 | ///BasedOn=..\BmGame\Config\DefaultGame.ini 355 | /// 356 | ///[BmGame.RPlayerController] 357 | ///!CI_KeyboardMap="" 358 | ///CI_KeyboardMap="" ;CI_None 359 | ///.CI_KeyboardMap="Space" ;CI_Interact 360 | ///.CI_KeyboardMap="_MMB" ;CI_B 361 | ///.CI_KeyboardMap="_LMB" ;CI_X 362 | ///.CI_KeyboardMap="_RMB" ;CI_Y 363 | ///.CI_KeyboardMap="X" ;CI_VisionModes 364 | ///.CI_KeyboardMap="_RMB" ;CI_AimGadget 365 | ///.CI_KeyboardMap="_LMB" ;CI_UseGadget 366 | ///.CI_KeyboardMap="F" ;CI_UseGrapple 367 | ///.CI_KeyboardMap="" ;CI_UseScanner 368 | ///.CI_KeyboardMap="Tab" ;CI_Map 369 | ///.CI_KeyboardM [rest of string was truncated]";. 370 | /// 371 | internal static string UserGame { 372 | get { 373 | return ResourceManager.GetString("UserGame", resourceCulture); 374 | } 375 | } 376 | 377 | /// 378 | /// Looks up a localized string similar to [Configuration] 379 | ///BasedOn=..\BmGame\Config\DefaultInput.ini 380 | /// 381 | ///[Engine.PlayerInput] 382 | ///IniVersion=5.8 383 | ///.Bindings=(Name="W",Command="MoveForward | DebugMenuUpPressed | OnRelease DebugMenuUpReleased | Axis aRawLHJoyUp Speed=1.0", Shift=false, Control=false, Alt=false, bIgnoreShift=false, bIgnoreCtrl=false, bIgnoreAlt=false):META:COM_FORWARD,0,-1,-1,"",false,false,CI_Movement,CI_LeftStick,CI_LeftStickUp 384 | ///.Bindings=(Name="S",Command="MoveBackward | DebugMenuDownPressed | OnRelease DebugMenuDownReleased | Axis aRaw [rest of string was truncated]";. 385 | /// 386 | internal static string UserInput { 387 | get { 388 | return ResourceManager.GetString("UserInput", resourceCulture); 389 | } 390 | } 391 | } 392 | } 393 | -------------------------------------------------------------------------------- /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 | 122 | ..\Resources\BmCamera.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 123 | 124 | 125 | ..\Resources\BmCompat.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 126 | 127 | 128 | ..\Resources\BmEditor.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 129 | 130 | 131 | ..\Resources\BmEditorUserSettings.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 132 | 133 | 134 | ..\Resources\BmEngine.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 135 | 136 | 137 | ..\Resources\BmGame.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 138 | 139 | 140 | ..\Resources\BmInput.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 141 | 142 | 143 | ..\Resources\BmUI.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 144 | 145 | 146 | ..\Resources\favicon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 147 | 148 | 149 | ..\Resources\LauncherStart1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 150 | 151 | 152 | ..\Resources\NvAPIWrapper.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 153 | 154 | 155 | ..\Resources\NVSetter.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 156 | 157 | 158 | ..\Resources\UserEngine.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 159 | 160 | 161 | ..\Resources\UserGame.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 162 | 163 | 164 | ..\Resources\UserInput.ini;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 165 | 166 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Batman: Arkham Asylum - Advanced Launcher 2 | # OUTDATED - [USE THE NEW VERSION INSTEAD](https://neatodev.github.io/AsylumLauncher/) 3 | # NO FURTHER SUPPORT WILL BE PROVIDED FOR THIS VERSION OF THE LAUNCHER! 4 | 5 | This is a replacement application for the original BmLauncher of the game. Alongside vastly superior configuration options, this Launcher also offers: 6 | 7 | - Tooltips for every configuration option 8 | - Option to disable Startup Movies 9 | - Texmod Autoload Support 10 | - Option to boot directly into the game, skipping launcher screen 11 | - Experimental Wine (Linux) Support (More Information at the bottom) 12 | - Compatibility Fixes for [HD Texture Packs](https://steamcommunity.com/sharedfiles/filedetails/?id=1159691355) 13 | - NVIDIA API Implementation (Enable HBAO+ using the Launcher!) (Powered by [NvAPIWrapper](https://github.com/falahati/NvAPIWrapper)) 14 | - Extensive Logging Functionality (Powered by [NLog](https://github.com/NLog/NLog)) 15 | 16 | Works with both the Steam and EGS Version! 17 | 18 | **This Application is built with .NET 6**. If you are using Windows 10 and above you shouldn't have any issues simply running the program. Some users might need to install [.NET 6 Desktop Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) manually. 19 | 20 | A standalone, dependency free executable is also available. 21 | 22 | 23 | **This application has only been tested on Windows 7 SP1, Windows 8, Windows 8.1, Windows 10 and Wine. It supports the Steam, GOG and Epic Games Store version and nothing else.** 24 | 25 | ## Preview 26 | 27 | ![BMLauncher Preview](https://user-images.githubusercontent.com/49599979/195911308-4c53fa9e-8f6e-49dc-a626-c5cda228498a.png) 28 | 29 | ## Installation 30 | 31 | Drag the contents of the .zip file into the 'Batman Arkham Asylum GOTY\Binaries' folder. 32 | 33 | To find this folder for the *Steam* version, just right-click the game in Steam, select Properties->Local Files->Browse Local Files and navigate from there. 34 | 35 | To find it for the *EGS* version, right-click the game and select "Manage". Then click the folder icon in the "Installation" tab and navigate from there. 36 | 37 | For the *GOG* version, click the icon next to the PLAY button and select "Manage installation->Show folder" and navigate from there. 38 | 39 | ## Usage 40 | 41 | You can just launch your game via Steam or EGS as you normally would, though in some cases you might need to unblock the BmLauncher application for it to work properly. 42 | 43 | To do that, just right-click the application, select Properties and enable the highlighted checkbox as seen in the image below: 44 | 45 | ![Unblock Image](https://user-images.githubusercontent.com/49599979/75610370-e2268100-5b10-11ea-978d-c257a2466dc8.png) 46 | 47 | Once you're happy with your settings, you can skip the launcher entirely by using the `-nolauncher` launch option. 48 | 49 | - On *Steam* you can add this in Properties->Launch options. 50 | - On *EGS* you can add this under Settings->Arkham Asylum->Additional Command Line Arguments. 51 | - On *GOG GALAXY* Customize->Manage Installation->Configure, enable Launch parameters, select Duplicate. It should be added under Additional executables. 52 | - If you use a shortcut in Windows, right click->Properties->Shortcut and add it at the end of Target. 53 | 54 | ## Hint for Linux users 55 | 56 | To achieve the best results when using the Launcher, you should install the Calibri font for 57 | 58 | Protontricks: 59 | `protontricks 35140 -q calibri` 60 | 61 | or 62 | 63 | Winetricks: 64 | `WINEPREFIX=/steamapps/compatdata/35140/pfx winetricks -q calibri` 65 | 66 | Furthermore, to run Arkham Asylum properly on Linux, the following fix is needed: 67 | 68 | `protontricks 35140 -q d3dx9 d3dcompiler_43` 69 | 70 | If you wish to make full use of PhysX for Arkham Asylum on Linux you also need to copy Arkham City's [PhysXDevice.dll](https://drive.google.com/file/d/1hcM3y34HN2yLYmd1S_cV1q2MrOU6q_5w/view) into the same folder as the Launcher (Batman Arkham Asylum GOTY\Binaries). 71 | 72 | This help section and the working Proton/Wine support was only made possible through heavy cooperation with [ThisNekoGuy](https://github.com/ThisNekoGuy). 73 | 74 | ## Bug Reports 75 | 76 | To file a bug report, or if you have suggestions for the Launcher in general, please file an [issue](https://github.com/neatodev/BmLauncherAsylumNET6/issues/new). I read these regularly and should normally be able to respond within a day. Please include log files (if possible) in your report. The logs are located here: 'Batman Arkham Asylum GOTY\Binaries\logs'. 77 | 78 | ## Known Issues 79 | 80 | **NVAPI_ACCESS_DENIED**: See [my response](https://github.com/neatodev/BmLauncher/issues/3#issuecomment-681074403) to Issue [#3](https://github.com/neatodev/BmLauncher/issues/3) for a solution. 81 | 82 | #### License 83 | 84 | [![CC BY 4.0][cc-by-shield]][cc-by] 85 | 86 | [cc-by]: https://creativecommons.org/licenses/by-nc-sa/4.0/ 87 | [cc-by-shield]: https://licensebuttons.net/l/by-nc-sa/4.0/80x15.png 88 | -------------------------------------------------------------------------------- /Resources/BmCamera.ini: -------------------------------------------------------------------------------- 1 | [BmGame.R3rdPersonCamera] 2 | EnableCameraAssist=True 3 | 4 | [IniVersion] 5 | 0=1577365085.000000 6 | 7 | -------------------------------------------------------------------------------- /Resources/BmEditorUserSettings.ini: -------------------------------------------------------------------------------- 1 | [Editor.EditorUserSettings] 2 | AllowFlightCameraToRemapKeys=True 3 | PreviewThumbnailBackgroundColor=(R=0,G=0,B=0) 4 | PreviewThumbnailTranslucentMaterialBackgroundColor=(R=127,G=127,B=127) 5 | bAutoSaveEnable=True 6 | AutoSaveTimeMinutes=10 7 | 8 | [WindowPosManager] 9 | DlgAddSpecial=879,571,328,226,0 10 | DlgActorSearch=379,262,881,507,0 11 | DlgActorFactory=783,544,553,311,0 12 | DlgBuildProgress=560,475,806,180,0 13 | SurfaceProperties=647,491,514,477,0 14 | DockingContainer=64,33,940,1076,0 15 | FloatingFrame_DockingContainer=64,33,940,1076,0 16 | DlgGBSearch=953,568,400,300,0 17 | DlgSoundNodeWaveOptions=496,238,664,324,0 18 | DlgMove=760,475,497,408,0 19 | 20 | [EditorFrame] 21 | FrameClassName=WxEditorFrame 22 | LocalizationFile=UnrealEd 23 | FramePos.x=43 24 | FramePos.y=4 25 | FrameSize.x=1832 26 | FrameSize.y=1152 27 | FrameMaximized=1 28 | ViewportResizeTogether=True 29 | ShowAllPropertyItemButtons=False 30 | ShowOnlyModifiedProperties=False 31 | 32 | [MRU] 33 | 34 | [UnrealEd.MaterialEditorOptions] 35 | bShowGrid=True 36 | bShowBackground=False 37 | bHideUnusedConnectors=False 38 | bDrawCurves=True 39 | bRealtimeMaterialViewport=False 40 | bRealtimeExpressionViewport=False 41 | bAlwaysRefreshAllPreviews=False 42 | 43 | [LinkedObjectEditor] 44 | InvertMousePan=False 45 | 46 | [FEditorModeTools] 47 | ShowWidget=True 48 | MouseLock=False 49 | CoordSystem=0 50 | 51 | [LightingBuildOptions] 52 | OnlyBuildSelectedActors=false 53 | OnlyBuildCurrentLevel=false 54 | OnlyBuildChanged=false 55 | BuildBSP=true 56 | BuildActors=true 57 | FullQualityBuild=true 58 | 59 | [Matinee] 60 | Hide3DTracks=false 61 | ZoomToScrubPos=false 62 | ShowCurveEd=false 63 | 64 | [SourceControl] 65 | Disabled=False 66 | 67 | [Directories] 68 | UNR=..\BmGame\Content\Maps\ 69 | BRUSH=..\BmGame\Content\ 70 | 2DS=..\BmGame\Content\ 71 | PSA=..\BmGame\Content\ 72 | COLLADAAnim=..\Engine\Content\ 73 | GenericImport=..\BmGame\Content\ 74 | GenericExport=..\BmGame\Content\ 75 | GenericOpen=..\BmGame\Content\ 76 | GenericSave=..\BmGame\Content\ 77 | 78 | [UnrealEd.TerrainEditOptions] 79 | Solid1_Strength=100 80 | Solid1_Radius=1 81 | Solid1_Falloff=1 82 | Solid2_Strength=100 83 | Solid2_Radius=8 84 | Solid2_Falloff=8 85 | Solid3_Strength=100 86 | Solid3_Radius=32 87 | Solid3_Falloff=32 88 | Solid4_Strength=100 89 | Solid4_Radius=64 90 | Solid4_Falloff=64 91 | Solid5_Strength=100 92 | Solid5_Radius=128 93 | Solid5_Falloff=128 94 | Noisy1_Strength=100 95 | Noisy1_Radius=1 96 | Noisy1_Falloff=16 97 | Noisy2_Strength=100 98 | Noisy2_Radius=8 99 | Noisy2_Falloff=32 100 | Noisy3_Strength=100 101 | Noisy3_Radius=32 102 | Noisy3_Falloff=64 103 | Noisy4_Strength=100 104 | Noisy4_Radius=64 105 | Noisy4_Falloff=128 106 | Noisy5_Strength=100 107 | Noisy5_Radius=128 108 | Noisy5_Falloff=256 109 | Current_Tool=2 110 | Current_Brush=0 111 | Current_Strength=100 112 | Current_Radius=64 113 | Current_Falloff=128 114 | SliderRange_Low_Strength=0 115 | SliderRange_High_Strength=100 116 | SliderRange_Low_Radius=0 117 | SliderRange_High_Radius=2048 118 | SliderRange_High_Falloff=2048 119 | bShowFoliageMeshes=true 120 | bShowDecoarationMeshes=true 121 | TerrainLayerBrowser_BackgroundColor=(R=162,G=162,B=162) 122 | TerrainLayerBrowser_BackgroundColor2=(R=192,G=192,B=192) 123 | TerrainLayerBrowser_BackgroundColor3=(R=212,G=212,B=212) 124 | TerrainLayerBrowser_SelectedColor=(R=162,G=162,B=0) 125 | TerrainLayerBrowser_SelectedColor2=(R=192,G=192,B=0) 126 | TerrainLayerBrowser_SelectedColor3=(R=212,G=212,B=0) 127 | TerrainLayerBrowser_BorderColor=(R=64,G=64,B=64) 128 | 129 | [UnrealEd.PhATSimOptions] 130 | SkyBrightness=0.25 131 | Brightness=1.0 132 | AngularSnap=15.0 133 | LinearSnap=2.0 134 | SimSpeed=1.0 135 | bDrawContacts=false 136 | FloorGap=25.0 137 | GravScale=1.0 138 | bPromptOnBoneDelete=true 139 | PokeStrength=100.0 140 | bShowNamesInHierarchy=true 141 | PokePauseTime=0.5 142 | PokeBlendTime=0.5 143 | 144 | [UnrealEd.CurveEdOptions] 145 | MinViewRange=0.01 146 | MaxViewRange=1000000.0 147 | BackgroundColor=(R=0.23529412,G=0.23529412,B=0.23529412) 148 | LabelColor=(R=0.4,G=0.4,B=0.4) 149 | SelectedLabelColor=(R=0.6,G=0.4,B=0.1) 150 | GridColor=(R=0.35,G=0.35,B=0.35) 151 | GridTextColor=(R=0.78431373,G=0.78431373,B=0.78431373) 152 | LabelBlockBkgColor=(R=0.25,G=0.25,B=0.25) 153 | SelectedKeyColor=(R=1.0,G=1.0,B=0.0) 154 | 155 | [UnrealEd.UIEditorOptions] 156 | WindowPosition=(X=256,Y=256,Width=1024,Height=768) 157 | ViewportSashPosition=824 158 | PropertyWindowSashPosition=568 159 | ViewportGutterSize=0 160 | VirtualSizeX=0 161 | VirtualSizeY=0 162 | bRenderViewportOutline=true 163 | bRenderContainerOutline=true 164 | bRenderSelectionOutline=true 165 | bRenderSelectionHandles=true 166 | bRenderPerWidgetSelectionOutline=true 167 | GridSize=8 168 | bSnapToGrid=true 169 | mViewDrawGrid=true 170 | bShowDockHandles=true 171 | 172 | [UnrealEd.CascadeOptions] 173 | bShowModuleDump=false 174 | BackgroundColor=(B=25,G=20,R=20,A=0) 175 | bUseSubMenus=true 176 | bUseSpaceBarReset=false 177 | bUseSpaceBarResetInLevel=true 178 | Empty_Background=(B=25,G=20,R=20,A=0) 179 | Emitter_Background=(B=25,G=20,R=20,A=0) 180 | Emitter_Unselected=(B=0,G=100,R=255,A=0) 181 | Emitter_Selected=(B=180,G=180,R=180,A=0) 182 | ModuleColor_General_Unselected=(B=49,G=40,R=40,A=0) 183 | ModuleColor_General_Selected=(B=0,G=100,R=255,A=0) 184 | ModuleColor_TypeData_Unselected=(B=20,G=20,R=15,A=0) 185 | ModuleColor_TypeData_Selected=(B=0,G=100,R=255,A=0) 186 | ModuleColor_Beam_Unselected=(R=160,G=150,B=235) 187 | ModuleColor_Beam_Selected=(R=255,G=100,B=0) 188 | ModuleColor_Trail_Unselected=(R=130,G=235,B=170) 189 | ModuleColor_Trail_Selected=(R=255,G=100,B=0) 190 | ModuleColor_Spawn_Unselected=(R=200,G=100,B=100) 191 | ModuleColor_Spawn_Selected=(R=255,G=50,B=50) 192 | ModuleColor_Required_Unselected=(R=200,G=200,B=100) 193 | ModuleColor_Required_Selected=(R=255,G=225,B=50) 194 | ModuleColor_Event_Unselected=(R=64,G=64,B=255) 195 | ModuleColor_Event_Selected=(R=0,G=0,B=255) 196 | bShowGrid=false 197 | GridColor_Hi=(R=0,G=100,B=255) 198 | GridColor_Low=(R=0,G=100,B=255) 199 | GridPerspectiveSize=1024 200 | PostProcessChainName=EditorMaterials.Cascade.DefaultCascadePostProcess 201 | ShowPPFlags=0 202 | bUseSlimCascadeDraw=true 203 | SlimCascadeDrawHeight=30 204 | bCenterCascadeModuleText=true 205 | Cascade_MouseMoveThreshold=4 206 | ModuleMenu_ModuleRejections=ParticleModuleTypeDataBase 207 | ModuleMenu_ModuleRejections=ParticleModule 208 | ModuleMenu_ModuleRejections=ParticleModuleRequired 209 | ModuleMenu_ModuleRejections=ParticleModuleSpawn 210 | ModuleMenu_ModuleRejections=ParticleModuleTypeDataBeam 211 | ModuleMenu_ModuleRejections=ParticleModuleTypeDataTrail 212 | ModuleMenu_ModuleRejections=ParticleModuleLocationPrimitiveBase 213 | ModuleMenu_ModuleRejections=ParticleModuleEventReceiverBase 214 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=None,InvalidObjNames=(ParticleModuleBeamBase,ParticleModuleTrailBase)) 215 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataBeam2,InvalidObjNames=(ParticleModuleTrailBase)) 216 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataTrail2,InvalidObjNames=(ParticleModuleBeamBase)) 217 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataMesh,InvalidObjNames=(ParticleModuleBeamBase,ParticleModuleTrailBase)) 218 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataMeshPhysX,InvalidObjNames=(ParticleModuleBeamBase,ParticleModuleTrailBase,ParticleModuleAccelerationBase,ParticleModuleAttractorBase,ParticleModuleCollisionBase,ParticleModuleColorBase,ParticleModuleEventBase,ParticleModuleEventReceiverBase,ParticleModuleKillBase,ParticleModuleOrbitBase,ParticleModuleSubUVBase,ParticleModuleMaterialBase,ParticleModuleOrientationBase)) 219 | ModuleMenu_TypeDataToBaseModuleRejections=(ObjName=ParticleModuleTypeDataPhysX,InvalidObjNames=(ParticleModuleBeamBase,ParticleModuleTrailBase,ParticleModuleAccelerationBase,ParticleModuleAttractorBase,ParticleModuleCollisionBase,ParticleModuleKillBase,ParticleModuleOrbitBase)) 220 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=None,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRateMultiplyLife)) 221 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataBeam2,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRateMultiplyLife)) 222 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataTrail2,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRateMultiplyLife)) 223 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataMeshPhysX,InvalidObjNames=(ParticleModuleRotation,ParticleModuleRotationOverLifetime,ParticleModuleMeshRotationRateMultiplyLife,ParticleModuleRotationRate,ParticleModuleRotationRateMultiplyLife,ParticleModuleSizeMultiplyVelocity,ParticleModuleVelocityOverLifetime,ParticleModuleSizeScale)) 224 | ModuleMenu_TypeDataToSpecificModuleRejections=(ObjName=ParticleModuleTypeDataPhysX,InvalidObjNames=(ParticleModuleMeshMaterial,ParticleModuleMeshRotation,ParticleModuleMeshRotationRate,ParticleModuleMeshRotationRateMultiplyLife,)) 225 | 226 | [UnrealEd.LensFlareEditorOptions] 227 | LFED_BackgroundColor=(B=0.098,G=0.078,R=0.078,A=1.0) 228 | LFED_Source_ElementEd_Background=(B=0.098,G=0.078,R=0.078,A=1.0) 229 | LFED_Source_Selected=(B=0.196,G=0.588,R=1.0,A=1.0) 230 | LFED_Source_Unselected=(B=0.784,G=0.784,R=0.784,A=1.0) 231 | LFED_ElementEd_Background=(B=0.098,G=0.078,R=0.078,A=1.0) 232 | LFED_Element_Unselected=(B=0.506,G=0.506,R=0.506,A=1.0) 233 | LFED_Element_Selected=(B=0.0,G=0.392,R=1.0,A=1.0) 234 | bShowGrid=false 235 | GridColor_Hi=(R=0,G=100,B=255) 236 | GridColor_Low=(R=0,G=100,B=255) 237 | GridPerspectiveSize=1024 238 | 239 | [Configuration] 240 | BasedOn=..\BmGame\Config\DefaultEditorUserSettings.ini 241 | 242 | [BrowserData] 243 | REvidence_ZoomFactor=0.40000 244 | REvidence_FixedSize=0 245 | REvidence_Primitive=2 246 | RCharacterBio_ZoomFactor=0.80000 247 | RCharacterBio_FixedSize=0 248 | RCharacterBio_Primitive=2 249 | RDummyEvidenceConfig_ZoomFactor=0.80000 250 | RDummyEvidenceConfig_FixedSize=0 251 | RDummyEvidenceConfig_Primitive=2 252 | 253 | [Docking] 254 | LightBrowser_Docked=True 255 | LightBrowser_Visible=True 256 | 257 | [IniVersion] 258 | 0=1577365777.000000 259 | 1=1577365085.000000 260 | 2=1577365085.000000 261 | 262 | -------------------------------------------------------------------------------- /Resources/BmGame.ini: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/ca3b8b3a7f8eca72ae03b1ae1c8f418cc0ad0925/Resources/BmGame.ini -------------------------------------------------------------------------------- /Resources/BmUI.ini: -------------------------------------------------------------------------------- 1 | [Engine.UIInteraction] 2 | UISkinName=DefaultUISkin.DefaultSkin 3 | UIJoystickDeadZone=0.9 4 | UIAxisMultiplier=1.0 5 | AxisRepeatDelay=0.2 6 | MouseButtonRepeatDelay=0.15 7 | DoubleClickTriggerSeconds=0.5 8 | DoubleClickPixelTolerance=1 9 | ToolTipInitialDelaySeconds=0.25 10 | ToolTipExpirationSeconds=5.0 11 | UISoundCueNames=GenericError 12 | UISoundCueNames=MouseEnter 13 | UISoundCueNames=MouseExit 14 | UISoundCueNames=Clicked 15 | UISoundCueNames=Focused 16 | UISoundCueNames=SceneOpened 17 | UISoundCueNames=SceneClosed 18 | UISoundCueNames=ListSubmit 19 | UISoundCueNames=ListUp 20 | UISoundCueNames=ListDown 21 | UISoundCueNames=SliderIncrement 22 | UISoundCueNames=SliderDecrement 23 | UISoundCueNames=NavigateUp 24 | UISoundCueNames=NavigateDown 25 | UISoundCueNames=NavigateLeft 26 | UISoundCueNames=NavigateRight 27 | UISoundCueNames=CheckboxChecked 28 | UISoundCueNames=CheckboxUnchecked 29 | 30 | [Engine.GameUISceneClient] 31 | OverlaySceneAlphaModulation=0.45 32 | bRestrictActiveControlToFocusedScene=true 33 | bCaptureUn 34 | Input=True 35 | bEnableDebugInput=true 36 | bRenderDebugInfo=false 37 | bRenderActiveControlInfo=true 38 | bRenderFocusedControlInfo=true 39 | bRenderTargetControlInfo=true 40 | bRenderDebugInfoAtTop=true 41 | bSelectVisibleTargetsOnly=true 42 | bInteractiveMode=false 43 | bDisplayFullPaths=true 44 | bShowWidgetPath=true 45 | bShowRenderBounds=true 46 | bShowCurrentState=true 47 | bShowMousePos=true 48 | 49 | [Engine.UIScreenObject] 50 | AnimationDebugMultiplier=1.0 51 | 52 | [Engine.UIAction_GetNATType] 53 | bAlwaysOpen=False 54 | 55 | [Engine.UITabControl] 56 | bAllowPagePreviews=true 57 | 58 | [Engine.UIComp_DrawStringEditbox] 59 | SelectionTextColor=(R=1.0,G=1.0,B=1.0,A=1.0) 60 | SelectionBackgroundColor=(R=0.0,G=0.0,B=1.0,A=0.6) 61 | 62 | [Engine.UICalloutButton] 63 | DefaultMarkupStringTemplate= 64 | 65 | [Configuration] 66 | BasedOn=..\BmGame\Config\DefaultUI.ini 67 | 68 | [IniVersion] 69 | 0=1577365600.000000 70 | 1=1577365085.000000 71 | 2=1577365085.000000 72 | 73 | -------------------------------------------------------------------------------- /Resources/LauncherStart1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/ca3b8b3a7f8eca72ae03b1ae1c8f418cc0ad0925/Resources/LauncherStart1.png -------------------------------------------------------------------------------- /Resources/NVSetter.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/ca3b8b3a7f8eca72ae03b1ae1c8f418cc0ad0925/Resources/NVSetter.exe -------------------------------------------------------------------------------- /Resources/NvAPIWrapper.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/ca3b8b3a7f8eca72ae03b1ae1c8f418cc0ad0925/Resources/NvAPIWrapper.dll -------------------------------------------------------------------------------- /Resources/UserEngine.ini: -------------------------------------------------------------------------------- 1 | [Configuration] 2 | BasedOn=..\BmGame\Config\DefaultEngine.ini 3 | 4 | [SystemSettings] 5 | Fullscreen=True 6 | UseVsync=False 7 | AllowD3D10=True 8 | ResX=1 9 | ResY=1 10 | EffectsLevel=3 11 | MaxMultisamples=1 12 | DynamicLights=True 13 | DepthOfField=True 14 | LensFlares=True 15 | Bloom=True 16 | DynamicShadows=True 17 | MotionBlur=False 18 | Distortion=True 19 | FogVolumes=True 20 | DisableSphericalHarmonicLights=False 21 | AmbientOcclusion=True 22 | DetailMode=2 23 | MaxShadowResolution=1024 24 | Stereo=False 25 | IniVersion=5.8 26 | 27 | [Engine.Engine] 28 | bOnScreenKismetWarnings=FALSE 29 | bSubtitlesEnabled=TRUE 30 | PhysXLevel=1 31 | bPhysXuseGRB=False 32 | bPhysXPatched=True 33 | Language=int 34 | bUseInvertedLeftStick=False 35 | 36 | [DevOptions.Shaders] 37 | bAllowMultiThreadedShaderCompile=True 38 | 39 | [Parameters in this file are irrelevant, as they won't be read by the game.] 40 | [Generated by Batman: Arkham Asylum - Advanced Launcher] -------------------------------------------------------------------------------- /Resources/UserGame.ini: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/ca3b8b3a7f8eca72ae03b1ae1c8f418cc0ad0925/Resources/UserGame.ini -------------------------------------------------------------------------------- /Resources/UserInput.ini: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/ca3b8b3a7f8eca72ae03b1ae1c8f418cc0ad0925/Resources/UserInput.ini -------------------------------------------------------------------------------- /Resources/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/ca3b8b3a7f8eca72ae03b1ae1c8f418cc0ad0925/Resources/favicon.ico -------------------------------------------------------------------------------- /Resources/nexus_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/ca3b8b3a7f8eca72ae03b1ae1c8f418cc0ad0925/Resources/nexus_icon.ico -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | remote_theme: BDHU/minimalist 2 | title: Developed by Neato 3 | description: "(C) 2020-2022 | CC BY-NC-SA 4.0" 4 | logo: Resources/favicon.ico 5 | sidebar: 6 | - name: GitHub Profile 7 | icon: 8 | link: https://github.com/neatodev 9 | - name: Project Repository 10 | icon: 11 | link: https://github.com/neatodev/BmLauncherAsylumNET6 12 | - name: License 13 | icon: 14 | link: https://raw.githubusercontent.com/neatodev/BmLauncherAsylumNET6/main/LICENSE 15 | - name: Nexusmods Page 16 | icon: 17 | link: https://www.nexusmods.com/batmanarkhamasylum/mods/117/ 18 | - name: Donate 19 | icon: 20 | link: https://www.paypal.com/donate/?hosted_button_id=LG7YTKP4JYN5S 21 | 22 | github: [metadata] 23 | color-scheme: auto 24 | favicon: true 25 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | {% case site.color-scheme %} 2 | {% when "", nil, false, 0, empty %} 3 | {% assign ColorScheme = "auto" %} 4 | {% else %} 5 | {% assign ColorScheme = site.color-scheme %} 6 | {% endcase %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | {% seo %} 16 | 17 | 18 | 19 | 20 | 23 | {% include head-custom.html %} 24 | 25 | 26 |
27 | 54 |
55 | 56 | {{ content }} 57 | 58 |
59 |
60 |
61 |
62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /_sass/jekyll-theme-minimalist.scss: -------------------------------------------------------------------------------- 1 | @import "fonts"; 2 | @import "rouge-github"; 3 | @import "colors"; 4 | 5 | body { 6 | background-color: var(--clr-bg); 7 | padding:50px; 8 | font: 15px/1.5 "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; 9 | color: var(--clr-text); 10 | font-weight:400; 11 | } 12 | 13 | h1, h2, h3, h4, h5, h6 { 14 | color: var(--clr-h1-and-bold); 15 | margin:0 0 20px; 16 | } 17 | 18 | p, ul, ol, table, pre, dl { 19 | margin:0 0 20px; 20 | } 21 | 22 | h1, h2, h3 { 23 | line-height:1.1; 24 | } 25 | 26 | h1 { 27 | font-size:38px; 28 | } 29 | 30 | h2 { 31 | color: var(--clr-h2); 32 | } 33 | 34 | h3, h4, h5, h6 { 35 | color: var(--clr-h-3-6); 36 | } 37 | 38 | a { 39 | color:var(--clr-a-text); 40 | text-decoration:none; 41 | } 42 | 43 | a:hover, a:focus { 44 | color: var(--clr-a-text-hvr); 45 | } 46 | 47 | a small { 48 | font-size:11px; 49 | color:var(--clr-small-in-a); 50 | margin-top:-0.3em; 51 | display:block; 52 | } 53 | 54 | a:hover small { 55 | color:var(--clr-small-in-a); 56 | } 57 | 58 | // added 59 | p.link { 60 | margin:0 0 4px; 61 | } 62 | 63 | // added 64 | ul.link { 65 | list-style-type: none; /* Remove bullets */ 66 | margin: 0; /* To remove default bottom margin */ 67 | padding: 0.4px; /* To remove default left padding */ 68 | } 69 | 70 | ul.link li + li { 71 | margin-top: 6px; 72 | } 73 | 74 | ul.link:last-child { 75 | margin-bottom: 6px; 76 | } 77 | 78 | .wrapper { 79 | width:1160px; 80 | margin: 0 auto; 81 | } 82 | 83 | blockquote { 84 | border-left:1px solid var(--clr-splitter-blockquote-and-section); 85 | margin:0; 86 | padding:0 0 0 20px; 87 | font-style:italic; 88 | } 89 | 90 | code, pre { 91 | font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace; 92 | color: var(--clr-code-text); 93 | } 94 | 95 | pre { 96 | padding:8px 15px; 97 | background: var(--clr-code-bg); 98 | border-radius:5px; 99 | border:1px solid var(--clr-code-border); 100 | overflow-x: auto; 101 | } 102 | 103 | table { 104 | width:100%; 105 | border-collapse:collapse; 106 | } 107 | 108 | th, td { 109 | text-align:left; 110 | padding:5px 10px; 111 | border-bottom:1px solid var(--clr-splitter-blockquote-and-section); 112 | } 113 | 114 | dt { 115 | color:var(--clr-table-header-and-dt); 116 | font-weight:700; 117 | } 118 | 119 | th { 120 | color:var(--clr-table-header-and-dt); 121 | } 122 | 123 | img { 124 | max-width:100%; 125 | } 126 | 127 | kbd { 128 | background-color: var(--clr-kbd-bg) ; 129 | border: 1px solid var(--clr-kbd-border); 130 | border-bottom-color: var(--clr-kbd-border-bottom-and-shadow); 131 | border-radius: 3px; 132 | box-shadow: inset 0 -1px 0 var(--clr-kbd-border-bottom-and-shadow); 133 | color: var(--clr-kbd-text); 134 | display: inline-block; 135 | font-size: 11px; 136 | line-height: 10px; 137 | padding: 3px 5px; 138 | vertical-align: middle; 139 | } 140 | 141 | .sidebar { 142 | width:228px; 143 | float:left; 144 | position:fixed; 145 | -webkit-font-smoothing:subpixel-antialiased; 146 | top: 0; 147 | padding: 58px 0 50px 0; 148 | display: flex; 149 | flex-direction: column; 150 | justify-content: space-between; 151 | height: calc(100vh - 108px); 152 | overflow-x: hidden; 153 | overflow-y: scroll; 154 | -ms-overflow-style: -ms-autohiding-scrollbar; // IE10+ 155 | } 156 | 157 | // Disables the scrollbar in Firefox 158 | // HTML-Proofer fails without "@-moz-document url-prefix()" 159 | // because scrollbar-width is still experimental in Firefox. 160 | @-moz-document url-prefix() { 161 | .sidebar { 162 | scrollbar-width: none; 163 | } 164 | } 165 | 166 | .sidebar::-webkit-scrollbar { 167 | /* Chrome, Safari, Edge */ 168 | display: none; 169 | } 170 | 171 | strong { 172 | color:var(--clr-h1-and-bold); 173 | font-weight:700; 174 | } 175 | 176 | section { 177 | width: 900px; 178 | float:right; 179 | padding-bottom:30px; 180 | } 181 | 182 | small { 183 | font-size:11px; 184 | } 185 | 186 | hr { 187 | border:0; 188 | background:var(--clr-splitter-blockquote-and-section); 189 | height:1px; 190 | width:30%; 191 | margin:10px auto 30px; 192 | } 193 | 194 | footer, .sidebar-footer { 195 | width:185px; 196 | float:left; 197 | bottom:30px; 198 | -webkit-font-smoothing:subpixel-antialiased; 199 | } 200 | 201 | footer { 202 | display: none; 203 | } 204 | 205 | .sidebar-footer { 206 | flex-basis: content; 207 | } 208 | 209 | @media print, screen and (max-width: 960px) { 210 | 211 | .sidebar { 212 | padding: initial; 213 | display: initial; 214 | height: initial; 215 | overflow: initial; 216 | } 217 | 218 | footer { 219 | display: initial; 220 | } 221 | 222 | .sidebar-footer { 223 | display: none; 224 | } 225 | 226 | div.wrapper { 227 | width:auto; 228 | margin:0; 229 | } 230 | 231 | .sidebar, section, footer { 232 | float:none; 233 | position:static; 234 | width:auto; 235 | } 236 | 237 | header { 238 | padding-right:320px; 239 | } 240 | 241 | section { 242 | border:1px solid var(--clr-splitter-blockquote-and-section); 243 | border-width:1px 0; 244 | padding:20px 0; 245 | margin:0 0 20px; 246 | } 247 | 248 | header a small { 249 | display:inline; 250 | } 251 | 252 | header ul { 253 | position:absolute; 254 | right:50px; 255 | top:52px; 256 | } 257 | 258 | .link-wrapper { 259 | display: none !important; 260 | } 261 | 262 | .img-circle { 263 | display: none !important; 264 | } 265 | } 266 | 267 | @media print, screen and (max-width: 720px) { 268 | body { 269 | word-wrap:break-word; 270 | } 271 | 272 | header { 273 | padding:0; 274 | } 275 | 276 | header ul, header p.view { 277 | position:static; 278 | } 279 | 280 | pre, code { 281 | word-wrap:normal; 282 | } 283 | } 284 | 285 | .link-wrapper-mobile { 286 | margin-bottom: 20px; 287 | } 288 | 289 | @media print, screen and (min-width: 961px) { 290 | .link-wrapper-mobile { 291 | display: none !important; 292 | } 293 | } 294 | 295 | @media print, screen and (max-width: 480px) { 296 | body { 297 | padding:15px; 298 | } 299 | 300 | // header ul { 301 | // width:99%; 302 | // } 303 | 304 | // header li, header ul li + li + li { 305 | // width:33%; 306 | // } 307 | } 308 | 309 | @media print { 310 | body { 311 | padding:0.4in; 312 | font-size:12pt; 313 | color:#444; 314 | } 315 | } 316 | -------------------------------------------------------------------------------- /data/Graphics.cs: -------------------------------------------------------------------------------- 1 | namespace BmLauncherAsylumNET6.data 2 | { 3 | /// 4 | /// Static class that stores all important parameters that are needed by BmEngine 5 | /// Contains setter + getter for every parameter 6 | /// 7 | internal static class Graphics 8 | { 9 | private static string language; 10 | private static string fullScreen; 11 | private static string vsync; 12 | private static string resolutionX = "default"; 13 | private static string resolutionY = "default"; 14 | private static string detailMode; 15 | private static string multiSampling; 16 | private static string depthOfField; 17 | private static string ambientOcclusion; 18 | private static string lensFlares; 19 | private static string motionBlur; 20 | private static string bloom; 21 | private static string highQualityBloom; 22 | private static string maxAnisotropy; 23 | private static string dynamicShadows; 24 | private static string maxShadowResolution; 25 | private static string shadowFilterRadius; 26 | private static string maxSmoothedFramerate; 27 | private static string disableSphericalHarmonicLights; 28 | private static string fogVolumes; 29 | private static string distortion; 30 | private static string shadowTexels; 31 | private static string physX; 32 | private static string memoryPoolsValue; 33 | private static string frameThreadLag; 34 | private static string shadowslope; 35 | 36 | public static string getLanguage() 37 | { 38 | return language; 39 | } 40 | 41 | public static string getFrameThreadLag() 42 | { 43 | return frameThreadLag; 44 | } 45 | 46 | public static string isFullScreen() 47 | { 48 | return fullScreen; 49 | } 50 | 51 | public static string isVsync() 52 | { 53 | return vsync; 54 | } 55 | 56 | public static string getResolutionX() 57 | { 58 | return resolutionX; 59 | } 60 | 61 | public static string getResolutionY() 62 | { 63 | return resolutionY; 64 | } 65 | 66 | public static string getDetailMode() 67 | { 68 | return detailMode; 69 | } 70 | 71 | public static string getMultiSampling() 72 | { 73 | return multiSampling; 74 | } 75 | 76 | public static string getShadowSlope() 77 | { 78 | return shadowslope; 79 | } 80 | 81 | public static string isDepthOfField() 82 | { 83 | return depthOfField; 84 | } 85 | 86 | public static string isAmbientOcclusion() 87 | { 88 | return ambientOcclusion; 89 | } 90 | 91 | public static string isLensFlares() 92 | { 93 | return lensFlares; 94 | } 95 | 96 | public static string isMotionBlur() 97 | { 98 | return motionBlur; 99 | } 100 | 101 | public static string isBloom() 102 | { 103 | return bloom; 104 | } 105 | 106 | public static string isHighQualityBloom() 107 | { 108 | return highQualityBloom; 109 | } 110 | 111 | public static string getMaxAnisotropy() 112 | { 113 | return maxAnisotropy; 114 | } 115 | 116 | public static string isDynamicShadows() 117 | { 118 | return dynamicShadows; 119 | } 120 | 121 | public static string getMaxShadowResolution() 122 | { 123 | return maxShadowResolution; 124 | } 125 | 126 | public static string getShadowFilterRadius() 127 | { 128 | return shadowFilterRadius; 129 | } 130 | 131 | public static string getMaxSmoothedFramerate() 132 | { 133 | return maxSmoothedFramerate; 134 | } 135 | 136 | public static string isDisableSphericalHarmonicLights() 137 | { 138 | return disableSphericalHarmonicLights; 139 | } 140 | 141 | public static string isFogVolumes() 142 | { 143 | return fogVolumes; 144 | } 145 | 146 | public static string isDistortion() 147 | { 148 | return distortion; 149 | } 150 | 151 | public static string getShadowTexels() 152 | { 153 | return shadowTexels; 154 | } 155 | 156 | public static string getPhysX() 157 | { 158 | return physX; 159 | } 160 | 161 | public static string getMemoryPoolsValue() 162 | { 163 | return memoryPoolsValue; 164 | } 165 | 166 | public static void setLanguage(string setLang) 167 | { 168 | language = setLang; 169 | } 170 | 171 | public static void setFullScreen(string setBool) 172 | { 173 | fullScreen = setBool; 174 | } 175 | 176 | public static void setVsync(string setBool) 177 | { 178 | vsync = setBool; 179 | } 180 | 181 | public static void setResolutionX(string xRes) 182 | { 183 | resolutionX = xRes; 184 | } 185 | 186 | public static void setResolutionY(string yRes) 187 | { 188 | resolutionY = yRes; 189 | } 190 | 191 | public static void setDetailMode(string detMode) 192 | { 193 | detailMode = detMode; 194 | } 195 | 196 | public static void setMultiSampling(string msample) 197 | { 198 | multiSampling = msample; 199 | } 200 | 201 | public static void setDepthOfField(string setBool) 202 | { 203 | depthOfField = setBool; 204 | } 205 | 206 | public static void setShadowSlope(string slope) 207 | { 208 | shadowslope = slope; 209 | } 210 | 211 | public static void setAmbientOcclusion(string setBool) 212 | { 213 | ambientOcclusion = setBool; 214 | } 215 | 216 | public static void setLensFlares(string setBool) 217 | { 218 | lensFlares = setBool; 219 | } 220 | 221 | public static void setMotionBlur(string setBool) 222 | { 223 | motionBlur = setBool; 224 | } 225 | 226 | public static void setBloom(string setBool) 227 | { 228 | bloom = setBool; 229 | } 230 | 231 | public static void setHighQualityBloom(string setBool) 232 | { 233 | highQualityBloom = setBool; 234 | } 235 | 236 | public static void setMaxAnisotropy(string maxani) 237 | { 238 | maxAnisotropy = maxani; 239 | } 240 | 241 | public static void setDynamicShadows(string setBool) 242 | { 243 | dynamicShadows = setBool; 244 | } 245 | 246 | public static void setMaxShadowResolution(string maxshadowRes) 247 | { 248 | maxShadowResolution = maxshadowRes; 249 | } 250 | 251 | public static void setShadowFilterRadius(string shadowfradius) 252 | { 253 | shadowFilterRadius = shadowfradius; 254 | } 255 | 256 | public static void setMaxSmoothedFramerate(string maxsmoothframes) 257 | { 258 | maxSmoothedFramerate = maxsmoothframes; 259 | } 260 | 261 | public static void setDisableSphericalHarmonicLights(string newLine) 262 | { 263 | disableSphericalHarmonicLights = newLine; 264 | } 265 | 266 | public static void setFogVolumes(string newLine) 267 | { 268 | fogVolumes = newLine; 269 | } 270 | 271 | public static void setDistortion(string newLine) 272 | { 273 | distortion = newLine; 274 | } 275 | 276 | public static void setShadowTexels(string newLine) 277 | { 278 | shadowTexels = newLine; 279 | } 280 | 281 | public static void setPhysX(string newLine) 282 | { 283 | physX = newLine; 284 | } 285 | 286 | public static void setMemoryPoolsValue(string newLine) 287 | { 288 | memoryPoolsValue = newLine; 289 | } 290 | 291 | public static void setFrameThreadLag(string newLine) 292 | { 293 | frameThreadLag = newLine; 294 | } 295 | } 296 | } -------------------------------------------------------------------------------- /data/GraphicsWriter.cs: -------------------------------------------------------------------------------- 1 | using BmLauncherAsylumNET6.infrastructure; 2 | using NLog; 3 | using NvAPIWrapper.Native.Exceptions; 4 | 5 | namespace BmLauncherAsylumNET6.data 6 | { 7 | /// 8 | /// Helper Class for Graphics. Used to change parameters in Graphics class in accordance with user input. 9 | /// 10 | internal class GraphicsWriter 11 | { 12 | // logger for easy debugging 13 | private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 14 | 15 | private static bool isHbao; 16 | 17 | public void writeAll() 18 | { 19 | setLang(); 20 | setAAMode(); 21 | setAO(); 22 | setAnisotropy(); 23 | setBloom(); 24 | setBlur(); 25 | setDOF(); 26 | setDetailMode(); 27 | setDist(); 28 | setDynamicShadows(); 29 | setFogVolumes(); 30 | setFullScreen(); 31 | try 32 | { 33 | setHbaoPlus(); 34 | } 35 | catch (FileNotFoundException e) 36 | { 37 | logger.Warn( 38 | "writeAll - could not call setHbaoPlus() - This is fine if you're not using an NVIDIA GPU. Exception: {0}", 39 | e); 40 | } 41 | 42 | setLensFlares(); 43 | setMaxShadowRes(); 44 | setMaxSmoothedFrames(); 45 | setMemoryPools(); 46 | setPhysX(); 47 | setRes(); 48 | setShadowTexels(); 49 | setSphericalHarmonic(); 50 | setVsync(); 51 | setThreadLag(); 52 | logger.Debug("writeAll - saved all Graphics parameters to their assigned values."); 53 | } 54 | 55 | private static void setRes() 56 | { 57 | Object selectedRes = Program.Client.resBox.SelectedItem; 58 | string resX = selectedRes.ToString().Substring(0, selectedRes.ToString().LastIndexOf("x")); 59 | string resY = selectedRes.ToString().Substring(selectedRes.ToString().LastIndexOf("x") + 1); 60 | 61 | Graphics.setResolutionX(resX); 62 | Graphics.setResolutionY(resY); 63 | logger.Debug("setRes - set resolution to {0}x{1}", resX, resY); 64 | } 65 | 66 | private static void setLang() 67 | { 68 | int caseValue = Program.Client.langBox.SelectedIndex; 69 | switch (caseValue) 70 | { 71 | case 0: 72 | Graphics.setLanguage("int"); 73 | break; 74 | 75 | case 1: 76 | Graphics.setLanguage("deu"); 77 | break; 78 | 79 | case 2: 80 | Graphics.setLanguage("fra"); 81 | break; 82 | 83 | case 3: 84 | Graphics.setLanguage("ita"); 85 | break; 86 | 87 | case 4: 88 | Graphics.setLanguage("esn"); 89 | break; 90 | 91 | default: 92 | Graphics.setLanguage("nochange"); 93 | break; 94 | } 95 | 96 | logger.Debug("setLang - set language to {0}", Graphics.getLanguage()); 97 | } 98 | 99 | private static void setFullScreen() 100 | { 101 | Graphics.setFullScreen(Program.Client.fullscreenBox.SelectedIndex == 0 ? "False" : "True"); 102 | logger.Debug("setFullScreen - set fullscreen to {0}", Graphics.isFullScreen()); 103 | } 104 | 105 | private static void setVsync() 106 | { 107 | Graphics.setVsync(Program.Client.vsyncBox.SelectedIndex == 0 ? "False" : "True"); 108 | logger.Debug("setVsync - set vsync to {0}", Graphics.isVsync()); 109 | } 110 | 111 | private static void setFogVolumes() 112 | { 113 | Graphics.setFogVolumes(Program.Client.fogBox.SelectedIndex == 0 ? "False" : "True"); 114 | logger.Debug("setFogVolumes - set fog volumes to {0}", Graphics.isFogVolumes()); 115 | } 116 | 117 | private static void setBloom() 118 | { 119 | if (Program.Client.bloomBox.SelectedIndex == 0) 120 | { 121 | Graphics.setBloom("False"); 122 | Graphics.setHighQualityBloom("False"); 123 | } 124 | else 125 | { 126 | Graphics.setBloom("True"); 127 | Graphics.setHighQualityBloom("True"); 128 | } 129 | 130 | logger.Debug("setBloom - set bloom to {0}", Graphics.isBloom()); 131 | } 132 | 133 | private static void setLensFlares() 134 | { 135 | Graphics.setLensFlares(Program.Client.lensFlareBox.SelectedIndex == 0 ? "False" : "True"); 136 | logger.Debug("setLensFlares - set lens flares to {0}", Graphics.isLensFlares()); 137 | } 138 | 139 | private static void setDOF() 140 | { 141 | Graphics.setDepthOfField(Program.Client.dofBox.SelectedIndex == 0 ? "False" : "True"); 142 | logger.Debug("setDOF - set depth of field to {0}", Graphics.isDepthOfField()); 143 | } 144 | 145 | private static void setDist() 146 | { 147 | Graphics.setDistortion(Program.Client.distBox.SelectedIndex == 0 ? "False" : "True"); 148 | logger.Debug("setDist - set distortion to {0}", Graphics.isDistortion()); 149 | } 150 | 151 | private static void setBlur() 152 | { 153 | Graphics.setMotionBlur(Program.Client.mBlurBox.SelectedIndex == 0 ? "False" : "True"); 154 | logger.Debug("setBlur - set motion blur to {0}", Graphics.isMotionBlur()); 155 | } 156 | 157 | private static void setAO() 158 | { 159 | if ((Program.Client.aoBox.SelectedIndex == 0 && Program.Client.aoBox.Enabled) || 160 | !Program.Client.aoBox.Enabled) 161 | { 162 | Graphics.setAmbientOcclusion("False"); 163 | } 164 | else 165 | { 166 | Graphics.setAmbientOcclusion("True"); 167 | } 168 | 169 | logger.Debug("setAO - set ambient occlusion to {0}", Graphics.isAmbientOcclusion()); 170 | } 171 | 172 | private static void setSphericalHarmonic() 173 | { 174 | Graphics.setDisableSphericalHarmonicLights(Program.Client.sphericBox.SelectedIndex == 0 ? "True" : "False"); 175 | logger.Debug("setSphericalHarmonic - set disable spherical harmonic lights to {0}", 176 | Graphics.isDisableSphericalHarmonicLights()); 177 | } 178 | 179 | private static void setDynamicShadows() 180 | { 181 | Graphics.setDynamicShadows(Program.Client.dShadowBox.SelectedIndex == 0 ? "False" : "True"); 182 | logger.Debug("setDynamicShadows - set dynamic shadows to {0}", Graphics.isDynamicShadows()); 183 | } 184 | 185 | private static void setHbaoPlus() 186 | { 187 | if (!Program.Client.gpInfoLabel.Text.Contains("NVIDIA") || WineChecker.IsWine()) 188 | { 189 | return; 190 | } 191 | 192 | try 193 | { 194 | Program.NvWorker.setNVSettings(); 195 | } 196 | catch (NVIDIANotSupportedException e) 197 | { 198 | logger.Warn("setHbaoPlus - Caught NVIDIANotSupportedException: {0}", e); 199 | return; 200 | } 201 | 202 | if (NvidiaWorker.HasHbao || !Program.Client.nvBox.Checked || isHbao) 203 | { 204 | return; 205 | } 206 | 207 | Program.MyFactory.ExecNvSetter(); 208 | isHbao = true; 209 | } 210 | 211 | private static void setMaxSmoothedFrames() 212 | { 213 | if (Program.Client.maxSmoothTextBox.Text.Trim().Equals("") || 214 | Int16.Parse(Program.Client.maxSmoothTextBox.Text.Trim()) < 25) 215 | { 216 | Program.Client.maxSmoothTextBox.Text = @"62"; 217 | Graphics.setMaxSmoothedFramerate("62.000000"); 218 | } 219 | else 220 | { 221 | int framecap = Int32.Parse(Program.Client.maxSmoothTextBox.Text.Trim()); 222 | framecap += 2; 223 | Graphics.setMaxSmoothedFramerate(framecap + ".000000"); 224 | } 225 | 226 | logger.Debug("setMaxSmoothedFrames - set max smoothed frames to {0}", Graphics.getMaxSmoothedFramerate()); 227 | } 228 | 229 | private static void setDetailMode() 230 | { 231 | int caseValue = Program.Client.detailBox.SelectedIndex; 232 | 233 | switch (caseValue) 234 | { 235 | case 0: 236 | Graphics.setDetailMode("0"); 237 | break; 238 | 239 | case 1: 240 | Graphics.setDetailMode("1"); 241 | break; 242 | 243 | case 2: 244 | Graphics.setDetailMode("2"); 245 | break; 246 | } 247 | 248 | logger.Debug("setDetailMode - set detail mode to {0}", Graphics.getDetailMode()); 249 | } 250 | 251 | private static void setAAMode() 252 | { 253 | int caseValue = Program.Client.aaBox.SelectedIndex; 254 | 255 | switch (caseValue) 256 | { 257 | case 0: 258 | Graphics.setMultiSampling("1"); 259 | break; 260 | 261 | case 1: 262 | Graphics.setMultiSampling("2"); 263 | break; 264 | 265 | case 2: 266 | Graphics.setMultiSampling("4"); 267 | break; 268 | 269 | case 3: 270 | Graphics.setMultiSampling("10"); 271 | break; 272 | } 273 | 274 | logger.Debug("setAAMode - set multisampling mode to {0}", Graphics.getMultiSampling()); 275 | } 276 | 277 | private static void setAnisotropy() 278 | { 279 | int caseValue = Program.Client.anisoBox.SelectedIndex; 280 | 281 | switch (caseValue) 282 | { 283 | case 0: 284 | Graphics.setMaxAnisotropy("4"); 285 | break; 286 | 287 | case 1: 288 | Graphics.setMaxAnisotropy("8"); 289 | break; 290 | 291 | case 2: 292 | Graphics.setMaxAnisotropy("16"); 293 | break; 294 | } 295 | 296 | logger.Debug("setAnisotropy - set anisotropy to {0}", Graphics.getMaxAnisotropy()); 297 | } 298 | 299 | private static void setMemoryPools() 300 | { 301 | int caseValue = Program.Client.memPoolBox.SelectedIndex; 302 | 303 | switch (caseValue) 304 | { 305 | case 0: 306 | Graphics.setMemoryPoolsValue("512"); 307 | break; 308 | 309 | case 1: 310 | Graphics.setMemoryPoolsValue("1024"); 311 | break; 312 | 313 | case 2: 314 | Graphics.setMemoryPoolsValue("2048"); 315 | break; 316 | 317 | case 3: 318 | Graphics.setMemoryPoolsValue("3072"); 319 | break; 320 | 321 | case 4: 322 | Graphics.setMemoryPoolsValue("4096"); 323 | break; 324 | 325 | case 5: 326 | Graphics.setMemoryPoolsValue("0"); 327 | break; 328 | } 329 | 330 | logger.Debug("setMemoryPools - set memory pools to {0}", Graphics.getMemoryPoolsValue()); 331 | } 332 | 333 | private static void setShadowTexels() 334 | { 335 | int caseValue = Program.Client.texelBox.SelectedIndex; 336 | 337 | switch (caseValue) 338 | { 339 | case 0: 340 | Graphics.setShadowTexels("0.012000"); 341 | break; 342 | 343 | case 1: 344 | Graphics.setShadowTexels("0.008000"); 345 | break; 346 | 347 | case 2: 348 | Graphics.setShadowTexels("0.008000"); 349 | break; 350 | 351 | case 3: 352 | Graphics.setShadowTexels("0.002000"); 353 | break; 354 | } 355 | 356 | logger.Debug("setShadowTexels - set shadow depth bias to {0}", Graphics.getShadowTexels()); 357 | } 358 | 359 | private static void setMaxShadowRes() 360 | { 361 | int caseValue = Program.Client.maxShadowBox.SelectedIndex; 362 | 363 | switch (caseValue) 364 | { 365 | case 0: 366 | Graphics.setMaxShadowResolution("512"); 367 | break; 368 | 369 | case 1: 370 | Graphics.setMaxShadowResolution("1024"); 371 | break; 372 | 373 | case 2: 374 | Graphics.setMaxShadowResolution("2048"); 375 | break; 376 | 377 | case 3: 378 | Graphics.setMaxShadowResolution("4096"); 379 | break; 380 | } 381 | 382 | logger.Debug("setMaxShadowRes - set max shadow resolution to {0}", Graphics.getMaxShadowResolution()); 383 | } 384 | 385 | private static void setPhysX() 386 | { 387 | int caseValue = Program.Client.physxBox.SelectedIndex; 388 | 389 | switch (caseValue) 390 | { 391 | case 0: 392 | Graphics.setPhysX("0"); 393 | break; 394 | 395 | case 1: 396 | Graphics.setPhysX("1"); 397 | break; 398 | 399 | case 2: 400 | Graphics.setPhysX("2"); 401 | break; 402 | } 403 | 404 | logger.Debug("setPhysX - set physx to {0}", Graphics.getPhysX()); 405 | } 406 | 407 | private static void setThreadLag() 408 | { 409 | Graphics.setFrameThreadLag(Program.Client.frameCheckBox.Checked ? "True" : "False"); 410 | logger.Debug("setThreadLag - set frame thread lag to {0}", Graphics.getFrameThreadLag()); 411 | } 412 | } 413 | } -------------------------------------------------------------------------------- /data/GuiInitializer.cs: -------------------------------------------------------------------------------- 1 | using BmLauncherAsylumNET6.infrastructure; 2 | using NLog; 3 | using NvAPIWrapper.Native.Exceptions; 4 | 5 | namespace BmLauncherAsylumNET6.data 6 | { 7 | /// 8 | /// Graphics helper class. Initializes the GUI with correct values from BmEngine file 9 | /// 10 | internal class GuiInitializer 11 | { 12 | // logger for easy debugging 13 | private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 14 | 15 | public void init() 16 | { 17 | // all false/true values 18 | Program.Client.fullscreenBox.SelectedIndex = 19 | Graphics.isFullScreen().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 20 | logger.Debug("init - initialized fullscreen as {0}", Graphics.isFullScreen()); 21 | Program.Client.vsyncBox.SelectedIndex = 22 | Graphics.isVsync().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 23 | logger.Debug("init - initialized vsync as {0}", Graphics.isVsync()); 24 | 25 | Program.Client.dofBox.SelectedIndex = 26 | Graphics.isDepthOfField().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 27 | logger.Debug("init - initialized depth of field as {0}", Graphics.isDepthOfField()); 28 | 29 | Program.Client.aoBox.SelectedIndex = 30 | Graphics.isAmbientOcclusion().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 31 | logger.Debug("init - initialized ambient occlusion as {0}", Graphics.isAmbientOcclusion()); 32 | 33 | Program.Client.lensFlareBox.SelectedIndex = 34 | Graphics.isLensFlares().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 35 | logger.Debug("init - initialized lens flares as {0}", Graphics.isLensFlares()); 36 | 37 | Program.Client.mBlurBox.SelectedIndex = 38 | Graphics.isMotionBlur().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 39 | logger.Debug("init - initialized motion blur as {0}", Graphics.isMotionBlur()); 40 | 41 | Program.Client.bloomBox.SelectedIndex = 42 | Graphics.isBloom().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 43 | logger.Debug("init - initialized bloom as {0}", Graphics.isBloom()); 44 | 45 | Program.Client.dShadowBox.SelectedIndex = 46 | Graphics.isDynamicShadows().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 47 | logger.Debug("init - initialized dynamic shadows as {0}", Graphics.isDynamicShadows()); 48 | 49 | Program.Client.sphericBox.SelectedIndex = Graphics.isDisableSphericalHarmonicLights() 50 | .Equals("True", StringComparison.InvariantCultureIgnoreCase) 51 | ? 0 52 | : 1; 53 | logger.Debug("init - initialized disable spherical harmonic lights as {0}", 54 | Graphics.isDisableSphericalHarmonicLights()); 55 | 56 | Program.Client.fogBox.SelectedIndex = 57 | Graphics.isFogVolumes().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 58 | logger.Debug("init - initialized fog volumes as {0}", Graphics.isFogVolumes()); 59 | 60 | Program.Client.distBox.SelectedIndex = 61 | Graphics.isDistortion().Equals("False", StringComparison.InvariantCultureIgnoreCase) ? 0 : 1; 62 | logger.Debug("init - initialized distortion as {0}", Graphics.isDistortion()); 63 | 64 | Program.Client.frameCheckBox.Checked = Graphics.getFrameThreadLag().Equals("True"); 65 | logger.Debug("init - initialized frame thread lag as {0}", Graphics.getFrameThreadLag()); 66 | 67 | // everything else 68 | initLang(); 69 | initAA(); 70 | initPhysx(); 71 | initAnisotropy(); 72 | initDetailmode(); 73 | initShadowTexels(); 74 | initShadowRes(); 75 | initMaxSmoothedFrames(); 76 | initMemoryPoolsValue(); 77 | initResolutions(); 78 | try 79 | { 80 | initHBAONVIDIA(); 81 | } 82 | catch (FileNotFoundException e) 83 | { 84 | Program.Client.amdToolTip.Active = true; 85 | Program.Client.amdToolTip.ShowAlways = true; 86 | Program.Client.nvBox.Enabled = false; 87 | logger.Warn( 88 | "init - could not call initHBAONVIDIA() - This is fine if you're not using an NVIDIA GPU. Exception: {0}", 89 | e); 90 | } 91 | 92 | logger.Info("init - initialized all values to the gui."); 93 | } 94 | 95 | private static void initLang() 96 | { 97 | Program.Client.langBox.SelectedIndex = Graphics.getLanguage() switch 98 | { 99 | "int" => 0, 100 | "deu" => 1, 101 | "fra" => 2, 102 | "ita" => 3, 103 | "esn" => 4, 104 | _ => Program.Client.langBox.Items.Add("Unofficial"), 105 | }; 106 | logger.Debug("initLang - initialized language as {0}", Graphics.getLanguage()); 107 | } 108 | 109 | private static void initAA() 110 | { 111 | switch (Int16.Parse(Graphics.getMultiSampling())) 112 | { 113 | case 1: 114 | Program.Client.aaBox.SelectedIndex = 0; 115 | break; 116 | 117 | case 2: 118 | Program.Client.aaBox.SelectedIndex = 1; 119 | break; 120 | 121 | case 4: 122 | Program.Client.aaBox.SelectedIndex = 2; 123 | break; 124 | 125 | case 10: 126 | Program.Client.aaBox.SelectedIndex = 3; 127 | break; 128 | } 129 | 130 | logger.Debug("initAA - initialized multisampling as {0}", Graphics.getMultiSampling()); 131 | } 132 | 133 | private static void initPhysx() 134 | { 135 | switch (Int16.Parse(Graphics.getPhysX())) 136 | { 137 | case 0: 138 | Program.Client.physxBox.SelectedIndex = 0; 139 | break; 140 | 141 | case 1: 142 | Program.Client.physxBox.SelectedIndex = 1; 143 | break; 144 | 145 | case 2: 146 | Program.Client.physxBox.SelectedIndex = 2; 147 | break; 148 | } 149 | 150 | logger.Debug("initPhysx - initialized physx as {0}", Graphics.getPhysX()); 151 | } 152 | 153 | private static void initAnisotropy() 154 | { 155 | switch (Int16.Parse(Graphics.getMaxAnisotropy())) 156 | { 157 | case 4: 158 | Program.Client.anisoBox.SelectedIndex = 0; 159 | break; 160 | 161 | case 8: 162 | Program.Client.anisoBox.SelectedIndex = 1; 163 | break; 164 | 165 | case 16: 166 | Program.Client.anisoBox.SelectedIndex = 2; 167 | break; 168 | } 169 | 170 | logger.Debug("initAnisotropy - initialized max anisotropy as {0}", Graphics.getMaxAnisotropy()); 171 | } 172 | 173 | private static void initDetailmode() 174 | { 175 | switch (Int16.Parse(Graphics.getDetailMode())) 176 | { 177 | case 0: 178 | Program.Client.detailBox.SelectedIndex = 0; 179 | break; 180 | 181 | case 1: 182 | Program.Client.detailBox.SelectedIndex = 1; 183 | break; 184 | 185 | case 2: 186 | Program.Client.detailBox.SelectedIndex = 2; 187 | break; 188 | } 189 | 190 | logger.Debug("initDetailmode - initialized detail mode as {0}", Graphics.getDetailMode()); 191 | } 192 | 193 | private static void initShadowTexels() 194 | { 195 | switch (Graphics.getShadowTexels()) 196 | { 197 | case "0.012000": 198 | Program.Client.texelBox.SelectedIndex = 0; 199 | break; 200 | 201 | case "0.008000": 202 | Program.Client.texelBox.SelectedIndex = Graphics.getShadowSlope() == "10.000000" ? 1 : 2; 203 | 204 | break; 205 | 206 | case "0.002000": 207 | Program.Client.texelBox.SelectedIndex = 3; 208 | break; 209 | } 210 | 211 | logger.Debug("initShadowTexels - initialized shadow depth bias as {0}", Graphics.getShadowTexels()); 212 | } 213 | 214 | private static void initShadowRes() 215 | { 216 | switch (Int16.Parse(Graphics.getMaxShadowResolution())) 217 | { 218 | case 512: 219 | Program.Client.maxShadowBox.SelectedIndex = 0; 220 | Program.Client.texelBox.SelectedIndex = 0; 221 | Program.Client.texelBox.Enabled = false; 222 | break; 223 | 224 | case 1024: 225 | Program.Client.maxShadowBox.SelectedIndex = 1; 226 | Program.Client.texelBox.SelectedIndex = 0; 227 | Program.Client.texelBox.Enabled = false; 228 | break; 229 | 230 | case 2048: 231 | Program.Client.maxShadowBox.SelectedIndex = 2; 232 | break; 233 | 234 | case 4096: 235 | Program.Client.maxShadowBox.SelectedIndex = 3; 236 | break; 237 | } 238 | 239 | logger.Debug("initShadowRes - initialized max shadow resolution as {0}", Graphics.getMaxShadowResolution()); 240 | } 241 | 242 | private static void initMaxSmoothedFrames() 243 | { 244 | int framecap = Int32.Parse(Graphics.getMaxSmoothedFramerate() 245 | .Substring(0, Graphics.getMaxSmoothedFramerate().LastIndexOf("."))); 246 | framecap -= 2; 247 | Program.Client.maxSmoothTextBox.Text = framecap.ToString(); 248 | logger.Debug("initLang - initialized framerate cap as {0}", Graphics.getMaxSmoothedFramerate()); 249 | } 250 | 251 | private static void initMemoryPoolsValue() 252 | { 253 | switch (Int16.Parse(Graphics.getMemoryPoolsValue())) 254 | { 255 | case 0: 256 | Program.Client.memPoolBox.SelectedIndex = 5; 257 | break; 258 | 259 | case 512: 260 | Program.Client.memPoolBox.SelectedIndex = 0; 261 | break; 262 | 263 | case 1024: 264 | Program.Client.memPoolBox.SelectedIndex = 1; 265 | break; 266 | 267 | case 2048: 268 | Program.Client.memPoolBox.SelectedIndex = 2; 269 | break; 270 | 271 | case 3072: 272 | Program.Client.memPoolBox.SelectedIndex = 3; 273 | break; 274 | 275 | case 4096: 276 | Program.Client.memPoolBox.SelectedIndex = 4; 277 | break; 278 | } 279 | 280 | logger.Debug("initMemoryPoolsValue - initialized memory pools value as {0}", 281 | Graphics.getMemoryPoolsValue()); 282 | } 283 | 284 | private static void initResolutions() 285 | { 286 | foreach (string resolution in SysResolutions.ResolutionList) 287 | { 288 | Program.Client.resBox.Items.Add(resolution); 289 | } 290 | 291 | string myResolution = Graphics.getResolutionX() + "x" + Graphics.getResolutionY(); 292 | 293 | foreach (string res in Program.Client.resBox.Items) 294 | { 295 | if (!res.Equals(myResolution)) 296 | { 297 | continue; 298 | } 299 | 300 | Program.Client.resBox.SelectedIndex = Program.Client.resBox.Items.IndexOf(res); 301 | } 302 | 303 | logger.Debug("initResolutions - initialized resolution as {0}x{1}", Graphics.getResolutionX(), 304 | Graphics.getResolutionY()); 305 | } 306 | 307 | /// 308 | /// Initializes NVIDIA component, only if NVIDIA card is found. 309 | /// Sets displayed tooltips accordingly. 310 | /// 311 | private static void initHBAONVIDIA() 312 | { 313 | if (!Program.Client.gpInfoLabel.Text.Contains("NVIDIA")) 314 | { 315 | Program.Client.amdToolTip.Active = true; 316 | Program.Client.amdToolTip.ShowAlways = true; 317 | Program.Client.nvBox.Enabled = false; 318 | logger.Debug("initHBAONVIDIA - initialized hbao+ possibility as false."); 319 | return; 320 | } 321 | 322 | if (Program.Client.gpInfoLabel.Text.Contains("NVIDIA") && !WineChecker.IsWine()) 323 | { 324 | try 325 | { 326 | Program.NvWorker = new NvidiaWorker(); 327 | Program.Client.nvBox.Enabled = true; 328 | Program.Client.nvidiaToolTip.Active = true; 329 | logger.Debug("initHBAONVIDIA - initialized hbao+ possibility as true."); 330 | } 331 | catch (NVIDIANotSupportedException e) 332 | { 333 | logger.Warn("initHBAONVIDIA - Caught NVIDIANotSupportedException: {0}", e); 334 | Program.Client.nvBox.Enabled = false; 335 | } 336 | } 337 | else if (Program.Client.gpInfoLabel.Text.Contains("NVIDIA")) 338 | { 339 | Program.Client.nvBox.Enabled = false; 340 | Program.Client.nvidiaToolTip.Active = true; 341 | logger.Debug( 342 | "initHBAONVIDIA - initialized hbao+ possibility as false. You're using an NVIDIA card on a Linux machine."); 343 | } 344 | } 345 | } 346 | } -------------------------------------------------------------------------------- /data/Presets.cs: -------------------------------------------------------------------------------- 1 | namespace BmLauncherAsylumNET6.data 2 | { 3 | /// 4 | /// Simple Class to store values for the presets. 5 | /// 6 | internal static class Presets 7 | { 8 | private static void setCommon() 9 | { 10 | Program.Client.detailBox.SelectedIndex = 2; 11 | Program.Client.fogBox.SelectedIndex = 1; 12 | Program.Client.anisoBox.SelectedIndex = 2; 13 | Program.Client.aoBox.SelectedIndex = 0; 14 | Program.Client.sphericBox.SelectedIndex = 1; 15 | Program.Client.bloomBox.SelectedIndex = 1; 16 | Program.Client.lensFlareBox.SelectedIndex = 1; 17 | Program.Client.dShadowBox.SelectedIndex = 1; 18 | Program.Client.dofBox.SelectedIndex = 1; 19 | Program.Client.distBox.SelectedIndex = 1; 20 | } 21 | 22 | public static void setUltra() 23 | { 24 | setCommon(); 25 | Program.Client.aaBox.SelectedIndex = 0; 26 | Program.Client.maxShadowBox.SelectedIndex = 2; 27 | Program.Client.texelBox.SelectedIndex = 0; 28 | Program.Client.physxBox.SelectedIndex = Program.Client.gpInfoLabel.Text.Contains("NVIDIA") ? 1 : 0; 29 | Program.Client.memPoolBox.SelectedIndex = 2; 30 | if (Program.Client.gpInfoLabel.Text.Contains("NVIDIA") && Program.Client.nvBox.Enabled) 31 | { 32 | Program.Client.nvBox.Checked = true; 33 | } 34 | } 35 | 36 | public static void setOptimized() 37 | { 38 | setCommon(); 39 | Program.Client.aaBox.SelectedIndex = 0; 40 | Program.Client.maxShadowBox.SelectedIndex = 1; 41 | Program.Client.memPoolBox.SelectedIndex = 2; 42 | Program.Client.texelBox.SelectedIndex = 0; 43 | Program.Client.physxBox.SelectedIndex = 0; 44 | if (Program.Client.gpInfoLabel.Text.Contains("NVIDIA") && Program.Client.nvBox.Enabled) 45 | { 46 | Program.Client.nvBox.Checked = false; 47 | } 48 | } 49 | 50 | public static void setReborn() 51 | { 52 | setCommon(); 53 | Program.Client.aaBox.SelectedIndex = 0; 54 | Program.Client.maxShadowBox.SelectedIndex = 3; 55 | Program.Client.texelBox.SelectedIndex = 1; 56 | Program.Client.physxBox.SelectedIndex = Program.Client.gpInfoLabel.Text.Contains("NVIDIA") ? 1 : 0; 57 | if (Program.Client.gpInfoLabel.Text.Contains("NVIDIA") && Program.Client.nvBox.Enabled) 58 | { 59 | Program.Client.nvBox.Checked = true; 60 | } 61 | 62 | Program.Client.dofBox.SelectedIndex = 0; 63 | Program.Client.memPoolBox.SelectedIndex = 3; 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /data/WineChecker.cs: -------------------------------------------------------------------------------- 1 | using NLog; 2 | using System.Runtime.InteropServices; 3 | 4 | namespace BmLauncherAsylumNET6.data 5 | { 6 | internal static class WineChecker 7 | { 8 | private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 9 | 10 | public static bool IsWine() 11 | { 12 | try 13 | { 14 | logger.Info("IsWine - Wine detected. Version: {0}", GetWineVersion()); 15 | return true; 16 | } 17 | catch (EntryPointNotFoundException e) 18 | { 19 | logger.Warn( 20 | "IsWine - Wine not found. (Windows Users can ignore this.).\r\nEntryPointNotFoundException: {0}", 21 | e); 22 | return false; 23 | } 24 | } 25 | 26 | [DllImport("ntdll.dll", EntryPoint = "wine_get_version", CallingConvention = CallingConvention.Cdecl, 27 | CharSet = CharSet.Ansi)] 28 | private static extern string GetWineVersion(); 29 | } 30 | } -------------------------------------------------------------------------------- /infrastructure/NativeMethods.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | 3 | namespace BmLauncherAsylumNET6.infrastructure 4 | { 5 | /// 6 | /// Wrapper Class for Win32 parameters. Used to ensure only one instance of this Application is active. 7 | /// 8 | internal class NativeMethods 9 | { 10 | public const int HwndBroadcast = 0xffff; 11 | public static readonly int WmShowme = RegisterWindowMessage("WM_SHOWME"); 12 | 13 | [DllImport("user32")] 14 | public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); 15 | 16 | [DllImport("user32")] 17 | public static extern int RegisterWindowMessage(string message); 18 | } 19 | } -------------------------------------------------------------------------------- /infrastructure/NvidiaWorker.cs: -------------------------------------------------------------------------------- 1 | using NLog; 2 | using NvAPIWrapper; 3 | using NvAPIWrapper.DRS; 4 | using NvAPIWrapper.Native.Exceptions; 5 | 6 | namespace BmLauncherAsylumNET6.infrastructure 7 | { 8 | /// 9 | /// Worker class utilizing the Nvidia API through NvAPIWrapper. 10 | /// Used to find Arkham Asylum NVIDIA profile and modify it. 11 | /// 12 | internal class NvidiaWorker 13 | { 14 | // logger for easy debugging 15 | private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 16 | 17 | private static string aoActive = "0"; 18 | private static string aoValue = "0"; 19 | 20 | public static bool HasHbao = true; 21 | private readonly DriverSettingsProfile _prof; 22 | private readonly DriverSettingsSession _session; 23 | 24 | /// 25 | /// Created in Program, instantiated by GuiInitializer. 26 | /// Finds the Batman: Arkham Asylum Profile or creates it if it doesn't exist yet. 27 | /// Calls getNVSettings(). 28 | /// 29 | public NvidiaWorker() 30 | { 31 | try 32 | { 33 | NVIDIA.Initialize(); 34 | logger.Debug("Constructor - NVIDIA API initialized."); 35 | _session = DriverSettingsSession.CreateAndLoad(); 36 | try 37 | { 38 | _session.FindProfileByName("Batman: Arkham Asylum"); 39 | } 40 | catch (NVIDIAApiException e) 41 | { 42 | Console.WriteLine(e); 43 | DriverSettingsProfile profile = 44 | DriverSettingsProfile.CreateProfile(_session, "Batman: Arkham Asylum"); 45 | ProfileApplication profApp = ProfileApplication.CreateApplication(profile, "shippingpc-bmgame.exe"); 46 | profile = profApp.Profile; 47 | profile.SetSetting(KnownSettingId.AmbientOcclusionModeActive, 0); 48 | profile.SetSetting(KnownSettingId.AmbientOcclusionMode, 0); 49 | _session.Save(); 50 | logger.Warn("Constructor - NVIDIA profile not found. Creating profile: {0}", profile.ToString()); 51 | } 52 | 53 | _prof = _session.FindProfileByName("Batman: Arkham Asylum"); 54 | getNVSettings(); 55 | logger.Info("Constructor - NVIDIA profile fully processed."); 56 | } 57 | catch (NVIDIANotSupportedException e) 58 | { 59 | NVIDIA.Initialize(); 60 | Program.Client.nvBox.Enabled = false; 61 | logger.Warn("Constructor - Caught NVIDIANotSupportedException: {0}.", e); 62 | } 63 | } 64 | 65 | /// 66 | /// Sets NVIDIA settings in accordance to user input. 67 | /// Called by GraphicsWriter. 68 | /// 69 | public void setNVSettings() 70 | { 71 | try 72 | { 73 | if (Program.Client.nvBox.Checked && Program.Client.nvBox.Enabled) 74 | { 75 | _prof.SetSetting(KnownSettingId.AmbientOcclusionModeActive, 1); 76 | _prof.SetSetting(KnownSettingId.AmbientOcclusionMode, 2); 77 | _session.Save(); 78 | } 79 | else if (Program.Client.nvBox.Enabled) 80 | { 81 | _prof.SetSetting(KnownSettingId.AmbientOcclusionModeActive, 0); 82 | _prof.SetSetting(KnownSettingId.AmbientOcclusionMode, 0); 83 | _session.Save(); 84 | } 85 | 86 | logger.Debug( 87 | "setNVSettings - setting AmbientOcclusionModeActive to {0}, setting AmbientOcclusionMode to {1}", 88 | _prof.GetSetting(KnownSettingId.AmbientOcclusionModeActive).CurrentValue, 89 | _prof.GetSetting(KnownSettingId.AmbientOcclusionMode).CurrentValue); 90 | } 91 | catch (NullReferenceException e) 92 | { 93 | logger.Warn("setNVSettings - Caught NullReferenceException: {0}", e); 94 | } 95 | } 96 | 97 | /// 98 | /// Gets the current NVIDIA settings from the profile. 99 | /// Adjusts checkbox accordingly. 100 | /// 101 | public void getNVSettings() 102 | { 103 | Int16 compValue = 0; 104 | try 105 | { 106 | aoActive = _prof.GetSetting(KnownSettingId.AmbientOcclusionModeActive).ToString(); 107 | aoValue = _prof.GetSetting(KnownSettingId.AmbientOcclusionMode).ToString(); 108 | compValue = Int16.Parse(_prof.GetSetting(2916165).CurrentValue.ToString()); 109 | } 110 | catch (Exception) 111 | { 112 | _prof.SetSetting(KnownSettingId.AmbientOcclusionModeActive, 0); 113 | _prof.SetSetting(KnownSettingId.AmbientOcclusionMode, 0); 114 | Program.Client.nvBox.Checked = false; 115 | logger.Warn( 116 | "getNVSettings - couldn't find ambient occlusion settings. Generating settings with default(0) values now."); 117 | } 118 | 119 | if (!aoActive.Contains("1") || !aoValue.Contains("2") || compValue != 48) 120 | { 121 | if (compValue != 48) 122 | { 123 | HasHbao = false; 124 | } 125 | } 126 | else 127 | { 128 | Program.Client.nvBox.Checked = true; 129 | } 130 | 131 | logger.Debug("getNVSettings - hbao+ is currently {0}", HasHbao); 132 | } 133 | } 134 | } -------------------------------------------------------------------------------- /infrastructure/SysResolutions.cs: -------------------------------------------------------------------------------- 1 | using NLog; 2 | using System.Runtime.InteropServices; 3 | 4 | namespace BmLauncherAsylumNET6.infrastructure 5 | { 6 | /// 7 | /// Premade class with slight additions, originally taken off StackOverflow. 8 | /// Used to collect available System Resolutions from user. 9 | /// 10 | internal class SysResolutions 11 | { 12 | // logger for easy debugging 13 | private static Logger logger = LogManager.GetCurrentClassLogger(); 14 | 15 | // string list to store resolution values 16 | public static List ResolutionList; 17 | 18 | public SysResolutions() 19 | { 20 | logger = LogManager.GetCurrentClassLogger(); 21 | } 22 | 23 | [DllImport("user32.dll")] 24 | public static extern bool EnumDisplaySettings( 25 | string deviceName, int modeNum, ref DEVMODE devMode); 26 | 27 | /// 28 | /// Getter for user resolutions. 29 | /// Called by Program upon application start. 30 | /// 31 | public void getResolutions() 32 | { 33 | List tempList = new(); 34 | DEVMODE vDevMode = new(); 35 | int i = 0; 36 | while (EnumDisplaySettings(null, i, ref vDevMode)) 37 | { 38 | tempList.Add(vDevMode.dmPelsWidth + "x" + vDevMode.dmPelsHeight); 39 | i++; 40 | } 41 | 42 | int maxLength = tempList.Max(x => x.Length); 43 | IOrderedEnumerable orderedList = tempList.OrderBy(x => x.PadLeft(maxLength, '0')); 44 | ResolutionList = orderedList.Distinct().ToList(); 45 | logger.Debug("getResolutions - found a total of {0} available resolutions.", ResolutionList.Count); 46 | } 47 | 48 | [StructLayout(LayoutKind.Sequential)] 49 | public struct DEVMODE 50 | { 51 | private const int Cchdevicename = 0x20; 52 | private const int Cchformname = 0x20; 53 | 54 | [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)] 55 | public string dmDeviceName; 56 | 57 | public short dmSpecVersion; 58 | public short dmDriverVersion; 59 | public short dmSize; 60 | public short dmDriverExtra; 61 | public int dmFields; 62 | public int dmPositionX; 63 | public int dmPositionY; 64 | public ScreenOrientation dmDisplayOrientation; 65 | public int dmDisplayFixedOutput; 66 | public short dmColor; 67 | public short dmDuplex; 68 | public short dmYResolution; 69 | public short dmTTOption; 70 | public short dmCollate; 71 | 72 | [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)] 73 | public string dmFormName; 74 | 75 | public short dmLogPixels; 76 | public int dmBitsPerPel; 77 | public int dmPelsWidth; 78 | public int dmPelsHeight; 79 | public int dmDisplayFlags; 80 | public int dmDisplayFrequency; 81 | public int dmICMMethod; 82 | public int dmICMIntent; 83 | public int dmMediaType; 84 | public int dmDitherType; 85 | public int dmReserved1; 86 | public int dmReserved2; 87 | public int dmPanningWidth; 88 | public int dmPanningHeight; 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /ui/BmLauncherForm.cs: -------------------------------------------------------------------------------- 1 | using BmLauncherAsylumNET6.data; 2 | using BmLauncherAsylumNET6.infrastructure; 3 | using NLog; 4 | using System.Diagnostics; 5 | using System.Globalization; 6 | 7 | namespace BmLauncherAsylumNET6.ui 8 | { 9 | public partial class BmLauncherForm : Form 10 | 11 | { 12 | // logger for easy debugging 13 | private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 14 | 15 | private static bool firstLaunch; 16 | private static bool readWarning; 17 | 18 | public bool ChangedConfig; 19 | 20 | public BmLauncherForm() 21 | { 22 | InitializeComponent(); 23 | } 24 | 25 | private void texgroupButton_Click(object sender, EventArgs e) 26 | { 27 | Program.MyFactory.SetTexfix(); 28 | } 29 | 30 | private void launchButton_Click(object sender, EventArgs e) 31 | { 32 | if (ChangedConfig) 33 | { 34 | Program.MyFactory.writeGraphFile(); 35 | } 36 | else 37 | { 38 | logger.Info("No configuration changes made."); 39 | } 40 | 41 | 42 | using (Process launchBmGame = new()) 43 | { 44 | try 45 | { 46 | Factory.InputFileInfo.IsReadOnly = true; 47 | if (Factory.TexmodDetected) 48 | { 49 | launchBmGame.StartInfo.FileName = "texmod_autoload.exe"; 50 | launchBmGame.StartInfo.CreateNoWindow = true; 51 | launchBmGame.Start(); 52 | logger.Info("Launching Texmod. Logging has concluded at {0}, on {1}.", 53 | DateTime.Now.ToString("HH:mm:ss"), DateTime.Now.ToString("D", new CultureInfo("en-GB"))); 54 | launchButton.Enabled = false; 55 | LogManager.Flush(); 56 | Application.Exit(); 57 | } 58 | else 59 | { 60 | launchBmGame.StartInfo.FileName = "ShippingPC-BmGame.exe"; 61 | launchBmGame.StartInfo.CreateNoWindow = true; 62 | launchBmGame.Start(); 63 | logger.Info("Launching game application. Logging has concluded at {0}, on {1}.", 64 | DateTime.Now.ToString("HH:mm:ss"), DateTime.Now.ToString("D", new CultureInfo("en-GB"))); 65 | launchButton.Enabled = false; 66 | LogManager.Flush(); 67 | Application.Exit(); 68 | } 69 | } 70 | catch (Exception) 71 | { 72 | MessageBox.Show( 73 | "Couldn't find ShippingPC_BmGame.exe or texmod_autoload.exe.\r\nPlease place the Launcher files in the correct folder.\r\n" + 74 | "\r\nThe correct install folder is: \\Batman Arkham Asylum GOTY\\Binaries.", 75 | @"Could not start game!", 76 | MessageBoxButtons.OK, 77 | MessageBoxIcon.Error); 78 | } 79 | } 80 | } 81 | 82 | private void credLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 83 | { 84 | new CreditsWindow().ShowDialog(); 85 | } 86 | 87 | private void keyButton_Click(object sender, EventArgs e) 88 | { 89 | Program.MyFactory.Keybinds.ShowDialog(); 90 | } 91 | 92 | private void applyButton_Click(object sender, EventArgs e) 93 | { 94 | Program.MyFactory.writeGraphFile(); 95 | if (langBox.SelectedIndex != 5) 96 | { 97 | try 98 | { 99 | langBox.Items.RemoveAt(5); 100 | } 101 | catch (ArgumentOutOfRangeException) 102 | { 103 | } 104 | } 105 | 106 | applyButton.Enabled = false; 107 | ChangedConfig = false; 108 | } 109 | 110 | private void nvBox_CheckedChanged(object sender, EventArgs e) 111 | { 112 | aoBox.Enabled = !nvBox.Checked; 113 | ChangedConfig = true; 114 | applyButton.Enabled = true; 115 | } 116 | 117 | private void fullscreenBox_SelectedIndexChanged(object sender, EventArgs e) 118 | { 119 | ChangedConfig = true; 120 | applyButton.Enabled = true; 121 | } 122 | 123 | private void resBox_SelectedIndexChanged(object sender, EventArgs e) 124 | { 125 | ChangedConfig = true; 126 | applyButton.Enabled = true; 127 | } 128 | 129 | private void vsyncBox_SelectedIndexChanged(object sender, EventArgs e) 130 | { 131 | ChangedConfig = true; 132 | applyButton.Enabled = true; 133 | } 134 | 135 | private void detailBox_SelectedIndexChanged(object sender, EventArgs e) 136 | { 137 | ChangedConfig = true; 138 | applyButton.Enabled = true; 139 | } 140 | 141 | private void ultraButton_Click(object sender, EventArgs e) 142 | { 143 | Presets.setUltra(); 144 | ChangedConfig = true; 145 | applyButton.Enabled = true; 146 | } 147 | 148 | private void optiButton_Click(object sender, EventArgs e) 149 | { 150 | Presets.setOptimized(); 151 | ChangedConfig = true; 152 | applyButton.Enabled = true; 153 | } 154 | 155 | private void aaBox_SelectedIndexChanged(object sender, EventArgs e) 156 | { 157 | ChangedConfig = true; 158 | applyButton.Enabled = true; 159 | } 160 | 161 | private void fogBox_SelectedIndexChanged(object sender, EventArgs e) 162 | { 163 | ChangedConfig = true; 164 | applyButton.Enabled = true; 165 | } 166 | 167 | private void bloomBox_SelectedIndexChanged(object sender, EventArgs e) 168 | { 169 | ChangedConfig = true; 170 | applyButton.Enabled = true; 171 | } 172 | 173 | private void lensFlareBox_SelectedIndexChanged(object sender, EventArgs e) 174 | { 175 | ChangedConfig = true; 176 | applyButton.Enabled = true; 177 | } 178 | 179 | private void dofBox_SelectedIndexChanged(object sender, EventArgs e) 180 | { 181 | ChangedConfig = true; 182 | applyButton.Enabled = true; 183 | } 184 | 185 | private void distBox_SelectedIndexChanged(object sender, EventArgs e) 186 | { 187 | ChangedConfig = true; 188 | applyButton.Enabled = true; 189 | } 190 | 191 | private void mBlurBox_SelectedIndexChanged(object sender, EventArgs e) 192 | { 193 | ChangedConfig = true; 194 | applyButton.Enabled = true; 195 | } 196 | 197 | private void memPoolBox_SelectedIndexChanged(object sender, EventArgs e) 198 | { 199 | ChangedConfig = true; 200 | applyButton.Enabled = true; 201 | } 202 | 203 | private void anisoBox_SelectedIndexChanged(object sender, EventArgs e) 204 | { 205 | ChangedConfig = true; 206 | applyButton.Enabled = true; 207 | } 208 | 209 | private void sphericBox_SelectedIndexChanged(object sender, EventArgs e) 210 | { 211 | ChangedConfig = true; 212 | applyButton.Enabled = true; 213 | } 214 | 215 | private void aoBox_SelectedIndexChanged(object sender, EventArgs e) 216 | { 217 | ChangedConfig = true; 218 | applyButton.Enabled = true; 219 | } 220 | 221 | private void dShadowBox_SelectedIndexChanged(object sender, EventArgs e) 222 | { 223 | ChangedConfig = true; 224 | applyButton.Enabled = true; 225 | } 226 | 227 | private void texelBox_SelectedIndexChanged(object sender, EventArgs e) 228 | { 229 | ChangedConfig = true; 230 | applyButton.Enabled = true; 231 | } 232 | 233 | private void maxShadowBox_SelectedIndexChanged(object sender, EventArgs e) 234 | { 235 | ChangedConfig = true; 236 | applyButton.Enabled = true; 237 | 238 | switch (maxShadowBox.SelectedIndex) 239 | { 240 | case 0: 241 | texelBox.Enabled = false; 242 | texelBox.SelectedIndex = 0; 243 | break; 244 | case 1: 245 | texelBox.Enabled = false; 246 | texelBox.SelectedIndex = 0; 247 | break; 248 | case 2: 249 | texelBox.Enabled = true; 250 | break; 251 | case 3: 252 | texelBox.Enabled = true; 253 | break; 254 | } 255 | } 256 | 257 | private void physxBox_SelectedIndexChanged(object sender, EventArgs e) 258 | { 259 | if (!firstLaunch) 260 | { 261 | firstLaunch = true; 262 | return; 263 | } 264 | 265 | if (physxBox.SelectedIndex == 2 && !readWarning) 266 | { 267 | MessageBox.Show( 268 | "Changing your PhysX settings to \'High\' will result in\r\nhuge frame drops for certain" + 269 | " sections of the game.\r\nIt is recommended to select \'Medium\' settings.", @"PhysX Warning", 270 | MessageBoxButtons.OK, 271 | MessageBoxIcon.Warning); 272 | readWarning = true; 273 | } 274 | 275 | ChangedConfig = true; 276 | applyButton.Enabled = true; 277 | } 278 | 279 | private void disableIntroButton_Click(object sender, EventArgs e) 280 | { 281 | ChangedConfig = true; 282 | Program.MyFactory.SetIntroFix(); 283 | } 284 | 285 | private void maxSmoothTextBox_TextChanged(object sender, EventArgs e) 286 | { 287 | ChangedConfig = true; 288 | applyButton.Enabled = true; 289 | } 290 | 291 | private void langBox_SelectedIndexChanged(object sender, EventArgs e) 292 | { 293 | ChangedConfig = true; 294 | applyButton.Enabled = true; 295 | } 296 | 297 | private void frameCheckBox_CheckedChanged(object sender, EventArgs e) 298 | { 299 | ChangedConfig = true; 300 | applyButton.Enabled = true; 301 | } 302 | 303 | private void ManualModeBtn_Click(object sender, EventArgs e) 304 | { 305 | DialogResult result = MessageBox.Show( 306 | "This option removes the 'read-only' flag of the configuration files, allowing for manual edits.\r\n" + 307 | "The launcher will close if you choose this option and any unsaved changes will be lost.\r\n\r\n" + 308 | "Do you wish to continue?", @"Enable Manual Editing", 309 | MessageBoxButtons.YesNo, 310 | MessageBoxIcon.Warning); 311 | 312 | if (result == DialogResult.Yes) 313 | { 314 | Factory.ConfigInfo.IsReadOnly = false; 315 | Factory.UserEngineInfo.IsReadOnly = false; 316 | Factory.BmInputFileInfo.IsReadOnly = false; 317 | logger.Info("Closing launcher and disabling read-only flags. Logging has concluded at {0}, on {1}.", 318 | DateTime.Now.ToString("HH:mm:ss"), DateTime.Now.ToString("D", new CultureInfo("en-GB"))); 319 | LogManager.Flush(); 320 | Application.Exit(); 321 | } 322 | } 323 | 324 | private void rebornButton_Click(object sender, EventArgs e) 325 | { 326 | Presets.setReborn(); 327 | ChangedConfig = true; 328 | } 329 | } 330 | } -------------------------------------------------------------------------------- /ui/CreditsWindow.Designer.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Windows.Forms; 3 | 4 | namespace BmLauncherAsylumNET6.ui 5 | { 6 | partial class CreditsWindow 7 | { 8 | /// 9 | /// Required designer variable. 10 | /// 11 | private IContainer components = null; 12 | 13 | /// 14 | /// Clean up any resources being used. 15 | /// 16 | /// true if managed resources should be disposed; otherwise, false. 17 | protected override void Dispose(bool disposing) 18 | { 19 | if (disposing && (components != null)) 20 | { 21 | components.Dispose(); 22 | } 23 | base.Dispose(disposing); 24 | } 25 | 26 | #region Windows Form Designer generated code 27 | 28 | /// 29 | /// Required method for Designer support - do not modify 30 | /// the contents of this method with the code editor. 31 | /// 32 | private void InitializeComponent() 33 | { 34 | this.rockCred = new System.Windows.Forms.Label(); 35 | this.credBox = new System.Windows.Forms.GroupBox(); 36 | this.writtenLabel = new System.Windows.Forms.Label(); 37 | this.everLabel = new System.Windows.Forms.LinkLabel(); 38 | this.gpLabel = new System.Windows.Forms.LinkLabel(); 39 | this.collabLabel = new System.Windows.Forms.Label(); 40 | this.frofooLabel = new System.Windows.Forms.LinkLabel(); 41 | this.groupBox1 = new System.Windows.Forms.GroupBox(); 42 | this.linkLabel1 = new System.Windows.Forms.LinkLabel(); 43 | this.groupBox2 = new System.Windows.Forms.GroupBox(); 44 | this.linkLabel2 = new System.Windows.Forms.LinkLabel(); 45 | this.groupBox3 = new System.Windows.Forms.GroupBox(); 46 | this.linkLabel3 = new System.Windows.Forms.LinkLabel(); 47 | this.credBox.SuspendLayout(); 48 | this.groupBox1.SuspendLayout(); 49 | this.groupBox2.SuspendLayout(); 50 | this.groupBox3.SuspendLayout(); 51 | this.SuspendLayout(); 52 | // 53 | // rockCred 54 | // 55 | this.rockCred.AutoSize = true; 56 | this.rockCred.ForeColor = System.Drawing.SystemColors.InfoText; 57 | this.rockCred.Location = new System.Drawing.Point(9, 9); 58 | this.rockCred.Name = "rockCred"; 59 | this.rockCred.Size = new System.Drawing.Size(201, 15); 60 | this.rockCred.TabIndex = 0; 61 | this.rockCred.Text = "Game created by Rocksteady Studios"; 62 | this.rockCred.Click += new System.EventHandler(this.rockCred_Click); 63 | // 64 | // credBox 65 | // 66 | this.credBox.Controls.Add(this.writtenLabel); 67 | this.credBox.Controls.Add(this.everLabel); 68 | this.credBox.Controls.Add(this.gpLabel); 69 | this.credBox.Controls.Add(this.collabLabel); 70 | this.credBox.Controls.Add(this.frofooLabel); 71 | this.credBox.Location = new System.Drawing.Point(12, 25); 72 | this.credBox.Name = "credBox"; 73 | this.credBox.Size = new System.Drawing.Size(180, 91); 74 | this.credBox.TabIndex = 1; 75 | this.credBox.TabStop = false; 76 | // 77 | // writtenLabel 78 | // 79 | this.writtenLabel.AutoSize = true; 80 | this.writtenLabel.ForeColor = System.Drawing.SystemColors.InfoText; 81 | this.writtenLabel.Location = new System.Drawing.Point(6, 12); 82 | this.writtenLabel.Name = "writtenLabel"; 83 | this.writtenLabel.Size = new System.Drawing.Size(127, 15); 84 | this.writtenLabel.TabIndex = 4; 85 | this.writtenLabel.Text = "Application written by:"; 86 | // 87 | // everLabel 88 | // 89 | this.everLabel.AutoSize = true; 90 | this.everLabel.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; 91 | this.everLabel.Location = new System.Drawing.Point(6, 74); 92 | this.everLabel.Name = "everLabel"; 93 | this.everLabel.Size = new System.Drawing.Size(69, 15); 94 | this.everLabel.TabIndex = 3; 95 | this.everLabel.TabStop = true; 96 | this.everLabel.Text = "EVERGREEN"; 97 | this.everLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.everLabel_LinkClicked); 98 | // 99 | // gpLabel 100 | // 101 | this.gpLabel.AutoSize = true; 102 | this.gpLabel.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; 103 | this.gpLabel.Location = new System.Drawing.Point(6, 59); 104 | this.gpLabel.Name = "gpLabel"; 105 | this.gpLabel.Size = new System.Drawing.Size(50, 15); 106 | this.gpLabel.TabIndex = 2; 107 | this.gpLabel.TabStop = true; 108 | this.gpLabel.Text = "GPUnity"; 109 | this.gpLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.gpLabel_LinkClicked); 110 | // 111 | // collabLabel 112 | // 113 | this.collabLabel.AutoSize = true; 114 | this.collabLabel.ForeColor = System.Drawing.SystemColors.InfoText; 115 | this.collabLabel.Location = new System.Drawing.Point(6, 45); 116 | this.collabLabel.Name = "collabLabel"; 117 | this.collabLabel.Size = new System.Drawing.Size(121, 15); 118 | this.collabLabel.TabIndex = 1; 119 | this.collabLabel.Text = "In Collaboration with:"; 120 | // 121 | // frofooLabel 122 | // 123 | this.frofooLabel.Anchor = System.Windows.Forms.AnchorStyles.Top; 124 | this.frofooLabel.AutoSize = true; 125 | this.frofooLabel.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; 126 | this.frofooLabel.Location = new System.Drawing.Point(7, 27); 127 | this.frofooLabel.Name = "frofooLabel"; 128 | this.frofooLabel.Size = new System.Drawing.Size(39, 15); 129 | this.frofooLabel.TabIndex = 0; 130 | this.frofooLabel.TabStop = true; 131 | this.frofooLabel.Text = "Neato"; 132 | this.frofooLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.frofooLabel_LinkClicked); 133 | // 134 | // groupBox1 135 | // 136 | this.groupBox1.Controls.Add(this.linkLabel1); 137 | this.groupBox1.Location = new System.Drawing.Point(12, 115); 138 | this.groupBox1.Name = "groupBox1"; 139 | this.groupBox1.Size = new System.Drawing.Size(180, 30); 140 | this.groupBox1.TabIndex = 2; 141 | this.groupBox1.TabStop = false; 142 | // 143 | // linkLabel1 144 | // 145 | this.linkLabel1.Anchor = System.Windows.Forms.AnchorStyles.Top; 146 | this.linkLabel1.AutoSize = true; 147 | this.linkLabel1.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; 148 | this.linkLabel1.Location = new System.Drawing.Point(45, 11); 149 | this.linkLabel1.Name = "linkLabel1"; 150 | this.linkLabel1.Size = new System.Drawing.Size(102, 15); 151 | this.linkLabel1.TabIndex = 5; 152 | this.linkLabel1.TabStop = true; 153 | this.linkLabel1.Text = "Github Repository"; 154 | this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); 155 | // 156 | // groupBox2 157 | // 158 | this.groupBox2.Controls.Add(this.linkLabel2); 159 | this.groupBox2.Location = new System.Drawing.Point(12, 142); 160 | this.groupBox2.Name = "groupBox2"; 161 | this.groupBox2.Size = new System.Drawing.Size(180, 30); 162 | this.groupBox2.TabIndex = 6; 163 | this.groupBox2.TabStop = false; 164 | // 165 | // linkLabel2 166 | // 167 | this.linkLabel2.Anchor = System.Windows.Forms.AnchorStyles.Top; 168 | this.linkLabel2.AutoSize = true; 169 | this.linkLabel2.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; 170 | this.linkLabel2.Location = new System.Drawing.Point(45, 11); 171 | this.linkLabel2.Name = "linkLabel2"; 172 | this.linkLabel2.Size = new System.Drawing.Size(93, 15); 173 | this.linkLabel2.TabIndex = 5; 174 | this.linkLabel2.TabStop = true; 175 | this.linkLabel2.Text = "HD Texture Pack"; 176 | this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked); 177 | // 178 | // groupBox3 179 | // 180 | this.groupBox3.Controls.Add(this.linkLabel3); 181 | this.groupBox3.Location = new System.Drawing.Point(12, 169); 182 | this.groupBox3.Name = "groupBox3"; 183 | this.groupBox3.Size = new System.Drawing.Size(180, 30); 184 | this.groupBox3.TabIndex = 7; 185 | this.groupBox3.TabStop = false; 186 | // 187 | // linkLabel3 188 | // 189 | this.linkLabel3.Anchor = System.Windows.Forms.AnchorStyles.Top; 190 | this.linkLabel3.AutoSize = true; 191 | this.linkLabel3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); 192 | this.linkLabel3.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; 193 | this.linkLabel3.LinkColor = System.Drawing.Color.DarkGoldenrod; 194 | this.linkLabel3.Location = new System.Drawing.Point(33, 11); 195 | this.linkLabel3.Name = "linkLabel3"; 196 | this.linkLabel3.Size = new System.Drawing.Size(117, 13); 197 | this.linkLabel3.TabIndex = 5; 198 | this.linkLabel3.TabStop = true; 199 | this.linkLabel3.Text = "Support the Project"; 200 | this.linkLabel3.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel3_LinkClicked); 201 | // 202 | // CreditsWindow 203 | // 204 | this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); 205 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 206 | this.AutoSize = true; 207 | this.AutoValidate = System.Windows.Forms.AutoValidate.EnableAllowFocusChange; 208 | this.ClientSize = new System.Drawing.Size(204, 208); 209 | this.Controls.Add(this.groupBox1); 210 | this.Controls.Add(this.groupBox2); 211 | this.Controls.Add(this.groupBox3); 212 | this.Controls.Add(this.credBox); 213 | this.Controls.Add(this.rockCred); 214 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 215 | this.MaximizeBox = false; 216 | this.MinimizeBox = false; 217 | this.Name = "CreditsWindow"; 218 | this.ShowInTaskbar = false; 219 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 220 | this.Text = "Information"; 221 | this.TopMost = true; 222 | this.credBox.ResumeLayout(false); 223 | this.credBox.PerformLayout(); 224 | this.groupBox1.ResumeLayout(false); 225 | this.groupBox1.PerformLayout(); 226 | this.groupBox2.ResumeLayout(false); 227 | this.groupBox2.PerformLayout(); 228 | this.groupBox3.ResumeLayout(false); 229 | this.groupBox3.PerformLayout(); 230 | this.ResumeLayout(false); 231 | this.PerformLayout(); 232 | 233 | } 234 | 235 | #endregion 236 | 237 | private Label rockCred; 238 | private GroupBox credBox; 239 | private LinkLabel everLabel; 240 | private LinkLabel gpLabel; 241 | private Label collabLabel; 242 | private LinkLabel frofooLabel; 243 | private Label writtenLabel; 244 | private GroupBox groupBox1; 245 | private LinkLabel linkLabel1; 246 | private GroupBox groupBox2; 247 | private LinkLabel linkLabel2; 248 | private GroupBox groupBox3; 249 | private LinkLabel linkLabel3; 250 | } 251 | } -------------------------------------------------------------------------------- /ui/CreditsWindow.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | 3 | namespace BmLauncherAsylumNET6.ui 4 | { 5 | public partial class CreditsWindow : Form 6 | { 7 | public CreditsWindow() 8 | { 9 | InitializeComponent(); 10 | } 11 | 12 | private void rockCred_Click(object sender, EventArgs e) 13 | { 14 | } 15 | 16 | private void frofooLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 17 | { 18 | Process.Start(new ProcessStartInfo { FileName = @"https://steamcommunity.com/id/frofoo/", UseShellExecute = true }); 19 | } 20 | 21 | private void gpLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 22 | { 23 | Process.Start(new ProcessStartInfo { FileName = @"https://www.youtube.com/c/GPUnity", UseShellExecute = true }); 24 | } 25 | 26 | private void everLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 27 | { 28 | Random number = new(); 29 | 30 | if ((number.NextDouble() * (100.0 - 1.0)) + 1.0 <= 7.0) 31 | { 32 | Process.Start(new ProcessStartInfo { FileName = @"https://en.wikipedia.org/wiki/Baguette", UseShellExecute = true }); 33 | } 34 | else 35 | { 36 | Process.Start(new ProcessStartInfo { FileName = @"https://www.nexusmods.com/users/6875632?tab=user+files", UseShellExecute = true }); 37 | } 38 | } 39 | 40 | private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 41 | { 42 | Process.Start(new ProcessStartInfo { FileName = @"https://steamcommunity.com/sharedfiles/filedetails/?id=1159691355", UseShellExecute = true }); 43 | 44 | } 45 | 46 | private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 47 | { 48 | Process.Start(new ProcessStartInfo { FileName = @"https://github.com/neatodev/BmLauncherAsylumNET6", UseShellExecute = true }); 49 | 50 | } 51 | 52 | private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 53 | { 54 | Process.Start(new ProcessStartInfo { FileName = @"https://www.paypal.com/donate/?hosted_button_id=LG7YTKP4JYN5S", UseShellExecute = true }); 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /ui/CreditsWindow.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | text/microsoft-resx 50 | 51 | 52 | 2.0 53 | 54 | 55 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 56 | 57 | 58 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 59 | 60 | -------------------------------------------------------------------------------- /ui/InputForm.Designer.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Windows.Forms; 3 | 4 | namespace BmLauncherAsylumNET6.ui 5 | { 6 | partial class inputForm 7 | { 8 | /// 9 | /// Required designer variable. 10 | /// 11 | private IContainer components = null; 12 | 13 | /// 14 | /// Clean up any resources being used. 15 | /// 16 | /// true if managed resources should be disposed; otherwise, false. 17 | protected override void Dispose(bool disposing) 18 | { 19 | if (disposing && (components != null)) 20 | { 21 | components.Dispose(); 22 | } 23 | base.Dispose(disposing); 24 | } 25 | 26 | #region Windows Form Designer generated code 27 | 28 | /// 29 | /// Required method for Designer support - do not modify 30 | /// the contents of this method with the code editor. 31 | /// 32 | private void InitializeComponent() 33 | { 34 | this.modifierBox = new System.Windows.Forms.ComboBox(); 35 | this.modifierLabel = new System.Windows.Forms.Label(); 36 | this.inputButton = new System.Windows.Forms.Button(); 37 | this.groupBox1 = new System.Windows.Forms.GroupBox(); 38 | this.groupBox1.SuspendLayout(); 39 | this.SuspendLayout(); 40 | // 41 | // modifierBox 42 | // 43 | this.modifierBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 44 | this.modifierBox.Font = new System.Drawing.Font("Calibri", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 45 | this.modifierBox.FormattingEnabled = true; 46 | this.modifierBox.Items.AddRange(new object[] { 47 | "None", 48 | "Shift", 49 | "Alt", 50 | "Ctrl"}); 51 | this.modifierBox.Location = new System.Drawing.Point(12, 38); 52 | this.modifierBox.Name = "modifierBox"; 53 | this.modifierBox.Size = new System.Drawing.Size(225, 23); 54 | this.modifierBox.TabIndex = 1; 55 | this.modifierBox.SelectedIndexChanged += new System.EventHandler(this.modifierBox_SelectedIndexChanged); 56 | // 57 | // modifierLabel 58 | // 59 | this.modifierLabel.AutoSize = true; 60 | this.modifierLabel.Font = new System.Drawing.Font("Calibri", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 61 | this.modifierLabel.Location = new System.Drawing.Point(12, 16); 62 | this.modifierLabel.Name = "modifierLabel"; 63 | this.modifierLabel.Size = new System.Drawing.Size(103, 15); 64 | this.modifierLabel.TabIndex = 2; 65 | this.modifierLabel.Text = "Select a Modifier:"; 66 | // 67 | // inputButton 68 | // 69 | this.inputButton.BackColor = System.Drawing.Color.Transparent; 70 | this.inputButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 71 | this.inputButton.Font = new System.Drawing.Font("Calibri", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 72 | this.inputButton.Location = new System.Drawing.Point(-19, -17); 73 | this.inputButton.Name = "inputButton"; 74 | this.inputButton.Size = new System.Drawing.Size(287, 220); 75 | this.inputButton.TabIndex = 3; 76 | this.inputButton.Text = "Waiting for Input"; 77 | this.inputButton.UseVisualStyleBackColor = false; 78 | this.inputButton.UseWaitCursor = true; 79 | this.inputButton.KeyDown += new System.Windows.Forms.KeyEventHandler(this.inputButton_KeyDown); 80 | this.inputButton.MouseDown += new System.Windows.Forms.MouseEventHandler(this.inputButton_MouseDown); 81 | // 82 | // groupBox1 83 | // 84 | this.groupBox1.BackColor = System.Drawing.Color.Transparent; 85 | this.groupBox1.Controls.Add(this.modifierLabel); 86 | this.groupBox1.Controls.Add(this.modifierBox); 87 | this.groupBox1.Location = new System.Drawing.Point(0, -7); 88 | this.groupBox1.Name = "groupBox1"; 89 | this.groupBox1.Size = new System.Drawing.Size(250, 69); 90 | this.groupBox1.TabIndex = 4; 91 | this.groupBox1.TabStop = false; 92 | // 93 | // inputForm 94 | // 95 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 96 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 97 | this.BackColor = System.Drawing.Color.White; 98 | this.ClientSize = new System.Drawing.Size(249, 145); 99 | this.Controls.Add(this.groupBox1); 100 | this.Controls.Add(this.inputButton); 101 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 102 | this.MinimizeBox = false; 103 | this.Name = "inputForm"; 104 | this.ShowIcon = false; 105 | this.ShowInTaskbar = false; 106 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 107 | this.Text = "Input Prompt"; 108 | this.TopMost = true; 109 | this.groupBox1.ResumeLayout(false); 110 | this.groupBox1.PerformLayout(); 111 | this.ResumeLayout(false); 112 | 113 | } 114 | 115 | #endregion 116 | private Label modifierLabel; 117 | private ComboBox modifierBox; 118 | private Button inputButton; 119 | private GroupBox groupBox1; 120 | } 121 | } -------------------------------------------------------------------------------- /ui/InputForm.cs: -------------------------------------------------------------------------------- 1 | namespace BmLauncherAsylumNET6.ui 2 | { 3 | /// 4 | /// Small class for reading button/mouse input 5 | /// 6 | public partial class inputForm : Form 7 | { 8 | // keys that are banned from being read. Most of them would break UserInput.ini 9 | private readonly string[] _bannedKeys = 10 | { 11 | "OEM8", "LWIN", "RWIN", "OEM7", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D0", "SCROLL", 12 | "OEM1", "OEMTILDE", "OEM7", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", 13 | "NUMLOCK", "Backslash", "BACK", "EQUALS", "MULTIPLY", "DIVIDE", "SUBTRACT", "ADD", "DECIMAL", "PAUSE", 14 | "OEMBACKSLASH", "MENU", "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", 15 | "NUMPAD7", "NUMPAD8", "NUMPAD9", "CLEAR" 16 | }; 17 | 18 | // currently selected button 19 | private readonly Button _currentButton; 20 | 21 | // list of input keys that need to be corrected 22 | private readonly string[] _inputWrong = 23 | { 24 | "OEM5", "OEMOPENBRACKETS", "OEM6", "OEMQUESTION", "OEMMINUS", "OEMPLUS", "OEMCOMMA", "OEMPERIOD", 25 | "CAPITAL", "Left", "Right", "Middle", "SPACE", "LEFT", "RIGHT", "UP", "DOWN", "XButton1", "XButton2", 26 | "SHIFTKEY", "CONTROLKEY" 27 | }; 28 | 29 | // list of corrected keys 30 | private readonly string[] _outputRight = 31 | { 32 | "Backslash", "LeftBracket", "RightBracket", "Slash", "Underscore", "Equals", "Comma", "Period", 33 | "CapsLock", "LeftMouseButton", "RightMouseButton", "MiddleMouseButton", "SpaceBar", "Left", "Right", 34 | "Up", "Down", "ThumbMouseButton", "ThumbMouseButton2", "LeftShift", "LeftAlt" 35 | }; 36 | 37 | // key input as string value 38 | private string _keyPressed; 39 | 40 | /// 41 | /// Constructor for inputForm. 42 | /// 43 | /// current button 44 | public inputForm(Button bt) 45 | { 46 | _currentButton = bt; 47 | InitializeComponent(); 48 | modifierBox.SelectedIndex = 0; 49 | inputButton.MouseWheel += get_mwinput; 50 | inputButton.Focus(); 51 | inputButton.Select(); 52 | inputButton.FlatAppearance.MouseOverBackColor = Color.Transparent; 53 | } 54 | 55 | /// 56 | /// Sets the input of the keybind-buttons. 57 | /// It checks if the keyinput is equivalent to a banned key (first foreach loop), 58 | /// calls three other methods (compareKeys, setModifiers, detectDuplicate) 59 | /// and finally sets the text of the button. 60 | /// 61 | private void setInput() 62 | { 63 | foreach (string line in _bannedKeys) 64 | { 65 | if (_keyPressed.Equals(line)) 66 | { 67 | MessageBox.Show(@"Key not valid", @"Not a valid input!"); 68 | return; 69 | } 70 | } 71 | 72 | _keyPressed = compareKeys(_keyPressed); 73 | _keyPressed = setModifiers(_keyPressed, modifierBox.SelectedIndex); 74 | detectDuplicate(_keyPressed); 75 | foreach (Button bt in Program.MyFactory.Keybinds.ButtonList) 76 | { 77 | if (_currentButton.Name.Equals(bt.Name)) 78 | { 79 | bt.Text = _keyPressed; 80 | bt.ForeColor = Color.Black; 81 | } 82 | } 83 | 84 | Close(); 85 | } 86 | 87 | /// 88 | /// Compares keys to inputWrong list, corrects them with outputRight list. 89 | /// 90 | /// Line to check 91 | /// Corrected string 92 | private string compareKeys(string lineToCheck) 93 | { 94 | for (int i = 0; i < _inputWrong.Length; i++) 95 | { 96 | if (lineToCheck.Equals(_inputWrong[i])) 97 | { 98 | lineToCheck = _outputRight[i]; 99 | Console.WriteLine(lineToCheck); 100 | return lineToCheck; 101 | } 102 | } 103 | 104 | return lineToCheck; 105 | } 106 | 107 | /// 108 | /// Used to detect duplicates. Respects the new input. 109 | /// Old keybind will be set to 'Unbound'. 110 | /// 111 | /// Line to check 112 | private void detectDuplicate(string lineToCheck) 113 | { 114 | foreach (Button bt in Program.MyFactory.Keybinds.ButtonList) 115 | { 116 | if (bt.Text.Equals(lineToCheck)) 117 | { 118 | bt.Text = @"Unbound"; 119 | bt.ForeColor = Color.Red; 120 | } 121 | } 122 | } 123 | 124 | /// 125 | /// Applies modifiers to keys. 126 | /// Very important for GraphicsWriter 127 | /// 128 | /// Line to check 129 | /// case number used for switch 130 | /// string with modifier prefix 131 | private string setModifiers(string lineToCheck, int thisCase) 132 | { 133 | return thisCase switch 134 | { 135 | 0 => lineToCheck, 136 | 1 => "S+" + lineToCheck, 137 | 2 => "A+" + lineToCheck, 138 | 3 => "C+" + lineToCheck, 139 | _ => lineToCheck, 140 | }; 141 | } 142 | 143 | /// 144 | /// After selecting a modifier, the inputbutton that is used to read inputs is highlighted again. 145 | /// 146 | /// 147 | /// 148 | private void modifierBox_SelectedIndexChanged(object sender, EventArgs e) 149 | { 150 | inputButton.Select(); 151 | inputButton.Focus(); 152 | } 153 | 154 | /// 155 | /// Writes keyboard input to string. Pressing 'Esc' closes the form. 156 | /// 157 | /// 158 | /// input 159 | private void inputButton_KeyDown(object sender, KeyEventArgs e) 160 | { 161 | _keyPressed = e.KeyCode.ToString().ToUpper(); 162 | 163 | if (_keyPressed.Contains("ESCAPE")) 164 | { 165 | Close(); 166 | } 167 | else 168 | { 169 | setInput(); 170 | } 171 | } 172 | 173 | /// 174 | /// MouseEvent that specifically reads mouse scroll inputs. 175 | /// 176 | /// 177 | /// 178 | private void get_mwinput(object sender, MouseEventArgs e) 179 | { 180 | _keyPressed = e.Delta > 0 ? "MouseScrollUp" : "MouseScrollDown"; 181 | 182 | setInput(); 183 | } 184 | 185 | /// 186 | /// MouseEvent that specifically reads mouse click inputs. 187 | /// 188 | /// 189 | /// 190 | private void inputButton_MouseDown(object sender, MouseEventArgs e) 191 | { 192 | Console.WriteLine(e); 193 | _keyPressed = e.Button.ToString(); 194 | setInput(); 195 | } 196 | } 197 | } -------------------------------------------------------------------------------- /ui/InputForm.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 | -------------------------------------------------------------------------------- /ui/KeyHelpForm.Designer.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Windows.Forms; 3 | 4 | namespace BmLauncherAsylumNET6.ui 5 | { 6 | partial class KeyHelpForm 7 | { 8 | /// 9 | /// Required designer variable. 10 | /// 11 | private IContainer components = null; 12 | 13 | /// 14 | /// Clean up any resources being used. 15 | /// 16 | /// true if managed resources should be disposed; otherwise, false. 17 | protected override void Dispose(bool disposing) 18 | { 19 | if (disposing && (components != null)) 20 | { 21 | components.Dispose(); 22 | } 23 | base.Dispose(disposing); 24 | } 25 | 26 | #region Windows Form Designer generated code 27 | 28 | /// 29 | /// Required method for Designer support - do not modify 30 | /// the contents of this method with the code editor. 31 | /// 32 | private void InitializeComponent() 33 | { 34 | this.groupBox1 = new System.Windows.Forms.GroupBox(); 35 | this.label3 = new System.Windows.Forms.Label(); 36 | this.label1 = new System.Windows.Forms.Label(); 37 | this.label2 = new System.Windows.Forms.Label(); 38 | this.affixS = new System.Windows.Forms.Label(); 39 | this.groupBox1.SuspendLayout(); 40 | this.SuspendLayout(); 41 | // 42 | // groupBox1 43 | // 44 | this.groupBox1.Controls.Add(this.label3); 45 | this.groupBox1.Controls.Add(this.label1); 46 | this.groupBox1.Controls.Add(this.label2); 47 | this.groupBox1.Controls.Add(this.affixS); 48 | this.groupBox1.Font = new System.Drawing.Font("Calibri", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 49 | this.groupBox1.Location = new System.Drawing.Point(5, 6); 50 | this.groupBox1.Name = "groupBox1"; 51 | this.groupBox1.Size = new System.Drawing.Size(142, 95); 52 | this.groupBox1.TabIndex = 0; 53 | this.groupBox1.TabStop = false; 54 | this.groupBox1.Text = "Keybind Information"; 55 | // 56 | // label3 57 | // 58 | this.label3.AutoSize = true; 59 | this.label3.Location = new System.Drawing.Point(7, 58); 60 | this.label3.Name = "label3"; 61 | this.label3.Size = new System.Drawing.Size(126, 15); 62 | this.label3.TabIndex = 3; 63 | this.label3.Text = "\'A+\' = LeftAlt Modifier"; 64 | // 65 | // label1 66 | // 67 | this.label1.AutoSize = true; 68 | this.label1.Location = new System.Drawing.Point(7, 73); 69 | this.label1.Name = "label1"; 70 | this.label1.Size = new System.Drawing.Size(129, 15); 71 | this.label1.TabIndex = 2; 72 | this.label1.Text = "\'C+\' = Control Modifier"; 73 | // 74 | // label2 75 | // 76 | this.label2.AutoSize = true; 77 | this.label2.Location = new System.Drawing.Point(7, 43); 78 | this.label2.Name = "label2"; 79 | this.label2.Size = new System.Drawing.Size(132, 15); 80 | this.label2.TabIndex = 1; 81 | this.label2.Text = "\'S+\' = LeftShift Modifier"; 82 | // 83 | // affixS 84 | // 85 | this.affixS.AutoSize = true; 86 | this.affixS.Font = new System.Drawing.Font("Calibri", 9.75F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point, ((byte)(0))); 87 | this.affixS.Location = new System.Drawing.Point(7, 20); 88 | this.affixS.Name = "affixS"; 89 | this.affixS.Size = new System.Drawing.Size(55, 15); 90 | this.affixS.TabIndex = 0; 91 | this.affixS.Text = "Prefixes:"; 92 | // 93 | // KeyHelpForm 94 | // 95 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 96 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 97 | this.ClientSize = new System.Drawing.Size(152, 105); 98 | this.Controls.Add(this.groupBox1); 99 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 100 | this.MaximizeBox = false; 101 | this.MinimizeBox = false; 102 | this.Name = "KeyHelpForm"; 103 | this.ShowIcon = false; 104 | this.ShowInTaskbar = false; 105 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 106 | this.Text = "Help"; 107 | this.TopMost = true; 108 | this.groupBox1.ResumeLayout(false); 109 | this.groupBox1.PerformLayout(); 110 | this.ResumeLayout(false); 111 | 112 | } 113 | 114 | #endregion 115 | 116 | private GroupBox groupBox1; 117 | private Label label3; 118 | private Label label1; 119 | private Label label2; 120 | private Label affixS; 121 | } 122 | } -------------------------------------------------------------------------------- /ui/KeyHelpForm.cs: -------------------------------------------------------------------------------- 1 | namespace BmLauncherAsylumNET6.ui 2 | { 3 | public partial class KeyHelpForm : Form 4 | { 5 | public KeyHelpForm() 6 | { 7 | InitializeComponent(); 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /ui/KeyHelpForm.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 | -------------------------------------------------------------------------------- /ui/KeybindForm.cs: -------------------------------------------------------------------------------- 1 | using BmLauncherAsylumNET6.data; 2 | using BmLauncherAsylumNET6.infrastructure; 3 | 4 | namespace BmLauncherAsylumNET6.ui 5 | { 6 | /** 7 | * Keybind editor class that uses buttons as inputreaders. 8 | */ 9 | public partial class KeybindForm : Form 10 | { 11 | public List