diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 6b18399ca..dcb7ade06 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -365,6 +365,7 @@ typedef enum { FLAG_SCENE_TREASURE, FLAG_SCENE_CLEAR, FLAG_SCENE_COLLECTIBLE, + FLAG_EVENT_CHECK_INF, } FlagType; typedef struct { diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 206b17be5..5bfa6572e 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1959,7 +1959,8 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { Player* player = GET_PLAYER(globalCtx); if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { - if (((player->heldActor != NULL) && (getItemId > GI_NONE) && (getItemId < GI_MAX)) || + if (((player->heldActor != NULL) && ((getItemId > GI_NONE) && (getItemId < GI_MAX)) || + (gSaveContext.n64ddFlag && (getItemId > RG_NONE) && (getItemId < RG_MAX))) || (!(player->stateFlags1 & 0x20000800))) { if ((getItemId != GI_NONE)) { player->getItemId = getItemId; diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index f05ef917f..fb35c5209 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -243,11 +243,11 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi !Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && globalCtx->sceneLoadFlag == 0) { GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT); - GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT); - GiveItemWithoutActor(globalCtx, getItemId); - player->getItemEntry = getItem; - player->pendingFlag.flagID = 0x1E; - player->pendingFlag.flagType = FLAG_SCENE_TREASURE; + if (player->pendingFlag.flagType == FLAG_NONE && GiveItemWithoutActor(globalCtx, getItem.getItemId)) { + player->getItemEntry = getItem; + player->pendingFlag.flagID = 0x1E; + player->pendingFlag.flagType = FLAG_SCENE_TREASURE; + } } } diff --git a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c index 38ccd5b5c..3aa000b4c 100644 --- a/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c +++ b/soh/src/overlays/actors/ovl_En_Xc/z_en_xc.c @@ -289,18 +289,20 @@ void func_80B3CA38(EnXc* this, GlobalContext* globalCtx) { void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, RandomizerCheck check, int sheikType, GetItemID ogSongId) { Player* player = GET_PLAYER(globalCtx); - if (sheik->actor.parent != NULL && sheik->actor.parent->id == player->actor.id && - !(gSaveContext.eventChkInf[5] & sheikType)) { - gSaveContext.eventChkInf[5] |= sheikType; - } else if (!(gSaveContext.eventChkInf[5] & sheikType)) { - player->getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); + if (!(gSaveContext.eventChkInf[5] & sheikType)) { + GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId); if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) { - if (func_8002F434(&sheik->actor, globalCtx, player->getItemEntry.getItemId, 10000.0f, 100.0f)) { + if (func_8002F434(&sheik->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f)) { + player->getItemEntry = getItemEntry; player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagType = FLAG_SCENE_TREASURE; } } else if (check != RC_SHEIK_AT_TEMPLE) { - func_8002F434(&sheik->actor, globalCtx, player->getItemEntry.getItemId, 10000.0f, 100.0f); + if (func_8002F434(&sheik->actor, globalCtx, getItemEntry.getItemId, 10000.0f, 100.0f)) { + player->getItemEntry = getItemEntry; + player->pendingFlag.flagID = 0x55; + player->pendingFlag.flagType = FLAG_EVENT_CHECK_INF; + } } } } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index f04bf93c9..c0f9a106c 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -1602,6 +1602,7 @@ void func_808337D4(GlobalContext* globalCtx, Player* this) { this->interactRangeActor = spawnedActor; this->heldActor = spawnedActor; this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->unk_3BC.y = spawnedActor->shape.rot.y - this->actor.shape.rot.y; this->stateFlags1 |= PLAYER_STATE1_11; } @@ -6082,6 +6083,9 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { case FLAG_SCENE_TREASURE: Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); break; + case FLAG_EVENT_CHECK_INF: + Flags_SetEventChkInf(globalCtx, this->pendingFlag.flagID); + break; case FLAG_NONE: default: break; @@ -6135,6 +6139,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { (interactedActor->id == ACTOR_EN_KAREBABA || interactedActor->id == ACTOR_EN_DEKUBABA))) { func_8083E4C4(globalCtx, this, &giEntry); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; return 0; } @@ -6154,6 +6159,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) { func_8083E4C4(globalCtx, this, &giEntry); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } } else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) && !(this->stateFlags2 & PLAYER_STATE2_10)) { @@ -6586,6 +6592,7 @@ s32 func_8083F7BC(Player* this, GlobalContext* globalCtx) { this->stateFlags1 |= PLAYER_STATE1_11; this->interactRangeActor = &wallPolyActor->actor; this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->currentYaw = this->actor.wallYaw + 0x8000; func_80832224(this); @@ -12525,6 +12532,7 @@ void func_8084DF6C(GlobalContext* globalCtx, Player* this) { this->unk_862 = 0; this->stateFlags1 &= ~(PLAYER_STATE1_10 | PLAYER_STATE1_11); this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; func_8005B1A4(Gameplay_GetCamera(globalCtx, 0)); } @@ -12626,7 +12634,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { Audio_PlayFanfare(NA_BGM_ITEM_GET | 0x900); } } - this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; + //this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } else { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) { @@ -12638,6 +12646,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { func_80852FFC(globalCtx, NULL, 8); } this->getItemId = GI_NONE; + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } }