From 3a7cde9f33d1e497c67e3cf0143470078ddd0b12 Mon Sep 17 00:00:00 2001 From: kabiskac Date: Sun, 4 Aug 2024 18:40:58 +0200 Subject: [PATCH] Named most things in presentDll --- config/GMPE01_00/rels/present/symbols.txt | 175 ++-- include/REL/present.h | 89 +- src/REL/present/camera.c | 291 +++--- src/REL/present/common.c | 260 +++-- src/REL/present/init.c | 214 ++-- src/REL/present/main.c | 257 ++--- src/REL/present/present.c | 1142 ++++++++++++--------- 7 files changed, 1301 insertions(+), 1127 deletions(-) diff --git a/config/GMPE01_00/rels/present/symbols.txt b/config/GMPE01_00/rels/present/symbols.txt index 08892e5b..a5b07fdb 100644 --- a/config/GMPE01_00/rels/present/symbols.txt +++ b/config/GMPE01_00/rels/present/symbols.txt @@ -1,75 +1,75 @@ _prolog = .text:0x00000000; // type:function size:0x54 scope:global _epilog = .text:0x00000054; // type:function size:0x4C scope:global ObjectSetup = .text:0x000000A0; // type:function size:0xA4 -fn_1_144 = .text:0x00000144; // type:function size:0x110 -fn_1_254 = .text:0x00000254; // type:function size:0xE0 scope:local -fn_1_334 = .text:0x00000334; // type:function size:0x128 -fn_1_45C = .text:0x0000045C; // type:function size:0xF4 scope:local -fn_1_550 = .text:0x00000550; // type:function size:0x34 -fn_1_584 = .text:0x00000584; // type:function size:0x34 -fn_1_5B8 = .text:0x000005B8; // type:function size:0x34 -fn_1_5EC = .text:0x000005EC; // type:function size:0xC8 scope:local -fn_1_6B4 = .text:0x000006B4; // type:function size:0x23C -fn_1_8F0 = .text:0x000008F0; // type:function size:0x30 -fn_1_920 = .text:0x00000920; // type:function size:0x84 -fn_1_9A4 = .text:0x000009A4; // type:function size:0x84 -fn_1_A28 = .text:0x00000A28; // type:function size:0x84 scope:local -fn_1_AAC = .text:0x00000AAC; // type:function size:0x30 scope:local -fn_1_ADC = .text:0x00000ADC; // type:function size:0x30 scope:local -fn_1_B0C = .text:0x00000B0C; // type:function size:0x30 scope:local -fn_1_B3C = .text:0x00000B3C; // type:function size:0x30 scope:local -fn_1_B6C = .text:0x00000B6C; // type:function size:0x8C -fn_1_BF8 = .text:0x00000BF8; // type:function size:0x28 -fn_1_C20 = .text:0x00000C20; // type:function size:0x578 scope:local -fn_1_1198 = .text:0x00001198; // type:function size:0x200 scope:local -fn_1_1398 = .text:0x00001398; // type:function size:0xC0 scope:local -fn_1_1458 = .text:0x00001458; // type:function size:0x32C -fn_1_1784 = .text:0x00001784; // type:function size:0x88 -fn_1_180C = .text:0x0000180C; // type:function size:0x44 -fn_1_1850 = .text:0x00001850; // type:function size:0x1C -fn_1_186C = .text:0x0000186C; // type:function size:0xBC -fn_1_1928 = .text:0x00001928; // type:function size:0x680 scope:local -fn_1_1FA8 = .text:0x00001FA8; // type:function size:0x140 scope:local -fn_1_20E8 = .text:0x000020E8; // type:function size:0x5A4 scope:local -fn_1_268C = .text:0x0000268C; // type:function size:0x7C scope:local -fn_1_2708 = .text:0x00002708; // type:function size:0x6C scope:local -fn_1_2774 = .text:0x00002774; // type:function size:0x17C scope:local -fn_1_28F0 = .text:0x000028F0; // type:function size:0x34 scope:local -fn_1_2924 = .text:0x00002924; // type:function size:0x260 scope:local -fn_1_2B84 = .text:0x00002B84; // type:function size:0x48 scope:local -fn_1_2BCC = .text:0x00002BCC; // type:function size:0x90 scope:local -fn_1_2C5C = .text:0x00002C5C; // type:function size:0x738 scope:local -fn_1_3394 = .text:0x00003394; // type:function size:0x18 scope:local -fn_1_33AC = .text:0x000033AC; // type:function size:0x590 scope:local +PresentFadeSprite = .text:0x00000144; // type:function size:0x110 +FadeSprite = .text:0x00000254; // type:function size:0xE0 scope:local +FadeSpriteWithMultiplier = .text:0x00000334; // type:function size:0x128 +FadeModel = .text:0x0000045C; // type:function size:0xF4 scope:local +PresentPadCheck = .text:0x00000550; // type:function size:0x34 +PresentPadDStkRepCheck = .text:0x00000584; // type:function size:0x34 +PresentPadDStkCheck = .text:0x000005B8; // type:function size:0x34 +SceneMain = .text:0x000005EC; // type:function size:0xC8 scope:local +PresentCameraCreate = .text:0x000006B4; // type:function size:0x23C +PresentCameraKill = .text:0x000008F0; // type:function size:0x30 +PresentCameraTargetSet = .text:0x00000920; // type:function size:0x84 +PresentCameraFocusSet = .text:0x000009A4; // type:function size:0x84 +PresentCameraViewSet = .text:0x00000A28; // type:function size:0x84 +PresentCameraZoomGet = .text:0x00000AAC; // type:function size:0x30 +PresentCameraRotGet = .text:0x00000ADC; // type:function size:0x30 +PresentCameraPosGet = .text:0x00000B0C; // type:function size:0x30 +PresentCameraTargetGet = .text:0x00000B3C; // type:function size:0x30 +PresentCameraDoneCheck = .text:0x00000B6C; // type:function size:0x8C +ExecCameraObj = .text:0x00000BF8; // type:function size:0x28 scope:local +ExecCamera = .text:0x00000C20; // type:function size:0x578 scope:local +CameraExecDebug = .text:0x00001198; // type:function size:0x200 scope:local +CameraPrintDebug = .text:0x00001398; // type:function size:0xC0 scope:local +PresentCreate = .text:0x00001458; // type:function size:0x32C +PresentKill = .text:0x00001784; // type:function size:0x88 +PresentExecModeSet = .text:0x0000180C; // type:function size:0x44 +PresentExecModeGet = .text:0x00001850; // type:function size:0x1C +PresentSelectedIDSet = .text:0x0000186C; // type:function size:0xBC +ExecSelectRoom = .text:0x00001928; // type:function size:0x680 scope:local +ChangeRoom = .text:0x00001FA8; // type:function size:0x140 scope:local +ExecSelectPresent = .text:0x000020E8; // type:function size:0x5A4 scope:local +GetCursorPos = .text:0x0000268C; // type:function size:0x7C scope:local +SetCameraRot = .text:0x00002708; // type:function size:0x6C scope:local +RotateCamera = .text:0x00002774; // type:function size:0x17C scope:local +CameraRotationDoneCheck = .text:0x000028F0; // type:function size:0x34 scope:local +ShowHidePresents = .text:0x00002924; // type:function size:0x260 scope:local +PresentUnlocked = .text:0x00002B84; // type:function size:0x48 scope:local +UnlockedPresents = .text:0x00002BCC; // type:function size:0x90 scope:local +MoveCursor = .text:0x00002C5C; // type:function size:0x738 scope:local +TotalPresentsInRoom = .text:0x00003394; // type:function size:0x18 scope:local +ExecPresentGet = .text:0x000033AC; // type:function size:0x590 scope:local fn_1_393C = .text:0x0000393C; // type:function size:0x6C scope:local -fn_1_39A8 = .text:0x000039A8; // type:function size:0x170 -fn_1_3B18 = .text:0x00003B18; // type:function size:0x74 -fn_1_3B8C = .text:0x00003B8C; // type:function size:0x22C scope:local -fn_1_3DB8 = .text:0x00003DB8; // type:function size:0xEC scope:local -fn_1_3EA4 = .text:0x00003EA4; // type:function size:0x19C -fn_1_4040 = .text:0x00004040; // type:function size:0x40 -fn_1_4080 = .text:0x00004080; // type:function size:0x18 -fn_1_4098 = .text:0x00004098; // type:function size:0x18 -fn_1_40B0 = .text:0x000040B0; // type:function size:0x54 -fn_1_4104 = .text:0x00004104; // type:function size:0x40 -fn_1_4144 = .text:0x00004144; // type:function size:0x40 scope:local -fn_1_4184 = .text:0x00004184; // type:function size:0xC scope:local -fn_1_4190 = .text:0x00004190; // type:function size:0xC scope:local -fn_1_419C = .text:0x0000419C; // type:function size:0x20 -fn_1_41BC = .text:0x000041BC; // type:function size:0x24 scope:local -fn_1_41E0 = .text:0x000041E0; // type:function size:0x114 scope:local -fn_1_42F4 = .text:0x000042F4; // type:function size:0x240 -fn_1_4534 = .text:0x00004534; // type:function size:0x8C -fn_1_45C0 = .text:0x000045C0; // type:function size:0x44 -fn_1_4604 = .text:0x00004604; // type:function size:0x1C -fn_1_4620 = .text:0x00004620; // type:function size:0x260 scope:local -fn_1_4880 = .text:0x00004880; // type:function size:0x184 scope:local -fn_1_4A04 = .text:0x00004A04; // type:function size:0x2E8 scope:local -fn_1_4CEC = .text:0x00004CEC; // type:function size:0x104 scope:local +PresentStateCreate = .text:0x000039A8; // type:function size:0x170 +PresentStateKill = .text:0x00003B18; // type:function size:0x74 +ExecPresentView = .text:0x00003B8C; // type:function size:0x22C scope:local +ExecPresentGet = .text:0x00003DB8; // type:function size:0xEC scope:local +PresentWinCreate = .text:0x00003EA4; // type:function size:0x19C +PresentWinKill = .text:0x00004040; // type:function size:0x40 +PresentWinAnimIn = .text:0x00004080; // type:function size:0x18 +PresentWinAnimOut = .text:0x00004098; // type:function size:0x18 +PresentWinMesSet = .text:0x000040B0; // type:function size:0x54 +PresentWinInsertMesSet = .text:0x00004104; // type:function size:0x40 +PresentWinPosSet = .text:0x00004144; // type:function size:0x40 +PresentWinDispOn = .text:0x00004184; // type:function size:0xC +PresentWinDispOff = .text:0x00004190; // type:function size:0xC +PresentWinMesWait = .text:0x0000419C; // type:function size:0x20 +PresentWinChoiceSet = .text:0x000041BC; // type:function size:0x24 +ExecWindow = .text:0x000041E0; // type:function size:0x114 scope:local +PresentGuideCreate = .text:0x000042F4; // type:function size:0x240 +PresentGuideKill = .text:0x00004534; // type:function size:0x8C +PresentGuideExecModeSet = .text:0x000045C0; // type:function size:0x44 +PresentGuideExecModeGet = .text:0x00004604; // type:function size:0x1C +ExecGuideEnter = .text:0x00004620; // type:function size:0x260 scope:local +ExecGuideLeave = .text:0x00004880; // type:function size:0x184 scope:local +UpdateGuide = .text:0x00004A04; // type:function size:0x2E8 scope:local +LerpAngle = .text:0x00004CEC; // type:function size:0x104 scope:local _ctors = .ctors:0x00000000; // type:label scope:global data:4byte _dtors = .dtors:0x00000000; // type:label scope:global data:4byte -__fakeHalf = .rodata:0x00000000; // type:object size:0x4 data:float -__fakeThree = .rodata:0x00000004; // type:object size:0x4 data:float +__fakeHalf = .rodata:0x00000000; // type:object size:0x8 data:double +__fakeThree = .rodata:0x00000008; // type:object size:0x8 data:double lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x4 scope:local data:float lbl_1_rodata_14 = .rodata:0x00000014; // type:object size:0x4 scope:local data:float lbl_1_rodata_18 = .rodata:0x00000018; // type:object size:0x8 scope:local data:float @@ -95,14 +95,14 @@ lbl_1_rodata_88 = .rodata:0x00000088; // type:object size:0x4 scope:local data:f lbl_1_rodata_8C = .rodata:0x0000008C; // type:object size:0x4 scope:local data:float lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x8 scope:local data:double lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 scope:local data:float -lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x218 scope:local -lbl_1_rodata_2B8 = .rodata:0x000002B8; // type:object size:0x708 scope:local +presentMdlTbl = .rodata:0x000000A0; // type:object size:0x218 scope:local +roomTbl = .rodata:0x000002B8; // type:object size:0x708 scope:local lbl_1_rodata_9C0 = .rodata:0x000009C0; // type:object size:0x4 scope:local data:float lbl_1_rodata_9C4 = .rodata:0x000009C4; // type:object size:0x4 scope:local data:float lbl_1_rodata_9C8 = .rodata:0x000009C8; // type:object size:0x4 scope:local data:float lbl_1_rodata_9D0 = .rodata:0x000009D0; // type:object size:0x8 scope:local data:float -lbl_1_rodata_9D8 = .rodata:0x000009D8; // type:object size:0x20 scope:local -lbl_1_rodata_9F8 = .rodata:0x000009F8; // type:object size:0x28 scope:local +roomIdxTbl = .rodata:0x000009D8; // type:object size:0x20 scope:local +roomMessTbl = .rodata:0x000009F8; // type:object size:0x28 scope:local lbl_1_rodata_A20 = .rodata:0x00000A20; // type:object size:0x4 scope:local data:float lbl_1_rodata_A24 = .rodata:0x00000A24; // type:object size:0x4 scope:local data:float lbl_1_rodata_A28 = .rodata:0x00000A28; // type:object size:0x4 scope:local data:float @@ -119,7 +119,7 @@ lbl_1_rodata_A58 = .rodata:0x00000A58; // type:object size:0x4 scope:local data: lbl_1_rodata_A60 = .rodata:0x00000A60; // type:object size:0x8 scope:local data:double lbl_1_rodata_A68 = .rodata:0x00000A68; // type:object size:0x8 scope:local data:double lbl_1_rodata_A70 = .rodata:0x00000A70; // type:object size:0x4 scope:local data:float -lbl_1_rodata_A74 = .rodata:0x00000A74; // type:object size:0x28 scope:local +roomPresentOffsetTbl = .rodata:0x00000A74; // type:object size:0x28 scope:local lbl_1_rodata_A9C = .rodata:0x00000A9C; // type:object size:0x4 scope:local data:float lbl_1_rodata_AA0 = .rodata:0x00000AA0; // type:object size:0x4 scope:local data:float lbl_1_rodata_AA4 = .rodata:0x00000AA4; // type:object size:0x4 scope:local data:float @@ -128,11 +128,11 @@ lbl_1_rodata_AAC = .rodata:0x00000AAC; // type:object size:0x4 scope:local data: lbl_1_rodata_AB0 = .rodata:0x00000AB0; // type:object size:0x4 scope:local data:float lbl_1_rodata_AB8 = .rodata:0x00000AB8; // type:object size:0x8 scope:local data:double lbl_1_rodata_AC0 = .rodata:0x00000AC0; // type:object size:0x8 scope:local data:double -lbl_1_rodata_AC8 = .rodata:0x00000AC8; // type:object size:0x28 scope:local -lbl_1_rodata_AF0 = .rodata:0x00000AF0; // type:object size:0x28 scope:local +totalPresentCntTbl = .rodata:0x00000AC8; // type:object size:0x28 scope:local +presentItemIdxTbl = .rodata:0x00000AF0; // type:object size:0x28 scope:local lbl_1_rodata_B18 = .rodata:0x00000B18; // type:object size:0x28 scope:local -lbl_1_rodata_B40 = .rodata:0x00000B40; // type:object size:0x28 scope:local -lbl_1_rodata_B68 = .rodata:0x00000B68; // type:object size:0x28 scope:local +constellationIdxTbl = .rodata:0x00000B40; // type:object size:0x28 scope:local +roofIdxTbl = .rodata:0x00000B68; // type:object size:0x28 scope:local lbl_1_rodata_B90 = .rodata:0x00000B90; // type:object size:0x4 scope:local data:float lbl_1_rodata_B94 = .rodata:0x00000B94; // type:object size:0x4 scope:local data:float lbl_1_rodata_B98 = .rodata:0x00000B98; // type:object size:0x4 scope:local data:float @@ -148,7 +148,7 @@ lbl_1_rodata_BC4 = .rodata:0x00000BC4; // type:object size:0x4 scope:local data: lbl_1_rodata_BC8 = .rodata:0x00000BC8; // type:object size:0x4 scope:local data:float lbl_1_rodata_BCC = .rodata:0x00000BCC; // type:object size:0x4 scope:local data:float lbl_1_rodata_BD0 = .rodata:0x00000BD0; // type:object size:0x4 scope:local data:float -lbl_1_rodata_BD8 = .rodata:0x00000BD8; // type:object size:0xC scope:local +guideMotTbl = .rodata:0x00000BD8; // type:object size:0xC scope:local lbl_1_rodata_BE4 = .rodata:0x00000BE4; // type:object size:0x4 scope:local data:float lbl_1_rodata_BE8 = .rodata:0x00000BE8; // type:object size:0x4 scope:local data:float lbl_1_rodata_BEC = .rodata:0x00000BEC; // type:object size:0x4 scope:local data:float @@ -172,21 +172,22 @@ lbl_1_rodata_C4C = .rodata:0x00000C4C; // type:object size:0x4 scope:local data: lbl_1_data_0 = .data:0x00000000; // type:object size:0x1B scope:local data:string lbl_1_data_1B = .data:0x0000001B; // type:object size:0x1B scope:local data:string lbl_1_data_36 = .data:0x00000036; // type:object size:0x1A scope:local data:string -lbl_1_data_50 = .data:0x00000050; // type:object size:0x1C data:4byte -lbl_1_data_6C = .data:0x0000006C; // type:object size:0x10 data:4byte +lightTbl = .data:0x00000050; // type:object size:0x1C scope:local data:4byte +execModeTbl = .data:0x0000006C; // type:object size:0x10 scope:local data:4byte lbl_1_data_7C = .data:0x0000007C; // type:object size:0x8 scope:local data:string -lbl_1_data_84 = .data:0x00000084; // type:object size:0x20 +roomIdxTbl2 = .data:0x00000084; // type:object size:0x20 jumptable_1_data_A4 = .data:0x000000A4; // type:object size:0x2C scope:local jumptable_1_data_D0 = .data:0x000000D0; // type:object size:0x1C scope:local -lbl_1_data_F0 = .data:0x000000F0; // type:object size:0x24 data:float +shadowPosTbl = .data:0x000000F0; // type:object size:0x24 scope:local data:float lbl_1_data_114 = .data:0x00000114; // type:object size:0x2A scope:local data:string lbl_1_data_13E = .data:0x0000013E; // type:object size:0x2E scope:local data:string jumptable_1_data_16C = .data:0x0000016C; // type:object size:0x34 scope:local -lbl_1_data_1A0 = .data:0x000001A0; // type:object size:0xC data:4byte -lbl_1_bss_14 = .bss:0x00000000; // type:object size:0x4 data:4byte -lbl_1_bss_4 = .bss:0x00000004; // type:object size:0x4 data:4byte -lbl_1_bss_8 = .bss:0x00000008; // type:object size:0x4 data:4byte +execModeTbl = .data:0x000001A0; // type:object size:0xC scope:local data:4byte +scene = .bss:0x00000000; // type:object size:0x4 scope:local data:4byte +presentObjMan = .bss:0x00000004; // type:object size:0x4 data:4byte +presentCamera = .bss:0x00000008; // type:object size:0x4 data:4byte lbl_1_bss_C = .bss:0x0000000C; // type:object size:0x4 data:4byte -lbl_1_bss_10 = .bss:0x00000010; // type:object size:0x4 data:4byte -lbl_1_bss_18 = .bss:0x00000018; // type:object size:0x4 data:4byte -lbl_1_bss_20 = .bss:0x00000020; // type:object size:0x4 data:4byte +present = .bss:0x00000010; // type:object size:0x4 data:4byte +lbl_1_bss_14 = .bss:0x00000014; // type:object size:0x4 data:4byte +presentState = .bss:0x00000018; // type:object size:0x4 data:4byte +presentGuide = .bss:0x00000020; // type:object size:0x4 data:4byte diff --git a/include/REL/present.h b/include/REL/present.h index 1560a75d..8b7eb6d6 100644 --- a/include/REL/present.h +++ b/include/REL/present.h @@ -3,51 +3,58 @@ #include "game/object.h" -typedef struct UnkWindowDataStruct { +typedef struct PresentWindow { /* 0x00 */ Process *process; /* 0x04 */ s16 window; - /* 0x06 */ char unk06[2]; - /* 0x08 */ s32 unk08; - /* 0x0C */ s32 unk0C; - /* 0x10 */ s32 unk10; - /* 0x14 */ s32 unk14; - /* 0x18 */ u32 unk18; + /* 0x08 */ s32 id; + /* 0x0C */ BOOL visible; + /* 0x10 */ s32 messWaitSignal; + /* 0x14 */ s32 choiceSignal; + /* 0x18 */ u32 messToBeSet; /* 0x1C */ s32 choice; - /* 0x20 */ s32 unk_20; -} UnkWindowDataStruct; /* size 0x24 */ // this already exists in option.h + /* 0x20 */ s32 state; +} PresentWindow; /* size 0x24 */ // this already exists in option.h -extern omObjData *lbl_1_bss_10; -extern omObjData *lbl_1_bss_8; -extern Process *lbl_1_bss_4; +#define PRESENT_GUIDE_MODE_NONE 0 +#define PRESENT_GUIDE_MODE_ENTER 1 +#define PRESENT_GUIDE_MODE_LEAVE 2 -void fn_1_144(s16 arg0, s32 arg1, s32 arg2); -void fn_1_334(s16 arg0, s32 arg1, float arg8, s32 arg2); -s32 fn_1_550(u16 arg0); -s32 fn_1_584(u16 arg0); -s32 fn_1_5B8(u16 arg0); -omObjData *fn_1_6B4(); -void fn_1_8F0(omObjData *object); -void fn_1_920(omObjData *object, float arg8, float arg9, float argA, s32 arg1); -void fn_1_9A4(omObjData *object, float arg8, float arg9, float argA, s32 arg1); -s32 fn_1_B6C(omObjData *object); -void fn_1_BF8(omObjData *object); -omObjData *fn_1_1458(void); -void fn_1_1784(omObjData *object); -void fn_1_180C(omObjData *object, s32 arg1); -s32 fn_1_1850(omObjData *object); -void fn_1_186C(omObjData *object, s32 arg1); -void fn_1_3B18(omObjData *object); -omObjData *fn_1_39A8(void); -UnkWindowDataStruct *fn_1_3EA4(s32 arg0); -void fn_1_4040(UnkWindowDataStruct *arg0); -void fn_1_4080(UnkWindowDataStruct *windowData); -void fn_1_4098(UnkWindowDataStruct *windowData); -void fn_1_40B0(UnkWindowDataStruct *windowData, u32 mess); -void fn_1_4104(UnkWindowDataStruct *windowData, u32 mess, s16 index); -void fn_1_419C(UnkWindowDataStruct *windowData); -omObjData *fn_1_42F4(void); -void fn_1_4534(omObjData *object); -void fn_1_45C0(omObjData *arg0, s32 arg1); -s32 fn_1_4604(omObjData *object); +#define PRESENT_MODE_NONE 0 +#define PRESENT_MODE_SELECT_ROOM 1 +#define PRESENT_MODE_SELECT_PRESENT 2 +#define PRESENT_MODE_GET 3 + +extern omObjData *present; +extern omObjData *presentCamera; +extern Process *presentObjMan; + +void PresentFadeSprite(s16 sprite, BOOL inF, s32 duration); +void FadeSpriteWithMultiplier(s16 model, BOOL inF, float tpMultiplier, s32 duration); +BOOL PresentPadCheck(u16 btn); +BOOL PresentPadDStkRepCheck(u16 dir); +BOOL PresentPadDStkCheck(u16 dir); +omObjData *PresentCameraCreate(); +void PresentCameraKill(omObjData *object); +void PresentCameraTargetSet(omObjData *object, float x, float y, float z, s32 duration); +void PresentCameraFocusSet(omObjData *object, float x, float y, float z, s32 duration); +s32 PresentCameraDoneCheck(omObjData *object); +omObjData *PresentCreate(void); +void PresentKill(omObjData *object); +void PresentExecModeSet(omObjData *object, s32 execMode); +s32 PresentExecModeGet(omObjData *object); +void PresentSelectedIDSet(omObjData *object, s32 id); +void PresentStateKill(omObjData *object); +omObjData *PresentStateCreate(void); +PresentWindow *PresentWinCreate(s32 id); +void PresentWinKill(PresentWindow *work); +void PresentWinAnimIn(PresentWindow *work); +void PresentWinAnimOut(PresentWindow *work); +void PresentWinMesSet(PresentWindow *work, u32 mess); +void PresentWinInsertMesSet(PresentWindow *work, u32 mess, s16 index); +void PresentWinMesWait(PresentWindow *work); +omObjData *PresentGuideCreate(void); +void PresentGuideKill(omObjData *object); +void PresentGuideExecModeSet(omObjData *object, s32 execMode); +s32 PresentGuideExecModeGet(omObjData *object); #endif diff --git a/src/REL/present/camera.c b/src/REL/present/camera.c index 0e15f36e..3a15ac79 100644 --- a/src/REL/present/camera.c +++ b/src/REL/present/camera.c @@ -5,242 +5,235 @@ #include "REL/present.h" -typedef struct UnkPresentCameraStruct { +typedef struct CameraWork { /* 0x00 */ Vec pos; /* 0x0C */ Vec target; /* 0x18 */ Vec up; - /* 0x24 */ float unk_24; - /* 0x28 */ float unk_28; - /* 0x2C */ Vec unk_2C; - /* 0x38 */ Vec unk_38; - /* 0x44 */ float unk44; - /* 0x48 */ float unk48; - /* 0x4C */ float unk4C; - /* 0x50 */ float unk_50; - /* 0x54 */ float unk_54; - /* 0x58 */ Vec unk_58; - /* 0x64 */ Vec unk_64; - /* 0x70 */ float unk70; - /* 0x74 */ float unk74; - /* 0x78 */ float unk78; - /* 0x7C */ float unk_7C; - /* 0x80 */ float unk_80; - /* 0x84 */ float unk_84; - /* 0x88 */ float unk_88; - /* 0x8C */ float unk_8C; - /* 0x90 */ float unk_90; - /* 0x94 */ float unk_94; - /* 0x98 */ float unk_98; -} UnkPresentCameraStruct; /* size = 0x9C */ + /* 0x24 */ float zoom; + /* 0x28 */ float rot; + /* 0x2C */ Vec posPrev; + /* 0x38 */ Vec targetPrev; + /* 0x44 */ char unk44[0xC]; + /* 0x50 */ float zoomPrev; + /* 0x54 */ float rotPrev; + /* 0x58 */ Vec posTarget; + /* 0x64 */ Vec posFocus; + /* 0x70 */ char unk70[0xC]; + /* 0x7C */ float zoomTarget; + /* 0x80 */ float rotTarget; + /* 0x84 */ float timeEye; + /* 0x88 */ float eyeSpeed; + /* 0x8C */ float timeTarget; + /* 0x90 */ float targetSpeed; + /* 0x94 */ float timeRot; + /* 0x98 */ float rotSpeed; +} CameraWork; /* size = 0x9C */ // same as in option/camera.c -static void fn_1_C20(omObjData *object); +static void ExecCameraObj(omObjData *object); +static void ExecCamera(omObjData *object); -omObjData *fn_1_6B4(void) +omObjData *PresentCameraCreate(void) { - omObjData *var_r30 = omAddObjEx(lbl_1_bss_4, 1001, 0, 0, 3, fn_1_BF8); - UnkPresentCameraStruct *var_r31 = HuMemDirectMallocNum(HEAP_SYSTEM, 156, MEMORY_DEFAULT_NUM); - var_r30->data = var_r31; + omObjData *object = omAddObjEx(presentObjMan, 1001, 0, 0, 3, ExecCameraObj); + CameraWork *work = HuMemDirectMallocNum(HEAP_SYSTEM, 156, MEMORY_DEFAULT_NUM); + object->data = work; - var_r31->pos.x = 0.0f; - var_r31->pos.y = 0.0f; - var_r31->pos.z = 0.0f; + work->pos.x = 0.0f; + work->pos.y = 0.0f; + work->pos.z = 0.0f; - var_r31->target.x = 0.0f; - var_r31->target.y = 0.0f; - var_r31->target.z = 0.0f; + work->target.x = 0.0f; + work->target.y = 0.0f; + work->target.z = 0.0f; - var_r31->up.x = 0.0f; - var_r31->up.y = 1.0f; - var_r31->up.z = 0.0f; + work->up.x = 0.0f; + work->up.y = 1.0f; + work->up.z = 0.0f; - var_r31->unk_24 = 0.0f; - var_r31->unk_28 = 0.0f; - var_r31->unk_8C = 1.0f; - var_r31->unk_84 = 1.0f; - var_r31->unk_94 = 1.0f; + work->zoom = 0.0f; + work->rot = 0.0f; + work->timeTarget = 1.0f; + work->timeEye = 1.0f; + work->timeRot = 1.0f; Hu3DCameraViewportSet(1, 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f); Hu3DCameraPerspectiveSet(1, 42.0f, 10.0f, 8000.0f, 1.2f); - fn_1_9A4(var_r30, 0.0f, 0.0f, -600.0f, 1); - fn_1_920(var_r30, 0.0f, 220.0f, 250.0f, 1); + PresentCameraFocusSet(object, 0.0f, 0.0f, -600.0f, 1); + PresentCameraTargetSet(object, 0.0f, 220.0f, 250.0f, 1); - return var_r30; + return object; } -void fn_1_8F0(omObjData *object) +void PresentCameraKill(omObjData *object) { HuMemDirectFree(object->data); } -void fn_1_920(omObjData *object, float arg8, float arg9, float argA, s32 arg1) +void PresentCameraTargetSet(omObjData *object, float x, float y, float z, s32 duration) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; - var_r31->unk_58.x = arg8; - var_r31->unk_58.y = arg9; - var_r31->unk_58.z = argA; + work->posTarget.x = x; + work->posTarget.y = y; + work->posTarget.z = z; - var_r31->unk_2C = var_r31->pos; - var_r31->unk_84 = 0.0f; - var_r31->unk_88 = 1.0f / arg1; + work->posPrev = work->pos; + work->timeEye = 0.0f; + work->eyeSpeed = 1.0f / duration; } -void fn_1_9A4(omObjData *object, float arg8, float arg9, float argA, s32 arg1) +void PresentCameraFocusSet(omObjData *object, float x, float y, float z, s32 duration) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; - var_r31->unk_64.x = arg8; - var_r31->unk_64.y = arg9; - var_r31->unk_64.z = argA; + work->posFocus.x = x; + work->posFocus.y = y; + work->posFocus.z = z; - var_r31->unk_38 = var_r31->target; - var_r31->unk_8C = 0.0f; - var_r31->unk_90 = 1.0f / arg1; + work->targetPrev = work->target; + work->timeTarget = 0.0f; + work->targetSpeed = 1.0f / duration; } -static void fn_1_A28(omObjData *object, s32 arg1, float arg8, float arg9, float argA) +void PresentCameraViewSet(omObjData *object, float zoom, float rot, float y, s32 duration) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; - var_r31->unk_64.y = argA; - var_r31->unk_7C = arg8; - var_r31->unk_80 = arg9; + work->posFocus.y = y; + work->zoomTarget = zoom; + work->rotTarget = rot; - var_r31->unk_38.y = var_r31->target.y; - var_r31->unk_50 = var_r31->unk_24; - var_r31->unk_54 = var_r31->unk_28; - var_r31->unk_94 = 0.0f; - var_r31->unk_98 = 1.0f / arg1; + work->targetPrev.y = work->target.y; + work->zoomPrev = work->zoom; + work->rotPrev = work->rot; + work->timeRot = 0.0f; + work->rotSpeed = 1.0f / duration; } -static float fn_1_AAC(omObjData *object) +float PresentCameraZoomGet(omObjData *object) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; - float var_f31 = var_r31->unk_24; + float var_f31 = work->zoom; return var_f31; } -static float fn_1_ADC(omObjData *object) +float PresentCameraRotGet(omObjData *object) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; - float var_f31 = var_r31->unk_28; + float var_f31 = work->rot; return var_f31; } -static void fn_1_B0C(omObjData *object, float *arg1, float *arg2, float *arg3) +void PresentCameraPosGet(omObjData *object, float *x, float *y, float *z) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; - *arg1 = var_r31->pos.x; - *arg2 = var_r31->pos.y; - *arg3 = var_r31->pos.z; + *x = work->pos.x; + *y = work->pos.y; + *z = work->pos.z; } -static void fn_1_B3C(omObjData *object, float *arg1, float *arg2, float *arg3) +void PresentCameraTargetGet(omObjData *object, float *x, float *y, float *z) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; - *arg1 = var_r31->target.x; - *arg2 = var_r31->target.y; - *arg3 = var_r31->target.z; + *x = work->target.x; + *y = work->target.y; + *z = work->target.z; } -s32 fn_1_B6C(omObjData *object) +s32 PresentCameraDoneCheck(omObjData *object) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; s32 var_r30 = 1; s32 var_r29 = 1; - if (!(var_r31->unk_8C < 1.0f) && !(var_r31->unk_94 < 1.0f)) { + if (!(work->timeTarget < 1.0f) && !(work->timeRot < 1.0f)) { var_r29 = 0; } - if (!var_r29 && !(var_r31->unk_84 < 1.0f)) { + if (!var_r29 && !(work->timeEye < 1.0f)) { var_r30 = 0; } return var_r30; } -void fn_1_BF8(omObjData *object) +static void ExecCameraObj(omObjData *object) { - fn_1_C20(object); + ExecCamera(object); } -static void fn_1_C20(omObjData *object) +static void ExecCamera(omObjData *object) { - float var_f31; - float var_f30; - float var_f29; - float var_f28; - float var_f27; + CameraWork *work = object->data; + float weight; + float dx; + float dz; - UnkPresentCameraStruct *var_r31 = object->data; + if (work->timeEye < 1.0f) { + weight = sind(90.0f * work->timeEye); + work->pos.x = work->posPrev.x + weight * (work->posTarget.x - work->posPrev.x); + work->pos.y = work->posPrev.y + weight * (work->posTarget.y - work->posPrev.y); + work->pos.z = work->posPrev.z + weight * (work->posTarget.z - work->posPrev.z); - if (var_r31->unk_84 < 1.0f) { - var_f28 = sind(90.0f * var_r31->unk_84); - var_r31->pos.x = var_r31->unk_2C.x + var_f28 * (var_r31->unk_58.x - var_r31->unk_2C.x); - var_r31->pos.y = var_r31->unk_2C.y + var_f28 * (var_r31->unk_58.y - var_r31->unk_2C.y); - var_r31->pos.z = var_r31->unk_2C.z + var_f28 * (var_r31->unk_58.z - var_r31->unk_2C.z); - - if ((var_r31->unk_84 += var_r31->unk_88) >= 1.0f) { - var_r31->pos = var_r31->unk_58; + if ((work->timeEye += work->eyeSpeed) >= 1.0f) { + work->pos = work->posTarget; } } - if (var_r31->unk_8C < 1.0f) { - var_f28 = sind(90.0f * var_r31->unk_8C); - var_r31->target.x = var_r31->unk_38.x + var_f28 * (var_r31->unk_64.x - var_r31->unk_38.x); - var_r31->target.y = var_r31->unk_38.y + var_f28 * (var_r31->unk_64.y - var_r31->unk_38.y); - var_r31->target.z = var_r31->unk_38.z + var_f28 * (var_r31->unk_64.z - var_r31->unk_38.z); + if (work->timeTarget < 1.0f) { + weight = sind(90.0f * work->timeTarget); + work->target.x = work->targetPrev.x + weight * (work->posFocus.x - work->targetPrev.x); + work->target.y = work->targetPrev.y + weight * (work->posFocus.y - work->targetPrev.y); + work->target.z = work->targetPrev.z + weight * (work->posFocus.z - work->targetPrev.z); - if ((var_r31->unk_8C += var_r31->unk_90) >= 1.0f) { - var_r31->target = var_r31->unk_64; + if ((work->timeTarget += work->targetSpeed) >= 1.0f) { + work->target = work->posFocus; } } - if (var_r31->unk_94 < 1.0f) { - var_f28 = sind(90.0f * var_r31->unk_94); - var_r31->target.y = var_r31->unk_38.y + (var_f28 * (var_r31->unk_64.y - var_r31->unk_38.y)); - var_r31->unk_24 = var_r31->unk_50 + (var_f28 * (var_r31->unk_7C - var_r31->unk_50)); - var_r31->unk_28 = var_r31->unk_54 + (var_f28 * (var_r31->unk_80 - var_r31->unk_54)); + if (work->timeRot < 1.0f) { + weight = sind(90.0f * work->timeRot); + work->target.y = work->targetPrev.y + (weight * (work->posFocus.y - work->targetPrev.y)); + work->zoom = work->zoomPrev + (weight * (work->zoomTarget - work->zoomPrev)); + work->rot = work->rotPrev + (weight * (work->rotTarget - work->rotPrev)); - if ((var_r31->unk_94 += var_r31->unk_98) >= 1.0f) { - var_r31->target.y = var_r31->unk_64.y; - var_r31->unk_24 = var_r31->unk_7C; - var_r31->unk_28 = var_r31->unk_80; + if ((work->timeRot += work->rotSpeed) >= 1.0f) { + work->target.y = work->posFocus.y; + work->zoom = work->zoomTarget; + work->rot = work->rotTarget; } - var_r31->target.x = var_r31->unk_24 * -sind(var_r31->unk_28); - var_r31->target.z = var_r31->unk_24 * cosd(var_r31->unk_28); + work->target.x = work->zoom * -sind(work->rot); + work->target.z = work->zoom * cosd(work->rot); } - var_f31 = var_r31->target.x - var_r31->pos.x; - var_f30 = var_r31->target.z - var_r31->pos.z; + dx = work->target.x - work->pos.x; + dz = work->target.z - work->pos.z; - var_r31->unk_24 = sqrtf(var_f31 * var_f31 + var_f30 * var_f30); - var_r31->unk_28 = fmod(-atan2d(var_f31, var_f30), 360.0); - if (var_r31->unk_28 < 0.0f) { - var_r31->unk_28 += 360.0f; + work->zoom = sqrtf(dx * dx + dz * dz); + work->rot = fmod(-atan2d(dx, dz), 360.0); + if (work->rot < 0.0f) { + work->rot += 360.0f; } - Hu3DCameraPosSet(1, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z, var_r31->up.x, var_r31->up.y, var_r31->up.z, var_r31->target.x, - var_r31->target.y, var_r31->target.z); + Hu3DCameraPosSet(1, work->pos.x, work->pos.y, work->pos.z, work->up.x, work->up.y, work->up.z, work->target.x, work->target.y, work->target.z); } -static void fn_1_1198(omObjData *object) +static void CameraExecDebug(omObjData *object) { if (HuPadBtn[0] & PAD_BUTTON_B) { - UnkPresentCameraStruct *var_r31 = object->data; + CameraWork *work = object->data; - var_r31->target.x = var_r31->target.x + (0.5f * HuPadStkX[0]); - var_r31->target.y = var_r31->target.y + (0.5f * HuPadStkY[0]); - var_r31->pos.z = var_r31->pos.z + (0.5f * HuPadTrigL[0]); - var_r31->pos.z = var_r31->pos.z - (0.5f * HuPadTrigR[0]); - var_r31->pos.x = var_r31->pos.x + (0.5f * HuPadSubStkY[0]); - var_r31->pos.y = var_r31->pos.y + (0.5f * HuPadSubStkX[0]); + work->target.x += (0.5f * HuPadStkX[0]); + work->target.y += (0.5f * HuPadStkY[0]); + work->pos.z += (0.5f * HuPadTrigL[0]); + work->pos.z -= (0.5f * HuPadTrigR[0]); + work->pos.x += (0.5f * HuPadSubStkY[0]); + work->pos.y += (0.5f * HuPadSubStkX[0]); } } -static void fn_1_1398(omObjData *object) +static void CameraPrintDebug(omObjData *object) { - UnkPresentCameraStruct *var_r31 = object->data; - print8(32, 64, 1.5f, "AT : x=%.2f y=%.2f z=%.2f", var_r31->target.x, var_r31->target.y, var_r31->target.z); - print8(32, 80, 1.5f, "EYE : x=%.2f y=%.2f z=%.2f", var_r31->pos.x, var_r31->pos.y, var_r31->pos.z); - print8(32, 96, 1.5f, "R : %.2f DEG: %.2f", var_r31->unk_24, var_r31->unk_28); + CameraWork *work = object->data; + print8(32, 64, 1.5f, "AT : x=%.2f y=%.2f z=%.2f", work->target.x, work->target.y, work->target.z); + print8(32, 80, 1.5f, "EYE : x=%.2f y=%.2f z=%.2f", work->pos.x, work->pos.y, work->pos.z); + print8(32, 96, 1.5f, "R : %.2f DEG: %.2f", work->zoom, work->rot); } diff --git a/src/REL/present/common.c b/src/REL/present/common.c index a6a42ba1..32922f12 100644 --- a/src/REL/present/common.c +++ b/src/REL/present/common.c @@ -6,228 +6,224 @@ #include "REL/present.h" -typedef struct UnkPresentStruct5 { - /* 0x00 */ s32 unk_00; - /* 0x04 */ s16 unk_04; - /* 0x08 */ float x; - /* 0x0C */ float y; - /* 0x10 */ float z; - /* 0x14 */ float unk_14; - /* 0x18 */ s32 unk18[2]; - /* 0x20 */ float unk_20; - /* 0x24 */ float unk_24; - /* 0x28 */ float unk_28; - /* 0x2C */ float unk_2C; - /* 0x30 */ float unk_30; - /* 0x34 */ float unk_34; - /* 0x38 */ float unk_38; - /* 0x3C */ s32 unk3C[3]; - /* 0x48 */ float unk_48; - /* 0x4C */ float unk_4C; +typedef struct GuideWork { + /* 0x00 */ s32 execMode; + /* 0x04 */ s16 motion; + /* 0x08 */ Vec pos; + /* 0x14 */ Vec newPos; + /* 0x20 */ Vec rot; + /* 0x2C */ Vec posDelta; + /* 0x38 */ float distRemain; + /* 0x3C */ char unk3C[0xC]; + /* 0x48 */ float time; + /* 0x4C */ float speed; /* 0x50 */ s32 unk_50; /* 0x54 */ s32 unk_54; -} UnkPresentStruct5; /* size = 0x58 */ +} GuideWork; /* size = 0x58 */ -static void fn_1_4620(omObjData *object); -static void fn_1_4880(omObjData *object); -static void fn_1_4A04(omObjData *object); -static float fn_1_4CEC(float arg8, float arg9, float argA); +static void ExecGuideEnter(omObjData *object); +static void ExecGuideLeave(omObjData *object); +static void UpdateGuide(omObjData *object); +static float LerpAngle(float start, float end, float time); -omObjFunc lbl_1_data_1A0[] = { NULL, fn_1_4620, fn_1_4880 }; +static omObjFunc execModeTbl[] = { NULL, ExecGuideEnter, ExecGuideLeave }; -static const s32 lbl_1_rodata_BD8[] = { 0x006E0089, 0x006E008A, 0x006E008B }; +static const s32 guideMotTbl[] = { + DATA_MAKE_NUM(DATADIR_PRESENT, 137), + DATA_MAKE_NUM(DATADIR_PRESENT, 138), + DATA_MAKE_NUM(DATADIR_PRESENT, 139), +}; - -omObjData *fn_1_42F4(void) +omObjData *PresentGuideCreate(void) { s32 var_r29; - omObjData *var_r31 = omAddObjEx(lbl_1_bss_4, 1002, 1, 3, 2, NULL); - UnkPresentStruct5 *var_r30 = HuMemDirectMallocNum(HEAP_SYSTEM, 88, MEMORY_DEFAULT_NUM); - var_r31->data = var_r30; + omObjData *object = omAddObjEx(presentObjMan, 1002, 1, 3, 2, NULL); + GuideWork *work = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(GuideWork), MEMORY_DEFAULT_NUM); + object->data = work; - var_r30->x = 0.0f; - var_r30->z = 0.0f; - var_r30->y = 0.0f; - var_r30->unk_20 = 0.0f; - var_r30->unk_24 = 0.0f; - var_r30->unk_28 = 0.0f; - var_r30->unk_2C = 0.0f; - var_r30->unk_34 = 0.0f; - var_r30->unk_30 = 0.0f; - var_r31->model[0] = Hu3DModelCreate(HuDataReadNum(0x6E0088, MEMORY_DEFAULT_NUM)); - Hu3DModelLayerSet(var_r31->model[0], 1); + work->pos.x = 0.0f; + work->pos.z = 0.0f; + work->pos.y = 0.0f; + work->rot.x = 0.0f; + work->rot.y = 0.0f; + work->rot.z = 0.0f; + + work->posDelta.x = 0.0f; + work->posDelta.z = 0.0f; + work->posDelta.y = 0.0f; + object->model[0] = Hu3DModelCreate(HuDataReadNum(DATA_MAKE_NUM(DATADIR_PRESENT, 136), MEMORY_DEFAULT_NUM)); + Hu3DModelLayerSet(object->model[0], 1); for (var_r29 = 0; var_r29 < 3; var_r29++) { - var_r31->motion[var_r29] = Hu3DJointMotion(var_r31->model[0], HuDataSelHeapReadNum(lbl_1_rodata_BD8[var_r29], MEMORY_DEFAULT_NUM, HEAP_DATA)); + object->motion[var_r29] = Hu3DJointMotion(object->model[0], HuDataSelHeapReadNum(guideMotTbl[var_r29], MEMORY_DEFAULT_NUM, HEAP_DATA)); } - Hu3DMotionShiftSet(var_r31->model[0], var_r31->motion[var_r30->unk_04 = 0], 0.0f, 8.0f, 0x40000001); - var_r30->unk_50 = CharModelEffectNpcInit(var_r31->model[0], var_r31->motion[2], 1, 10); - var_r30->unk_54 = CharModelEffectNpcInit(var_r31->model[0], var_r31->motion[1], 0, 10); + Hu3DMotionShiftSet(object->model[0], object->motion[work->motion = 0], 0.0f, 8.0f, 0x40000001); + work->unk_50 = CharModelEffectNpcInit(object->model[0], object->motion[2], 1, 10); + work->unk_54 = CharModelEffectNpcInit(object->model[0], object->motion[1], 0, 10); CharModelLayerSetAll(1); - Hu3DModelShadowSet(var_r31->model[0]); - fn_1_45C0(var_r31, 0); - fn_1_4A04(var_r31); - Hu3DModelAttrSet(var_r31->model[0], 1); + Hu3DModelShadowSet(object->model[0]); + PresentGuideExecModeSet(object, PRESENT_GUIDE_MODE_NONE); + UpdateGuide(object); + Hu3DModelAttrSet(object->model[0], 1); - return var_r31; + return object; } -void fn_1_4534(omObjData *object) +void PresentGuideKill(omObjData *object) { - s32 var_r31; - void *var_r29 = object->data; + void *work = object->data; - for (var_r31 = 0; var_r31 < 1; var_r31++) { - Hu3DModelKill(object->model[var_r31]); + s32 i; + for (i = 0; i < 1; i++) { + Hu3DModelKill(object->model[i]); } - for (var_r31 = 0; var_r31 < 3; var_r31++) { - Hu3DMotionKill(object->motion[var_r31]); + for (i = 0; i < 3; i++) { + Hu3DMotionKill(object->motion[i]); } - HuMemDirectFree(var_r29); + HuMemDirectFree(work); } -void fn_1_45C0(omObjData *object, s32 arg1) +void PresentGuideExecModeSet(omObjData *object, s32 execMode) { - UnkPresentStruct5 *var_r31 = object->data; + GuideWork *work = object->data; - var_r31->unk_00 = arg1; - object->func = lbl_1_data_1A0[arg1]; + work->execMode = execMode; + object->func = execModeTbl[execMode]; object->unk10 = 0; object->unk10 = 0; } -s32 fn_1_4604(omObjData *object) +s32 PresentGuideExecModeGet(omObjData *object) { - UnkPresentStruct5 *var_r31 = object->data; + GuideWork *work = object->data; - return var_r31->unk_00; + return work->execMode; } -static void fn_1_4620(omObjData *object) +static void ExecGuideEnter(omObjData *object) { float var_f31; - UnkPresentStruct5 *var_r31 = object->data; + GuideWork *work = object->data; switch (object->unk10) { case 0: Hu3DModelAttrReset(object->model[0], 1); - var_r31->x = -300.0f; - var_r31->z = -180.0f; - var_r31->unk_48 = 0.0f; - var_r31->unk_4C = 0.025f; + work->pos.x = -300.0f; + work->pos.z = -180.0f; + work->time = 0.0f; + work->speed = 0.025f; object->unk10 = 1; case 1: - var_f31 = sind(90.0f * var_r31->unk_48); + var_f31 = sind(90.0f * work->time); var_f31 *= var_f31; - var_r31->unk_14 = -300.0f + (300.0f * var_f31); - var_r31->unk_2C = var_r31->unk_14 - var_r31->x; - if ((var_r31->unk_48 = var_r31->unk_48 + var_r31->unk_4C) < 1.0f) { + work->newPos.x = -300.0f + (300.0f * var_f31); + work->posDelta.x = work->newPos.x - work->pos.x; + if ((work->time += work->speed) < 1.0f) { break; } - var_r31->x = 0.0f; - var_r31->unk_48 = 0.0f; - var_r31->unk_4C = 0.05f; + work->pos.x = 0.0f; + work->time = 0.0f; + work->speed = 0.05f; object->unk10 = 2; case 2: - var_r31->unk_2C = 0.0f; - var_r31->unk_34 = 0.01f; - if ((var_r31->unk_48 = var_r31->unk_48 + var_r31->unk_4C) < 1.0f) { + work->posDelta.x = 0.0f; + work->posDelta.z = 0.01f; + if ((work->time += work->speed) < 1.0f) { break; } - var_r31->unk_24 = 0.0f; - var_r31->unk_2C = 0.0f; - var_r31->unk_30 = 0.0f; - var_r31->unk_34 = 0.0f; + work->rot.y = 0.0f; + work->posDelta.x = 0.0f; + work->posDelta.y = 0.0f; + work->posDelta.z = 0.0f; object->unk10 = 3; case 3: - fn_1_45C0(object, 0); + PresentGuideExecModeSet(object, PRESENT_GUIDE_MODE_NONE); break; default: break; } - fn_1_4A04(object); + UpdateGuide(object); } -static void fn_1_4880(omObjData *object) +static void ExecGuideLeave(omObjData *object) { - float var_f31; + float weight; - UnkPresentStruct5 *var_r30 = object->data; + GuideWork *work = object->data; switch (object->unk10) { case 0: - var_r30->unk_48 = 0.0f; - var_r30->unk_4C = 0.025f; + work->time = 0.0f; + work->speed = 0.025f; Hu3DModelAttrReset(object->model[0], 1); object->unk10 = 1; case 1: - var_f31 = sind(90.0f * var_r30->unk_48); - var_f31 *= var_f31; - var_r30->unk_14 = -(300.0f * var_f31); - var_r30->unk_2C = var_r30->unk_14 - var_r30->x; - if ((var_r30->unk_48 = var_r30->unk_48 + var_r30->unk_4C) < 1.0f) { + weight = sind(90.0f * work->time); + weight *= weight; + work->newPos.x = -(300.0f * weight); + work->posDelta.x = work->newPos.x - work->pos.x; + if ((work->time += work->speed) < 1.0f) { break; } object->unk10 = 2; case 2: Hu3DModelAttrSet(object->model[0], 1); - fn_1_45C0(object, 0); + PresentGuideExecModeSet(object, PRESENT_GUIDE_MODE_NONE); break; default: break; } - fn_1_4A04(object); + UpdateGuide(object); (void)object; } -static void fn_1_4A04(omObjData *object) +static void UpdateGuide(omObjData *object) { - UnkPresentStruct5 *var_r31 = object->data; - s16 var_r29 = 0; - float var_f30 = var_r31->unk_2C * var_r31->unk_2C + var_r31->unk_34 * var_r31->unk_34; + GuideWork *work = object->data; + s16 motion = 0; - var_r31->unk_38 = sqrtf(var_f30); - if (0.001f <= var_r31->unk_38) { - if (12.0f <= var_r31->unk_38) { - var_r31->unk_2C = var_r31->unk_2C / var_r31->unk_38; - var_r31->unk_34 = var_r31->unk_34 / var_r31->unk_38; - var_r31->unk_38 = 12.0f; - var_r31->unk_2C = 12.0f * var_r31->unk_2C; - var_r31->unk_34 = 12.0f * var_r31->unk_34; + work->distRemain = sqrtf(work->posDelta.x * work->posDelta.x + work->posDelta.z * work->posDelta.z); + if (0.001f <= work->distRemain) { + if (12.0f <= work->distRemain) { + work->posDelta.x /= work->distRemain; + work->posDelta.z /= work->distRemain; + work->distRemain = 12.0f; + work->posDelta.x = 12.0f * work->posDelta.x; + work->posDelta.z = 12.0f * work->posDelta.z; } - var_r31->unk_24 = fn_1_4CEC(var_r31->unk_24, atan2d(var_r31->unk_2C, var_r31->unk_34), 0.4f); + work->rot.y = LerpAngle(work->rot.y, atan2d(work->posDelta.x, work->posDelta.z), 0.4f); - if (8.0f <= var_r31->unk_38) { - var_r29 = 2; + if (8.0f <= work->distRemain) { + motion = 2; } else { - var_r29 = 1; + motion = 1; } } - var_r31->x = var_r31->x + var_r31->unk_2C; - var_r31->z = var_r31->z + var_r31->unk_34; - if (var_r31->unk_04 != var_r29) { - Hu3DMotionShiftSet(object->model[0], object->motion[var_r31->unk_04 = var_r29], 0.0f, 8.0f, 0x40000001); // or 0x41000000 + work->pos.x += work->posDelta.x; + work->pos.z += work->posDelta.z; + if (work->motion != motion) { + Hu3DMotionShiftSet(object->model[0], object->motion[work->motion = motion], 0.0f, 8.0f, 0x40000001); } - omSetTra(object, var_r31->x, var_r31->y, var_r31->z); - omSetRot(object, var_r31->unk_20, var_r31->unk_24, var_r31->unk_28); + omSetTra(object, work->pos.x, work->pos.y, work->pos.z); + omSetRot(object, work->rot.x, work->rot.y, work->rot.z); } -static float fn_1_4CEC(float arg8, float arg9, float argA) +static float LerpAngle(float start, float end, float time) { - float var_f30; + float angle; - float var_f31 = fmod(arg9 - arg8, 360.0f); - if (0.0f > var_f31) { - var_f31 += 360.0f; + float delta = fmod(end - start, 360.0f); + if (0.0f > delta) { + delta += 360.0f; } - if (180.0f < var_f31) { - var_f31 -= 360.0f; + if (180.0f < delta) { + delta -= 360.0f; } - var_f30 = fmod(arg8 + (var_f31 * argA), 360.0f); - if (0.0f > var_f30) { - var_f30 += 360.0f; + angle = fmod(start + (delta * time), 360.0f); + if (0.0f > angle) { + angle += 360.0f; } - return var_f30; + return angle; } diff --git a/src/REL/present/init.c b/src/REL/present/init.c index 17d98aa0..bdc5f551 100644 --- a/src/REL/present/init.c +++ b/src/REL/present/init.c @@ -8,158 +8,158 @@ #include "REL/present.h" -typedef struct UnkPresentStruct6 { - /* 0x00 */ s16 unk_00; - /* 0x04 */ float unk_04; - /* 0x08 */ float unk_08; -} UnkPresentStruct6; /* size 0x0C */ // looks like a struct in option/scene.c +typedef struct FaderWork { + /* 0x00 */ s16 id; + /* 0x04 */ float tplvl; + /* 0x08 */ float speed; +} FaderWork; /* size 0x0C */ // same as in option/scene.c -typedef struct UnkPresentStruct6Weird { - /* 0x00 */ s16 unk_00; - /* 0x04 */ float unk_04; - /* 0x08 */ float unk_08; - /* 0x0C */ float unk_0C; -} UnkPresentStruct6Weird; /* size = 0x10 */ // looks like a struct in option/scene.c +typedef struct FaderWork2 { + /* 0x00 */ s16 id; + /* 0x04 */ float tpMultiplier; + /* 0x08 */ float tplvl; + /* 0x0C */ float speed; +} FaderWork2; /* size = 0x10 */ -omObjData *lbl_1_bss_18; +omObjData *presentState; omObjData *lbl_1_bss_14; -omObjData *lbl_1_bss_10; +omObjData *present; omObjData *lbl_1_bss_C; -omObjData *lbl_1_bss_8; -Process *lbl_1_bss_4; -omObjData *lbl_1_bss_0; +omObjData *presentCamera; +Process *presentObjMan; +static omObjData *scene; -static void fn_1_254(void); -static void fn_1_45C(void); -static void fn_1_5EC(omObjData *object); +static void FadeSprite(void); +static void FadeModel(void); +static void SceneMain(omObjData *object); void ObjectSetup(void) { - lbl_1_bss_4 = omInitObjMan(150, 8192); - omGameSysInit(lbl_1_bss_4); + presentObjMan = omInitObjMan(150, 8192); + omGameSysInit(presentObjMan); HuWinInit(1); - lbl_1_bss_0 = omAddObjEx(lbl_1_bss_4, 1000, 0, 0, 0, fn_1_5EC); - lbl_1_bss_0->unk10 = 0; - lbl_1_bss_18 = fn_1_39A8(); + scene = omAddObjEx(presentObjMan, 1000, 0, 0, 0, SceneMain); + scene->unk10 = 0; + presentState = PresentStateCreate(); } -void fn_1_144(s16 arg0, s32 arg1, s32 arg2) +void PresentFadeSprite(s16 sprite, BOOL inF, s32 duration) { - Process *var_r30; + Process *process; - UnkPresentStruct6 *var_r31 = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkPresentStruct6), MEMORY_DEFAULT_NUM); - var_r31->unk_00 = arg0; - var_r31->unk_08 = 1.0f / arg2; - if (arg1) { - var_r31->unk_08 = var_r31->unk_08; - var_r31->unk_04 = 0.0f; + FaderWork *work = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(FaderWork), MEMORY_DEFAULT_NUM); + work->id = sprite; + work->speed = 1.0f / duration; + if (inF) { + work->speed = work->speed; + work->tplvl = 0.0f; } else { - var_r31->unk_08 = -var_r31->unk_08; - var_r31->unk_04 = 1.0f; + work->speed = -work->speed; + work->tplvl = 1.0f; } - espDispOn(var_r31->unk_00); - espTPLvlSet(var_r31->unk_00, var_r31->unk_04); - var_r30 = HuPrcChildCreate(fn_1_254, 100, 5376, 0, HuPrcCurrentGet()); - var_r30->user_data = var_r31; + espDispOn(work->id); + espTPLvlSet(work->id, work->tplvl); + process = HuPrcChildCreate(FadeSprite, 100, 5376, 0, HuPrcCurrentGet()); + process->user_data = work; } -static void fn_1_254(void) +static void FadeSprite(void) { - UnkPresentStruct6 *var_r31 = HuPrcCurrentGet()->user_data; + FaderWork *work = HuPrcCurrentGet()->user_data; while (TRUE) { - var_r31->unk_04 = var_r31->unk_04 + var_r31->unk_08; - if (var_r31->unk_04 > 1.0f) { - var_r31->unk_04 = 1.0f; + work->tplvl = work->tplvl + work->speed; + if (work->tplvl > 1.0f) { + work->tplvl = 1.0f; break; } - else if (var_r31->unk_04 < 0.0f) { - var_r31->unk_04 = 0.0f; + else if (work->tplvl < 0.0f) { + work->tplvl = 0.0f; break; } else { - espTPLvlSet(var_r31->unk_00, var_r31->unk_04); + espTPLvlSet(work->id, work->tplvl); HuPrcVSleep(); } } - espTPLvlSet(var_r31->unk_00, var_r31->unk_04); - if (var_r31->unk_08 < 0.0f) { - espDispOff(var_r31->unk_00); + espTPLvlSet(work->id, work->tplvl); + if (work->speed < 0.0f) { + espDispOff(work->id); + } + HuMemDirectFree(work); + HuPrcEnd(); +} + +void FadeSpriteWithMultiplier(s16 model, BOOL inF, float tpMultiplier, s32 duration) +{ + Process *process; + // bug: wrong struct in sizeof + FaderWork2 *work = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(FaderWork), MEMORY_DEFAULT_NUM); + work->id = model; + work->speed = 1.0f / duration; + work->tpMultiplier = tpMultiplier; + + if (inF) { + work->speed = work->speed; + work->tplvl = 0.0f; + } + else { + work->speed = -work->speed; + work->tplvl = 1.0f; + } + Hu3DModelTPLvlSet(work->id, work->tplvl * work->tpMultiplier); + Hu3DModelAttrReset(work->id, 1); + process = HuPrcChildCreate(FadeModel, 100, 5376, 0, HuPrcCurrentGet()); + process->user_data = work; +} + +static void FadeModel(void) +{ + FaderWork2 *var_r31 = HuPrcCurrentGet()->user_data; + + while (TRUE) { + var_r31->tplvl += var_r31->speed; + if (var_r31->tplvl > 1.0f) { + var_r31->tplvl = 1.0f; + break; + } + else if (var_r31->tplvl < 0.0f) { + var_r31->tplvl = 0.0f; + break; + } + else { + Hu3DModelTPLvlSet(var_r31->id, var_r31->tplvl * var_r31->tpMultiplier); + HuPrcVSleep(); + } + } + Hu3DModelTPLvlSet(var_r31->id, var_r31->tplvl * var_r31->tpMultiplier); + if (var_r31->speed < 0.0f) { + Hu3DModelAttrSet(var_r31->id, 1); } HuMemDirectFree(var_r31); HuPrcEnd(); } -void fn_1_334(s16 arg0, s32 arg1, float arg8, s32 arg2) +BOOL PresentPadCheck(u16 btn) { - Process *var_r30; - // TODO correct type? why are only 12 bytes allocated? - UnkPresentStruct6Weird *var_r31 = HuMemDirectMallocNum(HEAP_SYSTEM, 12, MEMORY_DEFAULT_NUM); - var_r31->unk_00 = arg0; - var_r31->unk_0C = 1.0f / arg2; - var_r31->unk_04 = arg8; - - if (arg1) { - var_r31->unk_0C = var_r31->unk_0C; - var_r31->unk_08 = 0.0f; - } - else { - var_r31->unk_0C = -var_r31->unk_0C; - var_r31->unk_08 = 1.0f; - } - Hu3DModelTPLvlSet(var_r31->unk_00, var_r31->unk_08 * var_r31->unk_04); - Hu3DModelAttrReset(var_r31->unk_00, 1); - var_r30 = HuPrcChildCreate(fn_1_45C, 100, 5376, 0, HuPrcCurrentGet()); - var_r30->user_data = var_r31; -} - -static void fn_1_45C(void) -{ - UnkPresentStruct6Weird *var_r31 = HuPrcCurrentGet()->user_data; - - while (TRUE) { - var_r31->unk_08 = var_r31->unk_08 + var_r31->unk_0C; - if (var_r31->unk_08 > 1.0f) { - var_r31->unk_08 = 1.0f; - break; - } - else if (var_r31->unk_08 < 0.0f) { - var_r31->unk_08 = 0.0f; - break; - } - else { - Hu3DModelTPLvlSet(var_r31->unk_00, var_r31->unk_08 * var_r31->unk_04); - HuPrcVSleep(); - } - } - Hu3DModelTPLvlSet(var_r31->unk_00, var_r31->unk_08 * var_r31->unk_04); - if (var_r31->unk_0C < 0.0f) { - Hu3DModelAttrSet(var_r31->unk_00, 1); - } - HuMemDirectFree(var_r31); - HuPrcEnd(); -} - -s32 fn_1_550(u16 arg0) -{ - u32 var_r31 = HuPadBtnDown[0] & arg0; + u32 var_r31 = HuPadBtnDown[0] & btn; return var_r31 != 0; } -s32 fn_1_584(u16 arg0) +BOOL PresentPadDStkRepCheck(u16 dir) { - u32 var_r31 = HuPadDStkRep[0] & arg0; + u32 var_r31 = HuPadDStkRep[0] & dir; return var_r31 != 0; } -s32 fn_1_5B8(u16 arg0) +BOOL PresentPadDStkCheck(u16 dir) { - u32 var_r31 = HuPadDStk[0] & arg0; + u32 var_r31 = HuPadDStk[0] & dir; return var_r31 != 0; } -static void fn_1_5EC(omObjData *object) +static void SceneMain(omObjData *object) { switch (object->unk10) { case 0: @@ -176,7 +176,7 @@ static void fn_1_5EC(omObjData *object) break; case 3: if (!WipeStatGet()) { - fn_1_3B18(lbl_1_bss_18); + PresentStateKill(presentState); omOvlReturnEx(1, 1); } break; diff --git a/src/REL/present/main.c b/src/REL/present/main.c index ae26fdd9..0d39435e 100644 --- a/src/REL/present/main.c +++ b/src/REL/present/main.c @@ -7,69 +7,74 @@ #include "REL/present.h" -typedef struct UnkPresentStruct { - /* 0x00 */ UnkWindowDataStruct *unk_00; - /* 0x04 */ s32 unk_04; -} UnkPresentStruct; /* size = 0x08 */ +typedef struct StateWork { + /* 0x00 */ PresentWindow *window; + /* 0x04 */ s32 quitTimer; +} StateWork; /* size = 0x08 */ -typedef struct UnkPresentStruct4 { - /* 0x00 */ Vec unk_00; - /* 0x0C */ Vec unk_0C; - /* 0x18 */ Vec unk_18; -} UnkPresentStruct4; /* size = 0x1C */ +typedef struct UnkShadowDataStruct { + /* 0x00 */ Vec pos; + /* 0x0C */ Vec up; + /* 0x18 */ Vec target; +} UnkShadowDataStruct; /* size = 0x24 */ -omObjData *lbl_1_bss_20; +omObjData *presentGuide; -UnkPresentStruct4 lbl_1_data_F0 = { { 0.0f, 3000.0f, 1.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } }; +static UnkShadowDataStruct shadowPosTbl = { + { 0.0f, 3000.0f, 1.0f }, + { 0.0f, 1.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, +}; -static void fn_1_3B8C(omObjData *object); -static void fn_1_3DB8(omObjData *object); -static void fn_1_4190(UnkWindowDataStruct *arg0); -static void fn_1_41BC(UnkWindowDataStruct *arg0, s32 arg1); -static void fn_1_41E0(void); +static void ExecPresentView(omObjData *object); +static void ExecPresentGet(omObjData *object); +void PresentWinDispOff(PresentWindow *work); +void PresentWinChoiceSet(PresentWindow *work, s32 choice); +static void ExecWindow(void); -omObjData *fn_1_39A8(void) +omObjData *PresentStateCreate(void) { - omObjData *object = omAddObjEx(lbl_1_bss_4, 1000, 0, 0, 4, NULL); - UnkPresentStruct *var_r30 = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkPresentStruct), MEMORY_DEFAULT_NUM); - object->data = var_r30; + omObjData *object = omAddObjEx(presentObjMan, 1000, 0, 0, 4, NULL); + StateWork *work = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(StateWork), MEMORY_DEFAULT_NUM); + object->data = work; - var_r30->unk_04 = 0; - lbl_1_bss_8 = fn_1_6B4(); - lbl_1_bss_10 = fn_1_1458(); - lbl_1_bss_20 = fn_1_42F4(); - var_r30->unk_00 = fn_1_3EA4(0); + work->quitTimer = 0; + presentCamera = PresentCameraCreate(); + present = PresentCreate(); + presentGuide = PresentGuideCreate(); + work->window = PresentWinCreate(0); Hu3DShadowCreate(30.0f, 20.0f, 5000.0f); Hu3DShadowTPLvlSet(0.45f); - Hu3DShadowPosSet(&lbl_1_data_F0.unk_00, &lbl_1_data_F0.unk_0C, &lbl_1_data_F0.unk_18); + Hu3DShadowPosSet(&shadowPosTbl.pos, &shadowPosTbl.up, &shadowPosTbl.target); + if (omovlevtno > 0) { OSReport("*** PRESENTROOM ( PRESENT GET MODE ) ***\n"); - object->func = fn_1_3DB8; + object->func = ExecPresentGet; object->unk10 = 0; } else { OSReport("*** PRESENTROOM ( PRESENT VIEW MODE ) ***\n"); - object->func = fn_1_3B8C; + object->func = ExecPresentView; object->unk10 = 0; } return object; } -void fn_1_3B18(omObjData *object) +void PresentStateKill(omObjData *object) { - UnkWindowDataStruct **var_r31 = object->data; + PresentWindow **var_r31 = object->data; - fn_1_8F0(lbl_1_bss_8); - fn_1_1784(lbl_1_bss_10); - fn_1_4534(lbl_1_bss_20); - fn_1_4040(*var_r31); + PresentCameraKill(presentCamera); + PresentKill(present); + PresentGuideKill(presentGuide); + PresentWinKill(*var_r31); HuMemDirectFree(var_r31); } -static void fn_1_3B8C(omObjData *object) +static void ExecPresentView(omObjData *object) { - UnkPresentStruct *var_r30 = object->data; + StateWork *work = object->data; switch (object->unk10) { case 0: @@ -81,39 +86,39 @@ static void fn_1_3B8C(omObjData *object) } object->unk10 = 2; case 2: - fn_1_180C(lbl_1_bss_10, 1); + PresentExecModeSet(present, 1); object->unk10 = 3; case 3: - if (fn_1_1850(lbl_1_bss_10)) { + if (PresentExecModeGet(present)) { return; } object->unk10 = 4; case 4: - fn_1_45C0(lbl_1_bss_20, 1); + PresentGuideExecModeSet(presentGuide, PRESENT_GUIDE_MODE_ENTER); object->unk10 = 5; case 5: - if (fn_1_4604(lbl_1_bss_20)) { + if (PresentGuideExecModeGet(presentGuide)) { return; } object->unk10 = 6; case 6: HuAudFXPlay(66); - fn_1_4080(var_r30->unk_00); - fn_1_40B0(var_r30->unk_00, 0x320002); + PresentWinAnimIn(work->window); + PresentWinMesSet(work->window, 0x320002); object->unk10 = 7; case 7: - if (var_r30->unk_00->unk_20) { + if (work->window->state) { return; } - fn_1_41BC(var_r30->unk_00, 1); + PresentWinChoiceSet(work->window, 1); object->unk10 = 8; case 8: - if (var_r30->unk_00->unk_20) { + if (work->window->state) { return; } - fn_1_4098(var_r30->unk_00); - if (!var_r30->unk_00->choice) { - var_r30->unk_04 = 0; + PresentWinAnimOut(work->window); + if (!work->window->choice) { + work->quitTimer = 0; object->unk10 = 11; return; } @@ -122,23 +127,23 @@ static void fn_1_3B8C(omObjData *object) return; } case 9: - fn_1_45C0(lbl_1_bss_20, 2); + PresentGuideExecModeSet(presentGuide, PRESENT_GUIDE_MODE_LEAVE); object->unk10 = 10; return; case 10: - if (fn_1_4604(lbl_1_bss_20)) { + if (PresentGuideExecModeGet(presentGuide)) { return; } object->unk10 = 2; return; case 11: object->unk10 = 12; - var_r30->unk_04 = 0; + work->quitTimer = 0; case 12: - if (var_r30->unk_00->unk_20) { + if (work->window->state) { return; } - if (var_r30->unk_04++ >= 60) { + if (work->quitTimer++ >= 60) { omSysExitReq = 1; object->func = NULL; object->unk10 = 0; @@ -148,48 +153,48 @@ static void fn_1_3B8C(omObjData *object) } } -static void fn_1_3DB8(omObjData *arg0) +static void ExecPresentGet(omObjData *object) { - void *sp8 = arg0->data; + void *sp8 = object->data; - switch (arg0->unk10) { + switch (object->unk10) { case 0: - fn_1_186C(lbl_1_bss_10, omovlevtno - 1); - arg0->unk10 = 1; + PresentSelectedIDSet(present, omovlevtno - 1); + object->unk10 = 1; case 1: - fn_1_180C(lbl_1_bss_10, 3); - arg0->unk10 = 2; + PresentExecModeSet(present, PRESENT_MODE_GET); + object->unk10 = 2; case 2: - if (!fn_1_1850(lbl_1_bss_10)) { - arg0->unk10 = 3; + if (PresentExecModeGet(present) == PRESENT_MODE_NONE) { + object->unk10 = 3; } else { break; } case 3: - arg0->unk10 = 4; + object->unk10 = 4; case 4: omSysExitReq = 1; - arg0->func = NULL; - arg0->unk10 = 0; + object->func = NULL; + object->unk10 = 0; break; default: break; } } -UnkWindowDataStruct *fn_1_3EA4(s32 arg0) +PresentWindow *PresentWinCreate(s32 id) { - UnkWindowDataStruct *var_r31 = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkWindowDataStruct), MEMORY_DEFAULT_NUM); + PresentWindow *var_r31 = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(PresentWindow), MEMORY_DEFAULT_NUM); - var_r31->unk18 = 0; - var_r31->unk10 = 0; - var_r31->unk14 = 0; - var_r31->unk_20 = 0; - var_r31->process = HuPrcChildCreate(fn_1_41E0, 1000, 8192, 0, lbl_1_bss_4); + var_r31->messToBeSet = 0; + var_r31->messWaitSignal = 0; + var_r31->choiceSignal = 0; + var_r31->state = 0; + var_r31->process = HuPrcChildCreate(ExecWindow, 1000, 8192, 0, presentObjMan); var_r31->process->user_data = var_r31; - var_r31->unk08 = arg0; - switch (arg0) { + var_r31->id = id; + switch (id) { case 0: var_r31->window = HuWinExCreateStyled(-10000.0f, 360.0f, 480, 80, -1, 1); HuWinBGTPLvlSet(var_r31->window, 0.8f); @@ -204,112 +209,112 @@ UnkWindowDataStruct *fn_1_3EA4(s32 arg0) break; } HuWinDrawNoSet(var_r31->window, 63); - fn_1_4190(var_r31); + PresentWinDispOff(var_r31); HuSprExecLayerSet(63, 2); return var_r31; } -void fn_1_4040(UnkWindowDataStruct *windowData) +void PresentWinKill(PresentWindow *work) { - HuWinExCleanup(windowData->window); - HuPrcKill(windowData->process); - HuMemDirectFree(windowData); + HuWinExCleanup(work->window); + HuPrcKill(work->process); + HuMemDirectFree(work); } -void fn_1_4080(UnkWindowDataStruct *windowData) +void PresentWinAnimIn(PresentWindow *work) { - if (!windowData->unk0C) { - windowData->unk_20 = 1; + if (!work->visible) { + work->state = 1; } } -void fn_1_4098(UnkWindowDataStruct *windowData) +void PresentWinAnimOut(PresentWindow *work) { - if (windowData->unk0C) { - windowData->unk_20 = 2; + if (work->visible) { + work->state = 2; } } -void fn_1_40B0(UnkWindowDataStruct *windowData, u32 mess) +void PresentWinMesSet(PresentWindow *work, u32 mess) { - if (!windowData->unk_20) { - HuWinMesSet(windowData->window, mess); + if (!work->state) { + HuWinMesSet(work->window, mess); return; } - windowData->unk18 = mess; + work->messToBeSet = mess; } -void fn_1_4104(UnkWindowDataStruct *windowData, u32 mess, s16 index) +void PresentWinInsertMesSet(PresentWindow *work, u32 mess, s16 index) { - HuWinInsertMesSet(windowData->window, mess, index); + HuWinInsertMesSet(work->window, mess, index); } -static void fn_1_4144(UnkWindowDataStruct *windowData, float x, float y) +void PresentWinPosSet(PresentWindow *work, float x, float y) { - HuWinPosSet(windowData->window, x, y); + HuWinPosSet(work->window, x, y); } -static void fn_1_4184(UnkWindowDataStruct *windowData) +void PresentWinDispOn(PresentWindow *work) { - windowData->unk0C = 1; + work->visible = TRUE; } -static void fn_1_4190(UnkWindowDataStruct *windowData) +void PresentWinDispOff(PresentWindow *work) { - windowData->unk0C = 0; + work->visible = FALSE; } -void fn_1_419C(UnkWindowDataStruct *windowData) +void PresentWinMesWait(PresentWindow *work) { - if (!windowData->unk_20) { - windowData->unk_20 = 3; + if (!work->state) { + work->state = 3; } - windowData->unk10 = 1; + work->messWaitSignal = 1; } -static void fn_1_41BC(UnkWindowDataStruct *windowData, s32 arg1) +void PresentWinChoiceSet(PresentWindow *work, s32 choice) { - if (!windowData->unk_20) { - windowData->unk_20 = 4; + if (!work->state) { + work->state = 4; } - windowData->unk14 = 1; - windowData->choice = arg1; + work->choiceSignal = 1; + work->choice = choice; } -static void fn_1_41E0(void) +static void ExecWindow(void) { - UnkWindowDataStruct *windowData = HuPrcCurrentGet()->user_data; + PresentWindow *work = HuPrcCurrentGet()->user_data; while (TRUE) { - switch (windowData->unk_20) { + switch (work->state) { case 1: - windowData->unk0C = 1; - HuWinExAnimIn(windowData->window); + work->visible = 1; + HuWinExAnimIn(work->window); break; case 2: - HuWinExAnimOut(windowData->window); - windowData->unk0C = 0; + HuWinExAnimOut(work->window); + work->visible = 0; break; case 3: - winData[windowData->window].active_pad = 1; - HuWinMesWait(windowData->window); - windowData->unk10 = 0; + winData[work->window].active_pad = 1; + HuWinMesWait(work->window); + work->messWaitSignal = 0; break; case 4: - windowData->choice = HuWinChoiceGet(windowData->window, windowData->choice); - windowData->unk14 = 0; + work->choice = HuWinChoiceGet(work->window, work->choice); + work->choiceSignal = 0; break; } - if (windowData->unk18 != 0) { - HuWinMesSet(windowData->window, windowData->unk18); - windowData->unk18 = 0; + if (work->messToBeSet != 0) { + HuWinMesSet(work->window, work->messToBeSet); + work->messToBeSet = 0; } - windowData->unk_20 = 0; - if (windowData->unk10 != 0) { - windowData->unk_20 = 3; + work->state = 0; + if (work->messWaitSignal != 0) { + work->state = 3; } - if (windowData->unk14 != 0) { - windowData->unk_20 = 4; + if (work->choiceSignal != 0) { + work->state = 4; } HuPrcVSleep(); } diff --git a/src/REL/present/present.c b/src/REL/present/present.c index 79d8ba9c..55adf107 100644 --- a/src/REL/present/present.c +++ b/src/REL/present/present.c @@ -8,88 +8,240 @@ #include "REL/present.h" -typedef struct UnkPresentStruct2 { - /* 0x00 */ s32 unk_00; - /* 0x04 */ s32 unk_04; - /* 0x08 */ s32 unk_08; - /* 0x0C */ s32 unk_0C; - /* 0x10 */ omObjData *unk_10[134]; - /* 0x228 */ UnkWindowDataStruct *unk_228; - /* 0x22C */ UnkWindowDataStruct *unk_22C; - /* 0x230 */ s16 sprite; - /* 0x234 */ s32 unk_234; - /* 0x238 */ s32 unk_238; - /* 0x23C */ float unk_23C; - /* 0x240 */ float unk_240; - /* 0x244 */ float unk_244; - /* 0x248 */ float unk_248; - /* 0x24C */ float unk_24C; - /* 0x250 */ float unk_250; - /* 0x254 */ float unk_254; - /* 0x258 */ float unk_258; - /* 0x25C */ float unk_25C; - /* 0x260 */ float unk_260; - /* 0x264 */ float unk_264; - /* 0x268 */ float unk_268; - /* 0x26C */ float unk_26C; - /* 0x270 */ s32 unk_270[60]; -} UnkPresentStruct2; /* size = 0x3F0 */ +#define NUM_CHARACTERS 8 -typedef struct UnkPresentStruct3 { - /* 0x00 */ Vec unk_00; - /* 0x0C */ Vec unk_0C; - /* 0x18 */ GXColor unk_18; -} UnkPresentStruct3; /* size = 0x1C */ // same as option::state::UnkLightDataStruct +#define PRESENT_MDL_MAX 134 +#define PRESENT_MAX 60 -typedef struct UnkPresentNestedInnerStruct { - /* 0x00 */ s32 unk_00; - /* 0x04 */ s32 unk_04; - /* 0x08 */ s32 unk08; - /* 0x0C */ s32 unk_0C; -} UnkPresentNestedInnerStruct; /* size = 0x10 */ +#define PRESENT_COUNT_CHAR_ROOM 6 +#define PRESENT_COUNT_MG_ROOM 11 -typedef struct UnkPresentNestedOuterStruct { - /* 0x00 */ s32 unk00; - /* 0x04 */ UnkPresentNestedInnerStruct unk_04[11]; -} UnkPresentNestedOuterStruct; /* size = 0x08 */ +#define PRESENT_CONSTELLATION 5 -typedef struct UnkPresentStruct7 { - /* 0x00 */ s32 unk_00; - /* 0x04 */ float unk_04; -} UnkPresentStruct7; /* size = 0x08 */ +#define ROOM_MARIO 0 +#define ROOM_LUIGI 1 +#define ROOM_PEACH 2 +#define ROOM_YOSHI 3 +#define ROOM_WARIO 4 +#define ROOM_TROPHY 5 +#define ROOM_DK 6 +#define ROOM_DAISY 7 +#define ROOM_WALUIGI 8 +#define ROOM_MG 9 +#define ROOM_MAX 9 -static void fn_1_1928(omObjData *arg0); -static void fn_1_1FA8(omObjData *object, s32 arg1); -static void fn_1_20E8(omObjData *arg0); -static void fn_1_268C(omObjData *object, float *arg1, float *arg2, float *arg3); -static void fn_1_2708(omObjData *arg0, float arg8, s32 arg1); -static void fn_1_2774 (omObjData *arg0); -static s32 fn_1_28F0 (omObjData *object); -static void fn_1_2924(omObjData *object); -static s32 fn_1_2B84(omObjData *arg0, s32 arg1, s32 arg2); -static s32 fn_1_2BCC(omObjData *object, s32 arg1); -static s32 fn_1_2C5C(omObjData *object, s32 arg1); -static s32 fn_1_3394(s32 arg0); -static void fn_1_33AC(omObjData *arg0); +#define ROOM_CHANGE_LEFT 1 +#define ROOM_CHANGE_RIGHT 2 + +typedef struct PresentWork { + /* 0x00 */ BOOL cursorVisibleF; + /* 0x04 */ BOOL roomNotEmptyF; + /* 0x08 */ BOOL constellationSelF; + /* 0x0C */ s32 execMode; + /* 0x10 */ omObjData *object[PRESENT_MDL_MAX]; + /* 0x228 */ PresentWindow *presentDescWindow; + /* 0x22C */ PresentWindow *btnLegendWindow; + /* 0x230 */ s16 cursor; + /* 0x234 */ s32 room; + /* 0x238 */ s32 idxInRoom; + /* 0x23C */ float rot; + /* 0x240 */ float rotPrev; + /* 0x244 */ float rotTarget; + /* 0x248 */ float timeRot; + /* 0x24C */ float presentFallingTime; + /* 0x250 */ float rotSpeed; + /* 0x254 */ float presentFallingSpeed; + /* 0x258 */ float cursorTime; + /* 0x25C */ float cursorSpeed; + /* 0x260 */ Vec2f cursorPos; + /* 0x268 */ Vec2f newCursorPos; + /* 0x270 */ BOOL presentUnlockedF[PRESENT_MAX]; + /* 0x360 */ char unk360[4]; +} PresentWork; /* size = 0x364 */ + +typedef struct UnkLightDataStruct { + /* 0x00 */ Vec src; + /* 0x0C */ Vec dest; + /* 0x18 */ GXColor color; +} UnkLightDataStruct; /* size = 0x1C */ // same as option::state::UnkLightDataStruct + +typedef struct PresentData { + /* 0x00 */ s32 cursorPosIdx; + /* 0x04 */ s32 unk04; + /* 0x08 */ s32 nameMess; + /* 0x0C */ s32 descMess; +} PresentData; /* size = 0x10 */ + +typedef struct RoomData { + /* 0x00 */ s32 presentCount; + /* 0x04 */ PresentData presentData[11]; +} RoomData; /* size = 0xB4 */ + +typedef struct PresentDistanceStruct { + /* 0x00 */ s32 present; + /* 0x04 */ float distance; +} PresentDistanceStruct; /* size = 0x08 */ + +static void ExecSelectRoom(omObjData *object); +static void ChangeRoom(omObjData *object, s32 direction); +static void ExecSelectPresent(omObjData *object); +static void GetCursorPos(omObjData *object, float *x, float *y, float *z); +static void SetCameraRot(omObjData *object, float rot, s32 duration); +static void RotateCamera(omObjData *object); +static BOOL CameraRotationDoneCheck(omObjData *object); +static void ShowHidePresents(omObjData *object); +static BOOL PresentUnlocked(omObjData *object, s32 room, s32 present); +static s32 UnlockedPresents(omObjData *object, s32 room); +static s32 MoveCursor(omObjData *object, s32 arg1); +static s32 TotalPresentsInRoom(s32 room); +static void ExecPresentGet(omObjData *object); static s32 fn_1_393C(s32 arg0, s32 arg1); -UnkPresentStruct3 lbl_1_data_50 = { { 0.0f, 400.0f, 0.0f }, { 0.0f, -400.0f, -500.0f }, { 255, 255, 255, 255 } }; -omObjFunc lbl_1_data_6C[] = { NULL, fn_1_1928, fn_1_20E8, fn_1_33AC }; +static UnkLightDataStruct lightTbl = { + { 0.0f, 400.0f, 0.0f }, + { 0.0f, -400.0f, -500.0f }, + { 255, 255, 255, 255 }, +}; +static omObjFunc execModeTbl[] = { NULL, ExecSelectRoom, ExecSelectPresent, ExecPresentGet }; -static const s32 lbl_1_rodata_A0[] = { 0x006E006C, 0x006E006B, 0x006E0000, 0x006E0001, 0x006E0002, 0x006E0003, 0x006E0004, 0x006E0005, 0x006E0006, - 0x006E0007, 0x006E0008, 0x006E0009, 0x006E000A, 0x006E000B, 0x006E000C, 0x006E000D, 0x006E000E, 0x006E000F, 0x006E0010, 0x006E0011, 0x006E0012, - 0x006E0013, 0x006E0014, 0x006E0015, 0x006E0016, 0x006E0017, 0x006E0018, 0x006E0019, 0x006E001A, 0x006E001B, 0x006E001C, 0x006E001D, 0x006E001E, - 0x006E001F, 0x006E0020, 0x006E0021, 0x006E0022, 0x006E0023, 0x006E0024, 0x006E0025, 0x006E0026, 0x006E0027, 0x006E0028, 0x006E0029, 0x006E002A, - 0x006E002B, 0x006E002C, 0x006E002D, 0x006E002E, 0x006E002F, 0x006E0030, 0x006E0031, 0x006E0032, 0x006E0033, 0x006E0034, 0x006E0035, 0x006E0036, - 0x006E0037, 0x006E0038, 0x006E0039, 0x006E003A, 0x006E003B, 0x006E003C, 0x006E003D, 0x006E003E, 0x006E003F, 0x006E0040, 0x006E0041, 0x006E0042, - 0x006E0043, 0x006E0044, 0x006E0045, 0x006E0046, 0x006E0047, 0x006E0048, 0x006E0049, 0x006E004A, 0x006E004B, 0x006E004C, 0x006E004D, 0x006E004E, - 0x006E004F, 0x006E0050, 0x006E0051, 0x006E0052, 0x006E0053, 0x006E0054, 0x006E0055, 0x006E0056, 0x006E0057, 0x006E0058, 0x006E0059, 0x006E005A, - 0x006E005B, 0x006E005C, 0x006E005D, 0x006E005E, 0x006E005F, 0x006E0060, 0x006E0061, 0x006E0062, 0x006E0063, 0x006E0064, 0x006E0065, 0x006E0066, - 0x006E0067, 0x006E0068, 0x006E0069, 0x006E006A, 0x006E006D, 0x006E006F, 0x006E0071, 0x006E0073, 0x006E0075, 0x006E0077, 0x006E0079, 0x006E007B, - 0x006E007D, 0x006E006E, 0x006E0070, 0x006E0072, 0x006E0074, 0x006E0076, 0x006E0078, 0x006E007A, 0x006E007C, 0x006E007F, 0x006E0080, 0x006E0081, - 0x006E0082, 0x006E0083, 0x006E0084, 0x006E0085, 0x006E0086 }; +static const s32 presentMdlTbl[PRESENT_MDL_MAX] = { + DATA_MAKE_NUM(DATADIR_PRESENT, 108), + DATA_MAKE_NUM(DATADIR_PRESENT, 107), + DATA_MAKE_NUM(DATADIR_PRESENT, 0), + DATA_MAKE_NUM(DATADIR_PRESENT, 1), + DATA_MAKE_NUM(DATADIR_PRESENT, 2), + DATA_MAKE_NUM(DATADIR_PRESENT, 3), + DATA_MAKE_NUM(DATADIR_PRESENT, 4), + DATA_MAKE_NUM(DATADIR_PRESENT, 5), + DATA_MAKE_NUM(DATADIR_PRESENT, 6), + DATA_MAKE_NUM(DATADIR_PRESENT, 7), + DATA_MAKE_NUM(DATADIR_PRESENT, 8), + DATA_MAKE_NUM(DATADIR_PRESENT, 9), + DATA_MAKE_NUM(DATADIR_PRESENT, 10), + DATA_MAKE_NUM(DATADIR_PRESENT, 11), + DATA_MAKE_NUM(DATADIR_PRESENT, 12), + DATA_MAKE_NUM(DATADIR_PRESENT, 13), + DATA_MAKE_NUM(DATADIR_PRESENT, 14), + DATA_MAKE_NUM(DATADIR_PRESENT, 15), + DATA_MAKE_NUM(DATADIR_PRESENT, 16), + DATA_MAKE_NUM(DATADIR_PRESENT, 17), + DATA_MAKE_NUM(DATADIR_PRESENT, 18), + DATA_MAKE_NUM(DATADIR_PRESENT, 19), + DATA_MAKE_NUM(DATADIR_PRESENT, 20), + DATA_MAKE_NUM(DATADIR_PRESENT, 21), + DATA_MAKE_NUM(DATADIR_PRESENT, 22), + DATA_MAKE_NUM(DATADIR_PRESENT, 23), + DATA_MAKE_NUM(DATADIR_PRESENT, 24), + DATA_MAKE_NUM(DATADIR_PRESENT, 25), + DATA_MAKE_NUM(DATADIR_PRESENT, 26), + DATA_MAKE_NUM(DATADIR_PRESENT, 27), + DATA_MAKE_NUM(DATADIR_PRESENT, 28), + DATA_MAKE_NUM(DATADIR_PRESENT, 29), + DATA_MAKE_NUM(DATADIR_PRESENT, 30), + DATA_MAKE_NUM(DATADIR_PRESENT, 31), + DATA_MAKE_NUM(DATADIR_PRESENT, 32), + DATA_MAKE_NUM(DATADIR_PRESENT, 33), + DATA_MAKE_NUM(DATADIR_PRESENT, 34), + DATA_MAKE_NUM(DATADIR_PRESENT, 35), + DATA_MAKE_NUM(DATADIR_PRESENT, 36), + DATA_MAKE_NUM(DATADIR_PRESENT, 37), + DATA_MAKE_NUM(DATADIR_PRESENT, 38), + DATA_MAKE_NUM(DATADIR_PRESENT, 39), + DATA_MAKE_NUM(DATADIR_PRESENT, 40), + DATA_MAKE_NUM(DATADIR_PRESENT, 41), + DATA_MAKE_NUM(DATADIR_PRESENT, 42), + DATA_MAKE_NUM(DATADIR_PRESENT, 43), + DATA_MAKE_NUM(DATADIR_PRESENT, 44), + DATA_MAKE_NUM(DATADIR_PRESENT, 45), + DATA_MAKE_NUM(DATADIR_PRESENT, 46), + DATA_MAKE_NUM(DATADIR_PRESENT, 47), + DATA_MAKE_NUM(DATADIR_PRESENT, 48), + DATA_MAKE_NUM(DATADIR_PRESENT, 49), + DATA_MAKE_NUM(DATADIR_PRESENT, 50), + DATA_MAKE_NUM(DATADIR_PRESENT, 51), + DATA_MAKE_NUM(DATADIR_PRESENT, 52), + DATA_MAKE_NUM(DATADIR_PRESENT, 53), + DATA_MAKE_NUM(DATADIR_PRESENT, 54), + DATA_MAKE_NUM(DATADIR_PRESENT, 55), + DATA_MAKE_NUM(DATADIR_PRESENT, 56), + DATA_MAKE_NUM(DATADIR_PRESENT, 57), + DATA_MAKE_NUM(DATADIR_PRESENT, 58), + DATA_MAKE_NUM(DATADIR_PRESENT, 59), + DATA_MAKE_NUM(DATADIR_PRESENT, 60), + DATA_MAKE_NUM(DATADIR_PRESENT, 61), + DATA_MAKE_NUM(DATADIR_PRESENT, 62), + DATA_MAKE_NUM(DATADIR_PRESENT, 63), + DATA_MAKE_NUM(DATADIR_PRESENT, 64), + DATA_MAKE_NUM(DATADIR_PRESENT, 65), + DATA_MAKE_NUM(DATADIR_PRESENT, 66), + DATA_MAKE_NUM(DATADIR_PRESENT, 67), + DATA_MAKE_NUM(DATADIR_PRESENT, 68), + DATA_MAKE_NUM(DATADIR_PRESENT, 69), + DATA_MAKE_NUM(DATADIR_PRESENT, 70), + DATA_MAKE_NUM(DATADIR_PRESENT, 71), + DATA_MAKE_NUM(DATADIR_PRESENT, 72), + DATA_MAKE_NUM(DATADIR_PRESENT, 73), + DATA_MAKE_NUM(DATADIR_PRESENT, 74), + DATA_MAKE_NUM(DATADIR_PRESENT, 75), + DATA_MAKE_NUM(DATADIR_PRESENT, 76), + DATA_MAKE_NUM(DATADIR_PRESENT, 77), + DATA_MAKE_NUM(DATADIR_PRESENT, 78), + DATA_MAKE_NUM(DATADIR_PRESENT, 79), + DATA_MAKE_NUM(DATADIR_PRESENT, 80), + DATA_MAKE_NUM(DATADIR_PRESENT, 81), + DATA_MAKE_NUM(DATADIR_PRESENT, 82), + DATA_MAKE_NUM(DATADIR_PRESENT, 83), + DATA_MAKE_NUM(DATADIR_PRESENT, 84), + DATA_MAKE_NUM(DATADIR_PRESENT, 85), + DATA_MAKE_NUM(DATADIR_PRESENT, 86), + DATA_MAKE_NUM(DATADIR_PRESENT, 87), + DATA_MAKE_NUM(DATADIR_PRESENT, 88), + DATA_MAKE_NUM(DATADIR_PRESENT, 89), + DATA_MAKE_NUM(DATADIR_PRESENT, 90), + DATA_MAKE_NUM(DATADIR_PRESENT, 91), + DATA_MAKE_NUM(DATADIR_PRESENT, 92), + DATA_MAKE_NUM(DATADIR_PRESENT, 93), + DATA_MAKE_NUM(DATADIR_PRESENT, 94), + DATA_MAKE_NUM(DATADIR_PRESENT, 95), + DATA_MAKE_NUM(DATADIR_PRESENT, 96), + DATA_MAKE_NUM(DATADIR_PRESENT, 97), + DATA_MAKE_NUM(DATADIR_PRESENT, 98), + DATA_MAKE_NUM(DATADIR_PRESENT, 99), + DATA_MAKE_NUM(DATADIR_PRESENT, 100), + DATA_MAKE_NUM(DATADIR_PRESENT, 101), + DATA_MAKE_NUM(DATADIR_PRESENT, 102), + DATA_MAKE_NUM(DATADIR_PRESENT, 103), + DATA_MAKE_NUM(DATADIR_PRESENT, 104), + DATA_MAKE_NUM(DATADIR_PRESENT, 105), + DATA_MAKE_NUM(DATADIR_PRESENT, 106), + DATA_MAKE_NUM(DATADIR_PRESENT, 109), + DATA_MAKE_NUM(DATADIR_PRESENT, 111), + DATA_MAKE_NUM(DATADIR_PRESENT, 113), + DATA_MAKE_NUM(DATADIR_PRESENT, 115), + DATA_MAKE_NUM(DATADIR_PRESENT, 117), + DATA_MAKE_NUM(DATADIR_PRESENT, 119), + DATA_MAKE_NUM(DATADIR_PRESENT, 121), + DATA_MAKE_NUM(DATADIR_PRESENT, 123), + DATA_MAKE_NUM(DATADIR_PRESENT, 125), + DATA_MAKE_NUM(DATADIR_PRESENT, 110), + DATA_MAKE_NUM(DATADIR_PRESENT, 112), + DATA_MAKE_NUM(DATADIR_PRESENT, 114), + DATA_MAKE_NUM(DATADIR_PRESENT, 116), + DATA_MAKE_NUM(DATADIR_PRESENT, 118), + DATA_MAKE_NUM(DATADIR_PRESENT, 120), + DATA_MAKE_NUM(DATADIR_PRESENT, 122), + DATA_MAKE_NUM(DATADIR_PRESENT, 124), + DATA_MAKE_NUM(DATADIR_PRESENT, 127), + DATA_MAKE_NUM(DATADIR_PRESENT, 128), + DATA_MAKE_NUM(DATADIR_PRESENT, 129), + DATA_MAKE_NUM(DATADIR_PRESENT, 130), + DATA_MAKE_NUM(DATADIR_PRESENT, 131), + DATA_MAKE_NUM(DATADIR_PRESENT, 132), + DATA_MAKE_NUM(DATADIR_PRESENT, 133), + DATA_MAKE_NUM(DATADIR_PRESENT, 134), +}; -static const UnkPresentNestedOuterStruct lbl_1_rodata_2B8[] = { +static const RoomData roomTbl[10] = { { 0x00000006, { @@ -200,389 +352,400 @@ static const UnkPresentNestedOuterStruct lbl_1_rodata_2B8[] = { }, }; -omObjData *fn_1_1458(void) +omObjData *PresentCreate(void) { - s32 var_r30; - s32 var_r28; - s16 var_r27; - LightData *var_r26; + s32 i; + s32 j; + s16 light; + LightData *lightData; - omObjData *var_r29 = omAddObjEx(lbl_1_bss_4, 1003, 0, 0, 1, NULL); - UnkPresentStruct2 *var_r31 = HuMemDirectMallocNum(HEAP_SYSTEM, 868, MEMORY_DEFAULT_NUM); - var_r29->data = var_r31; - var_r31->unk_234 = 0; - var_r31->unk_238 = 0; - var_r31->unk_23C = 0.0f; - var_r31->unk_248 = 1.0f; - var_r31->unk_250 = 0.0f; + omObjData *object = omAddObjEx(presentObjMan, 1003, 0, 0, 1, NULL); + PresentWork *work = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(PresentWork), MEMORY_DEFAULT_NUM); + object->data = work; + work->room = 0; + work->idxInRoom = 0; + work->rot = 0.0f; + work->timeRot = 1.0f; + work->rotSpeed = 0.0f; - for (var_r30 = 0; var_r30 < 60; var_r30++) { - var_r31->unk_270[var_r30] = GWGameStat.present[var_r30]; + for (i = 0; i < PRESENT_MAX; i++) { + work->presentUnlockedF[i] = GWGameStat.present[i]; } - for (var_r30 = 0; var_r30 < 59; var_r30++) { - if (!var_r31->unk_270[var_r30]) { + for (i = 0; i < PRESENT_MAX - 1; i++) { + if (!work->presentUnlockedF[i]) { break; } } - if (var_r30 == 59) { - var_r31->unk_270[59] = 1; + if (i == PRESENT_MAX - 1) { + work->presentUnlockedF[PRESENT_MAX - 1] = TRUE; } Hu3DLighInit(); - var_r27 = Hu3DGLightCreateV(&lbl_1_data_50.unk_00, &lbl_1_data_50.unk_0C, &lbl_1_data_50.unk_18); - Hu3DGLightInfinitytSet(var_r27); - Hu3DGLightStaticSet(var_r27, 1); - var_r26 = &Hu3DGlobalLight[var_r27]; - var_r26->unk_00 = var_r26->unk_00 | 0x8000; + light = Hu3DGLightCreateV(&lightTbl.src, &lightTbl.dest, &lightTbl.color); + Hu3DGLightInfinitytSet(light); + Hu3DGLightStaticSet(light, 1); + lightData = &Hu3DGlobalLight[light]; + lightData->unk_00 |= 0x8000; - for (var_r30 = 0; var_r30 < 134; var_r30++) { - var_r31->unk_10[var_r30] = omAddObjEx(lbl_1_bss_4, 1003, 1, 0, 1, NULL); - var_r31->unk_10[var_r30]->model[0] = Hu3DModelCreate(HuDataSelHeapReadNum(lbl_1_rodata_A0[var_r30], MEMORY_DEFAULT_NUM, HEAP_DATA)); - Hu3DModelLayerSet(var_r31->unk_10[var_r30]->model[0], 0); - Hu3DModelAttrSet(var_r31->unk_10[var_r30]->model[0], 1); + for (i = 0; i < PRESENT_MDL_MAX; i++) { + work->object[i] = omAddObjEx(presentObjMan, 1003, 1, 0, 1, NULL); + work->object[i]->model[0] = Hu3DModelCreateFile(presentMdlTbl[i]); + Hu3DModelLayerSet(work->object[i]->model[0], 0); + Hu3DModelAttrSet(work->object[i]->model[0], 1); } - for (var_r28 = 0; var_r28 < 8; var_r28++) { - for (var_r30 = 0; var_r30 < 6; var_r30++) { - Hu3DModelLayerSet(var_r31->unk_10[var_r30 + 2 + var_r28 * 6 * 2]->model[0], 1); + for (j = 0; j < 8; j++) { + for (i = 0; i < 6; i++) { + Hu3DModelLayerSet(work->object[i + 2 + j * 6 * 2]->model[0], 1); } } - Hu3DModelShadowMapSet(var_r31->unk_10[0]->model[0]); - fn_1_2924(var_r29); - var_r31->sprite = espEntry(7209095, 0, 0); - espDispOff(var_r31->sprite); - var_r31->unk_228 = fn_1_3EA4(0); - var_r31->unk_22C = fn_1_3EA4(1); - fn_1_2708(var_r29, var_r31->unk_234 * 36.0f, 1); - fn_1_2774(var_r29); - fn_1_180C(var_r29, 0); + Hu3DModelShadowMapSet(work->object[0]->model[0]); + ShowHidePresents(object); + work->cursor = espEntry(DATA_MAKE_NUM(DATADIR_PRESENT, 135), 0, 0); + espDispOff(work->cursor); + work->presentDescWindow = PresentWinCreate(0); + work->btnLegendWindow = PresentWinCreate(1); + SetCameraRot(object, work->room * 36.0f, 1); + RotateCamera(object); + PresentExecModeSet(object, PRESENT_MODE_NONE); - (void)var_r27; - return var_r29; + (void)light; + return object; } -void fn_1_1784(omObjData *object) +void PresentKill(omObjData *object) { - s32 var_r30; + s32 i; - UnkPresentStruct2 *var_r31 = object->data; - fn_1_4040(var_r31->unk_228); - fn_1_4040(var_r31->unk_22C); + PresentWork *work = object->data; + PresentWinKill(work->presentDescWindow); + PresentWinKill(work->btnLegendWindow); - for (var_r30 = 0; var_r30 < 134; var_r30++) { - Hu3DModelKill(var_r31->unk_10[var_r30]->model[0]); + for (i = 0; i < PRESENT_MDL_MAX; i++) { + Hu3DModelKill(work->object[i]->model[0]); } - espKill(var_r31->sprite); - HuMemDirectFree(var_r31); + espKill(work->cursor); + HuMemDirectFree(work); } -void fn_1_180C(omObjData *object, s32 arg1) +void PresentExecModeSet(omObjData *object, s32 execMode) { - UnkPresentStruct2 *var_r31 = object->data; + PresentWork *work = object->data; - var_r31->unk_0C = arg1; - object->func = lbl_1_data_6C[arg1]; + work->execMode = execMode; + object->func = execModeTbl[execMode]; object->unk10 = 0; object->unk10 = 0; } -s32 fn_1_1850(omObjData *object) +s32 PresentExecModeGet(omObjData *object) { - UnkPresentStruct2 *var_r31 = object->data; - return var_r31->unk_0C; + PresentWork *work = object->data; + return work->execMode; } -static const s32 lbl_1_rodata_9D8[] = { 0, 1, 2, 3, 4, 6, 7, 8 }; -static const s32 lbl_1_rodata_9F8[] = { 0, 1, 2, 3, 4, 0, 5, 6, 7, 0 }; +static const s32 roomIdxTbl[NUM_CHARACTERS] = { + ROOM_MARIO, + ROOM_LUIGI, + ROOM_PEACH, + ROOM_YOSHI, + ROOM_WARIO, + ROOM_DK, + ROOM_DAISY, + ROOM_WALUIGI, +}; -void fn_1_186C(omObjData *object, s32 arg1) +void PresentSelectedIDSet(omObjData *object, s32 id) { - UnkPresentStruct2 *var_r31 = object->data; + PresentWork *work = object->data; - if (arg1 < 48) { - var_r31->unk_234 = lbl_1_rodata_9D8[arg1 / 6]; - var_r31->unk_238 = arg1 % 6; + if (id < 48) { + work->room = roomIdxTbl[id / PRESENT_COUNT_CHAR_ROOM]; + work->idxInRoom = id % PRESENT_COUNT_CHAR_ROOM; return; } - if (arg1 < 59) { - var_r31->unk_234 = 9; - var_r31->unk_238 = (arg1 - 48) % 11; + if (id < 59) { + work->room = ROOM_MG; + work->idxInRoom = (id - 48) % PRESENT_COUNT_MG_ROOM; return; } - var_r31->unk_234 = 5; - var_r31->unk_238 = 0; + work->room = ROOM_TROPHY; + work->idxInRoom = 0; } -static void fn_1_1928(omObjData *object) -{ - Vec sp8; - s32 var_r29; +static const s32 roomMessTbl[] = { 0, 1, 2, 3, 4, 0, 5, 6, 7, 0 }; - UnkPresentStruct2 *var_r31 = object->data; +static void ExecSelectRoom(omObjData *object) +{ + Vec cursorPos; + s32 mess; + + PresentWork *work = object->data; switch (object->unk10) { case 0: - var_r31->unk_00 = 0; - var_r31->unk_08 = 0; + work->cursorVisibleF = FALSE; + work->constellationSelF = FALSE; object->unk10 = 1; case 1: - if (var_r31->unk_08) { - fn_1_920(lbl_1_bss_8, 0.0f, 220.0f, 250.0f, 30); - fn_1_9A4(lbl_1_bss_8, 0.0f, 420.0f, -600.0f, 30); + if (work->constellationSelF) { + PresentCameraTargetSet(presentCamera, 0.0f, 220.0f, 250.0f, 30); + PresentCameraFocusSet(presentCamera, 0.0f, 420.0f, -600.0f, 30); } else { - fn_1_920(lbl_1_bss_8, 0.0f, 220.0f, 250.0f, 30); - fn_1_9A4(lbl_1_bss_8, 0.0f, 0.0f, -600.0f, 30); + PresentCameraTargetSet(presentCamera, 0.0f, 220.0f, 250.0f, 30); + PresentCameraFocusSet(presentCamera, 0.0f, 0.0f, -600.0f, 30); } object->unk10 = 2; case 2: - if (!fn_1_B6C(lbl_1_bss_8) && !var_r31->unk_228->unk_20 && !fn_1_28F0(object)) { - fn_1_4080(var_r31->unk_228); - fn_1_4080(var_r31->unk_22C); - if (var_r31->unk_08) { - var_r29 = 0x320080; + if (!PresentCameraDoneCheck(presentCamera) && !work->presentDescWindow->state && !CameraRotationDoneCheck(object)) { + PresentWinAnimIn(work->presentDescWindow); + PresentWinAnimIn(work->btnLegendWindow); + if (work->constellationSelF) { + mess = 0x320080; } - else if (var_r31->unk_234 == 5) { - var_r29 = 0x320085; + else if (work->room == ROOM_TROPHY) { + mess = 0x320085; } else { - var_r29 = 0x32007e; + mess = 0x32007e; } - fn_1_40B0(var_r31->unk_22C, var_r29); - switch (var_r31->unk_234) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 6: - case 7: - case 8: - if (var_r31->unk_08) { - if (fn_1_2B84(object, var_r31->unk_234, 5)) { - var_r29 = 0x320005; + PresentWinMesSet(work->btnLegendWindow, mess); + switch (work->room) { + case ROOM_MARIO: + case ROOM_LUIGI: + case ROOM_PEACH: + case ROOM_YOSHI: + case ROOM_WARIO: + case ROOM_DK: + case ROOM_DAISY: + case ROOM_WALUIGI: + if (work->constellationSelF) { + if (PresentUnlocked(object, work->room, ROOM_TROPHY)) { + mess = 0x320005; } else { - var_r29 = 0x320082; + mess = 0x320082; } } - else if (fn_1_2BCC(object, var_r31->unk_234) > 0) { - var_r29 = 0x320001; + else if (UnlockedPresents(object, work->room) > 0) { + mess = 0x320001; } else { - var_r29 = 0x320081; + mess = 0x320081; } - fn_1_40B0(var_r31->unk_228, var_r29); - fn_1_4104(var_r31->unk_228, lbl_1_rodata_9F8[var_r31->unk_234], 0); + PresentWinMesSet(work->presentDescWindow, mess); + PresentWinInsertMesSet(work->presentDescWindow, roomMessTbl[work->room], 0); break; - case 5: - if (fn_1_2B84(object, 5, 0)) { - var_r29 = 0x320041; + case ROOM_TROPHY: + if (PresentUnlocked(object, ROOM_TROPHY, 0)) { + mess = 0x320041; } else { - var_r29 = 0x320084; + mess = 0x320084; } - fn_1_40B0(var_r31->unk_228, var_r29); + PresentWinMesSet(work->presentDescWindow, mess); break; - case 9: - if (fn_1_2BCC(object, 9) > 0) { - var_r29 = 0x320083; + case ROOM_MG: + if (UnlockedPresents(object, ROOM_MG) > 0) { + mess = 0x320083; } else { - var_r29 = 0x320081; + mess = 0x320081; } - fn_1_40B0(var_r31->unk_228, var_r29); + PresentWinMesSet(work->presentDescWindow, mess); break; default: break; } - if (var_r31->unk_08) { - sp8.x = 0.0f; - sp8.y = 600.0f; - sp8.z = -500.0f; + if (work->constellationSelF) { + cursorPos.x = 0.0f; + cursorPos.y = 600.0f; + cursorPos.z = -500.0f; } else { - sp8.x = 0.0f; - sp8.y = 210.0f; - sp8.z = -500.0f; + cursorPos.x = 0.0f; + cursorPos.y = 210.0f; + cursorPos.z = -500.0f; } - Hu3D3Dto2D(&sp8, 1, &sp8); - sp8.y -= 15.0f; - sp8.x -= 20.0f; - espPosSet(var_r31->sprite, sp8.x, sp8.y); - if (!var_r31->unk_00) { - fn_1_144(var_r31->sprite, 1, 5); - var_r31->unk_00 = 1; + Hu3D3Dto2D(&cursorPos, 1, &cursorPos); + cursorPos.y -= 15.0f; + cursorPos.x -= 20.0f; + espPosSet(work->cursor, cursorPos.x, cursorPos.y); + if (!work->cursorVisibleF) { + PresentFadeSprite(work->cursor, TRUE, 5); + work->cursorVisibleF = TRUE; } object->unk10 = 3; } break; case 3: - if (!var_r31->unk_228->unk_20) { - if (fn_1_550(512) && !var_r31->unk_08) { - fn_1_144(var_r31->sprite, 0, 5); - var_r31->unk_00 = 0; - fn_1_4098(var_r31->unk_228); - fn_1_4098(var_r31->unk_22C); + if (!work->presentDescWindow->state) { + if (PresentPadCheck(PAD_BUTTON_B) && !work->constellationSelF) { + PresentFadeSprite(work->cursor, FALSE, 5); + work->cursorVisibleF = FALSE; + PresentWinAnimOut(work->presentDescWindow); + PresentWinAnimOut(work->btnLegendWindow); HuAudFXPlay(3); object->unk10 = 4; } - else if (fn_1_550(256) && !var_r31->unk_08) { - if (var_r31->unk_234 != 5) { - fn_1_144(var_r31->sprite, 0, 5); - var_r31->unk_00 = 0; - fn_1_4098(var_r31->unk_228); - fn_1_4098(var_r31->unk_22C); + else if (PresentPadCheck(PAD_BUTTON_A) && !work->constellationSelF) { + if (work->room != ROOM_TROPHY) { + PresentFadeSprite(work->cursor, FALSE, 5); + work->cursorVisibleF = FALSE; + PresentWinAnimOut(work->presentDescWindow); + PresentWinAnimOut(work->btnLegendWindow); HuAudFXPlay(2); - fn_1_180C(object, 2); + PresentExecModeSet(object, PRESENT_MODE_SELECT_PRESENT); } } - else if (fn_1_584(8) && !var_r31->unk_08) { - if ((var_r31->unk_234 != 5) && (var_r31->unk_234 != 9)) { - var_r31->unk_08 = 1; - fn_1_144(var_r31->sprite, 0, 5); - var_r31->unk_00 = 0; - fn_1_4098(var_r31->unk_228); - fn_1_4098(var_r31->unk_22C); + else if (PresentPadDStkRepCheck(PAD_BUTTON_UP) && !work->constellationSelF) { + if (work->room != ROOM_TROPHY && work->room != ROOM_MG) { + work->constellationSelF = TRUE; + PresentFadeSprite(work->cursor, FALSE, 5); + work->cursorVisibleF = FALSE; + PresentWinAnimOut(work->presentDescWindow); + PresentWinAnimOut(work->btnLegendWindow); HuAudFXPlay(0); object->unk10 = 1; } } - else if (fn_1_584(4) && var_r31->unk_08) { - var_r31->unk_08 = 0; - fn_1_144(var_r31->sprite, 0, 5); - var_r31->unk_00 = 0; - fn_1_4098(var_r31->unk_228); - fn_1_4098(var_r31->unk_22C); + else if (PresentPadDStkRepCheck(PAD_BUTTON_DOWN) && work->constellationSelF) { + work->constellationSelF = FALSE; + PresentFadeSprite(work->cursor, FALSE, 5); + work->cursorVisibleF = FALSE; + PresentWinAnimOut(work->presentDescWindow); + PresentWinAnimOut(work->btnLegendWindow); HuAudFXPlay(0); object->unk10 = 1; } - else if (fn_1_584(1)) { - fn_1_1FA8(object, 1); + else if (PresentPadDStkRepCheck(PAD_BUTTON_LEFT)) { + ChangeRoom(object, ROOM_CHANGE_LEFT); HuAudFXPlay(0); object->unk10 = 2; } - else if (fn_1_584(2)) { - fn_1_1FA8(object, 2); + else if (PresentPadDStkRepCheck(PAD_BUTTON_RIGHT)) { + ChangeRoom(object, ROOM_CHANGE_RIGHT); HuAudFXPlay(0); object->unk10 = 2; } } break; case 4: - fn_1_180C(object, 0); + PresentExecModeSet(object, PRESENT_MODE_NONE); break; } - fn_1_2774(object); + RotateCamera(object); } -static void fn_1_1FA8(omObjData *object, s32 arg1) +static void ChangeRoom(omObjData *object, s32 direction) { - float var_f31; - float var_f30; - float var_f29; + float rotAbs; + float rot; + float rotTarget; - s32 var_r30; - s32 var_r29; - s32 var_r28; + s32 special; + s32 change; + s32 duration; - UnkPresentStruct2 *var_r31 = object->data; + PresentWork *work = object->data; - for (var_r30 = 0, var_f31 = 0.0f;; var_r30++) { - var_f31 += 36.0f; - if (arg1 == 1) { - var_r29 = -1; + for (special = 0, rotAbs = 0.0f;; special++) { + rotAbs += 36.0f; + if (direction == ROOM_CHANGE_LEFT) { + change = -1; } else { - var_r29 = 1; + change = 1; } - var_r31->unk_234 = var_r31->unk_234 + var_r29; - if (var_r31->unk_234 < 0) { - var_r31->unk_234 = 9; + work->room += change; + if (work->room < ROOM_MARIO) { + work->room = ROOM_MAX; } - else if (var_r31->unk_234 >= 10) { - var_r31->unk_234 = 0; + else if (work->room >= ROOM_MAX + 1) { + work->room = ROOM_MARIO; } - if (!((var_r31->unk_08) && ((var_r31->unk_234 == 5) || (var_r31->unk_234 == 9)))) { + if (!work->constellationSelF || (work->room != ROOM_TROPHY && work->room != ROOM_MG)) { break; } } - if (arg1 == 1) { - var_f30 = -var_f31; + if (direction == ROOM_CHANGE_LEFT) { + rot = -rotAbs; } else { - var_f30 = var_f31; + rot = rotAbs; } - var_f29 = var_r31->unk_23C + var_f30; - if (!var_r30) { - var_r28 = 30; + rotTarget = work->rot + rot; + if (special == 0) { + duration = 30; } else { - var_r28 = 45; + duration = 45; } - fn_1_2708(object, var_f29, var_r28); + SetCameraRot(object, rotTarget, duration); } -static void fn_1_20E8(omObjData *object) +static void ExecSelectPresent(omObjData *object) { - float var_f31; - float var_f30; + float cursorX; + float cursorY; - UnkPresentStruct2 *var_r31 = object->data; - s32 var_r29 = var_r31->unk_238; - s32 var_r27 = var_r31->unk_234; + PresentWork *work = object->data; + s32 idxInRoom = work->idxInRoom; + s32 room = work->room; switch (object->unk10) { case 0: - fn_1_920(lbl_1_bss_8, 0.0f, 220.0f, -120.0f, 30); - fn_1_9A4(lbl_1_bss_8, 0.0f, 0.0f, -600.0f, 30); - var_r31->unk_04 = fn_1_2BCC(object, var_r27) > 0; - var_r31->unk_00 = 0; - var_r31->unk_238 = 0; - if (var_r31->unk_04) { - s32 var_r25 = fn_1_3394(var_r31->unk_234); - s32 var_r28; - for (var_r28 = 0; var_r28 < var_r25; var_r28++) { - if (fn_1_2B84(object, var_r27, var_r28)) { - var_r31->unk_238 = var_r28; + PresentCameraTargetSet(presentCamera, 0.0f, 220.0f, -120.0f, 30); + PresentCameraFocusSet(presentCamera, 0.0f, 0.0f, -600.0f, 30); + work->roomNotEmptyF = UnlockedPresents(object, room) > 0; + work->cursorVisibleF = FALSE; + work->idxInRoom = 0; + if (work->roomNotEmptyF) { + s32 totalPresents = TotalPresentsInRoom(work->room); + s32 i; + // set the initial present to the highest unlocked one + for (i = 0; i < totalPresents; i++) { + if (PresentUnlocked(object, room, i)) { + work->idxInRoom = i; break; } } } object->unk10 = 1; case 1: - if (fn_1_B6C(lbl_1_bss_8)) { + if (PresentCameraDoneCheck(presentCamera)) { break; } - fn_1_4080(var_r31->unk_228); - fn_1_4080(var_r31->unk_22C); - fn_1_40B0(var_r31->unk_22C, 0x32007F); + PresentWinAnimIn(work->presentDescWindow); + PresentWinAnimIn(work->btnLegendWindow); + PresentWinMesSet(work->btnLegendWindow, 0x32007F); - if (var_r31->unk_04) { - fn_1_40B0(var_r31->unk_228, lbl_1_rodata_2B8[var_r27].unk_04[var_r29].unk_0C); + if (work->roomNotEmptyF) { + PresentWinMesSet(work->presentDescWindow, roomTbl[room].presentData[idxInRoom].descMess); } else { - fn_1_40B0(var_r31->unk_228, 0x320003); + PresentWinMesSet(work->presentDescWindow, 0x320003); } - var_r31->unk_258 = 0.0f; - var_r31->unk_25C = 5.0f / 30.0f; - if (var_r31->unk_04) { - Vec sp8; - fn_1_268C(var_r31->unk_10[lbl_1_rodata_2B8[var_r27].unk_04[var_r29].unk_00], &sp8.x, &sp8.y, &sp8.z); - Hu3D3Dto2D(&sp8, 1, &sp8); - sp8.y -= 15.0f; - sp8.x -= 20.0f; - if (!var_r31->unk_00) { - fn_1_144(var_r31->sprite, 1, 5); - var_r31->unk_00 = 1; - var_r31->unk_260 = sp8.x; - var_r31->unk_264 = sp8.y; + work->cursorTime = 0.0f; + work->cursorSpeed = 1.0f / 6.0f; + if (work->roomNotEmptyF) { + Vec cursorPos; + GetCursorPos(work->object[roomTbl[room].presentData[idxInRoom].cursorPosIdx], &cursorPos.x, &cursorPos.y, &cursorPos.z); + Hu3D3Dto2D(&cursorPos, 1, &cursorPos); + cursorPos.y -= 15.0f; + cursorPos.x -= 20.0f; + if (!work->cursorVisibleF) { + PresentFadeSprite(work->cursor, TRUE, 5); + work->cursorVisibleF = TRUE; + work->cursorPos.x = cursorPos.x; + work->cursorPos.y = cursorPos.y; } else { - var_r31->unk_260 = var_r31->unk_268; - var_r31->unk_264 = var_r31->unk_26C; + work->cursorPos.x = work->newCursorPos.x; + work->cursorPos.y = work->newCursorPos.y; } - var_r31->unk_268 = sp8.x; - var_r31->unk_26C = sp8.y; + work->newCursorPos.x = cursorPos.x; + work->newCursorPos.y = cursorPos.y; object->unk10 = 2; } else { @@ -590,241 +753,250 @@ static void fn_1_20E8(omObjData *object) break; } case 2: - var_f31 = var_r31->unk_260 + (var_r31->unk_258 * (var_r31->unk_268 - var_r31->unk_260)); - var_f30 = var_r31->unk_264 + (var_r31->unk_258 * (var_r31->unk_26C - var_r31->unk_264)); - espPosSet(var_r31->sprite, var_f31, var_f30); - if ((var_r31->unk_258 = var_r31->unk_258 + var_r31->unk_25C) < 1.0f) { + cursorX = work->cursorPos.x + (work->cursorTime * (work->newCursorPos.x - work->cursorPos.x)); + cursorY = work->cursorPos.y + (work->cursorTime * (work->newCursorPos.y - work->cursorPos.y)); + espPosSet(work->cursor, cursorX, cursorY); + if ((work->cursorTime += work->cursorSpeed) < 1.0f) { break; } - espPosSet(var_r31->sprite, var_r31->unk_268, var_r31->unk_26C); + espPosSet(work->cursor, work->newCursorPos.x, work->newCursorPos.y); object->unk10 = 3; case 3: - if (fn_1_550(512)) { - fn_1_4098(var_r31->unk_228); - fn_1_4098(var_r31->unk_22C); + if (PresentPadCheck(PAD_BUTTON_B)) { + PresentWinAnimOut(work->presentDescWindow); + PresentWinAnimOut(work->btnLegendWindow); HuAudFXPlay(3); object->unk10 = 4; } - else if (var_r31->unk_04) { - if (fn_1_584(1) && fn_1_5B8(8)) { - var_r29 = fn_1_2C5C(object, 5); + else if (work->roomNotEmptyF) { + if (PresentPadDStkRepCheck(PAD_BUTTON_LEFT) && PresentPadDStkCheck(PAD_BUTTON_UP)) { + idxInRoom = MoveCursor(object, 5); } - else if (fn_1_584(1) && fn_1_5B8(4)) { - var_r29 = fn_1_2C5C(object, 9); + else if (PresentPadDStkRepCheck(PAD_BUTTON_LEFT) && PresentPadDStkCheck(PAD_BUTTON_DOWN)) { + idxInRoom = MoveCursor(object, 9); } - else if (fn_1_584(2) && fn_1_5B8(8)) { - var_r29 = fn_1_2C5C(object, 6); + else if (PresentPadDStkRepCheck(PAD_BUTTON_RIGHT) && PresentPadDStkCheck(PAD_BUTTON_UP)) { + idxInRoom = MoveCursor(object, 6); } - else if (fn_1_584(2) && fn_1_5B8(4)) { - var_r29 = fn_1_2C5C(object, 10); + else if (PresentPadDStkRepCheck(PAD_BUTTON_RIGHT) && PresentPadDStkCheck(PAD_BUTTON_DOWN)) { + idxInRoom = MoveCursor(object, 10); } - else if (fn_1_584(1)) { - var_r29 = fn_1_2C5C(object, 1); + else if (PresentPadDStkRepCheck(PAD_BUTTON_LEFT)) { + idxInRoom = MoveCursor(object, 1); } - else if (fn_1_584(2)) { - var_r29 = fn_1_2C5C(object, 2); + else if (PresentPadDStkRepCheck(PAD_BUTTON_RIGHT)) { + idxInRoom = MoveCursor(object, 2); } - else if (fn_1_584(8)) { - var_r29 = fn_1_2C5C(object, 4); + else if (PresentPadDStkRepCheck(PAD_BUTTON_UP)) { + idxInRoom = MoveCursor(object, 4); } - else if (fn_1_584(4)) { - var_r29 = fn_1_2C5C(object, 8); + else if (PresentPadDStkRepCheck(PAD_BUTTON_DOWN)) { + idxInRoom = MoveCursor(object, 8); } } else { break; } - if (var_r29 == -1) { - var_r29 = var_r31->unk_238; + if (idxInRoom == -1) { + idxInRoom = work->idxInRoom; } - if (var_r29 != var_r31->unk_238) { - var_r31->unk_238 = var_r29; + if (idxInRoom != work->idxInRoom) { + work->idxInRoom = idxInRoom; object->unk10 = 1; HuAudFXPlay(0); } break; case 4: - if (var_r31->unk_00) { - fn_1_144(var_r31->sprite, 0, 5); + if (work->cursorVisibleF) { + PresentFadeSprite(work->cursor, FALSE, 5); } - fn_1_180C(object, 1); + PresentExecModeSet(object, PRESENT_MODE_SELECT_ROOM); break; default: break; } } -static void fn_1_268C(omObjData *object, float *arg1, float *arg2, float *arg3) +static void GetCursorPos(omObjData *object, float *x, float *y, float *z) { Mtx sp8; Hu3DModelObjMtxGet(object->model[0], "cursor", sp8); - *arg1 = sp8[0][3]; - *arg2 = sp8[1][3]; - *arg3 = sp8[2][3]; + *x = sp8[0][3]; + *y = sp8[1][3]; + *z = sp8[2][3]; } -static void fn_1_2708(omObjData *arg0, float arg8, s32 arg1) +static void SetCameraRot(omObjData *object, float rot, s32 duration) { - UnkPresentStruct2 *var_r31 = arg0->data; + PresentWork *work = object->data; - var_r31->unk_244 = arg8; - var_r31->unk_240 = var_r31->unk_23C; - var_r31->unk_248 = 0.0f; - var_r31->unk_250 = 1.0f / arg1; + work->rotTarget = rot; + work->rotPrev = work->rot; + work->timeRot = 0.0f; + work->rotSpeed = 1.0f / duration; } -static void fn_1_2774 (omObjData *object) +static void RotateCamera(omObjData *object) { - s32 var_r30; - UnkPresentStruct2 *var_r31 = object->data; + s32 i; + PresentWork *work = object->data; - if (var_r31->unk_248 < 1.0f) { - float var_f31 = sin(90.0f * var_r31->unk_248 * M_PI / 180.0f); - var_f31 *= var_f31; - var_r31->unk_23C = var_r31->unk_240 + (var_f31 * (var_r31->unk_244 - var_r31->unk_240)); + if (work->timeRot < 1.0f) { + float weight = sind(90.0f * work->timeRot); + weight *= weight; + work->rot = work->rotPrev + (weight * (work->rotTarget - work->rotPrev)); - if ((var_r31->unk_248 = var_r31->unk_248 + var_r31->unk_250) >= 1.0f) { - var_r31->unk_23C = var_r31->unk_244; + if ((work->timeRot += work->rotSpeed) >= 1.0f) { + work->rot = work->rotTarget; } } - var_r31->unk_23C = fmod(var_r31->unk_23C, 360.0); + work->rot = fmod(work->rot, 360.0); - if (var_r31->unk_23C < 0.0f) { - var_r31->unk_23C += 360.0f; + if (work->rot < 0.0f) { + work->rot += 360.0f; } - for (var_r30 = 0; var_r30 < 134; var_r30++) { - omSetRot(var_r31->unk_10[var_r30], 0.0f, var_r31->unk_23C, 0.0f); + for (i = 0; i < PRESENT_MDL_MAX; i++) { + omSetRot(work->object[i], 0.0f, work->rot, 0.0f); } } -static s32 fn_1_28F0 (omObjData *object) +static BOOL CameraRotationDoneCheck(omObjData *object) { - UnkPresentStruct2 *var_r31 = object->data; - return var_r31->unk_248 < 1.0f; + PresentWork *work = object->data; + return work->timeRot < 1.0f; } -s32 lbl_1_data_84[] = { 0, 1, 2, 3, 4, 6, 7, 8 }; +s32 roomIdxTbl2[NUM_CHARACTERS] = { + ROOM_MARIO, + ROOM_LUIGI, + ROOM_PEACH, + ROOM_YOSHI, + ROOM_WARIO, + ROOM_DK, + ROOM_DAISY, + ROOM_WALUIGI, +}; -static void fn_1_2924(omObjData *object) +static void ShowHidePresents(omObjData *object) { - UnkPresentStruct2 *var_r31 = object->data; - s32 var_r30; - s32 var_r29; + PresentWork *work = object->data; + s32 character; + s32 i; - Hu3DModelAttrReset(var_r31->unk_10[0]->model[0], 1); + Hu3DModelAttrReset(work->object[0]->model[0], 1); - for (var_r29 = 0; var_r29 < 8; var_r29++) { - s32 var_r27; - if (fn_1_2BCC(object, lbl_1_data_84[var_r29]) > 0) { - Hu3DModelAttrReset(var_r31->unk_10[var_r29 + 109]->model[0], 1); + for (character = 0; character < NUM_CHARACTERS; character++) { + s32 j; + if (UnlockedPresents(object, roomIdxTbl2[character]) > 0) { + Hu3DModelAttrReset(work->object[character + 109]->model[0], 1); } - for (var_r27 = 0, var_r30 = 0; var_r30 < 6; var_r30++) { - if (fn_1_2B84(object, lbl_1_data_84[var_r29], var_r30)) { - Hu3DModelAttrReset(var_r31->unk_10[var_r29 * 6 * 2 + 2 + var_r30]->model[0], 1); - Hu3DModelAttrReset(var_r31->unk_10[var_r29 * 6 * 2 + 8 + var_r30]->model[0], 1); - var_r27++; + for (j = 0, i = 0; i < PRESENT_COUNT_CHAR_ROOM; i++) { + if (PresentUnlocked(object, roomIdxTbl2[character], i)) { + Hu3DModelAttrReset(work->object[character * PRESENT_COUNT_CHAR_ROOM * 2 + 2 + i]->model[0], 1); + Hu3DModelAttrReset(work->object[character * PRESENT_COUNT_CHAR_ROOM * 2 + 8 + i]->model[0], 1); + j++; } } - if (var_r27 >= 6) { - Hu3DModelAttrReset(var_r31->unk_10[var_r29 + 118]->model[0], 1); + if (j >= 6) { + Hu3DModelAttrReset(work->object[character + 118]->model[0], 1); } } - if (fn_1_2BCC(object, 9) > 0) { - Hu3DModelAttrReset(var_r31->unk_10[117]->model[0], 1); + if (UnlockedPresents(object, ROOM_MG) > 0) { + Hu3DModelAttrReset(work->object[117]->model[0], 1); } - for (var_r30 = 0; var_r30 < 11; var_r30++) { - if (fn_1_2B84(object, 9, var_r30)) { - Hu3DModelAttrReset(var_r31->unk_10[var_r30 + 98]->model[0], 1); + for (i = 0; i < PRESENT_COUNT_MG_ROOM; i++) { + if (PresentUnlocked(object, ROOM_MG, i)) { + Hu3DModelAttrReset(work->object[i + 98]->model[0], 1); } } - if (fn_1_2B84(object, 5, 0)) { - Hu3DModelAttrReset(var_r31->unk_10[1]->model[0], 1); + if (PresentUnlocked(object, ROOM_TROPHY, 0)) { + Hu3DModelAttrReset(work->object[1]->model[0], 1); } - for (var_r30 = 0; var_r30 < 8; var_r30++) { - if (fn_1_2B84(object, lbl_1_data_84[var_r30], 5)) { - Hu3DModelAttrReset(var_r31->unk_10[var_r30 + 126]->model[0], 1); + for (i = 0; i < NUM_CHARACTERS; i++) { + if (PresentUnlocked(object, roomIdxTbl2[i], PRESENT_CONSTELLATION)) { + Hu3DModelAttrReset(work->object[i + 126]->model[0], 1); } } } -static const s32 lbl_1_rodata_A74[] = { 0, 6, 12, 18, 24, 59, 30, 36, 42, 48 }; +static const s32 roomPresentOffsetTbl[] = { 0, 6, 12, 18, 24, 59, 30, 36, 42, 48 }; -static s32 fn_1_2B84(omObjData *arg0, s32 arg1, s32 arg2) +static BOOL PresentUnlocked(omObjData *object, s32 room, s32 present) { - UnkPresentStruct2 *var_r31 = arg0->data; - return var_r31->unk_270[arg2 + lbl_1_rodata_A74[arg1]] != 0; + PresentWork *work = object->data; + return work->presentUnlockedF[roomPresentOffsetTbl[room] + present] != 0; } -static s32 fn_1_2BCC(omObjData *object, s32 arg1) +static s32 UnlockedPresents(omObjData *object, s32 room) { - s32 var_r31; - s32 var_r30; - s32 var_r28 = fn_1_3394(arg1); + s32 i; + s32 unlockedPresents; + s32 presentCount = TotalPresentsInRoom(room); - for (var_r30 = 0, var_r31 = 0; var_r31 < var_r28; var_r31++) { - if (fn_1_2B84(object, arg1, var_r31)) { - var_r30++; + for (unlockedPresents = 0, i = 0; i < presentCount; i++) { + if (PresentUnlocked(object, room, i)) { + unlockedPresents++; } } - return var_r30; + return unlockedPresents; } -static s32 fn_1_2C5C(omObjData *object, s32 arg1) +/* Returns the index of the newly selected present inside the room */ +static s32 MoveCursor(omObjData *object, s32 arg1) { - UnkPresentStruct7 spA4[10]; - Vec sp38; + PresentDistanceStruct availablePresents[10]; + Vec cursorPos; - float var_f31; - float var_f30; + float angle; - UnkPresentStruct2 *var_r31 = object->data; - s32 var_r30; - s32 var_r28; - s32 var_r26; + PresentWork *work = object->data; + s32 present; + s32 i; + s32 j; s32 var_r23; - s32 var_r22 = fn_1_3394(var_r31->unk_234); - s32 var_r18 = fn_1_2BCC(object, var_r31->unk_234); + s32 totalPresents = TotalPresentsInRoom(work->room); + s32 unlockedPresents = UnlockedPresents(object, work->room); - if (var_r18 == 1) { - return var_r31->unk_238; + if (unlockedPresents == 1) { + return work->idxInRoom; } - fn_1_268C(var_r31->unk_10[lbl_1_rodata_2B8[var_r31->unk_234].unk_04[var_r31->unk_238].unk_00], &sp38.x, &sp38.y, &sp38.z); - Hu3D3Dto2D(&sp38, 1, &sp38); - for (var_r28 = 0, var_r26 = 0; !var_r28 && (var_r26 < 1); var_r26++) { - for (var_r28 = 0, var_r30 = 0; var_r30 < var_r22; var_r30++) { - Vec sp2C; - float var_f29; - if (var_r30 == var_r31->unk_238) { + GetCursorPos(work->object[roomTbl[work->room].presentData[work->idxInRoom].cursorPosIdx], &cursorPos.x, &cursorPos.y, &cursorPos.z); + Hu3D3Dto2D(&cursorPos, 1, &cursorPos); + for (i = 0, j = 0; i == 0 && j < 1; j++) { + for (i = 0, present = 0; present < totalPresents; present++) { + Vec cursorPosNew; + float dx, dy; + if (present == work->idxInRoom) { continue; } - if (!fn_1_2B84(object, var_r31->unk_234, var_r30)) { + if (!PresentUnlocked(object, work->room, present)) { continue; } - fn_1_268C(var_r31->unk_10[lbl_1_rodata_2B8[var_r31->unk_234].unk_04[var_r30].unk_00], &sp2C.x, &sp2C.y, &sp2C.z); - Hu3D3Dto2D(&sp2C, 1, &sp2C); - var_f30 = sp38.x - sp2C.x; - var_f29 = sp38.y - sp2C.y; - var_f31 = fmod(atan2d(var_f30, var_f29), 360.0); - if (var_f31 < 0.0f) { - var_f31 += 360.0f; + GetCursorPos(work->object[roomTbl[work->room].presentData[present].cursorPosIdx], &cursorPosNew.x, &cursorPosNew.y, &cursorPosNew.z); + Hu3D3Dto2D(&cursorPosNew, 1, &cursorPosNew); + dx = cursorPos.x - cursorPosNew.x; + dy = cursorPos.y - cursorPosNew.y; + angle = fmod(atan2d(dx, dy), 360.0); + if (angle < 0.0f) { + angle += 360.0f; } - if ((arg1 == 1 && var_f31 >= 45.0f && var_f31 < 135.0f) || (arg1 == 2 && var_f31 >= 225.0f && var_f31 < 315.0f) - || (arg1 == 8 && var_f31 >= 135.0f && var_f31 < 225.0f) - || (arg1 == 4 && (var_f31 >= 0.0f && var_f31 < 45.0f || var_f31 >= 315.0f && var_f31 < 360.0f)) - || (arg1 == 5 && var_f31 >= 0.0f && var_f31 < 90.0f) || (arg1 == 9 && var_f31 >= 90.0f && var_f31 < 180.0f) - || (arg1 == 6 && var_f31 >= 270.0f && var_f31 < 360.0f) || (arg1 == 10 && var_f31 >= 180.0f && var_f31 < 270.0f)) { - spA4[var_r28].unk_00 = var_r30; - spA4[var_r28].unk_04 = sqrtf(var_f30 * var_f30 + var_f29 * var_f29); - var_r28++; + if ((arg1 == 1 && angle >= 45.0f && angle < 135.0f) || (arg1 == 2 && angle >= 225.0f && angle < 315.0f) + || (arg1 == 8 && angle >= 135.0f && angle < 225.0f) + || (arg1 == 4 && (angle >= 0.0f && angle < 45.0f || angle >= 315.0f && angle < 360.0f)) + || (arg1 == 5 && angle >= 0.0f && angle < 90.0f) || (arg1 == 9 && angle >= 90.0f && angle < 180.0f) + || (arg1 == 6 && angle >= 270.0f && angle < 360.0f) || (arg1 == 10 && angle >= 180.0f && angle < 270.0f)) { + availablePresents[i].present = present; + availablePresents[i].distance = sqrtf(dx * dx + dy * dy); + i++; } } - if (var_r28) { + if (i != 0) { continue; } switch (arg1) { @@ -862,85 +1034,85 @@ static s32 fn_1_2C5C(omObjData *object, s32 arg1) break; } } - if (!var_r28) { - return var_r31->unk_238; + if (i == 0) { + return work->idxInRoom; } do { - for (var_r23 = 0, var_r30 = 0; var_r30 < (var_r28 - 1); var_r30++) { - if (spA4[var_r30].unk_04 > spA4[var_r30 + 1].unk_04) { - UnkPresentStruct7 sp24 = spA4[var_r30 + 1]; - spA4[var_r30 + 1] = spA4[var_r30]; - spA4[var_r30] = sp24; + for (var_r23 = 0, present = 0; present < (i - 1); present++) { + if (availablePresents[present].distance > availablePresents[present + 1].distance) { + PresentDistanceStruct next = availablePresents[present + 1]; + availablePresents[present + 1] = availablePresents[present]; + availablePresents[present] = next; var_r23 = 1; } } } while (var_r23); - return spA4[(var_r26 <= 1) ? 0 : var_r28 - 1].unk_00; + return availablePresents[(j <= 1) ? 0 : i - 1].present; } -static const s32 lbl_1_rodata_AC8[] = { 6, 6, 6, 6, 6, 1, 6, 6, 6, 11 }; +static const s32 totalPresentCntTbl[10] = { 6, 6, 6, 6, 6, 1, 6, 6, 6, 11 }; -static s32 fn_1_3394(s32 arg0) +static s32 TotalPresentsInRoom(s32 room) { - return lbl_1_rodata_AC8[arg0]; + return totalPresentCntTbl[room]; } -static const s32 lbl_1_rodata_AF0[] = { 2, 14, 26, 38, 50, 0, 62, 74, 86, 0 }; -static const s32 lbl_1_rodata_B18[] = { 8, 20, 32, 44, 56, 0, 68, 80, 92, 0 }; -static const s32 lbl_1_rodata_B40[] = { 126, 127, 128, 129, 130, 0, 131, 132, 133, 0 }; -static const s32 lbl_1_rodata_B68[] = { 118, 119, 120, 121, 122, 0, 123, 124, 125, 0 }; +static const s32 presentItemIdxTbl[10] = { 2, 14, 26, 38, 50, 0, 62, 74, 86, 0 }; +static const s32 lbl_1_rodata_B18[10] = { 8, 20, 32, 44, 56, 0, 68, 80, 92, 0 }; +static const s32 constellationIdxTbl[10] = { 126, 127, 128, 129, 130, 0, 131, 132, 133, 0 }; +static const s32 roofIdxTbl[10] = { 118, 119, 120, 121, 122, 0, 123, 124, 125, 0 }; -static void fn_1_33AC(omObjData *object) +static void ExecPresentGet(omObjData *object) { - f32 var_f31; - f32 var_f29; + f32 weight; + f32 rot; - UnkPresentStruct2 *var_r31 = object->data; + PresentWork *work = object->data; switch (object->unk10) { case 0: - var_f29 = 36.0f * var_r31->unk_234; - fn_1_2708(object, var_f29, 1); - fn_1_2774(object); - Hu3DModelAttrSet(var_r31->unk_10[var_r31->unk_238 + lbl_1_rodata_B18[var_r31->unk_234]]->model[0], 1); - Hu3DModelAttrSet(var_r31->unk_10[lbl_1_rodata_B68[var_r31->unk_234]]->model[0], 1); - Hu3DModelAttrSet(var_r31->unk_10[lbl_1_rodata_B40[var_r31->unk_234]]->model[0], 1); - var_r31->unk_24C = 0.0f; - var_r31->unk_254 = 1.0f / 360.0f; + rot = 36.0f * work->room; + SetCameraRot(object, rot, 1); + RotateCamera(object); + Hu3DModelAttrSet(work->object[work->idxInRoom + lbl_1_rodata_B18[work->room]]->model[0], 1); + Hu3DModelAttrSet(work->object[roofIdxTbl[work->room]]->model[0], 1); + Hu3DModelAttrSet(work->object[constellationIdxTbl[work->room]]->model[0], 1); + work->presentFallingTime = 0.0f; + work->presentFallingSpeed = 1.0f / 360.0f; object->unk10 = 1; case 1: WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 120); object->unk10 = 2; case 2: - var_f31 = sind(90.0f * var_r31->unk_24C); - var_f31 *= var_f31; - fn_1_920(lbl_1_bss_8, 0.0f, 820.0f - (600.0f * var_f31), -120.0f, 1); - fn_1_9A4(lbl_1_bss_8, 0.0f, 680.0f - (680.0f * var_f31), -600.0f, 1); - omSetTra(var_r31->unk_10[var_r31->unk_238 + lbl_1_rodata_AF0[var_r31->unk_234]], 0.0f, 840.0f - (840.0f * var_f31), 0.0f); - if ((var_r31->unk_24C = var_r31->unk_24C + var_r31->unk_254) < 1.0f) { + weight = sind(90.0f * work->presentFallingTime); + weight *= weight; + PresentCameraTargetSet(presentCamera, 0.0f, 820.0f - (600.0f * weight), -120.0f, 1); + PresentCameraFocusSet(presentCamera, 0.0f, 680.0f - (680.0f * weight), -600.0f, 1); + omSetTra(work->object[work->idxInRoom + presentItemIdxTbl[work->room]], 0.0f, 840.0f - (840.0f * weight), 0.0f); + if ((work->presentFallingTime += work->presentFallingSpeed) < 1.0f) { return; } - if (fn_1_393C(var_r31->unk_234, var_r31->unk_238)) { - fn_1_334(var_r31->unk_10[var_r31->unk_238 + lbl_1_rodata_B18[var_r31->unk_234]]->model[0], 1, 0.4f, 30); + if (fn_1_393C(work->room, work->idxInRoom)) { + FadeSpriteWithMultiplier(work->object[work->idxInRoom + lbl_1_rodata_B18[work->room]]->model[0], 1, 0.4f, 30); } object->unk10 = 3; case 3: - fn_1_4080(var_r31->unk_228); - fn_1_4104(var_r31->unk_228, lbl_1_rodata_2B8[var_r31->unk_234].unk_04[var_r31->unk_238].unk08, 0); - fn_1_40B0(var_r31->unk_228, 0x320004); - fn_1_419C(var_r31->unk_228); + PresentWinAnimIn(work->presentDescWindow); + PresentWinInsertMesSet(work->presentDescWindow, roomTbl[work->room].presentData[work->idxInRoom].nameMess, 0); + PresentWinMesSet(work->presentDescWindow, 0x320004); + PresentWinMesWait(work->presentDescWindow); object->unk10 = 4; case 4: - if (var_r31->unk_228->unk_20) { + if (work->presentDescWindow->state) { break; } object->unk10 = 5; case 5: - fn_1_4098(var_r31->unk_228); + PresentWinAnimOut(work->presentDescWindow); object->unk10 = 6; case 6: - if (!var_r31->unk_228->unk_20) { - fn_1_180C(object, 0); + if (!work->presentDescWindow->state) { + PresentExecModeSet(object, PRESENT_MODE_NONE); } break; }