diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 5ea017173..6178ec427 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -735,6 +735,8 @@ namespace SohImGui { Tooltip("Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution"); EnhancementCheckbox("Animated Link in Pause Menu", "gPauseLiveLink"); EnhancementCheckbox("Enable 3D Dropped items", "gNewDrops"); + EnhancementCheckbox("Enable 3D projectiles", "gNewProjectiles"); + Tooltip("Change some of monsters projectiles to their a 3D version"); EnhancementCheckbox("Dynamic Wallet Icon", "gDynamicWalletIcon"); Tooltip("Changes the rupee in the wallet icon to match the wallet size you currently have"); EnhancementCheckbox("Always show dungeon entrances", "gAlwaysShowDungeonMinimapIcon"); diff --git a/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c b/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c index 8d6a4c41c..7b6f4ed4b 100644 --- a/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c +++ b/soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c @@ -6,6 +6,7 @@ #include "z_en_nutsball.h" #include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h" +#include "objects/object_gi_nuts/object_gi_nuts.h" #include "objects/object_dekunuts/object_dekunuts.h" #include "objects/object_hintnuts/object_hintnuts.h" #include "objects/object_shopnuts/object_shopnuts.h" @@ -59,6 +60,10 @@ static s16 sObjectIDs[] = { OBJECT_DEKUNUTS, OBJECT_HINTNUTS, OBJECT_SHOPNUTS, OBJECT_DNS, OBJECT_DNK, }; +static Gfx* sDListsNew[] = { + gGiNutDL, gGiNutDL, gGiNutDL, gGiNutDL, gGiNutDL, +}; + static Gfx* sDLists[] = { gDekuNutsDekuNutDL, gHintNutsNutDL, gBusinessScrubDekuNutDL, gDntJijiNutDL, gDntStageNutDL, }; @@ -122,7 +127,11 @@ void func_80ABBBA8(EnNutsball* this, GlobalContext* globalCtx) { this->collider.info.toucher.dmgFlags = 2; Matrix_MtxFToYXZRotS(&player->shieldMf, &sp4C, 0); - this->actor.world.rot.y = sp4C.y + 0x8000; + if (CVar_GetS32("gNewProjectiles", 0) != 0) { + this->actor.world.rot.z = sp4C.y + 0x8000; + } else { + this->actor.world.rot.y = sp4C.y + 0x8000; + } this->timer = 30; return; } @@ -167,12 +176,26 @@ void EnNutsball_Draw(Actor* thisx, GlobalContext* globalCtx) { OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_nutsball.c", 327); - func_80093D18(globalCtx->state.gfxCtx); - Matrix_Mult(&globalCtx->billboardMtxF, MTXMODE_APPLY); - Matrix_RotateZ(thisx->home.rot.z * 9.58738e-05f, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_nutsball.c", 333), - G_MTX_MODELVIEW | G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, sDLists[thisx->params]); + if (CVar_GetS32("gNewProjectiles", 0) != 0) { + func_80093D18(globalCtx->state.gfxCtx); + gSPSegment(POLY_OPA_DISP++, 0x08, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 1 * (globalCtx->state.frames * 6), + 1 * (globalCtx->state.frames * 6), 32, 32, 1, 1 * (globalCtx->state.frames * 6), + 1 * (globalCtx->state.frames * 6), 32, 32)); + Matrix_Scale(25.0f,25.0f,25.0f,MTXMODE_APPLY); + Matrix_RotateX(thisx->home.rot.z * 9.58738e-05f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_nutsball.c", 901), + G_MTX_MODELVIEW | G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, sDListsNew[thisx->params]); + } else { + func_80093D18(globalCtx->state.gfxCtx); + Matrix_Mult(&globalCtx->billboardMtxF, MTXMODE_APPLY); + + Matrix_RotateZ(thisx->home.rot.z * 9.58738e-05f, MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_nutsball.c", 333), + G_MTX_MODELVIEW | G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, sDLists[thisx->params]); + } CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_nutsball.c", 337); } diff --git a/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c b/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c index 25543895e..ee293afa5 100644 --- a/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c +++ b/soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c @@ -1,5 +1,6 @@ #include "z_en_okuta.h" #include "objects/object_okuta/object_okuta.h" +#include "objects/gameplay_field_keep/gameplay_field_keep.h" #define FLAGS (ACTOR_FLAG_0 | ACTOR_FLAG_2) @@ -713,11 +714,24 @@ void EnOkuta_Draw(Actor* thisx, GlobalContext* globalCtx) { } else { OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_okuta.c", 1653); - Matrix_Mult(&globalCtx->billboardMtxF, MTXMODE_APPLY); - Matrix_RotateZ(this->actor.home.rot.z * (M_PI / 0x8000), MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_okuta.c", 1657), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_OPA_DISP++, gOctorokProjectileDL); + if (CVar_GetS32("gNewProjectiles", 0) != 0) { + func_80093D18(globalCtx->state.gfxCtx); + gSPSegment(POLY_OPA_DISP++, 0x08, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 1 * (globalCtx->state.frames * 6), + 1 * (globalCtx->state.frames * 6), 32, 32, 1, 1 * (globalCtx->state.frames * 6), + 1 * (globalCtx->state.frames * 6), 32, 32)); + Matrix_Scale(7.0f,7.0f,7.0f,MTXMODE_APPLY); + Matrix_RotateX(thisx->home.rot.z * (M_PI / 0x8000), MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_nutsball.c", 901), + G_MTX_MODELVIEW | G_MTX_LOAD); + gSPDisplayList(POLY_OPA_DISP++, gSilverRockDL); + } else { + Matrix_Mult(&globalCtx->billboardMtxF, MTXMODE_APPLY); + Matrix_RotateZ(this->actor.home.rot.z * (M_PI / 0x8000), MTXMODE_APPLY); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_en_okuta.c", 1657), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gOctorokProjectileDL); + } CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_okuta.c", 1662); }