Synchronized WDW initial water level

This commit is contained in:
MysterD 2020-09-24 22:18:04 -07:00
parent 333a77b647
commit 1536ce87c8
3 changed files with 33 additions and 16 deletions

View file

@ -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();

View file

@ -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;

View file

@ -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();