From e8cd317d0dddabb8a60406765e07f59470033490 Mon Sep 17 00:00:00 2001 From: SimoneN64 Date: Tue, 13 Jun 2023 14:45:52 +0200 Subject: [PATCH] lay down netplay code --- src/backend/Netplay.cpp | 32 ++++++++ src/backend/Netplay.hpp | 11 +++ src/backend/core/mmio/PIF.cpp | 118 ++++----------------------- src/backend/core/mmio/PIF.hpp | 2 + src/backend/core/mmio/PIF/Device.cpp | 118 +++++++++++++++++++++++++-- src/backend/core/mmio/PIF/Device.hpp | 7 ++ 6 files changed, 182 insertions(+), 106 deletions(-) create mode 100644 src/backend/Netplay.cpp create mode 100644 src/backend/Netplay.hpp create mode 100644 src/backend/core/mmio/PIF/Device.hpp diff --git a/src/backend/Netplay.cpp b/src/backend/Netplay.cpp new file mode 100644 index 00000000..69cde729 --- /dev/null +++ b/src/backend/Netplay.cpp @@ -0,0 +1,32 @@ +#include +#include "log.hpp" +#include + +namespace Netplay { +bool isHost = false; +bool connected = false; +n64::Controller players[4]{}; + +template +void SyncPlayers(n64::PIF& pif) { + if(connected) { + if(isHost) { + pif.PollController(); + } else { + if constexpr (port == 0) { + Util::panic("It shouldn't be possible to be player 1 and not be the host"); + } else if constexpr (port == 1) { + + } else if constexpr (port == 2) { + + } else if constexpr (port == 3) { + + } else { + Util::panic("What the heeeeelll oh my gaaaa"); + } + } + } +} + +template void SyncPlayers(n64::PIF&); +} \ No newline at end of file diff --git a/src/backend/Netplay.hpp b/src/backend/Netplay.hpp new file mode 100644 index 00000000..dc9f6bfd --- /dev/null +++ b/src/backend/Netplay.hpp @@ -0,0 +1,11 @@ +#pragma once +#include +#include + +namespace Netplay { +extern bool isHost; +extern bool connected; + +template +void SyncPlayers(n64::PIF&); +} \ No newline at end of file diff --git a/src/backend/core/mmio/PIF.cpp b/src/backend/core/mmio/PIF.cpp index 0c32e626..a5108222 100644 --- a/src/backend/core/mmio/PIF.cpp +++ b/src/backend/core/mmio/PIF.cpp @@ -5,6 +5,8 @@ #include #include #include +#include +#include #define MEMPAK_SIZE 32768 @@ -329,108 +331,22 @@ void PIF::EepromWrite(const u8* cmd, u8* res, const Mem& mem) { } } -#define GET_BUTTON(gamecontroller, i) SDL_GameControllerGetButton(gamecontroller, i) -#define GET_AXIS(gamecontroller, axis) SDL_GameControllerGetAxis(gamecontroller, axis) - void PIF::UpdateController() { - if(gamepadConnected) { - bool A = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_A); - bool B = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_X); - bool Z = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) == SDL_JOYSTICK_AXIS_MAX; - bool START = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_START); - bool DUP = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_UP); - bool DDOWN = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_DOWN); - bool DLEFT = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_LEFT); - bool DRIGHT = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_RIGHT); - bool L = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); - bool R = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); - bool CUP = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTY) <= -127; - bool CDOWN = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTY) >= 127; - bool CLEFT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) <= -127; - bool CRIGHT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) >= 127; - - joybusDevices[channel].controller.a = A; - joybusDevices[channel].controller.b = B; - joybusDevices[channel].controller.z = Z; - joybusDevices[channel].controller.start = START; - joybusDevices[channel].controller.dp_up = DUP; - joybusDevices[channel].controller.dp_down = DDOWN; - joybusDevices[channel].controller.dp_left = DLEFT; - joybusDevices[channel].controller.dp_right = DRIGHT; - joybusDevices[channel].controller.joy_reset = L && R && START; - joybusDevices[channel].controller.l = L; - joybusDevices[channel].controller.r = R; - joybusDevices[channel].controller.c_up = CUP; - joybusDevices[channel].controller.c_down = CDOWN; - joybusDevices[channel].controller.c_left = CLEFT; - joybusDevices[channel].controller.c_right = CRIGHT; - - float xclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTX); - if(xclamped < 0) { - xclamped /= float(std::abs(SDL_JOYSTICK_AXIS_MIN)); - } else { - xclamped /= SDL_JOYSTICK_AXIS_MAX; - } - - xclamped *= 86; - - float yclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTY); - if(yclamped < 0) { - yclamped /= float(std::abs(SDL_JOYSTICK_AXIS_MIN)); - } else { - yclamped /= SDL_JOYSTICK_AXIS_MAX; - } - - yclamped *= 86; - - joybusDevices[channel].controller.joy_x = xclamped; - joybusDevices[channel].controller.joy_y = -yclamped; - - if (joybusDevices[channel].controller.joy_reset) { - joybusDevices[channel].controller.start = false; - joybusDevices[channel].controller.joy_x = 0; - joybusDevices[channel].controller.joy_y = 0; - } - } else { - const uint8_t* state = SDL_GetKeyboardState(nullptr); - joybusDevices[channel].controller.a = state[SDL_SCANCODE_X]; - joybusDevices[channel].controller.b = state[SDL_SCANCODE_C]; - joybusDevices[channel].controller.z = state[SDL_SCANCODE_Z]; - joybusDevices[channel].controller.start = state[SDL_SCANCODE_RETURN]; - joybusDevices[channel].controller.dp_up = state[SDL_SCANCODE_PAGEUP]; - joybusDevices[channel].controller.dp_down = state[SDL_SCANCODE_PAGEDOWN]; - joybusDevices[channel].controller.dp_left = state[SDL_SCANCODE_HOME]; - joybusDevices[channel].controller.dp_right = state[SDL_SCANCODE_END]; - joybusDevices[channel].controller.joy_reset = state[SDL_SCANCODE_RETURN] && state[SDL_SCANCODE_A] && state[SDL_SCANCODE_S]; - joybusDevices[channel].controller.l = state[SDL_SCANCODE_A]; - joybusDevices[channel].controller.r = state[SDL_SCANCODE_S]; - joybusDevices[channel].controller.c_up = state[SDL_SCANCODE_I]; - joybusDevices[channel].controller.c_down = state[SDL_SCANCODE_K]; - joybusDevices[channel].controller.c_left = state[SDL_SCANCODE_J]; - joybusDevices[channel].controller.c_right = state[SDL_SCANCODE_L]; - - s16 xaxis = 0, yaxis = 0; - if (state[SDL_SCANCODE_LEFT]) { - xaxis = -86; - } else if (state[SDL_SCANCODE_RIGHT]) { - xaxis = 86; - } - - if (state[SDL_SCANCODE_DOWN]) { - yaxis = -86; - } else if (state[SDL_SCANCODE_UP]) { - yaxis = 86; - } - - joybusDevices[channel].controller.joy_x = xaxis; - joybusDevices[channel].controller.joy_y = yaxis; - - if (joybusDevices[channel].controller.joy_reset) { - joybusDevices[channel].controller.start = false; - joybusDevices[channel].controller.joy_x = 0; - joybusDevices[channel].controller.joy_y = 0; - } - } + joybusDevices[channel].controller.a = players[channel].controller.a; + joybusDevices[channel].controller.b = players[channel].controller.b; + joybusDevices[channel].controller.z = players[channel].controller.z; + joybusDevices[channel].controller.start = players[channel].controller.start; + joybusDevices[channel].controller.dp_up = players[channel].controller.dp_up; + joybusDevices[channel].controller.dp_down = players[channel].controller.dp_down; + joybusDevices[channel].controller.dp_left = players[channel].controller.dp_left; + joybusDevices[channel].controller.dp_right = players[channel].controller.dp_right; + joybusDevices[channel].controller.joy_reset = players[channel].controller.joy_reset; + joybusDevices[channel].controller.l = players[channel].controller.l; + joybusDevices[channel].controller.r = players[channel].controller.r; + joybusDevices[channel].controller.c_up = players[channel].controller.c_up; + joybusDevices[channel].controller.c_down = players[channel].controller.c_down; + joybusDevices[channel].controller.c_left = players[channel].controller.c_left; + joybusDevices[channel].controller.c_right = players[channel].controller.c_right; } void PIF::DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType) { diff --git a/src/backend/core/mmio/PIF.hpp b/src/backend/core/mmio/PIF.hpp index b1132d57..0d4ae9f7 100644 --- a/src/backend/core/mmio/PIF.hpp +++ b/src/backend/core/mmio/PIF.hpp @@ -100,6 +100,8 @@ struct PIF { void CICChallenge(); static void ExecutePIF(Mem& mem, Registers& regs); static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType); + template + void PollController(); void UpdateController(); bool ReadButtons(u8*) const; void ControllerID(u8*) const; diff --git a/src/backend/core/mmio/PIF/Device.cpp b/src/backend/core/mmio/PIF/Device.cpp index c3036827..b10abf0e 100644 --- a/src/backend/core/mmio/PIF/Device.cpp +++ b/src/backend/core/mmio/PIF/Device.cpp @@ -1,14 +1,17 @@ #include #include +#include +#include #include "log.hpp" +#include namespace n64 { +JoybusDevice players[4]{}; + void PIF::InitDevices(SaveType saveType) { - joybusDevices[0].type = JOYBUS_CONTROLLER; - joybusDevices[0].accessoryType = ACCESSORY_MEMPACK; - for (int i = 1; i < 4; i++) { //TODO: make this configurable - joybusDevices[i].type = JOYBUS_NONE; - joybusDevices[i].accessoryType = ACCESSORY_NONE; + for (int i = 0; i < 4; i++) { //TODO: make this configurable + joybusDevices[i].type = JOYBUS_CONTROLLER; + joybusDevices[i].accessoryType = ACCESSORY_MEMPACK; } if (saveType == SAVE_EEPROM_4k) { @@ -21,6 +24,111 @@ void PIF::InitDevices(SaveType saveType) { joybusDevices[5].type = JOYBUS_NONE; } +#define GET_BUTTON(gamecontroller, i) SDL_GameControllerGetButton(gamecontroller, i) +#define GET_AXIS(gamecontroller, axis) SDL_GameControllerGetAxis(gamecontroller, axis) + +template +void PIF::PollController() { + if(gamepadConnected) { + bool A = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_A); + bool B = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_X); + bool Z = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) == SDL_JOYSTICK_AXIS_MAX; + bool START = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_START); + bool DUP = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_UP); + bool DDOWN = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_DOWN); + bool DLEFT = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_LEFT); + bool DRIGHT = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_DPAD_RIGHT); + bool L = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); + bool R = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); + bool CUP = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTY) <= -127; + bool CDOWN = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTY) >= 127; + bool CLEFT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) <= -127; + bool CRIGHT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) >= 127; + + players[port].controller.a = A; + players[port].controller.b = B; + players[port].controller.z = Z; + players[port].controller.start = START; + players[port].controller.dp_up = DUP; + players[port].controller.dp_down = DDOWN; + players[port].controller.dp_left = DLEFT; + players[port].controller.dp_right = DRIGHT; + players[port].controller.joy_reset = L && R && START; + players[port].controller.l = L; + players[port].controller.r = R; + players[port].controller.c_up = CUP; + players[port].controller.c_down = CDOWN; + players[port].controller.c_left = CLEFT; + players[port].controller.c_right = CRIGHT; + + float xclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTX); + if(xclamped < 0) { + xclamped /= float(std::abs(SDL_JOYSTICK_AXIS_MIN)); + } else { + xclamped /= SDL_JOYSTICK_AXIS_MAX; + } + + xclamped *= 86; + + float yclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTY); + if(yclamped < 0) { + yclamped /= float(std::abs(SDL_JOYSTICK_AXIS_MIN)); + } else { + yclamped /= SDL_JOYSTICK_AXIS_MAX; + } + + yclamped *= 86; + + players[port].controller.joy_x = xclamped; + players[port].controller.joy_y = -yclamped; + + if (players[port].controller.joy_reset) { + players[port].controller.start = false; + players[port].controller.joy_x = 0; + players[port].controller.joy_y = 0; + } + } else { + const uint8_t* state = SDL_GetKeyboardState(nullptr); + players[port].controller.a = state[SDL_SCANCODE_X]; + players[port].controller.b = state[SDL_SCANCODE_C]; + players[port].controller.z = state[SDL_SCANCODE_Z]; + players[port].controller.start = state[SDL_SCANCODE_RETURN]; + players[port].controller.dp_up = state[SDL_SCANCODE_PAGEUP]; + players[port].controller.dp_down = state[SDL_SCANCODE_PAGEDOWN]; + players[port].controller.dp_left = state[SDL_SCANCODE_HOME]; + players[port].controller.dp_right = state[SDL_SCANCODE_END]; + players[port].controller.joy_reset = state[SDL_SCANCODE_RETURN] && state[SDL_SCANCODE_A] && state[SDL_SCANCODE_S]; + players[port].controller.l = state[SDL_SCANCODE_A]; + players[port].controller.r = state[SDL_SCANCODE_S]; + players[port].controller.c_up = state[SDL_SCANCODE_I]; + players[port].controller.c_down = state[SDL_SCANCODE_K]; + players[port].controller.c_left = state[SDL_SCANCODE_J]; + players[port].controller.c_right = state[SDL_SCANCODE_L]; + + s16 xaxis = 0, yaxis = 0; + if (state[SDL_SCANCODE_LEFT]) { + xaxis = -86; + } else if (state[SDL_SCANCODE_RIGHT]) { + xaxis = 86; + } + + if (state[SDL_SCANCODE_DOWN]) { + yaxis = -86; + } else if (state[SDL_SCANCODE_UP]) { + yaxis = 86; + } + + players[port].controller.joy_x = xaxis; + players[port].controller.joy_y = yaxis; + + if (players[port].controller.joy_reset) { + players[port].controller.start = false; + players[port].controller.joy_x = 0; + players[port].controller.joy_y = 0; + } + } +} + void PIF::ControllerID(u8 *res) const { if (channel < 6) { switch (joybusDevices[channel].type) { diff --git a/src/backend/core/mmio/PIF/Device.hpp b/src/backend/core/mmio/PIF/Device.hpp new file mode 100644 index 00000000..4dd0dde1 --- /dev/null +++ b/src/backend/core/mmio/PIF/Device.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace n64 { +struct JoybusDevice; + +extern JoybusDevice players[4]; +} \ No newline at end of file