diff --git a/Assets/dll/dsda.wbx.zst b/Assets/dll/dsda.wbx.zst index 86e25ebf0e..5e43179c13 100644 Binary files a/Assets/dll/dsda.wbx.zst and b/Assets/dll/dsda.wbx.zst differ diff --git a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.ISettable.cs b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.ISettable.cs index 7a36ec0b7b..848e2b894e 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.ISettable.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.ISettable.cs @@ -279,21 +279,10 @@ namespace BizHawk.Emulation.Cores.Computers.Doom _Player2Present = Player2Present ? 1 : 0, _Player3Present = Player3Present ? 1 : 0, _Player4Present = Player4Present ? 1 : 0, - _CompatibilityMode = (int)CompatibilityMode, - _SkillLevel = (int) SkillLevel, - _MultiplayerMode = (int) MultiplayerMode, - _InitialEpisode = InitialEpisode, - _InitialMap = InitialMap, - _Turbo = Turbo, - _FastMonsters = FastMonsters ? 1 : 0, - _MonstersRespawn = MonstersRespawn ? 1 : 0, - _NoMonsters = NoMonsters ? 1 : 0, _Player1Class = (int) Player1Class, _Player2Class = (int) Player2Class, _Player3Class = (int) Player3Class, _Player4Class = (int) Player4Class, - _ChainEpisodes = ChainEpisodes ? 1 : 0, - _StrictMode = StrictMode ? 1 : 0, _PreventLevelExit = PreventLevelExit ? 1 : 0, _PreventGameEnd = PreventGameEnd ? 1 : 0 // MouseRunSensitivity is handled at Bizhawk level diff --git a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.cs b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.cs index 332b6562a3..9aece06177 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.cs @@ -100,7 +100,30 @@ namespace BizHawk.Emulation.Cores.Computers.Doom } var initSettings = _syncSettings.GetNativeSettings(lp.Game); - var initResult = Core.dsda_init(ref initSettings); + + _args = new List + { + "dsda", + }; + + _args.AddRange(["-skill", $"{(int)_syncSettings.SkillLevel}"]); + _args.AddRange(["-warp", $"{(int)_syncSettings.InitialEpisode}", $"{(int)_syncSettings.InitialMap}"]); + _args.AddRange(["-complevel", $"{(int)_syncSettings.CompatibilityMode}"]); + + ConditionalArg(!_syncSettings.StrictMode, "-tas"); + ConditionalArg(_syncSettings.MonstersRespawn, "-respawn"); + ConditionalArg(_syncSettings.NoMonsters, "-nomonsters"); + ConditionalArg(_syncSettings.ChainEpisodes, "-chain_episodes"); + ConditionalArg(_syncSettings.MultiplayerMode == MultiplayerMode.M1, "-deathmatch"); + ConditionalArg(_syncSettings.MultiplayerMode == MultiplayerMode.M2, "-altdeath"); + ConditionalArg(_syncSettings.Turbo > 0, $"-turbo {_syncSettings.Turbo}"); + ConditionalArg((initSettings._Player1Present + initSettings._Player2Present + initSettings._Player3Present + initSettings._Player4Present) > 1, "-solo-net"); + + Console.WriteLine(); + Console.WriteLine(string.Join(" ", _args)); + Console.WriteLine(); + + var initResult = Core.dsda_init(ref initSettings, _args.Count, _args.ToArray()); if (!initResult) throw new Exception($"{nameof(Core.dsda_init)}() failed"); int fps = 35; @@ -125,6 +148,14 @@ namespace BizHawk.Emulation.Cores.Computers.Doom } } + private void ConditionalArg(bool condition, string setting) + { + if (condition) + { + _args.Add(setting); + } + } + // Remembering mouse position private const int MOUSE_NO_INPUT = -65535; private int _player1LastMouseRunningValue = MOUSE_NO_INPUT; @@ -135,6 +166,7 @@ namespace BizHawk.Emulation.Cores.Computers.Doom private int _player3LastMouseTurningValue = MOUSE_NO_INPUT; private int _player4LastMouseRunningValue = MOUSE_NO_INPUT; private int _player4LastMouseTurningValue = MOUSE_NO_INPUT; + private List _args; // IRegionable public DisplayType Region { get; } diff --git a/src/BizHawk.Emulation.Cores/Computers/Doom/LibDSDA.cs b/src/BizHawk.Emulation.Cores/Computers/Doom/LibDSDA.cs index 8e38d08ec4..04f58a50ef 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Doom/LibDSDA.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Doom/LibDSDA.cs @@ -23,21 +23,10 @@ namespace BizHawk.Emulation.Cores.Computers.Doom public int _Player2Present; public int _Player3Present; public int _Player4Present; - public int _CompatibilityMode; - public int _SkillLevel; - public int _MultiplayerMode; - public int _InitialEpisode; - public int _InitialMap; - public int _Turbo; - public int _FastMonsters; - public int _MonstersRespawn; - public int _NoMonsters; public int _Player1Class; public int _Player2Class; public int _Player3Class; public int _Player4Class; - public int _ChainEpisodes; - public int _StrictMode; public int _PreventLevelExit; public int _PreventGameEnd; } @@ -73,8 +62,8 @@ namespace BizHawk.Emulation.Cores.Computers.Doom [BizImport(CallingConvention.Cdecl)] public abstract void dsda_get_audio(ref int n, ref IntPtr buffer); - [BizImport(CallingConvention.Cdecl)] - public abstract bool dsda_init(ref InitSettings settings); + [BizImport(CallingConvention.Cdecl, Compatibility = true)] + public abstract bool dsda_init(ref InitSettings settings, int argc, string[] argv); [BizImport(CallingConvention.Cdecl)] public abstract void dsda_frame_advance( diff --git a/waterbox/dsda/BizhawkInterface.cxx b/waterbox/dsda/BizhawkInterface.cxx index 7a1196c4a5..47ca189633 100644 --- a/waterbox/dsda/BizhawkInterface.cxx +++ b/waterbox/dsda/BizhawkInterface.cxx @@ -140,77 +140,8 @@ ECL_EXPORT void dsda_set_input_callback(ECL_ENTRY void (*fecb)(void)) bool foundIWAD = false; -ECL_EXPORT int dsda_init(struct InitSettings *settings) +ECL_EXPORT int dsda_init(InitSettings *settings, int argc, char **argv) { - // Creating arguments - int argc = 0; - char** argv = (char**) alloc_invisible (sizeof(char*) * 512); - - bool _noMonsters = false; - bool _monstersRespawn = false; - - // Specifying executable name - char arg0[] = "dsda"; - argv[argc++] = arg0; - - // Eliminating restrictions to TAS inputs - if (settings->_StrictMode == 0) - { - char arg2[] = "-tas"; - argv[argc++] = arg2; - } - - // Specifying skill level - char arg3[] = "-skill"; - argv[argc++] = arg3; - char argSkill[512]; - sprintf(argSkill, "%d", settings->_SkillLevel); - argv[argc++] = argSkill; - - // Specifying episode and map - char arg4[] = "-warp"; - argv[argc++] = arg4; - char argEpisode[512]; - { - sprintf(argEpisode, "%d", settings->_InitialEpisode); - argv[argc++] = argEpisode; - } - char argMap[512]; - sprintf(argMap, "%d", settings->_InitialMap); - argv[argc++] = argMap; - - // Specifying comp level - char arg5[] = "-complevel"; - argv[argc++] = arg5; - char argCompatibilityLevel[512]; - sprintf(argCompatibilityLevel, "%d", settings->_CompatibilityMode); - argv[argc++] = argCompatibilityLevel; - - // Specifying fast monsters - char arg6[] = "-fast"; - if (settings->_FastMonsters == 1) argv[argc++] = arg6; - - // Specifying monsters respawn - char arg7[] = "-respawn"; - if (settings->_MonstersRespawn == 1) argv[argc++] = arg7; - - // Specifying no monsters - char arg8[] = "-nomonsters"; - if (settings->_NoMonsters == 1) argv[argc++] = arg8; - - char arg9[] = "-chain_episodes"; - if (settings->_ChainEpisodes == 1) argv[argc++] = arg9; - - // Specifying Turbo - char arg10[] = "-turbo"; - char argTurbo[512]; - if (settings->_Turbo >= 0) - { - sprintf(argTurbo, "%d", settings->_Turbo); - argv[argc++] = arg10; - argv[argc++] = argTurbo; - } - printf("Passing arguments: \n"); for (int i = 0; i < argc; i++) printf("%s ", argv[i]); printf("\n"); @@ -221,17 +152,6 @@ ECL_EXPORT int dsda_init(struct InitSettings *settings) playeringame[2] = settings->_Player3Present; playeringame[3] = settings->_Player4Present; - // Getting player count - auto playerCount = settings->_Player1Present + settings->_Player2Present + settings->_Player3Present + settings->_Player4Present; - char arg12[] = "-solo-net"; - if (playerCount > 1) argv[argc++] = arg12; - - // Set multiplayer mode - char arg13[] = "-deathmatch"; - if (settings->_MultiplayerMode == 1) argv[argc++] = arg13; - char arg14[] = "-altdeath"; - if (settings->_MultiplayerMode == 2) argv[argc++] = arg14; - // Handle class PlayerClass[0] = (pclass_t)settings->_Player1Class; PlayerClass[1] = (pclass_t)settings->_Player2Class; @@ -247,7 +167,7 @@ ECL_EXPORT int dsda_init(struct InitSettings *settings) I_InitSound(); printf("Audio Initialized\n"); - // If, required prevent level exit and game end triggers + // If required, prevent level exit and game end triggers preventLevelExit = settings->_PreventLevelExit; preventGameEnd = settings->_PreventGameEnd; diff --git a/waterbox/dsda/BizhawkInterface.hxx b/waterbox/dsda/BizhawkInterface.hxx index 3a4dea2259..d58afa0d75 100644 --- a/waterbox/dsda/BizhawkInterface.hxx +++ b/waterbox/dsda/BizhawkInterface.hxx @@ -75,21 +75,10 @@ struct InitSettings int _Player2Present; int _Player3Present; int _Player4Present; - int _CompatibilityMode; - int _SkillLevel; - int _MultiplayerMode; - int _InitialEpisode; - int _InitialMap; - int _Turbo; - int _FastMonsters; - int _MonstersRespawn; - int _NoMonsters; int _Player1Class; int _Player2Class; int _Player3Class; int _Player4Class; - int _ChainEpisodes; - int _StrictMode; int _PreventLevelExit; int _PreventGameEnd; } __attribute__((packed));