diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index c05a472b..e3a05fe0 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -695,7 +695,7 @@ MGSeqPauseKill = .text:0x8003F360; // type:function size:0xC MGSeqPauseEnableCtrl = .text:0x8003F36C; // type:function size:0x40 MGSeqPracticeInit = .text:0x8003F3AC; // type:function size:0xDC PracticeProc = .text:0x8003F488; // type:function size:0x234 scope:local -SeqSEPlay = .text:0x8003F6BC; // type:function size:0xD4 scope:local +SeqPlayStartFX = .text:0x8003F6BC; // type:function size:0xD4 scope:local MGSeqPracticeExitCheck = .text:0x8003F790; // type:function size:0x128 espInit = .text:0x8003F8B8; // type:function size:0xA0 espEntry = .text:0x8003F958; // type:function size:0x1B0 @@ -4953,7 +4953,7 @@ winWordTbl = .data:0x8012F580; // type:object size:0x18 scope:local winPosOfs = .data:0x8012F598; // type:object size:0x50 scope:local practiceTbl = .data:0x8012F5E8; // type:object size:0xAC scope:local practicePosYTbl = .data:0x8012F694; // type:object size:0xC scope:local -seqFXTbl = .data:0x8012F6A0; // type:object size:0xF0 scope:local +seqStartFXTbl = .data:0x8012F6A0; // type:object size:0xF0 scope:local lbl_8012F790 = .data:0x8012F790; // type:object size:0x15 data:string lbl_8012F7A5 = .data:0x8012F7A5; // type:object size:0x10 data:string lbl_8012F7B5 = .data:0x8012F7B5; // type:object size:0x13 data:string diff --git a/include/game/sprite.h b/include/game/sprite.h index 9a9d27f8..946bf244 100644 --- a/include/game/sprite.h +++ b/include/game/sprite.h @@ -14,7 +14,7 @@ #define SPRITE_ATTR_PAUSED 0x1 #define SPRITE_ATTR_LOOP 0x2 #define SPRITE_ATTR_HIDDEN 0x4 -#define SPIRTE_ATTR_BILINEAR 0x8 +#define SPRITE_ATTR_BILINEAR 0x8 #define SPRITE_ATTR_FUNC 0x10 #define SPRITE_ATTR_NOPAUSE 0x20 #define SPRITE_ATTR_REVERSE 0x40 diff --git a/src/REL/bootDll/main.c b/src/REL/bootDll/main.c index 88601284..2b445351 100644 --- a/src/REL/bootDll/main.c +++ b/src/REL/bootDll/main.c @@ -478,12 +478,12 @@ static void TitleInit(void) sprite_data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 2)); sprite = HuSprCreate(sprite_data, 2, 0); HuSprGrpMemberSet(titleGroup, 2, sprite); - HuSprAttrSet(titleGroup, 2, SPRITE_ATTR_HIDDEN|SPIRTE_ATTR_BILINEAR); + HuSprAttrSet(titleGroup, 2, SPRITE_ATTR_HIDDEN|SPRITE_ATTR_BILINEAR); HuSprPosSet(titleGroup, 2, 288, 380); sprite_data = HuSprAnimReadFile(MAKE_DATA_NUM(DATADIR_TITLE, 9)); sprite = HuSprCreate(sprite_data, 0, 0); HuSprGrpMemberSet(titleGroup, 3, sprite); - HuSprAttrSet(titleGroup, 3, SPRITE_ATTR_HIDDEN|SPIRTE_ATTR_BILINEAR); + HuSprAttrSet(titleGroup, 3, SPRITE_ATTR_HIDDEN|SPRITE_ATTR_BILINEAR); HuSprPosSet(titleGroup, 3, 288, 200); } diff --git a/src/game/board/main.c b/src/game/board/main.c index 27d7992b..6266a194 100644 --- a/src/game/board/main.c +++ b/src/game/board/main.c @@ -2023,7 +2023,7 @@ void BoardLast5GfxInit(void) } BoardSpriteCreate(spr_file, prio, NULL, &work->sprites[i]); HuSprGrpMemberSet(work->group, i, work->sprites[i]); - HuSprAttrSet(work->group, i, SPIRTE_ATTR_BILINEAR); + HuSprAttrSet(work->group, i, SPRITE_ATTR_BILINEAR); HuSprPosSet(work->group, i, last5GfxPosTbl[lastF][i][0], last5GfxPosTbl[lastF][i][1]); } if(!work->is_last) { diff --git a/src/game/minigame_seq.c b/src/game/minigame_seq.c index 42bf3c44..5a4d057f 100644 --- a/src/game/minigame_seq.c +++ b/src/game/minigame_seq.c @@ -10,6 +10,8 @@ void MGSeqStub(void); +void MGSeqPauseEnableCtrl(s32 flag); + extern s16 HuSysVWaitGet(s16 param); typedef struct seq_work SeqWork; @@ -888,6 +890,13 @@ 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; @@ -943,4 +952,312 @@ static AnimData *SeqLoadFontChar(char *str, s16 flags) list++; } return NULL; +} + +static float ForceDefine480() +{ + return 480.0f; +} + +static void SeqPlayStartFX(void); + +static int SeqInitMGBasic(SeqWork *work, va_list params) +{ + s16 i; + s16 word_grp; + + work->work_s16[1] = va_arg(params, int); + if(work->work_s16[1] == 2) { + return SeqInitDraw(work, params); + } + work->type = 0; + work->work_float[0] = 0; + + { + s32 word_katakana; + s32 word_flag; + s32 word_ofs; + word_katakana = 0; + if(work->work_s16[1] == 2 && seqLanguage == 0) { + word_katakana = 1; + } + if(word_katakana) { + word_flag = 1; + } else { + word_flag = 0; + } + if(seqLanguage == 0) { + word_ofs = 0; + } else { + word_ofs = 3; + } + word_grp = SeqMakeWord(work, wordMgTbl[work->work_s16[1]+word_ofs], word_flag); + } + HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f); + + for(i=0; iwork_s16[3]; i++) { + HuSprTPLvlSet(work->spr_grp[word_grp], i, 1.0f); + HuSprPosSet(work->spr_grp[word_grp], i, -100.0f, 240.0f); + } + if(seqPauseF) { + work->type = 2; + HuSprAttrSet(word_grp, 0, SPRITE_ATTR_HIDDEN); + } else { + work->param[0] = 3; + } + return 1; +} + +static int SeqUpdateMGBasic(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->type = -1; + work->work_float[0] = 0.0f; + } + if(work->type != 0) { + switch(work->type) { + case 1: + { + float pos_x; + float time; + s16 i; + if(work->work_s16[1] == 0) { + if(work->time <= 40) { + for(i=0; iwork_s16[3]; i++) { + time = work->time-((20/work->work_s16[3])*(work->work_s16[3]-i-1)); + if(time < 0 || time > 20.0f) { + continue; + } + pos_x = (work->x-(0.5f*(work->work_s16[3]*56)))+28.0f+(i*56); + if(time == 20.0f) { + HuSprPosSet(work->spr_grp[0], i, pos_x, work->y); + HuSprZRotSet(work->spr_grp[0], i, 0.0f); + } else { + HuSprPosSet(work->spr_grp[0], i, pos_x-(((1.0-sin(((time*4.5f)*M_PI)/180.0))*(work->work_s16[3]*56*2))), work->y); + HuSprZRotSet(work->spr_grp[0], i, (time/20.0f)*390.0f); + } + } + } else { + time = work->time-40; + scale = work->scale_x+(0.5*sin(((time*9.0f)*M_PI)/180.0)); + for(i=0; iwork_s16[3]; i++) { + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(i*56)); + HuSprPosSet(work->spr_grp[0], i, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], i, scale, work->scale_y+sin(((time*9.0f)*M_PI)/180.0)); + } + } + if(work->time == 40) { + idx = HuAudFXPlay(36); + work->stat |= 0x10; + } + if(work->time == 60) { + SeqPlayStartFX(); + work->stat |= 0x4; + } + 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) { + time = work->time; + scale = work->scale_x+(0.5*sin(((time*9.0f)*M_PI)/180.0)); + for(i=0; iwork_s16[3]; i++) { + HuSprAttrReset(work->spr_grp[0], i, SPRITE_ATTR_HIDDEN); + pos_x = ((28.0f*scale)+(work->x-(0.5f*(scale*(work->work_s16[3]*56)))))+(scale*(i*56)); + HuSprPosSet(work->spr_grp[0], i, pos_x, work->y); + HuSprScaleSet(work->spr_grp[0], i, work->scale_x+sin(((time*9.0f)*M_PI)/180.0), work->scale_y+sin(((time*9.0f)*M_PI)/180.0)); + } + if(time == 20.0f) { + for(i=0; iwork_s16[3]; i++) { + HuSprAttrReset(work->spr_grp[0], i, SPRITE_ATTR_HIDDEN); + } + } + } else { + if(work->time > 80) { + for(i=0; iwork_s16[3]; i++) { + time = (work->time-80)-((20/work->work_s16[3])*(work->work_s16[3]-i-1)); + if(time < 0.0f || time > 20.0f) { + continue; + } + pos_x = (28.0f+(work->x-(0.5f*(work->work_s16[3]*56))))+(i*56); + if(time == 20.0f) { + HuSprAttrSet(work->spr_grp[0], i, SPRITE_ATTR_HIDDEN); + } else { + HuSprPosSet(work->spr_grp[0], i, pos_x+((1.0-cos(((time*4.5f)*M_PI)/180.0f))*(work->work_s16[3]*56*2)), work->y); + HuSprZRotSet(work->spr_grp[0], i, (time/20.0f)*390.0f); + } + } + } + } + if(work->time == 110) { + work->stat |= 0x4; + } + if(work->time >= 110) { + work->type = 0; + work->stat |= 8; + } + } + } + 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 SeqInitMGCommon(SeqWork *work, va_list params) +{ + s16 i; + float tp_lvl; + s16 j; + + s16 word_grp; + + work->work_s16[1] = va_arg(params, int); + if(work->work_s16[1] == 2) { + return SeqInitDraw(work, params); + } + work->type = 0; + work->work_float[0] = 0; + tp_lvl = 1.0f; + for(i=0; i<4; i++) { + + if(i == 0) + { + s32 word_katakana; + s32 word_flag; + s32 word_ofs; + word_katakana = 0; + if(work->work_s16[1] == 2 && seqLanguage == 0) { + word_katakana = 1; + } + if(word_katakana) { + word_flag = 1; + } else { + word_flag = 0; + } + if(seqLanguage == 0) { + word_ofs = 0; + } else { + word_ofs = 3; + } + word_grp = SeqMakeWord(work, wordMgTbl[work->work_s16[1]+word_ofs], word_flag); + } else { + s16 grp_idx; + s32 new_grp; + for(grp_idx=0; grp_idx<16; grp_idx++) { + if(work->spr_grp[grp_idx] == -1) { + break; + } + } + if(grp_idx == 16) { + new_grp = -1; + } else { + work->spr_grp[grp_idx] = HuSprGrpCopy(work->spr_grp[word_grp]); + new_grp = grp_idx; + } + (void)new_grp; + word_grp = new_grp; + } + HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f); + for(j=0; jwork_s16[3]; j++) { + HuSprTPLvlSet(work->spr_grp[word_grp], j, tp_lvl); + HuSprPosSet(work->spr_grp[word_grp], j, -100.0f, 240.0f); + HuSprPriSet(work->spr_grp[word_grp], j, i+5); + HuSprAttrSet(work->spr_grp[word_grp], i, SPRITE_ATTR_BILINEAR); + } + if(i == 0) { + tp_lvl -= 0.5; + } else { + tp_lvl -= 0.1f; + } + } + if(seqPauseF) { + work->type = 2; + HuSprAttrSet(word_grp, 0, SPRITE_ATTR_HIDDEN); + } else { + work->param[0] = 3; + } + return 1; +} + +static int SeqInitDraw(SeqWork *work, va_list params) +{ + +} + +static void SeqPlayStartFX(void) +{ + +} + +void MGSeqPauseEnableCtrl(s32 flag) +{ + } \ No newline at end of file diff --git a/src/game/sprman.c b/src/game/sprman.c index 5f5c25d4..e0f940ab 100644 --- a/src/game/sprman.c +++ b/src/game/sprman.c @@ -675,7 +675,7 @@ void HuSprSprBGSet(short sprite, AnimData *bg, short bg_bank) sprite_ptr->bg = bg; sprite_ptr->bg_bank = bg_bank; sprite_ptr->wrap_t = sprite_ptr->wrap_s = GX_REPEAT; - sprite_ptr->attr &= ~SPIRTE_ATTR_BILINEAR; + sprite_ptr->attr &= ~SPRITE_ATTR_BILINEAR; } void AnimDebug(AnimData *anim) diff --git a/src/game/sprput.c b/src/game/sprput.c index faf8ea73..5e1a923f 100644 --- a/src/game/sprput.c +++ b/src/game/sprput.c @@ -123,7 +123,7 @@ void HuSprDisp(SpriteData *sprite) continue; } GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); - HuSprTexLoad(anim, layer->bmpNo, 0, sprite->wrap_s, sprite->wrap_t, (sprite->attr & SPIRTE_ATTR_BILINEAR) ? GX_LINEAR : GX_NEAR); + HuSprTexLoad(anim, layer->bmpNo, 0, sprite->wrap_s, sprite->wrap_t, (sprite->attr & SPRITE_ATTR_BILINEAR) ? GX_LINEAR : GX_NEAR); if(layer->alpha != 255 || color_sum != 255*4) { color.a = (u16)(sprite->a*layer->alpha) >> 8; GXSetTevColor(GX_TEVSTAGE1, color);