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..40ee1e8b06 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 @@ -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 @@ -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/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/files.cmake b/files.cmake index 92dd593a24..8504aecb95 100644 --- a/files.cmake +++ b/files.cmake @@ -543,8 +543,17 @@ set(JSYSTEM_DEBUG_FILES libs/JSystem/src/JGadget/binary.cpp libs/JSystem/src/JGadget/define.cpp libs/JSystem/src/JGadget/linklist.cpp + libs/JSystem/src/JGadget/search.cpp libs/JSystem/src/JGadget/std-vector.cpp + libs/JSystem/src/JAHostIO/JAHFrameNode.cpp + libs/JSystem/src/JAHostIO/JAHioMessage.cpp + libs/JSystem/src/JAHostIO/JAHioMgr.cpp + libs/JSystem/src/JAHostIO/JAHioNode.cpp + libs/JSystem/src/JAHostIO/JAHioUtil.cpp + libs/JSystem/src/JAHostIO/JAHVirtualNode.cpp + libs/JSystem/src/JHostIO/JORFile.cpp libs/JSystem/src/JHostIO/JORHostInfo.cpp + libs/JSystem/src/JHostIO/JORMessageBox.cpp libs/JSystem/src/JHostIO/JORServer.cpp libs/JSystem/src/JHostIO/JHIhioASync.cpp libs/JSystem/src/JHostIO/JHIRMcc.cpp 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 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 d7dd19fcf2..80cadc7a85 100644 --- a/include/Z2AudioLib/Z2DebugSys.h +++ b/include/Z2AudioLib/Z2DebugSys.h @@ -12,9 +12,8 @@ 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[0F] */ virtual void propertyEvent(JAH_P_Event, uintptr_t); /* 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..607398d15f 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, uintptr_t); + 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/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/include/global.h b/include/global.h index 56662eb5be..3720586ae3 100644 --- a/include/global.h +++ b/include/global.h @@ -179,6 +179,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"); @@ -190,6 +191,7 @@ static const float INF = 2000000000.0f; } #define MULTI_CHAR(x) MultiCharLiteral(#x) #endif +#endif // potential fakematch? #if DEBUG @@ -199,9 +201,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 d2b0e6924a..43f34ab38b 100644 --- a/libs/JSystem/include/JSystem/JAHostIO/JAHPubDefine.h +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHPubDefine.h @@ -4,18 +4,22 @@ #include "JSystem/JKernel/JKRHeap.h" #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 = JKR_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..53424daabc 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, uintptr_t); + 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..eee0ed94c0 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 propertyEvent(JAH_P_Event, uintptr_t); virtual void nodeEvent(JAH_N_Event); + virtual void virtualMessage(JAHControl&); + + void callAllVirtualMessages(JAHControl&); + JAHioNode* getMaster(); + void framework(); + void currentFramework(); + void listenVirtualPropertyEvent(JAH_P_Event, uintptr_t); + 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/JAHostIO/JAHioNode.h b/libs/JSystem/include/JSystem/JAHostIO/JAHioNode.h index c48861eee9..70fb1d07b5 100644 --- a/libs/JSystem/include/JSystem/JAHostIO/JAHioNode.h +++ b/libs/JSystem/include/JSystem/JAHostIO/JAHioNode.h @@ -31,7 +31,7 @@ public: /* vt[0C] */ virtual s32 getNodeType() { return 0; } /* vt[0D] */ virtual u32 getNodeKind() const; /* vt[0E] */ virtual u32 getNodeIcon() const { return 0; } - /* vt[0F] */ virtual void propertyEvent(JAH_P_Event, u32) {} + /* vt[0F] */ virtual void propertyEvent(JAH_P_Event, uintptr_t) {} /* vt[10] */ virtual void nodeEvent(JAH_N_Event) {} void updateNode(); void setNodeName(const char*); diff --git a/libs/JSystem/include/JSystem/JAudio2/JASDSPInterface.h b/libs/JSystem/include/JSystem/JAudio2/JASDSPInterface.h index 8f1ca3dd72..a9a9b2d11e 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 /** diff --git a/libs/JSystem/include/JSystem/JAudio2/JAUSoundTable.h b/libs/JSystem/include/JSystem/JAudio2/JAUSoundTable.h index 4bb9985d28..5dab15abc0 100644 --- a/libs/JSystem/include/JSystem/JAudio2/JAUSoundTable.h +++ b/libs/JSystem/include/JSystem/JAudio2/JAUSoundTable.h @@ -193,7 +193,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 f80e34e7e8..b3fd794500 100644 --- a/libs/JSystem/include/JSystem/JHostIO/JORMContext.h +++ b/libs/JSystem/include/JSystem/JHostIO/JORMContext.h @@ -8,7 +8,7 @@ #endif #include #include -#include "JSystem/JHostIO/JORReflexible.h" +#include "JSystem/JHostIO/JOREvent.h" #include "JSystem/JSupport/JSUMemoryStream.h" #define MCTX_MSG_RESET 0 @@ -195,9 +195,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, @@ -222,6 +220,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); @@ -271,6 +273,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) @@ -280,6 +283,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 === */ @@ -314,8 +327,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 6d65137e22..533a3184ba 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; @@ -46,16 +22,11 @@ public: class JORReflexible : public JOREventListener { public: + static JORServer* getJORServer() { return JORServer::getInstance(); } + #if DEBUG JORReflexible() {} -#if TARGET_PC - static JORServer* getJORServer() { - OSPanic(__FILE__, __LINE__, "getJORServer is unimplemented"); - } -#else - static JORServer* getJORServer(); -#endif - + virtual void listenPropertyEvent(const JORPropertyEvent*); virtual void listen(u32, const JOREvent*); virtual void genObjectInfo(const JORGenEvent*); diff --git a/libs/JSystem/include/JSystem/JKernel/JKRHeap.h b/libs/JSystem/include/JSystem/JKernel/JKRHeap.h index ca035faf99..d3710bd5df 100644 --- a/libs/JSystem/include/JSystem/JKernel/JKRHeap.h +++ b/libs/JSystem/include/JSystem/JKernel/JKRHeap.h @@ -81,7 +81,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; @@ -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/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/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/include/JSystem/JSupport/JSUInputStream.h b/libs/JSystem/include/JSystem/JSupport/JSUInputStream.h index a1957a22ad..77c27d0530 100644 --- a/libs/JSystem/include/JSystem/JSupport/JSUInputStream.h +++ b/libs/JSystem/include/JSystem/JSupport/JSUInputStream.h @@ -5,9 +5,9 @@ #include "dusk/endian.h" /** -* @ingroup jsystem-jsupport -* -*/ + * @ingroup jsystem-jsupport + * + */ class JSUInputStream : public JSUIosBase { public: JSUInputStream() {} @@ -93,13 +93,9 @@ 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) { auto ret = read(¶m_0, 4); @@ -114,9 +110,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..502fb84005 --- /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, (uintptr_t)event->id); + } + + JAHioNode::listenPropertyEvent(event); + + for (JSUTreeIterator iter = mTree.getFirstChild(); iter != mTree.getEndChild(); + ++iter) + { + iter->listenVirtualPropertyEvent(JAH_P_EVENT1, (uintptr_t)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..b9cd8acb15 --- /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, uintptr_t 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, uintptr_t) {} + +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..66c9431a41 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()) { @@ -96,9 +100,9 @@ JAHioNode* JAHioNode::getParent() { } void JAHioNode::listenPropertyEvent(const JORPropertyEvent* event) { - propertyEvent(JAH_P_EVENT0, (u32)event->id); + propertyEvent(JAH_P_EVENT0, (uintptr_t)event->id); JORReflexible::listenPropertyEvent(event); - propertyEvent(JAH_P_EVENT1, (u32)event->id); + propertyEvent(JAH_P_EVENT1, (uintptr_t)event->id); } void JAHioNode::listenNodeEvent(const JORNodeEvent* event) { diff --git a/libs/JSystem/src/JAHostIO/JAHioUtil.cpp b/libs/JSystem/src/JAHostIO/JAHioUtil.cpp index 11c5fd4b52..9a0fdf027a 100644 --- a/libs/JSystem/src/JAHostIO/JAHioUtil.cpp +++ b/libs/JSystem/src/JAHostIO/JAHioUtil.cpp @@ -1,13 +1,23 @@ -#include "JSystem/JSystem.h" // IWYU pragma: keep +#include "JSystem/JSystem.h" // IWYU pragma: keep -#include "JSystem/JAHostIO/JAHioUtil.h" +#include #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); + va_start(args, msg); vsprintf(mStringBuffer, msg, args); va_end(args); return mStringBuffer; 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); 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]; diff --git a/libs/JSystem/src/JStudio/JStudio_JParticle/control.cpp b/libs/JSystem/src/JStudio/JStudio_JParticle/control.cpp index cbaf5da404..13b565a3a1 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 f2193f42f0..36b5fd26cf 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 = *(BE(u32)*)pContent; + switch (param_1) { + case JStudio::data::UNK_0x19: { + JUT_ASSERT(232, pContent!=NULL); + JUT_ASSERT(233, uSize==4); + u32 var_r29 = *(BE(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_(*(BE(f32)*)pContent); + u32 var_r29 = *(BE(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_(*(BE(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 = *(BE(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 = *(BE(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 = *(BE(u32)*)pContent ? 1 : 0; + u32 var_r29 = *(BE(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 = *(BE(u32)*)pContent; + JUT_ASSERT(440, pContent!=NULL); + u32 var_r29 = *(BE(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 = *(BE(u32)*)pContent ? 1 : 0; + u32 var_r29 = *(BE(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 = *(BE(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 = *(BE(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 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 1cfc4b28b1..985c500aec 100644 --- a/src/Z2AudioLib/Z2AudioMgr.cpp +++ b/src/Z2AudioLib/Z2AudioMgr.cpp @@ -20,6 +20,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 67d51d9b59..2764365bc4 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 de133cabd9..fce45d1a79 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" #include "os_report.h" Z2FxLineMgr::Z2FxLineMgr() : JASGlobalInstance(true) { @@ -12,9 +18,9 @@ Z2FxLineMgr::Z2FxLineMgr() : JASGlobalInstance(true) { mFxDataNum = 0; mSetUnderWaterFx = false; - #if DEBUG +#if DEBUG mHIOEdit = NULL; - #endif +#endif } void Z2FxLineMgr::initDataArc(JKRArchive* arc, JKRHeap* heap) { @@ -36,42 +42,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) { @@ -102,51 +115,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) { @@ -158,6 +180,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()); @@ -189,7 +216,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: @@ -239,4 +266,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 = JKR_NEW_ARGS(mHeap, 0) LineStereo(false); + appendNode(unk74, NULL); + unk78 = JKR_NEW_ARGS(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, uintptr_t 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 300da403b2..1b2152fcb7 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 643b3840c7..a3e45d8acd 100644 --- a/src/Z2AudioLib/Z2SeqMgr.cpp +++ b/src/Z2AudioLib/Z2SeqMgr.cpp @@ -8,94 +8,11 @@ #include "Z2AudioLib/Z2Calc.h" #include "JSystem/JAudio2/JAISoundChild.h" #include "JSystem/JAudio2/JAISeq.h" +#include "Z2AudioLib/SpotName.h" #include "os_report.h" #include "dusk/audio.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", -}; - Z2SeqMgr::Z2SeqMgr() : JASGlobalInstance(true) { mMainBgmMaster.forceIn(); mSubBgmMaster.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 7214ab20cf..4b546fc54a 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" #include "os_report.h" static f32 cPitchDown = 0.8909f; diff --git a/src/d/actor/d_a_alink.cpp b/src/d/actor/d_a_alink.cpp index 54766adfc7..4f106ece22 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_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() { 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); 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_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}; 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); 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_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/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_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/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 4d8c531b3c..53f610267f 100644 --- a/src/d/d_stage.cpp +++ b/src/d/d_stage.cpp @@ -393,6 +393,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/dusk/OSThread.cpp b/src/dusk/OSThread.cpp index d5c18e4f6b..7daa2cb137 100644 --- a/src/dusk/OSThread.cpp +++ b/src/dusk/OSThread.cpp @@ -616,24 +616,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; } diff --git a/src/dusk/imgui/ImGuiConsole.hpp b/src/dusk/imgui/ImGuiConsole.hpp index 82f0658e7a..c67bb2a885 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/ImGuiMapLoader.cpp b/src/dusk/imgui/ImGuiMapLoader.cpp index 74e60e4974..44b1b7c583 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."); } @@ -97,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(); @@ -116,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); } } diff --git a/src/dusk/imgui/ImGuiMenuGame.cpp b/src/dusk/imgui/ImGuiMenuGame.cpp index 416b7d062c..e4ff609ccb 100644 --- a/src/dusk/imgui/ImGuiMenuGame.cpp +++ b/src/dusk/imgui/ImGuiMenuGame.cpp @@ -24,6 +24,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; diff --git a/src/dusk/imgui/ImGuiSaveEditor.cpp b/src/dusk/imgui/ImGuiSaveEditor.cpp index 00cadfaa4a..ff04b1f1a2 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(); + } diff --git a/src/dusk/stubs.cpp b/src/dusk/stubs.cpp index 811da88f43..4e259ff97e 100644 --- a/src/dusk/stubs.cpp +++ b/src/dusk/stubs.cpp @@ -389,10 +389,6 @@ s32 JSUMemoryOutputStream::getAvailable() const { return mLength - mPosition; } -s32 JSUMemoryOutputStream::getPosition() const { - return mPosition; -} - #pragma mark JSURandomOutputStream #include s32 JSUMemoryOutputStream::seek(s32 offset, JSUStreamSeekFrom origin) { diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index c9d630a4b2..36217076bf 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) { 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, diff --git a/src/m_Do/m_Do_main.cpp b/src/m_Do/m_Do_main.cpp index d03b352151..b3fb05b0b9 100644 --- a/src/m_Do/m_Do_main.cpp +++ b/src/m_Do/m_Do_main.cpp @@ -277,6 +277,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);