From 5fd0100ad0ea1137916a1fde2b37e93d3cf45a05 Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Wed, 25 May 2022 03:22:00 +0200 Subject: [PATCH 1/5] initial submit --- libultraship/libultraship/SohImGuiImpl.cpp | 2 + .../actors/ovl_En_Nutsball/z_en_nutsball.c | 37 +++++++++++++++---- .../overlays/actors/ovl_En_Okuta/z_en_okuta.c | 24 +++++++++--- 3 files changed, 51 insertions(+), 12 deletions(-) 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); } From fb270dbab93b1c7ede2a9a1e39c6df3a1622b58e Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Wed, 25 May 2022 20:20:44 +0200 Subject: [PATCH 2/5] use same Cvar than 3D drops item --- libultraship/libultraship/SohImGuiImpl.cpp | 5 ++--- soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c | 4 ++-- soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 6178ec427..f49c58faf 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -734,9 +734,8 @@ namespace SohImGui { EnhancementCheckbox("N64 Mode", "gN64Mode"); 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("Enable 3D Dropped items/projectiles", "gNewDrops"); + Tooltip("Change most 2D items & 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 7b6f4ed4b..9251a959f 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 @@ -127,7 +127,7 @@ void func_80ABBBA8(EnNutsball* this, GlobalContext* globalCtx) { this->collider.info.toucher.dmgFlags = 2; Matrix_MtxFToYXZRotS(&player->shieldMf, &sp4C, 0); - if (CVar_GetS32("gNewProjectiles", 0) != 0) { + if (CVar_GetS32("gNewDrops", 0) != 0) { this->actor.world.rot.z = sp4C.y + 0x8000; } else { this->actor.world.rot.y = sp4C.y + 0x8000; @@ -176,7 +176,7 @@ void EnNutsball_Draw(Actor* thisx, GlobalContext* globalCtx) { OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_nutsball.c", 327); - if (CVar_GetS32("gNewProjectiles", 0) != 0) { + if (CVar_GetS32("gNewDrops", 0) != 0) { func_80093D18(globalCtx->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 1 * (globalCtx->state.frames * 6), 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 ee293afa5..39ae12e41 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 @@ -714,7 +714,7 @@ void EnOkuta_Draw(Actor* thisx, GlobalContext* globalCtx) { } else { OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_okuta.c", 1653); - if (CVar_GetS32("gNewProjectiles", 0) != 0) { + if (CVar_GetS32("gNewDrops", 0) != 0) { func_80093D18(globalCtx->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 1 * (globalCtx->state.frames * 6), From a35c4abc30bf1201ef8de55592e3adc7e0d13706 Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Sat, 28 May 2022 22:00:12 +0200 Subject: [PATCH 3/5] fix nuts reflect, I mean Deku nuts... --- soh/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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 9251a959f..28050b494 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 @@ -127,11 +127,7 @@ void func_80ABBBA8(EnNutsball* this, GlobalContext* globalCtx) { this->collider.info.toucher.dmgFlags = 2; Matrix_MtxFToYXZRotS(&player->shieldMf, &sp4C, 0); - if (CVar_GetS32("gNewDrops", 0) != 0) { - this->actor.world.rot.z = sp4C.y + 0x8000; - } else { - this->actor.world.rot.y = sp4C.y + 0x8000; - } + this->actor.world.rot.y = sp4C.y + 0x8000; this->timer = 30; return; } From 72125bbd1e604369527e99056390bda2d37d9d9b Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Sun, 29 May 2022 00:09:03 +0200 Subject: [PATCH 4/5] Add 3D debris to Okuta actor (octorok) --- .../overlays/actors/ovl_En_Okuta/z_en_okuta.c | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) 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 39ae12e41..e7b0a6e3b 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 @@ -500,7 +500,50 @@ void EnOkuta_ProjectileFly(EnOkuta* this, GlobalContext* globalCtx) { pos.x = this->actor.world.pos.x; pos.y = this->actor.world.pos.y + 11.0f; pos.z = this->actor.world.pos.z; - EffectSsHahen_SpawnBurst(globalCtx, &pos, 6.0f, 0, 1, 2, 15, 7, 10, gOctorokProjectileDL); + if (CVar_GetS32("gNewProjectiles", 0) != 0) { + static s16 sEffectScales[] = { + 145, 135, 115, 85, 75, 53, 45, 40, 35, + }; + s32 pad; + Vec3f velocity; + Vec3f pos; + s16 phi_s0 = 500; + s16 gravity; + s16 phi_v0; + f32 temp_f20; + f32 temp_f22; + s32 i; + for (s16 i = 0; i < ARRAY_COUNT(sEffectScales); i++) { + phi_s0 += 10000; + + temp_f20 = Rand_ZeroOne() * 5.0f; + pos.x = (Math_SinS(phi_s0) * temp_f20) + this->actor.world.pos.x; + pos.y = (Rand_ZeroOne() * 40.0f) + this->actor.world.pos.y + 5.0f; + pos.z = (Math_CosS(phi_s0) * temp_f20) + this->actor.world.pos.z; + + temp_f20 = (Rand_ZeroOne() * 5.0f) + 2.0f; + velocity.x = Math_SinS(phi_s0) * temp_f20; + temp_f22 = Rand_ZeroOne(); + velocity.y = (Rand_ZeroOne() * i * 2.5f) + (temp_f22 * 5.0f); + velocity.z = Math_CosS(phi_s0) * temp_f20; + + if (i == 0) { + phi_v0 = 41; + gravity = -450; + } else if (i < 4) { + phi_v0 = 37; + gravity = -380; + } else { + phi_v0 = 69; + gravity = -320; + } + EffectSsKakera_Spawn(globalCtx, &pos, &velocity, &this->actor.world.pos, gravity, phi_v0, 30, 5, 0, + sEffectScales[i]/5, 3, 0, 70, 1, OBJECT_GAMEPLAY_FIELD_KEEP, gSilverRockFragmentsDL); + } + } else { + EffectSsHahen_SpawnBurst(globalCtx, &pos, 6.0f, 0, 1, 2, 15, 7, 10, gOctorokProjectileDL); + } + SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 20, NA_SE_EN_OCTAROCK_ROCK); Actor_Kill(&this->actor); } From 53fc1514530ecd3426b0918399c9d6ca1507c0b5 Mon Sep 17 00:00:00 2001 From: Baoulettes Date: Mon, 20 Jun 2022 22:33:31 +0200 Subject: [PATCH 5/5] Update soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c Thanks I overlooked it :) Co-authored-by: BountyChocolate123456 <101743444+BountyChocolate123456@users.noreply.github.com> --- soh/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e7b0a6e3b..7824739a8 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 @@ -500,7 +500,7 @@ void EnOkuta_ProjectileFly(EnOkuta* this, GlobalContext* globalCtx) { pos.x = this->actor.world.pos.x; pos.y = this->actor.world.pos.y + 11.0f; pos.z = this->actor.world.pos.z; - if (CVar_GetS32("gNewProjectiles", 0) != 0) { + if (CVar_GetS32("gNewDrops", 0) != 0) { static s16 sEffectScales[] = { 145, 135, 115, 85, 75, 53, 45, 40, 35, };