From 83bb550e32eb6628894b9305e4f256d76f747536 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Sun, 31 Dec 2023 22:54:06 -0600 Subject: [PATCH 1/3] Fix player.c split --- config/GMPE01_00/splits.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/GMPE01_00/splits.txt b/config/GMPE01_00/splits.txt index 95074503..35297525 100644 --- a/config/GMPE01_00/splits.txt +++ b/config/GMPE01_00/splits.txt @@ -316,7 +316,7 @@ game/sreset.c: .sbss start:0x801D3EB8 end:0x801D3ED0 game/board/main.c: - .text start:0x8005B150 end:0x80061F44 + .text start:0x8005B150 end:0x80061FC4 .rodata start:0x8011DD60 end:0x8011DD90 .data start:0x80139798 end:0x80139898 .bss start:0x8019D7E0 end:0x8019D968 @@ -325,7 +325,7 @@ game/board/main.c: .sdata2 start:0x801D5148 end:0x801D51F8 game/board/player.c: - .text start:0x80061F44 end:0x8006D308 + .text start:0x80061FC4 end:0x8006D308 .rodata start:0x8011DD90 end:0x8011DE60 .data start:0x80139898 end:0x80139AA0 .bss start:0x8019D968 end:0x8019D998 From c390d3f16fb5d3dcad12a2424a67d9cfd3cd9e91 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Sun, 31 Dec 2023 22:58:12 -0600 Subject: [PATCH 2/3] Fix fast cast inlines --- include/dolphin/os/OSFastCast.h | 44 ++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/include/dolphin/os/OSFastCast.h b/include/dolphin/os/OSFastCast.h index 24000a4c..be1ef556 100644 --- a/include/dolphin/os/OSFastCast.h +++ b/include/dolphin/os/OSFastCast.h @@ -13,6 +13,7 @@ extern "C" { #define OS_FASTCAST_U8 2 #define OS_FASTCAST_U16 3 +#define OS_FASTCAST_S8 4 #define OS_FASTCAST_S16 5 // clang-format off static inline void OSInitFastCast(void) { @@ -75,11 +76,52 @@ static inline u8 __OSf32tou8(register f32 inF) static inline void OSf32tou8(f32 *f, u8 *out) { *out = __OSf32tou8(*f); } +static inline u16 __OSf32tou16(register f32 inF) +{ + u32 tmp; + register u32 *tmpPtr = &tmp; + register u16 out; + // clang-format off + asm { + psq_st inF, 0(tmpPtr), 0x1, OS_FASTCAST_U16 + lbz out, 0(tmpPtr) + } + // clang-format on + + return out; +} + +static inline void OSf32tou16(f32 *f, u16 *out) { *out = __OSf32tou16(*f); } + +static inline float __OSs16tof32(register const s16* arg) { + register float ret; + + asm { + psq_l ret, 0(arg), 1, OS_FASTCAST_S16 + } + + return ret; +} + +static inline void OSs16tof32(const s16* in, float* out) { *out = __OSs16tof32(in); } + +static inline float __OSu8tof32(register const u8* arg) { + register float ret; + + asm { + psq_l ret, 0(arg), 1, OS_FASTCAST_U8 + } + + return ret; +} + +static inline void OSu8tof32(const u8* in, float* out) { *out = __OSu8tof32(in); } + static inline float __OSu16tof32(register const u16* arg) { register float ret; asm { - psq_l ret, 0(arg), 1, 3 + psq_l ret, 0(arg), 1, OS_FASTCAST_U16 } return ret; From 3094d6a0e68ade2eb8c3bba4d15e1e3e25f62871 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Sun, 31 Dec 2023 23:31:44 -0600 Subject: [PATCH 3/3] Clean up basic_space.c --- config/GMPE01_00/symbols.txt | 24 +- include/game/board/basic_space.h | 31 +- src/game/board/basic_space.c | 591 ++++++++++++++++--------------- 3 files changed, 323 insertions(+), 323 deletions(-) diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 3232dbad..524a75ae 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -1486,15 +1486,15 @@ fn_8007F85C = .text:0x8007F85C; // type:function size:0x38 fn_8007F894 = .text:0x8007F894; // type:function size:0x2BC BoardEventLandBlue = .text:0x8007FB50; // type:function size:0x184 BoardEventLandRed = .text:0x8007FCD4; // type:function size:0x19C -fn_8007FE70 = .text:0x8007FE70; // type:function size:0x1E8 -fn_80080058 = .text:0x80080058; // type:function size:0x6C -fn_800800C4 = .text:0x800800C4; // type:function size:0x60 -fn_80080124 = .text:0x80080124; // type:function size:0x23C -fn_80080360 = .text:0x80080360; // type:function size:0x198 -fn_800804F8 = .text:0x800804F8; // type:function size:0x1B8 -fn_800806B0 = .text:0x800806B0; // type:function size:0x29C -fn_8008094C = .text:0x8008094C; // type:function size:0x1A8 -fn_80080AF4 = .text:0x80080AF4; // type:function size:0x260 +BoardCoinChgCreate = .text:0x8007FE70; // type:function size:0x1E8 +BoardCoinChgExist = .text:0x80080058; // type:function size:0x6C +BoardCoinChgHide = .text:0x800800C4; // type:function size:0x60 +CreateCoinChg = .text:0x80080124; // type:function size:0x23C scope:local +UpdateCoinChg = .text:0x80080360; // type:function size:0x198 scope:local +CoinChgAppear = .text:0x800804F8; // type:function size:0x1B8 scope:local +CoinChgSeparate = .text:0x800806B0; // type:function size:0x29C scope:local +CoinChgShow = .text:0x8008094C; // type:function size:0x1A8 scope:local +CoinChgDisappear = .text:0x80080AF4; // type:function size:0x260 scope:local fn_80080D54 = .text:0x80080D54; // type:function size:0xA4 fn_80080DF8 = .text:0x80080DF8; // type:function size:0x250 fn_80081048 = .text:0x80081048; // type:function size:0x5C @@ -5205,8 +5205,8 @@ lbl_8013A194 = .data:0x8013A194; // type:object size:0xC lbl_8013A1A0 = .data:0x8013A1A0; // type:object size:0xC data:4byte lbl_8013A1AC = .data:0x8013A1AC; // type:object size:0x20 lbl_8013A1CC = .data:0x8013A1CC; // type:object size:0x24 -lbl_8013A1F0 = .data:0x8013A1F0; // type:object size:0x10 -lbl_8013A200 = .data:0x8013A200; // type:object size:0x28 +coinChgObj = .data:0x8013A1F0; // type:object size:0x10 scope:local +coinDigitMdl = .data:0x8013A200; // type:object size:0x28 scope:local jumptable_8013A228 = .data:0x8013A228; // type:object size:0x1C scope:local lbl_8013A248 = .data:0x8013A248; // type:object size:0x58 lbl_8013A2A0 = .data:0x8013A2A0; // type:object size:0x10 @@ -7556,7 +7556,7 @@ lbl_801D56A0 = .sdata2:0x801D56A0; // type:object size:0x4 data:float lbl_801D56A4 = .sdata2:0x801D56A4; // type:object size:0x4 data:float lbl_801D56A8 = .sdata2:0x801D56A8; // type:object size:0x4 data:float lbl_801D56AC = .sdata2:0x801D56AC; // type:object size:0x4 data:float -lbl_801D56B0 = .sdata2:0x801D56B0; // type:object size:0x8 +coinSignMdl = .sdata2:0x801D56B0; // type:object size:0x8 scope:local lbl_801D56B8 = .sdata2:0x801D56B8; // type:object size:0x4 data:float lbl_801D56BC = .sdata2:0x801D56BC; // type:object size:0x4 data:float lbl_801D56C0 = .sdata2:0x801D56C0; // type:object size:0x4 data:float diff --git a/include/game/board/basic_space.h b/include/game/board/basic_space.h index 6b0f306c..d9bde4f7 100644 --- a/include/game/board/basic_space.h +++ b/include/game/board/basic_space.h @@ -6,34 +6,9 @@ extern Process *boardObjMan; -typedef struct bit_copy { - struct { - u8 hide : 1; - u8 field08_bit1 : 1; - u8 field08_bit2 : 1; - u8 field08_bit3 : 3; - u8 field08_bit6 : 1; - u8 field08_bit7 : 1; - }; - s8 unk_01; - s8 unk_02; - s8 unk_03; - u16 unk_04; - u16 unk_06; - s16 unk_08; - s16 unk_0A; - s16 unk_0C; - s16 unk_0E; -} bitcopy; void BoardEventLandBlue(s32); void BoardEventLandRed(s32); -s8 fn_8007FE70(Point3d*, s8); -s32 fn_80080058(s32); -void fn_800800C4(s32); -void fn_80080124(bitcopy*, Vec*); -void fn_80080360(omObjData*); -void fn_800804F8(omObjData*, bitcopy*); -void fn_800806B0(omObjData*, bitcopy*); -void fn_8008094C(omObjData*, bitcopy*); -void fn_80080AF4(omObjData*, bitcopy*); \ No newline at end of file +s8 BoardCoinChgCreate(Vec*, s8); +s32 BoardCoinChgExist(s32); +void BoardCoinChgHide(s32); \ No newline at end of file diff --git a/src/game/board/basic_space.c b/src/game/board/basic_space.c index bda049d8..30b45700 100644 --- a/src/game/board/basic_space.c +++ b/src/game/board/basic_space.c @@ -1,4 +1,33 @@ #include "game/board/basic_space.h" +#include "game/data.h" +#include "game/flag.h" + +#include "math.h" + +typedef struct bit_copy { + struct { + u8 hide : 1; + u8 minus : 1; + u8 update : 1; + u8 mode : 3; + }; + s8 index; + s8 tens; + s8 ones; + u16 time; + u16 angle; + s16 sign_model; + s16 tens_model; + s16 ones_model; + s16 coin_model; +} coinChg; + +static void CreateCoinChg(coinChg*, Vec*); +static void UpdateCoinChg(omObjData*); +static void CoinChgAppear(omObjData*, coinChg*); +static void CoinChgSeparate(omObjData*, coinChg*); +static void CoinChgShow(omObjData*, coinChg*); +static void CoinChgDisappear(omObjData*, coinChg*); void BoardTutorialHookExec(s16, s32); void BoardCameraViewSet(s32); @@ -12,400 +41,396 @@ void BoardRotateDiceNumbers(s32); void BoardCameraAnimBlendSet(s32, s16, s16); s32 BoardPlayerAnimBlendCheck(s32); -omObjData *lbl_8013A1F0[4] = { - (omObjData *)NULL, - (omObjData *)NULL, - (omObjData *)NULL, - (omObjData *)NULL +static omObjData *coinChgObj[4] = { + NULL, + NULL, + NULL, + NULL }; -s32 lbl_8013A200[10] = { - 0x7000C, 0x7000D, - 0x7000E, 0x7000F, - 0x70010, 0x70011, - 0x70012, 0x70013, - 0x70014, 0x70015 +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), }; -void BoardEventLandBlue(s32 arg0) { - Point3d sp8; - f32 temp_f1; - s32 var_r29; - s8 temp_r28; - s32 var_r30; +void BoardEventLandBlue(s32 player) { + Vec pos; + s32 i; + s8 coin_chg; + s32 coins; BoardCameraViewSet(2); - BoardPlayerAnimBlendSet(arg0, 0, 0xF); - while (BoardPlayerAnimBlendCheck(arg0) == 0) { + BoardPlayerAnimBlendSet(player, 0, 15); + while (BoardPlayerAnimBlendCheck(player) == 0) { HuPrcVSleep(); } - if (_CheckFlag(0x1000BU) != 0) { + if (_CheckFlag(FLAG_ID_MAKE(1, 11)) != 0) { BoardCameraMotionWait(); - BoardTutorialHookExec(0xA, 0); + BoardTutorialHookExec(10, 0); } - var_r30 = 3; + coins = 3; if (GWSystem.last5_effect == 1) { - var_r30 *= 2; + coins *= 2; } - BoardPlayerPosGet(arg0, &sp8); - sp8.y += 250.0f; - temp_r28 = fn_8007FE70(&sp8, var_r30); - HuAudFXPlay(0x347); + BoardPlayerPosGet(player, &pos); + pos.y += 250.0f; + coin_chg = BoardCoinChgCreate(&pos, coins); + HuAudFXPlay(839); BoardCameraMotionWait(); - BoardPlayerMotionShiftSet(arg0, 0xC, 0.0f, 4.0f, 0); + BoardPlayerMotionShiftSet(player, 12, 0.0f, 4.0f, 0); - for (var_r29 = 0; var_r29 < var_r30; var_r29++) { - BoardPlayerCoinsAdd(arg0, 1); + for (i = 0; i < coins; i++) { + BoardPlayerCoinsAdd(player, 1); HuAudFXPlay(7); HuPrcSleep(6); } - HuAudFXPlay(0xF); - while (fn_80080058(temp_r28) == 0) { + HuAudFXPlay(15); + while (BoardCoinChgExist(coin_chg) == 0) { HuPrcVSleep(); } - GWPlayer[arg0].color = 1; - BoardPlayerMotionEndWait(arg0); - BoardRotateDiceNumbers(arg0); + GWPlayer[player].color = 1; + BoardPlayerMotionEndWait(player); + BoardRotateDiceNumbers(player); } -void BoardEventLandRed(s32 arg0) { - Point3d sp8; - s32 var_r29; - s8 temp_r28; - s32 var_r30; - void* temp_r3; +void BoardEventLandRed(s32 player) { + Vec pos; + s32 i; + s8 coin_chg; + s32 coins; BoardCameraViewSet(2); - omVibrate(arg0, 0xC, 6, 6); - BoardPlayerAnimBlendSet(arg0, 0, 0xF); - while (BoardPlayerAnimBlendCheck(arg0) == 0) { + omVibrate(player, 12, 6, 6); + BoardPlayerAnimBlendSet(player, 0, 15); + while (BoardPlayerAnimBlendCheck(player) == 0) { HuPrcVSleep(); } - if (_CheckFlag(0x1000BU) != 0) { + if (_CheckFlag(FLAG_ID_MAKE(1, 11)) != 0) { BoardCameraMotionWait(); - BoardTutorialHookExec(0xB, 0); + BoardTutorialHookExec(11, 0); } - var_r30 = 3; + coins = 3; if (GWSystem.last5_effect == 1) { - var_r30 *= 2; + coins *= 2; } - BoardPlayerPosGet(arg0, &sp8); - sp8.y += 250.0f; - temp_r28 = fn_8007FE70(&sp8, -var_r30); - HuAudFXPlay(0x348); + BoardPlayerPosGet(player, &pos); + pos.y += 250.0f; + coin_chg = BoardCoinChgCreate(&pos, -coins); + HuAudFXPlay(840); BoardCameraMotionWait(); - BoardPlayerMotionShiftSet(arg0, 0xD, 0.0f, 4.0f, 0); - for (var_r29 = 0; var_r29 < var_r30; var_r29++) { - BoardPlayerCoinsAdd(arg0, -1); + BoardPlayerMotionShiftSet(player, 13, 0.0f, 4.0f, 0); + for (i = 0; i < coins; i++) { + BoardPlayerCoinsAdd(player, -1); HuAudFXPlay(14); HuPrcSleep(6); } - HuAudFXPlay(0xF); + HuAudFXPlay(15); - while (fn_80080058(temp_r28) == 0) { + while (BoardCoinChgExist(coin_chg) == 0) { HuPrcVSleep(); } - GWPlayer[arg0].color = 2; - BoardPlayerMotionEndWait(arg0); - BoardRotateDiceNumbers(arg0); + GWPlayer[player].color = 2; + BoardPlayerMotionEndWait(player); + BoardRotateDiceNumbers(player); } -s8 fn_8007FE70(Point3d* arg0, s8 arg1) { - omObjData* var_r30 = NULL; - bitcopy* temp_r31; - s8 var_r27; - s8 var_r29; +s8 BoardCoinChgCreate(Vec *pos, s8 value) { + omObjData *obj = NULL; + coinChg *coin_chg; + s8 i; - for (var_r29 = 0; var_r29 < 4; var_r29++) { - if (lbl_8013A1F0[var_r29] == 0) { + for (i = 0; i < 4; i++) { + if (coinChgObj[i] == 0) { break; } } - if (var_r29 == 4) { + if (i == 4) { return -1; } - var_r30 = omAddObjEx(boardObjMan, 0x10A, 0, 0, -1, &fn_80080360); - lbl_8013A1F0[var_r29] = var_r30; - temp_r31 = (bitcopy *) var_r30->work; - temp_r31->hide = 0; - temp_r31->field08_bit2 = 0; - if (arg1 < 0) { - var_r27 = 1; - } else { - var_r27 = 0; - } - temp_r31->field08_bit1 = var_r27; - temp_r31->field08_bit3 = 0; - temp_r31->unk_02 = __abs(arg1) / 10; - temp_r31->unk_03 = __abs(arg1) % 10; - temp_r31->unk_01 = (s8) (var_r29 + 1); - temp_r31->unk_04 = 0; - temp_r31->unk_06 = 0; - fn_80080124(temp_r31, arg0); - var_r30->trans.x = arg0->x; - var_r30->trans.y = arg0->y; - var_r30->trans.z = arg0->z; - var_r30->rot.x = 0.0f; - var_r30->rot.y = 0.01f; - temp_r31->field08_bit2 = 1; - return temp_r31->unk_01; + obj = omAddObjEx(boardObjMan, 266, 0, 0, -1, &UpdateCoinChg); + coinChgObj[i] = obj; + coin_chg = (coinChg *)obj->work; + coin_chg->hide = 0; + coin_chg->update = 0; + coin_chg->minus = (value < 0) ? 1 : 0; + coin_chg->mode = 0; + coin_chg->tens = abs(value) / 10; + coin_chg->ones = abs(value) % 10; + coin_chg->index = (s8) (i + 1); + coin_chg->time = 0; + coin_chg->angle = 0; + CreateCoinChg(coin_chg, pos); + obj->trans.x = pos->x; + obj->trans.y = pos->y; + obj->trans.z = pos->z; + obj->rot.x = 0.0f; + obj->rot.y = 0.01f; + coin_chg->update = 1; + return coin_chg->index; } -s32 fn_80080058(s32 arg0) { - int *sp8; +s32 BoardCoinChgExist(s32 index) { + coinChg *coin_chg; - if ((arg0 <= 0) || (arg0 > 4)) { - return arg0; + if ((index <= 0) || (index > 4)) { + return index; } - if (lbl_8013A1F0[arg0 - 1] != 0) { - sp8 = lbl_8013A1F0[arg0 - 1]->work; + if (coinChgObj[index - 1] != 0) { + coin_chg = (coinChg *)coinChgObj[index - 1]->work; return 0; } return 1; } -void fn_800800C4(s32 arg0) { - bitcopy* temp_r4; +void BoardCoinChgHide(s32 index) { - if ((arg0 <= 0) || (arg0 > 4)) { + if ((index <= 0) || (index > 4)) { return; } - if (lbl_8013A1F0[arg0 - 1] != 0) { - ((bitcopy*) lbl_8013A1F0[arg0 - 1]->work)->hide = 1; + if (coinChgObj[index - 1] != 0) { + ((coinChg *)coinChgObj[index - 1]->work)->hide = 1; } } -const s32 lbl_801D56B0[2] = {0x70016, 0x70017}; +static const s32 coinSignMdl[2] = { + MAKE_DATA_NUM(DATADIR_BOARD, 22), + MAKE_DATA_NUM(DATADIR_BOARD, 23) +}; -void fn_80080124(bitcopy* arg0, Vec* arg1) { - f32 var_f31; +static void CreateCoinChg(coinChg *coin_chg, Vec *pos) { + f32 time; - if (arg0->field08_bit1 != 0) { - var_f31 = 2.5f; + if (coin_chg->minus != 0) { + time = 2.5f; } else { - var_f31 = 1.5f; + time = 1.5f; } - arg0->unk_08 = BoardModelCreate(lbl_801D56B0[arg0->field08_bit1], NULL, 0); - arg0->unk_0A = BoardModelCreate(lbl_8013A200[arg0->unk_02], NULL, 0); - arg0->unk_0C = BoardModelCreate(lbl_8013A200[arg0->unk_03], NULL, 0); - arg0->unk_0E = BoardModelCreate(0x7000A, NULL, 0); - BoardModelPosSetV(arg0->unk_08, arg1); - BoardModelPosSetV(arg0->unk_0A, arg1); - BoardModelPosSetV(arg0->unk_0C, arg1); - BoardModelPosSetV(arg0->unk_0E, arg1); - BoardModelMotionStart(arg0->unk_08, 0, 0); - BoardModelMotionStart(arg0->unk_0A, 0, 0); - BoardModelMotionStart(arg0->unk_0C, 0, 0); - BoardModelMotionTimeSet(arg0->unk_08, var_f31); - BoardModelMotionTimeSet(arg0->unk_0A, var_f31); - BoardModelMotionTimeSet(arg0->unk_0C, var_f31); - BoardModelMotionSpeedSet(arg0->unk_08, 0.0f); - BoardModelMotionSpeedSet(arg0->unk_0A, 0.0f); - BoardModelMotionSpeedSet(arg0->unk_0C, 0.0f); - BoardModelScaleSet(arg0->unk_08, 0.001, 0.001, 0.001); - BoardModelScaleSet(arg0->unk_0A, 0.001, 0.001, 0.001); - BoardModelScaleSet(arg0->unk_0C, 0.001, 0.001, 0.001); - BoardModelScaleSet(arg0->unk_0E, 0.001, 0.001, 0.001); - BoardModelLayerSet(arg0->unk_08, 1); - BoardModelLayerSet(arg0->unk_0A, 1); - BoardModelLayerSet(arg0->unk_0C, 1); - BoardModelLayerSet(arg0->unk_0E, 1); - if (arg0->unk_02 == 0) { - BoardModelVisibilitySet(arg0->unk_0A, 0); + 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); + BoardModelPosSetV(coin_chg->sign_model, pos); + BoardModelPosSetV(coin_chg->tens_model, pos); + BoardModelPosSetV(coin_chg->ones_model, pos); + BoardModelPosSetV(coin_chg->coin_model, pos); + BoardModelMotionStart(coin_chg->sign_model, 0, 0); + BoardModelMotionStart(coin_chg->tens_model, 0, 0); + BoardModelMotionStart(coin_chg->ones_model, 0, 0); + BoardModelMotionTimeSet(coin_chg->sign_model, time); + BoardModelMotionTimeSet(coin_chg->tens_model, time); + BoardModelMotionTimeSet(coin_chg->ones_model, time); + BoardModelMotionSpeedSet(coin_chg->sign_model, 0.0f); + BoardModelMotionSpeedSet(coin_chg->tens_model, 0.0f); + BoardModelMotionSpeedSet(coin_chg->ones_model, 0.0f); + BoardModelScaleSet(coin_chg->sign_model, 0.001, 0.001, 0.001); + BoardModelScaleSet(coin_chg->tens_model, 0.001, 0.001, 0.001); + BoardModelScaleSet(coin_chg->ones_model, 0.001, 0.001, 0.001); + BoardModelScaleSet(coin_chg->coin_model, 0.001, 0.001, 0.001); + BoardModelLayerSet(coin_chg->sign_model, 1); + BoardModelLayerSet(coin_chg->tens_model, 1); + BoardModelLayerSet(coin_chg->ones_model, 1); + BoardModelLayerSet(coin_chg->coin_model, 1); + if (coin_chg->tens == 0) { + BoardModelVisibilitySet(coin_chg->tens_model, 0); } } -void fn_80080360(omObjData* arg0) { - s32 temp_r0; - bitcopy* temp_r31; +static void UpdateCoinChg(omObjData *object) { + coinChg *coin_chg; - temp_r31 = (bitcopy*) arg0->work; - if ((temp_r31->hide != 0) || (BoardIsKill() != 0)) { - if (temp_r31->unk_0E != -1) { - BoardModelKill(temp_r31->unk_0E); - temp_r31->unk_0E = -1; + coin_chg = (coinChg *)object->work; + if ((coin_chg->hide != 0) || (BoardIsKill() != 0)) { + if (coin_chg->coin_model != -1) { + BoardModelKill(coin_chg->coin_model); + coin_chg->coin_model = -1; } - if (temp_r31->unk_08 != -1) { - BoardModelKill(temp_r31->unk_08); - temp_r31->unk_08 = -1; + if (coin_chg->sign_model != -1) { + BoardModelKill(coin_chg->sign_model); + coin_chg->sign_model = -1; } - if (temp_r31->unk_0A != -1) { - BoardModelKill(temp_r31->unk_0A); - temp_r31->unk_0A = -1; + if (coin_chg->tens_model != -1) { + BoardModelKill(coin_chg->tens_model); + coin_chg->tens_model = -1; } - if (temp_r31->unk_0C != -1) { - BoardModelKill(temp_r31->unk_0C); - temp_r31->unk_0C = -1; + if (coin_chg->ones_model != -1) { + BoardModelKill(coin_chg->ones_model); + coin_chg->ones_model = -1; } - lbl_8013A1F0[temp_r31->unk_01 - 1] = 0; - omDelObjEx(HuPrcCurrentGet(), arg0); + coinChgObj[coin_chg->index - 1] = 0; + omDelObjEx(HuPrcCurrentGet(), object); return; } - if (temp_r31->field08_bit2 != 0) { - if (temp_r31->unk_04 != 0) { - temp_r31->unk_04 -= 1; + if (coin_chg->update != 0) { + if (coin_chg->time != 0) { + coin_chg->time -= 1; return; } - switch (temp_r31->field08_bit3) { - case 0: - fn_800804F8(arg0, temp_r31); - return; - case 1: - fn_800806B0(arg0, temp_r31); - return; - case 3: - fn_8008094C(arg0, temp_r31); - return; - case 4: - fn_80080AF4(arg0, temp_r31); - break; + switch (coin_chg->mode) { + case 0: + CoinChgAppear(object, coin_chg); + return; + case 1: + CoinChgSeparate(object, coin_chg); + return; + case 3: + CoinChgShow(object, coin_chg); + return; + case 4: + CoinChgDisappear(object, coin_chg); + break; } } } -void fn_800804F8(omObjData* arg0, bitcopy* arg1) { - f32 temp_f31; - f32 temp_f30; - f32 temp_f29; - f32 temp_f28; +static void CoinChgAppear(omObjData *object, coinChg *coin_chg) { + f32 scale; + f32 angle; - OSu16tof32(&arg1->unk_06, &temp_f29); - temp_f29 = sin(M_PI * temp_f29 / 180.0); - temp_f30 = temp_f29; - arg0->rot.x = 405.0f * temp_f29; - BoardModelScaleSet(arg1->unk_0E, temp_f30, temp_f30, temp_f30); - BoardModelPosSet(arg1->unk_0E, arg0->trans.x, arg0->trans.y, arg0->trans.z); - BoardModelRotYSet(arg1->unk_0E, arg0->rot.x); - if (arg1->unk_06 < 0x5A) { - arg1->unk_06 += 6; + OSu16tof32(&coin_chg->angle, &angle); + angle = sin(M_PI * angle / 180.0); + scale = angle; + object->rot.x = 405.0f * angle; + BoardModelScaleSet(coin_chg->coin_model, scale, scale, scale); + BoardModelPosSet(coin_chg->coin_model, object->trans.x, object->trans.y, object->trans.z); + BoardModelRotYSet(coin_chg->coin_model, object->rot.x); + if (coin_chg->angle < 90) { + coin_chg->angle += 6; return; } - arg1->field08_bit3 = 1; - arg1->unk_06 = 0; - BoardModelScaleSet(arg1->unk_08, temp_f30, temp_f30, temp_f30); - BoardModelPosSet(arg1->unk_08, arg0->trans.x, arg0->trans.y, arg0->trans.z); - BoardModelRotYSet(arg1->unk_08, arg0->rot.x); - BoardModelScaleSet(arg1->unk_0C, temp_f30, temp_f30, temp_f30); - BoardModelPosSet(arg1->unk_0C, arg0->trans.x, arg0->trans.y, arg0->trans.z); - BoardModelRotYSet(arg1->unk_0C, arg0->rot.x); - BoardModelScaleSet(arg1->unk_0A, temp_f30, temp_f30, temp_f30); - BoardModelPosSet(arg1->unk_0A, arg0->trans.x, arg0->trans.y, arg0->trans.z); - BoardModelRotYSet(arg1->unk_0A, arg0->rot.x); + coin_chg->mode = 1; + coin_chg->angle = 0; + BoardModelScaleSet(coin_chg->sign_model, scale, scale, scale); + BoardModelPosSet(coin_chg->sign_model, object->trans.x, object->trans.y, object->trans.z); + BoardModelRotYSet(coin_chg->sign_model, object->rot.x); + BoardModelScaleSet(coin_chg->ones_model, scale, scale, scale); + BoardModelPosSet(coin_chg->ones_model, object->trans.x, object->trans.y, object->trans.z); + BoardModelRotYSet(coin_chg->ones_model, object->rot.x); + BoardModelScaleSet(coin_chg->tens_model, scale, scale, scale); + BoardModelPosSet(coin_chg->tens_model, object->trans.x, object->trans.y, object->trans.z); + BoardModelRotYSet(coin_chg->tens_model, object->rot.x); } -void fn_800806B0(omObjData* arg0, bitcopy* arg1) { - f32 temp_f28; - f32 temp_f30; - f32 var_f29; - f32 var_f27; - f32 var_f26; - f32 var_f25; - f32 var_f24; +static void CoinChgSeparate(omObjData *object, coinChg *coin_chg) { + f32 y_offset; + f32 x_scale; + f32 spacing; + f32 coin_x; + f32 ones_x; + f32 tens_x; + f32 sign_x; - OSu16tof32(&arg1->unk_06, &temp_f30); + OSu16tof32(&coin_chg->angle, &x_scale); - if (arg1->unk_02 != 0) { - var_f29 = 140.0f; + if (coin_chg->tens != 0) { + spacing = 140.0f; } else { - var_f29 = 105.0f; + spacing = 105.0f; } - temp_f28 = (200.0 * sin((M_PI * (2.0f * temp_f30)) / 180.0)); - temp_f30 = sin((M_PI * temp_f30) / 180.0); - arg0->rot.x = 45.0f + (315.0f * temp_f30); - if (arg1->unk_02 != 0) { - var_f27 = arg0->trans.x + (temp_f30 * -var_f29); - var_f24 = arg0->trans.x + ((temp_f30 * -var_f29) / 3.0f); - var_f26 = arg0->trans.x + (temp_f30 * var_f29); - var_f25 = arg0->trans.x + ((temp_f30 * var_f29) / 3.0f); + y_offset = (200.0 * sin((M_PI * (2.0f * x_scale)) / 180.0)); + x_scale = sin((M_PI * x_scale) / 180.0); + object->rot.x = 45.0f + (315.0f * x_scale); + if (coin_chg->tens != 0) { + coin_x = object->trans.x + (x_scale * -spacing); + sign_x = object->trans.x + ((x_scale * -spacing) / 3.0f); + ones_x = object->trans.x + (x_scale * spacing); + tens_x = object->trans.x + ((x_scale * spacing) / 3.0f); } else { - var_f24 = arg0->trans.x; - var_f25 = arg0->trans.x; - var_f26 = arg0->trans.x + (temp_f30 * var_f29); - var_f27 = arg0->trans.x + (temp_f30 * -var_f29); + sign_x = object->trans.x; + tens_x = object->trans.x; + ones_x = object->trans.x + (x_scale * spacing); + coin_x = object->trans.x + (x_scale * -spacing); } - BoardModelPosSet(arg1->unk_0E, var_f27, arg0->trans.y + temp_f28, arg0->trans.z); - BoardModelPosSet(arg1->unk_08, var_f24, arg0->trans.y + temp_f28, arg0->trans.z); - BoardModelPosSet(arg1->unk_0C, var_f26, arg0->trans.y + temp_f28, arg0->trans.z); - BoardModelPosSet(arg1->unk_0A, var_f25, arg0->trans.y + temp_f28, arg0->trans.z); - BoardModelRotYSet(arg1->unk_0E, arg0->rot.x); - BoardModelRotYSet(arg1->unk_08, arg0->rot.x); - BoardModelRotYSet(arg1->unk_0C, arg0->rot.x); - BoardModelRotYSet(arg1->unk_0A, arg0->rot.x); - if (arg1->unk_06 < 0x5A) { - arg1->unk_06 += 6; + BoardModelPosSet(coin_chg->coin_model, coin_x, object->trans.y + y_offset, object->trans.z); + BoardModelPosSet(coin_chg->sign_model, sign_x, object->trans.y + y_offset, object->trans.z); + BoardModelPosSet(coin_chg->ones_model, ones_x, object->trans.y + y_offset, object->trans.z); + BoardModelPosSet(coin_chg->tens_model, tens_x, object->trans.y + y_offset, object->trans.z); + BoardModelRotYSet(coin_chg->coin_model, object->rot.x); + BoardModelRotYSet(coin_chg->sign_model, object->rot.x); + BoardModelRotYSet(coin_chg->ones_model, object->rot.x); + BoardModelRotYSet(coin_chg->tens_model, object->rot.x); + if (coin_chg->angle < 90) { + coin_chg->angle += 6; return; } - arg0->trans.y += temp_f28; - arg1->field08_bit3 = 3; - arg1->unk_06 = 0; + object->trans.y += y_offset; + coin_chg->mode = 3; + coin_chg->angle = 0; } -void fn_8008094C(omObjData* arg0, bitcopy* arg1) { +static void CoinChgShow(omObjData* object, coinChg* coin_chg) { Vec sp8; - f32 temp_f29; - f32 var_f30; + f32 angle; + f32 y_pos; - OSu16tof32(&arg1->unk_06, &temp_f29); - temp_f29 = (f32) sin((M_PI * temp_f29) / 180.0); - if (arg1->field08_bit1 != 0) { - var_f30 = (-50.0f * temp_f29) + arg0->trans.y; + OSu16tof32(&coin_chg->angle, &angle); + angle = (f32) sin((M_PI * angle) / 180.0); + if (coin_chg->minus != 0) { + y_pos = (-50.0f * angle) + object->trans.y; } else { - var_f30 = (50.0f * temp_f29) + arg0->trans.y; + y_pos = (50.0f * angle) + object->trans.y; } - BoardModelPosGet(arg1->unk_0E, &sp8); - BoardModelPosSet(arg1->unk_0E, sp8.x, var_f30, sp8.z); - BoardModelPosGet(arg1->unk_08, &sp8); - BoardModelPosSet(arg1->unk_08, sp8.x, var_f30, sp8.z); - BoardModelPosGet(arg1->unk_0C, &sp8); - BoardModelPosSet(arg1->unk_0C, sp8.x, var_f30, sp8.z); - BoardModelPosGet(arg1->unk_0A, &sp8); - BoardModelPosSet(arg1->unk_0A, sp8.x, var_f30, sp8.z); - if (arg1->unk_06 < 0x5A) { - arg1->unk_06 += 6; + BoardModelPosGet(coin_chg->coin_model, &sp8); + BoardModelPosSet(coin_chg->coin_model, sp8.x, y_pos, sp8.z); + BoardModelPosGet(coin_chg->sign_model, &sp8); + BoardModelPosSet(coin_chg->sign_model, sp8.x, y_pos, sp8.z); + BoardModelPosGet(coin_chg->ones_model, &sp8); + BoardModelPosSet(coin_chg->ones_model, sp8.x, y_pos, sp8.z); + BoardModelPosGet(coin_chg->tens_model, &sp8); + BoardModelPosSet(coin_chg->tens_model, sp8.x, y_pos, sp8.z); + if (coin_chg->angle < 90) { + coin_chg->angle += 6; return; } - arg1->field08_bit3 = 4; - arg1->unk_06 = 0; - arg1->unk_04 = 0x12; - arg0->scale.x = 1.0f; - arg0->scale.y = 1.0f; + coin_chg->mode = 4; + coin_chg->angle = 0; + coin_chg->time = 18; + object->scale.x = 1.0f; + object->scale.y = 1.0f; } -void fn_80080AF4(omObjData* arg0, bitcopy* arg1) { - const u16 sp8 = ((arg1->unk_06 * 2) % 180); - f32 temp_f31; +static void CoinChgDisappear(omObjData* object, coinChg* coin_chg) { + const u16 angle = ((coin_chg->angle * 2) % 180); + f32 rot; - OSu16tof32(&sp8, &temp_f31); - if (sp8 <= 90.0f) { - arg0->scale.x = 0.5 * cos((M_PI * temp_f31) / 180.0); - arg0->scale.y = 2.5 * sin((M_PI * temp_f31) / 180.0); + OSu16tof32(&angle, &rot); + if (angle <= 90.0f) { + object->scale.x = 0.5 * cos((M_PI * rot) / 180.0); + object->scale.y = 2.5 * sin((M_PI * rot) / 180.0); } else { - arg0->scale.x = 2.5 * sin((M_PI * temp_f31) / 180.0); - arg0->scale.y = 0.5 * cos((M_PI * temp_f31) / 180.0); + object->scale.x = 2.5 * sin((M_PI * rot) / 180.0); + object->scale.y = 0.5 * cos((M_PI * rot) / 180.0); } - if (0.0f == arg0->scale.x) { - arg0->scale.x = 0.0001f; + if (0.0f == object->scale.x) { + object->scale.x = 0.0001f; } - if (0.0f == arg0->scale.y) { - arg0->scale.y = 0.0001f; + if (0.0f == object->scale.y) { + object->scale.y = 0.0001f; } - BoardModelScaleSet(arg1->unk_0E, arg0->scale.x, arg0->scale.y, 1.0f); - BoardModelScaleSet(arg1->unk_08, arg0->scale.x, arg0->scale.y, 1.0f); - BoardModelScaleSet(arg1->unk_0C, arg0->scale.x, arg0->scale.y, 1.0f); - BoardModelScaleSet(arg1->unk_0A, arg0->scale.x, arg0->scale.y, 1.0f); - if (arg1->unk_06 < 0x5A) { - arg1->unk_06 += 3; - if (arg1->unk_06 > 0x5A) { - arg1->unk_06 = 0x5A; + BoardModelScaleSet(coin_chg->coin_model, object->scale.x, object->scale.y, 1.0f); + BoardModelScaleSet(coin_chg->sign_model, object->scale.x, object->scale.y, 1.0f); + BoardModelScaleSet(coin_chg->ones_model, object->scale.x, object->scale.y, 1.0f); + BoardModelScaleSet(coin_chg->tens_model, object->scale.x, object->scale.y, 1.0f); + if (coin_chg->angle < 90) { + coin_chg->angle += 3; + if (coin_chg->angle > 90) { + coin_chg->angle = 90; } } else { - BoardModelVisibilitySet(arg1->unk_08, 0); - BoardModelVisibilitySet(arg1->unk_0A, 0); - BoardModelVisibilitySet(arg1->unk_0C, 0); - BoardModelVisibilitySet(arg1->unk_0E, 0); - arg1->hide = 1; + BoardModelVisibilitySet(coin_chg->sign_model, 0); + BoardModelVisibilitySet(coin_chg->tens_model, 0); + BoardModelVisibilitySet(coin_chg->ones_model, 0); + BoardModelVisibilitySet(coin_chg->coin_model, 0); + coin_chg->hide = 1; } }