1071 lines
33 KiB
C
1071 lines
33 KiB
C
#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
|