From 9d4bf68bcac5f28f8fb63a2e915a3c5333a7e010 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sun, 14 Dec 2025 21:30:29 +0100 Subject: [PATCH 01/13] Roc's Feather in rando pool initial commit --- .../gPlayerAnimData_link_rocs_feather_jump | Bin 0 -> 2748 bytes .../gPlayerAnim_link_rocs_feather_jump | Bin 0 -> 141 bytes .../icon_item_static/gRocsFeather.rgba32.png | Bin 0 -> 4570 bytes soh/assets/soh_assets.h | 7 ++ soh/include/functions.h | 4 +- soh/include/variables.h | 2 +- soh/include/z64item.h | 2 + .../Enhancements/debugger/debugSaveEditor.cpp | 13 +++- .../vanilla-behavior/GIVanillaBehavior.h | 8 +++ .../3drando/hint_list/hint_list_item.cpp | 10 +++ .../randomizer/3drando/item_pool.cpp | 5 ++ .../Enhancements/randomizer/3drando/shops.cpp | 7 +- .../Enhancements/randomizer/RocsFeather.cpp | 62 ++++++++++++++++++ .../randomizer/RocsFeatherCycle.c | 25 +++++++ .../randomizer/RocsFeatherCycle.h | 9 +++ soh/soh/Enhancements/randomizer/draw.cpp | 20 ++++++ soh/soh/Enhancements/randomizer/draw.h | 1 + soh/soh/Enhancements/randomizer/item_list.cpp | 2 + .../randomizer/option_descriptions.cpp | 3 + .../Enhancements/randomizer/randomizer.cpp | 38 ++++++++++- soh/soh/Enhancements/randomizer/randomizer.h | 2 + .../Enhancements/randomizer/randomizerTypes.h | 7 ++ .../Enhancements/randomizer/randomizer_inf.h | 4 +- soh/soh/Enhancements/randomizer/settings.cpp | 2 + soh/soh/OTRGlobals.cpp | 2 + soh/src/code/z_inventory.c | 29 ++++++++ soh/src/code/z_parameter.c | 6 ++ soh/src/code/z_play.c | 4 ++ .../actors/ovl_player_actor/z_player.c | 6 +- .../misc/ovl_kaleido_scope/z_kaleido_item.c | 9 +++ 30 files changed, 279 insertions(+), 10 deletions(-) create mode 100644 soh/assets/custom/objects/gameplay_keep/gPlayerAnimData_link_rocs_feather_jump create mode 100644 soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump create mode 100644 soh/assets/custom/textures/icon_item_static/gRocsFeather.rgba32.png create mode 100644 soh/soh/Enhancements/randomizer/RocsFeather.cpp create mode 100644 soh/soh/Enhancements/randomizer/RocsFeatherCycle.c create mode 100644 soh/soh/Enhancements/randomizer/RocsFeatherCycle.h diff --git a/soh/assets/custom/objects/gameplay_keep/gPlayerAnimData_link_rocs_feather_jump b/soh/assets/custom/objects/gameplay_keep/gPlayerAnimData_link_rocs_feather_jump new file mode 100644 index 0000000000000000000000000000000000000000..2db97cd686092f2331ebe51e9118dc54c81446fc GIT binary patch literal 2748 zcma);3rrM87{_N1c__%k;-m3JKp=oZS4vA6`=@HT8puwu~-{5(Z*`EQQK6l zM$n>|9-A}#Ix-rJNNB>{`1Xm z=VoV?F~%~}va{3=Yp*W9iVN}oEo1!Q>=|nK1(#B)i!of$7W^VYk({w+58abPDR$MM zE-BMTtB6%+qDJe+R=J8|-K+X8?#Di+e8{0j;q!_YxeY&KP2CZr2%hD}XjF)Tv59*7 z3vqChpLLUz|YvNSSW$tniPi8lAaSl6iKhZGio|&DIEb-4P%xfju1rgT10KXUL|Pb z?cNmRM_mw%8b$EBJKhxN#hBHKx^d93W?&y7{f5rDuf?B*O$Payea4g%XArgGq)48aZQI;)kxai59-zBqap3X|QoT2_i zQ8pF*orRQja>TlG_97^04~XJQ??G_|4k&GBeN$wItY*Q1a0s6FbY0An!4`QJIcOCW z)qKP5c}zvhqMA8*GdhT3aSrA!{dJ;94l8arIujXFZxhAfkhs*W%}`!E?wcYl^l!GH z2OQ=*qSmZ9rCn*$dngjdY_2#hRY1WV#)lJP+}0^P zKM}?3^Z5fe#3GJA=$j%hvPMg-M1R3gSPY63F;Lrd0V>nizs+?qJBebizIPvg6;3H1Jzjlv_B-f%U@uW@ZuF0yJ`%0TohZnU z+SB7lHmMDf;GcyU6iKo}t5o}(Isx=^MvcjWgsFgHN3PaL??^^EM&De3EK&}4$6qU( zi@p<|tc$*_XJdZOMr+b@C>&wKnEf6cf{zR}D7YM8NufPoWy4(9S&Ih>?l6|kwPEU= zTSPHxER_8D`jgAu?!(ts>hV%FrfT6acRf*c`flp%L_vP!%T(t`_G3hX=ldD!!Z=eI zTM>q~*u&-y4n@k?!zme)-9&*iRZ72Qly#D4!S&S(5o@(XaYEkevwIctZ0+=pm=wd* zIdWUTq4tY*?{fs}h_P{l(YAk=Nnt4C@ebQDK2fY#Nm(CyhPF&wf?mldiQ-UzBRqaR zl!Z0ESLgk1Xhjix?5|9@=*~FV4~>RWy4|EWsDDkAZVw#a_n|jM(;}kSE&OhLxeQri zE)zvq*Ph+yZG=*O%s0hRH5XI_U--wf6!hdlKbRDTa@@Y>j!D7TtT%}wS020ZUc$d+@zqflwwy6>U#bc-=}Iw>ih3seE$H&(t>*c literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump b/soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump new file mode 100644 index 0000000000000000000000000000000000000000..4e878ec8fd8aa058efae6c00156b65749ecdf1f5 GIT binary patch literal 141 zcmZQzU|{g|bMyyN4Da`?y$8Y|HnD&as8EE#8A!&*`-cR@$LA+yr6!jY>!&B?rWWKR wR>o(irWWX@2LPF=MUHuyxh{z%iSap^dD-zr`N_rcX{m`N8L36_S*5uJ08Nx4Pyhe` literal 0 HcmV?d00001 diff --git a/soh/assets/custom/textures/icon_item_static/gRocsFeather.rgba32.png b/soh/assets/custom/textures/icon_item_static/gRocsFeather.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..347144cfa28f5406a332e7b531dbdb4cff5f49ef GIT binary patch literal 4570 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 literal 0 HcmV?d00001 diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 3c3ddcf5a7e..4e24fa50daf 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -431,6 +431,9 @@ static const ALIGN_ASSET(2) char gFileSelLanguageFRATex[] = dgFileSelLanguageFRA #define dgFileSelLanguageGERTex "__OTR__textures/title_static/gFileSelLanguageGERTex" static const ALIGN_ASSET(2) char gFileSelLanguageGERTex[] = dgFileSelLanguageGERTex; +#define dgRocsFeather "__OTR__textures/icon_item_static/gRocsFeather" +static const ALIGN_ASSET(2) char gRocsFeather[] = dgRocsFeather; + #define dgEmptyTexture "__OTR__textures/virtual/gEmptyTexture" static const ALIGN_ASSET(2) char gEmptyTexture[] = dgEmptyTexture; @@ -453,6 +456,10 @@ static const ALIGN_ASSET(2) char gLinkAdultGoronTunicSkel[] = dgLinkAdultGoronTu #define dgLinkAdultZoraTunicSkel "__OTR__objects/object_link_boy_zora/gLinkAdultZoraTunicSkel" static const ALIGN_ASSET(2) char gLinkAdultZoraTunicSkel[] = dgLinkAdultZoraTunicSkel; +// Animations +#define dgPlayerAnim_link_rocs_feather_jump "__OTR__objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump" +static const ALIGN_ASSET(2) char gPlayerAnim_link_rocs_feather_jump[] = dgPlayerAnim_link_rocs_feather_jump; + // LUS Logo #define dgShipLogoDL "__OTR__textures/nintendo_rogo_static/gShipLogoDL" static const ALIGN_ASSET(2) char gShipLogoDL[] = dgShipLogoDL; diff --git a/soh/include/functions.h b/soh/include/functions.h index 11dbf8c811a..f9e7650f4a3 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -2452,11 +2452,13 @@ void Font_LoadOrderedFontNTSC(Font* font); // #endregion // #region SOH [General] - void Interface_RandoRestoreSwordless(void); s32 Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projectedPos, f32 projectedW, bool* shouldDraw, bool* shouldUpdate); +// #region SOH [Rocs Feather] +void func_80838940(Player* this, LinkAnimationHeader* anim, f32 arg2, PlayState* play, u16 sfxId); + // #endregion #ifdef __cplusplus diff --git a/soh/include/variables.h b/soh/include/variables.h index 27ad4584d24..e296017aab3 100644 --- a/soh/include/variables.h +++ b/soh/include/variables.h @@ -103,7 +103,7 @@ extern "C" extern u16 gUpgradeCapacities[8][4]; extern u32 gGsFlagsMasks[4]; extern u32 gGsFlagsShifts[4]; - extern void* gItemIcons[0x82]; + extern void* gItemIcons[157]; extern u8 gItemAgeReqs[]; extern u8 gSlotAgeReqs[]; extern u8 gItemSlots[56]; diff --git a/soh/include/z64item.h b/soh/include/z64item.h index b1fa897fe6e..9bbb8bb30f2 100644 --- a/soh/include/z64item.h +++ b/soh/include/z64item.h @@ -309,6 +309,7 @@ typedef enum { /* 0x99 */ ITEM_STICK_UPGRADE_30, /* 0x9A */ ITEM_NUT_UPGRADE_30, /* 0x9B */ ITEM_NUT_UPGRADE_40, + /* */ ITEM_ROCS_FEATHER, /* 0xFC */ ITEM_LAST_USED = 0xFC, /* 0xFE */ ITEM_NONE_FE = 0xFE, /* 0xFF */ ITEM_NONE = 0xFF @@ -592,6 +593,7 @@ typedef enum { /* 0x7A */ GID_SONG_TIME, /* 0x7B */ GID_SONG_STORM, /* 0x7C */ GID_TRIFORCE_PIECE, + /* 0x7C */ GID_ROCS_FEATHER, /* */ GID_FISHING_POLE, /* 0x7C */ GID_MAXIMUM diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 463f900e0d4..90afdca0478 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -433,7 +433,16 @@ void DrawInventoryTab() { uint8_t item = gSaveContext.inventory.items[index]; PushStyleButton(Colors::DarkGray); - if (item != ITEM_NONE) { + if (item == ITEM_ROCS_FEATHER) { + auto ret = ImGui::ImageButton( + "ROCS_FEATHER", + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName("ROCS_FEATHER"), + ImVec2(48.0f, 48.0f), ImVec2(0, 0), ImVec2(1, 1)); + if (ret) { + selectedIndex = index; + ImGui::OpenPopup(itemPopupPicker); + } + } else if (item != ITEM_NONE) { const ItemMapEntry& slotEntry = itemMapping.find(item)->second; auto ret = ImGui::ImageButton( slotEntry.name.c_str(), @@ -1736,4 +1745,6 @@ void SaveEditorWindow::DrawElement() { } void SaveEditorWindow::InitElement() { + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ROCS_FEATHER", gRocsFeather, + ImVec4(1, 1, 1, 1)); } diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index f604c9c7954..3103d88cd5e 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2382,6 +2382,14 @@ typedef enum { // - `*Color_RGB8` VB_APPLY_TUNIC_COLOR, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*int32_t` // ItemID + VB_USE_ITEM, + } GIVanillaBehavior; #endif diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index c74c0ff23b9..170c726265c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -1964,6 +1964,16 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a gold fragment", /*german*/"ein Goldfragment", /*french*/"un fragment d'or")}); // /*spanish*/un fragmento dorado + hintTextTable[RHT_ROCS_FEATHER] = HintText(CustomMessage("Roc's Feather", /*german*/"Roc's Feather", /*french*/"Roc's Feather"), + // /*spanish*/un fragmento de la Trifuerza + {}, { + CustomMessage("a feather", /*german*/"a feather", /*french*/"a feather"), + // /*spanish*/un trígono del triunfo + CustomMessage("a chicken wing", /*german*/"a chicken wing", /*french*/"a chicken wing"), + // /*spanish*/un porción de queso + CustomMessage("a blue wing", /*german*/"a blue wing", /*french*/"a blue wing")}); + // /*spanish*/un fragmento dorado + hintTextTable[RHT_GOHMA_SOUL] = HintText(CustomMessage("the soul of Gohma", /*german*/"Gohmas Seele", /*french*/"l'Âme de Gohma"), { CustomMessage("something webbed", /*german*/"etwas Verwobenes", /*french*/"un truc entoilé") diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index ec90b0619a8..ba72c967c7d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -511,6 +511,11 @@ void GenerateItemPool() { ctx->PlaceItemInLocation(RC_GANON, RG_TRIFORCE); // Win condition } + if (ctx->GetOption(RSK_ROCS_FEATHER)) { + ctx->possibleIceTrapModels.push_back(RG_ROCS_FEATHER); + AddItemToMainPool(RG_ROCS_FEATHER); + } + // Fixed item locations ctx->PlaceItemInLocation(RC_HC_ZELDAS_LETTER, RG_ZELDAS_LETTER); diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 06fe5790f83..ae0b466df84 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -27,7 +27,7 @@ PriceSettingsStruct::PriceSettingsStruct(RandomizerSettingKey _main, RandomizerS affordable = _affordable; } -static std::array, 0xF1> trickNameTable; // Table of trick names for ice traps +static std::array, RG_MAX> trickNameTable; // Table of trick names for ice traps bool initTrickNames = false; // Indicates if trick ice trap names have been initialized yet // Set vanilla shop item locations before potentially shuffling @@ -887,6 +887,11 @@ void InitTrickNames() { Text{ "Triforce Shard", "Éclat de Triforce", "Triforce-Fragment" }, // "Triforce Shard" Text{ "Shiny Rock", "Caillou Brillant", "glänzender Stein" }, // "Shiny Rock" }; + trickNameTable[RG_ROCS_FEATHER] = { + Text{ "Chicken Wing", "Chicken Wing", "Chicken Wing" }, // "Chicken Wing" + Text{ "Roc's Leg", "Roc's Leg", "Roc's Leg" }, // "Roc's Leg" + Text{ "Roc's Fapper", "Roc's Fapper", "Roc's Fapper" }, // "Roc's Fapper" + }; trickNameTable[RG_GOHMA_SOUL] = { Text{ "Spider Sense", "Sens de l'Araignée", "Spinnensinn" }, Text{ "Deku Spirit", "Parasite Mojo", "Deku Geist" }, diff --git a/soh/soh/Enhancements/randomizer/RocsFeather.cpp b/soh/soh/Enhancements/randomizer/RocsFeather.cpp new file mode 100644 index 00000000000..29623f342f6 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/RocsFeather.cpp @@ -0,0 +1,62 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include + +extern "C" { +#include +#include "functions.h" +#include "variables.h" +#include "macros.h" +#include "objects/gameplay_keep/gameplay_keep.h" +extern PlayState* gPlayState; +} + +uint8_t rocsUseCount = 0; + +void RegisterRocsFeather() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_ROCS_FEATHER); + + COND_HOOK(OnPlayerUpdate, shouldRegister, []() { + Player* player = GET_PLAYER(gPlayState); + // Reset Rocs count when touching the ground + if (player->actor.bgCheckFlags & 1) { + rocsUseCount = 0; + } + }); + + COND_VB_SHOULD(VB_USE_ITEM, shouldRegister, { + int32_t* usedItem = va_arg(args, int32_t*); + Player* player = GET_PLAYER(gPlayState); + + // Roc's Feather behaviour + if (*usedItem == ITEM_ROCS_FEATHER) { + *should = false; + + if (!rocsUseCount) { + rocsUseCount++; + player->linearVelocity = 5.0f; + player->actor.velocity.y = 8.0f; + player->actor.world.rot.y = player->yaw = player->actor.shape.rot.y; + + func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_rocs_feather_jump, + !(2 & 1) ? 5.8f : 3.5f, gPlayState, 0); + + Vec3f effectsPos = player->actor.home.pos; + effectsPos.y += 3; + f32 effectsScale = 1; + if (!gSaveContext.linkAge) { + effectsScale = 1.5f; + } + EffectSsGRipple_Spawn(gPlayState, &effectsPos, 200 * effectsScale, 300 * effectsScale, 1); + EffectSsGSplash_Spawn(gPlayState, &effectsPos, NULL, NULL, 0, 150 * effectsScale); + + player->stateFlags2 &= ~(PLAYER_STATE2_HOPPING); + + Player_PlaySfx(&player->actor, NA_SE_PL_SKIP); + } + } + }); +} + +static RegisterShipInitFunc registerRocsFeather(RegisterRocsFeather, { "IS_RANDO" }); diff --git a/soh/soh/Enhancements/randomizer/RocsFeatherCycle.c b/soh/soh/Enhancements/randomizer/RocsFeatherCycle.c new file mode 100644 index 00000000000..31dfb903040 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/RocsFeatherCycle.c @@ -0,0 +1,25 @@ +#include "soh/Enhancements/randomizer/RocsFeatherCycle.h" +#include "functions.h" +#include "variables.h" +#include "macros.h" + +uint8_t Enhancement_GetNextNayrusItem() { + if (INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_NAYRUS_LOVE && Flags_GetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER)) { + return ITEM_ROCS_FEATHER; + } + if (INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_ROCS_FEATHER && Flags_GetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE)) { + return ITEM_NAYRUS_LOVE; + } + return ITEM_NONE; +} + +uint8_t Enhancement_GetPrevNayrusItem() { + if (INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_NAYRUS_LOVE && Flags_GetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER)) { + return ITEM_ROCS_FEATHER; + } + if (INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_ROCS_FEATHER && Flags_GetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE)) { + return ITEM_NAYRUS_LOVE; + } + + return ITEM_NONE; +} diff --git a/soh/soh/Enhancements/randomizer/RocsFeatherCycle.h b/soh/soh/Enhancements/randomizer/RocsFeatherCycle.h new file mode 100644 index 00000000000..859cb5ab6fa --- /dev/null +++ b/soh/soh/Enhancements/randomizer/RocsFeatherCycle.h @@ -0,0 +1,9 @@ +#ifndef ROCS_FEATHER_H +#define ROCS_FEATHER_H + +#include + +uint8_t Enhancement_GetNextNayrusItem(); +uint8_t Enhancement_GetPrevNayrusItem(); + +#endif diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 7d266d78bef..df8c0dbb552 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -489,6 +489,26 @@ extern "C" void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry* getIte CLOSE_DISPS(play->state.gfxCtx); } +extern "C" void Randomizer_DrawRocsFeather(PlayState* play, GetItemEntry* getItemEntry) { + Color_RGB8 color = { 0, 60, 100 }; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Xlu(play->state.gfxCtx); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gDPSetGrayscaleColor(POLY_XLU_DISP++, color.r, color.g, color.b, 255); + gSPGrayscale(POLY_XLU_DISP++, true); + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gMysteryItemDL); + + gSPGrayscale(POLY_XLU_DISP++, false); + + CLOSE_DISPS(play->state.gfxCtx); +} + Gfx* GetEmptyDlist(GraphicsContext* gfxCtx) { Gfx* dListHead; Gfx* dList; diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 8483a7bf966..ca50cf7e127 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -27,6 +27,7 @@ void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBombchuBagInLogic(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBombchuBag(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawOverworldKey(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawRocsFeather(PlayState* play, GetItemEntry* getItemEntry); #define GET_ITEM_MYSTERY \ { \ diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 9aa9b140096..4ab27394398 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -403,6 +403,8 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_MAGIC_SINGLE] = Item(RG_MAGIC_SINGLE, Text{ "Magic Meter", "Jauge de Magie", "Magische Kraft" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_SINGLE, RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verb. Magische Kraft" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce-Splitter" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_ROCS_FEATHER] = Item(RG_ROCS_FEATHER, Text{ "Roc's Feather", "Roc's Feather", "Roc's Feather" }, ITEMTYPE_ITEM, 0xE0, true, LOGIC_ROCS_FEATHER, RHT_ROCS_FEATHER, RG_ROCS_FEATHER, OBJECT_GI_BOMB_2, GID_ROCS_FEATHER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_ROCS_FEATHER].SetCustomDrawFunc(Randomizer_DrawRocsFeather); // clang-format on diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 1f6b71a881a..03d02089d06 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -762,6 +762,9 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_SUNLIGHT_ARROWS] = "Light Arrows can be used to light up the sun switches instead of using the Mirror Shield. " "Item placement logic will respect this option, so it might be required to use this to progress."; + mOptionDescriptions[RSK_ROCS_FEATHER] = + "Adds Roc's Feather to the item pool. Roc's Feather is a custom item granting the player a jump on demand. " + "The jump can also be used when already in mid-air. Roc's Feather is not considered by logic."; mOptionDescriptions[RSK_SLINGBOW_BREAK_BEEHIVES] = "Allows Slingshot and Bow to break beehives when Beehive Shuffle is turned on."; mOptionDescriptions[RSK_LOGIC_RULES] = diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index de17327f19b..4911ce42855 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -65,6 +65,7 @@ const std::string Randomizer::triforcePieceMessageTableID = "RandomizerTriforceP const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi"; const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap"; const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints"; +const std::string Randomizer::RocsFeatherMessageTableID = "RandomizerRocsFeather"; static const char* englishRupeeNames[188] = { "[P]", @@ -980,8 +981,14 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_FARORES_WIND: return INV_CONTENT(ITEM_FARORES_WIND) == ITEM_NONE ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; case RG_NAYRUS_LOVE: - return INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_NONE ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; - + if (!GetRandoSettingValue(RSK_ROCS_FEATHER)) { + return INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_NONE ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; + } else { + return Flags_GetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN; + } + case RG_ROCS_FEATHER: + return Flags_GetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN; + // Bottles case RG_EMPTY_BOTTLE: case RG_BOTTLE_WITH_MILK: @@ -4904,6 +4911,24 @@ CustomMessage Randomizer::GetTriforcePieceMessage() { return messageEntry; } +void CreateRocsFeatherMessage() { + CustomMessage RocsFeatherMessage = { + { "You found %cRoc's Feather%w!", + "You found %cRoc's Feather%w!", + "You found %cRoc's Feather%w!" }, + }; + CustomMessageManager* customMessageManager = CustomMessageManager::Instance; + customMessageManager->AddCustomMessageTable(Randomizer::RocsFeatherMessageTableID); + customMessageManager->CreateMessage(Randomizer::RocsFeatherMessageTableID, 0, RocsFeatherMessage); +} + +CustomMessage Randomizer::GetRocsFeatherMessage() { + CustomMessage messageEntry = + CustomMessageManager::Instance->RetrieveMessage(Randomizer::RocsFeatherMessageTableID, 0); + messageEntry.Format(); + return messageEntry; +} + void CreateNaviRandoMessages() { CustomMessage NaviMessages[NUM_NAVI_MESSAGES] = { @@ -5882,7 +5907,8 @@ void Randomizer::CreateCustomMessages() { } }; CreateGetItemMessages(getItemMessages); CreateRupeeMessages(); - CreateTriforcePieceMessages(); + CreateRocsFeatherMessage(); + CreateFireTempleGoronMessages(); CreateNaviRandoMessages(); CreateFireTempleGoronMessages(); } @@ -6318,6 +6344,12 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { INV_CONTENT(ITEM_NUT) = ITEM_NUT; AMMO(ITEM_NUT) = static_cast(CUR_CAPACITY(UPG_NUTS)); break; + case RG_ROCS_FEATHER: + Flags_SetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER); + if (INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_NONE) { + INV_CONTENT(ITEM_NAYRUS_LOVE) = ITEM_ROCS_FEATHER; + } + break; default: LUSLOG_WARN("Randomizer_Item_Give didn't have behaviour specified for getItemId=%d", item); assert(false); diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 54c85307b6f..30e5f2c0dcd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -38,6 +38,7 @@ class Randomizer { static const std::string NaviRandoMessageTableID; static const std::string IceTrapRandoMessageTableID; static const std::string randoMiscHintsTableID; + static const std::string RocsFeatherMessageTableID; static Sprite* GetSeedTexture(uint8_t index); bool SpoilerFileExists(const char* spoilerFileName); @@ -75,6 +76,7 @@ class Randomizer { static CustomMessage GetRupeeMessage(u16 rupeeTextId); static CustomMessage GetIceTrapMessage(); static CustomMessage GetTriforcePieceMessage(); + static CustomMessage GetRocsFeatherMessage(); }; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 02bffe53ed8..d8d8334a42f 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -210,6 +210,7 @@ typedef enum { LOGIC_OCARINA_C_LEFT_BUTTON, LOGIC_OCARINA_C_RIGHT_BUTTON, LOGIC_TRIFORCE_PIECES, + LOGIC_ROCS_FEATHER, LOGIC_CAN_BORROW_MASKS, LOGIC_BORROW_SKULL_MASK, LOGIC_BORROW_SPOOKY_MASK, @@ -4333,6 +4334,10 @@ typedef enum { RG_BACK_TOWER_KEY, RG_HYLIA_LAB_KEY, RG_FISHING_HOLE_KEY, + + // Custom Items + RG_ROCS_FEATHER, + // Logic Only RG_DISTANT_SCARECROW, RG_STICKS, @@ -5454,6 +5459,7 @@ typedef enum { RHT_DEKU_STICK_CAPACITY_20, RHT_DEKU_STICK_CAPACITY_30, RHT_TRIFORCE_PIECE, + RHT_ROCS_FEATHER, RHT_GOHMA_SOUL, RHT_KING_DODONGO_SOUL, RHT_BARINADE_SOUL, @@ -6238,6 +6244,7 @@ typedef enum { RSK_SHUFFLE_SONG_FAIRIES, RSK_LOCK_OVERWORLD_DOORS, RSK_SHUFFLE_GRASS, + RSK_ROCS_FEATHER, RSK_MAX } RandomizerSettingKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 8742805a6f2..b566e8ee5c9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -2016,4 +2016,6 @@ DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6) DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7) DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8) // End Grass -DEFINE_RAND_INF(RAND_INF_OBTAINED_RUTOS_LETTER) \ No newline at end of file +DEFINE_RAND_INF(RAND_INF_OBTAINED_RUTOS_LETTER) +DEFINE_RAND_INF(RAND_INF_OBTAINED_NAYRUS_LOVE) +DEFINE_RAND_INF(RAND_INF_OBTAINED_ROCS_FEATHER) diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 265066a7eb5..1d451dc31b3 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -309,6 +309,7 @@ void Settings::CreateOptions() { // TODO: Compasses show rewards/woth, maps show dungeon mode OPT_BOOL(RSK_BLUE_FIRE_ARROWS, "Blue Fire Arrows", CVAR_RANDOMIZER_SETTING("BlueFireArrows"), mOptionDescriptions[RSK_BLUE_FIRE_ARROWS]); OPT_BOOL(RSK_SUNLIGHT_ARROWS, "Sunlight Arrows", CVAR_RANDOMIZER_SETTING("SunlightArrows"), mOptionDescriptions[RSK_SUNLIGHT_ARROWS]); + OPT_BOOL(RSK_ROCS_FEATHER, "Roc's Feather", CVAR_RANDOMIZER_SETTING("RocsFeather"), mOptionDescriptions[RSK_ROCS_FEATHER]); OPT_U8(RSK_INFINITE_UPGRADES, "Infinite Upgrades", {"Off", "Progressive", "Condensed Progressive"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("InfiniteUpgrades"), mOptionDescriptions[RSK_INFINITE_UPGRADES]); OPT_BOOL(RSK_SKELETON_KEY, "Skeleton Key", CVAR_RANDOMIZER_SETTING("SkeletonKey"), mOptionDescriptions[RSK_SKELETON_KEY]); OPT_BOOL(RSK_SLINGBOW_BREAK_BEEHIVES, "Slingshot/Bow Can Break Beehives", CVAR_RANDOMIZER_SETTING("SlingBowBeehives"), mOptionDescriptions[RSK_SLINGBOW_BREAK_BEEHIVES]); @@ -1423,6 +1424,7 @@ void Settings::CreateOptions() { &mOptions[RSK_ENABLE_BOMBCHU_DROPS], &mOptions[RSK_BLUE_FIRE_ARROWS], &mOptions[RSK_SUNLIGHT_ARROWS], + &mOptions[RSK_ROCS_FEATHER], &mOptions[RSK_INFINITE_UPGRADES], &mOptions[RSK_SKELETON_KEY], &mOptions[RSK_SLINGBOW_BREAK_BEEHIVES], diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 2aadd55d207..77168865112 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2435,6 +2435,8 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { messageEntry = Randomizer::GetIceTrapMessage(); } else if (player->getItemEntry.getItemId == RG_TRIFORCE_PIECE) { messageEntry = Randomizer::GetTriforcePieceMessage(); + } else if (player->getItemEntry.getItemId == RG_ROCS_FEATHER) { + messageEntry = Randomizer::GetRocsFeatherMessage(); } else { messageEntry = Randomizer_GetCustomGetItemMessage(player); } diff --git a/soh/src/code/z_inventory.c b/soh/src/code/z_inventory.c index f2b329ed542..db7523a7872 100644 --- a/soh/src/code/z_inventory.c +++ b/soh/src/code/z_inventory.c @@ -3,6 +3,7 @@ #include "textures/icon_item_static/icon_item_static.h" #include "textures/icon_item_24_static/icon_item_24_static.h" #include "textures/parameter_static/parameter_static.h" +#include // Bit Flag array in which gBitFlags[n] is literally (1 << n) u32 gBitFlags[] = { @@ -168,6 +169,34 @@ void* gItemIcons[] = { gOcarinaBtnIconCLeftTex, gOcarinaBtnIconCRightTex, gOcarinaBtnIconATex, + // Push down array to reach newly added item IDs + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gItemIconDekuStickTex, + gRocsFeather, }; // Used to map item IDs to inventory slots diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 3b1d91f056a..0c880242094 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2463,6 +2463,12 @@ u8 Item_Give(PlayState* play, u8 item) { } } + return Return_Item(item, MOD_NONE, ITEM_NONE); + } else if (item == ITEM_NAYRUS_LOVE && Randomizer_GetSettingValue(RSK_ROCS_FEATHER)) { + Flags_SetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE); + if (INV_CONTENT(ITEM_NAYRUS_LOVE) == ITEM_NONE) { + INV_CONTENT(ITEM_NAYRUS_LOVE) = ITEM_NAYRUS_LOVE; + } return Return_Item(item, MOD_NONE, ITEM_NONE); } returnItem = gSaveContext.inventory.items[slot]; diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 89583e5984f..06fbcbf0148 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -594,6 +594,10 @@ void Play_Init(GameState* thisx) { gSlotAgeReqs[SLOT_TRADE_CHILD] = AGE_REQ_CHILD; } + // Handle Rocs Feather requiement + gItemAgeReqs[ITEM_ROCS_FEATHER] = AGE_REQ_NONE; + gSlotAgeReqs[SLOT_NAYRUS_LOVE] = AGE_REQ_NONE; + func_800304DC(play, &play->actorCtx, play->linkActorEntry); while (!func_800973FC(play, &play->roomCtx)) { 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 2de7113d218..1b5b77c3692 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -2570,8 +2570,10 @@ void Player_ProcessItemButtons(Player* this, PlayState* play) { sHeldItemButtonIsHeldDown = true; } } else if (GameInteractor_Should(VB_CHANGE_HELD_ITEM_AND_USE_ITEM, true, item)) { - this->heldItemButton = i; - Player_UseItem(play, this, item); + if (GameInteractor_Should(VB_USE_ITEM, true, &item)) { + this->heldItemButton = i; + Player_UseItem(play, this, item); + } } } } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index dad520a0b48..091fad149b4 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -2,6 +2,7 @@ #include "textures/parameter_static/parameter_static.h" #include "textures/icon_item_static/icon_item_static.h" #include "soh/Enhancements/randomizer/ShuffleTradeItems.h" +#include "soh/Enhancements/randomizer/RocsFeatherCycle.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/enhancementTypes.h" #include "soh/Enhancements/cosmetics/cosmeticsTypes.h" @@ -374,6 +375,10 @@ void KaleidoScope_HandleItemCycles(PlayState* play) { KaleidoScope_HandleItemCycleExtras(play, SLOT_TRADE_ADULT, IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE), Randomizer_GetPrevAdultTradeItem(), Randomizer_GetNextAdultTradeItem(), true); + + // Handle Nayru's Love/Roc's Feather + KaleidoScope_HandleItemCycleExtras(play, SLOT_NAYRUS_LOVE, Randomizer_GetSettingValue(RSK_ROCS_FEATHER), + Enhancement_GetPrevNayrusItem(), Enhancement_GetNextNayrusItem(), true); } void KaleidoScope_DrawItemCycles(PlayState* play) { @@ -393,6 +398,10 @@ void KaleidoScope_DrawItemCycles(PlayState* play) { KaleidoScope_DrawItemCycleExtras(play, SLOT_TRADE_ADULT, IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE), Randomizer_GetPrevAdultTradeItem(), Randomizer_GetNextAdultTradeItem()); + + // Draw Nayru's Love/Roc's Feather + KaleidoScope_DrawItemCycleExtras(play, SLOT_NAYRUS_LOVE, Randomizer_GetSettingValue(RSK_ROCS_FEATHER), + Enhancement_GetPrevNayrusItem(), Enhancement_GetNextNayrusItem()); } bool IsItemCycling() { From 7c0f1ab87f31aee0af3be2e48ca17d0ba0db6c9b Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 15 Dec 2025 13:23:34 +0100 Subject: [PATCH 02/13] Add custom model and animation, small tweaks --- .../gPlayerAnim_link_rocs_feather_jump | Bin 141 -> 142 bytes .../gPlayerAnim_link_rocs_feather_jump_Data | Bin 0 -> 1810 bytes .../object_rocs_feather/eff_unknown_12.i8 | Bin 0 -> 1116 bytes .../object_rocs_feather/gGiRocsFeatherDL | 12 +++ .../gGiRocsFeatherDL_tri_0 | 21 +++++ .../gGiRocsFeatherDL_tri_1 | 30 +++++++ .../gGiRocsFeatherDL_vtx_0 | 64 ++++++++++++++ .../gGiRocsFeatherDL_vtx_1 | 81 ++++++++++++++++++ .../gGiRocsFeatherDL_vtx_cull | 10 +++ .../mat_gGiRocsFeatherDL_feather_feather | 17 ++++ .../mat_gGiRocsFeatherDL_feather_stem | 17 ++++ .../objects/object_rocs_feather/model.xml | 10 +++ .../icon_item_static/gRocsFeather.rgba32.png | Bin 4570 -> 2111 bytes soh/assets/soh_assets.h | 3 + .../Enhancements/randomizer/RocsFeather.cpp | 14 +-- soh/soh/Enhancements/randomizer/draw.cpp | 7 +- 16 files changed, 274 insertions(+), 12 deletions(-) create mode 100644 soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump_Data create mode 100644 soh/assets/custom/objects/object_rocs_feather/eff_unknown_12.i8 create mode 100644 soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL create mode 100644 soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_0 create mode 100644 soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_1 create mode 100644 soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_feather create mode 100644 soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_stem create mode 100644 soh/assets/custom/objects/object_rocs_feather/model.xml diff --git a/soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump b/soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump index 4e878ec8fd8aa058efae6c00156b65749ecdf1f5..331911d025b662b2650d6f702662097a14cb3ca5 100644 GIT binary patch delta 42 xcmeBW>|>nZ!pzIyGSOXICO#)KFFU>{Ke;$QEj6(uBef_#t2DPD-X*al5da{e4!QsU delta 41 wcmeBU>}8zb!YsnzJkecS+9k0hF+L|VFFU>{Ke;$QEj6(uBef_#t2DO&01lrHU;qFB diff --git a/soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump_Data b/soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump_Data new file mode 100644 index 0000000000000000000000000000000000000000..616c28c8156c2a570b485cc410d2b1b6d389dfe6 GIT binary patch literal 1810 zcma)+dr;I>6vxlLL3s$70)mNxq;3`pC}=Y);TD*y5`-CwDM%?Y;Y^bwWuY^QCW%ds z?+gJ2b{RoJQ-oC*@QFgf2I3d)%o=}nXMT6j-gCa^etzfN`vU-2 zIB)SH{s*2_72lE`%sTac7f?FhkezRw(Be)UMg3cN9G@L zcwl~B?SopB$Jd)W<;8iR;^p+fWlx$XtrE0peb>4QwR}E2Um7W&^H)~+9Jf9fOC@=O z%O^OAT@BYqUHEjZniJwlTRjq>^VR=S0DNV;CO^|u&c(9?wTHyf=A}I@S#5P_jlpbe zk33=FBus0km_CUzy%tAV0IcG9J%KSqakTc!5sBSXi<-rzu@{$SM*+loQG~rC6zw31eyYJ6EO!!! zvRGiH9@j|#Qs#7hmWZ*PrY0=Gdfy!^ zP}I{3s?=WLTucci%{%icC*m~MqYo5G)REZ28LpqS)ti_*6nmZmOq?A z?GEtqY*N2mi;RAQZJCZvr(b-CTw%*>@t04RP0)Fx4wuB|nA2r|G~NWEzA!0s>a;AwhI8HVj58|)U*|v|whxwc8%L%opOCo(*l<;21-CZ6YNh68?JyY0jIF(j( zZGB~T3VAivN1uE)HKTYqMFW32Bd!S)2_k_4aWWe%seC?$+r!R&kc<^<#qraUEbhr| zf6Pa=G}r1Y$t?iYb|z4~8$tTONSXmcjNN}O+C&s_g@O0m>c?JAbJlrl(}`l>R z|A9t3g+MOmDP)gHjr!NcLliN1M^w^%l3ULHP#3X(Fs;lW-N{<(rs6T285e2YFG(*4 z)k+j7)~QK9W;yK)khx$&PM4Hyw_>-Zu3JlgIpVe6|K57>=dNr?}sZu zj+HFbKV(B4nFy!A$MiSb!{U^6ECEJeP|4OX{UtU2i1Re=)^^F^Do{1Npped|6S02d zU>3{^eZNTQMik*S2b#ZSow+AE$IpleC5n2S@}%NU(`A7|h^M)R|7y*Z4gS}+4GdAt zff1l(**FSAy*aiLj@3rXnz+p0Qg9dQ!kI-Z?WhBl`31$oL5i?#lm+1QL}MAgK@{We zVf%g0t`e0&5%!&uC}J$@`)717t+m&JRsphk3X_7~<>i|i1W~ZbG8s>@p8~Y(3+S&} zAp3^%XwBd$O6Lw(T%>oe4t7IDIfD3(Am)5eHezkxmecYCqPRUUxu?@-?b-KkRlYrI SCheDE3bWiazFB9dAkDwf^EE{P literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_rocs_feather/eff_unknown_12.i8 b/soh/assets/custom/objects/object_rocs_feather/eff_unknown_12.i8 new file mode 100644 index 0000000000000000000000000000000000000000..e305f366839ae2322f8b19595a2cdeb0c01ae75e GIT binary patch literal 1116 zcma)z`8ykS0LH_tbYeAKk+qIEo~l-zp%~&Cb(GCHR}&LQHO>kRl@OA+#oTcO&EgIs zN)n;f3B_1Z*BGkLthUzKnzg>uXZr*8KF{ZQKR>)L1OkEh+IzZ*o%CyA+sX${^nd5n z$x`({{yh<`AdnLzAP|JBUn|r5f|%S_RPG&L1ATpq*k`r=2uWFFR@6At&f2yk2^D`u)x`9K0OIu{W6j^D&^mM&wtPpFdGuE`t zr3b7?MPxCLf%DK&L-CF`(>*+IqLLa*<2@zSLmwUUDO8HOGeuNmD5vL0eGcAD*QUnh z)wdH_$uMN$7HA62Dzl8PoFM7QIuqKr-tWzKg~hQ%ZHb*6Cv?Xlm@O_XkE|Jf8t87B z$r*gO_Nt$b&L7xlN+7T0kXt6-?g~h$5!}}s82?b-n5ekpkSwfVNyt07b+!UvvZB8qFGX#S_*w#iDgldZ$;B(7-k^>wSR5*-6 zHbn)4s-6ck$_gnzszo&350)|ezQ+x!2sb@Txm$7v$y_UR6lJVVM1*G;kKR~ zO=R|wf~>qeyo_GU<++snG=I1~qxtdY$k2>Vf?r%v-bA2Dge*+)8o8nF@h~Ri=N)h~ zAor=9RU(xgp4LYw=TqncbthG?6gqQ?pFkR3Jq8>#BP~;0Nk>%gI=!N{|MwT^X)Xcj zb%TEhlWLxI?Sr|3cmpJb@hG}wwUgPm3yxM=3vXp{mcbagcOv0eurpVn?^DHINv4eO zy0^A>!A2MTZqCp?c*>|tF=zst{YkEPn&_Z~F65IJIs|{skOEv{<^hA#1Y(5s3TyzA$h-g5;KPHD)X(oTprW+hI zVNFj%-RA}5EPUMv0Q+^hRB3nG{jy*ksB+Q_SRnW!l+`1 + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_0 b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_0 new file mode 100644 index 00000000000..8baaf817936 --- /dev/null +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_0 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_1 b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_1 new file mode 100644 index 00000000000..53c27b3bbe9 --- /dev/null +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_1 @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_0 b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_0 new file mode 100644 index 00000000000..f466b08495a --- /dev/null +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_0 @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_1 b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_1 new file mode 100644 index 00000000000..0079879f06c --- /dev/null +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_1 @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_cull b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_cull new file mode 100644 index 00000000000..217cd1a95d4 --- /dev/null +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_feather b/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_feather new file mode 100644 index 00000000000..a3bc978c82f --- /dev/null +++ b/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_feather @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_stem b/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_stem new file mode 100644 index 00000000000..dd86a5b08f4 --- /dev/null +++ b/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_stem @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/model.xml b/soh/assets/custom/objects/object_rocs_feather/model.xml new file mode 100644 index 00000000000..217cd1a95d4 --- /dev/null +++ b/soh/assets/custom/objects/object_rocs_feather/model.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/textures/icon_item_static/gRocsFeather.rgba32.png b/soh/assets/custom/textures/icon_item_static/gRocsFeather.rgba32.png index 347144cfa28f5406a332e7b531dbdb4cff5f49ef..b2e4f99da1dba7c95122e0e36bbe080789a026ac 100644 GIT binary patch delta 2099 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 literal 4570 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 diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 4e24fa50daf..70c32546825 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -348,6 +348,9 @@ static const ALIGN_ASSET(2) char gKeyringKeysGanonsCastleMQDL[] = dgKeyringKeysG #define dgHouseKeyDL "__OTR__objects/object_housekey/gHouseKeyDL" static const ALIGN_ASSET(2) char gHouseKeyDL[] = dgHouseKeyDL; +#define dgGiRocsFeatherDL "__OTR__objects/object_rocs_feather/gGiRocsFeatherDL" +static const ALIGN_ASSET(2) char gGiRocsFeatherDL[] = dgGiRocsFeatherDL; + // overlays #define dgOptionsDividerChangeLangVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerChangeLangVtx" static const ALIGN_ASSET(2) char gOptionsDividerChangeLangVtx[] = dgOptionsDividerChangeLangVtx; diff --git a/soh/soh/Enhancements/randomizer/RocsFeather.cpp b/soh/soh/Enhancements/randomizer/RocsFeather.cpp index 29623f342f6..342c54dda27 100644 --- a/soh/soh/Enhancements/randomizer/RocsFeather.cpp +++ b/soh/soh/Enhancements/randomizer/RocsFeather.cpp @@ -35,12 +35,14 @@ void RegisterRocsFeather() { if (!rocsUseCount) { rocsUseCount++; - player->linearVelocity = 5.0f; - player->actor.velocity.y = 8.0f; - player->actor.world.rot.y = player->yaw = player->actor.shape.rot.y; - func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_rocs_feather_jump, - !(2 & 1) ? 5.8f : 3.5f, gPlayState, 0); + player->linearVelocity = 4.0f; + + //func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_fighter_backturn_jump, 5.8f, gPlayState, 0); + func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_rocs_feather_jump, 5.8f, gPlayState, 0); + + player->actor.velocity.y = 7.0f; + player->actor.world.rot.y = player->yaw = player->actor.shape.rot.y; Vec3f effectsPos = player->actor.home.pos; effectsPos.y += 3; @@ -51,7 +53,7 @@ void RegisterRocsFeather() { EffectSsGRipple_Spawn(gPlayState, &effectsPos, 200 * effectsScale, 300 * effectsScale, 1); EffectSsGSplash_Spawn(gPlayState, &effectsPos, NULL, NULL, 0, 150 * effectsScale); - player->stateFlags2 &= ~(PLAYER_STATE2_HOPPING); + player->stateFlags2 &= PLAYER_STATE2_HOPPING; Player_PlaySfx(&player->actor, NA_SE_PL_SKIP); } diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index df8c0dbb552..dd709a65e91 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -499,12 +499,7 @@ extern "C" void Randomizer_DrawRocsFeather(PlayState* play, GetItemEntry* getIte gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); - gDPSetGrayscaleColor(POLY_XLU_DISP++, color.r, color.g, color.b, 255); - gSPGrayscale(POLY_XLU_DISP++, true); - - gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gMysteryItemDL); - - gSPGrayscale(POLY_XLU_DISP++, false); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiRocsFeatherDL); CLOSE_DISPS(play->state.gfxCtx); } From bbaf242ddefc1296635feb6edc8d852c025ac050 Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 15 Dec 2025 17:17:48 +0100 Subject: [PATCH 03/13] Fix oopsie --- 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 4911ce42855..5efcd592856 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -5908,7 +5908,7 @@ void Randomizer::CreateCustomMessages() { CreateGetItemMessages(getItemMessages); CreateRupeeMessages(); CreateRocsFeatherMessage(); - CreateFireTempleGoronMessages(); + CreateTriforcePieceMessages(); CreateNaviRandoMessages(); CreateFireTempleGoronMessages(); } From 140a68adc0d3f199bce708e75e200eb248617bbd Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 15 Dec 2025 17:20:36 +0100 Subject: [PATCH 04/13] Tweak values --- soh/soh/Enhancements/randomizer/RocsFeather.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/RocsFeather.cpp b/soh/soh/Enhancements/randomizer/RocsFeather.cpp index 342c54dda27..2d55e35eeed 100644 --- a/soh/soh/Enhancements/randomizer/RocsFeather.cpp +++ b/soh/soh/Enhancements/randomizer/RocsFeather.cpp @@ -36,12 +36,12 @@ void RegisterRocsFeather() { if (!rocsUseCount) { rocsUseCount++; - player->linearVelocity = 4.0f; + player->linearVelocity = 5.0f; //func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_fighter_backturn_jump, 5.8f, gPlayState, 0); func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_rocs_feather_jump, 5.8f, gPlayState, 0); - player->actor.velocity.y = 7.0f; + player->actor.velocity.y = 8.0f; player->actor.world.rot.y = player->yaw = player->actor.shape.rot.y; Vec3f effectsPos = player->actor.home.pos; From 62f836358d92aa22532b357f64f71fd006c42314 Mon Sep 17 00:00:00 2001 From: aMannus Date: Mon, 15 Dec 2025 23:36:36 +0100 Subject: [PATCH 05/13] Update GI model --- .../gPlayerAnimData_link_rocs_feather_jump | Bin 2748 -> 0 bytes .../object_rocs_feather/eff_unknown_12_i8 | Bin 0 -> 1116 bytes .../object_rocs_feather/gGiRocsFeatherDL | 6 +- .../gGiRocsFeatherDL_tri_0 | 2 +- .../gGiRocsFeatherDL_tri_1 | 2 +- .../gGiRocsFeatherDL_vtx_0 | 124 +++++++------- .../gGiRocsFeatherDL_vtx_1 | 158 +++++++++--------- .../gGiRocsFeatherDL_vtx_cull | 16 +- .../mat_gGiRocsFeatherDL_feather_feather | 17 +- .../mat_gGiRocsFeatherDL_feather_stem | 17 +- .../objects/object_rocs_feather/model.xml | 16 +- 11 files changed, 186 insertions(+), 172 deletions(-) delete mode 100644 soh/assets/custom/objects/gameplay_keep/gPlayerAnimData_link_rocs_feather_jump create mode 100644 soh/assets/custom/objects/object_rocs_feather/eff_unknown_12_i8 diff --git a/soh/assets/custom/objects/gameplay_keep/gPlayerAnimData_link_rocs_feather_jump b/soh/assets/custom/objects/gameplay_keep/gPlayerAnimData_link_rocs_feather_jump deleted file mode 100644 index 2db97cd686092f2331ebe51e9118dc54c81446fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2748 zcma);3rrM87{_N1c__%k;-m3JKp=oZS4vA6`=@HT8puwu~-{5(Z*`EQQK6l zM$n>|9-A}#Ix-rJNNB>{`1Xm z=VoV?F~%~}va{3=Yp*W9iVN}oEo1!Q>=|nK1(#B)i!of$7W^VYk({w+58abPDR$MM zE-BMTtB6%+qDJe+R=J8|-K+X8?#Di+e8{0j;q!_YxeY&KP2CZr2%hD}XjF)Tv59*7 z3vqChpLLUz|YvNSSW$tniPi8lAaSl6iKhZGio|&DIEb-4P%xfju1rgT10KXUL|Pb z?cNmRM_mw%8b$EBJKhxN#hBHKx^d93W?&y7{f5rDuf?B*O$Payea4g%XArgGq)48aZQI;)kxai59-zBqap3X|QoT2_i zQ8pF*orRQja>TlG_97^04~XJQ??G_|4k&GBeN$wItY*Q1a0s6FbY0An!4`QJIcOCW z)qKP5c}zvhqMA8*GdhT3aSrA!{dJ;94l8arIujXFZxhAfkhs*W%}`!E?wcYl^l!GH z2OQ=*qSmZ9rCn*$dngjdY_2#hRY1WV#)lJP+}0^P zKM}?3^Z5fe#3GJA=$j%hvPMg-M1R3gSPY63F;Lrd0V>nizs+?qJBebizIPvg6;3H1Jzjlv_B-f%U@uW@ZuF0yJ`%0TohZnU z+SB7lHmMDf;GcyU6iKo}t5o}(Isx=^MvcjWgsFgHN3PaL??^^EM&De3EK&}4$6qU( zi@p<|tc$*_XJdZOMr+b@C>&wKnEf6cf{zR}D7YM8NufPoWy4(9S&Ih>?l6|kwPEU= zTSPHxER_8D`jgAu?!(ts>hV%FrfT6acRf*c`flp%L_vP!%T(t`_G3hX=ldD!!Z=eI zTM>q~*u&-y4n@k?!zme)-9&*iRZ72Qly#D4!S&S(5o@(XaYEkevwIctZ0+=pm=wd* zIdWUTq4tY*?{fs}h_P{l(YAk=Nnt4C@ebQDK2fY#Nm(CyhPF&wf?mldiQ-UzBRqaR zl!Z0ESLgk1Xhjix?5|9@=*~FV4~>RWy4|EWsDDkAZVw#a_n|jM(;}kSE&OhLxeQri zE)zvq*Ph+yZG=*O%s0hRH5XI_U--wf6!hdlKbRDTa@@Y>j!D7TtT%}wS020ZUc$d+@zqflwwy6>U#bc-=}Iw>ih3seE$H&(t>*c diff --git a/soh/assets/custom/objects/object_rocs_feather/eff_unknown_12_i8 b/soh/assets/custom/objects/object_rocs_feather/eff_unknown_12_i8 new file mode 100644 index 0000000000000000000000000000000000000000..e305f366839ae2322f8b19595a2cdeb0c01ae75e GIT binary patch literal 1116 zcma)z`8ykS0LH_tbYeAKk+qIEo~l-zp%~&Cb(GCHR}&LQHO>kRl@OA+#oTcO&EgIs zN)n;f3B_1Z*BGkLthUzKnzg>uXZr*8KF{ZQKR>)L1OkEh+IzZ*o%CyA+sX${^nd5n z$x`({{yh<`AdnLzAP|JBUn|r5f|%S_RPG&L1ATpq*k`r=2uWFFR@6At&f2yk2^D`u)x`9K0OIu{W6j^D&^mM&wtPpFdGuE`t zr3b7?MPxCLf%DK&L-CF`(>*+IqLLa*<2@zSLmwUUDO8HOGeuNmD5vL0eGcAD*QUnh z)wdH_$uMN$7HA62Dzl8PoFM7QIuqKr-tWzKg~hQ%ZHb*6Cv?Xlm@O_XkE|Jf8t87B z$r*gO_Nt$b&L7xlN+7T0kXt6-?g~h$5!}}s82?b-n5ekpkSwfVNyt07b+!UvvZB8qFGX#S_*w#iDgldZ$;B(7-k^>wSR5*-6 zHbn)4s-6ck$_gnzszo&350)|ezQ+x!2sb@Txm$7v$y_UR6lJVVM1*G;kKR~ zO=R|wf~>qeyo_GU<++snG=I1~qxtdY$k2>Vf?r%v-bA2Dge*+)8o8nF@h~Ri=N)h~ zAor=9RU(xgp4LYw=TqncbthG?6gqQ?pFkR3Jq8>#BP~;0Nk>%gI=!N{|MwT^X)Xcj zb%TEhlWLxI?Sr|3cmpJb@hG}wwUgPm3yxM=3vXp{mcbagcOv0eurpVn?^DHINv4eO zy0^A>!A2MTZqCp?c*>|tF=zst{YkEPn&_Z~F65IJIs|{skOEv{<^hA#1Y(5s3TyzA$h-g5;KPHD)X(oTprW+hI zVNFj%-RA}5EPUMv0Q+^hRB3nG{jy*ksB+Q_SRnW!l+`1 - + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_0 b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_0 index 8baaf817936..94927832fce 100644 --- a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_0 +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_0 @@ -14,7 +14,7 @@ - + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_1 b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_1 index 53c27b3bbe9..9ab8f972b93 100644 --- a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_1 +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_tri_1 @@ -12,7 +12,7 @@ - + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_0 b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_0 index f466b08495a..6b168144985 100644 --- a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_0 +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_0 @@ -1,64 +1,64 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_1 b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_1 index 0079879f06c..44ab971573e 100644 --- a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_1 +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_1 @@ -1,81 +1,81 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_cull b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_cull index 217cd1a95d4..e43cf3bda13 100644 --- a/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_cull +++ b/soh/assets/custom/objects/object_rocs_feather/gGiRocsFeatherDL_vtx_cull @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_feather b/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_feather index a3bc978c82f..e21e92ff897 100644 --- a/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_feather +++ b/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_feather @@ -1,17 +1,22 @@ - - + + + - - - - + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_stem b/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_stem index dd86a5b08f4..b523babf20d 100644 --- a/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_stem +++ b/soh/assets/custom/objects/object_rocs_feather/mat_gGiRocsFeatherDL_feather_stem @@ -1,17 +1,22 @@ - - + + + - - - - + + + + + + + + diff --git a/soh/assets/custom/objects/object_rocs_feather/model.xml b/soh/assets/custom/objects/object_rocs_feather/model.xml index 217cd1a95d4..5d798a1ab9a 100644 --- a/soh/assets/custom/objects/object_rocs_feather/model.xml +++ b/soh/assets/custom/objects/object_rocs_feather/model.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + From 67e92920e961fc6d6f37e508e192867fb8b5a79e Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 18 Dec 2025 11:55:17 +0100 Subject: [PATCH 06/13] Tweaked values, item tracker, new animation --- .../gPlayerAnim_link_rocs_feather_jump_Data | Bin 1810 -> 1810 bytes ....rgba32.png => gRocsFeatherTex.rgba32.png} | Bin soh/assets/soh_assets.h | 4 +- .../Enhancements/debugger/debugSaveEditor.cpp | 2 +- .../Enhancements/randomizer/RocsFeather.cpp | 44 +++++++++++++----- .../randomizer/randomizer_item_tracker.cpp | 19 ++++++++ soh/soh/SohGui/ImGuiUtils.cpp | 17 ++----- soh/soh/SohGui/ImGuiUtils.h | 2 - soh/src/code/z_inventory.c | 2 +- 9 files changed, 59 insertions(+), 31 deletions(-) rename soh/assets/custom/textures/icon_item_static/{gRocsFeather.rgba32.png => gRocsFeatherTex.rgba32.png} (100%) diff --git a/soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump_Data b/soh/assets/custom/objects/gameplay_keep/gPlayerAnim_link_rocs_feather_jump_Data index 616c28c8156c2a570b485cc410d2b1b6d389dfe6..e739fd7b1469e2fd9295f45150393ea723a58e33 100644 GIT binary patch literal 1810 zcma)+drVYE6voe81OygXl!8s8qIQw3N(*9GYHLJ5Qxk)aQp6%{BT8+dRz!&6EA`Qe zMB9L|Z_`BW)22#AsE^@QAE>J<@>mfRD+M1YRX{`c&gp)8v)%N+-el&U`R1E*e|vUj zh=}II&rNo`=)uW@?P!Sq?~~;L=K{TvvON(=v8JD@5D{59O!tYMnW)Ez@zDd3bY1puaVni1}y+{64(iFzIspQml#}h<}vW&*EC>v*Bs`;fd;v3#c3!@>Acb zn_1rtg&&RRvw#oinP5axq}W*?B6^Gcbo>a8nf@4OR((xxBhF8ho<=&bj{hE-l?O*2na3h#o*zugq3;65dFEwV^4 zMsd}`AiJpA3Uy^Vdb8z$GJ@R-D2i=e0{)_)awo;U7%giH|Isok4Y7KN=+C1pmRw04 zy~DZ7w_A!mpMEY@EURwGKdf_8qy%45u9xCVQoO8l?Tb)3K=#W}KXq2yY^hh8WNtH* zaj$9nBG#605)_p|i=3W>IAks3i|PiO|6;@&%7`8wXOY-YANJRHtX)^HQM_3DTmDpE zH$_Nro|1SF4k^5cxG18fQSoht%k_`sDmn5<2YeG|X%vPQVzQ3*tyfzUto@OoYW5=ZI7*aA9?G}X%vmMxw&_|-4t{5j;h~+LyBU5 zS1p#YUbn0dw}s6Mb7spuZd0?J_smXTeA8HSdrn$6D7N`6arDeF%i+x7vYt2FX$#_c zSDDw`V6i*E6xC1yrTmIUvAgE^6)id_S}kJyh$4D1mLe{|MbXS-bl$4#&H_aVcdH@J zI~QJ}iXV5qQq%{EhhE|(WNTUl-O7dc8akSa5TER1?&@Z-df1GJfiIwZ+pbaAtIofZ zEum->{f=Lj^#o%nQav;Z%#3xMBfQrIV$N8zk?*Moe4yMP17+V{{Y(!P6jOCcQ<1Hp p5IVD0&r_ZDoroLn6NUA%xDzyS^zAR9gmr5aELxYYv_nD0e*n--(1ZX0 literal 1810 zcma)+dr;I>6vxlLL3s$70)mNxq;3`pC}=Y);TD*y5`-CwDM%?Y;Y^bwWuY^QCW%ds z?+gJ2b{RoJQ-oC*@QFgf2I3d)%o=}nXMT6j-gCa^etzfN`vU-2 zIB)SH{s*2_72lE`%sTac7f?FhkezRw(Be)UMg3cN9G@L zcwl~B?SopB$Jd)W<;8iR;^p+fWlx$XtrE0peb>4QwR}E2Um7W&^H)~+9Jf9fOC@=O z%O^OAT@BYqUHEjZniJwlTRjq>^VR=S0DNV;CO^|u&c(9?wTHyf=A}I@S#5P_jlpbe zk33=FBus0km_CUzy%tAV0IcG9J%KSqakTc!5sBSXi<-rzu@{$SM*+loQG~rC6zw31eyYJ6EO!!! zvRGiH9@j|#Qs#7hmWZ*PrY0=Gdfy!^ zP}I{3s?=WLTucci%{%icC*m~MqYo5G)REZ28LpqS)ti_*6nmZmOq?A z?GEtqY*N2mi;RAQZJCZvr(b-CTw%*>@t04RP0)Fx4wuB|nA2r|G~NWEzA!0s>a;AwhI8HVj58|)U*|v|whxwc8%L%opOCo(*l<;21-CZ6YNh68?JyY0jIF(j( zZGB~T3VAivN1uE)HKTYqMFW32Bd!S)2_k_4aWWe%seC?$+r!R&kc<^<#qraUEbhr| zf6Pa=G}r1Y$t?iYb|z4~8$tTONSXmcjNN}O+C&s_g@O0m>c?JAbJlrl(}`l>R z|A9t3g+MOmDP)gHjr!NcLliN1M^w^%l3ULHP#3X(Fs;lW-N{<(rs6T285e2YFG(*4 z)k+j7)~QK9W;yK)khx$&PM4Hyw_>-Zu3JlgIpVe6|K57>=dNr?}sZu zj+HFbKV(B4nFy!A$MiSb!{U^6ECEJeP|4OX{UtU2i1Re=)^^F^Do{1Npped|6S02d zU>3{^eZNTQMik*S2b#ZSow+AE$IpleC5n2S@}%NU(`A7|h^M)R|7y*Z4gS}+4GdAt zff1l(**FSAy*aiLj@3rXnz+p0Qg9dQ!kI-Z?WhBl`31$oL5i?#lm+1QL}MAgK@{We zVf%g0t`e0&5%!&uC}J$@`)717t+m&JRsphk3X_7~<>i|i1W~ZbG8s>@p8~Y(3+S&} zAp3^%XwBd$O6Lw(T%>oe4t7IDIfD3(Am)5eHezkxmecYCqPRUUxu?@-?b-KkRlYrI SCheDE3bWiazFB9dAkDwf^EE{P diff --git a/soh/assets/custom/textures/icon_item_static/gRocsFeather.rgba32.png b/soh/assets/custom/textures/icon_item_static/gRocsFeatherTex.rgba32.png similarity index 100% rename from soh/assets/custom/textures/icon_item_static/gRocsFeather.rgba32.png rename to soh/assets/custom/textures/icon_item_static/gRocsFeatherTex.rgba32.png diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 70c32546825..150f167eb2a 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -434,8 +434,8 @@ static const ALIGN_ASSET(2) char gFileSelLanguageFRATex[] = dgFileSelLanguageFRA #define dgFileSelLanguageGERTex "__OTR__textures/title_static/gFileSelLanguageGERTex" static const ALIGN_ASSET(2) char gFileSelLanguageGERTex[] = dgFileSelLanguageGERTex; -#define dgRocsFeather "__OTR__textures/icon_item_static/gRocsFeather" -static const ALIGN_ASSET(2) char gRocsFeather[] = dgRocsFeather; +#define dgRocsFeatherTex "__OTR__textures/icon_item_static/gRocsFeatherTex" +static const ALIGN_ASSET(2) char gRocsFeatherTex[] = dgRocsFeatherTex; #define dgEmptyTexture "__OTR__textures/virtual/gEmptyTexture" static const ALIGN_ASSET(2) char gEmptyTexture[] = dgEmptyTexture; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 90afdca0478..7f6e7512283 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -1745,6 +1745,6 @@ void SaveEditorWindow::DrawElement() { } void SaveEditorWindow::InitElement() { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ROCS_FEATHER", gRocsFeather, + Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("ROCS_FEATHER", gRocsFeatherTex, ImVec4(1, 1, 1, 1)); } diff --git a/soh/soh/Enhancements/randomizer/RocsFeather.cpp b/soh/soh/Enhancements/randomizer/RocsFeather.cpp index 2d55e35eeed..fb05f123f05 100644 --- a/soh/soh/Enhancements/randomizer/RocsFeather.cpp +++ b/soh/soh/Enhancements/randomizer/RocsFeather.cpp @@ -12,15 +12,28 @@ extern "C" { extern PlayState* gPlayState; } -uint8_t rocsUseCount = 0; +#define MAX_ROCS_USES 1 + +static uint8_t rocsUseCount = 0; +static uint8_t groundTimer = 0; +static f32 effectsScale = 1.0f; void RegisterRocsFeather() { bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_ROCS_FEATHER); COND_HOOK(OnPlayerUpdate, shouldRegister, []() { Player* player = GET_PLAYER(gPlayState); - // Reset Rocs count when touching the ground + + // Reset Rocs count when touching the ground for 3+ frames if (player->actor.bgCheckFlags & 1) { + if (groundTimer <= 3) { + groundTimer++; + } + } else { + groundTimer = 0; + } + + if (groundTimer >= 3) { rocsUseCount = 0; } }); @@ -33,27 +46,34 @@ void RegisterRocsFeather() { if (*usedItem == ITEM_ROCS_FEATHER) { *should = false; - if (!rocsUseCount) { + if (rocsUseCount < MAX_ROCS_USES) { rocsUseCount++; - player->linearVelocity = 5.0f; - - //func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_fighter_backturn_jump, 5.8f, gPlayState, 0); func_80838940(player, (LinkAnimationHeader*)&gPlayerAnim_link_rocs_feather_jump, 5.8f, gPlayState, 0); - player->actor.velocity.y = 8.0f; + // Actionvar needed to prevent weird animation morph + player->av2.actionVar2 = 1; + + // Move player forward on Roc's use + player->linearVelocity = 5.0f; player->actor.world.rot.y = player->yaw = player->actor.shape.rot.y; - Vec3f effectsPos = player->actor.home.pos; - effectsPos.y += 3; - f32 effectsScale = 1; - if (!gSaveContext.linkAge) { + if (gSaveContext.linkAge == LINK_AGE_CHILD) { + player->actor.velocity.y = 7.0f; + effectsScale = 1.0f; + } else { + player->actor.velocity.y = 7.5f; effectsScale = 1.5f; } + + Vec3f effectsPos = player->actor.home.pos; + effectsPos.y += 3; + EffectSsGRipple_Spawn(gPlayState, &effectsPos, 200 * effectsScale, 300 * effectsScale, 1); EffectSsGSplash_Spawn(gPlayState, &effectsPos, NULL, NULL, 0, 150 * effectsScale); - player->stateFlags2 &= PLAYER_STATE2_HOPPING; + // Remove hopping state when using Roc's after sidehop/backflip to allow grabbing ledges again + player->stateFlags2 &= ~(PLAYER_STATE2_HOPPING); Player_PlaySfx(&player->actor, NA_SE_PL_SKIP); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index cd32cc4b144..17aa508a221 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -136,6 +136,10 @@ std::vector triforcePieces = { ITEM_TRACKER_ITEM(RG_TRIFORCE_PIECE, 0, DrawItem), }; +std::vector rocsFeather = { + ITEM_TRACKER_ITEM(RG_ROCS_FEATHER, 0, DrawItem), +}; + std::vector bossSoulItems = { ITEM_TRACKER_ITEM(RG_GOHMA_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_KING_DODONGO_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_BARINADE_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_PHANTOM_GANON_SOUL, 0, DrawItem), @@ -809,6 +813,11 @@ void DrawItem(ItemTrackerItem item) { hasItem = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT); itemName = "Triforce Piece"; break; + case RG_ROCS_FEATHER: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER); + itemName = "Roc's Feather"; + break; case RG_GOHMA_SOUL: actualItemId = item.id; hasItem = Flags_GetRandomizerInf(RAND_INF_GOHMA_SOUL); @@ -1404,6 +1413,9 @@ void UpdateVectors() { SECTION_DISPLAY_MAIN_WINDOW) { mainWindowItems.insert(mainWindowItems.end(), dungeonItems.begin(), dungeonItems.end()); } + if (IS_RANDO && RAND_GET_OPTION(RSK_ROCS_FEATHER)) { + mainWindowItems.insert(mainWindowItems.end(), rocsFeather.begin(), rocsFeather.end()); + } // if we're adding greg to the misc window, // and misc isn't on the main window, @@ -2120,4 +2132,11 @@ void RegisterItemTrackerWidgets() { SohGui::mSohMenu->AddSearchWidget({ hookshotIdentWidget, "Randomizer", "Item Tracker", "General Settings" }); } +void RegisterItemTracker() { + COND_HOOK(OnLoadFile, true, [](int32_t fileNum) { + shouldUpdateVectors = true; + }); +} + +static RegisterShipInitFunc registerItemTracker(RegisterItemTracker); static RegisterMenuInitFunc menuInitFunc(RegisterItemTrackerWidgets); diff --git a/soh/soh/SohGui/ImGuiUtils.cpp b/soh/soh/SohGui/ImGuiUtils.cpp index c80293a53c0..69690ff539d 100644 --- a/soh/soh/SohGui/ImGuiUtils.cpp +++ b/soh/soh/SohGui/ImGuiUtils.cpp @@ -133,11 +133,9 @@ std::map gregMapping = { { ITEM_RUPEE_GREEN, { ITEM_RUPEE_GREEN, "ITEM_RUPEE_GREEN", "ITEM_RUPEE_GREEN_Faded", gRupeeCounterIconTex } } }; -std::map triforcePieceMapping = { - { RG_TRIFORCE_PIECE, { RG_TRIFORCE_PIECE, "RG_TRIFORCE_PIECE", "RG_TRIFORCE_PIECE_Faded", gTriforcePieceTex } } -}; - -std::map bossSoulMapping = { +std::map customItemsMapping = { + { RG_TRIFORCE_PIECE, { RG_TRIFORCE_PIECE, "RG_TRIFORCE_PIECE", "RG_TRIFORCE_PIECE_Faded", gTriforcePieceTex } }, + { RG_ROCS_FEATHER, { RG_ROCS_FEATHER, "RG_ROCS_FEATHER", "RG_ROCS_FEATHER_Faded", gRocsFeatherTex } }, { RG_GOHMA_SOUL, { RG_GOHMA_SOUL, "RG_GOHMA_SOUL", "RG_GOHMA_SOUL_Faded", gBossSoulTex } }, { RG_KING_DODONGO_SOUL, { RG_KING_DODONGO_SOUL, "RG_KING_DODONGO_SOUL", "RG_KING_DODONGO_SOUL_Faded", gBossSoulTex } }, @@ -216,14 +214,7 @@ void RegisterImGuiItemIcons() { entry.second.texturePath, gregFadedGreen); } - for (const auto& entry : triforcePieceMapping) { - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, - ImVec4(1, 1, 1, 1)); - Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture( - entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f)); - } - - for (const auto& entry : bossSoulMapping) { + for (const auto& entry : customItemsMapping) { Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture(entry.second.name, entry.second.texturePath, ImVec4(1, 1, 1, 1)); Ship::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture( diff --git a/soh/soh/SohGui/ImGuiUtils.h b/soh/soh/SohGui/ImGuiUtils.h index 2206b4e481e..a92a1d73753 100644 --- a/soh/soh/SohGui/ImGuiUtils.h +++ b/soh/soh/SohGui/ImGuiUtils.h @@ -36,8 +36,6 @@ typedef struct { // Maps items ids to info for use in ImGui extern std::map itemMapping; -extern std::map gregMapping; - typedef struct { uint32_t id; std::string name; diff --git a/soh/src/code/z_inventory.c b/soh/src/code/z_inventory.c index db7523a7872..e4736cf2351 100644 --- a/soh/src/code/z_inventory.c +++ b/soh/src/code/z_inventory.c @@ -196,7 +196,7 @@ void* gItemIcons[] = { gItemIconDekuStickTex, gItemIconDekuStickTex, gItemIconDekuStickTex, - gRocsFeather, + gRocsFeatherTex, }; // Used to map item IDs to inventory slots From 5f677f98c723a109a1180fef1ac4770c3bb17ccc Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 20 Dec 2025 13:59:05 +0100 Subject: [PATCH 07/13] Fix nayru's love in item tracker --- soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 17aa508a221..0520a0f2c4f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -813,6 +813,11 @@ void DrawItem(ItemTrackerItem item) { hasItem = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT); itemName = "Triforce Piece"; break; + case ITEM_NAYRUS_LOVE: + if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_ROCS_FEATHER)) { + hasItem = Flags_GetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE); + } + break; case RG_ROCS_FEATHER: actualItemId = item.id; hasItem = Flags_GetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER); From ec44de77a789b2bf11e738df3ad4361ee96751f8 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 20 Dec 2025 15:08:12 +0100 Subject: [PATCH 08/13] Add roc's feather item name textures (doesn't work yet) --- .../gRocsFeatherItemNameENGTex.ia8.png | Bin 0 -> 3934 bytes .../gRocsFeatherItemNameFRATex.ia8.png | Bin 0 -> 3808 bytes .../gRocsFeatherItemNameGERTex.ia8.png | Bin 0 -> 3608 bytes soh/assets/soh_assets.h | 9 +++++++++ .../misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c | 12 ++++++++++++ 5 files changed, 21 insertions(+) create mode 100644 soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameENGTex.ia8.png create mode 100644 soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameFRATex.ia8.png create mode 100644 soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameGERTex.ia8.png diff --git a/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameENGTex.ia8.png b/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameENGTex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..bc72f3ced5b7a5b8cb4d9bc7edda23a9e1435bba GIT binary patch literal 3934 zcmai03p|ti|KG53$?Zf!X{~Zxw;8#Nr81XcTBeA|Y-7u8vkh~r>9{3Ph$KQqxs(&t zPlzK#l9Hnf$6e?`NbdSSqtoSo&hP(!Ua#+-=li@rpZDkU{oJ0NBsf@0OR7kMKp<(H z4b~C33xFjjz6SX1b_t3FfglcaCl{Uz-X2Y6`N2sPmKPPy_hSP%2xMl?XOqajR36le z>O*H@VB;0lFesgZfjRHQBk^ntDvfRv!l4pF9Gu7@zGM>$%zT%m86OQ0_)&QzDBq94 zqaCqUUzLF!21euY z*k}YIC@2UXqz`9td=PpjCMF0Z3V}lD0us91U?z{m*JX0I2`N@Nuv9LYLud2oEGAUQ zN%CR^@GvkKfJ48MQ^?=A*#R8J3NwX_pfad_R3?v$(1YtCew3&3>EFF!a=(TP2pmF) z0OH7>#Cde@{~|6#{vpn$v3M*ljm7@v)K4b9!T(SM!u{_md=mTLgz@H9cAM70ZSLjE|hWLm3t7rdVfB<@{?|{JsOgO~15eIC(4M{2!n2a1?1iI%sYz2Y9 z5pXFJJ#sPC*d1!}5M4(XvHg3Hzibop)A^-xw{DWS2Y!+xVWKv^ z!=^-$0f9VgD12JI+wBimIR#5Ow_-&<1GC}u-6zf;@*eK&8CzFT>M4CSrOabInx~!* zQ4fC-Rlg(u14JADa`d76L0*8Nv3zb`csE&Zpt!l{z(QAb$1kTxC0$ga9x5DYme?oJ zS~TR8929AKj$*78rf!zq1c@5A$2j&oC$HbJY{xH>XeZU&Jc`So zw4K}a#_s*^kHZLFclkDhQN*TJ zwc5s*5jVx+VbE*C-o=7k%fLRb^_vopx=4Mo4e0OSZ|Zi)36MuKvxCdqODA{zDl6xj zcJp3zRrpBql%KY_^BtcaqfWziA#f>14xGWC4$B7p4AwAT- z{gvWF^TlZYI&`I80-|GUu1#FxSueTM^2#DtbCyZO;=+3C)3YuUdk!O?dD*+Ri4Bln zxazmJ7hH|7ZSTESZ+%i_BH}C-tSG8gXDNO(4|ytUd17Iy!GA-Cd!f2YbyLgYn8|Qf z=&_lgvGUf z1?KY%Yy`0~ER6+fdi*%0wsvpk=LMsubNl=Dv)LuFu@{Z~_ueWk9r`r-+>uD!rm3kp z4^!kfC5p^X=V*fhhDDu3+Pb=QE?b>$n;t3othX#HNJ&kN>->RbWK&y1neWo^95vFO8kOEVX$;YlwP!@v%GiX5haZuFUJI_d zv_Es^ZjHz3yuNYUZTw#wq-5L@S0)kCWPHMp6 z4MUthwy_2R@vya3wk9hzwETeD(zioLK=&?9pPb~R!rdSB{_)%O;$muTqy*?}q4Q1e z2hq~!?bYMr;xsfh!8Hs+GAf;*5LHrwTwGcLi%Ur4WM>P?$_!lH+;BJ?*k+%NP4D|x zr7pz>0Ww=lO9&VYKHuUEcfVKHT@?yc9_3-eW`K}Tm?x`}B~AcJ&4|^V;&zwW1gOTIXJIg}yPfqtJxA2ckLh&YWzD=#J#$8G$z<($$VIV1fRnR0 z>;JoJv4{;qh6)2#Lk>JA>vS96BqHkoj+AY}vEnb_DO*W0!tqN0}A?FdBcdik=6BlnvV2fo11 zE#wvy#ARng+uGXL=uBQvP=x@To}MlyCdPi(p(_|`Xs{x>xv5SKw+=5aEks5~x4nFM ztx$7hWTbJ;{k<)!pngGmh7rrV^Nyc^fdRq8<4GPq<3IibR>+SgC4Y8qkk7eyZ(ebM zVW`Tyn{iItS%kg37>sT2nw*;&E;>@3b?usl&IYNa`RNA?!>RYL-buwIB*?&EFyzK{ z@v25LcRO3|1-t_RYM?uWaz>Wv-c zR1JZQ2tnz_n`GqW#|vto+uGR;JxpoTe7O2prU~~=wua=u!^B?= z3{t`uK0oW|u)^Uanwpxfl!Y{9p7-hO3ud7`waNC$0ds;Q;r)tZHg zjlKWdRaq|23H-jhDkCdP&5+q;V-AMo9tF_3?SV-!zGNiz5MHZpg|QllugP9Y}Tc=z;>R8y;1U zrr*7|UR1Q*$Ve%pCHnd3m7=2f$Vf5oCl_&!j=wag>R!&t0Sf@TL?ZD)S2-7l#}5I# zhs!w-PbC7lNI%^^;$Y#q`1p1215FVgm7ahK5D|gv>!r2RZ)aX?vx?6yElqA~a}=Q3 z38wRZ{I=Houj=FG8%{+59V;g*^c( ztD>%s!vBfDJ#%92jg$2Ab?mONO=Caimt*=z2eEFs={g0+vUjyZame> z7b7&p_~&Q2H+_5d%|`CyznI;!SwnOEC($HD;QxXQ)dlB`$Ah$hXK`Q&uQp<`@P@N= Lz~0#FdE$Qnsab7b literal 0 HcmV?d00001 diff --git a/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameFRATex.ia8.png b/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameFRATex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..dc42bdc072d91aa01878ed832cfeedea8491a310 GIT binary patch literal 3808 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameGERTex.ia8.png b/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameGERTex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..5842acfeb59b25cf2c5db8868234ac030df38214 GIT binary patch literal 3608 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 AYXATM literal 0 HcmV?d00001 diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 150f167eb2a..f973abd132d 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -437,6 +437,15 @@ static const ALIGN_ASSET(2) char gFileSelLanguageGERTex[] = dgFileSelLanguageGER #define dgRocsFeatherTex "__OTR__textures/icon_item_static/gRocsFeatherTex" static const ALIGN_ASSET(2) char gRocsFeatherTex[] = dgRocsFeatherTex; +#define dgRocsFeatherItemNameENGTex "__OTR__textures/item_name_static/gRocsFeatherItemNameENGTex" +static const ALIGN_ASSET(2) char gRocsFeatherItemNameENGTex[] = dgRocsFeatherItemNameENGTex; + +#define dgRocsFeatherItemNameGERTex "__OTR__textures/item_name_static/gRocsFeatherItemNameGERTex" +static const ALIGN_ASSET(2) char gRocsFeatherItemNameGERTex[] = dgRocsFeatherItemNameGERTex; + +#define dgRocsFeatherItemNameFRATex "__OTR__textures/item_name_static/gRocsFeatherItemNameFRATex" +static const ALIGN_ASSET(2) char gRocsFeatherItemNameFRATex[] = dgRocsFeatherItemNameFRATex; + #define dgEmptyTexture "__OTR__textures/virtual/gEmptyTexture" static const ALIGN_ASSET(2) char gEmptyTexture[] = dgEmptyTexture; diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 1e53d8180aa..43e00d6b791 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -22,6 +22,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/SaveManager.h" #include "soh/Enhancements/kaleido.h" +#include static void* sEquipmentFRATexs[] = { gPauseEquipment00FRATex, gPauseEquipment01Tex, gPauseEquipment02Tex, gPauseEquipment03Tex, gPauseEquipment04Tex, @@ -2493,6 +2494,17 @@ void KaleidoScope_UpdateNamePanel(PlayState* play) { osSyncPrintf("J_N=%d point=%d\n", gSaveContext.language, sp2A); const char* textureName = iconNameTextures[sp2A]; + + if (pauseCtx->namedItem == ITEM_ROCS_FEATHER) { + if (gSaveContext.language == LANGUAGE_ENG) { + textureName = gRocsFeatherItemNameENGTex; + } else if (gSaveContext.language == LANGUAGE_GER) { + textureName = gRocsFeatherItemNameGERTex; + } else if (gSaveContext.language == LANGUAGE_FRA) { + textureName = gRocsFeatherItemNameFRATex; + } + } + memcpy(pauseCtx->nameSegment, textureName, strlen(textureName) + 1); } From b37e52f58cee154e6b38bb061694c26bdf869b81 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 20 Dec 2025 15:23:11 +0100 Subject: [PATCH 09/13] Fix item name textures --- ...x.ia8.png => gRocsFeatherItemNameENGTex.ia4.png} | Bin ...x.ia8.png => gRocsFeatherItemNameFRATex.ia4.png} | Bin ...x.ia8.png => gRocsFeatherItemNameGERTex.ia4.png} | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename soh/assets/custom/textures/item_name_static/{gRocsFeatherItemNameENGTex.ia8.png => gRocsFeatherItemNameENGTex.ia4.png} (100%) rename soh/assets/custom/textures/item_name_static/{gRocsFeatherItemNameFRATex.ia8.png => gRocsFeatherItemNameFRATex.ia4.png} (100%) rename soh/assets/custom/textures/item_name_static/{gRocsFeatherItemNameGERTex.ia8.png => gRocsFeatherItemNameGERTex.ia4.png} (100%) diff --git a/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameENGTex.ia8.png b/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameENGTex.ia4.png similarity index 100% rename from soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameENGTex.ia8.png rename to soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameENGTex.ia4.png diff --git a/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameFRATex.ia8.png b/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameFRATex.ia4.png similarity index 100% rename from soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameFRATex.ia8.png rename to soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameFRATex.ia4.png diff --git a/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameGERTex.ia8.png b/soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameGERTex.ia4.png similarity index 100% rename from soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameGERTex.ia8.png rename to soh/assets/custom/textures/item_name_static/gRocsFeatherItemNameGERTex.ia4.png From 23143ddcdc9c956bcc318600409e6f9dfdfc1ce5 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 20 Dec 2025 16:28:14 +0100 Subject: [PATCH 10/13] Vanilla code cleanup --- soh/soh/Enhancements/debugconsole.cpp | 2 +- .../vanilla-behavior/GIVanillaBehavior.h | 8 +++ .../Enhancements/randomizer/RocsFeather.cpp | 16 ++++++ soh/src/code/z_inventory.c | 53 ++++++++++--------- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 12 +---- 5 files changed, 54 insertions(+), 37 deletions(-) diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index ff40f149a02..6a1e619d462 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -394,7 +394,7 @@ static bool GiveItemHandler(std::shared_ptr Console, const std::v if (args[1].compare("vanilla") == 0) { getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_NONE, std::stoi(args[2])); } else if (args[1].compare("randomizer") == 0) { - getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, std::stoi(args[2])); + getItemEntry = Rando::StaticData::RetrieveItem((RandomizerGet)std::stoi(args[2])).GetGIEntry_Copy(); } else { ERROR_MESSAGE("[SOH] Invalid argument passed, must be 'vanilla' or 'randomizer'"); return 1; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 3103d88cd5e..a2c30b46de1 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2390,6 +2390,14 @@ typedef enum { // - `*int32_t` // ItemID VB_USE_ITEM, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*int16_t` // pauseCtx->namedItem + VB_DRAW_CUSTOM_ITEM_NAME, + } GIVanillaBehavior; #endif diff --git a/soh/soh/Enhancements/randomizer/RocsFeather.cpp b/soh/soh/Enhancements/randomizer/RocsFeather.cpp index fb05f123f05..af2dc71ddd9 100644 --- a/soh/soh/Enhancements/randomizer/RocsFeather.cpp +++ b/soh/soh/Enhancements/randomizer/RocsFeather.cpp @@ -79,6 +79,22 @@ void RegisterRocsFeather() { } } }); + + COND_VB_SHOULD(VB_DRAW_CUSTOM_ITEM_NAME, shouldRegister, { + u16 namedItem = va_arg(args, u16); + if (namedItem == ITEM_ROCS_FEATHER) { + *should = true; + const char* textureName = gRocsFeatherItemNameENGTex; + + if (gSaveContext.language == LANGUAGE_GER) { + textureName = gRocsFeatherItemNameGERTex; + } else if (gSaveContext.language == LANGUAGE_FRA) { + textureName = gRocsFeatherItemNameFRATex; + } + + memcpy(gPlayState->pauseCtx.nameSegment, textureName, strlen(textureName) + 1); + } + }); } static RegisterShipInitFunc registerRocsFeather(RegisterRocsFeather, { "IS_RANDO" }); diff --git a/soh/src/code/z_inventory.c b/soh/src/code/z_inventory.c index e4736cf2351..82f087fd099 100644 --- a/soh/src/code/z_inventory.c +++ b/soh/src/code/z_inventory.c @@ -170,32 +170,33 @@ void* gItemIcons[] = { gOcarinaBtnIconCRightTex, gOcarinaBtnIconATex, // Push down array to reach newly added item IDs - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, - gItemIconDekuStickTex, + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + // Start custom items gRocsFeatherTex, }; diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 43e00d6b791..b4cb2d7939c 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -2495,17 +2495,9 @@ void KaleidoScope_UpdateNamePanel(PlayState* play) { const char* textureName = iconNameTextures[sp2A]; - if (pauseCtx->namedItem == ITEM_ROCS_FEATHER) { - if (gSaveContext.language == LANGUAGE_ENG) { - textureName = gRocsFeatherItemNameENGTex; - } else if (gSaveContext.language == LANGUAGE_GER) { - textureName = gRocsFeatherItemNameGERTex; - } else if (gSaveContext.language == LANGUAGE_FRA) { - textureName = gRocsFeatherItemNameFRATex; - } + if (!GameInteractor_Should(VB_DRAW_CUSTOM_ITEM_NAME, false, pauseCtx->namedItem)) { + memcpy(pauseCtx->nameSegment, textureName, strlen(textureName) + 1); } - - memcpy(pauseCtx->nameSegment, textureName, strlen(textureName) + 1); } pauseCtx->nameDisplayTimer = 0; From 67918c14764c7df9f06047259ba6f1c219ef7ad4 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 20 Dec 2025 16:47:00 +0100 Subject: [PATCH 11/13] clang format --- soh/soh/Enhancements/randomizer/3drando/shops.cpp | 6 +++--- soh/soh/Enhancements/randomizer/RocsFeather.cpp | 2 +- soh/soh/Enhancements/randomizer/randomizer.cpp | 6 ++---- soh/soh/Enhancements/randomizer/randomizerTypes.h | 2 +- soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp | 4 +--- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index ae0b466df84..04c04321704 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -888,9 +888,9 @@ void InitTrickNames() { Text{ "Shiny Rock", "Caillou Brillant", "glänzender Stein" }, // "Shiny Rock" }; trickNameTable[RG_ROCS_FEATHER] = { - Text{ "Chicken Wing", "Chicken Wing", "Chicken Wing" }, // "Chicken Wing" - Text{ "Roc's Leg", "Roc's Leg", "Roc's Leg" }, // "Roc's Leg" - Text{ "Roc's Fapper", "Roc's Fapper", "Roc's Fapper" }, // "Roc's Fapper" + Text{ "Chicken Wing", "Chicken Wing", "Chicken Wing" }, // "Chicken Wing" + Text{ "Roc's Leg", "Roc's Leg", "Roc's Leg" }, // "Roc's Leg" + Text{ "Roc's Fapper", "Roc's Fapper", "Roc's Fapper" }, // "Roc's Fapper" }; trickNameTable[RG_GOHMA_SOUL] = { Text{ "Spider Sense", "Sens de l'Araignée", "Spinnensinn" }, diff --git a/soh/soh/Enhancements/randomizer/RocsFeather.cpp b/soh/soh/Enhancements/randomizer/RocsFeather.cpp index af2dc71ddd9..5486c15f845 100644 --- a/soh/soh/Enhancements/randomizer/RocsFeather.cpp +++ b/soh/soh/Enhancements/randomizer/RocsFeather.cpp @@ -68,7 +68,7 @@ void RegisterRocsFeather() { Vec3f effectsPos = player->actor.home.pos; effectsPos.y += 3; - + EffectSsGRipple_Spawn(gPlayState, &effectsPos, 200 * effectsScale, 300 * effectsScale, 1); EffectSsGSplash_Spawn(gPlayState, &effectsPos, NULL, NULL, 0, 150 * effectsScale); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 5efcd592856..5c8e457de00 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -988,7 +988,7 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe } case RG_ROCS_FEATHER: return Flags_GetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN; - + // Bottles case RG_EMPTY_BOTTLE: case RG_BOTTLE_WITH_MILK: @@ -4913,9 +4913,7 @@ CustomMessage Randomizer::GetTriforcePieceMessage() { void CreateRocsFeatherMessage() { CustomMessage RocsFeatherMessage = { - { "You found %cRoc's Feather%w!", - "You found %cRoc's Feather%w!", - "You found %cRoc's Feather%w!" }, + { "You found %cRoc's Feather%w!", "You found %cRoc's Feather%w!", "You found %cRoc's Feather%w!" }, }; CustomMessageManager* customMessageManager = CustomMessageManager::Instance; customMessageManager->AddCustomMessageTable(Randomizer::RocsFeatherMessageTableID); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index d8d8334a42f..dca6faa9ef5 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -4337,7 +4337,7 @@ typedef enum { // Custom Items RG_ROCS_FEATHER, - + // Logic Only RG_DISTANT_SCARECROW, RG_STICKS, diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index 0520a0f2c4f..49646997ff4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -2138,9 +2138,7 @@ void RegisterItemTrackerWidgets() { } void RegisterItemTracker() { - COND_HOOK(OnLoadFile, true, [](int32_t fileNum) { - shouldUpdateVectors = true; - }); + COND_HOOK(OnLoadFile, true, [](int32_t fileNum) { shouldUpdateVectors = true; }); } static RegisterShipInitFunc registerItemTracker(RegisterItemTracker); From b3e431e065b59da09b384a773144678396de7f62 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 20 Dec 2025 20:22:55 +0100 Subject: [PATCH 12/13] Fix maxed debug save and linux crash --- soh/soh/Enhancements/randomizer/RocsFeather.cpp | 2 +- soh/soh/SaveManager.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/RocsFeather.cpp b/soh/soh/Enhancements/randomizer/RocsFeather.cpp index 5486c15f845..fecb2489e10 100644 --- a/soh/soh/Enhancements/randomizer/RocsFeather.cpp +++ b/soh/soh/Enhancements/randomizer/RocsFeather.cpp @@ -81,7 +81,7 @@ void RegisterRocsFeather() { }); COND_VB_SHOULD(VB_DRAW_CUSTOM_ITEM_NAME, shouldRegister, { - u16 namedItem = va_arg(args, u16); + u32 namedItem = va_arg(args, u32); if (namedItem == ITEM_ROCS_FEATHER) { *should = true; const char* textureName = gRocsFeatherItemNameENGTex; diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 9317f8cbc4e..ead8a06a166 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -1084,6 +1084,9 @@ void SaveManager::InitFileMaxed() { gSaveContext.entranceIndex = ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN; gSaveContext.sceneFlags[5].swch = 0x40000000; + + Flags_SetRandomizerInf(RAND_INF_OBTAINED_NAYRUS_LOVE); + Flags_SetRandomizerInf(RAND_INF_OBTAINED_ROCS_FEATHER); } #if defined(__WIIU__) || defined(__SWITCH__) From 363599d97dc4dff5e99c630d9a19c2924d02d7b0 Mon Sep 17 00:00:00 2001 From: aMannus Date: Sat, 20 Dec 2025 23:40:21 +0100 Subject: [PATCH 13/13] Add plentiful pool, fix ice trap names --- soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 3 +++ soh/soh/Enhancements/randomizer/3drando/shops.cpp | 2 +- soh/soh/Enhancements/randomizer/3drando/shops.hpp | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index ba72c967c7d..0ddf13ed7ff 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -514,6 +514,9 @@ void GenerateItemPool() { if (ctx->GetOption(RSK_ROCS_FEATHER)) { ctx->possibleIceTrapModels.push_back(RG_ROCS_FEATHER); AddItemToMainPool(RG_ROCS_FEATHER); + if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemToPool(PendingJunkPool, RG_ROCS_FEATHER); + } } // Fixed item locations diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 04c04321704..0c0ce66abe8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -1164,7 +1164,7 @@ void InitTrickNames() { } // Generate a fake name for the ice trap based on the item it's displayed as -Text GetIceTrapName(uint8_t id) { +Text GetIceTrapName(uint16_t id) { // If the trick names table has not been initialized, do so if (!initTrickNames) { InitTrickNames(); diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.hpp b/soh/soh/Enhancements/randomizer/3drando/shops.hpp index 81c4a43582b..799856b6301 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.hpp @@ -27,4 +27,4 @@ extern std::vector GetMinVanillaShopItems(int total_replaced); extern uint16_t GetRandomPrice(Rando::Location* loc, PriceSettingsStruct priceSettings); extern uint16_t GetCheapBalancedPrice(); extern int GetShopsanityReplaceAmount(); -extern Text GetIceTrapName(uint8_t id); +extern Text GetIceTrapName(uint16_t id);