Merge pull request #1312 from garrettjoecox/randomizer-inf

Transition to randomizerInf flags
This commit is contained in:
briaguya 2022-08-25 12:19:55 -04:00 committed by GitHub
commit 8a4c196566
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 127 additions and 105 deletions

View File

@ -181,6 +181,7 @@ source_group("Header Files\\soh\\Enhancements\\debugger" FILES ${Header_Files__s
set(Header_Files__soh__Enhancements__randomizer set(Header_Files__soh__Enhancements__randomizer
"soh/Enhancements/randomizer/randomizer.h" "soh/Enhancements/randomizer/randomizer.h"
"soh/Enhancements/randomizer/randomizer_inf.h"
"soh/Enhancements/randomizer/randomizer_item_tracker.h" "soh/Enhancements/randomizer/randomizer_item_tracker.h"
"soh/Enhancements/randomizer/adult_trade_shuffle.h" "soh/Enhancements/randomizer/adult_trade_shuffle.h"
"soh/Enhancements/randomizer/randomizer_check_objects.h" "soh/Enhancements/randomizer/randomizer_check_objects.h"

View File

@ -11,6 +11,7 @@ extern "C"
#include "../../libultraship/libultraship/luslog.h" #include "../../libultraship/libultraship/luslog.h"
#include <soh/Enhancements/item-tables/ItemTableTypes.h> #include <soh/Enhancements/item-tables/ItemTableTypes.h>
#include <soh/Enhancements/randomizer/randomizer_inf.h>
#if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG) #if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG)
#define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__)
@ -558,6 +559,8 @@ s32 Flags_GetEventChkInf(s32 flag);
void Flags_SetEventChkInf(s32 flag); void Flags_SetEventChkInf(s32 flag);
s32 Flags_GetInfTable(s32 flag); s32 Flags_GetInfTable(s32 flag);
void Flags_SetInfTable(s32 flag); void Flags_SetInfTable(s32 flag);
s32 Flags_GetRandomizerInf(RandomizerInf flag);
void Flags_SetRandomizerInf(RandomizerInf flag);
u16 func_80037C30(GlobalContext* globalCtx, s16 arg1); u16 func_80037C30(GlobalContext* globalCtx, s16 arg1);
s32 func_80037D98(GlobalContext* globalCtx, Actor* actor, s16 arg2, s32* arg3); s32 func_80037D98(GlobalContext* globalCtx, Actor* actor, s16 arg2, s32* arg3);
s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f arg4); s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f arg4);

View File

@ -368,7 +368,7 @@ typedef enum {
FLAG_SCENE_CLEAR, FLAG_SCENE_CLEAR,
FLAG_SCENE_COLLECTIBLE, FLAG_SCENE_COLLECTIBLE,
FLAG_EVENT_CHECK_INF, FLAG_EVENT_CHECK_INF,
FLAG_COW_MILKED FLAG_RANDOMIZER_INF
} FlagType; } FlagType;
typedef struct { typedef struct {

View File

@ -5,6 +5,7 @@
#include "z64math.h" #include "z64math.h"
#include "z64audio.h" #include "z64audio.h"
#include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/randomizer/randomizerTypes.h"
#include "soh/Enhancements/randomizer/randomizer_inf.h"
typedef struct { typedef struct {
/* 0x00 */ u8 buttonItems[8]; /* 0x00 */ u8 buttonItems[8];
@ -182,9 +183,7 @@ typedef struct {
char ganonHintText[150]; char ganonHintText[150];
char ganonText[250]; char ganonText[250];
u8 seedIcons[5]; u8 seedIcons[5];
u8 dungeonsDone[8]; u16 randomizerInf[2];
u8 trialsDone[6];
u8 cowsMilked[10];
u8 temporaryWeapon; u8 temporaryWeapon;
u16 adultTradeItems; u16 adultTradeItems;
} SaveContext; // size = 0x1428 } SaveContext; // size = 0x1428

View File

@ -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;

View File

@ -758,15 +758,8 @@ void SaveManager::LoadBaseVersion1() {
SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle);
}); });
SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) {
SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[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]);
}); });
} }
@ -922,15 +915,8 @@ void SaveManager::LoadBaseVersion2() {
SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle);
}); });
SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) {
SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[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]);
}); });
} }
@ -1082,15 +1068,8 @@ void SaveManager::SaveBase() {
SaveManager::Instance->SaveData("angle", gSaveContext.horseData.angle); SaveManager::Instance->SaveData("angle", gSaveContext.horseData.angle);
}); });
SaveManager::Instance->SaveArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { SaveManager::Instance->SaveArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) {
SaveManager::Instance->SaveData("", gSaveContext.dungeonsDone[i]); SaveManager::Instance->SaveData("", gSaveContext.randomizerInf[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]);
}); });
} }

View File

@ -4705,6 +4705,20 @@ void Flags_SetInfTable(s32 flag) {
gSaveContext.infTable[flag >> 4] |= (1 << (flag & 0xF)); 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) { u32 func_80035BFC(GlobalContext* globalCtx, s16 arg1) {
u16 retTextId = 0; u16 retTextId = 0;

View File

@ -3,6 +3,7 @@
#include <string.h> #include <string.h>
#include <soh/Enhancements/randomizer/randomizerTypes.h> #include <soh/Enhancements/randomizer/randomizerTypes.h>
#include <soh/Enhancements/randomizer/randomizer_inf.h>
#define NUM_DUNGEONS 8 #define NUM_DUNGEONS 8
#define NUM_TRIALS 6 #define NUM_TRIALS 6
@ -702,19 +703,9 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
fileChooseCtx->n64ddFlag = 1; fileChooseCtx->n64ddFlag = 1;
gSaveContext.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 // Sets all rando flags to false
for (u8 i = 0; i < NUM_DUNGEONS; i++) { for (s32 i = 0; i < ARRAY_COUNT(gSaveContext.randomizerInf); i++) {
gSaveContext.dungeonsDone[i] = 0; gSaveContext.randomizerInf[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;
} }
// Set Cutscene flags to skip them // Set Cutscene flags to skip them

View File

@ -132,35 +132,35 @@ u8 CheckMedallionCount() {
u8 CheckDungeonCount() { u8 CheckDungeonCount() {
u8 dungeonCount = 0; u8 dungeonCount = 0;
if (gSaveContext.dungeonsDone[0] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[1] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[2] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[3] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[4] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[5] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[6] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[7] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }

View File

@ -152,7 +152,7 @@ void BgSpot06Objects_Init(Actor* thisx, GlobalContext* globalCtx) {
if (LINK_IS_ADULT && if (LINK_IS_ADULT &&
((!gSaveContext.n64ddFlag && !(gSaveContext.eventChkInf[6] & 0x200)) || ((!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) { if (gSaveContext.sceneSetupIndex < 4) {
this->lakeHyliaWaterLevel = -681.0f; this->lakeHyliaWaterLevel = -681.0f;
globalCtx->colCtx.colHeader->waterBoxes[LHWB_GERUDO_VALLEY_RIVER_LOWER].ySurface = globalCtx->colCtx.colHeader->waterBoxes[LHWB_GERUDO_VALLEY_RIVER_LOWER].ySurface =

View File

@ -76,27 +76,27 @@ s32 DemoKekkai_CheckEventFlag(s32 params) {
u32 TrialsDoneCount() { u32 TrialsDoneCount() {
u8 trialCount = 0; u8 trialCount = 0;
if (gSaveContext.trialsDone[0] == 1) { if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL)) {
trialCount++; trialCount++;
} }
if (gSaveContext.trialsDone[1] == 1) { if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_FOREST_TRIAL)) {
trialCount++; trialCount++;
} }
if (gSaveContext.trialsDone[2] == 1) { if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_FIRE_TRIAL)) {
trialCount++; trialCount++;
} }
if (gSaveContext.trialsDone[3] == 1) { if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_WATER_TRIAL)) {
trialCount++; trialCount++;
} }
if (gSaveContext.trialsDone[4] == 1) { if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_SPIRIT_TRIAL)) {
trialCount++; trialCount++;
} }
if (gSaveContext.trialsDone[5] == 1) { if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_SHADOW_TRIAL)) {
trialCount++; trialCount++;
} }
@ -249,22 +249,22 @@ void DemoKekkai_TrialBarrierDispel(Actor* thisx, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
switch (thisx->params) { switch (thisx->params) {
case KEKKAI_WATER: case KEKKAI_WATER:
gSaveContext.trialsDone[2] = 1; Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_WATER_TRIAL);
break; break;
case KEKKAI_LIGHT: case KEKKAI_LIGHT:
gSaveContext.trialsDone[5] = 1; Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL);
break; break;
case KEKKAI_FIRE: case KEKKAI_FIRE:
gSaveContext.trialsDone[1] = 1; Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_FIRE_TRIAL);
break; break;
case KEKKAI_SHADOW: case KEKKAI_SHADOW:
gSaveContext.trialsDone[3] = 1; Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_SHADOW_TRIAL);
break; break;
case KEKKAI_SPIRIT: case KEKKAI_SPIRIT:
gSaveContext.trialsDone[4] = 1; Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_SPIRIT_TRIAL);
break; break;
case KEKKAI_FOREST: case KEKKAI_FOREST:
gSaveContext.trialsDone[0] = 1; Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_FOREST_TRIAL);
break; break;
} }
Flags_SetEventChkInf(eventFlags[thisx->params]); Flags_SetEventChkInf(eventFlags[thisx->params]);

View File

@ -546,7 +546,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
if (globalCtx->sceneNum == SCENE_DDAN_BOSS) { if (globalCtx->sceneNum == SCENE_DDAN_BOSS) {
if (!Flags_GetEventChkInf(0x25)) { if (!Flags_GetEventChkInf(0x25)) {
Flags_SetEventChkInf(0x25); Flags_SetEventChkInf(0x25);
gSaveContext.dungeonsDone[0] = 1; Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x47A; globalCtx->nextEntranceIndex = 0x47A;
gSaveContext.nextCutsceneIndex = 0; gSaveContext.nextCutsceneIndex = 0;
@ -563,7 +563,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
if (!Flags_GetEventChkInf(7) || gSaveContext.n64ddFlag) { if (!Flags_GetEventChkInf(7) || gSaveContext.n64ddFlag) {
Flags_SetEventChkInf(7); Flags_SetEventChkInf(7);
Flags_SetEventChkInf(9); Flags_SetEventChkInf(9);
gSaveContext.dungeonsDone[1] = 1; Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x0457; globalCtx->nextEntranceIndex = 0x0457;
gSaveContext.nextCutsceneIndex = 0; gSaveContext.nextCutsceneIndex = 0;
@ -671,7 +671,7 @@ void DoorWarp1_RutoWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
if (this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF) { if (this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF) {
gSaveContext.eventChkInf[3] |= 0x80; gSaveContext.eventChkInf[3] |= 0x80;
gSaveContext.dungeonsDone[2] = 1; Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x10E; globalCtx->nextEntranceIndex = 0x10E;
@ -785,7 +785,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
if (globalCtx->sceneNum == SCENE_MORIBOSSROOM) { if (globalCtx->sceneNum == SCENE_MORIBOSSROOM) {
if (!(gSaveContext.eventChkInf[4] & 0x100)) { if (!(gSaveContext.eventChkInf[4] & 0x100)) {
gSaveContext.eventChkInf[4] |= 0x100; gSaveContext.eventChkInf[4] |= 0x100;
gSaveContext.dungeonsDone[3] = 1; Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x608; globalCtx->nextEntranceIndex = 0x608;
@ -807,7 +807,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
} else if (globalCtx->sceneNum == SCENE_FIRE_BS) { } else if (globalCtx->sceneNum == SCENE_FIRE_BS) {
if (!(gSaveContext.eventChkInf[4] & 0x200)) { if (!(gSaveContext.eventChkInf[4] & 0x200)) {
gSaveContext.eventChkInf[4] |= 0x200; gSaveContext.eventChkInf[4] |= 0x200;
gSaveContext.dungeonsDone[4] = 1; Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x564; globalCtx->nextEntranceIndex = 0x564;
@ -828,7 +828,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
} else if (globalCtx->sceneNum == SCENE_MIZUSIN_BS) { } else if (globalCtx->sceneNum == SCENE_MIZUSIN_BS) {
if (!(gSaveContext.eventChkInf[4] & 0x400)) { if (!(gSaveContext.eventChkInf[4] & 0x400)) {
gSaveContext.eventChkInf[4] |= 0x400; gSaveContext.eventChkInf[4] |= 0x400;
gSaveContext.dungeonsDone[5] = 1; Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x60C; globalCtx->nextEntranceIndex = 0x60C;
@ -849,7 +849,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
} }
} else if (globalCtx->sceneNum == SCENE_JYASINBOSS) { } else if (globalCtx->sceneNum == SCENE_JYASINBOSS) {
if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) || gSaveContext.n64ddFlag) { if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) || gSaveContext.n64ddFlag) {
gSaveContext.dungeonsDone[6] = 1; Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x610; globalCtx->nextEntranceIndex = 0x610;
@ -870,7 +870,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) {
} }
} else if (globalCtx->sceneNum == SCENE_HAKADAN_BS) { } else if (globalCtx->sceneNum == SCENE_HAKADAN_BS) {
if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) || gSaveContext.n64ddFlag) { if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) || gSaveContext.n64ddFlag) {
gSaveContext.dungeonsDone[7] = 1; Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE);
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x580; globalCtx->nextEntranceIndex = 0x580;

View File

@ -218,51 +218,51 @@ void func_809DF730(EnCow* this, GlobalContext* globalCtx) {
CowInfo EnCow_GetInfo(EnCow* this, GlobalContext* globalCtx) { CowInfo EnCow_GetInfo(EnCow* this, GlobalContext* globalCtx) {
struct CowInfo cowInfo; struct CowInfo cowInfo;
cowInfo.cowId = -1; cowInfo.randomizerInf = -1;
cowInfo.randomizerCheck = RC_UNKNOWN_CHECK; cowInfo.randomizerCheck = RC_UNKNOWN_CHECK;
switch (globalCtx->sceneNum) { switch (globalCtx->sceneNum) {
case SCENE_SOUKO: // Lon Lon Tower case SCENE_SOUKO: // Lon Lon Tower
if (this->actor.world.pos.x == -229 && this->actor.world.pos.z == 157) { 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; cowInfo.randomizerCheck = RC_LLR_TOWER_LEFT_COW;
} else if (this->actor.world.pos.x == -142 && this->actor.world.pos.z == -140) { } 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; cowInfo.randomizerCheck = RC_LLR_TOWER_RIGHT_COW;
} }
break; break;
case SCENE_MALON_STABLE: case SCENE_MALON_STABLE:
if (this->actor.world.pos.x == 116 && this->actor.world.pos.z == -254) { 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; cowInfo.randomizerCheck = RC_LLR_STABLES_RIGHT_COW;
} else if (this->actor.world.pos.x == -122 && this->actor.world.pos.z == -254) { } 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; cowInfo.randomizerCheck = RC_LLR_STABLES_LEFT_COW;
} }
break; break;
case SCENE_KAKUSIANA: // Grotto case SCENE_KAKUSIANA: // Grotto
if (this->actor.world.pos.x == 2444 && this->actor.world.pos.z == -471) { 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; cowInfo.randomizerCheck = RC_DMT_COW_GROTTO_COW;
} else if (this->actor.world.pos.x == 3485 && this->actor.world.pos.z == -291) { } 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; cowInfo.randomizerCheck = RC_HF_COW_GROTTO_COW;
} }
break; break;
case SCENE_LINK_HOME: case SCENE_LINK_HOME:
cowInfo.cowId = 6; cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LINKS_HOUSE_COW;
cowInfo.randomizerCheck = RC_KF_LINKS_HOUSE_COW; cowInfo.randomizerCheck = RC_KF_LINKS_HOUSE_COW;
break; break;
case SCENE_LABO: // Impa's house 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; cowInfo.randomizerCheck = RC_KAK_IMPAS_HOUSE_COW;
break; break;
case SCENE_SPOT09: // Gerudo Valley case SCENE_SPOT09: // Gerudo Valley
cowInfo.cowId = 8; cowInfo.randomizerInf = RAND_INF_COWS_MILKED_GV_COW;
cowInfo.randomizerCheck = RC_GV_COW; cowInfo.randomizerCheck = RC_GV_COW;
break; break;
case SCENE_SPOT08: // Jabu's Belly case SCENE_BDAN: // Jabu's Belly
cowInfo.cowId = 9; cowInfo.randomizerInf = RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW;
cowInfo.randomizerCheck = RC_JABU_JABUS_BELLY_MQ_COW; cowInfo.randomizerCheck = RC_JABU_JABUS_BELLY_MQ_COW;
break; break;
} }
@ -290,8 +290,8 @@ void EnCow_MoveForRandomizer(EnCow* this, GlobalContext* globalCtx) {
void EnCow_SetCowMilked(EnCow* this, GlobalContext* globalCtx) { void EnCow_SetCowMilked(EnCow* this, GlobalContext* globalCtx) {
CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); CowInfo cowInfo = EnCow_GetInfo(this, globalCtx);
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
player->pendingFlag.flagID = cowInfo.cowId; player->pendingFlag.flagID = cowInfo.randomizerInf;
player->pendingFlag.flagType = FLAG_COW_MILKED; player->pendingFlag.flagType = FLAG_RANDOMIZER_INF;
} }
void func_809DF778(EnCow* this, GlobalContext* globalCtx) { 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) { bool EnCow_HasBeenMilked(EnCow* this, GlobalContext* globalCtx) {
CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); CowInfo cowInfo = EnCow_GetInfo(this, globalCtx);
return gSaveContext.cowsMilked[cowInfo.cowId]; return Flags_GetRandomizerInf(cowInfo.randomizerInf);
} }
void EnCow_GivePlayerRandomizedItem(EnCow* this, GlobalContext* globalCtx) { void EnCow_GivePlayerRandomizedItem(EnCow* this, GlobalContext* globalCtx) {

View File

@ -22,7 +22,7 @@ typedef struct EnCow {
} EnCow; // size = 0x0280 } EnCow; // size = 0x0280
typedef struct CowInfo { typedef struct CowInfo {
int cowId; RandomizerInf randomizerInf;
RandomizerCheck randomizerCheck; RandomizerCheck randomizerCheck;
} CowInfo; } CowInfo;

View File

@ -114,7 +114,7 @@ u16 EnGo_GetTextID(GlobalContext* globalCtx, Actor* thisx) {
} }
case 0x00: case 0x00:
if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || 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) { if (gSaveContext.infTable[16] & 0x8000) {
return 0x3042; return 0x3042;
} else { } else {

View File

@ -416,10 +416,10 @@ s16 EnGo2_GetStateGoronDmtRollingSmall(GlobalContext* globalCtx, EnGo2* this) {
u16 EnGo2_GetTextIdGoronDmtDcEntrance(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronDmtDcEntrance(GlobalContext* globalCtx, EnGo2* this) {
if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || 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; return 0x3043;
} else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || } 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; return 0x3027;
} else { } else {
return gSaveContext.eventChkInf[2] & 0x8 ? 0x3021 : gSaveContext.infTable[14] & 0x1 ? 0x302A : 0x3008; 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) { u16 EnGo2_GetTextIdGoronCityEntrance(GlobalContext* globalCtx, EnGo2* this) {
if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || 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; return 0x3043;
} else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || } 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; return 0x3027;
} else { } else {
return gSaveContext.infTable[15] & 0x1 ? 0x3015 : 0x3014; 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) { u16 EnGo2_GetTextIdGoronCityIsland(GlobalContext* globalCtx, EnGo2* this) {
if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || 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; return 0x3043;
} else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || } 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; return 0x3027;
} else { } else {
return gSaveContext.infTable[15] & 0x10 ? 0x3017 : 0x3016; 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) { u16 EnGo2_GetTextIdGoronCityLowestFloor(GlobalContext* globalCtx, EnGo2* this) {
if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || 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; return 0x3043;
} else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || } 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; return 0x3027;
} else { } else {
return CUR_UPG_VALUE(UPG_STRENGTH) != 0 ? 0x302C 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_STAIRWELL:
case GORON_CITY_LOST_WOODS: case GORON_CITY_LOST_WOODS:
if (((!gSaveContext.n64ddFlag && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || 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); Actor_Kill(&this->actor);
} }
this->actionFunc = EnGo2_CurledUp; this->actionFunc = EnGo2_CurledUp;

View File

@ -73,7 +73,7 @@ static AnimationInfo sAnimationInfo[] = {
u16 EnKz_GetTextNoMaskChild(GlobalContext* globalCtx, EnKz* this) { u16 EnKz_GetTextNoMaskChild(GlobalContext* globalCtx, EnKz* this) {
Player* player = GET_PLAYER(globalCtx); 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))) { (!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE))) {
return 0x402B; return 0x402B;
} else if (gSaveContext.eventChkInf[3] & 8) { } else if (gSaveContext.eventChkInf[3] & 8) {

View File

@ -373,7 +373,7 @@ u16 EnMd_GetTextKokiriForest(GlobalContext* globalCtx, EnMd* this) {
this->unk_209 = TEXT_STATE_NONE; this->unk_209 = TEXT_STATE_NONE;
if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) || 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; return 0x1045;
} }
@ -486,7 +486,7 @@ u8 EnMd_ShouldSpawn(EnMd* this, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
// if we have beaten deku tree or have open forest turned on // if we have beaten deku tree or have open forest turned on
// or have already shown mido we have an equipped sword/shield // 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 || Randomizer_GetSettingValue(RSK_FOREST) == 1 ||
gSaveContext.eventChkInf[0] & 0x10) { gSaveContext.eventChkInf[0] & 0x10) {
return 0; return 0;

View File

@ -518,7 +518,7 @@ void EnOssan_TalkGoronShopkeeper(GlobalContext* globalCtx) {
Message_ContinueTextbox(globalCtx, 0x300F); Message_ContinueTextbox(globalCtx, 0x300F);
} }
} else if ((!gSaveContext.n64ddFlag && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || } 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); Message_ContinueTextbox(globalCtx, 0x3057);
} else { } else {
Message_ContinueTextbox(globalCtx, 0x305B); Message_ContinueTextbox(globalCtx, 0x305B);

View File

@ -6083,8 +6083,8 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) {
case FLAG_SCENE_TREASURE: case FLAG_SCENE_TREASURE:
Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); Flags_SetTreasure(globalCtx, this->pendingFlag.flagID);
break; break;
case FLAG_COW_MILKED: case FLAG_RANDOMIZER_INF:
gSaveContext.cowsMilked[this->pendingFlag.flagID] = 1; Flags_SetRandomizerInf(this->pendingFlag.flagID);
break; break;
case FLAG_EVENT_CHECK_INF: case FLAG_EVENT_CHECK_INF:
Flags_SetEventChkInf(this->pendingFlag.flagID); Flags_SetEventChkInf(this->pendingFlag.flagID);