diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index ce9260275..96aef33df 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -181,6 +181,7 @@ source_group("Header Files\\soh\\Enhancements\\debugger" FILES ${Header_Files__s set(Header_Files__soh__Enhancements__randomizer "soh/Enhancements/randomizer/randomizer.h" + "soh/Enhancements/randomizer/randomizer_inf.h" "soh/Enhancements/randomizer/randomizer_item_tracker.h" "soh/Enhancements/randomizer/adult_trade_shuffle.h" "soh/Enhancements/randomizer/randomizer_check_objects.h" diff --git a/soh/include/functions.h b/soh/include/functions.h index d3c5cfe2b..9047b6d3f 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -11,6 +11,7 @@ extern "C" #include "../../libultraship/libultraship/luslog.h" #include +#include #if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) @@ -558,6 +559,8 @@ s32 Flags_GetEventChkInf(s32 flag); void Flags_SetEventChkInf(s32 flag); s32 Flags_GetInfTable(s32 flag); void Flags_SetInfTable(s32 flag); +s32 Flags_GetRandomizerInf(RandomizerInf flag); +void Flags_SetRandomizerInf(RandomizerInf flag); u16 func_80037C30(GlobalContext* globalCtx, s16 arg1); s32 func_80037D98(GlobalContext* globalCtx, Actor* actor, s16 arg2, s32* arg3); s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f arg4); diff --git a/soh/include/z64player.h b/soh/include/z64player.h index b910ce3e2..cbee1b440 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -368,7 +368,7 @@ typedef enum { FLAG_SCENE_CLEAR, FLAG_SCENE_COLLECTIBLE, FLAG_EVENT_CHECK_INF, - FLAG_COW_MILKED + FLAG_RANDOMIZER_INF } FlagType; typedef struct { diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 9da18f72e..14da6a2fc 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -5,6 +5,7 @@ #include "z64math.h" #include "z64audio.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" +#include "soh/Enhancements/randomizer/randomizer_inf.h" typedef struct { /* 0x00 */ u8 buttonItems[8]; @@ -182,9 +183,7 @@ typedef struct { char ganonHintText[150]; char ganonText[250]; u8 seedIcons[5]; - u8 dungeonsDone[8]; - u8 trialsDone[6]; - u8 cowsMilked[10]; + u16 randomizerInf[2]; u8 temporaryWeapon; u16 adultTradeItems; } SaveContext; // size = 0x1428 diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h new file mode 100644 index 000000000..e5f41a5d3 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -0,0 +1,35 @@ +#pragma once + +typedef enum { + RAND_INF_DUNGEONS_DONE_DEKU_TREE, + RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN, + RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY, + RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE, + RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE, + RAND_INF_DUNGEONS_DONE_WATER_TEMPLE, + RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, + RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, + + RAND_INF_TRIALS_DONE_LIGHT_TRIAL, + RAND_INF_TRIALS_DONE_FOREST_TRIAL, + RAND_INF_TRIALS_DONE_FIRE_TRIAL, + RAND_INF_TRIALS_DONE_WATER_TRIAL, + RAND_INF_TRIALS_DONE_SPIRIT_TRIAL, + RAND_INF_TRIALS_DONE_SHADOW_TRIAL, + + RAND_INF_COWS_MILKED_LINKS_HOUSE_COW, + RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, + RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, + RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, + RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, + RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, + RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, + RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, + RAND_INF_COWS_MILKED_GV_COW, + RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, + RAND_INF_COWS_MILKED_HF_COW_GROTTO_GOSSIP_STONE, + + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) + + RAND_INF_MAX, +} RandomizerInf; diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index e8f73d0c5..8d8e7cd77 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -758,15 +758,8 @@ void SaveManager::LoadBaseVersion1() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->LoadArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); }); } @@ -922,15 +915,8 @@ void SaveManager::LoadBaseVersion2() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->LoadArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); }); } @@ -1082,15 +1068,8 @@ void SaveManager::SaveBase() { SaveManager::Instance->SaveData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->SaveArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->SaveData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->SaveArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->SaveData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->SaveArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->SaveData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->SaveArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->SaveData("", gSaveContext.randomizerInf[i]); }); } diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index bf34412cb..5d7add53a 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -4705,6 +4705,20 @@ void Flags_SetInfTable(s32 flag) { gSaveContext.infTable[flag >> 4] |= (1 << (flag & 0xF)); } +/** + * Tests if "randomizerInf" flag is set. + */ +s32 Flags_GetRandomizerInf(RandomizerInf flag) { + return gSaveContext.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); +} + +/** + * Sets "randomizerInf" flag. + */ +void Flags_SetRandomizerInf(RandomizerInf flag) { + gSaveContext.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); +} + u32 func_80035BFC(GlobalContext* globalCtx, s16 arg1) { u16 retTextId = 0; diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 8d23e42eb..f99df9cc1 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -3,6 +3,7 @@ #include #include +#include #define NUM_DUNGEONS 8 #define NUM_TRIALS 6 @@ -702,19 +703,9 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { fileChooseCtx->n64ddFlag = 1; gSaveContext.n64ddFlag = 1; - // Sets all the dungeons to incomplete when generating a rando save. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/82 - for (u8 i = 0; i < NUM_DUNGEONS; i++) { - gSaveContext.dungeonsDone[i] = 0; - } - - // Sets all Ganon's Trials to incomplete when generating a rando save. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/131 - for (u8 i = 0; i < NUM_TRIALS; i++) { - gSaveContext.trialsDone[i] = 0; - } - - // Sets all cows to unmilked when generating a rando save. - for (u8 i = 0; i < NUM_COWS; i++) { - gSaveContext.cowsMilked[i] = 0; + // Sets all rando flags to false + for (s32 i = 0; i < RAND_INF_MAX; i++) { + gSaveContext.randomizerInf[i] = 0; } // Set Cutscene flags to skip them diff --git a/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c b/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c index 9e46c39ef..e3539aaf7 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c +++ b/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c @@ -132,35 +132,35 @@ u8 CheckMedallionCount() { u8 CheckDungeonCount() { u8 dungeonCount = 0; - if (gSaveContext.dungeonsDone[0] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[1] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[2] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[3] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[4] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[5] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[6] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[7] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) { dungeonCount++; } diff --git a/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c b/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c index 5c20fa602..713314002 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c @@ -152,7 +152,7 @@ void BgSpot06Objects_Init(Actor* thisx, GlobalContext* globalCtx) { if (LINK_IS_ADULT && ((!gSaveContext.n64ddFlag && !(gSaveContext.eventChkInf[6] & 0x200)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[5]))) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)))) { if (gSaveContext.sceneSetupIndex < 4) { this->lakeHyliaWaterLevel = -681.0f; globalCtx->colCtx.colHeader->waterBoxes[LHWB_GERUDO_VALLEY_RIVER_LOWER].ySurface = diff --git a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c index 46ecf5979..adc534a2d 100644 --- a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c +++ b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c @@ -76,27 +76,27 @@ s32 DemoKekkai_CheckEventFlag(s32 params) { u32 TrialsDoneCount() { u8 trialCount = 0; - if (gSaveContext.trialsDone[0] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[1] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_FOREST_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[2] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_FIRE_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[3] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_WATER_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[4] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_SPIRIT_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[5] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_SHADOW_TRIAL)) { trialCount++; } @@ -249,22 +249,22 @@ void DemoKekkai_TrialBarrierDispel(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { switch (thisx->params) { case KEKKAI_WATER: - gSaveContext.trialsDone[2] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_WATER_TRIAL); break; case KEKKAI_LIGHT: - gSaveContext.trialsDone[5] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL); break; case KEKKAI_FIRE: - gSaveContext.trialsDone[1] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_FIRE_TRIAL); break; case KEKKAI_SHADOW: - gSaveContext.trialsDone[3] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_SHADOW_TRIAL); break; case KEKKAI_SPIRIT: - gSaveContext.trialsDone[4] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_SPIRIT_TRIAL); break; case KEKKAI_FOREST: - gSaveContext.trialsDone[0] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_FOREST_TRIAL); break; } Flags_SetEventChkInf(eventFlags[thisx->params]); diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 5130f1ca8..e372d3291 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -546,7 +546,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (globalCtx->sceneNum == SCENE_DDAN_BOSS) { if (!Flags_GetEventChkInf(0x25)) { Flags_SetEventChkInf(0x25); - gSaveContext.dungeonsDone[0] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x47A; gSaveContext.nextCutsceneIndex = 0; @@ -563,7 +563,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (!Flags_GetEventChkInf(7) || gSaveContext.n64ddFlag) { Flags_SetEventChkInf(7); Flags_SetEventChkInf(9); - gSaveContext.dungeonsDone[1] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x0457; gSaveContext.nextCutsceneIndex = 0; @@ -671,7 +671,7 @@ void DoorWarp1_RutoWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF) { gSaveContext.eventChkInf[3] |= 0x80; - gSaveContext.dungeonsDone[2] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x10E; @@ -785,7 +785,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (globalCtx->sceneNum == SCENE_MORIBOSSROOM) { if (!(gSaveContext.eventChkInf[4] & 0x100)) { gSaveContext.eventChkInf[4] |= 0x100; - gSaveContext.dungeonsDone[3] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x608; @@ -807,7 +807,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } else if (globalCtx->sceneNum == SCENE_FIRE_BS) { if (!(gSaveContext.eventChkInf[4] & 0x200)) { gSaveContext.eventChkInf[4] |= 0x200; - gSaveContext.dungeonsDone[4] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x564; @@ -828,7 +828,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } else if (globalCtx->sceneNum == SCENE_MIZUSIN_BS) { if (!(gSaveContext.eventChkInf[4] & 0x400)) { gSaveContext.eventChkInf[4] |= 0x400; - gSaveContext.dungeonsDone[5] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x60C; @@ -849,7 +849,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } } else if (globalCtx->sceneNum == SCENE_JYASINBOSS) { if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) || gSaveContext.n64ddFlag) { - gSaveContext.dungeonsDone[6] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x610; @@ -870,7 +870,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } } else if (globalCtx->sceneNum == SCENE_HAKADAN_BS) { if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) || gSaveContext.n64ddFlag) { - gSaveContext.dungeonsDone[7] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x580; diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c index 3a687f41d..3572de01c 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c @@ -218,51 +218,51 @@ void func_809DF730(EnCow* this, GlobalContext* globalCtx) { CowInfo EnCow_GetInfo(EnCow* this, GlobalContext* globalCtx) { struct CowInfo cowInfo; - cowInfo.cowId = -1; + cowInfo.randomizerInf = -1; cowInfo.randomizerCheck = RC_UNKNOWN_CHECK; switch (globalCtx->sceneNum) { case SCENE_SOUKO: // Lon Lon Tower if (this->actor.world.pos.x == -229 && this->actor.world.pos.z == 157) { - cowInfo.cowId = 0; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW; cowInfo.randomizerCheck = RC_LLR_TOWER_LEFT_COW; } else if (this->actor.world.pos.x == -142 && this->actor.world.pos.z == -140) { - cowInfo.cowId = 1; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW; cowInfo.randomizerCheck = RC_LLR_TOWER_RIGHT_COW; } break; case SCENE_MALON_STABLE: if (this->actor.world.pos.x == 116 && this->actor.world.pos.z == -254) { - cowInfo.cowId = 2; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW; cowInfo.randomizerCheck = RC_LLR_STABLES_RIGHT_COW; } else if (this->actor.world.pos.x == -122 && this->actor.world.pos.z == -254) { - cowInfo.cowId = 3; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW; cowInfo.randomizerCheck = RC_LLR_STABLES_LEFT_COW; } break; case SCENE_KAKUSIANA: // Grotto if (this->actor.world.pos.x == 2444 && this->actor.world.pos.z == -471) { - cowInfo.cowId = 4; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW; cowInfo.randomizerCheck = RC_DMT_COW_GROTTO_COW; } else if (this->actor.world.pos.x == 3485 && this->actor.world.pos.z == -291) { - cowInfo.cowId = 5; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW; cowInfo.randomizerCheck = RC_HF_COW_GROTTO_COW; } break; case SCENE_LINK_HOME: - cowInfo.cowId = 6; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LINKS_HOUSE_COW; cowInfo.randomizerCheck = RC_KF_LINKS_HOUSE_COW; break; case SCENE_LABO: // Impa's house - cowInfo.cowId = 7; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW; cowInfo.randomizerCheck = RC_KAK_IMPAS_HOUSE_COW; break; case SCENE_SPOT09: // Gerudo Valley - cowInfo.cowId = 8; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_GV_COW; cowInfo.randomizerCheck = RC_GV_COW; break; - case SCENE_SPOT08: // Jabu's Belly - cowInfo.cowId = 9; + case SCENE_BDAN: // Jabu's Belly + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW; cowInfo.randomizerCheck = RC_JABU_JABUS_BELLY_MQ_COW; break; } @@ -290,8 +290,8 @@ void EnCow_MoveForRandomizer(EnCow* this, GlobalContext* globalCtx) { void EnCow_SetCowMilked(EnCow* this, GlobalContext* globalCtx) { CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); Player* player = GET_PLAYER(globalCtx); - player->pendingFlag.flagID = cowInfo.cowId; - player->pendingFlag.flagType = FLAG_COW_MILKED; + player->pendingFlag.flagID = cowInfo.randomizerInf; + player->pendingFlag.flagType = FLAG_RANDOMIZER_INF; } void func_809DF778(EnCow* this, GlobalContext* globalCtx) { @@ -337,7 +337,7 @@ void func_809DF8FC(EnCow* this, GlobalContext* globalCtx) { bool EnCow_HasBeenMilked(EnCow* this, GlobalContext* globalCtx) { CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); - return gSaveContext.cowsMilked[cowInfo.cowId]; + return Flags_GetRandomizerInf(cowInfo.randomizerInf); } void EnCow_GivePlayerRandomizedItem(EnCow* this, GlobalContext* globalCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h index a5c66f1da..7367f470c 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h @@ -22,7 +22,7 @@ typedef struct EnCow { } EnCow; // size = 0x0280 typedef struct CowInfo { - int cowId; + RandomizerInf randomizerInf; RandomizerCheck randomizerCheck; } CowInfo; diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index 389b1b145..58124ef23 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -114,7 +114,7 @@ u16 EnGo_GetTextID(GlobalContext* globalCtx, Actor* thisx) { } case 0x00: if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) { if (gSaveContext.infTable[16] & 0x8000) { return 0x3042; } else { diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index 175335a0d..9f6ff147e 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -416,10 +416,10 @@ s16 EnGo2_GetStateGoronDmtRollingSmall(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronDmtDcEntrance(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.eventChkInf[2] & 0x8 ? 0x3021 : gSaveContext.infTable[14] & 0x1 ? 0x302A : 0x3008; @@ -439,10 +439,10 @@ s16 EnGo2_GetStateGoronDmtDcEntrance(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityEntrance(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.infTable[15] & 0x1 ? 0x3015 : 0x3014; @@ -462,10 +462,10 @@ s16 EnGo2_GetStateGoronCityEntrance(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityIsland(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.infTable[15] & 0x10 ? 0x3017 : 0x3016; @@ -485,10 +485,10 @@ s16 EnGo2_GetStateGoronCityIsland(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityLowestFloor(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return CUR_UPG_VALUE(UPG_STRENGTH) != 0 ? 0x302C @@ -1589,7 +1589,7 @@ void EnGo2_Init(Actor* thisx, GlobalContext* globalCtx) { case GORON_CITY_STAIRWELL: case GORON_CITY_LOST_WOODS: if (((!gSaveContext.n64ddFlag && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { Actor_Kill(&this->actor); } this->actionFunc = EnGo2_CurledUp; diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index da73fd634..96aebbef6 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -73,7 +73,7 @@ static AnimationInfo sAnimationInfo[] = { u16 EnKz_GetTextNoMaskChild(GlobalContext* globalCtx, EnKz* this) { Player* player = GET_PLAYER(globalCtx); - if ((gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[2]) || + if ((gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) || (!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE))) { return 0x402B; } else if (gSaveContext.eventChkInf[3] & 8) { diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index ffb02e8d2..83252a27e 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -373,7 +373,7 @@ u16 EnMd_GetTextKokiriForest(GlobalContext* globalCtx, EnMd* this) { this->unk_209 = TEXT_STATE_NONE; if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[1])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE))) { return 0x1045; } @@ -486,7 +486,7 @@ u8 EnMd_ShouldSpawn(EnMd* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { // if we have beaten deku tree or have open forest turned on // or have already shown mido we have an equipped sword/shield - if (gSaveContext.dungeonsDone[1] || + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE) || Randomizer_GetSettingValue(RSK_FOREST) == 1 || gSaveContext.eventChkInf[0] & 0x10) { return 0; diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index 1e154ef3b..2ba2a1478 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -518,7 +518,7 @@ void EnOssan_TalkGoronShopkeeper(GlobalContext* globalCtx) { Message_ContinueTextbox(globalCtx, 0x300F); } } else if ((!gSaveContext.n64ddFlag && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[4])) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) { Message_ContinueTextbox(globalCtx, 0x3057); } else { Message_ContinueTextbox(globalCtx, 0x305B); diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index a3ad987be..2631e39b9 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6083,8 +6083,8 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { case FLAG_SCENE_TREASURE: Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); break; - case FLAG_COW_MILKED: - gSaveContext.cowsMilked[this->pendingFlag.flagID] = 1; + case FLAG_RANDOMIZER_INF: + Flags_SetRandomizerInf(this->pendingFlag.flagID); break; case FLAG_EVENT_CHECK_INF: Flags_SetEventChkInf(this->pendingFlag.flagID);