From 1536ce87c868ca7a359eb14574bbd649f5d2f5de Mon Sep 17 00:00:00 2001 From: MysterD Date: Thu, 24 Sep 2020 22:18:04 -0700 Subject: [PATCH] Synchronized WDW initial water level --- src/game/level_update.c | 18 ++++++++++++------ src/game/level_update.h | 9 +++++++++ src/pc/network/packets/packet_level_warp.c | 22 ++++++++++++---------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/game/level_update.c b/src/game/level_update.c index 6fd6ebbeb..ee46c7d9c 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -46,9 +46,8 @@ #define WARP_NODE_CREDITS_MIN 0xF8 +struct SavedWarpValues gReceiveWarp = { 0 }; u8 gControlledWarp = 0; -u8 gReceiveWarp = 0; -struct WarpDest gReceiveWarpDest = { 0 }; extern s8 sReceivedLoadedActNum; #ifdef VERSION_JP @@ -991,9 +990,16 @@ void basic_update(UNUSED s16 *arg) { } static void check_received_warp(void) { - if (!gReceiveWarp) { return; } - gReceiveWarp = FALSE; - sWarpDest = gReceiveWarpDest; + extern float gPaintingMarioYEntry; + if (!gReceiveWarp.received) { return; } + gReceiveWarp.received = FALSE; + + // keep do_warp(void) in sync with this + sWarpDest = gReceiveWarp.warpDest; + gInWarpCheckpoint = gReceiveWarp.inWarpCheckpoint; + gTTCSpeedSetting = gReceiveWarp.ttcSpeedSetting; + D_80339EE0 = gReceiveWarp.D_80339EE0; + gPaintingMarioYEntry = gReceiveWarp.paintingMarioYEntry; if (!gControlledWarp) { // force well behaved state @@ -1054,7 +1060,7 @@ s32 play_mode_normal(void) { } else if (sTransitionTimer != 0) { set_play_mode(PLAY_MODE_CHANGE_AREA); } - } else if (!gReceiveWarp) { + } else if (!gReceiveWarp.received) { if (sWarpDest.type == WARP_TYPE_CHANGE_LEVEL) { set_play_mode(PLAY_MODE_SYNC_LEVEL); network_send_level_warp_begin(); diff --git a/src/game/level_update.h b/src/game/level_update.h index beb985d05..0fd1600f9 100644 --- a/src/game/level_update.h +++ b/src/game/level_update.h @@ -84,6 +84,15 @@ struct WarpDest { u32 arg; }; +struct SavedWarpValues { + u8 received; + struct WarpDest warpDest; + s8 inWarpCheckpoint; + s16 ttcSpeedSetting; + s16 D_80339EE0; + f32 paintingMarioYEntry; +}; + extern struct WarpDest sWarpDest; extern s8 gInWarpCheckpoint; diff --git a/src/pc/network/packets/packet_level_warp.c b/src/pc/network/packets/packet_level_warp.c index 6ea8d841f..ecc737ec8 100644 --- a/src/pc/network/packets/packet_level_warp.c +++ b/src/pc/network/packets/packet_level_warp.c @@ -15,16 +15,11 @@ static u8 remoteLastSeqId = (u8)-1; extern s16 gTTCSpeedSetting; extern s16 D_80339EE0; +extern float gPaintingMarioYEntry; extern u8 gControlledWarp; // two-player hack -extern u8 gReceiveWarp; -extern struct WarpDest gReceiveWarpDest; -struct SavedWarpValues { - struct WarpDest warpDest; - s8 inWarpCheckpoint; - s16 ttcSpeedSetting; - s16 D_80339EE0; -} saved = { 0 }; +extern struct SavedWarpValues gReceiveWarp; +struct SavedWarpValues saved = { 0 }; static clock_t lastDoneEvent = 0; static bool isInWarp = FALSE; @@ -39,6 +34,7 @@ struct PacketLevelWarpData { s8 inWarpCheckpoint; s16 ttcSpeedSetting; s16 D_80339EE0; + f32 paintingMarioYEntry; }; static void populate_packet_data(struct PacketLevelWarpData* data, bool done, u8 packetEventId) { @@ -50,6 +46,7 @@ static void populate_packet_data(struct PacketLevelWarpData* data, bool done, u8 data->inWarpCheckpoint = saved.inWarpCheckpoint; data->ttcSpeedSetting = saved.ttcSpeedSetting; data->D_80339EE0 = saved.D_80339EE0; + data->paintingMarioYEntry = saved.paintingMarioYEntry; } void network_send_level_warp_begin(void) { @@ -58,6 +55,7 @@ void network_send_level_warp_begin(void) { saved.inWarpCheckpoint = gInWarpCheckpoint; saved.ttcSpeedSetting = gTTCSpeedSetting; saved.D_80339EE0 = D_80339EE0; + saved.paintingMarioYEntry = gPaintingMarioYEntry; float elapsedSinceDone = (clock() - lastDoneEvent) / CLOCKS_PER_SEC; gControlledWarp = (elapsedSinceDone < 1.0f) @@ -113,11 +111,13 @@ static void network_send_level_warp_done(u8 remoteEventId) { } static void do_warp(void) { - gReceiveWarpDest = saved.warpDest; + // keep check_received_warp(void) in sync with this + gReceiveWarp = saved; + gReceiveWarp.received = TRUE; gInWarpCheckpoint = saved.inWarpCheckpoint; gTTCSpeedSetting = saved.ttcSpeedSetting; D_80339EE0 = saved.D_80339EE0; - gReceiveWarp = TRUE; + gPaintingMarioYEntry = saved.paintingMarioYEntry; } void network_receive_level_warp(struct Packet* p) { @@ -160,6 +160,7 @@ void network_receive_level_warp(struct Packet* p) { saved.inWarpCheckpoint = remote.inWarpCheckpoint; saved.ttcSpeedSetting = remote.ttcSpeedSetting; saved.D_80339EE0 = remote.D_80339EE0; + saved.paintingMarioYEntry = remote.paintingMarioYEntry; do_warp(); network_send_level_warp_done(remote.eventId); @@ -188,6 +189,7 @@ void network_receive_level_warp(struct Packet* p) { saved.inWarpCheckpoint = remote.inWarpCheckpoint; saved.ttcSpeedSetting = remote.ttcSpeedSetting; saved.D_80339EE0 = remote.D_80339EE0; + saved.paintingMarioYEntry = remote.paintingMarioYEntry; LOG_INFO("finished event [%d]!", remote.eventId); do_warp();