From 69de5ac14a955af3ebbc7339a94d5aa6d39a6aea Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 19 Jul 2022 22:29:52 +0200 Subject: [PATCH] Fixed all possible ice trap scenarios --- soh/include/z64player.h | 1 + soh/soh/Enhancements/randomizer/randomizer.cpp | 8 ++++++++ soh/src/code/z_actor.c | 3 +++ soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 11 +++++------ soh/src/overlays/actors/ovl_player_actor/z_player.c | 4 ++++ 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 6128a57d85..bbc0fcea38 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -622,6 +622,7 @@ typedef struct Player { /* 0x0A86 */ s8 unk_A86; /* 0x0A87 */ u8 unk_A87; /* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position + /* 0x0A89 */ u8 iceTrapped; } Player; // size = 0xA94 #endif diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 2db510c174..247b943715 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2439,6 +2439,14 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST; case 22788: return RC_DEKU_TREE_BASEMENT_CHEST; + case 8200: + return RC_DEKU_TREE_GS_COMPASS_ROOM; + case 8196: + return RC_DEKU_TREE_GS_BASEMENT_VINES; + case 8194: + return RC_DEKU_TREE_GS_BASEMENT_GATE; + case 8193: + return RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM; } break; case 1: diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 70771880c3..393172d7f8 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1981,6 +1981,9 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { player->getItemId = getItemId; player->interactRangeActor = &player->actor; player->getItemDirection = player->actor.shape.rot.y; + if (player->stateFlags1 & (PLAYER_STATE1_26)) { + player->iceTrapped = 0; + } return true; } } diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index 8e313fae48..2095bdc26c 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -99,14 +99,14 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; if (gSaveContext.n64ddFlag) { if (getItemId == GI_ICE_TRAP) { - GiveItemWithoutActor(globalCtx, getItemId); + player->getItemId = GI_ICE_TRAP; + player->iceTrapped = 1; textId = 0xF8; } else { textId = sGetItemTable[getItemId - 1].textId; giveItemId = sGetItemTable[getItemId - 1].itemId; } - } - if (getItemId != GI_ICE_TRAP) { + } else { Item_Give(globalCtx, giveItemId); } if (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) { @@ -134,14 +134,13 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { if (gSaveContext.n64ddFlag) { if (getItemId == GI_ICE_TRAP) { - GiveItemWithoutActor(globalCtx, getItemId); + GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); textId = 0xF8; } else { textId = sGetItemTable[getItemId - 1].textId; giveItemId = sGetItemTable[getItemId - 1].itemId; } - } - if (getItemId != GI_ICE_TRAP) { + } else { Item_Give(globalCtx, giveItemId); } Message_StartTextbox(globalCtx, textId, NULL); 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 7375a1b6bf..bff6cf3ec1 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -10977,6 +10977,10 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) { Collider_ResetQuadAC(globalCtx, &this->shieldQuad.base); Collider_ResetQuadAT(globalCtx, &this->shieldQuad.base); + + if (this->iceTrapped != 0) { + GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); + } } static Vec3f D_80854838 = { 0.0f, 0.0f, -30.0f };