diff --git a/code/include/z3D/actors/z_en_box.h b/code/include/z3D/actors/z_en_box.h index 3e7577b43..59fbb4c53 100644 --- a/code/include/z3D/actors/z_en_box.h +++ b/code/include/z3D/actors/z_en_box.h @@ -4,8 +4,11 @@ #include "z3D/z3D.h" typedef struct EnBox { - /* 0x000 */ Actor actor; - /* 0x1A4 */ char unk_1A4[0x1F4]; -} EnBox; // size 0x398 + /* 0x0000 */ DynaPolyActor dyna; + /* 0x01BC */ SkelAnime skelAnime; + /* 0x0240 */ char unk_240[0x148]; + /* 0x0388 */ ZARInfo* zarInfo; + /* 0x038C */ char unk_38C[0xC]; +} EnBox; // size = 0x398 #endif //_EN_BOX_H_ diff --git a/code/include/z3D/actors/z_en_item00.h b/code/include/z3D/actors/z_en_item00.h index 58d3adab9..e9dba138b 100644 --- a/code/include/z3D/actors/z_en_item00.h +++ b/code/include/z3D/actors/z_en_item00.h @@ -34,14 +34,22 @@ typedef enum Item00Type { /* 0xFF */ ITEM00_NONE = 0xFF } Item00Type; +typedef struct EnItem00Extension { + u16 extraCollectibleFlag; + u8 spawnedBySceneLayer; +} EnItem00Extension; + typedef struct EnItem00 { /* 0x000 */ Actor actor; - /* 0x1A4 */ void* action_fn; + /* 0x1A4 */ void* actionFunc; /* 0x1A8 */ u16 collectibleFlag; /* 0x1AA */ char unk_1AA[0x4]; /* 0x1AE */ u16 unk_1AE; /* 0x1B0 */ u16 unk_1B0; /* 0x1B2 */ char unk_1B2[0x66]; -} EnItem00; // size 0x218 + // end of base game struct + /* 0x218 */ EnItem00Extension rExt; +} EnItem00; +_Static_assert(offsetof(EnItem00, rExt) == 0x218, "EnItem00 size"); #endif //_EN_ITEM00_H_ diff --git a/code/include/z3D/actors/z_obj_mure3.h b/code/include/z3D/actors/z_obj_mure3.h new file mode 100644 index 000000000..8940483c2 --- /dev/null +++ b/code/include/z3D/actors/z_obj_mure3.h @@ -0,0 +1,17 @@ +#ifndef Z_OBJ_MURE3_H +#define Z_OBJ_MURE3_H + +#include "z3D/z3D.h" + +typedef void (*ObjMure3ActionFunc)(struct Actor*, struct GlobalContext*); + +struct ObjMure3; + +typedef struct ObjMure3 { + /* 0x0000 */ Actor actor; + /* 0x014C */ ObjMure3ActionFunc actionFunc; + /* 0x0150 */ struct EnItem00* spawnedRupees[7]; + /* 0x016C */ u16 unk_16C; +} ObjMure3; // size = 0x0170 + +#endif diff --git a/code/include/z3D/z3D.h b/code/include/z3D/z3D.h index 3ee3da45c..81b3762ec 100644 --- a/code/include/z3D/z3D.h +++ b/code/include/z3D/z3D.h @@ -811,6 +811,9 @@ typedef u32 (*Flags_GetSwitch_proc)(GlobalContext* globalCtx, u32 flag); typedef u32 (*Flags_GetCollectible_proc)(GlobalContext* globalCtx, u32 flag); #define Flags_GetCollectible ((Flags_GetCollectible_proc)GAME_ADDR(0x36405C)) +typedef u32 (*Flags_SetCollectible_proc)(GlobalContext* globalCtx, u32 flag); +#define Flags_SetCollectible ((Flags_SetCollectible_proc)GAME_ADDR(0x3329D8)) + typedef u32 (*Flags_GetClear_proc)(GlobalContext* globalCtx, u32 flag); #define Flags_GetClear ((Flags_GetClear_proc)GAME_ADDR(0x36CF6C)) diff --git a/code/include/z3D/z3Dactor.h b/code/include/z3D/z3Dactor.h index 5912982d0..bda3060ec 100644 --- a/code/include/z3D/z3Dactor.h +++ b/code/include/z3D/z3Dactor.h @@ -390,4 +390,8 @@ typedef void (*Actor_UpdateBgCheckInfo_proc)(struct GlobalContext* globalCtx, Ac typedef s32 (*Player_InCsMode_proc)(struct GlobalContext* globalCtx); #define Player_InCsMode ((Player_InCsMode_proc)GAME_ADDR(0x36A7A0)) +typedef Actor* (*Actor_FindNearby_proc)(struct GlobalContext* globalCtx, Actor* ref_actor, s16 actorId, + u8 actor_category, f32 range); +#define Actor_FindNearby ((Actor_FindNearby_proc)GAME_ADDR(0x369334)) + #endif diff --git a/code/oot.ld b/code/oot.ld index f04597d80..6e75ffc42 100644 --- a/code/oot.ld +++ b/code/oot.ld @@ -540,6 +540,10 @@ SECTIONS *(.patch_GohmaEggDeathSignalParent) } + .patch_Item00GiveAutomaticItemDrop 0x1F6E4C : { + *(.patch_Item00GiveAutomaticItemDrop) + } + .patch_ItemGiveBombchuDropOne 0x1F6F70 : { *(.patch_ItemGiveBombchuDropOne) } @@ -640,6 +644,10 @@ SECTIONS *(.patch_GetObjectEntry_EnHintnutsInit) } + .patch_Item00GiveCollectedItemDrop 0x22B974 : { + *(.patch_Item00GiveCollectedItemDrop) + } + .patch_patch_ItemGiveBombchuDropTwo 0x22BAE4 : { *(.patch_ItemGiveBombchuDropTwo) } diff --git a/code/src/actor.c b/code/src/actor.c index f7d033927..dddafaec4 100644 --- a/code/src/actor.c +++ b/code/src/actor.c @@ -83,6 +83,7 @@ #include "stalfos.h" #include "bubble.h" #include "ganondorf.h" +#include "obj_mure3.h" #define OBJECT_GI_KEY 170 #define OBJECT_GI_BOSSKEY 185 @@ -129,10 +130,11 @@ void Actor_Init() { gActorOverlayTable[0xF].initInfo->update = (ActorFunc)BgYdanSp_rUpdate; - gActorOverlayTable[0x15].initInfo->init = EnItem00_rInit; - gActorOverlayTable[0x15].initInfo->destroy = EnItem00_rDestroy; - gActorOverlayTable[0x15].initInfo->update = EnItem00_rUpdate; - gActorOverlayTable[0x15].initInfo->draw = EnItem00_rDraw; + gActorOverlayTable[0x15].initInfo->init = EnItem00_rInit; + gActorOverlayTable[0x15].initInfo->destroy = EnItem00_rDestroy; + gActorOverlayTable[0x15].initInfo->update = EnItem00_rUpdate; + gActorOverlayTable[0x15].initInfo->draw = EnItem00_rDraw; + gActorOverlayTable[0x15].initInfo->instanceSize = sizeof(EnItem00); gActorOverlayTable[0x1D].initInfo->update = EnPeehat_rUpdate; @@ -315,6 +317,8 @@ void Actor_Init() { gActorOverlayTable[0x1A3].initInfo->update = EnDntNomal_rUpdate; + gActorOverlayTable[0x1AB].initInfo->update = ObjMure3_rUpdate; + gActorOverlayTable[0x1B0].initInfo->update = EnSkb_rUpdate; gActorOverlayTable[0x1B9].initInfo->init = EnGs_rInit; @@ -379,6 +383,14 @@ u8 ActorSetup_OverrideEntry(ActorEntry* actorEntry, s32 actorEntryIndex) { return TRUE; } + if (actorEntry->id == ACTOR_EN_ITEM00) { + // Mark as spawned by scene layer. + // All vanilla actor entries for EnItem00 have Z rotation set to 0, + // so we can use it as a custom flag. + actorEntry->rot.z = -1; + return FALSE; + } + return Enemizer_OverrideActorEntry(actorEntry, actorEntryIndex); } diff --git a/code/src/actors/chest.h b/code/src/actors/chest.h index 654f11441..09b391ac6 100644 --- a/code/src/actors/chest.h +++ b/code/src/actors/chest.h @@ -2,14 +2,7 @@ #define _CHEST_H_ #include "z3D/z3D.h" - -typedef struct EnBox { - /* 0x0000 */ DynaPolyActor dyna; - /* 0x01BC */ SkelAnime skelAnime; - /* 0x0240 */ char unk_240[0x148]; - /* 0x0388 */ ZARInfo* zarInfo; - /* 0x038C */ char unk_38C[0xC]; -} EnBox; // size = 0x398 +#include "z3D/actors/z_en_box.h" typedef enum { CHEST_MAJOR, diff --git a/code/src/actors/item00.c b/code/src/actors/item00.c index acc1c5af9..b3502b8e5 100644 --- a/code/src/actors/item00.c +++ b/code/src/actors/item00.c @@ -1,7 +1,10 @@ #include "z3D/z3D.h" #include "z3D/actors/z_en_item00.h" #include "models.h" +#include "actors/obj_mure3.h" #include "settings.h" +#include "common.h" +#include "savefile.h" #define EnItem00_Init ((ActorFunc)GAME_ADDR(0x1F69B4)) @@ -13,7 +16,7 @@ #define THIS ((EnItem00*)thisx) -#define FUN_002B175C (void*)GAME_ADDR(0x2B175C) +#define EnItem00_Collected ((void*)GAME_ADDR(0x2B175C)) void EnItem00_rInit(Actor* thisx, GlobalContext* globalCtx) { EnItem00* item = THIS; @@ -44,7 +47,25 @@ void EnItem00_rInit(Actor* thisx, GlobalContext* globalCtx) { item->actor.params = (item->actor.params & 0xFF00) | 0x00; } } + + // If Z rotation is -1, it was set in `ActorSetup_OverrideEntry` + if (thisx->home.rot.z == -1) { + item->rExt.spawnedBySceneLayer = TRUE; + thisx->home.rot.z = 0; + } + EnItem00_Init(&item->actor, globalCtx); + + // For rupees spawned by Rupee Circles (ObjMure3) we use an "extraCollectibleFlag". + // Since collectibleFlag normally gets truncated to 0x3F we can use any value at or above + // 0x40. We've reserved 0x40-0x46 for Rupee circle rupees. + if (item->collectibleFlag == 0x00 && gIsObjMure3Updating) { + item->rExt.extraCollectibleFlag = gExtraCollectibleFlag; + gExtraCollectibleFlag += 1; + if (gExtraCollectibleFlag > 0x46) { + gExtraCollectibleFlag = 0x40; + } + } Model_SpawnByActor(&item->actor, globalCtx, 0); } @@ -58,9 +79,16 @@ void EnItem00_rDestroy(Actor* thisx, GlobalContext* globalCtx) { void EnItem00_rUpdate(Actor* thisx, GlobalContext* globalCtx) { EnItem00* item = THIS; - if (Flags_GetCollectible(globalCtx, item->collectibleFlag) && item->action_fn != FUN_002B175C) { - Actor_Kill(&item->actor); - return; + if (gSettingsContext.mp_Enabled && item->actionFunc != EnItem00_Collected) { + if (Flags_GetCollectible(globalCtx, item->collectibleFlag)) { + Actor_Kill(&item->actor); + return; + } + + u16 flag = item->rExt.extraCollectibleFlag ? item->rExt.extraCollectibleFlag : item->collectibleFlag; + if (SaveFile_GetRupeeSanityFlag(globalCtx->sceneNum, flag)) { + Model_DestroyByActor(thisx); + } } EnItem00_Update(&item->actor, globalCtx); diff --git a/code/src/actors/obj_mure3.c b/code/src/actors/obj_mure3.c new file mode 100644 index 000000000..698155fa0 --- /dev/null +++ b/code/src/actors/obj_mure3.c @@ -0,0 +1,13 @@ +#include "z3D/z3D.h" +#include "common.h" + +u8 gIsObjMure3Updating = 0; // global variable for rupee circle rupee replacement. +u8 gExtraCollectibleFlag = 0x40; // global variable for rupee circle rupee replacement. +#define ObjMure3_Update ((ActorFunc)GAME_ADDR(0x002318ac)) + +void ObjMure3_rUpdate(Actor* thisx, GlobalContext* globalCtx) { + gExtraCollectibleFlag = 0x40; + gIsObjMure3Updating = TRUE; + ObjMure3_Update(thisx, globalCtx); + gIsObjMure3Updating = FALSE; +} diff --git a/code/src/actors/obj_mure3.h b/code/src/actors/obj_mure3.h new file mode 100644 index 000000000..a9cb09835 --- /dev/null +++ b/code/src/actors/obj_mure3.h @@ -0,0 +1,9 @@ +#ifndef _OBJ_MURE3_H_ +#define _OBJ_MURE3_H_ + +#include "z3D/z3D.h" +extern u8 gIsObjMure3Updating; // global variable for rupee circle rupee replacement. +extern u8 gExtraCollectibleFlag; // global variable for rupee circle rupee replacement. +void ObjMure3_rUpdate(Actor* thisx, GlobalContext* globalCtx); + +#endif //_OBJ_MURE3_H_ diff --git a/code/src/hooks.s b/code/src/hooks.s index 3b9608055..694ad2bfb 100644 --- a/code/src/hooks.s +++ b/code/src/hooks.s @@ -2487,3 +2487,25 @@ hook_OcarinaNoteSound_Npc: cpy r1,r0 pop {r0, r2-r12, lr} bx lr + +.global hook_Item00GiveAutomaticItemDrop +hook_Item00GiveAutomaticItemDrop: + ldrsh r0,[r4,#0x1c] + push {r0-r12, lr} + cpy r0,r4 @ actor + bl ItemOverride_GetItemDrop + cmp r0,#0x0 + pop {r0-r12, lr} + addne lr,lr,#0x8 @ Item overridden, skip Item_Give + bx lr + +.global hook_Item00GiveCollectedItemDrop +hook_Item00GiveCollectedItemDrop: + ldrsh r0,[r5,#0x1c] + push {r0-r12, lr} + cpy r0,r5 @ actor + bl ItemOverride_GetItemDrop + cmp r0,#0x0 + pop {r0-r12, lr} + addne lr,lr,#0x8 @ Item overridden, skip Item_Give + bx lr diff --git a/code/src/item_override.c b/code/src/item_override.c index dd6089db3..f9fc19b50 100644 --- a/code/src/item_override.c +++ b/code/src/item_override.c @@ -8,12 +8,15 @@ #include "entrance.h" #include "savefile.h" #include "common.h" +#include "actors/obj_mure3.h" #include +#include "chest.h" #include "z3D/z3D.h" #include "z3D/actors/z_en_box.h" #include "z3D/actors/z_en_item00.h" +#include "z3D/actors/z_obj_mure3.h" #define READY_ON_LAND 1 #define READY_IN_WATER 2 @@ -21,7 +24,7 @@ static ItemOverride rItemOverrides[640] = { 0 }; static s32 rItemOverrides_Count = 0; -static ItemOverride rPendingOverrideQueue[3] = { 0 }; +static ItemOverride rPendingOverrideQueue[7] = { 0 }; static Actor* rDummyActor = NULL; static ItemOverride rActiveItemOverride = { 0 }; @@ -128,16 +131,35 @@ static ItemOverride_Key ItemOverride_GetSearchKey(Actor* actor, u8 scene, u8 ite .flag = actor->params & 0x1F, }; } else if (actor->id == 0x15) { // Collectible - // Only override heart pieces and keys - u32 collectibleType = actor->params & 0xFF; - if (collectibleType != 0x06 && collectibleType != 0x11) { + EnItem00* currentItem = ((EnItem00*)actor); + u32 collectibleType = actor->params & 0xFF; + u16 collectibleFlag = currentItem->collectibleFlag; + + // Don't override respawning collectibles dropped by other actors (e.g. pots) + if ((currentItem->rExt.extraCollectibleFlag == 0x00 && (collectibleFlag == 0x00 || collectibleFlag >= 0x20)) && + !currentItem->rExt.spawnedBySceneLayer) { + return (ItemOverride_Key){ .all = 0 }; + } + + if (collectibleFlag == 0x00 && currentItem->rExt.extraCollectibleFlag >= 0x40) { + // For rupees spawned by Rupee Circles (ObjMure3) we use an "extraCollectibleFlag". + // Since collectibleFlag normally gets truncated to 0x3F we can use any + // value at or above 0x40. We've reserved 0x40-0x46 for Rupee circle rupees. + collectibleFlag = currentItem->rExt.extraCollectibleFlag; + } + s32 respawningCollected = + collectibleFlag >= 0x20 && SaveFile_GetRupeeSanityFlag(gGlobalContext->sceneNum, collectibleFlag); + + if ((collectibleType > ITEM00_RUPEE_RED && collectibleType != ITEM00_HEART_PIECE && + collectibleType != ITEM00_SMALL_KEY) || + respawningCollected) { return (ItemOverride_Key){ .all = 0 }; } return (ItemOverride_Key){ .scene = scene, .type = OVR_COLLECTABLE, - .flag = ((EnItem00*)actor)->collectibleFlag, + .flag = collectibleFlag, }; } else if (actor->id == 0x19C) { // Gold Skulltula Token return (ItemOverride_Key){ @@ -253,10 +275,15 @@ void ItemOverride_PushDelayedOverride(u8 flag) { } static void ItemOverride_PopPendingOverride(void) { - rPendingOverrideQueue[0] = rPendingOverrideQueue[1]; - rPendingOverrideQueue[1] = rPendingOverrideQueue[2]; - rPendingOverrideQueue[2].key.all = 0; - rPendingOverrideQueue[2].value.all = 0; + u8 queueSize = ARR_SIZE(rPendingOverrideQueue); + for (u8 i = 0; i < queueSize; i++) { + if (i < queueSize - 1) { + rPendingOverrideQueue[i] = rPendingOverrideQueue[i + 1]; + } else { + rPendingOverrideQueue[i].key.all = 0; + rPendingOverrideQueue[i].value.all = 0; + } + } } static void ItemOverride_AfterKeyReceived(ItemOverride_Key key) { @@ -352,9 +379,9 @@ static u32 ItemOverride_PlayerIsReadyInWater(void) { (PLAYER->stateFlags2 & 0x000C0000) == 0 && PLAYER->actor.draw != NULL && gGlobalContext->actorCtx.titleCtx.delayTimer == 0 && gGlobalContext->actorCtx.titleCtx.durationTimer == 0 && gGlobalContext->actorCtx.titleCtx.alpha == 0 && (PLAYER->stateFlags1 & 0x08000000) != 0 && // Player is Swimming - (PLAYER->stateFlags1 & 0x400) == 0 && // Player is not already receiving an item when surfacing - gGlobalContext->sceneLoadFlag == 0 && // Another scene isn't about to be loaded - rPendingOverrideQueue[0].key.type == OVR_TEMPLE // Must be an item received for completing a dungeon + (PLAYER->stateFlags1 & 0x400) == 0 && // Player is not already receiving an item when surfacing + gGlobalContext->sceneLoadFlag == 0 && // Another scene isn't about to be loaded + ItemOverride_IsAPendingOverride() // && Multiworld is off // && (z64_event_state_1 & 0x20) == 0 //TODO // && (z64_game.camera_2 == 0) //TODO @@ -377,6 +404,7 @@ static u32 ItemOverride_PlayerIsReady(void) { if (ItemOverride_PlayerIsReadyInWater()) { return READY_IN_WATER; } + return 0; } @@ -523,6 +551,70 @@ void ItemOverride_GetSkulltulaToken(Actor* tokenActor) { } } +u8 ItemOverride_GetItemDrop(EnItem00* this) { + // Override items that always behave as drops and never trigger a Get Item event. + switch (this->actor.params) { + case ITEM00_RUPEE_GREEN: + case ITEM00_RUPEE_BLUE: + case ITEM00_RUPEE_RED: + case ITEM00_RUPEE_PURPLE: + case ITEM00_RUPEE_ORANGE: + case ITEM00_RECOVERY_HEART: + case ITEM00_FLEXIBLE: + case ITEM00_BOMBS_A: + case ITEM00_BOMBS_B: + case ITEM00_ARROWS_SINGLE: + case ITEM00_ARROWS_SMALL: + case ITEM00_ARROWS_MEDIUM: + case ITEM00_ARROWS_LARGE: + break; + default: + return FALSE; // Proceed normally with the Get Item event. + } + + ItemOverride override = ItemOverride_Lookup(&this->actor, gGlobalContext->sceneNum, GI_INVALID); + if (override.key.all == 0) { + return FALSE; // No override, proceed with Item_Give. + } + + u16 resolvedItemId = ItemTable_ResolveUpgrades(override.value.itemId); + ItemRow* itemRow = ItemTable_GetItemRow(resolvedItemId); + + u8 isMajorItem = TRUE; + switch (itemRow->chestType) { + case CHEST_JUNK: + isMajorItem = FALSE; + break; + case CHEST_BOMBCHUS: + isMajorItem = gSaveContext.items[8] == 0xFF; // bombchus not obtained yet + break; + case CHEST_HEART: + isMajorItem = resolvedItemId != GI_HEART; + break; + } + + if (isMajorItem) { + ItemOverride_PushPendingOverride(override); + this->actor.params = ITEM00_HEART_PIECE; // to play no SFX + Flags_SetCollectible(gGlobalContext, this->collectibleFlag); + Actor_Kill(&this->actor); + } else { + // Minor item, behave as item drop. + this->actor.params = ITEM00_RECOVERY_HEART; // to play minor item SFX + ItemTable_CallEffect(itemRow); + Item_Give(gGlobalContext, itemRow->actionId); + } + if (this->collectibleFlag == 0 && this->rExt.extraCollectibleFlag >= 0x40 && + this->rExt.extraCollectibleFlag < 0x47) { + SaveFile_SetRupeeSanityFlag(gGlobalContext->sceneNum, this->rExt.extraCollectibleFlag); + } else if (this->collectibleFlag >= 0x20) { + // collectibles with a collectibleFlag >= 0x20 respawn so we need to keep track of them in the gExtSaveData + SaveFile_SetRupeeSanityFlag(gGlobalContext->sceneNum, this->collectibleFlag); + } + + return TRUE; // Item overridden, skip Item_Give. +} + static s32 ItemOverride_IsDrawItemVanilla(void) { return rActiveItemRow == NULL || // No item override PLAYER->itemActionParam >= 0x2B || // Using trade item diff --git a/code/src/models.c b/code/src/models.c index 503f8f5be..4dca17077 100644 --- a/code/src/models.c +++ b/code/src/models.c @@ -21,7 +21,7 @@ typedef void (*SkeletonAnimationModel_SpawnAt_proc)(Actor* actor, GlobalContext* typedef void (*Actor_SetModelMatrix_proc)(f32 x, f32 y, f32 z, nn_math_MTX34* mtx, ActorShape* shape); #define Actor_SetModelMatrix ((Actor_SetModelMatrix_proc)GAME_ADDR(0x3679D0)) -#define LOADEDMODELS_MAX 16 +#define LOADEDMODELS_MAX 20 Model ModelContext[LOADEDMODELS_MAX] = { 0 }; void Model_SetAnim(SkeletonAnimationModel* model, s16 objectId, u32 objectAnimIdx) { diff --git a/code/src/multiplayer.c b/code/src/multiplayer.c index f89b03f21..5f39caa07 100644 --- a/code/src/multiplayer.c +++ b/code/src/multiplayer.c @@ -2151,14 +2151,15 @@ void Multiplayer_Receive_WorldMapBit(u16 senderID) { } } -void Multiplayer_Send_ExtInfBit(u8 index, u8 bit, u8 setOrUnset) { +void Multiplayer_Send_ExtInfBit(u16 index, u8 bit, u8 setOrUnset) { if (!IsSendReceiveReady() || gSettingsContext.mp_SharedProgress == OFF) { return; } memset(mBuffer, 0, mBufSize); u8 memSpacer = PrepareSharedProgressPacket(PACKET_EXTINF); - mBuffer[memSpacer++] = index; + mBuffer[memSpacer] = index; + memSpacer += sizeof(index); mBuffer[memSpacer++] = bit; mBuffer[memSpacer++] = setOrUnset; Multiplayer_SendPacket(memSpacer, UDS_BROADCAST_NETWORKNODEID); @@ -2170,7 +2171,8 @@ void Multiplayer_Receive_ExtInfBit(u16 senderID) { } u8 memSpacer = GetSharedProgressMemSpacerOffset(); - u8 index = mBuffer[memSpacer++]; + u16 index = mBuffer[memSpacer]; + memSpacer += sizeof(index); u8 bit = mBuffer[memSpacer++]; u8 setOrUnset = mBuffer[memSpacer++]; diff --git a/code/src/multiplayer.h b/code/src/multiplayer.h index d6c34816e..8c54300cf 100644 --- a/code/src/multiplayer.h +++ b/code/src/multiplayer.h @@ -52,7 +52,7 @@ void Multiplayer_Send_GSFlagBit(u8 index, u8 bit, u8 setOrUnset); void Multiplayer_Send_BigPoePoints(u32 pointDiff); void Multiplayer_Send_FishingFlag(u8 bit, u8 setOrUnset); void Multiplayer_Send_WorldMapBit(u8 bit, u8 setOrUnset); -void Multiplayer_Send_ExtInfBit(u8 index, u8 bit, u8 setOrUnset); +void Multiplayer_Send_ExtInfBit(u16 index, u8 bit, u8 setOrUnset); void Multiplayer_Send_TriforcePieces(u32 piecesDiff); void Multiplayer_Send_FullEntranceSync(u16 targetID); void Multiplayer_Send_DiscoveredScene(u32 index, u32 bit); diff --git a/code/src/patches.s b/code/src/patches.s index e0fb61198..f143aad69 100644 --- a/code/src/patches.s +++ b/code/src/patches.s @@ -2546,3 +2546,13 @@ OcarinaNoteSound_Player_patch: .global OcarinaNoteSound_Npc_patch OcarinaNoteSound_Npc_patch: bl hook_OcarinaNoteSound_Npc + +.section .patch_Item00GiveAutomaticItemDrop +.global Item00GiveAutomaticItemDrop_patch +Item00GiveAutomaticItemDrop_patch: + bl hook_Item00GiveAutomaticItemDrop + +.section .patch_Item00GiveCollectedItemDrop +.global Item00GiveCollectedItemDrop_patch +Item00GiveCollectedItemDrop_patch: + bl hook_Item00GiveCollectedItemDrop diff --git a/code/src/savefile.c b/code/src/savefile.c index d8ec3156d..4da54e44d 100644 --- a/code/src/savefile.c +++ b/code/src/savefile.c @@ -861,3 +861,27 @@ void SaveFile_OnGameOver(void) { Gloom_OnDeath(); Permadeath_DeleteSave(); } + +void SaveFile_SetRupeeSanityFlag(s16 sceneNum, u16 collectibleFlag) { + if (collectibleFlag >= 0x20 && collectibleFlag < 0x40) { + gExtSaveData.extInf.rupeesanityFlags[sceneNum] |= (1 << (collectibleFlag - 0x20)); + } + if (collectibleFlag >= 0x40) { + gExtSaveData.extInf.rupeesanityRupeeCircleFlags[sceneNum] |= (1 << (collectibleFlag - 0x40)); + } +} + +u8 SaveFile_GetRupeeSanityFlag(s16 sceneNum, u16 collectibleFlag) { + u32 saveFlags; + u16 shiftBy; + if (collectibleFlag >= 0x20 && collectibleFlag < 0x40) { + saveFlags = gExtSaveData.extInf.rupeesanityFlags[sceneNum]; + shiftBy = 0x20; + } + if (collectibleFlag >= 0x40) { + saveFlags = gExtSaveData.extInf.rupeesanityRupeeCircleFlags[sceneNum]; + shiftBy = 0x40; + } + + return (saveFlags & (1 << (collectibleFlag - shiftBy))) != 0; +} diff --git a/code/src/savefile.h b/code/src/savefile.h index a1f3b32e8..08d146d86 100644 --- a/code/src/savefile.h +++ b/code/src/savefile.h @@ -2,6 +2,7 @@ #define _SAVEFILE_H_ #include "z3D/z3D.h" +#include "z3D/z3Dscene.h" #define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4 #define SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT 66 @@ -30,11 +31,15 @@ void SaveFile_LoadExtSaveData(u32 saveNumber); void SaveFile_SaveExtSaveData(u32 saveNumber); void SaveFile_EnforceHealthLimit(void); u8 SaveFile_SwordlessPatchesEnabled(void); +void SaveFile_SetRupeeSanityFlag(s16 sceneNum, u16 collectibleFlag); +u8 SaveFile_GetRupeeSanityFlag(s16 sceneNum, u16 collectibleFlag); // Increment the version number whenever the ExtSaveData structure is changed #define EXTSAVEDATA_VERSION 17 typedef struct ExtInf { + u32 rupeesanityFlags[SCENE_MAX]; + u32 rupeesanityRupeeCircleFlags[SCENE_MAX]; u8 biggoronTrades; u8 masterSwordFlags; u8 totAltarFlags; diff --git a/code/src/spoiler_data.c b/code/src/spoiler_data.c index 63538ea33..03b46312b 100644 --- a/code/src/spoiler_data.c +++ b/code/src/spoiler_data.c @@ -33,10 +33,14 @@ u8 SpoilerData_ChestCheck(SpoilerItemLocation* itemLoc) { } u8 SpoilerData_CollectableCheck(SpoilerItemLocation* itemLoc) { - if (gGlobalContext->sceneNum == itemLoc->LocationScene) { - return (gGlobalContext->actorCtx.flags.collect & (1 << itemLoc->LocationFlag)) != 0; + if (itemLoc->LocationFlag < 0x20) { + if (gGlobalContext->sceneNum == itemLoc->LocationScene) { + return (gGlobalContext->actorCtx.flags.collect & (1 << itemLoc->LocationFlag)) != 0; + } else { + return (gSaveContext.sceneFlags[itemLoc->LocationScene].collect & (1 << itemLoc->LocationFlag)) != 0; + } } else { - return (gSaveContext.sceneFlags[itemLoc->LocationScene].collect & (1 << itemLoc->LocationFlag)) != 0; + return SaveFile_GetRupeeSanityFlag(itemLoc->LocationScene, itemLoc->LocationFlag); } } diff --git a/source/category.hpp b/source/category.hpp index 69c48f931..8278ba1f3 100644 --- a/source/category.hpp +++ b/source/category.hpp @@ -64,6 +64,7 @@ enum class Category { cVanillaCompass, cAdultTrade, cFrogRupees, + cFreestandingRupee, }; enum class OptionCategory { diff --git a/source/descriptions.cpp b/source/descriptions.cpp index 3199eaa9e..d5541c2d8 100644 --- a/source/descriptions.cpp +++ b/source/descriptions.cpp @@ -591,6 +591,11 @@ string_view ocarinaButtonsDesc = "Enabling this locks all Ocarina inputs, "Ocarina notes.\n\n" // "They can also be added to the Starting Inventory."; /*------------------------------ // +| SHUFFLE FREESTANDING RUPEES | // +------------------------------*/ // +string_view shuffleRupeesDesc = "Shuffles freestanding rupees and adds them to the\n" + "item pool. Currently work in progress."; // +/*------------------------------ // | MAPS AND COMPASSES | // ------------------------------*/ // string_view mapCompassStartWith = "Maps and Compasses are given to you from the\n" // @@ -1492,6 +1497,9 @@ string_view LogicDMTSummitHoverDesc = "Difficulty: Intermediat "boots and grabbing the ledge with the higher\n" // "boulder near the wall, you'll be able to grab the\n" "ledge above it to reach the summit."; // +string_view LogicDMCPlatformJumpDesc = "Difficulty: Novice\n" // + "Adult can reach these rupees by jumping down from\n" + "the upper part of DMC, without scarecrow/longshot."; string_view LogicLinkGoronDinsDesc = "Difficulty: Intermediate\n" // "The timing is quite awkward."; // string_view LogicGoronCityLeftMostDesc = "Difficulty: Novice\n" // @@ -1532,6 +1540,9 @@ string_view LogicZoraRiverLowerDesc = "Difficulty: Novice\n" string_view LogicZoraRiverUpperDesc = "Difficulty: Novice\n" // "Adult can reach this PoH with a precise jump, no\n" "Hover Boots required."; // +string_view LogicZoraRiverRupeesJumpDesc = "Difficulty: Novice\n" // + "Adult can reach these rupees by jumping down from\n" + "the lullaby platform no Iron Boots required."; // string_view LogicZFGreatFairyDesc = "Difficulty: Novice\n" // "Destroying the boulders blocking the hidden area\n" "with silver gauntlets and hammer lets you pass\n" // diff --git a/source/descriptions.hpp b/source/descriptions.hpp index 378e3055c..1f344e72b 100644 --- a/source/descriptions.hpp +++ b/source/descriptions.hpp @@ -189,6 +189,8 @@ extern string_view enemySoulDesc; extern string_view ocarinaButtonsDesc; +extern string_view shuffleRupeesDesc; + extern string_view mapCompassStartWith; extern string_view mapCompassVanilla; extern string_view mapCompassOwnDungeon; @@ -464,6 +466,7 @@ extern string_view LogicWindmillPoHHookshotDesc; extern string_view LogicDMTBombableDesc; extern string_view LogicDMTSoilGSDesc; extern string_view LogicDMTSummitHoverDesc; +extern string_view LogicDMCPlatformJumpDesc; extern string_view LogicLinkGoronDinsDesc; extern string_view LogicGoronCityLeftMostDesc; extern string_view LogicGoronCityPotDesc; @@ -474,6 +477,7 @@ extern string_view LogicCraterBeanPoHWithHoversDesc; extern string_view LogicBiggoronBoleroDesc; extern string_view LogicZoraRiverLowerDesc; extern string_view LogicZoraRiverUpperDesc; +extern string_view LogicZoraRiverRupeesJumpDesc; extern string_view LogicZFGreatFairyDesc; extern string_view LogicDekuB1WebsWithBowDesc; extern string_view LogicDekuB1SkipDesc; diff --git a/source/dungeon.cpp b/source/dungeon.cpp index 98a4c5a5b..71a650dc9 100644 --- a/source/dungeon.cpp +++ b/source/dungeon.cpp @@ -190,44 +190,35 @@ DungeonInfo DodongosCavern = DungeonInfo("Dodongo's Cavern", DODONGOS_CAVERN, DO KING_DODONGO, }); -DungeonInfo JabuJabusBelly = DungeonInfo("Jabu Jabu's Belly", JABU_JABUS_BELLY, JABU_JABUS_BELLY_MAP, - JABU_JABUS_BELLY_COMPASS, NONE, NONE, NONE, 0, 0, - { - // Vanilla Locations - JABU_JABUS_BELLY_MAP_CHEST, - JABU_JABUS_BELLY_COMPASS_CHEST, - JABU_JABUS_BELLY_BOOMERANG_CHEST, - JABU_JABUS_BELLY_DEKU_SCRUB, - JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, - JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, - JABU_JABUS_BELLY_GS_NEAR_BOSS, - JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, - }, - { - // MQ Locations - JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, - JABU_JABUS_BELLY_MQ_MAP_CHEST, - JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, - JABU_JABUS_BELLY_MQ_COMPASS_CHEST, - JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, - JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, - JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, - JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, - JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, - JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, - JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, - JABU_JABUS_BELLY_MQ_COW, - JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, - JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, - JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, - JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, - }, - {}, - { - // Boss Room Locations - JABU_JABUS_BELLY_BARINADE_HEART, - BARINADE, - }); +DungeonInfo JabuJabusBelly = DungeonInfo( + "Jabu Jabu's Belly", JABU_JABUS_BELLY, JABU_JABUS_BELLY_MAP, JABU_JABUS_BELLY_COMPASS, NONE, NONE, NONE, 0, 0, + { + // Vanilla Locations + JABU_JABUS_BELLY_MAP_CHEST, + JABU_JABUS_BELLY_COMPASS_CHEST, + JABU_JABUS_BELLY_BOOMERANG_CHEST, + JABU_JABUS_BELLY_DEKU_SCRUB, + JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, + JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, + JABU_JABUS_BELLY_GS_NEAR_BOSS, + JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, + }, + { // MQ Locations + JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, JABU_JABUS_BELLY_MQ_MAP_CHEST, + JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, JABU_JABUS_BELLY_MQ_COMPASS_CHEST, + JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, + JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, + JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, + JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, JABU_JABUS_BELLY_MQ_COW, JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, + JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, + JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, JABU_JABUS_BELLY_MQ_NEAR_COW_BOTTOM_GREEN_RUPEE, + JABU_JABUS_BELLY_MQ_NEAR_COW_MIDDLE_GREEN_RUPEE, JABU_JABUS_BELLY_MQ_NEAR_COW_TOP_GREEN_RUPEE }, + {}, + { + // Boss Room Locations + JABU_JABUS_BELLY_BARINADE_HEART, + BARINADE, + }); DungeonInfo ForestTemple = DungeonInfo("Forest Temple", FOREST_TEMPLE, FOREST_TEMPLE_MAP, FOREST_TEMPLE_COMPASS, FOREST_TEMPLE_SMALL_KEY, @@ -525,6 +516,11 @@ DungeonInfo BottomOfTheWell = BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_1, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_2, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_3, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_4, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_5, }, { // MQ Locations @@ -550,6 +546,10 @@ DungeonInfo IceCavern = ICE_CAVERN_GS_PUSH_BLOCK_ROOM, ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, ICE_CAVERN_GS_HEART_PIECE_ROOM, + ICE_CAVERN_RED_ICE_BLUE_RUPEE, + ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_1, + ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_2, + ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_3, }, { // MQ Locations diff --git a/source/fill.cpp b/source/fill.cpp index 20d95c613..d915b2e30 100644 --- a/source/fill.cpp +++ b/source/fill.cpp @@ -1032,6 +1032,7 @@ int Fill() { showItemProgress = true; // Place shop items first, since a buy shield is needed to place a dungeon reward on Gohma due // to access + NonShopItems = {}; if (Shopsanity.Is(SHOPSANITY_OFF)) { PlaceVanillaShopItems(); // Place vanilla shop items in vanilla location @@ -1118,6 +1119,7 @@ int Fill() { // Then place the rest of the advancement items std::vector remainingAdvancementItems = FilterAndEraseFromPool(ItemPool, [](const ItemKey i) { return ItemTable(i).IsAdvancement(); }); + AssumedFill(remainingAdvancementItems, allLocations, true); // Then place any remaining non-junk items // Fast fill as these don't affect logic diff --git a/source/hint_list/hint_list_exclude_dungeon.cpp b/source/hint_list/hint_list_exclude_dungeon.cpp index cde1a4af2..a98916a74 100644 --- a/source/hint_list/hint_list_exclude_dungeon.cpp +++ b/source/hint_list/hint_list_exclude_dungeon.cpp @@ -34,7 +34,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#webs in the Deku Tree# hide", /*french*/"les #toiles dans l'arbre Mojo# cachent", /*spanish*/"entre #telarañas del Gran Árbol Deku# yace", /*italian*/"una #ragnatela nell'Albero Deku# copre", /*german*/"unterhalb von #Spinnenweben# des Deku-Baumes, |wäre|wären|"}, }); - hintTable[DEKU_TREE_MQ_MAP_CHEST] = HintText::Exclude({ // obscure text Text{"in the #center of the Deku Tree# lies", /*french*/"#le cœur de l'arbre Mojo# recèle", /*spanish*/"al #centro del Gran Árbol Deku# yace", /*italian*/"al #centro dell'Albero Deku# puoi trovare", /*german*/"im #Zentrum des Deku-Baumes#, |wäre|wären|"}, @@ -93,7 +92,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider atop the Deku Tree# holds", /*french*/"une #Skulltula au sommet de l'arbre Mojo# a", /*spanish*/"una #Skulltula en lo alto del Árbol Deku# otorga", /*italian*/"un #ragno in cima all'Albero Deku# nasconde", /*german*/"in einer #Spinne, im oberen Teil des Deku-Baumes#, |wäre|wären|"}, }); - hintTable[DEKU_TREE_MQ_GS_LOBBY] = HintText::Exclude({ // obscure text Text{"a #spider in a crate# within the Deku Tree hides", /*french*/"une #Skulltula dans une boîte dans l'arbre Mojo# a", /*spanish*/"una #Skulltula bajo una caja# del Árbol Deku otorga", /*italian*/"un #ragno in una cassa# nell'Albero Deku nasconde", /*german*/"in der #Spinne, in einer Kiste# des Deku-Baumes, |wäre|wären|"}, @@ -147,7 +145,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #chest at the end of a bridge# yields", /*french*/"le #trésor à l'extrémité d'un pont# contient", /*spanish*/"un #cofre al final de un quebrado puente# contiene", /*italian*/"un #forziere alla fine di un ponte# contiene", /*german*/"in einer #Truhe, am Ende einer Brücke#, |wäre|wären|"}, }); - hintTable[DODONGOS_CAVERN_MQ_MAP_CHEST] = HintText::Exclude({ // obscure text Text{"a #muddy wall in Dodongo's Cavern# hides", /*french*/"le #mur fragile dans la caverne Dodongo# recèle", /*spanish*/"una #agrietada pared en la Cueva de los Dodongos# esconde", /*italian*/"una #parete friabile nella caverna dei Dodongo# nasconde", /*german*/"hinter einer #brüchigen Wand in Dodongos Höhle#, |wäre|wären|"}, @@ -211,7 +208,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider among bats# in Dodongo's Cavern holds", /*french*/"une #Skulltula entourée de Saigneurs dans la caverne Dodongo# a", /*spanish*/"una #Skulltula rodeada de murciélagos# de la Cueva de los Dodongos otorga", /*italian*/"un #ragno in mezzo ai pipistrelli# nella caverna dei Dodongo nasconde", /*german*/"in einer, #von Fledermäusen umgebenen Spinne# in Dodongos Höhle, |wäre|wären|"}, }); - hintTable[DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM] = HintText::Exclude({ // obscure text Text{"a #spider high on a wall# in Dodongo's Cavern holds", /*french*/"une #Skulltula haut perchée dans la caverne Dodongo# a", /*spanish*/"una #Skulltula en lo alto de una pared# de la Cueva de los Dodongos otorga", /*italian*/"un #ragno in alto su un muro# nella caverna dei Dodongo protegge", /*german*/"in einer, #an einer hohen Wand krabbelnden Spinne# in Dodongos Höhle, |wäre|wären|"}, @@ -252,7 +248,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #scrub in Dodongo's Cavern# sells", /*french*/"la #peste Mojo dans l'entrée de la caverne Dodongo# vend", /*spanish*/"un #deku en la Cueva de los Dodongos# vende", /*italian*/"un #cespuglio solitario# vicino all'ingresso della caverna dei Dodongo vende", /*german*/"die Ware, eines #Deku-Händlers in Dodongos Höhle#, |wäre|wären|"}, }); - hintTable[DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = HintText::Exclude({ // obscure text Text{"a pair of #scrubs in Dodongo's Cavern# sells", /*french*/"le #duo de peste Mojo dans l'entrée de la caverne Dodongo# vend", /*spanish*/"un #par de dekus en la Cueva de los Dodongos# venden", /*italian*/"una #coppia di cespugli# nella caverna dei Dodongo vende", /*german*/"die Ware, eines #Deku-Händler-Duos in Dodongos Höhle#, |wäre|wären|"}, @@ -292,7 +287,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#bubbles# guard", /*french*/"des #bulles# entourent", /*spanish*/"unas #burbujas# protegen", /*italian*/"gli #shabom# proteggono", /*german*/"nahe #Blubberblasen#, |wäre|wären|"} ); - hintTable[JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST] = HintText::Exclude({ // obscure text Text{"shooting a #mouth cow# reveals", /*french*/"tirer sur une #vache# révèle", /*spanish*/"#dispararle a una vaca# revela", /*italian*/"sparare a una #mucca in bocca# rivela", /*german*/"nahe einer #Kuh im Maule# einer Gottheit, |wäre|wären|"}, @@ -358,6 +352,30 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a school of #stingers swallowed by Jabu-Jabu# guard", /*french*/"les #raies avallées par Jabu-Jabu# protègent", /*spanish*/"unos #stingers engullidos por Jabu-Jabu# guardan", /*italian*/"#un banco di trigoni volanti# nella pancia di Jabu Jabu protegge", /*german*/"nahe #Fischen in Jabu-Jabus Bauch#, |wäre|wären|"} ); + hintTable[JABU_JABUS_BELLY_MQ_NEAR_COW_BOTTOM_GREEN_RUPEE] = HintText::Exclude({ + // obscure text + Text{"#deep in belly juice near a steak# you'll find", /*french*/"#deep in belly juice near a steak# you'll find", /*spanish*/"#deep in belly juice near a steak# you'll find", /*italian*/"#in profondità nei succhi gastrici che digeriscono una bistecca# troverai", /*german*/"#deep in belly juice near a steak# you'll find"}, + }, {}, + // clear text + Text{"#on the bottom of water in Jabu's Belly near a cow# is", /*french*/"#on the bottom of water in Jabu's Belly near a cow# is", /*spanish*/"#on the bottom of water in Jabu's Belly near a cow# is", /*italian*/"#nella pancia di Jabu Jabu, sul fondo dell'acqua in cui è immersa una mucca#, troverai", /*german*/"#on the bottom of water in Jabu's Belly near a cow# is"} + ); + + hintTable[JABU_JABUS_BELLY_MQ_NEAR_COW_MIDDLE_GREEN_RUPEE] = HintText::Exclude({ + // obscure text + Text{"#halfway in belly juice near a steak# you'll find", /*french*/"#halfway in belly juice near a steak# you'll find", /*spanish*/"#halfway in belly juice near a steak# you'll find", /*italian*/"#a mollo nei succhi gastrici che digeriscono una bistecca# troverai", /*german*/"#halfway in belly juice near a steak# you'll find"}, + }, {}, + // clear text + Text{"#in the middle of water in Jabu's Belly near a cow# is", /*french*/"#in the middle of water in Jabu's Belly near a cow# is", /*spanish*/"#in the middle of water in Jabu's Belly near a cow# is", /*italian*/"#nella pancia di Jabu Jabu, in mezzo all'acqua in cui è immersa una mucca#, troverai", /*german*/"#in the middle of water in Jabu's Belly near a cow# is"} + ); + + hintTable[JABU_JABUS_BELLY_MQ_NEAR_COW_TOP_GREEN_RUPEE] = HintText::Exclude({ + // obscure text + Text{"#almost floating in belly juice near a steak# you'll find", /*french*/"#almost floating in belly juice near a steak# you'll find", /*spanish*/"#almost floating in belly juice near a steak# you'll find", /*italian*/"#quasi a galla nei succhi gastrici che digeriscono una bistecca# troverai", /*german*/"#almost floating in belly juice near a steak# you'll find"}, + }, {}, + // clear text + Text{"#near the top of water in Jabu's Belly near a cow# is", /*french*/"#near the top of water in Jabu's Belly near a cow# is", /*spanish*/"#near the top of water in Jabu's Belly near a cow# is", /*italian*/"#nella pancia di Jabu Jabu, vicino al pelo dell'acqua in cui è immersa una mucca#, troverai", /*german*/"#near the top of water in Jabu's Belly near a cow# is"} + ); + hintTable[JABU_JABUS_BELLY_BARINADE_HEART] = HintText::Exclude({ // obscure text Text{"the #Bio-Electric Anemone# holds", /*french*/"l'#anémone bioélectrique# possède", /*spanish*/"la #anémona bioeléctrica# porta", /*italian*/"l'#anemone bio-elettrico# possiede", /*german*/"nahe dem #elektroterrestrischen Biotentakel#, |wäre|wären|"}, @@ -386,7 +404,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider guarded by a school of stingers# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula protégée par des raies dans le ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula rodeada por unos stingers# en la Tripa de Jabu-Jabu otorga", /*italian*/"un #ragno protetto da trigoni volanti# nasconde", /*german*/"in einer #Spinne, nahe eines Fischschwarms# in Jabu-Jabus Bauch"}, }); - hintTable[JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM] = HintText::Exclude({ // obscure text Text{"a #spider surrounded by electricity# in Jabu-Jabu's Belly holds", /*french*/"une #Skulltula entourée d'électricité dans le ventre de Jabu-Jabu# a", /*spanish*/"una #Skulltula rodeada de electricidad# en la Tripa de Jabu-Jabu otorga", /*italian*/"un #ragno circondato da trivolt# nasconde", /*german*/"in einer, #von Elektrizität umgebenen Spinne# in Jabu-Jabus Bauch, |wäre|wären|"}, @@ -487,7 +504,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#revolving walls# in the Forest Temple conceal", /*french*/"des #murs rotatifs dans la forêt# recèlent", /*spanish*/"las #paredes giratorias# del Templo del Bosque conceden", /*italian*/"#muri rotanti# nel Santuario della Foresta nascondono", /*german*/"nahe #drehbarer Wände# des Waldtempels, |wäre|wären|"}, }); - hintTable[FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST] = HintText::Exclude({ // obscure text Text{"a #tree in the Forest Temple# supports", /*french*/"sur l'#arbre dans le temple de la forêt# gît", /*spanish*/"sobre un #árbol del Templo del Bosque# yace", /*italian*/"un #albero nel Santuario della Foresta# sostiene", /*german*/"auf einem #Baum des Waldtempels#, |wäre|wären|"}, @@ -590,7 +606,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider within revolving walls# in the Forest Temple holds", /*french*/"une #Skulltula derrière les murs pivotants du temple de la forêt# a", /*spanish*/"una #Skulltula entre paredes giratorias# del Templo del Bosque otorga", /*italian*/"un #ragno fra muri rotanti# nel Santuario della Foresta nasconde", /*german*/"in einer #Spinne, nahe drehbarer Wände# des Waldtempels, |wäre|wären|"}, }); - hintTable[FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = HintText::Exclude({ // obscure text Text{"an #ivy-hidden spider# in the Forest Temple hoards", /*french*/"une #Skulltula près de l'entrée du temple de la forêt# a", /*spanish*/"una #Skulltula escondida entre cepas# del Templo del Bosque otorga", /*italian*/"un #ragno dopo altri tre# nel Santuario della Foresta protegge", /*german*/"in einer, #in Efeu versteckten Spinne# des Waldtempels, |wäre|wären|"}, @@ -679,7 +694,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #Goron atop the Fire Temple# holds", /*french*/"le #Goron au sommet du temple du feu# a", /*spanish*/"un #goron en lo alto del Templo del Fuego# guarda", /*italian*/"un #Goron in cima al Santuario del Fuoco# possiede", /*german*/"nahe eines #Goronen, im oberen Teil des Feuertempels#, |wäre|wären|"}, }); - hintTable[FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = HintText::Exclude({ // obscure text Text{"#near a dragon# is", /*french*/"#près d'un dragon# gît", /*spanish*/"#cerca de un dragón# yace", /*italian*/"#vicino a un drago# un forziere contiene", /*german*/"in der Nähe eines #Drachens#, |wäre|wären|"}, @@ -777,7 +791,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider-friendly scarecrow# atop the Fire Temple hides", /*french*/"une #Skulltula repérée par l'épouvantail du temple du feu# a", /*spanish*/"un #espantapájaros del Templo del Fuego# custodia una Skulltula que otorga", /*italian*/"uno #spaventapasseri nel Santuario del Fuoco# indica un ragno che ha", /*german*/"in einer #Spinne über einer Vogelscheuche#, im oberen Teil des Feuertempels, |wäre|wären|"} ); - hintTable[FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = HintText::Exclude({ // obscure text Text{"a #spider above a fiery maze# holds", /*french*/"une #Skulltula au dessus du labyrinthe enflammé du temple du feu# a", /*spanish*/"una #Skulltula sobre un ardiente laberinto# otorga", /*italian*/"un #ragno sopra un labirinto di fiamme# nasconde", /*german*/"in einer #Spinne über einem feurigen Irrgarten#, |wäre|wären|"}, @@ -845,7 +858,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#Dark @# guards", /*french*/"l'#Ombre de @# protège", /*spanish*/"#@ Oscuro# guarda", /*italian*/"#@ oscuro# protegge", /*german*/"nahe #dem schwarzen @#, |wäre|wären|"} ); - hintTable[WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = HintText::Exclude({ // obscure text Text{"in the #depths of the Water Temple# lies", /*french*/"le #cœur du temple de l'eau# cache", /*spanish*/"en las #profundidades del Templo del Agua# yace", /*italian*/"#nel più profondo del Santuario dell'Acqua# puoi recuperare", /*german*/"in #den Tiefen# des Wassertempels, |wäre|wären|"}, @@ -902,7 +914,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider over a river# in the Water Temple holds", /*french*/"une #Skulltula au dessus de la rivière du temple de l'eau# a", /*spanish*/"una #Skulltula sobre un río# del Templo del Agua otorga", /*italian*/"un #ragno sopra un fiume# nel Santuario dell'Acqua nasconde", /*german*/"in einer #Spinne, oberhalb eines Flusses# des Wassertempels, |wäre|wären|"}, }); - hintTable[WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = HintText::Exclude({ // obscure text Text{"#beyond a pit of lizards# is a spider holding", /*french*/"une #Skulltula près des lézards du temple de l'eau# a", /*spanish*/"#más allá de un pozo de reptiles# una Skulltula otorga", /*italian*/"un #ragno sopra una lucertola# nel Santuario dell'Acqua difende", /*german*/"in einer Spinne, nahe eines #Triforce-Symbols# des Wassertempels, |wäre|wären|"}, @@ -1006,7 +1017,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"those who #show the light above the Colossus# find", /*french*/"le #soleil au sommet du colosse# révèle", /*spanish*/"aquellos que #iluminen en lo alto del Coloso# encontrarán", /*italian*/"#chi sa riflettere bene# in cima al colosso può trovare", /*german*/"nahe einer #lichtbedürftigen Sonne, an der Spitze des Kolosses#, |wäre|wären|"}, }); - hintTable[SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = HintText::Exclude({ // obscure text Text{"#lying unguarded# in the Spirit Temple is", /*french*/"dans #l'entrée du colosse# se trouve", /*spanish*/"en la #entrada del Templo del Espíritu# yace", /*italian*/"un forziere #incustodito# all'ingresso del Santuario dello Spirito contiene", /*german*/"in einer #unbewachten Truhe# des Geistertempels, |wäre|wären|"}, @@ -1130,7 +1140,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a child defeats a #spider among bats# in the Spirit Temple to gain", /*french*/"une #Skulltula sur le grillage du temple de l'esprit# a", /*spanish*/"el joven que derrote la #Skulltula entre murciélagos# del Templo del Espíritu hallará", /*italian*/"un bambino può sconfiggere #un ragno fra i pipistrelli# nel Santuario dello Spirito per ottenere", /*german*/"in einer, #von Fledermäusen umgebenen Spinne# des Geistertempels, |wäre|wären|"}, }); - hintTable[SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = HintText::Exclude({ // obscure text Text{"#above a pit of sand# in the Spirit Temple hides", /*french*/"une #Skulltula au dessus du trou sableux du temple de l'esprit# a", /*spanish*/"una #Skulltula sobre un pozo de arena# del Templo del Espíritu otorga", /*italian*/"#sopra una fossa sabbiosa# nel Santuario dello Spirito si nasconde un ragno con", /*german*/"in einer Spinne, #über einer Sandgrube# des Geistertempels, |wäre|wären|"}, @@ -1237,7 +1246,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#inside a burning skull# lies", /*french*/"#dans un crâne enflammé# gît", /*spanish*/"en el #interior de una calavera en llamas# aguarda", /*italian*/"da un #vaso a forma di teschio# |salta|saltano| fuori", /*german*/"#in einem brennenden Schädel#, |wäre|wären|"}, }); - hintTable[SHADOW_TEMPLE_MQ_COMPASS_CHEST] = HintText::Exclude({ // obscure text Text{"the #Eye of Truth# pierces a hall of faces to reveal", /*french*/"l'#oeil de vérité# voit dans les couloirs du temple de l'ombre", /*spanish*/"el #Ojo de la Verdad# descubre un pasillo de facetas con", /*italian*/"l'#occhio della verità# penetra corridoi di facce per rivelare", /*german*/"hinter der Halle der Gesichter, vom #Auge der Wahrheit# aufgedeckt, |wäre|wären|"}, @@ -1369,7 +1377,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a spider near a #docked ship# hoards", /*french*/"une #Skulltula près du traversier du temple de l'ombre# a", /*spanish*/"una #Skulltula cercana a un navío# otorga", /*italian*/"un ragno vicino a un #traghetto infernale# nasconde", /*german*/"in einer Spinne, nahe eines #anlegenden Schiffes#, |wäre|wären|"}, }); - hintTable[SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = HintText::Exclude({ // obscure text Text{"a #spider beyond falling spikes# holds", /*french*/"une #Skulltula au delà de la pluie de clous du temple de l'ombre# a", /*spanish*/"una #Skulltula tras los pinchos del techo# otorga", /*italian*/"un #ragno oltre la pioggia d'acciaio# nasconde", /*german*/"in einer #Spinne hinter fallenden Stacheln#, |wäre|wären|"}, @@ -1463,6 +1470,45 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#inside a coffin# hides", /*french*/"dans #un cercueil# gît", /*spanish*/"en el #interior de un ataúd# yace", /*italian*/"#dentro una bara# puoi trovare", /*german*/"in einem #Sarg#, |wäre|wären|"}, }); + hintTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"falling through #an invisible floor# gives", /*french*/"falling through #an invisible floor# gives", /*spanish*/"falling through #an invisible floor# gives", /*italian*/"cadendo attraverso #un pavimento invisible# puoi ottenere", /*german*/"falling through #an invisible floor# gives"}, + },{}, + // clear text + Text{"the #rupees on the platform in the center pit of BOTW# hold", /*french*/"the #rupees on the platform in the center pit of BOTW# hold", /*spanish*/"the #rupees on the platform in the center pit of BOTW# hold", /*italian*/"#sulla piattaforma centrale nel pozzo# puoi trovare", /*german*/"the #rupees on the platform in the center pit of BOTW# hold"} + ); + + hintTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"falling through #an invisible floor# gives", /*french*/"falling through #an invisible floor# gives", /*spanish*/"falling through #an invisible floor# gives", /*italian*/"cadendo attraverso #un pavimento invisible# puoi ottenere", /*german*/"falling through #an invisible floor# gives"}, + },{}, + // clear text + Text{"the #rupees on the platform in the center pit of BOTW# hold", /*french*/"the #rupees on the platform in the center pit of BOTW# hold", /*spanish*/"the #rupees on the platform in the center pit of BOTW# hold", /*italian*/"#sulla piattaforma centrale nel pozzo# puoi trovare", /*german*/"the #rupees on the platform in the center pit of BOTW# hold"} + ); + + hintTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"falling through #an invisible floor# gives", /*french*/"falling through #an invisible floor# gives", /*spanish*/"falling through #an invisible floor# gives", /*italian*/"cadendo attraverso #un pavimento invisible# puoi ottenere", /*german*/"falling through #an invisible floor# gives"}, + },{}, + // clear text + Text{"the #rupees on the platform in the center pit of BOTW# hold", /*french*/"the #rupees on the platform in the center pit of BOTW# hold", /*spanish*/"the #rupees on the platform in the center pit of BOTW# hold", /*italian*/"#sulla piattaforma centrale nel pozzo# puoi trovare", /*german*/"the #rupees on the platform in the center pit of BOTW# hold"} + ); + + hintTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"falling through #an invisible floor# gives", /*french*/"falling through #an invisible floor# gives", /*spanish*/"falling through #an invisible floor# gives", /*italian*/"cadendo attraverso #un pavimento invisible# puoi ottenere", /*german*/"falling through #an invisible floor# gives"}, + },{}, + // clear text + Text{"the #rupees on the platform in the center pit of BOTW# hold", /*french*/"the #rupees on the platform in the center pit of BOTW# hold", /*spanish*/"the #rupees on the platform in the center pit of BOTW# hold", /*italian*/"#sulla piattaforma centrale nel pozzo# puoi trovare", /*german*/"the #rupees on the platform in the center pit of BOTW# hold"} + ); + + hintTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_5] = HintText::Exclude({ + // obscure text + Text{"falling through #an invisible floor# gives", /*french*/"falling through #an invisible floor# gives", /*spanish*/"falling through #an invisible floor# gives", /*italian*/"cadendo attraverso #un pavimento invisible# puoi ottenere", /*german*/"falling through #an invisible floor# gives"}, + },{}, + // clear text + Text{"the #rupees on the platform in the center pit of BOTW# hold", /*french*/"the #rupees on the platform in the center pit of BOTW# hold", /*spanish*/"the #rupees on the platform in the center pit of BOTW# hold", /*italian*/"#sulla piattaforma centrale nel pozzo# puoi trovare", /*german*/"the #rupees on the platform in the center pit of BOTW# hold"} + ); hintTable[BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = HintText::Exclude({ // obscure text @@ -1499,7 +1545,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider locked in a crypt# within the well guards", /*french*/"une #Skulltula embarrée dans la crypte au fonds du puits# a", /*spanish*/"una #Skulltula encerrada en una cripta# del pozo otorga", /*italian*/"un #ragno in una cripta# nel pozzo possiede", /*german*/"in der #Spinne, einer verschlossenen Krypta# des Brunnens, |wäre|wären|"}, }); - hintTable[BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = HintText::Exclude({ // obscure text Text{"a #gauntlet of invisible spiders# protects", /*french*/"une #Skulltula protégée par les araignées invisibles au fonds du puits# a", /*spanish*/"unas #arañas invisibles# custodian una Skulltula que otorga", /*italian*/"un #ragno protetto da una sfilza di simili invisibili# nel pozzo possiede", /*german*/"in der Spinne hinter einem #arachniden Spießrutenlauf#, |wäre|wären|"}, @@ -1538,6 +1583,37 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #wall of ice# protects", /*french*/"un #mur de glace rouge# cache", /*spanish*/"una #gélida pared# protege", /*italian*/"un #muro di ghiaccio# cela", /*german*/"hinter einer #Wand aus Eis#, |wäre|wären|"}, }); + hintTable[ICE_CAVERN_RED_ICE_BLUE_RUPEE] = HintText::Exclude({ + // obscure text + Text{"#some Gatorade will melt#", /*french*/"#some Gatorade will melt#", /*spanish*/"#some Gatorade will melt#", /*italian*/"#un po' di Gatorade può scongelare#", /*german*/"#some Gatorade will melt#"}, + },{}, + // clear text + Text{"melting #the red ice in the first Ice Cavern room# will give", /*french*/"melting #the red ice in the first Ice Cavern room# will give", /*spanish*/"melting #the red ice in the first Ice Cavern room# will give", /*italian*/"il #ghiaccio rosso nella prima stanza della caverna di ghiaccio# contiene", /*german*/"melting #the red ice in the first Ice Cavern room# will give"} + ); + + hintTable[ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"apparently #cold cancels out gravity# on", /*french*/"apparently #cold cancels out gravity# on", /*spanish*/"apparently #cold cancels out gravity# on", /*italian*/"apparentemente #il freddo annulla la forza di gravità# per", /*german*/"apparently #cold cancels out gravity# on"}, + },{}, + // clear text + Text{"#the rupees floating above the push blocks in Ice Cavern# are", /*french*/"#the rupees floating above the push blocks in Ice Cavern# are", /*spanish*/"#the rupees floating above the push blocks in Ice Cavern# are", /*italian*/"#a mezz'aria nella caverna di ghiaccio# puoi veder fluttuare", /*german*/"#the rupees floating above the push blocks in Ice Cavern# are"} + ); + + hintTable[ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"apparently #cold cancels out gravity# on", /*french*/"apparently #cold cancels out gravity# on", /*spanish*/"apparently #cold cancels out gravity# on", /*italian*/"apparentemente #il freddo annulla la forza di gravità# per", /*german*/"apparently #cold cancels out gravity# on"}, + },{}, + // clear text + Text{"#the rupees floating above the push blocks in Ice Cavern# are", /*french*/"#the rupees floating above the push blocks in Ice Cavern# are", /*spanish*/"#the rupees floating above the push blocks in Ice Cavern# are", /*italian*/"#a mezz'aria nella caverna di ghiaccio# puoi veder fluttuare", /*german*/"#the rupees floating above the push blocks in Ice Cavern# are"} + ); + + hintTable[ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"apparently #cold cancels out gravity# on", /*french*/"apparently #cold cancels out gravity# on", /*spanish*/"apparently #cold cancels out gravity# on", /*italian*/"apparentemente #il freddo annulla la forza di gravità# per", /*german*/"apparently #cold cancels out gravity# on"}, + },{}, + // clear text + Text{"#the rupees floating above the push blocks in Ice Cavern# are", /*french*/"#the rupees floating above the push blocks in Ice Cavern# are", /*spanish*/"#the rupees floating above the push blocks in Ice Cavern# are", /*italian*/"#a mezz'aria nella caverna di ghiaccio# puoi veder fluttuare", /*german*/"#the rupees floating above the push blocks in Ice Cavern# are"} + ); hintTable[ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = HintText::Exclude({ // obscure text @@ -1574,7 +1650,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"a #spider behind a wall of ice# hides", /*french*/"une #Skulltula derrière un mur de glace# a", /*spanish*/"una #Skulltula tras una gélida pared# otorga", /*italian*/"un #ragno dietro un muro di ghiaccio# cela", /*german*/"in einer #Spinne hinter einer Wand aus Eis#, |wäre|wären|"}, }); - hintTable[ICE_CAVERN_MQ_GS_SCARECROW] = HintText::Exclude({ // obscure text Text{"a #spider above icy pits# holds", /*french*/"une #Skulltula au dessus d'un goufre glacial# a", /*spanish*/"una #Skulltula sobre gélidos vacíos# otorga", /*italian*/"un ragno #presso un crepaccio nel ghiaccio# cela", /*german*/"in einer #Spinne über eisigen Abgründen#, |wäre|wären|"}, @@ -1693,7 +1768,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"the #Song of Time# in the Gerudo Training Grounds leads to", /*french*/"le #chant du temps# révèle dans le gymnase Gerudo", /*spanish*/"la #Canción del Tiempo# en el Centro de Instrucción Gerudo conduce a", /*italian*/"la #Canzone del tempo# nella zona di addestramento Gerudo apre la via per", /*german*/"nach der #Hymne der Zeit# beim Training der Diebe, |wäre|wären|"}, }); - hintTable[GERUDO_TRAINING_GROUNDS_MQ_LOBBY_RIGHT_CHEST] = HintText::Exclude({ // obscure text Text{"#thieves prepare for training# with", /*french*/"dans #l'entrée du gymnase Gerudo# gît", /*spanish*/"las #bandidas se instruyen# con", /*italian*/"i #ladri si preparano all'addestramento# con", /*german*/"vor dem Training der Diebe, |wäre|wären|"}, @@ -1777,7 +1851,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"the #Evil King# hoards", /*french*/"le #Roi du Mal# possède", /*spanish*/"el #Rey del Mal# acapara", /*italian*/"il #re del male# custodisce", /*german*/"der Schatz vom #Großmeister des Bösen#, |wäre|wären|"}, }); - hintTable[GANONS_CASTLE_FOREST_TRIAL_CHEST] = HintText::Exclude({ // obscure text Text{"the #test of the wilds# holds", /*french*/"l'#épreuve des bois# contient", /*spanish*/"la #prueba de la naturaleza# brinda", /*italian*/"la #prova della natura# cela", /*german*/"in der #Prüfung der Wildnis#, |wäre|wären|"}, @@ -1853,7 +1926,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#music in the test of radiance# reveals", /*french*/"la #musique dans l'épreuve du ciel# révèle", /*spanish*/"la #música en la prueba del resplandor# revela", /*italian*/"#musica nella prova dello splendore# cela", /*german*/"nahe #Musik in der Prüfung der Strahlen#, |wäre|wären|"}, }); - hintTable[GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText::Exclude({ // obscure text Text{"the #test of the seas# holds", /*french*/"l'#épreuve des mers# contient", /*spanish*/"la #prueba del mar# brinda", /*italian*/"la #prova del mare# cela", /*german*/"in der #Prüfung des Meeres#, |wäre|wären|"}, @@ -1939,7 +2011,6 @@ void HintTable_Init_Exclude_Dungeon() { Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden", /*italian*/"un #cespuglio nel castello di Ganon# vende", /*german*/"die Ware, eines #Deku-Händlers in Ganons Schloss#, |wäre|wären|"}, }); - hintTable[GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = HintText::Exclude({ // obscure text Text{"#scrubs in Ganon's Castle# sell", /*french*/"les #pestes Mojo dans le château de Ganon# vendent", /*spanish*/"los #dekus del Castillo de Ganon# venden", /*italian*/"un #cespuglio nel castello di Ganon# vende", /*german*/"die Ware, eines #Deku-Händlers in Ganons Schloss#, |wäre|wären|"}, diff --git a/source/hint_list/hint_list_exclude_overworld.cpp b/source/hint_list/hint_list_exclude_overworld.cpp index 50adbbdaf..dac6979a3 100644 --- a/source/hint_list/hint_list_exclude_overworld.cpp +++ b/source/hint_list/hint_list_exclude_overworld.cpp @@ -38,6 +38,126 @@ void HintTable_Init_Exclude_Overworld() { Text{"#inside Mido's house# is", /*french*/"#dans la maison de Mido# gît", /*spanish*/"en la #casa de Mido# yace", /*italian*/"nella #casa di Mido# puoi trovare", /*german*/"#in Midos Haus#, |wäre|wären|"} ); + hintTable[KF_END_OF_BRIDGE_BLUE_RUPEE] = HintText::Exclude({ + // obscure text + Text{"a #gem next to a forest girl# is", /*french*/"a #gem next to a forest girl# is", /*spanish*/"a #gem next to a forest girl# is", /*italian*/"#di fianco a una ragazza bionda nella foresta# puoi trovare", /*german*/"a #gem next to a forest girl# is"}, + }, {}, + // clear text + Text{"a #rupee on the end of a bridge# is", /*french*/"a #rupee on the end of a bridge# is", /*spanish*/"a #rupee on the end of a bridge# is", /*italian*/"#alla fine di una passerella nella foresta# puoi trovare", /*german*/"a #rupee on the end of a bridge# is"} + ); + + hintTable[KF_BEHIND_MIDOS_HOUSE_BLUE_RUPEE] = HintText::Exclude({ + // obscure text + Text{"the #backside of a Kokiri house# hides", /*french*/"the #backside of a Kokiri house# hides", /*spanish*/"the #backside of a Kokiri house# hides", /*italian*/"il #retro di una casa Kokiri# nasconde", /*german*/"the #backside of a Kokiri house# hides"}, + }, {}, + // clear text + Text{"the #rupee behind Mido's house# hides", /*french*/"the #rupee behind Mido's house# hides", /*spanish*/"the #rupee behind Mido's house# hides", /*italian*/"#dietro alla casa di Mido# puoi trovare", /*german*/"the #rupee behind Mido's house# hides"} + ); + + hintTable[KF_BOULDER_MAZE_BLUE_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"when #playing Indiana Jones# you can find", /*french*/"when #playing Indiana Jones# you can find", /*spanish*/"when #playing Indiana Jones# you can find", /*italian*/"#giocando a Indiana Jones# puoi trovare", /*german*/"when #playing Indiana Jones# you can find"}, + }, {}, + // clear text + Text{"in the #Kokiri boulder maze# you can find", /*french*/"in the #Kokiri boulder maze# you can find", /*spanish*/"in the #Kokiri boulder maze# you can find", /*italian*/"presso #un masso rotolante nella foresta dei Kokiri# puoi trovare", /*german*/"in the #Kokiri boulder maze# you can find"} + ); + + hintTable[KF_BOULDER_MAZE_BLUE_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"#watching out for rolling stones# you can find", /*french*/"#watching out for rolling stones# you can find", /*spanish*/"#watching out for rolling stones# you can find", /*italian*/"chi #impara a usare L# può trovare", /*german*/"#watching out for rolling stones# you can find"}, + }, {}, + // clear text + Text{"in the #Kokiri boulder maze# you can find", /*french*/"in the #Kokiri boulder maze# you can find", /*spanish*/"in the #Kokiri boulder maze# you can find", /*italian*/"presso #un masso rotolante nella foresta dei Kokiri# puoi trovare", /*german*/"in the #Kokiri boulder maze# you can find"} + ); + + hintTable[KF_NEAR_RAMP_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"some #grassy flowers# obscure", /*french*/"some #grassy flowers# obscure", /*spanish*/"some #grassy flowers# obscure", /*italian*/"un #prato fiorito# nasconde", /*german*/"some #grassy flowers# obscure"}, + }, {}, + // clear text + Text{"#in the grass near the ramp in Kokiri Forest# is", /*french*/"#in the grass near the ramp in Kokiri Forest# is", /*spanish*/"#in the grass near the ramp in Kokiri Forest# is", /*italian*/"#l'erba nella foresta dei Kokiri# nasconde", /*german*/"#in the grass near the ramp in Kokiri Forest# is"} + ); + + hintTable[KF_NEAR_RAMP_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"some #grassy flowers# obscure", /*french*/"some #grassy flowers# obscure", /*spanish*/"some #grassy flowers# obscure", /*italian*/"un #prato fiorito# nasconde", /*german*/"some #grassy flowers# obscure"}, + }, {}, + // clear text + Text{"#in the grass near the ramp in Kokiri Forest# is", /*french*/"#in the grass near the ramp in Kokiri Forest# is", /*spanish*/"#in the grass near the ramp in Kokiri Forest# is", /*italian*/"#l'erba nella foresta dei Kokiri# nasconde", /*german*/"#in the grass near the ramp in Kokiri Forest# is"} + ); + + hintTable[KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"some #grassy flowers# obscure", /*french*/"some #grassy flowers# obscure", /*spanish*/"some #grassy flowers# obscure", /*italian*/"un #prato fiorito# nasconde", /*german*/"some #grassy flowers# obscure"}, + }, {}, + // clear text + Text{"#near Mido's house in the grass# is", /*french*/"#near Mido's house in the grass# is", /*spanish*/"#near Mido's house in the grass# is", /*italian*/"#l'erba vicino alla casa di Mido# nasconde", /*german*/"#near Mido's house in the grass# is"} + ); + + hintTable[KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"some #grassy flowers# obscure", /*french*/"some #grassy flowers# obscure", /*spanish*/"some #grassy flowers# obscure", /*italian*/"un #prato fiorito# nasconde", /*german*/"some #grassy flowers# obscure"}, + }, {}, + // clear text + Text{"#near Mido's house in the grass# is", /*french*/"#near Mido's house in the grass# is", /*spanish*/"#near Mido's house in the grass# is", /*italian*/"#l'erba vicino alla casa di Mido# nasconde", /*german*/"#near Mido's house in the grass# is"} + ); + + hintTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"a #sparkly circle in the forest# includes", /*french*/"a #sparkly circle in the forest# includes", /*spanish*/"a #sparkly circle in the forest# includes", /*italian*/"in una #nicchia rialzata nella foresta# puoi trovare", /*german*/"a #sparkly circle in the forest# includes"}, + }, {}, + // clear text + Text{"a #rupee on the platform in Kokiri Forest# is", /*french*/"a #rupee on the platform in Kokiri Forest# is", /*spanish*/"a #rupee on the platform in Kokiri Forest# is", /*italian*/"un #cerchio di oggetti nella foresta dei Kokiri# include", /*german*/"a #rupee on the platform in Kokiri Forest# is"} + ); + + hintTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"a #sparkly circle in the forest# includes", /*french*/"a #sparkly circle in the forest# includes", /*spanish*/"a #sparkly circle in the forest# includes", /*italian*/"in una #nicchia rialzata nella foresta# puoi trovare", /*german*/"a #sparkly circle in the forest# includes"}, + }, {}, + // clear text + Text{"a #rupee on the platform in Kokiri Forest# is", /*french*/"a #rupee on the platform in Kokiri Forest# is", /*spanish*/"a #rupee on the platform in Kokiri Forest# is", /*italian*/"un #cerchio di oggetti nella foresta dei Kokiri# include", /*german*/"a #rupee on the platform in Kokiri Forest# is"} + ); + + hintTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"a #sparkly circle in the forest# includes", /*french*/"a #sparkly circle in the forest# includes", /*spanish*/"a #sparkly circle in the forest# includes", /*italian*/"in una #nicchia rialzata nella foresta# puoi trovare", /*german*/"a #sparkly circle in the forest# includes"}, + }, {}, + // clear text + Text{"a #rupee on the platform in Kokiri Forest# is", /*french*/"a #rupee on the platform in Kokiri Forest# is", /*spanish*/"a #rupee on the platform in Kokiri Forest# is", /*italian*/"un #cerchio di oggetti nella foresta dei Kokiri# include", /*german*/"a #rupee on the platform in Kokiri Forest# is"} + ); + + hintTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"a #sparkly circle in the forest# includes", /*french*/"a #sparkly circle in the forest# includes", /*spanish*/"a #sparkly circle in the forest# includes", /*italian*/"in una #nicchia rialzata nella foresta# puoi trovare", /*german*/"a #sparkly circle in the forest# includes"}, + }, {}, + // clear text + Text{"a #rupee on the platform in Kokiri Forest# is", /*french*/"a #rupee on the platform in Kokiri Forest# is", /*spanish*/"a #rupee on the platform in Kokiri Forest# is", /*italian*/"un #cerchio di oggetti nella foresta dei Kokiri# include", /*german*/"a #rupee on the platform in Kokiri Forest# is"} + ); + + hintTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_5] = HintText::Exclude({ + // obscure text + Text{"a #sparkly circle in the forest# includes", /*french*/"a #sparkly circle in the forest# includes", /*spanish*/"a #sparkly circle in the forest# includes", /*italian*/"in una #nicchia rialzata nella foresta# puoi trovare", /*german*/"a #sparkly circle in the forest# includes"}, + }, {}, + // clear text + Text{"a #rupee on the platform in Kokiri Forest# is", /*french*/"a #rupee on the platform in Kokiri Forest# is", /*spanish*/"a #rupee on the platform in Kokiri Forest# is", /*italian*/"un #cerchio di oggetti nella foresta dei Kokiri# include", /*german*/"a #rupee on the platform in Kokiri Forest# is"} + ); + + hintTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_6] = HintText::Exclude({ + // obscure text + Text{"a #sparkly circle in the forest# includes", /*french*/"a #sparkly circle in the forest# includes", /*spanish*/"a #sparkly circle in the forest# includes", /*italian*/"in una #nicchia rialzata nella foresta# puoi trovare", /*german*/"a #sparkly circle in the forest# includes"}, + }, {}, + // clear text + Text{"a #rupee on the platform in Kokiri Forest# is", /*french*/"a #rupee on the platform in Kokiri Forest# is", /*spanish*/"a #rupee on the platform in Kokiri Forest# is", /*italian*/"un #cerchio di oggetti nella foresta dei Kokiri# include", /*german*/"a #rupee on the platform in Kokiri Forest# is"} + ); + + hintTable[KF_RUPEE_CIRCLE_RED_RUPEE] = HintText::Exclude({ + // obscure text + Text{"a #red one in green surroundings# has", /*french*/"a #red one in green surroundings# has", /*spanish*/"a #red one in green surroundings# has", /*italian*/"in una #nicchia rialzata nella foresta# puoi trovare", /*german*/"a #red one in green surroundings# has"}, + }, {}, + // clear text + Text{"the #red rupee on the platform in Kokiri Forest# is", /*french*/"the #red rupee on the platform in Kokiri Forest# is", /*spanish*/"the #red rupee on the platform in Kokiri Forest# is", /*italian*/"un #cerchio di oggetti nella foresta dei Kokiri# include", /*german*/"the #red rupee on the platform in Kokiri Forest# is"} + ); + hintTable[GRAVEYARD_SHIELD_GRAVE_CHEST] = HintText::Exclude({ // obscure text Text{"the #treasure of a fallen soldier# is", /*french*/"le #trésor du soldat mort# est", /*spanish*/"el #tesoro de un soldado caído# esconde", /*italian*/"il #tesoro di un soldato caduto# è", /*german*/"der #Schatz eines gefallenen Soldaten#, |wäre|wären|"}, @@ -71,6 +191,62 @@ void HintTable_Init_Exclude_Overworld() { Text{"#dead Dampé's first prize# is", /*french*/"la #première course d'Igor# donne", /*spanish*/"el primer premio de #la carrera de Dampé# se trata de", /*italian*/"la prima ricompensa del #fantasma di Danpei# è", /*german*/"#Boris' erster Preis#, |wäre|wären|"} ); + hintTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"#straying off a racing course# gives you", /*french*/"#straying off a racing course# gives you", /*spanish*/"#straying off a racing course# gives you", /*italian*/"#sbagliare strada durante una gara# conduce a", /*german*/"#straying off a racing course# gives you"}, + },{}, + Text{"#during Dampé's race# you can find", /*french*/"#during Dampé's race# you can find", /*spanish*/"#during Dampé's race# you can find", /*italian*/"#durante la gara con Danpei# puoi trovare", /*german*/"#during Dampé's race# you can find"} + ); + + hintTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"#straying off a racing course# gives you", /*french*/"#straying off a racing course# gives you", /*spanish*/"#straying off a racing course# gives you", /*italian*/"#sbagliare strada durante una gara# conduce a", /*german*/"#straying off a racing course# gives you"}, + },{}, + Text{"#during Dampé's race# you can find", /*french*/"#during Dampé's race# you can find", /*spanish*/"#during Dampé's race# you can find", /*italian*/"#durante la gara con Danpei# puoi trovare", /*german*/"#during Dampé's race# you can find"} + ); + + hintTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"#straying off a racing course# gives you", /*french*/"#straying off a racing course# gives you", /*spanish*/"#straying off a racing course# gives you", /*italian*/"#sbagliare strada durante una gara# conduce a", /*german*/"#straying off a racing course# gives you"}, + },{}, + Text{"#during Dampé's race# you can find", /*french*/"#during Dampé's race# you can find", /*spanish*/"#during Dampé's race# you can find", /*italian*/"#durante la gara con Danpei# puoi trovare", /*german*/"#during Dampé's race# you can find"} + ); + + hintTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"#straying off a racing course# gives you", /*french*/"#straying off a racing course# gives you", /*spanish*/"#straying off a racing course# gives you", /*italian*/"#sbagliare strada durante una gara# conduce a", /*german*/"#straying off a racing course# gives you"}, + },{}, + Text{"#during Dampé's race# you can find", /*french*/"#during Dampé's race# you can find", /*spanish*/"#during Dampé's race# you can find", /*italian*/"#durante la gara con Danpei# puoi trovare", /*german*/"#during Dampé's race# you can find"} + ); + + hintTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_5] = HintText::Exclude({ + // obscure text + Text{"#straying off a racing course# gives you", /*french*/"#straying off a racing course# gives you", /*spanish*/"#straying off a racing course# gives you", /*italian*/"#sbagliare strada durante una gara# conduce a", /*german*/"#straying off a racing course# gives you"}, + },{}, + Text{"#during Dampé's race# you can find", /*french*/"#during Dampé's race# you can find", /*spanish*/"#during Dampé's race# you can find", /*italian*/"#durante la gara con Danpei# puoi trovare", /*german*/"#during Dampé's race# you can find"} + ); + + hintTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_6] = HintText::Exclude({ + // obscure text + Text{"#straying off a racing course# gives you", /*french*/"#straying off a racing course# gives you", /*spanish*/"#straying off a racing course# gives you", /*italian*/"#sbagliare strada durante una gara# conduce a", /*german*/"#straying off a racing course# gives you"}, + },{}, + Text{"#during Dampé's race# you can find", /*french*/"#during Dampé's race# you can find", /*spanish*/"#during Dampé's race# you can find", /*italian*/"#durante la gara con Danpei# puoi trovare", /*german*/"#during Dampé's race# you can find"} + ); + + hintTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_7] = HintText::Exclude({ + // obscure text + Text{"#straying off a racing course# gives you", /*french*/"#straying off a racing course# gives you", /*spanish*/"#straying off a racing course# gives you", /*italian*/"#sbagliare strada durante una gara# conduce a", /*german*/"#straying off a racing course# gives you"}, + },{}, + Text{"#during Dampé's race# you can find", /*french*/"#during Dampé's race# you can find", /*spanish*/"#during Dampé's race# you can find", /*italian*/"#durante la gara con Danpei# puoi trovare", /*german*/"#during Dampé's race# you can find"} + ); + + hintTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_8] = HintText::Exclude({ + // obscure text + Text{"#straying off a racing course# gives you", /*french*/"#straying off a racing course# gives you", /*spanish*/"#straying off a racing course# gives you", /*italian*/"#sbagliare strada durante una gara# conduce a", /*german*/"#straying off a racing course# gives you"}, + },{}, + Text{"#during Dampé's race# you can find", /*french*/"#during Dampé's race# you can find", /*spanish*/"#during Dampé's race# you can find", /*italian*/"#durante la gara con Danpei# puoi trovare", /*german*/"#during Dampé's race# you can find"} + ); + hintTable[GF_CHEST] = HintText::Exclude({ // obscure text Text{"on a #rooftop in the desert# lies", /*french*/"sur un #toit du désert# gît", /*spanish*/"en una #azotea del desierto# yace", /*italian*/"sopra un #tetto in un deserto# puoi trovare", /*german*/"auf einem #Dach der Wüste#, |wäre|wären|"}, @@ -155,6 +331,151 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #fairy of winds# holds", /*french*/"la #fée du vent# a", /*spanish*/"el #hada del viento# brinda", /*italian*/"la #fata del vento# consegna", /*german*/"in der #Feen-Quelle des Sturmes#, |wäre|wären|"}, }); + hintTable[ZF_UNDERWATER_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_5] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_6] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_7] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_8] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_9] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_10] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_11] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_12] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_13] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_14] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_15] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_16] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_17] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + + hintTable[ZF_UNDERWATER_GREEN_RUPEE_18] = HintText::Exclude({ + // obscure text + Text{"#Jabu's shiny poo# includes", /*french*/"#Jabu's shiny poo# includes", /*spanish*/"#Jabu's shiny poo# includes", /*italian*/"nelle #acque ghiacciate# qualcuno ha buttato", /*german*/"#Jabu's shiny poo# includes"}, + }, {}, + //clear text + Text{"#one of the rupees underwater in Zora's Fountain# is", /*french*/"#one of the rupees underwater in Zora's Fountain# is", /*spanish*/"#one of the rupees underwater in Zora's Fountain# is", /*italian*/"#sott'acqua nella sorgente Zora# puoi trovare", /*german*/"#one of the rupees underwater in Zora's Fountain# is"} + ); + hintTable[HC_GREAT_FAIRY_REWARD] = HintText::Exclude({ // obscure text Text{"the #fairy of fire# holds", /*french*/"la #fée du feu# a", /*spanish*/"el #hada del fuego# brinda", /*italian*/"la #fata del fuoco# consegna", /*german*/"in der #Feen-Quelle des Feuers#, |wäre|wären|"}, @@ -383,6 +704,57 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #sunken treasure in a lake# is", /*french*/"le #trésor au fond du lac# est", /*spanish*/"el #tesoro hundido del lago# se trata de", /*italian*/"il #tesoro sommerso nel lago# è", /*german*/"der #versunkene Schatz eines Sees#, |wäre|wären|"}, }); + hintTable[LH_UNDER_WATER_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"#in shallow water of a lake# shimmers", /*french*/"#in shallow water of a lake# shimmers", /*spanish*/"#in shallow water of a lake# shimmers", /*italian*/"#nell'acqua bassa in riva a un lago# luccica||no|", /*german*/"#in shallow water of a lake# shimmers"}, + },{}, + //clear text + Text{"#the first underwater rupee in Lake Hylia# is", /*french*/"#the first underwater rupee in Lake Hylia# is", /*spanish*/"#the first underwater rupee in Lake Hylia# is", /*italian*/"il #primo oggetto sott'acqua nel Lago Hylia# |è|sono|", /*german*/"#the first underwater rupee in Lake Hylia# is"} + ); + + hintTable[LH_UNDER_WATER_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"#in deeper water of a lake# shimmers", /*french*/"#in deeper water of a lake# shimmers", /*spanish*/"#in deeper water of a lake# shimmers", /*italian*/"#nell'acqua profonda in riva a un lago# luccica||no|", /*german*/"#in deeper water of a lake# shimmers"}, + },{}, + //clear text + Text{"#the second underwater rupee in Lake Hylia# is", /*french*/"#the second underwater rupee in Lake Hylia# is", /*spanish*/"#the second underwater rupee in Lake Hylia# is", /*italian*/"il #secondo oggetto sott'acqua nel Lago Hylia# |è|sono|", /*german*/"#the second underwater rupee in Lake Hylia# is"} + ); + + hintTable[LH_UNDER_WATER_GREEN_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"#in deeper water of a lake# shimmers", /*french*/"#in deeper water of a lake# shimmers", /*spanish*/"#in deeper water of a lake# shimmers", /*italian*/"#nell'acqua profonda in riva a un lago# luccica||no|", /*german*/"#in deeper water of a lake# shimmers"}, + },{}, + //clear text + Text{"#the third underwater rupee in Lake Hylia# is", /*french*/"#the third underwater rupee in Lake Hylia# is", /*spanish*/"#the third underwater rupee in Lake Hylia# is", /*italian*/"il #terzo oggetto sott'acqua nel Lago Hylia# |è|sono|", /*german*/"#the third underwater rupee in Lake Hylia# is"} + ); + + hintTable[LH_LAB_DIVE_RED_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"#a shark stares at#", /*french*/"#a shark stares at#", /*spanish*/"#a shark stares at#", /*italian*/"#uno squalo osserva con attenzione#", /*german*/"#a shark stares at#"}, + Text{"someone is trying to #make medicine by mixing water and#", /*french*/"someone is trying to #make medicine by mixing water and#", /*spanish*/"someone is trying to #make medicine by mixing water and#", /*italian*/"qualcuno sta cercando di #produrre nuove medicine combinando acqua e#", /*german*/"someone is trying to #make medicine by mixing water and#"}, + },{}, + //clear text + Text{"#in the water of the Lake Hylia Lab# you can find", /*french*/"#in the water of the Lake Hylia Lab# you can find", /*spanish*/"#in the water of the Lake Hylia Lab# you can find", /*italian*/"#nell'acqua del laboratorio del Lago Hylia# puoi trovare", /*german*/"#in the water of the Lake Hylia Lab# you can find"} + ); + + hintTable[LH_LAB_DIVE_RED_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"#a shark stares at#", /*french*/"#a shark stares at#", /*spanish*/"#a shark stares at#", /*italian*/"#uno squalo osserva con attenzione#", /*german*/"#a shark stares at#"}, + Text{"someone is trying to #make medicine by mixing water and#", /*french*/"someone is trying to #make medicine by mixing water and#", /*spanish*/"someone is trying to #make medicine by mixing water and#", /*italian*/"qualcuno sta cercando di #produrre nuove medicine combinando acqua e#", /*german*/"someone is trying to #make medicine by mixing water and#"}, + },{}, + //clear text + Text{"#in the water of the Lake Hylia Lab# you can find", /*french*/"#in the water of the Lake Hylia Lab# you can find", /*spanish*/"#in the water of the Lake Hylia Lab# you can find", /*italian*/"#nell'acqua del laboratorio del Lago Hylia# puoi trovare", /*german*/"#in the water of the Lake Hylia Lab# you can find"} + ); + + hintTable[LH_LAB_DIVE_RED_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"#a shark stares at#", /*french*/"#a shark stares at#", /*spanish*/"#a shark stares at#", /*italian*/"#uno squalo osserva con attenzione#", /*german*/"#a shark stares at#"}, + Text{"someone is trying to #make medicine by mixing water and#", /*french*/"someone is trying to #make medicine by mixing water and#", /*spanish*/"someone is trying to #make medicine by mixing water and#", /*italian*/"qualcuno sta cercando di #produrre nuove medicine combinando acqua e#", /*german*/"someone is trying to #make medicine by mixing water and#"}, + },{}, + //clear text + Text{"#in the water of the Lake Hylia Lab# you can find", /*french*/"#in the water of the Lake Hylia Lab# you can find", /*spanish*/"#in the water of the Lake Hylia Lab# you can find", /*italian*/"#nell'acqua del laboratorio del Lago Hylia# puoi trovare", /*german*/"#in the water of the Lake Hylia Lab# you can find"} + ); + hintTable[GF_GERUDO_TOKEN] = HintText::Exclude({ // obscure text Text{"#rescuing captured carpenters# is rewarded with", /*french*/"#secourir les charpentiers capturés# assure", /*spanish*/"#rescatar los apresados carpinteros# se premia con", /*italian*/"chi salverà i #carpentieri prigionieri# riceverà", /*german*/"bei #geretteten Zimmerleuten#, |wäre|wären|"}, @@ -481,6 +853,78 @@ void HintTable_Init_Exclude_Overworld() { Text{"above a #mountain cavern entrance# is", /*french*/"gisant #au dessus de la caverne montagneuse# gît", /*spanish*/"en lo alto de la #entrada de una cueva en la montaña# yace", /*italian*/"sopra #l'ingresso di una caverna montana# puoi trovare", /*german*/"über einem #Höhleneingang des Berges#, |wäre|wären|"}, }); + hintTable[DMT_ROCK_BLUE_RUPEE] = HintText::Exclude({ + // obscure text + Text{"#a mountain boulder# holds", /*french*/"#a mountain boulder# holds", /*spanish*/"#a mountain boulder# holds", /*italian*/"un #macigno in montagna# nasconde", /*german*/"#a mountain boulder# holds"}, + }, {}, + //clear text + Text{"#the rock with a blue rupee on Death Mountain Trail# has", /*french*/"#the rock with a blue rupee on Death Mountain Trail# has", /*spanish*/"#the rock with a blue rupee on Death Mountain Trail# has", /*italian*/"un #macigno sul sentiero del Monte Morte# copre", /*german*/"#the rock with a blue rupee on Death Mountain Trail# has"} + ); + + hintTable[DMT_ROCK_RED_RUPEE] = HintText::Exclude({ + // obscure text + Text{"#a mountain boulder# holds", /*french*/"#a mountain boulder# holds", /*spanish*/"#a mountain boulder# holds", /*italian*/"un #macigno in montagna# nasconde", /*german*/"#a mountain boulder# holds"}, + }, {}, + // clear text + Text{"#the rock with a red rupee on Death Mountain Trail# has", /*french*/"#the rock with a red rupee on Death Mountain Trail# has", /*spanish*/"#the rock with a red rupee on Death Mountain Trail# has", /*italian*/"un #macigno sul sentiero del Monte Morte# copre", /*german*/"#the rock with a red rupee on Death Mountain Trail# has"} + ); + + hintTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"#a cow looks at#", /*french*/"#a cow looks at#", /*spanish*/"#a cow looks at#", /*italian*/"#una mucca osserva con attenzione#", /*german*/"#a cow looks at#"}, + }, {}, + // clear text + Text{"#the rupee circle in the cow grotto in DMT# includes", /*french*/"#the rupee circle in the cow grotto in DMT# includes", /*spanish*/"#the rupee circle in the cow grotto in DMT# includes", /*italian*/"il #cerchio di oggetti nella grotta sul sentiero del Monte Morte# include", /*german*/"#the rupee circle in the cow grotto in DMT# includes"} + ); + + hintTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"#a cow looks at#", /*french*/"#a cow looks at#", /*spanish*/"#a cow looks at#", /*italian*/"#una mucca osserva con attenzione#", /*german*/"#a cow looks at#"}, + }, {}, + // clear text + Text{"#the rupee circle in the cow grotto in DMT# includes", /*french*/"#the rupee circle in the cow grotto in DMT# includes", /*spanish*/"#the rupee circle in the cow grotto in DMT# includes", /*italian*/"il #cerchio di oggetti nella grotta sul sentiero del Monte Morte# include", /*german*/"#the rupee circle in the cow grotto in DMT# includes"} + ); + + hintTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"#a cow looks at#", /*french*/"#a cow looks at#", /*spanish*/"#a cow looks at#", /*italian*/"#una mucca osserva con attenzione#", /*german*/"#a cow looks at#"}, + }, {}, + // clear text + Text{"#the rupee circle in the cow grotto in DMT# includes", /*french*/"#the rupee circle in the cow grotto in DMT# includes", /*spanish*/"#the rupee circle in the cow grotto in DMT# includes", /*italian*/"il #cerchio di oggetti nella grotta sul sentiero del Monte Morte# include", /*german*/"#the rupee circle in the cow grotto in DMT# includes"} + ); + + hintTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"#a cow looks at#", /*french*/"#a cow looks at#", /*spanish*/"#a cow looks at#", /*italian*/"#una mucca osserva con attenzione#", /*german*/"#a cow looks at#"}, + }, {}, + // clear text + Text{"#the rupee circle in the cow grotto in DMT# includes", /*french*/"#the rupee circle in the cow grotto in DMT# includes", /*spanish*/"#the rupee circle in the cow grotto in DMT# includes", /*italian*/"il #cerchio di oggetti nella grotta sul sentiero del Monte Morte# include", /*german*/"#the rupee circle in the cow grotto in DMT# includes"} + ); + + hintTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_5] = HintText::Exclude({ + // obscure text + Text{"#a cow looks at#", /*french*/"#a cow looks at#", /*spanish*/"#a cow looks at#", /*italian*/"#una mucca osserva con attenzione#", /*german*/"#a cow looks at#"}, + }, {}, + // clear text + Text{"#the rupee circle in the cow grotto in DMT# includes", /*french*/"#the rupee circle in the cow grotto in DMT# includes", /*spanish*/"#the rupee circle in the cow grotto in DMT# includes", /*italian*/"il #cerchio di oggetti nella grotta sul sentiero del Monte Morte# include", /*german*/"#the rupee circle in the cow grotto in DMT# includes"} + ); + + hintTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_6] = HintText::Exclude({ + // obscure text + Text{"#a cow looks at#", /*french*/"#a cow looks at#", /*spanish*/"#a cow looks at#", /*italian*/"#una mucca osserva con attenzione#", /*german*/"#a cow looks at#"}, + }, {}, + // clear text + Text{"#the rupee circle in the cow grotto in DMT# includes", /*french*/"#the rupee circle in the cow grotto in DMT# includes", /*spanish*/"#the rupee circle in the cow grotto in DMT# includes", /*italian*/"il #cerchio di oggetti nella grotta sul sentiero del Monte Morte# include", /*german*/"#the rupee circle in the cow grotto in DMT# includes"} + ); + + hintTable[DMT_COW_GROTTO_RUPEE_CIRCLE_RED_RUPEE] = HintText::Exclude({ + // obscure text + Text{"#a cow looks at#", /*french*/"#a cow looks at#", /*spanish*/"#a cow looks at#", /*italian*/"#una mucca osserva con attenzione#", /*german*/"#a cow looks at#"}, + }, {}, + // clear text + Text{"#the rupee circle in the cow grotto in DMT# includes", /*french*/"#the rupee circle in the cow grotto in DMT# includes", /*spanish*/"#the rupee circle in the cow grotto in DMT# includes", /*italian*/"il #cerchio di oggetti nella grotta sul sentiero del Monte Morte# include", /*german*/"#the rupee circle in the cow grotto in DMT# includes"} + ); + hintTable[DMC_WALL_FREESTANDING_POH] = HintText::Exclude({ // obscure text Text{"nestled in a #volcanic wall# is", /*french*/"dans une #alcove volcanique# gît", /*spanish*/"entre unas #murallas volcánicas# yace", /*italian*/"in una #nicchia vulcanica# puoi trovare", /*german*/"in einer #vulkanischen Wand#, |wäre|wären|"}, @@ -491,6 +935,126 @@ void HintTable_Init_Exclude_Overworld() { Text{"obscured by #volcanic ash# is", /*french*/"#recouvert de cendres volcaniques# gît", /*spanish*/"bajo la #ceniza volcánica# yace", /*italian*/"il #fumo di un vulcano# cela", /*german*/"auf einem #dampfenden Vulkan#, |wäre|wären|"}, }); + hintTable[DMC_LOWER_RED_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"#an obsidian# is", /*french*/"#an obsidian# is", /*spanish*/"#an obsidian# is", /*italian*/"#camminando su assi bollenti# puoi raggiungere", /*german*/"#an obsidian# is"}, + }, {}, + // clear text + Text{"#the first red rupee in Death Mountain Crater# is", /*french*/"#the first red rupee in Death Mountain Crater# is", /*spanish*/"#the first red rupee in Death Mountain Crater# is", /*italian*/"#oltre le assi nel cratere del Monte Morte# puoi trovare", /*german*/"#the first red rupee in Death Mountain Crater# is"} + ); + + hintTable[DMC_LOWER_RED_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"#an obsidian# is", /*french*/"#an obsidian# is", /*spanish*/"#an obsidian# is", /*italian*/"#camminando su assi bollenti# puoi raggiungere", /*german*/"#an obsidian# is"}, + }, {}, + // clear text + Text{"#the second red rupee in Death Mountain Crater# is", /*french*/"#the second red rupee in Death Mountain Crater# is", /*spanish*/"#the second red rupee in Death Mountain Crater# is", /*italian*/"#oltre le assi nel cratere del Monte Morte# puoi trovare", /*german*/"#the second red rupee in Death Mountain Crater# is"} + ); + + hintTable[DMC_LOWER_BLUE_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"#an obsidian# is", /*french*/"#an obsidian# is", /*spanish*/"#an obsidian# is", /*italian*/"#camminando su assi bollenti# puoi raggiungere", /*german*/"#an obsidian# is"}, + }, {}, + // clear text + Text{"#one of the blue rupees in Death Mountain Crater# is", /*french*/"#one of the blue rupees in Death Mountain Crater# is", /*spanish*/"#one of the blue rupees in Death Mountain Crater# is", /*italian*/"#oltre le assi nel cratere del Monte Morte# puoi trovare", /*german*/"#one of the blue rupees in Death Mountain Crater# is"} + ); + + hintTable[DMC_LOWER_BLUE_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"#an obsidian# is", /*french*/"#an obsidian# is", /*spanish*/"#an obsidian# is", /*italian*/"#camminando su assi bollenti# puoi raggiungere", /*german*/"#an obsidian# is"}, + }, {}, + // clear text + Text{"#one of the blue rupees in Death Mountain Crater# is", /*french*/"#one of the blue rupees in Death Mountain Crater# is", /*spanish*/"#one of the blue rupees in Death Mountain Crater# is", /*italian*/"#oltre le assi nel cratere del Monte Morte# puoi trovare", /*german*/"#one of the blue rupees in Death Mountain Crater# is"} + ); + + hintTable[DMC_LOWER_BLUE_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"#an obsidian# is", /*french*/"#an obsidian# is", /*spanish*/"#an obsidian# is", /*italian*/"#camminando su assi bollenti# puoi raggiungere", /*german*/"#an obsidian# is"}, + }, {}, + // clear text + Text{"#one of the blue rupees in Death Mountain Crater# is", /*french*/"#one of the blue rupees in Death Mountain Crater# is", /*spanish*/"#one of the blue rupees in Death Mountain Crater# is", /*italian*/"#oltre le assi nel cratere del Monte Morte# puoi trovare", /*german*/"#one of the blue rupees in Death Mountain Crater# is"} + ); + + hintTable[DMC_LOWER_BLUE_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"#an obsidian# is", /*french*/"#an obsidian# is", /*spanish*/"#an obsidian# is", /*italian*/"#camminando su assi bollenti# puoi raggiungere", /*german*/"#an obsidian# is"}, + }, {}, + // clear text + Text{"#one of the blue rupees in Death Mountain Crater# is", /*french*/"#one of the blue rupees in Death Mountain Crater# is", /*spanish*/"#one of the blue rupees in Death Mountain Crater# is", /*italian*/"#oltre le assi nel cratere del Monte Morte# puoi trovare", /*german*/"#one of the blue rupees in Death Mountain Crater# is"} + ); + + hintTable[DMC_LOWER_BLUE_RUPEE_5] = HintText::Exclude({ + // obscure text + Text{"#an obsidian# is", /*french*/"#an obsidian# is", /*spanish*/"#an obsidian# is", /*italian*/"#camminando su assi bollenti# puoi raggiungere", /*german*/"#an obsidian# is"}, + }, {}, + // clear text + Text{"#one of the blue rupees in Death Mountain Crater# is", /*french*/"#one of the blue rupees in Death Mountain Crater# is", /*spanish*/"#one of the blue rupees in Death Mountain Crater# is", /*italian*/"#oltre le assi nel cratere del Monte Morte# puoi trovare", /*german*/"#one of the blue rupees in Death Mountain Crater# is"} + ); + + hintTable[DMC_LOWER_BLUE_RUPEE_6] = HintText::Exclude({ + // obscure text + Text{"#an obsidian# is", /*french*/"#an obsidian# is", /*spanish*/"#an obsidian# is", /*italian*/"#camminando su assi bollenti# puoi raggiungere", /*german*/"#an obsidian# is"}, + }, {}, + // clear text + Text{"#one of the blue rupees in Death Mountain Crater# is", /*french*/"#one of the blue rupees in Death Mountain Crater# is", /*spanish*/"#one of the blue rupees in Death Mountain Crater# is", /*italian*/"#oltre le assi nel cratere del Monte Morte# puoi trovare", /*german*/"#one of the blue rupees in Death Mountain Crater# is"} + ); + + hintTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"a #red hot strawman# stands next to", /*french*/"a #red hot strawman# stands next to", /*spanish*/"a #red hot strawman# stands next to", /*italian*/"un #focoso uomo di paglia# sorveglia", /*german*/"a #red hot strawman# stands next to"}, + }, {}, + // clear text + Text{"#the scarecrow rupee circle in DMC# has", /*french*/"#the scarecrow rupee circle in DMC# has", /*spanish*/"#the scarecrow rupee circle in DMC# has", /*italian*/"il #cerchio di oggetti dello spaventapasseri nel cratere del Monte Morte# include", /*german*/"#the scarecrow rupee circle in DMC# has"} + ); + + hintTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"a #red hot strawman# stands next to", /*french*/"a #red hot strawman# stands next to", /*spanish*/"a #red hot strawman# stands next to", /*italian*/"un #focoso uomo di paglia# sorveglia", /*german*/"a #red hot strawman# stands next to"}, + }, {}, + // clear text + Text{"#the scarecrow rupee circle in DMC# has", /*french*/"#the scarecrow rupee circle in DMC# has", /*spanish*/"#the scarecrow rupee circle in DMC# has", /*italian*/"il #cerchio di oggetti dello spaventapasseri nel cratere del Monte Morte# include", /*german*/"#the scarecrow rupee circle in DMC# has"} + ); + + hintTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"a #red hot strawman# stands next to", /*french*/"a #red hot strawman# stands next to", /*spanish*/"a #red hot strawman# stands next to", /*italian*/"un #focoso uomo di paglia# sorveglia", /*german*/"a #red hot strawman# stands next to"}, + }, {}, + // clear text + Text{"#the scarecrow rupee circle in DMC# has", /*french*/"#the scarecrow rupee circle in DMC# has", /*spanish*/"#the scarecrow rupee circle in DMC# has", /*italian*/"il #cerchio di oggetti dello spaventapasseri nel cratere del Monte Morte# include", /*german*/"#the scarecrow rupee circle in DMC# has"} + ); + + hintTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"a #red hot strawman# stands next to", /*french*/"a #red hot strawman# stands next to", /*spanish*/"a #red hot strawman# stands next to", /*italian*/"un #focoso uomo di paglia# sorveglia", /*german*/"a #red hot strawman# stands next to"}, + }, {}, + // clear text + Text{"#the scarecrow rupee circle in DMC# has", /*french*/"#the scarecrow rupee circle in DMC# has", /*spanish*/"#the scarecrow rupee circle in DMC# has", /*italian*/"il #cerchio di oggetti dello spaventapasseri nel cratere del Monte Morte# include", /*german*/"#the scarecrow rupee circle in DMC# has"} + ); + + hintTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_5] = HintText::Exclude({ + // obscure text + Text{"a #red hot strawman# stands next to", /*french*/"a #red hot strawman# stands next to", /*spanish*/"a #red hot strawman# stands next to", /*italian*/"un #focoso uomo di paglia# sorveglia", /*german*/"a #red hot strawman# stands next to"}, + }, {}, + // clear text + Text{"#the scarecrow rupee circle in DMC# has", /*french*/"#the scarecrow rupee circle in DMC# has", /*spanish*/"#the scarecrow rupee circle in DMC# has", /*italian*/"il #cerchio di oggetti dello spaventapasseri nel cratere del Monte Morte# include", /*german*/"#the scarecrow rupee circle in DMC# has"} + ); + + hintTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_6] = HintText::Exclude({ + // obscure text + Text{"a #red hot strawman# stands next to", /*french*/"a #red hot strawman# stands next to", /*spanish*/"a #red hot strawman# stands next to", /*italian*/"un #focoso uomo di paglia# sorveglia", /*german*/"a #red hot strawman# stands next to"}, + }, {}, + // clear text + Text{"#the scarecrow rupee circle in DMC# has", /*french*/"#the scarecrow rupee circle in DMC# has", /*spanish*/"#the scarecrow rupee circle in DMC# has", /*italian*/"il #cerchio di oggetti dello spaventapasseri nel cratere del Monte Morte# include", /*german*/"#the scarecrow rupee circle in DMC# has"} + ); + + hintTable[DMC_SCARE_CROW_RUPEE_CIRCLE_RED_RUPEE] = HintText::Exclude({ + // obscure text + Text{"a #red hot strawman# stands next to", /*french*/"a #red hot strawman# stands next to", /*spanish*/"a #red hot strawman# stands next to", /*italian*/"un #focoso uomo di paglia# sorveglia", /*german*/"a #red hot strawman# stands next to"}, + }, {}, + // clear text + Text{"#the scarecrow rupee circle in DMC# has", /*french*/"#the scarecrow rupee circle in DMC# has", /*spanish*/"#the scarecrow rupee circle in DMC# has", /*italian*/"il #cerchio di oggetti dello spaventapasseri nel cratere del Monte Morte# include", /*german*/"#the scarecrow rupee circle in DMC# has"} + ); + hintTable[GF_NORTH_F1_CARPENTER] = HintText::Exclude({ // obscure text Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela", /*italian*/"una #guardia Gerudo# possiede", /*german*/"nahe einer #Gerudo-Wächterin#, |wäre|wären|"}, @@ -511,13 +1075,11 @@ void HintTable_Init_Exclude_Overworld() { Text{"#defeating Gerudo guards# reveals", /*french*/"les #geôliers Gerudo# détiennent", /*spanish*/"#derrotar a las guardas Gerudo# revela", /*italian*/"una #guardia Gerudo# possiede", /*german*/"nahe einer #Gerudo-Wächterin#, |wäre|wären|"}, }); - hintTable[HF_GS_NEAR_KAK_GROTTO] = HintText::Exclude({ // obscure text Text{"a #spider-guarded spider in a hole# hoards", /*french*/"une #Skulltula dans un trou d'arachnides# a", /*spanish*/"una #Skulltula custodiada por otra# de un hoyo otorga", /*italian*/"in una grotta un #ragno protegge un'altro ragno# con", /*german*/"in einem Erdloch mit #zwei Spinnen#, |wäre|wären|"}, }); - hintTable[LLR_GS_BACK_WALL] = HintText::Exclude({ // obscure text Text{"night reveals a #spider in a ranch# holding", /*french*/"une #Skulltula sur la façade de la ferme# a", /*spanish*/"la noche revela una #Skulltula del rancho# que otorga", /*italian*/"#nella fattoria di notte# esce un ragno con", /*german*/"in einer nachtaktiven #Spinne einer Farm#, |wäre|wären|"}, @@ -538,7 +1100,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a spider hiding in a #ranch tree# holds", /*french*/"une #Skulltula dans l'arbre de la ferme# a", /*spanish*/"una Skulltula escondida en el #árbol de un rancho# otorga", /*italian*/"#su un albero nella fattoria# si nasconde un ragno con", /*german*/"in der Spinne im #Baum einer Farm#, |wäre|wären|"}, }); - hintTable[KF_GS_BEAN_PATCH] = HintText::Exclude({ // obscure text Text{"a #spider buried in a forest# holds", /*french*/"une #Skulltula enterrée dans la forêt# a", /*spanish*/"una #Skulltula enterrada en un bosque# otorga", /*italian*/"un #ragno sepolto nella foresta# nasconde", /*german*/"in einer, #im Wald vergrabenen Spinne#, |wäre|wären|"}, @@ -554,7 +1115,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"night in the future reveals a #spider in a forest# holding", /*french*/"une #Skulltula sur une cabane de la forêt# a", /*spanish*/"la noche revela en el futuro una #Skulltula del bosque# que otorga", /*italian*/"un ragno #sopra una casa nella foresta# ha", /*german*/"in einer nachtaktiven #Spinne eines Waldes#, |wäre|wären|"}, }); - hintTable[LW_GS_BEAN_PATCH_NEAR_BRIDGE] = HintText::Exclude({ // obscure text Text{"a #spider buried deep in a forest maze# holds", /*french*/"une #Skulltula enterrée dans les bois# a", /*spanish*/"una #Skulltula enterrada en un laberinto forestal# otorga", /*italian*/"un #ragno sepolto in un dedalo silvestre# ha", /*german*/"in einer, #im Wald vergrabenen Spinne#, |wäre|wären|"}, @@ -575,7 +1135,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"night reveals a #spider in a forest meadow# holding", /*french*/"une #Skulltula dans le sanctuaire des bois# a", /*spanish*/"la noche revela una #Skulltula de la pradera del bosque# que otorga", /*italian*/"#in una radura di notte# esce un ragno con", /*german*/"in einer nachtaktiven #Spinne einer Lichtung#, |wäre|wären|"}, }); - hintTable[OGC_GS] = HintText::Exclude({ // obscure text Text{"a #spider outside a tyrant's tower# holds", /*french*/"une #Skulltula parmi les ruines du château# a", /*spanish*/"una #Skulltula a las afueras de la torre de un tirano# otorga", /*italian*/"un ragno #vicino alla torre di un tiranno# ha", /*german*/"in einer #Spinne am Turm des Tyrannen#, |wäre|wären|"}, @@ -591,13 +1150,11 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #spider in a guarded crate# holds", /*french*/"une #Skulltula dans une boîte en ville# a", /*spanish*/"una #Skulltula bajo una custodiada caja# otorga", /*italian*/"un #ragno sotto una cassa custodita# ha", /*german*/"in der #Spinne einer streng bewachten Kiste#, |wäre|wären|"}, }); - hintTable[DMC_GS_BEAN_PATCH] = HintText::Exclude({ // obscure text Text{"a #spider buried in a volcano# holds", /*french*/"une #Skulltula enterrée dans un volcan# a", /*spanish*/"una #Skulltula enterrada en un volcán# otorga", /*italian*/"un #ragno sepolto in un vulcano# ha", /*german*/"in einer, #im Krater vergrabenen Spinne#, |wäre|wären|"}, }); - hintTable[DMT_GS_BEAN_PATCH] = HintText::Exclude({ // obscure text Text{"a #spider buried outside a cavern# holds", /*french*/"une #Skulltula enterrée près d'une caverne# a", /*spanish*/"una #Skulltula enterrada a la entrada de una cueva# otorga", /*italian*/"un #ragno sepolto all'ingresso di una caverna# ha", /*german*/"in einer, #am Gebirgspfad vergrabenen Spinne#, |wäre|wären|"}, @@ -618,7 +1175,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"the hammer reveals a #spider on a mountain# holding", /*french*/"une #Skulltula derrière un rocher massif près du sommet d'un volcan# a", /*spanish*/"el martillo revela #una Skulltula de la montaña# que otorga", /*italian*/"il martello rivela un #ragno in montagna# con", /*german*/"in einer, hinter #braunen Felsen# krabbelnden Spinne, |wäre|wären|"}, }); - hintTable[GC_GS_CENTER_PLATFORM] = HintText::Exclude({ // obscure text Text{"a #suspended spider# in Goron City holds", /*french*/"une #Skulltula perchée dans le village Goron# a", /*spanish*/"una #Skulltula suspendida# en la Ciudad Goron otorga", /*italian*/"un #ragno sospeso# nella città dei Goron ha", /*german*/"in der #einsamen Spinne# Goronias, |wäre|wären|"}, @@ -629,7 +1185,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a spider in a #Goron City crate# holds", /*french*/"une #Skulltula dans une boîte du village Goron# a", /*spanish*/"una #Skulltula bajo una caja# de la Ciudad Goron otorga", /*italian*/"in una #cassa nella città dei Goron# si nasconde un ragno con", /*german*/"in der Spinne einer #Kiste Goronias#, |wäre|wären|"}, }); - hintTable[KAK_GS_HOUSE_UNDER_CONSTRUCTION] = HintText::Exclude({ // obscure text Text{"night in the past reveals a #spider in a town# holding", /*french*/"une #Skulltula dans le chantier de construction# a", /*spanish*/"la noche del pasado revela una #Skulltula del pueblo# que otorga", /*italian*/"la notte nel passato rivela un #ragno in un villaggio# con", /*german*/"in einer nachtaktiven #Spinne eines Dorfes#, |wäre|wären|"}, @@ -660,7 +1215,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"night in the future reveals a #spider in a town# holding", /*french*/"une #Skulltula au dessus d'une grande maison# a", /*spanish*/"la noche del futuro revela una #Skulltula del pueblo# que otorga", /*italian*/"la notte nel futuro rivela un #ragno in un villaggio# con", /*german*/"in einer nachtaktiven #Spinne eines Dorfes#, |wäre|wären|"}, }); - hintTable[GRAVEYARD_GS_WALL] = HintText::Exclude({ // obscure text Text{"night reveals a #spider in a graveyard# holding", /*french*/"une #Skulltula sur une façade du cimetière# a", /*spanish*/"la noche revela una #Skulltula del cementerio# que otorga", /*italian*/"di notte appare un #ragno nel cimitero# con", /*german*/"in einer nachtaktiven #Spinne eines Friedhofs#, |wäre|wären|"}, @@ -671,7 +1225,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #spider buried in a graveyard# holds", /*french*/"une #Skulltula enterrée dans le cimetière# a", /*spanish*/"una #Skulltula enterrada en el cementerio# otorga", /*italian*/"un #ragno sepolto nel cimitero# ha", /*german*/"in einer, #am Friedhof vergrabenen Spinne#, |wäre|wären|"}, }); - hintTable[ZR_GS_LADDER] = HintText::Exclude({ // obscure text Text{"night in the past reveals a #spider in a river# holding", /*french*/"une #Skulltula sur une échelle près d'une cascade# a", /*spanish*/"la noche del pasado revela una #Skulltula del río# que otorga", /*italian*/"di notte nel passato appare un #ragno nel fiume# con", /*german*/"in einer nachtaktiven #Spinne eines Flusses#, |wäre|wären|"}, @@ -692,7 +1245,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"night in the future reveals a #spider in a river# holding", /*french*/"une #Skulltula sur une façade près d'une grotte du fleuve# a", /*spanish*/"la noche del futuro revela una #Skulltula del río# que otorga", /*italian*/"di notte nel futuro appare un #ragno nel fiume# con", /*german*/"in einer nachtaktiven #Spinne eines Flusses#, |wäre|wären|"}, }); - hintTable[ZD_GS_FROZEN_WATERFALL] = HintText::Exclude({ // obscure text Text{"night reveals a #spider by a frozen waterfall# holding", /*french*/"une #Skulltula près d'une cascade gelée# a", /*spanish*/"la noche revela una #Skulltula junto a una congelada cascada# que otorga", /*italian*/"di notte appare un #ragno presso una cascata congelata# con", /*german*/"in einer nachtaktiven #Spinne eines gefrorenen Wasserfalls#, |wäre|wären|"}, @@ -708,7 +1260,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a spider hiding in a #tree near a deity# holds", /*french*/"une #Skulltula dans un arbre dans un réservoir# a", /*spanish*/"una Skulltula escondida en el #árbol junto a cierta deidad# otorga", /*italian*/"un ragno su un #albero presso una divinità# ha", /*german*/"in der Spinne am #Baum nahe einer Gottheit#, |wäre|wären|"}, }); - hintTable[LH_GS_BEAN_PATCH] = HintText::Exclude({ // obscure text Text{"a #spider buried by a lake# holds", /*french*/"une #Skulltula enterrée près d'un lac# a", /*spanish*/"una #Skulltula enterrada junto a un lago# otorga", /*italian*/"un #ragno sepolto presso un lago# ha", /*german*/"in einer, #am See vergrabenen Spinne#, |wäre|wären|"}, @@ -734,7 +1285,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"night reveals a #spider by a lake high in a tree# holding", /*french*/"une #Skulltula dans un grand arbre du lac# a", /*spanish*/"la noche revela #una Skulltula del lago sobre un árbol# que otorga", /*italian*/"di notte appare un #ragno arboreo lacustre# che ha", /*german*/"in einer nachtaktiven #Spinne eines Sees#, |wäre|wären|"}, }); - hintTable[GV_GS_BEAN_PATCH] = HintText::Exclude({ // obscure text Text{"a #spider buried in a valley# holds", /*french*/"une #Skulltula enterré dans une vallée# a", /*spanish*/"una #Skulltula enterrada en un valle# otorga", /*italian*/"un #ragno sepolto nella valle# nasconde", /*german*/"in einer, #im Tal vergrabenen Spinne#, |wäre|wären|"}, @@ -755,7 +1305,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"night in the future reveals a #spider in a valley# holding", /*french*/"une #Skulltula derrière une tente# a", /*spanish*/"la noche del futuro revela una #Skulltula del valle# que otorga", /*italian*/"di notte nel futuro appare un #ragno in una valle# con", /*german*/"in einer nachtaktiven #Spinne des Tals#, |wäre|wären|"}, }); - hintTable[GF_GS_ARCHERY_RANGE] = HintText::Exclude({ // obscure text Text{"night reveals a #spider in a fortress# holding", /*french*/"une #Skulltula sur une cible de tir# a", /*spanish*/"la noche revela una #Skulltula de una fortaleza# que otorga", /*italian*/"di notte appare un #ragno in una fortezza# con", /*german*/"in einer nachtaktiven #Spinne einer Festung#, |wäre|wären|"}, @@ -766,7 +1315,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"night reveals a #spider in a fortress# holding", /*french*/"une #Skulltula au sommet d'une forteresse# a", /*spanish*/"la noche revela una #Skulltula de una fortaleza# que otorga", /*italian*/"di notte appare un #ragno in una fortezza# con", /*german*/"in einer nachtaktiven #Spinne einer Festung#, |wäre|wären|"}, }); - hintTable[COLOSSUS_GS_BEAN_PATCH] = HintText::Exclude({ // obscure text Text{"a #spider buried in the desert# holds", /*french*/"une #Skulltula enterrée au pied du colosse# a", /*spanish*/"una #Skulltula enterrada en el desierto# otorga", /*italian*/"un #ragno sepolto nel deserto# nasconde", /*german*/"in einer, #in der Wüste vergrabenen Spinne#, |wäre|wären|"}, @@ -782,7 +1330,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"night reveals a #spider deep in the desert# holding", /*french*/"une #Skulltula dans un arbre du désert# a", /*spanish*/"la noche revela una #Skulltula en las profundidades del desierto# que otorga", /*italian*/"di notte appare un #ragno nel cuore del deserto# con", /*german*/"in einer nachtaktiven #Spinne der Wüste#, |wäre|wären|"}, }); - hintTable[KF_SHOP_ITEM_1] = HintText::Exclude({ // obscure text Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende", /*italian*/"un #commerciante bambino# vende", /*german*/"die Ware eines #jungen Ladenbesitzers#, |wäre|wären|"}, @@ -823,7 +1370,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #child shopkeeper# sells", /*french*/"la #boutique Kokiri# vend", /*spanish*/"un #joven dependiente# vende", /*italian*/"un #commerciante bambino# vende", /*german*/"die Ware eines #jungen Ladenbesitzers#, |wäre|wären|"}, }); - hintTable[KAK_POTION_SHOP_ITEM_1] = HintText::Exclude({ // obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece", /*italian*/"un #farmacista# vende", /*german*/"die Ware eines #Elixierverkäufers#, |wäre|wären|"}, @@ -888,7 +1434,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Potion Shop# offers", /*french*/"l'#apothicaire de Kakariko# vend", /*spanish*/"la #tienda de pociones de Kakariko# ofrece", /*italian*/"il #negozio di pozioni di Calbarico# offre", /*german*/"die Ware vom #Magie-Laden von Kakariko#, |wäre|wären|"} ); - hintTable[MARKET_BOMBCHU_SHOP_ITEM_1] = HintText::Exclude({ // obscure text Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de missiles# vend", /*spanish*/"un #mercader de bombchus# vende", /*italian*/"un #commerciante di radiomine# vende", /*german*/"die Ware eines #Krabbelminenhändlers#, |wäre|wären|"}, @@ -929,7 +1474,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #Bombchu merchant# sells", /*french*/"le #marchand de missiles# vend", /*spanish*/"un #mercader de bombchus# vende", /*italian*/"un #commerciante di radiomine# vende", /*german*/"die Ware eines #Krabbelminenhändlers#, |wäre|wären|"}, }); - hintTable[MARKET_POTION_SHOP_ITEM_1] = HintText::Exclude({ // obscure text Text{"a #potion seller# offers", /*french*/"l'#apothicaire# vend", /*spanish*/"un #vendedor de pociones# ofrece", /*italian*/"un #farmacista# vende", /*german*/"die Ware eines #Elixierverkäufers#, |wäre|wären|"}, @@ -994,7 +1538,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Potion Shop# offers", /*french*/"l'#apothicaire dans la place du marché# vend", /*spanish*/"la #tienda de pociones del mercado# ofrece", /*italian*/"il #negozio di pozioni del mercato# offre", /*german*/"die Ware vom #Magie-Laden des Marktplatzes#, |wäre|wären|"} ); - hintTable[MARKET_BAZAAR_ITEM_1] = HintText::Exclude({ // obscure text Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la place du marché# vend", /*spanish*/"el #bazar del mercado# ofrece", /*italian*/"il #bazar del mercato# offre", /*german*/"die Ware des #Basars des Marktplatzes#, |wäre|wären|"}, @@ -1035,7 +1578,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Market Bazaar# offers", /*french*/"le #bazar de la place du marché# vend", /*spanish*/"el #bazar del mercado# ofrece", /*italian*/"il #bazar del mercato# offre", /*german*/"die Ware des #Basars des Marktplatzes#, |wäre|wären|"}, }); - hintTable[KAK_BAZAAR_ITEM_1] = HintText::Exclude({ // obscure text Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece", /*italian*/"il #bazar di Calbarico# offre", /*german*/"die Ware des #Basars von Kakariko#, |wäre|wären|"}, @@ -1076,7 +1618,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"the #Kakariko Bazaar# offers", /*french*/"le #bazar de Kakariko# vend", /*spanish*/"el #bazar de Kakariko# ofrece", /*italian*/"il #bazar di Calbarico# offre", /*german*/"die Ware des #Basars von Kakariko#, |wäre|wären|"}, }); - hintTable[ZD_SHOP_ITEM_1] = HintText::Exclude({ // obscure text Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende", /*italian*/"un #commerciante Zora# vende", /*german*/"die Ware eines #Ladenbesitzers der Zora#, |wäre|wären|"}, @@ -1117,7 +1658,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #Zora shopkeeper# sells", /*french*/"la #boutique Zora# vend", /*spanish*/"el #dependiente Zora# vende", /*italian*/"un #commerciante Zora# vende", /*german*/"die Ware eines #Ladenbesitzers der Zora#, |wäre|wären|"}, }); - hintTable[GC_SHOP_ITEM_1] = HintText::Exclude({ // obscure text Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende", /*italian*/"un #commerciante Goron# vende", /*german*/"die Ware eines #Ladenbesitzers der Goronen#, |wäre|wären|"}, @@ -1158,7 +1698,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #Goron shopkeeper# sells", /*french*/"la #boutique Goron# vend", /*spanish*/"el #dependiente Goron# vende", /*italian*/"un #commerciante Goron# vende", /*german*/"die Ware eines #Ladenbesitzers der Goronen#, |wäre|wären|"}, }); - hintTable[HF_DEKU_SCRUB_GROTTO] = HintText::Exclude({ // obscure text Text{"a lonely #scrub in a hole# sells", /*french*/"la #peste Mojo dans une grotte de la plaine# vend", /*spanish*/"un #singular deku bajo un hoyo# de la llanura vende", /*italian*/"un #cespuglio solitario in una grotta# vende", /*german*/"die Ware, des #einsamen Deku-Händlers eines Erdlochs#, |wäre|wären|"}, @@ -1179,7 +1718,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo à la ferme# vend", /*spanish*/"un #trío de dekus# de una granja venden", /*italian*/"un #trio di cespugli fattori# vende", /*german*/"die Ware eines #Deku-Händler-Trios#, |wäre|wären|"}, }); - hintTable[LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = HintText::Exclude({ // obscure text Text{"a pair of #scrubs in the woods# sells", /*french*/"le #duo de peste Mojo près du théâtre# vend", /*spanish*/"un par de #dekus del bosque# venden", /*italian*/"un #cespuglio vicino a un teatro# vende", /*german*/"die Ware, eines #Deku-Händler-Duos der Wälder#, |wäre|wären|"}, @@ -1195,6 +1733,78 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #scrub by a bridge# sells", /*french*/"la #peste Mojo près du pont dans les bois# vend", /*spanish*/"un #deku bajo un puente# del bosque venden", /*italian*/"un #cespuglio vicino a un ponte# vende", /*german*/"die Ware, des #Deku-Händlers nahe einer Brücke#, |wäre|wären|"}, }); + hintTable[LW_IN_BOULDER_BLUE_RUPEE] = HintText::Exclude({ + // obscure text + Text{"a #disoriented monolith# gives you", /*french*/"a #disoriented monolith# gives you", /*spanish*/"a #disoriented monolith# gives you", /*italian*/"una #pietra smarrita# ti darà", /*german*/"a #disoriented monolith# gives you"}, + }, {}, + //clear text + Text{"a #boulder in the Lost Woods# gives you", /*french*/"a #boulder in the Lost Woods# gives you", /*spanish*/"a #boulder in the Lost Woods# gives you", /*italian*/"un #macigno nel bosco perduto# copre", /*german*/"a #boulder in the Lost Woods# gives you"} + ); + + hintTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"a #drowning bypass gem# is", /*french*/"a #drowning bypass gem# is", /*spanish*/"a #drowning bypass gem# is", /*italian*/"fra #gli oggetti che indicano il fiume Zora# puoi pescare", /*german*/"a #drowning bypass gem# is"}, + }, {}, + //clear text + Text{"a #rupee near the Zora's River shortcut# is", /*french*/"a #rupee near the Zora's River shortcut# is", /*spanish*/"a #rupee near the Zora's River shortcut# is", /*italian*/"#nello stagno del bosco perduto# puoi pescare", /*german*/"a #rupee near the Zora's River shortcut# is"} + ); + + hintTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"a #drowning bypass gem# is", /*french*/"a #drowning bypass gem# is", /*spanish*/"a #drowning bypass gem# is", /*italian*/"fra #gli oggetti che indicano il fiume Zora# puoi pescare", /*german*/"a #drowning bypass gem# is"}, + }, {}, + //clear text + Text{"a #rupee near the Zora's River shortcut# is", /*french*/"a #rupee near the Zora's River shortcut# is", /*spanish*/"a #rupee near the Zora's River shortcut# is", /*italian*/"#nello stagno del bosco perduto# puoi pescare", /*german*/"a #rupee near the Zora's River shortcut# is"} + ); + + hintTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"a #drowning bypass gem# is", /*french*/"a #drowning bypass gem# is", /*spanish*/"a #drowning bypass gem# is", /*italian*/"fra #gli oggetti che indicano il fiume Zora# puoi pescare", /*german*/"a #drowning bypass gem# is"}, + }, {}, + //clear text + Text{"a #rupee near the Zora's River shortcut# is", /*french*/"a #rupee near the Zora's River shortcut# is", /*spanish*/"a #rupee near the Zora's River shortcut# is", /*italian*/"#nello stagno del bosco perduto# puoi pescare", /*german*/"a #rupee near the Zora's River shortcut# is"} + ); + + hintTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"a #drowning bypass gem# is", /*french*/"a #drowning bypass gem# is", /*spanish*/"a #drowning bypass gem# is", /*italian*/"fra #gli oggetti che indicano il fiume Zora# puoi pescare", /*german*/"a #drowning bypass gem# is"}, + }, {}, + //clear text + Text{"a #rupee near the Zora's River shortcut# is", /*french*/"a #rupee near the Zora's River shortcut# is", /*spanish*/"a #rupee near the Zora's River shortcut# is", /*italian*/"#nello stagno del bosco perduto# puoi pescare", /*german*/"a #rupee near the Zora's River shortcut# is"} + ); + + hintTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_5] = HintText::Exclude({ + // obscure text + Text{"a #drowning bypass gem# is", /*french*/"a #drowning bypass gem# is", /*spanish*/"a #drowning bypass gem# is", /*italian*/"fra #gli oggetti che indicano il fiume Zora# puoi pescare", /*german*/"a #drowning bypass gem# is"}, + }, {}, + //clear text + Text{"a #rupee near the Zora's River shortcut# is", /*french*/"a #rupee near the Zora's River shortcut# is", /*spanish*/"a #rupee near the Zora's River shortcut# is", /*italian*/"#nello stagno del bosco perduto# puoi pescare", /*german*/"a #rupee near the Zora's River shortcut# is"} + ); + + hintTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_6] = HintText::Exclude({ + // obscure text + Text{"a #drowning bypass gem# is", /*french*/"a #drowning bypass gem# is", /*spanish*/"a #drowning bypass gem# is", /*italian*/"fra #gli oggetti che indicano il fiume Zora# puoi pescare", /*german*/"a #drowning bypass gem# is"}, + }, {}, + //clear text + Text{"a #rupee near the Zora's River shortcut# is", /*french*/"a #rupee near the Zora's River shortcut# is", /*spanish*/"a #rupee near the Zora's River shortcut# is", /*italian*/"#nello stagno del bosco perduto# puoi pescare", /*german*/"a #rupee near the Zora's River shortcut# is"} + ); + + hintTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_7] = HintText::Exclude({ + // obscure text + Text{"a #drowning bypass gem# is", /*french*/"a #drowning bypass gem# is", /*spanish*/"a #drowning bypass gem# is", /*italian*/"fra #gli oggetti che indicano il fiume Zora# puoi pescare", /*german*/"a #drowning bypass gem# is"}, + }, {}, + //clear text + Text{"a #rupee near the Zora's River shortcut# is", /*french*/"a #rupee near the Zora's River shortcut# is", /*spanish*/"a #rupee near the Zora's River shortcut# is", /*italian*/"#nello stagno del bosco perduto# puoi pescare", /*german*/"a #rupee near the Zora's River shortcut# is"} + ); + + hintTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_8] = HintText::Exclude({ + // obscure text + Text{"a #drowning bypass gem# is", /*french*/"a #drowning bypass gem# is", /*spanish*/"a #drowning bypass gem# is", /*italian*/"fra #gli oggetti che indicano il fiume Zora# puoi pescare", /*german*/"a #drowning bypass gem# is"}, + }, {}, + //clear text + Text{"a #rupee near the Zora's River shortcut# is", /*french*/"a #rupee near the Zora's River shortcut# is", /*spanish*/"a #rupee near the Zora's River shortcut# is", /*italian*/"#nello stagno del bosco perduto# puoi pescare", /*german*/"a #rupee near the Zora's River shortcut# is"} + ); + hintTable[LW_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ // obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans les sous-bois# vend", /*spanish*/"un #par de dekus subterráneos# del bosque venden", /*italian*/"una #coppia di cespugli nascosti nel bosco# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, @@ -1205,7 +1815,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans les sous-bois# vend", /*spanish*/"un #par de dekus subterráneos# del bosque venden", /*italian*/"una #coppia di cespugli nascosti nel bosco# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, }); - hintTable[SFM_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ // obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend", /*spanish*/"un #par de dekus subterráneos# de la pradera sagrada venden", /*italian*/"una #coppia di cespugli nel cuore della foresta# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, @@ -1216,7 +1825,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo au cœur du sanctuaire sylvestre# vend", /*spanish*/"un #par de dekus subterráneos# de la pradera sagrada venden", /*italian*/"una #coppia di cespugli nel cuore della foresta# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, }); - hintTable[GC_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ // obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le village Goron# vend", /*spanish*/"un #trío de dekus# de la Ciudad Goron venden", /*italian*/"un #trio di cespugli fra i Goron# vende", /*german*/"die Ware eines #Deku-Händler-Trios#, |wäre|wären|"}, @@ -1232,7 +1840,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le village Goron# vend", /*spanish*/"un #trío de dekus# de la Ciudad Goron venden", /*italian*/"un #trio di cespugli fra i Goron# vende", /*german*/"die Ware eines #Deku-Händler-Trios#, |wäre|wären|"}, }); - hintTable[DMC_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ // obscure text Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le volcan# vend", /*spanish*/"un #trío de dekus# del volcán venden", /*italian*/"un #trio di cespugli sotto un macigno# vende", /*german*/"die Ware eines #Deku-Händler-Trios#, |wäre|wären|"}, @@ -1248,7 +1855,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo dans le volcan# vend", /*spanish*/"un #trío de dekus# del volcán venden", /*italian*/"un #trio di cespugli sotto un macigno# vende", /*german*/"die Ware eines #Deku-Händler-Trios#, |wäre|wären|"}, }); - hintTable[ZR_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ // obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près du fleuve# vend", /*spanish*/"un #par de dekus subterráneos# del río venden", /*italian*/"una #coppia di cespugli vicino al fiume# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, @@ -1259,6 +1865,37 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près du fleuve# vend", /*spanish*/"un #par de dekus subterráneos# del río venden", /*italian*/"una #coppia di cespugli vicino al fiume# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, }); + hintTable[ZR_WATERFALL_RED_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"the #sound of rushing water# is enjoyed by", /*french*/"the #sound of rushing water# is enjoyed by", /*spanish*/"the #sound of rushing water# is enjoyed by", /*italian*/"il #suono di acqua corrente# allieta", /*german*/"the #sound of rushing water# is enjoyed by"}, + }, {}, + //clear text + Text{"#under the Zora's River Waterfall# is", /*french*/"#under the Zora's River Waterfall# is", /*spanish*/"#under the Zora's River Waterfall# is", /*italian*/"#sotto la cascata nel fiume Zora# puoi trovare", /*german*/"#under the Zora's River Waterfall# is"} + ); + + hintTable[ZR_WATERFALL_RED_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"the #sound of rushing water# is enjoyed by", /*french*/"the #sound of rushing water# is enjoyed by", /*spanish*/"the #sound of rushing water# is enjoyed by", /*italian*/"il #suono di acqua corrente# allieta", /*german*/"the #sound of rushing water# is enjoyed by"}, + }, {}, + //clear text + Text{"#under the Zora's River Waterfall# is", /*french*/"#under the Zora's River Waterfall# is", /*spanish*/"#under the Zora's River Waterfall# is", /*italian*/"#sotto la cascata nel fiume Zora# puoi trovare", /*german*/"#under the Zora's River Waterfall# is"} + ); + + hintTable[ZR_WATERFALL_RED_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"the #sound of rushing water# is enjoyed by", /*french*/"the #sound of rushing water# is enjoyed by", /*spanish*/"the #sound of rushing water# is enjoyed by", /*italian*/"il #suono di acqua corrente# allieta", /*german*/"the #sound of rushing water# is enjoyed by"}, + }, {}, + //clear text + Text{"#under the Zora's River Waterfall# is", /*french*/"#under the Zora's River Waterfall# is", /*spanish*/"#under the Zora's River Waterfall# is", /*italian*/"#sotto la cascata nel fiume Zora# puoi trovare", /*german*/"#under the Zora's River Waterfall# is"} + ); + + hintTable[ZR_WATERFALL_RED_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"the #sound of rushing water# is enjoyed by", /*french*/"the #sound of rushing water# is enjoyed by", /*spanish*/"the #sound of rushing water# is enjoyed by", /*italian*/"il #suono di acqua corrente# allieta", /*german*/"the #sound of rushing water# is enjoyed by"}, + }, {}, + //clear text + Text{"#under the Zora's River Waterfall# is", /*french*/"#under the Zora's River Waterfall# is", /*spanish*/"#under the Zora's River Waterfall# is", /*italian*/"#sotto la cascata nel fiume Zora# puoi trovare", /*german*/"#under the Zora's River Waterfall# is"} + ); hintTable[LH_DEKU_SCRUB_GROTTO_LEFT] = HintText::Exclude({ // obscure text @@ -1275,7 +1912,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #trio of scrubs# sells", /*french*/"le #trio de peste Mojo près du lac# vend", /*spanish*/"un #trío de dekus# del lago venden", /*italian*/"un #trio di cespugli sotto una lapide# vende", /*german*/"die Ware eines #Deku-Händler-Trios#, |wäre|wären|"}, }); - hintTable[GV_DEKU_SCRUB_GROTTO_REAR] = HintText::Exclude({ // obscure text Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près de la vallée# vend", /*spanish*/"un #par de dekus subterráneos# del valle venden", /*italian*/"una #coppia di cespugli da canyon# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, @@ -1286,6 +1922,69 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo près de la vallée# vend", /*spanish*/"un #par de dekus subterráneos# del valle venden", /*italian*/"una #coppia di cespugli da canyon# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, }); + hintTable[GV_OCTOROCK_GROTTO_GREEN_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"a #purple monster# hoards", /*french*/"a #purple monster# hoards", /*spanish*/"a #purple monster# hoards", /*italian*/"un #polpo# difende", /*german*/"a #purple monster# hoards"}, + },{}, + //clear text + Text{"the #Gerudo Valley Octorok# guards", /*french*/"the #Gerudo Valley Octorok# guards", /*spanish*/"the #Gerudo Valley Octorok# guards", /*italian*/"#l'Octorok nella grotta della valle Gerudo# difende", /*german*/"the #Gerudo Valley Octorok# guards"} + ); + + hintTable[GV_OCTOROCK_GROTTO_GREEN_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"a #purple monster# hoards", /*french*/"a #purple monster# hoards", /*spanish*/"a #purple monster# hoards", /*italian*/"un #polpo# difende", /*german*/"a #purple monster# hoards"}, + },{}, + //clear text + Text{"the #Gerudo Valley Octorok# guards", /*french*/"the #Gerudo Valley Octorok# guards", /*spanish*/"the #Gerudo Valley Octorok# guards", /*italian*/"#l'Octorok nella grotta della valle Gerudo# difende", /*german*/"the #Gerudo Valley Octorok# guards"} + ); + + hintTable[GV_OCTOROCK_GROTTO_GREEN_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"a #purple monster# hoards", /*french*/"a #purple monster# hoards", /*spanish*/"a #purple monster# hoards", /*italian*/"un #polpo# difende", /*german*/"a #purple monster# hoards"}, + },{}, + //clear text + Text{"the #Gerudo Valley Octorok# guards", /*french*/"the #Gerudo Valley Octorok# guards", /*spanish*/"the #Gerudo Valley Octorok# guards", /*italian*/"#l'Octorok nella grotta della valle Gerudo# difende", /*german*/"the #Gerudo Valley Octorok# guards"} + ); + + hintTable[GV_OCTOROCK_GROTTO_GREEN_RUPEE_4] = HintText::Exclude({ + // obscure text + Text{"a #purple monster# hoards", /*french*/"a #purple monster# hoards", /*spanish*/"a #purple monster# hoards", /*italian*/"un #polpo# difende", /*german*/"a #purple monster# hoards"}, + },{}, + //clear text + Text{"the #Gerudo Valley Octorok# guards", /*french*/"the #Gerudo Valley Octorok# guards", /*spanish*/"the #Gerudo Valley Octorok# guards", /*italian*/"#l'Octorok nella grotta della valle Gerudo# difende", /*german*/"the #Gerudo Valley Octorok# guards"} + ); + + hintTable[GV_OCTOROCK_GROTTO_BLUE_RUPEE_1] = HintText::Exclude({ + // obscure text + Text{"a #purple monster# hoards", /*french*/"a #purple monster# hoards", /*spanish*/"a #purple monster# hoards", /*italian*/"un #polpo# difende", /*german*/"a #purple monster# hoards"} + },{}, + //clear text + Text{"the #Gerudo Valley Octorok# guards", /*french*/"the #Gerudo Valley Octorok# guards", /*spanish*/"the #Gerudo Valley Octorok# guards", /*italian*/"#l'Octorok nella grotta della valle Gerudo# difende", /*german*/"the #Gerudo Valley Octorok# guards"} + ); + + hintTable[GV_OCTOROCK_GROTTO_BLUE_RUPEE_2] = HintText::Exclude({ + // obscure text + Text{"a #purple monster# hoards", /*french*/"a #purple monster# hoards", /*spanish*/"a #purple monster# hoards", /*italian*/"un #polpo# difende", /*german*/"a #purple monster# hoards"}, + },{}, + //clear text + Text{"the #Gerudo Valley Octorok# guards", /*french*/"the #Gerudo Valley Octorok# guards", /*spanish*/"the #Gerudo Valley Octorok# guards", /*italian*/"#l'Octorok nella grotta della valle Gerudo# difende", /*german*/"the #Gerudo Valley Octorok# guards"} + ); + + hintTable[GV_OCTOROCK_GROTTO_BLUE_RUPEE_3] = HintText::Exclude({ + // obscure text + Text{"a #purple monster# hoards", /*french*/"a #purple monster# hoards", /*spanish*/"a #purple monster# hoards", /*italian*/"un #polpo# difende", /*german*/"a #purple monster# hoards"}, + },{}, + //clear text + Text{"the #Gerudo Valley Octorok# guards", /*french*/"the #Gerudo Valley Octorok# guards", /*spanish*/"the #Gerudo Valley Octorok# guards", /*italian*/"#l'Octorok nella grotta della valle Gerudo# difende", /*german*/"the #Gerudo Valley Octorok# guards"} + ); + + hintTable[GV_OCTOROCK_GROTTO_RED_RUPEE] = HintText::Exclude({ + // obscure text + Text{"a #purple monster# hoards", /*french*/"a #purple monster# hoards", /*spanish*/"a #purple monster# hoards", /*italian*/"un #polpo# difende", /*german*/"a #purple monster# hoards"}, + },{}, + //clear text + Text{"the #Gerudo Valley Octorok# guards", /*french*/"the #Gerudo Valley Octorok# guards", /*spanish*/"the #Gerudo Valley Octorok# guards", /*italian*/"#l'Octorok nella grotta della valle Gerudo# difende", /*german*/"the #Gerudo Valley Octorok# guards"} + ); hintTable[COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = HintText::Exclude({ // obscure text @@ -1297,7 +1996,6 @@ void HintTable_Init_Exclude_Overworld() { Text{"a #scrub underground duo# sells", /*french*/"le #duo de peste Mojo dans le désert# vend", /*spanish*/"un #par de dekus subterráneos# del desierto venden", /*italian*/"una #coppia di cespugli sotto la sabbia# vende", /*german*/"die Ware, des #Deku-Händler-Duos eines Erdlochs#, |wäre|wären|"}, }); - hintTable[LLR_STABLES_LEFT_COW] = HintText::Exclude({ // obscure text Text{"a #cow in a stable# gifts", /*french*/"la #vache dans l'étable# donne", /*spanish*/"una #vaca del establo# brinda", /*italian*/"una #mucca nella stalla# regala", /*german*/"die Milch einer #Kuh, im Stall der Farm#, |wäre|wären|"}, diff --git a/source/item_location.cpp b/source/item_location.cpp index fa2084f02..7e61f9fbc 100644 --- a/source/item_location.cpp +++ b/source/item_location.cpp @@ -135,6 +135,14 @@ void LocationTable_Init() { locationTable[GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = ItemLocation::Collectable(0x48, 0x07, "GY Dampe Race Freestanding PoH", GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko, Category::cMinigame}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); locationTable[GRAVEYARD_FREESTANDING_POH] = ItemLocation::Collectable(0x53, 0x04, "GY Freestanding PoH", GRAVEYARD_FREESTANDING_POH, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); locationTable[GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = ItemLocation::Collectable(0x53, 0x08, "GY Dampe Gravedigging Tour", GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, PIECE_OF_HEART, {Category::cGraveyard, Category::cKakariko,}, SpoilerCollectionCheck::ItemGetInf(20), SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_1] = ItemLocation::Collectable(0x48, 0x38, "GY Dampe Race Green Rupee 1", GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cGraveyard, Category::cKakariko, Category::cMinigame,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_2] = ItemLocation::Collectable(0x48, 0x39, "GY Dampe Race Green Rupee 2", GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cGraveyard, Category::cKakariko, Category::cMinigame,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_3] = ItemLocation::Collectable(0x48, 0x3A, "GY Dampe Race Green Rupee 3", GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_3, GREEN_RUPEE, {Category::cGraveyard, Category::cKakariko, Category::cMinigame,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_4] = ItemLocation::Collectable(0x48, 0x3B, "GY Dampe Race Green Rupee 4", GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_4, GREEN_RUPEE, {Category::cGraveyard, Category::cKakariko, Category::cMinigame,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_5] = ItemLocation::Collectable(0x48, 0x3C, "GY Dampe Race Green Rupee 5", GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_5, GREEN_RUPEE, {Category::cGraveyard, Category::cKakariko, Category::cMinigame,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_6] = ItemLocation::Collectable(0x48, 0x3D, "GY Dampe Race Green Rupee 6", GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_6, GREEN_RUPEE, {Category::cGraveyard, Category::cKakariko, Category::cMinigame,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_7] = ItemLocation::Collectable(0x48, 0x3E, "GY Dampe Race Green Rupee 7", GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_7, GREEN_RUPEE, {Category::cGraveyard, Category::cKakariko, Category::cMinigame,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); + locationTable[GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_8] = ItemLocation::Collectable(0x48, 0x3F, "GY Dampe Race Green Rupee 8", GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_8, GREEN_RUPEE, {Category::cGraveyard, Category::cKakariko, Category::cMinigame,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_GRAVEYARD); // Death Mountain Trail locationTable[DMT_CHEST] = ItemLocation::Chest (0x60, 0x01, "DMT Chest", DMT_CHEST, PURPLE_RUPEE, {Category::cDeathMountainTrail, Category::cDeathMountain,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); @@ -260,6 +268,10 @@ void LocationTable_Init() { locationTable[JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = ItemLocation::Chest (0x02, 0x09, "Jabu Jabus Belly MQ Falling Like Like Room Chest", JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, DEKU_STICK_1, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST] = ItemLocation::Chest (0x02, 0x01, "Jabu Jabus Belly MQ Boomerang Room Small Chest", JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, DEKU_NUTS_5, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST] = ItemLocation::Chest (0x02, 0x06, "Jabu Jabus Belly MQ Boomerang Chest", JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, BOOMERANG, {Category::cJabuJabusBelly,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_NEAR_COW_BOTTOM_GREEN_RUPEE] = ItemLocation::Collectable(0x02, 0x01, "Jabu Jabus Belly MQ Near Cow Bottom Green Rupee", JABU_JABUS_BELLY_MQ_NEAR_COW_BOTTOM_GREEN_RUPEE, GREEN_RUPEE, {Category::cJabuJabusBelly,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_NEAR_COW_MIDDLE_GREEN_RUPEE] = ItemLocation::Collectable(0x02, 0x02, "Jabu Jabus Belly MQ Near Cow Middle Green Rupee", JABU_JABUS_BELLY_MQ_NEAR_COW_MIDDLE_GREEN_RUPEE, GREEN_RUPEE, {Category::cJabuJabusBelly,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[JABU_JABUS_BELLY_MQ_NEAR_COW_TOP_GREEN_RUPEE] = ItemLocation::Collectable(0x02, 0x03, "Jabu Jabus Belly MQ Near Cow Top Green Rupee", JABU_JABUS_BELLY_MQ_NEAR_COW_TOP_GREEN_RUPEE, GREEN_RUPEE, {Category::cJabuJabusBelly,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + // Forest Temple Vanilla locationTable[FOREST_TEMPLE_FIRST_ROOM_CHEST] = ItemLocation::Chest (0x03, 0x03, "Forest Temple First Room Chest", FOREST_TEMPLE_FIRST_ROOM_CHEST, FOREST_TEMPLE_SMALL_KEY, {Category::cForestTemple, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); @@ -435,6 +447,11 @@ void LocationTable_Init() { locationTable[BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = ItemLocation::Chest (0x08, 0x0A, "Bottom of the Well Fire Keese Chest", BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, DEKU_SHIELD, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = ItemLocation::Chest (0x08, 0x0C, "Bottom of the Well Like Like Chest", BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, HYLIAN_SHIELD, {Category::cBottomOfTheWell,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = ItemLocation::Collectable(0x08, 0x01, "Bottom of the Well Freestanding Key", BOTTOM_OF_THE_WELL_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_1] = ItemLocation::Collectable(0x08, 0x02, "Bottom of the Well Center Pit fall Blue Rupee 1", BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_1, BLUE_RUPEE, {Category::cBottomOfTheWell, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_2] = ItemLocation::Collectable(0x08, 0x03, "Bottom of the Well Center Pit fall Blue Rupee 2", BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_2, BLUE_RUPEE, {Category::cBottomOfTheWell, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_3] = ItemLocation::Collectable(0x08, 0x04, "Bottom of the Well Center Pit fall Blue Rupee 3", BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_3, BLUE_RUPEE, {Category::cBottomOfTheWell, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_4] = ItemLocation::Collectable(0x08, 0x05, "Bottom of the Well Center Pit fall Blue Rupee 4", BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_4, BLUE_RUPEE, {Category::cBottomOfTheWell, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_5] = ItemLocation::Collectable(0x08, 0x06, "Bottom of the Well Center Pit fall Blue Rupee 5", BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_5, BLUE_RUPEE, {Category::cBottomOfTheWell, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); // Bottom of the Well MQ locationTable[BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = ItemLocation::Chest (0x08, 0x03, "Bottom of the Well MQ Map Chest", BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, BOTTOM_OF_THE_WELL_MAP, {Category::cBottomOfTheWell, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = ItemLocation::Chest (0x08, 0x01, "Bottom of the Well MQ Lens of Truth Chest", BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, LENS_OF_TRUTH, {Category::cBottomOfTheWell, Category::cSongDungeonReward}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -443,15 +460,19 @@ void LocationTable_Init() { locationTable[BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = ItemLocation::Collectable(0x08, 0x01, "Bottom of the Well MQ East Inner Room Freestanding Key",BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, BOTTOM_OF_THE_WELL_SMALL_KEY, {Category::cBottomOfTheWell, Category::cVanillaSmallKey}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); // Ice Cavern Vanilla - locationTable[ICE_CAVERN_MAP_CHEST] = ItemLocation::Chest (0x09, 0x00, "Ice Cavern Map Chest", ICE_CAVERN_MAP_CHEST, ICE_CAVERN_MAP, {Category::cIceCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_COMPASS_CHEST] = ItemLocation::Chest (0x09, 0x01, "Ice Cavern Compass Chest", ICE_CAVERN_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cIceCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_IRON_BOOTS_CHEST] = ItemLocation::Chest (0x09, 0x02, "Ice Cavern Iron Boots Chest", ICE_CAVERN_IRON_BOOTS_CHEST, IRON_BOOTS, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_FREESTANDING_POH] = ItemLocation::Collectable(0x09, 0x01, "Ice Cavern Freestanding PoH", ICE_CAVERN_FREESTANDING_POH, PIECE_OF_HEART, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MAP_CHEST] = ItemLocation::Chest (0x09, 0x00, "Ice Cavern Map Chest", ICE_CAVERN_MAP_CHEST, ICE_CAVERN_MAP, {Category::cIceCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_COMPASS_CHEST] = ItemLocation::Chest (0x09, 0x01, "Ice Cavern Compass Chest", ICE_CAVERN_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cIceCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_IRON_BOOTS_CHEST] = ItemLocation::Chest (0x09, 0x02, "Ice Cavern Iron Boots Chest", ICE_CAVERN_IRON_BOOTS_CHEST, IRON_BOOTS, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_FREESTANDING_POH] = ItemLocation::Collectable(0x09, 0x01, "Ice Cavern Freestanding PoH", ICE_CAVERN_FREESTANDING_POH, PIECE_OF_HEART, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_RED_ICE_BLUE_RUPEE] = ItemLocation::Collectable(0x09, 0x21, "Ice Cavern Red Ice Blue Rupee", ICE_CAVERN_RED_ICE_BLUE_RUPEE, BLUE_RUPEE, {Category::cIceCavern,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_1] = ItemLocation::Collectable(0x09, 0x2E, "Ice Cavern Block Room Red Rupee 1", ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_1, RED_RUPEE, {Category::cIceCavern,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_2] = ItemLocation::Collectable(0x09, 0x2F, "Ice Cavern Block Room Red Rupee 2", ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_2, RED_RUPEE, {Category::cIceCavern,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_3] = ItemLocation::Collectable(0x09, 0x30, "Ice Cavern Block Room Red Rupee 3", ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_3, RED_RUPEE, {Category::cIceCavern,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); // Ice Cavern MQ - locationTable[ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = ItemLocation::Chest (0x09, 0x02, "Ice Cavern MQ Iron Boots Chest", ICE_CAVERN_MQ_IRON_BOOTS_CHEST, IRON_BOOTS, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x09, 0x00, "Ice Cavern MQ Compass Chest", ICE_CAVERN_MQ_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cIceCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (0x09, 0x01, "Ice Cavern MQ Map Chest", ICE_CAVERN_MQ_MAP_CHEST, ICE_CAVERN_MAP, {Category::cIceCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[ICE_CAVERN_MQ_FREESTANDING_POH] = ItemLocation::Collectable(0x09, 0x01, "Ice Cavern MQ Freestanding PoH", ICE_CAVERN_MQ_FREESTANDING_POH, PIECE_OF_HEART, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = ItemLocation::Chest (0x09, 0x02, "Ice Cavern MQ Iron Boots Chest", ICE_CAVERN_MQ_IRON_BOOTS_CHEST, IRON_BOOTS, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_COMPASS_CHEST] = ItemLocation::Chest (0x09, 0x00, "Ice Cavern MQ Compass Chest", ICE_CAVERN_MQ_COMPASS_CHEST, ICE_CAVERN_COMPASS, {Category::cIceCavern, Category::cVanillaCompass,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_MAP_CHEST] = ItemLocation::Chest (0x09, 0x01, "Ice Cavern MQ Map Chest", ICE_CAVERN_MQ_MAP_CHEST, ICE_CAVERN_MAP, {Category::cIceCavern, Category::cVanillaMap,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[ICE_CAVERN_MQ_FREESTANDING_POH] = ItemLocation::Collectable(0x09, 0x01, "Ice Cavern MQ Freestanding PoH", ICE_CAVERN_MQ_FREESTANDING_POH, PIECE_OF_HEART, {Category::cIceCavern,}, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); // Gerudo Training Ground Vanilla locationTable[GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST] = ItemLocation::Chest (0x0B, 0x13, "Gerudo Training Grounds Lobby Left Chest", GERUDO_TRAINING_GROUNDS_LOBBY_LEFT_CHEST, BLUE_RUPEE, {Category::cGerudoTrainingGrounds,}, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); @@ -872,6 +893,101 @@ void LocationTable_Init() { locationTable[GC_SHOP_ITEM_7] = ItemLocation::Base(0x2E, 0x36, "GC Shop Item 7", GC_SHOP_ITEM_7, BUY_RED_POTION_40, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 6), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); locationTable[GC_SHOP_ITEM_8] = ItemLocation::Base(0x2E, 0x37, "GC Shop Item 8", GC_SHOP_ITEM_8, BUY_HEART, {Category::cGoronCity, Category::cShop}, SpoilerCollectionCheck::ShopItem(0x2E, 7), SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + /*------------------------------- + --- FREE STANDING RUPEES --- + -------------------------------*/ + locationTable[KF_END_OF_BRIDGE_BLUE_RUPEE] = ItemLocation::Collectable(0x55, 0x11, "KF End of Bridge Blue Rupee", KF_END_OF_BRIDGE_BLUE_RUPEE, BLUE_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_BEHIND_MIDOS_HOUSE_BLUE_RUPEE] = ItemLocation::Collectable(0x55, 0x12, "KF Behind Mido's house Blue Rupee", KF_BEHIND_MIDOS_HOUSE_BLUE_RUPEE, BLUE_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_BOULDER_MAZE_BLUE_RUPEE_1] = ItemLocation::Collectable(0x55, 0x0F, "KF Boulder Maze Blue Rupee 1", KF_BOULDER_MAZE_BLUE_RUPEE_1, BLUE_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_BOULDER_MAZE_BLUE_RUPEE_2] = ItemLocation::Collectable(0x55, 0x0E, "KF Boulder Maze Blue Rupee 2", KF_BOULDER_MAZE_BLUE_RUPEE_2, BLUE_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_NEAR_RAMP_GREEN_RUPEE_1] = ItemLocation::Collectable(0x55, 0x24, "KF Near Ramp Green Rupee 1", KF_NEAR_RAMP_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_NEAR_RAMP_GREEN_RUPEE_2] = ItemLocation::Collectable(0x55, 0x27, "KF Near Ramp Green Rupee 2", KF_NEAR_RAMP_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_1] = ItemLocation::Collectable(0x55, 0x25, "KF Near Mido's House Green Rupee 1", KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_2] = ItemLocation::Collectable(0x55, 0x26, "KF Near Mido's House Green Rupee 2", KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_1] = ItemLocation::Collectable(0x55, 0x40, "KF Rupee circle Green Rupee 1", KF_RUPEE_CIRCLE_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_2] = ItemLocation::Collectable(0x55, 0x41, "KF Rupee circle Green Rupee 2", KF_RUPEE_CIRCLE_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_3] = ItemLocation::Collectable(0x55, 0x42, "KF Rupee circle Green Rupee 3", KF_RUPEE_CIRCLE_GREEN_RUPEE_3, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_4] = ItemLocation::Collectable(0x55, 0x43, "KF Rupee circle Green Rupee 4", KF_RUPEE_CIRCLE_GREEN_RUPEE_4, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_5] = ItemLocation::Collectable(0x55, 0x44, "KF Rupee circle Green Rupee 5", KF_RUPEE_CIRCLE_GREEN_RUPEE_5, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_RUPEE_CIRCLE_GREEN_RUPEE_6] = ItemLocation::Collectable(0x55, 0x45, "KF Rupee circle Green Rupee 6", KF_RUPEE_CIRCLE_GREEN_RUPEE_6, GREEN_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[KF_RUPEE_CIRCLE_RED_RUPEE] = ItemLocation::Collectable(0x55, 0x46, "KF Rupee circle Red Rupee", KF_RUPEE_CIRCLE_RED_RUPEE, RED_RUPEE, {Category::cKokiriForest, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + + locationTable[LW_IN_BOULDER_BLUE_RUPEE] = ItemLocation::Collectable(0x5B, 0x13, "LW in boulder blue rupee", LW_IN_BOULDER_BLUE_RUPEE, BLUE_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_1] = ItemLocation::Collectable(0x5B, 0x34, "LW in water near ZR Shortcut Green Rupee 1", LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_2] = ItemLocation::Collectable(0x5B, 0x35, "LW in water near ZR Shortcut Green Rupee 2", LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_3] = ItemLocation::Collectable(0x5B, 0x36, "LW in water near ZR Shortcut Green Rupee 3", LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_3, GREEN_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_4] = ItemLocation::Collectable(0x5B, 0x37, "LW in water near ZR Shortcut Green Rupee 4", LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_4, GREEN_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_5] = ItemLocation::Collectable(0x5B, 0x39, "LW in water near ZR Shortcut Green Rupee 5", LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_5, GREEN_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_6] = ItemLocation::Collectable(0x5B, 0x3A, "LW in water near ZR Shortcut Green Rupee 6", LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_6, GREEN_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_7] = ItemLocation::Collectable(0x5B, 0x3B, "LW in water near ZR Shortcut Green Rupee 7", LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_7, GREEN_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_8] = ItemLocation::Collectable(0x5B, 0x3C, "LW in water near ZR Shortcut Green Rupee 8", LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_8, GREEN_RUPEE, {Category::cLostWoods, Category::cForest,Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + + locationTable[LH_UNDER_WATER_GREEN_RUPEE_1] = ItemLocation::Collectable(0x57, 0x20, "LH Under water green rupee 1", LH_UNDER_WATER_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cLakeHylia, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_UNDER_WATER_GREEN_RUPEE_2] = ItemLocation::Collectable(0x57, 0x21, "LH Under water green rupee 2", LH_UNDER_WATER_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cLakeHylia, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_UNDER_WATER_GREEN_RUPEE_3] = ItemLocation::Collectable(0x57, 0x22, "LH Under water green rupee 3", LH_UNDER_WATER_GREEN_RUPEE_3, GREEN_RUPEE, {Category::cLakeHylia, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_LAB_DIVE_RED_RUPEE_1] = ItemLocation::Collectable(0x38, 0x01, "LH Lab Dive Red rupee 1", LH_LAB_DIVE_RED_RUPEE_1, RED_RUPEE, {Category::cLakeHylia, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_LAB_DIVE_RED_RUPEE_2] = ItemLocation::Collectable(0x38, 0x02, "LH Lab Dive Red rupee 2", LH_LAB_DIVE_RED_RUPEE_2, RED_RUPEE, {Category::cLakeHylia, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[LH_LAB_DIVE_RED_RUPEE_3] = ItemLocation::Collectable(0x38, 0x03, "LH Lab Dive Red rupee 3", LH_LAB_DIVE_RED_RUPEE_3, RED_RUPEE, {Category::cLakeHylia, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + + locationTable[GV_OCTOROCK_GROTTO_BLUE_RUPEE_1] = ItemLocation::Collectable(0x3E, 0x38, "GV Octorock Grotto Blue Rupee 1", GV_OCTOROCK_GROTTO_BLUE_RUPEE_1, BLUE_RUPEE, {Category::cGerudoValley, Category::cGerudo,Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_OCTOROCK_GROTTO_BLUE_RUPEE_2] = ItemLocation::Collectable(0x3E, 0x39, "GV Octorock Grotto Blue Rupee 2", GV_OCTOROCK_GROTTO_BLUE_RUPEE_2, BLUE_RUPEE, {Category::cGerudoValley, Category::cGerudo,Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_OCTOROCK_GROTTO_BLUE_RUPEE_3] = ItemLocation::Collectable(0x3E, 0x3A, "GV Octorock Grotto Blue Rupee 3", GV_OCTOROCK_GROTTO_BLUE_RUPEE_3, BLUE_RUPEE, {Category::cGerudoValley, Category::cGerudo,Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_OCTOROCK_GROTTO_GREEN_RUPEE_1] = ItemLocation::Collectable(0x3E, 0x3B, "GV Octorock Grotto Green Rupee 1", GV_OCTOROCK_GROTTO_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cGerudoValley, Category::cGerudo,Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_OCTOROCK_GROTTO_GREEN_RUPEE_2] = ItemLocation::Collectable(0x3E, 0x3C, "GV Octorock Grotto Green Rupee 2", GV_OCTOROCK_GROTTO_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cGerudoValley, Category::cGerudo,Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_OCTOROCK_GROTTO_GREEN_RUPEE_3] = ItemLocation::Collectable(0x3E, 0x3D, "GV Octorock Grotto Green Rupee 3", GV_OCTOROCK_GROTTO_GREEN_RUPEE_3, GREEN_RUPEE, {Category::cGerudoValley, Category::cGerudo,Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_OCTOROCK_GROTTO_GREEN_RUPEE_4] = ItemLocation::Collectable(0x3E, 0x3E, "GV Octorock Grotto Green Rupee 4", GV_OCTOROCK_GROTTO_GREEN_RUPEE_4, GREEN_RUPEE, {Category::cGerudoValley, Category::cGerudo,Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[GV_OCTOROCK_GROTTO_RED_RUPEE] = ItemLocation::Collectable(0x3E, 0x3F, "GV Octorock Grotto Red Rupee", GV_OCTOROCK_GROTTO_RED_RUPEE, RED_RUPEE, {Category::cGerudoValley, Category::cGerudo,Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + + locationTable[DMT_ROCK_BLUE_RUPEE] = ItemLocation::Collectable(0x60, 0x07, "DMT Rock Blue Rupee", DMT_ROCK_BLUE_RUPEE, BLUE_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMT_ROCK_RED_RUPEE] = ItemLocation::Collectable(0x60, 0x0A, "DMT Rock Red Rupee", DMT_ROCK_RED_RUPEE, RED_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_1] = ItemLocation::Collectable(0x3E, 0x40, "DMT Cow Grotto rupee circle Green Rupee 1", DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_2] = ItemLocation::Collectable(0x3E, 0x41, "DMT Cow Grotto rupee circle Green Rupee 2", DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_3] = ItemLocation::Collectable(0x3E, 0x42, "DMT Cow Grotto rupee circle Green Rupee 3", DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_3, GREEN_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_4] = ItemLocation::Collectable(0x3E, 0x43, "DMT Cow Grotto rupee circle Green Rupee 4", DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_4, GREEN_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_5] = ItemLocation::Collectable(0x3E, 0x44, "DMT Cow Grotto rupee circle Green Rupee 5", DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_5, GREEN_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_6] = ItemLocation::Collectable(0x3E, 0x45, "DMT Cow Grotto rupee circle Green Rupee 6", DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_6, GREEN_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + locationTable[DMT_COW_GROTTO_RUPEE_CIRCLE_RED_RUPEE] = ItemLocation::Collectable(0x3E, 0x46, "DMT Cow Grotto rupee circle Red Rupee", DMT_COW_GROTTO_RUPEE_CIRCLE_RED_RUPEE, RED_RUPEE, {Category::cDeathMountainTrail, Category::cFreestandingRupee,Category::cGrotto}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_TRAIL); + + locationTable[DMC_LOWER_RED_RUPEE_1] = ItemLocation::Collectable(0x61, 0x20, "DMC Lower Red Rupee 1", DMC_LOWER_RED_RUPEE_1, RED_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_LOWER_RED_RUPEE_2] = ItemLocation::Collectable(0x61, 0x21, "DMC Lower Red Rupee 2", DMC_LOWER_RED_RUPEE_2, RED_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_LOWER_BLUE_RUPEE_1] = ItemLocation::Collectable(0x61, 0x22, "DMC Lower Blue Rupee 1", DMC_LOWER_BLUE_RUPEE_1, BLUE_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_LOWER_BLUE_RUPEE_2] = ItemLocation::Collectable(0x61, 0x23, "DMC Lower Blue Rupee 2", DMC_LOWER_BLUE_RUPEE_2, BLUE_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_LOWER_BLUE_RUPEE_3] = ItemLocation::Collectable(0x61, 0x24, "DMC Lower Blue Rupee 3", DMC_LOWER_BLUE_RUPEE_3, BLUE_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_LOWER_BLUE_RUPEE_4] = ItemLocation::Collectable(0x61, 0x25, "DMC Lower Blue Rupee 4", DMC_LOWER_BLUE_RUPEE_4, BLUE_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_LOWER_BLUE_RUPEE_5] = ItemLocation::Collectable(0x61, 0x26, "DMC Lower Blue Rupee 5", DMC_LOWER_BLUE_RUPEE_5, BLUE_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_LOWER_BLUE_RUPEE_6] = ItemLocation::Collectable(0x61, 0x27, "DMC Lower Blue Rupee 6", DMC_LOWER_BLUE_RUPEE_6, BLUE_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_1] = ItemLocation::Collectable(0x61, 0x40, "DMC Scare crow rupee circle Green Rupee 1", DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_2] = ItemLocation::Collectable(0x61, 0x41, "DMC Scare crow rupee circle Green Rupee 2", DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_3] = ItemLocation::Collectable(0x61, 0x42, "DMC Scare crow rupee circle Green Rupee 3", DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_3, GREEN_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_4] = ItemLocation::Collectable(0x61, 0x43, "DMC Scare crow rupee circle Green Rupee 4", DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_4, GREEN_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_5] = ItemLocation::Collectable(0x61, 0x44, "DMC Scare crow rupee circle Green Rupee 5", DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_5, GREEN_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_6] = ItemLocation::Collectable(0x61, 0x45, "DMC Scare crow rupee circle Green Rupee 6", DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_6, GREEN_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + locationTable[DMC_SCARE_CROW_RUPEE_CIRCLE_RED_RUPEE] = ItemLocation::Collectable(0x61, 0x46, "DMC Scare crow rupee circle Red Rupee", DMC_SCARE_CROW_RUPEE_CIRCLE_RED_RUPEE, RED_RUPEE, {Category::cDeathMountainCrater,Category::cDeathMountain, Category::cFreestandingRupee,}, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN_CRATER); + + locationTable[ZR_WATERFALL_RED_RUPEE_1] = ItemLocation::Collectable(0x54, 0x20, "ZR Waterfall Red Rupee 1", ZR_WATERFALL_RED_RUPEE_1, RED_RUPEE, {Category::cZorasRiver, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_WATERFALL_RED_RUPEE_2] = ItemLocation::Collectable(0x54, 0x21, "ZR Waterfall Red Rupee 2", ZR_WATERFALL_RED_RUPEE_2, RED_RUPEE, {Category::cZorasRiver, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_WATERFALL_RED_RUPEE_3] = ItemLocation::Collectable(0x54, 0x22, "ZR Waterfall Red Rupee 3", ZR_WATERFALL_RED_RUPEE_3, RED_RUPEE, {Category::cZorasRiver, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[ZR_WATERFALL_RED_RUPEE_4] = ItemLocation::Collectable(0x54, 0x23, "ZR Waterfall Red Rupee 4", ZR_WATERFALL_RED_RUPEE_4, RED_RUPEE, {Category::cZorasRiver, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + + locationTable[ZF_UNDERWATER_GREEN_RUPEE_1] = ItemLocation::Collectable(0x59, 0x20, "ZF Underwater Green Rupee 1", ZF_UNDERWATER_GREEN_RUPEE_1, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_2] = ItemLocation::Collectable(0x59, 0x21, "ZF Underwater Green Rupee 2", ZF_UNDERWATER_GREEN_RUPEE_2, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_3] = ItemLocation::Collectable(0x59, 0x22, "ZF Underwater Green Rupee 3", ZF_UNDERWATER_GREEN_RUPEE_3, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_4] = ItemLocation::Collectable(0x59, 0x23, "ZF Underwater Green Rupee 4", ZF_UNDERWATER_GREEN_RUPEE_4, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_5] = ItemLocation::Collectable(0x59, 0x24, "ZF Underwater Green Rupee 5", ZF_UNDERWATER_GREEN_RUPEE_5, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_6] = ItemLocation::Collectable(0x59, 0x25, "ZF Underwater Green Rupee 6", ZF_UNDERWATER_GREEN_RUPEE_6, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_7] = ItemLocation::Collectable(0x59, 0x26, "ZF Underwater Green Rupee 7", ZF_UNDERWATER_GREEN_RUPEE_7, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_8] = ItemLocation::Collectable(0x59, 0x27, "ZF Underwater Green Rupee 8", ZF_UNDERWATER_GREEN_RUPEE_8, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_9] = ItemLocation::Collectable(0x59, 0x28, "ZF Underwater Green Rupee 9", ZF_UNDERWATER_GREEN_RUPEE_9, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_10] = ItemLocation::Collectable(0x59, 0x29, "ZF Underwater Green Rupee 10", ZF_UNDERWATER_GREEN_RUPEE_10, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_11] = ItemLocation::Collectable(0x59, 0x2A, "ZF Underwater Green Rupee 11", ZF_UNDERWATER_GREEN_RUPEE_11, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_12] = ItemLocation::Collectable(0x59, 0x2B, "ZF Underwater Green Rupee 12", ZF_UNDERWATER_GREEN_RUPEE_12, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_13] = ItemLocation::Collectable(0x59, 0x2C, "ZF Underwater Green Rupee 13", ZF_UNDERWATER_GREEN_RUPEE_13, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_14] = ItemLocation::Collectable(0x59, 0x2D, "ZF Underwater Green Rupee 14", ZF_UNDERWATER_GREEN_RUPEE_14, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_15] = ItemLocation::Collectable(0x59, 0x2E, "ZF Underwater Green Rupee 15", ZF_UNDERWATER_GREEN_RUPEE_15, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_16] = ItemLocation::Collectable(0x59, 0x2F, "ZF Underwater Green Rupee 16", ZF_UNDERWATER_GREEN_RUPEE_16, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_17] = ItemLocation::Collectable(0x59, 0x30, "ZF Underwater Green Rupee 17", ZF_UNDERWATER_GREEN_RUPEE_17, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + locationTable[ZF_UNDERWATER_GREEN_RUPEE_18] = ItemLocation::Collectable(0x59, 0x31, "ZF Underwater Green Rupee 18", ZF_UNDERWATER_GREEN_RUPEE_18, GREEN_RUPEE, {Category::cZorasFountain, Category::cFreestandingRupee}, SpoilerCollectionCheckGroup::GROUP_ZORAS_FOUNTAIN); + /*------------------------------- --- GOSSIP STONES --- -------------------------------*/ @@ -1080,6 +1196,21 @@ std::vector overworldLocations = { KF_MIDOS_BOTTOM_RIGHT_CHEST, KF_STORMS_GROTTO_CHEST, KF_LINKS_HOUSE_COW, + KF_END_OF_BRIDGE_BLUE_RUPEE, + KF_BEHIND_MIDOS_HOUSE_BLUE_RUPEE, + KF_BOULDER_MAZE_BLUE_RUPEE_1, + KF_BOULDER_MAZE_BLUE_RUPEE_2, + KF_NEAR_RAMP_GREEN_RUPEE_1, + KF_NEAR_RAMP_GREEN_RUPEE_2, + KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_1, + KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_2, + KF_RUPEE_CIRCLE_GREEN_RUPEE_1, + KF_RUPEE_CIRCLE_GREEN_RUPEE_2, + KF_RUPEE_CIRCLE_GREEN_RUPEE_3, + KF_RUPEE_CIRCLE_GREEN_RUPEE_4, + KF_RUPEE_CIRCLE_GREEN_RUPEE_5, + KF_RUPEE_CIRCLE_GREEN_RUPEE_6, + KF_RUPEE_CIRCLE_RED_RUPEE, // Shop KF_SHOP_ITEM_1, @@ -1101,6 +1232,15 @@ std::vector overworldLocations = { LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, LW_DEKU_SCRUB_NEAR_BRIDGE, + LW_IN_BOULDER_BLUE_RUPEE, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_1, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_2, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_3, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_4, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_5, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_6, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_7, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_8, LW_NEAR_SHORTCUTS_GROTTO_CHEST, LW_DEKU_SCRUB_GROTTO_REAR, LW_DEKU_SCRUB_GROTTO_FRONT, @@ -1132,6 +1272,12 @@ std::vector overworldLocations = { LH_UNDERWATER_ITEM, LH_SUN, LH_FREESTANDING_POH, + LH_UNDER_WATER_GREEN_RUPEE_1, + LH_UNDER_WATER_GREEN_RUPEE_2, + LH_UNDER_WATER_GREEN_RUPEE_3, + LH_LAB_DIVE_RED_RUPEE_1, + LH_LAB_DIVE_RED_RUPEE_2, + LH_LAB_DIVE_RED_RUPEE_3, LH_DEKU_SCRUB_GROTTO_LEFT, LH_DEKU_SCRUB_GROTTO_RIGHT, LH_DEKU_SCRUB_GROTTO_CENTER, @@ -1144,6 +1290,14 @@ std::vector overworldLocations = { GV_DEKU_SCRUB_GROTTO_REAR, GV_DEKU_SCRUB_GROTTO_FRONT, GV_COW, + GV_OCTOROCK_GROTTO_GREEN_RUPEE_1, + GV_OCTOROCK_GROTTO_GREEN_RUPEE_2, + GV_OCTOROCK_GROTTO_GREEN_RUPEE_3, + GV_OCTOROCK_GROTTO_GREEN_RUPEE_4, + GV_OCTOROCK_GROTTO_BLUE_RUPEE_1, + GV_OCTOROCK_GROTTO_BLUE_RUPEE_2, + GV_OCTOROCK_GROTTO_BLUE_RUPEE_3, + GV_OCTOROCK_GROTTO_RED_RUPEE, // Gerudo Fortress GF_CHEST, @@ -1266,6 +1420,14 @@ std::vector overworldLocations = { GRAVEYARD_FREESTANDING_POH, GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_1, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_2, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_3, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_4, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_5, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_6, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_7, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_8, // Death Mountain Trail DMT_CHEST, @@ -1276,6 +1438,15 @@ std::vector overworldLocations = { DMT_GREAT_FAIRY_REWARD, DMT_FREESTANDING_POH, DMT_COW_GROTTO_COW, + DMT_ROCK_BLUE_RUPEE, + DMT_ROCK_RED_RUPEE, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_1, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_2, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_3, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_4, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_5, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_6, + DMT_COW_GROTTO_RUPEE_CIRCLE_RED_RUPEE, // Goron City GC_MAZE_LEFT_CHEST, @@ -1310,6 +1481,21 @@ std::vector overworldLocations = { DMC_DEKU_SCRUB_GROTTO_LEFT, DMC_DEKU_SCRUB_GROTTO_RIGHT, DMC_DEKU_SCRUB_GROTTO_CENTER, + DMC_LOWER_RED_RUPEE_1, + DMC_LOWER_RED_RUPEE_2, + DMC_LOWER_BLUE_RUPEE_1, + DMC_LOWER_BLUE_RUPEE_2, + DMC_LOWER_BLUE_RUPEE_3, + DMC_LOWER_BLUE_RUPEE_4, + DMC_LOWER_BLUE_RUPEE_5, + DMC_LOWER_BLUE_RUPEE_6, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_1, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_2, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_3, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_4, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_5, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_6, + DMC_SCARE_CROW_RUPEE_CIRCLE_RED_RUPEE, // Zoras River ZR_OPEN_GROTTO_CHEST, @@ -1325,6 +1511,10 @@ std::vector overworldLocations = { ZR_NEAR_DOMAIN_FREESTANDING_POH, ZR_DEKU_SCRUB_GROTTO_REAR, ZR_DEKU_SCRUB_GROTTO_FRONT, + ZR_WATERFALL_RED_RUPEE_1, + ZR_WATERFALL_RED_RUPEE_2, + ZR_WATERFALL_RED_RUPEE_3, + ZR_WATERFALL_RED_RUPEE_4, // Zoras Domain ZD_CHEST, @@ -1346,6 +1536,24 @@ std::vector overworldLocations = { ZF_ICEBERG_FREESTANDING_POH, ZF_BOTTOM_FREESTANDING_POH, ZF_GREAT_FAIRY_REWARD, + ZF_UNDERWATER_GREEN_RUPEE_1, + ZF_UNDERWATER_GREEN_RUPEE_2, + ZF_UNDERWATER_GREEN_RUPEE_3, + ZF_UNDERWATER_GREEN_RUPEE_4, + ZF_UNDERWATER_GREEN_RUPEE_5, + ZF_UNDERWATER_GREEN_RUPEE_6, + ZF_UNDERWATER_GREEN_RUPEE_7, + ZF_UNDERWATER_GREEN_RUPEE_8, + ZF_UNDERWATER_GREEN_RUPEE_9, + ZF_UNDERWATER_GREEN_RUPEE_10, + ZF_UNDERWATER_GREEN_RUPEE_11, + ZF_UNDERWATER_GREEN_RUPEE_12, + ZF_UNDERWATER_GREEN_RUPEE_13, + ZF_UNDERWATER_GREEN_RUPEE_14, + ZF_UNDERWATER_GREEN_RUPEE_15, + ZF_UNDERWATER_GREEN_RUPEE_16, + ZF_UNDERWATER_GREEN_RUPEE_17, + ZF_UNDERWATER_GREEN_RUPEE_18, // Lon Lon Ranch SONG_FROM_MALON, diff --git a/source/item_location.hpp b/source/item_location.hpp index 68bd6f330..2fc84929f 100644 --- a/source/item_location.hpp +++ b/source/item_location.hpp @@ -177,6 +177,10 @@ class ItemLocation { return placedItem; } + ItemKey GetVanillaItem() const { + return vanillaItem; + } + void SetPlacedItem(const ItemKey item) { placedItem = item; SetPrice(ItemTable(placedItem).GetPrice()); diff --git a/source/item_pool.cpp b/source/item_pool.cpp index 588e38b9c..2700d8676 100644 --- a/source/item_pool.cpp +++ b/source/item_pool.cpp @@ -686,6 +686,16 @@ void GenerateItemPool() { AddItemToMainPool(GOLD_SKULLTULA_TOKEN, 100); } + if (ShuffleRupees) { + for (LocationKey loc : GetLocations(allLocations, Category::cFreestandingRupee)) { + AddItemToMainPool(Location(loc)->GetVanillaItem()); + } + } else { + for (LocationKey loc : GetLocations(allLocations, Category::cFreestandingRupee)) { + Location(loc)->PlaceVanillaItem(); + } + } + if (BombchusInLogic) { AddItemToMainPool(PROGRESSIVE_BOMBCHUS, 5); } else { diff --git a/source/keys.hpp b/source/keys.hpp index f1db40e9d..d995a6a0d 100644 --- a/source/keys.hpp +++ b/source/keys.hpp @@ -348,6 +348,21 @@ typedef enum { KF_SHOP_ITEM_6, KF_SHOP_ITEM_7, KF_SHOP_ITEM_8, + KF_END_OF_BRIDGE_BLUE_RUPEE, + KF_BEHIND_MIDOS_HOUSE_BLUE_RUPEE, + KF_BOULDER_MAZE_BLUE_RUPEE_1, + KF_BOULDER_MAZE_BLUE_RUPEE_2, + KF_NEAR_RAMP_GREEN_RUPEE_1, + KF_NEAR_RAMP_GREEN_RUPEE_2, + KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_1, + KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_2, + KF_RUPEE_CIRCLE_GREEN_RUPEE_1, + KF_RUPEE_CIRCLE_GREEN_RUPEE_2, + KF_RUPEE_CIRCLE_GREEN_RUPEE_3, + KF_RUPEE_CIRCLE_GREEN_RUPEE_4, + KF_RUPEE_CIRCLE_GREEN_RUPEE_5, + KF_RUPEE_CIRCLE_GREEN_RUPEE_6, + KF_RUPEE_CIRCLE_RED_RUPEE, // LOST_WOODS LW_GIFT_FROM_SARIA, LW_OCARINA_MEMORY_GAME, @@ -366,6 +381,15 @@ typedef enum { LW_GS_BEAN_PATCH_NEAR_BRIDGE, LW_GS_BEAN_PATCH_NEAR_THEATER, LW_GS_ABOVE_THEATER, + LW_IN_BOULDER_BLUE_RUPEE, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_1, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_2, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_3, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_4, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_5, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_6, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_7, + LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_8, // SACRED_FOREST_MEADOW SFM_WOLFOS_GROTTO_CHEST, SFM_DEKU_SCRUB_GROTTO_FRONT, @@ -489,6 +513,14 @@ typedef enum { GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, GRAVEYARD_HOOKSHOT_CHEST, GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_1, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_2, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_3, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_4, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_5, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_6, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_7, + GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_8, GRAVEYARD_GS_BEAN_PATCH, GRAVEYARD_GS_WALL, // DEATH_MOUNTAIN_TRAIL @@ -504,6 +536,15 @@ typedef enum { DMT_GS_BEAN_PATCH, DMT_GS_ABOVE_DODONGOS_CAVERN, DMT_GS_FALLING_ROCKS_PATH, + DMT_ROCK_BLUE_RUPEE, + DMT_ROCK_RED_RUPEE, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_1, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_2, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_3, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_4, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_5, + DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_6, + DMT_COW_GROTTO_RUPEE_CIRCLE_RED_RUPEE, // GORON_CITY GC_DARUNIAS_JOY, GC_POT_FREESTANDING_POH, @@ -537,6 +578,21 @@ typedef enum { DMC_DEKU_SCRUB_GROTTO_RIGHT, DMC_GS_CRATE, DMC_GS_BEAN_PATCH, + DMC_LOWER_RED_RUPEE_1, + DMC_LOWER_RED_RUPEE_2, + DMC_LOWER_BLUE_RUPEE_1, + DMC_LOWER_BLUE_RUPEE_2, + DMC_LOWER_BLUE_RUPEE_3, + DMC_LOWER_BLUE_RUPEE_4, + DMC_LOWER_BLUE_RUPEE_5, + DMC_LOWER_BLUE_RUPEE_6, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_1, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_2, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_3, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_4, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_5, + DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_6, + DMC_SCARE_CROW_RUPEE_CIRCLE_RED_RUPEE, // ZORA'S_RIVER ZR_MAGIC_BEAN_SALESMAN, ZR_OPEN_GROTTO_CHEST, @@ -555,6 +611,10 @@ typedef enum { ZR_GS_LADDER, ZR_GS_NEAR_RAISED_GROTTOS, ZR_GS_ABOVE_BRIDGE, + ZR_WATERFALL_RED_RUPEE_1, + ZR_WATERFALL_RED_RUPEE_2, + ZR_WATERFALL_RED_RUPEE_3, + ZR_WATERFALL_RED_RUPEE_4, // ZORA'S_DOMAIN ZD_DIVING_MINIGAME, ZD_CHEST, @@ -576,6 +636,25 @@ typedef enum { ZF_GS_ABOVE_THE_LOG, ZF_GS_TREE, ZF_GS_HIDDEN_CAVE, + ZF_UNDERWATER_GREEN_RUPEE_1, + ZF_UNDERWATER_GREEN_RUPEE_2, + ZF_UNDERWATER_GREEN_RUPEE_3, + ZF_UNDERWATER_GREEN_RUPEE_4, + ZF_UNDERWATER_GREEN_RUPEE_5, + ZF_UNDERWATER_GREEN_RUPEE_6, + ZF_UNDERWATER_GREEN_RUPEE_7, + ZF_UNDERWATER_GREEN_RUPEE_8, + ZF_UNDERWATER_GREEN_RUPEE_9, + ZF_UNDERWATER_GREEN_RUPEE_10, + ZF_UNDERWATER_GREEN_RUPEE_11, + ZF_UNDERWATER_GREEN_RUPEE_12, + ZF_UNDERWATER_GREEN_RUPEE_13, + ZF_UNDERWATER_GREEN_RUPEE_14, + ZF_UNDERWATER_GREEN_RUPEE_15, + ZF_UNDERWATER_GREEN_RUPEE_16, + ZF_UNDERWATER_GREEN_RUPEE_17, + ZF_UNDERWATER_GREEN_RUPEE_18, + // LAKE_HYLIA LH_UNDERWATER_ITEM, LH_CHILD_FISHING, @@ -587,6 +666,12 @@ typedef enum { LH_DEKU_SCRUB_GROTTO_LEFT, LH_DEKU_SCRUB_GROTTO_CENTER, LH_DEKU_SCRUB_GROTTO_RIGHT, + LH_UNDER_WATER_GREEN_RUPEE_1, + LH_UNDER_WATER_GREEN_RUPEE_2, + LH_UNDER_WATER_GREEN_RUPEE_3, + LH_LAB_DIVE_RED_RUPEE_1, + LH_LAB_DIVE_RED_RUPEE_2, + LH_LAB_DIVE_RED_RUPEE_3, LH_GS_BEAN_PATCH, LH_GS_LAB_WALL, LH_GS_SMALL_ISLAND, @@ -604,6 +689,14 @@ typedef enum { GV_GS_BEAN_PATCH, GV_GS_BEHIND_TENT, GV_GS_PILLAR, + GV_OCTOROCK_GROTTO_GREEN_RUPEE_1, + GV_OCTOROCK_GROTTO_GREEN_RUPEE_2, + GV_OCTOROCK_GROTTO_GREEN_RUPEE_3, + GV_OCTOROCK_GROTTO_GREEN_RUPEE_4, + GV_OCTOROCK_GROTTO_BLUE_RUPEE_1, + GV_OCTOROCK_GROTTO_BLUE_RUPEE_2, + GV_OCTOROCK_GROTTO_BLUE_RUPEE_3, + GV_OCTOROCK_GROTTO_RED_RUPEE, // GERUDO'S_FORTRESS GF_NORTH_F1_CARPENTER, GF_NORTH_F2_CARPENTER, @@ -718,6 +811,9 @@ typedef enum { JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, + JABU_JABUS_BELLY_MQ_NEAR_COW_BOTTOM_GREEN_RUPEE, + JABU_JABUS_BELLY_MQ_NEAR_COW_MIDDLE_GREEN_RUPEE, + JABU_JABUS_BELLY_MQ_NEAR_COW_TOP_GREEN_RUPEE, // JABU_JABU'S_BELLY_SHARED JABU_JABUS_BELLY_BARINADE_HEART, // BOTTOM_OF_THE_WELL_VANILLA @@ -738,6 +834,11 @@ typedef enum { BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_1, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_2, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_3, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_4, + BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_5, // BOTTOM_OF_THE_WELL_MQ BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, @@ -963,6 +1064,10 @@ typedef enum { ICE_CAVERN_MAP_CHEST, ICE_CAVERN_COMPASS_CHEST, ICE_CAVERN_FREESTANDING_POH, + ICE_CAVERN_RED_ICE_BLUE_RUPEE, + ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_1, + ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_2, + ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_3, ICE_CAVERN_IRON_BOOTS_CHEST, ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, ICE_CAVERN_GS_HEART_PIECE_ROOM, diff --git a/source/location_access/locacc_bottom_of_the_well.cpp b/source/location_access/locacc_bottom_of_the_well.cpp index 6b7585cb7..12ada15b2 100644 --- a/source/location_access/locacc_bottom_of_the_well.cpp +++ b/source/location_access/locacc_bottom_of_the_well.cpp @@ -83,6 +83,16 @@ void AreaTable_Init_BottomOfTheWell() { LocationAccess(BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, { [] { return (LogicLensBotw || CanUse(LENS_OF_TRUTH)) && HasExplosives; } }), LocationAccess(BOTTOM_OF_THE_WELL_FREESTANDING_KEY, { [] { return Sticks || CanUse(DINS_FIRE); } }), + LocationAccess(BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_1, + { [] { return LogicLensBotw || CanUse(LENS_OF_TRUTH); } }), + LocationAccess(BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_2, + { [] { return LogicLensBotw || CanUse(LENS_OF_TRUTH); } }), + LocationAccess(BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_3, + { [] { return LogicLensBotw || CanUse(LENS_OF_TRUTH); } }), + LocationAccess(BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_4, + { [] { return LogicLensBotw || CanUse(LENS_OF_TRUTH); } }), + LocationAccess(BOTTOM_OF_THE_WELL_CENTER_ROOM_PIT_FALL_BLUE_RUPEE_5, + { [] { return LogicLensBotw || CanUse(LENS_OF_TRUTH); } }), LocationAccess(BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, { [] { return SoulDeadHand && CanDefeatEnemies(8, 0, 4) && (CanDeadHandGrab(8, 0, 4) || (CanUse(LENS_OF_TRUTH) && HasExplosives)) && diff --git a/source/location_access/locacc_death_mountain.cpp b/source/location_access/locacc_death_mountain.cpp index 8d8bf8bd3..f687c51e1 100644 --- a/source/location_access/locacc_death_mountain.cpp +++ b/source/location_access/locacc_death_mountain.cpp @@ -32,6 +32,11 @@ void AreaTable_Init_DeathMountain() { (IsAdult && CanPlantBean(DEATH_MOUNTAIN_TRAIL) && (HasExplosives || GoronBracelet)); } }), + LocationAccess(DMT_ROCK_BLUE_RUPEE, { [] { return IsChild && CanBlastOrSmash; } }), + LocationAccess(DMT_ROCK_RED_RUPEE, { [] { + return IsChild && (Here(DEATH_MOUNTAIN_TRAIL, [] { return CanBlastOrSmash; }) || + Here(DEATH_MOUNTAIN_SUMMIT, [] { return CanBlastOrSmash; })); + } }), }, { // Exits @@ -132,6 +137,34 @@ void AreaTable_Init_DeathMountain() { CanDoGlitch(GlitchType::ActionSwap, GlitchDifficulty::ADVANCED))) && EponasSong; } }), + LocationAccess(DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_1, + { + [] { return true; }, + }), + LocationAccess(DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_2, + { + [] { return true; }, + }), + LocationAccess(DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_3, + { + [] { return true; }, + }), + LocationAccess(DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_4, + { + [] { return true; }, + }), + LocationAccess(DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_5, + { + [] { return true; }, + }), + LocationAccess(DMT_COW_GROTTO_RUPEE_CIRCLE_GREEN_RUPEE_6, + { + [] { return true; }, + }), + LocationAccess(DMT_COW_GROTTO_RUPEE_CIRCLE_RED_RUPEE, + { + [] { return true; }, + }), }, { // Exits @@ -491,40 +524,98 @@ void AreaTable_Init_DeathMountain() { Entrance(DMC_CENTRAL_LOCAL, { [] { return CanSurviveHeatFor(48); } }), }); - areaTable[DMC_CENTRAL_LOCAL] = - Area("DMC Central Local", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, - { - // Events - EventAccess(&BeanPlantFairy, { [] { - return BeanPlantFairy || (CanPlantBean(DMC_CENTRAL_LOCAL) && CanPlay(SongOfStorms)); - } }), - }, - {}, - { - // Exits - Entrance(DMC_CENTRAL_NEARBY, { [] { return true; } }), - Entrance(DMC_LOWER_NEARBY, { [] { - return (IsAdult && CanPlantBean(DMC_CENTRAL_LOCAL)) || - CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT); - }, - /*Glitched*/ - [] { - return IsChild && CanSurviveHeatFor(-1, 24) && HasBombchus && - CanDoGlitch(GlitchType::BombHover, GlitchDifficulty::NOVICE); - } }), - Entrance(DMC_UPPER_NEARBY, { [] { return IsAdult && CanPlantBean(DMC_CENTRAL_LOCAL); } }), - Entrance(FIRE_TEMPLE_ENTRYWAY, { [] { - return (IsChild && CanSurviveHeatFor(-1, 24) && - ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF)) || - (IsAdult && CanSurviveHeatFor(24)); - }, - /*Glitched*/ - [] { - return CanDoGlitch(GlitchType::ASlide, - GlitchDifficulty::INTERMEDIATE) && - CanSurviveHeatFor(48); - } }), - }); + areaTable[DMC_CENTRAL_LOCAL] = Area( + "DMC Central Local", "Death Mountain Crater", DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&BeanPlantFairy, { [] { + return BeanPlantFairy || (CanPlantBean(DMC_CENTRAL_LOCAL) && CanPlay(SongOfStorms)); + } }), + }, + { + LocationAccess(DMC_LOWER_RED_RUPEE_1, { [] { return IsChild && CanSurviveHeatFor(8, 24); } }), + LocationAccess(DMC_LOWER_RED_RUPEE_2, { [] { return IsChild && CanSurviveHeatFor(8, 24); } }), + LocationAccess(DMC_LOWER_BLUE_RUPEE_1, { [] { return IsChild && CanSurviveHeatFor(8, 24); } }), + LocationAccess(DMC_LOWER_BLUE_RUPEE_2, { [] { return IsChild && CanSurviveHeatFor(8, 24); } }), + LocationAccess(DMC_LOWER_BLUE_RUPEE_3, { [] { return IsChild && CanSurviveHeatFor(8, 24); } }), + LocationAccess(DMC_LOWER_BLUE_RUPEE_4, { [] { return IsChild && CanSurviveHeatFor(8, 24); } }), + LocationAccess(DMC_LOWER_BLUE_RUPEE_5, { [] { return IsChild && CanSurviveHeatFor(8, 24); } }), + LocationAccess(DMC_LOWER_BLUE_RUPEE_6, { [] { return IsChild && CanSurviveHeatFor(8, 24); } }), + LocationAccess(DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_1, { [] { + return IsAdult && CanSurviveHeatFor(24, -1) && + (DistantScarecrow || (LogicDMCPlatformJump && + Here(DMC_UPPER_LOCAL, { [] { + return IsAdult && (EffectiveHealth > 2 || Fairy); + } }))); + } }), + LocationAccess(DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_2, { [] { + return IsAdult && CanSurviveHeatFor(24, -1) && + (DistantScarecrow || (LogicDMCPlatformJump && + Here(DMC_UPPER_LOCAL, { [] { + return IsAdult && (EffectiveHealth > 2 || Fairy); + } }))); + } }), + LocationAccess(DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_3, { [] { + return IsAdult && CanSurviveHeatFor(24, -1) && + (DistantScarecrow || (LogicDMCPlatformJump && + Here(DMC_UPPER_LOCAL, { [] { + return IsAdult && (EffectiveHealth > 2 || Fairy); + } }))); + } }), + LocationAccess(DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_4, { [] { + return IsAdult && CanSurviveHeatFor(24, -1) && + (DistantScarecrow || (LogicDMCPlatformJump && + Here(DMC_UPPER_LOCAL, { [] { + return IsAdult && (EffectiveHealth > 2 || Fairy); + } }))); + } }), + LocationAccess(DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_5, { [] { + return IsAdult && CanSurviveHeatFor(24, -1) && + (DistantScarecrow || (LogicDMCPlatformJump && + Here(DMC_UPPER_LOCAL, { [] { + return IsAdult && (EffectiveHealth > 2 || Fairy); + } }))); + } }), + LocationAccess(DMC_SCARE_CROW_RUPEE_CIRCLE_GREEN_RUPEE_6, { [] { + return IsAdult && CanSurviveHeatFor(24, -1) && + (DistantScarecrow || (LogicDMCPlatformJump && + Here(DMC_UPPER_LOCAL, { [] { + return IsAdult && (EffectiveHealth > 2 || Fairy); + } }))); + } }), + LocationAccess(DMC_SCARE_CROW_RUPEE_CIRCLE_RED_RUPEE, { [] { + return IsAdult && CanSurviveHeatFor(24, -1) && + (DistantScarecrow || (LogicDMCPlatformJump && + Here(DMC_UPPER_LOCAL, { [] { + return IsAdult && (EffectiveHealth > 2 || Fairy); + } }))); + } }), + }, + { + // Exits + Entrance(DMC_CENTRAL_NEARBY, { [] { return true; } }), + Entrance(DMC_LOWER_NEARBY, { [] { + return (IsAdult && CanPlantBean(DMC_CENTRAL_LOCAL)) || + CanUse(HOVER_BOOTS) || CanUse(HOOKSHOT); + }, + /*Glitched*/ + [] { + return IsChild && CanSurviveHeatFor(-1, 24) && HasBombchus && + CanDoGlitch(GlitchType::BombHover, GlitchDifficulty::NOVICE); + } }), + Entrance(DMC_UPPER_NEARBY, { [] { return IsAdult && CanPlantBean(DMC_CENTRAL_LOCAL); } }), + Entrance(FIRE_TEMPLE_ENTRYWAY, { [] { + return (IsChild && CanSurviveHeatFor(-1, 24) && + ShuffleDungeonEntrances.IsNot(SHUFFLEDUNGEONS_OFF)) || + (IsAdult && CanSurviveHeatFor(24)); + }, + /*Glitched*/ + [] { + return CanDoGlitch(GlitchType::ASlide, + GlitchDifficulty::INTERMEDIATE) && + CanSurviveHeatFor(48); + } }), + }); areaTable[DMC_GREAT_FAIRY_FOUNTAIN] = Area("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", NONE, NO_DAY_NIGHT_CYCLE, {}, @@ -571,4 +662,4 @@ void AreaTable_Init_DeathMountain() { // Exits Entrance(DMC_LOWER_LOCAL, { [] { return true; } }), }); -} +} \ No newline at end of file diff --git a/source/location_access/locacc_gerudo_valley.cpp b/source/location_access/locacc_gerudo_valley.cpp index aef87ccaa..ea36399af 100644 --- a/source/location_access/locacc_gerudo_valley.cpp +++ b/source/location_access/locacc_gerudo_valley.cpp @@ -158,7 +158,18 @@ void AreaTable_Init_GerudoValley() { Entrance(GV_FORTRESS_SIDE, { [] { return true; } }), }); - areaTable[GV_OCTOROK_GROTTO] = Area("GV Octorok Grotto", "GV Octorok Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, {}, + areaTable[GV_OCTOROK_GROTTO] = Area("GV Octorok Grotto", "GV Octorok Grotto", NONE, NO_DAY_NIGHT_CYCLE, {}, + { + LocationAccess(GV_OCTOROCK_GROTTO_BLUE_RUPEE_1, { [] { return true; } }), + LocationAccess(GV_OCTOROCK_GROTTO_BLUE_RUPEE_2, { [] { return true; } }), + LocationAccess(GV_OCTOROCK_GROTTO_BLUE_RUPEE_3, { [] { return true; } }), + LocationAccess(GV_OCTOROCK_GROTTO_GREEN_RUPEE_1, { [] { return true; } }), + LocationAccess(GV_OCTOROCK_GROTTO_GREEN_RUPEE_2, { [] { return true; } }), + LocationAccess(GV_OCTOROCK_GROTTO_GREEN_RUPEE_3, { [] { return true; } }), + LocationAccess(GV_OCTOROCK_GROTTO_GREEN_RUPEE_4, { [] { return true; } }), + LocationAccess(GV_OCTOROCK_GROTTO_RED_RUPEE, { [] { return true; } }), + + }, { // Exits Entrance(GV_GROTTO_LEDGE, { [] { return true; } }), diff --git a/source/location_access/locacc_hyrule_field.cpp b/source/location_access/locacc_hyrule_field.cpp index 2706195d8..72905e0df 100644 --- a/source/location_access/locacc_hyrule_field.cpp +++ b/source/location_access/locacc_hyrule_field.cpp @@ -253,6 +253,14 @@ void AreaTable_Init_HyruleField() { { // Locations LocationAccess(LH_UNDERWATER_ITEM, { [] { return IsChild && CanDive; } }), + LocationAccess(LH_UNDER_WATER_GREEN_RUPEE_1, { [] { return IsChild; } }), + LocationAccess(LH_UNDER_WATER_GREEN_RUPEE_2, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(8))); + } }), + LocationAccess(LH_UNDER_WATER_GREEN_RUPEE_3, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(8))); + } }), + LocationAccess(LH_SUN, { [] { return IsAdult && WaterTempleClear && CanUse(BOW); } }), LocationAccess(LH_FREESTANDING_POH, { [] { return IsAdult && (CanUse(SCARECROW) || CanPlantBean(LAKE_HYLIA)); }, @@ -351,6 +359,15 @@ void AreaTable_Init_HyruleField() { (HasBottle || (IsAdult && (HasBoots || ClaimCheck)) || (IsChild && WeirdEgg)))) && CanUse(NAYRUS_LOVE) && CanDoGlitch(GlitchType::CutsceneDive, GlitchDifficulty::NOVICE)); } }), + LocationAccess(LH_LAB_DIVE_RED_RUPEE_1, { [] { + return ProgressiveScale >= 2 || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(8)); + } }), + LocationAccess(LH_LAB_DIVE_RED_RUPEE_2, { [] { + return ProgressiveScale >= 2 || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(8)); + } }), + LocationAccess(LH_LAB_DIVE_RED_RUPEE_3, { [] { + return ProgressiveScale >= 2 || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(8)); + } }), LocationAccess(LH_TRADE_FROG, { [] { return IsAdult && EyeballFrog; } }), }, { diff --git a/source/location_access/locacc_ice_cavern.cpp b/source/location_access/locacc_ice_cavern.cpp index d02050a1b..f9cf559dd 100644 --- a/source/location_access/locacc_ice_cavern.cpp +++ b/source/location_access/locacc_ice_cavern.cpp @@ -25,7 +25,10 @@ void AreaTable_Init_IceCavern() { ---------------------------*/ if (Dungeon::IceCavern.IsVanilla()) { areaTable[ICE_CAVERN_BEGINNING] = - Area("Ice Cavern Beginning", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, + Area("Ice Cavern Beginning", "Ice Cavern", ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, + { + LocationAccess(ICE_CAVERN_RED_ICE_BLUE_RUPEE, { [] { return BlueFire; } }), + }, { // Exits Entrance(ICE_CAVERN_ENTRYWAY, { [] { return true; } }), @@ -63,6 +66,12 @@ void AreaTable_Init_IceCavern() { LocationAccess(ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, { [] { return HookshotOrBoomerang; } }), LocationAccess(ICE_CAVERN_GS_HEART_PIECE_ROOM, { [] { return BlueFire && HookshotOrBoomerang; } }), LocationAccess(ICE_CAVERN_GS_PUSH_BLOCK_ROOM, { [] { return BlueFire && HookshotOrBoomerang; } }), + LocationAccess(ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_1, + { [] { return CanPlay(SongOfTime) || CanUse(BOOMERANG); } }), + LocationAccess(ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_2, + { [] { return CanPlay(SongOfTime) || CanUse(BOOMERANG); } }), + LocationAccess(ICE_CAVERN_PUSH_BLOCK_ROOM_RED_RUPEE_3, + { [] { return CanPlay(SongOfTime) || CanUse(BOOMERANG); } }), }, {}); } diff --git a/source/location_access/locacc_jabujabus_belly.cpp b/source/location_access/locacc_jabujabus_belly.cpp index 408934f99..e09ba4c7e 100644 --- a/source/location_access/locacc_jabujabus_belly.cpp +++ b/source/location_access/locacc_jabujabus_belly.cpp @@ -409,6 +409,18 @@ void AreaTable_Init_JabuJabusBelly() { ChildCanAccess(JABU_JABUS_BELLY_MQ_BOSS_AREA); } }), LocationAccess(JABU_JABUS_BELLY_MQ_COMPASS_CHEST, { [] { return true; } }), + LocationAccess(JABU_JABUS_BELLY_MQ_NEAR_COW_TOP_GREEN_RUPEE, + { [] { return IsChild || SilverScale || LogicJabuScrubJumpDive; } }), + LocationAccess(JABU_JABUS_BELLY_MQ_NEAR_COW_MIDDLE_GREEN_RUPEE, { [] { + return SilverScale || + (CanUse(BOOMERANG) && (IsChild || SilverScale || LogicJabuScrubJumpDive)) || + CanUse(IRON_BOOTS); + } }), + LocationAccess(JABU_JABUS_BELLY_MQ_NEAR_COW_BOTTOM_GREEN_RUPEE, { [] { + return GoldScale || + (CanUse(BOOMERANG) && (IsChild || SilverScale || LogicJabuScrubJumpDive)) || + CanUse(IRON_BOOTS); + } }), LocationAccess(JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, { [] { return true; } }), LocationAccess(JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, { [] { return true; } }), LocationAccess(JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, { [] { return true; } }), diff --git a/source/location_access/locacc_kakariko.cpp b/source/location_access/locacc_kakariko.cpp index f70cbf471..66a9a4c23 100644 --- a/source/location_access/locacc_kakariko.cpp +++ b/source/location_access/locacc_kakariko.cpp @@ -492,6 +492,14 @@ void AreaTable_Init_Kakariko() { // Locations LocationAccess(GRAVEYARD_HOOKSHOT_CHEST, { [] { return true; } }), LocationAccess(GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, { [] { return IsAdult || LogicChildDampeRacePoH; } }), + LocationAccess(GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_1, { [] { return true; } }), + LocationAccess(GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_2, { [] { return true; } }), + LocationAccess(GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_3, { [] { return true; } }), + LocationAccess(GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_4, { [] { return true; } }), + LocationAccess(GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_5, { [] { return true; } }), + LocationAccess(GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_6, { [] { return true; } }), + LocationAccess(GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_7, { [] { return true; } }), + LocationAccess(GRAVEYARD_DAMPE_RACE_GREEN_RUPEE_8, { [] { return true; } }), }, { // Exits diff --git a/source/location_access/locacc_lost_woods.cpp b/source/location_access/locacc_lost_woods.cpp index f20cfb132..cbb6ee57d 100644 --- a/source/location_access/locacc_lost_woods.cpp +++ b/source/location_access/locacc_lost_woods.cpp @@ -27,6 +27,28 @@ void AreaTable_Init_LostWoods() { { // Locations LocationAccess(KF_KOKIRI_SWORD_CHEST, { [] { return IsChild; } }), + LocationAccess(KF_END_OF_BRIDGE_BLUE_RUPEE, { [] { return IsChild; } }), + LocationAccess(KF_BEHIND_MIDOS_HOUSE_BLUE_RUPEE, { [] { return IsChild; } }), + LocationAccess(KF_BOULDER_MAZE_BLUE_RUPEE_1, { [] { return IsChild; } }), + LocationAccess(KF_BOULDER_MAZE_BLUE_RUPEE_2, { [] { return IsChild; } }), + LocationAccess(KF_NEAR_RAMP_GREEN_RUPEE_1, { [] { return IsChild; } }), + LocationAccess(KF_NEAR_RAMP_GREEN_RUPEE_2, { [] { return IsChild; } }), + LocationAccess(KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_1, { [] { return IsChild; } }), + LocationAccess(KF_NEAR_MIDOS_HOUSE_GREEN_RUPEE_2, { [] { return IsChild; } }), + LocationAccess(KF_RUPEE_CIRCLE_GREEN_RUPEE_1, + { [] { return IsAdult && (CanPlantBean(KOKIRI_FOREST) || CanUse(HOVER_BOOTS)); } }), + LocationAccess(KF_RUPEE_CIRCLE_GREEN_RUPEE_2, + { [] { return IsAdult && (CanPlantBean(KOKIRI_FOREST) || CanUse(HOVER_BOOTS)); } }), + LocationAccess(KF_RUPEE_CIRCLE_GREEN_RUPEE_3, + { [] { return IsAdult && (CanPlantBean(KOKIRI_FOREST) || CanUse(HOVER_BOOTS)); } }), + LocationAccess(KF_RUPEE_CIRCLE_GREEN_RUPEE_4, + { [] { return IsAdult && (CanPlantBean(KOKIRI_FOREST) || CanUse(HOVER_BOOTS)); } }), + LocationAccess(KF_RUPEE_CIRCLE_GREEN_RUPEE_5, + { [] { return IsAdult && (CanPlantBean(KOKIRI_FOREST) || CanUse(HOVER_BOOTS)); } }), + LocationAccess(KF_RUPEE_CIRCLE_GREEN_RUPEE_6, + { [] { return IsAdult && (CanPlantBean(KOKIRI_FOREST) || CanUse(HOVER_BOOTS)); } }), + LocationAccess(KF_RUPEE_CIRCLE_RED_RUPEE, + { [] { return IsAdult && (CanPlantBean(KOKIRI_FOREST) || CanUse(HOVER_BOOTS)); } }), LocationAccess(KF_GOSSIP_STONE, { [] { return true; } }), }, { @@ -214,33 +236,63 @@ void AreaTable_Init_LostWoods() { CanDoGlitch(GlitchType::QPA, GlitchDifficulty::ADVANCED); } }), }, - { - // Locations - LocationAccess(LW_SKULL_KID, { [] { return IsChild && CanPlay(SariasSong); }, - /*Glitched*/ - [] { - return IsChild && (Fish || Bugs) && SariasSong && CanShield && - (CanDoGlitch(GlitchType::QPA, GlitchDifficulty::ADVANCED) || - (HasBombchus && CanDoGlitch(GlitchType::ActionSwap, - GlitchDifficulty::ADVANCED))); - } }), - LocationAccess(LW_TRADE_COJIRO, { [] { return IsAdult && Cojiro; } }), - LocationAccess(LW_TRADE_ODD_POULTICE, { [] { return IsAdult && OddPoultice && Cojiro; } }), - LocationAccess(LW_OCARINA_MEMORY_GAME, - { [] { return IsChild && Ocarina && (OcarinaButtonsCount >= 5); }, - /*Glitched*/ - [] { - return IsChild && - (CanDoGlitch(GlitchType::OutdoorBombOI, GlitchDifficulty::INTERMEDIATE) || - ((Fish || Bugs) && CanShield && - CanDoGlitch(GlitchType::QPA, GlitchDifficulty::ADVANCED)) || - ((Bugs || Fish) && HasBombchus && CanShield && - CanDoGlitch(GlitchType::ActionSwap, GlitchDifficulty::ADVANCED))); - } }), - LocationAccess(LW_TARGET_IN_WOODS, { [] { return IsChild && CanUse(SLINGSHOT); } }), - LocationAccess(LW_DEKU_SCRUB_NEAR_BRIDGE, { [] { return IsChild && CanStunDeku; } }), - LocationAccess(LW_GOSSIP_STONE, { [] { return true; } }), - }, + { // Locations + LocationAccess(LW_SKULL_KID, { [] { return IsChild && CanPlay(SariasSong); }, + /*Glitched*/ + [] { + return IsChild && (Fish || Bugs) && SariasSong && CanShield && + (CanDoGlitch(GlitchType::QPA, GlitchDifficulty::ADVANCED) || + (HasBombchus && + CanDoGlitch(GlitchType::ActionSwap, GlitchDifficulty::ADVANCED))); + } }), + LocationAccess(LW_TRADE_COJIRO, { [] { return IsAdult && Cojiro; } }), + LocationAccess(LW_TRADE_ODD_POULTICE, { [] { return IsAdult && OddPoultice && Cojiro; } }), + LocationAccess(LW_OCARINA_MEMORY_GAME, + { [] { return IsChild && Ocarina && (OcarinaButtonsCount >= 5); }, + /*Glitched*/ + [] { + return IsChild && + (CanDoGlitch(GlitchType::OutdoorBombOI, GlitchDifficulty::INTERMEDIATE) || + ((Fish || Bugs) && CanShield && + CanDoGlitch(GlitchType::QPA, GlitchDifficulty::ADVANCED)) || + ((Bugs || Fish) && HasBombchus && CanShield && + CanDoGlitch(GlitchType::ActionSwap, GlitchDifficulty::ADVANCED))); + } }), + LocationAccess(LW_TARGET_IN_WOODS, { [] { return IsChild && CanUse(SLINGSHOT); } }), + LocationAccess(LW_DEKU_SCRUB_NEAR_BRIDGE, { [] { return IsChild && CanStunDeku; } }), + LocationAccess(LW_GOSSIP_STONE, { [] { return true; } }), + LocationAccess(LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_1, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4)) || + CanUse(BOOMERANG)); + } }), + LocationAccess(LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_2, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4)) || + CanUse(BOOMERANG)); + } }), + LocationAccess(LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_3, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4)) || + CanUse(BOOMERANG)); + } }), + LocationAccess(LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_4, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4)) || + CanUse(BOOMERANG)); + } }), + LocationAccess(LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_5, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4)) || + CanUse(BOOMERANG)); + } }), + LocationAccess(LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_6, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4)) || + CanUse(BOOMERANG)); + } }), + LocationAccess(LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_7, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4)) || + CanUse(BOOMERANG)); + } }), + LocationAccess(LW_IN_WATER_NEAR_ZR_SHORTCUT_GREEN_RUPEE_8, { [] { + return IsChild && (CanDive || (CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4)) || + CanUse(BOOMERANG)); + } }) }, { // Exits Entrance(LW_FOREST_EXIT, { [] { return true; } }), @@ -312,6 +364,14 @@ void AreaTable_Init_LostWoods() { // Locations LocationAccess(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, { [] { return IsChild && CanStunDeku; } }), LocationAccess(LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, { [] { return IsChild && CanStunDeku; } }), + LocationAccess(LW_IN_BOULDER_BLUE_RUPEE, { [] { return CanBlastOrSmash; }, + [] { + return Here(LW_BEYOND_MIDO, [] { + return IsChild && CanUse(STICKS) && + CanDoGlitch(GlitchType::QPA, + GlitchDifficulty::ADVANCED); + }); + } }), }, { // Exits diff --git a/source/location_access/locacc_zoras_domain.cpp b/source/location_access/locacc_zoras_domain.cpp index 1573b7416..5b71ebb32 100644 --- a/source/location_access/locacc_zoras_domain.cpp +++ b/source/location_access/locacc_zoras_domain.cpp @@ -123,6 +123,22 @@ void AreaTable_Init_ZorasDomain() { { [] { return IsChild || CanUse(HOVER_BOOTS) || (IsAdult && LogicZoraRiverLower); } }), LocationAccess(ZR_NEAR_DOMAIN_FREESTANDING_POH, { [] { return IsChild || CanUse(HOVER_BOOTS) || (IsAdult && LogicZoraRiverUpper); } }), + LocationAccess(ZR_WATERFALL_RED_RUPEE_1, { [] { + return IsAdult && ((CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4, 12)) || + LogicZoraRiverRupeesJump); + } }), + LocationAccess(ZR_WATERFALL_RED_RUPEE_2, { [] { + return IsAdult && ((CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4, 12)) || + LogicZoraRiverRupeesJump); + } }), + LocationAccess(ZR_WATERFALL_RED_RUPEE_3, { [] { + return IsAdult && ((CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4, 12)) || + LogicZoraRiverRupeesJump); + } }), + LocationAccess(ZR_WATERFALL_RED_RUPEE_4, { [] { + return IsAdult && ((CanUse(IRON_BOOTS) && CanSurviveUnderwaterFor(4, 12)) || + LogicZoraRiverRupeesJump); + } }), LocationAccess(ZR_NEAR_GROTTOS_GOSSIP_STONE, { [] { return true; } }), LocationAccess(ZR_NEAR_DOMAIN_GOSSIP_STONE, { [] { return true; } }), }, @@ -355,6 +371,43 @@ void AreaTable_Init_ZorasDomain() { LocationAccess(ZF_ICEBERG_FREESTANDING_POH, { [] { return IsAdult; } }), LocationAccess(ZF_BOTTOM_FREESTANDING_POH, { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_1, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_2, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_3, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_4, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_5, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_6, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_7, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_8, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_9, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_10, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_11, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_12, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_13, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_14, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_15, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_16, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_17, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_UNDERWATER_GREEN_RUPEE_18, + { [] { return IsAdult && IronBoots && CanSurviveUnderwaterFor(24); } }), + LocationAccess(ZF_FAIRY_GOSSIP_STONE, { [] { return true; } }), LocationAccess(ZF_JABU_GOSSIP_STONE, { [] { return true; } }), }, diff --git a/source/settings.cpp b/source/settings.cpp index fc7caffa3..e44d7bcbe 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -233,6 +233,7 @@ Option ShuffleChestMinigame = Option::U8 ("Shuffle Chest Minigame", {"Off", " Option ShuffleFrogSongRupees = Option::Bool("Shuffle Frog Rupees", {"Off", "On"}, {frogSongRupeesDesc}); Option ShuffleEnemySouls = Option::U8 ("Shuffle Enemy Souls", {"Off", "All enemies", "Bosses only"}, {enemySoulDesc}); Option ShuffleOcarinaButtons = Option::Bool("Shuffle Ocarina Buttons",{"Off", "On"}, {ocarinaButtonsDesc}); +Option ShuffleRupees = Option::Bool("Rupeesanity", {"Off","On"}, {shuffleRupeesDesc}); std::vector