Start work on selmenu
This commit is contained in:
parent
e9c983c215
commit
a66a32f849
10 changed files with 727 additions and 33 deletions
682
src/REL/selmenuDll/main.c
Normal file
682
src/REL/selmenuDll/main.c
Normal file
|
|
@ -0,0 +1,682 @@
|
|||
#include "game/object.h"
|
||||
#include "game/objsub.h"
|
||||
#include "game/pad.h"
|
||||
#include "game/gamework_data.h"
|
||||
#include "game/hsfman.h"
|
||||
#include "game/hsfdraw.h"
|
||||
#include "game/wipe.h"
|
||||
#include "game/flag.h"
|
||||
#include "game/printfunc.h"
|
||||
#include "game/minigame_seq.h"
|
||||
#include "game/data.h"
|
||||
|
||||
#include "rel_sqrt_consts.h"
|
||||
|
||||
#define SM_PAGE_MAX 7
|
||||
#define SM_PAGE_SIZE 10
|
||||
|
||||
#define SM_KEY_LEFT 0x0004
|
||||
#define SM_KEY_RIGHT 0x0008
|
||||
#define SM_KEY_UP 0x0001
|
||||
#define SM_KEY_DOWN 0x0002
|
||||
|
||||
static char *charTbl[] = {
|
||||
"Mario",
|
||||
"Luigi",
|
||||
"Peach",
|
||||
"Yoshi",
|
||||
"Wario",
|
||||
"Donkey",
|
||||
"Daisy",
|
||||
"Waluigi"
|
||||
};
|
||||
|
||||
typedef struct sm_entry {
|
||||
u16 enabled;
|
||||
char *name;
|
||||
OverlayID overlay;
|
||||
} SMEntry;
|
||||
|
||||
static SMEntry menuTbl[SM_PAGE_MAX*SM_PAGE_SIZE] = {
|
||||
{ 1, "401:WAKUGURI DIVING", OVL_M401 },
|
||||
{ 1, "402:PURURUN! BIGSLIME", OVL_M402 },
|
||||
{ 1, "403:TAORERUKABE!", OVL_M403 },
|
||||
{ 1, "404:CRAYON RUNNER", OVL_M404 },
|
||||
{ 1, "405:MEDREY RACE", OVL_M405 },
|
||||
{ 1, "406:SKI RACE", OVL_M406 },
|
||||
{ 1, "407:BATTANDOMINO", OVL_M407 },
|
||||
{ 1, "408:SKY DIVE", OVL_M408 },
|
||||
{ 1, "409:CRAY SHOT", OVL_M409 },
|
||||
{ 1, "410:JANJAN FREE THROW", OVL_M410 },
|
||||
{ 1, "411:PAZZLE DE PONG", OVL_M411 },
|
||||
{ 1, "412:SNOW THROW", OVL_M412 },
|
||||
{ 1, "413:BOMBHEI PAZZLE!", OVL_M413 },
|
||||
{ 1, "414:NERATTE UTE!", OVL_M414 },
|
||||
{ 1, "415:PYONPYON STAMP", OVL_M415 },
|
||||
{ 1, "416:MAMORE FIRE", OVL_M416 },
|
||||
{ 1, "417:MARIO SURFER", OVL_M417 },
|
||||
{ 1, "418:TAIHOU KAKURENBO", OVL_M418 },
|
||||
{ 1, "419:BANANA DE KOROBASE", OVL_M419 },
|
||||
{ 1, "420:WATER BATTLE", OVL_M420 },
|
||||
{ 1, "421:BODY BALOON", OVL_M421 },
|
||||
{ 1, "422:BELCON COIN", OVL_M422 },
|
||||
{ 1, "423:GOAL AND GOAL", OVL_M423 },
|
||||
{ 1, "424:CLANE CATCH", OVL_M424 },
|
||||
{ 1, "425:AIR DOSSUN", OVL_M425 },
|
||||
{ 1, "426:KYOROKYORO PANIC", OVL_M426 },
|
||||
{ 1, "427:BOAT RACE", OVL_M427 },
|
||||
{ 1, "428:THE ROCK CLIME", OVL_M428 },
|
||||
{ 1, "429:TREASURE FOREST", OVL_M429 },
|
||||
{ 1, "430:PARASAILING GO", OVL_M430 },
|
||||
{ 1, "431:GURUGURU BOX", OVL_M431 },
|
||||
{ 1, "432:PAIR DE RACE", OVL_M432 },
|
||||
{ 1, "433:BEACH VOLLEY", OVL_SUBCHRSEL },
|
||||
{ 1, "434:KINGYOSUKUI", OVL_M434 },
|
||||
{ 1, "435:KOOPA DARTS", OVL_M435 },
|
||||
{ 1, "436:KOOPANO AREGA TABETAI!", OVL_M436 },
|
||||
{ 1, "437:FUSEN RAKUGO", OVL_M437 },
|
||||
{ 1, "438:SYAKUNETSU WANWAN ATTACK", OVL_M438 },
|
||||
{ 1, "439:GURUGURU DANGEROUS", OVL_M439 },
|
||||
{ 1, "440:NEO KOOPA BAKUDAN", OVL_M440 },
|
||||
{ 1, "441:HIRAHIRA CHOUCHO", OVL_M441 },
|
||||
{ 1, "442:SUIMYAKU HORE2", OVL_M442 },
|
||||
{ 1, "443:DRUG RACE", OVL_M443 },
|
||||
{ 1, "444:MIRACLE PINBALL", OVL_M444 },
|
||||
{ 1, "445:KINOPIO HAMMER", OVL_M445 },
|
||||
{ 1, "446:3MAI SOROERO!", OVL_M446 },
|
||||
{ 1, "447:IQ BLOCK", OVL_M447 },
|
||||
{ 1, "448:FUMIKURI", OVL_M448 },
|
||||
{ 1, "449:NOKO2 KOURA PAZZLE", OVL_M449 },
|
||||
{ 1, "450:LAST GAME", OVL_M450 },
|
||||
{ 1, "451:PAZZLE", OVL_M451 },
|
||||
{ 1, "455:BURUTTE 1BAN", OVL_M455 },
|
||||
{ 1, "456:MOGUTTE 1BAN", OVL_M456 },
|
||||
{ 1, "457:SUMOH", OVL_M457 },
|
||||
{ 1, "458:PSYCOLO BATTLE", OVL_M458 },
|
||||
{ 1, "459:Dr.WARIO", OVL_M459 },
|
||||
{ 1, "460:", OVL_M460 },
|
||||
{ 1, "461:BOMBHEI SCRANBLE", OVL_M461 },
|
||||
{ 1, "462:", OVL_M462 },
|
||||
{ 1, "***:MESS CHECK", OVL_MESS },
|
||||
{ 1, "***:BOARD W01", OVL_W01 },
|
||||
{ 1, "***:BOARD W02", OVL_W02 },
|
||||
{ 1, "***:BOARD W03", OVL_W03 },
|
||||
{ 1, "***:BOARD W04", OVL_W04 },
|
||||
{ 1, "***:BOARD W05", OVL_W05 },
|
||||
{ 1, "***:BOARD W06", OVL_W06 },
|
||||
{ 1, "***:BOARD W20", OVL_W20 },
|
||||
{ 1, "***:BOARD W21", OVL_W21 },
|
||||
{ 1, "***:STAFF", OVL_STAFF },
|
||||
{ 1, "***:STORY TEST", OVL_MSTORY4 },
|
||||
};
|
||||
|
||||
static u32 cameraMaskTbl[] = {
|
||||
( 1 << 0 ),
|
||||
( 1 << 1 ),
|
||||
( 1 << 2 ),
|
||||
( 1 << 3 )
|
||||
};
|
||||
|
||||
static u32 lbl_1_data_844[] = {
|
||||
0, 1, 2, 3, 4, 5
|
||||
};
|
||||
|
||||
static char *dvdMusTbl[] = {
|
||||
"sound/mu_016a.dvd",
|
||||
"sound/mu_047a.dvd",
|
||||
"sound/mu_052a.dvd",
|
||||
"sound/mu_054a.dvd",
|
||||
"sound/mu_101a.dvd",
|
||||
"sound/mu_108a.dvd",
|
||||
"sound/mu002a.dvd",
|
||||
""
|
||||
};
|
||||
|
||||
static s16 smPage;
|
||||
static s16 smSelectPosBackup[SM_PAGE_MAX];
|
||||
static omObjData *smMainObj;
|
||||
static omObjData *outViewObj;
|
||||
static PlayerConfig smPlayerCfg[4];
|
||||
static s16 smSelectPos;
|
||||
static s16 smSelectPosExit = -1;
|
||||
static u16 btnDownCurr;
|
||||
static u16 btnCurr;
|
||||
static u16 btnReleaseCurr;
|
||||
static u16 btnDownAll[4];
|
||||
static u16 btnAll[4];
|
||||
static u16 btnReleaseAll[4];
|
||||
static u16 btnPrevAll[4] = {};
|
||||
|
||||
static void SMInit(omObjData *object);
|
||||
static void SMRand8Tick(omObjData *object);
|
||||
|
||||
void ModuleProlog(void)
|
||||
{
|
||||
static char *funcId = "SMOBJECTSETUP\n";
|
||||
s32 i;
|
||||
Process *objman;
|
||||
Vec pos, dir;
|
||||
|
||||
OSReport("ObjectSetup:%08x\n", ModuleProlog);
|
||||
OSReport("\n\n\n******* SMObjectSetup *********\n");
|
||||
OSReport(funcId);
|
||||
objman = omInitObjMan(50, 8192);
|
||||
for(i=0; i<4; i++) {
|
||||
if(GWPlayerCfg[i].character >= 8) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i != 4) {
|
||||
for(i=0; i<4; i++) {
|
||||
GWPlayerCfg[i].character = i;
|
||||
}
|
||||
}
|
||||
smMainObj = omAddObjEx(objman, 0, 0, 0, -1, SMInit);
|
||||
outViewObj = omAddObjEx(objman, 32730, 0, 0, -1, omOutViewMulti);
|
||||
omAddObjEx(objman, 0, 0, 0, -1, SMRand8Tick);
|
||||
outViewObj->work[0] = 4;
|
||||
for(i=0; i<4; i++) {
|
||||
CRotM[i].x = -20.0f;
|
||||
CRotM[i].y = 0.0f;
|
||||
CRotM[i].z = 0.0f;
|
||||
CenterM[i].x = 0.0f;
|
||||
CenterM[i].y = 50.0f;
|
||||
CenterM[i].z = 0.0f;
|
||||
CZoomM[i] = 500.0f;
|
||||
Hu3DCameraCreate(cameraMaskTbl[i]);
|
||||
Hu3DCameraPerspectiveSet(cameraMaskTbl[i], 45.0f, 20.0f, 25000.0f, 4.0f/3.0f);
|
||||
Hu3DCameraViewportSet(cameraMaskTbl[i], (i%2)*320.0f, (i/2)*240.0f, 320.0f, 240.0f, 0.0f, 1.0f);
|
||||
}
|
||||
Hu3DGLightCreate(0.0f, 0.0f, 100.0f, 0.0f, 0.0f, -1.0f, 255, 255, 255);
|
||||
pos.x = 0.0f;
|
||||
pos.y = 0.0f;
|
||||
pos.z = 200.0f;
|
||||
dir.x = dir.y = 0.0f;
|
||||
dir.z = -1.0f;
|
||||
SetDefLight(&pos, &dir, 255, 255, 255, 64, 64, 64, 255, 255, 255);
|
||||
WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 30);
|
||||
GWSystem.mg_next_type = -1;
|
||||
_ClearFlag(0x10000);
|
||||
GWSystem.turn = 1;
|
||||
GWSystem.max_turn = 20;
|
||||
}
|
||||
|
||||
static void CopyPlayerCfg(PlayerConfig *dst, PlayerConfig *src)
|
||||
{
|
||||
s32 i;
|
||||
for(i=0; i<4; i++) {
|
||||
*dst++ = *src++;
|
||||
}
|
||||
}
|
||||
|
||||
static void CalcBtns(void)
|
||||
{
|
||||
s32 i;
|
||||
btnCurr = btnReleaseCurr = btnDownCurr = 0;
|
||||
for(i=0; i<4; i++) {
|
||||
btnAll[i] = btnReleaseAll[i] = btnDownAll[i] = 0;
|
||||
if((HuPadDStkRep[i]|HuPadBtn[i]) & PAD_BUTTON_LEFT) {
|
||||
btnAll[i] |= SM_KEY_LEFT;
|
||||
}
|
||||
if((HuPadDStkRep[i]|HuPadBtn[i]) & PAD_BUTTON_RIGHT) {
|
||||
btnAll[i] |= SM_KEY_RIGHT;
|
||||
}
|
||||
if((HuPadDStkRep[i]|HuPadBtn[i]) & PAD_BUTTON_UP) {
|
||||
btnAll[i] |= SM_KEY_UP;
|
||||
}
|
||||
if((HuPadDStkRep[i]|HuPadBtn[i]) & PAD_BUTTON_DOWN) {
|
||||
btnAll[i] |= SM_KEY_DOWN;
|
||||
}
|
||||
btnDownAll[i] |= HuPadBtnDown[i];
|
||||
btnReleaseAll[i] = (btnAll[i] ^ btnPrevAll[i]) & btnAll[i];
|
||||
btnPrevAll[i] = btnAll[i];
|
||||
btnCurr |= btnAll[i];
|
||||
btnReleaseCurr |= btnReleaseAll[i];
|
||||
btnDownCurr |= btnDownAll[i];
|
||||
}
|
||||
}
|
||||
|
||||
static void DrawPage(void)
|
||||
{
|
||||
s32 i;
|
||||
SMEntry *entry;
|
||||
fontcolor = FONT_COLOR_YELLOW;
|
||||
print8(200, 160, 2.5f, "PAGE:%d/%d", smPage+1, SM_PAGE_MAX);
|
||||
for(i=0; i<SM_PAGE_SIZE; i++) {
|
||||
entry = &menuTbl[(smPage*SM_PAGE_SIZE)+i];
|
||||
if(entry->enabled == 1) {
|
||||
if(i == smSelectPos) {
|
||||
fontcolor = FONT_COLOR_CYAN;
|
||||
} else {
|
||||
fontcolor = FONT_COLOR_GREEN;
|
||||
}
|
||||
} else {
|
||||
fontcolor = FONT_COLOR_DARK_GREEN;
|
||||
}
|
||||
print8(100, (float)((i+10)*8)*2.5f, 2.5f, "%s", entry->name);
|
||||
}
|
||||
}
|
||||
|
||||
static void MoveSMCursor(s16 amount);
|
||||
|
||||
static void MoveSMPage(s16 amount)
|
||||
{
|
||||
s16 page;
|
||||
s32 i;
|
||||
u16 enabled;
|
||||
s16 page_old;
|
||||
enabled = 0;
|
||||
page = smPage;
|
||||
page_old = page;
|
||||
do {
|
||||
page += amount;
|
||||
if(page >= SM_PAGE_MAX) {
|
||||
page = 0;
|
||||
} else if(page < 0) {
|
||||
page = SM_PAGE_MAX-1;
|
||||
}
|
||||
for(i=0; i<SM_PAGE_SIZE; i++) {
|
||||
if(menuTbl[(page*SM_PAGE_SIZE)+i].enabled == 1) {
|
||||
enabled = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while(!enabled);
|
||||
smPage = page;
|
||||
if(page_old == -1) {
|
||||
smSelectPos = -1;
|
||||
MoveSMCursor(1);
|
||||
smSelectPosBackup[smPage] = smSelectPos;
|
||||
} else {
|
||||
smSelectPosBackup[page_old] = smSelectPos;
|
||||
smSelectPos = smSelectPosBackup[smPage];
|
||||
}
|
||||
}
|
||||
|
||||
static void MoveSMCursor(s16 amount)
|
||||
{
|
||||
s16 pos;
|
||||
pos = smSelectPos;
|
||||
do {
|
||||
pos += amount;
|
||||
if(pos >= SM_PAGE_SIZE) {
|
||||
pos = 0;
|
||||
} else if(pos < 0) {
|
||||
pos = SM_PAGE_SIZE-1;
|
||||
}
|
||||
} while(!menuTbl[(smPage*SM_PAGE_SIZE)+pos].enabled);
|
||||
smSelectPos = pos;
|
||||
(void)pos;
|
||||
}
|
||||
|
||||
static s16 SMComCharGet(s16 player, s16 offset);
|
||||
static void SMUpdate(omObjData *object);
|
||||
|
||||
static void SMInit(omObjData *object)
|
||||
{
|
||||
s32 i, j;
|
||||
OSReport("SMinit:%08x\n", SMInit);
|
||||
omDLLDBGOut();
|
||||
Hu3DBGColorSet(0, 0, 0);
|
||||
CopyPlayerCfg(smPlayerCfg, GWPlayerCfg);
|
||||
for(i=0; i<4; i++) {
|
||||
for(j=i+1; j<4; j++) {
|
||||
if(smPlayerCfg[i].character == smPlayerCfg[j].character) {
|
||||
smPlayerCfg[j].character = SMComCharGet(j, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
smPage = -1;
|
||||
for(i=0; i<SM_PAGE_MAX; i++) {
|
||||
for(j=0; j<SM_PAGE_SIZE; j++) {
|
||||
if(menuTbl[(i*SM_PAGE_SIZE)+j].enabled == 1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(j == SM_PAGE_SIZE) {
|
||||
smSelectPosBackup[i] = -1;
|
||||
} else {
|
||||
smSelectPosBackup[i] = j;
|
||||
}
|
||||
}
|
||||
MoveSMPage(1);
|
||||
if(mgSeqOvlPrev != OVL_INVALID) {
|
||||
for(i=0; i<SM_PAGE_MAX*SM_PAGE_SIZE; i++) {
|
||||
if(mgSeqOvlPrev == menuTbl[i].overlay && menuTbl[i].enabled == 1) {
|
||||
smPage = i/SM_PAGE_SIZE;
|
||||
smSelectPos = i%SM_PAGE_SIZE;
|
||||
smSelectPosBackup[smPage] = smSelectPos;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
object->func = SMUpdate;
|
||||
}
|
||||
|
||||
static void SMGroupGen(s32 index);
|
||||
static void SMCharInit(omObjData *object);
|
||||
static void SMPlayerCfgInit(omObjData *object);
|
||||
static void SMSound3DInit(omObjData *object);
|
||||
|
||||
static void SMUpdate(omObjData *object)
|
||||
{
|
||||
CalcBtns();
|
||||
DrawPage();
|
||||
if(btnReleaseCurr & SM_KEY_UP) {
|
||||
MoveSMCursor(-1);
|
||||
SMGroupGen((smPage*SM_PAGE_SIZE)+smSelectPos);
|
||||
return;
|
||||
}
|
||||
if(btnReleaseCurr & SM_KEY_DOWN) {
|
||||
MoveSMCursor(1);
|
||||
SMGroupGen((smPage*SM_PAGE_SIZE)+smSelectPos);
|
||||
return;
|
||||
}
|
||||
if(btnReleaseCurr & SM_KEY_LEFT) {
|
||||
MoveSMPage(-1);
|
||||
SMGroupGen((smPage*SM_PAGE_SIZE)+smSelectPos);
|
||||
return;
|
||||
}
|
||||
if(btnReleaseCurr & SM_KEY_RIGHT) {
|
||||
MoveSMPage(1);
|
||||
SMGroupGen((smPage*SM_PAGE_SIZE)+smSelectPos);
|
||||
return;
|
||||
}
|
||||
if((btnDownCurr & PAD_BUTTON_A) || (btnDownCurr & PAD_BUTTON_START)) {
|
||||
object->func = SMCharInit;
|
||||
return;
|
||||
}
|
||||
if(btnDownCurr & PAD_BUTTON_Y) {
|
||||
object->func = SMPlayerCfgInit;
|
||||
return;
|
||||
}
|
||||
if(btnDownCurr & PAD_TRIGGER_Z) {
|
||||
object->func = SMSound3DInit;
|
||||
return;
|
||||
}
|
||||
if(btnDownCurr & PAD_BUTTON_X) {
|
||||
omOvlReturnEx(0, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void SMGroupGen(s32 index)
|
||||
{
|
||||
OverlayID overlay;
|
||||
s32 i;
|
||||
overlay = menuTbl[index].overlay;
|
||||
for(i=0; i<50; i++) {
|
||||
if(overlay == mgInfoTbl[i].ovl) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i == 50) {
|
||||
for(i=0; i<4; i++) {
|
||||
smPlayerCfg[i].group = i;
|
||||
}
|
||||
return;
|
||||
}
|
||||
switch(mgInfoTbl[i].type) {
|
||||
case 0:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
for(i=0; i<4; i++) {
|
||||
smPlayerCfg[i].group = i;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
smPlayerCfg[0].group = 0;
|
||||
for(i=1; i<4; i++) {
|
||||
smPlayerCfg[i].group = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
for(i=0; i<2; i++) {
|
||||
smPlayerCfg[i].group = 0;
|
||||
}
|
||||
for(i=2; i<4; i++) {
|
||||
smPlayerCfg[i].group = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(overlay == OVL_M430) {
|
||||
s32 team_cnt[2];
|
||||
s32 team_players[2][2];
|
||||
team_cnt[0] = team_cnt[1] = 0;
|
||||
for(i=0; i<4; i++) {
|
||||
team_players[smPlayerCfg[i].group][team_cnt[smPlayerCfg[i].group]++] = i;
|
||||
}
|
||||
if(frand() & 1) {
|
||||
GWPlayerCfg[team_players[0][0]].group = 0;
|
||||
GWPlayerCfg[team_players[0][1]].group = 1;
|
||||
} else {
|
||||
GWPlayerCfg[team_players[0][0]].group = 1;
|
||||
GWPlayerCfg[team_players[0][1]].group = 0;
|
||||
}
|
||||
if(frand() & 1) {
|
||||
GWPlayerCfg[team_players[1][0]].group = 2;
|
||||
GWPlayerCfg[team_players[1][1]].group = 3;
|
||||
} else {
|
||||
GWPlayerCfg[team_players[1][0]].group = 3;
|
||||
GWPlayerCfg[team_players[1][1]].group = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static s16 charModelID[8];
|
||||
static s16 playerDoneF[4];
|
||||
static s16 charSelProhibitF[8];
|
||||
|
||||
static s32 charMdlTbl[] = {
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 0),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 2),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 4),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 6),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 8),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 10),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 12),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 14),
|
||||
};
|
||||
|
||||
static s32 charMdlMotTbl[] = {
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 1),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 3),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 5),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 7),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 9),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 11),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 13),
|
||||
DATA_MAKE_NUM(DATADIR_SELMENU, 15),
|
||||
};
|
||||
|
||||
static s16 SMComCharGet(s16 player, s16 offset)
|
||||
{
|
||||
s32 i;
|
||||
s16 character;
|
||||
for(i=0; i<8; i++) {
|
||||
charSelProhibitF[i] = 0;
|
||||
}
|
||||
for(i=0; i<4; i++) {
|
||||
if(smPlayerCfg[i].iscom) {
|
||||
continue;
|
||||
}
|
||||
charSelProhibitF[smPlayerCfg[i].character] = 1;
|
||||
}
|
||||
if(!offset) {
|
||||
return;
|
||||
}
|
||||
character = smPlayerCfg[player].character;
|
||||
do {
|
||||
character += offset;
|
||||
if(character < 0) {
|
||||
character = 7;
|
||||
}
|
||||
if(character >= 8) {
|
||||
character = 0;
|
||||
}
|
||||
} while(charSelProhibitF[character] != 0);
|
||||
return character;
|
||||
}
|
||||
|
||||
static void SMCharKill(void)
|
||||
{
|
||||
s32 i;
|
||||
for(i=0; i<8; i++) {
|
||||
Hu3DModelKill(charModelID[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void CharRandomize(void)
|
||||
{
|
||||
s32 i;
|
||||
s32 j;
|
||||
s32 valid_cnt;
|
||||
s32 valid_list[8];
|
||||
for(i=0; i<4; i++) {
|
||||
valid_cnt = 0;
|
||||
for(j=0; j<8; j++) {
|
||||
if(charSelProhibitF[j]) {
|
||||
continue;
|
||||
}
|
||||
valid_list[valid_cnt++] = j;
|
||||
}
|
||||
if(smPlayerCfg[i].iscom == 1) {
|
||||
smPlayerCfg[i].character = valid_list[rand8() % valid_cnt];
|
||||
charSelProhibitF[smPlayerCfg[i].character] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void SMCharUpdate(omObjData *object);
|
||||
static void SMExit(omObjData *object);
|
||||
|
||||
static void SMCharInit(omObjData *object)
|
||||
{
|
||||
s32 i;
|
||||
for(i=0; i<8; i++) {
|
||||
void *data = HuDataSelHeapReadNum(charMdlTbl[i], MEMORY_DEFAULT_NUM, HEAP_DATA);
|
||||
charModelID[i] = Hu3DModelCreate(data);
|
||||
Hu3DModelPosSet(charModelID[i], 0.0f, 0.0f, 0.0f);
|
||||
Hu3DModelAttrSet(charModelID[i], 0x40000001);
|
||||
Hu3DMotionSet(charModelID[i], Hu3DJointMotion(charModelID[i], HuDataSelHeapReadNum(charMdlMotTbl[i], MEMORY_DEFAULT_NUM, HEAP_DATA)));
|
||||
}
|
||||
for(i=0; i<4; i++) {
|
||||
playerDoneF[i] = 0;
|
||||
}
|
||||
SMComCharGet(0, 0);
|
||||
object->func = SMCharUpdate;
|
||||
}
|
||||
|
||||
static void SMCharUpdate(omObjData *object)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
s16 port;
|
||||
s32 j;
|
||||
s16 w;
|
||||
s16 x;
|
||||
s16 y;
|
||||
s16 done_players;
|
||||
s16 num_players;
|
||||
|
||||
for(i=0; i<8; i++) {
|
||||
Hu3DModelAttrSet(charModelID[i], 0x1);
|
||||
}
|
||||
for(i=0; i<4; i++) {
|
||||
if(!smPlayerCfg[i].iscom) {
|
||||
Hu3DModelAttrReset(charModelID[smPlayerCfg[i].character], 0x1);
|
||||
Hu3DModelCameraSet(charModelID[smPlayerCfg[i].character], cameraMaskTbl[i]);
|
||||
}
|
||||
}
|
||||
for(i=0, done_players=0, num_players=0; i<4; i++) {
|
||||
if(playerDoneF[i] == 1) {
|
||||
done_players++;
|
||||
}
|
||||
if(!smPlayerCfg[i].iscom) {
|
||||
num_players++;
|
||||
}
|
||||
}
|
||||
if(done_players == num_players) {
|
||||
SMComCharGet(0, 0);
|
||||
CharRandomize();
|
||||
CopyPlayerCfg(GWPlayerCfg, smPlayerCfg);
|
||||
CharKill(-1);
|
||||
OSReport("%d,%d,%d,%d\n", GWPlayerCfg[0].character,
|
||||
GWPlayerCfg[1].character,
|
||||
GWPlayerCfg[2].character,
|
||||
GWPlayerCfg[3].character);
|
||||
if(!CharAMemPtrGet(GWPlayerCfg[0].character)) {
|
||||
CharARAMOpen(GWPlayerCfg[0].character);
|
||||
}
|
||||
if(!CharAMemPtrGet(GWPlayerCfg[1].character)) {
|
||||
CharARAMOpen(GWPlayerCfg[1].character);
|
||||
}
|
||||
if(!CharAMemPtrGet(GWPlayerCfg[2].character)) {
|
||||
CharARAMOpen(GWPlayerCfg[2].character);
|
||||
}
|
||||
if(!CharAMemPtrGet(GWPlayerCfg[3].character)) {
|
||||
CharARAMOpen(GWPlayerCfg[3].character);
|
||||
}
|
||||
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 20);
|
||||
object->func = SMExit;
|
||||
}
|
||||
CalcBtns();
|
||||
for(i=0; i<4; i++) {
|
||||
port = smPlayerCfg[i].pad_idx;
|
||||
if(!playerDoneF[i]) {
|
||||
if(btnReleaseAll[port] & SM_KEY_LEFT) {
|
||||
smPlayerCfg[port].character = SMComCharGet(i, -1);
|
||||
}
|
||||
if(btnReleaseAll[port] & SM_KEY_RIGHT) {
|
||||
smPlayerCfg[port].character = SMComCharGet(i, 1);
|
||||
}
|
||||
if(btnDownAll[port] & PAD_BUTTON_A) {
|
||||
playerDoneF[i] = 1;
|
||||
}
|
||||
}
|
||||
if(HuPadBtnDown[port] & PAD_BUTTON_B) {
|
||||
if(done_players != 0) {
|
||||
playerDoneF[i] = 0;
|
||||
} else {
|
||||
SMCharKill();
|
||||
object->func = SMUpdate;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(btnDownAll[port] & PAD_BUTTON_START) {
|
||||
for(j=0; j<4; j++) {
|
||||
if(!smPlayerCfg[j].iscom) {
|
||||
playerDoneF[j] = 1;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(!smPlayerCfg[i].iscom) {
|
||||
w = strlen(charTbl[smPlayerCfg[i].character]);
|
||||
w *= 16;
|
||||
x = ((320-w)/2)+((i%2)*320);
|
||||
y = 176+((i/2)*240);
|
||||
if(playerDoneF[i] == 1) {
|
||||
fontcolor = FONT_COLOR_WHITE;
|
||||
print8(x, y, 2.0f, "\xFD\x08""%s", charTbl[smPlayerCfg[i].character]);
|
||||
} else {
|
||||
fontcolor = FONT_COLOR_GREEN;
|
||||
print8(x, y, 2.0f, "\xFD\x05""%s", charTbl[smPlayerCfg[i].character]);
|
||||
}
|
||||
} else {
|
||||
w = 72;
|
||||
x = ((320-w)/2)+((i%2)*320);
|
||||
y = 108+((i/2)*240);
|
||||
fontcolor = FONT_COLOR_YELLOW;
|
||||
print8(x, y, 3.0f, "\xFD\x07""COM");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void SMRand8Tick(omObjData *object)
|
||||
{
|
||||
rand8();
|
||||
}
|
||||
|
|
@ -39,7 +39,6 @@ typedef struct {
|
|||
u32 unk0C;
|
||||
} ConfigWork;
|
||||
|
||||
extern void omSysPauseCtrl(s32);
|
||||
|
||||
static void PauseExit(void);
|
||||
static void PauseProcess(void);
|
||||
|
|
|
|||
|
|
@ -2980,13 +2980,13 @@ static inline void SetDefLightInlineFunc(GXLightObj *arg0, u8 arg1, u8 arg2, u8
|
|||
GXSetChanMatColor(GX_COLOR0A0, spE);
|
||||
}
|
||||
|
||||
void SetDefLight(Vec arg0, Vec arg1, u8 arg2, u8 arg3, u8 arg4, u8 arg5, u8 arg6, u8 arg7, u8 arg8, u8 arg9, u8 argA) {
|
||||
void SetDefLight(Vec *arg0, Vec *arg1, u8 arg2, u8 arg3, u8 arg4, u8 arg5, u8 arg6, u8 arg7, u8 arg8, u8 arg9, u8 argA) {
|
||||
GXLightObj sp20;
|
||||
|
||||
GXInitLightAttn(&sp20, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
||||
GXInitLightSpot(&sp20, 20.0f, GX_SP_COS);
|
||||
GXInitLightPos(&sp20, arg0.x, arg0.y, arg0.z);
|
||||
GXInitLightDir(&sp20, arg1.x, arg1.y, arg1.z);
|
||||
GXInitLightPos(&sp20, arg0->x, arg0->y, arg0->z);
|
||||
GXInitLightDir(&sp20, arg1->x, arg1->y, arg1->z);
|
||||
SetDefLightInlineFunc(&sp20, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, argA);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ static int SeqUpdateRecord(SeqWork *work);
|
|||
static int SeqInitFlip(SeqWork *work, va_list params);
|
||||
static int SeqUpdateFlip(SeqWork *work);
|
||||
|
||||
s32 mgSeqInitF = -1;
|
||||
OverlayID mgSeqOvlPrev = OVL_INVALID;
|
||||
|
||||
static SeqInfo seqInfoTbl[] = {
|
||||
{ NULL, NULL, 292.0f, 240.0f, 1.0f, 1.0f, 60 },
|
||||
|
|
@ -173,7 +173,7 @@ void MGSeqInit(void)
|
|||
HuAR_DVDtoARAM(DATADIR_MGCONST);
|
||||
while(HuARDMACheck());
|
||||
fn_80036BC8();
|
||||
mgSeqInitF = -1;
|
||||
mgSeqOvlPrev = -1;
|
||||
seqLanguage = GWLanguageGet();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,6 @@ void omOutViewMulti(omObjData *object)
|
|||
}
|
||||
}
|
||||
|
||||
void omSystemKeyCheck(omObjData *object);
|
||||
|
||||
void omSystemKeyCheckSetup(Process *objman)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue