packets
This commit is contained in:
@@ -1,11 +1,36 @@
|
|||||||
#include <Netplay.hpp>
|
#include <Netplay.hpp>
|
||||||
#include "log.hpp"
|
#include "log.hpp"
|
||||||
|
#include "PIF/Device.hpp"
|
||||||
#include <PIF.hpp>
|
#include <PIF.hpp>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
namespace Netplay {
|
namespace Netplay {
|
||||||
bool isHost = false;
|
bool isHost = false;
|
||||||
bool connected = false;
|
bool connected = false;
|
||||||
n64::Controller players[4]{};
|
std::array<std::string, 4> IPs{};
|
||||||
|
|
||||||
|
template <int port>
|
||||||
|
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 <int port>
|
||||||
|
void SendDataToRemotePlayer() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
template <int port>
|
template <int port>
|
||||||
void SyncPlayers(n64::PIF& pif) {
|
void SyncPlayers(n64::PIF& pif) {
|
||||||
@@ -15,15 +40,13 @@ void SyncPlayers(n64::PIF& pif) {
|
|||||||
} else {
|
} else {
|
||||||
if constexpr (port == 0) {
|
if constexpr (port == 0) {
|
||||||
Util::panic("It shouldn't be possible to be player 1 and not be the host");
|
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 {
|
} else {
|
||||||
|
if constexpr (port > 3) {
|
||||||
Util::panic("What the heeeeelll oh my gaaaa");
|
Util::panic("What the heeeeelll oh my gaaaa");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n64::players[port] = RequestDataFromRemotePlayer<port>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <GameDB.hpp>
|
#include <GameDB.hpp>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <mio/mmap.hpp>
|
#include <mio/mmap.hpp>
|
||||||
|
#include <SFML/Network/Packet.hpp>
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
@@ -64,6 +65,10 @@ struct JoybusDevice {
|
|||||||
JoybusType type{};
|
JoybusType type{};
|
||||||
AccessoryType accessoryType{};
|
AccessoryType accessoryType{};
|
||||||
Controller controller{};
|
Controller controller{};
|
||||||
|
|
||||||
|
auto operator<<(const sf::Packet& packet) {
|
||||||
|
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Mem;
|
struct Mem;
|
||||||
@@ -100,7 +105,6 @@ struct PIF {
|
|||||||
void CICChallenge();
|
void CICChallenge();
|
||||||
static void ExecutePIF(Mem& mem, Registers& regs);
|
static void ExecutePIF(Mem& mem, Registers& regs);
|
||||||
static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType);
|
static void DoPIFHLE(Mem& mem, Registers& regs, bool pal, CICType cicType);
|
||||||
template <int port = 0>
|
|
||||||
void PollController();
|
void PollController();
|
||||||
void UpdateController();
|
void UpdateController();
|
||||||
bool ReadButtons(u8*) const;
|
bool ReadButtons(u8*) const;
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ void PIF::InitDevices(SaveType saveType) {
|
|||||||
#define GET_BUTTON(gamecontroller, i) SDL_GameControllerGetButton(gamecontroller, i)
|
#define GET_BUTTON(gamecontroller, i) SDL_GameControllerGetButton(gamecontroller, i)
|
||||||
#define GET_AXIS(gamecontroller, axis) SDL_GameControllerGetAxis(gamecontroller, axis)
|
#define GET_AXIS(gamecontroller, axis) SDL_GameControllerGetAxis(gamecontroller, axis)
|
||||||
|
|
||||||
template <int port>
|
|
||||||
void PIF::PollController() {
|
void PIF::PollController() {
|
||||||
if(gamepadConnected) {
|
if(gamepadConnected) {
|
||||||
bool A = GET_BUTTON(gamepad, SDL_CONTROLLER_BUTTON_A);
|
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 CLEFT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) <= -127;
|
||||||
bool CRIGHT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) >= 127;
|
bool CRIGHT = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_RIGHTX) >= 127;
|
||||||
|
|
||||||
players[port].controller.a = A;
|
players[0].controller.a = A;
|
||||||
players[port].controller.b = B;
|
players[0].controller.b = B;
|
||||||
players[port].controller.z = Z;
|
players[0].controller.z = Z;
|
||||||
players[port].controller.start = START;
|
players[0].controller.start = START;
|
||||||
players[port].controller.dp_up = DUP;
|
players[0].controller.dp_up = DUP;
|
||||||
players[port].controller.dp_down = DDOWN;
|
players[0].controller.dp_down = DDOWN;
|
||||||
players[port].controller.dp_left = DLEFT;
|
players[0].controller.dp_left = DLEFT;
|
||||||
players[port].controller.dp_right = DRIGHT;
|
players[0].controller.dp_right = DRIGHT;
|
||||||
players[port].controller.joy_reset = L && R && START;
|
players[0].controller.joy_reset = L && R && START;
|
||||||
players[port].controller.l = L;
|
players[0].controller.l = L;
|
||||||
players[port].controller.r = R;
|
players[0].controller.r = R;
|
||||||
players[port].controller.c_up = CUP;
|
players[0].controller.c_up = CUP;
|
||||||
players[port].controller.c_down = CDOWN;
|
players[0].controller.c_down = CDOWN;
|
||||||
players[port].controller.c_left = CLEFT;
|
players[0].controller.c_left = CLEFT;
|
||||||
players[port].controller.c_right = CRIGHT;
|
players[0].controller.c_right = CRIGHT;
|
||||||
|
|
||||||
float xclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTX);
|
float xclamped = GET_AXIS(gamepad, SDL_CONTROLLER_AXIS_LEFTX);
|
||||||
if(xclamped < 0) {
|
if(xclamped < 0) {
|
||||||
@@ -79,31 +78,31 @@ void PIF::PollController() {
|
|||||||
|
|
||||||
yclamped *= 86;
|
yclamped *= 86;
|
||||||
|
|
||||||
players[port].controller.joy_x = xclamped;
|
players[0].controller.joy_x = xclamped;
|
||||||
players[port].controller.joy_y = -yclamped;
|
players[0].controller.joy_y = -yclamped;
|
||||||
|
|
||||||
if (players[port].controller.joy_reset) {
|
if (players[0].controller.joy_reset) {
|
||||||
players[port].controller.start = false;
|
players[0].controller.start = false;
|
||||||
players[port].controller.joy_x = 0;
|
players[0].controller.joy_x = 0;
|
||||||
players[port].controller.joy_y = 0;
|
players[0].controller.joy_y = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const uint8_t* state = SDL_GetKeyboardState(nullptr);
|
const uint8_t* state = SDL_GetKeyboardState(nullptr);
|
||||||
players[port].controller.a = state[SDL_SCANCODE_X];
|
players[0].controller.a = state[SDL_SCANCODE_X];
|
||||||
players[port].controller.b = state[SDL_SCANCODE_C];
|
players[0].controller.b = state[SDL_SCANCODE_C];
|
||||||
players[port].controller.z = state[SDL_SCANCODE_Z];
|
players[0].controller.z = state[SDL_SCANCODE_Z];
|
||||||
players[port].controller.start = state[SDL_SCANCODE_RETURN];
|
players[0].controller.start = state[SDL_SCANCODE_RETURN];
|
||||||
players[port].controller.dp_up = state[SDL_SCANCODE_PAGEUP];
|
players[0].controller.dp_up = state[SDL_SCANCODE_PAGEUP];
|
||||||
players[port].controller.dp_down = state[SDL_SCANCODE_PAGEDOWN];
|
players[0].controller.dp_down = state[SDL_SCANCODE_PAGEDOWN];
|
||||||
players[port].controller.dp_left = state[SDL_SCANCODE_HOME];
|
players[0].controller.dp_left = state[SDL_SCANCODE_HOME];
|
||||||
players[port].controller.dp_right = state[SDL_SCANCODE_END];
|
players[0].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[0].controller.joy_reset = state[SDL_SCANCODE_RETURN] && state[SDL_SCANCODE_A] && state[SDL_SCANCODE_S];
|
||||||
players[port].controller.l = state[SDL_SCANCODE_A];
|
players[0].controller.l = state[SDL_SCANCODE_A];
|
||||||
players[port].controller.r = state[SDL_SCANCODE_S];
|
players[0].controller.r = state[SDL_SCANCODE_S];
|
||||||
players[port].controller.c_up = state[SDL_SCANCODE_I];
|
players[0].controller.c_up = state[SDL_SCANCODE_I];
|
||||||
players[port].controller.c_down = state[SDL_SCANCODE_K];
|
players[0].controller.c_down = state[SDL_SCANCODE_K];
|
||||||
players[port].controller.c_left = state[SDL_SCANCODE_J];
|
players[0].controller.c_left = state[SDL_SCANCODE_J];
|
||||||
players[port].controller.c_right = state[SDL_SCANCODE_L];
|
players[0].controller.c_right = state[SDL_SCANCODE_L];
|
||||||
|
|
||||||
s16 xaxis = 0, yaxis = 0;
|
s16 xaxis = 0, yaxis = 0;
|
||||||
if (state[SDL_SCANCODE_LEFT]) {
|
if (state[SDL_SCANCODE_LEFT]) {
|
||||||
@@ -118,13 +117,13 @@ void PIF::PollController() {
|
|||||||
yaxis = 86;
|
yaxis = 86;
|
||||||
}
|
}
|
||||||
|
|
||||||
players[port].controller.joy_x = xaxis;
|
players[0].controller.joy_x = xaxis;
|
||||||
players[port].controller.joy_y = yaxis;
|
players[0].controller.joy_y = yaxis;
|
||||||
|
|
||||||
if (players[port].controller.joy_reset) {
|
if (players[0].controller.joy_reset) {
|
||||||
players[port].controller.start = false;
|
players[0].controller.start = false;
|
||||||
players[port].controller.joy_x = 0;
|
players[0].controller.joy_x = 0;
|
||||||
players[port].controller.joy_y = 0;
|
players[0].controller.joy_y = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user