#include "game/board/main.h" #include "game/armem.h" #include "game/audio.h" #include "game/data.h" #include "game/flag.h" #include "game/frand.h" #include "game/gamework_data.h" #include "game/hsfdraw.h" #include "game/hsfman.h" #include "game/hsfmotion.h" #include "game/minigame_seq.h" #include "game/object.h" #include "game/objsub.h" #include "game/pad.h" #include "game/printfunc.h" #include "game/wipe.h" #include "rel_sqrt_consts.h" // MSM Definitions static s8 *msmSeGetIndexPtr(s16 datano); static void msmMusSetMasterVolume(s32 value); #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 *smCharTbl[] = { "Mario", "Luigi", "Peach", "Yoshi", "Wario", "Donkey", "Daisy", "Waluigi" }; typedef struct sm_entry { u16 enabled; char *name; OverlayID overlay; } SMEntry; static SMEntry smMenuTbl[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 btnDown; static u16 keyDStk; static u16 keyDStkDown; static u16 btnDownAll[4]; static u16 keyDStkAll[4]; static u16 keyDStkAllDown[4]; static u16 keyDStkAllPrev[4] = {}; static void SMInit(omObjData *object); static void SMRand8Tick(omObjData *object); void ObjectSetup(void) { static char *funcId = "SMOBJECTSETUP\n"; s32 i; Process *objman; Vec pos, dir; OSReport("ObjectSetup:%08x\n", ObjectSetup); 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); GWMGTypeSet(-1); _ClearFlag(FLAG_ID_MAKE(1, 0)); 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; keyDStk = keyDStkDown = btnDown = 0; for (i = 0; i < 4; i++) { keyDStkAll[i] = keyDStkAllDown[i] = btnDownAll[i] = 0; if ((HuPadDStkRep[i] | HuPadBtn[i]) & PAD_BUTTON_LEFT) { keyDStkAll[i] |= SM_KEY_LEFT; } if ((HuPadDStkRep[i] | HuPadBtn[i]) & PAD_BUTTON_RIGHT) { keyDStkAll[i] |= SM_KEY_RIGHT; } if ((HuPadDStkRep[i] | HuPadBtn[i]) & PAD_BUTTON_UP) { keyDStkAll[i] |= SM_KEY_UP; } if ((HuPadDStkRep[i] | HuPadBtn[i]) & PAD_BUTTON_DOWN) { keyDStkAll[i] |= SM_KEY_DOWN; } btnDownAll[i] |= HuPadBtnDown[i]; keyDStkAllDown[i] = (keyDStkAll[i] ^ keyDStkAllPrev[i]) & keyDStkAll[i]; keyDStkAllPrev[i] = keyDStkAll[i]; keyDStk |= keyDStkAll[i]; keyDStkDown |= keyDStkAllDown[i]; btnDown |= 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 = &smMenuTbl[(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 (smMenuTbl[(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 (!smMenuTbl[(smPage * SM_PAGE_SIZE) + pos].enabled); smSelectPos = pos; (void)pos; } static s16 SMChangeChar(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 = SMChangeChar(j, -1); } } } smPage = -1; for (i = 0; i < SM_PAGE_MAX; i++) { for (j = 0; j < SM_PAGE_SIZE; j++) { if (smMenuTbl[(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 == smMenuTbl[i].overlay && smMenuTbl[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 (keyDStkDown & SM_KEY_UP) { MoveSMCursor(-1); SMGroupGen((smPage * SM_PAGE_SIZE) + smSelectPos); return; } if (keyDStkDown & SM_KEY_DOWN) { MoveSMCursor(1); SMGroupGen((smPage * SM_PAGE_SIZE) + smSelectPos); return; } if (keyDStkDown & SM_KEY_LEFT) { MoveSMPage(-1); SMGroupGen((smPage * SM_PAGE_SIZE) + smSelectPos); return; } if (keyDStkDown & SM_KEY_RIGHT) { MoveSMPage(1); SMGroupGen((smPage * SM_PAGE_SIZE) + smSelectPos); return; } if ((btnDown & PAD_BUTTON_A) || (btnDown & PAD_BUTTON_START)) { object->func = SMCharInit; return; } if (btnDown & PAD_BUTTON_Y) { object->func = SMPlayerCfgInit; return; } if (btnDown & PAD_TRIGGER_Z) { object->func = SMSound3DInit; return; } if (btnDown & PAD_BUTTON_X) { omOvlReturnEx(0, 1); } } static void SMGroupGen(s32 index) { OverlayID overlay; s32 i; overlay = smMenuTbl[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 (frandBool()) { 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 (frandBool()) { 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 SMChangeChar(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], HU3D_MOTATTR_LOOP); Hu3DMotionSet(charModelID[i], Hu3DJointMotionFile(charModelID[i], charMdlMotTbl[i])); } for (i = 0; i < 4; i++) { playerDoneF[i] = 0; } SMChangeChar(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], HU3D_ATTR_DISPOFF); } for (i = 0; i < 4; i++) { if (!smPlayerCfg[i].iscom) { Hu3DModelAttrReset(charModelID[smPlayerCfg[i].character], HU3D_ATTR_DISPOFF); 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) { SMChangeChar(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 (keyDStkAllDown[port] & SM_KEY_LEFT) { smPlayerCfg[port].character = SMChangeChar(i, -1); } if (keyDStkAllDown[port] & SM_KEY_RIGHT) { smPlayerCfg[port].character = SMChangeChar(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(smCharTbl[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", smCharTbl[smPlayerCfg[i].character]); } else { fontcolor = FONT_COLOR_GREEN; print8(x, y, 2.0f, "\xFD\x05" "%s", smCharTbl[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 SMExit(omObjData *object) { s32 mg; if (WipeStatGet()) { return; } while (HuARDMACheck()) ; mg = omMgIndexGet(smMenuTbl[(smPage * SM_PAGE_SIZE) + smSelectPos].overlay); GWSystem.mg_next = mg; OSReport("mgNo=%d\n", mg); if (smMenuTbl[(smPage * SM_PAGE_SIZE) + smSelectPos].overlay == OVL_W10) { _SetFlag(0x1000B); } else if (smMenuTbl[(smPage * SM_PAGE_SIZE) + smSelectPos].overlay == OVL_W20) { BoardSaveInit(7); BoardPartyConfigSet(0, 0, 0, 20, 0, 0, 0, 0); } else if (smMenuTbl[(smPage * SM_PAGE_SIZE) + smSelectPos].overlay == OVL_W21) { BoardSaveInit(8); BoardPartyConfigSet(0, 0, 0, 20, 0, 0, 0, 0); } else { _ClearFlag(0x1000B); } if (mg == -1 || !(HuPadBtn[0] & PAD_TRIGGER_Z) || mgInfoTbl[mg].type == 5 || mgInfoTbl[mg].type == 3 || mgInfoTbl[mg].type == 6) { omOvlCallEx(smMenuTbl[(smPage * SM_PAGE_SIZE) + smSelectPos].overlay, 1, 0, 0); } else { omOvlCallEx(OVL_INST, 1, 0, 0); } mgSeqOvlPrev = smMenuTbl[(smPage * SM_PAGE_SIZE) + smSelectPos].overlay; smSelectPosExit = smSelectPos; } static char *padCfgStrTbl[] = { "PLAYER:%d", " PAD%d:%s", "PADNO:%d", " GRP:%d", " DIF:%s" }; static s16 playerCfgSelF; static s16 playerCfgPlayerPos; static s16 playerCfgOptionPos; #define DO_HILITE(option) \ do { \ s32 color; \ if (playerCfgOptionPos == option) { \ color = fontcolor = FONT_COLOR_CYAN; \ } \ else { \ color = fontcolor = FONT_COLOR_GREEN; \ } \ (void)color; \ } while (0) static void SMPlayerCfgDraw(void) { s32 i; s16 x; s16 y; s16 w; char *comStr[] = { "HUMAN", "COM" }; char *diffStr[] = { "EASY", "NORMAL", "HARD", "VERYHARD" }; for (i = 0; i < 4; i++) { w = 128; x = ((320 - w) / 2) + ((i % 2) * 320); y = ((i / 2) * 240) + 48; if (playerCfgSelF == 0 && playerCfgPlayerPos == i) { fontcolor = FONT_COLOR_CYAN; } else { fontcolor = FONT_COLOR_GREEN; } print8(x, y, 2.0f, padCfgStrTbl[0], i); if (playerCfgSelF == 0) { fontcolor = FONT_COLOR_DARK_GREEN; print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 80, 2.0f, padCfgStrTbl[1], smPlayerCfg[i].pad_idx, comStr[smPlayerCfg[i].iscom]); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 96, 2.0f, padCfgStrTbl[2], smPlayerCfg[i].pad_idx); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 112, 2.0f, padCfgStrTbl[3], smPlayerCfg[i].group); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 128, 2.0f, padCfgStrTbl[4], diffStr[smPlayerCfg[i].diff]); } else if (playerCfgSelF == 1 && playerCfgPlayerPos == i) { DO_HILITE(0); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 80, 2.0f, padCfgStrTbl[1], smPlayerCfg[i].pad_idx, comStr[smPlayerCfg[i].iscom]); DO_HILITE(1); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 96, 2.0f, padCfgStrTbl[2], smPlayerCfg[i].pad_idx); DO_HILITE(2); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 112, 2.0f, padCfgStrTbl[3], smPlayerCfg[i].group); DO_HILITE(3); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 128, 2.0f, padCfgStrTbl[4], diffStr[smPlayerCfg[i].diff]); } else { fontcolor = FONT_COLOR_DARK_GREEN; print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 80, 2.0f, padCfgStrTbl[1], smPlayerCfg[i].pad_idx, comStr[smPlayerCfg[i].iscom]); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 96, 2.0f, padCfgStrTbl[2], smPlayerCfg[i].pad_idx); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 112, 2.0f, padCfgStrTbl[3], smPlayerCfg[i].group); print8(((i % 2) * 320) + 64, ((i / 2) * 240) + 128, 2.0f, padCfgStrTbl[4], diffStr[smPlayerCfg[i].diff]); } } } #undef DO_HILITE static void SMPlayerCfgUpdate(omObjData *object); static void SMPlayerCfgInit(omObjData *object) { playerCfgSelF = 0; playerCfgPlayerPos = 0; playerCfgOptionPos = 0; object->func = SMPlayerCfgUpdate; } static void SMPlayerCfgUpdate(omObjData *object) { s32 offset; SMPlayerCfgDraw(); CalcBtns(); if (!playerCfgSelF) { if (keyDStkDown & SM_KEY_LEFT) { offset = ((playerCfgPlayerPos & 0x1) - 1) & 0x1; playerCfgPlayerPos = (playerCfgPlayerPos & 0xFFFE) + offset; } else { if (keyDStkDown & SM_KEY_RIGHT) { offset = ((playerCfgPlayerPos & 0x1) + 1) & 0x1; playerCfgPlayerPos = (playerCfgPlayerPos & 0xFFFE) + offset; } else if (keyDStkDown & SM_KEY_DOWN) { if ((playerCfgPlayerPos += 2) >= 4) { playerCfgPlayerPos -= 4; } } else if (keyDStkDown & SM_KEY_UP) { if ((playerCfgPlayerPos -= 2) < 0) { playerCfgPlayerPos += 4; } } } if (btnDown & PAD_BUTTON_A) { playerCfgSelF = 1; return; } if ((btnDown & PAD_BUTTON_B) || (btnDown & PAD_BUTTON_Y)) { object->func = SMUpdate; } } else if (keyDStkDown & SM_KEY_UP) { if (--playerCfgOptionPos < 0) { playerCfgOptionPos = 3; } } else if (keyDStkDown & SM_KEY_DOWN) { if (++playerCfgOptionPos > 3) { playerCfgOptionPos = 0; } } else if (keyDStkDown & SM_KEY_LEFT) { switch (playerCfgOptionPos) { case 0: smPlayerCfg[playerCfgPlayerPos].iscom ^= 1; break; case 1: if (--smPlayerCfg[playerCfgPlayerPos].pad_idx < 0) { smPlayerCfg[playerCfgPlayerPos].pad_idx = 3; } break; case 2: if (--smPlayerCfg[playerCfgPlayerPos].group < 0) { smPlayerCfg[playerCfgPlayerPos].group = 3; } break; case 3: if (--smPlayerCfg[playerCfgPlayerPos].diff < 0) { smPlayerCfg[playerCfgPlayerPos].diff = 3; } break; }; } else if (keyDStkDown & SM_KEY_RIGHT) { switch (playerCfgOptionPos) { case 0: smPlayerCfg[playerCfgPlayerPos].iscom ^= 1; break; case 1: if (++smPlayerCfg[playerCfgPlayerPos].pad_idx > 3) { smPlayerCfg[playerCfgPlayerPos].pad_idx = 0; } break; case 2: if (++smPlayerCfg[playerCfgPlayerPos].group > 3) { smPlayerCfg[playerCfgPlayerPos].group = 0; } break; case 3: if (++smPlayerCfg[playerCfgPlayerPos].diff > 3) { smPlayerCfg[playerCfgPlayerPos].diff = 0; } break; } } else if ((btnDown & PAD_BUTTON_A) || (btnDown & PAD_BUTTON_B)) { playerCfgSelF = 0; } else if (btnDown & PAD_BUTTON_Y) { object->func = SMUpdate; } } static void SMRand8Tick(omObjData *object) { rand8(); } void fn_1_450C(void) { } static s16 emiCompDataNo; static s16 emiCompVal; static s16 smSound3DPos; s16 lbl_1_bss_0; static void SMSound3DUpdate(omObjData *object); static void SMSound3DDraw(void); static void SMSound3DInit(omObjData *object) { s8 *data = msmSeGetIndexPtr(emiCompDataNo); emiCompVal = data[12]; object->func = SMSound3DUpdate; } static void SMSound3DUpdate(omObjData *object) { float increment; s8 *data; CalcBtns(); if (keyDStkDown & SM_KEY_UP) { smSound3DPos--; if (smSound3DPos < 0) { smSound3DPos = 7; } } if (keyDStkDown & SM_KEY_DOWN) { smSound3DPos++; if (smSound3DPos >= 8) { smSound3DPos = 0; } } if (keyDStkDown & (SM_KEY_LEFT | SM_KEY_RIGHT)) { if (keyDStkDown & SM_KEY_RIGHT) { increment = 10; } else { increment = -10; } if (HuPadBtn[0] & PAD_TRIGGER_Z) { increment *= 10.0f; } switch (smSound3DPos) { case 0: Snd3DDistOffset += increment; break; case 1: Snd3DSpeedOffset += increment; break; case 2: Snd3DStartDisOffset += increment; break; case 3: Snd3DFrontSurDisOffset += increment; break; case 4: Snd3DBackSurDisOffset += increment; break; case 5: emiCompDataNo += increment / 10.0f; if (emiCompDataNo < 0) { emiCompDataNo = 0; } data = msmSeGetIndexPtr(emiCompDataNo); emiCompVal = data[12]; break; case 6: emiCompVal += increment / 10.0f; if (emiCompVal > 127) { emiCompVal = 127; } if (emiCompVal < -127) { emiCompVal = -127; } data = msmSeGetIndexPtr(emiCompDataNo); data[12] = emiCompVal; break; case 7: musicOffF = (musicOffF) ? 0 : 1; if (musicOffF) { msmMusSetMasterVolume(0); } else { msmMusSetMasterVolume(127); } break; } } if (btnDown & PAD_BUTTON_START) { switch (smSound3DPos) { case 0: Snd3DDistOffset = 0; break; case 1: Snd3DSpeedOffset = 0; break; case 2: Snd3DStartDisOffset = 0; break; case 3: Snd3DFrontSurDisOffset = 0; break; case 4: Snd3DBackSurDisOffset = 0; break; case 5: emiCompDataNo = 0; break; case 6: emiCompVal = 0; break; case 7: musicOffF = 0; break; } } if (btnDown & PAD_BUTTON_B) { object->func = SMUpdate; } SMSound3DDraw(); } #define DO_HILITE(pos) \ do { \ if (smSound3DPos == pos) { \ fontcolor = FONT_COLOR_GREEN; \ } \ else { \ fontcolor = FONT_COLOR_DARK_GREEN; \ } \ } while (0) static void SMSound3DDraw(void) { char *onOffStr[] = { " ON", "OFF" }; fontcolor = FONT_COLOR_YELLOW; print8(200, 64, 2.0f, "3DSound Config."); DO_HILITE(0); print8(140, 96, 2.0f, "Max Distance %5.1f", Snd3DDistOffset); DO_HILITE(1); print8(140, 112, 2.0f, "Sound Speed %5.1f", Snd3DSpeedOffset); DO_HILITE(2); print8(140, 128, 2.0f, "Start Distance %5.1f", Snd3DStartDisOffset); DO_HILITE(3); print8(140, 144, 2.0f, "Front Distance %5.1f", Snd3DFrontSurDisOffset); DO_HILITE(4); print8(140, 160, 2.0f, "Back Distance %5.1f", Snd3DBackSurDisOffset); DO_HILITE(5); print8(140, 176, 2.0f, "emiComp DataNo %04d", emiCompDataNo); DO_HILITE(6); print8(140, 192, 2.0f, "emiComp VAL %3d", emiCompVal); DO_HILITE(7); print8(140, 208, 2.0f, "Music %s", onOffStr[(musicOffF) ? 1 : 0]); } #undef DO_HILITE