From 3ccfe819141acdc76a493cfbb63b9aff05cfddad Mon Sep 17 00:00:00 2001 From: gymnast86 Date: Mon, 3 Aug 2026 13:25:43 -0700 Subject: [PATCH] rework some locations to modify flow nodes instead --- src/d/actor/d_a_npc_aru.cpp | 10 -- src/d/actor/d_a_npc_ashB.cpp | 11 -- src/d/actor/d_a_npc_chin.cpp | 15 -- src/d/actor/d_a_npc_fairy.cpp | 9 - src/d/actor/d_a_npc_gra.cpp | 13 -- src/d/actor/d_a_npc_gro.cpp | 11 -- src/d/actor/d_a_npc_grr.cpp | 11 -- src/d/actor/d_a_npc_grs.cpp | 10 -- src/d/actor/d_a_npc_impal.cpp | 17 -- src/d/actor/d_a_npc_kkri.cpp | 15 -- src/d/actor/d_a_npc_len.cpp | 11 -- src/d/actor/d_a_npc_maro.cpp | 10 +- src/d/actor/d_a_npc_myna2.cpp | 11 -- src/d/actor/d_a_npc_pouya.cpp | 20 +-- src/d/actor/d_a_npc_rafrel.cpp | 12 -- src/d/actor/d_a_npc_the.cpp | 10 -- src/d/actor/d_a_npc_uri.cpp | 10 -- src/d/actor/d_a_npc_ykw.cpp | 11 -- src/d/actor/d_a_npc_zra.inc | 16 -- src/d/actor/d_a_npc_zrc.cpp | 6 - src/d/actor/d_a_npc_zrz.cpp | 6 - src/d/d_msg_flow.cpp | 7 - src/d/d_save.cpp | 8 - src/d/d_shop_system.cpp | 6 - .../randomizer/game/randomizer_context.cpp | 163 ++++++++++++------ .../generator/data/flow_patches.yaml | 38 ++++ .../randomizer/generator/data/locations.yaml | 163 ++++++++++++++++++ src/dusk/randomizer/generator/logic/hints.cpp | 4 + 28 files changed, 315 insertions(+), 319 deletions(-) diff --git a/src/d/actor/d_a_npc_aru.cpp b/src/d/actor/d_a_npc_aru.cpp index 09d58db845..21568ee43c 100644 --- a/src/d/actor/d_a_npc_aru.cpp +++ b/src/d/actor/d_a_npc_aru.cpp @@ -15,10 +15,6 @@ #include "d/actor/d_a_horse.h" #include "Z2AudioLib/Z2Instances.h" -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#endif - #if DEBUG #include "JSystem/JHostIO/JORFile.h" #include "d/d_debug_viewer.h" @@ -1749,12 +1745,6 @@ int daNpc_Aru_c::cutSpeakTo(int i_staffID) { switch (eventId) { case 1: if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { -#if TARGET_PC - if (randomizer_IsActive()) { - itemNo = randomizer_getItemAtLocation("Herding Goats Reward"); - randomizer_setTempFlagForLocation("Herding Goats Reward"); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); } diff --git a/src/d/actor/d_a_npc_ashB.cpp b/src/d/actor/d_a_npc_ashB.cpp index ff329178b6..a4dd015906 100644 --- a/src/d/actor/d_a_npc_ashB.cpp +++ b/src/d/actor/d_a_npc_ashB.cpp @@ -10,11 +10,6 @@ #include "JSystem/J3DGraphBase/J3DMaterial.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - DUSK_GAME_DATA const daNpcAshB_HIOParam daNpcAshB_Param_c::m = { 205.0f, // attention_offset -3.0f, // gravity @@ -1006,12 +1001,6 @@ BOOL daNpcAshB_c::EvCut_Appear(int i_staffID) { case '0008': local_30[0] = 0; if (mFlow.getEventId(local_30) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - local_30[0] = verifyProgressiveItem(randomizer_getItemAtLocation("Ashei Sketch")); - randomizer_setTempFlagForLocation("Ashei Sketch"); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, local_30[0], 0, -1, -1, 0, 0); dComIfGp_event_setItemPartnerId(mItemPartnerId); diff --git a/src/d/actor/d_a_npc_chin.cpp b/src/d/actor/d_a_npc_chin.cpp index 95a5793151..f31cac9822 100644 --- a/src/d/actor/d_a_npc_chin.cpp +++ b/src/d/actor/d_a_npc_chin.cpp @@ -11,10 +11,6 @@ #include "d/d_meter2_info.h" #include "d/d_timer.h" -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#endif - enum Event { EVT_NONE, EVT_GAME_START, @@ -1808,17 +1804,6 @@ int daNpcChin_c::_Evt_GameSucceed_CutMain(const int& param_0) { itemId1 = 0; } -#if TARGET_PC - if (randomizer_IsActive()) { - if (itemId1 == dItemNo_ARROW_LV2_e) { - itemId1 = randomizer_getItemAtLocation("STAR Prize 1"); - randomizer_setTempFlagForLocation("STAR Prize 1"); - } else if (itemId1 == dItemNo_ARROW_LV3_e) { - itemId1 = randomizer_getItemAtLocation("STAR Prize 2"); - randomizer_setTempFlagForLocation("STAR Prize 2"); - } - } -#endif fpc_ProcID itemId2 = fopAcM_createItemForPresentDemo(¤t.pos, itemId1, 0, -1, -1, 0, 0); if (itemId2 != -1) { diff --git a/src/d/actor/d_a_npc_fairy.cpp b/src/d/actor/d_a_npc_fairy.cpp index 69a952043d..9a908dcd4e 100644 --- a/src/d/actor/d_a_npc_fairy.cpp +++ b/src/d/actor/d_a_npc_fairy.cpp @@ -13,7 +13,6 @@ #if TARGET_PC #include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" #endif enum fairy_RES_File_ID { @@ -1338,14 +1337,6 @@ void daNpc_Fairy_c::PresentDemoCall() { item_no = 0; } -#if TARGET_PC - // If we haven't visted this great fairy before, give the random item - if (randomizer_IsActive() && !daNpcT_chkEvtBit(505)) { - item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Cave of Ordeals Great Fairy Reward")); - randomizer_setTempFlagForLocation("Cave of Ordeals Great Fairy Reward"); - } -#endif - fpc_ProcID id = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1, NULL, NULL); if (id != fpcM_ERROR_PROCESS_ID_e) { dComIfGp_event_setItemPartnerId(id); diff --git a/src/d/actor/d_a_npc_gra.cpp b/src/d/actor/d_a_npc_gra.cpp index 1fddbc74d4..a43491a57a 100644 --- a/src/d/actor/d_a_npc_gra.cpp +++ b/src/d/actor/d_a_npc_gra.cpp @@ -14,11 +14,6 @@ #include "Z2AudioLib/Z2Instances.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - DUSK_GAME_DATA const daNpc_grA_HIOParam daNpc_grA_Param_c::m = { {90.0f, -4.0f, 1.0f, 850.0f, 255.0f, 280.0f, 40.0f, 100.0f, 0.0f, 0.0f, 20.0f, -20.0f, 40.0f, -30.0f, 40.0f, -40.0f, 0.4f, 12.0f, 4, 6, 6, 6, @@ -4023,14 +4018,6 @@ BOOL daNpc_grA_c::talk(void*) { } if (r26 && talkProc(NULL, TRUE, NULL)) { if (mFlow.getEventId(&sp8) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - // Give the randomized underwater goron item - if (sp8 == dItemNo_Randomizer_BOMB_IN_BAG_e) { - sp8 = verifyProgressiveItem(randomizer_getItemAtLocation("Zoras Domain Underwater Goron")); - } - } -#endif field_0x1480 = fopAcM_createItemForPresentDemo(¤t.pos, sp8, 0, -1, -1, NULL, NULL); if (field_0x1480 != fpcM_ERROR_PROCESS_ID_e) { diff --git a/src/d/actor/d_a_npc_gro.cpp b/src/d/actor/d_a_npc_gro.cpp index 0c314c1ce0..bdf984f35f 100644 --- a/src/d/actor/d_a_npc_gro.cpp +++ b/src/d/actor/d_a_npc_gro.cpp @@ -13,11 +13,6 @@ #include "Z2AudioLib/Z2Instances.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - enum grO_RES_File_ID { /* BCK */ /* 0x07 */ BCK_GRO_F_TALK_A = 0x7, @@ -1686,12 +1681,6 @@ int daNpc_grO_c::talk(void* param_1) { if (facePlayerFlag && talkProc(NULL, TRUE, NULL)) { if (mType == TYPE_MINES) { if (mFlow.getEventId(&itemId) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - itemId = verifyProgressiveItem(randomizer_getItemAtLocation("Goron Mines Gor Ebizo Key Shard")); - randomizer_setTempFlagForLocation("Goron Mines Gor Ebizo Key Shard"); - } -#endif mItemID = fopAcM_createItemForPresentDemo(¤t.pos, itemId, 0, -1, -1, NULL, NULL); if (mItemID != fpcM_ERROR_PROCESS_ID_e) { s16 eventIdx = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_GETITEM", 0xFF); diff --git a/src/d/actor/d_a_npc_grr.cpp b/src/d/actor/d_a_npc_grr.cpp index 66fc90056d..ee0d50d858 100644 --- a/src/d/actor/d_a_npc_grr.cpp +++ b/src/d/actor/d_a_npc_grr.cpp @@ -10,11 +10,6 @@ #include "Z2AudioLib/Z2Instances.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - enum grR_RES_File_ID { /* BCK */ /* 0x06 */ BCK_GRR_AGURA_GETUP = 0x6, @@ -1343,12 +1338,6 @@ int daNpc_grR_c::talk(void* param_1) { if (bVar1 && talkProc(NULL, TRUE, NULL)) { if (mType == TYPE_0) { if (mFlow.getEventId(&i_itemNo) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - i_itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Goron Mines Gor Liggs Key Shard")); - randomizer_setTempFlagForLocation("Goron Mines Gor Liggs Key Shard"); - } -#endif mItemID = fopAcM_createItemForPresentDemo(¤t.pos, i_itemNo, 0, -1, -1, NULL, NULL); if (mItemID != fpcM_ERROR_PROCESS_ID_e) { diff --git a/src/d/actor/d_a_npc_grs.cpp b/src/d/actor/d_a_npc_grs.cpp index 28772676ee..abab07d22b 100644 --- a/src/d/actor/d_a_npc_grs.cpp +++ b/src/d/actor/d_a_npc_grs.cpp @@ -11,10 +11,6 @@ #include "Z2AudioLib/Z2Instances.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif enum Event_Cut_Nums { NUM_EVT_CUTS_e = 2, }; @@ -1194,12 +1190,6 @@ int daNpc_grS_c::talk(void* param_0) { if (unkFlag1 && talkProc(NULL, 1, NULL)) { if (mType == 0) { if (mFlow.getEventId(&unkInt2) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - unkInt2 = verifyProgressiveItem(randomizer_getItemAtLocation("Goron Mines Gor Amato Key Shard")); - randomizer_setTempFlagForLocation("Goron Mines Gor Amato Key Shard"); - } -#endif mPresentItemId = fopAcM_createItemForPresentDemo(¤t.pos, unkInt2, 0, -1, -1, 0, 0); diff --git a/src/d/actor/d_a_npc_impal.cpp b/src/d/actor/d_a_npc_impal.cpp index 9ad738a484..5ac057ce06 100644 --- a/src/d/actor/d_a_npc_impal.cpp +++ b/src/d/actor/d_a_npc_impal.cpp @@ -9,11 +9,6 @@ #include "d/actor/d_a_npc.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - DUSK_GAME_DATA daNpcImpal_HIOParam const daNpcImpal_Param_c::m = { 135.0f, // attention_offset -3.0f, // gravity @@ -976,12 +971,6 @@ BOOL daNpcImpal_c::EvCut_ImpalAppear1(int i_cut_index) { if (talkProc(NULL, 1, NULL)) { int evt_id = 0; if (mFlow.getEventId(&evt_id) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - evt_id = verifyProgressiveItem(randomizer_getItemAtLocation("Ilia Charm")); - randomizer_setTempFlagForLocation("Ilia Charm"); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, evt_id, 0, -1, -1, 0, 0); if (mItemPartnerId != 0xffffffff) { @@ -1071,12 +1060,6 @@ BOOL daNpcImpal_c::EvCut_CopyRod(int i_cut_index) { case '0003': int evt_id = 0; if (mFlow.getEventId(&evt_id) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - evt_id = verifyProgressiveItem(randomizer_getItemAtLocation("Skybook From Impaz")); - randomizer_setTempFlagForLocation("Skybook From Impaz"); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, evt_id, 0, -1, -1, 0, 0); dComIfGp_event_setItemPartnerId(mItemPartnerId); diff --git a/src/d/actor/d_a_npc_kkri.cpp b/src/d/actor/d_a_npc_kkri.cpp index b85e0fd148..9b6b17d2e9 100644 --- a/src/d/actor/d_a_npc_kkri.cpp +++ b/src/d/actor/d_a_npc_kkri.cpp @@ -9,11 +9,6 @@ #include "d/actor/d_a_e_ym.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - static DUSK_CONSTEXPR int l_bmdData[2][2] = { {35, 1}, {18, 2}, @@ -1186,16 +1181,6 @@ int daNpc_Kkri_c::talk(void*) { switch (eventId) { case 1: if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { -#if TARGET_PC - if (randomizer_IsActive()) { - if (item_no == dItemNo_OIL_BOTTLE3_e) { - item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Coro Bottle")); - randomizer_setTempFlagForLocation("Coro Bottle"); - } /*else if (item_no == dItemNo_SMALL_KEY_e) { // Might be Small Key 2 - item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Coro Gate Key")); - }*/ - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1, NULL, NULL); } diff --git a/src/d/actor/d_a_npc_len.cpp b/src/d/actor/d_a_npc_len.cpp index f528d26a6c..7b7acab6fd 100644 --- a/src/d/actor/d_a_npc_len.cpp +++ b/src/d/actor/d_a_npc_len.cpp @@ -9,11 +9,6 @@ #include "d/actor/d_a_tag_push.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - enum Type { /* 0x0 */ TYPE_0, /* 0x1 */ TYPE_1, @@ -1241,12 +1236,6 @@ int daNpc_Len_c::talk(void* param_0) { switch (evt_id) { case 1: if (mItemPartnerId == -1) { -#if TARGET_PC - if (randomizer_IsActive()) { - local_18 = verifyProgressiveItem(randomizer_getItemAtLocation("Renados Letter")); - randomizer_setTempFlagForLocation("Renados Letter"); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, local_18, 0, -1, -1, 0, 0); } diff --git a/src/d/actor/d_a_npc_maro.cpp b/src/d/actor/d_a_npc_maro.cpp index 013d75d988..2a46a9b75a 100644 --- a/src/d/actor/d_a_npc_maro.cpp +++ b/src/d/actor/d_a_npc_maro.cpp @@ -17,10 +17,7 @@ #include "d/d_com_static.h" #include "d/d_item.h" #include "d/d_timer.h" -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif + #if DEBUG #include "d/d_debug_viewer.h" #include @@ -2397,11 +2394,6 @@ int daNpc_Maro_c::cutArrowTutorial(int arg0) { switch (evt_ret) { case 1: { if (mItemPartnerId == -1) { -#if TARGET_PC - if (randomizer_IsActive()) { - evt_id = verifyProgressiveItem(randomizer_getItemAtLocation("Talo Sharpshooting")); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, evt_id, 0, -1, -1, NULL, NULL); } diff --git a/src/d/actor/d_a_npc_myna2.cpp b/src/d/actor/d_a_npc_myna2.cpp index 7c507a25b8..ede18be556 100644 --- a/src/d/actor/d_a_npc_myna2.cpp +++ b/src/d/actor/d_a_npc_myna2.cpp @@ -11,11 +11,6 @@ #include "Z2AudioLib/Z2Instances.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - enum { NUM_EVT_CUTS_e = 5, }; @@ -1196,12 +1191,6 @@ int daNpc_myna2_c::ECut_gameGoalSuccess(int i_staffId) { case 20: { int itemNo = 0; if (mFlow.getEventId(&itemNo) == 1) { -#if TARGET_PC - // If plumm tries giving us the heart piece, give the randomized item instead - if (randomizer_IsActive() && itemNo == dItemNo_KAKERA_HEART_e) { - itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Plumm Fruit Balloon Minigame")); - } -#endif mItemPid = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); } break; diff --git a/src/d/actor/d_a_npc_pouya.cpp b/src/d/actor/d_a_npc_pouya.cpp index 0225f42a8d..72bad48e4b 100644 --- a/src/d/actor/d_a_npc_pouya.cpp +++ b/src/d/actor/d_a_npc_pouya.cpp @@ -8,12 +8,6 @@ #include "d/actor/d_a_npc_pouya.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/flags.h" -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - DUSK_GAME_DATA const daNpc_Pouya_HIOParam daNpc_Pouya_Param_c::m = { 120.0f, // attention_offset -3.0f, // gravity @@ -560,8 +554,7 @@ BOOL daNpc_Pouya_c::checkChangeEvt() { evtChange(); return TRUE; } - // In randomizer, only get the 60 reward if we've already gotten the 20 reward - if (dComIfGs_getPohSpiritNum() >= 60 IF_DUSK(&& randomizer_IsActive() && dComIfGs_isEventBit(GOT_BOTTLE_FROM_JOVANI))) { + if (dComIfGs_getPohSpiritNum() >= 60) { /* dSv_event_flag_c::F_0458 - Coversation with Jovani after collecting 60 ghosts */ if (!daNpcT_chkEvtBit(0x1CA)) { @@ -965,17 +958,6 @@ int daNpc_Pouya_c::cutHaveFavorToAsk(int param_0) { switch (evt_id) { case 1: if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { -#if TARGET_PC - if (randomizer_IsActive()) { - if (local_64 == dItemNo_Randomizer_DROP_BOTTLE_e) { - local_64 = verifyProgressiveItem(randomizer_getItemAtLocation("Jovani 20 Poe Soul Reward")); - randomizer_setTempFlagForLocation("Jovani 20 Poe Soul Reward"); - } else if (local_64 == dItemNo_Randomizer_SILVER_RUPEE_e) { - local_64 = verifyProgressiveItem(randomizer_getItemAtLocation("Jovani 60 Poe Soul Reward")); - randomizer_setTempFlagForLocation("Jovani 60 Poe Soul Reward"); - } - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, local_64, 0, -1, -1, 0, 0); } diff --git a/src/d/actor/d_a_npc_rafrel.cpp b/src/d/actor/d_a_npc_rafrel.cpp index 3d74dcf7b1..c267fd8c71 100644 --- a/src/d/actor/d_a_npc_rafrel.cpp +++ b/src/d/actor/d_a_npc_rafrel.cpp @@ -1321,12 +1321,6 @@ bool daNpcRafrel_c::talk(void* param_0) { OS_REPORT("会話終了時 イベントID=%d アイテムNo=%d\n", eventId, itemNo); if (eventId == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Auru Gift To Fyer")); - randomizer_setTempFlagForLocation("Auru Gift To Fyer"); - } -#endif field_0xe00 = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); if (field_0xe00 != fpcM_ERROR_PROCESS_ID_e) { s16 eventIdx = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_GETITEM", 0xFF); @@ -1579,12 +1573,6 @@ int daNpcRafrel_c::EvCut_Appear(int i_staffId) { int itemNo = 0; u16 eventId = mFlow.getEventId(&itemNo); if (eventId == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Auru Gift To Fyer")); - randomizer_setTempFlagForLocation("Auru Gift To Fyer"); - } -#endif field_0xe00 = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); dComIfGp_event_setItemPartnerId(field_0xe00); field_0xe00 = fpcM_ERROR_PROCESS_ID_e; diff --git a/src/d/actor/d_a_npc_the.cpp b/src/d/actor/d_a_npc_the.cpp index f7b906d228..01b7fbb66c 100644 --- a/src/d/actor/d_a_npc_the.cpp +++ b/src/d/actor/d_a_npc_the.cpp @@ -12,11 +12,6 @@ #include "SSystem/SComponent/c_math.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#include "dusk/randomizer/game/verify_item_functions.h" -#endif - DUSK_GAME_DATA const daNpcThe_HIOParam daNpcThe_Param_c::m = { 220.0f, // attention_offset -3.0f, // gravity @@ -828,11 +823,6 @@ BOOL daNpcThe_c::talk(void* param_0) { } int item_no = 0; if (mFlow.getEventId(&item_no) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Telma Invoice")); - } -#endif mItemID = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1, NULL, NULL); if (mItemID != -1) { diff --git a/src/d/actor/d_a_npc_uri.cpp b/src/d/actor/d_a_npc_uri.cpp index 41fb5104df..44df1060d2 100644 --- a/src/d/actor/d_a_npc_uri.cpp +++ b/src/d/actor/d_a_npc_uri.cpp @@ -10,10 +10,6 @@ #include "m_Do/m_Do_graphic.h" #include -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#endif - DUSK_GAME_DATA const daNpc_Uri_HIOParam daNpc_Uri_Param_c::m = { 200.0f, // attention_offset -3.0f, // gravity @@ -1169,12 +1165,6 @@ int daNpc_Uri_c::cutEndCarryTutorial(int param_1) { (s32)mFlow.getEventId(&local_48) == 1) { if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { -#if TARGET_PC - if (randomizer_IsActive()) { - local_48 = randomizer_getItemAtLocation("Uli Cradle Delivery"); - randomizer_setTempFlagForLocation("Uli Cradle Delivery"); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, local_48, 0, -1, -1, NULL, NULL); } diff --git a/src/d/actor/d_a_npc_ykw.cpp b/src/d/actor/d_a_npc_ykw.cpp index 4e3573687c..8a176652e3 100644 --- a/src/d/actor/d_a_npc_ykw.cpp +++ b/src/d/actor/d_a_npc_ykw.cpp @@ -2220,11 +2220,6 @@ int daNpc_ykW_c::cutEndSnowboardRace(int param_0) { switch (eventId) { case 1: if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { -#if TARGET_PC - if (randomizer_IsActive()) { - itemId = verifyProgressiveItem(randomizer_getItemAtLocation("Snowboard Racing Prize")); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemId, 0, -1, -1, 0, 0); } @@ -2923,12 +2918,6 @@ int daNpc_ykW_c::talk(void* param_0) { switch (eventId) { case 1: if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { -#if TARGET_PC - if (randomizer_IsActive()) { - itemNo = verifyProgressiveItem(randomizer_getItemAtLocation("Snowpeak Ruins Mansion Map")); - randomizer_setTempFlagForLocation("Snowpeak Ruins Mansion Map"); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, 0, 0); } diff --git a/src/d/actor/d_a_npc_zra.inc b/src/d/actor/d_a_npc_zra.inc index ca6a981bbb..2ada4601c8 100644 --- a/src/d/actor/d_a_npc_zra.inc +++ b/src/d/actor/d_a_npc_zra.inc @@ -1,7 +1,3 @@ -#if TARGET_PC -#include "dusk/randomizer/game/randomizer_context.hpp" -#endif - BOOL daNpc_zrA_c::wait(void* param_0) { switch (mMode) { case 0: @@ -2613,18 +2609,6 @@ BOOL daNpc_zrA_c::ECut_thanksBlast(int i_staffID) { case 31: { int item_id = 0; if (mFlow.getEventId(&item_id) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - if (item_id == dItemNo_Randomizer_BOMB_IN_BAG_e) { - item_id = verifyProgressiveItem(randomizer_getItemAtLocation("Iza Helping Hand")); - randomizer_setTempFlagForLocation("Iza Helping Hand"); - } else if (item_id == dItemNo_Randomizer_BOMB_BAG_LV2_e) { - item_id = verifyProgressiveItem(randomizer_getItemAtLocation("Iza Raging Rapids Minigame")); - randomizer_setTempFlagForLocation("Iza Raging Rapids Minigame"); - } - - } -#endif mItemID = fopAcM_createItemForPresentDemo(¤t.pos, item_id, 0, -1, -1, NULL, NULL); } diff --git a/src/d/actor/d_a_npc_zrc.cpp b/src/d/actor/d_a_npc_zrc.cpp index 89262584c4..d7aed946ab 100644 --- a/src/d/actor/d_a_npc_zrc.cpp +++ b/src/d/actor/d_a_npc_zrc.cpp @@ -1689,12 +1689,6 @@ BOOL daNpc_zrC_c::ECut_earringGet(int i_staffID) { case 40: { int item_no = 0; if (mFlow.getEventId(&item_no) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Gift From Ralis")); - randomizer_setTempFlagForLocation("Gift From Ralis"); - } -#endif mItemID = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1, NULL, NULL); } diff --git a/src/d/actor/d_a_npc_zrz.cpp b/src/d/actor/d_a_npc_zrz.cpp index 07598b32fd..0b839cc0e7 100644 --- a/src/d/actor/d_a_npc_zrz.cpp +++ b/src/d/actor/d_a_npc_zrz.cpp @@ -1740,12 +1740,6 @@ BOOL daNpc_zrZ_c::ECut_clothesGet(int i_staffID) { } item_no = 0; if (mFlow.getEventId(&item_no) == 1) { -#if TARGET_PC - if (randomizer_IsActive()) { - item_no = verifyProgressiveItem(randomizer_getItemAtLocation("Rutelas Blessing")); - randomizer_setTempFlagForLocation("Rutelas Blessing"); - } -#endif mItemID = fopAcM_createItemForPresentDemo(¤t.pos, item_no, 0, -1, -1, NULL, NULL); } diff --git a/src/d/d_msg_flow.cpp b/src/d/d_msg_flow.cpp index bf4a7fdc4d..165ba65f0c 100644 --- a/src/d/d_msg_flow.cpp +++ b/src/d/d_msg_flow.cpp @@ -1825,13 +1825,6 @@ u16 dMsgFlow_c::query049(mesg_flow_node_branch* i_flowNode_p, fopAc_ac_c* i_spea ret = 4; } -#if TARGET_PC - // Split up getting both rewards in randomizer - if (randomizer_IsActive() && ret == 4 && !dComIfGs_isEventBit(GOT_BOTTLE_FROM_JOVANI)) { - ret = 3; - } -#endif - if (param_2 != 0) { // "Collected Souls count" OS_REPORT("\x1B[44;33m:集めた魂の数  \x1B[m|:"); diff --git a/src/d/d_save.cpp b/src/d/d_save.cpp index a309a776b7..3bed167183 100644 --- a/src/d/d_save.cpp +++ b/src/d/d_save.cpp @@ -574,14 +574,6 @@ BOOL dSv_player_item_c::checkInsectBottle() { u8 dSv_player_item_c::checkEmptyBottle() { u8 bottleNum = 0; -#if TARGET_PC - if (randomizer_IsActive() && getStageID() == Cave_of_Ordeals) { - // Return 1 to allow the player to collect the item from the floor 50 reward, - // as this will make the game think that the player has an empty bottle. - return 1; - } -#endif - for (int i = 0; i < BOTTLE_MAX; i++) { if (mItems[i + SLOT_11] == dItemNo_EMPTY_BOTTLE_e) { bottleNum++; diff --git a/src/d/d_shop_system.cpp b/src/d/d_shop_system.cpp index 6031d04790..aa38f50899 100644 --- a/src/d/d_shop_system.cpp +++ b/src/d/d_shop_system.cpp @@ -911,12 +911,6 @@ int dShopSystem_c::seq_start(fopAc_ac_c* actor, dMsgFlow_c* i_flow) { int itemNo; if (mFlow.getEventId(&itemNo) == 1) { if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { -#if TARGET_PC - // In rando, override the cat rescue item - if (randomizer_IsActive() && itemNo == dItemNo_Randomizer_HALF_MILK_BOTTLE_e) { - itemNo = randomizer_getItemAtLocation("Ordon Cat Rescue"); - } -#endif mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); } diff --git a/src/dusk/randomizer/game/randomizer_context.cpp b/src/dusk/randomizer/game/randomizer_context.cpp index 6ac6175f1d..81920761a6 100644 --- a/src/dusk/randomizer/game/randomizer_context.cpp +++ b/src/dusk/randomizer/game/randomizer_context.cpp @@ -1108,6 +1108,50 @@ static std::array CreateAttributeData(const YAML::Node& node, const std: RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { RandomizerContext randoData{}; + // Give custom flows and messages new indices as we read them in/create them + std::unordered_map customMessageIDs{}; + std::unordered_map customFlowIDs{}; + std::unordered_set usedMessageIDs{}; + std::unordered_set usedFlowIDs{}; + u16 curCustomMessageID = BASE_CUSTOM_MSG_AND_FLOW_ID; + u16 curCustomFlowID = BASE_CUSTOM_MSG_AND_FLOW_ID; + + // Helper functions for assigning new custom flow IDs/message IDs + auto handleCustomID = [](const std::string& name, auto& customIds, auto& usedIds, u16& curCustomID) { + u16 resultIndex{}; + // Check to see if we're setting a custom index + auto resultInt = randomizer::utility::str::toInt(name); + // If we have a regular index, then use that directly + if (resultInt.has_value()) { + resultIndex = resultInt.value(); + } else { + // If we don't, assume we're setting the index as custom + if (customIds.contains(name)) { + resultIndex = customIds[name]; + } else { + while (usedIds.contains(curCustomID)) { + ++curCustomID; + } + auto newIndex = curCustomID++; + resultIndex = newIndex; + customIds[name] = newIndex; + } + } + + usedIds.insert(resultIndex); + return resultIndex; + }; + + + auto handleCustomFlowID = [&](const std::string& name) { + return handleCustomID(name, customFlowIDs, usedFlowIDs, curCustomFlowID); + }; + + + auto handleCustomMessageID = [&](const std::string& name) { + return handleCustomID(name, customMessageIDs, usedMessageIDs, curCustomMessageID); + }; + // Settings we need to check ingame for (const auto& [setting, info] : *randomizer::seedgen::settings::GetAllSettingsInfo()) { if (info->NeedInGame()) { @@ -1249,6 +1293,62 @@ RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { } } + // Items that are given by FLW events. Override the item in the existing event with the + // randomized item + if (location->HasCategories("FLW Event")) { + for (const auto& flwEventNode : metaData["FLW Event"]) { + u8 group = flwEventNode["Group"].as(); + u16 index = handleCustomFlowID(flwEventNode["Index"].as()); + mesg_flow_node_event event{}; + event.type = 3; // event type node + event.event_idx = 8; + event.next_node_idx = handleCustomFlowID(flwEventNode["Next Node Index"].as()); + auto params = flwEventNode["Parameters"].as(); + // Zero out the spot for the item id + params &= 0xFFFFFF00; + // Put in the item id + params |= location->GetCurrentItem()->GetID(); + // Set the params in the correct order + event.params[0] = (params >> 24) & 0xFF; + event.params[1] = (params >> 16) & 0xFF; + event.params[2] = (params >> 8) & 0xFF; + event.params[3] = params & 0xFF; + + // If we have a location flag, construct another FLW node to set the associated + // flag right before receiving the item. This is so we set the proper flag + // associated with the location before receiving the item so that the tracker/AP + // can pick up that it happened + if (flwEventNode["Location Flag"]) { + auto newFlwIndex = handleCustomFlowID(location->GetName() + " Flag Set Node"); + mesg_flow_node_event flagEvent{}; + flagEvent.type = 3; // event type node + if (flwEventNode["Location Flag"]["Save Bit Label"]) { + u16 saveBitLabel = flwEventNode["Location Flag"]["Save Bit Label"].as(); + flagEvent.event_idx = 0; // Event Flag ON + flagEvent.params[0] = 0; + flagEvent.params[1] = 0; + flagEvent.params[2] = (saveBitLabel >> 8) & 0xFF; + flagEvent.params[3] = saveBitLabel & 0xFF; + } + + // Store the modified FLW nodes. The flag event takes the place of the original + // index we're modifying and then leads into the custom index of the event that + // sets up the item id + flagEvent.next_node_idx = newFlwIndex; + u32 key = (group << 16) | index; + randoData.mFlowPatches[key] = std::bit_cast(flagEvent); + + key = (CUSTOM_BMG_GROUP << 16) | newFlwIndex; + randoData.mFlowPatches[key] = std::bit_cast(event); + + } else { + // Store the modified FLW node(s) + u32 key = (group << 16) | index; + randoData.mFlowPatches[key] = std::bit_cast(event); + } + } + } + // Items that we lookup just by calling their location name if (location->HasCategories("Name Lookup")) { for (const auto& locationNameNode : metaData["Name Lookup"]) { @@ -1395,49 +1495,6 @@ RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { } } - // Give custom flows and messages new indices as we read them in - std::unordered_map customMessageIDs{}; - std::unordered_map customFlowIDs{}; - std::unordered_set usedMessageIDs{}; - std::unordered_set usedFlowIDs{}; - u16 curCustomMessageID = BASE_CUSTOM_MSG_AND_FLOW_ID; - u16 curCustomFlowID = BASE_CUSTOM_MSG_AND_FLOW_ID; - - // Helper functions for assigning new custom flow IDs/message IDs - auto handleCustomID = [](const YAML::Node& node, auto& customIds, auto& usedIds, u16& curCustomID) { - u16 resultIndex{}; - // Check to see if we're setting a custom index - auto resultStr = node.as(); - auto resultInt = randomizer::utility::str::toInt(resultStr); - // If we have a regular index, then use that directly - if (resultInt.has_value()) { - resultIndex = resultInt.value(); - } else { - // If we don't, assume we're setting the index as custom - if (customIds.contains(resultStr)) { - resultIndex = customIds[resultStr]; - } else { - while (usedIds.contains(curCustomID)) { - ++curCustomID; - } - auto newIndex = curCustomID++; - resultIndex = newIndex; - customIds[resultStr] = newIndex; - } - } - - usedIds.insert(resultIndex); - return resultIndex; - }; - - auto handleCustomFlowID = [&](const YAML::Node& node) { - return handleCustomID(node, customFlowIDs, usedFlowIDs, curCustomFlowID); - }; - - auto handleCustomMessageID = [&](const YAML::Node& node) { - return handleCustomID(node, customMessageIDs, usedMessageIDs, curCustomMessageID); - }; - // Flow Patches auto flowPatches = LOAD_EMBED_YAML(RANDO_DATA_PATH "flow_patches.yaml"); for (const auto& groupNode : flowPatches) { @@ -1471,7 +1528,7 @@ RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { } } else { name = flowNode["name"].as(); - indices.push_back(handleCustomFlowID(flowNode["name"])); + indices.push_back(handleCustomFlowID(flowNode["name"].as())); } const auto& type = flowNode["type"].as(); @@ -1491,7 +1548,7 @@ RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { "do not match num results. (expected: {}. size: {})", name, branch->field_0x1, results.size())); } for (const auto& resultNode : results) { - auto resultIndex = handleCustomFlowID(resultNode); + auto resultIndex = handleCustomFlowID(resultNode.as()); for (auto index : indices) { u32 key = (groupNo << 16) | index; randoData.mFlowPatchesBranchOverrides[key].push_back(resultIndex); @@ -1503,7 +1560,7 @@ RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { auto event = reinterpret_cast(&value); event->type = 3; event->event_idx = flowNode["event"].as(); - event->next_node_idx = handleCustomFlowID(flowNode["next node index"]); + event->next_node_idx = handleCustomFlowID(flowNode["next node index"].as()); u32 params = flowNode["parameters"].as(); event->params[0] = (params >> 24) & 0xFF; event->params[1] = (params >> 16) & 0xFF; @@ -1512,8 +1569,8 @@ RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { } else if (type == "message") { auto message = reinterpret_cast(&value); message->type = 1; - message->msg_index = handleCustomMessageID(flowNode["inf index"]); - message->next_node_idx = handleCustomFlowID(flowNode["next flow index"]); + message->msg_index = handleCustomMessageID(flowNode["inf index"].as()); + message->next_node_idx = handleCustomFlowID(flowNode["next flow index"].as()); // If a custom message is too long, split it up among additional flow/message nodes if (message->msg_index >= BASE_CUSTOM_MSG_AND_FLOW_ID) { @@ -1543,13 +1600,9 @@ RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { auto extraTextName = textName + std::to_string(i + 1); world->AddNewText(extraTextName) = extraText[i]; - // Kinda silly, but means we don't need to create another function - // to handle direct string names. - YAML::Node node{}; - node["name"] = extraTextName; // Create new Flow and Message Ids for the split text object - auto newCustomFlowIndex = handleCustomFlowID(node["name"]); - auto newCustomMessageIndex = handleCustomMessageID(node["name"]); + auto newCustomFlowIndex = handleCustomFlowID(extraTextName); + auto newCustomMessageIndex = handleCustomMessageID(extraTextName); // Create the new flow node. We're storing its own flow index with // itself for now, but we'll shift it back to the previous node later @@ -1624,7 +1677,7 @@ RandomizerContext WriteSeedData(randomizer::logic::world::World* world) { messageId = overrideNode["Message Id"].as(); } else { // If no message id specified, assume a custom one - messageId = handleCustomMessageID(overrideNode["Name"]); + messageId = handleCustomMessageID(overrideNode["Name"].as()); } u32 key = (group << 16) | messageId; for (auto language : randomizer::supportedLanguages) { diff --git a/src/dusk/randomizer/generator/data/flow_patches.yaml b/src/dusk/randomizer/generator/data/flow_patches.yaml index 51d99be4ac..43eb86aff5 100644 --- a/src/dusk/randomizer/generator/data/flow_patches.yaml +++ b/src/dusk/randomizer/generator/data/flow_patches.yaml @@ -42,18 +42,21 @@ query: 6 parameters: 0x0064 next node index: 0x222 + # Patch Charlo to take 100 rupees from Link instead of 30 - index: 0x34E type: event event: 41 parameters: 0x00000064 next node index: 0x226 + # Patch Charlo to add 100 rupees to his counter instead of 30 - index: 0x357 type: event event: 3 parameters: 0x00000064 next node index: 0x22B + # Patch Malo Mart door person to not check for time of day. # Change from branch node that checks time of day to event node # that does nothing. @@ -63,6 +66,22 @@ parameters: 0x00000000 next node index: 0x10C + # Patch Jovani to skip checking whether we've received the first + # or second reward and skip straight to the second reward if we're + # talking to him for the first time with 60 souls + - index: 0x844 + type: message + inf index: 0x322 + next flow index: 0x851 + + # Patch Jovani to check if we've received the 20 reward yet at + # the end of the 60 reward sequence. + - index: 0x81F + type: event + event: 14 + parameters: 0x00000063 + next node index: Jovani Check 20 Reward Obtained + 5: # zel_05.bmg # Patch Yeta flow to always give the map check even if the player has obtained the Ordon Cheese - index: 0x8 @@ -86,6 +105,13 @@ parameters: 0x00000000 next node index: 0x1AC + # Patch Cave of Ordeals Great Fairy to skip over the check + # for an empty bottle the first time + - index: 0x850 + type: message + inf index: 0x25B + next flow index: 0x202 + #6: # zel_06.bmg #7: # zel_07.bmg #8: # zel_08.bmg @@ -277,6 +303,18 @@ parameters: 0x00000000 next node index: 0x116 + # Check to see if we've obtained the 20 Poe Soul Reward. + # If we haven't then branch to giving the reward + - name: Jovani Check 20 Reward Obtained + type: branch + num results: 2 + query: 1 + parameters: 0x0272 + next node index: 0xFFFF + results: + - 0xFFFF # Yes, we've obtained the reward, do nothing + - Jovani Give 20 Reward + ################################################# # HINT SIGNS # ################################################# diff --git a/src/dusk/randomizer/generator/data/locations.yaml b/src/dusk/randomizer/generator/data/locations.yaml index 4f013da5e0..14295bcaec 100644 --- a/src/dusk/randomizer/generator/data/locations.yaml +++ b/src/dusk/randomizer/generator/data/locations.yaml @@ -33,6 +33,13 @@ - Ordona Province - Npc Metadata: + FLW Event: + - Group: 1 + Index: 0x18F + Next Node Index: 0x116 + Parameters: 0x0001004A + Location Flag: + Save Bit Label: 0x20 Name Lookup: - Uli Cradle Delivery Event Flag: 0x0301 @@ -44,6 +51,11 @@ - Npc - Ordona Province Metadata: + FLW Event: + - Group: 1 + Index: 0x6DF + Next Node Index: 0x44A + Parameters: 0x00010065 Name Lookup: - Ordon Cat Rescue Event Flag: 0x1408 @@ -277,6 +289,11 @@ - Npc - Ordona Province Metadata: + FLW Event: + - Group: 1 + Index: 0x345 + Next Node Index: 0x216 + Parameters: 0x00010021 Name Lookup: - Herding Goats Reward Event Flag: 0x4240 @@ -493,6 +510,11 @@ - Faron Woods - ARC Metadata: + FLW Event: + - Group: 6 + Index: 0x72 + Next Node Index: 0x54 + Parameters: 0x0001009D Name Lookup: - Coro Bottle Event Flag: 0x1A08 @@ -1471,6 +1493,17 @@ - ARC - Remote Location Metadata: + FLW Event: + # Win the game without ever using the hawkeye + - Group: 2 + Index: 0x124 + Next Node Index: 0xA6 + Parameters: 0x00010021 + # Win the game, but have used hawkeye before + - Group: 2 + Index: 0xE0 + Next Node Index: 0x71 + Parameters: 0x00010021 Name Lookup: - Talo Sharpshooting Event Flag: 0x0920 @@ -1483,6 +1516,13 @@ - Kakariko Village - ARC Metadata: + FLW Event: + - Group: 2 + Index: 0x19A + Next Node Index: 0xF5 + Parameters: 0x00010080 + Location Flag: + Save Bit Label: 0x79 Name Lookup: - Renados Letter Event Flag: 0x0F80 @@ -1507,6 +1547,13 @@ - Kakariko Graveyard - ARC Metadata: + FLW Event: + - Group: 2 + Index: 0x55 + Next Node Index: 0x25 + Parameters: 0x00010031 + Location Flag: + Save Bit Label: 0x46 Name Lookup: - Rutelas Blessing Event Flag: 0x0804 @@ -1519,6 +1566,13 @@ - Kakariko Graveyard - ARC Metadata: + FLW Event: + - Group: 2 + Index: 0x339 + Next Node Index: 0x1ED + Parameters: 0x0001003D + Location Flag: + Save Bit Label: 0x1E0 Name Lookup: - Gift From Ralis Event Flag: 0x3B80 @@ -1887,6 +1941,13 @@ - ARC - Remote Location Metadata: + FLW Event: + - Group: 6 + Index: 0x610 + Next Node Index: 0x439 + Parameters: 0x000100E9 + Location Flag: + Save Bit Label: 0x30F Name Lookup: - Skybook From Impaz Event Flag: 0x5F80 @@ -1922,6 +1983,13 @@ - Hidden Village - ARC Metadata: + FLW Event: + - Group: 6 + Index: 0x32 + Next Node Index: 0x2A + Parameters: 0x00010083 + Location Flag: + Save Bit Label: 0x116 Name Lookup: - Ilia Charm Event Flag: 0x2280 @@ -2390,6 +2458,13 @@ - Castle Town - ARC Metadata: + FLW Event: + - Group: 4 + Index: 0x276 + Next Node Index: 0x1A5 + Parameters: 0x00010055 +# Location Flag: Can't be set first otherwise event flow gets messed up +# Save Bit Label: 0x122 Name Lookup: - STAR Prize 1 Event Flag: 0x2308 @@ -2402,6 +2477,13 @@ - Castle Town - ARC Metadata: + FLW Event: + - Group: 4 + Index: 0x269 + Next Node Index: 0x1A1 + Parameters: 0x00010056 +# Location Flag: Can't be set first otherwise event flow gets messed up +# Save Bit Label: 0x125 Name Lookup: - STAR Prize 2 Event Flag: 0x2301 @@ -2471,6 +2553,17 @@ - Castle Town - ARC Metadata: + FLW Event: + # Flow if less than 60 souls + - Group: 4 + Index: 0x841 + Next Node Index: 0x773 + Parameters: 0x00010075 + # Custom flow if 60 souls + - Group: 9 + Index: Jovani Give 20 Reward + Next Node Index: 0x77E + Parameters: 0x00010075 Name Lookup: - Jovani 20 Poe Soul Reward Event Flag: 0x5510 @@ -2485,6 +2578,11 @@ - ARC - Remote Location Metadata: + FLW Event: + - Group: 4 + Index: 0x852 + Next Node Index: 0x781 + Parameters: 0x00010007 Name Lookup: - Jovani 60 Poe Soul Reward Event Flag: 0x3820 @@ -2518,6 +2616,11 @@ - Castle Town - ARC Metadata: + FLW Event: + - Group: 4 + Index: 0x14D + Next Node Index: 0xC6 + Parameters: 0x00010081 Name Lookup: - Telma Invoice Event Flag: 0x2180 @@ -3040,6 +3143,11 @@ - Lake Hylia - ARC Metadata: + FLW Event: + - Group: 8 + Index: 0x180 + Next Node Index: 0xF7 + Parameters: 0x00010090 Name Lookup: - Auru Gift To Fyer Event Flag: 0x2520 @@ -3564,6 +3672,11 @@ - ARC - Remote Location Metadata: + FLW Event: + - Group: 8 + Index: 0x1FC + Next Node Index: 0x152 + Parameters: 0x00010021 Name Lookup: - Plumm Fruit Balloon Minigame Event Flag: 0x2380 @@ -3653,6 +3766,11 @@ - ARC - Remote Location Metadata: + FLW Event: + - Group: 8 + Index: 0x2E4 + Next Node Index: 0x208 + Parameters: 0x00010051 Name Lookup: - Iza Helping Hand Event Flag: 0x0B01 @@ -3666,6 +3784,11 @@ - ARC - Remote Location Metadata: + FLW Event: + - Group: 8 + Index: 0x2EE + Next Node Index: 0x20F + Parameters: 0x0001004F Name Lookup: - Iza Raging Rapids Minigame Event Flag: 0x5908 @@ -3898,6 +4021,11 @@ - Zoras Domain - ARC Metadata: + FLW Event: + - Group: 7 + Index: 0x8 + Next Node Index: 0x1 + Parameters: 0x00010051 Name Lookup: - Zoras Domain Underwater Goron Event Flag: 0x3D10 @@ -3987,6 +4115,11 @@ - Snowpeak Province - ARC Metadata: + FLW Event: + - Group: 6 + Index: 0x282 + Next Node Index: 0x1C6 + Parameters: 0x00010091 Name Lookup: - Ashei Sketch Event Flag: 0x2940 @@ -4077,6 +4210,11 @@ - ARC - Remote Location Metadata: + FLW Event: + - Group: 6 + Index: 0x2F8 + Next Node Index: 0x237 + Parameters: 0x00010021 Name Lookup: - Snowboard Racing Prize Event Flag: 0x3B10 @@ -4724,6 +4862,11 @@ - ARC - Remote Location Metadata: + FLW Event: + - Group: 5 + Index: 0x20A + Next Node Index: 0x18F + Parameters: 0x00010073 Name Lookup: - Cave of Ordeals Great Fairy Reward Event Flag: 0x3E40 @@ -4992,6 +5135,11 @@ - Big Key - ARC Metadata: + FLW Event: + - Group: 5 + Index: 0x237 + Next Node Index: 0x19B + Parameters: 0x000100F9 Name Lookup: - Goron Mines Gor Amato Key Shard Event Flag: 0x3008 # late @@ -5111,6 +5259,11 @@ - Big Key - ARC Metadata: + FLW Event: + - Group: 5 + Index: 0x259 + Next Node Index: 0x1AD + Parameters: 0x000100FA Name Lookup: - Goron Mines Gor Ebizo Key Shard Event Flag: 0x3702 # late @@ -5171,6 +5324,11 @@ - Big Key - ARC Metadata: + FLW Event: + - Group: 5 + Index: 0x248 + Next Node Index: 0x1A4 + Parameters: 0x000100FD Name Lookup: - Goron Mines Gor Liggs Key Shard Event Flag: 0x3701 # late @@ -5892,6 +6050,11 @@ - Dungeon Map - ARC Metadata: + FLW Event: + - Group: 5 + Index: 0x3C8 + Next Node Index: 0x265 + Parameters: 0x00010023 Name Lookup: - Snowpeak Ruins Mansion Map Event Flag: 0x0B10 # late diff --git a/src/dusk/randomizer/generator/logic/hints.cpp b/src/dusk/randomizer/generator/logic/hints.cpp index def496c843..c7b0efcbb7 100644 --- a/src/dusk/randomizer/generator/logic/hints.cpp +++ b/src/dusk/randomizer/generator/logic/hints.cpp @@ -635,6 +635,10 @@ namespace randomizer::logic::hints { static void AssignHintSignHints(const location::LocationPool& hintSigns, std::vector hints, world::World* world) { size_t hintsPerSign = std::ceil(static_cast(hints.size()) / static_cast(hintSigns.size())); + // Don't bother placing hints if there are none + if (hintsPerSign == 0) { + return; + } auto& worlds = world->GetRandomizer()->GetWorlds(); auto& hintSignHints = world->GetHintSignHints(); auto hintSignHintsOriginal = hintSignHints;