diff --git a/soh/soh/Enhancements/randomizer.cpp b/soh/soh/Enhancements/randomizer.cpp index a92a3054a..15711a629 100644 --- a/soh/soh/Enhancements/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer.cpp @@ -791,17 +791,6 @@ 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) { - switch (getItemId) { - case GI_MEDALLION_FIRE: - return ITEM_MEDALLION_FIRE; - } -} - GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) { switch(randoGet) { case UNKNOWN_GET: @@ -992,6 +981,26 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) return GI_SEEDS_30; case BOTTLE_WITH_BIG_POE: return GI_BIG_POE; + case BOTTLE: + return GI_BOTTLE; + case BOTTLE_WITH_BLUE_FIRE: + return GI_BLUE_FIRE; + case BOTTLE_WITH_BLUE_POTION: + return GI_POTION_BLUE; + case BOTTLE_WITH_BUGS: + return GI_BUGS; + case BOTTLE_WITH_FAIRY: + return GI_FAIRY; + case BOTTLE_WITH_FISH: + return GI_FISH; + case BOTTLE_WITH_GREEN_POTION: + return GI_POTION_GREEN; + case BOTTLE_WITH_MILK: + return GI_MILK_BOTTLE; + case BOTTLE_WITH_POE: + return GI_POE; + case BOTTLE_WITH_RED_POTION: + return GI_POTION_RED; case PIECE_OF_HEART_TREASURE_CHEST_GAME: return GI_HEART_PIECE_WIN; case DEKU_STICK_CAPACITY: @@ -1041,6 +1050,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; @@ -1590,6 +1603,26 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act case 262: return ZF_ICEBERG_FREESTANDING_POH; } + case 59: + // using fountainType as actorParams + switch(actorParams) { + case 1: + return DMT_GREAT_FAIRY_REWARD; + case 2: + return DMC_GREAT_FAIRY_REWARD; + case 3: + return OGC_GREAT_FAIRY_REWARD; + } + case 61: + // using fountainType as actorParams + switch(actorParams) { + case 1: + return ZF_GREAT_FAIRY_REWARD; + case 2: + return HC_GREAT_FAIRY_REWARD; + case 3: + return COLOSSUS_GREAT_FAIRY_REWARD; + } } return UNKNOWN_CHECK; diff --git a/soh/soh/Enhancements/randomizer.h b/soh/soh/Enhancements/randomizer.h index cdeb947be..6df2dcb3f 100644 --- a/soh/soh/Enhancements/randomizer.h +++ b/soh/soh/Enhancements/randomizer.h @@ -21,8 +21,7 @@ class Randomizer { s16 GetItemModelFromId(s16 itemId); void LoadItemLocations(const char* spoilerFileName); void ParseItemLocations(const char* spoilerFileName); - ItemID GetItemIdFromGetItem(GetItemID getItemId); - ItemID GetItemFromGetItem(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..02a039da7 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1040,10 +1040,6 @@ 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); -} \ No newline at end of file diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 433905b0d..c541cd92d 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -78,9 +78,8 @@ void LoadItemLocations(const char* spoilerFileName); void ParseItemLocations(const char* spoilerfilename); ItemID GetItemIdFromGetItem(GetItemID getItemId); s16 GetItemModelFromId(s16 itemId); -ItemID GetItemFromGetItem(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..4ce5dfdc2 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 @@ -67,6 +67,21 @@ const ActorInit Bg_Dy_Yoseizo_InitVars = { NULL, }; +u8 successGreatFairy; +void GivePlayerRandoRewardGreatFairy(BgDyYoseizo* this, GlobalContext* globalCtx) { + Player* player = GET_PLAYER(globalCtx); + GetItemID getItemId = GetRandomizedItemId(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum); + + if (successGreatFairy && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { + Flags_SetTreasure(globalCtx, this->fountainType + 1); + successGreatFairy = 0; + Actor_Kill(&this->actor); + } else if (!successGreatFairy) { + successGreatFairy = func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); + } +} + + void BgDyYoseizo_Init(Actor* thisx, GlobalContext* globalCtx2) { GlobalContext* globalCtx = globalCtx2; BgDyYoseizo* this = (BgDyYoseizo*)thisx; @@ -182,6 +197,18 @@ void BgDyYoseizo_Bob(BgDyYoseizo* this, GlobalContext* globalCtx) { void BgDyYoseizo_CheckMagicAcquired(BgDyYoseizo* this, GlobalContext* globalCtx) { if (Flags_GetSwitch(globalCtx, 0x38)) { globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_04; + + if(gSaveContext.n64ddFlag) { + gSaveContext.healthAccumulator = 0x140; + Magic_Fill(globalCtx); + if(Flags_GetTreasure(globalCtx, this->fountainType + 1)) { + Actor_Kill(&this->actor); + } else { + GivePlayerRandoRewardGreatFairy(this, globalCtx); + } + return; + } + if (globalCtx->sceneNum == SCENE_DAIYOUSEI_IZUMI) { if (!gSaveContext.magicAcquired && (this->fountainType != FAIRY_UPGRADE_MAGIC)) { Actor_Kill(&this->actor);