marioparty4/src/game/minigame_seq.c
dbalatoni13 3b50a4bdb7 Split Japanese DOL till saveload.c
Renamed VERSION_JAP to VERSION_JPN because it might be offensive for some
2024-11-26 16:48:31 +01:00

3644 lines
123 KiB
C

#include "game/armem.h"
#include "game/disp.h"
#include "game/gamework_data.h"
#include "game/hsfman.h"
#include "game/object.h"
#include "game/objsub.h"
#include "game/pad.h"
#include "game/process.h"
#include "game/sprite.h"
#include "game/window.h"
#include "game/wipe.h"
#include "game/minigame_seq.h"
#include "math.h"
#include "stdarg.h"
#include "version.h"
#undef abs
#define ABS(x) (((x) < 0) ? -(x) : (x))
extern s16 HuSysVWaitGet(s16 param);
typedef struct seq_info {
SeqInitFunc init;
SeqUpdateFunc update;
float x;
float y;
float scale_x;
float scale_y;
s32 time_max;
} SeqInfo;
OverlayID mgSeqOvlPrev = OVL_INVALID;
static SeqInfo seqInfoTbl[] = {
{ NULL, NULL, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 60 },
{ MGSeqInitTimer, MGSeqUpdateTimer, HU_DISP_CENTERX + 4, 64.0f, 1.0f, 1.0f, 60 },
{ MGSeqInitType2, MGSeqUpdateType2, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 0.5f, 0.5f, 60 },
{ MGSeqInitMGBasic, MGSeqUpdateMGBasic, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitMGCommon, MGSeqUpdateMG1vs3, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitWin, MGSeqUpdateWin, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitMGCommon, MGSeqUpdateMGBattle, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitMGCommon, MGSeqUpdateMGStory, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitMGBasic, MGSeqUpdateMGBasic, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitMGCommon, MGSeqUpdateMG2vs2, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitFlip, MGSeqUpdateFlip, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitMGCommon, MGSeqUpdateMGBowser, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitWin, MGSeqUpdateWin, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ MGSeqInitDraw, MGSeqUpdateDraw, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 60 },
{ MGSeqInitRecord, MGSeqUpdateRecord, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 180 },
{ NULL, NULL, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 60 },
{ NULL, NULL, HU_DISP_CENTERX + 4, HU_DISP_CENTERY, 1.0f, 1.0f, 60 },
};
static s32 seqType2SprTbl[6] = { 0, 0, 0, 0, 0, 0 };
static s16 mgSeqTypeTbl[9] = {
MG_SEQ_TYPE_4P,
MG_SEQ_TYPE_1VS3,
MG_SEQ_TYPE_2VS2,
MG_SEQ_TYPE_BOWSER,
MG_SEQ_TYPE_BATTLE,
MG_SEQ_TYPE_PINBALL,
MG_SEQ_TYPE_STORY,
MG_SEQ_TYPE_BOWSER,
MG_SEQ_TYPE_STORY,
};
static char lbl_8012F336[] = {
"アイウエオカキク"
"ケコサシスセソタ"
"チツテトナニヌネ"
"ノハヒフヘホマミ"
"ムメモヤユヨラリ"
"ルレロワヲンァィ"
"ゥェォャュョッカ"
"キクコサシスセソ"
"タチツテトハヒフ"
"ヘホハヒフヘホ"
"!?ー",
};
static char lbl_8012F389[] = "x first\n";
static char lbl_8012F392[] = "y first\n";
static SeqWork seqWorkData[8];
static s16 seqTimer;
static u8 seqDoneF;
u8 lbl_801D3D94;
static s16 seqSpeed;
static s16 seqPauseF;
static int seqRecordVal;
static s32 pauseWaitF;
static s32 pauseExitF;
static s32 pauseActiveF;
static Process *pauseProcess;
static s32 seqLanguage;
void fn_80036BC8(void);
void MGSeqInit(void)
{
s32 i;
SeqWork *work;
work = &seqWorkData[0];
for (i = 8; i != 0; i--, work++) {
work->seq_no = 0;
work->data = NULL;
}
seqPauseF = 0;
seqDoneF = 0;
lbl_801D3D94 = 0;
seqTimer = 30;
HuAR_DVDtoARAM(DATADIR_GAMEMES);
HuAR_DVDtoARAM(DATADIR_MGCONST);
while (HuARDMACheck())
;
fn_80036BC8();
mgSeqOvlPrev = -1;
seqLanguage = GWLanguageGet();
}
void MGSeqMain(void)
{
SeqInfo *info;
s32 i;
s32 j;
s32 alive_flag;
u8 stat;
SeqWork *work;
seqSpeed = HuSysVWaitGet(seqSpeed);
if (Hu3DPauseF) {
return;
}
alive_flag = 0;
stat = 0;
work = &seqWorkData[0];
for (i = 0; i < 8; i++, work++) {
if (work->stat == 0) {
continue;
}
if (work->update) {
alive_flag = work->update(work);
}
else {
info = &seqInfoTbl[work->seq_no];
if (work->seq_no != 0 && NULL != info->update) {
alive_flag = info->update(work);
}
}
if (!alive_flag) {
work->stat = 0;
if (!lbl_801D3D94) {
for (j = 0; j < 8; j++) {
if (seqWorkData[j].stat) {
break;
}
}
}
if (!work->data) {
HuMemDirectFree(work->data);
work->data = NULL;
}
}
stat |= work->stat;
}
if (!stat || stat & 0x4) {
if (seqTimer > 0) {
seqTimer -= seqSpeed;
}
}
}
static s16 CreateSeq(s16 seq_no, va_list params)
{
SeqWork *work;
SeqInfo *info;
s32 i;
s32 temp;
work = seqWorkData;
info = &seqInfoTbl[(u8)seq_no];
for (i = 0; i < 8; i++, work++) {
if (work->stat == 0) {
break;
}
}
if (i >= 8) {
return -1;
}
work->stat |= 0x1;
if (work->data) {
HuMemDirectFree(work->data);
}
work->data = NULL;
work->seq_no = (u8)seq_no;
work->time = 0;
work->x = info->x;
work->y = info->y;
work->scale_x = info->scale_x;
work->scale_y = info->scale_y;
work->unk_18 = 0.0f;
work->unk_7D = 255;
work->time_max = info->time_max;
work->timer_val = work->state = work->alt_word_len = work->word_len = 0;
work->angle = work->win_scale = 0.0f;
work->param[0] = work->param[1] = 0;
for (temp = 0; temp < 16; temp++) {
work->sprite[temp] = work->spr_grp[temp] = -1;
}
if (NULL != info->init) {
temp = info->init(work, params);
if (temp == 0) {
work->stat = 0;
return -1;
}
}
seqTimer = 30;
return i;
}
s16 MGSeqCreate(s16 type, ...)
{
s16 ret;
va_list params;
va_start(params, type);
if (type == MG_SEQ_TYPE_AUTO) {
if (GWSystem.mg_next == 0xFFFF) {
type = MG_SEQ_TYPE_4P;
}
else {
type = mgSeqTypeTbl[mgInfoTbl[GWSystem.mg_next].type];
}
}
ret = CreateSeq(type, params);
va_end(params);
return ret;
}
u8 MGSeqStatGet(s16 id)
{
SeqWork *work;
u8 ret = 0;
if (id < 0) {
s32 i;
work = seqWorkData;
for (i = 8; i != 0; i--, work++) {
ret |= work->stat;
}
}
else {
if (id < 8) {
ret = seqWorkData[id].stat;
}
}
return ret;
}
void MGSeqPosSet(s16 id, float x, float y)
{
if (id >= 0 && id < 8) {
seqWorkData[id].x = x;
seqWorkData[id].y = y;
}
}
void MGSeqParamSet(s16 id, s16 param1, s16 param2)
{
if (id >= 0 && id < 8) {
seqWorkData[id].param[0] = param1;
seqWorkData[id].param[1] = param2;
}
}
void MGSeqKill(s16 id)
{
if (id >= 0 && id < 8) {
if (seqWorkData[id].stat != 0) {
seqWorkData[id].stat = 8;
}
}
}
void MGSeqKillAll(void)
{
seqDoneF = 1;
MGSeqMain();
seqDoneF = 0;
MGSeqStub();
lbl_801D3D94 = 0;
}
s32 MGSeqDoneCheck(void)
{
u8 stat = MGSeqStatGet(-1);
if (stat == 0 || (stat & 0xC)) {
if (seqTimer <= 0 || (stat & 0x8)) {
return 1;
}
}
return 0;
}
void MGSeqStub(void) { }
void MGSeqSprKill(SeqWork *work)
{
s32 i;
for (i = 0; i < 16; i++) {
if (work->spr_grp[i] >= 0) {
HuSprGrpKill(work->spr_grp[i]);
}
if (work->sprite[i] >= 0) {
HuSprKill(work->sprite[i]);
}
}
}
static void *SeqReadFile(s32 file)
{
return HuAR_ARAMtoMRAMFileRead(file, MEMORY_DEFAULT_NUM, HEAP_DATA);
}
s32 MGSeqInitTimer(SeqWork *work, va_list params)
{
AnimData *spr_anim;
s16 sprite;
s16 spr_grp;
int duration, x, y;
s16 i;
duration = va_arg(params, int);
x = va_arg(params, int);
y = va_arg(params, int);
if (duration <= 0 && duration > 99) {
duration = 99;
}
work->timer_val = duration;
if (x >= 0) {
work->x = x;
}
if (y >= 0) {
work->y = y;
}
work->alt_word_len = 0;
work->state = 2;
work->angle = 0;
work->spr_grp[0] = spr_grp = HuSprGrpCreate(4);
HuSprGrpScaleSet(spr_grp, work->scale_x, work->scale_y);
spr_anim = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 2)));
x = 12;
for (i = 0; i < 2; i++) {
sprite = HuSprCreate(spr_anim, 5, 0);
HuSprGrpMemberSet(spr_grp, i, sprite);
HuSprSpeedSet(spr_grp, i, 0);
HuSprPosSet(spr_grp, i, x, 0);
HuSprColorSet(spr_grp, i, 112, 233, 255);
x -= 24;
(void)i; // Hack for Matching
}
spr_anim = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 1)));
sprite = HuSprCreate(spr_anim, 7, 0);
HuSprGrpMemberSet(spr_grp, 2, sprite);
HuSprPosSet(spr_grp, 2, 0, 0);
HuSprTPLvlSet(spr_grp, 2, 0.5f);
HuSprColorSet(spr_grp, 2, 0, 0, 0);
spr_anim = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 0)));
sprite = HuSprCreate(spr_anim, 6, 0);
HuSprGrpMemberSet(spr_grp, 3, sprite);
HuSprPosSet(spr_grp, 3, 0, 0);
if (seqPauseF) {
work->state = 1;
for (i = 0; i < 2; i++) {
HuSprAttrSet(spr_grp, i, HUSPR_ATTR_DISPOFF);
#if VERSION_NTSC
//(void)i; //Hack for Matching
#endif
}
}
#if VERSION_PAL
HuSprGrpPosSet(spr_grp, -1000.0f, 0.0f);
#endif
return 1;
}
s32 MGSeqUpdateTimer(SeqWork *work)
{
float scale;
float tp_lvl;
u8 digits[2];
s16 i;
s16 spr_grp = work->spr_grp[0];
if (work->param[0] != 0 && work->state != -1) {
switch (work->param[0]) {
case 2:
switch (work->param[1]) {
case -1:
work->stat |= 0x4;
work->state = -1;
work->angle = 0.0f;
break;
case 0:
work->state = 2;
work->angle = 0.0f;
break;
case 1:
work->state = 3;
work->angle = 0.0f;
break;
default:
break;
}
work->param[0] = 0;
break;
case 1:
if (work->param[1] < 0 && !(work->stat & 0x4)) {
work->stat |= 0x4;
work->state = -1;
work->angle = 0.0f;
}
else {
if (work->param[1] > 99) {
work->timer_val = 99;
}
else {
if (work->timer_val != work->param[1]) {
work->timer_val = work->param[1];
if (work->param[1] <= 5) {
HuAudFXPlay(6);
work->state = 3;
work->angle = 0.0f;
HuSprColorSet(spr_grp, 0, 255, 112, 160);
HuSprColorSet(spr_grp, 1, 255, 112, 160);
}
else {
HuSprColorSet(spr_grp, 0, 112, 233, 255);
HuSprColorSet(spr_grp, 1, 112, 233, 255);
}
}
}
}
work->param[0] = 0;
break;
case 3:
for (i = 0; i < 2; i++) {
HuSprAttrReset(spr_grp, i, HUSPR_ATTR_DISPOFF);
}
work->state = 3;
work->param[0] = 0;
break;
default:
work->param[0] = 0;
break;
}
}
if (work->state == 1) {
return 1;
}
if (work->timer_val > 99) {
digits[0] = digits[1] = 9;
}
else {
s32 value;
value = work->timer_val / 10;
digits[1] = value;
digits[0] = work->timer_val - (value * 10);
}
HuSprGrpPosSet(spr_grp, work->x, work->y);
HuSprGrpScaleSet(spr_grp, work->scale_x, work->scale_y);
for (i = 0; i < 2; i++) {
HuSprBankSet(spr_grp, i, digits[i]);
}
if (work->state != 0) {
switch (work->state) {
case 2: {
float scale_x, scale_y;
scale = fabs(((sin((work->angle * M_PI) / 180) * 5.0f) + 1.0f) - (sin((130 * M_PI) / 180) * 5.0f));
scale_x = work->scale_x * scale;
scale_y = work->scale_y * scale;
work->angle += seqSpeed * 5.0f;
if (work->angle > 130.0f) {
work->state = 0;
break;
}
HuSprGrpScaleSet(spr_grp, scale_x, scale_y);
} break;
case 3: {
scale = sin((work->angle * M_PI) / 180) + 1.0;
tp_lvl = 1.0 - (sin((work->angle * M_PI) / 180) * 0.5);
work->angle += seqSpeed * 18.0f;
if (work->angle > 180.0f) {
work->state = 0;
scale = 1.0f;
tp_lvl = 1.0f;
}
for (i = 0; i < 2; i++) {
HuSprScaleSet(spr_grp, i, scale, scale);
HuSprTPLvlSet(spr_grp, i, tp_lvl);
}
} break;
case -1:
HuSprGrpScaleSet(spr_grp, work->scale_x, work->scale_y);
for (i = 0; i < 2; i++) {
HuSprScaleSet(spr_grp, i, 1.0f, 1.0f);
}
work->angle += 1.0f;
if (work->angle < 60.0f) {
break;
}
tp_lvl = 1.0 - ((work->angle - 60.0f) / 20.0f);
if (tp_lvl <= 0.0f) {
tp_lvl = 0.0f;
work->state = 0;
work->stat |= 0x8;
}
for (i = 0; i < 4; i++) {
HuSprTPLvlSet(spr_grp, i, tp_lvl);
}
break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
else {
return 1;
}
}
s32 MGSeqInitType2(SeqWork *work, va_list params)
{
s16 spr_idx;
s16 spr_grp;
AnimData *anim_tbl[6];
s32 i;
s16 len;
char *str;
char c;
int time_max;
int x, y;
work->data = va_arg(params, void *);
time_max = va_arg(params, int);
x = va_arg(params, int);
y = va_arg(params, int);
if (time_max < 0) {
time_max = -1;
}
work->time_max = time_max;
if (x >= 0) {
work->x = x;
}
if (y >= 0) {
work->y = y;
}
work->state = 0;
work->angle = 0.0f;
x = 0;
len = 0;
str = work->data;
while (c = *str++) {
if (c >= '0' && c <= '9') {
x |= 1;
len++;
}
else if (c >= 'A' && c <= 'Z') {
x |= 2;
len++;
}
else if (c >= 'a' && c <= 'z') {
x |= 4;
len++;
}
else if (c == '!' || c == '?') {
x |= 8;
len++;
}
}
work->word_len = len;
for (i = 0; i < 6; i++) {
if (x & (1 << i)) {
anim_tbl[i] = HuSprAnimRead(SeqReadFile(seqType2SprTbl[i]));
}
else {
anim_tbl[i] = NULL;
}
}
work->spr_grp[0] = spr_grp = HuSprGrpCreate(len);
x = 0;
spr_idx = 0;
str = work->data;
while (c = *str++) {
i = -2;
if (c >= '0' && c <= '9') {
c -= '0';
i = 0;
}
else if (c >= 'A' && c <= 'Z') {
c -= 'A';
i = 1;
}
else if (c >= 'a' && c <= 'z') {
c -= 'a';
i = 2;
}
else if (c == '!' || c == '?') {
if (c == '!') {
c = 0;
}
else {
c = 1;
}
i = 3;
}
else if (c == ' ') {
i = -1;
}
work->alt_word_len = x;
if (i == -1) {
x += 32;
}
else if (i >= 0) {
s16 sprite = HuSprCreate(anim_tbl[i], 5, c);
HuSprGrpMemberSet(spr_grp, spr_idx, sprite);
HuSprSpeedSet(spr_grp, spr_idx, 0.0f);
HuSprPosSet(spr_grp, spr_idx, x, 0.0f);
spr_idx++;
x += 64;
}
}
if (seqPauseF) {
work->state = 1;
for (i = 0; i < work->word_len; i++) {
HuSprAttrSet(spr_grp, i, HUSPR_ATTR_DISPOFF);
}
}
return 1;
}
s32 MGSeqUpdateType2(SeqWork *work)
{
float tp_lvl;
s16 spr_grp;
spr_grp = work->spr_grp[0];
HuSprGrpPosSet(spr_grp, work->x - ((0.5f * work->scale_x) * work->alt_word_len), work->y);
HuSprGrpScaleSet(spr_grp, work->scale_x, work->scale_y);
if (work->param[0] != 0 && work->state != -1) {
switch (work->param[0]) {
case 2:
if (work->param[1] != -1) {
(void)work; // HACK: to introduce extra branch
}
else {
work->state = -1;
work->angle = 0.0f;
}
work->param[0] = 0;
break;
case 1:
work->time_max = work->param[1];
work->param[0] = 0;
break;
case 3: {
s32 i;
for (i = 0; i < work->word_len; i++) {
HuSprAttrReset(spr_grp, i, HUSPR_ATTR_DISPOFF);
(void)i;
}
work->state = 0;
work->param[0] = 0;
} break;
default:
work->param[0] = 0;
break;
}
}
if (work->state == 1) {
return 1;
}
work->time += seqSpeed;
if (work->time >= work->time_max && work->state != -1) {
work->stat |= 0x4;
work->state = -1;
work->angle = 0.0f;
}
if (work->state != 0) {
if (work->state != -1) {
(void)work; // HACK: to introduce extra branch
}
else {
s16 i;
work->angle += seqSpeed * 0.1f;
tp_lvl = 1.0f - work->angle;
if (tp_lvl <= 0.0f) {
tp_lvl = 0.0f;
work->state = 0;
work->stat |= 0x8;
}
for (i = 0; i < work->word_len; i++) {
HuSprTPLvlSet(spr_grp, i, tp_lvl);
(void)i;
}
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
else {
return 1;
}
}
static char seqFontAlphaTbl[] = { "ABCDEFGH"
"IJKLMNOP"
"QRSTUVWX"
"YZabcdef"
"ghijklmn"
"opqrstuv"
"wxyz" };
static char seqFontKanaTbl[] = { "アイウエオカキク"
"ケコサシスセソタ"
"チツテトナニヌネ"
"ノハヒフヘホマミ"
"ムメモヤユヨラリ"
"ルレロワヲンァィ"
"ゥェォャュョッカ"
"キクケコサシスセ"
"ソタチツテトハヒ"
"フヘホハヒフヘホ"
"" };
static char seqFontNumTbl[] = "0123456789";
static s32 *letterBufTbl[5] = {};
static char wordStartE[] = "START!";
static char seqPunctTbl[] = "!?";
static char wordStartJ[] = "スタート!";
static char wordFinishJ[] = "フィニッシュ!";
static char wordDrawJ[] = "ヒキワケ!";
static char wordFinishE[] = "FINISH!";
static char wordDrawE[] = "DRAW!";
static char *wordMgTbl[6] = {
wordStartJ,
wordFinishJ,
wordDrawJ,
wordStartE,
wordFinishE,
wordDrawE,
};
void fn_80036BC8(void)
{
if (!letterBufTbl[0]) {
letterBufTbl[0] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32) * strlen(seqFontAlphaTbl));
memset(letterBufTbl[0], 0, sizeof(s32) * strlen(seqFontAlphaTbl));
}
if (!letterBufTbl[1]) {
letterBufTbl[1] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32) * strlen(seqFontKanaTbl));
memset(letterBufTbl[1], 0, sizeof(s32) * strlen(seqFontKanaTbl));
}
if (!letterBufTbl[2]) {
letterBufTbl[2] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32) * strlen(seqFontKanaTbl));
memset(letterBufTbl[2], 0, sizeof(s32) * strlen(seqFontKanaTbl));
}
if (!letterBufTbl[3]) {
letterBufTbl[3] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32) * strlen(seqFontNumTbl));
memset(letterBufTbl[3], 0, sizeof(s32) * strlen(seqFontNumTbl));
}
if (!letterBufTbl[4]) {
letterBufTbl[4] = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s32) * strlen(seqPunctTbl));
memset(letterBufTbl[4], 0, sizeof(s32) * strlen(seqPunctTbl));
}
}
static AnimData *SeqLoadFontChar(char *str, s16 flags);
static s32 SeqMakeWord(SeqWork *work, char *str, s16 flags)
{
s16 len;
s16 x;
s16 i;
s16 grp_idx;
#if VERSION_JPN
char *str_ptr;
AnimData **char_anim;
s16 *char_pos;
#else
AnimData **char_anim;
s16 *char_pos;
char *str_ptr;
#endif
s16 spr_grp;
for (grp_idx = 0; grp_idx < 16; grp_idx++) {
if (work->spr_grp[grp_idx] == -1) {
break;
}
}
if (grp_idx == 16) {
return -1;
}
char_anim = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(AnimData *) * 100);
char_pos = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(s16) * 100);
str_ptr = str;
x = 0;
len = 0;
while (*str_ptr != '\0') {
#if VERSION_JPN
if (*str_ptr == ' ') {
x += 56;
}
else {
char_anim[len] = SeqLoadFontChar(str_ptr, flags);
if (char_anim[len]) {
char_pos[len] = x;
x += 56;
len++;
}
}
#else
char_anim[len] = SeqLoadFontChar(str_ptr, flags);
if (char_anim[len]) {
char_pos[len] = x;
x += 56;
len++;
}
#endif
str_ptr++;
}
work->spr_grp[grp_idx] = spr_grp = HuSprGrpCreate(len);
x = (x / 2) - 28;
for (i = 0; i < len; i++) {
s16 sprite = HuSprCreate(char_anim[i], 5, 0);
HuSprGrpMemberSet(spr_grp, i, sprite);
HuSprPosSet(spr_grp, i, char_pos[i] - x, 0.0f);
}
work->word_len = len;
HuMemDirectFree(char_anim);
HuMemDirectFree(char_pos);
return grp_idx;
}
static AnimData *SeqLoadFontChar(char *str, s16 flags)
{
s32 data_num;
s16 id;
char *list;
char c = *str;
if (c == 222 || c == 223) {
return NULL;
}
#if !VERSION_JPN
if (c == 32) {
return HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 10)));
}
#endif
for (id = 0, list = seqFontAlphaTbl; *list != 0; id++, list++) {
if (*list == c) {
data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id + (VERSION_JPN ? 20 : 21));
return HuSprAnimRead(SeqReadFile(data_num));
}
}
for (id = 0, list = seqFontNumTbl; *list != 0; id++, list++) {
if (*list == c) {
data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id + (VERSION_JPN ? 10 : 11));
return HuSprAnimRead(SeqReadFile(data_num));
}
}
for (id = 0, list = seqPunctTbl; *list != 0; id++, list++) {
if (*list == c) {
data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id + (VERSION_JPN ? 153 : 154));
return HuSprAnimRead(SeqReadFile(data_num));
}
}
if (str[1] == 222) { // ゛
list = seqFontKanaTbl;
list += 55;
id = 55;
}
else if (str[1] == 223) { // ゜
list = seqFontKanaTbl;
list += 75;
id = 75;
}
else {
list = seqFontKanaTbl;
id = 0;
}
while (*list != 0) {
if (*list == c) {
if (flags & 0x1) {
data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id + (VERSION_JPN ? 155 : 156));
}
else {
data_num = DATA_MAKE_NUM(DATADIR_GAMEMES, id + (VERSION_JPN ? 72 : 73));
}
return HuSprAnimRead(SeqReadFile(data_num));
}
id++;
list++;
}
return NULL;
}
static float ForceDefine480()
{
return 480.0f;
}
static void SeqPlayStartFX(void);
s32 MGSeqInitMGBasic(SeqWork *work, va_list params)
{
s16 i;
s16 word_grp;
work->state = va_arg(params, int);
if (work->state == 2) {
return MGSeqInitDraw(work, params);
}
work->type = 0;
work->angle = 0;
{
s32 word_katakana;
s32 word_flag;
s32 word_ofs;
word_katakana = 0;
if (work->state == 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->state + word_ofs], word_flag);
}
HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f);
for (i = 0; i < work->word_len; i++) {
HuSprTPLvlSet(work->spr_grp[word_grp], i, 1.0f);
HuSprPosSet(work->spr_grp[word_grp], i, -100.0f, HU_DISP_CENTERY);
}
if (seqPauseF) {
work->type = 2;
HuSprAttrSet(word_grp, 0, HUSPR_ATTR_DISPOFF);
}
else {
work->param[0] = 3;
}
return 1;
}
s32 MGSeqUpdateMGBasic(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->angle = 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->angle = 0.0f;
}
if (work->type) {
switch (work->type) {
case 1: {
float pos_x;
float time;
s16 i;
if (work->state == 0) {
if (work->time <= 40) {
for (i = 0; i < work->word_len; i++) {
time = work->time - ((20 / work->word_len) * (work->word_len - i - 1));
if (time < 0 || time > 20.0f) {
continue;
}
pos_x = (work->x - (0.5f * (work->word_len * 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->word_len * 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; i < work->word_len; i++) {
pos_x = ((28.0f * scale) + (work->x - (0.5f * (scale * (work->word_len * 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->state == 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; i < work->word_len; i++) {
HuSprAttrReset(work->spr_grp[0], i, HUSPR_ATTR_DISPOFF);
pos_x = ((28.0f * scale) + (work->x - (0.5f * (scale * (work->word_len * 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; i < work->word_len; i++) {
HuSprAttrReset(work->spr_grp[0], i, HUSPR_ATTR_DISPOFF);
}
}
}
else {
if (work->time > 80) {
for (i = 0; i < work->word_len; i++) {
time = (work->time - 80) - ((20 / work->word_len) * (work->word_len - i - 1));
if (time < 0.0f || time > 20.0f) {
continue;
}
pos_x = (28.0f + (work->x - (0.5f * (work->word_len * 56)))) + (i * 56);
if (time == 20.0f) {
HuSprAttrSet(work->spr_grp[0], i, HUSPR_ATTR_DISPOFF);
}
else {
HuSprPosSet(work->spr_grp[0], i,
pos_x + ((1.0 - cos(((time * 4.5f) * M_PI) / 180.0f)) * (work->word_len * 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->angle += seqSpeed * 0.1f;
scale = 1.0f - work->angle;
if (scale <= 0.0f) {
scale = 0.0f;
work->type = 0;
work->stat |= 0x8;
if (work->state == 0) {
MGSeqPauseEnableCtrl(1);
}
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[0], idx, scale);
}
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
s32 MGSeqInitMGCommon(SeqWork *work, va_list params)
{
s16 i;
float tp_lvl;
s16 j;
s16 word_grp;
work->state = va_arg(params, int);
if (work->state == 2) {
return MGSeqInitDraw(work, params);
}
work->type = 0;
work->angle = 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->state == 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->state + 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; j < work->word_len; j++) {
HuSprTPLvlSet(work->spr_grp[word_grp], j, tp_lvl);
HuSprPosSet(work->spr_grp[word_grp], j, -100.0f, HU_DISP_CENTERY);
HuSprPriSet(work->spr_grp[word_grp], j, i + 5);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
}
if (i == 0) {
tp_lvl -= 0.5;
}
else {
tp_lvl -= 0.1f;
}
}
if (seqPauseF) {
work->type = 2;
HuSprAttrSet(word_grp, 0, HUSPR_ATTR_DISPOFF);
}
else {
work->param[0] = 3;
}
return 1;
}
s32 MGSeqUpdateMGBattle(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->angle = 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->angle = 0.0f;
}
if (work->type) {
switch (work->type) {
case 1: {
s16 i, j;
float time;
float pos_x;
if (work->state == 0) {
if (work->time < 45) {
if (work->time > 10 && work->time <= 40) {
time = work->time - 10;
scale = 10.0f * (1.0f - (time / 30.0f));
pos_x = (work->x - (0.5f * (work->word_len * 56))) + 28.0f;
HuSprPosSet(work->spr_grp[0], 0, pos_x, work->y);
HuSprScaleSet(work->spr_grp[0], 0, work->scale_x + scale, work->scale_y + scale);
scale = time / 30.0f;
HuSprTPLvlSet(work->spr_grp[0], 0, scale);
}
for (i = 0; i < 4; i++) {
time = work->time - i;
if (time < 0 || time > 40) {
continue;
}
for (j = 1; j < work->word_len; j++) {
pos_x = (28.0f + (work->x - (0.5f * (work->word_len * 56)))) + (j * 56);
if (time == 40.0f) {
HuSprPosSet(work->spr_grp[i], j, pos_x, work->y);
HuSprZRotSet(work->spr_grp[i], j, 0.0f);
HuSprScaleSet(work->spr_grp[i], j, work->scale_x, work->scale_y);
if (i != 0) {
HuSprAttrSet(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
else {
s16 discard_cnt;
static float letterOfs[] = { 30, 20, 20, 3, -4, 20, -30, 20, 20, 20, -30, 20, -10, 40, 10, -40 };
float x, y;
float ofs_x, ofs_y;
float zrot, scale_ang;
x = pos_x;
y = work->y;
ofs_x = letterOfs[((j - 1) & 0x7) * 2];
ofs_y = letterOfs[(((j - 1) & 0x7) * 2) + 1];
zrot = 0.0f;
discard_cnt = 0;
scale_ang = 0.0f;
for (idx = 0; idx < 40.0f - time; idx++) {
if (x + ofs_x > HU_DISP_WIDTH || x + ofs_x < 0) {
ofs_x = -ofs_x;
discard_cnt++;
}
if (y + ofs_y > HU_DISP_HEIGHT || y + ofs_y < 0) {
ofs_y = -ofs_y;
discard_cnt++;
}
if (discard_cnt) {
zrot += 20.0f;
scale_ang = 0.0f;
}
x += ofs_x;
y += ofs_y;
}
HuSprPosSet(work->spr_grp[i], j, x, y);
HuSprScaleSet(work->spr_grp[i], j, work->scale_x * cos((M_PI * scale_ang) / 180.0), work->scale_y);
HuSprZRotSet(work->spr_grp[i], j, zrot);
}
}
}
}
else {
if (work->time > 60) {
time = work->time - 60;
scale = 0.5 * sin((M_PI * (time * 9.0f)) / 180.0);
for (j = 0; j < work->word_len; j++) {
pos_x = (28.0f * (scale + work->scale_x)) + (work->x - (0.5f * ((work->word_len * 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 == 60) {
HuAudFXPlay(36);
work->stat |= 0x10;
}
if (work->time == 80) {
work->stat |= 0x4;
SeqPlayStartFX();
}
if (work->time >= 80) {
work->type = 0;
}
}
else {
if (work->time == 1) {
if (work->state == 1) {
HuAudFXPlay(37);
}
else {
HuAudFXPlay(40);
}
MGSeqPauseEnableCtrl(0);
work->stat |= 0x10;
}
if (work->time <= 20) {
for (i = 1; i < 4; i++) {
for (j = 0; j < work->word_len; j++) {
HuSprAttrSet(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
time = work->time;
scale = work->scale_x + (0.5 * sin((M_PI * (time * 9.0f)) / 180.0));
for (j = 0; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[0], j, HUSPR_ATTR_DISPOFF);
pos_x = ((28.0f * scale) + (work->x - (0.5f * (scale * (work->word_len * 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 (j = 0; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[0], j, HUSPR_ATTR_DISPOFF);
}
}
}
else {
if (work->time > 80 && work->time <= 95) {
time = work->time - 80;
for (j = 0; j < work->word_len; j++) {
pos_x = (28.0f + (work->x - (0.5f * (work->word_len * 56)))) + (j * 56);
HuSprPosSet(
work->spr_grp[0], j, pos_x + ((HU_DISP_CENTERX - pos_x) * (1.0 - cos((M_PI * (time * 6.0)) / 180.0))), work->y);
}
if (time == 15.0f) {
for (j = 0; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[1], j, HUSPR_ATTR_DISPOFF);
HuSprPosSet(work->spr_grp[1], j, HU_DISP_CENTERX, work->y);
HuSprTPLvlSet(work->spr_grp[1], j, 1.0f);
}
}
}
else {
if (work->time > 105) {
for (j = 0; j < work->word_len; j++) {
time = work->time - 105;
time -= j * 3;
if (time < 0) {
continue;
}
scale = 1.0f - (time / 15.0f);
if (scale < 0.0f) {
scale = 0.0f;
}
HuSprPosSet(work->spr_grp[0], j, HU_DISP_CENTERX, work->y + ((-100.0f - work->y) * (time / 20.0f)));
HuSprTPLvlSet(work->spr_grp[0], j, scale);
HuSprPosSet(work->spr_grp[1], j, HU_DISP_CENTERX, work->y + ((580.0f - work->y) * (time / 20.0f)));
HuSprTPLvlSet(work->spr_grp[1], j, scale);
}
}
}
}
if (work->time == 130) {
work->stat |= 0x4;
}
if (work->time >= 130) {
work->type = 0;
work->stat |= 0x8;
}
}
} break;
case -1: {
work->angle += seqSpeed * 0.1f;
scale = 1.0f - work->angle;
if (scale <= 0.0f) {
scale = 0.0f;
work->type = 0;
work->stat |= 0x8;
if (work->state == 0) {
MGSeqPauseEnableCtrl(1);
}
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[0], idx, scale);
}
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
s32 MGSeqUpdateMG1vs3(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->angle = 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->angle = 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->state == 0) {
if (work->time <= 10) {
scale = work->time / 10.0f;
time = work->time;
for (idx = 0; idx < work->word_len; 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->word_len * 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; idx < work->word_len; 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->word_len * 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; j < work->word_len; j++) {
HuSprAttrSet(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
}
}
else {
if (work->time > 70) {
time = work->time - 70;
scale = 0.5 * sin((M_PI * (time * 9.0f)) / 180.0);
for (j = 0; j < work->word_len; j++) {
pos_x = (28.0f * (scale + work->scale_x)) + (work->x - (0.5f * ((work->word_len * 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->state == 1) {
HuAudFXPlay(37);
}
else {
HuAudFXPlay(40);
}
MGSeqPauseEnableCtrl(0);
work->stat |= 0x10;
}
if (work->time <= 20) {
for (i = 1; i < 4; i++) {
for (j = 0; j < work->word_len; j++) {
HuSprAttrSet(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
time = work->time;
scale = work->scale_x + (0.5 * sin((M_PI * (time * 9.0f)) / 180.0));
for (j = 0; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[0], j, HUSPR_ATTR_DISPOFF);
pos_x = ((28.0f * scale) + (work->x - (0.5f * (scale * (work->word_len * 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; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
}
}
else {
if (work->time > 80 || work->time < 140) {
for (i = 0; i < 4; i++) {
for (j = 0; j < work->word_len; 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->word_len * 56)))) + (j * 56);
pos_x = (28.0f + (work->x - (0.5f * (work->word_len * 56)))) + ((work->word_len - j - 1) * 56);
HuSprPosSet(work->spr_grp[i], j, pos_base + ((time / 20.0f) * (pos_x - pos_base)),
work->y + (((HU_DISP_HEIGHT - 40) - work->y) * (time / 20.0f)));
}
else {
time -= 20.0f;
pos_x = (28.0f + (work->x - (0.5f * (work->word_len * 56)))) + ((work->word_len - j - 1) * 56);
pos_y = HU_DISP_HEIGHT - 40;
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->angle += seqSpeed * 0.1f;
scale = 1.0f - work->angle;
if (scale <= 0.0f) {
scale = 0.0f;
work->type = 0;
work->stat |= 0x8;
if (work->state == 0) {
MGSeqPauseEnableCtrl(1);
}
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[0], idx, scale);
}
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
s32 MGSeqUpdateMGStory(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->angle = 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->angle = 0.0f;
}
if (work->type) {
switch (work->type) {
case 1: {
float pos_x, pos_y;
float time;
s16 i;
s16 j;
if (work->state == 0) {
if (work->time <= 30) {
for (idx = 0; idx < work->word_len; 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 + ((HU_DISP_CENTERX - 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 = HU_DISP_WIDTH + 50;
HuSprPosSet(work->spr_grp[1], idx, pos_x + ((HU_DISP_CENTERX - 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; j < work->word_len; j++) {
HuSprAttrSet(work->spr_grp[1], j, HUSPR_ATTR_DISPOFF);
}
}
}
else {
if (work->time > 35 && work->time <= 45) {
time = work->time - 35;
for (idx = 0; idx < work->word_len; idx++) {
pos_x = (work->x - (0.5f * (work->word_len * 56))) + 28.0f + (idx * 56);
HuSprPosSet(work->spr_grp[0], idx, HU_DISP_CENTERX + ((pos_x - HU_DISP_CENTERX) * (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; j < work->word_len; j++) {
pos_x = (28.0f * (scale + work->scale_x)) + (work->x - (0.5f * ((work->word_len * 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->state == 1) {
HuAudFXPlay(37);
}
else {
HuAudFXPlay(40);
}
MGSeqPauseEnableCtrl(0);
work->stat |= 0x10;
}
if (work->time <= 20) {
for (i = 1; i < 4; i++) {
for (j = 0; j < work->word_len; j++) {
HuSprAttrSet(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
time = work->time;
scale = work->scale_x + (0.5 * sin((M_PI * (time * 9.0f)) / 180.0));
for (j = 0; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[0], j, HUSPR_ATTR_DISPOFF);
pos_x = ((28.0f * scale) + (work->x - (0.5f * (scale * (work->word_len * 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; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
}
}
else if (work->time > 80 && work->time < 160) {
for (i = 0; i < 4; i++) {
for (j = 0; j < work->word_len; 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->word_len * 56)))) + (j * 56);
dx = 28.0f + (work->x - (0.5f * (work->word_len * 56)));
pos_y = work->y;
for (idx = initF = 0; idx < time; idx++) {
if (!initF) {
pos_x -= 20.0f;
if (pos_x <= dx) {
pos_x = 28.0f + (work->x - (0.5f * (work->word_len * 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->angle += seqSpeed * 0.1f;
scale = 1.0f - work->angle;
if (scale <= 0.0f) {
scale = 0.0f;
work->type = 0;
work->stat |= 0x8;
if (work->state == 0) {
MGSeqPauseEnableCtrl(1);
}
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[0], idx, scale);
}
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
s32 MGSeqUpdateMG2vs2(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->angle = 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->angle = 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->state == 0) {
if (work->time <= 30) {
time = work->time;
for (idx = 0; idx < work->word_len; idx++) {
pos_x = (28.0f + (work->x - (0.5f * (work->scale_x * (work->word_len * 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; j < work->word_len; j++) {
pos_x = (28.0f * (scale + work->scale_x)) + (work->x - (0.5f * ((work->word_len * 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->state == 1) {
HuAudFXPlay(37);
}
else {
HuAudFXPlay(40);
}
MGSeqPauseEnableCtrl(0);
work->stat |= 0x10;
}
if (work->time <= 20) {
for (i = 1; i < 4; i++) {
for (j = 0; j < work->word_len; j++) {
HuSprAttrSet(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
time = work->time;
scale = work->scale_x + (0.5 * sin((M_PI * (time * 9.0f)) / 180.0));
for (j = 0; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[0], j, HUSPR_ATTR_DISPOFF);
pos_x = ((28.0f * scale) + (work->x - (0.5f * (scale * (work->word_len * 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; j < work->word_len; j++) {
HuSprAttrReset(work->spr_grp[i], j, HUSPR_ATTR_DISPOFF);
}
}
}
}
else {
if (work->time > 80 && work->time < 140) {
time = work->time - 80;
for (idx = 0; idx < work->word_len; idx++) {
float radius = (idx * 56) - (((work->word_len - 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->angle += seqSpeed * 0.1f;
scale = 1.0f - work->angle;
if (scale <= 0.0f) {
scale = 0.0f;
work->type = 0;
work->stat |= 0x8;
if (work->state == 0) {
MGSeqPauseEnableCtrl(1);
}
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[0], idx, scale);
}
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
s32 MGSeqInitFlip(SeqWork *work, va_list params)
{
s16 i;
s16 word_grp;
s16 word_ofs;
work->state = va_arg(params, int);
if (work->state == 2) {
return MGSeqInitDraw(work, params);
}
work->type = 0;
work->angle = 0;
{
s32 word_ofs_temp;
s32 word_katakana;
s32 word_flag;
if (seqLanguage == 0) {
word_ofs_temp = 3;
}
else {
word_ofs_temp = 0;
}
word_ofs = word_ofs_temp;
word_katakana = 0;
if (work->state == 2 && word_ofs == 0) {
word_katakana = 1;
}
if (word_katakana) {
word_flag = 1;
}
else {
word_flag = 0;
}
word_grp = SeqMakeWord(work, wordMgTbl[work->state + word_ofs], word_flag);
}
HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f);
for (i = 0; i < work->word_len; i++) {
HuSprTPLvlSet(work->spr_grp[word_grp], i, 0.0f);
HuSprPosSet(work->spr_grp[word_grp], i, (28.0f + (work->x - (0.5f * (work->word_len * 56)))) + (i * 56), work->y);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
HuSprAttrReset(work->spr_grp[word_grp], i, HUSPR_ATTR_DISPOFF);
}
work->alt_word_len = work->word_len;
{
s32 word_ofs_temp;
s32 word_katakana;
s32 word_flag;
if (seqLanguage == 0) {
word_ofs_temp = 0;
}
else {
word_ofs_temp = 3;
}
word_ofs = word_ofs_temp;
word_katakana = 0;
if (work->state == 2 && word_ofs == 0) {
word_katakana = 1;
}
if (word_katakana) {
word_flag = 1;
}
else {
word_flag = 0;
}
word_grp = SeqMakeWord(work, wordMgTbl[work->state + word_ofs], word_flag);
}
HuSprGrpPosSet(work->spr_grp[word_grp], 0.0f, 0.0f);
for (i = 0; i < work->word_len; i++) {
HuSprTPLvlSet(work->spr_grp[word_grp], i, 0.0f);
HuSprPosSet(work->spr_grp[word_grp], i, (28.0f + (work->x - (0.5f * (work->word_len * 56)))) + (i * 56), work->y);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
HuSprAttrReset(work->spr_grp[word_grp], i, HUSPR_ATTR_DISPOFF);
}
if (seqPauseF) {
work->type = 2;
HuSprAttrSet(word_grp, 0, HUSPR_ATTR_DISPOFF);
}
else {
work->param[0] = 3;
}
return 1;
}
s32 MGSeqUpdateFlip(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->angle = 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->angle = 0.0f;
}
if (work->type) {
switch (work->type) {
case 1: {
float time;
float pos_x;
s16 i;
if (work->state == 0) {
if (work->time <= 10) {
for (idx = 0; idx < work->alt_word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[0], idx, work->time / 10.0f);
}
}
else {
if (work->time <= 30) {
time = work->time - 10;
if (time <= 10) {
for (idx = 0; idx < work->alt_word_len; idx++) {
HuSprScaleSet(work->spr_grp[0], idx, cos(M_PI * ((time / 10.0f) * 90.0f) / 180.0), 1.0f);
}
}
else {
time -= 10.0f;
for (idx = 0; idx < work->word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[1], idx, 1.0f);
HuSprScaleSet(work->spr_grp[1], idx, sin(M_PI * ((time / 10.0f) * 90.0f) / 180.0), 1.0f);
}
}
}
else {
if (work->time > 35 && work->time <= 55) {
time = work->time - 35;
scale = 0.5 * sin(((time * 9.0f) * M_PI) / 180.0);
for (i = 0; i < work->word_len; i++) {
pos_x = (28.0f * (scale + work->scale_x)) + (work->x - (0.5f * ((work->word_len * 56) * (scale + work->scale_x))))
+ ((i * 56) * (scale + work->scale_x));
HuSprPosSet(work->spr_grp[1], i, pos_x, work->y);
HuSprScaleSet(work->spr_grp[1], i, work->scale_x + scale, work->scale_y + scale);
}
}
}
}
if (work->time == 35) {
HuAudFXPlay(36);
work->stat |= 0x10;
}
if (work->time == 55) {
work->stat |= 0x4;
SeqPlayStartFX();
}
if (work->time >= 75) {
work->type = 0;
}
}
else {
if (work->time == 1) {
if (work->state == 1) {
HuAudFXPlay(37);
}
else {
HuAudFXPlay(40);
}
MGSeqPauseEnableCtrl(0);
work->stat |= 0x10;
}
if (work->time <= 20) {
time = work->time;
scale = 0.5 * sin(M_PI * (9.0f * time) / 180.0);
for (i = 0; i < work->word_len; i++) {
HuSprTPLvlSet(work->spr_grp[1], i, 1.0f);
pos_x = (28.0f * (scale + work->scale_x)) + (work->x - (0.5f * ((work->word_len * 56) * (scale + work->scale_x))))
+ ((i * 56) * (scale + work->scale_x));
HuSprPosSet(work->spr_grp[1], i, pos_x, work->y);
HuSprScaleSet(work->spr_grp[1], i, work->scale_x + scale, work->scale_y + scale);
}
}
else {
if (work->time > 80 && work->time <= 160) {
time = work->time - 80;
for (idx = 0; idx < work->word_len; idx++) {
scale = time - (idx * 2);
if (scale < 0 || scale > 15.0f) {
continue;
}
HuSprScaleSet(work->spr_grp[1], idx, cos(M_PI * ((scale / 15.0f) * 90.0f) / 180.0), 1.0f);
}
for (idx = 0; idx < work->alt_word_len; idx++) {
scale = (time - 15.0f) - (idx * 2);
if (scale < 0 || scale > 30.0f) {
continue;
}
HuSprTPLvlSet(work->spr_grp[0], idx, 1.0f);
HuSprScaleSet(work->spr_grp[0], idx, sin(M_PI * ((scale / 30.0f) * 180.0f) / 180.0), 1.0f);
}
}
}
if (work->time == 160) {
work->stat |= 0x4;
}
if (work->time >= 160) {
work->type = 0;
work->stat |= 0x8;
}
}
} break;
case -1: {
work->angle += seqSpeed * 0.1f;
scale = 1.0f - work->angle;
if (scale <= 0.0f) {
scale = 0.0f;
work->type = 0;
work->stat |= 0x8;
if (work->state == 0) {
MGSeqPauseEnableCtrl(1);
}
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[1], idx, scale);
}
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
s32 MGSeqUpdateMGBowser(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->angle = 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->angle = 0.0f;
}
if (work->type) {
switch (work->type) {
case 1: {
s16 i;
s16 j;
float angle;
float time_angle;
float time;
float pos_x, pos_y;
float temp_f25;
float center_x;
s16 spr_idx[16];
float scale_arr[16];
if (work->state == 0) {
if (work->time <= 60) {
center_x = (0.5 * (work->word_len * 56)) + 20.0;
for (idx = 0; idx < work->word_len; idx++) {
time = work->time - idx;
if (time < 0) {
scale_arr[idx] = 0.0f;
spr_idx[idx] = idx;
}
else {
if (time > 50.0f) {
time = 50.0f;
}
time_angle = 540.0 * (1.0f - (time / 50.0f));
pos_x = (28.0f + (0.5f * -(work->word_len * 56))) + (idx * 56);
angle = 180.0 * (atan2(pos_x, center_x) / M_PI);
pos_x = work->x + (center_x * sin(M_PI * (angle + time_angle) / 180.0));
pos_y = work->y - (HU_DISP_CENTERY * (1.0 - (time / 50.0f)));
HuSprPosSet(work->spr_grp[0], idx, pos_x, pos_y);
temp_f25 = 0.9 + (0.1 * cos(M_PI * (angle + time_angle) / 180.0));
HuSprScaleSet(work->spr_grp[0], idx, temp_f25 * cos(M_PI * (angle + time_angle) / 180.0), temp_f25);
scale_arr[idx] = cos(M_PI * (angle + time_angle) / 180.0);
spr_idx[idx] = idx;
}
}
for (i = 1; i < work->word_len; i++) {
for (idx = 0; idx < work->word_len - i; idx++) {
if (scale_arr[idx] > scale_arr[idx + 1]) {
j = spr_idx[idx];
spr_idx[idx] = spr_idx[idx + 1];
spr_idx[idx + 1] = j;
angle = scale_arr[idx];
scale_arr[idx] = scale_arr[idx + 1];
scale_arr[idx + 1] = angle;
}
}
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprPriSet(work->spr_grp[0], spr_idx[idx], idx + 5);
}
}
else {
if (work->time > 60 && work->time <= 80) {
time = work->time - 60;
scale = 0.5 * sin(((time * 9.0f) * M_PI) / 180.0);
for (i = 0; i < work->word_len; i++) {
pos_x = (28.0f * (scale + work->scale_x)) + (work->x - (0.5f * ((work->word_len * 56) * (scale + work->scale_x))))
+ ((i * 56) * (scale + work->scale_x));
HuSprPosSet(work->spr_grp[0], i, pos_x, work->y);
HuSprScaleSet(work->spr_grp[0], i, work->scale_x + scale, work->scale_y + scale);
}
}
}
if (work->time == 60) {
HuAudFXPlay(36);
work->stat |= 0x10;
}
if (work->time == 80) {
work->stat |= 0x4;
SeqPlayStartFX();
}
if (work->time >= 100) {
work->type = 0;
}
}
else {
if (work->time == 1) {
if (work->state == 1) {
HuAudFXPlay(37);
}
else {
HuAudFXPlay(40);
}
MGSeqPauseEnableCtrl(0);
work->stat |= 0x10;
}
if (work->time <= 20) {
for (j = 1; j < 4; j++) {
for (i = 0; i < work->word_len; i++) {
HuSprAttrSet(work->spr_grp[j], i, HUSPR_ATTR_DISPOFF);
}
}
time = work->time;
scale = work->scale_x + (0.5 * sin(((time * 9.0f) * M_PI) / 180.0));
for (i = 0; i < work->word_len; i++) {
HuSprAttrReset(work->spr_grp[0], i, HUSPR_ATTR_DISPOFF);
pos_x = ((28.0f * scale) + (work->x - (0.5f * (scale * (work->word_len * 56))))) + (scale * (i * 56));
HuSprPosSet(work->spr_grp[0], i, pos_x, work->y);
HuSprScaleSet(work->spr_grp[0], i, 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 (j = 1; j < 4; j++) {
for (i = 0; i < work->word_len; i++) {
HuSprAttrReset(work->spr_grp[j], i, HUSPR_ATTR_DISPOFF);
}
}
}
}
else {
if (work->time > 80 && work->time <= 125) {
static float letterOfs[] = {
-30,
-30,
HU_DISP_WIDTH + 30,
-30,
HU_DISP_CENTERX + 52,
HU_DISP_HEIGHT + 30,
HU_DISP_WIDTH + 30,
HU_DISP_HEIGHT + 30,
-30,
HU_DISP_HEIGHT - 30,
HU_DISP_WIDTH + 30,
120,
HU_DISP_CENTERX + 162,
-30,
};
for (i = 0; i < 4; i++) {
time = work->time - 80 - i;
if (time < 0.0f || time > 15.0f) {
continue;
}
for (idx = 0; idx < work->word_len; idx++) {
pos_x = (28.0f + (work->x - (0.5f * (work->word_len * 56)))) + (idx * 56);
pos_x += (time / 15.0f) * (letterOfs[(idx * 2)] - pos_x);
pos_y = work->y + ((time / 15.0f) * (letterOfs[(idx * 2) + 1] - work->y));
HuSprPosSet(work->spr_grp[i], idx, pos_x, pos_y);
}
}
}
}
if (work->time == 125) {
work->stat |= 0x4;
}
if (work->time >= 135) {
work->type = 0;
work->stat |= 0x8;
}
}
} break;
case -1: {
work->angle += seqSpeed * 0.1f;
scale = 1.0f - work->angle;
if (scale <= 0.0f) {
scale = 0.0f;
work->type = 0;
work->stat |= 0x8;
if (work->state == 0) {
MGSeqPauseEnableCtrl(1);
}
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprTPLvlSet(work->spr_grp[0], idx, scale);
}
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
s32 MGSeqInitDraw(SeqWork *work, va_list params)
{
s16 word_grp;
work->state = 2;
work->seq_no = 13;
work->type = 0;
work->angle = 0.0f;
{
s32 word_flag;
s32 word_ofs;
if (seqLanguage == 0) {
word_flag = 1;
}
else {
word_flag = 0;
}
if (seqLanguage == 0) {
word_ofs = 0;
}
else {
word_ofs = 3;
}
word_grp = SeqMakeWord(work, wordMgTbl[2 + word_ofs], word_flag);
}
HuSprGrpPosSet(work->spr_grp[word_grp], HU_DISP_CENTERX, HU_DISP_CENTERY);
work->param[0] = 3;
return 1;
}
s32 MGSeqUpdateDraw(SeqWork *work)
{
s16 idx;
float scale;
s16 group = work->spr_grp[0];
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->angle = 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;
}
}
work->time += seqSpeed;
if (work->time >= work->time_max && work->type != -1) {
work->stat |= 0x4;
work->type = -1;
work->angle = 0.0f;
}
if (work->type) {
switch (work->type) {
case 1: {
float time;
float scale;
float zrot;
if (work->time <= 20) {
time = work->time;
zrot = 365.0f * (time / 20.0f);
scale = 1.3f * sin(M_PI * (90.0f * (time / 20.0f)) / 180.0);
HuSprGrpScaleSet(group, scale, scale);
HuSprGrpZRotSet(group, zrot);
}
if (work->time > 20 && work->time <= 25) {
HuSprGrpZRotSet(group, 0.0f);
time = work->time - 20;
scale = 1.0 + (0.3 * cos(M_PI * (90.0f * (time / 5.0f)) / 180.0));
HuSprGrpScaleSet(group, scale, scale);
}
if (work->time == 5) {
HuAudFXPlay(40);
}
if (work->time == 60) {
work->type = 0;
}
} break;
case -1: {
float tp_lvl;
work->angle += seqSpeed * 0.1f;
tp_lvl = 1.0f - work->angle;
if (tp_lvl <= 0.0f) {
tp_lvl = 0.0f;
work->state = 0;
work->stat |= 0x8;
}
HuSprGrpTPLvlSet(group, tp_lvl);
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
static char *winCharNameTbl[] = {
"マリオ",
"MARIO",
"ルイージ",
"LUIGI",
"ピーチ",
"PEACH",
"ヨッシー",
"YOSHI",
"ワリオ",
"WARIO",
"ドンキー",
VERSION_JPN ? "DK" : " DK ",
"デイジー",
"DAISY",
"ワルイージ",
"WALUIGI",
"クッパ",
"BOWSER",
"キノピオ",
"TOAD",
"ヘイホー",
VERSION_JPN ? "HEHOH" : "SHY GUY",
"テレサ",
VERSION_JPN ? "TERETHA" : "BOO",
"ノコノコ",
VERSION_JPN ? "NOKONOKO" : "KOOPA",
"ミニクッパ",
VERSION_NTSC ? (VERSION_ENG ? "KOOPA KID" : "BABYBOWSER") : "MINI BOWSER",
"クリボー",
VERSION_JPN ? "KURIBO" : "GOOMBA",
};
static char *winWordTbl[] = { "カチ", "WON!", "ハイボク", "LOSE", "ユウショウ!", "CHAMPION!" };
static s16 winPosOfs[][5][2] = {
{ { VERSION_JPN ? 144 : 114, 0 }, { -144, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
{ { 0, 35 }, { -144, -35 }, { 144, -35 }, { 0, 0 }, { 0, 0 } },
{ { 0, 105 }, { 0, -105 }, { -144, 0 }, { 144, 0 }, { 0, 0 } },
{ { 0, 105 }, { -144, -105 }, { 144, -105 }, { -144, 0 }, { 144, 0 } },
};
static s16 winnerNameW[8];
#define GET_LANG_IDX() ((seqLanguage == 0) ? 0 : 1)
#define GET_WIN_KANAF() ((seqLanguage == 0) ? 1 : 0)
s32 MGSeqInitWin(SeqWork *work, va_list params)
{
int win_type = va_arg(params, int);
s16 word_idx;
s16 word_grp;
s32 i;
s32 j;
s32 num_winners;
float word_w;
float word_x;
if (win_type < 0 && win_type >= 6) {
return 0;
}
if (win_type == 3) {
word_idx = GET_LANG_IDX();
}
else {
if (win_type == 4) {
word_idx = GET_LANG_IDX() + 2;
}
else {
word_idx = GET_LANG_IDX() + 4;
}
}
word_grp = SeqMakeWord(work, winWordTbl[word_idx], GET_WIN_KANAF());
winnerNameW[0] = work->word_len * (VERSION_JPN ? 56 : 50);
#if !VERSION_JPN
for (i = 0; i < work->word_len; i++) {
HuSprPosSet(work->spr_grp[word_grp], i, 25.0f + ((i * 50) - (0.5f * (work->word_len * 50))), 0.0f);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
}
#endif
num_winners = 0;
#if !VERSION_JPN
work->win_scale = 1.0f;
#endif
for (j = 0; j < 4; j++) {
int winner = va_arg(params, int);
(void)winner; // to match PAL
if (winner < 0) {
continue;
}
word_grp = SeqMakeWord(work, winCharNameTbl[(winner * 2) + GET_LANG_IDX()], 0);
#if VERSION_ENG
if (seqLanguage != 0) {
char *name = winCharNameTbl[(winner * 2) + GET_LANG_IDX()];
word_w = 0.0f;
for (i = word_w; i < work->word_len; i++, name++) {
if (*name == ' ') {
word_w += 30.0f;
}
else {
word_w += 50.0f;
}
}
name = winCharNameTbl[(winner * 2) + GET_LANG_IDX()];
word_x = 0.0f;
for (i = word_x; i < work->word_len; i++, name++) {
HuSprPosSet(work->spr_grp[word_grp], i, 25.0 + (word_x - (0.5 * word_w)), 0.0f);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
if (*name == ' ') {
word_x += 30.0f;
}
else {
word_x += 50.0f;
}
}
if (work->win_scale == 0.6f || winner == 7 || winner == 13 || winner == 10) {
work->win_scale = 0.6f;
}
else {
work->win_scale = 0.75f;
}
winnerNameW[num_winners + 1] = word_w;
}
else if (winner == 7 || winner == 13) {
for (i = 0; i < work->word_len; i++) {
HuSprPosSet(work->spr_grp[word_grp], i, 26.0f + ((i * 52) - (0.5f * (work->word_len * 52))), 0.0f);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
}
work->win_scale = 0.8f;
winnerNameW[num_winners + 1] = work->word_len * 52;
}
else {
work->win_scale = 1.0f;
winnerNameW[num_winners + 1] = work->word_len * 56;
}
#elif VERSION_PAL
for (i = 0; i < work->word_len; i++) {
HuSprPosSet(work->spr_grp[word_grp], i, 25.0f + ((i * 50) - (0.5f * (work->word_len * 50))), 0.0f);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
}
if ((work->win_scale == 0.5f) || (winner == 13)) {
work->win_scale = 0.5f;
}
else if ((work->win_scale == 0.6f) || (winner == 7) || (winner == 10)) {
work->win_scale = 0.6f;
}
else {
work->win_scale = 0.75f;
}
winnerNameW[num_winners + 1] = work->word_len * 50;
#else
if (seqLanguage != 0) {
for (i = 0; i < work->word_len; i++) {
HuSprPosSet(work->spr_grp[word_grp], i, 25.0f + (i * 50 - (0.5f * (work->word_len * 50))), 0.0f);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
}
work->win_scale = 0.75f;
winnerNameW[num_winners + 1] = work->word_len * 50;
}
else if (winner == 7 || winner == 13) {
for (i = 0; i < work->word_len; i++) {
HuSprPosSet(work->spr_grp[word_grp], i, 26.0f + ((i * 52) - (0.5f * (work->word_len * 52))), 0.0f);
HuSprAttrSet(work->spr_grp[word_grp], i, HUSPR_ATTR_LINEAR);
}
work->win_scale = 0.8f;
winnerNameW[num_winners + 1] = work->word_len * 52;
}
else {
work->win_scale = 1.0f;
winnerNameW[num_winners + 1] = work->word_len * 56;
}
#endif
num_winners++;
}
if (num_winners == 0) {
return 0;
}
work->state = 0;
work->word_len = num_winners + 1;
work->angle = 0.0f;
work->type = 0;
for (j = 0; j < num_winners + 1; j++) {
if (num_winners == 1) {
#if VERSION_JPN
word_x = 32 + (winnerNameW[1] + winnerNameW[0]);
#else
word_x = 32.0f + ((float)winnerNameW[0] + (winnerNameW[1] * work->win_scale));
#endif
if (j == 0) {
word_x = (((HU_DISP_WIDTH - word_x) / 2.0f) + (word_x - (winnerNameW[0] / 2))) - HU_DISP_CENTERX;
}
else {
word_x = (((HU_DISP_WIDTH - word_x) / 2.0f) + (winnerNameW[1] / 2)) - HU_DISP_CENTERX;
}
}
else {
if (abs(winPosOfs[num_winners - 1][j][0]) == 144.0f) {
#if VERSION_ENG
if (winnerNameW[j] + 32 < HU_DISP_CENTERX) {
word_x = 176.0f;
}
else {
word_x = 32.0f + ((winnerNameW[j] * work->win_scale) / 2.0f);
}
if (winPosOfs[num_winners - 1][j][0] < 0) {
word_x = -(HU_DISP_CENTERX - word_x);
}
else {
word_x = (HU_DISP_WIDTH - word_x) - HU_DISP_CENTERX;
}
#elif VERSION_PAL
if (32.0f + (work->win_scale * winnerNameW[j]) < HU_DISP_CENTERX) {
word_x = 32.0f + ((winnerNameW[j] * work->win_scale) / 2.0f);
}
else {
word_x = 120.0f;
}
if (winPosOfs[num_winners - 1][j][0] < 0) {
word_x = -word_x;
}
#else
if (32 + winnerNameW[j] < HU_DISP_CENTERX) {
word_x = 32 + winnerNameW[j] / 2;
}
else {
word_x = 120.0f;
}
if (winPosOfs[num_winners - 1][j][0] < 0) {
word_x = -word_x;
}
#endif
}
else {
word_x = winPosOfs[num_winners - 1][j][0];
}
}
HuSprGrpPosSet(work->spr_grp[j], HU_DISP_CENTERX + word_x, HU_DISP_CENTERY + winPosOfs[num_winners - 1][j][1]);
}
if (seqPauseF) {
work->type = 1;
num_winners++;
for (j = 0; j < num_winners; j++) {
HuSprAttrSet(work->spr_grp[j], 0, HUSPR_ATTR_DISPOFF);
}
}
else {
work->param[0] = 3;
}
return 1;
}
s32 MGSeqUpdateWin(SeqWork *work)
{
s32 idx;
float tp_lvl;
s16 group = work->spr_grp[0];
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->angle = 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;
}
}
work->time += seqSpeed;
if (work->time >= work->time_max && work->type != -1) {
work->stat |= 0x4;
work->type = -1;
work->angle = 0.0f;
}
if (work->type) {
switch (work->type) {
case 1: {
float time;
float scale;
float zrot;
if (work->time <= 20) {
time = work->time;
zrot = 365.0f * (time / 20.0f);
scale = sin(M_PI * (90.0f * (time / 20.0f)) / 180.0);
HuSprGrpScaleSet(work->spr_grp[0], scale, scale);
HuSprGrpZRotSet(work->spr_grp[0], zrot);
scale = 1.0 + (5.0 * cos(M_PI * (90.0f * (time / 20.0f)) / 180.0));
tp_lvl = time / 20.0f;
for (idx = 1; idx < work->word_len; idx++) {
HuSprGrpTPLvlSet(work->spr_grp[idx], tp_lvl);
HuSprGrpScaleSet(work->spr_grp[idx], scale * work->win_scale, scale);
}
}
if (work->time > 20 && work->time <= 22) {
HuSprGrpZRotSet(work->spr_grp[0], 0.0f);
for (idx = 1; idx < work->word_len; idx++) {
float pos_x;
float ofs[2];
if (work->time == 21) {
ofs[0] = ((idx & 0x1) * 2) - 1;
ofs[1] = (idx & 0x2) ? 2 : -1;
}
else {
ofs[0] = ofs[1] = 0.0f;
}
if (work->word_len == 2) {
pos_x = winnerNameW[1] + winnerNameW[0] + 32;
pos_x = (((HU_DISP_WIDTH - pos_x) / 2.0f) + (winnerNameW[1] / 2)) - HU_DISP_CENTERX;
}
else {
if (abs(winPosOfs[work->word_len - 2][idx][0]) == 144.0f) {
if (winnerNameW[idx] + 32 < HU_DISP_CENTERX) {
pos_x = VERSION_ENG ? 176.0f : winnerNameW[idx] / 2 + 32;
}
else {
pos_x = VERSION_ENG ? 32.0f + ((winnerNameW[idx] * work->win_scale) / 2.0f) : 128.0f;
}
if (winPosOfs[work->word_len - 2][idx][0] < 0) {
pos_x = VERSION_ENG ? -(HU_DISP_CENTERX - pos_x) : -pos_x;
}
#if VERSION_ENG
else {
pos_x = (HU_DISP_WIDTH - pos_x) - HU_DISP_CENTERX;
}
#endif
}
else {
pos_x = winPosOfs[work->word_len - 2][idx][0];
}
}
HuSprGrpPosSet(work->spr_grp[idx], (HU_DISP_CENTERX + pos_x) + ofs[0],
ofs[1] + (HU_DISP_CENTERY + winPosOfs[work->word_len - 2][idx][1]));
}
}
if (work->time == 125) {
work->type = 0;
}
} break;
case -1: {
work->angle += seqSpeed * 0.1f;
tp_lvl = 1.0f - work->angle;
if (tp_lvl <= 0.0f) {
tp_lvl = 0.0f;
work->state = 0;
work->stat |= 0x8;
}
for (idx = 0; idx < work->word_len; idx++) {
HuSprGrpTPLvlSet(work->spr_grp[idx], tp_lvl);
}
} break;
default:
break;
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
s32 MGSeqInitRecord(SeqWork *work, va_list params)
{
AnimData *spr_data;
s16 spr_grp;
s16 time_pos[2];
s16 i;
s16 sprite;
s16 digit_idx;
s32 digit;
seqRecordVal = va_arg(params, int);
work->type = 0;
work->angle = 0.0f;
work->spr_grp[0] = spr_grp = HuSprGrpCreate(10);
spr_data = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 9)));
sprite = HuSprCreate(spr_data, 0, 0);
HuSprGrpMemberSet(spr_grp, 0, sprite);
HuSprPosSet(spr_grp, 0, 0.0f, -32.0f);
spr_data = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 8)));
sprite = HuSprCreate(spr_data, 0, 0);
HuSprGrpMemberSet(spr_grp, 1, sprite);
spr_data = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 7)));
for (i = 0; i < 8; i++) {
sprite = HuSprCreate(spr_data, 0, 0);
HuSprGrpMemberSet(spr_grp, i + 2, sprite);
}
if (omcurovl == OVL_M407 || omcurovl == OVL_M453 || omcurovl == OVL_M459 || omcurovl == OVL_M460 || omcurovl == OVL_M462
|| omcurovl == OVL_M442) {
digit_idx = 0;
if (seqRecordVal > 9999) {
seqRecordVal = 9999;
}
digit = seqRecordVal / 1000;
if (digit != 0) {
HuSprBankSet(spr_grp, digit_idx + 2, digit);
seqRecordVal -= digit * 1000;
digit_idx++;
}
digit = seqRecordVal / 100;
if (digit != 0 || digit_idx != 0) {
HuSprBankSet(spr_grp, digit_idx + 2, digit);
seqRecordVal -= digit * 100;
digit_idx++;
}
digit = seqRecordVal / 10;
if (digit != 0 || digit_idx != 0) {
HuSprBankSet(spr_grp, digit_idx + 2, digit);
seqRecordVal -= digit * 10;
digit_idx++;
}
HuSprBankSet(spr_grp, digit_idx + 2, seqRecordVal);
digit_idx++;
for (i = digit_idx; i < 8; i++) {
HuSprAttrSet(spr_grp, i + 2, HUSPR_ATTR_DISPOFF);
}
HuSprPosSet(spr_grp, 1, (-((digit_idx * 44) + 48) / 2) + 24, 32.0f);
for (i = 0; i < digit_idx; i++) {
HuSprPosSet(spr_grp, i + 2, (-((digit_idx * 44) + 48) / 2) + 70 + (i * 44), 32.0f);
}
}
else {
s16 x;
digit_idx = 0;
digit = seqRecordVal / (600 * REFRESH_RATE);
if (digit != 0) {
HuSprBankSet(spr_grp, digit_idx + 2, digit);
seqRecordVal -= digit * (600 * REFRESH_RATE);
digit_idx++;
}
digit = seqRecordVal / (60 * REFRESH_RATE);
HuSprBankSet(spr_grp, digit_idx + 2, digit);
seqRecordVal -= digit * (60 * REFRESH_RATE);
digit_idx++;
HuSprBankSet(spr_grp, digit_idx + 2, 10);
time_pos[0] = digit_idx;
digit_idx++;
digit = seqRecordVal / (10 * REFRESH_RATE);
HuSprBankSet(spr_grp, digit_idx + 2, digit);
seqRecordVal -= digit * (10 * REFRESH_RATE);
digit_idx++;
digit = seqRecordVal / REFRESH_RATE;
HuSprBankSet(spr_grp, digit_idx + 2, digit);
seqRecordVal -= digit * REFRESH_RATE;
digit_idx++;
HuSprBankSet(spr_grp, digit_idx + 2, 11);
time_pos[1] = digit_idx;
digit_idx++;
if (omcurovl == OVL_M405 || omcurovl == OVL_M432 || omcurovl == OVL_M461) {
seqRecordVal = (float)seqRecordVal * (101.5 / REFRESH_RATE);
}
else {
seqRecordVal = (float)seqRecordVal * (100.0 / REFRESH_RATE);
}
digit = seqRecordVal / 10;
HuSprBankSet(spr_grp, digit_idx + 2, digit);
seqRecordVal -= digit * 10;
digit_idx++;
HuSprBankSet(spr_grp, digit_idx + 2, seqRecordVal);
digit_idx++;
for (i = digit_idx; i < 8; i++) {
HuSprAttrSet(spr_grp, i + 2, HUSPR_ATTR_DISPOFF);
}
HuSprPosSet(spr_grp, 1, (-((digit_idx * 44) + 4) / 2) + 24, 32.0f);
x = (-((digit_idx * 44) + 4) / 2) + 70;
for (i = 0; i < digit_idx; i++) {
HuSprPosSet(spr_grp, i + 2, x, 32.0f);
if (time_pos[0] == i || time_pos[1] == i) {
x += 22;
}
else {
x += 44;
}
}
}
HuSprGrpPosSet(spr_grp, HU_DISP_CENTERX, HU_DISP_CENTERY);
work->param[0] = 3;
return 1;
}
s32 MGSeqUpdateRecord(SeqWork *work)
{
s16 group;
if (_CheckFlag(FLAG_ID_MAKE(1, 12))) {
work->state = 0;
work->stat |= 0xC;
}
else {
group = work->spr_grp[0];
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->angle = 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;
}
}
work->time += seqSpeed;
if (work->time >= work->time_max && work->type != -1) {
work->stat |= 0x4;
work->type = -1;
work->angle = 0.0f;
}
if (work->type) {
switch (work->type) {
case 1: {
if (work->time <= 10) {
HuSprGrpTPLvlSet(group, work->time / 10.0);
}
if (work->time == 5) {
HuAudFXPlay(38);
}
if (work->time == 30) {
work->type = 0;
}
} break;
case -1: {
float tp_lvl;
work->angle += seqSpeed * 0.1f;
tp_lvl = 1.0f - work->angle;
if (tp_lvl <= 0.0f) {
tp_lvl = 0.0f;
work->state = 0;
work->stat |= 0x8;
}
HuSprGrpTPLvlSet(group, tp_lvl);
} break;
default:
break;
}
}
}
if (seqDoneF || (work->stat & 0x8)) {
MGSeqSprKill(work);
return 0;
}
return 1;
}
static void PauseProc(void);
void MGSeqPauseInit(void)
{
MGSeqPauseEnableCtrl(0);
HuWinInit(1);
pauseProcess = HuPrcCreate(PauseProc, 100, 4096, 0);
HuPrcSetStat(pauseProcess, PROCESS_STAT_PAUSE_EN | PROCESS_STAT_UPAUSE_EN);
pauseActiveF = 1;
pauseExitF = 0;
pauseWaitF = 0;
}
#define PAUSE_WIN_X (HU_DISP_CENTERX - 206)
#define PAUSE_WIN_DIST (HU_DISP_CENTERX + 112)
#define PAUSE_EXIT_Y (HU_DISP_HEIGHT - 80)
static void PauseProc(void)
{
s16 mg;
s16 i;
s16 j;
s16 char_mess_map[4];
s16 char_mess[4][4];
s16 window[3] = { -1, -1, -1 };
SeqWork work;
static char *pauseStr[] = { "ポーズ", "PAUSE" };
float ratio;
HuAudFXPlay(5);
for (i = 0; i < 16; i++) {
work.sprite[i] = work.spr_grp[i] = -1;
}
SeqMakeWord(&work, pauseStr[GET_LANG_IDX()], 0);
for (i = 0; i < work.word_len; i++) {
HuSprPriSet(work.spr_grp[0], i, 0);
}
for (i = 0; i < 4; i++) {
char_mess_map[i] = 0;
}
for (i = 0; i < 4; i++) {
char_mess[GWPlayerCfg[i].group][char_mess_map[GWPlayerCfg[i].group]] = GWPlayerCfg[i].character;
char_mess_map[GWPlayerCfg[i].group]++;
}
mg = omMgIndexGet(omcurovl);
if (mgInfoTbl[mg].inst_mess[1] == 0 && mgInfoTbl[mg].inst_mess[2] == 0) {
for (i = 1; i <= 20; i++) {
ratio = sin(M_PI * (i * 4.5f) / 180.0);
HuSprGrpPosSet(work.spr_grp[0], HU_DISP_CENTERX, (ratio * 290) - 50.0f);
HuPrcVSleep();
}
}
else {
if (mgPracticeEnableF && !_CheckFlag(FLAG_ID_MAKE(1, 12))) {
window[2] = HuWinExCreateStyled(-10000.0f, PAUSE_EXIT_Y, 412, 42, -1, 0);
HuWinPriSet(window[2], 0);
HuWinDispOn(window[2]);
HuWinMesSpeedSet(window[2], 0);
HuWinAttrSet(window[2], 0x800);
HuWinMesSet(window[2], MAKE_MESSID(0x33, 0xA1));
}
if (mgInfoTbl[mg].inst_mess[2]) {
s16 insert_idx;
window[0] = HuWinExCreateStyled(-10000.0f, HU_DISP_CENTERY - 100, 412, 120, -1, 0);
HuWinPriSet(window[0], 0);
HuWinDispOn(window[0]);
HuWinMesSpeedSet(window[0], 0);
HuWinMesSet(window[0], mgInfoTbl[mg].inst_mess[1]);
window[1] = HuWinExCreateStyled(-10000.0f, HU_DISP_CENTERY + 36, 412, 120, -1, 0);
HuWinPriSet(window[1], 0);
HuWinDispOn(window[1]);
HuWinMesSpeedSet(window[1], 0);
HuWinMesSet(window[1], mgInfoTbl[mg].inst_mess[2]);
for (i = insert_idx = 0; i < 4; i++) {
for (j = 0; j < char_mess_map[i]; j++) {
HuWinInsertMesSet(window[0], char_mess[i][j], (s16)insert_idx);
HuWinInsertMesSet(window[1], char_mess[i][j], (s16)insert_idx);
insert_idx++;
}
}
for (i = 1; i <= 20; i++) {
ratio = sin(M_PI * (i * 4.5f) / 180.0);
HuSprGrpPosSet(work.spr_grp[0], HU_DISP_CENTERX, (ratio * 150) - 50.0f);
HuWinPosSet(window[0], (PAUSE_WIN_DIST + PAUSE_WIN_X) * ratio - PAUSE_WIN_DIST, HU_DISP_CENTERY - 100);
HuWinPosSet(window[1], -(PAUSE_WIN_DIST - PAUSE_WIN_X) * ratio + PAUSE_WIN_DIST, HU_DISP_CENTERY + 32);
if (window[2] != -1) {
HuWinPosSet(window[2], PAUSE_WIN_X, (PAUSE_EXIT_Y + 4) + (100 * (1.0 - ratio)));
}
HuPrcVSleep();
}
}
else {
window[0] = HuWinExCreateStyled(-10000.0f, HU_DISP_CENTERY - 70, 412, 120, -1, 0);
HuWinPriSet(window[0], 0);
HuWinDispOn(window[0]);
HuWinMesSpeedSet(window[0], 0);
HuWinMesSet(window[0], mgInfoTbl[mg].inst_mess[1]);
for (i = 1; i <= 20; i++) {
ratio = sin(M_PI * (i * 4.5f) / 180.0);
HuSprGrpPosSet(work.spr_grp[0], HU_DISP_CENTERX, (ratio * 150) - 50.0f);
HuWinPosSet(window[0], (PAUSE_WIN_DIST + PAUSE_WIN_X) * ratio - PAUSE_WIN_DIST, HU_DISP_CENTERY - 70);
if (window[2] != -1) {
HuWinPosSet(window[2], -(PAUSE_WIN_DIST - PAUSE_WIN_X) * ratio + PAUSE_WIN_DIST, PAUSE_EXIT_Y + 4);
}
HuPrcVSleep();
}
}
}
MGSeqPauseEnableCtrl(1);
pauseWaitF = 1;
while (!pauseExitF) {
HuPrcVSleep();
}
pauseWaitF = 0;
if (window[0] == -1 && window[1] == -1) {
for (i = 1; i <= 10; i++) {
ratio = cos(M_PI * (i * 9.0f) / 180.0);
HuSprGrpPosSet(work.spr_grp[0], HU_DISP_CENTERX, (ratio * 290) - 50.0f);
HuPrcVSleep();
}
}
else {
if (window[1] != -1) {
for (i = 1; i <= 10; i++) {
ratio = cos(M_PI * (i * 9.0f) / 180.0);
HuSprGrpPosSet(work.spr_grp[0], HU_DISP_CENTERX, (ratio * 150) - 50.0f);
HuWinPosSet(window[0], (PAUSE_WIN_DIST + PAUSE_WIN_X) * ratio - PAUSE_WIN_DIST, HU_DISP_CENTERY - 100);
HuWinPosSet(window[1], -(PAUSE_WIN_DIST - PAUSE_WIN_X) * ratio + PAUSE_WIN_DIST, HU_DISP_CENTERY + 32);
if (window[2] != -1) {
HuWinPosSet(window[2], PAUSE_WIN_X, (PAUSE_EXIT_Y + 4) + (100 * (1.0 - ratio)));
}
HuPrcVSleep();
}
}
else {
for (i = 1; i <= 10; i++) {
ratio = cos(M_PI * (i * 9.0f) / 180.0);
HuSprGrpPosSet(work.spr_grp[0], HU_DISP_CENTERX, (ratio * 150) - 50.0f);
HuWinPosSet(window[0], (PAUSE_WIN_DIST + PAUSE_WIN_X) * ratio - PAUSE_WIN_DIST, HU_DISP_CENTERY - 70);
if (window[2] != -1) {
HuWinPosSet(window[2], -(PAUSE_WIN_DIST - PAUSE_WIN_X) * ratio + PAUSE_WIN_DIST, PAUSE_EXIT_Y + 4);
}
HuPrcVSleep();
}
}
}
omSysPauseCtrl(0);
if (window[0] != -1) {
HuWinKill(window[0]);
}
if (window[1] != -1) {
HuWinKill(window[1]);
}
if (window[2] != -1) {
HuWinKill(window[2]);
}
HuSprGrpKill(work.spr_grp[0]);
pauseProcess = NULL;
pauseActiveF = 0;
HuPrcEnd();
do {
HuPrcVSleep();
} while (1);
}
void MGSeqPauseKill(void)
{
pauseExitF = 1;
}
void MGSeqPauseEnableCtrl(s32 flag)
{
if (!_CheckFlag(FLAG_ID_MAKE(1, 8))) {
omSysPauseEnable(flag);
}
}
static void PracticeProc(void);
static s16 practiceTbl[][2] = {
OVL_M401,
1,
OVL_M402,
1,
OVL_M403,
1,
OVL_M405,
1,
OVL_M406,
0,
OVL_M407,
1,
OVL_M408,
0,
OVL_M409,
0,
OVL_M410,
1,
OVL_M411,
2,
OVL_M412,
1,
OVL_M413,
0,
OVL_M414,
2,
OVL_M415,
1,
OVL_M443,
2,
OVL_M416,
1,
OVL_M417,
1,
OVL_M418,
1,
OVL_M419,
1,
OVL_M420,
1,
OVL_M421,
1,
OVL_M422,
1,
OVL_M423,
1,
OVL_M424,
1,
OVL_M425,
1,
OVL_M426,
1,
OVL_M427,
0,
OVL_M428,
0,
OVL_M429,
2,
OVL_M430,
1,
OVL_M431,
1,
OVL_M432,
1,
OVL_M433,
0,
OVL_M434,
1,
OVL_M404,
0,
OVL_M438,
1,
OVL_M439,
2,
OVL_M440,
1,
OVL_M441,
1,
OVL_M442,
1,
OVL_M455,
0,
OVL_M456,
0,
OVL_INVALID,
0,
};
void MGSeqPracticeInit(void)
{
Process *process;
s16 i;
process = HuPrcCurrentGet();
if (!_CheckFlag(FLAG_ID_MAKE(1, 12))) {
return;
}
wipeFadeInF = 0;
for (i = 0; practiceTbl[i][0] != OVL_INVALID; i++) {
if (omcurovl == practiceTbl[i][0]) {
break;
}
}
if (practiceTbl[i][0] != -1) {
HuPrcChildCreate(PracticeProc, 10, 8192, 0, process);
}
}
static void PracticeProc(void)
{
s16 group;
s16 sprite;
AnimData *anim;
s16 i;
s16 *practice;
float time;
static float yPosTbl[] = { 53, HU_DISP_HEIGHT - 56, HU_DISP_CENTERY };
time = 0.0f;
for (i = 0; practiceTbl[i][0] != OVL_INVALID; i++) {
if (omcurovl == practiceTbl[i][0]) {
break;
}
}
practice = &practiceTbl[i][0];
group = HuSprGrpCreate(1);
HuSprGrpPosSet(group, 0, 0);
anim = HuSprAnimRead(SeqReadFile(DATA_MAKE_NUM(DATADIR_GAMEMES, 5)));
sprite = HuSprCreate(anim, 1, 0);
HuSprGrpMemberSet(group, 0, sprite);
HuSprPosSet(group, 0, HU_DISP_CENTERX, yPosTbl[practice[1]]);
do {
if (!wipeFadeInF || WipeStatGet()) {
HuSprAttrSet(group, 0, HUSPR_ATTR_DISPOFF);
HuPrcVSleep();
continue;
}
HuSprAttrReset(group, 0, HUSPR_ATTR_DISPOFF);
for (i = 0; i < 4; i++) {
if (!(HuPadBtnDown[GWPlayerCfg[i].pad_idx] & PAD_TRIGGER_Z)) {
continue;
;
}
if (!GWPlayerCfg[i].iscom) {
break;
}
}
if (i != 4) {
break;
}
HuSprTPLvlSet(group, 0, fabs(sin(M_PI * time / 180.0)));
time += 2.0f;
HuPrcVSleep();
} while (1);
omSysExitReq = 1;
HuPrcEnd();
do {
HuPrcVSleep();
} while (1);
}
static s16 seqStartFXTbl[][2]
= { OVL_M401, 17, OVL_M402, 16, OVL_M403, 12, OVL_M404, 12, OVL_M405, 17, OVL_M406, 12, OVL_M407, 16, OVL_M408, 12, OVL_M409, 16, OVL_M410, 12,
OVL_M411, 16, OVL_M412, 12, OVL_M413, 16, OVL_M414, 16, OVL_M415, 16, OVL_M416, 16, OVL_M417, 17, OVL_M418, 16, OVL_M419, 16, OVL_M420, 16,
OVL_M421, 16, OVL_M422, 12, OVL_M423, 12, OVL_M424, 16, OVL_M425, 16, OVL_M426, 16, OVL_M427, 12, OVL_M428, 12, OVL_M429, 16, OVL_M430, 12,
OVL_M431, 16, OVL_M432, 12, OVL_M433, 12, OVL_M434, 16, OVL_M435, 12, OVL_M436, 16, OVL_M437, 12, OVL_M438, 16, OVL_M439, 12, OVL_M440, 16,
OVL_M441, 16, OVL_M442, 16, OVL_M443, -1, OVL_M444, -1, OVL_M445, 12, OVL_M446, -1, OVL_M447, 12, OVL_M448, -1, OVL_M449, 16, OVL_M450, 12,
OVL_M455, 17, OVL_M456, 17, OVL_M457, 12, OVL_M458, 12, OVL_M459, 17, OVL_M460, 12, OVL_M461, 12, OVL_M462, 12, OVL_INVALID, 0 };
static void SeqPlayStartFX(void)
{
s16 i;
for (i = 0; seqStartFXTbl[i][0] != OVL_INVALID; i++) {
if (omcurovl == seqStartFXTbl[i][0]) {
break;
}
}
if (seqStartFXTbl[i][0] == OVL_INVALID || seqStartFXTbl[i][1] == -1) {
return;
}
HuAudFXPlay(seqStartFXTbl[i][1]);
}
void MGSeqPracticeExitCheck(omObjData *object)
{
s16 input;
s16 i;
mgQuitExtraF = 0;
if (object->work[0] == 0) {
if (omMgIndexGet(omcurovl) == -1) {
omDelObjEx(HuPrcCurrentGet(), object);
return;
}
object->work[0]++;
}
if (!omPauseChk() || _CheckFlag(FLAG_ID_MAKE(1, 12)) || !pauseWaitF) {
return;
}
for (i = input = 0; i < 4; i++) {
input |= HuPadBtnDown[i];
}
if (input & PAD_TRIGGER_Z) {
HuAudFXPlay(3);
pauseExitF = 1;
omSysPauseCtrl(0);
omSysExitReq = 1;
mgQuitExtraF = 1;
omDelObjEx(HuPrcCurrentGet(), object);
}
}