Co op syncing and tower collapse softlock fixes. (#6684)

We now have both tower collapse corrected, and other potential softlocks and bugs that would occur from weird network timing causing an UNSET of values in the game with these fixes.
This commit is contained in:
Amber Burton
2026-06-11 23:01:10 -04:00
committed by GitHub
parent 255ea2da26
commit 319207e795
2 changed files with 17 additions and 5 deletions
@@ -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;
@@ -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;