mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-12-18 06:12:20 -05:00
Fix temp flags transfering in dungeon chains and various issues with voidouts in mixed entrances (#4637)
This commit is contained in:
parent
de6f5d8b65
commit
6470522a02
@ -281,6 +281,9 @@ typedef enum {
|
|||||||
VB_SPAWN_BLUE_WARP,
|
VB_SPAWN_BLUE_WARP,
|
||||||
// Vanilla condition: this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF
|
// Vanilla condition: this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF
|
||||||
VB_BLUE_WARP_APPLY_ENTRANCE_AND_CUTSCENE,
|
VB_BLUE_WARP_APPLY_ENTRANCE_AND_CUTSCENE,
|
||||||
|
// Vanilla condition: SurfaceType_GetSlope(&play->colCtx, poly, bgId) == 2
|
||||||
|
// Opt: int (original next entrance index)
|
||||||
|
VB_SET_VOIDOUT_FROM_SURFACE,
|
||||||
// Vanilla condition: this->collider.base.acFlags & 2
|
// Vanilla condition: this->collider.base.acFlags & 2
|
||||||
VB_BG_BREAKWALL_BREAK,
|
VB_BG_BREAKWALL_BREAK,
|
||||||
// Vanilla condition: true
|
// Vanilla condition: true
|
||||||
|
@ -1558,6 +1558,40 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||||||
*should = !Flags_GetInfTable(INFTABLE_145) || Flags_GetInfTable(INFTABLE_146);
|
*should = !Flags_GetInfTable(INFTABLE_145) || Flags_GetInfTable(INFTABLE_146);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case VB_SET_VOIDOUT_FROM_SURFACE: {
|
||||||
|
// ENTRTODO: Move all entrance rando handling to a dedicated file
|
||||||
|
std::vector<s16> entrPersistTempFlags = {
|
||||||
|
ENTR_DEKU_TREE_BOSS_ENTRANCE, ENTR_DEKU_TREE_BOSS_DOOR, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE,
|
||||||
|
ENTR_DODONGOS_CAVERN_BOSS_DOOR, ENTR_JABU_JABU_BOSS_ENTRANCE, ENTR_JABU_JABU_BOSS_DOOR,
|
||||||
|
ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, ENTR_FOREST_TEMPLE_BOSS_DOOR, ENTR_FIRE_TEMPLE_BOSS_ENTRANCE,
|
||||||
|
ENTR_FIRE_TEMPLE_BOSS_DOOR, ENTR_WATER_TEMPLE_BOSS_ENTRANCE, ENTR_WATER_TEMPLE_BOSS_DOOR,
|
||||||
|
ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, ENTR_SPIRIT_TEMPLE_BOSS_DOOR, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE,
|
||||||
|
ENTR_SHADOW_TEMPLE_BOSS_DOOR, ENTR_SPIRIT_TEMPLE_ENTRANCE,
|
||||||
|
};
|
||||||
|
|
||||||
|
s16 originalEntrance = (s16)va_arg(args, int);
|
||||||
|
|
||||||
|
// In Entrance rando, if our respawnFlag is set for a grotto return, we don't want the void out to happen
|
||||||
|
if (*should == true && RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES)) {
|
||||||
|
// Check for dungeon special entrances that are randomized to a new location
|
||||||
|
if (std::find(entrPersistTempFlags.begin(), entrPersistTempFlags.end(), originalEntrance) !=
|
||||||
|
entrPersistTempFlags.end() && originalEntrance != gPlayState->nextEntranceIndex) {
|
||||||
|
// Normally dungeons use a special voidout between scenes so that entering/exiting a boss room,
|
||||||
|
// or leaving via Spirit Hands and going back in persist temp flags across scenes.
|
||||||
|
// For ER, the temp flags should be wiped out so that they aren't transferred to the new location.
|
||||||
|
gPlayState->actorCtx.flags.tempSwch = 0;
|
||||||
|
gPlayState->actorCtx.flags.tempCollect = 0;
|
||||||
|
|
||||||
|
// If the respawnFlag is set for a grotto return, we don't want the void out to happen.
|
||||||
|
// Set the data flag to one to prevent the respawn point from being overriden by dungeon doors.
|
||||||
|
if (gSaveContext.respawnFlag == 2) {
|
||||||
|
gSaveContext.respawn[RESPAWN_MODE_DOWN].data = 1;
|
||||||
|
*should = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case VB_FREEZE_ON_SKULL_TOKEN:
|
case VB_FREEZE_ON_SKULL_TOKEN:
|
||||||
case VB_TRADE_TIMER_ODD_MUSHROOM:
|
case VB_TRADE_TIMER_ODD_MUSHROOM:
|
||||||
case VB_TRADE_TIMER_FROG:
|
case VB_TRADE_TIMER_FROG:
|
||||||
@ -1623,6 +1657,7 @@ void RandomizerOnSceneInitHandler(int16_t sceneNum) {
|
|||||||
CheckTracker::RecalculateAllAreaTotals();
|
CheckTracker::RecalculateAllAreaTotals();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ENTRTODO: Move all entrance rando handling to a dedicated file
|
||||||
if (RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES)) {
|
if (RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES)) {
|
||||||
// In ER, override roomNum to load based on scene and spawn during scene init
|
// In ER, override roomNum to load based on scene and spawn during scene init
|
||||||
if (gSaveContext.respawnFlag <= 0) {
|
if (gSaveContext.respawnFlag <= 0) {
|
||||||
@ -2336,6 +2371,7 @@ void RandomizerRegisterHooks() {
|
|||||||
|
|
||||||
if (!IS_RANDO) return;
|
if (!IS_RANDO) return;
|
||||||
|
|
||||||
|
// ENTRTODO: Move all entrance rando handling to a dedicated file
|
||||||
// Setup the modified entrance table and entrance shuffle table for rando
|
// Setup the modified entrance table and entrance shuffle table for rando
|
||||||
Entrance_Init();
|
Entrance_Init();
|
||||||
|
|
||||||
|
@ -267,13 +267,6 @@ s16 Entrance_PeekNextIndexOverride(int16_t nextEntranceIndex) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
s16 Entrance_OverrideNextIndex(s16 nextEntranceIndex) {
|
s16 Entrance_OverrideNextIndex(s16 nextEntranceIndex) {
|
||||||
// When entering Spirit Temple, clear temp flags so they don't carry over to the randomized dungeon
|
|
||||||
if (nextEntranceIndex == ENTR_SPIRIT_TEMPLE_ENTRANCE && Entrance_GetOverride(nextEntranceIndex) != nextEntranceIndex &&
|
|
||||||
gPlayState != NULL) {
|
|
||||||
gPlayState->actorCtx.flags.tempSwch = 0;
|
|
||||||
gPlayState->actorCtx.flags.tempCollect = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exiting through the crawl space from Hyrule Castle courtyard is the same exit as leaving Ganon's castle
|
// Exiting through the crawl space from Hyrule Castle courtyard is the same exit as leaving Ganon's castle
|
||||||
// Don't override the entrance if we came from the Castle courtyard (day and night scenes)
|
// Don't override the entrance if we came from the Castle courtyard (day and night scenes)
|
||||||
if (gPlayState != NULL && (gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_DAY || gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_NIGHT) &&
|
if (gPlayState != NULL && (gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_DAY || gPlayState->sceneNum == SCENE_CASTLE_COURTYARD_GUARDS_NIGHT) &&
|
||||||
|
@ -5145,9 +5145,9 @@ s32 Player_HandleExitsAndVoids(PlayState* play, Player* this, CollisionPoly* pol
|
|||||||
|
|
||||||
Scene_SetTransitionForNextEntrance(play);
|
Scene_SetTransitionForNextEntrance(play);
|
||||||
} else {
|
} else {
|
||||||
// In Entrance rando, if our respawnFlag is set for a grotto return, we don't want the void out to happen
|
if (GameInteractor_Should(VB_SET_VOIDOUT_FROM_SURFACE,
|
||||||
if (SurfaceType_GetSlope(&play->colCtx, poly, bgId) == 2 &&
|
SurfaceType_GetSlope(&play->colCtx, poly, bgId) == 2,
|
||||||
(!IS_RANDO || (Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES) && gSaveContext.respawnFlag != 2))) {
|
play->setupExitList[exitIndex - 1])) {
|
||||||
gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = play->nextEntranceIndex;
|
gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = play->nextEntranceIndex;
|
||||||
Play_TriggerVoidOut(play);
|
Play_TriggerVoidOut(play);
|
||||||
gSaveContext.respawnFlag = -2;
|
gSaveContext.respawnFlag = -2;
|
||||||
|
Loading…
Reference in New Issue
Block a user