mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-12-10 18:12:40 +00:00
64 lines
2.3 KiB
C
64 lines
2.3 KiB
C
#include <stdio.h>
|
|
#include "../network.h"
|
|
#include "src/game/level_update.h"
|
|
#include "src/game/area.h"
|
|
|
|
int matchCount = 0;
|
|
|
|
extern s16 gMenuMode;
|
|
|
|
void network_send_level_warp(void) {
|
|
struct Packet p;
|
|
packet_init(&p, PACKET_LEVEL_WARP, true);
|
|
packet_write(&p, &sCurrPlayMode, sizeof(s16));
|
|
packet_write(&p, &sWarpDest, sizeof(struct WarpDest));
|
|
|
|
network_send(&p);
|
|
}
|
|
|
|
void network_receive_level_warp(struct Packet* p) {
|
|
s16 remotePlayMode;
|
|
struct WarpDest remoteWarpDest;
|
|
|
|
packet_read(p, &remotePlayMode, sizeof(s16));
|
|
packet_read(p, &remoteWarpDest, sizeof(struct WarpDest));
|
|
|
|
bool matchingDest = memcmp(&remoteWarpDest, &sWarpDest, sizeof(struct WarpDest)) == 0;
|
|
|
|
if (remotePlayMode == PLAY_MODE_SYNC_LEVEL && (sCurrPlayMode == PLAY_MODE_NORMAL || sCurrPlayMode == PLAY_MODE_PAUSED)) {
|
|
if (remoteWarpDest.type == WARP_TYPE_NOT_WARPING) { return; }
|
|
sCurrPlayMode = PLAY_MODE_SYNC_LEVEL;
|
|
sWarpDest = remoteWarpDest;
|
|
gMenuMode = -1;
|
|
gPauseScreenMode = 1;
|
|
if (sTransitionTimer < 1) { sTransitionTimer = 1; }
|
|
gCameraMovementFlags &= ~CAM_MOVE_PAUSE_SCREEN;
|
|
network_send_level_warp();
|
|
return;
|
|
}
|
|
|
|
if (remotePlayMode == PLAY_MODE_SYNC_LEVEL && sCurrPlayMode == PLAY_MODE_SYNC_LEVEL) {
|
|
if (matchingDest) {
|
|
switch (sWarpDest.type) {
|
|
case WARP_TYPE_CHANGE_AREA: sCurrPlayMode = PLAY_MODE_CHANGE_AREA; break;
|
|
case WARP_TYPE_CHANGE_LEVEL: sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL; break;
|
|
}
|
|
} else {
|
|
if (networkType == NT_CLIENT) {
|
|
if (remoteWarpDest.type == WARP_TYPE_NOT_WARPING) { return; }
|
|
// two-player hack: would need to use player index as priority
|
|
sWarpDest = remoteWarpDest;
|
|
}
|
|
}
|
|
network_send_level_warp();
|
|
return;
|
|
}
|
|
|
|
if ((remotePlayMode == PLAY_MODE_CHANGE_LEVEL || remotePlayMode == PLAY_MODE_CHANGE_AREA) && sCurrPlayMode == PLAY_MODE_SYNC_LEVEL) {
|
|
if (remoteWarpDest.type == WARP_TYPE_NOT_WARPING) { return; }
|
|
switch (sWarpDest.type) {
|
|
case WARP_TYPE_CHANGE_AREA: sCurrPlayMode = PLAY_MODE_CHANGE_AREA; break;
|
|
case WARP_TYPE_CHANGE_LEVEL: sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL; break;
|
|
}
|
|
}
|
|
}
|