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, };