diff --git a/.vscode.example/c_cpp_properties.json b/.vscode.example/c_cpp_properties.json index 60e51b8f..3bace88c 100644 --- a/.vscode.example/c_cpp_properties.json +++ b/.vscode.example/c_cpp_properties.json @@ -3,7 +3,8 @@ { "name": "Linux", "includePath": [ - "${workspaceFolder}/include/**" + "${workspaceFolder}/include/**", + "${workspaceFolder}/build/GMPE01_00/include/**" ], "cStandard": "c99", "cppStandard": "c++98", diff --git a/config/GMPE01_00/rels/m408Dll/splits.txt b/config/GMPE01_00/rels/m408Dll/splits.txt index 531cd645..d01840d2 100644 --- a/config/GMPE01_00/rels/m408Dll/splits.txt +++ b/config/GMPE01_00/rels/m408Dll/splits.txt @@ -5,3 +5,29 @@ Sections: .rodata type:rodata align:8 .data type:data align:8 .bss type:bss align:8 + +REL/executor.c: + .text start:0x00000000 end:0x000000A0 + +REL/m408Dll/main.c: + .text start:0x000000A0 end:0x00008958 + .rodata start:0x00000000 end:0x000002C8 + .data start:0x00000000 end:0x00000198 + .bss start:0x00000000 end:0x00000080 + +REL/m408Dll/camera.c: + .text start:0x00008958 end:0x0000C44C + .rodata start:0x000002C8 end:0x000004C0 + .bss start:0x00000080 end:0x00000118 + +REL/m408Dll/stage.c: + .text start:0x0000C44C end:0x000118D0 + .rodata start:0x000004C0 end:0x000006C0 + .data start:0x00000198 end:0x000001A0 + .bss start:0x00000118 end:0x00000168 + +REL/m408Dll/object.c: + .text start:0x000118D0 end:0x000163C8 + .rodata start:0x000006C0 end:0x000007F4 + .data start:0x000001A0 end:0x00000574 + .bss start:0x00000168 end:0x000075AC diff --git a/config/GMPE01_00/rels/m408Dll/symbols.txt b/config/GMPE01_00/rels/m408Dll/symbols.txt index 0553b57b..9d09ad6b 100644 --- a/config/GMPE01_00/rels/m408Dll/symbols.txt +++ b/config/GMPE01_00/rels/m408Dll/symbols.txt @@ -1,6 +1,6 @@ _prolog = .text:0x00000000; // type:function size:0x54 scope:global _epilog = .text:0x00000054; // type:function size:0x4C scope:global -fn_1_A0 = .text:0x000000A0; // type:function size:0x47C +ModuleProlog = .text:0x000000A0; // type:function size:0x47C fn_1_51C = .text:0x0000051C; // type:function size:0x50 fn_1_56C = .text:0x0000056C; // type:function size:0x438 fn_1_9A4 = .text:0x000009A4; // type:function size:0x4C @@ -465,7 +465,9 @@ lbl_1_rodata_7F0 = .rodata:0x000007F0; // type:object size:0x4 data:float lbl_1_data_0 = .data:0x00000000; // type:object size:0x20 lbl_1_data_20 = .data:0x00000020; // type:object size:0xC lbl_1_data_2C = .data:0x0000002C; // type:object size:0xC -lbl_1_data_38 = .data:0x00000038; // type:object size:0x20 +lbl_1_data_38 = .data:0x00000038; // type:object size:0x4 +lbl_1_data_3C = .data:0x0000003C; // type:object size:0x18 +lbl_1_data_54 = .data:0x00000054; // type:object size:0x4 lbl_1_data_58 = .data:0x00000058; // type:object size:0xC lbl_1_data_64 = .data:0x00000064; // type:object size:0xC lbl_1_data_70 = .data:0x00000070; // type:object size:0xC @@ -478,7 +480,8 @@ lbl_1_data_A0 = .data:0x000000A0; // type:object size:0x28 lbl_1_data_C8 = .data:0x000000C8; // type:object size:0x20 lbl_1_data_E8 = .data:0x000000E8; // type:object size:0x1C lbl_1_data_104 = .data:0x00000104; // type:object size:0x40 -lbl_1_data_144 = .data:0x00000144; // type:object size:0x58 +lbl_1_data_144 = .data:0x00000144; // type:object size:0x54 +lbl_1_data_198 = .data:0x00000198; // type:object size:0x4 lbl_1_data_19C = .data:0x0000019C; // type:object size:0x4 data:4byte lbl_1_data_1A0 = .data:0x000001A0; // type:object size:0x24 lbl_1_data_1C4 = .data:0x000001C4; // type:object size:0x24 @@ -516,7 +519,7 @@ lbl_1_bss_66 = .bss:0x00000066; // type:object size:0x6 data:2byte lbl_1_bss_6C = .bss:0x0000006C; // type:object size:0x4 data:4byte lbl_1_bss_70 = .bss:0x00000070; // type:object size:0x4 data:4byte lbl_1_bss_74 = .bss:0x00000074; // type:object size:0x4 data:4byte -lbl_1_bss_78 = .bss:0x00000078; // type:object size:0x8 data:4byte +lbl_1_bss_78 = .bss:0x00000078; // type:object size:0x4 data:4byte lbl_1_bss_80 = .bss:0x00000080; // type:object size:0x4 data:4byte lbl_1_bss_84 = .bss:0x00000084; // type:object size:0x4 data:4byte lbl_1_bss_88 = .bss:0x00000088; // type:object size:0xC @@ -526,7 +529,7 @@ lbl_1_bss_A4 = .bss:0x000000A4; // type:object size:0x50 data:4byte lbl_1_bss_F4 = .bss:0x000000F4; // type:object size:0xC data:float lbl_1_bss_100 = .bss:0x00000100; // type:object size:0xC data:float lbl_1_bss_10C = .bss:0x0000010C; // type:object size:0x4 data:4byte -lbl_1_bss_110 = .bss:0x00000110; // type:object size:0x8 data:4byte +lbl_1_bss_110 = .bss:0x00000110; // type:object size:0x4 data:4byte lbl_1_bss_118 = .bss:0x00000118; // type:object size:0x2 data:2byte lbl_1_bss_11C = .bss:0x0000011C; // type:object size:0x4 data:4byte lbl_1_bss_120 = .bss:0x00000120; // type:object size:0x8 data:4byte diff --git a/config/GMPE01_00/rels/m409Dll/splits.txt b/config/GMPE01_00/rels/m409Dll/splits.txt index 531cd645..6c9f846e 100644 --- a/config/GMPE01_00/rels/m409Dll/splits.txt +++ b/config/GMPE01_00/rels/m409Dll/splits.txt @@ -5,3 +5,22 @@ Sections: .rodata type:rodata align:8 .data type:data align:8 .bss type:bss align:8 + +REL/executor.c: + .text start:0x00000000 end:0x000000A0 + +REL/m409Dll/main.c: + .text start:0x000000A0 end:0x000067E0 + .rodata start:0x00000000 end:0x000001A0 + .data start:0x00000000 end:0x00000138 + .bss start:0x00000000 end:0x000000F0 + +REL/m409Dll/player.c: + .text start:0x000067E0 end:0x0000BF88 + .rodata start:0x000001A0 end:0x00000430 + .data start:0x00000138 end:0x000001F0 + .bss start:0x000000F0 end:0x000003B0 + +REL/m409Dll/cursor.c: + .text start:0x0000BF88 end:0x0000F588 + .rodata start:0x00000430 end:0x00000488 diff --git a/config/GMPE01_00/rels/m409Dll/symbols.txt b/config/GMPE01_00/rels/m409Dll/symbols.txt index 40e875cb..7cc0e253 100644 --- a/config/GMPE01_00/rels/m409Dll/symbols.txt +++ b/config/GMPE01_00/rels/m409Dll/symbols.txt @@ -1,6 +1,6 @@ _prolog = .text:0x00000000; // type:function size:0x54 scope:global _epilog = .text:0x00000054; // type:function size:0x4C scope:global -fn_1_A0 = .text:0x000000A0; // type:function size:0x394 +ModuleProlog = .text:0x000000A0; // type:function size:0x394 fn_1_434 = .text:0x00000434; // type:function size:0xA8 fn_1_4DC = .text:0x000004DC; // type:function size:0x48 fn_1_524 = .text:0x00000524; // type:function size:0x65C @@ -294,7 +294,8 @@ lbl_1_data_CD = .data:0x000000CD; // type:object size:0x9 data:string lbl_1_data_D6 = .data:0x000000D6; // type:object size:0x3 data:string lbl_1_data_D9 = .data:0x000000D9; // type:object size:0x10 data:string lbl_1_data_E9 = .data:0x000000E9; // type:object size:0x26 data:string -lbl_1_data_10F = .data:0x0000010F; // type:object size:0x2D +lbl_1_data_10F = .data:0x0000010F; // type:object size:0x24 data:string +lbl_1_data_138 = .data:0x00000138; // type:object size:0x4 lbl_1_data_13C = .data:0x0000013C; // type:object size:0x1C lbl_1_data_158 = .data:0x00000158; // type:object size:0x20 lbl_1_data_178 = .data:0x00000178; // type:object size:0x40 @@ -321,7 +322,7 @@ lbl_1_bss_40 = .bss:0x00000040; // type:object size:0x9C data:2byte lbl_1_bss_DC = .bss:0x000000DC; // type:object size:0x4 data:4byte lbl_1_bss_E0 = .bss:0x000000E0; // type:object size:0x4 data:4byte lbl_1_bss_E4 = .bss:0x000000E4; // type:object size:0x2 data:2byte -lbl_1_bss_E8 = .bss:0x000000E8; // type:object size:0x8 data:4byte +lbl_1_bss_E8 = .bss:0x000000E8; // type:object size:0x4 data:4byte lbl_1_bss_F0 = .bss:0x000000F0; // type:object size:0x14 data:4byte lbl_1_bss_104 = .bss:0x00000104; // type:object size:0x2 data:2byte lbl_1_bss_106 = .bss:0x00000106; // type:object size:0x2 data:2byte diff --git a/config/GMPE01_00/rels/m410Dll/splits.txt b/config/GMPE01_00/rels/m410Dll/splits.txt index 531cd645..a0e6c79f 100644 --- a/config/GMPE01_00/rels/m410Dll/splits.txt +++ b/config/GMPE01_00/rels/m410Dll/splits.txt @@ -5,3 +5,28 @@ Sections: .rodata type:rodata align:8 .data type:data align:8 .bss type:bss align:8 + +REL/executor.c: + .text start:0x00000000 end:0x000000A0 + +REL/m410Dll/main.c: + .text start:0x000000A0 end:0x000031A4 + .rodata start:0x00000000 end:0x000000D0 + .data start:0x00000000 end:0x000000D8 + .bss start:0x00000000 end:0x00000030 + +REL/m410Dll/stage.c: + .text start:0x000031A4 end:0x000033A8 + .rodata start:0x000000D0 end:0x000000D8 + +REL/m410Dll/game.c: + .text start:0x000033A8 end:0x00007E30 + .rodata start:0x000000D8 end:0x000001E8 + .data start:0x000000D8 end:0x00000130 + .bss start:0x00000030 end:0x00000060 + +REL/m410Dll/player.c: + .text start:0x00007E30 end:0x0000B784 + .rodata start:0x000001E8 end:0x000003A8 + .data start:0x00000130 end:0x000002B4 + .bss start:0x00000060 end:0x00000078 diff --git a/config/GMPE01_00/rels/m410Dll/symbols.txt b/config/GMPE01_00/rels/m410Dll/symbols.txt index 64fb64e4..8aa1e144 100644 --- a/config/GMPE01_00/rels/m410Dll/symbols.txt +++ b/config/GMPE01_00/rels/m410Dll/symbols.txt @@ -1,6 +1,6 @@ _prolog = .text:0x00000000; // type:function size:0x54 scope:global _epilog = .text:0x00000054; // type:function size:0x4C scope:global -fn_1_A0 = .text:0x000000A0; // type:function size:0x444 +ModuleProlog = .text:0x000000A0; // type:function size:0x444 fn_1_4E4 = .text:0x000004E4; // type:function size:0xC4 fn_1_5A8 = .text:0x000005A8; // type:function size:0x94 fn_1_63C = .text:0x0000063C; // type:function size:0x16C @@ -278,7 +278,7 @@ lbl_1_data_DC = .data:0x000000DC; // type:object size:0x20 lbl_1_data_FC = .data:0x000000FC; // type:object size:0x8 lbl_1_data_104 = .data:0x00000104; // type:object size:0xC lbl_1_data_110 = .data:0x00000110; // type:object size:0x4 data:4byte -lbl_1_data_114 = .data:0x00000114; // type:object size:0x1C +lbl_1_data_114 = .data:0x00000114; // type:object size:0x16 data:string lbl_1_data_130 = .data:0x00000130; // type:object size:0x10 lbl_1_data_140 = .data:0x00000140; // type:object size:0x20 lbl_1_data_160 = .data:0x00000160; // type:object size:0xC @@ -299,7 +299,7 @@ lbl_1_bss_16 = .bss:0x00000016; // type:object size:0x6 data:2byte lbl_1_bss_1C = .bss:0x0000001C; // type:object size:0x2 data:2byte lbl_1_bss_20 = .bss:0x00000020; // type:object size:0x4 data:4byte lbl_1_bss_24 = .bss:0x00000024; // type:object size:0x4 data:4byte -lbl_1_bss_28 = .bss:0x00000028; // type:object size:0x8 data:4byte +lbl_1_bss_28 = .bss:0x00000028; // type:object size:0x4 data:4byte lbl_1_bss_30 = .bss:0x00000030; // type:object size:0x4 data:4byte lbl_1_bss_34 = .bss:0x00000034; // type:object size:0x4 data:4byte lbl_1_bss_38 = .bss:0x00000038; // type:object size:0x4 data:4byte diff --git a/config/GMPE01_00/rels/m411Dll/splits.txt b/config/GMPE01_00/rels/m411Dll/splits.txt index 531cd645..07b9f4ac 100644 --- a/config/GMPE01_00/rels/m411Dll/splits.txt +++ b/config/GMPE01_00/rels/m411Dll/splits.txt @@ -5,3 +5,12 @@ Sections: .rodata type:rodata align:8 .data type:data align:8 .bss type:bss align:8 + +REL/executor.c: + .text start:0x00000000 end:0x000000A0 + +REL/m411Dll/main.c: + .text start:0x000000A0 end:0x0000B8A8 + .rodata start:0x00000000 end:0x000002F4 + .data start:0x00000000 end:0x0000033D + .bss start:0x00000000 end:0x00000EA2 diff --git a/config/GMPE01_00/rels/m411Dll/symbols.txt b/config/GMPE01_00/rels/m411Dll/symbols.txt index 38a4c8cd..4fdb3f11 100644 --- a/config/GMPE01_00/rels/m411Dll/symbols.txt +++ b/config/GMPE01_00/rels/m411Dll/symbols.txt @@ -1,6 +1,6 @@ _prolog = .text:0x00000000; // type:function size:0x54 scope:global _epilog = .text:0x00000054; // type:function size:0x4C scope:global -fn_1_A0 = .text:0x000000A0; // type:function size:0xDE0 +ModuleProlog = .text:0x000000A0; // type:function size:0xDE0 fn_1_E80 = .text:0x00000E80; // type:function size:0x10C fn_1_F8C = .text:0x00000F8C; // type:function size:0xE8 fn_1_1074 = .text:0x00001074; // type:function size:0x424 diff --git a/config/GMPE01_00/rels/m450Dll/splits.txt b/config/GMPE01_00/rels/m450Dll/splits.txt index 531cd645..85922d10 100644 --- a/config/GMPE01_00/rels/m450Dll/splits.txt +++ b/config/GMPE01_00/rels/m450Dll/splits.txt @@ -5,3 +5,9 @@ Sections: .rodata type:rodata align:8 .data type:data align:8 .bss type:bss align:8 + +REL/m450Dll/main.c: + .text start:0x00000000 end:0x000299BC + .rodata start:0x00000000 end:0x00000398 + .data start:0x00000000 end:0x000017C4 + .bss start:0x00000000 end:0x00000364 diff --git a/config/GMPE01_00/rels/modeltestDll/splits.txt b/config/GMPE01_00/rels/modeltestDll/splits.txt index 531cd645..2f84ebd2 100644 --- a/config/GMPE01_00/rels/modeltestDll/splits.txt +++ b/config/GMPE01_00/rels/modeltestDll/splits.txt @@ -5,3 +5,21 @@ Sections: .rodata type:rodata align:8 .data type:data align:8 .bss type:bss align:8 + +REL/modeltestDll/main.c: + .text start:0x000000A0 end:0x000034B0 + .rodata start:0x00000000 end:0x00000130 + .data start:0x00000000 end:0x00000358 + .bss start:0x00000000 end:0x000009A8 + +REL/modeltestDll/modeltest00.c: + .text start:0x000034B0 end:0x00004AC8 + .rodata start:0x00000130 end:0x000001E0 + .data start:0x00000358 end:0x00000388 + .bss start:0x000009A8 end:0x00000A00 + +REL/modeltestDll/modeltest01.c: + .text start:0x00004AC8 end:0x000086B8 + .rodata start:0x000001E0 end:0x00000290 + .data start:0x00000388 end:0x000007AE + .bss start:0x00000A00 end:0x00000AC8 diff --git a/config/GMPE01_00/rels/modeltestDll/symbols.txt b/config/GMPE01_00/rels/modeltestDll/symbols.txt index 3c87f506..e8215199 100644 --- a/config/GMPE01_00/rels/modeltestDll/symbols.txt +++ b/config/GMPE01_00/rels/modeltestDll/symbols.txt @@ -23,86 +23,86 @@ fn_1_82C8 = .text:0x000082C8; // type:function size:0xEC fn_1_83B4 = .text:0x000083B4; // type:function size:0x304 _ctors = .ctors:0x00000000; // type:label scope:global data:4byte _dtors = .dtors:0x00000000; // type:label scope:global data:4byte -lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x4 data:float -lbl_1_rodata_14 = .rodata:0x00000014; // type:object size:0x4 data:float -lbl_1_rodata_18 = .rodata:0x00000018; // type:object size:0x4 data:float -lbl_1_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 data:float -lbl_1_rodata_20 = .rodata:0x00000020; // type:object size:0x4 data:float -lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 data:float -lbl_1_rodata_28 = .rodata:0x00000028; // type:object size:0x4 data:float -lbl_1_rodata_2C = .rodata:0x0000002C; // type:object size:0x4 data:float -lbl_1_rodata_30 = .rodata:0x00000030; // type:object size:0x4 data:float -lbl_1_rodata_34 = .rodata:0x00000034; // type:object size:0x4 data:float +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:0x4 scope:local data:float +lbl_1_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_20 = .rodata:0x00000020; // type:object size:0x4 scope:local data:float +lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local data:float +lbl_1_rodata_28 = .rodata:0x00000028; // type:object size:0x4 scope:local data:float +lbl_1_rodata_2C = .rodata:0x0000002C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_30 = .rodata:0x00000030; // type:object size:0x4 scope:local data:float +lbl_1_rodata_34 = .rodata:0x00000034; // type:object size:0x4 scope:local data:float lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0xC data:4byte lbl_1_rodata_44 = .rodata:0x00000044; // type:object size:0xC data:4byte -lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x4 data:float -lbl_1_rodata_54 = .rodata:0x00000054; // type:object size:0x4 data:float -lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x4 data:float -lbl_1_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 data:float -lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x4 data:float -lbl_1_rodata_64 = .rodata:0x00000064; // type:object size:0x4 data:float -lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0x4 data:float -lbl_1_rodata_6C = .rodata:0x0000006C; // type:object size:0x4 data:float -lbl_1_rodata_70 = .rodata:0x00000070; // type:object size:0x4 data:float -lbl_1_rodata_74 = .rodata:0x00000074; // type:object size:0x4 data:float -lbl_1_rodata_78 = .rodata:0x00000078; // type:object size:0x8 data:double -lbl_1_rodata_80 = .rodata:0x00000080; // type:object size:0x8 data:double -lbl_1_rodata_88 = .rodata:0x00000088; // type:object size:0x4 data:float -lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x8 data:double -lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 data:float -lbl_1_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 data:float -lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 data:float -lbl_1_rodata_A8 = .rodata:0x000000A8; // type:object size:0x8 data:double -lbl_1_rodata_B0 = .rodata:0x000000B0; // type:object size:0x8 data:double -lbl_1_rodata_B8 = .rodata:0x000000B8; // type:object size:0x10 data:2byte -lbl_1_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 data:float -lbl_1_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 data:float -lbl_1_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 data:float -lbl_1_rodata_D8 = .rodata:0x000000D8; // type:object size:0x8 data:double -lbl_1_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 data:float -lbl_1_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 data:float -lbl_1_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 data:float -lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0x8 data:double -lbl_1_rodata_F8 = .rodata:0x000000F8; // type:object size:0x8 data:double -lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x8 data:double -lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x4 data:float -lbl_1_rodata_110 = .rodata:0x00000110; // type:object size:0x8 data:double -lbl_1_rodata_118 = .rodata:0x00000118; // type:object size:0x4 data:float -lbl_1_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 data:float -lbl_1_rodata_120 = .rodata:0x00000120; // type:object size:0x4 data:float -lbl_1_rodata_124 = .rodata:0x00000124; // type:object size:0x4 data:float -lbl_1_rodata_128 = .rodata:0x00000128; // type:object size:0x4 data:float -lbl_1_rodata_12C = .rodata:0x0000012C; // type:object size:0x4 data:float -lbl_1_rodata_130 = .rodata:0x00000130; // type:object size:0x4 data:float -lbl_1_rodata_134 = .rodata:0x00000134; // type:object size:0x4 data:float -lbl_1_rodata_138 = .rodata:0x00000138; // type:object size:0x4 data:float -lbl_1_rodata_13C = .rodata:0x0000013C; // type:object size:0x4 data:float -lbl_1_rodata_140 = .rodata:0x00000140; // type:object size:0x4 data:float -lbl_1_rodata_144 = .rodata:0x00000144; // type:object size:0x4 data:float -lbl_1_rodata_148 = .rodata:0x00000148; // type:object size:0x4 data:float -lbl_1_rodata_14C = .rodata:0x0000014C; // type:object size:0x4 data:float -lbl_1_rodata_150 = .rodata:0x00000150; // type:object size:0x4 data:float -lbl_1_rodata_154 = .rodata:0x00000154; // type:object size:0x4 data:float -lbl_1_rodata_158 = .rodata:0x00000158; // type:object size:0x4 data:float -lbl_1_rodata_160 = .rodata:0x00000160; // type:object size:0x8 data:double -lbl_1_rodata_168 = .rodata:0x00000168; // type:object size:0x4 data:float -lbl_1_rodata_170 = .rodata:0x00000170; // type:object size:0x8 data:double -lbl_1_rodata_178 = .rodata:0x00000178; // type:object size:0x8 data:double -lbl_1_rodata_180 = .rodata:0x00000180; // type:object size:0x8 data:double -lbl_1_rodata_188 = .rodata:0x00000188; // type:object size:0x4 data:float +lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x4 scope:local data:float +lbl_1_rodata_54 = .rodata:0x00000054; // type:object size:0x4 scope:local data:float +lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x4 scope:local data:float +lbl_1_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x4 scope:local data:float +lbl_1_rodata_64 = .rodata:0x00000064; // type:object size:0x4 scope:local data:float +lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0x4 scope:local data:float +lbl_1_rodata_6C = .rodata:0x0000006C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_70 = .rodata:0x00000070; // type:object size:0x4 scope:local data:float +lbl_1_rodata_74 = .rodata:0x00000074; // type:object size:0x4 scope:local data:float +lbl_1_rodata_78 = .rodata:0x00000078; // type:object size:0x8 scope:local data:double +lbl_1_rodata_80 = .rodata:0x00000080; // type:object size:0x8 scope:local data:double +lbl_1_rodata_88 = .rodata:0x00000088; // 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_9C = .rodata:0x0000009C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A8 = .rodata:0x000000A8; // type:object size:0x8 scope:local data:double +lbl_1_rodata_B0 = .rodata:0x000000B0; // type:object size:0x8 scope:local data:double +lbl_1_rodata_B8 = .rodata:0x000000B8; // type:object size:0x10 scope:local data:2byte +lbl_1_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_D8 = .rodata:0x000000D8; // type:object size:0x8 scope:local data:double +lbl_1_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0x8 scope:local data:double +lbl_1_rodata_F8 = .rodata:0x000000F8; // type:object size:0x8 scope:local data:double +lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x8 scope:local data:double +lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x4 scope:local data:float +lbl_1_rodata_110 = .rodata:0x00000110; // type:object size:0x8 scope:local data:double +lbl_1_rodata_118 = .rodata:0x00000118; // type:object size:0x4 scope:local data:float +lbl_1_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_120 = .rodata:0x00000120; // type:object size:0x4 scope:local data:float +lbl_1_rodata_124 = .rodata:0x00000124; // type:object size:0x4 scope:local data:float +lbl_1_rodata_128 = .rodata:0x00000128; // type:object size:0x4 scope:local data:float +lbl_1_rodata_12C = .rodata:0x0000012C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_130 = .rodata:0x00000130; // type:object size:0x4 scope:local data:float +lbl_1_rodata_134 = .rodata:0x00000134; // type:object size:0x4 scope:local data:float +lbl_1_rodata_138 = .rodata:0x00000138; // type:object size:0x4 scope:local data:float +lbl_1_rodata_13C = .rodata:0x0000013C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_140 = .rodata:0x00000140; // type:object size:0x4 scope:local data:float +lbl_1_rodata_144 = .rodata:0x00000144; // type:object size:0x4 scope:local data:float +lbl_1_rodata_148 = .rodata:0x00000148; // type:object size:0x4 scope:local data:float +lbl_1_rodata_14C = .rodata:0x0000014C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_150 = .rodata:0x00000150; // type:object size:0x4 scope:local data:float +lbl_1_rodata_154 = .rodata:0x00000154; // type:object size:0x4 scope:local data:float +lbl_1_rodata_158 = .rodata:0x00000158; // type:object size:0x4 scope:local data:float +lbl_1_rodata_160 = .rodata:0x00000160; // type:object size:0x8 scope:local data:double +lbl_1_rodata_168 = .rodata:0x00000168; // type:object size:0x4 scope:local data:float +lbl_1_rodata_170 = .rodata:0x00000170; // type:object size:0x8 scope:local data:double +lbl_1_rodata_178 = .rodata:0x00000178; // type:object size:0x8 scope:local data:double +lbl_1_rodata_180 = .rodata:0x00000180; // type:object size:0x8 scope:local data:double +lbl_1_rodata_188 = .rodata:0x00000188; // type:object size:0x4 scope:local data:float lbl_1_rodata_18C = .rodata:0x0000018C; // type:object size:0xC data:4byte lbl_1_rodata_198 = .rodata:0x00000198; // type:object size:0xC data:4byte -lbl_1_rodata_1A4 = .rodata:0x000001A4; // type:object size:0x4 data:float -lbl_1_rodata_1A8 = .rodata:0x000001A8; // type:object size:0x4 data:float -lbl_1_rodata_1AC = .rodata:0x000001AC; // type:object size:0x4 data:float -lbl_1_rodata_1B0 = .rodata:0x000001B0; // type:object size:0x4 data:float -lbl_1_rodata_1B4 = .rodata:0x000001B4; // type:object size:0x4 data:float -lbl_1_rodata_1B8 = .rodata:0x000001B8; // type:object size:0x4 data:float -lbl_1_rodata_1BC = .rodata:0x000001BC; // type:object size:0x4 data:float -lbl_1_rodata_1C0 = .rodata:0x000001C0; // type:object size:0x4 data:float -lbl_1_rodata_1C4 = .rodata:0x000001C4; // type:object size:0x4 data:float -lbl_1_rodata_1C8 = .rodata:0x000001C8; // type:object size:0xC data:4byte -lbl_1_rodata_1D4 = .rodata:0x000001D4; // type:object size:0xC data:4byte +lbl_1_rodata_1A4 = .rodata:0x000001A4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1A8 = .rodata:0x000001A8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1AC = .rodata:0x000001AC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1B0 = .rodata:0x000001B0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1B4 = .rodata:0x000001B4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1B8 = .rodata:0x000001B8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1BC = .rodata:0x000001BC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1C0 = .rodata:0x000001C0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1C4 = .rodata:0x000001C4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1C8 = .rodata:0x000001C8; // type:object size:0xC scope:local data:float +lbl_1_rodata_1D4 = .rodata:0x000001D4; // type:object size:0xC data:float lbl_1_rodata_1E0 = .rodata:0x000001E0; // type:object size:0x4 data:float lbl_1_rodata_1E4 = .rodata:0x000001E4; // type:object size:0x4 data:float lbl_1_rodata_1E8 = .rodata:0x000001E8; // type:object size:0x4 data:float @@ -136,36 +136,37 @@ lbl_1_rodata_284 = .rodata:0x00000284; // type:object size:0x4 data:float lbl_1_rodata_288 = .rodata:0x00000288; // type:object size:0x4 data:float lbl_1_rodata_28C = .rodata:0x0000028C; // type:object size:0x4 data:float lbl_1_data_0 = .data:0x00000000; // type:object size:0x20 data:4byte -lbl_1_data_20 = .data:0x00000020; // type:object size:0x28 data:string -lbl_1_data_48 = .data:0x00000048; // type:object size:0x9 data:string -lbl_1_data_51 = .data:0x00000051; // type:object size:0x9 data:string -lbl_1_data_5A = .data:0x0000005A; // type:object size:0x9 data:string -lbl_1_data_63 = .data:0x00000063; // type:object size:0x9 data:string -lbl_1_data_6C = .data:0x0000006C; // type:object size:0x9 data:string -lbl_1_data_75 = .data:0x00000075; // type:object size:0x9 data:string -lbl_1_data_7E = .data:0x0000007E; // type:object size:0x9 data:string -lbl_1_data_87 = .data:0x00000087; // type:object size:0x9 data:string -lbl_1_data_90 = .data:0x00000090; // type:object size:0x9 data:string -lbl_1_data_99 = .data:0x00000099; // type:object size:0x9 data:string -lbl_1_data_A2 = .data:0x000000A2; // type:object size:0x9 data:string -lbl_1_data_AB = .data:0x000000AB; // type:object size:0x9 data:string -lbl_1_data_B4 = .data:0x000000B4; // type:object size:0x9 data:string -lbl_1_data_BD = .data:0x000000BD; // type:object size:0x9 data:string -lbl_1_data_C6 = .data:0x000000C6; // type:object size:0x9 data:string -lbl_1_data_CF = .data:0x000000CF; // type:object size:0x9 data:string +lbl_1_data_20 = .data:0x00000020; // type:object size:0x28 scope:local data:string +lbl_1_data_48 = .data:0x00000048; // type:object size:0x9 scope:local data:string +lbl_1_data_51 = .data:0x00000051; // type:object size:0x9 scope:local data:string +lbl_1_data_5A = .data:0x0000005A; // type:object size:0x9 scope:local data:string +lbl_1_data_63 = .data:0x00000063; // type:object size:0x9 scope:local data:string +lbl_1_data_6C = .data:0x0000006C; // type:object size:0x9 scope:local data:string +lbl_1_data_75 = .data:0x00000075; // type:object size:0x9 scope:local data:string +lbl_1_data_7E = .data:0x0000007E; // type:object size:0x9 scope:local data:string +lbl_1_data_87 = .data:0x00000087; // type:object size:0x9 scope:local data:string +lbl_1_data_90 = .data:0x00000090; // type:object size:0x9 scope:local data:string +lbl_1_data_99 = .data:0x00000099; // type:object size:0x9 scope:local data:string +lbl_1_data_A2 = .data:0x000000A2; // type:object size:0x9 scope:local data:string +lbl_1_data_AB = .data:0x000000AB; // type:object size:0x9 scope:local data:string +lbl_1_data_B4 = .data:0x000000B4; // type:object size:0x9 scope:local data:string +lbl_1_data_BD = .data:0x000000BD; // type:object size:0x9 scope:local data:string +lbl_1_data_C6 = .data:0x000000C6; // type:object size:0x9 scope:local data:string +lbl_1_data_CF = .data:0x000000CF; // type:object size:0x9 scope:local data:string lbl_1_data_D8 = .data:0x000000D8; // type:object size:0x40 lbl_1_data_118 = .data:0x00000118; // type:object size:0x50 data:float lbl_1_data_168 = .data:0x00000168; // type:object size:0xA0 lbl_1_data_208 = .data:0x00000208; // type:object size:0x50 lbl_1_data_258 = .data:0x00000258; // type:object size:0x50 -lbl_1_data_2A8 = .data:0x000002A8; // type:object size:0x1A data:string -lbl_1_data_2C2 = .data:0x000002C2; // type:object size:0x16 -lbl_1_data_2D8 = .data:0x000002D8; // type:object size:0x10 data:string -lbl_1_data_2E8 = .data:0x000002E8; // type:object size:0x4 data:string -lbl_1_data_2EC = .data:0x000002EC; // type:object size:0x2C data:string -lbl_1_data_318 = .data:0x00000318; // type:object size:0x40 +lbl_1_data_2A8 = .data:0x000002A8; // type:object size:0x1A scope:local data:string +lbl_1_data_2C2 = .data:0x000002C2; // type:object size:0x16 scope:local +lbl_1_data_2D8 = .data:0x000002D8; // type:object size:0x10 scope:local data:string +lbl_1_data_2E8 = .data:0x000002E8; // type:object size:0x4 scope:local data:string +lbl_1_data_2EC = .data:0x000002EC; // type:object size:0x2C scope:local data:string +lbl_1_data_318 = .data:0x00000318; // type:object size:0xA scope:local data:string +lbl_1_data_322 = .data:0x00000322; // type:object size:0x36 lbl_1_data_358 = .data:0x00000358; // type:object size:0x8 -lbl_1_data_360 = .data:0x00000360; // type:object size:0x28 data:string +lbl_1_data_360 = .data:0x00000360; // type:object size:0x28 scope:local data:string lbl_1_data_388 = .data:0x00000388; // type:object size:0x28 data:string lbl_1_data_3B0 = .data:0x000003B0; // type:object size:0x58 lbl_1_data_408 = .data:0x00000408; // type:object size:0x58 @@ -200,7 +201,8 @@ lbl_1_bss_24 = .bss:0x00000024; // type:object size:0x2 data:2byte lbl_1_bss_28 = .bss:0x00000028; // type:object size:0x4 data:float lbl_1_bss_2C = .bss:0x0000002C; // type:object size:0x1 data:byte lbl_1_bss_30 = .bss:0x00000030; // type:object size:0x10 data:4byte -lbl_1_bss_40 = .bss:0x00000040; // type:object size:0x414 +lbl_1_bss_40 = .bss:0x00000040; // type:object size:0x410 +unk_bss_450 = .bss:0x00000450; // type:object size:0x4 data:4byte lbl_1_bss_454 = .bss:0x00000454; // type:object size:0x4 data:4byte lbl_1_bss_458 = .bss:0x00000458; // type:object size:0x2 data:2byte lbl_1_bss_45A = .bss:0x0000045A; // type:object size:0x6 data:2byte diff --git a/config/GMPE01_00/rels/mpexDll/splits.txt b/config/GMPE01_00/rels/mpexDll/splits.txt index dec8bfef..965cdf04 100644 --- a/config/GMPE01_00/rels/mpexDll/splits.txt +++ b/config/GMPE01_00/rels/mpexDll/splits.txt @@ -26,5 +26,5 @@ REL/mpexDll/charsel.c: REL/mpexDll/mgname.c: .text start:0x0001CB80 end:0x0001D198 - .rodata start:0x00000610 end:0x00000618 - .data start:0x00000788 end:0x00000788 + .rodata start:0x00000610 end:0x00000620 + .data start:0x00000788 end:0x00000AA0 diff --git a/config/GMPE01_00/splits.txt b/config/GMPE01_00/splits.txt index 19024042..94bf7283 100644 --- a/config/GMPE01_00/splits.txt +++ b/config/GMPE01_00/splits.txt @@ -266,7 +266,7 @@ game/chrman.c: game/mapspace.c: .text start:0x80050C5C end:0x80054A00 - .bss start:0x80197650 end:0x80197AB8 + .bss start:0x80197650 end:0x80197AC0 .sbss start:0x801D3E18 end:0x801D3E38 .sdata2 start:0x801D50D0 end:0x801D5100 @@ -497,7 +497,7 @@ game/board/boo.c: .data start:0x8013AB28 end:0x8013AD00 .sdata start:0x801D37D8 end:0x801D37E8 .sbss start:0x801D41B0 end:0x801D41E8 - .sdata2 start:0x801D5E98 end:0x801D5FA0 + .sdata2 start:0x801D5E98 end:0x801D5FA8 game/board/mg_setup.c: .text start:0x800A1A34 end:0x800A4F6C @@ -506,7 +506,7 @@ game/board/mg_setup.c: .bss start:0x801A4C58 end:0x801A4CC8 .sdata start:0x801D37E8 end:0x801D37F0 .sbss start:0x801D41E8 end:0x801D4218 - .sdata2 start:0x801D5FA0 end:0x801D6080 + .sdata2 start:0x801D5FA8 end:0x801D6080 game/board/boo_house.c: .text start:0x800A4F6C end:0x800A6EE4 diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 0520abba..b4c32041 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -537,12 +537,12 @@ omCurrentOvlGet = .text:0x8002FF44; // type:function size:0x8 OSPanic = .text:0x8002FF4C; // type:function size:0x150 HuFaultInitXfbDirectDraw = .text:0x8003009C; // type:function size:0x118 HuFaultSetXfbAddress = .text:0x800301B4; // type:function size:0x34 -XFB_WriteBackCache = .text:0x800301E8; // type:function size:0x98 -XFB_CR = .text:0x80030280; // type:function size:0x50 -XFB_puts = .text:0x800302D0; // type:function size:0xF4 -XFB_putcS = .text:0x800303C4; // type:function size:0x150 -XFB_putcProgressive = .text:0x80030514; // type:function size:0x1F0 -XFB_putcInterlace = .text:0x80030704; // type:function size:0x1B4 +XFB_WriteBackCache = .text:0x800301E8; // type:function size:0x98 scope:local +XFB_CR = .text:0x80030280; // type:function size:0x50 scope:local +XFB_puts = .text:0x800302D0; // type:function size:0xF4 scope:local +XFB_putcS = .text:0x800303C4; // type:function size:0x150 scope:local +XFB_putcProgressive = .text:0x80030514; // type:function size:0x1F0 scope:local +XFB_putcInterlace = .text:0x80030704; // type:function size:0x1B4 scope:local GWInit = .text:0x800308B8; // type:function size:0x14C GWGameStatReset = .text:0x80030A04; // type:function size:0x318 GWMessDelayGet = .text:0x80030D1C; // type:function size:0x4C @@ -695,7 +695,7 @@ MGSeqPauseKill = .text:0x8003F360; // type:function size:0xC MGSeqPauseEnableCtrl = .text:0x8003F36C; // type:function size:0x40 MGSeqPracticeInit = .text:0x8003F3AC; // type:function size:0xDC PracticeProc = .text:0x8003F488; // type:function size:0x234 scope:local -SeqSEPlay = .text:0x8003F6BC; // type:function size:0xD4 scope:local +SeqPlayStartFX = .text:0x8003F6BC; // type:function size:0xD4 scope:local MGSeqPracticeExitCheck = .text:0x8003F790; // type:function size:0x128 espInit = .text:0x8003F8B8; // type:function size:0xA0 espEntry = .text:0x8003F958; // type:function size:0x1B0 @@ -860,10 +860,10 @@ CreateEffect = .text:0x8004C180; // type:function size:0x1CC scope:local UpdateEffect = .text:0x8004C34C; // type:function size:0x4A0 scope:local RotateEffect = .text:0x8004C7EC; // type:function size:0x1E8 scope:local PlayEffectSound = .text:0x8004C9D4; // type:function size:0x344 scope:local -CharMotionCreate = .text:0x8004CD18; // type:function size:0x1D0 -CharMotionSet = .text:0x8004CEE8; // type:function size:0x88 -CharMotionKill = .text:0x8004CF70; // type:function size:0x9C -CharMotionDataClose = .text:0x8004D00C; // type:function size:0x2B8 +CharModelMotionCreate = .text:0x8004CD18; // type:function size:0x1D0 +CharModelMotionIndexSet = .text:0x8004CEE8; // type:function size:0x88 +CharModelMotionKill = .text:0x8004CF70; // type:function size:0x9C +CharModelMotionDataClose = .text:0x8004D00C; // type:function size:0x2B8 CharModelDataClose = .text:0x8004D2C4; // type:function size:0x430 CharModelKill = .text:0x8004D6F4; // type:function size:0x244 CharModelMotionSet = .text:0x8004D938; // type:function size:0x7C @@ -879,11 +879,11 @@ CharModelMotionShiftSet = .text:0x8004DD84; // type:function size:0x84 CharModelMotionShiftTimeGet = .text:0x8004DE08; // type:function size:0x44 CharModelMotionSpeedSet = .text:0x8004DE4C; // type:function size:0x4C CharModelLayerSetAll = .text:0x8004DE98; // type:function size:0x80 -CharModelCreateItemHook = .text:0x8004DF18; // type:function size:0x1D4 +CharModelItemHookCreate = .text:0x8004DF18; // type:function size:0x1D4 UpdateItemHook = .text:0x8004E0EC; // type:function size:0x484 scope:local -CharModelCreateParticle = .text:0x8004E570; // type:function size:0x3FC +CharModelEffectCreate = .text:0x8004E570; // type:function size:0x3FC OrbitEffect = .text:0x8004E96C; // type:function size:0x168 scope:local -CharModelCreateCoinParticle = .text:0x8004EAD4; // type:function size:0x1A0 +CharModelCoinEffectCreate = .text:0x8004EAD4; // type:function size:0x1A0 fn_8004EC74 = .text:0x8004EC74; // type:function size:0x130 fn_8004EDA4 = .text:0x8004EDA4; // type:function size:0x2B4 fn_8004F058 = .text:0x8004F058; // type:function size:0xE4 @@ -891,10 +891,10 @@ fn_8004F13C = .text:0x8004F13C; // type:function size:0x2B4 CharModelLayerSetAll2 = .text:0x8004F3F0; // type:function size:0x80 CharModelVoiceEnableSet = .text:0x8004F470; // type:function size:0xBC fn_8004F52C = .text:0x8004F52C; // type:function size:0x4C -fn_8004F578 = .text:0x8004F578; // type:function size:0xB0 -fn_8004F628 = .text:0x8004F628; // type:function size:0x2CC -fn_8004F8F4 = .text:0x8004F8F4; // type:function size:0x2CC -fn_8004FBC0 = .text:0x8004FBC0; // type:function size:0xF80 +CharModelEffectEnableSet = .text:0x8004F578; // type:function size:0xB0 +CharModelEffectNpcInit = .text:0x8004F628; // type:function size:0x2CC +CharModelEffectNpcInitSilent = .text:0x8004F8F4; // type:function size:0x2CC +UpdateNpcEffect = .text:0x8004FBC0; // type:function size:0xF80 scope:local CharModelStepTypeSet = .text:0x80050B40; // type:function size:0x30 PlayStepFX = .text:0x80050B70; // type:function size:0xEC scope:local MapWall = .text:0x80050C5C; // type:function size:0x1B8 @@ -952,7 +952,7 @@ THPTestProc = .text:0x8005793C; // type:function size:0x27C scope:local THPViewFunc = .text:0x80057BB8; // type:function size:0xA4 scope:local THPViewSprFunc = .text:0x80057C5C; // type:function size:0x17C scope:local THPDecodeFunc = .text:0x80057DD8; // type:function size:0x4C scope:local -omGetMGIndex = .text:0x80057E24; // type:function size:0x5C +omMgIndexGet = .text:0x80057E24; // type:function size:0x5C omGameSysInit = .text:0x80057E80; // type:function size:0xF4 omVibrate = .text:0x80057F74; // type:function size:0x9C _CheckFlag = .text:0x80058010; // type:function size:0xA0 @@ -4920,7 +4920,7 @@ lbl_8012DAE5 = .data:0x8012DAE5; // type:object size:0x19 data:string lbl_8012DAFE = .data:0x8012DAFE; // type:object size:0x17 data:string lbl_8012DB15 = .data:0x8012DB15; // type:object size:0x1B3 XFB_Colors = .data:0x8012DCC8; // type:object size:0xF scope:local data:byte -Ascii8x8_1bpp = .data:0x8012DCD7; // type:object size:0x800 scope:local +Ascii8x8_1bpp = .data:0x8012DCD7; // type:object size:0x800 scope:local align:1 lbl_8012E4D7 = .data:0x8012E4D7; // type:object size:0x19 lbl_8012E4F0 = .data:0x8012E4F0; // type:object size:0x21A lbl_8012E70A = .data:0x8012E70A; // type:object size:0xB data:string @@ -4932,28 +4932,28 @@ lbl_8012F020 = .data:0x8012F020; // type:object size:0x94 lbl_8012F0B4 = .data:0x8012F0B4; // type:object size:0x11 data:string lbl_8012F0C5 = .data:0x8012F0C5; // type:object size:0x3A lbl_8012F0FF = .data:0x8012F0FF; // type:object size:0x31 -seqInfo = .data:0x8012F130; // type:object size:0x1DC scope:local +seqInfoTbl = .data:0x8012F130; // type:object size:0x1DC scope:local seqType2SprTbl = .data:0x8012F30C; // type:object size:0x18 scope:local -seqTypeTbl = .data:0x8012F324; // type:object size:0x12 scope:local +mgSeqTypeTbl = .data:0x8012F324; // type:object size:0x12 scope:local lbl_8012F336 = .data:0x8012F336; // type:object size:0x53 scope:local data:string lbl_8012F389 = .data:0x8012F389; // type:object size:0x9 scope:local data:string lbl_8012F392 = .data:0x8012F392; // type:object size:0x9 scope:local data:string seqFontAlphaTbl = .data:0x8012F39B; // type:object size:0x35 scope:local data:string seqFontKanaTbl = .data:0x8012F3D0; // type:object size:0x52 scope:local data:string seqFontNumTbl = .data:0x8012F422; // type:object size:0xB scope:local data:string -lbl_8012F430 = .data:0x8012F430; // type:object size:0x14 -wordTbl = .data:0x8012F444; // type:object size:0x18 scope:local -letterBattleOfs = .data:0x8012F45C; // type:object size:0x40 scope:local -letter2vs2Ofs = .data:0x8012F49C; // type:object size:0x1C scope:local -letterBowserOfs = .data:0x8012F4B8; // type:object size:0x38 scope:local -lbl_8012F4F0 = .data:0x8012F4F0; // type:object size:0xA data:string -charNameTbl = .data:0x8012F4FC; // type:object size:0x78 scope:local -lbl_8012F574 = .data:0x8012F574; // type:object size:0xA data:string -winStrTbl = .data:0x8012F580; // type:object size:0x18 scope:local +letterBufTbl = .data:0x8012F430; // type:object size:0x14 scope:local +wordMgTbl = .data:0x8012F444; // type:object size:0x18 scope:local +letterOfs$909 = .data:0x8012F45C; // type:object size:0x40 scope:local +letterOfs$1386 = .data:0x8012F49C; // type:object size:0x1C scope:local +letterOfs$1761 = .data:0x8012F4B8; // type:object size:0x38 scope:local +lbl_8012F4F0 = .data:0x8012F4F0; // type:object size:0xA scope:local data:string +winCharNameTbl = .data:0x8012F4FC; // type:object size:0x78 scope:local +lbl_8012F574 = .data:0x8012F574; // type:object size:0xA scope:local data:string +winWordTbl = .data:0x8012F580; // type:object size:0x18 scope:local winPosOfs = .data:0x8012F598; // type:object size:0x50 scope:local practiceTbl = .data:0x8012F5E8; // type:object size:0xAC scope:local -practiceData = .data:0x8012F694; // type:object size:0xC scope:local -seqFXTbl = .data:0x8012F6A0; // type:object size:0xF0 scope:local +yPosTbl$2366 = .data:0x8012F694; // type:object size:0xC scope:local +seqStartFXTbl = .data:0x8012F6A0; // type:object size:0xF0 scope:local lbl_8012F790 = .data:0x8012F790; // type:object size:0x15 data:string lbl_8012F7A5 = .data:0x8012F7A5; // type:object size:0x10 data:string lbl_8012F7B5 = .data:0x8012F7B5; // type:object size:0x13 data:string @@ -5079,10 +5079,14 @@ lbl_80130705 = .data:0x80130705; // type:object size:0x93 lbl_80130798 = .data:0x80130798; // type:object size:0x30 effectDataTbl = .data:0x801307C8; // type:object size:0x60 scope:local charDirTbl = .data:0x80130828; // type:object size:0x60 scope:local -effectParam = .data:0x80130888; // type:object size:0x110 scope:local -lbl_801309A0 = .data:0x801309A0; // type:object size:0x20 -lbl_801309C0 = .data:0x801309C0; // type:object size:0x20 -lbl_801309E0 = .data:0x801309E0; // type:object size:0x10 +effectDustParam = .data:0x80130888; // type:object size:0x38 scope:local +effectDotParam = .data:0x801308C0; // type:object size:0x38 scope:local +effectStarParam = .data:0x801308F8; // type:object size:0x38 scope:local +effectWarnParam = .data:0x80130930; // type:object size:0x38 scope:local +effectSmokeParam = .data:0x80130968; // type:object size:0x38 scope:local +lbl_801309A0 = .data:0x801309A0; // type:object size:0x20 scope:local +lbl_801309C0 = .data:0x801309C0; // type:object size:0x20 scope:local +lbl_801309E0 = .data:0x801309E0; // type:object size:0x10 scope:local jumptable_801309F0 = .data:0x801309F0; // type:object size:0x1E8 scope:local voiceParam = .data:0x80130BD8; // type:object size:0x40 scope:local lbl_80130C18 = .data:0x80130C18; // type:object size:0xE data:string @@ -5122,28 +5126,33 @@ lbl_80130F0E = .data:0x80130F0E; // type:object size:0x12 hookNameTbl = .data:0x80130F20; // type:object size:0xA0 scope:local modelParticleParam = .data:0x80130FC0; // type:object size:0x38 scope:local coinParticleParam = .data:0x80130FF8; // type:object size:0x38 scope:local -lbl_80131030 = .data:0x80131030; // type:object size:0x38 -lbl_80131068 = .data:0x80131068; // type:object size:0x38 +lbl_80131030 = .data:0x80131030; // type:object size:0x38 scope:local +lbl_80131068 = .data:0x80131068; // type:object size:0x38 scope:local lbl_801310A0 = .data:0x801310A0; // type:object size:0x1C -lbl_801310BC = .data:0x801310BC; // type:object size:0x38 -lbl_801310F4 = .data:0x801310F4; // type:object size:0x38 +lbl_801310BC = .data:0x801310BC; // type:object size:0x38 scope:local +lbl_801310F4 = .data:0x801310F4; // type:object size:0x38 scope:local lbl_8013112C = .data:0x8013112C; // type:object size:0x1A data:string -lbl_80131146 = .data:0x80131146; // type:object size:0x12 -lbl_80131158 = .data:0x80131158; // type:object size:0x24 -lbl_8013117C = .data:0x8013117C; // type:object size:0x24 -lbl_801311A0 = .data:0x801311A0; // type:object size:0x24 -lbl_801311C4 = .data:0x801311C4; // type:object size:0x24 +lbl_80131146 = .data:0x80131146; // type:object size:0x12 scope:local +lbl_80131158 = .data:0x80131158; // type:object size:0x12 scope:local +lbl_8013116A = .data:0x8013116A; // type:object size:0x12 scope:local +lbl_8013117C = .data:0x8013117C; // type:object size:0x12 scope:local +lbl_8013118E = .data:0x8013118E; // type:object size:0xE scope:local +lbl_8013119C = .data:0x8013119C; // type:object size:0xE scope:local +lbl_801311AA = .data:0x801311AA; // type:object size:0xE scope:local +lbl_801311B8 = .data:0x801311B8; // type:object size:0xE scope:local +lbl_801311C6 = .data:0x801311C6; // type:object size:0xE scope:local +lbl_801311D4 = .data:0x801311D4; // type:object size:0xE scope:local VolumeTable = .data:0x801311E8; // type:object size:0x100 scope:local lbl_801312E8 = .data:0x801312E8; // type:object size:0x4D lbl_80131335 = .data:0x80131335; // type:object size:0x1B -MGInfoTable = .data:0x80131350; // type:object size:0xE00 data:2byte -lbl_80132150 = .data:0x80132150; // type:object size:0x40 +mgInfoTbl = .data:0x80131350; // type:object size:0xE00 data:2byte +commentTbl = .data:0x80132150; // type:object size:0x40 scope:local lbl_80132190 = .data:0x80132190; // type:object size:0xC data:string lbl_8013219C = .data:0x8013219C; // type:object size:0xC data:string lbl_801321A8 = .data:0x801321A8; // type:object size:0xC data:string SaveFileNameTbl = .data:0x801321B4; // type:object size:0xC jumptable_801321C0 = .data:0x801321C0; // type:object size:0x34 scope:local -SR_PreRstChk = .data:0x801321F8; // type:object size:0x10 +SR_PreRstChk = .data:0x801321F8; // type:object size:0x10 scope:local coveropen_en = .data:0x80132208; // type:object size:0x1384 noreloc fatalerror_en = .data:0x8013358C; // type:object size:0x1384 noreloc loading_en = .data:0x80134910; // type:object size:0x1384 noreloc @@ -5153,7 +5162,7 @@ wrongdisc_en = .data:0x8013839C; // type:object size:0x1384 noreloc jumptable_80139720 = .data:0x80139720; // type:object size:0x34 scope:local bmpMes$493 = .data:0x80139754; // type:object size:0x18 scope:local lbl_8013976C = .data:0x8013976C; // type:object size:0x13 data:string -lbl_8013977F = .data:0x8013977F; // type:object size:0x19 +lbl_8013977F = .data:0x8013977F; // type:object size:0x12 data:string camViewTbl = .data:0x80139798; // type:object size:0x24 scope:local jumptable_801397BC = .data:0x801397BC; // type:object size:0x24 scope:local confettiLightTbl = .data:0x801397E0; // type:object size:0x48 scope:local @@ -5521,8 +5530,8 @@ CZoomM = .bss:0x801901A0; // type:object size:0x40 omDLLinfoTbl = .bss:0x801901E0; // type:object size:0x50 sndFXBuf = .bss:0x80190230; // type:object size:0x200 scope:local charVoiceGroupStat = .bss:0x80190430; // type:object size:0x20 scope:local -seqStat = .bss:0x80190450; // type:object size:0x400 scope:local data:4byte -seqMaxTime = .bss:0x80190850; // type:object size:0x10 scope:local data:2byte +seqWorkData = .bss:0x80190450; // type:object size:0x400 scope:local data:4byte +winnerNameW = .bss:0x80190850; // type:object size:0x10 scope:local data:2byte esprite = .bss:0x80190860; // type:object size:0x600 data:2byte espanim = .bss:0x80190E60; // type:object size:0x1200 data:4byte lbl_80192060 = .bss:0x80192060; // type:object size:0x100 @@ -5540,8 +5549,8 @@ charInstance = .bss:0x80196EC0; // type:object size:0x640 scope:local effectMdl = .bss:0x80197500; // type:object size:0x10 scope:local data:2byte particleData = .bss:0x80197510; // type:object size:0x20 scope:local itemHookProcess = .bss:0x80197530; // type:object size:0x80 scope:local -lbl_801975B0 = .bss:0x801975B0; // type:object size:0x10 -lbl_801975C0 = .bss:0x801975C0; // type:object size:0x90 +lbl_801975B0 = .bss:0x801975B0; // type:object size:0x10 scope:local +lbl_801975C0 = .bss:0x801975C0; // type:object size:0x90 scope:local MapObject = .bss:0x80197650; // type:object size:0x40 MapMT = .bss:0x80197690; // type:object size:0x30 MapMTR = .bss:0x801976C0; // type:object size:0x30 @@ -5551,14 +5560,14 @@ ColisionIdx = .bss:0x80197708; // type:object size:0x78 HitFaceVec = .bss:0x80197780; // type:object size:0x180 OldXYZ = .bss:0x80197900; // type:object size:0xC scope:local HitFace = .bss:0x8019790C; // type:object size:0x180 -CharObject = .bss:0x80197A8C; // type:object size:0x28 +CharObject = .bss:0x80197A8C; // type:object size:0x30 SimpleControl = .bss:0x80197AC0; // type:object size:0x19C SoundBuffer = .bss:0x80197C60; // type:object size:0x500 scope:local align:32 WorkBuffer = .bss:0x80198160; // type:object size:0x40 scope:local align:32 THPFileName = .bss:0x801981A0; // type:object size:0x40 scope:local -GWGameStatBackup = .bss:0x801981E0; // type:object size:0x118 -lbl_801982F8 = .bss:0x801982F8; // type:object size:0x100 -lbl_801983F8 = .bss:0x801983F8; // type:object size:0x18 +mgGameStatBackup = .bss:0x801981E0; // type:object size:0x118 +mgIndexList = .bss:0x801982F8; // type:object size:0x100 +mgTicTacToeGrid = .bss:0x801983F8; // type:object size:0x12 _Sys_Flag = .bss:0x80198410; // type:object size:0x10 curFileInfo = .bss:0x80198420; // type:object size:0x20 saveBuf = .bss:0x80198440; // type:object size:0x4000 align:32 @@ -5778,55 +5787,55 @@ lbl_801D3488 = .sdata:0x801D3488; // type:object size:0x4 data:string lbl_801D348C = .sdata:0x801D348C; // type:object size:0xC omSysPauseEnableFlag = .sdata:0x801D3498; // type:object size:0x1 data:byte omprevovl = .sdata:0x801D349C; // type:object size:0x4 data:4byte -lbl_801D34A0 = .sdata:0x801D34A0; // type:object size:0x4 data:4byte +titleMes$442 = .sdata:0x801D34A0; // type:object size:0x4 scope:local data:4byte lbl_801D34A4 = .sdata:0x801D34A4; // type:object size:0xC lbl_801D34B0 = .sdata:0x801D34B0; // type:object size:0x1 lbl_801D34B1 = .sdata:0x801D34B1; // type:object size:0x7 mgSeqInitF = .sdata:0x801D34B8; // type:object size:0x4 data:4byte -lbl_801D34BC = .sdata:0x801D34BC; // type:object size:0x7 data:string -lbl_801D34C3 = .sdata:0x801D34C3; // type:object size:0x3 data:byte -lbl_801D34C6 = .sdata:0x801D34C6; // type:object size:0x6 -lbl_801D34CC = .sdata:0x801D34CC; // type:object size:0x8 -lbl_801D34D4 = .sdata:0x801D34D4; // type:object size:0x6 -lbl_801D34DA = .sdata:0x801D34DA; // type:object size:0x8 data:string -lbl_801D34E2 = .sdata:0x801D34E2; // type:object size:0x6 data:string -lbl_801D34E8 = .sdata:0x801D34E8; // type:object size:0x4 -lbl_801D34EC = .sdata:0x801D34EC; // type:object size:0x6 data:string -lbl_801D34F2 = .sdata:0x801D34F2; // type:object size:0x6 -lbl_801D34F8 = .sdata:0x801D34F8; // type:object size:0x6 data:string -lbl_801D34FE = .sdata:0x801D34FE; // type:object size:0x5 -lbl_801D3503 = .sdata:0x801D3503; // type:object size:0x6 data:string -lbl_801D3509 = .sdata:0x801D3509; // type:object size:0x5 -lbl_801D350E = .sdata:0x801D350E; // type:object size:0x6 data:string -lbl_801D3514 = .sdata:0x801D3514; // type:object size:0x4 -lbl_801D3518 = .sdata:0x801D3518; // type:object size:0x6 data:string -lbl_801D351E = .sdata:0x801D351E; // type:object size:0x6 -lbl_801D3524 = .sdata:0x801D3524; // type:object size:0x5 data:string -lbl_801D3529 = .sdata:0x801D3529; // type:object size:0x7 -lbl_801D3530 = .sdata:0x801D3530; // type:object size:0x6 data:string -lbl_801D3536 = .sdata:0x801D3536; // type:object size:0x7 -lbl_801D353D = .sdata:0x801D353D; // type:object size:0x8 data:string -lbl_801D3545 = .sdata:0x801D3545; // type:object size:0x5 -lbl_801D354A = .sdata:0x801D354A; // type:object size:0x7 data:string -lbl_801D3551 = .sdata:0x801D3551; // type:object size:0x6 -lbl_801D3557 = .sdata:0x801D3557; // type:object size:0x5 data:string -lbl_801D355C = .sdata:0x801D355C; // type:object size:0x5 -lbl_801D3561 = .sdata:0x801D3561; // type:object size:0x8 data:string -lbl_801D3569 = .sdata:0x801D3569; // type:object size:0x4 -lbl_801D356D = .sdata:0x801D356D; // type:object size:0x4 data:string -lbl_801D3571 = .sdata:0x801D3571; // type:object size:0x5 -lbl_801D3576 = .sdata:0x801D3576; // type:object size:0x6 data:string -lbl_801D357C = .sdata:0x801D357C; // type:object size:0x7 -lbl_801D3583 = .sdata:0x801D3583; // type:object size:0x6 -lbl_801D3589 = .sdata:0x801D3589; // type:object size:0x7 data:string -lbl_801D3590 = .sdata:0x801D3590; // type:object size:0x3 -lbl_801D3593 = .sdata:0x801D3593; // type:object size:0x5 data:string -lbl_801D3598 = .sdata:0x801D3598; // type:object size:0x6 -lbl_801D359E = .sdata:0x801D359E; // type:object size:0x5 data:string -lbl_801D35A3 = .sdata:0x801D35A3; // type:object size:0x7 -lbl_801D35AA = .sdata:0x801D35AA; // type:object size:0x6 -lbl_801D35B0 = .sdata:0x801D35B0; // type:object size:0x6 data:string -pauseStrTbl = .sdata:0x801D35B8; // type:object size:0x8 scope:local +wordStartE = .sdata:0x801D34BC; // type:object size:0x7 scope:local data:string +seqPunctTbl = .sdata:0x801D34C3; // type:object size:0x3 scope:local data:byte +wordStartJ = .sdata:0x801D34C6; // type:object size:0x6 scope:local +wordFinishJ = .sdata:0x801D34CC; // type:object size:0x8 scope:local +wordDrawJ = .sdata:0x801D34D4; // type:object size:0x6 scope:local +wordFinishE = .sdata:0x801D34DA; // type:object size:0x8 scope:local data:string +wordDrawE = .sdata:0x801D34E2; // type:object size:0x6 scope:local data:string +lbl_801D34E8 = .sdata:0x801D34E8; // type:object size:0x4 scope:local +lbl_801D34EC = .sdata:0x801D34EC; // type:object size:0x6 scope:local data:string +lbl_801D34F2 = .sdata:0x801D34F2; // type:object size:0x6 scope:local +lbl_801D34F8 = .sdata:0x801D34F8; // type:object size:0x6 scope:local data:string +lbl_801D34FE = .sdata:0x801D34FE; // type:object size:0x5 scope:local +lbl_801D3503 = .sdata:0x801D3503; // type:object size:0x6 scope:local data:string +lbl_801D3509 = .sdata:0x801D3509; // type:object size:0x5 scope:local +lbl_801D350E = .sdata:0x801D350E; // type:object size:0x6 scope:local data:string +lbl_801D3514 = .sdata:0x801D3514; // type:object size:0x4 scope:local +lbl_801D3518 = .sdata:0x801D3518; // type:object size:0x6 scope:local data:string +lbl_801D351E = .sdata:0x801D351E; // type:object size:0x6 scope:local +lbl_801D3524 = .sdata:0x801D3524; // type:object size:0x5 scope:local data:string +lbl_801D3529 = .sdata:0x801D3529; // type:object size:0x7 scope:local +lbl_801D3530 = .sdata:0x801D3530; // type:object size:0x6 scope:local data:string +lbl_801D3536 = .sdata:0x801D3536; // type:object size:0x7 scope:local +lbl_801D353D = .sdata:0x801D353D; // type:object size:0x8 scope:local data:string +lbl_801D3545 = .sdata:0x801D3545; // type:object size:0x5 scope:local +lbl_801D354A = .sdata:0x801D354A; // type:object size:0x7 scope:local data:string +lbl_801D3551 = .sdata:0x801D3551; // type:object size:0x6 scope:local +lbl_801D3557 = .sdata:0x801D3557; // type:object size:0x5 scope:local data:string +lbl_801D355C = .sdata:0x801D355C; // type:object size:0x5 scope:local +lbl_801D3561 = .sdata:0x801D3561; // type:object size:0x8 scope:local data:string +lbl_801D3569 = .sdata:0x801D3569; // type:object size:0x4 scope:local +lbl_801D356D = .sdata:0x801D356D; // type:object size:0x4 scope:local data:string +lbl_801D3571 = .sdata:0x801D3571; // type:object size:0x5 scope:local +lbl_801D3576 = .sdata:0x801D3576; // type:object size:0x6 scope:local data:string +lbl_801D357C = .sdata:0x801D357C; // type:object size:0x7 scope:local +lbl_801D3583 = .sdata:0x801D3583; // type:object size:0x6 scope:local +lbl_801D3589 = .sdata:0x801D3589; // type:object size:0x7 scope:local data:string +lbl_801D3590 = .sdata:0x801D3590; // type:object size:0x3 scope:local +lbl_801D3593 = .sdata:0x801D3593; // type:object size:0x5 scope:local data:string +lbl_801D3598 = .sdata:0x801D3598; // type:object size:0x6 scope:local +lbl_801D359E = .sdata:0x801D359E; // type:object size:0x5 scope:local data:string +lbl_801D35A3 = .sdata:0x801D35A3; // type:object size:0x7 scope:local +lbl_801D35AA = .sdata:0x801D35AA; // type:object size:0x6 scope:local +lbl_801D35B0 = .sdata:0x801D35B0; // type:object size:0x6 scope:local data:string +pauseStr$2216 = .sdata:0x801D35B8; // type:object size:0x8 scope:local lbl_801D35C0 = .sdata:0x801D35C0; // type:object size:0x8 lbl_801D35C8 = .sdata:0x801D35C8; // type:object size:0x8 lbl_801D35D0 = .sdata:0x801D35D0; // type:object size:0x8 @@ -5834,11 +5843,11 @@ lbl_801D35D8 = .sdata:0x801D35D8; // type:object size:0x8 colorN$400 = .sdata:0x801D35E0; // type:object size:0x4 data:byte colorN$444 = .sdata:0x801D35E4; // type:object size:0x4 data:byte winPrio = .sdata:0x801D35E8; // type:object size:0x8 scope:local data:2byte -lbl_801D35F0 = .sdata:0x801D35F0; // type:object size:0x8 -lbl_801D35F8 = .sdata:0x801D35F8; // type:object size:0x8 -lbl_801D3600 = .sdata:0x801D3600; // type:object size:0x8 -lbl_801D3608 = .sdata:0x801D3608; // type:object size:0x8 -lbl_801D3610 = .sdata:0x801D3610; // type:object size:0x8 +lbl_801D35F0 = .sdata:0x801D35F0; // type:object size:0x8 scope:local +lbl_801D35F8 = .sdata:0x801D35F8; // type:object size:0x8 scope:local +lbl_801D3600 = .sdata:0x801D3600; // type:object size:0x8 scope:local +lbl_801D3608 = .sdata:0x801D3608; // type:object size:0x8 scope:local +lbl_801D3610 = .sdata:0x801D3610; // type:object size:0x8 scope:local lbl_801D3618 = .sdata:0x801D3618; // type:object size:0x1 lbl_801D3619 = .sdata:0x801D3619; // type:object size:0x5 data:string lbl_801D361E = .sdata:0x801D361E; // type:object size:0x5 data:string @@ -6027,25 +6036,25 @@ dspSlaveLength = .sdata:0x801D39F0; // type:object size:0x2 data:2byte SendCount = .sdata:0x801D39F8; // type:object size:0x1 scope:local data:byte SystemInitF = .sbss:0x801D3A00; // type:object size:0x4 data:4byte HuDvdErrWait = .sbss:0x801D3A04; // type:object size:0x4 data:4byte -lbl_801D3A08 = .sbss:0x801D3A08; // type:object size:0x4 -lbl_801D3A0C = .sbss:0x801D3A0C; // type:object size:0x4 -lbl_801D3A10 = .sbss:0x801D3A10; // type:object size:0x4 -lbl_801D3A14 = .sbss:0x801D3A14; // type:object size:0x4 -lbl_801D3A18 = .sbss:0x801D3A18; // type:object size:0x4 -lbl_801D3A1C = .sbss:0x801D3A1C; // type:object size:0x4 -lbl_801D3A20 = .sbss:0x801D3A20; // type:object size:0x4 -lbl_801D3A24 = .sbss:0x801D3A24; // type:object size:0x4 -lbl_801D3A28 = .sbss:0x801D3A28; // type:object size:0x4 -lbl_801D3A2C = .sbss:0x801D3A2C; // type:object size:0x4 -lbl_801D3A30 = .sbss:0x801D3A30; // type:object size:0x4 -lbl_801D3A34 = .sbss:0x801D3A34; // type:object size:0x4 -lbl_801D3A38 = .sbss:0x801D3A38; // type:object size:0x4 -lbl_801D3A3C = .sbss:0x801D3A3C; // type:object size:0x4 -lbl_801D3A40 = .sbss:0x801D3A40; // type:object size:0x4 -lbl_801D3A44 = .sbss:0x801D3A44; // type:object size:0x4 -lbl_801D3A48 = .sbss:0x801D3A48; // type:object size:0x4 -lbl_801D3A4C = .sbss:0x801D3A4C; // type:object size:0x4 -lbl_801D3A50 = .sbss:0x801D3A50; // type:object size:0x4 +fi_req = .sbss:0x801D3A08; // type:object size:0x4 scope:local +rf_req = .sbss:0x801D3A0C; // type:object size:0x4 scope:local +pe_req = .sbss:0x801D3A10; // type:object size:0x4 scope:local +vi_req = .sbss:0x801D3A14; // type:object size:0x4 scope:local +io_req = .sbss:0x801D3A18; // type:object size:0x4 scope:local +dsp_req = .sbss:0x801D3A1C; // type:object size:0x4 scope:local +cpu_wr_req = .sbss:0x801D3A20; // type:object size:0x4 scope:local +cpu_rd_req = .sbss:0x801D3A24; // type:object size:0x4 scope:local +tc_req = .sbss:0x801D3A28; // type:object size:0x4 scope:local +cp_req = .sbss:0x801D3A2C; // type:object size:0x4 scope:local +total_copy_clks = .sbss:0x801D3A30; // type:object size:0x4 scope:local +clr_pixels_in = .sbss:0x801D3A34; // type:object size:0x4 scope:local +bot_pixels_out = .sbss:0x801D3A38; // type:object size:0x4 scope:local +bot_pixels_in = .sbss:0x801D3A3C; // type:object size:0x4 scope:local +top_pixels_out = .sbss:0x801D3A40; // type:object size:0x4 scope:local +top_pixels_in = .sbss:0x801D3A44; // type:object size:0x4 scope:local +vstall = .sbss:0x801D3A48; // type:object size:0x4 scope:local +vmiss = .sbss:0x801D3A4C; // type:object size:0x4 scope:local +vcheck = .sbss:0x801D3A50; // type:object size:0x4 scope:local GlobalCounter = .sbss:0x801D3A54; // type:object size:0x4 data:4byte VCounter = .sbss:0x801D3A58; // type:object size:0x4 data:4byte RumbleBit = .sbss:0x801D3A5C; // type:object size:0x4 scope:local data:4byte @@ -6310,14 +6319,15 @@ decodeThread = .sbss:0x801D3E68; // type:object size:0x4 scope:local data:4byte decodeStackP = .sbss:0x801D3E6C; // type:object size:0x4 scope:local data:4byte decodeRate = .sbss:0x801D3E70; // type:object size:0x4 scope:local data:4byte audioTrack = .sbss:0x801D3E74; // type:object size:0x8 scope:local data:4byte -lbl_801D3E80 = .sbss:0x801D3E80; // type:object size:0x4 -lbl_801D3E84 = .sbss:0x801D3E84; // type:object size:0x4 -lbl_801D3E88 = .sbss:0x801D3E88; // type:object size:0x4 data:4byte -lbl_801D3E8C = .sbss:0x801D3E8C; // type:object size:0x4 data:4byte -lbl_801D3E90 = .sbss:0x801D3E90; // type:object size:0x4 -lbl_801D3E94 = .sbss:0x801D3E94; // type:object size:0x4 -lbl_801D3E98 = .sbss:0x801D3E98; // type:object size:0x8 -lbl_801D3EA0 = .sbss:0x801D3EA0; // type:object size:0x8 +mgBoardHostEnableF = .sbss:0x801D3E80; // type:object size:0x1 +mgInstExitEnableF = .sbss:0x801D3E84; // type:object size:0x4 +mgPracticeEnableF = .sbss:0x801D3E88; // type:object size:0x4 data:4byte +mgQuitExtraF = .sbss:0x801D3E8C; // type:object size:0x4 data:4byte +mgRecordExtra = .sbss:0x801D3E90; // type:object size:0x4 +lbl_801D3E94 = .sbss:0x801D3E94; // type:object size:0x1 +mgBattleStarMax = .sbss:0x801D3E96; // type:object size:0x2 +mgBattleStar = .sbss:0x801D3E98; // type:object size:0x8 +mgTypeCurr = .sbss:0x801D3EA0; // type:object size:0x2 data:2byte curSlotNo = .sbss:0x801D3EA8; // type:object size:0x2 data:2byte curBoxNo = .sbss:0x801D3EAA; // type:object size:0x1 data:byte saveExecF = .sbss:0x801D3EAC; // type:object size:0x4 diff --git a/configure.py b/configure.py index 7881fae4..42a02138 100644 --- a/configure.py +++ b/configure.py @@ -271,7 +271,7 @@ def DolphinLib(lib_name, objects): "objects": objects, } -def MusyX(objects, mw_version="GC/2.6", debug=False, major=2, minor=0, patch=0): +def MusyX(objects, mw_version="GC/1.3.2", debug=False, major=1, minor=5, patch=4): cflags = cflags_musyx if not debug else cflags_musyx_debug return { "lib": "musyx", @@ -313,7 +313,7 @@ config.libs = [ Object(Matching, "game/main.c"), Object(Matching, "game/pad.c"), Object(Matching, "game/dvd.c"), - Object(NonMatching, "game/data.c"), + Object(Matching, "game/data.c"), Object(Matching, "game/decode.c"), Object(Matching, "game/font.c"), Object(Matching, "game/init.c"), @@ -332,14 +332,14 @@ config.libs = [ Object(Matching, "game/hsfex.c"), Object(Matching, "game/perf.c"), Object(Matching, "game/objmain.c"), - Object(NonMatching, "game/fault.c"), + Object(Matching, "game/fault.c"), Object(Matching, "game/gamework.c"), - Object(NonMatching, "game/objsysobj.c"), - Object(NonMatching, "game/objdll.c"), + Object(Matching, "game/objsysobj.c"), + Object(Matching, "game/objdll.c"), Object(Matching, "game/frand.c"), Object(Matching, "game/audio.c"), Object(Matching, "game/EnvelopeExec.c"), - Object(NonMatching, "game/minigame_seq.c"), + Object(Matching, "game/minigame_seq.c"), Object(Matching, "game/ovllist.c"), Object(Matching, "game/esprite.c"), Object(NonMatching, "game/code_8003FF68.c"), @@ -350,22 +350,22 @@ config.libs = [ Object(Matching, "game/messdata.c"), Object(Matching, "game/card.c"), Object(Matching, "game/armem.c"), - Object(NonMatching, "game/chrman.c"), - Object(NonMatching, "game/mapspace.c"), + Object(Matching, "game/chrman.c"), + Object(Matching, "game/mapspace.c"), Object(Matching, "game/THPSimple.c"), Object(Matching, "game/THPDraw.c"), Object(Matching, "game/thpmain.c"), - Object(NonMatching, "game/objsub.c"), + Object(Matching, "game/objsub.c"), Object(Matching, "game/flag.c"), Object(Matching, "game/saveload.c"), - Object(NonMatching, "game/sreset.c"), + Object(Matching, "game/sreset.c"), Object(Matching, "game/board/main.c"), Object(NonMatching, "game/board/player.c"), Object(Matching, "game/board/model.c"), Object(Matching, "game/board/window.c"), - Object(NonMatching, "game/board/audio.c"), - Object(NonMatching, "game/board/com.c"), - Object(NonMatching, "game/board/view.c"), + Object(Matching, "game/board/audio.c"), + Object(Matching, "game/board/com.c"), + Object(Matching, "game/board/view.c"), Object(NonMatching, "game/board/space.c"), Object(NonMatching, "game/board/shop.c"), Object(NonMatching, "game/board/lottery.c"), @@ -373,22 +373,22 @@ config.libs = [ Object(Matching, "game/board/warp.c"), Object(NonMatching, "game/board/char_wheel.c"), Object(NonMatching, "game/board/mushroom.c"), - Object(NonMatching, "game/board/star.c"), - Object(NonMatching, "game/board/roll.c"), + Object(Matching, "game/board/star.c"), + Object(Matching, "game/board/roll.c"), Object(Matching, "game/board/ui.c"), - Object(NonMatching, "game/board/block.c"), + Object(Matching, "game/board/block.c"), Object(NonMatching, "game/board/item.c"), Object(NonMatching, "game/board/bowser.c"), Object(NonMatching, "game/board/battle.c"), Object(NonMatching, "game/board/fortune.c"), - Object(NonMatching, "game/board/boo.c"), + Object(Matching, "game/board/boo.c"), Object(NonMatching, "game/board/mg_setup.c"), Object(NonMatching, "game/board/boo_house.c"), Object(NonMatching, "game/board/start.c"), Object(NonMatching, "game/board/last5.c"), - Object(NonMatching, "game/board/pause.c"), - Object(NonMatching, "game/board/com_path.c"), - Object(NonMatching, "game/board/tutorial.c"), + Object(Matching, "game/board/pause.c"), + Object(Matching, "game/board/com_path.c"), + Object(Matching, "game/board/tutorial.c"), Object(NonMatching, "game/kerent.c"), ], }, @@ -665,34 +665,34 @@ config.libs = [ MusyX( objects={ Object(Matching, "musyx/runtime/seq.c"), - Object(NonMatching, "musyx/runtime/synth.c"), + Object(Matching, "musyx/runtime/synth.c"), Object(Matching, "musyx/runtime/seq_api.c"), Object(Matching, "musyx/runtime/snd_synthapi.c"), Object(NonMatching, "musyx/runtime/stream.c"), Object(Matching, "musyx/runtime/synthdata.c"), Object(NonMatching, "musyx/runtime/synthmacros.c"), - Object(NonMatching, "musyx/runtime/synthvoice.c"), + Object(Matching, "musyx/runtime/synthvoice.c"), Object(Matching, "musyx/runtime/synth_ac.c"), Object(Matching, "musyx/runtime/synth_dbtab.c"), - Object(NonMatching, "musyx/runtime/synth_adsr.c"), + Object(Matching, "musyx/runtime/synth_adsr.c"), Object(NonMatching, "musyx/runtime/synth_vsamples.c"), - Object(NonMatching, "musyx/runtime/s_data.c"), + Object(Matching, "musyx/runtime/s_data.c"), Object(NonMatching, "musyx/runtime/hw_dspctrl.c"), Object(Matching, "musyx/runtime/hw_volconv.c"), Object(Matching, "musyx/runtime/snd3d.c"), Object(Matching, "musyx/runtime/snd_init.c"), - Object(NonMatching, "musyx/runtime/snd_math.c"), + Object(Matching, "musyx/runtime/snd_math.c"), Object(NonMatching, "musyx/runtime/snd_midictrl.c"), - Object(NonMatching, "musyx/runtime/snd_service.c"), + Object(Matching, "musyx/runtime/snd_service.c"), Object(Matching, "musyx/runtime/hardware.c"), Object(Matching, "musyx/runtime/dsp_import.c"), Object(Matching, "musyx/runtime/hw_aramdma.c"), Object(Matching, "musyx/runtime/hw_dolphin.c"), Object(Matching, "musyx/runtime/hw_memory.c"), Object(Matching, "musyx/runtime/CheapReverb/creverb_fx.c"), - Object(NonMatching, "musyx/runtime/CheapReverb/creverb.c"), + Object(Matching, "musyx/runtime/CheapReverb/creverb.c"), Object(Matching, "musyx/runtime/StdReverb/reverb_fx.c"), - Object(NonMatching, "musyx/runtime/StdReverb/reverb.c"), + Object(Matching, "musyx/runtime/StdReverb/reverb.c"), Object(Matching, "musyx/runtime/Delay/delay_fx.c"), Object(Matching, "musyx/runtime/Chorus/chorus_fx.c"), } @@ -836,6 +836,43 @@ config.libs = [ Object(NonMatching, "REL/m407dll/score.c"), } ), + Rel('m408Dll', + objects = { + Object(Matching, "REL/executor.c"), + Object(NonMatching, "REL/m408Dll/main.c"), + Object(NonMatching, "REL/m408Dll/camera.c"), + Object(NonMatching, "REL/m408Dll/stage.c"), + Object(NonMatching, "REL/m408Dll/object.c"), + } + ), + Rel('m409Dll', + objects = { + Object(Matching, "REL/executor.c"), + Object(NonMatching, "REL/m409Dll/main.c"), + Object(NonMatching, "REL/m409Dll/player.c"), + Object(NonMatching, "REL/m409Dll/cursor.c"), + } + ), + Rel('m410Dll', + objects = { + Object(Matching, "REL/executor.c"), + Object(NonMatching, "REL/m410Dll/main.c"), + Object(NonMatching, "REL/m410Dll/stage.c"), + Object(NonMatching, "REL/m410Dll/game.c"), + Object(NonMatching, "REL/m410Dll/player.c"), + } + ), + Rel('m411Dll', + objects = { + Object(Matching, "REL/executor.c"), + Object(NonMatching, "REL/m411Dll/main.c"), + } + ), + Rel('m450Dll', + objects = { + Object(NonMatching, "REL/m450Dll/main.c"), + } + ), Rel('mentDll', objects = { Object(NonMatching, "REL/mentDll/common.c"), @@ -861,6 +898,14 @@ config.libs = [ Object(NonMatching, "REL/mgmodedll/minigame.c"), } ), + Rel('modeltestDll', + objects = { + Object(Matching, "REL/executor.c"), + Object(Matching, "REL/modeltestDll/main.c"), + Object(Matching, "REL/modeltestDll/modeltest00.c"), + Object(NonMatching, "REL/modeltestDll/modeltest01.c"), + } + ), Rel('modeseldll', objects = { Object(Matching, "REL/executor.c"), diff --git a/include/REL/modeltestDll.h b/include/REL/modeltestDll.h new file mode 100644 index 00000000..0715ad9b --- /dev/null +++ b/include/REL/modeltestDll.h @@ -0,0 +1,50 @@ +#ifndef REL_MODELTEST_H +#define REL_MODELTEST_H + +#include "game/hsfdraw.h" +#include "game/objsub.h" +#include "game/object.h" + +// -------------------------------------------------------------------------- // + +#define US_PER_60TH_SEC (1000000.0f / 60.0f) +#define US_TO_60TH_SEC(us) ((us) / US_PER_60TH_SEC) +#define FB_SIZE(width, height) width * height * 2 +#define ABS(x) ((x) < 0 ? -(x) : (x)) + +// -------------------------------------------------------------------------- // + +typedef struct +{ + s16 unk0[7]; +} HuUnkF9C2; + +typedef struct +{ + Point3d pos; // 0000 + Point3d rot; // 000C + Point3d scale; // 0018 + s32 unk24; + s32 unk28; + s32 unk2C; + HsfObject * obj; // 0030 +} HuObjUnk; + +extern Point3d CRot; +extern Point3d Center; +extern f32 CZoom; +void fn_1_29C(); +void fn_1_28F8(Point3d * arg0, Point3d * arg1); +extern void omOutView(); +void fn_1_37DC(omObjData*); +void fn_1_439C(omObjData*); +void fn_1_46F0(); + +s16 MGSeqCreate(s16, ...); +void MGSeqParamSet(s16, s16, s16); +typedef void (omObjFunc2)(struct om_obj_data *); +omObjFunc2 fn_1_F9C; + +#endif + +// -------------------------------------------------------------------------- // \ No newline at end of file diff --git a/include/REL/w10Dll.h b/include/REL/w10Dll.h index 967ae094..c334d7ac 100644 --- a/include/REL/w10Dll.h +++ b/include/REL/w10Dll.h @@ -45,7 +45,7 @@ typedef struct w10DllUnk04 { extern s16 lbl_1_bss_20; extern s16 lbl_1_bss_22[]; extern s16 lbl_1_bss_20; -extern s32 boardTutorialData; +extern s32 boardTutorialData[4]; void fn_1_C10(s16); void fn_1_1FB0(void); diff --git a/include/board_unsplit.h b/include/board_unsplit.h index c7af0a90..4115581c 100644 --- a/include/board_unsplit.h +++ b/include/board_unsplit.h @@ -12,37 +12,28 @@ typedef s32 (*BoardSpaceEventFunc)(void); typedef void (*BoardLightHook)(void); #endif -void BoardCameraTargetModelSet(s16 model); -void BoardCameraMotionStartEx(s16, Vec *, Vec *, f32, f32, s16); -void BoardCameraMotionWait(void); s32 BoardSpacePosGet(s32, s32, Vec*); void BoardShopTutorialExec(s32); void BoardLotteryTutorialExec(void); -s16 BoardStarHostMdlGet(void); -void BoardStatusShowSetAll(s32); void BoardMGSetupTutorialExec(void); void BoardBooHouseTutorialExec(void); -void BoardStatusItemSet(s32); -void BoardTutorialItemSet(s32); void BoardCharWheelSetTarget(s32); -void BoardTutorialDirInputSet(s32, s32, s32); void BoardSpaceStarSetIndex(s32); -void BoardModelRotYSet(s16, f32); +s32 BoardModelRotYSet(s16, f32); f32 BoardModelRotYGet(s16); -void BoardModelLayerSet(s16, u8); -void BoardTutorialHostSet(s16); +s32 BoardModelLayerSet(s16, u8); s16 BoardModelIDGet(s16); -void BoardModelScaleSetV(s16, Vec*); +s32 BoardModelScaleSetV(s16, Vec*); void BoardLightHookSet(BoardLightHook set, BoardLightHook reset); -s16 BoardModelCreate(s32, void*, s32); +s16 BoardModelCreate(s32, s32*, s32); void BoardModelKill(s16); -void fn_8006DDE8(s16, f32); -s32 BoardModelMotionStart(s16, s32, s32); -void BoardModelMotionSpeedSet(s16, f32); -void BoardModelPosSetV(s16, Vec*); -void BoardModelPosSet(s16, f32, f32, f32); -void BoardModelRotSetV(s16 arg0, Vec* arg1); -void BoardModelVisibilitySet(s16, s32); +s32 fn_8006DDE8(s16, f32); +s32 BoardModelMotionStart(s16, s32, u32); +s32 BoardModelMotionSpeedSet(s16, f32); +s32 BoardModelPosSetV(s16, Vec*); +s32 BoardModelPosSet(s16, f32, f32, f32); +s32 BoardModelRotSetV(s16 arg0, Vec* arg1); +s32 BoardModelVisibilitySet(s16, s32); void BoardSpaceWalkEventFuncSet(BoardSpaceEventFunc func); void BoardSpaceWalkMiniEventFuncSet(BoardSpaceEventFunc func); void BoardSpaceLandEventFuncSet(BoardSpaceEventFunc func); @@ -51,15 +42,12 @@ void BoardSpaceInit(s32); void BoardSpaceDestroy(void); void BoardShopHostSet(s16); void BoardLotteryHostSet(s16); -void BoardStarHostSet(s16); void BoardBooHouseHostSet(s16); -void BoardTutorialHookSet(void*); -void BoardTutorialBlockSetPos(s32, s32); s32 BoardCameraRotGet(Vec*); -void BoardModelScaleSet(s16, f32, f32, f32); +s32 BoardModelScaleSet(s16, f32, f32, f32); s32 BoardIsKill(void); void BoardModelMtxSet(s16, Mtx*); -void BoardModelRotSet(s16, f32, f32, f32); +s32 BoardModelRotSet(s16, f32, f32, f32); void BoardBowserExec(s32 player, s32 space); void BoardBattleExec(s32 player, s32 space); diff --git a/include/data_num/title.h b/include/data_num/title.h new file mode 100644 index 00000000..2d0ce603 --- /dev/null +++ b/include/data_num/title.h @@ -0,0 +1,23 @@ +#ifndef DATANUM_TITLE_H +#define DATANUM_TITLE_H + +#include "datadir_enum.h" + +enum { + TITLE_NINTENDO_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 0), + TITLE_HUDSON_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 1), + TITLE_PRESS_START_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 2), + TITLE_PROGRESSIVE_CHOOSE_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 3), + TITLE_PROGRESSIVE_ON_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 4), + TITLE_PROGRESSIVE_OFF_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 5), + TITLE_PROGRESSIVE_CURSOR_ON_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 6), + TITLE_PROGRESSIVE_CURSOR_OFF_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 7), + TITLE_BG_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 8), + TITLE_LOGO_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 9), + TITLE_COPYRIGHT_ANM = DATA_MAKE_NUM(DATADIR_TITLE, 10), + TITLE_CHAR_HSF = DATA_MAKE_NUM(DATADIR_TITLE, 11), + TITLE_CUBE_HSF = DATA_MAKE_NUM(DATADIR_TITLE, 12), + TITLE_SKY_HSF = DATA_MAKE_NUM(DATADIR_TITLE, 13), +}; + +#endif \ No newline at end of file diff --git a/include/data_num/win.h b/include/data_num/win.h new file mode 100644 index 00000000..3a38070f --- /dev/null +++ b/include/data_num/win.h @@ -0,0 +1,42 @@ +#ifndef DATANUM_WIN_H +#define DATANUM_WIN_H + +#include "datadir_enum.h" + +enum { + WIN_FONTJ_ANM = DATA_MAKE_NUM(DATADIR_WIN, 0), + WIN_FONTE_ANM = DATA_MAKE_NUM(DATADIR_WIN, 1), + WIN_CURSOR_ANM = DATA_MAKE_NUM(DATADIR_WIN, 2), + WIN_ICON_ANM = DATA_MAKE_NUM(DATADIR_WIN, 3), + WIN_CARDA_ANM = DATA_MAKE_NUM(DATADIR_WIN, 4), + WIN_CARDB_ANM = DATA_MAKE_NUM(DATADIR_WIN, 5), + WIN_FRAME1_ANM = DATA_MAKE_NUM(DATADIR_WIN, 6), + WIN_FRAME2_ANM = DATA_MAKE_NUM(DATADIR_WIN, 7), + WIN_FRAME3_ANM = DATA_MAKE_NUM(DATADIR_WIN, 8), + WIN_W01_HOST_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 9), + WIN_W02_HOST_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 10), + WIN_W03_HOST_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 11), + WIN_W04_HOST_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 12), + WIN_W05_HOST_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 13), + WIN_W06_HOST_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 14), + WIN_TOAD_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 15), + WIN_BOBOMB_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 16), + WIN_SHYGUY_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 17), + WIN_BOO_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 18), + WIN_GOOMBA_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 19), + WIN_BOWSER_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 20), + WIN_KKID_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 21), + WIN_KOOPA_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 22), + WIN_CONDOR_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 23), + WIN_BOO_BLUE_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 24), + WIN_DOLPHIN_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 25), + WIN_BOO_RED_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 26), + WIN_THWOMP_TALK_ANM = DATA_MAKE_NUM(DATADIR_WIN, 27), + WIN_CARD_BOX1_ICON_ANM = DATA_MAKE_NUM(DATADIR_WIN, 28), + WIN_CARD_BOX2_ICON_ANM = DATA_MAKE_NUM(DATADIR_WIN, 29), + WIN_CARD_BOX3_ICON_ANM = DATA_MAKE_NUM(DATADIR_WIN, 30), + WIN_CARD_BANNER_ANM = DATA_MAKE_NUM(DATADIR_WIN, 31), + WIN_SAVE_BG_ANM = DATA_MAKE_NUM(DATADIR_WIN, 32), +}; + +#endif \ No newline at end of file diff --git a/include/datadir_enum.h b/include/datadir_enum.h new file mode 100644 index 00000000..d4c85750 --- /dev/null +++ b/include/datadir_enum.h @@ -0,0 +1,23 @@ +#ifndef DATADIR_ENUM +#define DATADIR_ENUM + +#define DATADIR_DEFINE(name, path) DATADIR_ID_##name, + +enum { + #include "datadir_table.h" + DATADIR_ID_MAX +}; + +#undef DATADIR_DEFINE + +#define DATADIR_DEFINE(name, path) DATADIR_##name = (DATADIR_ID_##name) << 16, + +enum { + #include "datadir_table.h" +}; + +#undef DATADIR_DEFINE + +#define DATA_MAKE_NUM(dir, file) ((dir)+(file)) + +#endif \ No newline at end of file diff --git a/include/datadir_table.h b/include/datadir_table.h index b2cb103a..408931fb 100644 --- a/include/datadir_table.h +++ b/include/datadir_table.h @@ -1,140 +1,140 @@ -DATADIR_DEFINE(DATADIR_E3SETUP, "data/E3setup.bin") -DATADIR_DEFINE(DATADIR_BBATTLE, "data/bbattle.bin") -DATADIR_DEFINE(DATADIR_BGUEST, "data/bguest.bin") -DATADIR_DEFINE(DATADIR_BKOOPA, "data/bkoopa.bin") -DATADIR_DEFINE(DATADIR_BKOOPASUIT, "data/bkoopasuit.bin") -DATADIR_DEFINE(DATADIR_BKUJIYA, "data/bkujiya.bin") -DATADIR_DEFINE(DATADIR_BLAST5, "data/blast5.bin") -DATADIR_DEFINE(DATADIR_BOARD, "data/board.bin") -DATADIR_DEFINE(DATADIR_BPAUSE, "data/bpause.bin") -DATADIR_DEFINE(DATADIR_BYOKODORI, "data/byokodori.bin") -DATADIR_DEFINE(DATADIR_DAISY, "data/daisy.bin") -DATADIR_DEFINE(DATADIR_DAISYMDL0, "data/daisymdl0.bin") -DATADIR_DEFINE(DATADIR_DAISYMDL1, "data/daisymdl1.bin") -DATADIR_DEFINE(DATADIR_DAISYMOT, "data/daisymot.bin") -DATADIR_DEFINE(DATADIR_DONKEY, "data/donkey.bin") -DATADIR_DEFINE(DATADIR_DONKEYMDL0, "data/donkeymdl0.bin") -DATADIR_DEFINE(DATADIR_DONKEYMDL1, "data/donkeymdl1.bin") -DATADIR_DEFINE(DATADIR_DONKEYMOT, "data/donkeymot.bin") -DATADIR_DEFINE(DATADIR_EFFECT, "data/effect.bin") -DATADIR_DEFINE(DATADIR_GAMEMES, "data/gamemes.bin") -DATADIR_DEFINE(DATADIR_INST, "data/inst.bin") -DATADIR_DEFINE(DATADIR_INSTFONT, "data/instfont.bin") -DATADIR_DEFINE(DATADIR_INSTPIC, "data/instpic.bin") -DATADIR_DEFINE(DATADIR_LUIGI, "data/luigi.bin") -DATADIR_DEFINE(DATADIR_LUIGIMDL0, "data/luigimdl0.bin") -DATADIR_DEFINE(DATADIR_LUIGIMDL1, "data/luigimdl1.bin") -DATADIR_DEFINE(DATADIR_LUIGIMOT, "data/luigimot.bin") -DATADIR_DEFINE(DATADIR_M300, "data/m300.bin") -DATADIR_DEFINE(DATADIR_M302, "data/m302.bin") -DATADIR_DEFINE(DATADIR_M303, "data/m303.bin") -DATADIR_DEFINE(DATADIR_M330, "data/m330.bin") -DATADIR_DEFINE(DATADIR_M333, "data/m333.bin") -DATADIR_DEFINE(DATADIR_M401, "data/m401.bin") -DATADIR_DEFINE(DATADIR_M402, "data/m402.bin") -DATADIR_DEFINE(DATADIR_M403, "data/m403.bin") -DATADIR_DEFINE(DATADIR_M404, "data/m404.bin") -DATADIR_DEFINE(DATADIR_M405, "data/m405.bin") -DATADIR_DEFINE(DATADIR_M406, "data/m406.bin") -DATADIR_DEFINE(DATADIR_M407, "data/m407.bin") -DATADIR_DEFINE(DATADIR_M408, "data/m408.bin") -DATADIR_DEFINE(DATADIR_M409, "data/m409.bin") -DATADIR_DEFINE(DATADIR_M410, "data/m410.bin") -DATADIR_DEFINE(DATADIR_M411, "data/m411.bin") -DATADIR_DEFINE(DATADIR_M412, "data/m412.bin") -DATADIR_DEFINE(DATADIR_M413, "data/m413.bin") -DATADIR_DEFINE(DATADIR_M414, "data/m414.bin") -DATADIR_DEFINE(DATADIR_M415, "data/m415.bin") -DATADIR_DEFINE(DATADIR_M416, "data/m416.bin") -DATADIR_DEFINE(DATADIR_M417, "data/m417.bin") -DATADIR_DEFINE(DATADIR_M418, "data/m418.bin") -DATADIR_DEFINE(DATADIR_M419, "data/m419.bin") -DATADIR_DEFINE(DATADIR_M420, "data/m420.bin") -DATADIR_DEFINE(DATADIR_M421, "data/m421.bin") -DATADIR_DEFINE(DATADIR_M422, "data/m422.bin") -DATADIR_DEFINE(DATADIR_M423, "data/m423.bin") -DATADIR_DEFINE(DATADIR_M424, "data/m424.bin") -DATADIR_DEFINE(DATADIR_M425, "data/m425.bin") -DATADIR_DEFINE(DATADIR_M426, "data/m426.bin") -DATADIR_DEFINE(DATADIR_M427, "data/m427.bin") -DATADIR_DEFINE(DATADIR_M428, "data/m428.bin") -DATADIR_DEFINE(DATADIR_M429, "data/m429.bin") -DATADIR_DEFINE(DATADIR_M430, "data/m430.bin") -DATADIR_DEFINE(DATADIR_M431, "data/m431.bin") -DATADIR_DEFINE(DATADIR_M432, "data/m432.bin") -DATADIR_DEFINE(DATADIR_M433, "data/m433.bin") -DATADIR_DEFINE(DATADIR_M434, "data/m434.bin") -DATADIR_DEFINE(DATADIR_M435, "data/m435.bin") -DATADIR_DEFINE(DATADIR_M436, "data/m436.bin") -DATADIR_DEFINE(DATADIR_M437, "data/m437.bin") -DATADIR_DEFINE(DATADIR_M438, "data/m438.bin") -DATADIR_DEFINE(DATADIR_M439, "data/m439.bin") -DATADIR_DEFINE(DATADIR_M440, "data/m440.bin") -DATADIR_DEFINE(DATADIR_M441, "data/m441.bin") -DATADIR_DEFINE(DATADIR_M442, "data/m442.bin") -DATADIR_DEFINE(DATADIR_M443, "data/m443.bin") -DATADIR_DEFINE(DATADIR_M444, "data/m444.bin") -DATADIR_DEFINE(DATADIR_M445, "data/m445.bin") -DATADIR_DEFINE(DATADIR_M446, "data/m446.bin") -DATADIR_DEFINE(DATADIR_M447, "data/m447.bin") -DATADIR_DEFINE(DATADIR_M448, "data/m448.bin") -DATADIR_DEFINE(DATADIR_M449, "data/m449.bin") -DATADIR_DEFINE(DATADIR_M450, "data/m450.bin") -DATADIR_DEFINE(DATADIR_M451, "data/m451.bin") -DATADIR_DEFINE(DATADIR_M453, "data/m453.bin") -DATADIR_DEFINE(DATADIR_M455, "data/m455.bin") -DATADIR_DEFINE(DATADIR_M456, "data/m456.bin") -DATADIR_DEFINE(DATADIR_M457, "data/m457.bin") -DATADIR_DEFINE(DATADIR_M458, "data/m458.bin") -DATADIR_DEFINE(DATADIR_M459, "data/m459.bin") -DATADIR_DEFINE(DATADIR_M460, "data/m460.bin") -DATADIR_DEFINE(DATADIR_M461, "data/m461.bin") -DATADIR_DEFINE(DATADIR_M462, "data/m462.bin") -DATADIR_DEFINE(DATADIR_MARIO, "data/mario.bin") -DATADIR_DEFINE(DATADIR_MARIOMDL0, "data/mariomdl0.bin") -DATADIR_DEFINE(DATADIR_MARIOMDL1, "data/mariomdl1.bin") -DATADIR_DEFINE(DATADIR_MARIOMOT, "data/mariomot.bin") -DATADIR_DEFINE(DATADIR_MENT, "data/ment.bin") -DATADIR_DEFINE(DATADIR_MGCONST, "data/mgconst.bin") -DATADIR_DEFINE(DATADIR_MGMODE, "data/mgmode.bin") -DATADIR_DEFINE(DATADIR_MODESEL, "data/modesel.bin") -DATADIR_DEFINE(DATADIR_MPEX, "data/mpex.bin") -DATADIR_DEFINE(DATADIR_MSTORY, "data/mstory.bin") -DATADIR_DEFINE(DATADIR_MSTORY2, "data/mstory2.bin") -DATADIR_DEFINE(DATADIR_MSTORY3, "data/mstory3.bin") -DATADIR_DEFINE(DATADIR_MSTORY4, "data/mstory4.bin") -DATADIR_DEFINE(DATADIR_OPTION, "data/option.bin") -DATADIR_DEFINE(DATADIR_PEACH, "data/peach.bin") -DATADIR_DEFINE(DATADIR_PEACHMDL0, "data/peachmdl0.bin") -DATADIR_DEFINE(DATADIR_PEACHMDL1, "data/peachmdl1.bin") -DATADIR_DEFINE(DATADIR_PEACHMOT, "data/peachmot.bin") -DATADIR_DEFINE(DATADIR_PRESENT, "data/present.bin") -DATADIR_DEFINE(DATADIR_RESULT, "data/result.bin") -DATADIR_DEFINE(DATADIR_SAF, "data/saf.bin") -DATADIR_DEFINE(DATADIR_SELMENU, "data/selmenu.bin") -DATADIR_DEFINE(DATADIR_SETUP, "data/setup.bin") -DATADIR_DEFINE(DATADIR_STAFF, "data/staff.bin") -DATADIR_DEFINE(DATADIR_TITLE, "data/title.bin") -DATADIR_DEFINE(DATADIR_W01, "data/w01.bin") -DATADIR_DEFINE(DATADIR_W02, "data/w02.bin") -DATADIR_DEFINE(DATADIR_W03, "data/w03.bin") -DATADIR_DEFINE(DATADIR_W04, "data/w04.bin") -DATADIR_DEFINE(DATADIR_W05, "data/w05.bin") -DATADIR_DEFINE(DATADIR_W06, "data/w06.bin") -DATADIR_DEFINE(DATADIR_W10, "data/w10.bin") -DATADIR_DEFINE(DATADIR_W20, "data/w20.bin") -DATADIR_DEFINE(DATADIR_W21, "data/w21.bin") -DATADIR_DEFINE(DATADIR_WALUIGI, "data/waluigi.bin") -DATADIR_DEFINE(DATADIR_WALUIGIMDL0, "data/waluigimdl0.bin") -DATADIR_DEFINE(DATADIR_WALUIGIMDL1, "data/waluigimdl1.bin") -DATADIR_DEFINE(DATADIR_WALUIGIMOT, "data/waluigimot.bin") -DATADIR_DEFINE(DATADIR_WARIO, "data/wario.bin") -DATADIR_DEFINE(DATADIR_WARIOMDL0, "data/wariomdl0.bin") -DATADIR_DEFINE(DATADIR_WARIOMDL1, "data/wariomdl1.bin") -DATADIR_DEFINE(DATADIR_WARIOMOT, "data/wariomot.bin") -DATADIR_DEFINE(DATADIR_WIN, "data/win.bin") -DATADIR_DEFINE(DATADIR_YOSHI, "data/yoshi.bin") -DATADIR_DEFINE(DATADIR_YOSHIMDL0, "data/yoshimdl0.bin") -DATADIR_DEFINE(DATADIR_YOSHIMDL1, "data/yoshimdl1.bin") -DATADIR_DEFINE(DATADIR_YOSHIMOT, "data/yoshimot.bin") -DATADIR_DEFINE(DATADIR_ZTAR, "data/ztar.bin") \ No newline at end of file +DATADIR_DEFINE(E3SETUP, "data/E3setup.bin") +DATADIR_DEFINE(BBATTLE, "data/bbattle.bin") +DATADIR_DEFINE(BGUEST, "data/bguest.bin") +DATADIR_DEFINE(BKOOPA, "data/bkoopa.bin") +DATADIR_DEFINE(BKOOPASUIT, "data/bkoopasuit.bin") +DATADIR_DEFINE(BKUJIYA, "data/bkujiya.bin") +DATADIR_DEFINE(BLAST5, "data/blast5.bin") +DATADIR_DEFINE(BOARD, "data/board.bin") +DATADIR_DEFINE(BPAUSE, "data/bpause.bin") +DATADIR_DEFINE(BYOKODORI, "data/byokodori.bin") +DATADIR_DEFINE(DAISY, "data/daisy.bin") +DATADIR_DEFINE(DAISYMDL0, "data/daisymdl0.bin") +DATADIR_DEFINE(DAISYMDL1, "data/daisymdl1.bin") +DATADIR_DEFINE(DAISYMOT, "data/daisymot.bin") +DATADIR_DEFINE(DONKEY, "data/donkey.bin") +DATADIR_DEFINE(DONKEYMDL0, "data/donkeymdl0.bin") +DATADIR_DEFINE(DONKEYMDL1, "data/donkeymdl1.bin") +DATADIR_DEFINE(DONKEYMOT, "data/donkeymot.bin") +DATADIR_DEFINE(EFFECT, "data/effect.bin") +DATADIR_DEFINE(GAMEMES, "data/gamemes.bin") +DATADIR_DEFINE(INST, "data/inst.bin") +DATADIR_DEFINE(INSTFONT, "data/instfont.bin") +DATADIR_DEFINE(INSTPIC, "data/instpic.bin") +DATADIR_DEFINE(LUIGI, "data/luigi.bin") +DATADIR_DEFINE(LUIGIMDL0, "data/luigimdl0.bin") +DATADIR_DEFINE(LUIGIMDL1, "data/luigimdl1.bin") +DATADIR_DEFINE(LUIGIMOT, "data/luigimot.bin") +DATADIR_DEFINE(M300, "data/m300.bin") +DATADIR_DEFINE(M302, "data/m302.bin") +DATADIR_DEFINE(M303, "data/m303.bin") +DATADIR_DEFINE(M330, "data/m330.bin") +DATADIR_DEFINE(M333, "data/m333.bin") +DATADIR_DEFINE(M401, "data/m401.bin") +DATADIR_DEFINE(M402, "data/m402.bin") +DATADIR_DEFINE(M403, "data/m403.bin") +DATADIR_DEFINE(M404, "data/m404.bin") +DATADIR_DEFINE(M405, "data/m405.bin") +DATADIR_DEFINE(M406, "data/m406.bin") +DATADIR_DEFINE(M407, "data/m407.bin") +DATADIR_DEFINE(M408, "data/m408.bin") +DATADIR_DEFINE(M409, "data/m409.bin") +DATADIR_DEFINE(M410, "data/m410.bin") +DATADIR_DEFINE(M411, "data/m411.bin") +DATADIR_DEFINE(M412, "data/m412.bin") +DATADIR_DEFINE(M413, "data/m413.bin") +DATADIR_DEFINE(M414, "data/m414.bin") +DATADIR_DEFINE(M415, "data/m415.bin") +DATADIR_DEFINE(M416, "data/m416.bin") +DATADIR_DEFINE(M417, "data/m417.bin") +DATADIR_DEFINE(M418, "data/m418.bin") +DATADIR_DEFINE(M419, "data/m419.bin") +DATADIR_DEFINE(M420, "data/m420.bin") +DATADIR_DEFINE(M421, "data/m421.bin") +DATADIR_DEFINE(M422, "data/m422.bin") +DATADIR_DEFINE(M423, "data/m423.bin") +DATADIR_DEFINE(M424, "data/m424.bin") +DATADIR_DEFINE(M425, "data/m425.bin") +DATADIR_DEFINE(M426, "data/m426.bin") +DATADIR_DEFINE(M427, "data/m427.bin") +DATADIR_DEFINE(M428, "data/m428.bin") +DATADIR_DEFINE(M429, "data/m429.bin") +DATADIR_DEFINE(M430, "data/m430.bin") +DATADIR_DEFINE(M431, "data/m431.bin") +DATADIR_DEFINE(M432, "data/m432.bin") +DATADIR_DEFINE(M433, "data/m433.bin") +DATADIR_DEFINE(M434, "data/m434.bin") +DATADIR_DEFINE(M435, "data/m435.bin") +DATADIR_DEFINE(M436, "data/m436.bin") +DATADIR_DEFINE(M437, "data/m437.bin") +DATADIR_DEFINE(M438, "data/m438.bin") +DATADIR_DEFINE(M439, "data/m439.bin") +DATADIR_DEFINE(M440, "data/m440.bin") +DATADIR_DEFINE(M441, "data/m441.bin") +DATADIR_DEFINE(M442, "data/m442.bin") +DATADIR_DEFINE(M443, "data/m443.bin") +DATADIR_DEFINE(M444, "data/m444.bin") +DATADIR_DEFINE(M445, "data/m445.bin") +DATADIR_DEFINE(M446, "data/m446.bin") +DATADIR_DEFINE(M447, "data/m447.bin") +DATADIR_DEFINE(M448, "data/m448.bin") +DATADIR_DEFINE(M449, "data/m449.bin") +DATADIR_DEFINE(M450, "data/m450.bin") +DATADIR_DEFINE(M451, "data/m451.bin") +DATADIR_DEFINE(M453, "data/m453.bin") +DATADIR_DEFINE(M455, "data/m455.bin") +DATADIR_DEFINE(M456, "data/m456.bin") +DATADIR_DEFINE(M457, "data/m457.bin") +DATADIR_DEFINE(M458, "data/m458.bin") +DATADIR_DEFINE(M459, "data/m459.bin") +DATADIR_DEFINE(M460, "data/m460.bin") +DATADIR_DEFINE(M461, "data/m461.bin") +DATADIR_DEFINE(M462, "data/m462.bin") +DATADIR_DEFINE(MARIO, "data/mario.bin") +DATADIR_DEFINE(MARIOMDL0, "data/mariomdl0.bin") +DATADIR_DEFINE(MARIOMDL1, "data/mariomdl1.bin") +DATADIR_DEFINE(MARIOMOT, "data/mariomot.bin") +DATADIR_DEFINE(MENT, "data/ment.bin") +DATADIR_DEFINE(MGCONST, "data/mgconst.bin") +DATADIR_DEFINE(MGMODE, "data/mgmode.bin") +DATADIR_DEFINE(MODESEL, "data/modesel.bin") +DATADIR_DEFINE(MPEX, "data/mpex.bin") +DATADIR_DEFINE(MSTORY, "data/mstory.bin") +DATADIR_DEFINE(MSTORY2, "data/mstory2.bin") +DATADIR_DEFINE(MSTORY3, "data/mstory3.bin") +DATADIR_DEFINE(MSTORY4, "data/mstory4.bin") +DATADIR_DEFINE(OPTION, "data/option.bin") +DATADIR_DEFINE(PEACH, "data/peach.bin") +DATADIR_DEFINE(PEACHMDL0, "data/peachmdl0.bin") +DATADIR_DEFINE(PEACHMDL1, "data/peachmdl1.bin") +DATADIR_DEFINE(PEACHMOT, "data/peachmot.bin") +DATADIR_DEFINE(PRESENT, "data/present.bin") +DATADIR_DEFINE(RESULT, "data/result.bin") +DATADIR_DEFINE(SAF, "data/saf.bin") +DATADIR_DEFINE(SELMENU, "data/selmenu.bin") +DATADIR_DEFINE(SETUP, "data/setup.bin") +DATADIR_DEFINE(STAFF, "data/staff.bin") +DATADIR_DEFINE(TITLE, "data/title.bin") +DATADIR_DEFINE(W01, "data/w01.bin") +DATADIR_DEFINE(W02, "data/w02.bin") +DATADIR_DEFINE(W03, "data/w03.bin") +DATADIR_DEFINE(W04, "data/w04.bin") +DATADIR_DEFINE(W05, "data/w05.bin") +DATADIR_DEFINE(W06, "data/w06.bin") +DATADIR_DEFINE(W10, "data/w10.bin") +DATADIR_DEFINE(W20, "data/w20.bin") +DATADIR_DEFINE(W21, "data/w21.bin") +DATADIR_DEFINE(WALUIGI, "data/waluigi.bin") +DATADIR_DEFINE(WALUIGIMDL0, "data/waluigimdl0.bin") +DATADIR_DEFINE(WALUIGIMDL1, "data/waluigimdl1.bin") +DATADIR_DEFINE(WALUIGIMOT, "data/waluigimot.bin") +DATADIR_DEFINE(WARIO, "data/wario.bin") +DATADIR_DEFINE(WARIOMDL0, "data/wariomdl0.bin") +DATADIR_DEFINE(WARIOMDL1, "data/wariomdl1.bin") +DATADIR_DEFINE(WARIOMOT, "data/wariomot.bin") +DATADIR_DEFINE(WIN, "data/win.bin") +DATADIR_DEFINE(YOSHI, "data/yoshi.bin") +DATADIR_DEFINE(YOSHIMDL0, "data/yoshimdl0.bin") +DATADIR_DEFINE(YOSHIMDL1, "data/yoshimdl1.bin") +DATADIR_DEFINE(YOSHIMOT, "data/yoshimot.bin") +DATADIR_DEFINE(ZTAR, "data/ztar.bin") \ No newline at end of file diff --git a/include/game/board/audio.h b/include/game/board/audio.h new file mode 100755 index 00000000..a3b617b9 --- /dev/null +++ b/include/game/board/audio.h @@ -0,0 +1,19 @@ +#ifndef _BOARD_AUDIO_H +#define _BOARD_AUDIO_H + +#include "dolphin/types.h" + +void BoardMusStartBoard(void); +void BoardMusStart(s32 arg0, s32 arg1, s8 arg2, u16 arg3); +void BoardAudSeqFadeOutFast(s32 arg0); +void BoardAudSeqFadeOut(s32 arg0, u16 arg1); +void BoardMusLoudSet(s32 arg0, s32 arg1); +void BoardMusVolPanSet(s32 arg0, s8 arg1, u16 arg2); +void BoardAudSeqPause(s32 arg0, s32 arg1, u16 arg2); +s32 BoardMusStatusGet(s32 arg0); +void BoardAudSeqClear(void); +void BoardAudSeqFadeOutAll(void); +void BoardAudFXPlay(void); +void BoardAudFXStop(void); + +#endif diff --git a/include/game/board/boo.h b/include/game/board/boo.h new file mode 100755 index 00000000..39c7d971 --- /dev/null +++ b/include/game/board/boo.h @@ -0,0 +1,18 @@ +#ifndef _BOARD_BOO_H +#define _BOARD_BOO_H + +#include "dolphin.h" +#include "game/object.h" + +s16 BoardBooCreate(s32 arg0, Vec *arg1); +void BoardBooKill(void); +s32 BoardBooStealTypeSet(s32 arg0); +s32 BoardBooStealMain(void); +BOOL CheckBallCoinDone(void); +void TakeBallStar(void); +void ExecTakeBallStar(omObjData *arg0); +BOOL CheckTakeBallStarDone(void); +s32 BoardBooStealValueGet(s16 *arg0, s16 *arg1); +BOOL BoardBooStealLightCheck(void); + +#endif diff --git a/include/game/board/com.h b/include/game/board/com.h new file mode 100755 index 00000000..a75d35ab --- /dev/null +++ b/include/game/board/com.h @@ -0,0 +1,19 @@ +#ifndef _BOARD_COM_H +#define _BOARD_COM_H + +#include "dolphin.h" + +void BoardComKeySetLeft(void); +void BoardComKeySetRight(void); +void BoardComKeySetUp(void); +void BoardComKeySetDown(void); +s8 BoardComPreferItemGet(s32 arg0, s8 *arg1, s8 arg2); +s8 BoardComPreferItemCheck(s32 arg0, s8 arg1, s8 arg2, s8 arg3); +s32 BoardComItemWeightGet(s32 arg0, s32 arg1); +s32 BoardComTutorialItemGet(s32 arg0); +s32 BoardComUseItemSet(s32 arg0, s32 arg1); +BOOL BoardComUseItemCheck(s32 arg0); +s32 BoardComJunctionInputGet(s32 arg0, Vec *arg1, s32 arg2, float *arg3); +s32 BoardComBestPlayerFind(void); + +#endif diff --git a/include/game/board/com_path.h b/include/game/board/com_path.h new file mode 100755 index 00000000..2fa6e313 --- /dev/null +++ b/include/game/board/com_path.h @@ -0,0 +1,11 @@ +#ifndef _BOARD_COM_PATH_H +#define _BOARD_COM_PATH_H + +#include "dolphin/types.h" + +s16 BoardComPathReachCheck(s16 arg0, u32 arg1, s32 arg2); +s16 BoardComPathBestGet(s16 arg0); +s16 BoardComPathLenGet(s16 arg0, s16 arg1); +s16 BoardComPathW20BestGet(s16 arg0, u32 arg1, s16 arg2); + +#endif diff --git a/include/game/board/item.h b/include/game/board/item.h new file mode 100755 index 00000000..4ede4953 --- /dev/null +++ b/include/game/board/item.h @@ -0,0 +1,11 @@ +#ifndef _BOARD_ITEM_H +#define _BOARD_ITEM_H + +#include "dolphin/types.h" + +void BoardItemStart(s32 arg0, s32 arg1); +BOOL BoardItemDoneCheck(void); +void BoardItemPlayerRestore(s32 arg0, s32 arg1); +void BoardItemBagItemSet(s16 *arg0); + +#endif diff --git a/include/game/board/main.h b/include/game/board/main.h index 0a6d7c19..b58a40d1 100644 --- a/include/game/board/main.h +++ b/include/game/board/main.h @@ -77,6 +77,8 @@ typedef void (*BoardCameraPosCalcFunc)(BoardCameraData *camera); typedef void (*BoardTurnStartHook)(s32 player, s32 space); extern BoardTurnStartHook boardTurnStartFunc; +extern void (*boardStarShowNextHook)(void); +extern void (*boardStarGiveHook)(void); extern BoardFunc boardTurnFunc; extern BoardLightHook boardLightResetHook; extern BoardLightHook boardLightSetHook; @@ -87,8 +89,8 @@ s32 BoardIsKill(void); void BoardPauseDisableSet(s32 value); s32 BoardPauseDisableGet(); void BoardSaveInit(s32 board); -void BoardStoryConfigSet(s32 mg_type, s32 diff_story); -void BoardPartyConfigSet(s32 team, s32 bonus_star, s32 mg_type, s32 max_turn, s32 p1_handicap, s32 p2_handicap, s32 p3_handicap, s32 p4_handicap); +void BoardStoryConfigSet(s32 mg_list, s32 diff_story); +void BoardPartyConfigSet(s32 team, s32 bonus_star, s32 mg_list, s32 max_turn, s32 p1_handicap, s32 p2_handicap, s32 p3_handicap, s32 p4_handicap); s32 BoardTurnNext(void); void BoardNextOvlSet(OverlayID overlay); s32 BoardStartCheck(void); diff --git a/include/game/board/model.h b/include/game/board/model.h index 31f0577b..479194e6 100644 --- a/include/game/board/model.h +++ b/include/game/board/model.h @@ -34,8 +34,19 @@ s32 BoardModelAmbSet(s16 model, float r, float g, float b); s32 BoardModelExistCheck(s16 model, s32 arg1); s32 BoardModelExistDupe(s16 model, s32 arg1); s32 fn_8006DDE8(s16 model, float arg1); +s32 BoardModelMotionCreate(s16 model, s32 data_num); +s32 BoardModelMotionKill(s16 model, s32 motion); +s32 BoardModelMotionStartEndSet(s16 model, s16 start, s16 end); s32 BoardModelMotionStart(s16 model, s32 slot, u32 attr); +s32 BoardModelMotionShiftSet(s16 model, s32 motion, float time, float shift_time, u32 attr); +s32 BoardModelAttrSet(s16 model, u32 attr); +s32 BoardModelMotionTimeSet(s16 model, float time); +float BoardModelMotionTimeGet(s16 model); +float BoardModelMotionMaxTimeGet(s16 model); s32 BoardModelMotionSpeedSet(s16 model, float speed); +s32 BoardModelMotionEndCheck(s16 model); +s32 BoardModelAlphaSet(s16 model, u8 alpha); +s32 BoardModelRotYSet(s16 model, float rot); s32 BoardModelPosSet(s16 model, float x, float y, float z); s32 BoardModelPosSetV(s16 model, Vec *pos); s32 BoardModelRotSet(s16 model, float x, float y, float z); diff --git a/include/game/board/pause.h b/include/game/board/pause.h new file mode 100755 index 00000000..b851e7f7 --- /dev/null +++ b/include/game/board/pause.h @@ -0,0 +1,10 @@ +#ifndef _BOARD_PAUSE_H +#define _BOARD_PAUSE_H + +#include "dolphin/types.h" + +void BoardPauseStart(void); +BOOL BoardPauseActiveCheck(void); +BOOL BoardPauseReqCheck(void); + +#endif diff --git a/include/game/board/player.h b/include/game/board/player.h index 4d75f4e4..0bf9e1d8 100644 --- a/include/game/board/player.h +++ b/include/game/board/player.h @@ -139,6 +139,7 @@ void BoardPlayerAutoSizeSet(s32, s32); void BoardPlayerCopyMat(s32); void BoardBowserSuitKill(s32); void SetRollPlayerSize(s32); +void BoardDiceDigit2DInit(s32, s32); void BoardDiceDigit2DUpdateEnable(s32); s32 DoSparkSpace(s32, s16*); s32 MegaPlayerPassFunc(s32, s16); diff --git a/include/game/board/roll.h b/include/game/board/roll.h new file mode 100755 index 00000000..7b801c28 --- /dev/null +++ b/include/game/board/roll.h @@ -0,0 +1,18 @@ +#ifndef _BOARD_ROLL_H +#define _BOARD_ROLL_H + +#include "dolphin/types.h" + +s32 BoardRollExec(s32 arg0); +void BoardRollKill(void); +void BoardRollUPauseSet(s32 arg0); +void BoardRollWinDispSet(s32 arg0); +s16 BoardDiceEffectCreate(void); +void BoardDicePauseAll(void); +BOOL BoardDiceDoneCheck(void); +void BoardDiceStop(s32 arg0); +void BoardDiceVisibleSet(s32 arg0, s32 arg1); +void BoardDiceValueSet(s32 arg0, s32 arg1); +void BoardRollTutorialSet(s16 *arg0); + +#endif diff --git a/include/game/board/space.h b/include/game/board/space.h index a4e68b27..44dc791f 100644 --- a/include/game/board/space.h +++ b/include/game/board/space.h @@ -53,4 +53,6 @@ s32 BoardSpaceStarCheck(s32 index); void BoardSpaceLandExec(s32 player, s32 space); void BoardSpaceBlockPosSet(void); +extern s16 boardSpaceStarTbl[8]; + #endif diff --git a/include/game/board/star.h b/include/game/board/star.h new file mode 100755 index 00000000..5adc2211 --- /dev/null +++ b/include/game/board/star.h @@ -0,0 +1,14 @@ +#ifndef _BOARD_START_H +#define _BOARD_START_H + +#include "game/board/space.h" + +#include "dolphin.h" + +void BoardStarHostSet(s16 arg0); +s16 BoardStarHostMdlGet(void); +void BoardStarExec(s32 arg0, BoardSpace *arg1); +void BoardStarGive(s32 arg0, Vec *arg1); +void BoardStarShowNext(s32 arg0); + +#endif diff --git a/include/game/board/tutorial.h b/include/game/board/tutorial.h new file mode 100755 index 00000000..3b63c2ae --- /dev/null +++ b/include/game/board/tutorial.h @@ -0,0 +1,29 @@ +#ifndef _BOARD_TUTORIAL_H +#define _BOARD_TUTORIAL_H + +#include "dolphin/types.h" + +void BoardTutorialInit(void); +void BoardTutorialKill(void); +void BoardTutorialHookSet(void *arg0); +void BoardTutorialHookExec(s16 arg0, s32 arg1); +void BoardTutorialPlayerInit(void); +void BoardTutorialWorkSave(void); +void BoardTutorialWorkRestore(void); +void BoardTutorialDirInputSet(s8 arg0, s8 arg1, s16 arg2); +void BoardTutorialBlockSetPos(s32 arg0, s8 arg1); +void BoardTutorialItemSet(s8 arg0); +void BoardTutorialHostSet(s16 arg0); +void BoardTutorialHostHide(s8 arg0); + +extern s32 boardTutorialData[4]; +extern s8 boardTutorialDirInputX; +extern s8 boardTutorialDirInputY; +extern s16 boardTutorialDirInputTime; +extern s32 boardTutorialBlockPos; +extern s8 boardTutorialBlockItem; +extern s8 boardTutorialBlockF; +extern s8 boardTutorialUseItem; +extern s8 boardTutorialF; + +#endif diff --git a/include/game/board/ui.h b/include/game/board/ui.h index ba99e7e1..ccf6d01f 100755 --- a/include/game/board/ui.h +++ b/include/game/board/ui.h @@ -28,9 +28,12 @@ void BoardPickerBackFlagSet(s32 arg0); BOOL BoardPickerDoneCheck(void); s32 BoardPickerPosGet(Vec *arg0); s32 BoardPickerChoiceGet(void); +void BoardYourTurnExec(s32 arg0); s32 BoardItemUseExec(s32 arg0); void BoardMakeRandomItem(void); void BoardItemGetDestPos(s32 arg0, Vec *arg1); void BoardItemStatusKill(s32 arg0); +extern s8 boardItemUser; + #endif diff --git a/include/game/board/view.h b/include/game/board/view.h new file mode 100755 index 00000000..456cfd14 --- /dev/null +++ b/include/game/board/view.h @@ -0,0 +1,15 @@ +#ifndef _BOARD_VIEW_H +#define _BOARD_VIEW_H + +#include "dolphin.h" + +void BoardViewOverheadExec(s32 arg0); +void BoardViewFocusGetPos(Vec *arg0); +void BoardViewFocusSet(Vec *arg0, u16 arg1); +void BoardViewMoveStart(Vec *arg0, Vec *arg1, u16 arg2); +BOOL BoardViewMoveCheck(void); +void BoardViewMoveEnd(void); +void BoardViewWait(void); +void BoardViewMapExec(s32 arg0); + +#endif diff --git a/include/game/board/window.h b/include/game/board/window.h index 6a307621..2792395a 100644 --- a/include/game/board/window.h +++ b/include/game/board/window.h @@ -12,6 +12,7 @@ void BoardWinKillAll(void); void BoardWinDestroy(void); void BoardWinProc(void); int BoardWinChoiceGet(void); +void BoardWinPause(void); void BoardWinCreateChoice(s32 pos, u32 mess, s32 portrait, s32 choice); void BoardWinCreate(s32 pos, u32 mess, s32 portrait); void BoardWinInsertMesSet(u32 value, s32 index); diff --git a/include/game/chrman.h b/include/game/chrman.h new file mode 100755 index 00000000..05f5033d --- /dev/null +++ b/include/game/chrman.h @@ -0,0 +1,47 @@ +#ifndef _GAME_CHRMAN_H +#define _GAME_CHRMAN_H + +#include "dolphin.h" + +void CharManInit(void); +void *CharAMemPtrGet(s16 character); +void CharARAMOpen(s16 character); +void CharARAMClose(s16 character); +void CharKill(s16 arg0); +void CharKillAll(void); +s16 CharModelCreate(s16 character, s16 lod); +s16 CharModelMotionCreate(s16 character, s32 arg1); +void CharModelMotionIndexSet(s16 character, s16 arg1, s32 arg2); +void CharModelMotionKill(s16 character, u32 motion); +void CharModelMotionDataClose(s16 character); +void CharModelDataClose(s16 arg0); +void CharModelKill(s16 character); +void CharModelMotionSet(s16 character, s16 motion); +void CharModelTexAnimSet(s16 character); +char **CharModelTexNameGet(s16 arg0, s16 arg1); +char *CharModelHookNameGet(s16 arg0, s16 arg1, s16 arg2); +void CharModelMotionTimeSet(s16 character, float time); +float CharModelMotionTimeGet(s16 character); +float CharModelMotionMaxTimeGet(s16 character); +s32 CharModelMotionEndCheck(s16 character); +s16 CharModelMotionShiftIDGet(s16 character); +void CharModelMotionShiftSet(s16 character, s16 motion, float time, float shift_time, u32 attr); +float CharModelMotionShiftTimeGet(s16 character); +void CharModelMotionSpeedSet(s16 character, float speed); +void CharModelLayerSetAll(s16 arg0); +void CharModelItemHookCreate(s16 character, char *arg1); +void CharModelEffectCreate(s16 arg0, Vec *arg1); +void CharModelCoinEffectCreate(s16 arg0, Vec *arg1); +void fn_8004EC74(s16 character); +void fn_8004EDA4(s16 arg0, Vec *arg1, Vec *arg2); +void fn_8004F058(s16 character); +void fn_8004F13C(s16 arg0, Vec *arg1, Vec *arg2); +void CharModelLayerSetAll2(s16 arg0); +void CharModelVoiceEnableSet(s16 character, s16 motion, s32 flag); +void fn_8004F52C(s16 character, s32 arg1); +void CharModelEffectEnableSet(s16 character, s32 arg1); +s32 CharModelEffectNpcInit(s16 arg0, s16 arg1, s16 arg2, s16 arg3); +s32 CharModelEffectNpcInitSilent(s16 arg0, s16 arg1, s16 arg2); +void CharModelStepTypeSet(s16 character, s32 arg1); + +#endif diff --git a/include/game/data.h b/include/game/data.h index 612f11fb..889a931c 100644 --- a/include/game/data.h +++ b/include/game/data.h @@ -3,6 +3,8 @@ #include "game/dvd.h" +#include "datadir_enum.h" + #define DATA_DECODE_NONE 0 #define DATA_DECODE_LZ 1 #define DATA_DECODE_SLIDE 2 @@ -10,21 +12,10 @@ #define DATA_DECODE_FSLIDE 4 #define DATA_DECODE_RLE 5 -#define MAKE_DATA_NUM(dir, file) (((dir) << 16)+(file)) -#define MAKE_DIR_NUM(dir) ((dir) << 16) - #define DATA_NUM_LISTEND -1 #include "dolphin/types.h" -#define DATADIR_DEFINE(name, path) name, - -typedef enum { - #include "datadir_table.h" - DATADIR_COUNT -} DataDirID; - -#undef DATADIR_DEFINE typedef struct data_read_stat { s32 dir_id; diff --git a/include/game/fault.h b/include/game/fault.h new file mode 100644 index 00000000..bd2777ac --- /dev/null +++ b/include/game/fault.h @@ -0,0 +1,9 @@ +#ifndef _GAME_FAULT_H +#define _GAME_FAULT_H + +#include "game/gamework_data.h" + +void HuFaultInitXfbDirectDraw(GXRenderModeObj *mode); +void HuFaultSetXfbAddress(s16 index, void* value); + +#endif diff --git a/include/game/flag.h b/include/game/flag.h index 159a959d..c2590c7c 100644 --- a/include/game/flag.h +++ b/include/game/flag.h @@ -1,6 +1,8 @@ #ifndef _GAME_FLAG_H #define _GAME_FLAG_H +#include "dolphin/types.h" + #define FLAG_ID_MAKE(group, index) (((group) << 16)|(index)) s32 _CheckFlag(u32 flag); diff --git a/include/game/gamework_data.h b/include/game/gamework_data.h index 529f9439..c0333d13 100644 --- a/include/game/gamework_data.h +++ b/include/game/gamework_data.h @@ -21,7 +21,7 @@ typedef struct system_state { u16 bonus_star : 1; u16 explain_mg : 1; u16 show_com_mg : 1; - u16 mg_type : 2; + u16 mg_list : 2; u16 mess_speed : 2; u16 save_mode : 2; }; @@ -45,7 +45,7 @@ typedef struct system_state { }; /* 0x32 */ s8 unk_32; /* 0x34 */ u16 mg_next; -/* 0x36 */ s16 mg_next_extra; +/* 0x36 */ s16 mg_next_type; /* 0x38 */ u16 unk_38; /* 0x3A */ u8 flag[3][16]; /* 0x6A */ u8 unk_6A[0x72]; @@ -152,14 +152,34 @@ static inline s32 GWTeamGet(void) return GWSystem.team; } +static inline s32 GWPartyGet(void) +{ + return GWSystem.party; +} + static inline s32 GWLanguageGet(void) { return GWGameStat.language; } -static inline s32 GWMGTypeGet(void) +static inline s32 GWRumbleGet(void) { - return GWSystem.mg_type; + return GWGameStat.rumble; +} + +static inline s32 GWMGExplainGet(void) +{ + return GWSystem.explain_mg; +} + +static inline s32 GWMGShowComGet(void) +{ + return GWSystem.show_com_mg; +} + +static inline s32 GWMGListGet(void) +{ + return GWSystem.mg_list; } static inline s32 GWMessSpeedGet(void) @@ -167,6 +187,11 @@ static inline s32 GWMessSpeedGet(void) return GWSystem.mess_speed; } +static inline s32 GWTurnGet(void) +{ + return GWSystem.turn; +} + static inline s32 GWBoardGet(void) { return GWSystem.board; @@ -177,4 +202,9 @@ static inline s32 GWPlayerTeamGet(s32 player) return GWPlayer[player].team; } +static inline s32 GWPlayerSpaceCurrGet(s32 player) +{ + return GWPlayer[player].space_curr; +} + #endif diff --git a/include/game/hsfanim.h b/include/game/hsfanim.h index 46c41f0a..9070e984 100644 --- a/include/game/hsfanim.h +++ b/include/game/hsfanim.h @@ -29,7 +29,9 @@ typedef struct { typedef struct particle_data { /* 0x00 */ s16 unk_00; /* 0x02 */ s16 unk_02; - /* 0x04 */ char unk_04[0x1C]; + /* 0x04 */ float unk_04; + /* 0x08 */ char unk_08[0x14]; + /* 0x1C */ void *unk_1C; /* 0x20 */ s16 unk_20; /* 0x22 */ s16 unk_22; /* 0x24 */ float unk_24; @@ -39,7 +41,7 @@ typedef struct particle_data { /* 0x2E */ char unk_2E[2]; /* 0x30 */ s16 unk_30; /* 0x32 */ char unk_32[2]; - /* 0x34 */ s32 unk_34; + /* 0x34 */ u32 unk_34; /* 0x38 */ s32 unk_38; /* 0x3C */ u32 unk_3C; /* 0x40 */ s32 unk_40; @@ -115,6 +117,7 @@ void Hu3DParticleZRotSet(s16 arg0, float arg1); void Hu3DParticleColSet(s16 arg0, u8 arg1, u8 arg2, u8 arg3); void Hu3DParticleTPLvlSet(s16 arg0, float arg1); void Hu3DParticleBlendModeSet(s16 arg0, u8 arg1); +void Hu3DParticleHookSet(s16 arg0, void *arg1); void Hu3DParticleAttrSet(s16 arg0, u8 arg1); void Hu3DParticleAttrReset(s16 arg0, u8 arg1); void Hu3DParticleAnimModeSet(s16 arg0, s16 arg1); diff --git a/include/game/hsfdraw.h b/include/game/hsfdraw.h index 7ece73ec..76d17f20 100755 --- a/include/game/hsfdraw.h +++ b/include/game/hsfdraw.h @@ -49,6 +49,8 @@ HsfObject *Hu3DObjDuplicate(HsfData *arg0, u32 arg1); void Hu3DModelObjDrawInit(void); void Hu3DModelObjDraw(s16 arg0, char *arg1, Mtx arg2); +extern Vec PGMaxPos; +extern Vec PGMinPos; extern u32 totalPolyCnt; extern u32 totalPolyCnted; extern u32 totalMatCnt; diff --git a/include/game/hsfformat.h b/include/game/hsfformat.h index d3104319..7d1e4f79 100644 --- a/include/game/hsfformat.h +++ b/include/game/hsfformat.h @@ -145,20 +145,16 @@ typedef struct hsf_vertex_buf { void *data; } HsfBuffer; -typedef struct hsf_tristrip { - u16 data[4]; -} HsfTristrip; - typedef struct hsf_face { - u16 type; - u16 mat; - u16 indices[12]; + s16 type; + s16 mat; union { struct { + s16 indices[3][4]; u32 count; - HsfTristrip *data; + s16 *data; } strip; - u16 ext_indices[4]; + s16 indices[4][4]; }; float nbt[3]; } HsfFace; @@ -290,7 +286,7 @@ typedef struct hsf_object_data { HsfBuffer **vertexShape; u32 clusterCnt; HsfCluster **cluster; - u32 hook; + u32 cenvCnt; HsfCenv *cenv; void *file[2]; } HsfObjectData; @@ -378,7 +374,7 @@ typedef struct hsf_map_attr { float minZ; float maxX; float maxZ; - s16 *data; + u16 *data; u32 dataLen; } HsfMapAttr; diff --git a/include/game/hsfman.h b/include/game/hsfman.h index d967a058..b0481822 100644 --- a/include/game/hsfman.h +++ b/include/game/hsfman.h @@ -135,6 +135,7 @@ void Hu3DNoSyncSet(s32); s16 Hu3DModelCreate(void *); s16 Hu3DModelLink(s16); s16 Hu3DHookFuncCreate(ModelHookFunc); +void Hu3DModelKill(s16); void Hu3DModelAllKill(void); void Hu3DModelPosSet(s16, f32, f32, f32); void Hu3DModelPosSetV(s16, Vec *); @@ -221,7 +222,7 @@ void Hu3DShadowSizeSet(u16); void Hu3DShadowExec(void); s16 Hu3DProjectionCreate(void*, f32, f32, f32); void Hu3DProjectionKill(s16); -void Hu3DProjectionPosSet(s16, Vec, Vec, Vec); +void Hu3DProjectionPosSet(s16, Vec*, Vec*, Vec*); void Hu3DProjectionTPLvlSet(s16, f32); void Hu3DMipMapSet(char*, s16, s32, f32); diff --git a/include/game/mapspace.h b/include/game/mapspace.h new file mode 100755 index 00000000..d1e3fc59 --- /dev/null +++ b/include/game/mapspace.h @@ -0,0 +1,17 @@ +#ifndef _GAME_MAPSPACE_H +#define _GAME_MAPSPACE_H + +#include "game/hsfformat.h" +#include "game/object.h" + +#include "dolphin.h" + +void MapWall(float arg0, float arg1, float arg2, float arg3); +void MapWallCheck(float *arg0, float *arg1, HsfMapAttr *arg2); +float MapPos(float arg0, float arg1, float arg2, float arg3, Vec *arg4); +BOOL Hitcheck_Triangle_with_Sphere(Vec *arg0, Vec *arg1, float arg2, Vec *arg3); +BOOL Hitcheck_Quadrangle_with_Sphere(Vec *arg0, Vec *arg1, float arg2, Vec *arg3); +void AppendAddXZ(float arg0, float arg1, float arg2); +void CharRotInv(Mtx arg0, Mtx arg1, Vec *arg2, omObjData *arg3); + +#endif diff --git a/include/game/minigame_seq.h b/include/game/minigame_seq.h new file mode 100644 index 00000000..95a04e6e --- /dev/null +++ b/include/game/minigame_seq.h @@ -0,0 +1,21 @@ +#ifndef _GAME_MINIGAME_SEQ_H +#define _GAME_MINIGAME_SEQ_H + +#include "game/object.h" + +void MGSeqInit(void); +void MGSeqMain(void); +s16 MGSeqCreate(s16 type, ...); +u8 MGSeqStatGet(s16 id); +void MGSeqPosSet(s16 id, float x, float y); +void MGSeqParamSet(s16 id, s16 param1, s16 param2); +void MGSeqKill(s16 id); +void MGSeqKillAll(void); +s32 MGSeqDoneCheck(void); +void MGSeqStub(void); +void MGSeqPauseInit(void); +void MGSeqPauseEnableCtrl(s32 flag); +void MGSeqPracticeInit(void); +void MGSeqPracticeExitCheck(omObjData *object); + +#endif diff --git a/include/game/msm.h b/include/game/msm.h index 07df3881..75f35f19 100644 --- a/include/game/msm.h +++ b/include/game/msm.h @@ -35,6 +35,21 @@ typedef struct { /* 0x0C */ float backSurDis; } UnkMsmStruct_02; // Size (min: 0x10, max: 0x1C) +typedef struct { + /* 0x00 */ s32 unk00; + /* 0x04 */ s8 unk04; + /* 0x05 */ s8 unk05; + /* 0x06 */ u16 unk06; +} UnkMsmStruct_03; // Size unknown (min: 8, max: 0x10) + +typedef struct { + /* 0x00 */ s32 unk00; + /* 0x04 */ char unk04[1]; + /* 0x05 */ s8 unk05; + /* 0x06 */ u16 unk06; + /* 0x08 */ char unk08[1]; +} UnkMsmStruct_04; // Size unknown (min: 9, max: 0x18) + void msmSysRegularProc(void); void msmSysSetOutputMode(s32 arg0); void msmSysSetAux(s32 arg0, s32 arg1); @@ -49,9 +64,10 @@ s32 msmMusGetNumPlay(s32 arg0); s32 msmMusGetStatus(s32 arg0); void msmMusPauseAll(s32 arg0, s32 arg1); void msmMusPause(s32 arg0, s32 arg1, s32 arg2); +void msmMusSetParam(s16 arg0, UnkMsmStruct_04 *arg1); void msmMusStopAll(s32 arg0, s32 arg1); void msmMusStop(s32 arg0, s32 arg1); -s32 msmMusPlay(s32 arg0, s32 arg1); +s32 msmMusPlay(s32 arg0, UnkMsmStruct_03 *arg1); void msmSeDelListener(void); void msmSeUpdataListener(s32 arg0, s32 arg1); void msmSeSetListener(Vec* arg0, Vec* arg1, float arg2, float arg3, UnkMsmStruct_02 *arg4); diff --git a/include/game/object.h b/include/game/object.h index a175d01d..ecc9c99e 100644 --- a/include/game/object.h +++ b/include/game/object.h @@ -5,6 +5,8 @@ #include "game/process.h" #include "game/dvd.h" +#define OM_DLL_MAX 20 + #define OVL_DEFINE(name, path) name, typedef enum { @@ -51,10 +53,17 @@ typedef struct om_obj_data { /* 0x40 */ s16 *model; /* 0x44 */ u16 mtncnt; /* 0x48 */ s16 *motion; -/* 0x4C */ int work[4]; +/* 0x4C */ u32 work[4]; /* 0x5C */ void *data; } omObjData; +typedef struct om_dll_data { + char *name; + OSModuleHeader *module; + void *bss; + s32 ret; +} omDllData; + void omMasterInit(int prio, FileListEntry *ovl_list, int ovl_count, OverlayID start_ovl); void omOvlCallEx(OverlayID overlay, s16 arg2, int event, int stat); void omOvlGotoEx(OverlayID overlay, s16 arg2, int event, int stat); @@ -83,10 +92,16 @@ OverlayID omCurrentOvlGet(void); void omDLLDBGOut(void); void omDLLInit(FileListEntry *ovl_list); -int omDLLStart(s16 ovl, s16 dll); -void omDLLNumEnd(s16 ovl, s16 arg2); +int omDLLStart(s16 overlay, s16 flag); +void omDLLNumEnd(s16 overlay, s16 flag); +void omDLLEnd(s16 dllno, s16 flag); +omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag); +void omDLLUnlink(omDllData *dll_ptr, s16 flag); +s32 omDLLSearch(s16 overlay); +void omDLLInfoDump(OSModuleInfo *module); +void omDLLHeaderDump(OSModuleHeader *module); -void omSysPauseEnable(BOOL flag); +void omSysPauseEnable(u8 flag); void omSystemKeyCheckSetup(Process *objman_process); @@ -102,7 +117,9 @@ extern int omovlstat; extern char omUPauseFlag; extern s16 omSysExitReq; extern s16 omdispinfo; -extern char omSysPauseEnableFlag; +extern u8 omSysPauseEnableFlag; extern OverlayID omprevovl; +extern omDllData *omDLLinfoTbl[OM_DLL_MAX]; + #endif \ No newline at end of file diff --git a/include/game/objsub.h b/include/game/objsub.h new file mode 100644 index 00000000..c83ecd03 --- /dev/null +++ b/include/game/objsub.h @@ -0,0 +1,43 @@ +#ifndef _GAME_OBJSUB_H +#define _GAME_OBJSUB_H + +#include "dolphin.h" +#include "game/process.h" +#include "game/gamework_data.h" + +typedef struct mg_info { + u16 ovl; + u8 type; + u8 flag; + u8 record_idx; + u32 name_mess; + u32 data_dir; + u32 inst_pic[3]; + u32 mg_pic[3]; + u32 rules_mess; + u32 control_mess[2]; + u32 advice_mess; +} MgInfo; + +s32 omMgIndexGet(s16 overlay); +void omGameSysInit(Process *objman); +void omVibrate(s16 player_cfg_index, s16 duration, s16 off, s16 on); + + +extern s16 mgTypeCurr; +extern s16 mgBattleStar[4]; +extern s16 mgBattleStarMax; +extern u8 lbl_801D3E94; +extern s32 mgRecordExtra; +extern s32 mgQuitExtraF; +extern s32 mgPracticeEnableF; +extern s32 mgInstExitEnableF; +extern u8 mgBoardHostEnableF; + +extern s16 mgTicTacToeGrid[3][3]; +extern u8 mgIndexList[256]; +extern GameStat mgGameStatBackup; + +extern MgInfo mgInfoTbl[]; + +#endif diff --git a/include/game/pad.h b/include/game/pad.h index a771d2c2..2223f0b4 100644 --- a/include/game/pad.h +++ b/include/game/pad.h @@ -22,7 +22,7 @@ extern u8 HuPadDStkRep[4]; extern s8 HuPadErr[4]; extern u16 _PadBtn[4]; extern u16 _PadBtnDown[4]; -extern u32 VCounter; +extern s32 VCounter; void HuPadInit(void); void HuPadRead(void); diff --git a/include/game/saveload.h b/include/game/saveload.h index 10b3af30..d75df8af 100644 --- a/include/game/saveload.h +++ b/include/game/saveload.h @@ -2,18 +2,41 @@ #define _GAME_SAVELOAD_H #include "dolphin.h" +#include "game/gamework_data.h" -s32 SLFileOpen(char *arg0); -s32 SLFileCreate(char *arg0, u32 arg1, void *arg2); -s32 SLFileWrite(s32 arg0, void *arg1); -s32 SLFileRead(s32 arg0, void *arg1); +#define SAVE_BUF_SIZE 16384 + +typedef struct save_buf_data { + u8 comment[CARD_COMMENT_SIZE]; + u8 banner[CARD_BANNER_WIDTH*CARD_BANNER_HEIGHT]; + u8 bannerTlut[512]; + u8 icon[CARD_ICON_WIDTH*CARD_ICON_HEIGHT*4]; + u8 iconTlut[512]; + GameStat stat; + SystemState system; + PlayerState player[4]; + SystemState systemBackup; + PlayerState playerBackup[4]; +} SaveBufData; + +typedef union save_buf_all { + SaveBufData data; + u8 ATTRIBUTE_ALIGN(32) buf[SAVE_BUF_SIZE]; +} SaveBufAll; + +extern SaveBufAll saveBuf; + +s32 SLFileOpen(char *fileName); +s32 SLFileCreate(char *fileName, u32 size, void *addr); +s32 SLFileWrite(s32 length, void *addr); +s32 SLFileRead(s32 length, void *addr); s32 SLFileClose(void); -void SLCurSlotNoSet(s16 arg0); -void SLCurBoxNoSet(s8 arg0); -void SLSaveFlagSet(s32 arg0); +void SLCurSlotNoSet(s16 slotno); +void SLCurBoxNoSet(s8 boxno); +void SLSaveFlagSet(s32 flag); s32 SLSaveFlagGet(void); -void SLSaveDataMake(s32 arg0, OSTime *arg1); -void SLSaveDataInfoSet(OSTime *arg0); +void SLSaveDataMake(s32 erase, OSTime *time); +void SLSaveDataInfoSet(OSTime *time); void SLCommonSet(void); void SLSaveBoard(void); void SLSaveBoardBackup(void); @@ -27,9 +50,9 @@ BOOL SLSerialNoCheck(void); BOOL SLCheckSumCheck(void); u16 SLCheckSumGet(void); void SLCheckSumSet(void); -s32 SLStatSet(s32 arg0); -s32 SLCardMount(s16 arg0); -s32 SLFormat(s16 arg0); -s16 SLMessOut(s16 arg0); +s32 SLStatSet(s32 reportF); +s32 SLCardMount(s16 slotNo); +s32 SLFormat(s16 slotNo); +s16 SLMessOut(s16 mess); #endif diff --git a/include/game/sprite.h b/include/game/sprite.h index 9a9d27f8..946bf244 100644 --- a/include/game/sprite.h +++ b/include/game/sprite.h @@ -14,7 +14,7 @@ #define SPRITE_ATTR_PAUSED 0x1 #define SPRITE_ATTR_LOOP 0x2 #define SPRITE_ATTR_HIDDEN 0x4 -#define SPIRTE_ATTR_BILINEAR 0x8 +#define SPRITE_ATTR_BILINEAR 0x8 #define SPRITE_ATTR_FUNC 0x10 #define SPRITE_ATTR_NOPAUSE 0x20 #define SPRITE_ATTR_REVERSE 0x40 diff --git a/include/game/thpmain.h b/include/game/thpmain.h index b0d5b0d1..13fb8e2c 100644 --- a/include/game/thpmain.h +++ b/include/game/thpmain.h @@ -2,6 +2,8 @@ #define _GAME_THPMAIN_H #include "dolphin/types.h" +#include "game/process.h" + s16 HuTHPSprCreateVol(char *path, s16 loop, s16 prio, float volume); s16 HuTHPSprCreate(char *path, s16 loop, s16 prio); @@ -15,4 +17,7 @@ s32 HuTHPFrameGet(void); s32 HuTHPTotalFrameGet(void); void HuTHPSetVolume(s32 left, s32 right); +extern Process *THPProc; + + #endif \ No newline at end of file diff --git a/include/game/window.h b/include/game/window.h index bf0f81d1..aec4a429 100644 --- a/include/game/window.h +++ b/include/game/window.h @@ -95,7 +95,7 @@ void HuWinScissorSet(s16 window, s16 x, s16 y, s16 w, s16 h); void HuWinPriSet(s16 window, s16 prio); void HuWinAttrSet(s16 window, u32 attr); void HuWinAttrReset(s16 window, u32 attr); -u8 HuWinStatGet(s16 window); +s16 HuWinStatGet(s16 window); void HuWinMesColSet(s16 window, u8 color); void HuWinMesPalSet(s16 window, u8 index, u8 r, u8 g, u8 b); void HuWinBGTPLvlSet(s16 window, float tp_level); diff --git a/include/math.h b/include/math.h index db5ce270..3a508d50 100644 --- a/include/math.h +++ b/include/math.h @@ -36,6 +36,7 @@ double asin(double x); double atan2(double y, double x); double fmod(double x, double y); double log(double x); +double pow(double x, double y); float tanf(float x); float sinf(float x); float cosf(float x); diff --git a/include/unsplit.h b/include/unsplit.h index 7f4e6841..bfcdf1f3 100644 --- a/include/unsplit.h +++ b/include/unsplit.h @@ -8,18 +8,5 @@ void MGSeqKillAll(void); void MGSeqPracticeInit(void); void CharMotionClose(s16 character); void CharModelClose(s16 character); -void CharModelKill(s16 character); -s16 CharModelCreate(s16 character, s16 lod); -s16 CharMotionCreate(s16 character, s32 data_num); -void CharModelMotionSet(s16 character, s16 motion); -float CharModelMotionMaxTimeGet(s16 character); -float CharModelMotionTimeGet(s16 character); -void CharModelMotionShiftSet(s16 model, s16 motion, float time, float shift_time, u32 attr); -void CharModelMotionTimeSet(s16 character, float time); -void CharModelMotionSpeedSet(s16 character, float speed); -void CharMotionKill(s16 character, s32 motion); -void CharModelVoiceEnableSet(s16 character, s16 motion, s32 flag); - -s32 CharModelMotionEndCheck(s16 character); #endif diff --git a/src/REL/bootDll/main.c b/src/REL/bootDll/main.c index 88601284..4741b7ba 100644 --- a/src/REL/bootDll/main.c +++ b/src/REL/bootDll/main.c @@ -1,5 +1,6 @@ #include "game/gamework_data.h" #include "game/process.h" +#include "game/chrman.h" #include "game/data.h" #include "game/sprite.h" #include "game/object.h" @@ -14,6 +15,8 @@ #include "math.h" #include "rel_sqrt_consts.h" +#include "data_num/title.h" + #define HU_PAD_BTN_ALL (HuPadBtn[0] | HuPadBtn[1] | HuPadBtn[2] | HuPadBtn[3]) #define HU_PAD_BTNDOWN_ALL (HuPadBtnDown[0] | HuPadBtnDown[1] | HuPadBtnDown[2] | HuPadBtnDown[3]) #define HU_PAD_DSTK_ALL (HuPadDStkRep[0] | HuPadDStkRep[1] | HuPadDStkRep[2] | HuPadDStkRep[3]) @@ -86,7 +89,7 @@ static void BootProc(void) HuSprAttrSet(group, 0, SPRITE_ATTR_HIDDEN); if(omovlevtno != 0) { HuAudSndGrpSetSet(0); - data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 1)); + data = HuSprAnimReadFile(TITLE_HUDSON_ANM); sprite_hudson = HuSprCreate(data, 0, 0); HuSprGrpMemberSet(group, 1, sprite_hudson); HuSprPosSet(group, 1, 288, 240); @@ -116,7 +119,7 @@ static void BootProc(void) MGSeqInit(); HuWinInit(1); TitleInit(); - data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 1)); + data = HuSprAnimReadFile(TITLE_HUDSON_ANM); sprite_hudson = HuSprCreate(data, 0, 0); HuSprGrpMemberSet(group, 1, sprite_hudson); HuSprPosSet(group, 1, 288, 240); @@ -287,15 +290,15 @@ static void ProgressiveProc(void) VIFlush(); } group = HuSprGrpCreate(3); - data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 3)); + data = HuSprAnimReadFile(TITLE_PROGRESSIVE_CHOOSE_ANM); sprite = HuSprCreate(data, 0, 0); HuSprGrpMemberSet(group, 0, sprite); HuSprPosSet(group, 0, 288, 240); - data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 6)); + data = HuSprAnimReadFile(TITLE_PROGRESSIVE_CURSOR_ON_ANM); sprite = HuSprCreate(data, 0, 0); HuSprGrpMemberSet(group, 1, sprite); HuSprPosSet(group, 1, progressivePosTbl[option*2], progressivePosTbl[(option*2)+1]); - data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 7)); + data = HuSprAnimReadFile(TITLE_PROGRESSIVE_CURSOR_OFF_ANM); sprite = HuSprCreate(data, 0, 0); HuSprGrpMemberSet(group, 2, sprite); HuSprPosSet(group, 2, progressivePosTbl[option*2], progressivePosTbl[(option*2)+1]); @@ -333,9 +336,9 @@ static void ProgressiveProc(void) HuSprGrpKill(group); group = HuSprGrpCreate(1); if(!option) { - data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 4)); + data = HuSprAnimReadFile(TITLE_PROGRESSIVE_ON_ANM); } else { - data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 5)); + data = HuSprAnimReadFile(TITLE_PROGRESSIVE_OFF_ANM); } sprite = HuSprCreate(data, 0, 0); HuSprGrpMemberSet(group, 0, sprite); @@ -452,38 +455,38 @@ static void TitleInit(void) s16 model; s16 sprite; AnimData *sprite_data; - titleModel[0] = model = Hu3DModelCreateFile(MAKE_DATA_NUM(DATADIR_TITLE, 11)); + titleModel[0] = model = Hu3DModelCreateFile(TITLE_CHAR_HSF); Hu3DModelAttrSet(model, 1); Hu3DModelAttrSet(model, 0x40000001); - titleModel[1] = model = Hu3DModelCreateFile(MAKE_DATA_NUM(DATADIR_TITLE, 12)); + titleModel[1] = model = Hu3DModelCreateFile(TITLE_CUBE_HSF); Hu3DModelAttrSet(model, 1); Hu3DModelAttrSet(model, 0x40000001); - titleModel[2] = model = Hu3DModelCreateFile(MAKE_DATA_NUM(DATADIR_TITLE, 13)); + titleModel[2] = model = Hu3DModelCreateFile(TITLE_SKY_HSF); Hu3DModelAttrSet(model, 1); Hu3DModelAttrSet(model, 0x40000001); Hu3DModelCameraInfoSet(model, 1); Hu3DModelLightInfoSet(model, 1); titleGroup = HuSprGrpCreate(4); - sprite_data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 8)); + sprite_data = HuSprAnimReadFile(TITLE_BG_ANM); sprite = HuSprCreate(sprite_data, 0, 0); HuSprGrpMemberSet(titleGroup, 0, sprite); HuSprAttrSet(titleGroup, 0, SPRITE_ATTR_HIDDEN); HuSprDrawNoSet(titleGroup, 0, 127); HuSprPosSet(titleGroup, 0, 288, 240); - sprite_data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 10)); + sprite_data = HuSprAnimReadFile(TITLE_COPYRIGHT_ANM); sprite = HuSprCreate(sprite_data, 1, 0); HuSprGrpMemberSet(titleGroup, 1, sprite); HuSprAttrSet(titleGroup, 1, SPRITE_ATTR_HIDDEN); HuSprPosSet(titleGroup, 1, 288, 420); - sprite_data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 2)); + sprite_data = HuSprAnimReadFile(TITLE_PRESS_START_ANM); sprite = HuSprCreate(sprite_data, 2, 0); HuSprGrpMemberSet(titleGroup, 2, sprite); - HuSprAttrSet(titleGroup, 2, SPRITE_ATTR_HIDDEN|SPIRTE_ATTR_BILINEAR); + HuSprAttrSet(titleGroup, 2, SPRITE_ATTR_HIDDEN|SPRITE_ATTR_BILINEAR); HuSprPosSet(titleGroup, 2, 288, 380); - sprite_data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 9)); + sprite_data = HuSprAnimReadFile(TITLE_LOGO_ANM); sprite = HuSprCreate(sprite_data, 0, 0); HuSprGrpMemberSet(titleGroup, 3, sprite); - HuSprAttrSet(titleGroup, 3, SPRITE_ATTR_HIDDEN|SPIRTE_ATTR_BILINEAR); + HuSprAttrSet(titleGroup, 3, SPRITE_ATTR_HIDDEN|SPRITE_ATTR_BILINEAR); HuSprPosSet(titleGroup, 3, 288, 200); } diff --git a/src/REL/m401Dll/m401Dll.h b/src/REL/m401Dll/m401Dll.h index 14e260da..76adade8 100644 --- a/src/REL/m401Dll/m401Dll.h +++ b/src/REL/m401Dll/m401Dll.h @@ -1,6 +1,7 @@ #include "common.h" #include "REL/executor.h" #include +#include "game/objsub.h" // global data // typedef struct unkStruct18FC10 { @@ -94,7 +95,6 @@ extern void espBankSet(s16, s16); extern void espDrawNoSet(s16, s16); extern void WipeCreate(s16, s16, s16); extern u8 WipeStatGet(void); -extern void omGameSysInit(omObjData*); extern f32 PSVECNormalize(Vec3f*, Vec3f*); // local data // diff --git a/src/REL/modeltestDll/main.c b/src/REL/modeltestDll/main.c new file mode 100644 index 00000000..6bad041c --- /dev/null +++ b/src/REL/modeltestDll/main.c @@ -0,0 +1,827 @@ +#include "math.h" +#include "unsplit.h" +#include "game/chrman.h" +#include "game/object.h" +#include "game/wipe.h" +#include "game/pad.h" +#include "game/hsfanim.h" +#include "game/hsfmotion.h" +#include "game/hsfex.h" +#include "game/printfunc.h" +#include "game/window.h" +#include "game/gamework_data.h" + +#include "REL/modeltestDll.h" + +// -------------------------------------------------------------------------- // + +s32 lbl_1_data_0[8] = { + 0x005F001B, + 0x005F0015, + 0x005F0016, + 0x005F0006, + 0x005F0000, + 0x005F0000, + 0x005F0000, + 0x005F0004, +}; + +const f64 unk_rodata_0 = 0.5; +const f64 unk_rodata_8 = 3.0; +omObjData * lbl_1_bss_9A4; +omObjData * lbl_1_bss_9A0; + +// -------------------------------------------------------------------------- // + +void fn_1_A0(void) +{ + Process * prc; + OSReport("******* MODELTESTObjectSetup *********\n"); + + prc = omInitObjMan(0x32, 0x2000); + omGameSysInit(prc); + + CRot.x = -30.0f; + CRot.y = 0.0f; + CRot.z = 0.0f; + Center.x = 0.0f; + Center.y = 0.0f; + Center.z = 0.0f; + CZoom = 800.0f; + + Hu3DCameraCreate(1); + Hu3DCameraPerspectiveSet(1, 45.0f, 20.0f, 20000.0f, 1.2f); + Hu3DCameraViewportSet(1, 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f); + + lbl_1_bss_9A4 = omAddObjEx(prc, 0, 0x20, 0x20, -1, fn_1_29C); + lbl_1_bss_9A0 = omAddObjEx(prc, 0x7FDA, 0, 0, -1, omOutView); + + Hu3DBGColorSet(0x20U, 0x80U, 0x80U); + WipeCreate(1, 0, 0x1E); +} + +// -------------------------------------------------------------------------- // + +char * lbl_1_data_D8[16] = { + "target1A", + "target1B", + "target2A", + "target2B", + "target3A", + "target3B", + "target4A", + "target4B", + "target5A", + "target5B", + "target6A", + "target6B", + "target7A", + "target7B", + "target8A", + "target8B" +}; + + +HsfanimStruct00 lbl_1_data_118 = { + /* unk00 */ 40, + /* unk02 */ {0, 0}, + /* unk04 */ 50.0f, + /* unk08 */ 0.0f, + /* unk0C */ 90.0f, + /* unk10 */ { /* x */ 0.0f, /* y */ -0.05000000074505806f, /* z */ 0.0f}, + /* unk1C */ 50.0f, + /* unk20 */ 0.800000011920929f, + /* unk24 */ 20.0f, + /* unk28 */ 0.9900000095367432f, + /* unk2C */ 4, + /* unk2E */ {{ /* r */ 255, /* g */ 255, /* b */ 32, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 0, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 128, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 255, /* a */ 255}}, + /* unk3E */ {{ /* r */ 255, /* g */ 255, /* b */ 255, /* a */ 0}, { /* r */ 255, /* g */ 255, /* b */ 255, /* a */ 0}, { /* r */ 255, /* g */ 255, /* b */ 255, /* a */ 0}, { /* r */ 255, /* g */ 255, /* b */ 255, /* a */ 0}}, +}; + +HsfanimStruct00 lbl_1_data_168[2] = { +{ + /* unk00 */ 50, + /* unk02 */ {0, 0}, + /* unk04 */ 5.0f, + /* unk08 */ 10.0f, + /* unk0C */ 10.0f, + /* unk10 */ { /* x */ 0.0f, /* y */ 0.0f, /* z */ 0.0f}, + /* unk1C */ 2.0f, + /* unk20 */ 1.0099999904632568f, + /* unk24 */ 30.0f, + /* unk28 */ 0.9900000095367432f, + /* unk2C */ 2, + /* unk2E */ {{ /* r */ 48, /* g */ 48, /* b */ 8, /* a */ 255}, { /* r */ 64, /* g */ 48, /* b */ 8, /* a */ 255}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}}, + /* unk3E */ {{ /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}}, +}, +{ + /* unk00 */ 30, + /* unk02 */ {0, 0}, + /* unk04 */ 3.299999952316284f, + /* unk08 */ 10.0f, + /* unk0C */ 0.0f, + /* unk10 */ { /* x */ 0.0f, /* y */ -0.05000000074505806f, /* z */ 0.0f}, + /* unk1C */ 2.0f, + /* unk20 */ 1.0f, + /* unk24 */ 20.0f, + /* unk28 */ 0.9800000190734863f, + /* unk2C */ 2, + /* unk2E */ {{ /* r */ 255, /* g */ 255, /* b */ 255, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 64, /* a */ 255}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}}, + /* unk3E */ {{ /* r */ 255, /* g */ 128, /* b */ 128, /* a */ 0}, { /* r */ 255, /* g */ 64, /* b */ 32, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}}, +}}; + +HsfanimStruct00 lbl_1_data_208 = { + /* unk00 */ 40, + /* unk02 */ {0, 0}, + /* unk04 */ 50.0f, + /* unk08 */ 0.0f, + /* unk0C */ 180.0f, + /* unk10 */ { /* x */ 0.0f, /* y */ 0.0f, /* z */ 0.0f}, + /* unk1C */ 30.0f, + /* unk20 */ 0.8999999761581421f, + /* unk24 */ 20.0f, + /* unk28 */ 0.9900000095367432f, + /* unk2C */ 4, + /* unk2E */ {{ /* r */ 255, /* g */ 255, /* b */ 32, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 0, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 128, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 255, /* a */ 255}}, + /* unk3E */ {{ /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}}, +}; + +HsfanimStruct00 lbl_1_data_258 = { + /* unk00 */ 30, + /* unk02 */ {0, 0}, + /* unk04 */ 50.0f, + /* unk08 */ 0.0f, + /* unk0C */ 90.0f, + /* unk10 */ { /* x */ 0.0f, /* y */ 0.0f, /* z */ 0.0f}, + /* unk1C */ 30.0f, + /* unk20 */ 0.949999988079071f, + /* unk24 */ 20.0f, + /* unk28 */ 0.9900000095367432f, + /* unk2C */ 2, + /* unk2E */ {{ /* r */ 255, /* g */ 16, /* b */ 16, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 16, /* a */ 255}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}}, + /* unk3E */ {{ /* r */ 255, /* g */ 16, /* b */ 16, /* a */ 255}, { /* r */ 255, /* g */ 255, /* b */ 16, /* a */ 255}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}, { /* r */ 0, /* g */ 0, /* b */ 0, /* a */ 0}}, +}; + +const Point3d lbl_1_rodata_38 = {0.0f, 0.0f, 0.0f}; +const Point3d lbl_1_rodata_44 = {0.0f, 1.0f, 0.0f}; +s16 lbl_1_bss_99C; +s16 lbl_1_bss_99A; +s16 lbl_1_bss_98A[8]; +s16 lbl_1_bss_88A[8][16]; +s16 lbl_1_bss_888; +s16 unk_bss_886; +s16 lbl_1_bss_884; +s16 lbl_1_bss_864[16]; +s16 lbl_1_bss_664[256]; +s16 lbl_1_bss_460[258]; +s16 lbl_1_bss_45A[3]; +s16 lbl_1_bss_458; +AnimData * lbl_1_bss_454; +s32 unk_bss_450; +HuObjUnk lbl_1_bss_40[20]; +void * lbl_1_bss_30[4]; +u8 lbl_1_bss_2C; +f32 lbl_1_bss_28; +s16 lbl_1_bss_24; +f32 lbl_1_bss_20; +Process * lbl_1_bss_18[2]; +Process * lbl_1_bss_14; +Process * lbl_1_bss_10; +s32 lbl_1_bss_C; +f32 lbl_1_bss_8; +static u8 unk_bss[8]; + +// -------------------------------------------------------------------------- // + +void fn_1_29C(omObjData * arg0) +{ + Point3d sp20; + Point3d sp14; + Point3d sp8; + Mtx sp2C; + s16 var_r31; + s16 temp_r27; + u32 temp_r26; + s16 temp_r3; + void * temp_r29; + AnimData * temp_r28; + f32 temp_r5; + f32 temp_f30; + s16 chrIdx; + s32 temp_r0; + + sp14 = lbl_1_rodata_38; + sp8 = lbl_1_rodata_44; + + var_r31 = Hu3DGLightCreate(0.0f, 500.0f, 1000.0f, 0.0f, -0.5f, -1.0f, 0xFFU, 0xFFU, 0xFFU); + Hu3DGLightInfinitytSet(var_r31); + Hu3DShadowCreate(45.0f, 500.0f, 8000.0f); + Hu3DShadowTPLvlSet(0.5f); + + Hu3DShadowSizeSet(0xC0U); + sp20.x = -500.0f; + sp20.y = 1000.0f; + sp20.z = 1000.0f; + Hu3DShadowPosSet(&sp20, &sp8, &sp14); + + for (var_r31 = 0; var_r31 < 1; ++var_r31) + { + chrIdx = 0; + lbl_1_bss_98A[var_r31] = CharModelCreate(chrIdx, 2); + if (var_r31 == 1) { + Hu3DModelLayerSet(lbl_1_bss_98A[var_r31], 1); + } + + lbl_1_bss_88A[var_r31][0] = CharModelMotionCreate(chrIdx, lbl_1_data_0[0]); + lbl_1_bss_88A[var_r31][1] = CharModelMotionCreate(chrIdx, lbl_1_data_0[1]); + lbl_1_bss_88A[var_r31][2] = CharModelMotionCreate(chrIdx, lbl_1_data_0[2]); + lbl_1_bss_88A[var_r31][3] = CharModelMotionCreate(chrIdx, lbl_1_data_0[3]); + lbl_1_bss_88A[var_r31][4] = CharModelMotionCreate(chrIdx, lbl_1_data_0[4]); + lbl_1_bss_88A[var_r31][5] = CharModelMotionCreate(chrIdx, lbl_1_data_0[5]); + lbl_1_bss_88A[var_r31][6] = CharModelMotionCreate(chrIdx, lbl_1_data_0[6]); + lbl_1_bss_88A[var_r31][7] = CharModelMotionCreate(chrIdx, lbl_1_data_0[7]); + lbl_1_bss_88A[var_r31][0] = CharModelMotionCreate(chrIdx, 0x5F004D); + CharModelMotionSet(chrIdx, lbl_1_bss_88A[var_r31][0]); + Hu3DModelAttrSet(lbl_1_bss_98A[var_r31], 0x40000001U); + Hu3DModelPosSet(lbl_1_bss_98A[var_r31], (var_r31 / 4 * 0xC8) - 100, 0.0f, -(var_r31 % 4) * 0x96); + CharModelMotionDataClose(chrIdx); + } + temp_r26 = OSGetTick(); + + for (var_r31 = 0; var_r31 < 8; ++var_r31) { + Hu3DModelObjMtxGet(lbl_1_bss_98A[0], "test11_tex_we-ske_R_shoe1", sp2C); + } + + temp_r5 = OSTicksToMicroseconds(OSGetTick() - temp_r26); + OSReport("time %f\n", US_TO_60TH_SEC(temp_r5)); + var_r31 = Hu3DModelCreateFile(0x700024); + Hu3DModelScaleSet(var_r31, 5.0f, 5.0f, 5.0f); + Hu3DModelShadowMapSet(var_r31); + var_r31 = Hu3DModelCreateFile(0x26001E); + temp_r27 = Hu3DJointMotion(var_r31, HuDataSelHeapReadNum(0x26002F, 0x10000000, 2)); + Hu3DMotionSet(var_r31, temp_r27); + Hu3DModelAttrSet(var_r31, 0x40000001U); + + for (var_r31 = 0; var_r31 < 10; ++var_r31) { + if (var_r31 == 0) { + lbl_1_bss_664[var_r31] = Hu3DModelCreateFile(0x700019); + } else { + lbl_1_bss_664[var_r31] = Hu3DModelLink(lbl_1_bss_664[0]); + } + Hu3DModelShadowSet(lbl_1_bss_664[var_r31]); + Hu3DModelPosSet(lbl_1_bss_664[var_r31], ((( var_r31 / 5) * 0x1F4) + 0xC8), 0.0f, (-( var_r31 % 5) * 0x12C)); + Hu3DModelAttrSet(lbl_1_bss_664[var_r31], 0x4000U); + Hu3DModelAttrSet(lbl_1_bss_664[var_r31], 0x40000001U); + } + temp_r29 = HuDataSelHeapReadNum(0x700013, 0x10000000, 2); + temp_r28 = HuSprAnimRead(temp_r29); + lbl_1_bss_99C = HuSprGrpCreate(0x14); + + for (var_r31 = 0; var_r31 < 0x14; ++var_r31) { + lbl_1_bss_99A = HuSprCreate(temp_r28, 0, 0); + HuSprGrpMemberSet(lbl_1_bss_99C, var_r31, lbl_1_bss_99A); + HuSprPosSet(lbl_1_bss_99C, var_r31, 640.0f, 240.0f); + } + + HuSprExecLayerSet(0x40, 1); + HuSprGrpDrawNoSet(lbl_1_bss_99C, 0x40); + lbl_1_bss_458 = 0x293; + lbl_1_bss_45A[0] = MGSeqCreate(1, lbl_1_bss_458 / 60, -1, -1); + temp_r29 = HuDataSelHeapReadNum(0x120001, 0x10000000, 2); + temp_r28 = HuSprAnimRead(temp_r29); + lbl_1_bss_888 = Hu3DParManCreate(temp_r28, 0x3E8, &lbl_1_data_208); + Hu3DParManAttrSet(lbl_1_bss_888, 0x45); + Hu3DParticleBlendModeSet(Hu3DParManModelIDGet(lbl_1_bss_888), 1U); + Hu3DParManRotSet(lbl_1_bss_888, 0.0f, 0.0f, 0.0f); + Hu3DParManVacumeSet(lbl_1_bss_888, 500.0f, 0.0f, 0.0f, 1.0f); + lbl_1_bss_884 = Hu3DParManLink(lbl_1_bss_888, &lbl_1_data_258); + Hu3DParManAttrSet(lbl_1_bss_884, 0x143); + Hu3DParticleBlendModeSet(Hu3DParManModelIDGet(lbl_1_bss_884), 1U); + Hu3DParManVecSet(lbl_1_bss_884, 0.0f, 1.0f, 0.0f); + Hu3DParManVacumeSet(lbl_1_bss_884, 500.0f, 0.0f, 0.0f, 1.0f); + Hu3DParManColorSet(lbl_1_bss_884, 0); + temp_r29 = HuDataSelHeapReadNum(0x120002, 0x10000000, 2); + temp_r28 = HuSprAnimRead(temp_r29); + + for (var_r31 = 0; var_r31 < 10; ++var_r31) { + lbl_1_bss_864[var_r31] = Hu3DParManCreate(temp_r28, 0x1F4, &lbl_1_data_168[0]); + Hu3DParManAttrSet(lbl_1_bss_864[var_r31], 0x864); + Hu3DParticleBlendModeSet(Hu3DParManModelIDGet(lbl_1_bss_864[var_r31]), 1U); + Hu3DParManPosSet(lbl_1_bss_864[var_r31], (100.0 * sin((M_PI * (36.0f * var_r31)) / 180.0)), 0.0f, 100.0 * cos((M_PI * (36.0f * var_r31)) / 180.0)); + Hu3DParManRotSet(lbl_1_bss_864[var_r31], -90.0f, 0.0f, 0.0f); + } + + lbl_1_bss_C = 0; + Hu3DFogSet(5000.0f, 10000.0f, 0x20U, 0x10U, 0x30U); + arg0->func = fn_1_F9C; +} + +// -------------------------------------------------------------------------- // + +s32 unrefData[] = { + 0,0,0 +}; + +// -------------------------------------------------------------------------- // + +void fn_1_F38(void) +{ + f32 var_f31; + var_f31 = 0.0f; + + while(TRUE) { + Hu3DModelRotSet(lbl_1_bss_460[0], 0.0f, var_f31, 0.0f); + var_f31 += 1.0f; + HuPrcVSleep(); + } +} + +// -------------------------------------------------------------------------- // + +static inline void HuControlCamCenter(Point3d *sp18, Point3d *sp30) { + s8 temp_r28; + + temp_r28 = HuPadSubStkX[0] & 0xF8; + if (temp_r28 != 0) { + Center.x += 0.05f * (sp30->x * temp_r28); + Center.y += 0.05f * (sp30->y * temp_r28); + Center.z += 0.05f * (sp30->z * temp_r28); + } + PSVECNormalize(sp18, sp30); + temp_r28 = -(HuPadSubStkY[0] & 0xF8); + if (temp_r28 != 0) { + Center.x += 0.05f * (sp30->x * temp_r28); + Center.y += 0.05f * (sp30->y * temp_r28); + Center.z += 0.05f * (sp30->z * temp_r28); + } +} + +// -------------------------------------------------------------------------- // + +const HuUnkF9C2 lbl_1_rodata_B8 = { + {8, 6, 4, 7, 9, 10, 11} +}; + +// -------------------------------------------------------------------------- // + +void fn_1_F9C(struct om_obj_data * omData) +{ + Point3d sp3C; + Point3d sp30; + Point3d sp24; + Point3d sp18; + f32 temp_f31; + s32 var_r31; + s16 var_r30; + HuUnkF9C2 teropPatterns; + + if (omSysExitReq != 0) { + if (lbl_1_bss_10 != 0) { + HuPrcKill(lbl_1_bss_10); + } + if (lbl_1_bss_14 != 0) { + HuPrcKill(lbl_1_bss_14); + } + if (lbl_1_bss_18[0] != 0) { + HuPrcKill(lbl_1_bss_18[0]); + } + CharModelKill(-1); + omOvlReturnEx(1, 1); + return; + } + + CRot.y += 0.1f * HuPadStkX[0]; + CRot.x += 0.1f * HuPadStkY[0]; + CZoom += HuPadTrigL[0] / 2; + CZoom -= HuPadTrigR[0] / 2; + + if (((HuPadBtn[0] & PAD_BUTTON_LEFT) != 0) && (lbl_1_data_118.unk0C < 360.0f)) { + lbl_1_data_118.unk0C += 1.0f; + } + + if (((HuPadBtn[0] & PAD_BUTTON_RIGHT) != 0) && (lbl_1_data_118.unk0C > 0.0f)) { + lbl_1_data_118.unk0C -= 1.0f; + } + + if ((HuPadBtnDown[0] & PAD_BUTTON_X) != 0) { + Hu3DParManAttrSet(lbl_1_bss_888, 0x81); + Hu3DParManAttrSet(lbl_1_bss_884, 0x81); + } + + lbl_1_bss_20 += 2.0f; + if (lbl_1_bss_20 > 360.0f) { + lbl_1_bss_20 -= 360.0f; + } + + for (var_r30 = 0; var_r30 < 10; ++var_r30) { + f32 temp_f30; + s32 var_r29; + s32 var_fake; + + while (0) { + (void) temp_f30; + (void) temp_f30; + (void) var_r31; + (void) var_r31; + (void) var_r31; + (void) var_r31; + (void) var_r31; + (void) var_r31; + (void) var_r31; + (void) var_r31; + (void) var_r31; + (void) var_r31; + (void) var_r30; + (void) var_r30; + (void) var_r30; + (void) var_r29; + (void) var_r29; + (void) var_r29; + (void) var_r29; + (void) var_r29; + (void) var_r29; + (void) var_r29; + (void) var_r29; + (void) var_r29; + (void) var_r29; + (void) var_fake; + (void) var_fake; + (void) var_fake; + (void) var_fake; + (void) var_fake; + (void) var_fake; + (void) var_fake; + (void) var_fake; + (void) var_fake; + } + } + + if (lbl_1_bss_458 > 0) { + MGSeqParamSet(lbl_1_bss_45A[0], 1, lbl_1_bss_458 / 60); + --lbl_1_bss_458; + if (lbl_1_bss_458 <= 0) { + MGSeqParamSet(lbl_1_bss_45A[0], 2, -1); + } + } + + sp3C.x = Center.x + (CZoom * (sin((M_PI * CRot.y) / 180.0) * cos((M_PI * CRot.x) / 180.0))); + sp3C.y = (Center.y + (CZoom * -sin((M_PI * CRot.x) / 180.0))); + sp3C.z = (Center.z + (CZoom * (cos((M_PI * CRot.y) / 180.0) * cos((M_PI * CRot.x) / 180.0)))); + sp30.x = Center.x - sp3C.x; + sp30.y = Center.y - sp3C.y; + sp30.z = Center.z - sp3C.z; + sp24.x = (sin((M_PI * CRot.y) / 180.0) * sin((M_PI * CRot.x) / 180.0)); + sp24.y = cos((M_PI * CRot.x) / 180.0); + sp24.z = (cos((M_PI * CRot.y) / 180.0) * sin((M_PI * CRot.x) / 180.0)); + temp_f31 = CRot.z; + + sp18.x = sp24.x * (sp30.x * sp30.x + (1.0f - sp30.x * sp30.x) * cos((M_PI * temp_f31) / 180.0)) + + sp24.y * (sp30.x * sp30.y * (1.0f - cos((M_PI * temp_f31) / 180.0)) - sp30.z * sin((M_PI * temp_f31) / 180.0)) + + sp24.z * (sp30.x * sp30.z * (1.0f - cos((M_PI * temp_f31) / 180.0)) + sp30.y * sin((M_PI * temp_f31) / 180.0)); + + sp18.y = sp24.y * (sp30.y * sp30.y + (1.0f - sp30.y * sp30.y) * cos((M_PI * temp_f31) / 180.0)) + + sp24.x * (sp30.x * sp30.y * (1.0f - cos((M_PI * temp_f31) / 180.0)) + sp30.z * sin((M_PI * temp_f31) / 180.0)) + + sp24.z * (sp30.y * sp30.z * (1.0f - cos((M_PI * temp_f31) / 180.0)) - sp30.x * sin((M_PI * temp_f31) / 180.0)); + + sp18.z = sp24.z * (sp30.z * sp30.z + (1.0f - sp30.z * sp30.z) * cos((M_PI * temp_f31) / 180.0)) + + (sp24.x * (sp30.x * sp30.z * (1.0 - cos((M_PI * temp_f31) / 180.0)) - sp30.y * sin((M_PI * temp_f31) / 180.0)) + + sp24.y * (sp30.y * sp30.z * (1.0 - cos((M_PI * temp_f31) / 180.0)) + sp30.x * sin((M_PI * temp_f31) / 180.0))); + + PSVECCrossProduct(&sp24, &sp30, &sp30); + PSVECNormalize(&sp30, &sp30); + + if (lbl_1_bss_C == 0) { + HuControlCamCenter(&sp18, &sp30); + } + + teropPatterns = lbl_1_rodata_B8; + + if ((HuPadBtnDown[0] & PAD_BUTTON_X) != 0) { + ++lbl_1_bss_24; + if (lbl_1_bss_24 >= 7) { + lbl_1_bss_24 = 0; + } + } + + if ((HuPadBtnDown[0] & PAD_BUTTON_B) != 0) { + var_r30 = MGSeqCreate(teropPatterns.unk0[lbl_1_bss_24], 0); + } + if ((HuPadBtnDown[0] & PAD_BUTTON_A) != 0) { + var_r30 = MGSeqCreate(teropPatterns.unk0[lbl_1_bss_24], 2); + } + if ((HuPadBtnDown[0] & PAD_BUTTON_Y) != 0) { + var_r30 = MGSeqCreate(0xE, 0x3B); + } + + if ((HuPadBtnDown[0] & (PAD_BUTTON_LEFT | PAD_BUTTON_RIGHT | PAD_BUTTON_UP | PAD_BUTTON_DOWN)) != 0) { + if ((HuPadBtnDown[0] & PAD_BUTTON_UP) != 0) { + MGSeqCreate(0xC, 5, GWPlayerCfg[0].character, -1, -1, -1); + } + if ((HuPadBtnDown[0] & PAD_BUTTON_LEFT) != 0) { + MGSeqCreate(0xC, 5, GWPlayerCfg[0].character, GWPlayerCfg[1].character, -1, -1); + } + if ((HuPadBtnDown[0] & PAD_BUTTON_DOWN) != 0) { + MGSeqCreate(0xC, 5, GWPlayerCfg[0].character, GWPlayerCfg[1].character, GWPlayerCfg[2].character, -1); + } + if ((HuPadBtnDown[0] & PAD_BUTTON_RIGHT) != 0) { + MGSeqCreate(0xC, 5, GWPlayerCfg[0].character, GWPlayerCfg[1].character, GWPlayerCfg[2].character, GWPlayerCfg[3].character); + } + } + fontcolor = 5; + print8(0x10, 0x190, 1.5f, "Terop Pattern%d", lbl_1_bss_24 + 1); + lbl_1_bss_8 += 5.0f; + if (lbl_1_bss_8 > 360.0f) { + lbl_1_bss_8 -= 360.0f; + } +} + +// -------------------------------------------------------------------------- // + +void fn_1_20F4(void) +{ + s16 temp_r3; + s16 var_r29; + HsfObject * temp_r3_2; + HuObjUnk * temp_r31; + Mtx spC0; + Vec sp24; + Mtx sp90; + Mtx sp60; + Mtx sp30; + Vec sp18; + Vec spC; + f32 temp_f27; + f32 var_f29; // ! - uninitialized + s16 var_r27; // ! - uninitialized + s32 var_r26; + f32 temp_f30; + + temp_r3 = Hu3DModelCreateFile(0x6C0000); + Hu3DModelPosSet(temp_r3, 0.0f, 0.0f, 100.0f); + + for (var_r29 = 0; var_r29 < 16; ++var_r29) + { + OSReport("%s\n", lbl_1_data_D8[var_r29]); + temp_r3_2 = Hu3DModelObjPtrGet(temp_r3, lbl_1_data_D8[var_r29]); + lbl_1_bss_40[var_r29].obj = temp_r3_2; + + Hu3DMotionNoMotSet(temp_r3, lbl_1_data_D8[var_r29], 0x380); + + lbl_1_bss_40[var_r29].pos.x = temp_r3_2->data.base.pos.x; + lbl_1_bss_40[var_r29].pos.y = temp_r3_2->data.base.pos.y; + lbl_1_bss_40[var_r29].pos.z = temp_r3_2->data.base.pos.z; + lbl_1_bss_40[var_r29].rot.x = temp_r3_2->data.base.rot.x; + lbl_1_bss_40[var_r29].rot.y = temp_r3_2->data.base.rot.y; + lbl_1_bss_40[var_r29].rot.z = temp_r3_2->data.base.rot.z; + lbl_1_bss_40[var_r29].scale.x = temp_r3_2->data.base.scale.x; + lbl_1_bss_40[var_r29].scale.y = temp_r3_2->data.base.scale.y; + lbl_1_bss_40[var_r29].scale.z = temp_r3_2->data.base.scale.z; + + OSReport( + "%d:(%3.2f,%3.2f,%3.2f),(%3.2f,%3.2f,%3.2f)\n", + var_r29, + temp_r3_2->data.base.pos.x, + temp_r3_2->data.base.pos.y, + temp_r3_2->data.base.pos.z, + temp_r3_2->data.base.rot.x, + temp_r3_2->data.base.rot.y, + temp_r3_2->data.base.rot.z + ); + } + while (TRUE) + { + Hu3DModelObjMtxGet(temp_r3, "ske_skirt", sp30); + + for (var_r29 = 0; var_r29 < 8; ++var_r29) + { + temp_r31 = &lbl_1_bss_40[var_r29 * 2]; + temp_r31->obj->data.curr.rot.x = temp_r31->rot.x; + temp_r31->obj->data.curr.rot.y = temp_r31->rot.y; + temp_r31->obj->data.curr.rot.z = temp_r31->rot.z; + + Hu3DModelObjMtxGet(temp_r3, lbl_1_data_D8[var_r29 * 2], sp90); + + temp_r31 = &lbl_1_bss_40[(var_r29 * 2) + 1]; + temp_r31->obj->data.curr.rot.x = temp_r31->rot.x; + temp_r31->obj->data.curr.rot.y = temp_r31->rot.y; + temp_r31->obj->data.curr.rot.z = temp_r31->rot.z; + + Hu3DModelObjMtxGet(temp_r3, lbl_1_data_D8[(var_r29 * 2) + 1], spC0); + Hu3DMtxTransGet(spC0, &sp18); + PSMTXInverse(sp30, sp60); + Hu3DModelObjMtxGet(temp_r3, lbl_1_data_D8[(var_r29 * 2) + 1], spC0); + Hu3DMtxTransGet(spC0, &sp18); + PSMTXMultVec(sp60, &sp18, &sp18); + + temp_f27 = 180.0 * (atan2(sp18.z, sp18.x) / M_PI); + temp_r31 = &lbl_1_bss_40[var_r29 * 2]; + temp_r31->obj->data.curr.rot.x = temp_r31->rot.x + (var_f29 * (2.0 * (sin((M_PI * temp_f27) / 180.0) * sin((M_PI * var_r27) / 180.0)))); + temp_r31->obj->data.curr.rot.y = temp_r31->rot.y; + temp_r31->obj->data.curr.rot.z = temp_r31->rot.z + (var_f29 * cos((M_PI * var_r27) / 180.0)); + + Hu3DModelObjMtxGet(temp_r3, lbl_1_data_D8[(var_r29 * 2) + 1], spC0); + Hu3DMtxTransGet(spC0, &sp24); + fn_1_28F8(&sp24, &spC); + HuSprPosSet(lbl_1_bss_99C, var_r29, spC.x, spC.y); + } + + var_r27 += 5; + if (var_r27 > 0x168) { + var_r27 -= 0x168; + } + + if (HuPadSubStkX[1] < 0) { + var_r26 = -HuPadSubStkX[1]; + } else { + var_r26 = HuPadSubStkX[1]; + } + + + if (var_r26 < 0xA && ABS(HuPadSubStkY[1]) < 0xA) { + var_r27 = 0x168; + var_f29 = 0.0f; + } else { + var_r27 = 180.0 * (atan2(HuPadSubStkX[1], HuPadSubStkY[1]) / M_PI); + temp_f30 = (HuPadSubStkX[1] * HuPadSubStkX[1]) + (HuPadSubStkY[1] * HuPadSubStkY[1]); + var_f29 = sqrtf(temp_f30); + if (var_f29 > 80.0f) { + var_f29 = 80.0f; + } + } + + HuPrcVSleep(); + } +} + +// -------------------------------------------------------------------------- // + +void fn_1_28F8(Point3d * arg0, Point3d * arg1) +{ + Point3d spC; + Mtx sp18; + CameraData * cam; + f32 temp_f31; + f32 temp_f30; + + cam = &Hu3DCamera[0]; + C_MTXLookAt(sp18, &cam->pos, &cam->up, &cam->target); + PSMTXMultVec(sp18, arg0, &spC); + + temp_f31 = (1.2f * (spC.z * (sin((M_PI * (cam->fov / 2)) / 180.0) / (cos((M_PI * (cam->fov / 2)) / 180.0))))); + temp_f30 = (spC.z * (sin((M_PI * (cam->fov / 2)) / 180.0) / (cos((M_PI * (cam->fov / 2)) / 180.0)))); + arg1->x = 288.0f + (spC.x * (288.0f / -temp_f31)); + arg1->y = 240.0f + (spC.y * (240.0f / temp_f30)); +} + +void fn_1_2AFC(void) { + s16 temp_r3; + + HuWinInit(1); + temp_r3 = HuWinCreate(-10000.0f, -10000.0f, 480, 0x80, 0); + HuWinMesSpeedSet(temp_r3, 3); + + while (TRUE) { + HuWinMesSet(temp_r3, 0x200011); + HuWinMesWait(temp_r3); + } +} + +// -------------------------------------------------------------------------- // + +// unreferenced data +u8 lbl_1_data_322[54] = { + 255, 255, 255, 255, 0, 0, 60, 68, 155, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 68, 155, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, +}; + +// -------------------------------------------------------------------------- // + +void fn_1_2B68(ModelData * mdl, Mtx arg1) +{ + GXColor sp17; + Mtx sp150; + Mtx sp120; + Mtx spF0; + Mtx spC0; + Mtx sp90; + GXTexObj sp30; + f32 sp18[2][3]; + Mtx44 sp50; + AnimBmpData * sp10; + f32 temp_f31; + f32 var_f30; // ! - uninitialized + f32 var_f29; // ! - uninitialized + f32 var_f28; // ! - uninitialized + f32 var_f27; // ! - uninitialized + + if (!lbl_1_bss_30[0]) { + lbl_1_bss_30[0] = HuMemDirectMallocNum(HEAP_SYSTEM, FB_SIZE(640, 480), 0x10000000); + } + + GXSetTexCopySrc(0, 0, 640, 480); + GXSetTexCopyDst(640, 480, GX_TF_RGB565, GX_FALSE); + GXCopyTex(lbl_1_bss_30[0], GX_FALSE); + DCFlushRangeNoSync(lbl_1_bss_30[0], FB_SIZE(640, 480)); + C_MTXOrtho(sp50, 0.0f, 480.0f, 0.0f, 576.0f, 0.0f, 10.0f); + GXSetProjection(sp50, GX_ORTHOGRAPHIC); + GXSetViewport(0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f); + GXSetScissor(0, 0, 640, 480); + GXInvalidateTexAll(); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxDesc(GX_VA_NRM, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0U); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_RGBA6, 0U); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0U); + GXSetCullMode(GX_CULL_NONE); + GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE); + GXSetNumTexGens(1); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3CU, 0U, 0x7DU); + GXSetNumTevStages(1); + + sp17.r = + sp17.g = + sp17.b = + sp17.a = 255; + GXSetChanMatColor(GX_COLOR0A0, sp17); + + sp17.r = + sp17.g = + sp17.b = 128; + sp17.a = 255; + GXSetChanAmbColor(GX_COLOR0A0, sp17); + + GXSetTevOp(GX_TEVSTAGE0, GX_MODULATE); + GXSetNumChans(1U); + GXSetChanCtrl(GX_COLOR0, 1U, GX_SRC_REG, GX_SRC_VTX, 1U, GX_DF_CLAMP, GX_AF_SPOT); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); + GXSetAlphaCompare(GX_GEQUAL, 1U, GX_AOP_AND, GX_GEQUAL, 1U); + GXSetZCompLoc(0U); + PSMTXIdentity(arg1); + GXLoadPosMtxImm(arg1, 0U); + + PSMTXInvXpose(arg1, sp90); + GXLoadNrmMtxImm(sp90, 0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + + sp10 = lbl_1_bss_454->bmp; + lbl_1_bss_2C += 1; + HuSprTexLoad(lbl_1_bss_454, 0, 1, GX_REPEAT, GX_REPEAT, GX_LINEAR); + + PPCSync(); + GXInitTexObj(&sp30, lbl_1_bss_30[0], 0x280U, 0x1E0U, 4U, GX_CLAMP, GX_CLAMP, 0U); + GXInitTexObjLOD(&sp30, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, 0U, 0U, GX_ANISO_1); + GXLoadTexObj(&sp30, GX_TEXMAP0); + GXSetNumIndStages(1U); + + PSMTXScale(sp150, 0.1f, 0.1f, 0.0f); + sp18[0][0] = sp150[0][0]; + sp18[0][1] = sp150[0][1]; + sp18[0][2] = 0.0f; + sp18[1][0] = sp150[1][0]; + sp18[1][1] = sp150[1][1]; + sp18[1][2] = 0.0f; + + PSMTXRotRad(spF0, 0x58, -1.5707964f); + mtxRot(spF0, 0.0f, 0.0f, 0.0f); + temp_f31 = 0.0015625f; + PSMTXScale(sp120, temp_f31, temp_f31, temp_f31); + PSMTXConcat(sp120, spF0, sp150); + PSMTXTrans(spC0, 0.5f, 0.0f, 0.5f); + GXLoadTexMtxImm(sp150, 0x1EU, GX_MTX2x4); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_POS, 0x1EU, 0U, 0x7DU); + GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD0, GX_TEXMAP1); + GXSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_4, GX_ITS_4); + GXSetIndTexMtx(GX_ITM_0, sp18, 0); + GXSetTevIndWarp(GX_TEVSTAGE0, GX_INDTEXSTAGE0, 1, 0, GX_ITM_0); + + lbl_1_bss_28 += 5.0f; + if (lbl_1_bss_28 > 360.0f) { + lbl_1_bss_28 -= 360.0f; + } + + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + + GXPosition3f32(0.0f, 0.0f, 0.0f); + GXTexCoord2f32(0.0f, 1.0f); + GXNormal3f32(0.0f, var_f30 / 640.0f, var_f29 / 480.0f); + + GXPosition3f32(640.0f, 0.0f, 0.0f); + GXTexCoord2f32(0.0f, 1.0f); + GXNormal3f32(0.0f, var_f28 / 640.0f, var_f29 / 480.0f); + + GXPosition3f32(640.0f, 480.0f, 0.0f); + GXTexCoord2f32(0.0f, 1.0f); + GXNormal3f32(0.0f, var_f28 / 640.0f, var_f27 / 480.0f); + + GXPosition3f32(0.0f, 480.0f, 0.0f); + GXTexCoord2f32(0.0f, 1.0f); + GXNormal3f32(0.0f, var_f30 / 640.0f, var_f27 / 480.0f); + + GXEnd(); + GXSetNumIndStages(0U); + GXSetTevDirect(GX_TEVSTAGE0); + GXSetTevDirect(GX_TEVSTAGE1); +} + +// -------------------------------------------------------------------------- // \ No newline at end of file diff --git a/src/REL/modeltestDll/modeltest00.c b/src/REL/modeltestDll/modeltest00.c new file mode 100644 index 00000000..c45e1f1e --- /dev/null +++ b/src/REL/modeltestDll/modeltest00.c @@ -0,0 +1,235 @@ +#include "math.h" +#include "unsplit.h" +#include "game/chrman.h" +#include "game/wipe.h" +#include "game/pad.h" + +#include "REL/modeltestDll.h" + +// -------------------------------------------------------------------------- // + +omObjData * unk_bss_9FC; +omObjData * lbl_1_bss_9F8; +omObjData * lbl_1_bss_9F4; +s16 lbl_1_bss_9EC[4]; +s16 lbl_1_bss_9AC[4][8]; +Process * lbl_1_bss_9A8; +u16 lbl_1_data_358[4] = {1, 2, 4, 8}; + +// -------------------------------------------------------------------------- // + +void fn_1_34B0() +{ + Process * temp_r30; + s16 var_r31; + + OSReport("******* MODELTESTObjectSetup *********\n"); + + temp_r30 = omInitObjMan(0x32, 0x2000); + CRot.x = -22.0f; + CRot.y = 0.0f; + CRot.z = 0.0f; + Center.x = 0.0f; + Center.y = 60.0f; + Center.z = 0.0f; + CZoom = 400.0f; + + for (var_r31 = 0; var_r31 < 4; ++var_r31) + { + Hu3DCameraCreate(lbl_1_data_358[var_r31]); + Hu3DCameraPerspectiveSet(lbl_1_data_358[var_r31], 45.0f, 20.0f, 20000.0f, 1.2f); + Hu3DCameraViewportSet(lbl_1_data_358[var_r31], (var_r31 & 1) * 320, ((var_r31 & 2) != 0) ? 0xF0 : 0, 320.0f, 240.0f, 0.0f, 1.0f); + Hu3DCameraScissorSet(lbl_1_data_358[var_r31], (var_r31 & 1) * 320, ((var_r31 & 2) != 0) ? 0xF0 : 0, 320, 240); + } + + lbl_1_bss_9F4 = omAddObjEx(temp_r30, 0, 0x20U, 0x20U, -1, fn_1_37DC); + lbl_1_bss_9F8 = omAddObjEx(temp_r30, 0x7FDA, 0U, 0U, -1, fn_1_439C); + lbl_1_bss_9A8 = HuPrcCreate(fn_1_46F0, 0x64U, 0x2000U, 0); + + Hu3DBGColorSet(0x20U, 0x80U, 0x80U); + WipeCreate(1, 0, 0x1E); +} + +// -------------------------------------------------------------------------- // + +static inline void HuControlCamCenter(Point3d *sp18, Point3d *sp30) { + s8 temp_r28; + + temp_r28 = HuPadSubStkX[0] & 0xF8; + if (temp_r28 != 0) { + Center.x += 0.05f * (sp30->x * temp_r28); + Center.y += 0.05f * (sp30->y * temp_r28); + Center.z += 0.05f * (sp30->z * temp_r28); + } + PSVECNormalize(sp18, sp30); + temp_r28 = -(HuPadSubStkY[0] & 0xF8); + if (temp_r28 != 0) { + Center.x += 0.05f * (sp30->x * temp_r28); + Center.y += 0.05f * (sp30->y * temp_r28); + Center.z += 0.05f * (sp30->z * temp_r28); + } +} + +// -------------------------------------------------------------------------- // + +void fn_1_37DC(omObjData *) +{ + Point3d sp3C; + Point3d sp30; + Point3d sp24; + Point3d sp18; + float temp_f31; + + if ((HuPadBtnDown[0] & PAD_BUTTON_START) != 0) { + if (lbl_1_bss_9A8) { + HuPrcKill(lbl_1_bss_9A8); + } + omOvlReturnEx(1, 1); + return; + } + + if ((HuPadBtn[0] & PAD_BUTTON_UP) != 0) { + CRot.x += 2.0f; + } + if ((HuPadBtn[0] & PAD_BUTTON_DOWN) != 0) { + CRot.x -= 2.0f; + } + if ((HuPadBtn[0] & PAD_BUTTON_LEFT) != 0) { + CRot.y += 2.0f; + } + if ((HuPadBtn[0] & PAD_BUTTON_RIGHT) != 0) { + CRot.y -= 2.0f; + } + + CZoom += HuPadTrigL[0] / 2; + CZoom -= HuPadTrigR[0] / 2; + + sp3C.x = Center.x + (CZoom * (sin((M_PI * CRot.y) / 180.0) * cos((M_PI * CRot.x) / 180.0))); + sp3C.y = (Center.y + (CZoom * -sin((M_PI * CRot.x) / 180.0))); + sp3C.z = (Center.z + (CZoom * (cos((M_PI * CRot.y) / 180.0) * cos((M_PI * CRot.x) / 180.0)))); + sp30.x = Center.x - sp3C.x; + sp30.y = Center.y - sp3C.y; + sp30.z = Center.z - sp3C.z; + sp24.x = (sin((M_PI * CRot.y) / 180.0) * sin((M_PI * CRot.x) / 180.0)); + sp24.y = cos((M_PI * CRot.x) / 180.0); + sp24.z = (cos((M_PI * CRot.y) / 180.0) * sin((M_PI * CRot.x) / 180.0)); + temp_f31 = CRot.z; + + sp18.x = sp24.x * (sp30.x * sp30.x + (1.0f - sp30.x * sp30.x) * cos((M_PI * temp_f31) / 180.0)) + + sp24.y * (sp30.x * sp30.y * (1.0f - cos((M_PI * temp_f31) / 180.0)) - sp30.z * sin((M_PI * temp_f31) / 180.0)) + + sp24.z * (sp30.x * sp30.z * (1.0f - cos((M_PI * temp_f31) / 180.0)) + sp30.y * sin((M_PI * temp_f31) / 180.0)); + + sp18.y = sp24.y * (sp30.y * sp30.y + (1.0f - sp30.y * sp30.y) * cos((M_PI * temp_f31) / 180.0)) + + sp24.x * (sp30.x * sp30.y * (1.0f - cos((M_PI * temp_f31) / 180.0)) + sp30.z * sin((M_PI * temp_f31) / 180.0)) + + sp24.z * (sp30.y * sp30.z * (1.0f - cos((M_PI * temp_f31) / 180.0)) - sp30.x * sin((M_PI * temp_f31) / 180.0)); + + sp18.z = sp24.z * (sp30.z * sp30.z + (1.0f - sp30.z * sp30.z) * cos((M_PI * temp_f31) / 180.0)) + + (sp24.x * (sp30.x * sp30.z * (1.0 - cos((M_PI * temp_f31) / 180.0)) - sp30.y * sin((M_PI * temp_f31) / 180.0)) + + sp24.y * (sp30.y * sp30.z * (1.0 - cos((M_PI * temp_f31) / 180.0)) + sp30.x * sin((M_PI * temp_f31) / 180.0))); + + PSVECCrossProduct(&sp24, &sp30, &sp30); + PSVECNormalize(&sp30, &sp30); + + HuControlCamCenter(&sp18, &sp30); +} + +// -------------------------------------------------------------------------- // + +void fn_1_439C(omObjData * ) +{ + s16 var_r31; + f32 temp_f30; + f32 temp_f31; + f32 sp10; + Point3d sp2C; + Point3d sp20; + Point3d sp14; + for (var_r31 = 0; var_r31 < 4; ++var_r31) + { + temp_f31 = CRot.x; + temp_f30 = CRot.y + (var_r31 * 90); + sp10 = CRot.z; + sp2C.x = Center.x + (CZoom * (sin((M_PI * temp_f30) / 180.0) * (cos((M_PI * temp_f31) / 180.0)))); + sp2C.y = Center.y + (CZoom * -sin((M_PI * temp_f31) / 180.0)); + sp2C.z = Center.z + (CZoom * (cos((M_PI * temp_f30) / 180.0) * (cos((M_PI * temp_f31) / 180.0)))); + + sp20.x = Center.x; + sp20.y = Center.y; + sp20.z = Center.z; + + sp14.x = sin((M_PI * temp_f30) / 180.0) * (sin((M_PI * temp_f31) / 180.0)); + sp14.y = cos((M_PI * temp_f31) / 180.0); + sp14.z = cos((M_PI * temp_f30) / 180.0) * (sin((M_PI * temp_f31) / 180.0)); + + Hu3DCameraPosSet(lbl_1_data_358[var_r31], sp2C.x, sp2C.y, sp2C.z, sp14.x, sp14.y, sp14.z, sp20.x, sp20.y, sp20.z); + } +} + +// -------------------------------------------------------------------------- // + +const Point3d lbl_1_rodata_18C = {0.0f, 0.0f, 0.0f}; +const Point3d lbl_1_rodata_198 = {0.0f, 1.0f, 0.0f}; + +// -------------------------------------------------------------------------- // + +void fn_1_46F0(void) +{ + Point3d sp20; + Point3d sp14; + Point3d sp8; + s16 var_r31; + s16 var_r30; + + sp14 = lbl_1_rodata_18C; + sp8 = lbl_1_rodata_198; + + Hu3DGLightCreate(0.0f, 500.0f, 1000.0f, 0.0f, -0.5f, -1.0f, 0xFFU, 0xFFU, 0xFFU); + Hu3DShadowCreate(45.0f, 500.0f, 8000.0f); + Hu3DShadowTPLvlSet(0.5f); + Hu3DShadowSizeSet(0xC0U); + + sp20.x = -500.0f; + sp20.y = 1000.0f; + sp20.z = 1000.0f; + Hu3DShadowPosSet(&sp20, &sp8, &sp14); + + for (var_r31 = 0; var_r31 < 4; ++var_r31) + { + var_r30 = var_r31; + lbl_1_bss_9EC[var_r31] = CharModelCreate(var_r30, 8); + Hu3DModelShadowSet(lbl_1_bss_9EC[var_r31]); + lbl_1_bss_9AC[var_r31][0] = CharModelMotionCreate(var_r30, 0x5F0002); + CharModelMotionSet(var_r30, lbl_1_bss_9AC[var_r31][0]); + Hu3DModelAttrSet(lbl_1_bss_9EC[var_r31], 0x40000001U); + Hu3DModelCameraSet(lbl_1_bss_9EC[var_r31], lbl_1_data_358[var_r31]); + Hu3DModelPosSet(lbl_1_bss_9EC[var_r31], ((( var_r31 / 4) * 200) - 100), 0.0f, (-( var_r31 % 4) * 150)); + Hu3DModelPosSet(lbl_1_bss_9EC[var_r31], 0.0f, 0.0f, 0.0f); + CharModelMotionDataClose(var_r30); + } + + var_r31 = Hu3DModelCreateFile(0x700024); + Hu3DModelScaleSet(var_r31, 5.0f, 5.0f, 5.0f); + Hu3DModelShadowMapSet(var_r31); + + while (TRUE) + { + if ((HuPadBtnDown[0] & PAD_BUTTON_Y) != 0) { + Hu3DCameraKill(2); + Hu3DCameraKill(4); + Hu3DCameraKill(8); + sp20.x = + sp20.z = + sp20.y = 0.0f; + sp20.y += 200.0f; + CharModelCoinEffectCreate(4, &sp20); + } + HuPrcVSleep(); + } +} + +// -------------------------------------------------------------------------- // + +const Point3d lbl_1_rodata_1C8 = {0.0f, 0.0f, 0.0f}; +const Point3d lbl_1_rodata_1D4 = {0.0f, 0.0f, -1.0f}; + +// -------------------------------------------------------------------------- // \ No newline at end of file diff --git a/src/REL/modeltestDll/modeltest01.c b/src/REL/modeltestDll/modeltest01.c new file mode 100644 index 00000000..e69de29b diff --git a/src/REL/w03Dll/main.c b/src/REL/w03Dll/main.c index d7d5e61d..732301f8 100644 --- a/src/REL/w03Dll/main.c +++ b/src/REL/w03Dll/main.c @@ -5,14 +5,15 @@ #include "game/gamework_data.h" #include "REL/w03Dll.h" #include "game/board/space.h" +#include "game/board/star.h" #include "game/object.h" #include "game/board/player.h" #include "math.h" #include "board_unsplit.h" #include "game/hsfman.h" -void BoardModelPosSet(s16, f32, f32, f32); -s32 BoardModelMotionStart(s16, s32, s32); +s32 BoardModelPosSet(s16, f32, f32, f32); +s32 BoardModelMotionStart(s16, s32, u32); void fn_8005B150(void*, void*); void fn_1_740(void); @@ -26,7 +27,7 @@ void fn_1_AF8(void); void fn_1_DEC(void); void fn_1_10B0(void); s32 fn_1_12C8(void); -void fn_8006DDE8(s16, f32); +s32 fn_8006DDE8(s16, f32); void fn_1_10E4(omObjData* arg0); extern Process *boardObjMan; typedef void (*VoidFunc)(void); @@ -35,7 +36,7 @@ extern const VoidFunc _dtors[]; f32 BoardModelMotionTimeGet(s16); -s16 BoardModelCreate(s32, void*, s32); +s16 BoardModelCreate(s32, s32*, s32); void BoardModelKill(s16); void BoardModelMotionStartEndSet(s16, s32, s32); void Hu3DFogSet(f32, f32, u8, u8, u8); @@ -44,18 +45,18 @@ u8 WipeStatGet(void); //DATA w03StructUnk0 lbl_1_data_0[] = { -{{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x0004)}, -{{145.0988f, 65.6173f, -2004.14f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x0005)}, -{{-1548.14f, -1148.76f, -1095.54f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x0006)}, -{{1050.0f, 50.0f, -1810.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x000B)}, -{{-1950.0f, 50.0f, 1790.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 0.914f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x000B)}, -{{1050.0f, 0.0f, -1750.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x000A)}, -{{-1950.0f, 0.0f, 1850.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 0.914f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x000A)}, -{{1950.0f, 0.0f, -1800.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x0010)}, -{{-3150.0f, 0.0f, -600.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x0011)}, -{{-3150.0f, 270.0f, -600.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0077, 0x0012)}, -{{2080.0f, 0.0f, -1635.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0002, 0x000D)}, -{{-3000.0f, 0.0f, -500.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, MAKE_DATA_NUM(0x0002, 0x000D)}, +{{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x0004)}, +{{145.0988f, 65.6173f, -2004.14f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x0005)}, +{{-1548.14f, -1148.76f, -1095.54f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x0006)}, +{{1050.0f, 50.0f, -1810.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x000B)}, +{{-1950.0f, 50.0f, 1790.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 0.914f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x000B)}, +{{1050.0f, 0.0f, -1750.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x000A)}, +{{-1950.0f, 0.0f, 1850.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 0.914f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x000A)}, +{{1950.0f, 0.0f, -1800.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x0010)}, +{{-3150.0f, 0.0f, -600.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x0011)}, +{{-3150.0f, 270.0f, -600.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_W03, 0x0012)}, +{{2080.0f, 0.0f, -1635.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_BGUEST, 0x000D)}, +{{-3000.0f, 0.0f, -500.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, DATA_MAKE_NUM(DATADIR_BGUEST, 0x000D)}, }; s16 lbl_1_data_1E0 = -1; @@ -80,12 +81,12 @@ w03StructUnk1 lbl_1_data_1EC = { }; s32 lbl_1_data_20C[] = { - MAKE_DATA_NUM(0x0077, 0x001C), + DATA_MAKE_NUM(DATADIR_W03, 0x001C), DATA_NUM_LISTEND }; s32 lbl_1_data_214[] = { - MAKE_DATA_NUM(0x0002, 0x000E), + DATA_MAKE_NUM(DATADIR_BGUEST, 0x000E), DATA_NUM_LISTEND }; @@ -142,10 +143,10 @@ void BoardCreate(void) { fn_8006DDE8(lbl_1_data_1E2, -1.0f); BoardModelPosSet(lbl_1_data_1E2, 0.0f, 0.0f, 0.0f); BoardModelMotionStart(lbl_1_data_1E2, 0, 0x40000001); - lbl_1_data_1E4 = BoardModelCreate(0x77001B, &lbl_1_data_20C, 0); + lbl_1_data_1E4 = BoardModelCreate(0x77001B, lbl_1_data_20C, 0); BoardModelPosSet(lbl_1_data_1E4, 0.0f, 0.0f, 0.0f); BoardModelMotionStart(lbl_1_data_1E4, 1, 0x40000001); - lbl_1_data_1E6 = BoardModelCreate(0x2000D, &lbl_1_data_214, 0); + lbl_1_data_1E6 = BoardModelCreate(0x2000D, lbl_1_data_214, 0); BoardModelPosSet(lbl_1_data_1E6, 0.0f, 0.0f, 0.0f); BoardModelMotionStart(lbl_1_data_1E6, 1, 0x40000001); diff --git a/src/REL/w03Dll/mg_coin.c b/src/REL/w03Dll/mg_coin.c index d8b3f52f..e76ce248 100644 --- a/src/REL/w03Dll/mg_coin.c +++ b/src/REL/w03Dll/mg_coin.c @@ -1,4 +1,5 @@ #include "dolphin.h" +#include "game/chrman.h" #include "game/object.h" #include "REL/w03Dll.h" #include "board_unsplit.h" @@ -670,7 +671,7 @@ void fn_1_95B8(omObjData* arg0) { var_r30->unk8.y += -0.08166667f * temp_f31 * temp_f31 * 0.75f; if (var_r30->unk8.y < temp_r29->unk8) { var_r30->unk8.y = temp_r29->unk8; - CharModelCreateCoinParticle(1, &var_r30->unk8); + CharModelCoinEffectCreate(1, &var_r30->unk8); BoardModelVisibilitySet(var_r30->unk_02, 0); HuAudFXPlay(7); BoardPlayerCoinsAdd(temp_r29->unk4, 1); diff --git a/src/REL/w03Dll/mg_item.c b/src/REL/w03Dll/mg_item.c index eb1ff2a9..d9bfc3be 100644 --- a/src/REL/w03Dll/mg_item.c +++ b/src/REL/w03Dll/mg_item.c @@ -4,8 +4,10 @@ #include "game/data.h" #include "game/gamework_data.h" #include "REL/w03Dll.h" +#include "game/board/main.h" #include "game/board/space.h" #include "game/object.h" +#include "game/objsub.h" #include "game/board/player.h" #include "math.h" #include "board_unsplit.h" @@ -67,7 +69,6 @@ s32 BoardVecDAngleCalcRange(float *value, float min, float range); void BoardCameraQuakeSet(s32 duration, float strength); s16 MGSeqCreate(s32, ...); u8 MGSeqStatGet(s16); -void omVibrate(s16, s16, s16, s16); f32 BoardPlayerRotYGet(s32); f32 BoardModelMotionTimeGet(s16); s32 BoardVecMinDistCheck(Vec *vec1, Vec *vec2, float min_dist); @@ -130,20 +131,20 @@ char* lbl_1_data_508[] = { }; s32 lbl_1_data_514[] = { - MAKE_DATA_NUM(7, 0x6D), - MAKE_DATA_NUM(7, 0x6E), - MAKE_DATA_NUM(7, 0x6F), - MAKE_DATA_NUM(7, 0x70), - MAKE_DATA_NUM(7, 0x71), - MAKE_DATA_NUM(7, 0x72), - MAKE_DATA_NUM(7, 0x73), - MAKE_DATA_NUM(7, 0x74), - MAKE_DATA_NUM(7, 0x76), - MAKE_DATA_NUM(7, 0x77), - MAKE_DATA_NUM(7, 0x78), - MAKE_DATA_NUM(7, 0x79), - MAKE_DATA_NUM(7, 0x7A), - MAKE_DATA_NUM(7, 0x7B), + DATA_MAKE_NUM(DATADIR_BOARD, 0x6D), + DATA_MAKE_NUM(DATADIR_BOARD, 0x6E), + DATA_MAKE_NUM(DATADIR_BOARD, 0x6F), + DATA_MAKE_NUM(DATADIR_BOARD, 0x70), + DATA_MAKE_NUM(DATADIR_BOARD, 0x71), + DATA_MAKE_NUM(DATADIR_BOARD, 0x72), + DATA_MAKE_NUM(DATADIR_BOARD, 0x73), + DATA_MAKE_NUM(DATADIR_BOARD, 0x74), + DATA_MAKE_NUM(DATADIR_BOARD, 0x76), + DATA_MAKE_NUM(DATADIR_BOARD, 0x77), + DATA_MAKE_NUM(DATADIR_BOARD, 0x78), + DATA_MAKE_NUM(DATADIR_BOARD, 0x79), + DATA_MAKE_NUM(DATADIR_BOARD, 0x7A), + DATA_MAKE_NUM(DATADIR_BOARD, 0x7B), }; //BSS diff --git a/src/REL/w03Dll/statue.c b/src/REL/w03Dll/statue.c index 9b57ecf1..38273508 100644 --- a/src/REL/w03Dll/statue.c +++ b/src/REL/w03Dll/statue.c @@ -7,9 +7,11 @@ #include "game/audio.h" #include "game/board/space.h" #include "game/board/player.h" +#include "game/board/ui.h" #include "board_unsplit.h" #include "game/hsfman.h" #include "game/board/main.h" +#include "game/objsub.h" void fn_1_1358(void); void fn_1_152C(void); @@ -29,7 +31,6 @@ s32 BoardPlayerMotBlendCheck(s32); f32 BoardPlayerRotYGet(s32); void BoardConfettiCreate(Point3d*, s16, f32); double atan2(double y, double x); -void omVibrate(s16, s16, s16, s16); f32 BoardModelMotionTimeGet(s16); //DATA @@ -41,26 +42,26 @@ s32 lbl_1_data_288 = -1; char lbl_1_data_28C[] = "%d"; -s32 lbl_1_data_290[] = { //TODO: make sure this actually uses MAKE_DATA_NUM macro - MAKE_DATA_NUM(0x5F, 0x62), - MAKE_DATA_NUM(0x1A, 0x62), - MAKE_DATA_NUM(0x6D, 0x62), - MAKE_DATA_NUM(0x8A, 0x62), - MAKE_DATA_NUM(0x85, 0x62), - MAKE_DATA_NUM(0x11, 0x62), - MAKE_DATA_NUM(0x0D, 0x62), - MAKE_DATA_NUM(0x81, 0x62), +s32 lbl_1_data_290[] = { //TODO: make sure this actually uses DATA_MAKE_NUM macro + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x62), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x62), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x62), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x62), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x62), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x62), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x62), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x62), }; -s32 lbl_1_data_2B0[] = { //TODO: make sure this actually uses MAKE_DATA_NUM macro - MAKE_DATA_NUM(0x5F, 0x33), - MAKE_DATA_NUM(0x1A, 0x33), - MAKE_DATA_NUM(0x6D, 0x33), - MAKE_DATA_NUM(0x8A, 0x33), - MAKE_DATA_NUM(0x85, 0x33), - MAKE_DATA_NUM(0x11, 0x33), - MAKE_DATA_NUM(0x0D, 0x33), - MAKE_DATA_NUM(0x81, 0x33), +s32 lbl_1_data_2B0[] = { //TODO: make sure this actually uses DATA_MAKE_NUM macro + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x33), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x33), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x33), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x33), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x33), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x33), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x33), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x33), }; s32 lbl_1_data_2D0[] = { diff --git a/src/REL/w10Dll/host.c b/src/REL/w10Dll/host.c index 4ef6f9b8..ce7465a1 100644 --- a/src/REL/w10Dll/host.c +++ b/src/REL/w10Dll/host.c @@ -1,9 +1,10 @@ #include "REL/w10Dll.h" #include "game/data.h" +#include "game/board/tutorial.h" #include "game/board/window.h" s32 lbl_1_data_78[2] = { - MAKE_DATA_NUM(DATADIR_W10, 16), + DATA_MAKE_NUM(DATADIR_W10, 16), -1 }; @@ -14,7 +15,7 @@ Vec lbl_1_data_80[2] = { void fn_1_AEC(void) { lbl_1_bss_1C = 0; - lbl_1_bss_1E = BoardModelCreate(MAKE_DATA_NUM(DATADIR_W10, 15), &lbl_1_data_78, 0); + lbl_1_bss_1E = BoardModelCreate(DATA_MAKE_NUM(DATADIR_W10, 15), lbl_1_data_78, 0); BoardModelMotionStart(lbl_1_bss_1E, 1, 0x40000001); BoardTutorialHostSet(lbl_1_bss_1E); BoardModelLayerSet(lbl_1_bss_1E, 6); diff --git a/src/REL/w10Dll/main.c b/src/REL/w10Dll/main.c index a447042d..9bd9f796 100644 --- a/src/REL/w10Dll/main.c +++ b/src/REL/w10Dll/main.c @@ -1,6 +1,8 @@ #include "include/REL/w10Dll.h" #include "game/data.h" #include "game/hsfman.h" +#include "game/board/star.h" +#include "game/board/tutorial.h" #include "math.h" @@ -22,7 +24,7 @@ unkw10Dll lbl_1_data_0[1] = { 3300.0f, 100.0f, -900.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, - MAKE_DATA_NUM(DATADIR_W10, 3) + DATA_MAKE_NUM(DATADIR_W10, 3) }; @@ -42,22 +44,22 @@ s32 lbl_1_data_34[] = { }; s32 lbl_1_data_54[2] = { - MAKE_DATA_NUM(DATADIR_W10, 18), + DATA_MAKE_NUM(DATADIR_W10, 18), DATA_NUM_LISTEND }; s32 lbl_1_data_5C[2] = { - MAKE_DATA_NUM(DATADIR_BGUEST, 9), + DATA_MAKE_NUM(DATADIR_BGUEST, 9), DATA_NUM_LISTEND }; s32 lbl_1_data_64[2] = { - MAKE_DATA_NUM(DATADIR_BGUEST, 24), + DATA_MAKE_NUM(DATADIR_BGUEST, 24), DATA_NUM_LISTEND }; s32 lbl_1_data_6C[2] = { - MAKE_DATA_NUM(DATADIR_BGUEST, 14), + DATA_MAKE_NUM(DATADIR_BGUEST, 14), DATA_NUM_LISTEND }; @@ -85,26 +87,26 @@ void BoardCreate(void) { fn_1_AEC(); fn_1_1D68(); lbl_1_bss_C = 0; - BoardSpaceInit(MAKE_DATA_NUM(DATADIR_W10, 0)); + BoardSpaceInit(DATA_MAKE_NUM(DATADIR_W10, 0)); temp = BoardSpaceFlagSearch(0, 1); BoardTutorialBlockSetPos(temp, 1); - lbl_1_data_28 = BoardModelCreate(MAKE_DATA_NUM(DATADIR_W10, 1), NULL, 0); + lbl_1_data_28 = BoardModelCreate(DATA_MAKE_NUM(DATADIR_W10, 1), NULL, 0); fn_8006DDE8(lbl_1_data_28, -1.0f); BoardModelPosSet(lbl_1_data_28, 0.0f, 0.0f, 0.0f); BoardModelMotionStart(lbl_1_data_28, 0, 0x40000001); BoardModelMotionSpeedSet(lbl_1_data_28, 1.0f); - lbl_1_data_2A = BoardModelCreate(MAKE_DATA_NUM(DATADIR_W10, 2), NULL, 0); + lbl_1_data_2A = BoardModelCreate(DATA_MAKE_NUM(DATADIR_W10, 2), NULL, 0); fn_8006DDE8(lbl_1_data_2A, -1.0f); BoardModelPosSet(lbl_1_data_2A, 0.0f, 0.0f, 0.0f); BoardModelMotionStart(lbl_1_data_2A, 0, 0x40000001); - lbl_1_data_2C = BoardModelCreate(MAKE_DATA_NUM(DATADIR_W10, 17), lbl_1_data_54, 0); + lbl_1_data_2C = BoardModelCreate(DATA_MAKE_NUM(DATADIR_W10, 17), lbl_1_data_54, 0); BoardModelPosSet(lbl_1_data_2C, 0.0f, 0.0f, 0.0f); BoardModelMotionStart(lbl_1_data_2C, 1, 0x40000001); - lbl_1_data_2E = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BGUEST, 5), lbl_1_data_5C, 0); + lbl_1_data_2E = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BGUEST, 5), lbl_1_data_5C, 0); BoardModelMotionStart(lbl_1_data_2E, 1, 0x40000001); - lbl_1_data_32 = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BGUEST, 18), lbl_1_data_64, 0); + lbl_1_data_32 = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BGUEST, 18), lbl_1_data_64, 0); BoardModelMotionStart(lbl_1_data_32, 1, 0x40000001); - lbl_1_data_30 = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BGUEST, 13), lbl_1_data_6C, 0); + lbl_1_data_30 = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BGUEST, 13), lbl_1_data_6C, 0); BoardModelMotionStart(lbl_1_data_30, 1, 0x40000001); BoardLightHookSet(&fn_1_8C0, &fn_1_904); for (i = 0; i < ARRAY_COUNT(lbl_1_data_0); i++) { diff --git a/src/REL/w10Dll/scene.c b/src/REL/w10Dll/scene.c index 420a5450..881ea98b 100644 --- a/src/REL/w10Dll/scene.c +++ b/src/REL/w10Dll/scene.c @@ -1,4 +1,8 @@ #include "include/REL/w10Dll.h" +#include "game/board/main.h" +#include "game/board/star.h" +#include "game/board/tutorial.h" +#include "game/board/ui.h" void fn_1_D2C(void) { fn_1_BA0(0x2E0001); diff --git a/src/REL/w10Dll/tutorial.c b/src/REL/w10Dll/tutorial.c index 2425dadf..eb85426e 100644 --- a/src/REL/w10Dll/tutorial.c +++ b/src/REL/w10Dll/tutorial.c @@ -3,6 +3,7 @@ #include "game/pad.h" #include "game/data.h" #include "game/wipe.h" +#include "game/board/ui.h" char lbl_1_data_98[] = "@@@@@@@@@@@@@@ Tutorial Exit @@@@@@@@@@@@@@\n\000"; @@ -68,17 +69,17 @@ w10DllUnk04 lbl_1_data_108[42] = { char lbl_1_data_258[] = "Tutorial Hook P0:%d P1:%d P2:%d P3:%d SCEN:%d CUE:%d PRM:%d DICE:%d MSG:%d\n"; s32 lbl_1_data_2A8[11] = { - MAKE_DATA_NUM(DATADIR_W10, 4), - MAKE_DATA_NUM(DATADIR_W10, 5), - MAKE_DATA_NUM(DATADIR_W10, 6), - MAKE_DATA_NUM(DATADIR_W10, 7), - MAKE_DATA_NUM(DATADIR_W10, 8), - MAKE_DATA_NUM(DATADIR_W10, 9), - MAKE_DATA_NUM(DATADIR_W10, 10), - MAKE_DATA_NUM(DATADIR_W10, 11), - MAKE_DATA_NUM(DATADIR_W10, 12), - MAKE_DATA_NUM(DATADIR_W10, 13), - MAKE_DATA_NUM(DATADIR_W10, 14) + DATA_MAKE_NUM(DATADIR_W10, 4), + DATA_MAKE_NUM(DATADIR_W10, 5), + DATA_MAKE_NUM(DATADIR_W10, 6), + DATA_MAKE_NUM(DATADIR_W10, 7), + DATA_MAKE_NUM(DATADIR_W10, 8), + DATA_MAKE_NUM(DATADIR_W10, 9), + DATA_MAKE_NUM(DATADIR_W10, 10), + DATA_MAKE_NUM(DATADIR_W10, 11), + DATA_MAKE_NUM(DATADIR_W10, 12), + DATA_MAKE_NUM(DATADIR_W10, 13), + DATA_MAKE_NUM(DATADIR_W10, 14) }; void fn_1_176C(void) { @@ -108,7 +109,7 @@ void fn_1_1834(void) { void fn_1_18BC(void) { fn_1_BA0(0x2E0028); fn_1_BA0(0x2E0029); - boardTutorialData = 0; + boardTutorialData[0] = 0; BoardStatusItemSet(0); } diff --git a/src/game/ClusterExec.c b/src/game/ClusterExec.c index f1494664..57fb5ef0 100644 --- a/src/game/ClusterExec.c +++ b/src/game/ClusterExec.c @@ -119,7 +119,7 @@ void ClusterProc(ModelData *arg0) { temp_r31 = temp_r23->object; temp_r31 += var_r29->target; Vertextop = temp_r31->data.vertex->data; - if (temp_r31->data.hook) { + if (temp_r31->data.cenvCnt) { for (k = 0; k < temp_r31->data.vertex->count; k++) { Vertextop[k].x = ((Vec*) temp_r31->data.file[0])[k].x; Vertextop[k].y = ((Vec*) temp_r31->data.file[0])[k].y; diff --git a/src/game/EnvelopeExec.c b/src/game/EnvelopeExec.c index b67b1117..cf417b01 100644 --- a/src/game/EnvelopeExec.c +++ b/src/game/EnvelopeExec.c @@ -179,7 +179,7 @@ static void SetEnvelopMain(HsfData *arg0) { normtop = var_r31->data.file[1]; normenv = temp_r28->data; var_r25 = var_r31->data.cenv; - for (j = 0; j < var_r31->data.hook; j++, var_r25++) { + for (j = 0; j < var_r31->data.cenvCnt; j++, var_r25++) { SetEnvelop(var_r25); } sp10 = temp_r30->data; diff --git a/src/game/audio.c b/src/game/audio.c index 238122eb..ca9ddb0a 100644 --- a/src/game/audio.c +++ b/src/game/audio.c @@ -261,7 +261,7 @@ s32 HuAudSeqPlay(s16 arg0) { if (musicOffF != 0 || omSysExitReq != 0) { return 0; } - temp_r31 = msmMusPlay(arg0, 0); + temp_r31 = msmMusPlay(arg0, NULL); return temp_r31; } diff --git a/src/game/board/audio.c b/src/game/board/audio.c new file mode 100755 index 00000000..ffe31714 --- /dev/null +++ b/src/game/board/audio.c @@ -0,0 +1,158 @@ +#include "game/board/audio.h" +#include "game/audio.h" +#include "game/gamework_data.h" +#include "game/msm.h" + +static s16 boardSeq[2][2]; + +static s32 boardFX = -1; + +static s16 boardMusTbl[] = { + 0x000D, 0x0011, 0x0015, + 0x001C, 0x0021, 0x0025, + 0x0028, 0x0029, 0x002A +}; + +void BoardMusStartBoard(void) { + s16 temp_r31 = boardMusTbl[GWBoardGet()]; + + BoardMusStart(0, temp_r31, 0x7F, 0); + BoardAudFXPlay(); +} + +void BoardMusStart(s32 arg0, s32 arg1, s8 arg2, u16 arg3) { + s16 *temp_r31 = boardSeq[arg0]; + UnkMsmStruct_03 sp8; + + if (arg1 == temp_r31[1]) { + return; + } + if (temp_r31[0] != -1) { + BoardAudSeqFadeOutFast(temp_r31[0]); + } + sp8.unk00 = 1; + if (arg3 != 0) { + sp8.unk00 |= 8; + } + if (arg2 < 0) { + sp8.unk00 |= 2; + arg2 = 0x7F; + } + sp8.unk06 = arg3; + sp8.unk05 = arg2; + sp8.unk04 = arg0; + temp_r31[0] = msmMusPlay(arg1, &sp8); + temp_r31[1] = arg1; +} + +void BoardAudSeqFadeOutFast(s32 arg0) { + BoardAudSeqFadeOut(arg0, 0x64); +} + +void BoardAudSeqFadeOut(s32 arg0, u16 arg1) { + s16 *temp_r31 = boardSeq[arg0]; + + if (temp_r31[0] == -1) { + return; + } + HuAudSeqFadeOut(temp_r31[0], arg1); + temp_r31[1] = temp_r31[0] = -1; +} + +void BoardMusLoudSet(s32 arg0, s32 arg1) { + if (arg1 != 0) { + BoardMusVolPanSet(arg0, 0x60, 0x1F4); + } else { + BoardMusVolPanSet(arg0, 0x7F, 0x1F4); + } +} + +void BoardMusVolPanSet(s32 arg0, s8 arg1, u16 arg2) { + s16 *temp_r31 = boardSeq[arg0]; + UnkMsmStruct_04 sp10; + + if (temp_r31[0] == -1) { + return; + } + sp10.unk00 = 1; + sp10.unk00 |= 2; + if (arg1 < 0) { + arg1 = 0x7F; + } + sp10.unk06 = arg2; + sp10.unk05 = arg1; + msmMusSetParam(temp_r31[0], &sp10); +} + +void BoardAudSeqPause(s32 arg0, s32 arg1, u16 arg2) { + s16 *temp_r31 = boardSeq[arg0]; + + if (temp_r31[0] == -1) { + return; + } + if (arg1 != 0) { + if (BoardMusStatusGet(arg0) == 3) { + return; + } + } else if (BoardMusStatusGet(arg0) != 3) { + return; + } + HuAudSeqPause(temp_r31[0], arg1, arg2); +} + +s32 BoardMusStatusGet(s32 arg0) { + s16 *temp_r31 = boardSeq[arg0]; + + if (temp_r31[0] == -1) { + return 0; + } + return msmMusGetStatus(temp_r31[0]); +} + +void BoardAudSeqClear(void) { + s32 i; + + for (i = 0; i < 2; i++) { + boardSeq[i][0] = boardSeq[i][1] = -1; + } + boardFX = -1; +} + +void BoardAudSeqFadeOutAll(void) { + s16 *temp_r31; + s32 i; + + for (i = 0; i < 2; i++) { + temp_r31 = boardSeq[i]; + if (temp_r31[0] != -1) { + HuAudSeqFadeOut(temp_r31[0], 0x64); + temp_r31[1] = temp_r31[0] = -1; + } + } + BoardAudFXStop(); +} + +void BoardAudFXPlay(void) { + s32 var_r31; + + switch (GWBoardGet()) { + case 4: + var_r31 = 0x48D; + break; + case 5: + var_r31 = 0x4A2; + break; + default: + return; + } + if (boardFX == -1) { + boardFX = HuAudFXPlay(var_r31); + } +} + +void BoardAudFXStop(void) { + if (boardFX != -1) { + HuAudFXStop(boardFX); + boardFX = -1; + } +} diff --git a/src/game/board/basic_space.c b/src/game/board/basic_space.c index c51bb88f..894f5e31 100644 --- a/src/game/board/basic_space.c +++ b/src/game/board/basic_space.c @@ -1,9 +1,11 @@ #include "game/board/basic_space.h" #include "game/board/main.h" #include "game/board/player.h" +#include "game/board/tutorial.h" #include "game/data.h" #include "game/flag.h" #include "game/object.h" +#include "game/objsub.h" #include "game/gamework_data.h" #include "board_unsplit.h" #include "math.h" @@ -33,9 +35,7 @@ static void CoinChgSeparate(omObjData*, coinChg*); static void CoinChgShow(omObjData*, coinChg*); static void CoinChgDisappear(omObjData*, coinChg*); -extern void BoardTutorialHookExec(s16, s32); extern void BoardCameraViewSet(s32); -extern void omVibrate(s16, s16, s16, s16); extern void BoardPlayerPosGet(s32, Vec*); extern void BoardModelPosGet(s16, Vec*); extern void BoardPlayerMotionEndWait(s32); @@ -52,16 +52,16 @@ static omObjData *coinChgObj[4] = { }; static s32 coinDigitMdl[10] = { - MAKE_DATA_NUM(DATADIR_BOARD, 12), - MAKE_DATA_NUM(DATADIR_BOARD, 13), - MAKE_DATA_NUM(DATADIR_BOARD, 14), - MAKE_DATA_NUM(DATADIR_BOARD, 15), - MAKE_DATA_NUM(DATADIR_BOARD, 16), - MAKE_DATA_NUM(DATADIR_BOARD, 17), - MAKE_DATA_NUM(DATADIR_BOARD, 18), - MAKE_DATA_NUM(DATADIR_BOARD, 19), - MAKE_DATA_NUM(DATADIR_BOARD, 20), - MAKE_DATA_NUM(DATADIR_BOARD, 21), + DATA_MAKE_NUM(DATADIR_BOARD, 12), + DATA_MAKE_NUM(DATADIR_BOARD, 13), + DATA_MAKE_NUM(DATADIR_BOARD, 14), + DATA_MAKE_NUM(DATADIR_BOARD, 15), + DATA_MAKE_NUM(DATADIR_BOARD, 16), + DATA_MAKE_NUM(DATADIR_BOARD, 17), + DATA_MAKE_NUM(DATADIR_BOARD, 18), + DATA_MAKE_NUM(DATADIR_BOARD, 19), + DATA_MAKE_NUM(DATADIR_BOARD, 20), + DATA_MAKE_NUM(DATADIR_BOARD, 21), }; void BoardLandBlueExec(s32 player, s32 space) { @@ -206,8 +206,8 @@ void BoardCoinChgHide(s32 index) { } static const s32 coinSignMdl[2] = { - MAKE_DATA_NUM(DATADIR_BOARD, 22), - MAKE_DATA_NUM(DATADIR_BOARD, 23) + DATA_MAKE_NUM(DATADIR_BOARD, 22), + DATA_MAKE_NUM(DATADIR_BOARD, 23) }; static void CreateCoinChg(coinChg *coin_chg, Vec *pos) { @@ -221,7 +221,7 @@ static void CreateCoinChg(coinChg *coin_chg, Vec *pos) { coin_chg->sign_model = BoardModelCreate(coinSignMdl[coin_chg->minus], NULL, 0); coin_chg->tens_model = BoardModelCreate(coinDigitMdl[coin_chg->tens], NULL, 0); coin_chg->ones_model = BoardModelCreate(coinDigitMdl[coin_chg->ones], NULL, 0); - coin_chg->coin_model = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BOARD, 10), NULL, 0); + coin_chg->coin_model = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 10), NULL, 0); BoardModelPosSetV(coin_chg->sign_model, pos); BoardModelPosSetV(coin_chg->tens_model, pos); BoardModelPosSetV(coin_chg->ones_model, pos); diff --git a/src/game/board/block.c b/src/game/board/block.c new file mode 100644 index 00000000..f7836acc --- /dev/null +++ b/src/game/board/block.c @@ -0,0 +1,462 @@ +#include "game/flag.h" +#include "game/objsub.h" +#include "game/process.h" +#include "game/board/main.h" +#include "game/board/player.h" +#include "game/board/model.h" +#include "game/board/star.h" +#include "game/board/window.h" +#include "math.h" + +#define BLOCK_SPAWN 0 +#define BLOCK_HIT 2 +#define BLOCK_OPEN 3 + +typedef struct { + struct { + u8 kill : 1; + u8 state : 3; + u8 unk00_field2 : 1; + u8 contains_star : 1; + u8 opened : 1; + u8 unk00_field5 : 1; + }; + + s16 hit_y_velocity; + s16 target_y_pos; +} BlockWork; + +typedef struct { + struct { + u8 kill : 1; + }; + + u8 lifetime; + s8 model_index; + s16 model; +} CoinWork; + +static void BlockProc(void); +static void DestroyBlock(void); +static void ExecBlockObj(omObjData* arg0); +static void CreateBlockObj(s32 arg0); +static void DestroyBlockObj(BlockWork* unused0, omObjData* unused1); +static void SpawnBlock(BlockWork* arg0, omObjData* arg1); +static void HitBlock(BlockWork* arg0, omObjData* arg1); +static void OpenBlock(BlockWork* arg0, omObjData* arg1); +static void SetBlockOpen(void); +static void SetBlockStop(void); +static void WaitBlockHit(void); +static void CreateCoinMdl(void); +static void KillCoinMdl(void); +static void PopupCoin(void); +static void PopupCoinExec(omObjData* arg0); + +extern s8 boardTutorialBlockF; +extern s8 boardTutorialBlockItem; + +static s16 jumpMot = -1; +static s16 starMdl = -1; + +static f32 rotMax; +static f32 scaleAngle; +static f32 rotY; + +static omObjData* blockObj; +static Process* blockProc; + +static s16 coinMdl[10] = { -1, -1, -1, -1 }; +static s32 coinF[10]; + +s32 BoardBlockExec(s32 arg0) { + if (BoardPlayerSizeGet(arg0) == 2) { + return 0; + } + + blockProc = HuPrcChildCreate(BlockProc, 0x2003, 0x3800U, 0, boardMainProc); + HuPrcDestructorSet2(blockProc, DestroyBlock); + + while (blockProc != NULL) { + HuPrcVSleep(); + } + + return 0; +} + +static void BlockProc(void) { + s32 sp14[8] = {0x005F0060, 0x001A0060, 0x006D0060, 0x008A0060, 0x00850060, 0x00110060, 0x000D0060, 0x00810060}; + Point3d sp8; + s32 var_r28; + s32 i; + s32 player; + BlockWork* work; + s32* temp_r4; + s32 player_character; + + player = GWSystem.player_curr; + + player_character = GWPlayer[player].character; + jumpMot = BoardPlayerMotionCreate(player, sp14[player_character]); + BoardRotateDiceNumbers(player); + BoardPlayerMotBlendSet(player, 0, 0xF); + omVibrate(player, 12, 12, 0); + CreateBlockObj(player); + + work = OM_GET_WORK_PTR(blockObj, BlockWork); + while (work->state != BLOCK_HIT) { + HuPrcVSleep(); + } + + BoardCameraViewSet(3); + BoardCameraMotionWait(); + BoardWinCreate(0, 0x10000, -1); + BoardWinWait(); + BoardWinKill(); + BoardPlayerMotionShiftSet(player, 0xB, 0, 8.0, 0.0); + HuPrcSleep(9); + while (BoardPlayerMotionTimeGet(player) < 30.0f) { + HuPrcVSleep(); + } + HuAudFXPlay(0x30C); + SetBlockOpen(); + while (BoardPlayerMotionEndCheck(player) == 0) { + HuPrcVSleep(); + } + BoardRotateDiceNumbers(player); + + if (work->contains_star != 0) { + SetBlockStop(); + BoardModelPosGet(starMdl, &sp8); + if (_CheckFlag(0x1000B) == 0) { + BoardAudSeqPause(0, 1, 0x3E8); + } + BoardStarGive(player, &sp8); + if (_CheckFlag(0x1000B) == 0) { + BoardAudSeqPause(0, 0, 0x3E8); + } + } else { + for (i = 0; i < 0x14; i++) { + WaitBlockHit(); + BoardPlayerMotionStart(player, (s32) jumpMot, 0); + BoardPlayerMotionSpeedSet(player, 2); + while (BoardPlayerMotionTimeGet(player) < 4) { + HuPrcVSleep(); + } + SetBlockOpen(); + PopupCoin(); + while (BoardPlayerMotionEndCheck(player) == 0) { + HuPrcVSleep(); + } + BoardPlayerMotionStart(player, 1, 0); + BoardPlayerCoinsAdd(player, 1); + HuAudFXPlay(7); + HuPrcVSleep(); + } + + SetBlockStop(); + } + + BoardWinCreate(0, work->contains_star != 0 ? 0x10001 : 0x10002, -1); + BoardWinWait(); + BoardWinKill(); + KillCoinMdl(); + work->kill = 1; + + BoardRotateDiceNumbers((s32) player); + HuPrcVSleep(); + + if ((_CheckFlag(0x1000B) != 0) && work->contains_star == 0) { + BoardTutorialHookExec(0x16, 0); + } + + BoardCameraViewSet(2); + BoardCameraMotionWait(); + HuPrcEnd(); +} + +static void DestroyBlock(void) { + if (jumpMot != -1) { + BoardPlayerMotionKill(GWSystem.player_curr, jumpMot); + jumpMot = -1; + } + KillCoinMdl(); + blockProc = 0; +} + +static void CreateBlockObj(s32 arg0) { + Point3d player_pos; + BlockWork* work; + s8 contains_star; + + BoardPlayerPosGet(arg0, &player_pos); + starMdl = BoardModelCreate(0x70004, NULL, 0); + BoardModelVisibilitySet(starMdl, 0); + BoardModelMotionSpeedSet(starMdl, 0); + BoardModelLayerSet(starMdl, 2U); + + blockObj = omAddObjEx(boardObjMan, 0x101, 0U, 0U, -1, ExecBlockObj); + + work = OM_GET_WORK_PTR(blockObj, BlockWork); + work->kill = 0; + work->unk00_field2 = 0; + work->opened = 0; + work->unk00_field5 = 0; + work->state = BLOCK_SPAWN; + + blockObj->trans.x = player_pos.x; + blockObj->trans.y = 270 + player_pos.y; + blockObj->trans.z = player_pos.z; + + blockObj->scale.x = blockObj->scale.y = blockObj->scale.z = 0.01; + blockObj->rot.x = blockObj->rot.y = blockObj->rot.z = 0.0; + + scaleAngle = 0; + rotY = 0; + rotMax = 30; + + BoardModelVisibilitySet(starMdl, 1); + + if (BoardRandFloat() > 0.5f) { + contains_star = 0; + } else { + contains_star = 1; + } + + work->contains_star = contains_star; + + if (boardTutorialBlockF != 0) { + work->contains_star = boardTutorialBlockItem; + boardTutorialBlockF = 0; + } + + HuAudFXPlay(0x302); + + if (work->contains_star == 0) { + CreateCoinMdl(); + } +} + +static void ExecBlockObj(omObjData* arg0) { + BlockWork* work; + + work = OM_GET_WORK_PTR(arg0, BlockWork); + + if (work->kill != 0 || BoardIsKill() != 0) { + DestroyBlockObj(work, arg0); + blockObj = 0; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + + switch (work->state) { + case BLOCK_SPAWN: + SpawnBlock(work, arg0); + break; + case BLOCK_HIT: + HitBlock(work, arg0); + break; + case BLOCK_OPEN: + OpenBlock(work, arg0); + break; + } + + if (work->unk00_field5 != 0) { + BoardModelVisibilitySet(starMdl, 0); + } + + BoardModelPosSet(starMdl, arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotSet(starMdl, arg0->rot.x, arg0->rot.y, arg0->rot.z); + BoardModelScaleSet(starMdl, arg0->scale.x, arg0->scale.y, arg0->scale.z); +} + +static void DestroyBlockObj(BlockWork* unused0, omObjData* unused1) { + if (starMdl != -1) { + BoardModelKill(starMdl); + starMdl = -1; + } +} + +static void SpawnBlock(BlockWork* arg0, omObjData* arg1) { + if (scaleAngle < 90.0f) { + scaleAngle += 3.75f; + if (scaleAngle > 90.0f) { + scaleAngle = 90.0f; + } + } else { + rotMax *= 0.5f; + if (rotMax < 0.8f) { + rotY = 0.0f; + rotMax = 0.0f; + arg0->hit_y_velocity = 0; + arg0->state = BLOCK_HIT; + } + } + + if (rotY < 360.0f) { + rotY += rotMax; + if (rotY > 360.0f) { + rotY = 360.0f; + } + } + + arg1->rot.y = rotY; + arg1->scale.x = arg1->scale.y = arg1->scale.z = sin(M_PI * scaleAngle / 180.0); +} + +static void HitBlock(BlockWork* arg0, omObjData* arg1) { + float var_f30; + + arg0->hit_y_velocity += 3; + if (arg0->hit_y_velocity > 0x168) { + arg0->hit_y_velocity -= 0x168; + } + + OSs16tof32(&arg0->hit_y_velocity, &var_f30); + arg1->trans.y += 0.2f * sin((M_PI * var_f30) / 180.0); +} + +static void OpenBlock(BlockWork* arg0, omObjData* arg1) { + f32 target_y_pos; + + if (arg0->opened == 0) { + arg0->opened = 1; + HuAudFXPlay(0x33B); + BoardModelMotionStart(starMdl, 0, 0); + } + + if (arg0->unk00_field2 == 0) { + OSf32tos16(&arg1->trans.y, &arg0->target_y_pos); + + arg1->trans.y += 80.0f; + arg0->unk00_field2 = 1; + } else { + OSs16tof32(&arg0->target_y_pos, &target_y_pos); + arg1->trans.y += -8.0f; + + if (arg1->trans.y < target_y_pos) { + arg1->trans.y = target_y_pos; + arg0->state = BLOCK_HIT; + } + } +} + +static void SetBlockOpen(void) { + BlockWork* work; + + work = OM_GET_WORK_PTR(blockObj, BlockWork); + work->state = BLOCK_OPEN; +} + +static void SetBlockStop(void) { + BlockWork* work; + + work = OM_GET_WORK_PTR(blockObj, BlockWork); + work->unk00_field5 = 1; +} + +static void WaitBlockHit(void) { + BlockWork* work; + + work = OM_GET_WORK_PTR(blockObj, BlockWork); + + while (work->state != BLOCK_HIT) { + HuPrcVSleep(); + } +} + +static void CreateCoinMdl(void) { + s32 i; + + for (i = 0; i < 10; i += 1) { + coinMdl[i] = BoardModelCreate(0x7000A, NULL, 1); + BoardModelVisibilitySet(coinMdl[i], 0); + coinF[i] = 0; + } +} + +static void KillCoinMdl(void) { + s32 i; + + for (i = 0; i < 0xA; i += 1) { + if (coinMdl[i] != -1) { + BoardModelKill(coinMdl[i]); + coinMdl[i] = -1; + } + coinF[i] = 0; + } +} + +static inline s32 FindCoinModel(s16 *out_model) { + s32 i; + + for (i = 0; i < 10; i++) { + if (coinF[i] == 0) { + *out_model = coinMdl[i]; + return i; + } + } + + return -1; +} + +static void PopupCoin(void) { + Point3d star_pos; + omObjData* coinObj; + s32 model_index; + s16 model; + CoinWork* work; + + do { + HuPrcVSleep(); + model_index = FindCoinModel(&model); + } while (model_index == -1); + + coinObj = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, PopupCoinExec); + work = OM_GET_WORK_PTR(coinObj, CoinWork); + + work->kill = 0; + work->lifetime = 10; + work->model = model; + work->model_index = model_index; + + coinObj->trans.x = 15.0f; + coinObj->trans.y = 40.0f; + + BoardModelPosGet(starMdl, &star_pos); + BoardModelPosSetV(work->model, &star_pos); + BoardModelVisibilitySet(work->model, 1); +} + +static void PopupCoinExec(omObjData* obj) { + Point3d coin_pos; + Point3d coin_rot; + CoinWork* work; + + work = OM_GET_WORK_PTR(obj, CoinWork); + + if (work->kill != 0 || BoardIsKill() != 0) { + BoardModelVisibilitySet(work->model, 0); + coinF[work->model_index] = 0; + omDelObjEx(HuPrcCurrentGet(), obj); + return; + } + + if (work->lifetime != 0) { + work->lifetime -= 1; + } else { + work->kill = 1; + return; + } + + BoardModelPosGet(work->model, &coin_pos); + coin_pos.y += obj->trans.y; + BoardModelPosSetV(work->model, &coin_pos); + BoardModelRotGet(work->model, &coin_rot); + coin_rot.y += obj->trans.x; + + if (coin_rot.y > 360.0f) { + coin_rot.y -= 360.0f; + } + + BoardModelRotSetV(work->model, &coin_rot); +} diff --git a/src/game/board/boo.c b/src/game/board/boo.c new file mode 100755 index 00000000..5299df98 --- /dev/null +++ b/src/game/board/boo.c @@ -0,0 +1,1487 @@ +#include "game/board/boo.h" +#include "game/audio.h" +#include "game/chrman.h" +#include "game/gamework.h" +#include "game/gamework_data.h" +#include "game/hsfman.h" +#include "game/objsub.h" +#include "game/pad.h" +#include "game/process.h" +#include "game/window.h" +#include "game/board/main.h" +#include "game/board/model.h" +#include "game/board/player.h" +#include "game/board/window.h" + +#include "math.h" + +typedef struct { + struct { + u8 unk00_field0 : 1; + }; + s8 unk01; + s8 unk02; + char unk03[1]; + s16 unk04; + s16 unk06; +} BooEventWork; + +typedef struct { + struct { + s8 unk00_field0 : 1; + }; + s8 unk01; + s16 unk02; + s16 unk04; + s16 unk06; + AnimData *unk08; +} BallWork; + +typedef struct { + struct { + s8 unk00_field0 : 1; + }; + char unk01[1]; + u16 unk02; +} BallCameraWork; + +typedef struct { + s16 unk00; + s16 unk02; + s16 unk04[6]; +} BallPlayerData; // Size 0x10 + +typedef struct { + struct { + s8 unk00_field0 : 1; + u8 unk00_field1 : 1; + }; + s8 unk01; + u8 unk02; +} BallPlayerWork; + +typedef struct { + struct { + s8 unk00_field0 : 1; + u8 unk00_field1 : 4; + u8 unk00_field2 : 1; + }; + u8 unk01; + u8 unk02; + char unk03[1]; + s16 unk04; + char unk06[2]; + float unk08; +} BallBooWork; + +typedef struct { + /* 0x00 */ s16 unk00; + /* 0x02 */ char unk02[2]; + /* 0x04 */ Vec unk04; + /* 0x10 */ Vec unk10; + /* 0x1C */ Vec unk1C; + /* 0x28 */ char unk28[4]; +} BallTakeCoinData; // Size 0x2C + +typedef struct { + struct { + u8 unk00_field0 : 1; + }; + u8 unk01; + s16 unk02; + float unk04; +} BallTakeCoinWork; + +void BoardSpaceCameraSet(u16); + +static void ComSetupStealPlayer(s32 arg0); +static void ComSetStealPlayerInput(s32 arg0, s32 arg1); +static void ExecCoinSteal(void); +static void ExecStarSteal(void); +static void ExecLightSteal(void); +static void SetBooMode(s32 arg0); +static void CreateBallMdl(s16 *arg0, Vec *arg1); +static void CreateBallView(void); +static void SetBallView(s32 arg0); +static void SetBallActive(s32 arg0); +static s32 CheckBallKill(void); +static void BallMain(omObjData *arg0); +static void BallRenderHook(void); +static void ExecBoo(omObjData *arg0); +static void UpdateBallCamera(omObjData *arg0); +static void CreateBallPlayer(void); +static s32 GetBallPlayerState(void); +static void SetBallPlayerState(s32 arg0); +static void ExecBallPlayer(omObjData *arg0); +static void BallPlayerZoomOut(omObjData *arg0, BallPlayerWork *arg1); +static void BallPlayerScare(omObjData *arg0, BallPlayerWork *arg1); +static void BallPlayerTurn(omObjData *arg0, BallPlayerWork *arg1); +static void BallPlayerPunch(omObjData *arg0, BallPlayerWork *arg1); +static void BallPlayerUseLight(omObjData *arg0, BallPlayerWork *arg1); +static void BallPlayerCatch(omObjData *arg0, BallPlayerWork *arg1); +static void BallBooCreate(void); +static void SetBallBooState(s32 arg0); +static s32 GetBallBooState(void); +static void ExecBallBoo(omObjData *arg0); +static void BallBooSpawn(omObjData *arg0, BallBooWork *arg1); +static void BallBooChase(omObjData *arg0, BallBooWork *arg1); +static void BallBooBattle(omObjData *arg0, BallBooWork *arg1); +static void BallBooAttack(omObjData *arg0, BallBooWork *arg1); +static void BallBooFlash(omObjData *arg0, BallBooWork *arg1); +static void TakeBallCoin(void); +static void ExecTakeBallCoin(omObjData *arg0); +static void TakeBallCoinPosSet(BallTakeCoinData *arg0, Vec *arg1); +static void UpdatePlayerCoins(void); + +s8 lbl_801D41E2; +static s8 stealTarget; +static s8 stealType; +static s32 booKillF; +static u8 stealValue; +static u8 stealSuccess; +static u8 punchCount; +static s8 stealAvail[3]; +static s8 starChoiceEnable[3]; +static s32 battleTimer; +static s32 attackTimer; +static omObjData *ballTakeCoinObj; +static omObjData *ballPlayerObj; +static omObjData *ballBooObj; +static omObjData *ballCameraObj; +static omObjData *ballObj; +static omObjData *booEventObj; + +static s32 booPlayerMotTbl[8][6] = { + { 0x0009000B, 0x00090013, 0x0009001B, 0x00090023, 0x0009002B, 0x00090033 }, + { 0x0009000C, 0x00090014, 0x0009001C, 0x00090024, 0x0009002C, 0x00090034 }, + { 0x0009000D, 0x00090015, 0x0009001D, 0x00090025, 0x0009002D, 0x00090035 }, + { 0x0009000E, 0x00090016, 0x0009001E, 0x00090026, 0x0009002E, 0x00090036 }, + { 0x0009000F, 0x00090017, 0x0009001F, 0x00090027, 0x0009002F, 0x00090037 }, + { 0x00090010, 0x00090018, 0x00090020, 0x00090028, 0x00090030, 0x00090038 }, + { 0x00090011, 0x00090019, 0x00090021, 0x00090029, 0x00090031, 0x00090039 }, + { 0x00090012, 0x0009001A, 0x00090022, 0x0009002A, 0x00090032, 0x0009003A } +}; + +static s32 booSfxTbl[4][8] = { + { + 0x0000012F, 0x0000016F, 0x000001AF, 0x000001EF, + 0x0000022F, 0x0000026F, 0x000002AF, 0x000002EF, + }, + { + 0x00000130, 0x00000170, 0x000001B0, 0x000001F0, + 0x00000230, 0x00000270, 0x000002B0, 0x000002F0 + }, + { + 0x00000131, 0x00000171, 0x000001B1, 0x000001F1, + 0x00000231, 0x00000271, 0x000002B1, 0x000002F1, + }, + { + 0x00000123, 0x00000163, 0x000001A3, 0x000001E3, + 0x00000223, 0x00000263, 0x000002A3, 0x000002E3 + } +}; + +static s32 hostMess[] = { + 0x0007000E, + 0x00070014, + 0x0007001A, + 0x00070020, + 0x00070026, + 0x0007002C +}; + +static s32 ballMdlTbl[] = { + 0x00090002, + 0x00090006 +}; + +s16 BoardBooCreate(s32 arg0, Vec *arg1) { + BooEventWork *temp_r31; + Vec spC; + + if (arg1) { + spC = *arg1; + } else { + spC.x = spC.y = spC.z = 0.0f; + } + booEventObj = omAddObjEx(boardObjMan, 0x1000, 0, 0, -1, ExecBoo); + temp_r31 = OM_GET_WORK_PTR(booEventObj, BooEventWork); + temp_r31->unk00_field0 = 0; + temp_r31->unk01 = 0; + temp_r31->unk02 = arg0; + booKillF = 0; + stealTarget = -1; + lbl_801D41E2 = 0; + punchCount = 0; + stealValue = 0; + stealSuccess = 0; + booEventObj->trans.x = spC.x; + booEventObj->trans.y = spC.y; + booEventObj->trans.z = spC.z; + CreateBallMdl(&temp_r31->unk04, &spC); + return temp_r31->unk04; +} + +void BoardBooKill(void) { + booKillF = 1; + if (booEventObj) { + OM_GET_WORK_PTR(booEventObj, BooEventWork)->unk00_field0 = 1; + } +} + +s32 BoardBooStealTypeSet(s32 arg0) { + BooEventWork *temp_r29 = OM_GET_WORK_PTR(booEventObj, BooEventWork); + s32 var_r25; + s32 var_r27; + s32 var_r26; + s32 var_r28; + s32 var_r30; + s32 i; + + stealType = arg0; + for (var_r26 = var_r30 = i = 0; i < 4; i++) { + if (i != temp_r29->unk02) { + var_r27 = i; + stealAvail[var_r30] = var_r27; + if ((stealType == 0 && BoardPlayerCoinsGet(var_r27) == 0) || (stealType == 1 && GWStarsGet(var_r27) == 0)) { + starChoiceEnable[var_r30] = 0; + } else { + starChoiceEnable[var_r30] = 1; + var_r26++; + } + var_r30++; + } + } + if (var_r26 == 0) { + stealType = -1; + return 0; + } + if (_CheckFlag(0x10018)) { + var_r25 = BoardWinPortraitGet(); + var_r28 = hostMess[GWBoardGet()]; + } else { + var_r25 = 3; + var_r28 = 0x120019; + } + BoardWinCreateChoice(1, var_r28, var_r25, 0); + BoardWinAttrSet(0x10); + if (stealType == 0) { + var_r28 = 0x70030; + } else { + var_r28 = 0x70031; + } + BoardWinInsertMesSet(var_r28, 0); + for (i = 0; i < 3; i++) { + BoardWinInsertMesSet(BoardPlayerGetCharMess(stealAvail[i]), i + 1); + if (starChoiceEnable[i] == 0) { + BoardWinChoiceDisable(i); + } + } + if (GWPlayer[temp_r29->unk02].com) { + ComSetupStealPlayer(temp_r29->unk02); + } + BoardWinWait(); + stealTarget = BoardWinChoiceGet(); + if (stealTarget == 3) { + stealTarget = -1; + while (stealTarget == -1) { + var_r30 = BoardRandMod(3); + if (starChoiceEnable[var_r30] != 0) { + stealTarget = stealAvail[var_r30]; + } + } + } else { + stealTarget = stealAvail[stealTarget]; + } + BoardWinKill(); + CreateBallView(); + SetBallView(1); +} + +static void ComSetupStealPlayer(s32 arg0) { + s32 var_r25; + s32 var_r26; + s32 var_r29; + s32 temp_r28; + s32 var_r27; + s32 var_r30; + s32 var_r24; + s32 var_r22; + s32 i; + s16 sp8[3]; + + switch (GWPlayer[arg0].diff) { + case 0: + var_r29 = 0x5F; + break; + case 1: + var_r29 = 0x32; + break; + case 2: + var_r29 = 5; + break; + case 3: + var_r29 = 0; + break; + } + var_r22 = BoardRandMod(0x64); + if (var_r22 >= var_r29) { + var_r24 = 1; + } else { + var_r24 = 0; + } + for (i = 0; i < 3; i++) { + temp_r28 = stealAvail[i]; + if (stealType == 1) { + var_r30 = GWStarsGet(temp_r28); + } else { + var_r30 = BoardPlayerCoinsGet(temp_r28); + } + if (starChoiceEnable[i] == 0) { + var_r30 = -1; + } + if ((s32) GWSystem.team != 0 && temp_r28 == BoardPlayerSameTeamFind(arg0)) { + var_r30 = 0; + } + if (BoardPlayerItemFind(temp_r28, 8) != -1 && var_r24 != 0) { + var_r30 = 0; + } + sp8[i] = var_r30; + } + var_r25 = var_r27 = -1; + for (var_r26 = i = 0; i < 3; i++) { + var_r30 = sp8[i]; + if (var_r30 != -1) { + if (var_r30 > 0 && var_r30 >= var_r25) { + var_r25 = var_r30; + var_r27 = var_r26; + } + var_r26++; + } + } + if (var_r27 == -1) { + var_r27 = 0; + } + ComSetStealPlayerInput(arg0, var_r27); +} + +static void ComSetStealPlayerInput(s32 arg0, s32 arg1) { + s32 spC[4]; + s32 temp_r30; + s32 i; + s16 temp_r29; + + spC[0] = spC[1] = spC[2] = spC[3] = 0; + temp_r30 = GWPlayer[arg0].port; + temp_r29 = GWMessDelayGet(); + spC[temp_r30] = 4; + if (arg1 != 0) { + for (i = 0; i < arg1; i++) { + HuWinComKeyWait(spC[0], spC[1], spC[2], spC[3], temp_r29); + } + } + spC[temp_r30] = 0x100; + HuWinComKeyWait(spC[0], spC[1], spC[2], spC[3], temp_r29); +} + +s32 BoardBooStealMain(void) { + BooEventWork *sp8; + s32 var_r31; + s32 var_r30; + + stealType == -1; + sp8 = OM_GET_WORK_PTR(booEventObj, BooEventWork); + if (stealType == 0) { + SetBooMode(2); + } else { + SetBooMode(1); + } + var_r31 = BoardPlayerItemFind(stealTarget, 8); + if (var_r31 != -1) { + stealType = 2; + BoardPlayerItemRemove(stealTarget, var_r31); + var_r30 = 0x70004; + } else { + var_r30 = 0x70003; + } + BoardCameraMotionWait(); + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if (stealTarget != var_r31) { + BoardModelVisibilitySet(BoardPlayerModelGet(var_r31), 0); + } + } + CreateBallPlayer(); + omVibrate(stealTarget, 0xC, 4, 2); + SetBallActive(1); + while (!CheckBallKill()) { + HuPrcVSleep(); + } + if (stealType == 0) { + BoardWinCreate(2, var_r30, -1); + BoardWinInsertMesSet(BoardPlayerGetCharMess(stealTarget), 0); + BoardWinPause(); + } + switch (stealType) { + case 0: + ExecCoinSteal(); + break; + case 1: + ExecStarSteal(); + break; + case 2: + ExecLightSteal(); + break; + } + BoardWinKill(); + SetBallActive(-1); + while (!CheckBallKill()) { + HuPrcVSleep(); + } + booKillF = 1; + SetBallView(0); + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if (stealTarget != var_r31) { + BoardModelVisibilitySet(BoardPlayerModelGet(var_r31), 1); + } + } + HuPrcSleep(2); + if (stealType == 2) { + return 0; + } else { + return 1; + } +} + +static void ExecCoinSteal(void) { + while (GetBallPlayerState() != 2) { + HuPrcVSleep(); + } + BallBooCreate(); + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } + while (GetBallPlayerState() != 0) { + HuPrcVSleep(); + } + SetBallBooState(2); + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } + SetBallPlayerState(4); + SetBallBooState(3); + punchCount = 0; + HuPrcSleep(0x78); + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } + while (GetBallPlayerState() != 0) { + HuPrcVSleep(); + } +} + +static void ExecStarSteal(void) { + while (GetBallPlayerState() != 2) { + HuPrcVSleep(); + } + BallBooCreate(); + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } + while (GetBallPlayerState() != 0) { + HuPrcVSleep(); + } + SetBallBooState(2); + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } + SetBallBooState(4); + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } + while (GetBallPlayerState() != 0) { + HuPrcVSleep(); + } +} + +static void ExecLightSteal(void) { + while (GetBallPlayerState() != 0) { + HuPrcVSleep(); + } + BallBooCreate(); + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } + SetBallBooState(2); + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } + SetBallPlayerState(6); + while (GetBallPlayerState() != 0) { + HuPrcVSleep(); + } + while (GetBallBooState() != 0) { + HuPrcVSleep(); + } +} + +static void SetBooMode(s32 arg0) { + OM_GET_WORK_PTR(booEventObj, BooEventWork)->unk01 = arg0; +} + +static void CreateBallMdl(s16 *arg0, Vec *arg1) { + s32 i; + + for (i = 0; i < 2; i++) { + arg0[i] = BoardModelCreate(ballMdlTbl[i], NULL, 0); + BoardModelPosSetV(arg0[i], arg1); + } + BoardModelMotionStart(arg0[0], 0, 0x40000001); + BoardModelHookSet(arg0[0], "sui", arg0[1]); + BoardModelPosSet(arg0[1], 0.0f, 0.0f, 0.0f); + BoardModelVisibilitySet(arg0[1], 1); +} + +static void CreateBallView(void) { + AnimBmpData *temp_r29; + BooEventWork *temp_r28; + BallWork *temp_r31; + BallCameraWork *temp_r30; + + temp_r28 = OM_GET_WORK_PTR(booEventObj, BooEventWork); + ballObj = omAddObjEx(boardObjMan, 0x1001, 0, 0, -1, BallMain); + temp_r31 = OM_GET_WORK_PTR(ballObj, BallWork); + temp_r31->unk00_field0 = 0; + temp_r31->unk08 = HuSprAnimMake(0x50, 0x50, 2); + temp_r29 = temp_r31->unk08->bmp; + temp_r29->data = HuMemDirectMallocNum(HEAP_SYSTEM, 0x3200, MEMORY_DEFAULT_NUM); + memset(temp_r29->data, 0, 0x3200); + temp_r31->unk04 = Hu3DHookFuncCreate((void*) BallRenderHook); + Hu3DModelLayerSet(temp_r31->unk04, 3); + Hu3DModelCameraSet(temp_r31->unk04, 1); + temp_r31->unk06 = Hu3DProjectionCreate(temp_r31->unk08, 25.0f, 100.0f, 13000.0f); + Hu3DModelProjectionSet(BoardModelIDGet(temp_r28->unk06), temp_r31->unk06); + Hu3DProjectionTPLvlSet(temp_r31->unk06, 0.0f); + ballCameraObj = omAddObjEx(boardObjMan, 0x7E03, 0, 0, -1, UpdateBallCamera); + temp_r30 = OM_GET_WORK_PTR(ballCameraObj, BallCameraWork); + temp_r30->unk00_field0 = 0; + temp_r30->unk02 = 1; + ballCameraObj->rot.x = -8.0f; + ballCameraObj->rot.y = 80.0f; + ballCameraObj->rot.z = 300.0f; + Hu3DCameraPerspectiveSet(temp_r30->unk02, 25.0f, 10.0f, 2000.0f, 1.2f); + Hu3DCameraScissorSet(temp_r30->unk02, 0, 0, 0xA0, 0xA0); + Hu3DCameraViewportSet(temp_r30->unk02, 0.0f, 0.0f, 160.0f, 160.0f, 0.0f, 1.0f); +} + +static void SetBallView(s32 arg0) { + u16 var_r31; + s32 i; + + if (arg0 != 0) { + var_r31 = 2; + } else { + Hu3DCameraPerspectiveSet(2, -1.0f, 0.0f, 0.0f, 0.0f); + var_r31 = 1; + } + for (i = 0; i < 4; i++) { + BoardPlayerCameraSet(i, var_r31); + } + BoardSpaceCameraSet(var_r31); + BoardModelCameraSetAll(var_r31); + BoardCameraMaskSet((u16) var_r31); + BoardCameraScissorSet(0, 0, 0x280, 0x1E0); +} + +static void SetBallActive(s32 arg0) { + BallWork *temp_r31 = OM_GET_WORK_PTR(ballObj, BallWork); + + temp_r31->unk01 = arg0 * 8; +} + +static s32 CheckBallKill(void) { + BallWork *temp_r31; + + if (!ballObj) { + return 1; + } + temp_r31 = OM_GET_WORK_PTR(ballObj, BallWork); + if (temp_r31->unk01 != 0) { + return 0; + } else { + return 1; + } +} + +static void BallMain(omObjData *arg0) { + BallWork *temp_r30 = OM_GET_WORK_PTR(arg0, BallWork); + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + float temp_f30; + float var_f29; + s16 *temp_r29; + + if (booKillF != 0 || BoardIsKill() != 0) { + temp_r29 = (s16*) &OM_GET_WORK_PTR(booEventObj, BooEventWork)->unk04; + Hu3DModelProjectionReset(BoardModelIDGet(temp_r29[1]), temp_r30->unk06); + Hu3DProjectionKill(temp_r30->unk06); + Hu3DModelKill(temp_r30->unk04); + ballObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + temp_f30 = 240.0f; + BoardCameraRotGet(&sp20); + BoardCameraTargetGet(&sp2C); + sp8.x = sp2C.x + sin(sp20.y * M_PI / 180.0) * cos(sp20.x * M_PI / 180.0) * temp_f30; + sp8.y = sp2C.y + -sin(sp20.x * M_PI / 180.0) * temp_f30; + sp8.z = sp2C.z + cos(sp20.y * M_PI / 180.0) * cos(sp20.x * M_PI / 180.0) * temp_f30; + sp14.x = sin(sp20.y * M_PI / 180.0) * sin(sp20.x * M_PI / 180.0); + sp14.y = cos(sp20.x * M_PI / 180.0); + sp14.z = cos(sp20.y * M_PI / 180.0) * sin(sp20.x * M_PI / 180.0); + if (temp_r30->unk01 != 0) { + temp_r30->unk02 += temp_r30->unk01; + if (temp_r30->unk02 > 0xFF) { + temp_r30->unk02 = 0xFF; + temp_r30->unk01 = 0; + } else if (temp_r30->unk02 < 0) { + temp_r30->unk02 = 0; + temp_r30->unk01 = 0; + } + } + Hu3DProjectionPosSet(temp_r30->unk06, &sp8, &sp14, &sp2C); + OSs16tof32(&temp_r30->unk02, &var_f29); + var_f29 = var_f29 * 0.003921569f; + Hu3DProjectionTPLvlSet(temp_r30->unk06, var_f29); +} + +static void BallRenderHook(void) { + BallWork *temp_r31; + GXColor sp10; + Vec sp2C; + Vec sp20; + Vec sp14; + Mtx44 sp68; + Mtx sp38; + + if (!ballObj) { + return; + } + temp_r31 = OM_GET_WORK_PTR(ballObj, BallWork); + sp10.a = sp10.r = sp10.g = sp10.b = 0; + GXSetCopyClear(sp10, -1); + GXSetTexCopySrc(0, 0, 0xA0, 0xA0); + GXSetTexCopyDst(0x50, 0x50, GX_TF_RGB5A3, GX_TRUE); + GXCopyTex(temp_r31->unk08->bmp->data, GX_TRUE); + DCFlushRange(temp_r31->unk08->bmp->data, 0x3200); + GXPixModeSync(); + C_MTXPerspective(sp68, 25.0f, 1.2f, 100.0f, 13000.0f); + GXSetProjection(sp68, GX_PERSPECTIVE); + GXSetViewport(0.0f, 0.0f, 160.0f, 160.0f, 0.0f, 1.0f); + GXSetScissor(0, 0, 0xA0, 0xA0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_TEX_ST, GX_RGBA6, 0); + sp10.r = 0; + sp10.g = 0; + sp10.b = 0; + sp10.a = 0xFF; + GXSetTevColor(GX_TEVREG0, sp10); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + GXSetCullMode(GX_CULL_NONE); + GXSetColorUpdate(GX_FALSE); + GXSetAlphaUpdate(GX_FALSE); + GXSetZMode(GX_TRUE, GX_ALWAYS, GX_TRUE); + sp2C.x = 0.0f; + sp2C.y = 0.0f; + sp2C.z = 100.0f; + sp14.x = 0.0f; + sp14.y = 0.0f; + sp14.z = 0.0f; + sp20.x = 0.0f; + sp20.y = 1.0f; + sp20.z = 0.0f; + C_MTXLookAt(sp38, &sp2C, &sp20, &sp14); + GXLoadPosMtxImm(sp38, GX_PNMTX0); + sp2C.x = sin(5 * M_PI / 72) * 20000.0 * 1.2000000476837158; + sp2C.y = sin(5 * M_PI / 72) * 20000.0 * 0.8333333134651184; + sp2C.z = -9000.0f; + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition3f32(-sp2C.x, -sp2C.y, sp2C.z); + GXPosition3f32(sp2C.x, -sp2C.y, sp2C.z); + GXPosition3f32(sp2C.x, sp2C.y, sp2C.z); + GXPosition3f32(-sp2C.x, sp2C.y, sp2C.z); + GXEnd(); + GXSetColorUpdate(GX_TRUE); + GXSetAlphaUpdate(GX_TRUE); + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); +} + +static void ExecBoo(omObjData *arg0) { + BooEventWork *temp_r30 = OM_GET_WORK_PTR(arg0, BooEventWork); + s32 i; + + if (temp_r30->unk00_field0 != 0 || BoardIsKill()) { + for (i = 0; i < 2; i++) { + BoardModelKill(((s16*) ((u8*) temp_r30 + 4))[i]); + } + BoardWinKill(); + booEventObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } +} + +static void UpdateBallCamera(omObjData *arg0) { + BallCameraWork *var_r30 = OM_GET_WORK_PTR(arg0, BallCameraWork); + Vec sp20; + Vec sp14; + Vec sp8; + + if (booKillF != 0 || BoardIsKill()) { + ballCameraObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + sp20.x = arg0->trans.x; + sp20.y = arg0->trans.y + arg0->rot.y; + sp20.z = arg0->trans.z; + sp14.x = sp20.x + sin(0.0) * cos(arg0->rot.x * M_PI / 180.0) * arg0->rot.z; + sp14.y = sp20.y + -sin(arg0->rot.x * M_PI / 180.0) * arg0->rot.z; + sp14.z = sp20.z + cos(0.0) * cos(arg0->rot.x * M_PI / 180.0) * arg0->rot.z; + sp8.x = sin(0.0) * sin(arg0->rot.x * M_PI / 180.0); + sp8.y = cos(arg0->rot.x * M_PI / 180.0); + sp8.z = cos(0.0) * sin(arg0->rot.x * M_PI / 180.0); + Hu3DCameraPosSetV(var_r30->unk02, &sp14, &sp8, &sp20); +} + +static inline void CreateBallPlayerInlineFunc(float x, float y, float z) { + if (ballCameraObj) { + ballCameraObj->trans.x = x; + ballCameraObj->trans.y = y; + ballCameraObj->trans.z = z; + } +} + +static void CreateBallPlayer(void) { + char *temp_r27; + Vec sp8; + s32 temp_r28; + s32 var_r26; + s32 i; + omObjData *temp_r31; + BallPlayerData *temp_r30; + BallPlayerWork *temp_r25; + + ballPlayerObj = temp_r31 = omAddObjEx(boardObjMan, 0x1005, 0, 0, -1, ExecBallPlayer); + temp_r31->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(BallPlayerData), MEMORY_DEFAULT_NUM); + temp_r25 = OM_GET_WORK_PTR(temp_r31, BallPlayerWork); + temp_r25->unk00_field0 = 0; + SetBallPlayerState(1); + temp_r31->trans.x = 0.0f; + temp_r31->trans.y = 0.0f; + temp_r31->trans.z = 0.0f; + BoardPlayerPosGet(stealTarget, &sp8); + temp_r31->scale.x = sp8.x; + temp_r31->scale.y = sp8.y; + temp_r31->scale.z = sp8.z; + temp_r31->rot.x = 300.0f; + temp_r31->rot.y = 750.0f; + temp_r28 = GWPlayer[stealTarget].character; + temp_r30 = temp_r31->data; + for (i = 0; i < 6; i++) { + var_r26 = booPlayerMotTbl[temp_r28][i]; + temp_r30->unk04[i] = BoardPlayerMotionCreate(stealTarget, var_r26); + } + if (stealType == 2) { + temp_r30->unk00 = BoardModelCreate(0x70076, 0, 0); + temp_r30->unk02 = BoardModelCreate(0x70082, 0, 0); + BoardModelLayerSet(temp_r30->unk00, 0); + BoardModelLayerSet(temp_r30->unk02, 0); + BoardModelCameraSet(temp_r30->unk00, 1); + BoardModelCameraSet(temp_r30->unk02, 1); + BoardModelScaleSet(temp_r30->unk00, 0.4f, 0.4f, 0.4f); + temp_r27 = CharModelHookNameGet(temp_r28, 2, 0); + BoardModelHookSet(temp_r30->unk00, "b00p_item30", temp_r30->unk02); + BoardModelHookSet(BoardPlayerModelGet(stealTarget), temp_r27, temp_r30->unk00); + } else { + temp_r30->unk00 = -1; + temp_r30->unk02 = -1; + } + if (stealType != 2) { + BoardPlayerMotionStart(stealTarget, temp_r30->unk04[1], 0x40000001); + } else { + BoardPlayerMotionStart(stealTarget, temp_r30->unk04[3], 0x40000001); + } + BoardPlayerPosSet(stealTarget, temp_r31->trans.x, temp_r31->trans.y, temp_r31->trans.z); + BoardPlayerLayerSet(stealTarget, 0); + BoardPlayerCameraSet(stealTarget, 1); + if (ballCameraObj) { + ballCameraObj->rot.x = -8.0f; + ballCameraObj->rot.y = 80.0f; + ballCameraObj->rot.z = 300.0f; + } + CreateBallPlayerInlineFunc(temp_r31->trans.x, temp_r31->trans.y, temp_r31->trans.z); +} + +static s32 GetBallPlayerState(void) { + BallPlayerWork *temp_r31 = OM_GET_WORK_PTR(ballPlayerObj, BallPlayerWork); + + return temp_r31->unk01; +} + +static void SetBallPlayerState(s32 arg0) { + BallPlayerWork *temp_r31 = OM_GET_WORK_PTR(ballPlayerObj, BallPlayerWork); + + temp_r31->unk01 = arg0; + temp_r31->unk02 = 0; +} + +static void ExecBallPlayer(omObjData *arg0) { + BallPlayerWork *temp_r30 = OM_GET_WORK_PTR(arg0, BallPlayerWork); + BallPlayerData *temp_r29 = arg0->data; + BallWork *temp_r27; + s32 i; + + if (booKillF != 0 || BoardIsKill()) { + BoardPlayerPosSet(stealTarget, arg0->scale.x, arg0->scale.y, arg0->scale.z); + BoardPlayerRotYSet(stealTarget, 0.0f); + BoardPlayerLayerSet(stealTarget, 0); + BoardPlayerCameraSet(stealTarget, 1); + BoardModelHookReset(temp_r29->unk00); + BoardModelHookReset(BoardPlayerModelGet(stealTarget)); + BoardModelKill(temp_r29->unk00); + BoardModelKill(temp_r29->unk02); + BoardPlayerMotionStart(stealTarget, 1, 0x40000001); + for (i = 0; i < 6; i++) { + BoardPlayerMotionKill(stealTarget, temp_r29->unk04[i]); + } + if (arg0->data) { + HuMemDirectFree(arg0->data); + arg0->data = NULL; + } + ballPlayerObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + temp_r27 = OM_GET_WORK_PTR(ballObj, BallWork); + if (temp_r27->unk01 == 0) { + switch (temp_r30->unk01) { + case 1: + BallPlayerZoomOut(arg0, temp_r30); + break; + case 3: + BallPlayerScare(arg0, temp_r30); + break; + case 2: + BallPlayerTurn(arg0, temp_r30); + break; + case 4: + BallPlayerPunch(arg0, temp_r30); + break; + case 6: + BallPlayerUseLight(arg0, temp_r30); + break; + case 5: + BallPlayerCatch(arg0, temp_r30); + break; + } + } +} + +static void BallPlayerZoomOut(omObjData *arg0, BallPlayerWork *arg1) { + Vec sp14; + Vec sp8; + float temp_f31; + s32 var_r29; + + arg0->rot.x += 8.0f; + if (arg0->rot.y < arg0->rot.x) { + arg0->rot.x = arg0->rot.y; + sp14.x = arg0->trans.x; + sp14.y = arg0->trans.y; + sp14.z = arg0->trans.z; + sp8.x = sp14.x + 120.0 * sin(-M_PI / 2); + sp8.y = sp14.y; + sp8.z = sp14.z + 120.0 * cos(-M_PI / 2); + BoardPlayerPosLerpStart(stealTarget, &sp14, &sp8, 0x14); + var_r29 = GWPlayer[stealTarget].character; + HuAudFXPlay(booSfxTbl[0][var_r29]); + SetBallPlayerState(3); + } + temp_f31 = arg0->rot.x; + if (ballCameraObj && temp_f31 != -1.0f) { + ballCameraObj->rot.z = temp_f31; + } +} + +static void BallPlayerScare(omObjData *arg0, BallPlayerWork *arg1) { + BallPlayerData *temp_r29; + float temp_f31; + + if (!GWPlayer[stealTarget].moving) { + temp_r29 = arg0->data; + temp_f31 = -BoardPlayerRotYGet(stealTarget); + if (stealType == 2) { + BoardPlayerMotionShiftSet(stealTarget, temp_r29->unk04[3], 0.0f, 10.0f, 0x40000001); + SetBallPlayerState(0); + } else { + BoardPlayerMotBlendSet(stealTarget, temp_f31, 0xF); + SetBallPlayerState(2); + } + } +} + +static void BallPlayerTurn(omObjData *arg0, BallPlayerWork *arg1) { + if (BoardPlayerMotBlendCheck(stealTarget)) { + SetBallPlayerState(0); + arg1->unk00_field1 = 0; + } +} + +static void BallPlayerPunch(omObjData *arg0, BallPlayerWork *arg1) { + BallPlayerData *temp_r29; + s32 temp_r30; + u32 var_r31; + + var_r31 = 0; + temp_r29 = arg0->data; + if (GWPlayer[stealTarget].com) { + temp_r30 = BoardRandMod(0x64); + switch (GWPlayer[stealTarget].diff) { + case 0: + if (temp_r30 > 0x5A) { + var_r31 = 0x100; + } + break; + case 1: + if (temp_r30 > 0x53) { + var_r31 = 0x100; + } + break; + case 2: + if (temp_r30 > 0x4B) { + var_r31 = 0x100; + } + break; + case 3: + if (temp_r30 > 0x44) { + var_r31 = 0x100; + } + break; + } + } else { + var_r31 = HuPadBtnDown[GWPlayer[stealTarget].port] & 0x100; + } + if ((var_r31 & 0x100) && GetBallBooState() == 3 && battleTimer < 0x78) { + punchCount++; + } + if (arg1->unk00_field1 != 0) { + if (BoardPlayerMotionEndCheck(stealTarget)) { + arg1->unk00_field1 = 0; + BoardPlayerMotionStart(stealTarget, 1, 0x40000001); + } + } else { + if (var_r31 & 0x100) { + arg1->unk00_field1 = 1; + BoardPlayerMotionStart(stealTarget, temp_r29->unk04[2], 0); + } + } +} + +static void BallPlayerUseLight(omObjData *arg0, BallPlayerWork *arg1) { + BallPlayerData *temp_r31 = arg0->data; + + switch (arg1->unk02) { + case 0: + BoardModelScaleSet(temp_r31->unk02, 2.5f, 2.5f, 2.5f); + BoardPlayerMotionStart(stealTarget, temp_r31->unk04[4], 0); + arg1->unk02 = 1; + break; + case 1: + if (BoardPlayerMotionEndCheck(stealTarget)) { + SetBallBooState(7); + BoardPlayerMotionStart(stealTarget, temp_r31->unk04[5], 0); + arg1->unk02 = 2; + } + break; + case 2: + if (BoardPlayerMotionEndCheck(stealTarget)) { + SetBallPlayerState(0); + } + break; + } +} + +static void BallPlayerCatch(omObjData *arg0, BallPlayerWork *arg1) { + s32 temp_r28; + BallPlayerData *temp_r27 = arg0->data; + + temp_r28 = GWPlayer[stealTarget].character; + if (arg1->unk02 == 0) { + if (stealType == 0) { + UpdatePlayerCoins(); + HuAudFXPlay(booSfxTbl[2][temp_r28]); + omVibrate(stealTarget, 0xC, 4, 2); + TakeBallCoin(); + } + if (stealType == 1) { + BoardPlayerStarsAdd(stealTarget, -1); + HuAudFXPlay(booSfxTbl[2][temp_r28]); + omVibrate(stealTarget, 0xC, 4, 2); + TakeBallStar(); + } + BoardPlayerMotionShiftSet(stealTarget, temp_r27->unk04[0], 0.0f, 10.0f, 0); + arg1->unk02 = 1; + } + if (stealType == 0) { + if (CheckBallCoinDone()) { + SetBallPlayerState(0); + } + } else { + if (stealType == 1 && CheckTakeBallStarDone()) { + SetBallPlayerState(0); + } + } +} + +static s32 ballBooMdl[] = { + 0x00020013, + 0x00020014, + 0x00020015, + 0x00020016, + 0x00020017, + -1 +}; + +static void BallBooCreate(void) { + BallBooWork *temp_r31; + Vec sp14; + Vec sp8; + float temp_f31; + float var_f30; + float var_f29; + + ballBooObj = omAddObjEx(boardObjMan, 0x1004, 0, 0, -1, ExecBallBoo); + temp_r31 = OM_GET_WORK_PTR(ballBooObj, BallBooWork); + temp_r31->unk00_field0 = 0; + temp_r31->unk00_field2 = 0; + temp_r31->unk01 = 0; + SetBallBooState(1); + temp_r31->unk04 = BoardModelCreate(0x20012, ballBooMdl, 0); + BoardModelAlphaSet(temp_r31->unk04, 0xFF); + BoardModelLayerSet(temp_r31->unk04, 0); + BoardModelCameraSet(temp_r31->unk04, 1); + temp_f31 = BoardPlayerRotYGet(stealTarget); + BoardPlayerPosGet(stealTarget, &sp14); + ballBooObj->trans.x = sp14.x + 240.0 * sin(-temp_f31 * M_PI / 180.0); + ballBooObj->trans.y = sp14.y + 160.0f; + ballBooObj->trans.z = sp14.z + 240.0 * cos(-temp_f31 * M_PI / 180.0); + BoardModelPosSet(temp_r31->unk04, ballBooObj->trans.x, ballBooObj->trans.y, ballBooObj->trans.z); + if (stealType == 2) { + var_f30 = 126.0f; + var_f29 = 80.0f; + } else { + var_f30 = 90.0f; + var_f29 = 100.0f; + } + sp8.x = sp14.x + var_f30 * sin(-temp_f31 * M_PI / 180.0); + sp8.y = sp14.y + var_f29; + sp8.z = sp14.z + var_f30 * cos(-temp_f31 * M_PI / 180.0); + ballBooObj->rot.x = (sp8.x - ballBooObj->trans.x) / 60.0f; + ballBooObj->rot.y = (sp8.y - ballBooObj->trans.y) / 60.0f; + ballBooObj->rot.z = (sp8.z - ballBooObj->trans.z) / 60.0f; + temp_r31->unk02 = 0x3C; + ballBooObj->scale.x = 1.0f; + ballBooObj->scale.z = 1.0f; + sp8.x = sp14.x - ballBooObj->trans.x; + sp8.z = sp14.z - ballBooObj->trans.z; + ballBooObj->scale.y = 180.0 * (atan2(sp8.x, sp8.z) / M_PI); + BoardModelRotYSet(temp_r31->unk04, ballBooObj->scale.y); + BoardModelMotionStart(temp_r31->unk04, 1, 0x40000001); +} + +static void SetBallBooState(s32 arg0) { + BallBooWork *temp_r31 = OM_GET_WORK_PTR(ballBooObj, BallBooWork); + Vec sp8; + + temp_r31->unk00_field1 = arg0; + if (arg0 == 2) { + HuAudFXPlay(0x64); + } + if (arg0 == 4) { + BoardPlayerPosGet(stealTarget, &sp8); + sp8.y += 100.0f; + ballBooObj->rot.x = (sp8.x - ballBooObj->trans.x) / 30.0f; + ballBooObj->rot.y = (sp8.y - ballBooObj->trans.y) / 30.0f; + ballBooObj->rot.z = (sp8.z - ballBooObj->trans.z) / 30.0f; + temp_r31->unk02 = 0x1E; + BoardModelMotionShiftSet(temp_r31->unk04, 1, 0.0f, 10.0f, 0x40000001); + } + if (arg0 == 5) { + HuAudFXPlay(0x64); + temp_r31->unk02 = 0; + } + if (arg0 == 7) { + temp_r31->unk08 = -ballBooObj->scale.y; + HuAudFXPlay(0x64); + BoardModelMotionShiftSet(temp_r31->unk04, 5, 0.0f, 10.0f, 0x40000001); + } + if (arg0 == 3) { + battleTimer = 0; + attackTimer = 0; + } +} + +static s32 GetBallBooState(void) { + BallBooWork *temp_r31 = OM_GET_WORK_PTR(ballBooObj, BallBooWork); + + return temp_r31->unk00_field1; +} + +static void ExecBallBoo(omObjData *arg0) { + BallBooWork *temp_r30 = OM_GET_WORK_PTR(arg0, BallBooWork); + + if (booKillF != 0 || BoardIsKill()) { + BoardModelKill(temp_r30->unk04); + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + if (temp_r30->unk01 != 0) { + temp_r30->unk01--; + return; + } + switch (temp_r30->unk00_field1) { + case 1: + BallBooSpawn(arg0, temp_r30); + break; + case 2: + case 4: + case 6: + BallBooChase(arg0, temp_r30); + break; + case 3: + BallBooBattle(arg0, temp_r30); + break; + case 5: + BallBooAttack(arg0, temp_r30); + break; + case 7: + BallBooFlash(arg0, temp_r30); + break; + } + BoardModelRotYSet(temp_r30->unk04, arg0->scale.y); + BoardModelPosSet(temp_r30->unk04, arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelScaleSet(temp_r30->unk04, arg0->scale.z, arg0->scale.z, arg0->scale.z); +} + +static void BallBooSpawn(omObjData *arg0, BallBooWork *arg1) { + BoardModelAlphaSet(arg1->unk04, 0xFF); + SetBallBooState(0); +} + +static void BallBooChase(omObjData *arg0, BallBooWork *arg1) { + if (arg1->unk02 != 0) { + arg1->unk02--; + arg0->trans.x += arg0->rot.x; + arg0->trans.y += arg0->rot.y; + arg0->trans.z += arg0->rot.z; + } else { + if (arg1->unk00_field1 == 4) { + SetBallBooState(5); + } else { + SetBallBooState(0); + } + BoardModelMotionShiftSet(arg1->unk04, 1, 0.0f, 10.0f, 0x40000001); + } +} + +static void BallBooBattle(omObjData *arg0, BallBooWork *arg1) { + s32 temp_r29; + + battleTimer++; + if (attackTimer != 0) { + attackTimer--; + } + if (battleTimer >= 0x78) { + SetBallBooState(4); + return; + } + if (arg1->unk00_field2 != 0) { + if (BoardModelMotionEndCheck(arg1->unk04)) { + arg1->unk00_field2 = 0; + BoardModelMotionStart(arg1->unk04, 1, 0x40000001); + } + return; + } + if (BoardRandMod(0x64) <= 0x46) { + BoardModelMotionStart(arg1->unk04, 2, 0); + arg1->unk00_field2 = 1; + if (BoardRandMod(0x64) > 0x32 && attackTimer == 0) { + temp_r29 = GWPlayer[stealTarget].character; + HuAudFXPlay(booSfxTbl[1][temp_r29]); + omVibrate(stealTarget, 0xC, 6, 6); + attackTimer = 0x30; + } + } +} + +static void BallBooAttack(omObjData *arg0, BallBooWork *arg1) { + float var_f29; + + if (arg1->unk02 < 0x5A) { + arg1->unk02 += 6; + if (arg1->unk02 >= 0x5A) { + arg1->unk02 = 0x5A; + SetBallBooState(0); + SetBallPlayerState(5); + } + } + OSu8tof32(&arg1->unk02, &var_f29); + arg0->scale.z = 1.0 + sin(var_f29 * M_PI / 180.0); +} + +static void BallBooFlash(omObjData *arg0, BallBooWork *arg1) { + Vec sp8; + float temp_f31; + + if (BoardDAngleCalcRange(&arg0->scale.y, arg1->unk08, 8.0f) != 0) { + SetBallBooState(6); + BoardModelMotionShiftSet(arg1->unk04, 3, 0.0f, 10.0f, 0x40000001); + temp_f31 = BoardPlayerRotYGet(stealTarget); + BoardPlayerPosGet(stealTarget, &sp8); + sp8.x += 500.0 * sin(-temp_f31 * M_PI / 180.0); + sp8.y = sp8.y + 160.0f; + sp8.z += 500.0 * cos(-temp_f31 * M_PI / 180.0); + arg0->rot.x = (sp8.x - arg0->trans.x) / 72.0f; + arg0->rot.y = (sp8.y - arg0->trans.y) / 72.0f; + arg0->rot.z = (sp8.z - arg0->trans.z) / 72.0f; + arg1->unk02 = 0x48; + } +} + +static void TakeBallCoin(void) { + BallTakeCoinData *var_r31; + Vec sp8; + s32 i; + + ballTakeCoinObj = omAddObjEx(boardObjMan, 0x1002, 0, 0, -1, ExecTakeBallCoin); + ballTakeCoinObj->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(BallTakeCoinData) * 10, MEMORY_DEFAULT_NUM); + memset(ballTakeCoinObj->data, 0, sizeof(BallTakeCoinData) * 10); + BoardPlayerPosGet(stealTarget, &sp8); + ballTakeCoinObj->trans.x = sp8.x; + ballTakeCoinObj->trans.y = sp8.y; + ballTakeCoinObj->trans.z = sp8.z; + var_r31 = ballTakeCoinObj->data; + for (i = 0; i < 10; i++, var_r31++) { + var_r31->unk00 = BoardModelCreate(0x7000A, NULL, 1); + BoardModelCameraSet(var_r31->unk00, 1); + fn_8006DDE8(var_r31->unk00, -1.0f); + BoardModelScaleSet(var_r31->unk00, 0.5f, 0.5f, 0.5f); + var_r31->unk04.x = sp8.x; + var_r31->unk04.y = sp8.y + 100.0f; + var_r31->unk04.z = sp8.z; + var_r31->unk1C.x = 3.0f * (BoardRandFloat() - 0.5f); + var_r31->unk1C.y = 3.0 * sin(BoardRandFloat()); + var_r31->unk1C.z = 3.0f * (BoardRandFloat() - 0.5f); + PSVECScale(&var_r31->unk1C, &var_r31->unk1C, 4.0f); + BoardModelPosSetV(var_r31->unk00, &var_r31->unk04); + var_r31->unk10 = var_r31->unk1C; + } +} + +static void ExecTakeBallCoin(omObjData *arg0) { + BallTakeCoinData *var_r30; + Vec sp8; + s32 i; + + if (CheckBallCoinDone() || booKillF != 0 || BoardIsKill()) { + if (arg0->data) { + HuMemDirectFree(arg0->data); + arg0->data = NULL; + } + ballTakeCoinObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + sp8.x = arg0->trans.x; + sp8.y = arg0->trans.y; + sp8.z = arg0->trans.z; + var_r30 = arg0->data; + for (i = 0; i < 10; i++, var_r30++) { + if (var_r30->unk00 != -1) { + TakeBallCoinPosSet(var_r30, &sp8); + } + } +} + +static void TakeBallCoinPosSet(BallTakeCoinData *arg0, Vec *arg1) { + if (arg1->y > arg0->unk04.y + 50.0f) { + BoardModelKill(arg0->unk00); + arg0->unk00 = -1; + return; + } + PSVECAdd(&arg0->unk04, &arg0->unk10, &arg0->unk04); + PSVECAdd(&arg0->unk04, &arg0->unk1C, &arg0->unk04); + arg0->unk10.y += -0.98f; + BoardModelPosSetV(arg0->unk00, &arg0->unk04); +} + +BOOL CheckBallCoinDone(void) { + BallTakeCoinData *var_r31; + s32 i; + + if (!ballTakeCoinObj) { + return TRUE; + } + var_r31 = ballTakeCoinObj->data; + for (i = 0; i < 10; i++, var_r31++) { + if (var_r31->unk00 > 0) { + return FALSE; + } + } + return TRUE; +} + +void TakeBallStar(void) { + BallTakeCoinWork *temp_r31; + Vec sp8; + + ballTakeCoinObj = omAddObjEx(boardObjMan, 0x1003, 0, 0, -1, ExecTakeBallStar); + temp_r31 = OM_GET_WORK_PTR(ballTakeCoinObj, BallTakeCoinWork); + temp_r31->unk00_field0 = 0; + temp_r31->unk01 = 0; + temp_r31->unk02 = BoardModelCreate(0x7000B, 0, 0); + BoardPlayerPosGet(stealTarget, &sp8); + ballTakeCoinObj->trans.x = sp8.x; + ballTakeCoinObj->trans.y = sp8.y + 150.0f; + ballTakeCoinObj->trans.z = sp8.z; + temp_r31->unk04 = sp8.y; + ballTakeCoinObj->rot.x = 3.0 * sin(4 * M_PI / 9); + ballTakeCoinObj->rot.z = 3.0 * cos(4 * M_PI / 9); + ballTakeCoinObj->rot.y = 0.0f; + BoardModelPosSet(temp_r31->unk02, ballTakeCoinObj->trans.x, ballTakeCoinObj->trans.y, ballTakeCoinObj->trans.z); + BoardModelVisibilitySet(temp_r31->unk02, 1); + BoardModelCameraSet(temp_r31->unk02, 1); + fn_8006DDE8(temp_r31->unk02, -1.0f); + BoardModelScaleSet(temp_r31->unk02, 0.5f, 0.5f, 0.5f); + HuAudFXPlay(0x361); +} + +void ExecTakeBallStar(omObjData *arg0) { + BallTakeCoinWork *temp_r29 = OM_GET_WORK_PTR(arg0, BallTakeCoinWork); + Vec sp8; + float var_f30; + + if (temp_r29->unk00_field0 != 0) { + if (arg0->data) { + HuMemDirectFree(arg0->data); + arg0->data = NULL; + } + BoardModelKill(temp_r29->unk02); + ballTakeCoinObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + BoardPlayerPosGet(stealTarget, &sp8); + temp_r29->unk01++; + OSu8tof32(&temp_r29->unk01, &var_f30); + arg0->trans.x += arg0->rot.x; + arg0->trans.z += arg0->rot.z; + arg0->trans.y += 20.0f + var_f30 * var_f30 * -0.08166667f * 0.3f; + arg0->rot.y = BoardDAngleCalc(arg0->rot.y + 24.0f); + if (temp_r29->unk04 > arg0->trans.y) { + temp_r29->unk00_field0 = 1; + } + BoardModelPosSet(temp_r29->unk02, arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotYSet(temp_r29->unk02, arg0->rot.y); +} + +BOOL CheckTakeBallStarDone(void) { + if (ballTakeCoinObj) { + return FALSE; + } else { + return TRUE; + } +} + +s32 BoardBooStealValueGet(s16 *arg0, s16 *arg1) { + if (stealType == 2) { + return 0; + } + *arg0 = stealValue; + *arg1 = stealSuccess; + return 1; +} + +BOOL BoardBooStealLightCheck(void) { + if (stealType == 2) { + return FALSE; + } else { + return TRUE; + } +} + +static s8 stealSuccessTbl[][3] = { + { 0x00, 0x00, 0x00 }, + { 0x01, 0x06, 0x01 }, + { 0x07, 0x07, 0x03 }, + { 0x08, 0x0C, 0x02 }, + { 0x0D, 0x0F, 0x03 }, + { 0x10, 0x12, 0x04 }, + { 0x13, 0x14, 0x06 }, + { 0x15, 0x17, 0x05 }, + { 0x18, 0x1A, 0x06 }, + { 0x1B, 0x1C, 0x07 }, + { 0x1D, 0x1D, 0x08 }, + { 0x1E, 0x63, 0x09 } +}; + +static s8 stealTbl[][3] = { + { 0x01, 0x05, 0x0F }, + { 0x06, 0x0F, 0x19 }, + { 0x10, 0x19, 0x1B }, + { 0x1A, 0x23, 0x1E }, + { 0x24, 0x2D, 0x20 }, + { 0x2E, 0x32, 0x23 } +}; + +static void UpdatePlayerCoins(void) { + s32 sp8; + s32 var_r29; + s32 var_r30; + s32 i; + + sp8 = punchCount; + if (punchCount > 0x63) { + punchCount = 0x63; + } + var_r30 = GWSystem.turn; + if (var_r30 > 0x32) { + var_r30 = 0x32; + } + for (stealSuccess = i = 0; i < 12; i++) { + if (punchCount >= stealSuccessTbl[i][0] && punchCount <= stealSuccessTbl[i][1]) { + stealSuccess = stealSuccessTbl[i][2]; + break; + } + } + for (var_r29 = i = 0; i < 6; i++) { + if (var_r30 >= stealTbl[i][0] && var_r30 <= stealTbl[i][1]) { + var_r29 = stealTbl[i][2]; + break; + } + } + stealValue = var_r29 - stealSuccess; + if (BoardPlayerCoinsGet(stealTarget) < stealValue) { + stealValue = BoardPlayerCoinsGet(stealTarget); + } + BoardPlayerCoinsAdd(stealTarget, -stealValue); +} diff --git a/src/game/board/com.c b/src/game/board/com.c new file mode 100755 index 00000000..fae9cae0 --- /dev/null +++ b/src/game/board/com.c @@ -0,0 +1,677 @@ +#include "game/board/com.h" +#include "game/gamework.h" +#include "game/gamework_data.h" +#include "game/board/com_path.h" +#include "game/board/main.h" +#include "game/board/player.h" +#include "game/board/space.h" +#include "game/board/tutorial.h" +#include "game/board/window.h" + +#include "math.h" + +s32 BoardBooComUseCheck(s32); + +static void ExecComKeyLeft(void); +static void ExecComKeyRight(void); +static void ExecComKeyUp(void); +static void ExecComKeyDown(void); +static void ExecComKey(s32 arg0, s32 arg1, s32 arg2); +static s32 ChooseUseItem(s32 arg0); +static BOOL CheckMiniUse(s32 arg0, s32 arg1); +static BOOL CheckMegaUse(s32 arg0, s32 arg1); +static BOOL CheckSparkUse(s32 arg0, s32 arg1); +static BOOL CheckBoardChangeUse(s32 arg0, s32 arg1); +static BOOL CheckSwapUse(s32 arg0, s32 arg1); +static BOOL CheckBooUse(s32 arg0, s32 arg1); +static BOOL CheckLampUse(s32 arg0, s32 arg1); + +static s8 itemUse = -1; + +static s8 comItemWeightTbl[8][12] = { + { 0x0C, 0x0B, 0x05, 0x03, 0x01, 0x02, 0x06, 0x04, 0x00, 0x07, 0x09, 0x0A }, + { 0x0C, 0x0B, 0x05, 0x0A, 0x03, 0x01, 0x02, 0x00, 0x06, 0x04, 0x07, 0x09 }, + { 0x0C, 0x0B, 0x05, 0x06, 0x03, 0x01, 0x02, 0x0A, 0x07, 0x09, 0x00, 0x04 }, + { 0x0C, 0x05, 0x0B, 0x09, 0x03, 0x01, 0x02, 0x06, 0x00, 0x04, 0x0A, 0x07 }, + { 0x0C, 0x0B, 0x04, 0x09, 0x0A, 0x03, 0x01, 0x05, 0x02, 0x06, 0x00, 0x07 }, + { 0x0C, 0x0B, 0x05, 0x03, 0x01, 0x0A, 0x06, 0x02, 0x00, 0x04, 0x09, 0x07 }, + { 0x0C, 0x05, 0x0B, 0x04, 0x07, 0x09, 0x03, 0x01, 0x0A, 0x06, 0x02, 0x00 }, + { 0x0C, 0x05, 0x07, 0x0B, 0x0A, 0x09, 0x04, 0x06, 0x03, 0x01, 0x02, 0x00 } +}; + +static BOOL (*comItemUseCheckFuncTbl[])(s32, s32) = { + CheckMiniUse, + CheckMegaUse, + CheckMiniUse, + CheckMegaUse, + CheckBoardChangeUse, + CheckBoardChangeUse, + CheckSwapUse, + CheckSparkUse, + NULL, + CheckBoardChangeUse, + NULL, + CheckBooUse, + CheckLampUse, + NULL +}; + +static Vec comJunctionDirTbl[] = { + { 0.0f, 0.0f, -72.0f }, + { 90.0f, 72.0f, 0.0f }, + { 180.0f, 0.0f, 72.0f }, + { 270.0f, -72.0f, 0.0f } +}; + +static void ExecComKeyLeft(void) { + ExecComKey(GWSystem.player_curr, 0, 1); +} + +void BoardComKeySetLeft(void) { + BoardWinComKeyFuncSet(ExecComKeyLeft); +} + +static void ExecComKeyRight(void) { + ExecComKey(GWSystem.player_curr, 1, 1); +} + +void BoardComKeySetRight(void) { + BoardWinComKeyFuncSet(ExecComKeyRight); +} + +static void ExecComKeyUp(void) { + ExecComKey(GWSystem.player_curr, 0, 0); +} + +void BoardComKeySetUp(void) { + BoardWinComKeyFuncSet(ExecComKeyUp); +} + +static void ExecComKeyDown(void) { + ExecComKey(GWSystem.player_curr, 1, 0); +} + +void BoardComKeySetDown(void) { + BoardWinComKeyFuncSet(ExecComKeyDown); +} + +static void ExecComKey(s32 arg0, s32 arg1, s32 arg2) { + s32 sp14[4]; + s32 temp_r31; + s16 temp_r30; + s32 var_r29; + + sp14[0] = sp14[1] = sp14[2] = sp14[3] = 0; + temp_r31 = GWPlayer[arg0].port; + temp_r30 = GWMessDelayGet(); + if (arg2 == 0) { + var_r29 = 4; + } else { + var_r29 = 2; + } + if (arg1 == 1) { + sp14[temp_r31] = var_r29; + HuWinComKeyWait(sp14[0], sp14[1], sp14[2], sp14[3], temp_r30); + } + sp14[temp_r31] = 0x100; + HuWinComKeyWait(sp14[0], sp14[1], sp14[2], sp14[3], temp_r30); +} + +s8 BoardComPreferItemGet(s32 arg0, s8 *arg1, s8 arg2) { + s32 temp_r26; + s32 var_r28; + s32 temp_r29; + s32 var_r27; + s32 i; + s32 j; + + temp_r26 = GWPlayer[arg0].character; + var_r27 = -1; + var_r28 = 0x64; + for (i = 0; i < arg2; i++) { + temp_r29 = arg1[i]; + for (j = 0; j < 0xC; j++) { + if (temp_r29 == comItemWeightTbl[temp_r26][j]) { + if (j < var_r28 && (BoardPlayerItemFind(arg0, temp_r29) == -1 || temp_r29 == 0xC || temp_r29 == 0xB)) { + var_r28 = j; + var_r27 = i; + } + break; + } + } + } + if (var_r28 == 0x64) { + return -1; + } + return var_r27; +} + +s8 BoardComPreferItemCheck(s32 arg0, s8 arg1, s8 arg2, s8 arg3) { + s8 spB[3]; + s8 temp_r25; + + spB[0] = arg1; + spB[1] = arg2; + spB[2] = arg3; + temp_r25 = BoardComPreferItemGet(arg0, spB, 3); + return temp_r25; +} + +s32 BoardComItemWeightGet(s32 arg0, s32 arg1) { + s32 var_r30; + s32 i; + + for (i = 0; i < 0xC; i++) { + if (arg1 == comItemWeightTbl[GWPlayer[arg0].character][i]) { + break; + } + } + var_r30 = 0xB - i; + return var_r30; +} + +s32 BoardComTutorialItemGet(s32 arg0) { + s32 var_r30; + s32 var_r31; + + if (!GWPlayer[arg0].com) { + return -1; + } + if (itemUse != -1) { + var_r31 = itemUse; + } + if (boardTutorialUseItem >= 0 && boardTutorialUseItem <= 0xD) { + var_r31 = boardTutorialUseItem; + boardTutorialUseItem = -1; + } + if (var_r31 != -1) { + var_r30 = BoardPlayerItemFind(arg0, var_r31); + } else { + var_r30 = -1; + } + return var_r30; +} + +s32 BoardComUseItemSet(s32 arg0, s32 arg1) { + if (arg1 == -1) { + itemUse = -1; + return 1; + } + if (BoardPlayerItemFind(arg0, arg1) != -1) { + itemUse = arg1; + return 1; + } + return 0; +} + +BOOL BoardComUseItemCheck(s32 arg0) { + s32 var_r31; + + var_r31 = BoardPlayerItemCount(arg0); + if (var_r31 <= 0) { + return FALSE; + } + if (ChooseUseItem(arg0) != -1) { + return TRUE; + } + return FALSE; +} + +static s32 ChooseUseItem(s32 arg0) { + s32 i; + s32 j; + s32 temp_r29; + s32 var_r28; + s32 temp_r27; + s32 temp_r25; + BOOL (*temp_r24)(s32, s32); + s8 temp_r23; + + temp_r29 = -1; + temp_r25 = GWPlayer[arg0].character; + var_r28 = 0x64; + for (i = 0; i < 3; i++) { + temp_r27 = GWPlayer[arg0].items[i]; + if (temp_r27 == -1) { + continue; + } + temp_r24 = comItemUseCheckFuncTbl[temp_r27]; + if (!temp_r24) { + continue; + } + temp_r23 = temp_r24(arg0, temp_r27); + if (temp_r23) { + for (j = 0; j < 0xC; j++) { + if (temp_r27 == comItemWeightTbl[temp_r25][j]) { + if (j < var_r28) { + var_r28 = j; + } + break; + } + } + } + } + if (var_r28 == 0x64) { + return -1; + } + temp_r29 = comItemWeightTbl[temp_r25][var_r28]; + if (temp_r29 == -1) { + itemUse = -1; + } else if (BoardPlayerItemFind(arg0, temp_r29) != -1) { + itemUse = temp_r29; + } + return temp_r29; +} + +static BOOL CheckMiniUse(s32 arg0, s32 arg1) { + s32 temp_r29; + s32 var_r26; + s32 var_r25; + s32 temp_r28; + s32 temp_r23; + s32 var_r24; + s32 var_r31; + s32 var_r30; + + var_r24 = 0; + temp_r29 = GWPlayer[arg0].space_curr; + temp_r28 = GWPlayer[arg0].diff; + temp_r23 = GWPlayer[arg0].character; + switch (temp_r28) { + case 0: + var_r30 = 0x32; + break; + case 1: + var_r30 = 0x19; + break; + case 2: + var_r30 = 5; + break; + case 3: + var_r30 = 0; + break; + } + if ((temp_r28 == 0 || temp_r28 == 1) && temp_r23 == 1) { + var_r30 = 7; + } + if (GWBoardGet() != 7 && GWBoardGet() != 8) { + var_r26 = BoardComPathReachCheck(temp_r29, 8, 0); + var_r25 = BoardComPathReachCheck(temp_r29, 8, 1); + } else { + var_r26 = 0x3E7; + var_r25 = BoardComPathW20BestGet(temp_r29, 0x10000000, 0xA); + if ((GWBoardGet() == 8 || GWBoardGet() == 7) && BoardRandMod(0x64) < 0x3C) { + var_r24 = 1; + } + } + switch (GWPlayer[arg0].diff) { + case 0: + var_r31 = 5; + break; + case 1: + var_r31 = 7; + break; + case 2: + var_r31 = 9; + break; + case 3: + var_r31 = 0xA; + break; + } + if ((var_r25 < var_r31 || var_r26 < var_r31 || var_r24 != 0) && BoardRandMod(0x64) >= var_r30) { + return TRUE; + } + return FALSE; +} + +static BOOL CheckMegaUse(s32 arg0, s32 arg1) { + s32 temp_r27; + s32 temp_r26; + s32 temp_r24; + s32 temp_r29; + s16 temp_r25; + s16 var_r28; + s16 temp_r23; + s16 temp_r22; + s16 i; + + temp_r29 = GWPlayer[arg0].diff; + temp_r26 = GWPlayer[arg0].character; + switch (temp_r29) { + case 0: + var_r28 = 5; + break; + case 1: + var_r28 = 7; + break; + case 2: + var_r28 = 9; + break; + case 3: + var_r28 = 0xA; + break; + } + if (((temp_r29 == 0 || temp_r29 == 1) && temp_r26 == 0) || ((temp_r29 == 0 || temp_r29 == 1) && temp_r26 == 5)) { + var_r28 = 8; + } + if (GWBoardGet() != 7 || BoardRandMod(0x64) >= 0x3C) { + temp_r24 = GWPlayer[arg0].space_curr; + temp_r27 = BoardComPathReachCheck(temp_r24, 8, 0); + temp_r23 = GWPlayer[arg0].space_curr; + for (i = 0; i < 4; i++) { + if (i != arg0) { + temp_r22 = GWPlayer[i].space_curr; + temp_r25 = BoardComPathLenGet(temp_r23, temp_r22); + if (temp_r25 < var_r28 + 0x14 && temp_r25 > 0 && GWTeamGet() && i == BoardPlayerSameTeamFind(arg0)) { + return FALSE; + } + } + } + if (GWBoardGet() != 7 && GWBoardGet() != 8 && temp_r27 < 0xA && temp_r27 > 0) { + return FALSE; + } + } + if (BoardPlayerItemFind(arg0, arg1) != -1) { + return TRUE; + } + return FALSE; +} + +static BOOL CheckSparkUse(s32 arg0, s32 arg1) { + s32 temp_r27; + s32 temp_r28; + s32 temp_r26; + s32 temp_r25; + s32 temp_r24; + s32 i; + s32 var_r30; + + temp_r25 = GWPlayer[arg0].space_curr; + temp_r28 = GWPlayer[arg0].diff; + temp_r24 = GWPlayer[arg0].character; + switch (temp_r28) { + case 0: + var_r30 = 0x32; + break; + case 1: + var_r30 = 0x19; + break; + case 2: + var_r30 = 5; + break; + case 3: + var_r30 = 0; + break; + } + if ((temp_r28 == 0 || temp_r28 == 1) && temp_r24 == 7) { + var_r30 = 7; + } + for (i = 0; i < 4; i++) { + if (i != arg0) { + temp_r26 = GWPlayer[i].space_curr; + temp_r27 = BoardComPathLenGet(temp_r26, temp_r25); + if (temp_r27 > 0 && temp_r27 <= 0xF && BoardPlayerItemFind(arg0, arg1) != -1 && BoardRandMod(0x64) >= var_r30) { + return TRUE; + } + } + } + return FALSE; +} + +static BOOL CheckBoardChangeUse(s32 arg0, s32 arg1) { + s32 temp_r25; + s32 temp_r24; + s32 temp_r23; + s32 temp_r22; + s32 temp_r21; + s32 temp_r26; + s32 var_r30; + s32 var_r29; + s32 var_r27; + s32 i; + + temp_r25 = GWPlayer[arg0].diff; + temp_r24 = GWPlayer[arg0].character; + switch (temp_r25) { + case 0: + var_r27 = 0x32; + break; + case 1: + var_r27 = 0x19; + break; + case 2: + var_r27 = 5; + break; + case 3: + var_r27 = 0; + break; + } + if (((arg1 == 4 && temp_r24 == 4) || (arg1 == 5 && (temp_r24 == 6 || temp_r24 == 3))) && (temp_r25 == 0 || temp_r25 == 1)) { + var_r27 = 7; + } + var_r30 = 0x3E7; + for (i = 0; i < 4; i++) { + if (arg0 == i) { + continue; + } + temp_r21 = GWPlayer[i].space_curr; + if (!GWTeamGet() || i != BoardPlayerSameTeamFind(arg0)) { + temp_r26 = GWPlayer[i].space_curr; + if (GWBoardGet() == 7) { + if (BoardComPathW20BestGet(temp_r21, 0x10000000, 0xA) != -1) { + var_r29 = 0xA; + } else { + var_r29 = 0; + } + } else if (GWBoardGet() == 8) { + if (BoardComPathW20BestGet(temp_r21, 0x200000, 0xA) != -1 || BoardComPathW20BestGet(temp_r21, 0x400000, 0xA) != -1) { + var_r29 = 0xA; + } else { + var_r29 = 0; + } + } else { + var_r29 = BoardComPathReachCheck(temp_r26, 8, 0); + } + if (var_r29 != 0 && var_r29 < var_r30) { + var_r30 = var_r29; + } + } + } + if ((var_r30 > 0xF && var_r30 != 0x3E7) || (GWTeamGet() && i == BoardPlayerSameTeamFind(arg0))) { + return FALSE; + } + temp_r26 = GWPlayer[arg0].space_curr; + temp_r23 = BoardComPathReachCheck(temp_r26, 8, 0); + temp_r22 = BoardComPathReachCheck(temp_r26, 8, 1); + if (BoardPlayerItemFind(arg0, arg1) != -1 && BoardRandMod(0x64) >= var_r27) { + if ((temp_r23 == 0 || temp_r22 == 0) && var_r30 == 0x3E7) { + return TRUE; + } + if (temp_r23 > var_r30 || temp_r22 > var_r30) { + return TRUE; + } + if (temp_r23 > 0xA || temp_r22 > 0xA) { + return TRUE; + } + } + return FALSE; +} + +BOOL CheckSwapUse(s32 arg0, s32 arg1) { + s32 temp_r27; + s32 temp_r26; + s32 temp_r25; + s32 var_r30; + s32 var_r29; + s32 i; + + temp_r27 = GWPlayer[arg0].diff; + temp_r25 = GWPlayer[arg0].character; + switch (temp_r27) { + case 0: + var_r29 = 0x32; + break; + case 1: + var_r29 = 0x19; + break; + case 2: + var_r29 = 5; + break; + case 3: + var_r29 = 0; + break; + } + if ((temp_r27 == 0 || temp_r27 == 1) && temp_r25 == 2) { + var_r29 = 7; + } + for (var_r30 = i = 0; i < 4; i++) { + if (i != arg0) { + var_r30 += BoardPlayerItemCount(i); + } + } + if (var_r30 == 0) { + return FALSE; + } + if (GWTeamGet()) { + temp_r26 = BoardPlayerSameTeamFind(arg0); + for (var_r30 = i = 0; i < 4; i++) { + if (temp_r26 != i && i != arg0) { + var_r30 += BoardPlayerItemCount(i); + } + } + if (var_r30 == 0) { + return FALSE; + } + } + if (BoardPlayerItemFind(arg0, arg1) != -1 && BoardRandMod(0x64) >= var_r29) { + return TRUE; + } + return FALSE; +} + +static BOOL CheckBooUse(s32 arg0, s32 arg1) { + if (BoardPlayerCoinsGet(arg0) < 5) { + return FALSE; + } + if (BoardBooComUseCheck(arg0) == 0) { + return FALSE; + } + if (BoardPlayerItemFind(arg0, arg1) == -1) { + return FALSE; + } + return TRUE; +} + +static BOOL CheckLampUse(s32 arg0, s32 arg1) { + if ((BoardPlayerCoinsGet(arg0) >= 0x14 || GWSystem.last5_effect == 4) && BoardPlayerItemFind(arg0, arg1) != -1) { + return TRUE; + } + return FALSE; +} + +s32 BoardComJunctionInputGet(s32 arg0, Vec *arg1, s32 arg2, float *arg3) { + Vec sp28; + Vec sp1C; + Vec sp10; + float var_f30; + float var_f29; + float var_f31; + s32 var_r29; + s32 var_r27; + s32 temp_r26; + s32 var_r24; + s32 var_r23; + s32 var_r21; + s32 i; + s16 var_r28; + s16 temp_r25; + s16 spC; + + temp_r26 = GWBoardGet(); + var_r24 = 0; + temp_r25 = GWPlayer[arg0].space_curr; + var_r28 = -1; + spC = GWPlayer[arg0].roll; + switch (GWPlayer[arg0].diff) { + case 3: + var_r29 = 0; + break; + case 2: + var_r29 = 0; + break; + case 1: + var_r29 = 0xA; + break; + default: + case 0: + var_r29 = 0x1E; + break; + } + if (BoardRandMod(0x64) >= var_r29) { + var_r23 = 1; + } else { + var_r23 = 0; + } + if (var_r23 != 0) { + if (temp_r26 >= 0 && temp_r26 <= 5) { + var_r28 = BoardComPathBestGet(temp_r25); + } else if (temp_r26 == 7) { + var_r28 = BoardComPathW20BestGet(temp_r25, 0x10000000, 0xA); + } + if (var_r28 == -1) { + var_r24 = 1; + } else { + BoardSpacePosGet(0, temp_r25, &sp1C); + BoardSpacePosGet(0, var_r28, &sp28); + PSVECSubtract(&sp28, &sp1C, &sp10); + var_f31 = BoardDAngleCalc(90.0 - 180.0 * (atan2(sp10.z, sp10.x) / M_PI)); + if (var_f31 < 0.0f) { + var_f31 += 360.0f; + } + if (var_f31 > 360.0f) { + var_f31 -= 360.0f; + } + } + } + if (var_r24 != 0) { + var_r21 = BoardRandMod(arg2); + var_f31 = arg3[var_r21]; + } + var_f30 = 999.0f; + for (var_r27 = i = 0; i < 4; i++) { + var_f29 = (comJunctionDirTbl[i].x - var_f31 < 0.0f) + ? -(comJunctionDirTbl[i].x - var_f31) + : (comJunctionDirTbl[i].x - var_f31); + if (var_f29 < var_f30) { + var_r27 = i; + var_f30 = var_f29; + } + } + arg1->x = comJunctionDirTbl[var_r27].y; + arg1->z = comJunctionDirTbl[var_r27].z; + arg1->y = 0.0f; + return 0; +} + +s32 BoardComBestPlayerFind(void) { + s32 temp_r30; + s32 var_r29; + s32 var_r28; + s32 var_r27; + s32 i; + + if (_CheckFlag(0x1000B) != 0) { + return -1; + } + var_r28 = -1; + var_r29 = -1; + for (i = 0; i < 4; i++) { + var_r27 = GWPlayer[i].space_curr; + temp_r30 = BoardComPathReachCheck(var_r27, 8, 0); + if (temp_r30 > 0 && temp_r30 > var_r29) { + var_r29 = temp_r30; + var_r28 = i; + } + } + return var_r28; +} diff --git a/src/game/board/com_path.c b/src/game/board/com_path.c new file mode 100755 index 00000000..c6b480a1 --- /dev/null +++ b/src/game/board/com_path.c @@ -0,0 +1,545 @@ +#include "game/board/com_path.h" +#include "game/board/space.h" + +#define NODE_INDEX(x) ((x) ? ((x) - pathNodeData) : -1) + +typedef struct { + /* 0x00 */ struct { + u8 unk00_field0 : 1; + u8 unk00_field1 : 1; + s8 unk00_field2 : 1; + s8 unk00_field3 : 1; + u8 unk00_field4 : 1; + u8 unk00_field5 : 1; + }; + /* 0x01 */ s8 unk01; + /* 0x02 */ s8 unk02; + /* 0x03 */ s8 unk03; + /* 0x04 */ s16 unk04; + /* 0x06 */ s16 unk06[2]; // array size unknown + /* 0x0A */ char unk0A[0x3C]; + /* 0x46 */ s16 unk46[5]; +} PathNode; // Size 0x50 + +static PathNode *SearchPathNodeSpace(s16 arg0); +static s16 InitPathNode(PathNode *arg0); +static PathNode *FindChildNode(s16 arg0, PathNode *arg1); +static s32 GetNumValidLinks(BoardSpace *arg0, PathNode *arg1); +static void AddValidLinks(BoardSpace *arg0, PathNode *arg1); +static BOOL CheckPathSpace(BoardSpace *arg0); +static s16 FindValidLink(BoardSpace *arg0); +static BOOL CheckEndSpace(BoardSpace *arg0, PathNode *arg1); +static BOOL CheckPath(PathNode *arg0); +static BOOL CheckW20Path(PathNode *arg0, u32 arg1); + +static PathNode pathNodeData[16]; +static PathNode *candidateNodes[16]; +static s16 startPathSpaceSearch[16]; +static s16 startPathSpace[16]; + +static s16 numCandidates; +static s16 childNodeCnt; + +static PathNode *SearchPathNodeSpace(s16 arg0) { + PathNode *var_r31; + s32 i; + + for (var_r31 = pathNodeData, i = 0; i < 16; i++, var_r31++) { + if (var_r31->unk04 == arg0) { + break; + } + } + if (i == 16) { + var_r31 = NULL; + } + return var_r31; +} + +static s16 InitPathNode(PathNode *arg0) { + BoardSpace *temp_r30; + PathNode *var_r23; + s32 var_r29; + s16 i; + s16 var_r27; + s16 var_r26; + s16 var_r25; + s16 var_r24; + + var_r24 = arg0->unk04; + var_r29 = 0; + arg0->unk02 = var_r25 = 0; + do { + var_r27 = var_r24; + temp_r30 = BoardSpaceGet(0, var_r27); + arg0->unk06[arg0->unk02] = var_r27; + var_r23 = FindChildNode(var_r27, arg0); + if (var_r23) { + AddValidLinks(temp_r30, arg0); + arg0->unk01 = 1; + arg0->unk46[0] = var_r27; + for (i = 1; i < 5; i++) { + arg0->unk46[i] = 0; + } + return 0; + } + if (temp_r30->link_cnt == 0) { + var_r26 = 0; + var_r29 = 1; + } else { + var_r26 = GetNumValidLinks(temp_r30, arg0); + if (var_r26 == 1) { + var_r24 = FindValidLink(temp_r30); + } else { + var_r29 = 1; + } + } + if (CheckEndSpace(temp_r30, arg0)) { + var_r25++; + if (var_r25 >= arg0->unk03) { + var_r26 = 0; + var_r29 = 1; + } + } + arg0->unk02++; + } while (var_r29 == 0); + AddValidLinks(temp_r30, arg0); + arg0->unk01 = var_r26; + return arg0->unk03 - var_r25; +} + +static PathNode *FindChildNode(s16 arg0, PathNode *arg1) { + PathNode *temp_r31; + s32 var_r28; + s32 i; + s32 j; + + var_r28 = NODE_INDEX(arg1); + if (var_r28 == -1) { + return NULL; + } + for (i = 0; i < childNodeCnt; i++) { + temp_r31 = &pathNodeData[i]; + if (temp_r31 != arg1) { + for (j = 0; j < temp_r31->unk02; j++) { + if (arg0 == temp_r31->unk06[j]) { + return temp_r31; + } + } + } + } + return NULL; +} + +static s32 GetNumValidLinks(BoardSpace *arg0, PathNode *arg1) { + BoardSpace *var_r28; + s16 i; + s16 var_r29; + + for (var_r29 = i = 0; i < arg0->link_cnt; i++) { + var_r28 = BoardSpaceGet(0, arg0->link[i]); + if (!CheckPathSpace(var_r28)) { + var_r29++; + } + } + if (var_r29 >= arg0->link_cnt) { + return 0; + } + return arg0->link_cnt - var_r29; +} + +static void AddValidLinks(BoardSpace *arg0, PathNode *arg1) { + BoardSpace *var_r27; + s16 var_r30; + s16 var_r31; + + for (var_r31 = var_r30 = 0; var_r30 < arg0->link_cnt; var_r30++) { + var_r27 = BoardSpaceGet(0, arg0->link[var_r30]); + if (CheckPathSpace(var_r27)) { + arg1->unk46[var_r31] = arg0->link[var_r30]; + var_r31++; + } + } + for (; var_r31 < 5; var_r31++) { + arg1->unk46[var_r31] = 0; + } +} + +static BOOL CheckPathSpace(BoardSpace *arg0) { + if ((arg0->flag & 0x02000000) || (arg0->flag & 0x04000000)) { + return FALSE; + } else { + return TRUE; + } +} + +static s16 FindValidLink(BoardSpace *arg0) { + s16 var_r29; + s16 i; + BoardSpace *temp_r30; + + for (var_r29 = i = 0; i < arg0->link_cnt; i++) { + var_r29 = arg0->link[i]; + temp_r30 = BoardSpaceGet(0, var_r29); + if (CheckPathSpace(temp_r30)) { + break; + } + } + return var_r29; +} + +static BOOL CheckEndSpace(BoardSpace *arg0, PathNode *arg1) { + if (arg0->flag & 0x80000000) { + } + if (arg0->flag & 0x4000000) { + } + if (arg0->flag & 0x2000000) { + } + if (arg0->flag & 0x180000) { + arg1->unk00_field3 = 1; + } + if (arg0->flag & 0x48000000) { + arg1->unk00_field4 = 1; + } + if (arg0->flag & 0x20000000) { + arg1->unk00_field2 = 1; + } + if (arg0->flag & 0x10000000) { + arg1->unk00_field5 = 1; + } + switch (arg0->type) { + case 8: + arg1->unk00_field1 = 1; + return FALSE; + case 10: + return FALSE; + case 0: + return FALSE; + } + return TRUE; +} + +static inline void ComPathInlineFunc02(PathNode *arg0) { + if (numCandidates < 16) { + candidateNodes[numCandidates] = arg0; + numCandidates++; + } +} + +static inline PathNode *ComPathInlineFunc03(void) { + PathNode *ret; + + numCandidates--; + if (numCandidates < 0) { + return NULL; + } else { + ret = candidateNodes[numCandidates]; + candidateNodes[numCandidates] = NULL; + return ret; + } +} + +static inline PathNode *ComPathInlineFunc04(s16 arg0, s16 arg1) { + PathNode *var_r26; + s32 i; + + var_r26 = pathNodeData; + for (i = 0; i < 16; i++, var_r26++) { + if (var_r26->unk00_field0 == 0) { + break; + } + } + if (i == 16) { + return NULL; + } else { + var_r26->unk00_field0 = 1; + var_r26->unk04 = arg0; + var_r26->unk03 = arg1; + childNodeCnt++; + return var_r26; + } +} + +static inline void ComPathInlineFunc05(s16 arg0, s16 arg1) { + PathNode *var_r28; + s32 var_r24; + s32 temp_r17; + s32 i; + PathNode *var_r23; + + memset(pathNodeData, 0, sizeof(pathNodeData)); + memset(candidateNodes, 0, sizeof(candidateNodes)); + numCandidates = 0; + childNodeCnt = 0; + var_r23 = ComPathInlineFunc04(arg0, arg1); + ComPathInlineFunc02(var_r23); + var_r24 = 1; + temp_r17 = arg1; + while (1) { + if (var_r24 <= 0) { + break; + } + var_r28 = ComPathInlineFunc03(); + if (!var_r28) { + break; + } + var_r24--; + temp_r17 = InitPathNode(var_r28); + if (temp_r17 != 0) { + if (var_r28->unk01 <= 1) { + break; + } + for (i = 0; i < var_r28->unk01; var_r24++, i++) { + var_r23 = ComPathInlineFunc04(var_r28->unk46[i], temp_r17); + if (!var_r23) { + break; + } + ComPathInlineFunc02(var_r23); + } + } + } +} + +s16 BoardComPathReachCheck(s16 arg0, u32 arg1, s32 arg2) { + s16 sp80[10]; + s16 sp6C[10]; + PathNode *sp68; + PathNode *var_r29; + s16 sp1C; + s16 sp1A; + s16 temp_r20; + s16 var_r22; + s16 var_r28; + s16 i; + s32 var_r19; + + if (_CheckFlag(0x1000B)) { + return 0; + } + ComPathInlineFunc05(arg0, 0x1E); + memset(startPathSpaceSearch, 0, sizeof(startPathSpaceSearch)); + memset(sp80, 0, sizeof(sp80)); + memset(candidateNodes, 0, sizeof(candidateNodes)); + numCandidates = 0; + var_r29 = SearchPathNodeSpace(arg0); + sp1A = NODE_INDEX(var_r29); + ComPathInlineFunc02(var_r29); + var_r28 = 0; + var_r22 = 0; + startPathSpaceSearch[sp1A] = var_r28; + var_r19 = 0; + while (1) { + var_r29 = ComPathInlineFunc03(); + sp1C = NODE_INDEX(var_r29); + if (sp1C == -1) { + if (var_r22 != 0) { + break; + } + } else { + var_r19 = 0; + var_r28 = startPathSpaceSearch[sp1C]; + for (i = 0; i < var_r29->unk02; i++) { + if (arg2 == 0 && (BoardSpaceFlagGet(0, var_r29->unk06[i]) & 0x20000000)) { + break; + } + if (arg1 == BoardSpaceTypeGet(0, var_r29->unk06[i])) { + sp80[var_r22] = var_r28; + sp6C[var_r22] = sp1C; + if (++var_r22 < 0xA) { + var_r19 = 1; + break; + } else { + goto return_r28; + } + } + if (var_r28++ >= 0x1E) { + var_r19 = 1; + break; + } + } + if (var_r19 == 0) { + for (i = 0; i < var_r29->unk01; i++) { + sp68 = SearchPathNodeSpace(var_r29->unk46[i]); + temp_r20 = NODE_INDEX(sp68); + if (temp_r20 != -1 && temp_r20 >= 0 && temp_r20 < 16) { + startPathSpaceSearch[temp_r20] = var_r28; + ComPathInlineFunc02(sp68); + } + } + } + continue; + } + return 0; + } +return_r28: + var_r28 = 10000; + for (i = 0; i < 10; i++) { + if (var_r28 > sp80[i] && sp80[i] != 0) { + var_r28 = sp80[i]; + } + } + return var_r28; +} + +s16 BoardComPathBestGet(s16 arg0) { + PathNode *sp30; + PathNode *sp2C; + s32 i; + + ComPathInlineFunc05(arg0, 0x1E); + sp2C = SearchPathNodeSpace(arg0); + if (sp2C->unk00_field1 != 0) { + return -1; + } + if (sp2C->unk01 <= 1) { + return -1; + } + for (i = 0; i < sp2C->unk01; i++) { + sp30 = SearchPathNodeSpace(sp2C->unk46[i]); + if (sp30 && CheckPath(sp30)) { + return sp2C->unk46[i]; + } + } + return -1; +} + +s16 BoardComPathLenGet(s16 arg0, s16 arg1) { + PathNode *var_r30; + s16 temp_r21; + s16 var_r25; + s16 sp16; + s16 sp14; + s16 sp12; + s16 i; + s32 sp5C; + PathNode *sp58; + + ComPathInlineFunc05(arg0, 0x1E); + memset(startPathSpace, 0, sizeof(startPathSpace)); + memset(candidateNodes, 0, sizeof(candidateNodes)); + numCandidates = 0; + var_r30 = SearchPathNodeSpace(arg0); + sp12 = NODE_INDEX(var_r30); + ComPathInlineFunc02(var_r30); + var_r25 = 0; + sp16 = 0; + startPathSpace[sp12] = var_r25; + sp5C = 0; + while (1) { + var_r30 = ComPathInlineFunc03(); + sp14 = NODE_INDEX(var_r30); + if (sp14 == -1) { + if (sp16 != 0) { + break; + } + } else { + sp5C = 0; + var_r25 = startPathSpace[sp14]; + for (i = 0; i < var_r30->unk02; i++) { + if (BoardSpaceFlagGet(0, var_r30->unk06[i]) & 0x20000000) { + break; + } + if (var_r30->unk06[i] == arg1) { + goto return_r25; + } + if (var_r25++ >= 0x1E) { + sp5C = 1; + break; + } + } + if (sp5C == 0) { + for (i = 0; i < var_r30->unk01; i++) { + sp58 = SearchPathNodeSpace(var_r30->unk46[i]); + temp_r21 = NODE_INDEX(sp58); + if (temp_r21 != -1 && temp_r21 >= 0 && temp_r21 < 16) { + startPathSpace[temp_r21] = var_r25; + ComPathInlineFunc02(sp58); + } + } + } + continue; + } + return 0; + } +return_r25: + return var_r25; +} + +static BOOL CheckPath(PathNode *arg0) { + s32 i; + PathNode *sp1C; + + if (arg0->unk00_field1 != 0) { + return TRUE; + } + if (arg0->unk01 <= 1) { + return FALSE; + } + for (i = 0; i < arg0->unk01; i++) { + sp1C = SearchPathNodeSpace(arg0->unk46[i]); + if (sp1C && CheckPath(sp1C)) { + return TRUE; + } + } + return FALSE; +} + +s16 BoardComPathW20BestGet(s16 arg0, u32 arg1, s16 arg2) { + PathNode *var_r31; + PathNode *sp38; + s32 i; + + ComPathInlineFunc05(arg0, arg2); + var_r31 = SearchPathNodeSpace(arg0); + if (arg1 & 0x180000) { + if (var_r31->unk00_field1 != 0) { + return -1; + } + } else if (arg1 & 0x08000000) { + if (var_r31->unk00_field4 != 0) { + return -1; + } + } else if (arg1 & 0x10000000) { + if (var_r31->unk00_field5 != 0) { + return -1; + } + } + if (var_r31->unk01 <= 1) { + return -1; + } + for (i = 0; i < var_r31->unk01; i++) { + sp38 = SearchPathNodeSpace(var_r31->unk46[i]); + if (sp38 && CheckW20Path(sp38, arg1)) { + return var_r31->unk46[i]; + } + } + return -1; +} + +static BOOL CheckW20Path(PathNode *arg0, u32 arg1) { + s32 i; + PathNode *sp1C; + + if (arg1 & 0x180000) { + if (arg0->unk00_field1 != 0) { + return TRUE; + } + } else if (arg1 & 0x08000000) { + if (arg0->unk00_field4 != 0) { + return TRUE; + } + } else if (arg1 & 0x10000000) { + if (arg0->unk00_field5 != 0) { + return TRUE; + } + } + if (arg0->unk01 <= 1) { + return FALSE; + } + for (i = 0; i < arg0->unk01; i++) { + sp1C = SearchPathNodeSpace(arg0->unk46[i]); + if (sp1C && CheckW20Path(sp1C, arg1)) { + return TRUE; + } + } + return FALSE; +} diff --git a/src/game/board/item.c b/src/game/board/item.c new file mode 100755 index 00000000..59176efc --- /dev/null +++ b/src/game/board/item.c @@ -0,0 +1,1902 @@ +#include "game/board/item.h" +#include "game/audio.h" +#include "game/chrman.h" +#include "game/gamework.h" +#include "game/gamework_data.h" +#include "game/hsfanim.h" +#include "game/hsfman.h" +#include "game/objsub.h" +#include "game/pad.h" +#include "game/process.h" +#include "game/window.h" +#include "game/wipe.h" +#include "game/board/audio.h" +#include "game/board/com.h" +#include "game/board/main.h" +#include "game/board/model.h" +#include "game/board/player.h" +#include "game/board/space.h" +#include "game/board/ui.h" +#include "game/board/window.h" + +typedef struct { + /* 0x00 */ s16 unk00; + /* 0x02 */ s16 unk02; + /* 0x04 */ float unk04; + /* 0x08 */ float unk08; + /* 0x0C */ float unk0C; + /* 0x10 */ Vec unk10; +} UnkItemProcUserData; // Size unknown + +typedef struct { + /* 0x00 */ s16 unk00; + /* 0x02 */ s16 unk02; + /* 0x04 */ float unk04; + /* 0x08 */ float unk08; + /* 0x0C */ char unk0C[4]; + /* 0x10 */ float unk10; + /* 0x14 */ float unk14; + /* 0x18 */ float unk18; + /* 0x1C */ s16 unk1C; +} UnkItemShowProcStruct; // Size unknown + +typedef struct { + /* 0x00 */ float unk00; + /* 0x04 */ Vec unk04; + /* 0x04 */ Vec unk10; +} UnkGenieCameraStruct; // Size 0x1C + +u32 frandmod(u32); +void CharModelCreateParticle(s32, Vec*); +void BoardBowserSuitInit(s32); +s16 BoardBowserSuitPlayerModelGet(void); +void fn_8004F578(s16, s32); + +static void ItemProcess(void); +static void RestoreProcess(void); +static void ItemDestroy(void); +static void RestoreDestroy(void); +static void ItemSizeShowAnim(void); +static void ItemRotProc(void); +static Process *ItemShowProc(UnkItemShowProcStruct *arg0, Vec *arg1); +static s16 ItemGetTarget(void); +static void ItemSizeSet(s32 arg0); +static void ExecItemMini(void); +static void ExecItemMega(void); +static void ExecItemMiniSuper(void); +static void ExecItemMegaSuper(void); +static void ExecItemHammer(void); +static void ExecItemPipe(void); +static void ExecItemSwap(void); +static void ExecItemSpark(void); +static void ExecItemLight(void); +static void ExecItemWhistle(void); +static void ExecItemBowser(void); +static void ExecItemBooBall(void); +static void LampParticleUpdate(s32 arg0, ParticleData *arg1); +static void GenieParticleUpdate(s32 arg0, ParticleData *arg1); +static void GenieCameraProc(void); +static void GenieCameraCalc(UnkGenieCameraStruct *arg0, s32 arg1, float arg2, Vec *arg3, Vec *arg4); +static void GenieSceneExec(void); +static void ExecItemGenie(void); +static void ExecItemBagJump(void); +static void ExecItemBagShow(void); +static void ExecItemBag(void); +static void RestoreItemNull(void); +static void RestoreItemMini(void); +static void RestoreItemMega(void); +static void RestoreItemMiniSuper(void); +static void RestoreItemMegaSuper(void); +static void RestoreItemBowser(void); + +// BSS +static Vec booBallScale; +static Vec booBallPos; +static Vec booCamUp; +static Vec booCamTarget; +static Vec booCamPos; + +// SBSS +static s16 itemBagItems[3]; +static s8 currItemRestore; +static s8 currItem; +static s16 suitMdl; +static s32 suitMot[2]; +static s32 suitCommonMot[2]; +// ... +static float genieFov; +static AnimData *genieParticleAnim; +static s16 geniePlayerMot[3]; +static Process *itemProc; + +// SDATA +s32 lbl_801D37A0[2] = { 0x00070075, -1 }; + +// DATA +static void (*itemFuncTbl[])(void) = { + ExecItemMini, + ExecItemMega, + ExecItemMiniSuper, + ExecItemMegaSuper, + ExecItemHammer, + ExecItemPipe, + ExecItemSwap, + ExecItemSpark, + ExecItemLight, + ExecItemWhistle, + ExecItemBowser, + ExecItemBooBall, + ExecItemGenie, + ExecItemBag +}; + +// DATA + 0x38 +static void (*itemRestoreFuncTbl[])(void) = { + RestoreItemMini, + RestoreItemMega, + RestoreItemMiniSuper, + RestoreItemMegaSuper, + RestoreItemNull, + RestoreItemNull, + RestoreItemNull, + RestoreItemNull, + RestoreItemNull, + RestoreItemNull, + RestoreItemBowser, + RestoreItemNull, + RestoreItemNull, + RestoreItemNull +}; + +// DATA + 0x70 +static s32 itemMdlTbl[] = { + 0x0007006D, + 0x0007006E, + 0x0007006F, + 0x00070070, + 0x00070071, + 0x00070072, + 0x00070073, + 0x00070074, + 0x00070076, + 0x00070077, + 0x00070078, + 0x00070079, + 0x0007007A, + 0x0007007B +}; + +// DATA + 0xA8 +static s32 forceMoveSfxTbl[] = { + 0x38, 0x45, 0x42, 0x4D, 0x48, 0x3F +}; + +// DATA + 0xC0 +static s32 callMotTbl[] = { + 0x005F0052, + 0x001A0052, + 0x006D0052, + 0x008A0052, + 0x00850052, + 0x00110052, + 0x000D0052, + 0x00810052 +}; + +// DATA + 0xE0 +// callHookTbl items + +// DATA + 0x178 +static char *callHookTbl[] = { + "c000m01-itemhook-r", + "c001m01-itemhook-r", + "c002m01-itemhook-r", + "c003m01-itemhook-r", + "c004m01-itemhook-r", + "c005m01-itemhook-r", + "c006m01-itemhook-r", + "c007m01-itemhook-r" +}; + +// DATA + 0x198 +static s32 callAttackMotTbl[] = { + 0x0075001F, + 0x00760005, + 0x0077001D, + 0x00780009, + 0x00790007, + 0x007A0013 +}; + +// DATA + 0x1B0 +static s32 callAttackMotTbl2[] = { + 0x00750020, + 0x00760006, + 0x0077001E, + 0x0078000A, + 0x00790008, + 0x007A0014 +}; + +// DATA + 0x1C8 +static s32 suitMotTbl[][2] = { + { 0x00040001, 0x00040002 }, + { 0x00040004, 0x00040005 }, + { 0x00040007, 0x00040008 }, + { 0x0004000A, 0x0004000B }, + { 0x0004000D, 0x0004000E }, + { 0x00040010, 0x00040011 }, + { 0x00040013, 0x00040014 }, + { 0x00040016, 0x00040017 } +}; + +void BoardItemStart(s32 arg0, s32 arg1) { + currItemRestore = arg0; + currItem = arg1; + suitMdl = -1; + itemProc = HuPrcChildCreate(ItemProcess, 0x2004, 0x1000, 0, boardMainProc); + HuPrcDestructorSet2(itemProc, ItemDestroy); +} + +BOOL BoardItemDoneCheck(void) { + if (itemProc) { + return FALSE; + } else { + return TRUE; + } +} + +void BoardItemPlayerRestore(s32 arg0, s32 arg1) { + currItemRestore = arg0; + currItem = arg1; + itemProc = HuPrcChildCreate(RestoreProcess, 0x2004, 0x1000, 0, boardMainProc); + HuPrcDestructorSet2(itemProc, RestoreDestroy); +} + +static void ItemProcess(void) { + void (*temp_r31)(void) = itemFuncTbl[currItem]; + + HuPrcChildCreate(temp_r31, 0x2003, 0x1000, 0, HuPrcCurrentGet()); + HuPrcChildWatch(); + HuPrcEnd(); +} + +static void RestoreProcess(void) { + void (*temp_r31)(void) = itemRestoreFuncTbl[currItem]; + + HuPrcChildCreate(temp_r31, 0x2003, 0x1000, 0, HuPrcCurrentGet()); + HuPrcChildWatch(); + HuPrcEnd(); +} + +static void ItemDestroy(void) { + itemProc = NULL; +} + +static void RestoreDestroy(void) { + itemProc = NULL; +} + +static void ItemSizeShowAnim(void) { + Vec sp24; + Vec sp18; + Vec spC; + float sp8; + float var_f31; + s32 i; + + sp8 = 1.0f; + var_f31 = 180.0f; + BoardPlayerPosGet(currItemRestore, &sp24); + BoardPlayerRotGet(currItemRestore, &spC); + sp24.y += 300.0f; + sp18.x = sp18.y = sp18.z = 1.0f; + BoardModelRotSetV(suitMdl, &spC); + BoardModelPosSetV(suitMdl, &sp24); + for (i = 0; i < 120; i++) { + sp24.y += 3.0 * sin(M_PI * var_f31 / 180.0); + BoardModelPosSetV(suitMdl, &sp24); + var_f31 += 9.0f; + if (var_f31 >= 360.0f) { + var_f31 -= 360.0f; + } + HuPrcVSleep(); + } + for (i = 0; i < 30; i++) { + sp24.y -= 6.6666665f; + sp18.x -= 0.03f; + sp18.y -= 0.03f; + sp18.z -= 0.03f; + BoardModelScaleSetV(suitMdl, &sp18); + BoardModelPosSetV(suitMdl, &sp24); + HuPrcVSleep(); + } + BoardModelKill(suitMdl); +} + +static void ItemRotProc(void) { + Vec sp20; + Vec sp14; + Vec sp8; + UnkItemProcUserData *temp_r31; + + temp_r31 = HuPrcCurrentGet()->user_data; + BoardModelPosGet(temp_r31->unk02, &sp20); + BoardModelRotGet(temp_r31->unk02, &sp8); + temp_r31->unk0C = 0.0f; + while (1) { + if (temp_r31->unk00 == 0) { + sp14 = sp20; + sp14.y += temp_r31->unk04 * sin(M_PI * temp_r31->unk0C / 180.0); + BoardModelPosSetV(temp_r31->unk02, &sp14); + temp_r31->unk0C += temp_r31->unk08; + if (temp_r31->unk0C >= 360.0f) { + temp_r31->unk0C -= 360.0f; + } + PSVECAdd(&sp8, &temp_r31->unk10, &sp8); + if (sp8.x < 0.0f) { + sp8.x += 360.0f; + } + if (sp8.x >= 360.0f) { + sp8.x -= 360.0f; + } + if (sp8.y < 0.0f) { + sp8.y += 360.0f; + } + if (sp8.y >= 360.0f) { + sp8.y -= 360.0f; + } + if (sp8.z < 0.0f) { + sp8.z += 360.0f; + } + if (sp8.z >= 360.0f) { + sp8.z -= 360.0f; + } + BoardModelRotSetV(temp_r31->unk02, &sp8); + } + HuPrcVSleep(); + } +} + +// TODO: needs the inline keyword to be inlined into ExecItemHammer, but adding it messes up sdata2. +// sdata2 order should be: 1000.0f, 0.15f, then 20.0f. +// With the inline keyword, it becomes 0.15f, 20.0f, then 1000.0f (workaround in BoardUiInlineFunc02 below). +static inline void BoardUiInlineFunc01(Vec *arg0) { + Vec sp30; + Vec sp3C; + Vec sp48; + Vec sp54; + float spC; + float var_f31; + s32 i; + + spC = 1.0f; + BoardPlayerPosGet(currItemRestore, &sp30); + BoardPlayerRotGet(currItemRestore, &sp48); + sp3C = sp30; + sp3C.y += 1000.0f; + sp54.x = sp54.y = sp54.z = 1.0f; + BoardModelRotSetV(suitMdl, &sp48); + BoardModelPosSetV(suitMdl, &sp3C); + while (1) { + var_f31 = 0.15f * (sp3C.y - (sp30.y + 300.0f)); + if (var_f31 > 20.0f) { + var_f31 = 20.0f; + } + if (var_f31 < 1.0f) { + var_f31 = 1.0f; + } + if (fabs(sp3C.y - (sp30.y + 300.0f)) < var_f31) { + break; + } + sp3C.y -= var_f31; + BoardModelPosSetV(suitMdl, &sp3C); + PSVECAdd(&sp48, arg0, &sp48); + for (i = 0; i < 3; i++) { + if (((float*) &sp48)[i] < 0.0f) { + ((float*) &sp48)[i] += 360.0f; + } + if (((float*) &sp48)[i] >= 360.0f) { + ((float*) &sp48)[i] -= 360.0f; + } + } + BoardModelRotSetV(suitMdl, &sp48); + HuPrcVSleep(); + } + sp3C.y = sp30.y + 300.0f; + BoardModelPosSetV(suitMdl, &sp3C); +} + +static void BoardUiInlineFunc02(void) { + Vec sp18; + Vec sp24; + float sp8; + float var_f30; + + (void) 1000.0f; // TODO: fix this. + sp8 = 1.0f; + BoardModelPosGet(suitMdl, &sp24); + BoardPlayerPosGet(currItemRestore, &sp18); + while (1) { + var_f30 = 0.15f * (sp24.y - sp18.y - 300.0f); + if (var_f30 > 20.0f) { + var_f30 = 20.0f; + } + if (var_f30 < 1.0f) { + var_f30 = 1.0f; + } + if (fabs(sp24.y - 1000.0f) <= var_f30) { + break; + } + sp24.y += var_f30; + BoardModelPosSetV(suitMdl, &sp24); + HuPrcVSleep(); + } + sp24.y = 1000.0f; + BoardModelPosSetV(suitMdl, &sp24); +} + +static inline void BoardUiInlineFunc03(s32 arg0) { + Vec sp8; + Vec sp14; + + BoardSpacePosGet(0, GWPlayerSpaceCurrGet(arg0), &sp14); + BoardPlayerPosGet(arg0, &sp8); + BoardPlayerPosLerpStart(arg0, &sp8, &sp14, 0x14); + while (GWPlayer[arg0].moving) { + HuPrcVSleep(); + } + BoardPlayerMotBlendSet(arg0, 0, 7); + while (!BoardPlayerMotBlendCheck(arg0)) { + HuPrcVSleep(); + } + BoardRotateDiceNumbers(arg0); +} + +static inline void BoardUiInlineFunc04(Process *arg0, s32 arg1) { + UnkItemShowProcStruct *temp_r19 = arg0->user_data; + + temp_r19->unk00 = arg1; +} + +static inline Process *BoardUiInlineFunc05(UnkItemShowProcStruct *arg0) { + Process *temp_r27; + + temp_r27 = HuPrcCreate(ItemRotProc, 0x2004, 0x1000, 0); + temp_r27->user_data = arg0; + BoardUiInlineFunc04(temp_r27, 0); + return temp_r27; +} + +static Process *ItemShowProc(UnkItemShowProcStruct *arg0, Vec *arg1) { + Vec sp20; + Vec sp14; + Vec sp8; + Process *var_r29; + + var_r29 = NULL; + BoardPlayerPosGet(currItemRestore, &sp20); + BoardPlayerRotGet(currItemRestore, &sp14); + sp20.y += 300.0f; + if (currItem == 0xD) { + sp20.y -= 50.0f; + } + if (arg1 == NULL) { + sp8.x = sp8.y = sp8.z = 1.0f; + } else { + sp8 = *arg1; + } + if (suitMdl >= 0) { + BoardModelLayerSet(suitMdl, 2); + BoardModelRotSetV(suitMdl, &sp14); + BoardModelPosSetV(suitMdl, &sp20); + BoardModelScaleSetV(suitMdl, &sp8); + BoardModelVisibilitySet(suitMdl, 0); + } + BoardCameraRotGet(&sp14); + if (arg0 == NULL || arg0->unk1C != 0) { + CharModelLayerSetAll(3); + sp20.y += 35.0f; + sp20.z += 50.0 * cos(sp14.y * M_PI / 180.0); + sp20.x += 50.0 * sin(sp14.y * M_PI / 180.0); + CharModelCreateParticle(1, &sp20); + HuPrcSleep(0xA); + } + if (suitMdl >= 0) { + BoardModelVisibilitySet(suitMdl, 1); + if (arg0 != NULL) { + var_r29 = BoardUiInlineFunc05(arg0); + } + } + HuPrcSleep(30); + return var_r29; +} + +static s16 ItemGetTarget(void) { + s32 sp20[4]; + s32 sp10[4]; + float sp8[2]; + s16 temp_r22; + s16 temp_r29; + s32 temp_r24; + s32 var_r28; + s32 temp_r21; + s32 var_r27; + u8 var_r26; + s32 var_r25; + s32 var_r30; + s32 var_r31; + s32 temp_r23; + + var_r28 = 0; + var_r27 = 0; + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if (var_r31 != currItemRestore) { + sp20[var_r27++] = var_r31; + HuWinInsertMesSizeGet(GWPlayerCfg[var_r31].character, var_r28); + var_r28++; + } + } + HuWinMesMaxSizeGet(1, sp8, 0x12000E); + temp_r29 = HuWinCreate(-10000.0f, -10000.0f, sp8[0], sp8[1], 0); + if (!GWPlayer[currItemRestore].com) { + winData[temp_r29].active_pad = (1 << GWPlayer[currItemRestore].port); + } + for (var_r31 = 0; var_r31 < var_r27; var_r31++) { + HuWinInsertMesSet(temp_r29, GWPlayerCfg[sp20[var_r31]].character, var_r31); + } + HuWinMesSet(temp_r29, 0x12000E); + if (GWPlayer[currItemRestore].com) { + var_r26 = 0xF; + } else { + var_r26 = 0; + for (var_r31 = 0; var_r31 < 4; var_r31++) { + if (var_r31 != currItemRestore) { + var_r26 = (1 << GWPlayer[var_r31].port); + } + } + } + HuWinDisablePlayerSet(temp_r29, var_r26); + if (GWPlayer[currItemRestore].com) { + temp_r23 = GWPlayer[currItemRestore].port; + temp_r21 = frandmod(3); + temp_r24 = GWMessDelayGet(); + for (var_r25 = 0; var_r25 < temp_r21; var_r25++) { + for (var_r30 = 0; var_r30 < 4; var_r30++) { + sp10[var_r30] = 0; + } + sp10[temp_r23] = 4; + HuWinComKeyWait(sp10[0], sp10[1], sp10[2], sp10[3], temp_r24); + } + for (var_r30 = 0; var_r30 < 4; var_r30++) { + sp10[var_r30] = 0; + } + sp10[temp_r23] = 0x100; + HuWinComKeyWait(sp10[0], sp10[1], sp10[2], sp10[3], temp_r24); + } + HuWinAttrSet(temp_r29, 0x10); + HuWinMesSpeedSet(temp_r29, 0); + temp_r22 = sp20[HuWinChoiceGet(temp_r29, 0)]; + HuWinKill(temp_r29); + return temp_r22; +} + +static void ItemSizeSet(s32 arg0) { + float sp24[9]; + float sp14[4]; + float sp8[3] = { 1.0f, 0.3f, 2.5f }; + float var_f31; + float temp_f30; + s16 temp_r28; + s32 var_r27; + s16 temp_r26; + s32 i; + s32 j; + + var_f31 = sp8[BoardPlayerSizeGet(currItemRestore)]; + sp14[0] = var_f31; + sp14[1] = var_f31 + (sp8[arg0] - var_f31) / 3.0f; + sp14[2] = var_f31 + (sp8[arg0] - var_f31) / 1.5f; + sp14[3] = sp8[arg0]; + sp24[0] = sp14[1]; + sp24[1] = sp14[0]; + sp24[2] = sp14[1]; + sp24[3] = sp14[2]; + sp24[4] = sp14[1]; + sp24[5] = sp14[2]; + sp24[6] = sp14[3]; + sp24[7] = sp14[2]; + sp24[8] = sp14[3]; + temp_r26 = BoardPlayerModelGet(currItemRestore); + temp_r28 = BoardModelIDGet(temp_r26); + Hu3DModelAttrSet(temp_r28, 0x40000002); + var_r27 = 0; + for (i = 0; i < 9; i++) { + temp_f30 = (sp24[var_r27++] - var_f31) / 10.0f; + for (j = 0; j < 10; j++) { + BoardPlayerScaleSet(currItemRestore, var_f31, var_f31, var_f31); + var_f31 += temp_f30; + HuPrcVSleep(); + } + } + Hu3DModelAttrReset(temp_r28, 0x40000002); + BoardPlayerSizeSet(currItemRestore, arg0); +} + +static void ExecItemMini(void) { + suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); + BoardModelLayerSet(suitMdl, 2); + HuAudFXPlay(0x350); + ItemShowProc(NULL, NULL); + ItemSizeShowAnim(); + HuAudFXPlay(0x314); + omVibrate(currItemRestore, 90, 6, 6); + HuAudFXPlay(0x313); + ItemSizeSet(1); + HuPrcSleep(0x3C); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void ExecItemMega(void) { + suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); + BoardModelLayerSet(suitMdl, 2); + HuAudFXPlay(0x350); + ItemShowProc(NULL, NULL); + ItemSizeShowAnim(); + HuAudFXPlay(0x312); + omVibrate(currItemRestore, 90, 4, 2); + HuAudFXPlay(0x311); + ItemSizeSet(2); + HuPrcSleep(0x3C); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void ExecItemMiniSuper(void) { + suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); + BoardModelLayerSet(suitMdl, 2); + HuAudFXPlay(0x350); + ItemShowProc(NULL, NULL); + ItemSizeShowAnim(); + HuAudFXPlay(0x314); + omVibrate(currItemRestore, 90, 4, 2); + HuAudFXPlay(0x313); + ItemSizeSet(1); + HuPrcSleep(0x3C); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void ExecItemMegaSuper(void) { + suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); + BoardModelLayerSet(suitMdl, 2); + HuAudFXPlay(0x350); + ItemShowProc(NULL, NULL); + ItemSizeShowAnim(); + HuAudFXPlay(0x312); + omVibrate(currItemRestore, 90, 0xC, 0); + HuAudFXPlay(0x311); + ItemSizeSet(2); + HuPrcSleep(0x3C); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void ExecItemHammer(void) { + Vec sp6C; + Vec sp60; + float sp10[2]; + s32 i; + s16 temp_r28; + s16 temp_r27; + s16 var_r26; + s16 var_r30; + + HuAudFXPlay(0x350); + ItemShowProc(NULL, NULL); + temp_r27 = ItemGetTarget(); + suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 0); + BoardModelLayerSet(suitMdl, 2); + var_r30 = frand() & 1; + if (var_r30 != 0) { + BoardModelMotionTimeSet(suitMdl, 1.5f); + } else { + BoardModelMotionTimeSet(suitMdl, 0.0f); + } + BoardModelAttrSet(suitMdl, 0x40000002); + sp60.x = sp60.y = sp60.z = 2.0f; + BoardModelScaleSetV(suitMdl, &sp60); + sp6C.x = sp6C.y = sp6C.z = 0.0f; + BoardUiInlineFunc01(&sp6C); + HuWinMesMaxSizeGet(1, sp10, 0x120011); + temp_r28 = HuWinCreate(-10000.0f, 320.0f, sp10[0], sp10[1], 0); + HuWinMesSet(temp_r28, 0x120011); + HuWinBGTPLvlSet(temp_r28, 0.0f); + HuWinMesSpeedSet(temp_r28, 0); + if (GWPlayer[currItemRestore].com) { + var_r26 = frandmod(0x78) + 0x1E; + } + for (i = 1; i <= 0x12C; i++) { + if (i % 10 == 0) { + HuAudFXPlay(0x315); + var_r30 ^= 1; + if (var_r30 != 0) { + BoardModelMotionTimeSet(suitMdl, 1.5f); + } else { + BoardModelMotionTimeSet(suitMdl, 0.0f); + } + } + if (GWPlayer[currItemRestore].com) { + var_r26--; + if (var_r26 == 0) { + break; + } + } else { + if (HuPadBtnDown[GWPlayerCfg[currItemRestore].pad_idx] & 0x100) { + break; + } + } + HuPrcVSleep(); + } + BoardModelAttrSet(suitMdl, 0x40000002); + HuAudFXPlay(0x316); + HuWinKill(temp_r28); + omVibrate(temp_r27, 0xC, 6, 6); + if (var_r30 != 0) { + BoardPlayerAutoSizeSet(temp_r27, 2); + } else { + BoardPlayerAutoSizeSet(temp_r27, 1); + } + HuPrcSleep(30); + BoardUiInlineFunc02(); + BoardModelKill(suitMdl); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +// https://decomp.me/scratch/QqVh2 +static void ExecItemPipe(void) { +} + +// https://decomp.me/scratch/r8MWA +static void ExecItemSwap(void) { + (void) 0.033333335f; + (void) 3.3333333f; + (void) 5.0f; + (void) 0.05f; + (void) 0.65f; + (void) 1.08f; + (void) 19.0f; + (void) 0.06666667f; + (void) 0.25f; + (void) 8.0f; + (void) 0.044444446f; + (void) 45.0f; + (void) 0.94f; + (void) 6.0f; + (void) 0.6f; + (void) 255.0f; + (void) 1.02f; + (void) 5.6666665f; + (void) 4503601774854144.0; + (void) 106.0; +} + +void ExecItemSpark(void) { + Vec sp68; + Vec sp5C; + Vec sp50; + Vec sp44; + Vec sp38; + Vec sp2C; + Vec sp20; + float var_f31; + float var_f30; + s32 temp_r28; + s16 temp_r30; + s32 i; + + temp_r30 = BoardModelCreate(0x70067, NULL, 0); + BoardModelLayerSet(temp_r30, 3); + BoardModelVisibilitySet(temp_r30, 0); + HuAudFXPlay(0x350); + suitMdl = BoardModelCreate(itemMdlTbl[currItem], lbl_801D37A0, 0); + BoardModelLayerSet(suitMdl, 2); + ItemShowProc(NULL, NULL); + temp_r28 = GWPlayer[currItemRestore].space_curr; + sp38.x = sp38.y = sp38.z = 1.0f; + for (i = 0; i < 0x1E; i++) { + sp38.x += 0.033333335f; + sp38.y += 0.033333335f; + sp38.z += 0.033333335f; + BoardModelScaleSetV(suitMdl, &sp38); + HuPrcVSleep(); + } + sp38.x = sp38.y = sp38.z = 2.0f; + BoardModelScaleSetV(suitMdl, &sp38); + HuAudFXPlay(0x31A); + BoardPlayerPosGet(currItemRestore, &sp44); + BoardSpaceCornerPosGet(temp_r28, 0, &sp50); + BoardPlayerPosLerpStart(currItemRestore, &sp44, &sp50, 0x14); + while (GWPlayer[currItemRestore].moving) { + HuPrcVSleep(); + } + BoardPlayerMotBlendSet(currItemRestore, 0, 7); + while (!BoardPlayerMotBlendCheck(currItemRestore)) { + HuPrcVSleep(); + } + BoardRotateDiceNumbers(currItemRestore); + BoardSpacePosGet(0, temp_r28, &sp5C); + BoardModelPosSetV(temp_r30, &sp5C); + sp5C.y += 106.0f; + BoardModelPosGet(suitMdl, &sp68); + var_f30 = -3.0f; + while (1) { + sp68.y += var_f30; + if (sp68.y <= sp5C.y) { + break; + } + BoardModelPosSetV(suitMdl, &sp68); + var_f30 *= 1.08f; + HuPrcVSleep(); + } + sp68.y = sp5C.y; + BoardModelPosSetV(suitMdl, &sp68); + sp5C.y -= 106.0f; + BoardSpaceRotGet(0, GWPlayer[currItemRestore].space_curr, &sp20); + BoardModelRotSetV(suitMdl, &sp20); + BoardModelPosGet(suitMdl, &sp2C); + sp2C.z += 106.0 * sin(M_PI * sp20.x / 180.0); + sp2C.x -= 106.0 * sin(M_PI * sp20.z / 180.0); + BoardModelPosSetV(suitMdl, &sp2C); + HuAudFXPlay(0x31B); + BoardModelMotionStart(suitMdl, 1, 0); + BoardModelMotionTimeSet(suitMdl, 0.0f); + while (BoardModelMotionTimeGet(suitMdl) < BoardModelMotionMaxTimeGet(suitMdl)) { + HuPrcVSleep(); + } + for (i = 0; i < 4; i++) { + omVibrate(i, 0xC, 4, 2); + } + HuAudFXPlay(0x31C); + BoardModelVisibilitySet(temp_r30, 1); + BoardModelMotionTimeSet(temp_r30, 0.0f); + while (BoardModelMotionTimeGet(temp_r30) < BoardModelMotionMaxTimeGet(temp_r30)) { + HuPrcVSleep(); + } + var_f31 = 255.0f; + for (i = 0; i < 0x2D; i++) { + var_f31 -= 5.6666665f; + BoardModelAlphaSet(suitMdl, var_f31); + HuPrcVSleep(); + } + BoardModelAlphaSet(suitMdl, 0); + BoardUiInlineFunc03(currItemRestore); + BoardModelKill(suitMdl); + BoardModelKill(temp_r30); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void ExecItemLight(void) { + s16 temp_r31; + + HuAudFXPlay(0x350); + ItemShowProc(NULL, NULL); + BoardWinCreateChoice(2, 0x12000F, -1, 0); + BoardWinInsertMesSet(0x80008, 3); + if (GWPlayer[currItemRestore].com) { + BoardComKeySetRight(); + } + BoardWinWait(); + temp_r31 = BoardWinChoiceGet(); + BoardWinKill(); + if (temp_r31 == -1 || temp_r31 == 0) { + BoardPlayerItemAdd(boardItemUser, currItem); + } + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +// https://decomp.me/scratch/gbgTk +static void ExecItemWhistle(void) { + (void) 0.003921569f; + (void) 0.5f; + (void) 120.0f; + (void) 120.0; + (void) 100.0f; + (void) 90.0f; + (void) 200.0f; + (void) 0.03448276f; + (void) 30.0f; + (void) 95.0f; + (void) 185.0f; + (void) 275.0f; + (void) -1.0f; + (void) -35.0f; + (void) 0.16f; + (void) 1.0; + (void) 4.0f; + (void) 4.5f; + (void) 1.7f; + (void) 0.083333336f; + (void) 0.945f; + (void) 500.0f; +} + +static void ExecItemBowser(void) { + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + float var_f31; + s16 temp_r31; + s32 var_r29; + s32 i; + + BoardBowserSuitInit(currItemRestore); + suitMdl = BoardBowserSuitModelGet(); + temp_r31 = BoardBowserSuitPlayerModelGet(); + suitMot[0] = BoardModelMotionCreate(suitMdl, 0x4001C); + suitMot[1] = BoardModelMotionCreate(suitMdl, 0x4001D); + suitCommonMot[0] = BoardModelMotionCreate(temp_r31, suitMotTbl[GWPlayer[currItemRestore].character][0]); + suitCommonMot[1] = BoardModelMotionCreate(temp_r31, suitMotTbl[GWPlayer[currItemRestore].character][1]); + BoardModelVisibilitySet(temp_r31, 0); + HuAudFXPlay(0x350); + sp20.x = sp20.y = sp20.z = 0.3f; + ItemShowProc(NULL, &sp20); + for (i = 0; i < 0x1E; i++) { + sp20.x += 0.023333333f; + sp20.y += 0.023333333f; + sp20.z += 0.023333333f; + BoardModelScaleSetV(suitMdl, &sp20); + HuPrcVSleep(); + } + sp20.x = sp20.y = sp20.z = 1.0f; + BoardModelScaleSetV(suitMdl, &sp20); + HuAudFXPlay(0x325); + var_r29 = GWPlayer[currItemRestore].space_curr; + BoardSpacePosGet(0, var_r29, &sp14); + BoardModelPosGet(suitMdl, &sp2C); + var_f31 = -4.0f; + sp8.x = sp8.y = sp8.z = 1.0f; + while (1) { + sp2C.y += var_f31; + if (sp2C.y <= sp14.y + 100.0f) { + sp8.y = (sp2C.y - sp14.y) / 100.0f; + BoardPlayerScaleSetV(currItemRestore, &sp8); + } + if (sp2C.y <= sp14.y) { + break; + } + BoardModelPosSetV(suitMdl, &sp2C); + var_f31 *= 1.09f; + HuPrcVSleep(); + } + sp2C.y = sp14.y; + BoardModelPosSetV(suitMdl, &sp2C); + BoardModelVisibilitySet(BoardPlayerModelGet(currItemRestore), 0); + omVibrate(currItemRestore, 0xC, 4, 2); + HuAudFXPlay(0x326); + BoardModelVisibilitySet(temp_r31, 1); + BoardModelHookSet(suitMdl, "itemhook_head", temp_r31); + BoardModelMotionShiftSet(suitMdl, suitMot[1], 0.0f, 5.0f, 0); + BoardModelMotionShiftSet(temp_r31, suitCommonMot[1], 0.0f, 5.0f, 0); + while (!BoardModelMotionEndCheck(suitMdl)) { + HuPrcVSleep(); + } + BoardModelMotionShiftSet(suitMdl, suitMot[0], 0.0f, 5.0f, 0); + BoardModelMotionShiftSet(temp_r31, suitCommonMot[0], 0.0f, 5.0f, 0); + HuPrcSleep(0x28); + HuAudPlayerVoicePlay(currItemRestore, 0x129); + omVibrate(currItemRestore, 0xC, 4, 2); + HuPrcSleep(0x3C); + BoardModelMotionShiftSet(suitMdl, 0, 0.0f, 5.0f, 0x40000001); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +// DATA + 0x218 +// ... +static u8 data_offset_temp[0xC] = { 0 }; + +// https://decomp.me/scratch/0M6lm +static void ExecItemBooBall(void) { + (void) 4.25f; + (void) 0.016666668f; + (void) 0.33333334f; + (void) 8.5f; + (void) 0.6666667f; + (void) 325.0f; + (void) -0.5f; + (void) 40.0f; + (void) 125.0f; + (void) booBallPos; + (void) booBallScale; +} + +static void LampParticleUpdate(s32 arg0, ParticleData *arg1) { + HsfanimStruct01 *var_r31; + Vec spC; + float sp8; + float temp_f31; + float temp_f30; + s32 i; + s32 j; + + if (arg1->unk_34 == 0) { + var_r31 = arg1->unk_48; + for (i = 0; i < arg1->unk_30; i++, var_r31++) { + var_r31->unk2C = 0.0f; + var_r31->unk40.a = 0; + } + arg1->unk_04 = 0.0f; + arg1->unk_00 = 0; + } + if (arg1->unk_00 == 0) { + arg1->unk_00 = 2; + BoardModelRotGet(suitMdl, &spC); + for (i = 0; i < 2; i++) { + var_r31 = arg1->unk_48; + for (j = 0; j < arg1->unk_30; j++, var_r31++) { + if (var_r31->unk2C == 0.0f) { + break; + } + } + if (j != arg1->unk_30) { + var_r31->unk34.x = 60.0 * sin((spC.y - 90.0f) * M_PI / 180.0); + var_r31->unk34.y = 30.0f; + var_r31->unk34.z = 60.0 * cos((spC.y - 90.0f) * M_PI / 180.0); + sp8 = 12.0f; + var_r31->unk08.x = 12.0 * cos((i * 110.0f + 35.0f) * M_PI / 180.0); + var_r31->unk08.y = 12.0 * sin((i * 110.0f + 35.0f) * M_PI / 180.0); + var_r31->unk08.z = 3.0f + (frand() & 0xFF) * 5.0f * 0.003921569f; + var_r31->unk14.y = 255.0f; + var_r31->unk2C = 25.0f; + temp_f30 = 175.0f + (frand() & 0xFF) * 0x50 * 0.003921569f; + var_r31->unk40.r = var_r31->unk40.g = var_r31->unk40.b = temp_f30; + var_r31->unk00_s16 = 0; + } + } + } else { + arg1->unk_00--; + } + var_r31 = arg1->unk_48; + for (i = 0; i < arg1->unk_30; i++, var_r31++) { + if (var_r31->unk2C != 0.0f) { + if (var_r31->unk00_s16 == 0) { + PSVECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); + PSVECScale(&var_r31->unk08, &var_r31->unk08, 0.95f); + var_r31->unk2C += 8.0f; + var_r31->unk14.y -= 2.8333333f; + if (var_r31->unk14.y <= 120.0f) { + var_r31->unk14.y = 200.0f; + temp_f31 = (frand() & 0xFF) * 180.0f * 0.003921569f; + var_r31->unk08.x = 6.0 * cos(temp_f31 * M_PI / 180.0); + var_r31->unk08.y = -4.0f; + var_r31->unk08.z = 6.0 * sin(temp_f31 * M_PI / 180.0); + var_r31->unk00_s16 = 1; + } + var_r31->unk40.a = var_r31->unk14.y; + } else { + PSVECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); + var_r31->unk2C += 0.2f; + var_r31->unk14.y -= 1.8214285f; + if (var_r31->unk14.y <= 55.0f) { + var_r31->unk14.y = 0.0f; + var_r31->unk2C = 0.0f; + } + var_r31->unk40.a = var_r31->unk14.y; + } + } + } +} + +static void GenieParticleUpdate(s32 arg0, ParticleData *arg1) { + HsfanimStruct01* var_r31; + float temp_f31; + float temp_f30; + s32 var_r28; + s32 i; + + if (arg1->unk_34 == 0) { + var_r31 = arg1->unk_48; + for (i = 0; i < arg1->unk_30; i++, var_r31++) { + var_r31->unk34.x = -50.0f + (frand() & 0xFF) * 100.0f * 0.003921569f; + var_r31->unk34.y = -50.0f + (frand() & 0xFF) * 100.0f * 0.003921569f; + var_r31->unk34.z = -10.0f + (frand() & 0xFF) * 20.0f * 0.003921569f; + temp_f31 = 0.5f + (frand() & 0xFF) * 3.0f * 0.003921569f; + var_r31->unk08.x = temp_f31 * cos((i * 110.0f + 35.0f) * M_PI / 180.0); + var_r31->unk08.y = temp_f31 * sin((i * 110.0f + 35.0f) * M_PI / 180.0); + var_r31->unk08.z = 0.0f; + var_r31->unk14.y = 255.0f; + temp_f30 = 125.0f + (frand() & 0xFF) * 0x64 * 0.003921569f; + var_r31->unk40.r = var_r31->unk40.g = var_r31->unk40.b = temp_f30; + var_r31->unk00 = 0; + var_r31->unk2C = 80.0f + (frand() & 0xFF) * 60.0f * 0.003921569f; + } + } + var_r31 = arg1->unk_48; + var_r28 = 0; + for (i = 0; i < arg1->unk_30; i++, var_r31++) { + if (var_r31->unk2C != 0.0f) { + var_r28++; + PSVECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); + PSVECScale(&var_r31->unk08, &var_r31->unk08, 0.995f); + var_r31->unk2C -= 0.2f; + var_r31->unk14.y -= 1.59375f; + if (var_r31->unk14.y <= 20.0f) { + var_r31->unk14.y = 0.0f; + var_r31->unk2C = 0.0f; + } + var_r31->unk40.a = var_r31->unk14.y; + } + } + if (var_r28 == 0) { + arg1->unk_02 = 0; + } +} + +// DATA + 0x224 +static Vec shadowPos = { 0.0f, 4500.0f, 500.0f }; +static Vec shadowTarget = { 0.0f, 0.9f, -0.1f }; +static Vec shadowUp = { 0.0f, 0.0f, 500.0f }; + +static void GenieCameraProcInlineFunc(void) { + Hu3DShadowPosSet(&shadowPos, &shadowTarget, &shadowUp); +} + +static void GenieCameraProc(void) { + while (1) { + Hu3DCameraPerspectiveSet(2, genieFov, 10.0f, 20000.0f, 1.2f); + Hu3DCameraPosSetV(2, &booCamPos, &booCamTarget, &booCamUp); + Hu3DShadowData.unk_08.x = genieFov; + C_MTXLightPerspective(Hu3DShadowData.unk_68, Hu3DShadowData.unk_08.x, 1.2f, 0.5f, -0.5f, 0.5f, 0.5f); + GenieCameraProcInlineFunc(); + Hu3DShadowTPLvlSet(0.8f); + HuPrcVSleep(); + } +} + +static void GenieCameraCalc(UnkGenieCameraStruct *arg0, s32 arg1, float arg2, Vec *arg3, Vec *arg4) { + Vec spC = { 0.0f, 0.0f, 0.0f }; + float temp_f31 = arg2 * arg2; + float sp8 = temp_f31 * arg2; + Vec *temp_r31; + Vec *temp_r30; + Vec *temp_r29; + Vec *temp_r28; + Vec *temp_r27; + Vec *temp_r26; + Vec *temp_r25; + Vec *temp_r24; + + if (arg1 == 0) { + temp_r31 = &arg0[arg1].unk04; + temp_r29 = &arg0[arg1 + 1].unk04; + temp_r28 = &arg0[arg1 + 2].unk04; + temp_r30 = &arg0[arg1].unk10; + temp_r27 = &arg0[arg1 + 1].unk10; + temp_r26 = &arg0[arg1 + 2].unk10; + arg3->x = 0.5f * ((temp_r31->x - temp_r29->x * 2.0f + temp_r28->x) * temp_f31 + (temp_r31->x * -3.0f + temp_r29->x * 4.0f - temp_r28->x) * arg2 + temp_r31->x * 2.0f); + arg3->y = 0.5f * ((temp_r31->y - temp_r29->y * 2.0f + temp_r28->y) * temp_f31 + (temp_r31->y * -3.0f + temp_r29->y * 4.0f - temp_r28->y) * arg2 + temp_r31->y * 2.0f); + arg3->z = 0.5f * ((temp_r31->z - temp_r29->z * 2.0f + temp_r28->z) * temp_f31 + (temp_r31->z * -3.0f + temp_r29->z * 4.0f - temp_r28->z) * arg2 + temp_r31->z * 2.0f); + arg4->x = 0.5f * ((temp_r30->x - temp_r27->x * 2.0f + temp_r26->x) * temp_f31 + (temp_r30->x * -3.0f + temp_r27->x * 4.0f - temp_r26->x) * arg2 + temp_r30->x * 2.0f); + arg4->y = 0.5f * ((temp_r30->y - temp_r27->y * 2.0f + temp_r26->y) * temp_f31 + (temp_r30->y * -3.0f + temp_r27->y * 4.0f - temp_r26->y) * arg2 + temp_r30->y * 2.0f); + arg4->z = 0.5f * ((temp_r30->z - temp_r27->z * 2.0f + temp_r26->z) * temp_f31 + (temp_r30->z * -3.0f + temp_r27->z * 4.0f - temp_r26->z) * arg2 + temp_r30->z * 2.0f); + } else { + temp_r31 = &arg0[arg1 - 1].unk04; + temp_r29 = &arg0[arg1].unk04; + temp_r28 = &arg0[arg1 + 1].unk04; + temp_r25 = &arg0[arg1 + 2].unk04; + temp_r30 = &arg0[arg1 - 1].unk10; + temp_r27 = &arg0[arg1].unk10; + temp_r26 = &arg0[arg1 + 1].unk10; + temp_r24 = &arg0[arg1 + 2].unk10; + arg3->x = 0.5f * ((-temp_r31->x + temp_r29->x * 3.0f - temp_r28->x * 3.0f + temp_r25->x) * temp_f31 * arg2 + (temp_r31->x * 2.0f - temp_r29->x * 5.0f + temp_r28->x * 4.0f - temp_r25->x) * temp_f31 + (-temp_r31->x + temp_r28->x) * arg2 + temp_r29->x * 2.0f); + arg3->y = 0.5f * ((-temp_r31->y + temp_r29->y * 3.0f - temp_r28->y * 3.0f + temp_r25->y) * temp_f31 * arg2 + (temp_r31->y * 2.0f - temp_r29->y * 5.0f + temp_r28->y * 4.0f - temp_r25->y) * temp_f31 + (-temp_r31->y + temp_r28->y) * arg2 + temp_r29->y * 2.0f); + arg3->z = 0.5f * ((-temp_r31->z + temp_r29->z * 3.0f - temp_r28->z * 3.0f + temp_r25->z) * temp_f31 * arg2 + (temp_r31->z * 2.0f - temp_r29->z * 5.0f + temp_r28->z * 4.0f - temp_r25->z) * temp_f31 + (-temp_r31->z + temp_r28->z) * arg2 + temp_r29->z * 2.0f); + arg4->x = 0.5f * ((-temp_r30->x + temp_r27->x * 3.0f - temp_r26->x * 3.0f + temp_r24->x) * temp_f31 * arg2 + (temp_r30->x * 2.0f - temp_r27->x * 5.0f + temp_r26->x * 4.0f - temp_r24->x) * temp_f31 + (-temp_r30->x + temp_r26->x) * arg2 + temp_r27->x * 2.0f); + arg4->y = 0.5f * ((-temp_r30->y + temp_r27->y * 3.0f - temp_r26->y * 3.0f + temp_r24->y) * temp_f31 * arg2 + (temp_r30->y * 2.0f - temp_r27->y * 5.0f + temp_r26->y * 4.0f - temp_r24->y) * temp_f31 + (-temp_r30->y + temp_r26->y) * arg2 + temp_r27->y * 2.0f); + arg4->z = 0.5f * ((-temp_r30->z + temp_r27->z * 3.0f - temp_r26->z * 3.0f + temp_r24->z) * temp_f31 * arg2 + (temp_r30->z * 2.0f - temp_r27->z * 5.0f + temp_r26->z * 4.0f - temp_r24->z) * temp_f31 + (-temp_r30->z + temp_r26->z) * arg2 + temp_r27->z * 2.0f); + } +} + +// DATA + 0x248 +static s32 armUpMotTbl[] = { + 0x005F005C, + 0x001A005C, + 0x006D005C, + 0x008A005C, + 0x0085005C, + 0x0011005C, + 0x000D005C, + 0x0081005C +}; + +// DATA + 0x268 +static s32 scareMotTbl[] = { + 0x005F001C, + 0x001A001C, + 0x006D001C, + 0x008A001C, + 0x0085001C, + 0x0011001C, + 0x000D001C, + 0x0081001C +}; + +// DATA + 0x288 +static s32 impactMotTbl[] = { + 0x005F005E, + 0x001A005E, + 0x006D005E, + 0x008A005E, + 0x0085005E, + 0x0011005E, + 0x000D005E, + 0x0081005E +}; + +// DATA + 0x2A8 +static UnkGenieCameraStruct cameraDataTbl[] = { + 60.0f, { 0.0f, 100.0f, 950.0f }, { 0.0f, 100.0f, 600.0f }, + 60.0f, { -353.0f, 100.0f, 662.5f }, { 0.0f, 100.0f, 600.0f }, + 60.0f, { -500.0f, 100.0f, 375.0f }, { 0.0f, 100.0f, 600.0f }, + 60.0f, { -353.0f, 100.0f, 87.5f }, { 0.0f, 100.0f, 600.0f }, + 1.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 100.0f, 600.0f }, + 89.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 100.0f, 600.0f }, + 1.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 100.0f, 600.0f }, + 9.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 100.0f, 600.0f }, + 1.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 500.0f, 600.0f }, + 5.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 500.0f, 600.0f }, + 5.0f, { 0.0f, 100.0f, -200.0f }, { 0.0f, 500.0f, 600.0f } +}; + +// DATA + 0x3DC +static s32 genieMotTbl[] = { + 0x0007007D, + 0x0007007E, + 0x0007007F, + -1 +}; + +static void GenieSceneExec(void) { + GXColor sp1C = { 0xFF, 0xFF, 0xFF, 0xFF }; + Vec sp50; + Vec sp44; + Vec sp38; + Vec sp2C; + Vec sp20; + Process *temp_r21; + float temp_f30; + float var_f31; + s16 temp_r25; + s16 temp_r28; + s16 temp_r24; + s16 temp_r27; + s16 var_r22; + s16 temp_r20; + s32 var_r26; + s32 i; + ParticleData *temp_r23; + + BoardModelHideSetAll(1); + BoardSpaceHide(1); + for (i = 0; i < 4; i++) { + BoardStatusShowSet(i, 0); + } + BoardLightResetExec(); + temp_r25 = BoardModelCreate(0x70080, NULL, 0); + sp50.x = sp50.y = sp50.z = 0.0f; + BoardModelPosSetV(temp_r25, &sp50); + BoardModelCameraSet(temp_r25, 2); + Hu3DModelAmbSet(BoardModelIDGet(temp_r25), 1.0f, 1.0f, 1.0f); + temp_r24 = BoardModelCreate(0x70081, NULL, 0); + BoardModelPosSetV(temp_r24, &sp50); + BoardModelCameraSet(temp_r24, 2); + Hu3DModelAmbSet(BoardModelIDGet(temp_r24), 1.0f, 1.0f, 1.0f); + temp_r28 = BoardModelCreate(0x7007C, genieMotTbl, 0); + sp50.x = sp50.y = 0.0f; + sp50.z = 600.0f; + sp44.x = sp44.z = 0.0f; + sp44.y = 180.0f; + BoardModelPosSetV(temp_r28, &sp50); + BoardModelRotSetV(temp_r28, &sp44); + BoardModelCameraSet(temp_r28, 2); + BoardModelAttrSet(temp_r28, 0x40000001); + sp38.x = sp38.y = sp38.z = 0.0f; + BoardPlayerCameraSet(currItemRestore, 2); + BoardPlayerPosSetV(currItemRestore, &sp38); + BoardModelVisibilitySet(BoardPlayerModelGet(currItemRestore), 1); + PSVECSubtract(&shadowUp, &shadowPos, &sp2C); + PSVECNormalize(&sp2C, &sp2C); + temp_r20 = Hu3DGLightCreateV(&shadowPos, &sp2C, &sp1C); + Hu3DShadowCreate(60.0f, 10.0f, 20000.0f); + Hu3DModelShadowSet(BoardModelIDGet(BoardPlayerModelGet(currItemRestore))); + Hu3DModelShadowSet(BoardModelIDGet(temp_r28)); + Hu3DModelShadowMapSet(BoardModelIDGet(temp_r25)); + Hu3DShadowSizeSet(0xF0); + Hu3DCameraCreate(2); + booCamPos.x = 0.0f; + booCamPos.y = 100.0f; + booCamPos.z = 950.0f; + booCamTarget.x = booCamTarget.z = 0.0f; + booCamTarget.y = 1.0f; + booCamUp.x = 0.0f; + booCamUp.y = 100.0f; + booCamUp.z = 600.0f; + genieFov = 15.0f; + Hu3DShadowData.unk_08.x = genieFov; + C_MTXLightPerspective(Hu3DShadowData.unk_68, Hu3DShadowData.unk_08.x, 1.2f, 0.5f, -0.5f, 0.5f, 0.5f); + temp_r21 = HuPrcChildCreate(GenieCameraProc, 0x2005, 0x1000, 0, HuPrcCurrentGet()); + Hu3DBGColorSet(0xFF, 0xFF, 0xFF); + temp_r27 = Hu3DParticleCreate(genieParticleAnim, 0x32); + Hu3DParticleHookSet(temp_r27, &GenieParticleUpdate); + Hu3DParticleBlendModeSet(temp_r27, 1); + Hu3DParticleColSet(temp_r27, 0xFF, 0xFF, 0xFF); + Hu3DParticleAnimModeSet(temp_r27, 0); + Hu3DParticleAttrSet(temp_r27, 1); + Hu3DModelLayerSet(temp_r27, 7); + Hu3DModelPosSet(temp_r27, booCamPos.x, booCamPos.y, booCamPos.z - 175.0f); + temp_r23 = Hu3DData[temp_r27].unk_120; + temp_r23->unk_02 = 1; + WipeCreate(1, 0, 0x2D); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + BoardMusStart(1, 9, 0x7F, 0); + while (temp_r23->unk_02 != 0) { + HuPrcVSleep(); + } + HuPrcSleep(0x2D); + HuAudPlayerVoicePlay(currItemRestore, 0x128); + BoardPlayerMotionStart(currItemRestore, geniePlayerMot[1], 0); + BoardPlayerMotionEndWait(currItemRestore); + HuPrcSleep(0x19); + Hu3DModelKill(temp_r27); + for (i = 0; i < 0xA; i++) { + genieFov += 4.5f; + HuPrcVSleep(); + } + genieFov = 60.0f; + HuPrcSleep(0x5A); + var_f31 = 0.0f; + var_r26 = 0; + while (1) { + GenieCameraCalc(&cameraDataTbl[0], var_r26, var_f31 / cameraDataTbl[var_r26].unk00, &booCamPos, &booCamUp); + var_f31 += 1.0f; + if (var_f31 >= cameraDataTbl[var_r26].unk00) { + var_r26++; + var_f31 = 0.0f; + } + if (var_r26 >= 8) { + break; + } + HuPrcVSleep(); + } + GenieCameraCalc(&cameraDataTbl[0], var_r26, 1.0f, &booCamPos, &booCamUp); + HuPrcSleep(0x96); + BoardRotateDiceNumbers(currItemRestore); + sp2C = booCamPos; + sp20 = booCamUp; + booCamUp.x = sp38.x + (sp50.x - sp38.x) * 0.7f; + booCamUp.y = sp38.y + 400.0f; + booCamUp.z = sp38.z + (sp50.z - sp38.z) * 0.7f; + booCamPos.x = booCamUp.x + sin(-5 * M_PI / 9) * 1100.0; + booCamPos.y = booCamUp.y + 950.0f; + booCamPos.z = booCamUp.z + cos(-5 * M_PI / 9) * 1100.0; + HuAudFXPlay(0x356); + BoardWinCreate(2, 0x12001B, -1); + BoardWinWait(); + BoardWinKill(); + booCamUp = sp20; + booCamPos = sp2C; + HuAudFXPlay(0x33E); + HuAudFXPlay(0x367); + BoardModelMotionStart(temp_r28, 1, 0); + var_r22 = 0; + while (BoardModelMotionTimeGet(temp_r28) <= 30.0f) { + HuPrcVSleep(); + } + var_f31 = 0.0f; + while (1) { + temp_f30 = 40.0f - var_f31 * var_f31 * 0.25f * 0.0125f; + if (temp_f30 <= 0.0f && var_r22 == 0) { + var_r22 = 1; + BoardModelMotionShiftSet(temp_r28, 3, 0.0f, 4.0f, 0); + } + var_f31 += 1.0f; + sp50.y += temp_f30; + if (sp50.y <= 0.0f) { + break; + } + BoardModelPosSetV(temp_r28, &sp50); + booCamUp.y = sp50.y + 140.0f; + HuPrcVSleep(); + } + HuAudFXPlay(0x368); + sp50.y = 0.0f; + BoardModelPosSetV(temp_r28, &sp50); + booCamUp.y = sp38.y + 100.0f; + BoardModelMotionStart(temp_r28, 2, 0); + omVibrate(currItemRestore, 0xC, 0xC, 0); + booCamUp.y = 500.0f; + HuAudFXPlay(0x35B); + HuAudFXPlay((GWPlayer[currItemRestore].character << 6) + 0x123); + var_f31 = 0.0f; + while (1) { + temp_f30 = 60.0f - var_f31 * var_f31 * 0.25f * 0.009166667f; + var_f31 += 1.0f; + sp38.y += temp_f30; + BoardPlayerPosSetV(currItemRestore, &sp38); + if (booCamUp.y < 1100.0f) { + booCamUp.y = sp38.y + 160.0f; + } + if (sp38.y >= 2800.0f) { + break; + } + HuPrcVSleep(); + } + WipeCreate(2, 0, 0x2D); + BoardAudSeqFadeOut(1, 0x3E8); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + BoardModelKill(temp_r28); + BoardModelKill(temp_r25); + BoardModelKill(temp_r24); + Hu3DCameraKill(2); + Hu3DGLightKill(temp_r20); + BoardModelHideSetAll(0); + BoardSpaceHide(0); + for (i = 0; i < 4; i++) { + BoardStatusShowSet(i, 1); + } + HuPrcKill(temp_r21); + BoardPlayerCameraSet(currItemRestore, 1); + BoardLightSetExec(); + HuAudFXPauseAll(0); +} + +static void ExecItemGenie(void) { + UnkItemShowProcStruct sp24; + Vec sp18; + Vec spC; + ParticleData *sp8; + Process *temp_r27; + float var_f29; + float var_f31; + float var_f30; + s16 temp_r31; + s16 var_r26; + s32 temp_r28; + s32 temp_r25; + s32 var_r30; + + suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 1); + BoardModelLayerSet(suitMdl, 2); + genieParticleAnim = HuSprAnimRead(HuDataSelHeapReadNum(0x70069, MEMORY_DEFAULT_NUM, HEAP_DATA)); + HuSprAnimLock(genieParticleAnim); + geniePlayerMot[0] = BoardPlayerMotionCreate(currItemRestore, armUpMotTbl[GWPlayer[currItemRestore].character]); + geniePlayerMot[1] = BoardPlayerMotionCreate(currItemRestore, scareMotTbl[GWPlayer[currItemRestore].character]); + geniePlayerMot[2] = BoardPlayerMotionCreate(currItemRestore, impactMotTbl[GWPlayer[currItemRestore].character]); + sp24.unk02 = suitMdl; + sp24.unk04 = 4.0f; + sp24.unk08 = 3.0f; + sp24.unk10 = sp24.unk14 = sp24.unk18 = 0.0f; + sp24.unk14 = 4.0f; + sp24.unk1C = 1; + HuAudFXPlay(0x350); + temp_r27 = ItemShowProc(&sp24, NULL); + BoardCameraViewSet(3); + HuAudFXPlay(0x323); + var_r30 = 0; + while (1) { + if (var_r30 == 0x69) { + BoardPlayerMotionStart(currItemRestore, geniePlayerMot[0], 0); + } + BoardModelRotGet(suitMdl, &spC); + if (90.0f - spC.y <= sp24.unk14 && 90.0f - spC.y >= 0.0f && var_r30 >= 0x78) { + break; + } + HuPrcVSleep(); + var_r30++; + } + HuAudPlayerVoicePlay(currItemRestore, 0x125); + temp_r25 = HuAudFXPlay(0x34D); + temp_r31 = Hu3DParticleCreate(genieParticleAnim, 0x96); + Hu3DParticleHookSet(temp_r31, &LampParticleUpdate); + Hu3DParticleBlendModeSet(temp_r31, 0); + Hu3DParticleColSet(temp_r31, 0xFF, 0xFF, 0xFF); + Hu3DParticleAnimModeSet(temp_r31, 0); + Hu3DParticleAttrSet(temp_r31, 1); + Hu3DModelLayerSet(temp_r31, 7); + BoardModelPosGet(suitMdl, &spC); + Hu3DModelPosSet(temp_r31, spC.x, spC.y, spC.z); + sp8 = Hu3DData[temp_r31].unk_120; + omVibrate(currItemRestore, 0xB5, 6, 6); + HuPrcSleep(0x87); + BoardAudSeqPause(0, 1, 0x3E8); + HuAudFXStop(temp_r25); + HuAudFXPauseAll(1); + WipeColorSet(0xFF, 0xFF, 0xFF); + WipeCreate(2, 0, 0x2D); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + Hu3DModelKill(temp_r31); + BoardModelKill(suitMdl); + HuPrcKill(temp_r27); + BoardRotateDiceNumbers(currItemRestore); + GenieSceneExec(); + BoardCameraMoveSet(0); + BoardCameraViewSet(2); + temp_r28 = BoardSpaceStarGetCurr(); + BoardCameraTargetSpaceSet(temp_r28); + GWPlayer[currItemRestore].space_curr = temp_r28; + BoardSpacePosGet(0, temp_r28, &spC); + sp18 = spC; + spC.y += 1000.0f; + BoardPlayerPosSetV(currItemRestore, &spC); + BoardCameraMotionWait(); + BoardCameraMoveSet(1); + WipeCreate(1, 0, 0x2D); + HuPrcSleep(0xF); + BoardAudSeqPause(0, 0, 1000); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + HuAudFXPlay(0x35E); + fn_8004F578(GWPlayer[currItemRestore].character, 0); + BoardPlayerMotionStart(currItemRestore, 6, 0x40000001); + var_f29 = 0.0f; + var_f31 = 1.0f; + var_r26 = 0; + while (1) { + var_f30 = var_f29 - var_f31 * var_f31 * 0.25f * 0.06666667f; + if (var_f30 < -35.0f) { + var_f30 = -35.0f; + } + if (var_f30 > 35.0f) { + var_f30 = 35.0f; + } + var_f31 += 1.0f; + spC.y += var_f30; + if (spC.y <= sp18.y) { + omVibrate(currItemRestore, 0xC, 6, 6); + spC.y = sp18.y; + var_f29 = -var_f30 * 0.2f; + if (fabs(var_f29) <= 5.0) { + var_f31 = -1.0f; + break; + } + var_f31 = 1.0f; + if (var_r26 == 0) { + BoardPlayerMotionStart(currItemRestore, geniePlayerMot[2], 0); + } + } + BoardPlayerPosSetV(currItemRestore, &spC); + HuPrcVSleep(); + } + BoardRotateDiceNumbers(currItemRestore); + fn_8004F578(GWPlayer[currItemRestore].character, 1); + HuSprAnimKill(genieParticleAnim); + BoardPlayerMotionKill(currItemRestore, geniePlayerMot[0]); + BoardPlayerMotionKill(currItemRestore, geniePlayerMot[1]); + BoardPlayerMotionKill(currItemRestore, geniePlayerMot[2]); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +void BoardItemBagItemSet(s16 *arg0) { + s32 i; + + for (i = 0; i < 3; i++) { + itemBagItems[i] = arg0[i]; + } +} + +static void ExecItemBagJump(void) { + Vec sp20; + Vec sp14; + Vec sp8; + float temp_f29; + float var_f30; + float var_f31; + s16 temp_r31; + + temp_r31 = (s16) HuPrcCurrentGet()->user_data; + BoardModelScaleGet(temp_r31, &sp20); + BoardModelPosGet(temp_r31, &sp14); + sp8 = sp14; + sp8.y += 80.0f; + var_f31 = 0.0f; + var_f30 = 0.0f; + HuAudFXPlay(0x310); + while (1) { + temp_f29 = 8.0f - var_f30 * var_f30 * 0.25f * 0.075f; + var_f31 += 0.1f; + if (var_f31 > 1.0f) { + var_f31 = 1.0f; + } + sp20.x = sp20.y = sp20.z = var_f31; + sp14.y += temp_f29; + BoardModelPosSetV(temp_r31, &sp14); + BoardModelScaleSetV(temp_r31, &sp20); + var_f30 += 1.0f; + if (temp_f29 < 0.0f) { + break; + } + HuPrcVSleep(); + } + CharModelLayerSetAll(3); + CharModelCreateParticle(1, &sp14); + BoardModelVisibilitySet(temp_r31, 0); + HuAudFXPlay(0x30D); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void ExecItemBagShow(void) { + Vec sp14; + Vec sp8; + float var_f31; + Process *temp_r31; + UnkItemShowProcStruct *temp_r30; + UnkItemShowProcStruct *temp_r29; + + temp_r31 = HuPrcCurrentGet()->user_data; + temp_r30 = temp_r31->user_data; + temp_r30->unk00 = 1; + BoardModelPosGet(suitMdl, &sp14); + var_f31 = 0.0f; + while (1) { + if (var_f31 >= 180.0f) { + break; + } + sp8 = sp14; + sp8.y += 15.0 * sin(M_PI * var_f31 / 180.0); + BoardModelPosSetV(suitMdl, &sp8); + var_f31 += 36.0f; + HuPrcVSleep(); + } + BoardModelPosSetV(suitMdl, &sp14); + temp_r29 = temp_r31->user_data; + temp_r29->unk00 = 0; + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void ExecItemBag(void) { + UnkItemShowProcStruct sp3C; + Vec sp30; + Vec sp24; + Vec sp18; + float temp_f31; + float sp10[2]; + s16 sp8[3]; + s16 temp_r28; + s16 temp_r27; + s16 var_r26; + s16 var_r30; + s16 temp_r23; + s16 i; + u16 var_r25; + Process *temp_r29; + Process *temp_r24; + + for (i = 0; i < 3; i++) { + if (itemBagItems[i] == -1) { + itemBagItems[i] = rand8() % 13; + } + } + temp_r23 = GWPlayer[currItemRestore].port; + suitMdl = BoardModelCreate(itemMdlTbl[currItem], NULL, 1); + BoardModelLayerSet(suitMdl, 2); + BoardCameraRotGet(&sp18); + BoardModelRotYSet(suitMdl, sp18.y); + temp_r27 = var_r30 = 3 - BoardPlayerItemCount(currItemRestore); + for (i = 0; i < temp_r27; i++) { + sp8[i] = BoardModelCreate(itemMdlTbl[itemBagItems[i]], NULL, 1); + if (itemBagItems[i] == 0xB) { + BoardModelAttrSet(sp8[i], 0x40000001); + } + if (itemBagItems[i] == 5) { + temp_f31 = -50.0f; + Hu3DData[BoardModelIDGet(sp8[i])].unk_F0[1][3] = temp_f31; + } + BoardModelRotYSet(sp8[i], sp18.y); + BoardModelLayerSet(sp8[i], 2); + BoardModelVisibilitySet(sp8[i], 0); + } + sp3C.unk02 = suitMdl; + sp3C.unk04 = 2.0f; + sp3C.unk08 = 5.0f; + sp3C.unk10 = sp3C.unk14 = sp3C.unk18 = 0.0f; + sp3C.unk1C = 0; + HuAudFXPlay(0x350); + temp_r24 = ItemShowProc(&sp3C, NULL); + HuWinMesMaxSizeGet(1, sp10, 0x120014); + temp_r28 = HuWinCreate(-10000.0f, 320.0f, sp10[0], sp10[1], 0); + HuWinMesSet(temp_r28, 0x120014); + HuWinBGTPLvlSet(temp_r28, 0.0f); + HuWinMesSpeedSet(temp_r28, 0); + var_r26 = frandmod(0x28) + 0x1E; + var_r30 = 0; + sp24.x = sp24.y = sp24.z = 0.0f; + while (var_r30 < temp_r27) { + if (GWPlayerCfg[currItemRestore].iscom == 1) { + if (--var_r26 == 0) { + var_r25 = 0x100; + var_r26 = frandmod(0x28) + 0x1E; + } + } else { + var_r25 = HuPadBtnDown[temp_r23]; + } + if (!(var_r25 & 0x100)) { + HuPrcVSleep(); + } else { + BoardPlayerDiceJumpStart(currItemRestore); + while (!BoardPlayerDiceJumpCheck(currItemRestore)) { + HuPrcVSleep(); + } + HuAudFXPlay(0x324); + BoardModelPosGet(suitMdl, &sp30); + BoardModelPosSetV(sp8[var_r30], &sp30); + BoardModelScaleSetV(sp8[var_r30], &sp24); + BoardModelVisibilitySet(sp8[var_r30], 1); + temp_r29 = HuPrcChildCreate(ExecItemBagJump, 0x2004, 0x1000, 0, HuPrcCurrentGet()); + temp_r29->user_data = (void*) sp8[var_r30]; + temp_r29 = HuPrcChildCreate(ExecItemBagShow, 0x2004, 0x1000, 0, HuPrcCurrentGet()); + temp_r29->user_data = temp_r24; + while (GWPlayer[currItemRestore].field08_bit3) { + HuPrcVSleep(); + } + HuPrcChildWatch(); + BoardPlayerItemAdd(currItemRestore, itemBagItems[var_r30]); + BoardPlayerMotionShiftSet(currItemRestore, 1, 0.0f, 10.0f, 0x40000001); + HuPrcSleep(0xA); + var_r30++; + } + } + HuWinKill(temp_r28); + BoardModelPosGet(suitMdl, &sp30); + CharModelLayerSetAll(3); + CharModelCreateParticle(1, &sp30); + HuAudFXPlay(0x351); + HuPrcSleep(0xA); + HuPrcKill(temp_r24); + BoardModelKill(suitMdl); + for (i = 0; i < temp_r27; i++) { + BoardModelKill(sp8[i]); + } + HuPrcSleep(0x1E); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void RestoreItemNull(void) { + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void RestoreItemMini(void) { + HuAudFXPlay(0x311); + ItemSizeSet(0); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void RestoreItemMega(void) { + HuAudFXPlay(0x313); + ItemSizeSet(0); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void RestoreItemMiniSuper(void) { + HuAudFXPlay(0x311); + ItemSizeSet(0); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void RestoreItemMegaSuper(void) { + HuAudFXPlay(0x313); + ItemSizeSet(0); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} + +static void RestoreItemBowser(void) { + Vec sp20; + Vec sp14; + Vec sp8; + s16 temp_r31; + s16 temp_r29; + s16 i; + + temp_r31 = BoardModelCreate(0x70063, NULL, 0); + BoardModelVisibilitySet(temp_r31, 0); + BoardModelLayerSet(temp_r31, 3); + BoardPlayerPosGet(currItemRestore, &sp14); + sp20.x = sp20.y = sp20.z = 0.0f; + sp14.y += 100.0f; + BoardModelPosSetV(temp_r31, &sp14); + BoardModelScaleSetV(temp_r31, &sp20); + BoardModelAttrSet(temp_r31, 0x40000001); + BoardModelAttrSet(temp_r31, 0x400000); + suitMdl = BoardBowserSuitModelGet(); + temp_r29 = BoardBowserSuitPlayerModelGet(); + BoardModelMotionShiftSet(suitMdl, suitMot[0], 0.0f, 5.0f, 0); + BoardModelMotionShiftSet(temp_r29, suitCommonMot[0], 0.0f, 5.0f, 0); + HuPrcSleep(0x28); + HuAudPlayerVoicePlay(currItemRestore, 0x129); + HuPrcSleep(0x14); + HuAudFXPlay(0x32B); + BoardModelVisibilitySet(temp_r31, 1); + for (i = 0; i < 0x3C; i++) { + sp20.x += 0.15f; + sp20.y += 0.15f; + sp20.z += 0.15f; + BoardModelScaleSetV(temp_r31, &sp20); + HuPrcVSleep(); + } + sp20.x = sp20.y = sp20.z = 9.0f; + BoardModelScaleSetV(temp_r31, &sp20); + HuPrcSleep(0x3C); + HuAudFXPlay(0x313); + BoardModelHookReset(suitMdl); + BoardBowserSuitKill(currItemRestore); + sp8.x = sp8.y = sp8.z = 1.0f; + BoardPlayerScaleSetV(currItemRestore, &sp8); + BoardModelVisibilitySet(BoardPlayerModelGet(currItemRestore), 1); + for (i = 0; i < 0x3C; i++) { + sp20.x -= 0.15f; + sp20.y -= 0.15f; + sp20.z -= 0.15f; + BoardModelScaleSetV(temp_r31, &sp20); + HuPrcVSleep(); + } + BoardModelKill(temp_r31); + HuPrcKill(NULL); + while (1) { + HuPrcVSleep(); + } +} diff --git a/src/game/board/main.c b/src/game/board/main.c index 27d7992b..900c5738 100644 --- a/src/game/board/main.c +++ b/src/game/board/main.c @@ -9,7 +9,10 @@ #include "game/hsfman.h" #include "game/hsfdraw.h" #include "game/board/main.h" +#include "game/board/pause.h" #include "game/board/player.h" +#include "game/board/tutorial.h" +#include "game/board/ui.h" #include "game/pad.h" #include "game/msm.h" @@ -27,8 +30,8 @@ static omObjData *confettiObj; static omObjData *filterObj; BoardTurnStartHook boardTurnStartFunc; void *boardBowserHook; -void *boardStarShowNextHook; -void *boardStarGiveHook; +void (*boardStarShowNextHook)(void); +void (*boardStarGiveHook)(void); BoardFunc boardTurnFunc; BoardLightHook boardLightResetHook; BoardLightHook boardLightSetHook; @@ -61,8 +64,6 @@ extern s32 BoardSpacePosGet(s32 layer, s32 space, Vec *pos); extern void BoardMGSetupPlayClear(void); extern void BoardStartExec(void); -extern s8 boardTutorialF; - static void InitBoardFunc(omObjData *object); static void ExecBoardFunc(omObjData *object); static void KillBoardFunc(omObjData *object); @@ -210,7 +211,7 @@ static void KillBoardFunc(omObjData *object) BoardTutorialWorkRestore(); } _ClearFlag(FLAG_ID_MAKE(1, 0)); - HuARDirFree(MAKE_DIR_NUM(DATADIR_BOARD)); + HuARDirFree(DATADIR_BOARD); if(_CheckFlag(FLAG_ID_MAKE(1, 27))) { omOvlReturnEx(2, 1); } else { @@ -290,7 +291,7 @@ void BoardSaveInit(s32 board) GWSystem.field31_bit4 = 0; GWSystem.unk_32 = 1; GWSystem.mg_next = 0; - GWSystem.mg_next_extra = 0; + GWSystem.mg_next_type = 0; GWSystem.unk_38 = 0; GWSystem.block_pos = 0; memset(GWSystem.board_data, 0, 32); @@ -334,13 +335,13 @@ void BoardSaveInit(s32 board) } } -void BoardStoryConfigSet(s32 mg_type, s32 diff_story) +void BoardStoryConfigSet(s32 mg_list, s32 diff_story) { GWSystem.party = 0; GWSystem.team = 0; GWSystem.diff_story = diff_story; GWSystem.bonus_star = 0; - GWSystem.mg_type = mg_type; + GWSystem.mg_list = mg_list; GWPlayer[0].handicap = 0; GWPlayer[1].handicap = 0; GWPlayer[2].handicap = 0; @@ -358,13 +359,13 @@ void BoardStoryConfigSet(s32 mg_type, s32 diff_story) _SetFlag(FLAG_ID_MAKE(1, 10)); } -void BoardPartyConfigSet(s32 team, s32 bonus_star, s32 mg_type, s32 max_turn, s32 p1_handicap, s32 p2_handicap, s32 p3_handicap, s32 p4_handicap) +void BoardPartyConfigSet(s32 team, s32 bonus_star, s32 mg_list, s32 max_turn, s32 p1_handicap, s32 p2_handicap, s32 p3_handicap, s32 p4_handicap) { GWSystem.party = 1; GWSystem.team = team; GWSystem.diff_story = 0; GWSystem.bonus_star = bonus_star; - GWSystem.mg_type = mg_type; + GWSystem.mg_list = mg_list; GWSystem.max_turn = max_turn; memset(GWPlayer, 0, 4*sizeof(PlayerState)); GWPlayer[0].handicap = p1_handicap; @@ -617,11 +618,11 @@ static void CreateBoard(void) GWSystem.mg_next = -1; if(!GWGameStat.field10E_bit5) { s32 type_temp; - if(GWSystem.mg_type == 3) { - GWSystem.mg_type = 0; + if(GWSystem.mg_list == 3) { + GWSystem.mg_list = 0; } - if(GWMGTypeGet() == 2) { - GWSystem.mg_type = 0; + if(GWMGListGet() == 2) { + GWSystem.mg_list = 0; } } if(GWSystem.mess_speed == 3) { @@ -668,7 +669,7 @@ static void CreateBoard(void) if(!reset_unk32) { GWSystem.unk_32 = 1; } - guest_status = BoardDataDirReadAsync(MAKE_DIR_NUM(DATADIR_BGUEST)); + guest_status = BoardDataDirReadAsync(DATADIR_BGUEST); if(guest_status != -1) { BoardDataAsyncWait(guest_status); } @@ -698,29 +699,29 @@ static void CreateBoard(void) BoardCameraMotionWait(); BoardTauntInit(); _SetFlag(FLAG_ID_MAKE(1, 14)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BKOOPASUIT)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BBATTLE)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BKOOPA)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BKUJIYA)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BYOKODORI)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BPAUSE)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BLAST5)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_EFFECT)); + HuDataDirClose(DATADIR_BKOOPASUIT); + HuDataDirClose(DATADIR_BBATTLE); + HuDataDirClose(DATADIR_BKOOPA); + HuDataDirClose(DATADIR_BKUJIYA); + HuDataDirClose(DATADIR_BYOKODORI); + HuDataDirClose(DATADIR_BPAUSE); + HuDataDirClose(DATADIR_BLAST5); + HuDataDirClose(DATADIR_EFFECT); _SetFlag(FLAG_ID_MAKE(1, 16)); } static void DestroyBoard(void) { s32 dir_table[] = { - MAKE_DIR_NUM(DATADIR_W01), - MAKE_DIR_NUM(DATADIR_W02), - MAKE_DIR_NUM(DATADIR_W03), - MAKE_DIR_NUM(DATADIR_W04), - MAKE_DIR_NUM(DATADIR_W05), - MAKE_DIR_NUM(DATADIR_W06), - MAKE_DIR_NUM(DATADIR_W10), - MAKE_DIR_NUM(DATADIR_W20), - MAKE_DIR_NUM(DATADIR_W21), + DATADIR_W01, + DATADIR_W02, + DATADIR_W03, + DATADIR_W04, + DATADIR_W05, + DATADIR_W06, + DATADIR_W10, + DATADIR_W20, + DATADIR_W21 }; BoardTauntKill(); BoardAudSeqFadeOutAll(); @@ -738,14 +739,14 @@ static void DestroyBoard(void) BoardModelKillAll(); BoardWinKillAll(); HuDataDirClose(dir_table[BoardCurrGet()]); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_EFFECT)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BGUEST)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BKOOPASUIT)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BBATTLE)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BKOOPA)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BKUJIYA)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BYOKODORI)); - HuDataDirClose(MAKE_DIR_NUM(DATADIR_BOARD)); + HuDataDirClose(DATADIR_EFFECT); + HuDataDirClose(DATADIR_BGUEST); + HuDataDirClose(DATADIR_BKOOPASUIT); + HuDataDirClose(DATADIR_BBATTLE); + HuDataDirClose(DATADIR_BKOOPA); + HuDataDirClose(DATADIR_BKUJIYA); + HuDataDirClose(DATADIR_BYOKODORI); + HuDataDirClose(DATADIR_BOARD); createFunc = destroyFunc = NULL; } @@ -1760,7 +1761,7 @@ void BoardConfettiCreate(Vec *pos, s16 count, float range) object->trans.y = pos->y; object->trans.z = pos->z; object->rot.x = range; - work->gfx_mdl = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BOARD, 7), NULL, 0); + work->gfx_mdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 7), NULL, 0); BoardModelLayerSet(work->gfx_mdl, 2); BoardModelVisibilitySet(work->gfx_mdl, 0); { @@ -1962,9 +1963,9 @@ typedef struct last5_gfx_work { } Last5GfxWork; static s32 last5GfxSprTbl[3] = { - MAKE_DATA_NUM(DATADIR_BOARD, 95), - MAKE_DATA_NUM(DATADIR_BOARD, 97), - MAKE_DATA_NUM(DATADIR_BOARD, 96), + DATA_MAKE_NUM(DATADIR_BOARD, 95), + DATA_MAKE_NUM(DATADIR_BOARD, 97), + DATA_MAKE_NUM(DATADIR_BOARD, 96), }; static float last5GfxPosTbl[2][3][2] = { @@ -2019,11 +2020,11 @@ void BoardLast5GfxInit(void) } spr_file = last5GfxSprTbl[i]; if(i == 2 && work->is_last && GWLanguageGet() != 0) { - spr_file = MAKE_DATA_NUM(DATADIR_BOARD, 98); + spr_file = DATA_MAKE_NUM(DATADIR_BOARD, 98); } BoardSpriteCreate(spr_file, prio, NULL, &work->sprites[i]); HuSprGrpMemberSet(work->group, i, work->sprites[i]); - HuSprAttrSet(work->group, i, SPIRTE_ATTR_BILINEAR); + HuSprAttrSet(work->group, i, SPRITE_ATTR_BILINEAR); HuSprPosSet(work->group, i, last5GfxPosTbl[lastF][i][0], last5GfxPosTbl[lastF][i][1]); } if(!work->is_last) { diff --git a/src/game/board/model.c b/src/game/board/model.c index ef7bb9c8..18b67186 100644 --- a/src/game/board/model.c +++ b/src/game/board/model.c @@ -1,5 +1,6 @@ #include "game/board/main.h" #include "game/board/model.h" +#include "game/chrman.h" #include "game/hsfman.h" #include "game/hsfmotion.h" #include "game/memory.h" @@ -381,8 +382,8 @@ s32 BoardModelMotionCreate(s16 model, s32 data_num) } model = Hu3DJointMotion(model_ptr->id, model_ptr->mot_data[i]); } else { - model = CharMotionCreate(model_ptr->character, data_num); - CharMotionDataClose(model_ptr->character); + model = CharModelMotionCreate(model_ptr->character, data_num); + CharModelMotionDataClose(model_ptr->character); } model_ptr->mot_id[i] = model; model_ptr->mot_count++; @@ -406,7 +407,7 @@ s32 BoardModelMotionKill(s16 model, s32 motion) if(model_ptr->character == -1) { Hu3DMotionKill(model_ptr->mot_id[motion]); } else { - CharMotionKill(model_ptr->character, model_ptr->mot_id[motion]); + CharModelMotionKill(model_ptr->character, model_ptr->mot_id[motion]); } model_ptr->mot_id[motion] = -1; } @@ -1170,7 +1171,7 @@ static s32 CreateBoardModelMotion(BoardModel *model, s32 count, s32 *data_num) } index = Hu3DJointMotion(model->id, data); } else { - index = CharMotionCreate(model->character, data_num[i]); + index = CharModelMotionCreate(model->character, data_num[i]); } if(index < 0) { return -1; diff --git a/src/game/board/pause.c b/src/game/board/pause.c new file mode 100755 index 00000000..ed26e8a7 --- /dev/null +++ b/src/game/board/pause.c @@ -0,0 +1,1556 @@ +#include "game/board/pause.h" +#include "game/audio.h" +#include "game/data.h" +#include "game/flag.h" +#include "game/gamework_data.h" +#include "game/object.h" +#include "game/objsub.h" +#include "game/pad.h" +#include "game/process.h" +#include "game/saveload.h" +#include "game/window.h" +#include "game/wipe.h" +#include "game/board/main.h" +#include "game/board/model.h" +#include "game/board/player.h" +#include "game/board/roll.h" +#include "game/board/star.h" +#include "game/board/ui.h" + +typedef struct { + struct { + u8 unk00_field0 : 1; + u8 unk00_field1 : 1; + u8 unk00_field2 : 1; + u8 unk00_field3 : 3; + u8 unk00_field4 : 1; + }; + s8 unk01; + s8 unk02; + s8 unk03; + s8 unk04; + s8 unk05; + u8 unk06; + u8 unk07; + s8 unk08; + u8 unk09; + s16 unk0A; + u32 unk0C; +} ConfigWork; + +extern void omSysPauseCtrl(s32); + +static void PauseExit(void); +static void PauseProcess(void); +static void CreatePauseScreen(void); +static void DeletePauseScreen(void); +static void SetBoxVisible(s32 arg0); +static void PauseConfigObjFunc(omObjData *arg0); +static void UpdatePauseText(s32 arg0); +static void InitPauseQuit(omObjData *arg0, ConfigWork *arg1); +static void PauseQuitProcess(void); +static void DeletePauseQuit(void); +static s32 UpdatePadConfig(omObjData *arg0, ConfigWork *arg1); +static void CreatePadConfig(omObjData *arg0, ConfigWork *arg1); +static void ScrollInPadConfig(omObjData *arg0, ConfigWork *arg1); +static void CursorMovePadConfig(omObjData *arg0, ConfigWork *arg1); +static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1); +static void ScrollOutPadConfig(omObjData *arg0, ConfigWork *arg1); +static s32 UpdatePauseBox(omObjData *arg0, ConfigWork *arg1, s32 arg2); +static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2); +static s32 ExecPauseConfig(omObjData *arg0, ConfigWork *arg1); +static void CreatePauseControlWin(void); +static void DeletePauseControlWin(void); +static s32 WaitPauseInput(void); +static void ShowPauseConfig(void); +static void CreatePadConfigSprite(void); +static void ShowPadConfigSprite(s32 arg0); +static void PauseCreateNumber(s32 arg0, s8 arg1); +static s32 CheckPort(s32 arg0); +static void RotateBox(float arg0, float arg1, Mtx arg2); + +static float boxRot[8]; +static Vec padBoxPos; + +static s8 pauseQuitF; +static s8 mainScreenF; +static u8 hostOldLayer; +static s16 hostMdl; +static s8 cursorPos; +static s8 boxState[8]; +static omObjData *configObj; +static Process *quitProcess; +static Process *mainProcess; + +static s8 pausePad = -1; +static s16 pauseSprGrp = -1; +static s16 padConfigSprGrp = -1; +static s16 pauseCursorPos = -1; +static s16 settingsControlWin = -1; +static s16 controlWin = -1; +static s16 quitWin = -1; +static s16 settingsWin = -1; + +static s16 boxModelID[8] = { + -1, -1, -1, -1, -1, -1, -1, -1 +}; + +static float boxPosTbl[8][2] = { + { 120.0f, 120.0f }, + { 232.0f, 120.0f }, + { 344.0f, 120.0f }, + { 456.0f, 120.0f }, + { 120.0f, 232.0f }, + { 232.0f, 232.0f }, + { 344.0f, 232.0f }, + { 456.0f, 232.0f } +}; + +static float padConfigPosTbl[4][2] = { + { 170.0f, 160.0f }, + { 266.0f, 160.0f }, + { 362.0f, 160.0f }, + { 458.0f, 160.0f } +}; + +static s32 boardLogoTbl[] = { + 0x00070057, + 0x00070058, + 0x00070059, + 0x0007005A, + 0x0007005B, + 0x0007005C, + 0x00070057, + 0x0007005D, + 0x0007005E +}; + +static float turnDigitPosTbl[] = { + 145.0f, 188.0f, 285.0f, 328.0f +}; + +static s32 boxMdlTbl[] = { + 0x00080008, + 0x00080009, + 0x0008000A, + 0x0008000B, + 0x0008000C, + 0x0008000D, + 0x0008000E, + 0x0008000F +}; + +void BoardPauseStart(void) { + mainProcess = HuPrcChildCreate(PauseProcess, 0x2001, 0x3800, 0, boardMainProc); + hostMdl = BoardStarHostMdlGet(); + BoardModelMotionStart(hostMdl, 1, 0x40000001); + HuPrcVSleep(); + omSysPauseCtrl(1); + omSysPauseEnable(1); + HuPrcSetStat(mainProcess, 0xC); + HuPrcDestructorSet2(mainProcess, PauseExit); +} + +static inline s32 PauseExitInlineFunc01(void) { + if (GWSystem.mg_list == 3) { + GWSystem.mg_list = 0; + } + return GWSystem.mg_list; +} + +static inline s32 PauseExitInlineFunc02(void) { + if (GWSystem.mess_speed == 3) { + GWSystem.mess_speed = 1; + } + return GWSystem.mess_speed; +} + +static inline s32 PauseExitInlineFunc03(void) { + if (GWSystem.save_mode == 3) { + GWSystem.save_mode = 1; + } + return GWSystem.save_mode; +} + +static void PauseExit(void) { + if (pauseQuitF == 0) { + BoardRollWinDispSet(1); + BoardDiceDigit2DShowSet(1); + BoardStatusItemSet(1); + BoardRollUPauseSet(1); + BoardLast5GfxShowSet(1); + HuAudFXPauseAll(0); + HuAudSeqPauseAll(0); + } else { + BoardConfettiKill(); + BoardAudSeqFadeOutAll(); + HuAudAllStop(); + } + DeletePauseScreen(); + DeletePauseControlWin(); + BoardEventFlagReset(); + HuDataDirClose(0x80000); + pausePad = -1; + omSysPauseCtrl(0); + if (GWMGExplainGet()) { + _SetFlag(0xB); + } else { + _ClearFlag(0xB); + } + if (GWPartyGet() == 0) { + GWGameStat.field10F_bit0 = GWMGExplainGet(); + GWGameStat.field10F_bit1 = GWMGShowComGet(); + GWGameStat.field10F_bit2 = PauseExitInlineFunc01(); + GWGameStat.field10F_bit4 = PauseExitInlineFunc02(); + GWGameStat.field10F_bit6 = PauseExitInlineFunc03(); + } else { + GWGameStat.field110_bit0 = GWMGExplainGet(); + GWGameStat.field110_bit1 = GWMGShowComGet(); + GWGameStat.field110_bit2 = PauseExitInlineFunc01(); + GWGameStat.field110_bit4 = PauseExitInlineFunc02(); + GWGameStat.field110_bit6 = PauseExitInlineFunc03(); + } + mainProcess = NULL; +} + +static void PauseProcess(void) { + s32 temp_r31; + + pauseQuitF = 0; + mainScreenF = 1; + BoardFilterFadeInit(0x1E, 0xA0); + temp_r31 = BoardDataDirReadAsync(0x80000); + BoardRollWinDispSet(0); + BoardDiceDigit2DShowSet(0); + BoardStatusItemSet(0); + BoardRollUPauseSet(0); + BoardLast5GfxShowSet(0); + HuPadRumbleAllStop(); + HuPrcSleep(1); + HuAudFXPlay(5); + while (!BoardFilterFadePauseCheck()) { + HuPrcVSleep(); + } + BoardDataAsyncWait(temp_r31); + CreatePauseScreen(); + CreatePauseControlWin(); + if (WaitPauseInput() == 1) { + ShowPauseConfig(); + } + DeletePauseScreen(); + DeletePauseControlWin(); + if (pauseQuitF != 0) { + HuPrcSleep(0x14); + WipeColorSet(0, 0, 0); + BoardKill(); + } else { + BoardFilterFadeOut(0x1E); + HuPrcSleep(0x1E); + } + HuPrcEnd(); +} + +void CreatePauseScreen(void) { + Mtx sp30; + Vec sp24; + Vec sp18; + float temp_f30; + float var_f31; + void *sp14; + omObjData *temp_r27; + ConfigWork *temp_r29; + s16 sp8; + s32 var_r28; + s32 i; + + sp14 = boardObjMan->user_data; + temp_r27 = omAddObjEx(boardObjMan, 0x108, 0, 0, -1, PauseConfigObjFunc); + configObj = temp_r27; + temp_r29 = OM_GET_WORK_PTR(temp_r27, ConfigWork); + temp_r29->unk00_field0 = 0; + temp_r29->unk02 = 0; + temp_r29->unk03 = 0; + temp_r29->unk06 = 0; + temp_r29->unk01 = 0; + temp_r29->unk00_field1 = 0; + temp_r29->unk00_field2 = 0; + temp_r29->unk0A = 0; + temp_r29->unk00_field4 = (SLSaveFlagGet() != 0) ? 0 : 1; + temp_r29->unk09 = 0; + temp_r29->unk0C = 0; + cursorPos = temp_r29->unk02 + temp_r29->unk03 * 4; + temp_r27->trans.x = -40.0f + boxPosTbl[cursorPos][0]; + temp_r27->trans.y = -32.0f + boxPosTbl[cursorPos][1]; + pauseCursorPos = HuSprGrpCreate(2); + HuSprGrpPosSet(pauseCursorPos, 0.0f, 0.0f); + BoardSpriteCreate(0x70055, 0x2BC, 0, &sp8); + HuSprGrpMemberSet(pauseCursorPos, 0, sp8); + HuSprZRotSet(pauseCursorPos, 0, 45.0f); + HuSprAttrSet(pauseCursorPos, 0, 4); + HuSprAttrSet(pauseCursorPos, 0, 8); + HuSprPosSet(pauseCursorPos, 0, temp_r27->trans.x, temp_r27->trans.y); + BoardSpriteCreate(0x80007, 0x2EE, 0, &sp8); + HuSprGrpMemberSet(pauseCursorPos, 1, sp8); + HuSprAttrSet(pauseCursorPos, 1, 4); + HuSprAttrSet(pauseCursorPos, 1, 8); + pauseSprGrp = HuSprGrpCreate(7); + HuSprGrpPosSet(pauseSprGrp, 0.0f, 0.0f); + BoardSpriteCreate(boardLogoTbl[GWBoardGet()], 0x384, 0, &sp8); + HuSprGrpMemberSet(pauseSprGrp, 0, sp8); + HuSprPosSet(pauseSprGrp, 0, 288.0f, 120.0f); + HuSprAttrSet(pauseSprGrp, 0, 4); + HuSprAttrSet(pauseSprGrp, 0, 8); + BoardSpriteCreate(0x80005, 0x384, 0, &sp8); + HuSprGrpMemberSet(pauseSprGrp, 1, sp8); + HuSprPosSet(pauseSprGrp, 1, 288.0f, 302.0f); + HuSprAttrSet(pauseSprGrp, 1, 8); + BoardSpriteCreate(0x80004, 0x320, 0, &sp8); + HuSprGrpMemberSet(pauseSprGrp, 2, sp8); + HuSprZRotSet(pauseSprGrp, 2, -30.0f); + HuSprPosSet(pauseSprGrp, 2, 87.0f, 245.0f); + HuSprAttrSet(pauseSprGrp, 2, 8); + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + HuSprAttrSet(pauseSprGrp, 2, 4); + } + if (GWPartyGet() == 1) { + if (GWTeamGet()) { + HuSprBankSet(pauseSprGrp, 2, 2); + } else { + HuSprBankSet(pauseSprGrp, 2, 0); + } + } else { + HuSprBankSet(pauseSprGrp, 2, 1); + } + for (i = 0; i < 4; i++) { + BoardSpriteCreate(0x80006, 0x320, 0, &sp8); + HuSprGrpMemberSet(pauseSprGrp, i + 3, sp8); + HuSprPosSet(pauseSprGrp, i + 3, turnDigitPosTbl[i], 301.0f); + HuSprAttrSet(pauseSprGrp, i + 3, 8); + HuSprAttrSet(pauseSprGrp, i + 3, 1); + } + padConfigSprGrp = HuSprGrpCreate(0xD); + HuSprGrpPosSet(padConfigSprGrp, 0.0f, 0.0f); + for (i = 0; i < 4; i++) { + BoardSpriteCreate(0x80000, 0x38E, 0, &sp8); + HuSprGrpMemberSet(padConfigSprGrp, i, sp8); + HuSprAttrSet(padConfigSprGrp, i, 8); + HuSprAttrSet(padConfigSprGrp, i, 1); + BoardSpriteCreate(0x80001, 0x2BC, 0, &sp8); + HuSprGrpMemberSet(padConfigSprGrp, i + 4, sp8); + HuSprAttrSet(padConfigSprGrp, i + 4, 8); + HuSprAttrSet(padConfigSprGrp, i + 4, 1); + BoardSpriteCreate(0x80002, 0x320, 0, &sp8); + HuSprGrpMemberSet(padConfigSprGrp, i + 8, sp8); + HuSprAttrSet(padConfigSprGrp, i + 8, 8); + HuSprAttrSet(padConfigSprGrp, i + 8, 1); + } + BoardSpriteCreate(0x80003, 0x3E8, 0, &sp8); + HuSprGrpMemberSet(padConfigSprGrp, 0xC, sp8); + HuSprAttrSet(padConfigSprGrp, 0xC, 4); + HuSprDrawNoSet(padConfigSprGrp, 0xC, 0x40); + CreatePadConfigSprite(); + ShowPadConfigSprite(0); + hostOldLayer = BoardModelLayerGet(hostMdl); + BoardModelLayerSet(hostMdl, 6); + sp24.x = 68.0f; + if (GWBoardGet() == 3) { + sp24.y = 464.0f; + } else { + sp24.y = 434.0f; + } + sp24.z = 1100.0f; + Hu3D2Dto3D(&sp24, 1, &sp18); + RotateBox(0.0f, 15.0f, sp30); + BoardModelMtxSet(hostMdl, &sp30); + BoardModelPosSetV(hostMdl, &sp18); + BoardModelVisibilitySet(hostMdl, 0); + BoardModelRotSet(hostMdl, 0.0f, 0.0f, 0.0f); + for (i = 0; i < 8; i++) { + boxModelID[i] = BoardModelCreate(boxMdlTbl[i], NULL, 0); + sp24.x = boxPosTbl[i][0]; + sp24.y = boxPosTbl[i][1]; + sp24.z = 700.0f; + Hu3D2Dto3D(&sp24, 1, &sp18); + temp_f30 = 0.5f; + BoardModelPosSetV(boxModelID[i], &sp18); + BoardModelLayerSet(boxModelID[i], 6); + BoardModelScaleSet(boxModelID[i], temp_f30, temp_f30, temp_f30); + switch (i) { + case 0: + case 7: + var_r28 = 0; + var_f31 = 0.0f; + break; + case 1: + var_r28 = GWMGExplainGet(); + var_f31 = (var_r28 != 0) ? 0.0f : -90.0f; + break; + case 2: + var_r28 = GWMGShowComGet(); + var_f31 = (var_r28 != 0) ? 0.0f : -90.0f; + break; + case 3: + var_r28 = PauseExitInlineFunc01(); + switch (var_r28) { + case 1: + var_r28 = 0; + var_f31 = 90.0f; + break; + case 0: + var_r28 = 1; + var_f31 = 0.0f; + break; + case 2: + var_r28 = 2; + var_f31 = -90.0f; + break; + } + break; + case 4: + var_r28 = GWRumbleGet(); + var_f31 = (var_r28 != 0) ? 0.0f : -90.0f; + break; + case 5: + var_r28 = PauseExitInlineFunc02(); + switch (var_r28) { + case 2: + var_r28 = 0; + var_f31 = 90.0f; + break; + case 1: + var_r28 = 1; + var_f31 = 0.0f; + break; + case 0: + var_r28 = 2; + var_f31 = -90.0f; + break; + } + break; + case 6: + if (temp_r29->unk00_field4 != 0) { + GWSystem.save_mode = 1; + } + var_r28 = PauseExitInlineFunc03(); + switch (var_r28) { + case 1: + var_r28 = 0; + var_f31 = 90.0f; + break; + case 0: + var_r28 = 1; + var_f31 = 0.0f; + break; + case 2: + var_r28 = 2; + var_f31 = -90.0f; + break; + } + break; + } + boxState[i] = var_r28; + boxRot[i] = var_f31; + RotateBox(3.5f, var_f31, sp30); + BoardModelMtxSet(boxModelID[i], &sp30); + BoardModelRotSet(boxModelID[i], 0.0f, 0.0f, 0.0f); + } + SetBoxVisible(0); +} + +static void DeletePauseScreen(void) { + ConfigWork *temp_r30; + Mtx sp8; + s32 i; + + if (configObj) { + temp_r30 = OM_GET_WORK_PTR(configObj, ConfigWork); + temp_r30->unk00_field0 = 1; + } + for (i = 0; i < 8; i++) { + BoardModelKill(boxModelID[i]); + boxModelID[i] = -1; + } + if (pauseSprGrp != -1) { + HuSprGrpKill(pauseSprGrp); + pauseSprGrp = -1; + } + if (padConfigSprGrp != -1) { + HuSprGrpKill(padConfigSprGrp); + padConfigSprGrp = -1; + } + if (pauseCursorPos != -1) { + HuSprGrpKill(pauseCursorPos); + pauseCursorPos = -1; + } + PSMTXIdentity(sp8); + BoardModelLayerSet(hostMdl, hostOldLayer); + BoardModelVisibilitySet(hostMdl, 1); + BoardModelMtxSet(hostMdl, &sp8); + BoardStarHostSet(hostMdl); + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + BoardModelVisibilitySet(hostMdl, 0); + } +} + +static void SetBoxVisible(s32 arg0) { + s32 i; + + for (i = 0; i < 8; i++) { + BoardModelVisibilitySet(boxModelID[i], arg0); + } +} + +static void PauseConfigObjFunc(omObjData *arg0) { + ConfigWork *temp_r31; + s16 temp_r28; + s32 var_r29; + s32 var_r27; + s32 var_r26; + + temp_r31 = OM_GET_WORK_PTR(arg0, ConfigWork); + if (temp_r31->unk00_field0 != 0 || BoardIsKill()) { + configObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + if (mainScreenF == 0) { + if (temp_r31->unk06 != 0) { + temp_r31->unk06--; + return; + } + cursorPos = temp_r31->unk02 + temp_r31->unk03 * 4; + temp_r28 = cursorPos; + if (temp_r31->unk00_field1 != 0) { + switch (cursorPos) { + case 0: + if (UpdatePadConfig(arg0, temp_r31) != 0) { + UpdatePauseText(cursorPos); + } + break; + case 1: + if (UpdatePauseBox(arg0, temp_r31, 1) != 0) { + var_r27 = boxState[1]; + GWSystem.explain_mg = var_r27; + } + UpdatePauseText(cursorPos); + break; + case 2: + if (UpdatePauseBox(arg0, temp_r31, 2) != 0) { + var_r26 = boxState[2]; + GWSystem.show_com_mg = var_r26; + } + UpdatePauseText(cursorPos); + break; + case 3: + if (UpdatePauseBoxExt(arg0, temp_r31, 3) != 0) { + switch (boxState[3]) { + case 0: + GWSystem.mg_list = 1; + break; + case 1: + GWSystem.mg_list = 0; + break; + case 2: + GWSystem.mg_list = 2; + break; + } + } + UpdatePauseText(cursorPos); + break; + case 4: + if (UpdatePauseBox(arg0, temp_r31, 4) != 0) { + var_r29 = boxState[4]; + GWGameStat.rumble = var_r29; + if (var_r29 == 0) { + HuPadRumbleAllStop(); + } + } + UpdatePauseText(cursorPos); + break; + case 5: + if (UpdatePauseBoxExt(arg0, temp_r31, 5) != 0) { + switch (boxState[5]) { + case 0: + GWSystem.mess_speed = 2; + GWSystem.mess_delay = 0x30; + break; + case 1: + GWSystem.mess_speed = 1; + GWSystem.mess_delay = 0x20; + break; + case 2: + GWSystem.mess_speed = 0; + GWSystem.mess_delay = 0x10; + break; + } + } + UpdatePauseText(cursorPos); + break; + case 6: + if (temp_r31->unk00_field4 != 0) { + temp_r31->unk00_field1 = 0; + break; + } + if (UpdatePauseBoxExt(arg0, temp_r31, 6) != 0) { + switch (boxState[6]) { + case 0: + GWSystem.save_mode = 1; + break; + case 1: + GWSystem.save_mode = 0; + break; + case 2: + GWSystem.save_mode = 2; + break; + } + } + UpdatePauseText(cursorPos); + break; + case 7: + InitPauseQuit(arg0, temp_r31); + break; + } + } else { + cursorPos = ExecPauseConfig(arg0, temp_r31); + if (temp_r28 != cursorPos) { + arg0->trans.x = -40.0f + boxPosTbl[cursorPos][0]; + arg0->trans.y = -32.0f + boxPosTbl[cursorPos][1]; + } + UpdatePauseText(cursorPos); + HuSprPosSet(pauseCursorPos, 0, arg0->trans.x, arg0->trans.y); + } + } +} + +static void UpdatePauseText(s32 arg0) { + s32 var_r28; + s32 j; + s32 i; + + switch (arg0) { + case 0: + HuWinMesSet(settingsWin, 0x10001C); + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + if (i == GWPlayer[j].port) { + if (GWPlayer[j].com) { + var_r28 = 0x10001E; + } else { + var_r28 = 0x10001D; + } + HuWinInsertMesSet(settingsWin, var_r28, i); + break; + } + } + } + break; + case 1: + if (boxState[arg0] != 0) { + HuWinMesSet(settingsWin, 0x100021); + } else { + HuWinMesSet(settingsWin, 0x100022); + } + break; + case 2: + if (boxState[arg0] != 0) { + HuWinMesSet(settingsWin, 0x100023); + } else { + HuWinMesSet(settingsWin, 0x100024); + } + break; + case 3: + switch (boxState[arg0]) { + case 0: + HuWinMesSet(settingsWin, 0x100026); + break; + case 1: + HuWinMesSet(settingsWin, 0x100025); + break; + case 2: + HuWinMesSet(settingsWin, 0x100027); + break; + } + break; + case 4: + if (boxState[arg0] != 0) { + HuWinMesSet(settingsWin, 0x100028); + } else { + HuWinMesSet(settingsWin, 0x100029); + } + break; + case 5: + switch (boxState[arg0]) { + case 0: + HuWinMesSet(settingsWin, 0x10002C); + break; + case 1: + HuWinMesSet(settingsWin, 0x10002B); + break; + case 2: + HuWinMesSet(settingsWin, 0x10002A); + break; + } + break; + case 6: + switch (boxState[arg0]) { + case 0: + HuWinMesSet(settingsWin, 0x10002F); + break; + case 1: + HuWinMesSet(settingsWin, 0x10002D); + break; + case 2: + HuWinMesSet(settingsWin, 0x10002E); + break; + } + break; + case 7: + HuWinMesSet(settingsWin, 0x100030); + break; + } +} + +static void InitPauseQuit(omObjData *arg0, ConfigWork *arg1) { + float var_f31; + + switch (arg1->unk01) { + case 0: + SetBoxVisible(0); + quitProcess = HuPrcChildCreate(PauseQuitProcess, 0x2001, 0x3800, 0, boardMainProc); + HuPrcSetStat(quitProcess, 0xC); + HuPrcDestructorSet2(quitProcess, DeletePauseQuit); + arg1->unk01 = 1; + arg1->unk06 = 0xA; + HuSprAttrSet(pauseCursorPos, 0, 4); + HuSprAttrSet(pauseCursorPos, 1, 4); + break; + case 1: + if (quitWin != -1 && HuWinStatGet(quitWin) == 3) { + if (HuWinChoiceNowGet(quitWin) != 0) { + HuWinMesSet(settingsWin, 0x100033); + } else { + HuWinMesSet(settingsWin, 0x100032); + } + } + if (!quitProcess) { + arg1->unk01 = 2; + if (pauseQuitF != 0) { + arg1->unk00_field0 = 1; + break; + } + } + break; + case 2: + arg1->unk00_field1 = 0; + arg1->unk01 = 0; + arg1->unk04 = 0; + arg1->unk05 = 0; + arg1->unk06 = 0; + SetBoxVisible(1); + var_f31 = 0.5f; + BoardModelScaleSet(boxModelID[7], var_f31, var_f31, var_f31); + HuSprAttrReset(pauseCursorPos, 0, 4); + if (GWPartyGet() == 0) { + HuSprAttrReset(pauseCursorPos, 1, 4); + } + break; + } +} + +static void PauseQuitProcess(void) { + WindowData *temp_r31; + float sp10[2]; + float sp8[2]; + + HuWinMesMaxSizeGet(1, sp8, 0x100031); + sp10[0] = -10000.0f; + sp10[1] = 140.0f; + quitWin = HuWinExCreate(sp10[0], sp10[1], sp8[0], sp8[1], -1); + temp_r31 = &winData[quitWin]; + temp_r31->active_pad = (1 << pausePad); + HuWinExAnimIn(quitWin); + HuWinMesSpeedSet(quitWin, 0); + HuWinMesSet(quitWin, 0x100031); + HuWinMesWait(quitWin); + if (HuWinChoiceGet(quitWin, 0) == 1) { + HuPrcSleep(0x3C); + pauseQuitF = 1; + _SetFlag(0x1001B); + } + HuPrcEnd(); +} + +static void DeletePauseQuit(void) { + if (quitWin != -1) { + HuWinExCleanup(quitWin); + quitWin = -1; + } + HuDataDirClose(0x80000); + quitProcess = NULL; +} + +static s32 UpdatePadConfig(omObjData *arg0, ConfigWork *arg1) { + switch (arg1->unk01) { + case 0: + CreatePadConfig(arg0, arg1); + break; + case 1: + ScrollInPadConfig(arg0, arg1); + break; + case 2: + CursorMovePadConfig(arg0, arg1); + break; + case 3: + ChangeDiffPadConfig(arg0, arg1); + break; + case 4: + ScrollOutPadConfig(arg0, arg1); + break; + } + if (arg1->unk00_field1 != 0) { + return 0; + } else { + return 1; + } +} + +static void CreatePadConfig(omObjData *arg0, ConfigWork *arg1) { + Vec sp14; + Vec sp8; + s32 i; + + HuSprAttrSet(pauseCursorPos, 0, 4); + for (i = 0; i < 8; i++) { + if (i != 0) { + BoardModelVisibilitySet(boxModelID[i], 0); + } + } + arg0->rot.x = 576.0f; + arg0->rot.y = 112.0f; + arg0->rot.z = (32.0f - arg0->rot.x) / 20.0f; + arg1->unk07 = 0x14; + ShowPadConfigSprite(1); + HuSprGrpPosSet(padConfigSprGrp, arg0->rot.x, arg0->rot.y); + arg1->unk04 = 0; + arg1->unk05 = 0; + sp14.x = padConfigPosTbl[arg1->unk04][0]; + sp14.y = padConfigPosTbl[arg1->unk04][1]; + HuSprPosSet(pauseCursorPos, 0, sp14.x, sp14.y); + HuSprZRotSet(pauseCursorPos, 0, 0.0f); + padBoxPos.x = boxPosTbl[0][0]; + padBoxPos.y = boxPosTbl[0][1]; + padBoxPos.z = 700.0f; + sp14.x = 96.0f; + sp14.y = 176.0f; + sp14.z = padBoxPos.z; + PSVECSubtract(&sp14, &padBoxPos, &sp8); + arg0->scale.x = sp8.x / 20.0f; + arg0->scale.y = sp8.y / 20.0f; + arg1->unk01 = 1; +} + +static void ScrollInPadConfig(omObjData *arg0, ConfigWork *arg1) { + Vec sp8; + s32 i; + + if (arg1->unk07 == 0) { + HuSprAttrReset(pauseCursorPos, 0, 4); + if (arg1->unk00_field2 != 0) { + for (i = 0; i < 8; i++) { + if (i != 0) { + BoardModelVisibilitySet(boxModelID[i], 1); + } + } + arg1->unk00_field1 = 0; + arg1->unk00_field2 = 0; + arg1->unk04 = 0; + arg1->unk05 = 0; + arg1->unk01 = 0; + } else { + arg1->unk01 = 2; + } + return; + } + arg0->rot.x += arg0->rot.z; + HuSprGrpPosSet(padConfigSprGrp, arg0->rot.x, arg0->rot.y); + padBoxPos.x += arg0->scale.x; + padBoxPos.y += arg0->scale.y; + Hu3D2Dto3D(&padBoxPos, 1, &sp8); + BoardModelPosSetV(boxModelID[0], &sp8); + arg1->unk07--; +} + +static void CursorMovePadConfig(omObjData *arg0, ConfigWork *arg1) { + float sp8[4]; + s32 temp_r29; + u32 temp_r30; + + HuWinMesSet(settingsWin, 0x10001F); + temp_r30 = HuPadDStkRep[pausePad] | HuPadBtnDown[pausePad]; + temp_r29 = CheckPort(arg1->unk04); + if (temp_r30 == 0x100) { + arg1->unk01 = 3; + if (GWPlayer[temp_r29].com) { + arg1->unk00_field3 = GWPlayer[temp_r29].diff + 1; + arg1->unk05 = GWPlayer[temp_r29].diff + 1; + } else { + arg1->unk00_field3 = 0; + arg1->unk05 = 0; + } + HuSprBankSet(padConfigSprGrp, arg1->unk04 + 8, 1); + HuAudFXPlay(2); + } else if (temp_r30 == 0x200) { + HuAudFXPlay(3); + arg1->unk01 = 4; + } else { + if (temp_r30 == 1) { + arg1->unk04--; + } + if (temp_r30 == 2) { + arg1->unk04++; + } + if (arg1->unk04 < 0) { + arg1->unk04 = 0; + } else if (arg1->unk04 >= 4) { + arg1->unk04 = 3; + } else if (temp_r30 == 1 || temp_r30 == 2) { + HuAudFXPlay(0); + arg1->unk06 = 4; + } + sp8[0] = padConfigPosTbl[arg1->unk04][0]; + sp8[1] = padConfigPosTbl[arg1->unk04][1]; + HuSprPosSet(pauseCursorPos, 0, sp8[0], sp8[1]); + } +} + +static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) { + s32 temp_r29; + s32 var_r28; + s32 var_r26; + s32 var_r27; + u32 var_r30; + + var_r30 = 0; + if (HuPadStkX[pausePad] < -0x14) { + var_r30 |= 1; + } else if (HuPadStkX[pausePad] > 0x14) { + var_r30 |= 2; + } + temp_r29 = CheckPort(arg1->unk04); + if (GWGameStat.field10E_bit4 != 0) { + var_r27 = 4; + } else { + var_r27 = 3; + } + HuWinMesSet(settingsWin, 0x100020); + if (var_r30 != 0) { + if (arg1->unk0C != 0 && arg1->unk0C == var_r30) { + if (arg1->unk09++ < 0xA) { + return; + } + } else { + if (arg1->unk09++ < 2) { + return; + } + arg1->unk0C = var_r30; + } + } else { + arg1->unk0C = 0; + } + arg1->unk09 = 0; + var_r28 = 0; + if (var_r30 == 1) { + var_r28 = -1; + } + if (var_r30 == 2) { + var_r28 = 1; + } + if (var_r28 != 0) { + HuAudFXPlay(0); + arg1->unk06 = 4; + } else { + if (HuPadBtnDown[pausePad] == 0x100) { + arg1->unk01 = 2; + if (arg1->unk05 != 0) { + GWPlayer[temp_r29].com = 1; + GWPlayerCfg[temp_r29].iscom = 1; + GWPlayer[temp_r29].diff = arg1->unk05 - 1; + GWPlayerCfg[temp_r29].diff = arg1->unk05 - 1; + } else { + GWPlayer[temp_r29].com = 0; + GWPlayerCfg[temp_r29].iscom = 0; + } + HuSprBankSet(padConfigSprGrp, arg1->unk04 + 8, 0); + HuAudFXPlay(2); + arg1->unk0C = 0x100; + } + if (HuPadBtnDown[pausePad] == 0x200) { + arg1->unk01 = 2; + arg1->unk05 = arg1->unk00_field3; + HuSprBankSet(padConfigSprGrp, arg1->unk04 + 8, 0); + HuAudFXPlay(3); + arg1->unk0C = 0x200; + } + arg1->unk09 = 0; + } + arg1->unk05 += var_r28; + if (GWGameStat.field10E_bit4 == 0 && arg1->unk05 == 4) { + arg1->unk05 += var_r28; + } + if (arg1->unk05 > var_r27) { + arg1->unk05 = 0; + } else if (arg1->unk05 < 0) { + arg1->unk05 = var_r27; + } + if (arg1->unk05 != 0) { + var_r26 = arg1->unk05 + 3; + } else { + var_r26 = arg1->unk04; + } + HuSprBankSet(padConfigSprGrp, arg1->unk04 + 4, var_r26); +} + +static void ScrollOutPadConfig(omObjData *arg0, ConfigWork *arg1) { + Vec sp14; + Vec sp8; + + HuSprAttrSet(pauseCursorPos, 0, 4); + arg0->rot.x = 32.0f; + arg0->rot.y = 112.0f; + arg0->rot.z = (608.0f - arg0->rot.x) / 20.0f; + arg1->unk07 = 0x14; + ShowPadConfigSprite(1); + HuSprGrpPosSet(padConfigSprGrp, arg0->rot.x, arg0->rot.y); + sp14.x = -40.0f + boxPosTbl[0][0]; + sp14.y = -32.0f + boxPosTbl[0][1]; + HuSprPosSet(pauseCursorPos, 0, sp14.x, sp14.y); + HuSprZRotSet(pauseCursorPos, 0, 45.0f); + sp14.x = boxPosTbl[0][0]; + sp14.y = boxPosTbl[0][1]; + sp14.z = 700.0f; + PSVECSubtract(&sp14, &padBoxPos, &sp8); + arg0->scale.x = sp8.x / 20.0f; + arg0->scale.y = sp8.y / 20.0f; + arg1->unk01 = 1; + arg1->unk00_field2 = 1; +} + +static s32 UpdatePauseBox(omObjData *arg0, ConfigWork *arg1, s32 arg2) { + float var_f31; + float var_f30; + float var_f29; + s32 temp_r27; + u32 temp_r28; + Mtx sp8; + + switch (arg1->unk01) { + case 0: + arg1->unk08 = arg1->unk04 = boxState[arg2]; + arg0->rot.x = boxRot[arg2]; + arg0->rot.y = 0.0f; + arg1->unk01 = 1; + var_f31 = 0.7f; + BoardModelScaleSet(boxModelID[arg2], var_f31, var_f31, var_f31); + return 0; + case 1: + temp_r28 = HuPadDStk[pausePad] | HuPadBtnDown[pausePad]; + temp_r27 = arg1->unk04; + if (temp_r28 == 1) { + arg1->unk04++; + } + if (temp_r28 == 2) { + arg1->unk04--; + } + if (arg1->unk04 < 0) { + arg1->unk04 = 0; + } else if (arg1->unk04 > 1) { + arg1->unk04 = 1; + } else if (temp_r28 == 1 || temp_r28 == 2) { + HuAudFXPlay(0); + } + if (temp_r28 == 0x100) { + arg1->unk01 = 3; + HuAudFXPlay(2); + } else if (temp_r28 == 0x200) { + arg1->unk01 = 4; + HuAudFXPlay(3); + } else if (temp_r27 != arg1->unk04) { + if (arg1->unk04 != 0) { + var_f30 = 0.0f; + } else { + var_f30 = -90.0f; + } + var_f29 = arg0->rot.x; + arg0->rot.y = (var_f30 - var_f29) / 30.0f; + arg1->unk07 = 0x1E; + arg1->unk01 = 2; + } + break; + case 2: + if (arg1->unk07 != 0) { + arg0->rot.x += arg0->rot.y; + arg1->unk07--; + } else { + arg1->unk01 = 1; + } + break; + case 3: + boxState[arg2] = arg1->unk04; + boxRot[arg2] = arg0->rot.x; + arg1->unk08 = -1; + arg1->unk01 = 5; + arg1->unk0A = 0; + break; + case 4: + boxState[arg2] = arg1->unk08; + arg1->unk04 = boxState[arg2]; + arg0->rot.x = boxRot[arg2]; + arg1->unk01 = 5; + arg1->unk0A = 0; + break; + case 5: + var_f31 = 0.5f; + BoardModelScaleSet(boxModelID[arg2], var_f31, var_f31, var_f31); + arg1->unk00_field1 = 0; + arg1->unk04 = 0; + arg1->unk05 = 0; + arg1->unk01 = 0; + return 1; + } + RotateBox(3.5f, arg0->rot.x, sp8); + BoardModelMtxSet(boxModelID[arg2], &sp8); + boxState[arg2] = arg1->unk04; + return 0; +} + +static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2) { + float var_f31; + float var_f30; + float var_f29; + s32 temp_r26; + s32 var_r27; + u32 temp_r28; + Mtx sp8; + + if (arg2 == 3 && GWGameStat.field10E_bit5 == 0) { + var_r27 = 1; + } else { + var_r27 = 2; + } + switch (arg1->unk01) { + case 0: + arg1->unk08 = arg1->unk04 = boxState[arg2]; + arg0->rot.x = boxRot[arg2]; + arg0->rot.y = 0.0f; + arg1->unk01 = 1; + var_f31 = 0.7f; + BoardModelScaleSet(boxModelID[arg2], var_f31, var_f31, var_f31); + return 0; + case 1: + temp_r28 = HuPadDStk[pausePad] | HuPadBtnDown[pausePad]; + temp_r26 = arg1->unk04; + if (temp_r28 == 1) { + arg1->unk04--; + } + if (temp_r28 == 2) { + arg1->unk04++; + } + if (arg1->unk04 < 0) { + arg1->unk04 = 0; + } else if (arg1->unk04 > var_r27) { + arg1->unk04 = var_r27; + } else if (temp_r28 == 1 || temp_r28 == 2) { + HuAudFXPlay(0); + } + if (temp_r28 == 0x100) { + arg1->unk01 = 3; + HuAudFXPlay(2); + } else if (temp_r28 == 0x200) { + arg1->unk01 = 4; + HuAudFXPlay(3); + } else if (temp_r26 != arg1->unk04) { + switch (arg1->unk04) { + case 0: + var_f30 = 90.0f; + break; + case 1: + var_f30 = 0.0f; + break; + case 2: + var_f30 = -90.0f; + break; + } + var_f29 = arg0->rot.x; + arg0->rot.y = (var_f30 - var_f29) / 30.0f; + arg1->unk07 = 0x1E; + arg1->unk01 = 2; + } + break; + case 2: + if (arg1->unk07 != 0) { + arg0->rot.x += arg0->rot.y; + arg1->unk07--; + } else { + arg1->unk01 = 1; + } + break; + case 3: + boxState[arg2] = arg1->unk04; + boxRot[arg2] = arg0->rot.x; + arg1->unk01 = 5; + arg1->unk0A = 0; + arg1->unk08 = -1; + break; + case 4: + boxState[arg2] = arg1->unk08; + arg1->unk04 = boxState[arg2]; + arg0->rot.x = boxRot[arg2]; + arg1->unk01 = 5; + arg1->unk0A = 0; + break; + case 5: + var_f31 = 0.5f; + BoardModelScaleSet(boxModelID[arg2], var_f31, var_f31, var_f31); + arg1->unk00_field1 = 0; + arg1->unk04 = 0; + arg1->unk05 = 0; + arg1->unk01 = 0; + return 1; + } + RotateBox(3.5f, arg0->rot.x, sp8); + BoardModelMtxSet(boxModelID[arg2], &sp8); + boxState[arg2] = arg1->unk04; + return 0; +} + +static s32 ExecPauseConfig(omObjData *arg0, ConfigWork *arg1) { + s32 var_r27; + s32 var_r26; + s32 var_r29; + s32 var_r28; + u32 temp_r30; + + temp_r30 = 0; + temp_r30 = HuPadBtnDown[pausePad]; + temp_r30 |= HuPadDStkRep[pausePad]; + var_r29 = var_r28 = 0; + if (temp_r30 == 8) { + var_r28 = -1; + } + if (temp_r30 == 4) { + var_r28 = 1; + } + if (temp_r30 == 1) { + var_r29 = -1; + } + if (temp_r30 == 2) { + var_r29 = 1; + } + arg1->unk02 += var_r29; + arg1->unk03 += var_r28; + if (arg1->unk03 < 0) { + arg1->unk03 = 0; + } else if (arg1->unk03 >= 2) { + arg1->unk03 = 1; + } else if (var_r28 != 0) { + HuAudFXPlay(0); + arg1->unk06 = 4; + } + if (arg1->unk02 < 0) { + arg1->unk02 = 0; + } else if (arg1->unk02 >= 4) { + arg1->unk02 = 3; + } else if (var_r29 != 0) { + HuAudFXPlay(0); + arg1->unk06 = 4; + } + if (temp_r30 == 0x100) { + var_r27 = 1; + var_r26 = 0; + switch (arg1->unk02 + arg1->unk03 * 4) { + case 6: + if (arg1->unk00_field4 != 0) { + var_r27 = 0; + var_r26 = 1; + } + break; + case 0: + if (GWPartyGet() == 0) { + var_r27 = 0; + var_r26 = 1; + } + break; + } + if (var_r26 != 0) { + HuAudFXPlay(4); + } else if (var_r27 != 0) { + HuAudFXPlay(2); + arg1->unk00_field1 = 1; + } + } + if (temp_r30 == 0x200) { + HuAudFXPlay(0x1C); + arg1->unk00_field0 = 1; + } + return arg1->unk02 + arg1->unk03 * 4; +} + +static void CreatePauseControlWin(void) { + float sp8[2]; + float var_f31; + float var_f30; + u32 var_r31; + + var_r31 = 0x100035; + HuWinMesMaxSizeGet(1, sp8, var_r31); + var_f31 = 152.0f; + var_f30 = 280.0f; + settingsControlWin = HuWinCreate(var_f31, var_f30, sp8[0], sp8[1], 0); + HuWinBGTPLvlSet(settingsControlWin, 0.0f); + HuWinMesSpeedSet(settingsControlWin, 0); + HuWinMesSet(settingsControlWin, var_r31); + HuWinDispOff(settingsControlWin); + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + var_r31 = 0x100049; + } else { + var_r31 = 0x100034; + } + HuWinMesMaxSizeGet(1, sp8, var_r31); + var_f31 = -10000.0f; + var_f30 = 376.0f; + controlWin = HuWinCreate(var_f31, var_f30, sp8[0], sp8[1], 0); + HuWinBGTPLvlSet(controlWin, 0.0f); + HuWinMesSpeedSet(controlWin, 0); + HuWinMesSet(controlWin, var_r31); + HuWinDispOff(controlWin); + var_f31 = 128.0f; + var_f30 = 312.0f; + sp8[0] = 432.0f; + sp8[1] = 128.0f; + settingsWin = HuWinCreate(var_f31, var_f30, sp8[0], sp8[1], 0); + HuWinDispOff(settingsWin); + HuWinMesSpeedSet(settingsWin, 0); + var_f31 = 640.0f; + var_f30 = 112.0f; + sp8[0] = 504.0f; + sp8[1] = 128.0f; +} + +static void DeletePauseControlWin(void) { + if (settingsControlWin != -1) { + HuWinKill(settingsControlWin); + settingsControlWin = -1; + } + if (controlWin != -1) { + HuWinKill(controlWin); + controlWin = -1; + } + if (settingsWin != -1) { + HuWinKill(settingsWin); + settingsWin = -1; + } +} + +static s32 WaitPauseInput(void) { + s32 var_r28; + s32 var_r31; + u32 temp_r30; + + mainScreenF = 1; + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + var_r28 = 1; + } else { + var_r28 = 0; + } + HuWinDispOn(controlWin); + SetBoxVisible(0); + HuSprAttrReset(pauseSprGrp, 0, 4); + HuSprAttrSet(pauseCursorPos, 0, 4); + PauseCreateNumber(0, GWSystem.turn); + PauseCreateNumber(1, GWSystem.max_turn); + HuPrcSleep(4); + var_r31 = 0; + while (1) { + temp_r30 = HuPadBtnDown[pausePad]; + if (temp_r30 == 0x1000 || temp_r30 == 0x200) { + var_r31 = 0; + HuAudFXPlay(0x1C); + break; + } else if (var_r28 == 0) { + if (temp_r30 == 0x100) { + var_r31 = 1; + HuAudFXPlay(1); + break; + } + } else if (temp_r30 == 0x10) { + pauseQuitF = 1; + var_r31 = 2; + mgQuitExtraF = 1; + HuAudFXPlay(0x1C); + break; + } + HuPrcVSleep(); + } + HuWinDispOff(controlWin); + if (pauseSprGrp != -1) { + HuSprGrpKill(pauseSprGrp); + pauseSprGrp = -1; + } + HuPrcSleep(2); + return var_r31; +} + +static void ShowPauseConfig(void) { + float var_f31; + float var_f30; + + mainScreenF = 0; + HuWinDispOn(settingsControlWin); + HuWinDispOn(settingsWin); + SetBoxVisible(1); + HuSprAttrReset(pauseCursorPos, 0, 4); + BoardModelVisibilitySet(hostMdl, 1); + if (GWPartyGet() == 0) { + var_f31 = boxPosTbl[0][0]; + var_f30 = boxPosTbl[0][1]; + HuSprPosSet(pauseCursorPos, 1, var_f31, var_f30); + HuSprAttrReset(pauseCursorPos, 1, 4); + } else { + HuSprAttrSet(pauseCursorPos, 1, 4); + } + while (configObj) { + HuPrcVSleep(); + } +} + +static void CreatePadConfigSprite(void) { + float temp_f31; + float temp_f30; + s32 var_r29; + s32 temp_r28; + s32 temp_r27; + s32 temp_r26; + s32 i; + s32 j; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + if (i == GWPlayer[j].port) { + break; + } + } + temp_f31 = i * 0x60 + 0xB2; + temp_f30 = 64.0f; + temp_r28 = GWPlayer[j].character; + temp_r27 = GWPlayer[j].diff; + temp_r26 = GWPlayer[j].com; + HuSprBankSet(padConfigSprGrp, i, temp_r28); + if (temp_r26 != 0) { + var_r29 = temp_r27 + 4; + } else { + var_r29 = i; + } + HuSprBankSet(padConfigSprGrp, i + 4, var_r29); + HuSprPosSet(padConfigSprGrp, i, temp_f31, temp_f30); + HuSprPosSet(padConfigSprGrp, i + 4, temp_f31, temp_f30); + HuSprPosSet(padConfigSprGrp, i + 8, temp_f31, temp_f30); + } + HuSprPosSet(padConfigSprGrp, 0xC, 260.0f, 64.0f); + HuSprGrpPosSet(padConfigSprGrp, 0.0f, 0.0f); +} + +static void ShowPadConfigSprite(s32 arg0) { + s32 temp_r31; + s32 i; + + for (i = 0; i < 4; i++) { + temp_r31 = GWPlayer[i].port; + if (arg0 != 0) { + HuSprAttrReset(padConfigSprGrp, temp_r31, 4); + HuSprAttrReset(padConfigSprGrp, temp_r31 + 4, 4); + HuSprAttrReset(padConfigSprGrp, temp_r31 + 8, 4); + } else { + HuSprAttrSet(padConfigSprGrp, temp_r31, 4); + HuSprAttrSet(padConfigSprGrp, temp_r31 + 4, 4); + HuSprAttrSet(padConfigSprGrp, temp_r31 + 8, 4); + } + } + if (arg0 != 0) { + HuSprAttrReset(padConfigSprGrp, 0xC, 4); + } else { + HuSprAttrSet(padConfigSprGrp, 0xC, 4); + } +} + +static void PauseCreateNumber(s32 arg0, s8 arg1) { + s32 var_r31; + s32 temp_r30; + s32 temp_r29; + + temp_r29 = arg1 % 10; + temp_r30 = arg1 / 10; + if (arg0 == 0) { + var_r31 = 3; + } else { + var_r31 = 5; + } + if (temp_r30 != 0) { + HuSprBankSet(pauseSprGrp, var_r31, temp_r30); + } else { + HuSprAttrSet(pauseSprGrp, var_r31, 4); + } + HuSprBankSet(pauseSprGrp, var_r31 + 1, temp_r29); +} + +BOOL BoardPauseActiveCheck(void) { + return (mainProcess != NULL) ? TRUE : FALSE; +} + +BOOL BoardPauseReqCheck(void) { + s32 temp_r30; + s32 i; + + if (BoardPauseActiveCheck()) { + return FALSE; + } + omSysPauseEnable(0); + if (BoardPauseDisableGet() != 0) { + return FALSE; + } + for (i = 0; i < 4; i++) { + temp_r30 = GWPlayer[i].port; + if (HuPadStatGet(temp_r30) == 0 && (GWPartyGet() != 0 || GWPlayer[i].com == 0) && (HuPadBtnDown[temp_r30] & 0x1000)) { + pausePad = temp_r30; + return TRUE; + } + } + return FALSE; +} + +static s32 CheckPort(s32 arg0) { + s32 i; + + for (i = 0; i < 4; i++) { + if (arg0 == GWPlayer[i].port) { + break; + } + } + return i; +} + +static void RotateBox(float arg0, float arg1, Mtx arg2) { + Vec sp14; + Mtx spB0; + Mtx sp80; + Mtx sp50; + Mtx sp20; + + BoardCameraRotGet(&sp14); + PSMTXRotRad(spB0, 'x', MTXDegToRad(sp14.x)); + PSMTXRotRad(sp80, 'y', MTXDegToRad(sp14.y)); + PSMTXRotRad(sp50, 'x', MTXDegToRad(arg0)); + PSMTXRotRad(sp20, 'y', MTXDegToRad(arg1)); + PSMTXConcat(sp80, spB0, sp80); + PSMTXConcat(sp50, sp20, sp20); + PSMTXConcat(sp80, sp20, arg2); +} diff --git a/src/game/board/player.c b/src/game/board/player.c index 1ffdb54c..fc8420ce 100644 --- a/src/game/board/player.c +++ b/src/game/board/player.c @@ -1,13 +1,13 @@ #include "game/board/player.h" +#include "game/chrman.h" +#include "game/objsub.h" +#include "game/board/com.h" +#include "game/board/main.h" +#include "game/board/roll.h" +#include "game/board/tutorial.h" +#include "game/board/ui.h" +#include "game/board/view.h" -//// #include "game/objsub.h" -extern void omVibrate(s16, s16, s16, s16); -//// #include "game/board/ui.h" -extern void BoardStatusHammerShowSet(s32, s32); -extern void BoardYourTurnExec(s32); -extern s32 BoardItemUseExec(s32); -//// #include "game/board/main.h" -extern f32 BoardDAngleCalc(f32); //// #include "game/board/model.h" extern s16 BoardModelCreateCharacter(s32, s32, s32*, s32); extern void BoardModelExistCheck(s16, s32); @@ -15,53 +15,27 @@ extern void BoardModelExistDupe(s16, s32); extern void BoardModelCameraSet(s16, u16); extern void BoardItemStatusKill(s32); extern void BoardModelAmbSet(s16, f32, f32, f32); -extern void BoardModelPosSetV(s16, Vec*); -extern void BoardModelPosSet(s16, f32, f32, f32); extern s32 BoardModelPosGet(s16, Vec*); -extern void BoardModelRotSetV(s16, Vec*); -extern void BoardModelRotSet(s16, f32, f32, f32); extern s32 BoardModelRotGet(s16, Vec*); -extern void BoardModelRotYSet(s16, f32); extern f32 BoardModelRotYGet(s16); -extern void BoardModelScaleSetV(s16, Vec*); -extern void BoardModelScaleSet(s16, f32, f32, f32); extern void BoardModelScaleGet(s16, s32*); extern void BoardModelVoiceEnableSet(s16, s32, s32); extern s32 BoardModelMotionCreate(s16, s32); extern void BoardModelMotionKill(s16, s32); extern s32 BoardModelMotionEndCheck(s16); -extern s32 BoardModelMotionStart(s16, s32, s32); extern s32 BoardModelMotionShiftSet(s16, s32, f32, f32, u32); -extern void BoardModelMotionSpeedSet(s16, f32); extern void BoardModelMotionTimeSet(s16, f32); extern f32 BoardModelMotionTimeGet(s16); extern f32 BoardModelMotionMaxTimeGet(s16); extern void BoardModelMotionTimeRangeSet(s16, s32, s32); extern void BoardModelAttrSet(s16, s32); extern void BoardModelAttrReset(s16, s32); -//// #include "game/board/tutorial.h" -extern BoardTutorialHookExec(s16, s32); -//// #include "game/board/com.h" -extern void BoardComUseItemSet(s32, s32); //// #include "game/board/overhead.h" -extern void BoardViewOverheadExec(s32); -extern void BoardViewMapExec(s32); -//// #include "game/board/roll.h" -extern s32 BoardRollExec(s32); -extern void BoardRollKill(void); -//// #include "game/chrman.h" -extern void CharModelDataClose(s16); -extern void CharModelStepTypeSet(s16, s32); //// #include "game/board/pad.h" extern s8 HuPadStkX[4]; extern s8 HuPadStkY[4]; extern u16 HuPadBtnDown[4]; extern u8 HuPadDStk[4]; -extern s16 boardTutorialDirInputTime; -extern s8 boardTutorialDirInputX; -extern s8 boardTutorialDirInputY; -//// #include "game/board/view.h" -void BoardViewMapExec(s32); //// typedef struct bitcopy { diff --git a/src/game/board/roll.c b/src/game/board/roll.c new file mode 100755 index 00000000..3fe6d90b --- /dev/null +++ b/src/game/board/roll.c @@ -0,0 +1,935 @@ +#include "game/board/roll.h" +#include "game/audio.h" +#include "game/gamework_data.h" +#include "game/hsfanim.h" +#include "game/object.h" +#include "game/pad.h" +#include "game/process.h" +#include "game/window.h" +#include "game/board/main.h" +#include "game/board/model.h" +#include "game/board/pause.h" +#include "game/board/player.h" +#include "game/board/tutorial.h" + +typedef struct { + struct { + u8 unk00_field0 : 1; + u8 unk00_field1 : 1; + u8 unk00_field2 : 3; + u8 unk00_field3 : 2; + }; + s8 unk01; + s8 unk02; + char unk03[1]; + s16 unk04; + s16 unk06; +} DiceWork; + +typedef struct { + struct { + u8 unk00_field0 : 1; + u8 unk00_field1 : 1; + u8 unk00_field2 : 1; + u8 unk00_field3 : 2; + }; + s8 unk01; + s16 unk02; + s16 unk04[2]; + float unk08; +} DiceDigitWork; + +s32 BoardRollResizeCheck(void); + +static void RollMain(void); +static void DiceCreate(s32 arg0); +static void DoInput(s32 arg0); +static void DiceWaitFull(s32 arg0); +static void DiceSetHit(s32 arg0); +static void RollDestroy(void); +static void DiceMain(omObjData *arg0); +static void DicePause(s32 arg0); +static void DicePauseAll(void); +static void DiceHideEffect(s32 arg0, s32 arg1); +static void DiceDigitMain(omObjData *arg0); +static void DiceDigitKill(DiceDigitWork *arg0); +static void DiceKill(void); +static void DiceDigitMove(DiceDigitWork *arg0, s32 arg1); +static void DiceDigitRotate(DiceDigitWork *arg0, s32 arg1); +static void SameRollExec(void); +static s32 GetBtnRoll(s32 arg0); +static s32 GetComBtnRoll(s32 arg0); + +static s32 tutorialRoll[3]; + +static s8 diceValue[3]; +static s8 rollPlayer; +static s8 numDice; +static s8 inputTimer; +static s8 maxRoll; +static s8 destMode; +static s8 diceSize; +s32 lbl_801D4098; +static char sameRollCoinStr[8]; +static s8 tutorialRollF; +static Process *rollProc; + +static s16 diceMdl[3] = { -1, -1, -1 }; +static s16 diceEff[3] = { -1, -1, -1 }; +static s16 rollWin = -1; + +static omObjData *diceObj[3] = { NULL, NULL, NULL }; +static omObjData *diceDigitObj[3] = { NULL, NULL, NULL }; +static s32 diceSndStatus[3] = { -1, -1, -1 }; + +static HsfanimStruct00 diceEffParam = { + 0x0096, + { 0x00, 0x00 }, // padding? + 50.0f, + 0.0f, + 65.0f, + { 0.0f, -0.195f, 0.0f }, + 100.0f, + 0.99f, + 40.0f, + 0.999f, + 0x0004, + { + { 0xFF, 0xFF, 0x20, 0xFF }, + { 0xFF, 0xFF, 0x00, 0xFF }, + { 0xFF, 0xFF, 0x80, 0xFF }, + { 0xFF, 0xFF, 0xFF, 0xFF } + }, + { + { 0xFF, 0xFF, 0xFF, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0x00 } + } +}; + +static s32 diceDigitMdlTbl[10] = { + 0x0007000C, + 0x0007000D, + 0x0007000E, + 0x0007000F, + 0x00070010, + 0x00070011, + 0x00070012, + 0x00070013, + 0x00070014, + 0x00070015 +}; + +s32 BoardRollExec(s32 arg0) { + rollPlayer = arg0; + inputTimer = 0; + numDice = 1; + diceSize = 0; + maxRoll = 0xA; + switch (BoardRollTypeGet()) { + case 0: + numDice = 1; + break; + case 2: + numDice = 2; + break; + case 1: + numDice = 2; + break; + case 3: + numDice = 3; + break; + } + if (BoardPlayerSizeGet(arg0) == 1) { + diceSize = 1; + maxRoll = 5; + } else if (BoardPlayerSizeGet(arg0) == 2) { + diceSize = 2; + maxRoll = 10; + if (BoardRollResizeCheck() != 0) { + numDice = 2; + } + } + if (GWPlayer[rollPlayer].bowser_suit != 0) { + diceSize = 3; + } + GWPlayer[arg0].field08_bit7 = numDice; + rollProc = HuPrcChildCreate(RollMain, 0x2005, 0x6000, 0, boardMainProc); + HuPrcDestructorSet2(rollProc, RollDestroy); + while (rollProc != NULL) { + HuPrcVSleep(); + } + while (diceObj[0] || diceObj[1] || diceObj[2]) { + HuPrcVSleep(); + } + return destMode; +} + +void BoardRollKill(void) { + if (rollProc) { + HuPrcKill(rollProc); + } + DicePauseAll(); + DiceKill(); +} + +void BoardRollUPauseSet(s32 arg0) { + if (!rollProc) { + return; + } + BoardRollWinDispSet(arg0); + BoardDiceVisibleSet(0, arg0); + BoardDiceVisibleSet(1, arg0); + BoardDiceVisibleSet(2, arg0); + DiceHideEffect(0, arg0); + DiceHideEffect(1, arg0); + DiceHideEffect(2, arg0); +} + +void BoardRollWinDispSet(s32 arg0) { + if (rollWin == -1) { + return; + } + if (arg0 != 0) { + HuWinDispOn(rollWin); + } else { + HuWinDispOff(rollWin); + } +} + +static void RollMain(void) { + float sp8[2]; + float var_f31; + float var_f30; + s32 var_r28; + s32 var_r27; + s32 temp_r26; + s32 temp_r25; + s32 var_r30; + s32 var_r29; + s32 i; + + diceValue[0] = diceValue[1] = diceValue[2] = 0; + if (BoardPlayerSizeGet(rollPlayer) == 2 || GWPlayer[rollPlayer].bowser_suit != 0) { + BoardCameraViewSet(2); + } + BoardCameraMotionWait(); + BoardCameraTargetModelSet(-1); + for (i = 0; i < numDice; i++) { + temp_r26 = rollPlayer; + if (!_CheckFlag(0x1000B)) { + var_r27 = BoardPlayerItemCount(temp_r26); + if (GWTeamGet()) { + temp_r25 = BoardPlayerSameTeamFind(temp_r26); + var_r27 += BoardPlayerItemCount(temp_r25); + } + if (BoardRollTypeGet() != -1 || var_r27 == 0 || _CheckFlag(0x10009) || BoardRollResizeCheck()) { + var_r29 = 0x90004; + } else { + var_r29 = 0x90002; + } + if (inputTimer != 0) { + var_r29 = 0x300025; + } + HuWinMesMaxSizeGet(1, sp8, var_r29); + switch (GWGameStat.language) { + case 0: + var_f31 = -10000.0f; + break; + case 1: + var_f31 = 288.0f - (sp8[0] / 2 - 16.0f); + break; + } + var_f30 = 304.0f; + rollWin = HuWinCreate(var_f31, var_f30, sp8[0], sp8[1], 0); + HuWinBGTPLvlSet(rollWin, 0.0f); + HuWinMesSpeedSet(rollWin, 0); + HuWinMesSet(rollWin, var_r29); + } + DiceCreate(i); + DiceWaitFull(i); + DoInput(i); + if (rollWin != -1) { + HuWinKill(rollWin); + rollWin = -1; + } + if (destMode == -2 || destMode == -1 || destMode == -3 || destMode == -4) { + HuPrcEnd(); + } + BoardPlayerDiceJumpStart(rollPlayer); + while (!BoardPlayerDiceJumpCheck(rollPlayer)) { + HuPrcVSleep(); + } + DiceSetHit(i); + while (GWPlayer[rollPlayer].field08_bit3 != 0) { + HuPrcVSleep(); + } + } + for (var_r30 = i = 0; i < numDice; i++) { + var_r30 += diceValue[i]; + } + var_r28 = 0; + switch (numDice) { + case 2: + if (diceValue[0] == diceValue[1]) { + var_r28 = 1; + } + break; + case 3: + if (diceValue[0] == diceValue[1] && diceValue[0] == diceValue[2]) { + var_r28 = 1; + } + break; + } + if (var_r28 != 0) { + SameRollExec(); + } + BoardDicePauseAll(); + while (!BoardDiceDoneCheck()) { + HuPrcVSleep(); + } + for (i = 0; i < numDice; i++) { + BoardDiceStop(i); + } + destMode = var_r30; + GWPlayer[rollPlayer].roll = var_r30; + BoardDiceDigit2DInit(rollPlayer, 1); + if (_CheckFlag(0x1000B)) { + BoardTutorialHookExec(6, 0); + } + if (tutorialRollF != 0) { + tutorialRollF = 0; + } + HuPrcEnd(); +} + +static void DiceCreate(s32 arg0) { + Vec sp1C; + float temp_f30; + float var_f31; + omObjData *temp_r31; + DiceWork *temp_r30; + s32 sp8; + s32 spC[4] = { + 0x00070018, + 0x00070019, + 0x0007001A, + 0x0007001B + }; + + sp8 = 0; + diceMdl[arg0] = BoardModelCreate(spC[diceSize], NULL, 0); + temp_f30 = BoardRandMod(maxRoll) + 0.5f; + BoardPlayerPosGet(rollPlayer, &sp1C); + HuAudFXPlay(0x302); + BoardModelMotionStart(diceMdl[arg0], 0, 0); + BoardModelMotionSpeedSet(diceMdl[arg0], 0.0f); + BoardModelMotionTimeSet(diceMdl[arg0], temp_f30); + BoardModelScaleSet(diceMdl[arg0], 0.001f, 0.001f, 0.001f); + temp_r31 = omAddObjEx(boardObjMan, 0x102, 0, 0, -1, DiceMain); + temp_r30 = OM_GET_WORK_PTR(temp_r31, DiceWork); + temp_r30->unk00_field0 = 0; + temp_r30->unk00_field1 = 0; + temp_r30->unk00_field2 = 0; + temp_r30->unk00_field3 = arg0; + temp_r30->unk04 = 0; + temp_r30->unk01 = 4; + temp_r30->unk02 = 0; + diceObj[arg0] = temp_r31; + var_f31 = 250.0f; + if (diceSize == 2) { + var_f31 = 625.0f; + } else if (GWPlayer[rollPlayer].bowser_suit != 0) { + var_f31 = 575.0f; + } + sp1C.y += var_f31; + temp_r31->trans.x = sp1C.x; + temp_r31->trans.y = sp1C.y; + temp_r31->trans.z = sp1C.z; + temp_r31->scale.x = 0.1f; + temp_r31->scale.y = 0.1f; + temp_r31->scale.z = 0.1f; + sp1C.z += 70.0f; +} + +static void DoInput(s32 arg0) { + s32 var_r31; + s32 var_r30; + u16 sp8[1]; + + destMode = 0; + lbl_801D4098 = 0; + while (1) { + HuPrcVSleep(); + *sp8 = GetBtnRoll(rollPlayer); + if (BoardPauseActiveCheck()) { + *sp8 = 0; + continue; + } + if (*sp8 == 0x100) { + inputTimer++; + break; + } + if (inputTimer == 0) { + if (*sp8 == 0x10) { + destMode = -3; + HuAudFXPlay(1); + break; + } + if (*sp8 == 0x20) { + destMode = -4; + HuAudFXPlay(1); + break; + } + var_r31 = BoardPlayerItemCount(rollPlayer); + if (GWTeamGet()) { + var_r30 = BoardPlayerSameTeamFind(rollPlayer); + var_r31 += BoardPlayerItemCount(var_r30); + } + if (var_r31 == 0 || BoardRollTypeGet() != -1 || BoardRollResizeCheck() || _CheckFlag(0x10009)) { + if (_CheckFlag(0x10009) && GWBoardGet() == 5 && *sp8 == 0x200 && var_r31 != 0) { + HuAudFXPlay(4); + } + } else if (*sp8 == 0x200) { + destMode = -2; + HuAudFXPlay(3); + BoardPauseDisableSet(1); + break; + } + } + } +} + +static void DiceWaitFull(s32 arg0) { + DiceWork *temp_r31 = OM_GET_WORK_PTR(diceObj[arg0], DiceWork); + + while (temp_r31->unk00_field2 != 1) { + HuPrcVSleep(); + } +} + +static void DiceSetHit(s32 arg0) { + DiceWork *temp_r30 = OM_GET_WORK_PTR(diceObj[arg0], DiceWork); + + temp_r30->unk00_field2 = 2; + temp_r30->unk04 = 0; + BoardModelMotionSpeedSet(diceMdl[arg0], 0.0f); + diceValue[arg0] = (s32) BoardModelMotionTimeGet(diceMdl[arg0]) + 1; + if (tutorialRollF != 0 && tutorialRoll[arg0] != -1) { + BoardModelMotionTimeSet(diceMdl[arg0], tutorialRoll[arg0] - 1); + diceValue[arg0] = tutorialRoll[arg0]; + } +} + +static void RollDestroy(void) { + if (rollWin != -1) { + HuWinKill(rollWin); + rollWin = -1; + } + if (rollProc) { + HuPrcKill(rollProc); + } + DicePauseAll(); + DiceKill(); + BoardConfettiKill(); + rollProc = NULL; +} + +static void DiceMain(omObjData *arg0) { + DiceWork *temp_r29 = OM_GET_WORK_PTR(arg0, DiceWork); + float temp_f29; + float var_f28; + float var_f27; + s16 temp_r26; + s16 temp_r27; + + if (temp_r29->unk00_field0 != 0 || BoardIsKill()) { + if (diceSndStatus[temp_r29->unk00_field3] != -1) { + HuAudFXStop(diceSndStatus[temp_r29->unk00_field3]); + diceSndStatus[temp_r29->unk00_field3] = -1; + } + if (diceMdl[temp_r29->unk00_field3] != -1) { + BoardModelKill(diceMdl[temp_r29->unk00_field3]); + diceMdl[temp_r29->unk00_field3] = -1; + } + if (diceEff[temp_r29->unk00_field3] != -1) { + Hu3DParManKill(diceEff[temp_r29->unk00_field3]); + diceEff[temp_r29->unk00_field3] = -1; + } + DicePause(temp_r29->unk00_field3); + diceObj[temp_r29->unk00_field3] = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + switch (temp_r29->unk00_field2) { + case 0: + if (temp_r29->unk06 >= 0x438) { + temp_r29->unk00_field2 = 1; + arg0->scale.x = arg0->scale.y = arg0->scale.z = 1.0f; + arg0->rot.y = temp_r29->unk04 = 0; + } else { + if (temp_r29->unk04 == 0 && diceSndStatus[temp_r29->unk00_field3] == -1) { + diceSndStatus[temp_r29->unk00_field3] = HuAudFXPlay(0x300); + } + arg0->rot.y = temp_r29->unk06 % 360; + temp_r29->unk06 += 0x19; + if (temp_r29->unk04 < 0xB4) { + var_f27 = 0.0f; + var_f28 = 1.0f; + } else { + var_f27 = 1.0f; + var_f28 = 0.5f; + } + arg0->scale.x = var_f27 + var_f28 * sin((float) (temp_r29->unk04 % 180) * M_PI / 180.0); + arg0->scale.y = arg0->scale.x; + arg0->scale.z = arg0->scale.x; + if (temp_r29->unk04 <= 360) { + if (temp_r29->unk04 < 0xB4) { + temp_r29->unk04 += 6; + } else { + temp_r29->unk04 += 0x12; + } + if (temp_r29->unk04 > 360) { + temp_r29->unk04 = 360; + } + } + } + break; + case 1: + temp_r29->unk04 += 4; + if (temp_r29->unk04 > 360) { + temp_r29->unk04 -= 360; + } + OSs16tof32(&temp_r29->unk04, &temp_f29); + arg0->trans.y += 0.20000000298023224 * sin(temp_f29 * M_PI / 180.0); + break; + case 2: + temp_r29->unk04++; + if (temp_r29->unk04 >= 8) { + if (diceSndStatus[temp_r29->unk00_field3] != -1) { + HuAudFXStop(diceSndStatus[temp_r29->unk00_field3]); + diceSndStatus[temp_r29->unk00_field3] = -1; + } + HuAudFXPlay(0x303); + HuAudFXPlay(0x30C); + temp_r29->unk00_field2 = 3; + temp_r29->unk04 = 0; + BoardDiceValueSet(temp_r29->unk00_field3, diceValue[temp_r29->unk00_field3]); + diceEff[temp_r29->unk00_field3] = BoardDiceEffectCreate(); + Hu3DParManPosSet(diceEff[temp_r29->unk00_field3], arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelVisibilitySet(diceMdl[temp_r29->unk00_field3], 0); + } else { + OSs16tof32(&temp_r29->unk04, &temp_f29); + if (temp_r29->unk04 < 4) { + arg0->trans.y += 10.0f + (0.5f * temp_f29); + arg0->scale.x = (arg0->scale.x + (0.10000000149011612 * sin((M_PI * (4.0f * temp_f29)) / 180.0))); + arg0->scale.y = arg0->scale.x; + arg0->scale.z = arg0->scale.x; + } else { + BoardModelAlphaSet(diceMdl[temp_r29->unk00_field3], 0xFF - (temp_r29->unk04 << 5)); + } + arg0->trans.y += -0.49f * temp_f29 * temp_f29; + } + break; + case 3: + break; + } + if (diceEff[temp_r29->unk00_field3] != -1 && ++temp_r29->unk04 >= 150) { + temp_r29->unk00_field0 = 1; + DiceHideEffect(temp_r29->unk00_field3, 0); + } + if (temp_r29->unk00_field1 == 0 || temp_r29->unk00_field2 != 3) { + if (temp_r29->unk02++ > temp_r29->unk01) { + temp_r29->unk02 = 0; + temp_r26 = BoardModelMotionTimeGet(diceMdl[temp_r29->unk00_field3]); + do { + temp_r27 = BoardRandMod(maxRoll); + } while (temp_r27 == temp_r26); + BoardModelMotionTimeSet(diceMdl[temp_r29->unk00_field3], temp_r27 + 0.5f); + } + } + BoardModelPosSet(diceMdl[temp_r29->unk00_field3], arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotSet(diceMdl[temp_r29->unk00_field3], arg0->rot.x, arg0->rot.y, arg0->rot.z); + BoardModelScaleSet(diceMdl[temp_r29->unk00_field3], arg0->scale.x, arg0->scale.y, arg0->scale.z); +} + +static void DicePause(s32 arg0) { + omObjData *temp_r31 = diceObj[arg0]; + + if (temp_r31) { + OM_GET_WORK_PTR(temp_r31, DiceWork)->unk00_field0 = 1; + } +} + +static void DicePauseAll(void) { + DicePause(0); + DicePause(1); + DicePause(2); +} + +s16 BoardDiceEffectCreate(void) { + s16 temp_r31; + s16 temp_r30; + AnimData *temp_r29; + void *temp_r28; + + temp_r28 = HuDataSelHeapReadNum(0x7006B, MEMORY_DEFAULT_NUM, HEAP_DATA); + temp_r29 = HuSprAnimRead(temp_r28); + temp_r31 = Hu3DParManCreate(temp_r29, 0x64, &diceEffParam); + Hu3DParManAttrSet(temp_r31, 0x108); + Hu3DParManRotSet(temp_r31, 0.0f, 0.0f, 0.0f); + Hu3DParManVecSet(temp_r31, 0.0f, 0.4f, 0.2f); + Hu3DParManTimeLimitSet(temp_r31, 0x96); + temp_r30 = Hu3DParManModelIDGet(temp_r31); + Hu3DModelLayerSet(temp_r30, 1); + Hu3DParticleBlendModeSet(temp_r30, 0); + return temp_r31; +} + +static void DiceHideEffect(s32 arg0, s32 arg1) { + s16 temp_r31; + + if (diceEff[arg0] == -1) { + return; + } + temp_r31 = Hu3DParManModelIDGet(diceEff[arg0]); + if (arg1 != 0) { + Hu3DModelAttrReset(temp_r31, 1); + } else { + Hu3DModelAttrSet(temp_r31, 1); + } +} + +void BoardDicePauseAll(void) { + DiceDigitWork *temp_r30; + s32 i; + + for (i = 0; i < numDice; i++) { + if (diceDigitObj[i]) { + temp_r30 = OM_GET_WORK_PTR(diceDigitObj[i], DiceDigitWork); + temp_r30->unk00_field1 = 1; + temp_r30->unk00_field2 = 1; + temp_r30->unk02 = 0; + } + } +} + +BOOL BoardDiceDoneCheck(void) { + DiceDigitWork *temp_r30; + s32 i; + + for (i = 0; i < numDice; i++) { + if (diceDigitObj[i]) { + temp_r30 = OM_GET_WORK_PTR(diceDigitObj[i], DiceDigitWork); + if (temp_r30->unk00_field2 != 0) { + return FALSE; + } + } + } + return TRUE; +} + +void BoardDiceStop(s32 arg0) { + DiceDigitWork *temp_r31; + + if (!diceDigitObj[arg0]) { + return; + } + temp_r31 = OM_GET_WORK_PTR(diceDigitObj[arg0], DiceDigitWork); + temp_r31->unk00_field0 = 1; +} + +void BoardDiceVisibleSet(s32 arg0, s32 arg1) { + DiceDigitWork *temp_r31; + + if (!diceDigitObj[arg0]) { + return; + } + temp_r31 = OM_GET_WORK_PTR(diceDigitObj[arg0], DiceDigitWork); + if ((temp_r31->unk01 / 10) == 0) { + BoardModelVisibilitySet(temp_r31->unk04[1], 0); + } else { + BoardModelVisibilitySet(temp_r31->unk04[1], arg1); + } + BoardModelVisibilitySet(temp_r31->unk04[0], arg1); +} + +void BoardDiceValueSet(s32 arg0, s32 arg1) { + omObjData *temp_r27; + DiceDigitWork *temp_r31; + Vec spC; + s16 sp8[2]; + s16 temp_r30; + s16 i; + + if (arg1 > 0x63) { + arg1 = 0x63; + } + sp8[0] = (arg1 % 10); + sp8[1] = (arg1 / 10); + BoardPlayerPosGet(GWSystem.player_curr, &spC); + spC.y += 300.0f; + temp_r27 = omAddObjEx(boardObjMan, 0x102, 0, 0, -1, DiceDigitMain); + temp_r31 = OM_GET_WORK_PTR(temp_r27, DiceDigitWork); + temp_r31->unk00_field0 = 0; + temp_r31->unk00_field1 = 0; + temp_r31->unk00_field2 = 0; + temp_r31->unk00_field3 = arg0; + temp_r31->unk08 = 0.3f; + temp_r31->unk01 = arg1; + temp_r31->unk02 = 360; + for (i = 0; i < 2; i++) { + temp_r30 = BoardModelCreate(diceDigitMdlTbl[sp8[i]], NULL, 0); + BoardModelPosSetV(temp_r30, &spC); + BoardModelMotionStart(temp_r30, 0, 0); + BoardModelMotionSpeedSet(temp_r30, 0.0f); + BoardModelMotionTimeSet(temp_r30, 0.0f); + BoardModelScaleSet(temp_r30, 0.143f, 0.143f, 0.143f); + temp_r31->unk04[i] = temp_r30; + } + if (sp8[1] == 0) { + BoardModelVisibilitySet(temp_r31->unk04[1], 0); + } + diceDigitObj[arg0] = temp_r27; +} + +static void DiceDigitMain(omObjData *arg0) { + DiceDigitWork *temp_r31 = OM_GET_WORK_PTR(arg0, DiceDigitWork); + + if (temp_r31->unk00_field0 != 0 || BoardIsKill()) { + DiceDigitKill(temp_r31); + diceDigitObj[temp_r31->unk00_field3] = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + DiceDigitMove(temp_r31, temp_r31->unk00_field1); + DiceDigitRotate(temp_r31, temp_r31->unk00_field1); +} + +static void DiceDigitKill(DiceDigitWork *arg0) { + s32 i; + + for (i = 0; i < 2; i++) { + if (arg0->unk04[i] != -1) { + BoardModelKill(arg0->unk04[i]); + } + } +} + +static void DiceKill(void) { + DiceDigitWork *temp_r29; + s32 i; + + for (i = 0; i < 3; i++) { + if (diceDigitObj[i]) { + temp_r29 = OM_GET_WORK_PTR(diceDigitObj[i], DiceDigitWork); + DiceDigitKill(temp_r29); + } + } +} + +static void DiceDigitMove(DiceDigitWork *arg0, s32 arg1) { + s32 sp8 = 0; + Vec sp30; + Vec sp24; + Vec sp54[2]; + Vec sp18 = { 288.0f, 155.0f, 240.0f }; + Vec sp3C[2] = { + { 144.0f, 155.0f, 240.0f }, + { 432.0f, 155.0f, 240.0f } + }; + Vec sp6C[3] = { + { 144.0f, 155.0f, 240.0f }, + { 432.0f, 155.0f, 240.0f }, + { 288.0f, 155.0f, 240.0f } + }; + Vec spC = { 288.0f, 176.0f, 240.0f }; + Vec *var_r29; + float var_f31; + s16 var_r27; + s16 i; + + var_r27 = (arg0->unk01 / 10); + if (arg1 != 0) { + var_r29 = &spC; + var_f31 = -20.0f * arg0->unk00_field3; + } else { + switch (numDice) { + case 1: + var_r29 = &sp18; + break; + case 2: + var_r29 = &sp3C[arg0->unk00_field3]; + break; + case 3: + var_r29 = &sp6C[arg0->unk00_field3]; + break; + } + var_f31 = 0.0f; + } + for (i = 0; i < 2; i++) { + if (var_r27 == 0) { + sp54[i].x = var_r29->x; + } else if (i != 0) { + sp54[i].x = var_r29->x - 30.0f; + } else { + sp54[i].x = var_r29->x + 30.0f; + } + sp54[i].y = var_r29->y; + sp54[i].z = var_r29->z + var_f31; + } + for (i = 0; i < 2; i++) { + BoardModelPosGet(arg0->unk04[i], &sp30); + Hu3D2Dto3D(&sp54[i], 1, &sp54[i]); + PSVECSubtract(&sp54[i], &sp30, &sp24); + if (PSVECMag(&sp24) < 0.01f) { + arg0->unk00_field2 = 0; + if (arg1 != 0 && arg0->unk00_field3 != 0) { + BoardModelVisibilitySet(arg0->unk04[i], 0); + } + } else { + arg0->unk00_field2 = 1; + } + PSVECScale(&sp24, &sp24, arg0->unk08); + PSVECAdd(&sp30, &sp24, &sp30); + BoardModelPosSetV(arg0->unk04[i], &sp30); + } +} + +static void DiceDigitRotate(DiceDigitWork *arg0, s32 arg1) { + float var_f30; + s32 i; + + if (arg1 != 0) { + arg0->unk02 += 0x12; + if (arg0->unk02 >= 360) { + arg0->unk02 = 360; + } + } else { + arg0->unk02 -= 0x12; + if (arg0->unk02 <= 0) { + arg0->unk02 = 0; + } + } + OSs16tof32(&arg0->unk02, &var_f30); + for (i = 0; i < 2; i++) { + if (arg0->unk04[i] != -1) { + BoardModelRotSet(arg0->unk04[i], 0.0f, var_f30, 0.0f); + } + } +} + +static void SameRollExec(void) { + Vec sp8; + float var_f31; + s32 var_r28; + s32 temp_r27; + s32 var_r31; + s32 i; + s32 var_r29; + + temp_r27 = -1; + BoardPauseDisableSet(1); + var_r28 = 0x50; + switch (numDice) { + case 2: + if (diceValue[0] == 7) { + var_r31 = 0x1E; + } else { + var_r31 = 0xA; + } + break; + case 3: + if (diceValue[0] == 7) { + var_r31 = 0x32; + var_r28 = 0x118; + } else if (diceValue[0] & 1) { + var_r31 = 0x1E; + } else { + var_r31 = 0xA; + } + break; + default: + return; + } + sprintf(sameRollCoinStr, "%d", var_r31); + BoardPlayerPosGet(rollPlayer, &sp8); + if (BoardPlayerSizeGet(rollPlayer) == 2 || GWPlayer[rollPlayer].bowser_suit != 0) { + sp8.y += 700.0f; + var_f31 = 450.0f; + } else { + sp8.y += 600.0f; + var_f31 = 300.0f; + } + BoardConfettiCreate(&sp8, var_r28, var_f31); + BoardAudSeqPause(0, 1, 0x3E8); + HuPrcSleep(0xA); + temp_r27 = HuAudSStreamPlay(9); + while (HuAudSStreamStatGet(temp_r27) != 0) { + HuPrcVSleep(); + } + BoardAudSeqPause(0, 0, 0x3E8); + BoardWinCreate(0, 0x90000, -1); + BoardWinInsertMesSet(sameRollCoinStr, 0); + BoardWinWait(); + BoardWinKill(); + if (var_r31 >= 0x32) { + var_r29 = 1; + } else if (var_r31 >= 0x14) { + var_r29 = 3; + } else { + var_r29 = 6; + } + for (i = 0; i < var_r31; i++) { + BoardPlayerCoinsAdd(rollPlayer, 1); + HuAudFXPlay(7); + HuPrcSleep(var_r29); + } + HuAudFXPlay(0xF); + BoardConfettiStop(); + BoardPauseDisableSet(0); +} + +static s32 GetBtnRoll(s32 arg0) { + s32 var_r31 = 0; + s32 var_r29; + + if (boardTutorialUseItem >= 0 && boardTutorialUseItem <= 0xD) { + var_r31 = 0x200; + return var_r31; + } + if (_CheckFlag(0x1000B)) { + var_r31 = 0x100; + return var_r31; + } + if (!GWPlayer[arg0].com) { + var_r29 = GWPlayer[arg0].port; + var_r31 = HuPadBtnDown[var_r29]; + return var_r31; + } + if (_CheckFlag(0x10009) || BoardRollTypeGet() != -1) { + return 0x100; + } + var_r31 = GetComBtnRoll(arg0); + return var_r31; +} + +static s32 GetComBtnRoll(s32 arg0) { + if (BoardRollTypeGet() != -1 || BoardPlayerItemCount(arg0) == 0 || BoardRollResizeCheck() || _CheckFlag(0x10009)) { + return 0x100; + } + if (BoardComUseItemCheck(arg0)) { + return 0x200; + } + return 0x100; +} + +void BoardRollTutorialSet(s16 *arg0) { + s32 i; + + for (i = 0; i < 3; i++) { + tutorialRoll[i] = arg0[i]; + } + tutorialRollF = 1; +} diff --git a/src/game/board/space.c b/src/game/board/space.c index 5d1d899c..e117bf18 100644 --- a/src/game/board/space.c +++ b/src/game/board/space.c @@ -3,18 +3,17 @@ #include "game/board/main.h" #include "game/board/player.h" #include "game/board/space.h" +#include "game/board/star.h" +#include "game/board/tutorial.h" #include "game/hsfman.h" #include "game/data.h" #include "game/sprite.h" +#include "game/objsub.h" #include "math.h" #include "string.h" -extern void omVibrate(s16, s16, s16, s16); - -extern s16 BoardStarHostMdlGet(void); -extern void BoardModelPosSetV(s16 model, Vec *pos); extern s16 BoardModelCreate(s32 file, s32 *data, s32 arg3); extern s16 BoardModelIDGet(s16 model); @@ -53,9 +52,6 @@ static s16 starPlatMdl = -1; static s32 ExecPipeSpace(s32 player, s32 space); -extern s8 boardTutorialBlockF; -extern s32 boardTutorialBlockPos; - void BoardSpaceWalkEventFuncSet(BoardSpaceEventFunc func) { @@ -992,7 +988,7 @@ void BoardSpaceInit(s32 data_num) AnimData *data; void *data_base; s32 size; - data = data_base = HuDataSelHeapReadNum(MAKE_DATA_NUM(DATADIR_BOARD, 29), MEMORY_DEFAULT_NUM, HEAP_DATA); + data = data_base = HuDataSelHeapReadNum(DATA_MAKE_NUM(DATADIR_BOARD, 29), MEMORY_DEFAULT_NUM, HEAP_DATA); data->bmp = (void *)((u32)data_base+(u32)data->bmp); data->pat = (void *)((u32)data_base+(u32)data->pat); data->bank = (void *)((u32)data_base+(u32)data->bank); @@ -1024,7 +1020,7 @@ void BoardSpaceInit(s32 data_num) AnimData *data; void *data_base; s32 size; - data = data_base = HuDataSelHeapReadNum(MAKE_DATA_NUM(DATADIR_BOARD, 28), MEMORY_DEFAULT_NUM, HEAP_DATA); + data = data_base = HuDataSelHeapReadNum(DATA_MAKE_NUM(DATADIR_BOARD, 28), MEMORY_DEFAULT_NUM, HEAP_DATA); data->bmp = (void *)((u32)data_base+(u32)data->bmp); data->pat = (void *)((u32)data_base+(u32)data->pat); data->bank = (void *)((u32)data_base+(u32)data->bank); @@ -1059,7 +1055,7 @@ void BoardSpaceInit(s32 data_num) GWSystem.star_flag = 0; } if(BoardCurrGet() != 7 && BoardCurrGet() != 8) { - starPlatMdl = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BOARD, 6), NULL, 0); + starPlatMdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 6), NULL, 0); BoardModelMotionStart(starPlatMdl, 0, 0x40000001); BoardModelVisibilitySet(starPlatMdl, 0); if(_CheckFlag(FLAG_ID_MAKE(1, 1))) { diff --git a/src/game/board/star.c b/src/game/board/star.c new file mode 100755 index 00000000..59815c40 --- /dev/null +++ b/src/game/board/star.c @@ -0,0 +1,821 @@ +#include "game/board/star.h" +#include "game/audio.h" +#include "game/data.h" +#include "game/flag.h" +#include "game/gamework.h" +#include "game/gamework_data.h" +#include "game/hsfanim.h" +#include "game/hsfman.h" +#include "game/msm.h" +#include "game/objsub.h" +#include "game/wipe.h" +#include "game/board/audio.h" +#include "game/board/com.h" +#include "game/board/main.h" +#include "game/board/model.h" +#include "game/board/player.h" +#include "game/board/tutorial.h" +#include "game/board/ui.h" +#include "game/board/window.h" + +#include "math.h" + +typedef struct { + struct { + u8 unk00_field0 : 1; + u8 unk00_field1 : 1; + u8 unk00_field2 : 1; + u8 unk00_field3 : 2; + u8 unk00_field4 : 1; + }; + s8 unk01; + s8 unk02; + char unk03[1]; + s16 unk04; + s16 unk06; + s16 unk08; + s16 unk0A; + s16 unk0C; +} GiveStarWork; + +typedef struct { + struct { + u8 unk00_field0 : 1; + }; + s8 unk01; +} ShowNextWork; + +static void ExecStar(void); +static void DestroyStar(void); +static void GiveStarMain(omObjData *arg0); +static void UpdateStarAngle(GiveStarWork *arg0, omObjData *arg1); +static void InitGiveStar(GiveStarWork *arg0, omObjData *arg1); +static void MoveGiveStar(GiveStarWork *arg0, omObjData *arg1); +static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1); +static void StopGiveStar(void); +static void InitGiveStarEffect(void); +static void KillGiveStarEffect(void); +static void ShowNextUpdate(omObjData *arg0); +static void HideNextHost(s32 arg0); + +static Vec starCharPos; + +static s16 hostMot[2]; +static omObjData *showNextObj; +static s16 starDoneF; +static AnimData *starEffAnim; +static omObjData *giveStarObj; +static Process *starProc; + +static s16 starParman = -1; +static s16 hostMdl = -1; + +const s32 lbl_8011E040[9] = { + 0x000C0000, + 0x000C0009, + 0x000C0012, + 0x000C001B, + 0x000C0024, + 0x000C002D, + 0x000C0000, + 0x000C0000, + 0x000C0000 +}; + +const s32 lbl_8011E064[9][2] = { + { 0x00150022, 0x00150028 }, + { 0x00150023, 0x00150029 }, + { 0x00150024, 0x0015002A }, + { 0x00150025, 0x0015002B }, + { 0x00150026, 0x0015002C }, + { 0x00150027, 0x0015002D }, + { 0x00150022, 0x00150028 }, + { 0x00150022, 0x00150028 }, + { 0x00150022, 0x00150028 } +}; + +s32 boardStarSndTbl[] = { + 0x00000120, + 0x00000160, + 0x000001A0, + 0x000001E0, + 0x00000220, + 0x00000260, + 0x000002A0, + 0x000002E0 +}; + +static s32 hostMotTbl[][2] = { + { 0x00750021, 0x0007009D }, + { 0x00760007, 0x0007009E }, + { 0x0077001F, 0x0007009F }, + { 0x0078000B, 0x000700A0 }, + { 0x00790009, 0x000700A1 }, + { 0x007A0015, 0x000700A2 }, + { 0x00000000, 0x00000000 }, + { 0x00000000, 0x00000000 }, + { 0x00000000, 0x00000000 } +}; + +static HsfanimStruct00 starEffParam = { + 0x001E, + { 0x00, 0x00 }, // padding? + 3.3f, + 70.0f, + 7.0f, + { 0.0f, -0.05f, 0.0f }, + 2.0f, + 1.0f, + 20.0f, + 0.98f, + 0x0002, + { + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x40, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + }, + { + 0xFF, 0x80, 0x80, 0x00, + 0xFF, 0x40, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + } +}; + +void BoardStarHostSet(s16 arg0) { + hostMdl = arg0; + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + return; + } + if (_CheckFlag(0x10001)) { + BoardSpaceHostSet(boardSpaceStarTbl[GWSystem.star_pos]); + } +} + +s16 BoardStarHostMdlGet(void) { + return hostMdl; +} + +void BoardStarExec(s32 arg0, BoardSpace *arg1) { + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + return; + } + if (BoardPlayerSizeGet(arg0) != 2) { + BoardDiceDigit2DShowSet(0); + starProc = HuPrcChildCreate(ExecStar, 0x2003, 0x3800, 0, boardMainProc); + HuPrcDestructorSet2(starProc, DestroyStar); + while (starProc != NULL) { + HuPrcVSleep(); + } + BoardDiceDigit2DShowSet(1); + } +} + +static void ExecStar(void) { + Vec sp24; + Vec sp18; + Vec spC; + float temp_f27; + float temp_f29; + float temp_f30; + float var_f28; + float var_f31; + s16 temp_r30; + u32 sp8; + s32 temp_r24; + s32 temp_r29; + s32 var_r26; + s32 var_r25; + s32 i; + s32 temp_r27; + s32 temp_r31; + s32 var_r22; + BoardSpace *var_r23; + + temp_r31 = GWSystem.player_curr; + temp_r27 = GWBoardGet(); + temp_r30 = BoardStarHostMdlGet(); + HuAudFXPlay(0x33A); + for (i = 0; i < 2; i++) { + hostMot[i] = BoardModelMotionCreate(temp_r30, hostMotTbl[temp_r27][i]); + } + BoardPlayerPosGet(temp_r31, &sp24); + temp_r24 = GWPlayer[temp_r31].space_curr; + var_r23 = BoardSpaceGet(0, temp_r24); + sp8 = (var_r23->flag & 0x70000) >> 16; + starDoneF = 0; + var_r22 = BoardSpaceLinkFlagSearch(0, temp_r24, 0x04000000); + BoardSpacePosGet(0, var_r22, &sp18); + PSVECSubtract(&sp18, &sp24, &spC); + temp_f30 = 90.0 - 180.0 * (atan2(spC.z, spC.x) / M_PI); + temp_f30 = 90.0f * ((temp_f30 + 3.0f) / 90.0f); + temp_f29 = BoardPlayerRotYGet(temp_r31); + BoardRotateDiceNumbers(temp_r31); + if (BoardDAngleCalc(temp_f30 - temp_f29) < 0.0f) { + var_f28 = -BoardDAngleCalc(temp_f30 - temp_f29); + } else { + var_f28 = BoardDAngleCalc(temp_f30 - temp_f29); + } + if (var_f28 > 90.0f) { + var_r25 = 0x1E; + } else { + var_r25 = 0xF; + } + BoardPlayerMotBlendSet(temp_r31, temp_f30, var_r25); + temp_f27 = BoardModelRotYGet(temp_r30); + var_f31 = BoardDAngleCalc(temp_f30 + 180.0f) - temp_f27; + if ((var_f31 <= 4.0f && var_f31 >= 0.0f) + || (var_f31 <= 360.0f && var_f31 >= 355.0f) + || (var_f31 <= 0.0f && var_f31 >= -4.0f)) { + var_r26 = 0; + } else { + var_r26 = 1; + } + if (var_r26 != 0) { + var_f31 /= var_r25; + BoardModelMotionShiftSet(temp_r30, hostMot[1], 0.0f, 10.0f, 0x40000001); + BoardModelMotionSpeedSet(temp_r30, 2.0f); + } + while (!BoardPlayerMotBlendCheck(temp_r31)) { + if (var_r26 != 0) { + temp_f30 = var_f31 + BoardModelRotYGet(temp_r30); + BoardModelRotYSet(temp_r30, temp_f30); + } + HuPrcVSleep(); + } + BoardModelMotionShiftSet(temp_r30, 1, 0.0f, 10.0f, 0x40000001); + BoardCameraViewSet(3); + BoardCameraMotionWait(); + if (GWStarsGet(temp_r31) >= 999) { + temp_r29 = lbl_8011E040[temp_r27] + 5; + BoardWinCreate(0, temp_r29, BoardWinPortraitGetStar()); + BoardWinWait(); + BoardWinKill(); + } else if (BoardPlayerCoinsGet(temp_r31) < 20 && GWSystem.last5_effect != 4) { + temp_r29 = lbl_8011E040[temp_r27] + 2; + BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar()); + BoardWinWait(); + BoardWinKill(); + } else { + BoardStatusShowSetAll(0); + while (!BoardStatusStopCheck(0) || !BoardStatusStopCheck(1) || !BoardStatusStopCheck(2) || !BoardStatusStopCheck(3)) { + HuPrcVSleep(); + } + temp_r29 = lbl_8011E040[temp_r27]; + BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar()); + BoardWinInsertMesSet(BoardPlayerGetCharMess(temp_r31), 0); + BoardWinWait(); + BoardWinKill(); + while (1) { + BoardStatusShowSetForce(temp_r31); + BoardStatusShowSet(temp_r31, 1); + while (!BoardStatusStopCheck(temp_r31)) { + HuPrcVSleep(); + } + if (GWSystem.last5_effect == 4) { + temp_r29 = lbl_8011E040[temp_r27] + 8; + BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar()); + BoardWinWait(); + break; + } + temp_r29 = lbl_8011E040[temp_r27] + 1; + BoardWinCreateChoice(1, temp_r29, BoardWinPortraitGetStar(), 0); + BoardWinAttrSet(0x10); + if (GWPlayer[temp_r31].com) { + if (BoardPlayerCoinsGet(temp_r31) >= 20) { + BoardComKeySetUp(); + } else { + BoardComKeySetDown(); + } + } + BoardWinWait(); + switch (BoardWinChoiceGet()) { + case 0: + if (BoardPlayerCoinsGet(temp_r31) < 20) { + temp_r29 = lbl_8011E040[temp_r27] + 2; + BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar()); + BoardWinWait(); + BoardStatusShowSet(temp_r31, 0); + while (!BoardStatusStopCheck(temp_r31)) { + HuPrcVSleep(); + } + BoardStatusShowSetAll(1); + goto block_B; + } + goto block_A; + case 1: + temp_r29 = lbl_8011E040[temp_r27] + 4; + BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar()); + BoardWinWait(); + BoardStatusShowSet(temp_r31, 0); + while (!BoardStatusStopCheck(temp_r31)) { + HuPrcVSleep(); + } + BoardStatusShowSetAll(1); + goto block_B; + default: + BoardStatusShowSet(temp_r31, 0); + while (!BoardStatusStopCheck(temp_r31)) { + HuPrcVSleep(); + } + BoardWinKill(); + BoardViewMapExec(temp_r31); + break; + } + } +block_A: + temp_r29 = lbl_8011E040[temp_r27] + 3; + BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar()); + BoardWinWait(); + BoardWinKill(); + if (GWSystem.last5_effect != 4) { + for (i = 0; i < 20; i++) { + BoardPlayerCoinsAdd(temp_r31, -1); + HuAudFXPlay(0xE); + HuPrcSleep(3); + } + HuAudFXPlay(0xF); + } + _SetFlag(0x10017); + BoardModelMotionShiftSet(temp_r30, hostMot[0], 0.0f, 10.0f, 0); + HuPrcSleep(0x1E); + starDoneF = 1; + BoardAudSeqFadeOut(0, 0x3E8); + BoardModelPosGet(temp_r30, &sp24); + sp24.y += 130.0f; + BoardStarGive(temp_r31, &sp24); + BoardStatusShowSet(temp_r31, 0); + while (!BoardStatusStopCheck(temp_r31)) { + HuPrcVSleep(); + } + BoardModelMotionShiftSet(temp_r30, 1, 0.0f, 10.0f, 0x40000001); + BoardStarShowNext(temp_r31); + BoardMusStartBoard(); + BoardModelRotYSet(temp_r30, 0.0f); + } +block_B: + BoardWinKill(); + var_f31 = -BoardModelRotYGet(temp_r30); + if (var_r26 != 0) { + var_f31 /= var_r25; + BoardModelMotionShiftSet(temp_r30, hostMot[1], 0.0f, 10.0f, 0x40000001); + BoardModelMotionSpeedSet(temp_r30, 3.0f); + } + BoardPlayerMotBlendSet(temp_r31, 0, var_r25); + while (!BoardPlayerMotBlendCheck(temp_r31)) { + if (var_r26 != 0) { + temp_f30 = var_f31 + BoardModelRotYGet(temp_r30); + BoardModelRotYSet(temp_r30, temp_f30); + } + HuPrcVSleep(); + } + BoardModelRotYSet(temp_r30, 0.0f); + BoardModelMotionShiftSet(temp_r30, 1, 0.0f, 10.0f, 0x40000001); + if (!_CheckFlag(0x10016)) { + BoardCameraViewSet(1); + BoardCameraTargetPlayerSet(temp_r31); + BoardCameraMotionWait(); + } + HuPrcEnd(); +} + +static void DestroyStar(void) { + s32 i; + + _ClearFlag(0x10017); + for (i = 0; i < 2; i++) { + BoardModelMotionKill(BoardStarHostMdlGet(), hostMot[i]); + hostMot[i] = -1; + } + StopGiveStar(); + KillGiveStarEffect(); + starProc = NULL; +} + +static void GiveStarMain(omObjData *arg0) { + GiveStarWork *temp_r30; + + temp_r30 = OM_GET_WORK_PTR(arg0, GiveStarWork); + if (temp_r30->unk00_field0 != 0 || BoardIsKill()) { + KillGiveStarEffect(); + BoardModelKill(temp_r30->unk0C); + giveStarObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + if (temp_r30->unk04 != 0) { + temp_r30->unk04--; + } else { + switch (temp_r30->unk01) { + case 4: + break; + case 0: + InitGiveStar(temp_r30, arg0); + break; + case 1: + MoveGiveStar(temp_r30, arg0); + break; + case 2: + ShrinkGiveStar(temp_r30, arg0); + break; + } + UpdateStarAngle(temp_r30, arg0); + } + BoardModelPosSet(temp_r30->unk0C, arg0->trans.x, arg0->trans.y, arg0->trans.z); + BoardModelRotSet(temp_r30->unk0C, 0.0f, arg0->rot.y, 0.0f); + BoardModelScaleSet(temp_r30->unk0C, arg0->scale.x, arg0->scale.y, arg0->scale.z); + if (starParman != -1) { + Hu3DParManPosSet(starParman, arg0->trans.x, -70.0f + arg0->trans.y, arg0->trans.z); + } +} + +static void UpdateStarAngle(GiveStarWork *arg0, omObjData *arg1) { + float var_f31; + + if (arg0->unk00_field1 != 0) { + if (arg0->unk02 < 16.0f) { + arg0->unk02 += 2.0f; + if (arg0->unk02 > 16.0f) { + arg0->unk02 = 0x10; + } + } + OSs8tof32(&arg0->unk02, &var_f31); + arg1->rot.y = BoardDAngleCalc(arg1->rot.y + var_f31); + } +} + +static void InitGiveStar(GiveStarWork *arg0, omObjData *arg1) { + Vec sp8; + + BoardPlayerPosGet(arg0->unk00_field3, &sp8); + BoardModelVisibilitySet(arg0->unk0C, 1); + BoardModelMotionStart(arg0->unk0C, 0, 0x40000001); + BoardModelMotionTimeSet(arg0->unk0C, 2.0f); + arg0->unk01 = 1; + arg0->unk0A = 0; + arg1->trans.x = starCharPos.x; + arg1->trans.y = starCharPos.y; + arg1->trans.z = starCharPos.z; + arg1->rot.x = (sp8.x - starCharPos.x) / 10.0f; + arg1->rot.z = (sp8.z - starCharPos.z) / 10.0f; + arg1->rot.y = 0.0f; + arg1->scale.x = arg1->scale.y = arg1->scale.z = 1.0f; + InitGiveStarEffect(); +} + +static void MoveGiveStar(GiveStarWork *arg0, omObjData *arg1) { + Vec sp8; + float temp_f31; + + BoardPlayerPosGet(arg0->unk00_field3, &sp8); + if (arg0->unk00_field2 == 0) { + if (BoardModelMotionTimeGet(arg0->unk0C) >= 50.0f) { + BoardModelMotionStartEndSet(arg0->unk0C, 0x32, 0x96); + arg0->unk00_field2 = 1; + } + } + if (arg0->unk0A < 10) { + OSs16tof32(&arg0->unk0A, &temp_f31); + arg1->trans.x += arg1->rot.x; + arg1->trans.z += arg1->rot.z; + arg1->trans.y += -0.08166667f * temp_f31 * temp_f31 * 0.97f + 50.0f; + arg0->unk0A++; + } else { + arg1->trans.y += -4.0f; + if (arg1->trans.y <= sp8.y + 300.0f) { + arg1->trans.y = sp8.y + 300.0f; + arg0->unk01 = 4; + } + } +} + +static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1) { + Vec sp8; + float var_f30; + + if (arg0->unk00_field4 == 0) { + HuAudFXPlay(0x339); + arg0->unk00_field4 = 1; + } + BoardPlayerPosGet(arg0->unk00_field3, &sp8); + arg1->trans.y += -4.0f; + if (arg1->trans.y > sp8.y + 80.0f) { + if (arg0->unk08 < 90) { + if (BoardPlayerSizeGet(arg0->unk00_field3) != 1) { + arg0->unk08 += 2; + } else { + arg0->unk08 += 1.4f; + } + if (arg0->unk08 > 90) { + arg0->unk08 = 90; + } + } + OSs16tof32(&arg0->unk08, &var_f30); + arg1->scale.x = sin((var_f30 + 90.0f) * M_PI / 180.0); + if (arg1->scale.x <= 0.0f) { + arg1->scale.x = 0.001f; + } + arg1->scale.y = arg1->scale.x; + arg1->scale.z = arg1->scale.x; + } else { + omVibrate(arg0->unk00_field3, 0xC, 0xC, 0); + arg0->unk00_field0 = 1; + arg0->unk01 = 4; + arg1->scale.x = arg1->scale.y = arg1->scale.z = 0.001f; + KillGiveStarEffect(); + BoardModelVisibilitySet(arg0->unk0C, 0); + } +} + +static void StopGiveStar(void) { + GiveStarWork *temp_r31; + + if (giveStarObj) { + temp_r31 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork); + temp_r31->unk00_field0 = 1; + } +} + +static void InitGiveStarEffect(void) { + s16 temp_r3; + void *var_r30; + + var_r30 = HuDataSelHeapReadNum(0x120001, MEMORY_DEFAULT_NUM, HEAP_DATA); + starEffAnim = HuSprAnimRead(var_r30); + starParman = Hu3DParManCreate(starEffAnim, 0x64, &starEffParam); + Hu3DParManAttrSet(starParman, 0x64); + Hu3DParManRotSet(starParman, 90.0f, 0.0f, 0.0f); + temp_r3 = Hu3DParManModelIDGet(starParman); + Hu3DParticleBlendModeSet(temp_r3, 1); + Hu3DModelLayerSet(temp_r3, 2); + HuDataDirClose(0x120000); +} + +static void KillGiveStarEffect(void) { + if (starParman != -1) { + Hu3DParManKill(starParman); + starParman = -1; + starEffAnim = NULL; + } +} + +static inline void StarInlineFunc00(void) { + GiveStarWork *temp_r28 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork); + + temp_r28->unk01 = 0; +} + +static inline void StarInlineFunc01(void) { + GiveStarWork *temp_r27 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork); + + while (temp_r27->unk01 != 4) { + HuPrcVSleep(); + } +} + +static inline void StarInlineFunc02(void) { + GiveStarWork *temp_r29 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork); + + temp_r29->unk00_field1 = 1; + temp_r29->unk04 = 0x2D; + temp_r29->unk08 = 0; + temp_r29->unk01 = 2; +} + +void BoardStarGive(s32 arg0, Vec *arg1) { + Vec sp8; + s32 temp_r25; + GiveStarWork *temp_r31; + + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + return; + } + starCharPos = *arg1; + giveStarObj = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, GiveStarMain); + BoardCameraRotGet(&sp8); + temp_r31 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork); + temp_r31->unk00_field0 = 0; + temp_r31->unk00_field1 = 0; + temp_r31->unk00_field2 = 0; + temp_r31->unk00_field4 = 0; + temp_r31->unk01 = 4; + temp_r31->unk00_field3 = arg0; + temp_r31->unk06 = 0; + temp_r31->unk02 = 0; + temp_r31->unk08 = 0; + temp_r31->unk0C = BoardModelCreate(0x7000B, NULL, 0); + BoardModelVisibilitySet(temp_r31->unk0C, 0); + BoardModelPassSet(temp_r31->unk0C, 0); + BoardModelMotionSpeedSet(temp_r31->unk0C, 0.0f); + BoardModelLayerSet(temp_r31->unk0C, 2); + StarInlineFunc00(); + HuAudFXPlay(0x338); + HuAudFXPlay(0x353); + StarInlineFunc01(); + if (_CheckFlag(0x1000B)) { + BoardTutorialHookExec(0x15, 0); + } + BoardPlayerMotBlendSet(arg0, 0, 0xF); + while (!BoardPlayerMotBlendCheck(arg0)) { + HuPrcVSleep(); + } + StarInlineFunc02(); + StarInlineFunc01(); + BoardPlayerVoiceEnableSet(arg0, 7, 0); + BoardPlayerMotionShiftSet(arg0, 7, 0.0f, 8.0f, 0); + HuAudFXPlay(boardStarSndTbl[GWPlayer[arg0].character]); + BoardPlayerStarsAdd(arg0, 1); + HuAudFXPlay(8); + HuPrcSleep(0xA); + if (_CheckFlag(0x1000B)) { + BoardPlayerMotionEndWait(arg0); + } else { + temp_r25 = HuAudSStreamPlay(6); + BoardPlayerMotionEndWait(arg0); + while (msmStreamGetStatus(temp_r25) != 0) { + HuPrcVSleep(); + } + } + BoardPlayerVoiceEnableSet(arg0, 7, 1); +} + +void BoardStarShowNext(s32 arg0) { + Mtx spBC; + Mtx sp8C; + Mtx sp5C; + Vec sp50; + Vec sp44; + Vec sp38; + Vec sp2C; + Vec sp20; + float temp_f31; + WipeState *var_r26; + s32 var_r28; + s32 var_r30; + s16 var_r27; + s16 var_r29; + + var_r28 = 0; + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + return; + } + _SetFlag(0x1001C); + var_r26 = &wipeData; + if (var_r26->mode == 0) { + WipeColorSet(0, 0, 0); + WipeCreate(2, 0, 0x15); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + } else { + HuPrcSleep(0x12); + } + BoardStatusItemSet(0); + if (GWBoardGet() == 5 && BoardRollTypeGet() != 9 && boardStarGiveHook) { + boardStarGiveHook(); + } + BoardSpaceStarMove(); + if (arg0 == -1) { + var_r28 = 1; + arg0 = 0; + for (var_r29 = 0; var_r29 < 4; var_r29++) { + BoardPlayerCornerPosSet(var_r29); + } + BoardSpacePosGet(0, GWPlayer[arg0].space_curr, &sp38); + BoardPlayerPosSetV(arg0, &sp38); + } + if (!_CheckFlag(0x10017)) { + BoardAudSeqFadeOut(0, 1000); + } + showNextObj = omAddObjEx(boardObjMan, 0x7E03, 0, 0, -1, ShowNextUpdate); + BoardRotateDiceNumbers(arg0); + BoardModelMotionStart(BoardStarHostMdlGet(), 1, 0x40000001); + BoardModelPosGet(BoardStarHostMdlGet(), &sp50); + showNextObj->scale.x = sp50.x; + showNextObj->scale.y = sp50.y; + showNextObj->scale.z = sp50.z; + BoardPlayerPosGet(arg0, &sp38); + sp50.y = sp38.y; + PSVECSubtract(&sp50, &sp38, &sp20); + sp20.y = 0.0f; + temp_f31 = PSVECMag(&sp20); + if (temp_f31 > 3000.0f) { + var_r27 = 0xF0; + } else if (temp_f31 > 1500.0f) { + var_r27 = 0x78; + } else { + var_r27 = 0x78; + } + BoardViewMoveStart(&sp38, &sp50, var_r27); + showNextObj->trans.x = 68.0f; + showNextObj->trans.y = 430.0f; + showNextObj->trans.z = 100.0f; + sp44.x = showNextObj->trans.x; + sp44.y = showNextObj->trans.y; + sp44.z = showNextObj->trans.z; + Hu3D2Dto3D(&sp44, 1, &sp44); + BoardModelPosSetV(BoardStarHostMdlGet(), &sp44); + BoardCameraRotGet(&sp2C); + PSMTXRotRad(sp5C, 'y', 0.17453292f); + PSMTXRotRad(sp8C, 'x', 0.017453292f * sp2C.x); + PSMTXConcat(sp8C, sp5C, spBC); + BoardModelMtxSet(BoardStarHostMdlGet(), &spBC); + BoardModelRotSet(BoardStarHostMdlGet(), 0.0f, 0.0f, 0.0f); + BoardModelScaleSet(BoardStarHostMdlGet(), 0.09f, 0.09f, 0.09f); + BoardMusStart(1, 7, 0x7F, 0); + BoardCameraMoveSet(0); + BoardCameraMotionWait(); + BoardCameraMoveSet(1); + HuPrcSleep(1); + WipeCreate(1, 0, 0x15); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + if (var_r28 == 0) { + var_r30 = lbl_8011E040[GWBoardGet()] + 6; + } else { + var_r30 = lbl_8011E064[GWBoardGet()][0]; + } + BoardWinCreate(3, var_r30, -1); + BoardWinPause(); + BoardViewMoveEnd(); + while (!BoardViewMoveCheck()) { + HuPrcVSleep(); + } + HuPrcSleep(0x1E); + BoardWinKill(); + HuPrcSleep(3); + if (var_r28 == 0) { + var_r30 = lbl_8011E040[GWBoardGet()] + 7; + } else { + var_r30 = lbl_8011E064[GWBoardGet()][1]; + } + BoardWinCreate(3, var_r30, -1); + BoardWinWait(); + BoardWinKill(); + if (GWBoardGet() == 5 && BoardRollTypeGet() != 9 && boardStarShowNextHook) { + boardStarShowNextHook(); + } + BoardAudSeqFadeOut(1, 0x3E8); + WipeColorSet(0, 0, 0); + WipeCreate(2, 0, 0x15); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + BoardViewWait(); + PSMTXIdentity(spBC); + BoardModelMtxSet(BoardStarHostMdlGet(), &spBC); + HideNextHost(1); + while (showNextObj) { + HuPrcVSleep(); + } + BoardCameraMoveSet(0); + BoardCameraTargetPlayerSet(arg0); + BoardCameraMotionWait(); + BoardCameraMoveSet(1); + BoardStatusItemSet(1); + WipeCreate(1, 0, 0x15); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + if (!_CheckFlag(0x10017)) { + BoardMusStartBoard(); + } + _ClearFlag(0x1001C); +} + +static void ShowNextUpdate(omObjData *arg0) { + ShowNextWork *temp_r30 = OM_GET_WORK_PTR(arg0, ShowNextWork); + Vec sp8; + + if (temp_r30->unk00_field0 != 0 || BoardIsKill()) { + showNextObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + switch (temp_r30->unk01) { + case 0: + sp8.x = arg0->trans.x; + sp8.y = arg0->trans.y; + sp8.z = arg0->trans.z; + Hu3D2Dto3D(&sp8, 1, &sp8); + break; + case 1: + sp8.x = arg0->scale.x; + sp8.y = arg0->scale.y; + sp8.z = arg0->scale.z; + BoardModelLayerSet(BoardStarHostMdlGet(), 0); + BoardModelRotSet(BoardStarHostMdlGet(), 0.0f, 0.0f, 0.0f); + BoardModelScaleSet(BoardStarHostMdlGet(), 1.0f, 1.0f, 1.0f); + temp_r30->unk00_field0 = 1; + break; + } + BoardModelPosSetV(BoardStarHostMdlGet(), &sp8); +} + +static void HideNextHost(s32 arg0) { + ShowNextWork *temp_r31 = OM_GET_WORK_PTR(showNextObj, ShowNextWork); + + temp_r31->unk01 = arg0; +} diff --git a/src/game/board/tutorial.c b/src/game/board/tutorial.c new file mode 100755 index 00000000..5bdca944 --- /dev/null +++ b/src/game/board/tutorial.c @@ -0,0 +1,138 @@ +#include "game/board/tutorial.h" +#include "game/flag.h" +#include "game/gamework_data.h" +#include "game/process.h" +#include "game/board/main.h" +#include "game/board/model.h" + +s32 boardTutorialData[4]; // maybe a single s32 + padding? +static void (*tutorialHook)(s16, s32); +s8 boardTutorialDirInputX; +s8 boardTutorialDirInputY; +s16 boardTutorialDirInputTime; +s32 boardTutorialBlockPos; +s8 boardTutorialBlockItem; +s8 boardTutorialBlockF; +s8 boardTutorialUseItem; +static s16 hostMdl; +s8 boardTutorialF; +static Process *tutorialProcess; +static void *playerCfgCopy; +static void *playerCopy; +static void *systemCopy; +static void *gameStatCopy; + +static void TutorialProcFunc(void) { + while (1) { + if (_CheckFlag(0x10010)) { + BoardTutorialHookExec(0x1E, 0); + } + HuPrcVSleep(); + } +} + +void BoardTutorialInit(void) { + boardTutorialDirInputTime = -1; + boardTutorialBlockF = 0; + boardTutorialUseItem = -1; + tutorialHook = NULL; + tutorialProcess = NULL; + boardTutorialF = 0; + if (_CheckFlag(0x1000B)) { + tutorialProcess = HuPrcChildCreate(TutorialProcFunc, 0x2002, 0x2000, 0, boardMainProc); + } +} + +void BoardTutorialKill(void) { + if (_CheckFlag(0x1000B)) { + if (tutorialProcess) { + HuPrcKill(tutorialProcess); + } + boardTutorialF = 0; + } +} + +void BoardTutorialHookSet(void *arg0) { + tutorialHook = arg0; +} + +void BoardTutorialHookExec(s16 arg0, s32 arg1) { + if (tutorialHook) { + tutorialHook(arg0, arg1); + } +} + +void BoardTutorialPlayerInit(void) { + s32 i; + + for (i = 0; i < 4; i++) { + GWPlayer[i].com = 1; + GWPlayerCfg[i].iscom = 1; + } + GWSystem.board = 6; +} + +void BoardTutorialWorkSave(void) { + OSReport("-O-O-O-O-O-O-O Tutorial Save Work\n"); + if (gameStatCopy) { + HuMemDirectFree(gameStatCopy); + } + if (systemCopy) { + HuMemDirectFree(systemCopy); + } + if (playerCopy) { + HuMemDirectFree(playerCopy); + } + if (playerCfgCopy) { + HuMemDirectFree(playerCfgCopy); + } + gameStatCopy = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(GWGameStat)); + systemCopy = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(GWSystem)); + playerCopy = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(GWPlayer)); + playerCfgCopy = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(GWPlayerCfg)); + memcpy(gameStatCopy, &GWGameStat, sizeof(GWGameStat)); + memcpy(systemCopy, &GWSystem, sizeof(GWSystem)); + memcpy(playerCopy, GWPlayer, sizeof(GWPlayer)); + memcpy(playerCfgCopy, GWPlayerCfg, sizeof(GWPlayerCfg)); +} + +void BoardTutorialWorkRestore(void) { + OSReport("-O-O-O-O-O-O-O Tutorial Load Work\n"); + memcpy(&GWGameStat, gameStatCopy, sizeof(GWGameStat)); + memcpy(&GWSystem, systemCopy, sizeof(GWSystem)); + memcpy(GWPlayer, playerCopy, sizeof(GWPlayer)); + memcpy(GWPlayerCfg, playerCfgCopy, sizeof(GWPlayerCfg)); + HuMemDirectFree(gameStatCopy); + HuMemDirectFree(systemCopy); + HuMemDirectFree(playerCopy); + HuMemDirectFree(playerCfgCopy); + gameStatCopy = NULL; + systemCopy = NULL; + playerCopy = NULL; + playerCfgCopy = NULL; +} + +void BoardTutorialDirInputSet(s8 arg0, s8 arg1, s16 arg2) { + boardTutorialDirInputX = arg0; + boardTutorialDirInputY = arg1; + boardTutorialDirInputTime = arg2; +} + +void BoardTutorialBlockSetPos(s32 arg0, s8 arg1) { + boardTutorialBlockF = 1; + boardTutorialBlockPos = arg0; + boardTutorialBlockItem = arg1; + BoardSpaceBlockPosSet(); +} + +void BoardTutorialItemSet(s8 arg0) { + boardTutorialUseItem = arg0; +} + +void BoardTutorialHostSet(s16 arg0) { + hostMdl = arg0; +} + +void BoardTutorialHostHide(s8 arg0) { + BoardModelVisibilitySet(hostMdl, arg0); +} diff --git a/src/game/board/ui.c b/src/game/board/ui.c index bb7d2ded..1087afd6 100755 --- a/src/game/board/ui.c +++ b/src/game/board/ui.c @@ -1,5 +1,6 @@ #include "game/board/ui.h" #include "game/audio.h" +#include "game/chrman.h" #include "game/data.h" #include "game/gamework.h" #include "game/gamework_data.h" @@ -9,13 +10,17 @@ #include "game/pad.h" #include "game/process.h" #include "game/window.h" +#include "game/board/com.h" +#include "game/board/item.h" #include "game/board/main.h" +#include "game/board/model.h" #include "game/board/player.h" +#include "game/board/tutorial.h" #include "board_unsplit.h" #include "math.h" -#define ABS(x) ((x < 0) ? -x : x) +#define ABS(x) (((x) < 0) ? -(x) : (x)) typedef struct { /* 0x00 */ struct { @@ -91,20 +96,8 @@ typedef struct { } UnkUiWork04; void BoardPlayerSparkSet(s32); -s32 BoardItemDoneCheck(void); -void BoardItemStart(s32, s32); -void BoardTutorialHookExec(s16, s32); -s16 BoardBowserSuitModelGet(void); void BoardBowserSuitMotionCreate(void); s16 BoardBowserSuitPlayerModelGet(void); -void CharModelLayerSetAll(s32); -void BoardItemBagItemSet(void*); -float BoardModelMotionTimeGet(s16); -void BoardModelMotionStartEndSet(s16, s16, s16); -void BoardModelMotionTimeSet(s16, float); -void BoardModelPosGet(s16, Vec*); -s32 BoardComTutorialItemGet(s32); -void BoardTutorialHostHide(s32); static void KillAllBoardStatus(void); static void CreateBoardStatusSprite(s32 arg0, UnkUiStatusStruct *arg1); @@ -1201,7 +1194,7 @@ void BoardMakeRandomItem(void) { itemRandTbl[i] = temp_r3; } } - BoardItemBagItemSet(&itemRandTbl); + BoardItemBagItemSet(itemRandTbl); } static inline void TeamItemPosSetInlineFunc01(s32 arg0, s32 arg1, Vec *arg2) { diff --git a/src/game/board/view.c b/src/game/board/view.c new file mode 100755 index 00000000..46dc6f6d --- /dev/null +++ b/src/game/board/view.c @@ -0,0 +1,593 @@ +#include "game/board/view.h" +#include "game/audio.h" +#include "game/gamework.h" +#include "game/gamework_data.h" +#include "game/hsfex.h" +#include "game/object.h" +#include "game/pad.h" +#include "game/wipe.h" +#include "game/board/main.h" +#include "game/board/model.h" +#include "game/board/player.h" +#include "game/board/space.h" +#include "game/board/ui.h" + +typedef struct { + struct { + u8 unk00_field0 : 1; + }; + u8 unk01; + s16 unk02; + s16 unk04; +} OverheadWork; + +static void ExecMapView(void); +static void ExecStarView(void); +static void ExecOverheadView(void); +static void DestroyView(void); +static void SetTargetView(void); +static void DestroyFocus(void); +static void CreateButtonWin(void); +static void DestroyButtonWin(void); +static void InitOverheadView(void); +static void DestroyOverheadView(void); +static void UpdateOverheadView(omObjData *arg0); +static void WaitOverheadView(void); + +static Vec focusPos; +static Vec focusPosTarget; + +static s8 viewControls; +static s8 viewPlayer; +static s8 viewMoveF; +static s8 focusDestroyF; +static u16 focusTimer; +static omObjData *overheadObj; +static s8 pauseDisableF; +static Process *viewProc; + +static s16 buttonWin = -1; +static s16 focusMdl = -1; + +static float overhead2DPos[][2] = { + { 48.0f, 72.0f }, + { 528.0f, 72.0f }, + { 48.0f, 408.0f }, + { 528.0f, 408.0f }, + { 288.0f, 72.0f } +}; + +static float mapViewMinZ[] = { + -2000.0f, -1500.0f, -2200.0f, + -1800.0f, -2100.0f, -3000.0f, + -3000.0f, -1800.0f, -1800.0f +}; + +static float mapViewMaxZ[] = { + 2300.0f, 2500.0f, 2600.0f, + 2000.0f, 2300.0f, 2500.0f, + 2500.0f, 2000.0f, 2000.0f +}; + +static float mapViewMinX[] = { + -3000.0f, -3000.0f, -3000.0f, + -3000.0f, -3000.0f, -3000.0f, + -3000.0f, -2000.0f, -2000.0f +}; + +static float mapViewMaxX[] = { + 3000.0f, 3000.0f, 3000.0f, + 3000.0f, 3000.0f, 3000.0f, + 3000.0f, 1600.0f, 2000.0f +}; + +static float overheadCamZoom[] = { + 14370.0f, 14500.0f, 15000.0f, + 15000.0f, 13000.0f, 15000.0f, + 100.0f, 10000.0f, 10000.0f +}; + +static float overheadCamPosZ[] = { + 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, + 0.0f, -160.0f, 0.0f +}; + +void BoardViewOverheadExec(s32 arg0) { + if (BoardPauseDisableGet() == 0) { + BoardPauseDisableSet(1); + pauseDisableF = 1; + } else { + pauseDisableF = 0; + } + _SetFlag(0x1001C); + WipeColorSet(0xFF, 0xFF, 0xFF); + WipeCreate(2, 1, 1); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + viewProc = HuPrcChildCreate(ExecOverheadView, 0x200A, 0x3800, 0, boardMainProc); + HuPrcDestructorSet2(viewProc, DestroyView); + viewControls = 2; + viewPlayer = arg0; + focusTimer = 1; + viewMoveF = 0; + BoardPlayerPosGet(arg0, &focusPos); + BoardStatusItemSet(0); + while (viewProc != NULL) { + HuPrcVSleep(); + } + BoardStatusItemSet(1); + HuPrcSleep(3); + WaitOverheadView(); + _ClearFlag(0x1001C); +} + +void BoardViewFocusGetPos(Vec *arg0) { + if (arg0) { + BoardModelPosGet(focusMdl, arg0); + } +} + +static inline void BoardViewInlineFunc00(Vec *arg0, Vec *arg1, u16 arg2) { + if (arg2 == 0) { + arg2 = 1; + } + viewControls = 1; + viewPlayer = -1; + focusTimer = arg2; + viewMoveF = 1; + if (arg0) { + focusPos = *arg0; + } + if (arg1) { + focusPosTarget = *arg1; + } +} + +void BoardViewFocusSet(Vec *arg0, u16 arg1) { + u16 var_r31; + + if (BoardPauseDisableGet() == 0) { + BoardPauseDisableSet(1); + pauseDisableF = 1; + } else { + pauseDisableF = 0; + } + focusDestroyF = 1; + BoardViewInlineFunc00(NULL, arg0, arg1); + HuPrcSleep(2); +} + +void BoardViewMoveStart(Vec *arg0, Vec *arg1, u16 arg2) { + u16 var_r31; + + if (BoardPauseDisableGet() == 0) { + BoardPauseDisableSet(1); + pauseDisableF = 1; + } else { + pauseDisableF = 0; + } + viewProc = HuPrcChildCreate(ExecStarView, 0x200A, 0x3800, 0, boardMainProc); + HuPrcDestructorSet2(viewProc, DestroyView); + focusDestroyF = 0; + BoardViewInlineFunc00(arg0, arg1, arg2); + HuPrcSleep(2); +} + +BOOL BoardViewMoveCheck(void) { + return (viewMoveF != 0) ? TRUE : FALSE; +} + +void BoardViewMoveEnd(void) { + viewMoveF = 0; +} + +void BoardViewWait(void) { + viewMoveF = 0; + while (viewProc != NULL) { + HuPrcVSleep(); + } +} + +void BoardViewMapExec(s32 arg0) { + if (BoardPauseDisableGet() == 0) { + BoardPauseDisableSet(1); + pauseDisableF = 1; + } else { + pauseDisableF = 0; + } + viewProc = HuPrcChildCreate(ExecMapView, 0x200A, 0x3800, 0, boardMainProc); + HuPrcDestructorSet2(viewProc, DestroyView); + viewControls = 0; + viewPlayer = arg0; + focusTimer = 1; + viewMoveF = 0; + BoardPlayerPosGet(arg0, &focusPos); + while (viewProc != NULL) { + HuPrcVSleep(); + } +} + +static void ExecMapView(void) { + Vec spC; + float var_f29; + float temp_f28; + float temp_f27; + float temp_f26; + float temp_f25; + float temp_f24; + u32 var_r28; + s8 sp9; + s8 sp8; + + SetTargetView(); + CreateButtonWin(); + temp_f25 = mapViewMaxZ[GWBoardGet()]; + temp_f24 = mapViewMinZ[GWBoardGet()]; + temp_f27 = mapViewMaxX[GWBoardGet()]; + temp_f26 = mapViewMinX[GWBoardGet()]; + while (1) { + var_r28 = HuPadBtnDown[GWPlayer[viewPlayer].port]; + if (var_r28 == 0x200) { + HuAudFXPlay(3); + break; + } + if (HuPadBtn[GWPlayer[viewPlayer].port] & 0x100) { + var_f29 = 40.0f; + } else { + var_f29 = 20.0f; + } + spC.x = spC.y = spC.z = 0.0f; + sp9 = HuPadStkX[GWPlayer[viewPlayer].port]; + sp8 = HuPadStkY[GWPlayer[viewPlayer].port]; + if (sp9 != 0 || sp8 != 0) { + OSs8tof32(&sp9, &spC.x); + OSs8tof32(&sp8, &spC.z); + temp_f28 = 180.0 * (atan2(spC.x, -spC.z) / M_PI); + spC.x = var_f29 * sin(temp_f28 * M_PI / 180.0); + spC.z = var_f29 * cos(temp_f28 * M_PI / 180.0); + } + PSVECAdd(&spC, &focusPos, &focusPos); + if (focusPos.x < temp_f26) { + focusPos.x = temp_f26; + } + if (focusPos.x > temp_f27) { + focusPos.x = temp_f27; + } + if (focusPos.z < temp_f24) { + focusPos.z = temp_f24; + } + if (focusPos.z > temp_f25) { + focusPos.z = temp_f25; + } + BoardModelPosSetV(focusMdl, &focusPos); + HuPrcVSleep(); + } + DestroyFocus(); + DestroyButtonWin(); + HuPrcEnd(); +} + +static void ExecStarView(void) { + Vec sp8; + float temp_f30; + + SetTargetView(); + do { + OSu16tof32(&focusTimer, &temp_f30); + PSVECSubtract(&focusPosTarget, &focusPos, &sp8); + sp8.x /= temp_f30; + sp8.y /= temp_f30; + sp8.z /= temp_f30; + viewMoveF = 1; + while (viewMoveF != 0) { + HuPrcVSleep(); + } + focusDestroyF = 0; + while (focusTimer != 0) { + PSVECAdd(&sp8, &focusPos, &focusPos); + BoardModelPosSetV(focusMdl, &focusPos); + HuPrcVSleep(); + focusTimer--; + } + BoardModelPosSetV(focusMdl, &focusPosTarget); + BoardCameraMotionWait(); + viewMoveF = 1; + while (viewMoveF != 0 && focusDestroyF == 0) { + HuPrcVSleep(); + } + } while (focusDestroyF != 0); + DestroyFocus(); + HuPrcEnd(); +} + +static void ExecOverheadView(void) { + u32 var_r31; + + if ((GWBoardGet() == 2 || GWBoardGet() == 5) && boardLightResetHook) { + boardLightResetHook(); + } + InitOverheadView(); + CreateButtonWin(); + HuPrcVSleep(); + SetTargetView(); + WipeColorSet(0xFF, 0xFF, 0xFF); + WipeCreate(1, 1, 0xA); + while (WipeStatGet() != 0) { + HuPrcVSleep(); + } + while (1) { + var_r31 = HuPadBtnDown[GWPlayer[viewPlayer].port]; + if (var_r31 == 0x200) { + HuAudFXPlay(3); + break; + } + HuPrcVSleep(); + } + if ((GWBoardGet() == 2 || GWBoardGet() == 5) && boardLightSetHook) { + boardLightSetHook(); + } + DestroyButtonWin(); + DestroyFocus(); + HuPrcEnd(); +} + +static void DestroyView(void) { + if (focusMdl != -1) { + BoardModelKill(focusMdl); + focusMdl = -1; + } + DestroyOverheadView(); + DestroyButtonWin(); + viewMoveF = 0; + focusTimer = 0; + viewPlayer = -1; + if (pauseDisableF != 0) { + BoardPauseDisableSet(0); + pauseDisableF = 0; + } + viewProc = NULL; +} + +static void SetTargetView(void) { + Vec sp14; + Vec sp8; + + BoardCameraBackup(); + focusMdl = BoardModelCreate(0x7000A, 0, 0); + BoardModelVisibilitySet(focusMdl, 0); + BoardModelPosSetV(focusMdl, &focusPos); + BoardCameraNearFarSet(10.0f, 30000.0f); + if (viewControls != 2) { + sp8.x = -45.0f; + sp8.y = 0.0f; + sp8.z = 0.0f; + BoardCameraMotionStartEx(focusMdl, &sp8, NULL, 3000.0f, -1.0f, 0x15); + BoardCameraMotionWait(); + } else { + BoardModelPosSet(focusMdl, 0.0f, 0.0f, 0.0f); + sp14.x = 0.0f; + sp14.y = 0.0f; + sp14.z = 0.0f; + sp8.x = -78.0f; + sp8.y = 0.0f; + sp8.z = 0.0f; + sp14.z = overheadCamPosZ[GWBoardGet()]; + BoardCameraMoveSet(0); + BoardCameraMotionStartEx(focusMdl, &sp8, &sp14, overheadCamZoom[GWBoardGet()], -1.0f, 1); + BoardCameraMotionWait(); + BoardCameraMoveSet(1); + } +} + +static void DestroyFocus(void) { + if (focusMdl != -1) { + BoardModelKill(focusMdl); + focusMdl = -1; + } + BoardCameraMoveSet(0); + BoardCameraRestore(); + BoardCameraMoveSet(1); +} + +static void CreateButtonWin(void) { + float sp8[2]; + float var_f31; + float var_f30; + s32 var_r31; + + if (viewControls != 2) { + var_r31 = 0x90005; + var_f31 = 286.0f; + } else { + var_r31 = 0x10004D; + var_f31 = 328.0f; + } + HuWinMesMaxSizeGet(1, sp8, var_r31); + var_f30 = -10000.0f; + buttonWin = HuWinCreate(var_f30, var_f31, sp8[0], sp8[1], 0); + HuWinBGTPLvlSet(buttonWin, 0.0f); + HuWinMesSpeedSet(buttonWin, 0); + HuWinMesSet(buttonWin, var_r31); +} + +static void DestroyButtonWin(void) { + if (buttonWin != -1) { + HuWinKill(buttonWin); + buttonWin = -1; + } +} + +static void InitOverheadView(void) { + Vec sp10; + GXColor spA; + s16 sp8; + omObjData *temp_r26; + OverheadWork *temp_r31; + float *temp_r30; + s32 i; + s32 sp1C[8] = { + 0x0007002E, + 0x0007002F, + 0x00070030, + 0x00070031, + 0x00070032, + 0x00070033, + 0x00070034, + 0x00070035 + }; + + temp_r26 = omAddObjEx(boardObjMan, 0x1000, 0, 0, -1, UpdateOverheadView); + overheadObj = temp_r26; + temp_r31 = OM_GET_WORK_PTR(temp_r26, OverheadWork); + temp_r31->unk00_field0 = 0; + temp_r31->unk01 = 1; + temp_r31->unk02 = HuSprGrpCreate(9); + for (i = 0; i < 4; i++) { + temp_r30 = overhead2DPos[i]; + BoardSpriteCreate(sp1C[GWPlayer[i].character], 0x1388, 0, &sp8); + HuSprGrpMemberSet(temp_r31->unk02, i, sp8); + HuSprAttrSet(temp_r31->unk02, i, 1); + HuSprAttrSet(temp_r31->unk02, i, 8); + HuSprPosSet(temp_r31->unk02, i, temp_r30[0], temp_r30[1]); + if (GWPlayer[i].character == 7) { + spA.r = 0x50; + spA.g = 0x50; + spA.b = 0x50; + } else { + GWCharColorGet(GWPlayer[i].character, &spA); + } + BoardSpriteCreate(0x7006C, 0x1770, 0, &sp8); + HuSprGrpMemberSet(temp_r31->unk02, i + 4, sp8); + HuSprPosSet(temp_r31->unk02, i + 4, temp_r30[0], temp_r30[1]); + HuSprColorSet(temp_r31->unk02, i + 4, spA.r, spA.g, spA.b); + } + temp_r30 = overhead2DPos[4]; + temp_r31->unk04 = BoardModelCreate(0x70008, NULL, 0); + BoardModelMotionSpeedSet(temp_r31->unk04, 0.0f); + BoardModelLayerSet(temp_r31->unk04, 6); + BoardModelScaleSet(temp_r31->unk04, 0.4f, 0.4f, 0.4f); + BoardModelPassSet(temp_r31->unk04, 1); + sp10.x = temp_r30[0]; + sp10.y = temp_r30[1]; + sp10.z = 1000.0f; + spA.r = 0xF8; + spA.g = 0xF0; + spA.b = 0x80; + BoardSpriteCreate(0x7006C, 0x1770, 0, &sp8); + HuSprGrpMemberSet(temp_r31->unk02, 8, sp8); + HuSprPosSet(temp_r31->unk02, 8, temp_r30[0], temp_r30[1]); + HuSprColorSet(temp_r31->unk02, 8, spA.r, spA.g, spA.b); + Hu3D2Dto3D(&sp10, 1, &sp10); + BoardModelPosSetV(temp_r31->unk04, &sp10); + HuSprGrpDrawNoSet(temp_r31->unk02, 0x40); + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + BoardModelVisibilitySet(temp_r31->unk04, 0); + HuSprTPLvlSet(temp_r31->unk02, 8, 0.0f); + } +} + +static void DestroyOverheadView(void) { + if (overheadObj) { + OM_GET_WORK_PTR(overheadObj, OverheadWork)->unk00_field0 = 1; + } +} + +static void UpdateOverheadView(omObjData *arg0) { + Vec sp20; + Vec sp14; + Vec sp8; + float temp_f31; + float temp_f30; + float *var_r29; + s32 var_r28; + s32 var_r27; + s32 i; + u32 var_r26; + OverheadWork *temp_r31; + Mtx sp5C; + Mtx sp2C; + + temp_r31 = OM_GET_WORK_PTR(arg0, OverheadWork); + if (temp_r31->unk00_field0 != 0 || BoardIsKill()) { + if (temp_r31->unk02 != -1) { + HuSprGrpKill(temp_r31->unk02); + } + if (temp_r31->unk04 != -1) { + BoardModelKill(temp_r31->unk04); + } + overheadObj = NULL; + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + var_r26 = HuPadBtnDown[GWPlayer[viewPlayer].port]; + if (var_r26 == 0x20) { + temp_r31->unk01 ^= 1; + HuAudFXPlay(0x1C); + } + if (GWBoardGet() == 7 || GWBoardGet() == 8) { + var_r27 = 1; + } else { + var_r27 = 0; + } + for (i = 0; i < 5; i++) { + var_r29 = overhead2DPos[i]; + sp20.x = var_r29[0] - 288.0f; + sp20.y = var_r29[1] - 240.0f; + sp20.z = 1000.0f; + if (i != 4) { + BoardSpacePosGet(0, GWPlayer[i].space_curr, &sp14); + } else if (var_r27 != 0) { + sp14.x = sp14.y = sp14.z = 0.0f; + } else { + BoardSpacePosGet(0, BoardSpaceStarGetCurr(), &sp14); + } + Hu3D3Dto2D(&sp14, 1, &sp14); + sp14.x -= 288.0f; + sp14.y -= 240.0f; + PSVECSubtract(&sp20, &sp14, &sp8); + sp8.z = 0.0f; + temp_f30 = BoardDAngleCalc(180.0 * (atan2(sp8.y, sp8.x) / M_PI) - 90.0); + temp_f31 = PSVECMag(&sp8) / 32; + if (i != 4) { + var_r28 = i + 4; + } else { + var_r28 = 8; + } + HuSprZRotSet(temp_r31->unk02, var_r28, temp_f30); + HuSprScaleSet(temp_r31->unk02, var_r28, 0.5f, temp_f31); + HuSprPosSet(temp_r31->unk02, var_r28, var_r29[0], var_r29[1]); + if (i == 4 && (GWBoardGet() == 7 || GWBoardGet() == 8)) { + BoardModelVisibilitySet(temp_r31->unk04, 0); + } else if (temp_r31->unk01 != 0) { + if (i != 4) { + HuSprAttrReset(temp_r31->unk02, i, 4); + } + HuSprAttrReset(temp_r31->unk02, var_r28, 4); + BoardModelVisibilitySet(temp_r31->unk04, 1); + } else { + if (i != 4) { + HuSprAttrSet(temp_r31->unk02, i, 4); + } + HuSprAttrSet(temp_r31->unk02, var_r28, 4); + BoardModelVisibilitySet(temp_r31->unk04, 0); + } + } + sp20.x = var_r29[0]; + sp20.y = var_r29[1]; + sp20.z = 1000.0f; + BoardCameraRotGet(&sp8); + PSMTXRotRad(sp5C, 0x78, sp8.x * 0.017453292f); + PSMTXRotRad(sp2C, 0x79, sp8.y * 0.017453292f); + PSMTXConcat(sp2C, sp5C, sp2C); + BoardModelMtxSet(temp_r31->unk04, &sp2C); + Hu3D2Dto3D(&sp20, 1, &sp20); + BoardModelPosSetV(temp_r31->unk04, &sp20); +} + +static void WaitOverheadView(void) { + while (overheadObj) { + HuPrcVSleep(); + } +} diff --git a/src/game/board/warp.c b/src/game/board/warp.c index 0aaec5ef..e623e207 100644 --- a/src/game/board/warp.c +++ b/src/game/board/warp.c @@ -1,9 +1,12 @@ #include "game/board/warp.h" #include "game/board/main.h" #include "game/board/player.h" +#include "game/board/tutorial.h" #include "game/wipe.h" #include "game/gamework_data.h" +#include "game/hsfdraw.h" #include "game/hsfex.h" +#include "game/objsub.h" #include "board_unsplit.h" #include "math.h" @@ -14,7 +17,6 @@ static void WarpFall(s32); static void WarpImpact(s32); -extern void omVibrate(s16, s16, s16, s16); extern void BoardCharWheelInit(s32, s32); extern void BoardCharWheelSpeedSet(f32); extern void BoardCharWheelWait(void); @@ -22,13 +24,8 @@ extern s32 BoardCharWheelResultGet(void); extern f32 BoardModelMotionTimeGet(s16); extern void BoardModelHookReset(s16); extern s32 BoardModelHookSet(s16, char*, s16); -extern void BoardPlayerPosSet(s32, f32, f32, f32); -extern void BoardPlayerRotYSet(s32, f32); -extern void Hu3DModelObjPosGet(s16, char*, Vec*); extern s32 BoardModelMotionEndCheck(s16); -extern s32 boardTutorialData[4]; - static Vec warpPos; static s8 warpState; @@ -139,7 +136,7 @@ static void WarpInit(s32 player) { Vec pos; s16 player_mdl = BoardPlayerModelGet(player); - warpSpringMdl = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BOARD, 1), NULL, 0); + warpSpringMdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 1), NULL, 0); BoardSpacePosGet(0, GWPlayer[player].space_curr, &pos); warpYFloor = 1500.0f + pos.y; BoardModelLayerSet(warpSpringMdl, 2); @@ -187,7 +184,7 @@ static void WarpStartImpact(s32 player) { warpImpactCnt++; } } - warpImpactMdl = BoardModelCreate(MAKE_DATA_NUM(DATADIR_BOARD, 2), NULL, 0); + warpImpactMdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 2), NULL, 0); BoardModelVisibilitySet(warpImpactMdl, 0); BoardModelMotionSpeedSet(warpImpactMdl, 0.0f); BoardCameraMoveSet(0); diff --git a/src/game/chrman.c b/src/game/chrman.c new file mode 100755 index 00000000..ba9bd32e --- /dev/null +++ b/src/game/chrman.c @@ -0,0 +1,2080 @@ +#include "game/chrman.h" +#include "game/armem.h" +#include "game/audio.h" +#include "game/data.h" +#include "game/hsfanim.h" +#include "game/hsfdraw.h" +#include "game/hsfex.h" +#include "game/hsfman.h" +#include "game/hsfmotion.h" +#include "game/object.h" +#include "game/process.h" + +#include "math.h" + +typedef struct { + /* 0x00 */ s16 unk00; + /* 0x02 */ s16 unk02; + /* 0x04 */ s16 unk04; + /* 0x06 */ s16 unk06; + /* 0x08 */ s16 unk08; + /* 0x0A */ s16 unk0A; + /* 0x0C */ s16 unk0C[32]; + /* 0x4C */ s16 unk4C[32]; + /* 0x8C */ u8 unk8C[32]; + /* 0xAC */ u32 unkAC; + /* 0xB0 */ s8 unkB0; + /* 0xB1 */ char unkB1[3]; + /* 0xB4 */ Vec unkB4; + /* 0xC0 */ void *unkC0; + /* 0xC4 */ Process *unkC4; +} UnkCharInstanceStruct; // Size 0xC8 + +typedef struct { + /* 0x00 */ s32 unk00; + /* 0x04 */ s16 unk04; + /* 0x06 */ s16 unk06; + /* 0x08 */ s32 unk08; +} EffectData; // Size 0xC + +typedef struct { + /* 0x00 */ u32 unk00; + /* 0x04 */ u8 unk04; + /* 0x05 */ u8 unk05; + /* 0x06 */ u8 unk06; + /* 0x07 */ u8 unk07; + /* 0x08 */ u8 unk08; + /* 0x09 */ u8 unk09; + /* 0x0A */ u8 unk0A; + /* 0x0B */ char unk0B[1]; + /* 0x0C */ Vec unk0C; + /* 0x18 */ float unk18; + /* 0x1C */ float unk1C; + /* 0x20 */ float unk20; + /* 0x24 */ float unk24; + /* 0x28 */ s32 unk28; // unknown type + /* 0x2C */ float unk2C; + /* 0x30 */ float unk30; + /* 0x34 */ float unk34; +} EffectParamData; // Size 0x38 + +typedef struct { + u16 unk00; + s16 unk02; +} UnkProcessData; // Size 4 + +static void UpdateChar(void); +static void UpdateCharAnim(s16 character, s16 arg1, s16 arg2, u8 arg3, s16 arg4, Vec *arg5); +static s32 PlayCharVoice(s16 character, s16 arg1, u8 arg2); +static void InitEffect(void); +static s16 CreateEffectDust(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5); +static s16 CreateEffectSmoke(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5); +static s16 CreateEffectDot(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5); +static s16 CreateEffectStar(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5); +static s16 CreateEffectWarn(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5); +static s16 CreateEffectBird(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5); +static s16 CreateEffect(s16 arg0, s16 arg1, float arg2, float arg3, float arg4, float arg5, EffectParamData *arg6); +static void UpdateEffect(s32 arg0, ParticleData *arg1); +static void RotateEffect(HsfanimStruct01 *arg0); +static void PlayEffectSound(HsfanimStruct01 *arg0); +static void UpdateItemHook(void); +static void OrbitEffect(HsfanimStruct01 *arg0); +static void UpdateNpcEffect(void); +static s32 PlayStepFX(s16 arg0, s16 arg1, u8 arg2); + +static UnkCharInstanceStruct charInstance[8]; +static s16 effectMdl[8]; +static EffectParamData *particleData[8]; +static Process *itemHookProcess[32]; +static u16 lbl_801975B0[8]; +static u8 lbl_801975C0[0x90]; // Unused? + +static s32 skipAnimUpdate; +static void *effectAMemP; + +static u8 lbl_801D35F0[8] = { 0x0C, 0x00, 0x17, 0x75, 0x1E, 0x1E, 0x1D, 0x18 }; +static u8 lbl_801D35F8[8] = { 0x0D, 0x00, 0x17, 0x54, 0x1E, 0x00, 0x00, 0x23 }; +static u8 lbl_801D3600[8] = { 0x0A, 0x00, 0x19, 0x63, 0x26, 0x00, 0x10, 0x0F }; +static u8 lbl_801D3608[8] = { 0x0D, 0x00, 0x17, 0x69, 0x0D, 0x1E, 0x1D, 0x14 }; +static u8 lbl_801D3610[8] = { 0x15, 0x1E, 0x16, 0x54, 0x0F, 0x62, 0x39, 0x0A }; + +static EffectData effectDataTbl[8] = { + { 0x00120006, 0x000A, 0x0000, 0x00000002 }, + { 0x00120005, 0x000A, 0x0000, 0x00000002 }, + { 0x00120002, 0x0096, 0x0001, 0x00000000 }, + { 0x00120003, 0x0046, 0x0000, 0x00000000 }, + { 0x00120000, 0x012C, 0x0001, 0x00000000 }, + { 0x00120001, 0x012C, 0x0001, 0x00000000 }, + { 0x00120004, 0x00C8, 0x0001, 0x00000000 }, + { 0x00120007, 0x000C, 0x0000, 0x00000002 } +}; + +static s32 charDirTbl[8][3] = { + { 0x005D0000, 0x005E0000, 0x005F0000 }, + { 0x00180000, 0x00190000, 0x001A0000 }, + { 0x006B0000, 0x006C0000, 0x006D0000 }, + { 0x00880000, 0x00890000, 0x008A0000 }, + { 0x00830000, 0x00840000, 0x00850000 }, + { 0x000F0000, 0x00100000, 0x00110000 }, + { 0x000B0000, 0x000C0000, 0x000D0000 }, + { 0x007F0000, 0x00800000, 0x00810000 } +}; + +static EffectParamData effectDustParam = { + 0, + 0x80, 0x80, 0x80, 0xFF, + 0x40, 0x20, 0x00, 0xFF, + { 0.0f, 2.0f, 1.0f }, + 0.95f, 0.95f, 0.95f, + 0.0f, + 0x00000000, + 1.0f, + -5.0f, + 0.02f +}; + +static EffectParamData effectDotParam = { + 0, + 0xFF, 0x40, 0x40, 0x80, + 0xFF, 0x40, 0x40, 0x80, + { 0.0f, 0.0f, 0.0f }, + 0.0f, 0.0f, 0.0f, + 0.0f, + 0x00000000, + -5.0f, + 0.0f, + 0.0f +}; + +static EffectParamData effectStarParam = { + 0, + 0xFF, 0xFF, 0x00, 0xFF, + 0xFF, 0xFF, 0x00, 0xFF, + { 0.0f, 0.0f, 0.0f }, + 0.95f, 0.95f, 0.95f, + 0.0f, + 0x00000000, + -0.5f, + -10.0f, + 0.0f +}; + +static EffectParamData effectWarnParam = { + 0, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + { 0.0f, 20.0f, 0.0f }, + 0.95f, 0.85f, 0.95f, + 0.0f, + 0x00000000, + 1.0f, + -5.0f, + 0.0f +}; + +static EffectParamData effectSmokeParam = { + 0, + 0x80, 0x20, 0x20, 0xFF, + 0x00, 0x00, 0x00, 0xFF, + { 0.0f, 10.0f, 0.0f }, + 1.0f, 0.95f, 1.0f, + 0.0f, + 0x00000000, + 5.0f, + -13.0f, + 0.1f +}; + +static s8 lbl_801309A0[32] = { + 10, 32, -1, -1, + 20, 40, -1, -1, + 12, 37, -1, -1, + 4, 25, -1, -1, + 5, 30, -1, -1, + 16, 1, 24, 39, + 23, 50, -1, -1, + 19, 39, -1, -1 +}; + +static s8 lbl_801309C0[32] = { + 15, 29, -1, -1, + 5, 19, -1, -1, + 5, 22, -1, -1, + 12, 28, -1, -1, + 18, 35, -1, -1, + 1, 8, 12, -1, + 0, 16, -1, -1, + 12, 28, -1, -1 +}; + +static s8 lbl_801309E0[16] = { + 5, 7, 6, 9, + 10, 11, 9, -1, + 9, 11, 9, -1, + 8, -1, 10, -1 +}; + +void CharManInit(void) { + UnkCharInstanceStruct *temp_r29; + s16 i; + s16 j; + + for (i = 0; i < 8; i++) { + temp_r29 = &charInstance[i]; + temp_r29->unkC0 = NULL; + for (j = 0; j < 32; j++) { + temp_r29->unk0C[j] = -1; + } + temp_r29->unk00 = -1; + temp_r29->unkC4 = NULL; + } + if (!effectAMemP) { + effectAMemP = (void*) HuAR_DVDtoARAM(0x120000); + } + for (i = 0; i < 8; i++) { + effectMdl[i] = -1; + particleData[i] = NULL; + } + for (i = 0; i < 32; i++) { + itemHookProcess[i] = NULL; + } +} + +void *CharAMemPtrGet(s16 character) { + return charInstance[character].unkC0; +} + +void CharARAMOpen(s16 character) { + UnkCharInstanceStruct *temp_r31; + + if (character >= 8 || character < 0 || character == 0xFF) { + return; + } + temp_r31 = &charInstance[character]; + if (!temp_r31->unkC0) { + temp_r31->unkC0 = (void*) HuAR_DVDtoARAM(charDirTbl[character][2]); + } +} + +void CharARAMClose(s16 character) { + UnkCharInstanceStruct *temp_r31; + + temp_r31 = &charInstance[character]; + if (temp_r31->unkC0) { + HuARFree((u32) temp_r31->unkC0); + temp_r31->unkC0 = NULL; + } +} + +void CharKill(s16 character) { + s16 i; + + if (character == -1) { + for (i = 0; i < 8; i++) { + CharKill(i); + } + } else { + HuDataDirClose(charDirTbl[character][0]); + HuDataDirClose(charDirTbl[character][1]); + HuDataDirClose(charDirTbl[character][2]); + CharARAMClose(character); + } +} + +void CharKillAll(void) { + CharModelKill(-1); + CharKill(-1); + HuARFree((u32) effectAMemP); + effectAMemP = NULL; +} + +s16 CharModelCreate(s16 character, s16 lod) { + s16 sp8 = 0; + UnkCharInstanceStruct *temp_r31; + void *var_r26; + s16 *var_r27; + s16 var_r25; + s32 var_r29; + + temp_r31 = &charInstance[character]; + if (temp_r31->unk00 != -1) { + Hu3DModelKill(temp_r31->unk00); + } + if (lod & 1) { + var_r29 = charDirTbl[character][0]; + } else if (lod & 2) { + var_r29 = charDirTbl[character][1]; + } else if (lod & 4) { + var_r29 = charDirTbl[character][1] | 1; + } else { + var_r29 = charDirTbl[character][1] | 2; + } + var_r26 = HuDataSelHeapReadNum(var_r29, MEMORY_DEFAULT_NUM, HEAP_DATA); + temp_r31->unk00 = var_r25 = Hu3DModelCreate(var_r26); + temp_r31->unkC4 = HuPrcCreate(UpdateChar, 0x64, 0x4000, 0); + temp_r31->unkC4->user_data = var_r27 = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s16)); + temp_r31->unk02 = lod; + temp_r31->unkAC = 0; + *var_r27 = character; + temp_r31->unkB0 = 0; + InitEffect(); + return var_r25; +} + +static void UpdateChar(void) { + Vec sp8; + s16 *temp_r28; + UnkCharInstanceStruct *temp_r31; + ModelData *temp_r29; + s16 var_r27; + s16 i; + + temp_r28 = HuPrcCurrentGet()->user_data; + temp_r31 = &charInstance[*temp_r28]; + temp_r29 = &Hu3DData[temp_r31->unk00]; + var_r27 = 0; + while (1) { + for (i = 0; i < 32; i++) { + if (temp_r31->unk0C[i] == temp_r29->unk_08) { + break; + } + } + skipAnimUpdate = 0; + if (i != 32) { + temp_r31->unk04 = temp_r31->unk4C[i]; + UpdateCharAnim(*temp_r28, temp_r31->unk00, temp_r31->unk4C[i], temp_r31->unk8C[i], temp_r29->unk_64, &sp8); + temp_r31->unk08 = temp_r31->unk4C[i]; + } else { + temp_r31->unk04 = -1; + } + if (temp_r29->unk_0C != -1) { + for (i = 0; i < 32; i++) { + if (temp_r31->unk0C[i] == temp_r29->unk_0C) { + break; + } + } + skipAnimUpdate = 1; + var_r27 = 1; + if (i != 32) { + temp_r31->unk06 = temp_r31->unk4C[i]; + UpdateCharAnim(*temp_r28, temp_r31->unk00, temp_r31->unk4C[i], temp_r31->unk8C[i], temp_r29->unk_84, &sp8); + temp_r31->unk0A = temp_r31->unk4C[i]; + } else { + temp_r31->unk06 = -1; + } + } else if (var_r27 != 0) { + CharModelTexAnimSet(*temp_r28); + var_r27 = 0; + } + temp_r31->unkB4 = temp_r29->pos; + HuPrcVSleep(); + } +} + +static void UpdateCharAnim(s16 character, s16 arg1, s16 arg2, u8 arg3, s16 arg4, Vec *arg5) { + Vec sp1C; + Vec sp10; + ModelData *temp_r30; + s16 var_r19; + ParticleData *var_r18; + ModelData *var_r17; + HsfanimStruct01 *var_r27; + UnkCharInstanceStruct *temp_r29; + Mtx sp28; + u32 var_r22; + s16 var_r20; + s16 i; + + temp_r30 = &Hu3DData[arg1]; + temp_r29 = &charInstance[character]; + var_r22 = 0; + if (skipAnimUpdate == 0 && (temp_r30->motion_attr & 0x40000002)) { + return; + } + switch (arg2) { + case 2: + if (skipAnimUpdate == 0 && temp_r30->unk_68 <= 0.5) { + break; + } + if (skipAnimUpdate != 0 && temp_r30->unk_88 <= 0.5) { + break; + } + if (!(arg4 & 0xF) && !(temp_r29->unkAC & 0x10)) { + effectDustParam.unk0C.x = 2.0 * -sin(temp_r30->rot.y * M_PI / 180.0); + effectDustParam.unk0C.y = 1.0 + 0.1 * frandmod(0xA); + effectDustParam.unk0C.z = 2.0 * -cos(temp_r30->rot.y * M_PI / 180.0); + sp1C.x = temp_r30->pos.x + temp_r30->scale.x * (frandmod(0x32) - 0x19); + sp1C.y = temp_r30->pos.y; + sp1C.z = temp_r30->pos.z + temp_r30->scale.x * (frandmod(0x32) - 0x19); + CreateEffectDust(arg1, sp1C.x, sp1C.y, sp1C.z, frandmod(0xA) + 0x1E, &effectDustParam); + } + for (i = 0; i < 4; i++) { + if (lbl_801309A0[character * 4 + i] == arg4) { + PlayStepFX(character, 0x101, arg3); + break; + } + } + break; + case 3: + if (skipAnimUpdate == 0 && temp_r30->unk_68 <= 0.5) { + break; + } + if (skipAnimUpdate != 0 && temp_r30->unk_88 <= 0.5) { + break; + } + if (!(arg4 & 3) && !(temp_r29->unkAC & 0x10)) { + effectDustParam.unk0C.x = 4.0 * -sin(temp_r30->rot.y * M_PI / 180.0); + effectDustParam.unk0C.y = 2.0 + 0.1 * frandmod(0xA); + effectDustParam.unk0C.z = 4.0 * -cos(temp_r30->rot.y * M_PI / 180.0); + sp1C.x = temp_r30->pos.x + temp_r30->scale.x * (frandmod(0x32) - 0x19); + sp1C.y = temp_r30->pos.y; + sp1C.z = temp_r30->pos.z + temp_r30->scale.x * (frandmod(0x32) - 0x19); + CreateEffectDust(arg1, sp1C.x, sp1C.y, sp1C.z, frandmod(0xA) + 0x1E, &effectDustParam); + } + for (i = 0; i < 4; i++) { + if (lbl_801309C0[character * 4 + i] == arg4) { + PlayStepFX(character, 0x105, arg3); + break; + } + } + break; + case 4: + if (arg4 < 5 && !(temp_r29->unkAC & 0x10)) { + effectDustParam.unk0C.x = 6.0 * sin(temp_r30->rot.y * M_PI / 180.0); + effectDustParam.unk0C.z = 6.0 * cos(temp_r30->rot.y * M_PI / 180.0); + for (i = 0; i < 5; i++) { + effectDustParam.unk0C.y = 2.0 + 0.1 * frandmod(0xA); + sp1C.x = temp_r30->pos.x + temp_r30->scale.x * (frandmod(0x32) - 0x19); + sp1C.y = temp_r30->pos.y; + sp1C.z = temp_r30->pos.z + temp_r30->scale.x * (frandmod(0x32) - 0x19); + CreateEffectDust(arg1, sp1C.x, sp1C.y, sp1C.z, 20.0f, &effectDustParam); + } + } + if (arg4 == 0) { + PlayStepFX(character, 0x10D, arg3); + } + break; + case 6: + if (arg4 == 5 && !(temp_r29->unkAC & 0x10)) { + for (i = 0; i < 8; i++) { + effectDustParam.unk0C.x = 4.0 * sin(45.0f * i * M_PI / 180.0) * temp_r30->scale.x; + effectDustParam.unk0C.y = 0.0f; + effectDustParam.unk0C.z = 4.0 * cos(45.0f * i * M_PI / 180.0) * temp_r30->scale.x; + CreateEffectDust(arg1, temp_r30->pos.x, temp_r30->pos.y + 10.0f * temp_r30->scale.x, temp_r30->pos.z, 20.0f, &effectDustParam); + } + for (i = 0; i < 8; i++) { + effectDustParam.unk0C.x = 2.0 * sin((45.0f * i + 22.5) * M_PI / 180.0) * temp_r30->scale.x; + effectDustParam.unk0C.y = 0.0f; + effectDustParam.unk0C.z = 2.0 * cos((45.0f * i + 22.5) * M_PI / 180.0) * temp_r30->scale.x; + CreateEffectDust(arg1, temp_r30->pos.x, temp_r30->pos.y + 10.0f * temp_r30->scale.x, temp_r30->pos.z, 20.0f, &effectDustParam); + } + } + for (i = 0; i < 2; i++) { + if (lbl_801309E0[character * 2 + i] == arg4) { + PlayStepFX(character, 0x10D, arg3); + break; + } + } + break; + case 7: + if (arg2 == 7) { + Hu3DModelObjMtxGet(arg1, CharModelHookNameGet(character, temp_r29->unk02, 0), sp28); + var_r20 = 10; + } else { + Hu3DModelObjMtxGet(arg1, CharModelHookNameGet(character, temp_r29->unk02, 1), sp28); + var_r20 = 13; + } + if (arg4 <= var_r20 && !(temp_r29->unkAC & 0x10)) { + effectDotParam.unk0C.x = 0.0f; + effectDotParam.unk0C.y = 0.0f; + effectDotParam.unk0C.z = 0.0f; + effectDotParam.unk2C = -5.0f; + sp1C.x = sp28[0][3]; + sp1C.y = sp28[1][3]; + sp1C.z = sp28[2][3]; + if (arg4 != 0) { + PSVECSubtract(&sp1C, arg5, &sp10); + var_r20 = 0.2 * sqrtf(sp10.x * sp10.x + sp10.y * sp10.y + sp10.z * sp10.z); + if (var_r20 > 5) { + var_r20 = 5; + } + if (var_r20 < 1) { + var_r20 = 1; + } + for (i = 1; i <= var_r20; i++) { + sp10.x = arg5->x + (sp1C.x - arg5->x) * ((float) i / var_r20); + sp10.y = arg5->y + (sp1C.y - arg5->y) * ((float) i / var_r20); + sp10.z = arg5->z + (sp1C.z - arg5->z) * ((float) i / var_r20); + CreateEffectDot(arg1, sp10.x, sp10.y, sp10.z, 50.0f, &effectDotParam); + } + } else { + CreateEffectDot(arg1, sp1C.x, sp1C.y, sp1C.z, 40.0f, &effectDotParam); + } + *arg5 = sp1C; + } + break; + case 0xA: + if (arg4 == 0) { + if (!(temp_r29->unkAC & 0x10)) { + for (i = 0; i < 8; i++) { + effectStarParam.unk0C.x = 10.0 * sin(45.0f * i * M_PI / 180.0) * temp_r30->scale.x; + effectStarParam.unk0C.y = 0.0f; + effectStarParam.unk0C.z = 10.0 * cos(45.0f * i * M_PI / 180.0) * temp_r30->scale.x; + CreateEffectStar(arg1, temp_r30->pos.x, temp_r30->pos.y + 10.0f * temp_r30->scale.x, temp_r30->pos.z, 40.0f, &effectStarParam); + } + for (i = 0; i < 8; i++) { + effectDustParam.unk0C.x = 4.0 * sin((45.0f * i + 22.5) * M_PI / 180.0) * temp_r30->scale.x; + effectDustParam.unk0C.y = 0.0f; + effectDustParam.unk0C.z = 4.0 * cos((45.0f * i + 22.5) * M_PI / 180.0) * temp_r30->scale.x; + CreateEffectDust(arg1, temp_r30->pos.x, temp_r30->pos.y + 10.0f * temp_r30->scale.x, temp_r30->pos.z, 20.0f, &effectDustParam); + } + } + PlayCharVoice(character, 0x119, arg3); + } + break; + case 0x1B: + if (temp_r30->unk_0C != -1 && skipAnimUpdate == 0) { + break; + } + if (!(temp_r29->unkAC & 0x10)) { + if (arg4 == 10) { + var_r19 = CreateEffectWarn(arg1, temp_r30->pos.x, temp_r30->pos.y + 100.0f, temp_r30->pos.z, 20.0f, &effectWarnParam); + if (var_r19 == -1) { + break; + } + var_r17 = &Hu3DData[effectMdl[0]]; + var_r18 = var_r17->unk_120; + var_r27 = &var_r18->unk_48[var_r19]; + var_r27->unk02 = 0; + var_r27->unk08.x = arg1; + if (character == 7) { + var_r27->unk08.y = 190.0f; + } else if (character == 2 || character == 5 || character == 6) { + var_r27->unk08.y = 140.0f; + } else { + var_r27->unk08.y = 120.0f; + } + var_r27->unk14.x = var_r27->unk14.z = 0.0f; + var_r27->unk14.y = 100.0f; + } + if (arg4 == 30) { + for (i = 0; i < 8; i++) { + effectDustParam.unk0C.x = 4.0 * sin((45.0f * i + 22.5) * M_PI / 180.0) * temp_r30->scale.x; + effectDustParam.unk0C.y = 0.0f; + effectDustParam.unk0C.z = 4.0 * cos((45.0f * i + 22.5) * M_PI / 180.0) * temp_r30->scale.x; + CreateEffectDust(arg1, temp_r30->pos.x, temp_r30->pos.y + 10.0f * temp_r30->scale.x, temp_r30->pos.z, 20.0f, &effectDustParam); + } + } + } + break; + case 0x1C: + if (temp_r30->unk_0C != -1 && skipAnimUpdate == 0) { + break; + } + if (!(temp_r29->unkAC & 0x10) && arg4 == 0) { + var_r19 = CreateEffectWarn(arg1, temp_r30->pos.x, temp_r30->pos.y + 100.0f, temp_r30->pos.z, 20.0f, &effectWarnParam); + if (var_r19 == -1) { + break; + } + var_r17 = &Hu3DData[effectMdl[0]]; + var_r18 = var_r17->unk_120; + var_r27 = &var_r18->unk_48[var_r19]; + var_r27->unk02 = 0; + var_r27->unk08.x = arg1; + if (character == 7) { + var_r27->unk08.y = 150.0f; + } else if (character == 2 || character == 5 || character == 6) { + var_r27->unk08.y = 120.0f; + } else { + var_r27->unk08.y = 100.0f; + } + var_r27->unk14.x = var_r27->unk14.z = 0.0f; + var_r27->unk14.y = 100.0f; + } + break; + case 0x15: + case 0x16: + case 0x79: + if (!(temp_r29->unkAC & 1) && !(temp_r29->unkAC & 0x10)) { + PlayCharVoice(character, 0x11A, arg3); + for (i = 0; i < 3; i++) { + var_r19 = CreateEffectBird(arg1, temp_r30->pos.x, temp_r30->pos.y + 100.0f * temp_r30->scale.x, temp_r30->pos.z, 1.0f, &effectWarnParam); + if (var_r19 == -1) { + break; + } + var_r17 = &Hu3DData[effectMdl[7]]; + var_r18 = var_r17->unk_120; + var_r27 = &var_r18->unk_48[var_r19]; + var_r27->unk02 = 1; + var_r27->unk00 = 0; + var_r27->unk08.x = character; + var_r27->unk08.y = i * 0x78; + temp_r29->unkAC |= 1; + } + } + break; + case 0x13: + if ((arg4 & 1) && !(temp_r29->unkAC & 0x10)) { + Hu3DModelObjMtxGet(arg1, CharModelHookNameGet(character, temp_r29->unk02, 4), sp28); + sp1C.x = sp28[0][3]; + sp1C.y = sp28[1][3]; + sp1C.z = sp28[2][3]; + CreateEffectSmoke(arg1, sp1C.x, sp1C.y, sp1C.z, 20.0f, &effectSmokeParam); + } + break; + case 5: + if (arg4 == 0) { + if (temp_r29->unkB0 == 4) { + PlayCharVoice(character, 0x10A, arg3); + } else if (temp_r29->unkB0 == 5) { + PlayCharVoice(character, 0x10C, arg3); + } else { + PlayCharVoice(character, 0x115, arg3); + } + } + break; + case 8: + if (arg4 == 0) { + PlayCharVoice(character, 0x118, arg3); + } + break; + case 0x14: + case 0x50: + if (arg4 == 0 && !(temp_r29->unkAC & 0x14)) { + PlayCharVoice(character, 0x123, arg3); + } + break; + case 0x3B: + case 0x48: + if (arg4 == 0 && !(temp_r29->unkAC & 0x12)) { + PlayCharVoice(character, 0x122, arg3); + } + break; + case 0x3F: + case 0x53: + case 0x57: + if (arg4 == 0 && !(temp_r29->unkAC & 0x12)) { + PlayCharVoice(character, 0x124, arg3); + } + temp_r29->unkAC |= 2; + var_r22 |= 2; + break; + case 0x4B: + if (arg4 == lbl_801D3600[character] && !(temp_r29->unkAC & 0x12)) { + PlayCharVoice(character, 0x124, arg3); + temp_r29->unkAC |= 2; + var_r22 |= 2; + } + break; + case 0x4C: + if (arg4 == lbl_801D3608[character] && !(temp_r29->unkAC & 0x12)) { + PlayCharVoice(character, 0x124, arg3); + temp_r29->unkAC |= 2; + var_r22 |= 2; + } + break; + case 0x17: + if (!(temp_r29->unkAC & 0x12)) { + if (omcurovl < OVL_W01 && arg4 == lbl_801D35F0[character]) { + PlayCharVoice(character, 0x124, arg3); + temp_r29->unkAC |= 2; + var_r22 |= 2; + } else if (omcurovl >= OVL_W01 && arg4 == lbl_801D35F8[character]) { + PlayCharVoice(character, 0x122, arg3); + temp_r29->unkAC |= 2; + var_r22 |= 2; + } + } + break; + case 0x18: + if (arg4 == lbl_801D3610[character] && !(temp_r29->unkAC & 0x14)) { + PlayCharVoice(character, 0x121, arg3); + temp_r29->unkAC |= 4; + var_r22 |= 4; + } + break; + case 0x2A: + case 0x72: + if (arg4 == 0 && !(temp_r29->unkAC & 0x14)) { + PlayCharVoice(character, 0x121, arg3); + } + temp_r29->unkAC |= 4; + var_r22 |= 4; + break; + case 0x49: + case 0x4E: + if (arg4 == 0 && !(temp_r29->unkAC & 0x14)) { + PlayCharVoice(character, 0x12E, arg3); + } + temp_r29->unkAC |= 4; + var_r22 |= 4; + break; + } + if (skipAnimUpdate == 0) { + if (!(var_r22 & 4)) { + temp_r29->unkAC &= ~4; + } + if (!(var_r22 & 2)) { + temp_r29->unkAC &= ~2; + } + } +} + +static s32 PlayCharVoice(s16 character, s16 arg1, u8 arg2) { + UnkCharInstanceStruct *temp_r31; + ModelData *temp_r29; + + temp_r31 = &charInstance[character]; + temp_r29 = &Hu3DData[temp_r31->unk00]; + if (arg2 & 1) { + return; + } + if (temp_r31->unkAC & 8) { + return HuAudCharVoicePlayPos(character, arg1, &temp_r29->pos); + } else { + return HuAudCharVoicePlay(character, arg1); + } +} + +static void InitEffect(void) { + HsfanimStruct01 *var_r29; + ParticleData *temp_r30; + void *temp_r26; + AnimData *temp_r25; + s16 var_r27; + s16 i; + s16 j; + + var_r27 = 0; + for (i = 0; i < 8; i++) { + if (effectMdl[i] == -1) { + temp_r26 = HuDataSelHeapReadNum(effectDataTbl[i].unk00, MEMORY_DEFAULT_NUM, HEAP_DATA); + temp_r25 = HuSprAnimRead(temp_r26); + effectMdl[i] = Hu3DParticleCreate(temp_r25, effectDataTbl[i].unk04); + if (i == 7) { + Hu3DParticleAnimModeSet(effectMdl[i], 0); + } + Hu3DParticleHookSet(effectMdl[i], UpdateEffect); + if (!particleData[i]) { + particleData[i] = HuMemDirectMalloc(HEAP_SYSTEM, effectDataTbl[i].unk04 * sizeof(EffectParamData)); + } + Hu3DParticleBlendModeSet(effectMdl[i], effectDataTbl[i].unk06); + temp_r30 = Hu3DData[effectMdl[i]].unk_120; + temp_r30->unk_02 = 0; + temp_r30->unk_1C = particleData[i]; + temp_r30->unk_34 = 1; + var_r29 = temp_r30->unk_48; + for (j = 0; j < temp_r30->unk_30; j++, var_r29++) { + var_r29->unk2C = 0.0f; + } + var_r27 = 1; + } + } + if (var_r27 != 0) { + HuDataDirClose(0x120000); + } +} + +static s16 CreateEffectDust(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5) { + ModelData *temp_r31; + + temp_r31 = &Hu3DData[arg0]; + if (effectMdl[2] == -1) { + return -1; + } + arg4 *= temp_r31->scale.x; + return CreateEffect(effectMdl[2], temp_r31->camera, arg1, arg2, arg3, arg4, arg5); +} + +static s16 CreateEffectSmoke(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5) { + ModelData *temp_r31; + + temp_r31 = &Hu3DData[arg0]; + if (effectMdl[3] == -1) { + return -1; + } + arg4 *= temp_r31->scale.x; + return CreateEffect(effectMdl[3], temp_r31->camera, arg1, arg2, arg3, arg4, arg5); +} + +static s16 CreateEffectDot(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5) { + ModelData *temp_r31; + + temp_r31 = &Hu3DData[arg0]; + if (effectMdl[6] == -1) { + return -1; + } + arg4 *= temp_r31->scale.x; + return CreateEffect(effectMdl[6], temp_r31->camera, arg1, arg2, arg3, arg4, arg5); +} + +static s16 CreateEffectStar(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5) { + ModelData *temp_r31; + + temp_r31 = &Hu3DData[arg0]; + if (effectMdl[4] == -1) { + return -1; + } + arg4 *= temp_r31->scale.x; + return CreateEffect(effectMdl[4], temp_r31->camera, arg1, arg2, arg3, arg4, arg5); +} + +static s16 CreateEffectWarn(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5) { + ModelData *temp_r31; + + temp_r31 = &Hu3DData[arg0]; + if (effectMdl[0] == -1) { + return -1; + } + arg4 *= temp_r31->scale.x; + return CreateEffect(effectMdl[0], temp_r31->camera, arg1, arg2, arg3, arg4, arg5); +} + +static s16 CreateEffectBird(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5) { + ModelData *temp_r31; + + temp_r31 = &Hu3DData[arg0]; + if (effectMdl[7] == -1) { + return -1; + } + arg4 *= temp_r31->scale.x; + return CreateEffect(effectMdl[7], temp_r31->camera, arg1, arg2, arg3, arg4, arg5); +} + +static s16 CreateEffect(s16 arg0, s16 arg1, float arg2, float arg3, float arg4, float arg5, EffectParamData *arg6) { + ModelData *var_r28; + ParticleData *temp_r30; + EffectParamData *var_r27; + HsfanimStruct01 *var_r31; + s16 i; + + var_r28 = &Hu3DData[arg0]; + temp_r30 = var_r28->unk_120; + var_r27 = temp_r30->unk_1C; + var_r31 = &temp_r30->unk_48[temp_r30->unk_02]; + for (i = temp_r30->unk_02; i < temp_r30->unk_30; i++, var_r31++) { + if (!var_r31->unk2C) { + break; + } + } + if (i >= temp_r30->unk_30) { + var_r31 = temp_r30->unk_48; + for (i = 0; i < temp_r30->unk_30; i++, var_r31++) { + if (!var_r31->unk2C) { + break; + } + } + } + if (i != temp_r30->unk_30) { + var_r27[i] = *arg6; + var_r31->unk06 = arg1; + var_r31->unk34.x = arg2; + var_r31->unk34.y = arg3; + var_r31->unk34.z = arg4; + var_r31->unk08 = arg6->unk0C; + var_r31->unk40.r = arg6->unk04; + var_r31->unk40.g = arg6->unk05; + var_r31->unk40.b = arg6->unk06; + var_r31->unk40.a = arg6->unk07; + var_r31->unk28 = arg5; + var_r31->unk2C = arg5; + var_r31->unk00 = 0; + var_r31->unk02 = -1; + temp_r30->unk_02 = i; + } else { + return -1; + } + return i; +} + +static void UpdateEffect(s32 arg0, ParticleData *arg1) { + EffectParamData *temp_r30; + HsfanimStruct01 *var_r31; + s16 var_r28; + s16 i; + + temp_r30 = arg1->unk_1C; + if (arg1->unk_34 == 0) { + var_r31 = arg1->unk_48; + for (i = 0; i < arg1->unk_30; i++, var_r31++) { + var_r31->unk2C = 0.0f; + } + } + var_r31 = arg1->unk_48; + for (i = 0; i < arg1->unk_30; i++, var_r31++) { + if (var_r31->unk2C) { + if (var_r31->unk02 == -1) { + var_r31->unk08.x *= temp_r30[i].unk18; + var_r31->unk08.y *= temp_r30[i].unk1C; + var_r31->unk08.z *= temp_r30[i].unk20; + PSVECAdd(&var_r31->unk08, &var_r31->unk34, &var_r31->unk34); + var_r31->unk08.y += temp_r30[i].unk24; + var_r28 = var_r31->unk40.r + temp_r30[i].unk34 * (temp_r30[i].unk08 - temp_r30[i].unk04); + if (var_r28 < 0) { + var_r28 = 0; + } else if (var_r28 > 0xFF) { + var_r28 = 0xFF; + } + var_r31->unk40.r = var_r28; + var_r28 = var_r31->unk40.g + temp_r30[i].unk34 * (temp_r30[i].unk09 - temp_r30[i].unk05); + if (var_r28 < 0) { + var_r28 = 0; + } else if (var_r28 > 0xFF) { + var_r28 = 0xFF; + } + var_r31->unk40.g = var_r28; + var_r28 = var_r31->unk40.b + temp_r30[i].unk34 * (temp_r30[i].unk0A - temp_r30[i].unk06); + if (var_r28 < 0) { + var_r28 = 0; + } else if (var_r28 > 0xFF) { + var_r28 = 0xFF; + } + var_r31->unk40.b = var_r28; + var_r28 = var_r31->unk40.a + temp_r30[i].unk30; + if (var_r28 < 1) { + var_r31->unk2C = 0.0f; + } + var_r31->unk40.a = var_r28; + if (var_r31->unk2C) { + if (temp_r30[i].unk00 & 1) { + var_r31->unk2C = var_r31->unk28 * (((var_r31->unk00_s16 + i) & 1) ? 1.0 : 0.5); + } else { + var_r31->unk2C = var_r31->unk28; + } + var_r31->unk28 += temp_r30[i].unk2C; + if (var_r31->unk28 <= 0.01f) { + var_r31->unk2C = 0.0f; + } + } + var_r31->unk00_s16++; + } else { + switch (var_r31->unk02) { + case 0: + RotateEffect(var_r31); + break; + case 1: + PlayEffectSound(var_r31); + break; + case 2: + OrbitEffect(var_r31); + break; + } + } + } + } + DCStoreRangeNoSync(arg1->unk_48, arg1->unk_30 * sizeof(HsfanimStruct01)); +} + +static void RotateEffect(HsfanimStruct01 *arg0) { + ModelData *temp_r30; + float var_f31; + + temp_r30 = &Hu3DData[(s32) arg0->unk08.x]; + if (arg0->unk00_s16 < 8) { + var_f31 = 0.3 + sin((40.0f + 10.0f * (arg0->unk00_s16 + 1)) * M_PI / 180.0); + arg0->unk2C = 50.0f * var_f31 * temp_r30->scale.x; + arg0->unk40.a = 0xFF; + var_f31 = 0.3 + sin((15.0f * (arg0->unk00_s16 + 1)) * M_PI / 180.0); + } else { + var_f31 = 0.3 + sin(3 * M_PI / 4); + } + var_f31 *= temp_r30->scale.x; + arg0->unk34.x = temp_r30->pos.x + arg0->unk14.x * var_f31; + arg0->unk34.y = temp_r30->pos.y + arg0->unk08.y * temp_r30->scale.x + arg0->unk14.y * var_f31; + arg0->unk34.z = temp_r30->pos.z + arg0->unk14.z * var_f31; + if (arg0->unk00_s16 > 0x14) { + arg0->unk40.a -= 0x20; + arg0->unk2C -= 8.0f * temp_r30->scale.x; + if (arg0->unk2C < 0.0f) { + arg0->unk2C = 0.0f; + } + } + arg0->unk00_s16++; +} + +static float voiceParam[16] = { + 110.0f, 160.0f, 110.0f, 160.0f, + 150.0f, 180.0f, 130.0f, 160.0f, + 130.0f, 160.0f, 150.0f, 160.0f, + 150.0f, 180.0f, 120.0f, 210.0f +}; + +static void PlayEffectSound(HsfanimStruct01 *arg0) { + ModelData *temp_r30; + UnkCharInstanceStruct *temp_r29; + s16 temp_r26; + s16 temp_r28; + s16 var_r25; + + temp_r28 = arg0->unk08.x; + temp_r29 = &charInstance[temp_r28]; + temp_r30 = &Hu3DData[temp_r29->unk00]; + if (arg0->unk00_s16 < 0x14 && arg0->unk2C < 40.0f * temp_r30->scale.x) { + arg0->unk2C += 4.0f * temp_r30->scale.x; + } + arg0->unk40.a = 0xFF; + if (temp_r29->unk04 == 0x16 || temp_r29->unk06 == 0x16) { + var_r25 = voiceParam[temp_r28 * 2]; + } else { + var_r25 = voiceParam[temp_r28 * 2 + 1]; + } + temp_r26 = (arg0->unk00_s16 * 5) % 360; + arg0->unk34.x = temp_r30->pos.x + 40.0 * sin((arg0->unk08.y + temp_r26) * M_PI / 180.0) * temp_r30->scale.x; + arg0->unk34.y = temp_r30->pos.y + var_r25 * temp_r30->scale.x; + arg0->unk34.z = temp_r30->pos.z + 40.0 * cos((arg0->unk08.y + temp_r26) * M_PI / 180.0) * temp_r30->scale.x; + arg0->unk00_s16++; + if (arg0->unk00_s16 >= 0x8F) { + arg0->unk00_s16 = 0x48; + } + if (temp_r29->unk04 != 0x15 && temp_r29->unk04 != 0x16 && temp_r29->unk04 != 0x79 && arg0->unk00_s16 > 0x1E) { + arg0->unk2C -= 4.0f * temp_r30->scale.x; + if (arg0->unk2C < 0.0f) { + arg0->unk2C = 0.0f; + temp_r29->unkAC &= ~1; + if (arg0->unk08.y == 0.0) { + PlayCharVoice(temp_r28, 0x100, temp_r29->unkAC); + } + } + } +} + +s16 CharModelMotionCreate(s16 character, s32 data_num) { + UnkCharInstanceStruct *temp_r31; + s16 var_r28; + s16 var_r30; + u32 temp_r26; + void *var_r27; + + temp_r31 = &charInstance[character]; + if (temp_r31->unk00 == -1) { + return -1; + } + for (var_r30 = 0; var_r30 < 32; var_r30++) { + if (temp_r31->unk0C[var_r30] == -1) { + break; + } + } + if (var_r30 == 32) { + return -1; + } + temp_r26 = data_num & 0xFFFF0000; + for (var_r28 = 0; var_r28 < 8; var_r28++) { + if (temp_r26 == charDirTbl[var_r28][2]) { + break; + } + } + if (var_r28 != 8 || temp_r26 == 0) { + data_num &= 0xFFFF; + var_r27 = HuAR_ARAMtoMRAMFileRead(data_num | charDirTbl[character][2], MEMORY_DEFAULT_NUM, 2); + if (!var_r27) { + var_r27 = HuDataSelHeapReadNum(data_num | charDirTbl[character][2], MEMORY_DEFAULT_NUM, HEAP_DATA); + } + temp_r31->unk4C[var_r30] = data_num; + } else { + var_r27 = HuDataSelHeapReadNum(data_num, MEMORY_DEFAULT_NUM, HEAP_DATA); + temp_r31->unk4C[var_r30] = -1; + } + temp_r31->unk0C[var_r30] = Hu3DJointMotion(temp_r31->unk00, var_r27); + temp_r31->unk8C[var_r30] = 0; + return temp_r31->unk0C[var_r30]; +} + +void CharModelMotionIndexSet(s16 character, s16 arg1, s32 arg2) { + UnkCharInstanceStruct *temp_r30; + s16 i; + + temp_r30 = &charInstance[character]; + for (i = 0; i < 32; i++) { + if (temp_r30->unk0C[i] == arg1) { + break; + } + } + if (i != 32) { + temp_r30->unk4C[i] = arg2; + } +} + +void CharModelMotionKill(s16 character, u32 motion) { + UnkCharInstanceStruct *temp_r30; + s16 i; + + temp_r30 = &charInstance[character]; + for (i = 0; i < 32; i++) { + if (temp_r30->unk0C[i] == motion) { + break; + } + } + temp_r30->unk0C[i] = -1; + Hu3DMotionKill(motion); +} + +void CharModelMotionDataClose(s16 character) { + s16 i; + + if (character == -1) { + for (i = 0; i < 8; i++) { + CharModelMotionDataClose(i); + } + } else { + HuDataDirClose(charDirTbl[character][2]); + } +} + +void CharModelDataClose(s16 arg0) { + s16 i; + + if (arg0 == -1) { + for (i = 0; i < 8; i++) { + CharModelDataClose(i); + // Required to match. + (void) i; + (void) arg0; + } + } else { + HuDataDirClose(charDirTbl[arg0][0]); + HuDataDirClose(charDirTbl[arg0][1]); + HuDataDirClose(charDirTbl[arg0][2]); + } +} + +void CharModelKill(s16 character) { + UnkCharInstanceStruct *temp_r29; + s16 i; + + if (character == -1) { + for (i = 0; i < 8; i++) { + CharModelKill(i); + } + for (i = 0; i < 15; i++) { + lbl_801975B0[i] = 0; + } + return; + } + CharModelMotionDataClose(character); + temp_r29 = &charInstance[character]; + for (i = 0; i < 32; i++) { + if (temp_r29->unk0C[i] != -1) { + Hu3DMotionKill(temp_r29->unk0C[i]); + } + temp_r29->unk0C[i] = -1; + } + if (temp_r29->unk00 != -1) { + Hu3DModelKill(temp_r29->unk00); + } + temp_r29->unk00 = -1; + for (i = 0; i < 8; i++) { + if (charInstance[i].unk00 != -1) { + break; + } + } + if (i == 8) { + for (i = 0; i < 8; i++) { + if (effectMdl[i] != -1) { + Hu3DModelKill(effectMdl[i]); + } + effectMdl[i] = -1; + } + } + if (temp_r29->unkC4) { + HuMemDirectFree(temp_r29->unkC4->user_data); + HuPrcKill(temp_r29->unkC4); + for (i = 0; i < 32; i++) { + if (itemHookProcess[i]) { + HuPrcKill(itemHookProcess[i]); + } + itemHookProcess[i] = NULL; + } + temp_r29->unkC4 = NULL; + } +} + +void CharModelMotionSet(s16 character, s16 motion) { + UnkCharInstanceStruct *temp_r31; + MotionData *sp8; + + temp_r31 = &charInstance[character]; + sp8 = &Hu3DMotion[motion]; + CharModelTexAnimSet(character); + Hu3DMotionSet(temp_r31->unk00, motion); +} + +void CharModelTexAnimSet(s16 character) { + HsfAttribute *var_r31; + HsfdrawStruct01 *temp_r30; + ModelData *temp_r26; + UnkCharInstanceStruct *temp_r27; + s16 var_r25; + s16 i; + char **temp_r28; + + temp_r27 = &charInstance[character]; + temp_r26 = &Hu3DData[temp_r27->unk00]; + var_r31 = temp_r26->hsfData->attribute; + for (i = 0, var_r25 = 1; i < 4; i++, var_r25 <<= 1) { + if (var_r25 & temp_r27->unk02) { + break; + } + } + if (i < 4) { + temp_r28 = CharModelTexNameGet(character, temp_r27->unk02); + for (i = 0; i < temp_r26->hsfData->attributeCnt; i++, var_r31++) { + if ((var_r31->bitmap->name[0] == temp_r28[0][0] && strcmp(var_r31->bitmap->name, temp_r28[0]) == 0) + || (var_r31->bitmap->name[0] == temp_r28[1][0] && strcmp(var_r31->bitmap->name, temp_r28[1]) == 0)) { + if (var_r31->unk04) { + temp_r30 = var_r31->unk04; + temp_r30->unk08 = temp_r30->unk0C = temp_r30->unk10 = 0.0f; + temp_r30->unk14 = temp_r30->unk18 = temp_r30->unk1C = 0.0f; + } + } + } + } +} + +char *charTexNameTbl[64] = { + "s3c000m1_eyes", "s3c000m1_eyes", "s3c000m1_eyes", "s3c000m1_eyes", + "s3c000m2_eyes", "s3c000m2_eyes", "s3c000m3_eyes", "s3c000m3_eyes", + "S3c001m0_eye", "S3c001m0_eye", "S3c001m1_eye", "S3c001m1_eye", + "c001m3_eye", "c001m3_eye", "c001m3_eye", "c001m3_eye", + "s3c002m0_r_eye", "s3c002m0_l_eye", "s3c002m1_r_eye", "s3c002m1_l_eye", + "s3c002m2_r_eye", "s3c002m2_l_eye", "", "", + "eye1", "eye2", "S3c003m1", "S3c003m1", + "eye1", "eye2", "eye1", "eye2", + "GC-eyes", "GC-eyes", "s3c004m1_eye", "s3c004m1_eye", + "Clswario_eye_l1_AUTO12", "Clswario_eye_l1_AUTO13", "", "", + "m_donkey_eye4", "m_donkey_eye5", "S3donkey_eye", "S3donkey_eye", + "m_donkey_eye1", "m_donkey_eye2", "", "", + "GC-eyes", "GC-eyes", "s3c007m1_Eye_L", "s3c007m1_Eye_R", + "mat87", "mat89", "", "", + "clswaluigi_eye_l1_AUTO1", "clswaluigi_eye_l1_AUTO2", "s3c007_m1_eye", "s3c007_m1_eye", + "clswaluigi_eye_l1_AUTO9", "clswaluigi_eye_l1_AUTO10", "", "" +}; + +char **CharModelTexNameGet(s16 arg0, s16 arg1) { + s16 var_r30; + s16 i; + + for (i = 0, var_r30 = 1; i < 3; i++, var_r30 <<= 1) { + if (var_r30 & arg1) { + break; + } + } + return &charTexNameTbl[arg0 * 8 + i * 2]; +} + +static char *hookNameTbl[40] = { + "a-itemhook-r", "a-itemhook-l", "a-itemhook-fr", "a-itemhook-fl", "a-itemhook-body", + "a-itemhook-r", "a-itemhook-l", "a-itemhook-fr", "a-itemhook-fl", "a-itemhook-body", + "a-itemhook-r", "a-itemhook-l", "a-itemhook-fr", "a-itemhook-fl", "a-itemhook-body", + "a-itemhook-r", "a-itemhook-l", "a-itemhook-fr", "a-itemhook-fl", "a-itemhook-body", + "a-itemhook-r", "a-itemhook-l", "a-itemhook-fr", "a-itemhook-fl", "a-itemhook-body", + "a-itemhook-r", "a-itemhook-l", "a-itemhook-fr", "a-itemhook-fl", "a-itemhook-body", + "a-itemhook-r", "a-itemhook-l", "a-itemhook-fr", "a-itemhook-fl", "a-itemhook-body", + "a-itemhook-r", "a-itemhook-l", "a-itemhook-fr", "a-itemhook-fl", "a-itemhook-body" +}; + +char *CharModelHookNameGet(s16 arg0, s16 arg1, s16 arg2) { + s16 i; + s16 var_r30; + + for (i = 0, var_r30 = 1; i < 3; i++, var_r30 <<= 1) { + if (var_r30 & arg1) { + break; + } + } + return hookNameTbl[arg0 * 5 + arg2]; +} + +void CharModelMotionTimeSet(s16 character, float time) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + Hu3DMotionTimeSet(temp_r31->unk00, time); +} + +float CharModelMotionTimeGet(s16 character) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + return Hu3DMotionTimeGet(temp_r31->unk00); +} + +float CharModelMotionMaxTimeGet(s16 character) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + return Hu3DMotionMaxTimeGet(temp_r31->unk00); +} + +s32 CharModelMotionEndCheck(s16 character) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + return Hu3DMotionEndCheck(temp_r31->unk00); +} + +s16 CharModelMotionShiftIDGet(s16 character) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + return Hu3DMotionShiftIDGet(temp_r31->unk00); +} + +void CharModelMotionShiftSet(s16 character, s16 motion, float time, float shift_time, u32 attr) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + MotionData *sp18 = &Hu3DMotion[motion]; + + Hu3DMotionShiftSet(temp_r31->unk00, motion, time, shift_time, attr); +} + +float CharModelMotionShiftTimeGet(s16 character) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + return Hu3DMotionShiftTimeGet(temp_r31->unk00); +} + +void CharModelMotionSpeedSet(s16 character, float speed) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + Hu3DMotionSpeedSet(temp_r31->unk00, speed); +} + +void CharModelLayerSetAll(s16 arg0) { + s16 i; + + for (i = 0; i < 8; i++) { + if (effectMdl[i] != -1) { + Hu3DModelLayerSet(effectMdl[i], arg0); + } + } +} + +static inline Process *CharModelItemHookCreateInlineFunc(void) { + s16 i; + + for (i = 0; i < 32; i++) { + if (!itemHookProcess[i]) { + break; + } + } + if (i == 32) { + return NULL; + } else { + itemHookProcess[i] = HuPrcCreate(UpdateItemHook, 0x64, 0x2000, 0); + return itemHookProcess[i]; + } +} + +void CharModelItemHookCreate(s16 character, char *arg1) { + Mtx sp18; + Vec spC; + UnkCharInstanceStruct *temp_r31; + ModelData *temp_r28; + HsfObject *temp_r25; + HsfConstData *temp_r24; + Process *var_r26; + UnkProcessData *temp_r27; + s16 temp_r29; + + temp_r31 = &charInstance[character]; + temp_r28 = &Hu3DData[temp_r31->unk00]; + temp_r25 = Hu3DModelObjPtrGet(temp_r31->unk00, arg1); + Hu3DModelObjMtxGet(temp_r31->unk00, arg1, sp18); + temp_r24 = temp_r25->constData; + temp_r29 = temp_r24->hook; + if (temp_r29 != -1) { + Hu3DModelHookObjReset(temp_r31->unk00, arg1); + var_r26 = CharModelItemHookCreateInlineFunc(); + if (!var_r26) { + Hu3DModelAttrSet(temp_r29, 1); + return; + } + var_r26->user_data = temp_r27 = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkProcessData), MEMORY_DEFAULT_NUM); + temp_r28 = &Hu3DData[temp_r29]; + Hu3DMtxTransGet(sp18, &spC); + Hu3DModelPosSetV(temp_r29, &spC); + Hu3DMtxRotGet(sp18, &spC); + mtxRot(temp_r28->unk_F0, spC.x, spC.y, spC.z); + Hu3DMtxScaleGet(sp18, &spC); + Hu3DModelScaleSetV(temp_r29, &spC); + temp_r27->unk02 = temp_r29; + temp_r27->unk00 = temp_r28->camera; + } +} + +static void UpdateItemHook(void) { + Mtx sp14; + Vec sp8; + ModelData *temp_r30; + Process *temp_r25; + s16 var_r28; + s16 var_r29; + UnkProcessData *temp_r31; + + temp_r31 = HuPrcCurrentGet()->user_data; + temp_r30 = &Hu3DData[temp_r31->unk02]; + Hu3DModelObjMtxGet(temp_r31->unk02, "", sp14); + sp8.x = PGMinPos.x + (PGMaxPos.x - PGMinPos.x) / 2; + sp8.y = PGMinPos.y + (PGMaxPos.y - PGMinPos.y) / 2; + sp8.z = PGMinPos.z + (PGMaxPos.z - PGMinPos.z) / 2; + for (var_r29 = 0; var_r29 < 0x28; var_r29++) { + temp_r30->pos.y += 4.0f; + mtxRotCat(temp_r30->unk_F0, 24.0f, 0.0f, 0.0f); + temp_r30->scale.x *= 0.95f; + temp_r30->scale.y *= 0.95f; + temp_r30->scale.z *= 0.95f; + HuPrcVSleep(); + } + Hu3DModelObjMtxGet(temp_r31->unk02, "", sp14); + sp8.x = PGMinPos.x + (PGMaxPos.x - PGMinPos.x) / 2; + sp8.y = PGMinPos.y + (PGMaxPos.y - PGMinPos.y) / 2; + sp8.z = PGMinPos.z + (PGMaxPos.z - PGMinPos.z) / 2; + Hu3DModelAttrSet(temp_r31->unk02, 1); + effectDustParam.unk0C.x = 0.0f; + effectDustParam.unk0C.y = 0.0f; + effectDustParam.unk0C.z = 0.0f; + CreateEffectDust(temp_r31->unk02, sp8.x, sp8.y, sp8.z, 40.0f, &effectDustParam); + for (var_r29 = 0; var_r29 < 8; var_r29++) { + effectDustParam.unk0C.x = frandmod(10) - 5; + effectDustParam.unk0C.y = frandmod(10) - 5; + effectDustParam.unk0C.z = frandmod(10) - 5; + CreateEffectDust(temp_r31->unk02, sp8.x, sp8.y, sp8.z, 20.0f, &effectDustParam); + } + PSMTXIdentity(temp_r30->unk_F0); + temp_r25 = HuPrcCurrentGet(); + for (var_r28 = 0; var_r28 < 32; var_r28++) { + if (itemHookProcess[var_r28] == temp_r25) { + HuPrcKill(temp_r25); + itemHookProcess[var_r28] = NULL; + } + } + while (1) { + HuPrcVSleep(); + } +} + +static EffectParamData modelParticleParam = { + 0, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x40, 0x20, 0x00, 0xFF, + { 0.0f, 2.0f, 1.0f }, + 0.95f, 0.95f, 0.95f, + 0.0f, + 0x00000000, + 1.0f, + -5.0f, + 0.02f +}; + +void CharModelEffectCreate(s16 arg0, Vec *arg1) { + s16 temp_r28; + s16 i; + HsfanimStruct01 *var_r31; + ParticleData *var_r27; + ModelData *var_r26; + + for (i = 0; i < 8; i++) { + temp_r28 = CreateEffect(effectMdl[3], arg0, arg1->x, arg1->y, arg1->z, 20.0f, &modelParticleParam); + if (temp_r28 == -1) { + break; + } + var_r26 = &Hu3DData[effectMdl[3]]; + var_r27 = var_r26->unk_120; + var_r31 = &var_r27->unk_48[temp_r28]; + var_r31->unk02 = 2; + var_r31->unk08.x = 30.0 * sin(i * 45 * M_PI / 180.0); + var_r31->unk08.y = 30.0 * cos(i * 45 * M_PI / 180.0); + var_r31->unk08.z = 0.0f; + var_r31->unk14 = *arg1; + var_r31->unk20 = 1.15f; + var_r31->unk24 = 0.1f * (frandmod(20) - 10); + var_r31->unk40.a = 0xFF - frandmod(3) * 16; + } + for (i = 0; i < 8; i++) { + temp_r28 = CreateEffect(effectMdl[3], arg0, arg1->x, arg1->y, arg1->z, 10.0f, &modelParticleParam); + if (temp_r28 == -1) { + break; + } + var_r26 = &Hu3DData[effectMdl[3]]; + var_r27 = var_r26->unk_120; + var_r31 = &var_r27->unk_48[temp_r28]; + var_r31->unk02 = 2; + var_r31->unk08.x = frandmod(100) - 50; + var_r31->unk08.y = frandmod(100) - 50; + var_r31->unk08.z = frandmod(100) - 50; + var_r31->unk14 = *arg1; + var_r31->unk20 = 1.15f; + var_r31->unk24 = 0.1f * (frandmod(20) - 10); + var_r31->unk40.a = 0xFF - frandmod(3) * 16; + } + temp_r28 = CreateEffect(effectMdl[3], arg0, arg1->x, arg1->y, arg1->z, 10.0f, &modelParticleParam); + if (temp_r28 != -1) { + var_r26 = &Hu3DData[effectMdl[3]]; + var_r27 = var_r26->unk_120; + var_r31 = &var_r27->unk_48[temp_r28]; + var_r31->unk02 = 2; + var_r31->unk08.x = 0.0f; + var_r31->unk08.y = 0.0f; + var_r31->unk08.z = 0.0f; + var_r31->unk14 = *arg1; + var_r31->unk24 = 0.0f; + var_r31->unk20 = 1.15f; + var_r31->unk40.a = 0xFF; + } +} + +static void OrbitEffect(HsfanimStruct01 *arg0) { + float temp_f31; + float var_f30; + s16 temp_r30; + + var_f30 = 20.0f + 3.75f * arg0->unk00_s16; + if (var_f30 > 90.0f) { + var_f30 = 90.0f; + } + temp_f31 = sin((M_PI * var_f30) / 180.0); + arg0->unk34.x = arg0->unk14.x + arg0->unk08.x * temp_f31; + arg0->unk34.y = arg0->unk14.y + arg0->unk08.y * temp_f31; + arg0->unk34.z = arg0->unk14.z + arg0->unk08.z * temp_f31; + arg0->unk2C *= arg0->unk20; + arg0->unk20 -= 0.01; + if (arg0->unk20 < 1.0f) { + arg0->unk20 = 1.0f; + } + if (arg0->unk00_s16 > 8) { + temp_r30 = arg0->unk40.a; + temp_r30 -= 8; + if (temp_r30 < 0) { + arg0->unk40.a = 0; + arg0->unk2C = 0.0f; + } else { + arg0->unk40.a = temp_r30; + } + } + arg0->unk00_s16++; +} + +static EffectParamData coinParticleParam = { + 1, + 0xFF, 0xFF, 0x00, 0xFF, + 0xFF, 0xFF, 0x00, 0xFF, + { 0.0f, 2.0f, 1.0f }, + 0.95f, 1.0f, 0.95f, + -0.1f, + 0x00000000, + -0.2f, + -8.0f, + 0.0f +}; + +void CharModelCoinEffectCreate(s16 arg0, Vec *arg1) { + s16 temp_r29; + s16 var_r28; + s16 i; + + for (i = 0; i < 16; i++) { + temp_r29 = i * 22.5f; + coinParticleParam.unk0C.x = 5.0 * sin(temp_r29 * M_PI / 180.0); + coinParticleParam.unk0C.y = 0.1f * (frandmod(100) - 50); + coinParticleParam.unk0C.z = 5.0 * cos(temp_r29 * M_PI / 180.0); + var_r28 = CreateEffect(effectMdl[5], arg0, arg1->x, arg1->y, arg1->z, 30.0f, &coinParticleParam); + if (var_r28 == -1) { + break; + } + } +} + +static EffectParamData lbl_80131030 = { + 0, + 0xFF, 0xFF, 0x00, 0xFF, + 0xFF, 0x80, 0x00, 0xFF, + { 0.0f, 2.0f, 1.0f }, + 0.95f, 0.95f, 0.95f, + 0.0f, + 0x00000000, + -0.2f, + -16.0f, + 0.05f +}; + +static EffectParamData lbl_80131068 = { + 0, + 0xE0, 0x20, 0x20, 0xFF, + 0xE0, 0x20, 0x20, 0xFF, + { 0.0f, 2.0f, 1.0f }, + 1.0f, 1.0f, 1.0f, + 0.0f, + 0x00000000, + -0.2f, + -12.0f, + 0.05f +}; + +void fn_8004EC74(s16 character) { + Mtx sp24; + Vec sp18; + Vec spC; + UnkCharInstanceStruct *temp_r30; + ModelData *temp_r31; + s16 i; + + temp_r30 = &charInstance[character]; + temp_r31 = &Hu3DData[temp_r30->unk00]; + for (i = 0; i < 32; i++) { + if (temp_r30->unk0C[i] == temp_r31->unk_08) { + break; + } + } + if (i != 32) { + Hu3DModelObjMtxGet(temp_r30->unk00, "test11_tex_we-itemhook-r", sp24); + sp18.x = sp24[0][3]; + sp18.y = sp24[1][3]; + sp18.z = sp24[2][3]; + mtxRot(sp24, temp_r31->rot.x, temp_r31->rot.y, temp_r31->rot.z); + spC.x = sp24[0][2]; + spC.y = sp24[1][2]; + spC.z = sp24[2][2]; + PSVECScale(&spC, &spC, 20.0f); + PSVECAdd(&sp18, &spC, &sp18); + fn_8004EDA4(temp_r31->camera, &sp18, &temp_r31->rot); + } +} + +void fn_8004EDA4(s16 arg0, Vec *arg1, Vec *arg2) { + Mtx sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + float temp_f31; + s16 var_r28; + s16 i; + + mtxRot(sp2C, arg2->x, arg2->y, arg2->z); + sp20.x = sp2C[0][2]; + sp20.y = sp2C[1][2]; + sp20.z = sp2C[2][2]; + for (i = 0; i < 8; i++) { + temp_f31 = i * 45; + sp14.x = sp20.x * sp20.y * (1.0 - cos(temp_f31 * M_PI / 180.0)) - sp20.z * sin(temp_f31 * M_PI / 180.0); + sp14.y = sp20.y * sp20.y + (1.0f - sp20.y * sp20.y) * cos(temp_f31 * M_PI / 180.0); + sp14.z = sp20.y * sp20.z * (1.0 - cos(temp_f31 * M_PI / 180.0)) + sp20.x * sin(temp_f31 * M_PI / 180.0); + PSVECNormalize(&sp14, &sp14); + PSVECScale(&sp14, &lbl_80131030.unk0C, 10.0f); + var_r28 = CreateEffect(effectMdl[4], arg0, arg1->x, arg1->y, arg1->z, 20.0f, &lbl_80131030); + if (var_r28 == -1) { + break; + } + PSVECScale(&sp20, &sp8, -2.0 - 0.1 * frandmod(20)); + PSVECScale(&sp14, &sp14, 2.0f); + PSVECAdd(&sp14, &sp8, &lbl_80131068.unk0C); + var_r28 = CreateEffect(effectMdl[6], arg0, arg1->x, arg1->y, arg1->z, 20.0f, &lbl_80131068); + if (var_r28 == -1) { + break; + } + } +} + +static EffectParamData lbl_801310BC = { + 0, + 0x20, 0x20, 0xFF, 0xFF, + 0x80, 0xFF, 0x20, 0xFF, + 0.0f, 2.0f, 1.0f, + 0.95f, 0.95f, 0.95f, + 0.0f, + 0x00000000, + -0.2f, + -16.0f, + 0.06f +}; + +static EffectParamData lbl_801310F4 = { + 0, + 0x20, 0xE0, 0x20, 0xFF, + 0x20, 0xE0, 0x20, 0xFF, + 0.0f, 2.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 0.0f, + 0x00000000, + -0.2f, + -12.0f, + 0.05f +}; + +void fn_8004F058(s16 character) { + Mtx sp24; + Vec sp18; + Vec spC; + ModelData* temp_r31; + UnkCharInstanceStruct* temp_r30; + + temp_r30 = &charInstance[character]; + temp_r31 = &Hu3DData[temp_r30->unk00]; + Hu3DModelObjMtxGet(temp_r30->unk00, "test11_tex_we-ske_R_shoe1", sp24); + sp18.x = sp24[0][3]; + sp18.y = sp24[1][3]; + sp18.z = sp24[2][3]; + mtxRot(sp24, temp_r31->rot.x, temp_r31->rot.y, temp_r31->rot.z); + spC.x = sp24[0][2]; + spC.y = sp24[1][2]; + spC.z = sp24[2][2]; + PSVECScale(&spC, &spC, 30.0f); + PSVECAdd(&sp18, &spC, &sp18); + fn_8004F13C(temp_r31->camera, &sp18, &temp_r31->rot); +} + +void fn_8004F13C(s16 arg0, Vec *arg1, Vec *arg2) { + Mtx sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + float temp_f31; + s16 var_r28; + s16 i; + + mtxRot(sp2C, arg2->x, arg2->y, arg2->z); + sp20.x = sp2C[0][2]; + sp20.y = sp2C[1][2]; + sp20.z = sp2C[2][2]; + for (i = 0; i < 8; i++) { + temp_f31 = i * 45; + sp14.x = sp20.x * sp20.y * (1.0 - cos(temp_f31 * M_PI / 180.0)) - sp20.z * sin(temp_f31 * M_PI / 180.0); + sp14.y = sp20.y * sp20.y + (1.0f - sp20.y * sp20.y) * cos(temp_f31 * M_PI / 180.0); + sp14.z = sp20.y * sp20.z * (1.0 - cos(temp_f31 * M_PI / 180.0)) + sp20.x * sin(temp_f31 * M_PI / 180.0); + PSVECNormalize(&sp14, &sp14); + PSVECScale(&sp14, &lbl_801310BC.unk0C, 10.0f); + var_r28 = CreateEffect(effectMdl[4], arg0, arg1->x, arg1->y, arg1->z, 20.0f, &lbl_801310BC); + if (var_r28 == -1) { + break; + } + PSVECScale(&sp20, &sp8, -2.0 - 0.1 * frandmod(20)); + PSVECScale(&sp14, &sp14, 2.0f); + PSVECAdd(&sp14, &sp8, &lbl_801310F4.unk0C); + var_r28 = CreateEffect(effectMdl[6], arg0, arg1->x, arg1->y, arg1->z, 20.0f, &lbl_801310F4); + if (var_r28 == -1) { + break; + } + } +} + +void CharModelLayerSetAll2(s16 arg0) { + CharModelLayerSetAll(arg0); +} + +void CharModelVoiceEnableSet(s16 character, s16 motion, s32 flag) { + UnkCharInstanceStruct* temp_r31 = &charInstance[character]; + s16 i; + + if (temp_r31->unk00 == -1) { + return; + } + for (i = 0; i < 32; i++) { + if (temp_r31->unk0C[i] == motion) { + break; + } + } + if (i != 32) { + if (flag == 0) { + temp_r31->unk8C[i] |= 1; + } else { + temp_r31->unk8C[i] &= ~1; + } + } +} + +void fn_8004F52C(s16 character, s32 arg1) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + if (arg1 != 0) { + temp_r31->unkAC |= 8; + return; + } else { + temp_r31->unkAC &= ~8; + } +} + +void CharModelEffectEnableSet(s16 character, s32 arg1) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + if (character >= 8) { + if (arg1 == 0) { + lbl_801975B0[character] |= 0x10; + } else { + lbl_801975B0[character] &= ~0x10; + } + return; + } + if (arg1 == 0) { + temp_r31->unkAC |= 0x10; + } else { + temp_r31->unkAC &= ~0x10; + } +} + +s32 CharModelEffectNpcInit(s16 arg0, s16 arg1, s16 arg2, s16 arg3) { + Process *var_r24; + Process *var_r27; + s16 *var_r29; + + var_r24 = HuPrcCurrentGet(); + var_r27 = HuPrcChildCreate(UpdateNpcEffect, 0x64, 0x2000, 0, var_r24); + if (var_r27) { + var_r29 = HuMemDirectMallocNum(HEAP_SYSTEM, 4 * sizeof(s16), MEMORY_DEFAULT_NUM); + var_r27->user_data = var_r29; + var_r29[0] = arg0; + var_r29[1] = arg1; + var_r29[2] = arg2; + var_r29[3] = arg3; + InitEffect(); + } +} + +s32 CharModelEffectNpcInitSilent(s16 arg0, s16 arg1, s16 arg2) { + s32 sp10; + + CharModelEffectNpcInit(arg0, arg1, arg2, -1); + return sp10; +} + +static s8 lbl_80131146[] = { + 0x07, 0x20, 0x10, 0x28, + 0x01, 0x1E, 0xE7, 0xE7, + 0x01, 0x1E, 0x01, 0x1A, + 0x01, 0x14, 0x13, 0x20, + 0x02, 0x13 +}; + +static u16 lbl_80131158[] = { + 0x0051, 0x0053, + 0x0057, 0x0101, + 0x0059, 0x005B, + 0x0055, 0x0069, + 0x006A, +}; + +// Unused? +static s8 lbl_8013116A[] = { + 0x01, 0x20, 0x01, 0x15, + 0x0A, 0x1E, 0xE7, 0xE7, + 0x01, 0x1E, 0x01, 0x10, + 0x01, 0x11, 0xE7, 0xE7, + 0xE7, 0xE7 +}; + +static u16 lbl_8013117C[] = { + 0x0052, 0x0054, + 0x0058, 0x0101, + 0x005A, 0x005C, + 0x0056, 0x0069, + 0x006A +}; + +static s8 lbl_8013118E[] = { + 0x03, 0x37, 0xE7, 0xE7, + 0xE7, 0xE7, 0xE7, 0xE7, + 0xE7, 0xE7, 0x01, 0x1A, + 0xE7, 0xE7 +}; + +static u16 lbl_8013119C[] = { + 0x0051, 0x0053, + 0x0057, 0x0101, + 0x0059, 0x0068, + 0x0055 +}; + +static s8 lbl_801311AA[] = { + 0x04, 0x11, 0xE7, 0xE7, + 0xE7, 0xE7, 0xE7, 0xE7, + 0xE7, 0xE7, 0x01, 0x10, + 0xE7, 0xE7 +}; + +static u16 lbl_801311B8[] = { + 0x0052, 0x0054, + 0x0058, 0x0101, + 0x005A, 0x0067, + 0x0056 +}; + +static s8 lbl_801311C6[] = { + 0x01, 0x17, 0xE7, 0xE7, + 0xE7, 0xE7, 0xE7, 0xE7, + 0xE7, 0xE7, 0xE7, 0xE7, + 0xE7, 0xE7 +}; + +static u16 lbl_801311D4[] = { + 0x0051, 0x0053, + 0x0057, 0x0101, + 0x0059, 0x005B, + 0x0055 +}; + +static void UpdateNpcEffect(void) { + Vec sp2C; + ModelData *temp_r30; + s16 *temp_r27; + s16 temp_r25; + s16 temp_r26; + s16 temp_r28; + s16 i; + + temp_r27 = HuPrcCurrentGet()->user_data; + temp_r25 = temp_r27[0]; + temp_r26 = 0; + temp_r30 = &Hu3DData[temp_r27[0]]; + temp_r28 = temp_r27[3] - 8; + while (1) { + HuPrcVSleep(); + if (temp_r27[1] != Hu3DMotionIDGet(temp_r25)) { + continue; + } + if (temp_r30->attr & 1) { + continue; + } + temp_r26 = Hu3DMotionTimeGet(temp_r25); + switch (temp_r27[2]) { + case 0: + if (!(temp_r26 & 0xF) && !(lbl_801975B0[temp_r28] & 0x10)) { + effectDustParam.unk0C.x = 2.0 * -sin(temp_r30->rot.y * M_PI / 180.0); + effectDustParam.unk0C.y = 1.0 + 0.1 * frandmod(10); + effectDustParam.unk0C.z = 2.0 * -cos(temp_r30->rot.y * M_PI / 180.0); + sp2C.x = temp_r30->pos.x + (frandmod(50) - 25); + sp2C.y = temp_r30->pos.y; + sp2C.z = temp_r30->pos.z + (frandmod(50) - 25); + CreateEffectDust(temp_r25, sp2C.x, sp2C.y, sp2C.z, frandmod(10) + 30, &effectDustParam); + } + if (temp_r27[3] != -1) { + for (i = 0; i < 2; i++) { + if (lbl_80131146[temp_r28 * 2 + i] == temp_r26 * 2) { + HuAudFXPlay(lbl_80131158[temp_r28]); + break; + } + } + } + break; + case 1: + if (!(temp_r26 & 3) && !(lbl_801975B0[temp_r28] & 0x10)) { + effectDustParam.unk0C.x = 4.0 * -sin(temp_r30->rot.y * M_PI / 180.0); + effectDustParam.unk0C.y = 2.0 + 0.1 * frandmod(10); + effectDustParam.unk0C.z = 4.0 * -cos(temp_r30->rot.y * M_PI / 180.0); + sp2C.x = temp_r30->pos.x + (frandmod(50) - 25); + sp2C.y = temp_r30->pos.y; + sp2C.z = temp_r30->pos.z + (frandmod(50) - 25); + CreateEffectDust(temp_r25, sp2C.x, sp2C.y, sp2C.z, frandmod(10) + 30, &effectDustParam); + } + if (temp_r27[3] != -1) { + for (i = 0; i < 2; i++) { + if (lbl_80131146[temp_r28 * 2 + i] == temp_r26 * 2) { + HuAudFXPlay(lbl_8013117C[temp_r28]); + break; + } + } + } + break; + case 2: + if (temp_r28 != -1) { + if (!(temp_r26 & 0x1F) && !(lbl_801975B0[temp_r28] & 0x10)) { + effectDustParam.unk0C.x = 2.0 * -sin(temp_r30->rot.y * M_PI / 180.0); + effectDustParam.unk0C.y = 1.0 + 0.1 * frandmod(10); + effectDustParam.unk0C.z = 2.0 * -cos(temp_r30->rot.y * M_PI / 180.0); + sp2C.x = temp_r30->pos.x + (frandmod(50) - 25); + sp2C.y = temp_r30->pos.y; + sp2C.z = temp_r30->pos.z + (frandmod(50) - 25); + CreateEffectDust(temp_r25, sp2C.x, sp2C.y, sp2C.z, frandmod(10) + 30, &effectDustParam); + } + for (i = 0; i < 2; i++) { + if (lbl_8013118E[temp_r28 * 2 + i] == temp_r26 * 2) { + HuAudFXPlay(lbl_8013119C[temp_r28]); + break; + } + } + } + break; + case 3: + if (temp_r28 != -1) { + if (!(temp_r26 & 3) && !(lbl_801975B0[temp_r28] & 0x10)) { + effectDustParam.unk0C.x = 2.0 * -sin(temp_r30->rot.y * M_PI / 180.0); + effectDustParam.unk0C.y = 1.0 + 0.1 * frandmod(10); + effectDustParam.unk0C.z = 2.0 * -cos(temp_r30->rot.y * M_PI / 180.0); + sp2C.x = temp_r30->pos.x + (frandmod(50) - 25); + sp2C.y = temp_r30->pos.y; + sp2C.z = temp_r30->pos.z + (frandmod(50) - 25); + CreateEffectDust(temp_r25, sp2C.x, sp2C.y, sp2C.z, frandmod(10) + 30, &effectDustParam); + } + for (i = 0; i < 2; i++) { + if (lbl_801311AA[temp_r28 * 2 + i] == temp_r26 * 2) { + HuAudFXPlay(lbl_801311B8[temp_r28]); + break; + } + } + } + break; + case 4: + if (temp_r28 != -1) { + if (!(temp_r26 & 7) && !(lbl_801975B0[temp_r28] & 0x10)) { + effectDustParam.unk0C.x = 2.0 * -sin(temp_r30->rot.y * M_PI / 180.0); + effectDustParam.unk0C.y = 1.0 + 0.1 * frandmod(10); + effectDustParam.unk0C.z = 2.0 * -cos(temp_r30->rot.y * M_PI / 180.0); + sp2C.x = temp_r30->pos.x + (frandmod(50) - 25); + sp2C.y = temp_r30->pos.y; + sp2C.z = temp_r30->pos.z + (frandmod(50) - 25); + CreateEffectDust(temp_r25, sp2C.x, sp2C.y, sp2C.z, frandmod(10) + 30, &effectDustParam); + } + for (i = 0; i < 2; i++) { + if (lbl_801311C6[temp_r28 * 2 + i] == temp_r26 * 2) { + HuAudFXPlay(lbl_801311D4[temp_r28]); + break; + } + } + } + break; + case 5: + if (temp_r26 != 0) { + break; + } + if (lbl_801975B0[temp_r28] & 0x10) { + break; + } + for (i = 0; i < 8; i++) { + effectStarParam.unk0C.x = 10.0 * sin(45.0f * i * M_PI / 180.0) * temp_r30->scale.x; + effectStarParam.unk0C.y = 0.0f; + effectStarParam.unk0C.z = 10.0 * cos(45.0f * i * M_PI / 180.0) * temp_r30->scale.x; + CreateEffectStar(temp_r25, temp_r30->pos.x, temp_r30->pos.y + 10.0f * temp_r30->scale.x, temp_r30->pos.z, 40.0f, &effectStarParam); + } + for (i = 0; i < 8; i++) { + effectDustParam.unk0C.x = 4.0 * sin((45.0f * i + 22.5) * M_PI / 180.0) * temp_r30->scale.x; + effectDustParam.unk0C.y = 0.0f; + effectDustParam.unk0C.z = 4.0 * cos((45.0f * i + 22.5) * M_PI / 180.0) * temp_r30->scale.x; + CreateEffectDust(temp_r25, temp_r30->pos.x, temp_r30->pos.y + 10.0f * temp_r30->scale.x, temp_r30->pos.z, 20.0f, &effectDustParam); + } + if (temp_r28 != -1) { + HuAudFXPlay(0x61); + } + break; + } + } +} + +void CharModelStepTypeSet(s16 character, s32 arg1) { + UnkCharInstanceStruct *temp_r31 = &charInstance[character]; + + temp_r31->unkB0 = arg1; +} + +static s32 PlayStepFX(s16 character, s16 arg1, u8 arg2) { + UnkCharInstanceStruct *temp_r31; + ModelData *var_r28; + + temp_r31 = &charInstance[character]; + var_r28 = &Hu3DData[temp_r31->unk00]; + if (arg2 & 1) { + return; + } + if (temp_r31->unkB0 == 4) { + arg1 = 0x109; + } else if (temp_r31->unkB0 == 5) { + arg1 = 0x10B; + } else { + arg1 += temp_r31->unkB0; + } + if (temp_r31->unkAC & 8) { + return HuAudCharVoicePlayPos(character, arg1, &var_r28->pos); + } else { + return HuAudCharVoicePlay(character, arg1); + } +} diff --git a/src/game/data.c b/src/game/data.c index 5f55fd6f..3af1b340 100644 --- a/src/game/data.c +++ b/src/game/data.c @@ -1,5 +1,6 @@ #include "game/data.h" #include "game/armem.h" +#include "game/process.h" #include "dolphin/dvd.h" #define PTR_OFFSET(ptr, offset) (void *)(((u8 *)(ptr)+(u32)(offset))) @@ -11,7 +12,7 @@ static void **HuDataReadMultiSub(s32 *data_ids, BOOL use_num, s32 num); #define DATADIR_DEFINE(name, path) { path, -1 }, -static FileListEntry DataDirStat[DATADIR_COUNT+1] = { +static FileListEntry DataDirStat[] = { #include "datadir_table.h" { NULL, -1 } }; @@ -21,7 +22,7 @@ static FileListEntry DataDirStat[DATADIR_COUNT+1] = { u32 DirDataSize; static u32 DataDirMax; static s32 shortAccessSleep; -static DataReadStat ReadDataStat[DATA_MAX_READSTAT]; +static DataReadStat ATTRIBUTE_ALIGN(32) ReadDataStat[DATA_MAX_READSTAT]; void HuDataInit(void) { @@ -131,7 +132,7 @@ DataReadStat *HuDataDirRead(s32 data_num) return read_stat; } -DataReadStat *HuDataDirReadNum(s32 data_num, s32 num) +static DataReadStat *HuDataDirReadNum(s32 data_num, s32 num) { DataReadStat *read_stat; int status; @@ -544,8 +545,152 @@ void HuDataDirCloseNum(s32 num) } } +static s32 HuDataDVDdirDirectOpen(s32 data_id, DVDFileInfo *fileInfo) +{ + s32 dir = data_id >> 16; + if(dir >= (s32)DataDirMax) { + OSReport("data.c: Data Number Error(0x%08x)\n", data_id); + return 0; + } + if(!DVDFastOpen(DataDirStat[dir].file_id, fileInfo)) { + char panic_str[48]; + sprintf(panic_str, "HuDataDVDdirDirectOpen: File Open Error(%08x)", data_id); + OSPanic("data.c", 895, panic_str); + } + return 1; +} + +static s32 HuDataDVDdirDirectRead(DVDFileInfo *fileInfo, void *dest, s32 len, s32 offset) +{ + s32 result = DVDReadAsync(fileInfo, dest, len, offset, NULL); + if(result != 1) { + OSPanic("data.c", 904, "HuDataDVDdirDirectRead: File Read Error"); + } + while(DVDGetCommandBlockStatus(&fileInfo->cb)) { + if(shortAccessSleep) { + HuPrcVSleep(); + } + } + return result; +} + +static void *HuDataDecodeIt(void *buf_start, s32 buf_ofs, s32 num, HeapID heap) +{ + void *data_start; + s32 *buf; + s32 raw_len, comp_type; + + void *dest; + buf = (s32 *)((u8 *)buf_start+buf_ofs); + if((u32)buf & 0x3) { + u8 *data = (u8 *)buf; + raw_len = *data++ << 24; + raw_len += *data++ << 16; + raw_len += *data++ << 8; + raw_len += *data++; + comp_type = *data++ << 24; + comp_type += *data++ << 16; + comp_type += *data++ << 8; + comp_type += *data++; + data_start = data; + } else { + s32 *data = buf; + raw_len = *data++; + comp_type = *data++; + data_start = data; + } + switch(heap) { + case HEAP_MUSIC: + dest = HuMemDirectMalloc(HEAP_MUSIC, DATA_EFF_SIZE(raw_len)); + break; + + case HEAP_DATA: + dest = HuMemDirectMallocNum(HEAP_DATA, DATA_EFF_SIZE(raw_len), num); + break; + + case HEAP_DVD: + dest = HuMemDirectMallocNum(HEAP_DVD, DATA_EFF_SIZE(raw_len), num); + break; + + default: + dest = HuMemDirectMallocNum(HEAP_SYSTEM, DATA_EFF_SIZE(raw_len), num); + break; + } + if(dest) { + HuDecodeData(data_start, dest, raw_len, comp_type); + } + return dest; +} + + //Still to be decompiled void *HuDataReadNumHeapShortForce(s32 data_id, s32 num, HeapID heap) { - return NULL; -} \ No newline at end of file + DVDFileInfo fileInfo; + s32 *data_hdr; + s32 *file_data; + void *file_raw_buf; + s32 read_len; + s32 file_id; + s32 file_ofs; + s32 read_ofs; + s32 data_ofs; + void *ret; + s32 dir; + s32 data_len; + s32 file_max; + + if(!HuDataDVDdirDirectOpen(data_id, &fileInfo)) { + return NULL; + } + dir = (data_id >> 16) & 0xFFFF0000; + file_id = data_id & 0xFFFF; + file_ofs = (file_id*4)+4; + data_len = OSRoundUp32B(file_ofs+8); + file_data = HuMemDirectMalloc(HEAP_SYSTEM, data_len); + if(!HuDataDVDdirDirectRead(&fileInfo, file_data, data_len, 0)) { + HuMemDirectFree(file_data); + DVDClose(&fileInfo); + return NULL; + } + file_max = *file_data; + if(file_max <= file_id) { + HuMemDirectFree(file_data); + OSReport("data.c%d: Data Number Error(0x%08x)\n", 1005, data_id); + DVDClose(&fileInfo); + return NULL; + } + data_hdr = file_data; + data_hdr += file_id+1; + file_ofs = *data_hdr; + read_ofs = OSRoundDown32B(file_ofs); + if(file_max <= file_id+1) { + read_len = fileInfo.length; + data_ofs = read_len-read_ofs; + } else { + data_hdr++; + data_ofs = (*data_hdr)-read_ofs; + read_len = fileInfo.length; + } + read_len = OSRoundUp32B(data_ofs); + HuMemDirectFree(file_data); + file_raw_buf = HuMemDirectMalloc(HEAP_SYSTEM, (read_len+4) & ~0x3); + if(file_raw_buf == NULL) { + OSReport("data.c: couldn't allocate read buffer(0x%08x)\n", data_id); + DVDClose(&fileInfo); + return NULL; + } + if(!HuDataDVDdirDirectRead(&fileInfo, file_raw_buf, read_len, read_ofs)) { + HuMemDirectFree(file_raw_buf); + DVDClose(&fileInfo); + return NULL; + } + DVDClose(&fileInfo); + data_ofs = file_ofs-read_ofs; + ret = HuDataDecodeIt(file_raw_buf, data_ofs, num, heap); + HuMemDirectFree(file_raw_buf); + return ret; +} + +char lbl_8011FDA6[] = "** dcnt %d tmp %08x sp1 %08x\n"; +char lbl_8011FDC4[] = "** dcnt %d lastNum %08x\n"; \ No newline at end of file diff --git a/src/game/fault.c b/src/game/fault.c index b2e9efa4..f6043a78 100644 --- a/src/game/fault.c +++ b/src/game/fault.c @@ -1,13 +1,20 @@ -#include "game/gamework_data.h" +#include "game/fault.h" #include "stdarg.h" #include "stdio.h" typedef struct rgb_color { - s8 r; - s8 g; - s8 b; + u8 r; + u8 g; + u8 b; } RGBColor; +typedef struct xfb_geometry { + void* frame_buffers[4]; + u16 width; + u16 height; + u16 mode; +} XFBGeometry; + static RGBColor XFB_Colors[5] = { { 0x00, 0x80, 0x80 }, { 0xFF, 0x80, 0x80 }, @@ -16,15 +23,27 @@ static RGBColor XFB_Colors[5] = { { 0x40, 0x80, 0x80 } }; -s16 XFB_Geometry[6][2]; +#include "Ascii8x8_1bpp.inc" + +static XFBGeometry XFB_Geometry; + +static s32 (*XFB_putc)(u8 c, s32 x, s32 y); static RGBColor Draw_Color; -static s32 y_start; -static s32 x_start; -const char* lbl_801D34A0 = "OSPanic encounterd:"; +static s32 x_start; +static s32 y_start; + +static s32 XFB_putcProgressive(u8 arg0, s32 arg1, s32 arg2); +static s32 XFB_putcInterlace(u8 arg0, s32 arg1, s32 arg2); +static s32 XFB_puts(s8* arg0, s32 arg1, s32 arg2); +static s32 XFB_putcS(u8 arg0, s32 arg1, s32 arg2); +static void XFB_WriteBackCache(void); +static void XFB_CR(s32 arg0, s32* arg1, s32* arg2); void OSPanic(const char* file, int line, const char* msg, ...) { + static char* titleMes = "OSPanic encounterd:"; + va_list sp78; s32 sp74; s32 sp70; @@ -33,16 +52,329 @@ void OSPanic(const char* file, int line, const char* msg, ...) { sp74 = x_start = 0x10; sp70 = y_start = 0x20; - puts = XFB_puts(lbl_801D34A0, sp74, sp70); + puts = XFB_puts((s8*)titleMes, sp74, sp70); XFB_CR(puts + 1, &sp74, &sp70); sprintf(sp84, "%s:%d", file, line); - puts = XFB_puts(sp84, sp74, sp70); + puts = XFB_puts((s8*)sp84, sp74, sp70); XFB_CR(puts, &sp74, &sp70); va_start(sp78, msg); vsnprintf(sp84, 0x400U, msg, &sp78[0]); - puts = XFB_puts(sp84, sp74, sp70); + puts = XFB_puts((s8*)sp84, sp74, sp70); XFB_CR(puts, &sp74, &sp70); XFB_WriteBackCache(); PPCHalt(); - va_end(); -} \ No newline at end of file + va_end(sp78); +} + +void HuFaultInitXfbDirectDraw(GXRenderModeObj *mode) { + s32 i; + + for (i = 0; i < 4; i++) { + XFB_Geometry.frame_buffers[i] = 0; + } + + XFB_Geometry.width = 0; + XFB_Geometry.height = 0; + XFB_Geometry.mode = 0; + + XFB_putc = XFB_putcProgressive; + Draw_Color = XFB_Colors[1]; + + if (mode) { + XFB_Geometry.width = ((u16)mode->fbWidth + 0xF) & 0xFFFFFFF0; + XFB_Geometry.height = mode->xfbHeight; + XFB_Geometry.mode = mode->xFBmode; + + if (XFB_Geometry.mode == 0) { + XFB_putc = XFB_putcInterlace; + } else { + XFB_putc = XFB_putcProgressive; + } + } +} + +void HuFaultSetXfbAddress(s16 index, void* value) { + if (index >= 0 && index < 4) { + XFB_Geometry.frame_buffers[index] = value; + } +} + +static void XFB_WriteBackCache(void) { + s32 i; + void* frame_buffer; + u32 temp_r29; + + temp_r29 = XFB_Geometry.width * 2 * XFB_Geometry.height; + + if (temp_r29 != 0) { + for (i = 0; i < 4; i += 1) { + frame_buffer = XFB_Geometry.frame_buffers[i]; + + if (frame_buffer) { + DCStoreRange(frame_buffer, temp_r29); + } + } + } +} + +static void XFB_CR(s32 arg0, s32* x_ptr, s32* y_ptr) { + s32 temp_r30; + s32 y; + s32 x; + + x = *x_ptr; + y = *y_ptr; + + x = x_start; + y += 0x12; + + temp_r30 = arg0 & 7; + if (temp_r30 != 0) { + y += temp_r30 * 0x12; + } + + *x_ptr = x; + *y_ptr = y; +} + +static s32 XFB_puts(s8* message, s32 x, s32 y) { + s32 i; + s32 temp_r31; + s8 current_char; + + i = 0; + + do { + current_char = *message++; + + if (current_char == '\n') { + XFB_CR(0, &x, &y); + + i += 1; + } else { + temp_r31 = XFB_putcS(current_char, x, y); + + if (temp_r31 >= 0) { + if (temp_r31 != 0) { + temp_r31 -= 1; + + XFB_CR(temp_r31, &x, &y); + + i += temp_r31 + 1; + } + x += 0x10; + } else { + break; + } + } + } while(current_char != 0); + + return i; +} + +static s32 XFB_putcS(u8 c, s32 x, s32 y) { + RGBColor sp8; + s32 var_r26; + s32 var_r25; + s32 var_r27; + s32 var_r29; + RGBColor* temp_r3; + + var_r27 = 0; + sp8 = Draw_Color; + + if (x + 0x11 >= XFB_Geometry.width) { + XFB_CR(0, &x, &y); + var_r27++; + } + + Draw_Color = XFB_Colors[0]; + XFB_putc(c, x, y - 2); + XFB_putc(c, x, y + 2); + XFB_putc(c, x - 1, y); + XFB_putc(c, x + 1, y); + + Draw_Color = sp8; + XFB_putc(c, x, y); + + return var_r27; +} + +static s32 XFB_putcProgressive(u8 c, s32 x, s32 y) { + s32 result; + s32 temp_r20; + u8 red; + u8 blue; + u8 green; + s32 i; + s32 j; + s32 var_r23; + u8* var_r29; + s32 k; + s32 var_r27; + s32 var_r26; + u32 temp_r31; + u32 var_r30; + u32 var_r22; + u8* frame_buffer; + + result = 0; + + if (c == 0) { + return -1; + } + + if (x + 0x10 >= XFB_Geometry.width) { + y += 0x12; + x = x_start; + result = 1; + } + + if (y + 0x10 >= XFB_Geometry.height) { + return -1; + } + + red = Draw_Color.r; + green = Draw_Color.g; + blue = Draw_Color.b; + + temp_r20 = XFB_Geometry.width * 2; + var_r23 = (x & 0xFFFE) * 2 + y * temp_r20; + var_r29 = Ascii8x8_1bpp + (c * 8); + + i = 8; + + while (i != 0) { + j = 2; + + while (j != 0) { + for (k = 0; k < 4; k ++) { + frame_buffer = XFB_Geometry.frame_buffers[k]; + + if (frame_buffer != 0) { + frame_buffer += var_r23; + + var_r22 = *var_r29; + var_r30 = 0; + var_r26 = 0; + while (var_r26 < 0x10) { + if (var_r22 & 0xF != 0) { + var_r30 |= 3 << var_r26; + } + var_r26 += 2; + var_r22 >>= 1; + } + var_r27 = 8; + if ((s32) (x & 1) != 0) { + var_r30 *= 2; + var_r27 = 0xA; + } + + while (var_r27 != 0) { + if ((u32) (var_r30 & 3) != 0) { + frame_buffer[1] = blue; + frame_buffer[3] = green; + + if ((u32) (var_r30 & 1) != 0) { + frame_buffer[0] = red; + } + if ((u32) (var_r30 & 2) != 0) { + frame_buffer[2] = red; + } + } + var_r27 -= 1; + frame_buffer += 4; + var_r30 = var_r30 >> 2; + } + } + } + + j -= 1; + var_r23 += temp_r20; + } + i -= 1; + var_r29 += 1; + } + + return result; +} + +static s32 XFB_putcInterlace(u8 c, s32 x, s32 y) { + u8 red; + u8 blue; + u8 green; + s32 temp_r23; + s32 i; + s32 var_r25; + u8* var_r28; + s32 j; + s16 var_r29; + s32 var_r30; + u8* var_r31; + + if (c == 0) { + return -1; + } + + if (x + 8 >= XFB_Geometry.width || y + 8 >= XFB_Geometry.height) { + return -1; + } + + red = Draw_Color.r; + green = Draw_Color.g; + blue = Draw_Color.b; + + temp_r23 = XFB_Geometry.width * 2; + var_r25 = ((x & 0xFFFE) * 2) + ((y >> 1) * temp_r23); + var_r28 = Ascii8x8_1bpp + c * 8; + + i = 8; + + while (i != 0) { + for (j = 0; j < 4; j += 2) { + var_r30 = j; + + if ((s32) (y & 1) != 0) { + var_r30 += 1; + } + + var_r31 = XFB_Geometry.frame_buffers[var_r30]; + + if (var_r31) { + var_r31 = var_r31 + var_r25; + var_r29 = *var_r28; + var_r30 = 4; + + if (x & 1) { + var_r29 = (s16)var_r29 * 2; + var_r30 = 5; + } + + while (var_r30) { + if (var_r29 & 3) { + var_r31[1] = blue; + var_r31[3] = green; + + if (var_r29 & 1) { + var_r31[0] = red; + } + if (var_r29 & 2) { + var_r31[2] = red; + } + } + + var_r30 -= 1; + var_r31 += 4; + var_r29 >>= 2; + } + } + } + + i -= 1; + y += 1; + var_r28 += 1; + var_r25 += temp_r23; + } + + return 0; +} diff --git a/src/game/hsfdraw.c b/src/game/hsfdraw.c index fc130c03..3e2e6e31 100755 --- a/src/game/hsfdraw.c +++ b/src/game/hsfdraw.c @@ -6,7 +6,7 @@ #include "math.h" #include "string.h" -#define ABS(x) ((x < 0) ? -x : x) +#define ABS(x) (((x) < 0) ? -(x) : (x)) typedef struct { /* 0x00 */ ModelData *unk00; @@ -24,18 +24,9 @@ typedef struct { u32 unk0C; } DrawDataStruct; // Size 0x10 -typedef struct { - /* 0x00 */ s16 unk00; - /* 0x02 */ s16 unk02; - /* 0x04 */ s16 unk04[3][4]; // goes up to index [3][3] (union?) - /* 0x1C */ u32 unk1C; - /* 0x20 */ void *unk20; - /* 0x24 */ char unk24[0xC]; -} HsfdrawStruct02; // Size 0x30 - static void objCall(ModelData *arg0, HsfObject *arg1); static void objMesh(ModelData *arg0, HsfObject *arg1); -static void FaceDraw(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1); +static void FaceDraw(HsfdrawStruct00 *arg0, HsfFace *arg1); static void SetTevStageNoTex(HsfdrawStruct00 *arg0, HsfMaterial *arg1); static void SetTevStageTex(HsfdrawStruct00 *arg0, HsfMaterial *arg1); static GXTevKColorSel SetKColor(GXTevStageID arg0, u8 arg1); @@ -45,7 +36,7 @@ static void SetReflect(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2, u8 arg3); static void SetProjection(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2, s16 arg3, GXTexMapID arg4, u32 arg5); static void SetShadowTex(void); static void SetShadow(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2); -static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1); +static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfFace *arg1); static void LoadTexture(ModelData *arg0, HsfBitmap *arg1, HsfAttribute *arg2, s16 arg3); static void objNull(ModelData *arg0, HsfObject *arg1); static void objRoot(ModelData *arg0, HsfObject *arg1); @@ -55,10 +46,10 @@ static void objReplica(ModelData *arg0, HsfObject *arg1); static void ObjDraw(HsfdrawStruct00 *arg0); static void MDObjCall(HsfData *arg0, HsfObject *arg1); static void MDObjMesh(HsfData *arg0, HsfObject *arg1); -static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1); -static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3); -static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3); -static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1); +static void MDFaceDraw(HsfObject *arg0, HsfFace *arg1); +static s32 MakeCalcNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3); +static s32 MakeNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3); +static void MDFaceCnt(HsfObject *arg0, HsfFace *arg1); void GXResetWriteGatherPipe(void); @@ -249,7 +240,7 @@ static void objMesh(ModelData *arg0, HsfObject *arg1) { temp_r25 = arg1->constData; if (!(temp_r25->flags & 0x1000)) { if (CancelTRXF == 0) { - if (arg1->data.hook != 0 && hookIdx == -1) { + if (arg1->data.cenvCnt != 0 && hookIdx == -1) { temp_r21 = arg1 - temp_r20->object; PSMTXConcat(MTXBuf[0], temp_r20->matrix->data[temp_r21 + temp_r20->matrix->base_idx], MTXBuf[MTXIdx]); } else { @@ -429,7 +420,7 @@ s32 ObjCullCheck(HsfData *arg0, HsfObject *arg1, Mtx arg2) { } // TODO: not matching (https://decomp.me/scratch/54Pjw) -static void FaceDraw(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { +static void FaceDraw(HsfdrawStruct00 *arg0, HsfFace *arg1) { GXColor sp2C; void *sp28; Hu3DTexAnimDataStruct *sp24; @@ -453,7 +444,7 @@ static void FaceDraw(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { temp_r29 = arg0->unk00; temp_r20 = temp_r28->constData; kColorIdx = 0; - temp_r30 = &temp_r28->data.material[arg1->unk02 & 0xFFF]; + temp_r30 = &temp_r28->data.material[arg1->mat & 0xFFF]; temp_r19 = temp_r28->flags | temp_r30->flags; if (temp_r19 & 0x30) { if (temp_r19 & 0x10) { @@ -1651,7 +1642,7 @@ static void SetShadow(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2) { GXSetTevAlphaOp(arg1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); } -static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { +static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfFace *arg1) { HsfObject *temp_r31; ModelData *temp_r28; HsfConstData *temp_r27; @@ -1663,7 +1654,7 @@ static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { temp_r31 = arg0->unk04; temp_r28 = arg0->unk00; temp_r27 = temp_r31->constData; - temp_r29 = &temp_r31->data.material[arg1->unk02 & 0xFFF]; + temp_r29 = &temp_r31->data.material[arg1->mat & 0xFFF]; if (temp_r29 != materialBak) { if (!(temp_r27->flags & 0x400)) { drawCnt++; @@ -2079,7 +2070,7 @@ void Hu3DDrawPost(void) { float temp_f26; float temp_f25; LightData *temp_r22; - HsfdrawStruct02 *var_r27; + HsfFace *var_r27; Mtx sp150; Mtx sp120; Mtx spF0; @@ -2218,12 +2209,12 @@ void Hu3DDrawPost(void) { if (shadowModelDrawF == 0) { for (i = 0; i < temp_r24->count;) { FaceDraw(temp_r28, var_r27); - if (var_r27->unk00 == 4) { + if (var_r27->type == 4) { totalPolyCnt += DrawData[drawCnt - 1].unk08; i++; var_r27++; } else { - totalPolyCnt += DrawData[drawCnt - 1].unk08 * ((var_r27->unk00 & 7) == 3 ? 2 : 1); + totalPolyCnt += DrawData[drawCnt - 1].unk08 * ((var_r27->type & 7) == 3 ? 2 : 1); i += DrawData[drawCnt - 1].unk08; var_r27 += DrawData[drawCnt - 1].unk08; } @@ -2237,7 +2228,7 @@ void Hu3DDrawPost(void) { GXSetNumChans(1); for (i = 0; i < temp_r24->count;) { FaceDrawShadow(temp_r28, var_r27); - if (var_r27->unk00 == 4) { + if (var_r27->type == 4) { i++; var_r27++; } else { @@ -2277,7 +2268,7 @@ static void ObjDraw(HsfdrawStruct00 *arg0) { float temp_f26; LightData *temp_r24; DrawDataStruct *temp_r25; - HsfdrawStruct02 *var_r27; + HsfFace *var_r27; Mtx sp140; Mtx sp110; Mtx spE0; @@ -2360,13 +2351,13 @@ static void ObjDraw(HsfdrawStruct00 *arg0) { if (shadowModelDrawF == 0) { for (i = 0; i < temp_r26->count;) { FaceDraw(arg0, var_r27); - if (var_r27->unk00 == 4) { + if (var_r27->type == 4) { totalPolyCnt += DrawData[drawCnt - 1].unk08; i++; var_r27++; } else { temp_r25 = &DrawData[drawCnt - 1]; - if ((var_r27->unk00 & 7) == 3) { + if ((var_r27->type & 7) == 3) { var_r20 = 2; } else { var_r20 = 1; @@ -2385,7 +2376,7 @@ static void ObjDraw(HsfdrawStruct00 *arg0) { GXSetNumChans(1); for (i = 0; i < temp_r26->count;) { FaceDrawShadow(arg0, var_r27); - if (var_r27->unk00 == 4) { + if (var_r27->type == 4) { i++; var_r27++; } else { @@ -2441,7 +2432,7 @@ static void MDObjCall(HsfData *arg0, HsfObject *arg1) { static void MDObjMesh(HsfData *arg0, HsfObject *arg1) { HsfBuffer *temp_r29; - HsfdrawStruct02 *var_r28; + HsfFace *var_r28; s16 i; temp_r29 = arg1->data.face; @@ -2503,7 +2494,7 @@ HsfConstData *ObjConstantMake(HsfObject *arg0, u32 arg1) { return temp_r3; } -static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { +static void MDFaceDraw(HsfObject *arg0, HsfFace *arg1) { HsfMaterial *temp_r30; s16 *var_r24; s16 var_r26; @@ -2514,9 +2505,9 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { s32 var_r25; var_r26 = -1; - temp_r30 = &arg0->data.material[arg1->unk02 & 0xFFF]; - if (temp_r30 != materialBak || polyTypeBak != (arg1->unk00 & 7) || (arg1->unk00 & 7) == 4) { - polyTypeBak = arg1->unk00 & 7; + temp_r30 = &arg0->data.material[arg1->mat & 0xFFF]; + if (temp_r30 != materialBak || polyTypeBak != (arg1->type & 7) || (arg1->type & 7) == 4) { + polyTypeBak = arg1->type & 7; materialBak = temp_r30; DrawData[drawCnt].unk00 = (u32) DLBufP - (u32) DLBufStartP; GXBeginDisplayList(DLBufP, 0x20000); @@ -2558,60 +2549,60 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { Hu3DObjInfoP->flags |= 0x10000; } faceCnt = 0; - switch (arg1->unk00 & 7) { + switch (arg1->type & 7) { case 0: case 1: break; case 2: GXBegin(GX_TRIANGLES, GX_VTXFMT0, faceNumBuf[drawCnt]); for (var_r27 = 0; var_r27 < faceNumBuf[drawCnt] / 3; var_r27++, arg1++) { - GXUnknownu16(arg1->unk04[0][0]); + GXUnknownu16(arg1->indices[0][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[0][1]); + GXUnknownu16(arg1->indices[0][1]); } else { MakeCalcNBT(arg0, arg1, 0, 1); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[0][2]; + temp_r28 = arg1->indices[0][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[0][3]); + GXUnknownu16(arg1->indices[0][3]); } - GXUnknownu16(arg1->unk04[2][0]); + GXUnknownu16(arg1->indices[2][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[2][1]); + GXUnknownu16(arg1->indices[2][1]); } else { MakeNBT(arg0, arg1, 2, 0); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[2][2]; + temp_r28 = arg1->indices[2][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[2][3]); + GXUnknownu16(arg1->indices[2][3]); } - GXUnknownu16(arg1->unk04[1][0]); + GXUnknownu16(arg1->indices[1][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[1][1]); + GXUnknownu16(arg1->indices[1][1]); } else { MakeNBT(arg0, arg1, 1, 2); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[1][2]; + temp_r28 = arg1->indices[1][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[1][3]); + GXUnknownu16(arg1->indices[1][3]); } } faceCnt = faceNumBuf[drawCnt] / 3; @@ -2619,125 +2610,125 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { case 3: GXBegin(GX_QUADS, GX_VTXFMT0, faceNumBuf[drawCnt]); for (var_r27 = 0; var_r27 < faceNumBuf[drawCnt] / 4; var_r27++, arg1++) { - GXUnknownu16(arg1->unk04[0][0]); + GXUnknownu16(arg1->indices[0][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[0][1]); + GXUnknownu16(arg1->indices[0][1]); } else { MakeCalcNBT(arg0, arg1, 0, 1); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[0][2]; + temp_r28 = arg1->indices[0][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[0][3]); + GXUnknownu16(arg1->indices[0][3]); } - GXUnknownu16(arg1->unk04[2][0]); + GXUnknownu16(arg1->indices[2][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[2][1]); + GXUnknownu16(arg1->indices[2][1]); } else { MakeNBT(arg0, arg1, 2, 0); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[2][2]; + temp_r28 = arg1->indices[2][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[2][3]); + GXUnknownu16(arg1->indices[2][3]); } - GXUnknownu16(arg1->unk04[3][0]); + GXUnknownu16(arg1->indices[3][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[3][1]); + GXUnknownu16(arg1->indices[3][1]); } else { MakeNBT(arg0, arg1, 3, 2); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[3][2]; + temp_r28 = arg1->indices[3][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[3][3]); + GXUnknownu16(arg1->indices[3][3]); } - GXUnknownu16(arg1->unk04[1][0]); + GXUnknownu16(arg1->indices[1][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[1][1]); + GXUnknownu16(arg1->indices[1][1]); } else { MakeNBT(arg0, arg1, 1, 3); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[1][2]; + temp_r28 = arg1->indices[1][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[1][3]); + GXUnknownu16(arg1->indices[1][3]); } } faceCnt = faceNumBuf[drawCnt] / 4; break; case 4: GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, faceNumBuf[drawCnt]); - GXUnknownu16(arg1->unk04[0][0]); + GXUnknownu16(arg1->indices[0][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[0][1]); + GXUnknownu16(arg1->indices[0][1]); } else { MakeCalcNBT(arg0, arg1, 0, 1); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[0][2]; + temp_r28 = arg1->indices[0][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[0][3]); + GXUnknownu16(arg1->indices[0][3]); } - GXUnknownu16(arg1->unk04[2][0]); + GXUnknownu16(arg1->indices[2][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[2][1]); + GXUnknownu16(arg1->indices[2][1]); } else { MakeNBT(arg0, arg1, 2, 0); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[2][2]; + temp_r28 = arg1->indices[2][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[2][3]); + GXUnknownu16(arg1->indices[2][3]); } - GXUnknownu16(arg1->unk04[1][0]); + GXUnknownu16(arg1->indices[1][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[1][1]); + GXUnknownu16(arg1->indices[1][1]); } else { MakeNBT(arg0, arg1, 1, 2); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[1][2]; + temp_r28 = arg1->indices[1][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[1][3]); + GXUnknownu16(arg1->indices[1][3]); } - var_r24 = arg1->unk20; - for (var_r27 = 0; var_r27 < arg1->unk1C; var_r27++, var_r24 += 4) { + var_r24 = arg1->strip.data; + for (var_r27 = 0; var_r27 < arg1->strip.count; var_r27++, var_r24 += 4) { GXUnknownu16(var_r24[0]); if (var_r26 == -1) { GXUnknownu16(var_r24[1]); @@ -2755,7 +2746,7 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { GXUnknownu16(var_r24[3]); } } - faceCnt = arg1->unk1C + 1; + faceCnt = arg1->strip.count + 1; break; } temp_r3 = GXEndDisplayList(); @@ -2767,7 +2758,7 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { } } -static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) { +static s32 MakeCalcNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3) { Vec sp10; Vec *temp_r29; Vec *temp_r31; @@ -2777,10 +2768,10 @@ static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg s16 temp_r27; temp_r31 = arg0->data.vertex->data; - temp_r27 = arg1->unk04[arg2][1]; - temp_r25 = arg1->unk04[arg2][0]; - temp_r24 = arg1->unk04[arg3][0]; - if (arg0->data.hook != 0) { + temp_r27 = arg1->indices[arg2][1]; + temp_r25 = arg1->indices[arg2][0]; + temp_r24 = arg1->indices[arg3][0]; + if (arg0->data.cenvCnt != 0) { temp_r29 = arg0->data.normal->data; sp10.x = temp_r29[temp_r27].x; sp10.y = temp_r29[temp_r27].y; @@ -2802,7 +2793,7 @@ static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg GXPosition3s16(NBTT.x * 256.0f, NBTT.y * 256.0f, NBTT.z * 256.0f); } -static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) { +static s32 MakeNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3) { Vec sp10; Vec *temp_r30; Vec *spC; @@ -2810,8 +2801,8 @@ static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) { s16 temp_r28; spC = arg0->data.vertex->data; - temp_r28 = arg1->unk04[arg2][1]; - if (arg0->data.hook != 0) { + temp_r28 = arg1->indices[arg2][1]; + if (arg0->data.cenvCnt != 0) { temp_r30 = arg0->data.normal->data; sp10.x = temp_r30[temp_r28].x; sp10.y = temp_r30[temp_r28].y; @@ -2828,15 +2819,15 @@ static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) { GXPosition3s16(NBTT.x * 256.0f, NBTT.y * 256.0f, NBTT.z * 256.0f); } -static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1) { +static void MDFaceCnt(HsfObject *arg0, HsfFace *arg1) { HsfMaterial *temp_r30; s16 i; - temp_r30 = &arg0->data.material[arg1->unk02 & 0xFFF]; + temp_r30 = &arg0->data.material[arg1->mat & 0xFFF]; // Bug? Likely to be polyTypeBak != (arg1->unk00 & 7) - if (temp_r30 != materialBak || ((polyTypeBak != arg1->unk00) & 7) || (arg1->unk00 & 7) == 4) { + if (temp_r30 != materialBak || ((polyTypeBak != arg1->type) & 7) || (arg1->type & 7) == 4) { polySize = 4; - polyTypeBak = arg1->unk00 & 7; + polyTypeBak = arg1->type & 7; materialBak = temp_r30; matChgCnt++; if (DLFirstF != 0) { @@ -2858,7 +2849,7 @@ static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1) { polySize += 2; } } - switch (arg1->unk00 & 7) { + switch (arg1->type & 7) { case 0: OSReport("Error\n"); break; @@ -2877,9 +2868,9 @@ static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1) { break; case 4: triCnt++; - faceNumBuf[drawCnt] += arg1->unk1C + 3; + faceNumBuf[drawCnt] += arg1->strip.count + 3; DLTotalNum += polySize * 3; - DLTotalNum += polySize * arg1->unk1C; + DLTotalNum += polySize * arg1->strip.count; break; default: OSReport("Error\n"); diff --git a/src/game/hsfload.c b/src/game/hsfload.c index 88c10c51..1fe557d7 100644 --- a/src/game/hsfload.c +++ b/src/game/hsfload.c @@ -3,6 +3,8 @@ #include "ctype.h" #define AS_S16(field) (*((s16 *)&(field))) +#define AS_U16(field) (*((u16 *)&(field))) + GXColor rgba[100]; HsfHeader head; HsfData Model; @@ -401,7 +403,7 @@ static void FaceLoad(void) HsfFace *data; HsfFace *file_face_strip; HsfFace *new_face_strip; - HsfTristrip *strip; + u8 *strip; s32 i; s32 j; @@ -418,14 +420,14 @@ static void FaceLoad(void) new_face->name = SetName((u32 *)&file_face->name); new_face->count = file_face->count; new_face->data = (void *)((u32)data+(u32)temp_data); - strip = (HsfTristrip *)(&((HsfFace *)new_face->data)[new_face->count]); + strip = (u8 *)(&((HsfFace *)new_face->data)[new_face->count]); } new_face = temp_face; for(i=0; idata; for(j=0; jcount; j++, new_face_strip++, file_face_strip++) { - if(file_face_strip->type == 4) { - new_face_strip->strip.data = &strip[(u32)file_face_strip->strip.data]; + if(AS_U16(file_face_strip->type) == 4) { + new_face_strip->strip.data = (s16 *)(strip+(u32)file_face_strip->strip.data*(sizeof(s16)*4)); } } } @@ -892,14 +894,14 @@ static void MapAttrLoad(void) HsfMapAttr *mapattr_base; HsfMapAttr *mapattr_file; HsfMapAttr *mapattr_new; - s16 *data; + u16 *data; if(head.mapAttr.count) { mapattr_file = mapattr_base = (HsfMapAttr *)((u32)fileptr+head.mapAttr.ofs); mapattr_new = mapattr_base; Model.mapAttrCnt = head.mapAttr.count; Model.mapAttr = mapattr_base; - data = (s16 *)&mapattr_base[head.mapAttr.count]; + data = (u16 *)&mapattr_base[head.mapAttr.count]; for(i=0; idata = &data[(u32)mapattr_file->data]; } diff --git a/src/game/hsfman.c b/src/game/hsfman.c index 19b39d33..91f52d18 100644 --- a/src/game/hsfman.c +++ b/src/game/hsfman.c @@ -2063,10 +2063,10 @@ void Hu3DProjectionKill(s16 arg0) { Hu3DProjection[arg0].unk_04 = NULL; } -void Hu3DProjectionPosSet(s16 arg0, Vec arg1, Vec arg2, Vec arg3) { - Hu3DProjection[arg0].unk_14 = arg1; - Hu3DProjection[arg0].unk_20 = arg3; - Hu3DProjection[arg0].unk_2C = arg2; +void Hu3DProjectionPosSet(s16 arg0, Vec* arg1, Vec* arg2, Vec* arg3) { + Hu3DProjection[arg0].unk_14 = *arg1; + Hu3DProjection[arg0].unk_20 = *arg3; + Hu3DProjection[arg0].unk_2C = *arg2; } void Hu3DProjectionTPLvlSet(s16 arg0, f32 arg8) { diff --git a/src/game/init.c b/src/game/init.c index 465a5bef..06adbaad 100644 --- a/src/game/init.c +++ b/src/game/init.c @@ -1,4 +1,5 @@ #include "game/init.h" +#include "game/fault.h" #include "dolphin/os.h" #include "dolphin/gx.h" #include "dolphin/dvd.h" @@ -14,8 +15,6 @@ extern void HuAudInit(); extern void HuCardInit(); extern void HuARInit(); extern u32 frand(); -extern void HuFaultInitXfbDirectDraw(GXRenderModeObj *mode); -extern void HuFaultSetXfbAddress(int fb, void *addr); static GXRenderModeObj rmodeobj; diff --git a/src/game/main.c b/src/game/main.c index 1e0e3415..a528b60e 100644 --- a/src/game/main.c +++ b/src/game/main.c @@ -15,35 +15,34 @@ extern FileListEntry _ovltbl[]; u32 GlobalCounter; -u32 lbl_801D3A50; -u32 lbl_801D3A4C; -u32 lbl_801D3A48; -u32 lbl_801D3A44; -u32 lbl_801D3A40; -u32 lbl_801D3A3C; -u32 lbl_801D3A38; -u32 lbl_801D3A34; -u32 lbl_801D3A30; -u32 lbl_801D3A2C; -u32 lbl_801D3A28; -u32 lbl_801D3A24; -u32 lbl_801D3A20; -u32 lbl_801D3A1C; -u32 lbl_801D3A18; -u32 lbl_801D3A14; -u32 lbl_801D3A10; -u32 lbl_801D3A0C; -u32 lbl_801D3A08; +static u32 vcheck; +static u32 vmiss; +static u32 vstall; +static u32 top_pixels_in; +static u32 top_pixels_out; +static u32 bot_pixels_in; +static u32 bot_pixels_out; +static u32 clr_pixels_in; +static u32 total_copy_clks; +static u32 cp_req; +static u32 tc_req; +static u32 cpu_rd_req; +static u32 cpu_wr_req; +static u32 dsp_req; +static u32 io_req; +static u32 vi_req; +static u32 pe_req; +static u32 rf_req; +static u32 fi_req; s32 HuDvdErrWait; s32 SystemInitF; -void main(void) { - u32 sp14; - u32 sp10; - s32 spC; - s32 sp8; - s16 var_r31; - s32 temp_r30; +void main(void) +{ + u32 met0; + u32 met1; + s16 i; + s32 retrace; HuDvdErrWait = 0; SystemInitF = 0; @@ -58,14 +57,14 @@ void main(void) { HuDataInit(); HuPerfInit(); HuPerfCreate("USR0", 0xFF, 0xFF, 0xFF, 0xFF); - HuPerfCreate("USR1", 0, 0xFF, 0xFF, 0xFF); + HuPerfCreate("USR1", 0, 0xFF, 0xFF, 0xFF); WipeInit(RenderMode); - for (var_r31 = 0; var_r31 < 4; var_r31++) { - GWPlayerCfg[var_r31].character = -1; + for (i = 0; i < 4; i++) { + GWPlayerCfg[i].character = -1; } - omMasterInit(0, _ovltbl, 0x63, 1); + omMasterInit(0, _ovltbl, OVL_COUNT, OVL_BOOT); VIWaitForRetrace(); if (VIGetNextField() == 0) { @@ -73,7 +72,7 @@ void main(void) { VIWaitForRetrace(); } while (1) { - temp_r30 = VIGetRetraceCount(); + retrace = VIGetRetraceCount(); if (HuSoftResetButtonCheck() != 0 || HuDvdErrWait != 0) { continue; } @@ -100,28 +99,31 @@ void main(void) { pfDrawFonts(); HuPerfEnd(1); msmMusFdoutEnd(); - HuSysDoneRender(temp_r30); - GXReadGPMetric(&sp14, &sp10); - GXReadVCacheMetric(&lbl_801D3A50, &lbl_801D3A4C, &lbl_801D3A48); - GXReadPixMetric(&lbl_801D3A44, &lbl_801D3A40, &lbl_801D3A3C, &lbl_801D3A38, &lbl_801D3A34, &lbl_801D3A30); - GXReadMemMetric(&lbl_801D3A2C, &lbl_801D3A28, &lbl_801D3A24, &lbl_801D3A20, &lbl_801D3A1C, &lbl_801D3A18, &lbl_801D3A14, &lbl_801D3A10, &lbl_801D3A0C, &lbl_801D3A08); + HuSysDoneRender(retrace); + GXReadGPMetric(&met0, &met1); + GXReadVCacheMetric(&vcheck, &vmiss, &vstall); + GXReadPixMetric(&top_pixels_in, &top_pixels_out, &bot_pixels_in, &bot_pixels_out, &clr_pixels_in, &total_copy_clks); + GXReadMemMetric(&cp_req, &tc_req, &cpu_rd_req, &cpu_wr_req, &dsp_req, &io_req, &vi_req, &pe_req, &rf_req, &fi_req); HuPerfEnd(2); GlobalCounter++; } } -void HuSysVWaitSet(s16 arg0) { - minimumVcount = arg0; - minimumVcountf = arg0; +void HuSysVWaitSet(s16 vcount) +{ + minimumVcount = vcount; + minimumVcountf = vcount; } -s16 HuSysVWaitGet(void) { +s16 HuSysVWaitGet(s16 param) +{ return (s16) minimumVcount; } s32 rnd_seed = 0x0000D9ED; -s32 rand8(void) { +s32 rand8(void) +{ rnd_seed = (rnd_seed * 0x41C64E6D) + 0x3039; - return (u8)(((rnd_seed + 1) >> 0x10) & 0xFF); + return (u8)(((rnd_seed + 1) >> 16) & 0xFF); } diff --git a/src/game/mapspace.c b/src/game/mapspace.c new file mode 100755 index 00000000..47c9293b --- /dev/null +++ b/src/game/mapspace.c @@ -0,0 +1,911 @@ +#include "game/mapspace.h" +#include "game/hsfman.h" + +#include "math.h" + +extern void HuSetVecF(Vec*, double, double, double); + +static BOOL PolygonRangeCheck(HsfMapAttr *arg0, float arg1, float arg2, float *arg3, float arg4); +static s32 DefIfnnerMapCircle(Vec *arg0, s16 *arg1, Vec *arg2, Vec *arg3); +static s32 CalcPPLength(float *arg0, s16 *arg1, Vec *arg2); +static float MapIflnnerCalc(float arg0, float arg1, float arg2, Vec *arg3, Vec *arg4, Vec *arg5); +static float MapCalcPoint(float arg0, float arg1, float arg2, Vec *arg3, u16 *arg4); +static BOOL AreaCheck(float arg0, float arg1, u16 *arg2, Vec *arg3); +static s32 MapIflnnerTriangle(float arg0, float arg1, u16 *arg2, Vec *arg3); +static s32 MapIflnnerQuadrangle(float arg0, float arg1, u16 *arg2, Vec *arg3); +static BOOL GetPolygonCircleMtx(s16 *arg0, Vec *arg1, float *arg2, float *arg3); +static s32 PrecalcPntToTriangle(Vec *arg0, Vec *arg1, Vec *arg2, Vec* arg3, Vec *arg4, Vec *arg5); +static void DefSetHitFace(float arg0, float arg1, float arg2); + +omObjData *MapObject[16]; +Mtx MapMT; +Mtx MapMTR; +static Vec MTRAdd; +static Vec FieldVec; +s32 ColisionIdx[10][3]; +Vec HitFaceVec[32]; +static Vec OldXYZ; +Vec HitFace[32]; +u8 CharObject[0x30]; + +float AddX; +float AddZ; +s32 nMap; +s32 nChar; +s32 HitFaceCount; +static HsfData *AttrHsf; +static Vec *topvtx; +s32 ColisionCount; + +void MapWall(float arg0, float arg1, float arg2, float arg3) { + float sp28[4]; + float sp18[4]; + float var_f31; + float var_f30; + float var_f29; + omObjData *var_r25; + ModelData *var_r26; + HsfData *temp_r29; + HsfMapAttr *sp14; + HsfMapAttr *var_r31; + s32 temp_r24; + s32 i; + s32 j; + + for (i = 0; i < nMap; i++) { + var_r25 = MapObject[i]; + temp_r24 = MapObject[i]->model[0]; + sp18[0] = sp28[0] = arg1; + sp18[1] = sp28[1] = arg2; + sp18[2] = sp28[2] = arg3; + sp18[3] = sp28[3] = arg0; + var_f31 = sp28[3]; + CharRotInv(MapMT, MapMTR, (Vec*) sp18, var_r25); + ColisionCount = 0; + HitFaceCount = 0; + var_r26 = &Hu3DData[temp_r24]; + temp_r29 = var_r26->hsfData; + AttrHsf = temp_r29; + sp14 = AttrHsf->mapAttr; + var_r31 = temp_r29->mapAttr; + for (j = 0; j < temp_r29->mapAttrCnt; j++, var_r31++) { + var_f30 = sp18[0]; + var_f29 = sp18[2]; + sp18[3] = arg0; + if (var_r31->minX <= var_f30 + var_f31 && var_r31->maxX > var_f30 - var_f31 + && var_r31->minZ <= var_f29 + var_f31 && var_r31->maxZ > var_f29 - var_f31) { + MapWallCheck(sp28, sp18, var_r31); + } + } + } +} + +void MapWallCheck(float *arg0, float *arg1, HsfMapAttr *arg2) { + u32 var_r30; + u16 temp_r29; + u16 *var_r31; + s32 var_r28; + Mtx sp10; + + var_r28 = 0; + var_r28 = 0; + topvtx = AttrHsf->vertex->data; + var_r31 = arg2->data; + MTRAdd.x = AddX; + MTRAdd.z = AddZ; + MTRAdd.y = 0.0f; + PSMTXInvXpose(MapMT, sp10); + PSMTXMultVec(sp10, &MTRAdd, &MTRAdd); + for (var_r30 = 0; var_r30 < arg2->dataLen;) { + temp_r29 = *var_r31; + if (temp_r29 & 0x8000) { + GetPolygonCircleMtx((s16*) var_r31, topvtx, arg0, arg1); + var_r28++; + } + var_r30 += (temp_r29 & 0xFF) + 1; + var_r31 += (temp_r29 & 0xFF) + 1; + } +} + +float MapPos(float arg0, float arg1, float arg2, float arg3, Vec *arg4) { + Vec sp14; + float var_f31; + float var_f29; + float sp10; + float var_f28; + HsfMapAttr *var_r29; + ModelData *var_r24; + omObjData *temp_r27; + s32 i; + s32 j; + HsfData *temp_r25; + Mtx sp20; + + var_f31 = -100000.0f; + ColisionCount = 0; + for (i = 0; i < nMap; i++) { + temp_r27 = MapObject[i]; + var_r24 = &Hu3DData[*temp_r27->model]; + temp_r25 = var_r24->hsfData; + sp14.x = arg0; + sp14.y = arg1; + sp14.z = arg2; + CharRotInv(MapMT, MapMTR, &sp14, temp_r27); + var_f29 = sp14.x; + var_f28 = sp14.z; + AttrHsf = temp_r25; + var_r29 = AttrHsf->mapAttr; + for (j = 0; j < temp_r25->mapAttrCnt; j++, var_r29++) { + if (var_r29->minX <= var_f29 && var_r29->maxX >= var_f29 + && var_r29->minZ <= var_f28 && var_r29->maxZ >= var_f28 + && PolygonRangeCheck(var_r29, var_f29, var_f28, &sp10, arg1 + arg3) == TRUE) { + sp14.x = var_f29; + sp14.y = sp10; + sp14.z = var_f28; + PSMTXMultVec(MapMT, &sp14, &sp14); + sp10 = sp14.y; + if (sp10 > arg1 + arg3 || fabs(arg1 - sp10) > fabs(arg1 - var_f31)) { + continue; + } + var_f31 = sp10; + arg4->x = FieldVec.x; + arg4->y = FieldVec.y; + arg4->z = FieldVec.z; + PSMTXInvXpose(MapMT, sp20); + PSMTXMultVec(sp20, arg4, arg4); + var_f31 = sp14.y; + } + } + } + if (var_f31 == -100000.0f) { + arg4->x = 0.0f; + arg4->y = 1.0f; + arg4->x = 0.0f; + return arg1; + } else { + return var_f31; + } +} + +BOOL PolygonRangeCheck(HsfMapAttr *arg0, float arg1, float arg2, float *arg3, float arg4) { + Vec sp20; + float temp_f29; + float var_f27; + u16 *var_r31; + u16 temp_r29; + s32 var_r28; + s32 var_r27; + s32 i; + + var_r28 = 0; + var_r27 = 0; + var_f27 = 100000.0f; + topvtx = AttrHsf->vertex->data; + var_r31 = arg0->data; + for (i = 0; i < arg0->dataLen;) { + temp_r29 = *var_r31; + if (temp_r29 & 0x8000) { + i += (temp_r29 & 0xFF) + 1; + var_r31 += (temp_r29 & 0xFF) + 1; + } else { + switch (temp_r29 & 0xFF) { + case 1: + i += 2; + var_r31 += 2; + break; + case 2: + i += 3; + var_r31 += 3; + break; + case 3: + if (AreaCheck(arg1, arg2, var_r31, topvtx) == TRUE) { + var_r28++; + if (MapIflnnerTriangle(arg1, arg2, var_r31, topvtx) == 1) { + temp_f29 = MapCalcPoint(arg1, 0.0f, arg2, topvtx, var_r31); + sp20.x = arg1; + sp20.y = temp_f29; + sp20.z = arg2; + PSMTXMultVec(MapMT, &sp20, &sp20); + if (arg4 > sp20.y && var_f27 > fabs(arg4 - sp20.y)) { + var_f27 = fabs(arg4 - sp20.y); + *arg3 = temp_f29; + var_r27 = 1; + } + } + } + i += 4; + var_r31 += 4; + break; + case 4: + if (AreaCheck(arg1, arg2, var_r31, topvtx) == TRUE) { + var_r28++; + if (MapIflnnerQuadrangle(arg1, arg2, var_r31, topvtx) == 1) { + temp_f29 = MapCalcPoint(arg1, 0.0f, arg2, topvtx, var_r31); + sp20.x = arg1; + sp20.y = temp_f29; + sp20.z = arg2; + PSMTXMultVec(MapMT, &sp20, &sp20); + if (arg4 > sp20.y) { + if (var_f27 > fabs(arg4 - sp20.y)) { + var_f27 = fabs(arg4 - sp20.y); + *arg3 = temp_f29; + var_r27 = 1; + } + } + } + } + i += 5; + var_r31 += 5; + break; + default: + i++; + var_r31++; + break; + } + } + } + if (var_r27 != 0) { + return TRUE; + } else { + return FALSE; + } +} + +static s32 DefIfnnerMapCircle(Vec *arg0, s16 *arg1, Vec *arg2, Vec *arg3) { + float temp_f30; + float temp_f29; + float temp_f28; + float var_f31; + s32 var_r28; + s32 var_r27; + s32 var_r25; + + temp_f30 = arg0->x; + temp_f29 = arg0->y; + temp_f28 = arg0->z; + var_r27 = *arg1 & 0xFF; + arg1++; + if (var_r27 == 3) { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[0]], &arg2[arg1[1]], arg3); + if (var_f31 > 0.0f) { + for (var_r28 = 1; var_r28 < var_r27; var_r28++) { + var_r25 = (var_r28 + 1) % var_r27; + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[var_r28]], &arg2[arg1[var_r25]], arg3); + if (var_f31 < 0.0f) { + return 0; + } + } + return 1; + } else { + for (var_r28 = 1; var_r28 < var_r27; var_r28++) { + var_r25 = (var_r28 + 1) % var_r27; + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[var_r28]], &arg2[arg1[var_r25]], arg3); + if (var_f31 > 0.0f) { + return 0; + } + } + return 1; + } + } else if (var_r27 == 4) { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[0]], &arg2[arg1[2]], arg3); + if (var_f31 > 0.0f) { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[2]], &arg2[arg1[3]], arg3); + if (var_f31 < 0.0f) { + var_r27 = 1; + } else { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[3]], &arg2[arg1[0]], arg3); + if (var_f31 < 0.0f) { + var_r27 = 1; + } + } + } else { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[2]], &arg2[arg1[3]], arg3); + if (var_f31 > 0.0f) { + var_r27 = 1; + } else { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[3]], &arg2[arg1[0]], arg3); + if (var_f31 > 0.0f) { + var_r27 = 1; + } + } + } + if (var_r27 != 0) { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[0]], &arg2[arg1[3]], arg3); + if (var_f31 > 0.0f) { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[3]], &arg2[arg1[1]], arg3); + if (var_f31 < 0.0f) { + return 0; + } + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[1]], &arg2[arg1[0]], arg3); + if (var_f31 < 0.0f) { + return 0; + } + } else { + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[3]], &arg2[arg1[1]], arg3); + if (var_f31 > 0.0f) { + return 0; + } + var_f31 = MapIflnnerCalc(temp_f30, temp_f29, temp_f28, &arg2[arg1[1]], &arg2[arg1[0]], arg3); + if (var_f31 > 0.0f) { + return 0; + } + } + } + } + return 0; +} + +static inline void MapspaceInlineFunc00(Vec *arg0) { + float sp24; + float sp28; + float sp2C; + float sp14; + + sp24 = arg0->x; + sp28 = arg0->y; + sp2C = arg0->z; + sp14 = sqrtf(sp24 * sp24 + sp28 * sp28 + sp2C * sp2C); + if (sp14 != 0.0f) { + arg0->x /= sp14; + arg0->y /= sp14; + arg0->z /= sp14; + } +} + +static inline void MapspaceInlineFunc01(Vec *arg0, Vec *arg1, Vec *arg2, Vec *arg3) { + float sp48; + float sp4C; + float sp50; + float temp_f18; + float temp_f19; + float temp_f20; + + sp48 = arg2->x - arg1->x; + sp4C = arg2->y - arg1->y; + sp50 = arg2->z - arg1->z; + temp_f18 = arg3->x - arg1->x; + temp_f19 = arg3->y - arg1->y; + temp_f20 = arg3->z - arg1->z; + arg0->x = sp4C * temp_f20 - sp50 * temp_f19; + arg0->y = sp50 * temp_f18 - sp48 * temp_f20; + arg0->z = sp48 * temp_f19 - sp4C * temp_f18; + MapspaceInlineFunc00(arg0); +} + +static s32 CalcPPLength(float *arg0, s16 *arg1, Vec *arg2) { + Vec *temp_r29; + Vec sp68; + float temp_f25; + float temp_f24; + float temp_f23; + float temp_f22; + float temp_f21; + float sp5C; + float sp58; + float sp54; + s16 temp_r24; + s16 temp_r22; + s32 var_r23; + + var_r23 = -1; + temp_r24 = arg1[0]; + if (!(temp_r24 & 0x8000)) { + return 0; + } + if ((temp_r24 & 0xFF) == 4) { + MapspaceInlineFunc01(&sp68, &arg2[arg1[1]], &arg2[arg1[4]], &arg2[arg1[3]]); + } else { + MapspaceInlineFunc01(&sp68, &arg2[arg1[1]], &arg2[arg1[2]], &arg2[arg1[3]]); + } + temp_r22 = arg1[1]; + temp_r29 = &arg2[temp_r22]; + sp5C = temp_r29->x; + sp58 = temp_r29->y; + sp54 = temp_r29->z; + temp_f24 = sp5C - arg0[0]; + temp_f23 = sp58 - arg0[1]; + temp_f22 = sp54 - arg0[2]; + temp_f21 = sp68.x * temp_f24 + sp68.y * temp_f23 + sp68.z * temp_f22; + if (temp_f21 >= 0.0f) { + var_r23 = 1; + } + if (fabs(temp_f21) > arg0[3]) { + return 0; + } + temp_f25 = sp68.x * temp_f24 + sp68.y * temp_f23 + sp68.z * temp_f22; + arg0[0] += sp68.x * temp_f25; + arg0[1] += sp68.y * temp_f25; + arg0[2] += sp68.z * temp_f25; + return var_r23; +} + +static float MapIflnnerCalc(float arg0, float arg1, float arg2, Vec *arg3, Vec *arg4, Vec *arg5) { + float temp_f31; + float temp_f30; + float temp_f29; + float temp_f28; + float temp_f27; + float temp_f26; + float temp_f25; + + temp_f31 = arg3->x - arg0; + temp_f30 = arg3->y - arg1; + temp_f29 = arg3->z - arg2; + temp_f28 = arg4->x - arg0; + temp_f27 = arg4->y - arg1; + temp_f26 = arg4->z - arg2; + temp_f25 = arg5->x * (temp_f30 * temp_f26 - temp_f29 * temp_f27) + + arg5->y * (temp_f29 * temp_f28 - temp_f31 * temp_f26) + + arg5->z * (temp_f31 * temp_f27 - temp_f30 * temp_f28); + return temp_f25; +} + +static float MapCalcPoint(float arg0, float arg1, float arg2, Vec *arg3, u16 *arg4) { + Vec sp40; + float sp3C; + float sp38; + float sp34; + float sp30; + float sp2C; + float sp28; + float var_f28; + float var_f26; + float var_f25; + float var_f27; + float var_f24; + s32 temp_r27; + Vec *temp_r30; + + temp_r27 = ColisionCount - 1; + temp_r30 = &arg3[ColisionIdx[temp_r27][0]]; + sp34 = temp_r30->x; + sp38 = temp_r30->y; + sp3C = temp_r30->z; + sp30 = arg0; + var_f26 = arg1; + sp2C = arg2; + sp28 = 1.0f; + MapspaceInlineFunc01(&sp40, &arg3[ColisionIdx[temp_r27][0]], &arg3[ColisionIdx[temp_r27][1]], &arg3[ColisionIdx[temp_r27][2]]); + var_f25 = sp40.x; + var_f27 = sp40.y; + var_f24 = sp40.z; + FieldVec.x = var_f25; + FieldVec.y = var_f27; + FieldVec.z = var_f24; + var_f28 = var_f25 * (sp34 - sp30) + var_f27 * (sp38 - var_f26) + var_f24 * (sp3C - sp2C); + var_f28 /= var_f27; + return var_f26 + sp28 * var_f28; +} + +static BOOL AreaCheck(float arg0, float arg1, u16 *arg2, Vec *arg3) { + float var_f31; + float var_f30; + float var_f29; + float var_f28; + s32 var_r29; + s32 temp_r31; + s32 i; + + var_f31 = var_f30 = -100000.0f; + var_f29 = var_f28 = 100000.0f; + var_r29 = *arg2 & 0xFF; + arg2++; + for (i = 0; i < var_r29; i++, arg2++) { + temp_r31 = *arg2; + if (var_f29 > arg3[temp_r31].x) { + var_f29 = arg3[temp_r31].x; + } + if (var_f31 < arg3[temp_r31].x) { + var_f31 = arg3[temp_r31].x; + } + if (var_f28 > arg3[temp_r31].z) { + var_f28 = arg3[temp_r31].z; + } + if (var_f30 < arg3[temp_r31].z) { + var_f30 = arg3[temp_r31].z; + } + } + if (var_f29 <= arg0 && var_f31 >= arg0 + && var_f28 <= arg1 && var_f30 >= arg1) { + return TRUE; + } else { + return FALSE; + } +} + +static inline float MapspaceInlineFunc02(float arg0, float arg1, Vec *arg2, Vec *arg3) { + float sp54; + float sp58; + float sp5C; + float sp60; + float sp64; + + sp54 = arg2->x - arg0; + sp58 = arg2->z - arg1; + sp5C = arg3->x - arg0; + sp60 = arg3->z - arg1; + sp64 = -(sp58 * sp5C - sp54 * sp60); + return sp64; +} + +static s32 MapIflnnerTriangle(float arg0, float arg1, u16 *arg2, Vec *arg3) { + Vec sp68; + float var_f29; + s32 var_r21; + s32 i; + + MapspaceInlineFunc01(&sp68, &arg3[arg2[1]], &arg3[arg2[2]], &arg3[arg2[3]]); + if (sp68.y == 0.0f) { + return 0; + } + arg2++; + var_f29 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[0]], &arg3[arg2[1]]); + if (var_f29 > 0.0f) { + for (i = 1; i < 3; i++) { + var_r21 = (i + 1) % 3; + var_f29 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[i]], &arg3[arg2[var_r21]]); + if (var_f29 < 0.0f) { + return 0; + } + } + } else { + for (i = 1; i < 3; i++) { + var_r21 = (i + 1) % 3; + var_f29 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[i]], &arg3[arg2[var_r21]]); + if (var_f29 > 0.0f) { + return 0; + } + } + } + ColisionIdx[ColisionCount][0] = arg2[0]; + ColisionIdx[ColisionCount][1] = arg2[1]; + ColisionIdx[ColisionCount][2] = arg2[2]; + ColisionCount++; + return 1; +} + +static s32 MapIflnnerQuadrangle(float arg0, float arg1, u16 *arg2, Vec *arg3) { + Vec sp158; + float var_f31; + s32 var_r28; + + MapspaceInlineFunc01(&sp158, &arg3[arg2[1]], &arg3[arg2[2]], &arg3[arg2[3]]); + if (sp158.y == 0.0f) { + return 0; + } + var_r28 = 0; + arg2++; + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[0]], &arg3[arg2[3]]); + if (var_f31 > 0.0f) { + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[3]], &arg3[arg2[2]]); + if (var_f31 < 0.0f) { + var_r28 = 1; + } else { + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[2]], &arg3[arg2[0]]); + if (var_f31 < 0.0f) { + var_r28 = 1; + } + } + } else { + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[3]], &arg3[arg2[2]]); + if (var_f31 > 0.0f) { + var_r28 = 1; + } else { + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[2]], &arg3[arg2[0]]); + if (var_f31 > 0.0f) { + var_r28 = 1; + } + } + } + if (var_r28 == 0) { + ColisionIdx[ColisionCount][0] = arg2[0]; + ColisionIdx[ColisionCount][1] = arg2[3]; + ColisionIdx[ColisionCount][2] = arg2[2]; + ColisionCount++; + return 1; + } + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[0]], &arg3[arg2[1]]); + if (var_f31 > 0.0f) { + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[1]], &arg3[arg2[3]]); + if (var_f31 < 0.0f) { + return 0; + } + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[3]], &arg3[arg2[0]]); + if (var_f31 < 0.0f) { + return 0; + } + } else { + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[1]], &arg3[arg2[3]]); + if (var_f31 > 0.0f) { + return 0; + } + var_f31 = MapspaceInlineFunc02(arg0, arg1, &arg3[arg2[3]], &arg3[arg2[0]]); + if (var_f31 > 0.0f) { + return 0; + } + } + ColisionIdx[ColisionCount][0] = arg2[0]; + ColisionIdx[ColisionCount][1] = arg2[1]; + ColisionIdx[ColisionCount][2] = arg2[3]; + ColisionCount++; + return 1; +} + +static inline s32 MapspaceInlineFunc03(float *spE0, s16 *temp_r31, Vec *arg1) { + Vec spAC; + Vec *temp_r21; + float sp70; + float sp74; + float sp78; + float sp7C; + s16 sp8; + + MapspaceInlineFunc01(&spAC, &arg1[temp_r31[0]], &arg1[temp_r31[1]], &arg1[temp_r31[2]]); + sp8 = temp_r31[1]; + temp_r21 = &arg1[sp8]; + sp70 = temp_r21->x; + sp74 = temp_r21->y; + sp78 = temp_r21->z; + sp70 -= spE0[0]; + sp74 -= spE0[1]; + sp78 -= spE0[2]; + sp7C = spAC.x * sp70 + spAC.y * sp74 + spAC.z * sp78; + return (sp7C < 0.0f) ? -1 : 1; +} + +static BOOL GetPolygonCircleMtx(s16 *arg0, Vec *arg1, float *arg2, float *arg3) { + Vec sp144[4]; + Vec sp120[3]; + float spE0[4]; + float spD0[4]; + float temp_f31; + float temp_f30; + float var_f21; + Vec spC4; + Vec spB8; + s32 spA8; + float spA4; + s32 spA0; + BOOL var_r17; + s16 *temp_r31; + Vec *temp_r29; + Mtx spF0; + + spA8 = 0; + spD0[0] = spE0[0] = arg3[0] + MTRAdd.x; + spD0[1] = spE0[1] = arg3[1]; + spD0[2] = spE0[2] = arg3[2] + MTRAdd.z; + spD0[3] = spE0[3] = arg3[3]; + temp_r31 = arg0 + 1; + if ((spA0 = CalcPPLength(spE0, arg0, arg1)) == 0) { + return 0; + } + spC4.x = spC4.y = spC4.z = 0.0f; + if ((arg0[0] & 0xFF) == 4) { + sp144[0].x = arg1[temp_r31[0]].x; + sp144[0].y = arg1[temp_r31[0]].y; + sp144[0].z = arg1[temp_r31[0]].z; + sp144[1].x = arg1[temp_r31[1]].x; + sp144[1].y = arg1[temp_r31[1]].y; + sp144[1].z = arg1[temp_r31[1]].z; + sp144[2].x = arg1[temp_r31[2]].x; + sp144[2].y = arg1[temp_r31[2]].y; + sp144[2].z = arg1[temp_r31[2]].z; + sp144[3].x = arg1[temp_r31[3]].x; + sp144[3].y = arg1[temp_r31[3]].y; + sp144[3].z = arg1[temp_r31[3]].z; + var_r17 = Hitcheck_Quadrangle_with_Sphere(sp144, (Vec*) spD0, spE0[3], &spC4); + } else { + sp120[0].x = arg1[temp_r31[0]].x; + sp120[0].y = arg1[temp_r31[0]].y; + sp120[0].z = arg1[temp_r31[0]].z; + sp120[1].x = arg1[temp_r31[1]].x; + sp120[1].y = arg1[temp_r31[1]].y; + sp120[1].z = arg1[temp_r31[1]].z; + sp120[2].x = arg1[temp_r31[2]].x; + sp120[2].y = arg1[temp_r31[2]].y; + sp120[2].z = arg1[temp_r31[2]].z; + var_r17 = Hitcheck_Triangle_with_Sphere(sp120, (Vec*) spD0, spE0[3], &spC4); + } + if (var_r17 == TRUE) { + spD0[0] = arg2[0] + AddX; + spD0[1] = arg2[1]; + spD0[2] = arg2[2] + AddZ; + PSMTXMultVec(MapMT, &spC4, &spC4); + DefSetHitFace(spC4.x, spC4.y, spC4.z); + temp_r29 = &HitFaceVec[HitFaceCount]; + MapspaceInlineFunc01(temp_r29, &arg1[arg0[0]], &arg1[arg0[1]], &arg1[arg0[2]]); + temp_f31 = spC4.x - spD0[0]; + spA4 = spC4.y - spD0[1]; + temp_f30 = spC4.z - spD0[2]; + var_f21 = spE0[3] - sqrtf(temp_f31 * temp_f31 + temp_f30 * temp_f30); + HitFaceCount++; + if (spA0 > 0) { + spE0[0] = OldXYZ.x; + spE0[1] = OldXYZ.y; + spE0[2] = OldXYZ.z; + PSMTXMultVec(MapMTR, (Vec*) &spE0, (Vec*) &spE0); + if (MapspaceInlineFunc03(spE0, temp_r31, arg1) < 0) { + spB8.x = spE0[0] - spD0[0]; + spB8.y = spE0[1] - spD0[1]; + spB8.z = spE0[2] - spD0[2]; + MapspaceInlineFunc00(&spB8); + if (DefIfnnerMapCircle((Vec*) spD0, arg0 - 1, arg1, &spB8) == 1) { + var_f21 = spE0[3] + sqrtf(temp_f31 * temp_f31 + temp_f30 * temp_f30); + } + } else { + var_f21 = 0.0f; + } + } + if (var_f21 > 0.0f) { + AppendAddXZ(-temp_f31, -temp_f30, var_f21); + MTRAdd.x = AddX; + MTRAdd.z = AddZ; + MTRAdd.y = 0.0f; + PSMTXInvXpose(MapMT, spF0); + PSMTXMultVec(spF0, &MTRAdd, &MTRAdd); + } + } + return var_r17; +} + +static s32 PrecalcPntToTriangle(Vec *arg0, Vec *arg1, Vec *arg2, Vec* arg3, Vec *arg4, Vec *arg5) { + Vec sp14; + Vec sp8; + float temp_f28; + float temp_f30; + float temp_f29; + float temp_f31; + + HuSetVecF(&sp14, -arg4->x, -arg4->y, -arg4->z); + temp_f28 = 1.0f / (-(arg1->z * arg2->y * arg3->x) + arg1->y * arg2->z * arg3->x + arg1->z * arg2->x * arg3->y - arg1->x * arg2->z * arg3->y - arg1->y * arg2->x * arg3->z + arg1->x * arg2->y * arg3->z); + temp_f30 = temp_f28 * (arg2->z * (arg3->y * sp14.x - arg3->x * sp14.y) + arg2->y * (arg3->x * sp14.z - arg3->z * sp14.x) + arg2->x * (arg3->z * sp14.y - arg3->y * sp14.z)); + temp_f29 = temp_f28 * (arg1->z * (arg3->x * sp14.y - arg3->y * sp14.x) + arg1->y * (arg3->z * sp14.x - arg3->x * sp14.z) + arg1->x * (arg3->y * sp14.z - arg3->z * sp14.y)); + if (temp_f30 > 0.0f && temp_f29 > 0.0f && temp_f30 + temp_f29 > 1.0f) { + PSVECSubtract(arg2, arg1, &sp14); + PSVECSubtract(arg4, arg1, &sp8); + temp_f31 = PSVECDotProduct(&sp14, &sp8) / PSVECDotProduct(&sp14, &sp14); + if (temp_f31 <= 0.0f) { + arg5 = arg1; + } else { + if (temp_f31 >= 1.0f) { + arg5 = arg2; + } else { + PSVECScale(&sp14, &sp8, temp_f31); + PSVECAdd(arg1, &sp8, arg5); + } + } + } else if (temp_f29 < 0.0f) { + temp_f31 = PSVECDotProduct(arg1, arg4) / PSVECDotProduct(arg1, arg1); + if (temp_f31 <= 0.0f) { + HuSetVecF(arg5, 0.0, 0.0, 0.0); + } else { + if (temp_f31 >= 1.0f) { + arg5 = arg1; + } else { + PSVECScale(arg1, arg5, temp_f31); + } + } + } else if (temp_f30 < 0.0f) { + temp_f31 = PSVECDotProduct(arg2, arg4) / PSVECDotProduct(arg2, arg2); + if (temp_f31 <= 0.0f) { + HuSetVecF(arg5, 0.0, 0.0, 0.0); + } else { + if (temp_f31 >= 1.0f) { + arg5 = arg2; + } else { + PSVECScale(arg2, arg5, temp_f31); + } + } + } else { + HuSetVecF(arg5, temp_f30 * arg1->x + temp_f29 * arg2->x, temp_f30 * arg1->y + temp_f29 * arg2->y, temp_f30 * arg1->z + temp_f29 * arg2->z); + } + return 1; +} + +BOOL Hitcheck_Triangle_with_Sphere(Vec *arg0, Vec *arg1, float arg2, Vec *arg3) { + Vec sp48; + Vec sp3C; + Vec sp30; + Vec sp24; + Vec sp18; + Vec spC; + float var_f31; + + sp48.x = arg0[0].x; + sp48.y = arg0[0].y; + sp48.z = arg0[0].z; + PSVECSubtract(&arg0[1], &arg0[0], &sp3C); + PSVECSubtract(&arg0[2], &arg0[0], &sp30); + PSVECCrossProduct(&sp3C, &sp30, &sp24); + PSVECSubtract(arg1, &arg0[0], &sp18); + PrecalcPntToTriangle(&sp48, &sp3C, &sp30, &sp24, &sp18, &spC); + PSVECAdd(&spC, &sp48, arg3); + var_f31 = PSVECDistance(arg3, arg1); + if (var_f31 > arg2) { + return FALSE; + } else { + return TRUE; + } +} + +BOOL Hitcheck_Quadrangle_with_Sphere(Vec *arg0, Vec *arg1, float arg2, Vec *arg3) { + Vec sp6C; + Vec sp60; + Vec sp54; + Vec sp48; + Vec sp3C; + Vec sp30; + Vec sp24; + Vec sp18; + Vec spC; + float temp_f30; + float var_f31; + + sp6C.x = arg0->x; + sp6C.y = arg0->y; + sp6C.z = arg0->z; + PSVECSubtract(&arg0[2], &arg0[0], &sp60); + PSVECSubtract(&arg0[3], &arg0[0], &sp54); + PSVECSubtract(&arg0[1], &arg0[0], &sp48); + PSVECCrossProduct(&sp60, &sp54, &sp3C); + PSVECSubtract(arg1, &arg0[0], &sp30); + PrecalcPntToTriangle(&sp6C, &sp60, &sp54, &sp3C, &sp30, &sp24); + PSVECAdd(&sp24, &sp6C, &sp18); + PrecalcPntToTriangle(&sp6C, &sp54, &sp48, &sp3C, &sp30, &sp24); + PSVECAdd(&sp24, &sp6C, &spC); + var_f31 = PSVECDistance(&sp18, arg1); + temp_f30 = PSVECDistance(&spC, arg1); + if (temp_f30 > var_f31) { + arg3->x = sp18.x; + arg3->y = sp18.y; + arg3->z = sp18.z; + } else { + var_f31 = temp_f30; + arg3->x = spC.x; + arg3->y = spC.y; + arg3->z = spC.z; + } + if (var_f31 > arg2) { + return FALSE; + } else { + return TRUE; + } +} + +static void DefSetHitFace(float arg0, float arg1, float arg2) { + HitFace[HitFaceCount].x = arg0; + HitFace[HitFaceCount].y = arg1; + HitFace[HitFaceCount].z = arg2; +} + +void AppendAddXZ(float arg0, float arg1, float arg2) { + Vec spC; + + spC.x = arg0; + spC.y = 0.0f; + spC.z = arg1; + MapspaceInlineFunc00(&spC); + AddX += spC.x * arg2; + AddZ += spC.z * arg2; +} + +void CharRotInv(Mtx arg0, Mtx arg1, Vec *arg2, omObjData *arg3) { + Mtx sp8; + + PSMTXTrans(arg0, arg3->trans.x, arg3->trans.y, arg3->trans.z); + if (arg3->rot.z) { + PSMTXRotRad(sp8, 'z', MTXDegToRad(arg3->rot.z)); + PSMTXConcat(arg0, sp8, arg0); + } + if (arg3->rot.y) { + PSMTXRotRad(sp8, 'y', MTXDegToRad(arg3->rot.y)); + PSMTXConcat(arg0, sp8, arg0); + } + if (arg3->rot.x) { + PSMTXRotRad(sp8, 'x', MTXDegToRad(arg3->rot.x)); + PSMTXConcat(arg0, sp8, arg0); + } + PSMTXInverse(arg0, arg1); + PSMTXMultVec(arg1, arg2, arg2); +} diff --git a/src/game/minigame_seq.c b/src/game/minigame_seq.c new file mode 100644 index 00000000..dc8d41cd --- /dev/null +++ b/src/game/minigame_seq.c @@ -0,0 +1,3576 @@ +#include "game/armem.h" +#include "game/sprite.h" +#include "game/process.h" +#include "game/gamework_data.h" +#include "game/objsub.h" +#include "game/object.h" +#include "game/hsfman.h" +#include "game/window.h" +#include "game/wipe.h" +#include "game/pad.h" +#include "game/minigame_seq.h" + +#include "math.h" + +#include "stdarg.h" + +#undef abs + +#define ABS(x) (((x) < 0) ? -(x) : (x)) + + +extern s16 HuSysVWaitGet(s16 param); + +typedef struct seq_work SeqWork; + +typedef int (*SeqUpdateFunc)(SeqWork *work); +typedef int (*SeqInitFunc)(SeqWork *work, va_list params); + +typedef struct seq_work { + SeqUpdateFunc update; + char *data; + float x; + float y; + float scale_x; + float scale_y; + float unk_18; + float work_float[2]; + float unk_24; + s16 time; + s16 time_max; + s16 work_s16[4]; + s16 param[2]; + s16 type; + s16 spr_grp[16]; + s16 sprite[16]; + u8 seq_no; + u8 stat; + u8 unk_7C; + u8 unk_7D; +} SeqWork; + +typedef struct seq_info { + SeqInitFunc init; + SeqUpdateFunc update; + float x; + float y; + float scale_x; + float scale_y; + s32 time_max; +} SeqInfo; + +static int SeqInitTimer(SeqWork *work, va_list params); +static int SeqUpdateTimer(SeqWork *work); + +static int SeqInitType2(SeqWork *work, va_list params); +static int SeqUpdateType2(SeqWork *work); + +static int SeqInitMGBasic(SeqWork *work, va_list params); +static int SeqUpdateMGBasic(SeqWork *work); +static int SeqInitMGCommon(SeqWork *work, va_list params); +static int SeqUpdateMG1vs3(SeqWork *work); +static int SeqUpdateMGBattle(SeqWork *work); +static int SeqUpdateMGStory(SeqWork *work); +static int SeqUpdateMG2vs2(SeqWork *work); +static int SeqUpdateMGBowser(SeqWork *work); + +static int SeqInitWin(SeqWork *work, va_list params); +static int SeqUpdateWin(SeqWork *work); +static int SeqInitDraw(SeqWork *work, va_list params); +static int SeqUpdateDraw(SeqWork *work); +static int SeqInitRecord(SeqWork *work, va_list params); +static int SeqUpdateRecord(SeqWork *work); + +static int SeqInitFlip(SeqWork *work, va_list params); +static int SeqUpdateFlip(SeqWork *work); + +s32 mgSeqInitF = -1; + +static SeqInfo seqInfoTbl[] = { + { NULL, NULL, 292.0f, 240.0f, 1.0f, 1.0f, 60 }, + { SeqInitTimer, SeqUpdateTimer, 292.0f, 64.0f, 1.0f, 1.0f, 60 }, + { SeqInitType2, SeqUpdateType2, 292.0f, 240.0f, 0.5f, 0.5f, 60 }, + { SeqInitMGBasic, SeqUpdateMGBasic, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitMGCommon, SeqUpdateMG1vs3, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitWin, SeqUpdateWin, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitMGCommon, SeqUpdateMGBattle, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitMGCommon, SeqUpdateMGStory, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitMGBasic, SeqUpdateMGBasic, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitMGCommon, SeqUpdateMG2vs2, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitFlip, SeqUpdateFlip, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitMGCommon, SeqUpdateMGBowser, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitWin, SeqUpdateWin, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { SeqInitDraw, SeqUpdateDraw, 292.0f, 240.0f, 1.0f, 1.0f, 60 }, + { SeqInitRecord, SeqUpdateRecord, 292.0f, 240.0f, 1.0f, 1.0f, 180 }, + { NULL, NULL, 292.0f, 240.0f, 1.0f, 1.0f, 60 }, + { NULL, NULL, 292.0f, 240.0f, 1.0f, 1.0f, 60 }, +}; + +static s32 seqType2SprTbl[6] = { + 0, 0, 0, 0, 0, 0 +}; + +static s16 mgSeqTypeTbl[9] = { + 8, + 4, + 9, + 11, + 6, + 10, + 7, + 11, + 7 +}; + +static char lbl_8012F336[] = { + "アイウエオカキク" + "ケコサシスセソタ" + "チツテトナニヌネ" + "ノハヒフヘホマミ" + "ムメモヤユヨラリ" + "ルレロワヲンァィ" + "ゥェォャュョッカ" + "キクコサシスセソ" + "タチツテトハヒフ" + "ヘホハヒフヘホ" + "!?ー" +}; + +static char lbl_8012F389[] = "x first\n"; +static char lbl_8012F392[] = "y first\n"; + +static SeqWork seqWorkData[8]; + +static s16 seqTimer; +static u8 seqDoneF; +u8 lbl_801D3D94; +static s16 seqSpeed; +static s16 seqPauseF; +static s32 seqRecordVal; +static s32 pauseWaitF; +static s32 pauseExitF; +static s32 pauseActiveF; +static Process *pauseProcess; +static s32 seqLanguage; + +void fn_80036BC8(void); + + +void MGSeqInit(void) +{ + int i; + SeqWork *work; + work = &seqWorkData[0]; + for(i=8; i!=0; i--, work++) { + work->seq_no = 0; + work->data = NULL; + } + seqPauseF = 0; + seqDoneF = 0; + lbl_801D3D94 = 0; + seqTimer = 30; + HuAR_DVDtoARAM(DATADIR_GAMEMES); + HuAR_DVDtoARAM(DATADIR_MGCONST); + while(HuARDMACheck()); + fn_80036BC8(); + mgSeqInitF = -1; + seqLanguage = GWLanguageGet(); +} + +void MGSeqMain(void) +{ + SeqInfo *info; + s32 i; + s32 j; + s32 alive_flag; + u8 stat; + SeqWork *work; + + seqSpeed = HuSysVWaitGet(seqSpeed); + if(Hu3DPauseF) { + return; + } + alive_flag = 0; + stat = 0; + work = &seqWorkData[0]; + for(i=0; i<8; i++, work++) { + if(work->stat == 0) { + continue; + } + if(work->update) { + alive_flag = work->update(work); + } else { + info = &seqInfoTbl[work->seq_no]; + if(work->seq_no != 0 && NULL != info->update) { + alive_flag = info->update(work); + } + } + if(!alive_flag) { + work->stat = 0; + if(!lbl_801D3D94) { + for(j=0; j<8; j++) { + if(seqWorkData[j].stat) { + break; + } + } + } + if(!work->data) { + HuMemDirectFree(work->data); + work->data = NULL; + } + } + stat |= work->stat; + } + if(!stat || stat & 0x4) { + if(seqTimer > 0) { + seqTimer -= seqSpeed; + } + } +} + +static s16 CreateSeq(s16 seq_no, va_list params) +{ + SeqWork *work; + SeqInfo *info; + int i; + int temp; + work = seqWorkData; + info = &seqInfoTbl[(u8)seq_no]; + for(i=0; i<8; i++, work++) { + if(work->stat == 0) { + break; + } + } + if(i >= 8) { + return -1; + } + work->stat |= 0x1; + if(work->data) { + HuMemDirectFree(work->data); + } + work->data = NULL; + work->seq_no = (u8)seq_no; + work->time = 0; + work->x = info->x; + work->y = info->y; + work->scale_x = info->scale_x; + work->scale_y = info->scale_y; + work->unk_18 = 0.0f; + work->unk_7D = 255; + work->time_max = info->time_max; + work->work_s16[0] = work->work_s16[1] = work->work_s16[2] = work->work_s16[3] = 0; + work->work_float[0] = work->work_float[1] = 0.0f; + work->param[0] = work->param[1] = 0; + for(temp=0; temp<16; temp++) { + work->sprite[temp] = work->spr_grp[temp] = -1; + } + if(NULL != info->init) { + temp = info->init(work, params); + if(temp == 0) { + work->stat = 0; + return -1; + } + } + seqTimer = 30; + return i; +} + +s16 MGSeqCreate(s16 type, ...) +{ + s16 ret; + va_list params; + va_start(params, type); + if(type == 3) { + if(GWSystem.mg_next == 0xFFFF) { + type = 8; + } else { + type = mgSeqTypeTbl[mgInfoTbl[GWSystem.mg_next].type]; + } + } + ret = CreateSeq(type, params); + va_end(params); + return ret; +} + +u8 MGSeqStatGet(s16 id) +{ + SeqWork *work; + u8 ret = 0; + if(id < 0) { + int i; + work = seqWorkData; + for(i=8; i != 0; i--, work++) { + ret |= work->stat; + } + } else { + if(id < 8) { + ret = seqWorkData[id].stat; + } + } + return ret; +} + +void MGSeqPosSet(s16 id, float x, float y) +{ + if(id >= 0 && id < 8) { + seqWorkData[id].x = x; + seqWorkData[id].y = y; + } +} + +void MGSeqParamSet(s16 id, s16 param1, s16 param2) +{ + if(id >= 0 && id < 8) { + seqWorkData[id].param[0] = param1; + seqWorkData[id].param[1] = param2; + } +} + +void MGSeqKill(s16 id) +{ + if(id >= 0 && id < 8) { + if(seqWorkData[id].stat != 0) { + seqWorkData[id].stat = 8; + } + } +} + +void MGSeqKillAll(void) +{ + seqDoneF = 1; + MGSeqMain(); + seqDoneF = 0; + MGSeqStub(); + lbl_801D3D94 = 0; +} + +s32 MGSeqDoneCheck(void) +{ + u8 stat = MGSeqStatGet(-1); + if(stat == 0 || (stat & 0xC)) { + if(seqTimer <= 0 || (stat & 0x8)) { + return 1; + } + } + return 0; +} + +void MGSeqStub(void) +{ + +} + +void MGSeqSprKill(SeqWork *work) +{ + int i; + for(i=0; i<16; i++) { + if(work->spr_grp[i] >= 0) { + HuSprGrpKill(work->spr_grp[i]); + } + if(work->sprite[i] >= 0) { + HuSprKill(work->sprite[i]); + } + } +} + +static void *SeqReadFile(s32 file) +{ + return HuAR_ARAMtoMRAMFileRead(file, MEMORY_DEFAULT_NUM, HEAP_DATA); +} + +static int SeqInitTimer(SeqWork *work, va_list params) +{ + AnimData *spr_anim; + s16 sprite; + s16 spr_grp; + int duration, x, y; + s16 i; + + duration = va_arg(params, int); + x = va_arg(params, int); + y = va_arg(params, int); + if(duration <= 0 && duration > 99) { + duration = 99; + } + work->work_s16[0] = duration; + if(x >= 0) { + work->x = x; + } + if(y >= 0) { + work->y = y; + } + work->work_s16[2] = 0; + work->work_s16[1] = 2; + work->work_float[0] = 0; + work->spr_grp[0] = spr_grp = HuSprGrpCreate(4); + HuSprGrpScaleSet(spr_grp, work->scale_x, work->scale_y); + spr_anim = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 2))); + x = 12; + for(i=0; i<2; i++) { + sprite = HuSprCreate(spr_anim, 5, 0); + HuSprGrpMemberSet(spr_grp, i, sprite); + HuSprSpeedSet(spr_grp, i, 0); + HuSprPosSet(spr_grp, i, x, 0); + HuSprColorSet(spr_grp, i, 112, 233, 255); + x -= 24; + (void)i; //Hack for Matching + } + spr_anim = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 1))); + sprite = HuSprCreate(spr_anim, 7, 0); + HuSprGrpMemberSet(spr_grp, 2, sprite); + HuSprPosSet(spr_grp, 2, 0, 0); + HuSprTPLvlSet(spr_grp, 2, 0.5f); + HuSprColorSet(spr_grp, 2, 0, 0, 0); + spr_anim = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 0))); + sprite = HuSprCreate(spr_anim, 6, 0); + HuSprGrpMemberSet(spr_grp, 3, sprite); + HuSprPosSet(spr_grp, 3, 0, 0); + if(seqPauseF) { + work->work_s16[1] = 1; + for(i=0; i<2; i++) { + HuSprAttrSet(spr_grp, i, SPRITE_ATTR_HIDDEN); + (void)i; //Hack for Matching + } + } + return 1; +} + +static int SeqUpdateTimer(SeqWork *work) +{ + float scale; + float tp_lvl; + u8 digits[2]; + s16 i; + s16 spr_grp = work->spr_grp[0]; + if(work->param[0] != 0 && work->work_s16[1] != -1) { + switch(work->param[0]) { + case 2: + switch(work->param[1]) { + case -1: + work->stat |= 0x4; + work->work_s16[1] = -1; + work->work_float[0] = 0.0f; + break; + + case 0: + work->work_s16[1] = 2; + work->work_float[0] = 0.0f; + break; + + case 1: + work->work_s16[1] = 3; + work->work_float[0] = 0.0f; + break; + + default: + break; + } + work->param[0] = 0; + break; + + case 1: + if(work->param[1] < 0 && !(work->stat & 0x4)) { + work->stat |= 0x4; + work->work_s16[1] = -1; + work->work_float[0] = 0.0f; + } else { + if(work->param[1] > 99) { + work->work_s16[0] = 99; + } else { + if(work->work_s16[0] != work->param[1]) { + work->work_s16[0] = work->param[1]; + if(work->param[1] <= 5) { + HuAudFXPlay(6); + work->work_s16[1] = 3; + work->work_float[0] = 0.0f; + HuSprColorSet(spr_grp, 0, 255, 112, 160); + HuSprColorSet(spr_grp, 1, 255, 112, 160); + } else { + HuSprColorSet(spr_grp, 0, 112, 233, 255); + HuSprColorSet(spr_grp, 1, 112, 233, 255); + } + } + } + } + work->param[0] = 0; + break; + + case 3: + for(i=0; i<2; i++) { + HuSprAttrReset(spr_grp, i, SPRITE_ATTR_HIDDEN); + } + work->work_s16[1] = 3; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->work_s16[1] == 1) { + return 1; + } + if(work->work_s16[0] > 99) { + digits[0] = digits[1] = 9; + } else { + s32 value; + value = work->work_s16[0]/10; + digits[1] = value; + digits[0] = work->work_s16[0]-(value*10); + } + HuSprGrpPosSet(spr_grp, work->x, work->y); + HuSprGrpScaleSet(spr_grp, work->scale_x, work->scale_y); + for(i=0; i<2; i++) { + HuSprBankSet(spr_grp, i, digits[i]); + } + if(work->work_s16[1] != 0) { + switch(work->work_s16[1]) { + case 2: + { + float scale_x, scale_y; + scale = fabs(((sin((work->work_float[0]*M_PI)/180)*5.0f)+1.0f)-(sin((130*M_PI)/180)*5.0f)); + scale_x = work->scale_x*scale; + scale_y = work->scale_y*scale; + work->work_float[0] += seqSpeed*5.0f; + if(work->work_float[0] > 130.0f) { + work->work_s16[1] = 0; + break; + } + HuSprGrpScaleSet(spr_grp, scale_x, scale_y); + } + break; + + case 3: + { + scale = sin((work->work_float[0]*M_PI)/180)+1.0; + tp_lvl = 1.0-(sin((work->work_float[0]*M_PI)/180)*0.5); + work->work_float[0] += seqSpeed*18.0f; + if(work->work_float[0] > 180.0f) { + work->work_s16[1] = 0; + scale = 1.0f; + tp_lvl = 1.0f; + } + for(i=0; i<2; i++) { + HuSprScaleSet(spr_grp, i, scale, scale); + HuSprTPLvlSet(spr_grp, i, tp_lvl); + } + } + break; + + case -1: + HuSprGrpScaleSet(spr_grp, work->scale_x, work->scale_y); + for(i=0; i<2; i++) { + HuSprScaleSet(spr_grp, i, 1.0f, 1.0f); + } + work->work_float[0] += 1.0f; + if(work->work_float[0] < 60.0f) { + break; + } + tp_lvl = 1.0-((work->work_float[0]-60.0f)/20.0f); + if(tp_lvl <= 0.0f) { + tp_lvl = 0.0f; + work->work_s16[1] = 0; + work->stat |= 0x8; + } + + for(i=0; i<4; i++) { + HuSprTPLvlSet(spr_grp, i, tp_lvl); + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } else { + return 1; + } +} + +static int SeqInitType2(SeqWork *work, va_list params) +{ + s16 spr_idx; + s16 spr_grp; + AnimData *anim_tbl[6]; + s32 i; + s16 len; + char *str; + char c; + int time_max; + int x, y; + work->data = va_arg(params, void *); + time_max = va_arg(params, int); + x = va_arg(params, int); + y = va_arg(params, int); + if(time_max < 0) { + time_max = -1; + } + work->time_max = time_max; + if(x >= 0) { + work->x = x; + } + if(y >= 0) { + work->y = y; + } + work->work_s16[1] = 0; + work->work_float[0] = 0.0f; + x = 0; + len = 0; + str=work->data; + while(c=*str++) { + if(c >= '0' && c <= '9') { + x |= 1; + len++; + } else if(c >= 'A' && c <= 'Z') { + x |= 2; + len++; + } else if(c >= 'a' && c <= 'z') { + x |= 4; + len++; + } else if(c == '!' || c == '?') { + x |= 8; + len++; + } + } + work->work_s16[3] = len; + for(i=0; i<6; i++) { + if(x & (1 << i)) { + anim_tbl[i] = HuSprAnimRead(SeqReadFile(seqType2SprTbl[i])); + } else { + anim_tbl[i] = NULL; + } + } + work->spr_grp[0] = spr_grp = HuSprGrpCreate(len); + x = 0; + spr_idx = 0; + str=work->data; + while(c=*str++) { + i = -2; + if(c >= '0' && c <= '9') { + c -= '0'; + i = 0; + } else if(c >= 'A' && c <= 'Z') { + c -= 'A'; + i = 1; + } else if(c >= 'a' && c <= 'z') { + c -= 'a'; + i = 2; + } else if(c == '!' || c == '?') { + if(c == '!') { + c = 0; + } else { + c = 1; + } + i = 3; + } else if(c == ' ') { + i = -1; + } + work->work_s16[2] = x; + if(i == -1) { + x += 32; + } else if(i >= 0) { + s16 sprite = HuSprCreate(anim_tbl[i], 5, c); + HuSprGrpMemberSet(spr_grp, spr_idx, sprite); + HuSprSpeedSet(spr_grp, spr_idx, 0.0f); + HuSprPosSet(spr_grp, spr_idx, x, 0.0f); + spr_idx++; + x += 64; + } + } + if(seqPauseF) { + work->work_s16[1] = 1; + for(i=0; iwork_s16[3]; i++) { + HuSprAttrSet(spr_grp, i, SPRITE_ATTR_HIDDEN); + } + } + return 1; +} + +static int SeqUpdateType2(SeqWork *work) +{ + float tp_lvl; + s16 spr_grp; + spr_grp = work->spr_grp[0]; + HuSprGrpPosSet(spr_grp, work->x-((0.5f*work->scale_x)*work->work_s16[2]), work->y); + HuSprGrpScaleSet(spr_grp, work->scale_x, work->scale_y); + if(work->param[0] != 0 && work->work_s16[1] != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->work_s16[1] = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + { + s32 i; + for(i=0; iwork_s16[3]; i++) { + HuSprAttrReset(spr_grp, i, SPRITE_ATTR_HIDDEN); + (void)i; + } + work->work_s16[1] = 0; + work->param[0] = 0; + } + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->work_s16[1] == 1) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->work_s16[1] != -1) { + work->stat |= 0x4; + work->work_s16[1] = -1; + work->work_float[0] = 0.0f; + } + if(work->work_s16[1] != 0) { + if(work->work_s16[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + s16 i; + work->work_float[0] += seqSpeed*0.1f; + tp_lvl = 1.0f-work->work_float[0]; + if(tp_lvl <= 0.0f) { + tp_lvl = 0.0f; + work->work_s16[1] = 0; + work->stat |= 0x8; + } + for(i=0; iwork_s16[3]; i++) { + HuSprTPLvlSet(spr_grp, i, tp_lvl); + (void)i; + } + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } else { + return 1; + } +} + + +static char seqFontAlphaTbl[] = { + "ABCDEFGH" + "IJKLMNOP" + "QRSTUVWX" + "YZabcdef" + "ghijklmn" + "opqrstuv" + "wxyz" +}; + +static char seqFontKanaTbl[] = { + "アイウエオカキク" + "ケコサシスセソタ" + "チツテトナニヌネ" + "ノハヒフヘホマミ" + "ムメモヤユヨラリ" + "ルレロワヲンァィ" + "ゥェォャュョッカ" + "キクケコサシスセ" + "ソタチツテトハヒ" + "フヘホハヒフヘホ" + "ー" +}; + +static char seqFontNumTbl[] = "0123456789"; + +static s32 *letterBufTbl[5] = { }; + +static char wordStartE[] = "START!"; + +static char seqPunctTbl[] = "!?"; + +static char wordStartJ[] = "スタート!"; + +static char wordFinishJ[] = "フィニッシュ!"; + +static char wordDrawJ[] = "ヒキワケ!"; + +static char wordFinishE[] = "FINISH!"; +static char wordDrawE[] = "DRAW!"; + +static char *wordMgTbl[6] = { + wordStartJ, wordFinishJ, wordDrawJ, + wordStartE, wordFinishE, wordDrawE, +}; + +void fn_80036BC8(void) +{ + if(!letterBufTbl[0]) { + letterBufTbl[0] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32)*strlen(seqFontAlphaTbl)); + memset(letterBufTbl[0], 0, sizeof(s32)*strlen(seqFontAlphaTbl)); + } + if(!letterBufTbl[1]) { + letterBufTbl[1] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32)*strlen(seqFontKanaTbl)); + memset(letterBufTbl[1], 0, sizeof(s32)*strlen(seqFontKanaTbl)); + } + if(!letterBufTbl[2]) { + letterBufTbl[2] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32)*strlen(seqFontKanaTbl)); + memset(letterBufTbl[2], 0, sizeof(s32)*strlen(seqFontKanaTbl)); + } + if(!letterBufTbl[3]) { + letterBufTbl[3] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32)*strlen(seqFontNumTbl)); + memset(letterBufTbl[3], 0, sizeof(s32)*strlen(seqFontNumTbl)); + } + if(!letterBufTbl[4]) { + letterBufTbl[4] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32)*strlen(seqPunctTbl)); + memset(letterBufTbl[4], 0, sizeof(s32)*strlen(seqPunctTbl)); + } +} + +static AnimData *SeqLoadFontChar(char *str, s16 flags); + +static s32 SeqMakeWord(SeqWork *work, char *str, s16 flags) +{ + s16 *char_pos; + char *str_ptr; + s16 spr_grp; + s16 i; + s16 x; + s16 grp_idx; + s16 len; + AnimData **char_anim; + for(grp_idx=0; grp_idx<16; grp_idx++) { + if(work->spr_grp[grp_idx] == -1) { + break; + } + } + if(grp_idx == 16) { + return -1; + } + char_anim = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(AnimData *)*100); + char_pos = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s16)*100); + str_ptr = str; + x = 0; + len = 0; + while(*str_ptr != 0) { + char_anim[len] = SeqLoadFontChar(str_ptr, flags); + if(char_anim[len]) { + char_pos[len] = x; + x += 56; + len++; + } + str_ptr++; + } + work->spr_grp[grp_idx] = spr_grp = HuSprGrpCreate(len); + x = (x/2)-28; + for(i=0; iwork_s16[3] = len; + HuMemDirectFree(char_anim); + HuMemDirectFree(char_pos); + return grp_idx; +} + +static AnimData *SeqLoadFontChar(char *str, s16 flags) +{ + s32 data_num; + s16 id; + char *list; + char c = *str; + if(c == 222 || c == 223) { + return NULL; + } + if(c == 32) { + return HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 10))); + } + for(id = 0, list=seqFontAlphaTbl; *list != 0; id++, list++) { + if(*list == c) { + data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id+21); + return HuSprAnimRead(SeqReadFile(data_num)); + } + } + for(id = 0, list=seqFontNumTbl; *list != 0; id++, list++) { + if(*list == c) { + data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id+11); + return HuSprAnimRead(SeqReadFile(data_num)); + } + } + for(id = 0, list=seqPunctTbl; *list != 0; id++, list++) { + if(*list == c) { + data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id+154); + return HuSprAnimRead(SeqReadFile(data_num)); + } + } + if(str[1] == 222) { //゛ + list = seqFontKanaTbl; + list += 55; + id = 55; + } else if(str[1] == 223) { //゜ + list = seqFontKanaTbl; + list += 75; + id = 75; + } else { + list = seqFontKanaTbl; + id = 0; + } + while(*list != 0) { + if(*list == c) { + if(flags & 0x1) { + data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id+156); + } else { + data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id+73); + } + return HuSprAnimRead(SeqReadFile(data_num)); + } + id++; + list++; + } + return NULL; +} + +static float ForceDefine480() +{ + return 480.0f; +} + +static void SeqPlayStartFX(void); + +static int SeqInitMGBasic(SeqWork *work, va_list params) +{ + s16 i; + s16 word_grp; + + work->work_s16[1] = va_arg(params, int); + if(work->work_s16[1] == 2) { + return SeqInitDraw(work, params); + } + work->type = 0; + work->work_float[0] = 0; + + { + s32 word_katakana; + s32 word_flag; + s32 word_ofs; + word_katakana = 0; + if(work->work_s16[1] == 2 && seqLanguage == 0) { + word_katakana = 1; + } + if(word_katakana) { + word_flag = 1; + } else { + word_flag = 0; + } + if(seqLanguage == 0) { + word_ofs = 0; + } else { + word_ofs = 3; + } + word_grp = SeqMakeWord(work, wordMgTbl[work->work_s16[1]+word_ofs], word_flag); + } + HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f); + + for(i=0; iwork_s16[3]; i++) { + HuSprTPLvlSet(work->spr_grp[word_grp], i, 1.0f); + HuSprPosSet(work->spr_grp[word_grp], i, -100.0f, 240.0f); + } + if(seqPauseF) { + work->type = 2; + HuSprAttrSet(word_grp, 0, SPRITE_ATTR_HIDDEN); + } else { + work->param[0] = 3; + } + return 1; +} + +static int SeqUpdateMGBasic(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + float pos_x; + float time; + s16 i; + if(work->work_s16[1] == 0) { + if(work->time <= 40) { + for(i=0; iwork_s16[3]; i++) { + time = work->time-((20/work->work_s16[3])*(work->work_s16[3]-i-1)); + if(time < 0 || time > 20.0f) { + continue; + } + pos_x = (work->x-(0.5f*(work->work_s16[3]*56)))+28.0f+(i*56); + if(time == 20.0f) { + HuSprPosSet(work->spr_grp[0], i, pos_x, work->y); + HuSprZRotSet(work->spr_grp[0], i, 0.0f); + } else { + HuSprPosSet(work->spr_grp[0], i, pos_x-(((1.0-sin(((time*4.5f)*M_PI)/180.0))*(work->work_s16[3]*56*2))), work->y); + HuSprZRotSet(work->spr_grp[0], i, (time/20.0f)*390.0f); + } + } + } else { + time = work->time-40; + scale = work->scale_x+(0.5*sin(((time*9.0f)*M_PI)/180.0)); + for(i=0; iwork_s16[3]; i++) { + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(i*56)); + HuSprPosSet(work->spr_grp[0], i, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], i, scale, work->scale_y+sin(((time*9.0f)*M_PI)/180.0)); + } + } + if(work->time == 40) { + idx = HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 60) { + SeqPlayStartFX(); + work->stat |= 0x4; + } + if(work->time >= 60) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + time = work->time; + scale = work->scale_x+(0.5*sin(((time*9.0f)*M_PI)/180.0)); + for(i=0; iwork_s16[3]; i++) { + HuSprAttrReset(work->spr_grp[0], i, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(i*56)); + HuSprPosSet(work->spr_grp[0], i, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], i, work->scale_x+sin(((time*9.0f)*M_PI)/180.0), work->scale_y+sin(((time*9.0f)*M_PI)/180.0)); + } + if(time == 20.0f) { + for(i=0; iwork_s16[3]; i++) { + HuSprAttrReset(work->spr_grp[0], i, SPRITE_ATTR_HIDDEN); + } + } + } else { + if(work->time > 80) { + for(i=0; iwork_s16[3]; i++) { + time = (work->time-80)-((20/work->work_s16[3])*(work->work_s16[3]-i-1)); + if(time < 0.0f || time > 20.0f) { + continue; + } + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(i*56); + if(time == 20.0f) { + HuSprAttrSet(work->spr_grp[0], i, SPRITE_ATTR_HIDDEN); + } else { + HuSprPosSet(work->spr_grp[0], i, pos_x+((1.0-cos(((time*4.5f)*M_PI)/180.0f))*(work->work_s16[3]*56*2)), work->y); + HuSprZRotSet(work->spr_grp[0], i, (time/20.0f)*390.0f); + } + } + } + } + if(work->time == 110) { + work->stat |= 0x4; + } + if(work->time >= 110) { + work->type = 0; + work->stat |= 8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqInitMGCommon(SeqWork *work, va_list params) +{ + s16 i; + float tp_lvl; + s16 j; + s16 word_grp; + + work->work_s16[1] = va_arg(params, int); + if(work->work_s16[1] == 2) { + return SeqInitDraw(work, params); + } + work->type = 0; + work->work_float[0] = 0; + tp_lvl = 1.0f; + for(i=0; i<4; i++) { + if(i == 0) + { + s32 word_katakana; + s32 word_flag; + s32 word_ofs; + word_katakana = 0; + if(work->work_s16[1] == 2 && seqLanguage == 0) { + word_katakana = 1; + } + if(word_katakana) { + word_flag = 1; + } else { + word_flag = 0; + } + if(seqLanguage == 0) { + word_ofs = 0; + } else { + word_ofs = 3; + } + word_grp = SeqMakeWord(work, wordMgTbl[work->work_s16[1]+word_ofs], word_flag); + } else { + s16 grp_idx; + s32 new_grp; + for(grp_idx=0; grp_idx<16; grp_idx++) { + if(work->spr_grp[grp_idx] == -1) { + break; + } + } + if(grp_idx == 16) { + new_grp = -1; + } else { + work->spr_grp[grp_idx] = HuSprGrpCopy(work->spr_grp[word_grp]); + new_grp = grp_idx; + } + (void)new_grp; + word_grp = new_grp; + } + HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f); + for(j=0; jwork_s16[3]; j++) { + HuSprTPLvlSet(work->spr_grp[word_grp], j, tp_lvl); + HuSprPosSet(work->spr_grp[word_grp], j, -100.0f, 240.0f); + HuSprPriSet(work->spr_grp[word_grp], j, i+5); + HuSprAttrSet(work->spr_grp[word_grp], i, SPRITE_ATTR_BILINEAR); + } + if(i == 0) { + tp_lvl -= 0.5; + } else { + tp_lvl -= 0.1f; + } + } + if(seqPauseF) { + work->type = 2; + HuSprAttrSet(word_grp, 0, SPRITE_ATTR_HIDDEN); + } else { + work->param[0] = 3; + } + return 1; +} + +static int SeqUpdateMGBattle(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + s16 i, j; + float time; + float pos_x; + if(work->work_s16[1] == 0) { + if(work->time < 45) { + if(work->time > 10 && work->time <= 40) { + time = work->time-10; + scale = 10.0f*(1.0f-(time/30.0f)); + pos_x = (work->x-(0.5f*(work->work_s16[3]*56)))+28.0f; + HuSprPosSet(work->spr_grp[0], 0, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], 0, work->scale_x+scale, work->scale_y+scale); + scale = time/30.0f; + HuSprTPLvlSet(work->spr_grp[0], 0, scale); + } + for(i=0; i<4; i++) { + time = work->time-i; + if(time < 0 || time > 40) { + continue; + } + for(j=1; jwork_s16[3]; j++) { + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(j*56); + if(time == 40.0f) { + HuSprPosSet(work->spr_grp[i], j, pos_x, work->y); + HuSprZRotSet(work->spr_grp[i], j, 0.0f); + HuSprScaleSet(work->spr_grp[i], j, work->scale_x, work->scale_y); + if(i != 0) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } else { + s16 discard_cnt; + static float letterOfs[] = { + 30, 20, + 20, 3, + -4, 20, + -30, 20, + 20, 20, + -30, 20, + -10, 40, + 10, -40 + }; + float x, y; + float ofs_x, ofs_y; + float zrot, scale_ang; + x = pos_x; + y = work->y; + ofs_x = letterOfs[((j-1)&0x7)*2]; + ofs_y = letterOfs[(((j-1)&0x7)*2)+1]; + zrot = 0.0f; + discard_cnt = 0; + scale_ang = 0.0f; + for(idx=0; idx<40.0f-time; idx++) { + if(x+ofs_x > 576 || x+ofs_x < 0) { + ofs_x = -ofs_x; + discard_cnt++; + } + if(y+ofs_y > 480 || y+ofs_y < 0) { + ofs_y = -ofs_y; + discard_cnt++; + } + if(discard_cnt) { + zrot += 20.0f; + scale_ang = 0.0f; + } + x += ofs_x; + y += ofs_y; + } + HuSprPosSet(work->spr_grp[i], j, x, y); + HuSprScaleSet(work->spr_grp[i], j, work->scale_x*cos((M_PI*scale_ang)/180.0), work->scale_y); + HuSprZRotSet(work->spr_grp[i], j, zrot); + } + } + } + } else { + if(work->time > 60) { + time = work->time-60; + scale = 0.5*sin((M_PI*(time*9.0f))/180.0); + for(j=0; jwork_s16[3]; j++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((j*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+scale, work->scale_y+scale); + } + } + } + if(work->time == 60) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 80) { + work->stat |= 0x4; + SeqPlayStartFX(); + } + if(work->time >= 80) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + time = work->time; + scale = work->scale_x+(0.5*sin((M_PI*(time*9.0f))/180.0)); + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[0], j, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(j*56)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+(sin((M_PI*(time*9.0f))/180.0)), work->scale_y+(sin((M_PI*(time*9.0f))/180.0))); + } + if(time == 20.0f) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[0], j, SPRITE_ATTR_HIDDEN); + } + } + } else { + if(work->time > 80 && work->time <= 95) { + time = work->time-80; + for(j=0; jwork_s16[3]; j++) { + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(j*56); + HuSprPosSet(work->spr_grp[0], j, pos_x+((288.0f-pos_x)*(1.0-cos((M_PI*(time*6.0))/180.0))), work->y); + } + if(time == 15.0f) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[1], j, SPRITE_ATTR_HIDDEN); + HuSprPosSet(work->spr_grp[1], j, 288.0f, work->y); + HuSprTPLvlSet(work->spr_grp[1], j, 1.0f); + } + } + } else { + if(work->time > 105) { + for(j=0; jwork_s16[3]; j++) { + time = work->time-105; + time -= j*3; + if(time < 0) { + continue; + } + scale = 1.0f-(time/15.0f); + if(scale < 0.0f) { + scale = 0.0f; + } + HuSprPosSet(work->spr_grp[0], j, 288.0f, work->y+((-100.0f-work->y)*(time/20.0f))); + HuSprTPLvlSet(work->spr_grp[0], j, scale); + HuSprPosSet(work->spr_grp[1], j, 288.0f, work->y+((580.0f-work->y)*(time/20.0f))); + HuSprTPLvlSet(work->spr_grp[1], j, scale); + } + } + } + } + if(work->time == 130) { + work->stat |= 0x4; + } + if(work->time >= 130) { + work->type = 0; + work->stat |= 0x8; + } + } + + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqUpdateMG1vs3(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + float time; + float scale_x, scale_y; + float pos_x, pos_y; + s16 i; + s16 j; + if(work->work_s16[1] == 0) { + if(work->time <= 10) { + scale = work->time/10.0f; + time = work->time; + for(idx=0; idxwork_s16[3]; idx++) { + scale_x = 0.3*work->scale_x; + scale_y = 0.3*work->scale_y; + pos_x = ((28.0f*scale_x)+(work->x-(0.5f*(scale_x*(work->work_s16[3]*56)))))+(scale_x*(idx*56)); + pos_y = work->y-(150.0*sin((M_PI*(((16.0f/3.0f)*time)+20.0f))/180.0)); + HuSprPosSet(work->spr_grp[0], idx, pos_x, pos_y); + HuSprScaleSet(work->spr_grp[0], idx, scale_x, scale_y*cos(M_PI*(12.0f*time)/180.0)); + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } else { + if(work->time <= 60) { + for(i=0; i<4; i++) { + for(idx=0; idxwork_s16[3]; idx++) { + time = (work->time-10)-(idx*3)-i; + if(time < 0.0f) { + time = 0.0f; + } else { + if(time > 30.0f) { + continue; + } + } + scale = 0.3+(0.7*(1.0-cos((M_PI*(time*3.0f))/180.0))); + scale_x = work->scale_x*scale; + scale_y = work->scale_y*scale; + pos_x = ((28.0f*scale_x)+(work->x-(0.5f*(scale_x*(work->work_s16[3]*56)))))+(scale_x*(idx*56)); + pos_y = work->y-(150.0*sin((M_PI*(((16.0f/3.0f)*time)+20.0f))/180.0)); + HuSprPosSet(work->spr_grp[i], idx, pos_x, pos_y); + HuSprScaleSet(work->spr_grp[i], idx, scale_x, scale_y*cos(M_PI*(12.0f*time)/180.0)); + } + } + if(work->time == 60) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + } + } else { + if(work->time > 70) { + time = work->time-70; + scale = 0.5*sin((M_PI*(time*9.0f))/180.0); + for(j=0; jwork_s16[3]; j++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((j*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+scale, work->scale_y+scale); + } + } + } + } + if(work->time == 70) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 90) { + work->stat |= 0x4; + SeqPlayStartFX(); + } + if(work->time >= 90) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + time = work->time; + scale = work->scale_x+(0.5*sin((M_PI*(time*9.0f))/180.0)); + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[0], j, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(j*56)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+(sin((M_PI*(time*9.0f))/180.0)), work->scale_y+(sin((M_PI*(time*9.0f))/180.0))); + } + if(time == 20.0f) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + } + } else { + if(work->time > 80 || work->time < 140) { + for(i=0; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + time = (work->time-80)-i-j; + if(time < 0 || time > 40) { + continue; + } + if(time <= 20) { + float pos_base = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(j*56); + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+((work->work_s16[3]-j-1)*56); + HuSprPosSet(work->spr_grp[i], j, pos_base+((time/20.0f)*(pos_x-pos_base)), work->y+((440.0f-work->y)*(time/20.0f))); + } else { + time -= 20.0f; + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+((work->work_s16[3]-j-1)*56); + pos_y = 440.0f; + HuSprPosSet(work->spr_grp[i], j, pos_x, pos_y+((-40.0f-pos_y)*(time/20.0f))); + } + } + } + } + } + if(work->time == 140) { + work->stat |= 0x4; + } + if(work->time >= 140) { + work->type = 0; + work->stat |= 0x8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqUpdateMGStory(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + float pos_x, pos_y; + float time; + s16 i; + s16 j; + if(work->work_s16[1] == 0) { + if(work->time <= 30) { + for(idx=0; idxwork_s16[3]; idx++) { + time = (work->time-(idx*2)); + if(time < 0.0f || time > 15.0f) { + continue; + } + pos_x = -50.0f; + HuSprPosSet(work->spr_grp[0], idx, pos_x+((288.0f-pos_x)*(time/15.0f)), work->y); + HuSprTPLvlSet(work->spr_grp[0], idx, 1.0f); + HuSprZRotSet(work->spr_grp[0], idx, (1.0-(time/15.0f))*180.0); + pos_x = 626.0f; + HuSprPosSet(work->spr_grp[1], idx, pos_x+((288.0f-pos_x)*(time/15.0f)), work->y); + HuSprTPLvlSet(work->spr_grp[1], idx, 1.0f); + HuSprZRotSet(work->spr_grp[1], idx, (1.0-(time/15.0f))*-180.0); + } + if(work->time == 30) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[1], j, SPRITE_ATTR_HIDDEN); + } + } + } else { + if(work->time > 35 && work->time <= 45) { + time = work->time-35; + for(idx=0; idxwork_s16[3]; idx++) { + pos_x = (work->x-(0.5f*(work->work_s16[3]*56)))+28.0f+(idx*56); + HuSprPosSet(work->spr_grp[0], idx, 288.0f+((pos_x-288.0f)*(time/10.0f)), work->y); + } + } else { + if(work->time > 55) { + time = work->time-55; + scale = 0.5*sin(M_PI*(9.0f*time)/180.0); + for(j=0; jwork_s16[3]; j++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((j*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+scale, work->scale_y+scale); + } + } + } + } + if(work->time == 55) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 75) { + SeqPlayStartFX(); + work->stat |= 0x4; + } + if(work->time >= 75) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + time = work->time; + scale = work->scale_x+(0.5*sin((M_PI*(time*9.0f))/180.0)); + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[0], j, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(j*56)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+(sin((M_PI*(time*9.0f))/180.0)), work->scale_y+(sin((M_PI*(time*9.0f))/180.0))); + } + if(time == 20.0f){ + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + } + } else if(work->time > 80 && work->time < 160) { + for(i=0; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + s16 initF; + float dx, dy; + time = (work->time-80)-i; + if(time < 0 || time > 60) { + continue; + } + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(j*56); + dx = 28.0f+(work->x-(0.5f*(work->work_s16[3]*56))); + pos_y = work->y; + for(idx=initF=0; idxx-(0.5f*(work->work_s16[3]*56))); + initF = 1; + dy = 25.0f; + dx = 10.0f; + } + + } else { + pos_x += dx; + pos_y += dy; + dx += 0.1; + dy -= 2.0f; + if(pos_y < 0.0f) { + break; + } + } + } + + HuSprPosSet(work->spr_grp[i], j, pos_x, pos_y); + } + } + } + if(work->time == 160) { + work->stat |= 0x4; + } + if(work->time >= 160) { + work->type = 0; + work->stat |= 0x8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqUpdateMG2vs2(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + static s16 letterOfs[] = { + -10, -50, + 0, -30, + 5, -60, + -10, 60, + 8, -40, + 5, 50, + -10, 20 + }; + + float pos_x; + float time; + s16 i; + s16 j; + if(work->work_s16[1] == 0) { + if(work->time <= 30) { + time = work->time; + for(idx=0; idxwork_s16[3]; idx++) { + pos_x = (28.0f+(work->x-(0.5f*(work->scale_x*(work->work_s16[3]*56)))))+(idx*56); + HuSprPosSet(work->spr_grp[0], idx, pos_x+((1.0f-(time/30.0f))*letterOfs[(idx*2)]), work->y+((1.0f-(time/30.0f))*letterOfs[(idx*2)+1])); + HuSprTPLvlSet(work->spr_grp[0], idx, time/30.0f); + } + } else { + if(work->time > 40 && work->time <= 60) { + time = work->time-40; + scale = 0.5*sin(((time*9.0f)*M_PI)/180.0); + for(j=0; jwork_s16[3]; j++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((j*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+scale, work->scale_y+scale); + } + } + } + if(work->time == 40) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 60) { + work->stat |= 0x4; + SeqPlayStartFX(); + } + if(work->time >= 60) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + time = work->time; + scale = work->scale_x+(0.5*sin((M_PI*(time*9.0f))/180.0)); + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[0], j, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(j*56)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+(sin((M_PI*(time*9.0f))/180.0)), work->scale_y+(sin((M_PI*(time*9.0f))/180.0))); + } + if(time == 20.0f) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + } + } else { + if(work->time > 80 && work->time < 140) { + time = work->time-80; + for(idx=0; idxwork_s16[3]; idx++) { + float radius = (idx*56)-(((work->work_s16[3]-1)*56)/2); + float angle = (1.0f+(1.0f-(ABS(radius)/320.0f)))*720.0f; + float new_scale; + radius *= 1.0-(time/60.0f); + HuSprPosSet(work->spr_grp[0], idx, (radius*sin(M_PI*(((time/60.0f)*angle)+90.0f)/180.0))+work->x, (radius*cos(M_PI*(((time/60.0f)*angle)+90.0f)/180.0))+work->y); + HuSprZRotSet(work->spr_grp[0], idx, -(time/60.0f)*720.0f); + new_scale = 0.5+(0.5*(1.0f-(time/60.0f))); + HuSprScaleSet(work->spr_grp[0], idx, new_scale, new_scale); + HuSprTPLvlSet(work->spr_grp[0], idx, 1.0f-(time/60.0f)); + } + } + } + if(work->time == 140) { + work->stat |= 0x4; + } + if(work->time >= 150) { + work->type = 0; + work->stat |= 0x8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + + break; + + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqInitFlip(SeqWork *work, va_list params) +{ + s16 i; + s16 word_grp; + s16 word_ofs; + work->work_s16[1] = va_arg(params, int); + if(work->work_s16[1] == 2) { + return SeqInitDraw(work, params); + } + work->type = 0; + work->work_float[0] = 0; + { + s32 word_ofs_temp; + s32 word_katakana; + s32 word_flag; + + if(seqLanguage == 0) { + word_ofs_temp = 3; + } else { + word_ofs_temp = 0; + } + word_ofs = word_ofs_temp; + word_katakana = 0; + if(work->work_s16[1] == 2 && word_ofs == 0) { + word_katakana = 1; + } + if(word_katakana) { + word_flag = 1; + } else { + word_flag = 0; + } + + word_grp = SeqMakeWord(work, wordMgTbl[work->work_s16[1]+word_ofs], word_flag); + } + HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f); + for(i=0; iwork_s16[3]; i++) { + HuSprTPLvlSet(work->spr_grp[word_grp], i, 0.0f); + HuSprPosSet(work->spr_grp[word_grp], i, (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(i*56), work->y); + HuSprAttrSet(work->spr_grp[word_grp], i, SPRITE_ATTR_BILINEAR); + HuSprAttrReset(work->spr_grp[word_grp], i, SPRITE_ATTR_HIDDEN); + } + work->work_s16[2] = work->work_s16[3]; + { + s32 word_ofs_temp; + s32 word_katakana; + s32 word_flag; + + if(seqLanguage == 0) { + word_ofs_temp = 0; + } else { + word_ofs_temp = 3; + } + word_ofs = word_ofs_temp; + word_katakana = 0; + if(work->work_s16[1] == 2 && word_ofs == 0) { + word_katakana = 1; + } + if(word_katakana) { + word_flag = 1; + } else { + word_flag = 0; + } + + word_grp = SeqMakeWord(work, wordMgTbl[work->work_s16[1]+word_ofs], word_flag); + } + HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f); + for(i=0; iwork_s16[3]; i++) { + HuSprTPLvlSet(work->spr_grp[word_grp], i, 0.0f); + HuSprPosSet(work->spr_grp[word_grp], i, (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(i*56), work->y); + HuSprAttrSet(work->spr_grp[word_grp], i, SPRITE_ATTR_BILINEAR); + HuSprAttrReset(work->spr_grp[word_grp], i, SPRITE_ATTR_HIDDEN); + } + if(seqPauseF) { + work->type = 2; + HuSprAttrSet(word_grp, 0, SPRITE_ATTR_HIDDEN); + } else { + work->param[0] = 3; + } + return 1; +} + +static int SeqUpdateFlip(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + float time; + float pos_x; + s16 i; + if(work->work_s16[1] == 0) { + if(work->time <= 10) { + for(idx=0; idxwork_s16[2]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, work->time/10.0f); + } + } else { + if(work->time <= 30) { + time = work->time-10; + if(time <= 10) { + for(idx=0; idxwork_s16[2]; idx++) { + HuSprScaleSet(work->spr_grp[0], idx, cos(M_PI*((time/10.0f)*90.0f)/180.0), 1.0f); + } + } else { + time -= 10.0f; + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[1], idx, 1.0f); + HuSprScaleSet(work->spr_grp[1], idx, sin(M_PI*((time/10.0f)*90.0f)/180.0), 1.0f); + } + } + } else { + if(work->time > 35 && work->time <= 55) { + time = work->time-35; + scale = 0.5*sin(((time*9.0f)*M_PI)/180.0); + for(i=0; iwork_s16[3]; i++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((i*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[1], i, pos_x, work->y); + HuSprScaleSet(work->spr_grp[1], i, work->scale_x+scale, work->scale_y+scale); + } + } + } + } + if(work->time == 35) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 55) { + work->stat |= 0x4; + SeqPlayStartFX(); + } + if(work->time >= 75) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + time = work->time; + scale = 0.5*sin(M_PI*(9.0f*time)/180.0); + for(i=0; iwork_s16[3]; i++) { + HuSprTPLvlSet(work->spr_grp[1], i, 1.0f); + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((i*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[1], i, pos_x, work->y); + HuSprScaleSet(work->spr_grp[1], i, work->scale_x+scale, work->scale_y+scale); + } + } else { + if(work->time > 80 && work->time <= 160) { + time = work->time-80; + for(idx=0; idxwork_s16[3]; idx++) { + scale = time-(idx*2); + if(scale < 0 || scale > 15.0f) { + continue; + } + HuSprScaleSet(work->spr_grp[1], idx, cos(M_PI*((scale/15.0f)*90.0f)/180.0), 1.0f); + } + for(idx=0; idxwork_s16[2]; idx++) { + scale = (time-15.0f)-(idx*2); + if(scale < 0 || scale > 30.0f) { + continue; + } + HuSprTPLvlSet(work->spr_grp[0], idx, 1.0f); + HuSprScaleSet(work->spr_grp[0], idx, sin(M_PI*((scale/30.0f)*180.0f)/180.0), 1.0f); + } + } + } + if(work->time == 160) { + work->stat |= 0x4; + } + if(work->time >= 160) { + work->type = 0; + work->stat |= 0x8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[1], idx, scale); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqUpdateMGBowser(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + s16 i; + s16 j; + float angle; + float time_angle; + float time; + float pos_x, pos_y; + + float temp_f25; + float center_x; + s16 spr_idx[16]; + float scale_arr[16]; + + + if(work->work_s16[1] == 0) { + if(work->time <= 60) { + center_x = (0.5*(work->work_s16[3]*56))+20.0; + for(idx=0; idxwork_s16[3]; idx++) { + time = work->time-idx; + if(time < 0) { + scale_arr[idx] = 0.0f; + spr_idx[idx] = idx; + } else { + if(time > 50.0f) { + time = 50.0f; + } + time_angle = 540.0*(1.0f-(time/50.0f)); + pos_x = (28.0f+(0.5f*-(work->work_s16[3]*56)))+(idx*56); + angle = 180.0*(atan2(pos_x, center_x)/M_PI); + pos_x = work->x+(center_x*sin(M_PI*(angle+time_angle)/180.0)); + pos_y = work->y-(240.0*(1.0-(time/50.0f))); + HuSprPosSet(work->spr_grp[0], idx, pos_x, pos_y); + temp_f25 = 0.9+(0.1*cos(M_PI*(angle+time_angle)/180.0)); + HuSprScaleSet(work->spr_grp[0], idx, temp_f25*cos(M_PI*(angle+time_angle)/180.0), temp_f25); + scale_arr[idx] = cos(M_PI*(angle+time_angle)/180.0); + spr_idx[idx] = idx; + } + } + for(i=1; iwork_s16[3]; i++) { + for(idx=0; idxwork_s16[3]-i; idx++) { + if(scale_arr[idx] > scale_arr[idx+1]) { + j= spr_idx[idx]; + spr_idx[idx] = spr_idx[idx+1]; + spr_idx[idx+1] = j; + angle = scale_arr[idx]; + scale_arr[idx] = scale_arr[idx+1]; + scale_arr[idx+1] = angle; + } + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprPriSet(work->spr_grp[0], spr_idx[idx], idx+5); + } + } else { + if(work->time > 60 && work->time <= 80) { + time = work->time-60; + scale = 0.5*sin(((time*9.0f)*M_PI)/180.0); + for(i=0; iwork_s16[3]; i++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((i*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[0], i, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], i, work->scale_x+scale, work->scale_y+scale); + } + } + + } + if(work->time == 60) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 80) { + work->stat |= 0x4; + SeqPlayStartFX(); + } + if(work->time >= 100) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + for(j=1; j<4; j++) { + for(i=0; iwork_s16[3]; i++) { + HuSprAttrSet(work->spr_grp[j], i, SPRITE_ATTR_HIDDEN); + } + } + time = work->time; + scale = work->scale_x+(0.5*sin(((time*9.0f)*M_PI)/180.0)); + for(i=0; iwork_s16[3]; i++) { + HuSprAttrReset(work->spr_grp[0], i, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(i*56)); + HuSprPosSet(work->spr_grp[0], i, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], i, work->scale_x+(sin((M_PI*(time*9.0f))/180.0)), work->scale_y+(sin((M_PI*(time*9.0f))/180.0))); + } + if(time == 20.0f) { + for(j=1; j<4; j++) { + for(i=0; iwork_s16[3]; i++) { + HuSprAttrReset(work->spr_grp[j], i, SPRITE_ATTR_HIDDEN); + } + } + } + } else { + if(work->time > 80 && work->time <= 125) { + static float letterOfs[] = { + -30, -30, + 606, -30, + 340, 510, + 606, 510, + -30, 450, + 606, 120, + 450, -30, + }; + for(i=0; i<4; i++) { + time = work->time-80-i; + if(time < 0.0f || time > 15.0f) { + continue; + } + for(idx=0; idxwork_s16[3]; idx++) { + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(idx*56); + pos_x += (time/15.0f)*(letterOfs[(idx*2)]-pos_x); + pos_y = work->y+((time/15.0f)*(letterOfs[(idx*2)+1]-work->y)); + HuSprPosSet(work->spr_grp[i], idx, pos_x, pos_y); + } + } + } + } + if(work->time == 125) { + work->stat |= 0x4; + } + if(work->time >= 135) { + work->type = 0; + work->stat |= 0x8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqInitDraw(SeqWork *work, va_list params) +{ + s16 word_grp; + work->work_s16[1] = 2; + work->seq_no = 13; + work->type = 0; + work->work_float[0] = 0.0f; + { + s32 word_flag; + s32 word_ofs; + + if(seqLanguage == 0) { + word_flag = 1; + } else { + word_flag = 0; + } + if(seqLanguage == 0) { + word_ofs = 0; + } else { + word_ofs = 3; + } + + word_grp = SeqMakeWord(work, wordMgTbl[2+word_ofs], word_flag); + } + HuSprGrpPosSet(work->spr_grp[word_grp], 288.0f, 240.0f); + work->param[0] = 3; + return 1; +} + +static int SeqUpdateDraw(SeqWork *work) +{ + s16 idx; + float scale; + s16 group = work->spr_grp[0]; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + float time; + float scale; + float zrot; + if(work->time <= 20) { + time = work->time; + zrot = 365.0f*(time/20.0f); + scale = 1.3f*sin(M_PI*(90.0f*(time/20.0f))/180.0); + HuSprGrpScaleSet(group, scale, scale); + HuSprGrpZRotSet(group, zrot); + } + if(work->time > 20 && work->time <= 25) { + HuSprGrpZRotSet(group, 0.0f); + time = work->time-20; + scale = 1.0+(0.3*cos(M_PI*(90.0f*(time/5.0f))/180.0)); + HuSprGrpScaleSet(group, scale, scale); + } + if(work->time == 5) { + HuAudFXPlay(40); + } + if(work->time == 60) { + work->type = 0; + } + } + break; + + case -1: + { + float tp_lvl; + work->work_float[0] += seqSpeed*0.1f; + tp_lvl = 1.0f-work->work_float[0]; + if(tp_lvl <= 0.0f) { + tp_lvl = 0.0f; + work->work_s16[1] = 0; + work->stat |= 0x8; + } + HuSprGrpTPLvlSet(group, tp_lvl); + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static char *winCharNameTbl[] = { + "マリオ", + "MARIO", + "ルイージ", + "LUIGI", + "ピーチ", + "PEACH", + "ヨッシー", + "YOSHI", + "ワリオ", + "WARIO", + "ドンキー", + " DK ", + "デイジー", + "DAISY", + "ワルイージ", + "WALUIGI", + "クッパ", + "BOWSER", + "キノピオ", + "TOAD", + "ヘイホー", + "SHY GUY", + "テレサ", + "BOO", + "ノコノコ", + "KOOPA", + "ミニクッパ", + "KOOPA KID", + "クリボー", + "GOOMBA" +}; + +static char *winWordTbl[] = { + "カチ", + "WON!", + "ハイボク", + "LOSE", + "ユウショウ!", + "CHAMPION!" +}; + +static s16 winPosOfs[][5][2] = { + { + { 114, 0 }, + { -144, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 } + }, + { + { 0, 35 }, + { -144, -35 }, + { 144, -35 }, + { 0, 0 }, + { 0, 0 } + }, + { + { 0, 105 }, + { 0, -105 }, + { -144, 0 }, + { 144, 0 }, + { 0, 0 } + }, + { + { 0, 105 }, + { -144, -105 }, + { 144, -105 }, + { -144, 0 }, + { 144, 0 } + } +}; + +static s16 winnerNameW[8]; + +#define GET_LANG_IDX() ((seqLanguage == 0) ? 0 : 1) +#define GET_WIN_KANAF() ((seqLanguage == 0) ? 1 : 0) + + +static int SeqInitWin(SeqWork *work, va_list params) +{ + s32 win_type = va_arg(params, int); + s16 word_idx; + s16 word_grp; + s32 i; + s32 j; + s32 num_winners; + float word_w; + float word_x; + if(win_type < 0 && win_type >= 6) { + return 0; + } + if(win_type == 3) { + word_idx = GET_LANG_IDX(); + } else { + if(win_type == 4) { + word_idx = GET_LANG_IDX()+2; + } else { + word_idx = GET_LANG_IDX()+4; + } + } + word_grp = SeqMakeWord(work, winWordTbl[word_idx], GET_WIN_KANAF()); + winnerNameW[0] = work->work_s16[3]*50; + for(i=0; iwork_s16[3]; i++) { + HuSprPosSet(work->spr_grp[word_grp], i, 25.0f+((i*50)-(0.5f*(work->work_s16[3]*50))), 0.0f); + HuSprAttrSet(work->spr_grp[word_grp], i, SPRITE_ATTR_BILINEAR); + } + num_winners = 0; + work->work_float[1] = 1.0f; + for(j=0; j<4; j++) { + s32 winner = va_arg(params, int); + if(winner < 0) { + continue; + } + word_grp = SeqMakeWord(work, winCharNameTbl[(winner*2)+GET_LANG_IDX()], 0); + if(seqLanguage != 0) { + char *name = winCharNameTbl[(winner*2)+GET_LANG_IDX()]; + word_w = 0.0f; + for(i=word_w; iwork_s16[3]; i++, name++) { + if(*name == ' ') { + word_w += 30.0f; + } else { + word_w += 50.0f; + } + } + name = winCharNameTbl[(winner*2)+GET_LANG_IDX()]; + word_x = 0.0f; + for(i=word_x; iwork_s16[3]; i++, name++) { + HuSprPosSet(work->spr_grp[word_grp], i, 25.0+(word_x-(0.5*word_w)), 0.0f); + HuSprAttrSet(work->spr_grp[word_grp], i, SPRITE_ATTR_BILINEAR); + if(*name == ' ') { + word_x += 30.0f; + } else { + word_x += 50.0f; + } + } + if(work->work_float[1] == 0.6f || winner == 7 || winner == 13 || winner == 10) { + work->work_float[1] = 0.6f; + } else { + work->work_float[1] = 0.75f; + } + winnerNameW[num_winners+1] = word_w; + } else { + if(winner == 7 || winner == 13) { + for(i=0;iwork_s16[3]; i++) { + HuSprPosSet(work->spr_grp[word_grp], i, 26.0f+((i*52)-(0.5f*(work->work_s16[3]*52))), 0.0f); + HuSprAttrSet(work->spr_grp[word_grp], i, SPRITE_ATTR_BILINEAR); + } + work->work_float[1] = 0.8f; + winnerNameW[num_winners+1] = work->work_s16[3]*52; + } else { + work->work_float[1] = 1.0f; + winnerNameW[num_winners+1] = work->work_s16[3]*56; + } + + } + num_winners++; + } + if(num_winners == 0) { + return 0; + } + work->work_s16[1] = 0; + work->work_s16[3] = num_winners+1; + work->work_float[0] = 0.0f; + work->type = 0; + for(j=0; jwork_float[1])); + if(j == 0) { + word_x = (((576.0f-word_x)/2.0f)+(word_x-(winnerNameW[0]/2)))-288.0f; + } else { + word_x = (((576.0f-word_x)/2.0f)+(winnerNameW[1]/2))-288.0f; + } + } else { + if(abs(winPosOfs[num_winners-1][j][0]) == 144.0f) { + if(winnerNameW[j]+32 < 288.0f) { + word_x = 176.0f; + } else { + word_x = 32.0f+((winnerNameW[j]*work->work_float[1])/2.0f); + } + if(winPosOfs[num_winners-1][j][0] < 0) { + word_x = -(288.0f-word_x); + } else { + word_x = (576.0f-word_x)-288.0f; + } + } else { + word_x = winPosOfs[num_winners-1][j][0]; + } + } + HuSprGrpPosSet(work->spr_grp[j], 288.0f+word_x, 240.0f+winPosOfs[num_winners-1][j][1]); + } + if(seqPauseF) { + work->type = 1; + num_winners++; + for(j=0; jspr_grp[j], 0, SPRITE_ATTR_HIDDEN); + } + } else { + work->param[0] = 3; + } + return 1; +} + + +static int SeqUpdateWin(SeqWork *work) +{ + s32 idx; + float tp_lvl; + s16 group = work->spr_grp[0]; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + float time; + float scale; + float zrot; + if(work->time <= 20) { + time = work->time; + zrot = 365.0f*(time/20.0f); + scale = sin(M_PI*(90.0f*(time/20.0f))/180.0); + HuSprGrpScaleSet(work->spr_grp[0], scale, scale); + HuSprGrpZRotSet(work->spr_grp[0], zrot); + scale = 1.0+(5.0*cos(M_PI*(90.0f*(time/20.0f))/180.0)); + tp_lvl = time/20.0f; + for(idx=1; idxwork_s16[3]; idx++) { + HuSprGrpTPLvlSet(work->spr_grp[idx], tp_lvl); + HuSprGrpScaleSet(work->spr_grp[idx], scale*work->work_float[1], scale); + } + } + if(work->time > 20 && work->time <= 22) { + HuSprGrpZRotSet(work->spr_grp[0], 0.0f); + for(idx=1; idxwork_s16[3]; idx++) { + float pos_x; + float ofs[2]; + if(work->time == 21) { + ofs[0] = ((idx & 0x1)*2)-1; + ofs[1] = (idx & 0x2) ? 2 : -1; + } else { + ofs[0] = ofs[1] = 0.0f; + } + if(work->work_s16[3] == 2) { + pos_x = winnerNameW[1]+winnerNameW[0]+32; + pos_x = (((576.0f-pos_x)/2.0f)+(winnerNameW[1]/2))-288.0f; + } else { + if(abs(winPosOfs[work->work_s16[3]-2][idx][0]) == 144.0f) { + if(winnerNameW[idx]+32 < 288.0f) { + pos_x = 176.0f; + } else { + pos_x = 32.0f+((winnerNameW[idx]*work->work_float[1])/2.0f); + } + if(winPosOfs[work->work_s16[3]-2][idx][0] < 0) { + pos_x = -(288.0f-pos_x); + } else { + pos_x = (576.0f-pos_x)-288.0f; + } + } else { + pos_x = winPosOfs[work->work_s16[3]-2][idx][0]; + } + } + HuSprGrpPosSet(work->spr_grp[idx], (288.0f+pos_x)+ofs[0], ofs[1]+(240.0f+winPosOfs[work->work_s16[3]-2][idx][1])); + } + } + if(work->time == 125) { + work->type = 0; + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + tp_lvl = 1.0f-work->work_float[0]; + if(tp_lvl <= 0.0f) { + tp_lvl = 0.0f; + work->work_s16[1] = 0; + work->stat |= 0x8; + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprGrpTPLvlSet(work->spr_grp[idx], tp_lvl); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqInitRecord(SeqWork *work, va_list params) +{ + AnimData *spr_data; + s16 spr_grp; + s16 time_pos[2]; + s16 i; + s16 sprite; + s16 digit_idx; + s32 digit; + seqRecordVal = va_arg(params, int); + work->type = 0; + work->work_float[0] = 0.0f; + work->spr_grp[0] = spr_grp = HuSprGrpCreate(10); + spr_data = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 9))); + sprite = HuSprCreate(spr_data, 0, 0); + HuSprGrpMemberSet(spr_grp, 0, sprite); + HuSprPosSet(spr_grp, 0, 0.0f, -32.0f); + spr_data = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 8))); + sprite = HuSprCreate(spr_data, 0, 0); + HuSprGrpMemberSet(spr_grp, 1, sprite); + spr_data = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 7))); + for(i=0; i<8; i++) { + sprite = HuSprCreate(spr_data, 0, 0); + HuSprGrpMemberSet(spr_grp, i+2, sprite); + } + if(omcurovl == OVL_M407 || omcurovl == OVL_M453 || omcurovl == OVL_M459 || omcurovl == OVL_M460 || omcurovl == OVL_M462 || omcurovl == OVL_M442) { + digit_idx = 0; + if(seqRecordVal > 9999) { + seqRecordVal = 9999; + } + digit = seqRecordVal/1000; + if(digit != 0) { + HuSprBankSet(spr_grp, digit_idx+2, digit); + seqRecordVal -= digit*1000; + digit_idx++; + } + + digit = seqRecordVal/100; + if(digit != 0 || digit_idx != 0) { + HuSprBankSet(spr_grp, digit_idx+2, digit); + seqRecordVal -= digit*100; + digit_idx++; + } + digit = seqRecordVal/10; + if(digit != 0 || digit_idx != 0) { + HuSprBankSet(spr_grp, digit_idx+2, digit); + seqRecordVal -= digit*10; + digit_idx++; + } + HuSprBankSet(spr_grp, digit_idx+2, seqRecordVal); + digit_idx++; + for(i=digit_idx; i<8; i++) { + HuSprAttrSet(spr_grp, i+2, SPRITE_ATTR_HIDDEN); + } + HuSprPosSet(spr_grp, 1, (-((digit_idx*44)+48)/2)+24, 32.0f); + for(i=0; iparam[0] = 3; + return 1; +} + +static int SeqUpdateRecord(SeqWork *work) +{ + s16 group; + if(_CheckFlag(0x1000C)) { + work->work_s16[1] = 0; + work->stat |= 0xC; + } else { + group = work->spr_grp[0]; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + if(work->time <= 10) { + HuSprGrpTPLvlSet(group, work->time/10.0); + } + if(work->time == 5) { + HuAudFXPlay(38); + } + if(work->time == 30) { + work->type = 0; + } + } + break; + + case -1: + { + float tp_lvl; + work->work_float[0] += seqSpeed*0.1f; + tp_lvl = 1.0f-work->work_float[0]; + if(tp_lvl <= 0.0f) { + tp_lvl = 0.0f; + work->work_s16[1] = 0; + work->stat |= 0x8; + } + HuSprGrpTPLvlSet(group, tp_lvl); + } + break; + + default: + break; + } + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static void PauseProc(void); + +void MGSeqPauseInit(void) +{ + MGSeqPauseEnableCtrl(0); + HuWinInit(1); + pauseProcess = HuPrcCreate(PauseProc, 100, 4096, 0); + HuPrcSetStat(pauseProcess, PROCESS_STAT_PAUSE_EN|PROCESS_STAT_UPAUSE_EN); + pauseActiveF = 1; + pauseExitF = 0; + pauseWaitF = 0; +} + +static void PauseProc(void) +{ + s16 mg; + s16 i; + s16 j; + + s16 char_mess_map[4]; + s16 char_mess[4][4]; + s16 window[3] = { -1, -1, -1 }; + + SeqWork work; + static char *pauseStr[] = { + "ポーズ", + "PAUSE" + }; + float ratio; + + HuAudFXPlay(5); + for(i=0; i<16; i++) { + work.sprite[i] = work.spr_grp[i] = -1; + } + SeqMakeWord(&work, pauseStr[GET_LANG_IDX()], 0); + for(i=0; iwork[0] == 0) { + if(omMgIndexGet(omcurovl) == -1) { + omDelObjEx(HuPrcCurrentGet(), object); + return; + } + object->work[0]++; + } + if(!omPauseChk() || _CheckFlag(0x1000C) || !pauseWaitF) { + return; + } + for(i=input=0; i<4; i++) { + input |= HuPadBtnDown[i]; + } + if(input & PAD_TRIGGER_Z) { + HuAudFXPlay(3); + pauseExitF = 1; + omSysPauseCtrl(0); + omSysExitReq = 1; + mgQuitExtraF = 1; + omDelObjEx(HuPrcCurrentGet(), object); + } +} \ No newline at end of file diff --git a/src/game/objdll.c b/src/game/objdll.c new file mode 100644 index 00000000..067bee54 --- /dev/null +++ b/src/game/objdll.c @@ -0,0 +1,172 @@ +#include "game/object.h" +#include "game/dvd.h" +#include "game/memory.h" + +typedef s32 (*DLLProlog)(void); +typedef void (*DLLEpilog)(void); + +omDllData *omDLLinfoTbl[OM_DLL_MAX]; + +static FileListEntry *omDLLFileList; + +void omDLLDBGOut(void) +{ + OSReport("DLL DBG OUT\n"); +} + +void omDLLInit(FileListEntry *ovl_list) +{ + int i; + OSReport("DLL DBG OUT\n"); + for(i=0; i= 0 && !flag) { + omDllData *dll = omDLLinfoTbl[dllno]; + OSReport("objdll>Already Loaded %s(%08x %08x)\n", dll->name, dll->module, dll->bss); + + omDLLInfoDump(&dll->module->info); + omDLLHeaderDump(dll->module); + memset(dll->bss, 0, dll->module->bssSize); + HuMemDCFlushAll(); + dll->ret = ((DLLProlog)dll->module->prolog)(); + OSReport("objdll> %s prolog end\n", dll->name); + return dllno; + } else { + for(dllno=0; dllnoomDLLNumEnd Invalid dllno %d\n", overlay); + return; + } + OSReport("objdll>omDLLNumEnd %d %d\n", overlay, flag); + dllno = omDLLSearch(overlay); + if(dllno < 0) { + OSReport("objdll>omDLLNumEnd not found DLL No%d\n", overlay); + return; + } + omDLLEnd(dllno, flag); +} + +void omDLLEnd(s16 dllno, s16 flag) +{ + OSReport("objdll>omDLLEnd %d %d\n", dllno, flag); + if(flag == 1) { + OSReport("objdll>End DLL:%s\n", omDLLinfoTbl[dllno]->name); + omDLLUnlink(omDLLinfoTbl[dllno], 1); + omDLLinfoTbl[dllno] = NULL; + } else { + omDllData *dll; + dll = omDLLinfoTbl[dllno]; + OSReport("objdll>Call Epilog\n"); + ((DLLEpilog)dll->module->epilog)(); + OSReport("objdll>End DLL stayed:%s\n", omDLLinfoTbl[dllno]->name); + } + OSReport("objdll>End DLL finish\n"); +} + +omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag) +{ + omDllData *dll; + FileListEntry *dllFile = &omDLLFileList[overlay]; + OSReport("objdll>Link DLL:%s\n", dllFile->name); + dll = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(omDllData)); + *dll_ptr = dll; + dll->name = dllFile->name; + dll->module = HuDvdDataReadDirect(dllFile->name, HEAP_SYSTEM); + dll->bss = HuMemDirectMalloc(HEAP_SYSTEM, dll->module->bssSize); + if(OSLink(&dll->module->info, dll->bss) != TRUE) { + OSReport("objdll>++++++++++++++++ DLL Link Failed\n"); + } + omDLLInfoDump(&dll->module->info); + omDLLHeaderDump(dll->module); + OSReport("objdll>LinkOK %08x %08x\n", dll->module, dll->bss); + if(flag == 1) { + OSReport("objdll> %s prolog start\n", dllFile->name); + dll->ret = ((DLLProlog)dll->module->prolog)(); + OSReport("objdll> %s prolog end\n", dllFile->name); + } + return dll; +} + +void omDLLUnlink(omDllData *dll_ptr, s16 flag) +{ + OSReport("odjdll>Unlink DLL:%s\n", dll_ptr->name); + if(flag == 1) { + OSReport("objdll>Unlink DLL epilog\n"); + ((DLLEpilog)dll_ptr->module->epilog)(); + OSReport("objdll>Unlink DLL epilog finish\n"); + } + if(OSUnlink(&dll_ptr->module->info) != TRUE) { + OSReport("objdll>+++++++++++++++++ DLL Unlink Failed\n"); + } + HuMemDirectFree(dll_ptr->bss); + HuMemDirectFree(dll_ptr->module); + HuMemDirectFree(dll_ptr); +} + +s32 omDLLSearch(s16 overlay) +{ + s32 i; + FileListEntry *dllFile = &omDLLFileList[overlay]; + OSReport("Search:%s\n", dllFile->name); + for(i=0; iname, dllFile->name) == 0) { + OSReport("+++++++++++ Find%d: %s\n", i, dll->name); + return i; + } + } + return -1; +} + +void omDLLInfoDump(OSModuleInfo *module) +{ + OSReport("===== DLL Module Info dump ====\n"); + OSReport(" ID:0x%08x\n", module->id); + OSReport(" LinkPrev:0x%08x\n", module->link.prev); + OSReport(" LinkNext:0x%08x\n", module->link.next); + OSReport(" Section num:%d\n", module->numSections); + OSReport("Section info tbl ofst:0x%08x\n", module->sectionInfoOffset); + OSReport(" nameOffset:0x%08x\n", module->nameOffset); + OSReport(" nameSize:%d\n", module->nameSize); + OSReport(" version:0x%08x\n", module->version); + OSReport("===============================\n"); +} + +void omDLLHeaderDump(OSModuleHeader *module) +{ + OSReport("==== DLL Module Header dump ====\n"); + OSReport(" bss Size:0x%08x\n", module->bssSize); + OSReport(" rel Offset:0x%08x\n", module->relOffset); + OSReport(" imp Offset:0x%08x\n", module->impOffset); + OSReport(" prolog Section:%d\n", module->prologSection); + OSReport(" epilog Section:%d\n", module->epilogSection); + OSReport("unresolved Section:%d\n", module->unresolvedSection); + OSReport(" prolog func:0x%08x\n", module->prolog); + OSReport(" epilog func:0x%08x\n", module->epilog); + OSReport(" unresolved func:0x%08x\n", module->unresolved); + OSReport("================================\n"); +} \ No newline at end of file diff --git a/src/game/objmain.c b/src/game/objmain.c index 5712f4d5..88ab203a 100644 --- a/src/game/objmain.c +++ b/src/game/objmain.c @@ -1,4 +1,5 @@ #include "game/audio.h" +#include "game/chrman.h" #include "game/esprite.h" #include "game/hsfdraw.h" #include "game/hsfman.h" @@ -45,7 +46,7 @@ s16 omdispinfo; static omOvlHisData omovlhis[OM_OVL_HIS_MAX]; -char omSysPauseEnableFlag = TRUE; +u8 omSysPauseEnableFlag = TRUE; OverlayID omprevovl = OVL_INVALID; static void omWatchOverlayProc(void); diff --git a/src/game/objsub.c b/src/game/objsub.c new file mode 100644 index 00000000..157500c3 --- /dev/null +++ b/src/game/objsub.c @@ -0,0 +1,1221 @@ +#include "game/objsub.h" +#include "game/gamework_data.h" +#include "game/object.h" +#include "game/data.h" + +MgInfo mgInfoTbl[] = { + { + OVL_M401, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x170001, // name_mess + DATADIR_M401, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 0), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 0), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210000, // rules_mess + 0x210001, // control_mess[0] + 0, // control_mess[1] + 0x210003, // advice_mess + }, + { + OVL_M402, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x170002, // name_mess + DATADIR_M402, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 1), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 1), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210004, // rules_mess + 0x210005, // control_mess[0] + 0, // control_mess[1] + 0x210007, // advice_mess + }, + { + OVL_M403, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x170003, // name_mess + DATADIR_M403, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 2), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 2), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210008, // rules_mess + 0x210009, // control_mess[0] + 0, // control_mess[1] + 0x21000B, // advice_mess + }, + { + OVL_M404, // ovl + 4, // type + 2, // flag + 255, // record_idx + 0x170004, // name_mess + DATADIR_M404, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 3), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 3), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21000C, // rules_mess + 0x21000D, // control_mess[0] + 0, // control_mess[1] + 0x21000F, // advice_mess + }, + { + OVL_M405, // ovl + 0, // type + 2, // flag + 0, // record_idx + 0x170005, // name_mess + DATADIR_M405, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 4), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 4), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210010, // rules_mess + 0x210011, // control_mess[0] + 0, // control_mess[1] + 0x210013, // advice_mess + }, + { + OVL_M406, // ovl + 0, // type + 2, // flag + 255, // record_idx + 0x170006, // name_mess + DATADIR_M406, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 5), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 5), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210014, // rules_mess + 0x210015, // control_mess[0] + 0, // control_mess[1] + 0x210017, // advice_mess + }, + { + OVL_M407, // ovl + 0, // type + 3, // flag + 1, // record_idx + 0x170007, // name_mess + DATADIR_M407, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 6), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 6), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210018, // rules_mess + 0x210019, // control_mess[0] + 0, // control_mess[1] + 0x21001B, // advice_mess + }, + { + OVL_M408, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x170008, // name_mess + DATADIR_M408, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 7), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 7), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21001C, // rules_mess + 0x21001D, // control_mess[0] + 0, // control_mess[1] + 0x21001F, // advice_mess + }, + { + OVL_M409, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x170009, // name_mess + DATADIR_M409, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 8), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 8), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210020, // rules_mess + 0x210021, // control_mess[0] + 0, // control_mess[1] + 0x210023, // advice_mess + }, + { + OVL_M410, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x17000A, // name_mess + DATADIR_M410, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 9), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 9), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210024, // rules_mess + 0x210025, // control_mess[0] + 0, // control_mess[1] + 0x210027, // advice_mess + }, + { + OVL_M411, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x17000B, // name_mess + DATADIR_M411, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 10), // inst_pic[0] + DATA_MAKE_NUM(DATADIR_INSTPIC, 11), // inst_pic[1] + DATA_MAKE_NUM(DATADIR_INSTPIC, 12), // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 62), // mg_pic[0] + DATA_MAKE_NUM(DATADIR_INSTPIC, 11), // mg_pic[1] + DATA_MAKE_NUM(DATADIR_INSTPIC, 12), // mg_pic[2] + 0x210028, // rules_mess + 0x210029, // control_mess[0] + 0, // control_mess[1] + 0x21002B, // advice_mess + }, + { + OVL_M412, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x17000C, // name_mess + DATADIR_M412, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 13), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 13), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21002C, // rules_mess + 0x21002D, // control_mess[0] + 0, // control_mess[1] + 0x21002F, // advice_mess + }, + { + OVL_M413, // ovl + 0, // type + 2, // flag + 255, // record_idx + 0x17000D, // name_mess + DATADIR_M413, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 14), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 63), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210030, // rules_mess + 0x210031, // control_mess[0] + 0, // control_mess[1] + 0x210033, // advice_mess + }, + { + OVL_M414, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x17000E, // name_mess + DATADIR_M414, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 15), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 15), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210034, // rules_mess + 0x210035, // control_mess[0] + 0, // control_mess[1] + 0x210037, // advice_mess + }, + { + OVL_M415, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x17000F, // name_mess + DATADIR_M415, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 16), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 16), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210038, // rules_mess + 0x210039, // control_mess[0] + 0, // control_mess[1] + 0x21003B, // advice_mess + }, + { + OVL_M416, // ovl + 1, // type + 1, // flag + 255, // record_idx + 0x170010, // name_mess + DATADIR_M416, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 17), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 17), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21003C, // rules_mess + 0x21003D, // control_mess[0] + 0x21003E, // control_mess[1] + 0x21003F, // advice_mess + }, + { + OVL_M417, // ovl + 1, // type + 1, // flag + 255, // record_idx + 0x170011, // name_mess + DATADIR_M417, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 18), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 18), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210040, // rules_mess + 0x210041, // control_mess[0] + 0x210042, // control_mess[1] + 0x210043, // advice_mess + }, + { + OVL_M418, // ovl + 1, // type + 1, // flag + 255, // record_idx + 0x170012, // name_mess + DATADIR_M418, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 19), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 19), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210044, // rules_mess + 0x210045, // control_mess[0] + 0x210046, // control_mess[1] + 0x210047, // advice_mess + }, + { + OVL_M419, // ovl + 1, // type + 1, // flag + 255, // record_idx + 0x170013, // name_mess + DATADIR_M419, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 20), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 20), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210048, // rules_mess + 0x210049, // control_mess[0] + 0x21004A, // control_mess[1] + 0x21004B, // advice_mess + }, + { + OVL_M420, // ovl + 1, // type + 0, // flag + 255, // record_idx + 0x170014, // name_mess + DATADIR_M420, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 21), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 21), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21004C, // rules_mess + 0x21004D, // control_mess[0] + 0x21004E, // control_mess[1] + 0x21004F, // advice_mess + }, + { + OVL_M421, // ovl + 1, // type + 1, // flag + 255, // record_idx + 0x170015, // name_mess + DATADIR_M421, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 22), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 22), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210050, // rules_mess + 0x210051, // control_mess[0] + 0x210052, // control_mess[1] + 0x210053, // advice_mess + }, + { + OVL_M422, // ovl + 1, // type + 1, // flag + 255, // record_idx + 0x170016, // name_mess + DATADIR_M422, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 23), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 23), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210054, // rules_mess + 0x210055, // control_mess[0] + 0x210056, // control_mess[1] + 0x210057, // advice_mess + }, + { + OVL_M423, // ovl + 1, // type + 0, // flag + 255, // record_idx + 0x170017, // name_mess + DATADIR_M423, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 24), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 24), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210058, // rules_mess + 0x210059, // control_mess[0] + 0x21005A, // control_mess[1] + 0x21005B, // advice_mess + }, + { + OVL_M424, // ovl + 1, // type + 0, // flag + 255, // record_idx + 0x170018, // name_mess + DATADIR_M424, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 25), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 25), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21005C, // rules_mess + 0x21005D, // control_mess[0] + 0x21005E, // control_mess[1] + 0x21005F, // advice_mess + }, + { + OVL_M425, // ovl + 2, // type + 3, // flag + 255, // record_idx + 0x170019, // name_mess + DATADIR_M425, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 26), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 26), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210060, // rules_mess + 0x210061, // control_mess[0] + 0, // control_mess[1] + 0x210063, // advice_mess + }, + { + OVL_M426, // ovl + 2, // type + 3, // flag + 255, // record_idx + 0x17001A, // name_mess + DATADIR_M426, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 27), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 27), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210064, // rules_mess + 0x210065, // control_mess[0] + 0, // control_mess[1] + 0x210067, // advice_mess + }, + { + OVL_M427, // ovl + 2, // type + 2, // flag + 2, // record_idx + 0x17001B, // name_mess + DATADIR_M427, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 28), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 28), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210068, // rules_mess + 0x210069, // control_mess[0] + 0, // control_mess[1] + 0x21006B, // advice_mess + }, + { + OVL_M428, // ovl + 2, // type + 3, // flag + 255, // record_idx + 0x17001C, // name_mess + DATADIR_M428, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 29), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 29), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21006C, // rules_mess + 0x21006D, // control_mess[0] + 0, // control_mess[1] + 0x21006F, // advice_mess + }, + { + OVL_M429, // ovl + 2, // type + 2, // flag + 255, // record_idx + 0x17001D, // name_mess + DATADIR_M429, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 30), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 64), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210070, // rules_mess + 0x210071, // control_mess[0] + 0, // control_mess[1] + 0x210073, // advice_mess + }, + { + OVL_M430, // ovl + 2, // type + 3, // flag + 255, // record_idx + 0x17001E, // name_mess + DATADIR_M430, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 31), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 31), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210074, // rules_mess + 0x210075, // control_mess[0] + 0x210076, // control_mess[1] + 0x210077, // advice_mess + }, + { + OVL_M431, // ovl + 2, // type + 3, // flag + 255, // record_idx + 0x17001F, // name_mess + DATADIR_M431, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 32), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 32), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210078, // rules_mess + 0x210079, // control_mess[0] + 0, // control_mess[1] + 0x21007B, // advice_mess + }, + { + OVL_M432, // ovl + 2, // type + 3, // flag + 3, // record_idx + 0x170020, // name_mess + DATADIR_M432, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 33), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 33), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21007C, // rules_mess + 0x21007D, // control_mess[0] + 0x21007E, // control_mess[1] + 0x21007F, // advice_mess + }, + { + OVL_M433, // ovl + 7, // type + 3, // flag + 255, // record_idx + 0x170021, // name_mess + DATADIR_M433, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 34), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 34), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210080, // rules_mess + 0x37001F, // control_mess[0] + 0, // control_mess[1] + 0x210083, // advice_mess + }, + { + OVL_M434, // ovl + 2, // type + 2, // flag + 255, // record_idx + 0x170022, // name_mess + DATADIR_M434, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 35), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 35), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210084, // rules_mess + 0x210085, // control_mess[0] + 0, // control_mess[1] + 0x210087, // advice_mess + }, + { + OVL_M435, // ovl + 3, // type + 3, // flag + 255, // record_idx + 0x170023, // name_mess + DATADIR_M435, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 36), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 36), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0x210089, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M436, // ovl + 3, // type + 3, // flag + 255, // record_idx + 0x170024, // name_mess + DATADIR_M436, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 37), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 37), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0x21008D, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M437, // ovl + 3, // type + 3, // flag + 255, // record_idx + 0x170025, // name_mess + DATADIR_M437, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 38), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 38), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0x210091, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M438, // ovl + 4, // type + 3, // flag + 255, // record_idx + 0x170026, // name_mess + DATADIR_M438, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 39), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 39), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210094, // rules_mess + 0x210095, // control_mess[0] + 0, // control_mess[1] + 0x210097, // advice_mess + }, + { + OVL_M439, // ovl + 4, // type + 2, // flag + 255, // record_idx + 0x170027, // name_mess + DATADIR_M439, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 40), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 40), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x210098, // rules_mess + 0x210099, // control_mess[0] + 0, // control_mess[1] + 0x21009B, // advice_mess + }, + { + OVL_M440, // ovl + 4, // type + 3, // flag + 255, // record_idx + 0x170028, // name_mess + DATADIR_M440, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 41), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 41), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x21009C, // rules_mess + 0x21009D, // control_mess[0] + 0, // control_mess[1] + 0x21009F, // advice_mess + }, + { + OVL_M441, // ovl + 4, // type + 3, // flag + 255, // record_idx + 0x170029, // name_mess + DATADIR_M441, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 42), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 42), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100A0, // rules_mess + 0x2100A1, // control_mess[0] + 0, // control_mess[1] + 0x2100A3, // advice_mess + }, + { + OVL_M442, // ovl + 7, // type + 3, // flag + 255, // record_idx + 0x17002A, // name_mess + DATADIR_M442, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 43), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 65), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100A4, // rules_mess + 0x370010, // control_mess[0] + 0, // control_mess[1] + 0x2100A7, // advice_mess + }, + { + OVL_M443, // ovl + 0, // type + 2, // flag + 5, // record_idx + 0x17002B, // name_mess + DATADIR_M443, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 44), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 44), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100A8, // rules_mess + 0x2100A9, // control_mess[0] + 0, // control_mess[1] + 0x2100AB, // advice_mess + }, + { + OVL_M444, // ovl + 5, // type + 3, // flag + 255, // record_idx + 0x17002C, // name_mess + DATADIR_M444, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 45), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 45), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M445, // ovl + 6, // type + 0, // flag + 255, // record_idx + 0x17002D, // name_mess + DATADIR_M445, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 46), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 46), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100AC, // rules_mess + 0x2100AD, // control_mess[0] + 0, // control_mess[1] + 0x2100AF, // advice_mess + }, + { + OVL_M446, // ovl + 6, // type + 0, // flag + 255, // record_idx + 0x17002E, // name_mess + DATADIR_M446, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 47), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 47), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100B0, // rules_mess + 0x2100B1, // control_mess[0] + 0, // control_mess[1] + 0x2100B3, // advice_mess + }, + { + OVL_M447, // ovl + 6, // type + 0, // flag + 255, // record_idx + 0x17002F, // name_mess + DATADIR_M447, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 48), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 48), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100B4, // rules_mess + 0x2100B5, // control_mess[0] + 0, // control_mess[1] + 0x2100B7, // advice_mess + }, + { + OVL_M448, // ovl + 6, // type + 0, // flag + 255, // record_idx + 0x170030, // name_mess + DATADIR_M448, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 49), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 49), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100B8, // rules_mess + 0x2100B9, // control_mess[0] + 0, // control_mess[1] + 0x2100BB, // advice_mess + }, + { + OVL_M449, // ovl + 6, // type + 0, // flag + 255, // record_idx + 0x170031, // name_mess + DATADIR_M449, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100BC, // rules_mess + 0x2100BD, // control_mess[0] + 0, // control_mess[1] + 0x2100BF, // advice_mess + }, + { + OVL_M450, // ovl + 8, // type + 0, // flag + 255, // record_idx + 0x170032, // name_mess + DATADIR_M450, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 51), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 51), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100C0, // rules_mess + 0x2100C1, // control_mess[0] + 0, // control_mess[1] + 0x2100C3, // advice_mess + }, + { + OVL_M451, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170033, // name_mess + DATADIR_M451, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 52), // inst_pic[0] + DATA_MAKE_NUM(DATADIR_INSTPIC, 53), // inst_pic[1] + DATA_MAKE_NUM(DATADIR_INSTPIC, 54), // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 52), // mg_pic[0] + DATA_MAKE_NUM(DATADIR_INSTPIC, 53), // mg_pic[1] + DATA_MAKE_NUM(DATADIR_INSTPIC, 54), // mg_pic[2] + 0x2100C4, // rules_mess + 0x37000D, // control_mess[0] + 0, // control_mess[1] + 0x2100C7, // advice_mess + }, + { + OVL_M450, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170033, // name_mess + DATADIR_M450, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 55), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 55), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M453, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170034, // name_mess + DATADIR_M450, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100C8, // rules_mess + 0x37000A, // control_mess[0] + 0, // control_mess[1] + 0x2100CB, // advice_mess + }, + { + OVL_M450, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170033, // name_mess + DATADIR_M450, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 55), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 55), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M455, // ovl + 4, // type + 3, // flag + 255, // record_idx + 0x170035, // name_mess + DATADIR_M455, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 56), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 56), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100CC, // rules_mess + 0x2100CD, // control_mess[0] + 0, // control_mess[1] + 0x2100CF, // advice_mess + }, + { + OVL_M456, // ovl + 0, // type + 3, // flag + 255, // record_idx + 0x170036, // name_mess + DATADIR_M456, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 57), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 57), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0x2100D0, // rules_mess + 0x2100D1, // control_mess[0] + 0, // control_mess[1] + 0x2100D3, // advice_mess + }, + { + OVL_M457, // ovl + 8, // type + 0, // flag + 255, // record_idx + 0x170037, // name_mess + DATADIR_M457, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 58), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 58), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M458, // ovl + 8, // type + 0, // flag + 255, // record_idx + 0x170038, // name_mess + DATADIR_M458, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 59), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 59), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M459, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170038, // name_mess + DATADIR_M458, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0x370013, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M460, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170038, // name_mess + DATADIR_M458, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0x370016, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M461, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170038, // name_mess + DATADIR_M458, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0x370019, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M462, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170038, // name_mess + DATADIR_M458, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0x37001C, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + OVL_M463, // ovl + 7, // type + 0, // flag + 255, // record_idx + 0x170038, // name_mess + DATADIR_M458, // data_dir + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + DATA_MAKE_NUM(DATADIR_INSTPIC, 50), // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0x370007, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, + { + ((u16)OVL_INVALID), // ovl + 0, // type + 0, // flag + 255, // record_idx + 0, // name_mess + 0, // data_dir + 0, // inst_pic[0] + 0, // inst_pic[1] + 0, // inst_pic[2] + 0, // mg_pic[0] + 0, // mg_pic[1] + 0, // mg_pic[2] + 0, // rules_mess + 0, // control_mess[0] + 0, // control_mess[1] + 0, // advice_mess + }, +}; + +void MGSeqPracticeExitCheck(omObjData*); + +s16 mgTypeCurr; +s16 mgBattleStar[4]; +s16 mgBattleStarMax; +u8 lbl_801D3E94; +s32 mgRecordExtra; +s32 mgQuitExtraF; +s32 mgPracticeEnableF; +s32 mgInstExitEnableF; +u8 mgBoardHostEnableF; + +s16 mgTicTacToeGrid[3][3]; +u8 mgIndexList[256]; +GameStat mgGameStatBackup; + +s32 omMgIndexGet(s16 overlay) { + s32 i; + MgInfo *info; + + info = mgInfoTbl; + + for (i = 0; info->ovl != ((u16)OVL_INVALID); i++) { + if (info->ovl == overlay) { + return (s16)i; + } + info++; + } + + return -1; +} + +void omGameSysInit(Process *objman) { + s32 i; + omObjData* obj; + + omSystemKeyCheckSetup(objman); + Hu3DCameraScissorSet(1, 0, 0, 0x280, 0x1E0); + omSysPauseEnable(0); + + for (i = 0; i < 4; i++) { + if (_CheckFlag(0x1000C) == 0) { + GWPlayer[i].coins_mg_gain = 0; + } + + GWPlayer[i].unk_26 = 0; + } + + if (mgPracticeEnableF != 0) { + obj = omAddObjEx(objman, 0x7FDC, 0, 0, -1, MGSeqPracticeExitCheck); + omSetStatBit(obj, 0xA0U); + } +} + +void omVibrate(s16 player, s16 duration, s16 off, s16 on) { + s32 rumble = GWGameStat.rumble; + + if (rumble != 0 && GWPlayerCfg[player].iscom == 0) { + HuPadRumbleSet(GWPlayerCfg[player].pad_idx, duration, off, on); + } +} diff --git a/src/game/objsysobj.c b/src/game/objsysobj.c new file mode 100644 index 00000000..478db6ef --- /dev/null +++ b/src/game/objsysobj.c @@ -0,0 +1,149 @@ +#include "game/object.h" +#include "game/hsfman.h" +#include "game/pad.h" +#include "game/objsub.h" +#include "game/minigame_seq.h" +#include "game/sprite.h" +#include "game/hsfman.h" +#include "game/audio.h" +#include "math.h" + +Vec CRot; +Vec Center; +float CZoom; +Vec CRotM[16]; +Vec CenterM[16]; +float CZoomM[16]; + +omObjData *omDBGMenuButton; + +void omOutView(omObjData *object) +{ + Vec pos, target, up; + float rot_x = CRot.x; + float rot_y = CRot.y; + float rot_z = CRot.z; + pos.x = (sin(M_PI*rot_y/180.0)*cos(M_PI*rot_x/180.0)*CZoom)+Center.x; + pos.y = (-sin(M_PI*rot_x/180.0)*CZoom)+Center.y; + pos.z = (cos(M_PI*rot_y/180.0)*cos(M_PI*rot_x/180.0)*CZoom)+Center.z; + target.x = Center.x; + target.y = Center.y; + target.z = Center.z; + up.x = sin(M_PI*rot_y/180.0)*sin(M_PI*rot_x/180.0); + up.y = cos(M_PI*rot_x/180.0); + up.z = cos(M_PI*rot_y/180.0)*sin(M_PI*rot_x/180.0); + Hu3DCameraPosSet(1, pos.x, pos.y, pos.z, up.x, up.y, up.z, target.x, target.y, target.z); +} + +void omOutViewMulti(omObjData *object) +{ + u8 i; + for(i=0; iwork[0]; i++) { + Vec pos, target, up; + float rot_x = CRotM[i].x; + float rot_y = CRotM[i].y; + float rot_z = CRotM[i].z; + pos.x = (sin(M_PI*rot_y/180.0)*cos(M_PI*rot_x/180.0)*CZoomM[i])+CenterM[i].x; + pos.y = (-sin(M_PI*rot_x/180.0)*CZoomM[i])+CenterM[i].y; + pos.z = (cos(M_PI*rot_y/180.0)*cos(M_PI*rot_x/180.0)*CZoomM[i])+CenterM[i].z; + target.x = CenterM[i].x; + target.y = CenterM[i].y; + target.z = CenterM[i].z; + up.x = sin(M_PI*rot_y/180.0)*sin(M_PI*rot_x/180.0); + up.y = cos(M_PI*rot_x/180.0); + up.z = cos(M_PI*rot_y/180.0)*sin(M_PI*rot_x/180.0); + Hu3DCameraPosSetV((1 << i), &pos, &up, &target); + } +} + +void omSystemKeyCheck(omObjData *object); + +void omSystemKeyCheckSetup(Process *objman) +{ + omObjData *object; + object = omAddObjEx(objman, 32731, 0, 0, -1, omSystemKeyCheck); + omDBGSysKeyObj = object; + omSetStatBit(object, 0xA0); + object->work[0] = 0; + object->work[1] = 0; + object->work[2] = 0; +} + +void omSystemKeyCheck(omObjData *object) +{ + if(!omSysPauseEnableFlag) { + return; + } + if(object->work[0] & 0x1) { + u32 pad = object->work[1]; + if(pad != (u16)-1 && HuPadStatGet(pad) == 0 && (HuPadBtnDown[pad] & PAD_BUTTON_START)) { + object->work[0] |= 0x200; + } + if(object->work[0] & 0x200) { + if(omMgIndexGet(omcurovl) != -1) { + MGSeqPauseKill(); + } else { + object->work[0] |= 0x100; + } + } + if(object->work[0] & 0x100) { + object->work[0] &= ~0x301; + omAllPause(0); + HuPrcAllPause(0); + Hu3DPauseSet(0); + HuSprPauseSet(0); + HuAudFXPauseAll(0); + HuAudSeqPauseAll(0); + } + } else { + int i; + s16 pause = 0; + if(WipeStatGet() || omCurrentOvlGet() == OVL_INVALID || omSysExitReq) { + return; + } + for(i=0; i<4; i++) { + if(HuPadStatGet(i) == 0 && (HuPadBtnDown[i] & PAD_BUTTON_START)) { + pause = 1; + break; + } + } + if(object->work[0] & 0x80) { + object->work[0] &= ~0x80; + pause = 1; + i = (u16)-1; + } + if(pause) { + object->work[0] |= 0x1; + object->work[1] = i; + omAllPause(1); + HuPrcAllPause(1); + Hu3DPauseSet(1); + HuSprPauseSet(1); + HuAudFXPauseAll(1); + HuAudSeqPauseAll(1); + if(omMgIndexGet(omcurovl) != -1) { + MGSeqPauseInit(); + } + HuPadRumbleAllStop(); + } + } +} + + +void omSysPauseEnable(u8 flag) +{ + omSysPauseEnableFlag = flag; +} + +void omSysPauseCtrl(s16 flag) +{ + if(!omDBGSysKeyObj) { + return; + } + omDBGSysKeyObj->work[0] &= ~0x180; + if(flag) { + omDBGSysKeyObj->work[0] |= 0x80; + } else { + omDBGSysKeyObj->work[0] |= 0x100; + } +} \ No newline at end of file diff --git a/src/game/pad.c b/src/game/pad.c index 139e879f..cded2f4f 100644 --- a/src/game/pad.c +++ b/src/game/pad.c @@ -43,7 +43,7 @@ static u8 _PadDStkRepCnt[4]; static u8 _PadDStkRepOld[4]; static s8 _PadErr[4]; static u32 RumbleBit; -u32 VCounter; +s32 VCounter; static u32 chanTbl[4] = { PAD_CHAN0_BIT, PAD_CHAN1_BIT, PAD_CHAN2_BIT, PAD_CHAN3_BIT }; diff --git a/src/game/saveload.c b/src/game/saveload.c index e12b3f39..0c5c5c26 100644 --- a/src/game/saveload.c +++ b/src/game/saveload.c @@ -5,8 +5,13 @@ #include "game/flag.h" #include "game/card.h" #include "game/gamework_data.h" +#include "data_num/win.h" #include "string.h" +#include "stddef.h" + +#define SAVE_GET_PLAYER(player_idx) &saveBuf.buf[((player_idx)*sizeof(PlayerState))+offsetof(SaveBufData, player)] +#define SAVE_GET_PLAYER_BACKUP(player_idx) &saveBuf.buf[((player_idx)*sizeof(PlayerState))+offsetof(SaveBufData, playerBackup)] static s16 SLCreateSaveWin(void); static void SLKillSaveWin(void); @@ -15,15 +20,15 @@ static void SLKillSaveWin(void); extern u8 UnMountCnt; CARDFileInfo curFileInfo; -u8 ATTRIBUTE_ALIGN(32) saveBuf[0x4000]; +SaveBufAll saveBuf; u64 SLSerialNo; s32 saveExecF; u8 curBoxNo; s16 curSlotNo; -u8 lbl_80132150[64] = { - "Mario Party 4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +static u8 commentTbl[2][32] = { + "Mario Party 4", "File 0 00/00/0000" }; @@ -42,45 +47,45 @@ static char *SlotNameTbl[] = { static s32 saveMessWin = -1; -s32 SLFileOpen(char *arg0) { - s32 temp_r3; +s32 SLFileOpen(char *fileName) { + s32 result; if (SaveEnableF == 0) { return 0; } while (1) { - temp_r3 = SLCardMount(curSlotNo); - if (temp_r3 < 0) { - return temp_r3; + result = SLCardMount(curSlotNo); + if(result < 0) { + return result; } - temp_r3 = HuCardOpen(curSlotNo, arg0, &curFileInfo); - if (temp_r3 == CARD_RESULT_NOFILE) { + result = HuCardOpen(curSlotNo, fileName, &curFileInfo); + if (result == CARD_RESULT_NOFILE) { return CARD_RESULT_NOFILE; } - if (temp_r3 == CARD_RESULT_WRONGDEVICE) { + if (result == CARD_RESULT_WRONGDEVICE) { SLMessOut(7); return CARD_RESULT_FATAL_ERROR; } - if (temp_r3 == CARD_RESULT_FATAL_ERROR) { + if (result == CARD_RESULT_FATAL_ERROR) { SLMessOut(1); return CARD_RESULT_FATAL_ERROR; } - if (temp_r3 == CARD_RESULT_NOCARD) { + if (result == CARD_RESULT_NOCARD) { SLMessOut(0); return CARD_RESULT_NOCARD; } - if (temp_r3 == CARD_RESULT_BROKEN) { - temp_r3 = HuCardSectorSizeGet(curSlotNo); - if (temp_r3 > 0 && temp_r3 != 0x2000) { + if (result == CARD_RESULT_BROKEN) { + result = HuCardSectorSizeGet(curSlotNo); + if (result > 0 && result != 8192) { SLMessOut(8); return CARD_RESULT_WRONGDEVICE; } UnMountCnt = 0; - temp_r3 = SLMessOut(5); - if (temp_r3 == 0) { - temp_r3 = SLFormat(curSlotNo); - if (temp_r3 != 0) { - return temp_r3; + result = SLMessOut(5); + if (result == 0) { + result = SLFormat(curSlotNo); + if (result != 0) { + return result; } } else { return CARD_RESULT_NOFILE; @@ -91,299 +96,299 @@ s32 SLFileOpen(char *arg0) { } } -s32 SLFileCreate(char *arg0, u32 arg1, void *arg2) { - float sp18[2]; - u32 sp14; - u32 sp10; - s32 temp_r30; - s32 temp_r31; +s32 SLFileCreate(char *fileName, u32 size, void *addr) { + float winSize[2]; + u32 byteNotUsed; + u32 filesNotUsed; + s32 window; + s32 result; if (SaveEnableF == 0) { return 0; } - temp_r31 = SLCardMount(curSlotNo); - if (temp_r31 < 0) { - return temp_r31; + result = SLCardMount(curSlotNo); + if (result < 0) { + return result; } - temp_r31 = HuCardSectorSizeGet(curSlotNo); - if (temp_r31 < 0 && temp_r31 != 0x2000) { + result = HuCardSectorSizeGet(curSlotNo); + if (result < 0 && result != 8192) { SLMessOut(8); return CARD_RESULT_FATAL_ERROR; } - temp_r31 = HuCardFreeSpaceGet(curSlotNo, &sp14, &sp10); - if (sp10 == 0 && arg1 > sp14) { + result = HuCardFreeSpaceGet(curSlotNo, &byteNotUsed, &filesNotUsed); + if (filesNotUsed == 0 && size > byteNotUsed) { SLMessOut(4); return CARD_RESULT_INSSPACE; } - if (sp10 == 0) { + if (filesNotUsed == 0) { SLMessOut(2); return CARD_RESULT_INSSPACE; } - if (arg1 > sp14) { + if (size > byteNotUsed) { SLMessOut(3); return CARD_RESULT_INSSPACE; } HuWinInit(1); - HuWinMesMaxSizeGet(1, sp18, 0x10000B); - temp_r30 = HuWinExCreateStyled(-10000.0f, 200.0f, sp18[0], sp18[1], -1, 2); - HuWinExAnimIn(temp_r30); - HuWinMesSet(temp_r30, 0x10000B); - HuWinMesWait(temp_r30); + HuWinMesMaxSizeGet(1, winSize, MAKE_MESSID(16, 11)); + window = HuWinExCreateStyled(-10000.0f, 200.0f, winSize[0], winSize[1], -1, 2); + HuWinExAnimIn(window); + HuWinMesSet(window, MAKE_MESSID(16, 11)); + HuWinMesWait(window); _SetFlag(FLAG_ID_MAKE(3, 0)); - temp_r31 = HuCardCreate(curSlotNo, arg0, arg1, &curFileInfo); + result = HuCardCreate(curSlotNo, fileName, size, &curFileInfo); _ClearFlag(0x30000); - if (temp_r31 < 0) { - HuWinExAnimOut(temp_r30); - HuWinExCleanup(temp_r30); + if (result < 0) { + HuWinExAnimOut(window); + HuWinExCleanup(window); } - if (temp_r31 == CARD_RESULT_NOCARD) { + if (result == CARD_RESULT_NOCARD) { SLMessOut(0); return CARD_RESULT_NOCARD; } - if (temp_r31 < 0) { + if (result < 0) { SLMessOut(1); return CARD_RESULT_FATAL_ERROR; } _SetFlag(FLAG_ID_MAKE(3, 0)); - temp_r31 = HuCardWrite(&curFileInfo, arg2, arg1, 0); + result = HuCardWrite(&curFileInfo, addr, size, 0); _ClearFlag(FLAG_ID_MAKE(3, 0)); - if (temp_r31 < 0) { - HuWinExAnimOut(temp_r30); - HuWinExCleanup(temp_r30); + if (result < 0) { + HuWinExAnimOut(window); + HuWinExCleanup(window); } - if (temp_r31 == CARD_RESULT_NOCARD) { + if (result == CARD_RESULT_NOCARD) { SLMessOut(0); return CARD_RESULT_NOCARD; } - if (temp_r31 < 0) { + if (result < 0) { SLMessOut(1); return CARD_RESULT_FATAL_ERROR; } _SetFlag(FLAG_ID_MAKE(3, 0)); - temp_r31 = SLStatSet(1); + result = SLStatSet(1); _ClearFlag(FLAG_ID_MAKE(3, 0)); - HuWinExAnimOut(temp_r30); - HuWinExCleanup(temp_r30); - if (temp_r31 < 0) { - return temp_r31; + HuWinExAnimOut(window); + HuWinExCleanup(window); + if (result < 0) { + return result; } return 0; } -s32 SLFileWrite(s32 arg0, void *arg1) { - float sp10[2]; - s32 temp_r31; - s32 var_r30; +s32 SLFileWrite(s32 length, void *addr) { + float winSize[2]; + s32 window; + s32 result; if (SaveEnableF == 0) { return 0; } HuWinInit(1); - HuWinMesMaxSizeGet(1, sp10, 0x10000B); - temp_r31 = HuWinExCreateStyled(-10000.0f, 200.0f, sp10[0], sp10[1], -1, 2); - HuWinExAnimIn(temp_r31); - HuWinMesSet(temp_r31, 0x10000B); - HuWinMesWait(temp_r31); - HuPrcSleep(0x3C); + HuWinMesMaxSizeGet(1, winSize, MAKE_MESSID(16, 11)); + window = HuWinExCreateStyled(-10000.0f, 200.0f, winSize[0], winSize[1], -1, 2); + HuWinExAnimIn(window); + HuWinMesSet(window, MAKE_MESSID(16, 11)); + HuWinMesWait(window); + HuPrcSleep(60); _SetFlag(FLAG_ID_MAKE(3, 0)); - var_r30 = HuCardWrite(&curFileInfo, arg1, arg0, 0); - if (var_r30 == 0) { - var_r30 = SLStatSet(1); + result = HuCardWrite(&curFileInfo, addr, length, 0); + if (result == 0) { + result = SLStatSet(1); } _ClearFlag(FLAG_ID_MAKE(3, 0)); - HuWinExAnimOut(temp_r31); - HuWinExCleanup(temp_r31); - return var_r30; + HuWinExAnimOut(window); + HuWinExCleanup(window); + return result; } -s32 SLFileRead(s32 arg0, void *arg1) { - s32 temp_r3; +s32 SLFileRead(s32 length, void *addr) { + s32 result; if (SaveEnableF == 0) { return 0; } - temp_r3 = HuCardRead(&curFileInfo, arg1, arg0, 0); - if (temp_r3 == CARD_RESULT_NOCARD) { + result = HuCardRead(&curFileInfo, addr, length, 0); + if (result == CARD_RESULT_NOCARD) { SLMessOut(0); - } else if (temp_r3 < 0) { + } else if (result < 0) { SLMessOut(1); } - return temp_r3; + return result; } s32 SLFileClose(void) { - s32 temp_r31; + s32 result; if (SaveEnableF == 0) { return 0; } - temp_r31 = HuCardClose(&curFileInfo); - return temp_r31; + result = HuCardClose(&curFileInfo); + return result; } -void SLCurSlotNoSet(s16 arg0) { - curSlotNo = arg0; +void SLCurSlotNoSet(s16 slotno) { + curSlotNo = slotno; } -void SLCurBoxNoSet(s8 arg0) { - curBoxNo = arg0; +void SLCurBoxNoSet(s8 boxno) { + curBoxNo = boxno; } -void SLSaveFlagSet(s32 arg0) { - if (arg0 == 0) { +void SLSaveFlagSet(s32 flag) { + if (flag == 0) { GWGameStat.party_continue = 0; GWGameStat.story_continue = 0; } - SaveEnableF = arg0; + SaveEnableF = flag; } s32 SLSaveFlagGet(void) { return SaveEnableF; } -void SLSaveDataMake(s32 arg0, OSTime *arg1) { - AnimData *temp_r3; - u8 *var_r30; +void SLSaveDataMake(s32 erase, OSTime *time) { + AnimData *anim_data; + u8 *buf; s32 i; - var_r30 = saveBuf; - if (arg0 != 0) { - for (i = 0; i < 0x4000; i++) { - var_r30[i] = 0xFF; + buf = saveBuf.buf; + if (erase != 0) { + for (i = 0; i < SAVE_BUF_SIZE; i++) { + buf[i] = 0xFF; } } for (i = 0; i < 0x20; i++) { - var_r30[i] = lbl_80132150[i]; + buf[i] = (&commentTbl[0][0])[i]; } for (i = 0; i < 0x20; i++) { - (&var_r30[0x20])[i] = lbl_80132150[i + 0x20]; + (&buf[0x20])[i] = (&commentTbl[0][0])[i+32]; } - temp_r3 = HuSprAnimRead(HuDataSelHeapReadNum(0x86001F, MEMORY_DEFAULT_NUM, HEAP_DATA)); - memcpy(var_r30 + 0x40, temp_r3->bmp->data, 0xC00); - memcpy(var_r30 + 0xC40, temp_r3->bmp->palData, 0x200); - temp_r3 = HuSprAnimRead(HuDataSelHeapReadNum(curBoxNo + 0x86001C, MEMORY_DEFAULT_NUM, HEAP_DATA)); - memcpy(var_r30 + 0xE40, temp_r3->bmp->data, 0x1000); - memcpy(var_r30 + 0x1E40, temp_r3->bmp->palData, 0x200); - SLSaveDataInfoSet(arg1); + anim_data = HuSprAnimReadFile(WIN_CARD_BANNER_ANM); + memcpy(buf + offsetof(SaveBufData, banner), anim_data->bmp->data, CARD_BANNER_WIDTH*CARD_BANNER_HEIGHT); + memcpy(buf + offsetof(SaveBufData, bannerTlut), anim_data->bmp->palData, 512); + anim_data = HuSprAnimReadFile(curBoxNo + WIN_CARD_BOX1_ICON_ANM); + memcpy(buf + offsetof(SaveBufData, icon), anim_data->bmp->data, CARD_ICON_WIDTH*CARD_ICON_HEIGHT*4); + memcpy(buf + offsetof(SaveBufData, iconTlut), anim_data->bmp->palData, 512); + SLSaveDataInfoSet(time); } -void SLSaveDataInfoSet(OSTime *arg0) { - s16 temp_r30; - s16 temp_r31; +void SLSaveDataInfoSet(OSTime *time) { + s16 year; + s16 digit; OSCalendarTime sp8; - OSTicksToCalendarTime(*arg0, &sp8); - saveBuf[0x25] = curBoxNo + 0x31; - temp_r31 = (sp8.mon + 1) / 10; - saveBuf[0x28] = temp_r31 + 0x30; - temp_r31 = (sp8.mon + 1) % 10; - saveBuf[0x29] = temp_r31 + 0x30; - temp_r31 = sp8.mday / 10; - saveBuf[0x2B] = temp_r31 + 0x30; - temp_r31 = sp8.mday % 10; - saveBuf[0x2C] = temp_r31 + 0x30; - temp_r30 = sp8.year; - temp_r31 = temp_r30 / 1000; - saveBuf[0x2E] = temp_r31 + 0x30; - temp_r30 -= temp_r31 * 1000; - temp_r31 = temp_r30 / 100; - saveBuf[0x2F] = temp_r31 + 0x30; - temp_r30 -= temp_r31 * 100; - temp_r31 = temp_r30 / 10; - saveBuf[0x30] = temp_r31 + 0x30; - temp_r30 -= temp_r31 * 10; - saveBuf[0x31] = temp_r30 + 0x30; + OSTicksToCalendarTime(*time, &sp8); + saveBuf.data.comment[37] = curBoxNo + '1'; + digit = (sp8.mon + 1) / 10; + saveBuf.data.comment[40] = digit + '0'; + digit = (sp8.mon + 1) % 10; + saveBuf.data.comment[41] = digit + '0'; + digit = sp8.mday / 10; + saveBuf.data.comment[43] = digit + '0'; + digit = sp8.mday % 10; + saveBuf.data.comment[44] = digit + '0'; + year = sp8.year; + digit = year / 1000; + saveBuf.data.comment[46] = digit + '0'; + year -= digit * 1000; + digit = year / 100; + saveBuf.data.comment[47] = digit + '0'; + year -= digit * 100; + digit = year / 10; + saveBuf.data.comment[48] = digit + '0'; + year -= digit * 10; + saveBuf.data.comment[49] = year + '0'; } void SLCommonSet(void) { - OSTime temp_r28; + OSTime create_time; - temp_r28 = OSGetTime(); - GWGameStat.create_time = temp_r28; - memcpy(saveBuf + 0x2040, &GWGameStat, 0x118); - SLSaveDataInfoSet(&temp_r28); + create_time = OSGetTime(); + GWGameStat.create_time = create_time; + memcpy(&saveBuf.data.stat, &GWGameStat, sizeof(GameStat)); + SLSaveDataInfoSet(&create_time); } void SLSaveBoard(void) { s16 i; - memcpy(saveBuf + 0x2158, &GWSystem, 0xDC); + memcpy(&saveBuf.data.system, &GWSystem, sizeof(SystemState)); for (i = 0; i < 4; i++) { - memcpy(&saveBuf[i * 0x30 + 0x2234], &GWPlayer[i], 0x30); + memcpy(SAVE_GET_PLAYER(i), &GWPlayer[i], sizeof(PlayerState)); } } void SLSaveBoardBackup(void) { s16 i; - memcpy(saveBuf + 0x22F4, &GWSystem, 0xDC); + memcpy(&saveBuf.data.systemBackup, &GWSystem, sizeof(SystemState)); for (i = 0; i < 4; i++) { - memcpy(&saveBuf[i * 0x30 + 0x23D0], &GWPlayer[i], 0x30); + memcpy(SAVE_GET_PLAYER_BACKUP(i), &GWPlayer[i], sizeof(PlayerState)); } } s32 SLSave(void) { - s32 var_r31; + s32 result; while (1) { SLCheckSumSet(); - var_r31 = SLFileOpen(SaveFileNameTbl[curBoxNo]); - if (var_r31 == CARD_RESULT_NOFILE) { + result = SLFileOpen(SaveFileNameTbl[curBoxNo]); + if (result == CARD_RESULT_NOFILE) { if (!SLSerialNoCheck()) { SLMessOut(9); } else { SLCreateSaveWin(); - var_r31 = SLFileCreate(SaveFileNameTbl[curBoxNo], 0x4000, saveBuf); + result = SLFileCreate(SaveFileNameTbl[curBoxNo], 16384, &saveBuf); SLKillSaveWin(); - if (var_r31 >= 0) { + if (result >= 0) { SLSerialNoGet(); goto block_32; } } } else { - if (var_r31 == CARD_RESULT_NOCARD) { - var_r31 = SLMessOut(0xA); - if (var_r31 != 0) { - SLMessOut(0xB); + if (result == CARD_RESULT_NOCARD) { + result = SLMessOut(10); + if (result != 0) { + SLMessOut(11); continue; } SLSaveFlagSet(0); break; } - if (var_r31 >= 0) { + if (result >= 0) { if (!SLSerialNoCheck()) { SLMessOut(9); } else { SLCreateSaveWin(); - var_r31 = SLFileWrite(0x4000, saveBuf); + result = SLFileWrite(16384, &saveBuf); SLKillSaveWin(); - if (var_r31 == CARD_RESULT_NOCARD) { + if (result == CARD_RESULT_NOCARD) { SLMessOut(0); - } else if (var_r31 == CARD_RESULT_WRONGDEVICE) { + } else if (result == CARD_RESULT_WRONGDEVICE) { SLMessOut(7); - } else if (var_r31 == CARD_RESULT_BROKEN) { - var_r31 = HuCardSectorSizeGet(curSlotNo); - if (var_r31 > 0 && var_r31 != 0x2000) { + } else if (result == CARD_RESULT_BROKEN) { + result = HuCardSectorSizeGet(curSlotNo); + if (result > 0 && result != 8192) { SLMessOut(8); goto block_36; } UnMountCnt = 0; - var_r31 = SLMessOut(5); - if (var_r31 == 0) { - var_r31 = SLFormat(curSlotNo); - if (var_r31 != 0) { - return var_r31; + result = SLMessOut(5); + if (result == 0) { + result = SLFormat(curSlotNo); + if (result) { + return result; } continue; } else { - var_r31 = CARD_RESULT_BROKEN; + result = CARD_RESULT_BROKEN; } - } else if (var_r31 < 0) { + } else if (result < 0) { SLMessOut(1); } block_32: SLFileClose(); - if (var_r31 >= 0) { + if (result >= 0) { HuCardUnMount(curSlotNo); return 1; } @@ -391,9 +396,9 @@ block_32: } } block_36: - var_r31 = SLMessOut(0xA); - if (var_r31 != 0) { - SLMessOut(0xB); + result = SLMessOut(10); + if (result != 0) { + SLMessOut(11); } else { SLSaveFlagSet(0); break; @@ -404,19 +409,19 @@ block_36: } static s16 SLCreateSaveWin(void) { - float sp8[2]; - s16 temp_r3; + float size[2]; + s16 window; HuWinInit(1); HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - HuWinMesMaxSizeGet(1, sp8, 0x100044); - temp_r3 = HuWinExCreateStyled(-10000.0f, 150.0f, sp8[0], sp8[1], -1, 2); - saveMessWin = temp_r3; - HuWinExAnimIn(temp_r3); - HuWinInsertMesSet(temp_r3, MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - HuWinMesSet(temp_r3, 0x100044); - HuWinMesWait(temp_r3); - return temp_r3; + HuWinMesMaxSizeGet(1, size, MAKE_MESSID(16, 68)); + window = HuWinExCreateStyled(-10000.0f, 150.0f, size[0], size[1], -1, 2); + saveMessWin = window; + HuWinExAnimIn(window); + HuWinInsertMesSet(window, MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); + HuWinMesSet(window, MAKE_MESSID(16, 68)); + HuWinMesWait(window); + return window; } static void SLKillSaveWin(void) { @@ -428,18 +433,18 @@ static void SLKillSaveWin(void) { } s32 SLLoad(void) { - s32 var_r31; - u16 *temp_r29; - u16 temp_r27; + s32 result; + u16 *save_checksum; + u16 checksum; - var_r31 = SLFileOpen(SaveFileNameTbl[curBoxNo]); - if (var_r31 >= 0) { - var_r31 = SLFileRead(0x4000, saveBuf); + result = SLFileOpen(SaveFileNameTbl[curBoxNo]); + if (result >= 0) { + result = SLFileRead(16384, &saveBuf); SLFileClose(); - if (var_r31 >= 0) { - temp_r29 = (u16*) &saveBuf[0x2490]; - temp_r27 = SLCheckSumGet(); - *temp_r29 == temp_r27; + if (result >= 0) { + save_checksum = (u16 *)&saveBuf.buf[sizeof(SaveBufData)]; + checksum = SLCheckSumGet(); + *save_checksum == checksum; } } HuCardUnMount(curSlotNo); @@ -447,15 +452,15 @@ s32 SLLoad(void) { } void SLLoadGameStat(void) { - memcpy(&GWGameStat, saveBuf + 0x2040, 0x118); + memcpy(&GWGameStat, &saveBuf.data.stat, sizeof(GameStat)); } void SLLoadBoard(void) { s16 i; - memcpy(&GWSystem, saveBuf + 0x2158, 0xDC); + memcpy(&GWSystem, &saveBuf.data.system, sizeof(SystemState)); for (i = 0; i < 4; i++) { - memcpy(&GWPlayer[i], &saveBuf[i * 0x30 + 0x2234], 0x30); + memcpy(&GWPlayer[i], SAVE_GET_PLAYER(i), sizeof(PlayerState)); GWPlayerCfg[i].character = GWPlayer[i].character; GWPlayerCfg[i].pad_idx = GWPlayer[i].port; GWPlayerCfg[i].diff = GWPlayer[i].diff; @@ -467,9 +472,9 @@ void SLLoadBoard(void) { void SLLoadBoardBackup(void) { s16 i; - memcpy(&GWSystem, saveBuf + 0x22F4, 0xDC); + memcpy(&GWSystem, &saveBuf.data.systemBackup, 0xDC); for (i = 0; i < 4; i++) { - memcpy(&GWPlayer[i], &saveBuf[i * 0x30 + 0x23D0], 0x30); + memcpy(&GWPlayer[i], SAVE_GET_PLAYER_BACKUP(i), sizeof(PlayerState)); GWPlayerCfg[i].character = GWPlayer[i].character; GWPlayerCfg[i].pad_idx = GWPlayer[i].port; GWPlayerCfg[i].diff = GWPlayer[i].diff; @@ -483,27 +488,27 @@ void SLSerialNoGet(void) { } BOOL SLSerialNoCheck(void) { - s32 var_r31; - u64 sp8; + s32 result; + u64 serialNo; if (SLSerialNo == 0) { return TRUE; } - var_r31 = CARDGetSerialNo(curSlotNo, &sp8); - if (var_r31 < 0) { + result = CARDGetSerialNo(curSlotNo, &serialNo); + if (result < 0) { return TRUE; } - if (sp8 != SLSerialNo) { + if (serialNo != SLSerialNo) { return FALSE; } return TRUE; } BOOL SLCheckSumCheck(void) { - u16 *temp_r31 = (u16*) &saveBuf[0x2490]; - u16 temp_r3 = SLCheckSumGet(); + u16 *save_checksum = (u16 *)&saveBuf.buf[sizeof(SaveBufData)]; + u16 checksum = SLCheckSumGet(); - if (*temp_r31 == temp_r3) { + if (*save_checksum == checksum) { return TRUE; } return FALSE; @@ -511,100 +516,100 @@ BOOL SLCheckSumCheck(void) { u16 SLCheckSumGet(void) { u32 i; - u32 var_r30; + u32 checksum; - for (i = var_r30 = 0; i < 0x2490; i++) { - var_r30 += saveBuf[i]; + for (i = checksum = 0; i < sizeof(SaveBufData); i++) { + checksum += saveBuf.buf[i]; } - var_r30 = ~var_r30; - return (u16) var_r30 & 0xFFFF; + checksum = ~checksum; + return (u16) checksum & 0xFFFF; } void SLCheckSumSet(void) { - u16 temp_r31 = SLCheckSumGet(); + u16 checksum = SLCheckSumGet(); - saveBuf[0x2490] = (temp_r31 >> 8) & 0xFF; - saveBuf[0x2491] = temp_r31; + saveBuf.buf[sizeof(SaveBufData)] = (checksum >> 8) & 0xFF; + saveBuf.buf[sizeof(SaveBufData)+1] = checksum; } -s32 SLStatSet(s32 arg0) { - CARDStat sp8; - s32 temp_r29; - s32 temp_r3; +s32 SLStatSet(s32 reportF) { + CARDStat stat; + s32 fileNo; + s32 result; - temp_r29 = curFileInfo.fileNo; - temp_r3 = CARDGetStatus(curSlotNo, temp_r29, &sp8); - if (temp_r3 == -3) { - if (arg0 != 0) { + fileNo = curFileInfo.fileNo; + result = CARDGetStatus(curSlotNo, fileNo, &stat); + if (result == CARD_RESULT_NOCARD) { + if (reportF != 0) { SLMessOut(0); } return -3; } - if (temp_r3 < 0) { - if (arg0 != 0) { + if (result < 0) { + if (reportF != 0) { SLMessOut(1); } return CARD_RESULT_FATAL_ERROR; } - sp8.commentAddr = 0; - sp8.iconAddr = 0x40; - CARDSetBannerFormat(&sp8, CARD_STAT_BANNER_C8); - CARDSetIconFormat(&sp8, 0, CARD_STAT_ICON_C8); - CARDSetIconFormat(&sp8, 1, CARD_STAT_ICON_C8); - CARDSetIconFormat(&sp8, 2, CARD_STAT_ICON_C8); - CARDSetIconFormat(&sp8, 3, CARD_STAT_ICON_C8); - CARDSetIconSpeed(&sp8, 0, CARD_STAT_SPEED_MIDDLE); - CARDSetIconSpeed(&sp8, 1, CARD_STAT_SPEED_MIDDLE); - CARDSetIconSpeed(&sp8, 2, CARD_STAT_SPEED_MIDDLE); - CARDSetIconSpeed(&sp8, 3, CARD_STAT_SPEED_MIDDLE); - CARDSetIconSpeed(&sp8, 4, CARD_STAT_SPEED_END); - CARDSetIconAnim(&sp8, CARD_STAT_ANIM_LOOP); + CARDSetCommentAddress(&stat, 0); + CARDSetIconAddress(&stat, 64); + CARDSetBannerFormat(&stat, CARD_STAT_BANNER_C8); + CARDSetIconFormat(&stat, 0, CARD_STAT_ICON_C8); + CARDSetIconFormat(&stat, 1, CARD_STAT_ICON_C8); + CARDSetIconFormat(&stat, 2, CARD_STAT_ICON_C8); + CARDSetIconFormat(&stat, 3, CARD_STAT_ICON_C8); + CARDSetIconSpeed(&stat, 0, CARD_STAT_SPEED_MIDDLE); + CARDSetIconSpeed(&stat, 1, CARD_STAT_SPEED_MIDDLE); + CARDSetIconSpeed(&stat, 2, CARD_STAT_SPEED_MIDDLE); + CARDSetIconSpeed(&stat, 3, CARD_STAT_SPEED_MIDDLE); + CARDSetIconSpeed(&stat, 4, CARD_STAT_SPEED_END); + CARDSetIconAnim(&stat, CARD_STAT_ANIM_LOOP); - temp_r3 = CARDSetStatus(curSlotNo, temp_r29, &sp8); - if (temp_r3 == CARD_RESULT_NOCARD) { - if (arg0 != 0) { + result = CARDSetStatus(curSlotNo, fileNo, &stat); + if (result == CARD_RESULT_NOCARD) { + if (reportF != 0) { SLMessOut(0); } return CARD_RESULT_NOCARD; } - if (temp_r3 < 0) { - if (arg0 != 0) { + if (result < 0) { + if (reportF != 0) { SLMessOut(1); } return CARD_RESULT_FATAL_ERROR; } - return temp_r3; + return result; } -s32 SLCardMount(s16 arg0) { - s32 temp_r3; +s32 SLCardMount(s16 slotNo) { + s32 result; while (1) { - temp_r3 = HuCardMount(curSlotNo); - if (temp_r3 == CARD_RESULT_WRONGDEVICE) { + result = HuCardMount(curSlotNo); + if (result == CARD_RESULT_WRONGDEVICE) { SLMessOut(7); - return temp_r3; + return result; } - if (temp_r3 == CARD_RESULT_FATAL_ERROR) { + if (result == CARD_RESULT_FATAL_ERROR) { SLMessOut(1); return CARD_RESULT_FATAL_ERROR; } - if (temp_r3 == CARD_RESULT_NOCARD) { + if (result == CARD_RESULT_NOCARD) { SLMessOut(0); return CARD_RESULT_NOCARD; } - if (temp_r3 == CARD_RESULT_BROKEN) { - temp_r3 = HuCardSectorSizeGet(curSlotNo); - if (temp_r3 > 0 && temp_r3 != 0x2000) { + if (result == CARD_RESULT_BROKEN) { + result = HuCardSectorSizeGet(curSlotNo); + if (result > 0 && result != 8192) { SLMessOut(8); return CARD_RESULT_WRONGDEVICE; } UnMountCnt = 0; - temp_r3 = SLMessOut(5); - if (temp_r3 == 0) { - temp_r3 = SLFormat(curSlotNo); - if (temp_r3 != 0) { - return temp_r3; + result = SLMessOut(5); + if (result == 0) { + result = SLFormat(curSlotNo); + if (result != 0) { + return result; } } else { return CARD_RESULT_FATAL_ERROR; @@ -613,184 +618,195 @@ s32 SLCardMount(s16 arg0) { break; } } - temp_r3 = HuCardSectorSizeGet(curSlotNo); - if (temp_r3 < 0) { + result = HuCardSectorSizeGet(curSlotNo); + if (result < 0) { SLMessOut(1); - return temp_r3; + return result; } - if (temp_r3 != 0x2000) { + if (result != 8192) { SLMessOut(8); return CARD_RESULT_WRONGDEVICE; } return 0; } -s32 SLFormat(s16 arg0) { - float sp8[2]; - s16 temp_r24; - s16 temp_r3; - s16 temp_r3_2; - OSTime temp_r19; +s32 SLFormat(s16 slotNo) { + float winSize[2]; + s16 result; + s16 window1; + s16 window2; + OSTime time; HuWinInit(1); HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - HuWinMesMaxSizeGet(1, sp8, MAKE_MESSID(16, 56)); - temp_r3 = HuWinExCreateStyled(-10000.0f, 150.0f, sp8[0], sp8[1], -1, 2); - HuWinExAnimIn(temp_r3); - HuWinInsertMesSet(temp_r3, MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - HuWinMesSet(temp_r3, MAKE_MESSID(16, 56)); - HuWinMesMaxSizeGet(1, sp8, MAKE_MESSID(16, 11)); - temp_r3_2 = HuWinExCreateStyled(-10000.0f, 200.0f, sp8[0], sp8[1], -1, 2); - HuWinExAnimIn(temp_r3_2); - HuWinMesSet(temp_r3_2, MAKE_MESSID(16, 11)); - HuWinMesWait(temp_r3_2); - HuPrcSleep(0x1E); + HuWinMesMaxSizeGet(1, winSize, MAKE_MESSID(16, 56)); + window1 = HuWinExCreateStyled(-10000.0f, 150.0f, winSize[0], winSize[1], -1, 2); + HuWinExAnimIn(window1); + HuWinInsertMesSet(window1, MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); + HuWinMesSet(window1, MAKE_MESSID(16, 56)); + HuWinMesMaxSizeGet(1, winSize, MAKE_MESSID(16, 11)); + window2 = HuWinExCreateStyled(-10000.0f, 200.0f, winSize[0], winSize[1], -1, 2); + HuWinExAnimIn(window2); + HuWinMesSet(window2, MAKE_MESSID(16, 11)); + HuWinMesWait(window2); + HuPrcSleep(30); if (UnMountCnt & (1 << curSlotNo)) { - HuWinExAnimOut(temp_r3); - HuWinExCleanup(temp_r3); - HuWinExAnimOut(temp_r3_2); - HuWinExCleanup(temp_r3_2); - SLMessOut(0xC); + HuWinExAnimOut(window1); + HuWinExCleanup(window1); + HuWinExAnimOut(window2); + HuWinExCleanup(window2); + SLMessOut(12); return 0; } _SetFlag(FLAG_ID_MAKE(3, 0)); - temp_r24 = HuCardFormat(curSlotNo); + result = HuCardFormat(curSlotNo); _ClearFlag(FLAG_ID_MAKE(3, 0)); - if (temp_r24 < 0) { - HuWinExAnimOut(temp_r3); - HuWinExCleanup(temp_r3); - HuWinExAnimOut(temp_r3_2); - HuWinExCleanup(temp_r3_2); + if (result < 0) { + HuWinExAnimOut(window1); + HuWinExCleanup(window1); + HuWinExAnimOut(window2); + HuWinExCleanup(window2); } - if (temp_r24 == CARD_RESULT_FATAL_ERROR) { + if (result == CARD_RESULT_FATAL_ERROR) { SLMessOut(6); SLMessOut(1); return CARD_RESULT_FATAL_ERROR; } - if (temp_r24 == CARD_RESULT_NOCARD) { + if (result == CARD_RESULT_NOCARD) { SLMessOut(0); return CARD_RESULT_NOCARD; } - if (temp_r24 == CARD_RESULT_WRONGDEVICE) { + if (result == CARD_RESULT_WRONGDEVICE) { SLMessOut(7); - return temp_r24; + return result; } - HuWinExAnimOut(temp_r3); - HuWinExCleanup(temp_r3); - HuWinExAnimOut(temp_r3_2); - HuWinExCleanup(temp_r3_2); + HuWinExAnimOut(window1); + HuWinExCleanup(window1); + HuWinExAnimOut(window2); + HuWinExCleanup(window2); CARDGetSerialNo(curSlotNo, &SLSerialNo); curBoxNo = 0; - temp_r19 = OSGetTime(); - SLSaveDataMake(0, &temp_r19); + time = OSGetTime(); + SLSaveDataMake(0, &time); SLCheckSumSet(); - return temp_r24; + return result; } -s16 SLMessOut(s16 arg0) { +s16 SLMessOut(s16 mess) { WindowData *var_r26; - float sp8[2]; - u32 var_r29; - s32 var_r31; - s32 var_r27; - s16 temp_r3; - s16 var_r28; + float size[2]; + u32 slot_mess; + s32 save_mess; + s32 has_choice; + s16 window; + s16 choice; - var_r28 = -1; - var_r29 = 0; - var_r27 = 0; + choice = -1; + slot_mess = 0; + has_choice = 0; HuWinInit(1); SLKillSaveWin(); - switch (arg0) { + switch (mess) { case 0: - var_r31 = MAKE_MESSID(16, 2); + save_mess = MAKE_MESSID(16, 2); break; + case 1: - var_r31 = MAKE_MESSID(16, 83); + save_mess = MAKE_MESSID(16, 83); HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); break; + case 2: HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); - var_r31 = MAKE_MESSID(16, 74); + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + save_mess = MAKE_MESSID(16, 74); break; + case 3: - var_r31 = MAKE_MESSID(16, 74); + save_mess = MAKE_MESSID(16, 74); HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); break; + case 4: - var_r31 = MAKE_MESSID(16, 74); + save_mess = MAKE_MESSID(16, 74); HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); break; + case 5: HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); - var_r31 = MAKE_MESSID(16, 4); - var_r27 = 1; + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + save_mess = MAKE_MESSID(16, 4); + has_choice = 1; break; + case 6: - var_r31 = MAKE_MESSID(16, 54); + save_mess = MAKE_MESSID(16, 54); break; case 7: HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); - var_r31 = MAKE_MESSID(16, 55); + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + save_mess = MAKE_MESSID(16, 55); break; + case 8: HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); - var_r31 = MAKE_MESSID(16, 57); + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + save_mess = MAKE_MESSID(16, 57); break; + case 9: HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); - var_r31 = MAKE_MESSID(16, 69); + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + save_mess = MAKE_MESSID(16, 69); break; + case 10: - var_r31 = MAKE_MESSID(16, 70); - var_r27 = 1; + save_mess = MAKE_MESSID(16, 70); + has_choice = 1; break; + case 11: HuWinInsertMesSizeGet(MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]), 0); - var_r29 = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); - var_r31 = MAKE_MESSID(16, 72); + slot_mess = MAKE_MESSID_PTR(SlotNameTbl[curSlotNo]); + save_mess = MAKE_MESSID(16, 72); break; + case 12: - var_r31 = MAKE_MESSID(16, 80); + save_mess = MAKE_MESSID(16, 80); break; } - if (var_r31 == MAKE_MESSID(16, 4)) { - HuWinMesMaxSizeGet(1, sp8, MAKE_MESSID(16, 78)); + if (save_mess == MAKE_MESSID(16, 4)) { + HuWinMesMaxSizeGet(1, size, MAKE_MESSID(16, 78)); } else { - HuWinMesMaxSizeGet(1, sp8, var_r31); + HuWinMesMaxSizeGet(1, size, save_mess); } - temp_r3 = HuWinExCreateStyled(-10000.0f, 200.0f, sp8[0], sp8[1], -1, 2); - var_r26 = &winData[temp_r3]; + window = HuWinExCreateStyled(-10000.0f, 200.0f, size[0], size[1], -1, 2); + var_r26 = &winData[window]; var_r26->active_pad = 1; - if (var_r29 != 0) { - HuWinInsertMesSet(temp_r3, var_r29, 0); + if (slot_mess != 0) { + HuWinInsertMesSet(window, slot_mess, 0); } - HuWinAttrSet(temp_r3, 0x10); - HuWinExAnimIn(temp_r3); - HuWinMesSet(temp_r3, var_r31); - HuWinMesWait(temp_r3); - if (var_r27 != 0) { - var_r28 = HuWinChoiceGet(temp_r3, 1); - if (arg0 == 5 && var_r28 == 0) { - HuWinMesSet(temp_r3, MAKE_MESSID(16, 78)); - HuWinMesWait(temp_r3); - var_r28 = HuWinChoiceGet(temp_r3, 1); + HuWinAttrSet(window, 0x10); + HuWinExAnimIn(window); + HuWinMesSet(window, save_mess); + HuWinMesWait(window); + if (has_choice) { + choice = HuWinChoiceGet(window, 1); + if (mess == 5 && choice == 0) { + HuWinMesSet(window, MAKE_MESSID(16, 78)); + HuWinMesWait(window); + choice = HuWinChoiceGet(window, 1); } } - if (arg0 == 0xB) { - while (!(HuPadBtnDown[0] & 0x100)) { + if (mess == 11) { + while (!(HuPadBtnDown[0] & PAD_BUTTON_A)) { HuPrcVSleep(); } } - HuWinExAnimOut(temp_r3); - HuWinExCleanup(temp_r3); - return var_r28; + HuWinExAnimOut(window); + HuWinExCleanup(window); + return choice; } diff --git a/src/game/sprman.c b/src/game/sprman.c index 5f5c25d4..e0f940ab 100644 --- a/src/game/sprman.c +++ b/src/game/sprman.c @@ -675,7 +675,7 @@ void HuSprSprBGSet(short sprite, AnimData *bg, short bg_bank) sprite_ptr->bg = bg; sprite_ptr->bg_bank = bg_bank; sprite_ptr->wrap_t = sprite_ptr->wrap_s = GX_REPEAT; - sprite_ptr->attr &= ~SPIRTE_ATTR_BILINEAR; + sprite_ptr->attr &= ~SPRITE_ATTR_BILINEAR; } void AnimDebug(AnimData *anim) diff --git a/src/game/sprput.c b/src/game/sprput.c index faf8ea73..5e1a923f 100644 --- a/src/game/sprput.c +++ b/src/game/sprput.c @@ -123,7 +123,7 @@ void HuSprDisp(SpriteData *sprite) continue; } GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); - HuSprTexLoad(anim, layer->bmpNo, 0, sprite->wrap_s, sprite->wrap_t, (sprite->attr & SPIRTE_ATTR_BILINEAR) ? GX_LINEAR : GX_NEAR); + HuSprTexLoad(anim, layer->bmpNo, 0, sprite->wrap_s, sprite->wrap_t, (sprite->attr & SPRITE_ATTR_BILINEAR) ? GX_LINEAR : GX_NEAR); if(layer->alpha != 255 || color_sum != 255*4) { color.a = (u16)(sprite->a*layer->alpha) >> 8; GXSetTevColor(GX_TEVSTAGE1, color); diff --git a/src/game/sreset.c b/src/game/sreset.c new file mode 100644 index 00000000..04ca1a70 --- /dev/null +++ b/src/game/sreset.c @@ -0,0 +1,422 @@ +#include "dolphin.h" +#include "game/flag.h" +#include "game/dvd.h" +#include "game/pad.h" +#include "game/audio.h" +#include "game/thpmain.h" + +#define SR_DVD_LOADING 0 +#define SR_DVD_COVER_OPEN 1 +#define SR_DVD_NO_DISK 2 +#define SR_DVD_WRONG_DISK 3 +#define SR_DVD_RETRY_ERROR 4 +#define SR_DVD_FATAL_ERROR 5 + +#define PAD_BTN_SRESET (PAD_BUTTON_START|PAD_BUTTON_X|PAD_BUTTON_B) +#define PAD_BTN_SRESET_SHORT (PAD_BUTTON_X|PAD_BUTTON_B) + +extern s32 HuDvdErrWait; + +static s32 SR_PreRstChk[4] = {}; + +#include "coveropen_en.inc" +#include "fatalerror_en.inc" +#include "loading_en.inc" +#include "nodisc_en.inc" +#include "retryerror_en.inc" +#include "wrongdisc_en.inc" + +static s16 SR_PushTime[4] = {}; +static s8 SR_ResetPad = -1; + +static s16 XfbW; +static s16 XfbH; +static s32 XfbProg; +static void *Xfb[2] = {}; +static BOOL trychkBusyWait; +s32 SR_ExecReset; +static s32 SR_RestartChk; +static BOOL H_ResetReady; + +void HuRestartSystem(void); + +s32 HuSoftResetCheck(void); +s32 HuSoftResetCountCheck(void); +static void HuSoftResetPostProc(void); + +s32 HuSoftResetButtonCheck(void) +{ + if(SR_ExecReset) { + HuRestartSystem(); + } + return (SR_ExecReset) ? 1 : 0; +} + +static OSMessageQueue ToeMessageQueue; + +void HuDvdErrDispIntFunc(u32 retraceCount) +{ + OSWakeupThread(&ToeMessageQueue.queueSend); +} + +static void HuPreRstChk(void) +{ + static PADStatus padStat[4]; + int i; + PADRead(padStat); + for(i=0; i<4; i++) { + PADStatus *status = &padStat[i]; + if(status->err != 0) { + continue; + } + if((status->button & PAD_BTN_SRESET) == PAD_BTN_SRESET) { + SR_PreRstChk[i] = 1; + } else { + SR_PreRstChk[i] = 0; + } + } +} + +static OSMessage ToeMessageArray[16]; +static OSThread ToeThread; +static u8 ToeThreadStack[4096]; + +static void *ToeThreadFunc(void *param); +static void ToeDispCheck(void); + +void HuDvdErrDispInit(GXRenderModeObj *rmode, void *xfb1, void *xfb2) +{ + BOOL intrOld; + _ClearFlag(0x30000); + SR_ResetPad = -1; + SR_ExecReset = H_ResetReady = 0; + SR_RestartChk = 0; + SR_PushTime[0] = SR_PushTime[1] = SR_PushTime[2] = SR_PushTime[3] = 0; + VIWaitForRetrace(); + VIWaitForRetrace(); + VIWaitForRetrace(); + HuPreRstChk(); + HuDvdErrWait = 0; + Xfb[0] = xfb1; + Xfb[1] = xfb2; + if(rmode) { + XfbW = (u16)(((u16)rmode->fbWidth+15) & ~0xF); + XfbH = rmode->xfbHeight; + } else { + XfbW = 640; + XfbH = 480; + } + if((u16)rmode->xFBmode == VI_XFBMODE_SF) { + XfbProg = 0; + } else { + XfbProg = 1; + } + trychkBusyWait = FALSE; + OSInitMessageQueue(&ToeMessageQueue, ToeMessageArray, 16); + OSCreateThread(&ToeThread, ToeThreadFunc, NULL, &ToeThreadStack[4096], 4096, 8, OS_THREAD_ATTR_DETACH); + OSResumeThread(&ToeThread); + intrOld = OSDisableInterrupts(); + VISetPreRetraceCallback(HuDvdErrDispIntFunc); + OSRestoreInterrupts(intrOld); +} + +static void *ToeThreadFunc(void *param) +{ + while(1) { + BOOL hide_disp; + OSSleepThread(&ToeMessageQueue.queueSend); + if(!_CheckFlag(0x30000)) { + BOOL reset; + if(!HuSoftResetCheck()) { + if(SR_ExecReset) { + reset = TRUE; + } else { + if(H_ResetReady == TRUE && OSGetResetButtonState() != TRUE) { + reset = TRUE; + } else { + if(H_ResetReady != TRUE && OSGetResetButtonState() == TRUE) { + H_ResetReady = TRUE; + } + reset = FALSE; + } + } + if(reset) { + proc_reset: + HuSoftResetPostProc(); + } + } else { + goto proc_reset; + } + } + if(SR_ExecReset) { + HuRestartSystem(); + } + if(SR_ExecReset) { + hide_disp = TRUE; + } else { + hide_disp = FALSE; + } + if(!hide_disp) { + ToeDispCheck(); + } + } +} + +static void _HuDvdErrDispXFB(s32 error); + +static void ToeDispCheck(void) +{ + s32 status; + if(SR_ResetPad != -1 || SR_ExecReset != FALSE || SR_RestartChk != 0) { + return; + } + status = DVDGetDriveStatus(); + switch(status) { + case DVD_STATE_FATAL_ERROR: + status = SR_DVD_FATAL_ERROR; + trychkBusyWait = TRUE; + break; + + case DVD_STATE_END: + HuDvdErrWait = 0; + trychkBusyWait = FALSE; + return; + + case DVD_STATE_COVER_OPEN: + status = SR_DVD_COVER_OPEN; + trychkBusyWait = TRUE; + break; + + case DVD_STATE_BUSY: + case DVD_STATE_COVER_CLOSED: + if(!trychkBusyWait) { + return; + } + status = SR_DVD_LOADING; + break; + + case DVD_STATE_NO_DISK: + status = SR_DVD_NO_DISK; + trychkBusyWait = TRUE; + break; + + case DVD_STATE_WRONG_DISK: + status = SR_DVD_WRONG_DISK; + trychkBusyWait = TRUE; + break; + + case DVD_STATE_RETRY: + status = SR_DVD_RETRY_ERROR; + trychkBusyWait = TRUE; + break; + + default: + return; + } + HuDvdErrWait = 1; + HuPadRumbleAllStop(); + VISetBlack(FALSE); + VIFlush(); + if(msmSysCheckInit()) { + HuAudSStreamAllStop(); + } + _HuDvdErrDispXFB(status); +} + +static void _HuDvdErrDispXFB(s32 error) +{ + static void *bmpMes[][6] = { + loading_en, coveropen_en, nodisc_en, wrongdisc_en, retryerror_en, fatalerror_en + }; + volatile s32 status; + u8 color[2]; + s8 language; + s16 *bmpData; + u8 *xfb1_ptr; + u8 *xfb2_ptr; + u32 i; + u32 data; + u32 row; + u32 *xfb1; + u32 *xfb2; + u32 j; + u8 y1; + u8 y2; + s32 reset; + u32 *data_ptr; + u32 row_offset; + u32 row_pitch; + language = 0; + xfb1 = Xfb[0]; + xfb2 = Xfb[1]; + for(i=0; i<0x25800; i++, xfb1++, xfb2++) { + *xfb1 = *xfb2 = 0x800080; + } + DCStoreRangeNoSync(Xfb[0], 0x96000); + DCStoreRangeNoSync(Xfb[1], 0x96000); + bmpData = bmpMes[language][error]; + data_ptr = (u32 *)(bmpData+2); + row_offset = ((XfbW/2)-(bmpData[0]/2))*2; + row_pitch = XfbW*2; + color[1] = color[0] = 128; + for(row=0; row>= 2, xfb1_ptr += 4, xfb2_ptr += 4) { + if(data & 0x3){ + if(data & 0x1) { + y1 = 0xEB; + } else { + y1 = 0x10; + } + if(data & 0x2) { + y2 = 0xEB; + } else { + y2 = 0x10; + } + xfb1_ptr[0] = y1; + xfb1_ptr[1] = color[1]; + xfb1_ptr[2] = y2; + xfb1_ptr[3] = color[0]; + xfb2_ptr[0] = y1; + xfb2_ptr[1] = color[1]; + xfb2_ptr[2] = y2; + xfb2_ptr[3] = color[0]; + } + } + } + DCStoreRangeNoSync(sp14[1], bmpData[0]*2); + DCStoreRangeNoSync(sp14[0], bmpData[0]*2); + } + status = DVDGetDriveStatus(); + while(status) { + if(status != DVDGetDriveStatus()) { + break; + } + if(SR_ExecReset) { + reset = TRUE; + } else { + if(H_ResetReady == TRUE && OSGetResetButtonState() != TRUE) { + reset = TRUE; + } else { + if(H_ResetReady != TRUE && OSGetResetButtonState() == TRUE) { + H_ResetReady = TRUE; + } + reset = FALSE; + } + } + if(reset) { + if(msmSysCheckInit()) { + msmStreamSetMasterVolume(0); + msmSeSetMasterVolume(0); + msmMusSetMasterVolume(0); + } + HuRestartSystem(); + } + + OSYieldThread(); + } +} + +void HuRestartSystem(void) +{ + u32 retrace[2]; + BOOL prevInt; + if(SR_RestartChk) { + return; + } + SR_RestartChk = TRUE; + PADRecalibrate(PAD_CHAN0_BIT|PAD_CHAN1_BIT|PAD_CHAN2_BIT|PAD_CHAN3_BIT); + msmSysCheckInit(); + VISetBlack(TRUE); + VIFlush(); + prevInt = OSDisableInterrupts(); + if(!prevInt) { + OSReport("PrevInt=DISABLE!!\n"); + } + OSEnableInterrupts(); + retrace[1] = VIGetRetraceCount(); + retrace[0] = 0; + while(retrace[1] == VIGetRetraceCount()) { + if(retrace[0]++ >= 1349800) { + break; + } + } + OSReport("Timeout Count=%d\n", retrace[0]); + __GXAbortWaitPECopyDone(); + OSResetSystem(0, 0, 0); +} + +s32 HuSoftResetCheck(void) +{ + int i; + if(VCounter == 0) { + return 0; + } + if(SR_ExecReset) { + return 1; + } + if(SR_ResetPad != -1) { + if(!(_PadBtn[SR_ResetPad] & PAD_BTN_SRESET)) { + return 1; + } + } else { + for(i=0; i<4; i++) { + if(SR_PreRstChk[i] && (_PadBtn[i] & PAD_BTN_SRESET) != PAD_BTN_SRESET) { + SR_PreRstChk[i] = 0; + } + } + } + + if(HuSoftResetCountCheck()) { + return 1; + } else { + return 0; + } +} + +s32 HuSoftResetCountCheck(void) +{ + int i; + for(i=0; i<4; i++) { + if((_PadBtn[i] & PAD_BTN_SRESET_SHORT) != PAD_BTN_SRESET_SHORT) { + SR_PushTime[i] = 0; + } else { + if(!SR_PreRstChk[i]) { + if(_PadBtn[i] & PAD_BUTTON_START) { + if(SR_PushTime[i]++ >= 30) { + SR_ResetPad = i; + return 1; + } + } else { + SR_PushTime[i] = 0; + } + } + } + } + return 0; +} + +static void HuSoftResetPostProc(void) +{ + if(!SR_ExecReset) { + VISetBlack(TRUE); + VIFlush(); + if(THPProc) { + HuTHPStop(); + HuTHPClose(); + } + if(msmSysCheckInit()) { + msmStreamSetMasterVolume(0); + msmSeSetMasterVolume(0); + msmMusSetMasterVolume(0); + } + HuPadRumbleAllStop(); + SR_ExecReset = TRUE; + } +} \ No newline at end of file diff --git a/src/game/window.c b/src/game/window.c index 91e72636..30d28f20 100644 --- a/src/game/window.c +++ b/src/game/window.c @@ -14,6 +14,8 @@ #include "stdarg.h" #include "string.h" +#include "data_num/win.h" + typedef struct { /* 0x00 */ AnimData **anim; /* 0x04 */ s16 bank; @@ -163,10 +165,10 @@ static u8 ATTRIBUTE_ALIGN(32) charColPal[2*3*10] = { }; static s32 frameFileTbl[] = { - MAKE_DATA_NUM(DATADIR_WIN, 6), - MAKE_DATA_NUM(DATADIR_WIN, 7), - MAKE_DATA_NUM(DATADIR_WIN, 8), - MAKE_DATA_NUM(DATADIR_WIN, 6) + WIN_FRAME1_ANM, + WIN_FRAME2_ANM, + WIN_FRAME3_ANM, + WIN_FRAME1_ANM }; static char *mesDataTbl[] = { @@ -190,7 +192,7 @@ static s16 winPrio = 1000; void HuWindowInit(void) { s16 i; - winAMemP = HuAR_DVDtoARAM(MAKE_DIR_NUM(DATADIR_WIN)); + winAMemP = HuAR_DVDtoARAM(DATADIR_WIN); for (i = 0; i < 32; i++) { winData[i].group = -1; } @@ -215,33 +217,33 @@ void HuWinInit(s32 mess_data_no) { } if (!fontAnim) { if (LanguageNo == 0) { - anim_data = HuDataReadNum(MAKE_DATA_NUM(DATADIR_WIN, 0), MEMORY_DEFAULT_NUM); + anim_data = HuDataReadNum(WIN_FONTJ_ANM, MEMORY_DEFAULT_NUM); } else { - anim_data = HuDataReadNum(MAKE_DATA_NUM(DATADIR_WIN, 1), MEMORY_DEFAULT_NUM); + anim_data = HuDataReadNum(WIN_FONTE_ANM, MEMORY_DEFAULT_NUM); } fontAnim = HuSprAnimRead(anim_data); } if (!iconAnim) { - anim_data = HuDataReadNum(MAKE_DATA_NUM(DATADIR_WIN, 3), MEMORY_DEFAULT_NUM); + anim_data = HuDataReadNum(WIN_ICON_ANM, MEMORY_DEFAULT_NUM); iconAnim = HuSprAnimRead(anim_data); HuSprAnimLock(iconAnim); } if (!cursorAnim) { - anim_data = HuDataReadNum(MAKE_DATA_NUM(DATADIR_WIN, 2), MEMORY_DEFAULT_NUM); + anim_data = HuDataReadNum(WIN_CURSOR_ANM, MEMORY_DEFAULT_NUM); cursorAnim = HuSprAnimRead(anim_data); HuSprAnimLock(cursorAnim); } if (!cardAnimA) { - anim_data = HuDataReadNum(MAKE_DATA_NUM(DATADIR_WIN, 4), MEMORY_DEFAULT_NUM); + anim_data = HuDataReadNum(WIN_CARDA_ANM, MEMORY_DEFAULT_NUM); cardAnimA = HuSprAnimRead(anim_data); HuSprAnimLock(cardAnimA); } if (!cardAnimB) { - anim_data = HuDataReadNum(MAKE_DATA_NUM(DATADIR_WIN, 5), MEMORY_DEFAULT_NUM); + anim_data = HuDataReadNum(WIN_CARDB_ANM, MEMORY_DEFAULT_NUM); cardAnimB = HuSprAnimRead(anim_data); HuSprAnimLock(cardAnimB); } - HuDataDirClose(MAKE_DIR_NUM(DATADIR_WIN)); + HuDataDirClose(DATADIR_WIN); HuWinComKeyReset(); winPrio = 1000; } @@ -402,7 +404,7 @@ void HuWinAllKill(void) { HuMemDirectFree(messDataPtr); messDataPtr = 0; } - HuDataDirClose(MAKE_DIR_NUM(DATADIR_WIN)); + HuDataDirClose(DATADIR_WIN); } static void MesDispFunc(SpriteData *sprite) { @@ -1200,7 +1202,7 @@ void HuWinAttrReset(s16 window, u32 attr) { window_ptr->attr &= ~attr; } -u8 HuWinStatGet(s16 window) { +s16 HuWinStatGet(s16 window) { WindowData *window_ptr = &winData[window]; return window_ptr->stat; @@ -1775,25 +1777,25 @@ void HuWinDisablePlayerReset(s16 window, u8 player) { } static s32 winPortraitTbl[] = { - MAKE_DATA_NUM(DATADIR_WIN, 15), - MAKE_DATA_NUM(DATADIR_WIN, 16), - MAKE_DATA_NUM(DATADIR_WIN, 17), - MAKE_DATA_NUM(DATADIR_WIN, 18), - MAKE_DATA_NUM(DATADIR_WIN, 19), - MAKE_DATA_NUM(DATADIR_WIN, 20), - MAKE_DATA_NUM(DATADIR_WIN, 21), - MAKE_DATA_NUM(DATADIR_WIN, 22), - MAKE_DATA_NUM(DATADIR_WIN, 23), - MAKE_DATA_NUM(DATADIR_WIN, 24), - MAKE_DATA_NUM(DATADIR_WIN, 25), - MAKE_DATA_NUM(DATADIR_WIN, 26), - MAKE_DATA_NUM(DATADIR_WIN, 27), - MAKE_DATA_NUM(DATADIR_WIN, 9), - MAKE_DATA_NUM(DATADIR_WIN, 10), - MAKE_DATA_NUM(DATADIR_WIN, 11), - MAKE_DATA_NUM(DATADIR_WIN, 12), - MAKE_DATA_NUM(DATADIR_WIN, 13), - MAKE_DATA_NUM(DATADIR_WIN, 14) + WIN_TOAD_TALK_ANM, + WIN_BOBOMB_TALK_ANM, + WIN_SHYGUY_TALK_ANM, + WIN_BOO_TALK_ANM, + WIN_GOOMBA_TALK_ANM, + WIN_BOWSER_TALK_ANM, + WIN_KKID_TALK_ANM, + WIN_KOOPA_TALK_ANM, + WIN_CONDOR_TALK_ANM, + WIN_BOO_BLUE_TALK_ANM, + WIN_DOLPHIN_TALK_ANM, + WIN_BOO_RED_TALK_ANM, + WIN_THWOMP_TALK_ANM, + WIN_W01_HOST_TALK_ANM, + WIN_W02_HOST_TALK_ANM, + WIN_W03_HOST_TALK_ANM, + WIN_W04_HOST_TALK_ANM, + WIN_W05_HOST_TALK_ANM, + WIN_W06_HOST_TALK_ANM }; s16 HuWinExCreate(float x, float y, s16 w, s16 h, s16 portrait) { diff --git a/src/game/wipe.c b/src/game/wipe.c index 451e6fb5..7d4cbea0 100644 --- a/src/game/wipe.c +++ b/src/game/wipe.c @@ -2,8 +2,7 @@ #include "game/wipe.h" #include "game/memory.h" #include "game/flag.h" - -extern s8 boardTutorialF; +#include "game/board/tutorial.h" s16 HuSysVWaitGet(s16 old); diff --git a/tools/project.py b/tools/project.py index 0cc9e4c0..0f5ad89b 100644 --- a/tools/project.py +++ b/tools/project.py @@ -886,7 +886,9 @@ def generate_objdiff_config(config, build_config): return lib, obj = result - unit_src_path = config.src_dir / obj.options["source"] + src_dir = Path(lib.get("src_dir", config.src_dir)) + + unit_src_path = src_dir / obj.options["source"] if not unit_src_path.exists(): objdiff_config["units"].append(unit_config) return