diff --git a/Assets/dll/dsda.wbx.zst b/Assets/dll/dsda.wbx.zst index a64c781b8d..8530c39613 100644 Binary files a/Assets/dll/dsda.wbx.zst and b/Assets/dll/dsda.wbx.zst differ diff --git a/src/BizHawk.Emulation.Common/Base Implementations/Bk2MnemonicLookup.cs b/src/BizHawk.Emulation.Common/Base Implementations/Bk2MnemonicLookup.cs index 35c47382f5..36656aea36 100644 --- a/src/BizHawk.Emulation.Common/Base Implementations/Bk2MnemonicLookup.cs +++ b/src/BizHawk.Emulation.Common/Base Implementations/Bk2MnemonicLookup.cs @@ -820,8 +820,20 @@ namespace BizHawk.Emulation.Common }, [VSystemID.Raw.Doom] = new() { - ["Automap"] = 'A', + ["Automap Toggle"] = 'a', + ["Automap +"] = '+', + ["Automap -"] = '-', + ["Automap Full/Zoom"] = 'z', + ["Automap Follow"] = 'f', + ["Automap Up"] = 'u', + ["Automap Down"] = 'd', + ["Automap Right"] = 'r', + ["Automap Left"] = 'l', + ["Automap Grid"] = 'g', + ["Automap Mark"] = 'm', + ["Automap Clear Marks"] = 'c', ["Backward"] = 'v', + ["Change Gamma"] = 'G', ["End Player"] = 'E', ["Fire"] = 'F', ["Forward"] = '^', @@ -829,8 +841,8 @@ namespace BizHawk.Emulation.Common ["Run"] = 'R', ["Strafe Left"] = '<', ["Strafe Right"] = '>', - ["Turn Left"] = 'l', - ["Turn Right"] = 'r', + ["Turn Left"] = '{', + ["Turn Right"] = '}', ["Use"] = 'U', ["Weapon Select 1"] = '1', ["Weapon Select 2"] = '2', diff --git a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.ControllerDeck.cs b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.ControllerDeck.cs index e8b90202a5..521ad1c088 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.ControllerDeck.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.ControllerDeck.cs @@ -35,10 +35,10 @@ namespace BizHawk.Emulation.Cores.Computers.Doom private readonly IPort _port4; private static IReadOnlyDictionary> _controllerCtors; public ControllerDefinition Definition { get; } - public byte ReadButtons1(IController c) => _port1.ReadButtons(c); - public byte ReadButtons2(IController c) => _port2.ReadButtons(c); - public byte ReadButtons3(IController c) => _port3.ReadButtons(c); - public byte ReadButtons4(IController c) => _port4.ReadButtons(c); + public int ReadButtons1(IController c) => _port1.ReadButtons(c); + public int ReadButtons2(IController c) => _port2.ReadButtons(c); + public int ReadButtons3(IController c) => _port3.ReadButtons(c); + public int ReadButtons4(IController c) => _port4.ReadButtons(c); public int ReadAxis1(IController c, int axis) => _port1.ReadAxis(c, axis); public int ReadAxis2(IController c, int axis) => _port2.ReadAxis(c, axis); public int ReadAxis3(IController c, int axis) => _port3.ReadAxis(c, axis); diff --git a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.IEmulator.cs b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.IEmulator.cs index 1a03ca3edf..1e0071e9a7 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.IEmulator.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDA.IEmulator.cs @@ -12,7 +12,7 @@ namespace BizHawk.Emulation.Cores.Computers.Doom public string SystemId => VSystemID.Raw.Doom; public bool DeterministicEmulation => true; private delegate int ReadAxis(IController c, int axis); - private delegate byte ReadPort(IController c); + private delegate int ReadPort(IController c); public bool FrameAdvance(IController controller, bool renderVideo, bool renderAudio) { @@ -100,9 +100,7 @@ namespace BizHawk.Emulation.Cores.Computers.Doom // bool buttons var actionsBitfield = buttonsReaders[i](controller); - players[i].Fire = actionsBitfield & 0b00001; - players[i].Action = (actionsBitfield & 0b00010) >> 1; - players[i].Automap = (actionsBitfield & 0b00100) >> 2; + players[i].Buttons = actionsBitfield; // Raven Games if (_syncSettings.InputFormat is DoomControllerTypes.Heretic or DoomControllerTypes.Hexen) diff --git a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDAControllers.cs b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDAControllers.cs index 16818a6734..5dad652505 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Doom/DSDAControllers.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Doom/DSDAControllers.cs @@ -27,7 +27,7 @@ namespace BizHawk.Emulation.Cores.Computers.Doom public interface IPort { - byte ReadButtons(IController c); + int ReadButtons(IController c); int ReadAxis(IController c, int axis); ControllerDefinition Definition { get; } int PortNum { get; } @@ -69,6 +69,7 @@ namespace BizHawk.Emulation.Cores.Computers.Doom "Strafe Right", "Run", "Strafe", + "Change Gamma", "Weapon Select 1", "Weapon Select 2", "Weapon Select 3", @@ -90,13 +91,25 @@ namespace BizHawk.Emulation.Cores.Computers.Doom "Automap Clear Marks", ]; - public byte ReadButtons(IController c) + public int ReadButtons(IController c) { - byte result = 0; + int result = 0; - if (c.IsPressed($"P{PortNum} Fire")) { result |= 0b0001; } - if (c.IsPressed($"P{PortNum} Use")) { result |= 0b0010; } - if (c.IsPressed($"P{PortNum} Automap")) { result |= 0b0100; } + if (c.IsPressed($"P{PortNum} Fire")) result |= (1 << 0); + if (c.IsPressed($"P{PortNum} Use")) result |= (1 << 1); + if (c.IsPressed($"P{PortNum} Change Gamma")) result |= (1 << 2); + if (c.IsPressed($"P{PortNum} Automap Toggle")) result |= (1 << 3); + if (c.IsPressed($"P{PortNum} Automap +")) result |= (1 << 4); + if (c.IsPressed($"P{PortNum} Automap -")) result |= (1 << 5); + if (c.IsPressed($"P{PortNum} Automap Full/Zoom")) result |= (1 << 6); + if (c.IsPressed($"P{PortNum} Automap Follow")) result |= (1 << 7); + if (c.IsPressed($"P{PortNum} Automap Up")) result |= (1 << 8); + if (c.IsPressed($"P{PortNum} Automap Down")) result |= (1 << 9); + if (c.IsPressed($"P{PortNum} Automap Right")) result |= (1 << 10); + if (c.IsPressed($"P{PortNum} Automap Left")) result |= (1 << 11); + if (c.IsPressed($"P{PortNum} Automap Grid")) result |= (1 << 12); + if (c.IsPressed($"P{PortNum} Automap Mark")) result |= (1 << 13); + if (c.IsPressed($"P{PortNum} Automap Clear Marks")) result |= (1 << 14); return result; } @@ -165,9 +178,9 @@ namespace BizHawk.Emulation.Cores.Computers.Doom "Weapon Select 7", ]; - public byte ReadButtons(IController c) + public int ReadButtons(IController c) { - byte result = 0; + int result = 0; if (c.IsPressed($"P{PortNum} Fire")) { result |= 0b0001; } if (c.IsPressed($"P{PortNum} Use")) { result |= 0b0010; } @@ -281,9 +294,9 @@ namespace BizHawk.Emulation.Cores.Computers.Doom "Weapon Select 4" ]; - public byte ReadButtons(IController c) + public int ReadButtons(IController c) { - byte result = 0; + int result = 0; if (c.IsPressed($"P{PortNum} Fire")) { result |= 0b00001; } if (c.IsPressed($"P{PortNum} Use")) { result |= 0b00010; } diff --git a/src/BizHawk.Emulation.Cores/Computers/Doom/LibDSDA.cs b/src/BizHawk.Emulation.Cores/Computers/Doom/LibDSDA.cs index 69880695ac..1b9bed0047 100644 --- a/src/BizHawk.Emulation.Cores/Computers/Doom/LibDSDA.cs +++ b/src/BizHawk.Emulation.Cores/Computers/Doom/LibDSDA.cs @@ -45,9 +45,7 @@ namespace BizHawk.Emulation.Cores.Computers.Doom public int StrafingSpeed; public int TurningSpeed; public int WeaponSelect; - public int Fire; - public int Action; - public int Automap; + public int Buttons; // Hexen + Heretic (Raven Games) public int FlyLook; diff --git a/waterbox/dsda/.vscode/settings.json b/waterbox/dsda/.vscode/settings.json new file mode 100644 index 0000000000..d55f33b231 --- /dev/null +++ b/waterbox/dsda/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "editor.tabSize": 2, + "files.associations": { + "f_wipe.h": "c", + "bizhawkinterface.h": "c", + "emulibc.h": "c", + "d_main.h": "c", + "m_fixed.h": "c", + "d_event.h": "c", + "doomtype.h": "c", + "g_game.h": "c", + "d_player.h": "c" + } +} \ No newline at end of file diff --git a/waterbox/dsda/BizhawkInterface.c b/waterbox/dsda/BizhawkInterface.c index b1ac6c4df4..e91964553c 100644 --- a/waterbox/dsda/BizhawkInterface.c +++ b/waterbox/dsda/BizhawkInterface.c @@ -2,7 +2,91 @@ bool foundIWAD = false; bool wipeDone = true; -int last_automap_input[4] = { 0 }; +AllButtons last_buttons[4] = { 0 }; + +void handle_automap_input(AllButtons buttons, int playerId) +{ + static int bigstate = 0; + + if (buttons.AutomapToggle && !last_buttons[playerId].AutomapToggle) + { + if (automap_active) + { + AM_Stop(true); + bigstate = 0; + } + else + AM_Start(true); + } + + if (buttons.AutomapFollow && !last_buttons[playerId].AutomapFollow) + { + dsda_ToggleConfig(dsda_config_automap_follow, true); + dsda_AddMessage(automap_follow ? AMSTR_FOLLOWON : AMSTR_FOLLOWOFF); + } + + if (buttons.AutomapGrid && !last_buttons[playerId].AutomapGrid) + { + dsda_ToggleConfig(dsda_config_automap_grid, true); + dsda_AddMessage(automap_grid ? AMSTR_GRIDON : AMSTR_GRIDOFF); + } + + if (buttons.AutomapMark && !last_buttons[playerId].AutomapMark) + { + if (!raven) + { + AM_addMark(); + doom_printf("%s %d", AMSTR_MARKEDSPOT, markpointnum - 1); + } + } + + if (buttons.AutomapClearMarks && !last_buttons[playerId].AutomapClearMarks) + { + AM_clearMarks(); + dsda_AddMessage(AMSTR_MARKSCLEARED); + } + + if (buttons.AutomapFullZoom && !last_buttons[playerId].AutomapFullZoom) + { + bigstate = !bigstate; + if (bigstate) + { + AM_saveScaleAndLoc(); + AM_minOutWindowScale(); + } + else + AM_restoreScaleAndLoc(); + } + + if (buttons.AutomapZoomOut) + { + mtof_zoommul = M_ZOOMOUT; + ftom_zoommul = M_ZOOMIN; + curr_mtof_zoommul = mtof_zoommul; + zoom_leveltime = leveltime; + } + else if (buttons.AutomapZoomIn) + { + mtof_zoommul = M_ZOOMIN; + ftom_zoommul = M_ZOOMOUT; + curr_mtof_zoommul = mtof_zoommul; + zoom_leveltime = leveltime; + } + else + { + stop_zooming = true; + if (leveltime != zoom_leveltime) + AM_StopZooming(); + } + + if (!automap_follow) + { + if (buttons.AutomapUp) m_paninc.y += FTOM(map_pan_speed); + if (buttons.AutomapDown) m_paninc.y -= FTOM(map_pan_speed); + if (buttons.AutomapRight) m_paninc.x += FTOM(map_pan_speed); + if (buttons.AutomapLeft) m_paninc.x -= FTOM(map_pan_speed); + } +} void send_input(struct PackedPlayerInput *inputs, int playerId) { @@ -11,11 +95,11 @@ void send_input(struct PackedPlayerInput *inputs, int playerId) local_cmds[playerId].lookfly = inputs->FlyLook; local_cmds[playerId].arti = inputs->ArtifactUse; local_cmds[playerId].angleturn = inputs->TurningSpeed; - - if (inputs->Fire) local_cmds[playerId].buttons |= 0b00000001; - if (inputs->Action) local_cmds[playerId].buttons |= 0b00000010; - if (inputs->EndPlayer) local_cmds[playerId].arti |= 0b01000000; - if (inputs->Jump) local_cmds[playerId].arti |= 0b10000000; + + if (inputs->Buttons.Fire) local_cmds[playerId].buttons |= 0b00000001; + if (inputs->Buttons.Use) local_cmds[playerId].buttons |= 0b00000010; + if (inputs->EndPlayer) local_cmds[playerId].arti |= 0b01000000; + if (inputs->Jump) local_cmds[playerId].arti |= 0b10000000; if (inputs->WeaponSelect) { @@ -23,14 +107,18 @@ void send_input(struct PackedPlayerInput *inputs, int playerId) local_cmds[playerId].buttons |= (inputs->WeaponSelect - 1) << BT_WEAPONSHIFT; } - if (inputs->Automap && !last_automap_input[playerId]) + if (inputs->Buttons.ChangeGamma && !last_buttons[playerId].ChangeGamma) { - if (automap_input) - AM_Stop(true); - else - AM_Start(true); + dsda_CycleConfig(dsda_config_usegamma, true); + dsda_AddMessage(usegamma == 0 ? GAMMALVL0 : + usegamma == 1 ? GAMMALVL1 : + usegamma == 2 ? GAMMALVL2 : + usegamma == 3 ? GAMMALVL3 : + GAMMALVL4); } - last_automap_input[playerId] = inputs->Automap; + + handle_automap_input(inputs->Buttons, playerId); + last_buttons[playerId] = inputs->Buttons; } ECL_EXPORT void dsda_get_audio(int *n, void **buffer) @@ -73,6 +161,9 @@ ECL_EXPORT bool dsda_frame_advance(struct PackedPlayerInput *player1Inputs, stru // Setting inputs headlessClearTickCommand(); + m_paninc.y = 0; + m_paninc.x = 0; + // Setting Players inputs send_input(player1Inputs, 0); send_input(player2Inputs, 1); diff --git a/waterbox/dsda/BizhawkInterface.h b/waterbox/dsda/BizhawkInterface.h index fc1211d51b..3b21abedbd 100644 --- a/waterbox/dsda/BizhawkInterface.h +++ b/waterbox/dsda/BizhawkInterface.h @@ -4,9 +4,11 @@ #include "emulibc.h" #include "am_map.h" +#include "d_englsh.h" #include "d_main.h" #include "d_player.h" #include "doomstat.h" +#include "doomtype.h" #include "f_wipe.h" #include "g_game.h" #include "i_sound.h" @@ -14,6 +16,7 @@ #include "p_mobj.h" #include "dsda/args.h" +#include "dsda/messenger.h" #include "dsda/settings.h" extern int headlessMain(int argc, char **argv); @@ -25,7 +28,7 @@ extern void headlessSetSaveStatePointer(void *savePtr, int saveStateSize); extern size_t headlessGetEffectiveSaveSize(); // Video -extern void headlessUpdateVideo(void); +extern void headlessUpdateVideo(); extern void* headlessGetVideoBuffer(); extern int headlessGetVideoPitch(); extern int headlessGetVideoWidth(); @@ -35,7 +38,7 @@ extern void headlessDisableVideoRendering(); extern uint32_t* headlessGetPallette(); // Audio -extern void headlessUpdateSounds(void); +extern void headlessUpdateSounds(); extern void headlessEnableAudioRendering(); extern void headlessDisableAudioRendering(); extern uint8_t *I_CaptureAudio (int *nsamples); @@ -50,6 +53,30 @@ extern int numthings; extern mobj_t **mobj_ptrs; extern dsda_arg_t arg_value[dsda_arg_count]; +// Automap +extern void AM_addMark(); +extern void AM_StopZooming(); +extern void AM_saveScaleAndLoc(); +extern int AM_minOutWindowScale(); +extern int AM_restoreScaleAndLoc(); +extern int automap_active; +extern int automap_follow; +extern int automap_grid; +extern int markpointnum; +extern int zoom_leveltime; +extern dboolean stop_zooming; +extern mpoint_t m_paninc; +extern fixed_t mtof_zoommul; +extern fixed_t ftom_zoommul; +extern fixed_t curr_mtof_zoommul; +extern int map_pan_speed; +extern int map_scroll_speed; +extern fixed_t scale_mtof; +extern fixed_t scale_ftom; +#define FTOM(x) FixedMul(((x)<<16),scale_ftom) +#define M_ZOOMIN ((int) ((float)FRACUNIT * (1.00f + map_scroll_speed / 200.0f))) +#define M_ZOOMOUT ((int) ((float)FRACUNIT / (1.00f + map_scroll_speed / 200.0f))) + #ifdef PALETTE_SIZE #undef PALETTE_SIZE #endif @@ -63,6 +90,29 @@ enum MemoryArrayType ARRAY_SECTORS = 2 }; +typedef union +{ + struct + { + bool Fire:1; + bool Use:1; + bool ChangeGamma:1; + bool AutomapToggle:1; + bool AutomapZoomIn:1; + bool AutomapZoomOut:1; + bool AutomapFullZoom:1; + bool AutomapFollow:1; + bool AutomapUp:1; + bool AutomapDown:1; + bool AutomapRight:1; + bool AutomapLeft:1; + bool AutomapGrid:1; + bool AutomapMark:1; + bool AutomapClearMarks:1; + }; + uint32_t data; +} AllButtons; + struct InitSettings { int Player1Present; @@ -83,9 +133,7 @@ struct PackedPlayerInput int StrafingSpeed; int TurningSpeed; int WeaponSelect; - int Fire; - int Action; - int Automap; + AllButtons Buttons; int FlyLook; int ArtifactUse; int Jump; diff --git a/waterbox/dsda/core b/waterbox/dsda/core index 256a718b96..c28f422094 160000 --- a/waterbox/dsda/core +++ b/waterbox/dsda/core @@ -1 +1 @@ -Subproject commit 256a718b96a0fb68faae5f0530e1018d19a1d770 +Subproject commit c28f4220943ecee4551dbfb5003969c8dfafdc98