diff --git a/src/backend/Netplay.cpp b/src/backend/Netplay.cpp index 69cde729..9933d0f6 100644 --- a/src/backend/Netplay.cpp +++ b/src/backend/Netplay.cpp @@ -1,11 +1,36 @@ #include #include "log.hpp" +#include "PIF/Device.hpp" #include +#include namespace Netplay { bool isHost = false; bool connected = false; -n64::Controller players[4]{}; +std::array IPs{}; + +template +n64::JoybusDevice RequestDataFromRemotePlayer() { + sf::UdpSocket sock; + u16 remotePort = 53000; + sf::IpAddress remoteAddress = IPs[port]; + if(sock.bind(remotePort) != sf::Socket::Done) { + Util::panic("Could not bind UDP connection"); + } + + sf::Packet res; + if(sock.receive(res, remoteAddress, remotePort) != sf::Socket::Done) { + Util::panic("Could not receive data from other players"); + } + + n64::JoybusDevice result{}; + result << res; +} + +template +void SendDataToRemotePlayer() { + +} template void SyncPlayers(n64::PIF& pif) { @@ -15,14 +40,12 @@ void SyncPlayers(n64::PIF& pif) { } 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"); + if constexpr (port > 3) { + Util::panic("What the heeeeelll oh my gaaaa"); + } + + n64::players[port] = RequestDataFromRemotePlayer(); } } } diff --git a/src/backend/core/mmio/PIF.hpp b/src/backend/core/mmio/PIF.hpp index 0d4ae9f7..5af5562e 100644 --- a/src/backend/core/mmio/PIF.hpp +++ b/src/backend/core/mmio/PIF.hpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace fs = std::filesystem; @@ -64,6 +65,10 @@ struct JoybusDevice { JoybusType type{}; AccessoryType accessoryType{}; Controller controller{}; + + auto operator<<(const sf::Packet& packet) { + + } }; struct Mem; @@ -100,7 +105,6 @@ 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; diff --git a/src/backend/core/mmio/PIF/Device.cpp b/src/backend/core/mmio/PIF/Device.cpp index b10abf0e..cdc3dc3f 100644 --- a/src/backend/core/mmio/PIF/Device.cpp +++ b/src/backend/core/mmio/PIF/Device.cpp @@ -27,7 +27,6 @@ void PIF::InitDevices(SaveType saveType) { #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); @@ -45,21 +44,21 @@ void PIF::PollController() { 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; + players[0].controller.a = A; + players[0].controller.b = B; + players[0].controller.z = Z; + players[0].controller.start = START; + players[0].controller.dp_up = DUP; + players[0].controller.dp_down = DDOWN; + players[0].controller.dp_left = DLEFT; + players[0].controller.dp_right = DRIGHT; + players[0].controller.joy_reset = L && R && START; + players[0].controller.l = L; + players[0].controller.r = R; + players[0].controller.c_up = CUP; + players[0].controller.c_down = CDOWN; + players[0].controller.c_left = CLEFT; + players[0].controller.c_right = CRIGHT; float xclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTX); if(xclamped < 0) { @@ -79,31 +78,31 @@ void PIF::PollController() { yclamped *= 86; - players[port].controller.joy_x = xclamped; - players[port].controller.joy_y = -yclamped; + players[0].controller.joy_x = xclamped; + players[0].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; + if (players[0].controller.joy_reset) { + players[0].controller.start = false; + players[0].controller.joy_x = 0; + players[0].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]; + players[0].controller.a = state[SDL_SCANCODE_X]; + players[0].controller.b = state[SDL_SCANCODE_C]; + players[0].controller.z = state[SDL_SCANCODE_Z]; + players[0].controller.start = state[SDL_SCANCODE_RETURN]; + players[0].controller.dp_up = state[SDL_SCANCODE_PAGEUP]; + players[0].controller.dp_down = state[SDL_SCANCODE_PAGEDOWN]; + players[0].controller.dp_left = state[SDL_SCANCODE_HOME]; + players[0].controller.dp_right = state[SDL_SCANCODE_END]; + players[0].controller.joy_reset = state[SDL_SCANCODE_RETURN] && state[SDL_SCANCODE_A] && state[SDL_SCANCODE_S]; + players[0].controller.l = state[SDL_SCANCODE_A]; + players[0].controller.r = state[SDL_SCANCODE_S]; + players[0].controller.c_up = state[SDL_SCANCODE_I]; + players[0].controller.c_down = state[SDL_SCANCODE_K]; + players[0].controller.c_left = state[SDL_SCANCODE_J]; + players[0].controller.c_right = state[SDL_SCANCODE_L]; s16 xaxis = 0, yaxis = 0; if (state[SDL_SCANCODE_LEFT]) { @@ -118,13 +117,13 @@ void PIF::PollController() { yaxis = 86; } - players[port].controller.joy_x = xaxis; - players[port].controller.joy_y = yaxis; + players[0].controller.joy_x = xaxis; + players[0].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; + if (players[0].controller.joy_reset) { + players[0].controller.start = false; + players[0].controller.joy_x = 0; + players[0].controller.joy_y = 0; } } }