diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index dcae058a..7535ca9c 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -4943,8 +4943,8 @@ seqFontKanaTbl = .data:0x8012F3D0; // type:object size:0x52 scope:local data:str seqFontNumTbl = .data:0x8012F422; // type:object size:0xB scope:local data:string letterBufTbl = .data:0x8012F430; // type:object size:0x14 scope:local wordMgTbl = .data:0x8012F444; // type:object size:0x18 scope:local -letterOfs$912 = .data:0x8012F45C; // type:object size:0x40 scope:local -letterOfs$913 = .data:0x8012F49C; // type:object size:0x1C scope:local +letterOfs$909 = .data:0x8012F45C; // type:object size:0x40 scope:local +letterOfs$1386 = .data:0x8012F49C; // type:object size:0x1C scope:local letterOfs$914 = .data:0x8012F4B8; // type:object size:0x38 scope:local charMKoopaNameE = .data:0x8012F4F0; // type:object size:0xA scope:local data:string winCharNameTbl = .data:0x8012F4FC; // type:object size:0x78 scope:local diff --git a/src/game/minigame_seq.c b/src/game/minigame_seq.c index 7003880a..2a44e7c5 100644 --- a/src/game/minigame_seq.c +++ b/src/game/minigame_seq.c @@ -8,6 +8,8 @@ #include "stdarg.h" +#define ABS(x) (((x) < 0) ? -(x) : (x)) + void MGSeqStub(void); void MGSeqPauseEnableCtrl(s32 flag); @@ -163,8 +165,8 @@ void MGSeqInit(void) seqDoneF = 0; lbl_801D3D94 = 0; seqTimer = 30; - HuAR_DVDtoARAM(MAKE_DIR_NUM(DATADIR_GAMEMES)); - HuAR_DVDtoARAM(MAKE_DIR_NUM(DATADIR_MGCONST)); + HuAR_DVDtoARAM(DATADIR_GAMEMES); + HuAR_DVDtoARAM(DATADIR_MGCONST); while(HuARDMACheck()); fn_80036BC8(); mgSeqInitF = -1; @@ -890,13 +892,6 @@ static s32 SeqMakeWord(SeqWork *work, char *str, s16 flags) return grp_idx; } -static s32 SeqCloneWord(SeqWork *work, s16 grp_idx) -{ - s16 i; - - return i; -} - static AnimData *SeqLoadFontChar(char *str, s16 flags) { s32 data_num; @@ -1487,6 +1482,595 @@ static int SeqUpdateMGBattle(SeqWork *work) return 1; } +static int SeqUpdateMG1vs3(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + float time; + float scale_x, scale_y; + float pos_x, pos_y; + s16 i; + s16 j; + if(work->work_s16[1] == 0) { + if(work->time <= 10) { + scale = work->time/10.0f; + time = work->time; + for(idx=0; idxwork_s16[3]; idx++) { + scale_x = 0.3*work->scale_x; + scale_y = 0.3*work->scale_y; + pos_x = ((28.0f*scale_x)+(work->x-(0.5f*(scale_x*(work->work_s16[3]*56)))))+(scale_x*(idx*56)); + pos_y = work->y-(150.0*sin((M_PI*(((16.0f/3.0f)*time)+20.0f))/180.0)); + HuSprPosSet(work->spr_grp[0], idx, pos_x, pos_y); + HuSprScaleSet(work->spr_grp[0], idx, scale_x, scale_y*cos(M_PI*(12.0f*time)/180.0)); + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } else { + if(work->time <= 60) { + for(i=0; i<4; i++) { + for(idx=0; idxwork_s16[3]; idx++) { + time = (work->time-10)-(idx*3)-i; + if(time < 0.0f) { + time = 0.0f; + } else { + if(time > 30.0f) { + continue; + } + } + scale = 0.3+(0.7*(1.0-cos((M_PI*(time*3.0f))/180.0))); + scale_x = work->scale_x*scale; + scale_y = work->scale_y*scale; + pos_x = ((28.0f*scale_x)+(work->x-(0.5f*(scale_x*(work->work_s16[3]*56)))))+(scale_x*(idx*56)); + pos_y = work->y-(150.0*sin((M_PI*(((16.0f/3.0f)*time)+20.0f))/180.0)); + HuSprPosSet(work->spr_grp[i], idx, pos_x, pos_y); + HuSprScaleSet(work->spr_grp[i], idx, scale_x, scale_y*cos(M_PI*(12.0f*time)/180.0)); + } + } + if(work->time == 60) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + } + } else { + if(work->time > 70) { + time = work->time-70; + scale = 0.5*sin((M_PI*(time*9.0f))/180.0); + for(j=0; jwork_s16[3]; j++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((j*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+scale, work->scale_y+scale); + } + } + } + } + if(work->time == 70) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 90) { + work->stat |= 0x4; + SeqPlayStartFX(); + } + if(work->time >= 90) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + time = work->time; + scale = work->scale_x+(0.5*sin((M_PI*(time*9.0f))/180.0)); + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[0], j, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(j*56)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+(sin((M_PI*(time*9.0f))/180.0)), work->scale_y+(sin((M_PI*(time*9.0f))/180.0))); + } + if(time == 20.0f) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + } + } else { + if(work->time > 80 || work->time < 140) { + for(i=0; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + time = (work->time-80)-i-j; + if(time < 0 || time > 40) { + continue; + } + if(time <= 20) { + float pos_base = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(j*56); + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+((work->work_s16[3]-j-1)*56); + HuSprPosSet(work->spr_grp[i], j, pos_base+((time/20.0f)*(pos_x-pos_base)), work->y+((440.0f-work->y)*(time/20.0f))); + } else { + time -= 20.0f; + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+((work->work_s16[3]-j-1)*56); + pos_y = 440.0f; + HuSprPosSet(work->spr_grp[i], j, pos_x, pos_y+((-40.0f-pos_y)*(time/20.0f))); + } + } + } + } + } + if(work->time == 140) { + work->stat |= 0x4; + } + if(work->time >= 140) { + work->type = 0; + work->stat |= 0x8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqUpdateMGStory(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + float pos_x, pos_y; + float time; + s16 i; + s16 j; + if(work->work_s16[1] == 0) { + if(work->time <= 30) { + for(idx=0; idxwork_s16[3]; idx++) { + time = (work->time-(idx*2)); + if(time < 0.0f || time > 15.0f) { + continue; + } + pos_x = -50.0f; + HuSprPosSet(work->spr_grp[0], idx, pos_x+((288.0f-pos_x)*(time/15.0f)), work->y); + HuSprTPLvlSet(work->spr_grp[0], idx, 1.0f); + HuSprZRotSet(work->spr_grp[0], idx, (1.0-(time/15.0f))*180.0); + pos_x = 626.0f; + HuSprPosSet(work->spr_grp[1], idx, pos_x+((288.0f-pos_x)*(time/15.0f)), work->y); + HuSprTPLvlSet(work->spr_grp[1], idx, 1.0f); + HuSprZRotSet(work->spr_grp[1], idx, (1.0-(time/15.0f))*-180.0); + } + if(work->time == 30) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[1], j, SPRITE_ATTR_HIDDEN); + } + } + } else { + if(work->time > 35 && work->time <= 45) { + time = work->time-35; + for(idx=0; idxwork_s16[3]; idx++) { + pos_x = (work->x-(0.5f*(work->work_s16[3]*56)))+28.0f+(idx*56); + HuSprPosSet(work->spr_grp[0], idx, 288.0f+((pos_x-288.0f)*(time/10.0f)), work->y); + } + } else { + if(work->time > 55) { + time = work->time-55; + scale = 0.5*sin(M_PI*(9.0f*time)/180.0); + for(j=0; jwork_s16[3]; j++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((j*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+scale, work->scale_y+scale); + } + } + } + } + if(work->time == 55) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 75) { + SeqPlayStartFX(); + work->stat |= 0x4; + } + if(work->time >= 75) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + time = work->time; + scale = work->scale_x+(0.5*sin((M_PI*(time*9.0f))/180.0)); + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[0], j, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(j*56)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+(sin((M_PI*(time*9.0f))/180.0)), work->scale_y+(sin((M_PI*(time*9.0f))/180.0))); + } + if(time == 20.0f){ + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + } + } else if(work->time > 80 && work->time < 160) { + for(i=0; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + s16 initF; + float dx, dy; + time = (work->time-80)-i; + if(time < 0 || time > 60) { + continue; + } + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(j*56); + dx = 28.0f+(work->x-(0.5f*(work->work_s16[3]*56))); + pos_y = work->y; + for(idx=initF=0; idxx-(0.5f*(work->work_s16[3]*56))); + initF = 1; + dy = 25.0f; + dx = 10.0f; + } + + } else { + pos_x += dx; + pos_y += dy; + dx += 0.1; + dy -= 2.0f; + if(pos_y < 0.0f) { + break; + } + } + } + + HuSprPosSet(work->spr_grp[i], j, pos_x, pos_y); + } + } + } + if(work->time == 160) { + work->stat |= 0x4; + } + if(work->time >= 160) { + work->type = 0; + work->stat |= 0x8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + break; + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} + +static int SeqUpdateMG2vs2(SeqWork *work) +{ + s16 idx; + float scale; + if(work->param[0] != 0 && work->type != -1) { + switch(work->param[0]) { + case 2: + if(work->param[1] != -1) { + (void)work; //HACK: to introduce extra branch + } else { + work->type = -1; + work->work_float[0] = 0.0f; + } + work->param[0] = 0; + break; + + case 1: + work->time_max = work->param[1]; + work->param[0] = 0; + break; + + case 3: + work->type = 1; + work->param[0] = 0; + break; + + default: + work->param[0] = 0; + break; + } + } + if(work->type == 2) { + return 1; + } + work->time += seqSpeed; + if(work->time >= work->time_max && work->type != -1) { + work->stat |= 0x4; + work->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type) { + switch(work->type) { + case 1: + { + static s16 letterOfs[] = { + -10, -50, + 0, -30, + 5, -60, + -10, 60, + 8, -40, + 5, 50, + -10, 20 + }; + + float pos_x; + float time; + s16 i; + s16 j; + if(work->work_s16[1] == 0) { + if(work->time <= 30) { + time = work->time; + for(idx=0; idxwork_s16[3]; idx++) { + pos_x = (28.0f+(work->x-(0.5f*(work->scale_x*(work->work_s16[3]*56)))))+(idx*56); + HuSprPosSet(work->spr_grp[0], idx, pos_x+((1.0f-(time/30.0f))*letterOfs[(idx*2)]), work->y+((1.0f-(time/30.0f))*letterOfs[(idx*2)+1])); + HuSprTPLvlSet(work->spr_grp[0], idx, time/30.0f); + } + } else { + if(work->time > 40 && work->time <= 60) { + time = work->time-40; + scale = 0.5*sin(((time*9.0f)*M_PI)/180.0); + for(j=0; jwork_s16[3]; j++) { + pos_x = (28.0f*(scale+work->scale_x))+(work->x-(0.5f*((work->work_s16[3]*56)*(scale+work->scale_x))))+((j*56)*(scale+work->scale_x)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+scale, work->scale_y+scale); + } + } + } + if(work->time == 40) { + HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 60) { + work->stat |= 0x4; + SeqPlayStartFX(); + } + if(work->time >= 60) { + work->type = 0; + } + } else { + if(work->time == 1) { + if(work->work_s16[1] == 1) { + HuAudFXPlay(37); + } else { + HuAudFXPlay(40); + } + MGSeqPauseEnableCtrl(0); + work->stat |= 0x10; + } + if(work->time <= 20) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrSet(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + time = work->time; + scale = work->scale_x+(0.5*sin((M_PI*(time*9.0f))/180.0)); + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[0], j, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(j*56)); + HuSprPosSet(work->spr_grp[0], j, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], j, work->scale_x+(sin((M_PI*(time*9.0f))/180.0)), work->scale_y+(sin((M_PI*(time*9.0f))/180.0))); + } + if(time == 20.0f) { + for(i=1; i<4; i++) { + for(j=0; jwork_s16[3]; j++) { + HuSprAttrReset(work->spr_grp[i], j, SPRITE_ATTR_HIDDEN); + } + } + } + } else { + if(work->time > 80 && work->time < 140) { + time = work->time-80; + for(idx=0; idxwork_s16[3]; idx++) { + float radius = (idx*56)-(((work->work_s16[3]-1)*56)/2); + float angle = (1.0f+(1.0f-(ABS(radius)/320.0f)))*720.0f; + float new_scale; + radius *= 1.0-(time/60.0f); + HuSprPosSet(work->spr_grp[0], idx, (radius*sin(M_PI*(((time/60.0f)*angle)+90.0f)/180.0))+work->x, (radius*cos(M_PI*(((time/60.0f)*angle)+90.0f)/180.0))+work->y); + HuSprZRotSet(work->spr_grp[0], idx, -(time/60.0f)*720.0f); + new_scale = 0.5+(0.5*(1.0f-(time/60.0f))); + HuSprScaleSet(work->spr_grp[0], idx, new_scale, new_scale); + HuSprTPLvlSet(work->spr_grp[0], idx, 1.0f-(time/60.0f)); + } + } + } + if(work->time == 140) { + work->stat |= 0x4; + } + if(work->time >= 150) { + work->type = 0; + work->stat |= 0x8; + } + } + } + break; + + case -1: + { + work->work_float[0] += seqSpeed*0.1f; + scale = 1.0f-work->work_float[0]; + if(scale <= 0.0f) { + scale = 0.0f; + work->type = 0; + work->stat |= 0x8; + if(work->work_s16[1] == 0) { + MGSeqPauseEnableCtrl(1); + } + } + for(idx=0; idxwork_s16[3]; idx++) { + HuSprTPLvlSet(work->spr_grp[0], idx, scale); + } + } + break; + + default: + + break; + + } + } + if(seqDoneF || (work->stat & 0x8)) { + MGSeqSprKill(work); + return 0; + } + return 1; +} static int SeqInitDraw(SeqWork *work, va_list params) {