dsda: pass commandline args to core from hawk
that way we don't have to rebuild the core for every commandline option that it already supports and we decide to use, also more meaningful presentation of those options on the managed side
This commit is contained in:
parent
8c351433d5
commit
f47136be46
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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<string>
|
||||
{
|
||||
"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<string> _args;
|
||||
|
||||
// IRegionable
|
||||
public DisplayType Region { get; }
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue