diff --git a/config/GMPE01_00/rels/w03Dll/symbols.txt b/config/GMPE01_00/rels/w03Dll/symbols.txt index 49569241..ef56fe08 100644 --- a/config/GMPE01_00/rels/w03Dll/symbols.txt +++ b/config/GMPE01_00/rels/w03Dll/symbols.txt @@ -290,43 +290,43 @@ lbl_1_rodata_34C = .rodata:0x0000034C; // type:object size:0x4 data:float lbl_1_rodata_350 = .rodata:0x00000350; // type:object size:0x8 data:double lbl_1_rodata_358 = .rodata:0x00000358; // type:object size:0x4 data:float lbl_1_rodata_35C = .rodata:0x0000035C; // type:object size:0x4 data:float -lbl_1_rodata_360 = .rodata:0x00000360; // type:object size:0x4 data:float -lbl_1_rodata_364 = .rodata:0x00000364; // type:object size:0x4 data:float -lbl_1_rodata_368 = .rodata:0x00000368; // type:object size:0x4 data:float -lbl_1_rodata_36C = .rodata:0x0000036C; // type:object size:0x4 data:float -lbl_1_rodata_370 = .rodata:0x00000370; // type:object size:0x4 data:float -lbl_1_rodata_378 = .rodata:0x00000378; // type:object size:0x8 data:double -lbl_1_rodata_380 = .rodata:0x00000380; // type:object size:0x8 data:double -lbl_1_rodata_388 = .rodata:0x00000388; // type:object size:0x8 data:double -lbl_1_rodata_390 = .rodata:0x00000390; // type:object size:0x8 data:double -lbl_1_rodata_398 = .rodata:0x00000398; // type:object size:0x8 data:double -lbl_1_rodata_3A0 = .rodata:0x000003A0; // type:object size:0x8 data:double -lbl_1_rodata_3A8 = .rodata:0x000003A8; // type:object size:0x4 data:float -lbl_1_rodata_3AC = .rodata:0x000003AC; // type:object size:0x4 data:float -lbl_1_rodata_3B0 = .rodata:0x000003B0; // type:object size:0x4 data:float -lbl_1_rodata_3B4 = .rodata:0x000003B4; // type:object size:0x4 data:float -lbl_1_rodata_3B8 = .rodata:0x000003B8; // type:object size:0x4 data:float -lbl_1_rodata_3BC = .rodata:0x000003BC; // type:object size:0x4 data:float -lbl_1_rodata_3C0 = .rodata:0x000003C0; // type:object size:0x4 data:float -lbl_1_rodata_3C4 = .rodata:0x000003C4; // type:object size:0x4 data:float -lbl_1_rodata_3C8 = .rodata:0x000003C8; // type:object size:0x4 data:float -lbl_1_rodata_3CC = .rodata:0x000003CC; // type:object size:0x4 data:float -lbl_1_rodata_3D0 = .rodata:0x000003D0; // type:object size:0x4 data:float -lbl_1_rodata_3D4 = .rodata:0x000003D4; // type:object size:0x4 data:float -lbl_1_rodata_3D8 = .rodata:0x000003D8; // type:object size:0x4 data:float -lbl_1_rodata_3DC = .rodata:0x000003DC; // type:object size:0x4 data:float -lbl_1_rodata_3E0 = .rodata:0x000003E0; // type:object size:0x4 data:float -lbl_1_rodata_3E4 = .rodata:0x000003E4; // type:object size:0x4 data:float -lbl_1_rodata_3E8 = .rodata:0x000003E8; // type:object size:0x4 data:float -lbl_1_rodata_3EC = .rodata:0x000003EC; // type:object size:0x4 data:float -lbl_1_rodata_3F0 = .rodata:0x000003F0; // type:object size:0x4 data:float -lbl_1_rodata_3F4 = .rodata:0x000003F4; // type:object size:0x4 data:float -lbl_1_rodata_3F8 = .rodata:0x000003F8; // type:object size:0x4 data:float -lbl_1_rodata_3FC = .rodata:0x000003FC; // type:object size:0x4 data:float -lbl_1_rodata_400 = .rodata:0x00000400; // type:object size:0x4 data:float -lbl_1_rodata_404 = .rodata:0x00000404; // type:object size:0x4 data:float -lbl_1_rodata_408 = .rodata:0x00000408; // type:object size:0x4 data:float -lbl_1_rodata_410 = .rodata:0x00000410; // type:object size:0x8 data:double +lbl_1_rodata_360 = .rodata:0x00000360; // type:object size:0x4 scope:local data:float +lbl_1_rodata_364 = .rodata:0x00000364; // type:object size:0x4 scope:local data:float +lbl_1_rodata_368 = .rodata:0x00000368; // type:object size:0x4 scope:local data:float +lbl_1_rodata_36C = .rodata:0x0000036C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_370 = .rodata:0x00000370; // type:object size:0x4 scope:local data:float +lbl_1_rodata_378 = .rodata:0x00000378; // type:object size:0x8 scope:local data:double +lbl_1_rodata_380 = .rodata:0x00000380; // type:object size:0x8 scope:local data:double +lbl_1_rodata_388 = .rodata:0x00000388; // type:object size:0x8 scope:local data:double +lbl_1_rodata_390 = .rodata:0x00000390; // type:object size:0x8 scope:local data:double +lbl_1_rodata_398 = .rodata:0x00000398; // type:object size:0x8 scope:local data:double +lbl_1_rodata_3A0 = .rodata:0x000003A0; // type:object size:0x8 scope:local data:double +lbl_1_rodata_3A8 = .rodata:0x000003A8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3AC = .rodata:0x000003AC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3B0 = .rodata:0x000003B0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3B4 = .rodata:0x000003B4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3B8 = .rodata:0x000003B8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3BC = .rodata:0x000003BC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3C0 = .rodata:0x000003C0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3C4 = .rodata:0x000003C4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3C8 = .rodata:0x000003C8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3CC = .rodata:0x000003CC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3D0 = .rodata:0x000003D0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3D4 = .rodata:0x000003D4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3D8 = .rodata:0x000003D8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3DC = .rodata:0x000003DC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3E0 = .rodata:0x000003E0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3E4 = .rodata:0x000003E4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3E8 = .rodata:0x000003E8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3EC = .rodata:0x000003EC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3F0 = .rodata:0x000003F0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3F4 = .rodata:0x000003F4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3F8 = .rodata:0x000003F8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3FC = .rodata:0x000003FC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_400 = .rodata:0x00000400; // type:object size:0x4 scope:local data:float +lbl_1_rodata_404 = .rodata:0x00000404; // type:object size:0x4 scope:local data:float +lbl_1_rodata_408 = .rodata:0x00000408; // type:object size:0x4 scope:local data:float +lbl_1_rodata_410 = .rodata:0x00000410; // type:object size:0x8 scope:local data:double lbl_1_data_0 = .data:0x00000000; // type:object size:0x1E0 lbl_1_data_1E0 = .data:0x000001E0; // type:object size:0x2 data:2byte lbl_1_data_1E2 = .data:0x000001E2; // type:object size:0x2 data:2byte @@ -396,10 +396,10 @@ lbl_1_data_4DC = .data:0x000004DC; // type:object size:0x2 data:2byte lbl_1_data_4E0 = .data:0x000004E0; // type:object size:0x4 data:4byte lbl_1_data_4E4 = .data:0x000004E4; // type:object size:0x2 data:2byte lbl_1_data_4E6 = .data:0x000004E6; // type:object size:0xE -lbl_1_data_4F4 = .data:0x000004F4; // type:object size:0x5 data:string -lbl_1_data_4F9 = .data:0x000004F9; // type:object size:0x6 data:string -lbl_1_data_4FF = .data:0x000004FF; // type:object size:0x9 -lbl_1_data_508 = .data:0x00000508; // type:object size:0xC +lbl_1_data_4F4 = .data:0x000004F4; // type:object size:0x5 scope:local data:string +lbl_1_data_4F9 = .data:0x000004F9; // type:object size:0x6 scope:local data:string +lbl_1_data_4FF = .data:0x000004FF; // type:object size:0x9 scope:local +lbl_1_data_508 = .data:0x00000508; // type:object size:0xC scope:local lbl_1_data_514 = .data:0x00000514; // type:object size:0x38 lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x4 data:4byte lbl_1_bss_4 = .bss:0x00000004; // type:object size:0x4 data:4byte diff --git a/configure.py b/configure.py index 1c72a91a..90a845be 100644 --- a/configure.py +++ b/configure.py @@ -997,7 +997,7 @@ config.libs = [ Object(NonMatching, "REL/w03Dll/river.c"), Object(Matching, "REL/w03Dll/smoke.c"), Object(NonMatching, "REL/w03Dll/mg_coin.c"), - Object(NonMatching, "REL/w03Dll/mg_item.c"), + Object(Matching, "REL/w03Dll/mg_item.c"), } ), Rel('w04Dll', diff --git a/include/board_unsplit.h b/include/board_unsplit.h index 76f544b6..c7af0a90 100644 --- a/include/board_unsplit.h +++ b/include/board_unsplit.h @@ -58,7 +58,7 @@ void BoardTutorialBlockSetPos(s32, s32); s32 BoardCameraRotGet(Vec*); void BoardModelScaleSet(s16, f32, f32, f32); s32 BoardIsKill(void); -void BoardModelMtxSet(s16, Mtx); +void BoardModelMtxSet(s16, Mtx*); void BoardModelRotSet(s16, f32, f32, f32); void BoardBowserExec(s32 player, s32 space); diff --git a/src/REL/w03Dll/mg_item.c b/src/REL/w03Dll/mg_item.c new file mode 100644 index 00000000..99b745fe --- /dev/null +++ b/src/REL/w03Dll/mg_item.c @@ -0,0 +1,956 @@ +#include "dolphin.h" +#include "REL/executor.h" +#include "game/process.h" +#include "game/data.h" +#include "game/gamework_data.h" +#include "REL/w03Dll.h" +#include "game/board/space.h" +#include "game/object.h" +#include "game/board/player.h" +// #include "math.h" +#include "board_unsplit.h" +#include "game/hsfman.h" +#include "dolphin/os/OSFastCast.h" + +double sin(double x); +double cos(double x); +double atan2(double y, double x); + +#define OM_GET_WORK_PTR(object, type) ((type *)(&((object)->work[0]))) + +typedef struct someBits { + /* 0x00 */ struct { + u8 unk00_bit0 : 1; + u8 unk00_bit1 : 3; + u8 unk00_bit4 : 2; + u8 unk00_bit6 : 1; + u8 unk00_bit7 : 1; + }; + u8 unk1; + u8 unk2; + u8 unk3; + s16 unk4; + s16 unk_06[3]; +} someBits; + +typedef struct someBits2 { + /* 0x00 */ struct { + u8 unk00_bit0 : 1; + u8 unk00_bit1 : 3; + u8 unk00_bit4 : 2; + u8 unk00_bit6 : 1; + u8 unk00_bit7 : 1; + }; + s8 unk1; + s8 unk2; + u8 unk3[3]; + s16 unk_06[3]; +} someBits2; + +typedef struct w03UnkMG { + /* 0x00 */ char unk_00[0x10]; + /* 0x10 */ s16 unk_10; + /* 0x12 */ s16 unk_12; + /* 0x14 */ s16 unk_14; + /* 0x16 */ s16 unk_16; +} w03UnkMG; + +//external symbols +extern Process *boardMainProc; +extern s16 lbl_1_bss_C[14]; +extern Process *boardObjMan; +extern u16 HuPadBtnDown[4]; + +//function signatures +s32 BoardModelMotionShiftSet(s16, s32, f32, f32, u32); +s32 BoardVecDAngleCalcRange(float *value, float min, float range); +void BoardCameraQuakeSet(s32 duration, float strength); +s16 MGSeqCreate(s32, ...); +u8 MGSeqGetStat(s16); +void omVibrate(s16, s16, s16, s16); +void BoardPlayerMotBlendSet(s32, s32, s32); +f32 BoardPlayerRotYGet(s32); +f32 BoardModelMotionTimeGet(s16); +s32 BoardVecMinDistCheck(Vec *vec1, Vec *vec2, float min_dist); +s32 BoardModelScaleGet(s16 model, Vec *dst); +s32 BoardModelMotionTimeSet(s16 model, float time); +s32 BoardDAngleCalcRange(float *value, float min, float range); +u32 BoardRandMod(u32 value); +void BoardModelMotionStartEndSet(s16, s32, s32); +void Hu3DModelObjPosGet(s16 arg0, char *arg1, Vec *arg2); +s32 BoardModelPosGet(s16 model, Vec *dst); +s16 Hu3DMotionShiftIDGet(s16 arg0); +f32 BoardPlayerMotionTimeGet(s32); +s32 frand(void); + +void fn_1_BE30(s32 arg0, ParticleData* arg1); +void fn_1_BDAC(void); +void fn_1_BC7C(s16 arg0); +void fn_1_BBF8(void); +s32 fn_1_BBC4(void); +void fn_1_BB74(s8* arg0); +s32 fn_1_BB48(void); +void fn_1_B8E8(s32 arg0); +void fn_1_B748(omObjData* arg0, someBits2* arg1); +void fn_1_B688(omObjData* arg0, someBits2* arg1); +void fn_1_B4AC(omObjData* arg0, someBits2* arg1); +void fn_1_B350(omObjData* arg0); +void fn_1_B0A4(s32 arg0); +u32 fn_1_AF24(s32 arg0); +s32 fn_1_AE4C(s32 arg0, s8* arg1); +s32 fn_1_AE20(void); +void fn_1_ACD8(s32 arg0); +void fn_1_ABD0(omObjData* arg0, someBits* arg1); +void fn_1_AB18(omObjData* arg0, someBits* arg1); +void fn_1_A8AC(s32 arg0); +void fn_1_A7A0(s32 arg0); +void fn_1_A994(omObjData* arg0); +void fn_1_A5E0(s32 arg0); +void fn_1_A6B0(void); +void fn_1_A44C(s32 arg0); +void fn_1_9C8C(void); +void fn_1_9B30(void); +s32 fn_1_9CF4(s32 arg0); +void fn_1_9F78(void); +void fn_1_9FE4(void); + +//DATA +s16 lbl_1_data_4D8 = -1; +s16 lbl_1_data_4DA = -1; +s16 lbl_1_data_4DC = -1; +s32 lbl_1_data_4E0 = -1; +s16 lbl_1_data_4E4 = -1; +s8 lbl_1_data_4E6[] = {1, 1, 3, 3, 2, 2, 2, 1, 2, 3, 0, 4, 5, 0}; + +char itemString[] = "item"; +char item1String[] = "item1"; +char item2String[] = "item2"; + +char* lbl_1_data_508[] = { + itemString, item1String, item2String +}; + +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), +}; + +//BSS +s8 lbl_1_bss_194[3]; +AnimData* lbl_1_bss_190; +s8 lbl_1_bss_18C; +omObjData* lbl_1_bss_188; +omObjData* lbl_1_bss_184; +Process* lbl_1_bss_180; + +void fn_1_9A7C(void) { + fn_1_BBF8(); +} + +void fn_1_9A9C(void) { + +} + +void fn_1_9AA0(void) { + BoardDiceDigit2DShowSet(0); + lbl_1_bss_180 = HuPrcChildCreate(fn_1_9C8C, 0x2003, 0x2000, 0, boardMainProc); + HuPrcDestructorSet2(lbl_1_bss_180, fn_1_9B30); + while (lbl_1_bss_180 != 0) { + HuPrcVSleep(); + } + BoardDiceDigit2DShowSet(1); +} + +void fn_1_9B30(void) { + fn_1_BDAC(); + if (lbl_1_bss_188) { + lbl_1_bss_188; + } + if (lbl_1_bss_184) { + OM_GET_WORK_PTR(lbl_1_bss_184, someBits2)->unk00_bit0 = 1; + } + if (lbl_1_data_4E0 != -1) { + HuAudFXStop(lbl_1_data_4E0); + lbl_1_data_4E0 = -1; + } + if (lbl_1_data_4DC != -1) { + BoardModelMotionKill(lbl_1_bss_C[11], lbl_1_data_4DC); + lbl_1_data_4DC = -1; + } + if (lbl_1_data_4DA != -1) { + BoardModelMotionKill(lbl_1_bss_C[11], lbl_1_data_4DA); + lbl_1_data_4DA = -1; + } + if (lbl_1_data_4D8 != -1) { + HuWinKill(lbl_1_data_4D8); + lbl_1_data_4D8 = -1; + } + lbl_1_bss_180 = 0U; +} + +void fn_1_9C8C(void) { + s32 temp_r31; + + temp_r31 = GWSystem.player_curr; + lbl_1_data_4E0 = -1; + if (fn_1_9CF4(temp_r31) != 0) { + fn_1_A44C(temp_r31); + fn_1_A5E0(temp_r31); + } + HuPrcEnd(); +} + +s32 fn_1_9CF4(s32 arg0) { + Vec sp38; + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + s16 spaceCur; + s16 temp_r29; + + if (BoardPlayerItemCount(arg0) == 3) { + BoardWinCreate(2, 0x16001E, 2); + BoardWinWait(); + BoardWinKill(); + return 0; + } + BoardWinCreateChoice(2, 0x16001A, 2, 0); + if (GWPlayer[arg0].com != 0) { + BoardComKeySetLeft(); + } + BoardWinWait(); + if (BoardWinChoiceGet() != 0) { + BoardWinCreate(2, 0x16001B, 2); + BoardWinWait(); + BoardWinKill(); + return 0; + } + BoardWinKill(); + sp14.x = 0.0f; + sp14.y = 200.0f; + sp14.z = 0.0f; + sp8.x = -10.0f; + sp8.y = 0.0f; + sp8.z = 0.0f; + BoardCameraMotionStartEx(lbl_1_bss_C[8], &sp8, &sp14, 1500.0f, -1.0f, 0x15); + spaceCur = GWPlayer[arg0].space_curr; + temp_r29 = BoardSpaceLinkFlagSearch(0, spaceCur, 0x02000000); + BoardPlayerPosGet(arg0, &sp2C); + BoardSpacePosGet(0, temp_r29, &sp38); + PSVECSubtract(&sp38, &sp2C, &sp20); + PSVECNormalize(&sp20, &sp20); + BoardPlayerRotYSet(arg0, (f32) (180.0 * (atan2(-sp20.x, -sp20.z) / 3.141592653589793))); + BoardPlayerPosLerpStart(arg0, &sp2C, &sp38, 0x14); + while (GWPlayer[arg0].moving != 0) { + HuPrcVSleep(); + } + BoardRotateDiceNumbers(arg0); + HuPrcSleep(0x3C); + fn_1_B0A4(arg0); + fn_1_9F78(); + fn_1_9FE4(); + fn_1_A8AC(arg0); + return 1; +} + +void fn_1_9F78(void) { + lbl_1_data_4DA = BoardModelMotionCreate(lbl_1_bss_C[11], 0x770023); + lbl_1_data_4DC = BoardModelMotionCreate(lbl_1_bss_C[11], 0x770024); +} + +void fn_1_9FE4(void) { + Vec sp30; + Vec sp24; + Vec sp18; + Vec spC; + f32 sp8; + f32 temp_f30; + f32 var_f31; + + BoardModelPosGet(lbl_1_bss_C[11], &sp24); + sp18.x = (-3179.800048828125 + (200.0 * sin(0.0))); + sp18.z = (-907.7000122070313 + 200.0 * cos(0.0)); + sp18.y = sp24.y; + PSVECSubtract(&sp18, &sp24, &spC); + temp_f30 = (atan2(spC.z, spC.x) / 3.141592653589793 * 180.0); + sp8 = BoardModelRotYGet(lbl_1_bss_C[11]); + BoardModelMotionShiftSet(lbl_1_bss_C[11], lbl_1_data_4DA, 0.0f, 10.0, 0x40000001); + while (BoardDAngleCalcRange(&sp8, temp_f30, 10.0) == 0) { + BoardModelRotYSet(lbl_1_bss_C[11], sp8); + HuPrcVSleep(); + } + BoardModelRotYSet(lbl_1_bss_C[11], temp_f30); + BoardModelMotionSpeedSet(lbl_1_bss_C[11], 2.0f); + spC.x /= 20.0f; + spC.z /= 20.0f; + spC.y = 0.0f; + sp30 = sp24; + var_f31 = 0.0f; + while (var_f31 < 20.0f) { + PSVECAdd(&sp30, &spC, &sp30); + BoardModelPosSetV(lbl_1_bss_C[11], &sp30); + HuPrcVSleep(); + var_f31 += 1.0f; + } + BoardAudSeqPause(0, 1, 0x3E8); + HuAudFXPlay(0x450); + HuAudFXPlay(0x362); + BoardCameraQuakeSet(3, 100.0f); + fn_1_B8E8(1); + BoardModelMotionShiftSet(lbl_1_bss_C[11], lbl_1_data_4DC, 0.0f, 10.0, 0x40000005); + PSVECSubtract(&sp24, &sp30, &spC); + spC.x /= 60.0f; + spC.z /= 60.0f; + spC.y = 0.0f; + var_f31 = 0.0f; + while (var_f31 < 60.0f) { + PSVECAdd(&sp30, &spC, &sp30); + BoardModelPosSetV(lbl_1_bss_C[11], &sp30); + HuPrcVSleep(); + var_f31 += 1.0f; + } + temp_f30 = 0.0f; + sp8 = BoardModelRotYGet(lbl_1_bss_C[11]); + BoardModelMotionShiftSet(lbl_1_bss_C[11], lbl_1_data_4DA, 0.0f, 10.0, 0x40000001); + while (BoardDAngleCalcRange(&sp8, temp_f30, 10.0) == 0) { + BoardModelRotYSet(lbl_1_bss_C[11], sp8); + HuPrcVSleep(); + } + BoardModelMotionShiftSet(lbl_1_bss_C[11], 1, 0.0f, 10.0, 0x40000001); +} + +void fn_1_A44C(s32 arg0) { + s16 temp_r30; + s32 temp_r29; + s32 temp_r28; + + BoardMusStart(1, 0x17, 0x7F, 0); + temp_r30 = MGSeqCreate(3, 0U); + while (MGSeqGetStat(temp_r30) != 0) { + HuPrcVSleep(); + } + fn_1_A7A0(arg0); + fn_1_A6B0(); + fn_1_ACD8(1); + while (fn_1_AE20() != 0) { + HuPrcVSleep(); + } + temp_r29 = fn_1_BBC4() + 0x80000; + BoardWinCreate(2, 0x16001C, 2); + BoardWinInsertMesSet(temp_r29, 0); + BoardWinWait(); + fn_1_B8E8(4); + while (fn_1_BB48() != 0) { + HuPrcVSleep(); + } + omVibrate(arg0, 0xC, 6, 6); + BoardPlayerItemAdd(arg0, fn_1_BBC4()); + fn_1_ACD8(3); + temp_r28 = HuAudSStreamPlay(2); + while (HuAudSStreamStatGet(temp_r28) != 0) { + HuPrcVSleep(); + } + BoardAudSeqPause(0, 0, 0x3E8); + while (lbl_1_bss_188) { + HuPrcVSleep(); + } + HuPrcSleep(0x1E); + BoardWinCreate(2, 0x16001D, 2); + BoardWinWait(); + BoardWinKill(); +} + +void fn_1_A5E0(s32 arg0) { + Vec sp14; + Vec sp8; + s16 spaceCur; + + spaceCur = GWPlayer[arg0].space_curr; + BoardPlayerPosGet(arg0, &sp14); + BoardSpacePosGet(0, spaceCur, &sp8); + BoardCameraTargetPlayerSet(arg0); + BoardCameraViewSet(1); + BoardPlayerPosLerpStart(arg0, &sp14, &sp8, 0x14); + while (GWPlayer[arg0].moving != 0) { + HuPrcVSleep(); + } + BoardModelRotYSet(lbl_1_bss_C[11], 0.0f); + BoardCameraMotionWait(); +} + +void fn_1_A6B0(void) { + f32 sp8[2]; + f32 val1, val2; + + HuWinMesMaxSizeGet(1, sp8, 0x16001F); + val1 = -10000.0f; + val2 = 392.0f; + lbl_1_data_4D8 = HuWinCreate(val1, val2, sp8[0], sp8[1], 0); + HuWinBGTPLvlSet(lbl_1_data_4D8, 0.0f); + HuWinMesSpeedSet(lbl_1_data_4D8, 0); + HuWinMesSet(lbl_1_data_4D8, 0x16001FU); +} + +void fn_1_A7A0(s32 arg0) { + someBits* temp_r31; + omObjData* temp_r3; + + temp_r3 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, (void*)fn_1_A994); + lbl_1_bss_188 = temp_r3; + temp_r31 = (someBits*)&temp_r3->work[0]; + temp_r31->unk00_bit0 = 0; + temp_r31->unk00_bit6 = 0; + temp_r31->unk00_bit4 = arg0; + temp_r31->unk00_bit1 = 0; + temp_r31->unk1 = 5U; + temp_r31->unk2 = 0x3C; + temp_r31->unk4 = MGSeqCreate(1, temp_r31->unk1, 0x120, 0x40); + fn_1_BB74(lbl_1_bss_194); + lbl_1_bss_18C = fn_1_AE4C(arg0, lbl_1_bss_194); +} + +void fn_1_A8AC(s32 arg0) { + Vec sp14; + Vec sp8; + f32 playerYRot; + + BoardModelPosGet(lbl_1_bss_C[9], &sp8); + BoardPlayerPosGet(arg0, &sp14); + sp8.y = sp14.y; + BoardPlayerPosLerpStart(arg0, &sp14, &sp8, 0x14); + while (GWPlayer[arg0].moving != 0) { + HuPrcVSleep(); + } + playerYRot = BoardPlayerRotYGet(arg0) + 180.0f; + BoardPlayerMotBlendSet(arg0, playerYRot, 0xF); + while (BoardPlayerMotBlendCheck(arg0) == 0) { + HuPrcVSleep(); + } +} + +void fn_1_A994(omObjData* arg0) { + s32 temp_r0; + someBits* temp_r31; + + temp_r31 = (someBits*)&lbl_1_bss_188->work[0]; + if ((temp_r31->unk00_bit0 != 0)|| (BoardIsKill() != 0)) { + if (temp_r31->unk4 != -1) { + MGSeqSetParam(temp_r31->unk4, 2, -1U); + temp_r31->unk4 = -1; + } + lbl_1_bss_188 = NULL; + + omDelObjEx(HuPrcCurrentGet(), arg0); + return; + } + if (temp_r31->unk00_bit6 == 0) { + if (temp_r31->unk2 != 0) { + temp_r31->unk2--; + } else { + if (temp_r31->unk1 != 0) { + temp_r31->unk1--; + } else { + fn_1_ACD8(2); + } + MGSeqSetParam(temp_r31->unk4, 1, temp_r31->unk1); + temp_r31->unk2 = 0x3CU; + } + } + switch (temp_r31->unk00_bit1) { + case 1: + fn_1_AB18(arg0, temp_r31); + return; + case 2: + fn_1_ABD0(arg0, temp_r31); + return; + case 3: + if (BoardPlayerMotionEndCheck(temp_r31->unk00_bit4) != 0) { + temp_r31->unk00_bit0 = 1; + } + case 0: + break; + } +} + +void fn_1_AB18(omObjData* arg0, someBits* arg1) { + u32 var_r31 = 0; + + if (GWPlayer[arg1->unk00_bit4].com != 0) { + var_r31 = fn_1_AF24(arg1->unk00_bit4); + } else { + var_r31 = HuPadBtnDown[GWPlayer[arg1->unk00_bit4].port]; + } + if (var_r31 == 0x100) { + fn_1_ACD8(2); + } +} + +//TODO properly use inlines +void fn_1_ABD0(omObjData* arg0, someBits* arg1) { + s16 boardModelID; + PlayerState* playerStateCopy; + s32 bit; + PlayerState* playerState; + s16 temp, temp2; + + bit = arg1->unk00_bit4; + playerState = &GWPlayer[bit]; + playerStateCopy = playerState; + temp = boardPlayerMdl[playerStateCopy->player_idx]; + temp2 = temp; + boardModelID = BoardModelIDGet(temp2); + + if (Hu3DMotionShiftIDGet(boardModelID) == -1) { + if (!(arg1->unk00_bit7)) { + if (BoardPlayerMotionTimeGet(arg1->unk00_bit4) >= 27.0f) { + arg1->unk00_bit7 = 1; + BoardAudSeqFadeOut(1, 0x64); + fn_1_B8E8(2); + return; + } + } + if (BoardPlayerMotionEndCheck(arg1->unk00_bit4)) { + fn_1_ACD8(0); + } + } +} + +void fn_1_ACD8(s32 arg0) { + someBits* temp_r31; + + temp_r31 = (someBits*)&lbl_1_bss_188->work[0]; + temp_r31->unk00_bit1 = arg0; + switch (arg0) { + case 0: + BoardRotateDiceNumbers(temp_r31->unk00_bit4); + return; + case 2: + temp_r31->unk00_bit6 = 1; + if (lbl_1_data_4D8 != -1) { + HuWinKill(lbl_1_data_4D8); + lbl_1_data_4D8 = -1; + } + if (temp_r31->unk4 != -1) { + MGSeqSetParam(temp_r31->unk4, 2, -1U); + temp_r31->unk4 = -1; + } + BoardPlayerMotionShiftSet(temp_r31->unk00_bit4, 0xB, 0.0f, 10.0f, 0); + return; + case 3: + BoardPlayerMotionShiftSet(temp_r31->unk00_bit4, 7, 0.0f, 10.0f, 0); + break; + } +} + +s32 fn_1_AE20(void) { + someBits* temp_r31 = (someBits*)&lbl_1_bss_188->work[0]; + return temp_r31->unk00_bit1; +} + +s32 fn_1_AE4C(s32 arg0, s8* arg1) { + s32 temp_r30; + s32 temp_r29; + s32 temp_r28; + s32 var_r31; + + temp_r29 = lbl_1_data_4E6[arg1[0]]; + temp_r28 = lbl_1_data_4E6[arg1[1]]; + temp_r30 = lbl_1_data_4E6[arg1[2]]; + if (temp_r29 > temp_r28) { + if (temp_r29 > temp_r30) { + var_r31 = 0; + } else if (temp_r30 > temp_r28) { + var_r31 = 2; + } else { + var_r31 = 1; + } + } else if (temp_r28 > temp_r30) { + var_r31 = 1; + } else if (temp_r30 > temp_r29) { + var_r31 = 2; + } else { + var_r31 = 0; + } + return var_r31; +} + +u32 fn_1_AF24(s32 arg0) { + s32 spC; + s32 sp8; + s16 temp_r31; + s16 var_r30; + s8 temp_r0_2; + + spC = 0; + switch (GWPlayer[arg0].diff) { + case 3: + var_r30 = 0; + break; + case 2: + var_r30 = 5; + break; + case 1: + var_r30 = 15; + break; + case 0: + var_r30 = 40; + break; + } + if ((var_r30 != 0) && (BoardRandMod(100) < var_r30)) { + return 0x100U; + } + + temp_r31 = BoardModelMotionTimeGet(lbl_1_bss_C[9]); + + switch (lbl_1_bss_18C) { + case 0: + if ((temp_r31 < 33) || (temp_r31 > 35)) { + break; + } + return 0x100U; + case 1: + if (((temp_r31 >= 40) && (temp_r31 <= 42)) || ((temp_r31 >= 20) && (temp_r31 <= 22))) { + return 0x100U; + } + break; + case 2: + if (temp_r31 >= 50) { + return 0x100U; + } + break; + } + return 0; +} + +void fn_1_B0A4(s32 arg0) { + Mtx sp18; + s32 spC[3]; + s32 j; + s32 i; + s32 var_r31_2; + s32 temp_r29; + someBits2* temp_r30; + omObjData* temp_r3; + + temp_r3 = omAddObjEx(boardObjMan, 0x101, 0U, 0U, -1, (void*)fn_1_B350); + lbl_1_bss_184 = (void*)temp_r3; + temp_r30 = (someBits2*)&temp_r3->work[0]; + + temp_r30->unk00_bit0 = 0; + temp_r30->unk00_bit1 = 0; + temp_r30->unk00_bit4 = arg0; + + for (i = 0; i < 3;) { + spC[i] = BoardRandMod(14); + if ((spC[i] != 10) && (spC[i] != 13)) { + for (j = 0; j < i; j++) { + if (spC[i] == spC[j]) { + spC[i] = -1; + } + } + if (spC[i] == -1) { + continue; + } + } else { + continue; + } + i++; + } + + fn_1_BBF8(); + + for (i = 0; i < 3; i++) { + temp_r29 = spC[i]; + temp_r30->unk3[i] = temp_r29; + temp_r30->unk_06[i] = BoardModelCreate(lbl_1_data_514[temp_r29], NULL, 0); + BoardModelHookSet(lbl_1_bss_C[9], lbl_1_data_508[i], temp_r30->unk_06[i]); + BoardModelMotionSpeedSet(temp_r30->unk_06[i], 0.0f); + if (temp_r29 == 0xB) { + BoardModelMotionStart(temp_r30->unk_06[i], 0, 0x40000001); + } + if (temp_r29 == 5) { + PSMTXTrans(sp18, 0.0f, -50.0f, 0.0f); + BoardModelMtxSet(temp_r30->unk_06[i], &sp18); + } + if ((temp_r29 == 6) || (temp_r29 == 7)) { + PSMTXTrans(sp18, 0.0f, 0.0f, 8.0f); + BoardModelMtxSet(temp_r30->unk_06[i], &sp18); + } + } +} + +void fn_1_B350(omObjData* arg0) { + s32 i; + someBits2* temp_r31; + + temp_r31 = (someBits2*)&arg0->work[0]; + if ((temp_r31->unk00_bit0 != 0) || (BoardIsKill() != 0)) { + BoardModelHookReset(lbl_1_bss_C[9]); + for (i = 0; i < 3; i++) { + BoardModelKill(temp_r31->unk_06[i]); + } + fn_1_BBF8(); + omDelObjEx(HuPrcCurrentGet(), arg0); + lbl_1_bss_184 = NULL; + return; + } + + switch (temp_r31->unk00_bit1) { + case 1: + if (!(BoardModelMotionTimeGet(lbl_1_bss_C[9]) < 20.0f)) { + BoardModelMotionStartEndSet(lbl_1_bss_C[9], 0x14, 0x3A); + fn_1_B8E8(0); + return; + } + case 0: + break; + case 2: + fn_1_B4AC(arg0, temp_r31); + return; + case 3: + fn_1_B688(arg0, temp_r31); + return; + case 4: + fn_1_B748(arg0, temp_r31); + break; + } +} + +void fn_1_B4AC(omObjData* arg0, someBits2* arg1) { + Point3d sp20; + Point3d sp14; + Point3d sp8; + f32 temp_f31; + s8 temp_r0; + s32 i; + + arg1->unk2 = -1; + + for (i = 0; i < 3; i++) { + Hu3DModelObjPosGet(BoardModelIDGet(lbl_1_bss_C[9]), lbl_1_data_508[i], &sp20); + BoardPlayerPosGet(arg1->unk00_bit4, &sp14); + sp14.y += 66.0f; + if (BoardVecMinDistCheck(&sp20, &sp14, 100.0f) != 0) { + sp8 = sp20; + arg1->unk2 = i; + break; + } + } + + HuAudFXPlay(0x30C); + BoardModelHookObjReset(lbl_1_bss_C[9], lbl_1_data_508[arg1->unk2]); + temp_f31 = BoardModelMotionTimeGet(lbl_1_bss_C[9]); + BoardModelMotionShiftSet(lbl_1_bss_C[9], 0, 15.0f, 10.0f, 0x40000004U); + BoardModelMotionSpeedSet(lbl_1_bss_C[9], 0.5f); + BoardModelMotionTimeSet(lbl_1_bss_C[9], temp_f31); + BoardModelPosSetV(arg1->unk_06[arg1->unk2], &sp8); + fn_1_B8E8(3); + fn_1_BC7C(arg1->unk_06[arg1->unk2]); +} + +void fn_1_B688(omObjData* arg0, someBits2* arg1) { + Point3d sp8; + + if (arg1->unk1-- != 0) { + BoardModelPosGet(arg1->unk_06[arg1->unk2], &sp8); + sp8.x = sp8.x + arg0->trans.x; + sp8.y += arg0->trans.y; + sp8.z = sp8.z + arg0->trans.z; + BoardModelPosSetV(arg1->unk_06[arg1->unk2], &sp8); + return; + } + + fn_1_B8E8(0); +} + +void fn_1_B748(omObjData* arg0, someBits2* arg1) { + Vec sp14; + Point3d sp8; + f32 temp_f0; + s16 temp_r29; + + temp_r29 = arg1->unk_06[arg1->unk2]; + + if (arg1->unk1 == 0) { + HuAudFXPlay(781); + } + + if (arg1->unk1 < 90) { + f32 temp; + temp_f0 = __OSu8tof32((u8*)&arg1->unk1); + BoardModelPosGet(temp_r29, &sp8); + sp8.y += arg0->trans.y; + BoardModelPosSetV(temp_r29, &sp8); + BoardModelRotYSet(temp_r29, 8.0f + BoardModelRotYGet(temp_r29)); + BoardModelScaleGet(temp_r29, &sp14); + sp14.x = sp14.y = sp14.z = cos(3.141592653589793 * temp_f0 / 180.0); + BoardModelScaleSetV(temp_r29, &sp14); + arg1->unk1 += 4; + return; + } + + if (lbl_1_data_4E0 != -1) { + HuAudFXStop(lbl_1_data_4E0); + lbl_1_data_4E0 = -1; + } + + fn_1_B8E8(0); +} + +void fn_1_B8E8(s32 arg0) { + Point3d sp14; + Point3d sp8; + f32 temp_f31; + someBits2* temp_r31; + f32 temp; + + temp_r31 = (someBits2*)&lbl_1_bss_184->work[0]; + temp_r31->unk00_bit1 = arg0; + switch (arg0) { + case 1: + temp_f31 = 0.31666666f; + BoardModelMotionStart(lbl_1_bss_C[9], 0, 0x40000001); + BoardModelMotionSpeedSet(lbl_1_bss_C[9], temp_f31); + BoardModelMotionTimeSet(lbl_1_bss_C[9], 8.0f); + return; + case 2: + temp_r31->unk00_bit6 = 1; + return; + case 3: + lbl_1_data_4E0 = HuAudFXPlay(0x35F); + BoardModelPosGet(temp_r31->unk_06[temp_r31->unk2], &sp8); + BoardPlayerPosGet(temp_r31->unk00_bit4, &sp14); + temp = 50.0f + sp8.y; + lbl_1_bss_184->trans.x = (sp14.x - sp8.x) / 10.0f; + lbl_1_bss_184->trans.z = (sp14.z - sp8.z) / 10.0f; + lbl_1_bss_184->trans.y = (temp - sp8.y) / 10.0f; + temp_r31->unk1 = 10; + return; + case 4: + BoardPlayerPosGet(temp_r31->unk00_bit4, &sp14); + sp14.y += 30.000002f; + BoardModelPosGet(temp_r31->unk_06[temp_r31->unk2], &sp8); + lbl_1_bss_184->trans.y = (sp14.y - sp8.y) / 22.0f; + temp_r31->unk1 = 0; + } +} + +s32 fn_1_BB48(void) { + someBits2* temp = (someBits2*)&lbl_1_bss_184->work[0]; + return temp->unk00_bit1; +} + +void fn_1_BB74(s8* arg0) { + someBits2* bits = OM_GET_WORK_PTR(lbl_1_bss_184, someBits2); + s32 i; + + for (i = 0; i < 3; i++) { + arg0[i] = bits->unk3[i]; + } +} + +s32 fn_1_BBC4(void) { + someBits2* bits = OM_GET_WORK_PTR(lbl_1_bss_184, someBits2); + return bits->unk3[bits->unk2]; +} + +void fn_1_BBF8(void) { + BoardModelMotionStart(lbl_1_bss_C[9], 0, 0); + BoardModelMotionSpeedSet(lbl_1_bss_C[9], 0.0f); + BoardModelMotionTimeSet(lbl_1_bss_C[9], 0.0f); + BoardModelAttrReset(lbl_1_bss_C[9], 0x40000004); +} + + +void fn_1_BC7C(s16 arg0) { + ParticleData* particle; + + lbl_1_bss_190 = HuSprAnimRead(HuDataSelHeapReadNum(0x120000, 0x10000000, 2)); + HuSprAnimLock(lbl_1_bss_190); + lbl_1_data_4E4 = Hu3DParticleCreate(lbl_1_bss_190, 100); + Hu3DParticleHookSet(lbl_1_data_4E4, fn_1_BE30); + Hu3DParticleColSet(lbl_1_data_4E4, 0xFF, 0xFF, 0); + Hu3DModelPosSet(lbl_1_data_4E4, 0.0f, 0.0f, 0.0f); + Hu3DParticleBlendModeSet(lbl_1_data_4E4, 1); + Hu3DModelLayerSet(lbl_1_data_4E4, 2); + particle = Hu3DData[lbl_1_data_4E4].unk_120; + particle->unk_02 = arg0; +} + +void fn_1_BDAC(void) { + if (lbl_1_data_4E4 != -1) { + Hu3DModelKill(lbl_1_data_4E4); + lbl_1_data_4E4 = -1; + } + if (lbl_1_bss_190) { + HuSprAnimKill(lbl_1_bss_190); + lbl_1_bss_190 = NULL; + } +} + +void fn_1_BE30(s32 arg0, ParticleData* arg1) { + Point3d sp8; + + f32 temp_f30; + f32 temp_f29; + f32 temp_f31; + HsfanimStruct01* var_r31; + s32 i, j; + + if (arg1->unk_34 == 0U) { + var_r31 = arg1->unk_48; + for (i = 0; i < arg1->unk_30; i++, var_r31++) { + var_r31->unk40.a = 0; + var_r31->unk2C = 0.0f; + } + arg1->unk_00 = 0; + } + + BoardModelScaleGet(arg1->unk_02, &sp8); + temp_f31 = sp8.x; + BoardModelPosGet(arg1->unk_02, &sp8); + + for (i = 0; i < 0x16; i++) { + var_r31 = arg1->unk_48; + for (j = 0; j < arg1->unk_30; j++, var_r31++) { + if (0.0f == var_r31->unk2C) { + break; + } + } + if (j != arg1->unk_30) { + temp_f30 = 360.0f * (0.003921569f * (frand() & 0xFF)); + temp_f29 = temp_f31 * (20.0f + (60.0f * (0.003921569f * (frand() & 0xFF)))); + var_r31->unk34.x = (sp8.x + (temp_f29 * sin((3.141592653589793 * temp_f30) / 180.0))); + var_r31->unk34.z = (sp8.z + (temp_f29 * cos((3.141592653589793 * temp_f30) / 180.0))); + var_r31->unk34.y = (sp8.y + (temp_f31 * (-30.0f + (40.0f * (0.003921569f * (frand() & 0xFF)))))); + var_r31->unk08.x = (0.5f + (3.0f * (0.003921569f * (frand() & 0xFF)))); + var_r31->unk08.y = (0.3f + (2.0f * (0.003921569f * (frand() & 0xFF)))); + var_r31->unk40.a = 180; + var_r31->unk2C = (15.0f * temp_f31); + } + } + var_r31 = arg1->unk_48; + + for (i = 0; i < arg1->unk_30; i++, var_r31++) { + if (0.0f != var_r31->unk2C) { + var_r31->unk34.y = (var_r31->unk34.y - var_r31->unk08.x); + var_r31->unk2C = (var_r31->unk2C - var_r31->unk08.y); + if (var_r31->unk2C <= 0.0f) { + var_r31->unk2C = 0.0f; + } + } + } +} \ No newline at end of file diff --git a/src/REL/w10Dll/host.c b/src/REL/w10Dll/host.c index 68edcfbb..4ef6f9b8 100644 --- a/src/REL/w10Dll/host.c +++ b/src/REL/w10Dll/host.c @@ -56,7 +56,7 @@ void fn_1_C20(void) { BoardModelPosSetV(lbl_1_bss_1E, &sp14); BoardCameraRotGet(&sp8); PSMTXRotRad(sp20, 'y', 0.2617994f); - BoardModelMtxSet(lbl_1_bss_1E, sp20); + BoardModelMtxSet(lbl_1_bss_1E, &sp20); BoardModelRotSet(lbl_1_bss_1E, sp8.x, 0.0f, 0.0f); BoardModelScaleSet(lbl_1_bss_1E, 0.2f, 0.2f, 0.2f); HuPrcVSleep();