From f77ef40a9f643b9835ff991cc4762b7caf33dda9 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Mon, 10 Jun 2024 17:25:35 -0500 Subject: [PATCH] Decompile w02dll dice and gamble --- config/GMPE01_00/rels/w02Dll/symbols.txt | 104 ++--- configure.py | 4 +- include/REL/w02Dll.h | 38 ++ src/REL/w02Dll/dice.c | 551 +++++++++++++++++++---- src/REL/w02Dll/gamble.c | 303 ++++++++++++- 5 files changed, 861 insertions(+), 139 deletions(-) diff --git a/config/GMPE01_00/rels/w02Dll/symbols.txt b/config/GMPE01_00/rels/w02Dll/symbols.txt index ad1b1e8c..5d690fdf 100644 --- a/config/GMPE01_00/rels/w02Dll/symbols.txt +++ b/config/GMPE01_00/rels/w02Dll/symbols.txt @@ -120,51 +120,51 @@ lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local data:f 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:0x8 scope:local data:float -lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0x4 data:float -lbl_1_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 data:float -lbl_1_rodata_40 = .rodata:0x00000040; // type:object size:0x4 data:float -lbl_1_rodata_44 = .rodata:0x00000044; // type:object size:0x4 data:float -lbl_1_rodata_48 = .rodata:0x00000048; // type:object size:0x4 data:float -lbl_1_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 data:float -lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x8 data:double -lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x4 data:float -lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x8 data:double -lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0x8 data:double -lbl_1_rodata_70 = .rodata:0x00000070; // type:object size:0x8 data:double -lbl_1_rodata_78 = .rodata:0x00000078; // type:object size:0x4 data:float -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_8C = .rodata:0x0000008C; // 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_A4 = .rodata:0x000000A4; // type:object size:0x4 data:float -lbl_1_rodata_A8 = .rodata:0x000000A8; // type:object size:0xC data:4byte -lbl_1_rodata_B4 = .rodata:0x000000B4; // type:object size:0x18 data:4byte -lbl_1_rodata_CC = .rodata:0x000000CC; // type:object size:0x24 data:4byte -lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0xC data:4byte -lbl_1_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 data:float -lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x4 data:float -lbl_1_rodata_104 = .rodata:0x00000104; // type:object size:0x4 data:float -lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x28 data:4byte -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_15C = .rodata:0x0000015C; // type:object size:0x4 data:float -lbl_1_rodata_160 = .rodata:0x00000160; // type:object size:0x4 data:float -lbl_1_rodata_164 = .rodata:0x00000164; // type:object size:0x4 data:float -lbl_1_rodata_168 = .rodata:0x00000168; // type:object size:0x4 data:float -lbl_1_rodata_16C = .rodata:0x0000016C; // type:object size:0x4 data:float -lbl_1_rodata_170 = .rodata:0x00000170; // type:object size:0x8 data:double +lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_40 = .rodata:0x00000040; // type:object size:0x4 scope:local data:float +lbl_1_rodata_44 = .rodata:0x00000044; // type:object size:0x4 scope:local data:float +lbl_1_rodata_48 = .rodata:0x00000048; // type:object size:0x4 scope:local data:float +lbl_1_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x8 scope:local data:double +lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x4 scope:local data:float +lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x8 scope:local data:double +lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0x8 scope:local data:double +lbl_1_rodata_70 = .rodata:0x00000070; // type:object size:0x8 scope:local data:double +lbl_1_rodata_78 = .rodata:0x00000078; // type:object size:0x4 scope:local data:float +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_8C = .rodata:0x0000008C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x8 scope:local data:double +lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 scope:local data:float +lbl_1_rodata_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_A4 = .rodata:0x000000A4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A8 = .rodata:0x000000A8; // type:object size:0xC scope:local data:4byte +lbl_1_rodata_B4 = .rodata:0x000000B4; // type:object size:0x18 scope:local data:4byte +lbl_1_rodata_CC = .rodata:0x000000CC; // type:object size:0x24 scope:local data:4byte +lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0xC scope:local data:4byte +lbl_1_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x4 scope:local data:float +lbl_1_rodata_104 = .rodata:0x00000104; // type:object size:0x4 scope:local data:float +lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x28 scope:local data:4byte +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_15C = .rodata:0x0000015C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_160 = .rodata:0x00000160; // type:object size:0x4 scope:local data:float +lbl_1_rodata_164 = .rodata:0x00000164; // type:object size:0x4 scope:local data:float +lbl_1_rodata_168 = .rodata:0x00000168; // type:object size:0x4 scope:local data:float +lbl_1_rodata_16C = .rodata:0x0000016C; // 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:0x4 data:float lbl_1_rodata_17C = .rodata:0x0000017C; // type:object size:0x4 data:float lbl_1_rodata_180 = .rodata:0x00000180; // type:object size:0x8 data:double @@ -370,14 +370,14 @@ lbl_1_data_284 = .data:0x00000284; // type:object size:0x2 data:2byte lbl_1_data_286 = .data:0x00000286; // type:object size:0x2 data:2byte lbl_1_data_288 = .data:0x00000288; // type:object size:0x8 lbl_1_data_290 = .data:0x00000290; // type:object size:0x18 -lbl_1_data_2A8 = .data:0x000002A8; // type:object size:0x12 data:string -lbl_1_data_2BA = .data:0x000002BA; // type:object size:0xE data:string -lbl_1_data_2C8 = .data:0x000002C8; // type:object size:0x10 data:string +lbl_1_data_2A8 = .data:0x000002A8; // type:object size:0x12 scope:local data:string +lbl_1_data_2BA = .data:0x000002BA; // type:object size:0xE scope:local data:string +lbl_1_data_2C8 = .data:0x000002C8; // type:object size:0x10 scope:local data:string lbl_1_data_2D8 = .data:0x000002D8; // type:object size:0x50 -lbl_1_data_328 = .data:0x00000328; // type:object size:0x1D data:string -lbl_1_data_345 = .data:0x00000345; // type:object size:0x1B data:string -lbl_1_data_360 = .data:0x00000360; // type:object size:0x11 data:string -lbl_1_data_371 = .data:0x00000371; // type:object size:0x7 +lbl_1_data_328 = .data:0x00000328; // type:object size:0x1D scope:local data:string +lbl_1_data_345 = .data:0x00000345; // type:object size:0x1B scope:local data:string +lbl_1_data_360 = .data:0x00000360; // type:object size:0x11 scope:local data:string +lbl_1_data_371 = .data:0x00000371; // type:object size:0x7 scope:local lbl_1_data_378 = .data:0x00000378; // type:object size:0x24 lbl_1_data_39C = .data:0x0000039C; // type:object size:0x24 lbl_1_data_3C0 = .data:0x000003C0; // type:object size:0x24 diff --git a/configure.py b/configure.py index 525fce57..43ff532f 100644 --- a/configure.py +++ b/configure.py @@ -1484,8 +1484,8 @@ config.libs = [ objects={ Object(Matching, "REL/board_executor.c"), Object(Matching, "REL/w02Dll/main.c"), - Object(NonMatching, "REL/w02Dll/dice.c"), - Object(NonMatching, "REL/w02Dll/gamble.c"), + Object(Matching, "REL/w02Dll/dice.c"), + Object(Matching, "REL/w02Dll/gamble.c"), Object(NonMatching, "REL/w02Dll/mg_coin.c"), Object(NonMatching, "REL/w02Dll/mg_item.c"), Object(NonMatching, "REL/w02Dll/shuffleboard.c"), diff --git a/include/REL/w02Dll.h b/include/REL/w02Dll.h index bf99e873..28dc596e 100644 --- a/include/REL/w02Dll.h +++ b/include/REL/w02Dll.h @@ -12,7 +12,41 @@ #include "game/board/window.h" #include "game/board/map_object.h" + +/* STRUCTS*/ +typedef struct m02_dice { + /* 0x00 */ s16 unk00; + /* 0x02 */ s16 unk02; + /* 0x04 */ s32 unk04; + /* 0x08 */ s32 *unk08; + /* 0x0C */ Vec unk0C; + /* 0x18 */ s16 unk18; + /* 0x1A */ s16 unk1A; + /* 0x1C */ u16 unk1C[3]; + /* 0x22 */ s16 unk22; + /* 0x24 */ f32 unk24; + /* 0x28 */ s16 unk28; + /* 0x2A */ u8 unk2A[0x2]; + /* 0x2C */ Process *unk2C; + /* 0x30 */ s16 unk30[3]; + /* 0x36 */ s16 unk36[3]; + /* 0x3C */ omObjData *unk3C[3]; + /* 0x48 */ s16 unk48[3]; + /* 0x4E */ u8 unk4E[0x2]; + /* 0x50 */ omObjData *unk50[3]; + /* 0x5C */ u8 unk5C[0x08]; + /* 0x64 */ Vec unk64[2]; + /* 0x7C */ Vec unk7C; + /* 0x88 */ s32 unk88[3]; + /* 0x94 */ s16 unk94; + /* 0x96 */ s16 unk96; + /* 0x98 */ f32 unk98; + /* 0x9C */ s16 unk9C; +} m02Dice; + + extern s16 lbl_1_bss_30[0x10]; // Model List +extern s16 lbl_1_data_286; // main.c extern void fn_1_770(); @@ -23,6 +57,10 @@ extern void fn_1_92C(); extern s32 fn_1_1128(); extern void fn_1_121C(u32); +void fn_1_1254(m02Dice* arg0); +void fn_1_1518(m02Dice* arg0); +s32 fn_1_17F4(m02Dice* arg0); + // roulette.c extern void fn_1_D3AC(); extern s32 fn_1_D8C4(); diff --git a/src/REL/w02Dll/dice.c b/src/REL/w02Dll/dice.c index 637189ea..521ff986 100644 --- a/src/REL/w02Dll/dice.c +++ b/src/REL/w02Dll/dice.c @@ -1,49 +1,5 @@ #include "REL/w02Dll.h" - -/* DATA */ -extern char lbl_1_data_2A8[0x12]; -extern char lbl_1_data_2BA[0x0D]; -extern char lbl_1_data_2C8[0x10]; - -/* RODATA*/ -extern f32 lbl_1_rodata_38; -extern f32 lbl_1_rodata_3C; -extern f32 lbl_1_rodata_40; -extern f32 lbl_1_rodata_44; -extern f32 lbl_1_rodata_48; -extern f32 lbl_1_rodata_4C; - -/* STRUCTS*/ -typedef struct { - /* 0x00 */ s16 unk00; - /* 0x02 */ s16 unk02; - /* 0x04 */ s32 unk04; - /* 0x08 */ u8 unk08[0x04]; - /* 0x0C */ Vec unk0C; - /* 0x18 */ s16 unk18; - /* 0x1A */ s16 unk1A; - /* 0x1C */ u8 unk1C[0x6]; - /* 0x22 */ s16 unk22; - /* 0x24 */ f32 unk24; - /* 0x28 */ s16 unk28; - /* 0x2A */ u8 unk2A[0x2]; - /* 0x2C */ Process* unk2C; - /* 0x30 */ s16 unk30[3]; - /* 0x36 */ s16 unk36[3]; - /* 0x3C */ omObjData* unk3C[3]; - /* 0x48 */ s16 unk48[3]; - /* 0x4E */ u8 unk4E[0x2]; - /* 0x50 */ s32 unk50[3]; - /* 0x5C */ u8 unk5C[0x08]; - /* 0x64 */ Vec unk64; - /* 0x70 */ Vec unk70; - /* 0x7C */ Vec unk7C; - /* 0x88 */ s32 unk88[3]; - /* 0x94 */ s16 unk94; - /* 0x96 */ s16 unk96; - /* 0x98 */ f32 unk98; - /* 0x9C */ s16 unk9C; -} unkW02Dice; +#include "ext_math.h" typedef struct { union { @@ -59,27 +15,31 @@ typedef struct { /* 0x01 */ u8 unk01; /* 0x02 */ u8 unk02; /* 0x03 */ u8 unk03; -/* 0x04 */ u16 unk04; -} unkW02DiceBitfields; +/* 0x04 */ s16 unk04; +/* 0x06 */ s16 unk06; +} WorkDice; /* EXTERN FUNCTIONS */ void fn_1_13D0(void); -void fn_1_1574(unkW02Dice*); /* extern */ -void fn_1_1794(unkW02Dice*); /* extern */ -void fn_1_1850(omObjData*); /* extern */ -void fn_1_2030(unkW02Dice*); /* extern */ -void fn_1_2220(unkW02Dice*); /* extern */ -s32 fn_1_233C(unkW02Dice*); /* extern */ -void fn_1_23B4(unkW02Dice*, s32 i); /* extern */ -void fn_1_272C(unkW02Dice*); /* extern */ +void fn_1_1574(m02Dice *arg0); +void fn_1_1794(m02Dice *arg0); +void fn_1_1850(omObjData *object); +void fn_1_1F94(m02Dice* arg0, s32 arg1); +void fn_1_2030(m02Dice *arg0); +void fn_1_2100(m02Dice *arg0, s32 arg1); +void fn_1_2220(m02Dice *arg0); +s32 fn_1_233C(m02Dice *arg0); +void fn_1_23FC(m02Dice *arg0, s32 arg1); +void fn_1_23B4(m02Dice *arg0, s32 arg1); +void fn_1_272C(m02Dice *arg0); /* LOCAL FUNCTIONS */ -void fn_1_1254(unkW02Dice* arg0) { +void fn_1_1254(m02Dice* arg0) { Vec sp8; s32 i; - OSReport(lbl_1_data_2A8); - arg0->unk2C = HuPrcChildCreate(&fn_1_13D0, 0x2005, 0x2000, 0, boardMainProc); + OSReport("m02GenDiceCreate\n"); + arg0->unk2C = HuPrcChildCreate(fn_1_13D0, 0x2005, 0x2000, 0, boardMainProc); arg0->unk2C->user_data = arg0; arg0->unk94 = 0; arg0->unk9C = 0; @@ -87,9 +47,9 @@ void fn_1_1254(unkW02Dice* arg0) { Hu3D3Dto2D(&arg0->unk0C, 1, &sp8); /* Initialize Matrix */ - arg0->unk64 = arg0->unk70 = arg0->unk7C = sp8; - arg0->unk7C.y = arg0->unk70.y = arg0->unk64.y = lbl_1_rodata_38; - arg0->unk7C.z = arg0->unk70.z = arg0->unk64.z = lbl_1_rodata_3C; + arg0->unk64[0] = arg0->unk64[1] = arg0->unk7C = sp8; + arg0->unk7C.y = arg0->unk64[1].y = arg0->unk64[0].y = 155; + arg0->unk7C.z = arg0->unk64[1].z = arg0->unk64[0].z = 1400; arg0->unk96 = -1; for (i = 0; i < 3; i++) { @@ -105,7 +65,7 @@ void fn_1_13D0(void) { s32 var_r29; s32 i; s32 var_r30_2; - unkW02Dice* temp_r31; + m02Dice* temp_r31; temp_r31 = HuPrcCurrentGet()->user_data; temp_r31->unk36[0] = temp_r31->unk36[1] = temp_r31->unk36[2] = 0; @@ -127,7 +87,7 @@ void fn_1_13D0(void) { for ( i = 0; i < temp_r31->unk00; i++) { var_r29 += temp_r31->unk36[i]; } - OSReport(lbl_1_data_2BA, var_r29); + OSReport("Dice res: %d\n", var_r29); while (fn_1_233C(temp_r31) == 0) { HuPrcVSleep(); @@ -146,8 +106,8 @@ void fn_1_13D0(void) { } } -void fn_1_1518(unkW02Dice* arg0) { - OSReport(lbl_1_data_2C8); +void fn_1_1518(m02Dice* arg0) { + OSReport("m02GenDiceKill\n"); if (arg0->unk2C) { HuPrcKill(arg0->unk2C); } @@ -155,21 +115,21 @@ void fn_1_1518(unkW02Dice* arg0) { fn_1_272C(arg0); } -void fn_1_1574(unkW02Dice* arg0) { +void fn_1_1574(m02Dice* arg0) { Vec sp8; f32 temp_f0; omObjData* temp_r3; s32 temp_r28; - unkW02DiceBitfields* temp_r29; + WorkDice* temp_r29; temp_r28 = arg0->unk96; arg0->unk30[temp_r28] = BoardModelCreate(arg0->unk04, NULL, 0); - arg0->unk98 = lbl_1_rodata_40 + BoardRandMod(arg0->unk1A); + arg0->unk98 = 0.5f + BoardRandMod(arg0->unk1A); BoardModelMotionStart(arg0->unk30[temp_r28], 0, 0x40000001U); - BoardModelMotionSpeedSet(arg0->unk30[temp_r28], lbl_1_rodata_44); + BoardModelMotionSpeedSet(arg0->unk30[temp_r28], 0); BoardModelMotionTimeSet(arg0->unk30[temp_r28], arg0->unk98); temp_r3 = omAddObjEx(boardObjMan, 0x102, 0U, 0U, -1, fn_1_1850); - temp_r29 = (unkW02DiceBitfields*) temp_r3->work; + temp_r29 = (WorkDice*) temp_r3->work; temp_r29->unk7 = 0; temp_r29->unk6 = 0; @@ -182,39 +142,156 @@ void fn_1_1574(unkW02Dice* arg0) { temp_r3->unk10 = (u32) arg0; arg0->unk3C[temp_r28] = temp_r3; sp8 = arg0->unk0C; - sp8.y += (lbl_1_rodata_48 * arg0->unk24); + sp8.y += (250.0f * arg0->unk24); temp_r3->trans.x = sp8.x; temp_r3->trans.y = sp8.y; temp_r3->trans.z = sp8.z; - temp_r3->scale.x = lbl_1_rodata_44; - temp_r3->scale.y = lbl_1_rodata_44; - temp_r3->scale.z = lbl_1_rodata_44; - sp8.z += lbl_1_rodata_4C; + temp_r3->scale.x = 0; + temp_r3->scale.y = 0; + temp_r3->scale.z = 0; + sp8.z += 70.0f; HuAudFXPlay(0x302); } -void fn_1_1794(unkW02Dice* arg0) { - unkW02DiceBitfields* temp_r30; +void fn_1_1794(m02Dice* arg0) { + WorkDice* temp_r30; - temp_r30 = (unkW02DiceBitfields*) arg0->unk3C[arg0->unk96]->work; + temp_r30 = OM_GET_WORK_PTR(arg0->unk3C[arg0->unk96], WorkDice); while (temp_r30->unk3 != 1) { HuPrcVSleep(); } } -s32 fn_1_17F4(unkW02Dice* arg0) { - unkW02DiceBitfields* temp; +s32 fn_1_17F4(m02Dice* arg0) +{ + WorkDice* temp; if ( arg0->unk96 < 0) { return 0; } - temp = (unkW02DiceBitfields*) arg0->unk3C[arg0->unk96]->work; + temp = OM_GET_WORK_PTR(arg0->unk3C[arg0->unk96], WorkDice); if (temp->unk3 != 1) { return 0; } return 1; } -void fn_1_1F94(unkW02Dice* arg0, s32 arg1) { +void fn_1_1850(omObjData *object) +{ + WorkDice *temp_r29; + m02Dice *temp_r27; + s16 temp_r26; + s16 temp_r25; + float temp_f29; + float temp_f28; + float temp_f27; + temp_r27 = (m02Dice *)object->unk10; + temp_r29 = OM_GET_WORK_PTR(object, WorkDice); + if(temp_r29->unk7 || BoardIsKill()) { + fn_1_1F94(temp_r27, temp_r29->unk1); + temp_r27->unk3C[temp_r29->unk1] = NULL; + omDelObjEx(HuPrcCurrentGet(), object); + return; + } + if(BoardPauseActiveCheck()) { + return; + } + switch(temp_r29->unk3) { + case 0: + if(temp_r29->unk06 >= 1080) { + temp_r29->unk3 = 1; + object->scale.x = object->scale.y = object->scale.z = 1; + + object->rot.y = temp_r29->unk04 = 0; + } else { + if(!temp_r29->unk04 && temp_r27->unk88[temp_r29->unk1] == -1) { + temp_r27->unk88[temp_r29->unk1] = HuAudFXPlay(768); + } + object->rot.y = temp_r29->unk06%360; + temp_r29->unk06 += 25; + if(temp_r29->unk04 < 180) { + temp_f27 = 0; + temp_f28 = 1; + } else { + temp_f27 = 1; + temp_f28 = 0.5f; + } + object->scale.x = (temp_f28*sind((float)(temp_r29->unk04%180)))+temp_f27; + object->scale.y = object->scale.x; + object->scale.z = object->scale.x; + if(temp_r29->unk04 <= 360) { + if(temp_r29->unk04 < 180) { + temp_r29->unk04 += 6; + } else { + temp_r29->unk04 += 18; + } + 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); + object->trans.y += sind(temp_f29)*0.2f; + break; + + case 2: + temp_r29->unk04++; + if(temp_r29->unk04 >= 8) { + if(temp_r27->unk88[temp_r29->unk1] != -1) { + HuAudFXStop(temp_r27->unk88[temp_r29->unk1]); + temp_r27->unk88[temp_r29->unk1] = -1; + } + HuAudFXPlay(771); + HuAudFXPlay(780); + temp_r29->unk3 = 3; + temp_r29->unk04 = 0; + fn_1_23FC(temp_r27, temp_r27->unk36[temp_r29->unk1]); + fn_1_2100(temp_r27, temp_r29->unk1); + Hu3DParManPosSet(temp_r27->unk48[temp_r29->unk1], object->trans.x, object->trans.y, object->trans.z); + BoardModelVisibilitySet(temp_r27->unk30[temp_r29->unk1], 0); + } else { + OSs16tof32(&temp_r29->unk04, &temp_f29); + if(temp_r29->unk04 < 4) { + object->trans.y += (0.5f*temp_f29)+10.0f; + object->scale.x += (0.1f*sind(4.0f*temp_f29)); + object->scale.y = object->scale.x; + object->scale.z = object->scale.x; + } else { + BoardModelAlphaSet(temp_r27->unk30[temp_r29->unk1], 255-(temp_r29->unk04*32)); + } + object->trans.y += -0.49f*temp_f29*temp_f29; + } + break; + + case 3: + if(++temp_r29->unk04 >= 150) { + temp_r29->unk7 = 1; + } + break; + } + if(!temp_r29->unk6 || temp_r29->unk3 != 3) { + if(temp_r29->unk02++ > temp_r29->unk01) { + temp_r29->unk02 = 0; + temp_r25 = BoardModelMotionTimeGet(temp_r27->unk30[temp_r29->unk1]); + do { + temp_r26 = BoardRandMod(temp_r27->unk1A); + } while(temp_r26 == temp_r25); + BoardModelMotionTimeSet(temp_r27->unk30[temp_r29->unk1], temp_r26+0.5f); + } + } + BoardModelPosSet(temp_r27->unk30[temp_r29->unk1], object->trans.x, object->trans.y, object->trans.z); + BoardModelRotSet(temp_r27->unk30[temp_r29->unk1], object->rot.x, object->rot.y, object->rot.z); + BoardModelScaleSet(temp_r27->unk30[temp_r29->unk1], object->scale.x, object->scale.y, object->scale.z); +} + +void fn_1_1F94(m02Dice* arg0, s32 arg1) { if (arg0->unk30[arg1] != -1) { BoardModelKill(arg0->unk30[arg1]); arg0->unk30[arg1] = -1; @@ -223,6 +300,314 @@ void fn_1_1F94(unkW02Dice* arg0, s32 arg1) { if (arg0->unk48[arg1] != -1) { Hu3DParManKill(arg0->unk48[arg1]); arg0->unk48[arg1] = -1; - } +} + +void fn_1_2030(m02Dice *arg0) +{ + fn_1_1F94(arg0, 0); + fn_1_1F94(arg0, 1); + fn_1_1F94(arg0, 2); +} + + +HsfanimStruct00 lbl_1_data_2D8 = { + 150, + { 0x00, 0x00 }, // padding? + 50, + 0, + 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 + } +}; + +void fn_1_2100(m02Dice *arg0, s32 arg1) +{ + s16 temp_r29; + AnimData *temp_r28; + void *temp_r27; + temp_r27 = HuDataSelHeapReadNum(0x120001, MEMORY_DEFAULT_NUM, HEAP_DATA); + temp_r28 = HuSprAnimRead(temp_r27); + arg0->unk48[arg1] = Hu3DParManCreate(temp_r28, 100, &lbl_1_data_2D8); + Hu3DParManAttrSet(arg0->unk48[arg1], 0x108); + Hu3DParManRotSet(arg0->unk48[arg1], 0, 0, 0); + Hu3DParManVecSet(arg0->unk48[arg1], 0, 0.4f, 0.2f); + temp_r29 = Hu3DParManModelIDGet(arg0->unk48[arg1]); + Hu3DModelLayerSet(temp_r29, 2); + Hu3DParticleBlendModeSet(temp_r29, 0); +} + +void fn_1_2220(m02Dice *arg0) +{ + s32 temp_r30; + WorkDice *temp_r29; + temp_r30 = arg0->unk96; + temp_r29 = OM_GET_WORK_PTR(arg0->unk3C[temp_r30], WorkDice); + temp_r29->unk3 = 2; + temp_r29->unk04 = 0; + BoardModelMotionSpeedSet(arg0->unk30[temp_r30], 0); + + arg0->unk36[temp_r30] = arg0->unk1C[temp_r30]; +} + +typedef struct { + u8 field0_bit0 : 1; + u8 field0_bit1 : 1; + u8 field0_bit2 : 1; + u8 field0_bit3 : 2; + s8 unk01; + s16 unk02; + s16 unk04[2]; + float unk08; +} WorkDiceNum; + +void fn_1_22BC(m02Dice *arg0) +{ + s32 temp_r31; + WorkDiceNum *temp_r30; + for(temp_r31=0; temp_r31unk00; temp_r31++) { + if(arg0->unk50[temp_r31]) { + temp_r30 = OM_GET_WORK_PTR(arg0->unk50[temp_r31], WorkDiceNum); + temp_r30->field0_bit1 = 1; + temp_r30->field0_bit2 = 1; + temp_r30->unk02 = 0; + } + } +} + +s32 fn_1_233C(m02Dice* arg0) +{ + s32 temp_r31; + WorkDiceNum *temp_r30; + for(temp_r31=0; temp_r31unk00; temp_r31++) { + if(!arg0->unk50[temp_r31]) { + continue; + } + temp_r30 = OM_GET_WORK_PTR(arg0->unk50[temp_r31], WorkDiceNum); + if(temp_r30->field0_bit2) { + return 0; + } + } + return 1; +} + +void fn_1_23B4(m02Dice *arg0, s32 arg1) +{ + WorkDiceNum *work; + if(!arg0->unk50[arg1]) { + return; + } + work = OM_GET_WORK_PTR(arg0->unk50[arg1], WorkDiceNum); + work->field0_bit0 = 1; +} + +void fn_1_25D0(omObjData *object); + +void fn_1_23FC(m02Dice *arg0, s32 arg1) +{ + Vec spC; + s16 sp8[2]; + WorkDiceNum *temp_r31; + s16 temp_r29; + omObjData *temp_r28; + s32 temp_r26; + s16 temp_r25; + temp_r26 = arg0->unk96; + if(arg1 > 99) { + arg1 = 99; + } + sp8[0] = arg1%10; + sp8[1] = arg1/10; + spC = arg0->unk0C; + spC.y += 300.0f; + temp_r28 = omAddObjEx(boardObjMan, 258, 0, 0, -1, fn_1_25D0); + temp_r28->unk10 = (u32)arg0; + temp_r31 = OM_GET_WORK_PTR(temp_r28, WorkDiceNum); + temp_r31->field0_bit0 = 0; + temp_r31->field0_bit1 = 0; + temp_r31->field0_bit2 = 0; + temp_r31->field0_bit3 = temp_r26; + temp_r31->unk08 = 0.3f; + temp_r31->unk01 = arg1; + temp_r31->unk02 = 360; + for(temp_r29=0; temp_r29<2; temp_r29++) { + temp_r25 = BoardModelCreate(arg0->unk08[sp8[temp_r29]], NULL, 0); + BoardModelPosSetV(temp_r25, &spC); + temp_r31->unk04[temp_r29] = temp_r25; + } + if(sp8[1] == 0) { + BoardModelVisibilitySet(temp_r31->unk04[1], 0); + } + arg0->unk50[temp_r26] = temp_r28; + +} + +void fn_1_2694(WorkDiceNum *arg0); +void fn_1_2830(m02Dice *arg0, WorkDiceNum *arg1, s32 arg2); +void fn_1_2BE4(m02Dice *arg0, WorkDiceNum *arg1, s32 arg2); + +void fn_1_25D0(omObjData *object) +{ + WorkDiceNum *temp_r31; + m02Dice *temp_r30; + temp_r30 = (m02Dice *)object->unk10; + temp_r31 = OM_GET_WORK_PTR(object, WorkDiceNum); + if(temp_r31->field0_bit0 || BoardIsKill()) { + fn_1_2694(temp_r31); + temp_r30->unk50[temp_r31->field0_bit3] = NULL; + omDelObjEx(HuPrcCurrentGet(), object); + return; + } + if(BoardPauseActiveCheck()) { + return; + } + fn_1_2830(temp_r30, temp_r31, temp_r31->field0_bit1); + fn_1_2BE4(temp_r30, temp_r31, temp_r31->field0_bit1); +} + +void fn_1_2694(WorkDiceNum *arg0) +{ + s32 i; + for(i=0; i<2; i++) { + if(arg0->unk04[i] == -1) { + continue; + } + OSReport("%d:GenDiceNumExitOM Kill %d\n", i, arg0->unk04[i]); + BoardModelKill(arg0->unk04[i]); + arg0->unk04[i] = -1; + (void)i; + } +} + +void fn_1_272C(m02Dice *arg0) +{ + s32 i; + WorkDiceNum *work; + s32 j; + for(i=0; i<3; i++) { + if(!arg0->unk50[i]) { + continue; + } + work = OM_GET_WORK_PTR(arg0->unk50[i], WorkDiceNum); + for(j=0; j<2; j++) { + if(work->unk04[j] == -1) { + continue; + } + OSReport("%d:GenDiceNumOMKillAll %d\n", j, work->unk04[j]); + BoardModelKill(work->unk04[j]); + work->unk04[j] = -1; + (void)j; + } + fn_1_23B4(arg0, i); + } + +} + +void fn_1_2830(m02Dice *arg0, WorkDiceNum *arg1, s32 arg2) +{ + float temp_f31; + s16 temp_r31; + Vec *temp_r29; + s16 temp_r27; + s32 sp8 = 0; + Vec sp30; + Vec sp24; + Vec sp18 = { 288, 155, 1400 }; + Vec sp54[2]; + Vec sp3C[2] = { + { 144, 155, 1400 }, + { 432, 155, 1400 } + }; + Vec sp6C[3] = { + { 144, 155, 1400 }, + { 432, 155, 1400 }, + { 288, 155, 1400 } + }; + Vec spC = { 288, 176, 1400 }; + temp_r27 = arg1->unk01/10; + if(arg2) { + temp_r29 = &spC; + temp_f31 = -20.0f*arg1->field0_bit3; + } else { + switch(arg0->unk00) { + case 1: + temp_r29 = &arg0->unk7C; + break; + + case 2: + case 3: + temp_r29 = &arg0->unk64[arg1->field0_bit3]; + break; + } + temp_f31 = 0; + } + for(temp_r31=0; temp_r31<2; temp_r31++) { + if(temp_r27 == 0) { + sp54[temp_r31].x = temp_r29->x; + } else { + if(temp_r31) { + sp54[temp_r31].x = temp_r29->x-30; + } else { + sp54[temp_r31].x = temp_r29->x+30; + } + } + sp54[temp_r31].y = temp_r29->y; + sp54[temp_r31].z = temp_r29->z+temp_f31; + } + for(temp_r31=0; temp_r31<2; temp_r31++) { + BoardModelPosGet(arg1->unk04[temp_r31], &sp30); + Hu3D2Dto3D(&sp54[temp_r31], 1, &sp54[temp_r31]); + VECSubtract(&sp54[temp_r31], &sp30, &sp24); + if(VECMag(&sp24) < 0.01f) { + arg1->field0_bit2 = 0; + if(arg2 && arg1->field0_bit3) { + BoardModelVisibilitySet(arg1->unk04[temp_r31], 0); + } + } else { + arg1->field0_bit2 = 1; + } + VECScale(&sp24, &sp24, arg1->unk08); + VECAdd(&sp30, &sp24, &sp30); + BoardModelPosSetV(arg1->unk04[temp_r31], &sp30); + } +} + +void fn_1_2BE4(m02Dice *arg0, WorkDiceNum *arg1, s32 arg2) +{ + s32 temp_r29; + float temp_f30; + if(arg2) { + arg1->unk02 += 18; + if(arg1->unk02 >= 360) { + arg1->unk02 = 360; + } + } else { + arg1->unk02 -= 18; + if(arg1->unk02 <= 0) { + arg1->unk02 = 0; + } + } + OSs16tof32(&arg1->unk02, &temp_f30); + for(temp_r29=0; temp_r29<2; temp_r29++) { + if(arg1->unk04[temp_r29] == -1) { + continue; + } + BoardModelRotSet(arg1->unk04[temp_r29], 0, temp_f30, 0); + } } \ No newline at end of file diff --git a/src/REL/w02Dll/gamble.c b/src/REL/w02Dll/gamble.c index dcb77bfa..d7df7c81 100644 --- a/src/REL/w02Dll/gamble.c +++ b/src/REL/w02Dll/gamble.c @@ -1,9 +1,308 @@ #include "REL/w02Dll.h" +#include "game/audio.h" +#include "game/pad.h" +#include "game/objsub.h" + +#include "game/board/basic_space.h" -Process* lbl_1_bss_50; s32 lbl_1_bss_54; +Process* lbl_1_bss_50; -void fn_1_2D04(); +void fn_1_2D04(void) +{ + float temp_f31; + float temp_f30; + float temp_f29; + + m02Dice spEC; + m02Dice sp4C; + s32 sp24[10] = { + 0x0076001C, + 0x0076001D, + 0x0076001E, + 0x0076001F, + 0x00760020, + 0x00760021, + 0x00760022, + 0x00760023, + 0x00760024, + 0x00760025 + }; + Vec sp18; + Vec spC; + BoardSpace *sp8; + s32 temp_r31; + s16 temp_r30; + s32 temp_r29; + s16 temp_r28; + s32 temp_r27; + s32 temp_r26; + s32 temp_r25; + u16 temp_r24; + temp_r31 = GWSystem.player_curr; + OSReport("gamble start %d\n", temp_r31); + sp8 = BoardSpaceGet(0, GWPlayer[temp_r31].space_curr); + BoardRollDispSet(0); + temp_r28 = BoardModelCreate(0x76000F, NULL, 0); + BoardModelVisibilitySet(temp_r28, 0); + switch(lbl_1_bss_54) { + case 0: + temp_r30 = lbl_1_bss_30[0]; + break; + + case 1: + temp_r30 = lbl_1_bss_30[1]; + break; + + case 2: + temp_r30 = lbl_1_bss_30[2]; + break; + } + BoardPlayerIdleSet(temp_r31); + BoardPlayerMotBlendSet(temp_r31, -90, 30); + while(!BoardPlayerMotBlendCheck(temp_r31)) { + HuPrcVSleep(); + } + BoardCameraViewSet(3); + BoardCameraMotionWait(); + BoardModelMotionStart(lbl_1_data_286, 1, 0x40000001); + BoardModelHookSet(temp_r30, "kuri", lbl_1_data_286); + BoardModelVisibilitySet(lbl_1_data_286, 1); + BoardModelMotionTimeSet(temp_r30, 0); + BoardModelAttrReset(temp_r30, 0x40000002); + HuAudFXPlay(813); + while(BoardModelMotionTimeGet(temp_r30) < 30.0f) { + HuPrcVSleep(); + } + BoardModelAttrSet(temp_r30, 0x40000002); + BoardModelHookReset(temp_r30); + BoardModelPosGet(temp_r30, &sp18); + BoardModelPosSetV(lbl_1_data_286, &sp18); + fn_1_121C(0x13000A); + spEC.unk00 = 1; + spEC.unk04 = 0x76001B; + spEC.unk08 = sp24; + spEC.unk0C = sp18; + spEC.unk18 = 1; + spEC.unk1A = 10; + spEC.unk22 = 0; + spEC.unk24 = 1; + temp_r25 = frandmod(100); + if(temp_r25 <= 59) { + spEC.unk1C[0] = frandmod(4)+4; + } else if(temp_r25 <= 89) { + if(temp_r25 & 0x1) { + spEC.unk1C[0] = 2; + } else { + spEC.unk1C[0] = 8; + } + spEC.unk1C[0] += frand() & 0x1; + } else { + if(temp_r25 & 0x1) { + spEC.unk1C[0] = 1; + } else { + spEC.unk1C[0] = 10; + } + } + fn_1_1254(&spEC); + while(!fn_1_17F4(&spEC)) { + HuPrcVSleep(); + } + temp_r29 = frandmod(45)+45; + HuPrcSleep(temp_r29); + BoardModelPosGet(lbl_1_data_286, &spC); + BoardModelMotionStart(lbl_1_data_286, 4, 0); + temp_f29 = 15; + temp_f31 = 0; + while(1) { + temp_f30 = temp_f29-(0.08166667f*(0.25f*(temp_f31*temp_f31))); + temp_f31++; + spC.y += temp_f30; + if(spC.y >= (250.0f+sp18.y)-130.0f) { + spC.y = (250.0f+sp18.y)-130.0f; + temp_f29 = -10; + temp_f31 = 0; + spEC.unk9C = 1; + } + if(spC.y <= sp18.y) { + spC.y = sp18.y; + spEC.unk9C = 0; + break; + } + BoardModelPosSetV(lbl_1_data_286, &spC); + HuPrcVSleep(); + } + BoardModelPosSetV(lbl_1_data_286, &sp18); + BoardModelMotionStart(lbl_1_data_286, 1, 0x40000001); + while(spEC.unk28 == 0) { + HuPrcVSleep(); + } + temp_r27 = spEC.unk94; + if(temp_r27 == 10) { + HuAudPlayerVoicePlay(temp_r31, 302); + fn_1_121C(0x130010); + } else { + fn_1_121C(0x13000C); + } + BoardPlayerMotBlendSet(temp_r31, 0, 15); + while(!BoardPlayerMotBlendCheck(temp_r31)) { + HuPrcVSleep(); + } + BoardCameraTargetModelSet(-1); + if(temp_r27 != 10) { + sp4C = spEC; + BoardPlayerPosGet(temp_r31, &sp4C.unk0C); + sp4C.unk24 = 1; + sp4C.unk1C[0] = frandmod(10)+1; + if(sp4C.unk1C[0] == temp_r27) { + if(sp4C.unk1C[0] == 9) { + sp4C.unk1C[0]--; + } else { + sp4C.unk1C[0]++; + } + } + fn_1_1254(&sp4C); + while(!fn_1_17F4(&sp4C)) { + HuPrcVSleep(); + } + temp_r24 = 0; + while(!(temp_r24 & PAD_BUTTON_A)) { + HuPrcVSleep(); + if(GWPlayer[temp_r31].com) { + temp_r29 = frandmod(45)+20; + HuPrcSleep(temp_r29); + temp_r24 = PAD_BUTTON_A; + } else { + temp_r24 = HuPadBtnDown[GWPlayer[temp_r31].port]; + } + } + BoardPlayerDiceJumpStart(temp_r31); + while(!BoardPlayerDiceJumpCheck(temp_r31)) { + HuPrcVSleep(); + } + sp4C.unk9C = 1; + while(GWPlayer[temp_r31].jump) { + HuPrcVSleep(); + } + sp4C.unk9C = 0; + while(sp4C.unk28 == 0) { + HuPrcVSleep(); + } + if(sp4C.unk94 > temp_r27) { + fn_1_121C(0x13000D); + } else { + HuAudPlayerVoicePlay(temp_r31, 302); + fn_1_121C(0x13000F); + } + } else { + sp4C.unk94 = 0; + } + fn_1_1518(&spEC); + if(temp_r27 != 10) { + fn_1_1518(&sp4C); + } + BoardPlayerPosGet(temp_r31, &spC); + if(sp4C.unk94 > temp_r27) { + spC.y += 250.0f; + HuAudFXPlay(839); + temp_r29 = BoardCoinChgCreate(&spC, 10); + while(!BoardCoinChgExist(temp_r29)) { + HuPrcVSleep(); + } + for(temp_r29=0; temp_r29<10; temp_r29++) { + BoardPlayerCoinsAdd(temp_r31, 1); + HuAudFXPlay(7); + HuPrcSleep(6); + } + fn_1_121C(0x13000E); + } else { + temp_r26 = GWPlayer[temp_r31].space_curr; + BoardCameraTargetSpaceSet(temp_r26); + BoardPlayerMotionShiftSet(temp_r31, 6, 0, 5, 0x40000001); + HuPrcSleep(60); + HuPrcSleep(30); + BoardModelPosSetV(temp_r28, &spC); + BoardModelMotionTimeSet(temp_r28, 0); + BoardModelVisibilitySet(temp_r28, 1); + HuAudFXPlay(1058); + while(BoardModelMotionTimeGet(temp_r28) < BoardModelMotionMaxTimeGet(temp_r28)) { + HuPrcVSleep(); + } + omVibrate(temp_r31, 12, 4, 2); + temp_f30 = -4; + for(temp_r29=0; temp_r29<30; temp_r29++) { + spC.y += temp_f30; + temp_f30 *= 1.08f; + BoardPlayerPosSetV(temp_r31, &spC); + HuPrcVSleep(); + } + temp_r26 = BoardSpaceFlagSearch(0, 0x80000000); + BoardCameraMoveSet(0); + BoardCameraTargetSpaceSet(temp_r26); + HuPrcVSleep(); + BoardCameraMoveSet(1); + BoardSpacePosGet(0, temp_r26, &sp18); + spC = sp18; + spC.y -= 180.0f; + BoardPlayerPosSetV(temp_r31, &spC); + GWPlayer[temp_r31].space_curr = temp_r26; + HuPrcSleep(15); + BoardModelPosSetV(temp_r28, &sp18); + BoardModelMotionTimeSet(temp_r28, 0); + HuAudFXPlay(1058); + while(BoardModelMotionTimeGet(temp_r28) < BoardModelMotionMaxTimeGet(temp_r28)) { + HuPrcVSleep(); + } + HuPrcSleep(15); + temp_f29 = 22; + temp_f31 = 1; + while(1) { + temp_f30 = temp_f29-((90.0f/1200.0f)*(0.25f*(temp_f31*temp_f31))); + temp_f31++; + spC.y += temp_f30; + if(spC.y >= sp18.y) { + BoardModelAttrSet(temp_r28, 0x40000004); + } + if(temp_f30 < 0 && spC.y <= sp18.y) { + omVibrate(temp_r31, 12, 4, 2); + temp_f29 = -temp_f30*0.31f; + temp_f31 = 1; + HuAudFXPlay(1068); + if(fabs(temp_f29) <= 5.0) { + break; + } + spC.y = sp18.y; + } + + BoardPlayerPosSetV(temp_r31, &spC); + HuPrcVSleep(); + } + BoardPlayerPosSetV(temp_r31, &sp18); + HuPrcSleep(90); + BoardPlayerIdleSet(temp_r31); + HuPrcSleep(9); + BoardCameraTargetPlayerSet(temp_r31); + } + BoardModelHookSet(temp_r30, "kuri", lbl_1_data_286); + BoardModelAttrReset(temp_r30, 0x40000002); + if(sp4C.unk94 > temp_r27) { + HuPrcSleep(10); + HuAudFXPlay(815); + } + while(BoardModelMotionTimeGet(temp_r30) < BoardModelMotionMaxTimeGet(temp_r30)) { + HuPrcVSleep(); + } + BoardModelHookReset(temp_r30); + BoardCameraViewSet(1); + BoardCameraMotionWait(); + BoardRollDispSet(1); + BoardModelVisibilitySet(lbl_1_data_286, 0); + BoardModelKill(temp_r28); + HuPrcKill(NULL); + while(1) { + HuPrcVSleep(); + } +} void fn_1_3938(void) {