From fe8641cab468473aeab0f14ac146d9b05007f689 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 14 Jul 2022 10:45:42 +0200 Subject: [PATCH 01/23] not yet --- soh/randomizerTypes.h | 1 + .../Enhancements/randomizer/3drando/settings.cpp | 1 + soh/soh/Enhancements/randomizer/randomizer.cpp | 15 +++++++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/soh/randomizerTypes.h b/soh/randomizerTypes.h index 5519668284..a35fe45721 100644 --- a/soh/randomizerTypes.h +++ b/soh/randomizerTypes.h @@ -973,6 +973,7 @@ typedef enum { RSK_STARTING_MAPS_COMPASSES, //RANDOTODO more options for this, rn it's just start with or own dungeon RSK_SHUFFLE_DUNGEON_REWARDS, RSK_SHUFFLE_SONGS, + RSK_SHUFFLE_TOKENS, RSK_SHUFFLE_WEIRD_EGG, RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, RSK_ITEM_POOL, diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 05fc10c4bb..6807c90522 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -2488,6 +2488,7 @@ namespace Settings { ShuffleRewards.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_DUNGEON_REWARDS]); ShuffleSongs.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_SONGS]); + Tokensanity.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_TOKENS]); ShuffleKokiriSword.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_KOKIRI_SWORD]); ShuffleOcarinas.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_OCARINA]); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 09704e8671..354c6f7fc9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3016,6 +3016,10 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR; case 14346: return RC_GY_GOSSIP_STONE; + case 20608: + return RC_GRAVEYARD_GS_WALL; + //case 0: + //return RC_GRAVEYARD_GS_BEAN_PATCH; } break; case 84: @@ -3217,8 +3221,8 @@ void GenerateRandomizerImgui() { cvarSettings[RSK_STARTING_DEKU_SHIELD] = CVar_GetS32("gRandomizeStartingDekuShield", 0); cvarSettings[RSK_STARTING_MAPS_COMPASSES] = CVar_GetS32("gRandomizeStartingMapsCompasses", 0); cvarSettings[RSK_SHUFFLE_DUNGEON_REWARDS] = CVar_GetS32("gRandomizeShuffleDungeonReward", 0); - cvarSettings[RSK_SHUFFLE_SONGS] = CVar_GetS32("gRandomizeShuffleSongs", 0); - + cvarSettings[RSK_SHUFFLE_SONGS] = CVar_GetS32("gRandomizeShuffleTokens", 0); + cvarSettings[RSK_SHUFFLE_TOKENS] = CVar_GetS32("gRandomizeShuffleTokens", 0); cvarSettings[RSK_SKIP_CHILD_ZELDA] = CVar_GetS32("gRandomizeSkipChildZelda", 0); // if we skip child zelda, we start with zelda's letter, and malon starts @@ -3301,6 +3305,7 @@ void DrawRandoEditor(bool& open) { const char* randoShuffleDungeonRewards[4] = { "End of Dungeons", "Any Dungeon", "Overworld", "Anywhere" }; const char* randoLinksPocket[4] = { "Dungeon Reward", "Advancement", "Anything", "Nothing" }; const char* randoShuffleSongs[3] = { "Song Locations", "Dungeon Rewards", "Anywhere" }; + const char* randoShuffleTokens[4] = { "Off", "Dungeons", "Overworld", "All Tokens" }; const char* randoShopsanity[7] = { "Off", "0", "1", "2", "3", "4", "Random" }; const char* randoTokensanity[4] = { "Off", "Dungeons", "Overworld", "All Tokens" }; const char* randoShuffleScrubs[4] = { "Off", "Affordable", "Expensive", "Random Prices" }; @@ -3911,6 +3916,12 @@ void DrawRandoEditor(bool& open) { SohImGui::EnhancementCombobox("gRandomizeShuffleSongs", randoShuffleSongs, 3, 0); ImGui::Separator(); + // Shuffle Tokens + ImGui::Text("Shuffle Tokens"); + InsertHelpHoverText("Spoopy"); + SohImGui::EnhancementCombobox("gRandomizeShuffleTokens", randoShuffleTokens, 4, 0); + ImGui::Separator(); + // todo implement shops // // Shopsanity // ImGui::Text("Shopsanity"); From ac099018e4252a165757f4a6cfafa9e8eacea9dd Mon Sep 17 00:00:00 2001 From: aMannus Date: Fri, 15 Jul 2022 14:56:52 +0200 Subject: [PATCH 02/23] still nothing yet --- soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c index 51a5128559..14d0df0725 100644 --- a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c +++ b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c @@ -613,9 +613,18 @@ void func_80B0D878(EnSw* this, GlobalContext* globalCtx) { x = (this->unk_364.x * 10.0f); y = (this->unk_364.y * 10.0f); z = (this->unk_364.z * 10.0f); - temp_v0 = - Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_SI, this->actor.world.pos.x + x, - this->actor.world.pos.y + y, this->actor.world.pos.z + z, 0, 0, 0, this->actor.params); + if (!(gSaveContext.n64ddFlag)) { + temp_v0 = Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_SI, + this->actor.world.pos.x + x, this->actor.world.pos.y + y, + this->actor.world.pos.z + z, 0, 0, 0, this->actor.params); + } else { + s32 getItemId = GI_NONE; + getItemId = GetRandomizedItemId(getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum); + temp_v0 = Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, getItemId, + this->actor.world.pos.x + x, this->actor.world.pos.y + y, + this->actor.world.pos.z + z, 0, 0, 0, this->actor.params); + } + if (temp_v0 != NULL) { temp_v0->parent = NULL; } From 0f1f8c15f2cef9b01ecf67011066e7ff9bc9210a Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 16 Jul 2022 12:20:53 +0200 Subject: [PATCH 03/23] Closer but not yet --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 28 ++++++++++++++++++--- soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c | 14 +++-------- 2 files changed, 28 insertions(+), 14 deletions(-) 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 7bd83a997f..d5abb04812 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 @@ -93,7 +93,12 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; - Item_Give(globalCtx, ITEM_SKULL_TOKEN); + s32 getItemId = ITEM_SKULL_TOKEN; + if (gSaveContext.n64ddFlag) { + getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + } + //getItemId = ITEM_DINS_FIRE; + Item_Give(globalCtx, getItemId); if (CVar_GetS32("gSkulltulaFreeze", 0) != 1) { player->actor.freezeTimer = 20; } @@ -117,7 +122,12 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { this->actor.shape.rot.y += 0x400; if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { - Item_Give(globalCtx, ITEM_SKULL_TOKEN); + s32 getItemId = ITEM_SKULL_TOKEN; + if (gSaveContext.n64ddFlag) { + getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + } + //getItemId = ITEM_DINS_FIRE; + Item_Give(globalCtx, getItemId); Message_StartTextbox(globalCtx, 0xB4, NULL); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); this->actionFunc = func_80AFB950; @@ -150,6 +160,18 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { if (this->actionFunc != func_80AFB950) { func_8002ED80(&this->actor, globalCtx, 0); func_8002EBCC(&this->actor, globalCtx, 0); - GetItem_Draw(globalCtx, GID_SKULL_TOKEN_2); + if (!gSaveContext.n64ddFlag) { + GetItem_Draw(globalCtx, GID_SKULL_TOKEN_2); + } else { + f32 mtxScale = 1.5f; + Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); + s32 randoGetItemId = + GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + if (randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) { + EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); + } + GetItem_Draw(globalCtx, GetItemModelFromId(randoGetItemId)); + } + } } diff --git a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c index 14d0df0725..69fc0595ae 100644 --- a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c +++ b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c @@ -613,17 +613,9 @@ void func_80B0D878(EnSw* this, GlobalContext* globalCtx) { x = (this->unk_364.x * 10.0f); y = (this->unk_364.y * 10.0f); z = (this->unk_364.z * 10.0f); - if (!(gSaveContext.n64ddFlag)) { - temp_v0 = Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_SI, - this->actor.world.pos.x + x, this->actor.world.pos.y + y, - this->actor.world.pos.z + z, 0, 0, 0, this->actor.params); - } else { - s32 getItemId = GI_NONE; - getItemId = GetRandomizedItemId(getItemId, this->actor.id, this->actor.params, globalCtx->sceneNum); - temp_v0 = Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, getItemId, - this->actor.world.pos.x + x, this->actor.world.pos.y + y, - this->actor.world.pos.z + z, 0, 0, 0, this->actor.params); - } + temp_v0 = Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_SI, + this->actor.world.pos.x + x, this->actor.world.pos.y + y, + this->actor.world.pos.z + z, 0, 0, 0, this->actor.params); if (temp_v0 != NULL) { temp_v0->parent = NULL; From 4ccd4d58952851337ad171fce5732d0802dfcea9 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 17 Jul 2022 16:02:27 +0200 Subject: [PATCH 04/23] Exposed static table to change skulltokens This static table is normally only used within z_player.c, but is needed to switch the itemId to something Item_Give() can use and to set the correct TextId. --- soh/include/z64player.h | 10 ++++++++ soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 24 +++++++++++-------- soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c | 1 - .../actors/ovl_player_actor/z_player.c | 11 ++------- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 954c36c142..6128a57d85 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -5,6 +5,16 @@ struct Player; +typedef struct { + /* 0x00 */ u8 itemId; + /* 0x01 */ u8 field; // various bit-packed data + /* 0x02 */ s8 gi; // defines the draw id and chest opening animation + /* 0x03 */ u8 textId; + /* 0x04 */ u16 objectId; +} GetItemEntry; // size = 0x06 + +extern GetItemEntry sGetItemTable[160]; + typedef enum { /* 0 */ PLAYER_SWORD_NONE, /* 1 */ PLAYER_SWORD_KOKIRI, 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 d5abb04812..bf8a93c4c4 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 @@ -93,16 +93,18 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; - s32 getItemId = ITEM_SKULL_TOKEN; + s32 textId = 0xB4; + s32 itemGiveId = ITEM_SKULL_TOKEN; if (gSaveContext.n64ddFlag) { - getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + s32 getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + textId = sGetItemTable[getItemId - 1].textId; + itemGiveId = sGetItemTable[getItemId - 1].itemId; } - //getItemId = ITEM_DINS_FIRE; - Item_Give(globalCtx, getItemId); + Item_Give(globalCtx, itemGiveId); if (CVar_GetS32("gSkulltulaFreeze", 0) != 1) { player->actor.freezeTimer = 20; } - Message_StartTextbox(globalCtx, 0xB4, NULL); + Message_StartTextbox(globalCtx, textId, NULL); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); this->actionFunc = func_80AFB950; } else { @@ -122,13 +124,15 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { this->actor.shape.rot.y += 0x400; if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { - s32 getItemId = ITEM_SKULL_TOKEN; + s32 textId = 0xB4; + s32 itemGiveId = ITEM_SKULL_TOKEN; if (gSaveContext.n64ddFlag) { - getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + s32 getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + textId = sGetItemTable[getItemId - 1].textId; + itemGiveId = sGetItemTable[getItemId - 1].itemId; } - //getItemId = ITEM_DINS_FIRE; - Item_Give(globalCtx, getItemId); - Message_StartTextbox(globalCtx, 0xB4, NULL); + Item_Give(globalCtx, itemGiveId); + Message_StartTextbox(globalCtx, textId, NULL); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); this->actionFunc = func_80AFB950; } diff --git a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c index 69fc0595ae..864fa22707 100644 --- a/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c +++ b/soh/src/overlays/actors/ovl_En_Sw/z_en_sw.c @@ -616,7 +616,6 @@ void func_80B0D878(EnSw* this, GlobalContext* globalCtx) { temp_v0 = Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_SI, this->actor.world.pos.x + x, this->actor.world.pos.y + y, this->actor.world.pos.z + z, 0, 0, 0, this->actor.params); - if (temp_v0 != NULL) { temp_v0->parent = 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 1973a09a44..330c53738e 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6,6 +6,7 @@ #include "ultra64.h" #include "global.h" +#include "z64player.h" #include "overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.h" #include "overlays/actors/ovl_Door_Shutter/z_door_shutter.h" @@ -21,14 +22,6 @@ #include "objects/object_link_child/object_link_child.h" #include "textures/icon_item_24_static/icon_item_24_static.h" -typedef struct { - /* 0x00 */ u8 itemId; - /* 0x01 */ u8 field; // various bit-packed data - /* 0x02 */ s8 gi; // defines the draw id and chest opening animation - /* 0x03 */ u8 textId; - /* 0x04 */ u16 objectId; -} GetItemEntry; // size = 0x06 - #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim) \ { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId } @@ -496,7 +489,7 @@ static u16 D_8085361C[] = { NA_SE_VO_LI_FALL_L, }; -static GetItemEntry sGetItemTable[] = { +GetItemEntry sGetItemTable[] = { GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), From 0da14603e2c97b69ac63e0ffeaff2b18ae4a77c3 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 17 Jul 2022 23:50:48 +0200 Subject: [PATCH 05/23] Freeze fix/first batch of skull actors --- .../Enhancements/randomizer/randomizer.cpp | 28 +++++++++++++++++++ soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 354c6f7fc9..a7d23c443b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2960,6 +2960,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_HF_COW_GROTTO_GOSSIP_STONE; case 14355: return RC_HC_STORMS_GROTTO_GOSSIP_STONE; + case 10753: + return RC_HF_GS_COW_GROTTO; + case 10754: + return RC_HF_GS_NEAR_KAK_GROTTO; + case 11778: + return RC_HC_GS_STORMS_GROTTO; default: return RC_UNKNOWN_CHECK; } @@ -2998,6 +3004,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_LLR_FREESTANDING_POH; } break; + case 77: + switch (actorParams) { + case -29176: + return RC_MARKET_GS_GUARD_HOUSE; + } + break; case 82: switch (actorId) { case 316: @@ -3044,6 +3056,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE; case 14623: return RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE; + case 19458: + return RC_KF_GS_KNOW_IT_ALL_HOUSE; + case 27649: + return RC_KF_GS_BEAN_PATCH; + case 19460: + return RC_KF_GS_HOUSE_OF_TWINS; } break; case 86: @@ -3054,6 +3072,8 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_SFM_MAZE_UPPER_GOSSIP_STONE; case 14876: return RC_SFM_SARIA_GOSSIP_STONE; + case 19720: + return RC_SFM_GS; } break; case 87: @@ -3116,6 +3136,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_LW_DEKU_SCRUB_NEAR_BRIDGE; case 14365: return RC_LW_GOSSIP_STONE; + case 27905: + return RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE; + case 27906: + return RC_LW_GS_BEAN_PATCH_NEAR_THEATER; + case 19716: + return RC_LW_GS_ABOVE_THEATER; } break; case 92: @@ -3149,6 +3175,8 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_HC_MALON_GOSSIP_STONE; case 14347: return RC_HC_ROCK_WALL_GOSSIP_STONE; + case -29180: + return RC_HC_GS_TREE; } break; case 96: 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 bf8a93c4c4..9293a436f6 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 @@ -101,7 +101,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { itemGiveId = sGetItemTable[getItemId - 1].itemId; } Item_Give(globalCtx, itemGiveId); - if (CVar_GetS32("gSkulltulaFreeze", 0) != 1) { + if (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || itemGiveId != ITEM_SKULL_TOKEN) { player->actor.freezeTimer = 20; } Message_StartTextbox(globalCtx, textId, NULL); From 3b747b41becd8296b8e14b291426ca77f94fc9dc Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 18 Jul 2022 09:05:32 +0200 Subject: [PATCH 06/23] Cleanup and freeze fix Don't freeze the player when the skulltula token check is something else than a token. Also some cleanup and declaring variables more globally within z_en_si.c --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 40 ++++++++++--------- .../actors/ovl_player_actor/z_player.c | 1 - 2 files changed, 21 insertions(+), 20 deletions(-) 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 9293a436f6..91fe0126c8 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 @@ -18,6 +18,10 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx); void func_80AFB89C(EnSi* this, GlobalContext* globalCtx); void func_80AFB950(EnSi* this, GlobalContext* globalCtx); +s32 textId = 0xB4; +s32 giveItemId = ITEM_SKULL_TOKEN; +s32 getItemId; + static ColliderCylinderInit sCylinderInit = { { COLTYPE_NONE, @@ -93,15 +97,13 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; - s32 textId = 0xB4; - s32 itemGiveId = ITEM_SKULL_TOKEN; if (gSaveContext.n64ddFlag) { - s32 getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); textId = sGetItemTable[getItemId - 1].textId; - itemGiveId = sGetItemTable[getItemId - 1].itemId; + giveItemId = sGetItemTable[getItemId - 1].itemId; } - Item_Give(globalCtx, itemGiveId); - if (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || itemGiveId != ITEM_SKULL_TOKEN) { + Item_Give(globalCtx, giveItemId); + if (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) { player->actor.freezeTimer = 20; } Message_StartTextbox(globalCtx, textId, NULL); @@ -124,14 +126,12 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { this->actor.shape.rot.y += 0x400; if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { - s32 textId = 0xB4; - s32 itemGiveId = ITEM_SKULL_TOKEN; if (gSaveContext.n64ddFlag) { - s32 getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + giveItemId = sGetItemTable[getItemId - 1].itemId; textId = sGetItemTable[getItemId - 1].textId; - itemGiveId = sGetItemTable[getItemId - 1].itemId; } - Item_Give(globalCtx, itemGiveId); + Item_Give(globalCtx, giveItemId); Message_StartTextbox(globalCtx, textId, NULL); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); this->actionFunc = func_80AFB950; @@ -141,7 +141,7 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { void func_80AFB950(EnSi* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); - if (Message_GetState(&globalCtx->msgCtx) != TEXT_STATE_CLOSING && CVar_GetS32("gSkulltulaFreeze", 0) != 1) { + if (Message_GetState(&globalCtx->msgCtx) != TEXT_STATE_CLOSING && (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN)) { player->actor.freezeTimer = 10; } else { SET_GS_FLAGS((this->actor.params & 0x1F00) >> 8, this->actor.params & 0xFF); @@ -167,14 +167,16 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { GetItem_Draw(globalCtx, GID_SKULL_TOKEN_2); } else { - f32 mtxScale = 1.5f; - Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); - s32 randoGetItemId = - GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); - if (randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) { - EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); + f32 mtxScale; + getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + if (getItemId >= GI_MINUET_OF_FOREST && getItemId <= GI_DOUBLE_DEFENSE) { + EnItem00_CustomItemsParticles(&this->actor, globalCtx, getItemId); } - GetItem_Draw(globalCtx, GetItemModelFromId(randoGetItemId)); + if (getItemId != ITEM_SKULL_TOKEN) { + mtxScale = 1.5f; + Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); + } + GetItem_Draw(globalCtx, GetItemModelFromId(getItemId)); } } 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 330c53738e..6f4800a9fb 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6,7 +6,6 @@ #include "ultra64.h" #include "global.h" -#include "z64player.h" #include "overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.h" #include "overlays/actors/ovl_Door_Shutter/z_door_shutter.h" From 06c3c2ba67317a5d5c3b71aa9b087b4c228f3383 Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 18 Jul 2022 09:10:36 +0200 Subject: [PATCH 07/23] Fixed mistake --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index a7d23c443b..2bdc7f5051 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3249,7 +3249,7 @@ void GenerateRandomizerImgui() { cvarSettings[RSK_STARTING_DEKU_SHIELD] = CVar_GetS32("gRandomizeStartingDekuShield", 0); cvarSettings[RSK_STARTING_MAPS_COMPASSES] = CVar_GetS32("gRandomizeStartingMapsCompasses", 0); cvarSettings[RSK_SHUFFLE_DUNGEON_REWARDS] = CVar_GetS32("gRandomizeShuffleDungeonReward", 0); - cvarSettings[RSK_SHUFFLE_SONGS] = CVar_GetS32("gRandomizeShuffleTokens", 0); + cvarSettings[RSK_SHUFFLE_SONGS] = CVar_GetS32("gRandomizeShuffleSongs", 0); cvarSettings[RSK_SHUFFLE_TOKENS] = CVar_GetS32("gRandomizeShuffleTokens", 0); cvarSettings[RSK_SKIP_CHILD_ZELDA] = CVar_GetS32("gRandomizeSkipChildZelda", 0); From 3341c3d404b669994a3f9baf84771e2e8f6b9a28 Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 18 Jul 2022 11:08:35 +0200 Subject: [PATCH 08/23] Another batch of spooders --- .../Enhancements/randomizer/randomizer.cpp | 60 ++++++++++++++++++- .../actors/ovl_player_actor/z_player.c | 4 +- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 2bdc7f5051..1948c414ca 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3018,6 +3018,18 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act } else { return RC_KAK_ANJU_AS_CHILD; } + case -28640: + return RC_KAK_GS_TREE; + case 20482: + return RC_KAK_GS_GUARDS_HOUSE; + case 20484: + return RC_KAK_GS_WATCHTOWER; + case 20496: + return RC_KAK_GS_SKULLTULA_HOUSE; + case 20488: + return RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION; + case 20544: + return RC_KAK_GS_ABOVE_IMPAS_HOUSE; } break; case 83: @@ -3028,10 +3040,10 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR; case 14346: return RC_GY_GOSSIP_STONE; + case 28673: + return RC_GRAVEYARD_GS_BEAN_PATCH; case 20608: return RC_GRAVEYARD_GS_WALL; - //case 0: - //return RC_GRAVEYARD_GS_BEAN_PATCH; } break; case 84: @@ -3044,6 +3056,14 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_ZR_NEAR_GROTTOS_GOSSIP_STONE; case 14860: return RC_ZR_NEAR_DOMAIN_GOSSIP_STONE; + case -28414: + return RC_ZR_GS_TREE; + case 20737: + return RC_ZR_GS_LADDER; + case 20752: + return RC_ZR_GS_NEAR_RAISED_GROTTOS; + case 20744: + return RC_ZR_GS_ABOVE_BRIDGE; } break; case 85: @@ -3102,6 +3122,8 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_ZD_CHEST; case 14345: return RC_ZD_GOSSIP_STONE; + case 20800: + return RC_ZD_GS_FROZEN_WATERFALL; } break; case 89: @@ -3116,6 +3138,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act case 14849: case 14337: return RC_FAIRY_GOSSIP_STONE; + case 20740: + return RC_ZF_GS_ABOVE_THE_LOG; + case -28288: + return RC_ZF_GS_TREE; + case 20768: + return RC_ZF_GS_HIDDEN_CAVE; } break; case 90: @@ -3187,6 +3215,14 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_DMT_CHEST; case 14340: return RC_DMT_GOSSIP_STONE; + case 12036: + return RC_DMT_GS_NEAR_KAK; + case 28418: + return RC_DMT_GS_BEAN_PATCH; + case 20232: + return RC_DMT_GS_ABOVE_DODONGOS_CAVERN; + case 20240: + return RC_DMT_GS_FALLING_ROCKS_PATH; } break; case 97: @@ -3197,6 +3233,10 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_DMC_WALL_FREESTANDING_POH; case 14341: return RC_DMC_GOSSIP_STONE; + case -28800: + return RC_DMC_GS_CRATE; + case 28417: + return RC_DMC_GS_BEAN_PATCH; } break; case 98: @@ -3213,6 +3253,22 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_GC_MAZE_GOSSIP_STONE; case 14873: return RC_GC_MEDIGORON_GOSSIP_STONE; + case 12064: + return RC_GC_GS_CENTER_PLATFORM; + case -28864: + return RC_GC_GS_BOULDER_MAZE; + } + break; + case 99: + switch (actorParams) { + case 11012: + return RC_LLR_GS_HOUSE_WINDOW; + case -29944: + return RC_LLR_GS_TREE; + case 11010: + return RC_LLR_GS_RAIN_SHED; + case 11009: + return RC_LLR_GS_BACK_WALL; } break; } 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 6f4800a9fb..59b7ade1af 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6081,7 +6081,7 @@ void func_8083DFE0(Player* this, f32* arg1, s16* arg2) { if (this->swordState == 0) { float maxSpeed = R_RUN_SPEED_LIMIT / 100.0f; if (CVar_GetS32("gMMBunnyHood", 0) != 0 && this->currentMask == PLAYER_MASK_BUNNY) { - maxSpeed *= 1.5f; + maxSpeed *= 3.0f; } this->linearVelocity = CLAMP(this->linearVelocity, -maxSpeed, maxSpeed); } @@ -7688,7 +7688,7 @@ void func_80842180(Player* this, GlobalContext* globalCtx) { if (!func_8083C484(this, &sp2C, &sp2A)) { if (CVar_GetS32("gMMBunnyHood", 0) != 0 && this->currentMask == PLAYER_MASK_BUNNY) { - sp2C *= 1.5f; + sp2C *= 3.0f; } func_8083DF68(this, sp2C, sp2A); func_8083DDC8(this, globalCtx); From 3a11aa08bb0c24055bffd875259a4f6442e0badc Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 18 Jul 2022 23:55:44 +0200 Subject: [PATCH 09/23] Added v1 ice traps and fixed some tokens --- .../Enhancements/randomizer/randomizer.cpp | 2 ++ soh/src/code/z_message_PAL.c | 14 ++++++++++ soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 28 +++++++++++++------ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 1948c414ca..2db510c174 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3018,6 +3018,8 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act } else { return RC_KAK_ANJU_AS_CHILD; } + } + switch (actorParams) { case -28640: return RC_KAK_GS_TREE; case 20482: diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 9cf592e4fb..7f7733c79e 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -1735,6 +1735,20 @@ void Message_OpenText(GlobalContext* globalCtx, u16 textId) { } else { msgCtx->msgLength = font->msgLength = CopyGanonHintText(font->msgBuf, sizeof(font->msgBuf)); } + } else if (textId == 0xF8 && GET_PLAYER(globalCtx)->getItemId == GI_ICE_TRAP) { + switch (gSaveContext.language) { + case LANGUAGE_FRA: + strcpy(font->msgBuf, "\x08\x06\x50\x05\x43IDIOT\x0E\x20\x02"); + break; + case LANGUAGE_GER: + strcpy(font->msgBuf, "\x08\x06\x15 Du bist ein\x05\x43 DUMMKOPF\x05\x40!\x0E\x20\x02"); + break; + case LANGUAGE_ENG: + default: + strcpy(font->msgBuf, "\x08\x06\x30You are a\x05\x43 FOWL\x05\x40!\x0E\x20\x02"); + break; + } + msgCtx->msgLength = font->msgLength = strlen(font->msgBuf); } else { msgCtx->msgLength = font->msgLength; char* src = (uintptr_t)font->msgOffset; 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 91fe0126c8..db91b77a13 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 @@ -98,11 +98,17 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; if (gSaveContext.n64ddFlag) { - getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); - textId = sGetItemTable[getItemId - 1].textId; - giveItemId = sGetItemTable[getItemId - 1].itemId; + if (getItemId == GI_ICE_TRAP) { + GiveItemWithoutActor(globalCtx, getItemId); + textId = 0xF8; + } else { + textId = sGetItemTable[getItemId - 1].textId; + giveItemId = sGetItemTable[getItemId - 1].itemId; + } + } + if (getItemId != GI_ICE_TRAP) { + Item_Give(globalCtx, giveItemId); } - Item_Give(globalCtx, giveItemId); if (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) { player->actor.freezeTimer = 20; } @@ -127,11 +133,17 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { if (gSaveContext.n64ddFlag) { - getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); - giveItemId = sGetItemTable[getItemId - 1].itemId; - textId = sGetItemTable[getItemId - 1].textId; + if (getItemId == GI_ICE_TRAP) { + GiveItemWithoutActor(globalCtx, getItemId); + textId = 0xF8; + } else { + textId = sGetItemTable[getItemId - 1].textId; + giveItemId = sGetItemTable[getItemId - 1].itemId; + } + } + if (getItemId != GI_ICE_TRAP) { + Item_Give(globalCtx, giveItemId); } - Item_Give(globalCtx, giveItemId); Message_StartTextbox(globalCtx, textId, NULL); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); this->actionFunc = func_80AFB950; From 75ab2f7780d9598627b4072e7090aee467e25a9c Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 19 Jul 2022 13:36:12 +0200 Subject: [PATCH 10/23] Removed temporary bunny hood change --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 bb78fda27d..7375a1b6bf 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6081,7 +6081,7 @@ void func_8083DFE0(Player* this, f32* arg1, s16* arg2) { if (this->swordState == 0) { float maxSpeed = R_RUN_SPEED_LIMIT / 100.0f; if (CVar_GetS32("gMMBunnyHood", 0) != 0 && this->currentMask == PLAYER_MASK_BUNNY) { - maxSpeed *= 3.0f; + maxSpeed *= 1.5f; } this->linearVelocity = CLAMP(this->linearVelocity, -maxSpeed, maxSpeed); } @@ -7688,7 +7688,7 @@ void func_80842180(Player* this, GlobalContext* globalCtx) { if (!func_8083C484(this, &sp2C, &sp2A)) { if (CVar_GetS32("gMMBunnyHood", 0) != 0 && this->currentMask == PLAYER_MASK_BUNNY) { - sp2C *= 3.0f; + sp2C *= 1.5f; } func_8083DF68(this, sp2C, sp2A); func_8083DDC8(this, globalCtx); From 27ac523b14e28f19c0e931bb371731f8be518fe6 Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 19 Jul 2022 16:47:49 +0200 Subject: [PATCH 11/23] Fix after dev merge --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 db91b77a13..8e313fae48 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 @@ -180,7 +180,7 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { GetItem_Draw(globalCtx, GID_SKULL_TOKEN_2); } else { f32 mtxScale; - getItemId = GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); + getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); if (getItemId >= GI_MINUET_OF_FOREST && getItemId <= GI_DOUBLE_DEFENSE) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, getItemId); } @@ -188,7 +188,7 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { mtxScale = 1.5f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); } - GetItem_Draw(globalCtx, GetItemModelFromId(getItemId)); + GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(getItemId)); } } From 69de5ac14a955af3ebbc7339a94d5aa6d39a6aea Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 19 Jul 2022 22:29:52 +0200 Subject: [PATCH 12/23] 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 }; From bfd76dc2449aa1750b5208e8a16dbd7a894fdfec Mon Sep 17 00:00:00 2001 From: aMannus Date: Tue, 19 Jul 2022 23:20:05 +0200 Subject: [PATCH 13/23] Added comment --- soh/src/code/z_actor.c | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 393172d7f8..e59dd89543 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1981,6 +1981,7 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { player->getItemId = getItemId; player->interactRangeActor = &player->actor; player->getItemDirection = player->actor.shape.rot.y; + // Player state 26 = Player is frozen if (player->stateFlags1 & (PLAYER_STATE1_26)) { player->iceTrapped = 0; } From bee6fdb8bab018d628e58b7b4feda19dd7a6d731 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 20 Jul 2022 11:04:01 +0200 Subject: [PATCH 14/23] Small fix after UX merge --- .../Enhancements/randomizer/randomizer.cpp | 98 +------------------ 1 file changed, 1 insertion(+), 97 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 39b1c1b7fa..aa8ca5265f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3802,107 +3802,11 @@ void DrawRandoEditor(bool& open) { ImGui::Separator(); // Shuffle Tokens - ImGui::Text("Shuffle Tokens"); + ImGui::Text(Settings::Tokensanity.GetName().c_str()); InsertHelpHoverText("Spoopy"); SohImGui::EnhancementCombobox("gRandomizeShuffleTokens", randoShuffleTokens, 4, 0); ImGui::Separator(); - // todo implement shops - // // Shopsanity - // ImGui::Text("Shopsanity"); - // switch (CVar_GetS32("gRandomizeShopsanity", 0)) { - // case 0: - // InsertHelpHoverText("All shop items will be the same as vanilla."); - // break; - // case 1: - // InsertHelpHoverText("Vanilla shop items will be shuffled among\ndifferent shops."); - // break; - // case 2: - // InsertHelpHoverText( - // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n1 non-vanilla shop item."); - // break; - // case 3: - // InsertHelpHoverText( - // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n2 non-vanilla shop items."); - // break; - // case 4: - // InsertHelpHoverText( - // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n3 non-vanilla shop items."); - // break; - // case 5: - // InsertHelpHoverText( - // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n4 non-vanilla shop items."); - // break; - // case 6: - // InsertHelpHoverText( - // "Vanilla shop items will be shuffled among different shops, and each " - // "shop will contain\n1 to 4 non-vanilla shop items."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeShopsanity", randoShopsanity, 7, 0); - // ImGui::Separator(); - - // todo implement GS checks - // // Tokensanity - // ImGui::Text("Tokensanity"); - // switch (CVar_GetS32("gRandomizeTokensanity", 0)) { - // case 0: - // InsertHelpHoverText("65 location will not be shuffled."); - // break; - // case 1: - // InsertHelpHoverText( - // "This only shuffles 65 location that are\nwithing dungeons, increasing the value " - // "of " - // "most\ndungeons and making internal dungeon exploration\nmore diverse."); - // break; - // case 2: - // InsertHelpHoverText( - // "This only shuffles the 65 locations that are\noutside of dungeons."); - // break; - // case 3: - // InsertHelpHoverText("Effectively adds 100 new locations for items to\nappear."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeTokensanity", randoTokensanity, 4, 0); - // ImGui::Separator(); - - // todo implement scrub shuffle - // // Shuffle Scrubs - // ImGui::Text("Shuffle Scrubs"); - // switch (CVar_GetS32("gRandomizeShuffleScrubs", 0)) { - // case 0: - // InsertHelpHoverText( - // "Only the 3 Scrubs that give one-time items in the\nvanilla game (PoH, " - // "Deku Nut capacity, and Deku\nStick capacity) will have random items."); - // break; - // case 1: - // InsertHelpHoverText("All Scrub prices will be reduced to 10 rupees each."); - // break; - // case 2: - // InsertHelpHoverText("All Scrub prices will be their vanilla prices.\nThis will require " - // "spending over 1000 rupees on\nSrubs."); - // break; - // case 3: - // InsertHelpHoverText("All Scrub prices will be between 0 to 95 rupees.\nThis will on " - // "average be very, very expensive overall."); - // break; - // } - // SohImGui::EnhancementCombobox("gRandomizeShuffleScrubs", randoShuffleScrubs, 4, 0); - // ImGui::Separator(); - - // todo implement cow shuffle - // // Shuffle Cows - // ImGui::Text("Shuffle Cows"); - // InsertHelpHoverText( - // "Enabling this will let cows give you items upon\nperforming Epona's Song in " - // "front of them. There\nare 9 cows."); - // SohImGui::EnhancementCombobox("gRandomizeShuffleCows", randoShuffleCows, 2, 0); - // ImGui::Separator(); - if(CVar_GetS32("gRandomizeStartingKokiriSword", 0) == 0) { // Shuffle Kokiri Sword SohImGui::EnhancementCheckbox(Settings::ShuffleKokiriSword.GetName().c_str(), "gRandomizeShuffleKokiriSword"); From 5c25364eff8b1a30ac6c02a2f262ccc0d430041f Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 20 Jul 2022 11:56:03 +0200 Subject: [PATCH 15/23] Nother batch of spooders --- .../Enhancements/randomizer/randomizer.cpp | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index aa8ca5265f..6fd2aae6e8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2895,6 +2895,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_KAK_IMPAS_HOUSE_FREESTANDING_POH; } break; + case 56: + switch (actorParams) { + case -28152: + return RC_LH_GS_LAB_CRATE; + } + break; case 59: // using fountainType as actorParams switch (actorParams) { @@ -3125,6 +3131,14 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_LH_SOUTHWEST_GOSSIP_STONE; case 14863: return RC_LH_SOUTHEAST_GOSSIP_STONE; + case 29185: + return RC_LH_GS_BEAN_PATCH; + case 20996: + return RC_LH_GS_LAB_WALL; + case 20994: + return RC_LH_GS_SMALL_ISLAND; + case 21008: + return RC_LH_GS_TREE; } break; case 88: @@ -3167,6 +3181,14 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_GV_CRATE_FREESTANDING_POH; case 14353: return RC_GV_GOSSIP_STONE; + case 21250: + return RC_GV_GS_SMALL_BRIDGE; + case 29441: + return RC_GV_GS_BEAN_PATCH; + case 21256: + return RC_GV_GS_BEHIND_TENT; + case 21252: + return RC_GV_GS_PILLAR; } break; case 91: @@ -3193,6 +3215,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_COLOSSUS_FREESTANDING_POH; case 14362: return RC_COLOSSUS_GOSSIP_STONE; + case 29953: + return RC_COLOSSUS_GS_BEAN_PATCH; + case 21768: + return RC_COLOSSUS_GS_TREE; + case 21764: + return RC_COLOSSUS_GS_HILL; } break; case 93: @@ -3200,12 +3228,18 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act case 262: case 1984: return RC_GF_CHEST; + case 21506: + return RC_GF_GS_TOP_FLOOR; + case 21505: + return RC_GF_GS_ARCHERY_RANGE; } break; case 94: switch (actorParams) { case -30048: return RC_WASTELAND_CHEST; + case 13570: + return RC_WASTELAND_GS; } break; case 95: @@ -3282,6 +3316,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_LLR_GS_BACK_WALL; } break; + case 100: + switch (actorParams) { + case 11777: + return RC_OGC_GS; + } + break; } return RC_UNKNOWN_CHECK; From 715a4f7315f10d7402ea4c6ce91df8fcb499af6b Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 20 Jul 2022 13:37:28 +0200 Subject: [PATCH 16/23] Added all remaining tokens(?) --- .../Enhancements/randomizer/randomizer.cpp | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 6fd2aae6e8..12970b4b84 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2464,6 +2464,16 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST; case 4372: return RC_DODONGOS_CAVERN_GOSSIP_STONE; + case 8464: + return RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS; + case 8450: + return RC_DODONGOS_CAVERN_GS_SCARECROW; + case 8452: + return RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS; + case 8449: + return RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS; + case 8456: + return RC_DODONGOS_CAVERN_GS_BACK_ROOM; } break; case 2: @@ -2474,6 +2484,14 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_JABU_JABUS_BELLY_MAP_CHEST; case -18428: return RC_JABU_JABUS_BELLY_COMPASS_CHEST; + case 8712: + return RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM; + case 8705: + return RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER; + case 8706: + return RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER; + case 8708: + return RC_JABU_JABUS_BELLY_GS_NEAR_BOSS; } break; case 3: @@ -2504,6 +2522,16 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST; case 22827: return RC_FOREST_TEMPLE_BASEMENT_CHEST; + case 8962: + return RC_FOREST_TEMPLE_GS_FIRST_ROOM; + case 8968: + return RC_FOREST_TEMPLE_GS_LOBBY; + case 8961: + return RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD; + case 8964: + return RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD; + case 8976: + return RC_FOREST_TEMPLE_GS_BASEMENT; } break; case 4: @@ -2536,6 +2564,16 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST; case 22601: return RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST; + case 9218: + return RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP; + case 9217: + return RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM; + case 9220: + return RC_FIRE_TEMPLE_GS_BOULDER_MAZE; + case 9232: + return RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB; + case 9224: + return RC_FIRE_TEMPLE_GS_SCARECROW_TOP; } break; case 5: @@ -2560,6 +2598,16 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_WATER_TEMPLE_RIVER_CHEST; case 22602: return RC_WATER_TEMPLE_DRAGON_CHEST; + case 9473: + return RC_WATER_TEMPLE_GS_BEHIND_GATE; + case 9480: + return RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST; + case 9476: + return RC_WATER_TEMPLE_GS_CENTRAL_PILLAR; + case 9474: + return RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM; + case 9488: + return RC_WATER_TEMPLE_GS_RIVER; } break; case 6: @@ -2598,6 +2646,16 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST; case -29454: return RC_SPIRIT_TEMPLE_TOPMOST_CHEST; + case 9744: + return RC_SPIRIT_TEMPLE_GS_METAL_FENCE; + case 9736: + return RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM; + case 9729: + return RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM; + case 9732: + return RC_SPIRIT_TEMPLE_GS_LOBBY; + case 9730: + return RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM; } break; case 7: @@ -2636,6 +2694,16 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_SHADOW_TEMPLE_BOSS_KEY_CHEST; case 30797: return RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST; + case 9992: + return RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM; + case 9986: + return RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM; + case 9985: + return RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT; + case 10000: + return RC_SHADOW_TEMPLE_GS_NEAR_SHIP; + case 9988: + return RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT; } break; case 8: @@ -2668,6 +2736,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST; case 27348: return RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST; + case 10244: + return RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM; + case 10242: + return RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM; + case 10241: + return RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE; } break; case 9: @@ -2680,6 +2754,12 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act return RC_ICE_CAVERN_IRON_BOOTS_CHEST; case 262: return RC_ICE_CAVERN_FREESTANDING_POH; + case 10498: + return RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM; + case 10500: + return RC_ICE_CAVERN_GS_HEART_PIECE_ROOM; + case 10497: + return RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM; } break; case 10: From 36d451eb850c9ad098124f0337dbbb1bbb4cb85e Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 20 Jul 2022 14:07:01 +0200 Subject: [PATCH 17/23] Add setting tooltip and fixed an oopsie --- soh/soh/Enhancements/randomizer/randomizer.cpp | 12 +++++++++++- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 9 +++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 12970b4b84..fd51866fa6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3923,7 +3923,17 @@ void DrawRandoEditor(bool& open) { // Shuffle Tokens ImGui::Text(Settings::Tokensanity.GetName().c_str()); - InsertHelpHoverText("Spoopy"); + InsertHelpHoverText( + "Shuffles Golden Skulltula Tokens into the item pool.\n" + "\n" + "Off - GS tokens will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle GS tokens that are within dungeons.\n" + "\n" + "Overworld - Only shuffle GS tokens that are outside of dungeons.\n" + "\n" + "All Tokens - Shuffle all 100 GS tokens." + ); SohImGui::EnhancementCombobox("gRandomizeShuffleTokens", randoShuffleTokens, 4, 0); ImGui::Separator(); 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 2095bdc26c..44b52389c8 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 @@ -106,9 +106,8 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { textId = sGetItemTable[getItemId - 1].textId; giveItemId = sGetItemTable[getItemId - 1].itemId; } - } else { - Item_Give(globalCtx, giveItemId); } + Item_Give(globalCtx, giveItemId); if (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) { player->actor.freezeTimer = 20; } @@ -140,9 +139,8 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { textId = sGetItemTable[getItemId - 1].textId; giveItemId = sGetItemTable[getItemId - 1].itemId; } - } else { - Item_Give(globalCtx, giveItemId); } + Item_Give(globalCtx, giveItemId); Message_StartTextbox(globalCtx, textId, NULL); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); this->actionFunc = func_80AFB950; @@ -178,13 +176,12 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { if (!gSaveContext.n64ddFlag) { GetItem_Draw(globalCtx, GID_SKULL_TOKEN_2); } else { - f32 mtxScale; getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); if (getItemId >= GI_MINUET_OF_FOREST && getItemId <= GI_DOUBLE_DEFENSE) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, getItemId); } if (getItemId != ITEM_SKULL_TOKEN) { - mtxScale = 1.5f; + f32 mtxScale = 1.5f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); } GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(getItemId)); From 3be2dbd005926763644d84accd56077bb1031b93 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 20 Jul 2022 14:33:12 +0200 Subject: [PATCH 18/23] Added nighttime GS sun's song option --- .../randomizer/3drando/settings.cpp | 2 ++ .../Enhancements/randomizer/randomizer.cpp | 19 +++++++++++++++---- .../Enhancements/randomizer/randomizerTypes.h | 3 ++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/settings.cpp b/soh/soh/Enhancements/randomizer/3drando/settings.cpp index 40e1bbeef4..c2b534111c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/settings.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/settings.cpp @@ -2540,6 +2540,8 @@ namespace Settings { SkipTowerEscape.SetSelectedIndex(cvarSettings[RSK_SKIP_TOWER_ESCAPE]); + NightGSExpectSuns.SetSelectedIndex(cvarSettings[RSK_SKULLS_SUNS_SONG]); + // RANDOTODO implement chest shuffle with keysanity // ShuffleChestMinigame.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_CHEST_MINIGAME]); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index fd51866fa6..935a55e1a4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3474,6 +3474,8 @@ void GenerateRandomizerImgui() { cvarSettings[RSK_SKIP_EPONA_RACE] = CVar_GetS32("gRandomizeSkipEponaRace", 0); cvarSettings[RSK_SKIP_TOWER_ESCAPE] = CVar_GetS32("gRandomizeSkipTowerEscape", 0); + cvarSettings[RSK_SKULLS_SUNS_SONG] = CVar_GetS32("gRandomizeGsExpectSunsSong", 0); + RandoMain::GenerateRando(cvarSettings); CVar_SetS32("gRandoGenerating", 0); @@ -3709,7 +3711,7 @@ void DrawRandoEditor(bool& open) { "Timer", "Zelda Gasp (Adult)" }; - ImGui::SetNextWindowSize(ImVec2(720, 530), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(750, 530), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Randomizer Editor", &open, ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::End(); return; @@ -4200,8 +4202,8 @@ void DrawRandoEditor(bool& open) { if (ImGui::BeginTable("tableRandoDetailedLogic", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { ImGui::TableSetupColumn("Exclude Locations", ImGuiTableColumnFlags_WidthStretch, 200.0f); - // Add empty columns to keep them 1/3rd of the width - ImGui::TableSetupColumn(" ", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Misc Options", ImGuiTableColumnFlags_WidthStretch, 200.0f); + // Add empty column to keep them 1/3rd of the width ImGui::TableSetupColumn(" ", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::TableHeadersRow(); ImGui::TableNextRow(); @@ -4222,8 +4224,17 @@ void DrawRandoEditor(bool& open) { SohImGui::EnhancementCheckbox("50 Skulltula Reward", "gRandomizeExcludeKak50SkullReward"); ImGui::Separator(); - // Add empty columns to keep them 1/3rd of the width + // COLUMN 2 - MISC OPTIONS ImGui::TableNextColumn(); + ImGui::Separator(); + SohImGui::EnhancementCheckbox("Nighttime GS expect Sun's Song", "gRandomizeGsExpectSunsSong"); + InsertHelpHoverText( + "All Golden Skulltulas that require nighttime to appear will only be\n" + "expected to be collected after getting Sun's Song." + ); + ImGui::Separator(); + + // Add empty column to keep them 1/3rd of the width ImGui::TableNextColumn(); ImGui::EndTable(); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index a35fe45721..95b82127e7 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -997,5 +997,6 @@ typedef enum { RSK_CUCCO_COUNT, RSK_BIG_POE_COUNT, RSK_SKIP_EPONA_RACE, - RSK_SKIP_TOWER_ESCAPE + RSK_SKIP_TOWER_ESCAPE, + RSK_SKULLS_SUNS_SONG } RandomizerSettingKey; From 0cc59a93706213d3d5be89efd7d9331e468365ec Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 20 Jul 2022 17:15:22 +0200 Subject: [PATCH 19/23] Fix for spooders to overwroote each ooder --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 2 ++ 1 file changed, 2 insertions(+) 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 44b52389c8..eed9f74a3e 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 @@ -103,6 +103,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { player->iceTrapped = 1; textId = 0xF8; } else { + getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); textId = sGetItemTable[getItemId - 1].textId; giveItemId = sGetItemTable[getItemId - 1].itemId; } @@ -136,6 +137,7 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); textId = 0xF8; } else { + getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); textId = sGetItemTable[getItemId - 1].textId; giveItemId = sGetItemTable[getItemId - 1].itemId; } From a7936942b1a1d17de982489f36964d910385c866 Mon Sep 17 00:00:00 2001 From: aMannus Date: Wed, 20 Jul 2022 22:47:25 +0200 Subject: [PATCH 20/23] Fixes for double spiders & ice traps getItemId should've been set earlier to make sure double spiders didn't screw up ice traps. Additionally Item_Give() was still being called with skultulla tokens as the default value so it granted a token when picking up an ice trap. Skulltula freeze was also happening on ice traps which it shouldn't do, so that's fixed now too. --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) 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 eed9f74a3e..9c7f8ca9a7 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 @@ -98,18 +98,20 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; if (gSaveContext.n64ddFlag) { + getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); if (getItemId == GI_ICE_TRAP) { player->getItemId = GI_ICE_TRAP; player->iceTrapped = 1; textId = 0xF8; } else { - getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); textId = sGetItemTable[getItemId - 1].textId; giveItemId = sGetItemTable[getItemId - 1].itemId; + Item_Give(globalCtx, giveItemId); } + } else { + Item_Give(globalCtx, giveItemId); } - Item_Give(globalCtx, giveItemId); - if (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) { + if ((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != GI_ICE_TRAP) { player->actor.freezeTimer = 20; } Message_StartTextbox(globalCtx, textId, NULL); @@ -133,16 +135,18 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { if (gSaveContext.n64ddFlag) { + getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); if (getItemId == GI_ICE_TRAP) { GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); textId = 0xF8; } else { - getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); textId = sGetItemTable[getItemId - 1].textId; giveItemId = sGetItemTable[getItemId - 1].itemId; + Item_Give(globalCtx, giveItemId); } + } else { + Item_Give(globalCtx, giveItemId); } - Item_Give(globalCtx, giveItemId); Message_StartTextbox(globalCtx, textId, NULL); Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); this->actionFunc = func_80AFB950; @@ -152,7 +156,8 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { void func_80AFB950(EnSi* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); - if (Message_GetState(&globalCtx->msgCtx) != TEXT_STATE_CLOSING && (CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN)) { + if (Message_GetState(&globalCtx->msgCtx) != TEXT_STATE_CLOSING && + ((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != GI_ICE_TRAP)) { player->actor.freezeTimer = 10; } else { SET_GS_FLAGS((this->actor.params & 0x1F00) >> 8, this->actor.params & 0xFF); From 37134cbc9a7973d5f92783053023ab990a92fb69 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 21 Jul 2022 08:30:48 +0200 Subject: [PATCH 21/23] Fixed ice traps (maybe actually this time) --- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 9c7f8ca9a7..cfd134d345 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 @@ -137,7 +137,8 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); if (getItemId == GI_ICE_TRAP) { - GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); + player->getItemId = GI_ICE_TRAP; + player->iceTrapped = 1; textId = 0xF8; } else { textId = sGetItemTable[getItemId - 1].textId; From 9ce552659a37cb7e2288b3f2b11c65a6ba46259a Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 21 Jul 2022 12:22:36 +0200 Subject: [PATCH 22/23] Changed iceTrapped var name/type and tooltip --- soh/include/z64player.h | 2 +- soh/soh/Enhancements/randomizer/randomizer.cpp | 3 ++- soh/src/code/z_actor.c | 2 +- soh/src/overlays/actors/ovl_En_Si/z_en_si.c | 4 ++-- soh/src/overlays/actors/ovl_player_actor/z_player.c | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/soh/include/z64player.h b/soh/include/z64player.h index bbc0fcea38..45b717c14c 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -622,7 +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; + /* 0x0A89 */ bool pendingIceTrap; } Player; // size = 0xA94 #endif diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index a0730fc2cf..ea8ffd924d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3926,7 +3926,8 @@ void DrawRandoEditor(bool& open) { // Shuffle Tokens ImGui::Text(Settings::Tokensanity.GetName().c_str()); InsertHelpHoverText( - "Shuffles Golden Skulltula Tokens into the item pool.\n" + "Shuffles Golden Skulltula Tokens into the item pool. This means\n" + "Golden Skulltulas can contain other items as well.\n" "\n" "Off - GS tokens will not be shuffled.\n" "\n" diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index e59dd89543..cdeb974e86 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1983,7 +1983,7 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { player->getItemDirection = player->actor.shape.rot.y; // Player state 26 = Player is frozen if (player->stateFlags1 & (PLAYER_STATE1_26)) { - player->iceTrapped = 0; + player->pendingIceTrap = false; } 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 cfd134d345..aa67f1a20f 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 @@ -101,7 +101,7 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); if (getItemId == GI_ICE_TRAP) { player->getItemId = GI_ICE_TRAP; - player->iceTrapped = 1; + player->pendingIceTrap = true; textId = 0xF8; } else { textId = sGetItemTable[getItemId - 1].textId; @@ -138,7 +138,7 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { getItemId = Randomizer_GetRandomizedItemId(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); if (getItemId == GI_ICE_TRAP) { player->getItemId = GI_ICE_TRAP; - player->iceTrapped = 1; + player->pendingIceTrap = true; textId = 0xF8; } else { textId = sGetItemTable[getItemId - 1].textId; 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 bff6cf3ec1..05574b1df4 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -10978,7 +10978,7 @@ 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) { + if (this->pendingIceTrap == true) { GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); } } From 8f89b969cbf74cb35c78dc9b84ba4f3b7e1595e4 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 21 Jul 2022 12:25:16 +0200 Subject: [PATCH 23/23] Tiny code cleanup --- soh/src/overlays/actors/ovl_player_actor/z_player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 05574b1df4..d1ddf2f2ef 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -10978,7 +10978,7 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) { Collider_ResetQuadAC(globalCtx, &this->shieldQuad.base); Collider_ResetQuadAT(globalCtx, &this->shieldQuad.base); - if (this->pendingIceTrap == true) { + if (this->pendingIceTrap) { GiveItemWithoutActor(globalCtx, GI_ICE_TRAP); } }