diff --git a/.global.editorconfig.ini b/.global.editorconfig.ini index c10d5cdcd1b..d8ad54eacfa 100644 --- a/.global.editorconfig.ini +++ b/.global.editorconfig.ini @@ -18,7 +18,7 @@ dotnet_diagnostic.BHI1005.severity = error # Do not discard local variables dotnet_diagnostic.BHI1006.severity = error # Don't use target-typed new for throw expressions -dotnet_diagnostic.BHI1007.severity = suggestion +dotnet_diagnostic.BHI1007.severity = error # Don't call this.GetType() in sealed type, use typeof operator dotnet_diagnostic.BHI1100.severity = error # Don't call this.GetType(), use typeof operator (or replace subtype check with better encapsulation) diff --git a/src/BizHawk.Bizware.Audio/SDL2WavStream.cs b/src/BizHawk.Bizware.Audio/SDL2WavStream.cs index 859f0bf78d6..9b4da0ddc80 100644 --- a/src/BizHawk.Bizware.Audio/SDL2WavStream.cs +++ b/src/BizHawk.Bizware.Audio/SDL2WavStream.cs @@ -7,6 +7,8 @@ using static SDL2.SDL; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Bizware.Audio { internal sealed class SDL2WavStream : Stream, ISpanStream diff --git a/src/BizHawk.Bizware.Graphics/OpenGL/IGL_OpenGL.cs b/src/BizHawk.Bizware.Graphics/OpenGL/IGL_OpenGL.cs index cff3942fed0..85c18dccd58 100644 --- a/src/BizHawk.Bizware.Graphics/OpenGL/IGL_OpenGL.cs +++ b/src/BizHawk.Bizware.Graphics/OpenGL/IGL_OpenGL.cs @@ -3,6 +3,8 @@ using Silk.NET.OpenGL; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Bizware.Graphics { /// diff --git a/src/BizHawk.Bizware.Graphics/OpenGL/SDL2OpenGLContext.cs b/src/BizHawk.Bizware.Graphics/OpenGL/SDL2OpenGLContext.cs index fe29fe39241..e0abab56c1d 100644 --- a/src/BizHawk.Bizware.Graphics/OpenGL/SDL2OpenGLContext.cs +++ b/src/BizHawk.Bizware.Graphics/OpenGL/SDL2OpenGLContext.cs @@ -1,5 +1,7 @@ // #define DEBUG_OPENGL +using System.IO; + #if DEBUG_OPENGL using System.Runtime.InteropServices; using Silk.NET.OpenGL; @@ -9,6 +11,8 @@ using static SDL2.SDL; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Bizware.Graphics { /// @@ -27,7 +31,7 @@ static SDL2OpenGLContext() // try to use EGL if it is available // GLX is the old API, and is the more or less "deprecated" at this point, and potentially more buggy with some drivers // we do need to a bit more work, in case EGL is not actually available or potentially doesn't have desktop GL support - SDL_SetHint(SDL_HINT_VIDEO_X11_FORCE_EGL, "1"); + if (!Directory.Exists("/nix")/* this is just for me --yoshi */) SDL_SetHint(SDL_HINT_VIDEO_X11_FORCE_EGL, "1"); } // init SDL video diff --git a/src/BizHawk.Bizware.Graphics/Renderers/SDLImGui2DRenderer.cs b/src/BizHawk.Bizware.Graphics/Renderers/SDLImGui2DRenderer.cs index cc91ed98830..1c80caff581 100644 --- a/src/BizHawk.Bizware.Graphics/Renderers/SDLImGui2DRenderer.cs +++ b/src/BizHawk.Bizware.Graphics/Renderers/SDLImGui2DRenderer.cs @@ -7,6 +7,8 @@ using static SDL2.SDL; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Bizware.Graphics { /// diff --git a/src/BizHawk.Bizware.Input/KeyInput/X11KeyInput.cs b/src/BizHawk.Bizware.Input/KeyInput/X11KeyInput.cs index f744bfdc1de..a57f33f1e96 100644 --- a/src/BizHawk.Bizware.Input/KeyInput/X11KeyInput.cs +++ b/src/BizHawk.Bizware.Input/KeyInput/X11KeyInput.cs @@ -31,7 +31,10 @@ public X11KeyInput() if (Display == IntPtr.Zero) { - throw new("Could not open XDisplay"); + // There doesn't seem to be a convention for what exception type to throw in these situations. Can't use NRE. Well... +// _ = Unsafe.AsRef()!; // hmm + // InvalidOperationException doesn't match. Exception it is. --yoshi + throw new Exception("Could not open XDisplay"); } using (new XLock(Display)) diff --git a/src/BizHawk.Bizware.Input/SDL2/SDL2InputAdapter.cs b/src/BizHawk.Bizware.Input/SDL2/SDL2InputAdapter.cs index 297a735bc0f..d9a3d1415c1 100644 --- a/src/BizHawk.Bizware.Input/SDL2/SDL2InputAdapter.cs +++ b/src/BizHawk.Bizware.Input/SDL2/SDL2InputAdapter.cs @@ -9,6 +9,8 @@ using static SDL2.SDL; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Bizware.Input { public sealed class SDL2InputAdapter : OSTailoredKeyInputAdapter diff --git a/src/BizHawk.Client.Common/XmlGame.cs b/src/BizHawk.Client.Common/XmlGame.cs index 19ffd70af3d..2d12f9d89c8 100644 --- a/src/BizHawk.Client.Common/XmlGame.cs +++ b/src/BizHawk.Client.Common/XmlGame.cs @@ -66,7 +66,7 @@ public static XmlGame Create(HawkFile f) } else { - throw new($"Couldn't load XMLGame Asset \"{filename}\""); + throw new Exception($"Couldn't load XMLGame Asset \"{filename}\""); } } else @@ -96,7 +96,7 @@ public static XmlGame Create(HawkFile f) } catch (Exception e) { - throw new($"Couldn't load XMLGame LoadAsset \"{filename}\"", e); + throw new Exception($"Couldn't load XMLGame LoadAsset \"{filename}\"", e); } } diff --git a/src/BizHawk.Client.Common/movie/MovieSession.cs b/src/BizHawk.Client.Common/movie/MovieSession.cs index 0952715005d..14acc37cc64 100644 --- a/src/BizHawk.Client.Common/movie/MovieSession.cs +++ b/src/BizHawk.Client.Common/movie/MovieSession.cs @@ -81,32 +81,30 @@ public void HandleFrameBefore() else if (Movie.IsPlaying()) { LatchInputToLog(); - - if (Movie.IsRecording()) // The movie end situation can cause the switch to record mode, in that case we need to capture some input for this frame + // if we're at the movie's end and the MovieEndAction is record, just continue recording in play mode + // TODO change to TAStudio check + if (Movie is ITasMovie && Movie.Emulator.Frame == Movie.FrameCount && Settings.MovieEndAction == MovieEndAction.Record) { - HandleFrameLoopForRecordMode(); + Movie.RecordFrame(Movie.Emulator.Frame, MovieOut.Source); } } else if (Movie.IsRecording()) { - HandleFrameLoopForRecordMode(); + LatchInputToUser(); + Movie.RecordFrame(Movie.Emulator.Frame, MovieOut.Source); } } - // TODO: this is a mess, simplify public void HandleFrameAfter() { if (Movie is ITasMovie tasMovie) { tasMovie.GreenzoneCurrentFrame(); - if (tasMovie.IsPlayingOrFinished() && Settings.MovieEndAction == MovieEndAction.Record && Movie.Emulator.Frame >= tasMovie.InputLogLength) - { - HandleFrameLoopForRecordMode(); - return; - } + // TODO change to TAStudio check + if (Settings.MovieEndAction == MovieEndAction.Record) return; } - if (Movie.IsPlaying() && Movie.Emulator.Frame >= Movie.InputLogLength) + if (Movie.IsPlaying() && Movie.Emulator.Frame >= Movie.FrameCount) { HandlePlaybackEnd(); } @@ -329,13 +327,8 @@ private void LatchInputToUser() private void LatchInputToLog() { var input = Movie.GetInputState(Movie.Emulator.Frame); - if (input == null) - { - HandleFrameAfter(); - return; - } - MovieController.SetFrom(input); + MovieController.SetFrom(input ?? GenerateMovieController()); MovieOut.Source = MovieController; } @@ -414,20 +407,5 @@ private void HandlePlaybackEnd() _modeChangedCallback(); } - - private void HandleFrameLoopForRecordMode() - { - // we don't want TasMovie to latch user input outside its internal recording mode, so limit it to autohold - if (Movie is ITasMovie && Movie.IsPlayingOrFinished()) - { - MovieController.SetFromSticky(StickySource); - } - else - { - MovieController.SetFrom(MovieIn); - } - - Movie.RecordFrame(Movie.Emulator.Frame, MovieController); - } } } diff --git a/src/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs b/src/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs index 24a84bf05fa..57605734cac 100644 --- a/src/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs +++ b/src/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs @@ -168,7 +168,7 @@ public void AddFrame(IVideoProvider source) { if (!_workerT.IsAlive) { - throw new("AVI Worker thread died!"); + throw new Exception("AVI Worker thread died!"); } } } @@ -194,7 +194,7 @@ public void AddSamples(short[] samples) { if (!_workerT.IsAlive) { - throw new("AVI Worker thread died!"); + throw new Exception("AVI Worker thread died!"); } } } @@ -977,7 +977,7 @@ public unsafe void AddFrame(IVideoProvider source) public void SetDefaultVideoCodecToken(Config config) { var ct = CodecToken.DeSerialize(config.AviCodecToken); - _currVideoCodecToken = ct ?? throw new($"No default {nameof(config.AviCodecToken)} in config!"); + _currVideoCodecToken = ct ?? throw new Exception($"No default {nameof(config.AviCodecToken)} in config!"); } public string DesiredExtension() diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs index 72d03b4a90a..d1015530ddc 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs @@ -11,6 +11,8 @@ using BizHawk.Emulation.Cores.Arcades.MAME; using BizHawk.Emulation.DiscSystem; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Client.EmuHawk { public partial class RCheevos diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs index f2801c30d81..cf9c59ee6d2 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs @@ -10,6 +10,8 @@ using BizHawk.Client.Common; using BizHawk.Emulation.Common; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Client.EmuHawk { public partial class RCheevos : RetroAchievements diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs index 7155fb10b4f..b79dfc2fe38 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs @@ -13,6 +13,8 @@ using BizHawk.Emulation.Common; using BizHawk.Emulation.DiscSystem; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Client.EmuHawk { public abstract partial class RetroAchievements diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs index 0490799b8f8..8e0cb222390 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs @@ -191,7 +191,7 @@ public void Restart( lib.APIs = _apiContainer; if (!ServiceInjector.UpdateServices(newServiceProvider, lib, mayCache: true)) { - throw new("Lua lib has required service(s) that can't be fulfilled"); + throw new Exception("Lua lib has required service(s) that can't be fulfilled"); } lib.Restarted(); diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs index 5c5779e58c1..d34495f0796 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs @@ -378,6 +378,7 @@ private void SelectBetweenMarkersMenuItem_Click(object sender, EventArgs e) int prev = prevMarker?.Frame ?? 0; int next = nextMarker?.Frame ?? CurrentTasMovie.InputLogLength; + TasView.DeselectAll(); for (int i = prev; i < next; i++) { TasView.SelectRow(i, true); diff --git a/src/BizHawk.Common/Extensions/PathExtensions.cs b/src/BizHawk.Common/Extensions/PathExtensions.cs index c013fdc592b..0a34231f68d 100644 --- a/src/BizHawk.Common/Extensions/PathExtensions.cs +++ b/src/BizHawk.Common/Extensions/PathExtensions.cs @@ -219,7 +219,9 @@ static PathUtils() else { var dirPath = AppContext.BaseDirectory; - DataDirectoryPath = ExeDirectoryPath = string.IsNullOrEmpty(dirPath) ? throw new("failed to get location of executable, very bad things must have happened") : dirPath.RemoveSuffix('\\'); + DataDirectoryPath = ExeDirectoryPath = string.IsNullOrEmpty(dirPath) + ? throw new Exception("failed to get location of executable, very bad things must have happened") + : dirPath.RemoveSuffix('\\'); DllDirectoryPath = Path.Combine(ExeDirectoryPath, "dll"); } } diff --git a/src/BizHawk.Common/OSTailoredCode.cs b/src/BizHawk.Common/OSTailoredCode.cs index ebb6c7cd23b..dc855a7f59a 100644 --- a/src/BizHawk.Common/OSTailoredCode.cs +++ b/src/BizHawk.Common/OSTailoredCode.cs @@ -279,7 +279,7 @@ public static string SimpleSubshell(string cmd, string args, string noOutputMsg) using var proc = ConstructSubshell(cmd, args); proc.Start(); var stdout = proc.StandardOutput; - if (stdout.EndOfStream) throw new($"{noOutputMsg} ({cmd} wrote nothing to stdout)"); + if (stdout.EndOfStream) throw new Exception($"{noOutputMsg} ({cmd} wrote nothing to stdout)"); return stdout.ReadLine()!; } } diff --git a/src/BizHawk.Emulation.Common/Sound/SDLResampler.cs b/src/BizHawk.Emulation.Common/Sound/SDLResampler.cs index b4fa081419e..8f2945a3b1f 100644 --- a/src/BizHawk.Emulation.Common/Sound/SDLResampler.cs +++ b/src/BizHawk.Emulation.Common/Sound/SDLResampler.cs @@ -4,6 +4,8 @@ using static SDL2.SDL; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Emulation.Common { /// diff --git a/src/BizHawk.Emulation.Cores/Arcades/MAME/MAME.cs b/src/BizHawk.Emulation.Cores/Arcades/MAME/MAME.cs index 6c0f486bcef..c5fba2de3d1 100644 --- a/src/BizHawk.Emulation.Cores/Arcades/MAME/MAME.cs +++ b/src/BizHawk.Emulation.Cores/Arcades/MAME/MAME.cs @@ -88,7 +88,7 @@ public MAME(CoreLoadParameters lp) if (_loadFailure != string.Empty) { Dispose(); - throw new("\n\n" + _loadFailure); + throw new Exception("\n\n" + _loadFailure); } // concat all SHA1 hashes together (unprefixed), then hash that diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/3DS/Encore.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/3DS/Encore.cs index 9d1d318f8cf..6ba13534b71 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/3DS/Encore.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/3DS/Encore.cs @@ -8,6 +8,8 @@ using BizHawk.Common; using BizHawk.Emulation.Common; +#pragma warning disable BHI1007 // target-typed Exception TODO don't + namespace BizHawk.Emulation.Cores.Consoles.Nintendo.N3DS { [PortedCore(CoreNames.Encore, "", "nightly-2104", "https://github.com/CasualPokePlayer/encore", singleInstance: true)] diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.cs index 414d896fdde..8dcc3d0b319 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.cs @@ -385,7 +385,7 @@ private static byte[] DecideNAND(ICoreFileProvider cfp, bool isDSiEnhanced, byte private static byte[] GetTMDData(ulong titleId) { using var zip = new ZipArchive(Zstd.DecompressZstdStream(new MemoryStream(Resources.TMDS.Value)), ZipArchiveMode.Read, false); - using var tmd = zip.GetEntry($"{titleId:x16}.tmd")?.Open() ?? throw new($"Cannot find TMD for title ID {titleId:x16}, please report"); + using var tmd = zip.GetEntry($"{titleId:x16}.tmd")?.Open() ?? throw new Exception($"Cannot find TMD for title ID {titleId:x16}, please report"); return tmd.ReadAllBytes(); } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs b/src/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs index 40f6390b11c..96ee1387561 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs @@ -91,7 +91,7 @@ public GPGX(CoreLoadParameters lp) { if (lp.Discs.Count > 128) { - throw new("Too many discs loaded at once!"); + throw new ArgumentException(paramName: nameof(lp), message: "Too many discs loaded at once!"); } _cds = lp.Discs.Select(d => d.DiscData).ToArray();