diff --git a/files.cmake b/files.cmake index 1a38aa4a54..bdfa4d9216 100644 --- a/files.cmake +++ b/files.cmake @@ -1473,6 +1473,7 @@ set(DUSK_FILES src/dusk/discord_presence.cpp src/dusk/version.cpp # Randomizer files + src/dusk/randomizer/game/flags.cpp src/dusk/randomizer/game/flags.h src/dusk/randomizer/game/stages.cpp src/dusk/randomizer/game/stages.h diff --git a/src/d/actor/d_a_obj_life_container.cpp b/src/d/actor/d_a_obj_life_container.cpp index 8189bc6e45..01f7e6bbb3 100644 --- a/src/d/actor/d_a_obj_life_container.cpp +++ b/src/d/actor/d_a_obj_life_container.cpp @@ -14,6 +14,7 @@ #if TARGET_PC #include "d/actor/d_a_alink.h" +#include "dusk/randomizer/game/flags.h" #include "dusk/randomizer/game/tools.h" #include "dusk/randomizer/game/verify_item_functions.h" #include "dusk/randomizer/game/stages.h" @@ -188,104 +189,126 @@ int daObjLife_c::create() { #if TARGET_PC if (randomizer_IsActive()) { + // Overwrite the item for this location in randomizer u32 params = fopAcM_GetParam(this); - u8 flag = getSaveBitNo(); - u8 stageIdx = getStageID(); - const auto& freestandingOverrides = randomizer_GetContext().mFreestandingItemOverrides; - // If we found an override for this freestanding item - if (freestandingOverrides.contains(stageIdx) && freestandingOverrides.at(stageIdx).contains(flag)) { - // Clear the itemId and set it to out new itemId - params &= 0xFFFFFF00; - u8 overrideItem = freestandingOverrides.at(stageIdx).at(flag); - u8 newItemId = verifyProgressiveItem(overrideItem); - params |= newItemId; - fopAcM_SetParam(this, params); + u8 itemId = params & 0xFF; + u8 roomNo = fopAcM_GetRoomNo(this); + // If this is a golden wolf replacement, handle it differently + if (itemId == dItemNo_Randomizer_ENDING_BLOW_e) { + auto goldenWolfFlags = getCurrentGoldenWolfFlags(roomNo); + // Don't spawn this item if we haven't howled at the howling stone, or if we've already + // obtained the item + if ((goldenWolfFlags.howledAtStoneFlag != 0xFFFF && !dComIfGs_isEventBit(goldenWolfFlags.howledAtStoneFlag)) || + dComIfGs_isEventBit(goldenWolfFlags.obtainedItemFlag)) { + return cPhs_ERROR_e; + } + // Store the map marker flag and obtained item flags to turn off/on later if + // the player collects the item + home.angle.z = goldenWolfFlags.mapMarkerFlag; + home.angle.x = static_cast(goldenWolfFlags.obtainedItemFlag); + // Set the overriden item id + auto& goldenWolfOverrides = randomizer_GetContext().mGoldenWolfOverrides; + itemId = verifyProgressiveItem(goldenWolfOverrides[goldenWolfFlags.obtainedItemFlag]); + } else { + u8 flag = getSaveBitNo(); + u8 stageIdx = getStageID(); + const auto& freestandingOverrides = randomizer_GetContext().mFreestandingItemOverrides; + // If we found an override for this freestanding item + if (freestandingOverrides.contains(stageIdx) && freestandingOverrides.at(stageIdx).contains(flag)) { + // Clear the itemId and set it to out new itemId + u8 overrideItem = freestandingOverrides.at(stageIdx).at(flag); + itemId = verifyProgressiveItem(overrideItem); + } + } - // Also adjust the height of the object depending on the item - switch (newItemId) { - case dItemNo_Randomizer_MASTER_SWORD_e: - case dItemNo_Randomizer_LIGHT_SWORD_e: - case dItemNo_Randomizer_WOOD_SHIELD_e: - case dItemNo_Randomizer_HYLIA_SHIELD_e: - case dItemNo_Randomizer_SHIELD_e: - case dItemNo_Randomizer_SPINNER_e: - { - current.pos.y += 30.f; - break; - } - case dItemNo_Randomizer_WOOD_STICK_e: - { - current.pos.y += 60.f; - break; - } - case dItemNo_Randomizer_SWORD_e: - case dItemNo_Randomizer_MIRROR_PIECE_1_e: - case dItemNo_Randomizer_MIRROR_PIECE_2_e: - case dItemNo_Randomizer_MIRROR_PIECE_3_e: - case dItemNo_Randomizer_MIRROR_PIECE_4_e: - case dItemNo_Randomizer_FUSED_SHADOW_1_e: - case dItemNo_Randomizer_FUSED_SHADOW_2_e: - case dItemNo_Randomizer_FUSED_SHADOW_3_e: - case dItemNo_Randomizer_COPY_ROD_e: - case dItemNo_Randomizer_COPY_ROD_2_e: - { - current.pos.y += 50.f; - break; - } + params &= 0xFFFFFF00; + params |= itemId; + fopAcM_SetParam(this, params); - case dItemNo_Randomizer_BOW_e: - { - current.pos.y += 55.f; - break; - } - case dItemNo_Randomizer_BOOMERANG_e: - case dItemNo_Randomizer_FISHING_ROD_1_e: - case dItemNo_Randomizer_ARROW_LV2_e: - case dItemNo_Randomizer_ARROW_LV3_e: - { - current.pos.y += 40.f; - break; - } - case dItemNo_Randomizer_FOREST_SMALL_KEY_e: - case dItemNo_Randomizer_MINES_SMALL_KEY_e: - case dItemNo_Randomizer_LAKEBED_SMALL_KEY_e: - case dItemNo_Randomizer_ARBITERS_SMALL_KEY_e: - case dItemNo_Randomizer_SNOWPEAK_SMALL_KEY_e: - case dItemNo_Randomizer_TEMPLE_OF_TIME_SMALL_KEY_e: - case dItemNo_Randomizer_CITY_SMALL_KEY_e: - case dItemNo_Randomizer_PALACE_SMALL_KEY_e: - case dItemNo_Randomizer_HYRULE_SMALL_KEY_e: - case dItemNo_Randomizer_FOREST_BOSS_KEY_e: - case dItemNo_Randomizer_LAKEBED_BOSS_KEY_e: - case dItemNo_Randomizer_ARBITERS_BOSS_KEY_e: - case dItemNo_Randomizer_TEMPLE_OF_TIME_BOSS_KEY_e: - case dItemNo_Randomizer_CITY_BOSS_KEY_e: - case dItemNo_Randomizer_PALACE_BOSS_KEY_e: - case dItemNo_Randomizer_HYRULE_BOSS_KEY_e: - case dItemNo_Randomizer_SMALL_KEY2_e: - case dItemNo_Randomizer_LV5_BOSS_KEY_e: - case dItemNo_Randomizer_CAMP_SMALL_KEY_e: - case dItemNo_Randomizer_BOSSRIDER_KEY_e: - case dItemNo_Randomizer_PACHINKO_e: - case dItemNo_Randomizer_BOMB_BAG_LV2_e: - case dItemNo_Randomizer_BOMB_BAG_LV1_e: - case dItemNo_Randomizer_BOMB_IN_BAG_e: - case dItemNo_Randomizer_NORMAL_BOMB_e: - case dItemNo_Randomizer_POU_SPIRIT_e: - { - current.pos.y += 20.f; - break; - } + // Also adjust the height of the object depending on the item + switch (itemId) { + case dItemNo_Randomizer_MASTER_SWORD_e: + case dItemNo_Randomizer_LIGHT_SWORD_e: + case dItemNo_Randomizer_WOOD_SHIELD_e: + case dItemNo_Randomizer_HYLIA_SHIELD_e: + case dItemNo_Randomizer_SHIELD_e: + case dItemNo_Randomizer_SPINNER_e: + { + current.pos.y += 30.f; + break; + } + case dItemNo_Randomizer_WOOD_STICK_e: + { + current.pos.y += 60.f; + break; + } + case dItemNo_Randomizer_SWORD_e: + case dItemNo_Randomizer_MIRROR_PIECE_1_e: + case dItemNo_Randomizer_MIRROR_PIECE_2_e: + case dItemNo_Randomizer_MIRROR_PIECE_3_e: + case dItemNo_Randomizer_MIRROR_PIECE_4_e: + case dItemNo_Randomizer_FUSED_SHADOW_1_e: + case dItemNo_Randomizer_FUSED_SHADOW_2_e: + case dItemNo_Randomizer_FUSED_SHADOW_3_e: + case dItemNo_Randomizer_COPY_ROD_e: + case dItemNo_Randomizer_COPY_ROD_2_e: + { + current.pos.y += 50.f; + break; + } - case dItemNo_Randomizer_ARMOR_e: - { - current.pos.y += 25.f; - break; - } - default: - { - break; - } + case dItemNo_Randomizer_BOW_e: + { + current.pos.y += 55.f; + break; + } + case dItemNo_Randomizer_BOOMERANG_e: + case dItemNo_Randomizer_FISHING_ROD_1_e: + case dItemNo_Randomizer_ARROW_LV2_e: + case dItemNo_Randomizer_ARROW_LV3_e: + { + current.pos.y += 40.f; + break; + } + case dItemNo_Randomizer_FOREST_SMALL_KEY_e: + case dItemNo_Randomizer_MINES_SMALL_KEY_e: + case dItemNo_Randomizer_LAKEBED_SMALL_KEY_e: + case dItemNo_Randomizer_ARBITERS_SMALL_KEY_e: + case dItemNo_Randomizer_SNOWPEAK_SMALL_KEY_e: + case dItemNo_Randomizer_TEMPLE_OF_TIME_SMALL_KEY_e: + case dItemNo_Randomizer_CITY_SMALL_KEY_e: + case dItemNo_Randomizer_PALACE_SMALL_KEY_e: + case dItemNo_Randomizer_HYRULE_SMALL_KEY_e: + case dItemNo_Randomizer_FOREST_BOSS_KEY_e: + case dItemNo_Randomizer_LAKEBED_BOSS_KEY_e: + case dItemNo_Randomizer_ARBITERS_BOSS_KEY_e: + case dItemNo_Randomizer_TEMPLE_OF_TIME_BOSS_KEY_e: + case dItemNo_Randomizer_CITY_BOSS_KEY_e: + case dItemNo_Randomizer_PALACE_BOSS_KEY_e: + case dItemNo_Randomizer_HYRULE_BOSS_KEY_e: + case dItemNo_Randomizer_SMALL_KEY2_e: + case dItemNo_Randomizer_LV5_BOSS_KEY_e: + case dItemNo_Randomizer_CAMP_SMALL_KEY_e: + case dItemNo_Randomizer_BOSSRIDER_KEY_e: + case dItemNo_Randomizer_PACHINKO_e: + case dItemNo_Randomizer_BOMB_BAG_LV2_e: + case dItemNo_Randomizer_BOMB_BAG_LV1_e: + case dItemNo_Randomizer_BOMB_IN_BAG_e: + case dItemNo_Randomizer_NORMAL_BOMB_e: + case dItemNo_Randomizer_POU_SPIRIT_e: + { + current.pos.y += 20.f; + break; + } + + case dItemNo_Randomizer_ARMOR_e: + { + current.pos.y += 25.f; + break; + } + default: + { + break; } } } @@ -476,6 +499,19 @@ int daObjLife_c::actionGetDemo() { if (savebit != 0xFF) { fopAcM_onItem(this, savebit); } +#if TARGET_PC + // In randomizer, turn off the map marker flag for this golden wolf replacement item + // if we're collecting it. We store the map marker flag in unused home.angle.z + // Also set the flag for having collected this golden wolf item, stored in home.angle.x + if (randomizer_IsActive()) { + if (static_cast(home.angle.z) != 0xFFFF) { + dComIfGs_offSwitch(static_cast(home.angle.z), fopAcM_GetRoomNo(this)); + } + if (static_cast(home.angle.x) != 0xFFFF) { + dComIfGs_onEventBit(static_cast(home.angle.x)); + } + } +#endif if (m_itemNo == dItemNo_KAKERA_HEART_e) { if (strcmp(dComIfGp_getStartStageName(), "F_SP121") == 0) { diff --git a/src/d/d_item.cpp b/src/d/d_item.cpp index eaf8feb83c..d46857a763 100644 --- a/src/d/d_item.cpp +++ b/src/d/d_item.cpp @@ -274,262 +274,262 @@ static void (*item_func_ptr[256])() = { #if TARGET_PC static void (*item_func_ptr_randomizer[256])() = { - item_func_HEART, - item_func_GREEN_RUPEE, - item_func_BLUE_RUPEE, - item_func_YELLOW_RUPEE, - item_func_RED_RUPEE, - item_func_PURPLE_RUPEE, - item_func_ORANGE_RUPEE, - item_func_SILVER_RUPEE, - item_func_S_MAGIC, - item_func_L_MAGIC, - item_func_BOMB_5, - item_func_BOMB_10, - item_func_BOMB_20, - item_func_BOMB_30, - item_func_ARROW_10, - item_func_ARROW_20, - item_func_ARROW_30, - item_func_ARROW_1, - item_func_PACHINKO_SHOT, - item_func_FOOLISH_ITEM, - item_func_ORDON_PORTAL, - item_func_SOUTH_FARON_PORTAL, - item_func_WATER_BOMB_5, - item_func_WATER_BOMB_10, - item_func_WATER_BOMB_20, - item_func_WATER_BOMB_30, - item_func_BOMB_INSECT_5, - item_func_BOMB_INSECT_10, - item_func_BOMB_INSECT_20, - item_func_BOMB_INSECT_30, - item_func_RECOVER_FAILY, - item_func_TRIPLE_HEART, - item_func_SMALL_KEY, - item_func_KAKERA_HEART, - item_func_UTUWA_HEART, - item_func_MAP, - item_func_COMPUS, - item_func_DUNGEON_EXIT, - item_func_BOSS_KEY, - item_func_DUNGEON_BACK, - item_func_SWORD, - item_func_MASTER_SWORD, - item_func_WOOD_SHIELD, - item_func_SHIELD, - item_func_HYLIA_SHIELD, - item_func_TKS_LETTER, - item_func_WEAR_CASUAL, - item_func_WEAR_KOKIRI, - item_func_ARMOR, - item_func_WEAR_ZORA, - item_func_MAGIC_LV1, - item_func_DUNGEON_EXIT_2, - item_func_WALLET_LV1, - item_func_WALLET_LV2, - item_func_WALLET_LV3, - item_func_noentry, - item_func_noentry, - item_func_UPPER_ZORAS_RIVER_PORTAL, - item_func_CASTLE_TOWN_PORTAL, - item_func_GERUDO_DESERT_PORTAL, - item_func_NORTH_FARON_PORTAL, - item_func_ZORAS_JEWEL, - item_func_HAWK_EYE, - item_func_WOOD_STICK, - item_func_BOOMERANG, - item_func_SPINNER, - item_func_IRONBALL, - item_func_BOW, - item_func_HOOKSHOT, - item_func_HVY_BOOTS, - item_func_COPY_ROD, - item_func_W_HOOKSHOT, - item_func_KANTERA, - item_func_LIGHT_SWORD, - item_func_FISHING_ROD_1, - item_func_PACHINKO, - item_func_COPY_ROD_2, - item_func_KAKARIKO_GORGE_PORTAL, - item_func_KAKARIKO_VILLAGE_PORTAL, - item_func_BOMB_BAG_LV2, - item_func_BOMB_BAG_LV1, - item_func_BOMB_IN_BAG, - item_func_DEATH_MOUNTAIN_PORTAL, - item_func_LIGHT_ARROW, - item_func_ARROW_LV1, - item_func_ARROW_LV2, - item_func_ARROW_LV3, - item_func_ZORAS_DOMAIN_PORTAL, - item_func_LURE_ROD, - item_func_BOMB_ARROW, - item_func_HAWK_ARROW, - item_func_BEE_ROD, - item_func_JEWEL_ROD, - item_func_WORM_ROD, - item_func_JEWEL_BEE_ROD, - item_func_JEWEL_WORM_ROD, - item_func_EMPTY_BOTTLE, - item_func_RED_BOTTLE, - item_func_GREEN_BOTTLE, - item_func_BLUE_BOTTLE, - item_func_MILK_BOTTLE, - item_func_HALF_MILK_BOTTLE, - item_func_OIL_BOTTLE, - item_func_WATER_BOTTLE, - item_func_OIL_BOTTLE2, - item_func_RED_BOTTLE2, - item_func_UGLY_SOUP, - item_func_HOT_SPRING, - item_func_FAIRY_BOTTLE, - item_func_HOT_SPRING2, - item_func_OIL2, - item_func_OIL, - item_func_NORMAL_BOMB, - item_func_WATER_BOMB, - item_func_POKE_BOMB, - item_func_FAIRY_DROP, - item_func_WORM, - item_func_DROP_BOTTLE, - item_func_BEE_CHILD, - item_func_CHUCHU_RARE, - item_func_CHUCHU_RED, - item_func_CHUCHU_BLUE, - item_func_CHUCHU_GREEN, - item_func_CHUCHU_YELLOW, - item_func_CHUCHU_PURPLE, - item_func_LV1_SOUP, - item_func_LV2_SOUP, - item_func_LV3_SOUP, - item_func_LETTER, - item_func_BILL, - item_func_WOOD_STATUE, - item_func_IRIAS_PENDANT, - item_func_HORSE_FLUTE, - item_func_FOREST_SMALL_KEY, - item_func_MINES_SMALL_KEY, - item_func_LAKEBED_SMALL_KEY, - item_func_ARBITERS_SMALL_KEY, - item_func_SNOWPEAK_SMALL_KEY, - item_func_TEMPLE_OF_TIME_SMALL_KEY, - item_func_CITY_SMALL_KEY, - item_func_PALACE_SMALL_KEY, - item_func_HYRULE_SMALL_KEY, - item_func_CAMP_SMALL_KEY, - item_func_LAKE_HYLIA_PORTAL, - item_func_RAFRELS_MEMO, - item_func_ASHS_SCRIBBLING, - item_func_FOREST_BOSS_KEY, - item_func_LAKEBED_BOSS_KEY, - item_func_ARBITERS_BOSS_KEY, - item_func_TEMPLE_OF_TIME_BOSS_KEY, - item_func_CITY_BOSS_KEY, - item_func_PALACE_BOSS_KEY, - item_func_HYRULE_BOSS_KEY, - item_func_FOREST_COMPASS, - item_func_MINES_COMPASS, - item_func_LAKEBED_COMPASS, - item_func_CHUCHU_YELLOW2, - item_func_OIL_BOTTLE3, - item_func_SHOP_BEE_CHILD, - item_func_CHUCHU_BLACK, - item_func_LIGHT_DROP, - item_func_DROP_CONTAINER, - item_func_DROP_CONTAINER02, - item_func_DROP_CONTAINER03, - item_func_FILLED_CONTAINER, - item_func_MIRROR_PIECE_2, - item_func_MIRROR_PIECE_3, - item_func_MIRROR_PIECE_4, - item_func_ARBITERS_COMPASS, - item_func_SNOWPEAK_COMPASS, - item_func_TEMPLE_OF_TIME_COMPASS, - item_func_CITY_COMPASS, - item_func_PALACE_COMPASS, - item_func_HYRULE_COMPASS, - item_func_MIRROR_CHAMBER_PORTAL, - item_func_SNOWPEAK_PORTAL, - item_func_SMELL_YELIA_POUCH, - item_func_SMELL_PUMPKIN, - item_func_SMELL_POH, - item_func_SMELL_FISH, - item_func_SMELL_CHILDREN, - item_func_SMELL_MEDICINE, - item_func_FOREST_MAP, - item_func_MINES_MAP, - item_func_LAKEBED_MAP, - item_func_ARBITERS_MAP, - item_func_SNOWPEAK_MAP, - item_func_TEMPLE_OF_TIME_MAP, - item_func_CITY_MAP, - item_func_PALACE_MAP, - item_func_HYRULE_MAP, - item_func_SACRED_GROVE_PORTAL, - item_func_M_BEETLE, - item_func_F_BEETLE, - item_func_M_BUTTERFLY, - item_func_F_BUTTERFLY, - item_func_M_STAG_BEETLE, - item_func_F_STAG_BEETLE, - item_func_M_GRASSHOPPER, - item_func_F_GRASSHOPPER, - item_func_M_NANAFUSHI, - item_func_F_NANAFUSHI, - item_func_M_DANGOMUSHI, - item_func_F_DANGOMUSHI, - item_func_M_MANTIS, - item_func_F_MANTIS, - item_func_M_LADYBUG, - item_func_F_LADYBUG, - item_func_M_SNAIL, - item_func_F_SNAIL, - item_func_M_DRAGONFLY, - item_func_F_DRAGONFLY, - item_func_M_ANT, - item_func_F_ANT, - item_func_M_MAYFLY, - item_func_F_MAYFLY, - item_func_FUSED_SHADOW_1, - item_func_FUSED_SHADOW_2, - item_func_FUSED_SHADOW_3, - item_func_MIRROR_PIECE_1, - item_func_noentry, - item_func_noentry, - item_func_noentry, - item_func_noentry, - item_func_POU_SPIRIT, - item_func_ENDING_BLOW, - item_func_SHIELD_ATTACK, - item_func_BACK_SLICE, - item_func_HELM_SPLITTER, - item_func_MORTAL_DRAW, - item_func_JUMP_STRIKE, - item_func_GREAT_SPIN, - item_func_ELDIN_BRIDGE_PORTAL, - item_func_ANCIENT_DOCUMENT, - item_func_AIR_LETTER, - item_func_ANCIENT_DOCUMENT2, - item_func_LV7_DUNGEON_EXIT, - item_func_LINKS_SAVINGS, - item_func_SMALL_KEY2, - item_func_POU_FIRE1, - item_func_POU_FIRE2, - item_func_POU_FIRE3, - item_func_POU_FIRE4, - item_func_BOSSRIDER_KEY, - item_func_TOMATO_PUREE, - item_func_TASTE, - item_func_LV5_BOSS_KEY, - item_func_SURFBOARD, - item_func_KANTERA2, - item_func_L2_KEY_PIECES1, - item_func_L2_KEY_PIECES2, - item_func_L2_KEY_PIECES3, - item_func_KEY_OF_CARAVAN, - item_func_LV2_BOSS_KEY, - item_func_KEY_OF_FILONE, - item_func_noentry, + /* 0x00 */ item_func_HEART, + /* 0x01 */ item_func_GREEN_RUPEE, + /* 0x02 */ item_func_BLUE_RUPEE, + /* 0x03 */ item_func_YELLOW_RUPEE, + /* 0x04 */ item_func_RED_RUPEE, + /* 0x05 */ item_func_PURPLE_RUPEE, + /* 0x06 */ item_func_ORANGE_RUPEE, + /* 0x07 */ item_func_SILVER_RUPEE, + /* 0x08 */ item_func_S_MAGIC, + /* 0x09 */ item_func_L_MAGIC, + /* 0x0A */ item_func_BOMB_5, + /* 0x0B */ item_func_BOMB_10, + /* 0x0C */ item_func_BOMB_20, + /* 0x0D */ item_func_BOMB_30, + /* 0x0E */ item_func_ARROW_10, + /* 0x0F */ item_func_ARROW_20, + /* 0x10 */ item_func_ARROW_30, + /* 0x11 */ item_func_ARROW_1, + /* 0x12 */ item_func_PACHINKO_SHOT, + /* 0x13 */ item_func_FOOLISH_ITEM, + /* 0x14 */ item_func_ORDON_PORTAL, + /* 0x15 */ item_func_SOUTH_FARON_PORTAL, + /* 0x16 */ item_func_WATER_BOMB_5, + /* 0x17 */ item_func_WATER_BOMB_10, + /* 0x18 */ item_func_WATER_BOMB_20, + /* 0x19 */ item_func_WATER_BOMB_30, + /* 0x1A */ item_func_BOMB_INSECT_5, + /* 0x1B */ item_func_BOMB_INSECT_10, + /* 0x1C */ item_func_BOMB_INSECT_20, + /* 0x1D */ item_func_BOMB_INSECT_30, + /* 0x1E */ item_func_RECOVER_FAILY, + /* 0x1F */ item_func_TRIPLE_HEART, + /* 0x20 */ item_func_SMALL_KEY, + /* 0x21 */ item_func_KAKERA_HEART, + /* 0x22 */ item_func_UTUWA_HEART, + /* 0x23 */ item_func_MAP, + /* 0x24 */ item_func_COMPUS, + /* 0x25 */ item_func_DUNGEON_EXIT, + /* 0x26 */ item_func_BOSS_KEY, + /* 0x27 */ item_func_DUNGEON_BACK, + /* 0x28 */ item_func_SWORD, + /* 0x29 */ item_func_MASTER_SWORD, + /* 0x2A */ item_func_WOOD_SHIELD, + /* 0x2B */ item_func_SHIELD, + /* 0x2C */ item_func_HYLIA_SHIELD, + /* 0x2D */ item_func_TKS_LETTER, + /* 0x2E */ item_func_WEAR_CASUAL, + /* 0x2F */ item_func_WEAR_KOKIRI, + /* 0x30 */ item_func_ARMOR, + /* 0x31 */ item_func_WEAR_ZORA, + /* 0x32 */ item_func_MAGIC_LV1, + /* 0x33 */ item_func_DUNGEON_EXIT_2, + /* 0x34 */ item_func_WALLET_LV1, + /* 0x35 */ item_func_WALLET_LV2, + /* 0x36 */ item_func_WALLET_LV3, + /* 0x37 */ item_func_noentry, + /* 0x38 */ item_func_noentry, + /* 0x39 */ item_func_UPPER_ZORAS_RIVER_PORTAL, + /* 0x3A */ item_func_CASTLE_TOWN_PORTAL, + /* 0x3B */ item_func_GERUDO_DESERT_PORTAL, + /* 0x3C */ item_func_NORTH_FARON_PORTAL, + /* 0x3D */ item_func_ZORAS_JEWEL, + /* 0x3E */ item_func_HAWK_EYE, + /* 0x3F */ item_func_WOOD_STICK, + /* 0x40 */ item_func_BOOMERANG, + /* 0x41 */ item_func_SPINNER, + /* 0x42 */ item_func_IRONBALL, + /* 0x43 */ item_func_BOW, + /* 0x44 */ item_func_HOOKSHOT, + /* 0x45 */ item_func_HVY_BOOTS, + /* 0x46 */ item_func_COPY_ROD, + /* 0x47 */ item_func_W_HOOKSHOT, + /* 0x48 */ item_func_KANTERA, + /* 0x49 */ item_func_LIGHT_SWORD, + /* 0x4A */ item_func_FISHING_ROD_1, + /* 0x4B */ item_func_PACHINKO, + /* 0x4C */ item_func_COPY_ROD_2, + /* 0x4D */ item_func_KAKARIKO_GORGE_PORTAL, + /* 0x4E */ item_func_KAKARIKO_VILLAGE_PORTAL, + /* 0x4F */ item_func_BOMB_BAG_LV2, + /* 0x50 */ item_func_BOMB_BAG_LV1, + /* 0x51 */ item_func_BOMB_IN_BAG, + /* 0x52 */ item_func_DEATH_MOUNTAIN_PORTAL, + /* 0x53 */ item_func_LIGHT_ARROW, + /* 0x54 */ item_func_ARROW_LV1, + /* 0x55 */ item_func_ARROW_LV2, + /* 0x56 */ item_func_ARROW_LV3, + /* 0x57 */ item_func_ZORAS_DOMAIN_PORTAL, + /* 0x58 */ item_func_LURE_ROD, + /* 0x59 */ item_func_BOMB_ARROW, + /* 0x5A */ item_func_HAWK_ARROW, + /* 0x5B */ item_func_BEE_ROD, + /* 0x5C */ item_func_JEWEL_ROD, + /* 0x5D */ item_func_WORM_ROD, + /* 0x5E */ item_func_JEWEL_BEE_ROD, + /* 0x5F */ item_func_JEWEL_WORM_ROD, + /* 0x60 */ item_func_EMPTY_BOTTLE, + /* 0x61 */ item_func_RED_BOTTLE, + /* 0x62 */ item_func_GREEN_BOTTLE, + /* 0x63 */ item_func_BLUE_BOTTLE, + /* 0x64 */ item_func_MILK_BOTTLE, + /* 0x65 */ item_func_HALF_MILK_BOTTLE, + /* 0x66 */ item_func_OIL_BOTTLE, + /* 0x67 */ item_func_WATER_BOTTLE, + /* 0x68 */ item_func_OIL_BOTTLE2, + /* 0x69 */ item_func_RED_BOTTLE2, + /* 0x6A */ item_func_UGLY_SOUP, + /* 0x6B */ item_func_HOT_SPRING, + /* 0x6C */ item_func_FAIRY_BOTTLE, + /* 0x6D */ item_func_HOT_SPRING2, + /* 0x6E */ item_func_OIL2, + /* 0x6F */ item_func_OIL, + /* 0x70 */ item_func_NORMAL_BOMB, + /* 0x71 */ item_func_WATER_BOMB, + /* 0x72 */ item_func_POKE_BOMB, + /* 0x73 */ item_func_FAIRY_DROP, + /* 0x74 */ item_func_WORM, + /* 0x75 */ item_func_DROP_BOTTLE, + /* 0x76 */ item_func_BEE_CHILD, + /* 0x77 */ item_func_CHUCHU_RARE, + /* 0x78 */ item_func_CHUCHU_RED, + /* 0x79 */ item_func_CHUCHU_BLUE, + /* 0x7A */ item_func_CHUCHU_GREEN, + /* 0x7B */ item_func_CHUCHU_YELLOW, + /* 0x7C */ item_func_CHUCHU_PURPLE, + /* 0x7D */ item_func_LV1_SOUP, + /* 0x7E */ item_func_LV2_SOUP, + /* 0x7F */ item_func_LV3_SOUP, + /* 0x80 */ item_func_LETTER, + /* 0x81 */ item_func_BILL, + /* 0x82 */ item_func_WOOD_STATUE, + /* 0x83 */ item_func_IRIAS_PENDANT, + /* 0x84 */ item_func_HORSE_FLUTE, + /* 0x85 */ item_func_FOREST_SMALL_KEY, + /* 0x86 */ item_func_MINES_SMALL_KEY, + /* 0x87 */ item_func_LAKEBED_SMALL_KEY, + /* 0x88 */ item_func_ARBITERS_SMALL_KEY, + /* 0x89 */ item_func_SNOWPEAK_SMALL_KEY, + /* 0x8A */ item_func_TEMPLE_OF_TIME_SMALL_KEY, + /* 0x8B */ item_func_CITY_SMALL_KEY, + /* 0x8C */ item_func_PALACE_SMALL_KEY, + /* 0x8D */ item_func_HYRULE_SMALL_KEY, + /* 0x8E */ item_func_CAMP_SMALL_KEY, + /* 0x8F */ item_func_LAKE_HYLIA_PORTAL, + /* 0x90 */ item_func_RAFRELS_MEMO, + /* 0x91 */ item_func_ASHS_SCRIBBLING, + /* 0x92 */ item_func_FOREST_BOSS_KEY, + /* 0x93 */ item_func_LAKEBED_BOSS_KEY, + /* 0x94 */ item_func_ARBITERS_BOSS_KEY, + /* 0x95 */ item_func_TEMPLE_OF_TIME_BOSS_KEY, + /* 0x96 */ item_func_CITY_BOSS_KEY, + /* 0x97 */ item_func_PALACE_BOSS_KEY, + /* 0x98 */ item_func_HYRULE_BOSS_KEY, + /* 0x99 */ item_func_FOREST_COMPASS, + /* 0x9A */ item_func_MINES_COMPASS, + /* 0x9B */ item_func_LAKEBED_COMPASS, + /* 0x9C */ item_func_CHUCHU_YELLOW2, + /* 0x9D */ item_func_OIL_BOTTLE3, + /* 0x9E */ item_func_SHOP_BEE_CHILD, + /* 0x9F */ item_func_CHUCHU_BLACK, + /* 0xA0 */ item_func_LIGHT_DROP, + /* 0xA1 */ item_func_DROP_CONTAINER, + /* 0xA2 */ item_func_DROP_CONTAINER02, + /* 0xA3 */ item_func_DROP_CONTAINER03, + /* 0xA4 */ item_func_FILLED_CONTAINER, + /* 0xA5 */ item_func_MIRROR_PIECE_2, + /* 0xA6 */ item_func_MIRROR_PIECE_3, + /* 0xA7 */ item_func_MIRROR_PIECE_4, + /* 0xA8 */ item_func_ARBITERS_COMPASS, + /* 0xA9 */ item_func_SNOWPEAK_COMPASS, + /* 0xAA */ item_func_TEMPLE_OF_TIME_COMPASS, + /* 0xAB */ item_func_CITY_COMPASS, + /* 0xAC */ item_func_PALACE_COMPASS, + /* 0xAD */ item_func_HYRULE_COMPASS, + /* 0xAE */ item_func_MIRROR_CHAMBER_PORTAL, + /* 0xAF */ item_func_SNOWPEAK_PORTAL, + /* 0xB0 */ item_func_SMELL_YELIA_POUCH, + /* 0xB1 */ item_func_SMELL_PUMPKIN, + /* 0xB2 */ item_func_SMELL_POH, + /* 0xB3 */ item_func_SMELL_FISH, + /* 0xB4 */ item_func_SMELL_CHILDREN, + /* 0xB5 */ item_func_SMELL_MEDICINE, + /* 0xB6 */ item_func_FOREST_MAP, + /* 0xB7 */ item_func_MINES_MAP, + /* 0xB8 */ item_func_LAKEBED_MAP, + /* 0xB9 */ item_func_ARBITERS_MAP, + /* 0xBA */ item_func_SNOWPEAK_MAP, + /* 0xBB */ item_func_TEMPLE_OF_TIME_MAP, + /* 0xBC */ item_func_CITY_MAP, + /* 0xBD */ item_func_PALACE_MAP, + /* 0xBE */ item_func_HYRULE_MAP, + /* 0xBF */ item_func_SACRED_GROVE_PORTAL, + /* 0xC0 */ item_func_M_BEETLE, + /* 0xC1 */ item_func_F_BEETLE, + /* 0xC2 */ item_func_M_BUTTERFLY, + /* 0xC3 */ item_func_F_BUTTERFLY, + /* 0xC4 */ item_func_M_STAG_BEETLE, + /* 0xC5 */ item_func_F_STAG_BEETLE, + /* 0xC6 */ item_func_M_GRASSHOPPER, + /* 0xC7 */ item_func_F_GRASSHOPPER, + /* 0xC8 */ item_func_M_NANAFUSHI, + /* 0xC9 */ item_func_F_NANAFUSHI, + /* 0xCA */ item_func_M_DANGOMUSHI, + /* 0xCB */ item_func_F_DANGOMUSHI, + /* 0xCC */ item_func_M_MANTIS, + /* 0xCD */ item_func_F_MANTIS, + /* 0xCE */ item_func_M_LADYBUG, + /* 0xCF */ item_func_F_LADYBUG, + /* 0xD0 */ item_func_M_SNAIL, + /* 0xD1 */ item_func_F_SNAIL, + /* 0xD2 */ item_func_M_DRAGONFLY, + /* 0xD3 */ item_func_F_DRAGONFLY, + /* 0xD4 */ item_func_M_ANT, + /* 0xD5 */ item_func_F_ANT, + /* 0xD6 */ item_func_M_MAYFLY, + /* 0xD7 */ item_func_F_MAYFLY, + /* 0xD8 */ item_func_FUSED_SHADOW_1, + /* 0xD9 */ item_func_FUSED_SHADOW_2, + /* 0xDA */ item_func_FUSED_SHADOW_3, + /* 0xDB */ item_func_MIRROR_PIECE_1, + /* 0xDC */ item_func_noentry, + /* 0xDD */ item_func_noentry, + /* 0xDE */ item_func_noentry, + /* 0xDF */ item_func_noentry, + /* 0xE0 */ item_func_POU_SPIRIT, + /* 0xE1 */ item_func_ENDING_BLOW, + /* 0xE2 */ item_func_SHIELD_ATTACK, + /* 0xE3 */ item_func_BACK_SLICE, + /* 0xE4 */ item_func_HELM_SPLITTER, + /* 0xE5 */ item_func_MORTAL_DRAW, + /* 0xE6 */ item_func_JUMP_STRIKE, + /* 0xE7 */ item_func_GREAT_SPIN, + /* 0xE8 */ item_func_ELDIN_BRIDGE_PORTAL, + /* 0xE9 */ item_func_ANCIENT_DOCUMENT, + /* 0xEA */ item_func_AIR_LETTER, + /* 0xEB */ item_func_ANCIENT_DOCUMENT2, + /* 0xEC */ item_func_LV7_DUNGEON_EXIT, + /* 0xED */ item_func_LINKS_SAVINGS, + /* 0xEE */ item_func_SMALL_KEY2, + /* 0xEF */ item_func_POU_FIRE1, + /* 0xF0 */ item_func_POU_FIRE2, + /* 0xF1 */ item_func_POU_FIRE3, + /* 0xF2 */ item_func_POU_FIRE4, + /* 0xF3 */ item_func_BOSSRIDER_KEY, + /* 0xF4 */ item_func_TOMATO_PUREE, + /* 0xF5 */ item_func_TASTE, + /* 0xF6 */ item_func_LV5_BOSS_KEY, + /* 0xF7 */ item_func_SURFBOARD, + /* 0xF8 */ item_func_KANTERA2, + /* 0xF9 */ item_func_L2_KEY_PIECES1, + /* 0xFA */ item_func_L2_KEY_PIECES2, + /* 0xFB */ item_func_L2_KEY_PIECES3, + /* 0xFC */ item_func_KEY_OF_CARAVAN, + /* 0xFD */ item_func_LV2_BOSS_KEY, + /* 0xFE */ item_func_KEY_OF_FILONE, + /* 0xFF */ item_func_noentry, }; #endif diff --git a/src/dusk/randomizer/game/flags.cpp b/src/dusk/randomizer/game/flags.cpp new file mode 100644 index 0000000000..91f60d658b --- /dev/null +++ b/src/dusk/randomizer/game/flags.cpp @@ -0,0 +1,25 @@ +#include "flags.h" +#include "stages.h" +#include "tools.h" + +goldenWolfFlags getCurrentGoldenWolfFlags(u8 roomNo) { + switch (getStageID()) { + case Ordon_Spring: + return {0x41, HOWLED_AT_DEATH_MOUNTAIN_STONE, GOT_SKILL_FROM_ORDON_WOLF}; + case Faron_Woods: + return {0xFF, 0xFFFF, 0x3C10}; // Custom flag for rando + case Kakariko_Graveyard: + return {0x79, HOWLED_AT_SNOWPEAK_STONE, GOT_SKILL_FROM_GRAVEYARD_WOLF}; + case Outside_Castle_Town: + if (roomNo == 8) { + return {0x29, HOWLED_AT_UPPER_ZORAS_RIVER_STONE, GOT_SKILL_FROM_WEST_CT_WOLF}; + } + return {0x2A, HOWLED_AT_SACRED_GROVE_OUTSIDE_STONE, GOT_SKILL_FROM_SOUTH_CT_FIELD_WOLF}; + case Castle_Town: + return {0x32, HOWLED_AT_HIDDEN_VILLAGE_STONE, GOT_SKILL_FROM_BARRIER_WOLF}; + case Gerudo_Desert: + return {0x32, HOWLED_AT_LAKE_HYLIA_STONE, GOT_SKILL_FROM_BULBLIN_CAMP_WOLF}; + default: + return {0xFF, 0xFFFF, 0xFFFF}; + } +} \ No newline at end of file diff --git a/src/dusk/randomizer/game/flags.h b/src/dusk/randomizer/game/flags.h index 2b46e54763..4a06d820e1 100644 --- a/src/dusk/randomizer/game/flags.h +++ b/src/dusk/randomizer/game/flags.h @@ -398,7 +398,7 @@ enum EventFlags TALKED_TO_YETA_AFTER_WINNING_RACE_AGAINST_YETO = 0x3B20, WON_SNOWBOARD_RACE_AGAINST_YETO = 0x3B40, GOT_CORAL_EARRING_FROM_RALIS = 0x3B80, - GOT_SKILL_FROM_BULBLIN_CAMP_WOLF = 0x3C01, + GOT_SKILL_FROM_BULBLIN_CAMP_WOLF = 0x3C01, GOT_SKILL_FROM_SOUTH_CT_FIELD_WOLF = 0x3C02, GOT_SKILL_FROM_WEST_CT_WOLF = 0x3C04, GOT_SKILL_FROM_ORDON_WOLF = 0x3C08, @@ -616,3 +616,11 @@ enum EventFlags TALKED_TO_COLIN_ORDON_DAY_1 = 0x6280, HENA_BEAT_ROLLGOAL_8_8 = 0x6302 }; + +struct goldenWolfFlags { + u8 mapMarkerFlag{}; + u16 howledAtStoneFlag{}; + u16 obtainedItemFlag{}; +}; + +goldenWolfFlags getCurrentGoldenWolfFlags(u8 roomNo); \ No newline at end of file diff --git a/src/dusk/randomizer/game/randomizer_context.cpp b/src/dusk/randomizer/game/randomizer_context.cpp index 7fe0a18484..a3f5b58452 100644 --- a/src/dusk/randomizer/game/randomizer_context.cpp +++ b/src/dusk/randomizer/game/randomizer_context.cpp @@ -67,6 +67,9 @@ std::optional RandomizerContext::WriteToFile() { const std::unordered_map u16SkyCharacterOverrides(this->mSkyCharacterOverrides.begin(), this->mSkyCharacterOverrides.end()); out["mSkyCharacterOverrides"] = u16SkyCharacterOverrides; + const std::unordered_map u16GoldenWolfOverrides(this->mGoldenWolfOverrides.begin(), this->mGoldenWolfOverrides.end()); + out["mGoldenWolfOverrides"] = u16GoldenWolfOverrides; + out["mItemLocations"] = this->mItemLocations; out["mStartHour"] = static_cast(this->mStartHour); @@ -172,6 +175,13 @@ std::optional RandomizerContext::LoadFromHash(const std::string& ha this->mSkyCharacterOverrides[key] = itemId; } + // Golden Wolves + for (const auto& goldenWolfNode : in["mGoldenWolfOverrides"]) { + u16 key = goldenWolfNode.first.as(); + u8 itemId = goldenWolfNode.second.as(); + this->mGoldenWolfOverrides[key] = itemId; + } + // Items we call by location name for (const auto& locationNode : in["mItemLocations"]) { const auto& locationName = locationNode.first.as(); @@ -624,6 +634,14 @@ void GenerateAndWriteSeed(std::string& generationStatusMsg) { randoData.mSkyCharacterOverrides[key] = itemId; } + // Golden Wolves + // Keyed by u16 of the event flag for obtaining the golden wolf item + if (location->HasCategories("Golden Wolf")) { + u16 flag = metaData[0]["Flag"].as(); + u8 itemId = location->GetCurrentItem()->GetID(); + randoData.mGoldenWolfOverrides[flag] = itemId; + } + // Items that we lookup just by calling their location name if (location->HasCategories("Location Name Lookup")) { const auto& locationName = metaData.as(); @@ -833,4 +851,4 @@ void GenerateAndWriteSeed(std::string& generationStatusMsg) { } generationStatusMsg = fmt::format("Seed generated! Hash: {}", randoData.mHash); -} \ No newline at end of file +} diff --git a/src/dusk/randomizer/game/randomizer_context.hpp b/src/dusk/randomizer/game/randomizer_context.hpp index 1276fe5608..73b355ff32 100644 --- a/src/dusk/randomizer/game/randomizer_context.hpp +++ b/src/dusk/randomizer/game/randomizer_context.hpp @@ -33,6 +33,7 @@ public: std::unordered_map> mFreestandingItemOverrides{}; std::unordered_map mBugRewardOverrides{}; std::unordered_map mSkyCharacterOverrides{}; + std::unordered_map mGoldenWolfOverrides{}; std::unordered_map mItemLocations{}; u8 mStartHour{0}; u8 mMapBits{}; diff --git a/src/dusk/randomizer/generator/data/actor_additions.yaml b/src/dusk/randomizer/generator/data/actor_additions.yaml index 263c9629c0..8d13cfd283 100644 --- a/src/dusk/randomizer/generator/data/actor_additions.yaml +++ b/src/dusk/randomizer/generator/data/actor_additions.yaml @@ -4,6 +4,24 @@ ACTR: # Objects which have the ACTR dzx type + # Faron Woods + F_SP108: + # Room 6 - North Faron Woods + 6: + # Spawn Item for Golden Wolf in North Faron Woods layer 3 + - name: htPiece + parameters: 0xFFFFFFE1 + position: + x: -36699.4375 + y: 428.600311279297 + z: -23663.64453125 + angle: + x: 0x0000 + y: 0x0000 + z: 0x00FF + layers: + - 3 + F_SP115: # Lake Hylia 0: # Room 0 - Main Lake # Spawn Auru on layers 1 & 3 diff --git a/src/dusk/randomizer/generator/data/actor_patches.yaml b/src/dusk/randomizer/generator/data/actor_patches.yaml index b21a7d38f0..16aae3a2ee 100644 --- a/src/dusk/randomizer/generator/data/actor_patches.yaml +++ b/src/dusk/randomizer/generator/data/actor_patches.yaml @@ -111,6 +111,28 @@ F_SP103: layers: - 0 +# Ordon Spring +F_SP104: + # Room 1 - Main Spring + 1: + # Golden Wolf in Ordon Spring + - name: GWolf + parameters: 0x0E4102FF + position: + x: -1855.69543457031 + y: 311.160461425781 + z: -8084.61572265625 + angle: + x: 0x0BD1 + y: 0x8000 + z: 0x00FF + patch: + # Turn the golden wolf into a htPiece actor with the hidden skill item + name: htPiece + parameters: 0xFFFFFFE1 + layers: + - 2 + # Kakariko Graveyard F_SP111: # Room 0 - Main graveyard @@ -135,6 +157,25 @@ F_SP111: - 2 - 3 + # Golden Wolf in Kakariko Graveyard + - name: GWolf + parameters: 0x037906FF + position: + x: 17575.34375 + y: 500.0 + z: -51.3761901855469 + angle: + x: 0x0BD1 + y: 0xC000 + z: 0x00FF + patch: + # Turn the golden wolf into a htPiece actor with the hidden skill item + name: htPiece + parameters: 0xFFFFFFE1 + layers: + - 2 + - 3 + # Zora's Domain F_SP113: # Room 1 - Main Zora's Domain Area @@ -183,6 +224,28 @@ F_SP115: - 3 - 4 +# Castle Town +F_SP116: + # Room 1 - North Castle Town + 1: + # Golden Wolf in North Castle Town + - name: GWolf + parameters: 0x013207FF + position: + x: 0.0 + y: 800.0 + z: -9500.0 + angle: + x: 0x0BD1 + y: 0x0000 + z: 0x00FF + patch: + # Turn the golden wolf into a htPiece actor with the hidden skill item + name: htPiece + parameters: 0xFFFFFFE1 + layers: + - 1 + # Sacred Grove F_SP117: # Room 1 - Pedestal of Time @@ -542,6 +605,28 @@ F_SP122: - 0 - 6 + # Golden Wolf Outside Castle Town West + - name: GWolf + parameters: 0x042903FF + position: + x: -68310.15625 + y: -1050.0 + z: 5925.4560546875 + angle: + x: 0x0BD1 + y: 0xC16D + z: 0x00FF + patch: + # Turn the golden wolf into a htPiece actor with the hidden skill item + name: htPiece + parameters: 0xFFFFFFE1 + layers: + - 0 + - 4 + - 6 + - 13 + - 14 + # Room 16 - Outside South Castle Town 16: # Male Ladybug @@ -586,6 +671,28 @@ F_SP122: - 1 - 6 + # Golden Wolf Outside Castle Town South + - name: GWolf + parameters: 0x022A04FF + position: + x: -55927.09375 + y: -6100.0 + z: 25315.892578125 + angle: + x: 0x0BD1 + y: 0xE9F5 + z: 0x00FF + patch: + # Turn the golden wolf into a htPiece actor with the hidden skill item + name: htPiece + parameters: 0xFFFFFFE1 + layers: + - 0 + - 4 + - 6 + - 13 + - 14 + # Gerudo Desert F_SP124: # Room 0 - Main Desert @@ -626,6 +733,24 @@ F_SP124: layers: - 0 + # Golden Wolf in Desert + - name: GWolf + parameters: 0x0B3205FF + position: + x: 1112.08215332031 + y: -162.940002441406 + z: 12659.6689453125 + angle: + x: 0x0BD1 + y: 0x0000 + z: 0x00FF + patch: + # Turn the golden wolf into a htPiece actor with the hidden skill item + name: htPiece + parameters: 0xFFFFFFE1 + layers: + - 0 + # Upper Zora's River F_SP126: # Room 0 - Main area diff --git a/src/dusk/randomizer/generator/data/locations.yaml b/src/dusk/randomizer/generator/data/locations.yaml index ff778b827e..c1b02fb8e8 100644 --- a/src/dusk/randomizer/generator/data/locations.yaml +++ b/src/dusk/randomizer/generator/data/locations.yaml @@ -272,15 +272,14 @@ - Tbox ID: 7 Stage: D_SB05 -# TODO - Name: Ordon Spring Golden Wolf Original Item: Progressive Hidden Skill Categories: - Overworld - - Hidden Skill + - Golden Wolf - Ordona Province Metadata: - - None + - Flag: 0x3C08 - Name: Ordon Spring Warp Portal Original Item: Ordon Spring Portal @@ -582,15 +581,14 @@ Metadata: - None -# TODO - Name: Faron Woods Golden Wolf Original Item: Progressive Hidden Skill Categories: - Overworld - - Hidden Skill + - Golden Wolf - Faron Woods Metadata: - - None + - Flag: 0x3C10 - Name: North Faron Woods Deku Baba Chest Original Item: Yellow Rupee @@ -1452,15 +1450,14 @@ Metadata: - None -# TODO - Name: Kakariko Graveyard Golden Wolf Original Item: Progressive Hidden Skill Categories: - Overworld - - Hidden Skill + - Golden Wolf - Kakariko Graveyard Metadata: - - None + - Flag: 0x3D80 - Name: Kakariko Graveyard Open Poe Original Item: Poe Soul @@ -2188,15 +2185,14 @@ - Tbox ID: 0 Stage: D_SB05 -# TODO - Name: West Hyrule Field Golden Wolf Original Item: Progressive Hidden Skill Categories: - Overworld - - Hidden Skill + - Golden Wolf - Hyrule Field - Lanayru Province Metadata: - - None + - Flag: 0x3C04 - Name: Hyrule Field Amphitheater Owl Statue Chest Original Item: Orange Rupee @@ -2288,10 +2284,10 @@ Original Item: Progressive Hidden Skill Categories: - Overworld - - Hidden Skill + - Golden Wolf - Castle Town Metadata: - - None + - Flag: 0x3D40 - Name: Doctors Office Balcony Chest Original Item: Red Rupee @@ -2686,15 +2682,14 @@ - Tbox ID: 1 Stage: D_SB09 -# TODO - Name: Outside South Castle Town Golden Wolf Original Item: Progressive Hidden Skill Categories: - Overworld - - Hidden Skill + - Golden Wolf - Hyrule Field - Lanayru Province Metadata: - - None + - Flag: 0x3C02 - Name: Outside South Castle Town Double Clawshot Chasm Chest Original Item: Orange Rupee @@ -4337,15 +4332,14 @@ - Tbox ID: 13 Stage: F_SP124 -# TODO - Name: Gerudo Desert Golden Wolf Original Item: Progressive Hidden Skill Categories: - Overworld - - Hidden Skill + - Golden Wolf - Gerudo Desert Metadata: - - None + - Flag: 0x3C01 - Name: Outside Bulblin Camp Poe Original Item: Poe Soul diff --git a/src/dusk/randomizer/generator/data/world/overworld/Eldin Province.yaml b/src/dusk/randomizer/generator/data/world/overworld/Eldin Province.yaml index 95d7622f9c..e447663406 100644 --- a/src/dusk/randomizer/generator/data/world/overworld/Eldin Province.yaml +++ b/src/dusk/randomizer/generator/data/world/overworld/Eldin Province.yaml @@ -186,7 +186,7 @@ Kakariko Graveyard Male Ant: Nothing Kakariko Graveyard Grave Poe: Can_Use_Senses and Night Kakariko Graveyard Open Poe: Can_Use_Senses and Night - Kakariko Graveyard Golden Wolf: "'Howl_at_Snowpeak_Mountain_Howling_Stone'" + Kakariko Graveyard Golden Wolf: Can_Complete_Eldin_Twilight and 'Howl_at_Snowpeak_Mountain_Howling_Stone' Kakariko Graveyard Twilit Insect: Can_Defeat_Eldin_Twilit_Insect Exits: Kakariko Graveyard Pond: "'Can_Follow_Rutella'" diff --git a/src/dusk/randomizer/generator/data/world/overworld/Faron Province.yaml b/src/dusk/randomizer/generator/data/world/overworld/Faron Province.yaml index 32f11ba02a..c3bc41d4dd 100644 --- a/src/dusk/randomizer/generator/data/world/overworld/Faron Province.yaml +++ b/src/dusk/randomizer/generator/data/world/overworld/Faron Province.yaml @@ -231,7 +231,7 @@ Locations: North Faron Warp Portal: Can_Complete_Prologue North Faron Woods Deku Baba Chest: Nothing - Faron Woods Golden Wolf: Nothing + Faron Woods Golden Wolf: Can_Complete_Faron_Twilight North Faron Woods Twilit Insect 1: Can_Defeat_Faron_Twilit_Insect North Faron Woods Twilit Insect 2: Can_Defeat_Faron_Twilit_Insect Exits: