From 1bef126df847574a08537b9e97c3f3d9614f085b Mon Sep 17 00:00:00 2001 From: MysterD Date: Mon, 10 Aug 2020 12:08:40 -0700 Subject: [PATCH] Synchronize area changes --- build-windows-visual-studio/sm64ex.vcxproj | 10 +++- .../sm64ex.vcxproj.filters | 30 +++++++++++ src/game/area.c | 13 ++++- src/game/level_update.c | 53 +++++++++---------- src/game/level_update.h | 4 ++ src/game/mario.c | 8 +++ src/game/object_list_processor.c | 1 + src/pc/network/packets/packet_level_warp.c | 15 ++++-- 8 files changed, 99 insertions(+), 35 deletions(-) diff --git a/build-windows-visual-studio/sm64ex.vcxproj b/build-windows-visual-studio/sm64ex.vcxproj index cc8641b5b..131953e15 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj +++ b/build-windows-visual-studio/sm64ex.vcxproj @@ -87,7 +87,7 @@ Level3 true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;WINSOCK;%(PreprocessorDefinitions) true @@ -2231,6 +2231,7 @@ + @@ -3955,6 +3956,9 @@ + + + @@ -4293,7 +4297,11 @@ + + + + diff --git a/build-windows-visual-studio/sm64ex.vcxproj.filters b/build-windows-visual-studio/sm64ex.vcxproj.filters index 6c370cc37..53b93d967 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj.filters +++ b/build-windows-visual-studio/sm64ex.vcxproj.filters @@ -3421,6 +3421,12 @@ {f7dcd9e2-f84f-4c82-96c5-0dc32d408693} + + {d884729b-710d-45b4-8757-287303e2d8e2} + + + {b1b4937e-775c-4a0c-92f5-48b010783e4d} + @@ -14973,6 +14979,18 @@ Source Files\src\pc\network\packets + + Source Files\src\pc\network\socket + + + Source Files\src\pc\network\socket + + + Source Files\src\pc\network\socket + + + Source Files\data + @@ -15877,5 +15895,17 @@ Header Files\src\pc\network + + Header Files\src\pc\network\socket + + + Header Files\src\pc\network\socket + + + Header Files\src\pc\network\socket + + + Header Files\include + \ No newline at end of file diff --git a/src/game/area.c b/src/game/area.c index 51860ab5c..9fd492b12 100644 --- a/src/game/area.c +++ b/src/game/area.c @@ -268,6 +268,10 @@ void load_mario_area(void) { func_80320890(); load_area(gMarioSpawnInfo->areaIndex); + for (int i = 0; i < MAX_PLAYERS; i++) { + gMarioStates[i].spawnInfo->areaIndex = gCurrentArea->index; + } + if (gCurrentArea->index == gMarioSpawnInfo->areaIndex) { gCurrentArea->flags |= 0x01; spawn_objects_from_info(0, gMarioSpawnInfo); @@ -293,11 +297,16 @@ void change_area(s32 index) { load_area(index); gCurrentArea->flags = areaFlags; - gMarioObject->oActiveParticleFlags = 0; + for (int i = 0; i < MAX_PLAYERS; i++) { + gMarioStates[i].marioObj->oActiveParticleFlags = 0; + } } if (areaFlags & 0x01) { - gMarioObject->header.gfx.unk18 = index, gMarioSpawnInfo->areaIndex = index; + for (int i = 0; i < MAX_PLAYERS; i++) { + gMarioStates[i].marioObj->header.gfx.unk18 = index; + gMarioStates[i].spawnInfo->areaIndex = index; + } } } diff --git a/src/game/level_update.c b/src/game/level_update.c index 80a5a9270..f293343e8 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -36,11 +36,6 @@ #include "pc/configfile.h" #include "pc/network/network.h" -#define WARP_TYPE_NOT_WARPING 0 -#define WARP_TYPE_CHANGE_LEVEL 1 -#define WARP_TYPE_CHANGE_AREA 2 -#define WARP_TYPE_SAME_AREA 3 - #define WARP_NODE_F0 0xF0 #define WARP_NODE_DEATH 0xF1 #define WARP_NODE_F2 0xF2 @@ -548,21 +543,24 @@ void check_instant_warp(void) { struct InstantWarp *warp = &gCurrentArea->instantWarps[index]; if (warp->id != 0) { - gMarioState->pos[0] += warp->displacement[0]; - gMarioState->pos[1] += warp->displacement[1]; - gMarioState->pos[2] += warp->displacement[2]; + for (int i = 0; i < MAX_PLAYERS; i++) { + gMarioStates[i].pos[0] += warp->displacement[0]; + gMarioStates[i].pos[1] += warp->displacement[1]; + gMarioStates[i].pos[2] += warp->displacement[2]; - gMarioState->marioObj->oPosX = gMarioState->pos[0]; - gMarioState->marioObj->oPosY = gMarioState->pos[1]; - gMarioState->marioObj->oPosZ = gMarioState->pos[2]; + gMarioStates[i].marioObj->oPosX = gMarioStates[i].pos[0]; + gMarioStates[i].marioObj->oPosY = gMarioStates[i].pos[1]; + gMarioStates[i].marioObj->oPosZ = gMarioStates[i].pos[2]; + } cameraAngle = gMarioState->area->camera->yaw; - change_area(warp->area); - gMarioState->area = gCurrentArea; + + for (int i = 0; i < MAX_PLAYERS; i++) { + gMarioStates[i].area = gCurrentArea; + } warp_camera(warp->displacement[0], warp->displacement[1], warp->displacement[2]); - gMarioState->area->camera->yaw = cameraAngle; } } @@ -1011,13 +1009,19 @@ s32 play_mode_normal(void) { // warp, change play mode accordingly. if (sCurrPlayMode == PLAY_MODE_NORMAL) { if (sWarpDest.type == WARP_TYPE_CHANGE_LEVEL) { - set_play_mode((networkType != NT_NONE) ? PLAY_MODE_SYNC_LEVEL : PLAY_MODE_CHANGE_LEVEL); - network_send_level_warp(); + if (sWarpDest.type == WARP_TYPE_NOT_WARPING) { + set_play_mode(PLAY_MODE_CHANGE_LEVEL); + } else { + set_play_mode((networkType != NT_NONE) ? PLAY_MODE_SYNC_LEVEL : PLAY_MODE_CHANGE_LEVEL); + network_send_level_warp(); + } } else if (sTransitionTimer != 0) { - //////////////////////////////////// - // todo: synchronize change_area. // - //////////////////////////////////// - set_play_mode(PLAY_MODE_CHANGE_AREA); + if (sWarpDest.type == WARP_TYPE_NOT_WARPING || gCurrentArea->index == sWarpDest.areaIdx) { + set_play_mode(PLAY_MODE_CHANGE_AREA); + } else { + set_play_mode((networkType != NT_NONE) ? PLAY_MODE_SYNC_LEVEL : PLAY_MODE_CHANGE_AREA); + network_send_level_warp(); + } } else if (pressed_pause()) { lower_background_noise(1); cancel_rumble(); @@ -1259,15 +1263,6 @@ s32 init_level(void) { sound_banks_disable(2, 0x0330); } - // set mario/luigi model - for (int i = 0; i < MAX_PLAYERS; i++) { - if (i == 0) { - gMarioState[i].marioObj->header.gfx.sharedChild = gLoadedGraphNodes[(networkType == NT_SERVER) ? MODEL_MARIO : MODEL_LUIGI]; - } else { - gMarioState[i].marioObj->header.gfx.sharedChild = gLoadedGraphNodes[(networkType == NT_SERVER) ? MODEL_LUIGI2 : MODEL_MARIO2]; - } - } - return 1; } diff --git a/src/game/level_update.h b/src/game/level_update.h index 45764822c..cef0a926d 100644 --- a/src/game/level_update.h +++ b/src/game/level_update.h @@ -50,6 +50,10 @@ #define MARIO_SPAWN_LAUNCH_DEATH 0x25 #define MARIO_SPAWN_UNKNOWN_27 0x27 +#define WARP_TYPE_NOT_WARPING 0 +#define WARP_TYPE_CHANGE_LEVEL 1 +#define WARP_TYPE_CHANGE_AREA 2 +#define WARP_TYPE_SAME_AREA 3 struct CreditsEntry { diff --git a/src/game/mario.c b/src/game/mario.c index c08143931..50deae43a 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -35,6 +35,7 @@ #include "thread6.h" #include "pc/configfile.h" #include "pc/cheats.h" +#include "pc/network/network.h" #ifdef BETTERCAMERA #include "bettercamera.h" #endif @@ -1943,6 +1944,13 @@ void init_mario(void) { capObject->oMoveAngleYaw = 0; } + // set mario/luigi model + if (isLocal) { + gMarioState->marioObj->header.gfx.sharedChild = gLoadedGraphNodes[(networkType == NT_SERVER) ? MODEL_MARIO : MODEL_LUIGI]; + } else { + gMarioState->marioObj->header.gfx.sharedChild = gLoadedGraphNodes[(networkType == NT_SERVER) ? MODEL_LUIGI2 : MODEL_MARIO2]; + } + skippy: if (isLocal) { gMarioState = &gMarioStates[1]; diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 781d9e636..c67febd13 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -224,6 +224,7 @@ struct ParticleProperties sParticleTypes[] = { void copy_mario_state_to_object(void) { s32 i = 0; // L is real + // two-player hack if (gCurrentObject != gMarioObject) { i += 1; } diff --git a/src/pc/network/packets/packet_level_warp.c b/src/pc/network/packets/packet_level_warp.c index 4816c4276..d25b8bf0d 100644 --- a/src/pc/network/packets/packet_level_warp.c +++ b/src/pc/network/packets/packet_level_warp.c @@ -26,6 +26,7 @@ void network_receive_level_warp(struct Packet* p) { 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; @@ -38,9 +39,13 @@ void network_receive_level_warp(struct Packet* p) { if (remotePlayMode == PLAY_MODE_SYNC_LEVEL && sCurrPlayMode == PLAY_MODE_SYNC_LEVEL) { if (matchingDest) { - sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL; + 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; } @@ -49,7 +54,11 @@ void network_receive_level_warp(struct Packet* p) { return; } - if (remotePlayMode == PLAY_MODE_CHANGE_LEVEL && sCurrPlayMode == PLAY_MODE_SYNC_LEVEL) { - sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL; + 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; + } } }