sm64coopdx/src/pc/network/packets/packet_level_warp.c
2020-08-10 12:08:40 -07:00

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