From a9c55d4efca897e99d39d32b1a230a7adf212c6a Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 1 Oct 2025 20:59:21 -0400 Subject: [PATCH 01/34] Add Aliens and initial code moved from old build. --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 5 ++++ mm/2s2h/Rando/DrawFuncs.cpp | 34 +++++++++++++++++++++++++++ mm/2s2h/Rando/DrawFuncs.h | 3 +++ mm/2s2h/Rando/DrawItem.cpp | 3 +++ mm/2s2h/Rando/GiveItem.cpp | 3 +++ mm/2s2h/Rando/Menu.cpp | 4 ++-- mm/2s2h/Rando/StaticData/Items.cpp | 1 + mm/2s2h/Rando/StaticData/Options.cpp | 1 + mm/2s2h/Rando/Types.h | 3 +++ 9 files changed, 55 insertions(+), 2 deletions(-) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 326b375915..43c2b0a138 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -1,5 +1,6 @@ #include "ActorBehavior.h" #include "public/bridge/consolevariablebridge.h" +#include "Rando/DrawFuncs.h" extern "C" { #include "variables.h" @@ -10,6 +11,10 @@ extern "C" { void func_80B0CF24(BossHakugin*, PlayState*); } +std::unordered_map, std::vector, RandoInf>> soulMap = { + { RI_SOUL_ALIEN, { DrawAlien, { ACTOR_EN_INVADEPOH }, RANDO_INF_OBTAINED_SOUL_OF_ALIENS } }, +}; + void ShouldActorUpdate(Actor* actor, bool* should, RandoInf randoInf) { if (!Flags_GetRandoInf(randoInf)) { *should = false; diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index 88dbf0be5a..deb949b989 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -20,6 +20,9 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec /* Twinmold */ #include "objects/object_boss02/object_boss02.h" /* Majora */ #include "objects/object_boss07/object_boss07.h" +// Enemy Includes +/* Alien */ #include "assets/objects/object_uch/object_uch.h" + // Other Actor Includes /* Minifrog */ #include "objects/object_fr/object_fr.h" // clang-format on @@ -68,6 +71,37 @@ void EnMinifrogPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* } } +// Enemy Soul Draw Functions +extern void DrawAlien() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[ALIEN_LIMB_MAX]; + static Vec3s morphTable[ALIEN_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + Matrix_Translate(0, 0, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gAlienSkel, (AnimationHeader*)&gAlienFloatAnim, + jointTable, morphTable, ALIEN_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + Scene_SetRenderModeXlu(gPlayState, 0, 1); + AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gAlienEmptyTexAnim)); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 10, 138, 46 }, { 30.0f, 30.0f, 30.0f }); +} + // Boss Souls extern void DrawGoht() { OPEN_DISPS(gPlayState->state.gfxCtx); diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index 345e63e5c3..5c45c843b2 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -10,6 +10,9 @@ void DrawMajora(); void DrawOdolwa(); void DrawTwinmold(); +// Enemy Functions +void DrawAlien(); + // Other Actor Functions void DrawMinifrog(RandoItemId randoItemId, Actor* actor); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index abdd11cd6f..3389648efc 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -400,6 +400,9 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_PROGRESSIVE_WALLET: Rando::DrawItem(Rando::ConvertItem(randoItemId), actor); break; + case RI_SOUL_ALIEN: + DrawAlien(); + break; case RI_SOUL_GOHT: DrawGoht(); break; diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 243955460d..6a43889e42 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -257,6 +257,9 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_TWINMOLD: Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT + (randoItemId - RI_SOUL_GOHT)); break; + case RI_SOUL_ALIEN: + Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ALIENS); + break; case RI_FROG_BLUE: SET_WEEKEVENTREG(WEEKEVENTREG_33_01); break; diff --git a/mm/2s2h/Rando/Menu.cpp b/mm/2s2h/Rando/Menu.cpp index 4612d4aa16..7165a15ca1 100644 --- a/mm/2s2h/Rando/Menu.cpp +++ b/mm/2s2h/Rando/Menu.cpp @@ -270,8 +270,8 @@ static void DrawItemsTab() { "that must be found in order for their corresponding boss to spawn.", .disabled = IncompatibleWithLogicSetting(RO_SHUFFLE_BOSS_SOULS), .disabledTooltip = "Incompatible with current Logic Setting" } })); - CVarCheckbox("Enemy Souls", "gPlaceholderBool", - CheckboxOptions({ { .disabled = true, .disabledTooltip = "Coming Soon" } })); + CVarCheckbox("Enemy Souls", Rando::StaticData::Options[RO_SHUFFLE_ENEMY_SOULS].cvar, + CheckboxOptions({ { .disabled = false, .disabledTooltip = "Coming Soon" } })); ImGui::EndChild(); ImGui::SameLine(); ImGui::BeginChild("randoItemsColumn3", ImVec2(columnWidth, halfHeight)); diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index b0243aaf79..7b327b1af5 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -166,6 +166,7 @@ std::map Items = { RI(RI_SONG_STORMS, "the", "Song of Storms", RITYPE_MAJOR, ITEM_SONG_STORMS, GI_NONE, GID_NONE), RI(RI_SONG_SUN, "the", "Sun's Song", RITYPE_MAJOR, ITEM_SONG_SUN, GI_NONE, GID_NONE), RI(RI_SONG_TIME, "the", "Song of Time", RITYPE_MAJOR, ITEM_SONG_TIME, GI_NONE, GID_NONE), + RI(RI_SOUL_ALIEN, "the", "Soul of Aliens", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GYORG, "the", "Soul of Gyorg", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_MAJORA, "the", "Soul of Majora", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/StaticData/Options.cpp b/mm/2s2h/Rando/StaticData/Options.cpp index 66879099c3..695f2ce92c 100644 --- a/mm/2s2h/Rando/StaticData/Options.cpp +++ b/mm/2s2h/Rando/StaticData/Options.cpp @@ -31,6 +31,7 @@ std::map Options = { RO(RO_SHUFFLE_BOSS_SOULS, RO_GENERIC_OFF), RO(RO_SHUFFLE_COWS, RO_GENERIC_OFF), RO(RO_SHUFFLE_CRATE_DROPS, RO_GENERIC_OFF), + RO(RO_SHUFFLE_ENEMY_SOULS, RO_GENERIC_OFF), RO(RO_SHUFFLE_FREESTANDING_ITEMS, RO_GENERIC_OFF), RO(RO_SHUFFLE_FROGS, RO_GENERIC_OFF), RO(RO_SHUFFLE_GOLD_SKULLTULAS, RO_GENERIC_OFF), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 73fd2913ab..df88ac6627 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2397,6 +2397,7 @@ typedef enum { RI_SONG_STORMS, RI_SONG_SUN, RI_SONG_TIME, + RI_SOUL_ALIEN, RI_SOUL_GOHT, RI_SOUL_GYORG, RI_SOUL_MAJORA, @@ -2746,6 +2747,7 @@ typedef enum { RO_SHUFFLE_BOSS_SOULS, RO_SHUFFLE_COWS, RO_SHUFFLE_CRATE_DROPS, + RO_SHUFFLE_ENEMY_SOULS, RO_SHUFFLE_FREESTANDING_ITEMS, RO_SHUFFLE_FROGS, RO_SHUFFLE_GRASS_DROPS, @@ -2812,6 +2814,7 @@ typedef enum { RANDO_INF_OBTAINED_LETTER_TO_MAMA, RANDO_INF_OBTAINED_LETTER_TO_KAFEI, RANDO_INF_OBTAINED_PENDANT_OF_MEMORIES, + RANDO_INF_OBTAINED_SOUL_OF_ALIENS, RANDO_INF_OBTAINED_SOUL_OF_GOHT, RANDO_INF_OBTAINED_SOUL_OF_GYORG, RANDO_INF_OBTAINED_SOUL_OF_MAJORA, From a271616a69c8a10a85a6145a10dcfbc68367d813 Mon Sep 17 00:00:00 2001 From: Caladius Date: Thu, 2 Oct 2025 14:37:59 -0400 Subject: [PATCH 02/34] Update Enemy Souls to latest Develop and fix issues. --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 101 ++- mm/2s2h/Rando/ActorBehavior/Souls.h | 8 + mm/2s2h/Rando/DrawFuncs.cpp | 975 +++++++++++++++++++++++++- mm/2s2h/Rando/DrawFuncs.h | 30 +- mm/2s2h/Rando/DrawItem.cpp | 40 +- mm/2s2h/Rando/GiveItem.cpp | 36 +- mm/2s2h/Rando/StaticData/Items.cpp | 40 +- mm/2s2h/Rando/Types.h | 61 +- 8 files changed, 1256 insertions(+), 35 deletions(-) create mode 100644 mm/2s2h/Rando/ActorBehavior/Souls.h diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 43c2b0a138..bda4a61d76 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -1,3 +1,4 @@ +#include "Souls.h" #include "ActorBehavior.h" #include "public/bridge/consolevariablebridge.h" #include "Rando/DrawFuncs.h" @@ -11,9 +12,50 @@ extern "C" { void func_80B0CF24(BossHakugin*, PlayState*); } +// clang-format off std::unordered_map, std::vector, RandoInf>> soulMap = { - { RI_SOUL_ALIEN, { DrawAlien, { ACTOR_EN_INVADEPOH }, RANDO_INF_OBTAINED_SOUL_OF_ALIENS } }, + { RI_SOUL_ARMOS, { DrawArmos, { ACTOR_EN_AM }, RANDO_INF_OBTAINED_SOUL_OF_ARMOS } }, + { RI_SOUL_BAT, { DrawBat, { ACTOR_EN_BAT }, RANDO_INF_OBTAINED_SOUL_OF_BATS } }, + { RI_SOUL_BEAMOS, { DrawBeamos, { ACTOR_EN_VM }, RANDO_INF_OBTAINED_SOUL_OF_BEAMOS } }, + { RI_SOUL_BOE, { DrawBoe, { ACTOR_EN_MKK }, RANDO_INF_OBTAINED_SOUL_OF_BOES } }, + { RI_SOUL_BOMBCHU, { DrawRealBombchu, { ACTOR_EN_RAT }, RANDO_INF_OBTAINED_SOUL_OF_BOMBCHU } }, + { RI_SOUL_DEATH_ARMOS, { DrawDeathArmos, { ACTOR_EN_FAMOS }, RANDO_INF_OBTAINED_SOUL_OF_DEATH_ARMOS } }, + { RI_SOUL_DEKU_BABA, { DrawDekuBaba, { ACTOR_EN_DEKUBABA, ACTOR_EN_KAREBABA, ACTOR_BOSS_05 }, RANDO_INF_OBTAINED_SOUL_OF_DEKU_BABAS } }, + { RI_SOUL_DINOLFOS, { DrawDinolfos, { ACTOR_EN_DINOFOS }, RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS } }, + { RI_SOUL_DODONGO, { DrawDodongo, { ACTOR_EN_DODONGO }, RANDO_INF_OBTAINED_SOUL_OF_DODONGOS } }, + { RI_SOUL_EENO, { DrawEeno, { ACTOR_EN_SNOWMAN }, RANDO_INF_OBTAINED_SOUL_OF_EENOS } }, + { RI_SOUL_GARO, { DrawGaroMaster, { ACTOR_EN_JSO2, ACTOR_EN_JSO }, RANDO_INF_OBTAINED_SOUL_OF_GARO_MASTERS } }, + { RI_SOUL_GRASSHOPPER, { DrawGrasshopper, { ACTOR_EN_GRASSHOPPER }, RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS } }, + { RI_SOUL_GUAY, { DrawGuay, { ACTOR_EN_CROW, ACTOR_EN_RUPPECROW }, RANDO_INF_OBTAINED_SOUL_OF_GUAYS } }, + { RI_SOUL_IRON_KNUCKLE, { DrawIronKnuckle, { ACTOR_EN_IK }, RANDO_INF_OBTAINED_SOUL_OF_IRON_KNUCKLES } }, + { RI_SOUL_KEESE, { DrawKeese, { ACTOR_EN_FIREFLY }, RANDO_INF_OBTAINED_SOUL_OF_KEESE } }, + { RI_SOUL_LEEVER, { DrawLeever, { ACTOR_EN_NEO_REEBA }, RANDO_INF_OBTAINED_SOUL_OF_LEEVERS } }, + { RI_SOUL_MAD_SCRUB, { DrawMadScrub, { ACTOR_EN_DEKUNUTS }, RANDO_INF_OBTAINED_SOUL_OF_MAD_SCRUBS } }, + { RI_SOUL_OCTOROK, { DrawOctorok, { ACTOR_EN_OKUTA }, RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS } }, + { RI_SOUL_PEAHAT, { DrawPeahat, { ACTOR_EN_PEEHAT }, RANDO_INF_OBTAINED_SOUL_OF_PEAHATS } }, + { RI_SOUL_REDEAD, { DrawRedead, { ACTOR_EN_RD, ACTOR_EN_RAILGIBUD }, RANDO_INF_OBTAINED_SOUL_OF_REDEADS } }, + { RI_SOUL_SHELLBLADE, { DrawShellBlade, { ACTOR_EN_SB }, RANDO_INF_OBTAINED_SOUL_OF_SHELLBLADES } }, + { RI_SOUL_SKULLFISH, { DrawSkullfish, { ACTOR_EN_PR, ACTOR_EN_PRZ, ACTOR_EN_PR2 }, RANDO_INF_OBTAINED_SOUL_OF_SKULLFISH } }, + { RI_SOUL_SKULLTULA, { DrawSkulltula, { ACTOR_EN_ST, ACTOR_EN_SW }, RANDO_INF_OBTAINED_SOUL_OF_SKULLTULAS } }, + { RI_SOUL_SLIME, { DrawSlime, { ACTOR_EN_SLIME }, RANDO_INF_OBTAINED_SOUL_OF_SLIMES } }, + { RI_SOUL_SNAPPER, { DrawSnapper, { ACTOR_EN_KAME }, RANDO_INF_OBTAINED_SOUL_OF_SNAPPERS } }, + { RI_SOUL_STALCHILD, { DrawStalchild, { ACTOR_EN_SKB, ACTOR_EN_RAIL_SKB }, RANDO_INF_OBTAINED_SOUL_OF_STALCHILDREN } }, + { RI_SOUL_TEKTITE, { DrawTektite, { ACTOR_EN_TITE }, RANDO_INF_OBTAINED_SOUL_OF_TEKTITES } }, + { RI_SOUL_WALLMASTER, { DrawWallmaster, { ACTOR_EN_WALLMAS, ACTOR_EN_FLOORMAS }, RANDO_INF_OBTAINED_SOUL_OF_WALLMASTERS } }, + { RI_SOUL_WOLFOS, { DrawWolfos, { ACTOR_EN_WF }, RANDO_INF_OBTAINED_SOUL_OF_WOLFOS } }, }; +// clang-format on + +RandoItemId GetRandoItemIdByActor(int16_t actorId) { + for (auto& soul : soulMap) { + for (auto& actor : std::get<1>(soul.second)) { + if (actor == actorId) { + return soul.first; + } + } + } + return RI_UNKNOWN; +} void ShouldActorUpdate(Actor* actor, bool* should, RandoInf randoInf) { if (!Flags_GetRandoInf(randoInf)) { @@ -31,47 +73,82 @@ void ShouldActorDraw(Actor* actor, bool* should, RandoInf randoInf) { } void Rando::ActorBehavior::InitSoulsBehavior() { - bool shouldRegister = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES; + bool shouldBossRegister = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES; + bool shouldEnemyRegister = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_YES; + + // ShouldActorDraw & ShouldActorUpdate for Enemy Souls + COND_HOOK(ShouldActorDraw, shouldEnemyRegister, [](Actor* actor, bool* should) { + if (actor->category != ACTORCAT_ENEMY || actor->category == ACTORCAT_BOSS) { + return; + } + + RandoItemId randoItemId = GetRandoItemIdByActor(actor->id); + if (randoItemId == RI_UNKNOWN) { + return; + } + + auto findSoulFlag = soulMap.find(randoItemId); + if (findSoulFlag != soulMap.end()) { + ShouldActorDraw(actor, should, std::get<2>(findSoulFlag->second)); + } + }); + + COND_HOOK(ShouldActorUpdate, shouldEnemyRegister, [](Actor* actor, bool* should) { + if (actor->category != ACTORCAT_ENEMY || actor->category == ACTORCAT_BOSS) { + return; + } + + RandoItemId randoItemId = GetRandoItemIdByActor(actor->id); + if (randoItemId == RI_UNKNOWN) { + return; + } + + auto findSoulFlag = soulMap.find(randoItemId); + if (findSoulFlag != soulMap.end()) { + ShouldActorUpdate(actor, should, std::get<2>(findSoulFlag->second)); + } + }); - COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_HAKUGIN, shouldRegister, [](Actor* actor, bool* should) { + // ShouldActorDraw & ShouldActorUpdate for Boss Souls + COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_HAKUGIN, shouldBossRegister, [](Actor* actor, bool* should) { if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT)) { func_80B0CF24((BossHakugin*)actor, gPlayState); *should = false; } }); - COND_VB_SHOULD(VB_GOHT_UNFREEZE, shouldRegister, { + COND_VB_SHOULD(VB_GOHT_UNFREEZE, shouldBossRegister, { if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT)) { *should = false; } }); - COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_03, shouldRegister, + COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_03, shouldBossRegister, [](Actor* actor, bool* should) { ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_GYORG); }); - COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_07, shouldRegister, + COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_07, shouldBossRegister, [](Actor* actor, bool* should) { ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_MAJORA); }); - COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_01, shouldRegister, + COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_01, shouldBossRegister, [](Actor* actor, bool* should) { ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA); }); - COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_02, shouldRegister, [](Actor* actor, bool* should) { + COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_02, shouldBossRegister, [](Actor* actor, bool* should) { ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD); }); - COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_03, shouldRegister, [](Actor* actor, bool* should) { + COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_03, shouldBossRegister, [](Actor* actor, bool* should) { ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_GYORG); }); - COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_07, shouldRegister, [](Actor* actor, bool* should) { + COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_07, shouldBossRegister, [](Actor* actor, bool* should) { ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_MAJORA); }); - COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_01, shouldRegister, [](Actor* actor, bool* should) { + COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_01, shouldBossRegister, [](Actor* actor, bool* should) { ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA); }); - COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_02, shouldRegister, [](Actor* actor, bool* should) { + COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_02, shouldBossRegister, [](Actor* actor, bool* should) { ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD); }); } diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.h b/mm/2s2h/Rando/ActorBehavior/Souls.h new file mode 100644 index 0000000000..d1a903248a --- /dev/null +++ b/mm/2s2h/Rando/ActorBehavior/Souls.h @@ -0,0 +1,8 @@ +#ifndef SOULS_H +#define SOULS_H + +#include "Rando/Rando.h" + +extern std::unordered_map, std::vector, RandoInf>> soulMap; + +#endif // SOULS_ diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index deb949b989..8f1c193573 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -21,7 +21,35 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec /* Majora */ #include "objects/object_boss07/object_boss07.h" // Enemy Includes -/* Alien */ #include "assets/objects/object_uch/object_uch.h" +/* Armos */ #include "assets/objects/object_am/object_am.h" +/* Bad Bat */ #include "assets/objects/object_bat/object_bat.h" +/* Beamos */ #include "assets/objects/object_vm/object_vm.h" +/* Boe */ #include "assets/objects/object_mkk/object_mkk.h" +/* Rat */ #include "assets/objects/object_rat/object_rat.h" +/* Death Armos */ #include "assets/objects/object_famos/object_famos.h" +/* Deku Baba */ #include "assets/objects/object_dekubaba/object_dekubaba.h" +/* Dinolfos */ #include "assets/objects/object_dinofos/object_dinofos.h" +/* Dodongo */ #include "assets/objects/object_dodongo/object_dodongo.h" +/* Eeno */ #include "assets/objects/object_snowman/object_snowman.h" +/* Garo Master */ #include "assets/objects/object_jso/object_jso.h" +/* Grasshopper */ #include "assets/objects/object_grasshopper/object_grasshopper.h" +/* Guay */ #include "assets/objects/object_crow/object_crow.h" +/* Iron Knuckle */ #include "assets/objects/object_ik/object_ik.h" +/* Keese */ #include "assets/objects/object_firefly/object_firefly.h" +/* Leever */ #include "assets/objects/object_rb/object_rb.h" +/* Mad Scrub */ #include "assets/objects/object_dekunuts/object_dekunuts.h" +/* Octorok */ #include "assets/objects/object_okuta/object_okuta.h" +/* Peehat */ #include "assets/objects/object_ph/object_ph.h" +/* Redead */ #include "assets/objects/object_rd/object_rd.h" +/* Shellblade */ #include "assets/objects/object_sb/object_sb.h" +/* Skullfish */ #include "assets/objects/object_pr/object_pr.h" +/* Skulltula */ #include "assets/objects/object_st/object_st.h" +/* Slimes */ #include "assets/objects/object_slime/object_slime.h" +/* Snapper */ #include "assets/objects/object_tl/object_tl.h" +/* Stalchild */ #include "assets/objects/object_skb/object_skb.h" +/* Tektite */ #include "assets/objects/object_tite/object_tite.h" +/* Wallmaster */ #include "assets/objects/object_wallmaster/object_wallmaster.h" +/* Wolfos */ #include "assets/objects/object_wf/object_wf.h" // Other Actor Includes /* Minifrog */ #include "objects/object_fr/object_fr.h" @@ -71,35 +99,965 @@ void EnMinifrogPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* } } +void DrawEnFirefly_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* firefly) { + static Color_RGBA8 auraPrimColor[2] = { { 255, 255, 100, 255 }, { 100, 200, 255, 255 } }; + static Color_RGBA8 auraEnvColor[2] = { { 255, 50, 0, 0 }, { 0, 0, 255, 0 } }; + static uint32_t dustUpdate = 0; + static bool auraColor = false; + static Vec3f auraVelocity = { 0, 0.5f, 0 }; + static Vec3f auraAccel = { 0, 0.5f, 0 }; + static Vec3f auraPos; + if (firefly != NULL) { + auraPos = firefly->world.pos; + } + + Matrix_MultZero(&auraPos); + auraPos.x += Rand_ZeroOne() * 0.5f; + auraPos.y += Rand_ZeroOne() * 0.5f; + auraPos.z += Rand_ZeroOne() * 0.5f; + + if (gPlayState != NULL && dustUpdate != gPlayState->state.frames) { + if (dustUpdate == gPlayState->state.frames - 20) { + dustUpdate = gPlayState->state.frames; + auraColor = !auraColor; + } + } + + if (limbIndex == FIRE_KEESE_LIMB_HEAD) { + Gfx* gfx = play->state.gfxCtx->polyXlu.p; + Scene_SetRenderModeXlu(play, 1, 2); + gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfx++, (Gfx*)&gKeeseRedEyesDL); + } + if (limbIndex == FIRE_KEESE_LIMB_LEFT_WING_END || limbIndex == FIRE_KEESE_LIMB_RIGHT_WING_END_ROOT) { + EffectSsDust_Spawn(gPlayState, 2, &auraPos, &auraVelocity, &auraAccel, &auraPrimColor[auraColor], + &auraEnvColor[auraColor], 100, -40, 3, 0); + } +} + +void DrawEnRealBombchu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* rat) { + // Gfx* gfx = play->state.gfxCtx->polyOpa.p; + + if (limbIndex == REAL_BOMBCHU_LIMB_TAIL_END) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_ReplaceRotation(&play->billboardMtxF); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)&gBombCapDL); + Matrix_RotateZYX(0x4000, 0, 0, MTXMODE_APPLY); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 80, 255); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 10, 0, 40, 255); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)&gBombBodyDL); + CLOSE_DISPS(play->state.gfxCtx); + } +} + // Enemy Soul Draw Functions -extern void DrawAlien() { +extern void DrawArmos() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[OBJECT_AM_LIMB_MAX]; + static Vec3s morphTable[OBJECT_AM_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3100, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_am_Skel_005948, + (AnimationHeader*)&gArmosHopAnim, jointTable, morphTable, OBJECT_AM_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawBat() { + static u32 lastUpdate = 0; + static u32 wingAnim = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + + static Gfx* sWingsDLs[] = { + (Gfx*)&gBadBatWingsFrame0DL, (Gfx*)&gBadBatWingsFrame1DL, (Gfx*)&gBadBatWingsFrame2DL, + (Gfx*)&gBadBatWingsFrame3DL, (Gfx*)&gBadBatWingsFrame4DL, (Gfx*)&gBadBatWingsFrame5DL, + (Gfx*)&gBadBatWingsFrame6DL, (Gfx*)&gBadBatWingsFrame7DL, (Gfx*)&gBadBatWingsFrame8DL, + }; + + Gfx* gfx = POLY_OPA_DISP; + + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + if (wingAnim == 8) { + wingAnim = 0; + } else { + wingAnim++; + } + } + + gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); + gSPMatrix(&gfx[1], Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(&gfx[2], (Gfx*)&gBadBatSetupDL); + gSPDisplayList(&gfx[3], (Gfx*)&gBadBatBodyDL); + gSPDisplayList(&gfx[4], sWingsDLs[wingAnim]); + + POLY_OPA_DISP = &gfx[5]; + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); +} + +extern void DrawBeamos() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[11]; + static Vec3s morphTable[11]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3200, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gBeamosSkel, (AnimationHeader*)&gBeamosAnim, + jointTable, morphTable, 11); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawBoe() { + static Gfx* sBoeDLists[4] = { + (Gfx*)gBlackBoeBodyMaterialDL, + (Gfx*)gBlackBoeBodyModelDL, + (Gfx*)gBlackBoeEndDL, + (Gfx*)gBlackBoeEyesDL, + }; + static Color_RGBA8 D_80A4F7C4 = { 0, 0, 0, 255 }; + + OPEN_DISPS(gPlayState->state.gfxCtx); + + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -1200, 0, MTXMODE_APPLY); + + gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_25]); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0xFF, 0, 0, 0, 255); + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)D_801AEFA0); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gBlackBoeEndDL); + + gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_25]); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBlackBoeBodyMaterialDL); + Matrix_ReplaceRotation(&gPlayState->billboardMtxF); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBlackBoeBodyModelDL); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 245, 97, 0, 255); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBlackBoeEyesDL); + Matrix_Scale(0.009f, 0.009f, 0.009f, MTXMODE_APPLY); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 245, 214, 0, 255); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBlackBoeEyesDL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 1000.0f, 1000.0f, 1000.0f }); +} + +extern void DrawRealBombchu() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[REAL_BOMBCHU_LIMB_MAX]; + static Vec3s morphTable[REAL_BOMBCHU_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gRealBombchuSkel, + (AnimationHeader*)&gRealBombchuRunAnim, jointTable, morphTable, REAL_BOMBCHU_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, + DrawEnRealBombchu_PostLimbDraw, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); +} + +extern void DrawDeathArmos() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[FAMOS_LIMB_MAX]; + static Vec3s morphTable[FAMOS_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)gFamosNormalGlowingEmblemTexAnim); + Matrix_Scale(0.008f, 0.008f, 0.008f, MTXMODE_APPLY); + Matrix_Translate(0, -4100, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gFamosSkel, (AnimationHeader*)&gFamosIdleAnim, + jointTable, morphTable, FAMOS_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawDekuBaba() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[DEKUBABA_LIMB_MAX]; + static Vec3s morphTable[DEKUBABA_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, 0, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gDekuBabaSkel, + (AnimationHeader*)&gDekuBabaFastChompAnim, jointTable, morphTable, DEKUBABA_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); +} + +extern void DrawDinolfos() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[DINOLFOS_LIMB_MAX]; + static Vec3s morphTable[DINOLFOS_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + + Matrix_Scale(0.014f, 0.014f, 0.014f, MTXMODE_APPLY); + Matrix_Translate(0, -2200.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gDinolfosSkel, + (AnimationHeader*)&gDinolfosIdleAnim, jointTable, morphTable, DINOLFOS_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + Scene_SetRenderModeXlu(gPlayState, 0, 1); + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)&gDinolfosEyeOpenTex); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawDodongo() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[OBJECT_DODONGO_LIMB_MAX]; + static Vec3s morphTable[OBJECT_DODONGO_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_dodongo_Skel_008318, + (AnimationHeader*)&object_dodongo_Anim_004C20, jointTable, morphTable, OBJECT_DODONGO_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawEeno() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[EENO_LIMB_MAX]; + static Vec3s morphTable[EENO_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gEenoSkel, (AnimationHeader*)&gEenoIdleAnim, + jointTable, morphTable, EENO_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + Scene_SetRenderModeXlu(gPlayState, 0, 1); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawGaroMaster() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[GARO_MASTER_LIMB_MAX]; + static Vec3s morphTable[GARO_MASTER_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); + Matrix_Translate(0, -50.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gGaroMasterSkel, + (AnimationHeader*)&gGaroLookAroundAnim, jointTable, morphTable, GARO_MASTER_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + Scene_SetRenderModeXlu(gPlayState, 0, 1); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 4.0f, 4.0f, 4.0f }); +} + +extern void DrawGrasshopper() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[DRAGONFLY_LIMB_MAX]; + static Vec3s morphTable[DRAGONFLY_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gDragonflySkel, (AnimationHeader*)&gDragonflyFlyAnim, + jointTable, morphTable, DRAGONFLY_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawGuay() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[OBJECT_CROW_LIMB_MAX]; + static Vec3s morphTable[OBJECT_CROW_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, 0, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gGuaySkel, (AnimationHeader*)&gGuayFlyAnim, + jointTable, morphTable, OBJECT_CROW_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); +} + +extern void DrawIronKnuckle() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[IRON_KNUCKLE_LIMB_MAX]; + static Vec3s morphTable[IRON_KNUCKLE_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gIronKnuckleSkel, + (AnimationHeader*)&gIronKnuckleWalkAnim, jointTable, morphTable, IRON_KNUCKLE_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + Gfx* gfx = POLY_XLU_DISP; + gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); + POLY_XLU_DISP = &gfx[1]; + gfx = POLY_OPA_DISP; + gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); + gSPSegment(&gfx[1], 0x08, (uintptr_t)gIronKnuckleBlackArmorMaterialDL); + gSPSegment(&gfx[2], 0x09, (uintptr_t)gIronKnuckleBrownArmorMaterialDL); + gSPSegment(&gfx[3], 0x0A, (uintptr_t)gIronKnuckleBrownArmorMaterialDL); + POLY_OPA_DISP = &gfx[4]; + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 12.0f, 12.0f, 12.0f }); +} + +extern void DrawKeese() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[FIRE_KEESE_LIMB_MAX]; + static Vec3s morphTable[FIRE_KEESE_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gFireKeeseSkel, (AnimationHeader*)&gFireKeeseFlyAnim, + jointTable, morphTable, FIRE_KEESE_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, DrawEnFirefly_PostLimbDraw, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawLeever() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[LEEVER_LIMB_MAX]; + static Vec3s morphTable[LEEVER_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gLeeverSkel, (AnimationHeader*)&gLeeverSpinAnim, + jointTable, morphTable, LEEVER_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x01, 255, 255, 255, 255); + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 3.0f, 3.0f, 3.0f }); +} + +extern void DrawMadScrub() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[DEKU_SCRUB_LIMB_MAX]; + static Vec3s morphTable[DEKU_SCRUB_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2300, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gDekuScrubSkel, + (AnimationHeader*)&gDekuScrubLookAroundAnim, jointTable, morphTable, DEKU_SCRUB_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawOctorok() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[16]; + static Vec3s morphTable[16]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gOctorokSkel, (AnimationHeader*)&gOctorokFloatAnim, + jointTable, morphTable, 16); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + Gfx* gfxPtr = POLY_OPA_DISP; + gSPDisplayList(&gfxPtr[0], gSetupDLs[SETUPDL_25]); + gSPSegment(&gfxPtr[1], 0x08, (uintptr_t)D_801AEFA0); + POLY_OPA_DISP = &gfxPtr[2]; + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x01, 255, 255, 255, 255); + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawPeahat() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[24]; + static Vec3s morphTable[24]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_ph_Skel_001C80, + (AnimationHeader*)&object_ph_Anim_0009C4, jointTable, morphTable, 24); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawRedead() { static bool initialized = false; static SkelAnime skelAnime; - static Vec3s jointTable[ALIEN_LIMB_MAX]; - static Vec3s morphTable[ALIEN_LIMB_MAX]; + static Vec3s jointTable[REDEAD_LIMB_MAX]; + static Vec3s morphTable[REDEAD_LIMB_MAX]; static u32 lastUpdate = 0; + static u32 animUpdate = 0; + static uint32_t rdAnimID = 0; + static AnimationHeader* currentAnim = (AnimationHeader*)gGibdoRedeadIdleAnim; + + std::vector rdAnims = { + (AnimationHeader*)gGibdoRedeadSquattingDanceAnim, + (AnimationHeader*)gGibdoRedeadClappingDanceAnim, + (AnimationHeader*)gGibdoRedeadPirouetteAnim, + }; OPEN_DISPS(gPlayState->state.gfxCtx); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gRedeadSkel, + (AnimationHeader*)gGibdoRedeadPirouetteAnim, jointTable, morphTable, REDEAD_LIMB_MAX); + } + + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + Player* player = GET_PLAYER(gPlayState); + if (player->currentMask == PLAYER_MASK_GIBDO) { + if (animUpdate != gPlayState->state.frames) { + if (animUpdate <= gPlayState->state.frames - 35) { + animUpdate = gPlayState->state.frames; + currentAnim = rdAnims[rdAnimID]; + if (rdAnimID >= rdAnims.size() - 1) { + rdAnimID = 0; + } else { + rdAnimID++; + } + Animation_MorphToLoop(&skelAnime, currentAnim, -6.0f); + } + } + } else { + currentAnim = (AnimationHeader*)gGibdoRedeadIdleAnim; + Animation_MorphToLoop(&skelAnime, currentAnim, -6.0f); + } + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)D_801AEFA0); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawShellBlade() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[9]; + static Vec3s morphTable[9]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&object_sb_Skel_002BF0, + (AnimationHeader*)&object_sb_Anim_000194, jointTable, morphTable, 9); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawSkullfish() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[5]; + static Vec3s morphTable[5]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); Matrix_Translate(0, 0, 0, MTXMODE_APPLY); if (!initialized) { initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gAlienSkel, (AnimationHeader*)&gAlienFloatAnim, - jointTable, morphTable, ALIEN_LIMB_MAX); + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&object_pr_Skel_004188, + (AnimationHeader*)&object_pr_Anim_004340, jointTable, morphTable, 5); } if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { lastUpdate = gPlayState->state.frames; SkelAnime_Update(&skelAnime); } + Scene_SetRenderModeXlu(gPlayState, 0, 1); - AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gAlienEmptyTexAnim)); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); - DrawEnLight({ 10, 138, 46 }, { 30.0f, 30.0f, 30.0f }); + DrawEnLight({ 155, 155, 155 }, { 5.0f, 5.0f, 5.0f }); +} + +extern void DrawSkulltula() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[30]; + static Vec3s morphTable[30]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); + Matrix_Translate(0, 0, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_st_Skel_005298, + (AnimationHeader*)&object_st_Anim_000304, jointTable, morphTable, 30); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 5.0f, 5.0f, 5.0f }); +} + +extern void DrawSlime() { + static int16_t timer = 25; + f32 timerFactor = sqrtf(timer) * 0.2f; + AnimatedMaterial* sSlimeTexAnim = (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gChuchuSlimeFlowTexAnim); + + OPEN_DISPS(gPlayState->state.gfxCtx); + Matrix_Scale( + 0.01f, + ((((coss(RAD_TO_BINANG(timer * (2.0f * M_PI / 5.0f))) * SHT_MINV) * (0.07f * timerFactor)) + 1.0f) * 0.01f), + 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2700.0f, 0, MTXMODE_APPLY); + + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + AnimatedMat_Draw(gPlayState, sSlimeTexAnim); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 100, 255, 255, 200, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 180, 0, 255); + + if (timer == 0) { + timer = 25; + } + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + Scene_SetRenderModeXlu(gPlayState, 1, 2); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gChuchuBodyDL); + gSPSegment(POLY_XLU_DISP++, 9, (uintptr_t)gChuchuEyeOpenTex); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gChuchuEyesDL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); + timer--; +} + +extern void DrawSnapper() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[SNAPPER_LIMB_MAX]; + static Vec3s morphTable[SNAPPER_LIMB_MAX]; + static u32 lastUpdate = 0; + TexturePtr eyeTexture = Lib_SegmentedToVirtual((TexturePtr)gSnapperEyeOpenTex); + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3100.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gSnapperSkel, + (AnimationHeader*)&gSnapperIdleAnim, jointTable, morphTable, SNAPPER_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)eyeTexture); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawStalchild() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[STALCHILD_LIMB_MAX]; + static Vec3s morphTable[STALCHILD_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3200, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gStalchildSkel, + (AnimationHeader*)&gStalchildSaluteAnim, jointTable, morphTable, STALCHILD_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawTektite() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[25]; + static Vec3s morphTable[25]; + static u32 lastUpdate = 0; + + static TexturePtr D_80896B24[2][3] = { + { (TexturePtr*)&object_tite_Tex_001300, (TexturePtr*)&object_tite_Tex_001700, + (TexturePtr*)&object_tite_Tex_001900 }, + { (TexturePtr*)&object_tite_Tex_001B00, (TexturePtr*)&object_tite_Tex_001F00, + (TexturePtr*)&object_tite_Tex_002100 }, + }; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_tite_Skel_003A20, + (AnimationHeader*)&object_tite_Anim_0012E4, jointTable, morphTable, 25); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + Gfx* gfx = POLY_OPA_DISP; + + gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); + + gSPSegment(&gfx[1], 0x08, (uintptr_t)D_80896B24[0][0]); + gSPSegment(&gfx[2], 0x09, (uintptr_t)D_80896B24[0][1]); + gSPSegment(&gfx[3], 0x0A, (uintptr_t)D_80896B24[0][2]); + + POLY_OPA_DISP = &gfx[4]; + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawWallmaster() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[WALLMASTER_LIMB_MAX]; + static Vec3s morphTable[WALLMASTER_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gWallmasterSkel, + (AnimationHeader*)&gWallmasterIdleAnim, jointTable, morphTable, WALLMASTER_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawWolfos() { + static bool initialized = false; + static SkelAnime skelAnime; + static Vec3s jointTable[WOLFOS_NORMAL_LIMB_MAX]; + static Vec3s morphTable[WOLFOS_NORMAL_LIMB_MAX]; + static u32 lastUpdate = 0; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gWolfosNormalSkel, + (AnimationHeader*)&gWolfosWaitAnim, jointTable, morphTable, WOLFOS_NORMAL_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)&gWolfosNormalEyeOpenTex); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } // Boss Souls @@ -228,6 +1186,7 @@ extern void DrawMajora() { Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); Matrix_Translate(0, 0, 0, MTXMODE_APPLY); + Matrix_ReplaceRotation(&gPlayState->billboardMtxF); if (!initialized) { initialized = true; diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index 5c45c843b2..a5245919cd 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -11,7 +11,35 @@ void DrawOdolwa(); void DrawTwinmold(); // Enemy Functions -void DrawAlien(); +void DrawArmos(); +void DrawBat(); +void DrawBeamos(); +void DrawBoe(); +void DrawRealBombchu(); +void DrawDeathArmos(); +void DrawDekuBaba(); +void DrawDinolfos(); +void DrawDodongo(); +void DrawEeno(); +void DrawGaroMaster(); +void DrawGrasshopper(); +void DrawGuay(); +void DrawIronKnuckle(); +void DrawKeese(); +void DrawLeever(); +void DrawMadScrub(); +void DrawOctorok(); +void DrawPeahat(); +void DrawRedead(); +void DrawShellBlade(); +void DrawSkullfish(); +void DrawSkulltula(); +void DrawSlime(); +void DrawSnapper(); +void DrawStalchild(); +void DrawTektite(); +void DrawWallmaster(); +void DrawWolfos(); // Other Actor Functions void DrawMinifrog(RandoItemId randoItemId, Actor* actor); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index 3389648efc..873fb5e28d 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -2,6 +2,7 @@ #include "2s2h/Enhancements/FrameInterpolation/FrameInterpolation.h" #include "2s2h/ShipInit.hpp" #include "2s2h/Rando/DrawFuncs.h" +#include "ActorBehavior/Souls.h" extern "C" { #include "variables.h" @@ -296,6 +297,13 @@ void DrawSkulltulaToken(RandoItemId randoItemId, Actor* actor) { CLOSE_DISPS(gPlayState->state.gfxCtx); } +void DrawSoul(RandoItemId randoItemId) { + auto it = soulMap.find(randoItemId); + if (it != soulMap.end()) { + std::get<0>(it->second)(); + } +} + void DrawSparkles(RandoItemId randoItemId, Actor* actor) { if (actor == NULL) { return; @@ -400,8 +408,36 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_PROGRESSIVE_WALLET: Rando::DrawItem(Rando::ConvertItem(randoItemId), actor); break; - case RI_SOUL_ALIEN: - DrawAlien(); + case RI_SOUL_ARMOS: + case RI_SOUL_BAT: + case RI_SOUL_BEAMOS: + case RI_SOUL_BOE: + case RI_SOUL_BOMBCHU: + case RI_SOUL_DEATH_ARMOS: + case RI_SOUL_DEKU_BABA: + case RI_SOUL_DINOLFOS: + case RI_SOUL_DODONGO: + case RI_SOUL_EENO: + case RI_SOUL_GARO: + case RI_SOUL_GRASSHOPPER: + case RI_SOUL_GUAY: + case RI_SOUL_IRON_KNUCKLE: + case RI_SOUL_KEESE: + case RI_SOUL_LEEVER: + case RI_SOUL_MAD_SCRUB: + case RI_SOUL_OCTOROK: + case RI_SOUL_PEAHAT: + case RI_SOUL_REDEAD: + case RI_SOUL_SHELLBLADE: + case RI_SOUL_SKULLFISH: + case RI_SOUL_SKULLTULA: + case RI_SOUL_SLIME: + case RI_SOUL_SNAPPER: + case RI_SOUL_STALCHILD: + case RI_SOUL_TEKTITE: + case RI_SOUL_WALLMASTER: + case RI_SOUL_WOLFOS: + DrawSoul(randoItemId); break; case RI_SOUL_GOHT: DrawGoht(); diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 6a43889e42..45e06fae6c 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -255,10 +255,38 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_MAJORA: case RI_SOUL_ODOLWA: case RI_SOUL_TWINMOLD: - Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT + (randoItemId - RI_SOUL_GOHT)); - break; - case RI_SOUL_ALIEN: - Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ALIENS); + // Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT + (randoItemId - RI_SOUL_GOHT)); + // break; + case RI_SOUL_ARMOS: + case RI_SOUL_BAT: + case RI_SOUL_BEAMOS: + case RI_SOUL_BOE: + case RI_SOUL_BOMBCHU: + case RI_SOUL_DEATH_ARMOS: + case RI_SOUL_DEKU_BABA: + case RI_SOUL_DINOLFOS: + case RI_SOUL_DODONGO: + case RI_SOUL_EENO: + case RI_SOUL_GARO: + case RI_SOUL_GRASSHOPPER: + case RI_SOUL_GUAY: + case RI_SOUL_IRON_KNUCKLE: + case RI_SOUL_KEESE: + case RI_SOUL_LEEVER: + case RI_SOUL_MAD_SCRUB: + case RI_SOUL_OCTOROK: + case RI_SOUL_PEAHAT: + case RI_SOUL_REDEAD: + case RI_SOUL_SHELLBLADE: + case RI_SOUL_SKULLFISH: + case RI_SOUL_SKULLTULA: + case RI_SOUL_SLIME: + case RI_SOUL_SNAPPER: + case RI_SOUL_STALCHILD: + case RI_SOUL_TEKTITE: + case RI_SOUL_WALLMASTER: + case RI_SOUL_WOLFOS: + Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ARMOS + (randoItemId - RI_SOUL_ARMOS)); break; case RI_FROG_BLUE: SET_WEEKEVENTREG(WEEKEVENTREG_33_01); diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 7b327b1af5..89ecfb831e 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -166,12 +166,40 @@ std::map Items = { RI(RI_SONG_STORMS, "the", "Song of Storms", RITYPE_MAJOR, ITEM_SONG_STORMS, GI_NONE, GID_NONE), RI(RI_SONG_SUN, "the", "Sun's Song", RITYPE_MAJOR, ITEM_SONG_SUN, GI_NONE, GID_NONE), RI(RI_SONG_TIME, "the", "Song of Time", RITYPE_MAJOR, ITEM_SONG_TIME, GI_NONE, GID_NONE), - RI(RI_SOUL_ALIEN, "the", "Soul of Aliens", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GYORG, "the", "Soul of Gyorg", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_MAJORA, "the", "Soul of Majora", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_ODOLWA, "the", "Soul of Odolwa", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_TWINMOLD, "the", "Soul of Twinmold", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ARMOS, "the", "Soul of Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BAT, "the", "Soul of Bats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BEAMOS, "the", "Soul of Beamos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BOE, "the", "Soul of Boes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BOMBCHU, "the", "Soul of Bombchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_DEATH_ARMOS, "the", "Soul of Death Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_DEKU_BABA, "the", "Soul of Deku Babas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_DINOLFOS, "the", "Soul of Dinolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_DODONGO, "the", "Soul of Dodongos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_EENO, "the", "Soul of Eenos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_GARO, "the", "Soul of Garos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_GRASSHOPPER, "the", "Soul of Grasshoppers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_GYORG, "the", "Soul of Gyorg", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_IRON_KNUCKLE, "the", "Soul of Iron Knuckles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_KEESE, "the", "Soul of Keese", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_LEEVER, "the", "Soul of Leevers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_MAD_SCRUB, "the", "Soul of Mad Scrubs", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_MAJORA, "the", "Soul of Majora", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_OCTOROK, "the", "Soul of Octoroks", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ODOLWA, "the", "Soul of Odolwa", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_PEAHAT, "the", "Soul of Peahats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_REDEAD, "the", "Soul of Redeads", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_SHELLBLADE, "the", "Soul of Shellblades", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_SKULLFISH, "the", "Soul of Skullfish", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_SKULLTULA, "the", "Soul of Skulltulas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_SLIME, "the", "Soul of Slimes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_SNAPPER, "the", "Soul of Snappers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_STALCHILD, "the", "Soul of Stalchildren", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_TEKTITE, "the", "Soul of Tektites", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_TWINMOLD, "the", "Soul of Twinmold", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_WALLMASTER, "the", "Soul of Wallmasters", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_WOLFOS, "the", "Soul of Wolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_STONE_TOWER_BOSS_KEY, "the", "Stone Tower Boss Key", RITYPE_BOSS_KEY, ITEM_KEY_BOSS, GI_KEY_BOSS, GID_KEY_BOSS), RI(RI_STONE_TOWER_COMPASS, "the", "Stone Tower Compass", RITYPE_LESSER, ITEM_COMPASS, GI_COMPASS, GID_COMPASS), RI(RI_STONE_TOWER_MAP, "the", "Stone Tower Map", RITYPE_LESSER, ITEM_DUNGEON_MAP, GI_MAP, GID_DUNGEON_MAP), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index df88ac6627..3d4e245c80 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2397,12 +2397,40 @@ typedef enum { RI_SONG_STORMS, RI_SONG_SUN, RI_SONG_TIME, - RI_SOUL_ALIEN, + RI_SOUL_ARMOS, + RI_SOUL_BAT, + RI_SOUL_BEAMOS, + RI_SOUL_BOE, + RI_SOUL_BOMBCHU, + RI_SOUL_DEATH_ARMOS, + RI_SOUL_DEKU_BABA, + RI_SOUL_DINOLFOS, + RI_SOUL_DODONGO, + RI_SOUL_EENO, + RI_SOUL_GARO, + RI_SOUL_GRASSHOPPER, RI_SOUL_GOHT, + RI_SOUL_GUAY, RI_SOUL_GYORG, + RI_SOUL_IRON_KNUCKLE, + RI_SOUL_KEESE, + RI_SOUL_LEEVER, + RI_SOUL_MAD_SCRUB, RI_SOUL_MAJORA, + RI_SOUL_OCTOROK, RI_SOUL_ODOLWA, + RI_SOUL_PEAHAT, + RI_SOUL_REDEAD, + RI_SOUL_SHELLBLADE, + RI_SOUL_SKULLFISH, + RI_SOUL_SKULLTULA, + RI_SOUL_SLIME, + RI_SOUL_SNAPPER, + RI_SOUL_STALCHILD, + RI_SOUL_TEKTITE, RI_SOUL_TWINMOLD, + RI_SOUL_WALLMASTER, + RI_SOUL_WOLFOS, RI_STONE_TOWER_BOSS_KEY, RI_STONE_TOWER_COMPASS, RI_STONE_TOWER_MAP, @@ -2814,12 +2842,41 @@ typedef enum { RANDO_INF_OBTAINED_LETTER_TO_MAMA, RANDO_INF_OBTAINED_LETTER_TO_KAFEI, RANDO_INF_OBTAINED_PENDANT_OF_MEMORIES, - RANDO_INF_OBTAINED_SOUL_OF_ALIENS, + RANDO_INF_OBTAINED_SOUL_OF_ARMOS, + RANDO_INF_OBTAINED_SOUL_OF_BATS, + RANDO_INF_OBTAINED_SOUL_OF_BEAMOS, + RANDO_INF_OBTAINED_SOUL_OF_BOES, + RANDO_INF_OBTAINED_SOUL_OF_BOMBCHU, + RANDO_INF_OBTAINED_SOUL_OF_DEATH_ARMOS, + RANDO_INF_OBTAINED_SOUL_OF_DEKU_BABAS, + RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS, + RANDO_INF_OBTAINED_SOUL_OF_DODONGOS, + RANDO_INF_OBTAINED_SOUL_OF_EENOS, + RANDO_INF_OBTAINED_SOUL_OF_GARO_MASTERS, + RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS, RANDO_INF_OBTAINED_SOUL_OF_GOHT, + RANDO_INF_OBTAINED_SOUL_OF_GUAYS, RANDO_INF_OBTAINED_SOUL_OF_GYORG, + RANDO_INF_OBTAINED_SOUL_OF_IRON_KNUCKLES, + RANDO_INF_OBTAINED_SOUL_OF_KEESE, + RANDO_INF_OBTAINED_SOUL_OF_LEEVERS, + RANDO_INF_OBTAINED_SOUL_OF_MAD_SCRUBS, RANDO_INF_OBTAINED_SOUL_OF_MAJORA, + RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA, + RANDO_INF_OBTAINED_SOUL_OF_PEAHATS, + RANDO_INF_OBTAINED_SOUL_OF_REDEADS, + RANDO_INF_OBTAINED_SOUL_OF_SHELLBLADES, + RANDO_INF_OBTAINED_SOUL_OF_SKULLFISH, + RANDO_INF_OBTAINED_SOUL_OF_SKULLTULAS, + RANDO_INF_OBTAINED_SOUL_OF_SLIMES, + RANDO_INF_OBTAINED_SOUL_OF_SNAPPERS, + RANDO_INF_OBTAINED_SOUL_OF_STALCHILDREN, + RANDO_INF_OBTAINED_SOUL_OF_TEKTITES, RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD, + RANDO_INF_OBTAINED_SOUL_OF_WALLMASTERS, + RANDO_INF_OBTAINED_SOUL_OF_WOLFOS, + RANDO_INF_MAX, } RandoInf; From b9e3f4d8def466bb3dc5410700a43b72a2c00973 Mon Sep 17 00:00:00 2001 From: Caladius Date: Thu, 2 Oct 2025 14:48:38 -0400 Subject: [PATCH 03/34] Change Stalchild Animation to Idle --- mm/2s2h/Rando/DrawFuncs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index 8f1c193573..e16d932e70 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -944,8 +944,8 @@ extern void DrawStalchild() { if (!initialized) { initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gStalchildSkel, - (AnimationHeader*)&gStalchildSaluteAnim, jointTable, morphTable, STALCHILD_LIMB_MAX); + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gStalchildSkel, (AnimationHeader*)&gStalchildIdleAnim, + jointTable, morphTable, STALCHILD_LIMB_MAX); } if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { lastUpdate = gPlayState->state.frames; From 0b8ab3643ce233196d9b624cbb328a2b254f2aa1 Mon Sep 17 00:00:00 2001 From: Caladius Date: Thu, 2 Oct 2025 15:09:18 -0400 Subject: [PATCH 04/34] Fix Stalchild Eyes --- mm/2s2h/Rando/DrawFuncs.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index e16d932e70..6b34ab6900 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -152,6 +152,21 @@ void DrawEnRealBombchu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, } } +s32 DrawEnSkb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { + s16 sins; + if (limbIndex == 11) { + OPEN_DISPS(play->state.gfxCtx); + + sins = fabsf(Math_SinS(play->gameplayFrames * 6000) * 95.0f) + 160.0f; + + gDPPipeSync(POLY_OPA_DISP++); + gDPSetEnvColor(POLY_OPA_DISP++, sins, sins, sins, 255); + + CLOSE_DISPS(play->state.gfxCtx); + } + return false; +} + // Enemy Soul Draw Functions extern void DrawArmos() { static bool initialized = false; @@ -952,7 +967,7 @@ extern void DrawStalchild() { SkelAnime_Update(&skelAnime); } - SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, DrawEnSkb_OverrideLimbDraw, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); From 09c73bcdd79fccb6f724c7aa26a93629c566742b Mon Sep 17 00:00:00 2001 From: Caladius Date: Mon, 6 Oct 2025 13:39:23 -0400 Subject: [PATCH 05/34] Adds Hiploop to keep in line with Enemy Drops --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 1 + mm/2s2h/Rando/DrawFuncs.cpp | 30 +++++++++++++++++++++++++++ mm/2s2h/Rando/DrawFuncs.h | 1 + mm/2s2h/Rando/DrawItem.cpp | 1 + mm/2s2h/Rando/GiveItem.cpp | 1 + mm/2s2h/Rando/StaticData/Items.cpp | 1 + mm/2s2h/Rando/Types.h | 2 ++ 7 files changed, 37 insertions(+) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index bda4a61d76..208f38c464 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -27,6 +27,7 @@ std::unordered_map, std::vectorstate.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, -1400.0f, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gHiploopSkel, + (AnimationHeader*)&gHiploopChargeAnim, jointTable, morphTable, HIPLOOP_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + Scene_SetRenderModeXlu(gPlayState, 0, 1); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + extern void DrawIronKnuckle() { static bool initialized = false; static SkelAnime skelAnime; diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index a5245919cd..0c3b29f2fb 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -24,6 +24,7 @@ void DrawEeno(); void DrawGaroMaster(); void DrawGrasshopper(); void DrawGuay(); +void DrawHiploop(); void DrawIronKnuckle(); void DrawKeese(); void DrawLeever(); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index 873fb5e28d..a0a3102f8e 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -421,6 +421,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_GARO: case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: + case RI_SOUL_HIPLOOP: case RI_SOUL_IRON_KNUCKLE: case RI_SOUL_KEESE: case RI_SOUL_LEEVER: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 45e06fae6c..a30bcce168 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -270,6 +270,7 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_GARO: case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: + case RI_SOUL_HIPLOOP: case RI_SOUL_IRON_KNUCKLE: case RI_SOUL_KEESE: case RI_SOUL_LEEVER: diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 89ecfb831e..a7486d2e9f 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -180,6 +180,7 @@ std::map Items = { RI(RI_SOUL_GRASSHOPPER, "the", "Soul of Grasshoppers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_HIPLOOP, "the", "Soul of Hiploops", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GYORG, "the", "Soul of Gyorg", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_IRON_KNUCKLE, "the", "Soul of Iron Knuckles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_KEESE, "the", "Soul of Keese", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 3d4e245c80..29b75e02c9 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2411,6 +2411,7 @@ typedef enum { RI_SOUL_GRASSHOPPER, RI_SOUL_GOHT, RI_SOUL_GUAY, + RI_SOUL_HIPLOOP, RI_SOUL_GYORG, RI_SOUL_IRON_KNUCKLE, RI_SOUL_KEESE, @@ -2856,6 +2857,7 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS, RANDO_INF_OBTAINED_SOUL_OF_GOHT, RANDO_INF_OBTAINED_SOUL_OF_GUAYS, + RANDO_INF_OBTAINED_SOUL_OF_HIPLOOPS, RANDO_INF_OBTAINED_SOUL_OF_GYORG, RANDO_INF_OBTAINED_SOUL_OF_IRON_KNUCKLES, RANDO_INF_OBTAINED_SOUL_OF_KEESE, From 06d273a2e0eb2a556dfce85a2c9d687e9581e020 Mon Sep 17 00:00:00 2001 From: Caladius Date: Thu, 16 Oct 2025 10:35:29 -0400 Subject: [PATCH 06/34] correction --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 330995cffa..4e83821b99 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -169,7 +169,7 @@ void Rando::ActorBehavior::InitSoulsBehavior() { * be used, while the Twinmold actor itself handles the transformation. Boss Souls prevent Twinmold from updating * unless its soul has been obtained, which results in a softlock. In this case, disable the item. */ - COND_VB_SHOULD(VB_ITEM_BE_RESTRICTED, shouldRegister, { + COND_VB_SHOULD(VB_ITEM_BE_RESTRICTED, shouldBossRegister, { ItemId itemId = *va_arg(args, ItemId*); if (itemId == ITEM_MASK_GIANT && gPlayState->sceneId == SCENE_INISIE_BS && !Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD)) { From 9f54ab8845e30f0687e337727844f585092ca22b Mon Sep 17 00:00:00 2001 From: Caladius Date: Mon, 20 Oct 2025 16:10:01 -0400 Subject: [PATCH 07/34] Update Matrix Calls --- mm/2s2h/Rando/DrawFuncs.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index f753850a3e..deaa426150 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -127,7 +127,7 @@ void DrawEnFirefly_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec if (limbIndex == FIRE_KEESE_LIMB_HEAD) { Gfx* gfx = play->state.gfxCtx->polyXlu.p; Scene_SetRenderModeXlu(play, 1, 2); - gSPMatrix(gfx++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + MATRIX_FINALIZE_AND_LOAD(gfx++, play->state.gfxCtx); gSPDisplayList(gfx++, (Gfx*)&gKeeseRedEyesDL); } if (limbIndex == FIRE_KEESE_LIMB_LEFT_WING_END || limbIndex == FIRE_KEESE_LIMB_RIGHT_WING_END_ROOT) { @@ -142,12 +142,12 @@ void DrawEnRealBombchu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, if (limbIndex == REAL_BOMBCHU_LIMB_TAIL_END) { OPEN_DISPS(play->state.gfxCtx); Matrix_ReplaceRotation(&play->billboardMtxF); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + MATRIX_FINALIZE_AND_LOAD(POLY_OPA_DISP++, play->state.gfxCtx); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)&gBombCapDL); Matrix_RotateZYX(0x4000, 0, 0, MTXMODE_APPLY); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 80, 255); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 10, 0, 40, 255); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + MATRIX_FINALIZE_AND_LOAD(POLY_OPA_DISP++, play->state.gfxCtx); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)&gBombBodyDL); CLOSE_DISPS(play->state.gfxCtx); } @@ -222,7 +222,7 @@ extern void DrawBat() { } gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); - gSPMatrix(&gfx[1], Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + MATRIX_FINALIZE_AND_LOAD(&gfx[1], gPlayState->state.gfxCtx); gSPDisplayList(&gfx[2], (Gfx*)&gBadBatSetupDL); gSPDisplayList(&gfx[3], (Gfx*)&gBadBatBodyDL); gSPDisplayList(&gfx[4], sWingsDLs[wingAnim]); @@ -278,19 +278,19 @@ extern void DrawBoe() { gSPDisplayList(POLY_OPA_DISP++, gSetupDLs[SETUPDL_25]); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0xFF, 0, 0, 0, 255); gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)D_801AEFA0); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + MATRIX_FINALIZE_AND_LOAD(POLY_OPA_DISP++, gPlayState->state.gfxCtx); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gBlackBoeEndDL); gSPDisplayList(POLY_XLU_DISP++, gSetupDLs[SETUPDL_25]); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 255); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBlackBoeBodyMaterialDL); Matrix_ReplaceRotation(&gPlayState->billboardMtxF); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + MATRIX_FINALIZE_AND_LOAD(POLY_XLU_DISP++, gPlayState->state.gfxCtx); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBlackBoeBodyModelDL); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 245, 97, 0, 255); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBlackBoeEyesDL); Matrix_Scale(0.009f, 0.009f, 0.009f, MTXMODE_APPLY); - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + MATRIX_FINALIZE_AND_LOAD(POLY_XLU_DISP++, gPlayState->state.gfxCtx); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 245, 214, 0, 255); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gBlackBoeEyesDL); @@ -934,7 +934,7 @@ extern void DrawSlime() { timer = 25; } - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + MATRIX_FINALIZE_AND_LOAD(POLY_XLU_DISP++, gPlayState->state.gfxCtx); Scene_SetRenderModeXlu(gPlayState, 1, 2); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gChuchuBodyDL); gSPSegment(POLY_XLU_DISP++, 9, (uintptr_t)gChuchuEyeOpenTex); From ddd14a57a8af099c0336a9084879f3b2ade798f4 Mon Sep 17 00:00:00 2001 From: Caladius Date: Mon, 20 Oct 2025 16:17:45 -0400 Subject: [PATCH 08/34] Remove comment --- mm/2s2h/Rando/GiveItem.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 08bba09ee2..08f112bad0 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -271,8 +271,6 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_MAJORA: case RI_SOUL_ODOLWA: case RI_SOUL_TWINMOLD: - // Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT + (randoItemId - RI_SOUL_GOHT)); - // break; case RI_SOUL_ARMOS: case RI_SOUL_BAT: case RI_SOUL_BEAMOS: From 69bad50b73045358b9c850475ac26179d5d9da78 Mon Sep 17 00:00:00 2001 From: Caladius Date: Tue, 21 Oct 2025 18:14:10 -0400 Subject: [PATCH 09/34] Remove Garo for now --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 1 - mm/2s2h/Rando/DrawFuncs.cpp | 30 --------------------------- mm/2s2h/Rando/DrawItem.cpp | 1 - mm/2s2h/Rando/GiveItem.cpp | 1 - mm/2s2h/Rando/Menu.cpp | 10 +++++++-- mm/2s2h/Rando/StaticData/Items.cpp | 1 - mm/2s2h/Rando/Types.h | 2 -- 7 files changed, 8 insertions(+), 38 deletions(-) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 4e83821b99..f861cc2463 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -24,7 +24,6 @@ std::unordered_map, std::vectorstate.gfxCtx); - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); - Matrix_Translate(0, -50.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gGaroMasterSkel, - (AnimationHeader*)&gGaroLookAroundAnim, jointTable, morphTable, GARO_MASTER_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } - Scene_SetRenderModeXlu(gPlayState, 0, 1); - SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); - - CLOSE_DISPS(gPlayState->state.gfxCtx); - DrawEnLight({ 155, 155, 155 }, { 4.0f, 4.0f, 4.0f }); -} - extern void DrawGrasshopper() { static bool initialized = false; static SkelAnime skelAnime; diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index 385d36555d..27ababad78 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -463,7 +463,6 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: case RI_SOUL_EENO: - case RI_SOUL_GARO: case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 08f112bad0..e049760b3a 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -281,7 +281,6 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: case RI_SOUL_EENO: - case RI_SOUL_GARO: case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: diff --git a/mm/2s2h/Rando/Menu.cpp b/mm/2s2h/Rando/Menu.cpp index 356e07f06d..5091a5bf2b 100644 --- a/mm/2s2h/Rando/Menu.cpp +++ b/mm/2s2h/Rando/Menu.cpp @@ -31,11 +31,13 @@ std::unordered_map accessTrialsOptions = { std::vector incompatibleWithFrenchVanilla = { RO_SHUFFLE_BOSS_SOULS, + RO_SHUFFLE_ENEMY_SOULS, RO_PLENTIFUL_ITEMS, }; std::vector incompatibleWithVanilla = { RO_SHUFFLE_BOSS_SOULS, + RO_SHUFFLE_ENEMY_SOULS, RO_PLENTIFUL_ITEMS, }; @@ -323,8 +325,12 @@ static void DrawItemsTab() { "that must be found in order for their corresponding boss to spawn.", .disabled = IncompatibleWithLogicSetting(RO_SHUFFLE_BOSS_SOULS), .disabledTooltip = "Incompatible with current Logic Setting" } })); - CVarCheckbox("Enemy Souls", Rando::StaticData::Options[RO_SHUFFLE_ENEMY_SOULS].cvar, - CheckboxOptions({ { .disabled = false, .disabledTooltip = "Coming Soon" } })); + CVarCheckbox( + "Enemy Souls", Rando::StaticData::Options[RO_SHUFFLE_ENEMY_SOULS].cvar, + CheckboxOptions({ { .tooltip = "Adds the \"souls\" of regular enemies to the item pool. Enemy Souls are items " + "that must be found in order for their corresponding enemy to spawn.", + .disabled = IncompatibleWithLogicSetting(RO_SHUFFLE_ENEMY_SOULS), + .disabledTooltip = "Incompatible with current Logic Setting" } })); ImGui::EndChild(); ImGui::SameLine(); ImGui::BeginChild("randoItemsColumn3", ImVec2(columnWidth, ImGui::GetContentRegionAvail().y)); diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 42ce23d5d0..7d75a80f40 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -178,7 +178,6 @@ std::map Items = { RI(RI_SOUL_DINOLFOS, "the", "Soul of Dinolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DODONGO, "the", "Soul of Dodongos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_EENO, "the", "Soul of Eenos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GARO, "the", "Soul of Garos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GRASSHOPPER, "the", "Soul of Grasshoppers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 3a7e46da02..5ae933438f 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2408,7 +2408,6 @@ typedef enum { RI_SOUL_DINOLFOS, RI_SOUL_DODONGO, RI_SOUL_EENO, - RI_SOUL_GARO, RI_SOUL_GRASSHOPPER, RI_SOUL_GOHT, RI_SOUL_GUAY, @@ -2862,7 +2861,6 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS, RANDO_INF_OBTAINED_SOUL_OF_DODONGOS, RANDO_INF_OBTAINED_SOUL_OF_EENOS, - RANDO_INF_OBTAINED_SOUL_OF_GARO_MASTERS, RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS, RANDO_INF_OBTAINED_SOUL_OF_GOHT, RANDO_INF_OBTAINED_SOUL_OF_GUAYS, From e7bccef3baeb0fec5a5fe513b4ceb31d2d6a0fb8 Mon Sep 17 00:00:00 2001 From: Caladius Date: Tue, 21 Oct 2025 18:25:08 -0400 Subject: [PATCH 10/34] Add Octorok Soul req for Upper Canyon Access --- mm/2s2h/Rando/Logic/Regions/East.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/2s2h/Rando/Logic/Regions/East.cpp b/mm/2s2h/Rando/Logic/Regions/East.cpp index 465b0d0da6..a65336083b 100644 --- a/mm/2s2h/Rando/Logic/Regions/East.cpp +++ b/mm/2s2h/Rando/Logic/Regions/East.cpp @@ -150,7 +150,7 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 9), ONE_WAY_EXIT, CAN_USE_ABILITY(SWIM)), }, .connections = { - CONNECTION(RR_IKANA_CANYON_UPPER, HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_MAGIC_ARROW(ICE)), + CONNECTION(RR_IKANA_CANYON_UPPER, HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_MAGIC_ARROW(ICE) && Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS)), CONNECTION(RR_IKANA_CANYON_GROTTO, CAN_USE_ABILITY(SWIM)), // TODO: Grotto mapping }, .events = { From 2a8d018b830c27e187c8010c4b20e935c2438905 Mon Sep 17 00:00:00 2001 From: Caladius Date: Tue, 21 Oct 2025 18:39:12 -0400 Subject: [PATCH 11/34] Add soul requirement for Red Switch --- mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp b/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp index 685c3fad93..321045dbbd 100644 --- a/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp +++ b/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp @@ -280,7 +280,7 @@ static RegisterShipInitFunc initFunc([]() { CONNECTION(RR_GREAT_BAY_TEMPLE_BEFORE_WART, KEY_COUNT(GREAT_BAY_TEMPLE) >= 1), }, .events = { - EVENT(RE_GREAT_BAY_RED_SWITCH_1, CAN_USE_MAGIC_ARROW(ICE)), + EVENT(RE_GREAT_BAY_RED_SWITCH_1, CAN_USE_MAGIC_ARROW(ICE) && Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS)), } }; Regions[RR_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM] = RandoRegion{ .sceneId = SCENE_SEA, From 92cca48c39a4ece5b680722a4964f9992ee2d96c Mon Sep 17 00:00:00 2001 From: Caladius Date: Tue, 21 Oct 2025 18:46:39 -0400 Subject: [PATCH 12/34] Grant Soul INF when the option is off --- mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp index f264bf407a..c57ed81562 100644 --- a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp +++ b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp @@ -399,6 +399,13 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { GiveItem(ConvertItem(startingItem)); } + // Give INF for Enemy Soul if the option is OFF + if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_NO) { + for (int i = RANDO_INF_OBTAINED_SOUL_OF_ARMOS; i < RANDO_INF_OBTAINED_SOUL_OF_WOLFOS; i++) { + Flags_SetRandoInf(i); + } + } + if (RANDO_SAVE_OPTIONS[RO_STARTING_RUPEES]) { gSaveContext.save.saveInfo.playerData.rupees = CUR_CAPACITY(UPG_WALLET); } From 398a782d0569a23b397609526354474f8e6fb136 Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 22 Oct 2025 15:40:30 -0400 Subject: [PATCH 13/34] Adds Nejiron Soul --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 1 + mm/2s2h/Rando/DrawFuncs.cpp | 31 +++++++++++++++++++++++++++ mm/2s2h/Rando/DrawFuncs.h | 2 +- mm/2s2h/Rando/DrawItem.cpp | 1 + mm/2s2h/Rando/GiveItem.cpp | 1 + mm/2s2h/Rando/StaticData/Items.cpp | 1 + mm/2s2h/Rando/Types.h | 2 ++ 7 files changed, 38 insertions(+), 1 deletion(-) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index f861cc2463..85da24eb17 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -31,6 +31,7 @@ std::unordered_map, std::vectorstate.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Matrix_Scale(0.015f, 0.015f, 0.015f, MTXMODE_APPLY); + Matrix_Translate(0, 0, 0, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gNejironSkel, (AnimationHeader*)&gNejironIdleAnim, + jointTable, morphTable, NEJIRON_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + gSPSegment(POLY_OPA_DISP++, 8, (uintptr_t)gNejironEyeOpenTex); + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 13.0f, 13.0f, 13.0f }); +} + extern void DrawOctorok() { static bool initialized = false; static SkelAnime skelAnime; diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index 0c3b29f2fb..203ca66064 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -21,7 +21,6 @@ void DrawDekuBaba(); void DrawDinolfos(); void DrawDodongo(); void DrawEeno(); -void DrawGaroMaster(); void DrawGrasshopper(); void DrawGuay(); void DrawHiploop(); @@ -29,6 +28,7 @@ void DrawIronKnuckle(); void DrawKeese(); void DrawLeever(); void DrawMadScrub(); +void DrawNejiron(); void DrawOctorok(); void DrawPeahat(); void DrawRedead(); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index 27ababad78..be6d25c9ad 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -470,6 +470,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_KEESE: case RI_SOUL_LEEVER: case RI_SOUL_MAD_SCRUB: + case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: case RI_SOUL_PEAHAT: case RI_SOUL_REDEAD: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index e049760b3a..51636907c9 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -288,6 +288,7 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_KEESE: case RI_SOUL_LEEVER: case RI_SOUL_MAD_SCRUB: + case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: case RI_SOUL_PEAHAT: case RI_SOUL_REDEAD: diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 7d75a80f40..9f5ce148d7 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -188,6 +188,7 @@ std::map Items = { RI(RI_SOUL_LEEVER, "the", "Soul of Leevers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_MAD_SCRUB, "the", "Soul of Mad Scrubs", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_MAJORA, "the", "Soul of Majora", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_NEJIRON, "the", "Soul of Nejirons", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_OCTOROK, "the", "Soul of Octoroks", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_ODOLWA, "the", "Soul of Odolwa", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_PEAHAT, "the", "Soul of Peahats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 5ae933438f..c1eaf6c78b 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2418,6 +2418,7 @@ typedef enum { RI_SOUL_LEEVER, RI_SOUL_MAD_SCRUB, RI_SOUL_MAJORA, + RI_SOUL_NEJIRON, RI_SOUL_OCTOROK, RI_SOUL_ODOLWA, RI_SOUL_PEAHAT, @@ -2871,6 +2872,7 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_LEEVERS, RANDO_INF_OBTAINED_SOUL_OF_MAD_SCRUBS, RANDO_INF_OBTAINED_SOUL_OF_MAJORA, + RANDO_INF_OBTAINED_SOUL_OF_NEJIRONS, RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA, RANDO_INF_OBTAINED_SOUL_OF_PEAHATS, From d9a9b5ff1380ef1a8914aacba4ae73f2668519dc Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 22 Oct 2025 15:56:50 -0400 Subject: [PATCH 14/34] Add Flying Pot Soul --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 1 + mm/2s2h/Rando/DrawFuncs.cpp | 12 ++++++++++++ mm/2s2h/Rando/DrawFuncs.h | 1 + mm/2s2h/Rando/DrawItem.cpp | 1 + mm/2s2h/Rando/GiveItem.cpp | 1 + mm/2s2h/Rando/StaticData/Items.cpp | 1 + mm/2s2h/Rando/Types.h | 2 ++ 7 files changed, 19 insertions(+) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 85da24eb17..47b35905b6 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -24,6 +24,7 @@ std::unordered_map, std::vectorstate.gfxCtx); + Matrix_Scale(0.3f, 0.3f, 0.3f, MTXMODE_APPLY); + Matrix_Translate(0, -100.0f, 0, MTXMODE_APPLY); + + Gfx_DrawDListOpa(gPlayState, (Gfx*)gameplay_dangeon_keep_DL_017EA0); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 0.4f, 0.4f, 0.4f }); +} + extern void DrawGrasshopper() { static bool initialized = false; static SkelAnime skelAnime; diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index 203ca66064..28734e609f 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -21,6 +21,7 @@ void DrawDekuBaba(); void DrawDinolfos(); void DrawDodongo(); void DrawEeno(); +void DrawFlyingPot(); void DrawGrasshopper(); void DrawGuay(); void DrawHiploop(); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index be6d25c9ad..aafe90133d 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -463,6 +463,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: case RI_SOUL_EENO: + case RI_SOUL_FLYING_POT: case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 51636907c9..47f64a51a2 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -281,6 +281,7 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: case RI_SOUL_EENO: + case RI_SOUL_FLYING_POT: case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 9f5ce148d7..a300074cc8 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -178,6 +178,7 @@ std::map Items = { RI(RI_SOUL_DINOLFOS, "the", "Soul of Dinolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DODONGO, "the", "Soul of Dodongos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_EENO, "the", "Soul of Eenos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_FLYING_POT, "the", "Soul of Flying Pots", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GRASSHOPPER, "the", "Soul of Grasshoppers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index c1eaf6c78b..4946a1e89b 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2408,6 +2408,7 @@ typedef enum { RI_SOUL_DINOLFOS, RI_SOUL_DODONGO, RI_SOUL_EENO, + RI_SOUL_FLYING_POT, RI_SOUL_GRASSHOPPER, RI_SOUL_GOHT, RI_SOUL_GUAY, @@ -2862,6 +2863,7 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS, RANDO_INF_OBTAINED_SOUL_OF_DODONGOS, RANDO_INF_OBTAINED_SOUL_OF_EENOS, + RANDO_INF_OBTAINED_SOUL_OF_FLYING_POTS, RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS, RANDO_INF_OBTAINED_SOUL_OF_GOHT, RANDO_INF_OBTAINED_SOUL_OF_GUAYS, From 9b42649564038477784e30b257a5119faeb3373e Mon Sep 17 00:00:00 2001 From: mckinlee Date: Thu, 23 Oct 2025 18:42:18 -0400 Subject: [PATCH 15/34] ew (#14) --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 1 + mm/2s2h/Rando/DrawFuncs.cpp | 85 +++++++++++++++++++++++++++ mm/2s2h/Rando/DrawFuncs.h | 1 + mm/2s2h/Rando/DrawItem.cpp | 1 + mm/2s2h/Rando/GiveItem.cpp | 1 + mm/2s2h/Rando/StaticData/Items.cpp | 1 + mm/2s2h/Rando/Types.h | 2 + 7 files changed, 92 insertions(+) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 47b35905b6..3ede23bd9a 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -31,6 +31,7 @@ std::unordered_map, std::vectorstate.frames) { + lastUpdate = gPlayState->state.frames; + textureScroll++; + + f32 phase = gPlayState->state.frames * (2500.0f * (2.0f * M_PI / 65536.0f)); + + for (int j = 0; j < 5; j++) { + f32 segmentPhase = phase + (j * 0x4000) * (2.0f * M_PI / 65536.0f); + segments[j].unk_10 = cosf(segmentPhase) * 0.15f; + segments[j].unk_00 = 0.0f; + } + + for (int j = 1; j < 5; j++) { + segments[j].unk_1A.x = (s16)(cosf(phase + (j * 0x3000) * (2.0f * M_PI / 65536.0f)) * 2048.0f); + segments[j].unk_1A.z = (s16)(sinf(phase + (j * 0x1000) * (2.0f * M_PI / 65536.0f)) * 2048.0f); + } + } + + Mtx* mtx = (Mtx*)GRAPH_ALLOC(gPlayState->state.gfxCtx, 4 * sizeof(Mtx)); + s32 i; + f32 temp_f20; + + OPEN_DISPS(gPlayState->state.gfxCtx); + + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY); + Matrix_Push(); + + gSPSegment(POLY_OPA_DISP++, 0x0C, (uintptr_t)mtx); + gSPSegment(POLY_OPA_DISP++, 0x08, + (uintptr_t)Gfx_TwoTexScroll(gPlayState->state.gfxCtx, 0, 0, 0, 0x20, 0x10, 1, (textureScroll * 0) & 0x3F, + (textureScroll * -6) & 0x7F, 0x20, 0x10)); + + Matrix_Push(); + Matrix_Scale((1.0f + segments[0].unk_10) * segments[0].unk_08, 1.0f, + (1.0f + segments[0].unk_10) * segments[0].unk_08, MTXMODE_APPLY); + + MATRIX_FINALIZE_AND_LOAD(POLY_OPA_DISP++, gPlayState->state.gfxCtx); + + Matrix_Pop(); + + for (i = 1; i < 5; i++) { + temp_f20 = segments[i].unk_08 * (segments[i].unk_10 + 1.0f); + + Matrix_Translate(0.0f, segments[i].unk_00 + 1000.0f, 0.0f, MTXMODE_APPLY); + Matrix_RotateZYX(segments[i].unk_1A.x, segments[i].unk_1A.y, segments[i].unk_1A.z, MTXMODE_APPLY); + Matrix_Push(); + Matrix_Scale(temp_f20, 1.0f, temp_f20, MTXMODE_APPLY); + Matrix_ToMtx(mtx); + Matrix_Pop(); + mtx++; + } + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gLikeLikeDL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + Matrix_Pop(); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + extern void DrawMadScrub() { static bool initialized = false; static SkelAnime skelAnime; diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index 28734e609f..fa247a6aa3 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -28,6 +28,7 @@ void DrawHiploop(); void DrawIronKnuckle(); void DrawKeese(); void DrawLeever(); +void DrawLikeLike(); void DrawMadScrub(); void DrawNejiron(); void DrawOctorok(); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index aafe90133d..5648396cd5 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -470,6 +470,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_IRON_KNUCKLE: case RI_SOUL_KEESE: case RI_SOUL_LEEVER: + case RI_SOUL_LIKE_LIKE: case RI_SOUL_MAD_SCRUB: case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 47f64a51a2..3acb5b8a48 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -288,6 +288,7 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_IRON_KNUCKLE: case RI_SOUL_KEESE: case RI_SOUL_LEEVER: + case RI_SOUL_LIKE_LIKE: case RI_SOUL_MAD_SCRUB: case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index a300074cc8..2bf9e7768d 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -187,6 +187,7 @@ std::map Items = { RI(RI_SOUL_IRON_KNUCKLE, "the", "Soul of Iron Knuckles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_KEESE, "the", "Soul of Keese", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_LEEVER, "the", "Soul of Leevers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_LIKE_LIKE, "the", "Soul of Like Likes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_MAD_SCRUB, "the", "Soul of Mad Scrubs", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_MAJORA, "the", "Soul of Majora", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_NEJIRON, "the", "Soul of Nejirons", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 4946a1e89b..b75ed52c7f 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2417,6 +2417,7 @@ typedef enum { RI_SOUL_IRON_KNUCKLE, RI_SOUL_KEESE, RI_SOUL_LEEVER, + RI_SOUL_LIKE_LIKE, RI_SOUL_MAD_SCRUB, RI_SOUL_MAJORA, RI_SOUL_NEJIRON, @@ -2872,6 +2873,7 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_IRON_KNUCKLES, RANDO_INF_OBTAINED_SOUL_OF_KEESE, RANDO_INF_OBTAINED_SOUL_OF_LEEVERS, + RANDO_INF_OBTAINED_SOUL_OF_LIKE_LIKES, RANDO_INF_OBTAINED_SOUL_OF_MAD_SCRUBS, RANDO_INF_OBTAINED_SOUL_OF_MAJORA, RANDO_INF_OBTAINED_SOUL_OF_NEJIRONS, From c5a78e8654a133f5c68823f6e4ff041de71d3025 Mon Sep 17 00:00:00 2001 From: Caladius Date: Thu, 23 Oct 2025 18:46:50 -0400 Subject: [PATCH 16/34] cleanup --- mm/2s2h/Rando/ActorBehavior/Souls.h | 2 +- mm/2s2h/Rando/DrawFuncs.cpp | 2 +- mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.h b/mm/2s2h/Rando/ActorBehavior/Souls.h index d1a903248a..853b7fb2bf 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.h +++ b/mm/2s2h/Rando/ActorBehavior/Souls.h @@ -5,4 +5,4 @@ extern std::unordered_map, std::vector, RandoInf>> soulMap; -#endif // SOULS_ +#endif // SOULS_H diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index e63178e079..6f01d9ea53 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -39,7 +39,7 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec /* Keese */ #include "assets/objects/object_firefly/object_firefly.h" /* Leever */ #include "assets/objects/object_rb/object_rb.h" /* Mad Scrub */ #include "assets/objects/object_dekunuts/object_dekunuts.h" -/* Nejiron */ #include "assets//objects/object_gmo/object_gmo.h" +/* Nejiron */ #include "assets/objects/object_gmo/object_gmo.h" /* Octorok */ #include "assets/objects/object_okuta/object_okuta.h" /* Peehat */ #include "assets/objects/object_ph/object_ph.h" /* Redead */ #include "assets/objects/object_rd/object_rd.h" diff --git a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp index c57ed81562..17dbb44162 100644 --- a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp +++ b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp @@ -401,7 +401,7 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { // Give INF for Enemy Soul if the option is OFF if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_NO) { - for (int i = RANDO_INF_OBTAINED_SOUL_OF_ARMOS; i < RANDO_INF_OBTAINED_SOUL_OF_WOLFOS; i++) { + for (int i = RANDO_INF_OBTAINED_SOUL_OF_ARMOS; i <= RANDO_INF_OBTAINED_SOUL_OF_WOLFOS; i++) { Flags_SetRandoInf(i); } } From 6d1aa50eaae827d5d82235f8d595b747c1699e54 Mon Sep 17 00:00:00 2001 From: Caladius Date: Tue, 4 Nov 2025 19:16:41 -0500 Subject: [PATCH 17/34] Add Bubble Soul --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 1 + mm/2s2h/Rando/DrawFuncs.cpp | 28 +++++++++++++++++++++++++++ mm/2s2h/Rando/DrawFuncs.h | 1 + mm/2s2h/Rando/DrawItem.cpp | 1 + mm/2s2h/Rando/GiveItem.cpp | 1 + mm/2s2h/Rando/StaticData/Items.cpp | 1 + mm/2s2h/Rando/Types.h | 2 ++ 7 files changed, 35 insertions(+) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 77563c09b9..8e29d2b072 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -19,6 +19,7 @@ std::unordered_map, std::vectorstate.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + + if (!initialized) { + initialized = true; + SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gBubbleSkel, (AnimationHeader*)&gBubbleFlyingAnim, + jointTable, morphTable, BUBBLE_LIMB_MAX); + } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + lastUpdate = gPlayState->state.frames; + SkelAnime_Update(&skelAnime); + } + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + extern void DrawDeathArmos() { static bool initialized = false; static SkelAnime skelAnime; diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index fa247a6aa3..18d911113d 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -16,6 +16,7 @@ void DrawBat(); void DrawBeamos(); void DrawBoe(); void DrawRealBombchu(); +void DrawBubble(); void DrawDeathArmos(); void DrawDekuBaba(); void DrawDinolfos(); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index fc0d818f96..ceb50249a4 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -518,6 +518,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_BEAMOS: case RI_SOUL_BOE: case RI_SOUL_BOMBCHU: + case RI_SOUL_BUBBLE: case RI_SOUL_DEATH_ARMOS: case RI_SOUL_DEKU_BABA: case RI_SOUL_DINOLFOS: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 7abc41383d..0da82a6289 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -277,6 +277,7 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_BEAMOS: case RI_SOUL_BOE: case RI_SOUL_BOMBCHU: + case RI_SOUL_BUBBLE: case RI_SOUL_DEATH_ARMOS: case RI_SOUL_DEKU_BABA: case RI_SOUL_DINOLFOS: diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 3bd05994b9..c6379ccd94 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -173,6 +173,7 @@ std::map Items = { RI(RI_SOUL_BEAMOS, "the", "Soul of Beamos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_BOE, "the", "Soul of Boes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_BOMBCHU, "the", "Soul of Bombchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BUBBLE, "the", "Soul of Bubbles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DEATH_ARMOS, "the", "Soul of Death Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DEKU_BABA, "the", "Soul of Deku Babas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DINOLFOS, "the", "Soul of Dinolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 7d27934f57..eda6d94eac 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2441,6 +2441,7 @@ typedef enum { RI_SOUL_BEAMOS, RI_SOUL_BOE, RI_SOUL_BOMBCHU, + RI_SOUL_BUBBLE, RI_SOUL_DEATH_ARMOS, RI_SOUL_DEKU_BABA, RI_SOUL_DINOLFOS, @@ -2902,6 +2903,7 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_BEAMOS, RANDO_INF_OBTAINED_SOUL_OF_BOES, RANDO_INF_OBTAINED_SOUL_OF_BOMBCHU, + RANDO_INF_OBTAINED_SOUL_OF_BUBBLES, RANDO_INF_OBTAINED_SOUL_OF_DEATH_ARMOS, RANDO_INF_OBTAINED_SOUL_OF_DEKU_BABAS, RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS, From d81f9a8e10ac953328fa0047fc14f6a9f1f5e06b Mon Sep 17 00:00:00 2001 From: Caladius Date: Tue, 4 Nov 2025 19:42:37 -0500 Subject: [PATCH 18/34] Adds Freezard --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 1 + mm/2s2h/Rando/DrawFuncs.cpp | 21 +++++++++++++++++++++ mm/2s2h/Rando/DrawFuncs.h | 1 + mm/2s2h/Rando/DrawItem.cpp | 1 + mm/2s2h/Rando/GiveItem.cpp | 1 + mm/2s2h/Rando/StaticData/Items.cpp | 1 + mm/2s2h/Rando/Types.h | 2 ++ 7 files changed, 28 insertions(+) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 8e29d2b072..2b9eefe33f 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -26,6 +26,7 @@ std::unordered_map, std::vectorstate.gfxCtx); + Matrix_Scale(0.006f, 0.006f, 0.006f, MTXMODE_APPLY); + Matrix_Translate(0, -4100.0f, 0, MTXMODE_APPLY); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + + gSPSegment(POLY_XLU_DISP++, 0x08, + (uintptr_t)Gfx_TwoTexScroll(gPlayState->state.gfxCtx, 0, 0, gPlayState->state.frames % 128, 0x20, 0x20, + 1, 0, (gPlayState->state.frames * 2) % 128, 0x20, 0x20)); + MATRIX_FINALIZE_AND_LOAD(POLY_XLU_DISP++, gPlayState->state.gfxCtx); + gDPSetCombineLERP(POLY_XLU_DISP++, TEXEL1, PRIMITIVE, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0, + PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, ENVIRONMENT, 0); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 155, 255, 255, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 200, 255); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)object_fz_DL_001130); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 20.0f, 20.0f, 20.0f }); +} + extern void DrawGrasshopper() { static bool initialized = false; static SkelAnime skelAnime; diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index 18d911113d..4ea3ecc154 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -23,6 +23,7 @@ void DrawDinolfos(); void DrawDodongo(); void DrawEeno(); void DrawFlyingPot(); +void DrawFreezard(); void DrawGrasshopper(); void DrawGuay(); void DrawHiploop(); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index ceb50249a4..0fb5ea8d13 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -525,6 +525,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_DODONGO: case RI_SOUL_EENO: case RI_SOUL_FLYING_POT: + case RI_SOUL_FREEZARD: case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 0da82a6289..4bbffe7053 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -284,6 +284,7 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_DODONGO: case RI_SOUL_EENO: case RI_SOUL_FLYING_POT: + case RI_SOUL_FREEZARD: case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index c6379ccd94..7449fccffd 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -180,6 +180,7 @@ std::map Items = { RI(RI_SOUL_DODONGO, "the", "Soul of Dodongos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_EENO, "the", "Soul of Eenos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_FLYING_POT, "the", "Soul of Flying Pots", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_FREEZARD, "the", "Soul of Freezards", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GRASSHOPPER, "the", "Soul of Grasshoppers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index eda6d94eac..0fbbe5371b 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2448,6 +2448,7 @@ typedef enum { RI_SOUL_DODONGO, RI_SOUL_EENO, RI_SOUL_FLYING_POT, + RI_SOUL_FREEZARD, RI_SOUL_GRASSHOPPER, RI_SOUL_GOHT, RI_SOUL_GUAY, @@ -2910,6 +2911,7 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_DODONGOS, RANDO_INF_OBTAINED_SOUL_OF_EENOS, RANDO_INF_OBTAINED_SOUL_OF_FLYING_POTS, + RANDO_INF_OBTAINED_SOUL_OF_FREEZARDS, RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS, RANDO_INF_OBTAINED_SOUL_OF_GOHT, RANDO_INF_OBTAINED_SOUL_OF_GUAYS, From c9d921cd670fd7f42914f3237fdfe19e8d32a416 Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 5 Nov 2025 08:45:18 -0500 Subject: [PATCH 19/34] Change Soul behaivor to Invincible --- mm/2s2h/GameInteractor/GameInteractor.h | 1 + mm/2s2h/Rando/ActorBehavior/Souls.cpp | 32 ++++++++++--------------- mm/src/code/z_collision_check.c | 15 +++++++----- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/mm/2s2h/GameInteractor/GameInteractor.h b/mm/2s2h/GameInteractor/GameInteractor.h index c0e74180a0..0cb164a849 100644 --- a/mm/2s2h/GameInteractor/GameInteractor.h +++ b/mm/2s2h/GameInteractor/GameInteractor.h @@ -257,6 +257,7 @@ typedef enum { VB_ENEMY_DROP_COLLECTIBLE, VB_DRAW_SLIME_RANDO_ITEM, VB_ENABLE_OBJECT_DEPENDENCY, + VB_APPLY_DAMAGE_TO_ACTOR, } GIVanillaBehavior; typedef enum { diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 2b9eefe33f..def91c3e16 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -2,6 +2,7 @@ #include "ActorBehavior.h" #include #include "Rando/DrawFuncs.h" +#include "spdlog/spdlog.h" extern "C" { #include "variables.h" @@ -90,27 +91,15 @@ void ShouldActorDraw(Actor* actor, bool* should, RandoInf randoInf) { void Rando::ActorBehavior::InitSoulsBehavior() { bool shouldBossRegister = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES; - bool shouldEnemyRegister = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_YES; + bool shouldEnemyInjure = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_YES; - // ShouldActorDraw & ShouldActorUpdate for Enemy Souls - COND_HOOK(ShouldActorDraw, shouldEnemyRegister, [](Actor* actor, bool* should) { - if (actor->category != ACTORCAT_ENEMY || actor->category == ACTORCAT_BOSS) { - return; - } + COND_VB_SHOULD(VB_APPLY_DAMAGE_TO_ACTOR, shouldEnemyInjure, { + Actor* actor = va_arg(args, Actor*); + u32 damageEffect = va_arg(args, u32); + u32 damage = va_arg(args, u32); + u32 dmgFlags = va_arg(args, u32); - RandoItemId randoItemId = GetRandoItemIdByActor(actor->id); - if (randoItemId == RI_UNKNOWN) { - return; - } - - auto findSoulFlag = soulMap.find(randoItemId); - if (findSoulFlag != soulMap.end()) { - ShouldActorDraw(actor, should, std::get<2>(findSoulFlag->second)); - } - }); - - COND_HOOK(ShouldActorUpdate, shouldEnemyRegister, [](Actor* actor, bool* should) { - if (actor->category != ACTORCAT_ENEMY || actor->category == ACTORCAT_BOSS) { + if (actor->category != ACTORCAT_ENEMY) { return; } @@ -121,7 +110,10 @@ void Rando::ActorBehavior::InitSoulsBehavior() { auto findSoulFlag = soulMap.find(randoItemId); if (findSoulFlag != soulMap.end()) { - ShouldActorUpdate(actor, should, std::get<2>(findSoulFlag->second)); + if (!Flags_GetRandoInf(std::get<2>(findSoulFlag->second))) { + actor->colChkInfo.damage = 0; + *should = false; + } } }); diff --git a/mm/src/code/z_collision_check.c b/mm/src/code/z_collision_check.c index 8448b753da..6337f9b3ac 100644 --- a/mm/src/code/z_collision_check.c +++ b/mm/src/code/z_collision_check.c @@ -3526,12 +3526,15 @@ void CollisionCheck_ApplyDamage(struct PlayState* play, CollisionCheckContext* c } } } - if (col->actor->colChkInfo.damageTable != NULL) { - col->actor->colChkInfo.damageEffect = effect; - } - if (!(col->acFlags & AC_HARD) || ((col->acFlags & AC_HARD) && (atElem->atDmgInfo.dmgFlags == 0x20000000))) { - if (col->actor->colChkInfo.damage < finalDamage) { - col->actor->colChkInfo.damage = finalDamage; + if (GameInteractor_Should(VB_APPLY_DAMAGE_TO_ACTOR, true, col->actor, col->actor->colChkInfo.damageEffect, + col->actor->colChkInfo.damage, elem->acDmgInfo.dmgFlags)) { + if (col->actor->colChkInfo.damageTable != NULL) { + col->actor->colChkInfo.damageEffect = effect; + } + if (!(col->acFlags & AC_HARD) || ((col->acFlags & AC_HARD) && (atElem->atDmgInfo.dmgFlags == 0x20000000))) { + if (col->actor->colChkInfo.damage < finalDamage) { + col->actor->colChkInfo.damage = finalDamage; + } } } } From f1b509599ec41224d31efa7a01c0a13aaa02aa28 Mon Sep 17 00:00:00 2001 From: Caladius Date: Sat, 8 Nov 2025 11:01:07 -0500 Subject: [PATCH 20/34] header cleanup and arg consolidation --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 5 ++--- mm/src/code/z_collision_check.c | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index def91c3e16..a5cc4a0583 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -2,7 +2,6 @@ #include "ActorBehavior.h" #include #include "Rando/DrawFuncs.h" -#include "spdlog/spdlog.h" extern "C" { #include "variables.h" @@ -95,9 +94,9 @@ void Rando::ActorBehavior::InitSoulsBehavior() { COND_VB_SHOULD(VB_APPLY_DAMAGE_TO_ACTOR, shouldEnemyInjure, { Actor* actor = va_arg(args, Actor*); - u32 damageEffect = va_arg(args, u32); - u32 damage = va_arg(args, u32); u32 dmgFlags = va_arg(args, u32); + u32 damageEffect = actor->colChkInfo.damageEffect; + u32 damage = actor->colChkInfo.damage; if (actor->category != ACTORCAT_ENEMY) { return; diff --git a/mm/src/code/z_collision_check.c b/mm/src/code/z_collision_check.c index 6337f9b3ac..fa3955cc3e 100644 --- a/mm/src/code/z_collision_check.c +++ b/mm/src/code/z_collision_check.c @@ -3526,8 +3526,7 @@ void CollisionCheck_ApplyDamage(struct PlayState* play, CollisionCheckContext* c } } } - if (GameInteractor_Should(VB_APPLY_DAMAGE_TO_ACTOR, true, col->actor, col->actor->colChkInfo.damageEffect, - col->actor->colChkInfo.damage, elem->acDmgInfo.dmgFlags)) { + if (GameInteractor_Should(VB_APPLY_DAMAGE_TO_ACTOR, true, col->actor, elem->acDmgInfo.dmgFlags)) { if (col->actor->colChkInfo.damageTable != NULL) { col->actor->colChkInfo.damageEffect = effect; } From 34056c22507c2c52a7da879b4d1c3f11f9b9515b Mon Sep 17 00:00:00 2001 From: Caladius Date: Sat, 8 Nov 2025 13:44:03 -0500 Subject: [PATCH 21/34] Fixes OnFileCreate to actually shuffle Enemy Souls. took this op. to fix up Boss Souls shuffling as it was needed to cleanly shuffle Enemy Souls. --- mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp | 42 ++++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp index ad1dbb0cb8..bd0cf6f445 100644 --- a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp +++ b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp @@ -237,13 +237,43 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { itemPool.push_back(RI_PROGRESSIVE_SWORD); itemPool.push_back(RI_SHIELD_HERO); - // Add other items that don't have a vanilla location like Sun's Song or Song of Double Time - if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES) { - for (int i = RI_SOUL_GOHT; i <= RI_SOUL_TWINMOLD; i++) { - if (i == RI_SOUL_MAJORA && RANDO_SAVE_OPTIONS[RO_SHUFFLE_TRIFORCE_PIECES] == RO_GENERIC_YES) { - continue; + // Add other items that don't have a vanilla location like Souls or Triforce Pieces + std::vector bossSouls = { RI_SOUL_GOHT, RI_SOUL_GYORG, RI_SOUL_ODOLWA, RI_SOUL_TWINMOLD, + RI_SOUL_MAJORA }; + bool shuffleMajoraSoul = (RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES && + RANDO_SAVE_OPTIONS[RO_SHUFFLE_TRIFORCE_PIECES] == RO_GENERIC_NO); + for (auto& boss : bossSouls) { + if (boss == RI_SOUL_MAJORA) { + if (shuffleMajoraSoul) { + itemPool.push_back(boss); + } else { + if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_TRIFORCE_PIECES] == RO_GENERIC_NO) { + Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_MAJORA); + } + } + continue; + } + if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES) { + itemPool.push_back(boss); + } else { + Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ARMOS + ((RandoItemId)boss - RI_SOUL_ARMOS)); + } + } + + for (int i = RI_SOUL_ARMOS; i <= RI_SOUL_WOLFOS; i++) { + bool shouldSkipSoul = false; + for (auto& boss : bossSouls) { + if (boss == (RandoItemId)i) { + shouldSkipSoul = true; + break; + } + } + if (!shouldSkipSoul) { + if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_YES) { + itemPool.push_back((RandoItemId)i); + } else { + Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ARMOS + ((RandoItemId)i - RI_SOUL_ARMOS)); } - itemPool.push_back((RandoItemId)i); } } From c3393a2bd20b0c03f0480079ef6ba5daa297f11e Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 26 Nov 2025 09:03:36 -0500 Subject: [PATCH 22/34] Naming Updates --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 8 ++++---- mm/2s2h/Rando/StaticData/Items.cpp | 8 ++++---- mm/2s2h/Rando/Types.h | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index a5cc4a0583..72830ac57c 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -15,19 +15,18 @@ void BossHakugin_DrawIce(BossHakugin*, PlayState*); // clang-format off std::unordered_map, std::vector, RandoInf>> soulMap = { { RI_SOUL_ARMOS, { DrawArmos, { ACTOR_EN_AM }, RANDO_INF_OBTAINED_SOUL_OF_ARMOS } }, - { RI_SOUL_BAT, { DrawBat, { ACTOR_EN_BAT }, RANDO_INF_OBTAINED_SOUL_OF_BATS } }, + { RI_SOUL_BAD_BAT, { DrawBat, { ACTOR_EN_BAT }, RANDO_INF_OBTAINED_SOUL_OF_BATS } }, { RI_SOUL_BEAMOS, { DrawBeamos, { ACTOR_EN_VM }, RANDO_INF_OBTAINED_SOUL_OF_BEAMOS } }, { RI_SOUL_BOE, { DrawBoe, { ACTOR_EN_MKK }, RANDO_INF_OBTAINED_SOUL_OF_BOES } }, - { RI_SOUL_BOMBCHU, { DrawRealBombchu, { ACTOR_EN_RAT }, RANDO_INF_OBTAINED_SOUL_OF_BOMBCHU } }, { RI_SOUL_BUBBLE, { DrawBubble, { ACTOR_EN_BB, ACTOR_EN_BBFALL }, RANDO_INF_OBTAINED_SOUL_OF_BUBBLES } }, { RI_SOUL_DEATH_ARMOS, { DrawDeathArmos, { ACTOR_EN_FAMOS }, RANDO_INF_OBTAINED_SOUL_OF_DEATH_ARMOS } }, { RI_SOUL_DEKU_BABA, { DrawDekuBaba, { ACTOR_EN_DEKUBABA, ACTOR_EN_KAREBABA, ACTOR_BOSS_05 }, RANDO_INF_OBTAINED_SOUL_OF_DEKU_BABAS } }, { RI_SOUL_DINOLFOS, { DrawDinolfos, { ACTOR_EN_DINOFOS }, RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS } }, { RI_SOUL_DODONGO, { DrawDodongo, { ACTOR_EN_DODONGO }, RANDO_INF_OBTAINED_SOUL_OF_DODONGOS } }, + { RI_SOUL_DRAGONFLY, { DrawGrasshopper, { ACTOR_EN_GRASSHOPPER }, RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS } }, { RI_SOUL_EENO, { DrawEeno, { ACTOR_EN_SNOWMAN }, RANDO_INF_OBTAINED_SOUL_OF_EENOS } }, { RI_SOUL_FLYING_POT, { DrawFlyingPot, { ACTOR_EN_TUBO_TRAP }, RANDO_INF_OBTAINED_SOUL_OF_FLYING_POTS } }, { RI_SOUL_FREEZARD, { DrawFreezard, { ACTOR_EN_FZ }, RANDO_INF_OBTAINED_SOUL_OF_FREEZARDS } }, - { RI_SOUL_GRASSHOPPER, { DrawGrasshopper, { ACTOR_EN_GRASSHOPPER }, RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS } }, { RI_SOUL_GUAY, { DrawGuay, { ACTOR_EN_CROW, ACTOR_EN_RUPPECROW }, RANDO_INF_OBTAINED_SOUL_OF_GUAYS } }, { RI_SOUL_HIPLOOP, { DrawHiploop, { ACTOR_EN_PP }, RANDO_INF_OBTAINED_SOUL_OF_HIPLOOPS } }, { RI_SOUL_IRON_KNUCKLE, { DrawIronKnuckle, { ACTOR_EN_IK }, RANDO_INF_OBTAINED_SOUL_OF_IRON_KNUCKLES } }, @@ -38,11 +37,12 @@ std::unordered_map, std::vector Items = { RI(RI_SONG_SUN, "the", "Sun's Song", RITYPE_MAJOR, ITEM_SONG_SUN, GI_NONE, GID_NONE), RI(RI_SONG_TIME, "the", "Song of Time", RITYPE_MAJOR, ITEM_SONG_TIME, GI_NONE, GID_NONE), RI(RI_SOUL_ARMOS, "the", "Soul of Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_BAT, "the", "Soul of Bats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BAD_BAT, "the", "Soul of Bad Bats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_BEAMOS, "the", "Soul of Beamos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_BOE, "the", "Soul of Boes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_BOMBCHU, "the", "Soul of Bombchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_BUBBLE, "the", "Soul of Bubbles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_CHUCHU, "the", "Soul of Chuchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DEATH_ARMOS, "the", "Soul of Death Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DEKU_BABA, "the", "Soul of Deku Babas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DINOLFOS, "the", "Soul of Dinolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DODONGO, "the", "Soul of Dodongos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_DRAGONFLY, "the", "Soul of Dragonflies", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_EENO, "the", "Soul of Eenos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_FLYING_POT, "the", "Soul of Flying Pots", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_FREEZARD, "the", "Soul of Freezards", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GRASSHOPPER, "the", "Soul of Grasshoppers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_HIPLOOP, "the", "Soul of Hiploops", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), @@ -199,11 +199,11 @@ std::map Items = { RI(RI_SOUL_OCTOROK, "the", "Soul of Octoroks", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_ODOLWA, "the", "Soul of Odolwa", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_PEAHAT, "the", "Soul of Peahats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_REAL_BOMBCHU, "the", "Soul of Real Bombchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_REDEAD, "the", "Soul of Redeads", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_SHELLBLADE, "the", "Soul of Shellblades", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_SKULLFISH, "the", "Soul of Skullfish", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_SKULLTULA, "the", "Soul of Skulltulas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_SLIME, "the", "Soul of Slimes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_SNAPPER, "the", "Soul of Snappers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_STALCHILD, "the", "Soul of Stalchildren", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_TEKTITE, "the", "Soul of Tektites", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 8d4c5487f1..f4113b679b 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2439,19 +2439,19 @@ typedef enum { RI_SONG_SUN, RI_SONG_TIME, RI_SOUL_ARMOS, - RI_SOUL_BAT, + RI_SOUL_BAD_BAT, RI_SOUL_BEAMOS, RI_SOUL_BOE, - RI_SOUL_BOMBCHU, RI_SOUL_BUBBLE, + RI_SOUL_CHUCHU, RI_SOUL_DEATH_ARMOS, RI_SOUL_DEKU_BABA, RI_SOUL_DINOLFOS, RI_SOUL_DODONGO, + RI_SOUL_DRAGONFLY, RI_SOUL_EENO, RI_SOUL_FLYING_POT, RI_SOUL_FREEZARD, - RI_SOUL_GRASSHOPPER, RI_SOUL_GOHT, RI_SOUL_GUAY, RI_SOUL_HIPLOOP, @@ -2466,11 +2466,11 @@ typedef enum { RI_SOUL_OCTOROK, RI_SOUL_ODOLWA, RI_SOUL_PEAHAT, + RI_SOUL_REAL_BOMBCHU, RI_SOUL_REDEAD, RI_SOUL_SHELLBLADE, RI_SOUL_SKULLFISH, RI_SOUL_SKULLTULA, - RI_SOUL_SLIME, RI_SOUL_SNAPPER, RI_SOUL_STALCHILD, RI_SOUL_TEKTITE, From b802e15991215646a5d6e3d2783e65a176fc305f Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 26 Nov 2025 09:06:08 -0500 Subject: [PATCH 23/34] Name Updates pt2 --- mm/2s2h/Rando/DrawItem.cpp | 8 ++++---- mm/2s2h/Rando/GiveItem.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index 46285ed776..d2db1f80fb 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -514,19 +514,19 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { Rando::DrawItem(Rando::ConvertItem(randoItemId), actor); break; case RI_SOUL_ARMOS: - case RI_SOUL_BAT: + case RI_SOUL_BAD_BAT: case RI_SOUL_BEAMOS: case RI_SOUL_BOE: - case RI_SOUL_BOMBCHU: case RI_SOUL_BUBBLE: + case RI_SOUL_CHUCHU: case RI_SOUL_DEATH_ARMOS: case RI_SOUL_DEKU_BABA: case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: + case RI_SOUL_DRAGONFLY: case RI_SOUL_EENO: case RI_SOUL_FLYING_POT: case RI_SOUL_FREEZARD: - case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: case RI_SOUL_IRON_KNUCKLE: @@ -537,11 +537,11 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: case RI_SOUL_PEAHAT: + case RI_SOUL_REAL_BOMBCHU: case RI_SOUL_REDEAD: case RI_SOUL_SHELLBLADE: case RI_SOUL_SKULLFISH: case RI_SOUL_SKULLTULA: - case RI_SOUL_SLIME: case RI_SOUL_SNAPPER: case RI_SOUL_STALCHILD: case RI_SOUL_TEKTITE: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 980c455d01..88ae9670d9 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -274,19 +274,19 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_ODOLWA: case RI_SOUL_TWINMOLD: case RI_SOUL_ARMOS: - case RI_SOUL_BAT: + case RI_SOUL_BAD_BAT: case RI_SOUL_BEAMOS: case RI_SOUL_BOE: - case RI_SOUL_BOMBCHU: case RI_SOUL_BUBBLE: + case RI_SOUL_CHUCHU: case RI_SOUL_DEATH_ARMOS: case RI_SOUL_DEKU_BABA: case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: + case RI_SOUL_DRAGONFLY: case RI_SOUL_EENO: case RI_SOUL_FLYING_POT: case RI_SOUL_FREEZARD: - case RI_SOUL_GRASSHOPPER: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: case RI_SOUL_IRON_KNUCKLE: @@ -297,11 +297,11 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: case RI_SOUL_PEAHAT: + case RI_SOUL_REAL_BOMBCHU: case RI_SOUL_REDEAD: case RI_SOUL_SHELLBLADE: case RI_SOUL_SKULLFISH: case RI_SOUL_SKULLTULA: - case RI_SOUL_SLIME: case RI_SOUL_SNAPPER: case RI_SOUL_STALCHILD: case RI_SOUL_TEKTITE: From f2b49cb4a8a1958cbceab9499f818e7551a0784d Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 26 Nov 2025 09:55:02 -0500 Subject: [PATCH 24/34] Add Tracker Icons and adds a Default to avoid erroring --- mm/2s2h/Rando/StaticData/Items.cpp | 36 +++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 14df32dd76..02bdb89c9c 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -364,6 +364,40 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { case RI_SOUL_MAJORA: case RI_SOUL_ODOLWA: case RI_SOUL_TWINMOLD: + case RI_SOUL_ARMOS: + case RI_SOUL_BAD_BAT: + case RI_SOUL_BEAMOS: + case RI_SOUL_BOE: + case RI_SOUL_BUBBLE: + case RI_SOUL_CHUCHU: + case RI_SOUL_DEATH_ARMOS: + case RI_SOUL_DEKU_BABA: + case RI_SOUL_DINOLFOS: + case RI_SOUL_DODONGO: + case RI_SOUL_DRAGONFLY: + case RI_SOUL_EENO: + case RI_SOUL_FLYING_POT: + case RI_SOUL_FREEZARD: + case RI_SOUL_GUAY: + case RI_SOUL_HIPLOOP: + case RI_SOUL_IRON_KNUCKLE: + case RI_SOUL_KEESE: + case RI_SOUL_LEEVER: + case RI_SOUL_LIKE_LIKE: + case RI_SOUL_MAD_SCRUB: + case RI_SOUL_NEJIRON: + case RI_SOUL_OCTOROK: + case RI_SOUL_PEAHAT: + case RI_SOUL_REAL_BOMBCHU: + case RI_SOUL_REDEAD: + case RI_SOUL_SHELLBLADE: + case RI_SOUL_SKULLFISH: + case RI_SOUL_SKULLTULA: + case RI_SOUL_SNAPPER: + case RI_SOUL_STALCHILD: + case RI_SOUL_TEKTITE: + case RI_SOUL_WALLMASTER: + case RI_SOUL_WOLFOS: return (const char*)gDungeonMapSkullTex; case RI_FROG_BLUE: case RI_FROG_CYAN: @@ -391,7 +425,7 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { case RI_TRIFORCE_PIECE: return (const char*)gTriforcePieceTex; default: - break; + return (const char*)gPauseUnusedCursorTex; } s16 itemId = Rando::StaticData::Items[randoItemId].itemId; From 716b8bd3115c15d74427be6a7f58228f9bd86938 Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 26 Nov 2025 10:07:19 -0500 Subject: [PATCH 25/34] Fix Iron Knuckle Helmet --- mm/2s2h/Rando/DrawFuncs.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index a8567f1ef3..4b914306a3 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -172,6 +172,20 @@ s32 DrawEnSkb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3 return false; } +void DrawEnIk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + if (limbIndex == IRON_KNUCKLE_LIMB_HELMET_ARMOR) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx* xlu = POLY_XLU_DISP; + + MATRIX_FINALIZE_AND_LOAD(&xlu[0], play->state.gfxCtx); + gSPDisplayList(&xlu[1], (Gfx*)gIronKnuckleHelmetMarkingDL); + POLY_XLU_DISP = &xlu[2]; + + CLOSE_DISPS(play->state.gfxCtx); + } +} + // Enemy Soul Draw Functions extern void DrawArmos() { static bool initialized = false; @@ -653,7 +667,8 @@ extern void DrawIronKnuckle() { gSPSegment(&gfx[3], 0x0A, (uintptr_t)gIronKnuckleBrownArmorMaterialDL); POLY_OPA_DISP = &gfx[4]; - SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, + DrawEnIk_PostLimbDraw, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); DrawEnLight({ 155, 155, 155 }, { 12.0f, 12.0f, 12.0f }); From 69365209c71bc4bf1ae93643bdda11e47600e663 Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 26 Nov 2025 13:14:57 -0500 Subject: [PATCH 26/34] revert item icon default and add soul flame to tatl target for enemies that are invincible. --- mm/2s2h/GameInteractor/GameInteractor.h | 1 + mm/2s2h/Rando/ActorBehavior/Souls.cpp | 28 +++++++++++++++++++++---- mm/2s2h/Rando/DrawFuncs.cpp | 2 +- mm/2s2h/Rando/DrawFuncs.h | 2 ++ mm/2s2h/Rando/StaticData/Items.cpp | 2 +- mm/2s2h/Rando/Types.h | 8 +++---- mm/src/code/z_actor.c | 7 ++++--- 7 files changed, 37 insertions(+), 13 deletions(-) diff --git a/mm/2s2h/GameInteractor/GameInteractor.h b/mm/2s2h/GameInteractor/GameInteractor.h index 41a65bd90e..53b9c1dd7f 100644 --- a/mm/2s2h/GameInteractor/GameInteractor.h +++ b/mm/2s2h/GameInteractor/GameInteractor.h @@ -65,6 +65,7 @@ typedef enum { VB_TATL_INTERUPT_MSG4, VB_TATL_INTERUPT_MSG6, VB_ITEM_BE_RESTRICTED, + VB_DRAW_LOCK_ON_ARROW, VB_APPLY_AIR_CONTROL, VB_DISABLE_LETTERBOX, VB_START_GREAT_FAIRY_CUTSCENE, diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 72830ac57c..b9b6bbf568 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -15,7 +15,7 @@ void BossHakugin_DrawIce(BossHakugin*, PlayState*); // clang-format off std::unordered_map, std::vector, RandoInf>> soulMap = { { RI_SOUL_ARMOS, { DrawArmos, { ACTOR_EN_AM }, RANDO_INF_OBTAINED_SOUL_OF_ARMOS } }, - { RI_SOUL_BAD_BAT, { DrawBat, { ACTOR_EN_BAT }, RANDO_INF_OBTAINED_SOUL_OF_BATS } }, + { RI_SOUL_BAD_BAT, { DrawBat, { ACTOR_EN_BAT }, RANDO_INF_OBTAINED_SOUL_OF_BAD_BATS } }, { RI_SOUL_BEAMOS, { DrawBeamos, { ACTOR_EN_VM }, RANDO_INF_OBTAINED_SOUL_OF_BEAMOS } }, { RI_SOUL_BOE, { DrawBoe, { ACTOR_EN_MKK }, RANDO_INF_OBTAINED_SOUL_OF_BOES } }, { RI_SOUL_BUBBLE, { DrawBubble, { ACTOR_EN_BB, ACTOR_EN_BBFALL }, RANDO_INF_OBTAINED_SOUL_OF_BUBBLES } }, @@ -23,7 +23,7 @@ std::unordered_map, std::vector, std::vectorcategory == ACTORCAT_ENEMY) { + for (auto& [randoItemId, data] : soulMap) { + auto& actorList = std::get<1>(data); + + if (std::find(actorList.begin(), actorList.end(), refActor->id) != actorList.end()) { + if (!Flags_GetRandoInf(std::get<2>(data))) { + *should = false; + break; + } + } + } + if (!*should) { + DrawEnLight({ 155, 0, 0 }, { 1.0f, 1.0f, 1.0f }); + } + } + }); } diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index 4b914306a3..dbb1707617 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -62,7 +62,7 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec } // Soul Effects -void DrawEnLight(Color_RGB8 flameColor, Vec3f flameSize) { +extern void DrawEnLight(Color_RGB8 flameColor, Vec3f flameSize) { Gfx* sp68; static s8 unk_144 = (s8)(Rand_ZeroOne() * 255.0f); static u32 lastUpdate = 0; diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index 4ea3ecc154..c16ee20f61 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -3,6 +3,8 @@ #include "Rando/Rando.h" +void DrawEnLight(Color_RGB8 flameColor, Vec3f flameSize); + // Boss Functions void DrawGoht(); void DrawGyorg(); diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 02bdb89c9c..5f1d4accbb 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -425,7 +425,7 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { case RI_TRIFORCE_PIECE: return (const char*)gTriforcePieceTex; default: - return (const char*)gPauseUnusedCursorTex; + break; } s16 itemId = Rando::StaticData::Items[randoItemId].itemId; diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index f4113b679b..4e71f7300b 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2908,19 +2908,19 @@ typedef enum { RANDO_INF_OBTAINED_LETTER_TO_KAFEI, RANDO_INF_OBTAINED_PENDANT_OF_MEMORIES, RANDO_INF_OBTAINED_SOUL_OF_ARMOS, - RANDO_INF_OBTAINED_SOUL_OF_BATS, + RANDO_INF_OBTAINED_SOUL_OF_BAD_BATS, RANDO_INF_OBTAINED_SOUL_OF_BEAMOS, RANDO_INF_OBTAINED_SOUL_OF_BOES, - RANDO_INF_OBTAINED_SOUL_OF_BOMBCHU, RANDO_INF_OBTAINED_SOUL_OF_BUBBLES, + RANDO_INF_OBTAINED_SOUL_OF_CHUCHUS, RANDO_INF_OBTAINED_SOUL_OF_DEATH_ARMOS, RANDO_INF_OBTAINED_SOUL_OF_DEKU_BABAS, RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS, RANDO_INF_OBTAINED_SOUL_OF_DODONGOS, + RANDO_INF_OBTAINED_SOUL_OF_DRAGONFLIES, RANDO_INF_OBTAINED_SOUL_OF_EENOS, RANDO_INF_OBTAINED_SOUL_OF_FLYING_POTS, RANDO_INF_OBTAINED_SOUL_OF_FREEZARDS, - RANDO_INF_OBTAINED_SOUL_OF_GRASSHOPPERS, RANDO_INF_OBTAINED_SOUL_OF_GOHT, RANDO_INF_OBTAINED_SOUL_OF_GUAYS, RANDO_INF_OBTAINED_SOUL_OF_HIPLOOPS, @@ -2935,11 +2935,11 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA, RANDO_INF_OBTAINED_SOUL_OF_PEAHATS, + RANDO_INF_OBTAINED_SOUL_OF_REAL_BOMBCHU, RANDO_INF_OBTAINED_SOUL_OF_REDEADS, RANDO_INF_OBTAINED_SOUL_OF_SHELLBLADES, RANDO_INF_OBTAINED_SOUL_OF_SKULLFISH, RANDO_INF_OBTAINED_SOUL_OF_SKULLTULAS, - RANDO_INF_OBTAINED_SOUL_OF_SLIMES, RANDO_INF_OBTAINED_SOUL_OF_SNAPPERS, RANDO_INF_OBTAINED_SOUL_OF_STALCHILDREN, RANDO_INF_OBTAINED_SOUL_OF_TEKTITES, diff --git a/mm/src/code/z_actor.c b/mm/src/code/z_actor.c index 6fed8a8753..03148315c8 100644 --- a/mm/src/code/z_actor.c +++ b/mm/src/code/z_actor.c @@ -648,9 +648,10 @@ void Attention_Draw(Attention* attention, PlayState* play) { actor->focus.pos.z, MTXMODE_NEW); Matrix_RotateYS(play->gameplayFrames * 0xBB8, MTXMODE_APPLY); Matrix_Scale((iREG(27) + 35) / 1000.0f, (iREG(28) + 60) / 1000.0f, (iREG(29) + 50) / 1000.0f, MTXMODE_APPLY); - - gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, attentionColor->primary.r, attentionColor->primary.g, - attentionColor->primary.b, 255); + if (GameInteractor_Should(VB_DRAW_LOCK_ON_ARROW, true, actor)) { + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, attentionColor->primary.r, attentionColor->primary.g, + attentionColor->primary.b, 255); + } MATRIX_FINALIZE_AND_LOAD(POLY_XLU_DISP++, play->state.gfxCtx); gSPDisplayList(POLY_XLU_DISP++, gLockOnArrowDL); FrameInterpolation_RecordCloseChild(); From 1f9aa2084ad84c3ba23bddc1a4ec4e48ea550fc5 Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Fri, 19 Dec 2025 21:10:52 -0500 Subject: [PATCH 27/34] Move VBs to GameInteractor_VanillaBehavior.h --- .../GameInteractor_VanillaBehavior.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h index a4bbe1793a..2d1535b343 100644 --- a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h +++ b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h @@ -71,6 +71,15 @@ typedef enum { // - `*f32` (speed) VB_APPLY_AIR_CONTROL, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + // - `u32` (dmgFlags) + VB_APPLY_DAMAGE_TO_ACTOR, + // #### `result` // ```c // !play->interfaceCtx.perfectLettersOn @@ -433,6 +442,14 @@ typedef enum { // - `*DmHina` VB_DRAW_BOSS_REMAINS, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_DRAW_LOCK_ON_ARROW, + // #### `result` // ```c // true From 40c07ad35f675a872bdd45fe979fbefd415de9a8 Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Sat, 20 Dec 2025 15:59:52 -0500 Subject: [PATCH 28/34] Use VB_PERFORM_AC_COLLISION for enemy souls --- .../GameInteractor_VanillaBehavior.h | 9 - mm/2s2h/Rando/ActorBehavior/Souls.cpp | 168 +++++++++--------- mm/2s2h/Rando/ActorBehavior/Souls.h | 8 - mm/2s2h/Rando/DrawItem.cpp | 58 +++++- mm/2s2h/Rando/Types.h | 2 +- mm/src/code/z_collision_check.c | 14 +- 6 files changed, 146 insertions(+), 113 deletions(-) delete mode 100644 mm/2s2h/Rando/ActorBehavior/Souls.h diff --git a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h index 2d1535b343..067546d754 100644 --- a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h +++ b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h @@ -71,15 +71,6 @@ typedef enum { // - `*f32` (speed) VB_APPLY_AIR_CONTROL, - // #### `result` - // ```c - // true - // ``` - // #### `args` - // - `*Actor` - // - `u32` (dmgFlags) - VB_APPLY_DAMAGE_TO_ACTOR, - // #### `result` // ```c // !play->interfaceCtx.perfectLettersOn diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index b9b6bbf568..4e57232492 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -1,4 +1,3 @@ -#include "Souls.h" #include "ActorBehavior.h" #include #include "Rando/DrawFuncs.h" @@ -12,56 +11,6 @@ extern "C" { void BossHakugin_DrawIce(BossHakugin*, PlayState*); } -// clang-format off -std::unordered_map, std::vector, RandoInf>> soulMap = { - { RI_SOUL_ARMOS, { DrawArmos, { ACTOR_EN_AM }, RANDO_INF_OBTAINED_SOUL_OF_ARMOS } }, - { RI_SOUL_BAD_BAT, { DrawBat, { ACTOR_EN_BAT }, RANDO_INF_OBTAINED_SOUL_OF_BAD_BATS } }, - { RI_SOUL_BEAMOS, { DrawBeamos, { ACTOR_EN_VM }, RANDO_INF_OBTAINED_SOUL_OF_BEAMOS } }, - { RI_SOUL_BOE, { DrawBoe, { ACTOR_EN_MKK }, RANDO_INF_OBTAINED_SOUL_OF_BOES } }, - { RI_SOUL_BUBBLE, { DrawBubble, { ACTOR_EN_BB, ACTOR_EN_BBFALL }, RANDO_INF_OBTAINED_SOUL_OF_BUBBLES } }, - { RI_SOUL_DEATH_ARMOS, { DrawDeathArmos, { ACTOR_EN_FAMOS }, RANDO_INF_OBTAINED_SOUL_OF_DEATH_ARMOS } }, - { RI_SOUL_DEKU_BABA, { DrawDekuBaba, { ACTOR_EN_DEKUBABA, ACTOR_EN_KAREBABA, ACTOR_BOSS_05 }, RANDO_INF_OBTAINED_SOUL_OF_DEKU_BABAS } }, - { RI_SOUL_DINOLFOS, { DrawDinolfos, { ACTOR_EN_DINOFOS }, RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS } }, - { RI_SOUL_DODONGO, { DrawDodongo, { ACTOR_EN_DODONGO }, RANDO_INF_OBTAINED_SOUL_OF_DODONGOS } }, - { RI_SOUL_DRAGONFLY, { DrawGrasshopper, { ACTOR_EN_GRASSHOPPER }, RANDO_INF_OBTAINED_SOUL_OF_DRAGONFLIES } }, - { RI_SOUL_EENO, { DrawEeno, { ACTOR_EN_SNOWMAN }, RANDO_INF_OBTAINED_SOUL_OF_EENOS } }, - { RI_SOUL_FLYING_POT, { DrawFlyingPot, { ACTOR_EN_TUBO_TRAP }, RANDO_INF_OBTAINED_SOUL_OF_FLYING_POTS } }, - { RI_SOUL_FREEZARD, { DrawFreezard, { ACTOR_EN_FZ }, RANDO_INF_OBTAINED_SOUL_OF_FREEZARDS } }, - { RI_SOUL_GUAY, { DrawGuay, { ACTOR_EN_CROW, ACTOR_EN_RUPPECROW }, RANDO_INF_OBTAINED_SOUL_OF_GUAYS } }, - { RI_SOUL_HIPLOOP, { DrawHiploop, { ACTOR_EN_PP }, RANDO_INF_OBTAINED_SOUL_OF_HIPLOOPS } }, - { RI_SOUL_IRON_KNUCKLE, { DrawIronKnuckle, { ACTOR_EN_IK }, RANDO_INF_OBTAINED_SOUL_OF_IRON_KNUCKLES } }, - { RI_SOUL_KEESE, { DrawKeese, { ACTOR_EN_FIREFLY }, RANDO_INF_OBTAINED_SOUL_OF_KEESE } }, - { RI_SOUL_LEEVER, { DrawLeever, { ACTOR_EN_NEO_REEBA }, RANDO_INF_OBTAINED_SOUL_OF_LEEVERS } }, - { RI_SOUL_LIKE_LIKE, { DrawLikeLike, { ACTOR_EN_RR }, RANDO_INF_OBTAINED_SOUL_OF_LIKE_LIKES } }, - { RI_SOUL_MAD_SCRUB, { DrawMadScrub, { ACTOR_EN_DEKUNUTS }, RANDO_INF_OBTAINED_SOUL_OF_MAD_SCRUBS } }, - { RI_SOUL_NEJIRON, { DrawNejiron, { ACTOR_EN_BAGUO }, RANDO_INF_OBTAINED_SOUL_OF_NEJIRONS } }, - { RI_SOUL_OCTOROK, { DrawOctorok, { ACTOR_EN_OKUTA }, RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS } }, - { RI_SOUL_PEAHAT, { DrawPeahat, { ACTOR_EN_PEEHAT }, RANDO_INF_OBTAINED_SOUL_OF_PEAHATS } }, - { RI_SOUL_REAL_BOMBCHU, { DrawRealBombchu, { ACTOR_EN_RAT }, RANDO_INF_OBTAINED_SOUL_OF_REAL_BOMBCHU } }, - { RI_SOUL_REDEAD, { DrawRedead, { ACTOR_EN_RD, ACTOR_EN_RAILGIBUD }, RANDO_INF_OBTAINED_SOUL_OF_REDEADS } }, - { RI_SOUL_SHELLBLADE, { DrawShellBlade, { ACTOR_EN_SB }, RANDO_INF_OBTAINED_SOUL_OF_SHELLBLADES } }, - { RI_SOUL_SKULLFISH, { DrawSkullfish, { ACTOR_EN_PR, ACTOR_EN_PRZ, ACTOR_EN_PR2 }, RANDO_INF_OBTAINED_SOUL_OF_SKULLFISH } }, - { RI_SOUL_SKULLTULA, { DrawSkulltula, { ACTOR_EN_ST, ACTOR_EN_SW }, RANDO_INF_OBTAINED_SOUL_OF_SKULLTULAS } }, - { RI_SOUL_CHUCHU, { DrawSlime, { ACTOR_EN_SLIME }, RANDO_INF_OBTAINED_SOUL_OF_CHUCHUS } }, - { RI_SOUL_SNAPPER, { DrawSnapper, { ACTOR_EN_KAME }, RANDO_INF_OBTAINED_SOUL_OF_SNAPPERS } }, - { RI_SOUL_STALCHILD, { DrawStalchild, { ACTOR_EN_SKB, ACTOR_EN_RAIL_SKB }, RANDO_INF_OBTAINED_SOUL_OF_STALCHILDREN } }, - { RI_SOUL_TEKTITE, { DrawTektite, { ACTOR_EN_TITE }, RANDO_INF_OBTAINED_SOUL_OF_TEKTITES } }, - { RI_SOUL_WALLMASTER, { DrawWallmaster, { ACTOR_EN_WALLMAS, ACTOR_EN_FLOORMAS }, RANDO_INF_OBTAINED_SOUL_OF_WALLMASTERS } }, - { RI_SOUL_WOLFOS, { DrawWolfos, { ACTOR_EN_WF }, RANDO_INF_OBTAINED_SOUL_OF_WOLFOS } }, -}; -// clang-format on - -RandoItemId GetRandoItemIdByActor(int16_t actorId) { - for (auto& soul : soulMap) { - for (auto& actor : std::get<1>(soul.second)) { - if (actor == actorId) { - return soul.first; - } - } - } - return RI_UNKNOWN; -} - bool shouldMajoraRegister() { bool registerStatus = false; if (IS_RANDO) { @@ -73,6 +22,75 @@ bool shouldMajoraRegister() { return registerStatus; } +#define RI_TO_RANDO_INF(randoItemId) ((randoItemId - RI_SOUL_ARMOS) + RANDO_INF_OBTAINED_SOUL_OF_ARMOS) + +// clang-format off +std::unordered_map soulMap = { + // TODO: Combine all Poes into one soul? regular, big, sisters. regular and big have no drops as of yet + // TODO: Special cases: Igos du Ikana, Captain Keeta + // FIXME: Real Bomchus and flying pots don't depend on attack collision to die; they can die from hitting anything + // { ACTOR_EN_INVADEPOH, RI_SOUL_ALIEN }, + { ACTOR_EN_AM, RI_SOUL_ARMOS }, + { ACTOR_EN_BAT, RI_SOUL_BAD_BAT }, + { ACTOR_EN_VM, RI_SOUL_BEAMOS }, + { ACTOR_EN_BB, RI_SOUL_BUBBLE }, + { ACTOR_EN_BBFALL, RI_SOUL_BUBBLE }, + { ACTOR_EN_MKK, RI_SOUL_BOE }, + { ACTOR_EN_SLIME, RI_SOUL_CHUCHU }, + { ACTOR_EN_FAMOS, RI_SOUL_DEATH_ARMOS }, + // { ACTOR_EN_DRAGON, RI_SOUL_DEEP_PYTHON }, + { ACTOR_EN_DEKUBABA, RI_SOUL_DEKU_BABA }, + { ACTOR_EN_KAREBABA, RI_SOUL_DEKU_BABA }, + { ACTOR_BOSS_05, RI_SOUL_DEKU_BABA }, + // { ACTOR_EN_WDHAND, RI_SOUL_DEXIHAND }, + { ACTOR_EN_DINOFOS, RI_SOUL_DINOLFOS }, + { ACTOR_EN_DODONGO, RI_SOUL_DODONGO }, + { ACTOR_EN_GRASSHOPPER, RI_SOUL_DRAGONFLY }, + { ACTOR_EN_SNOWMAN, RI_SOUL_EENO }, + // { ACTOR_EN_EGOL, RI_SOUL_EYEGORE }, + { ACTOR_EN_TUBO_TRAP, RI_SOUL_FLYING_POT }, + { ACTOR_EN_FZ, RI_SOUL_FREEZARD }, + // { ACTOR_EN_JSO, RI_SOUL_GARO }, + // { ACTOR_EN_JSO2, RI_SOUL_GARO_MASTER }, + // { ACTOR_EN_BIGSLIME, RI_SOUL_GEKKO }, + // { ACTOR_EN_PAMETFROG, RI_SOUL_GEKKO }, + // { ACTOR_EN_BEE, RI_SOUL_GIANT_BEE }, + { ACTOR_EN_CROW, RI_SOUL_GUAY }, + { ACTOR_EN_RUPPECROW, RI_SOUL_GUAY }, + { ACTOR_EN_PP, RI_SOUL_HIPLOOP }, + { ACTOR_EN_IK, RI_SOUL_IRON_KNUCKLE }, + { ACTOR_EN_FIREFLY, RI_SOUL_KEESE }, + { ACTOR_EN_NEO_REEBA, RI_SOUL_LEEVER }, + { ACTOR_EN_RR, RI_SOUL_LIKE_LIKE }, + { ACTOR_EN_DEKUNUTS, RI_SOUL_MAD_SCRUB }, + { ACTOR_EN_BAGUO, RI_SOUL_NEJIRON }, + { ACTOR_EN_OKUTA, RI_SOUL_OCTOROK }, + { ACTOR_EN_PEEHAT, RI_SOUL_PEAHAT }, + // { ACTOR_EN_KAIZOKU, RI_SOUL_PIRATE }, + // { ACTOR_EN_PO_SISTERS, RI_SOUL_POE_SISTER }, + { ACTOR_EN_RAT, RI_SOUL_REAL_BOMBCHU }, + { ACTOR_EN_RD, RI_SOUL_REDEAD }, + { ACTOR_EN_SB, RI_SOUL_SHELLBLADE }, + { ACTOR_EN_PR, RI_SOUL_SKULLFISH }, + { ACTOR_EN_PR2, RI_SOUL_SKULLFISH }, + { ACTOR_EN_PRZ, RI_SOUL_SKULLFISH }, + { ACTOR_EN_ST, RI_SOUL_SKULLTULA }, + { ACTOR_EN_SW, RI_SOUL_SKULLTULA }, + { ACTOR_EN_BIGPAMET, RI_SOUL_SNAPPER }, + { ACTOR_EN_KAME, RI_SOUL_SNAPPER }, + { ACTOR_EN_HINT_SKB, RI_SOUL_STALCHILD }, + { ACTOR_EN_RAIL_SKB, RI_SOUL_STALCHILD }, + { ACTOR_EN_SKB, RI_SOUL_STALCHILD }, + // { ACTOR_EN_THIEFBIRD, RI_SOUL_TAKKURI }, + { ACTOR_EN_TITE, RI_SOUL_TEKTITE }, + { ACTOR_EN_FLOORMAS, RI_SOUL_WALLMASTER }, + { ACTOR_EN_WALLMAS, RI_SOUL_WALLMASTER }, + // { ACTOR_BOSS_04, RI_SOUL_WART }, + // { ACTOR_EN_WIZ, RI_SOUL_WIZROBE }, + { ACTOR_EN_WF, RI_SOUL_WOLFOS }, +}; +// clang-format on + void ShouldActorUpdate(Actor* actor, bool* should, RandoInf randoInf) { if (!Flags_GetRandoInf(randoInf)) { *should = false; @@ -92,26 +110,18 @@ void Rando::ActorBehavior::InitSoulsBehavior() { bool shouldBossRegister = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES; bool shouldEnemyInjure = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_YES; - COND_VB_SHOULD(VB_APPLY_DAMAGE_TO_ACTOR, shouldEnemyInjure, { - Actor* actor = va_arg(args, Actor*); - u32 dmgFlags = va_arg(args, u32); - u32 damageEffect = actor->colChkInfo.damageEffect; - u32 damage = actor->colChkInfo.damage; + COND_VB_SHOULD(VB_PERFORM_AC_COLLISION, shouldEnemyInjure, { + Collider* at = va_arg(args, Collider*); + Collider* ac = va_arg(args, Collider*); - if (actor->category != ACTORCAT_ENEMY) { - return; - } - - RandoItemId randoItemId = GetRandoItemIdByActor(actor->id); - if (randoItemId == RI_UNKNOWN) { - return; - } - - auto findSoulFlag = soulMap.find(randoItemId); + auto findSoulFlag = soulMap.find(ac->actor->id); if (findSoulFlag != soulMap.end()) { - if (!Flags_GetRandoInf(std::get<2>(findSoulFlag->second))) { - actor->colChkInfo.damage = 0; - *should = false; + RandoItemId randoItemId = findSoulFlag->second; + if (randoItemId != RI_UNKNOWN) { + + if (!Flags_GetRandoInf(RI_TO_RANDO_INF(randoItemId))) { + *should = false; + } } } }); @@ -172,22 +182,14 @@ void Rando::ActorBehavior::InitSoulsBehavior() { } }); - COND_VB_SHOULD(VB_DRAW_LOCK_ON_ARROW, IS_RANDO, { + COND_VB_SHOULD(VB_DRAW_LOCK_ON_ARROW, shouldEnemyInjure, { Actor* refActor = va_arg(args, Actor*); - - if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] && refActor->category == ACTORCAT_ENEMY) { - for (auto& [randoItemId, data] : soulMap) { - auto& actorList = std::get<1>(data); - - if (std::find(actorList.begin(), actorList.end(), refActor->id) != actorList.end()) { - if (!Flags_GetRandoInf(std::get<2>(data))) { - *should = false; - break; - } - } - } - if (!*should) { + auto findSoulFlag = soulMap.find(refActor->id); + if (findSoulFlag != soulMap.end()) { + RandoItemId randoItemId = findSoulFlag->second; + if (!Flags_GetRandoInf(RI_TO_RANDO_INF(randoItemId))) { DrawEnLight({ 155, 0, 0 }, { 1.0f, 1.0f, 1.0f }); + *should = false; } } }); diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.h b/mm/2s2h/Rando/ActorBehavior/Souls.h deleted file mode 100644 index 853b7fb2bf..0000000000 --- a/mm/2s2h/Rando/ActorBehavior/Souls.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef SOULS_H -#define SOULS_H - -#include "Rando/Rando.h" - -extern std::unordered_map, std::vector, RandoInf>> soulMap; - -#endif // SOULS_H diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index d2db1f80fb..d480a8f7a7 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -3,7 +3,6 @@ #include "2s2h/ShipInit.hpp" #include "2s2h/Rando/DrawFuncs.h" #include "2s2h_assets.h" -#include "ActorBehavior/Souls.h" extern "C" { #include "variables.h" @@ -402,10 +401,61 @@ void DrawAbilityItem(RandoItemId randoItemId, Actor* actor) { CLOSE_DISPS(gPlayState->state.gfxCtx); } +std::unordered_map> soulDrawMap = { + // { RI_SOUL_ALIEN, DrawArmos }, + { RI_SOUL_ARMOS, DrawArmos }, + { RI_SOUL_BAD_BAT, DrawBat }, + { RI_SOUL_BEAMOS, DrawBeamos }, + { RI_SOUL_BUBBLE, DrawBubble }, + { RI_SOUL_BOE, DrawBoe }, + { RI_SOUL_CHUCHU, DrawSlime }, + { RI_SOUL_DEATH_ARMOS, DrawDeathArmos }, + // { RI_SOUL_DEEP_PYTHON, DrawArmos }, + { RI_SOUL_DEKU_BABA, DrawDekuBaba }, + // { RI_SOUL_DEXIHAND, DrawArmos }, + { RI_SOUL_DINOLFOS, DrawDinolfos }, + { RI_SOUL_DODONGO, DrawDodongo }, + { RI_SOUL_DRAGONFLY, DrawGrasshopper }, + { RI_SOUL_EENO, DrawEeno }, + // { RI_SOUL_EYEGORE, DrawArmos }, + { RI_SOUL_FLYING_POT, DrawFlyingPot }, + { RI_SOUL_FREEZARD, DrawFreezard }, + // { RI_SOUL_GARO, DrawArmos }, + // { RI_SOUL_GARO_MASTER, DrawArmos }, + // { RI_SOUL_GEKKO, DrawArmos }, + // { RI_SOUL_GEKKO, DrawArmos }, + // { RI_SOUL_GIANT_BEE, DrawArmos }, + { RI_SOUL_GUAY, DrawGuay }, + { RI_SOUL_HIPLOOP, DrawHiploop }, + { RI_SOUL_IRON_KNUCKLE, DrawIronKnuckle }, + { RI_SOUL_KEESE, DrawKeese }, + { RI_SOUL_LEEVER, DrawLeever }, + { RI_SOUL_LIKE_LIKE, DrawLikeLike }, + { RI_SOUL_MAD_SCRUB, DrawMadScrub }, + { RI_SOUL_NEJIRON, DrawNejiron }, + { RI_SOUL_OCTOROK, DrawOctorok }, + { RI_SOUL_PEAHAT, DrawPeahat }, + // { RI_SOUL_PIRATE, DrawArmos }, + // { RI_SOUL_POE_SISTER, DrawArmos }, + { RI_SOUL_REAL_BOMBCHU, DrawRealBombchu }, + { RI_SOUL_REDEAD, DrawRedead }, + { RI_SOUL_SHELLBLADE, DrawShellBlade }, + { RI_SOUL_SKULLFISH, DrawSkullfish }, + { RI_SOUL_SKULLTULA, DrawSkulltula }, + { RI_SOUL_SNAPPER, DrawSnapper }, + { RI_SOUL_STALCHILD, DrawStalchild }, + // { RI_SOUL_TAKKURI, DrawArmos }, + { RI_SOUL_TEKTITE, DrawTektite }, + { RI_SOUL_WALLMASTER, DrawWallmaster }, + // { RI_SOUL_WART, DrawArmos }, + // { RI_SOUL_WIZROBE, DrawArmos }, + { RI_SOUL_WOLFOS, DrawWolfos }, +}; + void DrawSoul(RandoItemId randoItemId) { - auto it = soulMap.find(randoItemId); - if (it != soulMap.end()) { - std::get<0>(it->second)(); + auto it = soulDrawMap.find(randoItemId); + if (it != soulDrawMap.end()) { + it->second(); } } diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 84ea335e9b..ea048d35b6 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2957,7 +2957,7 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA, RANDO_INF_OBTAINED_SOUL_OF_PEAHATS, - RANDO_INF_OBTAINED_SOUL_OF_REAL_BOMBCHU, + RANDO_INF_OBTAINED_SOUL_OF_REAL_BOMBCHUS, RANDO_INF_OBTAINED_SOUL_OF_REDEADS, RANDO_INF_OBTAINED_SOUL_OF_SHELLBLADES, RANDO_INF_OBTAINED_SOUL_OF_SKULLFISH, diff --git a/mm/src/code/z_collision_check.c b/mm/src/code/z_collision_check.c index fa3955cc3e..8448b753da 100644 --- a/mm/src/code/z_collision_check.c +++ b/mm/src/code/z_collision_check.c @@ -3526,14 +3526,12 @@ void CollisionCheck_ApplyDamage(struct PlayState* play, CollisionCheckContext* c } } } - if (GameInteractor_Should(VB_APPLY_DAMAGE_TO_ACTOR, true, col->actor, elem->acDmgInfo.dmgFlags)) { - if (col->actor->colChkInfo.damageTable != NULL) { - col->actor->colChkInfo.damageEffect = effect; - } - if (!(col->acFlags & AC_HARD) || ((col->acFlags & AC_HARD) && (atElem->atDmgInfo.dmgFlags == 0x20000000))) { - if (col->actor->colChkInfo.damage < finalDamage) { - col->actor->colChkInfo.damage = finalDamage; - } + if (col->actor->colChkInfo.damageTable != NULL) { + col->actor->colChkInfo.damageEffect = effect; + } + if (!(col->acFlags & AC_HARD) || ((col->acFlags & AC_HARD) && (atElem->atDmgInfo.dmgFlags == 0x20000000))) { + if (col->actor->colChkInfo.damage < finalDamage) { + col->actor->colChkInfo.damage = finalDamage; } } } From 792cc438da762776f62faac4021f4d7a827cac31 Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Sat, 27 Dec 2025 10:12:46 -0500 Subject: [PATCH 29/34] Add enemy souls for closer parity with drops Stub out enemy draw funcs Use macros to streamline existing skeleton inits Logically account for enemy souls in CanKillEnemy Fix logical quirk with Ikana ice arrows --- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 72 +- mm/2s2h/Rando/ActorBehavior/Souls.h | 10 + mm/2s2h/Rando/DrawFuncs.cpp | 874 +++++--------------- mm/2s2h/Rando/DrawFuncs.h | 12 + mm/2s2h/Rando/DrawItem.cpp | 104 +-- mm/2s2h/Rando/GiveItem.cpp | 14 +- mm/2s2h/Rando/Logic/Logic.h | 6 + mm/2s2h/Rando/Logic/Regions/East.cpp | 3 +- mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp | 8 +- mm/2s2h/Rando/StaticData/Items.cpp | 24 + mm/2s2h/Rando/Types.h | 24 + 11 files changed, 392 insertions(+), 759 deletions(-) create mode 100644 mm/2s2h/Rando/ActorBehavior/Souls.h diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 4e57232492..7020b9c3ec 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -1,6 +1,8 @@ #include "ActorBehavior.h" +#include "Souls.h" #include #include "Rando/DrawFuncs.h" +#include "Rando/Logic/Logic.h" extern "C" { #include "variables.h" @@ -22,14 +24,11 @@ bool shouldMajoraRegister() { return registerStatus; } -#define RI_TO_RANDO_INF(randoItemId) ((randoItemId - RI_SOUL_ARMOS) + RANDO_INF_OBTAINED_SOUL_OF_ARMOS) - // clang-format off -std::unordered_map soulMap = { - // TODO: Combine all Poes into one soul? regular, big, sisters. regular and big have no drops as of yet +std::unordered_map enemySoulMap = { // TODO: Special cases: Igos du Ikana, Captain Keeta // FIXME: Real Bomchus and flying pots don't depend on attack collision to die; they can die from hitting anything - // { ACTOR_EN_INVADEPOH, RI_SOUL_ALIEN }, + { ACTOR_EN_INVADEPOH, RI_SOUL_ALIEN }, { ACTOR_EN_AM, RI_SOUL_ARMOS }, { ACTOR_EN_BAT, RI_SOUL_BAD_BAT }, { ACTOR_EN_VM, RI_SOUL_BEAMOS }, @@ -38,23 +37,23 @@ std::unordered_map soulMap = { { ACTOR_EN_MKK, RI_SOUL_BOE }, { ACTOR_EN_SLIME, RI_SOUL_CHUCHU }, { ACTOR_EN_FAMOS, RI_SOUL_DEATH_ARMOS }, - // { ACTOR_EN_DRAGON, RI_SOUL_DEEP_PYTHON }, + { ACTOR_EN_DRAGON, RI_SOUL_DEEP_PYTHON }, { ACTOR_EN_DEKUBABA, RI_SOUL_DEKU_BABA }, { ACTOR_EN_KAREBABA, RI_SOUL_DEKU_BABA }, { ACTOR_BOSS_05, RI_SOUL_DEKU_BABA }, - // { ACTOR_EN_WDHAND, RI_SOUL_DEXIHAND }, + { ACTOR_EN_WDHAND, RI_SOUL_DEXIHAND }, { ACTOR_EN_DINOFOS, RI_SOUL_DINOLFOS }, { ACTOR_EN_DODONGO, RI_SOUL_DODONGO }, { ACTOR_EN_GRASSHOPPER, RI_SOUL_DRAGONFLY }, { ACTOR_EN_SNOWMAN, RI_SOUL_EENO }, - // { ACTOR_EN_EGOL, RI_SOUL_EYEGORE }, + { ACTOR_EN_EGOL, RI_SOUL_EYEGORE }, { ACTOR_EN_TUBO_TRAP, RI_SOUL_FLYING_POT }, { ACTOR_EN_FZ, RI_SOUL_FREEZARD }, - // { ACTOR_EN_JSO, RI_SOUL_GARO }, - // { ACTOR_EN_JSO2, RI_SOUL_GARO_MASTER }, - // { ACTOR_EN_BIGSLIME, RI_SOUL_GEKKO }, - // { ACTOR_EN_PAMETFROG, RI_SOUL_GEKKO }, - // { ACTOR_EN_BEE, RI_SOUL_GIANT_BEE }, + { ACTOR_EN_JSO, RI_SOUL_GARO }, + { ACTOR_EN_JSO2, RI_SOUL_GARO }, + { ACTOR_EN_BIGSLIME, RI_SOUL_GEKKO }, + { ACTOR_EN_PAMETFROG, RI_SOUL_GEKKO }, + { ACTOR_EN_BEE, RI_SOUL_GIANT_BEE }, { ACTOR_EN_CROW, RI_SOUL_GUAY }, { ACTOR_EN_RUPPECROW, RI_SOUL_GUAY }, { ACTOR_EN_PP, RI_SOUL_HIPLOOP }, @@ -66,8 +65,10 @@ std::unordered_map soulMap = { { ACTOR_EN_BAGUO, RI_SOUL_NEJIRON }, { ACTOR_EN_OKUTA, RI_SOUL_OCTOROK }, { ACTOR_EN_PEEHAT, RI_SOUL_PEAHAT }, - // { ACTOR_EN_KAIZOKU, RI_SOUL_PIRATE }, - // { ACTOR_EN_PO_SISTERS, RI_SOUL_POE_SISTER }, + { ACTOR_EN_KAIZOKU, RI_SOUL_PIRATE }, + { ACTOR_EN_BIGPO, RI_SOUL_POE }, + { ACTOR_EN_PO_SISTERS, RI_SOUL_POE }, + { ACTOR_EN_POH, RI_SOUL_POE }, { ACTOR_EN_RAT, RI_SOUL_REAL_BOMBCHU }, { ACTOR_EN_RD, RI_SOUL_REDEAD }, { ACTOR_EN_SB, RI_SOUL_SHELLBLADE }, @@ -81,16 +82,29 @@ std::unordered_map soulMap = { { ACTOR_EN_HINT_SKB, RI_SOUL_STALCHILD }, { ACTOR_EN_RAIL_SKB, RI_SOUL_STALCHILD }, { ACTOR_EN_SKB, RI_SOUL_STALCHILD }, - // { ACTOR_EN_THIEFBIRD, RI_SOUL_TAKKURI }, + { ACTOR_EN_THIEFBIRD, RI_SOUL_TAKKURI }, { ACTOR_EN_TITE, RI_SOUL_TEKTITE }, { ACTOR_EN_FLOORMAS, RI_SOUL_WALLMASTER }, { ACTOR_EN_WALLMAS, RI_SOUL_WALLMASTER }, - // { ACTOR_BOSS_04, RI_SOUL_WART }, - // { ACTOR_EN_WIZ, RI_SOUL_WIZROBE }, + { ACTOR_BOSS_04, RI_SOUL_WART }, + { ACTOR_EN_TANRON2, RI_SOUL_WART }, + { ACTOR_EN_WIZ, RI_SOUL_WIZROBE }, { ACTOR_EN_WF, RI_SOUL_WOLFOS }, }; // clang-format on +bool HaveEnemySoul(ActorId enemyId) { + auto findSoulFlag = enemySoulMap.find(enemyId); + if (findSoulFlag != enemySoulMap.end()) { + RandoItemId randoItemId = findSoulFlag->second; + if (randoItemId != RI_UNKNOWN) { + return Flags_GetRandoInf(ENEMY_SOUL_RI_TO_RANDO_INF(randoItemId)); + } + } + // Enemy soul does not exist, so act as if it is obtained + return true; +} + void ShouldActorUpdate(Actor* actor, bool* should, RandoInf randoInf) { if (!Flags_GetRandoInf(randoInf)) { *should = false; @@ -113,17 +127,7 @@ void Rando::ActorBehavior::InitSoulsBehavior() { COND_VB_SHOULD(VB_PERFORM_AC_COLLISION, shouldEnemyInjure, { Collider* at = va_arg(args, Collider*); Collider* ac = va_arg(args, Collider*); - - auto findSoulFlag = soulMap.find(ac->actor->id); - if (findSoulFlag != soulMap.end()) { - RandoItemId randoItemId = findSoulFlag->second; - if (randoItemId != RI_UNKNOWN) { - - if (!Flags_GetRandoInf(RI_TO_RANDO_INF(randoItemId))) { - *should = false; - } - } - } + *should = HaveEnemySoul((ActorId)ac->actor->id); }); // ShouldActorDraw & ShouldActorUpdate for Boss Souls @@ -184,13 +188,9 @@ void Rando::ActorBehavior::InitSoulsBehavior() { COND_VB_SHOULD(VB_DRAW_LOCK_ON_ARROW, shouldEnemyInjure, { Actor* refActor = va_arg(args, Actor*); - auto findSoulFlag = soulMap.find(refActor->id); - if (findSoulFlag != soulMap.end()) { - RandoItemId randoItemId = findSoulFlag->second; - if (!Flags_GetRandoInf(RI_TO_RANDO_INF(randoItemId))) { - DrawEnLight({ 155, 0, 0 }, { 1.0f, 1.0f, 1.0f }); - *should = false; - } + if (!HaveEnemySoul((ActorId)refActor->id)) { + DrawEnLight({ 155, 0, 0 }, { 1.0f, 1.0f, 1.0f }); + *should = false; } }); } diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.h b/mm/2s2h/Rando/ActorBehavior/Souls.h new file mode 100644 index 0000000000..e030372613 --- /dev/null +++ b/mm/2s2h/Rando/ActorBehavior/Souls.h @@ -0,0 +1,10 @@ +#ifndef SOULS_H +#define SOULS_H + +#include "Rando/Rando.h" + +#define ENEMY_SOUL_RI_TO_RANDO_INF(randoItemId) ((randoItemId - RI_SOUL_ALIEN) + RANDO_INF_OBTAINED_SOUL_OF_ALIENS) + +extern bool HaveEnemySoul(ActorId enemyId); + +#endif // SOULS_H \ No newline at end of file diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index dbb1707617..dad64d6673 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -21,20 +21,23 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec /* Majora */ #include "objects/object_boss07/object_boss07.h" // Enemy Includes +/* Alien */ #include "assets/objects/object_uch/object_uch.h" /* Armos */ #include "assets/objects/object_am/object_am.h" /* Bad Bat */ #include "assets/objects/object_bat/object_bat.h" /* Beamos */ #include "assets/objects/object_vm/object_vm.h" /* Boe */ #include "assets/objects/object_mkk/object_mkk.h" -/* Rat */ #include "assets/objects/object_rat/object_rat.h" +/* Chuchu */ #include "assets/objects/object_slime/object_slime.h" /* Bubble */ #include "assets/objects/object_bb/object_bb.h" /* Death Armos */ #include "assets/objects/object_famos/object_famos.h" +/* Deep Python */ #include "assets/objects/object_utubo/object_utubo.h" /* Deku Baba */ #include "assets/objects/object_dekubaba/object_dekubaba.h" +/* Dexihand */ #include "assets/objects/object_wdhand/object_wdhand.h" /* Dinolfos */ #include "assets/objects/object_dinofos/object_dinofos.h" /* Dodongo */ #include "assets/objects/object_dodongo/object_dodongo.h" +/* Dragonfly */ #include "assets/objects/object_grasshopper/object_grasshopper.h" /* Eeno */ #include "assets/objects/object_snowman/object_snowman.h" /* Flying Pot */ #include "assets/objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" /* Freezard */ #include "assets/objects/object_fz/object_fz.h" -/* Grasshopper */ #include "assets/objects/object_grasshopper/object_grasshopper.h" /* Guay */ #include "assets/objects/object_crow/object_crow.h" /* Hiploop */ #include "assets/objects/object_pp/object_pp.h" /* Iron Knuckle */ #include "assets/objects/object_ik/object_ik.h" @@ -45,11 +48,11 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec /* Nejiron */ #include "assets/objects/object_gmo/object_gmo.h" /* Octorok */ #include "assets/objects/object_okuta/object_okuta.h" /* Peehat */ #include "assets/objects/object_ph/object_ph.h" +/* Real Bombchu */ #include "assets/objects/object_rat/object_rat.h" /* Redead */ #include "assets/objects/object_rd/object_rd.h" /* Shellblade */ #include "assets/objects/object_sb/object_sb.h" /* Skullfish */ #include "assets/objects/object_pr/object_pr.h" /* Skulltula */ #include "assets/objects/object_st/object_st.h" -/* Slimes */ #include "assets/objects/object_slime/object_slime.h" /* Snapper */ #include "assets/objects/object_tl/object_tl.h" /* Stalchild */ #include "assets/objects/object_skb/object_skb.h" /* Tektite */ #include "assets/objects/object_tite/object_tite.h" @@ -61,6 +64,28 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec // clang-format on } +#define SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT, INIT_TYPE, HEADER_TYPE) \ + static bool initialized = false; \ + static SkelAnime skelAnime; \ + static Vec3s jointTable[LIMB_MAX]; \ + static Vec3s morphTable[LIMB_MAX]; \ + static u32 lastUpdate = 0; \ + INIT if (!initialized) { \ + initialized = true; \ + INIT_TYPE(gPlayState, &skelAnime, (HEADER_TYPE*)&SKEL_HEADER, (AnimationHeader*)&ANIM_HEADER, jointTable, \ + morphTable, LIMB_MAX); \ + } \ + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { \ + lastUpdate = gPlayState->state.frames; \ + SkelAnime_Update(&skelAnime); \ + } + +#define SETUP_SKEL(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT) \ + SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT, SkelAnime_Init, SkeletonHeader) + +#define SETUP_FLEX_SKEL(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT) \ + SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT, SkelAnime_InitFlex, FlexSkeletonHeader) + // Soul Effects extern void DrawEnLight(Color_RGB8 flameColor, Vec3f flameSize) { Gfx* sp68; @@ -141,8 +166,6 @@ void DrawEnFirefly_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec } void DrawEnRealBombchu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* rat) { - // Gfx* gfx = play->state.gfxCtx->polyOpa.p; - if (limbIndex == REAL_BOMBCHU_LIMB_TAIL_END) { OPEN_DISPS(play->state.gfxCtx); Matrix_ReplaceRotation(&play->billboardMtxF); @@ -159,7 +182,7 @@ void DrawEnRealBombchu_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, s32 DrawEnSkb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { s16 sins; - if (limbIndex == 11) { + if (limbIndex == STALCHILD_LIMB_HEAD) { OPEN_DISPS(play->state.gfxCtx); sins = fabsf(Math_SinS(play->gameplayFrames * 6000) * 95.0f) + 160.0f; @@ -187,27 +210,26 @@ void DrawEnIk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r } // Enemy Soul Draw Functions -extern void DrawArmos() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[OBJECT_AM_LIMB_MAX]; - static Vec3s morphTable[OBJECT_AM_LIMB_MAX]; - static u32 lastUpdate = 0; +extern void DrawAlien() { + SETUP_FLEX_SKEL(ALIEN_LIMB_MAX, gAlienSkel, gAlienFloatAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY);); - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3100, 0, MTXMODE_APPLY); + // FIXME: The eyes sporadically vanish. Come back to this. + Scene_SetRenderModeXlu(gPlayState, 0, 1); + AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gAlienEmptyTexAnim)); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_am_Skel_005948, - (AnimationHeader*)&gArmosHopAnim, jointTable, morphTable, OBJECT_AM_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 10, 138, 46 }, { 30.0f, 30.0f, 30.0f }); +} + +extern void DrawArmos() { + SETUP_SKEL(OBJECT_AM_LIMB_MAX, object_am_Skel_005948, gArmosHopAnim, + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3100, 0, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -252,26 +274,9 @@ extern void DrawBat() { } extern void DrawBeamos() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[11]; - static Vec3s morphTable[11]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3200, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gBeamosSkel, (AnimationHeader*)&gBeamosAnim, - jointTable, morphTable, 11); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(BEAMOS_LIMB_MAX, gBeamosSkel, gBeamosAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3200, 0, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -280,12 +285,6 @@ extern void DrawBeamos() { } extern void DrawBoe() { - static Gfx* sBoeDLists[4] = { - (Gfx*)gBlackBoeBodyMaterialDL, - (Gfx*)gBlackBoeBodyModelDL, - (Gfx*)gBlackBoeEndDL, - (Gfx*)gBlackBoeEyesDL, - }; static Color_RGBA8 D_80A4F7C4 = { 0, 0, 0, 255 }; OPEN_DISPS(gPlayState->state.gfxCtx); @@ -317,27 +316,9 @@ extern void DrawBoe() { } extern void DrawRealBombchu() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[REAL_BOMBCHU_LIMB_MAX]; - static Vec3s morphTable[REAL_BOMBCHU_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gRealBombchuSkel, - (AnimationHeader*)&gRealBombchuRunAnim, jointTable, morphTable, REAL_BOMBCHU_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_FLEX_SKEL(REAL_BOMBCHU_LIMB_MAX, gRealBombchuSkel, gRealBombchuRunAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY);); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, DrawEnRealBombchu_PostLimbDraw, NULL); @@ -347,25 +328,8 @@ extern void DrawRealBombchu() { } extern void DrawBubble() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[BUBBLE_LIMB_MAX]; - static Vec3s morphTable[BUBBLE_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gBubbleSkel, (AnimationHeader*)&gBubbleFlyingAnim, - jointTable, morphTable, BUBBLE_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(BUBBLE_LIMB_MAX, gBubbleSkel, gBubbleFlyingAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -374,27 +338,10 @@ extern void DrawBubble() { } extern void DrawDeathArmos() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[FAMOS_LIMB_MAX]; - static Vec3s morphTable[FAMOS_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)gFamosNormalGlowingEmblemTexAnim); - Matrix_Scale(0.008f, 0.008f, 0.008f, MTXMODE_APPLY); - Matrix_Translate(0, -4100, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gFamosSkel, (AnimationHeader*)&gFamosIdleAnim, - jointTable, morphTable, FAMOS_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(FAMOS_LIMB_MAX, gFamosSkel, gFamosIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)gFamosNormalGlowingEmblemTexAnim); + Matrix_Scale(0.008f, 0.008f, 0.008f, MTXMODE_APPLY); Matrix_Translate(0, -4100, 0, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -402,27 +349,25 @@ extern void DrawDeathArmos() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } -extern void DrawDekuBaba() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[DEKUBABA_LIMB_MAX]; - static Vec3s morphTable[DEKUBABA_LIMB_MAX]; - static u32 lastUpdate = 0; +extern void DrawDeepPython() { + if (false) { // FIXME: This crashes + SETUP_SKEL(DEEP_PYTHON_LIMB_MAX, gDeepPythonSkel, gDeepPythonSmallSideSwayAnim, + OPEN_DISPS(gPlayState->state.gfxCtx); + Matrix_Scale(0.008f, 0.008f, 0.008f, MTXMODE_APPLY); Matrix_Translate(0, -4100, 0, MTXMODE_APPLY);); - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - Matrix_Translate(0, 0, 0, MTXMODE_APPLY); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + // Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, + NULL); - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gDekuBabaSkel, - (AnimationHeader*)&gDekuBabaFastChompAnim, jointTable, morphTable, DEKUBABA_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } +} + +extern void DrawDekuBaba() { + SETUP_SKEL(DEKUBABA_LIMB_MAX, gDekuBabaSkel, gDekuBabaFastChompAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -430,28 +375,19 @@ extern void DrawDekuBaba() { DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); } -extern void DrawDinolfos() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[DINOLFOS_LIMB_MAX]; - static Vec3s morphTable[DINOLFOS_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); +extern void DrawDexihand() { + SETUP_SKEL(DEXIHAND_LIMB_MAX, gDexihandSkel, gDexihandIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); +} - Matrix_Scale(0.014f, 0.014f, 0.014f, MTXMODE_APPLY); - Matrix_Translate(0, -2200.0f, 0, MTXMODE_APPLY); +extern void DrawDinolfos() { + SETUP_FLEX_SKEL(DINOLFOS_LIMB_MAX, gDinolfosSkel, gDinolfosIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.014f, 0.014f, 0.014f, MTXMODE_APPLY); + Matrix_Translate(0, -2200.0f, 0, MTXMODE_APPLY);); - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gDinolfosSkel, - (AnimationHeader*)&gDinolfosIdleAnim, jointTable, morphTable, DINOLFOS_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } Scene_SetRenderModeXlu(gPlayState, 0, 1); gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)&gDinolfosEyeOpenTex); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -461,26 +397,10 @@ extern void DrawDinolfos() { } extern void DrawDodongo() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[OBJECT_DODONGO_LIMB_MAX]; - static Vec3s morphTable[OBJECT_DODONGO_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_dodongo_Skel_008318, - (AnimationHeader*)&object_dodongo_Anim_004C20, jointTable, morphTable, OBJECT_DODONGO_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(OBJECT_DODONGO_LIMB_MAX, object_dodongo_Skel_008318, object_dodongo_Anim_004C20, + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -489,27 +409,10 @@ extern void DrawDodongo() { } extern void DrawEeno() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[EENO_LIMB_MAX]; - static Vec3s morphTable[EENO_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(EENO_LIMB_MAX, gEenoSkel, gEenoIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY);); - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gEenoSkel, (AnimationHeader*)&gEenoIdleAnim, - jointTable, morphTable, EENO_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } Scene_SetRenderModeXlu(gPlayState, 0, 1); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -517,6 +420,10 @@ extern void DrawEeno() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } +extern void DrawEyegore() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement + extern void DrawFlyingPot() { OPEN_DISPS(gPlayState->state.gfxCtx); Matrix_Scale(0.3f, 0.3f, 0.3f, MTXMODE_APPLY); @@ -548,27 +455,22 @@ extern void DrawFreezard() { DrawEnLight({ 155, 155, 155 }, { 20.0f, 20.0f, 20.0f }); } -extern void DrawGrasshopper() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[DRAGONFLY_LIMB_MAX]; - static Vec3s morphTable[DRAGONFLY_LIMB_MAX]; - static u32 lastUpdate = 0; +extern void DrawGaro() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); +extern void DrawGekko() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gDragonflySkel, (AnimationHeader*)&gDragonflyFlyAnim, - jointTable, morphTable, DRAGONFLY_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } +extern void DrawGiantBee() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement + +extern void DrawGrasshopper() { // TODO: Rename to Dragonfly + SETUP_SKEL(DRAGONFLY_LIMB_MAX, gDragonflySkel, gDragonflyFlyAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -577,27 +479,9 @@ extern void DrawGrasshopper() { } extern void DrawGuay() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[OBJECT_CROW_LIMB_MAX]; - static Vec3s morphTable[OBJECT_CROW_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - Matrix_Translate(0, 0, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gGuaySkel, (AnimationHeader*)&gGuayFlyAnim, - jointTable, morphTable, OBJECT_CROW_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_FLEX_SKEL(OBJECT_CROW_LIMB_MAX, gGuaySkel, gGuayFlyAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -606,27 +490,10 @@ extern void DrawGuay() { } extern void DrawHiploop() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[HIPLOOP_LIMB_MAX]; - static Vec3s morphTable[HIPLOOP_LIMB_MAX]; - static u32 lastUpdate = 0; + SETUP_FLEX_SKEL(HIPLOOP_LIMB_MAX, gHiploopSkel, gHiploopChargeAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, -1400.0f, 0, MTXMODE_APPLY);); - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - Matrix_Translate(0, -1400.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gHiploopSkel, - (AnimationHeader*)&gHiploopChargeAnim, jointTable, morphTable, HIPLOOP_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } Scene_SetRenderModeXlu(gPlayState, 0, 1); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -635,27 +502,9 @@ extern void DrawHiploop() { } extern void DrawIronKnuckle() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[IRON_KNUCKLE_LIMB_MAX]; - static Vec3s morphTable[IRON_KNUCKLE_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gIronKnuckleSkel, - (AnimationHeader*)&gIronKnuckleWalkAnim, jointTable, morphTable, IRON_KNUCKLE_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_FLEX_SKEL(IRON_KNUCKLE_LIMB_MAX, gIronKnuckleSkel, gIronKnuckleWalkAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY);); Gfx* gfx = POLY_XLU_DISP; gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); @@ -675,26 +524,9 @@ extern void DrawIronKnuckle() { } extern void DrawKeese() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[FIRE_KEESE_LIMB_MAX]; - static Vec3s morphTable[FIRE_KEESE_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gFireKeeseSkel, (AnimationHeader*)&gFireKeeseFlyAnim, - jointTable, morphTable, FIRE_KEESE_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(FIRE_KEESE_LIMB_MAX, gFireKeeseSkel, gFireKeeseFlyAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, DrawEnFirefly_PostLimbDraw, NULL); @@ -702,27 +534,10 @@ extern void DrawKeese() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } -extern void DrawLeever() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[LEEVER_LIMB_MAX]; - static Vec3s morphTable[LEEVER_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); - Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gLeeverSkel, (AnimationHeader*)&gLeeverSpinAnim, - jointTable, morphTable, LEEVER_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } +extern void DrawLeever() { // TODO: Somehow don't spin it? It's so fast + SETUP_SKEL(LEEVER_LIMB_MAX, gLeeverSkel, gLeeverSpinAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY);); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x01, 255, 255, 255, 255); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -816,26 +631,9 @@ extern void DrawLikeLike() { } extern void DrawMadScrub() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[DEKU_SCRUB_LIMB_MAX]; - static Vec3s morphTable[DEKU_SCRUB_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -2300, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gDekuScrubSkel, - (AnimationHeader*)&gDekuScrubLookAroundAnim, jointTable, morphTable, DEKU_SCRUB_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(DEKU_SCRUB_LIMB_MAX, gDekuScrubSkel, gDekuScrubLookAroundAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2300, 0, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -844,27 +642,9 @@ extern void DrawMadScrub() { } extern void DrawNejiron() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[NEJIRON_LIMB_MAX]; - static Vec3s morphTable[NEJIRON_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Matrix_Scale(0.015f, 0.015f, 0.015f, MTXMODE_APPLY); - Matrix_Translate(0, 0, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gNejironSkel, (AnimationHeader*)&gNejironIdleAnim, - jointTable, morphTable, NEJIRON_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(NEJIRON_LIMB_MAX, gNejironSkel, gNejironIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Matrix_Scale(0.015f, 0.015f, 0.015f, MTXMODE_APPLY);); gSPSegment(POLY_OPA_DISP++, 8, (uintptr_t)gNejironEyeOpenTex); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -874,26 +654,10 @@ extern void DrawNejiron() { } extern void DrawOctorok() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[16]; - static Vec3s morphTable[16]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); - Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(OCTOROK_LIMB_MAX, gOctorokSkel, gOctorokFloatAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY);); - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gOctorokSkel, (AnimationHeader*)&gOctorokFloatAnim, - jointTable, morphTable, 16); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } Gfx* gfxPtr = POLY_OPA_DISP; gSPDisplayList(&gfxPtr[0], gSetupDLs[SETUPDL_25]); gSPSegment(&gfxPtr[1], 0x08, (uintptr_t)D_801AEFA0); @@ -906,25 +670,8 @@ extern void DrawOctorok() { } extern void DrawPeahat() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[24]; - static Vec3s morphTable[24]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_ph_Skel_001C80, - (AnimationHeader*)&object_ph_Anim_0009C4, jointTable, morphTable, 24); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(OBJECT_PH_LIMB_MAX, object_ph_Skel_001C80, object_ph_Anim_0009C4, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -932,7 +679,15 @@ extern void DrawPeahat() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } -extern void DrawRedead() { +extern void DrawPirate() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement + +extern void DrawPoe() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement + +extern void DrawRedead() { // TODO: Possibly downsize, may need to refactor SETUP_SKEL()? static bool initialized = false; static SkelAnime skelAnime; static Vec3s jointTable[REDEAD_LIMB_MAX]; @@ -991,27 +746,11 @@ extern void DrawRedead() { } extern void DrawShellBlade() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[9]; - static Vec3s morphTable[9]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + SETUP_FLEX_SKEL(OBJECT_SB_LIMB_MAX, object_sb_Skel_002BF0, object_sb_Anim_000194, + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY);); - Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); - Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&object_sb_Skel_002BF0, - (AnimationHeader*)&object_sb_Anim_000194, jointTable, morphTable, 9); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); @@ -1019,26 +758,9 @@ extern void DrawShellBlade() { } extern void DrawSkullfish() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[5]; - static Vec3s morphTable[5]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - Matrix_Translate(0, 0, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&object_pr_Skel_004188, - (AnimationHeader*)&object_pr_Anim_004340, jointTable, morphTable, 5); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_FLEX_SKEL(OBJECT_PR_2_LIMB_MAX, object_pr_Skel_004188, object_pr_Anim_004340, + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); Scene_SetRenderModeXlu(gPlayState, 0, 1); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -1048,26 +770,8 @@ extern void DrawSkullfish() { } extern void DrawSkulltula() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[30]; - static Vec3s morphTable[30]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); - Matrix_Translate(0, 0, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_st_Skel_005298, - (AnimationHeader*)&object_st_Anim_000304, jointTable, morphTable, 30); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(OBJECT_ST_LIMB_MAX, object_st_Skel_005298, object_st_Anim_000304, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -1108,27 +812,10 @@ extern void DrawSlime() { } extern void DrawSnapper() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[SNAPPER_LIMB_MAX]; - static Vec3s morphTable[SNAPPER_LIMB_MAX]; - static u32 lastUpdate = 0; - TexturePtr eyeTexture = Lib_SegmentedToVirtual((TexturePtr)gSnapperEyeOpenTex); - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3100.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gSnapperSkel, - (AnimationHeader*)&gSnapperIdleAnim, jointTable, morphTable, SNAPPER_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + static TexturePtr eyeTexture = Lib_SegmentedToVirtual((TexturePtr)gSnapperEyeOpenTex); + SETUP_FLEX_SKEL(SNAPPER_LIMB_MAX, gSnapperSkel, gSnapperIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3100.0f, 0, MTXMODE_APPLY);); gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)eyeTexture); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -1138,26 +825,9 @@ extern void DrawSnapper() { } extern void DrawStalchild() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[STALCHILD_LIMB_MAX]; - static Vec3s morphTable[STALCHILD_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3200, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gStalchildSkel, (AnimationHeader*)&gStalchildIdleAnim, - jointTable, morphTable, STALCHILD_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(STALCHILD_LIMB_MAX, gStalchildSkel, gStalchildIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3200, 0, MTXMODE_APPLY);); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, DrawEnSkb_OverrideLimbDraw, NULL, NULL); @@ -1165,13 +835,11 @@ extern void DrawStalchild() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } -extern void DrawTektite() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[25]; - static Vec3s morphTable[25]; - static u32 lastUpdate = 0; +extern void DrawTakkuri() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement +extern void DrawTektite() { static TexturePtr D_80896B24[2][3] = { { (TexturePtr*)&object_tite_Tex_001300, (TexturePtr*)&object_tite_Tex_001700, (TexturePtr*)&object_tite_Tex_001900 }, @@ -1179,20 +847,11 @@ extern void DrawTektite() { (TexturePtr*)&object_tite_Tex_002100 }, }; - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(OBJECT_TITE_LIMB_MAX, object_tite_Skel_003A20, object_tite_Anim_0012E4, + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY);); - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&object_tite_Skel_003A20, - (AnimationHeader*)&object_tite_Anim_0012E4, jointTable, morphTable, 25); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } Gfx* gfx = POLY_OPA_DISP; gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); @@ -1210,55 +869,28 @@ extern void DrawTektite() { } extern void DrawWallmaster() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[WALLMASTER_LIMB_MAX]; - static Vec3s morphTable[WALLMASTER_LIMB_MAX]; - static u32 lastUpdate = 0; + SETUP_FLEX_SKEL(WALLMASTER_LIMB_MAX, gWallmasterSkel, gWallmasterIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY);); - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY); - - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gWallmasterSkel, - (AnimationHeader*)&gWallmasterIdleAnim, jointTable, morphTable, WALLMASTER_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } -extern void DrawWolfos() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[WOLFOS_NORMAL_LIMB_MAX]; - static Vec3s morphTable[WOLFOS_NORMAL_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); +extern void DrawWart() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY); +extern void DrawWizrobe() { + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} // TODO: Implement - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gWolfosNormalSkel, - (AnimationHeader*)&gWolfosWaitAnim, jointTable, morphTable, WOLFOS_NORMAL_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } +extern void DrawWolfos() { + SETUP_FLEX_SKEL(WOLFOS_NORMAL_LIMB_MAX, gWolfosNormalSkel, gWolfosWaitAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY);); gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)&gWolfosNormalEyeOpenTex); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -1269,26 +901,10 @@ extern void DrawWolfos() { // Boss Souls extern void DrawGoht() { - OPEN_DISPS(gPlayState->state.gfxCtx); + SETUP_FLEX_SKEL(GOHT_LIMB_MAX, gGohtSkel, gGohtRunAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY);); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY); - - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[33]; - static Vec3s otherTable[33]; - static u32 lastUpdate = 0; - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gGohtSkel, (AnimationHeader*)&gGohtRunAnim, - jointTable, otherTable, 33); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)gGohtMetalPlateWithCirclePatternTex); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -1297,26 +913,10 @@ extern void DrawGoht() { } extern void DrawGyorg() { - OPEN_DISPS(gPlayState->state.gfxCtx); + SETUP_FLEX_SKEL(GYORG_LIMB_MAX, gGyorgSkel, gGyorgGentleSwimmingAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY);); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); - - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[15]; - static Vec3s otherTable[15]; - static u32 lastUpdate = 0; - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gGyorgSkel, - (AnimationHeader*)&gGyorgGentleSwimmingAnim, jointTable, otherTable, 15); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); @@ -1324,27 +924,11 @@ extern void DrawGyorg() { } extern void DrawOdolwa() { - OPEN_DISPS(gPlayState->state.gfxCtx); + SETUP_FLEX_SKEL(ODOLWA_LIMB_MAX, gOdolwaSkel, gOdolwaReadyAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY);); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY); - - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[52]; - static Vec3s otherTable[52]; - static u32 lastUpdate = 0; - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gOdolwaSkel, - (AnimationHeader*)&gOdolwaReadyAnim, jointTable, otherTable, 52); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); @@ -1352,25 +936,9 @@ extern void DrawOdolwa() { } extern void DrawTwinmold() { - OPEN_DISPS(gPlayState->state.gfxCtx); - - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.06f, 0.06f, 0.06f, MTXMODE_APPLY); - - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[13]; - static Vec3s otherTable[13]; - static u32 lastUpdate = 0; - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gTwinmoldHeadSkel, - (AnimationHeader*)&gTwinmoldHeadFlyAnim, jointTable, otherTable, 13); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_FLEX_SKEL(TWINMOLD_HEAD_LIMB_MAX, gTwinmoldHeadSkel, gTwinmoldHeadFlyAnim, + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.06f, 0.06f, 0.06f, MTXMODE_APPLY);); Mtx* mtxHead = (Mtx*)GRAPH_ALLOC(gPlayState->state.gfxCtx, 23 * sizeof(Mtx)); gSPSegment(POLY_OPA_DISP++, 0x0D, (uintptr_t)mtxHead); @@ -1382,28 +950,9 @@ extern void DrawTwinmold() { } extern void DrawMajora() { - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[MAJORAS_MASK_LIMB_MAX]; - static Vec3s morphTable[MAJORAS_MASK_LIMB_MAX]; - static u32 lastUpdate = 0; - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); - Matrix_Translate(0, 0, 0, MTXMODE_APPLY); - Matrix_ReplaceRotation(&gPlayState->billboardMtxF); - - if (!initialized) { - initialized = true; - SkelAnime_Init(gPlayState, &skelAnime, (SkeletonHeader*)&gMajorasMaskSkel, - (AnimationHeader*)&gMajorasMaskFloatingAnim, jointTable, morphTable, MAJORAS_MASK_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } + SETUP_SKEL(MAJORAS_MASK_LIMB_MAX, gMajorasMaskSkel, gMajorasMaskFloatingAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); Matrix_ReplaceRotation(&gPlayState->billboardMtxF);); gSPSegment(POLY_OPA_DISP++, 8, (uintptr_t)gMajorasMaskWithNormalEyesTex); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -1415,27 +964,10 @@ extern void DrawMajora() { // Other Actors extern void DrawMinifrog(RandoItemId randoItemId, Actor* actor) { - OPEN_DISPS(gPlayState->state.gfxCtx); - - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); - - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[FROG_LIMB_MAX]; - static Vec3s otherTable[FROG_LIMB_MAX]; + SETUP_FLEX_SKEL(FROG_LIMB_MAX, gFrogSkel, gFrogIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY);); Color_RGBA8 envColor = { 200, 170, 0, 255 }; // FROG_YELLOW - static u32 lastUpdate = 0; - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gFrogSkel, (AnimationHeader*)&gFrogIdleAnim, - jointTable, otherTable, FROG_LIMB_MAX); - } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); - } switch (randoItemId) { case RI_FROG_BLUE: diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index c16ee20f61..f3d16e892b 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -13,6 +13,7 @@ void DrawOdolwa(); void DrawTwinmold(); // Enemy Functions +void DrawAlien(); void DrawArmos(); void DrawBat(); void DrawBeamos(); @@ -20,12 +21,18 @@ void DrawBoe(); void DrawRealBombchu(); void DrawBubble(); void DrawDeathArmos(); +void DrawDeepPython(); void DrawDekuBaba(); +void DrawDexihand(); void DrawDinolfos(); void DrawDodongo(); void DrawEeno(); +void DrawEyegore(); void DrawFlyingPot(); void DrawFreezard(); +void DrawGaro(); +void DrawGekko(); +void DrawGiantBee(); void DrawGrasshopper(); void DrawGuay(); void DrawHiploop(); @@ -37,6 +44,8 @@ void DrawMadScrub(); void DrawNejiron(); void DrawOctorok(); void DrawPeahat(); +void DrawPirate(); +void DrawPoe(); void DrawRedead(); void DrawShellBlade(); void DrawSkullfish(); @@ -44,8 +53,11 @@ void DrawSkulltula(); void DrawSlime(); void DrawSnapper(); void DrawStalchild(); +void DrawTakkuri(); void DrawTektite(); void DrawWallmaster(); +void DrawWart(); +void DrawWizrobe(); void DrawWolfos(); // Other Actor Functions diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index d480a8f7a7..657b9db22d 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -401,56 +401,56 @@ void DrawAbilityItem(RandoItemId randoItemId, Actor* actor) { CLOSE_DISPS(gPlayState->state.gfxCtx); } +// clang-format off std::unordered_map> soulDrawMap = { - // { RI_SOUL_ALIEN, DrawArmos }, - { RI_SOUL_ARMOS, DrawArmos }, - { RI_SOUL_BAD_BAT, DrawBat }, - { RI_SOUL_BEAMOS, DrawBeamos }, - { RI_SOUL_BUBBLE, DrawBubble }, - { RI_SOUL_BOE, DrawBoe }, - { RI_SOUL_CHUCHU, DrawSlime }, - { RI_SOUL_DEATH_ARMOS, DrawDeathArmos }, - // { RI_SOUL_DEEP_PYTHON, DrawArmos }, - { RI_SOUL_DEKU_BABA, DrawDekuBaba }, - // { RI_SOUL_DEXIHAND, DrawArmos }, - { RI_SOUL_DINOLFOS, DrawDinolfos }, - { RI_SOUL_DODONGO, DrawDodongo }, - { RI_SOUL_DRAGONFLY, DrawGrasshopper }, - { RI_SOUL_EENO, DrawEeno }, - // { RI_SOUL_EYEGORE, DrawArmos }, - { RI_SOUL_FLYING_POT, DrawFlyingPot }, - { RI_SOUL_FREEZARD, DrawFreezard }, - // { RI_SOUL_GARO, DrawArmos }, - // { RI_SOUL_GARO_MASTER, DrawArmos }, - // { RI_SOUL_GEKKO, DrawArmos }, - // { RI_SOUL_GEKKO, DrawArmos }, - // { RI_SOUL_GIANT_BEE, DrawArmos }, - { RI_SOUL_GUAY, DrawGuay }, - { RI_SOUL_HIPLOOP, DrawHiploop }, + { RI_SOUL_ALIEN, DrawAlien }, + { RI_SOUL_ARMOS, DrawArmos }, + { RI_SOUL_BAD_BAT, DrawBat }, + { RI_SOUL_BEAMOS, DrawBeamos }, + { RI_SOUL_BUBBLE, DrawBubble }, + { RI_SOUL_BOE, DrawBoe }, + { RI_SOUL_CHUCHU, DrawSlime }, + { RI_SOUL_DEATH_ARMOS, DrawDeathArmos }, + { RI_SOUL_DEEP_PYTHON, DrawDeepPython }, + { RI_SOUL_DEKU_BABA, DrawDekuBaba }, + { RI_SOUL_DEXIHAND, DrawDexihand }, + { RI_SOUL_DINOLFOS, DrawDinolfos }, + { RI_SOUL_DODONGO, DrawDodongo }, + { RI_SOUL_DRAGONFLY, DrawGrasshopper }, + { RI_SOUL_EENO, DrawEeno }, + { RI_SOUL_EYEGORE, DrawEyegore }, + { RI_SOUL_FLYING_POT, DrawFlyingPot }, + { RI_SOUL_FREEZARD, DrawFreezard }, + { RI_SOUL_GARO, DrawGaro }, + { RI_SOUL_GEKKO, DrawGekko }, + { RI_SOUL_GIANT_BEE, DrawGiantBee }, + { RI_SOUL_GUAY, DrawGuay }, + { RI_SOUL_HIPLOOP, DrawHiploop }, { RI_SOUL_IRON_KNUCKLE, DrawIronKnuckle }, - { RI_SOUL_KEESE, DrawKeese }, - { RI_SOUL_LEEVER, DrawLeever }, - { RI_SOUL_LIKE_LIKE, DrawLikeLike }, - { RI_SOUL_MAD_SCRUB, DrawMadScrub }, - { RI_SOUL_NEJIRON, DrawNejiron }, - { RI_SOUL_OCTOROK, DrawOctorok }, - { RI_SOUL_PEAHAT, DrawPeahat }, - // { RI_SOUL_PIRATE, DrawArmos }, - // { RI_SOUL_POE_SISTER, DrawArmos }, + { RI_SOUL_KEESE, DrawKeese }, + { RI_SOUL_LEEVER, DrawLeever }, + { RI_SOUL_LIKE_LIKE, DrawLikeLike }, + { RI_SOUL_MAD_SCRUB, DrawMadScrub }, + { RI_SOUL_NEJIRON, DrawNejiron }, + { RI_SOUL_OCTOROK, DrawOctorok }, + { RI_SOUL_PEAHAT, DrawPeahat }, + { RI_SOUL_PIRATE, DrawPirate }, + { RI_SOUL_POE, DrawPoe }, { RI_SOUL_REAL_BOMBCHU, DrawRealBombchu }, - { RI_SOUL_REDEAD, DrawRedead }, - { RI_SOUL_SHELLBLADE, DrawShellBlade }, - { RI_SOUL_SKULLFISH, DrawSkullfish }, - { RI_SOUL_SKULLTULA, DrawSkulltula }, - { RI_SOUL_SNAPPER, DrawSnapper }, - { RI_SOUL_STALCHILD, DrawStalchild }, - // { RI_SOUL_TAKKURI, DrawArmos }, - { RI_SOUL_TEKTITE, DrawTektite }, - { RI_SOUL_WALLMASTER, DrawWallmaster }, - // { RI_SOUL_WART, DrawArmos }, - // { RI_SOUL_WIZROBE, DrawArmos }, - { RI_SOUL_WOLFOS, DrawWolfos }, + { RI_SOUL_REDEAD, DrawRedead }, + { RI_SOUL_SHELLBLADE, DrawShellBlade }, + { RI_SOUL_SKULLFISH, DrawSkullfish }, + { RI_SOUL_SKULLTULA, DrawSkulltula }, + { RI_SOUL_SNAPPER, DrawSnapper }, + { RI_SOUL_STALCHILD, DrawStalchild }, + { RI_SOUL_TAKKURI, DrawTakkuri }, + { RI_SOUL_TEKTITE, DrawTektite }, + { RI_SOUL_WALLMASTER, DrawWallmaster }, + { RI_SOUL_WART, DrawWart }, + { RI_SOUL_WIZROBE, DrawWizrobe }, + { RI_SOUL_WOLFOS, DrawWolfos }, }; +// clang-format on void DrawSoul(RandoItemId randoItemId) { auto it = soulDrawMap.find(randoItemId); @@ -563,6 +563,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_PROGRESSIVE_WALLET: Rando::DrawItem(Rando::ConvertItem(randoItemId), actor); break; + case RI_SOUL_ALIEN: case RI_SOUL_ARMOS: case RI_SOUL_BAD_BAT: case RI_SOUL_BEAMOS: @@ -570,13 +571,19 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_BUBBLE: case RI_SOUL_CHUCHU: case RI_SOUL_DEATH_ARMOS: + case RI_SOUL_DEEP_PYTHON: case RI_SOUL_DEKU_BABA: + case RI_SOUL_DEXIHAND: case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: case RI_SOUL_DRAGONFLY: case RI_SOUL_EENO: + case RI_SOUL_EYEGORE: case RI_SOUL_FLYING_POT: case RI_SOUL_FREEZARD: + case RI_SOUL_GARO: + case RI_SOUL_GEKKO: + case RI_SOUL_GIANT_BEE: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: case RI_SOUL_IRON_KNUCKLE: @@ -587,6 +594,8 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: case RI_SOUL_PEAHAT: + case RI_SOUL_PIRATE: + case RI_SOUL_POE: case RI_SOUL_REAL_BOMBCHU: case RI_SOUL_REDEAD: case RI_SOUL_SHELLBLADE: @@ -594,8 +603,11 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_SOUL_SKULLTULA: case RI_SOUL_SNAPPER: case RI_SOUL_STALCHILD: + case RI_SOUL_TAKKURI: case RI_SOUL_TEKTITE: case RI_SOUL_WALLMASTER: + case RI_SOUL_WART: + case RI_SOUL_WIZROBE: case RI_SOUL_WOLFOS: DrawSoul(randoItemId); break; diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 88ae9670d9..908e233d6d 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -273,6 +273,7 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_MAJORA: case RI_SOUL_ODOLWA: case RI_SOUL_TWINMOLD: + case RI_SOUL_ALIEN: case RI_SOUL_ARMOS: case RI_SOUL_BAD_BAT: case RI_SOUL_BEAMOS: @@ -280,13 +281,19 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_BUBBLE: case RI_SOUL_CHUCHU: case RI_SOUL_DEATH_ARMOS: + case RI_SOUL_DEEP_PYTHON: case RI_SOUL_DEKU_BABA: + case RI_SOUL_DEXIHAND: case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: case RI_SOUL_DRAGONFLY: case RI_SOUL_EENO: + case RI_SOUL_EYEGORE: case RI_SOUL_FLYING_POT: case RI_SOUL_FREEZARD: + case RI_SOUL_GARO: + case RI_SOUL_GEKKO: + case RI_SOUL_GIANT_BEE: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: case RI_SOUL_IRON_KNUCKLE: @@ -297,6 +304,8 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: case RI_SOUL_PEAHAT: + case RI_SOUL_PIRATE: + case RI_SOUL_POE: case RI_SOUL_REAL_BOMBCHU: case RI_SOUL_REDEAD: case RI_SOUL_SHELLBLADE: @@ -304,10 +313,13 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_SOUL_SKULLTULA: case RI_SOUL_SNAPPER: case RI_SOUL_STALCHILD: + case RI_SOUL_TAKKURI: case RI_SOUL_TEKTITE: case RI_SOUL_WALLMASTER: + case RI_SOUL_WART: + case RI_SOUL_WIZROBE: case RI_SOUL_WOLFOS: - Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ARMOS + (randoItemId - RI_SOUL_ARMOS)); + Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ALIENS + (randoItemId - RI_SOUL_ALIEN)); break; case RI_FROG_BLUE: SET_WEEKEVENTREG(WEEKEVENTREG_33_01); diff --git a/mm/2s2h/Rando/Logic/Logic.h b/mm/2s2h/Rando/Logic/Logic.h index 3665e82a59..0f5cb762b7 100644 --- a/mm/2s2h/Rando/Logic/Logic.h +++ b/mm/2s2h/Rando/Logic/Logic.h @@ -2,6 +2,7 @@ #define RANDO_LOGIC_H #include "Rando/Rando.h" +#include "Rando/ActorBehavior/Souls.h" #include "2s2h/GameInteractor/GameInteractor.h" #include "2s2h/ShipUtils.h" @@ -187,6 +188,11 @@ inline bool MeetsMoonRequirements() { } inline bool CanKillEnemy(ActorId EnemyId) { + // If enemy souls are shuffled, and the relevant soul is not obtained, we cannot kill that enemy. + if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] && !HaveEnemySoul(EnemyId)) { + return false; + } + switch (EnemyId) { case ACTOR_BOSS_01: // Odolwa return (CAN_USE_SWORD || CAN_BE_GORON || CAN_BE_ZORA || CAN_USE_EXPLOSIVE || CAN_USE_MAGIC_ARROW(FIRE) || diff --git a/mm/2s2h/Rando/Logic/Regions/East.cpp b/mm/2s2h/Rando/Logic/Regions/East.cpp index f3a69cd4c6..095ac26cb6 100644 --- a/mm/2s2h/Rando/Logic/Regions/East.cpp +++ b/mm/2s2h/Rando/Logic/Regions/East.cpp @@ -158,7 +158,8 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 9), ONE_WAY_EXIT, CAN_USE_ABILITY(SWIM)), }, .connections = { - CONNECTION(RR_IKANA_CANYON_UPPER, HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_MAGIC_ARROW(ICE) && Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS)), + // Octorok soul not needed; the player can also create ice platforms on the water itself. + CONNECTION(RR_IKANA_CANYON_UPPER, HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_MAGIC_ARROW(ICE)), CONNECTION(RR_IKANA_CANYON_GROTTO, CAN_USE_ABILITY(SWIM)), // TODO: Grotto mapping }, .events = { diff --git a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp index 948289f1f2..7d0640dc0d 100644 --- a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp +++ b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp @@ -262,11 +262,11 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES) { itemPool.push_back(boss); } else { - Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ARMOS + ((RandoItemId)boss - RI_SOUL_ARMOS)); + Flags_SetRandoInf(ENEMY_SOUL_RI_TO_RANDO_INF(boss)); } } - for (int i = RI_SOUL_ARMOS; i <= RI_SOUL_WOLFOS; i++) { + for (int i = RI_SOUL_ALIEN; i <= RI_SOUL_WOLFOS; i++) { bool shouldSkipSoul = false; for (auto& boss : bossSouls) { if (boss == (RandoItemId)i) { @@ -278,7 +278,7 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_YES) { itemPool.push_back((RandoItemId)i); } else { - Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ARMOS + ((RandoItemId)i - RI_SOUL_ARMOS)); + Flags_SetRandoInf(ENEMY_SOUL_RI_TO_RANDO_INF(i)); } } } @@ -454,7 +454,7 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { // Give INF for Enemy Soul if the option is OFF if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_NO) { - for (int i = RANDO_INF_OBTAINED_SOUL_OF_ARMOS; i <= RANDO_INF_OBTAINED_SOUL_OF_WOLFOS; i++) { + for (int i = RANDO_INF_OBTAINED_SOUL_OF_ALIENS; i <= RANDO_INF_OBTAINED_SOUL_OF_WOLFOS; i++) { Flags_SetRandoInf(i); } } diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 5f1d4accbb..221e9be0e7 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -171,6 +171,7 @@ std::map Items = { RI(RI_SONG_STORMS, "the", "Song of Storms", RITYPE_MAJOR, ITEM_SONG_STORMS, GI_NONE, GID_NONE), RI(RI_SONG_SUN, "the", "Sun's Song", RITYPE_MAJOR, ITEM_SONG_SUN, GI_NONE, GID_NONE), RI(RI_SONG_TIME, "the", "Song of Time", RITYPE_MAJOR, ITEM_SONG_TIME, GI_NONE, GID_NONE), + RI(RI_SOUL_ALIEN, "the", "Soul of Aliens", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_ARMOS, "the", "Soul of Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_BAD_BAT, "the", "Soul of Bad Bats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_BEAMOS, "the", "Soul of Beamos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), @@ -178,13 +179,19 @@ std::map Items = { RI(RI_SOUL_BUBBLE, "the", "Soul of Bubbles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_CHUCHU, "the", "Soul of Chuchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DEATH_ARMOS, "the", "Soul of Death Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_DEEP_PYTHON, "the", "Soul of Deep Pythons", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DEKU_BABA, "the", "Soul of Deku Babas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_DEXIHAND, "the", "Soul of Dexihands", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DINOLFOS, "the", "Soul of Dinolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DODONGO, "the", "Soul of Dodongos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_DRAGONFLY, "the", "Soul of Dragonflies", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_EENO, "the", "Soul of Eenos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_EYEGORE, "the", "Soul of Eyegores", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_FLYING_POT, "the", "Soul of Flying Pots", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_FREEZARD, "the", "Soul of Freezards", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_GARO, "the", "Soul of Garos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_GEKKO, "the", "Soul of Gekkos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_GIANT_BEE, "the", "Soul of Giant Bees", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_HIPLOOP, "the", "Soul of Hiploops", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), @@ -199,6 +206,8 @@ std::map Items = { RI(RI_SOUL_OCTOROK, "the", "Soul of Octoroks", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_ODOLWA, "the", "Soul of Odolwa", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_PEAHAT, "the", "Soul of Peahats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_PIRATE, "the", "Soul of Pirates", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_POE, "the", "Soul of Poes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_REAL_BOMBCHU, "the", "Soul of Real Bombchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_REDEAD, "the", "Soul of Redeads", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_SHELLBLADE, "the", "Soul of Shellblades", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), @@ -206,9 +215,12 @@ std::map Items = { RI(RI_SOUL_SKULLTULA, "the", "Soul of Skulltulas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_SNAPPER, "the", "Soul of Snappers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_STALCHILD, "the", "Soul of Stalchildren", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_TAKKURI, "the", "Soul of Takkuri", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_TEKTITE, "the", "Soul of Tektites", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_TWINMOLD, "the", "Soul of Twinmold", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_WALLMASTER, "the", "Soul of Wallmasters", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_WART, "the", "Soul of Warts", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_WIZROBE, "the", "Soul of Wizrobes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_SOUL_WOLFOS, "the", "Soul of Wolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_STONE_TOWER_BOSS_KEY, "the", "Stone Tower Boss Key", RITYPE_BOSS_KEY, ITEM_KEY_BOSS, GI_KEY_BOSS, GID_KEY_BOSS), RI(RI_STONE_TOWER_COMPASS, "the", "Stone Tower Compass", RITYPE_LESSER, ITEM_COMPASS, GI_COMPASS, GID_COMPASS), @@ -364,6 +376,7 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { case RI_SOUL_MAJORA: case RI_SOUL_ODOLWA: case RI_SOUL_TWINMOLD: + case RI_SOUL_ALIEN: case RI_SOUL_ARMOS: case RI_SOUL_BAD_BAT: case RI_SOUL_BEAMOS: @@ -371,13 +384,19 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { case RI_SOUL_BUBBLE: case RI_SOUL_CHUCHU: case RI_SOUL_DEATH_ARMOS: + case RI_SOUL_DEEP_PYTHON: case RI_SOUL_DEKU_BABA: + case RI_SOUL_DEXIHAND: case RI_SOUL_DINOLFOS: case RI_SOUL_DODONGO: case RI_SOUL_DRAGONFLY: case RI_SOUL_EENO: + case RI_SOUL_EYEGORE: case RI_SOUL_FLYING_POT: case RI_SOUL_FREEZARD: + case RI_SOUL_GARO: + case RI_SOUL_GEKKO: + case RI_SOUL_GIANT_BEE: case RI_SOUL_GUAY: case RI_SOUL_HIPLOOP: case RI_SOUL_IRON_KNUCKLE: @@ -388,6 +407,8 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { case RI_SOUL_NEJIRON: case RI_SOUL_OCTOROK: case RI_SOUL_PEAHAT: + case RI_SOUL_PIRATE: + case RI_SOUL_POE: case RI_SOUL_REAL_BOMBCHU: case RI_SOUL_REDEAD: case RI_SOUL_SHELLBLADE: @@ -395,8 +416,11 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { case RI_SOUL_SKULLTULA: case RI_SOUL_SNAPPER: case RI_SOUL_STALCHILD: + case RI_SOUL_TAKKURI: case RI_SOUL_TEKTITE: case RI_SOUL_WALLMASTER: + case RI_SOUL_WART: + case RI_SOUL_WIZROBE: case RI_SOUL_WOLFOS: return (const char*)gDungeonMapSkullTex; case RI_FROG_BLUE: diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index ea048d35b6..4d87c3e7d3 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2457,6 +2457,7 @@ typedef enum { RI_SONG_STORMS, RI_SONG_SUN, RI_SONG_TIME, + RI_SOUL_ALIEN, RI_SOUL_ARMOS, RI_SOUL_BAD_BAT, RI_SOUL_BEAMOS, @@ -2464,13 +2465,19 @@ typedef enum { RI_SOUL_BUBBLE, RI_SOUL_CHUCHU, RI_SOUL_DEATH_ARMOS, + RI_SOUL_DEEP_PYTHON, RI_SOUL_DEKU_BABA, + RI_SOUL_DEXIHAND, RI_SOUL_DINOLFOS, RI_SOUL_DODONGO, RI_SOUL_DRAGONFLY, RI_SOUL_EENO, + RI_SOUL_EYEGORE, RI_SOUL_FLYING_POT, RI_SOUL_FREEZARD, + RI_SOUL_GARO, + RI_SOUL_GEKKO, + RI_SOUL_GIANT_BEE, RI_SOUL_GOHT, RI_SOUL_GUAY, RI_SOUL_HIPLOOP, @@ -2485,6 +2492,8 @@ typedef enum { RI_SOUL_OCTOROK, RI_SOUL_ODOLWA, RI_SOUL_PEAHAT, + RI_SOUL_PIRATE, + RI_SOUL_POE, RI_SOUL_REAL_BOMBCHU, RI_SOUL_REDEAD, RI_SOUL_SHELLBLADE, @@ -2492,9 +2501,12 @@ typedef enum { RI_SOUL_SKULLTULA, RI_SOUL_SNAPPER, RI_SOUL_STALCHILD, + RI_SOUL_TAKKURI, RI_SOUL_TEKTITE, RI_SOUL_TWINMOLD, RI_SOUL_WALLMASTER, + RI_SOUL_WART, + RI_SOUL_WIZROBE, RI_SOUL_WOLFOS, RI_STONE_TOWER_BOSS_KEY, RI_STONE_TOWER_COMPASS, @@ -2929,6 +2941,7 @@ typedef enum { RANDO_INF_OBTAINED_LETTER_TO_MAMA, RANDO_INF_OBTAINED_LETTER_TO_KAFEI, RANDO_INF_OBTAINED_PENDANT_OF_MEMORIES, + RANDO_INF_OBTAINED_SOUL_OF_ALIENS, RANDO_INF_OBTAINED_SOUL_OF_ARMOS, RANDO_INF_OBTAINED_SOUL_OF_BAD_BATS, RANDO_INF_OBTAINED_SOUL_OF_BEAMOS, @@ -2936,13 +2949,19 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_BUBBLES, RANDO_INF_OBTAINED_SOUL_OF_CHUCHUS, RANDO_INF_OBTAINED_SOUL_OF_DEATH_ARMOS, + RANDO_INF_OBTAINED_SOUL_OF_DEEP_PYTHONS, RANDO_INF_OBTAINED_SOUL_OF_DEKU_BABAS, + RANDO_INF_OBTAINED_SOUL_OF_DEXIHANDS, RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS, RANDO_INF_OBTAINED_SOUL_OF_DODONGOS, RANDO_INF_OBTAINED_SOUL_OF_DRAGONFLIES, RANDO_INF_OBTAINED_SOUL_OF_EENOS, + RANDO_INF_OBTAINED_SOUL_OF_EYEGORES, RANDO_INF_OBTAINED_SOUL_OF_FLYING_POTS, RANDO_INF_OBTAINED_SOUL_OF_FREEZARDS, + RANDO_INF_OBTAINED_SOUL_OF_GAROS, + RANDO_INF_OBTAINED_SOUL_OF_GEKKOS, + RANDO_INF_OBTAINED_SOUL_OF_GIANT_BEES, RANDO_INF_OBTAINED_SOUL_OF_GOHT, RANDO_INF_OBTAINED_SOUL_OF_GUAYS, RANDO_INF_OBTAINED_SOUL_OF_HIPLOOPS, @@ -2957,6 +2976,8 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA, RANDO_INF_OBTAINED_SOUL_OF_PEAHATS, + RANDO_INF_OBTAINED_SOUL_OF_PIRATES, + RANDO_INF_OBTAINED_SOUL_OF_POES, RANDO_INF_OBTAINED_SOUL_OF_REAL_BOMBCHUS, RANDO_INF_OBTAINED_SOUL_OF_REDEADS, RANDO_INF_OBTAINED_SOUL_OF_SHELLBLADES, @@ -2964,9 +2985,12 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_SKULLTULAS, RANDO_INF_OBTAINED_SOUL_OF_SNAPPERS, RANDO_INF_OBTAINED_SOUL_OF_STALCHILDREN, + RANDO_INF_OBTAINED_SOUL_OF_TAKKURI, RANDO_INF_OBTAINED_SOUL_OF_TEKTITES, RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD, RANDO_INF_OBTAINED_SOUL_OF_WALLMASTERS, + RANDO_INF_OBTAINED_SOUL_OF_WARTS, + RANDO_INF_OBTAINED_SOUL_OF_WIZROBES, RANDO_INF_OBTAINED_SOUL_OF_WOLFOS, RANDO_INF_OBTAINED_SWIM, RANDO_INF_MAX, From 4962dae5e57b241f91f26e855c7ec87ec0cb1e86 Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:27:30 -0500 Subject: [PATCH 30/34] Draw everything --- mm/2s2h/Rando/DrawFuncs.cpp | 550 +++++++++++++++++++++++------------- mm/2s2h/Rando/DrawFuncs.h | 6 +- mm/2s2h/Rando/DrawItem.cpp | 4 +- 3 files changed, 364 insertions(+), 196 deletions(-) diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index dad64d6673..86f27a375e 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -11,6 +11,7 @@ extern "C" { #include "assets/objects/object_gi_reserve00/object_gi_reserve00.h" s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* enMini); +s32 EnRd_ShouldNotDance(PlayState* play); // clang-format off // Boss Includes @@ -36,8 +37,12 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec /* Dodongo */ #include "assets/objects/object_dodongo/object_dodongo.h" /* Dragonfly */ #include "assets/objects/object_grasshopper/object_grasshopper.h" /* Eeno */ #include "assets/objects/object_snowman/object_snowman.h" +/* Eyegore */ #include "assets/objects/object_eg/object_eg.h" /* Flying Pot */ #include "assets/objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" /* Freezard */ #include "assets/objects/object_fz/object_fz.h" +/* Garo */ #include "assets/objects/object_jso/object_jso.h" +/* Gekko */ #include "overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h" +/* Giant Bee */ #include "assets/objects/object_bee/object_bee.h" /* Guay */ #include "assets/objects/object_crow/object_crow.h" /* Hiploop */ #include "assets/objects/object_pp/object_pp.h" /* Iron Knuckle */ #include "assets/objects/object_ik/object_ik.h" @@ -48,6 +53,9 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec /* Nejiron */ #include "assets/objects/object_gmo/object_gmo.h" /* Octorok */ #include "assets/objects/object_okuta/object_okuta.h" /* Peehat */ #include "assets/objects/object_ph/object_ph.h" +/* Pirate */ #include "assets/objects/object_kz/object_kz.h" +/* Poe */ #include "assets/objects/object_po/object_po.h" +/* Poe */ #include "assets/objects/object_bigpo/object_bigpo.h" /* Real Bombchu */ #include "assets/objects/object_rat/object_rat.h" /* Redead */ #include "assets/objects/object_rd/object_rd.h" /* Shellblade */ #include "assets/objects/object_sb/object_sb.h" @@ -55,8 +63,11 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec /* Skulltula */ #include "assets/objects/object_st/object_st.h" /* Snapper */ #include "assets/objects/object_tl/object_tl.h" /* Stalchild */ #include "assets/objects/object_skb/object_skb.h" +/* Takkuri */ #include "assets/objects/object_thiefbird/object_thiefbird.h" /* Tektite */ #include "assets/objects/object_tite/object_tite.h" /* Wallmaster */ #include "assets/objects/object_wallmaster/object_wallmaster.h" +/* Wart */ #include "assets/objects/object_boss04/object_boss04.h" +/* Wizrobe */ #include "assets/objects/object_wiz/object_wiz.h" /* Wolfos */ #include "assets/objects/object_wf/object_wf.h" // Other Actor Includes @@ -64,13 +75,16 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec // clang-format on } -#define SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT, INIT_TYPE, HEADER_TYPE) \ - static bool initialized = false; \ - static SkelAnime skelAnime; \ - static Vec3s jointTable[LIMB_MAX]; \ - static Vec3s morphTable[LIMB_MAX]; \ - static u32 lastUpdate = 0; \ - INIT if (!initialized) { \ +#define SETUP_DRAW(LIMB_MAX) \ + static bool initialized = false; \ + static SkelAnime skelAnime; \ + static Vec3s jointTable[LIMB_MAX]; \ + static Vec3s morphTable[LIMB_MAX]; \ + static u32 lastUpdate = 0; \ + OPEN_DISPS(gPlayState->state.gfxCtx); + +#define SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT_TYPE, HEADER_TYPE) \ + if (!initialized) { \ initialized = true; \ INIT_TYPE(gPlayState, &skelAnime, (HEADER_TYPE*)&SKEL_HEADER, (AnimationHeader*)&ANIM_HEADER, jointTable, \ morphTable, LIMB_MAX); \ @@ -80,11 +94,11 @@ s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec SkelAnime_Update(&skelAnime); \ } -#define SETUP_SKEL(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT) \ - SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT, SkelAnime_Init, SkeletonHeader) +#define SETUP_SKEL(LIMB_MAX, SKEL_HEADER, ANIM_HEADER) \ + SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, SkelAnime_Init, SkeletonHeader) #define SETUP_FLEX_SKEL(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT) \ - SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT, SkelAnime_InitFlex, FlexSkeletonHeader) + SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, SkelAnime_InitFlex, FlexSkeletonHeader) // Soul Effects extern void DrawEnLight(Color_RGB8 flameColor, Vec3f flameSize) { @@ -209,15 +223,20 @@ void DrawEnIk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r } } +void EnKaizoku_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { + // Even if this does nothing, it must exist, as TransformLimbDrawOpa is not null checked before invocation. +} + // Enemy Soul Draw Functions extern void DrawAlien() { - SETUP_FLEX_SKEL(ALIEN_LIMB_MAX, gAlienSkel, gAlienFloatAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); - Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY);); + SETUP_DRAW(ALIEN_LIMB_MAX); + static uintptr_t eyeTexture = (uintptr_t)Lib_SegmentedToVirtual((TexturePtr)gAlienEyeTex); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(ALIEN_LIMB_MAX, gAlienSkel, gAlienFloatAnim); - // FIXME: The eyes sporadically vanish. Come back to this. - Scene_SetRenderModeXlu(gPlayState, 0, 1); - AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gAlienEmptyTexAnim)); + gSPSegment(POLY_OPA_DISP++, 0x08, eyeTexture); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); @@ -225,12 +244,13 @@ extern void DrawAlien() { } extern void DrawArmos() { - SETUP_SKEL(OBJECT_AM_LIMB_MAX, object_am_Skel_005948, gArmosHopAnim, - - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3100, 0, MTXMODE_APPLY);); + SETUP_DRAW(OBJECT_AM_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3100, 0, MTXMODE_APPLY); + SETUP_SKEL(OBJECT_AM_LIMB_MAX, object_am_Skel_005948, gArmosHopAnim); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); @@ -274,9 +294,11 @@ extern void DrawBat() { } extern void DrawBeamos() { - SETUP_SKEL(BEAMOS_LIMB_MAX, gBeamosSkel, gBeamosAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3200, 0, MTXMODE_APPLY);); + SETUP_DRAW(BEAMOS_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3200, 0, MTXMODE_APPLY); + SETUP_SKEL(BEAMOS_LIMB_MAX, gBeamosSkel, gBeamosAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -315,21 +337,11 @@ extern void DrawBoe() { DrawEnLight({ 155, 155, 155 }, { 1000.0f, 1000.0f, 1000.0f }); } -extern void DrawRealBombchu() { - SETUP_FLEX_SKEL(REAL_BOMBCHU_LIMB_MAX, gRealBombchuSkel, gRealBombchuRunAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY);); - - SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, - DrawEnRealBombchu_PostLimbDraw, NULL); - - CLOSE_DISPS(gPlayState->state.gfxCtx); - DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); -} - extern void DrawBubble() { - SETUP_SKEL(BUBBLE_LIMB_MAX, gBubbleSkel, gBubbleFlyingAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); + SETUP_DRAW(BUBBLE_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + SETUP_SKEL(BUBBLE_LIMB_MAX, gBubbleSkel, gBubbleFlyingAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -338,10 +350,12 @@ extern void DrawBubble() { } extern void DrawDeathArmos() { - SETUP_SKEL(FAMOS_LIMB_MAX, gFamosSkel, gFamosIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)gFamosNormalGlowingEmblemTexAnim); - Matrix_Scale(0.008f, 0.008f, 0.008f, MTXMODE_APPLY); Matrix_Translate(0, -4100, 0, MTXMODE_APPLY);); + SETUP_DRAW(FAMOS_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + AnimatedMat_Draw(gPlayState, (AnimatedMaterial*)gFamosNormalGlowingEmblemTexAnim); + Matrix_Scale(0.008f, 0.008f, 0.008f, MTXMODE_APPLY); + Matrix_Translate(0, -4100, 0, MTXMODE_APPLY); + SETUP_SKEL(FAMOS_LIMB_MAX, gFamosSkel, gFamosIdleAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -350,24 +364,22 @@ extern void DrawDeathArmos() { } extern void DrawDeepPython() { - if (false) { // FIXME: This crashes - SETUP_SKEL(DEEP_PYTHON_LIMB_MAX, gDeepPythonSkel, gDeepPythonSmallSideSwayAnim, - OPEN_DISPS(gPlayState->state.gfxCtx); - Matrix_Scale(0.008f, 0.008f, 0.008f, MTXMODE_APPLY); Matrix_Translate(0, -4100, 0, MTXMODE_APPLY);); - - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - // Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, - NULL); - - CLOSE_DISPS(gPlayState->state.gfxCtx); - DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); - } + SETUP_DRAW(DEEP_PYTHON_LIMB_MAX); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(DEEP_PYTHON_LIMB_MAX, gDeepPythonSkel, gDeepPythonUnusedSideSwayAnim); + + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } extern void DrawDekuBaba() { - SETUP_SKEL(DEKUBABA_LIMB_MAX, gDekuBabaSkel, gDekuBabaFastChompAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); + SETUP_DRAW(DEKUBABA_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + SETUP_SKEL(DEKUBABA_LIMB_MAX, gDekuBabaSkel, gDekuBabaFastChompAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -376,20 +388,28 @@ extern void DrawDekuBaba() { } extern void DrawDexihand() { - SETUP_SKEL(DEXIHAND_LIMB_MAX, gDexihandSkel, gDexihandIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); - SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + SETUP_DRAW(DEXIHAND_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(DEXIHAND_LIMB_MAX, gDexihandSkel, gDexihandIdleAnim); + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + CLOSE_DISPS(gPlayState->state.gfxCtx); - DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); + DrawEnLight({ 155, 155, 70 }, { 6.0f, 6.0f, 6.0f }); } extern void DrawDinolfos() { - SETUP_FLEX_SKEL(DINOLFOS_LIMB_MAX, gDinolfosSkel, gDinolfosIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.014f, 0.014f, 0.014f, MTXMODE_APPLY); - Matrix_Translate(0, -2200.0f, 0, MTXMODE_APPLY);); + static uintptr_t eyeTexture = (uintptr_t)Lib_SegmentedToVirtual((TexturePtr)gDinolfosEyeOpenTex); + SETUP_DRAW(DINOLFOS_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.014f, 0.014f, 0.014f, MTXMODE_APPLY); + Matrix_Translate(0, -2200.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(DINOLFOS_LIMB_MAX, gDinolfosSkel, gDinolfosIdleAnim); Scene_SetRenderModeXlu(gPlayState, 0, 1); - gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)&gDinolfosEyeOpenTex); + gSPSegment(POLY_OPA_DISP++, 0x08, eyeTexture); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); @@ -397,10 +417,24 @@ extern void DrawDinolfos() { } extern void DrawDodongo() { - SETUP_SKEL(OBJECT_DODONGO_LIMB_MAX, object_dodongo_Skel_008318, object_dodongo_Anim_004C20, - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(OBJECT_DODONGO_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.015f, 0.015f, 0.015f, MTXMODE_APPLY); + Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(OBJECT_DODONGO_LIMB_MAX, object_dodongo_Skel_008318, object_dodongo_Anim_004C20); + + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawDragonfly() { + SETUP_DRAW(DRAGONFLY_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(DRAGONFLY_LIMB_MAX, gDragonflySkel, gDragonflyFlyAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -409,20 +443,36 @@ extern void DrawDodongo() { } extern void DrawEeno() { - SETUP_FLEX_SKEL(EENO_LIMB_MAX, gEenoSkel, gEenoIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(EENO_LIMB_MAX); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(EENO_LIMB_MAX, gEenoSkel, gEenoIdleAnim); Scene_SetRenderModeXlu(gPlayState, 0, 1); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); - DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); + DrawEnLight({ 155, 155, 35 }, { 10.0f, 10.0f, 10.0f }); } extern void DrawEyegore() { - DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement + static AnimatedMaterial* sEyegoreEyeLaserTexAnim = + (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gEyegoreEyeLaserTexAnim); + SETUP_DRAW(EYEGORE_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.006f, 0.006f, 0.006f, MTXMODE_APPLY); + Matrix_Translate(0, -4000.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(EYEGORE_LIMB_MAX, gEyegoreSkel, gEyegoreUnusedWalkAnim); + + AnimatedMat_Draw(gPlayState, sEyegoreEyeLaserTexAnim); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + POLY_OPA_DISP = Play_SetFog(gPlayState, POLY_OPA_DISP); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 192, 192, 64 }, { 20.0f, 20.0f, 20.0f }); +} extern void DrawFlyingPot() { OPEN_DISPS(gPlayState->state.gfxCtx); @@ -456,21 +506,37 @@ extern void DrawFreezard() { } extern void DrawGaro() { - DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement + SETUP_DRAW(GARO_LIMB_MAX); + Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + SETUP_FLEX_SKEL(GARO_LIMB_MAX, gGaroSkel, gGaroIdleAnim); + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 150, 255, 150 }, { 8.0f, 8.0f, 8.0f }); +} extern void DrawGekko() { - DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement + SETUP_DRAW(GEKKO_LIMB_MAX); + Matrix_Scale(0.006f, 0.006f, 0.006f, MTXMODE_APPLY); + Matrix_Translate(0, -4100.0f, 0, MTXMODE_APPLY); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + SETUP_FLEX_SKEL(GEKKO_LIMB_MAX, gGekkoSkel, gGekkoBoxingStanceAnim); -extern void DrawGiantBee() { - DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); -extern void DrawGrasshopper() { // TODO: Rename to Dragonfly - SETUP_SKEL(DRAGONFLY_LIMB_MAX, gDragonflySkel, gDragonflyFlyAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY);); + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 150, 100, 255 }, { 20.0f, 20.0f, 20.0f }); +} + +extern void DrawGiantBee() { + SETUP_DRAW(OBJECT_BEE_LIMB_MAX); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + SETUP_SKEL(OBJECT_BEE_LIMB_MAX, gBeeSkel, gBeeFlyingAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -479,9 +545,11 @@ extern void DrawGrasshopper() { // TODO: Rename to Dragonfly } extern void DrawGuay() { - SETUP_FLEX_SKEL(OBJECT_CROW_LIMB_MAX, gGuaySkel, gGuayFlyAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); + SETUP_DRAW(OBJECT_CROW_LIMB_MAX); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(OBJECT_CROW_LIMB_MAX, gGuaySkel, gGuayFlyAnim); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -490,9 +558,11 @@ extern void DrawGuay() { } extern void DrawHiploop() { - SETUP_FLEX_SKEL(HIPLOOP_LIMB_MAX, gHiploopSkel, gHiploopChargeAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); - Matrix_Translate(0, -1400.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(HIPLOOP_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, -1400.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(HIPLOOP_LIMB_MAX, gHiploopSkel, gHiploopChargeAnim); Scene_SetRenderModeXlu(gPlayState, 0, 1); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -502,9 +572,11 @@ extern void DrawHiploop() { } extern void DrawIronKnuckle() { - SETUP_FLEX_SKEL(IRON_KNUCKLE_LIMB_MAX, gIronKnuckleSkel, gIronKnuckleWalkAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(IRON_KNUCKLE_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(IRON_KNUCKLE_LIMB_MAX, gIronKnuckleSkel, gIronKnuckleWalkAnim); Gfx* gfx = POLY_XLU_DISP; gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); @@ -524,9 +596,11 @@ extern void DrawIronKnuckle() { } extern void DrawKeese() { - SETUP_SKEL(FIRE_KEESE_LIMB_MAX, gFireKeeseSkel, gFireKeeseFlyAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(FIRE_KEESE_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(FIRE_KEESE_LIMB_MAX, gFireKeeseSkel, gFireKeeseFlyAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, DrawEnFirefly_PostLimbDraw, NULL); @@ -534,10 +608,15 @@ extern void DrawKeese() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } -extern void DrawLeever() { // TODO: Somehow don't spin it? It's so fast - SETUP_SKEL(LEEVER_LIMB_MAX, gLeeverSkel, gLeeverSpinAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); - Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY);); +extern void DrawLeever() { + SETUP_DRAW(LEEVER_LIMB_MAX); + // The Leever animation already spins in the same direction as the Get Item animation, which looks really fast. + // Reverse the animation so that it spins more slowly. + skelAnime.playSpeed = -1.0f; + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(LEEVER_LIMB_MAX, gLeeverSkel, gLeeverSpinAnim); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x01, 255, 255, 255, 255); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -631,9 +710,11 @@ extern void DrawLikeLike() { } extern void DrawMadScrub() { - SETUP_SKEL(DEKU_SCRUB_LIMB_MAX, gDekuScrubSkel, gDekuScrubLookAroundAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -2300, 0, MTXMODE_APPLY);); + SETUP_DRAW(DEKU_SCRUB_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2300, 0, MTXMODE_APPLY); + SETUP_SKEL(DEKU_SCRUB_LIMB_MAX, gDekuScrubSkel, gDekuScrubLookAroundAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -642,9 +723,11 @@ extern void DrawMadScrub() { } extern void DrawNejiron() { - SETUP_SKEL(NEJIRON_LIMB_MAX, gNejironSkel, gNejironIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Matrix_Scale(0.015f, 0.015f, 0.015f, MTXMODE_APPLY);); + SETUP_DRAW(NEJIRON_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Matrix_Scale(0.015f, 0.015f, 0.015f, MTXMODE_APPLY); + SETUP_SKEL(NEJIRON_LIMB_MAX, gNejironSkel, gNejironIdleAnim); gSPSegment(POLY_OPA_DISP++, 8, (uintptr_t)gNejironEyeOpenTex); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -654,9 +737,11 @@ extern void DrawNejiron() { } extern void DrawOctorok() { - SETUP_SKEL(OCTOROK_LIMB_MAX, gOctorokSkel, gOctorokFloatAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); - Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(OCTOROK_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + Matrix_Translate(0, -700.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(OCTOROK_LIMB_MAX, gOctorokSkel, gOctorokFloatAnim); Gfx* gfxPtr = POLY_OPA_DISP; gSPDisplayList(&gfxPtr[0], gSetupDLs[SETUPDL_25]); @@ -670,8 +755,10 @@ extern void DrawOctorok() { } extern void DrawPeahat() { - SETUP_SKEL(OBJECT_PH_LIMB_MAX, object_ph_Skel_001C80, object_ph_Anim_0009C4, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY);); + SETUP_DRAW(OBJECT_PH_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + SETUP_SKEL(OBJECT_PH_LIMB_MAX, object_ph_Skel_001C80, object_ph_Anim_0009C4); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -680,30 +767,63 @@ extern void DrawPeahat() { } extern void DrawPirate() { + static uintptr_t eyeTexture = (uintptr_t)Lib_SegmentedToVirtual((TexturePtr)gFighterPirateEyeOpenTex); + SETUP_DRAW(KAIZOKU_LIMB_MAX); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2000.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(KAIZOKU_LIMB_MAX, gFighterPirateSkel, gFighterPirateFightingIdleAnim); + + gSPSegment(POLY_OPA_DISP++, 0x08, eyeTexture); + SkelAnime_DrawTransformFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, + NULL, EnKaizoku_TransformLimbDraw, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement +} extern void DrawPoe() { + SETUP_DRAW(POE_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.0075f, 0.0075f, 0.0075f, MTXMODE_APPLY); + Matrix_Translate(0, -5000.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(POE_LIMB_MAX, gPoeSkel, gPoeFloatAnim); + + gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)D_801AEFA0); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement +} -extern void DrawRedead() { // TODO: Possibly downsize, may need to refactor SETUP_SKEL()? - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[REDEAD_LIMB_MAX]; - static Vec3s morphTable[REDEAD_LIMB_MAX]; - static u32 lastUpdate = 0; +extern void DrawRealBombchu() { + SETUP_DRAW(REAL_BOMBCHU_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + Matrix_Translate(0, -1500.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(REAL_BOMBCHU_LIMB_MAX, gRealBombchuSkel, gRealBombchuRunAnim); + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, + DrawEnRealBombchu_PostLimbDraw, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); +} + +extern void DrawRedead() { static u32 animUpdate = 0; static uint32_t rdAnimID = 0; static AnimationHeader* currentAnim = (AnimationHeader*)gGibdoRedeadIdleAnim; - - std::vector rdAnims = { + static std::vector rdAnims = { (AnimationHeader*)gGibdoRedeadSquattingDanceAnim, (AnimationHeader*)gGibdoRedeadClappingDanceAnim, (AnimationHeader*)gGibdoRedeadPirouetteAnim, }; + SETUP_DRAW(REDEAD_LIMB_MAX); - OPEN_DISPS(gPlayState->state.gfxCtx); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL60_XluNoCD(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); @@ -716,23 +836,18 @@ extern void DrawRedead() { // TODO: Possibly downsize, may need to refactor SETU } if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - Player* player = GET_PLAYER(gPlayState); - if (player->currentMask == PLAYER_MASK_GIBDO) { - if (animUpdate != gPlayState->state.frames) { - if (animUpdate <= gPlayState->state.frames - 35) { - animUpdate = gPlayState->state.frames; - currentAnim = rdAnims[rdAnimID]; - if (rdAnimID >= rdAnims.size() - 1) { - rdAnimID = 0; - } else { - rdAnimID++; - } - Animation_MorphToLoop(&skelAnime, currentAnim, -6.0f); - } - } - } else { + if (EnRd_ShouldNotDance(gPlayState)) { currentAnim = (AnimationHeader*)gGibdoRedeadIdleAnim; Animation_MorphToLoop(&skelAnime, currentAnim, -6.0f); + } else if (animUpdate != gPlayState->state.frames && animUpdate <= gPlayState->state.frames - 35) { + animUpdate = gPlayState->state.frames; + currentAnim = rdAnims[rdAnimID]; + if (rdAnimID >= rdAnims.size() - 1) { + rdAnimID = 0; + } else { + rdAnimID++; + } + Animation_MorphToLoop(&skelAnime, currentAnim, -6.0f); } lastUpdate = gPlayState->state.frames; SkelAnime_Update(&skelAnime); @@ -746,10 +861,11 @@ extern void DrawRedead() { // TODO: Possibly downsize, may need to refactor SETU } extern void DrawShellBlade() { - SETUP_FLEX_SKEL(OBJECT_SB_LIMB_MAX, object_sb_Skel_002BF0, object_sb_Anim_000194, - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); - Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(OBJECT_SB_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.007f, 0.007f, 0.007f, MTXMODE_APPLY); + Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(OBJECT_SB_LIMB_MAX, object_sb_Skel_002BF0, object_sb_Anim_000194); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -758,10 +874,12 @@ extern void DrawShellBlade() { } extern void DrawSkullfish() { - SETUP_FLEX_SKEL(OBJECT_PR_2_LIMB_MAX, object_pr_Skel_004188, object_pr_Anim_004340, - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);); + SETUP_DRAW(OBJECT_PR_2_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(OBJECT_PR_2_LIMB_MAX, object_pr_Skel_004188, object_pr_Anim_004340); + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); Scene_SetRenderModeXlu(gPlayState, 0, 1); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -770,8 +888,10 @@ extern void DrawSkullfish() { } extern void DrawSkulltula() { - SETUP_SKEL(OBJECT_ST_LIMB_MAX, object_st_Skel_005298, object_st_Anim_000304, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY);); + SETUP_DRAW(OBJECT_ST_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); + SETUP_SKEL(OBJECT_ST_LIMB_MAX, object_st_Skel_005298, object_st_Anim_000304); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -779,10 +899,10 @@ extern void DrawSkulltula() { DrawEnLight({ 155, 155, 155 }, { 5.0f, 5.0f, 5.0f }); } -extern void DrawSlime() { +extern void DrawChuchu() { static int16_t timer = 25; f32 timerFactor = sqrtf(timer) * 0.2f; - AnimatedMaterial* sSlimeTexAnim = (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gChuchuSlimeFlowTexAnim); + static AnimatedMaterial* sSlimeTexAnim = (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gChuchuSlimeFlowTexAnim); OPEN_DISPS(gPlayState->state.gfxCtx); Matrix_Scale( @@ -812,12 +932,14 @@ extern void DrawSlime() { } extern void DrawSnapper() { - static TexturePtr eyeTexture = Lib_SegmentedToVirtual((TexturePtr)gSnapperEyeOpenTex); - SETUP_FLEX_SKEL(SNAPPER_LIMB_MAX, gSnapperSkel, gSnapperIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3100.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(SNAPPER_LIMB_MAX); + static uintptr_t eyeTexture = (uintptr_t)Lib_SegmentedToVirtual((TexturePtr)gSnapperEyeOpenTex); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3100.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(SNAPPER_LIMB_MAX, gSnapperSkel, gSnapperIdleAnim); - gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)eyeTexture); + gSPSegment(POLY_OPA_DISP++, 0x08, eyeTexture); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); CLOSE_DISPS(gPlayState->state.gfxCtx); @@ -825,9 +947,11 @@ extern void DrawSnapper() { } extern void DrawStalchild() { - SETUP_SKEL(STALCHILD_LIMB_MAX, gStalchildSkel, gStalchildIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3200, 0, MTXMODE_APPLY);); + SETUP_DRAW(STALCHILD_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3200, 0, MTXMODE_APPLY); + SETUP_SKEL(STALCHILD_LIMB_MAX, gStalchildSkel, gStalchildIdleAnim); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, DrawEnSkb_OverrideLimbDraw, NULL, NULL); @@ -836,8 +960,14 @@ extern void DrawStalchild() { } extern void DrawTakkuri() { + SETUP_DRAW(TAKKURI_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(TAKKURI_LIMB_MAX, gTakkuriSkel, gTakkuriFlyAnim); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + CLOSE_DISPS(gPlayState->state.gfxCtx); DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement +} extern void DrawTektite() { static TexturePtr D_80896B24[2][3] = { @@ -846,11 +976,12 @@ extern void DrawTektite() { { (TexturePtr*)&object_tite_Tex_001B00, (TexturePtr*)&object_tite_Tex_001F00, (TexturePtr*)&object_tite_Tex_002100 }, }; + SETUP_DRAW(OBJECT_TITE_LIMB_MAX); - SETUP_SKEL(OBJECT_TITE_LIMB_MAX, object_tite_Skel_003A20, object_tite_Anim_0012E4, - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY);); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2900.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(OBJECT_TITE_LIMB_MAX, object_tite_Skel_003A20, object_tite_Anim_0012E4); Gfx* gfx = POLY_OPA_DISP; @@ -869,9 +1000,11 @@ extern void DrawTektite() { } extern void DrawWallmaster() { - SETUP_FLEX_SKEL(WALLMASTER_LIMB_MAX, gWallmasterSkel, gWallmasterIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(WALLMASTER_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(WALLMASTER_LIMB_MAX, gWallmasterSkel, gWallmasterIdleAnim); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -880,17 +1013,40 @@ extern void DrawWallmaster() { } extern void DrawWart() { + SETUP_DRAW(WART_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(WART_LIMB_MAX, gWartSkel, gWartIdleAnim); + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement +} extern void DrawWizrobe() { - DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); -} // TODO: Implement + static uintptr_t eyeTexture = (uintptr_t)Lib_SegmentedToVirtual((TexturePtr)gWizrobeEyeTex); + SETUP_DRAW(WIZROBE_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.006f, 0.006f, 0.006f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(WIZROBE_LIMB_MAX, gWizrobeSkel, gWizrobeIdleAnim); + + Scene_SetRenderModeXlu(gPlayState, 0, 1); + gSPSegment(POLY_OPA_DISP++, 0x08, eyeTexture); + gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 15.0f, 15.0f, 15.0f }); +} extern void DrawWolfos() { - SETUP_FLEX_SKEL(WOLFOS_NORMAL_LIMB_MAX, gWolfosNormalSkel, gWolfosWaitAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY);); + SETUP_DRAW(WOLFOS_NORMAL_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3000.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(WOLFOS_NORMAL_LIMB_MAX, gWolfosNormalSkel, gWolfosWaitAnim); gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)&gWolfosNormalEyeOpenTex); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -901,9 +1057,11 @@ extern void DrawWolfos() { // Boss Souls extern void DrawGoht() { - SETUP_FLEX_SKEL(GOHT_LIMB_MAX, gGohtSkel, gGohtRunAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY);); + SETUP_DRAW(GOHT_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(GOHT_LIMB_MAX, gGohtSkel, gGohtRunAnim); gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)gGohtMetalPlateWithCirclePatternTex); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -913,9 +1071,11 @@ extern void DrawGoht() { } extern void DrawGyorg() { - SETUP_FLEX_SKEL(GYORG_LIMB_MAX, gGyorgSkel, gGyorgGentleSwimmingAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY);); + SETUP_DRAW(GYORG_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(GYORG_LIMB_MAX, gGyorgSkel, gGyorgGentleSwimmingAnim); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -924,10 +1084,12 @@ extern void DrawGyorg() { } extern void DrawOdolwa() { - SETUP_FLEX_SKEL(ODOLWA_LIMB_MAX, gOdolwaSkel, gOdolwaReadyAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY);); + SETUP_DRAW(ODOLWA_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(ODOLWA_LIMB_MAX, gOdolwaSkel, gOdolwaReadyAnim); SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); @@ -936,9 +1098,10 @@ extern void DrawOdolwa() { } extern void DrawTwinmold() { - SETUP_FLEX_SKEL(TWINMOLD_HEAD_LIMB_MAX, gTwinmoldHeadSkel, gTwinmoldHeadFlyAnim, - OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Scale(0.06f, 0.06f, 0.06f, MTXMODE_APPLY);); + SETUP_DRAW(TWINMOLD_HEAD_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.06f, 0.06f, 0.06f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(TWINMOLD_HEAD_LIMB_MAX, gTwinmoldHeadSkel, gTwinmoldHeadFlyAnim); Mtx* mtxHead = (Mtx*)GRAPH_ALLOC(gPlayState->state.gfxCtx, 23 * sizeof(Mtx)); gSPSegment(POLY_OPA_DISP++, 0x0D, (uintptr_t)mtxHead); @@ -950,9 +1113,12 @@ extern void DrawTwinmold() { } extern void DrawMajora() { - SETUP_SKEL(MAJORAS_MASK_LIMB_MAX, gMajorasMaskSkel, gMajorasMaskFloatingAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); Matrix_ReplaceRotation(&gPlayState->billboardMtxF);); + SETUP_DRAW(MAJORAS_MASK_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + Matrix_Scale(0.05f, 0.05f, 0.05f, MTXMODE_APPLY); + Matrix_ReplaceRotation(&gPlayState->billboardMtxF); + SETUP_SKEL(MAJORAS_MASK_LIMB_MAX, gMajorasMaskSkel, gMajorasMaskFloatingAnim); gSPSegment(POLY_OPA_DISP++, 8, (uintptr_t)gMajorasMaskWithNormalEyesTex); SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); @@ -964,9 +1130,11 @@ extern void DrawMajora() { // Other Actors extern void DrawMinifrog(RandoItemId randoItemId, Actor* actor) { - SETUP_FLEX_SKEL(FROG_LIMB_MAX, gFrogSkel, gFrogIdleAnim, OPEN_DISPS(gPlayState->state.gfxCtx); - Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); - Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY);); + SETUP_DRAW(FROG_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + Matrix_Scale(0.03f, 0.03f, 0.03f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(FROG_LIMB_MAX, gFrogSkel, gFrogIdleAnim); Color_RGBA8 envColor = { 200, 170, 0, 255 }; // FROG_YELLOW switch (randoItemId) { diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index f3d16e892b..c2e924da3f 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -18,14 +18,15 @@ void DrawArmos(); void DrawBat(); void DrawBeamos(); void DrawBoe(); -void DrawRealBombchu(); void DrawBubble(); +void DrawChuchu(); void DrawDeathArmos(); void DrawDeepPython(); void DrawDekuBaba(); void DrawDexihand(); void DrawDinolfos(); void DrawDodongo(); +void DrawDragonfly(); void DrawEeno(); void DrawEyegore(); void DrawFlyingPot(); @@ -33,7 +34,6 @@ void DrawFreezard(); void DrawGaro(); void DrawGekko(); void DrawGiantBee(); -void DrawGrasshopper(); void DrawGuay(); void DrawHiploop(); void DrawIronKnuckle(); @@ -46,11 +46,11 @@ void DrawOctorok(); void DrawPeahat(); void DrawPirate(); void DrawPoe(); +void DrawRealBombchu(); void DrawRedead(); void DrawShellBlade(); void DrawSkullfish(); void DrawSkulltula(); -void DrawSlime(); void DrawSnapper(); void DrawStalchild(); void DrawTakkuri(); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index 657b9db22d..0102941785 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -409,14 +409,14 @@ std::unordered_map> soulDrawMap = { { RI_SOUL_BEAMOS, DrawBeamos }, { RI_SOUL_BUBBLE, DrawBubble }, { RI_SOUL_BOE, DrawBoe }, - { RI_SOUL_CHUCHU, DrawSlime }, + { RI_SOUL_CHUCHU, DrawChuchu }, { RI_SOUL_DEATH_ARMOS, DrawDeathArmos }, { RI_SOUL_DEEP_PYTHON, DrawDeepPython }, { RI_SOUL_DEKU_BABA, DrawDekuBaba }, { RI_SOUL_DEXIHAND, DrawDexihand }, { RI_SOUL_DINOLFOS, DrawDinolfos }, { RI_SOUL_DODONGO, DrawDodongo }, - { RI_SOUL_DRAGONFLY, DrawGrasshopper }, + { RI_SOUL_DRAGONFLY, DrawDragonfly }, { RI_SOUL_EENO, DrawEeno }, { RI_SOUL_EYEGORE, DrawEyegore }, { RI_SOUL_FLYING_POT, DrawFlyingPot }, From f550f5a19ee9409513ab37d22372ea40efb3b5d6 Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Mon, 29 Dec 2025 07:45:43 -0500 Subject: [PATCH 31/34] Remove unused INIT arg from SETUP_FLEX_SKEL --- mm/2s2h/Rando/DrawFuncs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index 86f27a375e..43e3056e1a 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -97,7 +97,7 @@ s32 EnRd_ShouldNotDance(PlayState* play); #define SETUP_SKEL(LIMB_MAX, SKEL_HEADER, ANIM_HEADER) \ SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, SkelAnime_Init, SkeletonHeader) -#define SETUP_FLEX_SKEL(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, INIT) \ +#define SETUP_FLEX_SKEL(LIMB_MAX, SKEL_HEADER, ANIM_HEADER) \ SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, SkelAnime_InitFlex, FlexSkeletonHeader) // Soul Effects From 430ea3077a6430a91fb69d38176fc5435f4ff7c2 Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Wed, 31 Dec 2025 20:33:50 -0500 Subject: [PATCH 32/34] Add Igos, Keeta, Gomess Make soul RIs contiguous, separate boss and enemy Ignore target color for EnInvadepoh Remove Real Bombchus and Flying Pots for now Require Gekko and Snapper souls for beating both --- .../Trackers/ItemTracker/ItemTracker.cpp | 13 +- .../ItemTracker/ItemTrackerSettings.cpp | 3 +- mm/2s2h/Rando/ActorBehavior/Souls.cpp | 168 +++++++------- mm/2s2h/Rando/ActorBehavior/Souls.h | 2 +- mm/2s2h/Rando/ConvertItem.cpp | 13 +- mm/2s2h/Rando/DrawFuncs.cpp | 117 +++++++--- mm/2s2h/Rando/DrawFuncs.h | 3 + mm/2s2h/Rando/DrawItem.cpp | 196 +++++++++-------- mm/2s2h/Rando/GiveItem.cpp | 110 ++++----- mm/2s2h/Rando/Logic/Logic.h | 10 +- .../Rando/Logic/Regions/GreatBayTemple.cpp | 2 +- mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp | 17 +- mm/2s2h/Rando/RemoveItem.cpp | 13 +- mm/2s2h/Rando/StaticData/Items.cpp | 208 +++++++++--------- mm/2s2h/Rando/Types.h | 207 ++++++++--------- 15 files changed, 580 insertions(+), 502 deletions(-) diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp index e825bc62ad..05ade479ce 100644 --- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp +++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp @@ -3,6 +3,7 @@ #include "2s2h/BenGui/UIWidgets.hpp" #include "Rando/Rando.h" +#include "Rando/ActorBehavior/Souls.h" #include "2s2h/ShipUtils.h" #include @@ -83,12 +84,12 @@ extern TrackerImageObject GetTextureObject(int16_t itemId, bool isRandoItem) { case RI_OWL_ZORA_CAPE: itemObtained = GET_OWL_STATUE_ACTIVATED(OWL_WARP_ZORA_CAPE); break; - case RI_SOUL_GOHT: - case RI_SOUL_GYORG: - case RI_SOUL_MAJORA: - case RI_SOUL_ODOLWA: - case RI_SOUL_TWINMOLD: - itemObtained = Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT + (itemId - RI_SOUL_GOHT)); + case RI_SOUL_BOSS_GOHT: + case RI_SOUL_BOSS_GYORG: + case RI_SOUL_BOSS_MAJORA: + case RI_SOUL_BOSS_ODOLWA: + case RI_SOUL_BOSS_TWINMOLD: + itemObtained = Flags_GetRandoInf(SOUL_RI_TO_RANDO_INF(itemId)); break; case RI_TINGLE_MAP_CLOCK_TOWN: itemObtained = CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_CLOCK_TOWN); diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp index b20b576982..1a6a7ad866 100644 --- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp +++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp @@ -43,7 +43,8 @@ std::map> defaultItemLists = std::map> randoItemLists = { { "Frogs", { RI_FROG_BLUE, RI_FROG_WHITE, 4 } }, - { "Boss Souls", { RI_SOUL_GOHT, RI_SOUL_TWINMOLD, 5 } }, + { "Boss Souls", { RI_SOUL_BOSS_GOHT, RI_SOUL_BOSS_TWINMOLD, 5 } }, + // TODO: Enemy Souls { "Owl Statues", { RI_OWL_CLOCK_TOWN_SOUTH, RI_OWL_ZORA_CAPE, 5 } }, { "Tingle Maps", { RI_TINGLE_MAP_CLOCK_TOWN, RI_TINGLE_MAP_WOODFALL, 6 } }, { "Misc", { RI_TRIFORCE_PIECE, RI_TRIFORCE_PIECE, 1 } }, diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.cpp b/mm/2s2h/Rando/ActorBehavior/Souls.cpp index 7020b9c3ec..f1b58b94b2 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Souls.cpp @@ -26,70 +26,72 @@ bool shouldMajoraRegister() { // clang-format off std::unordered_map enemySoulMap = { - // TODO: Special cases: Igos du Ikana, Captain Keeta - // FIXME: Real Bomchus and flying pots don't depend on attack collision to die; they can die from hitting anything - { ACTOR_EN_INVADEPOH, RI_SOUL_ALIEN }, - { ACTOR_EN_AM, RI_SOUL_ARMOS }, - { ACTOR_EN_BAT, RI_SOUL_BAD_BAT }, - { ACTOR_EN_VM, RI_SOUL_BEAMOS }, - { ACTOR_EN_BB, RI_SOUL_BUBBLE }, - { ACTOR_EN_BBFALL, RI_SOUL_BUBBLE }, - { ACTOR_EN_MKK, RI_SOUL_BOE }, - { ACTOR_EN_SLIME, RI_SOUL_CHUCHU }, - { ACTOR_EN_FAMOS, RI_SOUL_DEATH_ARMOS }, - { ACTOR_EN_DRAGON, RI_SOUL_DEEP_PYTHON }, - { ACTOR_EN_DEKUBABA, RI_SOUL_DEKU_BABA }, - { ACTOR_EN_KAREBABA, RI_SOUL_DEKU_BABA }, - { ACTOR_BOSS_05, RI_SOUL_DEKU_BABA }, - { ACTOR_EN_WDHAND, RI_SOUL_DEXIHAND }, - { ACTOR_EN_DINOFOS, RI_SOUL_DINOLFOS }, - { ACTOR_EN_DODONGO, RI_SOUL_DODONGO }, - { ACTOR_EN_GRASSHOPPER, RI_SOUL_DRAGONFLY }, - { ACTOR_EN_SNOWMAN, RI_SOUL_EENO }, - { ACTOR_EN_EGOL, RI_SOUL_EYEGORE }, - { ACTOR_EN_TUBO_TRAP, RI_SOUL_FLYING_POT }, - { ACTOR_EN_FZ, RI_SOUL_FREEZARD }, - { ACTOR_EN_JSO, RI_SOUL_GARO }, - { ACTOR_EN_JSO2, RI_SOUL_GARO }, - { ACTOR_EN_BIGSLIME, RI_SOUL_GEKKO }, - { ACTOR_EN_PAMETFROG, RI_SOUL_GEKKO }, - { ACTOR_EN_BEE, RI_SOUL_GIANT_BEE }, - { ACTOR_EN_CROW, RI_SOUL_GUAY }, - { ACTOR_EN_RUPPECROW, RI_SOUL_GUAY }, - { ACTOR_EN_PP, RI_SOUL_HIPLOOP }, - { ACTOR_EN_IK, RI_SOUL_IRON_KNUCKLE }, - { ACTOR_EN_FIREFLY, RI_SOUL_KEESE }, - { ACTOR_EN_NEO_REEBA, RI_SOUL_LEEVER }, - { ACTOR_EN_RR, RI_SOUL_LIKE_LIKE }, - { ACTOR_EN_DEKUNUTS, RI_SOUL_MAD_SCRUB }, - { ACTOR_EN_BAGUO, RI_SOUL_NEJIRON }, - { ACTOR_EN_OKUTA, RI_SOUL_OCTOROK }, - { ACTOR_EN_PEEHAT, RI_SOUL_PEAHAT }, - { ACTOR_EN_KAIZOKU, RI_SOUL_PIRATE }, - { ACTOR_EN_BIGPO, RI_SOUL_POE }, - { ACTOR_EN_PO_SISTERS, RI_SOUL_POE }, - { ACTOR_EN_POH, RI_SOUL_POE }, - { ACTOR_EN_RAT, RI_SOUL_REAL_BOMBCHU }, - { ACTOR_EN_RD, RI_SOUL_REDEAD }, - { ACTOR_EN_SB, RI_SOUL_SHELLBLADE }, - { ACTOR_EN_PR, RI_SOUL_SKULLFISH }, - { ACTOR_EN_PR2, RI_SOUL_SKULLFISH }, - { ACTOR_EN_PRZ, RI_SOUL_SKULLFISH }, - { ACTOR_EN_ST, RI_SOUL_SKULLTULA }, - { ACTOR_EN_SW, RI_SOUL_SKULLTULA }, - { ACTOR_EN_BIGPAMET, RI_SOUL_SNAPPER }, - { ACTOR_EN_KAME, RI_SOUL_SNAPPER }, - { ACTOR_EN_HINT_SKB, RI_SOUL_STALCHILD }, - { ACTOR_EN_RAIL_SKB, RI_SOUL_STALCHILD }, - { ACTOR_EN_SKB, RI_SOUL_STALCHILD }, - { ACTOR_EN_THIEFBIRD, RI_SOUL_TAKKURI }, - { ACTOR_EN_TITE, RI_SOUL_TEKTITE }, - { ACTOR_EN_FLOORMAS, RI_SOUL_WALLMASTER }, - { ACTOR_EN_WALLMAS, RI_SOUL_WALLMASTER }, - { ACTOR_BOSS_04, RI_SOUL_WART }, - { ACTOR_EN_TANRON2, RI_SOUL_WART }, - { ACTOR_EN_WIZ, RI_SOUL_WIZROBE }, - { ACTOR_EN_WF, RI_SOUL_WOLFOS }, + // Real Bombchu and Flying Pot souls are excluded, as those actors are programmed to die to any collision, not just + // the damaging type. We don't have a good answer for what behavior those should follow if the hit something. + { ACTOR_EN_INVADEPOH, RI_SOUL_ENEMY_ALIEN }, + { ACTOR_EN_AM, RI_SOUL_ENEMY_ARMOS }, + { ACTOR_EN_BAT, RI_SOUL_ENEMY_BAD_BAT }, + { ACTOR_EN_VM, RI_SOUL_ENEMY_BEAMOS }, + { ACTOR_EN_BB, RI_SOUL_ENEMY_BUBBLE }, + { ACTOR_EN_BBFALL, RI_SOUL_ENEMY_BUBBLE }, + { ACTOR_EN_MKK, RI_SOUL_ENEMY_BOE }, + { ACTOR_EN_BSB, RI_SOUL_ENEMY_CAPTAIN_KEETA }, + { ACTOR_EN_SLIME, RI_SOUL_ENEMY_CHUCHU }, + { ACTOR_EN_FAMOS, RI_SOUL_ENEMY_DEATH_ARMOS }, + { ACTOR_EN_DRAGON, RI_SOUL_ENEMY_DEEP_PYTHON }, + { ACTOR_EN_DEKUBABA, RI_SOUL_ENEMY_DEKU_BABA }, + { ACTOR_EN_KAREBABA, RI_SOUL_ENEMY_DEKU_BABA }, + { ACTOR_BOSS_05, RI_SOUL_ENEMY_DEKU_BABA }, + { ACTOR_EN_WDHAND, RI_SOUL_ENEMY_DEXIHAND }, + { ACTOR_EN_DINOFOS, RI_SOUL_ENEMY_DINOLFOS }, + { ACTOR_EN_DODONGO, RI_SOUL_ENEMY_DODONGO }, + { ACTOR_EN_GRASSHOPPER, RI_SOUL_ENEMY_DRAGONFLY }, + { ACTOR_EN_SNOWMAN, RI_SOUL_ENEMY_EENO }, + { ACTOR_EN_EGOL, RI_SOUL_ENEMY_EYEGORE }, + { ACTOR_EN_FZ, RI_SOUL_ENEMY_FREEZARD }, + { ACTOR_EN_JSO, RI_SOUL_ENEMY_GARO }, + { ACTOR_EN_JSO2, RI_SOUL_ENEMY_GARO }, + { ACTOR_EN_BIGSLIME, RI_SOUL_ENEMY_GEKKO }, + { ACTOR_EN_PAMETFROG, RI_SOUL_ENEMY_GEKKO }, + { ACTOR_EN_BEE, RI_SOUL_ENEMY_GIANT_BEE }, + { ACTOR_EN_DEATH, RI_SOUL_ENEMY_GOMESS }, + { ACTOR_EN_MINIDEATH, RI_SOUL_ENEMY_GOMESS }, + { ACTOR_EN_CROW, RI_SOUL_ENEMY_GUAY }, + { ACTOR_EN_RUPPECROW, RI_SOUL_ENEMY_GUAY }, + { ACTOR_EN_PP, RI_SOUL_ENEMY_HIPLOOP }, + { ACTOR_EN_KNIGHT, RI_SOUL_ENEMY_IGOS_DU_IKANA }, + { ACTOR_EN_IK, RI_SOUL_ENEMY_IRON_KNUCKLE }, + { ACTOR_EN_FIREFLY, RI_SOUL_ENEMY_KEESE }, + { ACTOR_EN_NEO_REEBA, RI_SOUL_ENEMY_LEEVER }, + { ACTOR_EN_RR, RI_SOUL_ENEMY_LIKE_LIKE }, + { ACTOR_EN_DEKUNUTS, RI_SOUL_ENEMY_MAD_SCRUB }, + { ACTOR_EN_BAGUO, RI_SOUL_ENEMY_NEJIRON }, + { ACTOR_EN_OKUTA, RI_SOUL_ENEMY_OCTOROK }, + { ACTOR_EN_PEEHAT, RI_SOUL_ENEMY_PEAHAT }, + { ACTOR_EN_KAIZOKU, RI_SOUL_ENEMY_PIRATE }, + { ACTOR_EN_BIGPO, RI_SOUL_ENEMY_POE }, + { ACTOR_EN_PO_SISTERS, RI_SOUL_ENEMY_POE }, + { ACTOR_EN_POH, RI_SOUL_ENEMY_POE }, + { ACTOR_EN_RD, RI_SOUL_ENEMY_REDEAD }, + { ACTOR_EN_SB, RI_SOUL_ENEMY_SHELLBLADE }, + { ACTOR_EN_PR, RI_SOUL_ENEMY_SKULLFISH }, + { ACTOR_EN_PR2, RI_SOUL_ENEMY_SKULLFISH }, + { ACTOR_EN_PRZ, RI_SOUL_ENEMY_SKULLFISH }, + { ACTOR_EN_ST, RI_SOUL_ENEMY_SKULLTULA }, + { ACTOR_EN_SW, RI_SOUL_ENEMY_SKULLTULA }, + { ACTOR_EN_BIGPAMET, RI_SOUL_ENEMY_SNAPPER }, + { ACTOR_EN_KAME, RI_SOUL_ENEMY_SNAPPER }, + { ACTOR_EN_HINT_SKB, RI_SOUL_ENEMY_STALCHILD }, + { ACTOR_EN_RAIL_SKB, RI_SOUL_ENEMY_STALCHILD }, + { ACTOR_EN_SKB, RI_SOUL_ENEMY_STALCHILD }, + { ACTOR_EN_THIEFBIRD, RI_SOUL_ENEMY_TAKKURI }, + { ACTOR_EN_TITE, RI_SOUL_ENEMY_TEKTITE }, + { ACTOR_EN_FLOORMAS, RI_SOUL_ENEMY_WALLMASTER }, + { ACTOR_EN_WALLMAS, RI_SOUL_ENEMY_WALLMASTER }, + { ACTOR_BOSS_04, RI_SOUL_ENEMY_WART }, + { ACTOR_EN_TANRON2, RI_SOUL_ENEMY_WART }, + { ACTOR_EN_WIZ, RI_SOUL_ENEMY_WIZROBE }, + { ACTOR_EN_WF, RI_SOUL_ENEMY_WOLFOS }, }; // clang-format on @@ -98,7 +100,7 @@ bool HaveEnemySoul(ActorId enemyId) { if (findSoulFlag != enemySoulMap.end()) { RandoItemId randoItemId = findSoulFlag->second; if (randoItemId != RI_UNKNOWN) { - return Flags_GetRandoInf(ENEMY_SOUL_RI_TO_RANDO_INF(randoItemId)); + return Flags_GetRandoInf(SOUL_RI_TO_RANDO_INF(randoItemId)); } } // Enemy soul does not exist, so act as if it is obtained @@ -132,45 +134,48 @@ void Rando::ActorBehavior::InitSoulsBehavior() { // ShouldActorDraw & ShouldActorUpdate for Boss Souls COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_HAKUGIN, shouldBossRegister, [](Actor* actor, bool* should) { - if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT)) { + if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_GOHT)) { BossHakugin_DrawIce((BossHakugin*)actor, gPlayState); *should = false; } }); COND_VB_SHOULD(VB_GOHT_UNFREEZE, shouldBossRegister, { - if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT)) { + if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_GOHT)) { *should = false; } }); - COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_03, shouldBossRegister, - [](Actor* actor, bool* should) { ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_GYORG); }); + COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_03, shouldBossRegister, [](Actor* actor, bool* should) { + ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_BOSS_GYORG); + }); - COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_07, shouldMajoraRegister(), - [](Actor* actor, bool* should) { ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_MAJORA); }); + COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_07, shouldMajoraRegister(), [](Actor* actor, bool* should) { + ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_BOSS_MAJORA); + }); - COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_01, shouldBossRegister, - [](Actor* actor, bool* should) { ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA); }); + COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_01, shouldBossRegister, [](Actor* actor, bool* should) { + ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_BOSS_ODOLWA); + }); COND_ID_HOOK(ShouldActorDraw, ACTOR_BOSS_02, shouldBossRegister, [](Actor* actor, bool* should) { - ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD); + ShouldActorDraw(actor, should, RANDO_INF_OBTAINED_SOUL_OF_BOSS_TWINMOLD); }); COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_03, shouldBossRegister, [](Actor* actor, bool* should) { - ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_GYORG); + ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_BOSS_GYORG); }); COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_07, shouldMajoraRegister(), [](Actor* actor, bool* should) { - ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_MAJORA); + ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_BOSS_MAJORA); }); COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_01, shouldBossRegister, [](Actor* actor, bool* should) { - ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA); + ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_BOSS_ODOLWA); }); COND_ID_HOOK(ShouldActorUpdate, ACTOR_BOSS_02, shouldBossRegister, [](Actor* actor, bool* should) { - ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD); + ShouldActorUpdate(actor, should, RANDO_INF_OBTAINED_SOUL_OF_BOSS_TWINMOLD); }); /* @@ -181,14 +186,17 @@ void Rando::ActorBehavior::InitSoulsBehavior() { COND_VB_SHOULD(VB_ITEM_BE_RESTRICTED, shouldBossRegister, { ItemId itemId = *va_arg(args, ItemId*); if (itemId == ITEM_MASK_GIANT && gPlayState->sceneId == SCENE_INISIE_BS && - !Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD)) { + !Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_TWINMOLD)) { *should = true; } }); COND_VB_SHOULD(VB_DRAW_LOCK_ON_ARROW, shouldEnemyInjure, { Actor* refActor = va_arg(args, Actor*); - if (!HaveEnemySoul((ActorId)refActor->id)) { + ActorId actorId = (ActorId)refActor->id; + // ACTOR_EN_INVADEPOH represents multiple actors, including Romani and the dog. The aliens cannot be targeted + // anyway, so just don't draw this arrow if the actor is ACTOR_EN_INVADEPOH. + if (actorId != ACTOR_EN_INVADEPOH && !HaveEnemySoul(actorId)) { DrawEnLight({ 155, 0, 0 }, { 1.0f, 1.0f, 1.0f }); *should = false; } diff --git a/mm/2s2h/Rando/ActorBehavior/Souls.h b/mm/2s2h/Rando/ActorBehavior/Souls.h index e030372613..d2809d5559 100644 --- a/mm/2s2h/Rando/ActorBehavior/Souls.h +++ b/mm/2s2h/Rando/ActorBehavior/Souls.h @@ -3,7 +3,7 @@ #include "Rando/Rando.h" -#define ENEMY_SOUL_RI_TO_RANDO_INF(randoItemId) ((randoItemId - RI_SOUL_ALIEN) + RANDO_INF_OBTAINED_SOUL_OF_ALIENS) +#define SOUL_RI_TO_RANDO_INF(randoItemId) ((randoItemId - RI_SOUL_BOSS_GOHT) + RANDO_INF_OBTAINED_SOUL_OF_BOSS_GOHT) extern bool HaveEnemySoul(ActorId enemyId); diff --git a/mm/2s2h/Rando/ConvertItem.cpp b/mm/2s2h/Rando/ConvertItem.cpp index 26ba83a947..ea31ded5bb 100644 --- a/mm/2s2h/Rando/ConvertItem.cpp +++ b/mm/2s2h/Rando/ConvertItem.cpp @@ -1,4 +1,5 @@ #include "Rando/Rando.h" +#include "Rando/ActorBehavior/Souls.h" #include "2s2h/ShipUtils.h" #include @@ -421,12 +422,12 @@ bool Rando::IsItemObtainable(RandoItemId randoItemId, RandoCheckId randoCheckId) return !CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_SNOWHEAD); case RI_TINGLE_MAP_STONE_TOWER: return !CHECK_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_STONE_TOWER); - case RI_SOUL_GOHT: - case RI_SOUL_GYORG: - case RI_SOUL_MAJORA: - case RI_SOUL_ODOLWA: - case RI_SOUL_TWINMOLD: - return !Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT + (randoItemId - RI_SOUL_GOHT)); + case RI_SOUL_BOSS_GOHT: + case RI_SOUL_BOSS_GYORG: + case RI_SOUL_BOSS_MAJORA: + case RI_SOUL_BOSS_ODOLWA: + case RI_SOUL_BOSS_TWINMOLD: + return !Flags_GetRandoInf(SOUL_RI_TO_RANDO_INF(randoItemId)); // These items are technically fine to receive again because they don't do anything, but we'll convert them to // ensure it's clear to the player something didn't go wrong. We just simply check the inventory state // Masks diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index 43e3056e1a..771d115bdd 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -12,6 +12,7 @@ extern "C" { s32 EnMinifrog_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* enMini); s32 EnRd_ShouldNotDance(PlayState* play); +Gfx* EnKnight_BuildEmptyDL(GraphicsContext* gfxCtx); // clang-format off // Boss Includes @@ -27,6 +28,7 @@ s32 EnRd_ShouldNotDance(PlayState* play); /* Bad Bat */ #include "assets/objects/object_bat/object_bat.h" /* Beamos */ #include "assets/objects/object_vm/object_vm.h" /* Boe */ #include "assets/objects/object_mkk/object_mkk.h" +/* Captain Keeta */ #include "assets/objects/object_bsb/object_bsb.h" /* Chuchu */ #include "assets/objects/object_slime/object_slime.h" /* Bubble */ #include "assets/objects/object_bb/object_bb.h" /* Death Armos */ #include "assets/objects/object_famos/object_famos.h" @@ -43,8 +45,10 @@ s32 EnRd_ShouldNotDance(PlayState* play); /* Garo */ #include "assets/objects/object_jso/object_jso.h" /* Gekko */ #include "overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h" /* Giant Bee */ #include "assets/objects/object_bee/object_bee.h" +/* Gomess */ #include "assets/objects/object_death/object_death.h" /* Guay */ #include "assets/objects/object_crow/object_crow.h" /* Hiploop */ #include "assets/objects/object_pp/object_pp.h" +/* Igos du Ikana */ #include "assets/objects/object_knight/object_knight.h" /* Iron Knuckle */ #include "assets/objects/object_ik/object_ik.h" /* Keese */ #include "assets/objects/object_firefly/object_firefly.h" /* Leever */ #include "assets/objects/object_rb/object_rb.h" @@ -349,6 +353,52 @@ extern void DrawBubble() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } +extern void DrawCaptainKeeta() { + SETUP_DRAW(OBJECT_BSB_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -3500.0f, 0, MTXMODE_APPLY); + SETUP_SKEL(OBJECT_BSB_LIMB_MAX, object_bsb_Skel_00C3E0, object_bsb_Anim_004894); + + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + SkelAnime_DrawOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 255, 192, 0 }, { 5.0f, 10.0f, 5.0f }); +} + +extern void DrawChuchu() { + static int16_t timer = 25; + f32 timerFactor = sqrtf(timer) * 0.2f; + static AnimatedMaterial* sSlimeTexAnim = (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gChuchuSlimeFlowTexAnim); + + OPEN_DISPS(gPlayState->state.gfxCtx); + Matrix_Scale( + 0.01f, + ((((coss(RAD_TO_BINANG(timer * (2.0f * M_PI / 5.0f))) * SHT_MINV) * (0.07f * timerFactor)) + 1.0f) * 0.01f), + 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2700.0f, 0, MTXMODE_APPLY); + + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + AnimatedMat_Draw(gPlayState, sSlimeTexAnim); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 100, 255, 255, 200, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 180, 0, 255); + + if (timer == 0) { + timer = 25; + } + + MATRIX_FINALIZE_AND_LOAD(POLY_XLU_DISP++, gPlayState->state.gfxCtx); + Scene_SetRenderModeXlu(gPlayState, 1, 2); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gChuchuBodyDL); + gSPSegment(POLY_XLU_DISP++, 9, (uintptr_t)gChuchuEyeOpenTex); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gChuchuEyesDL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); + timer--; +} + extern void DrawDeathArmos() { SETUP_DRAW(FAMOS_LIMB_MAX); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); @@ -544,6 +594,24 @@ extern void DrawGiantBee() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } +extern void DrawGomess() { + static AnimatedMaterial* bodyMatAnim = (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)&gGomessBodyMatAnim); + static AnimatedMaterial* coreMatAnim = (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)&gGomessCoreMatAnim); + SETUP_DRAW(GOMESS_LIMB_MAX); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.005f, 0.005f, 0.005f, MTXMODE_APPLY); + SETUP_FLEX_SKEL(GOMESS_LIMB_MAX, gGomessSkel, gGomessFloatAnim); + + AnimatedMat_DrawStepOpa(gPlayState, bodyMatAnim, 23); + AnimatedMat_DrawOpa(gPlayState, coreMatAnim); + Scene_SetRenderModeXlu(gPlayState, 0, 1); + gDPSetEnvColor(POLY_OPA_DISP++, 30, 30, 0, 255); + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 0, 0 }, { 15.0f, 15.0f, 15.0f }); +} + extern void DrawGuay() { SETUP_DRAW(OBJECT_CROW_LIMB_MAX); Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); @@ -571,6 +639,23 @@ extern void DrawHiploop() { DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } +extern void DrawIgosDuIkana() { + SETUP_DRAW(IGOS_LIMB_MAX); + gSPSegment(POLY_OPA_DISP++, 0x0A, (uintptr_t)EnKnight_BuildEmptyDL(gPlayState->state.gfxCtx)); + gSPSegment(POLY_XLU_DISP++, 0x0A, (uintptr_t)EnKnight_BuildEmptyDL(gPlayState->state.gfxCtx)); + gSPSegment(POLY_OPA_DISP++, 0x09, (uintptr_t)EnKnight_BuildEmptyDL(gPlayState->state.gfxCtx)); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + Matrix_Translate(0, -2000.0f, 0, MTXMODE_APPLY); + SETUP_FLEX_SKEL(IGOS_LIMB_MAX, gIgosSkel, gKnightIdleAnim); + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + POLY_OPA_DISP = Play_SetFog(gPlayState, POLY_OPA_DISP); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 0, 0, 0 }, { 10.0f, 10.0f, 10.0f }); +} + extern void DrawIronKnuckle() { SETUP_DRAW(IRON_KNUCKLE_LIMB_MAX); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); @@ -899,38 +984,6 @@ extern void DrawSkulltula() { DrawEnLight({ 155, 155, 155 }, { 5.0f, 5.0f, 5.0f }); } -extern void DrawChuchu() { - static int16_t timer = 25; - f32 timerFactor = sqrtf(timer) * 0.2f; - static AnimatedMaterial* sSlimeTexAnim = (AnimatedMaterial*)Lib_SegmentedToVirtual((void*)gChuchuSlimeFlowTexAnim); - - OPEN_DISPS(gPlayState->state.gfxCtx); - Matrix_Scale( - 0.01f, - ((((coss(RAD_TO_BINANG(timer * (2.0f * M_PI / 5.0f))) * SHT_MINV) * (0.07f * timerFactor)) + 1.0f) * 0.01f), - 0.01f, MTXMODE_APPLY); - Matrix_Translate(0, -2700.0f, 0, MTXMODE_APPLY); - - Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); - AnimatedMat_Draw(gPlayState, sSlimeTexAnim); - gDPSetPrimColor(POLY_XLU_DISP++, 0, 100, 255, 255, 200, 255); - gDPSetEnvColor(POLY_XLU_DISP++, 255, 180, 0, 255); - - if (timer == 0) { - timer = 25; - } - - MATRIX_FINALIZE_AND_LOAD(POLY_XLU_DISP++, gPlayState->state.gfxCtx); - Scene_SetRenderModeXlu(gPlayState, 1, 2); - gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gChuchuBodyDL); - gSPSegment(POLY_XLU_DISP++, 9, (uintptr_t)gChuchuEyeOpenTex); - gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gChuchuEyesDL); - - CLOSE_DISPS(gPlayState->state.gfxCtx); - DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); - timer--; -} - extern void DrawSnapper() { SETUP_DRAW(SNAPPER_LIMB_MAX); static uintptr_t eyeTexture = (uintptr_t)Lib_SegmentedToVirtual((TexturePtr)gSnapperEyeOpenTex); diff --git a/mm/2s2h/Rando/DrawFuncs.h b/mm/2s2h/Rando/DrawFuncs.h index c2e924da3f..2239189732 100644 --- a/mm/2s2h/Rando/DrawFuncs.h +++ b/mm/2s2h/Rando/DrawFuncs.h @@ -19,6 +19,7 @@ void DrawBat(); void DrawBeamos(); void DrawBoe(); void DrawBubble(); +void DrawCaptainKeeta(); void DrawChuchu(); void DrawDeathArmos(); void DrawDeepPython(); @@ -34,8 +35,10 @@ void DrawFreezard(); void DrawGaro(); void DrawGekko(); void DrawGiantBee(); +void DrawGomess(); void DrawGuay(); void DrawHiploop(); +void DrawIgosDuIkana(); void DrawIronKnuckle(); void DrawKeese(); void DrawLeever(); diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index 0102941785..12eb2067ff 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -403,52 +403,53 @@ void DrawAbilityItem(RandoItemId randoItemId, Actor* actor) { // clang-format off std::unordered_map> soulDrawMap = { - { RI_SOUL_ALIEN, DrawAlien }, - { RI_SOUL_ARMOS, DrawArmos }, - { RI_SOUL_BAD_BAT, DrawBat }, - { RI_SOUL_BEAMOS, DrawBeamos }, - { RI_SOUL_BUBBLE, DrawBubble }, - { RI_SOUL_BOE, DrawBoe }, - { RI_SOUL_CHUCHU, DrawChuchu }, - { RI_SOUL_DEATH_ARMOS, DrawDeathArmos }, - { RI_SOUL_DEEP_PYTHON, DrawDeepPython }, - { RI_SOUL_DEKU_BABA, DrawDekuBaba }, - { RI_SOUL_DEXIHAND, DrawDexihand }, - { RI_SOUL_DINOLFOS, DrawDinolfos }, - { RI_SOUL_DODONGO, DrawDodongo }, - { RI_SOUL_DRAGONFLY, DrawDragonfly }, - { RI_SOUL_EENO, DrawEeno }, - { RI_SOUL_EYEGORE, DrawEyegore }, - { RI_SOUL_FLYING_POT, DrawFlyingPot }, - { RI_SOUL_FREEZARD, DrawFreezard }, - { RI_SOUL_GARO, DrawGaro }, - { RI_SOUL_GEKKO, DrawGekko }, - { RI_SOUL_GIANT_BEE, DrawGiantBee }, - { RI_SOUL_GUAY, DrawGuay }, - { RI_SOUL_HIPLOOP, DrawHiploop }, - { RI_SOUL_IRON_KNUCKLE, DrawIronKnuckle }, - { RI_SOUL_KEESE, DrawKeese }, - { RI_SOUL_LEEVER, DrawLeever }, - { RI_SOUL_LIKE_LIKE, DrawLikeLike }, - { RI_SOUL_MAD_SCRUB, DrawMadScrub }, - { RI_SOUL_NEJIRON, DrawNejiron }, - { RI_SOUL_OCTOROK, DrawOctorok }, - { RI_SOUL_PEAHAT, DrawPeahat }, - { RI_SOUL_PIRATE, DrawPirate }, - { RI_SOUL_POE, DrawPoe }, - { RI_SOUL_REAL_BOMBCHU, DrawRealBombchu }, - { RI_SOUL_REDEAD, DrawRedead }, - { RI_SOUL_SHELLBLADE, DrawShellBlade }, - { RI_SOUL_SKULLFISH, DrawSkullfish }, - { RI_SOUL_SKULLTULA, DrawSkulltula }, - { RI_SOUL_SNAPPER, DrawSnapper }, - { RI_SOUL_STALCHILD, DrawStalchild }, - { RI_SOUL_TAKKURI, DrawTakkuri }, - { RI_SOUL_TEKTITE, DrawTektite }, - { RI_SOUL_WALLMASTER, DrawWallmaster }, - { RI_SOUL_WART, DrawWart }, - { RI_SOUL_WIZROBE, DrawWizrobe }, - { RI_SOUL_WOLFOS, DrawWolfos }, + { RI_SOUL_ENEMY_ALIEN, DrawAlien }, + { RI_SOUL_ENEMY_ARMOS, DrawArmos }, + { RI_SOUL_ENEMY_BAD_BAT, DrawBat }, + { RI_SOUL_ENEMY_BEAMOS, DrawBeamos }, + { RI_SOUL_ENEMY_BUBBLE, DrawBubble }, + { RI_SOUL_ENEMY_BOE, DrawBoe }, + { RI_SOUL_ENEMY_CHUCHU, DrawChuchu }, + { RI_SOUL_ENEMY_CAPTAIN_KEETA, DrawCaptainKeeta }, + { RI_SOUL_ENEMY_DEATH_ARMOS, DrawDeathArmos }, + { RI_SOUL_ENEMY_DEEP_PYTHON, DrawDeepPython }, + { RI_SOUL_ENEMY_DEKU_BABA, DrawDekuBaba }, + { RI_SOUL_ENEMY_DEXIHAND, DrawDexihand }, + { RI_SOUL_ENEMY_DINOLFOS, DrawDinolfos }, + { RI_SOUL_ENEMY_DODONGO, DrawDodongo }, + { RI_SOUL_ENEMY_DRAGONFLY, DrawDragonfly }, + { RI_SOUL_ENEMY_EENO, DrawEeno }, + { RI_SOUL_ENEMY_EYEGORE, DrawEyegore }, + { RI_SOUL_ENEMY_FREEZARD, DrawFreezard }, + { RI_SOUL_ENEMY_GARO, DrawGaro }, + { RI_SOUL_ENEMY_GEKKO, DrawGekko }, + { RI_SOUL_ENEMY_GIANT_BEE, DrawGiantBee }, + { RI_SOUL_ENEMY_GOMESS, DrawGomess }, + { RI_SOUL_ENEMY_GUAY, DrawGuay }, + { RI_SOUL_ENEMY_HIPLOOP, DrawHiploop }, + { RI_SOUL_ENEMY_IGOS_DU_IKANA, DrawIgosDuIkana }, + { RI_SOUL_ENEMY_IRON_KNUCKLE, DrawIronKnuckle }, + { RI_SOUL_ENEMY_KEESE, DrawKeese }, + { RI_SOUL_ENEMY_LEEVER, DrawLeever }, + { RI_SOUL_ENEMY_LIKE_LIKE, DrawLikeLike }, + { RI_SOUL_ENEMY_MAD_SCRUB, DrawMadScrub }, + { RI_SOUL_ENEMY_NEJIRON, DrawNejiron }, + { RI_SOUL_ENEMY_OCTOROK, DrawOctorok }, + { RI_SOUL_ENEMY_PEAHAT, DrawPeahat }, + { RI_SOUL_ENEMY_PIRATE, DrawPirate }, + { RI_SOUL_ENEMY_POE, DrawPoe }, + { RI_SOUL_ENEMY_REDEAD, DrawRedead }, + { RI_SOUL_ENEMY_SHELLBLADE, DrawShellBlade }, + { RI_SOUL_ENEMY_SKULLFISH, DrawSkullfish }, + { RI_SOUL_ENEMY_SKULLTULA, DrawSkulltula }, + { RI_SOUL_ENEMY_SNAPPER, DrawSnapper }, + { RI_SOUL_ENEMY_STALCHILD, DrawStalchild }, + { RI_SOUL_ENEMY_TAKKURI, DrawTakkuri }, + { RI_SOUL_ENEMY_TEKTITE, DrawTektite }, + { RI_SOUL_ENEMY_WALLMASTER, DrawWallmaster }, + { RI_SOUL_ENEMY_WART, DrawWart }, + { RI_SOUL_ENEMY_WIZROBE, DrawWizrobe }, + { RI_SOUL_ENEMY_WOLFOS, DrawWolfos }, }; // clang-format on @@ -563,67 +564,68 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_PROGRESSIVE_WALLET: Rando::DrawItem(Rando::ConvertItem(randoItemId), actor); break; - case RI_SOUL_ALIEN: - case RI_SOUL_ARMOS: - case RI_SOUL_BAD_BAT: - case RI_SOUL_BEAMOS: - case RI_SOUL_BOE: - case RI_SOUL_BUBBLE: - case RI_SOUL_CHUCHU: - case RI_SOUL_DEATH_ARMOS: - case RI_SOUL_DEEP_PYTHON: - case RI_SOUL_DEKU_BABA: - case RI_SOUL_DEXIHAND: - case RI_SOUL_DINOLFOS: - case RI_SOUL_DODONGO: - case RI_SOUL_DRAGONFLY: - case RI_SOUL_EENO: - case RI_SOUL_EYEGORE: - case RI_SOUL_FLYING_POT: - case RI_SOUL_FREEZARD: - case RI_SOUL_GARO: - case RI_SOUL_GEKKO: - case RI_SOUL_GIANT_BEE: - case RI_SOUL_GUAY: - case RI_SOUL_HIPLOOP: - case RI_SOUL_IRON_KNUCKLE: - case RI_SOUL_KEESE: - case RI_SOUL_LEEVER: - case RI_SOUL_LIKE_LIKE: - case RI_SOUL_MAD_SCRUB: - case RI_SOUL_NEJIRON: - case RI_SOUL_OCTOROK: - case RI_SOUL_PEAHAT: - case RI_SOUL_PIRATE: - case RI_SOUL_POE: - case RI_SOUL_REAL_BOMBCHU: - case RI_SOUL_REDEAD: - case RI_SOUL_SHELLBLADE: - case RI_SOUL_SKULLFISH: - case RI_SOUL_SKULLTULA: - case RI_SOUL_SNAPPER: - case RI_SOUL_STALCHILD: - case RI_SOUL_TAKKURI: - case RI_SOUL_TEKTITE: - case RI_SOUL_WALLMASTER: - case RI_SOUL_WART: - case RI_SOUL_WIZROBE: - case RI_SOUL_WOLFOS: + case RI_SOUL_ENEMY_ALIEN: + case RI_SOUL_ENEMY_ARMOS: + case RI_SOUL_ENEMY_BAD_BAT: + case RI_SOUL_ENEMY_BEAMOS: + case RI_SOUL_ENEMY_BOE: + case RI_SOUL_ENEMY_BUBBLE: + case RI_SOUL_ENEMY_CAPTAIN_KEETA: + case RI_SOUL_ENEMY_CHUCHU: + case RI_SOUL_ENEMY_DEATH_ARMOS: + case RI_SOUL_ENEMY_DEEP_PYTHON: + case RI_SOUL_ENEMY_DEKU_BABA: + case RI_SOUL_ENEMY_DEXIHAND: + case RI_SOUL_ENEMY_DINOLFOS: + case RI_SOUL_ENEMY_DODONGO: + case RI_SOUL_ENEMY_DRAGONFLY: + case RI_SOUL_ENEMY_EENO: + case RI_SOUL_ENEMY_EYEGORE: + case RI_SOUL_ENEMY_FREEZARD: + case RI_SOUL_ENEMY_GARO: + case RI_SOUL_ENEMY_GEKKO: + case RI_SOUL_ENEMY_GIANT_BEE: + case RI_SOUL_ENEMY_GOMESS: + case RI_SOUL_ENEMY_GUAY: + case RI_SOUL_ENEMY_HIPLOOP: + case RI_SOUL_ENEMY_IGOS_DU_IKANA: + case RI_SOUL_ENEMY_IRON_KNUCKLE: + case RI_SOUL_ENEMY_KEESE: + case RI_SOUL_ENEMY_LEEVER: + case RI_SOUL_ENEMY_LIKE_LIKE: + case RI_SOUL_ENEMY_MAD_SCRUB: + case RI_SOUL_ENEMY_NEJIRON: + case RI_SOUL_ENEMY_OCTOROK: + case RI_SOUL_ENEMY_PEAHAT: + case RI_SOUL_ENEMY_PIRATE: + case RI_SOUL_ENEMY_POE: + case RI_SOUL_ENEMY_REDEAD: + case RI_SOUL_ENEMY_SHELLBLADE: + case RI_SOUL_ENEMY_SKULLFISH: + case RI_SOUL_ENEMY_SKULLTULA: + case RI_SOUL_ENEMY_SNAPPER: + case RI_SOUL_ENEMY_STALCHILD: + case RI_SOUL_ENEMY_TAKKURI: + case RI_SOUL_ENEMY_TEKTITE: + case RI_SOUL_ENEMY_WALLMASTER: + case RI_SOUL_ENEMY_WART: + case RI_SOUL_ENEMY_WIZROBE: + case RI_SOUL_ENEMY_WOLFOS: DrawSoul(randoItemId); break; - case RI_SOUL_GOHT: + case RI_SOUL_BOSS_GOHT: DrawGoht(); break; - case RI_SOUL_GYORG: + case RI_SOUL_BOSS_GYORG: DrawGyorg(); break; - case RI_SOUL_MAJORA: + case RI_SOUL_BOSS_MAJORA: DrawMajora(); break; - case RI_SOUL_ODOLWA: + case RI_SOUL_BOSS_ODOLWA: DrawOdolwa(); break; - case RI_SOUL_TWINMOLD: + case RI_SOUL_BOSS_TWINMOLD: DrawTwinmold(); break; case RI_FROG_BLUE: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 908e233d6d..729789cca5 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -1,4 +1,5 @@ #include "Rando/Rando.h" +#include "Rando/ActorBehavior/Souls.h" #include "Rando/MiscBehavior/MiscBehavior.h" extern "C" { @@ -110,8 +111,8 @@ void Rando::GiveItem(RandoItemId randoItemId) { if (gSaveContext.save.shipSaveInfo.rando.foundTriforcePieces == RANDO_SAVE_OPTIONS[RO_TRIFORCE_PIECES_REQUIRED]) { // Blocks the ability to beat the game through killing Majora until all Triforce Pieces are found. - if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_MAJORA)) { - Rando::GiveItem(RI_SOUL_MAJORA); + if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_MAJORA)) { + Rando::GiveItem(RI_SOUL_BOSS_MAJORA); } GameInteractor_ExecuteOnGameCompletion(); GameInteractor::Instance->events.emplace_back( @@ -268,58 +269,59 @@ void Rando::GiveItem(RandoItemId randoItemId) { // ITEM_POTION_RED will put a Red Potion bottle on the first bottle slot Item_Give(gPlayState, ITEM_LONGSHOT); break; - case RI_SOUL_GOHT: - case RI_SOUL_GYORG: - case RI_SOUL_MAJORA: - case RI_SOUL_ODOLWA: - case RI_SOUL_TWINMOLD: - case RI_SOUL_ALIEN: - case RI_SOUL_ARMOS: - case RI_SOUL_BAD_BAT: - case RI_SOUL_BEAMOS: - case RI_SOUL_BOE: - case RI_SOUL_BUBBLE: - case RI_SOUL_CHUCHU: - case RI_SOUL_DEATH_ARMOS: - case RI_SOUL_DEEP_PYTHON: - case RI_SOUL_DEKU_BABA: - case RI_SOUL_DEXIHAND: - case RI_SOUL_DINOLFOS: - case RI_SOUL_DODONGO: - case RI_SOUL_DRAGONFLY: - case RI_SOUL_EENO: - case RI_SOUL_EYEGORE: - case RI_SOUL_FLYING_POT: - case RI_SOUL_FREEZARD: - case RI_SOUL_GARO: - case RI_SOUL_GEKKO: - case RI_SOUL_GIANT_BEE: - case RI_SOUL_GUAY: - case RI_SOUL_HIPLOOP: - case RI_SOUL_IRON_KNUCKLE: - case RI_SOUL_KEESE: - case RI_SOUL_LEEVER: - case RI_SOUL_LIKE_LIKE: - case RI_SOUL_MAD_SCRUB: - case RI_SOUL_NEJIRON: - case RI_SOUL_OCTOROK: - case RI_SOUL_PEAHAT: - case RI_SOUL_PIRATE: - case RI_SOUL_POE: - case RI_SOUL_REAL_BOMBCHU: - case RI_SOUL_REDEAD: - case RI_SOUL_SHELLBLADE: - case RI_SOUL_SKULLFISH: - case RI_SOUL_SKULLTULA: - case RI_SOUL_SNAPPER: - case RI_SOUL_STALCHILD: - case RI_SOUL_TAKKURI: - case RI_SOUL_TEKTITE: - case RI_SOUL_WALLMASTER: - case RI_SOUL_WART: - case RI_SOUL_WIZROBE: - case RI_SOUL_WOLFOS: - Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ALIENS + (randoItemId - RI_SOUL_ALIEN)); + case RI_SOUL_BOSS_GOHT: + case RI_SOUL_BOSS_GYORG: + case RI_SOUL_BOSS_MAJORA: + case RI_SOUL_BOSS_ODOLWA: + case RI_SOUL_BOSS_TWINMOLD: + case RI_SOUL_ENEMY_ALIEN: + case RI_SOUL_ENEMY_ARMOS: + case RI_SOUL_ENEMY_BAD_BAT: + case RI_SOUL_ENEMY_BEAMOS: + case RI_SOUL_ENEMY_BOE: + case RI_SOUL_ENEMY_BUBBLE: + case RI_SOUL_ENEMY_CAPTAIN_KEETA: + case RI_SOUL_ENEMY_CHUCHU: + case RI_SOUL_ENEMY_DEATH_ARMOS: + case RI_SOUL_ENEMY_DEEP_PYTHON: + case RI_SOUL_ENEMY_DEKU_BABA: + case RI_SOUL_ENEMY_DEXIHAND: + case RI_SOUL_ENEMY_DINOLFOS: + case RI_SOUL_ENEMY_DODONGO: + case RI_SOUL_ENEMY_DRAGONFLY: + case RI_SOUL_ENEMY_EENO: + case RI_SOUL_ENEMY_EYEGORE: + case RI_SOUL_ENEMY_FREEZARD: + case RI_SOUL_ENEMY_GARO: + case RI_SOUL_ENEMY_GEKKO: + case RI_SOUL_ENEMY_GIANT_BEE: + case RI_SOUL_ENEMY_GOMESS: + case RI_SOUL_ENEMY_GUAY: + case RI_SOUL_ENEMY_HIPLOOP: + case RI_SOUL_ENEMY_IGOS_DU_IKANA: + case RI_SOUL_ENEMY_IRON_KNUCKLE: + case RI_SOUL_ENEMY_KEESE: + case RI_SOUL_ENEMY_LEEVER: + case RI_SOUL_ENEMY_LIKE_LIKE: + case RI_SOUL_ENEMY_MAD_SCRUB: + case RI_SOUL_ENEMY_NEJIRON: + case RI_SOUL_ENEMY_OCTOROK: + case RI_SOUL_ENEMY_PEAHAT: + case RI_SOUL_ENEMY_PIRATE: + case RI_SOUL_ENEMY_POE: + case RI_SOUL_ENEMY_REDEAD: + case RI_SOUL_ENEMY_SHELLBLADE: + case RI_SOUL_ENEMY_SKULLFISH: + case RI_SOUL_ENEMY_SKULLTULA: + case RI_SOUL_ENEMY_SNAPPER: + case RI_SOUL_ENEMY_STALCHILD: + case RI_SOUL_ENEMY_TAKKURI: + case RI_SOUL_ENEMY_TEKTITE: + case RI_SOUL_ENEMY_WALLMASTER: + case RI_SOUL_ENEMY_WART: + case RI_SOUL_ENEMY_WIZROBE: + case RI_SOUL_ENEMY_WOLFOS: + Flags_SetRandoInf(SOUL_RI_TO_RANDO_INF(randoItemId)); break; case RI_FROG_BLUE: SET_WEEKEVENTREG(WEEKEVENTREG_33_01); diff --git a/mm/2s2h/Rando/Logic/Logic.h b/mm/2s2h/Rando/Logic/Logic.h index 0f5cb762b7..f5939b88ab 100644 --- a/mm/2s2h/Rando/Logic/Logic.h +++ b/mm/2s2h/Rando/Logic/Logic.h @@ -197,20 +197,20 @@ inline bool CanKillEnemy(ActorId EnemyId) { case ACTOR_BOSS_01: // Odolwa return (CAN_USE_SWORD || CAN_BE_GORON || CAN_BE_ZORA || CAN_USE_EXPLOSIVE || CAN_USE_MAGIC_ARROW(FIRE) || CAN_USE_MAGIC_ARROW(LIGHT)) && - (Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ODOLWA) || + (Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_ODOLWA) || RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_NO); case ACTOR_BOSS_02: // Twinmold return (HAS_ITEM(ITEM_BOW) || (HAS_ITEM(ITEM_MASK_GIANT) && HAS_MAGIC && CAN_USE_HUMAN_SWORD)) && - (Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD) || + (Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_TWINMOLD) || RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_NO); case ACTOR_BOSS_03: // Gyorg return ((CAN_BE_DEITY && HAS_MAGIC) || (CAN_BE_ZORA && HAS_MAGIC)) && - (Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GYORG) || + (Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_GYORG) || RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_NO); case ACTOR_BOSS_04: // Wart return (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA); case ACTOR_BOSS_HAKUGIN: // Goht - return (CAN_USE_MAGIC_ARROW(FIRE)) && (Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT) || + return (CAN_USE_MAGIC_ARROW(FIRE)) && (Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_GOHT) || RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_NO); case ACTOR_EN_KNIGHT: // Igos du Ikana/IdI Lackey return (CAN_USE_MAGIC_ARROW(FIRE) && @@ -219,7 +219,7 @@ inline bool CanKillEnemy(ActorId EnemyId) { case ACTOR_EN_KAIZOKU: // Fighter Pirate return (CAN_USE_SWORD || CAN_BE_ZORA); case ACTOR_EN_PAMETFROG: // Woodfall Temple Gekko (and Snapper) - return (HAS_ITEM(ITEM_BOW) && (CAN_BE_DEKU || CAN_USE_EXPLOSIVE || CAN_BE_GORON)); + return (HAS_ITEM(ITEM_BOW) && CanKillEnemy(ACTOR_EN_BIGPAMET)); case ACTOR_EN_BIGSLIME: // Great Bay Temple Gekko return (CAN_USE_MAGIC_ARROW(ICE)); case ACTOR_EN_SW: // Gold Skulltula & Skullwalltula diff --git a/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp b/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp index cc8c8d141d..59bc244c31 100644 --- a/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp +++ b/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp @@ -294,7 +294,7 @@ static RegisterShipInitFunc initFunc([]() { CONNECTION(RR_GREAT_BAY_TEMPLE_BEFORE_WART, KEY_COUNT(GREAT_BAY_TEMPLE) >= 1), }, .events = { - EVENT(RE_GREAT_BAY_RED_SWITCH_1, CAN_USE_MAGIC_ARROW(ICE) && Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS)), + EVENT(RE_GREAT_BAY_RED_SWITCH_1, CAN_USE_MAGIC_ARROW(ICE) && Flags_GetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_ENEMY_OCTOROKS)), } }; Regions[RR_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM] = RandoRegion{ .sceneId = SCENE_SEA, diff --git a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp index 7d0640dc0d..ceee5441fb 100644 --- a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp +++ b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp @@ -244,17 +244,17 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { itemPool.push_back(RI_SHIELD_HERO); // Add other items that don't have a vanilla location like Souls or Triforce Pieces - std::vector bossSouls = { RI_SOUL_GOHT, RI_SOUL_GYORG, RI_SOUL_ODOLWA, RI_SOUL_TWINMOLD, - RI_SOUL_MAJORA }; + std::vector bossSouls = { RI_SOUL_BOSS_GOHT, RI_SOUL_BOSS_GYORG, RI_SOUL_BOSS_ODOLWA, + RI_SOUL_BOSS_TWINMOLD, RI_SOUL_BOSS_MAJORA }; bool shuffleMajoraSoul = (RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES && RANDO_SAVE_OPTIONS[RO_SHUFFLE_TRIFORCE_PIECES] == RO_GENERIC_NO); for (auto& boss : bossSouls) { - if (boss == RI_SOUL_MAJORA) { + if (boss == RI_SOUL_BOSS_MAJORA) { if (shuffleMajoraSoul) { itemPool.push_back(boss); } else { if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_TRIFORCE_PIECES] == RO_GENERIC_NO) { - Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_MAJORA); + Flags_SetRandoInf(RANDO_INF_OBTAINED_SOUL_OF_BOSS_MAJORA); } } continue; @@ -262,11 +262,11 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_BOSS_SOULS] == RO_GENERIC_YES) { itemPool.push_back(boss); } else { - Flags_SetRandoInf(ENEMY_SOUL_RI_TO_RANDO_INF(boss)); + Flags_SetRandoInf(SOUL_RI_TO_RANDO_INF(boss)); } } - for (int i = RI_SOUL_ALIEN; i <= RI_SOUL_WOLFOS; i++) { + for (int i = RI_SOUL_ENEMY_ALIEN; i <= RI_SOUL_ENEMY_WOLFOS; i++) { bool shouldSkipSoul = false; for (auto& boss : bossSouls) { if (boss == (RandoItemId)i) { @@ -278,7 +278,7 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_YES) { itemPool.push_back((RandoItemId)i); } else { - Flags_SetRandoInf(ENEMY_SOUL_RI_TO_RANDO_INF(i)); + Flags_SetRandoInf(SOUL_RI_TO_RANDO_INF(i)); } } } @@ -454,7 +454,8 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { // Give INF for Enemy Soul if the option is OFF if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_ENEMY_SOULS] == RO_GENERIC_NO) { - for (int i = RANDO_INF_OBTAINED_SOUL_OF_ALIENS; i <= RANDO_INF_OBTAINED_SOUL_OF_WOLFOS; i++) { + for (int i = RANDO_INF_OBTAINED_SOUL_OF_ENEMY_ALIENS; i <= RANDO_INF_OBTAINED_SOUL_OF_ENEMY_WOLFOS; + i++) { Flags_SetRandoInf(i); } } diff --git a/mm/2s2h/Rando/RemoveItem.cpp b/mm/2s2h/Rando/RemoveItem.cpp index 6a3c79341b..e2bcc28f71 100644 --- a/mm/2s2h/Rando/RemoveItem.cpp +++ b/mm/2s2h/Rando/RemoveItem.cpp @@ -1,4 +1,5 @@ #include "Rando/Rando.h" +#include "Rando/ActorBehavior/Souls.h" extern "C" { #include "variables.h" @@ -353,12 +354,12 @@ void Rando::RemoveItem(RandoItemId randoItemId) { case RI_REMAINS_TWINMOLD: REMOVE_QUEST_ITEM(QUEST_REMAINS_TWINMOLD); break; - case RI_SOUL_GOHT: - case RI_SOUL_GYORG: - case RI_SOUL_MAJORA: - case RI_SOUL_ODOLWA: - case RI_SOUL_TWINMOLD: - Flags_ClearRandoInf(RANDO_INF_OBTAINED_SOUL_OF_GOHT + (randoItemId - RI_SOUL_GOHT)); + case RI_SOUL_BOSS_GOHT: + case RI_SOUL_BOSS_GYORG: + case RI_SOUL_BOSS_MAJORA: + case RI_SOUL_BOSS_ODOLWA: + case RI_SOUL_BOSS_TWINMOLD: + Flags_ClearRandoInf(SOUL_RI_TO_RANDO_INF(randoItemId)); break; case RI_FROG_BLUE: CLEAR_WEEKEVENTREG(WEEKEVENTREG_33_01); diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 221e9be0e7..4fbab35730 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -171,57 +171,58 @@ std::map Items = { RI(RI_SONG_STORMS, "the", "Song of Storms", RITYPE_MAJOR, ITEM_SONG_STORMS, GI_NONE, GID_NONE), RI(RI_SONG_SUN, "the", "Sun's Song", RITYPE_MAJOR, ITEM_SONG_SUN, GI_NONE, GID_NONE), RI(RI_SONG_TIME, "the", "Song of Time", RITYPE_MAJOR, ITEM_SONG_TIME, GI_NONE, GID_NONE), - RI(RI_SOUL_ALIEN, "the", "Soul of Aliens", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_ARMOS, "the", "Soul of Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_BAD_BAT, "the", "Soul of Bad Bats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_BEAMOS, "the", "Soul of Beamos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_BOE, "the", "Soul of Boes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_BUBBLE, "the", "Soul of Bubbles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_CHUCHU, "the", "Soul of Chuchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_DEATH_ARMOS, "the", "Soul of Death Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_DEEP_PYTHON, "the", "Soul of Deep Pythons", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_DEKU_BABA, "the", "Soul of Deku Babas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_DEXIHAND, "the", "Soul of Dexihands", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_DINOLFOS, "the", "Soul of Dinolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_DODONGO, "the", "Soul of Dodongos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_DRAGONFLY, "the", "Soul of Dragonflies", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_EENO, "the", "Soul of Eenos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_EYEGORE, "the", "Soul of Eyegores", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_FLYING_POT, "the", "Soul of Flying Pots", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_FREEZARD, "the", "Soul of Freezards", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GARO, "the", "Soul of Garos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GEKKO, "the", "Soul of Gekkos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GIANT_BEE, "the", "Soul of Giant Bees", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_HIPLOOP, "the", "Soul of Hiploops", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_GYORG, "the", "Soul of Gyorg", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_IRON_KNUCKLE, "the", "Soul of Iron Knuckles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_KEESE, "the", "Soul of Keese", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_LEEVER, "the", "Soul of Leevers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_LIKE_LIKE, "the", "Soul of Like Likes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_MAD_SCRUB, "the", "Soul of Mad Scrubs", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_MAJORA, "the", "Soul of Majora", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_NEJIRON, "the", "Soul of Nejirons", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_OCTOROK, "the", "Soul of Octoroks", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_ODOLWA, "the", "Soul of Odolwa", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_PEAHAT, "the", "Soul of Peahats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_PIRATE, "the", "Soul of Pirates", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_POE, "the", "Soul of Poes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_REAL_BOMBCHU, "the", "Soul of Real Bombchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_REDEAD, "the", "Soul of Redeads", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_SHELLBLADE, "the", "Soul of Shellblades", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_SKULLFISH, "the", "Soul of Skullfish", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_SKULLTULA, "the", "Soul of Skulltulas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_SNAPPER, "the", "Soul of Snappers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_STALCHILD, "the", "Soul of Stalchildren", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_TAKKURI, "the", "Soul of Takkuri", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_TEKTITE, "the", "Soul of Tektites", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_TWINMOLD, "the", "Soul of Twinmold", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_WALLMASTER, "the", "Soul of Wallmasters", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_WART, "the", "Soul of Warts", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_WIZROBE, "the", "Soul of Wizrobes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), - RI(RI_SOUL_WOLFOS, "the", "Soul of Wolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BOSS_GOHT, "the", "Soul of Goht", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BOSS_GYORG, "the", "Soul of Gyorg", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BOSS_MAJORA, "the", "Soul of Majora", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BOSS_ODOLWA, "the", "Soul of Odolwa", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_BOSS_TWINMOLD, "the", "Soul of Twinmold", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_ALIEN, "the", "Soul of Aliens", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_ARMOS, "the", "Soul of Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_BAD_BAT, "the", "Soul of Bad Bats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_BEAMOS, "the", "Soul of Beamos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_BOE, "the", "Soul of Boes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_BUBBLE, "the", "Soul of Bubbles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_CHUCHU, "the", "Soul of Chuchus", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_CAPTAIN_KEETA, "the", "Soul of Captain Keeta", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_DEATH_ARMOS, "the", "Soul of Death Armos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_DEEP_PYTHON, "the", "Soul of Deep Pythons", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_DEKU_BABA, "the", "Soul of Deku Babas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_DEXIHAND, "the", "Soul of Dexihands", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_DINOLFOS, "the", "Soul of Dinolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_DODONGO, "the", "Soul of Dodongos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_DRAGONFLY, "the", "Soul of Dragonflies", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_EENO, "the", "Soul of Eenos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_EYEGORE, "the", "Soul of Eyegores", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_FREEZARD, "the", "Soul of Freezards", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_GARO, "the", "Soul of Garos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_GEKKO, "the", "Soul of Gekkos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_GIANT_BEE, "the", "Soul of Giant Bees", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_GOMESS, "the", "Soul of Gomess", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_GUAY, "the", "Soul of Guays", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_HIPLOOP, "the", "Soul of Hiploops", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_IGOS_DU_IKANA, "the", "Soul of Igos du Ikana", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_IRON_KNUCKLE, "the", "Soul of Iron Knuckles", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_KEESE, "the", "Soul of Keese", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_LEEVER, "the", "Soul of Leevers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_LIKE_LIKE, "the", "Soul of Like Likes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_MAD_SCRUB, "the", "Soul of Mad Scrubs", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_NEJIRON, "the", "Soul of Nejirons", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_OCTOROK, "the", "Soul of Octoroks", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_PEAHAT, "the", "Soul of Peahats", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_PIRATE, "the", "Soul of Pirates", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_POE, "the", "Soul of Poes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_REDEAD, "the", "Soul of Redeads", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_SHELLBLADE, "the", "Soul of Shellblades", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_SKULLFISH, "the", "Soul of Skullfish", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_SKULLTULA, "the", "Soul of Skulltulas", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_SNAPPER, "the", "Soul of Snappers", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_STALCHILD, "the", "Soul of Stalchildren", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_TAKKURI, "the", "Soul of Takkuri", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_TEKTITE, "the", "Soul of Tektites", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_WALLMASTER, "the", "Soul of Wallmasters", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_WART, "the", "Soul of Warts", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_WIZROBE, "the", "Soul of Wizrobes", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_SOUL_ENEMY_WOLFOS, "the", "Soul of Wolfos", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_STONE_TOWER_BOSS_KEY, "the", "Stone Tower Boss Key", RITYPE_BOSS_KEY, ITEM_KEY_BOSS, GI_KEY_BOSS, GID_KEY_BOSS), RI(RI_STONE_TOWER_COMPASS, "the", "Stone Tower Compass", RITYPE_LESSER, ITEM_COMPASS, GI_COMPASS, GID_COMPASS), RI(RI_STONE_TOWER_MAP, "the", "Stone Tower Map", RITYPE_LESSER, ITEM_DUNGEON_MAP, GI_MAP, GID_DUNGEON_MAP), @@ -273,7 +274,7 @@ std::unordered_map> StartingItems RI_LETTER_TO_KAFEI, RI_PENDANT_OF_MEMORIES } }, { STARTING_ITEMS_MISC, - { RI_SOUL_GOHT, RI_SOUL_GYORG, RI_SOUL_MAJORA, RI_SOUL_ODOLWA, RI_SOUL_TWINMOLD, + { RI_SOUL_BOSS_GOHT, RI_SOUL_BOSS_GYORG, RI_SOUL_BOSS_MAJORA, RI_SOUL_BOSS_ODOLWA, RI_SOUL_BOSS_TWINMOLD, RI_FROG_BLUE, RI_FROG_CYAN, RI_FROG_PINK, RI_FROG_WHITE } }, }; @@ -371,57 +372,58 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { return (const char*)gItemIcons[ITEM_SONG_LULLABY]; case RI_PROGRESSIVE_MAGIC: return (const char*)gItemIcons[ITEM_MAGIC_JAR_SMALL]; - case RI_SOUL_GOHT: - case RI_SOUL_GYORG: - case RI_SOUL_MAJORA: - case RI_SOUL_ODOLWA: - case RI_SOUL_TWINMOLD: - case RI_SOUL_ALIEN: - case RI_SOUL_ARMOS: - case RI_SOUL_BAD_BAT: - case RI_SOUL_BEAMOS: - case RI_SOUL_BOE: - case RI_SOUL_BUBBLE: - case RI_SOUL_CHUCHU: - case RI_SOUL_DEATH_ARMOS: - case RI_SOUL_DEEP_PYTHON: - case RI_SOUL_DEKU_BABA: - case RI_SOUL_DEXIHAND: - case RI_SOUL_DINOLFOS: - case RI_SOUL_DODONGO: - case RI_SOUL_DRAGONFLY: - case RI_SOUL_EENO: - case RI_SOUL_EYEGORE: - case RI_SOUL_FLYING_POT: - case RI_SOUL_FREEZARD: - case RI_SOUL_GARO: - case RI_SOUL_GEKKO: - case RI_SOUL_GIANT_BEE: - case RI_SOUL_GUAY: - case RI_SOUL_HIPLOOP: - case RI_SOUL_IRON_KNUCKLE: - case RI_SOUL_KEESE: - case RI_SOUL_LEEVER: - case RI_SOUL_LIKE_LIKE: - case RI_SOUL_MAD_SCRUB: - case RI_SOUL_NEJIRON: - case RI_SOUL_OCTOROK: - case RI_SOUL_PEAHAT: - case RI_SOUL_PIRATE: - case RI_SOUL_POE: - case RI_SOUL_REAL_BOMBCHU: - case RI_SOUL_REDEAD: - case RI_SOUL_SHELLBLADE: - case RI_SOUL_SKULLFISH: - case RI_SOUL_SKULLTULA: - case RI_SOUL_SNAPPER: - case RI_SOUL_STALCHILD: - case RI_SOUL_TAKKURI: - case RI_SOUL_TEKTITE: - case RI_SOUL_WALLMASTER: - case RI_SOUL_WART: - case RI_SOUL_WIZROBE: - case RI_SOUL_WOLFOS: + case RI_SOUL_BOSS_GOHT: + case RI_SOUL_BOSS_GYORG: + case RI_SOUL_BOSS_MAJORA: + case RI_SOUL_BOSS_ODOLWA: + case RI_SOUL_BOSS_TWINMOLD: + case RI_SOUL_ENEMY_ALIEN: + case RI_SOUL_ENEMY_ARMOS: + case RI_SOUL_ENEMY_BAD_BAT: + case RI_SOUL_ENEMY_BEAMOS: + case RI_SOUL_ENEMY_BOE: + case RI_SOUL_ENEMY_BUBBLE: + case RI_SOUL_ENEMY_CAPTAIN_KEETA: + case RI_SOUL_ENEMY_CHUCHU: + case RI_SOUL_ENEMY_DEATH_ARMOS: + case RI_SOUL_ENEMY_DEEP_PYTHON: + case RI_SOUL_ENEMY_DEKU_BABA: + case RI_SOUL_ENEMY_DEXIHAND: + case RI_SOUL_ENEMY_DINOLFOS: + case RI_SOUL_ENEMY_DODONGO: + case RI_SOUL_ENEMY_DRAGONFLY: + case RI_SOUL_ENEMY_EENO: + case RI_SOUL_ENEMY_EYEGORE: + case RI_SOUL_ENEMY_FREEZARD: + case RI_SOUL_ENEMY_GARO: + case RI_SOUL_ENEMY_GEKKO: + case RI_SOUL_ENEMY_GIANT_BEE: + case RI_SOUL_ENEMY_GOMESS: + case RI_SOUL_ENEMY_GUAY: + case RI_SOUL_ENEMY_HIPLOOP: + case RI_SOUL_ENEMY_IGOS_DU_IKANA: + case RI_SOUL_ENEMY_IRON_KNUCKLE: + case RI_SOUL_ENEMY_KEESE: + case RI_SOUL_ENEMY_LEEVER: + case RI_SOUL_ENEMY_LIKE_LIKE: + case RI_SOUL_ENEMY_MAD_SCRUB: + case RI_SOUL_ENEMY_NEJIRON: + case RI_SOUL_ENEMY_OCTOROK: + case RI_SOUL_ENEMY_PEAHAT: + case RI_SOUL_ENEMY_PIRATE: + case RI_SOUL_ENEMY_POE: + case RI_SOUL_ENEMY_REDEAD: + case RI_SOUL_ENEMY_SHELLBLADE: + case RI_SOUL_ENEMY_SKULLFISH: + case RI_SOUL_ENEMY_SKULLTULA: + case RI_SOUL_ENEMY_SNAPPER: + case RI_SOUL_ENEMY_STALCHILD: + case RI_SOUL_ENEMY_TAKKURI: + case RI_SOUL_ENEMY_TEKTITE: + case RI_SOUL_ENEMY_WALLMASTER: + case RI_SOUL_ENEMY_WART: + case RI_SOUL_ENEMY_WIZROBE: + case RI_SOUL_ENEMY_WOLFOS: return (const char*)gDungeonMapSkullTex; case RI_FROG_BLUE: case RI_FROG_CYAN: diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 4d87c3e7d3..122afeb9eb 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2457,57 +2457,58 @@ typedef enum { RI_SONG_STORMS, RI_SONG_SUN, RI_SONG_TIME, - RI_SOUL_ALIEN, - RI_SOUL_ARMOS, - RI_SOUL_BAD_BAT, - RI_SOUL_BEAMOS, - RI_SOUL_BOE, - RI_SOUL_BUBBLE, - RI_SOUL_CHUCHU, - RI_SOUL_DEATH_ARMOS, - RI_SOUL_DEEP_PYTHON, - RI_SOUL_DEKU_BABA, - RI_SOUL_DEXIHAND, - RI_SOUL_DINOLFOS, - RI_SOUL_DODONGO, - RI_SOUL_DRAGONFLY, - RI_SOUL_EENO, - RI_SOUL_EYEGORE, - RI_SOUL_FLYING_POT, - RI_SOUL_FREEZARD, - RI_SOUL_GARO, - RI_SOUL_GEKKO, - RI_SOUL_GIANT_BEE, - RI_SOUL_GOHT, - RI_SOUL_GUAY, - RI_SOUL_HIPLOOP, - RI_SOUL_GYORG, - RI_SOUL_IRON_KNUCKLE, - RI_SOUL_KEESE, - RI_SOUL_LEEVER, - RI_SOUL_LIKE_LIKE, - RI_SOUL_MAD_SCRUB, - RI_SOUL_MAJORA, - RI_SOUL_NEJIRON, - RI_SOUL_OCTOROK, - RI_SOUL_ODOLWA, - RI_SOUL_PEAHAT, - RI_SOUL_PIRATE, - RI_SOUL_POE, - RI_SOUL_REAL_BOMBCHU, - RI_SOUL_REDEAD, - RI_SOUL_SHELLBLADE, - RI_SOUL_SKULLFISH, - RI_SOUL_SKULLTULA, - RI_SOUL_SNAPPER, - RI_SOUL_STALCHILD, - RI_SOUL_TAKKURI, - RI_SOUL_TEKTITE, - RI_SOUL_TWINMOLD, - RI_SOUL_WALLMASTER, - RI_SOUL_WART, - RI_SOUL_WIZROBE, - RI_SOUL_WOLFOS, + RI_SOUL_BOSS_GOHT, + RI_SOUL_BOSS_GYORG, + RI_SOUL_BOSS_MAJORA, + RI_SOUL_BOSS_ODOLWA, + RI_SOUL_BOSS_TWINMOLD, + RI_SOUL_ENEMY_ALIEN, + RI_SOUL_ENEMY_ARMOS, + RI_SOUL_ENEMY_BAD_BAT, + RI_SOUL_ENEMY_BEAMOS, + RI_SOUL_ENEMY_BOE, + RI_SOUL_ENEMY_BUBBLE, + RI_SOUL_ENEMY_CAPTAIN_KEETA, + RI_SOUL_ENEMY_CHUCHU, + RI_SOUL_ENEMY_DEATH_ARMOS, + RI_SOUL_ENEMY_DEEP_PYTHON, + RI_SOUL_ENEMY_DEKU_BABA, + RI_SOUL_ENEMY_DEXIHAND, + RI_SOUL_ENEMY_DINOLFOS, + RI_SOUL_ENEMY_DODONGO, + RI_SOUL_ENEMY_DRAGONFLY, + RI_SOUL_ENEMY_EENO, + RI_SOUL_ENEMY_EYEGORE, + RI_SOUL_ENEMY_FREEZARD, + RI_SOUL_ENEMY_GARO, + RI_SOUL_ENEMY_GEKKO, + RI_SOUL_ENEMY_GIANT_BEE, + RI_SOUL_ENEMY_GOMESS, + RI_SOUL_ENEMY_GUAY, + RI_SOUL_ENEMY_HIPLOOP, + RI_SOUL_ENEMY_IGOS_DU_IKANA, + RI_SOUL_ENEMY_IRON_KNUCKLE, + RI_SOUL_ENEMY_KEESE, + RI_SOUL_ENEMY_LEEVER, + RI_SOUL_ENEMY_LIKE_LIKE, + RI_SOUL_ENEMY_MAD_SCRUB, + RI_SOUL_ENEMY_NEJIRON, + RI_SOUL_ENEMY_OCTOROK, + RI_SOUL_ENEMY_PEAHAT, + RI_SOUL_ENEMY_PIRATE, + RI_SOUL_ENEMY_POE, + RI_SOUL_ENEMY_REDEAD, + RI_SOUL_ENEMY_SHELLBLADE, + RI_SOUL_ENEMY_SKULLFISH, + RI_SOUL_ENEMY_SKULLTULA, + RI_SOUL_ENEMY_SNAPPER, + RI_SOUL_ENEMY_STALCHILD, + RI_SOUL_ENEMY_TAKKURI, + RI_SOUL_ENEMY_TEKTITE, + RI_SOUL_ENEMY_WALLMASTER, + RI_SOUL_ENEMY_WART, + RI_SOUL_ENEMY_WIZROBE, + RI_SOUL_ENEMY_WOLFOS, RI_STONE_TOWER_BOSS_KEY, RI_STONE_TOWER_COMPASS, RI_STONE_TOWER_MAP, @@ -2941,57 +2942,59 @@ typedef enum { RANDO_INF_OBTAINED_LETTER_TO_MAMA, RANDO_INF_OBTAINED_LETTER_TO_KAFEI, RANDO_INF_OBTAINED_PENDANT_OF_MEMORIES, - RANDO_INF_OBTAINED_SOUL_OF_ALIENS, - RANDO_INF_OBTAINED_SOUL_OF_ARMOS, - RANDO_INF_OBTAINED_SOUL_OF_BAD_BATS, - RANDO_INF_OBTAINED_SOUL_OF_BEAMOS, - RANDO_INF_OBTAINED_SOUL_OF_BOES, - RANDO_INF_OBTAINED_SOUL_OF_BUBBLES, - RANDO_INF_OBTAINED_SOUL_OF_CHUCHUS, - RANDO_INF_OBTAINED_SOUL_OF_DEATH_ARMOS, - RANDO_INF_OBTAINED_SOUL_OF_DEEP_PYTHONS, - RANDO_INF_OBTAINED_SOUL_OF_DEKU_BABAS, - RANDO_INF_OBTAINED_SOUL_OF_DEXIHANDS, - RANDO_INF_OBTAINED_SOUL_OF_DINOLFOS, - RANDO_INF_OBTAINED_SOUL_OF_DODONGOS, - RANDO_INF_OBTAINED_SOUL_OF_DRAGONFLIES, - RANDO_INF_OBTAINED_SOUL_OF_EENOS, - RANDO_INF_OBTAINED_SOUL_OF_EYEGORES, - RANDO_INF_OBTAINED_SOUL_OF_FLYING_POTS, - RANDO_INF_OBTAINED_SOUL_OF_FREEZARDS, - RANDO_INF_OBTAINED_SOUL_OF_GAROS, - RANDO_INF_OBTAINED_SOUL_OF_GEKKOS, - RANDO_INF_OBTAINED_SOUL_OF_GIANT_BEES, - RANDO_INF_OBTAINED_SOUL_OF_GOHT, - RANDO_INF_OBTAINED_SOUL_OF_GUAYS, - RANDO_INF_OBTAINED_SOUL_OF_HIPLOOPS, - RANDO_INF_OBTAINED_SOUL_OF_GYORG, - RANDO_INF_OBTAINED_SOUL_OF_IRON_KNUCKLES, - RANDO_INF_OBTAINED_SOUL_OF_KEESE, - RANDO_INF_OBTAINED_SOUL_OF_LEEVERS, - RANDO_INF_OBTAINED_SOUL_OF_LIKE_LIKES, - RANDO_INF_OBTAINED_SOUL_OF_MAD_SCRUBS, - RANDO_INF_OBTAINED_SOUL_OF_MAJORA, - RANDO_INF_OBTAINED_SOUL_OF_NEJIRONS, - RANDO_INF_OBTAINED_SOUL_OF_OCTOROKS, - RANDO_INF_OBTAINED_SOUL_OF_ODOLWA, - RANDO_INF_OBTAINED_SOUL_OF_PEAHATS, - RANDO_INF_OBTAINED_SOUL_OF_PIRATES, - RANDO_INF_OBTAINED_SOUL_OF_POES, - RANDO_INF_OBTAINED_SOUL_OF_REAL_BOMBCHUS, - RANDO_INF_OBTAINED_SOUL_OF_REDEADS, - RANDO_INF_OBTAINED_SOUL_OF_SHELLBLADES, - RANDO_INF_OBTAINED_SOUL_OF_SKULLFISH, - RANDO_INF_OBTAINED_SOUL_OF_SKULLTULAS, - RANDO_INF_OBTAINED_SOUL_OF_SNAPPERS, - RANDO_INF_OBTAINED_SOUL_OF_STALCHILDREN, - RANDO_INF_OBTAINED_SOUL_OF_TAKKURI, - RANDO_INF_OBTAINED_SOUL_OF_TEKTITES, - RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD, - RANDO_INF_OBTAINED_SOUL_OF_WALLMASTERS, - RANDO_INF_OBTAINED_SOUL_OF_WARTS, - RANDO_INF_OBTAINED_SOUL_OF_WIZROBES, - RANDO_INF_OBTAINED_SOUL_OF_WOLFOS, + RANDO_INF_OBTAINED_SOUL_OF_BOSS_GOHT, + RANDO_INF_OBTAINED_SOUL_OF_BOSS_GYORG, + RANDO_INF_OBTAINED_SOUL_OF_BOSS_MAJORA, + RANDO_INF_OBTAINED_SOUL_OF_BOSS_ODOLWA, + RANDO_INF_OBTAINED_SOUL_OF_BOSS_TWINMOLD, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_ALIENS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_ARMOS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_BAD_BATS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_BEAMOS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_BOES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_BUBBLES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_CAPTAIN_KEETA, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_CHUCHUS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_DEATH_ARMOS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_DEEP_PYTHONS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_DEKU_BABAS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_DEXIHANDS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_DINOLFOS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_DODONGOS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_DRAGONFLIES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_EENOS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_EYEGORES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_FREEZARDS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_GAROS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_GEKKOS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_GIANT_BEES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_GOMESS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_GUAYS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_HIPLOOPS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_IGOS_DU_IKANA, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_IRON_KNUCKLES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_KEESE, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_LEEVERS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_LIKE_LIKES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_MAD_SCRUBS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_NEJIRONS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_OCTOROKS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_ODOLWA, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_PEAHATS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_PIRATES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_POES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_REDEADS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_SHELLBLADES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_SKULLFISH, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_SKULLTULAS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_SNAPPERS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_STALCHILDREN, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_TAKKURI, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_TEKTITES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_WALLMASTERS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_WARTS, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_WIZROBES, + RANDO_INF_OBTAINED_SOUL_OF_ENEMY_WOLFOS, RANDO_INF_OBTAINED_SWIM, RANDO_INF_MAX, } RandoInf; From fd5dddc9cb44b328dbfde624233d0348e1ce6c03 Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Wed, 31 Dec 2025 21:12:48 -0500 Subject: [PATCH 33/34] Add Enemy Souls to item tracker --- .../Trackers/ItemTracker/ItemTrackerSettings.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp index 1a6a7ad866..96a35a3a8e 100644 --- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp +++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp @@ -27,7 +27,7 @@ std::vector listOrder = { }; std::vector randoListOrder = { - "Frogs", "Boss Souls", "Owl Statues", "Tingle Maps", "Misc", + "Frogs", "Boss Souls", "Enemy Souls", "Owl Statues", "Tingle Maps", "Misc", }; std::map> defaultItemLists = { @@ -44,7 +44,7 @@ std::map> defaultItemLists = std::map> randoItemLists = { { "Frogs", { RI_FROG_BLUE, RI_FROG_WHITE, 4 } }, { "Boss Souls", { RI_SOUL_BOSS_GOHT, RI_SOUL_BOSS_TWINMOLD, 5 } }, - // TODO: Enemy Souls + { "Enemy Souls", { RI_SOUL_ENEMY_ALIEN, RI_SOUL_ENEMY_WOLFOS, 6 } }, { "Owl Statues", { RI_OWL_CLOCK_TOWN_SOUTH, RI_OWL_ZORA_CAPE, 5 } }, { "Tingle Maps", { RI_TINGLE_MAP_CLOCK_TOWN, RI_TINGLE_MAP_WOODFALL, 6 } }, { "Misc", { RI_TRIFORCE_PIECE, RI_TRIFORCE_PIECE, 1 } }, @@ -249,8 +249,8 @@ void DrawItemList(std::string listName, int columns) { ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(5, 5)); std::vector emptyList; - if (listName == "Frogs" || listName == "Boss Souls" || listName == "Owl Statues" || - listName == "Tingle Maps" || listName == "Misc") { + if (listName == "Frogs" || listName == "Boss Souls" || listName == "Enemy Souls" || + listName == "Owl Statues" || listName == "Tingle Maps" || listName == "Misc") { for (int j = std::get<0>(randoItemLists.at(listName)); j <= std::get<1>(randoItemLists.at(listName)); j++) { ImGui::TableNextColumn(); From 33601070309f9773736b0add09c035c027a06e64 Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Mon, 5 Jan 2026 21:02:02 -0500 Subject: [PATCH 34/34] clang format --- .../Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp | 4 ++-- mm/2s2h/Rando/Menu.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp index f68ce10369..dec6e019dc 100644 --- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp +++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp @@ -250,8 +250,8 @@ void DrawItemList(std::string listName, int columns) { ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(5, 5)); std::vector emptyList; - if (listName == "Frogs" || listName == "Boss Souls" || listName == "Enemy Souls" || listName == "Owl Statues" || - listName == "Tingle Maps" || listName == "Time" || listName == "Misc") { + if (listName == "Frogs" || listName == "Boss Souls" || listName == "Enemy Souls" || + listName == "Owl Statues" || listName == "Tingle Maps" || listName == "Time" || listName == "Misc") { for (int j = std::get<0>(randoItemLists.at(listName)); j <= std::get<1>(randoItemLists.at(listName)); j++) { ImGui::TableNextColumn(); diff --git a/mm/2s2h/Rando/Menu.cpp b/mm/2s2h/Rando/Menu.cpp index 79e679ba2b..7e14418a94 100644 --- a/mm/2s2h/Rando/Menu.cpp +++ b/mm/2s2h/Rando/Menu.cpp @@ -36,6 +36,7 @@ std::unordered_map accessTrialsOptions = { { RO_ACCESS_TRIALS_OPEN, "Open" }, }; +// clang-format off std::vector incompatibleWithVanilla = { RO_SHUFFLE_BOSS_SOULS, RO_SHUFFLE_SWIM, @@ -43,6 +44,7 @@ std::vector incompatibleWithVanilla = { RO_PLENTIFUL_ITEMS, RO_CLOCK_SHUFFLE, }; +// clang-format on std::vector checkExclusionList; bool isExcludedInitialized = false;