3644 lines
123 KiB
C
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);
|
|
}
|
|
}
|