From f4e2b9cc467e4c34787503d5a2c0a0ce639e1a43 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 21 Dec 2025 16:30:36 +0100 Subject: [PATCH] d_lyt_force_line OK --- config/SOUE01/splits.txt | 2 + config/SOUE01/symbols.txt | 318 ++++++++++++++++-------------- configure.py | 2 +- include/d/lyt/d_lyt_force_line.h | 88 +++++++++ include/d/lyt/meter/d_lyt_meter.h | 8 + include/egg/math/eggVector.h | 6 +- src/d/lyt/d_lyt_force_line.cpp | 305 ++++++++++++++++++++++++++++ 7 files changed, 574 insertions(+), 155 deletions(-) create mode 100644 include/d/lyt/d_lyt_force_line.h create mode 100644 src/d/lyt/d_lyt_force_line.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index aaf32c1b..e042e143 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1605,8 +1605,10 @@ d/lyt/d_lyt_drop_line.cpp: d/lyt/d_lyt_force_line.cpp: .text start:0x80288500 end:0x8028A9F8 align:16 .ctors start:0x804DB86C end:0x804DB870 + .rodata start:0x804EE790 end:0x804EE7D8 .data start:0x80538658 end:0x80538CE8 .sbss start:0x80575960 end:0x80575968 + .sdata2 start:0x8057C6C8 end:0x8057C6E0 .bss start:0x805B60C0 end:0x805B6160 d/lyt/d_lyt_enemy_icon.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 0e9069bf..b7bb0d9d 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -15123,63 +15123,63 @@ fn_80288200 = .text:0x80288200; // type:function size:0x30 LytDropLineParts__initStates = .text:0x80288230; // type:function size:0x1DC LytDropLineParts__dtor = .text:0x80288410; // type:function size:0x58 fn_80288470 = .text:0x80288470; // type:function size:0x88 -fn_80288500 = .text:0x80288500; // type:function size:0x14 -fn_80288520 = .text:0x80288520; // type:function size:0x28 -fn_80288550 = .text:0x80288550; // type:function size:0x40 -fn_80288590 = .text:0x80288590; // type:function size:0x28 -fn_802885C0 = .text:0x802885C0; // type:function size:0x8 -fn_802885D0 = .text:0x802885D0; // type:function size:0x30 -fn_80288600 = .text:0x80288600; // type:function size:0x10 -fn_80288610 = .text:0x80288610; // type:function size:0x8 -fn_80288620 = .text:0x80288620; // type:function size:0x88 -fn_802886B0 = .text:0x802886B0; // type:function size:0x5C -fn_80288710 = .text:0x80288710; // type:function size:0x10 -LytForceLineParts__stateWaitEnter = .text:0x80288720; // type:function size:0x4 -LytForceLineParts__stateWaitUpdate = .text:0x80288730; // type:function size:0x28 -LytForceLineParts__stateWaitLeave = .text:0x80288760; // type:function size:0x4 -LytForceLineParts__stateMoveEnter = .text:0x80288770; // type:function size:0xA4 -LytForceLineParts__stateMoveUpdate = .text:0x80288820; // type:function size:0x28C -LytForceLineParts__stateMoveLeave = .text:0x80288AB0; // type:function size:0x4 -fn_80288AC0 = .text:0x80288AC0; // type:function size:0x90 -fn_80288B50 = .text:0x80288B50; // type:function size:0x94 -fn_80288BF0 = .text:0x80288BF0; // type:function size:0x58 -fn_80288C50 = .text:0x80288C50; // type:function size:0x6C -fn_80288CC0 = .text:0x80288CC0; // type:function size:0xA0 -fn_80288D60 = .text:0x80288D60; // type:function size:0xA4 -fn_80288E10 = .text:0x80288E10; // type:function size:0xB8 -fn_80288ED0 = .text:0x80288ED0; // type:function size:0x30 -fn_80288F00 = .text:0x80288F00; // type:function size:0x30 -fn_80288F30 = .text:0x80288F30; // type:function size:0x30 -fn_80288F60 = .text:0x80288F60; // type:function size:0x30 -fn_80288F90 = .text:0x80288F90; // type:function size:0x5C -fn_80288FF0 = .text:0x80288FF0; // type:function size:0x20 -fn_80289010 = .text:0x80289010; // type:function size:0x24 -fn_80289040 = .text:0x80289040; // type:function size:0x68 -fn_802890B0 = .text:0x802890B0; // type:function size:0x50 -fn_80289100 = .text:0x80289100; // type:function size:0x50 -fn_80289150 = .text:0x80289150; // type:function size:0x50 -fn_802891A0 = .text:0x802891A0; // type:function size:0xEC -fn_80289290 = .text:0x80289290; // type:function size:0x10 -fn_802892A0 = .text:0x802892A0; // type:function size:0x1220 -fn_8028A4C0 = .text:0x8028A4C0; // type:function size:0x9C -fn_8028A560 = .text:0x8028A560; // type:function size:0x60 -fn_8028A5C0 = .text:0x8028A5C0; // type:function size:0xC -fn_8028A5D0 = .text:0x8028A5D0; // type:function size:0x1C -fn_8028A5F0 = .text:0x8028A5F0; // type:function size:0x1C -fn_8028A610 = .text:0x8028A610; // type:function size:0x1C -fn_8028A630 = .text:0x8028A630; // type:function size:0x10 -fn_8028A640 = .text:0x8028A640; // type:function size:0x10 -fn_8028A650 = .text:0x8028A650; // type:function size:0x10 -fn_8028A660 = .text:0x8028A660; // type:function size:0x10 -fn_8028A670 = .text:0x8028A670; // type:function size:0x10 -fn_8028A680 = .text:0x8028A680; // type:function size:0x10 -fn_8028A690 = .text:0x8028A690; // type:function size:0x10 -fn_8028A6A0 = .text:0x8028A6A0; // type:function size:0x30 -fn_8028A6D0 = .text:0x8028A6D0; // type:function size:0x30 -fn_8028A700 = .text:0x8028A700; // type:function size:0x30 -LytForceLineParts__initStates = .text:0x8028A730; // type:function size:0x1DC -LytForceLineParts__dtor = .text:0x8028A910; // type:function size:0x58 -fn_8028A970 = .text:0x8028A970; // type:function size:0x88 +getNumTadtonesInGroup__Fl = .text:0x80288500; // type:function size:0x14 scope:local +__ct__19dLytForceLine_HIO_cFv = .text:0x80288520; // type:function size:0x28 +__dt__19dLytForceLine_HIO_cFv = .text:0x80288550; // type:function size:0x40 +create__20dLytForceLineParts_cFP15dLytForceLine_c = .text:0x80288590; // type:function size:0x28 +doDelete__20dLytForceLineParts_cFv = .text:0x802885C0; // type:function size:0x8 +execute__20dLytForceLineParts_cFv = .text:0x802885D0; // type:function size:0x30 +executeState__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80288600; // type:function size:0x10 scope:weak +draw__20dLytForceLineParts_cFv = .text:0x80288610; // type:function size:0x8 +start__20dLytForceLineParts_cF7mVec3_c7mVec2_cl = .text:0x80288620; // type:function size:0x88 +reset__20dLytForceLineParts_cFv = .text:0x802886B0; // type:function size:0x5C +changeState__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80288710; // type:function size:0x10 scope:weak +initializeState_Wait__20dLytForceLineParts_cFv = .text:0x80288720; // type:function size:0x4 +executeState_Wait__20dLytForceLineParts_cFv = .text:0x80288730; // type:function size:0x28 +finalizeState_Wait__20dLytForceLineParts_cFv = .text:0x80288760; // type:function size:0x4 +initializeState_Move__20dLytForceLineParts_cFv = .text:0x80288770; // type:function size:0xA4 +executeState_Move__20dLytForceLineParts_cFv = .text:0x80288820; // type:function size:0x28C +finalizeState_Move__20dLytForceLineParts_cFv = .text:0x80288AB0; // type:function size:0x4 +dLytForceLine_c_classInit__Fv = .text:0x80288AC0; // type:function size:0x90 +__ct__20dLytForceLineParts_cFv = .text:0x80288B50; // type:function size:0x94 scope:weak +__dt__33sFState_c<20dLytForceLineParts_c>Fv = .text:0x80288BF0; // type:function size:0x58 scope:weak +__dt__36sFStateFct_c<20dLytForceLineParts_c>Fv = .text:0x80288C50; // type:function size:0x6C scope:weak +__dt__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80288CC0; // type:function size:0xA0 scope:weak +__dt__59sFStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c>Fv = .text:0x80288D60; // type:function size:0xA4 scope:weak +__dt__20dLytForceLineParts_cFv = .text:0x80288E10; // type:function size:0xB8 scope:weak +create__15dLytForceLine_cFv = .text:0x80288ED0; // type:function size:0x30 +doDelete__15dLytForceLine_cFv = .text:0x80288F00; // type:function size:0x30 +execute__15dLytForceLine_cFv = .text:0x80288F30; // type:function size:0x30 +draw__15dLytForceLine_cFv = .text:0x80288F60; // type:function size:0x30 +start__15dLytForceLine_cF7mVec3_clll = .text:0x80288F90; // type:function size:0x5C +isDone__15dLytForceLine_cFl = .text:0x80288FF0; // type:function size:0x20 +initPos__15dLytForceLine_cFPQ23d2d9LytBase_cPQ23d2d10AnmGroup_c = .text:0x80289010; // type:function size:0x24 +createInternal__15dLytForceLine_cFv = .text:0x80289040; // type:function size:0x68 +doDeleteInternal__15dLytForceLine_cFv = .text:0x802890B0; // type:function size:0x50 +executeInternal__15dLytForceLine_cFv = .text:0x80289100; // type:function size:0x50 +drawInternal__15dLytForceLine_cFv = .text:0x80289150; // type:function size:0x50 +startInternal__15dLytForceLine_cF7mVec3_clll = .text:0x802891A0; // type:function size:0xEC +isDoneInternal__15dLytForceLine_cFl = .text:0x80289290; // type:function size:0x10 +initPosInternal__15dLytForceLine_cFPQ23d2d9LytBase_cPQ23d2d10AnmGroup_c = .text:0x802892A0; // type:function size:0x1220 +__dt__15dLytForceLine_cFv = .text:0x8028A4C0; // type:function size:0x9C scope:weak +build__36sFStateFct_c<20dLytForceLineParts_c>FRC12sStateIDIf_c = .text:0x8028A560; // type:function size:0x60 scope:weak +dispose__36sFStateFct_c<20dLytForceLineParts_c>FRP10sStateIf_c = .text:0x8028A5C0; // type:function size:0xC scope:weak +initialize__33sFState_c<20dLytForceLineParts_c>Fv = .text:0x8028A5D0; // type:function size:0x1C scope:weak +execute__33sFState_c<20dLytForceLineParts_c>Fv = .text:0x8028A5F0; // type:function size:0x1C scope:weak +finalize__33sFState_c<20dLytForceLineParts_c>Fv = .text:0x8028A610; // type:function size:0x1C scope:weak +initializeState__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8028A630; // type:function size:0x10 scope:weak +finalizeState__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8028A640; // type:function size:0x10 scope:weak +refreshState__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8028A650; // type:function size:0x10 scope:weak +getState__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8028A660; // type:function size:0x10 scope:weak +getNewStateID__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8028A670; // type:function size:0x10 scope:weak +getStateID__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8028A680; // type:function size:0x10 scope:weak +getOldStateID__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8028A690; // type:function size:0x10 scope:weak +finalizeState__35sFStateID_c<20dLytForceLineParts_c>CFR20dLytForceLineParts_c = .text:0x8028A6A0; // type:function size:0x30 scope:weak +executeState__35sFStateID_c<20dLytForceLineParts_c>CFR20dLytForceLineParts_c = .text:0x8028A6D0; // type:function size:0x30 scope:weak +initializeState__35sFStateID_c<20dLytForceLineParts_c>CFR20dLytForceLineParts_c = .text:0x8028A700; // type:function size:0x30 scope:weak +__sinit_\d_lyt_force_line_cpp = .text:0x8028A730; // type:function size:0x1DC scope:local +__dt__35sFStateID_c<20dLytForceLineParts_c>Fv = .text:0x8028A910; // type:function size:0x58 scope:weak +isSameName__35sFStateID_c<20dLytForceLineParts_c>CFPCc = .text:0x8028A970; // type:function size:0x88 scope:weak fn_8028AA00 = .text:0x8028AA00; // type:function size:0x28 fn_8028AA30 = .text:0x8028AA30; // type:function size:0x40 fn_8028AA70 = .text:0x8028AA70; // type:function size:0xF0 @@ -28656,7 +28656,7 @@ lbl_804EE700 = .rodata:0x804EE700; // type:object size:0x28 data:4byte lbl_804EE728 = .rodata:0x804EE728; // type:object size:0x28 lbl_804EE750 = .rodata:0x804EE750; // type:object size:0x28 @LOCAL@executeState_FadeOut__13dLytSaveMgr_cFv@sFadeOutModes@0 = .rodata:0x804EE778; // type:object size:0x18 scope:local -lbl_804EE790 = .rodata:0x804EE790; // type:object size:0x48 +@LOCAL@getNumTadtonesInGroup__Fl@nums = .rodata:0x804EE790; // type:object size:0x44 scope:local lbl_804EE7D8 = .rodata:0x804EE7D8; // type:object size:0x18 data:4byte lbl_804EE7F0 = .rodata:0x804EE7F0; // type:object size:0x150 data:4byte lbl_804EE940 = .rodata:0x804EE940; // type:object size:0x30 @@ -36660,91 +36660,100 @@ lbl_80538560 = .data:0x80538560; // type:object size:0x18 lbl_80538578 = .data:0x80538578; // type:object size:0xA8 lbl_80538620 = .data:0x80538620; // type:object size:0x38 g_profile_LYT_FORCE_LINE = .data:0x80538658; // type:object size:0xC -lbl_80538664 = .data:0x80538664; // type:object size:0xC data:string -lbl_80538670 = .data:0x80538670; // type:object size:0xC data:string -lbl_8053867C = .data:0x8053867C; // type:object size:0xC data:string -lbl_80538688 = .data:0x80538688; // type:object size:0xC data:string -lbl_80538694 = .data:0x80538694; // type:object size:0xC data:string -lbl_805386A0 = .data:0x805386A0; // type:object size:0xC data:string -lbl_805386AC = .data:0x805386AC; // type:object size:0xC data:string -lbl_805386B8 = .data:0x805386B8; // type:object size:0xC data:string -lbl_805386C4 = .data:0x805386C4; // type:object size:0xC data:string -lbl_805386D0 = .data:0x805386D0; // type:object size:0xC data:string -lbl_805386DC = .data:0x805386DC; // type:object size:0xC data:string -lbl_805386E8 = .data:0x805386E8; // type:object size:0xC data:string -lbl_805386F4 = .data:0x805386F4; // type:object size:0xC data:string -lbl_80538700 = .data:0x80538700; // type:object size:0xC data:string -lbl_8053870C = .data:0x8053870C; // type:object size:0xC data:string -lbl_80538718 = .data:0x80538718; // type:object size:0xC data:string -lbl_80538724 = .data:0x80538724; // type:object size:0xC data:string -lbl_80538730 = .data:0x80538730; // type:object size:0xC data:string -lbl_8053873C = .data:0x8053873C; // type:object size:0xC data:string -lbl_80538748 = .data:0x80538748; // type:object size:0xC data:string -lbl_80538754 = .data:0x80538754; // type:object size:0xC data:string -lbl_80538760 = .data:0x80538760; // type:object size:0xC data:string -lbl_8053876C = .data:0x8053876C; // type:object size:0xC data:string -lbl_80538778 = .data:0x80538778; // type:object size:0xC data:string -lbl_80538784 = .data:0x80538784; // type:object size:0xC data:string -lbl_80538790 = .data:0x80538790; // type:object size:0xC data:string -lbl_8053879C = .data:0x8053879C; // type:object size:0xC data:string -lbl_805387A8 = .data:0x805387A8; // type:object size:0xC data:string -lbl_805387B4 = .data:0x805387B4; // type:object size:0xC data:string -lbl_805387C0 = .data:0x805387C0; // type:object size:0xC data:string -lbl_805387CC = .data:0x805387CC; // type:object size:0xC data:string -lbl_805387D8 = .data:0x805387D8; // type:object size:0xC data:string -lbl_805387E4 = .data:0x805387E4; // type:object size:0xC data:string -lbl_805387F0 = .data:0x805387F0; // type:object size:0xC data:string -lbl_805387FC = .data:0x805387FC; // type:object size:0xC data:string -lbl_80538808 = .data:0x80538808; // type:object size:0xC data:string -lbl_80538814 = .data:0x80538814; // type:object size:0xC data:string -lbl_80538820 = .data:0x80538820; // type:object size:0xC data:string -lbl_8053882C = .data:0x8053882C; // type:object size:0xC data:string -lbl_80538838 = .data:0x80538838; // type:object size:0xC data:string -lbl_80538844 = .data:0x80538844; // type:object size:0xC data:string -lbl_80538850 = .data:0x80538850; // type:object size:0xC data:string -lbl_8053885C = .data:0x8053885C; // type:object size:0xC data:string -lbl_80538868 = .data:0x80538868; // type:object size:0xC data:string -lbl_80538874 = .data:0x80538874; // type:object size:0xC data:string -lbl_80538880 = .data:0x80538880; // type:object size:0xC data:string -lbl_8053888C = .data:0x8053888C; // type:object size:0xC data:string -lbl_80538898 = .data:0x80538898; // type:object size:0xC data:string -lbl_805388A4 = .data:0x805388A4; // type:object size:0xC data:string -lbl_805388B0 = .data:0x805388B0; // type:object size:0xC data:string -lbl_805388BC = .data:0x805388BC; // type:object size:0xC data:string -lbl_805388C8 = .data:0x805388C8; // type:object size:0xC data:string -lbl_805388D4 = .data:0x805388D4; // type:object size:0xC data:string -lbl_805388E0 = .data:0x805388E0; // type:object size:0xC data:string -lbl_805388EC = .data:0x805388EC; // type:object size:0xC data:string -lbl_805388F8 = .data:0x805388F8; // type:object size:0xC data:string -lbl_80538904 = .data:0x80538904; // type:object size:0xC data:string -lbl_80538910 = .data:0x80538910; // type:object size:0xC data:string -lbl_8053891C = .data:0x8053891C; // type:object size:0xC data:string -lbl_80538928 = .data:0x80538928; // type:object size:0xC data:string -lbl_80538934 = .data:0x80538934; // type:object size:0xC data:string -lbl_80538940 = .data:0x80538940; // type:object size:0xC data:string -lbl_8053894C = .data:0x8053894C; // type:object size:0xC data:string -lbl_80538958 = .data:0x80538958; // type:object size:0xC data:string -lbl_80538964 = .data:0x80538964; // type:object size:0xC data:string -lbl_80538970 = .data:0x80538970; // type:object size:0xC data:string -lbl_8053897C = .data:0x8053897C; // type:object size:0xC data:string -lbl_80538988 = .data:0x80538988; // type:object size:0xC data:string -lbl_80538994 = .data:0x80538994; // type:object size:0xC data:string -lbl_805389A0 = .data:0x805389A0; // type:object size:0xC data:string -lbl_805389AC = .data:0x805389AC; // type:object size:0xC data:string -lbl_805389B8 = .data:0x805389B8; // type:object size:0xC data:string -lbl_805389C4 = .data:0x805389C4; // type:object size:0xC data:string -lbl_805389D0 = .data:0x805389D0; // type:object size:0xC data:string -lbl_805389DC = .data:0x805389DC; // type:object size:0xC data:string -lbl_805389E8 = .data:0x805389E8; // type:object size:0xC data:string -lbl_805389F4 = .data:0x805389F4; // type:object size:0xC data:string -lbl_80538A00 = .data:0x80538A00; // type:object size:0x134 data:4byte -lbl_80538B34 = .data:0x80538B34; // type:object size:0xC -lbl_80538B40 = .data:0x80538B40; // type:object size:0x50 -lbl_80538B90 = .data:0x80538B90; // type:object size:0x30 -lbl_80538BC0 = .data:0x80538BC0; // type:object size:0x30 -lbl_80538BF0 = .data:0x80538BF0; // type:object size:0x18 -lbl_80538C08 = .data:0x80538C08; // type:object size:0xA8 -lbl_80538CB0 = .data:0x80538CB0; // type:object size:0x38 +...data.0 = .data:0x80538658; // type:label scope:local +@23145 = .data:0x80538664; // type:object size:0xC scope:local data:string +@23146 = .data:0x80538670; // type:object size:0xC scope:local data:string +@23147 = .data:0x8053867C; // type:object size:0xC scope:local data:string +@23148 = .data:0x80538688; // type:object size:0xC scope:local data:string +@23149 = .data:0x80538694; // type:object size:0xC scope:local data:string +@23150 = .data:0x805386A0; // type:object size:0xC scope:local data:string +@23151 = .data:0x805386AC; // type:object size:0xC scope:local data:string +@23152 = .data:0x805386B8; // type:object size:0xC scope:local data:string +@23153 = .data:0x805386C4; // type:object size:0xC scope:local data:string +@23154 = .data:0x805386D0; // type:object size:0xC scope:local data:string +@23155 = .data:0x805386DC; // type:object size:0xC scope:local data:string +@23156 = .data:0x805386E8; // type:object size:0xC scope:local data:string +@23157 = .data:0x805386F4; // type:object size:0xC scope:local data:string +@23158 = .data:0x80538700; // type:object size:0xC scope:local data:string +@23159 = .data:0x8053870C; // type:object size:0xC scope:local data:string +@23160 = .data:0x80538718; // type:object size:0xC scope:local data:string +@23161 = .data:0x80538724; // type:object size:0xC scope:local data:string +@23162 = .data:0x80538730; // type:object size:0xC scope:local data:string +@23163 = .data:0x8053873C; // type:object size:0xC scope:local data:string +@23164 = .data:0x80538748; // type:object size:0xC scope:local data:string +@23165 = .data:0x80538754; // type:object size:0xC scope:local data:string +@23166 = .data:0x80538760; // type:object size:0xC scope:local data:string +@23167 = .data:0x8053876C; // type:object size:0xC scope:local data:string +@23168 = .data:0x80538778; // type:object size:0xC scope:local data:string +@23169 = .data:0x80538784; // type:object size:0xC scope:local data:string +@23170 = .data:0x80538790; // type:object size:0xC scope:local data:string +@23171 = .data:0x8053879C; // type:object size:0xC scope:local data:string +@23172 = .data:0x805387A8; // type:object size:0xC scope:local data:string +@23173 = .data:0x805387B4; // type:object size:0xC scope:local data:string +@23174 = .data:0x805387C0; // type:object size:0xC scope:local data:string +@23175 = .data:0x805387CC; // type:object size:0xC scope:local data:string +@23176 = .data:0x805387D8; // type:object size:0xC scope:local data:string +@23177 = .data:0x805387E4; // type:object size:0xC scope:local data:string +@23178 = .data:0x805387F0; // type:object size:0xC scope:local data:string +@23179 = .data:0x805387FC; // type:object size:0xC scope:local data:string +@23180 = .data:0x80538808; // type:object size:0xC scope:local data:string +@23181 = .data:0x80538814; // type:object size:0xC scope:local data:string +@23182 = .data:0x80538820; // type:object size:0xC scope:local data:string +@23183 = .data:0x8053882C; // type:object size:0xC scope:local data:string +@23184 = .data:0x80538838; // type:object size:0xC scope:local data:string +@23185 = .data:0x80538844; // type:object size:0xC scope:local data:string +@23186 = .data:0x80538850; // type:object size:0xC scope:local data:string +@23187 = .data:0x8053885C; // type:object size:0xC scope:local data:string +@23188 = .data:0x80538868; // type:object size:0xC scope:local data:string +@23189 = .data:0x80538874; // type:object size:0xC scope:local data:string +@23190 = .data:0x80538880; // type:object size:0xC scope:local data:string +@23191 = .data:0x8053888C; // type:object size:0xC scope:local data:string +@23192 = .data:0x80538898; // type:object size:0xC scope:local data:string +@23193 = .data:0x805388A4; // type:object size:0xC scope:local data:string +@23194 = .data:0x805388B0; // type:object size:0xC scope:local data:string +@23195 = .data:0x805388BC; // type:object size:0xC scope:local data:string +@23196 = .data:0x805388C8; // type:object size:0xC scope:local data:string +@23197 = .data:0x805388D4; // type:object size:0xC scope:local data:string +@23198 = .data:0x805388E0; // type:object size:0xC scope:local data:string +@23199 = .data:0x805388EC; // type:object size:0xC scope:local data:string +@23200 = .data:0x805388F8; // type:object size:0xC scope:local data:string +@23201 = .data:0x80538904; // type:object size:0xC scope:local data:string +@23202 = .data:0x80538910; // type:object size:0xC scope:local data:string +@23203 = .data:0x8053891C; // type:object size:0xC scope:local data:string +@23204 = .data:0x80538928; // type:object size:0xC scope:local data:string +@23205 = .data:0x80538934; // type:object size:0xC scope:local data:string +@23206 = .data:0x80538940; // type:object size:0xC scope:local data:string +@23207 = .data:0x8053894C; // type:object size:0xC scope:local data:string +@23208 = .data:0x80538958; // type:object size:0xC scope:local data:string +@23209 = .data:0x80538964; // type:object size:0xC scope:local data:string +@23210 = .data:0x80538970; // type:object size:0xC scope:local data:string +@23211 = .data:0x8053897C; // type:object size:0xC scope:local data:string +@23212 = .data:0x80538988; // type:object size:0xC scope:local data:string +@23213 = .data:0x80538994; // type:object size:0xC scope:local data:string +@23214 = .data:0x805389A0; // type:object size:0xC scope:local data:string +@23215 = .data:0x805389AC; // type:object size:0xC scope:local data:string +@23216 = .data:0x805389B8; // type:object size:0xC scope:local data:string +@23217 = .data:0x805389C4; // type:object size:0xC scope:local data:string +@23218 = .data:0x805389D0; // type:object size:0xC scope:local data:string +@23219 = .data:0x805389DC; // type:object size:0xC scope:local data:string +@23220 = .data:0x805389E8; // type:object size:0xC scope:local data:string +@23221 = .data:0x805389F4; // type:object size:0xC scope:local data:string +sPaneNames = .data:0x80538A00; // type:object size:0x134 scope:local data:4byte +__vt__19dLytForceLine_HIO_c = .data:0x80538B34; // type:object size:0xC +__vt__15dLytForceLine_c = .data:0x80538B40; // type:object size:0x4C +__vt__59sFStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c> = .data:0x80538B90; // type:object size:0x30 scope:weak +__vt__89sStateMgr_c<20dLytForceLineParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80538BC0; // type:object size:0x30 scope:weak +__vt__36sFStateFct_c<20dLytForceLineParts_c> = .data:0x80538BF0; // type:object size:0x14 scope:weak +__vt__33sFState_c<20dLytForceLineParts_c> = .data:0x80538C08; // type:object size:0x18 scope:weak +@27314 = .data:0x80538C20; // type:object size:0xC scope:local +@27315 = .data:0x80538C2C; // type:object size:0xC scope:local +@27316 = .data:0x80538C38; // type:object size:0xC scope:local +@27317 = .data:0x80538C44; // type:object size:0xC scope:local +@27318 = .data:0x80538C50; // type:object size:0xC scope:local +@27319 = .data:0x80538C5C; // type:object size:0xC scope:local +@27321 = .data:0x80538C68; // type:object size:0x23 scope:local data:string +@27322 = .data:0x80538C8C; // type:object size:0x23 scope:local data:string +__vt__35sFStateID_c<20dLytForceLineParts_c> = .data:0x80538CB0; // type:object size:0x34 scope:weak g_profile_LYT_ENEMY_ICON = .data:0x80538CE8; // type:object size:0xC lbl_80538CF4 = .data:0x80538CF4; // type:object size:0xC lbl_80538D00 = .data:0x80538D00; // type:object size:0x50 @@ -42445,7 +42454,7 @@ sInstance__13dLytSaveMgr_c = .sbss:0x80575950; // type:object size:0x4 data:4byt lbl_80575958 = .sbss:0x80575958; // type:object size:0x1 data:byte lbl_80575959 = .sbss:0x80575959; // type:object size:0x1 data:byte lbl_8057595C = .sbss:0x8057595C; // type:object size:0x4 data:4byte -lbl_80575960 = .sbss:0x80575960; // type:object size:0x8 data:4byte +sInstance__15dLytForceLine_c = .sbss:0x80575960; // type:object size:0x4 data:4byte lbl_80575968 = .sbss:0x80575968; // type:object size:0x8 data:4byte sInstance__21dLytMiniGamePumpkin_c = .sbss:0x80575970; // type:object size:0x4 data:4byte sInstance__18dLytMiniGameBugs_c = .sbss:0x80575974; // type:object size:0x4 data:4byte @@ -48380,11 +48389,11 @@ lbl_8057C6B0 = .sdata2:0x8057C6B0; // type:object size:0x4 align:4 data:float lbl_8057C6B4 = .sdata2:0x8057C6B4; // type:object size:0x4 align:4 data:float lbl_8057C6B8 = .sdata2:0x8057C6B8; // type:object size:0x8 align:8 data:double lbl_8057C6C0 = .sdata2:0x8057C6C0; // type:object size:0x4 align:4 data:float -lbl_8057C6C8 = .sdata2:0x8057C6C8; // type:object size:0x4 align:4 data:float -lbl_8057C6CC = .sdata2:0x8057C6CC; // type:object size:0x4 align:4 data:float -lbl_8057C6D0 = .sdata2:0x8057C6D0; // type:object size:0x8 align:8 data:double -lbl_8057C6D8 = .sdata2:0x8057C6D8; // type:object size:0x4 align:4 data:float -lbl_8057C6DC = .sdata2:0x8057C6DC; // type:object size:0x4 align:4 data:float +@26620 = .sdata2:0x8057C6C8; // type:object size:0x4 scope:local align:4 data:float +@26639 = .sdata2:0x8057C6CC; // type:object size:0x4 scope:local align:4 data:float +@26659 = .sdata2:0x8057C6D0; // type:object size:0x8 scope:local align:8 data:double +@27158 = .sdata2:0x8057C6D8; // type:object size:0x4 scope:local align:4 data:float +@27159 = .sdata2:0x8057C6DC; // type:object size:0x4 scope:local align:4 data:float lbl_8057C6E0 = .sdata2:0x8057C6E0; // type:object size:0x4 align:4 data:float lbl_8057C6E4 = .sdata2:0x8057C6E4; // type:object size:0x4 align:4 data:float lbl_8057C6E8 = .sdata2:0x8057C6E8; // type:object size:0x4 align:4 data:float @@ -52324,10 +52333,13 @@ lbl_805B6000 = .bss:0x805B6000; // type:object size:0x10 lbl_805B6010 = .bss:0x805B6010; // type:object size:0x20 LytDropLineParts__STATE_WAIT = .bss:0x805B6030; // type:object size:0x40 data:4byte LytDropLineParts__STATE_MOVE = .bss:0x805B6070; // type:object size:0x50 data:4byte -lbl_805B60C0 = .bss:0x805B60C0; // type:object size:0x10 -lbl_805B60D0 = .bss:0x805B60D0; // type:object size:0x20 -LytForceLineParts__STATE_WAIT = .bss:0x805B60F0; // type:object size:0x40 data:4byte -LytForceLineParts__STATE_MOVE = .bss:0x805B6130; // type:object size:0x30 data:4byte +@22922 = .bss:0x805B60C0; // type:object size:0xC scope:local +...bss.0 = .bss:0x805B60C0; // type:label scope:local +sHio = .bss:0x805B60D0; // type:object size:0x10 scope:local +@22937 = .bss:0x805B60E0; // type:object size:0xC scope:local +StateID_Wait__20dLytForceLineParts_c = .bss:0x805B60F0; // type:object size:0x30 data:4byte +@22941 = .bss:0x805B6120; // type:object size:0xC scope:local +StateID_Move__20dLytForceLineParts_c = .bss:0x805B6130; // type:object size:0x30 data:4byte lbl_805B6160 = .bss:0x805B6160; // type:object size:0x10 lbl_805B6170 = .bss:0x805B6170; // type:object size:0x20 LytEnemyIcon__STATE_WAIT = .bss:0x805B6190; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index 42cd482b..f910e7d0 100644 --- a/configure.py +++ b/configure.py @@ -648,7 +648,7 @@ config.libs = [ Object(NonMatching, "d/lyt/d_lyt_game_over.cpp"), Object(Matching, "d/lyt/d_lyt_save_mgr.cpp"), Object(NonMatching, "d/lyt/d_lyt_drop_line.cpp"), - Object(NonMatching, "d/lyt/d_lyt_force_line.cpp"), + Object(Matching, "d/lyt/d_lyt_force_line.cpp"), Object(NonMatching, "d/lyt/d_lyt_enemy_icon.cpp"), Object(NonMatching, "d/lyt/d_lyt_mini_game.cpp"), Object(NonMatching, "d/lyt/d_lyt_meter_suiryu_score.cpp"), diff --git a/include/d/lyt/d_lyt_force_line.h b/include/d/lyt/d_lyt_force_line.h new file mode 100644 index 00000000..e76b20d2 --- /dev/null +++ b/include/d/lyt/d_lyt_force_line.h @@ -0,0 +1,88 @@ +#ifndef D_LYT_FORCE_LINE_H +#define D_LYT_FORCE_LINE_H + +#include "common.h" +#include "d/d_base.h" +#include "d/lyt/d2d.h" +#include "m/m_vec.h" +#include "s/s_State.hpp" +#include "toBeSorted/d_emitter.h" + +class dLytForceLine_c; + +class dLytForceLineParts_c { +public: + dLytForceLineParts_c() : mStateMgr(*this) {} + + int create(dLytForceLine_c *main); + int doDelete(); + int execute(); + int draw(); + + void start(mVec3_c tadtoneWorldPos, mVec2_c targetPos, s32 variant); + void reset(); + + bool isDone() const { + return mIsDone; + } + +private: + STATE_FUNC_DECLARE(dLytForceLineParts_c, Wait); + STATE_FUNC_DECLARE(dLytForceLineParts_c, Move); + + /* 0x00 */ UI_STATE_MGR_DECLARE(dLytForceLineParts_c); + /* 0x3C */ dEmitter_c mEmitter; + /* 0x70 */ mVec3_c mStartPos; + /* 0x7C */ mVec3_c mEffectPos; + /* 0x88 */ mVec3_c mMoveLinearCoeff; + /* 0x94 */ mVec2_c mTargetPos; + /* 0x9C */ s32 mVariant; + /* 0xA0 */ s32 mMoveTimer; + /* 0xA4 */ bool mMoveRequest; + /* 0xA5 */ bool mIsDone; +}; + +/** 2D UI - Tadtone pickup trail */ +class dLytForceLine_c : public dBase_c { +public: + dLytForceLine_c() { + sInstance = this; + } + virtual ~dLytForceLine_c() { + sInstance = nullptr; + } + + static dLytForceLine_c *GetInstance() { + return sInstance; + } + + virtual int create() override; + virtual int doDelete() override; + virtual int execute() override; + virtual int draw() override; + + static void start(mVec3_c tadtoneWorldPos, s32 tadtoneGroupIdx, s32 tadtoneIdx, s32 variant); + static bool isDone(s32 idx); + static void initPos(d2d::LytBase_c *lyt, d2d::AnmGroup_c *anm); + +private: + static dLytForceLine_c *sInstance; + + static const s32 NUM_PARTS = 16; + static const s32 NUM_TADTONES = 77; + + int createInternal(); + int doDeleteInternal(); + int executeInternal(); + int drawInternal(); + + void startInternal(mVec3_c tadtoneWorldPos, s32 tadtoneGroupIdx, s32 tadtoneIdx, s32 variant); + bool isDoneInternal(s32 idx); + void initPosInternal(d2d::LytBase_c *lyt, d2d::AnmGroup_c *anm); + + /* 0x068 */ dLytForceLineParts_c mParts[NUM_PARTS]; + /* 0xAE8 */ mVec2_c field_0xAE8[NUM_TADTONES]; + /* 0xD50 */ UNKWORD field_0xD50; +}; + +#endif diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index 8c6dfc28..972144d7 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -452,6 +452,14 @@ public: } } + static bool getfn_800C9F70() { + if (sInstance != nullptr) { + return sInstance->mMain.fn_800C9F70(); + } else { + return false; + } + } + static bool getfn_800C9FE0() { if (sInstance != nullptr) { return sInstance->mMain.fn_800C9FE0(); diff --git a/include/egg/math/eggVector.h b/include/egg/math/eggVector.h index d6ce59aa..abcf1176 100644 --- a/include/egg/math/eggVector.h +++ b/include/egg/math/eggVector.h @@ -134,7 +134,7 @@ struct Vector3f : public nw4r::math::VEC3 { void setZero() { x = y = z = 0.0f; - }; + } f32 normalise(); @@ -168,6 +168,10 @@ public: y = fy; } + void setZero() { + x = y = 0.0f; + } + Vector2f operator-(const Vector2f &v) { return Vector2f(x - v.x, y - v.y); } diff --git a/src/d/lyt/d_lyt_force_line.cpp b/src/d/lyt/d_lyt_force_line.cpp new file mode 100644 index 00000000..89fa1d3e --- /dev/null +++ b/src/d/lyt/d_lyt_force_line.cpp @@ -0,0 +1,305 @@ +#include "d/lyt/d_lyt_force_line.h" + +#include "common.h" +#include "d/lyt/meter/d_lyt_meter.h" +#include "f/f_base.h" +#include "m/m_vec.h" +#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/math/math_types.h" +#include "toBeSorted/d_d3d.h" +#include "toBeSorted/d_emitter.h" + +static s32 getNumTadtonesInGroup(s32 arg) { + static const s32 nums[] = {1, 4, 2, 8, 1, 8, 1, 4, 8, 1, 4, 8, 1, 4, 2, 4, 16}; + return nums[arg]; +} + +class dLytForceLine_HIO_c { +public: + dLytForceLine_HIO_c(); + virtual ~dLytForceLine_HIO_c(); + + /* 0x04 */ f32 field_0x04; + /* 0x08 */ s32 mMoveDuration; + /* 0x0C */ u8 field_0x0C; +}; + +static dLytForceLine_HIO_c sHio; + +dLytForceLine_HIO_c::dLytForceLine_HIO_c() : field_0x04(5.0f), mMoveDuration(10), field_0x0C(0) {} +dLytForceLine_HIO_c::~dLytForceLine_HIO_c() {} + +STATE_DEFINE(dLytForceLineParts_c, Wait); +STATE_DEFINE(dLytForceLineParts_c, Move); + +int dLytForceLineParts_c::create(dLytForceLine_c *main) { + mEmitter.init(main); + reset(); + + return fBase_c::SUCCEEDED; +} + +int dLytForceLineParts_c::doDelete() { + // no-op + return fBase_c::SUCCEEDED; +} + +int dLytForceLineParts_c::execute() { + mStateMgr.executeState(); + return fBase_c::SUCCEEDED; +} + +int dLytForceLineParts_c::draw() { + // no-op + return fBase_c::SUCCEEDED; +} + +void dLytForceLineParts_c::start(mVec3_c tadtoneWorldPos, mVec2_c targetPos, s32 variant) { + d3d::worldToScreen(mStartPos, tadtoneWorldPos); + mStartPos.z = 0.0f; + mEffectPos = mStartPos; + mEffectPos.z = 0.0f; + mTargetPos = targetPos; + + mVariant = variant; + mMoveRequest = true; + mIsDone = false; +} + +void dLytForceLineParts_c::reset() { + mStartPos.setZero(); + mEffectPos.setZero(); + mMoveLinearCoeff.setZero(); + mTargetPos.setZero(); + mMoveTimer = 0; + mVariant = 0; + mMoveRequest = false; + mIsDone = false; + mStateMgr.changeState(StateID_Wait); +} + +void dLytForceLineParts_c::initializeState_Wait() {} + +void dLytForceLineParts_c::executeState_Wait() { + if (mMoveRequest) { + mStateMgr.changeState(StateID_Move); + } +} + +void dLytForceLineParts_c::finalizeState_Wait() {} + +void dLytForceLineParts_c::initializeState_Move() { + mMoveTimer = 0; + + // Set up the coefficients for the quadratic parabola below + mMoveLinearCoeff.x = + ((mTargetPos.x - mStartPos.x) + (sHio.field_0x04 * (f32)sHio.mMoveDuration * (f32)sHio.mMoveDuration)) / + (f32)sHio.mMoveDuration; + mMoveLinearCoeff.y = (mTargetPos.y - mStartPos.y) / (f32)sHio.mMoveDuration; +} + +void dLytForceLineParts_c::executeState_Move() { + bool isDone = false; + + if (dLytMeter_c::getfn_800C9F70()) { + mStateMgr.changeState(StateID_Wait); + mMoveRequest = false; + mIsDone = true; + return; + } + + if (mMoveTimer < sHio.mMoveDuration) { + // Quadratic parabola + mEffectPos.x = + mStartPos.x + mMoveLinearCoeff.x * (f32)mMoveTimer - sHio.field_0x04 * (f32)mMoveTimer * (f32)mMoveTimer; + + mEffectPos.y = mStartPos.y + mMoveLinearCoeff.y * (f32)mMoveTimer; + mEffectPos.z = 0.0f; + mMoveTimer++; + } else { + isDone = true; + mEffectPos.x = mTargetPos.x; + mEffectPos.y = mTargetPos.y; + mEffectPos.z = 0.0f; + } + + switch (mVariant) { + case 3: + mEmitter.holdUIEffect(PARTICLE_RESOURCE_ID_MAPPING_870_, mEffectPos, nullptr, nullptr, nullptr, nullptr); + break; + case 2: + mEmitter.holdUIEffect(PARTICLE_RESOURCE_ID_MAPPING_871_, mEffectPos, nullptr, nullptr, nullptr, nullptr); + break; + case 0: + mEmitter.holdUIEffect(PARTICLE_RESOURCE_ID_MAPPING_873_, mEffectPos, nullptr, nullptr, nullptr, nullptr); + break; + case 1: + mEmitter.holdUIEffect(PARTICLE_RESOURCE_ID_MAPPING_872_, mEffectPos, nullptr, nullptr, nullptr, nullptr); + break; + case 5: + mEmitter.holdUIEffect(PARTICLE_RESOURCE_ID_MAPPING_875_, mEffectPos, nullptr, nullptr, nullptr, nullptr); + break; + case 4: + mEmitter.holdUIEffect(PARTICLE_RESOURCE_ID_MAPPING_874_, mEffectPos, nullptr, nullptr, nullptr, nullptr); + break; + } + + if (isDone) { + mStateMgr.changeState(StateID_Wait); + mMoveRequest = false; + mIsDone = true; + } +} + +void dLytForceLineParts_c::finalizeState_Move() {} + +SPECIAL_BASE_PROFILE(LYT_FORCE_LINE, dLytForceLine_c, fProfile::LYT_FORCE_LINE, 0x2B1, 0x6F9); + +dLytForceLine_c *dLytForceLine_c::sInstance; + +int dLytForceLine_c::create() { + if (sInstance != nullptr) { + sInstance->createInternal(); + } + return SUCCEEDED; +} + +int dLytForceLine_c::doDelete() { + if (sInstance != nullptr) { + sInstance->doDeleteInternal(); + } + return SUCCEEDED; +} + +int dLytForceLine_c::execute() { + if (sInstance != nullptr) { + sInstance->executeInternal(); + } + return SUCCEEDED; +} + +int dLytForceLine_c::draw() { + if (sInstance != nullptr) { + sInstance->drawInternal(); + } + return SUCCEEDED; +} + +void dLytForceLine_c::start(mVec3_c tadtoneWorldPos, s32 tadtoneGroupIdx, s32 tadtoneIdx, s32 variant) { + if (sInstance != nullptr) { + sInstance->startInternal(tadtoneWorldPos, tadtoneGroupIdx, tadtoneIdx, variant); + } +} + +bool dLytForceLine_c::isDone(s32 idx) { + if (sInstance != nullptr) { + return sInstance->isDoneInternal(idx); + } + return false; +} + +void dLytForceLine_c::initPos(d2d::LytBase_c *lyt, d2d::AnmGroup_c *anm) { + if (sInstance != nullptr) { + sInstance->initPosInternal(lyt, anm); + } +} + +int dLytForceLine_c::createInternal() { + for (int i = 0; i < NUM_PARTS; i++) { + mParts[i].create(this); + } + field_0xD50 = 0; + return true; +} + +int dLytForceLine_c::doDeleteInternal() { + for (int i = 0; i < NUM_PARTS; i++) { + mParts[i].doDelete(); + } + return SUCCEEDED; +} + +int dLytForceLine_c::executeInternal() { + for (int i = 0; i < NUM_PARTS; i++) { + mParts[i].execute(); + } + return SUCCEEDED; +} + +int dLytForceLine_c::drawInternal() { + for (int i = 0; i < NUM_PARTS; i++) { + mParts[i].draw(); + } + return SUCCEEDED; +} + +void dLytForceLine_c::startInternal(mVec3_c tadtoneWorldPos, s32 tadtoneGroupIdx, s32 tadtoneIdx, s32 variant) { + if (field_0xD50 != tadtoneGroupIdx || tadtoneIdx == 0) { + field_0xD50 = tadtoneGroupIdx; + for (int i = 0; i < NUM_PARTS; i++) { + mParts[i].reset(); + } + } + + s32 sum = 0; + for (int i = 0; i < tadtoneGroupIdx; i++) { + sum += getNumTadtonesInGroup(i); + } + sum += tadtoneIdx; + + mParts[tadtoneIdx].start(tadtoneWorldPos, field_0xAE8[sum], variant); +} + +bool dLytForceLine_c::isDoneInternal(s32 idx) { + return mParts[idx].isDone(); +} + +static const char *sPaneNames[] = { + "N_scoreA_00", "N_scoreB_00", "N_scoreB_01", "N_scoreB_02", "N_scoreB_03", "N_scoreC_00", "N_scoreC_01", + "N_scoreD_00", "N_scoreD_01", "N_scoreD_02", "N_scoreD_03", "N_scoreD_04", "N_scoreD_05", "N_scoreD_06", + "N_scoreD_07", "N_scoreE_00", "N_scoreF_00", "N_scoreF_01", "N_scoreF_02", "N_scoreF_03", "N_scoreF_04", + "N_scoreF_05", "N_scoreF_06", "N_scoreF_07", "N_scoreG_00", "N_scoreH_00", "N_scoreH_01", "N_scoreH_02", + "N_scoreH_03", "N_scoreI_00", "N_scoreI_01", "N_scoreI_02", "N_scoreI_03", "N_scoreI_04", "N_scoreI_05", + "N_scoreI_06", "N_scoreI_07", "N_scoreJ_00", "N_scoreK_00", "N_scoreK_01", "N_scoreK_02", "N_scoreK_03", + "N_scoreL_00", "N_scoreL_01", "N_scoreL_02", "N_scoreL_03", "N_scoreL_04", "N_scoreL_05", "N_scoreL_06", + "N_scoreL_07", "N_scoreM_00", "N_scoreN_00", "N_scoreN_01", "N_scoreN_02", "N_scoreN_03", "N_scoreO_00", + "N_scoreO_01", "N_scoreP_00", "N_scoreP_01", "N_scoreP_02", "N_scoreP_03", "N_scoreQ_00", "N_scoreQ_01", + "N_scoreQ_02", "N_scoreQ_03", "N_scoreQ_04", "N_scoreQ_05", "N_scoreQ_06", "N_scoreQ_07", "N_scoreQ_08", + "N_scoreQ_09", "N_scoreQ_10", "N_scoreQ_11", "N_scoreQ_12", "N_scoreQ_13", "N_scoreQ_14", "N_scoreQ_15", +}; + +void dLytForceLine_c::initPosInternal(d2d::LytBase_c *lyt, d2d::AnmGroup_c *anm) { + nw4r::lyt::Pane *panes[NUM_TADTONES]; + + for (int i = 0; i < NUM_TADTONES; i++) { + panes[i] = lyt->findPane(sPaneNames[i]); + } + + bool enabled = anm->isEnabled_(); + anm->setAnimEnable(true); + anm->setFrame(0.0f); + lyt->calc(); + + for (int i = 0; i < 24; i++) { + nw4r::math::MTX34 mtx = panes[i]->GetGlobalMtx(); + field_0xAE8[i].set(mtx._03, mtx._13); + } + + anm->setFrame(10.0f); + lyt->calc(); + + for (int i = 24; i < 50; i++) { + nw4r::math::MTX34 mtx = panes[i]->GetGlobalMtx(); + field_0xAE8[i].set(mtx._03, mtx._13); + } + + anm->setFrame(20.0f); + lyt->calc(); + + for (int i = 50; i < 77; i++) { + nw4r::math::MTX34 mtx = panes[i]->GetGlobalMtx(); + field_0xAE8[i].set(mtx._03, mtx._13); + } + + anm->setAnimEnable(enabled); +}