diff --git a/config/YFEE01/arm9/delinks.txt b/config/YFEE01/arm9/delinks.txt index 7d5dc76..5281b10 100644 --- a/config/YFEE01/arm9/delinks.txt +++ b/config/YFEE01/arm9/delinks.txt @@ -39,6 +39,10 @@ src/gamectrl.cpp: .text start:0x020217b4 end:0x02022f4c .data start:0x020cec44 end:0x020cf650 +src/menu.cpp: + .text start:0x0202d4c4 end:0x020302e0 + .data start:0x020d3d8c end:0x020d3f74 + src/button.cpp: .text start:0x020346e0 end:0x020355e4 diff --git a/config/YFEE01/arm9/relocs.txt b/config/YFEE01/arm9/relocs.txt index 4659d97..1980eda 100644 --- a/config/YFEE01/arm9/relocs.txt +++ b/config/YFEE01/arm9/relocs.txt @@ -5168,16 +5168,16 @@ from:0x0202d440 kind:arm_call to:0x0201122c module:main from:0x0202d474 kind:arm_call to:0x02010f40 module:main from:0x0202d4a8 kind:load to:0x027e1268 module:dtcm from:0x0202d4b4 kind:arm_call to:0x020115a4 module:main -from:0x0202d570 kind:load to:0x020d3e3c module:main +from:0x0202d570 kind:load to:0x020d3e34 module:main add:8 from:0x0202d594 kind:arm_call to:0x01ffbb90 module:itcm -from:0x0202d5a0 kind:load to:0x020d3e3c module:main +from:0x0202d5a0 kind:load to:0x020d3e34 module:main add:8 from:0x0202d5a4 kind:load to:0x027e1b9c module:dtcm from:0x0202d5c8 kind:arm_call to:0x01ffbb90 module:itcm from:0x0202d5d0 kind:arm_call to:0x020115a4 module:main -from:0x0202d5dc kind:load to:0x020d3e3c module:main +from:0x0202d5dc kind:load to:0x020d3e34 module:main add:8 from:0x0202d5e0 kind:load to:0x027e1b9c module:dtcm from:0x0202d604 kind:arm_call to:0x01ffbb90 module:itcm -from:0x0202d610 kind:load to:0x020d3e3c module:main +from:0x0202d610 kind:load to:0x020d3e34 module:main add:8 from:0x0202d614 kind:load to:0x027e1b9c module:dtcm from:0x0202d63c kind:arm_call to:0x0202f7d0 module:main from:0x0202d670 kind:arm_call to:0x02018f54 module:main @@ -5263,14 +5263,14 @@ from:0x0202fab0 kind:arm_call to:0x0202f8c4 module:main from:0x0202fad8 kind:arm_call to:0x01ffc018 module:itcm from:0x0202fb08 kind:arm_call to:0x01ffbf78 module:itcm from:0x0202fb30 kind:load to:0x020d3dd4 module:main -from:0x0202fb34 kind:load to:0x020d3dc4 module:main +from:0x0202fb34 kind:load to:0x020d3dbc module:main add:8 from:0x0202fb50 kind:arm_call to:0x01ffbca0 module:itcm from:0x0202fb60 kind:arm_call to:0x020190c4 module:main from:0x0202fbac kind:arm_call to:0x0202f8c4 module:main from:0x0202fbd0 kind:arm_call to:0x01ffc018 module:itcm from:0x0202fc00 kind:arm_call to:0x01ffbf78 module:itcm from:0x0202fc28 kind:load to:0x020d3dd4 module:main -from:0x0202fc2c kind:load to:0x020d3dc4 module:main +from:0x0202fc2c kind:load to:0x020d3dbc module:main add:8 from:0x0202fcbc kind:arm_call to:0x0202f8c4 module:main from:0x0202fe1c kind:arm_call to:0x020190c4 module:main from:0x0202fe34 kind:arm_call to:0x02033f54 module:main @@ -5306,12 +5306,12 @@ from:0x0202ffe4 kind:arm_call to:0x02018df4 module:main from:0x0202fff8 kind:load to:0x020d3dd4 module:main from:0x02030214 kind:arm_call to:0x0202f7d0 module:main from:0x02030254 kind:arm_call to:0x020115a4 module:main -from:0x02030260 kind:load to:0x020d3dc4 module:main +from:0x02030260 kind:load to:0x020d3dbc module:main add:8 from:0x02030284 kind:arm_call to:0x0202f7d0 module:main -from:0x020302c8 kind:load to:0x020d3dc4 module:main +from:0x020302c8 kind:load to:0x020d3dbc module:main add:8 from:0x020302e8 kind:arm_call to:0x0202d4c4 module:main from:0x02030328 kind:load to:0x020d40bc module:main -from:0x0203032c kind:load to:0x020d3f7c module:main +from:0x0203032c kind:load to:0x020d3f74 module:main add:8 from:0x02030344 kind:arm_call to:0x0202a4dc module:main from:0x02030368 kind:arm_call to:0x0202b688 module:main from:0x02030380 kind:arm_call to:0x0202b294 module:main diff --git a/config/YFEE01/arm9/symbols.txt b/config/YFEE01/arm9/symbols.txt index bff7c4c..577a024 100644 --- a/config/YFEE01/arm9/symbols.txt +++ b/config/YFEE01/arm9/symbols.txt @@ -1553,83 +1553,83 @@ func_0202d19c kind:function(arm,size=0x120) addr:0x0202d19c func_0202d2bc kind:function(arm,size=0x1f0) addr:0x0202d2bc func_0202d4ac kind:function(arm,size=0x14) addr:0x0202d4ac func_0202d4c0 kind:function(arm,size=0x4) addr:0x0202d4c0 -func_0202d4c4 kind:function(arm,size=0xb0) addr:0x0202d4c4 -func_0202d574 kind:function(arm,size=0x34) addr:0x0202d574 -func_0202d5a8 kind:function(arm,size=0x3c) addr:0x0202d5a8 -func_0202d5e4 kind:function(arm,size=0x34) addr:0x0202d5e4 -func_0202d618 kind:function(arm,size=0x18) addr:0x0202d618 -func_0202d630 kind:function(arm,size=0x48) addr:0x0202d630 -func_0202d678 kind:function(arm,size=0x10) addr:0x0202d678 -func_0202d688 kind:function(arm,size=0x34) addr:0x0202d688 -func_0202d6bc kind:function(arm,size=0x10) addr:0x0202d6bc -func_0202d6cc kind:function(arm,size=0x18) addr:0x0202d6cc -func_0202d6e4 kind:function(arm,size=0x18) addr:0x0202d6e4 -func_0202d6fc kind:function(arm,size=0x90) addr:0x0202d6fc -func_0202d78c kind:function(arm,size=0x13c) addr:0x0202d78c -func_0202d8c8 kind:function(arm,size=0x80) addr:0x0202d8c8 -func_0202d948 kind:function(arm,size=0x18) addr:0x0202d948 -func_0202d960 kind:function(arm,size=0x5c) addr:0x0202d960 -func_0202d9bc kind:function(arm,size=0x5c) addr:0x0202d9bc -func_0202da18 kind:function(arm,size=0x5c) addr:0x0202da18 -func_0202da74 kind:function(arm,size=0x5c) addr:0x0202da74 +_ZN4MenuC1Ev kind:function(arm,size=0xb0) addr:0x0202d4c4 +_ZN4MenuD1Ev kind:function(arm,size=0x34) addr:0x0202d574 +_ZN4MenuD0Ev kind:function(arm,size=0x3c) addr:0x0202d5a8 +_ZN4MenuD2Ev kind:function(arm,size=0x34) addr:0x0202d5e4 +ProcMenu_0202d618 kind:function(arm,size=0x18) addr:0x0202d618 +ProcMenu_0202d630 kind:function(arm,size=0x48) addr:0x0202d630 +ProcMenu_0202d678 kind:function(arm,size=0x10) addr:0x0202d678 +ProcMenu_0202d688 kind:function(arm,size=0x34) addr:0x0202d688 +ProcMenu_0202d6bc kind:function(arm,size=0x10) addr:0x0202d6bc +ProcMenu_0202d6cc kind:function(arm,size=0x18) addr:0x0202d6cc +ProcMenu_0202d6e4 kind:function(arm,size=0x18) addr:0x0202d6e4 +_ZN4Menu9_0202d6fcEl kind:function(arm,size=0x90) addr:0x0202d6fc +_ZN8MenuItem8vfunc_acEP13MenuItemStatellll kind:function(arm,size=0x13c) addr:0x0202d78c +_ZN8MenuItem8vfunc_c8EP13MenuItemState kind:function(arm,size=0x80) addr:0x0202d8c8 +_ZN8MenuItem8vfunc_10EP13MenuItemState kind:function(arm,size=0x18) addr:0x0202d948 +_ZN8MenuItem8vfunc_b4EP4MenuP13MenuItemState kind:function(arm,size=0x5c) addr:0x0202d960 +_ZN8MenuItem8vfunc_b8EP4MenuP13MenuItemState kind:function(arm,size=0x5c) addr:0x0202d9bc +_ZN8MenuItem8vfunc_bcEP4MenuP13MenuItemState kind:function(arm,size=0x5c) addr:0x0202da18 +_ZN8MenuItem8vfunc_c0EP4MenuP13MenuItemState kind:function(arm,size=0x5c) addr:0x0202da74 func_0202dad0 kind:function(arm,size=0x24) addr:0x0202dad0 -func_0202daf4 kind:function(arm,size=0x68) addr:0x0202daf4 -func_0202db5c kind:function(arm,size=0x68) addr:0x0202db5c -func_0202dbc4 kind:function(arm,size=0x68) addr:0x0202dbc4 -func_0202dc2c kind:function(arm,size=0x68) addr:0x0202dc2c -func_0202dc94 kind:function(arm,size=0x68) addr:0x0202dc94 -func_0202dcfc kind:function(arm,size=0x88) addr:0x0202dcfc -func_0202dd84 kind:function(arm,size=0x68) addr:0x0202dd84 -func_0202ddec kind:function(arm,size=0x820) addr:0x0202ddec -func_0202e60c kind:function(arm,size=0x34) addr:0x0202e60c -func_0202e640 kind:function(arm,size=0x34) addr:0x0202e640 -func_0202e674 kind:function(arm,size=0x34) addr:0x0202e674 -func_0202e6a8 kind:function(arm,size=0x34) addr:0x0202e6a8 -func_0202e6dc kind:function(arm,size=0x58) addr:0x0202e6dc -func_0202e734 kind:function(arm,size=0x70) addr:0x0202e734 -func_0202e7a4 kind:function(arm,size=0xd0) addr:0x0202e7a4 -func_0202e874 kind:function(arm,size=0xd8) addr:0x0202e874 -func_0202e94c kind:function(arm,size=0x8c) addr:0x0202e94c -func_0202e9d8 kind:function(arm,size=0x90) addr:0x0202e9d8 -func_0202ea68 kind:function(arm,size=0xc4) addr:0x0202ea68 -func_0202eb2c kind:function(arm,size=0xbc) addr:0x0202eb2c -func_0202ebe8 kind:function(arm,size=0x8) addr:0x0202ebe8 -func_0202ebf0 kind:function(arm,size=0x8) addr:0x0202ebf0 -func_0202ebf8 kind:function(arm,size=0x4c) addr:0x0202ebf8 -func_0202ec44 kind:function(arm,size=0x4c) addr:0x0202ec44 -func_0202ec90 kind:function(arm,size=0x130) addr:0x0202ec90 -func_0202edc0 kind:function(arm,size=0x2c) addr:0x0202edc0 -func_0202edec kind:function(arm,size=0xc0) addr:0x0202edec -func_0202eeac kind:function(arm,size=0x44) addr:0x0202eeac -func_0202eef0 kind:function(arm,size=0x48) addr:0x0202eef0 -func_0202ef38 kind:function(arm,size=0x44) addr:0x0202ef38 -func_0202ef7c kind:function(arm,size=0x44) addr:0x0202ef7c -func_0202efc0 kind:function(arm,size=0x3c) addr:0x0202efc0 -func_0202effc kind:function(arm,size=0xc) addr:0x0202effc -func_0202f008 kind:function(arm,size=0x18) addr:0x0202f008 -func_0202f020 kind:function(arm,size=0x10) addr:0x0202f020 -func_0202f030 kind:function(arm,size=0x10) addr:0x0202f030 -func_0202f040 kind:function(arm,size=0x260) addr:0x0202f040 -func_0202f2a0 kind:function(arm,size=0x4) addr:0x0202f2a0 -func_0202f2a4 kind:function(arm,size=0xa8) addr:0x0202f2a4 -func_0202f34c kind:function(arm,size=0x11c) addr:0x0202f34c -func_0202f468 kind:function(arm,size=0x28) addr:0x0202f468 -func_0202f490 kind:function(arm,size=0x74) addr:0x0202f490 -func_0202f504 kind:function(arm,size=0x78) addr:0x0202f504 -func_0202f57c kind:function(arm,size=0x38) addr:0x0202f57c -func_0202f5b4 kind:function(arm,size=0x50) addr:0x0202f5b4 -func_0202f604 kind:function(arm,size=0x70) addr:0x0202f604 -func_0202f674 kind:function(arm,size=0x5c) addr:0x0202f674 -func_0202f6d0 kind:function(arm,size=0x5c) addr:0x0202f6d0 -func_0202f72c kind:function(arm,size=0xa4) addr:0x0202f72c -func_0202f7d0 kind:function(arm,size=0x30) addr:0x0202f7d0 -func_0202f800 kind:function(arm,size=0x60) addr:0x0202f800 -func_0202f860 kind:function(arm,size=0x3c) addr:0x0202f860 -func_0202f89c kind:function(arm,size=0x28) addr:0x0202f89c -func_0202f8c4 kind:function(arm,size=0x158) addr:0x0202f8c4 -func_0202fa1c kind:function(arm,size=0x54) addr:0x0202fa1c -func_0202fa70 kind:function(arm,size=0xc8) addr:0x0202fa70 -func_0202fb38 kind:function(arm,size=0xf8) addr:0x0202fb38 +_ZN4Menu8vfunc_78Ev kind:function(arm,size=0x68) addr:0x0202daf4 +_ZN4Menu8vfunc_7cEv kind:function(arm,size=0x68) addr:0x0202db5c +_ZN4Menu8vfunc_80Ev kind:function(arm,size=0x68) addr:0x0202dbc4 +_ZN4Menu8vfunc_84Ev kind:function(arm,size=0x68) addr:0x0202dc2c +_ZN4Menu8vfunc_88Ev kind:function(arm,size=0x68) addr:0x0202dc94 +_ZN4Menu8vfunc_8cEv kind:function(arm,size=0x88) addr:0x0202dcfc +_ZN4Menu8vfunc_90Ev kind:function(arm,size=0x68) addr:0x0202dd84 +_ZN4Menu8vfunc_64Ev kind:function(arm,size=0x820) addr:0x0202ddec +_ZN4Menu8vfunc_bcEv kind:function(arm,size=0x34) addr:0x0202e60c +_ZN4Menu8vfunc_c0Ev kind:function(arm,size=0x34) addr:0x0202e640 +_ZN4Menu8vfunc_c4Ev kind:function(arm,size=0x34) addr:0x0202e674 +_ZN4Menu8vfunc_c8Ev kind:function(arm,size=0x34) addr:0x0202e6a8 +_ZN4Menu8vfunc_b0EP13MenuItemStatell kind:function(arm,size=0x58) addr:0x0202e6dc +_ZN4Menu8vfunc_b4Ev kind:function(arm,size=0x70) addr:0x0202e734 +_ZN4Menu8vfunc_68El kind:function(arm,size=0xd0) addr:0x0202e7a4 +_ZN4Menu8vfunc_6cEl kind:function(arm,size=0xd8) addr:0x0202e874 +_ZN4Menu8vfunc_70El kind:function(arm,size=0x8c) addr:0x0202e94c +_ZN4Menu8vfunc_74El kind:function(arm,size=0x90) addr:0x0202e9d8 +_ZN4Menu8vfunc_d8Ev kind:function(arm,size=0xc4) addr:0x0202ea68 +_ZN4Menu8vfunc_dcEv kind:function(arm,size=0xbc) addr:0x0202eb2c +_ZN4Menu8vfunc_ccEv kind:function(arm,size=0x8) addr:0x0202ebe8 +_ZN4Menu8vfunc_d0El kind:function(arm,size=0x8) addr:0x0202ebf0 +_ZN4Menu8vfunc_d4El kind:function(arm,size=0x4c) addr:0x0202ebf8 +_ZN4Menu8vfunc_f0Ellll kind:function(arm,size=0x4c) addr:0x0202ec44 +_ZN4Menu8vfunc_e8Ev kind:function(arm,size=0x130) addr:0x0202ec90 +_ZN4Menu8vfunc_f4Ellll kind:function(arm,size=0x2c) addr:0x0202edc0 +_ZN4Menu8vfunc_ecEv kind:function(arm,size=0xc0) addr:0x0202edec +_ZN4Menu8vfunc_fcEllll kind:function(arm,size=0x44) addr:0x0202eeac +_ZN4Menu8vfunc_f8EPvllll kind:function(arm,size=0x48) addr:0x0202eef0 +_ZN4Menu9vfunc_100Ellll kind:function(arm,size=0x44) addr:0x0202ef38 +_ZN4Menu9vfunc_108Ellll kind:function(arm,size=0x44) addr:0x0202ef7c +_ZN4Menu9vfunc_104EPvllll kind:function(arm,size=0x3c) addr:0x0202efc0 +_ZN4Menu9vfunc_10cEv kind:function(arm,size=0xc) addr:0x0202effc +_ZN4Menu9vfunc_110Ev kind:function(arm,size=0x18) addr:0x0202f008 +_ZN4Menu9_0202f020Ell kind:function(arm,size=0x10) addr:0x0202f020 +_ZN4Menu9_0202f030Ell kind:function(arm,size=0x10) addr:0x0202f030 +_ZN4Menu9_0202f040Elll kind:function(arm,size=0x260) addr:0x0202f040 +_ZN4Menu9vfunc_118Ev kind:function(arm,size=0x4) addr:0x0202f2a0 +_ZN4Menu8vfunc_08Ev kind:function(arm,size=0xa8) addr:0x0202f2a4 +_ZN4Menu8vfunc_0cEv kind:function(arm,size=0x11c) addr:0x0202f34c +_ZN4Menu8vfunc_10Ev kind:function(arm,size=0x28) addr:0x0202f468 +_ZN4Menu8vfunc_14Ev kind:function(arm,size=0x74) addr:0x0202f490 +_ZN4Menu8vfunc_18Ev kind:function(arm,size=0x78) addr:0x0202f504 +_ZN4Menu8vfunc_1cEv kind:function(arm,size=0x38) addr:0x0202f57c +_ZN4Menu9vfunc_11cEv kind:function(arm,size=0x50) addr:0x0202f5b4 +_ZN4Menu9vfunc_120Ev kind:function(arm,size=0x70) addr:0x0202f604 +_ZN4Menu9_0202f674Ev kind:function(arm,size=0x5c) addr:0x0202f674 +_ZN4Menu9_0202f6d0Ev kind:function(arm,size=0x5c) addr:0x0202f6d0 +_ZN4Menu9_0202f72cEv kind:function(arm,size=0xa4) addr:0x0202f72c +_ZN4Menu9_0202f7d0Ev kind:function(arm,size=0x30) addr:0x0202f7d0 +_ZN4Menu9vfunc_124Ev kind:function(arm,size=0x60) addr:0x0202f800 +_ZN4Menu9_0202f860Ev kind:function(arm,size=0x3c) addr:0x0202f860 +_ZN4Menu9vfunc_12cEv kind:function(arm,size=0x28) addr:0x0202f89c +_ZN4Menu9_0202f8c4Ev kind:function(arm,size=0x158) addr:0x0202f8c4 +_ZN4Menu9vfunc_128Ev kind:function(arm,size=0x54) addr:0x0202fa1c +StartMenu kind:function(arm,size=0xc8) addr:0x0202fa70 +StartChildMenu kind:function(arm,size=0xf8) addr:0x0202fb38 func_0202fc30 kind:function(arm,size=0xec) addr:0x0202fc30 func_0202fd1c kind:function(arm,size=0xf8) addr:0x0202fd1c func_0202fe14 kind:function(arm,size=0x38) addr:0x0202fe14 @@ -1639,26 +1639,26 @@ func_0202fe9c kind:function(arm,size=0x20) addr:0x0202fe9c func_0202febc kind:function(arm,size=0x3c) addr:0x0202febc func_0202fef8 kind:function(arm,size=0x10) addr:0x0202fef8 func_0202ff08 kind:function(arm,size=0x18) addr:0x0202ff08 -func_0202ff20 kind:function(arm,size=0x10) addr:0x0202ff20 -func_0202ff30 kind:function(arm,size=0x10) addr:0x0202ff30 -func_0202ff40 kind:function(arm,size=0x10) addr:0x0202ff40 +LockMenu kind:function(arm,size=0x10) addr:0x0202ff20 +UnlockMenu kind:function(arm,size=0x10) addr:0x0202ff30 +IsMenuLocked kind:function(arm,size=0x10) addr:0x0202ff40 func_0202ff50 kind:function(arm,size=0x1c) addr:0x0202ff50 -func_0202ff6c kind:function(arm,size=0x20) addr:0x0202ff6c +IsMenuActive kind:function(arm,size=0x20) addr:0x0202ff6c func_0202ff8c kind:function(arm,size=0x28) addr:0x0202ff8c func_0202ffb4 kind:function(arm,size=0x24) addr:0x0202ffb4 func_0202ffd8 kind:function(arm,size=0x24) addr:0x0202ffd8 -func_0202fffc kind:function(arm,size=0x50) addr:0x0202fffc -func_0203004c kind:function(arm,size=0xa0) addr:0x0203004c -func_020300ec kind:function(arm,size=0x108) addr:0x020300ec -func_020301f4 kind:function(arm,size=0x70) addr:0x020301f4 -func_02030264 kind:function(arm,size=0x68) addr:0x02030264 -func_020302cc kind:function(arm,size=0x4) addr:0x020302cc -func_020302d0 kind:function(arm,size=0x4) addr:0x020302d0 -func_020302d4 kind:function(arm,size=0x4) addr:0x020302d4 -func_020302d8 kind:function(arm,size=0x4) addr:0x020302d8 -func_020302dc kind:function(arm,size=0x4) addr:0x020302dc -func_020302e0 kind:function(arm,size=0x50) addr:0x020302e0 -func_02030330 kind:function(arm,size=0x5c) addr:0x02030330 +_ZN9SplitMenu8vfunc_b0EP13MenuItemStatell kind:function(arm,size=0x50) addr:0x0202fffc +_ZN9SplitMenu8vfunc_08Ev kind:function(arm,size=0xa0) addr:0x0203004c +_ZN9SplitMenu8vfunc_0cEv kind:function(arm,size=0x108) addr:0x020300ec +_ZN8ProcMenuD0Ev kind:function(arm,size=0x70) addr:0x020301f4 +_ZN8ProcMenuD1Ev kind:function(arm,size=0x68) addr:0x02030264 +_ZN9SplitMenu9vfunc_108Ellll kind:function(arm,size=0x4) addr:0x020302cc +_ZN9SplitMenu9vfunc_100Ellll kind:function(arm,size=0x4) addr:0x020302d0 +_ZN9SplitMenu8vfunc_fcEllll kind:function(arm,size=0x4) addr:0x020302d4 +_ZN9SplitMenu8vfunc_ecEv kind:function(arm,size=0x4) addr:0x020302d8 +_ZN9SplitMenu8vfunc_e8Ev kind:function(arm,size=0x4) addr:0x020302dc +_ZN6DialogC1Ev kind:function(arm,size=0x50) addr:0x020302e0 +_ZN6Dialog9vfunc_128Ev kind:function(arm,size=0x5c) addr:0x02030330 func_0203038c kind:function(arm,size=0x30) addr:0x0203038c func_020303bc kind:function(arm,size=0x24) addr:0x020303bc func_020303e0 kind:function(arm,size=0xa8) addr:0x020303e0 @@ -1679,10 +1679,10 @@ func_02030b88 kind:function(arm,size=0x44) addr:0x02030b88 func_02030bcc kind:function(arm,size=0x110) addr:0x02030bcc func_02030cdc kind:function(arm,size=0x128) addr:0x02030cdc func_02030e04 kind:function(arm,size=0x8) addr:0x02030e04 -func_02030e0c kind:function(arm,size=0x44) addr:0x02030e0c -func_02030e50 kind:function(arm,size=0x3c) addr:0x02030e50 -func_02030e8c kind:function(arm,size=0x44) addr:0x02030e8c -func_02030ed0 kind:function(arm,size=0x3c) addr:0x02030ed0 +_ZN6DialogD0Ev kind:function(arm,size=0x44) addr:0x02030e0c +_ZN6DialogD1Ev kind:function(arm,size=0x3c) addr:0x02030e50 +_ZN10DialogBaseD0Ev kind:function(arm,size=0x44) addr:0x02030e8c +_ZN10DialogBaseD1Ev kind:function(arm,size=0x3c) addr:0x02030ed0 func_02030f0c kind:function(arm,size=0xa8) addr:0x02030f0c func_02030fb4 kind:function(arm,size=0x8c) addr:0x02030fb4 func_02031040 kind:function(arm,size=0x4) addr:0x02031040 @@ -5845,7 +5845,7 @@ data_020cacb4 kind:data(any) addr:0x020cacb4 data_020cacc0 kind:data(any) addr:0x020cacc0 data_020caccc kind:data(any) addr:0x020caccc data_020cacf4 kind:data(any) addr:0x020cacf4 -__typestr__4Menu kind:data(any) addr:0x020cacfc +_ZTS4Menu kind:data(any) addr:0x020cacfc data_020cad04 kind:data(any) addr:0x020cad04 data_020cad0c kind:data(any) addr:0x020cad0c __typestr__6Dialog kind:data(any) addr:0x020cad14 @@ -5866,7 +5866,7 @@ __typeinfo__10DialogBase kind:data(any) addr:0x020cadb8 __typeinfo__15_LinkDialogNone kind:data(any) addr:0x020cadc4 __typeinfo__10DialogItem kind:data(any) addr:0x020cadd0 __typeinfo__16_LinkDialogYesNo kind:data(any) addr:0x020caddc -__typeinfo__4Menu kind:data(any) addr:0x020cade8 +_ZTI4Menu kind:data(any) addr:0x020cade8 __typeinfo__17_LinkDialogCommon kind:data(any) addr:0x020cadf4 __typeinfo__15LinkErrorDialog kind:data(any) addr:0x020cae00 __typestr__10DialogBase kind:data(any) addr:0x020cae0c @@ -6773,14 +6773,14 @@ data_020d3d4c kind:data(any) addr:0x020d3d4c data_020d3d64 kind:data(any) addr:0x020d3d64 data_020d3d6c kind:data(any) addr:0x020d3d6c data_020d3d7c kind:data(any) addr:0x020d3d7c -__typestr__8ProcMenu kind:data(any) addr:0x020d3d8c -__typestr__9SplitMenu kind:data(any) addr:0x020d3d98 -__typeinfo__9SplitMenu kind:data(any) addr:0x020d3da4 -__typeinfo__8ProcMenu kind:data(any) addr:0x020d3db0 -__vt__8ProcMenu kind:data(any) addr:0x020d3dc4 -data_020d3dd4 kind:data(any) addr:0x020d3dd4 -data_020d3e3c kind:data(any) addr:0x020d3e3c -data_020d3f7c kind:data(any) addr:0x020d3f7c +_ZTS8ProcMenu kind:data(any) addr:0x020d3d8c +_ZTS9SplitMenu kind:data(any) addr:0x020d3d98 +_ZTI9SplitMenu kind:data(any) addr:0x020d3da4 +_ZTI8ProcMenu kind:data(any) addr:0x020d3db0 +_ZTV8ProcMenu kind:data(any) addr:0x020d3dbc +ProcScr_ProcMenu kind:data(any) addr:0x020d3dd4 +_ZTV4Menu kind:data(any) addr:0x020d3e34 +_ZTV6Dialog kind:data(any) addr:0x020d3f74 data_020d40bc kind:data(any) addr:0x020d40bc __typestr__6Button kind:data(any) addr:0x020d41f4 __typeinfo__6Button kind:data(any) addr:0x020d41fc diff --git a/include/menu.hpp b/include/menu.hpp index 9177f32..607b46a 100644 --- a/include/menu.hpp +++ b/include/menu.hpp @@ -3,6 +3,7 @@ #include "global.h" +#include "heap.hpp" #include "proc_ex.hpp" enum @@ -18,22 +19,25 @@ enum { // Menu availability identifiers - MENU_ENABLED = 0, + MENU_ENABLED = 0, MENU_DISABLED = 1, MENU_NOTSHOWN = 2, - MENU_ACTIVE = 8, + MENU_ACTIVE = 8, }; +class ProcMenu; +class MenuItem; class MenuItemState; class Menu { public: // vtable - STRUCT_PAD(0x04, 0x0C); + Menu * unk_04; // parent? + MenuItem ** unk_08; // menu items? MenuItemState * unk_0c; - ProcEx * unk_10; + ProcMenu * unk_10; u32 unk_14; u32 unk_18; u32 unk_1c; @@ -42,102 +46,124 @@ class Menu u32 unk_28; u32 unk_2c; u32 unk_30; - u8 unk_34; - u8 unk_35; - u8 unk_36; - u8 unk_37; + s8 unk_34; + s8 unk_35; + s8 unk_36; + s8 unk_37; s8 unk_38; - STRUCT_PAD(0x39, 0x40); + s8 unk_39; + u8 unk_3a; + u8 unk_3b; + u8 unk_3c; + s8 unk_3d; + u8 unk_3e; + u8 unk_3f; u8 unk_40; u8 unk_41; u8 unk_42; u8 unk_43; - STRUCT_PAD(0x44, 0x48); + u8 unk_44; + u8 unk_45; + u8 unk_46; + u8 unk_47; u8 unk_48; - STRUCT_PAD(0x49, 0x50); - - Menu(); // func_0202d4c4 - - virtual void vfunc_00(void); // ? - virtual void vfunc_04(/* ? */); // func_02015368 - virtual void vfunc_08(/* ? */); // func_0202f2a4 - virtual void vfunc_0c(/* ? */); // func_0202f34c - virtual void vfunc_10(/* ? */); // func_0202f468 - virtual void vfunc_14(/* ? */); // func_0202f490 - virtual void vfunc_18(/* ? */); // func_0202f504 - virtual void vfunc_1c(/* ? */); // func_0202f57c - virtual void vfunc_20(/* ? */); // func_02015360 - virtual s32 vfunc_24(void *, s32); // ? - virtual s32 vfunc_28(void); // ? - virtual void vfunc_2c(/* ? */); // func_02015328 - virtual void vfunc_30(/* ? */); // func_02015308 - virtual void vfunc_34(/* ? */); // func_02015310 - virtual void vfunc_38(/* ? */); // func_020152e8 - virtual void vfunc_3c(/* ? */); // func_020152f0 - virtual void vfunc_40(/* ? */); // func_020152c8 - virtual void vfunc_44(/* ? */); // func_020152d0 - virtual void vfunc_48(/* ? */); // func_020152a8 - virtual void vfunc_4c(/* ? */); // func_020152b0 - virtual void vfunc_50(/* ? */); // func_02015288 - virtual void vfunc_54(/* ? */); // func_02015290 - virtual s32 vfunc_58(void); // ? - virtual void vfunc_5c(/* ? */); // func_02015270 - virtual void vfunc_60(/* ? */); // func_02015250 - virtual void vfunc_64(/* ? */); // func_0202ddec - virtual void vfunc_68(/* ? */); // func_0202e7a4 - virtual void vfunc_6c(/* ? */); // func_0202e874 - virtual void vfunc_70(/* ? */); // func_0202e94c - virtual void vfunc_74(/* ? */); // func_0202e9d8 - virtual void vfunc_78(/* ? */); // func_0202daf4 - virtual void vfunc_7c(/* ? */); // func_0202db5c - virtual void vfunc_80(/* ? */); // func_0202dbc4 - virtual void vfunc_84(/* ? */); // func_0202dc2c - virtual void vfunc_88(/* ? */); // func_0202dc94 - virtual void vfunc_8c(/* ? */); // func_0202dcfc - virtual void vfunc_90(/* ? */); // func_0202dd84 - virtual void vfunc_94(/* ? */); // func_02015248 - virtual void vfunc_98(/* ? */); // func_02015240 - virtual void vfunc_9c(/* ? */); // func_02015238 - virtual void vfunc_a0(void); // ? - virtual void vfunc_a4(/* ? */); // func_02015228 - virtual void vfunc_a8(void); // ? - virtual void vfunc_ac(/* ? */); // func_02015218 - virtual void vfunc_b0(/* ? */); // func_0202e6dc - virtual void vfunc_b4(/* ? */); // func_0202e734 - virtual void vfunc_b8(/* ? */); // func_02015214 - virtual void vfunc_bc(/* ? */); // func_0202e60c - virtual void vfunc_c0(/* ? */); // func_0202e640 - virtual void vfunc_c4(/* ? */); // func_0202e674 - virtual void vfunc_c8(/* ? */); // func_0202e6a8 - virtual void vfunc_cc(/* ? */); // func_0202ebe8 - virtual void vfunc_d0(/* ? */); // func_0202ebf0 - virtual void vfunc_d4(/* ? */); // func_0202ebf8 - virtual void vfunc_d8(/* ? */); // func_0202ea68 - virtual void vfunc_dc(/* ? */); // func_0202eb2c - virtual void vfunc_e0(/* ? */); // func_02015210 - virtual void vfunc_e4(/* ? */); // func_0201520c - virtual void vfunc_e8(void); // ? - virtual void vfunc_ec(void); // ? - virtual void vfunc_f0(/* ? */); // func_0202ec44 - virtual void vfunc_f4(/* ? */); // func_0202edc0 - virtual void vfunc_f8(/* ? */); // func_0202eef0 - virtual void vfunc_fc(/* ? */); // func_0202eeac - virtual void vfunc_100(/* ? */); // func_0202ef38 - virtual void vfunc_104(/* ? */); // func_0202efc0 - virtual void vfunc_108(/* ? */); // func_0202ef7c - virtual void vfunc_10c(/* ? */); // func_0202effc - virtual void vfunc_110(/* ? */); // func_0202f008 - virtual void vfunc_114(/* ? */); // func_02028068 - virtual void vfunc_118(/* ? */); // func_0202f2a0 - virtual void vfunc_11c(/* ? */); // func_0202f5b4 - virtual void vfunc_120(void); // ? - virtual void vfunc_124(void); // ? - virtual void vfunc_128(/* ? */); // func_0202fa1c - virtual void vfunc_12c(/* ? */); // func_0202f89c - virtual void vfunc_130(/* ? */); // ? - virtual void vfunc_134(/* ? */); // ? + u8 unk_49; + s8 unk_4a[4]; + STRUCT_PAD(0x4E, 0x50); + + Menu(); + + /* 000 */ virtual void vfunc_00(void); // ? + /* 004 */ virtual void vfunc_04(/* ? */); // func_02015368 + /* 008 */ virtual void vfunc_08(void); + /* 00C */ virtual void vfunc_0c(void); + /* 010 */ virtual void vfunc_10(void); + /* 014 */ virtual void vfunc_14(void); + /* 018 */ virtual void vfunc_18(void); + /* 01C */ virtual void vfunc_1c(void); + /* 020 */ virtual void vfunc_20(/* ? */); // func_02015360 + /* 024 */ virtual s32 vfunc_24(MenuItemState *, s32); // ? + /* 028 */ virtual s32 vfunc_28(void); // ? + /* 02C */ virtual s32 vfunc_2c(MenuItemState *, s32); // func_02015328 + /* 030 */ virtual void vfunc_30(/* ? */); // func_02015308 + /* 034 */ virtual s32 vfunc_34(MenuItemState *, s32); // func_02015310 + /* 038 */ virtual void vfunc_38(/* ? */); // func_020152e8 + /* 03C */ virtual s32 vfunc_3c(MenuItemState *, s32); // func_020152f0 + /* 040 */ virtual void vfunc_40(/* ? */); // func_020152c8 + /* 044 */ virtual s32 vfunc_44(MenuItemState *, s32); // func_020152d0 + /* 048 */ virtual void vfunc_48(/* ? */); // func_020152a8 + /* 04C */ virtual s32 vfunc_4c(MenuItemState *, s32); // func_020152b0 + /* 050 */ virtual void vfunc_50(/* ? */); // func_02015288 + /* 054 */ virtual s32 vfunc_54(MenuItemState *, s32); // func_02015290 + /* 058 */ virtual s32 vfunc_58(s32); // ? + /* 05C */ virtual void vfunc_5c(/* ? */); // func_02015270 + /* 060 */ virtual s32 vfunc_60(void); // func_02015250 + /* 064 */ virtual void vfunc_64(void); + /* 068 */ virtual void vfunc_68(s32); + /* 06C */ virtual void vfunc_6c(s32); + /* 070 */ virtual void vfunc_70(s32); + /* 074 */ virtual void vfunc_74(s32); + /* 078 */ virtual s32 vfunc_78(void); + /* 07C */ virtual s32 vfunc_7c(void); + /* 080 */ virtual s32 vfunc_80(void); + /* 084 */ virtual s32 vfunc_84(void); + /* 088 */ virtual s32 vfunc_88(void); + /* 08C */ virtual s32 vfunc_8c(void); + /* 090 */ virtual s32 vfunc_90(void); + /* 094 */ virtual s32 vfunc_94(s32, s32); // func_02015248 + /* 098 */ virtual s32 vfunc_98(s32, s32); // func_02015240 + /* 09C */ virtual BOOL vfunc_9c(void); // func_02015238 + /* 0A0 */ virtual BOOL vfunc_a0(void); // ? + /* 0A4 */ virtual BOOL vfunc_a4(void); // func_02015228 + /* 0A8 */ virtual BOOL vfunc_a8(void); // ? + /* 0AC */ virtual s32 vfunc_ac(void); // func_02015218 + /* 0B0 */ virtual BOOL vfunc_b0(MenuItemState *, s32, s32); + /* 0B4 */ virtual BOOL vfunc_b4(void); + /* 0B8 */ virtual void vfunc_b8(s32); // func_02015214 + /* 0BC */ virtual void vfunc_bc(void); + /* 0C0 */ virtual void vfunc_c0(void); + /* 0C4 */ virtual void vfunc_c4(void); + /* 0C8 */ virtual void vfunc_c8(void); + /* 0CC */ virtual s32 vfunc_cc(void); + /* 0D0 */ virtual void vfunc_d0(s32); + /* 0D4 */ virtual s32 vfunc_d4(s32); + /* 0D8 */ virtual void vfunc_d8(void); + /* 0DC */ virtual void vfunc_dc(void); + /* 0E0 */ virtual void vfunc_e0(/* ? */); // func_02015210 + /* 0E4 */ virtual void vfunc_e4(/* ? */); // func_0201520c + /* 0E8 */ virtual void vfunc_e8(void); + /* 0EC */ virtual void vfunc_ec(void); + /* 0F0 */ virtual void vfunc_f0(s32, s32, s32, s32); + /* 0F4 */ virtual void vfunc_f4(s32, s32, s32, s32); + /* 0F8 */ virtual void vfunc_f8(void *, s32, s32, s32, s32); + /* 0FC */ virtual void vfunc_fc(s32, s32, s32, s32); + /* 100 */ virtual void vfunc_100(s32, s32, s32, s32); + /* 104 */ virtual void vfunc_104(void *, s32, s32, s32, s32); + /* 108 */ virtual void vfunc_108(s32, s32, s32, s32); + /* 10C */ virtual s32 vfunc_10c(void); + /* 110 */ virtual void vfunc_110(void); + /* 114 */ virtual void vfunc_114(void); // func_02028068 + /* 118 */ virtual void vfunc_118(void); + /* 11C */ virtual void vfunc_11c(void); + /* 120 */ virtual void vfunc_120(void); + /* 124 */ virtual void vfunc_124(void); + /* 128 */ virtual void vfunc_128(void); + /* 12C */ virtual void vfunc_12c(void); + /* 130 */ virtual void vfunc_130(/* ? */); // ? + /* 134 */ virtual void vfunc_134(/* ? */); // ? virtual ~Menu(); + + void _0202d6fc(s32); + void _0202f020(s32, s32); + void _0202f030(s32, s32); + void _0202f040(s32, s32, s32); + void _0202f674(void); + void _0202f6d0(void); + void _0202f72c(void); + void _0202f7d0(void); + s32 _0202f860(void); + void _0202f8c4(void); }; class MenuState @@ -152,89 +178,172 @@ class MenuItem : public MenuState, public MenuResult { public: virtual char * vfunc_00(void); // ?; GetLabelText? - virtual void vfunc_04(/* */); // func_0201511c; wraps vfunc_00 + virtual char * vfunc_04(MenuItemState *); // func_0201511c; wraps vfunc_00 virtual void vfunc_08(/* */); // func_020150f8 virtual void vfunc_0c(/* */); // func_02015100; wraps vfunc_08 - virtual s32 vfunc_10(MenuItemState *); // func_0202d948; GetLabelColor? (1 = White, 2 = Grey, 3 = Cyan, 4 = Gold, 5 = Green) + virtual s32 vfunc_10(MenuItemState *); // GetLabelColor? (1 = White, 2 = Grey, 3 = Cyan, 4 = Gold, 5 = Green) virtual s32 vfunc_14(void); // func_020150dc; IsEnabled? - virtual void vfunc_18(/* */); // func_020150e4; Wraps vfunc_14 + virtual s32 vfunc_18(s32); // func_020150e4; Wraps vfunc_14 virtual s32 vfunc_1c(void); // func_020150bc; OnConfirm? virtual s32 vfunc_20(MenuItemState *); // func_020150a8; OnConfirm? void * virtual s32 vfunc_24(Menu *, MenuItemState *); // func_020150c4; OnConfirm? Menu *, void * - virtual void vfunc_28(/* */); // func_02015074; OnBPress - virtual void vfunc_2c(/* */); // func_0201507c; OnBPress; wraps vfunc_28 - virtual void vfunc_30(/* */); // func_02015090; OnBPress; wraps vfunc_2c + virtual s32 vfunc_28(/* */); // func_02015074; OnBPress + virtual s32 vfunc_2c(/* */); // func_0201507c; OnBPress; wraps vfunc_28 + virtual s32 vfunc_30(Menu *, MenuItemState *); // func_02015090; OnBPress; wraps vfunc_2c virtual void vfunc_34(/* */); // func_02015040; OnXPress virtual void vfunc_38(/* */); // func_02015048; OnXPress - virtual void vfunc_3c(/* */); // func_0201505c; OnXPress + virtual s32 vfunc_3c(Menu *, MenuItemState *); // func_0201505c; OnXPress virtual void vfunc_40(/* */); // func_0201500c virtual void vfunc_44(/* */); // func_02015014 - virtual void vfunc_48(/* */); // func_02015028 + virtual s32 vfunc_48(Menu *, MenuItemState *); // func_02015028 virtual void vfunc_4c(/* */); // func_02014fd8; OnLPress virtual void vfunc_50(/* */); // func_02014fe0; OnLPress - virtual void vfunc_54(/* */); // func_02014ff4; OnLPress + virtual s32 vfunc_54(Menu *, MenuItemState *); // func_02014ff4; OnLPress virtual void vfunc_58(/* */); // func_02014fa4; OnRPress virtual void vfunc_5c(/* */); // func_02014fac; OnRPress - virtual void vfunc_60(/* */); // func_02014fc0; OnRPress + virtual s32 vfunc_60(Menu *, MenuItemState *); // func_02014fc0; OnRPress virtual void vfunc_64(/* */); // func_02014f70; maybe onexit virtual void vfunc_68(/* */); // func_02014f78 - virtual void vfunc_6c(/* */); // func_02014f8c + virtual s32 vfunc_6c(Menu *, MenuItemState *); // func_02014f8c virtual void vfunc_70(void); // func_02014f40; OnHover? or OnEnter? virtual void vfunc_74(/* */); // func_02014f44; OnHover? void * - virtual void vfunc_78(/* */); // func_02014f58; OnHover? Menu *, void * + virtual s32 vfunc_78(Menu *, MenuItemState *); // func_02014f58; OnHover? Menu *, void * virtual void vfunc_7c(/* */); // func_02014f10 virtual void vfunc_80(/* */); // func_02014f14 - virtual void vfunc_84(/* */); // func_02014f28 + virtual s32 vfunc_84(Menu *, MenuItemState *); // func_02014f28 virtual void vfunc_88(/* */); // func_02014ee0 virtual void vfunc_8c(/* */); // func_02014ee4 - virtual void vfunc_90(/* */); // func_02014ef8 + virtual void vfunc_90(Menu *, MenuItemState *); // func_02014ef8 virtual void vfunc_94(/* */); // func_02014eb0 virtual void vfunc_98(/* */); // func_02014eb4 - virtual void vfunc_9c(/* */); // func_02014ec8 + virtual void vfunc_9c(Menu *, MenuItemState *); // func_02014ec8 virtual void vfunc_a0(/* */); // func_02014e98 virtual void vfunc_a4(/* */); // func_02014e9c - virtual void vfunc_a8(/* */); // - virtual void vfunc_ac(/* */); // - virtual void vfunc_b0(/* */); // func_02014e94 - virtual void vfunc_b4(Menu *, MenuItemState *); // - virtual void vfunc_b8(/* */); // - virtual void vfunc_bc(/* */); // - virtual void vfunc_c0(/* */); // - virtual void vfunc_c4(/* */); // func_02014e8c - virtual void vfunc_c8(/* */); // - virtual void vfunc_cc(/* */); // func_02014e84 - virtual void vfunc_d0(/* */); // func_02014e7c - virtual void vfunc_d4(/* */); // func_02014e74 + virtual void vfunc_a8(Menu *, MenuItemState *); // + virtual s32 vfunc_ac(MenuItemState *, s32, s32, s32, s32); + virtual void vfunc_b0(Menu *, MenuItemState *); // func_02014e94 + virtual void vfunc_b4(Menu *, MenuItemState *); + virtual void vfunc_b8(Menu *, MenuItemState *); + virtual void vfunc_bc(Menu *, MenuItemState *); + virtual void vfunc_c0(Menu *, MenuItemState *); + virtual u32 vfunc_c4(void); // func_02014e8c + virtual u32 vfunc_c8(MenuItemState *); + virtual u32 vfunc_cc(void); // func_02014e84 + virtual u32 vfunc_d0(void); // func_02014e7c + virtual u32 vfunc_d4(void); // func_02014e74 }; class MenuItemState { public: MenuItem * unk_00; - void * unk_04; + s8 unk_04; + s8 unk_05; + s8 unk_06; + s8 unk_07; u8 unk_08; u8 unk_09; STRUCT_PAD(0x0A, 0x0C); }; +class SplitMenu : public Menu +{ +public: + /* 008 */ virtual void vfunc_08(void); + /* 00C */ virtual void vfunc_0c(void); + /* 0B0 */ virtual BOOL vfunc_b0(MenuItemState *, s32, s32); + + /* 0E8 */ virtual void vfunc_e8(void) + { + } + + /* 0EC */ virtual void vfunc_ec(void) + { + } + + /* 0FC */ virtual void vfunc_fc(s32, s32, s32, s32) + { + } + + /* 100 */ virtual void vfunc_100(s32, s32, s32, s32) + { + } + + /* 108 */ virtual void vfunc_108(s32, s32, s32, s32) + { + } +}; + +class ProcMenu : public ProcEx +{ +public: + /* 38 */ Menu * unk_38; + /* 3C */ u8 unk_3c; + + ProcMenu(Menu * menu) + { + this->unk_38 = menu; + this->unk_3c = 0; + } + + virtual ~ProcMenu() + { + if (this->unk_3c == 0) + { + this->unk_38->_0202f7d0(); + } + + this->unk_38->vfunc_dc(); + this->unk_38->vfunc_ec(); + + if (this->unk_38 != NULL) + { + this->unk_38->vfunc_134(); + } + } + + inline void ProcMenu_0202d688() + { + this->unk_38->vfunc_e0(); + this->unk_38->vfunc_d8(); + + this->unk_38->_0202f674(); + + return; + } +}; + class DialogBase : public Menu { public: - u32 unk_50; + void * unk_50; DialogBase() { - this->unk_50 = 0; + this->unk_50 = NULL; } - virtual ~DialogBase(); + virtual ~DialogBase() + { + if (this->unk_50 != NULL) + { + gHeap.Free(this->unk_50); + } + } }; class Dialog : public DialogBase { public: - Dialog(); // func_020302e0 - virtual ~Dialog(); + u32 unk_54; + + Dialog(); + + virtual ~Dialog() + { + } + + /* 128 */ virtual void vfunc_128(void); }; class DialogYesNo : public Dialog diff --git a/include/unknown_data.h b/include/unknown_data.h index f0b9fa5..6f4e15f 100644 --- a/include/unknown_data.h +++ b/include/unknown_data.h @@ -294,7 +294,7 @@ extern struct KeyState * gKeySt; // extern ??? data_020cacc0 // extern ??? data_020caccc // extern ??? data_020cacf4 -// extern ??? __typestr__4Menu +// extern ??? _ZTS4Menu // extern ??? data_020cad04 // extern ??? data_020cad0c // extern ??? __typestr__6Dialog @@ -315,7 +315,7 @@ extern struct KeyState * gKeySt; // extern ??? __typeinfo__15_LinkDialogNone // extern ??? __typeinfo__10DialogItem // extern ??? __typeinfo__16_LinkDialogYesNo -// extern ??? __typeinfo__4Menu +// extern ??? _ZTI4Menu // extern ??? __typeinfo__17_LinkDialogCommon // extern ??? __typeinfo__15LinkErrorDialog // extern ??? __typestr__10DialogBase @@ -1222,14 +1222,14 @@ extern struct ProcCmd data_020cec14[]; // extern ??? data_020d3d64 // extern ??? data_020d3d6c // extern ??? data_020d3d7c -// extern ??? __typestr__8ProcMenu -// extern ??? __typestr__9SplitMenu -// extern ??? __typeinfo__9SplitMenu -// extern ??? __typeinfo__8ProcMenu -// extern ??? __vt__8ProcMenu -// extern ??? data_020d3dd4 -// extern ??? data_020d3e3c -// extern ??? data_020d3f7c +// extern ??? _ZTS8ProcMenu +// extern ??? _ZTS9SplitMenu +// extern ??? _ZTI9SplitMenu +// extern ??? _ZTI8ProcMenu +// extern ??? _ZTV8ProcMenu +// extern ??? ProcScr_ProcMenu +// extern ??? _ZTV4Menu +// extern ??? _ZTV6Dialog // extern ??? data_020d40bc // extern ??? __typestr__6Button // extern ??? __typeinfo__6Button diff --git a/include/unknown_funcs.h b/include/unknown_funcs.h index bea2c6b..2f64135 100644 --- a/include/unknown_funcs.h +++ b/include/unknown_funcs.h @@ -1504,7 +1504,7 @@ EC void func_02028c68(void); // EC ??? func_02029480 // EC ??? func_0202957c EC s32 func_020295ec(struct UnkStruct_021970c4 *, char *, void *, void *, u32, u32, u32, u32, u32, u32); -EC void func_0202972c(struct UnkStruct_021970c4 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32, u32); +EC s32 func_0202972c(struct UnkStruct_021970c4 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32, u32); EC void func_02029850(struct UnkStruct_021970c4 *, s32, void *, u16 *, u32, u32, u32, u32, u32); EC void func_02029a1c(struct UnkStruct_021970c4 *, u32, void *, void *, u32, u32, u32, u32); // EC ??? func_02029ae8 @@ -1574,83 +1574,83 @@ EC void func_0202b688(void *, u32, u32, u32); // EC ??? func_0202d2bc // EC ??? func_0202d4ac // EC ??? func_0202d4c0 -// EC ??? func_0202d4c4 -// EC ??? func_0202d574 -// EC ??? func_0202d5a8 -// EC ??? func_0202d5e4 -// EC ??? func_0202d618 -// EC ??? func_0202d630 -// EC ??? func_0202d678 -// EC ??? func_0202d688 -// EC ??? func_0202d6bc -// EC ??? func_0202d6cc -// EC ??? func_0202d6e4 -// EC ??? func_0202d6fc -// EC ??? func_0202d78c -// EC ??? func_0202d8c8 -// EC ??? func_0202d948 -// EC ??? func_0202d960 -// EC ??? func_0202d9bc -// EC ??? func_0202da18 -// EC ??? func_0202da74 +// EC ??? _ZN4MenuC1Ev +// EC ??? _ZN4MenuD1Ev +// EC ??? _ZN4MenuD0Ev +// EC ??? _ZN4MenuD2Ev +// EC ??? ProcMenu_0202d618 +// EC ??? ProcMenu_0202d630 +// EC ??? ProcMenu_0202d678 +// EC ??? ProcMenu_0202d688 +// EC ??? ProcMenu_0202d6bc +// EC ??? ProcMenu_0202d6cc +// EC ??? ProcMenu_0202d6e4 +// EC ??? _ZN4Menu9_0202d6fcEl +// EC ??? _ZN8MenuItem8vfunc_acEP13MenuItemStatellll +// EC ??? _ZN8MenuItem8vfunc_c8EP13MenuItemState +// EC ??? _ZN8MenuItem8vfunc_10EP13MenuItemState +// EC ??? _ZN8MenuItem8vfunc_b4EP4MenuP13MenuItemState +// EC ??? _ZN8MenuItem8vfunc_b8EP4MenuP13MenuItemState +// EC ??? _ZN8MenuItem8vfunc_bcEP4MenuP13MenuItemState +// EC ??? _ZN8MenuItem8vfunc_c0EP4MenuP13MenuItemState // EC ??? func_0202dad0 -// EC ??? func_0202daf4 -// EC ??? func_0202db5c -// EC ??? func_0202dbc4 -// EC ??? func_0202dc2c -// EC ??? func_0202dc94 -// EC ??? func_0202dcfc -// EC ??? func_0202dd84 -// EC ??? func_0202ddec -// EC ??? func_0202e60c -// EC ??? func_0202e640 -// EC ??? func_0202e674 -// EC ??? func_0202e6a8 -// EC ??? func_0202e6dc -// EC ??? func_0202e734 -// EC ??? func_0202e7a4 -// EC ??? func_0202e874 -// EC ??? func_0202e94c -// EC ??? func_0202e9d8 -// EC ??? func_0202ea68 -// EC ??? func_0202eb2c -// EC ??? func_0202ebe8 -// EC ??? func_0202ebf0 -// EC ??? func_0202ebf8 -// EC ??? func_0202ec44 -// EC ??? func_0202ec90 -// EC ??? func_0202edc0 -// EC ??? func_0202edec -// EC ??? func_0202eeac -// EC ??? func_0202eef0 -// EC ??? func_0202ef38 -// EC ??? func_0202ef7c -// EC ??? func_0202efc0 -// EC ??? func_0202effc -// EC ??? func_0202f008 -// EC ??? func_0202f020 -// EC ??? func_0202f030 -// EC ??? func_0202f040 -// EC ??? func_0202f2a0 -// EC ??? func_0202f2a4 -// EC ??? func_0202f34c -// EC ??? func_0202f468 -// EC ??? func_0202f490 -// EC ??? func_0202f504 -// EC ??? func_0202f57c -// EC ??? func_0202f5b4 -// EC ??? func_0202f604 -// EC ??? func_0202f674 -// EC ??? func_0202f6d0 -// EC ??? func_0202f72c -// EC ??? func_0202f7d0 -// EC ??? func_0202f800 -// EC ??? func_0202f860 -// EC ??? func_0202f89c -// EC ??? func_0202f8c4 -// EC ??? func_0202fa1c -// EC ??? func_0202fa70 -// EC ??? func_0202fb38 +// EC ??? _ZN4Menu8vfunc_78Ev +// EC ??? _ZN4Menu8vfunc_7cEv +// EC ??? _ZN4Menu8vfunc_80Ev +// EC ??? _ZN4Menu8vfunc_84Ev +// EC ??? _ZN4Menu8vfunc_88Ev +// EC ??? _ZN4Menu8vfunc_8cEv +// EC ??? _ZN4Menu8vfunc_90Ev +// EC ??? _ZN4Menu8vfunc_64Ev +// EC ??? _ZN4Menu8vfunc_bcEv +// EC ??? _ZN4Menu8vfunc_c0Ev +// EC ??? _ZN4Menu8vfunc_c4Ev +// EC ??? _ZN4Menu8vfunc_c8Ev +// EC ??? _ZN4Menu8vfunc_b0EP13MenuItemStatell +// EC ??? _ZN4Menu8vfunc_b4Ev +// EC ??? _ZN4Menu8vfunc_68El +// EC ??? _ZN4Menu8vfunc_6cEl +// EC ??? _ZN4Menu8vfunc_70El +// EC ??? _ZN4Menu8vfunc_74El +// EC ??? _ZN4Menu8vfunc_d8Ev +// EC ??? _ZN4Menu8vfunc_dcEv +// EC ??? _ZN4Menu8vfunc_ccEv +// EC ??? _ZN4Menu8vfunc_d0El +// EC ??? _ZN4Menu8vfunc_d4El +// EC ??? _ZN4Menu8vfunc_f0Ellll +// EC ??? _ZN4Menu8vfunc_e8Ev +// EC ??? _ZN4Menu8vfunc_f4Ellll +// EC ??? _ZN4Menu8vfunc_ecEv +// EC ??? _ZN4Menu8vfunc_fcEllll +// EC ??? _ZN4Menu8vfunc_f8EPvllll +// EC ??? _ZN4Menu9vfunc_100Ellll +// EC ??? _ZN4Menu9vfunc_108Ellll +// EC ??? _ZN4Menu9vfunc_104EPvllll +// EC ??? _ZN4Menu9vfunc_10cEv +// EC ??? _ZN4Menu9vfunc_110Ev +// EC ??? _ZN4Menu9_0202f020Ell +// EC ??? _ZN4Menu9_0202f030Ell +// EC ??? _ZN4Menu9_0202f040Elll +// EC ??? _ZN4Menu9vfunc_118Ev +// EC ??? _ZN4Menu8vfunc_08Ev +// EC ??? _ZN4Menu8vfunc_0cEv +// EC ??? _ZN4Menu8vfunc_10Ev +// EC ??? _ZN4Menu8vfunc_14Ev +// EC ??? _ZN4Menu8vfunc_18Ev +// EC ??? _ZN4Menu8vfunc_1cEv +// EC ??? _ZN4Menu9vfunc_11cEv +// EC ??? _ZN4Menu9vfunc_120Ev +// EC ??? _ZN4Menu9_0202f674Ev +// EC ??? _ZN4Menu9_0202f6d0Ev +// EC ??? _ZN4Menu9_0202f72cEv +// EC ??? _ZN4Menu9_0202f7d0Ev +// EC ??? _ZN4Menu9vfunc_124Ev +// EC ??? _ZN4Menu9_0202f860Ev +// EC ??? _ZN4Menu9vfunc_12cEv +// EC ??? _ZN4Menu9_0202f8c4Ev +// EC ??? _ZN4Menu9vfunc_128Ev +// EC ??? StartMenu +// EC ??? StartChildMenu // EC ??? func_0202fc30 // EC ??? func_0202fd1c // EC ??? func_0202fe14 @@ -1660,26 +1660,26 @@ EC void func_0202b688(void *, u32, u32, u32); // EC ??? func_0202febc // EC ??? func_0202fef8 // EC ??? func_0202ff08 -// EC ??? func_0202ff20 -// EC ??? func_0202ff30 -// EC ??? func_0202ff40 +// EC ??? LockMenu +// EC ??? UnlockMenu +// EC ??? IsMenuLocked // EC ??? func_0202ff50 -// EC ??? func_0202ff6c +// EC ??? IsMenuActive // EC ??? func_0202ff8c // EC ??? func_0202ffb4 // EC ??? func_0202ffd8 -// EC ??? func_0202fffc -// EC ??? func_0203004c -// EC ??? func_020300ec -// EC ??? func_020301f4 -// EC ??? func_02030264 -// EC ??? func_020302cc -// EC ??? func_020302d0 -// EC ??? func_020302d4 -// EC ??? func_020302d8 -// EC ??? func_020302dc -EC void func_020302e0(void *); -// EC ??? func_02030330 +// EC ??? _ZN9SplitMenu8vfunc_b0EP13MenuItemStatell +// EC ??? _ZN9SplitMenu8vfunc_08Ev +// EC ??? _ZN9SplitMenu8vfunc_0cEv +// EC ??? _ZN8ProcMenuD0Ev +// EC ??? _ZN8ProcMenuD1Ev +// EC ??? _ZN9SplitMenu9vfunc_108Ellll +// EC ??? _ZN9SplitMenu9vfunc_100Ellll +// EC ??? _ZN9SplitMenu8vfunc_fcEllll +// EC ??? _ZN9SplitMenu8vfunc_ecEv +// EC ??? _ZN9SplitMenu8vfunc_e8Ev +EC void _ZN6DialogC1Ev(void *); +// EC ??? _ZN6Dialog9vfunc_128Ev // EC ??? func_0203038c // EC void func_020303bc(void *, char *, void *, ProcPtr, s32, s32); // EC ??? func_020303e0 @@ -1700,10 +1700,10 @@ EC void func_020302e0(void *); // EC ??? func_02030bcc // EC ??? func_02030cdc // EC ??? func_02030e04 -// EC ??? func_02030e0c -// EC ??? func_02030e50 -// EC ??? func_02030e8c -// EC ??? func_02030ed0 +// EC ??? _ZN6DialogD0Ev +// EC ??? _ZN6DialogD1Ev +// EC ??? _ZN10DialogBaseD0Ev +// EC ??? _ZN10DialogBaseD1Ev // EC ??? func_02030f0c // EC ??? func_02030fb4 // EC ??? func_02031040 diff --git a/src/menu.cpp b/src/menu.cpp new file mode 100644 index 0000000..22f7283 --- /dev/null +++ b/src/menu.cpp @@ -0,0 +1,1988 @@ +#include "global.h" + +#include + +#include "hardware.hpp" +#include "heap.hpp" +#include "menu.hpp" +#include "sound_manager.hpp" + +#include "unknown_funcs.h" + +#include "constants/sounds.h" + +extern struct KeyState * gKeySt; +extern struct TouchState * gTouchSt; + +Menu::Menu(void) +{ + s32 i; + + this->unk_10 = NULL; + this->unk_04 = 0; + this->unk_14 = 0x20; + this->unk_18 = 0; + this->unk_1c = 0; + this->unk_20 = 1; + this->unk_24 = 0; + this->unk_28 = 0; + this->unk_2c = 1; + this->unk_30 = 2; + this->unk_34 = this->unk_35 = this->unk_36 = this->unk_37 = -1; + this->unk_41 = 0; + this->unk_42 = 0; + this->unk_48 = 0; + this->unk_3b = 0; + this->unk_3c = 0; + this->unk_3e = 0; + this->unk_3f = 0; + this->unk_40 = 0; + this->unk_43 = 1; + this->unk_44 = 1; + this->unk_45 = 0; + this->unk_46 = 0; + this->unk_0c = 0; + this->unk_38 = 0; + this->unk_47 = 0; + + for (i = 0; i < 4; i++) + { + this->unk_4a[i] = -1; + } + + return; +} + +Menu::~Menu() +{ + if (this->unk_0c != NULL) + { + gHeap.Free(this->unk_0c); + } +} + +EC void ProcMenu_0202d618(ProcMenu * proc) +{ + proc->unk_38->vfunc_124(); + return; +} + +EC void ProcMenu_0202d630(ProcMenu * proc) +{ + proc->unk_38->_0202f7d0(); + proc->unk_3c = 1; + + proc->unk_38->vfunc_dc(); + proc->unk_38->vfunc_e4(); + + func_02018f54((struct Proc *)proc, 0); + + return; +} + +EC void ProcMenu_0202d678(ProcMenu * proc) +{ + proc->unk_38->_0202f6d0(); + return; +} + +EC void ProcMenu_0202d688(ProcMenu * proc) +{ + proc->unk_38->vfunc_e0(); + proc->unk_38->vfunc_d8(); + + proc->unk_38->_0202f674(); + + return; +} + +EC void ProcMenu_0202d6bc(ProcMenu * proc) +{ + proc->unk_38->_0202f72c(); + return; +} + +EC void ProcMenu_0202d6cc(ProcMenu * proc) +{ + proc->unk_38->vfunc_120(); + return; +} + +EC void ProcMenu_0202d6e4(ProcMenu * proc) +{ + proc->unk_38->vfunc_11c(); + return; +} + +void Menu::_0202d6fc(s32 param_2) +{ + this->unk_10->unk_38->vfunc_11c(); + + this->unk_47 = 4; + + if (param_2 != 0) + { + this->vfunc_e8(); + } + + func_02018f54((struct Proc *)this->unk_10, (void *)ProcMenu_0202d6bc); + + this->unk_10->ProcMenu_0202d688(); + + Proc_Goto(this->unk_10, 0, 0); + + return; +} + +struct UnkStruct_021970c4 +{ + void * unk_00; + void * unk_04; + void * unk_08; +}; + +extern struct UnkStruct_021970c4 * data_021970c4; +extern struct UnkStruct_021970c4 * data_021970cc; + +s32 MenuItem::vfunc_ac(MenuItemState * param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6) +{ + s32 bVar1; + s32 bVar2; + ScreenState * pSVar3; + s32 uVar6; + + bVar1 = param_2->unk_04; + bVar2 = param_2->unk_05; + uVar6 = 0; + + if (this->vfunc_04(param_2) != 0) + { + data_021970c4->unk_08 = (void *)((u32 *)(data_021970cc->unk_00))[this->vfunc_10(param_2)]; + + pSVar3 = gpActiveScreenSt; + + if (param_6 != 0) + { + uVar6 = func_0202972c( + data_021970c4, this->vfunc_04(param_2), pSVar3->bgTiles[param_3], pSVar3->tilemap[param_3], bVar1, + bVar2, param_4, param_5, param_6, 0, 0); + } + else + { + uVar6 = func_020295ec( + data_021970c4, this->vfunc_04(param_2), pSVar3->bgTiles[param_3], pSVar3->tilemap[param_3], bVar1, + bVar2, param_4, param_5, 0, 0); + } + } + + return uVar6; +} + +EC u32 func_02028e7c(UnkStruct_021970c4 *, char *, s32); + +u32 MenuItem::vfunc_c8(MenuItemState * param_2) +{ + u32 uVar1 = this->vfunc_c4(); + + if (uVar1 != -1) + { + return uVar1; + } + + if (this->vfunc_04(param_2) != NULL) + { + return (func_02028e7c(data_021970c4, this->vfunc_04(param_2), 0) + 7 & ~7) / 8; + } + + return 0; +} + +s32 MenuItem::vfunc_10(MenuItemState * param_2) +{ + if ((param_2->unk_09 & 7) != 1) + { + return MENU_COLOR_WHITE; + } + + return MENU_COLOR_GRAY; +} + +void MenuItem::vfunc_b4(Menu * param_2, MenuItemState * param_3) +{ + param_2->vfunc_fc(param_3->unk_04, param_3->unk_05, param_3->unk_06, param_3->unk_07); + gpActiveScreenSt->unk_3e |= (1 << param_2->unk_30); + return; +} + +void MenuItem::vfunc_b8(Menu * param_2, MenuItemState * param_3) +{ + param_2->vfunc_108(param_3->unk_04, param_3->unk_05, param_3->unk_06, param_3->unk_07); + gpActiveScreenSt->unk_3e |= (1 << param_2->unk_30); + return; +} + +void MenuItem::vfunc_bc(Menu * param_2, MenuItemState * param_3) +{ + param_2->vfunc_100(param_3->unk_04, param_3->unk_05, param_3->unk_06, param_3->unk_07); + gpActiveScreenSt->unk_3e |= (1 << param_2->unk_30); + return; +} + +void MenuItem::vfunc_c0(Menu * param_2, MenuItemState * param_3) +{ + param_2->vfunc_fc(param_3->unk_04, param_3->unk_05, param_3->unk_06, param_3->unk_07); + gpActiveScreenSt->unk_3e |= (1 << param_2->unk_30); + return; +} + +EC BOOL func_0202dad0(MenuItemState * param_1, Menu * param_2) +{ + return (¶m_2->unk_0c[param_2->unk_38] == param_1) & 0xff; +} + +s32 Menu::vfunc_78(void) +{ + u32 uVar2; + + if (this->unk_3b == 0) + { + uVar2 = this->unk_0c[this->unk_38].unk_00->vfunc_24(this, &this->unk_0c[this->unk_38]); + return this->vfunc_24(&this->unk_0c[this->unk_38], uVar2); + } + + return 0; +} + +s32 Menu::vfunc_7c(void) +{ + u32 uVar2; + + if (this->unk_3b == 0) + { + uVar2 = this->unk_0c[this->unk_38].unk_00->vfunc_30(this, &this->unk_0c[this->unk_38]); + return this->vfunc_2c(&this->unk_0c[this->unk_38], uVar2); + } + + return 0x800; +} + +s32 Menu::vfunc_80(void) +{ + u32 uVar2; + + if (this->unk_3b == 0) + { + uVar2 = this->unk_0c[this->unk_38].unk_00->vfunc_3c(this, &this->unk_0c[this->unk_38]); + return this->vfunc_34(&this->unk_0c[this->unk_38], uVar2); + } + + return 0; +} + +s32 Menu::vfunc_84(void) +{ + u32 uVar2; + + if (this->unk_3b == 0) + { + uVar2 = this->unk_0c[this->unk_38].unk_00->vfunc_48(this, &this->unk_0c[this->unk_38]); + return this->vfunc_3c(&this->unk_0c[this->unk_38], uVar2); + } + + return 0; +} + +s32 Menu::vfunc_88(void) +{ + u32 uVar2; + + if (this->unk_3b == 0) + { + uVar2 = this->unk_0c[this->unk_38].unk_00->vfunc_54(this, &this->unk_0c[this->unk_38]); + return this->vfunc_44(&this->unk_0c[this->unk_38], uVar2); + } + + return 0; +} + +s32 Menu::vfunc_8c(void) +{ + u32 uVar2; + + if (this->unk_3b != 0) + { + return this->vfunc_4c(&this->unk_0c[this->unk_38], 0x800); + } + + uVar2 = this->unk_0c[this->unk_38].unk_00->vfunc_60(this, &this->unk_0c[this->unk_38]); + return this->vfunc_4c(&this->unk_0c[this->unk_38], uVar2); +} + +s32 Menu::vfunc_90(void) +{ + u32 uVar2; + + if (this->unk_3b == 0) + { + uVar2 = this->unk_0c[this->unk_38].unk_00->vfunc_6c(this, &this->unk_0c[this->unk_38]); + return this->vfunc_54(&this->unk_0c[this->unk_38], uVar2); + } + + return 0; +} + +EC void func_0202fef8(Menu *); +EC void func_0202ff08(void); +EC void func_0202fe9c(Menu *, s32); +EC void func_0202febc(s32); + +void Menu::vfunc_64(void) +{ + s32 r5; + u32 action; + s32 touchIndex; + s32 prevTouchIndex; + s32 i; + + action = 0; + touchIndex = -1; + prevTouchIndex = -1; + + this->unk_39 = this->unk_38; + + if (this->unk_43 == 0 || this->unk_43 > 1) + { + if (this->unk_43 > 1) + { + this->unk_43--; + return; + } + + this->unk_3c = 0; + return; + } + + if (this->vfunc_ac()) + { + action = this->vfunc_60(); + } + + if (this->unk_44 != 0) + { + if (gTouchSt->unk_12 != 0 || gTouchSt->unk_15 != 0) + { + for (i = 0; i < this->unk_3a; i++) + { + MenuItemState * item = &this->unk_0c[i]; + + if ((item->unk_09 & 7) == 3) + { + continue; + } + + if (!this->vfunc_b0(item, gTouchSt->unk_00, gTouchSt->unk_02)) + { + continue; + } + + touchIndex = i; + break; + } + + if (gTouchSt->unk_14) + { + this->unk_3d = (u8)touchIndex; + this->unk_3c = 1; + } + + if (touchIndex != this->unk_3d) + { + this->unk_3c = 0; + } + + if (this->unk_3c && touchIndex == -1 && + (!this->vfunc_94(gTouchSt->unk_00, gTouchSt->unk_02) || + this->vfunc_98(gTouchSt->unk_00, gTouchSt->unk_02))) + { + this->unk_3c = 0; + } + + if (touchIndex != -1) + this->unk_38 = touchIndex; + + prevTouchIndex = touchIndex; + + if (gTouchSt->unk_15 == 0 && touchIndex != -1) + { + if (this->unk_3e == 0) + { + this->unk_0c[this->unk_38].unk_00->vfunc_bc(this, &this->unk_0c[this->unk_38]); + this->unk_3e = 1; + } + } + else if (this->unk_3e != 0) + { + this->unk_0c[this->unk_38].unk_00->vfunc_c0(this, &this->unk_0c[this->unk_38]); + this->unk_3e = 0; + } + } + } + else + { + this->unk_3c = 0; + + if (gKeySt->repeated & KEY_DPAD_UP) + { + this->vfunc_68(((gKeySt->pressed & KEY_DPAD_UP) != 0) & 0xFF); + } + + if (gKeySt->repeated & KEY_DPAD_DOWN) + { + this->vfunc_6c(((gKeySt->pressed & KEY_DPAD_DOWN) != 0) & 0xFF); + } + + if (gKeySt->repeated & KEY_DPAD_LEFT) + { + this->vfunc_70(((gKeySt->pressed & KEY_DPAD_LEFT) != 0) & 0xFF); + } + + if (gKeySt->repeated & KEY_DPAD_RIGHT) + { + this->vfunc_74(((gKeySt->pressed & KEY_DPAD_RIGHT) != 0) & 0xFF); + } + + if (action == 0 && (gKeySt->repeated & KEY_DPAD_ANY)) + { + action = this->vfunc_90(); + } + } + + if (this->unk_39 != this->unk_38) + { + if (this->unk_3e) + { + this->unk_0c[this->unk_38].unk_00->vfunc_c0(this, &this->unk_0c[this->unk_38]); + this->unk_3e = 0; + } + + this->unk_0c[this->unk_39].unk_00->vfunc_b8(this, &this->unk_0c[this->unk_39]); + this->unk_0c[this->unk_38].unk_00->vfunc_b4(this, &this->unk_0c[this->unk_38]); + this->unk_0c[this->unk_39].unk_00->vfunc_84(this, &this->unk_0c[this->unk_39]); + this->unk_0c[this->unk_38].unk_00->vfunc_78(this, &this->unk_0c[this->unk_38]); + + this->vfunc_bc(); + } + + if (this->unk_44 != 0) + { + if ((gTouchSt->unk_12 != 0) || (gTouchSt->unk_15 != 0)) + { + if (gTouchSt->unk_15 != 0) + { + if (((gTouchSt->unk_10 < 30) ? TRUE : FALSE) && this->unk_3c != 0) + { + if (touchIndex == this->unk_3d) + { + if (touchIndex == -1) + { + action = this->vfunc_7c(); + } + else + { + action = this->vfunc_78(); + } + } + } + } + + goto _0202e430; + } + } + + if (action == 0 && (gKeySt->pressed & KEY_BUTTON_A)) + { + action = this->vfunc_78(); + } + + if (action == 0 && (gKeySt->pressed & KEY_BUTTON_B)) + { + action = this->vfunc_7c(); + } + + if (action == 0 && (gKeySt->pressed & KEY_BUTTON_X)) + { + action = this->vfunc_80(); + } + + if (action == 0 && (gKeySt->pressed & KEY_BUTTON_Y)) + { + action = this->vfunc_84(); + } + + if (action == 0 && (gKeySt->pressed & KEY_BUTTON_L)) + { + action = this->vfunc_88(); + } + + if (action == 0 && (gKeySt->pressed & KEY_BUTTON_R)) + { + action = this->vfunc_8c(); + } + + if (action == 0 && (gKeySt->pressed & KEY_BUTTON_START)) + { + action = this->vfunc_58(action); + } + +_0202e430: + if (action == 0 && this->vfunc_9c()) + { + action = this->vfunc_78(); + } + + if (action == 0 && this->vfunc_a0()) + { + action = this->vfunc_7c(); + } + + if (action == 0 && this->vfunc_a4()) + { + action = this->vfunc_8c(); + } + + if (action == 0 && this->vfunc_a8()) + { + action = this->vfunc_58(action); + } + + if (action & 0x40) + { + this->vfunc_c0(); + } + else if (action & 0x80) + { + this->vfunc_c4(); + } + else if (action & 0x100) + { + this->vfunc_c8(); + } + + if (action & 0x1000) + { + if (this->unk_10->proc_parent != NULL) + { + Proc_Lock((struct Proc *)this->unk_10->proc_parent); + } + } + + r5 = ((action & 0x2000) != 0) & 0xFF; + + if (action & 8) + { + func_0202fef8(this); + return; + } + + if (action & 0x10) + { + func_0202fef8(this->unk_04); + return; + } + + if (action & 0x20) + { + func_0202ff08(); + return; + } + + if (action & 1) + { + func_0202fe9c(this, r5); + return; + } + + if (action & 2) + { + func_0202fe9c(this, r5); + func_0202fe9c(this->unk_04, r5); + return; + } + + if (action & 4) + { + func_0202febc(r5); + return; + } +} + +void Menu::vfunc_bc(void) +{ + gSoundManager->unk_b0->vfunc_28(SE_SYS_CURSOL2_WIN1, 0, 0); + return; +} + +void Menu::vfunc_c0(void) +{ + gSoundManager->unk_b0->vfunc_28(SE_SYS_SELECT1, 0, 0); + return; +} + +void Menu::vfunc_c4(void) +{ + gSoundManager->unk_b0->vfunc_28(SE_SYS_CANSEL1, 0, 0); + return; +} + +void Menu::vfunc_c8(void) +{ + gSoundManager->unk_b0->vfunc_28(SE_SYS_MISS1, 0, 0); + return; +} + +BOOL Menu::vfunc_b0(MenuItemState * arg1, s32 arg2, s32 arg3) +{ + if ((arg2 < ((arg1->unk_04 - 1) * 8)) || (arg2 >= ((arg1->unk_04 + arg1->unk_06 + 1) * 8))) + { + return FALSE; + } + + if ((arg3 < (arg1->unk_05 * 8)) || (arg3 >= ((arg1->unk_05 + arg1->unk_07) * 8))) + { + return FALSE; + } + + return TRUE; +} + +BOOL Menu::vfunc_b4(void) +{ + s32 i; + + for (i = 0; i < this->unk_3a; i++) + { + if (this->vfunc_b0(&this->unk_0c[i], gTouchSt->unk_00, gTouchSt->unk_02)) + { + return TRUE; + } + } + + return FALSE; +} + +void Menu::vfunc_68(s32 param_2) +{ + MenuItemState * pMVar1; + int iVar2; + int iVar3; + int iVar4; + u32 uVar5; + MenuItemState * pMVar6; + + iVar2 = IntSys_Div(this->unk_38, this->unk_48); + + uVar5 = this->unk_48; + iVar2 = iVar2 * uVar5; + if (this->unk_3a < (iVar2 + uVar5)) + { + uVar5 = this->unk_3a - iVar2; + } + + iVar3 = this->unk_38 - iVar2; + + while (TRUE) + { + if (iVar3 == 0) + { + if (param_2 != 0) + { + this->unk_3f = 1; + iVar3 = uVar5 - 1; + } + } + else + { + iVar3--; + } + + if (iVar3 == 0) + { + for (pMVar6 = &this->unk_0c[iVar2]; (pMVar6->unk_09 & 7) == 3; pMVar6++) + { + iVar3++; + } + } + + if ((this->unk_0c[iVar2 + iVar3].unk_09 & 7) == 3) + { + break; + } + } + + this->unk_38 = iVar2 + iVar3; + + return; +} + +void Menu::vfunc_6c(s32 param_2) +{ + s32 iVar2; + s32 iVar3; + s32 uVar5; + MenuItemState * pMVar6; + + iVar2 = IntSys_Div(this->unk_38, this->unk_48); + + uVar5 = this->unk_48; + iVar2 = iVar2 * uVar5; + + if ((iVar2 + uVar5) > this->unk_3a) + { + uVar5 = this->unk_3a - iVar2; + } + + iVar3 = this->unk_38 - iVar2; + + while (TRUE) + { + if (iVar3 < (uVar5 - 1)) + { + iVar3++; + } + else if (param_2 != 0) + { + this->unk_3f = 1; + iVar3 = 0; + } + + if (iVar3 >= (uVar5 - 1)) + { + for (pMVar6 = &this->unk_0c[iVar2 + iVar3]; (pMVar6->unk_09 & 7) == 3; pMVar6--) + { + iVar3--; + } + } + + if ((this->unk_0c[iVar2 + iVar3].unk_09 & 7) != 3) + { + break; + } + } + + this->unk_38 = iVar2 + iVar3; + + return; +} + +EC void func_020208b0(s32, s32, s32 *, s32 *); + +EC void Menu::vfunc_70(s32 param_2) +{ + s32 iVar1; + s32 acStack_14; + s32 iStack_18; + + iVar1 = IntSys_Div(this->unk_3a + this->unk_48 - 1, this->unk_48); + + if (iVar1 != 0) + { + func_020208b0(this->unk_38, this->unk_48, &iStack_18, &acStack_14); + + if (iStack_18 != 0) + { + iStack_18--; + } + else + { + if (param_2 != 0) + { + iStack_18 = iVar1 - 1; + this->unk_3f = 1; + } + } + + this->unk_38 = iStack_18 * this->unk_48 + acStack_14; + } + + return; +} + +EC void Menu::vfunc_74(s32 param_2) +{ + s32 iVar1; + s32 acStack_14; + s32 iStack_18; + + iVar1 = IntSys_Div(this->unk_3a + this->unk_48 - 1, this->unk_48); + + if (iVar1 != 0) + { + func_020208b0(this->unk_38, this->unk_48, &iStack_18, &acStack_14); + + if (iStack_18 < iVar1 - 1) + { + iStack_18++; + } + else if (param_2 != 0) + { + iStack_18 = 0; + this->unk_3f = 1; + } + + this->unk_38 = iStack_18 * this->unk_48 + acStack_14; + } + + return; +} + +void Menu::vfunc_d8(void) +{ + s32 iVar1; + MenuItemState * pMVar2; + s32 iVar3; + s32 iVar4; + + iVar3 = this->unk_14; + + pMVar2 = this->unk_0c; + + for (iVar4 = 0; iVar4 < this->unk_3a; iVar4++) + { + if (this->unk_40 != 0) + { + iVar1 = (this->unk_36 - 2) * 8; + } + else + { + iVar1 = 0; + } + + iVar1 = pMVar2->unk_00->vfunc_ac(pMVar2, this->unk_2c, iVar3, this->unk_18, iVar1); + iVar3 = iVar3 + iVar1; + pMVar2 = pMVar2 + 1; + } + + data_021970c4->unk_08 = data_021970cc->unk_04; + gpActiveScreenSt->unk_3e |= 1 << this->unk_2c; + + return; +} + +EC void func_02010f98(u16 *, s32, s32); + +void Menu::vfunc_dc(void) +{ + s32 i; + s32 quotient; + s32 iVar6; + + quotient = IntSys_Div(this->unk_3a + this->unk_48 - 1, this->unk_48); + + for (i = 0; i < quotient; i++) + { + if (i == 0) + { + iVar6 = this->unk_37; + } + else + { + iVar6 = this->unk_4a[i]; + } + + func_02010f98( + (u16 *)(gpActiveScreenSt->tilemap[this->unk_2c]) + (this->unk_36 * i + this->unk_34 + 1) + + ((this->unk_35 + 1) * 0x20), + (u16)(this->unk_36 - 2), (u16)(iVar6 - 2)); + } + + gpActiveScreenSt->unk_3e |= 1 << this->unk_2c; + + return; +} + +s32 Menu::vfunc_cc(void) +{ + return this->unk_47; +} + +void Menu::vfunc_d0(s32 param_2) +{ + this->unk_47 = param_2; + return; +} + +s32 Menu::vfunc_d4(s32 index) +{ + s32 offset; + + if (index == -1) + { + index = this->unk_36; + } + + if (index >= 8) + { + return (index * this->vfunc_cc()) >> 2; + } + + offset = index - ((4 - this->vfunc_cc()) * 2); + + return MAX(offset, 0); +} + +struct Idk +{ + s32 a; + s32 b; + s32 c; + s32 d; +}; +EC void func_0202a718(void *, s32, s32, struct Idk *); + +void Menu::vfunc_f0(s32 arg1, s32 arg2, s32 arg3, s32 arg4) +{ + struct Idk sp; + sp.a = arg4; + sp.b = this->unk_1c; + sp.c = this->unk_20; + sp.d = this->unk_36; + func_0202a718(gpActiveScreenSt->tilemap[this->unk_30], arg1, arg2, &sp); +} + +void Menu::vfunc_e8(void) +{ + s32 bVar1; + s32 iVar2; + s32 iVar3; + s32 iVar4; + s32 iVar5; + s32 iVar6; + + iVar2 = this->vfunc_d4(-1); + + iVar5 = (this->unk_36 >> 1) - (iVar2 >> 1); + + if (iVar2 >= 2) + { + iVar3 = IntSys_Div(this->unk_3a + this->unk_48 - 1, this->unk_48); + + for (iVar6 = 0; iVar6 < iVar3; iVar6++) + { + if (iVar6 == 0) + { + bVar1 = this->unk_37; + } + else + { + bVar1 = this->unk_4a[iVar6]; + } + + this->vfunc_f0(iVar5 + this->unk_36 * iVar6 + this->unk_34, this->unk_35, iVar2, bVar1); + + iVar4 = this->unk_38; + + if ((iVar4 >= (this->unk_48 * iVar6)) && (iVar4 < (this->unk_48 * (iVar6 + 1)))) + { + MenuItemState * mis = &this->unk_0c[iVar4]; + this->vfunc_fc( + iVar5 + this->unk_36 * iVar6 + this->unk_34 + 1, mis->unk_05, iVar2 - 2, mis->unk_07); + } + } + } + + gpActiveScreenSt->unk_3e |= 1 << this->unk_30; + + return; +} + +EC void func_0202b260(void *, s32, s32, s32, s32); + +void Menu::vfunc_f4(s32 param_2, s32 param_3, s32 param_4, s32 param_5) +{ + func_0202b260(gpActiveScreenSt->tilemap[this->unk_30], param_2, param_3, param_4, param_5); + return; +} + +void Menu::vfunc_ec(void) +{ + s32 r4; + s32 bVar2; + s32 r5; + s32 r6; + s32 r7; + + r5 = this->vfunc_d4(-1); + + r4 = ((this->unk_36 >> 1) - (r5 >> 1)); + + r7 = IntSys_Div(this->unk_3a + this->unk_48 - 1, this->unk_48); + + for (r6 = 0; r6 < r7; r6++) + { + if (r6 == 0) + { + bVar2 = this->unk_37; + } + else + { + bVar2 = this->unk_4a[r6]; + } + + this->vfunc_f4(r4 + (this->unk_36 * r6 + this->unk_34), this->unk_35, r5, bVar2); + } + + gpActiveScreenSt->unk_3e |= 1 << this->unk_30; + + return; +} + +void Menu::vfunc_fc(s32 param_2, s32 param_3, s32 param_4, s32 param_5) +{ + this->vfunc_f8(gpActiveScreenSt->tilemap[this->unk_30], param_2, param_3, param_4, param_5); + return; +} + +EC void func_0202ad68(void *, s32, s32, s32, s32, s32, s32, s32, s32); + +void Menu::vfunc_f8(void * param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6) +{ + func_0202ad68(param_2, param_3, param_4, param_5, param_6, this->unk_1c, this->unk_20, 0, 0); + return; +} + +EC void func_0202b014(void *, s32, s32, s32, s32); + +void Menu::vfunc_100(s32 param_2, s32 param_3, s32 param_4, s32 param_5) +{ + func_0202b014(gpActiveScreenSt->tilemap[this->unk_30], param_2, param_3, param_4, param_5); + return; +} + +void Menu::vfunc_108(s32 param_2, s32 param_3, s32 param_4, s32 param_5) +{ + this->vfunc_104(gpActiveScreenSt->tilemap[this->unk_30], param_2, param_3, param_4, param_5); + return; +} + +EC void func_0202b1e4(void *, s32, s32, s32, s32, s32, s32); + +void Menu::vfunc_104(void * param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6) +{ + func_0202b1e4(param_2, param_3, param_4, param_5, param_6, this->unk_1c, this->unk_20); + return; +} + +s32 Menu::vfunc_10c(void) +{ + return this->unk_10->proc_lockCnt; +} + +void Menu::vfunc_110(void) +{ + this->_0202f040(0, 0, 0); +} + +void Menu::_0202f020(s32 param_2, s32 param_3) +{ + this->_0202f040(param_2, param_3, 1); +} + +void Menu::_0202f030(s32 param_2, s32 param_3) +{ + this->_0202f040(param_2, param_3, 2); +} + +EC void func_0202b538(u16, u16, u32, u32); +EC void func_0202b624(u16, u16, u32, u32); +EC void func_0202b31c(u16, u16, u32, u32); + +void Menu::_0202f040(s32 param_2, s32 param_3, s32 param_4) +{ + s32 sVar1; + s32 sVar2; + s32 a; + s32 r3; + u32 bVar3; + u32 bVar4; + u32 bVar5; + s32 iVar6; + s32 iVar7; + MenuItemState * pMVar8; + MenuItemState * pMVar9; + s32 iVar10; + s32 iVar11; + + switch (param_4) + { + case 0: + iVar10 = param_3 - 8; + break; + + case 1: + iVar10 = param_3 - 0x20; + break; + + case 2: + iVar10 = param_3 - 0x18; + break; + } + + pMVar8 = this->unk_0c; + bVar3 = pMVar8[this->unk_39].unk_04; + iVar6 = pMVar8[this->unk_39].unk_00->vfunc_cc(); + + pMVar9 = this->unk_0c; + bVar4 = pMVar8[this->unk_39].unk_05; + iVar11 = pMVar9[this->unk_38].unk_04 * 8; + iVar7 = pMVar9[this->unk_38].unk_00->vfunc_cc(); + iVar7 = iVar7 * 4 + pMVar9[this->unk_38].unk_05 * 8; + + if (this->unk_3f == 0) + { + iVar11 = iVar11 + ((bVar3 * 8 + bVar5 * -8) >> 1); + iVar7 = iVar7 + (((iVar6 * 4 + bVar4 * 8) - iVar7) >> 1); + } + + iVar11 = param_2 - 0x10 + iVar11; + iVar10 = iVar10 + iVar7; + + a = this->vfunc_10c(); + + switch (param_4) + { + case 0: + r3 = a ? this->unk_42 + 1 : this->unk_42; + func_0202b31c( + iVar11, iVar10, + (this->unk_28 << 0xc) | (this->unk_41 << 0x1e) >> 0x14 | + (this->unk_24 >> gpActiveScreenSt->dispIo->dispcnt.bit_13_14) & 0x3ffU, + r3); + break; + + case 1: + r3 = a ? this->unk_42 + 1 : this->unk_42; + func_0202b538( + iVar11, iVar10, + (this->unk_28 << 0xc) | (this->unk_41 << 0x1e) >> 0x14 | + (this->unk_24 >> gpActiveScreenSt->dispIo->dispcnt.bit_13_14) & 0x3ffU, + r3); + break; + + case 2: + r3 = a ? this->unk_42 + 1 : this->unk_42; + func_0202b624( + iVar11, iVar10, + (this->unk_28 << 0xc) | (this->unk_41 << 0x1e) >> 0x14 | + (this->unk_24 >> gpActiveScreenSt->dispIo->dispcnt.bit_13_14) & 0x3ffU, + r3); + break; + } + + return; +} + +void Menu::vfunc_118(void) +{ + return; +} + +EC void Menu::vfunc_08(void) +{ + s32 iVar1; + s32 iVar2; + s32 iVar3; + MenuItemState * pMVar4; + + iVar1 = 0; + iVar2 = iVar1; + for (pMVar4 = this->unk_0c, iVar3 = 0; iVar3 < this->unk_3a; iVar3++, pMVar4++) + { + pMVar4->unk_04 = 1; + + iVar1 = pMVar4->unk_00->vfunc_c8(pMVar4); + + if (iVar1 <= iVar2) + { + iVar1 = iVar2; + } + + iVar2 = iVar1; + } + + if (this->unk_36 == -1) + { + this->unk_36 = iVar1 + 2; + } + + for (pMVar4 = this->unk_0c, iVar3 = 0; iVar1 < this->unk_3a; iVar3++, pMVar4++) + { + pMVar4->unk_06 = this->unk_36 - 2; + } + + return; +} + +void Menu::vfunc_0c(void) +{ + u32 bVar1; + s32 cVar2; + MenuItemState * pMVar3; + s32 cVar4; + s32 i; + u32 uVar6; + s32 iVar7; + + cVar2 = 0; + cVar4 = 0; + iVar7 = 0; + uVar6 = 0; + + for (i = 0, pMVar3 = this->unk_0c; i < this->unk_3a; i++, pMVar3++) + { + if (uVar6 == 0) + { + cVar2 = 0; + } + + pMVar3->unk_05 = cVar2 + 1; + + bVar1 = pMVar3->unk_00->vfunc_cc(); + + pMVar3->unk_07 = bVar1; + cVar4 = cVar2 + bVar1; + + if (uVar6 != this->unk_48 - 1) + { + cVar4 = cVar4 + pMVar3->unk_00->vfunc_d0(); + } + + uVar6 = uVar6 + 1; + + if (uVar6 == this->unk_48) + { + if (iVar7 == 0) + { + if (this->unk_37 == -1) + { + this->unk_37 = cVar4 + 2; + } + } + else if (this->unk_4a[iVar7] == -1) + { + this->unk_4a[iVar7] = cVar4 + 2; + } + + uVar6 = 0; + iVar7 = iVar7 + 1; + } + } + + if (uVar6 == 0) + { + return; + } + + if (iVar7 == 0) + { + if (this->unk_37 == -1) + { + this->unk_37 = cVar4 + 2; + } + + return; + } + + if (this->unk_4a[iVar7] == -1) + { + this->unk_4a[iVar7] = cVar4 + 2; + } + + return; +} + +void Menu::vfunc_10(void) +{ + this->vfunc_08(); + this->vfunc_0c(); + + return; +} + +EC void Menu::vfunc_14(void) +{ + s32 iVar1; + + if (this->unk_34 == -1) + { + iVar1 = IntSys_Div(this->unk_3a + this->unk_48 - 1, this->unk_48); + this->unk_34 = ((u32)(0x20 - ((this->unk_36 * iVar1 + 1) & ~1)) >> 1); + } + + if (this->unk_35 == -1) + { + this->unk_35 = ((u32)(0x18 - ((this->unk_37 + 1) & ~1)) >> 1); + } + + return; +} + +void Menu::vfunc_18(void) +{ + MenuItemState * pMVar1; + s32 i; + u32 uVar3 = 0; + u32 cVar4 = 0; + + for (i = 0, pMVar1 = this->unk_0c; i < this->unk_3a; i++, pMVar1++) + { + uVar3++; + + pMVar1->unk_04 = this->unk_36 * cVar4 + this->unk_34 + pMVar1->unk_04; + pMVar1->unk_05 = this->unk_35 + pMVar1->unk_05; + + if (uVar3 == this->unk_48) + { + uVar3 = 0; + cVar4++; + } + } + + return; +} + +void Menu::vfunc_1c(void) +{ + this->vfunc_10(); + this->vfunc_14(); + this->vfunc_18(); + + return; +} + +void Menu::vfunc_11c(void) +{ + s32 i; + + for (i = 0; i < this->unk_3a; i++) + { + this->unk_0c[i].unk_00->vfunc_90(this, &this->unk_0c[i]); + } + + return; +} + +void Menu::vfunc_120(void) +{ + this->vfunc_ec(); + + if (++this->unk_47 > 4) + { + this->unk_47 = 4; + } + + this->vfunc_e8(); + this->vfunc_b8(this->unk_47); + + if (this->unk_47 == 4) + { + Proc_Break(this->unk_10, 1); + } + + return; +} + +EC void func_0202fc30(Menu * param_1, s32 param_2, s32 param_3); + +void Menu::_0202f674(void) +{ + this->unk_0c[this->unk_38].unk_00->vfunc_b0(this, &this->unk_0c[this->unk_38]); + this->unk_0c[this->unk_38].unk_00->vfunc_78(this, &this->unk_0c[this->unk_38]); + return; +} + +void Menu::_0202f6d0(void) +{ + if (this->unk_45 != 0) + { + func_0202fc30(this, 0, 1); + } + + this->vfunc_64(); + + this->unk_0c[this->unk_38].unk_00->vfunc_9c(this, &this->unk_0c[this->unk_38]); + + return; +} + +void Menu::_0202f72c(void) +{ + MenuItemState * pMVar1; + s32 iVar2; + + if (this->unk_45 != 0) + { + func_0202fc30(this, 0, 1); + } + + this->vfunc_110(); + this->vfunc_118(); + this->vfunc_114(); + + for (pMVar1 = this->unk_0c, iVar2 = 0; iVar2 < this->unk_3a; iVar2++, pMVar1++) + { + pMVar1->unk_00->vfunc_a8(this, pMVar1); + } + + this->unk_39 = this->unk_38; + this->unk_3f = 0; + + return; +} + +void Menu::_0202f7d0(void) +{ + this->unk_0c[this->unk_38].unk_00->vfunc_84(this, &this->unk_0c[this->unk_38]); + return; +} + +void Menu::vfunc_124(void) +{ + this->vfunc_ec(); + + this->unk_47--; + + this->vfunc_e8(); + + this->vfunc_b8(this->unk_47); + + if (this->unk_47 == 0) + { + Proc_Break(this->unk_10, 1); + } + + return; +} + +s32 Menu::_0202f860(void) +{ + MenuItem * piVar1; + + MenuItem ** piVar3 = this->unk_08; + s32 iVar4 = 0; + + for (piVar1 = *piVar3; piVar1 != NULL; piVar1 = *++piVar3) + { + iVar4 += piVar1->vfunc_d4(); + } + + return iVar4; +} + +void Menu::vfunc_12c(void) +{ + this->unk_0c = static_cast(gHeap.Alloc(this->_0202f860() * sizeof(MenuItemState))); + return; +} + +void Menu::_0202f8c4(void) +{ + MenuItem * piVar1; + MenuItem ** piVar4; + s32 iVar5; + s32 iVar6; + s32 i; + s32 iVar2; + s32 uVar11; + + piVar4 = this->unk_08; + + if (this->unk_0c == NULL) + { + this->vfunc_12c(); + } + + iVar6 = 0; + iVar5 = 0; + + this->unk_48 = this->unk_49; + + for (piVar1 = *piVar4; piVar1 != NULL; piVar1 = *++piVar4) + { + iVar2 = (*piVar4)->vfunc_d4(); + + for (i = 0; i < iVar2; i++) + { + uVar11 = (*piVar4)->vfunc_18(iVar5); + + if (!(iVar6 == 0 && this->unk_46 == 0 && (uVar11 & 7) == 3) && (uVar11 & 7) != 2) + { + this->unk_0c[i].unk_00 = *piVar4; + + this->unk_0c[i].unk_09 = uVar11; + this->unk_0c[i].unk_08 = iVar5; + + if (this->unk_38 == iVar5 && uVar11 == 3) + { + this->unk_38++; + } + else if ((uVar11 & 8) != 0) + { + this->unk_38 = iVar6; + } + + iVar6++; + } + + iVar5++; + } + } + + if (this->unk_38 >= iVar6) + { + this->unk_38 = iVar6 - 1; + } + + this->unk_3a = iVar6; + + if ((this->unk_48 == 0) || (this->unk_48 >= this->unk_3a)) + { + this->unk_48 = this->unk_3a; + } + + this->vfunc_1c(); + + this->unk_39 = this->unk_38; + + return; +} + +EC void func_0202a5e0(void *, s32, s32); + +void Menu::vfunc_128(void) +{ + func_0202a4dc(this->unk_18, 0); + func_0202a5e0(gpActiveScreenSt->bgTiles[this->unk_30], this->unk_1c, this->unk_20); + func_0202b294((void *)gpActiveScreenSt->objVram, this->unk_24, this->unk_28); + return; +} + +// clang-format off + +struct ProcCmd ProcScr_ProcMenu[] = +{ + PROC_NAME, + PROC_SLEEP(0), + + PROC_CALL(ProcMenu_0202d6e4), + PROC_REPEAT(ProcMenu_0202d6cc), + PROC_06(0, ProcMenu_0202d6bc), + PROC_CALL(ProcMenu_0202d688), + +PROC_LABEL(0), + PROC_REPEAT(ProcMenu_0202d678), + +PROC_LABEL(1), + PROC_CALL(ProcMenu_0202d630), + PROC_REPEAT(ProcMenu_0202d618), + + PROC_END, +}; + +// clang-format on + +EC void StartMenu(Menu * param_1, MenuItem ** param_2, s32 param_3) +{ + param_1->unk_08 = param_2; + + param_1->vfunc_00(); + + if (param_3 != 0) + { + param_1->vfunc_128(); + } + + param_1->unk_49 = param_1->unk_48; + + param_1->_0202f8c4(); + + param_1->vfunc_04(); + + if (param_1->unk_04 != NULL) + { + param_1->unk_10 = new (Proc_StartBlocking(ProcScr_ProcMenu, param_1->unk_04->unk_10)) ProcMenu(param_1); + } + else + { + param_1->unk_10 = new (Proc_Start(ProcScr_ProcMenu, PROC_TREE_9)) ProcMenu(param_1); + } + return; +} + +EC void StartChildMenu(Menu * param_1, MenuItem ** param_2, ProcPtr param_3, u32 param_4, u8 param_5) +{ + param_1->unk_08 = param_2; + + if ((!IsRootProcess((struct Proc *)param_3)) && (func_020190c4((struct Proc *)param_3) == ProcScr_ProcMenu)) + { + param_1->unk_04 = static_cast(param_3)->unk_38; + } + + param_1->vfunc_00(); + + if (param_5 != 0) + { + param_1->vfunc_128(); + } + + param_1->unk_49 = param_1->unk_48; + + param_1->_0202f8c4(); + + param_1->vfunc_04(); + + if (param_4) + { + param_1->unk_10 = new (Proc_StartBlocking(ProcScr_ProcMenu, param_3)) ProcMenu(param_1); + } + else + { + param_1->unk_10 = new (Proc_Start(ProcScr_ProcMenu, param_3)) ProcMenu(param_1); + } +} + +EC void func_0202fc30(Menu * param_1, s32 param_2, s32 param_3) +{ + param_1->unk_0c[param_1->unk_38].unk_00->vfunc_84(param_1, ¶m_1->unk_0c[param_1->unk_38]); + + param_1->vfunc_dc(); + param_1->vfunc_ec(); + + if (param_2 != 0) + { + param_1->unk_34 = param_1->unk_35 = -1; + } + + if (param_3 != 0) + { + param_1->unk_36 = param_1->unk_37 = -1; + } + + param_1->_0202f8c4(); + + param_1->vfunc_e8(); + param_1->vfunc_d8(); + + param_1->unk_3f = 1; + + param_1->unk_0c[param_1->unk_38].unk_00->vfunc_78(param_1, ¶m_1->unk_0c[param_1->unk_38]); + + param_1->unk_45 = 0; + + return; +} + +EC void func_0202fd1c(Menu * param_1, s32 param_2, s32 param_3) +{ + if (param_3 != 0 || param_2 != param_1->unk_38) + { + param_1->unk_0c[param_1->unk_38].unk_00->vfunc_b8(param_1, ¶m_1->unk_0c[param_1->unk_38]); + param_1->unk_0c[param_1->unk_38].unk_00->vfunc_84(param_1, ¶m_1->unk_0c[param_1->unk_38]); + + param_1->vfunc_ec(); + + param_1->unk_39 = param_2; + param_1->unk_38 = param_2; + + param_1->vfunc_e8(); + + param_1->unk_0c[param_1->unk_38].unk_00->vfunc_78(param_1, ¶m_1->unk_0c[param_1->unk_38]); + param_1->unk_0c[param_1->unk_38].unk_00->vfunc_b4(param_1, ¶m_1->unk_0c[param_1->unk_38]); + + param_1->unk_3f = 1; + } + + return; +} + +EC void func_02033f98(void); +EC BOOL func_02033f54(ProcMenu *); + +EC BOOL func_0202fe14(ProcMenu * param_1) +{ + if (func_020190c4((struct Proc *)param_1) == ProcScr_ProcMenu) + { + return TRUE; + } + + return func_02033f54(param_1) != 0; +} + +EC void func_0202fe4c(ProcMenu * param_1) +{ + ProcMenu * p; + + Proc_Goto(param_1, 1, 0); + + p = (ProcMenu *)func_020190cc((struct Proc *)param_1); + if (p == NULL) + { + return; + } + + if (func_0202fe14(p) == 0) + { + return; + } + + func_02019124((struct Proc *)param_1); + + return; +} + +EC void func_0202fe88(ProcMenu * param_1) +{ + Proc_Goto(param_1, 1, 0); + return; +} + +EC void func_0202fe9c(Menu * param_1, s32 param_2) +{ + if (param_2 != 0) + { + func_0202fe88(param_1->unk_10); + } + else + { + func_0202fe4c(param_1->unk_10); + } + + return; +} + +EC void func_0202febc(s32 param_1) +{ + if (param_1 != 0) + { + Proc_ForEach(ProcScr_ProcMenu, (ProcFunc)func_0202fe88); + } + else + { + Proc_ForEach(ProcScr_ProcMenu, (ProcFunc)func_0202fe4c); + } + + func_02033f98(); + + return; +} + +EC void func_0202fef8(Menu * param_1) +{ + Proc_End(param_1->unk_10); + return; +} + +EC void func_02033fc4(void); + +EC void func_0202ff08(void) +{ + Proc_EndEach(ProcScr_ProcMenu); + func_02033fc4(); + return; +} + +EC void LockMenu(Menu * param_1) +{ + Proc_Lock((struct Proc *)param_1->unk_10); + return; +} + +EC void UnlockMenu(Menu * param_1) +{ + Proc_Release((struct Proc *)param_1->unk_10); + return; +} + +EC BOOL IsMenuLocked(Menu * param_1) +{ + return IsProcLocked((struct Proc *)param_1->unk_10); +} + +EC BOOL func_0202ff50(Menu * param_1) +{ + return func_02018f5c((struct Proc *)param_1->unk_10) != NULL; +} + +EC BOOL IsMenuActive(void) +{ + return Proc_Find(ProcScr_ProcMenu) != NULL; +} + +EC Menu * func_0202ff8c(ProcMenu * param_1) +{ + if (param_1 == NULL) + { + param_1 = static_cast(Proc_Find(ProcScr_ProcMenu)); + } + + if (param_1 == NULL) + { + return NULL; + } + else + { + return param_1->unk_38; + } +} + +EC Menu * func_0202ffb4(ProcPtr param_1) +{ + ProcMenu * proc = static_cast((void *)func_02018d9c(ProcScr_ProcMenu, (struct Proc *)param_1)); + + if (proc != NULL) + { + return proc->unk_38; + } + + return NULL; +} + +EC Menu * func_0202ffd8(ProcPtr param_1) +{ + ProcMenu * proc = static_cast((void *)func_02018df4(ProcScr_ProcMenu, (struct Proc *)param_1)); + + if (proc != NULL) + { + return proc->unk_38; + } + + return NULL; +} + +BOOL SplitMenu::vfunc_b0(MenuItemState * arg1, s32 arg2, s32 arg3) +{ + if ((arg2 < ((arg1->unk_04) * 8)) || (arg2 >= ((arg1->unk_04 + arg1->unk_06) * 8))) + { + return FALSE; + } + + if ((arg3 < (arg1->unk_05 * 8)) || (arg3 >= ((arg1->unk_05 + arg1->unk_07) * 8))) + { + return FALSE; + } + + return TRUE; +} + +void SplitMenu::vfunc_08(void) +{ + s32 iVar1; + s32 iVar2; + s32 iVar3; + MenuItemState * pMVar4; + + iVar1 = 0; + iVar2 = iVar1; + for (pMVar4 = this->unk_0c, iVar3 = 0; iVar3 < this->unk_3a; iVar3++, pMVar4++) + { + pMVar4->unk_04 = 1; + + iVar1 = pMVar4->unk_00->vfunc_c8(pMVar4); + + if (iVar1 <= iVar2) + { + iVar1 = iVar2; + } + + iVar2 = iVar1; + } + + if (this->unk_36 == -1) + { + this->unk_36 = iVar1 + 2; + } + + for (pMVar4 = this->unk_0c, iVar3 = 0; iVar1 < this->unk_3a; iVar3++, pMVar4++) + { + pMVar4->unk_06 = this->unk_36 - 2; + } + + return; +} + +void SplitMenu::vfunc_0c(void) +{ + u32 bVar1; + s32 cVar2; + MenuItemState * pMVar3; + s32 cVar4; + s32 i; + u32 uVar6; + s32 iVar7; + + cVar2 = 0; + cVar4 = 0; + iVar7 = 0; + uVar6 = 0; + + for (i = 0, pMVar3 = this->unk_0c; i < this->unk_3a; i++, pMVar3++) + { + if (uVar6 == 0) + { + cVar2 = 0; + } + + pMVar3->unk_05 = cVar2 + 1; + + bVar1 = pMVar3->unk_00->vfunc_cc(); + + pMVar3->unk_07 = bVar1; + cVar4 = cVar2 + bVar1; + + if (uVar6 != this->unk_48 - 1) + { + cVar4 = cVar4 + pMVar3->unk_00->vfunc_d0(); + } + + uVar6 = uVar6 + 1; + + if (uVar6 == this->unk_48) + { + if (iVar7 == 0) + { + if (this->unk_37 == -1) + { + this->unk_37 = cVar4; + } + } + else if (this->unk_4a[iVar7] == -1) + { + this->unk_4a[iVar7] = cVar4; + } + + uVar6 = 0; + iVar7 = iVar7 + 1; + } + } + + if (uVar6 == 0) + { + return; + } + + if (iVar7 == 0) + { + if (this->unk_37 == -1) + { + this->unk_37 = cVar4; + } + + return; + } + + if (this->unk_4a[iVar7] == -1) + { + this->unk_4a[iVar7] = cVar4; + } + + return; +} diff --git a/src/ov000/arena.cpp b/src/ov000/arena.cpp index 66d72b3..e29b056 100644 --- a/src/ov000/arena.cpp +++ b/src/ov000/arena.cpp @@ -1164,11 +1164,11 @@ namespace map class BMapDialogYesNo : public DialogYesNo { public: - virtual void vfunc_00(/* */); // func_ov000_021be6d8 - virtual void vfunc_a0(/* */); // func_ov000_021be934 - virtual void vfunc_ac(/* */); // func_ov000_021be91c - virtual void vfunc_130(/* */); // func_ov000_021bea74 - virtual void vfunc_134(/* */); // func_ov000_021beab0 + /* 000 */ virtual void vfunc_00(void); // func_ov000_021be6d8 + /* 0A0 */ virtual BOOL vfunc_a0(void); // func_ov000_021be934 + /* 0AC */ virtual s32 vfunc_ac(void); // func_ov000_021be91c + /* 130 */ virtual void vfunc_130(/* ? */); // func_ov000_021bea74 + /* 134 */ virtual void vfunc_134(/* ? */); // func_ov000_021beab0 }; } // namespace map @@ -1176,14 +1176,14 @@ class BMapDialogYesNo : public DialogYesNo class DI_ArenaYes : public DialogItemYes { public: - virtual s32 vfunc_1c(void); // func_ov000_021d9940 + /* 01C */ virtual s32 vfunc_1c(void); // func_ov000_021d9940 }; class DI_ArenaNo : public DialogItemNo { public: - virtual s32 vfunc_14(void); // func_ov000_021d9938 - virtual s32 vfunc_1c(void); // func_ov000_021d9924 + /* 014 */ virtual s32 vfunc_14(void); // func_ov000_021d9938 + /* 01C */ virtual s32 vfunc_1c(void); // func_ov000_021d9924 }; EC void func_ov000_021d8d68(struct ArenaProc * proc) diff --git a/src/ov005/prep_main_menu.cpp b/src/ov005/prep_main_menu.cpp index 777c1c0..5ec16f3 100644 --- a/src/ov005/prep_main_menu.cpp +++ b/src/ov005/prep_main_menu.cpp @@ -36,18 +36,18 @@ class SallyMenu : public Menu virtual ~SallyMenu(); - virtual void vfunc_00(void); - virtual s32 vfunc_24(void *, s32); - virtual s32 vfunc_28(void); - virtual s32 vfunc_58(void); - virtual void vfunc_a0(void); - virtual void vfunc_a8(void); - virtual void vfunc_e8(void); - virtual void vfunc_ec(void); - virtual void vfunc_120(void); - virtual void vfunc_124(void); - virtual void vfunc_130(/* ? */); // func_ov005_02206800 - virtual void vfunc_134(/* ? */); // func_ov005_02206814 + /* 000 */ virtual void vfunc_00(void); + /* 024 */ virtual s32 vfunc_24(void *, s32); + /* 028 */ virtual s32 vfunc_28(void); + /* 058 */ virtual s32 vfunc_58(void); + /* 0A0 */ virtual BOOL vfunc_a0(void); + /* 0A8 */ virtual BOOL vfunc_a8(void); + /* 0E8 */ virtual void vfunc_e8(void); + /* 0EC */ virtual void vfunc_ec(void); + /* 120 */ virtual void vfunc_120(void); + /* 124 */ virtual void vfunc_124(void); + /* 130 */ virtual void vfunc_130(/* ? */); // func_ov005_02206800 + /* 134 */ virtual void vfunc_134(/* ? */); // func_ov005_02206814 }; class MIS_SallyEnd : public MenuItem @@ -329,18 +329,18 @@ class SallyDialogYesNo : public DialogYesNo } } - virtual void vfunc_00(void); - virtual void vfunc_a0(void); - virtual void vfunc_c0(void); - virtual void vfunc_130(/* ? */); // func_ov005_02206700 - virtual void vfunc_134(/* ? */); // func_ov005_0220673c + /* 000 */ virtual void vfunc_00(void); + /* 0A0 */ virtual BOOL vfunc_a0(void); + /* 0C0 */ virtual void vfunc_c0(void); + /* 130 */ virtual void vfunc_130(/* ? */); // func_ov005_02206700 + /* 134 */ virtual void vfunc_134(/* ? */); // func_ov005_0220673c }; class SallyCancelDialogYesNo : public SallyDialogYesNo { - virtual void vfunc_c0(void); - virtual void vfunc_130(/* ? */); // func_ov005_02206780 - virtual void vfunc_134(/* ? */); // func_ov005_022067bc + /* 0C0 */ virtual void vfunc_c0(void); + /* 130 */ virtual void vfunc_130(/* ? */); // func_ov005_02206780 + /* 134 */ virtual void vfunc_134(/* ? */); // func_ov005_022067bc }; } // namespace sally @@ -362,7 +362,7 @@ EC void func_ov005_02205518(char * str) EC void func_020303bc(DialogYesNo *, char *, void *, ProcPtr, s32, s32); -EC void func_ov005_022055d8(sally::MMenu * proc) +EC void func_ov005_022055d8(ProcMenu * proc) { static sally::DI_SallyEndYes sSallyEndYes; static sally::DI_SallyEndNo sSallyEndNo; @@ -382,7 +382,7 @@ EC void func_ov005_022055d8(sally::MMenu * proc) return; } -EC void func_ov005_022056d8(sally::MMenu * proc) +EC void func_ov005_022056d8(ProcMenu * proc) { static sally::DI_SallyCancelYes sSallyCancelYes; static sally::DI_SallyEndNo sSallyEndNo; @@ -402,7 +402,7 @@ EC void func_ov005_022056d8(sally::MMenu * proc) return; } -EC void func_0202fb38(Menu *, void *, ProcPtr, u32, u32); +EC void StartChildMenu(Menu *, void *, ProcPtr, u32, u32); // TODO: Member function EC void func_ov005_022057e4(sally::MMenu * proc) @@ -431,7 +431,7 @@ EC void func_ov005_022057e4(sally::MMenu * proc) // clang-format on proc->unk_38 = new sally::SallyMenu(); - func_0202fb38(proc->unk_38, data_ov005_022132ac, proc, 0, 0); + StartChildMenu(proc->unk_38, data_ov005_022132ac, proc, 0, 0); proc->unk_38->unk_43 = 0; return; @@ -519,7 +519,7 @@ s32 sally::MIS_SallyEnd::vfunc_24(Menu * param_2, MenuItemState * param_3) { if ((param_3->unk_09 & 7) != 1) { - func_ov005_022055d8(static_cast(param_2->unk_10)); + func_ov005_022055d8(param_2->unk_10); return 0x40; } @@ -836,20 +836,19 @@ char * sally::MIS_SallySelect::vfunc_00(void) return func_02039e10("MSM_ユニット"); } -void sally::SallyMenu::vfunc_a0(void) +BOOL sally::SallyMenu::vfunc_a0(void) { if (GetSallyMMenu()->unk_40 != NULL) { - GetSallyMMenu()->unk_40->func_02035450(); + return GetSallyMMenu()->unk_40->func_02035450(); } - return; + return FALSE; } -void sally::SallyMenu::vfunc_a8(void) +BOOL sally::SallyMenu::vfunc_a8(void) { - GetSallyMMenu()->unk_3c->func_02035450(); - return; + return GetSallyMMenu()->unk_3c->func_02035450(); } s32 sally::SallyMenu::vfunc_58(void) @@ -862,7 +861,7 @@ s32 sally::SallyMenu::vfunc_58(void) } } - func_ov005_022055d8(static_cast(this->unk_10)); + func_ov005_022055d8(this->unk_10); return 0x40; } @@ -871,7 +870,7 @@ s32 sally::SallyMenu::vfunc_28(void) { if (data_ov005_02217560->unk_11 != 0) { - func_ov005_022056d8(static_cast(this->unk_10)); + func_ov005_022056d8(this->unk_10); return 0x80; } @@ -970,17 +969,14 @@ s32 sally::DI_SallyEndYes::vfunc_1c(void) return 0x1041; } -void sally::SallyDialogYesNo::vfunc_a0(void) +BOOL sally::SallyDialogYesNo::vfunc_a0(void) { if (GetSallyMMenu()->unk_40 != NULL) { - GetSallyMMenu()->unk_40->func_02035450(); - return; + return GetSallyMMenu()->unk_40->func_02035450(); } - GetSallyMMenu()->unk_3c->func_02035450(); - - return; + return GetSallyMMenu()->unk_3c->func_02035450(); } void sally::SallyDialogYesNo::vfunc_00(void)