diff options
| author | Caladius <Caladius@users.noreply.github.com> | 2026-01-06 09:28:56 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-06 09:28:56 -0500 |
| commit | de61cd8a9116f77096a481e3a354494aaa8e6790 (patch) | |
| tree | d888e10d391a6959b726fbeec37136af9f018821 /mm/2s2h/Rando/DrawFuncs.cpp | |
| parent | b2fb5b230563488f030664989fa7b0b0160705c7 (diff) | |
[Rando] Enemy Soul Shuffle (#1284)
* Add Aliens and initial code moved from old build.
* Update Enemy Souls to latest Develop and fix issues.
* Change Stalchild Animation to Idle
* Fix Stalchild Eyes
* Adds Hiploop to keep in line with Enemy Drops
* correction
* Update Matrix Calls
* Remove comment
* Remove Garo for now
* Add Octorok Soul req for Upper Canyon Access
* Add soul requirement for Red Switch
* Grant Soul INF when the option is off
* Adds Nejiron Soul
* Add Flying Pot Soul
* ew (#14)
* cleanup
* Add Bubble Soul
* Adds Freezard
* Change Soul behaivor to Invincible
* header cleanup and arg consolidation
* 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.
* Naming Updates
* Name Updates pt2
* Add Tracker Icons and adds a Default to avoid erroring
* Fix Iron Knuckle Helmet
* revert item icon default and add soul flame to tatl target for enemies that are invincible.
* Move VBs to GameInteractor_VanillaBehavior.h
* Use VB_PERFORM_AC_COLLISION for enemy souls
* 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
* Draw everything
* Remove unused INIT arg from SETUP_FLEX_SKEL
* 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
* Add Enemy Souls to item tracker
* clang format
---------
Co-authored-by: mckinlee <mckinlee@ymail.com>
Co-authored-by: Eblo <7004497+Eblo@users.noreply.github.com>
Diffstat (limited to 'mm/2s2h/Rando/DrawFuncs.cpp')
| -rw-r--r-- | mm/2s2h/Rando/DrawFuncs.cpp | 1135 |
1 files changed, 1044 insertions, 91 deletions
diff --git a/mm/2s2h/Rando/DrawFuncs.cpp b/mm/2s2h/Rando/DrawFuncs.cpp index 8eab3dbf2..4188caef0 100644 --- a/mm/2s2h/Rando/DrawFuncs.cpp +++ b/mm/2s2h/Rando/DrawFuncs.cpp @@ -12,6 +12,8 @@ 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); +Gfx* EnKnight_BuildEmptyDL(GraphicsContext* gfxCtx); // clang-format off // Boss Includes @@ -21,6 +23,58 @@ 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" +/* 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" +/* 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" +/* 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" +/* 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" +/* 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" +/* Like Like */ #include "assets/objects/object_rr/object_rr.h" +/* Mad Scrub */ #include "assets/objects/object_dekunuts/object_dekunuts.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" +/* 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" +/* Skullfish */ #include "assets/objects/object_pr/object_pr.h" +/* 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 /* Minifrog */ #include "objects/object_fr/object_fr.h" /* Clock */ #include "overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.h" @@ -31,8 +85,33 @@ void ObjTokeidai_RotateOnHourChange(ObjTokeidai* thisx, PlayState* play); // clang-format on } +#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); \ + } \ + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { \ + lastUpdate = gPlayState->state.frames; \ + SkelAnime_Update(&skelAnime); \ + } + +#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) \ + SETUP_DRAW_TYPE(LIMB_MAX, SKEL_HEADER, ANIM_HEADER, SkelAnime_InitFlex, FlexSkeletonHeader) + // 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; @@ -74,111 +153,1015 @@ void EnMinifrogPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* } } -// Boss Souls -extern void DrawGoht() { - OPEN_DISPS(gPlayState->state.gfxCtx); +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; + } - 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); + Matrix_MultZero(&auraPos); + auraPos.x += Rand_ZeroOne() * 0.5f; + auraPos.y += Rand_ZeroOne() * 0.5f; + auraPos.z += Rand_ZeroOne() * 0.5f; - 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 && dustUpdate != gPlayState->state.frames) { + if (dustUpdate == gPlayState->state.frames - 20) { + dustUpdate = gPlayState->state.frames; + auraColor = !auraColor; + } } - if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { - lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); + + if (limbIndex == FIRE_KEESE_LIMB_HEAD) { + Gfx* gfx = play->state.gfxCtx->polyXlu.p; + Scene_SetRenderModeXlu(play, 1, 2); + MATRIX_FINALIZE_AND_LOAD(gfx++, play->state.gfxCtx); + gSPDisplayList(gfx++, (Gfx*)&gKeeseRedEyesDL); } - gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)gGohtMetalPlateWithCirclePatternTex); + 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) { + if (limbIndex == REAL_BOMBCHU_LIMB_TAIL_END) { + OPEN_DISPS(play->state.gfxCtx); + Matrix_ReplaceRotation(&play->billboardMtxF); + 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); + MATRIX_FINALIZE_AND_LOAD(POLY_OPA_DISP++, play->state.gfxCtx); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)&gBombBodyDL); + CLOSE_DISPS(play->state.gfxCtx); + } +} + +s32 DrawEnSkb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { + s16 sins; + if (limbIndex == STALCHILD_LIMB_HEAD) { + 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; +} + +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); + } +} + +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_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); + + 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({ 10, 138, 46 }, { 30.0f, 30.0f, 30.0f }); } -extern void DrawGyorg() { - OPEN_DISPS(gPlayState->state.gfxCtx); - +extern void DrawArmos() { + SETUP_DRAW(OBJECT_AM_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); + 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); - static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[15]; - static Vec3s otherTable[15]; + 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 }); +} + +extern void DrawBat() { static u32 lastUpdate = 0; - if (!initialized) { - initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gGyorgSkel, - (AnimationHeader*)&gGyorgGentleSwimmingAnim, jointTable, otherTable, 15); - } + 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; - SkelAnime_Update(&skelAnime); + if (wingAnim == 8) { + wingAnim = 0; + } else { + wingAnim++; + } + } + + gSPDisplayList(&gfx[0], gSetupDLs[SETUPDL_25]); + MATRIX_FINALIZE_AND_LOAD(&gfx[1], gPlayState->state.gfxCtx); + 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() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawBoe() { + 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); + 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); + 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); + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 1000.0f, 1000.0f, 1000.0f }); +} + +extern void DrawBubble() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + 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); + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawDeepPython() { + 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({ 19, 99, 165 }, { 3.0f, 3.0f, 3.0f }); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } -extern void DrawOdolwa() { +extern void DrawDekuBaba() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); +} + +extern void DrawDexihand() { + 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, 70 }, { 6.0f, 6.0f, 6.0f }); +} + +extern void DrawDinolfos() { + 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, 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 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawDodongo() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawEeno() { + 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, 35 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawEyegore() { + 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); + 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 DrawFreezard() { OPEN_DISPS(gPlayState->state.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 DrawGaro() { + 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() { + 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); + + SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + 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); - Matrix_Translate(0.0f, -20.0f, 0.0f, MTXMODE_APPLY); + SETUP_SKEL(OBJECT_BEE_LIMB_MAX, gBeeSkel, gBeeFlyingAnim); + + 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 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); + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 6.0f, 6.0f, 6.0f }); +} + +extern void DrawHiploop() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + 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); + 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]); + 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, + DrawEnIk_PostLimbDraw, NULL); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 12.0f, 12.0f, 12.0f }); +} + +extern void DrawKeese() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 3.0f, 3.0f, 3.0f }); +} + +extern void DrawLikeLike() { static bool initialized = false; - static SkelAnime skelAnime; - static Vec3s jointTable[52]; - static Vec3s otherTable[52]; static u32 lastUpdate = 0; + static s16 textureScroll = 0; + static struct { + f32 unk_08; + f32 unk_10; + f32 unk_00; + Vec3s unk_1A; + } segments[5]; + if (!initialized) { initialized = true; - SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gOdolwaSkel, - (AnimationHeader*)&gOdolwaReadyAnim, jointTable, otherTable, 52); + for (int i = 0; i < 5; i++) { + segments[i].unk_08 = 0.8f; + segments[i].unk_10 = 0.0f; + segments[i].unk_00 = 0.0f; + segments[i].unk_1A.x = 0; + segments[i].unk_1A.y = 0; + segments[i].unk_1A.z = 0; + } } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { lastUpdate = gPlayState->state.frames; - SkelAnime_Update(&skelAnime); + 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); + } } - SkelAnime_DrawFlexOpa(gPlayState, skelAnime.skeleton, skelAnime.jointTable, skelAnime.dListCount, NULL, NULL, NULL); + + 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); - DrawEnLight({ 145, 20, 133 }, { 25.0f, 25.0f, 25.0f }); + Matrix_Pop(); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); } -extern void DrawTwinmold() { - OPEN_DISPS(gPlayState->state.gfxCtx); +extern void DrawMadScrub() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} +extern void DrawNejiron() { + SETUP_DRAW(NEJIRON_LIMB_MAX); Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); - Matrix_Scale(0.06f, 0.06f, 0.06f, MTXMODE_APPLY); + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 13.0f, 13.0f, 13.0f }); +} + +extern void DrawOctorok() { + 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]); + 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() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +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 }); +} + +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 }); +} + +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; + static std::vector<AnimationHeader*> rdAnims = { + (AnimationHeader*)gGibdoRedeadSquattingDanceAnim, + (AnimationHeader*)gGibdoRedeadClappingDanceAnim, + (AnimationHeader*)gGibdoRedeadPirouetteAnim, + }; + SETUP_DRAW(REDEAD_LIMB_MAX); + + 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); - 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); + SkelAnime_InitFlex(gPlayState, &skelAnime, (FlexSkeletonHeader*)&gRedeadSkel, + (AnimationHeader*)gGibdoRedeadPirouetteAnim, jointTable, morphTable, REDEAD_LIMB_MAX); } + if (gPlayState != NULL && lastUpdate != gPlayState->state.frames) { + 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); } + 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() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +extern void DrawSkullfish() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 5.0f, 5.0f, 5.0f }); +} + +extern void DrawSkulltula() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 5.0f, 5.0f, 5.0f }); +} + +extern void DrawSnapper() { + 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, 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() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +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 }); +} + +extern void DrawTektite() { + 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 }, + }; + SETUP_DRAW(OBJECT_TITE_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_SKEL(OBJECT_TITE_LIMB_MAX, object_tite_Skel_003A20, object_tite_Anim_0012E4); + + 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() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +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 }); +} + +extern void DrawWizrobe() { + 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_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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 155, 155, 155 }, { 10.0f, 10.0f, 10.0f }); +} + +// Boss Souls +extern void DrawGoht() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 10, 138, 46 }, { 30.0f, 30.0f, 30.0f }); +} + +extern void DrawGyorg() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 19, 99, 165 }, { 3.0f, 3.0f, 3.0f }); +} + +extern void DrawOdolwa() { + 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); + + CLOSE_DISPS(gPlayState->state.gfxCtx); + DrawEnLight({ 145, 20, 133 }, { 25.0f, 25.0f, 25.0f }); +} + +extern void DrawTwinmold() { + 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); gSPSegment(POLY_OPA_DISP++, 0x08, (uintptr_t)gTwinmoldBlueSkinTex); @@ -189,27 +1172,12 @@ 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); + 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_Translate(0, 0, 0, MTXMODE_APPLY); - - 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); - } + 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); @@ -221,27 +1189,12 @@ extern void DrawMajora() { // Other Actors extern void DrawMinifrog(RandoItemId randoItemId, Actor* actor) { - OPEN_DISPS(gPlayState->state.gfxCtx); - + 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); - - 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); 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: |
