From 295f07302d61bfd35429820683f1601e18a1e664 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 28 May 2022 18:06:50 -0400 Subject: [PATCH] heart pieces now have the proper display model before picking them up --- soh/include/z64actor.h | 1 + soh/soh/Enhancements/randomizer.cpp | 141 ++++++++++++++++++++++++++++ soh/soh/Enhancements/randomizer.h | 1 + soh/soh/OTRGlobals.cpp | 4 + soh/src/code/z_en_item00.c | 29 ++++-- 5 files changed, 166 insertions(+), 10 deletions(-) diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index ab1de9fc6..0e4706352 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -289,6 +289,7 @@ typedef struct EnItem00 { /* 0x15A */ s16 unk_15A; /* 0x15C */ f32 scale; /* 0x160 */ ColliderCylinder collider; + s16 ogParams; } EnItem00; // size = 0x1AC // Only A_OBJ_SIGNPOST_OBLONG and A_OBJ_SIGNPOST_ARROW are used in room files. diff --git a/soh/soh/Enhancements/randomizer.cpp b/soh/soh/Enhancements/randomizer.cpp index ac64610bf..fe638f2f4 100644 --- a/soh/soh/Enhancements/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer.cpp @@ -3,6 +3,9 @@ #include #include #include +#include +#include +#include using json = nlohmann::json; @@ -282,6 +285,135 @@ std::unordered_map SpoilerfileCheckNameToEnum = { {"Ganons Tower Boss Key Chest", GANONS_TOWER_BOSS_KEY_CHEST} }; +std::unordered_map itemIdToModel = { { GI_NONE, GID_MAX }, + { GI_BOMBS_5, GID_BOMB }, + { GI_NUTS_5, GID_NUTS }, + { GI_BOMBCHUS_10, GID_BOMBCHU }, + { GI_BOW, GID_BOW }, + { GI_SLINGSHOT, GID_SLINGSHOT }, + { GI_BOOMERANG, GID_BOOMERANG }, + { GI_STICKS_1, GID_STICK }, + { GI_HOOKSHOT, GID_HOOKSHOT }, + { GI_LONGSHOT, GID_LONGSHOT }, + { GI_LENS, GID_LENS }, + { GI_LETTER_ZELDA, GID_LETTER_ZELDA }, + { GI_OCARINA_OOT, GID_OCARINA_TIME }, + { GI_HAMMER, GID_HAMMER }, + { GI_COJIRO, GID_COJIRO }, + { GI_LETTER_RUTO, GID_LETTER_RUTO }, + { GI_LETTER_RUTO, GID_LETTER_RUTO }, + { GI_BOTTLE, GID_BOTTLE }, + { GI_POTION_RED, GID_POTION_RED }, + { GI_POTION_GREEN, GID_POTION_GREEN }, + { GI_POTION_BLUE, GID_POTION_BLUE }, + { GI_FAIRY, GID_FAIRY }, + { GI_MILK_BOTTLE, GID_MILK }, + { GI_LETTER_RUTO, GID_LETTER_RUTO }, + { GI_BEAN, GID_BEAN }, + { GI_MASK_SKULL, GID_MASK_SKULL }, + { GI_MASK_SPOOKY, GID_MASK_SPOOKY }, + { GI_CHICKEN, GID_CHICKEN }, + { GI_MASK_KEATON, GID_MASK_KEATON }, + { GI_MASK_BUNNY, GID_MASK_BUNNY }, + { GI_MASK_TRUTH, GID_MASK_TRUTH }, + { GI_POCKET_EGG, GID_EGG }, + { GI_POCKET_CUCCO, GID_CHICKEN }, + { GI_ODD_MUSHROOM, GID_ODD_MUSHROOM }, + { GI_ODD_POTION, GID_ODD_POTION }, + { GI_SAW, GID_SAW }, + { GI_SWORD_BROKEN, GID_SWORD_BROKEN }, + { GI_PRESCRIPTION, GID_PRESCRIPTION }, + { GI_FROG, GID_FROG }, + { GI_EYEDROPS, GID_EYEDROPS }, + { GI_CLAIM_CHECK, GID_CLAIM_CHECK }, + { GI_SWORD_KOKIRI, GID_SWORD_KOKIRI }, + { GI_SWORD_KNIFE, GID_SWORD_BGS }, + { GI_SHIELD_DEKU, GID_SHIELD_DEKU }, + { GI_SHIELD_HYLIAN, GID_SHIELD_HYLIAN }, + { GI_SHIELD_MIRROR, GID_SHIELD_MIRROR }, + { GI_TUNIC_GORON, GID_TUNIC_GORON }, + { GI_TUNIC_ZORA, GID_TUNIC_ZORA }, + { GI_BOOTS_IRON, GID_BOOTS_IRON }, + { GI_BOOTS_HOVER, GID_BOOTS_HOVER }, + { GI_QUIVER_40, GID_QUIVER_40 }, + { GI_QUIVER_50, GID_QUIVER_50 }, + { GI_BOMB_BAG_20, GID_BOMB_BAG_20 }, + { GI_BOMB_BAG_30, GID_BOMB_BAG_30 }, + { GI_BOMB_BAG_40, GID_BOMB_BAG_40 }, + { GI_GAUNTLETS_SILVER, GID_GAUNTLETS_SILVER }, + { GI_GAUNTLETS_GOLD, GID_GAUNTLETS_GOLD }, + { GI_SCALE_SILVER, GID_SCALE_SILVER }, + { GI_SCALE_GOLD, GID_SCALE_GOLDEN }, + { GI_STONE_OF_AGONY, GID_STONE_OF_AGONY }, + { GI_GERUDO_CARD, GID_GERUDO_CARD }, + { GI_OCARINA_FAIRY, GID_OCARINA_FAIRY }, + { GI_SEEDS_5, GID_SEEDS }, + { GI_HEART_CONTAINER, GID_HEART_CONTAINER }, + { GI_HEART_PIECE, GID_HEART_PIECE }, + { GI_KEY_BOSS, GID_KEY_BOSS }, + { GI_COMPASS, GID_COMPASS }, + { GI_MAP, GID_DUNGEON_MAP }, + { GI_KEY_SMALL, GID_KEY_SMALL }, + { GI_MAGIC_SMALL, GID_MAGIC_SMALL }, + { GI_MAGIC_LARGE, GID_MAGIC_LARGE }, + { GI_WALLET_ADULT, GID_WALLET_ADULT }, + { GI_WALLET_GIANT, GID_WALLET_GIANT }, + { GI_WEIRD_EGG, GID_EGG }, + { GI_HEART, GID_HEART }, + { GI_ARROWS_SMALL, GID_ARROWS_SMALL }, + { GI_ARROWS_MEDIUM, GID_ARROWS_MEDIUM }, + { GI_ARROWS_LARGE, GID_ARROWS_LARGE }, + { GI_RUPEE_GREEN, GID_RUPEE_GREEN }, + { GI_RUPEE_BLUE, GID_RUPEE_BLUE }, + { GI_RUPEE_RED, GID_RUPEE_RED }, + { GI_HEART_CONTAINER_2, GI_HEART_CONTAINER_2 }, + { GI_MILK, GID_MILK }, + { GI_MASK_GORON, GID_MASK_GORON }, + { GI_MASK_ZORA, GID_MASK_ZORA }, + { GI_MASK_GERUDO, GID_MASK_GERUDO }, + { GI_BRACELET, GID_BRACELET }, + { GI_RUPEE_PURPLE, GID_RUPEE_PURPLE }, + { GI_RUPEE_GOLD, GID_RUPEE_GOLD }, + { GI_SWORD_BGS, GID_SWORD_BGS }, + { GI_ARROW_FIRE, GID_ARROW_FIRE }, + { GI_ARROW_ICE, GID_ARROW_ICE }, + { GI_ARROW_LIGHT, GID_ARROW_LIGHT }, + { GI_SKULL_TOKEN, GID_SKULL_TOKEN }, + { GI_DINS_FIRE, GID_DINS_FIRE }, + { GI_FARORES_WIND, GID_FARORES_WIND }, + { GI_NAYRUS_LOVE, GID_NAYRUS_LOVE }, + { GI_BULLET_BAG_30, GID_BULLET_BAG }, + { GI_BULLET_BAG_40, GID_BULLET_BAG }, + { GI_STICKS_5, GID_STICK }, + { GI_STICKS_10, GID_STICK }, + { GI_NUTS_5_2, GID_NUTS }, + { GI_NUTS_10, GID_NUTS }, + { GI_BOMBS_1, GID_BOMB }, + { GI_BOMBS_10, GID_BOMB }, + { GI_BOMBS_20, GID_BOMB }, + { GI_BOMBS_30, GID_BOMB }, + { GI_SEEDS_30, GID_SEEDS }, + { GI_BOMBCHUS_5, GID_BOMBCHU }, + { GI_BOMBCHUS_20, GID_BOMBCHU }, + { GI_FISH, GID_FISH }, + { GI_BUGS, GID_BUG }, + { GI_BLUE_FIRE, GID_BLUE_FIRE }, + { GI_POE, GID_POE }, + { GI_BIG_POE, GID_BIG_POE }, + { GI_DOOR_KEY, GID_KEY_SMALL }, + { GI_RUPEE_GREEN_LOSE, GID_RUPEE_GREEN }, + { GI_RUPEE_BLUE_LOSE, GID_RUPEE_BLUE }, + { GI_RUPEE_RED_LOSE, GID_RUPEE_RED }, + { GI_RUPEE_PURPLE_LOSE, GID_RUPEE_PURPLE }, + { GI_HEART_PIECE_WIN, GID_HEART_PIECE }, + { GI_STICK_UPGRADE_20, GID_STICK }, + { GI_STICK_UPGRADE_30, GID_STICK }, + { GI_NUT_UPGRADE_30, GID_NUTS }, + { GI_NUT_UPGRADE_40, GID_NUTS }, + { GI_BULLET_BAG_50, GID_BULLET_BAG_50 }, + { GI_ICE_TRAP, GID_MAX }, + { GI_TEXT_0, GID_MAX } }; + std::unordered_map SpoilerfileGetNameToEnum = { {"Bombs (5)", BOMBS_5}, {"Deku Nuts (5)", DEKU_NUTS_5}, @@ -507,6 +639,10 @@ std::unordered_map SpoilerfileGetNameToEnum = { {"Light Medallion", LIGHT_MEDALLION} }; +s16 Randomizer::GetItemModelFromId(s16 itemId) { + return itemIdToModel[itemId]; +} + void Randomizer::LoadItemLocations() { // bandaid until new save stuff happens ParseItemLocations(""); @@ -790,6 +926,11 @@ RandomizerCheck Randomizer::GetCheckFromSceneAndParams(s16 sceneNum, s16 actorPa case 22787: return KF_MIDOS_BOTTOM_RIGHT_CHEST; } + case 84: + switch (actorParams) { + case 0x0406: + return ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH; + } case 85: switch(actorParams) { case 1248: diff --git a/soh/soh/Enhancements/randomizer.h b/soh/soh/Enhancements/randomizer.h index b7c365c34..69b62fcaa 100644 --- a/soh/soh/Enhancements/randomizer.h +++ b/soh/soh/Enhancements/randomizer.h @@ -18,6 +18,7 @@ class Randomizer { Randomizer(); ~Randomizer(); + s16 GetItemModelFromId(s16 itemId); void LoadItemLocations(); void ParseItemLocations(std::string spoilerfilename); GetItemID GetItemFromActor(s16 actorId, GetItemID ogItemId); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 8e9b8631c..53b735241 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -996,6 +996,10 @@ extern "C" int Controller_ShouldRumble(size_t i) { return 0; } +extern "C" s16 GetItemModelFromId(s16 itemId) { + return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId); +} + extern "C" void LoadItemLocations() { OTRGlobals::Instance->gRandomizer->LoadItemLocations(); } diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 78c144209..cc34402ad 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -346,6 +346,8 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { s16 spawnParam8000 = this->actor.params & 0x8000; s32 pad1; + this->ogParams = this->actor.params; + this->collectibleFlag = (this->actor.params & 0x3F00) >> 8; this->actor.params &= 0xFF; @@ -695,7 +697,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { } if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { - getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->actor.params); + getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->ogParams); func_8002F554(&this->actor, globalCtx, getItemId); } @@ -1056,7 +1058,7 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if (gSaveContext.n64ddFlag) { - getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->actor.params); + getItemId = Item00_GetRandomizedItemId(this, globalCtx->sceneNum, this->ogParams); } func_8002F554(&this->actor, globalCtx, getItemId); } @@ -1325,17 +1327,24 @@ void EnItem00_DrawHeartContainer(EnItem00* this, GlobalContext* globalCtx) { * Draw Function used for the Piece of Heart type of En_Item00. */ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { - s32 pad; + if (gSaveContext.n64ddFlag) { + f32 mtxScale = 16.0f; + Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); + GetItem_Draw(globalCtx, GetItemModelFromId(Item00_GetRandomizedItemId(this, gGlobalCtx->sceneNum, this->actor.params))); + } else { + s32 pad; - OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1658); + OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1658); - func_80093D84(globalCtx->state.gfxCtx); - func_8002ED80(&this->actor, globalCtx, 0); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1670), - G_MTX_MODELVIEW | G_MTX_LOAD); - gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL); + func_80093D84(globalCtx->state.gfxCtx); + func_8002ED80(&this->actor, globalCtx, 0); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_item00.c", 1670), + G_MTX_MODELVIEW | G_MTX_LOAD); - CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1673); + gSPDisplayList(POLY_XLU_DISP++, gHeartPieceInteriorDL); + + CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_item00.c", 1673); + } } /**