diff --git a/soh/soh/Network/Anchor/Packets/SetFlag.cpp b/soh/soh/Network/Anchor/Packets/SetFlag.cpp index c4501a0814..a3bec14c50 100644 --- a/soh/soh/Network/Anchor/Packets/SetFlag.cpp +++ b/soh/soh/Network/Anchor/Packets/SetFlag.cpp @@ -71,6 +71,11 @@ void Anchor::HandlePacket_SetFlag(nlohmann::json payload) { return; } + // Special case: Ignore Tower Collapse timer start. + if (sceneNum == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR && flagType == FLAG_SCENE_SWITCH && flag == 0x36) { + return; + } + auto effect = new GameInteractionEffect::SetSceneFlag(); effect->parameters[0] = sceneNum; effect->parameters[1] = flagType; diff --git a/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp b/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp index 2eedaf8465..095514f483 100644 --- a/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp +++ b/soh/soh/Network/Anchor/Packets/UpdateTeamState.cpp @@ -160,6 +160,13 @@ void Anchor::HandlePacket_UpdateTeamState(nlohmann::json payload) { (loadedData.sceneFlags[i].swch & ~mask) | (gSaveContext.sceneFlags[i].swch & mask); } + if (i == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) { + // Keep collapse timer flag + u32 mask = (1 << 0x36); + loadedData.sceneFlags[i].swch = + (loadedData.sceneFlags[i].swch & ~mask) | (gSaveContext.sceneFlags[i].swch & mask); + } + gSaveContext.sceneFlags[i] = loadedData.sceneFlags[i]; if (IsSaveLoaded() && gPlayState->sceneNum == i) { gPlayState->actorCtx.flags.chest = loadedData.sceneFlags[i].chest; @@ -170,24 +177,24 @@ void Anchor::HandlePacket_UpdateTeamState(nlohmann::json payload) { } for (int i = 0; i < 14; i++) { - gSaveContext.eventChkInf[i] = loadedData.eventChkInf[i]; + gSaveContext.eventChkInf[i] |= loadedData.eventChkInf[i]; } for (int i = 0; i < 4; i++) { - gSaveContext.itemGetInf[i] = loadedData.itemGetInf[i]; + gSaveContext.itemGetInf[i] |= loadedData.itemGetInf[i]; } // Skip last row of infTable, don't want to sync swordless flag for (int i = 0; i < 29; i++) { - gSaveContext.infTable[i] = loadedData.infTable[i]; + gSaveContext.infTable[i] |= loadedData.infTable[i]; } for (int i = 0; i < ceil((RAND_INF_MAX + 15) / 16); i++) { - gSaveContext.ship.randomizerInf[i] = loadedData.ship.randomizerInf[i]; + gSaveContext.ship.randomizerInf[i] |= loadedData.ship.randomizerInf[i]; } for (int i = 0; i < 6; i++) { - gSaveContext.gsFlags[i] = loadedData.gsFlags[i]; + gSaveContext.gsFlags[i] |= loadedData.gsFlags[i]; } gSaveContext.ship.stats.firstInput = loadedData.ship.stats.firstInput;