From 1a019c7c112f168d818bbc9ab5c3e06e5d04c2fe Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Tue, 12 Mar 2024 13:26:35 -0500 Subject: [PATCH] Finish more of board/bowser.c Particle struct changes are also present --- config/GMPE01_00/symbols.txt | 2 +- include/game/board/ui.h | 2 +- include/game/hsfanim.h | 7 +- src/REL/w03Dll/mg_item.c | 26 +- src/game/board/bowser.c | 922 ++++++++++++++++++++++++++++++++++- src/game/board/item.c | 50 +- src/game/board/mg_setup.c | 2 +- src/game/board/player.c | 6 +- src/game/board/ui.c | 6 +- src/game/chrman.c | 18 +- src/game/hsfanim.c | 20 +- 11 files changed, 990 insertions(+), 71 deletions(-) diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 0e457f48..279a6c19 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -5608,7 +5608,7 @@ booCamPos = .bss:0x801A4BC0; // type:object size:0xC scope:local data:float booCamTarget = .bss:0x801A4BCC; // type:object size:0xC scope:local data:float booCamUp = .bss:0x801A4BD8; // type:object size:0xC scope:local data:float playerPosTemp = .bss:0x801A4BE8; // type:object size:0x30 scope:local -bowserSpr = .bss:0x801A4C18; // type:object size:0x16 scope:local +bowserEvent = .bss:0x801A4C18; // type:object size:0x16 scope:local battleMGList = .bss:0x801A4C30; // type:object size:0x10 scope:local data:2byte camPosFortune = .bss:0x801A4C40; // type:object size:0xC scope:local data:4byte camTargetFortune = .bss:0x801A4C4C; // type:object size:0xC scope:local data:float diff --git a/include/game/board/ui.h b/include/game/board/ui.h index ccf6d01f..770f0c0e 100755 --- a/include/game/board/ui.h +++ b/include/game/board/ui.h @@ -14,7 +14,7 @@ void BoardStatusGraySet(s32 arg0, s32 arg1); void BoardStatusShowSet(s32 arg0, s32 arg1); void BoardStatusItemHideSet(s32 arg0, s32 arg1); void BoardStatusTargetPosSet(s32 arg0, Vec *arg1); -void BoardStatusPosGet(s32 arg0, float *arg1); +void BoardStatusPosGet(s32 arg0, Vec *arg1); void BoardStatusPosSet(s32 arg0, Vec *arg1); void BoardStatusHammerCreate(s32 arg0); void BoardStatusHammerShowSet(s32 arg0, s32 arg1); diff --git a/include/game/hsfanim.h b/include/game/hsfanim.h index 9070e984..6868b818 100644 --- a/include/game/hsfanim.h +++ b/include/game/hsfanim.h @@ -6,6 +6,9 @@ #include "game/sprite.h" typedef struct model_data ModelData; +typedef struct particle_data ParticleData; + +typedef void (*ParticleHook)(ModelData *model, ParticleData *particle, Mtx matrix); typedef struct { /* 0x00 */ union { @@ -49,7 +52,7 @@ typedef struct particle_data { /* 0x48 */ HsfanimStruct01 *unk_48; /* 0x4C */ Vec *unk_4C; /* 0x50 */ void *unk_50; - /* 0x54 */ void *unk_54; + /* 0x54 */ ParticleHook unk_54; } ParticleData; // Size 0x58 typedef struct { @@ -117,7 +120,7 @@ void Hu3DParticleZRotSet(s16 arg0, float arg1); void Hu3DParticleColSet(s16 arg0, u8 arg1, u8 arg2, u8 arg3); void Hu3DParticleTPLvlSet(s16 arg0, float arg1); void Hu3DParticleBlendModeSet(s16 arg0, u8 arg1); -void Hu3DParticleHookSet(s16 arg0, void *arg1); +void Hu3DParticleHookSet(s16 arg0, ParticleHook arg1); void Hu3DParticleAttrSet(s16 arg0, u8 arg1); void Hu3DParticleAttrReset(s16 arg0, u8 arg1); void Hu3DParticleAnimModeSet(s16 arg0, s16 arg1); diff --git a/src/REL/w03Dll/mg_item.c b/src/REL/w03Dll/mg_item.c index 6ef4f514..c9925419 100644 --- a/src/REL/w03Dll/mg_item.c +++ b/src/REL/w03Dll/mg_item.c @@ -74,7 +74,7 @@ void Hu3DModelObjPosGet(s16 arg0, char *arg1, Vec *arg2); s16 Hu3DMotionShiftIDGet(s16 arg0); s32 frand(void); -void fn_1_BE30(s32 arg0, ParticleData* arg1); +void fn_1_BE30(ModelData *model, ParticleData *particle, Mtx matrix); void fn_1_BDAC(void); void fn_1_BC7C(s16 arg0); void fn_1_BBF8(void); @@ -891,7 +891,7 @@ void fn_1_BDAC(void) { } } -void fn_1_BE30(s32 arg0, ParticleData* arg1) { +void fn_1_BE30(ModelData *model, ParticleData *particle, Mtx matrix) { Point3d sp8; f32 temp_f30; @@ -900,27 +900,27 @@ void fn_1_BE30(s32 arg0, ParticleData* arg1) { 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++) { + if (particle->unk_34 == 0U) { + var_r31 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r31++) { var_r31->unk40.a = 0; var_r31->unk2C = 0.0f; } - arg1->unk_00 = 0; + particle->unk_00 = 0; } - BoardModelScaleGet(arg1->unk_02, &sp8); + BoardModelScaleGet(particle->unk_02, &sp8); temp_f31 = sp8.x; - BoardModelPosGet(arg1->unk_02, &sp8); + BoardModelPosGet(particle->unk_02, &sp8); for (i = 0; i < 0x16; i++) { - var_r31 = arg1->unk_48; - for (j = 0; j < arg1->unk_30; j++, var_r31++) { + var_r31 = particle->unk_48; + for (j = 0; j < particle->unk_30; j++, var_r31++) { if (0.0f == var_r31->unk2C) { break; } } - if (j != arg1->unk_30) { + if (j != particle->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))); @@ -932,9 +932,9 @@ void fn_1_BE30(s32 arg0, ParticleData* arg1) { var_r31->unk2C = (15.0f * temp_f31); } } - var_r31 = arg1->unk_48; + var_r31 = particle->unk_48; - for (i = 0; i < arg1->unk_30; i++, var_r31++) { + for (i = 0; i < particle->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); diff --git a/src/game/board/bowser.c b/src/game/board/bowser.c index a0c2f285..70cb0d2f 100644 --- a/src/game/board/bowser.c +++ b/src/game/board/bowser.c @@ -3,6 +3,8 @@ #include "game/board/player.h" #include "game/board/audio.h" #include "game/board/window.h" +#include "game/board/ui.h" +#include "game/hsfdraw.h" #include "game/objsub.h" #include "game/sprite.h" @@ -10,7 +12,19 @@ #include "game/wipe.h" #include "game/gamework.h" -static s16 bowserSpr[11]; +#include "string.h" + +#define ABS(x) ((x) < 0 ? -(x) : (x)) + +typedef struct bowser_event_data { + s16 sprite[3]; + s16 delay[3]; + s16 angle[3]; + s16 group; + s16 model; +} BowserEventData; + +static BowserEventData bowserEvent; static Vec playerPosTemp[4]; static s32 scareFxTbl[] = { @@ -58,19 +72,24 @@ static void ExecBowserShuffle(void); static void ExecBowserRevo(void); static void ExecBowserSuit(void); -static void CreateBowserObj(void); +static s32 CheckSuitGive(void); +static void StartSuitGive(void); +static void SuitGiveMain(omObjData *object); +static void CreateBowserObj(void); +static void ExecBowserObj(omObjData *object); static void SetBowserState(s32 state); static s32 CheckBowserIdle(void); static void CreateBowserEvent(void); static s32 CheckBowserEvent(void); static void StopBowserEvent(void); - +static void ExecBowserEvent(omObjData *object); static void ConfigBowserEvent(void); static void CreateMiniBowser(void); static s32 CheckMiniBowser(void); +static void ExecMiniBowser(omObjData *object); static void CreatePlayerMot(void); @@ -108,14 +127,25 @@ s32 BoardBowserExec(s32 player, s32 space) typedef struct bowser_work { u8 kill : 1; + u8 state : 3; + u8 mot_active : 1; + u8 fall_done : 1; + u8 jump_done : 1; + u8 jump_state; + u8 idle_timer; } BowserWork; typedef struct mini_bowser_work { u8 kill : 1; + s16 group; + s16 sprite; + s16 angle; } MiniBowserWork; typedef struct bowser_event_work { u8 kill : 1; + s8 state; + s16 timer; } BowserEventWork; static void ExecBowser(void) @@ -483,4 +513,890 @@ static void DoMGReturnEffect(void) while(!BoardStatusStopCheck(player)) { HuPrcVSleep(); } +} + +static void ExecBowserShuffle(void) +{ + Vec pos; + Vec target; + s16 space_old[4]; + s16 space[4]; + s32 i; + s32 player; + s32 player_new; + s32 reset_cam; + BoardWinCreate(2, 0x30010, 5); + BoardWinWait(); + BoardWinKill(); + for(i=0; i<4; i++) { + space_old[i] = GWPlayer[i].space_curr; + } + player=0; + while(player<4) { + player_new = BoardRandMod(4); + if(player_new == player || space_old[player_new] == -1) { + continue; + } + space[player] = space_old[player_new]; + space_old[player_new] = -1; + player++; + } + HuAudFXPlay(857); + BoardModelMotionShiftSet(bowserMdl, 4, 0.0f, 10.0f, 0); + while(!BoardModelMotionEndCheck(bowserMdl)) { + HuPrcVSleep(); + } + SetBowserState(3); + HuPrcSleep(60); + WipeColorSet(255, 255, 255); + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, -1); + while(WipeStatGet()) { + HuPrcVSleep(); + } + reset_cam = 0; + for(i=0; i<4; i++) { + GWPlayer[i].space_curr = space[i]; + if(eventSpace == space[i]) { + BoardPlayerMotionStart(i, playerMot[i], 0); + BoardPlayerMotionTimeSet(i, 50.0f); + BoardPlayerMotionSpeedSet(i, 0.0f); + reset_cam = 1; + } else { + BoardPlayerIdleSet(i); + } + BoardPlayerMoveAwayStart(i, GWPlayer[i].space_curr, 1); + } + if(reset_cam) { + BoardCameraTargetGet(&target); + BoardCameraPosGet(&pos); + BoardCameraTargetModelSet(-1); + BoardCameraTargetSet(target.x, target.y, target.z); + BoardCameraPosSet(pos.x, pos.y, pos.z); + } + SetBowserState(4); + HuPrcSleep(60); + BoardModelMotionStart(bowserMdl, 1, 0x40000001); + WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, -1); + while(WipeStatGet()) { + HuPrcVSleep(); + } +} + +static void ExecBowserRevo(void) +{ + s32 i; + s32 coin; + BoardWinCreate(2, 0x30011, 5); + BoardWinWait(); + BoardWinKill(); + for(coin=i=0; i<4; i++) { + coin += BoardPlayerCoinsGet(i); + } + coin /= 4; + HuAudFXPlay(857); + BoardModelMotionShiftSet(bowserMdl, 4, 0.0f, 10.0f, 0); + while(!BoardModelMotionEndCheck(bowserMdl)) { + HuPrcVSleep(); + } + SetBowserState(3); + HuPrcSleep(60); + WipeColorSet(255, 255, 255); + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, -1); + while(WipeStatGet()) { + HuPrcVSleep(); + } + SetBowserState(4); + for(i=0; i<4; i++) { + BoardPlayerCoinsSet(i, coin); + } + HuPrcSleep(60); + BoardModelMotionStart(bowserMdl, 1, 0x40000001); + WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, -1); + while(WipeStatGet()) { + HuPrcVSleep(); + } +} + +static void ExecBowserSuit(void) +{ + BoardModelMotionShiftSet(bowserMdl, 1, 0.0f, 10.0f, 0); + BoardWinCreate(2, 0x30012, 5); + BoardWinWait(); + HuAudFXPlay(857); + BoardModelMotionShiftSet(bowserMdl, 4, 0.0f, 10.0f, 0); + HuPrcSleep(10); + StartSuitGive(); + while(!CheckSuitGive()) { + HuPrcVSleep(); + } + BoardWinKill(); + BoardModelAttrSet(bowserMdl, 0x40000004); + while(!BoardModelMotionEndCheck(bowserMdl)) { + HuPrcVSleep(); + } +} + +typedef struct suit_give_work { + u8 kill : 1; + u8 state; + u8 timer; + u8 idle_timer; + s16 model; +} SuitGiveWork; + +static s32 CheckSuitGive(void) +{ + if(!suitGiveObj) { + return 1; + } else { + return 0; + } +} + +static void StartSuitGive(void) +{ + omObjData *object; + SuitGiveWork *work; + Vec pos; + object = omAddObjEx(boardObjMan, 258, 0, 0, -1, SuitGiveMain); + suitGiveObj = object; + work = OM_GET_WORK_PTR(suitGiveObj, SuitGiveWork); + work->kill = 0; + work->state = 0; + work->idle_timer = 0; + work->timer = 30; + work->model = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 120), NULL, 0); + BoardModelLayerSet(work->model, 7); + BoardModelScaleSet(work->model, 0.16f, 0.16f, 0.16f); + object->trans.x = 288.0f; + object->trans.y = -64.0f; + pos.x = 288.0f; + pos.y = 240.0f; + object->rot.x = (pos.x-object->trans.x)/30.0f; + object->rot.y = (pos.y-object->trans.y)/30.0f; + object->scale.x = 300.0f; + pos.x = object->trans.x; + pos.y = object->trans.y; + pos.z = object->scale.x; + Hu3D2Dto3D(&pos, 1, &pos); + BoardModelPosSetV(work->model, &pos); +} + +static void SuitGiveMain(omObjData *object) +{ + SuitGiveWork *work = OM_GET_WORK_PTR(object, SuitGiveWork); + s32 effect_active; + Vec pos; + if(work->kill || BoardIsKill()) { + BoardModelKill(work->model); + suitGiveObj = NULL; + omDelObjEx(HuPrcCurrentGet(), object); + return; + } + if(work->idle_timer) { + work->idle_timer--; + return; + } + + effect_active = 0; + switch(work->state) { + case 0: + if(work->timer == 0) { + work->state = 1; + work->idle_timer = 30; + work->timer = 30; + BoardStatusPosGet(eventPlayer, &pos); + object->rot.x = (pos.x-object->trans.x)/30.0f; + object->rot.y = (pos.y-object->trans.y)/30.0f; + } else { + work->timer--; + } + break; + + case 1: + if(work->timer == 0) { + work->state = 2; + work->idle_timer = 6; + effect_active = 1; + } else { + work->timer--; + } + break; + + case 2: + BoardPlayerItemAdd(eventPlayer, 10); + BoardModelVisibilitySet(work->model, 0); + work->kill = 1; + return; + + default: + break; + } + object->trans.x += object->rot.x; + object->trans.y += object->rot.y; + pos.x = object->trans.x; + pos.y = object->trans.y; + pos.z = object->scale.x; + Hu3D2Dto3D(&pos, 1, &pos); + BoardModelPosSetV(work->model, &pos); + if(effect_active) { + CharModelLayerSetAll(6); + CharModelEffectCreate(1, &pos); + } +} + +static const s32 bowserMotTbl[] = { + DATA_MAKE_NUM(DATADIR_BKOOPA, 8), + DATA_MAKE_NUM(DATADIR_BKOOPA, 10), + DATA_MAKE_NUM(DATADIR_BKOOPA, 11), + DATA_MAKE_NUM(DATADIR_BKOOPA, 12), + DATA_MAKE_NUM(DATADIR_BKOOPA, 13), + DATA_NUM_LISTEND +}; + +static void CreateBowserObj(void) +{ + BowserWork *work; + Vec pos; + bowserObj = omAddObjEx(boardObjMan, 257, 0, 0, -1, ExecBowserObj); + work = OM_GET_WORK_PTR(bowserObj, BowserWork); + work->kill = 0; + work->jump_state = 0; + work->idle_timer = 0; + work->mot_active = 0; + work->fall_done = 0; + work->jump_done = 0; + if(!_CheckFlag(0x10003)) { + work->state = 1; + } else { + work->state = 0; + } + bowserMdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BKOOPA, 7), (s32 *)bowserMotTbl, 0); + BoardModelVisibilitySet(bowserMdl, 0); + BoardModelScaleSet(bowserMdl, 2.0f, 2.0f, 2.0f); + BoardPlayerPosGet(eventPlayer, &pos); + BoardModelLayerSet(bowserMdl, 2); + bowserObj->trans.x = pos.x; + bowserObj->trans.y = pos.y; + bowserObj->trans.z = pos.z; + if(!_CheckFlag(0x10003)) { + suitItemMdl = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 99), NULL, 0); + BoardModelLayerSet(suitItemMdl, 2); + BoardModelVisibilitySet(suitItemMdl, 0); + } else { + s32 space = GWPlayer[eventPlayer].space_curr; + BoardSpacePosGet(0, space, &pos); + bowserObj->trans.x = pos.x; + bowserObj->trans.y = pos.y; + bowserObj->trans.z = pos.z; + BoardModelPosSetV(bowserMdl, &pos); + BoardCameraTargetSpaceSet(space); + BoardModelMotionStart(bowserMdl, 1, 0x40000001); + BoardModelVisibilitySet(bowserMdl, 1); + } +} + +static void ExecBowserFall(BowserWork *work, omObjData *object); +static void ExecBowserLaugh(BowserWork *work, omObjData *object); +static void ExecBowserPowerUp(BowserWork *work, omObjData *object); +static void ExecBowserFire(BowserWork *work, omObjData *object); +static void ExecBowserJump(BowserWork *work, omObjData *object); + +static void ExecBowserObj(omObjData *object) +{ + BowserWork *work = OM_GET_WORK_PTR(bowserObj, BowserWork); + Vec pos; + Vec rot; + + if(work->kill || BoardIsKill()) { + BoardModelKill(bowserMdl); + bowserMdl = -1; + BoardModelKill(suitItemMdl); + suitItemMdl = -1; + omDelObjEx(HuPrcCurrentGet(), object); + bowserObj = NULL; + return; + } + if(work->idle_timer) { + work->idle_timer--; + return; + } + if(work->mot_active && BoardModelMotionEndCheck(bowserMdl)) { + work->mot_active = 0; + BoardModelMotionShiftSet(bowserMdl, 1, 0.0f, 10.0f, 0x40000001); + } + switch(work->state) { + case 1: + ExecBowserFall(work, object); + break; + + case 2: + ExecBowserLaugh(work, object); + break; + + case 3: + ExecBowserPowerUp(work, object); + break; + + case 5: + ExecBowserFire(work, object); + break; + + case 6: + ExecBowserJump(work, object); + break; + + case 4: + BoardModelVisibilitySet(suitItemMdl, 0); + work->state = 0; + break; + + case 0: + break; + } + BoardModelPosSet(bowserMdl, object->trans.x, object->trans.y, object->trans.z); + BoardCameraRotGet(&rot); + pos.x = object->trans.x+(-100.0f*sin(M_PI*BoardModelRotYGet(bowserMdl)/180.0)); + pos.z = object->trans.z+(-100.0f*cos(M_PI*BoardModelRotYGet(bowserMdl)/180.0)); + pos.y = object->trans.y+250.0f; + BoardModelPosSetV(suitItemMdl, &pos); +} + +static void ExecBowserFall(BowserWork *work, omObjData *object) +{ + Vec pos; + Vec pos_space; + Vec pos_player; + s32 i; + if(!work->jump_state) { + BoardModelVisibilitySet(bowserMdl, 1); + BoardModelMotionStart(bowserMdl, 2, 0); + BoardModelMotionTimeSet(bowserMdl, 100.0f); + work->jump_state = 1; + return; + } + if(BoardModelMotionEndCheck(bowserMdl)) { + work->state = 0; + BoardModelMotionShiftSet(bowserMdl, 1, 0.0f, 10.0f, 0x40000001); + return; + } + if(!work->fall_done && !(BoardModelMotionTimeGet(bowserMdl) < 140.0f)) { + BoardPlayerPosGet(eventPlayer, &pos); + HuAudFXPlay(829); + BoardCameraQuakeSet(60, 100.0f); + object->trans.y = pos.y; + BoardPlayerPosGet(eventPlayer, &pos_player); + if(!_CheckFlag(0x10003)) { + HuAudFXPlay(798); + } + pos_player.y += 6.0f; + BoardPlayerPosSetV(eventPlayer, &pos_player); + GWPlayer[eventPlayer].show_next = 0; + BoardPlayerMotionSpeedSet(eventPlayer, 0.0f); + for(i=0; i<4; i++) { + if(eventSpace != GWPlayer[i].space_curr) { + continue; + } + BoardPlayerPosGet(i, &pos_player); + BoardSpacePosGet(0, eventSpace, &pos_space); + pos_player.y = 2.5f+pos_space.y; + BoardPlayerPosSetV(i, &pos_player); + BoardPlayerMotionStart(i, playerMot[i], 0); + BoardPlayerMotionTimeSet(i, 50.0f); + BoardPlayerMotionSpeedSet(i, 0.0f); + } + if(!work->fall_done) { + work->fall_done = 1; + omVibrate(eventPlayer, 12, 4, 2); + } + } + +} + +static void ExecBowserLaugh(BowserWork *work, omObjData *object) +{ + BoardModelMotionStart(bowserMdl, 3, 0); + work->mot_active = 1; + work->state = 0; +} + +static void ExecBowserFire(BowserWork *work, omObjData *object) +{ + BoardModelMotionStart(bowserMdl, 5, 0); + work->state = 0; +} + +static void ExecBowserJump(BowserWork *work, omObjData *object) +{ + switch(work->jump_state) { + case 0: + BoardModelMotionShiftSet(bowserMdl, 2, 0.0f, 4.0f, 0); + work->jump_state = 1; + break; + + case 1: + { + s16 model_id = BoardModelIDGet(bowserMdl); + if(Hu3DMotionShiftIDGet(model_id) == -1) { + work->jump_state = 2; + } + } + break; + + case 2: + { + float time = BoardModelMotionTimeGet(bowserMdl); + if(time < 60.0f) { + break; + } + if(!work->jump_done) { + omVibrate(eventPlayer, 12, 12, 0); + HuAudFXPlay(61); + work->jump_done = 1; + } + if(time >= 100.0f) { + BoardModelVisibilitySet(bowserMdl, 0); + work->state = 0; + work->kill = 1; + } + } + break; + } +} + +static void ExecBowserPowerUp(BowserWork *work, omObjData *object) +{ + Vec pos; + if(work->jump_state == 0) { + BoardModelVisibilitySet(suitItemMdl, 1); + BoardModelMotionStart(suitItemMdl, 0, 0); + BoardModelScaleSet(suitItemMdl, 10.0f, 10.0f, 10.0f); + pos.x = object->trans.x+(-100.0f*sin(M_PI*BoardModelRotYGet(bowserMdl)/180.0)); + pos.z = object->trans.z+(-100.0f*cos(M_PI*BoardModelRotYGet(bowserMdl)/180.0)); + pos.y = object->trans.y+250.0f; + BoardModelPosSetV(suitItemMdl, &pos); + HuAudFXPlay(850); + } else { + if(work->jump_state >= 100) { + work->state = 0; + } + } + work->jump_state++; +} + +static void SetBowserState(s32 state) +{ + BowserWork *work = OM_GET_WORK_PTR(bowserObj, BowserWork); + work->state = state; + work->jump_state = 0; +} + +static s32 CheckBowserIdle(void) +{ + BowserWork *work; + if(!bowserObj) { + return 1; + } + work = OM_GET_WORK_PTR(bowserObj, BowserWork); + if(work->state != 0 || work->idle_timer != 0) { + return 0; + } else { + return 1; + } +} + +static void CreateMiniBowser(void) +{ + omObjData *object; + MiniBowserWork *work; + object = omAddObjEx(boardObjMan, 257, 0, 0, -1, ExecMiniBowser); + miniBowserObj = object; + work = OM_GET_WORK_PTR(object, MiniBowserWork); + work->kill = 0; + work->angle = 0; + work->group = HuSprGrpCreate(1); + BoardSpriteCreate(DATA_MAKE_NUM(DATADIR_BKOOPA, 5), 100, NULL, &work->sprite); + HuSprGrpMemberSet(work->group, 0, work->sprite); + HuSprAttrSet(work->group, 0, HUSPR_ATTR_LINEAR); + HuSprGrpPosSet(work->group, 288.0f, 240.0f); + HuSprGrpScaleSet(work->group, 4.0f, 4.0f); +} + +static s32 CheckMiniBowser(void) +{ + if(miniBowserObj) { + return 0; + } else { + return 1; + } +} + +static void ExecMiniBowser(omObjData *object) +{ + MiniBowserWork *work = OM_GET_WORK_PTR(object, MiniBowserWork); + float alpha; + if(work->kill || BoardIsKill()) { + HuSprGrpKill(work->group); + miniBowserObj = NULL; + omDelObjEx(HuPrcCurrentGet(), object); + return; + } + OSs16tof32(&work->angle, &alpha); + alpha = sin(M_PI*BoardDAngleCalc(alpha)/180.0); + HuSprTPLvlSet(work->group, 0, ABS(alpha)); + if(work->angle == 60) { + HuAudFXPlay(807); + } + work->angle += 2; + if(work->angle == 90 || work->angle == 270 || work->angle == 450) { + omVibrate(eventPlayer, 12, 4, 2); + } + if(work->angle >= 540) { + work->kill = 1; + } +} + +static void CreateBowserEvent(void) +{ + Vec pos_2d; + Vec pos_3d; + s32 eventSpr[] = { + DATA_MAKE_NUM(DATADIR_BKOOPA, 1), + DATA_MAKE_NUM(DATADIR_BKOOPA, 2), + DATA_MAKE_NUM(DATADIR_BKOOPA, 3), + DATA_MAKE_NUM(DATADIR_BKOOPA, 4), + }; + + + BowserEventData *data; + s32 i; + BowserEventWork *work; + s32 sprite; + bowserEventObj = omAddObjEx(boardObjMan, 257, 0, 0, -1, ExecBowserEvent); + work = OM_GET_WORK_PTR(bowserEventObj, BowserEventWork); + work->kill = 0; + work->state = 0; + work->timer = 0; + memset(&bowserEvent, 0, sizeof(BowserEventData)); + data = &bowserEvent; + data->group = HuSprGrpCreate(3); + sprite = eventSpr[GWSystem.bowser_event]; + for(i=0; i<3; i++) { + BoardSpriteCreate(sprite, 100, NULL, &data->sprite[i]); + HuSprGrpMemberSet(data->group, i, data->sprite[i]); + HuSprTPLvlSet(data->group, i, 0.0f); + HuSprPosSet(data->group, i, 0.0f, 0.0f); + data->delay[i] = i*2; + } + HuSprGrpPosSet(data->group, 288.0f, 240.0f); + data->model = BoardModelCreate(DATA_MAKE_NUM(DATADIR_BOARD, 101), NULL, 0); + pos_2d.x = 288.0f; + pos_2d.y = 240.0f; + pos_2d.z = 1000.0f; + Hu3D2Dto3D(&pos_2d, 1, &pos_3d); + BoardModelMotionStart(data->model, 0, 0x40000001); + BoardModelPosSetV(data->model, &pos_3d); + BoardModelLayerSet(data->model, 2); +} + +static s32 CheckBowserEvent(void) +{ + BowserEventWork *work = OM_GET_WORK_PTR(bowserEventObj, BowserEventWork); + + if(work->state != 2) { + return 0; + } else { + return 1; + } +} + +static void StopBowserEvent(void) +{ + BowserEventWork *work = OM_GET_WORK_PTR(bowserEventObj, BowserEventWork); + work->state = 1; +} + +static void ShowBowserEvent(BowserEventWork *work, omObjData *object); +static void HideBowserEvent(BowserEventWork *work, omObjData *object); + +static void ExecBowserEvent(omObjData *object) +{ + BowserEventWork *work = OM_GET_WORK_PTR(object, BowserEventWork); + BowserEventData *data = &bowserEvent; + if(work->kill || BoardIsKill()) { + HuSprGrpKill(data->group); + BoardModelKill(data->model); + bowserEventObj = NULL; + omDelObjEx(HuPrcCurrentGet(), object); + return; + } + if(work->timer) { + work->timer--; + return; + } + switch(work->state) { + case 0: + ShowBowserEvent(work, object); + break; + + case 1: + HideBowserEvent(work, object); + break; + + case 2: + break; + } +} + +static void ShowBowserEvent(BowserEventWork *work, omObjData *object) +{ + BowserEventData *data; + s32 i; + s32 count; + float angle; + float tplvl; + float scale; + data = &bowserEvent; + for(count=i=0; i<3; i++) { + if(data->delay[i]) { + data->delay[i]--; + } else { + if(data->angle[i] > 90) { + count++; + continue; + } + OSs16tof32(&data->angle[i], &angle); + tplvl = sin(M_PI*angle/180.0); + scale = sin(M_PI*angle/180.0); + HuSprTPLvlSet(data->group, i, tplvl); + HuSprScaleSet(data->group, i, scale, scale); + BoardModelAlphaSet(data->model, 255.0f*tplvl); + data->angle[i] += 9; + if(data->angle[i] > 90 && i != 0) { + HuSprAttrSet(data->group, i, HUSPR_ATTR_DISPOFF); + } + } + } + if(count == 3) { + work->state = 2; + work->timer = 60; + } +} + +static void HideBowserEvent(BowserEventWork *work, omObjData *object) +{ + BowserEventData *data = &bowserEvent; + float angle; + float tplvl; + OSs16tof32(&data->angle[0], &angle); + tplvl = sin(M_PI*angle/180.0); + HuSprTPLvlSet(data->group, 0, tplvl); + BoardModelAlphaSet(data->model, 255.0f*tplvl); + data->angle[0] -= 10; + if(data->angle[0] < 0) { + work->kill = 1; + HuSprAttrSet(data->group, 0, HUSPR_ATTR_DISPOFF); + } +} + + +static void ConfigBowserEvent(void) +{ + s32 i; + s32 chance; + s32 coins; + s32 item_full; + item_full = 0; + if(BoardPlayerItemCount(eventPlayer) == 3) { + item_full = 1; + } + for(coins=i=0; i<4; i++) { + coins += BoardPlayerCoinsGet(i); + } + retry: + while(1) { + chance = BoardRandMod(100); + if(chance >= 95) { + if(item_full) { + continue; + } + if(GWSystem.max_turn-GWSystem.turn == 0) { + continue; + } + GWSystem.bowser_event = 3; + break; + } else if(chance >= 85) { + GWSystem.bowser_event = 2; + break; + } else if(chance >= 70) { + GWSystem.bowser_event = 1; + break; + } else { + if(coins == 0) { + continue; + } + GWSystem.bowser_event = 0; + GWSystem.bowser_loss = BoardRandMod(3); + break; + } + } +} + +static void CreatePlayerMot(void) +{ + s32 scareMotTbl[] = { + DATA_MAKE_NUM(DATADIR_MARIOMOT, 27), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 27), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 27), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 27), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 27), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 27), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 27), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 27), + }; + s32 jumpMotTbl[] = { + DATA_MAKE_NUM(DATADIR_MARIOMOT, 26), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 26), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 26), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 26), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 26), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 26), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 26), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 26), + }; + s32 playerMotTbl[] = { + DATA_MAKE_NUM(DATADIR_MARIOMOT, 31), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 31), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 31), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 31), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 31), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 31), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 31), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 31), + }; + s32 i; + s32 character; + character = GWPlayer[eventPlayer].character; + scareMot = BoardPlayerMotionCreate(eventPlayer, scareMotTbl[character]); + jumpMot = BoardPlayerMotionCreate(eventPlayer, jumpMotTbl[character]); + for(i=0; i<4; i++) { + character = GWPlayer[i].character; + playerMot[i] = BoardPlayerMotionCreate(i, playerMotTbl[character]); + } +} + +static void KillPlayerMot(void) +{ + s32 i; + if(scareMot > 0) { + BoardPlayerMotionKill(eventPlayer, scareMot); + scareMot = -1; + } + if(jumpMot > 0) { + BoardPlayerMotionKill(eventPlayer, jumpMot); + jumpMot = -1; + } + for(i=0; i<4; i++) { + if(playerMot[i] > 0) { + BoardPlayerMotionKill(i, playerMot[i]); + playerMot[i] = -1; + } + } +} + +static void BowserFireHook(ModelData *model, ParticleData *particle, Mtx matrix); + +static void SpawnBowserFire(HsfanimStruct01 *arg0); +static s32 CheckBowserFire(HsfanimStruct01 *arg0); + +static void InitBowserFire(void) +{ + fireAnim = HuSprAnimReadFile(DATA_MAKE_NUM(DATADIR_BOARD, 106)); + fireParMan = Hu3DParticleCreate(fireAnim, 30); + Hu3DParticleColSet(fireParMan, 255, 255, 255); + Hu3DParticleScaleSet(fireParMan, 10.0f); + Hu3DParticleHookSet(fireParMan, BowserFireHook); + Hu3DParticleBlendModeSet(fireParMan, 1); + Hu3DModelLayerSet(fireParMan, 2); +} + +static void BowserFireHook(ModelData *model, ParticleData *particle, Mtx matrix) +{ + HsfanimStruct01* var_r30; + s32 i; + s32 var_r28; + Vec pos; + Hu3DModelObjPosGet(BoardModelIDGet(bowserMdl), "itemhook_M_1", &pos); + if (particle->unk_34 == 0) { + var_r30 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r30++) { + var_r30->unk2C = 0.0f; + } + particle->unk_34 = 1; + particle->unk_00 = 0; + } + if((particle->unk_34 & 0x3) == 0) { + var_r30 = particle->unk_48; + for(var_r28=0; var_r28unk_30; var_r28++, var_r30++) { + if(var_r30->unk2C == 0.0f) { + break; + } + } + if(var_r28 != particle->unk_30) { + var_r30->unk34 = pos; + particle->unk_00++; + SpawnBowserFire(var_r30); + } + } + var_r30 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r30++) { + if(var_r30->unk2C != 0.0f && CheckBowserFire(var_r30)) { + particle->unk_00--; + } + } +} + +static void SpawnBowserFire(HsfanimStruct01 *arg0) +{ + Vec dir; + BoardCameraDirGet(&dir); + arg0->unk08.x = 0.0f; + arg0->unk08.y = 0.0f; + arg0->unk08.z = 0.0f; + arg0->unk14.x = -dir.x*((0.5f*BoardRandFloat())+0.5f); + arg0->unk14.y = -dir.y*((0.5f*BoardRandFloat())+0.5f); + arg0->unk14.z = -dir.z*((0.5f*BoardRandFloat())+0.5f); + arg0->unk24 = 1.025f; + arg0->unk40.a = 254; + arg0->unk40.r = 255; + arg0->unk40.g = 255; + arg0->unk40.b = 255; + arg0->unk2C = 100.0f; +} + +static s32 CheckBowserFire(HsfanimStruct01 *arg0) +{ + arg0->unk34.x += arg0->unk08.x; + arg0->unk34.y += arg0->unk08.y; + arg0->unk34.z += arg0->unk08.z; + arg0->unk08.x += arg0->unk14.x; + arg0->unk08.y += arg0->unk14.y; + arg0->unk08.z += arg0->unk14.z; + arg0->unk40.a -= 8; + arg0->unk2C *= arg0->unk24; + if(arg0->unk40.a == 0.0f) { + arg0->unk40.a = 0; + arg0->unk2C = 0.0f; + return 1; + } + return 0; +} + +static void KillBowserFire(void) +{ + if(fireParMan != -1) { + Hu3DModelKill(fireParMan); + fireParMan = -1; + fireAnim = NULL; + } } \ No newline at end of file diff --git a/src/game/board/item.c b/src/game/board/item.c index 60d48ff8..914f74de 100755 --- a/src/game/board/item.c +++ b/src/game/board/item.c @@ -75,8 +75,8 @@ static void ExecItemLight(void); static void ExecItemWhistle(void); static void ExecItemBowser(void); static void ExecItemBooBall(void); -static void LampParticleUpdate(s32 arg0, ParticleData *arg1); -static void GenieParticleUpdate(s32 arg0, ParticleData *arg1); +static void LampParticleUpdate(ModelData *model, ParticleData *particle, Mtx matrix); +static void GenieParticleUpdate(ModelData *model, ParticleData *particle, Mtx matrix); static void GenieCameraProc(void); static void GenieCameraCalc(UnkGenieCameraStruct *arg0, s32 arg1, float arg2, Vec *arg3, Vec *arg4); static void GenieSceneExec(void); @@ -1924,7 +1924,7 @@ static void ForceConsts(void) (void)125.0f; } -static void LampParticleUpdate(s32 arg0, ParticleData *arg1) { +static void LampParticleUpdate(ModelData *model, ParticleData *particle, Mtx matrix) { HsfanimStruct01 *var_r31; Vec spC; float sp8; @@ -1933,26 +1933,26 @@ static void LampParticleUpdate(s32 arg0, ParticleData *arg1) { s32 i; s32 j; - if (arg1->unk_34 == 0) { - var_r31 = arg1->unk_48; - for (i = 0; i < arg1->unk_30; i++, var_r31++) { + if (particle->unk_34 == 0) { + var_r31 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r31++) { var_r31->unk2C = 0.0f; var_r31->unk40.a = 0; } - arg1->unk_04 = 0.0f; - arg1->unk_00 = 0; + particle->unk_04 = 0.0f; + particle->unk_00 = 0; } - if (arg1->unk_00 == 0) { - arg1->unk_00 = 2; + if (particle->unk_00 == 0) { + particle->unk_00 = 2; BoardModelRotGet(suitMdl, &spC); for (i = 0; i < 2; i++) { - var_r31 = arg1->unk_48; - for (j = 0; j < arg1->unk_30; j++, var_r31++) { + var_r31 = particle->unk_48; + for (j = 0; j < particle->unk_30; j++, var_r31++) { if (var_r31->unk2C == 0.0f) { break; } } - if (j != arg1->unk_30) { + if (j != particle->unk_30) { var_r31->unk34.x = 60.0 * sin((spC.y - 90.0f) * M_PI / 180.0); var_r31->unk34.y = 30.0f; var_r31->unk34.z = 60.0 * cos((spC.y - 90.0f) * M_PI / 180.0); @@ -1968,10 +1968,10 @@ static void LampParticleUpdate(s32 arg0, ParticleData *arg1) { } } } else { - arg1->unk_00--; + particle->unk_00--; } - var_r31 = arg1->unk_48; - for (i = 0; i < arg1->unk_30; i++, var_r31++) { + var_r31 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r31++) { if (var_r31->unk2C != 0.0f) { if (var_r31->unk00_s16 == 0) { PSVECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); @@ -2001,16 +2001,16 @@ static void LampParticleUpdate(s32 arg0, ParticleData *arg1) { } } -static void GenieParticleUpdate(s32 arg0, ParticleData *arg1) { +static void GenieParticleUpdate(ModelData *model, ParticleData *particle, Mtx matrix) { HsfanimStruct01* var_r31; float temp_f31; float temp_f30; s32 var_r28; s32 i; - if (arg1->unk_34 == 0) { - var_r31 = arg1->unk_48; - for (i = 0; i < arg1->unk_30; i++, var_r31++) { + if (particle->unk_34 == 0) { + var_r31 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r31++) { var_r31->unk34.x = -50.0f + (frand() & 0xFF) * 100.0f * 0.003921569f; var_r31->unk34.y = -50.0f + (frand() & 0xFF) * 100.0f * 0.003921569f; var_r31->unk34.z = -10.0f + (frand() & 0xFF) * 20.0f * 0.003921569f; @@ -2025,9 +2025,9 @@ static void GenieParticleUpdate(s32 arg0, ParticleData *arg1) { var_r31->unk2C = 80.0f + (frand() & 0xFF) * 60.0f * 0.003921569f; } } - var_r31 = arg1->unk_48; + var_r31 = particle->unk_48; var_r28 = 0; - for (i = 0; i < arg1->unk_30; i++, var_r31++) { + for (i = 0; i < particle->unk_30; i++, var_r31++) { if (var_r31->unk2C != 0.0f) { var_r28++; PSVECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); @@ -2042,7 +2042,7 @@ static void GenieParticleUpdate(s32 arg0, ParticleData *arg1) { } } if (var_r28 == 0) { - arg1->unk_02 = 0; + particle->unk_02 = 0; } } @@ -2235,7 +2235,7 @@ static void GenieSceneExec(void) { temp_r21 = HuPrcChildCreate(GenieCameraProc, 0x2005, 0x1000, 0, HuPrcCurrentGet()); Hu3DBGColorSet(0xFF, 0xFF, 0xFF); temp_r27 = Hu3DParticleCreate(genieParticleAnim, 0x32); - Hu3DParticleHookSet(temp_r27, &GenieParticleUpdate); + Hu3DParticleHookSet(temp_r27, GenieParticleUpdate); Hu3DParticleBlendModeSet(temp_r27, 1); Hu3DParticleColSet(temp_r27, 0xFF, 0xFF, 0xFF); Hu3DParticleAnimModeSet(temp_r27, 0); @@ -2409,7 +2409,7 @@ static void ExecItemGenie(void) { HuAudPlayerVoicePlay(currItemRestore, 0x125); temp_r25 = HuAudFXPlay(0x34D); temp_r31 = Hu3DParticleCreate(genieParticleAnim, 0x96); - Hu3DParticleHookSet(temp_r31, &LampParticleUpdate); + Hu3DParticleHookSet(temp_r31, LampParticleUpdate); Hu3DParticleBlendModeSet(temp_r31, 0); Hu3DParticleColSet(temp_r31, 0xFF, 0xFF, 0xFF); Hu3DParticleAnimModeSet(temp_r31, 0); diff --git a/src/game/board/mg_setup.c b/src/game/board/mg_setup.c index 1c58cd37..796c8b75 100644 --- a/src/game/board/mg_setup.c +++ b/src/game/board/mg_setup.c @@ -749,7 +749,7 @@ static void SeparateStatus(bitcopy* arg0, omObjData* arg1) { switch (arg0->unk_02) { case 0: for (var_r28 = 0; var_r28 < 4; var_r28++) { - BoardStatusPosGet(var_r28, &sp8.x); + BoardStatusPosGet(var_r28, &sp8); if (sp8.x < 288.0f) { sp8.x = -98.0f; } else { diff --git a/src/game/board/player.c b/src/game/board/player.c index 702924a7..f8f23972 100644 --- a/src/game/board/player.c +++ b/src/game/board/player.c @@ -689,7 +689,7 @@ void BoardPlayerPostTurnHookSet(s32 arg0, s32 (*arg1)()) { void BoardPlayerTurnExec(s32 arg0) { BoardPauseDisableSet(1); BoardComUseItemSet(arg0, -1); - GWSystem.field31_bit4 = 0xF; + GWSystem.bowser_event = 0xF; _ClearFlag(0x10016); _ClearFlag(0x1000E); BoardCameraMoveSet(1); @@ -853,11 +853,11 @@ block_14: BoardSpaceBlockExec(arg0, sp8); BoardSpaceLandExec(arg0, sp8); _SetFlag(0x1000E); - if (GWSystem.field31_bit4 != 1) { + if (GWSystem.bowser_event != 1) { BoardCameraViewSet(2); BoardCameraMotionWait(); } else { - GWSystem.field31_bit4 = 0xF; + GWSystem.bowser_event = 0xF; } BoardPlayerZoomRestore(arg0); return; diff --git a/src/game/board/ui.c b/src/game/board/ui.c index 81ec4bed..3b304501 100755 --- a/src/game/board/ui.c +++ b/src/game/board/ui.c @@ -402,11 +402,11 @@ void BoardStatusTargetPosSet(s32 arg0, Vec *arg1) { temp_r31->unk00_bit2 = 1; } -void BoardStatusPosGet(s32 arg0, float *arg1) { +void BoardStatusPosGet(s32 arg0, Vec *arg1) { UnkUiStatusStruct *temp_r31 = &uiStatus[arg0]; - arg1[0] = temp_r31->unk04.x; - arg1[1] = temp_r31->unk04.y; + arg1->x = temp_r31->unk04.x; + arg1->y = temp_r31->unk04.y; } void BoardStatusPosSet(s32 arg0, Vec *arg1) { diff --git a/src/game/chrman.c b/src/game/chrman.c index 676c6793..bbfb4f37 100755 --- a/src/game/chrman.c +++ b/src/game/chrman.c @@ -74,7 +74,7 @@ static s16 CreateEffectStar(s16 arg0, float arg1, float arg2, float arg3, float static s16 CreateEffectWarn(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5); static s16 CreateEffectBird(s16 arg0, float arg1, float arg2, float arg3, float arg4, EffectParamData *arg5); static s16 CreateEffect(s16 arg0, s16 arg1, float arg2, float arg3, float arg4, float arg5, EffectParamData *arg6); -static void UpdateEffect(s32 arg0, ParticleData *arg1); +static void UpdateEffect(ModelData *model, ParticleData *particle, Mtx matrix); static void RotateEffect(HsfanimStruct01 *arg0); static void PlayEffectSound(HsfanimStruct01 *arg0); static void UpdateItemHook(void); @@ -887,21 +887,21 @@ static s16 CreateEffect(s16 arg0, s16 arg1, float arg2, float arg3, float arg4, return i; } -static void UpdateEffect(s32 arg0, ParticleData *arg1) { +static void UpdateEffect(ModelData *model, ParticleData *particle, Mtx matrix) { EffectParamData *temp_r30; HsfanimStruct01 *var_r31; s16 var_r28; s16 i; - temp_r30 = arg1->unk_1C; - if (arg1->unk_34 == 0) { - var_r31 = arg1->unk_48; - for (i = 0; i < arg1->unk_30; i++, var_r31++) { + temp_r30 = particle->unk_1C; + if (particle->unk_34 == 0) { + var_r31 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r31++) { var_r31->unk2C = 0.0f; } } - var_r31 = arg1->unk_48; - for (i = 0; i < arg1->unk_30; i++, var_r31++) { + var_r31 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r31++) { if (var_r31->unk2C) { if (var_r31->unk02 == -1) { var_r31->unk08.x *= temp_r30[i].unk18; @@ -962,7 +962,7 @@ static void UpdateEffect(s32 arg0, ParticleData *arg1) { } } } - DCStoreRangeNoSync(arg1->unk_48, arg1->unk_30 * sizeof(HsfanimStruct01)); + DCStoreRangeNoSync(particle->unk_48, particle->unk_30 * sizeof(HsfanimStruct01)); } static void RotateEffect(HsfanimStruct01 *arg0) { diff --git a/src/game/hsfanim.c b/src/game/hsfanim.c index 87df68ca..ef3b7121 100755 --- a/src/game/hsfanim.c +++ b/src/game/hsfanim.c @@ -25,7 +25,7 @@ typedef struct { static void _Hu3DParticleAttrReset(ModelData *arg0, Mtx arg1); static void ParManFunc(void); -static void ParManHook(ModelData *arg0, ParticleData *arg1); +static void ParManHook(ModelData *arg0, ParticleData *arg1, Mtx matrix); u32 frand(void); @@ -606,7 +606,7 @@ void Hu3DParticleBlendModeSet(s16 arg0, u8 arg1) { temp_r30->unk_2C = arg1; } -void Hu3DParticleHookSet(s16 arg0, void *arg1) { +void Hu3DParticleHookSet(s16 arg0, ParticleHook arg1) { ModelData *temp_r31 = &Hu3DData[arg0]; ParticleData *temp_r30 = temp_r31->unk_120; @@ -673,7 +673,7 @@ static void _Hu3DParticleAttrReset(ModelData *arg0, Mtx arg1) { AnimLayerData *temp_r27; ParticleData *temp_r31; HsfanimStruct01 *var_r29; - void (*var_r17)(void*, void*, Mtx); + ParticleHook var_r17; Mtx sp128; Mtx spF8; Mtx spC8; @@ -872,7 +872,7 @@ s16 Hu3DParManCreate(AnimData *arg0, s16 arg1, HsfanimStruct00 *arg2) { return -1; } temp_r3 = Hu3DParticleCreate(arg0, arg1); - Hu3DParticleHookSet(temp_r3, &ParManHook); + Hu3DParticleHookSet(temp_r3, ParManHook); temp_r25 = &Hu3DData[temp_r3]; temp_r29 = temp_r25->unk_120; temp_r29->unk_00 = var_r30; @@ -1214,7 +1214,7 @@ static float jitterTbl[] = { 0.5f, 0.7f, 0.9f, 1.0f }; -static void ParManHook(ModelData *arg0, ParticleData *arg1) { +static void ParManHook(ModelData *model, ParticleData *particle, Mtx matrix) { HsfanimStruct00 *temp_r26; ParManProcUserData *temp_r28; HsfanimStruct01 *var_r29; @@ -1228,9 +1228,9 @@ static void ParManHook(ModelData *arg0, ParticleData *arg1) { s16 sp8; s16 i; - if (Hu3DPauseF == 0 || (arg0->attr & 0x200000)) { - var_r29 = arg1->unk_48; - for (i = 0; i < arg1->unk_30; i++, var_r29++) { + if (Hu3DPauseF == 0 || (model->attr & 0x200000)) { + var_r29 = particle->unk_48; + for (i = 0; i < particle->unk_30; i++, var_r29++) { if (var_r29->unk2C) { temp_r28 = parManProc[var_r29->unk02]->user_data; temp_r26 = temp_r28->unk3C; @@ -1278,8 +1278,8 @@ static void ParManHook(ModelData *arg0, ParticleData *arg1) { } } } - temp_r28 = parManProc[arg1->unk_00]->user_data; + temp_r28 = parManProc[particle->unk_00]->user_data; temp_r28->unk38++; - DCStoreRangeNoSync(arg1->unk_48, arg1->unk_30 * sizeof(HsfanimStruct01)); + DCStoreRangeNoSync(particle->unk_48, particle->unk_30 * sizeof(HsfanimStruct01)); } }