marioparty4/src/REL/E3setupDLL/main.c

1702 lines
39 KiB
C

#include "game/object.h"
#include "game/audio.h"
#include "game/gamework_data.h"
#include "game/hsfman.h"
#include "game/wipe.h"
#include "game/pad.h"
#include "game/hsfmotion.h"
#include "game/init.h"
#include "game/minigame_seq.h"
#include "game/chrman.h"
#include "game/sprite.h"
#include "game/window.h"
#include "ext_math.h"
#include "REL/E3SetupDLL.h"
static struct {
s16 playerCnt;
s16 rumble;
s16 mode;
s16 board;
s16 port[4];
s16 character[4];
} configE3;
E3Pad e3PadData[4];
s16 e3PadCtrl;
s16 e3ConfigPlayerCnt;
static s32 e3EvtNo;
s32 e3ExitEnableF;
s32 lbl_2_bss_B0;
OverlayID e3NextOvl;
s32 e3NextEvent;
u32 e3ExitMode;
static s32 needCharKill;
float e3CameraFov;
omObjData *e3MenuMainObj;
omObjData *e3ViewObj;
omObjData *e3OvlWatchObj;
static omObjData *cameraObj;
static omObjData *lbl_2_bss_84[2];
static omObjData *configModeObj[4];
omObjData *e3BGObj;
omObjData *lbl_2_bss_6C;
static s16 lightE3;
s16 lbl_2_bss_62[4];
s16 lbl_2_bss_60;
Vec lbl_2_bss_54;
Vec lbl_2_bss_48;
float lbl_2_bss_44;
s16 lbl_2_bss_40;
s32 lbl_2_bss_3C;
s16 lbl_2_bss_3A;
s16 lbl_2_bss_38;
s16 lbl_2_bss_36;
s16 lbl_2_bss_34;
s16 lbl_2_bss_2A[5];
static s16 repBtn;
static Vec shadowPos = {
0, 12000, 0
};
static Vec shadowTarget = {
0, 0, 0
};
static Vec shadowUp = {
0, 0, -1
};
Vec lbl_2_data_274[] = {
477.5, 500, -425,
-477.5, 500, -425,
477.5, 500, 425,
-477.5, 500, 425,
0.11, -1, -0.22,
-0.11, -1, -0.22,
0.11, -1, 0.22,
-0.11, -1, 0.22,
};
static s16 playerCntTbl[] = {
1, 2, 3, 4
};
static s16 charTbl[] = {
0, 1, 2, 3,
-1, -1, 6, 7
};
static s32 charSfxTbl[] = {
295,
359,
423,
487,
551,
615,
679,
743
};
void ObjectSetup(void)
{
e3EvtNo = omovlevtno;
HuAudSndGrpSetSet(0);
e3ExitEnableF = 0;
lbl_2_bss_B0 = 0;
e3PadCtrl = 0;
e3NextOvl = 0;
e3NextEvent = 0;
e3ExitMode = 0;
switch(e3EvtNo) {
default:
case 0:
repBtn = 0;
needCharKill = 1;
E3MainInit();
break;
case 1:
repBtn = 1;
needCharKill = 0;
E3MGSelectInit();
break;
}
}
static void InitCamera(omObjData *object);
static void InitMenuControl(omObjData *object);
static void InitPlayerCnt(omObjData *object);
static void InitCharSel(omObjData *object);
static void InitRumbleCfg(omObjData *object);
static void InitModeSel(omObjData *object);
void E3MainInit(void)
{
s32 idx = E3PadRead();
s32 port;
Process *objman;
if(idx == 0) {
OSReport("No pad detected\n");
idx++;
}
e3ConfigPlayerCnt = idx;
configE3.playerCnt = idx-1;
port = (GWRumbleGet()) ? 1 : 0;
configE3.rumble = port;
configE3.mode = 0;
configE3.board = 0;
for(port=0,idx=0; port<4; idx++, port++) {
while(idx < 8) {
if(charTbl[idx] >= 0) {
break;
}
idx++;
}
configE3.character[port] = idx;
}
for(port=0,idx=0; port<4; port++) {
if(!e3PadData[port].enable) {
configE3.port[idx] = port;
if(idx == 0) {
e3PadCtrl = port;
}
idx++;
}
}
for(port=0; port<4; port++) {
if(e3PadData[port].enable) {
configE3.port[idx] = port;
idx++;
}
}
HuSysVWaitSet(1);
objman = omInitObjMan(80, 8192);
HuWinInit(1);
CRot.x = -4;
CRot.y = 0;
CRot.z = 0;
Center.x = 0;
Center.y = 160;
Center.z = 0;
CZoom = 1960;
e3CameraFov = 40;
Hu3DCameraCreate(1);
Hu3DCameraPerspectiveSet(1, e3CameraFov, 100, 25000, 4.0f/3.0f);
Hu3DShadowCreate(e3CameraFov*0.3f, 100, 25000);
Hu3DShadowTPLvlSet(0.6f);
Hu3DShadowPosSet(&shadowPos, &shadowUp, &shadowTarget);
e3ViewObj = omAddObjEx(objman, 32730, 0, 0, -1, omOutView);
cameraObj = omAddObjEx(objman, 199, 0, 0, -1, InitCamera);
e3OvlWatchObj = omAddObjEx(objman, 200, 0, 0, -1, E3OvlWatchInit);
e3MenuMainObj = omAddObjEx(objman, 10, 0, 0, -1, InitMenuControl);
e3BGObj = omAddObjEx(objman, 20, 0, 0, -1, E3BGCreate);
configModeObj[0] = omAddObjEx(objman, 30, 0, 0, -1, InitPlayerCnt);
configModeObj[0]->work[0] = 1;
configModeObj[1] = omAddObjEx(objman, 30, 0, 0, -1, InitCharSel);
configModeObj[2] = omAddObjEx(objman, 30, 0, 0, -1, InitRumbleCfg);
configModeObj[3] = omAddObjEx(objman, 30, 0, 0, -1, InitModeSel);
E3LightInit();
WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, -1);
}
void E3LightInit(void)
{
s32 i;
lightE3 = lbl_2_bss_60 = -1;
for(i=0; i<4; i++) {
lbl_2_bss_62[i] = -1;
}
lbl_2_bss_54.x = 0;
lbl_2_bss_54.y = 1500;
lbl_2_bss_54.z = 0;
lbl_2_bss_48.x = 0;
lbl_2_bss_48.y = -1;
lbl_2_bss_48.z = 0;
lbl_2_bss_44 = 26;
lbl_2_bss_40 = 4;
lightE3 = Hu3DGLightCreate(0, 1500, 0, 0, -1, 0, 255, 255, 255);
Hu3DGLightStaticSet(lightE3, 1);
Hu3DGLightInfinitytSet(lightE3);
}
static float GetStickX(s8 value)
{
float new_value;
if(value > 69) {
value = 69;
} else if(value < -69) {
value = -69;
}
new_value = value;
new_value /= 69;
return new_value;
}
static s16 GetStickY(s8 value)
{
float new_value;
if(value > 69) {
value = 69;
} else if(value < -69) {
value = -69;
}
new_value = value;
new_value *= 255.0f/69;
return new_value;
}
static u16 GetBtn(s16 player)
{
u16 value;
if(repBtn) {
value = HuPadDStkRep[player];
value |= HuPadBtnRep[player];
} else {
value = HuPadDStk[player];
value |= HuPadBtn[player];
}
return value;
}
static u16 GetBtnDown(u16 button, u16 buttonLast)
{
u16 down = PADButtonUp(button, buttonLast);
return down;
}
u16 E3PadUpdate(s16 player, E3Pad *pad)
{
pad->enable = HuPadStatGet(player);
if(!pad->enable) {
u16 btn = GetBtn(player);
pad->btnDown = PADButtonUp(btn, pad->btn);
pad->btn = btn;
} else {
pad->btnDown = pad->btn = 0;
}
return pad->btnDown;
}
s16 E3PadRead(void)
{
s16 i;
s16 players;
for(i=0, players=0; i<4; i++) {
E3PadUpdate(i, &e3PadData[i]);
if(!e3PadData[i].enable) {
players++;
}
}
return players;
}
float MotionMaxTimeGet(s16 arg0)
{
MotionData *temp_r31 = &Hu3DMotion[arg0];
HsfMotion *temp_r30;
s16 temp_r29;
temp_r30 = temp_r31->unk_04->motion;
temp_r29 = temp_r30->len;
return temp_r29;
}
float MotionShiftTimeGet(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
return temp_r31->unk_84;
}
static void UpdateMenuControl(omObjData *object);
static void InitMenuControl(omObjData *object)
{
HuAudSeqPlay(43);
lbl_2_bss_3C = 0;
lbl_2_bss_3A = -1;
lbl_2_bss_36 = 30;
lbl_2_bss_34 = 0;
object->func = UpdateMenuControl;
worstVcount = 0;
object->work[0] = 0;
object->work[1] = 0;
object->work[3] = 0;
}
static void UpdateMenuControl(omObjData *object)
{
s32 pos;
if(e3ExitEnableF) {
return;
}
E3PadRead();
pos = object->work[1];
if(pos < 4) {
omObjData *config = configModeObj[pos];
if(config->work[0] == 0) {
if(config->work[3]) {
pos++;
} else {
pos--;
if(pos < 0) {
omOvlHisData *his;
pos=0;
his = omOvlHisGet(1);
omOvlHisChg(1, his->overlay, 1, his->stat);
e3ExitMode = 0;
e3NextOvl = 0;
e3NextEvent = 0;
e3ExitEnableF = 1;
}
}
if(pos < 4) {
configModeObj[pos]->work[0] = 1;
}
}
object->work[1] = pos;
}
if(pos >= 4) {
s32 playerCnt;
e3ExitMode = 2;
if(configE3.mode != 0) {
e3NextOvl = OVL_E3SETUP;
e3NextEvent = 1;
} else {
if(configE3.board != 0) {
e3NextOvl = OVL_W02;
} else {
e3NextOvl = OVL_W01;
}
}
GWRumbleSet(configE3.rumble);
playerCnt = playerCntTbl[configE3.playerCnt];
for(pos=0; pos<4; pos++) {
s16 character;
GWPlayerCfg[pos].pad_idx = configE3.port[pos];
character = configE3.character[pos];
GWPlayerCfg[pos].character = character;
if(configE3.mode == 0) {
HuAudFXPlay(charSfxTbl[character]);
}
GWPlayerCfg[pos].group = pos;
if(pos < playerCnt) {
GWPlayerCfg[pos].iscom = 0;
} else {
GWPlayerCfg[pos].iscom = 1;
}
}
e3ExitEnableF = 1;
}
}
static void UpdateOvlWatch(omObjData *object)
{
s32 i;
if(WipeStatGet()) {
return;
}
if(!MGSeqDoneCheck()) {
return;
}
HuSysVWaitSet(1);
if(needCharKill) {
CharKill(-1);
for(i=0; i<4; i++) {
CharARAMOpen(GWPlayerCfg[i].character);
}
}
if(e3ExitMode == 1) {
omOvlGotoEx(e3NextOvl, 1, e3NextEvent, 0);
} else if(e3ExitMode == 2) {
omOvlCallEx(e3NextOvl, 1, e3NextEvent, 0);
} else {
omOvlReturnEx(e3NextOvl+1, 1);
}
}
void E3OvlWatchInit(omObjData *object)
{
if(e3ExitEnableF) {
HuAudSeqAllFadeOut(2500);
WipeColorSet(0, 0, 0);
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, -1);
MGSeqKillAll();
object->func = UpdateOvlWatch;
}
}
typedef struct e3_player_cnt_work {
AnimData *frame[3];
AnimData *arrow;
AnimData *arrowHilite;
Vec2f winSize;
s16 frameGroup;
s16 arrowGroupL;
s16 arrowGroupR;
s16 unk22[6];
s16 winHeader;
s16 winPlayer;
s16 playerCnt;
s16 playerCntOld;
} E3PlayerCntWork;
static s16 lbl_2_data_31E[] = {
35, 38, 41, 44
};
static u32 playerCntMessTbl[] = {
MAKE_MESSID(0x22, 0x02),
MAKE_MESSID(0x22, 0x03),
MAKE_MESSID(0x22, 0x04),
MAKE_MESSID(0x22, 0x01)
};
static void UpdatePlayerCnt(omObjData *object)
{
E3PlayerCntWork *work = object->data;
s32 i;
u16 btnDown;
u32 mess;
if(object->work[1] != object->work[0]) {
if(object->work[0] == 0) {
object->work[2] = 4;
} else {
object->work[2] = 3;
}
object->work[1] = object->work[0];
}
btnDown = e3PadData[e3PadCtrl].btnDown;
switch(object->work[2]) {
case 0:
break;
case 1:
if(btnDown & PAD_BUTTON_A) {
HuAudFXPlay(1);
configE3.playerCnt = work->playerCnt;
object->work[0] = 0;
object->work[3] = 1;
} else if(btnDown & PAD_BUTTON_B) {
HuAudFXPlay(3);
work->playerCnt = configE3.playerCnt;
object->work[0] = 0;
object->work[3] = 0;
} else {
if(e3ConfigPlayerCnt) {
if(btnDown & PAD_BUTTON_LEFT) {
HuAudFXPlay(0);
work->playerCnt--;
if(work->playerCnt < 0) {
work->playerCnt = e3ConfigPlayerCnt-1;
if(work->playerCnt < 0) {
work->playerCnt = 0;
}
}
} else if(btnDown & PAD_BUTTON_RIGHT) {
HuAudFXPlay(0);
work->playerCnt++;
if(work->playerCnt >= e3ConfigPlayerCnt) {
work->playerCnt = 0;
}
}
} else {
work->playerCnt = 0;
}
}
break;
case 3:
HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
if(e3ConfigPlayerCnt > 1) {
for(i=0; i<2; i++) {
HuSprAttrReset(work->arrowGroupL, i, HUSPR_ATTR_DISPOFF);
HuSprAttrReset(work->arrowGroupR, i, HUSPR_ATTR_DISPOFF);
}
}
object->work[2] = 1;
break;
case 4:
HuSprAttrReset(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
for(i=0; i<2; i++) {
HuSprAttrSet(work->arrowGroupL, i, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(work->arrowGroupR, i, HUSPR_ATTR_DISPOFF);
}
object->work[2] = 0;
break;
}
if(work->playerCntOld != work->playerCnt) {
float size[2];
mess = playerCntMessTbl[work->playerCnt];
HuWinMesMaxSizeGet(1, size, mess);
HuWinCenterPosSet(work->winPlayer, (work->winSize.x-size[0])/-2.0f, (work->winSize.y-size[1])/-2.0f);
HuWinMesSet(work->winPlayer, mess);
work->playerCntOld = work->playerCnt;
}
}
static void InitPlayerCnt(omObjData *object)
{
E3PlayerCntWork *work;
s16 index2;
s32 index;
s16 group;
AnimData *anim;
u32 mess;
float sizeMax[2]; //FIXME: Change to Vec2f
float size[2]; //FIXME: Change to Vec2f
omSetStatBit(object, 0x100);
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3PlayerCntWork), MEMORY_DEFAULT_NUM);
work = object->data;
index = 0;
group = HuSprGrpCreate(3);
work->frameGroup = group;
HuSprGrpPosSet(group, 288, 80);
anim = HuSprAnimRead(HuDataReadNum(2, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 30008, 0);
HuSprGrpMemberSet(group, index, index2);
HuSprTPLvlSet(group, index, 0.5f);
index++;
anim = HuSprAnimRead(HuDataReadNum(1, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 30000, 0);
HuSprGrpMemberSet(group, index, index2);
index++;
anim = HuSprAnimRead(HuDataReadNum(3, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 1, 0);
HuSprGrpMemberSet(group, index, index2);
HuSprTPLvlSet(group, index, 0.4f);
anim = HuSprAnimRead(HuDataReadNum(12, MEMORY_DEFAULT_NUM));
work->arrow = anim;
work->arrowHilite = HuSprAnimRead(HuDataReadNum(13, MEMORY_DEFAULT_NUM));
group = HuSprGrpCreate(2);
work->arrowGroupL = group;
HuSprGrpPosSet(group, 140, 96);
index2 = HuSprCreate(anim, 4, 0);
HuSprGrpMemberSet(group, 0, index2);
index2 = HuSprCreate(work->arrowHilite, 6, 0);
HuSprGrpMemberSet(group, 1, index2);
HuSprTPLvlSet(group, 1, 0.5f);
HuSprPosSet(group, 1, 0, -4);
group = HuSprGrpCreate(2);
work->arrowGroupR = group;
HuSprGrpPosSet(group, 436, 96);
index2 = HuSprCreate(anim, 4, 1);
HuSprGrpMemberSet(group, 0, index2);
index2 = HuSprCreate(work->arrowHilite, 6, 1);
HuSprGrpMemberSet(group, 1, index2);
HuSprTPLvlSet(group, 1, 0.5f);
HuSprPosSet(group, 1, 0, -4);
index2 = work->arrowGroupL;
for(index=0; index<2; index++) {
HuSprAttrSet(group, index, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(index2, index, HUSPR_ATTR_DISPOFF);
}
HuWinMesMaxSizeGet(1, sizeMax, MAKE_MESSID(0x22, 0x00));
index2 = HuWinCreate(-10000, 26, sizeMax[0], sizeMax[1], 0);
work->winHeader = index2;
HuWinMesColSet(index2, 4);
HuWinBGTPLvlSet(index2, 0);
HuWinMesSpeedSet(index2, 0);
HuWinMesSet(index2, MAKE_MESSID(0x22, 0x00));
work->playerCntOld = work->playerCnt = configE3.playerCnt;
mess = playerCntMessTbl[work->playerCnt];
HuWinMesMaxSizeGet(4, sizeMax, MAKE_MESSID(0x22, 0x01), MAKE_MESSID(0x22, 0x02), MAKE_MESSID(0x22, 0x03), MAKE_MESSID(0x22, 0x04));
index2 = HuWinCreate(-10000, 58, sizeMax[0], sizeMax[1], 0);
work->winPlayer = index2;
work->winSize = *(Vec2f *)(sizeMax); //FIXME: Remove Cast
HuWinBGTPLvlSet(index2, 0);
HuWinMesSpeedSet(index2, 0);
HuWinMesMaxSizeGet(1, size, mess);
HuWinCenterPosSet(index2, (sizeMax[0]-size[0])/-2.0f, (sizeMax[1]-size[1])/-2.0f);
HuWinMesSet(index2, mess);
if(object->work[0] == 1) {
HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
if(e3ConfigPlayerCnt > 1) {
group = work->arrowGroupR;
index2 = work->arrowGroupL;
for(index=0; index<2; index++) {
HuSprAttrReset(group, index, HUSPR_ATTR_DISPOFF);
HuSprAttrReset(index2, index, HUSPR_ATTR_DISPOFF);
}
}
object->work[1] = 1;
object->work[2] = 1;
}
object->func = UpdatePlayerCnt;
(void)object;
}
typedef struct e3_char_sel_work {
AnimData *anims[24];
s16 frameGroup;
s16 charGroup;
s16 cursorGroup;
s16 hiliteGroup;
s16 unk68[6];
s16 cursorPos[4];
s16 cursorStat[4];
s16 currPlayer;
} E3CharSelWork;
static Vec2f charPosTbl[] = {
85, 248,
143, 248,
201, 248,
259, 248,
317, 248,
375, 248,
433, 248,
491, 248
};
static s32 charComSfxTbl[] = {
294,
358,
422,
486,
550,
614,
678,
742
};
static void UpdateCharSelCursor(omObjData *object, s32 backF)
{
s32 i;
E3CharSelWork *work;
s16 cursorPos;
s16 cursorGroup;
s16 playerSpr;
s16 playerCnt;
s16 hiliteGroup;
work = object->data;
cursorGroup = work->cursorGroup;
hiliteGroup = work->hiliteGroup;
if(!backF) {
for(i=0; i<7; i++) {
HuSprAttrSet(cursorGroup, i, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(hiliteGroup, i, HUSPR_ATTR_DISPOFF);
}
return;
}
playerCnt = playerCntTbl[configE3.playerCnt];
for(i=0; i<playerCnt; i++) {
cursorPos = 0;
if(work->cursorStat[i]) {
cursorPos = 1;
}
HuSprBankSet(cursorGroup, i, cursorPos);
cursorPos = work->cursorPos[i];
HuSprPosSet(cursorGroup, i, charPosTbl[cursorPos].x, charPosTbl[cursorPos].y);
HuSprAttrReset(cursorGroup, i, HUSPR_ATTR_DISPOFF);
}
for(; i<4; i++) {
cursorPos = 0;
playerSpr = (4+i)-(s32)playerCnt;
if(work->cursorStat[i] != 0) {
if(work->cursorStat[i] == 3) {
cursorPos = 1;
}
HuSprBankSet(cursorGroup, playerSpr, cursorPos);
cursorPos = work->cursorPos[i];
HuSprPosSet(cursorGroup, playerSpr, charPosTbl[cursorPos].x, charPosTbl[cursorPos].y);
HuSprAttrReset(cursorGroup, playerSpr, HUSPR_ATTR_DISPOFF);
} else {
HuSprAttrSet(cursorGroup, playerSpr, HUSPR_ATTR_DISPOFF);
}
}
}
static s32 UpdateCharSelPlayerCursor(omObjData *object)
{
E3CharSelWork *temp_r31;
s32 temp_r30;
s16 temp_r29;
s32 temp_r28;
s16 temp_r27;
s32 temp_r26;
s16 temp_r25;
s16 temp_r24;
s16 temp_r23;
s32 temp_r22;
s16 temp_r21;
s16 temp_r20;
s16 temp_r19;
s16 temp_r18;
s16 sp8[8];
temp_r31 = object->data;
temp_r22 = 0;
temp_r23 = playerCntTbl[configE3.playerCnt];
temp_r24 = 0;
temp_r20 = 0;
for(temp_r30=0; temp_r30 < temp_r23; temp_r30++) {
temp_r19 = configE3.port[temp_r30];
if(e3PadData[temp_r19].enable) {
if(temp_r31->cursorStat[temp_r30] == 0) {
temp_r31->cursorStat[temp_r30] = 1;
}
temp_r24++;
continue;
}
temp_r25 = e3PadData[temp_r19].btnDown;
if(temp_r25 & PAD_BUTTON_A) {
HuAudFXPlay(1);
temp_r28 = charTbl[temp_r31->cursorPos[temp_r30]];
HuAudFXPlay(charComSfxTbl[temp_r28]);
temp_r31->cursorStat[temp_r30] = 1;
} else if(temp_r25 & PAD_BUTTON_B) {
HuAudFXPlay(3);
if(temp_r30 == e3PadCtrl && temp_r31->cursorStat[temp_r30] == 0) {
temp_r20 = 1;
}
temp_r31->cursorStat[temp_r30] = 0;
}
if(temp_r31->cursorStat[temp_r30] != 0) {
temp_r24++;
continue;
}
if(temp_r25 & (PAD_BUTTON_LEFT|PAD_BUTTON_RIGHT)) {
temp_r27 = 0;
for(temp_r28=0; temp_r28<8; temp_r28++) {
if(charTbl[temp_r28] >= 0) {
if(temp_r28 == temp_r31->cursorPos[temp_r30]) {
temp_r29 = temp_r27;
sp8[temp_r27++] = temp_r28;
} else {
for(temp_r26=0; temp_r26<temp_r23; temp_r26++) {
if(temp_r30 == temp_r26) {
continue;
}
if(temp_r31->cursorPos[temp_r26] == temp_r28) {
break;
}
}
if(temp_r26 >= temp_r23) {
sp8[temp_r27++] = temp_r28;
}
}
}
}
sp8[temp_r27] = -1;
temp_r21 = temp_r27;
temp_r18 = temp_r29;
if(temp_r21 > 1) {
if(temp_r25 & PAD_BUTTON_LEFT) {
HuAudFXPlay(26);
temp_r29--;
if(temp_r29 < 0) {
temp_r29 = temp_r21-1;
}
} else if(temp_r25 & PAD_BUTTON_RIGHT) {
HuAudFXPlay(26);
temp_r29++;
if(temp_r29 >= temp_r21) {
temp_r29 = 0;
}
}
if(temp_r18 != temp_r29) {
temp_r31->cursorPos[temp_r30] = sp8[temp_r29];
}
}
}
}
if(temp_r24 >= temp_r23) {
temp_r22 = 1;
}
if(temp_r20) {
temp_r22 = -1;
}
return temp_r22;
}
static s32 UpdateCharSelComCursor(omObjData *object)
{
E3CharSelWork *temp_r31;
s16 temp_r30;
s16 temp_r29;
s32 temp_r28;
s32 temp_r27;
s16 temp_r26;
s16 temp_r25;
s32 temp_r24;
s16 temp_r23;
s16 temp_r22;
s32 temp_r21;
s16 temp_r20;
s16 temp_r19;
s16 sp8[8];
temp_r31 = object->data;
temp_r21 = 0;
temp_r20 = playerCntTbl[configE3.playerCnt];
temp_r19 = 4-temp_r20;
temp_r30 = temp_r20+temp_r31->currPlayer-1;
temp_r31->cursorStat[temp_r30] = 1;
temp_r26 = temp_r31->cursorPos[temp_r30];
for(temp_r28=0; temp_r28<temp_r30; temp_r28++) {
if(temp_r31->cursorPos[temp_r28] == temp_r26) {
break;
}
}
if(temp_r28<temp_r30) {
temp_r26 = -1;
}
temp_r25 = 0;
for(temp_r27=0; temp_r27<8; temp_r27++) {
if(charTbl[temp_r27] >= 0) {
if(temp_r27 == temp_r26) {
temp_r29 = temp_r25;
sp8[temp_r25++] = temp_r27;
} else {
for(temp_r24=0; temp_r24<temp_r30; temp_r24++) {
if(temp_r31->cursorPos[temp_r24] == temp_r27) {
break;
}
}
if(temp_r24 >= temp_r30) {
sp8[temp_r25++] = temp_r27;
}
}
}
}
temp_r22 = temp_r25;
if(temp_r26 < 0) {
temp_r29 = 0;
temp_r31->cursorPos[temp_r30] = sp8[temp_r29];
}
temp_r23 = e3PadData[e3PadCtrl].btnDown;
if(temp_r23 & PAD_BUTTON_A) {
HuAudFXPlay(1);
HuAudFXPlay(charComSfxTbl[charTbl[temp_r31->cursorPos[temp_r30]]]);
temp_r31->cursorStat[temp_r30] = 3;
if(temp_r31->currPlayer >= temp_r19) {
temp_r21 = 1;
} else {
temp_r31->currPlayer++;
}
} else if(temp_r23 & PAD_BUTTON_B) {
HuAudFXPlay(3);
temp_r31->cursorStat[temp_r30] = 0;
temp_r31->currPlayer--;
if(temp_r31->currPlayer != 0) {
temp_r30--;
temp_r31->cursorStat[temp_r30] = 1;
} else {
for(temp_r28=0; temp_r28<4; temp_r28++) {
temp_r31->cursorStat[temp_r28] = 0;
}
}
} else if(temp_r23 & (PAD_BUTTON_LEFT|PAD_BUTTON_RIGHT)) {
temp_r26 = temp_r29;
if(temp_r22 > 1) {
if(temp_r23 & PAD_BUTTON_LEFT) {
HuAudFXPlay(26);
temp_r29--;
if(temp_r29 < 0) {
temp_r29 = temp_r22-1;
}
} else if(temp_r23 & PAD_BUTTON_RIGHT) {
HuAudFXPlay(26);
temp_r29++;
if(temp_r29 >= temp_r22) {
temp_r29 = 0;
}
}
if(temp_r26 != temp_r29) {
temp_r31->cursorPos[temp_r28] = sp8[temp_r29];
}
}
}
return temp_r21;
}
static s32 CheckCharSel(omObjData *object)
{
E3CharSelWork *work;
s32 result;
work = object->data;
result = 0;
if(work->currPlayer == 0) {
result = UpdateCharSelPlayerCursor(object);
if(result == 1) {
if(playerCntTbl[configE3.playerCnt] < 4) {
result = 0;
work->currPlayer++;
}
}
} else {
result = UpdateCharSelComCursor(object);
}
return result;
}
static void UpdateCharSel(omObjData *object)
{
s32 i;
E3CharSelWork *work;
u16 btnDown;
work = object->data;
if(object->work[1] != object->work[0]) {
if(object->work[0] == 0) {
object->work[2] = 4;
} else {
object->work[2] = 3;
}
object->work[1] = object->work[0];
}
btnDown = e3PadData[e3PadCtrl].btnDown;
switch(object->work[2]) {
case 0:
break;
case 1:
i = CheckCharSel(object);
if(i == 1) {
for(i=0; i<4; i++) {
configE3.character[i] = work->cursorPos[i];
}
object->work[0] = 0;
object->work[3] = 1;
} else {
if(i < 0) {
for(i=0; i<4; i++) {
work->cursorPos[i] = configE3.character[i];
}
object->work[0] = 0;
object->work[3] = 0;
}
}
UpdateCharSelCursor(object, 1);
break;
case 3:
HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
object->work[2] = 1;
if(work->currPlayer != 0) {
i = work->currPlayer+(i = playerCntTbl[configE3.playerCnt]-1);
OSReport("selmode %d %d\n", work->currPlayer, i);
work->cursorStat[i] = 0;
} else {
for(i=0; i<4; i++) {
work->cursorStat[i] = 0;
}
}
UpdateCharSelCursor(object, 1);
break;
case 4:
HuSprAttrReset(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
object->work[2] = 0;
UpdateCharSelCursor(object, object->work[3]);
break;
}
}
static s32 charSpriteTbl[] = {
25,
26,
27,
28,
29,
30,
31,
32
};
static s32 cursorSpriteTbl[] = {
14,
15,
16,
17,
18
};
static s32 hiliteSprTbl[] = {
19,
20,
21,
22,
23
};
static void InitCharSel(omObjData *object)
{
E3CharSelWork *work;
s32 i;
s16 member;
s16 group;
AnimData *anim;
s16 sprite;
s16 j;
s16 x;
omSetStatBit(object, 0x100);
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3CharSelWork), MEMORY_DEFAULT_NUM);
work = object->data;
i=0;
member=0;
group = HuSprGrpCreate(3);
work->frameGroup = group;
HuSprGrpPosSet(group, 288, 200);
anim = HuSprAnimRead(HuDataReadNum(2, MEMORY_DEFAULT_NUM));
work->anims[member] = anim;
sprite = HuSprCreate(anim, 30008, 0);
HuSprGrpMemberSet(group, member, sprite);
HuSprTPLvlSet(group, member, 0.5f);
member++;
anim = HuSprAnimRead(HuDataReadNum(1, MEMORY_DEFAULT_NUM));
work->anims[member] = anim;
sprite = HuSprCreate(anim, 30000, 0);
HuSprGrpMemberSet(group, member, sprite);
member++;
anim = HuSprAnimRead(HuDataReadNum(3, MEMORY_DEFAULT_NUM));
work->anims[member] = anim;
sprite = HuSprCreate(anim, 1, 0);
HuSprGrpMemberSet(group, member, sprite);
HuSprTPLvlSet(group, member, 0.4f);
member++;
group = HuSprGrpCreate(16);
work->charGroup = group;
HuSprGrpPosSet(group, 288, 200);
x = -203;
for(j=0; j<8; j++, member++) {
anim = HuSprAnimRead(HuDataReadNum(charSpriteTbl[j], MEMORY_DEFAULT_NUM));
work->anims[member] = anim;
sprite = HuSprCreate(anim, 28010, 0);
HuSprGrpMemberSet(group, j, sprite);
HuSprPosSet(group, j, x, 0);
x += 58;
}
anim = HuSprAnimRead(HuDataReadNum(24, MEMORY_DEFAULT_NUM));
work->anims[member] = anim;
member++;
x = -203;
for(i=0; i<8; i++) {
if(charTbl[i] < 0){
sprite = HuSprCreate(anim, 28000, 0);
HuSprGrpMemberSet(group, j, sprite);
HuSprPosSet(group, j, x, 0);
HuSprTPLvlSet(group, j, 0.5f);
j++;
}
x += 58;
}
group = HuSprGrpCreate(7);
work->cursorGroup = group;
HuSprGrpPosSet(group, 0, 0);
for(i=0; i<7; i++) {
if(i < 5) {
anim = HuSprAnimRead(HuDataReadNum(cursorSpriteTbl[i], MEMORY_DEFAULT_NUM));
work->anims[member] = anim;
member++;
}
sprite = HuSprCreate(anim, 10010, 0);
HuSprGrpMemberSet(group, i, sprite);
HuSprAttrSet(group, i, HUSPR_ATTR_DISPOFF);
}
group = HuSprGrpCreate(7);
work->hiliteGroup = group;
HuSprGrpPosSet(group, 0, 0);
for(i=0; i<7; i++) {
if(i < 5) {
anim = HuSprAnimRead(HuDataReadNum(hiliteSprTbl[i], MEMORY_DEFAULT_NUM));
work->anims[member] = anim;
member++;
}
sprite = HuSprCreate(anim, 10000, 0);
HuSprGrpMemberSet(group, i, sprite);
HuSprAttrSet(group, i, HUSPR_ATTR_DISPOFF);
}
for(i=0; i<4; i++) {
work->cursorPos[i] = configE3.character[i];
work->cursorStat[i] = 0;
}
work->currPlayer = 0;
object->work[1] = 0;
object->work[2] = 0;
object->work[3] = 0;
object->func = UpdateCharSel;
}
typedef struct e3_rumble_cfg_work {
AnimData *frame[3];
AnimData *arrow;
AnimData *arrowHilite;
Vec2f winSize;
s16 frameGroup;
s16 arrowGroupL;
s16 arrowGroupR;
s16 unk22[6];
s16 winHeader;
s16 winValue;
s16 rumbleVal;
s16 rumbleValOld;
} E3RumbleCfgWork;
static u32 rumbleMess[] = {
MAKE_MESSID(0x22, 0x08),
MAKE_MESSID(0x22, 0x07)
};
static void UpdateRumbleCfg(omObjData *object)
{
E3RumbleCfgWork *work;
s32 i;
u16 btnDown;
work = object->data;
if(object->work[1] != object->work[0]) {
if(object->work[0] == 0) {
object->work[2] = 4;
} else {
object->work[2] = 3;
}
object->work[1] = object->work[0];
}
btnDown = e3PadData[e3PadCtrl].btnDown;
switch(object->work[2]) {
case 0:
break;
case 1:
if(btnDown & PAD_BUTTON_A) {
HuAudFXPlay(1);
configE3.rumble = work->rumbleVal;
object->work[0] = 0;
object->work[3] = 1;
} else if(btnDown & PAD_BUTTON_B) {
HuAudFXPlay(3);
work->rumbleVal = configE3.rumble;
object->work[0] = 0;
object->work[3] = 0;
} else if(btnDown & PAD_BUTTON_LEFT) {
HuAudFXPlay(0);
work->rumbleVal--;
if(work->rumbleVal < 0) {
work->rumbleVal = 1;
}
} else if(btnDown & PAD_BUTTON_RIGHT) {
HuAudFXPlay(0);
work->rumbleVal++;
if(work->rumbleVal > 1) {
work->rumbleVal = 0;
}
}
break;
case 3:
HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
for(i=0; i<2; i++) {
HuSprAttrReset(work->arrowGroupL, i, HUSPR_ATTR_DISPOFF);
HuSprAttrReset(work->arrowGroupR, i, HUSPR_ATTR_DISPOFF);
}
object->work[2] = 1;
break;
case 4:
HuSprAttrReset(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
for(i=0; i<2; i++) {
HuSprAttrSet(work->arrowGroupL, i, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(work->arrowGroupR, i, HUSPR_ATTR_DISPOFF);
}
object->work[2] = 0;
break;
}
if(work->rumbleValOld != work->rumbleVal) {
u32 mess;
float size[2];
mess = rumbleMess[work->rumbleVal];
HuWinMesMaxSizeGet(1, size, mess);
HuWinCenterPosSet(work->winValue, (work->winSize.x-size[0])/-2.0f, (work->winSize.y-size[1])/-2.0f);
HuWinMesSet(work->winValue, mess);
work->rumbleValOld = work->rumbleVal;
}
}
static void InitRumbleCfg(omObjData *object)
{
E3RumbleCfgWork *work;
s16 index2;
s16 group;
s32 index;
AnimData *anim;
u32 mess;
float sizeMax[2]; //FIXME: Change to Vec2f
float size[2]; //FIXME: Change to Vec2f
omSetStatBit(object, 0x100);
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3RumbleCfgWork), MEMORY_DEFAULT_NUM);
work = object->data;
index = 0;
group = HuSprGrpCreate(3);
work->frameGroup = group;
HuSprGrpPosSet(group, 288, 303);
anim = HuSprAnimRead(HuDataReadNum(8, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 30008, 0);
HuSprGrpMemberSet(group, index, index2);
HuSprTPLvlSet(group, index, 0.5f);
index++;
anim = HuSprAnimRead(HuDataReadNum(7, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 30000, 0);
HuSprGrpMemberSet(group, index, index2);
index++;
anim = HuSprAnimRead(HuDataReadNum(9, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 1, 0);
HuSprGrpMemberSet(group, index, index2);
HuSprTPLvlSet(group, index, 0.4f);
anim = HuSprAnimRead(HuDataReadNum(12, MEMORY_DEFAULT_NUM));
work->arrow = anim;
work->arrowHilite = HuSprAnimRead(HuDataReadNum(13, MEMORY_DEFAULT_NUM));
group = HuSprGrpCreate(2);
work->arrowGroupL = group;
HuSprGrpPosSet(group, 240, 319);
index2 = HuSprCreate(anim, 4, 0);
HuSprGrpMemberSet(group, 0, index2);
index2 = HuSprCreate(work->arrowHilite, 6, 0);
HuSprGrpMemberSet(group, 1, index2);
HuSprTPLvlSet(group, 1, 0.5f);
HuSprPosSet(group, 1, 0, -4);
group = HuSprGrpCreate(2);
work->arrowGroupR = group;
HuSprGrpPosSet(group, 336, 319);
index2 = HuSprCreate(anim, 4, 1);
HuSprGrpMemberSet(group, 0, index2);
index2 = HuSprCreate(work->arrowHilite, 6, 1);
HuSprGrpMemberSet(group, 1, index2);
HuSprTPLvlSet(group, 1, 0.5f);
HuSprPosSet(group, 1, 0, -4);
index2 = work->arrowGroupL;
for(index=0; index<2; index++) {
HuSprAttrSet(group, index, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(index2, index, HUSPR_ATTR_DISPOFF);
}
HuWinMesMaxSizeGet(1, sizeMax, MAKE_MESSID(0x22, 0x06));
index2 = HuWinCreate(-10000, 267, sizeMax[0], sizeMax[1], 0);
work->winHeader = index2;
HuWinMesColSet(index2, 4);
HuWinBGTPLvlSet(index2, 0);
HuWinMesSpeedSet(index2, 0);
HuWinMesSet(index2, MAKE_MESSID(0x22, 0x06));
work->rumbleValOld = work->rumbleVal = configE3.rumble;
mess = rumbleMess[work->rumbleVal];
HuWinMesMaxSizeGet(2, sizeMax, MAKE_MESSID(0x22, 0x07), MAKE_MESSID(0x22, 0x08));
index2 = HuWinCreate(-10000, 299, sizeMax[0], sizeMax[1], 0);
work->winValue = index2;
work->winSize = *(Vec2f *)(sizeMax); //FIXME: Remove Cast
HuWinBGTPLvlSet(index2, 0);
HuWinMesSpeedSet(index2, 0);
HuWinMesMaxSizeGet(1, size, mess);
HuWinCenterPosSet(index2, (sizeMax[0]-size[0])/-2.0f, 0);
HuWinMesSet(index2, mess);
object->work[1] = 0;
object->work[2] = 0;
object->work[3] = 0;
object->func = UpdateRumbleCfg;
(void)object;
}
typedef struct e3_mode_sel_work {
AnimData *frame[7];
Vec2f winSizeMode;
Vec2f winSizeBoard;
s16 frameGroup;
s16 arrowGroupL;
s16 arrowGroupR;
s16 cursorGroup;
s16 unk34[6];
s16 winMode;
s16 winBoard;
s16 mode;
s16 modeOld;
s16 board;
s16 boardOld;
} E3ModeSelWork;
static Vec2f modeSelCursorPosTbl[] = {
144, 418,
288, 418
};
static Vec2f boardSelCursorPosTbl[] = {
94, 418,
284, 418
};
static void UpdateModeSel(omObjData *object)
{
E3ModeSelWork *work;
u16 btnDown;
float winSize[2];
work = object->data;
if(object->work[1] != object->work[0]) {
if(object->work[0] == 0) {
object->work[2] = 4;
} else {
object->work[2] = 3;
}
object->work[1] = object->work[0];
}
btnDown = e3PadData[e3PadCtrl].btnDown;
switch(object->work[2]) {
case 0:
break;
case 1:
if(btnDown & PAD_BUTTON_A) {
HuAudFXPlay(1);
configE3.mode = work->mode;
if(work->mode != 0) {
object->work[0] = 0;
object->work[3] = 1;
} else {
object->work[2] = 2;
work->boardOld = -1;
HuWinMesColSet(work->winMode, 4);
HuWinMesMaxSizeGet(1, winSize, MAKE_MESSID(0x22, 0x0F));
HuWinCenterPosSet(work->winMode, (work->winSizeMode.x-winSize[0])/-2.0f, (work->winSizeMode.y-winSize[1])/-2.0f);
HuWinMesSet(work->winMode, MAKE_MESSID(0x22, 0x0F));
HuWinMesMaxSizeGet(1, winSize, MAKE_MESSID(0x22, 0x10));
HuWinCenterPosSet(work->winBoard, (work->winSizeBoard.x-winSize[0])/-2.0f, (work->winSizeBoard.y-winSize[1])/-2.0f);
HuWinMesSet(work->winBoard, MAKE_MESSID(0x22, 0x10));
}
} else if(btnDown & PAD_BUTTON_B) {
HuAudFXPlay(3);
work->mode = configE3.mode;
object->work[0] = 0;
object->work[3] = 0;
} else if(btnDown & PAD_BUTTON_LEFT) {
HuAudFXPlay(0);
work->mode--;
if(work->mode < 0) {
work->mode = 1;
}
} else if(btnDown & PAD_BUTTON_RIGHT) {
HuAudFXPlay(0);
work->mode++;
if(work->mode > 1) {
work->mode = 0;
}
}
break;
case 2:
if(btnDown & PAD_BUTTON_A) {
HuAudFXPlay(1);
configE3.board = work->board;
object->work[0] = 0;
object->work[3] = 1;
} else if(btnDown & PAD_BUTTON_B) {
HuAudFXPlay(3);
work->boardOld = work->board;
work->modeOld = -1;
object->work[2] = 1;
HuWinMesColSet(work->winMode, 4);
HuWinMesMaxSizeGet(1, winSize, MAKE_MESSID(0x22, 0x09));
HuWinCenterPosSet(work->winMode, (work->winSizeMode.x-winSize[0])/-2.0f, (work->winSizeMode.y-winSize[1])/-2.0f);
HuWinMesSet(work->winMode, MAKE_MESSID(0x22, 0x09));
HuWinMesMaxSizeGet(1, winSize, MAKE_MESSID(0x22, 0x0A));
HuWinCenterPosSet(work->winBoard, (work->winSizeBoard.x-winSize[0])/-2.0f, (work->winSizeBoard.y-winSize[1])/-2.0f);
HuWinMesSet(work->winBoard, MAKE_MESSID(0x22, 0x0A));
} else if(btnDown & PAD_BUTTON_LEFT) {
HuAudFXPlay(0);
work->board--;
if(work->board < 0) {
work->board = 1;
}
} else if(btnDown & PAD_BUTTON_RIGHT) {
HuAudFXPlay(0);
work->board++;
if(work->board > 1) {
work->board = 0;
}
}
break;
case 3:
HuSprAttrSet(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
HuSprAttrReset(work->cursorGroup, 0, HUSPR_ATTR_DISPOFF);
HuSprAttrReset(work->cursorGroup, 1, HUSPR_ATTR_DISPOFF);
object->work[2] = 1;
break;
case 4:
HuSprAttrReset(work->frameGroup, 2, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(work->cursorGroup, 0, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(work->cursorGroup, 1, HUSPR_ATTR_DISPOFF);
object->work[2] = 0;
break;
}
if(object->work[0]) {
if(work->modeOld != work->mode) {
HuSprGrpPosSet(work->cursorGroup, modeSelCursorPosTbl[work->mode].x, modeSelCursorPosTbl[work->mode].y);
work->modeOld = work->mode;
}
if(work->boardOld != work->board) {
HuSprGrpPosSet(work->cursorGroup, boardSelCursorPosTbl[work->board].x, boardSelCursorPosTbl[work->board].y);
work->boardOld = work->board;
}
}
}
static void InitModeSel(omObjData *object)
{
E3ModeSelWork *work;
s16 index2;
s32 index;
s16 group;
AnimData *anim;
float size[2]; //FIXME: Change to Vec2f
omSetStatBit(object, 0x100);
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3ModeSelWork), MEMORY_DEFAULT_NUM);
work = object->data;
index = 0;
group = HuSprGrpCreate(3);
work->frameGroup = group;
HuSprGrpPosSet(group, 288, 398);
anim = HuSprAnimRead(HuDataReadNum(5, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 30008, 0);
HuSprGrpMemberSet(group, index, index2);
HuSprTPLvlSet(group, index, 0.5f);
index++;
anim = HuSprAnimRead(HuDataReadNum(4, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 30000, 0);
HuSprGrpMemberSet(group, index, index2);
index++;
anim = HuSprAnimRead(HuDataReadNum(6, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 1, 0);
HuSprGrpMemberSet(group, index, index2);
HuSprTPLvlSet(group, index, 0.4f);
index++;
work->modeOld = work->mode = configE3.mode;
work->board = work->boardOld = 0;
group = HuSprGrpCreate(2);
work->cursorGroup = group;
HuSprGrpPosSet(group, modeSelCursorPosTbl[work->mode].x, modeSelCursorPosTbl[work->mode].y);
anim = HuSprAnimRead(HuDataReadNum(10, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 10000, 0);
HuSprGrpMemberSet(group, 0, index2);
index++;
anim = HuSprAnimRead(HuDataReadNum(11, MEMORY_DEFAULT_NUM));
work->frame[index] = anim;
index2 = HuSprCreate(anim, 10008, 0);
HuSprGrpMemberSet(group, 1, index2);
HuSprTPLvlSet(group, 1, 0.5f);
HuSprPosSet(group, 1, 0, -4);
index++;
HuSprAttrSet(group, 0, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(group, 1, HUSPR_ATTR_DISPOFF);
HuWinMesMaxSizeGet(2, &work->winSizeMode.x, MAKE_MESSID(0x22, 0x09), MAKE_MESSID(0x22, 0x0F));
index2 = HuWinCreate(-10000, 350, work->winSizeMode.x, work->winSizeMode.y, 0);
work->winMode = index2;
HuWinMesColSet(index2, 4);
HuWinBGTPLvlSet(index2, 0);
HuWinMesSpeedSet(index2, 0);
HuWinMesMaxSizeGet(1, size, MAKE_MESSID(0x22, 0x09));
HuWinCenterPosSet(index2, (work->winSizeMode.x-size[0])/-2.0f, (work->winSizeMode.y-size[1])/-2.0f);
HuWinMesSet(index2, MAKE_MESSID(0x22, 0x09));
HuWinMesMaxSizeGet(2, &work->winSizeBoard.x, MAKE_MESSID(0x22, 0x0A), MAKE_MESSID(0x22, 0x10));
index2 = HuWinCreate(-10000, 390, work->winSizeBoard.x, work->winSizeBoard.y, 0);
work->winBoard = index2;
HuWinBGTPLvlSet(index2, 0);
HuWinMesSpeedSet(index2, 0);
HuWinMesMaxSizeGet(1, size, MAKE_MESSID(0x22, 0x0A));
HuWinCenterPosSet(index2, (work->winSizeBoard.x-size[0])/-2.0f, (work->winSizeBoard.y-size[1])/-2.0f);
HuWinMesSet(index2, MAKE_MESSID(0x22, 0x0A));
object->work[0] = 0;
object->work[1] = 0;
object->work[2] = 0;
object->work[3] = 0;
object->func = UpdateModeSel;
}
#define E3_BG_SPEED 0.5f
#define E3_BG_TILE_W 128
#define E3_BG_TILE_H 128
#define E3_BG_TILE_COL 6
#define E3_BG_TILE_ROW 5
#define E3_BG_MAX_TILE (E3_BG_TILE_COL*E3_BG_TILE_ROW)
typedef struct e3_bg_tile {
Vec2f pos;
s16 sprite;
} E3BGTile;
typedef struct e3_bg_work {
AnimData *anim;
s16 group;
E3BGTile tiles[E3_BG_MAX_TILE];
} E3BGWork;
static void E3BGUpdate(omObjData *object)
{
E3BGTile *tile;
s32 i;
E3BGWork *work;
s16 group;
work = object->data;
tile = &work->tiles[0];
group = work->group;
for(i=0; i<E3_BG_MAX_TILE; i++, tile++) {
tile->pos.x -= E3_BG_SPEED;
if(tile->pos.x <= -(E3_BG_TILE_W/2)) {
tile->pos.x += E3_BG_TILE_W*E3_BG_TILE_COL;
}
tile->pos.y -= E3_BG_SPEED;
if(tile->pos.y <= -(E3_BG_TILE_H/2)) {
tile->pos.y += E3_BG_TILE_H*E3_BG_TILE_ROW;
}
HuSprPosSet(group, i, tile->pos.x, tile->pos.y);
}
}
void E3BGCreate(omObjData *object)
{
E3BGTile *tile;
E3BGWork *work;
s32 tile_idx;
s16 group;
s16 col;
s16 row;
AnimData *anim;
s16 sprite;
float x;
float y;
omSetStatBit(object, 0x100);
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(E3BGWork), MEMORY_DEFAULT_NUM);
work = object->data;
group = HuSprGrpCreate(E3_BG_MAX_TILE);
work->group = group;
anim = HuSprAnimRead(HuDataReadNum(0, MEMORY_DEFAULT_NUM));
work->anim =anim;
tile = &work->tiles[0];
tile_idx = 0;
y = E3_BG_TILE_H/2;
for(row=0; row<E3_BG_TILE_ROW; row++) {
x = E3_BG_TILE_W/2;
for(col=0; col<E3_BG_TILE_COL; col++) {
sprite = HuSprCreate(anim, -1, 0);
HuSprGrpMemberSet(group, tile_idx, sprite);
HuSprPosSet(group, tile_idx, x, y);
tile->sprite = sprite;
tile->pos.x = x;
tile->pos.y = y;
tile++;
tile_idx++;
x += E3_BG_TILE_W;
}
y += E3_BG_TILE_H;
}
object->work[0] = 0;
object->work[1] = 0;
object->work[2] = 0;
object->work[3] = 0;
object->func = E3BGUpdate;
}
typedef struct camera_view_params {
Vec rot;
Vec pos;
float zoom;
float fov;
} CameraViewParams;
static CameraViewParams camViewTbl[] = {
{
-42, 0, 0,
0, 50, -57,
2488,
30
},
{
-90, 0, 0,
0, 50, 0,
2990,
30
},
{
-13, 0, 0,
0, 50, -1025,
2488,
30
}
};
static void UpdateCamera(omObjData *object);
static void InitCamera(omObjData *object)
{
u32 *work;
object->data = HuMemDirectMallocNum(HEAP_SYSTEM, 3*sizeof(u32), MEMORY_DEFAULT_NUM);
work = object->data;
work[0] = 0;
object->work[0] = 0;
object->work[1] = 0;
object->work[2] = 0;
object->work[3] = 0;
object->func = UpdateCamera;
}
static void UpdateCamera(omObjData *object)
{
u32 *work = object->data;
if(object->work[0]) {
if((s32)object->work[0] != 1) {
(void)object;
} else {
CameraViewParams *view = &camViewTbl[object->work[1]];
CRot = view->rot;
Center = view->pos;
CZoom = view->zoom;
if(e3CameraFov != view->fov) {
e3CameraFov = view->fov;
Hu3DCameraPerspectiveSet(1, e3CameraFov, 100, 25000, 4.0f/3.0f);
}
}
object->work[0] = 0;
}
if(object->work[2]) {
(void)object;
}
}
Vec lbl_2_data_478[] = {
-90, 0, 2990,
-42, -57, 2488,
9999, 9999, 9999
};
Vec lbl_2_data_49C[] = {
-42, -57, 2488,
-13, -1025, 2350,
9999, 9999, 9999
};
struct unkstruct_4C0 {
Vec *unk0;
float unk4;
};
struct unkstruct_4C0 lbl_2_data_4C0[] = {
lbl_2_data_478, 60,
lbl_2_data_49C, 60
};