diff --git a/config/SOUE01/rels/d_a_obj_tuboNP/symbols.txt b/config/SOUE01/rels/d_a_obj_tuboNP/symbols.txt index 05cf4eeb..285bfd8f 100644 --- a/config/SOUE01/rels/d_a_obj_tuboNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_tuboNP/symbols.txt @@ -9,7 +9,7 @@ __dt__23sFState_c<10dAcOtubo_c>Fv = .text:0x00000280; // type:function size:0x58 __dt__26sFStateFct_c<10dAcOtubo_c>Fv = .text:0x000002E0; // type:function size:0x6C __dt__79sStateMgr_c<10dAcOtubo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000350; // type:function size:0xA0 __dt__49sFStateMgr_c<10dAcOtubo_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003F0; // type:function size:0xA4 -__dt__17EffectsStruct_ExtFv = .text:0x000004A0; // type:function size:0x5C +__dt__14dWaterEffect_cFv = .text:0x000004A0; // type:function size:0x5C createHeap__10dAcOtubo_cFv = .text:0x00000500; // type:function size:0x90 actorCreate__10dAcOtubo_cFv = .text:0x00000590; // type:function size:0x2B0 changeState__79sStateMgr_c<10dAcOtubo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000840; // type:function size:0x10 @@ -102,7 +102,7 @@ __vt__49sFStateMgr_c<10dAcOtubo_c,20sStateMethodUsr_FI_c> = .data:0x00000108; // __vt__79sStateMgr_c<10dAcOtubo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000138; // type:object size:0x30 __vt__26sFStateFct_c<10dAcOtubo_c> = .data:0x00000168; // type:object size:0x14 __vt__23sFState_c<10dAcOtubo_c> = .data:0x00000180; // type:object size:0x18 -__vt__17EffectsStruct_Ext = .data:0x00000198; // type:object size:0xC +__vt__14dWaterEffect_c = .data:0x00000198; // type:object size:0xC __vt__15dShadowCircle_c = .data:0x000001A4; // type:object size:0xC __vt__25sFStateID_c<10dAcOtubo_c> = .data:0x000002F0; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 347de295..74cf3f0c 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -88,9 +88,15 @@ toBeSorted/blur_and_palette_manager.cpp: .sdata2 start:0x80576BA0 end:0x80576C18 .bss start:0x8058F210 end:0x80594FA0 -toBeSorted/d_effects_1.cpp: +toBeSorted/d_emitter.cpp: .text start:0x800268B0 end:0x8002B99C align:16 .ctors start:0x804DB660 end:0x804DB664 + .rodata start:0x804DBD18 end:0x804DBE80 + .data start:0x80500E98 end:0x805014C0 + .sdata start:0x805718A8 end:0x80571920 + .sbss start:0x80575070 end:0x80575080 + .sdata2 start:0x80576C18 end:0x80576C68 + .bss start:0x80594FA0 end:0x80597020 toBeSorted/d_effects_2.cpp: .text start:0x8002B9A0 end:0x8002C128 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d97c4c5d..2e99d88e 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -603,8 +603,8 @@ fn_80019290 = .text:0x80019290; // type:function size:0x5C fn_800192F0 = .text:0x800192F0; // type:function size:0x6C doDraw__Q23d3d14EggTextureProcFv = .text:0x80019360; // type:function size:0x204 doRemove__Q23d3d14EggTextureProcFv = .text:0x80019570; // type:function size:0x44 -create__Q23d3d14EggTextureProcFiiP12mAllocator_c = .text:0x800195C0; // type:function size:0xAC -createXlu__Q23d3d14EggTextureProcFiP12mAllocator_c = .text:0x80019670; // type:function size:0x74 +create__Q23d3d7UnkProcFiiP12mAllocator_c = .text:0x800195C0; // type:function size:0xAC +createXlu__Q23d3d7UnkProcFiP12mAllocator_c = .text:0x80019670; // type:function size:0x74 fn_800196F0 = .text:0x800196F0; // type:function size:0x90 fn_80019780 = .text:0x80019780; // type:function size:0x6C fn_800197F0 = .text:0x800197F0; // type:function size:0x5C @@ -693,19 +693,19 @@ fn_8001D950 = .text:0x8001D950; // type:function size:0x22C fn_8001DB80 = .text:0x8001DB80; // type:function size:0x74 fn_8001DC00 = .text:0x8001DC00; // type:function size:0x764 fn_8001E370 = .text:0x8001E370; // type:function size:0xD4 -fn_8001E450 = .text:0x8001E450; // type:function size:0xE0 -fn_8001E530 = .text:0x8001E530; // type:function size:0xA0 -fn_8001E5D0 = .text:0x8001E5D0; // type:function size:0x110 -fn_8001E6E0 = .text:0x8001E6E0; // type:function size:0xC -fn_8001E6F0 = .text:0x8001E6F0; // type:function size:0x2C -fn_8001E720 = .text:0x8001E720; // type:function size:0x14 +init__14dShpProcBase_cFQ34nw4r3g3d6ResMatQ34nw4r3g3d6ResShplbPUl = .text:0x8001E450; // type:function size:0xE0 +setupLight__14dShpProcBase_cFv = .text:0x8001E530; // type:function size:0xA0 +draw__14dShpProcBase_cFP7mVec3_c = .text:0x8001E5D0; // type:function size:0x110 +setResMat__14dShpProcBase_cFQ34nw4r3g3d6ResMat = .text:0x8001E6E0; // type:function size:0xC +setAllFlags__14dShpProcBase_cFv = .text:0x8001E6F0; // type:function size:0x2C +doEntry__14dShpProcBase_cFl = .text:0x8001E720; // type:function size:0x14 fn_8001E740 = .text:0x8001E740; // type:function size:0x54 fn_8001E7A0 = .text:0x8001E7A0; // type:function size:0x2C8 fn_8001EA70 = .text:0x8001EA70; // type:function size:0x4 fn_8001EA80 = .text:0x8001EA80; // type:function size:0x1DC -fn_8001EC60 = .text:0x8001EC60; // type:function size:0x4 -fn_8001EC70 = .text:0x8001EC70; // type:function size:0x118 -fn_8001ED90 = .text:0x8001ED90; // type:function size:0x1F0 +__ct__6mMtx_cFv = .text:0x8001EC60; // type:function size:0x4 +create__11dShpProc1_cFQ34nw4r3g3d6ResMatQ34nw4r3g3d6ResShplP16mHeapAllocator_cbPUl = .text:0x8001EC70; // type:function size:0x118 +draw__11dShpProc1_cFv = .text:0x8001ED90; // type:function size:0x1F0 fn_8001EF80 = .text:0x8001EF80; // type:function size:0x124 fn_8001F0B0 = .text:0x8001F0B0; // type:function size:0x88 fn_8001F140 = .text:0x8001F140; // type:function size:0x1C4 @@ -886,129 +886,129 @@ fn_80026540 = .text:0x80026540; // type:function size:0x40 fn_80026580 = .text:0x80026580; // type:function size:0x188 fn_80026710 = .text:0x80026710; // type:function size:0x4C fn_80026760 = .text:0x80026760; // type:function size:0x4C -fn_800267B0 = .text:0x800267B0; // type:function size:0x4C -fn_80026800 = .text:0x80026800; // type:function size:0x4C +getLightColor1__21BlurAndPaletteManagerFv = .text:0x800267B0; // type:function size:0x4C +getLightColor2__21BlurAndPaletteManagerFv = .text:0x80026800; // type:function size:0x4C __sinit_\blur_and_palette_manager_cpp = .text:0x80026850; // type:function size:0x5C scope:local -fn_800268B0 = .text:0x800268B0; // type:function size:0xB4 -fn_80026970 = .text:0x80026970; // type:function size:0x88 -fn_80026A00 = .text:0x80026A00; // type:function size:0xB4 -fn_80026AC0 = .text:0x80026AC0; // type:function size:0x88 -fn_80026B50 = .text:0x80026B50; // type:function size:0x98 -fn_80026BF0 = .text:0x80026BF0; // type:function size:0x8 -fn_80026C00 = .text:0x80026C00; // type:function size:0x144 -fn_80026D50 = .text:0x80026D50; // type:function size:0x4 -fn_80026D60 = .text:0x80026D60; // type:function size:0x4 -fn_80026D70 = .text:0x80026D70; // type:function size:0x3C -fn_80026DB0 = .text:0x80026DB0; // type:function size:0xA0 -fn_80026E50 = .text:0x80026E50; // type:function size:0x3C -fn_80026E90 = .text:0x80026E90; // type:function size:0x3C -fn_80026ED0__13EffectsStructFv = .text:0x80026ED0; // type:function size:0x3C -fn_80026F10__13EffectsStructFv = .text:0x80026F10; // type:function size:0x3C -fn_80026F50 = .text:0x80026F50; // type:function size:0xD8 -fn_80027030 = .text:0x80027030; // type:function size:0xD8 -fn_80027110 = .text:0x80027110; // type:function size:0xC8 -fn_800271E0__13EffectsStructFP7mVec3_cP7mAng3_cP7mVec3_c = .text:0x800271E0; // type:function size:0x44 -setMtx__13EffectsStructFRC6mMtx_c = .text:0x80027230; // type:function size:0x78 -fn_800272B0 = .text:0x800272B0; // type:function size:0x70 -fn_80027320__13EffectsStructFUc = .text:0x80027320; // type:function size:0x40 -fn_80027360 = .text:0x80027360; // type:function size:0x40 -fn_800273A0 = .text:0x800273A0; // type:function size:0x54 -fn_80027400 = .text:0x80027400; // type:function size:0x4C -fn_80027450 = .text:0x80027450; // type:function size:0x40 -fn_80027490 = .text:0x80027490; // type:function size:0x40 -fn_800274D0 = .text:0x800274D0; // type:function size:0x40 -fn_80027510 = .text:0x80027510; // type:function size:0x4C -fn_80027560 = .text:0x80027560; // type:function size:0x5C +__dt__18dEmitterCallback_cFv = .text:0x800268B0; // type:function size:0xB4 +remove__18dEmitterCallback_cFP14dEmitterBase_c = .text:0x80026970; // type:function size:0x88 +__dt__19dParticleCallback_cFv = .text:0x80026A00; // type:function size:0xB4 +remove__19dParticleCallback_cFP14dEmitterBase_c = .text:0x80026AC0; // type:function size:0x88 +__dt__14dEmitterBase_cFv = .text:0x80026B50; // type:function size:0x98 +GetNextEmitter__14dEmitterBase_cFP14JPABaseEmitter = .text:0x80026BF0; // type:function size:0x8 +createEmitters__14dEmitterBase_cFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColorll = .text:0x80026C00; // type:function size:0x144 +create__18dEmitterCallback_cFP14JPABaseEmitter = .text:0x80026D50; // type:function size:0x4 +create__19dParticleCallback_cFP14JPABaseEmitter = .text:0x80026D60; // type:function size:0x4 +setImmortal__14dEmitterBase_cFv = .text:0x80026D70; // type:function size:0x3C +deactivateEmitters__14dEmitterBase_cFv = .text:0x80026DB0; // type:function size:0xA0 +stopCalcEmitters__14dEmitterBase_cFv = .text:0x80026E50; // type:function size:0x3C +playCalcEmitters__14dEmitterBase_cFv = .text:0x80026E90; // type:function size:0x3C +stopDrawParticles__14dEmitterBase_cFv = .text:0x80026ED0; // type:function size:0x3C +playDrawParticles__14dEmitterBase_cFv = .text:0x80026F10; // type:function size:0x3C +setEmitterCallback__14dEmitterBase_cFP18dEmitterCallback_c = .text:0x80026F50; // type:function size:0xD8 +setParticleCallback__14dEmitterBase_cFP19dParticleCallback_c = .text:0x80027030; // type:function size:0xD8 +setPosRotScale__14dEmitterBase_cFRC7mVec3_cPC7mAng3_cPC7mVec3_c = .text:0x80027110; // type:function size:0xC8 +setPosRotScaleWithScreenScale__14dEmitterBase_cFRC7mVec3_cPC7mAng3_cPC7mVec3_c = .text:0x800271E0; // type:function size:0x44 +setTransform__14dEmitterBase_cFRC6mMtx_c = .text:0x80027230; // type:function size:0x78 +loadColors__14dEmitterBase_cFPC8_GXColorPC8_GXColorll = .text:0x800272B0; // type:function size:0x70 +setGlobalAlpha__14dEmitterBase_cFUc = .text:0x80027320; // type:function size:0x40 +setRate__14dEmitterBase_cFf = .text:0x80027360; // type:function size:0x40 +setDynamicsScale__14dEmitterBase_cFRC7mVec3_c = .text:0x800273A0; // type:function size:0x54 +setParticleScale__14dEmitterBase_cFRC7mVec3_c = .text:0x80027400; // type:function size:0x4C +setAwayFromCenterSpeed__14dEmitterBase_cFf = .text:0x80027450; // type:function size:0x40 +setVolumeSize__14dEmitterBase_cFUs = .text:0x80027490; // type:function size:0x40 +setLifeTime__14dEmitterBase_cFs = .text:0x800274D0; // type:function size:0x40 +attachEmitterCallbackId__14dEmitterBase_cFl = .text:0x80027510; // type:function size:0x4C +bindShpEmitter__14dEmitterBase_cFlb = .text:0x80027560; // type:function size:0x5C __ct__13EffectsStructFv = .text:0x800275C0; // type:function size:0x44 __ct__13EffectsStructFP7dBase_c = .text:0x80027610; // type:function size:0x44 __dt__13EffectsStructFv = .text:0x80027660; // type:function size:0x78 remove__13EffectsStructFb = .text:0x800276E0; // type:function size:0x84 -fn_80027770 = .text:0x80027770; // type:function size:0xE8 -fn_80027860 = .text:0x80027860; // type:function size:0xC8 -fn_80027930 = .text:0x80027930; // type:function size:0x130 -fn_80027A60 = .text:0x80027A60; // type:function size:0x44 -fn_80027AB0 = .text:0x80027AB0; // type:function size:0x6C -fn_80027B20 = .text:0x80027B20; // type:function size:0x24 -fn_80027B50 = .text:0x80027B50; // type:function size:0x80 -fn_80027BD0 = .text:0x80027BD0; // type:function size:0xD8 -fn_80027CB0 = .text:0x80027CB0; // type:function size:0x100 -fn_80027DB0 = .text:0x80027DB0; // type:function size:0xC -fn_80027DC0 = .text:0x80027DC0; // type:function size:0x250 -fn_80028010 = .text:0x80028010; // type:function size:0x6C -fn_80028080 = .text:0x80028080; // type:function size:0x100 -fn_80028180 = .text:0x80028180; // type:function size:0x10 -fn_80028190 = .text:0x80028190; // type:function size:0x270 -fn_80028400 = .text:0x80028400; // type:function size:0x18 -fn_80028420 = .text:0x80028420; // type:function size:0x58 -fn_80028480 = .text:0x80028480; // type:function size:0x170 -fn_800285F0 = .text:0x800285F0; // type:function size:0x19C -fn_80028790 = .text:0x80028790; // type:function size:0x88 -fn_80028820 = .text:0x80028820; // type:function size:0x9C -fn_800288C0 = .text:0x800288C0; // type:function size:0x38 -fn_80028900 = .text:0x80028900; // type:function size:0x180 -fn_80028A80 = .text:0x80028A80; // type:function size:0x434 -fn_80028EC0 = .text:0x80028EC0; // type:function size:0xCC -fn_80028F90 = .text:0x80028F90; // type:function size:0xE0 -fn_80029070 = .text:0x80029070; // type:function size:0x4 -playEffects = .text:0x80029080; // type:function size:0x1A8 -fn_80029230 = .text:0x80029230; // type:function size:0xB0 -fn_800292E0 = .text:0x800292E0; // type:function size:0x18 -fn_80029300 = .text:0x80029300; // type:function size:0x94 -fn_800293A0 = .text:0x800293A0; // type:function size:0x1EC -EffectManager__ctor = .text:0x80029590; // type:function size:0xC8 -fn_80029660 = .text:0x80029660; // type:function size:0x90 -EffectManager__dtor = .text:0x800296F0; // type:function size:0xBC -fn_800297B0 = .text:0x800297B0; // type:function size:0x90 -fn_80029840 = .text:0x80029840; // type:function size:0x6C -fn_800298B0 = .text:0x800298B0; // type:function size:0x4 -fn_800298C0__13EffectsStructFUsP7mVec3_cPvPvPvPv = .text:0x800298C0; // type:function size:0x4C -fn_80029910 = .text:0x80029910; // type:function size:0x4 -fn_80029920 = .text:0x80029920; // type:function size:0x54 -fn_80029980__13EffectsStructFUsP7mVec3_cP7mAng3_cP7mVec3_cPvPv = .text:0x80029980; // type:function size:0x64 -fn_800299F0__13EffectsStructFUsP6mMtx_cPvPv = .text:0x800299F0; // type:function size:0x20 -fn_80029A10__13EffectsStructFUsP7mVec3_cP7mAng3_cP7mVec3_cPvPv = .text:0x80029A10; // type:function size:0x54 -fn_80029A70__13EffectsStructFUsP7mVec3_cP7mAng3_cP7mVec3_cPvPv = .text:0x80029A70; // type:function size:0x64 -fn_80029AE0 = .text:0x80029AE0; // type:function size:0x20 -fn_80029B00 = .text:0x80029B00; // type:function size:0xD8 -fn_80029BE0 = .text:0x80029BE0; // type:function size:0x43C -fn_8002A020 = .text:0x8002A020; // type:function size:0xA4 -fn_8002A0D0 = .text:0x8002A0D0; // type:function size:0x15C -fn_8002A230 = .text:0x8002A230; // type:function size:0x150 -fn_8002A380 = .text:0x8002A380; // type:function size:0xCC -fn_8002A450 = .text:0x8002A450; // type:function size:0x1C0 +addToActiveEmittersList__13EffectsStructFUsb = .text:0x80027770; // type:function size:0xE8 +areAllEmittersDone__13EffectsStructFv = .text:0x80027860; // type:function size:0xC8 +execute__13EffectsStructFv = .text:0x80027930; // type:function size:0x130 +getOwnerPolyAttrs__13EffectsStructFPlPl = .text:0x80027A60; // type:function size:0x44 +realizeAlpha__13EffectsStructFv = .text:0x80027AB0; // type:function size:0x6C +setFading__13EffectsStructFUc = .text:0x80027B20; // type:function size:0x24 +create__18dParticleFogProc_cFUlllP16mHeapAllocator_c = .text:0x80027B50; // type:function size:0x80 +doDraw__18dParticleFogProc_cFv = .text:0x80027BD0; // type:function size:0xD8 +draw__11dEffect2D_cFv = .text:0x80027CB0; // type:function size:0x100 +create__11dEffect2D_cFUlUc = .text:0x80027DB0; // type:function size:0xC +doDraw__15dShpEmitterProcFv = .text:0x80027DC0; // type:function size:0x250 +create__13dShpEmitter_cFP16mHeapAllocator_c = .text:0x80028010; // type:function size:0x6C +init__13dShpEmitter_cFPCcPCcb = .text:0x80028080; // type:function size:0x100 +clear__13dShpEmitter_cFv = .text:0x80028180; // type:function size:0x10 +draw__13dShpEmitter_cFP14JPABaseEmitterP15JPABaseParticle = .text:0x80028190; // type:function size:0x270 +draw__21CommonEmitterCallbackFP14JPABaseEmitter = .text:0x80028400; // type:function size:0x18 +start__25dMassObjEmitterCallback_cFRC7mVec3_cP12dAcObjBase_c = .text:0x80028420; // type:function size:0x58 +executeAfter__25dMassObjEmitterCallback_cFP14JPABaseEmitter = .text:0x80028480; // type:function size:0x170 +execute__25dMassObjEmitterCallback_cFv = .text:0x800285F0; // type:function size:0x19C +clear__25dMassObjEmitterCallback_cFv = .text:0x80028790; // type:function size:0x88 +create__17dMassObjEmitter_cFUs = .text:0x80028820; // type:function size:0x9C +remove__17dMassObjEmitter_cFv = .text:0x800288C0; // type:function size:0x38 +getGroupId__14dJEffManager_cFUs = .text:0x80028900; // type:function size:0x180 +setupEffects__14dJEffManager_cFv = .text:0x80028A80; // type:function size:0x434 +removeEffManagers__14dJEffManager_cFv = .text:0x80028EC0; // type:function size:0xCC +doCustomSkywardSwordThing__14dJEffManager_cFff = .text:0x80028F90; // type:function size:0xE0 +vt_0x20__18dEmitterCallback_cFff = .text:0x80029070; // type:function size:0x4 +execute__14dJEffManager_cFv = .text:0x80029080; // type:function size:0x1A8 +draw__14dJEffManager_cFv = .text:0x80029230; // type:function size:0xB0 +draw__14dJEffManager_cFPC11JPADrawInfoUl = .text:0x800292E0; // type:function size:0x18 +shouldBePaused__14dJEffManager_cFP7dBase_c = .text:0x80029300; // type:function size:0x94 +createEffManagers__14dJEffManager_cFv = .text:0x800293A0; // type:function size:0x1EC +__ct__17dMassObjEmitter_cFv = .text:0x80029590; // type:function size:0xC8 +__dt__25dMassObjEmitterCallback_cFv = .text:0x80029660; // type:function size:0x90 +__dt__17dMassObjEmitter_cFv = .text:0x800296F0; // type:function size:0xBC +spawnEffectInternal__14dJEffManager_cFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColorll = .text:0x800297B0; // type:function size:0x90 +spawnEffectInternal__14dJEffManager_cFUsRC6mMtx_cPC8_GXColorPC8_GXColorll = .text:0x80029840; // type:function size:0x6C +spawnEffect__14dJEffManager_cFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColorll = .text:0x800298B0; // type:function size:0x4 +spawnUIEffect__14dJEffManager_cFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColor = .text:0x800298C0; // type:function size:0x4C +spawnEffect__14dJEffManager_cFUsRC6mMtx_cPC8_GXColorPC8_GXColorll = .text:0x80029910; // type:function size:0x4 +createEffect__13EffectsStructFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColor = .text:0x80029920; // type:function size:0x54 +createUIEffect__13EffectsStructFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColor = .text:0x80029980; // type:function size:0x64 +createEffect__13EffectsStructFUsRC6mMtx_cPC8_GXColorPC8_GXColor = .text:0x800299F0; // type:function size:0x20 +createContinuousEffect__13EffectsStructFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColor = .text:0x80029A10; // type:function size:0x54 +createContinuousUIEffect__13EffectsStructFUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColor = .text:0x80029A70; // type:function size:0x64 +createContinuousEffect__13EffectsStructFUsRC6mMtx_cPC8_GXColorPC8_GXColor = .text:0x80029AE0; // type:function size:0x20 +createMassObjEffect__14dJEffManager_cFUsRC7mVec3_cP12dAcObjBase_cPC6mColor = .text:0x80029B00; // type:function size:0xD8 +loadColors__14dEmitterBase_cFP14JPABaseEmitterPC8_GXColorPC8_GXColorll = .text:0x80029BE0; // type:function size:0x43C +removeFromActiveEmittersList__13EffectsStructFv = .text:0x8002A020; // type:function size:0xA4 +createEffect__13EffectsStructFbUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColor = .text:0x8002A0D0; // type:function size:0x15C +createEffect__13EffectsStructFbUsRC6mMtx_cPC8_GXColorPC8_GXColor = .text:0x8002A230; // type:function size:0x150 +polyAttrsToGroundEffectIdx__14dJEffManager_cFll = .text:0x8002A380; // type:function size:0xCC +spawnGroundEffect__14dJEffManager_cFRC7mVec3_cUcUcRC7mVec3_clff = .text:0x8002A450; // type:function size:0x1C0 fn_8002A610 = .text:0x8002A610; // type:function size:0x678 fn_8002AC90 = .text:0x8002AC90; // type:function size:0x460 fn_8002B0F0 = .text:0x8002B0F0; // type:function size:0x8 -init__17EffectsStruct_ExtFP7dBase_cfff = .text:0x8002B100; // type:function size:0x14 -fn_8002B120__17EffectsStruct_ExtFff = .text:0x8002B120; // type:function size:0x1F4 -fn_8002B320 = .text:0x8002B320; // type:function size:0x4 -fn_8002B330 = .text:0x8002B330; // type:function size:0x4 -fn_8002B340 = .text:0x8002B340; // type:function size:0x4 -fn_8002B350 = .text:0x8002B350; // type:function size:0x4 -fn_8002B360 = .text:0x8002B360; // type:function size:0x58 -fn_8002B3C0 = .text:0x8002B3C0; // type:function size:0x4 -fn_8002B3D0 = .text:0x8002B3D0; // type:function size:0x7C -fn_8002B450 = .text:0x8002B450; // type:function size:0x68 -fn_8002B4C0 = .text:0x8002B4C0; // type:function size:0x5C -fn_8002B520 = .text:0x8002B520; // type:function size:0x58 -fn_8002B580 = .text:0x8002B580; // type:function size:0x4 -fn_8002B590 = .text:0x8002B590; // type:function size:0x4 -fn_8002B5A0 = .text:0x8002B5A0; // type:function size:0x58 -fn_8002B600 = .text:0x8002B600; // type:function size:0x5C -fn_8002B660 = .text:0x8002B660; // type:function size:0x4 -fn_8002B670 = .text:0x8002B670; // type:function size:0x4 -fn_8002B680 = .text:0x8002B680; // type:function size:0x4 -fn_8002B690 = .text:0x8002B690; // type:function size:0x4 -fn_8002B6A0 = .text:0x8002B6A0; // type:function size:0x4 -initEffectsThingsMaybe = .text:0x8002B6B0; // type:function size:0x158 -fn_8002B810 = .text:0x8002B810; // type:function size:0x18 -fn_8002B830 = .text:0x8002B830; // type:function size:0x1C -fn_8002B850 = .text:0x8002B850; // type:function size:0x78 -fn_8002B8D0 = .text:0x8002B8D0; // type:function size:0x1C -fn_8002B8F0 = .text:0x8002B8F0; // type:function size:0x44 -fn_8002B940 = .text:0x8002B940; // type:function size:0x1C -fn_8002B960 = .text:0x8002B960; // type:function size:0x18 -fn_8002B980 = .text:0x8002B980; // type:function size:0x1C +init__14dWaterEffect_cFP12dAcObjBase_cfff = .text:0x8002B100; // type:function size:0x14 +execute__14dWaterEffect_cFff = .text:0x8002B120; // type:function size:0x1F4 +drawAfter__18JPAEmitterCallBackFP14JPABaseEmitter = .text:0x8002B320; // type:function size:0x4 +draw__18JPAEmitterCallBackFP14JPABaseEmitter = .text:0x8002B330; // type:function size:0x4 +execute__18JPAEmitterCallBackFP14JPABaseEmitter = .text:0x8002B340; // type:function size:0x4 +executeAfter__18JPAEmitterCallBackFP14JPABaseEmitter = .text:0x8002B350; // type:function size:0x4 +__dt__21CommonEmitterCallbackFv = .text:0x8002B360; // type:function size:0x58 +execute__19JPAParticleCallBackFP14JPABaseEmitterP15JPABaseParticle = .text:0x8002B3C0; // type:function size:0x4 +__dt__13dShpEmitter_cFv = .text:0x8002B3D0; // type:function size:0x7C +__dt__15dShpEmitterProcFv = .text:0x8002B450; // type:function size:0x68 +__dt__11dShpProc1_cFv = .text:0x8002B4C0; // type:function size:0x5C +__dt__14dShpProcBase_cFv = .text:0x8002B520; // type:function size:0x58 +drawXlu__15dShpEmitterProcFv = .text:0x8002B580; // type:function size:0x4 +drawOpa__15dShpEmitterProcFv = .text:0x8002B590; // type:function size:0x4 +__dt__11dEffect2D_cFv = .text:0x8002B5A0; // type:function size:0x58 +__dt__18dParticleFogProc_cFv = .text:0x8002B600; // type:function size:0x5C +drawXlu__18dParticleFogProc_cFv = .text:0x8002B660; // type:function size:0x4 +drawOpa__18dParticleFogProc_cFv = .text:0x8002B670; // type:function size:0x4 +draw__19JPAParticleCallBackFP14JPABaseEmitterP15JPABaseParticle = .text:0x8002B680; // type:function size:0x4 +drawXlu__11dShpProc1_cFv = .text:0x8002B690; // type:function size:0x4 +drawOpa__11dShpProc1_cFv = .text:0x8002B6A0; // type:function size:0x4 +__sinit_\d_emitter_cpp = .text:0x8002B6B0; // type:function size:0x158 scope:local +__ct__21CommonEmitterCallbackFv = .text:0x8002B810; // type:function size:0x18 +__arraydtor$9497 = .text:0x8002B830; // type:function size:0x1C scope:local +__ct__13dShpEmitter_cFv = .text:0x8002B850; // type:function size:0x78 +__arraydtor$9499 = .text:0x8002B8D0; // type:function size:0x1C scope:local +__ct__18dParticleFogProc_cFv = .text:0x8002B8F0; // type:function size:0x44 +__arraydtor$9502 = .text:0x8002B940; // type:function size:0x1C scope:local +__ct__11dEffect2D_cFv = .text:0x8002B960; // type:function size:0x18 +__arraydtor$9504 = .text:0x8002B980; // type:function size:0x1C scope:local fn_8002B9A0 = .text:0x8002B9A0; // type:function size:0x30 fn_8002B9D0 = .text:0x8002B9D0; // type:function size:0x10C fn_8002BAE0 = .text:0x8002BAE0; // type:function size:0x228 @@ -10595,7 +10595,7 @@ fn_8019A020 = .text:0x8019A020; // type:function size:0xC fn_8019A030 = .text:0x8019A030; // type:function size:0x1C fn_8019A050 = .text:0x8019A050; // type:function size:0x1C fn_8019A070 = .text:0x8019A070; // type:function size:0x30 -fn_8019A0A0 = .text:0x8019A0A0; // type:function size:0x20 +getGlobalAlpha__11dStageMgr_cCFv = .text:0x8019A0A0; // type:function size:0x20 fn_8019A0C0 = .text:0x8019A0C0; // type:function size:0x2C8 fn_8019A390 = .text:0x8019A390; // type:function size:0x44 fn_8019A3E0 = .text:0x8019A3E0; // type:function size:0x2C8 @@ -17850,8 +17850,8 @@ ZXYrotM__6mMtx_cFRC4mAngRC4mAngRC4mAng = .text:0x802F1A40; // type:function size mMtx__XYZrotS = .text:0x802F1AA0; // type:function size:0x60 mMtx__ZYXrotM = .text:0x802F1B00; // type:function size:0x60 toRot__6mMtx_cCFR7mAng3_c = .text:0x802F1B60; // type:function size:0xDC -fn_802F1C40 = .text:0x802F1C40; // type:function size:0x220 -mMtx_c__makeRotationFromVecs = .text:0x802F1E60; // type:function size:0x58 +fn_802F1C40__6mMtx_cFll = .text:0x802F1C40; // type:function size:0x220 +makeRotationFromVecs__6mMtx_cFRC7mVec3_cRC7mVec3_cf = .text:0x802F1E60; // type:function size:0x58 __sinit_\m_mtx_cpp = .text:0x802F1EC0; // type:function size:0x58 scope:local create__4mPadFv = .text:0x802F1F20; // type:function size:0x30 beginPad__4mPadFv = .text:0x802F1F50; // type:function size:0x1E4 @@ -27773,7 +27773,7 @@ lbl_804DBC38 = .rodata:0x804DBC38; // type:object size:0x40 lbl_804DBC78 = .rodata:0x804DBC78; // type:object size:0x50 data:4byte GRADIENT_LIGHT_TEXTURE_DEFS = .rodata:0x804DBCC8; // type:object size:0x40 data:4byte lbl_804DBD08 = .rodata:0x804DBD08; // type:object size:0x10 data:float -lbl_804DBD18 = .rodata:0x804DBD18; // type:object size:0x28 +moreInts__14dJEffManager_c = .rodata:0x804DBD18; // type:object size:0x28 lbl_804DBD40 = .rodata:0x804DBD40; // type:object size:0x134 lbl_804DBE74 = .rodata:0x804DBE74; // type:object size:0xC lbl_804DBE80 = .rodata:0x804DBE80; // type:object size:0xB8 @@ -28364,7 +28364,7 @@ GET_POTION_BOTTLE_DEFS = .rodata:0x804E9610; // type:object size:0x40 ITEM_MODEL_INDEX = .rodata:0x804E9650; // type:object size:0xA8 ITEM_MODEL_DEFS = .rodata:0x804E96F8; // type:object size:0x350 RUPEE_ITEM_TO_TEX_FRAME = .rodata:0x804E9A48; // type:object size:0x38 data:2byte -lbl_804E9A80 = .rodata:0x804E9A80; // type:object size:0x18 data:2byte +sEffectResourceIds = .rodata:0x804E9A80; // type:object size:0x18 data:2byte lbl_804E9A98 = .rodata:0x804E9A98; // type:object size:0x10 lbl_804E9AA8 = .rodata:0x804E9AA8; // type:object size:0x10 blanMap = .rodata:0x804E9AB8; // type:object size:0x18 scope:local data:4byte @@ -29904,17 +29904,17 @@ __vt__21BlurAndPaletteManager = .data:0x80500E80; // type:object size:0xC lbl_80500E8C = .data:0x80500E8C; // type:object size:0xC lbl_80500E98 = .data:0x80500E98; // type:object size:0x10 data:string lbl_80500EA8 = .data:0x80500EA8; // type:object size:0x444 -lbl_805012EC = .data:0x805012EC; // type:object size:0xC -lbl_805012F8 = .data:0x805012F8; // type:object size:0x24 -lbl_8050131C = .data:0x8050131C; // type:object size:0x1C -lbl_80501338 = .data:0x80501338; // type:object size:0x14 -lbl_8050134C = .data:0x8050134C; // type:object size:0x2C -lbl_80501378 = .data:0x80501378; // type:object size:0x10 -lbl_80501388 = .data:0x80501388; // type:object size:0x30 -lbl_805013B8 = .data:0x805013B8; // type:object size:0x18 -lbl_805013D0 = .data:0x805013D0; // type:object size:0x24 -lbl_805013F4 = .data:0x805013F4; // type:object size:0xC -lbl_80501400 = .data:0x80501400; // type:object size:0xC0 +__vt__17dMassObjEmitter_c = .data:0x805012EC; // type:object size:0xC +__vt__25dMassObjEmitterCallback_c = .data:0x805012F8; // type:object size:0x24 +__vt__21CommonEmitterCallback = .data:0x8050131C; // type:object size:0x1C +__vt__13dShpEmitter_c = .data:0x80501338; // type:object size:0x14 +__vt__15dShpEmitterProc = .data:0x8050134C; // type:object size:0x2C +__vt__11dEffect2D_c = .data:0x80501378; // type:object size:0x10 +__vt__18dParticleFogProc_c = .data:0x80501388; // type:object size:0x2C +__vt__19dParticleCallback_c = .data:0x805013B8; // type:object size:0x18 +__vt__18dEmitterCallback_c = .data:0x805013D0; // type:object size:0x24 +__vt__13EffectsStruct = .data:0x805013F4; // type:object size:0xC +__vt__14dEmitterBase_c = .data:0x80501400; // type:object size:0xC lbl_805014C0 = .data:0x805014C0; // type:object size:0x28 lbl_805014E8 = .data:0x805014E8; // type:object size:0x18 lbl_80501500 = .data:0x80501500; // type:object size:0x28 @@ -39892,10 +39892,10 @@ lbl_80575058 = .sbss:0x80575058; // type:object size:0x8 data:byte lbl_80575060 = .sbss:0x80575060; // type:object size:0x1 data:byte lbl_80575064 = .sbss:0x80575064; // type:object size:0x4 data:4byte sPInstance__21BlurAndPaletteManager = .sbss:0x80575068; // type:object size:0x8 data:4byte -lbl_80575070 = .sbss:0x80575070; // type:object size:0x4 data:4byte +sMassObjEmitters__14dJEffManager_c = .sbss:0x80575070; // type:object size:0x4 data:4byte CURRENT_EFFECT_MANAGER_INIT = .sbss:0x80575074; // type:object size:0x4 data:4byte -lbl_80575078 = .sbss:0x80575078; // type:object size:0x4 data:4byte -lbl_8057507C = .sbss:0x8057507C; // type:object size:0x1 data:byte +ms_allocator__14dJEffManager_c = .sbss:0x80575078; // type:object size:0x4 data:4byte +@GUARD@spawnGroundEffect__14dJEffManager_cFRC7mVec3_cUcUcRC7mVec3_clff@sEffArray = .sbss:0x8057507C; // type:object size:0x1 data:byte lbl_8057507D = .sbss:0x8057507D; // type:object size:0x1 data:byte s_Create_Position__9dAcBase_c = .sbss:0x80575080; // type:object size:0x4 data:4byte s_Create_Rotation__9dAcBase_c = .sbss:0x80575084; // type:object size:0x4 data:4byte @@ -44209,7 +44209,7 @@ PARTICLE_RESOURCE_ID_MAPPING_991_ = .sdata2:0x8057AB6E; // type:object size:0x2 PARTICLE_RESOURCE_ID_MAPPING_992_ = .sdata2:0x8057AB70; // type:object size:0x2 data:2byte lbl_8057AB72 = .sdata2:0x8057AB72; // type:object size:0x2 data:2byte lbl_8057AB74 = .sdata2:0x8057AB74; // type:object size:0x2 data:2byte -EffectManager__NumberOfManagers = .sdata2:0x8057AB78; // type:object size:0x8 data:4byte +sNumMassObjEmitters = .sdata2:0x8057AB78; // type:object size:0x8 data:4byte lbl_8057AB80 = .sdata2:0x8057AB80; // type:object size:0x8 data:byte lbl_8057AB88 = .sdata2:0x8057AB88; // type:object size:0x4 data:float lbl_8057AB8C = .sdata2:0x8057AB8C; // type:object size:0x4 data:float @@ -48465,12 +48465,12 @@ lbl_8058F1F0 = .bss:0x8058F1F0; // type:object size:0x20 data:byte lbl_8058F210 = .bss:0x8058F210; // type:object size:0x10 sInstance__21BlurAndPaletteManager = .bss:0x8058F220; // type:object size:0x5D70 lbl_80594F90 = .bss:0x80594F90; // type:object size:0x10 data:4byte -lbl_80594FA0 = .bss:0x80594FA0; // type:object size:0x18 data:4byte -lbl_80594FB8 = .bss:0x80594FB8; // type:object size:0x1C -lbl_80594FD4 = .bss:0x80594FD4; // type:object size:0x1E2C -GLOBAL_EFFECT_THING = .bss:0x80596E00; // type:object size:0x30 data:4byte -lbl_80596E30 = .bss:0x80596E30; // type:object size:0x18C -lbl_80596FBC = .bss:0x80596FBC; // type:object size:0x3C +sPlayingEffectsList__14dJEffManager_c = .bss:0x80594FA0; // type:object size:0x18 data:4byte +sCommonEmitterCallbacks__14dJEffManager_c = .bss:0x80594FB8; // type:object size:0x1C +sShpEmitters__14dJEffManager_c = .bss:0x80594FD4; // type:object size:0x1E2C +sEmitter__14dJEffManager_c = .bss:0x80596E00; // type:object size:0x30 data:4byte +sFogProcs__14dJEffManager_c = .bss:0x80596E30; // type:object size:0x18C +s2DEffects__14dJEffManager_c = .bss:0x80596FBC; // type:object size:0x3C lbl_80596FF8 = .bss:0x80596FF8; // type:object size:0x18 data:2byte lbl_80597010 = .bss:0x80597010; // type:object size:0x10 data:2byte lbl_80597020 = .bss:0x80597020; // type:object size:0x10 data:float diff --git a/configure.py b/configure.py index 061881a6..da64f42f 100644 --- a/configure.py +++ b/configure.py @@ -389,7 +389,7 @@ config.libs = [ Object(NonMatching, "toBeSorted/d_unk_mdl_stuff_1.cpp"), Object(NonMatching, "toBeSorted/d_unk_mdl_stuff_2.cpp"), Object(NonMatching, "toBeSorted/blur_and_palette_manager.cpp"), - Object(NonMatching, "toBeSorted/d_effects_1.cpp"), + Object(NonMatching, "toBeSorted/d_emitter.cpp"), Object(NonMatching, "toBeSorted/d_effects_2.cpp"), Object(NonMatching, "toBeSorted/sound_info.cpp"), Object(NonMatching, "d/a/d_a_base.cpp"), diff --git a/include/JSystem/JParticle/JPADrawInfo.h b/include/JSystem/JParticle/JPADrawInfo.h index a358b072..ed269d7f 100644 --- a/include/JSystem/JParticle/JPADrawInfo.h +++ b/include/JSystem/JParticle/JPADrawInfo.h @@ -10,6 +10,7 @@ */ class JPADrawInfo { public: + JPADrawInfo() {} JPADrawInfo(Mtx param_0, f32 fovY, f32 aspect) { MTXCopy(param_0, mCamMtx); C_MTXLightPerspective(mPrjMtx, fovY, aspect, 0.5f, -0.5f, 0.5f, 0.5f); diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 6e49752f..678e327b 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -120,6 +120,7 @@ public: void clearStatus(u32 status) { mStatus &= ~status; } u32 checkStatus(u32 status) const { return (mStatus & status); } bool checkFlag(u32 flag) const { return !!(mpRes->getDyn()->getFlag() & flag); } + u32 getDynResUserWork() const { return mpRes->getDyn()->getResUserWork(); } u8 getResourceManagerID() const { return mResMgrID; } u8 getGroupID() const { return mGroupID; } u8 getDrawTimes() const { return mDrawTimes; } @@ -131,9 +132,8 @@ public: void setGlobalSRTMatrix(const Mtx m) { JPASetRMtxSTVecfromMtx(m, mGlobalRot, &mGlobalScl, &mGlobalTrs); - // set is actually used here in debug - mGlobalPScl.x = mGlobalScl.x; - mGlobalPScl.y = mGlobalScl.y; + // "set is used in TP debug" + mGlobalPScl.set(mGlobalScl.x, mGlobalScl.y); } void setGlobalTranslation(f32 x, f32 y, f32 z) { mGlobalTrs.set(x, y, z); } void setGlobalTranslation(const EGG::Vector3f& trs) { mGlobalTrs.set(trs); } @@ -185,6 +185,14 @@ public: mLocalScl.set(scale); } + f32 getGlobalParticleScaleX() const { + return mGlobalPScl.x; + } + + f32 getGlobalParticleScaleY() const { + return mGlobalPScl.y; + } + f32 get_r_f() { return mRndm.get_rndm_f(); } f32 get_r_zp() { return mRndm.get_rndm_zp(); } f32 get_r_zh() { return mRndm.get_rndm_zh(); } diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 556352e7..945c9e61 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -143,7 +143,7 @@ public: rot_copy = rotation; } - mVec3_c &GetPostion() { + mVec3_c &GetPosition() { return position; } mAng3_c &GetRotation() { diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 983b701f..b897bdf1 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -17,7 +17,7 @@ #include "s/s_State.hpp" #include "toBeSorted/actor_event.h" #include "toBeSorted/dowsing_target.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" class dAcItem_0xB34 { public: diff --git a/include/d/a/obj/d_a_obj_arrow.h b/include/d/a/obj/d_a_obj_arrow.h index 8bedda03..6e2d1a17 100644 --- a/include/d/a/obj/d_a_obj_arrow.h +++ b/include/d/a/obj/d_a_obj_arrow.h @@ -9,7 +9,7 @@ #include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" #include "s/s_StateID.hpp" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" class dAcArrow_c : public dAcObjBase_c { public: diff --git a/include/d/a/obj/d_a_obj_bomb.h b/include/d/a/obj/d_a_obj_bomb.h index e82b3743..c5cd71d2 100644 --- a/include/d/a/obj/d_a_obj_bomb.h +++ b/include/d/a/obj/d_a_obj_bomb.h @@ -13,7 +13,7 @@ #include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" #include "s/s_StateID.hpp" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" // This may need its own file and could be independent of a bomb class UnkBombColInfo : public cBgS_PolyInfo { diff --git a/include/d/a/obj/d_a_obj_dungeon_ship.h b/include/d/a/obj/d_a_obj_dungeon_ship.h index 18fbdb31..d8106eb8 100644 --- a/include/d/a/obj/d_a_obj_dungeon_ship.h +++ b/include/d/a/obj/d_a_obj_dungeon_ship.h @@ -13,7 +13,7 @@ #include "toBeSorted/actor_event.h" #include "toBeSorted/actor_on_rail.h" #include "toBeSorted/dowsing_target.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/time_proc.h" class dAcODungeonShip_c : public dAcObjBase_c { diff --git a/include/d/a/obj/d_a_obj_seat_sword.h b/include/d/a/obj/d_a_obj_seat_sword.h index ec74ab45..cedbf9db 100644 --- a/include/d/a/obj/d_a_obj_seat_sword.h +++ b/include/d/a/obj/d_a_obj_seat_sword.h @@ -17,7 +17,7 @@ #include "s/s_StateMgr.hpp" #include "toBeSorted/actor_event.h" #include "toBeSorted/attention.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" class dAcOSeatSword_c : public dAcObjBase_c { public: diff --git a/include/d/a/obj/d_a_obj_tower_gearD101.h b/include/d/a/obj/d_a_obj_tower_gearD101.h index d77b665a..bcc98e7d 100644 --- a/include/d/a/obj/d_a_obj_tower_gearD101.h +++ b/include/d/a/obj/d_a_obj_tower_gearD101.h @@ -9,7 +9,7 @@ #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" /** * A callback implementation that controls the button node in the switch model. diff --git a/include/d/a/obj/d_a_obj_tower_hand_D101.h b/include/d/a/obj/d_a_obj_tower_hand_D101.h index 3dcca5fc..ae945915 100644 --- a/include/d/a/obj/d_a_obj_tower_hand_D101.h +++ b/include/d/a/obj/d_a_obj_tower_hand_D101.h @@ -13,7 +13,7 @@ #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" #include "toBeSorted/actor_event.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" class dAcOTowerHandD101_c : public dAcObjBase_c { diff --git a/include/d/a/obj/d_a_obj_triforce.h b/include/d/a/obj/d_a_obj_triforce.h index ac134bef..eefc90fe 100644 --- a/include/d/a/obj/d_a_obj_triforce.h +++ b/include/d/a/obj/d_a_obj_triforce.h @@ -8,7 +8,7 @@ #include "m/m3d/m_smdl.h" #include "m/m_angle.h" #include "nw4r/g3d/res/g3d_resfile.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" class dAcOtriforce_c : public dAcObjBase_c { public: diff --git a/include/d/a/obj/d_a_obj_tubo.h b/include/d/a/obj/d_a_obj_tubo.h index 582886e2..fe8fed49 100644 --- a/include/d/a/obj/d_a_obj_tubo.h +++ b/include/d/a/obj/d_a_obj_tubo.h @@ -15,7 +15,7 @@ #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" class dAcOtubo_c : public dAcObjBase_c { public: @@ -90,7 +90,7 @@ private: /* 0x764 */ dCcD_Sph mSph; /* 0x8B4 */ STATE_MGR_DECLARE(dAcOtubo_c); /* 0x8F0 */ dAcObjRef_unk mField_0x8F0; - /* 0x91C */ EffectsStruct_Ext mEff_0x91C; + /* 0x91C */ dWaterEffect_c mEff_0x91C; /* 0x964 */ dAcRef_c mCeLady; /* 0x970 */ dAcRef_c mCeFriend; /* 0x97C */ mQuat_c mQuat_0x97C; diff --git a/include/d/d_base.h b/include/d/d_base.h index b05be764..71adb880 100644 --- a/include/d/d_base.h +++ b/include/d/d_base.h @@ -27,14 +27,14 @@ public: /* 800509e0 */ static void initLoader(); /* 80050a00 */ static dBase_c *createBase(ProfileName, dBase_c *, u32, u8); /* 80050a10 */ static dBase_c *createRoot(ProfileName, u32, u8); - + + inline bool isBasePropertyFlag(u32 flag) const { + return (baseProperties & flag) != 0; + } private: /* 800509c0 */ static int loadAsyncCallback(); /* 800509d0 */ static void unloadCallback(); - inline bool isProcControlFlag(u32 flag) const { - return (baseProperties & flag) != 0; - } public: /* 805750c0 */ static u32 s_ExecuteControlFlags; diff --git a/include/d/d_cs_game.h b/include/d/d_cs_game.h index a090bf97..4050fddf 100644 --- a/include/d/d_cs_game.h +++ b/include/d/d_cs_game.h @@ -9,7 +9,7 @@ #include "s/s_FStateID.hpp" #include "s/s_State.hpp" #include "s/s_StateID.hpp" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" struct CsGameConfigMaybe { CsGameConfigMaybe(); diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index 05377c6f..49e97c78 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -4,9 +4,9 @@ #include "d/col/bg/d_bg_s.h" #include "d/col/cc/d_cc_s.h" #include "d/d_base.h" +#include "d/d_bzs_types.h" #include "d/d_dylink.h" #include "d/d_fader.h" -#include "d/d_bzs_types.h" #include "egg/gfx/eggScreen.h" #include "m/m_allocator.h" #include "m/m_dvd.h" @@ -48,6 +48,8 @@ public: STATE_FUNC_DECLARE(dStageMgr_c, RestartScene); public: + u8 getGlobalAlpha() const; + bool isAreaTypeNormal() const; bool isAreaTypeDungeon() const; bool isAreaTypeSky() const; @@ -119,7 +121,7 @@ public: void setStif(const STIF *stif); s16 getFlagIndex() const; - void setDemoName(const SizedString<16>& name) { + void setDemoName(const SizedString<16> &name) { mDemoName = name; } @@ -169,16 +171,16 @@ private: /* 0x7814 */ dParticle::tex_c mParticleTex[2]; // ... /* 0x7930 */ dFader_c mFader; - + /* 0x7954 */ u16 mPcamCount; /* 0x7956 */ u16 mLyseCount; /* 0x7958 */ u16 mRmplCount; - + /* 0x795C */ const PCAM *mpPcam; /* 0x7960 */ const LYSE *mpLyse; /* 0x7964 */ const STIF *mpStif; /* 0x7968 */ const RMPL *mpRmpl; - + /* 0x799C */ mDvd_callback_c *mpDvdCallback; /* 0x79A0 */ mDvd_callback_c *mpDvdCallback2; diff --git a/include/d/lyt/meter/d_lyt_meter_item_select.h b/include/d/lyt/meter/d_lyt_meter_item_select.h index b076302a..d64e7eae 100644 --- a/include/d/lyt/meter/d_lyt_meter_item_select.h +++ b/include/d/lyt/meter/d_lyt_meter_item_select.h @@ -8,7 +8,7 @@ #include "d/lyt/d_window.h" #include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" class dLytMeterItemSelectIcon_c { public: @@ -291,7 +291,7 @@ private: /* 0x5778 */ f32 mArrowRotation; /* 0x577C */ f32 mArrowLength; /* 0x5780 */ f32 field_0x5780; - /* 0x5784 */ f32 field_0x5784; + /* 0x5784 */ f32 mEffectScale; /* 0x5788 */ s32 field_0x5788; /* 0x578C */ s32 field_0x578C; /* 0x5790 */ s32 field_0x5790; @@ -302,7 +302,7 @@ private: /* 0x5798 */ u8 field_0x5798; /* 0x5799 */ u8 field_0x5799; /* 0x579A */ u8 field_0x579A; - /* 0x579B */ u8 field_0x579B; + /* 0x579B */ u8 mEffectAlpha; /* 0x579C */ u8 mStoredBowVariant; /* 0x579C */ u8 mStoredSlingshotVariant; /* 0x579C */ u8 mStoredBeetleVariant; diff --git a/include/d/lyt/meter/d_lyt_meter_minus_btn.h b/include/d/lyt/meter/d_lyt_meter_minus_btn.h index 7478aea3..30fb1830 100644 --- a/include/d/lyt/meter/d_lyt_meter_minus_btn.h +++ b/include/d/lyt/meter/d_lyt_meter_minus_btn.h @@ -7,7 +7,7 @@ #include "d/lyt/d_window.h" #include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" // At 0x8, [8], size 0x48 class dLytMeterMinusBtnMenuIcon_c { diff --git a/include/m/m3d/m_proc.h b/include/m/m3d/m_proc.h index 0e2e4730..88a0852a 100644 --- a/include/m/m3d/m_proc.h +++ b/include/m/m3d/m_proc.h @@ -8,12 +8,12 @@ namespace m3d { class proc_c : public scnLeaf_c { public: - virtual ~proc_c(); - virtual int getType() const override; + /* vt 0x08 */ virtual ~proc_c(); + /* vt 0x0C */ virtual int getType() const override; bool create(mAllocator_c *, u32 *); - virtual void drawOpa(); - virtual void drawXlu(); + /* vt 0x18 */ virtual void drawOpa(); + /* vt 0x1C */ virtual void drawXlu(); }; } // namespace m3d diff --git a/include/m/m3d/m_scnleaf.h b/include/m/m3d/m_scnleaf.h index 5e7b7d49..b0ad5dd5 100644 --- a/include/m/m3d/m_scnleaf.h +++ b/include/m/m3d/m_scnleaf.h @@ -18,13 +18,14 @@ public: UnkClass() {} }; +// Note: Due to multiple inheritance, vtable offsets are shifted by 8 class scnLeaf_c : UnkClass, EGG::Disposer { public: scnLeaf_c(); - virtual ~scnLeaf_c(); - virtual int getType() const = 0; - virtual void remove(); - virtual int entry(); + /* vt 0x08 */ virtual ~scnLeaf_c(); + /* vt 0x0C */ virtual int getType() const = 0; + /* vt 0x10 */ virtual void remove(); + /* vt 0x14 */ virtual int entry(); void setOption(u32 flag, u32 set); void setScale(f32, f32, f32); diff --git a/include/m/m3d/m_shadow.h b/include/m/m3d/m_shadow.h index 7193e1c7..c5ce12ed 100644 --- a/include/m/m3d/m_shadow.h +++ b/include/m/m3d/m_shadow.h @@ -69,7 +69,7 @@ public: const mQuat_c &GetQuat() const { return mQuat; } - const mVec3_c &GetPostion() const { + const mVec3_c &GetPosition() const { return mPositionMaybe; } const f32 GetOffset() const { diff --git a/include/m/m_mtx.h b/include/m/m_mtx.h index 702d2459..668cfe5f 100644 --- a/include/m/m_mtx.h +++ b/include/m/m_mtx.h @@ -87,6 +87,9 @@ public: PSMTXMultVec(m, quat.v, quat.v); } + void fn_802F1C40(s32, s32); + void makeRotationFromVecs(const mVec3_c&, const mVec3_c&, f32); + public: static mMtx_c Identity; }; diff --git a/include/nw4r/math/math_types.h b/include/nw4r/math/math_types.h index 5ed34ad3..282ea18a 100644 --- a/include/nw4r/math/math_types.h +++ b/include/nw4r/math/math_types.h @@ -176,6 +176,15 @@ struct _MTX33 { struct MTX33 : _MTX33 { MTX33() {} + // clang-format off + MTX33(f32 f00, f32 f01, f32 f02, + f32 f10, f32 f11, f32 f12, + f32 f20, f32 f21, f32 f22) { + _00 = f00; _01 = f01; _02 = f02; + _10 = f10; _11 = f11; _12 = f12; + _20 = f20; _21 = f21; _22 = f22; + } + // clang-format on }; /****************************************************************************** diff --git a/include/toBeSorted/attention.h b/include/toBeSorted/attention.h index 69a9044b..96a8ed3e 100644 --- a/include/toBeSorted/attention.h +++ b/include/toBeSorted/attention.h @@ -8,7 +8,7 @@ #include "m/m3d/m_anmtexpat.h" #include "m/m3d/m_smdl.h" #include "m/m_allocator.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/raii_ptr.h" static const u32 OFF = 'off '; diff --git a/include/toBeSorted/blur_and_palette_manager.h b/include/toBeSorted/blur_and_palette_manager.h index b86394dd..24bab9bc 100644 --- a/include/toBeSorted/blur_and_palette_manager.h +++ b/include/toBeSorted/blur_and_palette_manager.h @@ -152,6 +152,9 @@ struct Bpm1 { struct Bpm2 { Bpm2() {} ~Bpm2() {} + + // maybe + u8 _0x00[0x14 - 0x00]; }; struct PaletteEAF_smol_entry { @@ -184,6 +187,7 @@ struct PaletteEAF_big { PaletteEAF_big_entry field_0x00[8]; }; +// Apparently particle color related struct Bpm3 { Bpm3() {} ~Bpm3() {} @@ -201,16 +205,22 @@ struct Bpm4 { struct Bpm7 { Bpm7() {} ~Bpm7() {} + + u8 _0x00[0x14 - 0x00]; }; struct Bpm8 { Bpm8() {} ~Bpm8() {} + + u8 _0x00[0x14 - 0x00]; }; struct Bpm9 { Bpm9() {} ~Bpm9() {} + + u8 _0x00[0x14 - 0x00]; }; class BlurAndPaletteManager { @@ -224,6 +234,10 @@ public: return sInstance; } + static BlurAndPaletteManager *GetPInstance() { + return sPInstance; + } + void fn_800247D0(mVec3_c, f32); void fn_80022AF0(f32); void setField_0x2F20(f32 arg) { @@ -242,6 +256,29 @@ public: return field_0x5CE4; } + const Spf &GetCurrentSph() const { + return currentSpf; + } + + const PaletteEAF_smol_entry& getSmallEAF(s32 idx1, s32 idx2) { + return field_0x38E4.field_0x00[idx1].field_0x00[idx2]; + } + + f32 getfield_0x2F14() const { + return field_0x2F14; + } + + f32 getfield_0x2F18() const { + return field_0x2F18; + } + + f32 getfield_0x2F1C() const { + return field_0x2F1C; + } + + static mColor &getLightColor1(); + static mColor &getLightColor2(); + private: mColor combineColors(const mColor &c1, const mColor &c2, f32 ratio); @@ -267,15 +304,22 @@ private: /* 0x2F0C */ s16 field_0x2F0C; /* 0x2F0E */ s16 field_0x2F0E; /* 0x2F10 */ u8 field_0x2F10; - /* 0x2F11 */ u8 field_0x2F11[0x2F20 - 0x2F11]; + /* 0x2F14 */ f32 field_0x2F14; + /* 0x2F18 */ f32 field_0x2F18; + /* 0x2F1C */ f32 field_0x2F1C; /* 0x2F20 */ f32 field_0x2F20; + /* 0x2F24 */ u8 _0x2F24[0x357C - 0x2F24]; /* 0x357C */ Bpm1 field_0x357C; + /* 0x3594 */ u8 _0x3594[0x35A0 - 0x3594]; /* 0x35A0 */ Bpm2 field_0x35A0; /* 0x35B4 */ Bpm7 field_0x35B4[8]; /* 0x3654 */ Bpm8 field_0x3654[10]; /* 0x371C */ Bpm9 field_0x371C[20]; + /* 0x38AC */ u8 _0x38AC[0x38B4 - 0x38AC]; /* 0x38B4 */ mVec3_c field_0x38B4; + /* 0x38C0 */ u8 _0x38C0[0x38C8 - 0x38C0]; /* 0x38C8 */ mVec3_c field_0x38C8; + /* 0x38D4 */ u8 _0x38D4[0x38E4 - 0x38D4]; /* 0x38E4 */ Bpm3 field_0x38E4; /* 0x48E4 */ Bpm4 field_0x48E4; /* 0x5CE4 */ PaletteDefaultMCF field_0x5CE4; diff --git a/include/toBeSorted/d_d3d.h b/include/toBeSorted/d_d3d.h index 36ca2040..1b5b43b1 100644 --- a/include/toBeSorted/d_d3d.h +++ b/include/toBeSorted/d_d3d.h @@ -177,6 +177,8 @@ private: class UnkProc : public m3d::proc_c { public: + bool create(int prioOpa, int prioXlu, mAllocator_c *alloc); + bool createXlu(int prioXlu, mAllocator_c *alloc); private: }; @@ -188,8 +190,6 @@ public: } virtual int entry() override; - bool create(int prioOpa, int prioXlu, mAllocator_c *alloc); - bool createXlu(int prioXlu, mAllocator_c *alloc); virtual void drawOpa() override { doDraw(); diff --git a/include/toBeSorted/d_emitter.h b/include/toBeSorted/d_emitter.h new file mode 100644 index 00000000..5baefaee --- /dev/null +++ b/include/toBeSorted/d_emitter.h @@ -0,0 +1,507 @@ +#ifndef EFFECTS_STRUCT_H +#define EFFECTS_STRUCT_H + +#include "JSystem/JParticle/JPADrawInfo.h" +#include "JSystem/JParticle/JPAEmitter.h" +#include "JSystem/JParticle/JPAParticle.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/d_base.h" +#include "m/m2d.h" +#include "m/m_allocator.h" +#include "m/m_angle.h" +#include "m/m_color.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "rvl/GX/GXTypes.h" +#include "toBeSorted/d_d3d.h" +#include "toBeSorted/d_unk_mdl_stuff_2.h" +#include "toBeSorted/tlist.h" + +#include + +class dEmitterBase_c; +class dEmitterCallback_c; +class dParticleCallback_c; + +class dEmitterBase_c { + friend class dEmitterCallback_c; + friend class dParticleCallback_c; + +public: + dEmitterBase_c() : mpEmitterHead(nullptr), mpEmitterCallback(nullptr), mpParticleCallback(nullptr) {} + + bool createEmitters( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2, s32 idx1, s32 idx2 + ); + + dEmitterCallback_c *getEmitterCallback() const { + return mpEmitterCallback; + } + +protected: + void deactivateEmitters(); + void stopCalcEmitters(); + void playCalcEmitters(); + static void loadColors(JPABaseEmitter *emitter, const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2); + + void setEmitterCallback(dEmitterCallback_c *cb); + void setParticleCallback(dParticleCallback_c *cb); + + void setImmortal(); + + static JPABaseEmitter *GetNextEmitter(JPABaseEmitter *head); + + /* 0x00 */ JPABaseEmitter *mpEmitterHead; + /* 0x04 */ dEmitterCallback_c *mpEmitterCallback; + /* 0x08 */ dParticleCallback_c *mpParticleCallback; + /* 0x0C */ TListNode mEmitterCallbackNode; + /* 0x14 */ TListNode mParticleCallbackNode; + +public: + // vtable at 0x1C + virtual ~dEmitterBase_c(); + + void stopDrawParticles(); + void playDrawParticles(); + void setPosRotScale(const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale); + void setPosRotScaleWithScreenScale(const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale); + void setTransform(const mMtx_c &mtx); + void loadColors(const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2); + void setGlobalAlpha(u8 alpha); + void setRate(f32 rate); + void setDynamicsScale(const mVec3_c &scale); + void setParticleScale(const mVec3_c &scale); + void setAwayFromCenterSpeed(f32 speed); + void setVolumeSize(u16 size); + void setLifeTime(s16 lifetime); + void attachEmitterCallbackId(s32 id); // corresponds to setup at 80028a80 + void bindShpEmitter(s32 id, bool unused); // corresponds to setup at 8002b6b0 +}; + +// Suggested name: dEmitter_c +class EffectsStruct : public dEmitterBase_c { +public: + enum Flags_e { + EMITTER_0x1 = 0x1, + EMITTER_0x2 = 0x2, + EMITTER_0x4 = 0x4, + EMITTER_Fading = 0x8, + EMITTER_0x10 = 0x10, + EMITTER_0x20 = 0x20, + }; + + // vt at 0x1C + EffectsStruct(); + EffectsStruct(dBase_c *); + virtual ~EffectsStruct(); + + inline void init(dBase_c *owner) { + mpOwner = owner; + } + + inline dBase_c *getOwner() const { + return mpOwner; + } + + void addToActiveEmittersList(u16 resourceId, bool bFlags); + void removeFromActiveEmittersList(); + void execute(); + void setFading(u8 lifetime); + + void remove(bool bForceDeleteEmitters); + + // TODO maybe reconsider the naming here - the observation here is that a "continous" effect + // is typically called every frame, while the others are one-shot calls + bool createContinuousEffect( + u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2 + ); + bool createContinuousUIEffect( + u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2 + ); + bool createContinuousEffect(u16 resourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2); + + bool createEffect( + u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2 + ); + bool createUIEffect( + u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2 + ); + bool createEffect(u16 resourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2); + + bool hasEmitters() const { + return mpEmitterHead != 0; + } + + u8 getGroupId() const { + return mpEmitterHead->getGroupID(); + } + + bool checkFlag(u32 flag) const { + return mFlags & flag; + } + + void onFlag(u32 flag) { + mFlags |= flag; + } + + void offFlag(u32 flag) { + mFlags &= ~flag; + } + + void realizeAlpha(); + bool areAllEmittersDone(); + +protected: + bool canReuse(u16 resourceId) const { + return hasEmitters() && !checkFlag(EMITTER_0x2) && mEffect == resourceId; + } + + bool createEffect( + bool bFlags, u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2 + ); + bool createEffect(bool bFlags, u16 resourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2); + bool getOwnerPolyAttrs(s32 *pOut1, s32 *pOut2); + +public: + /* 0x24 */ TListNode mNode; + +protected: + /* 0x28 */ dBase_c *mpOwner; + /* 0x2C */ u8 mFadeTimer; + /* 0x2D */ u8 mFadeDuration; + /* 0x2E */ u8 _0x2D[0x30 - 0x2E]; + /* 0x30 */ u16 mFlags; + /* 0x32 */ u16 mEffect; +}; + +class dWaterEffect_c { +private: + /* 0x00 */ bool mIsInWater; + /* 0x01 */ bool mIsSmall; + /* 0x04 */ f32 mHeight; + /* 0x08 */ f32 mDepth; + /* 0x0C */ f32 mScale; + /* 0x10 */ EffectsStruct mEff; + + dAcObjBase_c *getActor() const { + return static_cast(mEff.getOwner()); + } + + f32 getActorGroundPos(dAcObjBase_c *obj) const { + return obj->position.y + mDepth; + } + + f32 getActorCeilPos(dAcObjBase_c *obj) const { + return obj->position.y + mHeight; + } + +public: + dWaterEffect_c() : mIsInWater(1), mIsSmall(false) {} + virtual ~dWaterEffect_c() {} + + void init(dAcObjBase_c *, f32 height, f32 scale, f32 depth); + void execute(f32 water, f32 ground); + + void setIsSmall(bool val) { + mIsSmall = val; + } +}; + +/** An emitter callback can be part of multiple emitters. */ +class dEmitterCallback_c : public JPAEmitterCallBack { + friend class dEmitterBase_c; + + typedef TList EmitterCallbackList; + +public: + virtual ~dEmitterCallback_c(); + virtual void create(JPABaseEmitter *) {} + virtual void vt_0x20(f32, f32) {} + + void remove(dEmitterBase_c *emitter); + + /* 0x04 */ EmitterCallbackList mEmitterList; +}; + +/** A particle callback can be part of multiple emitters. */ +class dParticleCallback_c : public JPAParticleCallBack { + friend class dEmitterBase_c; + + typedef TList ParticleCallbackList; + +public: + virtual ~dParticleCallback_c(); + virtual void create(JPABaseEmitter *) {} + + void remove(dEmitterBase_c *emitter); + + /* 0x04 */ ParticleCallbackList mEmitterList; +}; + +class dParticleFogProc_c : public d3d::UnkProc { +public: + dParticleFogProc_c() {} + virtual ~dParticleFogProc_c() {} + virtual void drawOpa() override { + doDraw(); + } + virtual void drawXlu() override { + doDraw(); + } + + bool create(u32 idx, s32 prioOpa, s32 prioXlu, mHeapAllocator_c *alloc); + +private: + void doDraw(); + /* 0x18 */ u32 mIdx; + /* 0x1C */ bool field_0x1C; +}; + +class dEffect2D_c : public m2d::Base_c { +public: + dEffect2D_c() : m2d::Base_c(0x80) {} + /* vt 0x08 */ virtual ~dEffect2D_c() {} + /* vt 0x0C */ virtual void draw() override; + + void create(u32 groupId, u8); + +private: + /* 0x10 */ u32 mGroupId; +}; + +class dShpEmitter_c; + +class dShpEmitterProc : public dShpProc1_c { +public: + dShpEmitterProc() : mpOwner(nullptr) {} + virtual ~dShpEmitterProc() { + mpOwner = nullptr; + } + virtual void drawOpa() override { + doDraw(); + } + virtual void drawXlu() override { + doDraw(); + } + + void setOwner(dShpEmitter_c *cb) { + mpOwner = cb; + } + + void setAlpha(s32 idx, u8 val) { + mAlpha[idx] = val; + } + +private: + void doDraw(); + /* 0x34 */ dShpEmitter_c *mpOwner; + // TODO: This is read from JParticle as alpha, but used as the nw4r::g3d lightSetId. + // Is this a creative use of the particle color value, given that particles themselves + // are never drawn? + /* 0x38 */ u8 mAlpha[100]; +}; + +class dShpEmitter_c : public JPAParticleCallBack { +public: + virtual ~dShpEmitter_c() {} + virtual void draw(JPABaseEmitter *, JPABaseParticle *) override; + + bool create(mHeapAllocator_c *alloc); + void init(const char *mdlName, const char *arcName, bool priority); + void clear(); + void remove(); + void draw() { + mProc.entry(); + } + +private: + /* 0x04 */ dShpEmitterProc mProc; + /* 0xA0 */ s32 field_0xA0; +}; + +class CommonEmitterCallback : public JPAEmitterCallBack { +public: + CommonEmitterCallback() : field_0x04(0) {} + virtual ~CommonEmitterCallback() {} + virtual void draw(JPABaseEmitter *) override; + void init(s32 v) { + field_0x04 = v; + } + +private: + /* 0x04 */ s32 field_0x04; +}; + +class dMassObjEmitterCallback_c : public dEmitterCallback_c { +public: + virtual ~dMassObjEmitterCallback_c() {} + virtual void executeAfter(JPABaseEmitter *) override; + + void execute(); + void clear(); + bool start(const mVec3_c &v1, dAcObjBase_c *owner); + +private: + /* 0x010 */ mVec3_c field_0x010[50]; + /* 0x268 */ mVec3_c field_0x268[50]; + /* 0x4C0 */ dAcObjBase_c *field_0x4C0[50]; + /* 0x588 */ dAcObjBase_c *field_0x588[50]; + /* 0x650 */ mColor field_0x650; + /* 0x654 */ u32 field_0x654; + /* 0x658 */ u32 field_0x658; + // TODO unclear structure boundary +}; + +class dMassObjEmitter_c : public dEmitterBase_c { +public: + dMassObjEmitter_c() {} + virtual ~dMassObjEmitter_c() { + remove(); + } + + void create(u16 resourceId); + bool start(const mVec3_c &v1, dAcObjBase_c *owner) { + return mCallback.start(v1, owner); + } + void remove(); + + mColor getField_0x67C() const { + return field_0x67C; + } + + void setField_0x67C(GXColor clr) { + field_0x67C.r = clr.r; + field_0x67C.g = clr.g; + field_0x67C.b = clr.b; + field_0x67C.a = clr.a; + } + + + void setField_0x67C(mColor clr) { + field_0x67C.r = clr.r; + field_0x67C.g = clr.g; + field_0x67C.b = clr.b; + field_0x67C.a = clr.a; + } + + void execute() { + mCallback.execute(); + } + +private: + /* 0x020 */ dMassObjEmitterCallback_c mCallback; + /* 0x67C */ mColor field_0x67C; +}; + +class dJEffManager_c { +public: + static bool createEffManagers(); + static void removeEffManagers(); + static void draw(const JPADrawInfo *info, u32 groupId); + static void draw(); + static void execute(); + static void doCustomSkywardSwordThing(f32 x, f32 y); + static void setupEffects(); + static dEmitterBase_c *spawnEffect( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2, s32 idx1, s32 idx2 + ); + static dEmitterBase_c *spawnUIEffect( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2 + ); + static dEmitterBase_c *spawnEffect( + u16 effectResourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2 + ); + static dEmitterBase_c *spawnGroundEffect(const mVec3_c &pos, u8 polyAttr0, u8 polyAttr1, const mVec3_c &, s32 unk, f32 scale, f32 groundHeightMaybe); + + // "mass obj" = grass, fire + static bool createMassObjEffect(u16 effectResourceId, const mVec3_c &v1, dAcObjBase_c *owner, const mColor *color); + + static s32 getGroupId(u16); + static bool shouldBePaused(dBase_c *owner); + + enum Fx_e { + TsuboA, + TsuboB, + BRockA, + FruitA, + GrassCoil, + BRockB, + Beehive, + VeraRock, + Pumpkin, + BRockC, + F300BrokenRockWall_00, + F300BrokenRockWall_01, + F300BrokenRockWall_01T, + LotusSeed, + Beamoss, + Cakram, + Dodai, + LegParts, + AsuraFloorBrk, + BreakPillar, + Barrel, + BarrelBomb, + RockMiddle, + BocoBone, + BRockStopA, + BWallD201, + Gunho, + TuboBig, + Amos, + HidokariBoneA, + HidokariBoneB, + Hydra, + Captain, + KibakoHang, + IslTreIRock, + BirdraceTarget, + FlowerA00F, + FlowerA00L, + FlowerB00, + FlowerB01, + GirahimClaymore, + BirdKobunAEgg, + BirdKobunBEgg, + BirdRivalEgg, + BWallAF200, + BWallBF200, + BWallF210, + }; + + typedef TList EffectsList; + static EffectsList sPlayingEffectsList; + static CommonEmitterCallback sCommonEmitterCallbacks[2]; + static dShpEmitter_c sShpEmitters[47]; + static dEmitterBase_c sEmitter; + static dParticleFogProc_c sFogProcs[12]; + static dEffect2D_c s2DEffects[3]; + +private: + static dEmitterBase_c *spawnEffectInternal( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2, s32 idx1, s32 idx2 + ); + static dEmitterBase_c *spawnEffectInternal( + u16 effectResourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2 + ); + + static s32 polyAttrsToGroundEffectIdx(s32 polyAttr0, s32 polyAttr1); + + static mHeapAllocator_c *ms_allocator; + static dMassObjEmitter_c *sMassObjEmitters; + static u32 sInts[]; + static const u32 moreInts[]; + static u32 sInts2[]; +}; + +#endif diff --git a/include/toBeSorted/d_particle.h b/include/toBeSorted/d_particle.h index ef81921b..745b444b 100644 --- a/include/toBeSorted/d_particle.h +++ b/include/toBeSorted/d_particle.h @@ -73,8 +73,8 @@ public: void createResource(EGG::Heap *heap, s32 mgrIndex, void *jpc, void *jpn); void disposeResource(s32 mgrIndex); - s32 getResUserWork(u16 handle) const; - u16 getJpnData(u16 handle) const; + s32 getResUserWork(u16 particleResId) const; + u16 getJpnData(u16 particleResId) const; // Invokes the JParticle 11 extension void doCustomSkywardSwordThing(u8 groupId, f32 x, f32 y); void calc(u8 groupId); diff --git a/include/toBeSorted/d_unk_mdl_stuff_2.h b/include/toBeSorted/d_unk_mdl_stuff_2.h new file mode 100644 index 00000000..c46ab28e --- /dev/null +++ b/include/toBeSorted/d_unk_mdl_stuff_2.h @@ -0,0 +1,72 @@ +#ifndef D_UNK_MDL_STUFF_2_H +#define D_UNK_MDL_STUFF_2_H + +#include "common.h" +#include "m/m3d/m_proc.h" +#include "m/m_allocator.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resmat.h" +#include "nw4r/g3d/res/g3d_resshp.h" + +/** a process for drawing shapes directly */ +class dShpProcBase_c : public m3d::proc_c { +public: + dShpProcBase_c(): mLightSetId(1) {} + virtual ~dShpProcBase_c() {} + + void setResMat(nw4r::g3d::ResMat mat); + void setResShp(nw4r::g3d::ResShp shp) { + mShp = shp; + } + + void setupLight(); + void draw(mVec3_c *pos); + void setAllFlags(); + void doEntry(s32 lightSetId); + + bool init(nw4r::g3d::ResMat mat, nw4r::g3d::ResShp shp, s32 count, bool xlu, u32 *pSize); + + bool isDrawDisabled(s32 idx) const { + return mpFlags[idx]; + } + + void setDrawDisabled(s32 idx, bool val) { + mpFlags[idx] = val; + } + +protected: + /* 0x18 */ nw4r::g3d::ResMat mMat; + /* 0x1C */ nw4r::g3d::ResShp mShp; + /* 0x20 */ bool *mpFlags; + /* 0x24 */ s32 mCount; + /* 0x28 */ s32 mLightSetId; + /* 0x2C */ u8 field_0x2C; +}; + +class dShpProc1_c : public dShpProcBase_c { +public: + virtual ~dShpProc1_c() {} + /* vt 0x18 */ virtual void drawOpa() override { + draw(); + } + /* vt 0x1C */ virtual void drawXlu() override { + draw(); + }; + + void clearTransforms() { + mpTransforms = nullptr; + } + + bool create(nw4r::g3d::ResMat mat, nw4r::g3d::ResShp shp, s32 count, mHeapAllocator_c *alloc, bool xlu, u32 *pSize); + void draw(); + + void setTransform(s32 idx, const mMtx_c &transform) { + mpTransforms[idx].copyFrom(transform); + } + +protected: + /* 0x30 */ mMtx_c *mpTransforms; +}; + +#endif diff --git a/include/toBeSorted/effects_struct.h b/include/toBeSorted/effects_struct.h deleted file mode 100644 index 71afbb31..00000000 --- a/include/toBeSorted/effects_struct.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef EFFECTS_STRUCT_H -#define EFFECTS_STRUCT_H - -#include "common.h" -#include "d/d_base.h" -#include "m/m_angle.h" -#include "m/m_mtx.h" -#include "m/m_vec.h" - -class EffectsStruct { -private: - s32 field_0x00; - u8 field_0x04[0x1C - 0x04]; - -public: - // vt at 0x1C - EffectsStruct(); - EffectsStruct(dBase_c *); - virtual ~EffectsStruct(); - - inline void init(dBase_c *owner) { - mpOwner = owner; - } - - void remove(bool); - void fn_80027320(u8); - void fn_800271E0(mVec3_c *pos, mAng3_c *rot, mVec3_c *scale); - void fn_80029920(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *); - void fn_80029980(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *); - void fn_800299F0(u16 effect, mMtx_c *mtx, void *, void *); - void fn_80029A10(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *); - void fn_80029A70(u16 effect, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, void *, void *); - void setMtx(const mMtx_c &); - - static void fn_800298C0(u16 effect, mVec3_c *pos, void*, void*, void*, void*); - - void fn_80026ED0(); - void fn_80026F10(); - - bool checkField0x00() const { - return field_0x00 != 0; - } - -private: - u8 field_0x20[0x28 - 0x20]; - /* 0x28 */ dBase_c *mpOwner; - u8 field_0x2C[0x34 - 0x2C]; -}; - -// Not sure if these belongs here, but it uses EffectsStruct -// Related Functions in the 8002B100 area -class EffectsStruct_Ext { -public: - EffectsStruct_Ext() : mField_0x00(1), mField_0x01(0) {} - - void init(dBase_c *, f32, f32, f32); - - void setField_0x00(u8 val) { - mField_0x00 = val; - } - void setField_0x01(u8 val) { - mField_0x01 = val; - } - - void fn_8002B120(f32, f32); - - /* 0x00 */ u8 mField_0x00; - /* 0x01 */ u8 mField_0x01; - /* 0x04 */ f32 mField_0x04; - /* 0x08 */ f32 mField_0x08; - /* 0x0C */ f32 mField_0x0C; - /* 0x10 */ EffectsStruct mEff; - virtual ~EffectsStruct_Ext() {} -}; - -#endif diff --git a/include/toBeSorted/lyt_related_floats.h b/include/toBeSorted/lyt_related_floats.h index be17f713..092b8ea7 100644 --- a/include/toBeSorted/lyt_related_floats.h +++ b/include/toBeSorted/lyt_related_floats.h @@ -18,6 +18,11 @@ inline s32 get_8057511C() { return lbl_8057511C; } +extern "C" f32 lbl_80575150; +inline f32 get_80575150() { + return lbl_80575150; +} + extern "C" f32 lbl_8057515C; inline f32 get_8057515C() { return lbl_8057515C; @@ -38,4 +43,9 @@ inline f32 get_80575190() { return lbl_80575190; } +extern "C" s32 lbl_80575184; +inline s32 get_80575184() { + return lbl_80575184; +} + #endif diff --git a/include/toBeSorted/tlist.h b/include/toBeSorted/tlist.h index 736d7320..65aa1ef2 100644 --- a/include/toBeSorted/tlist.h +++ b/include/toBeSorted/tlist.h @@ -9,6 +9,12 @@ // * Entirely in headers // * Swapped node and count members // Used in DowsingTarget, maybe also in dAcBase_c.soundStuff +// +// The current implementation has various unexplained behaviors +// * Constructor doesn't match if offset != 0 https://decomp.me/scratch/YqOCh +// * Many loops based on these iterators don't match in general, but probably not worth +// messing with until the ctor is fixed +// * -ipa file optimizes things that shouldn't be optimized https://decomp.me/scratch/lqM6i template class TListNode { public: diff --git a/src/REL/d/a/d_a_bombf.cpp b/src/REL/d/a/d_a_bombf.cpp index 1d46ab2d..b0e7e1c8 100644 --- a/src/REL/d/a/d_a_bombf.cpp +++ b/src/REL/d/a/d_a_bombf.cpp @@ -7,6 +7,7 @@ #include "d/flag/sceneflag_manager.h" #include "m/m_mtx.h" #include "m/m_vec.h" +#include "toBeSorted/small_sound_mgr.h" #include "toBeSorted/time_area_mgr.h" SPECIAL_ACTOR_PROFILE(BOMBF, dAcBombf_c, fProfile::BOMBF, 0x129, 0, 4099); @@ -166,7 +167,6 @@ void dAcBombf_c::regrowBomb() { void dAcBombf_c::initializeState_Wait() {} -extern "C" void fn_800298B0(u16, mVec3_c *, mVec3_c *, u32, u32, u32, u32, u32); extern "C" u16 lbl_8057A750; void dAcBombf_c::executeState_Wait() { @@ -191,11 +191,11 @@ void dAcBombf_c::executeState_Wait() { if (mTimeAreaStruct.check(roomid, m3, 0, 30.0f, 0.1f) && field_0x3D4 != 1) { if (mTimeAreaStruct.field_0x04 == 1) { - playSound(0xC0A); + playSound(SE_TIMESLIP_TIMESLIP); } else { - playSound(0xC0B); + playSound(SE_TIMESLIP_TIMESLIP_REV); } - fn_800298B0(lbl_8057A750, &position, nullptr, 0, 0, 0, 0, 0); + dJEffManager_c::spawnEffect(lbl_8057A750, position, nullptr, nullptr, nullptr, nullptr, 0, 0); } scaleFactor *= mTimeAreaStruct.field_0x00; diff --git a/src/REL/d/a/d_a_t_wood_area.cpp b/src/REL/d/a/d_a_t_wood_area.cpp index fab69c33..044826bf 100644 --- a/src/REL/d/a/d_a_t_wood_area.cpp +++ b/src/REL/d/a/d_a_t_wood_area.cpp @@ -1,6 +1,8 @@ #include "d/a/d_a_t_wood_area.h" +#include "common.h" #include "d/a/d_a_player.h" +#include "toBeSorted/d_emitter.h" const f32 dAcTWoodArea_c::scaleX = 100.0f; const f32 dAcTWoodArea_c::scaleY = 100.0f; @@ -48,8 +50,7 @@ void dAcTWoodArea_c::executeState_Init() { } void dAcTWoodArea_c::finalizeState_Init() {} -extern "C" void fn_800298B0(u16, mVec3_c *, mAng3_c *, u32, u32, u32, u32, u32); -extern u16 PARTICLE_RESOURCE_ID_MAPPING[]; +extern const u16 PARTICLE_RESOURCE_ID_MAPPING_8_; void dAcTWoodArea_c::initializeState_Wait() {} @@ -63,7 +64,9 @@ void dAcTWoodArea_c::executeState_Wait() { bool someEffectThing = subtype != 1 ? (params & 0xF) != 0 ? false : true : true; if (someEffectThing) { mVec3_c tmp(position.x, position.y + getAttachHeight(), position.z); - fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING[8], &tmp, nullptr, 0, 0, 0, 0, 0); + dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_8_, tmp, nullptr, nullptr, nullptr, nullptr, 0, 0 + ); } dropItems(); } diff --git a/src/REL/d/a/obj/d_a_obj_chair.cpp b/src/REL/d/a/obj/d_a_obj_chair.cpp index e23de73a..77269c9b 100644 --- a/src/REL/d/a/obj/d_a_obj_chair.cpp +++ b/src/REL/d/a/obj/d_a_obj_chair.cpp @@ -136,7 +136,7 @@ int dAcOChair_c::actorExecute() { // Calculate the HealCooldown (Heal link if needed) if (!checkObjectProperty(0x8000)) { if (!isBench()) { - mCyl.SetC(GetPostion()); + mCyl.SetC(GetPosition()); dCcS::GetInstance()->Set(&mCyl); } mHealTimer = FIRST_HEAL_COOLDOWN; diff --git a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp index ae522bae..9e16849e 100644 --- a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp +++ b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp @@ -196,16 +196,16 @@ int dAcODungeonShip_c::actorExecute() { mAnmMatClr.play(); mMdl.calc(false); if (field_0x8D8) { - mEffects[0].fn_80029A10(PARTICLE_RESOURCE_ID_MAPPING_682_, &position, &rotation, nullptr, nullptr, nullptr); + mEffects[0].createContinuousEffect(PARTICLE_RESOURCE_ID_MAPPING_682_, position, &rotation, nullptr, nullptr, nullptr); } if (field_0x8D9) { mMtx_c tmpMtx; mMdl.getNodeWorldMtx(0, tmpMtx); - if (mEffects[1].checkField0x00()) { - mEffects[1].setMtx(tmpMtx); + if (mEffects[1].hasEmitters()) { + mEffects[1].setTransform(tmpMtx); } else if (field_0x8DA == 0) { - mEffects[1].fn_800299F0(PARTICLE_RESOURCE_ID_MAPPING_683_, &tmpMtx, nullptr, nullptr); + mEffects[1].createEffect(PARTICLE_RESOURCE_ID_MAPPING_683_, tmpMtx, nullptr, nullptr); field_0x8DA = 1; } } diff --git a/src/REL/d/a/obj/d_a_obj_seat_sword.cpp b/src/REL/d/a/obj/d_a_obj_seat_sword.cpp index 726a008a..a889ad49 100644 --- a/src/REL/d/a/obj/d_a_obj_seat_sword.cpp +++ b/src/REL/d/a/obj/d_a_obj_seat_sword.cpp @@ -231,8 +231,8 @@ void dAcOSeatSword_c::actorExecuteCommon() { mEffPos += player->position; mEffPos.y = position.y; - mEff.fn_80029A10(PARTICLE_RESOURCE_ID_MAPPING_76_, &mEffPos, &rotation, &mScale, nullptr, nullptr); - mEff.fn_80027320(mField_0x7E4); + mEff.createContinuousEffect(PARTICLE_RESOURCE_ID_MAPPING_76_, mEffPos, &rotation, &mScale, nullptr, nullptr); + mEff.setGlobalAlpha(mField_0x7E4); } void dAcOSeatSword_c::updateSwordMdl() { diff --git a/src/REL/d/a/obj/d_a_obj_tower_gearD101.cpp b/src/REL/d/a/obj/d_a_obj_tower_gearD101.cpp index cbf4a29c..eac5d5a1 100644 --- a/src/REL/d/a/obj/d_a_obj_tower_gearD101.cpp +++ b/src/REL/d/a/obj/d_a_obj_tower_gearD101.cpp @@ -10,6 +10,7 @@ #include "f/f_profile_name.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resmdl.h" +#include "toBeSorted/small_sound_mgr.h" SPECIAL_ACTOR_PROFILE(OBJ_TOWER_GEAR_D101, dAcOTowerGearD101_c, fProfile::OBJ_TOWER_GEAR_D101, 0x17E, 0, 7); @@ -92,9 +93,9 @@ void dAcOTowerGearD101_c::executeState_Wait() { mAng newRotation = diff * scale5 / 2400.0f; if (newRotation != mCurrRotation) { if (mPreviousTurnSpeed == 0) { - playSound(0xBF8); + playSound(SE_TGrD101_ROLL_START); } else { - playSoundEffect1(0xBF9); + playSoundEffect1(SE_TGrD101_ROLL_LV); playVisualEffect(); } } @@ -128,5 +129,5 @@ void dAcOTowerGearD101_c::initTransform() { extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_585_; void dAcOTowerGearD101_c::playVisualEffect() { - mEffects.fn_80029A10(PARTICLE_RESOURCE_ID_MAPPING_585_, &field_0x3F4, &rotation, nullptr, nullptr, nullptr); + mEffects.createContinuousEffect(PARTICLE_RESOURCE_ID_MAPPING_585_, field_0x3F4, &rotation, nullptr, nullptr, nullptr); } diff --git a/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp b/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp index 910dd1e4..2c584c5d 100644 --- a/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp +++ b/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp @@ -248,11 +248,11 @@ int dAcOTowerHandD101_c::actorExecute() { PSMTXConcat(tmpMtx3, tmpMtx4, tmpMtx3); mLoc2Mtx.copyFrom(tmpMtx3); - if (mEffects.checkField0x00()) { + if (mEffects.hasEmitters()) { if (direction == 1) { tmpMtx3.YrotM(-0x8000); } - mEffects.setMtx(tmpMtx3); + mEffects.setTransform(tmpMtx3); } for (int i = 0; i <= 2; i++) { dBgW *bgW = nullptr; @@ -300,11 +300,11 @@ int dAcOTowerHandD101_c::actorExecuteInEvent() { PSMTXConcat(tmpMtx3, tmpMtx4, tmpMtx3); mLoc2Mtx.copyFrom(tmpMtx3); - if (mEffects.checkField0x00()) { + if (mEffects.hasEmitters()) { if (direction == 1) { tmpMtx3.YrotM(-0x8000); } - mEffects.setMtx(tmpMtx3); + mEffects.setTransform(tmpMtx3); } for (int i = 0; i <= 2; i++) { dBgW *bgW = nullptr; @@ -597,7 +597,7 @@ extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_573; void dAcOTowerHandD101_c::initializeState_Close() { mMdl.getAnm().setPlayState(m3d::PLAY_MODE_1); mMdl.setRate(getCloseRate()); - mEffects.fn_80029920(PARTICLE_RESOURCE_ID_MAPPING_573, &position, nullptr, nullptr, nullptr, nullptr); + mEffects.createEffect(PARTICLE_RESOURCE_ID_MAPPING_573, position, nullptr, nullptr, nullptr, nullptr); playSound(0xC0C); } void dAcOTowerHandD101_c::executeState_Close() { diff --git a/src/REL/d/a/obj/d_a_obj_triforce.cpp b/src/REL/d/a/obj/d_a_obj_triforce.cpp index f09ee010..6b967253 100644 --- a/src/REL/d/a/obj/d_a_obj_triforce.cpp +++ b/src/REL/d/a/obj/d_a_obj_triforce.cpp @@ -56,7 +56,6 @@ int dAcOtriforce_c::doDelete() { } extern const u16 PARTICLE_RESOURCE_ID_MAPPING_967_; -extern "C" void fn_80029AE0(EffectsStruct *, u16, mMtx_c *, void *, void *); int dAcOtriforce_c::actorExecute() { int zero = 0; @@ -73,7 +72,7 @@ int dAcOtriforce_c::actorExecute() { PSMTXConcat(mWorldMtx.m, m, mWorldMtx.m); mMdl.setLocalMtx(mWorldMtx); mAnm.play(); - fn_80029AE0(&mEffects, PARTICLE_RESOURCE_ID_MAPPING_967_, &mWorldMtx, nullptr, nullptr); + mEffects.createContinuousEffect(PARTICLE_RESOURCE_ID_MAPPING_967_, mWorldMtx, nullptr, nullptr); return 1; } diff --git a/src/REL/d/a/obj/d_a_obj_tubo.cpp b/src/REL/d/a/obj/d_a_obj_tubo.cpp index 14a0f3ff..8b6481de 100644 --- a/src/REL/d/a/obj/d_a_obj_tubo.cpp +++ b/src/REL/d/a/obj/d_a_obj_tubo.cpp @@ -30,7 +30,10 @@ #include "rvl/MTX/mtxvec.h" #include "s/s_Math.h" #include "toBeSorted/attention.h" +#include "toBeSorted/blur_and_palette_manager.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" +#include "toBeSorted/small_sound_mgr.h" #include "toBeSorted/special_item_drop_mgr.h" void float_ordering() { @@ -71,7 +74,7 @@ int dAcOtubo_c::actorCreate() { mObjAcch.Set(this, 1, &mAcchCir); mAcchCir.SetWall(20.f, 30.f); mEff_0x91C.init(this, 60.f, mScale.x, 0.f); - mEff_0x91C.setField_0x01(1); + mEff_0x91C.setIsSmall(true); int unkParam = getParams_0x3000(); if (unkParam != 1 && unkParam != 2) { fn_8002EA30(-60.f, -20.f, 2.f, 1.f, 4.f, &mObjAcch); @@ -210,24 +213,24 @@ int dAcOtubo_c::draw() { return SUCCEEDED; } -extern "C" void fn_8002A450(const mVec3_c &, u8, u8, const mVec3_c &, int, f32, f32); - void dAcOtubo_c::initializeState_Wait() {} void dAcOtubo_c::executeState_Wait() { if (mObjAcch.ChkGroundLanding()) { if (!mbField_0x9EF || !EventManager::isInEvent()) { if (mField_0x9F6 == 2) { - fn_8002A450(position, polyAttr0, polyAttr1, mField_0x1B4, 0, 1.0f, mField_0x1B0); + dJEffManager_c::spawnGroundEffect(position, polyAttr0, polyAttr1, mField_0x1B4, 0, 1.0f, mField_0x1B0); } if (mbField_0x9F3) { - playSound(0xA46); + playSound(SE_Tubo_PUT); mbField_0x9F3 = false; } if (checkOnLava()) { if (mField_0x9F6 != 2) { - fn_8002A450(position, polyAttr0, polyAttr1, mField_0x1B4, 0, 1.0f, mField_0x1B0); + dJEffManager_c::spawnGroundEffect( + position, polyAttr0, polyAttr1, mField_0x1B4, 0, 1.0f, mField_0x1B0 + ); } - playSound(0x9A3); + playSound(SE_O_FALL_LAVA_S); } } } else if (mObjAcch.ChkGndHit()) { @@ -363,7 +366,7 @@ void dAcOtubo_c::initializeState_Slope() { } void dAcOtubo_c::executeState_Slope() { if (mObjAcch.ChkGroundLanding()) { - fn_8002A450(position, polyAttr0, polyAttr1, mField_0x1B4, 0, 1.0f, mField_0x1B0); + dJEffManager_c::spawnGroundEffect(position, polyAttr0, polyAttr1, mField_0x1B4, 0, 1.0f, mField_0x1B0); } else if (mObjAcch.ChkGndHit()) { mField_0x9DC = 0.f; addPickupTarget(); @@ -446,11 +449,7 @@ void dAcOtubo_c::finalizeState_Rebirth() { setActorProperty(0x1); } -extern "C" void fn_80027510(void *, bool); -extern "C" void fn_80027560(void *, bool, int); -extern "C" void *fn_800298B0(u16, mVec3_c *, mVec3_c *, u32, u32, u32, u32, u32); extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_109_, PARTICLE_RESOURCE_ID_MAPPING_209_; -extern "C" void *ENVIRONMENT; extern "C" void fn_80022BE0(void *, const mVec3_c &); void dAcOtubo_c::destroy() { @@ -462,19 +461,23 @@ void dAcOtubo_c::destroy() { if (!boolParam) { return; } - fn_80022BE0(ENVIRONMENT, position); + fn_80022BE0(BlurAndPaletteManager::GetPInstance(), position); mActorCarryInfo.fn_80050EA0(this); - void *fx_thing = fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_209_, &poscopy2, nullptr, 0, 0, 0, 0, 0); + dEmitterBase_c *fx_thing = dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_209_, poscopy2, nullptr, nullptr, nullptr, nullptr, 0, 0 + ); if (fx_thing) { - fn_80027510(fx_thing, mSubtype != 0); + fx_thing->attachEmitterCallbackId(mSubtype != 0 ? dJEffManager_c::TsuboB : dJEffManager_c::TsuboA); } - fx_thing = fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_109_, &position, nullptr, 0, 0, 0, 0, 0); + fx_thing = dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_109_, position, nullptr, nullptr, nullptr, nullptr, 0, 0 + ); if (fx_thing) { - fn_80027560(fx_thing, mSubtype != 0, 0); + fx_thing->bindShpEmitter(mSubtype != 0 ? dJEffManager_c::TsuboB : dJEffManager_c::TsuboA, false); } - playSound(0xA47); // TODO (Sound ID) + playSound(SE_Tubo_BREAK); if (mSceneflag < 0xFF && !checkSceneflag()) { SceneflagManager::sInstance->setFlag(roomid, mSceneflag); @@ -605,7 +608,7 @@ void dAcOtubo_c::fn_272_2670() { f32 groundH = mObjAcch.GetGroundH(); f32 waterH = mObjAcch.GetWtrGroundH(); bool noSound = mbSubmerged; - mEff_0x91C.fn_8002B120(waterH, groundH); + mEff_0x91C.execute(waterH, groundH); if (checkSubmerged()) { forwardAccel = -0.8f; @@ -614,7 +617,7 @@ void dAcOtubo_c::fn_272_2670() { cLib::addCalcPosXZ(&velocity, mVec3_c::Zero, 0.05f, 1.0f, 0.2f); forwardSpeed = EGG::Math::sqrt(velocity.x * velocity.x + velocity.z * velocity.z); if (!noSound) { - playSound(0x9A0); // TODO (Sound ID) - Fall Water S + playSound(SE_O_FALL_WATER_S); } mbSubmerged = true; } else { @@ -860,7 +863,7 @@ void dAcOtubo_c::playRollSound() { return; } - FUN_8002d770(0xA48, forwardSpeed); + FUN_8002d770(SE_Tubo_ROLL_LV, forwardSpeed); } void float_order() { diff --git a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp index e3b37f65..367f48e2 100644 --- a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp +++ b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp @@ -19,6 +19,8 @@ #include "s/s_Math.h" #include "toBeSorted/blur_and_palette_manager.h" #include "toBeSorted/dowsing_target.h" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/small_sound_mgr.h" void float_ordering() { const f32 arr[] = {5.f, 15.f, 7.f, 0.5f, 0.1f}; @@ -260,12 +262,11 @@ bool dAcOTumbleWeed_c::checkInvalidGround() const { } extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_743_; -extern "C" void fn_800298B0(u16, mVec3_c *, mAng3_c *, u32, u32, u32, u32, u32); void dAcOTumbleWeed_c::doBreak() { - playSound(0xC2D); // TODO(Sound Id) + playSound(SE_TWeed_CUT); mVec3_c pos = getPosition(); - fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_743_, &pos, nullptr, 0, 0, 0, 0, 0); + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_743_, pos, nullptr, nullptr, nullptr, nullptr, 0, 0); deleteRequest(); } @@ -347,7 +348,7 @@ void dAcOTumbleWeed_c::tumbleBounceMaybe() { } void dAcOTumbleWeed_c::adjustTimeScale() { - mTimeArea.check(getRoomId(), GetPostion(), 0, 30.f, 0.1f); + mTimeArea.check(getRoomId(), GetPosition(), 0, 30.f, 0.1f); if (0.f < mTimeArea.getDistMaybe()) { sLib::chase(&mScale.y, 0.f, 0.07f); mScale.z = mScale.y; diff --git a/src/d/a/d_a_insect.cpp b/src/d/a/d_a_insect.cpp index d7ad3b59..2c18e1ed 100644 --- a/src/d/a/d_a_insect.cpp +++ b/src/d/a/d_a_insect.cpp @@ -14,14 +14,14 @@ #include "m/m_mtx.h" #include "m/m_vec.h" #include "toBeSorted/attention.h" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/small_sound_mgr.h" -extern "C" void fn_800298B0(u16, mVec3_c *, mVec3_c *, u32, u32, u32, u32, u32); extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_394_; void dAcOInsect_c::kill() { - // Small Ordering issue between loading particle id and position - fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_394_, &position, nullptr, 0, 0, 0, 0, 0); - playSound(0x1236); // TODO (Sound ID) + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_394_, position, nullptr, nullptr, nullptr, nullptr, 0, 0); + playSound(SE_Insect_DISAPPEAR); deleteRequest(); } diff --git a/src/d/a/obj/d_a_obj_switch.cpp b/src/d/a/obj/d_a_obj_switch.cpp index 43546938..3bedebf6 100644 --- a/src/d/a/obj/d_a_obj_switch.cpp +++ b/src/d/a/obj/d_a_obj_switch.cpp @@ -6,6 +6,8 @@ #include "d/flag/sceneflag_manager.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_Math.h" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/small_sound_mgr.h" SPECIAL_ACTOR_PROFILE(OBJ_SW, dAcOsw_c, fProfile::OBJ_SW, 0x12B, 0, 0x1002); @@ -144,7 +146,6 @@ int dAcOsw_c::doDelete() { } extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_754_; -extern "C" void fn_800298B0(u16, mVec3_c *, mAng3_c *, u32, u32, u32, u32, u32); int dAcOsw_c::actorExecute() { mStateMgr.executeState(); @@ -153,8 +154,8 @@ int dAcOsw_c::actorExecute() { if (field_0x5A0.field_0x00 <= 0.0f) { if (mScale.x >= 1.0f) { if (!mHidden) { - fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_754_, &position, &rotation, 0, 0, 0, 0, 0); - playSound(0xC0B); + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_754_, position, &rotation, nullptr, nullptr, nullptr, 0, 0); + playSound(SE_TIMESLIP_TIMESLIP_REV); mHidden = true; } } else { @@ -166,8 +167,8 @@ int dAcOsw_c::actorExecute() { } else { if (mScale.x <= 0.0f) { if (!mShown) { - fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_754_, &position, &rotation, 0, 0, 0, 0, 0); - playSound(0xC0A); + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_754_, position, &rotation, nullptr, nullptr, nullptr, 0, 0); + playSound(SE_TIMESLIP_TIMESLIP); mShown = true; } } else { diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 38fe0513..111ea6bf 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -1933,14 +1933,13 @@ void dAcTbox_c::executeState_LoadArchive() { } void dAcTbox_c::finalizeState_LoadArchive() {} -extern "C" void fn_800298B0(u16 effectIndex, mVec3_c *, mAng3_c *, mVec3_c *, void *, void *, void *, void *); extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_209_; extern "C" const bool isPouchItem(u16); extern "C" dAcItem_c *giveItem3(u16 item, s32); void dAcTbox_c::initializeState_Open() { mScale.set(1.0f, 1.0f, 1.0f); - playSound(0xA36); + playSound(SE_TBox_OPEN_A); clearActorProperty(0x100); if (mVariant == NORMAL) { mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); @@ -1957,7 +1956,7 @@ void dAcTbox_c::initializeState_Open() { mVec3_c pos; fn_8026B380(pos); mVec3_c p2 = fn_8026B3C0(); - fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_209_, &pos, &rotation, &p2, nullptr, nullptr, nullptr, nullptr); + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_209_, pos, &rotation, &p2, nullptr, nullptr, 0, 0); } fn_8026D140(); ITEM_ID itemId = mItemId != 0 ? (ITEM_ID)mItemId : ITEM_GODDESS_HARP; @@ -2377,7 +2376,7 @@ void dAcTbox_c::unregisterDowsing() { extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_208_; void dAcTbox_c::spawnAppearEffect() { - fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_208_, &position, &rotation, nullptr, nullptr, nullptr, nullptr, nullptr); + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_208_, position, &rotation, nullptr, nullptr, nullptr, 0, 0); } bool dAcTbox_c::checkIsClear() const { diff --git a/src/d/a/obj/d_a_obj_water_spout.cpp b/src/d/a/obj/d_a_obj_water_spout.cpp index a7e05ec3..b86b6f09 100644 --- a/src/d/a/obj/d_a_obj_water_spout.cpp +++ b/src/d/a/obj/d_a_obj_water_spout.cpp @@ -9,6 +9,7 @@ #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "s/s_State.hpp" +#include "toBeSorted/d_emitter.h" SPECIAL_ACTOR_PROFILE(OBJ_WATER_SPOUT, dAcOwaterSpout_c, fProfile::OBJ_WATER_SPOUT, 0x1DA, 0, 6); @@ -59,14 +60,13 @@ int dAcOwaterSpout_c::draw() { return SUCCEEDED; } -extern "C" void fn_800298B0(u16, mVec3_c *, mVec3_c *, mVec3_c *, u32, u32, u32, u32); extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_213_; void dAcOwaterSpout_c::initializeState_Wait() { if (params == 1) { return; } - fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_213_, &position, nullptr, &mScale, 0, 0, 0, 0); + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_213_, position, nullptr, &mScale, nullptr, nullptr, 0, 0); } void dAcOwaterSpout_c::executeState_Wait() { if (mMdl.getAnm().isStop()) { diff --git a/src/d/col/bg/d_bg_s.cpp b/src/d/col/bg/d_bg_s.cpp index 8409bc6a..04e4450c 100644 --- a/src/d/col/bg/d_bg_s.cpp +++ b/src/d/col/bg/d_bg_s.cpp @@ -1182,7 +1182,7 @@ void dBgS::SetLightingCode(dAcObjBase_c *pObj, const cBgS_PolyInfo &info) { f32 dBgS::SetLightingCode(dAcObjBase_c *pObj, f32 height) { dBgS_ObjGndChk objGndChk; - mVec3_c pos = pObj->GetPostion(); + mVec3_c pos = pObj->GetPosition(); pos.y += height; objGndChk.SetPos(&pos); f32 gndCross = GroundCross(&objGndChk); diff --git a/src/d/col/bg/d_bg_s_acch.cpp b/src/d/col/bg/d_bg_s_acch.cpp index 06f2496d..498d170b 100644 --- a/src/d/col/bg/d_bg_s_acch.cpp +++ b/src/d/col/bg/d_bg_s_acch.cpp @@ -85,7 +85,7 @@ void dBgS_Acch::Set(dAcObjBase_c *pObj, int tblSize, dBgS_AcchCir *pAcchCir) { mpAcchCir = pAcchCir; mpMyObj = pObj; mActorId = pObj->getID(); - mpPos = &pObj->GetPostion(); + mpPos = &pObj->GetPosition(); mpOldPos = &pObj->GetOldPosition(); mpSpeed = &pObj->GetVelocity(); if (mpSpeed) { diff --git a/src/d/col/cc/d_cc_mass_s.cpp b/src/d/col/cc/d_cc_mass_s.cpp index 02377e71..81e6222d 100644 --- a/src/d/col/cc/d_cc_mass_s.cpp +++ b/src/d/col/cc/d_cc_mass_s.cpp @@ -176,7 +176,7 @@ u32 dCcMassS_Mng::Chk(mVec3_c *p_xyz, dAcObjBase_c **p_actor, dCcMassS_HitInf *p if (field_0x3A8 & 0x10) { mVec3_c vec; - PSVECSubtract((*p_actor)->GetPostion(), *p_xyz, vec); + PSVECSubtract((*p_actor)->GetPosition(), *p_xyz, vec); vec.y = 0; f32 vecMag = PSVECMag(vec); if (cM3d_IsZero(vecMag)) { diff --git a/src/d/d_base.cpp b/src/d/d_base.cpp index 2e1701b4..0f815230 100644 --- a/src/d/d_base.cpp +++ b/src/d/d_base.cpp @@ -22,7 +22,7 @@ int dBase_c::preExecute() { if (fBase_c::preExecute() == 0) { return NOT_READY; } - if (s_ExecuteControlFlags && !isProcControlFlag(s_ExecuteControlFlags)) { + if (s_ExecuteControlFlags && !isBasePropertyFlag(s_ExecuteControlFlags)) { return NOT_READY; } return SUCCEEDED; @@ -41,7 +41,7 @@ int dBase_c::preDraw() { if (fBase_c::preDraw() == NOT_READY) { return NOT_READY; } - if (s_DrawControlFlags && !isProcControlFlag(s_DrawControlFlags)) { + if (s_DrawControlFlags && !isBasePropertyFlag(s_DrawControlFlags)) { return NOT_READY; } return SUCCEEDED; diff --git a/src/d/lyt/meter/d_lyt_meter_dowsing.cpp b/src/d/lyt/meter/d_lyt_meter_dowsing.cpp index b9ea37aa..f7850755 100644 --- a/src/d/lyt/meter/d_lyt_meter_dowsing.cpp +++ b/src/d/lyt/meter/d_lyt_meter_dowsing.cpp @@ -15,7 +15,7 @@ #include "nw4r/math/math_types.h" #include "sized_string.h" #include "toBeSorted/dowsing_target.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/small_sound_mgr.h" @@ -722,7 +722,7 @@ void dLytMeterDowsing_c::executeState_DemoMove() { idx = i + DOWSING_PANE_ITEM_OFFSET; nw4r::math::MTX34 mtx = mpPanes[idx]->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); - EffectsStruct::fn_800298C0(PARTICLE_RESOURCE_ID_MAPPING_970_, &pos, nullptr, nullptr, nullptr, nullptr); + dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_970_, pos, nullptr, nullptr, nullptr, nullptr); SmallSoundManager::GetInstance()->playSound(SE_S_DOWSING_ADD); } } else if (mDemoFrame == 16) { diff --git a/src/d/lyt/meter/d_lyt_meter_heart.cpp b/src/d/lyt/meter/d_lyt_meter_heart.cpp index 0c6ed76a..7ee24c48 100644 --- a/src/d/lyt/meter/d_lyt_meter_heart.cpp +++ b/src/d/lyt/meter/d_lyt_meter_heart.cpp @@ -6,7 +6,7 @@ #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_game_over.h" #include "nw4r/math/math_types.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/small_sound_mgr.h" @@ -287,7 +287,7 @@ void dLytMeterHeart_c::executeInternal() { if (mEffectHeartIdx >= 0) { nw4r::math::MTX34 mtx = mpHeartPanes[mEffectHeartIdx]->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); - EffectsStruct::fn_800298C0(PARTICLE_RESOURCE_ID_MAPPING_972_, &pos, nullptr, nullptr, nullptr, nullptr); + dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_972_, pos, nullptr, nullptr, nullptr, nullptr); SmallSoundManager::GetInstance()->playSound(SE_S_HEART_ADD); mEffectHeartIdx = -1; } diff --git a/src/d/lyt/meter/d_lyt_meter_item_select.cpp b/src/d/lyt/meter/d_lyt_meter_item_select.cpp index f79df912..7055a566 100644 --- a/src/d/lyt/meter/d_lyt_meter_item_select.cpp +++ b/src/d/lyt/meter/d_lyt_meter_item_select.cpp @@ -18,7 +18,7 @@ #include "nw4r/math/math_types.h" #include "s/s_Math.h" #include "sized_string.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/minigame_mgr.h" #include "toBeSorted/small_sound_mgr.h" @@ -702,8 +702,8 @@ void dLytMeterItemSelect_c::initializeState_SelectIn() { if (dAcPy_c::GetLink()->checkFlags0x340(0x400)) { field_0x57BD = 1; field_0x5788 = 0; - field_0x579B = 0; - mEffects.fn_80027320(0); + mEffectAlpha = 0; + mEffects.setGlobalAlpha(0); mpPanes[ITEM_SELECT_PANE_ICON_OFFSET + 2]->SetInfluencedAlpha(true); mpPanes[ITEM_SELECT_PANE_ICON_OFFSET + 2]->SetAlpha(64); } @@ -759,16 +759,16 @@ void dLytMeterItemSelect_c::executeState_SelectIn() { bAllAnimsSettled = false; } else { field_0x57BE = 1; - bool settled0x57BE = true; - bool settled0x5784 = true; - if (field_0x579B != 0xFF) { - settled0x57BE = sLib::chaseUC(&field_0x579B, 0xFF, 0x55); + bool settledAnimAlpha = true; + bool settledAnimScale = true; + if (mEffectAlpha != 0xFF) { + settledAnimAlpha = sLib::chaseUC(&mEffectAlpha, 0xFF, 0x55); } - if (field_0x5784 != 1.0f) { - settled0x5784 = sLib::chase(&field_0x5784, 1.0f, 0.06666666f); + if (mEffectScale != 1.0f) { + settledAnimScale = sLib::chase(&mEffectScale, 1.0f, 0.06666666f); } - mEffects.fn_80027320(field_0x579B); - if (!settled0x57BE || !settled0x5784) { + mEffects.setGlobalAlpha(mEffectAlpha); + if (!settledAnimAlpha || !settledAnimScale) { bAllAnimsSettled = false; } } @@ -840,13 +840,13 @@ void dLytMeterItemSelect_c::executeState_SetIn() { } else { bool settled0x57BE = true; bool settled0x5784 = true; - if (field_0x579B != 0) { - settled0x57BE = sLib::chaseUC(&field_0x579B, 0, 0x55); + if (mEffectAlpha != 0) { + settled0x57BE = sLib::chaseUC(&mEffectAlpha, 0, 0x55); } - if (field_0x5784 != 0.8f) { - settled0x5784 = sLib::chase(&field_0x5784, 0.8f, 0.06666666f); + if (mEffectScale != 0.8f) { + settled0x5784 = sLib::chase(&mEffectScale, 0.8f, 0.06666666f); } - mEffects.fn_80027320(field_0x579B); + mEffects.setGlobalAlpha(mEffectAlpha); if (settled0x57BE && settled0x5784) { field_0x57BD = 0; field_0x57BE = 0; @@ -1058,13 +1058,13 @@ void dLytMeterItemSelect_c::executeState_SelectOut() { } else { bool settled0x57BE = true; bool settled0x5784 = true; - if (field_0x579B != 0) { - settled0x57BE = sLib::chaseUC(&field_0x579B, 0, 0x55); + if (mEffectAlpha != 0) { + settled0x57BE = sLib::chaseUC(&mEffectAlpha, 0, 0x55); } - if (field_0x5784 != 0.8f) { - settled0x5784 = sLib::chase(&field_0x5784, 0.8f, 0.06666666f); + if (mEffectScale != 0.8f) { + settled0x5784 = sLib::chase(&mEffectScale, 0.8f, 0.06666666f); } - mEffects.fn_80027320(field_0x579B); + mEffects.setGlobalAlpha(mEffectAlpha); if (settled0x57BE && settled0x5784) { field_0x57BD = 0; field_0x57BE = 0; @@ -1410,7 +1410,7 @@ void dLytMeterItemSelect_c::executeState_DemoMove() { nw4r::math::MTX34 mtx = mpPanes[i + ITEM_SELECT_PANE_ICON_OFFSET]->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); - EffectsStruct::fn_800298C0(PARTICLE_RESOURCE_ID_MAPPING_740_, &pos, nullptr, nullptr, nullptr, nullptr); + dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_740_, pos, nullptr, nullptr, nullptr, nullptr); if (mIsBocoburinLocked[i]) { mIsBocoburinLocked[i] = false; @@ -1674,9 +1674,9 @@ bool dLytMeterItemSelect_c::build(d2d::ResAccIf_c *resAcc) { field_0x578C = 0; field_0x5790 = 0; - field_0x5784 = 0.8f; + mEffectScale = 0.8f; field_0x5788 = 0; - field_0x579B = 0; + mEffectAlpha = 0; field_0x57BD = 0; field_0x57BE = 0; field_0x57BF = 0; @@ -1922,9 +1922,9 @@ bool dLytMeterItemSelect_c::execute() { } if (field_0x57BD != 0) { - field_0x579B = 0; - field_0x5784 = 0.8f; - mEffects.fn_80027320(0); + mEffectAlpha = 0; + mEffectScale = 0.8f; + mEffects.setGlobalAlpha(0); field_0x57BD = 0; field_0x57BE = 0; mpPanes[ITEM_SELECT_PANE_ICON_OFFSET + 2]->SetAlpha(0xFF); @@ -2241,18 +2241,18 @@ extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_717_; void dLytMeterItemSelect_c::fn_800EF580() { nw4r::math::MTX34 mtx = mpPanes[11]->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); - mVec3_c scale(field_0x5784, field_0x5784, field_0x5784); - mEffects.fn_80029A70(PARTICLE_RESOURCE_ID_MAPPING_717_, &pos, nullptr, &scale, nullptr, nullptr); + mVec3_c scale(mEffectScale, mEffectScale, mEffectScale); + mEffects.createContinuousUIEffect(PARTICLE_RESOURCE_ID_MAPPING_717_, pos, nullptr, &scale, nullptr, nullptr); if (field_0x57C0 != 0) { - mEffects.fn_80026ED0(); + mEffects.stopDrawParticles(); field_0x57C0 = 0; } else { if (field_0x57BE != field_0x57BF) { if (field_0x57BE != 0) { - mEffects.fn_80026F10(); + mEffects.playDrawParticles(); } else { - mEffects.fn_80026ED0(); + mEffects.stopDrawParticles(); } } } diff --git a/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp b/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp index f7fcb7a6..b1f600fd 100644 --- a/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp @@ -626,8 +626,8 @@ void dLytMeterMinusBtn_c::initializeState_DemoMove() { nw4r::math::MTX34 mtx = mpPanes[i + MINUS_BTN_PANE_ITEM_OFFSET]->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); mSlotForEffect[numPlayingEffects] = i; - mEffects[numPlayingEffects].fn_80029980( - PARTICLE_RESOURCE_ID_MAPPING_971_, &pos, &mEffectsRot[numPlayingEffects], nullptr, nullptr, nullptr + mEffects[numPlayingEffects].createUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_971_, pos, &mEffectsRot[numPlayingEffects], nullptr, nullptr, nullptr ); numPlayingEffects++; } @@ -665,8 +665,8 @@ void dLytMeterMinusBtn_c::executeState_DemoMove() { nw4r::math::MTX34 mtx = getPaneByIndex(mSlotToDemo + MINUS_BTN_PANE_ITEM_OFFSET)->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); mSlotForEffect[0] = mSlotToDemo; - mEffects[0].fn_80029980( - PARTICLE_RESOURCE_ID_MAPPING_971_, &pos, &mEffectsRot[0], nullptr, nullptr, nullptr + mEffects[0].createUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_971_, pos, &mEffectsRot[0], nullptr, nullptr, nullptr ); } } else if (mDemoFrame > 0) { @@ -676,7 +676,7 @@ void dLytMeterMinusBtn_c::executeState_DemoMove() { mEffectsRot[i].z += demoRotIncrement; nw4r::math::MTX34 mtx = getPaneByIndex(slot + MINUS_BTN_PANE_ITEM_OFFSET)->GetGlobalMtx(); mVec3_c pos(mtx._03, mtx._13, 0.0f); - mEffects[i].fn_800271E0(&pos, &mEffectsRot[i], nullptr); + mEffects[i].setPosRotScaleWithScreenScale(pos, &mEffectsRot[i], nullptr); } } } diff --git a/src/d/lyt/meter/d_lyt_meter_timer.cpp b/src/d/lyt/meter/d_lyt_meter_timer.cpp index f79d6c7f..085479cf 100644 --- a/src/d/lyt/meter/d_lyt_meter_timer.cpp +++ b/src/d/lyt/meter/d_lyt_meter_timer.cpp @@ -14,7 +14,7 @@ #include "m/m_vec.h" #include "nw4r/lyt/lyt_pane.h" #include "nw4r/math/math_types.h" -#include "toBeSorted/effects_struct.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/small_sound_mgr.h" @@ -391,16 +391,16 @@ void LytMeterTimerPart1_c::createEffect(s32 fruitIndex) { pos.x = mtx._03; pos.y = mtx._13; pos.z = 0.0f; - EffectsStruct::fn_800298C0( - PARTICLE_RESOURCE_ID_MAPPING_135_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_CIRCLE], + dJEffManager_c::spawnUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_135_, pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_CIRCLE], &mColors2[TIMER_01_COLOR_01_CIRCLE] ); - EffectsStruct::fn_800298C0( - PARTICLE_RESOURCE_ID_MAPPING_136_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_SHADOW], + dJEffManager_c::spawnUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_136_, pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_SHADOW], &mColors2[TIMER_01_COLOR_01_SHADOW] ); - EffectsStruct::fn_800298C0( - PARTICLE_RESOURCE_ID_MAPPING_137_, &pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_RAINBOW_CIRCLE], + dJEffManager_c::spawnUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_137_, pos, nullptr, nullptr, &mColors1[TIMER_01_COLOR_00_RAINBOW_CIRCLE], &mColors2[TIMER_01_COLOR_01_RAINBOW_CIRCLE] ); } @@ -1000,8 +1000,8 @@ void LytMeterTimerPart2_c::createSingleFruitEffect() { pos.x = mtx._03; pos.y = mtx._13; pos.z = 0.0f; - EffectsStruct::fn_800298C0( - PARTICLE_RESOURCE_ID_MAPPING_174_, &pos, nullptr, nullptr, &mColors1[TIMER_02_COLOR_00_00], + dJEffManager_c::spawnUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_174_, pos, nullptr, nullptr, &mColors1[TIMER_02_COLOR_00_00], &mColors2[TIMER_02_COLOR_01_00] ); } @@ -1012,8 +1012,8 @@ void LytMeterTimerPart2_c::createFruitCompleteEffect() { pos.x = mtx._03; pos.y = mtx._13; pos.z = 0.0f; - EffectsStruct::fn_800298C0( - PARTICLE_RESOURCE_ID_MAPPING_206_, &pos, nullptr, nullptr, &mColors1[TIMER_02_COLOR_00_01], + dJEffManager_c::spawnUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_206_, pos, nullptr, nullptr, &mColors1[TIMER_02_COLOR_00_01], &mColors2[TIMER_02_COLOR_01_01] ); } diff --git a/src/m/m3d/m_shadow.cpp b/src/m/m3d/m_shadow.cpp index bfe38562..903ca14f 100644 --- a/src/m/m3d/m_shadow.cpp +++ b/src/m/m3d/m_shadow.cpp @@ -515,7 +515,7 @@ bool mShadowChild_c::setGeom(const GXTexObj *texObj, const mMtx_c &mtx, const mQ void mShadowChild_c::updateMtx() { const mQuat_c &q = GetQuat(); - const mVec3_c &pos = GetPostion(); + const mVec3_c &pos = GetPosition(); Set0x13C(q.w); diff --git a/src/toBeSorted/blur_and_palette_manager.cpp b/src/toBeSorted/blur_and_palette_manager.cpp index b2d3a21b..f86d9e43 100644 --- a/src/toBeSorted/blur_and_palette_manager.cpp +++ b/src/toBeSorted/blur_and_palette_manager.cpp @@ -5,7 +5,7 @@ BlurAndPaletteManager BlurAndPaletteManager::sInstance; BlurAndPaletteManager *BlurAndPaletteManager::sPInstance; -TList sList; +TList sPlayingEffectsList; mColor BlurAndPaletteManager::combineColors(const mColor &c1, const mColor &c2, f32 ratio) { mColor result; @@ -178,7 +178,7 @@ BlurAndPaletteManager::BlurAndPaletteManager() { } - field_0x5CE4.MA06_kColor3 = mColor(0xff, 0xff, 0xff, 0xff); + field_0x5CE4.MA00_kColor3 = mColor(0xff, 0xff, 0xff, 0xff); field_0x5CE4.MA01_tevReg1 = mColor(0xff, 0xff, 0xff, 0xff); field_0x5CE4.MA01_kColor2 = mColor(0xff, 0xff, 0xff, 0xff); field_0x5CE4.MA02_tevReg1 = mColor(0xff, 0xff, 0xff, 0xff); diff --git a/src/toBeSorted/d_d3d.cpp b/src/toBeSorted/d_d3d.cpp index 5ce74e32..8f62c595 100644 --- a/src/toBeSorted/d_d3d.cpp +++ b/src/toBeSorted/d_d3d.cpp @@ -376,7 +376,7 @@ void EggTextureProc::doDraw() {} void EggTextureProc::doRemove() {} -bool EggTextureProc::create(int prioOpa, int prioXlu, mAllocator_c *alloc) { +bool UnkProc::create(int prioOpa, int prioXlu, mAllocator_c *alloc) { if (!m3d::proc_c::create(alloc, nullptr)) { return false; } @@ -390,7 +390,7 @@ bool EggTextureProc::create(int prioOpa, int prioXlu, mAllocator_c *alloc) { return true; } -bool EggTextureProc::createXlu(int prioXlu, mAllocator_c *alloc) { +bool UnkProc::createXlu(int prioXlu, mAllocator_c *alloc) { if (!m3d::proc_c::create(alloc, nullptr)) { return false; } diff --git a/src/toBeSorted/d_emitter.cpp b/src/toBeSorted/d_emitter.cpp new file mode 100644 index 00000000..8af6a5a3 --- /dev/null +++ b/src/toBeSorted/d_emitter.cpp @@ -0,0 +1,1298 @@ +// clang-format off +// vtable order +#include "JSystem/JParticle/JPAEmitter.h" +#include "JSystem/JParticle/JPAParticle.h" +#include "rvl/GX/GXTypes.h" +#include "toBeSorted/d_d3d.h" +// clang-format on + +#include "toBeSorted/d_emitter.h" + +#include "JSystem/JParticle/JPADrawInfo.h" +#include "JSystem/JParticle/JPAEmitter.h" +#include "c/c_math.h" +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/d_base.h" +#include "d/d_heap.h" +#include "d/d_stage.h" +#include "d/d_stage_mgr.h" +#include "egg/core/eggHeap.h" +#include "f/f_base.h" +#include "f/f_profile_name.h" +#include "m/m3d/m3d.h" +#include "m/m_allocator.h" +#include "m/m_angle.h" +#include "m/m_color.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "nw4r/g3d/g3d_camera.h" +#include "nw4r/g3d/g3d_state.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmat.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "nw4r/g3d/res/g3d_resshp.h" +#include "nw4r/math/math_arithmetic.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/blur_and_palette_manager.h" +#include "toBeSorted/d_d3d.h" +#include "toBeSorted/d_particle.h" +#include "toBeSorted/event_manager.h" +#include "toBeSorted/lyt_related_floats.h" + +#include "rvl/GX.h" +#include "rvl/MTX.h" + +void float_ordering_1(s32 a) { + (f32) a; +} + +void float_ordering_2() { + 255.0f; +} + +void float_ordering_3(u32 a) { + (f32) a; +} + +void float_ordering_4() { + 0.0f; +} + +dJEffManager_c::EffectsList dJEffManager_c::sPlayingEffectsList; +CommonEmitterCallback dJEffManager_c::sCommonEmitterCallbacks[2]; +dShpEmitter_c dJEffManager_c::sShpEmitters[47]; +dEmitterBase_c dJEffManager_c::sEmitter; +dParticleFogProc_c dJEffManager_c::sFogProcs[12]; +dEffect2D_c dJEffManager_c::s2DEffects[3]; + +// broken by -ipa file - probably TList nonsense? +dEmitterCallback_c::~dEmitterCallback_c() { + for (EmitterCallbackList::Iterator it = mEmitterList.GetBeginIter(); it != mEmitterList.GetEndIter();) { + EmitterCallbackList::Iterator itCopy = it; + ++itCopy; + it->setEmitterCallback(nullptr); + it = itCopy; + } +} + +void dEmitterCallback_c::remove(dEmitterBase_c *emitter) { + if (mEmitterList.GetPosition(emitter) == mEmitterList.GetEndIter()) { + return; + } + mEmitterList.remove(emitter); +} + +// broken by -ipa file - probably TList nonsense? +dParticleCallback_c::~dParticleCallback_c() { + for (ParticleCallbackList::Iterator it = mEmitterList.GetBeginIter(); it != mEmitterList.GetEndIter();) { + ParticleCallbackList::Iterator itCopy = it; + ++itCopy; + it->setParticleCallback(nullptr); + it = itCopy; + } +} + +void dParticleCallback_c::remove(dEmitterBase_c *emitter) { + if (mEmitterList.GetPosition(emitter) == mEmitterList.GetEndIter()) { + return; + } + mEmitterList.remove(emitter); +} + +dEmitterBase_c::~dEmitterBase_c() { + deactivateEmitters(); + if (mpEmitterCallback != nullptr) { + mpEmitterCallback->remove(this); + mpEmitterCallback = nullptr; + } + + if (mpParticleCallback != nullptr) { + mpParticleCallback->remove(this); + mpParticleCallback = nullptr; + } +} + +JPABaseEmitter *dEmitterBase_c::GetNextEmitter(JPABaseEmitter *head) { + return reinterpret_cast(head->getUserWork()); +} + +bool dEmitterBase_c::createEmitters( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2, s32 idx1, s32 idx2 +) { + u16 iter = effectResourceId; + JPABaseEmitter *head = nullptr; + JPABaseEmitter *last; + for (; iter != 0xFFFF; iter = dParticle::mgr_c::GetInstance()->getJpnData(iter)) { + last = dParticle::mgr_c::GetInstance()->createEmitter( + iter, dJEffManager_c::getGroupId(iter), position, rot, scale + ); + if (last != nullptr) { + if (head != nullptr) { + head->setUserWork(reinterpret_cast(last)); + } else { + mpEmitterHead = last; + } + head = last; + last->setEmitterCallBackPtr(mpEmitterCallback); + last->setParticleCallBackPtr(mpParticleCallback); + loadColors(last, c1, c2, idx1, idx2); + } + } + + if (mpEmitterHead != nullptr) { + if (mpEmitterCallback != nullptr) { + // why last and not head? + mpEmitterCallback->create(last); + } + if (mpParticleCallback != nullptr) { + // why last and not head? + mpParticleCallback->create(last); + } + } + return mpEmitterHead != nullptr; +} + +void dEmitterBase_c::setEmitterCallback(dEmitterCallback_c *cb) { + if (mpEmitterCallback != cb) { + if (mpEmitterCallback != nullptr) { + mpEmitterCallback->remove(this); + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setEmitterCallBackPtr(nullptr); + } + } + mpEmitterCallback = cb; + if (cb != nullptr) { + cb->mEmitterList.append(this); + } + } +} + +void dEmitterBase_c::setParticleCallback(dParticleCallback_c *cb) { + if (mpParticleCallback != cb) { + if (mpParticleCallback != nullptr) { + mpParticleCallback->remove(this); + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setParticleCallBackPtr(nullptr); + } + } + mpParticleCallback = cb; + if (cb != nullptr) { + cb->mEmitterList.append(this); + } + } +} + +void dEmitterBase_c::setImmortal() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->becomeImmortalEmitter(); + } +} + +void dEmitterBase_c::deactivateEmitters() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setEmitterCallBackPtr(nullptr); + emitter->setParticleCallBackPtr(nullptr); + emitter->quitImmortalEmitter(); + if (emitter->mMaxFrame == 0) { + emitter->becomeInvalidEmitter(); + } + emitter->playCalcEmitter(); + } + mpEmitterHead = nullptr; +} + +void dEmitterBase_c::stopCalcEmitters() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->stopCalcEmitter(); + } +} + +void dEmitterBase_c::playCalcEmitters() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->playCalcEmitter(); + } +} + +void dEmitterBase_c::stopDrawParticles() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->stopDrawParticle(); + } +} + +void dEmitterBase_c::playDrawParticles() { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->playDrawParticle(); + } +} + +void dEmitterBase_c::setPosRotScale(const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalTranslation(position); + if (rot != nullptr) { + emitter->setGlobalRotation(*rot); + } + if (scale != nullptr) { + emitter->setGlobalScale(*scale); + } + } +} + +extern "C" f32 lbl_80571C50; +inline f32 getlbl_80571C50() { + return lbl_80571C50; +} +void dEmitterBase_c::setPosRotScaleWithScreenScale(const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale) { + mVec3_c adjustedPosition(position.x * getlbl_80571C50(), position.y, position.z); + setPosRotScale(adjustedPosition, rot, scale); +} + +void dEmitterBase_c::setTransform(const mMtx_c &mtx) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalSRTMatrix(mtx); + } +} + +void dEmitterBase_c::loadColors(const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + loadColors(emitter, c1, c2, idx1, idx2); + } +} + +void dEmitterBase_c::setGlobalAlpha(u8 alpha) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalAlpha(alpha); + } +} + +void dEmitterBase_c::setRate(f32 rate) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setRate(rate); + } +} + +void dEmitterBase_c::setDynamicsScale(const mVec3_c &scale) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalDynamicsScale(scale); + } +} + +void dEmitterBase_c::setParticleScale(const mVec3_c &scale) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setGlobalParticleScale(scale); + } +} + +void dEmitterBase_c::setAwayFromCenterSpeed(f32 speed) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setAwayFromCenterSpeed(speed); + } +} + +void dEmitterBase_c::setVolumeSize(u16 size) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setVolumeSize(size); + } +} + +void dEmitterBase_c::setLifeTime(s16 lifetime) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setLifeTime(lifetime); + } +} + +void dEmitterBase_c::attachEmitterCallbackId(s32 id) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setEmitterCallBackPtr(&dJEffManager_c::sCommonEmitterCallbacks[id]); + } +} + +void dEmitterBase_c::bindShpEmitter(s32 id, bool unused) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setParticleCallBackPtr(&dJEffManager_c::sShpEmitters[id]); + emitter->setGlobalAlpha(0); + } +} + +EffectsStruct::EffectsStruct() : mpOwner(nullptr), mFlags(0), mEffect(0) {} + +EffectsStruct::EffectsStruct(dBase_c *base) : mpOwner(base), mFlags(0), mEffect(0) {} + +EffectsStruct::~EffectsStruct() { + mpOwner = nullptr; + remove(false); +} + +void EffectsStruct::remove(bool bForceDeleteEmitters) { + offFlag(EMITTER_0x1); + JPABaseEmitter *emitter = bForceDeleteEmitters ? mpEmitterHead : nullptr; + deactivateEmitters(); + for (; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + dParticle::mgr_c::GetInstance()->forceDeleteEmitter(emitter); + } + removeFromActiveEmittersList(); +} + +void EffectsStruct::addToActiveEmittersList(u16 resourceId, bool bFlags) { + mEffect = resourceId; + mFlags = 0; + setImmortal(); + dJEffManager_c::sPlayingEffectsList.append(this); + onFlag(EMITTER_0x1); + if (bFlags) { + onFlag(EMITTER_0x4); + } + if (dParticle::mgr_c::GetInstance()->getResUserWork(resourceId) & 0x4000) { + onFlag(EMITTER_0x10); + } +} + +bool EffectsStruct::areAllEmittersDone() { + bool allDone = true; + + if (mpEmitterHead != nullptr) { + if (checkFlag(EMITTER_Fading) && mFadeTimer != 0) { + return false; + } + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + bool canDelete = emitter->isEnableDeleteEmitter(); + if (!canDelete) { + if (emitter->mMaxFrame == 0) { + emitter->becomeInvalidEmitter(); + } + allDone = false; + } + } + } + + return allDone; +} + +void EffectsStruct::execute() { + if (mpOwner != nullptr && (mpOwner->delete_request || mpOwner->lifecycle_state == fBase_c::TO_BE_DELETED)) { + mpOwner = nullptr; + } + if (dJEffManager_c::shouldBePaused(mpOwner)) { + if (!checkFlag(EMITTER_0x10)) { + stopCalcEmitters(); + if (mpOwner != nullptr && !mpOwner->isBasePropertyFlag(0x100)) { + if (!mpEmitterHead->checkStatus(JPAEmtrStts_StopDraw)) { + onFlag(EMITTER_0x20); + stopDrawParticles(); + } + } else { + if (checkFlag(EMITTER_0x20)) { + offFlag(EMITTER_0x20); + playDrawParticles(); + } + } + } + onFlag(EMITTER_0x1); + } else { + playCalcEmitters(); + if (checkFlag(EMITTER_0x20)) { + offFlag(EMITTER_0x20); + playDrawParticles(); + } + if (checkFlag(EMITTER_Fading) && mFadeTimer != 0) { + mFadeTimer--; + } + } +} + +bool EffectsStruct::getOwnerPolyAttrs(s32 *pOut1, s32 *pOut2) { + if (mpOwner != nullptr && mpOwner->group_type == fBase_c::ACTOR) { + dAcBase_c *actor = static_cast(mpOwner); + *pOut1 = actor->polyAttr0; + *pOut2 = actor->polyAttr1; + return true; + } else { + *pOut1 = 0; + *pOut2 = 0; + return false; + } +} + +void EffectsStruct::realizeAlpha() { + setGlobalAlpha(mFadeTimer * (255.0f / mFadeDuration)); +} + +void EffectsStruct::setFading(u8 lifetime) { + if (!checkFlag(EMITTER_Fading)) { + mFadeTimer = lifetime; + onFlag(EMITTER_Fading); + mFadeDuration = lifetime; + } +} + +bool dParticleFogProc_c::create(u32 idx, s32 prioOpa, s32 prioXlu, mHeapAllocator_c *alloc) { + if (!d3d::UnkProc::create(prioOpa, prioXlu, alloc)) { + return false; + } + mIdx = idx; + field_0x1C = idx == 0 || idx == 2 || idx == 4 || idx == 6 || idx == 10; + return true; +} + +void dParticleFogProc_c::doDraw() { + nw4r::g3d::Camera c = m3d::getCurrentCamera(); + mMtx_c camMtx, texProjMtx; + c.GetCameraMtx(camMtx); + c.GetProjectionTexMtx(texProjMtx); + JPADrawInfo info; + MTXCopy(camMtx, info.mCamMtx); + MTXCopy(texProjMtx, info.mPrjMtx); + if (field_0x1C) { + m3d::getFogMgr(0); // ignored, maybe an inline on FogMgr? + nw4r::g3d::G3DState::LoadFog(0); + } else { + mColor c(0); + GXSetFog(GX_FOG_NONE, c, 0.0f, 0.0f, 0.0f, 0.0f); + GXSetFogRangeAdj(GX_FALSE, 0, nullptr); + } + GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); + dJEffManager_c::draw(&info, mIdx); +} + +extern "C" bool fn_80054AD0(); +void dEffect2D_c::draw() { + f32 proj[GX_PROJECTION_SZ]; + GXGetProjectionv(proj); + f32 base = proj[1]; + proj[1] = base / get_805751A4(); + GXSetProjectionv(proj); + f32 f = get_80575184() / 2; + mMtx_c mtx1, mtx2; + JPADrawInfo info; + + C_MTXLightOrtho(mtx1, -get_80575150(), get_80575150(), -f, f, 0.5f, 0.5f, 0.5f, 0.5f); + + MTXScale(mtx2, fn_80054AD0() ? get_805751A4() : 1.0f, 1.0f, 1.0f); + MTXCopy(mtx2, info.mCamMtx); + MTXCopy(mtx1, info.mPrjMtx); + dJEffManager_c::draw(&info, mGroupId); + proj[1] = base; + GXSetProjectionv(proj); +} + +void dEffect2D_c::create(u32 groupId, u8 prio) { + mGroupId = groupId; + setPriority(prio); +} + +bool dMassObjEmitterCallback_c::start(const mVec3_c &v1, dAcObjBase_c *owner) { + if (field_0x658 >= 50) { + return false; + } + + field_0x010[field_0x658] = v1; + field_0x4C0[field_0x658] = owner; + + field_0x658++; + return true; +} + +void dMassObjEmitterCallback_c::executeAfter(JPABaseEmitter *emitter) { + s32 createNumber = emitter->getCurrentCreateNumber(); + if (createNumber > 0) { + s32 i = 0; + mVec3_c translate; + emitter->getLocalTranslation(translate); + if (field_0x654 != 0) { + for (; i < field_0x654; i++) { + mVec3_c newTranslate = mVec3_c(field_0x268[i] + translate); + emitter->setGlobalTranslation(newTranslate); + for (s32 j = 0; j < createNumber; j++) { + JPABaseParticle *p = emitter->createParticle(); + if (p != nullptr) { + p->setOffsetPosition(newTranslate); + } + } + } + } + } +} + +void dMassObjEmitterCallback_c::execute() { + for (s32 i = field_0x654 - 1; i >= 0; i--) { + if (field_0x588[i] != nullptr) { + if (!dJEffManager_c::shouldBePaused(field_0x588[i]) || field_0x588[i]->delete_request || + field_0x588[i]->lifecycle_state == fBase_c::TO_BE_DELETED) { + if (field_0x654 != 0 && i != field_0x654 - 1) { + field_0x588[i] = field_0x588[field_0x654 - 1]; + field_0x268[i] = field_0x268[field_0x654 - 1]; + } else { + field_0x588[i] = nullptr; + } + field_0x654--; + } + } else { + field_0x654--; + } + } + if (field_0x658 + field_0x654 > 50) { + field_0x658 = 50 - field_0x654; + } + + for (u32 i = 0; i < field_0x658; i++) { + field_0x588[field_0x654] = field_0x4C0[i]; + field_0x268[field_0x654] = field_0x010[i]; + field_0x654++; + } + field_0x658 = 0; +} + +#pragma opt_unroll_loops off +void dMassObjEmitterCallback_c::clear() { + // TODO: this unrolls the entire loops, + // but the original code uses an unroll + // factor of 10 (5 iterations). 2D arrays + // work here but are probably fake. + field_0x654 = 0; + for (u32 i = 0; i < 50; i++) { + field_0x588[i] = nullptr; + } + field_0x658 = 0; + for (u32 i = 0; i < 50; i++) { + field_0x4C0[i] = nullptr; + } +} +#pragma opt_unroll_loops reset + +void dMassObjEmitter_c::create(u16 resourceId) { + setEmitterCallback(&mCallback); + if (createEmitters(resourceId, mVec3_c::Zero, nullptr, nullptr, nullptr, nullptr, 0, 0)) { + for (JPABaseEmitter *emitter = mpEmitterHead; emitter != nullptr; emitter = GetNextEmitter(emitter)) { + emitter->setStatus(JPAEmtrStts_Immortal); + emitter->setStatus(JPAEmtrStts_StopEmit); + } + mCallback.clear(); + } +} + +void dShpEmitterProc::doDraw() { + mMtx_c viewMtx; + getViewMtx(viewMtx); + s32 ctrl = 0; + mLightSetId = mAlpha[0]; + mMtx_c *pTransforms = mpTransforms; + bool *pFlags = mpFlags; + for (s32 idx = 0; idx < mCount;) { + if (*pFlags == false) { + mMtx_c mtx; + mtx.copyFrom(*pTransforms); + MTXConcat(viewMtx, mtx, mtx); + mMtx_c mtx2; + mtx2.copyFrom(mtx); + mtx2.fn_802F1C40(0, 1); + nw4r::math::MTX33 mtx3; + for (int a = 0; a < 3; a++) { + for (int b = 0; b < 3; b++) { + mtx3.m[a][b] = mtx2.m[a][b]; + } + } + if (mLightSetId != mAlpha[idx]) { + mLightSetId = mAlpha[idx]; + setupLight(); + } + mVec3_c v; + mVec3_c zero(0.0f, 0.0f, 0.0f); + MTXMultVec(*pTransforms, zero, v); + dShpProcBase_c::draw(&v); + nw4r::g3d::G3DState::SetViewPosNrmMtxArray(mtx, &mtx3, nullptr); + nw4r::g3d::Draw1Mat1ShpDirectly(nw4r::g3d::ResMat(nullptr), mShp, mtx, mtx2, ctrl, nullptr, nullptr); + if (ctrl == 0) { + ctrl = 2; + } + } + idx++; + pTransforms++; + pFlags++; + } + mpOwner->clear(); +} + +bool dShpEmitter_c::create(mHeapAllocator_c *alloc) { + if (!mProc.create(nw4r::g3d::ResMat(nullptr), nw4r::g3d::ResShp(nullptr), 100, alloc, false, nullptr)) { + return false; + } + mProc.setOwner(this); + return true; +} + +void dShpEmitter_c::init(const char *mdlName, const char *arcName, bool priority) { + clear(); + void *ptr = OarcManager::GetInstance()->getSubEntryData(arcName, "g3d/model.brres"); + if (ptr == nullptr) { + mProc.setResMat(nw4r::g3d::ResMat(nullptr)); + mProc.setResShp(nw4r::g3d::ResShp(nullptr)); + return; + } + + nw4r::g3d::ResFile f(ptr); + + if (strequals(arcName, "F300BrokenRockWall")) { + dStage_c::bindStageResToFile(&f); + } + + nw4r::g3d::ResMdl mdl = f.GetResMdl(mdlName); + nw4r::g3d::ResMat mat = mdl.GetResMat(0); + mProc.setResMat(mat); + mProc.setResShp(mdl.GetResShp(0)); + if (priority) { + mProc.setPriorityDraw(0x1C, 4); + } +} + +void dShpEmitter_c::clear() { + field_0xA0 = 0; + mProc.setAllFlags(); +} + +void dShpEmitter_c::draw(JPABaseEmitter *emitter, JPABaseParticle *particle) { + // TODO + for (s32 i = 0; i < 100; i++) { + if (mProc.isDrawDisabled(i)) { + mProc.setDrawDisabled(i, false); + mVec3_c pos; + mVec3_c velocity; + particle->getGlobalPosition(pos); + particle->getVelVec(velocity); + mVec3_c v; + if (cM::isZero(velocity.squareMagXZ())) { + v = mVec3_c::Ex; + } else { + v = mVec3_c::Ey.cross(velocity); + v.normalize(); + } + mMtx_c m; + m.setAxisRotation(v, mAng((u16)particle->mRotateAngle).radian2()); + m.setBase(3, pos); + mMtx_c mtx2; + mVec3_c scale( + particle->getParticleScaleX() * emitter->getGlobalParticleScaleX(), + particle->getParticleScaleY() * emitter->getGlobalParticleScaleY(), + particle->getParticleScaleX() * emitter->getGlobalParticleScaleX() + ); + MTXScale(mtx2, scale.x, scale.y, scale.z); + MTXConcat(m, mtx2, m); + mProc.setTransform(i, m); + mProc.setAlpha(i, emitter->getGlobalAlpha()); + field_0xA0++; + break; + } + } + // Hide the particle - we're doing all the drawing ourselves + particle->setInvisibleParticleFlag(); +} + +void CommonEmitterCallback::draw(JPABaseEmitter *emitter) { + emitter->loadTexture(field_0x04, GX_TEXMAP0); +} + +void dMassObjEmitter_c::remove() { + setEmitterCallback(nullptr); + mpEmitterHead = nullptr; +} + +extern "C" u32 sNumMassObjEmitters; // should be const? +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_119_; +extern "C" dMassObjEmitter_c *CURRENT_EFFECT_MANAGER_INIT; + +const u32 dJEffManager_c::moreInts[] = {3, 5, 7, 8, 12, 13, 14, 1, 9, 11}; + +s32 dJEffManager_c::getGroupId(u16 resourceId) { + u32 mask = dParticle::mgr_c::GetInstance()->getResUserWork(resourceId); + s32 bit = 1; + for (int i = 0; i < 10; i++) { + if ((mask & (1 << i)) != 0) { + bit = i; + break; + } + } + + int i = moreInts[bit]; + // TODO explain this + if ((mask & 0x8000) != 0) { + if (i == 3) { + i = 2; + } else if (i == 5) { + i = 4; + } else if (i == 7) { + i = 6; + } else if (i == 1) { + i = 0; + } else if (i == 11) { + i = 10; + } + } + + return i; +} + +// various grasses being cut +extern const u16 sEffectResourceIds[]; + +void dJEffManager_c::setupEffects() { + for (s32 idx = 0; idx < sNumMassObjEmitters; idx++) { + sMassObjEmitters[idx].create(sEffectResourceIds[idx]); + } + + sShpEmitters[TsuboA].init("FX_TsuboA", "Tubo", false); + sShpEmitters[TsuboB].init("FX_TsuboB", "Tubo", false); + sShpEmitters[BRockA].init("FX_BRockA", "FXBRockA", true); + sShpEmitters[FruitA].init("FX_FruitA", "FruitA", false); + sShpEmitters[GrassCoil].init("FX_GrassCoil", "GrassCoilPiece", false); + sShpEmitters[BRockB].init("FX_BRockB", "RockFace", true); + sShpEmitters[Beehive].init("FX_Beehive", "Bee", false); + sShpEmitters[VeraRock].init("FX_VeraRock", "Bvd", false); + sShpEmitters[Pumpkin].init("FX_Pumpkin", "Pumpkin", false); + sShpEmitters[BRockC].init("FX_BRockC", "FX_BRockC", true); + sShpEmitters[F300BrokenRockWall_00].init("FX_F300BrokenRockWall_00", "F300BrokenRockWall", true); + sShpEmitters[F300BrokenRockWall_01].init("FX_F300BrokenRockWall_01", "F300BrokenRockWall", true); + sShpEmitters[F300BrokenRockWall_01T].init("FX_F300BrokenRockWall_01T", "F300BrokenRockWall", true); + sShpEmitters[LotusSeed].init("FX_LotusSeed", "LotusSeed", false); + sShpEmitters[Beamoss].init("FX_Beamoss", "Beamos", false); + sShpEmitters[Cakram].init("FX_Cakram", "Asura", false); + sShpEmitters[Dodai].init("FX_Dodai", "Asura", false); + sShpEmitters[LegParts].init("FX_LegParts", "Asura", false); + sShpEmitters[AsuraFloorBrk].init("FX_AsuraFloorBrk", "Asura", false); + sShpEmitters[BreakPillar].init("FX_BreakPillar", "BreakPillar", false); + sShpEmitters[Barrel].init("FX_Barrel", "Barrel", false); + sShpEmitters[BarrelBomb].init("FX_BarrelBomb", "BarrelBomb", false); + sShpEmitters[RockMiddle].init("FX_RockMiddle", "RockCarryMiddle", false); + sShpEmitters[BocoBone].init("FX_BocoBone", "Skull", false); + sShpEmitters[BRockStopA].init("FX_BRockStopA", "BRockStopA", true); + sShpEmitters[BWallD201].init("FX_BWallD201", "BWallD201", true); + sShpEmitters[Gunho].init("FX_Gunho", "Gunho", false); + sShpEmitters[TuboBig].init("FX_TuboBig", "TuboBig", false); + sShpEmitters[Amos].init("FX_Amos", "Amos", false); + sShpEmitters[HidokariBoneA].init("FX_HidokariBoneA", "HidokariS", false); + sShpEmitters[HidokariBoneB].init("FX_HidokariBoneB", "HidokariS", false); + sShpEmitters[Hydra].init("FX_Hydra", "Hydra", false); + sShpEmitters[Captain].init("FX_Captain", "Captain", false); + sShpEmitters[KibakoHang].init("FX_KibakoHang", "KibakoHang", true); + sShpEmitters[IslTreIRock].init("FX_IslTreIRock", "IslTreIRock", false); + sShpEmitters[BirdraceTarget].init("FX_BirdraceTarget", "BirdraceTarget", false); + sShpEmitters[FlowerA00F].init("FX_FlowerA00F", "FlowerA00", false); + sShpEmitters[FlowerA00L].init("FX_FlowerA00L", "FlowerA00", false); + sShpEmitters[FlowerB00].init("FX_FlowerB00", "FlowerB00", false); + sShpEmitters[FlowerB01].init("FX_FlowerB01", "FlowerB01", false); + sShpEmitters[GirahimClaymore].init("FX_GirahimClaymore", "GirahimBt03", false); + sShpEmitters[BirdKobunAEgg].init("FX_BirdKobunAEgg", "BirdEgg", false); + sShpEmitters[BirdKobunBEgg].init("FX_BirdKobunBEgg", "BirdEgg", false); + sShpEmitters[BirdRivalEgg].init("FX_BirdRivalEgg", "BirdEgg", false); + sShpEmitters[BWallAF200].init("FX_BWallAF200", "BWallAF200", true); + sShpEmitters[BWallBF200].init("FX_BWallBF200", "BWallBF200", true); + sShpEmitters[BWallF210].init("FX_BWallF210", "BWallF210", true); +} + +u32 dJEffManager_c::sInts[] = {0x28, 0x29, 0x87, 0x88, 0x89, 0x8A, 0x8C, 0x8D, 0x91, 0x86, 0x1, 0x2}; +u32 dJEffManager_c::sInts2[] = {0x2, 0x87, 0x8B}; + +void dJEffManager_c::removeEffManagers() { + for (s32 i = 0; i < sNumMassObjEmitters; i++) { + sMassObjEmitters[i].remove(); + } + + // TODO + EffectsList::Iterator it = sPlayingEffectsList.GetBeginIter(); + while (it != sPlayingEffectsList.GetEndIter()) { + EffectsList::Iterator itCopy; + ++itCopy; + it->remove(true); + it = itCopy; + } + + dParticle::mgr_c::GetInstance()->forceDeleteAllEmitter(); + for (s32 i = 0; i < 47; i++) { + sShpEmitters[i].clear(); + } +} + +void dJEffManager_c::doCustomSkywardSwordThing(f32 x, f32 y) { + EffectsList::Iterator it = sPlayingEffectsList.GetBeginIter(); + while (it != sPlayingEffectsList.GetEndIter()) { + if (it->getEmitterCallback() != nullptr && it->hasEmitters() && it->getGroupId() < 12) { + it->getEmitterCallback()->vt_0x20(x, y); + } + ++it; + } + + for (s32 i = 0; i < 12; i++) { + dParticle::mgr_c::GetInstance()->doCustomSkywardSwordThing(i, x, y); + } +} + +void dJEffManager_c::execute() { + for (EffectsList::Iterator it = sPlayingEffectsList.GetBeginIter(); it != sPlayingEffectsList.GetEndIter();) { + EffectsList::Iterator itNext = it; + ++itNext; + it->execute(); + if (it->checkFlag(EffectsStruct::EMITTER_Fading)) { + it->realizeAlpha(); + } + if (it->checkFlag(EffectsStruct::EMITTER_0x1)) { + it->offFlag(EffectsStruct::EMITTER_0x1); + } else { + if (it->areAllEmittersDone()) { + it->remove(false); + } else { + it->onFlag(EffectsStruct::EMITTER_0x2); + } + } + it = itNext; + } + + if (dStageMgr_c::GetInstance() != nullptr) { + CURRENT_EFFECT_MANAGER_INIT->setGlobalAlpha(dStageMgr_c::GetInstance()->getGlobalAlpha()); + } + + for (s32 i = 0; i < sNumMassObjEmitters; i++) { + mColor c = sMassObjEmitters[i].getField_0x67C(); + sMassObjEmitters[i].loadColors(&c, nullptr, 0, 0); + sMassObjEmitters[i].execute(); + } + + if ((dBase_c::s_ExecuteControlFlags & 0x6F9) == 0) { + for (int i = 0; i < 12; i++) { + dParticle::mgr_c::GetInstance()->calc(i); + } + } else { + dParticle::mgr_c::GetInstance()->calc(9); + } + + dParticle::mgr_c::GetInstance()->calc(12); + dParticle::mgr_c::GetInstance()->calc(13); + dParticle::mgr_c::GetInstance()->calc(14); +} + +void dJEffManager_c::draw() { + for (s32 i = 0; i < 12; i++) { + sFogProcs[i].entry(); + } + + s2DEffects[0].addToDrawList(); + s2DEffects[1].addToDrawList(); + s2DEffects[2].addToDrawList(); + + for (s32 i = 0; i < 47; i++) { + sShpEmitters[i].draw(); + } +} + +bool dJEffManager_c::shouldBePaused(dBase_c *owner) { + return owner != nullptr && !owner->isBasePropertyFlag(dBase_c::BASE_PROP_0x4) && + (EventManager::isInEvent() || owner->isProcControlFlag(fBase_c::DISABLE_EXECUTE) || + // TODO execute control flags + (owner->s_ExecuteControlFlags & 0x6fb)); +} + +void dJEffManager_c::draw(const JPADrawInfo *info, u32 groupId) { + dParticle::mgr_c::GetInstance()->draw(info, groupId); +} + +bool dJEffManager_c::createEffManagers() { + EGG::Heap *heap = dHeap::work1Heap.heap; + ms_allocator = new (heap, 4) mHeapAllocator_c(); + sMassObjEmitters = new (heap, 4) dMassObjEmitter_c[sNumMassObjEmitters]; + + for (s32 idx = 0; idx < sNumMassObjEmitters; idx++) { + // TODO explain this + if (sEffectResourceIds[idx] == PARTICLE_RESOURCE_ID_MAPPING_119_) { + CURRENT_EFFECT_MANAGER_INIT = &sMassObjEmitters[idx]; + break; + } + } + + ms_allocator->createNewTempFrmHeap(-1, dHeap::work1Heap.heap, "dJEffManager_c::ms_allocator", 0x20, 0); + for (s32 idx = 0; idx < 2; idx++) { + sFogProcs[idx].create(idx, sInts[idx], -1, ms_allocator); + } + for (s32 idx = 2; idx < 12; idx++) { + sFogProcs[idx].create(idx, -1, sInts[idx], ms_allocator); + } + + for (s32 idx = 0; idx < 3; idx++) { + s2DEffects[idx].create(idx + 12, sInts2[idx]); + } + + for (s32 idx = 0; idx < 47; idx++) { + sShpEmitters[idx].create(ms_allocator); + } + + ms_allocator->adjustFrmHeapRestoreCurrent(); + for (int i = 0; i < 2; i++) { + sCommonEmitterCallbacks[i].init(i); + } + return true; +} + +dEmitterBase_c *dJEffManager_c::spawnEffectInternal( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2, s32 idx1, s32 idx2 +) { + if (!sEmitter.createEmitters(effectResourceId, position, rot, scale, c1, c2, idx1, idx2)) { + return nullptr; + } + return &sEmitter; +} + +dEmitterBase_c *dJEffManager_c::spawnEffectInternal( + u16 effectResourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2 +) { + dEmitterBase_c *e = spawnEffectInternal(effectResourceId, mVec3_c::Zero, nullptr, nullptr, c1, c2, idx1, idx2); + if (e != nullptr) { + e->setTransform(transform); + } + return e; +} + +dEmitterBase_c *dJEffManager_c::spawnEffect( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2, s32 idx1, s32 idx2 +) { + return spawnEffectInternal(effectResourceId, position, rot, scale, c1, c2, idx1, idx2); +} + +dEmitterBase_c *dJEffManager_c::spawnUIEffect( + u16 effectResourceId, const mVec3_c &position, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2 +) { + mVec3_c adjustedPosition(position.x * getlbl_80571C50(), position.y, position.z); + return spawnEffectInternal(effectResourceId, adjustedPosition, rot, scale, c1, c2, 0, 0); +} + +dEmitterBase_c *dJEffManager_c::spawnEffect( + u16 effectResourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2, s32 idx1, s32 idx2 +) { + return spawnEffectInternal(effectResourceId, transform, c1, c2, idx1, idx2); +} + +bool EffectsStruct::createEffect( + u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, const GXColor *c2 +) { + return createEffect(true, resourceId, pos, rot, scale, c1, c2); +} + +bool EffectsStruct::createUIEffect( + u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, const GXColor *c2 +) { + mVec3_c adjustedPosition(pos.x * getlbl_80571C50(), pos.y, pos.z); + return createEffect(true, resourceId, adjustedPosition, rot, scale, c1, c2); +} + +bool EffectsStruct::createEffect(u16 resourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2) { + return createEffect(true, resourceId, transform, c1, c2); +} + +bool EffectsStruct::createContinuousEffect( + u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, const GXColor *c2 +) { + return createEffect(false, resourceId, pos, rot, scale, c1, c2); +} + +bool EffectsStruct::createContinuousUIEffect( + u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, const GXColor *c2 +) { + mVec3_c adjustedPosition(pos.x * getlbl_80571C50(), pos.y, pos.z); + return createEffect(false, resourceId, adjustedPosition, rot, scale, c1, c2); +} + +bool EffectsStruct::createContinuousEffect( + u16 resourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2 +) { + return createEffect(false, resourceId, transform, c1, c2); +} + +bool dJEffManager_c::createMassObjEffect( + u16 effectResourceId, const mVec3_c &v1, dAcObjBase_c *owner, const mColor *color +) { + for (s32 i = 0; i < sNumMassObjEmitters; i++) { + if (effectResourceId == sEffectResourceIds[i]) { + if (color != nullptr) { + sMassObjEmitters[i].setField_0x67C(*color); + } else { + sMassObjEmitters[i].setField_0x67C(mColor(0xFF, 0xFF, 0xFF, 0xFF)); + } + return sMassObjEmitters[i].start(v1, owner); + } + } + + return false; +} + +void dEmitterBase_c::loadColors( + JPABaseEmitter *emitter, const GXColor *color1, const GXColor *color2, s32 plltIdx1, s32 plltIdx2 +) { + BlurAndPaletteManager &mgr = BlurAndPaletteManager::GetInstance(); + u8 r1 = 0xFF; + u8 g1 = 0xFF; + u8 b1 = 0xFF; + u8 r2 = 0xFF; + u8 g2 = 0xFF; + u8 b2 = 0xFF; + u8 r, g, b; + + mColor c1 = mgr.GetCurrentSph().black3_000000; + mColor c2 = mgr.GetCurrentSph().black4_000000; + + u32 flags = emitter->getDynResUserWork(); + u32 factor = flags >> 24; + bool useBlack4 = false; + if (factor > 100) { + useBlack4 = true; + factor = factor - 100; + } + f32 fFactor = factor / 100.0f; + if (fFactor > 1.0f) { + fFactor = 1.0f; + } + + f32 scaleR, scaleG, scaleB; + if (!useBlack4) { + scaleR = 1.0f - (1.0f - (c1.r / 255.0f)) * fFactor; + scaleG = 1.0f - (1.0f - (c1.g / 255.0f)) * fFactor; + scaleB = 1.0f - (1.0f - (c1.b / 255.0f)) * fFactor; + } else { + const mColor &c = mgr.GetCurrentSph().black4_000000; + scaleR = 1.0f - (1.0f - (c2.r / 255.0f)) * fFactor; + scaleG = 1.0f - (1.0f - (c2.g / 255.0f)) * fFactor; + scaleB = 1.0f - (1.0f - (c2.b / 255.0f)) * fFactor; + } + + if (color1 != nullptr) { + r1 = color1->r; + g1 = color1->g; + b1 = color1->b; + } + + if (plltIdx1 > 0) { + if ((flags & 0x1000) != 0) { + const PaletteEAF_smol_entry &entry = mgr.getSmallEAF(plltIdx1 - 1, plltIdx2); + r1 = entry.field_0x00.r; + g1 = entry.field_0x00.g; + b1 = entry.field_0x00.b; + } else if ((flags & 0x2000) != 0) { + const PaletteEAF_smol_entry &entry = mgr.getSmallEAF(plltIdx1 - 1, plltIdx2); + r1 = entry.field_0x08.r; + g1 = entry.field_0x08.g; + b1 = entry.field_0x08.b; + } + } + + if (factor != 0) { + r = mgr.getfield_0x2F14() * r1 * scaleR; + g = mgr.getfield_0x2F18() * g1 * scaleG; + b = mgr.getfield_0x2F1C() * b1 * scaleB; + } else { + r = r1 * scaleR; + g = g1 * scaleG; + b = b1 * scaleB; + } + + emitter->setGlobalPrmColor(r, g, b); + + if (color2 != nullptr) { + r2 = color2->r; + g2 = color2->g; + b2 = color2->b; + } + + if (plltIdx1 > 0) { + if ((flags & 0x1000) != 0) { + const PaletteEAF_smol_entry &entry = mgr.getSmallEAF(plltIdx1 - 1, plltIdx2); + r2 = entry.field_0x04.r; + g2 = entry.field_0x04.g; + b2 = entry.field_0x04.b; + } else if ((flags & 0x2000) != 0) { + const PaletteEAF_smol_entry &entry = mgr.getSmallEAF(plltIdx1 - 1, plltIdx2); + r2 = entry.field_0x0C.r; + g2 = entry.field_0x0C.g; + b2 = entry.field_0x0C.b; + } + } + + if (factor != 0) { + r = mgr.getfield_0x2F14() * r2 * scaleR; + g = mgr.getfield_0x2F18() * g2 * scaleG; + b = mgr.getfield_0x2F1C() * b2 * scaleB; + } else { + r = r2 * scaleR; + g = g2 * scaleG; + b = b2 * scaleB; + } + + emitter->setGlobalEnvColor(r, g, b); +} + +void EffectsStruct::removeFromActiveEmittersList() { + if (dJEffManager_c::sPlayingEffectsList.GetPosition(this) != dJEffManager_c::sPlayingEffectsList.GetEndIter()) { + dJEffManager_c::sPlayingEffectsList.remove(this); + } +} + +bool EffectsStruct::createEffect( + bool bFlags, u16 resourceId, const mVec3_c &pos, const mAng3_c *rot, const mVec3_c *scale, const GXColor *c1, + const GXColor *c2 +) { + if (!bFlags && canReuse(resourceId)) { + setPosRotScale(pos, rot, scale); + s32 idx1 = 0; + s32 idx2 = 0; + getOwnerPolyAttrs(&idx1, &idx2); + loadColors(c1, c2, idx1, idx2); + onFlag(EMITTER_0x1); + } else { + remove(false); + s32 idx1 = 0; + s32 idx2 = 0; + getOwnerPolyAttrs(&idx1, &idx2); + if (createEmitters(resourceId, pos, rot, scale, c1, c2, idx1, idx2)) { + addToActiveEmittersList(resourceId, bFlags); + } + } + + return hasEmitters(); +} + +bool EffectsStruct::createEffect( + bool bFlags, u16 resourceId, const mMtx_c &transform, const GXColor *c1, const GXColor *c2 +) { + if (!bFlags && canReuse(resourceId)) { + s32 idx1 = 0; + s32 idx2 = 0; + getOwnerPolyAttrs(&idx1, &idx2); + loadColors(c1, c2, idx1, idx2); + onFlag(EMITTER_0x1); + } else { + remove(false); + s32 idx1 = 0; + s32 idx2 = 0; + getOwnerPolyAttrs(&idx1, &idx2); + if (createEmitters(resourceId, mVec3_c::Zero, nullptr, nullptr, c1, c2, idx1, idx2)) { + addToActiveEmittersList(resourceId, bFlags); + } + } + setTransform(transform); + return hasEmitters(); +} + +// TODO: Document PolyAttrs +s32 dJEffManager_c::polyAttrsToGroundEffectIdx(s32 polyAttr0, s32 polyAttr1) { + if (polyAttr0 == 0 || (polyAttr0 == 4 && polyAttr1 == 1) || (polyAttr0 == 9) || + (polyAttr0 == 10 && polyAttr1 == 1) || (polyAttr0 == 12) || (polyAttr0 == 17 && polyAttr1 != 1) || + (polyAttr0 == 13 && (polyAttr1 == 1 || polyAttr1 == 3)) || polyAttr0 == 18) { + return 6; + } else if (polyAttr0 == 17) { + return 5; + } else if (polyAttr0 == 6) { + return 2; + } else if (polyAttr0 == 4) { + return 1; + } else if (polyAttr0 == 3 || polyAttr0 == 15) { + return 3; + } + // ??? + s32 result = 0; + if (polyAttr0 == 11) { + result = 4; + } + return result; +} + +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_89_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_90_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_87_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_88_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_429_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_416_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_417_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_418_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_419_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_893_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_894_; + +dEmitterBase_c *dJEffManager_c::spawnGroundEffect( + const mVec3_c &pos, u8 polyAttr0, u8 polyAttr1, const mVec3_c &v1, s32 unk, f32 scale, f32 groundHeightMaybe +) { + static const u16 sEffArray[6][2] = { + { PARTICLE_RESOURCE_ID_MAPPING_89_, PARTICLE_RESOURCE_ID_MAPPING_90_}, + { PARTICLE_RESOURCE_ID_MAPPING_87_, PARTICLE_RESOURCE_ID_MAPPING_88_}, + {PARTICLE_RESOURCE_ID_MAPPING_429_, PARTICLE_RESOURCE_ID_MAPPING_429_}, + {PARTICLE_RESOURCE_ID_MAPPING_416_, PARTICLE_RESOURCE_ID_MAPPING_417_}, + {PARTICLE_RESOURCE_ID_MAPPING_418_, PARTICLE_RESOURCE_ID_MAPPING_419_}, + {PARTICLE_RESOURCE_ID_MAPPING_893_, PARTICLE_RESOURCE_ID_MAPPING_894_}, + }; + + if (pos.y < groundHeightMaybe) { + return nullptr; + } + + s32 idx = polyAttrsToGroundEffectIdx(polyAttr0, polyAttr1); + if (idx == 6) { + return nullptr; + } + if (idx == 2 && unk == 0) { + scale *= 1.5f; + } + mMtx_c mtx; + mtx.makeRotationFromVecs(mVec3_c::Ey, v1, 1.0f); + mAng rot(cM::rndF(65536.0f)); + mtx.YrotM(rot); + mtx.m[0][3] = pos.x; + mtx.m[1][3] = pos.y; + mtx.m[2][3] = pos.z; + mMtx_c scaleMtx; + MTXScale(scaleMtx, scale, scale, scale); + MTXConcat(mtx, scaleMtx, mtx); + u16 eff = sEffArray[idx][unk]; + return spawnEffect(eff, mtx, nullptr, nullptr, polyAttr0, polyAttr1); +} + +void dWaterEffect_c::init(dAcObjBase_c *base, f32 height, f32 scale, f32 f3) { + mEff.init(base); + mHeight = height; + mScale = scale; + mDepth = f3; +} + +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_91_; +extern "C" const u16 PARTICLE_RESOURCE_ID_MAPPING_127_; +void dWaterEffect_c::execute(f32 water, f32 ground) { + dAcObjBase_c *ac = getActor(); + bool b = getActorGroundPos(ac) < water && ground < water; + if (b) { + if (!mIsInWater) { + mIsInWater = true; + mVec3_c pos(ac->position.x, water, ac->position.z); + mVec3_c scale(mScale, mScale, mScale); + if (mIsSmall || water - ground < 50.0f) { + // For small objects or shallow water, create a + // particle FX upon entering water + mAng3_c rot(0, cM::rndF(65536.0f), 0); + dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_91_, pos, &rot, &scale, nullptr, nullptr, 0, 0 + ); + } else { + // Otherwise spawn a "water spout" with a 3d model + dAcObjBase_c::create(fProfile::OBJ_WATER_SPOUT, -1, 0, &pos, nullptr, &scale, -1); + } + } + } else if (getActorGroundPos(ac) - 5.0f > water) { + mIsInWater = false; + } + + if (mIsInWater && getActorCeilPos(ac) > water) { + // Spawn effect while in water + mVec3_c pos(ac->position.x, water, ac->position.z); + mVec3_c scale(mScale, mScale, mScale); + mEff.createContinuousEffect(PARTICLE_RESOURCE_ID_MAPPING_127_, pos, nullptr, &scale, nullptr, nullptr); + f32 rate = nw4r::math::FAbs(ac->forwardSpeed) * 0.02f; + rate = rate > 0.95f ? 0.95f : rate; + mEff.setRate(rate + 0.05f); + } +} diff --git a/src/toBeSorted/d_unk_mdl_stuff_2.cpp b/src/toBeSorted/d_unk_mdl_stuff_2.cpp new file mode 100644 index 00000000..25a8d887 --- /dev/null +++ b/src/toBeSorted/d_unk_mdl_stuff_2.cpp @@ -0,0 +1,149 @@ + +#include "toBeSorted/d_unk_mdl_stuff_2.h" + +#include "common.h" +#include "d/col/bg/d_bg_s.h" +#include "egg/gfx/eggLightManager.h" +#include "m/m3d/m3d.h" +#include "m/m3d/m_proc.h" +#include "m/m_mtx.h" +#include "nw4r/g3d/g3d_draw1mat1shp.h" +#include "nw4r/g3d/g3d_scnobj.h" +#include "nw4r/g3d/g3d_state.h" +#include "nw4r/g3d/res/g3d_resmat.h" +#include "nw4r/g3d/res/g3d_resshp.h" +#include "nw4r/math/math_types.h" +#include "rvl/GX/GXLight.h" +#include "rvl/GX/GXTev.h" +#include "rvl/GX/GXTypes.h" +#include "rvl/MTX/mtx.h" +#include "toBeSorted/blur_and_palette_manager.h" + +bool dShpProcBase_c::init(nw4r::g3d::ResMat mat, nw4r::g3d::ResShp shp, s32 count, bool xlu, u32 *pSize) { + mCount = count; + mpFlags = new bool[count]; + if (mpFlags == nullptr) { + return false; + } + + if (pSize != nullptr) { + *pSize += count * sizeof(bool); + } + for (s32 i = 0; i < mCount; i++) { + mpFlags[i] = 0; + } + mMat = mat; + mShp = shp; + if (xlu) { + setOption(nw4r::g3d::ScnObj::OPTION_DISABLE_DRAW_OPA, true); + } else { + setOption(nw4r::g3d::ScnObj::OPTION_DISABLE_DRAW_XLU, true); + } + return true; +} + +void dShpProcBase_c::setupLight() { + u32 pDiffColorMask; + u32 pDiffAlphaMask; + u32 pSpecColorMask; + u32 pSpecAlphaMask; + GXColor pColor; + m3d::getLightMgr(0)->LoadLightSet( + mLightSetId, &pDiffColorMask, &pDiffAlphaMask, &pSpecColorMask, &pSpecAlphaMask, &pColor + ); + GXSetChanCtrl(GX_COLOR0, GX_TRUE, GX_SRC_REG, GX_SRC_REG, (GXLightID)pDiffColorMask, GX_DF_CLAMP, GX_AF_SPOT); + GXSetChanCtrl(GX_ALPHA0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE); + GXSetChanAmbColor(GX_COLOR0, pColor); +} + +void dShpProcBase_c::draw(mVec3_c *pos) { + nw4r::g3d::Draw1Mat1ShpDirectly( + mMat, nw4r::g3d::ResShp(nullptr), mMtx_c::Identity, mMtx_c::Identity, 0, nullptr, nullptr + ); + setupLight(); + if (!field_0x2C) { + BlurAndPaletteManager &mgr = BlurAndPaletteManager::GetInstance(); + u32 code = 0xFF; + if (pos != nullptr) { + pos->y += 100.0f; + code = dBgS::GetInstance()->GetLightingCode(pos); + } + if (code != 0) { + GXSetTevColor(GX_TEVREG0, BlurAndPaletteManager::getLightColor1()); + GXSetTevKColor(GX_KCOLOR0, BlurAndPaletteManager::getLightColor2()); + } else { + GXSetTevColor(GX_TEVREG0, mgr.GetCurrentSph().white2_ffffff); + GXSetTevKColor(GX_KCOLOR0, mgr.GetCurrentSph().grey2_aaaaaa); + } + } +} + +void dShpProcBase_c::setResMat(nw4r::g3d::ResMat mat) { + mMat = mat; +} + +void dShpProcBase_c::setAllFlags() { + for (s32 idx = 0; idx < mCount; idx++) { + mpFlags[idx] = 1; + } +} + +void dShpProcBase_c::doEntry(s32 lightSetId) { + mLightSetId = lightSetId; + entry(); +} + + +bool dShpProc1_c::create(nw4r::g3d::ResMat mat, nw4r::g3d::ResShp shp, s32 count, mHeapAllocator_c *alloc, bool xlu, u32 *pSize) { + if (!m3d::proc_c::create(alloc, pSize)) { + return false; + } + if (!init(mat, shp, count, xlu, pSize)) { + return false; + } + mpTransforms = new mMtx_c[count]; + if (mpTransforms == nullptr) { + return false; + } + if (pSize != nullptr) { + *pSize += count * sizeof(mMtx_c); + } + for (s32 idx = 0; idx < count; idx++) { + MTXIdentity(mpTransforms[idx]); + } + return true; +} + +void dShpProc1_c::draw() { + mMtx_c viewMtx; + getViewMtx(viewMtx); + s32 ctrl = 0; + mMtx_c *pTransforms = mpTransforms; + bool *pFlags = mpFlags; + dShpProcBase_c::draw(nullptr); + for (s32 idx = 0; idx < mCount;) { + if (*pFlags == false) { + mMtx_c mtx; + mtx.copyFrom(*pTransforms); + MTXConcat(viewMtx, mtx, mtx); + mMtx_c mtx2; + // Regswaps that can be fixed with a copy inline that uses array indexing... + mtx2.copyFrom(mtx); + mtx2.fn_802F1C40(0, 1); + nw4r::math::MTX33 mtx3; + for (int a = 0; a < 3; a++) { + for (int b = 0; b < 3; b++) { + mtx3.m[a][b] = mtx2.m[a][b]; + } + } + nw4r::g3d::G3DState::SetViewPosNrmMtxArray(mtx, &mtx3, nullptr); + nw4r::g3d::Draw1Mat1ShpDirectly(nw4r::g3d::ResMat(nullptr), mShp, mtx, mtx2, ctrl, nullptr, nullptr); + if (ctrl == 0) { + ctrl = 2; + } + } + idx++; + pTransforms++; + pFlags++; + } +}