From 2a02ab7f099915297c4c5756e23aa95ae1c4b5a9 Mon Sep 17 00:00:00 2001 From: madeline Date: Mon, 23 Mar 2026 22:16:57 -0700 Subject: [PATCH 01/19] fuck interrupts --- src/dusk/OSThread.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/dusk/OSThread.cpp b/src/dusk/OSThread.cpp index 0be30f4aaf..c88126bd52 100644 --- a/src/dusk/OSThread.cpp +++ b/src/dusk/OSThread.cpp @@ -610,24 +610,14 @@ s32 OSEnableScheduler(void) { // ============================================================================ BOOL OSDisableInterrupts(void) { - GetInterruptMutex().lock(); - sInterruptLockCount++; - return (BOOL)(sInterruptLockCount > 1); // TRUE if was already locked + return FALSE; } BOOL OSRestoreInterrupts(BOOL level) { - if (sInterruptLockCount > 0) { - sInterruptLockCount--; - GetInterruptMutex().unlock(); - } - return level; + return FALSE; } BOOL OSEnableInterrupts(void) { - if (sInterruptLockCount > 0) { - sInterruptLockCount--; - GetInterruptMutex().unlock(); - } return FALSE; } From a1f78609d843abc4760bac0180ff012edcc34322 Mon Sep 17 00:00:00 2001 From: madeline Date: Mon, 23 Mar 2026 23:17:26 -0700 Subject: [PATCH 02/19] turn on background input --- src/m_Do/m_Do_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/m_Do/m_Do_main.cpp b/src/m_Do/m_Do_main.cpp index 20fc2a8aee..a2fe24771d 100644 --- a/src/m_Do/m_Do_main.cpp +++ b/src/m_Do/m_Do_main.cpp @@ -272,6 +272,7 @@ int game_main(int argc, char* argv[]) { config.logLevel = (AuroraLogLevel)parsed_arg_options["log-level"].as(); config.mem1Size = 256 * 1024 * 1024; config.mem2Size = 24 * 1024 * 1024; + config.allowJoystickBackgroundEvents = true; auroraInfo = aurora_initialize(argc, argv, &config); From 42a0fbbf4420d4c25e813526e026a39130d133ec Mon Sep 17 00:00:00 2001 From: Lurs <2795933+Lurs@users.noreply.github.com> Date: Tue, 24 Mar 2026 11:19:58 +0100 Subject: [PATCH 03/19] Add toggle for water projection offset. Potentially fixes #77 --- extern/aurora | 2 +- src/d/d_kankyo.cpp | 10 +++++++++- src/dusk/imgui/ImGuiConsole.hpp | 1 + src/dusk/imgui/ImGuiMenuGame.cpp | 5 +++++ src/dusk/imgui/ImGuiMenuGame.hpp | 2 ++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/extern/aurora b/extern/aurora index 156f9a65e3..d76b70fc72 160000 --- a/extern/aurora +++ b/extern/aurora @@ -1 +1 @@ -Subproject commit 156f9a65e38db18a8fc93b30271703e58fa339f5 +Subproject commit d76b70fc72c6a5904a9e78c0526353f8b8e93c61 diff --git a/src/d/d_kankyo.cpp b/src/d/d_kankyo.cpp index a74ca3c9db..e6d076c05f 100644 --- a/src/d/d_kankyo.cpp +++ b/src/d/d_kankyo.cpp @@ -31,6 +31,9 @@ #include "JSystem/JKernel/JKRSolidHeap.h" #include #include +#if TARGET_PC +#include "dusk/imgui/ImGuiConsole.hpp" +#endif static void GxXFog_set(); @@ -11376,7 +11379,12 @@ void dKy_bg_MAxx_proc(void* bg_model_p) { Mtx sp1D8; if (mat_name[6] == '2') { C_MTXLightPerspective(sp1D8, dComIfGd_getView()->fovy, - camera_p->view.aspect, 1.0f, 1.0f, -0.01f, 0.0f); + camera_p->view.aspect, 1.0f, 1.0f, +#if TARGET_PC + dusk::g_imguiConsole.isWaterProjectionOffsetEnabled() ? -0.01f : 0.0f, 0.0f); +#else + -0.01f, 0.0f); +#endif } else { C_MTXLightPerspective(sp1D8, dComIfGd_getView()->fovy, camera_p->view.aspect, 0.49f, -0.49f, 0.5f, 0.5f); diff --git a/src/dusk/imgui/ImGuiConsole.hpp b/src/dusk/imgui/ImGuiConsole.hpp index 47fa435626..9f7c497288 100644 --- a/src/dusk/imgui/ImGuiConsole.hpp +++ b/src/dusk/imgui/ImGuiConsole.hpp @@ -15,6 +15,7 @@ namespace dusk { void draw(); bool isBloomEnabled() { return m_menuGame.isBloomEnabled(); } + bool isWaterProjectionOffsetEnabled() { return m_menuGame.isWaterProjectionOffsetEnabled(); } ImGuiMenuTools::CollisionViewSettings& getCollisionViewSettings() { return m_menuTools.getCollisionViewSettings(); } static bool CheckMenuViewToggle(ImGuiKey key, bool& active); diff --git a/src/dusk/imgui/ImGuiMenuGame.cpp b/src/dusk/imgui/ImGuiMenuGame.cpp index 3d9af4fdc5..b393005e98 100644 --- a/src/dusk/imgui/ImGuiMenuGame.cpp +++ b/src/dusk/imgui/ImGuiMenuGame.cpp @@ -23,6 +23,11 @@ namespace dusk { if (ImGui::BeginMenu("Graphics")) { ImGui::Checkbox("Native Bloom", &m_graphicsSettings.m_enableBloom); + ImGui::Checkbox("Water Projection Offset", &m_graphicsSettings.m_waterProjectionOffset); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Adds GC-specific -0.01 transS offset\n" + "that causes ~6px ghost artifacts in water reflections"); + } ImGui::EndMenu(); } diff --git a/src/dusk/imgui/ImGuiMenuGame.hpp b/src/dusk/imgui/ImGuiMenuGame.hpp index a76a20f7c4..35e7e397aa 100644 --- a/src/dusk/imgui/ImGuiMenuGame.hpp +++ b/src/dusk/imgui/ImGuiMenuGame.hpp @@ -13,6 +13,7 @@ namespace dusk { ImGuiMenuGame(); void draw(); bool isBloomEnabled() { return m_graphicsSettings.m_enableBloom; } + bool isWaterProjectionOffsetEnabled() { return m_graphicsSettings.m_waterProjectionOffset; } void windowInputViewer(); void windowControllerConfig(); @@ -35,6 +36,7 @@ namespace dusk { struct { bool m_enableBloom = 1; + bool m_waterProjectionOffset = false; } m_graphicsSettings; bool m_showControllerConfig = false; From 5fd58828811643378087f5a46edc159721cb90df Mon Sep 17 00:00:00 2001 From: madeline Date: Tue, 24 Mar 2026 18:25:01 -0700 Subject: [PATCH 04/19] fix trimming viewport scissoring fixes #121 --- src/d/d_camera.cpp | 7 +++++++ src/m_Do/m_Do_graphic.cpp | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index a24dcd47dc..ad12a4b773 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -10997,7 +10997,14 @@ static int camera_draw(camera_process_class* i_this) { #endif int trim_height = body->TrimHeight(); + + #if TARGET_PC + trim_height *= viewport->height / FB_HEIGHT; + window->setScissor(0.0f, trim_height, viewport->width, viewport->height - trim_height * 2.0f); + #else window->setScissor(0.0f, trim_height, FB_WIDTH, FB_HEIGHT - trim_height * 2.0f); + #endif + C_MTXPerspective(process->view.projMtx, process->view.fovy, process->view.aspect, process->view.near_, process->view.far_); mDoMtx_lookAt(process->view.viewMtx, &process->view.lookat.eye, &process->view.lookat.center, &process->view.lookat.up, process->view.bank); diff --git a/src/m_Do/m_Do_graphic.cpp b/src/m_Do/m_Do_graphic.cpp index 1264e54dd8..94ba2fe6ce 100644 --- a/src/m_Do/m_Do_graphic.cpp +++ b/src/m_Do/m_Do_graphic.cpp @@ -1081,7 +1081,13 @@ static void trimming(view_class* param_0, view_port_class* param_1) { GXSetDither(GX_TRUE); GXSetNumIndStages(0); Mtx44 ortho; + + #if TARGET_PC + C_MTXOrtho(ortho, 0.0f, param_1->height, 0.0f, param_1->width, 0.0f, 10.0f); + #else C_MTXOrtho(ortho, 0.0f, FB_HEIGHT, 0.0f, FB_WIDTH, 0.0f, 10.0f); + #endif + GXLoadPosMtxImm(cMtx_getIdentity(), 0); GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); @@ -1089,6 +1095,17 @@ static void trimming(view_class* param_0, view_port_class* param_1) { GXSetProjection(ortho, GX_ORTHOGRAPHIC); GXSetCurrentMtx(0); GXBegin(GX_QUADS, GX_VTXFMT0, 8); + + #if TARGET_PC + GXPosition3s16(0, 0, -5); + GXPosition3s16(param_1->width, 0, -5); + GXPosition3s16(param_1->width, sc_top, -5); + GXPosition3s16(0, sc_top, -5); + GXPosition3s16(0, sc_bottom, -5); + GXPosition3s16(param_1->width, sc_bottom, -5); + GXPosition3s16(param_1->width, param_1->height, -5); + GXPosition3s16(0, param_1->height, -5); + #else GXPosition3s16(0, 0, -5); GXPosition3s16(FB_WIDTH, 0, -5); GXPosition3s16(FB_WIDTH, sc_top, -5); @@ -1097,6 +1114,8 @@ static void trimming(view_class* param_0, view_port_class* param_1) { GXPosition3s16(FB_WIDTH, sc_bottom, -5); GXPosition3s16(FB_WIDTH, FB_HEIGHT, -5); GXPosition3s16(0, FB_HEIGHT, -5); + #endif + GXEnd(); } GXSetScissor(param_1->scissor.x_orig, param_1->scissor.y_orig, param_1->scissor.width, From 2618da7453991bdd8196e7a308510bb09226a7dc Mon Sep 17 00:00:00 2001 From: madeline Date: Tue, 24 Mar 2026 18:34:12 -0700 Subject: [PATCH 05/19] properly scale deku toad camera detection range --- src/d/actor/d_a_e_dt.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/d/actor/d_a_e_dt.cpp b/src/d/actor/d_a_e_dt.cpp index 3d88065113..c88635d111 100644 --- a/src/d/actor/d_a_e_dt.cpp +++ b/src/d/actor/d_a_e_dt.cpp @@ -1578,11 +1578,17 @@ bool daE_DT_c::pointInSight(cXyz* i_point) { f32 width = scissor->width; f32 height = scissor->height; mDoLib_project(i_point, &proj); + + #if TARGET_PC + view_port_class* viewport = dComIfGp_getWindow(dComIfGp_getCameraWinID(idx))->getViewPort(); + return proj.x > 0.0f && proj.x < width && proj.y > (30.0f * viewport->height / FB_HEIGHT) && -(30.0f * viewport->height / FB_HEIGHT) < height; + #else if (proj.x > 0.0f && proj.x < width && proj.y > 30.0f && -30.0f < height) { return true; } else { return false; } + #endif } void daE_DT_c::executeOpening() { From 85d3b982b23d78bddd42d230f7be780bb203c588 Mon Sep 17 00:00:00 2001 From: madeline Date: Wed, 25 Mar 2026 12:05:50 -0700 Subject: [PATCH 06/19] fixes #107 --- src/d/actor/d_a_npc_tks.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/d/actor/d_a_npc_tks.cpp b/src/d/actor/d_a_npc_tks.cpp index 1338ba0368..f1c33003f8 100644 --- a/src/d/actor/d_a_npc_tks.cpp +++ b/src/d/actor/d_a_npc_tks.cpp @@ -823,7 +823,15 @@ void daNpcTks_c::playMotion() { daNpcF_anmPlayData dat4a = {ANM_JUMP_S, 4.0f, 1}; daNpcF_anmPlayData dat4b = {ANM_FLY, 0.0f, 0}; daNpcF_anmPlayData* pDat4[2] = {&dat4a, &dat4b}; + + #if TARGET_PC + // Note: this fixes a crash in the cutscene after entering city and likely needs to be revisited as its + // unclear why this was 1 in the first place and unclear why this fixes it + daNpcF_anmPlayData dat5 = {ANM_JUMP_E, 0.0f, 0}; + #else daNpcF_anmPlayData dat5 = {ANM_JUMP_E, 0.0f, 1}; + #endif + daNpcF_anmPlayData* pDat5[1] = {&dat5}; daNpcF_anmPlayData dat6a = {ANM_LAND, 0.0f, 1}; daNpcF_anmPlayData dat6b = {ANM_WAIT_A, 4.0f, 0}; From 816d8530021740dd5a3cfff69f803d41040287c4 Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Wed, 25 Mar 2026 20:27:35 -0400 Subject: [PATCH 07/19] Fix ctb::data::TBlockData endian issues This fixes some buggy cutscene camera positions and potentially related crashes. --- libs/JSystem/include/JSystem/JStudio/JStudio/ctb.h | 6 +++--- libs/JSystem/src/JStudio/JStudio/ctb.cpp | 2 +- libs/JSystem/src/JStudio/JStudio/jstudio-control.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/JSystem/include/JSystem/JStudio/JStudio/ctb.h b/libs/JSystem/include/JSystem/JStudio/JStudio/ctb.h index 108d6f60f1..da03389c25 100644 --- a/libs/JSystem/include/JSystem/JStudio/JStudio/ctb.h +++ b/libs/JSystem/include/JSystem/JStudio/JStudio/ctb.h @@ -64,9 +64,9 @@ struct data { }; struct TBlockData { - u32 size; - u16 scheme; - u16 IDSize; + BE(u32) size; + BE(u16) scheme; + BE(u16) IDSize; u32 field_0x8[0]; }; diff --git a/libs/JSystem/src/JStudio/JStudio/ctb.cpp b/libs/JSystem/src/JStudio/JStudio/ctb.cpp index 9a371ea936..61046ad35c 100644 --- a/libs/JSystem/src/JStudio/JStudio/ctb.cpp +++ b/libs/JSystem/src/JStudio/JStudio/ctb.cpp @@ -68,7 +68,7 @@ JStudio::ctb::TObject* JStudio::ctb::TControl::getObject_index(u32 param_0) { JStudio::ctb::TFactory::~TFactory() {} JStudio::ctb::TObject* JStudio::ctb::TFactory::create(JStudio::ctb::data::TParse_TBlock const& param_0) { - switch(BSWAP16(param_0.get_scheme())) { + switch(param_0.get_scheme()) { case 1: return JKR_NEW TObject_TxyzRy(param_0); default: diff --git a/libs/JSystem/src/JStudio/JStudio/jstudio-control.cpp b/libs/JSystem/src/JStudio/JStudio/jstudio-control.cpp index ff192835b3..18eab0832b 100644 --- a/libs/JSystem/src/JStudio/JStudio/jstudio-control.cpp +++ b/libs/JSystem/src/JStudio/JStudio/jstudio-control.cpp @@ -49,7 +49,7 @@ int JStudio::TControl::transformOnGet_setOrigin_TxyzRy(Vec const& param_0, f32 p int JStudio::TControl::transform_setOrigin_ctb(JStudio::ctb::TObject const& param_0) { switch (param_0.getScheme()) { case 1: { - const f32* pfVar4 = (const f32*)param_0.getData(); + const BE(f32)* pfVar4 = (const BE(f32)*)param_0.getData(); Vec local_144 = {0.0f, 0.0f, 0.0f}; local_144.x = pfVar4[0]; local_144.y = pfVar4[1]; From 7d3795f745394d80df26d119b74ceb9ae25c6b6b Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Wed, 25 Mar 2026 20:29:39 -0400 Subject: [PATCH 08/19] Detect and replace NaNs in cXyz default ctor This fixes intermittent segfaults due to invalid atan table lookups. For some reason zero-initializing all cXyz objects causes issues, as does initializing them with INFINITY or -INFINITY. However, at least one of the possible crashes (in d_a_e_yg's search_ground_1) is guaranteed to happen whenever a specific uninitialized cXyz contains a NaN for x or z. A possible explanation for these crashes not occurring on hardware might be that the problematic objects happen to be placed at memory locations that happen to never contain a NaN upon allocation, so the buggy code was never caught. Further investigation would be needed to determine if this is what's actually happening, though. --- include/SSystem/SComponent/c_xyz.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/include/SSystem/SComponent/c_xyz.h b/include/SSystem/SComponent/c_xyz.h index 0bea35efe3..1f99737825 100644 --- a/include/SSystem/SComponent/c_xyz.h +++ b/include/SSystem/SComponent/c_xyz.h @@ -31,7 +31,17 @@ struct cXyz : Vec { z = vec.z; } #else - cXyz() = default; + cXyz() { + if (std::isnan(x)) { + x = 0.0f; + } + if (std::isnan(y)) { + y = 0.0f; + } + if (std::isnan(z)) { + z = 0.0f; + } + } ~cXyz() = default; cXyz(const cXyz& vec) = default; #endif From c6c6a6be33b3ea17ccbf60937e5cfb776e7ca3cf Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Wed, 25 Mar 2026 20:49:49 -0400 Subject: [PATCH 09/19] Improve exp heap alloc failure message --- libs/JSystem/src/JKernel/JKRExpHeap.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/JSystem/src/JKernel/JKRExpHeap.cpp b/libs/JSystem/src/JKernel/JKRExpHeap.cpp index 4c0c6bf1ae..3ec15cd161 100644 --- a/libs/JSystem/src/JKernel/JKRExpHeap.cpp +++ b/libs/JSystem/src/JKernel/JKRExpHeap.cpp @@ -214,7 +214,9 @@ void* JKRExpHeap::do_alloc(u32 size, int alignment) { #endif #if TARGET_PC - JUT_ASSERT_MSG_F(__LINE__, ptr != nullptr, "failed to alloc memory! (0x%x byte).\n", size); + JUT_ASSERT_MSG_F(__LINE__, ptr != nullptr, + "Failed to alloc memory! (%s) (0x%X bytes).\n Heap size: %u\n Used size: %u", + this->getName(), size, getSize(), getTotalUsedSize()); #else if (ptr == NULL) { JUTWarningConsole_f(":::cannot alloc memory (0x%x byte).\n", size); From 9c0110d0fa2768116205ebb9e2185821090921b6 Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Wed, 25 Mar 2026 20:51:27 -0400 Subject: [PATCH 10/19] Map loader: Reset room/point values when region is changed --- src/dusk/imgui/ImGuiMapLoader.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dusk/imgui/ImGuiMapLoader.cpp b/src/dusk/imgui/ImGuiMapLoader.cpp index 74e60e4974..73f9f17dc9 100644 --- a/src/dusk/imgui/ImGuiMapLoader.cpp +++ b/src/dusk/imgui/ImGuiMapLoader.cpp @@ -36,6 +36,8 @@ namespace dusk { if (ImGui::Selectable(region.regionName)) { if (m_mapLoaderInfo.regionIdx != idx) { m_mapLoaderInfo.mapIdx = 0; + m_mapLoaderInfo.roomNoIdx = 0; + m_mapLoaderInfo.pointNoIdx = 0; } m_mapLoaderInfo.regionIdx = idx; } @@ -68,7 +70,7 @@ namespace dusk { m_mapLoaderInfo.pointNoIdx = 0; } } - }else { + } else { ImGui::Text("No region selected."); } From 0de67a8320086634cec643a70f6d4ffb42c09510 Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Wed, 25 Mar 2026 20:51:57 -0400 Subject: [PATCH 11/19] Add even more heap debug names --- include/d/actor/d_a_player.h | 18 ++++++++++++++++++ include/d/d_simple_model.h | 7 +++++++ libs/JSystem/include/JSystem/JKernel/JKRHeap.h | 6 +++++- src/d/actor/d_a_alink.cpp | 18 +++++++++--------- src/d/actor/d_a_bg.cpp | 1 + src/d/actor/d_a_midna.cpp | 8 ++++---- src/d/actor/d_a_player.cpp | 10 +++++++--- src/d/d_file_select.cpp | 1 + src/d/d_k_wmark.cpp | 1 + src/d/d_ky_thunder.cpp | 2 ++ src/d/d_menu_collect.cpp | 1 + src/d/d_menu_dmap.cpp | 1 + src/d/d_simple_model.cpp | 2 ++ src/d/d_stage.cpp | 1 + src/d/d_timer.cpp | 1 + src/f_op/f_op_actor_mng.cpp | 2 ++ 16 files changed, 63 insertions(+), 17 deletions(-) diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index e81bce0a94..41a11ff662 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -73,6 +73,20 @@ private: /* 0x8 */ f32 m_offsetXZ; }; // Size: 0xC +#if TARGET_PC +#define PLAYER_CREATE_ANM_HEAP_F(heap, type, fmt, ...) \ + { \ + char pcah_name_buf[32]; \ + sprintf(pcah_name_buf, fmt, ##__VA_ARGS__); \ + (heap).createHeap(type, pcah_name_buf); \ + \ + } +#define PLAYER_CREATE_ANM_HEAP(heap, type, name) (heap).createHeap(type, name) +#else +#define PLAYER_CREATE_ANM_HEAP_F(heap, type, name, ...) (heap).createHeap(type) +#define PLAYER_CREATE_ANM_HEAP(heap, type, name) (heap).createHeap(type) +#endif + class daPy_anmHeap_c { public: enum daAlinkHEAP_TYPE { @@ -87,7 +101,11 @@ public: ~daPy_anmHeap_c(); void initData(); void* mallocBuffer(); +#if TARGET_PC + void createHeap(daAlinkHEAP_TYPE i_heapType, const char* name); +#else void createHeap(daAlinkHEAP_TYPE i_heapType); +#endif void* loadData(u16 i_resId); void* loadDataIdx(u16 i_resId); void* loadDataPriIdx(u16 i_resId); diff --git a/include/d/d_simple_model.h b/include/d/d_simple_model.h index 4952553208..25b9e6e2d1 100644 --- a/include/d/d_simple_model.h +++ b/include/d/d_simple_model.h @@ -32,6 +32,10 @@ public: J3DModel* getModel() { return mpModel; } +#if TARGET_PC + void setIdx(u8 idx) { this->idx = idx; } +#endif + private: /* 0x00 */ JKRSolidHeap* mpHeap; /* 0x04 */ J3DModel* mpModel; @@ -40,6 +44,9 @@ private: /* 0x10 */ u8 mDrawBG; /* 0x11 */ s8 mRoomNo; /* 0x12 */ u8 field_0x12; +#if TARGET_PC + u8 idx; +#endif }; // Size: 0x14 class dSmplMdl_draw_c { diff --git a/libs/JSystem/include/JSystem/JKernel/JKRHeap.h b/libs/JSystem/include/JSystem/JKernel/JKRHeap.h index 2ff883c393..419d49301d 100644 --- a/libs/JSystem/include/JSystem/JKernel/JKRHeap.h +++ b/libs/JSystem/include/JSystem/JKernel/JKRHeap.h @@ -222,9 +222,13 @@ public: #define JKRHEAP_NAME(heap, name) (heap)->setName(name) #define JKRHEAP_NAMEF(heap, name, ...) (heap)->setNamef(name, __VA_ARGS__) +#define JKRHEAP_CURRENT_NAME(heap, name) JKRHEAP_NAME(mDoExt_getCurrentHeap(), name) +#define JKRHEAP_CURRENT_NAMEF(heap, name, ...) JKRHEAP_NAMEF(mDoExt_getCurrentHeap(), name, __VA_ARGS__) #else #define JKRHEAP_NAME(heap, name) -#define JKRHEAP_NAMEF(heap, name) +#define JKRHEAP_NAMEF(heap, name, ...) +#define JKRHEAP_CURRENT_NAME(heap, name) +#define JKRHEAP_CURRENT_NAMEF(heap, name, ...) #endif }; diff --git a/src/d/actor/d_a_alink.cpp b/src/d/actor/d_a_alink.cpp index c05d595a3c..58e8935e7d 100644 --- a/src/d/actor/d_a_alink.cpp +++ b/src/d/actor/d_a_alink.cpp @@ -4453,7 +4453,7 @@ void daAlink_c::playerInit() { mAtSph.StartCAt(current.pos); mAnmHeap3.setBufferSize(0x20000); - mAnmHeap3.createHeap(daPy_anmHeap_c::HEAP_TYPE_4); + PLAYER_CREATE_ANM_HEAP(mAnmHeap3, daPy_anmHeap_c::HEAP_TYPE_4, "daAlink_c::mAnmHeap3"); if (checkWolf()) { changeWolf(); @@ -4462,7 +4462,7 @@ void daAlink_c::playerInit() { } mAnmHeap4.setBufferSize(0xB00); - mAnmHeap4.createHeap(daPy_anmHeap_c::HEAP_TYPE_4); + PLAYER_CREATE_ANM_HEAP(mAnmHeap4, daPy_anmHeap_c::HEAP_TYPE_4, "daAlink_c::mAnmHeap4"); setShieldModel(); #if DEBUG @@ -4507,24 +4507,24 @@ void daAlink_c::playerInit() { for (i = 0; i < 3; i++) { mUnderAnmHeap[i].setBuffer(mUnderAnmHeap[0].getBuffer() + (i * 0x2C00)); - mUnderAnmHeap[i].createHeap(daPy_anmHeap_c::HEAP_TYPE_3); + PLAYER_CREATE_ANM_HEAP_F(mUnderAnmHeap[i], daPy_anmHeap_c::HEAP_TYPE_3, "daAlink_c::mUnderAnmHeap[%d]", i); } mUpperAnmHeap[0].setBuffer(mUnderAnmHeap[0].getBuffer() + 0x8400); for (i = 0; i < 3; i++) { mUpperAnmHeap[i].setBuffer(mUpperAnmHeap[0].getBuffer() + (i * 0x2C00)); - mUpperAnmHeap[i].createHeap(daPy_anmHeap_c::HEAP_TYPE_3); + PLAYER_CREATE_ANM_HEAP_F(mUpperAnmHeap[i], daPy_anmHeap_c::HEAP_TYPE_3, "daAlink_c::mUpperAnmHeap[%d]", i); } - mFaceBtpHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_1); - mFaceBtkHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_2); - mFaceBckHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_3); + PLAYER_CREATE_ANM_HEAP(mFaceBtpHeap, daPy_anmHeap_c::HEAP_TYPE_1, "daAlink_c::mFaceBtpHeap"); + PLAYER_CREATE_ANM_HEAP(mFaceBtkHeap, daPy_anmHeap_c::HEAP_TYPE_2, "daAlink_c::mFaceBtkHeap"); + PLAYER_CREATE_ANM_HEAP(mFaceBckHeap, daPy_anmHeap_c::HEAP_TYPE_3, "daAlink_c::mFaceBckHeap"); for (i = 0; i < 2; i++) { mItemHeap[i].setBufferSize(0x13200); - mItemHeap[i].createHeap(daPy_anmHeap_c::HEAP_TYPE_4); + PLAYER_CREATE_ANM_HEAP_F(mItemHeap[i], daPy_anmHeap_c::HEAP_TYPE_4, "daAlink_c::mItemHeap[%d]", i); } - mAnmHeap9.createHeap(daPy_anmHeap_c::HEAP_TYPE_3); + PLAYER_CREATE_ANM_HEAP(mAnmHeap9, daPy_anmHeap_c::HEAP_TYPE_3, "daAlink_c::mAnmHeap9"); resetBasAnime(); mZ2Link.init(¤t.pos, &eyePos, &field_0x3720); diff --git a/src/d/actor/d_a_bg.cpp b/src/d/actor/d_a_bg.cpp index 2cc6f1f192..e73723d1f9 100644 --- a/src/d/actor/d_a_bg.cpp +++ b/src/d/actor/d_a_bg.cpp @@ -532,6 +532,7 @@ int daBg_c::create() { if (room_heap != NULL) { this->heap = JKRCreateSolidHeap(-1, room_heap, false); JUT_ASSERT(471, heap != NULL); + JKRHEAP_NAME(heap, "d_a_bg Anms"); JKRHeap* old = mDoExt_setCurrentHeap(this->heap); int rt = createHeap(); diff --git a/src/d/actor/d_a_midna.cpp b/src/d/actor/d_a_midna.cpp index dcdb2f43ff..cbbf1915e2 100644 --- a/src/d/actor/d_a_midna.cpp +++ b/src/d/actor/d_a_midna.cpp @@ -565,12 +565,12 @@ cPhs_Step daMidna_c::create() { mpFunc = &daMidna_c::checkMetamorphoseEnableBase; for (u16 i = 0; i < 3; i++) { - mBckHeap[i].createHeap(daPy_anmHeap_c::HEAP_TYPE_3); + PLAYER_CREATE_ANM_HEAP_F(mBckHeap[i], daPy_anmHeap_c::HEAP_TYPE_3, "daMidna_c::mBckHeap[%d]", i); } - mBtpHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_1); - mBtkHeap.createHeap(daPy_anmHeap_c::HEAP_TYPE_2); - + PLAYER_CREATE_ANM_HEAP_F(mBtpHeap, daPy_anmHeap_c::HEAP_TYPE_1, "daMidna_c::mBtpHeap"); + PLAYER_CREATE_ANM_HEAP_F(mBtkHeap, daPy_anmHeap_c::HEAP_TYPE_2, "daMidna_c::mBtkHeap"); + mSound.init(¤t.pos, &eyePos, 3, 1); mpShadowModel = mpMorf->getModel(); mpShadowModel->setUserArea((uintptr_t)this); diff --git a/src/d/actor/d_a_player.cpp b/src/d/actor/d_a_player.cpp index c091fae5dd..f38fe15a3b 100644 --- a/src/d/actor/d_a_player.cpp +++ b/src/d/actor/d_a_player.cpp @@ -237,7 +237,11 @@ void* daPy_anmHeap_c::mallocBuffer() { return mBuffer; } -void daPy_anmHeap_c::createHeap(daPy_anmHeap_c::daAlinkHEAP_TYPE i_heapType) { +#if TARGET_PC +void daPy_anmHeap_c::createHeap(daPy_anmHeap_c::daAlinkHEAP_TYPE i_heapType, const char* name) { +#else +void daPy_anmHeap_c::createHeap(daPy_anmHeap_c::daAlinkHEAP_TYPE i_heapType, const char* name) { +#endif u32 size; if (i_heapType == 4) { @@ -260,8 +264,8 @@ void daPy_anmHeap_c::createHeap(daPy_anmHeap_c::daAlinkHEAP_TYPE i_heapType) { JKRHeap* tmp; mAnimeHeap = mDoExt_createSolidHeapFromGameToCurrent(&tmp, size, 0x20); - JKRHEAP_NAMEF(mAnimeHeap, "Alink anime type %d", i_heapType); - + JKRHEAP_NAME(mAnimeHeap, name); + if (i_heapType == 4) { tmpWork = JKR_NEW_ARRAY(char, size); JUT_ASSERT(669, tmpWork != NULL); diff --git a/src/d/d_file_select.cpp b/src/d/d_file_select.cpp index 748d963de3..16aafb721f 100644 --- a/src/d/d_file_select.cpp +++ b/src/d/d_file_select.cpp @@ -5195,6 +5195,7 @@ void dFile_select3D_c::_create(u8 i_mirrorIdx, u8 i_maskIdx) { if (mpSolidHeap == NULL) { JUT_ASSERT(5189, mpSolidHeap != NULL); } + JKRHEAP_NAME(mpSolidHeap, "dFile_select3D_c::mpSolidHeap"); field_0x03c4 = 0.0f; field_0x03c8 = 0.0f; diff --git a/src/d/d_k_wmark.cpp b/src/d/d_k_wmark.cpp index 8021494be2..379b55f532 100644 --- a/src/d/d_k_wmark.cpp +++ b/src/d/d_k_wmark.cpp @@ -35,6 +35,7 @@ int dkWmark_c::create() { mpHeap = mDoExt_createSolidHeapFromGameToCurrent(0x880, 0x20); if (mpHeap != NULL) { + JKRHEAP_NAME(mpHeap, "dkWmark_c::mpHeap"); J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Alink", 0x23); JUT_ASSERT(60, modelData != NULL); diff --git a/src/d/d_ky_thunder.cpp b/src/d/d_ky_thunder.cpp index 69c0d690ad..77c2a92769 100644 --- a/src/d/d_ky_thunder.cpp +++ b/src/d/d_ky_thunder.cpp @@ -26,6 +26,8 @@ int dThunder_c::createHeap() { if (mpHeap == NULL) { return 0; } + + JKRHEAP_NAME(mpHeap, "dThunder_c::mpHeap"); } return 1; diff --git a/src/d/d_menu_collect.cpp b/src/d/d_menu_collect.cpp index 4f18e74391..c1281a86c2 100644 --- a/src/d/d_menu_collect.cpp +++ b/src/d/d_menu_collect.cpp @@ -2222,6 +2222,7 @@ dMenu_Collect3D_c::~dMenu_Collect3D_c() { void dMenu_Collect3D_c::_create() { mpHeap->getTotalFreeSize(); mpSolidHeap = mDoExt_createSolidHeapToCurrent(0x25800, mpHeap, 0x20); + JKRHEAP_NAME(mpSolidHeap, "dMenu_Collect3D_c::mpSolidHeap"); mDoExt_setCurrentHeap((JKRHeap*)mpSolidHeap); daAlink_c* linkActor = daAlink_getAlinkActorClass(); if (linkActor != NULL) { diff --git a/src/d/d_menu_dmap.cpp b/src/d/d_menu_dmap.cpp index d78766b0e3..97721d9dd2 100644 --- a/src/d/d_menu_dmap.cpp +++ b/src/d/d_menu_dmap.cpp @@ -1649,6 +1649,7 @@ void dMenu_Dmap_c::_create() { mDmapHeap = JKRCreateExpHeap(field_0xe8->getFreeSize() - 0x10, field_0xe8, false); JUT_ASSERT(3732, mDmapHeap != NULL); + JKRHEAP_NAME(mDmapHeap, "dMenu_Dmap_c::mDmapHeap"); JKRHeap* heap = mDoExt_setCurrentHeap(mDmapHeap); u32 sp28 = mDmapHeap->getTotalFreeSize(); diff --git a/src/d/d_simple_model.cpp b/src/d/d_simple_model.cpp index 2bea7e950d..7106197644 100644 --- a/src/d/d_simple_model.cpp +++ b/src/d/d_simple_model.cpp @@ -18,6 +18,7 @@ static void dSmplMdl_modelUpdateDL(J3DModel* i_model) { dSmplMdl_draw_c::dSmplMdl_draw_c() { for (int i = 0; i < 8; i++) { mModel[i].init(); + mModel[i].setIdx(i); } for (int i = 0; i < 500; i++) { @@ -128,6 +129,7 @@ BOOL diff_model_c::create(J3DModelData* i_modelData, int roomNo, u8 drawBG) { JUT_ASSERT(397, i_modelData != NULL); if (mpHeap == NULL) { mpHeap = mDoExt_createSolidHeapFromGameToCurrent(0x2000, 0x20); + JKRHEAP_NAMEF(mpHeap, "Simple model (%d)", idx); if (mpHeap != NULL) { mpModel = mDoExt_J3DModel__create(i_modelData, 0x80000, 0x11000084); diff --git a/src/d/d_stage.cpp b/src/d/d_stage.cpp index b79bcc128c..f6c90b0f3d 100644 --- a/src/d/d_stage.cpp +++ b/src/d/d_stage.cpp @@ -384,6 +384,7 @@ static void dummy1(dStage_roomControl_c* roomControl) { JKRExpHeap* dStage_roomControl_c::createMemoryBlock(int i_blockIdx, u32 i_heapSize) { if (mMemoryBlock[i_blockIdx] == NULL) { mMemoryBlock[i_blockIdx] = JKRCreateExpHeap(i_heapSize, mDoExt_getArchiveHeap(), false); + JKRHEAP_NAMEF(mMemoryBlock[i_blockIdx], "Room control memory block %d", i_blockIdx); } return mMemoryBlock[i_blockIdx]; diff --git a/src/d/d_timer.cpp b/src/d/d_timer.cpp index 5299ebeb04..41826c3029 100644 --- a/src/d/d_timer.cpp +++ b/src/d/d_timer.cpp @@ -40,6 +40,7 @@ int dTimer_c::_create() { dComIfGp_setAllMapArchive(resInfo->getArchive()); mp_heap = fopMsgM_createExpHeap(0x11000, NULL); + JKRHEAP_NAME(mp_heap, "dTimer_c::mp_heap"); JKRHeap* prev_heap = mDoExt_setCurrentHeap(mp_heap); if (mp_heap != NULL) { mp_heap->getTotalFreeSize(); diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index 082c721418..79795d3bfe 100644 --- a/src/f_op/f_op_actor_mng.cpp +++ b/src/f_op/f_op_actor_mng.cpp @@ -524,6 +524,7 @@ bool fopAcM_entrySolidHeap_(fopAc_ac_c* i_actor, heapCallbackFunc i_heapCallback OSReport_Error("最大空きヒープサイズで確保失敗。[%s]\n", procNameString); return false; } + JKRHEAP_NAMEF(heap, "Actor mng (%s)", procNameString); #if DEBUG if (!fopAcM::HeapAdjustQuiet) { // Attempting registration with max heap size. %08x @@ -625,6 +626,7 @@ bool fopAcM_entrySolidHeap_(fopAc_ac_c* i_actor, heapCallbackFunc i_heapCallback if (alignedSize + adjOffset + 0x10 < freeSize) { newHeap = mDoExt_createSolidHeapFromGame(alignedSize, 0x20); + JKRHEAP_NAMEF(newHeap, "Actor mng (%s)", procNameString); } if (fopAcM::HeapAdjustVerbose) { From 204f35f7ae88f9ece5fe635ad90ddc7aa49e36f2 Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Wed, 25 Mar 2026 20:55:34 -0400 Subject: [PATCH 12/19] Fix incorrect asserts in object-particle This fixes a crash in the first King Bulblin sequence (in Ordon Spring) as well as in the first cutscene in Renado's sanctuary, and probably some other sequences too. This is meant as a band-aid until the upstream fix here is merged: https://github.com/zeldaret/tp/pull/3136 --- .../JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp b/libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp index f2193f42f0..14fffc12b6 100644 --- a/libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp +++ b/libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp @@ -153,7 +153,7 @@ void JStudio_JParticle::TAdaptor_particle::adaptor_do_PARENT( switch (param_1) { case JStudio::data::UNK_0x18: JUT_ASSERT(313, pContent!=NULL); - JUT_ASSERT(314, uSize==4); + JUT_ASSERT(314, uSize>0); field_0x1d0 = NULL; const JStage::TSystem* pJSGSystem = pCreateObject_->get_pJSGSystem_(); JUT_ASSERT(345, pJSGSystem!=NULL); @@ -172,7 +172,7 @@ void JStudio_JParticle::TAdaptor_particle::adaptor_do_PARENT_NODE( case JStudio::data::UNK_0x18: if (field_0x1d0 != NULL) { JUT_ASSERT(380, pContent!=NULL); - JUT_ASSERT(381, uSize==4); + JUT_ASSERT(381, uSize>0); field_0x1d4 = field_0x1d0->JSGFindNodeID((const char*)pContent); if (field_0x1d4 == -1) { return; From 488ceb8136a0b79c4f83096c3bfc4a4d7ad47b14 Mon Sep 17 00:00:00 2001 From: YunataSavior Date: Wed, 25 Mar 2026 21:28:58 -0700 Subject: [PATCH 13/19] Fix "switch case passes initialization" in d_a_peru --- src/d/actor/d_a_peru.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/d/actor/d_a_peru.cpp b/src/d/actor/d_a_peru.cpp index df134aa5b6..7d2a7c39bb 100644 --- a/src/d/actor/d_a_peru.cpp +++ b/src/d/actor/d_a_peru.cpp @@ -1008,6 +1008,7 @@ int daPeru_c::_cutAppear_Init(int const& param_1) { initTalk(mFlowNodeNo, NULL); break; case 140: + { static cXyz see_pos; see_pos.set(0.0f, -300.0f, 300.0f); mDoMtx_stack_c::ZXYrotS(shape_angle); @@ -1016,6 +1017,7 @@ int daPeru_c::_cutAppear_Init(int const& param_1) { mJntAnm.lookPos(&see_pos, 0); setCnt(80); break; + } case 150: mJntAnm.lookNone(0); setAction(&daPeru_c::demo_walk_to_window, 0); From e212ccd417d5bc69bdc444b87ea34dfa06ab7558 Mon Sep 17 00:00:00 2001 From: TakaRikka Date: Thu, 26 Mar 2026 04:52:09 -0700 Subject: [PATCH 14/19] save editor inventory menu wip --- src/dusk/imgui/ImGuiSaveEditor.cpp | 561 +++++++++++++++-------------- 1 file changed, 297 insertions(+), 264 deletions(-) diff --git a/src/dusk/imgui/ImGuiSaveEditor.cpp b/src/dusk/imgui/ImGuiSaveEditor.cpp index b21196fa54..2462e23f21 100644 --- a/src/dusk/imgui/ImGuiSaveEditor.cpp +++ b/src/dusk/imgui/ImGuiSaveEditor.cpp @@ -11,263 +11,273 @@ #include namespace dusk { - std::map itemMap = { - {dItemNo_HEART_e, "Heart"}, - {dItemNo_GREEN_RUPEE_e, "Green Rupee"}, - {dItemNo_BLUE_RUPEE_e, "Blue Rupee"}, - {dItemNo_YELLOW_RUPEE_e, "Yellow Rupee"}, - {dItemNo_RED_RUPEE_e, "Red Rupee"}, - {dItemNo_PURPLE_RUPEE_e, "Purple Rupee"}, - {dItemNo_ORANGE_RUPEE_e, "Orange Rupee"}, - {dItemNo_SILVER_RUPEE_e, "Silver Rupee"}, - {dItemNo_S_MAGIC_e, "Small Magic"}, - {dItemNo_L_MAGIC_e, "Large Magic"}, - {dItemNo_BOMB_5_e, "Bombs (5)"}, - {dItemNo_BOMB_10_e, "Bombs (10)"}, - {dItemNo_BOMB_20_e, "Bombs (20)"}, - {dItemNo_BOMB_30_e, "Bombs (30)"}, - {dItemNo_ARROW_10_e, "Arrows (10)"}, - {dItemNo_ARROW_20_e, "Arrows (20)"}, - {dItemNo_ARROW_30_e, "Arrows (30)"}, - {dItemNo_ARROW_1_e, "Arrows (1)"}, - {dItemNo_PACHINKO_SHOT_e, "Pumpkin Seeds"}, - {dItemNo_NOENTRY_19_e, "Unknown"}, - {dItemNo_NOENTRY_20_e, "Unknown"}, - {dItemNo_NOENTRY_21_e, "Unknown"}, - {dItemNo_WATER_BOMB_5_e, "Water Bombs (5)"}, - {dItemNo_WATER_BOMB_10_e, "Water Bombs (10)"}, - {dItemNo_WATER_BOMB_20_e, "Water Bombs (20)"}, - {dItemNo_WATER_BOMB_30_e, "Water Bombs (30)"}, - {dItemNo_BOMB_INSECT_5_e, "Bomblings (5)"}, - {dItemNo_BOMB_INSECT_10_e, "Bomblings (10)"}, - {dItemNo_BOMB_INSECT_20_e, "Bomblings (20)"}, - {dItemNo_BOMB_INSECT_30_e, "Bomblings (30)"}, - {dItemNo_RECOVERY_FAILY_e, "Fairy"}, - {dItemNo_TRIPLE_HEART_e, "Triple Hearts"}, - {dItemNo_SMALL_KEY_e, "Small Key"}, - {dItemNo_KAKERA_HEART_e, "Piece of Heart"}, - {dItemNo_UTAWA_HEART_e, "Heart Container"}, - {dItemNo_MAP_e, "Map"}, - {dItemNo_COMPUS_e, "Compass"}, - {dItemNo_DUNGEON_EXIT_e, "Ooccoo Sr."}, - {dItemNo_BOSS_KEY_e, "Boss Key"}, - {dItemNo_DUNGEON_BACK_e, "Ooccoo Jr."}, - {dItemNo_SWORD_e, "Ordon Sword"}, - {dItemNo_MASTER_SWORD_e, "Master Sword"}, - {dItemNo_WOOD_SHIELD_e, "Wooden Shield"}, - {dItemNo_SHIELD_e, "Ordon Shield"}, - {dItemNo_HYLIA_SHIELD_e, "Hylian Shield"}, - {dItemNo_TKS_LETTER_e, "Ooccoo's Letter"}, - {dItemNo_WEAR_CASUAL_e, "Ordon Clothes"}, - {dItemNo_WEAR_KOKIRI_e, "Hero's Clothes"}, - {dItemNo_ARMOR_e, "Magic Armor"}, - {dItemNo_WEAR_ZORA_e, "Zora Armor"}, - {dItemNo_MAGIC_LV1_e, "Magic Level 1"}, - {dItemNo_DUNGEON_EXIT_2_e, "Ooccoo Sr."}, - {dItemNo_WALLET_LV1_e, "Wallet"}, - {dItemNo_WALLET_LV2_e, "Big Wallet"}, - {dItemNo_WALLET_LV3_e, "Giant Wallet"}, - {dItemNo_NOENTRY_55_e, "Unknown"}, - {dItemNo_NOENTRY_56_e, "Unknown"}, - {dItemNo_NOENTRY_57_e, "Unknown"}, - {dItemNo_NOENTRY_58_e, "Unknown"}, - {dItemNo_NOENTRY_59_e, "Unknown"}, - {dItemNo_NOENTRY_60_e, "Unknown"}, - {dItemNo_ZORAS_JEWEL_e, "Coral Earring"}, - {dItemNo_HAWK_EYE_e, "Hawkeye"}, - {dItemNo_WOOD_STICK_e, "Wooden Sword"}, - {dItemNo_BOOMERANG_e, "Gale Boomerang"}, - {dItemNo_SPINNER_e, "Spinner"}, - {dItemNo_IRONBALL_e, "Ball and Chain"}, - {dItemNo_BOW_e, "Hero's Bow"}, - {dItemNo_HOOKSHOT_e, "Clawshot"}, - {dItemNo_HVY_BOOTS_e, "Iron Boots"}, - {dItemNo_COPY_ROD_e, "Dominion Rod"}, - {dItemNo_W_HOOKSHOT_e, "Double Clawshots"}, - {dItemNo_KANTERA_e, "Lantern"}, - {dItemNo_LIGHT_SWORD_e, "Light Sword"}, - {dItemNo_FISHING_ROD_1_e, "Fishing Rod"}, - {dItemNo_PACHINKO_e, "Slingshot"}, - {dItemNo_COPY_ROD_2_e, "Dominion Rod"}, - {dItemNo_NOENTRY_77_e, "Unknown"}, - {dItemNo_NOENTRY_78_e, "Unknown"}, - {dItemNo_BOMB_BAG_LV2_e, "Giant Bomb Bag"}, - {dItemNo_BOMB_BAG_LV1_e, "Bomb Bag"}, - {dItemNo_BOMB_IN_BAG_e, "Bomb Bag"}, - {dItemNo_NOENTRY_82_e, "Unknown"}, - {dItemNo_LIGHT_ARROW_e, "Light Arrow"}, - {dItemNo_ARROW_LV1_e, "Quiver"}, - {dItemNo_ARROW_LV2_e, "Big Quiver"}, - {dItemNo_ARROW_LV3_e, "Giant Quiver"}, - {dItemNo_NOENTRY_87_e, "Unknown"}, - {dItemNo_LURE_ROD_e, "Fishing Rod (Lure)"}, - {dItemNo_BOMB_ARROW_e, "Bomb Arrow"}, - {dItemNo_HAWK_ARROW_e, "Hawk Arrow"}, - {dItemNo_BEE_ROD_e, "Fishing Rod (Bee Larva)"}, - {dItemNo_JEWEL_ROD_e, "Fishing Rod (Earring)"}, - {dItemNo_WORM_ROD_e, "Fishing Rod (Worm)"}, - {dItemNo_JEWEL_BEE_ROD_e, "Fishing Rod (Earring + Bee Larva)"}, - {dItemNo_JEWEL_WORM_ROD_e, "Fishing Rod (Earring + Worm)"}, - {dItemNo_EMPTY_BOTTLE_e, "Empty Bottle"}, - {dItemNo_RED_BOTTLE_e, "Red Potion"}, - {dItemNo_GREEN_BOTTLE_e, "Green Potion"}, - {dItemNo_BLUE_BOTTLE_e, "Blue Potion"}, - {dItemNo_MILK_BOTTLE_e, "Milk Bottle"}, - {dItemNo_HALF_MILK_BOTTLE_e, "Half Milk Bottle"}, - {dItemNo_OIL_BOTTLE_e, "Lantern Oil"}, - {dItemNo_WATER_BOTTLE_e, "Water Bottle"}, - {dItemNo_OIL_BOTTLE_2_e, "Oil Bottle"}, - {dItemNo_RED_BOTTLE_2_e, "Red Potion"}, - {dItemNo_UGLY_SOUP_e, "Nasty Soup"}, - {dItemNo_HOT_SPRING_e, "Hotspring Water"}, - {dItemNo_FAIRY_e, "Fairy"}, - {dItemNo_HOT_SPRING_2_e, "Hotspring Water"}, - {dItemNo_OIL2_e, "Lantern Oil"}, - {dItemNo_OIL_e, "Lantern Oil"}, - {dItemNo_NORMAL_BOMB_e, "Bombs"}, - {dItemNo_WATER_BOMB_e, "Water Bombs"}, - {dItemNo_POKE_BOMB_e, "Bomblings"}, - {dItemNo_FAIRY_DROP_e, "Great Fairy's Tears"}, - {dItemNo_WORM_e, "Worm"}, - {dItemNo_DROP_BOTTLE_e, ""}, - {dItemNo_BEE_CHILD_e, ""}, - {dItemNo_CHUCHU_RARE_e, "Rare Chu Jelly"}, - {dItemNo_CHUCHU_RED_e, "Red Chu Jelly"}, - {dItemNo_CHUCHU_BLUE_e, "Blue Chu Jelly"}, - {dItemNo_CHUCHU_GREEN_e, "Green Chu Jelly"}, - {dItemNo_CHUCHU_YELLOW_e, "Yellow Chu Jelly"}, - {dItemNo_CHUCHU_PURPLE_e, "Purple Chu Jelly"}, - {dItemNo_LV1_SOUP_e, "Simple Soup"}, - {dItemNo_LV2_SOUP_e, "Good Soup"}, - {dItemNo_LV3_SOUP_e, "Superb Soup"}, - {dItemNo_LETTER_e, "Renado's Letter"}, - {dItemNo_BILL_e, "Invoice"}, - {dItemNo_WOOD_STATUE_e, "Wooden Statue"}, - {dItemNo_IRIAS_PENDANT_e, "Ilia's Charm"}, - {dItemNo_HORSE_FLUTE_e, "Horse Call"}, - {dItemNo_NOENTRY_133_e, "Unknown"}, - {dItemNo_NOENTRY_134_e, "Unknown"}, - {dItemNo_NOENTRY_135_e, "Unknown"}, - {dItemNo_NOENTRY_136_e, "Unknown"}, - {dItemNo_NOENTRY_137_e, "Unknown"}, - {dItemNo_NOENTRY_138_e, "Unknown"}, - {dItemNo_NOENTRY_139_e, "Unknown"}, - {dItemNo_NOENTRY_140_e, "Unknown"}, - {dItemNo_NOENTRY_141_e, "Unknown"}, - {dItemNo_NOENTRY_142_e, "Unknown"}, - {dItemNo_NOENTRY_143_e, "Unknown"}, - {dItemNo_RAFRELS_MEMO_e, "Auru's Memo"}, - {dItemNo_ASHS_SCRIBBLING_e, "Ashei's Sketch"}, - {dItemNo_NOENTRY_146_e, "Unknown"}, - {dItemNo_NOENTRY_147_e, "Unknown"}, - {dItemNo_NOENTRY_148_e, "Unknown"}, - {dItemNo_NOENTRY_149_e, "Unknown"}, - {dItemNo_NOENTRY_150_e, "Unknown"}, - {dItemNo_NOENTRY_151_e, "Unknown"}, - {dItemNo_NOENTRY_152_e, "Unknown"}, - {dItemNo_NOENTRY_153_e, "Unknown"}, - {dItemNo_NOENTRY_154_e, "Unknown"}, - {dItemNo_NOENTRY_155_e, "Unknown"}, - {dItemNo_CHUCHU_YELLOW2_e, "Yellow Chu Jelly"}, - {dItemNo_OIL_BOTTLE3_e, "Lantern Oil"}, - {dItemNo_SHOP_BEE_CHILD_e, ""}, - {dItemNo_CHUCHU_BLACK_e, "Black Chu Jelly"}, - {dItemNo_LIGHT_DROP_e, "Tear of Light"}, - {dItemNo_DROP_CONTAINER_e, "Vessel of Light (Faron)"}, - {dItemNo_DROP_CONTAINER02_e, "Vessel of Light (Eldin)"}, - {dItemNo_DROP_CONTAINER03_e, "Vessel of Light (Lanayru)"}, - {dItemNo_FILLED_CONTAINER_e, "Vessel of Light (Filled)"}, - {dItemNo_MIRROR_PIECE_2_e, "Mirror Shard (Snowpeak Ruins)"}, - {dItemNo_MIRROR_PIECE_3_e, "Mirror Shard (Temple of Time)"}, - {dItemNo_MIRROR_PIECE_4_e, "Mirror Shard (City in the Sky)"}, - {dItemNo_NOENTRY_168_e, "Unknown"}, - {dItemNo_NOENTRY_169_e, "Unknown"}, - {dItemNo_NOENTRY_170_e, "Unknown"}, - {dItemNo_NOENTRY_171_e, "Unknown"}, - {dItemNo_NOENTRY_172_e, "Unknown"}, - {dItemNo_NOENTRY_173_e, "Unknown"}, - {dItemNo_NOENTRY_174_e, "Unknown"}, - {dItemNo_NOENTRY_175_e, "Unknown"}, - {dItemNo_SMELL_YELIA_POUCH_e, "Scent of Ilia"}, - {dItemNo_SMELL_PUMPKIN_e, "Pumpkin Scent"}, - {dItemNo_SMELL_POH_e, "Poe Scent"}, - {dItemNo_SMELL_FISH_e, "Reekfish Scent"}, - {dItemNo_SMELL_CHILDREN_e, "Youth's Scent"}, - {dItemNo_SMELL_MEDICINE_e, "Medicine Scent"}, - {dItemNo_NOENTRY_182_e, "Unknown"}, - {dItemNo_NOENTRY_183_e, "Unknown"}, - {dItemNo_NOENTRY_184_e, "Unknown"}, - {dItemNo_NOENTRY_185_e, "Unknown"}, - {dItemNo_NOENTRY_186_e, "Unknown"}, - {dItemNo_NOENTRY_187_e, "Unknown"}, - {dItemNo_NOENTRY_188_e, "Unknown"}, - {dItemNo_NOENTRY_189_e, "Unknown"}, - {dItemNo_NOENTRY_190_e, "Unknown"}, - {dItemNo_NOENTRY_191_e, "Unknown"}, - {dItemNo_M_BEETLE_e, "Beetle ♂"}, - {dItemNo_F_BEETLE_e, "Beetle ♀"}, - {dItemNo_M_BUTTERFLY_e, "Butterfly ♂"}, - {dItemNo_F_BUTTERFLY_e, "Butterfly ♀"}, - {dItemNo_M_STAG_BEETLE_e, "Stag Beetle ♂"}, - {dItemNo_F_STAG_BEETLE_e, "Stag Beetle ♀"}, - {dItemNo_M_GRASSHOPPER_e, "Grasshopper ♂"}, - {dItemNo_F_GRASSHOPPER_e, "Grasshopper ♀"}, - {dItemNo_M_NANAFUSHI_e, "Phasmid ♂"}, - {dItemNo_F_NANAFUSHI_e, "Phasmid ♀"}, - {dItemNo_M_DANGOMUSHI_e, "Pill Bug ♂"}, - {dItemNo_F_DANGOMUSHI_e, "Pill Bug ♀"}, - {dItemNo_M_MANTIS_e, "Mantis ♂"}, - {dItemNo_F_MANTIS_e, "Mantis ♀"}, - {dItemNo_M_LADYBUG_e, "Ladybug ♂"}, - {dItemNo_F_LADYBUG_e, "Ladybug ♀"}, - {dItemNo_M_SNAIL_e, "Snail ♂"}, - {dItemNo_F_SNAIL_e, "Snail ♀"}, - {dItemNo_M_DRAGONFLY_e, "Dragonfly ♂"}, - {dItemNo_F_DRAGONFLY_e, "Dragonfly ♀"}, - {dItemNo_M_ANT_e, "Ant ♂"}, - {dItemNo_F_ANT_e, "Ant ♀"}, - {dItemNo_M_MAYFLY_e, "Mayfly ♂"}, - {dItemNo_F_MAYFLY_e, "Mayfly ♀"}, - {dItemNo_NOENTRY_216_e, "Unknown"}, - {dItemNo_NOENTRY_217_e, "Unknown"}, - {dItemNo_NOENTRY_218_e, "Unknown"}, - {dItemNo_NOENTRY_219_e, "Unknown"}, - {dItemNo_NOENTRY_220_e, "Unknown"}, - {dItemNo_NOENTRY_221_e, "Unknown"}, - {dItemNo_NOENTRY_222_e, "Unknown"}, - {dItemNo_NOENTRY_223_e, "Unknown"}, - {dItemNo_POU_SPIRIT_e, ""}, - {dItemNo_NOENTRY_225_e, "Unknown"}, - {dItemNo_NOENTRY_226_e, "Unknown"}, - {dItemNo_NOENTRY_227_e, "Unknown"}, - {dItemNo_NOENTRY_228_e, "Unknown"}, - {dItemNo_NOENTRY_229_e, "Unknown"}, - {dItemNo_NOENTRY_230_e, "Unknown"}, - {dItemNo_NOENTRY_231_e, "Unknown"}, - {dItemNo_NOENTRY_232_e, "Unknown"}, - {dItemNo_ANCIENT_DOCUMENT_e, "Ancient Sky Book"}, - {dItemNo_AIR_LETTER_e, "Sky Character"}, - {dItemNo_ANCIENT_DOCUMENT2_e, "Ancient Sky Book (Filled)"}, - {dItemNo_LV7_DUNGEON_EXIT_e, "Ooccoo Sr. (City in the Sky)"}, - {dItemNo_LINKS_SAVINGS_e, "Link's Savings"}, - {dItemNo_SMALL_KEY2_e, ""}, - {dItemNo_POU_FIRE1_e, ""}, - {dItemNo_POU_FIRE2_e, ""}, - {dItemNo_POU_FIRE3_e, ""}, - {dItemNo_POU_FIRE4_e, ""}, - {dItemNo_BOSSRIDER_KEY_e, ""}, - {dItemNo_TOMATO_PUREE_e, ""}, - {dItemNo_TASTE_e, ""}, - {dItemNo_LV5_BOSS_KEY_e, "Bedroom Key"}, - {dItemNo_SURFBOARD_e, ""}, - {dItemNo_KANTERA2_e, ""}, - {dItemNo_L2_KEY_PIECES1_e, "Key Shard (1)"}, - {dItemNo_L2_KEY_PIECES2_e, "Key Shard (2)"}, - {dItemNo_L2_KEY_PIECES3_e, "Key Shard (3)"}, - {dItemNo_KEY_OF_CARAVAN_e, "Bulblin Camp Key"}, - {dItemNo_LV2_BOSS_KEY_e, "Key Shard (Completed)"}, - {dItemNo_KEY_OF_FILONE_e, "Faron Gate Key"}, - {dItemNo_NONE_e, "None"}, + enum ItemType { + ITEMTYPE_DEFAULT_e, + ITEMTYPE_EQUIP_e, + }; + + struct itemInfo { + std::string m_name; + u8 m_type = ITEMTYPE_DEFAULT_e; + }; + + std::map itemMap = { + { dItemNo_HEART_e, {"Heart"} }, + { dItemNo_GREEN_RUPEE_e, {"Green Rupee"} }, + { dItemNo_BLUE_RUPEE_e, {"Blue Rupee"} }, + { dItemNo_YELLOW_RUPEE_e, {"Yellow Rupee"} }, + { dItemNo_RED_RUPEE_e, {"Red Rupee"} }, + { dItemNo_PURPLE_RUPEE_e, {"Purple Rupee"} }, + { dItemNo_ORANGE_RUPEE_e, {"Orange Rupee"} }, + { dItemNo_SILVER_RUPEE_e, {"Silver Rupee"} }, + { dItemNo_S_MAGIC_e, {"Small Magic"} }, + { dItemNo_L_MAGIC_e, {"Large Magic"} }, + { dItemNo_BOMB_5_e, {"Bombs (5)"} }, + { dItemNo_BOMB_10_e, {"Bombs (10)"} }, + { dItemNo_BOMB_20_e, {"Bombs (20)"} }, + { dItemNo_BOMB_30_e, {"Bombs (30)"} }, + { dItemNo_ARROW_10_e, {"Arrows (10)"} }, + { dItemNo_ARROW_20_e, {"Arrows (20)"} }, + { dItemNo_ARROW_30_e, {"Arrows (30)"} }, + { dItemNo_ARROW_1_e, {"Arrows (1)"} }, + { dItemNo_PACHINKO_SHOT_e, {"Pumpkin Seeds"} }, + { dItemNo_NOENTRY_19_e, {"Reserved"} }, + { dItemNo_NOENTRY_20_e, {"Reserved"} }, + { dItemNo_NOENTRY_21_e, {"Reserved"} }, + { dItemNo_WATER_BOMB_5_e, {"Water Bombs (5)"} }, + { dItemNo_WATER_BOMB_10_e, {"Water Bombs (10)"} }, + { dItemNo_WATER_BOMB_20_e, {"Water Bombs (20)"} }, + { dItemNo_WATER_BOMB_30_e, {"Water Bombs (30)"} }, + { dItemNo_BOMB_INSECT_5_e, {"Bomblings (5)"} }, + { dItemNo_BOMB_INSECT_10_e, {"Bomblings (10)"} }, + { dItemNo_BOMB_INSECT_20_e, {"Bomblings (20)"} }, + { dItemNo_BOMB_INSECT_30_e, {"Bomblings (30)"} }, + { dItemNo_RECOVERY_FAILY_e, {"Fairy"} }, + { dItemNo_TRIPLE_HEART_e, {"Triple Hearts"} }, + { dItemNo_SMALL_KEY_e, {"Small Key"} }, + { dItemNo_KAKERA_HEART_e, {"Piece of Heart"} }, + { dItemNo_UTAWA_HEART_e, {"Heart Container"} }, + { dItemNo_MAP_e, {"Dungeon Map"} }, + { dItemNo_COMPUS_e, {"Compass"} }, + { dItemNo_DUNGEON_EXIT_e, {"Ooccoo Sr. (First Time)", ITEMTYPE_EQUIP_e} }, + { dItemNo_BOSS_KEY_e, {"Boss Key"} }, + { dItemNo_DUNGEON_BACK_e, {"Ooccoo Jr.", ITEMTYPE_EQUIP_e} }, + { dItemNo_SWORD_e, {"Ordon Sword"} }, + { dItemNo_MASTER_SWORD_e, {"Master Sword"} }, + { dItemNo_WOOD_SHIELD_e, {"Wooden Shield"} }, + { dItemNo_SHIELD_e, {"Ordon Shield"} }, + { dItemNo_HYLIA_SHIELD_e, {"Hylian Shield"} }, + { dItemNo_TKS_LETTER_e, {"Ooccoo's Note", ITEMTYPE_EQUIP_e} }, + { dItemNo_WEAR_CASUAL_e, {"Ordon Clothes"} }, + { dItemNo_WEAR_KOKIRI_e, {"Hero's Clothes"} }, + { dItemNo_ARMOR_e, {"Magic Armor"} }, + { dItemNo_WEAR_ZORA_e, {"Zora Armor"} }, + { dItemNo_MAGIC_LV1_e, {"Magic Level 1"} }, + { dItemNo_DUNGEON_EXIT_2_e, {"Ooccoo Sr.", ITEMTYPE_EQUIP_e} }, + { dItemNo_WALLET_LV1_e, {"Wallet"} }, + { dItemNo_WALLET_LV2_e, {"Big Wallet"} }, + { dItemNo_WALLET_LV3_e, {"Giant Wallet"} }, + { dItemNo_NOENTRY_55_e, {"Reserved"} }, + { dItemNo_NOENTRY_56_e, {"Reserved"} }, + { dItemNo_NOENTRY_57_e, {"Reserved"} }, + { dItemNo_NOENTRY_58_e, {"Reserved"} }, + { dItemNo_NOENTRY_59_e, {"Reserved"} }, + { dItemNo_NOENTRY_60_e, {"Reserved"} }, + { dItemNo_ZORAS_JEWEL_e, {"Coral Earring", ITEMTYPE_EQUIP_e} }, + { dItemNo_HAWK_EYE_e, {"Hawkeye", ITEMTYPE_EQUIP_e} }, + { dItemNo_WOOD_STICK_e, {"Wooden Sword"} }, + { dItemNo_BOOMERANG_e, {"Gale Boomerang", ITEMTYPE_EQUIP_e} }, + { dItemNo_SPINNER_e, {"Spinner", ITEMTYPE_EQUIP_e} }, + { dItemNo_IRONBALL_e, {"Ball and Chain", ITEMTYPE_EQUIP_e} }, + { dItemNo_BOW_e, {"Hero's Bow", ITEMTYPE_EQUIP_e} }, + { dItemNo_HOOKSHOT_e, {"Clawshot", ITEMTYPE_EQUIP_e} }, + { dItemNo_HVY_BOOTS_e, {"Iron Boots", ITEMTYPE_EQUIP_e} }, + { dItemNo_COPY_ROD_e, {"Dominion Rod", ITEMTYPE_EQUIP_e} }, + { dItemNo_W_HOOKSHOT_e, {"Double Clawshots", ITEMTYPE_EQUIP_e} }, + { dItemNo_KANTERA_e, {"Lantern", ITEMTYPE_EQUIP_e} }, + { dItemNo_LIGHT_SWORD_e, {"Light Sword"} }, + { dItemNo_FISHING_ROD_1_e, {"Fishing Rod", ITEMTYPE_EQUIP_e} }, + { dItemNo_PACHINKO_e, {"Slingshot", ITEMTYPE_EQUIP_e} }, + { dItemNo_COPY_ROD_2_e, {"Dominion Rod (Uncharged)"} }, + { dItemNo_NOENTRY_77_e, {"Reserved"} }, + { dItemNo_NOENTRY_78_e, {"Reserved"} }, + { dItemNo_BOMB_BAG_LV2_e, {"Giant Bomb Bag"} }, + { dItemNo_BOMB_BAG_LV1_e, {"Empty Bomb Bag", ITEMTYPE_EQUIP_e} }, + { dItemNo_BOMB_IN_BAG_e, {"Bomb Bag"} }, + { dItemNo_NOENTRY_82_e, {"Reserved"} }, + { dItemNo_LIGHT_ARROW_e, {"Light Arrow"} }, + { dItemNo_ARROW_LV1_e, {"Quiver"} }, + { dItemNo_ARROW_LV2_e, {"Big Quiver"} }, + { dItemNo_ARROW_LV3_e, {"Giant Quiver"} }, + { dItemNo_NOENTRY_87_e, {"Reserved"} }, + { dItemNo_LURE_ROD_e, {"Fishing Rod (Lure)"} }, + { dItemNo_BOMB_ARROW_e, {"Bomb Arrow"} }, + { dItemNo_HAWK_ARROW_e, {"Hawk Arrow"} }, + { dItemNo_BEE_ROD_e, {"Fishing Rod (Bee Larva)", ITEMTYPE_EQUIP_e} }, + { dItemNo_JEWEL_ROD_e, {"Fishing Rod (Earring)", ITEMTYPE_EQUIP_e} }, + { dItemNo_WORM_ROD_e, {"Fishing Rod (Worm)", ITEMTYPE_EQUIP_e} }, + { dItemNo_JEWEL_BEE_ROD_e, {"Fishing Rod (Earring + Bee Larva)", ITEMTYPE_EQUIP_e} }, + { dItemNo_JEWEL_WORM_ROD_e, {"Fishing Rod (Earring + Worm)", ITEMTYPE_EQUIP_e} }, + { dItemNo_EMPTY_BOTTLE_e, {"Empty Bottle", ITEMTYPE_EQUIP_e} }, + { dItemNo_RED_BOTTLE_e, {"Red Potion", ITEMTYPE_EQUIP_e} }, + { dItemNo_GREEN_BOTTLE_e, {"Green Potion", ITEMTYPE_EQUIP_e} }, + { dItemNo_BLUE_BOTTLE_e, {"Blue Potion", ITEMTYPE_EQUIP_e} }, + { dItemNo_MILK_BOTTLE_e, {"Milk Bottle", ITEMTYPE_EQUIP_e} }, + { dItemNo_HALF_MILK_BOTTLE_e, {"Half Milk Bottle", ITEMTYPE_EQUIP_e} }, + { dItemNo_OIL_BOTTLE_e, {"Lantern Oil", ITEMTYPE_EQUIP_e} }, + { dItemNo_WATER_BOTTLE_e, {"Water Bottle", ITEMTYPE_EQUIP_e} }, + { dItemNo_OIL_BOTTLE_2_e, {"Lantern Oil (Scooped)"} }, + { dItemNo_RED_BOTTLE_2_e, {"Red Potion (Scooped)"} }, + { dItemNo_UGLY_SOUP_e, {"Nasty Soup", ITEMTYPE_EQUIP_e} }, + { dItemNo_HOT_SPRING_e, {"Hotspring Water", ITEMTYPE_EQUIP_e} }, + { dItemNo_FAIRY_e, {"Fairy", ITEMTYPE_EQUIP_e} }, + { dItemNo_HOT_SPRING_2_e, {"Hotspring Water (Shop)"} }, + { dItemNo_OIL2_e, {"Lantern Refill (Scooped)"} }, + { dItemNo_OIL_e, {"Lantern Refill (Shop)"} }, + { dItemNo_NORMAL_BOMB_e, {"Bombs", ITEMTYPE_EQUIP_e} }, + { dItemNo_WATER_BOMB_e, {"Water Bombs", ITEMTYPE_EQUIP_e} }, + { dItemNo_POKE_BOMB_e, {"Bomblings", ITEMTYPE_EQUIP_e} }, + { dItemNo_FAIRY_DROP_e, {"Great Fairy's Tears", ITEMTYPE_EQUIP_e} }, + { dItemNo_WORM_e, {"Worm", ITEMTYPE_EQUIP_e} }, + { dItemNo_DROP_BOTTLE_e, {"Great Fairy Tears (Jovani)"} }, + { dItemNo_BEE_CHILD_e, {"Bee Larva", ITEMTYPE_EQUIP_e} }, + { dItemNo_CHUCHU_RARE_e, {"Rare Chu Jelly", ITEMTYPE_EQUIP_e} }, + { dItemNo_CHUCHU_RED_e, {"Red Chu Jelly", ITEMTYPE_EQUIP_e} }, + { dItemNo_CHUCHU_BLUE_e, {"Blue Chu Jelly", ITEMTYPE_EQUIP_e} }, + { dItemNo_CHUCHU_GREEN_e, {"Green Chu Jelly", ITEMTYPE_EQUIP_e} }, + { dItemNo_CHUCHU_YELLOW_e, {"Yellow Chu Jelly", ITEMTYPE_EQUIP_e} }, + { dItemNo_CHUCHU_PURPLE_e, {"Purple Chu Jelly", ITEMTYPE_EQUIP_e} }, + { dItemNo_LV1_SOUP_e, {"Simple Soup", ITEMTYPE_EQUIP_e} }, + { dItemNo_LV2_SOUP_e, {"Good Soup", ITEMTYPE_EQUIP_e} }, + { dItemNo_LV3_SOUP_e, {"Superb Soup", ITEMTYPE_EQUIP_e} }, + { dItemNo_LETTER_e, {"Renado's Letter", ITEMTYPE_EQUIP_e} }, + { dItemNo_BILL_e, {"Invoice", ITEMTYPE_EQUIP_e} }, + { dItemNo_WOOD_STATUE_e, {"Wooden Statue", ITEMTYPE_EQUIP_e} }, + { dItemNo_IRIAS_PENDANT_e, {"Ilia's Charm", ITEMTYPE_EQUIP_e} }, + { dItemNo_HORSE_FLUTE_e, {"Horse Call", ITEMTYPE_EQUIP_e} }, + { dItemNo_NOENTRY_133_e, {"Reserved"} }, + { dItemNo_NOENTRY_134_e, {"Reserved"} }, + { dItemNo_NOENTRY_135_e, {"Reserved"} }, + { dItemNo_NOENTRY_136_e, {"Reserved"} }, + { dItemNo_NOENTRY_137_e, {"Reserved"} }, + { dItemNo_NOENTRY_138_e, {"Reserved"} }, + { dItemNo_NOENTRY_139_e, {"Reserved"} }, + { dItemNo_NOENTRY_140_e, {"Reserved"} }, + { dItemNo_NOENTRY_141_e, {"Reserved"} }, + { dItemNo_NOENTRY_142_e, {"Reserved"} }, + { dItemNo_NOENTRY_143_e, {"Reserved"} }, + { dItemNo_RAFRELS_MEMO_e, {"Auru's Memo", ITEMTYPE_EQUIP_e} }, + { dItemNo_ASHS_SCRIBBLING_e, {"Ashei's Sketch", ITEMTYPE_EQUIP_e} }, + { dItemNo_NOENTRY_146_e, {"Reserved"} }, + { dItemNo_NOENTRY_147_e, {"Reserved"} }, + { dItemNo_NOENTRY_148_e, {"Reserved"} }, + { dItemNo_NOENTRY_149_e, {"Reserved"} }, + { dItemNo_NOENTRY_150_e, {"Reserved"} }, + { dItemNo_NOENTRY_151_e, {"Reserved"} }, + { dItemNo_NOENTRY_152_e, {"Reserved"} }, + { dItemNo_NOENTRY_153_e, {"Reserved"} }, + { dItemNo_NOENTRY_154_e, {"Reserved"} }, + { dItemNo_NOENTRY_155_e, {"Reserved"} }, + { dItemNo_CHUCHU_YELLOW2_e, {"Lantern Refill (Yellow Chu)"} }, + { dItemNo_OIL_BOTTLE3_e, {"Lantern Oil (Coro)"} }, + { dItemNo_SHOP_BEE_CHILD_e, {"Bee Larve (Shop)"} }, + { dItemNo_CHUCHU_BLACK_e, {"Black Chu Jelly", ITEMTYPE_EQUIP_e} }, + { dItemNo_LIGHT_DROP_e, {"Tear of Light"} }, + { dItemNo_DROP_CONTAINER_e, {"Vessel of Light (Faron)"} }, + { dItemNo_DROP_CONTAINER02_e, {"Vessel of Light (Eldin)"} }, + { dItemNo_DROP_CONTAINER03_e, {"Vessel of Light (Lanayru)"} }, + { dItemNo_FILLED_CONTAINER_e, {"Vessel of Light (Filled)"} }, + { dItemNo_MIRROR_PIECE_2_e, {"Mirror Shard (Snowpeak Ruins)"} }, + { dItemNo_MIRROR_PIECE_3_e, {"Mirror Shard (Temple of Time)"} }, + { dItemNo_MIRROR_PIECE_4_e, {"Mirror Shard (City in the Sky)"} }, + { dItemNo_NOENTRY_168_e, {"Reserved"} }, + { dItemNo_NOENTRY_169_e, {"Reserved"} }, + { dItemNo_NOENTRY_170_e, {"Reserved"} }, + { dItemNo_NOENTRY_171_e, {"Reserved"} }, + { dItemNo_NOENTRY_172_e, {"Reserved"} }, + { dItemNo_NOENTRY_173_e, {"Reserved"} }, + { dItemNo_NOENTRY_174_e, {"Reserved"} }, + { dItemNo_NOENTRY_175_e, {"Reserved"} }, + { dItemNo_SMELL_YELIA_POUCH_e, {"Scent of Ilia"} }, + { dItemNo_SMELL_PUMPKIN_e, {"Pumpkin Scent"} }, + { dItemNo_SMELL_POH_e, {"Poe Scent"} }, + { dItemNo_SMELL_FISH_e, {"Reekfish Scent"} }, + { dItemNo_SMELL_CHILDREN_e, {"Youth's Scent"} }, + { dItemNo_SMELL_MEDICINE_e, {"Medicine Scent"} }, + { dItemNo_NOENTRY_182_e, {"Reserved"} }, + { dItemNo_NOENTRY_183_e, {"Reserved"} }, + { dItemNo_NOENTRY_184_e, {"Reserved"} }, + { dItemNo_NOENTRY_185_e, {"Reserved"} }, + { dItemNo_NOENTRY_186_e, {"Reserved"} }, + { dItemNo_NOENTRY_187_e, {"Reserved"} }, + { dItemNo_NOENTRY_188_e, {"Reserved"} }, + { dItemNo_NOENTRY_189_e, {"Reserved"} }, + { dItemNo_NOENTRY_190_e, {"Reserved"} }, + { dItemNo_NOENTRY_191_e, {"Reserved"} }, + { dItemNo_M_BEETLE_e, {"Beetle (M)"} }, + { dItemNo_F_BEETLE_e, {"Beetle (F)"} }, + { dItemNo_M_BUTTERFLY_e, {"Butterfly (M)"} }, + { dItemNo_F_BUTTERFLY_e, {"Butterfly (F)"} }, + { dItemNo_M_STAG_BEETLE_e, {"Stag Beetle (M)"} }, + { dItemNo_F_STAG_BEETLE_e, {"Stag Beetle (F)"} }, + { dItemNo_M_GRASSHOPPER_e, {"Grasshopper (M)"} }, + { dItemNo_F_GRASSHOPPER_e, {"Grasshopper (F)"} }, + { dItemNo_M_NANAFUSHI_e, {"Phasmid (M)"} }, + { dItemNo_F_NANAFUSHI_e, {"Phasmid (F)"} }, + { dItemNo_M_DANGOMUSHI_e, {"Pill Bug (M)"} }, + { dItemNo_F_DANGOMUSHI_e, {"Pill Bug (F)"} }, + { dItemNo_M_MANTIS_e, {"Mantis (M)"} }, + { dItemNo_F_MANTIS_e, {"Mantis (F)"} }, + { dItemNo_M_LADYBUG_e, {"Ladybug (M)"} }, + { dItemNo_F_LADYBUG_e, {"Ladybug (F)"} }, + { dItemNo_M_SNAIL_e, {"Snail (M)"} }, + { dItemNo_F_SNAIL_e, {"Snail (F)"} }, + { dItemNo_M_DRAGONFLY_e, {"Dragonfly (M)"} }, + { dItemNo_F_DRAGONFLY_e, {"Dragonfly (F)"} }, + { dItemNo_M_ANT_e, {"Ant (M)"} }, + { dItemNo_F_ANT_e, {"Ant (F)"} }, + { dItemNo_M_MAYFLY_e, {"Mayfly (M)"} }, + { dItemNo_F_MAYFLY_e, {"Mayfly (F)"} }, + { dItemNo_NOENTRY_216_e, {"Reserved"} }, + { dItemNo_NOENTRY_217_e, {"Reserved"} }, + { dItemNo_NOENTRY_218_e, {"Reserved"} }, + { dItemNo_NOENTRY_219_e, {"Reserved"} }, + { dItemNo_NOENTRY_220_e, {"Reserved"} }, + { dItemNo_NOENTRY_221_e, {"Reserved"} }, + { dItemNo_NOENTRY_222_e, {"Reserved"} }, + { dItemNo_NOENTRY_223_e, {"Reserved"} }, + { dItemNo_POU_SPIRIT_e, {"Poe Soul"} }, + { dItemNo_NOENTRY_225_e, {"Reserved"} }, + { dItemNo_NOENTRY_226_e, {"Reserved"} }, + { dItemNo_NOENTRY_227_e, {"Reserved"} }, + { dItemNo_NOENTRY_228_e, {"Reserved"} }, + { dItemNo_NOENTRY_229_e, {"Reserved"} }, + { dItemNo_NOENTRY_230_e, {"Reserved"} }, + { dItemNo_NOENTRY_231_e, {"Reserved"} }, + { dItemNo_NOENTRY_232_e, {"Reserved"} }, + { dItemNo_ANCIENT_DOCUMENT_e, {"Ancient Sky Book", ITEMTYPE_EQUIP_e} }, + { dItemNo_AIR_LETTER_e, {"Ancient Sky Book (Partial)", ITEMTYPE_EQUIP_e} }, + { dItemNo_ANCIENT_DOCUMENT2_e, {"Ancient Sky Book (Filled)", ITEMTYPE_EQUIP_e} }, + { dItemNo_LV7_DUNGEON_EXIT_e, {"Ooccoo Sr. (City in the Sky)"} }, + { dItemNo_LINKS_SAVINGS_e, {"Purple Rupee (Link's Savings)"} }, + { dItemNo_SMALL_KEY2_e, {"Small Key (North Faron Gate)"} }, + { dItemNo_POU_FIRE1_e, {"Poe Fire 1"} }, + { dItemNo_POU_FIRE2_e, {"Poe Fire 2"} }, + { dItemNo_POU_FIRE3_e, {"Poe Fire 3"} }, + { dItemNo_POU_FIRE4_e, {"Poe Fire 4"} }, + { dItemNo_BOSSRIDER_KEY_e, {"Hyrule Field Keys"} }, + { dItemNo_TOMATO_PUREE_e, {"Ordon Pumpkin", ITEMTYPE_EQUIP_e} }, + { dItemNo_TASTE_e, {"Ordon Goat Cheese", ITEMTYPE_EQUIP_e} }, + { dItemNo_LV5_BOSS_KEY_e, {"Bedroom Key"} }, + { dItemNo_SURFBOARD_e, {"Surf Leaf"} }, + { dItemNo_KANTERA2_e, {"Lantern (Reclaimed)"} }, + { dItemNo_L2_KEY_PIECES1_e, {"Key Shard (1)"} }, + { dItemNo_L2_KEY_PIECES2_e, {"Key Shard (2)"} }, + { dItemNo_L2_KEY_PIECES3_e, {"Key Shard (3)"} }, + { dItemNo_KEY_OF_CARAVAN_e, {"Bulblin Camp Key"} }, + { dItemNo_LV2_BOSS_KEY_e, {"Goron Mines Boss Key"} }, + { dItemNo_KEY_OF_FILONE_e, {"South Faron Gate Key"} }, + { dItemNo_NONE_e, {"None"} }, }; ImGuiSaveEditor::ImGuiSaveEditor() {} @@ -292,7 +302,7 @@ namespace dusk { } if (ImGui::BeginTabItem("Inventory")) { - //DrawInventoryTab(); + drawInventoryTab(); ImGui::EndTabItem(); } @@ -384,7 +394,7 @@ namespace dusk { int currentSlotNo = selectItemData; std::string defaultLabel = currentSlotNo != 0xFF - ? fmt::format("Slot {0} ({1})", currentSlotNo, itemMap.find(item.mItems[currentSlotNo])->second) + ? fmt::format("Slot {0} ({1})", currentSlotNo, itemMap.find(item.mItems[currentSlotNo])->second.m_name) : "None"; // TODO: live update equips @@ -395,7 +405,7 @@ namespace dusk { for (int i = 0; i < 24; i++) { u8 itemNo = item.mItems[i]; - if (ImGui::Selectable(fmt::format("Slot {0} ({1})", i, itemMap.find(itemNo)->second).c_str())) { + if (ImGui::Selectable(fmt::format("Slot {0} ({1})", i, itemMap.find(itemNo)->second.m_name).c_str())) { selectItemData = i; } } @@ -439,7 +449,7 @@ namespace dusk { genSelectItemComboBox("Combo Equip Y", statusA.mMixItem[1]); - if (ImGui::BeginCombo("Clothes", itemMap.find(statusA.mSelectEquip[0])->second.c_str())) { + if (ImGui::BeginCombo("Clothes", itemMap.find(statusA.mSelectEquip[0])->second.m_name.c_str())) { if (ImGui::Selectable("None")) { statusA.mSelectEquip[0] = dItemNo_NONE_e; } @@ -458,7 +468,7 @@ namespace dusk { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Sword", itemMap.find(statusA.mSelectEquip[1])->second.c_str())) { + if (ImGui::BeginCombo("Sword", itemMap.find(statusA.mSelectEquip[1])->second.m_name.c_str())) { if (ImGui::Selectable("None")) { statusA.mSelectEquip[1] = dItemNo_NONE_e; } @@ -477,7 +487,7 @@ namespace dusk { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Shield", itemMap.find(statusA.mSelectEquip[2])->second.c_str())) { + if (ImGui::BeginCombo("Shield", itemMap.find(statusA.mSelectEquip[2])->second.m_name.c_str())) { if (ImGui::Selectable("None")) { statusA.mSelectEquip[2] = dItemNo_NONE_e; } @@ -493,7 +503,7 @@ namespace dusk { ImGui::EndCombo(); } - if (ImGui::BeginCombo("Scent", itemMap.find(statusA.mSelectEquip[3])->second.c_str())) { + if (ImGui::BeginCombo("Scent", itemMap.find(statusA.mSelectEquip[3])->second.m_name.c_str())) { if (ImGui::Selectable("None")) { statusA.mSelectEquip[3] = dItemNo_NONE_e; } @@ -666,6 +676,29 @@ namespace dusk { } void ImGuiSaveEditor::drawInventoryTab() { + dSv_player_item_c& item = dComIfGs_getSaveData()->getPlayer().getItem(); + + ImGuiBeginGroupPanel("Items", { 200, 100 }); + for (int slot = 0; slot < 24; slot++) { + ImGui::Text("Slot %02d: ", slot); + ImGui::SameLine(); + if (ImGui::BeginCombo(fmt::format("##ItemComboBox{}", slot).c_str(), itemMap.find(item.mItems[slot])->second.m_name.c_str())) { + if (ImGui::Selectable("None")) { + dComIfGs_setItem(slot, dItemNo_NONE_e); + } + + for (int i = 0; i < 254; i++) { + if (itemMap.find(i)->second.m_type != ITEMTYPE_EQUIP_e) continue; + + if (ImGui::Selectable(fmt::format("{0}##item_{1}{2}", itemMap.find(i)->second.m_name, slot, i).c_str())) { + dComIfGs_setItem(slot, itemMap.find(i)->first); + } + } + ImGui::EndCombo(); + } + } + ImGuiEndGroupPanel(); + } From 6764a6036450c252bcf5afeca392fa698c402d76 Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Thu, 26 Mar 2026 20:11:39 -0400 Subject: [PATCH 15/19] Fix UB in search_ground_1 in d_a_e_yg This could cause a crash and was previously fixed by 7d3795f7, but it's a band-aid solution. This fix addresses the underlying bug that actually causes the crash. The workaround remains in place for now because similar bugs related to NaNs have been encountered, and it's not currently known how many places in the codebase are affected as well. --- src/d/actor/d_a_e_yg.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/d/actor/d_a_e_yg.cpp b/src/d/actor/d_a_e_yg.cpp index 43f91ee793..9ab6c80e6d 100644 --- a/src/d/actor/d_a_e_yg.cpp +++ b/src/d/actor/d_a_e_yg.cpp @@ -527,7 +527,7 @@ static void search_ground_1(e_yg_class* i_this) { fopAc_ac_c* actor = (fopAc_ac_c*)&i_this->actor; dBgS_LinChk lin_chk; cXyz start, end, work; - cXyz pos[16]; + cXyz pos[16]{}; s16 y_rot = actor->shape_angle.y; s8 line_cross_flag = false; @@ -560,6 +560,14 @@ static void search_ground_1(e_yg_class* i_this) { pos[i] = actor->current.pos; pos[i].x += 10000.0f; } + } else { + // Ensure all elements are initialized. This function is buggy and + // blows up if pos[0].x or pos[0].z is NaN, but for some reason this + // never happens on hardware - probably just dumb luck. +#if AVOID_UB + pos[i] = actor->current.pos; + pos[i].x += 10000.0f; +#endif } ANGLE_ADD(y_rot, 0x1000); From b0cd70ce749cf0e3c99a9bf3b1fd4ba03d79894e Mon Sep 17 00:00:00 2001 From: Roman Sandu Date: Fri, 27 Mar 2026 04:54:07 +0300 Subject: [PATCH 16/19] JAHostIO and friends (#3131) --- config/ShieldD/splits.txt | 4 +- config/ShieldD/symbols.txt | 6 +- configure.py | 2 +- include/Z2AudioLib/Z2Audience.h | 12 +- include/Z2AudioLib/Z2DebugSys.h | 1 - include/Z2AudioLib/Z2F1TestWindow.h | 31 +- include/Z2AudioLib/Z2FxLineMgr.h | 95 +++- include/Z2AudioLib/Z2SceneMgr.h | 8 +- include/Z2AudioLib/Z2SpeechMgr2.h | 3 + include/global.h | 4 + .../JSystem/JAHNodeLib/JAHSoundPlayerNode.h | 33 ++ .../include/JSystem/JAHostIO/JAHFrameNode.h | 6 +- .../include/JSystem/JAHostIO/JAHPubDefine.h | 6 +- .../include/JSystem/JAHostIO/JAHUAsnData.h | 40 ++ .../include/JSystem/JAHostIO/JAHUGlobal.h | 30 ++ .../include/JSystem/JAHostIO/JAHUTableEdit.h | 39 +- .../include/JSystem/JAHostIO/JAHUpdate.h | 57 +++ .../include/JSystem/JAHostIO/JAHVirtualNode.h | 19 +- .../include/JSystem/JAHostIO/JAHioMessage.h | 192 +++++++- .../include/JSystem/JAudio2/JASDSPInterface.h | 1 + .../include/JSystem/JAudio2/JAUSoundTable.h | 4 + .../include/JSystem/JHostIO/JOREvent.h | 36 ++ .../JSystem/include/JSystem/JHostIO/JORFile.h | 2 +- .../include/JSystem/JHostIO/JORMContext.h | 23 +- .../include/JSystem/JHostIO/JORReflexible.h | 38 +- .../include/JSystem/JKernel/JKRArchive.h | 1 - .../JSystem/include/JSystem/JKernel/JKRHeap.h | 2 +- .../include/JSystem/JSupport/JSUInputStream.h | 24 +- .../JSystem/JSupport/JSUMemoryStream.h | 12 +- .../src/JAHNodeLib/JAHAudienceSettingNode.cpp | 5 + .../JSystem/src/JAHNodeLib/JAHConductNode.cpp | 8 + libs/JSystem/src/JAHNodeLib/JAHIDSwapNode.cpp | 8 + .../src/JAHNodeLib/JAHSoundPlayerNode.cpp | 149 ++++++ libs/JSystem/src/JAHNodeLib/JAHViewerApp.cpp | 14 + libs/JSystem/src/JAHNodeLib/JAHViewerSys.cpp | 12 + libs/JSystem/src/JAHostIO/JAHFrameNode.cpp | 93 ++++ libs/JSystem/src/JAHostIO/JAHUAsnData.cpp | 172 +++++++ libs/JSystem/src/JAHostIO/JAHUFx.cpp | 8 + libs/JSystem/src/JAHostIO/JAHUTableEdit.cpp | 196 ++++++++ libs/JSystem/src/JAHostIO/JAHVirtualNode.cpp | 93 ++++ libs/JSystem/src/JAHostIO/JAHioMessage.cpp | 4 +- libs/JSystem/src/JAHostIO/JAHioMgr.cpp | 7 +- libs/JSystem/src/JAHostIO/JAHioNode.cpp | 12 +- libs/JSystem/src/JAHostIO/JAHioUtil.cpp | 13 +- .../MSL/MSL_C/MSL_Common/Include/string | 6 +- libs/revolution/include/revolution/dvd.h | 9 +- libs/revolution/src/ipc/ipcProfile.c | 1 + libs/revolution/src/pad/Pad.c | 1 + libs/revolution/src/wpad/__wpad.h | 1 + src/Z2AudioLib/SpotName.h | 20 + src/Z2AudioLib/Z2AudioMgr.cpp | 1 + src/Z2AudioLib/Z2DebugSys.cpp | 110 ++++- src/Z2AudioLib/Z2EnvSeMgr.cpp | 87 +--- src/Z2AudioLib/Z2F1TestWindow.cpp | 198 ++++++++ src/Z2AudioLib/Z2FxLineMgr.cpp | 443 +++++++++++++++--- src/Z2AudioLib/Z2SceneMgr.cpp | 85 +--- src/Z2AudioLib/Z2SeqMgr.cpp | 85 +--- src/Z2AudioLib/Z2StatusMgr.cpp | 85 +--- src/Z2AudioLib/Z2WolfHowlMgr.cpp | 1 + 59 files changed, 2133 insertions(+), 525 deletions(-) create mode 100644 libs/JSystem/include/JSystem/JAHostIO/JAHUAsnData.h create mode 100644 libs/JSystem/include/JSystem/JAHostIO/JAHUGlobal.h create mode 100644 libs/JSystem/include/JSystem/JAHostIO/JAHUpdate.h create mode 100644 libs/JSystem/include/JSystem/JHostIO/JOREvent.h create mode 100644 libs/JSystem/src/JAHNodeLib/JAHAudienceSettingNode.cpp create mode 100644 libs/JSystem/src/JAHNodeLib/JAHConductNode.cpp create mode 100644 libs/JSystem/src/JAHNodeLib/JAHIDSwapNode.cpp create mode 100644 libs/JSystem/src/JAHNodeLib/JAHSoundPlayerNode.cpp create mode 100644 libs/JSystem/src/JAHNodeLib/JAHViewerApp.cpp create mode 100644 libs/JSystem/src/JAHNodeLib/JAHViewerSys.cpp create mode 100644 libs/JSystem/src/JAHostIO/JAHFrameNode.cpp create mode 100644 libs/JSystem/src/JAHostIO/JAHUAsnData.cpp create mode 100644 libs/JSystem/src/JAHostIO/JAHUFx.cpp create mode 100644 libs/JSystem/src/JAHostIO/JAHUTableEdit.cpp create mode 100644 libs/JSystem/src/JAHostIO/JAHVirtualNode.cpp create mode 100644 src/Z2AudioLib/SpotName.h create mode 100644 src/Z2AudioLib/Z2F1TestWindow.cpp diff --git a/config/ShieldD/splits.txt b/config/ShieldD/splits.txt index 3affc69457..0b3680a1e3 100644 --- a/config/ShieldD/splits.txt +++ b/config/ShieldD/splits.txt @@ -2862,7 +2862,7 @@ JSystem/JAHostIO/JAHVirtualNode.cpp: .text start:0x804B0490 end:0x804B0A80 .data start:0x80704000 end:0x80704048 .sdata start:0x807490E0 end:0x80749108 - .sbss start:0x8074CDA0 end:0x8074CDAC + .sbss start:0x8074CDA0 end:0x8074CDA8 JSystem/JAHostIO/JAHUAsnData.cpp: .text start:0x804B0A80 end:0x804B15A0 @@ -2926,7 +2926,7 @@ JSystem/JMessage/locale.cpp: Z2AudioLib/Z2Calc.cpp: .text start:0x804BAF50 end:0x804BB4D0 - .sbss start:0x8074CDAC end:0x8074CDB0 + .sbss start:0x8074CDA8 end:0x8074CDB0 .sdata2 start:0x80751EC0 end:0x80751ED8 Z2AudioLib/Z2Param.cpp: diff --git a/config/ShieldD/symbols.txt b/config/ShieldD/symbols.txt index 91a37aa732..c894bc2a0f 100644 --- a/config/ShieldD/symbols.txt +++ b/config/ShieldD/symbols.txt @@ -63143,8 +63143,8 @@ __RTTI__24JAUStreamAramMgrBase_<1> = .sdata:0x8074A600; // type:object size:0x8 @STRING@__ct__32JASGlobalInstance<11Z2SoundInfo>Fb@2 = .sdata:0x8074A634; // type:object size:0x5 scope:local data:string hash:0x20DA3ACD dhash:0x94E062D9 @122994 = .sdata:0x8074A640; // type:object size:0x5 scope:local data:string hash:0xACC96C60 @122997 = .sdata:0x8074A648; // type:object size:0x7 scope:local data:string hash:0xACC96C63 -lbl_8074A64F = .sdata:0x8074A64F; // type:object size:0x1 data:byte hash:0x132ED010 -lbl_8074A650 = .sdata:0x8074A650; // type:object size:0x8 data:byte hash:0x6496B168 +gMicOn = .sdata:0x8074A64F; // type:object size:0x1 data:byte hash:0x132ED010 +gMicOffWhenOutOfSight = .sdata:0x8074A650; // type:object size:0x1 data:byte hash:0x6496B168 __RTTI__11Z2ParamNode = .sdata:0x8074A658; // type:object size:0x8 scope:global hash:0x427C3879 dhash:0xA49E2699 __RTTI__17Z2HioSeSeqDataMgr = .sdata:0x8074A660; // type:object size:0x8 scope:global hash:0x9E17CBE7 dhash:0x4E4A5DC1 @STRING@newInstance__27JAHSingletonBase<8JAHioMgr>Fv@6 = .sdata:0x8074A668; // type:object size:0x5 scope:local data:string hash:0x8DC98438 dhash:0x0A5C4CFA @@ -64824,7 +64824,7 @@ data_80451358 = .sbss:0x8074CDD8; // type:object size:0x1 data:byte hash:0xA31DF data_80451359 = .sbss:0x8074CDD9; // type:object size:0x1 data:byte hash:0xE4CA1432 dhash:0x0157E254 mLinkPtr__14Z2CreatureLink = .sbss:0x8074CDE0; // type:object size:0x4 scope:global data:4byte hash:0x696E3950 dhash:0xD016AAD5 mAudioMgrPtr__10Z2AudioMgr = .sbss:0x8074CDE8; // type:object size:0x4 scope:global data:4byte hash:0x54526A77 dhash:0x71D35736 -lbl_8074CDF0 = .sbss:0x8074CDF0; // type:object size:0x1 data:byte hash:0xBB7CA6C8 +gMuffleOutOfRangeMic = .sbss:0x8074CDF0; // type:object size:0x1 data:byte hash:0xBB7CA6C8 sF1_Pan_Width = .sbss:0x8074CDF8; // type:object size:0x4 scope:global align:4 data:float hash:0x38037A38 sMixingBuffer = .sbss:0x8074CE00; // type:object size:0x4 scope:global data:4byte hash:0xFB6CB64A sInstance__29JASGlobalInstance<9SpkSystem> = .sbss:0x8074CE08; // type:object size:0x4 scope:global data:4byte hash:0xA09FFFD8 dhash:0x0F2938EA diff --git a/configure.py b/configure.py index 12860d0c1b..313d24f55c 100755 --- a/configure.py +++ b/configure.py @@ -1236,7 +1236,7 @@ config.libs = [ JSystemLib( "JAHNodeLib", [ - Object(NonMatching, "JSystem/JAHNodeLib/JAHAudienceSettingNode.cpp"), + Object(Matching, "JSystem/JAHNodeLib/JAHAudienceSettingNode.cpp"), Object(NonMatching, "JSystem/JAHNodeLib/JAHConductNode.cpp"), Object(NonMatching, "JSystem/JAHNodeLib/JAHIDSwapNode.cpp"), Object(NonMatching, "JSystem/JAHNodeLib/JAHSoundPlayerNode.cpp"), diff --git a/include/Z2AudioLib/Z2Audience.h b/include/Z2AudioLib/Z2Audience.h index dd30b87948..75998e878b 100644 --- a/include/Z2AudioLib/Z2Audience.h +++ b/include/Z2AudioLib/Z2Audience.h @@ -33,7 +33,7 @@ struct Z2AudioCamera { f32 getVolCenterZ() const { return mVolCenterZ; } void setMainCamera(bool param_0) { mSetMainCamera = param_0; } - void setTargetVolume(f32 vol) { + void setTargetVolume(f32 vol) { JUT_ASSERT(281, vol <= 1.f); if (vol < 0.0f) { vol = 0.0f; @@ -45,6 +45,10 @@ struct Z2AudioCamera { f32 getFovySin() const { return mFovySin; } const JGeometry::TVec3* getVel() const { return &mVel; } + f32 getTargetVolume() const { return mTargetVolume; } + f32 getCamDist() const { return mCamDist; } + + /* 0x00 */ JGeometry::TPosition3f32 field_0x0; /* 0x30 */ JGeometry::TVec3 mVel; /* 0x3C */ JGeometry::TVec3 mPos; @@ -68,6 +72,10 @@ struct Z2SpotMic { u32 calcMicPriority(f32); f32 calcMicVolume(f32, int camID, f32); + void calcPriorityFactor(); + void setIgnoreIfOut(bool value) { mIgnoreIfOut = value; } + void setMicOn(bool value) { mMicOn = value; } + void setPosPtr(Vec* posPtr) { mPosPtr = posPtr; } bool isOn() { return mMicOn; } @@ -231,6 +239,8 @@ struct Z2Audience : public JAIAudience, public JASGlobalInstance { const Z2AudioCamera* getAudioCamera(int camID) const { return &mAudioCamera[camID]; } + void setUsingOffMicVol(bool value) { mUsingOffMicVol = value; } + /* 0x004 */ f32 field_0x4; /* 0x008 */ u8 field_0x8; /* 0x00C */ Z2Audience3DSetting mSetting; diff --git a/include/Z2AudioLib/Z2DebugSys.h b/include/Z2AudioLib/Z2DebugSys.h index a98292e8c1..1acd8f97b9 100644 --- a/include/Z2AudioLib/Z2DebugSys.h +++ b/include/Z2AudioLib/Z2DebugSys.h @@ -12,7 +12,6 @@ class Z2ParamNode : public JAHFrameNode { public: Z2ParamNode() : JAHFrameNode("サウンド各種パラメータ") {} - /* vt[07] */ virtual ~Z2ParamNode() {} /* vt[08] */ virtual void message(JAHControl& control); /* vt[0F] */ virtual void propertyEvent(JAH_P_Event, u32); /* vt[12] */ virtual void onFrame(); diff --git a/include/Z2AudioLib/Z2F1TestWindow.h b/include/Z2AudioLib/Z2F1TestWindow.h index 162e5e4b82..4c43d2678e 100644 --- a/include/Z2AudioLib/Z2F1TestWindow.h +++ b/include/Z2AudioLib/Z2F1TestWindow.h @@ -1,6 +1,7 @@ #ifndef Z2F1TESTWINDOW_H #define Z2F1TESTWINDOW_H +#include "JSystem/JAHostIO/JAHFrameNode.h" #include "JSystem/JAHostIO/JAHUTableEdit.h" #include "JSystem/JAWExtSystem/JAWWindow.h" @@ -8,6 +9,21 @@ class Z2F1TestWindow : public JAWWindow { public: Z2F1TestWindow(); + virtual void onDraw(JAWGraphContext*); + virtual void frameWork(); + virtual void onPadProc(const JUTGamePad&); + virtual void onTrigY(const JUTGamePad&); + virtual void onTrigMenu(const JUTGamePad&); + + void calcF1(); + f32 tau(f32); + static f32 calcThreshold(int); + f32 getRawX() const; + f32 calcNoise(); + void setValue(f32, f32); + f32 getValue2(); + f32 getValue(); + /* 0x3F0 */ f32 field_0x3f0; /* 0x3F4 */ f32 field_0x3f4; /* 0x3F8 */ f32 field_0x3f8[500]; @@ -21,12 +37,15 @@ class Z2F1SwingTestNode : public JAHFrameNode, public Z2F1TestWindow { public: Z2F1SwingTestNode(); + virtual void message(JAHControl&); + virtual void onFrame(); + /* 0xC48 */ JAHUSeBox field_0xc48; /* 0xCD0 */ JAHUSeBox field_0xcd0; - /* 0xD58 */ u8 field_0xd58; - /* 0xD59 */ u8 field_0xd59; - /* 0xD5A */ u8 field_0xd5a; - /* 0xD5B */ u8 field_0xd5b; + /* 0xD58 */ u8 mModulateVolume; + /* 0xD59 */ u8 mModulatePitch; + /* 0xD5A */ u8 mModulatePan; + /* 0xD5B */ u8 mModulateDolby; /* 0xD5C */ f32 field_0xd5c; /* 0xD60 */ f32 field_0xd60; /* 0xD64 */ f32 field_0xd64; @@ -37,11 +56,15 @@ public: class Z2AudSettingView : public JAWWindow { public: Z2AudSettingView(); + + virtual void onDraw(JAWGraphContext*); }; class Z2DSPCheck : public JAWWindow { public: Z2DSPCheck() : JAWWindow("Z2DSPCheck", 500, 450) {} + + virtual void onDraw(JAWGraphContext*); }; #endif /* Z2F1TESTWINDOW_H */ diff --git a/include/Z2AudioLib/Z2FxLineMgr.h b/include/Z2AudioLib/Z2FxLineMgr.h index 0614f531da..9e16670031 100644 --- a/include/Z2AudioLib/Z2FxLineMgr.h +++ b/include/Z2AudioLib/Z2FxLineMgr.h @@ -1,35 +1,92 @@ #ifndef Z2FXLINEMGR_H #define Z2FXLINEMGR_H -#include "JSystem/JAudio2/JASGadget.h" #include "JSystem/JAHostIO/JAHFrameNode.h" +#include "JSystem/JAudio2/JASDSPInterface.h" +#include "JSystem/JAudio2/JASGadget.h" class JKRArchive; class JKRExpHeap; class JKRHeap; -class Z2FxLineEditNode : public JAHFrameNode { -public: - Z2FxLineEditNode(JKRExpHeap*); +struct Z2FxLineConfigSingle { + /* 0x00 */ u8 unk0; + /* 0x01 */ u8 unk1; + /* 0x02 */ u8 unk2; + /* 0x03 */ u8 unk3; + /* 0x04 */ s16 unk4; + /* 0x06 */ s16 unk6; + /* 0x08 */ s16 unk8[8]; }; struct Z2FxLineConfig { - /* 0x00 */ u8 field_0x0; - /* 0x01 */ u8 field_0x1; - /* 0x02 */ u8 field_0x2; - /* 0x03 */ u8 field_0x3; - /* 0x04 */ s16 field_0x4; - /* 0x06 */ s16 field_0x6; - /* 0x08 */ s16 field_0x8[8]; - /* 0x18 */ u8 field_0x18; - /* 0x19 */ u8 field_0x19; - /* 0x1A */ u8 field_0x1a; - /* 0x1B */ u8 field_0x1b; - /* 0x1C */ s16 field_0x1c; - /* 0x1E */ s16 field_0x1e; - /* 0x20 */ s16 field_0x20[8]; + /* 0x00 */ Z2FxLineConfigSingle unk0; + /* 0x18 */ Z2FxLineConfigSingle unk18; }; // Size: 0x30 +class Z2FxLineEditNode : public JAHFrameNode { +public: + class LineStereo : public JAHFrameNode { + public: + LineStereo(bool dolby) : JAHFrameNode(NULL) { + unk70.unk0.unk0 = 1; + unk70.unk0.unk1 = 0; + unk70.unk0.unk4 = 0x6000; + unk70.unk0.unk2 = 1; + unk70.unk0.unk6 = 0; + unk70.unk0.unk3 = 0x40; + unk70.unk0.unk8[0] = 0; + unk70.unk0.unk8[1] = 0; + unk70.unk0.unk8[2] = 0; + unk70.unk0.unk8[3] = 0; + unk70.unk0.unk8[4] = 0; + unk70.unk0.unk8[5] = 0; + unk70.unk0.unk8[6] = 0x3fff; + unk70.unk0.unk8[7] = 0; + + unk70.unk18.unk0 = 1; + unk70.unk18.unk1 = 0; + unk70.unk18.unk4 = 0; + unk70.unk18.unk2 = 1; + unk70.unk18.unk6 = 0x6000; + unk70.unk18.unk3 = 0x40; + unk70.unk18.unk8[0] = 0; + unk70.unk18.unk8[1] = 0; + unk70.unk18.unk8[2] = 0; + unk70.unk18.unk8[3] = 0; + unk70.unk18.unk8[4] = 0; + unk70.unk18.unk8[5] = 0; + unk70.unk18.unk8[6] = 0x3fff; + unk70.unk18.unk8[7] = 0; + + if (dolby) + setNodeName("Dolby Stereo"); + else + setNodeName("Norma Stereo"); + mIsDolby = dolby; + } + + void message(JAHControl&); + void propertyEvent(JAH_P_Event, u32); + void lineEditSingle(Z2FxLineConfigSingle*, JAHControl&); + + /* 0x70 */ Z2FxLineConfig unk70; + /* 0xA0 */ bool mIsDolby; + }; + + Z2FxLineEditNode(JKRExpHeap*); + + void message(JAHControl&); + void syncSetting(u8, JASDsp::FxlineConfig_*); + void update(bool); + void saveLine(LineStereo*); + void loadLine(LineStereo*); + + /* 0x70 */ JKRExpHeap* mHeap; + /* 0x74 */ LineStereo* unk74; + /* 0x78 */ LineStereo* unk78; +}; + struct Z2FxLineMgr : public JASGlobalInstance { Z2FxLineMgr(); void initDataArc(JKRArchive* arc, JKRHeap* heap); @@ -39,6 +96,8 @@ struct Z2FxLineMgr : public JASGlobalInstance { void setUnderWaterFx(bool isUnderWaterFx); void setSceneFx(s32 sceneNo); + void setHIOEdit(Z2FxLineEditNode* hioEdit) { mHIOEdit = hioEdit; } + /* 0x00 */ Z2FxLineConfig* mConfig; /* 0x04 */ void* mFxLineBuffer[4]; /* 0x14 */ s8 mLineID; diff --git a/include/Z2AudioLib/Z2SceneMgr.h b/include/Z2AudioLib/Z2SceneMgr.h index c1e6402aca..1b3ef2cc0b 100644 --- a/include/Z2AudioLib/Z2SceneMgr.h +++ b/include/Z2AudioLib/Z2SceneMgr.h @@ -14,8 +14,8 @@ public: void setFadeOutStart(u8 fadeType); void setFadeInStart(u8 fadeType); void setSceneName(char* spot, s32 room, s32 layer); - void sceneChange(JAISoundID bgm, u8 seWave1, u8 seWave2, u8 bgmWave1, u8 bgmWave2, - u8 demoWave, bool); + void sceneChange(JAISoundID bgm, u8 seWave1, u8 seWave2, u8 bgmWave1, u8 bgmWave2, u8 demoWave, + bool); void framework(); void load1stDynamicWave(); void _load1stWaveInner_1(); @@ -31,9 +31,9 @@ public: bool loadSeWave(u32 wave); bool loadBgmWave(u32 wave); - #if PLATFORM_SHIELD +#if PLATFORM_SHIELD bool loadSceneWave(u32 wave, u32 bank); - #endif +#endif bool isSceneExist() { return sceneExist; } int getCurrentSceneNum() { return sceneNum; } diff --git a/include/Z2AudioLib/Z2SpeechMgr2.h b/include/Z2AudioLib/Z2SpeechMgr2.h index f0ab336165..5360a6c34b 100644 --- a/include/Z2AudioLib/Z2SpeechMgr2.h +++ b/include/Z2AudioLib/Z2SpeechMgr2.h @@ -30,6 +30,9 @@ struct Z2SpeechMgr2 : public JASGlobalInstance { void playOneShotVoice(u8, u16, Vec*, s8); bool isMidnaSpeak(); + u16* getStylePtr() { return &mMood; } + u8* getTalkerPtr() { return &mVoice; } + /* 0x000 */ JAISoundHandle field_0x0; /* 0x004 */ JAISoundHandle field_0x4; /* 0x008 */ JMath::TRandom_ random; diff --git a/include/global.h b/include/global.h index a8c2b0e07e..a404487b22 100644 --- a/include/global.h +++ b/include/global.h @@ -152,6 +152,7 @@ static const float INF = 2000000000.0f; #ifdef __MWERKS__ #define MULTI_CHAR(x) (x) #else +#if __cplusplus template inline constexpr unsigned long long MultiCharLiteral(const char (&buf)[N]) { static_assert(N - 1 >= 3 && N - 1 <= 10, "MULTI_CHAR literal must be 1-8 characters"); @@ -163,6 +164,7 @@ static const float INF = 2000000000.0f; } #define MULTI_CHAR(x) MultiCharLiteral(#x) #endif +#endif // potential fakematch? #if DEBUG @@ -172,9 +174,11 @@ static const float INF = 2000000000.0f; #endif #ifndef __MWERKS__ +#if __cplusplus #include using std::isnan; #endif +#endif // Comparing a non-volatile reference type to NULL is tautological // and triggers a warning on modern compilers, but in some cases is diff --git a/libs/JSystem/include/JSystem/JAHNodeLib/JAHSoundPlayerNode.h b/libs/JSystem/include/JSystem/JAHNodeLib/JAHSoundPlayerNode.h index 625b2b9a1c..da603b6d38 100644 --- a/libs/JSystem/include/JSystem/JAHNodeLib/JAHSoundPlayerNode.h +++ b/libs/JSystem/include/JSystem/JAHNodeLib/JAHSoundPlayerNode.h @@ -2,10 +2,43 @@ #define JAHSOUNDPLAYERNODE_H #include "JSystem/JAHostIO/JAHFrameNode.h" +#include "JSystem/JAHostIO/JAHUAsnData.h" +#include "JSystem/JAHostIO/JAHUTableEdit.h" + +class JAHPlayBox : public JAHUSeBox { +public: + JAHPlayBox(); + + virtual void onCurrentNodeFrame(); + +public: + /* 0x85 */ u8 unk85; +}; class JAHSoundPlayerNode : public JAHFrameNode { public: JAHSoundPlayerNode(); + + virtual void message(JAHControl&); + virtual void onCurrentNodeFrame(); + + u8 getContMode() const; + +public: + /* 0x70 */ s32 unk70; + /* 0x74 */ s32 unk74; + /* 0x78 */ s32 unk78; + /* 0x7C */ u8 unk7C; + /* 0x7D */ u8 unk7D; + /* 0x7E */ u8 unk7E; + /* 0x7F */ u8 unk7F; + /* 0x80 */ s32 unk80; + /* 0x84 */ s32 unk84; + /* 0x88 */ s64 unk88; + /* 0x90 */ s64 unk90; + /* 0x98 */ JAHPlayBox unk98; + /* 0x120 */ bool unk120; + /* 0x122 */ JAHUAsn unk122; }; #endif /* JAHSOUNDPLAYERNODE_H */ diff --git a/libs/JSystem/include/JSystem/JAHostIO/JAHFrameNode.h b/libs/JSystem/include/JSystem/JAHostIO/JAHFrameNode.h index 1b4ad74043..991dff94d2 100644 --- a/libs/JSystem/include/JSystem/JAHostIO/JAHFrameNode.h +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHFrameNode.h @@ -9,17 +9,19 @@ class JAHVirtualNode; class JAHFrameNode : public JAHioNode { public: JAHFrameNode(const char*); - /* vt[07] */ virtual ~JAHFrameNode(); /* vt[02] */ virtual void listenPropertyEvent(const JORPropertyEvent*); /* vt[05] */ virtual void genMessage(JORMContext*); /* vt[06] */ virtual void listenNodeEvent(const JORNodeEvent*); - /* vt[0C] */ virtual s32 getNodeType(); + /* vt[0C] */ virtual s32 getNodeType() { return 1; } /* vt[11] */ virtual void onCurrentNodeFrame(); /* vt[12] */ virtual void onFrame(); void framework(); void currentFramework(); + void callAllVirtualMessages(JAHControl&); + void appendVirNode(JAHVirtualNode*); + JSULink* getFrameNodeLink() { return &mFrameNodeLink; } /* 0x44 */ JSUTree mTree; diff --git a/libs/JSystem/include/JSystem/JAHostIO/JAHPubDefine.h b/libs/JSystem/include/JSystem/JAHostIO/JAHPubDefine.h index b67d462bc5..7e2f238582 100644 --- a/libs/JSystem/include/JSystem/JAHostIO/JAHPubDefine.h +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHPubDefine.h @@ -3,18 +3,22 @@ #include "JSystem/JUtility/JUTAssert.h" -template +template class JAHSingletonBase { public: JAHSingletonBase() { sInstance = (T*)this; } virtual ~JAHSingletonBase() { sInstance = NULL; } static T* newInstance() { + // clang-format off JUT_ASSERT(82, sInstance==NULL); + // clang-format on if (!sInstance) { sInstance = new T(); } + // clang-format off JUT_ASSERT(85, sInstance!=NULL); + // clang-format on return sInstance; } diff --git a/libs/JSystem/include/JSystem/JAHostIO/JAHUAsnData.h b/libs/JSystem/include/JSystem/JAHostIO/JAHUAsnData.h new file mode 100644 index 0000000000..a1aaeedf33 --- /dev/null +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHUAsnData.h @@ -0,0 +1,40 @@ +#ifndef JAHUASNNDATA_H +#define JAHUASNNDATA_H + +#include "types.h" + +class JORReflexible; +class JAHControl; + +class JAHUAsn { +public: + JAHUAsn(u16 param_1) : unk0(param_1) {} + + u8 getAttribute(u32); + u16 getSubNum(s32, s32); + u16 getDataNum(s32, s32, s32); + const char* getName(s32, s32, s32, s32); + u32 getDataId(s32, s32, s32, s32); + u8 getCategory(u32); + u8 getSub(u32); + u16 getDataPerCat(u32); + u16 getDataPerSub(u32); + u32 getNextId(u32, bool); + + void createComboBoxCategory(JAHControl&); + void createComboBoxSub(JAHControl&, s32, s32); + void createComboBoxData(JAHControl&, s32, s32, s32); + void checkAndUpdateNameBox(s32*, s32*, s32*, s32*, s32, s32, s32, JORReflexible*); + void updateNameBoxAll(s32*, s32*, s32*, s32*, JORReflexible*); + +private: + void __updateNameBoxCategory(s32*, JORReflexible*); + void __updateNameBoxSub(s32, s32, s32*, JORReflexible*); + void __updateNameBoxData(s32, s32, s32, s32*, JORReflexible*); + u32 __GetSubNo(s32); + u32 __GetDataNo(s32); + + /* 0x0 */ u16 unk0; +}; + +#endif /* JAHUASNNDATA_H */ diff --git a/libs/JSystem/include/JSystem/JAHostIO/JAHUGlobal.h b/libs/JSystem/include/JSystem/JAHostIO/JAHUGlobal.h new file mode 100644 index 0000000000..451787cb46 --- /dev/null +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHUGlobal.h @@ -0,0 +1,30 @@ +#ifndef JAHUGLOBAL_H +#define JAHUGLOBAL_H + +#include +#include "JSystem/JHostIO/JORServer.h" +#include "JSystem/JUtility/JUTAssert.h" + +inline void JAHUDialog_CatComment(char* param_1, const char* param_2, const char* param_3) { + if (param_3) { + std::strcpy(param_1, param_3); + std::strcat(param_1, "\n\n"); + } + std::strcat(param_1, param_2); +} + +inline void JAHUDialog_OK(const char* mes, const char* param_2, const char* param_3) { + char buffer[128]; + if (param_3) { + JAHUDialog_CatComment(buffer, mes, param_3); + } else { + // clang-format off + JUT_ASSERT(144, std::strlen(mes)<128-1) + // clang-format on + std::strcpy(buffer, mes); + } + + JORMessageBox(buffer, param_2, 0x30); +} + +#endif /* JAHUGLOBAL_H */ diff --git a/libs/JSystem/include/JSystem/JAHostIO/JAHUTableEdit.h b/libs/JSystem/include/JSystem/JAHostIO/JAHUTableEdit.h index ba8498c5bc..6f0dd9d556 100644 --- a/libs/JSystem/include/JSystem/JAHostIO/JAHUTableEdit.h +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHUTableEdit.h @@ -2,10 +2,47 @@ #define JAHUTABLEDIT_H #include "JSystem/JAHostIO/JAHVirtualNode.h" +#include "JSystem/JAudio2/JAISound.h" + +class JAHUAsn; class JAHUSeBox : public JAHVirtualNode { public: - JAHUSeBox(); + JAHUSeBox(u32, u32*); + + virtual void message(JAHControl&); + virtual void onCurrentNodeFrame(); + virtual void propertyEvent(JAH_P_Event, u32); + virtual void nodeEvent(JAH_N_Event); + virtual void trigPlayButton(); + virtual void trigStopButton(); + virtual void soundPlay(); + virtual void soundStop(); + + u8 checkNameSetChange(); + void updateNameSet(JORReflexible*); + void setId(u32, bool, JORReflexible*); + u32 getId() const { return unk58; } + +public: + /* 0x40 */ JAISoundHandle unk40; + /* 0x44 */ JAISoundHandle unk44; + /* 0x48 */ bool unk48; + /* 0x4C */ u32 unk4C; + /* 0x50 */ u32 unk50; + /* 0x54 */ u32 unk54; + /* 0x58 */ u32 unk58; + /* 0x5C */ u32* unk5C; + /* 0x60 */ JAHUAsn* mAsnCalc; + /* 0x64 */ s32 unk64; + /* 0x68 */ s32 unk68; + /* 0x6C */ s32 unk6C; + /* 0x70 */ s32 unk70; + /* 0x74 */ s32 unk74; + /* 0x78 */ s32 unk78; + /* 0x7C */ s32 unk7C; + /* 0x80 */ s32 unk80; + /* 0x84 */ bool unk84; }; #endif /* JAHUTABLEDIT_H */ diff --git a/libs/JSystem/include/JSystem/JAHostIO/JAHUpdate.h b/libs/JSystem/include/JSystem/JAHostIO/JAHUpdate.h new file mode 100644 index 0000000000..84efd7e539 --- /dev/null +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHUpdate.h @@ -0,0 +1,57 @@ +#ifndef JAHUPDATE_H +#define JAHUPDATE_H + +#include "JSystem/JAHostIO/JAHioNode.h" +#include "JSystem/JHostIO/JORMContext.h" +#include "JSystem/JHostIO/JORServer.h" +#include "types.h" + +namespace JAHUpdate { + +extern JAHioNode* spNode; +extern JORMContext* spMc; + +inline void startUpdateNode(JAHioNode* param_1) { + spMc = attachJORMContext(8); + spNode = param_1; + spMc->startUpdateNode(spNode); +} + +inline void endUpdateNode() { + spMc->endUpdateNode(); + releaseJORMContext(spMc); + spMc = NULL; + spNode = NULL; +} + +inline void buttonOn(JAHioNode* param_1, u32 param_2) { + bool b = false; + if (spMc != NULL) + b = true; + + if (!b) + startUpdateNode(param_1); + + spMc->updateButton(1, param_2, 0); + + if (!b) + endUpdateNode(); +} + +inline void buttonOff(JAHioNode* param_1, u32 param_2) { + bool b = false; + if (spMc != NULL) + b = true; + + if (!b) + startUpdateNode(param_1); + + spMc->updateButton(1, param_2, 0x40000000); + + if (!b) + endUpdateNode(); +} + +} // namespace JAHUpdate + +#endif /* JAHUPDATE_H */ diff --git a/libs/JSystem/include/JSystem/JAHostIO/JAHVirtualNode.h b/libs/JSystem/include/JSystem/JAHostIO/JAHVirtualNode.h index 50cdbc8725..d8ce63037a 100644 --- a/libs/JSystem/include/JSystem/JAHostIO/JAHVirtualNode.h +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHVirtualNode.h @@ -8,13 +8,28 @@ class JAHControl; class JAHVirtualNode { public: - JAHVirtualNode(); + JAHVirtualNode(const char*); + virtual void updateNode(); - virtual void message(JAHControl&); + virtual void message(JAHControl&) {} virtual void onFrame(); virtual void onCurrentNodeFrame(); virtual void propertyEvent(JAH_P_Event, u32); virtual void nodeEvent(JAH_N_Event); + virtual void virtualMessage(JAHControl&); + + void callAllVirtualMessages(JAHControl&); + JAHioNode* getMaster(); + void framework(); + void currentFramework(); + void listenVirtualPropertyEvent(JAH_P_Event, u32); + void listenVirtualNodeEvent(JAH_N_Event); + void setVirNodeName(const char*); + + JSUTree* getVirTree() { return &mTree; } + static u32 getVirNodeNum() { return smVirNodeNum; } + + static u32 smVirNodeNum; /* 0x04 */ JSUTree mTree; /* 0x20 */ char mName[32]; diff --git a/libs/JSystem/include/JSystem/JAHostIO/JAHioMessage.h b/libs/JSystem/include/JSystem/JAHostIO/JAHioMessage.h index 558882bfa3..5a323dacd0 100644 --- a/libs/JSystem/include/JSystem/JAHostIO/JAHioMessage.h +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHioMessage.h @@ -1,22 +1,42 @@ #ifndef JAHIOMESSAGE_H #define JAHIOMESSAGE_H +#include #include class JAHioNode; class JORMContext; +class JAHControl; class JAHControl { public: JAHControl(JORMContext*, JAHioNode*); void returnY(u16); void indent(s8); - void makeComment(const char*, u32, u8, u32); + void makeComment(const char*, u32, u8, u32); + void makeButtonL(const char*, u32, u16, u32); + void makeCommentL(const char*, u32, u16, u32); + void endComboBox(); + void startComboBoxL(const char*, s32*, u16, u16, u32); + void makeSlider(const char*, s32*, s32, s32, u32); + void makeSlider(const char*, s16*, s16, s16, u32); + void makeSlider(const char*, f32*, f32, f32, u32); + void makeButton(const char*, u32, u8, u32); + void endRadioButton(); + void makeRadioButtonItem(const char*, u8); + void startRadioButton(const char*, u8*, u8, u32); + void makeCheckBox(const char*, u8*, u8, bool, u32); + void makeSlider(const char*, u8*, u8, u8, u32); + void makeComboBoxItem(const char*, u8); + void makeComboBoxItem(const char*, s32); + void startComboBox(const char*, u8*, u8, u32); + + static u16 getComboWidth(u8 itemNo) { return smComboWidth[itemNo]; } static u16 getLineHeight() { return smLineHeight; } - static u16 getContWidth() { return smContWidth; } - static u16 getIntervalX() { return smIntX; } - static u16 getNameWidth() { return smNameWidth; } + static u32 getContWidth() { return smContWidth; } + static u32 getIntervalX() { return smIntX; } + static u32 getNameWidth() { return smNameWidth; } static u16 smButtonWidth[]; static u16 smCommentWidth[]; @@ -34,9 +54,7 @@ public: u16 getY() { return mY; } JORMContext* getContext() { return mContext; } - void tabX(u16 param_1) { - mX += param_1 + smIntX; - } + void tabX(u16 param_1) { mX += smIntX + param_1; } void returnYDirectSize(u16 param_1) { mY += param_1; mX = smXLeft + field_0x4 * smIndentSize; @@ -49,4 +67,164 @@ public: /* 0x0C */ JAHioNode* mNode; }; +// There's a funky dependency loop between JAHControl and JAHContTemplate, which must be resolved +// THIS way, as makeSlider etc functions must be defined NOT out-of-line for their string literal +// symbols to get the correct mangling. + +class JAHContTemplate { +public: + template + static void startComboBox(JAHControl* param_1, const char* param_2, T* param_3, u16 param_4, + u16 param_5, u32 param_6) { + if (param_2) { + param_1->getContext()->genLabel(param_2, 0, param_6, NULL, param_1->getX(), + param_1->getY(), param_4, param_1->getLineHeight()); + param_1->tabX(param_4); + } + + param_1->getContext()->startComboBox(param_2, param_3, param_6, NULL, param_1->getX(), + param_1->getY() - 7, param_5, + param_1->getLineHeight()); + param_1->tabX(param_5); + } + + template + static void makeSlider(JAHControl* param_1, const char* param_2, T* param_3, T param_4, + T param_5, u32 param_6) { + if (param_2) { + param_1->getContext()->genLabel(param_2, 0, param_6, NULL, param_1->getX(), + param_1->getY(), param_1->getNameWidth(), + param_1->getLineHeight()); + } + + param_1->getContext()->genSlider( + "---", param_3, param_4, param_5, param_6, NULL, + (u32)param_1->getX() + param_1->getNameWidth() + param_1->getIntervalX(), + param_1->getY() - 3, param_1->getContWidth(), param_1->getLineHeight()); + param_1->returnY(1); + } + + template + static void startRadioButton(JAHControl* param_1, const char* param_2, T* param_3, T param_4, + u32 param_5) { + if (param_2) { + param_1->getContext()->genLabel(param_2, 0, param_5, NULL, param_1->getX(), + param_1->getY(), param_1->getNameWidth() + 48, + param_1->getLineHeight()); + } + param_1->getContext()->startRadioButton( + param_2, param_3, param_5, NULL, + (u32)param_1->getX() + param_1->getNameWidth() + param_1->getIntervalX() + 48, + param_1->getY(), param_1->getContWidth() + 250, param_4 * 18); + + param_1->returnYDirectSize(param_4 * 18); + } + + template + static void makeCheckBox(JAHControl* param_1, const char* param_2, T* param_3, T param_4, + bool param_5, u32 param_6) { + if (!param_5) { + param_1->getContext()->genCheckBox(param_2, param_3, param_4, param_6, NULL, + param_1->getX(), param_1->getY(), 1000, + param_1->getLineHeight()); + } else { + param_1->getContext()->genCheckBox(param_2, param_3, param_4, param_6, NULL, + param_1->getX() + param_1->getNameWidth() + + param_1->getIntervalX() + 52, + param_1->getY(), 1000, param_1->getLineHeight()); + } + param_1->returnY(1); + } + + template + static void startComboBox(JAHControl* param_1, const char* param_2, T* param_3, T param_4, + u32 param_5) { + if (param_2) { + param_1->getContext()->genLabel(param_2, 0, param_5, NULL, param_1->getX(), + param_1->getY(), param_1->getNameWidth() + 48, + param_1->getLineHeight()); + } + + param_1->getContext()->startComboBox( + param_2, param_3, param_5, NULL, + param_1->getX() + param_1->getNameWidth() + param_1->getIntervalX() + 48, + param_1->getY() - 7, param_1->getComboWidth(param_4), param_1->getLineHeight()); + } +}; + +inline void JAHControl::makeButtonL(const char* param_1, u32 param_2, u16 param_3, u32 param_4) { + mContext->genButton(param_1, param_2, param_4, NULL, mX, mY - 5, param_3, smLineHeight); + tabX(param_3); +} + +inline void JAHControl::makeCommentL(const char* param_1, u32 param_2, u16 param_3, u32 param_4) { + mContext->genLabel(param_1, param_2, param_4, NULL, mX, mY, param_3, smLineHeight); + tabX(param_3); +} + +inline void JAHControl::endComboBox() { + mContext->endComboBox(); +} + +inline void JAHControl::startComboBoxL(const char* param_1, s32* param_2, u16 param_3, u16 param_4, + u32 param_5) { + JAHContTemplate::startComboBox(this, param_1, param_2, param_3, param_4, param_5); +} + +inline void JAHControl::makeSlider(const char* param_1, s32* param_2, s32 param_3, s32 param_4, + u32 param_5) { + JAHContTemplate::makeSlider(this, param_1, param_2, param_3, param_4, param_5); +} + +inline void JAHControl::makeSlider(const char* param_1, s16* param_2, s16 param_3, s16 param_4, + u32 param_5) { + JAHContTemplate::makeSlider(this, param_1, param_2, param_3, param_4, param_5); +} + +inline void JAHControl::makeSlider(const char* param_1, f32* param_2, f32 param_3, f32 param_4, + u32 param_5) { + JAHContTemplate::makeSlider(this, param_1, param_2, param_3, param_4, param_5); +} + +inline void JAHControl::makeSlider(const char* param_1, u8* param_2, u8 param_3, u8 param_4, + u32 param_5) { + JAHContTemplate::makeSlider(this, param_1, param_2, param_3, param_4, param_5); +} + +inline void JAHControl::makeButton(const char* param_1, u32 param_2, u8 param_3, u32 param_4) { + mContext->genButton(param_1, param_2, param_4, NULL, mX, mY - 5, smButtonWidth[param_3], + smLineHeight); + returnY(1); +} + +inline void JAHControl::endRadioButton() { + mContext->endRadioButton(); +} + +inline void JAHControl::makeRadioButtonItem(const char* param_1, u8 param_2) { + mContext->genRadioButtonItem(param_1, param_2, 0, -1, -1, 128, 16); +} + +inline void JAHControl::startRadioButton(const char* param_1, u8* param_2, u8 param_3, + u32 param_4) { + JAHContTemplate::startRadioButton(this, param_1, param_2, param_3, param_4); +} + +inline void JAHControl::makeCheckBox(const char* param_1, u8* param_2, u8 param_3, bool param_4, + u32 param_5) { + JAHContTemplate::makeCheckBox(this, param_1, param_2, param_3, param_4, param_5); +} + +inline void JAHControl::makeComboBoxItem(const char* label, u8 itemNo) { + makeComboBoxItem(label, (s32)itemNo); +} + +inline void JAHControl::makeComboBoxItem(const char* label, s32 itemNo) { + mContext->genComboBoxItem(label, itemNo); +} + +inline void JAHControl::startComboBox(const char* label, u8* param_2, u8 param_3, u32 param_4) { + JAHContTemplate::startComboBox(this, label, param_2, param_3, param_4); +} + #endif /* JAHIOMESSAGE_H */ diff --git a/libs/JSystem/include/JSystem/JAudio2/JASDSPInterface.h b/libs/JSystem/include/JSystem/JAudio2/JASDSPInterface.h index a653431bee..44f2805bfe 100644 --- a/libs/JSystem/include/JSystem/JAudio2/JASDSPInterface.h +++ b/libs/JSystem/include/JSystem/JAudio2/JASDSPInterface.h @@ -1,6 +1,7 @@ #ifndef JASDSPINTERFACE_H #define JASDSPINTERFACE_H +#include #include struct JASWaveInfo; diff --git a/libs/JSystem/include/JSystem/JAudio2/JAUSoundTable.h b/libs/JSystem/include/JSystem/JAudio2/JAUSoundTable.h index e2dceca7b1..b85744ff94 100644 --- a/libs/JSystem/include/JSystem/JAudio2/JAUSoundTable.h +++ b/libs/JSystem/include/JSystem/JAudio2/JAUSoundTable.h @@ -192,7 +192,11 @@ struct JAUSoundNameTable : public JASGlobalInstance { JAUSoundNameTable(bool param_0) : JASGlobalInstance(param_0) { } ~JAUSoundNameTable() {} + int getNumGroups_inSection(u8) const; + int getNumItems_inGroup(u8, u8) const; void init(void const*); + const char* getName(JAISoundID) const; + const char* getGroupName(JAISoundID) const; JAUSoundTable_ field_0x0; }; diff --git a/libs/JSystem/include/JSystem/JHostIO/JOREvent.h b/libs/JSystem/include/JSystem/JHostIO/JOREvent.h new file mode 100644 index 0000000000..14d7b2fa52 --- /dev/null +++ b/libs/JSystem/include/JSystem/JHostIO/JOREvent.h @@ -0,0 +1,36 @@ +#ifndef JOREVENT_H +#define JOREVENT_H + +#include "types.h" + +class JORReflexible; + +struct JOREvent {}; + +struct JORPropertyEvent : JOREvent { + enum EKind { + EKind_HasListener = (1 << 30), + EKind_ValueID = (1 << 29), + EKind_FloatValue = (1 << 9), + }; + + /* 0x00 */ u8 field_0x0[0x4 - 0x0]; + /* 0x04 */ u32 type; + /* 0x08 */ u32 kind; + /* 0x0C */ char* id; // id? + /* 0x10 */ JORReflexible* field_0x10; // ? + /* 0x14 */ u32 field_0x14; + union { + u32 U32; + u16 U16[2]; + } + /* 0x18 */ field_0x18; +}; + +struct JORGenEvent : JOREvent {}; + +struct JORNodeEvent : JOREvent { + /* 0x00 */ u32 field_0x0; +}; + +#endif /* JOREVENT_H */ diff --git a/libs/JSystem/include/JSystem/JHostIO/JORFile.h b/libs/JSystem/include/JSystem/JHostIO/JORFile.h index cd2f048c48..e2123d8f4a 100644 --- a/libs/JSystem/include/JSystem/JHostIO/JORFile.h +++ b/libs/JSystem/include/JSystem/JHostIO/JORFile.h @@ -18,7 +18,7 @@ public: /* 0x08 */ u32 m_fileAttribute; /* 0x0C */ u32 m_lowDateTime; /* 0x10 */ u32 m_highDateTime; - /* 0x14 */ char* m_filename; + /* 0x14 */ char m_filename[]; }; class JORFile { diff --git a/libs/JSystem/include/JSystem/JHostIO/JORMContext.h b/libs/JSystem/include/JSystem/JHostIO/JORMContext.h index b06adad45b..a9676ec3d1 100644 --- a/libs/JSystem/include/JSystem/JHostIO/JORMContext.h +++ b/libs/JSystem/include/JSystem/JHostIO/JORMContext.h @@ -7,7 +7,7 @@ #include #endif #include -#include "JSystem/JHostIO/JORReflexible.h" +#include "JSystem/JHostIO/JOREvent.h" #include "JSystem/JSupport/JSUMemoryStream.h" #define MCTX_MSG_RESET 0 @@ -194,9 +194,7 @@ public: void startUpdateNode(JORReflexible* obj) { putNode(obj); } void genNodeSub(const char* label, JORReflexible* i_node, u32, u32); - void putNode(JORReflexible* obj) { - mOutputStream << (uintptr_t)obj; - } + void putNode(JORReflexible* obj) { mOutputStream << (uintptr_t)obj; } void invalidNode(JORReflexible* i_node, u32); void genControl(u32 type, u32 kind, const char* label, u32 style, u32 id, @@ -221,6 +219,10 @@ public: u16 posX = -1, u16 posY = -1, u16 width = JORM_DEFAULT_WIDTH, u16 height = JORM_DEFAULT_HEIGHT); + void updateButton(u32 param_1, u32 param_2, u32 param_3) { + updateControl(param_1, param_2, param_3); + } + void genLabel(const char* label, u32 id, u32 style = 0, JOREventListener* pListener = NULL, u16 posX = -1, u16 posY = -1, u16 width = JORM_DEFAULT_WIDTH, u16 height = JORM_DEFAULT_HEIGHT); @@ -270,6 +272,7 @@ public: DEFINE_START_COMBO_BOX_ID(s32, JORPropertyEvent::EKind_ValueID) DEFINE_UPDATE_COMBO_BOX(u8) + DEFINE_UPDATE_COMBO_BOX(s32) DEFINE_UPDATE_COMBO_BOX_ID(s32) @@ -279,6 +282,16 @@ public: genSelectorItemSub(label, itemNo, 0, 0, 0, 0, 0); } + void editComboBoxItem(u32 param_0, u32 param_1, const char* param_2, s32 param_3, u32 param_4); + + void addComboBoxItem(u32 param_1, s32* param_2, const char* param_3, s32 param_4, u32 param_5) { + editComboBoxItem(param_1, (uintptr_t)param_2, param_3, param_4, param_5); + } + + void removeComboBoxItem(u32 param_1, s32* param_2, u32 param_3) { + editComboBoxItem(param_1, (uintptr_t)param_2, NULL, 0, param_3); + } + /** * === RADIO BUTTON === */ @@ -313,8 +326,6 @@ public: updateSelectorSub(mode, (uintptr_t)pSrc, *pSrc, param_3); } - void editComboBoxItem(u32 param_0, u32 param_1, const char* param_2, s32 param_3, u32 param_4); - void openMessageBox(void* param_0, u32 style, const char* message, const char* title); /* 0x00000 */ u8 mBuffer[0x10000]; diff --git a/libs/JSystem/include/JSystem/JHostIO/JORReflexible.h b/libs/JSystem/include/JSystem/JHostIO/JORReflexible.h index 030c6fd9f9..4a142dee7e 100644 --- a/libs/JSystem/include/JSystem/JHostIO/JORReflexible.h +++ b/libs/JSystem/include/JSystem/JHostIO/JORReflexible.h @@ -2,36 +2,12 @@ #define JORREFLEXIBLE_H #include +#include "JSystem/JHostIO/JORServer.h" -class JORReflexible; - -struct JOREvent {}; - -struct JORPropertyEvent : JOREvent { - enum EKind { - EKind_HasListener = (1 << 30), - EKind_ValueID = (1 << 29), - EKind_FloatValue = (1 << 9), - }; - - /* 0x00 */ u8 field_0x0[0x4 - 0x0]; - /* 0x04 */ u32 type; - /* 0x08 */ u32 kind; - /* 0x0C */ char* id; // id? - /* 0x10 */ JORReflexible* field_0x10; // ? - /* 0x14 */ u32 field_0x14; - union { - u32 U32; - u16 U16[2]; - } - /* 0x18 */ field_0x18; -}; - -struct JORGenEvent : JOREvent {}; - -struct JORNodeEvent : JOREvent { - /* 0x00 */ u32 field_0x0; -}; +struct JOREvent; +struct JORPropertyEvent; +struct JORGenEvent; +struct JORNodeEvent; class JORMContext; class JORServer; @@ -48,8 +24,8 @@ class JORReflexible : public JOREventListener { public: #if DEBUG JORReflexible() {} - static JORServer* getJORServer(); - + static JORServer* getJORServer() { return JORServer::getInstance(); } + virtual void listenPropertyEvent(const JORPropertyEvent*); virtual void listen(u32, const JOREvent*); virtual void genObjectInfo(const JORGenEvent*); diff --git a/libs/JSystem/include/JSystem/JKernel/JKRArchive.h b/libs/JSystem/include/JSystem/JKernel/JKRArchive.h index 7402f50b13..fe8697fb5e 100644 --- a/libs/JSystem/include/JSystem/JKernel/JKRArchive.h +++ b/libs/JSystem/include/JSystem/JKernel/JKRArchive.h @@ -3,7 +3,6 @@ #include "JSystem/JKernel/JKRCompression.h" #include "JSystem/JKernel/JKRFileLoader.h" -#include "global.h" class JKRHeap; diff --git a/libs/JSystem/include/JSystem/JKernel/JKRHeap.h b/libs/JSystem/include/JSystem/JKernel/JKRHeap.h index 2c38aa1984..9528c7735e 100644 --- a/libs/JSystem/include/JSystem/JKernel/JKRHeap.h +++ b/libs/JSystem/include/JSystem/JKernel/JKRHeap.h @@ -74,7 +74,7 @@ public: bool setErrorFlag(bool errorFlag); bool isSubHeap(JKRHeap* heap) const; - void* getAltAramStartAdr(); + static void* getAltAramStartAdr(); /* vt[03] */ virtual void callAllDisposer(); /* vt[04] */ virtual u32 getHeapType() = 0; diff --git a/libs/JSystem/include/JSystem/JSupport/JSUInputStream.h b/libs/JSystem/include/JSystem/JSupport/JSUInputStream.h index afde440837..418cc8ea1b 100644 --- a/libs/JSystem/include/JSystem/JSupport/JSUInputStream.h +++ b/libs/JSystem/include/JSystem/JSupport/JSUInputStream.h @@ -4,9 +4,9 @@ #include "JSystem/JSupport/JSUIosBase.h" /** -* @ingroup jsystem-jsupport -* -*/ + * @ingroup jsystem-jsupport + * + */ class JSUInputStream : public JSUIosBase { public: JSUInputStream() {} @@ -89,17 +89,11 @@ public: return *this; } - s32 read(bool& val) { - return read(&val, sizeof(bool)); - } + s32 read(bool& val) { return read(&val, sizeof(bool)); } - s32 read(u8& val) { - return read(&val, sizeof(u8)); - } + s32 read(u8& val) { return read(&val, sizeof(u8)); } - s32 read(u32& param_0) { - return read(¶m_0, 4); - } + s32 read(u32& param_0) { return read(¶m_0, 4); } // TODO: return value probably wrong s32 read(void*, s32); @@ -108,9 +102,9 @@ public: // move? /** -* @ingroup jsystem-jsupport -* -*/ + * @ingroup jsystem-jsupport + * + */ template T* JSUConvertOffsetToPtr(const void*, const void*); diff --git a/libs/JSystem/include/JSystem/JSupport/JSUMemoryStream.h b/libs/JSystem/include/JSystem/JSupport/JSUMemoryStream.h index d5da78bfff..c79b2a3535 100644 --- a/libs/JSystem/include/JSystem/JSupport/JSUMemoryStream.h +++ b/libs/JSystem/include/JSystem/JSupport/JSUMemoryStream.h @@ -5,9 +5,9 @@ #include "JSystem/JSupport/JSURandomOutputStream.h" /** -* @ingroup jsystem-jsupport -* -*/ + * @ingroup jsystem-jsupport + * + */ class JSUMemoryInputStream : public JSURandomInputStream { public: JSUMemoryInputStream(const void* res, s32 size) { setBuffer(res, size); } @@ -19,9 +19,7 @@ public: s32 getLength() const; s32 getPosition() const; - void* getPointer() const { - return (u8*)mBuffer + mPosition; - } + void* getPointer() const { return (u8*)mBuffer + mPosition; } private: /* 0x08 */ const void* mBuffer; @@ -39,7 +37,7 @@ public: virtual ~JSUMemoryOutputStream() {} virtual s32 writeData(const void*, s32); virtual s32 getLength() const; - virtual s32 getPosition() const; + virtual s32 getPosition() const { return mPosition; } virtual s32 seek(s32, JSUStreamSeekFrom); virtual s32 getAvailable() const; virtual s32 seekPos(s32, JSUStreamSeekFrom); diff --git a/libs/JSystem/src/JAHNodeLib/JAHAudienceSettingNode.cpp b/libs/JSystem/src/JAHNodeLib/JAHAudienceSettingNode.cpp new file mode 100644 index 0000000000..236d5d198a --- /dev/null +++ b/libs/JSystem/src/JAHNodeLib/JAHAudienceSettingNode.cpp @@ -0,0 +1,5 @@ +#include + +void dummy(JAHControl* cont) { + cont->makeSlider(NULL, (f32*)NULL, (f32)0, (f32)0, 0); +} diff --git a/libs/JSystem/src/JAHNodeLib/JAHConductNode.cpp b/libs/JSystem/src/JAHNodeLib/JAHConductNode.cpp new file mode 100644 index 0000000000..6f461f0d88 --- /dev/null +++ b/libs/JSystem/src/JAHNodeLib/JAHConductNode.cpp @@ -0,0 +1,8 @@ +#include + +void dummy(JAHControl* cont, u16 s) { + cont->startRadioButton(NULL, (u8*)NULL, (u8)0, 0); + cont->makeRadioButtonItem(NULL, (u8)0); + cont->endRadioButton(); + cont->makeButton(NULL, 0, (u8)0, 0); +} diff --git a/libs/JSystem/src/JAHNodeLib/JAHIDSwapNode.cpp b/libs/JSystem/src/JAHNodeLib/JAHIDSwapNode.cpp new file mode 100644 index 0000000000..d5e5615f37 --- /dev/null +++ b/libs/JSystem/src/JAHNodeLib/JAHIDSwapNode.cpp @@ -0,0 +1,8 @@ +#include "JSystem/JAHostIO/JAHUTableEdit.h" +#include "JSystem/JAHostIO/JAHioMessage.h" + +static void dummy(JAHUSeBox* box, JAHControl* ctrl) { + box->getId(); + ctrl->makeCheckBox(NULL, (u8*)NULL, 0, false, 0); + box->~JAHUSeBox(); +} diff --git a/libs/JSystem/src/JAHNodeLib/JAHSoundPlayerNode.cpp b/libs/JSystem/src/JAHNodeLib/JAHSoundPlayerNode.cpp new file mode 100644 index 0000000000..cd3fa984eb --- /dev/null +++ b/libs/JSystem/src/JAHNodeLib/JAHSoundPlayerNode.cpp @@ -0,0 +1,149 @@ +#include "JSystem/JAHNodeLib/JAHSoundPlayerNode.h" +#include "JSystem/JAHostIO/JAHUpdate.h" +#include "JSystem/JAHostIO/JAHioMessage.h" +#include "JSystem/JAudio2/JAISoundStarter.h" + +void JAHPlayBox::onCurrentNodeFrame() { + JAHSoundPlayerNode* master = (JAHSoundPlayerNode*)getMaster(); + if (!master) + return; + u8 b = master->getContMode() & 2; + if (!b) { + JAHUSeBox::onCurrentNodeFrame(); + } else if (unk48 != unk85) { + if (unk48) { + JAHUpdate::buttonOff(getMaster(), unk4C); + JAHUpdate::buttonOn(getMaster(), unk50); + } else { + JAHUpdate::buttonOn(getMaster(), unk4C); + JAHUpdate::buttonOff(getMaster(), unk50); + } + } + + unk85 = unk48; +} + +u8 JAHSoundPlayerNode::getContMode() const { + return unk7C; +} + +JAHSoundPlayerNode::JAHSoundPlayerNode() : JAHFrameNode("SOUND PLAYER"), unk122(16) { + unk70 = 30; + unk74 = 60; + unk78 = 10; + unk7C = 0; + unk7D = 0; + unk7E = 1; + unk80 = 0; + unk84 = 0; + unk7F = 2; + unk120 = 0; + appendVirNode(&unk98); +} + +JAHPlayBox::JAHPlayBox() : JAHUSeBox(-1, NULL) { + unk85 = 0; +} + +void JAHSoundPlayerNode::message(JAHControl& param_1) { + param_1.returnY(1); + param_1.makeCheckBox("ID順に連続再生する", &unk7C, 2, false, 0); + param_1.returnY(1); + param_1.makeComment("--連続再生モード設定--", 0, 5, 0); + param_1.indent(1); + param_1.makeSlider("最大再生時間(1=0.1sec)", &unk70, 0, 60000, 0); + param_1.makeSlider("空白時間(1=0.1sec)", &unk78, 0, 6000, 0); + param_1.returnY(1); + param_1.startRadioButton("ダミーデータの挙動", &unk7E, 2, 0); + param_1.makeRadioButtonItem("スキップする", 1); + param_1.makeRadioButtonItem("再生する", 0); + param_1.endRadioButton(); + param_1.startRadioButton("トリガーSEまたはBGM系の挙動", &unk7D, 2, 0); + param_1.makeRadioButtonItem("フル再生", 0); + param_1.makeRadioButtonItem("最大再生時間以上はフェードアウト", 1); + param_1.endRadioButton(); + param_1.returnY(1); + param_1.makeSlider("フェードアウト時間(単位:ゲームフレーム)", &unk74, 0, 3600, 0); +} + +void JAHSoundPlayerNode::onCurrentNodeFrame() { + if (!(unk7C & 2)) + return; + + u8 attr = unk122.getAttribute(unk98.getId()); + + switch (unk98.unk48) { + case true: + switch (unk7F) { + case 0: + if (!unk98.unk40) { + unk90 = OSGetTime(); + unk84 = 0; + unk7F = 2; + break; + } + + if (unk80 > unk70) { + unk84 = 0; + unk7F = 2; + } else { + JASGlobalInstance::getInstance()->startSound(unk98.getId(), + &unk98.unk40, NULL); + unk80 = OSTicksToMilliseconds(OSGetTime() - unk88) / 100; + } + + if (unk7D == 1) { + if (unk80 > unk70) { + unk98.unk40->stop(unk74); + unk84 = 0; + unk90 = OSGetTime(); + unk7F = 1; + } else { + unk80 = OSTicksToMilliseconds(OSGetTime() - unk88) / 100; + } + } + break; + + case 1: + if (!unk98.unk40) { + unk7F = 2; + unk90 = OSGetTime(); + } + break; + + case 2: + if (unk120) { + if (unk84 <= unk78) { + if (unk84 < 0) + JASGlobalInstance::getInstance()->startSound( + unk98.getId(), &unk98.unk40, NULL); + + unk84 = OSTicksToMilliseconds(OSGetTime() - unk90) / 100; + break; + } + + u32 id = unk122.getNextId(unk98.getId(), unk7E != 0 ? true : false); + unk98.setId(id, true, this); + } + + JASGlobalInstance::getInstance()->startSound(unk98.getId(), + &unk98.unk40, NULL); + unk7F = 0; + unk80 = 0; + unk88 = OSGetTime(); + unk84 = 0; + break; + } + break; + + case false: + if (unk120) { + unk80 = 0; + unk84 = 0; + unk7F = 2; + } + break; + } + + unk120 = unk98.unk48; +} diff --git a/libs/JSystem/src/JAHNodeLib/JAHViewerApp.cpp b/libs/JSystem/src/JAHNodeLib/JAHViewerApp.cpp new file mode 100644 index 0000000000..c8d56465c9 --- /dev/null +++ b/libs/JSystem/src/JAHNodeLib/JAHViewerApp.cpp @@ -0,0 +1,14 @@ + +#include "JSystem/JAHostIO/JAHioMessage.h" +#include "JSystem/JSupport/JSUMemoryStream.h" +#include "JSystem/JSupport/JSUOutputStream.h" + +static void dummy(JSUMemoryInputStream& in, JSUOutputStream& out, JAHControl& ctrl) { + out << s16(0); + s16 b; + in >> b; + ctrl.makeSlider("", (u8*)NULL, (u8)0, (u8)0, 0); + u16 a; + in >> a; + in.getPointer(); +} diff --git a/libs/JSystem/src/JAHNodeLib/JAHViewerSys.cpp b/libs/JSystem/src/JAHNodeLib/JAHViewerSys.cpp new file mode 100644 index 0000000000..6b14f74662 --- /dev/null +++ b/libs/JSystem/src/JAHNodeLib/JAHViewerSys.cpp @@ -0,0 +1,12 @@ +#include "JSystem/JAHostIO/JAHUGlobal.h" + +static void dummy(JSUInputStream& input) { + JSUMemoryOutputStream stream(NULL, 0); + stream.getPosition(); + stream << u8(0); + u8 b; + input >> b; + u32 a; + input >> a; + JAHUDialog_OK("", "", ""); +} diff --git a/libs/JSystem/src/JAHostIO/JAHFrameNode.cpp b/libs/JSystem/src/JAHostIO/JAHFrameNode.cpp new file mode 100644 index 0000000000..6b4d0d68fc --- /dev/null +++ b/libs/JSystem/src/JAHostIO/JAHFrameNode.cpp @@ -0,0 +1,93 @@ +#include +#include +#include +#include + +JAHFrameNode::JAHFrameNode(const char* name) + : JAHioNode(name), mTree((JAHVirtualNode*)this), mFrameNodeLink(this) {} + +void JAHFrameNode::genMessage(JORMContext* context) { + JAHControl control(context, this); + callAllVirtualMessages(control); + message(control); + if (JAHSingletonBase::getIns()->getNodeSysType() == 0) + generateTempChildren(context); + else + generateRealChildren(context); +} + +void JAHFrameNode::callAllVirtualMessages(JAHControl& control) { + if (mTree.getNumChildren() == 0) + return; + + for (JSUTreeIterator iter = mTree.getFirstChild(); iter != mTree.getEndChild(); + ++iter) + { + iter->message(control); + } +} + +void JAHFrameNode::appendVirNode(JAHVirtualNode* node) { + mTree.appendChild(node->getVirTree()); +} + +void JAHFrameNode::listenPropertyEvent(const JORPropertyEvent* event) { + for (JSUTreeIterator iter = mTree.getFirstChild(); iter != mTree.getEndChild(); + ++iter) + { + iter->listenVirtualPropertyEvent(JAH_P_EVENT0, (u32)event->id); + } + + JAHioNode::listenPropertyEvent(event); + + for (JSUTreeIterator iter = mTree.getFirstChild(); iter != mTree.getEndChild(); + ++iter) + { + iter->listenVirtualPropertyEvent(JAH_P_EVENT1, (u32)event->id); + } +} + +void JAHFrameNode::listenNodeEvent(const JORNodeEvent* event) { + JAHioNode::listenNodeEvent(event); + if (event->field_0x0 == 3) { + for (JSUTreeIterator iter = mTree.getFirstChild(); + iter != mTree.getEndChild(); ++iter) + iter->listenVirtualNodeEvent(JAH_N_EVENT0); + } else if (event->field_0x0 == 4) { + for (JSUTreeIterator iter = mTree.getFirstChild(); + iter != mTree.getEndChild(); ++iter) + iter->listenVirtualNodeEvent(JAH_N_EVENT1); + } else if (event->field_0x0 == 5) { + for (JSUTreeIterator iter = mTree.getFirstChild(); + iter != mTree.getEndChild(); ++iter) + iter->listenVirtualNodeEvent(JAH_N_EVENT2); + } +} + +void JAHFrameNode::framework() { + onFrame(); + if (mTree.getNumChildren() != 0) { + int i = 0; // unused? + for (JSUTreeIterator iter = mTree.getFirstChild(); + iter != mTree.getEndChild(); ++iter) + { + iter->framework(); + } + } +} + +void JAHFrameNode::onFrame() {} + +void JAHFrameNode::currentFramework() { + onCurrentNodeFrame(); + if (mTree.getNumChildren() != 0) { + int i = 0; // unused? + for (JSUTreeIterator iter = mTree.getFirstChild(); + iter != mTree.getEndChild(); ++iter) + { + iter->currentFramework(); + } + } +} + +void JAHFrameNode::onCurrentNodeFrame() {} diff --git a/libs/JSystem/src/JAHostIO/JAHUAsnData.cpp b/libs/JSystem/src/JAHostIO/JAHUAsnData.cpp new file mode 100644 index 0000000000..b4c4da98ce --- /dev/null +++ b/libs/JSystem/src/JAHostIO/JAHUAsnData.cpp @@ -0,0 +1,172 @@ +#include +#include "JSystem/JAHostIO/JAHioMessage.h" +#include "JSystem/JAudio2/JAUSoundTable.h" +#include "JSystem/JHostIO/JORServer.h" + +u8 JAHUAsn::getAttribute(u32 param_1) { + u8 a = (param_1 & 0x800) >> 11; + u8 b = (param_1 & 0xC0000000) >> 24; + return a | (b << 4); +} + +u16 JAHUAsn::getSubNum(s32 param_1, s32 param_2) { + JAUSoundNameTable* table = JASGlobalInstance::getInstance(); + int num = table->getNumItems_inGroup(param_1, param_2); + int uVar2 = (u16)(num / unk0); + if (num % unk0 > 0) + uVar2++; + return uVar2 <= 64 ? (u16)uVar2 : (u16)64; +} + +u16 JAHUAsn::getDataNum(s32 param_1, s32 param_2, s32 param_3) { + JAUSoundNameTable* table = JASGlobalInstance::getInstance(); + int uVar1 = getSubNum(param_1, param_2); + int iVar2 = table->getNumItems_inGroup(param_1, param_2); + + if (iVar2 == 0) + return 0; + + if (iVar2 % unk0 == 0) + return unk0; + + if (param_3 == uVar1 - 1) + return iVar2 % unk0; + + return unk0; +} + +const char* JAHUAsn::getName(s32 param_1, s32 param_2, s32 param_3, s32 param_4) { + JAUSoundNameTable* table = JASGlobalInstance::getInstance(); + return table->getName((param_1 << 24) + (param_2 << 16) + (param_4 + param_3 * unk0)); +} + +u32 JAHUAsn::getDataId(s32 param_1, s32 param_2, s32 param_3, s32 param_4) { + return (param_1 << 24) + (param_2 << 16) + (param_4 + param_3 * unk0); +} + +void JAHUAsn::createComboBoxCategory(JAHControl& control) { + int totalItems = 0; + + JAUSoundNameTable* table = JASGlobalInstance::getInstance(); + for (u32 i = 0; i < 3; ++i) { + for (u32 j = 0; j < table->getNumGroups_inSection(i); ++j) { + if (table->getNumItems_inGroup(i, j) > 0) { + const char* name = table->getGroupName((i << 24) + (j << 16)); + control.getContext()->genComboBoxItem(name, totalItems); + ++totalItems; + } + } + } +} + +void JAHUAsn::createComboBoxSub(JAHControl& control, s32 param_2, s32 param_3) { + int uVar1 = getSubNum(param_2, param_3); + for (int i = 0; i < uVar1; ++i) { + char buffer[4]; + sprintf(buffer, "%2x\0", i); + control.getContext()->genComboBoxItem(buffer, i); + } +} + +void JAHUAsn::createComboBoxData(JAHControl& control, s32 param_2, s32 param_3, s32 param_4) { + int uVar1 = getDataNum(param_2, param_3, param_4); + for (int i = 0; i < uVar1; ++i) { + const char* name = getName(param_2, param_3, param_4, i); + control.getContext()->genComboBoxItem(name, i); + } +} + +void JAHUAsn::checkAndUpdateNameBox(s32* param_1, s32* param_2, s32* param_3, s32* param_4, + s32 param_5, s32 param_6, s32 param_7, JORReflexible* param_8) { + if (*param_1 != param_5 || *param_2 != param_6 || *param_3 != param_7) { + if (*param_2 != param_6 || *param_1 != param_5) { + *param_3 = 0; + __updateNameBoxSub(*param_1, *param_2, param_3, param_8); + } + + if (*param_3 != param_7 || *param_2 != param_6 || *param_1 != param_5) { + *param_4 = 0; + __updateNameBoxData(*param_1, *param_2, *param_3, param_4, param_8); + } + } +} + +void JAHUAsn::updateNameBoxAll(s32* param_1, s32* param_2, s32* param_3, s32* param_4, + JORReflexible* param_5) { + __updateNameBoxCategory(param_2, param_5); + __updateNameBoxSub(*param_1, *param_2, param_3, param_5); + __updateNameBoxData(*param_1, *param_2, *param_3, param_4, param_5); +} + +void JAHUAsn::__updateNameBoxCategory(s32* param_1, JORReflexible* param_2) { + JORMContext* ctx = attachJORMContext(8); + ctx->startUpdateNode(param_2); + ctx->updateComboBox(2, param_1, 0); + ctx->endUpdateNode(); + releaseJORMContext(ctx); +} + +void JAHUAsn::__updateNameBoxSub(s32 param_1, s32 param_2, s32* param_3, JORReflexible* param_4) { + JORMContext* ctx = attachJORMContext(8); + ctx->startUpdateNode(param_4); + ctx->removeComboBoxItem(5, param_3, 0); + int num = getSubNum(param_1, param_2); + for (int i = 0; i < num; ++i) { + char buf[4]; + sprintf(buf, "%2x\0", i); + ctx->addComboBoxItem(1, param_3, buf, i, 0); + } + ctx->updateComboBox(2, param_3, 0); + ctx->endUpdateNode(); + releaseJORMContext(ctx); +} + +void JAHUAsn::__updateNameBoxData(s32 param_1, s32 param_2, s32 param_3, s32* param_4, + JORReflexible* param_5) { + JORMContext* ctx = attachJORMContext(8); + ctx->startUpdateNode(param_5); + ctx->removeComboBoxItem(5, param_4, 0); + ctx->endUpdateNode(); + releaseJORMContext(ctx); + + ctx = attachJORMContext(8); + ctx->startUpdateNode(param_5); + int num = getDataNum(param_1, param_2, param_3); + for (int i = 0; i < num; ++i) { + ctx->addComboBoxItem(1, param_4, getName(param_1, param_2, param_3, i), i, 0); + } + ctx->updateComboBox(2, param_4, 0); + ctx->endUpdateNode(); + releaseJORMContext(ctx); +} + +u32 JAHUAsn::__GetSubNo(s32 param_1) { + return param_1 / unk0; +} + +u32 JAHUAsn::__GetDataNo(s32 param_1) { + return param_1 % unk0; +} + +u8 JAHUAsn::getCategory(u32 param_1) { + return (param_1 & 0xF0000) >> 0x10; +} + +u8 JAHUAsn::getSub(u32 param_1) { + int perCat = getDataPerCat(param_1); + return __GetSubNo(perCat); +} + +u16 JAHUAsn::getDataPerCat(u32 param_1) { + return param_1; +} + +u16 JAHUAsn::getDataPerSub(u32 param_1) { + u16 perCat = getDataPerCat(param_1); + return __GetDataNo(perCat); +} + +u32 JAHUAsn::getNextId(u32 param_1, bool param_2) { + JUT_ASSERT(490, 0L); + return param_1; +} diff --git a/libs/JSystem/src/JAHostIO/JAHUFx.cpp b/libs/JSystem/src/JAHostIO/JAHUFx.cpp new file mode 100644 index 0000000000..d704c9c61c --- /dev/null +++ b/libs/JSystem/src/JAHostIO/JAHUFx.cpp @@ -0,0 +1,8 @@ +#include + +void dummy(JAHControl* cont, u16 s) { + cont->makeSlider(NULL, (s16*)NULL, (s16)0, (s16)0, 0); + cont->makeSlider(NULL, (s32*)NULL, (s32)0, (s32)0, 0); + cont->returnYDirectSize(s); + cont->startRadioButton(NULL, (u8*)NULL, (u8)0, 0); +} diff --git a/libs/JSystem/src/JAHostIO/JAHUTableEdit.cpp b/libs/JSystem/src/JAHostIO/JAHUTableEdit.cpp new file mode 100644 index 0000000000..44936fe0b8 --- /dev/null +++ b/libs/JSystem/src/JAHostIO/JAHUTableEdit.cpp @@ -0,0 +1,196 @@ +#include "JSystem/JAHostIO/JAHUTableEdit.h" +#include "JSystem/JAHostIO/JAHUAsnData.h" +#include "JSystem/JAHostIO/JAHUpdate.h" +#include "JSystem/JAHostIO/JAHioMessage.h" +#include "JSystem/JAHostIO/JAHioUtil.h" +#include "JSystem/JAudio2/JAISoundStarter.h" +#include "JSystem/JAudio2/JAUSoundTable.h" + +JAHUSeBox::JAHUSeBox(u32 param_1, u32* param_2) : JAHVirtualNode(NULL) { + unk4C = getVirNodeNum() | 0x12000000; + unk50 = getVirNodeNum() | 0x13000000; + unk54 = getVirNodeNum() | 0x14000000; + unk5C = param_2; + mAsnCalc = NULL; + + mAsnCalc = new JAHUAsn(0x10); + JUT_ASSERT(611, mAsnCalc); + + unk48 = false; + if (param_1 == -1) + unk58 = mAsnCalc->getDataId(0, 0, 0, 0); + else + unk58 = param_1; + + unk84 = 0; +} + +void JAHUSeBox::trigPlayButton() { + unk48 = true; + JAHUpdate::buttonOff(getMaster(), unk4C); + JAHUpdate::buttonOn(getMaster(), unk50); +} + +void JAHUSeBox::trigStopButton() { + unk48 = false; + JAHUpdate::buttonOn(getMaster(), unk4C); + JAHUpdate::buttonOff(getMaster(), unk50); + soundStop(); +} + +void JAHUSeBox::soundStop() { + if (unk40) + unk40->stop(); +} + +void JAHUSeBox::onCurrentNodeFrame() { + if (unk48) { + soundPlay(); + unk48 = false; + } + + if (unk44 && !unk40) { + JAHUpdate::buttonOn(getMaster(), unk4C); + JAHUpdate::buttonOff(getMaster(), unk50); + } else if (!unk44 && unk40) { + JAHUpdate::buttonOff(getMaster(), unk4C); + JAHUpdate::buttonOn(getMaster(), unk50); + } +} + +void JAHUSeBox::soundPlay() { + JAISoundStarter* starter = JASGlobalInstance::getInstance(); + if (starter) { + starter->startSound(unk58, &unk40, 0); + } +} + +void JAHUSeBox::message(JAHControl& control) { + if (!unk84 && JASGlobalInstance::getInstance()) { + if (unk58 == -1) { + unk64 = 0; + unk68 = 0; + unk6C = 0; + unk70 = 0; + unk74 = 0; + unk78 = 0; + unk7C = 0; + unk80 = 0; + unk58 = 0; + } else { + unk64 = unk58 >> 24; + unk68 = mAsnCalc->getCategory(unk58); + unk6C = mAsnCalc->getSub(unk58); + unk70 = mAsnCalc->getDataPerSub(unk58); + unk74 = unk64; + unk78 = unk68; + unk7C = unk6C; + unk80 = unk70; + } + + unk84 = true; + } + + control.startComboBoxL(NULL, &unk68, 0, 200, 0); + mAsnCalc->createComboBoxCategory(control); + control.endComboBox(); + control.startComboBoxL(NULL, &unk6C, 0, 0x2d, 0); + mAsnCalc->createComboBoxSub(control, unk64, unk68); + control.endComboBox(); + control.startComboBoxL(NULL, &unk70, 0, 200, 0); + mAsnCalc->createComboBoxData(control, unk64, unk68, unk6C); + control.endComboBox(); + control.makeCommentL(JAHioUtil::getString("%08x", unk58), unk54, 0x37, 0); + control.makeButtonL(">", unk4C, 0x32, 0); + control.makeButtonL("■", unk50, 0x32, 0x40000000); + control.returnY(1); +} + +void JAHUSeBox::nodeEvent(JAH_N_Event) {} + +void JAHUSeBox::propertyEvent(JAH_P_Event param_1, u32 param_2) { + if (param_1 == 0) { + unk74 = unk64; + unk78 = unk68; + unk7C = unk6C; + unk80 = unk70; + return; + } + + if (param_2 != unk4C && param_2 != unk50 && + ((unk7C == unk6C && unk80 == unk70) || unk68 != unk78)) + { + JAUSoundNameTable* table = JASGlobalInstance::getInstance(); + int groups = table->getNumGroups_inSection(0); + if (unk68 >= groups) { + groups += table->getNumGroups_inSection(1); + if (unk68 < groups) { + unk64 = 1; + unk68 -= table->getNumGroups_inSection(0); + } else { + unk64 = 2; + unk68 -= groups; + } + } else { + unk64 = 0; + } + } + + mAsnCalc->checkAndUpdateNameBox(&unk64, &unk68, &unk6C, &unk70, unk74, unk78, unk7C, + getMaster()); + if (checkNameSetChange()) { + unk58 = mAsnCalc->getDataId(unk64, unk68, unk6C, unk70); + if (unk5C != NULL) + *unk5C = unk58; + char buf[9]; + sprintf(buf, "%08x", unk58); + JORMContext* ctx = attachJORMContext(8); + ctx->startUpdateNode(getMaster()); + ctx->updateLabel(2, unk54, buf); + ctx->endUpdateNode(); + releaseJORMContext(ctx); + } + + if (param_2 == unk4C) { + trigPlayButton(); + } else if (param_2 == unk50) { + trigStopButton(); + } +} + +u8 JAHUSeBox::checkNameSetChange() { + u8 iVar1 = 0; + + if (unk74 != unk64) + iVar1++; + + if (unk78 != unk68) + iVar1++; + + if (unk7C != unk6C) + iVar1++; + + if (unk80 != unk70) + iVar1++; + + return iVar1; +} + +void JAHUSeBox::updateNameSet(JORReflexible* param_1) { + mAsnCalc->updateNameBoxAll(&unk64, &unk68, &unk6C, &unk70, param_1); + JORMContext* ctx = attachJORMContext(8); + ctx->startUpdateNode(param_1); + ctx->updateLabel(2, unk54, JAHioUtil::getString("%08x", unk58)); + ctx->endUpdateNode(); + releaseJORMContext(ctx); +} + +void JAHUSeBox::setId(u32 param_1, bool param_2, JORReflexible* param_3) { + unk58 = param_1; + unk64 = unk58 >> 24; + unk68 = (param_1 >> 16) & 0xff; + unk6C = mAsnCalc->getSub(param_1); + unk70 = mAsnCalc->getDataPerSub(param_1); + if (param_2) + updateNameSet(param_3); +} diff --git a/libs/JSystem/src/JAHostIO/JAHVirtualNode.cpp b/libs/JSystem/src/JAHostIO/JAHVirtualNode.cpp new file mode 100644 index 0000000000..7275fc70be --- /dev/null +++ b/libs/JSystem/src/JAHostIO/JAHVirtualNode.cpp @@ -0,0 +1,93 @@ +#include +#include +#include + +u32 JAHVirtualNode::smVirNodeNum; + +void JAHVirtualNode::virtualMessage(JAHControl& control) { + message(control); + callAllVirtualMessages(control); +} + +void JAHVirtualNode::callAllVirtualMessages(JAHControl& control) { + if (mTree.getNumChildren() == 0) + return; + + for (JSUTreeIterator iter = mTree.getFirstChild(); iter != mTree.getEndChild(); + ++iter) + { + iter->message(control); + } +} + +JAHioNode* JAHVirtualNode::getMaster() { + JSUTree* it = mTree.getParent(); + while (it->getParent()) + it = it->getParent(); + return (JAHioNode*)it->getObject(); +} + +void JAHVirtualNode::framework() { + onFrame(); + for (JSUTreeIterator iter = getVirTree()->getFirstChild(); + iter != getVirTree()->getEndChild(); ++iter) + { + iter->framework(); + } +} + +void JAHVirtualNode::onFrame() {} + +void JAHVirtualNode::currentFramework() { + onCurrentNodeFrame(); + for (JSUTreeIterator iter = getVirTree()->getFirstChild(); + iter != getVirTree()->getEndChild(); ++iter) + { + iter->framework(); + } +} + +void JAHVirtualNode::onCurrentNodeFrame() {} + +void JAHVirtualNode::listenVirtualPropertyEvent(JAH_P_Event param_1, u32 param_2) { + propertyEvent(param_1, param_2); + for (JSUTreeIterator iter = mTree.getFirstChild(); iter != mTree.getEndChild(); + ++iter) + { + iter->listenVirtualPropertyEvent(param_1, param_2); + } +} + +void JAHVirtualNode::propertyEvent(JAH_P_Event, u32) {} + +void JAHVirtualNode::listenVirtualNodeEvent(JAH_N_Event param_1) { + nodeEvent(param_1); + for (JSUTreeIterator iter = mTree.getFirstChild(); iter != mTree.getEndChild(); + ++iter) + { + iter->listenVirtualNodeEvent(param_1); + } +} + +void JAHVirtualNode::nodeEvent(JAH_N_Event) {} + +void JAHVirtualNode::setVirNodeName(const char* name) { + JUT_ASSERT(139, name); + size_t size = strlen(name) + 1; + // clang-format off + JUT_ASSERT(141, size<32); + // clang-format on + strcpy(mName, name); +} + +JAHVirtualNode::JAHVirtualNode(const char* name) : mTree(this) { + if (name) + setVirNodeName(name); + else + setVirNodeName("no name"); + smVirNodeNum += 1; +} + +void JAHVirtualNode::updateNode() { + getMaster()->updateNode(); +} diff --git a/libs/JSystem/src/JAHostIO/JAHioMessage.cpp b/libs/JSystem/src/JAHostIO/JAHioMessage.cpp index 93fda0dd72..bc0e26e211 100644 --- a/libs/JSystem/src/JAHostIO/JAHioMessage.cpp +++ b/libs/JSystem/src/JAHostIO/JAHioMessage.cpp @@ -1,4 +1,4 @@ -#include "JSystem/JSystem.h" // IWYU pragma: keep +#include "JSystem/JSystem.h" // IWYU pragma: keep #include "JSystem/JAHostIO/JAHioMessage.h" #include "JSystem/JAHostIO/JAHioNode.h" @@ -7,7 +7,7 @@ u16 JAHControl::smButtonWidth[] = {20, 50, 100, 150, 300, 600}; u16 JAHControl::smCommentWidth[] = {20, 50, 100, 200, 400, 800}; -u16 JAHControl::smComboWidth[] = { 50, 100, 150, 200, 300, 600}; +u16 JAHControl::smComboWidth[] = {50, 100, 150, 200, 300, 600}; u16 JAHControl::smYTop = 5; u16 JAHControl::smXLeft = 5; u16 JAHControl::smIndentSize = 30; diff --git a/libs/JSystem/src/JAHostIO/JAHioMgr.cpp b/libs/JSystem/src/JAHostIO/JAHioMgr.cpp index 5c1a324651..91b0a030e6 100644 --- a/libs/JSystem/src/JAHostIO/JAHioMgr.cpp +++ b/libs/JSystem/src/JAHostIO/JAHioMgr.cpp @@ -1,9 +1,12 @@ -#include "JSystem/JSystem.h" // IWYU pragma: keep +#include "JSystem/JSystem.h" // IWYU pragma: keep -#include "JSystem/JAHostIO/JAHioMgr.h" #include "JSystem/JAHostIO/JAHFrameNode.h" +#include "JSystem/JAHostIO/JAHioMgr.h" #include "JSystem/JHostIO/JORServer.h" +template <> +JAHioMgr* JAHSingletonBase::sInstance = NULL; + JAHioMgr::JAHioMgr() : field_0x4(0), field_0x8(0) {} void JAHioMgr::init_OnGame() { diff --git a/libs/JSystem/src/JAHostIO/JAHioNode.cpp b/libs/JSystem/src/JAHostIO/JAHioNode.cpp index 5eef2f7e92..12ba55c8eb 100644 --- a/libs/JSystem/src/JAHostIO/JAHioNode.cpp +++ b/libs/JSystem/src/JAHostIO/JAHioNode.cpp @@ -1,10 +1,12 @@ -#include "JSystem/JSystem.h" // IWYU pragma: keep +#include "JSystem/JSystem.h" // IWYU pragma: keep -#include "JSystem/JAHostIO/JAHioNode.h" +#include #include "JSystem/JAHostIO/JAHioMessage.h" #include "JSystem/JAHostIO/JAHioMgr.h" +#include "JSystem/JAHostIO/JAHioNode.h" #include "JSystem/JHostIO/JORServer.h" -#include + +JAHioNode* JAHioNode::smCurrentNode; JAHioNode::JAHioNode(const char* name) : mTree(this) { mLastChild = NULL; @@ -86,7 +88,9 @@ void JAHioNode::generateTempChildren(JORMContext* mctx) { } } -u32 JAHioNode::getNodeKind() const { return 0; } +u32 JAHioNode::getNodeKind() const { + return 0; +} JAHioNode* JAHioNode::getParent() { if (mTree.getParent()) { diff --git a/libs/JSystem/src/JAHostIO/JAHioUtil.cpp b/libs/JSystem/src/JAHostIO/JAHioUtil.cpp index 11c5fd4b52..e301b442af 100644 --- a/libs/JSystem/src/JAHostIO/JAHioUtil.cpp +++ b/libs/JSystem/src/JAHostIO/JAHioUtil.cpp @@ -1,10 +1,19 @@ -#include "JSystem/JSystem.h" // IWYU pragma: keep +#include "JSystem/JSystem.h" // IWYU pragma: keep -#include "JSystem/JAHostIO/JAHioUtil.h" #include +#include "JSystem/JAHostIO/JAHUpdate.h" +#include "JSystem/JAHostIO/JAHioUtil.h" +#include "JSystem/JHostIO/JORFile.h" char JAHioUtil::mStringBuffer[256]; +JAHioNode* JAHUpdate::spNode; +JORMContext* JAHUpdate::spMc; + +static char* dummy(JORDir* dir) { + return std::strrchr(dir->getFilename(), '\n'); +} + char* JAHioUtil::getString(const char* msg, ...) { va_list args; va_start(msg, args); diff --git a/libs/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/string b/libs/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/string index 41984de8b5..27c03be9d9 100644 --- a/libs/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/string +++ b/libs/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/string @@ -10,7 +10,6 @@ using ::memcmp; using ::memchr; using ::memmove; -using ::strrchr; using ::strlen; using ::strncmp; using ::strcmp; @@ -25,6 +24,11 @@ using ::wcslen; inline char* strchr(char* str, int c) { return ::strchr(str, c); } + +inline char* strrchr(char* str, int c) { + return ::strrchr(str, c); +} + }; // namespace std #endif diff --git a/libs/revolution/include/revolution/dvd.h b/libs/revolution/include/revolution/dvd.h index 06b7ecaece..afb0013558 100644 --- a/libs/revolution/include/revolution/dvd.h +++ b/libs/revolution/include/revolution/dvd.h @@ -3,7 +3,6 @@ #include #include -#include "global.h" #ifdef __cplusplus extern "C" { @@ -188,15 +187,16 @@ typedef struct DVDGameTOC { typedef struct DVDPartitionParams DVDPartitionParams; +#define ROUND_HACK(n, a) (((u32)(n) + (a)-1) & ~((a)-1)) struct DVDPartitionParams { ESTicket ticket; - u8 padding0[ROUND(sizeof(ESTicket), 32) - sizeof(ESTicket)]; + u8 padding0[ROUND_HACK(sizeof(ESTicket), 32) - sizeof(ESTicket)]; ESTicketView ticketView; - u8 padding1[ROUND(sizeof(ESTicketView), 32) - sizeof(ESTicketView)]; + u8 padding1[ROUND_HACK(sizeof(ESTicketView), 32) - sizeof(ESTicketView)]; u32 numTmdBytes; u8 padding2[28]; ESTitleMeta tmd; - u8 padding3[ROUND(sizeof(ESTitleMeta), 32) - sizeof(ESTitleMeta)]; + u8 padding3[ROUND_HACK(sizeof(ESTitleMeta), 32) - sizeof(ESTitleMeta)]; u32 numCertBytes; u8 padding4[28]; u8 certificates[4096]; @@ -204,6 +204,7 @@ struct DVDPartitionParams { u8 padding5[28]; u8 h3Hash[98304]; }; +#undef ROUND_HACK typedef struct diRegVals { u32 ImmRegVal; diff --git a/libs/revolution/src/ipc/ipcProfile.c b/libs/revolution/src/ipc/ipcProfile.c index 735f053757..a778e09b35 100644 --- a/libs/revolution/src/ipc/ipcProfile.c +++ b/libs/revolution/src/ipc/ipcProfile.c @@ -1,4 +1,5 @@ #include +#include "global.h" #include #if SDK_AUG2010 diff --git a/libs/revolution/src/pad/Pad.c b/libs/revolution/src/pad/Pad.c index b20da7bb14..3d934d3d8b 100644 --- a/libs/revolution/src/pad/Pad.c +++ b/libs/revolution/src/pad/Pad.c @@ -1,6 +1,7 @@ #include #include #include +#include "global.h" #include diff --git a/libs/revolution/src/wpad/__wpad.h b/libs/revolution/src/wpad/__wpad.h index 7203d9f5b0..e6a6c8803e 100644 --- a/libs/revolution/src/wpad/__wpad.h +++ b/libs/revolution/src/wpad/__wpad.h @@ -3,6 +3,7 @@ #include #include +#include "global.h" #ifdef __cplusplus extern "C" { diff --git a/src/Z2AudioLib/SpotName.h b/src/Z2AudioLib/SpotName.h new file mode 100644 index 0000000000..e531fb7524 --- /dev/null +++ b/src/Z2AudioLib/SpotName.h @@ -0,0 +1,20 @@ +#ifndef SPOTNAME_H +#define SPOTNAME_H + +// This symbol has polluted multiple TUs in the lib, hence, +// it probably was defined in the header as static by accident +static const char* sSpotName[] = { + "F_SP00", "F_SP103", "R_SP01", "F_SP104", "R_SP107", "F_SP108", "R_SP108", "F_SP117", + "F_SP109", "R_SP109", "R_SP209", "F_SP110", "R_SP110", "F_SP111", "F_SP128", "R_SP128", + "F_SP115", "F_SP112", "F_SP126", "F_SP127", "R_SP127", "F_SP113", "F_SP116", "R_SP116", + "R_SP160", "R_SP161", "F_SP114", "F_SP118", "F_SP124", "F_SP125", "F_SP121", "F_SP122", + "F_SP123", "F_SP200", "F_SP102", "", "R_SP300", "R_SP301", "T_ENEMY", "D_MN54", + "D_MN05", "D_MN05B", "D_MN05A", "D_MN04", "D_MN04B", "D_MN04A", "D_MN01", "D_MN01B", + "D_MN01A", "D_MN10", "D_MN10B", "D_MN10A", "D_MN11", "D_MN11B", "D_MN11A", "D_MN06", + "D_MN06B", "D_MN06A", "D_MN07", "D_MN07B", "D_MN07A", "D_MN08", "D_MN08B", "D_MN08C", + "D_MN08A", "D_MN08D", "D_MN09", "D_MN09A", "D_MN09B", "D_MN09C", "D_SB00", "D_SB01", + "D_SB02", "D_SB03", "D_SB04", "D_SB05", "D_SB06", "D_SB07", "D_SB08", "D_SB09", + "D_SB10", +}; + +#endif /* SPOTNAME_H */ diff --git a/src/Z2AudioLib/Z2AudioMgr.cpp b/src/Z2AudioLib/Z2AudioMgr.cpp index 58ef5fc997..1465515cb6 100644 --- a/src/Z2AudioLib/Z2AudioMgr.cpp +++ b/src/Z2AudioLib/Z2AudioMgr.cpp @@ -19,6 +19,7 @@ #endif Z2AudioMgr* Z2AudioMgr::mAudioMgrPtr; +u8 gMuffleOutOfRangeMic = false; Z2AudioMgr::Z2AudioMgr() : mSoundStarter(true) { mAudioMgrPtr = this; diff --git a/src/Z2AudioLib/Z2DebugSys.cpp b/src/Z2AudioLib/Z2DebugSys.cpp index 55ee66519c..59c125b110 100644 --- a/src/Z2AudioLib/Z2DebugSys.cpp +++ b/src/Z2AudioLib/Z2DebugSys.cpp @@ -14,14 +14,15 @@ #include "JSystem/JKernel/JKRExpHeap.h" #include "Z2AudioLib/Z2F1TestWindow.h" #include "Z2AudioLib/Z2FxLineMgr.h" +#include "Z2AudioLib/Z2Param.h" #include "Z2AudioLib/Z2SeView.h" #include "Z2AudioLib/Z2SoundPlayer.h" #include "Z2AudioLib/Z2TrackView.h" #include "Z2AudioLib/Z2WaveArcLoader.h" -#include "m_Do/m_Do_hostIO.h" #include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_hostIO.h" -Z2DebugSys::Z2DebugSys() : JASGlobalInstance(true) { } +Z2DebugSys::Z2DebugSys() : JASGlobalInstance(true) {} void Z2DebugSys::initJAW() { JKRHeap* oldHeap = JKRHeap::getCurrentHeap(); @@ -117,3 +118,108 @@ JAISeqDataMgr* Z2DebugSys::initSeSeqDataMgr(const void* param_1) { JKRSetCurrentHeap(oldHeap); return seqDataMgr; } + +u8 gMicOn = true; +u8 gMicOffWhenOutOfSight = true; +extern u8 gMuffleOutOfRangeMic; + +void Z2ParamNode::message(JAHControl& ctrl) { + ctrl.makeComment("**** 各種パラメータ編集用ノード ****", 0, 5, 0); + ctrl.returnY(1); + ctrl.indent(1); + ctrl.makeCheckBox("BGM強制ボリュームON", &Z2GetSeqMgr()->field_0x04_debug, 1, false, 0); + ctrl.makeSlider("BGM強制ボリューム", &Z2GetSeqMgr()->field_0x00_debug, 0.0f, 1.0f, 0); + ctrl.returnY(1); + ctrl.makeComment("-- ミドナボイス --", 0, 5, 0); + ctrl.indent(1); + ctrl.makeSlider("発話スタイル", (s16*)Z2GetSpeechMgr2()->getStylePtr(), 0, 0x10, 0); + ctrl.makeSlider("語尾(1=UP)", Z2GetSpeechMgr2()->getTalkerPtr(), 0, 1, 0); + ctrl.indent(-1); + ctrl.makeComment("-- BGM汎用パラメータ --", 0, 5, 0); + ctrl.indent(1); + ctrl.makeSlider("シーンチェンジ時のBGMフェードアウトタイム", + &Z2Param::SCENE_CHANGE_BGM_FADEOUT_TIME, 0, 0xff, 0); + ctrl.makeSlider("BGMクロスフェードインタイム", &Z2Param::BGM_CROSS_FADEIN_TIME, 0, 0xff, 0); + ctrl.makeSlider("BGMクロスフェードアウトタイム", &Z2Param::BGM_CROSS_FADEOUT_TIME, 0, 0xff, + 0); + ctrl.indent(-1); + ctrl.makeComment("-- 戦闘BGMパラメータ --", 0, 5, 0); + ctrl.indent(1); + ctrl.makeSlider("戦闘BGMスタート禁止時間", &Z2Param::BATTLE_BGM_WAIT_TIME, 0, 0xff, 0); + ctrl.makeSlider("戦闘BGMスタート距離", &Z2Param::BATTLE_FADEIN_DIST, 0.0f, 5000.0f, 0); + ctrl.makeSlider("戦闘BGMフェードアウト距離", &Z2Param::BATTLE_FADEOUT_DIST, 0.0f, 5000.0f, + 0); + ctrl.makeSlider("接近戦状態距離", &Z2Param::ENEMY_NEARBY_DIST, 0.0f, 5000.0f, 0); + ctrl.makeSlider("接近戦トラックFIタイム", &Z2Param::CLOSE_BATTLE_TRACK_FI_TIME, 0, 0xff, 0); + ctrl.makeSlider("接近戦トラックFOタイム", &Z2Param::CLOSE_BATTLE_TRACK_FO_TIME, 0, 0xff, 0); + ctrl.makeSlider("見つかりトラックFIタイム", &Z2Param::FOUND_TRACK_FI_TIME, 0, 0xff, 0); + ctrl.makeSlider("見つかりトラックFOタイム", &Z2Param::FOUND_TRACK_FO_TIME, 0, 0xff, 0); + ctrl.makeSlider("最後の一撃音量下げ範囲", &Z2Param::ENEMY_LASTHIT_MUTE_VOLUME, 0.0f, 1.0f, 0); + ctrl.makeSlider("最後の一撃音量下げ時間", &Z2Param::ENDING_BLOW_VOL_DOWN_TIME, 0, 0xff, 0); + ctrl.makeSlider("最後の一撃音量下げ持続時間", &Z2Param::ENDING_BLOW_VOL_LOWER_TIME, 0, 0xff, 0); + ctrl.makeSlider("最後の一撃音量下げ復帰時間", &Z2Param::ENDING_BLOW_VOL_LOWER_RECOVER_TIME, 0, + 0xff, 0); + ctrl.makeSlider("最後の一撃〜フィニッシュ最低時間", &Z2Param::ENDING_BLOW_MIN_FINISH_TIME, 0, + 0xff, 0); + ctrl.indent(-1); + ctrl.returnY(1); + ctrl.makeComment("-- オーディブル演算パラメータ --", 0, 5, 0); + ctrl.indent(1); + ctrl.makeSlider("ボリューム変化許容範囲(+-)", &Z2Param::AUDIBLE_DELTA_RANGE_VOLUME, 0.0f, 1.0f, + 0); + ctrl.makeSlider("パン変化許容範囲(+-)", &Z2Param::AUDIBLE_DELTA_RANGE_PAN, 0.0f, 1.0f, 0); + ctrl.makeSlider("ドルビー変化許容範囲(+-)", &Z2Param::AUDIBLE_DELTA_RANGE_DOLBY, 0.0f, 1.0f, 0); + ctrl.makeSlider("ドップラーピッチ変化許容範囲(*/)", &Z2GetAudience()->getSetting()->field_0x60, + 1.0f, 2.0f, 0); + ctrl.indent(-1); + ctrl.returnY(1); + Z2SpotMic* pfVar2 = Z2GetAudience()->getLinkMic(); + if (pfVar2 != NULL) { + ctrl.makeComment("-- リンクスポットマイク設定 --", 0, 5, 0); + ctrl.indent(1); + ctrl.makeCheckBox("マイクON?", &gMicOn, 1, false, 0); + ctrl.makeCheckBox("視野外でマイクオフ?", &gMicOffWhenOutOfSight, 1, false, 0); + ctrl.makeSlider("マイク音量最大距離", &pfVar2->field_0x0, 0.0f, 1000.0f, 0); + ctrl.makeSlider("マイク音量最小距離", &pfVar2->field_0x4, 0.0f, 1000.0f, 0); + ctrl.makeSlider("最小音量", &pfVar2->field_0x8, 0.0f, 1.0f, 0); + ctrl.makeSlider("最大音量の最小値", &pfVar2->field_0xc, 0.0f, 1.0f, 0); + ctrl.makeButton("マイク設定更新", 3, 3, 0); + ctrl.returnY(1); + ctrl.makeCheckBox("マイク圏外をボリュームダウン", &gMuffleOutOfRangeMic, 1, false, 0); + ctrl.indent(1); + ctrl.makeSlider("マイク圏外の音量比", &Z2GetAudience()->field_0x4, 0.0f, 1.0f, 0); + ctrl.indent(-1); + ctrl.indent(-1); + } + ctrl.makeComment("-- 闇のSEフィルタ実験 --", 0, 5, 0); + ctrl.indent(1); + ctrl.makeButton("フィルタリセット", 2, 3, 0); + ctrl.makeCheckBox("フィルタON", &Z2Param::DARK_SE_FILTER_ON, 1, false, 0); + ctrl.makeCheckBox("システムSEにも適用", &Z2Param::SYSTEM_SE_USE_DARK_SE_SETTING, 1, false, 0); + ctrl.makeSlider("ローパスフィルタ設定(強→弱)", &Z2Param::DARK_SE_LOW_PASS_FILTER_SETTING, 0, + 0x7f, 0); +} + +void Z2ParamNode::propertyEvent(JAH_P_Event param_1, u32 param_2) { + if (param_1 == JAH_P_EVENT0) + return; + + switch (param_2) { + case 2: + Z2GetSoundMgr()->resetFilterAll(); + break; + case 3: + Z2GetAudience()->getLinkMic()->calcPriorityFactor(); + break; + } +} + +void Z2ParamNode::onFrame() { + Z2SpotMic* mic = Z2GetAudience()->getLinkMic(); + if (!mic) + return; + + mic->setMicOn(gMicOn != 0); + mic->setIgnoreIfOut(gMicOffWhenOutOfSight != 0); + Z2GetAudience()->setUsingOffMicVol(gMuffleOutOfRangeMic != 0); +} diff --git a/src/Z2AudioLib/Z2EnvSeMgr.cpp b/src/Z2AudioLib/Z2EnvSeMgr.cpp index 0c6884b9a2..d6f68bcd95 100644 --- a/src/Z2AudioLib/Z2EnvSeMgr.cpp +++ b/src/Z2AudioLib/Z2EnvSeMgr.cpp @@ -3,92 +3,7 @@ #include "JSystem/JAudio2/JASCalc.h" #include "d/d_save.h" #include "d/d_com_inf_game.h" - -#if DEBUG -static const char* sSpotName[] = { - "F_SP00", - "F_SP103", - "R_SP01", - "F_SP104", - "R_SP107", - "F_SP108", - "R_SP108", - "F_SP117", - "F_SP109", - "R_SP109", - "R_SP209", - "F_SP110", - "R_SP110", - "F_SP111", - "F_SP128", - "R_SP128", - "F_SP115", - "F_SP112", - "F_SP126", - "F_SP127", - "R_SP127", - "F_SP113", - "F_SP116", - "R_SP116", - "R_SP160", - "R_SP161", - "F_SP114", - "F_SP118", - "F_SP124", - "F_SP125", - "F_SP121", - "F_SP122", - "F_SP123", - "F_SP200", - "F_SP102", - "", - "R_SP300", - "R_SP301", - "T_ENEMY", - "D_MN54", - "D_MN05", - "D_MN05B", - "D_MN05A", - "D_MN04", - "D_MN04B", - "D_MN04A", - "D_MN01", - "D_MN01B", - "D_MN01A", - "D_MN10", - "D_MN10B", - "D_MN10A", - "D_MN11", - "D_MN11B", - "D_MN11A", - "D_MN06", - "D_MN06B", - "D_MN06A", - "D_MN07", - "D_MN07B", - "D_MN07A", - "D_MN08", - "D_MN08B", - "D_MN08C", - "D_MN08A", - "D_MN08D", - "D_MN09", - "D_MN09A", - "D_MN09B", - "D_MN09C", - "D_SB00", - "D_SB01", - "D_SB02", - "D_SB03", - "D_SB04", - "D_SB05", - "D_SB06", - "D_SB07", - "D_SB08", - "D_SB09", - "D_SB10", -}; -#endif +#include "Z2AudioLib/SpotName.h" Z2EnvSeBase::Z2EnvSeBase(Vec* posPtr) { mPos = posPtr; diff --git a/src/Z2AudioLib/Z2F1TestWindow.cpp b/src/Z2AudioLib/Z2F1TestWindow.cpp new file mode 100644 index 0000000000..7cf5c5eb63 --- /dev/null +++ b/src/Z2AudioLib/Z2F1TestWindow.cpp @@ -0,0 +1,198 @@ +#include "Z2AudioLib/Z2F1TestWindow.h" +#include "JSystem/JAHostIO/JAHioMessage.h" +#include "JSystem/JAudio2/JASAudioThread.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "Z2AudioLib/Z2Audience.h" + +f32 sF1_Diff = 0.01f; +f32 sF1_i = 0.1f; +f32 sF1_Geta = 0.2f; +s32 sF1_Frame = 200; +f32 sF1_Pitch_Width = 0.2f; +f32 sF1_Pan_Width; + +Z2F1TestWindow::Z2F1TestWindow() : JAWWindow("Z2F1TestWindow", 500, 450) {} + +void Z2F1TestWindow::onDraw(JAWGraphContext*) {} + +void Z2F1TestWindow::frameWork() {} + +void Z2F1TestWindow::calcF1() {} + +void Z2F1TestWindow::onPadProc(const JUTGamePad&) {} + +f32 Z2F1TestWindow::tau(f32) {} + +f32 Z2F1TestWindow::calcThreshold(int) {} + +f32 Z2F1TestWindow::getRawX() const { + return field_0x3f0; +} + +f32 Z2F1TestWindow::calcNoise() { + field_0x3f0 = field_0x3f4; + field_0x3f4 = tau(field_0x3f0); + return field_0x3f0; +} + +void Z2F1TestWindow::setValue(f32 param_1, f32 param_2) { + field_0x3f0 = param_1; + field_0x3f4 = param_1; + field_0xbd4 = param_2; +} + +void Z2F1TestWindow::onTrigY(const JUTGamePad&) { + for (u16 i = 0; i < 500; ++i) + field_0x3f8[i] = 0.0f; + + field_0x3f0 = tau(sF1_i); + field_0x3f4 = tau(field_0x3f0); + field_0xbd4 = calcThreshold(sF1_Frame); +} + +void Z2F1TestWindow::onTrigMenu(const JUTGamePad&) { + if (field_0xbd0) + field_0xbd0 = 0; + else + field_0xbd0 = 1; +} + +Z2F1SwingTestNode::Z2F1SwingTestNode() + : JAHFrameNode("1/fゆらぎテスト"), field_0xc48(-1, NULL), field_0xcd0(-1, NULL) { + appendVirNode(&field_0xc48); + appendVirNode(&field_0xcd0); + mModulateVolume = 0; + mModulatePitch = 0; + mModulatePan = 0; + mModulateDolby = 0; + field_0xd5c = 0.0f; + field_0xd60 = 0.0f; + field_0xd64 = 0.0f; + field_0xd68 = 0.0f; +} + +void Z2F1SwingTestNode::message(JAHControl& ctrl) { + ctrl.makeComment("--1/fゆらぎテスト--", 0, 5, 0); + ctrl.indent(1); + ctrl.makeSlider("Diff値", &sF1_Diff, 0.0, 0.1, 0); + ctrl.makeSlider("i値", &sF1_i, 0.0f, 1.0f, 0); + ctrl.makeSlider("Geta値", &sF1_Geta, 0.0f, 1.0f, 0); + ctrl.makeSlider("frame値", &sF1_Frame, 2, 200, 0); + ctrl.returnY(1); + ctrl.makeCheckBox("ボリューム変調", &mModulateVolume, 1, false, 0); + ctrl.makeCheckBox("ピッチ変調", &mModulatePitch, 1, false, 0); + ctrl.makeSlider("Pitch ゆらぎ幅", &sF1_Pitch_Width, 0.0f, 1.0f, 0); + ctrl.makeCheckBox("パン変調", &mModulatePan, 1, false, 0); + ctrl.makeSlider("パン移動幅", &sF1_Pan_Width, 0.0f, 1.0f, 0); + ctrl.makeCheckBox("ドルビー変調", &mModulateDolby, 1, false, 0); +} + +void Z2F1SwingTestNode::onFrame() { + f32 fVar1 = 1.0; + f32 fVar2 = getValue() * (1.0f - sF1_Geta) + sF1_Geta; + f32 fVar3 = getValue2() * (1.0f - sF1_Geta) + sF1_Geta; + if (field_0xc48.unk40.isSoundAttached() && field_0xcd0.unk40.isSoundAttached()) { + fVar1 = 0.5f; + field_0xc48.unk40->getAuxiliary().moveVolume(fVar2 * fVar1, 0); + field_0xcd0.unk40->getAuxiliary().moveVolume(fVar3 * fVar1, 0); + } else if (field_0xc48.unk40.isSoundAttached()) { + fVar1 = 1.0f; + field_0xc48.unk40->getAuxiliary().moveVolume(fVar2 * fVar1, 0); + } else if (field_0xcd0.unk40.isSoundAttached()) { + fVar1 = 1.0f; + field_0xcd0.unk40->getAuxiliary().moveVolume(fVar3 * fVar1, 0); + } + + if (field_0xc48.unk40.isSoundAttached()) { + if (mModulateVolume) + field_0xc48.unk40->getAuxiliary().moveVolume(fVar3 * fVar1, 0); + else + field_0xc48.unk40->getAuxiliary().moveVolume(0.5f, 0); + + if (mModulatePitch) + field_0xc48.unk40->getAuxiliary().movePitch( + getValue2() * sF1_Pitch_Width + (1.0f - sF1_Pitch_Width), 0); + else + field_0xc48.unk40->getAuxiliary().movePitch(1.0f, 0); + + if (mModulatePan) + field_0xc48.unk40->getAuxiliary().movePan(0.5f - getValue2() * sF1_Pan_Width / 2, 0); + else + field_0xc48.unk40->getAuxiliary().movePan(0.5f, 0); + + if (mModulateDolby) + field_0xc48.unk40->getAuxiliary().moveDolby(fVar3, 0); + else + field_0xc48.unk40->getAuxiliary().moveDolby(0.0f, 0); + } else if (field_0xcd0.unk40.isSoundAttached()) { + if (mModulateVolume) + field_0xcd0.unk40->getAuxiliary().moveVolume(fVar3 * fVar1, 0); + else + field_0xcd0.unk40->getAuxiliary().moveVolume(0.5f, 0); + + if (mModulatePitch) + field_0xcd0.unk40->getAuxiliary().movePitch( + getValue2() * sF1_Pitch_Width + (1.0f - sF1_Pitch_Width), 0); + else + field_0xcd0.unk40->getAuxiliary().movePitch(1.0f, 0); + + if (mModulatePan) + field_0xcd0.unk40->getAuxiliary().movePan(0.5f + getValue2() * sF1_Pan_Width / 2, 0); + else + field_0xcd0.unk40->getAuxiliary().movePan(0.5f, 0); + + if (mModulateDolby) + field_0xcd0.unk40->getAuxiliary().moveDolby(fVar3, 0); + else + field_0xcd0.unk40->getAuxiliary().moveDolby(0.0f, 0); + } +} + +f32 Z2F1TestWindow::getValue2() { + return field_0x3f8[field_0xbcc]; +} + +f32 Z2F1TestWindow::getValue() { + return field_0x3f8[field_0xbc8]; +} + +Z2AudSettingView::Z2AudSettingView() : JAWWindow("Z2AudSettingView", 400, 300) {} + +void Z2AudSettingView::onDraw(JAWGraphContext* param_1) { + const Z2AudioCamera* this_00 = Z2GetAudience()->getAudioCamera(0); + Z2Audience3DSetting* pfVar2 = Z2GetAudience()->getSetting(); + int l = 0; + param_1->print(0, l++, ""); + param_1->print(0, l++, "far dist %.3f", pfVar2->field_0x0[0]); + param_1->print(0, l++, "near dist %.3f", pfVar2->field_0x3c); + param_1->print(0, l++, "frontDolbyZ %.3f", pfVar2->field_0x44); + param_1->print(0, l++, "behindDolbyZ %.3f", pfVar2->field_0x48); + param_1->print(0, l++, "centerDolby %.3f", pfVar2->field_0x4c); + ++l; + param_1->print(0, l++, ""); + param_1->print(0, l++, "CamDist %.3f", this_00->getCamDist()); + param_1->print(0, l++, "vel.x %.3f", this_00->getVel()->x); + param_1->print(0, l++, "vel.y %.3f", this_00->getVel()->y); + param_1->print(0, l++, "vel.z %.3f", this_00->getVel()->z); + param_1->print(0, l++, "TargetVolume %.3f", this_00->getTargetVolume()); + param_1->print(0, l++, "VolCenterZ %.3f", this_00->getVolCenterZ()); + param_1->print(0, l++, "DolbyCenterZ %.3f", this_00->getDolbyCenterZ()); + param_1->print(0, l++, "getFovySin %.3f", this_00->getFovySin()); +} + +void Z2DSPCheck::onDraw(JAWGraphContext* param_1) { + u8* puVar1 = (u8*)JKRHeap::getAltAramStartAdr(); + DCInvalidateRange(puVar1, 0x20); + int l = 0; + param_1->print(0, l++, ""); + param_1->print(0, l++, "VARAM_TOP %08X", puVar1); + param_1->print(0, l++, "DSP state %04X", *(u16*)(puVar1 + 0)); + param_1->print(0, l++, "DSP channel %04X", *(u8*)(puVar1 + 2)); + param_1->print(0, l++, "DSP sub-fr %04X", *(u8*)(puVar1 + 3)); + param_1->print(0, l++, "DSP cmd wr %04X", *(u16*)(puVar1 + 4)); + param_1->print(0, l++, "DSP sub-rd %04X", *(u16*)(puVar1 + 6)); + param_1->print(0, l++, "DSP cmd rest %04X", *(u16*)(puVar1 + 8)); + l++; + param_1->print(0, l++, ""); + param_1->print(0, l++, "DSPSyncCount %2d", JASAudioThread::getDSPSyncCount()); +} diff --git a/src/Z2AudioLib/Z2FxLineMgr.cpp b/src/Z2AudioLib/Z2FxLineMgr.cpp index 61d37c6785..a995d5ac68 100644 --- a/src/Z2AudioLib/Z2FxLineMgr.cpp +++ b/src/Z2AudioLib/Z2FxLineMgr.cpp @@ -1,9 +1,15 @@ #include "Z2AudioLib/Z2FxLineMgr.h" -#include "Z2AudioLib/Z2SceneMgr.h" +#include "JSystem/JAHostIO/JAHUGlobal.h" +#include "JSystem/JAHostIO/JAHioMessage.h" +#include "JSystem/JAHostIO/JAHioUtil.h" #include "JSystem/JAudio2/JASDSPInterface.h" +#include "JSystem/JHostIO/JORFile.h" #include "JSystem/JKernel/JKRArchive.h" +#include "JSystem/JKernel/JKRExpHeap.h" #include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JSupport/JSUMemoryStream.h" +#include "Z2AudioLib/SpotName.h" +#include "Z2AudioLib/Z2SceneMgr.h" Z2FxLineMgr::Z2FxLineMgr() : JASGlobalInstance(true) { mConfig = NULL; @@ -11,9 +17,9 @@ Z2FxLineMgr::Z2FxLineMgr() : JASGlobalInstance(true) { mFxDataNum = 0; mSetUnderWaterFx = false; - #if DEBUG +#if DEBUG mHIOEdit = NULL; - #endif +#endif } void Z2FxLineMgr::initDataArc(JKRArchive* arc, JKRHeap* heap) { @@ -35,42 +41,49 @@ void Z2FxLineMgr::initDataArc(JKRArchive* arc, JKRHeap* heap) { for (u8 i = 0; i < mFxDataNum; i++) { void* res = arc->getResource(i); - u32 size = (arc->getResSize(res) + 0x1f) & ~0x1f; + u32 size = ALIGN_NEXT(arc->getResSize(res), 32); JSUMemoryInputStream stream(res, size); - stream >> mConfig[i].field_0x0; - stream >> mConfig[i].field_0x1; - stream >> mConfig[i].field_0x2; - stream >> mConfig[i].field_0x3; - stream >> mConfig[i].field_0x4; - stream >> mConfig[i].field_0x6; - stream >> mConfig[i].field_0x8[0]; - stream >> mConfig[i].field_0x8[1]; - stream >> mConfig[i].field_0x8[2]; - stream >> mConfig[i].field_0x8[3]; - stream >> mConfig[i].field_0x8[4]; - stream >> mConfig[i].field_0x8[5]; - stream >> mConfig[i].field_0x8[6]; - stream >> mConfig[i].field_0x8[7]; - stream >> mConfig[i].field_0x18; - stream >> mConfig[i].field_0x19; - stream >> mConfig[i].field_0x1a; - stream >> mConfig[i].field_0x1b; - stream >> mConfig[i].field_0x1c; - stream >> mConfig[i].field_0x1e; - stream >> mConfig[i].field_0x20[0]; - stream >> mConfig[i].field_0x20[1]; - stream >> mConfig[i].field_0x20[2]; - stream >> mConfig[i].field_0x20[3]; - stream >> mConfig[i].field_0x20[4]; - stream >> mConfig[i].field_0x20[5]; - stream >> mConfig[i].field_0x20[6]; - stream >> mConfig[i].field_0x20[7]; + stream >> mConfig[i].unk0.unk0; + stream >> mConfig[i].unk0.unk1; + stream >> mConfig[i].unk0.unk2; + stream >> mConfig[i].unk0.unk3; + stream >> mConfig[i].unk0.unk4; + stream >> mConfig[i].unk0.unk6; + stream >> mConfig[i].unk0.unk8[0]; + stream >> mConfig[i].unk0.unk8[1]; + stream >> mConfig[i].unk0.unk8[2]; + stream >> mConfig[i].unk0.unk8[3]; + stream >> mConfig[i].unk0.unk8[4]; + stream >> mConfig[i].unk0.unk8[5]; + stream >> mConfig[i].unk0.unk8[6]; + stream >> mConfig[i].unk0.unk8[7]; + stream >> mConfig[i].unk18.unk0; + stream >> mConfig[i].unk18.unk1; + stream >> mConfig[i].unk18.unk2; + stream >> mConfig[i].unk18.unk3; + stream >> mConfig[i].unk18.unk4; + stream >> mConfig[i].unk18.unk6; + stream >> mConfig[i].unk18.unk8[0]; + stream >> mConfig[i].unk18.unk8[1]; + stream >> mConfig[i].unk18.unk8[2]; + stream >> mConfig[i].unk18.unk8[3]; + stream >> mConfig[i].unk18.unk8[4]; + stream >> mConfig[i].unk18.unk8[5]; + stream >> mConfig[i].unk18.unk8[6]; + stream >> mConfig[i].unk18.unk8[7]; JKRFree(res); } setLineID(-1, false, false); setLineID(-1, true, false); + +#if DEBUG + if (mHIOEdit) + mHIOEdit->update(false); + if (mHIOEdit) + mHIOEdit->update(true); +#endif } void Z2FxLineMgr::setLineID(s8 fxID, bool param_1, bool param_2) { @@ -101,51 +114,60 @@ void Z2FxLineMgr::setLine(Z2FxLineConfig* config, bool param_1, bool param_2) { } JASDsp::FxlineConfig_ dsp_config; - dsp_config.field_0x0 = config->field_0x0; - dsp_config.field_0x2 = config->field_0x1; - dsp_config.field_0x6 = config->field_0x2; + dsp_config.field_0x0 = config->unk0.unk0; + dsp_config.field_0x2 = config->unk0.unk1; + dsp_config.field_0x6 = config->unk0.unk2; if (param_2) { dsp_config.field_0x4 = 0; dsp_config.field_0x8 = 0; } else { - dsp_config.field_0x4 = config->field_0x4; - dsp_config.field_0x8 = config->field_0x6; + dsp_config.field_0x4 = config->unk0.unk4; + dsp_config.field_0x8 = config->unk0.unk6; } - dsp_config.field_0xc = config->field_0x3; - dsp_config.field_0x10[0] = config->field_0x8[0]; - dsp_config.field_0x10[1] = config->field_0x8[1]; - dsp_config.field_0x10[2] = config->field_0x8[2]; - dsp_config.field_0x10[3] = config->field_0x8[3]; - dsp_config.field_0x10[4] = config->field_0x8[4]; - dsp_config.field_0x10[5] = config->field_0x8[5]; - dsp_config.field_0x10[6] = config->field_0x8[6]; - dsp_config.field_0x10[7] = config->field_0x8[7]; + dsp_config.field_0xc = config->unk0.unk3; + dsp_config.field_0x10[0] = config->unk0.unk8[0]; + dsp_config.field_0x10[1] = config->unk0.unk8[1]; + dsp_config.field_0x10[2] = config->unk0.unk8[2]; + dsp_config.field_0x10[3] = config->unk0.unk8[3]; + dsp_config.field_0x10[4] = config->unk0.unk8[4]; + dsp_config.field_0x10[5] = config->unk0.unk8[5]; + dsp_config.field_0x10[6] = config->unk0.unk8[6]; + dsp_config.field_0x10[7] = config->unk0.unk8[7]; JASDsp::setFXLine(buf1, (s16*)mFxLineBuffer[buf1], &dsp_config); +#if DEBUG + if (mHIOEdit) + mHIOEdit->syncSetting(buf1, &dsp_config); +#endif - dsp_config.field_0x0 = config->field_0x18; - dsp_config.field_0x2 = config->field_0x19; - dsp_config.field_0x6 = config->field_0x1a; + dsp_config.field_0x0 = config->unk18.unk0; + dsp_config.field_0x2 = config->unk18.unk1; + dsp_config.field_0x6 = config->unk18.unk2; if (param_2) { dsp_config.field_0x4 = 0; dsp_config.field_0x8 = 0; } else { - dsp_config.field_0x4 = config->field_0x1c; - dsp_config.field_0x8 = config->field_0x1e; + dsp_config.field_0x4 = config->unk18.unk4; + dsp_config.field_0x8 = config->unk18.unk6; } - dsp_config.field_0xc = config->field_0x1b; - dsp_config.field_0x10[0] = config->field_0x20[0]; - dsp_config.field_0x10[1] = config->field_0x20[1]; - dsp_config.field_0x10[2] = config->field_0x20[2]; - dsp_config.field_0x10[3] = config->field_0x20[3]; - dsp_config.field_0x10[4] = config->field_0x20[4]; - dsp_config.field_0x10[5] = config->field_0x20[5]; - dsp_config.field_0x10[6] = config->field_0x20[6]; - dsp_config.field_0x10[7] = config->field_0x20[7]; + dsp_config.field_0xc = config->unk18.unk3; + dsp_config.field_0x10[0] = config->unk18.unk8[0]; + dsp_config.field_0x10[1] = config->unk18.unk8[1]; + dsp_config.field_0x10[2] = config->unk18.unk8[2]; + dsp_config.field_0x10[3] = config->unk18.unk8[3]; + dsp_config.field_0x10[4] = config->unk18.unk8[4]; + dsp_config.field_0x10[5] = config->unk18.unk8[5]; + dsp_config.field_0x10[6] = config->unk18.unk8[6]; + dsp_config.field_0x10[7] = config->unk18.unk8[7]; JASDsp::setFXLine(buf2, (s16*)mFxLineBuffer[buf2], &dsp_config); + +#if DEBUG + if (mHIOEdit) + mHIOEdit->syncSetting(buf2, &dsp_config); +#endif } void Z2FxLineMgr::setFxForceOff(bool param_0) { @@ -157,6 +179,11 @@ void Z2FxLineMgr::setUnderWaterFx(bool isUnderWaterFx) { if (isUnderWaterFx) { OS_REPORT("[Z2FxLineMgr::setUnderWaterFx] → underWaterFx!\n"); setLineID(12, true, false); + +#if DEBUG + if (mHIOEdit) + mHIOEdit->update(true); +#endif } else { OS_REPORT("[Z2FxLineMgr::setUnderWaterFx] → sceneFx!\n"); setSceneFx(Z2GetSceneMgr()->getCurrentSceneNum()); @@ -188,7 +215,7 @@ void Z2FxLineMgr::setSceneFx(s32 sceneNo) { case Z2SCENE_LAKE_LANTERN_CAVE: case Z2SCENE_FARON_WOODS_CAVE: if (Z2GetSceneMgr()->getCurrentRoomNum() == 2) { - return; + break; } // fallthrough case Z2SCENE_FARON_WOODS: @@ -238,4 +265,298 @@ void Z2FxLineMgr::setSceneFx(s32 sceneNo) { break; } } +#if DEBUG + if (mHIOEdit) + mHIOEdit->update(true); +#endif +} + +Z2FxLineEditNode::Z2FxLineEditNode(JKRExpHeap* heap) : JAHFrameNode("FxLineEdit"), mHeap(heap) { + JUT_ASSERT(340, mHeap); + unk74 = new (mHeap, 0) LineStereo(false); + appendNode(unk74, NULL); + unk78 = new (mHeap, 0) LineStereo(true); + appendNode(unk78, NULL); + Z2GetFxLineMgr()->setHIOEdit(this); +} + +void Z2FxLineEditNode::message(JAHControl& control) { + control.makeComment("Line0 : normal_mixing L", 0, 5, 0); + control.makeComment("Line1 : normal_mixing R", 0, 5, 0); + control.makeComment("Line2 : auto_mixing L", 0, 5, 0); + control.makeComment("Line3 : auto_mixing R", 0, 5, 0); + control.returnY(1); + control.makeComment("-- ミックスモード --", 0, 5, 0); + control.indent(1); + control.makeComment("DFX_MIX_STOP 非動作", 0, 5, 0); + control.makeComment("DFX_MIX_BEFORE 出力前にミキシング(第1反射音もFx効果あり)", 0, 5, 0); + control.makeComment("DFX_MIX_AFTER 出力後にミキシング(第1反射音はFx効果なし)", 0, 5, 0); + control.indent(-1); + control.makeComment("-- センド先 --", 0, 5, 0); + control.indent(1); + control.makeComment("DFXS_MAIN_L", 0, 5, 0); + control.makeComment("DFXS_MAIN_R", 0, 5, 0); + control.makeComment("DFXS_FX1", 0, 5, 0); + control.makeComment("DFXS_FX2", 0, 5, 0); + control.makeComment("DFXS_FX3", 0, 5, 0); + control.makeComment("DFXS_FX4", 0, 5, 0); + control.makeComment("DFXS_FM", 0, 5, 0); + control.makeComment("DFXS_DOLBY", 0, 5, 0); + control.makeComment("DFXS_REV", 0, 5, 0); + control.makeComment("DFXS_CHORUS", 0, 5, 0); + control.makeComment("DFXS_MONO", 0, 5, 0); + control.makeComment("DFXS_NONE", 0, 5, 0); + control.indent(-1); +} + +void Z2FxLineEditNode::syncSetting(u8 param_1, JASDsp::FxlineConfig_* config) { + JUT_ASSERT(387, config); + Z2FxLineConfigSingle* line_HIO; + switch (param_1) { + case 0: + line_HIO = &unk74->unk70.unk0; + break; + case 1: + line_HIO = &unk74->unk70.unk18; + break; + case 2: + line_HIO = &unk78->unk70.unk0; + break; + case 3: + line_HIO = &unk78->unk70.unk18; + break; + } + JUT_ASSERT(407, line_HIO); + line_HIO->unk0 = config->field_0x0; + line_HIO->unk1 = config->field_0x2; + line_HIO->unk4 = config->field_0x4; + line_HIO->unk2 = config->field_0x6; + line_HIO->unk6 = config->field_0x8; + line_HIO->unk3 = config->field_0xc; + line_HIO->unk8[0] = config->field_0x10[0]; + line_HIO->unk8[1] = config->field_0x10[1]; + line_HIO->unk8[2] = config->field_0x10[2]; + line_HIO->unk8[3] = config->field_0x10[3]; + line_HIO->unk8[4] = config->field_0x10[4]; + line_HIO->unk8[5] = config->field_0x10[5]; + line_HIO->unk8[6] = config->field_0x10[6]; + line_HIO->unk8[7] = config->field_0x10[7]; +} + +void Z2FxLineEditNode::update(bool param_1) { + if (param_1) + unk78->updateNode(); + else + unk74->updateNode(); +} + +static const char* cBfcMask = "bfcファイル(*.bfc)\0*.bfc\0"; + +void Z2FxLineEditNode::saveLine(LineStereo* node) { + JUT_ASSERT(436, node); + JORFile file; + if (file.open(NULL, 0x6, cBfcMask, NULL, NULL, NULL)) { + // clang-format off + JUT_ASSERT(441, mHeap!=0); + // clang-format on + u32 size = ALIGN_PREV(mHeap->getFreeSize(), 0x20); + JKRHeap* backup = JKRGetCurrentHeap(); + JKRSetCurrentHeap(mHeap); + void* saveBuffer = JKRAlloc(size, -1); + JUT_ASSERT(452, saveBuffer); + JKRSetCurrentHeap(backup); + + JSUMemoryOutputStream JStack_15c(saveBuffer, size); + JStack_15c << node->unk70.unk0.unk0; + JStack_15c << node->unk70.unk0.unk1; + JStack_15c << node->unk70.unk0.unk2; + JStack_15c << node->unk70.unk0.unk3; + JStack_15c << node->unk70.unk0.unk4; + JStack_15c << node->unk70.unk0.unk6; + JStack_15c << node->unk70.unk0.unk8[0]; + JStack_15c << node->unk70.unk0.unk8[1]; + JStack_15c << node->unk70.unk0.unk8[2]; + JStack_15c << node->unk70.unk0.unk8[3]; + JStack_15c << node->unk70.unk0.unk8[4]; + JStack_15c << node->unk70.unk0.unk8[5]; + JStack_15c << node->unk70.unk0.unk8[6]; + JStack_15c << node->unk70.unk0.unk8[7]; + JStack_15c << node->unk70.unk18.unk0; + JStack_15c << node->unk70.unk18.unk1; + JStack_15c << node->unk70.unk18.unk2; + JStack_15c << node->unk70.unk18.unk3; + JStack_15c << node->unk70.unk18.unk4; + JStack_15c << node->unk70.unk18.unk6; + JStack_15c << node->unk70.unk18.unk8[0]; + JStack_15c << node->unk70.unk18.unk8[1]; + JStack_15c << node->unk70.unk18.unk8[2]; + JStack_15c << node->unk70.unk18.unk8[3]; + JStack_15c << node->unk70.unk18.unk8[4]; + JStack_15c << node->unk70.unk18.unk8[5]; + JStack_15c << node->unk70.unk18.unk8[6]; + JStack_15c << node->unk70.unk18.unk8[7]; + file.writeData(saveBuffer, JStack_15c.getPosition()); + file.close(); + JKRFree(saveBuffer); + } else { + JAHUDialog_OK("セーブに失敗しました.", "save", NULL); + } +} + +void Z2FxLineEditNode::loadLine(LineStereo* node) { + JUT_ASSERT(436, node); + JORFile file; + void* dataArray = NULL; + u32 length = 0; + if (file.open(NULL, 0x1, cBfcMask, NULL, NULL, NULL)) { + length = ALIGN_NEXT(file.getFileSize(), 0x20); + dataArray = JKRAllocFromHeap(mHeap, length, 0x20); + JUT_ASSERT(517, dataArray); + u32 readSize = file.readData(dataArray, 0); + file.close(); + if (readSize < 1) { + JAHUDialog_OK("読み込み失敗。JORFile::readData()がfalseを返しました", "読み込み", NULL); + JKRFreeToHeap(mHeap, dataArray); + } + } else { + file.close(); + JAHUDialog_OK(JAHioUtil::getString("%s を読み込めません", file.getFilename()), + "データを読み込む", NULL); + } + + JSUMemoryInputStream stream(dataArray, length); + + stream >> node->unk70.unk0.unk0; + stream >> node->unk70.unk0.unk1; + stream >> node->unk70.unk0.unk2; + stream >> node->unk70.unk0.unk3; + stream >> node->unk70.unk0.unk4; + stream >> node->unk70.unk0.unk6; + stream >> node->unk70.unk0.unk8[0]; + stream >> node->unk70.unk0.unk8[1]; + stream >> node->unk70.unk0.unk8[2]; + stream >> node->unk70.unk0.unk8[3]; + stream >> node->unk70.unk0.unk8[4]; + stream >> node->unk70.unk0.unk8[5]; + stream >> node->unk70.unk0.unk8[6]; + stream >> node->unk70.unk0.unk8[7]; + stream >> node->unk70.unk18.unk0; + stream >> node->unk70.unk18.unk1; + stream >> node->unk70.unk18.unk2; + stream >> node->unk70.unk18.unk3; + stream >> node->unk70.unk18.unk4; + stream >> node->unk70.unk18.unk6; + stream >> node->unk70.unk18.unk8[0]; + stream >> node->unk70.unk18.unk8[1]; + stream >> node->unk70.unk18.unk8[2]; + stream >> node->unk70.unk18.unk8[3]; + stream >> node->unk70.unk18.unk8[4]; + stream >> node->unk70.unk18.unk8[5]; + stream >> node->unk70.unk18.unk8[6]; + stream >> node->unk70.unk18.unk8[7]; + + JKRFree(dataArray); + node->updateNode(); +} + +void Z2FxLineEditNode::LineStereo::message(JAHControl& control) { + control.makeButton("reset", 0, 3, 0); + control.makeButton("save file", 2, 3, 0); + control.makeButton("load file", 3, 3, 0); + control.returnY(1); + control.makeComment("----- Line L -----", 0, 5, 0); + control.indent(1); + lineEditSingle(&unk70.unk0, control); + control.indent(-1); + control.returnY(1); + control.makeComment("----- Line R -----", 0, 5, 0); + control.indent(1); + lineEditSingle(&unk70.unk18, control); + control.indent(-1); +} + +void Z2FxLineEditNode::LineStereo::propertyEvent(JAH_P_Event param_1, u32 param_2) { + if (param_1 == JAH_P_EVENT0) + return; + + Z2FxLineEditNode* parent = (Z2FxLineEditNode*)getParent(); + switch (param_2) { + case 0: + Z2GetFxLineMgr()->setLineID(-1, mIsDolby, false); + break; + + case 2: + parent->saveLine(this); + break; + + case 3: + parent->loadLine(this); + break; + } + + Z2GetFxLineMgr()->setLine(&unk70, mIsDolby, false); +} + +void Z2FxLineEditNode::LineStereo::lineEditSingle(Z2FxLineConfigSingle* param_1, + JAHControl& param_2) { + if (param_1 == NULL) + return; + + param_2.startComboBox("mixmode", ¶m_1->unk0, 3, 0); + param_2.makeComboBoxItem("DFX_MIX_STOP", (u8)0); + param_2.makeComboBoxItem("DFX_MIX_BEFORE", (u8)1); + param_2.makeComboBoxItem("DFX_MIX_AFTER", (u8)2); + param_2.endComboBox(); + + param_2.returnY(1); + + param_2.startComboBox("send1", ¶m_1->unk1, 3, 0); + param_2.makeComboBoxItem("DFXS_MAIN_L", (u8)0); + param_2.makeComboBoxItem("DFXS_MAIN_R", (u8)1); + param_2.makeComboBoxItem("DFXS_FX1", (u8)2); + param_2.makeComboBoxItem("DFXS_FX2", (u8)3); + param_2.makeComboBoxItem("DFXS_FX3", (u8)4); + param_2.makeComboBoxItem("DFXS_FX4", (u8)5); + param_2.makeComboBoxItem("DFXS_FM", (u8)6); + param_2.makeComboBoxItem("DFXS_DOLBY", (u8)7); + param_2.makeComboBoxItem("DFXS_REV", (u8)8); + param_2.makeComboBoxItem("DFXS_CHORUS", (u8)9); + param_2.makeComboBoxItem("DFXS_MONO", (u8)10); + param_2.makeComboBoxItem("DFXS_NONE", (u8)11); + param_2.endComboBox(); + + param_2.returnY(1); + param_2.makeSlider("mix1", ¶m_1->unk4, 0, 0x7fff, 0); + + param_2.startComboBox("send2", ¶m_1->unk2, 3, 0); + param_2.makeComboBoxItem("DFXS_MAIN_L", (u8)0); + param_2.makeComboBoxItem("DFXS_MAIN_R", (u8)1); + param_2.makeComboBoxItem("DFXS_FX1", (u8)2); + param_2.makeComboBoxItem("DFXS_FX2", (u8)3); + param_2.makeComboBoxItem("DFXS_FX3", (u8)4); + param_2.makeComboBoxItem("DFXS_FX4", (u8)5); + param_2.makeComboBoxItem("DFXS_FM", (u8)6); + param_2.makeComboBoxItem("DFXS_DOLBY", (u8)7); + param_2.makeComboBoxItem("DFXS_REV", (u8)8); + param_2.makeComboBoxItem("DFXS_CHORUS", (u8)9); + param_2.makeComboBoxItem("DFXS_MONO", (u8)10); + param_2.makeComboBoxItem("DFXS_NONE", (u8)11); + param_2.endComboBox(); + + param_2.returnY(1); + param_2.makeSlider("mix2", ¶m_1->unk6, 0, 0x7fff, 0); + + if (mIsDolby) + param_2.makeSlider("feedback_frame", ¶m_1->unk3, 0, 120, 0); + else + param_2.makeSlider("feedback_frame", ¶m_1->unk3, 0, 64, 0); + + param_2.makeSlider("feedback_filter 0", ¶m_1->unk8[0], -0x7fff, 0x7fff, 0); + param_2.makeSlider("feedback_filter 1", ¶m_1->unk8[1], -0x7fff, 0x7fff, 0); + param_2.makeSlider("feedback_filter 2", ¶m_1->unk8[2], -0x7fff, 0x7fff, 0); + param_2.makeSlider("feedback_filter 3", ¶m_1->unk8[3], -0x7fff, 0x7fff, 0); + param_2.makeSlider("feedback_filter 4", ¶m_1->unk8[4], -0x7fff, 0x7fff, 0); + param_2.makeSlider("feedback_filter 5", ¶m_1->unk8[5], -0x7fff, 0x7fff, 0); + param_2.makeSlider("feedback_filter 6", ¶m_1->unk8[6], -0x7fff, 0x7fff, 0); + param_2.makeSlider("feedback_filter 7", ¶m_1->unk8[7], -0x7fff, 0x7fff, 0); } diff --git a/src/Z2AudioLib/Z2SceneMgr.cpp b/src/Z2AudioLib/Z2SceneMgr.cpp index 9e3bf2c91c..13a53790db 100644 --- a/src/Z2AudioLib/Z2SceneMgr.cpp +++ b/src/Z2AudioLib/Z2SceneMgr.cpp @@ -12,6 +12,7 @@ #include "Z2AudioLib/Z2StatusMgr.h" #include "d/d_com_inf_game.h" #include +#include "Z2AudioLib/SpotName.h" Z2SceneMgr::Z2SceneMgr() : JASGlobalInstance(true) { sceneNum = -1; @@ -46,90 +47,6 @@ void Z2SceneMgr::setInDarkness(bool inDarkness) { } } -static char* sSpotName[81] = { - "F_SP00", - "F_SP103", - "R_SP01", - "F_SP104", - "R_SP107", - "F_SP108", - "R_SP108", - "F_SP117", - "F_SP109", - "R_SP109", - "R_SP209", - "F_SP110", - "R_SP110", - "F_SP111", - "F_SP128", - "R_SP128", - "F_SP115", - "F_SP112", - "F_SP126", - "F_SP127", - "R_SP127", - "F_SP113", - "F_SP116", - "R_SP116", - "R_SP160", - "R_SP161", - "F_SP114", - "F_SP118", - "F_SP124", - "F_SP125", - "F_SP121", - "F_SP122", - "F_SP123", - "F_SP200", - "F_SP102", - "", - "R_SP300", - "R_SP301", - "T_ENEMY", - "D_MN54", - "D_MN05", - "D_MN05B", - "D_MN05A", - "D_MN04", - "D_MN04B", - "D_MN04A", - "D_MN01", - "D_MN01B", - "D_MN01A", - "D_MN10", - "D_MN10B", - "D_MN10A", - "D_MN11", - "D_MN11B", - "D_MN11A", - "D_MN06", - "D_MN06B", - "D_MN06A", - "D_MN07", - "D_MN07B", - "D_MN07A", - "D_MN08", - "D_MN08B", - "D_MN08C", - "D_MN08A", - "D_MN08D", - "D_MN09", - "D_MN09A", - "D_MN09B", - "D_MN09C", - "D_SB00", - "D_SB01", - "D_SB02", - "D_SB03", - "D_SB04", - "D_SB05", - "D_SB06", - "D_SB07", - "D_SB08", - "D_SB09", - "D_SB10", -}; - void Z2SceneMgr::setSceneExist(bool isSceneExist) { sceneExist = isSceneExist; timer = 0; diff --git a/src/Z2AudioLib/Z2SeqMgr.cpp b/src/Z2AudioLib/Z2SeqMgr.cpp index a9cad68b5e..16a9279cce 100644 --- a/src/Z2AudioLib/Z2SeqMgr.cpp +++ b/src/Z2AudioLib/Z2SeqMgr.cpp @@ -8,90 +8,7 @@ #include "Z2AudioLib/Z2Calc.h" #include "JSystem/JAudio2/JAISoundChild.h" #include "JSystem/JAudio2/JAISeq.h" - -static const char* sSpotName[] = { - "F_SP00", - "F_SP103", - "R_SP01", - "F_SP104", - "R_SP107", - "F_SP108", - "R_SP108", - "F_SP117", - "F_SP109", - "R_SP109", - "R_SP209", - "F_SP110", - "R_SP110", - "F_SP111", - "F_SP128", - "R_SP128", - "F_SP115", - "F_SP112", - "F_SP126", - "F_SP127", - "R_SP127", - "F_SP113", - "F_SP116", - "R_SP116", - "R_SP160", - "R_SP161", - "F_SP114", - "F_SP118", - "F_SP124", - "F_SP125", - "F_SP121", - "F_SP122", - "F_SP123", - "F_SP200", - "F_SP102", - "", - "R_SP300", - "R_SP301", - "T_ENEMY", - "D_MN54", - "D_MN05", - "D_MN05B", - "D_MN05A", - "D_MN04", - "D_MN04B", - "D_MN04A", - "D_MN01", - "D_MN01B", - "D_MN01A", - "D_MN10", - "D_MN10B", - "D_MN10A", - "D_MN11", - "D_MN11B", - "D_MN11A", - "D_MN06", - "D_MN06B", - "D_MN06A", - "D_MN07", - "D_MN07B", - "D_MN07A", - "D_MN08", - "D_MN08B", - "D_MN08C", - "D_MN08A", - "D_MN08D", - "D_MN09", - "D_MN09A", - "D_MN09B", - "D_MN09C", - "D_SB00", - "D_SB01", - "D_SB02", - "D_SB03", - "D_SB04", - "D_SB05", - "D_SB06", - "D_SB07", - "D_SB08", - "D_SB09", - "D_SB10", -}; +#include "Z2AudioLib/SpotName.h" Z2SeqMgr::Z2SeqMgr() : JASGlobalInstance(true) { mMainBgmMaster.forceIn(); diff --git a/src/Z2AudioLib/Z2StatusMgr.cpp b/src/Z2AudioLib/Z2StatusMgr.cpp index fd907b48c8..a044b552b6 100644 --- a/src/Z2AudioLib/Z2StatusMgr.cpp +++ b/src/Z2AudioLib/Z2StatusMgr.cpp @@ -3,90 +3,7 @@ #include "d/d_com_inf_game.h" #include "d/d_s_play.h" #include - -static const char* sSpotName[] = { - "F_SP00", - "F_SP103", - "R_SP01", - "F_SP104", - "R_SP107", - "F_SP108", - "R_SP108", - "F_SP117", - "F_SP109", - "R_SP109", - "R_SP209", - "F_SP110", - "R_SP110", - "F_SP111", - "F_SP128", - "R_SP128", - "F_SP115", - "F_SP112", - "F_SP126", - "F_SP127", - "R_SP127", - "F_SP113", - "F_SP116", - "R_SP116", - "R_SP160", - "R_SP161", - "F_SP114", - "F_SP118", - "F_SP124", - "F_SP125", - "F_SP121", - "F_SP122", - "F_SP123", - "F_SP200", - "F_SP102", - "", - "R_SP300", - "R_SP301", - "T_ENEMY", - "D_MN54", - "D_MN05", - "D_MN05B", - "D_MN05A", - "D_MN04", - "D_MN04B", - "D_MN04A", - "D_MN01", - "D_MN01B", - "D_MN01A", - "D_MN10", - "D_MN10B", - "D_MN10A", - "D_MN11", - "D_MN11B", - "D_MN11A", - "D_MN06", - "D_MN06B", - "D_MN06A", - "D_MN07", - "D_MN07B", - "D_MN07A", - "D_MN08", - "D_MN08B", - "D_MN08C", - "D_MN08A", - "D_MN08D", - "D_MN09", - "D_MN09A", - "D_MN09B", - "D_MN09C", - "D_SB00", - "D_SB01", - "D_SB02", - "D_SB03", - "D_SB04", - "D_SB05", - "D_SB06", - "D_SB07", - "D_SB08", - "D_SB09", - "D_SB10", -}; +#include "Z2AudioLib/SpotName.h" Z2StatusMgr::Z2StatusMgr() : JASGlobalInstance(true) { mHour = 0; diff --git a/src/Z2AudioLib/Z2WolfHowlMgr.cpp b/src/Z2AudioLib/Z2WolfHowlMgr.cpp index 5f34fab19c..d76bd9b82f 100644 --- a/src/Z2AudioLib/Z2WolfHowlMgr.cpp +++ b/src/Z2AudioLib/Z2WolfHowlMgr.cpp @@ -6,6 +6,7 @@ #include "Z2AudioLib/Z2SoundMgr.h" #include "Z2AudioLib/Z2Audience.h" #include "d/d_demo.h" +#include "Z2AudioLib/SpotName.h" static f32 cPitchDown = 0.8909f; From 4309cd2aa5e75a49b5764fe9508b7ab0df7f40c8 Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Thu, 26 Mar 2026 21:56:04 -0400 Subject: [PATCH 17/19] object-particle debug almost matching (#3136) --- config/ShieldD/symbols.txt | 2 +- .../JStudio/JStudio_JParticle/control.h | 103 +---- .../JStudio_JParticle/object-particle.h | 96 +++++ .../src/JStudio/JStudio_JParticle/control.cpp | 5 +- .../JStudio_JParticle/object-particle.cpp | 393 ++++++++++++------ 5 files changed, 365 insertions(+), 234 deletions(-) diff --git a/config/ShieldD/symbols.txt b/config/ShieldD/symbols.txt index c894bc2a0f..40ee1e8b06 100644 --- a/config/ShieldD/symbols.txt +++ b/config/ShieldD/symbols.txt @@ -64708,7 +64708,7 @@ sBusTransactionMax__14J3DUMemRequest = .sbss:0x8074CBA8; // type:object size:0x4 soOutput_none___Q27JStudio14TVariableValue = .sbss:0x8074CBB0; // type:object size:0x4 scope:global hash:0x0D4DD37E dhash:0xBE028BCF lbl_8074CBB8 = .sbss:0x8074CBB8; // type:object size:0x1 data:byte hash:0xD1337E25 dhash:0xE17C2A90 sInstance__38JASGlobalInstance<17JAUSoundNameTable> = .sbss:0x8074CBBC; // type:object size:0x4 scope:global data:4byte hash:0xC9602A2E dhash:0x8CFDFF83 -lbl_8074CBC0 = .sbss:0x8074CBC0; // type:object size:0x1 data:byte hash:0xD7A40583 dhash:0x59B8D7B7 +@GUARD@adaptor_do_prepare__Q217JStudio_JParticle17TAdaptor_particleFv@aoData = .sbss:0x8074CBC0; // type:object size:0x1 data:byte hash:0xD7A40583 dhash:0x59B8D7B7 oColor_default_frame___Q218JStudioToolLibrary15TScroll_drawBar = .sbss:0x8074CBC8; // type:object size:0x4 scope:global hash:0x21F3055A dhash:0xF4CA98D4 oColor_default_background___Q218JStudioToolLibrary15TScroll_drawBar = .sbss:0x8074CBCC; // type:object size:0x4 scope:global hash:0x7BF46BA9 dhash:0x05043C07 oColor_default_foreground___Q218JStudioToolLibrary15TScroll_drawBar = .sbss:0x8074CBD0; // type:object size:0x4 scope:global hash:0xE3363F1C dhash:0xF78E1792 diff --git a/libs/JSystem/include/JSystem/JStudio/JStudio_JParticle/control.h b/libs/JSystem/include/JSystem/JStudio/JStudio_JParticle/control.h index 4dd6433d08..044b865f1b 100644 --- a/libs/JSystem/include/JSystem/JStudio/JStudio_JParticle/control.h +++ b/libs/JSystem/include/JSystem/JStudio/JStudio_JParticle/control.h @@ -27,7 +27,7 @@ struct TCreateObject : public JStudio::TCreateObject { createObject_JPA_PARTICLE_(JStudio::stb::data::TParse_TBlock_object const&, JStudio_JParticle::TCreateObject*); - const JStage::TSystem* get_pJSGSystem_() { return pJSGSystem_; } + const JStage::TSystem* get_pJSGSystem_() const { return pJSGSystem_; } bool isPermit_onExit_notEnd() { return mPermit_onExit_notEnd; } /* 0x0C */ JPAEmitterManager* pJPAEmitterManager_; @@ -35,107 +35,6 @@ struct TCreateObject : public JStudio::TCreateObject { /* 0x14 */ bool mPermit_onExit_notEnd; }; -struct TAdaptor_particle : public JStudio::TAdaptor_particle { - typedef JStudio::TObject_particle ObjectType; - - struct TJPACallback_emitter_ : public JPAEmitterCallBack { - TJPACallback_emitter_(TAdaptor_particle* param_1) { - pThis_ = param_1; - pOld = NULL; - JUT_ASSERT(113, pThis_!=NULL); - } - virtual void execute(JPABaseEmitter*); - virtual void executeAfter(JPABaseEmitter*); - virtual void draw(JPABaseEmitter*); - virtual void drawAfter(JPABaseEmitter*); - - JPAEmitterCallBack* getOld() { return pOld; } - void setOld(JPAEmitterCallBack* cb) { pOld = cb; } - - /* 0x4 */ TAdaptor_particle* pThis_; - /* 0x8 */ JPAEmitterCallBack* pOld; - }; - - struct TJPAEmitter_stopDrawParticle_ { - TJPAEmitter_stopDrawParticle_(JPABaseEmitter* emitter) : pJPAEmitter_(emitter) {} - ~TJPAEmitter_stopDrawParticle_() { - if (pJPAEmitter_ != NULL) { - pJPAEmitter_->stopDrawParticle(); - } - } - void set(JPABaseEmitter* emitter) { pJPAEmitter_ = emitter; } - /* 0x0 */ JPABaseEmitter* pJPAEmitter_; - }; - - TAdaptor_particle(JStudio_JParticle::TCreateObject*); - void beginParticle_fadeIn_(); - void endParticle_fadeOut_(u32); - - virtual ~TAdaptor_particle(); - virtual void adaptor_do_prepare(); - virtual void adaptor_do_end(); - virtual void adaptor_do_update(u32); - virtual void adaptor_do_PARTICLE(JStudio::data::TEOperationData, void const*, u32); - virtual void adaptor_do_BEGIN(JStudio::data::TEOperationData, void const*, u32); - virtual void adaptor_do_BEGIN_FADE_IN(JStudio::data::TEOperationData, void const*, - u32); - virtual void adaptor_do_END(JStudio::data::TEOperationData, void const*, u32); - virtual void adaptor_do_END_FADE_OUT(JStudio::data::TEOperationData, void const*, - u32); - virtual void adaptor_do_PARENT(JStudio::data::TEOperationData, void const*, u32); - virtual void adaptor_do_PARENT_NODE(JStudio::data::TEOperationData, void const*, - u32); - virtual void adaptor_do_PARENT_ENABLE(JStudio::data::TEOperationData, void const*, - u32); - virtual void adaptor_do_PARENT_FUNCTION(JStudio::data::TEOperationData, void const*, - u32); - virtual void adaptor_do_REPEAT(JStudio::data::TEOperationData, void const*, u32); - virtual void adaptor_do_ON_EXIT_NOT_END(JStudio::data::TEOperationData, void const*, - u32); - - static bool state_isFade_(u8 param_1) { - return param_1 == 1 || param_1 == 3; - } - - bool state_isFade_() { - return state_isFade_(field_0x1b8); - } - - void beginParticle_fadeIn_(u32 param_1) { - field_0x1c8 = param_1; - beginParticle_fadeIn_(); - } - - void beginParticle_() { - beginParticle_fadeIn_(0); - } - - void endParticle_() { - if (pJPAEmitter_ != NULL) { - pJPAEmitter_->becomeInvalidEmitter(); - } - } - - void set_bPermit_onExit_notEnd_(bool param_1) { field_0x1b4 = param_1; } - - /* 0x1A0 */ TCreateObject* pCreateObject_; - /* 0x1A4 */ JPABaseEmitter* pJPAEmitter_; - /* 0x1A8 */ TJPACallback_emitter_ field_0x1a8; - /* 0x1B4 */ u8 field_0x1b4; - /* 0x1B5 */ u8 field_0x1b5; - /* 0x1B6 */ u8 field_0x1b6; - /* 0x1B7 */ u8 field_0x1b7; - /* 0x1B8 */ u8 field_0x1b8; - /* 0x1BC */ u32 field_0x1bc; - /* 0x1C0 */ u32 u32FadeTime_end; - /* 0x1C4 */ u32 field_0x1c4; - /* 0x1C8 */ u32 field_0x1c8; - /* 0x1CC */ u32 field_0x1cc; - /* 0x1D0 */ JStage::TObject* field_0x1d0; - /* 0x1D4 */ u32 field_0x1d4; - /* 0x1D8 */ u8 field_0x1d8; -}; - }; // namespace JStudio_JParticle #endif /* JSTUDIO_JPARTICLE_CONTROL_H */ diff --git a/libs/JSystem/include/JSystem/JStudio/JStudio_JParticle/object-particle.h b/libs/JSystem/include/JSystem/JStudio/JStudio_JParticle/object-particle.h index c887a183ee..3dba0e0a31 100644 --- a/libs/JSystem/include/JSystem/JStudio/JStudio_JParticle/object-particle.h +++ b/libs/JSystem/include/JSystem/JStudio/JStudio_JParticle/object-particle.h @@ -3,4 +3,100 @@ #include "JSystem/JStudio/JStudio_JParticle/control.h" +namespace JStudio_JParticle { + +struct TAdaptor_particle : public JStudio::TAdaptor_particle { + typedef JStudio::TObject_particle ObjectType; + + struct TJPACallback_emitter_ : public JPAEmitterCallBack { + TJPACallback_emitter_(TAdaptor_particle* param_1) { + pThis_ = param_1; + pOld = NULL; + JUT_ASSERT(113, pThis_!=NULL); + } + virtual void execute(JPABaseEmitter*); + virtual void executeAfter(JPABaseEmitter*); + virtual void draw(JPABaseEmitter*); + virtual void drawAfter(JPABaseEmitter*); + + JPAEmitterCallBack* getOld() const { return pOld; } + void setOld(JPAEmitterCallBack* cb) { pOld = cb; } + + /* 0x4 */ TAdaptor_particle* pThis_; + /* 0x8 */ JPAEmitterCallBack* pOld; + }; + + TAdaptor_particle(JStudio_JParticle::TCreateObject*); + void beginParticle_fadeIn_(); + void endParticle_fadeOut_(u32); + + virtual ~TAdaptor_particle(); + virtual void adaptor_do_prepare(); + virtual void adaptor_do_end(); + virtual void adaptor_do_update(u32); + virtual void adaptor_do_PARTICLE(JStudio::data::TEOperationData, void const*, u32); + virtual void adaptor_do_BEGIN(JStudio::data::TEOperationData, void const*, u32); + virtual void adaptor_do_BEGIN_FADE_IN(JStudio::data::TEOperationData, void const*, + u32); + virtual void adaptor_do_END(JStudio::data::TEOperationData, void const*, u32); + virtual void adaptor_do_END_FADE_OUT(JStudio::data::TEOperationData, void const*, + u32); + virtual void adaptor_do_PARENT(JStudio::data::TEOperationData, void const*, u32); + virtual void adaptor_do_PARENT_NODE(JStudio::data::TEOperationData, void const*, + u32); + virtual void adaptor_do_PARENT_ENABLE(JStudio::data::TEOperationData, void const*, + u32); + virtual void adaptor_do_PARENT_FUNCTION(JStudio::data::TEOperationData, void const*, + u32); + virtual void adaptor_do_REPEAT(JStudio::data::TEOperationData, void const*, u32); + virtual void adaptor_do_ON_EXIT_NOT_END(JStudio::data::TEOperationData, void const*, + u32); + + static const char* toString_state_(int param_1); + + static bool state_isFade_(u8 param_1) { + return param_1 == 1 || param_1 == 3; + } + + bool state_isFade_() const { + return state_isFade_(field_0x1b8); + } + + void beginParticle_fadeIn_(u32 param_1) { + field_0x1c8 = param_1; + beginParticle_fadeIn_(); + } + + void beginParticle_() { + beginParticle_fadeIn_(0); + } + + void endParticle_() { + if (pJPAEmitter_ != NULL) { + pJPAEmitter_->becomeInvalidEmitter(); + } + } + + void set_bPermit_onExit_notEnd_(bool param_1) { field_0x1b4 = param_1; } + + /* 0x1A0 */ TCreateObject* pCreateObject_; + /* 0x1A4 */ JPABaseEmitter* pJPAEmitter_; + /* 0x1A8 */ TJPACallback_emitter_ field_0x1a8; + /* 0x1B4 */ u8 field_0x1b4; + /* 0x1B5 */ bool field_0x1b5; + /* 0x1B6 */ bool field_0x1b6; + /* 0x1B7 */ u8 field_0x1b7; + /* 0x1B8 */ u8 field_0x1b8; + /* 0x1BC */ u32 field_0x1bc; + /* 0x1C0 */ u32 u32FadeTime_end_; + /* 0x1C4 */ u32 u32FadeTime_current_; + /* 0x1C8 */ u32 field_0x1c8; + /* 0x1CC */ u32 field_0x1cc; + /* 0x1D0 */ JStage::TObject* field_0x1d0; + /* 0x1D4 */ u32 field_0x1d4; + /* 0x1D8 */ bool field_0x1d8; +}; + +} // namespace JStudio_JParticle + #endif /* OBJECT_PARTICLE_H */ diff --git a/libs/JSystem/src/JStudio/JStudio_JParticle/control.cpp b/libs/JSystem/src/JStudio/JStudio_JParticle/control.cpp index 1f25f43f66..18f23973c6 100644 --- a/libs/JSystem/src/JStudio/JStudio_JParticle/control.cpp +++ b/libs/JSystem/src/JStudio/JStudio_JParticle/control.cpp @@ -4,9 +4,10 @@ #include "JSystem/JSystem.h" // IWYU pragma: keep -#include "JSystem/JStudio/JStudio_JParticle/control.h" -#include "JSystem/JParticle/JPAEmitterManager.h" #include "JSystem/JGadget/pointer.h" +#include "JSystem/JParticle/JPAEmitterManager.h" +#include "JSystem/JStudio/JStudio_JParticle/control.h" +#include "JSystem/JStudio/JStudio_JParticle/object-particle.h" JStudio_JParticle::TCreateObject::~TCreateObject() {} diff --git a/libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp b/libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp index 0346ccd812..dfac0bf441 100644 --- a/libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp +++ b/libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp @@ -7,8 +7,36 @@ #include "JSystem/JStudio/JStudio_JParticle/object-particle.h" #include "JSystem/JStudio/JStudio_JStage/control.h" -JStudio_JParticle::TAdaptor_particle::TAdaptor_particle( - JStudio_JParticle::TCreateObject* param_1) : +namespace JStudio_JParticle { +namespace { + +struct TJPAEmitter_stopDrawParticle_ { + TJPAEmitter_stopDrawParticle_(JPABaseEmitter* emitter) : pJPAEmitter_(emitter) {} + ~TJPAEmitter_stopDrawParticle_() { + if (pJPAEmitter_ != NULL) { + pJPAEmitter_->stopDrawParticle(); + } + } + void set(JPABaseEmitter* emitter) { pJPAEmitter_ = emitter; } + /* 0x0 */ JPABaseEmitter* pJPAEmitter_; +}; + +class TToString_u32ID_ { +public: + TToString_u32ID_() {} + + const char* operator()(u32 param_1) { + snprintf(buf, sizeof(buf), "0x%08x", param_1); + return buf; + } + +private: + char buf[11]; +}; + +} // anonymous namespace + +TAdaptor_particle::TAdaptor_particle(TCreateObject* param_1) : pCreateObject_(param_1), pJPAEmitter_(NULL), field_0x1a8(this) { @@ -18,8 +46,8 @@ JStudio_JParticle::TAdaptor_particle::TAdaptor_particle( field_0x1b7 = 0; field_0x1b8 = 0; field_0x1bc = -1; - u32FadeTime_end = 0; - field_0x1c4 = 0; + u32FadeTime_end_ = 0; + u32FadeTime_current_ = 0; field_0x1c8 = 0; field_0x1cc = 0; field_0x1d0 = NULL; @@ -28,7 +56,7 @@ JStudio_JParticle::TAdaptor_particle::TAdaptor_particle( JUT_ASSERT(90, pCreateObject_!=NULL); } -JStudio_JParticle::TAdaptor_particle::~TAdaptor_particle() { +TAdaptor_particle::~TAdaptor_particle() { if (pJPAEmitter_ != NULL) { if (field_0x1b6 == 0) { pCreateObject_->emitter_destroy(pJPAEmitter_); @@ -36,48 +64,65 @@ JStudio_JParticle::TAdaptor_particle::~TAdaptor_particle() { pJPAEmitter_->setEmitterCallBackPtr(field_0x1a8.getOld()); pJPAEmitter_->quitImmortalEmitter(); } else { + JGADGET_WARNMSG(116, "not permitted : not-end on exit\n demo-object : " << adaptor_getID_string()); pCreateObject_->emitter_destroy(pJPAEmitter_); } } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_prepare() { - static JStudio::TAdaptor::TSetVariableValue_immediate aoData[18] = { - JStudio::TAdaptor::TSetVariableValue_immediate(0, 0.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(1, 0.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(2, 0.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(3, 0.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(4, 0.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(5, 0.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(6, 1.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(7, 1.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(8, 1.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(9, 255.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(10, 255.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(11, 255.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(12, 255.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(13, 255.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(14, 255.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(15, 255.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(16, 255.0f), - JStudio::TAdaptor::TSetVariableValue_immediate(), +void TAdaptor_particle::adaptor_do_prepare() { + static TSetVariableValue_immediate aoData[18] = { + TSetVariableValue_immediate(0, 0.0f), + TSetVariableValue_immediate(1, 0.0f), + TSetVariableValue_immediate(2, 0.0f), + TSetVariableValue_immediate(3, 0.0f), + TSetVariableValue_immediate(4, 0.0f), + TSetVariableValue_immediate(5, 0.0f), + TSetVariableValue_immediate(6, 1.0f), + TSetVariableValue_immediate(7, 1.0f), + TSetVariableValue_immediate(8, 1.0f), + TSetVariableValue_immediate(9, 255.0f), + TSetVariableValue_immediate(10, 255.0f), + TSetVariableValue_immediate(11, 255.0f), + TSetVariableValue_immediate(12, 255.0f), + TSetVariableValue_immediate(13, 255.0f), + TSetVariableValue_immediate(14, 255.0f), + TSetVariableValue_immediate(15, 255.0f), + TSetVariableValue_immediate(16, 255.0f), + TSetVariableValue_immediate(), }; adaptor_setVariableValue_immediate(aoData); } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_end() { +void TAdaptor_particle::adaptor_do_end() { +#if DEBUG + if (field_0x1b8 == 0) { + JUT_ASSERT(160, pJPAEmitter_==NULL); + return; + } + + JUT_ASSERT(163, pJPAEmitter_!=NULL); + + if (!state_isFade_()) { + return; + } + + JUT_ASSERT(166, u32FadeTime_current_getControl(); - JUT_ASSERT(181, pControl != NULL); - if (u32FadeTime_end != 0 && field_0x1c4 < u32FadeTime_end) { + JUT_ASSERT(181, pControl!=NULL); + if (u32FadeTime_end_ != 0 && u32FadeTime_current_ < u32FadeTime_end_) { JUT_ASSERT(187, state_isFade_()); - JUT_ASSERT(188, pJPAEmitter_ != NULL); - field_0x1c4 += param_1; - if (field_0x1c4 >= u32FadeTime_end) { + JUT_ASSERT(188, pJPAEmitter_!=NULL); + u32FadeTime_current_ += param_1; + if (u32FadeTime_current_ >= u32FadeTime_end_) { switch (field_0x1b8) { case 1: field_0x1b8 = 2; @@ -87,9 +132,11 @@ void JStudio_JParticle::TAdaptor_particle::adaptor_do_update(u32 param_1) { pJPAEmitter_ = NULL; field_0x1b8 = 0; break; + default: + JUT_ASSERT(203, false); } - u32FadeTime_end = 0; - field_0x1c4 = 0; + u32FadeTime_end_ = 0; + u32FadeTime_current_ = 0; } } else { JUT_ASSERT(210, !state_isFade_()); @@ -99,139 +146,206 @@ void JStudio_JParticle::TAdaptor_particle::adaptor_do_update(u32 param_1) { } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_PARTICLE( +void TAdaptor_particle::adaptor_do_PARTICLE( JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { - if (param_1 == JStudio::data::UNK_0x19) { - JUT_ASSERT(232, uSize==4); - JUT_ASSERT(233, pContent!=NULL); - field_0x1bc = *(u32*)pContent; + switch (param_1) { + case JStudio::data::UNK_0x19: { + JUT_ASSERT(232, pContent!=NULL); + JUT_ASSERT(233, uSize==4); + u32 var_r29 = *(u32*)pContent; + field_0x1bc = var_r29; + break; + } + default: + JGADGET_WARNMSG(241, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_BEGIN(JStudio::data::TEOperationData param_1, +void TAdaptor_particle::adaptor_do_BEGIN(JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { switch (param_1) { case JStudio::data::UNK_0x1: JUT_ASSERT(253, uSize==0); beginParticle_(); break; + default: + JGADGET_WARNMSG(259, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_BEGIN_FADE_IN( +void TAdaptor_particle::adaptor_do_BEGIN_FADE_IN( JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { switch (param_1) { - case JStudio::data::UNK_0x2: + case JStudio::data::UNK_0x2: { JUT_ASSERT(272, pContent!=NULL); JUT_ASSERT(273, uSize==4); - beginParticle_fadeIn_(*(f32*)pContent); + u32 var_r29 = *(f32*)pContent; + beginParticle_fadeIn_(var_r29); break; } + default: + JGADGET_WARNMSG(282, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); + } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_END(JStudio::data::TEOperationData param_1, +void TAdaptor_particle::adaptor_do_END(JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { - if (param_1 == JStudio::data::UNK_0x1) { + switch (param_1) { + case JStudio::data::UNK_0x1: JUT_ASSERT(294, uSize==0); endParticle_(); - } -} - -void JStudio_JParticle::TAdaptor_particle::adaptor_do_END_FADE_OUT( - JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { - switch (param_1) { - case JStudio::data::UNK_0x2: - JUT_ASSERT(336, pContent!=NULL); - JUT_ASSERT(337, uSize==4); - endParticle_fadeOut_(*(f32*)pContent); break; + default: + JGADGET_WARNMSG(300, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_PARENT( +void TAdaptor_particle::adaptor_do_END_FADE_OUT( JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { switch (param_1) { - case JStudio::data::UNK_0x18: + case JStudio::data::UNK_0x2: { JUT_ASSERT(313, pContent!=NULL); JUT_ASSERT(314, uSize==4); + u32 var_r29 = *(f32*)pContent; + endParticle_fadeOut_(var_r29); + break; + } + default: + JGADGET_WARNMSG(323, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); + } +} + +void TAdaptor_particle::adaptor_do_PARENT( + JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { + switch (param_1) { + case JStudio::data::UNK_0x18: { + JUT_ASSERT(336, pContent!=NULL); + JUT_ASSERT(337, uSize>0); + + const char* szID = (const char*)pContent; + JGADGET_ASSERTWARN(339, szID[uSize-1]=='\0'); + field_0x1d0 = NULL; const JStage::TSystem* pJSGSystem = pCreateObject_->get_pJSGSystem_(); JUT_ASSERT(345, pJSGSystem!=NULL); JStage::TObject* pJSGObject; - if (pJSGSystem->JSGFindObject(&pJSGObject, (const char*)pContent, JStage::OBJECT_UNDEFINED) == 0) { - JUT_ASSERT(354, pJSGObject!=NULL); - field_0x1d0 = pJSGObject; + if (pJSGSystem->JSGFindObject(&pJSGObject, szID, JStage::OBJECT_UNDEFINED) != 0) { + JGADGET_WARNMSG(351, "object not found as parent : " << szID << "\n demo-object : " << adaptor_getID_string()); + break; } + + JUT_ASSERT(354, pJSGObject!=NULL); + field_0x1d0 = pJSGObject; break; } + default: + JGADGET_WARNMSG(361, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); + } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_PARENT_NODE( +void TAdaptor_particle::adaptor_do_PARENT_NODE( JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { switch (param_1) { - case JStudio::data::UNK_0x18: - if (field_0x1d0 != NULL) { - JUT_ASSERT(380, pContent!=NULL); - JUT_ASSERT(381, uSize==4); - field_0x1d4 = field_0x1d0->JSGFindNodeID((const char*)pContent); - if (field_0x1d4 == -1) { - return; - } + case JStudio::data::UNK_0x18: { + if (field_0x1d0 == NULL) { + JGADGET_WARNMSG(377, "object not specified as parent\n demo-object : " << adaptor_getID_string()); + break; } - break; + JUT_ASSERT(380, pContent!=NULL); + JUT_ASSERT(381, uSize>0); + const char* szID = (const char*)pContent; + JGADGET_ASSERTWARN(383, szID[uSize-1]=='\0'); + field_0x1d4 = field_0x1d0->JSGFindNodeID(szID); + if (field_0x1d4 != -1) { + return; + } else { + JGADGET_WARNMSG(388, "node not found about parent : " << szID << "\n demo-object : " << adaptor_getID_string()); + return; + } + } case JStudio::data::UNK_0x19: - JUT_ASSERT(397, uSize==4); - JUT_ASSERT(396, pContent!=NULL); + JUT_ASSERT(396, uSize==4); + JUT_ASSERT(397, pContent!=NULL); field_0x1d4 = *(u32*)pContent; break; + default: + JGADGET_WARNMSG(404, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_PARENT_ENABLE(JStudio::data::TEOperationData param_1, +const char* TAdaptor_particle::toString_state_(int param_1) { + static const char* const asz[] = {"none", "begin", "stable", "end"}; + return JGadget::toStringFromIndex(param_1, asz, ARRAY_SIZE(asz), "(undefined)"); +} + +void TAdaptor_particle::adaptor_do_PARENT_ENABLE(JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { - if (param_1 == JStudio::data::UNK_0x2) { + switch (param_1) { + case JStudio::data::UNK_0x2: { JUT_ASSERT(417, uSize==4); JUT_ASSERT(418, pContent!=NULL); - field_0x1d8 = *(u32*)pContent ? 1 : 0; + u32 var_r29 = *(u32*)pContent; + field_0x1d8 = var_r29 != 0; + break; + } + default: + JGADGET_WARNMSG(426, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_PARENT_FUNCTION(JStudio::data::TEOperationData param_1, +void TAdaptor_particle::adaptor_do_PARENT_FUNCTION(JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { - if (param_1 == JStudio::data::UNK_0x2) { + switch (param_1) { + case JStudio::data::UNK_0x2: { JUT_ASSERT(439, uSize==4); - JUT_ASSERT(439, pContent!=NULL); - field_0x1cc = *(u32*)pContent; + JUT_ASSERT(440, pContent!=NULL); + u32 var_r29 = *(u32*)pContent; + field_0x1cc = var_r29; + break; + } + default: + JGADGET_WARNMSG(447, "unknown data-type : " << param_1); } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_REPEAT(JStudio::data::TEOperationData param_1, +void TAdaptor_particle::adaptor_do_REPEAT(JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { - if (param_1 == JStudio::data::UNK_0x2) { + switch (param_1) { + case JStudio::data::UNK_0x2: { JUT_ASSERT(460, uSize==4); JUT_ASSERT(461, pContent!=NULL); - field_0x1b5 = *(u32*)pContent ? 1 : 0; + u32 var_r29 = *(u32*)pContent; + field_0x1b5 = var_r29 != 0; + break; + } + default: + JGADGET_WARNMSG(469, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); } } -void JStudio_JParticle::TAdaptor_particle::adaptor_do_ON_EXIT_NOT_END(JStudio::data::TEOperationData param_1, +void TAdaptor_particle::adaptor_do_ON_EXIT_NOT_END(JStudio::data::TEOperationData param_1, const void* pContent, u32 uSize) { - if (param_1 == JStudio::data::UNK_0x2) { - JUT_ASSERT(460, uSize==4); - JUT_ASSERT(461, pContent!=NULL); - field_0x1b6 = *(u32*)pContent ? 1 : 0; + switch (param_1) { + case JStudio::data::UNK_0x2: { + JUT_ASSERT(482, uSize==4); + JUT_ASSERT(483, pContent!=NULL); + u32 var_r29 = *(u32*)pContent; + field_0x1b6 = var_r29 != 0; + break; + } + default: + JGADGET_WARNMSG(491, "unknown data-type : " << param_1 << "\n demo-object : " << adaptor_getID_string()); } } -void -JStudio_JParticle::TAdaptor_particle::TJPACallback_emitter_::execute(JPABaseEmitter* pJPAEmitter) { +void TAdaptor_particle::TJPACallback_emitter_::execute(JPABaseEmitter* pJPAEmitter) { JUT_ASSERT(518, pJPAEmitter==pThis_->pJPAEmitter_); if (pJPAEmitter->isEnableDeleteEmitter()) { pThis_->pCreateObject_->emitter_destroy(pJPAEmitter); pThis_->pJPAEmitter_ = NULL; pThis_->field_0x1b8 = 0; - pThis_->u32FadeTime_end = 0; - pThis_->field_0x1c4 = 0; + pThis_->u32FadeTime_end_ = 0; + pThis_->u32FadeTime_current_ = 0; return; } const JStudio::TObject* pObject = pThis_->adaptor_getObject(); @@ -258,34 +372,45 @@ JStudio_JParticle::TAdaptor_particle::TJPACallback_emitter_::execute(JPABaseEmit break; case 1: break; + default: + JUT_ASSERT(566, false); } pJPAEmitter->setGlobalTranslation(pVVar9->translation); - int rotx = 65536.0 * (pVVar9->rotation.x / 360.0); - int roty = 65536.0 * (pVVar9->rotation.y / 360.0); - int rotz = 65536.0 * (pVVar9->rotation.z / 360.0); - pJPAEmitter->setGlobalRotation(JGeometry::TVec3(rotx, roty, rotz)); + pJPAEmitter->setGlobalRotation(JGeometry::TVec3( + 65536.0 * (pVVar9->rotation.x / 360.0), + 65536.0 * (pVVar9->rotation.y / 360.0), + 65536.0 * (pVVar9->rotation.z / 360.0) + )); pJPAEmitter->setGlobalScale(pVVar9->scaling); } else { Mtx afStack_1f0; if (JStudio_JStage::transform_toGlobalFromLocal(afStack_1f0, VStack_19c, pThis_->field_0x1d0, pThis_->field_0x1d4) == 0) { + JGADGET_WARNMSG(583, "can\'t transform about parent\n demo-object : " << pThis_->adaptor_getID_string()); return; } pJPAEmitter->setGlobalSRTMatrix(afStack_1f0); } + f64 alpha = 1.0; - u32 u32FadeTime_end = pThis_->u32FadeTime_end; - f64 dVar16 = u32FadeTime_end; - f64 dVar15 = pThis_->field_0x1c4; - switch(pThis_->field_0x1b8) { + u32 u32FadeTime_end = pThis_->u32FadeTime_end_; + u32 u32FadeTime_current = pThis_->u32FadeTime_current_; + f64 var_f30 = u32FadeTime_end; + f64 var_f29 = u32FadeTime_current; + switch (pThis_->field_0x1b8) { case 1: JUT_ASSERT(606, u32FadeTime_end>0); - alpha = dVar15 / dVar16; + alpha = var_f29 / var_f30; + break; + case 2: break; case 3: JUT_ASSERT(611, u32FadeTime_end>0); - alpha = (dVar16 - dVar15) / dVar16; + alpha = (var_f30 - var_f29) / var_f30; + break; + default: + JUT_ASSERT(619, false); } u8 globalAlpha = 255; @@ -302,48 +427,53 @@ JStudio_JParticle::TAdaptor_particle::TJPACallback_emitter_::execute(JPABaseEmit } } -void -JStudio_JParticle::TAdaptor_particle::TJPACallback_emitter_::executeAfter(JPABaseEmitter* pJPAEmitter) { +void TAdaptor_particle::TJPACallback_emitter_::executeAfter(JPABaseEmitter* pJPAEmitter) { if (pOld != NULL) { pOld->executeAfter(pJPAEmitter); } } -void -JStudio_JParticle::TAdaptor_particle::TJPACallback_emitter_::draw(JPABaseEmitter* pJPAEmitter) { +void TAdaptor_particle::TJPACallback_emitter_::draw(JPABaseEmitter* pJPAEmitter) { if (pOld != NULL) { pOld->draw(pJPAEmitter); } } -void -JStudio_JParticle::TAdaptor_particle::TJPACallback_emitter_::drawAfter(JPABaseEmitter* pJPAEmitter) { +void TAdaptor_particle::TJPACallback_emitter_::drawAfter(JPABaseEmitter* pJPAEmitter) { if (pOld != NULL) { pOld->drawAfter(pJPAEmitter); } } -void JStudio_JParticle::TAdaptor_particle::beginParticle_fadeIn_() { +void TAdaptor_particle::beginParticle_fadeIn_() { if (pJPAEmitter_ != NULL) { + JGADGET_WARNMSG(686, + "past emitter already exist\n demo-object : " << adaptor_getID_string() << + "\n begin prepare particle-ID : " << TToString_u32ID_()(field_0x1bc)); pCreateObject_->emitter_destroy(pJPAEmitter_); } JPABaseEmitter* pEmitter = pCreateObject_->emitter_create(field_0x1bc); pJPAEmitter_ = pEmitter; - if (pEmitter != NULL) { - field_0x1a8.setOld(pEmitter->getEmitterCallBackPtr()); - pEmitter->setEmitterCallBackPtr(&field_0x1a8); - pEmitter->becomeImmortalEmitter(); - field_0x1b7 = 1; - field_0x1b8 = 1; - if (field_0x1c8 == 0) { - field_0x1b8 = 2; - } - u32FadeTime_end = field_0x1c8; - field_0x1c4 = 0; + if (pEmitter == NULL) { + JGADGET_WARNMSG(696, + "can\'t create emitter : " << TToString_u32ID_()(field_0x1bc) << + "\n demo-object : " << adaptor_getID_string()); + return; } + + field_0x1a8.setOld(pEmitter->getEmitterCallBackPtr()); + pEmitter->setEmitterCallBackPtr(&field_0x1a8); + pEmitter->becomeImmortalEmitter(); + field_0x1b7 = 1; + field_0x1b8 = 1; + if (field_0x1c8 == 0) { + field_0x1b8 = 2; + } + u32FadeTime_end_ = field_0x1c8; + u32FadeTime_current_ = 0; } -void JStudio_JParticle::TAdaptor_particle::endParticle_fadeOut_(u32 param_1) { +void TAdaptor_particle::endParticle_fadeOut_(u32 param_1) { if (pJPAEmitter_ == NULL) { return; } @@ -351,14 +481,15 @@ void JStudio_JParticle::TAdaptor_particle::endParticle_fadeOut_(u32 param_1) { pCreateObject_->emitter_destroy(pJPAEmitter_); pJPAEmitter_ = NULL; field_0x1b8 = 0; - u32FadeTime_end = 0; - field_0x1c4 = 0; + u32FadeTime_end_ = 0; + u32FadeTime_current_ = 0; return; } u8 eState_old = field_0x1b8 & 0xff; field_0x1b8 = 3; - if (field_0x1c4 == 0) { - u32FadeTime_end = param_1; + if (u32FadeTime_current_ == 0) { + JUT_ASSERT(731, !state_isFade_(eState_old)); + u32FadeTime_end_ = param_1; return; } JUT_ASSERT(735, state_isFade_(eState_old)); @@ -366,13 +497,17 @@ void JStudio_JParticle::TAdaptor_particle::endParticle_fadeOut_(u32 param_1) { switch(eState_old) { case 1: - u32Denominator = field_0x1c4; + u32Denominator = u32FadeTime_current_; break; case 3: - u32Denominator = u32FadeTime_end - field_0x1c4; + u32Denominator = u32FadeTime_end_ - u32FadeTime_current_; break; + default: + JUT_ASSERT(791, false); } JUT_ASSERT(793, u32Denominator!=0); - u32FadeTime_end = ((f64)param_1 * (f64)u32FadeTime_end) / u32Denominator; - field_0x1c4 = u32FadeTime_end - param_1; + u32FadeTime_end_ = ((f64)param_1 * (f64)u32FadeTime_end_) / u32Denominator; + u32FadeTime_current_ = u32FadeTime_end_ - param_1; } + +} // namespace JStudio_JParticle From f398cf04ad33c83d5fbfe8fec41b553d45c7778b Mon Sep 17 00:00:00 2001 From: YunataSavior Date: Thu, 26 Mar 2026 20:18:18 -0700 Subject: [PATCH 18/19] Add "Selected Layer" to Map Loader --- src/dusk/imgui/ImGuiMapLoader.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/dusk/imgui/ImGuiMapLoader.cpp b/src/dusk/imgui/ImGuiMapLoader.cpp index 73f9f17dc9..44b1b7c583 100644 --- a/src/dusk/imgui/ImGuiMapLoader.cpp +++ b/src/dusk/imgui/ImGuiMapLoader.cpp @@ -99,6 +99,24 @@ namespace dusk { } } + constexpr int MAX_LAYER = 14; + + ImGui::Text("Selected Layer: %3d", m_mapLoaderInfo.layer); + ImGui::SameLine(); + if (ImGui::Button("-###layerDec")) { + m_mapLoaderInfo.layer--; + if (m_mapLoaderInfo.layer < -1) { + m_mapLoaderInfo.layer = MAX_LAYER; + } + } + ImGui::SameLine(); + if (ImGui::Button("+###layerInc")) { + m_mapLoaderInfo.layer++; + if (m_mapLoaderInfo.layer > MAX_LAYER) { + m_mapLoaderInfo.layer = -1; + } + } + if (room.numPoints > 1) { ImGui::Text("Selected Point: %3d", room.roomPoints[m_mapLoaderInfo.pointNoIdx]); ImGui::SameLine(); @@ -118,7 +136,7 @@ namespace dusk { } if (ImGui::Button("Warp")) { - dComIfGp_setNextStage(map.mapFile, room.roomPoints[m_mapLoaderInfo.pointNoIdx], room.roomNo, -1); + dComIfGp_setNextStage(map.mapFile, room.roomPoints[m_mapLoaderInfo.pointNoIdx], room.roomNo, m_mapLoaderInfo.layer); } } From 73a8ba057714bd2a7c02382313a21651f49bface Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Fri, 27 Mar 2026 02:32:20 -0400 Subject: [PATCH 19/19] Use stubs instead of including debug files for last upstream merge --- libs/JSystem/include/JSystem/JHostIO/JORReflexible.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/JSystem/include/JSystem/JHostIO/JORReflexible.h b/libs/JSystem/include/JSystem/JHostIO/JORReflexible.h index 4a142dee7e..533a3184ba 100644 --- a/libs/JSystem/include/JSystem/JHostIO/JORReflexible.h +++ b/libs/JSystem/include/JSystem/JHostIO/JORReflexible.h @@ -22,9 +22,10 @@ public: class JORReflexible : public JOREventListener { public: + static JORServer* getJORServer() { return JORServer::getInstance(); } + #if DEBUG JORReflexible() {} - static JORServer* getJORServer() { return JORServer::getInstance(); } virtual void listenPropertyEvent(const JORPropertyEvent*); virtual void listen(u32, const JOREvent*);