From 5906e715501b3a01a6a7c29535c72fea860afc20 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sun, 29 May 2022 20:18:16 -0400 Subject: [PATCH 1/2] warps are fully working (chests broken) --- soh/include/z64item.h | 8 ++++- soh/include/z64player.h | 2 +- soh/soh/Enhancements/randomizer.cpp | 33 ++++++++++++++++--- soh/soh/Enhancements/randomizer.h | 4 ++- soh/soh/OTRGlobals.cpp | 8 +++++ soh/soh/OTRGlobals.h | 3 ++ .../actors/ovl_Door_Warp1/z_door_warp1.c | 29 +++++++++++++++- soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c | 2 +- .../actors/ovl_Item_B_Heart/z_item_b_heart.c | 2 +- .../actors/ovl_player_actor/z_player.c | 8 +++++ 10 files changed, 89 insertions(+), 10 deletions(-) diff --git a/soh/include/z64item.h b/soh/include/z64item.h index 6cb5ec2a4..f33c49a55 100644 --- a/soh/include/z64item.h +++ b/soh/include/z64item.h @@ -380,7 +380,13 @@ typedef enum { /* 0x7B */ GI_BULLET_BAG_50, /* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) - /* 0x7E */ GI_MAX + /* 0x7E */ GI_MEDALLION_LIGHT, + /* 0x7F */ GI_MEDALLION_FOREST, + /* 0x80 */ GI_MEDALLION_FIRE, + /* 0x81 */ GI_MEDALLION_WATER, + /* 0x82 */ GI_MEDALLION_SHADOW, + /* 0x83 */ GI_MEDALLION_SPIRIT, + /* 0x84 */ GI_MAX } GetItemID; typedef enum { diff --git a/soh/include/z64player.h b/soh/include/z64player.h index 9bce60ffe..f9616989d 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -481,7 +481,7 @@ typedef struct Player { /* 0x042D */ s8 doorDirection; /* 0x042E */ s16 doorTimer; /* 0x0430 */ Actor* doorActor; - /* 0x0434 */ s8 getItemId; + /* 0x0434 */ u8 getItemId; /* 0x0436 */ u16 getItemDirection; /* 0x0438 */ Actor* interactRangeActor; /* 0x043C */ s8 mountSide; diff --git a/soh/soh/Enhancements/randomizer.cpp b/soh/soh/Enhancements/randomizer.cpp index 89cb29646..744185c78 100644 --- a/soh/soh/Enhancements/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer.cpp @@ -782,8 +782,8 @@ void Randomizer::ParseItemLocations(const char* spoilerFileName) { } } -s32 Randomizer::GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { - s32 itemId = GetItemFromActor(actorId, actorParams, sceneNum, ogId); +GetItemID Randomizer::GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { + GetItemID itemId = GetItemFromActor(actorId, actorParams, sceneNum, ogId); return itemId; } @@ -791,6 +791,17 @@ 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: @@ -984,6 +995,18 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) return GI_ARROWS_LARGE; case DEKU_STICK_1: return GI_STICKS_1; + case LIGHT_MEDALLION: + return GI_MEDALLION_LIGHT; + case FOREST_MEDALLION: + return GI_MEDALLION_FOREST; + case FIRE_MEDALLION: + return GI_MEDALLION_FIRE; + case WATER_MEDALLION: + return GI_MEDALLION_WATER; + case SHADOW_MEDALLION: + return GI_MEDALLION_SHADOW; + case SPIRIT_MEDALLION: + return GI_MEDALLION_SPIRIT; default: return ogItemId; } @@ -1005,9 +1028,11 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act } } case 17: - switch (actorParams) { - case 0x1F: + switch (actorId) { + case 95: return DEKU_TREE_QUEEN_GOHMA_HEART; + case 93: + return QUEEN_GOHMA; } case 40: switch(actorParams) { diff --git a/soh/soh/Enhancements/randomizer.h b/soh/soh/Enhancements/randomizer.h index 2a95a1aeb..cdeb947be 100644 --- a/soh/soh/Enhancements/randomizer.h +++ b/soh/soh/Enhancements/randomizer.h @@ -21,7 +21,9 @@ class Randomizer { s16 GetItemModelFromId(s16 itemId); void LoadItemLocations(const char* spoilerFileName); void ParseItemLocations(const char* spoilerFileName); - s32 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); + ItemID GetItemIdFromGetItem(GetItemID getItemId); + ItemID GetItemFromGetItem(GetItemID getItemId); + GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); }; #endif diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index c730198fa..4ca7155d9 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1038,4 +1038,12 @@ extern "C" void ParseItemLocations(const char* spoilerFileName) { extern "C" s32 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); +} + +extern "C" ItemID GetItemIdFromGetItem(GetItemID getItemId) { + return OTRGlobals::Instance->gRandomizer->GetItemIdFromGetItem(getItemId); +} + +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 78753c86e..433905b0d 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -76,6 +76,9 @@ void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples); int Controller_ShouldRumble(size_t i); 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); #endif diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index a2a256731..2613f861d 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -461,6 +461,28 @@ s32 DoorWarp1_PlayerInRange(DoorWarp1* this, GlobalContext* globalCtx) { return ret; } +u8 success = 0; + +void GivePlayerRandoReward(DoorWarp1* this, Player* player, GlobalContext* globalCtx) { + GetItemID getItemId = GetRandomizedItemId(GI_NONE, this->actor.id, this->actor.params, globalCtx->sceneNum); + + if (success && !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { + Audio_PlaySoundGeneral(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &D_801333E0, &D_801333E0, + &D_801333E8); + OnePointCutscene_Init(globalCtx, 0x25E7, 999, &this->actor, MAIN_CAM); + func_8002DF54(globalCtx, &this->actor, 10); + + player->unk_450.x = this->actor.world.pos.x; + player->unk_450.z = this->actor.world.pos.z; + this->unk_1B2 = 1; + DoorWarp1_SetupAction(this, DoorWarp1_ChildWarpOut); + + success = 0; + } else if (!success) { + success = func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); + } +} + void DoorWarp1_ChildWarpIdle(DoorWarp1* this, GlobalContext* globalCtx) { Player* player; @@ -468,6 +490,11 @@ void DoorWarp1_ChildWarpIdle(DoorWarp1* this, GlobalContext* globalCtx) { if (DoorWarp1_PlayerInRange(this, globalCtx)) { player = GET_PLAYER(globalCtx); + + if (gSaveContext.n64ddFlag) { + GivePlayerRandoReward(this, player, globalCtx); + return; + } Audio_PlaySoundGeneral(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &D_801333E0, &D_801333E0, &D_801333E8); @@ -514,11 +541,11 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (!Flags_GetEventChkInf(7)) { Flags_SetEventChkInf(7); Flags_SetEventChkInf(9); - Item_Give(globalCtx, ITEM_KOKIRI_EMERALD); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x0457; gSaveContext.nextCutsceneIndex = 0; } else { + Item_Give(globalCtx, ITEM_KOKIRI_EMERALD); globalCtx->nextEntranceIndex = 0xEE; gSaveContext.nextCutsceneIndex = 0xFFF1; } diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c index 655dfb6e1..c290132b0 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c @@ -214,7 +214,7 @@ void func_809DF778(EnCow* this, GlobalContext* globalCtx) { this->actor.parent = NULL; this->actionFunc = func_809DF730; } else { - func_8002F434(&this->actor, globalCtx, GI_MILK, 10000.0f, 100.0f); + func_8002F434(&this->actor, globalCtx, GID_MEDALLION_FIRE, 10000.0f, 100.0f); } } diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index 07bd5480e..7a9816087 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -60,7 +60,7 @@ void ItemBHeart_Update(Actor* thisx, GlobalContext* globalCtx) { Actor_Kill(&this->actor); } else { if (gSaveContext.n64ddFlag) { - s16 getItemId = GetRandomizedItemId(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum); + s32 getItemId = GetRandomizedItemId(GI_HEART_CONTAINER_2, this->actor.id, this->actor.params, globalCtx->sceneNum); func_8002F434(&this->actor, globalCtx, getItemId, 30.0f, 40.0f); } else { func_8002F434(&this->actor, globalCtx, GI_HEART_CONTAINER_2, 30.0f, 40.0f); 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 66cd1e3d6..8d8703056 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -619,6 +619,14 @@ static GetItemEntry sGetItemTable[] = { GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x3C, 0x80, CHEST_ANIM_LONG), // Ice Traps + GET_ITEM_NONE, + GET_ITEM(ITEM_MEDALLION_LIGHT, OBJECT_GI_MEDAL, GID_MEDALLION_LIGHT, 0x40, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_FOREST, OBJECT_GI_MEDAL, GID_MEDALLION_FOREST, 0x3E, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_FIRE, OBJECT_GI_MEDAL, GID_MEDALLION_FIRE, 0x3C, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG), GET_ITEM_NONE, GET_ITEM_NONE, }; From 974fa03aa4ebb82410e54b7e9a831dc737f17771 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sun, 29 May 2022 21:01:09 -0400 Subject: [PATCH 2/2] chests are working again --- soh/include/z64item.h | 6 +++++ soh/include/z64player.h | 2 +- soh/soh/Enhancements/randomizer.cpp | 20 ++++++++++++++++ soh/src/code/z_draw.c | 6 +++++ .../actors/ovl_Door_Warp1/z_door_warp1.c | 24 ++++++++++++++----- .../actors/ovl_player_actor/z_player.c | 3 +++ 6 files changed, 54 insertions(+), 7 deletions(-) diff --git a/soh/include/z64item.h b/soh/include/z64item.h index f33c49a55..0b5948d35 100644 --- a/soh/include/z64item.h +++ b/soh/include/z64item.h @@ -386,6 +386,9 @@ typedef enum { /* 0x81 */ GI_MEDALLION_WATER, /* 0x82 */ GI_MEDALLION_SHADOW, /* 0x83 */ GI_MEDALLION_SPIRIT, + /* 0x81 */ GI_STONE_KOKIRI, + /* 0x82 */ GI_STONE_GORON, + /* 0x83 */ GI_STONE_ZORA, /* 0x84 */ GI_MAX } GetItemID; @@ -507,6 +510,9 @@ typedef enum { /* 0x72 */ GID_BULLET_BAG_50, /* 0x73 */ GID_SWORD_KOKIRI, /* 0x74 */ GID_SKULL_TOKEN_2, + /* 0x74 */ GID_KOKIRI_EMERALD, + /* 0x74 */ GID_GORON_RUBY, + /* 0x74 */ GID_ZORA_SAPPHIRE, /* 0x75 */ GID_MAX } GetItemDrawID; diff --git a/soh/include/z64player.h b/soh/include/z64player.h index f9616989d..1f317e27a 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -481,7 +481,7 @@ typedef struct Player { /* 0x042D */ s8 doorDirection; /* 0x042E */ s16 doorTimer; /* 0x0430 */ Actor* doorActor; - /* 0x0434 */ u8 getItemId; + /* 0x0434 */ s16 getItemId; /* 0x0436 */ u16 getItemDirection; /* 0x0438 */ Actor* interactRangeActor; /* 0x043C */ s8 mountSide; diff --git a/soh/soh/Enhancements/randomizer.cpp b/soh/soh/Enhancements/randomizer.cpp index 744185c78..4c62de44f 100644 --- a/soh/soh/Enhancements/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer.cpp @@ -1007,6 +1007,12 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) return GI_MEDALLION_SHADOW; case SPIRIT_MEDALLION: return GI_MEDALLION_SPIRIT; + case KOKIRI_EMERALD: + return GI_STONE_KOKIRI; + case GORON_RUBY: + return GI_STONE_GORON; + case ZORA_SAPPHIRE: + return GI_STONE_ZORA; default: return ogItemId; } @@ -1034,6 +1040,20 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act case 93: return QUEEN_GOHMA; } + case 18: + switch (actorId) { + case 95: + return DODONGOS_CAVERN_KING_DODONGO_HEART; + case 93: + return KING_DODONGO; + } + case 19: + switch (actorId) { + case 95: + return JABU_JABUS_BELLY_BARINADE_HEART; + case 93: + return BARINADE; + } case 40: switch(actorParams) { case 22944: diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index 20ff39b0b..1b67d9e71 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -367,6 +367,12 @@ DrawItemTableEntry sDrawItemTable[] = { { GetItem_DrawOpa0, { gGiKokiriSwordDL } }, // gold skulltula token, OBJECT_ST { GetItem_DrawSkullToken, { object_st_DL_004DB0, object_st_DL_004EB8 } }, + + { GetItem_DrawOpa0Xlu1, { gGiKokiriEmeraldGemDL, gGiKokiriEmeraldSettingDL } }, + // fire medallion, OBJECT_GI_MEDAL + { GetItem_DrawOpa0Xlu1, { gGiGoronRubySettingDL, gGiGoronRubyGemDL } }, + // water medallion, OBJECT_GI_MEDAL + { GetItem_DrawOpa0Xlu1, { gGiZoraSapphireSettingDL, gGiZoraSapphireGemDL, } }, }; /** diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 2613f861d..2820c3658 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -530,9 +530,14 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (globalCtx->sceneNum == SCENE_DDAN_BOSS) { if (!Flags_GetEventChkInf(0x25)) { Flags_SetEventChkInf(0x25); - Item_Give(globalCtx, ITEM_GORON_RUBY); - globalCtx->nextEntranceIndex = 0x13D; - gSaveContext.nextCutsceneIndex = 0xFFF1; + if (gSaveContext.n64ddFlag) { + globalCtx->nextEntranceIndex = 0x47A; + gSaveContext.nextCutsceneIndex = 0; + } else { + Item_Give(globalCtx, ITEM_GORON_RUBY); + globalCtx->nextEntranceIndex = 0x13D; + gSaveContext.nextCutsceneIndex = 0xFFF1; + } } else { globalCtx->nextEntranceIndex = 0x47A; gSaveContext.nextCutsceneIndex = 0; @@ -640,9 +645,16 @@ void DoorWarp1_RutoWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF) { gSaveContext.eventChkInf[3] |= 0x80; - Item_Give(globalCtx, ITEM_ZORA_SAPPHIRE); - globalCtx->nextEntranceIndex = 0x10E; - gSaveContext.nextCutsceneIndex = 0xFFF0; + + if (gSaveContext.n64ddFlag) { + globalCtx->nextEntranceIndex = 0x10E; + gSaveContext.nextCutsceneIndex = 0; + } else { + Item_Give(globalCtx, ITEM_ZORA_SAPPHIRE); + globalCtx->nextEntranceIndex = 0x10E; + gSaveContext.nextCutsceneIndex = 0xFFF0; + } + globalCtx->sceneLoadFlag = 0x14; globalCtx->fadeTransition = 7; } 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 8d8703056..7e04bf38a 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -627,6 +627,9 @@ static GetItemEntry sGetItemTable[] = { GET_ITEM(ITEM_MEDALLION_WATER, OBJECT_GI_MEDAL, GID_MEDALLION_WATER, 0x3D, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MEDALLION_SHADOW, OBJECT_GI_MEDAL, GID_MEDALLION_SHADOW, 0x41, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MEDALLION_SPIRIT, OBJECT_GI_MEDAL, GID_MEDALLION_SPIRIT, 0x3F, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_KOKIRI_EMERALD, OBJECT_GI_COIN, GID_NCOIN_GREEN, 0x80, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_GORON_RUBY, OBJECT_GI_COIN, GID_NCOIN_RED, 0x81, 0x80, CHEST_ANIM_LONG), + GET_ITEM(ITEM_ZORA_SAPPHIRE, OBJECT_GI_COIN, GID_NCOIN_BLUE, 0x82, 0x80, CHEST_ANIM_LONG), GET_ITEM_NONE, GET_ITEM_NONE, };