From 0970e80c6060cd185837a8bc95ba61f67b4a5f8a Mon Sep 17 00:00:00 2001 From: briaguya Date: Mon, 30 May 2022 05:51:46 -0400 Subject: [PATCH] start great fairy item replacement (dins etc.) --- soh/soh/Enhancements/randomizer.cpp | 253 +++++++++++++++++- soh/soh/Enhancements/randomizer.h | 4 +- soh/soh/OTRGlobals.cpp | 8 +- soh/soh/OTRGlobals.h | 4 +- .../ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c | 19 +- 5 files changed, 274 insertions(+), 14 deletions(-) diff --git a/soh/soh/Enhancements/randomizer.cpp b/soh/soh/Enhancements/randomizer.cpp index 64fb6f714..f95e650cd 100644 --- a/soh/soh/Enhancements/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer.cpp @@ -791,14 +791,253 @@ GetItemID Randomizer::GetItemFromActor(s16 actorId, s16 actorParams, s16 sceneNu return GetItemFromGet(this->itemLocations[GetCheckFromActor(sceneNum, actorId, actorParams)], ogItemId); } -ItemID Randomizer::GetItemIdFromGetItem(GetItemID getItemId) { - return GetItemFromGetItem(getItemId); -} - -ItemID Randomizer::GetItemFromGetItem(GetItemID getItemId) { +ItemID Randomizer::GetItemidFromGetitemid(GetItemID getItemId) { switch (getItemId) { + case GI_STICKS_1: + return ITEM_STICK; + case GI_BOMBS_1: + return ITEM_BOMB; + case GI_BOW: + return ITEM_BOW; + case GI_ARROW_FIRE: + return ITEM_ARROW_FIRE; + case GI_DINS_FIRE: + return ITEM_DINS_FIRE; + case GI_SLINGSHOT: + return ITEM_SLINGSHOT; + case GI_OCARINA_FAIRY: + return ITEM_OCARINA_FAIRY; + case GI_OCARINA_OOT: + return ITEM_OCARINA_TIME; + case GI_LONGSHOT: + return ITEM_BOMBCHU; + case GI_HOOKSHOT: + return ITEM_HOOKSHOT; + case GI_LETTER_ZELDA: + return ITEM_LONGSHOT; + case GI_ARROW_ICE: + return ITEM_ARROW_ICE; + case GI_FARORES_WIND: + return ITEM_FARORES_WIND; + case GI_BOOMERANG: + return ITEM_BOOMERANG; + case GI_LENS: + return ITEM_LENS; + case GI_BEAN: + return ITEM_BEAN; + case GI_HAMMER: + return ITEM_HAMMER; + case GI_ARROW_LIGHT: + return ITEM_ARROW_LIGHT; + case GI_NAYRUS_LOVE: + return ITEM_NAYRUS_LOVE; + case GI_BOTTLE: + return ITEM_BOTTLE; + case GI_POTION_RED: + return ITEM_POTION_RED; + case GI_POTION_GREEN: + return ITEM_POTION_GREEN; + case GI_POTION_BLUE: + return ITEM_POTION_BLUE; + case GI_FAIRY: + return ITEM_FAIRY; + case GI_FISH: + return ITEM_FISH; + case GI_MILK_BOTTLE: + return ITEM_MILK_BOTTLE; + case GI_LETTER_RUTO: + return ITEM_LETTER_RUTO; + case GI_BLUE_FIRE: + return ITEM_BLUE_FIRE; + case GI_BUGS: + return ITEM_BUG; + case GI_BIG_POE: + return ITEM_BIG_POE; + case GI_POE: + return ITEM_POE; + case GI_WEIRD_EGG: + return ITEM_WEIRD_EGG; + case GI_CHICKEN: + return ITEM_CHICKEN; + case GI_MASK_KEATON: + return ITEM_MASK_KEATON; + case GI_MASK_SKULL: + return ITEM_MASK_SKULL; + case GI_MASK_SPOOKY: + return ITEM_MASK_SPOOKY; + case GI_MASK_BUNNY: + return ITEM_MASK_BUNNY; + case GI_MASK_GORON: + return ITEM_MASK_GORON; + case GI_MASK_ZORA: + return ITEM_MASK_ZORA; + case GI_MASK_GERUDO: + return ITEM_MASK_GERUDO; + case GI_MASK_TRUTH: + return ITEM_MASK_TRUTH; + case GI_POCKET_EGG: + return ITEM_POCKET_EGG; + case GI_POCKET_CUCCO: + return ITEM_POCKET_CUCCO; + case GI_COJIRO: + return ITEM_COJIRO; + case GI_ODD_MUSHROOM: + return ITEM_ODD_MUSHROOM; + case GI_ODD_POTION: + return ITEM_ODD_POTION; + case GI_SAW: + return ITEM_SAW; + case GI_SWORD_BROKEN: + return ITEM_SWORD_BROKEN; + case GI_PRESCRIPTION: + return ITEM_PRESCRIPTION; + case GI_FROG: + return ITEM_FROG; + case GI_EYEDROPS: + return ITEM_EYEDROPS; + case GI_CLAIM_CHECK: + return ITEM_CLAIM_CHECK; + case GI_SWORD_KOKIRI: + return ITEM_SWORD_KOKIRI; + case GI_SWORD_BGS: + return ITEM_SWORD_BGS; + case GI_SHIELD_DEKU: + return ITEM_SHIELD_DEKU; + case GI_SHIELD_HYLIAN: + return ITEM_SHIELD_HYLIAN; + case GI_SHIELD_MIRROR: + return ITEM_SHIELD_MIRROR; + case GI_TUNIC_GORON: + return ITEM_TUNIC_GORON; + case GI_TUNIC_ZORA: + return ITEM_TUNIC_ZORA; + case GI_BOOTS_IRON: + return ITEM_BOOTS_IRON; + case GI_BOOTS_HOVER: + return ITEM_BOOTS_HOVER; + case GI_BULLET_BAG_30: + return ITEM_BULLET_BAG_30; + case GI_BULLET_BAG_40: + return ITEM_BULLET_BAG_40; + case GI_BULLET_BAG_50: + return ITEM_BULLET_BAG_50; + case GI_QUIVER_40: + return ITEM_QUIVER_40; + case GI_QUIVER_50: + return ITEM_QUIVER_50; + case GI_BOMB_BAG_20: + return ITEM_BOMB_BAG_20; + case GI_BOMB_BAG_30: + return ITEM_BOMB_BAG_30; + case GI_BOMB_BAG_40: + return ITEM_BOMB_BAG_40; + case GI_BRACELET: + return ITEM_BRACELET; + case GI_GAUNTLETS_SILVER: + return ITEM_GAUNTLETS_SILVER; + case GI_GAUNTLETS_GOLD: + return ITEM_GAUNTLETS_GOLD; + case GI_SCALE_SILVER: + return ITEM_SCALE_SILVER; + case GI_SCALE_GOLD: + return ITEM_SCALE_GOLDEN; + case GI_SWORD_KNIFE: + return ITEM_SWORD_KNIFE; + case GI_WALLET_ADULT: + return ITEM_WALLET_ADULT; + case GI_WALLET_GIANT: + return ITEM_WALLET_GIANT; + case GI_MEDALLION_FOREST: + return ITEM_MEDALLION_FOREST; case GI_MEDALLION_FIRE: return ITEM_MEDALLION_FIRE; + case GI_MEDALLION_WATER: + return ITEM_MEDALLION_WATER; + case GI_MEDALLION_SHADOW: + return ITEM_MEDALLION_SPIRIT; + case GI_MEDALLION_SPIRIT: + return ITEM_MEDALLION_SHADOW; + case GI_MEDALLION_LIGHT: + return ITEM_MEDALLION_LIGHT; + case GI_STONE_KOKIRI: + return ITEM_KOKIRI_EMERALD; + case GI_STONE_GORON: + return ITEM_GORON_RUBY; + case GI_STONE_ZORA: + return ITEM_ZORA_SAPPHIRE; + case GI_STONE_OF_AGONY: + return ITEM_STONE_OF_AGONY; + case GI_GERUDO_CARD: + return ITEM_GERUDO_CARD; + case GI_HEART_CONTAINER: + return ITEM_HEART_CONTAINER; + case GI_HEART_PIECE: + return ITEM_HEART_PIECE; + case GI_KEY_BOSS: + return ITEM_KEY_BOSS; + case GI_COMPASS: + return ITEM_COMPASS; + case GI_MAP: + return ITEM_DUNGEON_MAP; + case GI_KEY_SMALL: + return ITEM_KEY_SMALL; + case GI_MAGIC_SMALL: + return ITEM_MAGIC_SMALL; + case GI_MAGIC_LARGE: + return ITEM_MAGIC_LARGE; + case GI_MILK: + return ITEM_MILK; + case GI_HEART: + return ITEM_HEART; + case GI_RUPEE_GREEN: + return ITEM_RUPEE_GREEN; + case GI_RUPEE_BLUE: + return ITEM_RUPEE_BLUE; + case GI_RUPEE_RED: + return ITEM_RUPEE_RED; + case GI_RUPEE_PURPLE: + return ITEM_RUPEE_PURPLE; + case GI_RUPEE_GOLD: + return ITEM_RUPEE_GOLD; + case GI_STICKS_5: + return ITEM_STICKS_5; + case GI_STICKS_10: + return ITEM_STICKS_10; + case GI_NUTS_5: + return ITEM_NUTS_5; + case GI_NUTS_10: + return ITEM_NUTS_10; + case GI_BOMBS_5: + return ITEM_BOMBS_5; + case GI_BOMBS_10: + return ITEM_BOMBS_10; + case GI_BOMBS_20: + return ITEM_BOMBS_20; + case GI_BOMBS_30: + return ITEM_BOMBS_30; + case GI_ARROWS_SMALL: + return ITEM_ARROWS_SMALL; + case GI_ARROWS_MEDIUM: + return ITEM_ARROWS_MEDIUM; + case GI_ARROWS_LARGE: + return ITEM_ARROWS_LARGE; + case GI_SEEDS_30: + return ITEM_SEEDS_30; + case GI_BOMBCHUS_5: + return ITEM_BOMBCHUS_5; + case GI_BOMBCHUS_20: + return ITEM_BOMBCHUS_20; + case GI_STICK_UPGRADE_20: + return ITEM_STICK_UPGRADE_20; + case GI_STICK_UPGRADE_30: + return ITEM_STICK_UPGRADE_30; + case GI_NUT_UPGRADE_30: + return ITEM_NUT_UPGRADE_30; + case GI_NUT_UPGRADE_40: + return ITEM_NUT_UPGRADE_40; + case GI_NONE: + default: + return ITEM_NONE; } } @@ -1041,6 +1280,10 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) } } +GetItemID Randomizer::GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { + return GetItemFromGet(this->itemLocations[randomizerCheck], ogId); +} + RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 actorParams) { if (!gSaveContext.n64ddFlag) { return UNKNOWN_CHECK; diff --git a/soh/soh/Enhancements/randomizer.h b/soh/soh/Enhancements/randomizer.h index cdeb947be..57d1faa72 100644 --- a/soh/soh/Enhancements/randomizer.h +++ b/soh/soh/Enhancements/randomizer.h @@ -21,8 +21,8 @@ class Randomizer { s16 GetItemModelFromId(s16 itemId); void LoadItemLocations(const char* spoilerFileName); void ParseItemLocations(const char* spoilerFileName); - ItemID GetItemIdFromGetItem(GetItemID getItemId); - ItemID GetItemFromGetItem(GetItemID getItemId); + ItemID GetItemidFromGetitemid(GetItemID getItemId); + GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); }; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 4ca7155d9..30df1264b 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1040,10 +1040,10 @@ extern "C" s32 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); } -extern "C" ItemID GetItemIdFromGetItem(GetItemID getItemId) { - return OTRGlobals::Instance->gRandomizer->GetItemIdFromGetItem(getItemId); +extern "C" s32 GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { + return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); } -extern "C" ItemID GetItemFromGetItem(GetItemID getItemId) { - return OTRGlobals::Instance->gRandomizer->GetItemFromGetItem(getItemId); +extern "C" ItemID GetItemidFromGetitemid(GetItemID getItemId) { + return OTRGlobals::Instance->gRandomizer->GetItemidFromGetitemid(getItemId); } \ No newline at end of file diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 433905b0d..5e3c20f04 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -78,9 +78,9 @@ void LoadItemLocations(const char* spoilerFileName); void ParseItemLocations(const char* spoilerfilename); ItemID GetItemIdFromGetItem(GetItemID getItemId); s16 GetItemModelFromId(s16 itemId); -ItemID GetItemFromGetItem(GetItemID getItemId); +ItemID GetItemidFromGetitemid(GetItemID getItemId); s32 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); - +s32 GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); #endif #endif \ No newline at end of file diff --git a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c index 5b13aab9b..829412d34 100644 --- a/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c +++ b/soh/src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.c @@ -208,6 +208,8 @@ void BgDyYoseizo_ChooseType(BgDyYoseizo* this, GlobalContext* globalCtx) { if (globalCtx->sceneNum != SCENE_DAIYOUSEI_IZUMI) { switch (this->fountainType) { + // todo ensure we're seting givingReward based on if the check has been checked, + // not based on if the spell is in inventory case FAIRY_SPELL_FARORES_WIND: if (!(gSaveContext.itemGetInf[1] & 0x100)) { givingReward = true; @@ -226,6 +228,8 @@ void BgDyYoseizo_ChooseType(BgDyYoseizo* this, GlobalContext* globalCtx) { } } else { switch (this->fountainType) { + // todo ensure we're setting givingReward based on if the check has been checked, + // not based on magic meter case FAIRY_UPGRADE_MAGIC: if (!gSaveContext.magicAcquired || BREG(2)) { // "Spin Attack speed UP" @@ -764,7 +768,20 @@ void BgDyYoseizo_Give_Reward(BgDyYoseizo* this, GlobalContext* globalCtx) { gSaveContext.healthAccumulator = 0x140; Interface_ChangeAlpha(9); gSaveContext.itemGetInf[1] |= sItemGetFlags[actionIndex]; - Item_Give(globalCtx, sItemIds[actionIndex]); + if(gSaveContext.n64ddFlag) { + switch(sItemIds[actionIndex]) { + case ITEM_DINS_FIRE: + Item_Give(globalCtx, GetItemidFromGetitemid(GetRandomizedItemIdFromKnownCheck(OGC_GREAT_FAIRY_REWARD, GI_DINS_FIRE))); + break; + case ITEM_FARORES_WIND: + Item_Give(globalCtx, GetItemidFromGetitemid(GetRandomizedItemIdFromKnownCheck(ZF_GREAT_FAIRY_REWARD, GI_FARORES_WIND))); + break; + case ITEM_NAYRUS_LOVE: + Item_Give(globalCtx, GetItemidFromGetitemid(GetRandomizedItemIdFromKnownCheck(COLOSSUS_GREAT_FAIRY_REWARD, GI_NAYRUS_LOVE))); + } + } else { + Item_Give(globalCtx, sItemIds[actionIndex]); + } } } else { this->item->actor.world.pos.x = player->actor.world.pos.x;