From ab99a6acac7c14453a89e6dca29c482f633b105c Mon Sep 17 00:00:00 2001 From: Alex Vanderveen Date: Fri, 24 Jul 2026 20:13:26 -0400 Subject: [PATCH] delay sync patches --- runtime/include/psx_lobby_client.h | 1 + runtime/include/psx_netplay.h | 1 + runtime/src/main.cpp | 25 +++++++++++++++++++++++++ runtime/src/psx_lobby_client.c | 4 +++- runtime/src/psx_netplay.c | 1 + 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/runtime/include/psx_lobby_client.h b/runtime/include/psx_lobby_client.h index 66d83ef2..341312ea 100644 --- a/runtime/include/psx_lobby_client.h +++ b/runtime/include/psx_lobby_client.h @@ -50,6 +50,7 @@ typedef struct PsxLobbyMatchCaps { int auto_skip_fmv; /* 0/1 */ int input_delay; /* recomp-net delay frames */ int force_input_relay; /* 0/1 — server input relay (vs P2P) */ + int force_turn; /* 0/1 — ICE relay-only (Force TURN for UDP) */ char language[PSX_LOBBY_LANG_LEN]; } PsxLobbyMatchCaps; diff --git a/runtime/include/psx_netplay.h b/runtime/include/psx_netplay.h index 13191f3b..d568338e 100644 --- a/runtime/include/psx_netplay.h +++ b/runtime/include/psx_netplay.h @@ -51,6 +51,7 @@ typedef struct PsxNetplayConfig { int input_player; /* host device index; -1 = auto */ int input_delay; int force_input_relay; /* 1 = lobby-server UDP input relay */ + int force_turn; /* 1 = ICE relay-only (Force TURN for UDP) */ uint32_t session_id; char bind_hostport[64]; char peer_hostport[64]; diff --git a/runtime/src/main.cpp b/runtime/src/main.cpp index 1d9606eb..3e03fb18 100644 --- a/runtime/src/main.cpp +++ b/runtime/src/main.cpp @@ -4016,6 +4016,7 @@ namespace { RecompLauncherCNetplayLaunch g_lnch_pending_direct_launch{}; int g_lnch_lobby_input_delay = 2; int g_lnch_force_input_relay = 0; + int g_lnch_force_turn = 0; int g_lnch_host_max_slots = 2; /* Delay-sync READY/START waits for every seat in slot_count. Use seated @@ -4817,6 +4818,7 @@ namespace { if (caps.input_delay < 2) caps.input_delay = 2; if (caps.input_delay > 20) caps.input_delay = 20; caps.force_input_relay = g_lnch_force_input_relay != 0; + caps.force_turn = g_lnch_force_turn != 0; return caps; } @@ -4831,6 +4833,7 @@ namespace { if (caps.input_delay < 2) caps.input_delay = 2; if (caps.input_delay > 20) caps.input_delay = 20; caps.force_input_relay = g_lnch_force_input_relay != 0; + caps.force_turn = g_lnch_force_turn != 0; (void)psx_lobby_set_match_caps(&caps); } @@ -4867,6 +4870,21 @@ namespace { ae_np_push_match_caps(nullptr); return 0; } + int ae_np_force_turn_get(void*) { + if (!g_lnch_hosting_lan && !g_lnch_joined_lan) { + const PsxLobbyMatchCaps* caps = psx_lobby_match_caps(); + if (caps && caps->valid) + return caps->force_turn ? 1 : 0; + } + return g_lnch_force_turn; + } + int ae_np_force_turn_set(void*, int force) { + if (g_lnch_hosting_lan || g_lnch_joined_lan) + return 0; /* LAN/Direct IP does not use ICE TURN */ + g_lnch_force_turn = force ? 1 : 0; + ae_np_push_match_caps(nullptr); + return 0; + } /* Seat ceiling for the active room (listing / LOBBY UI). 0 if unknown. */ int ae_np_lobby_max_slots(void*) { @@ -5884,6 +5902,7 @@ namespace { if (g_lnch_pending_direct_launch.max_slots > kAeLanMaxSlots) g_lnch_pending_direct_launch.max_slots = kAeLanMaxSlots; g_lnch_pending_direct_launch.force_input_relay = 0; + g_lnch_pending_direct_launch.force_turn = 0; g_lnch_pending_direct_launch.player_count = ae_np_lan_occupied(state); if (g_lnch_hosting_lan) { const size_t colon = state.endpoint.rfind(':'); @@ -5977,6 +5996,8 @@ namespace { } out->force_input_relay = (caps && caps->valid && caps->force_input_relay) ? 1 : 0; + out->force_turn = + (caps && caps->valid && caps->force_turn) ? 1 : 0; return 1; } @@ -6018,6 +6039,8 @@ namespace { ae_np_force_input_relay_get, ae_np_force_input_relay_set, ae_np_lobby_max_slots, + ae_np_force_turn_get, + ae_np_force_turn_set, }; } // namespace #endif @@ -7239,6 +7262,7 @@ std::string player_device[PSX_MAX_PLAYERS]; net_cfg.session_id = ls.netplay_launch.session_id; net_cfg.input_delay = ls.netplay_launch.input_delay; net_cfg.force_input_relay = ls.netplay_launch.force_input_relay ? 1 : 0; + net_cfg.force_turn = ls.netplay_launch.force_turn ? 1 : 0; net_cfg.player_count = ls.netplay_launch.player_count; net_cfg.slot_count = ae_np_session_slot_count( ls.netplay_launch.player_count, ls.netplay_launch.max_slots, @@ -8223,6 +8247,7 @@ soft_return_lobby: net_cfg.session_id = ls.netplay_launch.session_id; net_cfg.input_delay = ls.netplay_launch.input_delay; net_cfg.force_input_relay = ls.netplay_launch.force_input_relay ? 1 : 0; + net_cfg.force_turn = ls.netplay_launch.force_turn ? 1 : 0; net_cfg.player_count = ls.netplay_launch.player_count; net_cfg.slot_count = ae_np_session_slot_count( ls.netplay_launch.player_count, ls.netplay_launch.max_slots, diff --git a/runtime/src/psx_lobby_client.c b/runtime/src/psx_lobby_client.c index 0c57276d..b55a7ab9 100644 --- a/runtime/src/psx_lobby_client.c +++ b/runtime/src/psx_lobby_client.c @@ -345,6 +345,7 @@ static void parse_match_caps_object(const char *obj, PsxLobbyMatchCaps *out) if (out->input_delay < 0) out->input_delay = 0; if (out->input_delay > 16) out->input_delay = 16; out->force_input_relay = json_get_bool(obj, "force_input_relay", 0); + out->force_turn = json_get_bool(obj, "force_turn", 0); json_get_str(obj, "language", out->language, sizeof(out->language)); out->valid = 1; } @@ -374,7 +375,7 @@ static int append_match_caps_json(char *dst, size_t dst_cap, const PsxLobbyMatch ",\"match_caps\":{\"v\":1,\"aspect_num\":%d,\"aspect_den\":%d," "\"turbo_loads\":%s,\"bios_hle\":%s,\"fast_boot\":%s," "\"auto_skip_fmv\":%s,\"input_delay\":%d,\"force_input_relay\":%s," - "\"language\":\"%s\"}", + "\"force_turn\":%s,\"language\":\"%s\"}", caps->aspect_num, caps->aspect_den, caps->turbo_loads ? "true" : "false", caps->bios_hle ? "true" : "false", @@ -382,6 +383,7 @@ static int append_match_caps_json(char *dst, size_t dst_cap, const PsxLobbyMatch caps->auto_skip_fmv ? "true" : "false", caps->input_delay, caps->force_input_relay ? "true" : "false", + caps->force_turn ? "true" : "false", lang); } diff --git a/runtime/src/psx_netplay.c b/runtime/src/psx_netplay.c index 28bb58cf..d8663f16 100644 --- a/runtime/src/psx_netplay.c +++ b/runtime/src/psx_netplay.c @@ -54,6 +54,7 @@ void psx_netplay_config_defaults(PsxNetplayConfig *cfg) cfg->input_player = -1; cfg->input_delay = 2; cfg->force_input_relay = 0; + cfg->force_turn = 0; cfg->session_id = 1; strncpy(cfg->bind_hostport, "0.0.0.0:7777", sizeof(cfg->bind_hostport) - 1); cfg->peer_hostport[0] = '\0';