This commit is contained in:
Philip Dubé 2025-08-19 02:25:22 +08:00 committed by GitHub
commit 25a7599ae7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 187 additions and 113 deletions

View file

@ -2073,6 +2073,15 @@ void StaticData::HintTable_Init_Item() {
CustomMessage("a rightward tone", /*german*/"ein rechtsseitiger Ton", /*french*/"une tonalité vers la droite")}); CustomMessage("a rightward tone", /*german*/"ein rechtsseitiger Ton", /*french*/"une tonalité vers la droite")});
// /*spanish*/un tono hacia la derecha // /*spanish*/un tono hacia la derecha
hintTextTable[RHT_MASK_KEATON] = HintText(CustomMessage("a keaton mask", /*german*/"!!!", /*french*/"le Masque du Renard"), {CustomMessage("a mask", /*german*/"!!!", /*french*/"un masque")});
hintTextTable[RHT_MASK_SKULL] = HintText(CustomMessage("a skull mask", /*german*/"!!!", /*french*/"le Masque de Mort"), {CustomMessage("a mask", /*german*/"!!!", /*french*/"un masque")});
hintTextTable[RHT_MASK_SPOOKY] = HintText(CustomMessage("a spooky mask", /*german*/"!!!", /*french*/"le Masque d'Effroi"), {CustomMessage("a mask", /*german*/"!!!", /*french*/"un masque")});
hintTextTable[RHT_MASK_BUNNY] = HintText(CustomMessage("a bunny hood", /*german*/"!!!", /*french*/"le Masque du Lapin"), {CustomMessage("a mask", /*german*/"!!!", /*french*/"un masque")});
hintTextTable[RHT_MASK_GORON] = HintText(CustomMessage("a goron mask", /*german*/"!!!", /*french*/"le Masque de Goron"), {CustomMessage("a mask", /*german*/"!!!", /*french*/"un masque")});
hintTextTable[RHT_MASK_ZORA] = HintText(CustomMessage("a zora mask", /*german*/"!!!", /*french*/"le Masque de Zora"), {CustomMessage("a mask", /*german*/"!!!", /*french*/"un masque")});
hintTextTable[RHT_MASK_GERUDO] = HintText(CustomMessage("a gerudo mask", /*german*/"!!!", /*french*/"le Masque de Gerudo"), {CustomMessage("a mask", /*german*/"!!!", /*french*/"un masque")});
hintTextTable[RHT_MASK_TRUTH] = HintText(CustomMessage("a mask of truth", /*german*/"!!!", /*french*/"le Masque de Vérité"), {CustomMessage("a mask", /*german*/"!!!", /*french*/"un masque")});
hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fishing pole", /*german*/"eine Angelrute", /*french*/"une canne à pêche"), hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fishing pole", /*german*/"eine Angelrute", /*french*/"une canne à pêche"),
// /*spanish*/caña de pescar // /*spanish*/caña de pescar
{ {

View file

@ -278,7 +278,7 @@ std::vector<std::pair<RandomizerCheck, std::function<bool()>>> conditionalAlways
std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH, std::make_pair(RC_DEKU_THEATER_MASK_OF_TRUTH,
[]() { []() {
auto ctx = Rando::Context::GetInstance(); auto ctx = Rando::Context::GetInstance();
return !ctx->GetOption(RSK_MASK_SHOP_HINT) && !ctx->GetOption(RSK_COMPLETE_MASK_QUEST); return !ctx->GetOption(RSK_MASK_SHOP_HINT) && !ctx->GetOption(RSK_MASK_QUEST);
}), }),
std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME, std::make_pair(RC_SONG_FROM_OCARINA_OF_TIME,
[]() { []() {

View file

@ -587,6 +587,17 @@ void GenerateItemPool() {
AddItemToMainPool(RG_SKELETON_KEY); AddItemToMainPool(RG_SKELETON_KEY);
} }
if (ctx->GetOption(RSK_MASK_QUEST).Is(RO_MASK_QUEST_SHUFFLE)) {
AddItemToMainPool(RG_MASK_KEATON);
AddItemToMainPool(RG_MASK_SKULL);
AddItemToMainPool(RG_MASK_SPOOKY);
AddItemToMainPool(RG_MASK_BUNNY);
AddItemToMainPool(RG_MASK_GORON);
AddItemToMainPool(RG_MASK_ZORA);
AddItemToMainPool(RG_MASK_GERUDO);
AddItemToMainPool(RG_MASK_TRUTH);
}
if (ctx->GetOption(RSK_SHUFFLE_SWIM)) { if (ctx->GetOption(RSK_SHUFFLE_SWIM)) {
AddItemToMainPool(RG_PROGRESSIVE_SCALE); AddItemToMainPool(RG_PROGRESSIVE_SCALE);
} }

View file

@ -24,6 +24,7 @@ extern "C" {
#include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" #include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h"
#include "src/overlays/actors/ovl_Bg_Jya_Bigmirror/z_bg_jya_bigmirror.h" #include "src/overlays/actors/ovl_Bg_Jya_Bigmirror/z_bg_jya_bigmirror.h"
#include "src/overlays/actors/ovl_En_Si/z_en_si.h" #include "src/overlays/actors/ovl_En_Si/z_en_si.h"
#include "src/overlays/actors/ovl_En_Ossan/z_en_ossan.h"
#include "src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.h" #include "src/overlays/actors/ovl_En_Shopnuts/z_en_shopnuts.h"
#include "src/overlays/actors/ovl_En_Dns/z_en_dns.h" #include "src/overlays/actors/ovl_En_Dns/z_en_dns.h"
#include "src/overlays/actors/ovl_En_Gb/z_en_gb.h" #include "src/overlays/actors/ovl_En_Gb/z_en_gb.h"
@ -315,7 +316,7 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
iceTrapScale = 0.0f; iceTrapScale = 0.0f;
randomizerQueuedCheck = rc; randomizerQueuedCheck = rc;
randomizerQueuedItemEntry = getItemEntry; randomizerQueuedItemEntry = getItemEntry;
SPDLOG_INFO("Queueing Item mod {} item {} from RC {}", getItemEntry.modIndex, getItemEntry.itemId, SPDLOG_INFO("Queuing Item mod {} item {} from RC {}", getItemEntry.modIndex, getItemEntry.itemId,
static_cast<uint32_t>(rc)); static_cast<uint32_t>(rc));
if ( if (
// Skipping ItemGet animation incompatible with checks that require closing a text box to finish // Skipping ItemGet animation incompatible with checks that require closing a text box to finish
@ -2021,6 +2022,11 @@ void RandomizerOnActorInitHandler(void* actorRef) {
} }
} }
if (actor->id == ACTOR_EN_OSSAN && actor->params == OSSAN_TYPE_MASK &&
RAND_GET_OPTION(RSK_MASK_QUEST) == RO_MASK_QUEST_SHUFFLE) {
Actor_Kill(actor);
}
if (actor->id == ACTOR_BG_TREEMOUTH && LINK_IS_ADULT && if (actor->id == ACTOR_BG_TREEMOUTH && LINK_IS_ADULT &&
RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF && RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF &&
(RAND_GET_OPTION(RSK_FOREST) == RO_CLOSED_FOREST_OFF || (RAND_GET_OPTION(RSK_FOREST) == RO_CLOSED_FOREST_OFF ||

View file

@ -349,6 +349,15 @@ void Rando::StaticData::InitItemTable() {
itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "C-Rechts-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "C-Rechts-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_OCARINA_C_RIGHT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); itemTable[RG_OCARINA_C_RIGHT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton);
itemTable[RG_MASK_KEATON] = Item(RG_MASK_KEATON, Text{ "Keaton Mask", "Masque du Renard", "!!!" }, ITEMTYPE_ITEM, RG_MASK_KEATON, true, LOGIC_NONE, RHT_MASK_KEATON, RG_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MASK_SKULL] = Item(RG_MASK_SKULL, Text{ "Skull Mask", "Masque de Mort", "!!!" }, ITEMTYPE_ITEM, RG_MASK_SKULL, true, LOGIC_NONE, RHT_MASK_SKULL, RG_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MASK_SPOOKY] = Item(RG_MASK_SPOOKY, Text{ "Spooky Mask", "Masque d'Effroi", "!!!" }, ITEMTYPE_ITEM, RG_MASK_SPOOKY, true, LOGIC_NONE, RHT_MASK_SPOOKY, RG_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MASK_BUNNY] = Item(RG_MASK_BUNNY, Text{ "Bunny Hood", "Masque du Lapin", "!!!" }, ITEMTYPE_ITEM, RG_MASK_BUNNY, true, LOGIC_NONE, RHT_MASK_BUNNY, RG_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MASK_GORON] = Item(RG_MASK_GORON, Text{ "Goron Mask", "Masque de Goron", "!!!" }, ITEMTYPE_ITEM, RG_MASK_GORON, true, LOGIC_NONE, RHT_MASK_GORON, RG_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MASK_ZORA] = Item(RG_MASK_ZORA, Text{ "Zora Mask", "Masque de Zora", "!!!" }, ITEMTYPE_ITEM, RG_MASK_ZORA, true, LOGIC_NONE, RHT_MASK_ZORA, RG_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MASK_GERUDO] = Item(RG_MASK_GERUDO, Text{ "Gerudo Mask", "Masque de Gerudo", "!!!" }, ITEMTYPE_ITEM, RG_MASK_GERUDO, true, LOGIC_NONE, RHT_MASK_GERUDO, RG_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MASK_TRUTH] = Item(RG_MASK_TRUTH, Text{ "Mask of Truth", "Masque de Vérité", "!!!" }, ITEMTYPE_ITEM, RG_MASK_TRUTH, true, LOGIC_NONE, RHT_MASK_TRUTH, RG_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_BRONZE_SCALE].SetCustomDrawFunc(Randomizer_DrawBronzeScale); itemTable[RG_BRONZE_SCALE].SetCustomDrawFunc(Randomizer_DrawBronzeScale);

View file

@ -111,8 +111,8 @@ void RegionTable_Init_LostWoods() {
areaTable[RR_DEKU_THEATER] = Region("Deku Theater", SCENE_GROTTOS, {}, { areaTable[RR_DEKU_THEATER] = Region("Deku Theater", SCENE_GROTTOS, {}, {
//Locations //Locations
LOCATION(RC_DEKU_THEATER_SKULL_MASK, logic->IsChild && logic->BorrowSkullMask), LOCATION(RC_DEKU_THEATER_SKULL_MASK, logic->CanUse(RG_MASK_SKULL)),
LOCATION(RC_DEKU_THEATER_MASK_OF_TRUTH, logic->IsChild && logic->BorrowRightMasks), LOCATION(RC_DEKU_THEATER_MASK_OF_TRUTH, logic->CanUse(RG_MASK_TRUTH)),
}, { }, {
//Exits //Exits
Entrance(RR_LW_BEYOND_MIDO, []{return true;}), Entrance(RR_LW_BEYOND_MIDO, []{return true;}),

View file

@ -142,10 +142,10 @@ void RegionTable_Init_Market() {
//If it is forced on/a setting, a copy of these events should be added to root //If it is forced on/a setting, a copy of these events should be added to root
//it also doesn't need you to open kak gate, but that might be best treated as a bug //it also doesn't need you to open kak gate, but that might be best treated as a bug
EventAccess(&logic->CanBorrowMasks, []{return logic->HasItem(RG_ZELDAS_LETTER) && logic->KakarikoVillageGateOpen;}), EventAccess(&logic->CanBorrowMasks, []{return logic->HasItem(RG_ZELDAS_LETTER) && logic->KakarikoVillageGateOpen;}),
EventAccess(&logic->BorrowSkullMask, []{return ctx->GetOption(RSK_COMPLETE_MASK_QUEST) && logic->CanBorrowMasks;}), EventAccess(&logic->BorrowSkullMask, []{return ctx->GetOption(RSK_MASK_QUEST).Is(RO_MASK_QUEST_COMPLETED) && logic->CanBorrowMasks;}),
EventAccess(&logic->BorrowSpookyMask, []{return ctx->GetOption(RSK_COMPLETE_MASK_QUEST) && logic->CanBorrowMasks;}), EventAccess(&logic->BorrowSpookyMask, []{return ctx->GetOption(RSK_MASK_QUEST).Is(RO_MASK_QUEST_COMPLETED) && logic->CanBorrowMasks;}),
EventAccess(&logic->BorrowBunnyHood, []{return ctx->GetOption(RSK_COMPLETE_MASK_QUEST) && logic->CanBorrowMasks;}), EventAccess(&logic->BorrowBunnyHood, []{return ctx->GetOption(RSK_MASK_QUEST).Is(RO_MASK_QUEST_COMPLETED) && logic->CanBorrowMasks;}),
EventAccess(&logic->BorrowRightMasks, []{return ctx->GetOption(RSK_COMPLETE_MASK_QUEST) && logic->CanBorrowMasks;}), EventAccess(&logic->BorrowRightMasks, []{return ctx->GetOption(RSK_MASK_QUEST).Is(RO_MASK_QUEST_COMPLETED) && logic->CanBorrowMasks;}),
}, { }, {
//Locations //Locations
LOCATION(RC_MASK_SHOP_HINT, true), LOCATION(RC_MASK_SHOP_HINT, true),

View file

@ -123,6 +123,31 @@ bool Logic::HasItem(RandomizerGet itemName) {
return CheckQuestItem(RandoGetToQuestItem.at(itemName)); return CheckQuestItem(RandoGetToQuestItem.at(itemName));
case RG_DOUBLE_DEFENSE: case RG_DOUBLE_DEFENSE:
return GetSaveContext()->isDoubleDefenseAcquired; return GetSaveContext()->isDoubleDefenseAcquired;
// Masks
case RG_MASK_SKULL:
switch (ctx->GetOption(RSK_MASK_QUEST).Get()) {
case RO_MASK_QUEST_VANILLA:
return BorrowSkullMask;
case RO_MASK_QUEST_COMPLETED:
return HasItem(RG_ZELDAS_LETTER);
case RO_MASK_QUEST_SHUFFLE:
return HasItem(RG_ZELDAS_LETTER) && CheckRandoInf(RAND_INF_CHILD_TRADES_HAS_MASK_SKULL);
default:
assert(false);
return false;
}
case RG_MASK_TRUTH:
switch (ctx->GetOption(RSK_MASK_QUEST).Get()) {
case RO_MASK_QUEST_VANILLA:
return BorrowRightMasks;
case RO_MASK_QUEST_COMPLETED:
return HasItem(RG_ZELDAS_LETTER);
case RO_MASK_QUEST_SHUFFLE:
return HasItem(RG_ZELDAS_LETTER) && CheckRandoInf(RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH);
default:
assert(false);
return false;
}
case RG_FISHING_POLE: case RG_FISHING_POLE:
case RG_ZELDAS_LETTER: case RG_ZELDAS_LETTER:
case RG_WEIRD_EGG: case RG_WEIRD_EGG:
@ -340,6 +365,9 @@ bool Logic::CanUse(RandomizerGet itemName) {
return IsChild; return IsChild;
case RG_MAGIC_BEAN: case RG_MAGIC_BEAN:
return IsChild; return IsChild;
case RG_MASK_SKULL:
case RG_MASK_TRUTH:
return IsChild;
// Songs // Songs
case RG_ZELDAS_LULLABY: case RG_ZELDAS_LULLABY:
@ -1470,6 +1498,14 @@ std::map<RandomizerGet, uint32_t> Logic::RandoGetToRandInf = {
{ RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN }, { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN },
{ RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT }, { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT },
{ RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT }, { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT },
{ RG_MASK_KEATON, RAND_INF_CHILD_TRADES_HAS_MASK_KEATON },
{ RG_MASK_SKULL, RAND_INF_CHILD_TRADES_HAS_MASK_SKULL },
{ RG_MASK_SPOOKY, RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY },
{ RG_MASK_BUNNY, RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY },
{ RG_MASK_GORON, RAND_INF_CHILD_TRADES_HAS_MASK_GORON },
{ RG_MASK_ZORA, RAND_INF_CHILD_TRADES_HAS_MASK_ZORA },
{ RG_MASK_GERUDO, RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO },
{ RG_MASK_TRUTH, RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH },
{ RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY }, { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY },
{ RG_GREG_RUPEE, RAND_INF_GREG_FOUND }, { RG_GREG_RUPEE, RAND_INF_GREG_FOUND },
{ RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND }, { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND },
@ -1836,6 +1872,14 @@ void Logic::ApplyItemEffect(Item& item, bool state) {
case RG_OCARINA_C_DOWN_BUTTON: case RG_OCARINA_C_DOWN_BUTTON:
case RG_OCARINA_C_LEFT_BUTTON: case RG_OCARINA_C_LEFT_BUTTON:
case RG_OCARINA_C_RIGHT_BUTTON: case RG_OCARINA_C_RIGHT_BUTTON:
case RG_MASK_KEATON:
case RG_MASK_SKULL:
case RG_MASK_SPOOKY:
case RG_MASK_BUNNY:
case RG_MASK_GORON:
case RG_MASK_ZORA:
case RG_MASK_GERUDO:
case RG_MASK_TRUTH:
case RG_GREG_RUPEE: case RG_GREG_RUPEE:
case RG_FISHING_POLE: case RG_FISHING_POLE:
case RG_GUARD_HOUSE_KEY: case RG_GUARD_HOUSE_KEY:
@ -2354,7 +2398,6 @@ void Logic::Reset(bool resetSaveContext /*= true*/) {
// Adult logic // Adult logic
FreedEpona = false; FreedEpona = false;
// BigPoe = false;
// Trade Quest Events // Trade Quest Events
WakeUpAdultTalon = false; WakeUpAdultTalon = false;

View file

@ -604,8 +604,13 @@ void Settings::CreateOptionDescriptions() {
"Start with Zelda's Letter and the item Impa would normally give you and skip the sequence up " "Start with Zelda's Letter and the item Impa would normally give you and skip the sequence up "
"until after meeting Zelda. Disables the ability to shuffle Weird Egg."; "until after meeting Zelda. Disables the ability to shuffle Weird Egg.";
mOptionDescriptions[RSK_SKIP_EPONA_RACE] = "Epona can be summoned with Epona's Song without needing to race Ingo."; mOptionDescriptions[RSK_SKIP_EPONA_RACE] = "Epona can be summoned with Epona's Song without needing to race Ingo.";
mOptionDescriptions[RSK_COMPLETE_MASK_QUEST] = mOptionDescriptions[RSK_MASK_QUEST] =
"Once the Happy Mask Shop is opened, all masks will be available to be borrowed."; "How masks are acquired.\n"
"Vanilla - Mask trade quest.\n"
"\n"
"Completed - Once the Happy Mask Shop is opened, all masks will be available to be borrowed.\n"
"\n"
"Shuffle - Happy Mask Shop never opens, masks are shuffled with rest of items.";
mOptionDescriptions[RSK_SKIP_SCARECROWS_SONG] = mOptionDescriptions[RSK_SKIP_SCARECROWS_SONG] =
"Start with the ability to summon Pierre the Scarecrow. Pulling out an Ocarina in the usual locations will " "Start with the ability to summon Pierre the Scarecrow. Pulling out an Ocarina in the usual locations will "
"automatically summon him.\n" "automatically summon him.\n"

View file

@ -423,46 +423,33 @@ std::unordered_map<std::string, SceneID> spoilerFileDungeonToScene = {
{ "Ganon's Castle", SCENE_INSIDE_GANONS_CASTLE } { "Ganon's Castle", SCENE_INSIDE_GANONS_CASTLE }
}; };
std::unordered_map<s16, s16> getItemIdToItemId = { // used for items that only set a rand inf when obtained
{ GI_BOW, ITEM_BOW }, std::map<RandomizerGet, RandomizerInf> randomizerGetToRandInf = {
{ GI_ARROW_FIRE, ITEM_ARROW_FIRE }, { RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND },
{ GI_DINS_FIRE, ITEM_DINS_FIRE }, { RG_BRONZE_SCALE, RAND_INF_CAN_SWIM },
{ GI_SLINGSHOT, ITEM_SLINGSHOT }, { RG_QUIVER_INF, RAND_INF_HAS_INFINITE_QUIVER },
{ GI_OCARINA_FAIRY, ITEM_OCARINA_FAIRY }, { RG_BOMB_BAG_INF, RAND_INF_HAS_INFINITE_BOMB_BAG },
{ GI_OCARINA_OOT, ITEM_OCARINA_TIME }, { RG_BULLET_BAG_INF, RAND_INF_HAS_INFINITE_BULLET_BAG },
{ GI_HOOKSHOT, ITEM_HOOKSHOT }, { RG_STICK_UPGRADE_INF, RAND_INF_HAS_INFINITE_STICK_UPGRADE },
{ GI_LONGSHOT, ITEM_LONGSHOT }, { RG_NUT_UPGRADE_INF, RAND_INF_HAS_INFINITE_NUT_UPGRADE },
{ GI_ARROW_ICE, ITEM_ARROW_ICE }, { RG_MAGIC_INF, RAND_INF_HAS_INFINITE_MAGIC_METER },
{ GI_FARORES_WIND, ITEM_FARORES_WIND }, { RG_BOMBCHU_INF, RAND_INF_HAS_INFINITE_BOMBCHUS },
{ GI_BOOMERANG, ITEM_BOOMERANG }, { RG_WALLET_INF, RAND_INF_HAS_INFINITE_MONEY },
{ GI_LENS, ITEM_LENS }, { RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY },
{ GI_HAMMER, ITEM_HAMMER }, { RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A },
{ GI_ARROW_LIGHT, ITEM_ARROW_LIGHT }, { RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP },
{ GI_NAYRUS_LOVE, ITEM_NAYRUS_LOVE }, { RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN },
{ GI_BOTTLE, ITEM_BOTTLE }, { RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT },
{ GI_POTION_RED, ITEM_POTION_RED }, { RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT },
{ GI_POTION_GREEN, ITEM_POTION_GREEN }, { RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL },
{ GI_POTION_BLUE, ITEM_POTION_BLUE }, { RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL },
{ GI_FAIRY, ITEM_FAIRY }, { RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL },
{ GI_FISH, ITEM_FISH }, { RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL },
{ GI_MILK_BOTTLE, ITEM_MILK_BOTTLE }, { RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL },
{ GI_LETTER_RUTO, ITEM_LETTER_RUTO }, { RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL },
{ GI_BLUE_FIRE, ITEM_BLUE_FIRE }, { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL },
{ GI_BUGS, ITEM_BUG }, { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL },
{ GI_BIG_POE, ITEM_BIG_POE }, { RG_GANON_SOUL, RAND_INF_GANON_SOUL },
{ GI_POE, ITEM_POE },
{ GI_WEIRD_EGG, ITEM_WEIRD_EGG },
{ GI_LETTER_ZELDA, ITEM_LETTER_ZELDA },
{ GI_POCKET_EGG, ITEM_POCKET_EGG },
{ GI_COJIRO, ITEM_COJIRO },
{ GI_ODD_MUSHROOM, ITEM_ODD_MUSHROOM },
{ GI_ODD_POTION, ITEM_ODD_POTION },
{ GI_SAW, ITEM_SAW },
{ GI_SWORD_BROKEN, ITEM_SWORD_BROKEN },
{ GI_PRESCRIPTION, ITEM_PRESCRIPTION },
{ GI_FROG, ITEM_FROG },
{ GI_EYEDROPS, ITEM_EYEDROPS },
{ GI_CLAIM_CHECK, ITEM_CLAIM_CHECK },
}; };
#ifdef _MSC_VER #ifdef _MSC_VER
@ -776,6 +763,10 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerCheck(Randomizer
} }
ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGet randoGet) { ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGet randoGet) {
if (randomizerGetToRandInf.find(randoGet) != randomizerGetToRandInf.end()) {
return Flags_GetRandomizerInf(randomizerGetToRandInf.find(randoGet)->second) ? CANT_OBTAIN_ALREADY_HAVE
: CAN_OBTAIN;
}
// This is needed since Plentiful item pool also adds a third progressive wallet // This is needed since Plentiful item pool also adds a third progressive wallet
// but we should not get Tycoon's Wallet from it if it is off. // but we should not get Tycoon's Wallet from it if it is off.
@ -1146,18 +1137,6 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
case RG_LIGHT_MEDALLION: case RG_LIGHT_MEDALLION:
return !CHECK_QUEST_ITEM(QUEST_MEDALLION_LIGHT) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_QUEST_ITEM(QUEST_MEDALLION_LIGHT) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
// Ocarina Buttons
case RG_OCARINA_A_BUTTON:
return Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_A) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN;
case RG_OCARINA_C_LEFT_BUTTON:
return Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_LEFT) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN;
case RG_OCARINA_C_RIGHT_BUTTON:
return Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_RIGHT) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN;
case RG_OCARINA_C_UP_BUTTON:
return Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_UP) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN;
case RG_OCARINA_C_DOWN_BUTTON:
return Flags_GetRandomizerInf(RAND_INF_HAS_OCARINA_C_DOWN) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN;
case RG_RECOVERY_HEART: case RG_RECOVERY_HEART:
case RG_GREEN_RUPEE: case RG_GREEN_RUPEE:
case RG_GREG_RUPEE: case RG_GREG_RUPEE:
@ -5391,7 +5370,7 @@ CustomMessage Randomizer::GetGoronMessage(u16 index) {
void Randomizer::CreateCustomMessages() { void Randomizer::CreateCustomMessages() {
// RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED
// with GIMESSAGE(getItemID, itemID, english, german, french). // with GIMESSAGE(getItemID, itemID, english, german, french).
const std::array<GetItemMessage, 112> getItemMessages = { { const std::array<GetItemMessage, 120> getItemMessages = { {
GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, "You found %gGreg%w!", "%gGreg%w! Du hast ihn&wirklich gefunden!", GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, "You found %gGreg%w!", "%gGreg%w! Du hast ihn&wirklich gefunden!",
"Félicitation! Vous avez trouvé %gGreg%w!"), "Félicitation! Vous avez trouvé %gGreg%w!"),
GIMESSAGE(RG_MASTER_SWORD, ITEM_SWORD_MASTER, "You found the %gMaster Sword%w!", GIMESSAGE(RG_MASTER_SWORD, ITEM_SWORD_MASTER, "You found the %gMaster Sword%w!",
@ -5712,6 +5691,23 @@ void Randomizer::CreateCustomMessages() {
"Vous obtenez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en " "Vous obtenez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en "
"jouez!"), "jouez!"),
GIMESSAGE(RG_MASK_KEATON, ITEM_MASK_KEATON, "You found the %rKeaton Mask%w!", "!!!",
"Vous obtenez le %rMasque&du Renard%w!"),
GIMESSAGE(RG_MASK_SKULL, ITEM_MASK_SKULL, "You found the %rSkull Mask%w!", "!!!",
"Vous obtenez le %rMasque&de Mort%w!"),
GIMESSAGE(RG_MASK_SPOOKY, ITEM_MASK_SPOOKY, "You found the %rSpooky Mask%w!", "!!!",
"Vous obtenez le %rMasque&d'Effroi%w!"),
GIMESSAGE(RG_MASK_BUNNY, ITEM_MASK_BUNNY, "You found the %rBunny Mask%w!", "!!!",
"Vous obtenez le %rMasque&du Lapin%w!"),
GIMESSAGE(RG_MASK_GORON, ITEM_MASK_GORON, "You found the %rGoron Mask%w!", "!!!",
"Vous obtenez le %rMasque&de Goron%w!"),
GIMESSAGE(RG_MASK_ZORA, ITEM_MASK_ZORA, "You found the %rZora Mask%w!", "!!!",
"Vous obtenez le %rMasque&de Zora%w!"),
GIMESSAGE(RG_MASK_GERUDO, ITEM_MASK_GERUDO, "You found the %rGerudo Mask%w!", "!!!",
"Vous obtenez le %rMasque&de Gerudo%w!"),
GIMESSAGE(RG_MASK_TRUTH, ITEM_MASK_TRUTH, "You found the %rMask of Truth%w!", "!!!",
"Vous obtenez le %rMasque&de Vérité%w!"),
GIMESSAGE(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!", GIMESSAGE(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!",
"Du hast die %rBronzene Schuppe%w&erhalten! Die Fähigkeit zu&Schwimmen ist nun dein!", "Du hast die %rBronzene Schuppe%w&erhalten! Die Fähigkeit zu&Schwimmen ist nun dein!",
"Vous obtenez l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est&à vous!"), "Vous obtenez l'%rÉcaille de Bronze%w!&Le pouvoir de la flottabilité est&à vous!"),
@ -5881,35 +5877,6 @@ void Randomizer_GameplayStats_SetTimestamp(uint16_t item) {
extern "C" u8 Return_Item_Entry(GetItemEntry itemEntry, u8 returnItem); extern "C" u8 Return_Item_Entry(GetItemEntry itemEntry, u8 returnItem);
// used for items that only set a rand inf when obtained
std::map<RandomizerGet, RandomizerInf> randomizerGetToRandInf = {
{ RG_FISHING_POLE, RAND_INF_FISHING_POLE_FOUND },
{ RG_BRONZE_SCALE, RAND_INF_CAN_SWIM },
{ RG_QUIVER_INF, RAND_INF_HAS_INFINITE_QUIVER },
{ RG_BOMB_BAG_INF, RAND_INF_HAS_INFINITE_BOMB_BAG },
{ RG_BULLET_BAG_INF, RAND_INF_HAS_INFINITE_BULLET_BAG },
{ RG_STICK_UPGRADE_INF, RAND_INF_HAS_INFINITE_STICK_UPGRADE },
{ RG_NUT_UPGRADE_INF, RAND_INF_HAS_INFINITE_NUT_UPGRADE },
{ RG_MAGIC_INF, RAND_INF_HAS_INFINITE_MAGIC_METER },
{ RG_BOMBCHU_INF, RAND_INF_HAS_INFINITE_BOMBCHUS },
{ RG_WALLET_INF, RAND_INF_HAS_INFINITE_MONEY },
{ RG_SKELETON_KEY, RAND_INF_HAS_SKELETON_KEY },
{ RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A },
{ RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP },
{ RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN },
{ RG_OCARINA_C_LEFT_BUTTON, RAND_INF_HAS_OCARINA_C_LEFT },
{ RG_OCARINA_C_RIGHT_BUTTON, RAND_INF_HAS_OCARINA_C_RIGHT },
{ RG_GOHMA_SOUL, RAND_INF_GOHMA_SOUL },
{ RG_KING_DODONGO_SOUL, RAND_INF_KING_DODONGO_SOUL },
{ RG_BARINADE_SOUL, RAND_INF_BARINADE_SOUL },
{ RG_PHANTOM_GANON_SOUL, RAND_INF_PHANTOM_GANON_SOUL },
{ RG_VOLVAGIA_SOUL, RAND_INF_VOLVAGIA_SOUL },
{ RG_MORPHA_SOUL, RAND_INF_MORPHA_SOUL },
{ RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL },
{ RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL },
{ RG_GANON_SOUL, RAND_INF_GANON_SOUL },
};
extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
if (giEntry.modIndex != MOD_RANDOMIZER) { if (giEntry.modIndex != MOD_RANDOMIZER) {
LUSLOG_WARN( LUSLOG_WARN(
@ -6098,6 +6065,12 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
Flags_SetRandomizerInf( Flags_SetRandomizerInf(
(RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1)); (RandomizerInf)((int)RAND_INF_GUARD_HOUSE_UNLOCKED + ((item - RG_GUARD_HOUSE_KEY) * 2) + 1));
return Return_Item_Entry(giEntry, RG_NONE); return Return_Item_Entry(giEntry, RG_NONE);
} else if (item >= RG_MASK_KEATON && item <= RG_MASK_TRUTH) {
Flags_SetRandomizerInf((RandomizerInf)((int)RAND_INF_CHILD_TRADES_HAS_MASK_KEATON + (item - RG_MASK_KEATON)));
if (INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_NONE) {
INV_CONTENT(ITEM_TRADE_CHILD) = (int)ITEM_MASK_KEATON + (item - RG_MASK_KEATON);
}
return Return_Item_Entry(giEntry, RG_NONE);
} }
switch (item) { switch (item) {

View file

@ -4043,6 +4043,14 @@ typedef enum {
RG_HOOKSHOT, RG_HOOKSHOT,
RG_LONGSHOT, RG_LONGSHOT,
RG_SCARECROW, RG_SCARECROW,
RG_MASK_KEATON,
RG_MASK_SKULL,
RG_MASK_SPOOKY,
RG_MASK_BUNNY,
RG_MASK_GORON,
RG_MASK_ZORA,
RG_MASK_GERUDO,
RG_MASK_TRUTH,
// Overworld keys // Overworld keys
RG_GUARD_HOUSE_KEY, RG_GUARD_HOUSE_KEY,
@ -4069,6 +4077,7 @@ typedef enum {
RG_BACK_TOWER_KEY, RG_BACK_TOWER_KEY,
RG_HYLIA_LAB_KEY, RG_HYLIA_LAB_KEY,
RG_FISHING_HOLE_KEY, RG_FISHING_HOLE_KEY,
// Logic Only // Logic Only
RG_DISTANT_SCARECROW, RG_DISTANT_SCARECROW,
RG_STICKS, RG_STICKS,
@ -5204,6 +5213,14 @@ typedef enum {
RHT_OCARINA_C_DOWN_BUTTON, RHT_OCARINA_C_DOWN_BUTTON,
RHT_OCARINA_C_LEFT_BUTTON, RHT_OCARINA_C_LEFT_BUTTON,
RHT_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON,
RHT_MASK_KEATON,
RHT_MASK_SKULL,
RHT_MASK_SPOOKY,
RHT_MASK_BUNNY,
RHT_MASK_GORON,
RHT_MASK_ZORA,
RHT_MASK_GERUDO,
RHT_MASK_TRUTH,
RHT_BRONZE_SCALE, RHT_BRONZE_SCALE,
RHT_FISHING_POLE, RHT_FISHING_POLE,
RHT_SKELETON_KEY, RHT_SKELETON_KEY,
@ -5868,7 +5885,7 @@ typedef enum {
RSK_SHUFFLE_CHEST_MINIGAME, RSK_SHUFFLE_CHEST_MINIGAME,
RSK_BIG_POE_COUNT, RSK_BIG_POE_COUNT,
RSK_SKIP_EPONA_RACE, RSK_SKIP_EPONA_RACE,
RSK_COMPLETE_MASK_QUEST, RSK_MASK_QUEST,
RSK_SKIP_SCARECROWS_SONG, RSK_SKIP_SCARECROWS_SONG,
RSK_SKULLS_SUNS_SONG, RSK_SKULLS_SUNS_SONG,
RSK_SHUFFLE_ADULT_TRADE, RSK_SHUFFLE_ADULT_TRADE,
@ -6236,6 +6253,13 @@ typedef enum {
RO_STARTING_OCARINA_TIME, RO_STARTING_OCARINA_TIME,
} RandoOptionStartingOcarina; } RandoOptionStartingOcarina;
// Mask Quest Settings (vanilla, completed, shuffle)
typedef enum {
RO_MASK_QUEST_VANILLA,
RO_MASK_QUEST_COMPLETED,
RO_MASK_QUEST_SHUFFLE,
} RandoOptionMaskQuest;
// Item Pool Settings // Item Pool Settings
typedef enum { typedef enum {
RO_ITEM_POOL_PLENTIFUL, RO_ITEM_POOL_PLENTIFUL,

View file

@ -402,7 +402,7 @@ extern "C" void Randomizer_InitSaveFile() {
} }
// complete mask quest // complete mask quest
if (Randomizer_GetSettingValue(RSK_COMPLETE_MASK_QUEST)) { if (Randomizer_GetSettingValue(RSK_MASK_QUEST) == RO_MASK_QUEST_COMPLETED) {
Flags_SetInfTable(INFTABLE_GATE_GUARD_PUT_ON_KEATON_MASK); Flags_SetInfTable(INFTABLE_GATE_GUARD_PUT_ON_KEATON_MASK);
Flags_SetEventChkInf(EVENTCHKINF_PAID_BACK_BUNNY_HOOD_FEE); Flags_SetEventChkInf(EVENTCHKINF_PAID_BACK_BUNNY_HOOD_FEE);

View file

@ -270,7 +270,7 @@ void Settings::CreateOptions() {
OPT_BOOL(RSK_SKIP_EPONA_RACE, "Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); OPT_BOOL(RSK_SKIP_EPONA_RACE, "Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP);
OPT_BOOL(RSK_SKIP_SCARECROWS_SONG, "Skip Scarecrow's Song", CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), mOptionDescriptions[RSK_SKIP_SCARECROWS_SONG]); OPT_BOOL(RSK_SKIP_SCARECROWS_SONG, "Skip Scarecrow's Song", CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), mOptionDescriptions[RSK_SKIP_SCARECROWS_SONG]);
OPT_U8(RSK_BIG_POE_COUNT, "Big Poe Target Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 10); OPT_U8(RSK_BIG_POE_COUNT, "Big Poe Target Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 10);
OPT_BOOL(RSK_COMPLETE_MASK_QUEST, "Complete Mask Quest", CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_COMPLETE_MASK_QUEST]); OPT_U8(RSK_MASK_QUEST, "Mask Quest", {"Vanilla", "Completed", "Shuffle"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_MASK_QUEST], WidgetType::Combobox, 0);
OPT_U8(RSK_GOSSIP_STONE_HINTS, "Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE); OPT_U8(RSK_GOSSIP_STONE_HINTS, "Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE);
OPT_U8(RSK_HINT_CLARITY, "Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT); OPT_U8(RSK_HINT_CLARITY, "Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT);
OPT_U8(RSK_HINT_DISTRIBUTION, "Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintDistribution"), mOptionDescriptions[RSK_HINT_DISTRIBUTION], WidgetType::Combobox, RO_HINT_DIST_BALANCED, true, IMFLAG_UNINDENT); OPT_U8(RSK_HINT_DISTRIBUTION, "Hint Distribution", {"Useless", "Balanced", "Strong", "Very Strong"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintDistribution"), mOptionDescriptions[RSK_HINT_DISTRIBUTION], WidgetType::Combobox, RO_HINT_DIST_BALANCED, true, IMFLAG_UNINDENT);
@ -1246,7 +1246,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_SHUFFLE_FISHING_POLE], &mOptions[RSK_SHUFFLE_FISHING_POLE],
&mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG],
&mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG],
&mOptions[RSK_SHUFFLE_FREESTANDING], &mOptions[RSK_MASK_QUEST],
}, },
WidgetContainerType::COLUMN); WidgetContainerType::COLUMN);
mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] =
@ -1336,10 +1336,10 @@ void Settings::CreateOptions() {
&mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI], &mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI],
}, },
WidgetContainerType::TABLE); WidgetContainerType::TABLE);
mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup( mOptionGroups[RSG_TIMESAVERS_IMGUI] =
"Timesavers", OptionGroup::SubGroup("Timesavers",
{ &mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_SKIP_CHILD_ZELDA], &mOptions[RSK_SKIP_EPONA_RACE], { &mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_SKIP_CHILD_ZELDA],
&mOptions[RSK_COMPLETE_MASK_QUEST], &mOptions[RSK_SKIP_SCARECROWS_SONG] }, &mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_SKIP_SCARECROWS_SONG] },
WidgetContainerType::COLUMN); WidgetContainerType::COLUMN);
mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI] = OptionGroup::SubGroup("", mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI] = OptionGroup::SubGroup("",
{ {
@ -1605,7 +1605,6 @@ void Settings::CreateOptions() {
&mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_SKIP_EPONA_RACE],
&mOptions[RSK_SKIP_SCARECROWS_SONG], &mOptions[RSK_SKIP_SCARECROWS_SONG],
&mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_BIG_POE_COUNT],
&mOptions[RSK_COMPLETE_MASK_QUEST],
}); });
mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings",
{ {

View file

@ -2120,7 +2120,7 @@ u8 Item_Give(PlayState* play, u8 item) {
} }
} }
} }
// update the adult/child equips when rando'd (accounting for equp swapped hookshot as child) // update the adult/child equips when rando'd (accounting for equip swapped hookshot as child)
if (IS_RANDO && LINK_IS_CHILD) { if (IS_RANDO && LINK_IS_CHILD) {
for (i = 1; i < ARRAY_COUNT(gSaveContext.adultEquips.buttonItems); i++) { for (i = 1; i < ARRAY_COUNT(gSaveContext.adultEquips.buttonItems); i++) {
if (gSaveContext.adultEquips.buttonItems[i] == ITEM_HOOKSHOT) { if (gSaveContext.adultEquips.buttonItems[i] == ITEM_HOOKSHOT) {

View file

@ -356,12 +356,7 @@ u8 ShouldRenderItem(s16 fileIndex, u8 item) {
return 0; return 0;
} }
if (item == ITEM_MASK_KEATON && (HasItem(fileIndex, ITEM_WEIRD_EGG) || HasItem(fileIndex, ITEM_CHICKEN) || if (item == ITEM_MASK_KEATON && !HasItem(fileIndex, ITEM_MASK_KEATON)) {
HasItem(fileIndex, ITEM_LETTER_ZELDA) || HasItem(fileIndex, ITEM_MASK_SKULL) ||
HasItem(fileIndex, ITEM_MASK_SPOOKY) || HasItem(fileIndex, ITEM_MASK_BUNNY) ||
HasItem(fileIndex, ITEM_MASK_GORON) || HasItem(fileIndex, ITEM_MASK_ZORA) ||
HasItem(fileIndex, ITEM_MASK_GERUDO) || HasItem(fileIndex, ITEM_MASK_TRUTH) ||
HasItem(fileIndex, ITEM_SOLD_OUT))) {
return 0; return 0;
} }

View file

@ -323,9 +323,9 @@ void KaleidoScope_HandleItemCycleExtras(PlayState* play, u8 slot, bool canCycle,
bool CanMaskSelect() { bool CanMaskSelect() {
if (IS_RANDO) { if (IS_RANDO) {
return CVarGetInteger(CVAR_ENHANCEMENT("MaskSelect"), 0) && return (CVarGetInteger(CVAR_ENHANCEMENT("MaskSelect"), 0) && Flags_GetRandomizerInf(RAND_INF_ZELDAS_LETTER) &&
Flags_GetRandomizerInf( Flags_GetInfTable(INFTABLE_SHOWED_ZELDAS_LETTER_TO_GATE_GUARD)) ||
RAND_INF_ZELDAS_LETTER); /* || Randomizer_GetSettingValue(RSK_SHUFFLE_CHILD_TRADE) */ Randomizer_GetSettingValue(RSK_MASK_QUEST) == RO_MASK_QUEST_SHUFFLE;
} }
// only allow mask select when: // only allow mask select when: