diff --git a/config/GMPE01_00/rels/selmenuDll/symbols.txt b/config/GMPE01_00/rels/selmenuDll/symbols.txt index 849ff5fb..e372b827 100644 --- a/config/GMPE01_00/rels/selmenuDll/symbols.txt +++ b/config/GMPE01_00/rels/selmenuDll/symbols.txt @@ -4,14 +4,14 @@ ModuleProlog = .text:0x000000A0; // type:function size:0x4B8 CopyPlayerCfg = .text:0x00000558; // type:function size:0x60 scope:local CalcBtns = .text:0x000005B8; // type:function size:0x324 scope:local DrawPage = .text:0x000008DC; // type:function size:0x170 scope:local -MoveChar = .text:0x00000A4C; // type:function size:0x180 scope:local -MoveCursor = .text:0x00000BCC; // type:function size:0x88 scope:local +MoveSMPage = .text:0x00000A4C; // type:function size:0x180 scope:local +MoveSMCursor = .text:0x00000BCC; // type:function size:0x88 scope:local SMInit = .text:0x00000C54; // type:function size:0x474 scope:local SMUpdate = .text:0x000010C8; // type:function size:0xA78 scope:local -SMCfgUpdate = .text:0x00001B40; // type:function size:0x334 scope:local +SMGroupGen = .text:0x00001B40; // type:function size:0x334 scope:local SMComCharGet = .text:0x00001E74; // type:function size:0x110 scope:local SMCharKill = .text:0x00001F84; // type:function size:0x50 scope:local -fn_1_1FD4 = .text:0x00001FD4; // type:function size:0x10C +CharRandomize = .text:0x00001FD4; // type:function size:0x10C scope:local SMCharInit = .text:0x000020E0; // type:function size:0x1F8 scope:local SMCharUpdate = .text:0x000022D8; // type:function size:0xD6C scope:local SMExit = .text:0x00003044; // type:function size:0x2FC scope:local @@ -55,7 +55,7 @@ lbl_1_data_12 = .data:0x00000012; // type:object size:0x6 data:string lbl_1_data_18 = .data:0x00000018; // type:object size:0x6 data:string lbl_1_data_1E = .data:0x0000001E; // type:object size:0x7 data:string lbl_1_data_25 = .data:0x00000025; // type:object size:0x6 data:string -lbl_1_data_2B = .data:0x0000002B; // type:object size:0x9 +lbl_1_data_2B = .data:0x0000002B; // type:object size:0x8 data:string charTbl = .data:0x00000034; // type:object size:0x20 scope:local lbl_1_data_54 = .data:0x00000054; // type:object size:0x14 data:string lbl_1_data_68 = .data:0x00000068; // type:object size:0x16 data:string @@ -126,9 +126,10 @@ lbl_1_data_4A8 = .data:0x000004A8; // type:object size:0xE data:string lbl_1_data_4B6 = .data:0x000004B6; // type:object size:0xE data:string lbl_1_data_4C4 = .data:0x000004C4; // type:object size:0xE data:string lbl_1_data_4D2 = .data:0x000004D2; // type:object size:0xA data:string -lbl_1_data_4DC = .data:0x000004DC; // type:object size:0x10 +lbl_1_data_4DC = .data:0x000004DC; // type:object size:0xF data:string menuTbl = .data:0x000004EC; // type:object size:0x348 scope:local -lbl_1_data_844 = .data:0x00000834; // type:object size:0x18 +cameraMaskTbl = .data:0x00000834; // type:object size:0x10 scope:local +lbl_1_data_844 = .data:0x00000844; // type:object size:0x18 scope:local lbl_1_data_85C = .data:0x0000085C; // type:object size:0x12 data:string lbl_1_data_86E = .data:0x0000086E; // type:object size:0x12 data:string lbl_1_data_880 = .data:0x00000880; // type:object size:0x12 data:string @@ -136,19 +137,19 @@ lbl_1_data_892 = .data:0x00000892; // type:object size:0x12 data:string lbl_1_data_8A4 = .data:0x000008A4; // type:object size:0x12 data:string lbl_1_data_8B6 = .data:0x000008B6; // type:object size:0x12 data:string lbl_1_data_8C8 = .data:0x000008C8; // type:object size:0x11 data:string -lbl_1_data_8D9 = .data:0x000008D9; // type:object size:0x3 -sndTable = .data:0x000008DC; // type:object size:0x20 scope:local -cursorPosBackup = .data:0x000008FC; // type:object size:0x2 data:2byte -btnPrev = .data:0x000008FE; // type:object size:0x8 scope:local -lbl_1_data_906 = .data:0x00000906; // type:object size:0x12 -funcNameStr = .data:0x00000918; // type:object size:0x4 scope:local data:4byte +lbl_1_data_8D9 = .data:0x000008D9; // type:object size:0x1 +dvdMusTbl = .data:0x000008DC; // type:object size:0x20 scope:local +smSelectPosExit = .data:0x000008FC; // type:object size:0x2 scope:local data:2byte +btnPrevAll = .data:0x000008FE; // type:object size:0x8 scope:local +lbl_1_data_906 = .data:0x00000906; // type:object size:0xF data:string +funcId$244 = .data:0x00000918; // type:object size:0x4 scope:local data:4byte lbl_1_data_91C = .data:0x0000091C; // type:object size:0x12 data:string lbl_1_data_92E = .data:0x0000092E; // type:object size:0x24 data:string lbl_1_data_952 = .data:0x00000952; // type:object size:0xB data:string lbl_1_data_95D = .data:0x0000095D; // type:object size:0x3 data:string -lbl_1_data_960 = .data:0x00000960; // type:object size:0x10 +lbl_1_data_960 = .data:0x00000960; // type:object size:0xD data:string charMdlTbl = .data:0x00000970; // type:object size:0x20 scope:local -charMdlAnimTbl = .data:0x00000990; // type:object size:0x20 scope:local +charMdlMotTbl = .data:0x00000990; // type:object size:0x20 scope:local lbl_1_data_9B0 = .data:0x000009B0; // type:object size:0xD data:string lbl_1_data_9BD = .data:0x000009BD; // type:object size:0x5 lbl_1_data_9C2 = .data:0x000009C2; // type:object size:0x5 @@ -158,7 +159,7 @@ lbl_1_data_9D6 = .data:0x000009D6; // type:object size:0xA data:string lbl_1_data_9E0 = .data:0x000009E0; // type:object size:0xA data:string lbl_1_data_9EA = .data:0x000009EA; // type:object size:0x9 data:string lbl_1_data_9F3 = .data:0x000009F3; // type:object size:0x9 data:string -lbl_1_data_9FC = .data:0x000009FC; // type:object size:0xC +lbl_1_data_9FC = .data:0x000009FC; // type:object size:0x9 data:string padCfgStrTbl = .data:0x00000A08; // type:object size:0x14 scope:local data:4byte lbl_1_data_A1C = .data:0x00000A1C; // type:object size:0x6 data:string lbl_1_data_A22 = .data:0x00000A22; // type:object size:0x4 data:string @@ -179,16 +180,17 @@ lbl_1_data_AEC = .data:0x00000AEC; // type:object size:0x15 data:string lbl_1_data_B01 = .data:0x00000B01; // type:object size:0x15 data:string lbl_1_data_B16 = .data:0x00000B16; // type:object size:0x15 data:string lbl_1_data_B2B = .data:0x00000B2B; // type:object size:0x14 data:string +lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x2 data:2byte sound3DCursorPos = .bss:0x00000002; // type:object size:0x2 scope:local data:2byte emiCompVal = .bss:0x00000004; // type:object size:0x2 scope:local data:2byte emiCompDataNo = .bss:0x00000006; // type:object size:0x2 scope:local data:2byte -playerCfgField = .bss:0x00000008; // type:object size:0x2 scope:local data:2byte -playerCfgPos = .bss:0x0000000A; // type:object size:0x2 scope:local data:2byte +playerCfgOptionPos = .bss:0x00000008; // type:object size:0x2 scope:local data:2byte +playerCfgPlayerPos = .bss:0x0000000A; // type:object size:0x2 scope:local data:2byte playerCfgSelF = .bss:0x0000000C; // type:object size:0x2 scope:local data:2byte -charSelDisallowF = .bss:0x0000000E; // type:object size:0x10 scope:local -playerCharSelF = .bss:0x0000001E; // type:object size:0x8 scope:local +charSelProhibitF = .bss:0x0000000E; // type:object size:0x10 scope:local +playerDoneF = .bss:0x0000001E; // type:object size:0x8 scope:local charModelID = .bss:0x00000026; // type:object size:0x10 scope:local -bntReleaseAll = .bss:0x00000036; // type:object size:0x8 scope:local +btnReleaseAll = .bss:0x00000036; // type:object size:0x8 scope:local btnAll = .bss:0x0000003E; // type:object size:0x8 scope:local btnDownAll = .bss:0x00000046; // type:object size:0x8 scope:local btnReleaseCurr = .bss:0x0000004E; // type:object size:0x2 scope:local data:2byte @@ -198,5 +200,5 @@ smSelectPos = .bss:0x00000054; // type:object size:0x2 scope:local data:2byte smPlayerCfg = .bss:0x00000056; // type:object size:0x28 scope:local data:2byte outViewObj = .bss:0x00000080; // type:object size:0x4 scope:local data:4byte smMainObj = .bss:0x00000084; // type:object size:0x4 scope:local data:4byte -smPagePos = .bss:0x00000088; // type:object size:0xE scope:local +smSelectPosBackup = .bss:0x00000088; // type:object size:0xE scope:local smPage = .bss:0x00000096; // type:object size:0x2 scope:local data:2byte diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 6e4824d3..c174a8a5 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -5792,7 +5792,7 @@ titleMes$442 = .sdata:0x801D34A0; // type:object size:0x4 scope:local data:4byte lbl_801D34A4 = .sdata:0x801D34A4; // type:object size:0xC lbl_801D34B0 = .sdata:0x801D34B0; // type:object size:0x1 lbl_801D34B1 = .sdata:0x801D34B1; // type:object size:0x7 -mgSeqInitF = .sdata:0x801D34B8; // type:object size:0x4 data:4byte +mgSeqOvlPrev = .sdata:0x801D34B8; // type:object size:0x4 data:4byte wordStartE = .sdata:0x801D34BC; // type:object size:0x7 scope:local data:string seqPunctTbl = .sdata:0x801D34C3; // type:object size:0x3 scope:local data:byte wordStartJ = .sdata:0x801D34C6; // type:object size:0x6 scope:local diff --git a/include/game/hsfdraw.h b/include/game/hsfdraw.h index 76d17f20..41741d75 100755 --- a/include/game/hsfdraw.h +++ b/include/game/hsfdraw.h @@ -39,7 +39,7 @@ void mtxRotCat(Mtx arg0, float arg1, float arg2, float arg3); void mtxRot(Mtx arg0, float arg1, float arg2, float arg3); void mtxScaleCat(Mtx arg0, float arg1, float arg2, float arg3); s16 HmfInverseMtxF3X3(Mtx arg0, Mtx arg1); -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); void Hu3DModelObjPosGet(s16 arg0, char *arg1, Vec *arg2); void Hu3DModelObjMtxGet(s16 arg0, char *arg1, Mtx arg2); void PGObjCall(ModelData *arg0, HsfObject *arg1); diff --git a/include/game/minigame_seq.h b/include/game/minigame_seq.h index 95a04e6e..7a1a85b3 100644 --- a/include/game/minigame_seq.h +++ b/include/game/minigame_seq.h @@ -18,4 +18,6 @@ void MGSeqPauseEnableCtrl(s32 flag); void MGSeqPracticeInit(void); void MGSeqPracticeExitCheck(omObjData *object); +extern OverlayID mgSeqOvlPrev; + #endif diff --git a/include/game/object.h b/include/game/object.h index ecc9c99e..99934e45 100644 --- a/include/game/object.h +++ b/include/game/object.h @@ -101,9 +101,12 @@ s32 omDLLSearch(s16 overlay); void omDLLInfoDump(OSModuleInfo *module); void omDLLHeaderDump(OSModuleHeader *module); +void omOutView(omObjData *object); +void omOutViewMulti(omObjData *object); +void omSystemKeyCheckSetup(Process *objman); +void omSystemKeyCheck(omObjData *object); void omSysPauseEnable(u8 flag); - -void omSystemKeyCheckSetup(Process *objman_process); +void omSysPauseCtrl(s16 flag); extern omObjData *omDBGSysKeyObj; extern Process *omwatchproc; @@ -122,4 +125,11 @@ extern OverlayID omprevovl; extern omDllData *omDLLinfoTbl[OM_DLL_MAX]; +extern Vec CRot; +extern Vec Center; +extern float CZoom; +extern Vec CRotM[16]; +extern Vec CenterM[16]; +extern float CZoomM[16]; + #endif \ No newline at end of file diff --git a/src/REL/selmenuDll/main.c b/src/REL/selmenuDll/main.c new file mode 100644 index 00000000..0de4632c --- /dev/null +++ b/src/REL/selmenuDll/main.c @@ -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; ienabled == 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) { + 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; ifunc = 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(); +} \ No newline at end of file diff --git a/src/game/board/pause.c b/src/game/board/pause.c index e156d443..ebe23b90 100755 --- a/src/game/board/pause.c +++ b/src/game/board/pause.c @@ -39,7 +39,6 @@ typedef struct { u32 unk0C; } ConfigWork; -extern void omSysPauseCtrl(s32); static void PauseExit(void); static void PauseProcess(void); diff --git a/src/game/hsfdraw.c b/src/game/hsfdraw.c index 3e2e6e31..365e0f11 100755 --- a/src/game/hsfdraw.c +++ b/src/game/hsfdraw.c @@ -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); } diff --git a/src/game/minigame_seq.c b/src/game/minigame_seq.c index fe87daa3..244969ca 100644 --- a/src/game/minigame_seq.c +++ b/src/game/minigame_seq.c @@ -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(); } diff --git a/src/game/objsysobj.c b/src/game/objsysobj.c index 478db6ef..f58ab4b3 100644 --- a/src/game/objsysobj.c +++ b/src/game/objsysobj.c @@ -56,7 +56,6 @@ void omOutViewMulti(omObjData *object) } } -void omSystemKeyCheck(omObjData *object); void omSystemKeyCheckSetup(Process *objman) {