Merge branch 'main' into main

This commit is contained in:
CreateSource 2025-03-05 20:44:20 -05:00 committed by GitHub
commit e486d2c27b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
47 changed files with 3413 additions and 2932 deletions

View file

@ -2,7 +2,7 @@
#include "REL/instDll.h"
s32 lbl_1_data_150[0xC6] = {
static s32 FontCharFile[0xC6] = {
0,
0,
0,
@ -203,115 +203,115 @@ s32 lbl_1_data_150[0xC6] = {
DATA_MAKE_NUM(DATADIR_INST, 0x25),
};
s32 fn_1_5EA4(SeqWork *work, char *mess, s16 jp_flag)
s32 FontCreate(SeqWork *work, char *mess, s16 jp_flag)
{
char *var_r31;
s16 var_r30;
s16 *var_r29;
s16 var_r28;
s32 *var_r27;
s16 var_r26;
s16 var_r25;
s32 var_r24;
s16 *var_r22;
AnimData **var_r21;
s16 var_r20;
s16 var_r19;
char *str;
s16 len;
s16 *posY;
s16 charNum;
s32 *fileTbl;
s16 i;
s16 grpNo;
s32 file;
s16 *posX;
AnimData **animP;
s16 gid;
s16 sprid;
var_r27 = lbl_1_data_150;
for (var_r25 = 0; var_r25 < 0x10; var_r25++) {
if (work->spr_grp[var_r25] == -1) {
fileTbl = FontCharFile;
for (grpNo = 0; grpNo < 0x10; grpNo++) {
if (work->spr_grp[grpNo] == -1) {
break;
}
}
if (var_r25 == 0x10) {
if (grpNo == 0x10) {
return -1;
}
var_r21 = HuMemDirectMalloc(HEAP_SYSTEM, 0x190);
var_r22 = HuMemDirectMalloc(HEAP_SYSTEM, 0xC8);
var_r29 = HuMemDirectMalloc(HEAP_SYSTEM, 0xC8);
animP = HuMemDirectMalloc(HEAP_SYSTEM, 0x190);
posX = HuMemDirectMalloc(HEAP_SYSTEM, 0xC8);
posY = HuMemDirectMalloc(HEAP_SYSTEM, 0xC8);
for (var_r31 = mess, var_r30 = 0, var_r28 = 0; var_r31[0] != 0; var_r31++) {
if (var_r31[0] == 0x20 || var_r31[0] == 0x10) {
var_r30 += 0xE;
for (str = mess, len = 0, charNum = 0; str[0] != 0; str++) {
if (str[0] == 0x20 || str[0] == 0x10) {
len += 0xE;
}
else if (var_r31[0] < 0x30) {
else if (str[0] < 0x30) {
}
else if (var_r31[0] == 0x80) {
else if (str[0] == 0x80) {
}
else if (var_r31[0] == 0x81) {
else if (str[0] == 0x81) {
}
else {
if (var_r31[1] == 0x80) {
if ((var_r31[0] >= 0x96) && (var_r31[0] <= 0xA4)) {
var_r24 = var_r27[var_r31[0] + 0x6A];
if (str[1] == 0x80) {
if ((str[0] >= 0x96) && (str[0] <= 0xA4)) {
file = fileTbl[str[0] + 0x6A];
}
else if ((var_r31[0] >= 0xAA) && (var_r31[0] <= 0xAE)) {
var_r24 = var_r27[var_r31[0] + 0x65];
else if ((str[0] >= 0xAA) && (str[0] <= 0xAE)) {
file = fileTbl[str[0] + 0x65];
}
else if ((var_r31[0] >= 0xD6) && (var_r31[0] <= 0xE4)) {
var_r24 = var_r27[var_r31[0] + 0x43];
else if ((str[0] >= 0xD6) && (str[0] <= 0xE4)) {
file = fileTbl[str[0] + 0x43];
}
else if ((var_r31[0] >= 0xEA) && (var_r31[0] <= 0xEE)) {
var_r24 = var_r27[var_r31[0] + 0x3E];
else if ((str[0] >= 0xEA) && (str[0] <= 0xEE)) {
file = fileTbl[str[0] + 0x3E];
}
}
else if (var_r31[1] == 0x81) {
if ((var_r31[0] >= 0xAA) && (var_r31[0] <= 0xAE)) {
var_r24 = var_r27[var_r31[0] + 0x6A];
else if (str[1] == 0x81) {
if ((str[0] >= 0xAA) && (str[0] <= 0xAE)) {
file = fileTbl[str[0] + 0x6A];
}
else if ((var_r31[0] >= 0xEA) && (var_r31[0] <= 0xEE)) {
var_r24 = var_r27[var_r31[0] + 0x43];
else if ((str[0] >= 0xEA) && (str[0] <= 0xEE)) {
file = fileTbl[str[0] + 0x43];
}
}
else {
var_r24 = var_r27[var_r31[0]];
file = fileTbl[str[0]];
}
var_r21[var_r28] = HuSprAnimReadFile(var_r24);
var_r22[var_r28] = var_r30;
if ((var_r31[0] >= 0x61) && (var_r31[0] <= 0x7A)) {
var_r29[var_r28] = 2;
var_r30 += 0x12;
animP[charNum] = HuSprAnimReadFile(file);
posX[charNum] = len;
if ((str[0] >= 0x61) && (str[0] <= 0x7A)) {
posY[charNum] = 2;
len += 0x12;
}
else if ((var_r31[0] == 0xC2) || (var_r31[0] == 0xC3)) {
var_r29[var_r28] = 0;
var_r30 += 0x12;
else if ((str[0] == 0xC2) || (str[0] == 0xC3)) {
posY[charNum] = 0;
len += 0x12;
}
else if (var_r31[0] == 0x5C || var_r31[0] == 0x85) {
var_r29[var_r28] = 0;
var_r30 += 8;
else if (str[0] == 0x5C || str[0] == 0x85) {
posY[charNum] = 0;
len += 8;
}
else if ((var_r31[0] >= 0x87) && (var_r31[0] <= 0x8F)) {
var_r29[var_r28] = 4;
var_r30 += 0x18;
else if ((str[0] >= 0x87) && (str[0] <= 0x8F)) {
posY[charNum] = 4;
len += 0x18;
}
else if ((var_r31[0] >= 0xC7) && (var_r31[0] <= 0xCF)) {
var_r29[var_r28] = 4;
var_r30 += 0x18;
else if ((str[0] >= 0xC7) && (str[0] <= 0xCF)) {
posY[charNum] = 4;
len += 0x18;
}
else if ((var_r31[0] == 0x3D) || (var_r31[0] == 0x84)) {
var_r29[var_r28] = 0;
var_r30 += 0x14;
else if ((str[0] == 0x3D) || (str[0] == 0x84)) {
posY[charNum] = 0;
len += 0x14;
}
else {
var_r29[var_r28] = 0;
var_r30 += 0x1C;
posY[charNum] = 0;
len += 0x1C;
}
var_r28++;
charNum++;
}
}
var_r20 = HuSprGrpCreate(var_r28);
work->spr_grp[var_r25] = var_r20;
work->alt_word_len = var_r30;
var_r30 = (var_r30 / 2) - 0xE;
for (var_r26 = 0; var_r26 < var_r28; var_r26++) {
var_r19 = HuSprCreate(var_r21[var_r26], 0, 0);
HuSprGrpMemberSet(var_r20, var_r26, var_r19);
HuSprPosSet(var_r20, var_r26, var_r22[var_r26] - var_r30, var_r29[var_r26]);
gid = HuSprGrpCreate(charNum);
work->spr_grp[grpNo] = gid;
work->alt_word_len = len;
len = (len / 2) - 0xE;
for (i = 0; i < charNum; i++) {
sprid = HuSprCreate(animP[i], 0, 0);
HuSprGrpMemberSet(gid, i, sprid);
HuSprPosSet(gid, i, posX[i] - len, posY[i]);
}
work->word_len = var_r28;
HuMemDirectFree(var_r21);
HuMemDirectFree(var_r22);
HuMemDirectFree(var_r29);
return var_r25;
work->word_len = charNum;
HuMemDirectFree(animP);
HuMemDirectFree(posX);
HuMemDirectFree(posY);
return grpNo;
}

File diff suppressed because it is too large Load diff

View file

@ -200,8 +200,8 @@ void fn_1_658C(Process *arg0)
CharKill(-1);
}
lbl_1_bss_A8[4] = GWGameStat.open_w06;
lbl_1_bss_A8[5] = GWGameStat.field10E_bit4;
lbl_1_bss_A8[6] = GWGameStat.field10E_bit5;
lbl_1_bss_A8[5] = GWGameStat.veryHardUnlock;
lbl_1_bss_A8[6] = GWGameStat.customPackEnable;
switch (lbl_1_bss_A8[0]) {
case 0:
HuAudSndGrpSetSet(7);
@ -340,11 +340,9 @@ void fn_1_6C4C(void)
print8(var_r30, var_r29 + 0xAA, 1.0f, "MODE:%d MAP:%d", lbl_1_bss_A8[0], lbl_1_bss_A8[2]);
print8(var_r30, var_r29 + 0xBE, 1.0f, "NO) IDX:GRP:COM:DIF:PAD:CHR");
for (var_r31 = 0; var_r31 < 4; var_r31++) {
s32 spC;
s32 sp8 = lbl_1_bss_3114[var_r31].unk_6C;
spC = lbl_1_bss_3114[var_r31].unk_68;
print8(var_r30, var_r29 + 0xC8 + (var_r31 * 0xA), 1.0f, "%2d) %3d:%3d:%3d:%3d:%3d:%3d", var_r31, lbl_1_bss_3114[var_r31].unk_58,
lbl_1_bss_3114[var_r31].unk_5C, lbl_1_bss_3114[var_r31].unk_60, lbl_1_bss_3114[var_r31].unk_64);
lbl_1_bss_3114[var_r31].unk_5C, lbl_1_bss_3114[var_r31].unk_60, lbl_1_bss_3114[var_r31].unk_64, lbl_1_bss_3114[var_r31].unk_6C, lbl_1_bss_3114[var_r31].unk_68);
}
print8(var_r30, var_r29 + 0xF0, 1.0f, "NO) FG0:FG1:FG2:FG3");
for (var_r31 = 0; var_r31 < 4; var_r31++) {
@ -2693,12 +2691,6 @@ void fn_1_E71C(s32 arg0)
}
}
inline void fn_1_E874_inline(void)
{
s32 sp18 = lbl_1_bss_3114[0].unk_68;
GWSystem.unk0C = sp18;
}
void fn_1_E874(omObjData *arg0, MentDllUnkBss35BCStruct *arg1)
{
s32 var_r31;
@ -2757,7 +2749,7 @@ void fn_1_E874(omObjData *arg0, MentDllUnkBss35BCStruct *arg1)
var_r18 = 0;
}
BoardStoryConfigSet(var_r24, var_r18);
fn_1_E874_inline();
GWStoryCharSet(lbl_1_bss_3114[0].unk_68);
// looks a bit similar to fn_1_7304
for (var_r31 = 1; var_r31 < 4; var_r31++) {
lbl_1_bss_3114[var_r31].unk_68 = -1;

View file

@ -1075,7 +1075,7 @@ s32 fn_1_1D688(StructBss8_24 *arg0)
var_r28 = 0;
var_r26 = arg0->unk64;
if (HuPadStkX[lbl_1_bss_1E10->unk6C] >= 5 || (HuPadBtn[lbl_1_bss_1E10->unk6C] & 2)) {
if (GWGameStat.field10E_bit4 == 1) {
if (GWGameStat.veryHardUnlock == 1) {
arg0->unk64++;
var_r28 = 1;
if (arg0->unk64 > 3) {
@ -1091,7 +1091,7 @@ s32 fn_1_1D688(StructBss8_24 *arg0)
}
}
else if (HuPadStkX[lbl_1_bss_1E10->unk6C] <= -5 || (HuPadBtn[lbl_1_bss_1E10->unk6C] & 1)) {
if (GWGameStat.field10E_bit4 == 1) {
if (GWGameStat.veryHardUnlock == 1) {
arg0->unk64--;
var_r28 = -1;
if (arg0->unk64 < 0) {

View file

@ -930,10 +930,10 @@ void fn_1_4010(void)
}
}
if (spA[0] >= 4 && spA[1] >= 3 && spA[2] >= 3 && spA[3] >= 2) {
GWGameStat.field10E_bit5 = 1;
GWGameStat.customPackEnable = 1;
}
else {
GWGameStat.field10E_bit5 = 0;
GWGameStat.customPackEnable = 0;
}
pos2D = lbl_1_data_40[2];
pos2D.z = 800;

View file

@ -1859,7 +1859,7 @@ void fn_1_A8C0(s16 boxno)
SLLoadBoardStory();
lbl_1_bss_EE[boxno] = GWGameStat.total_stars;
lbl_1_bss_D0[boxno] = GWGameStat.create_time;
lbl_1_bss_E8[boxno] = GWSystem.unk0C;
lbl_1_bss_E8[boxno] = GWSystem.storyChar;
lbl_1_bss_C4[boxno] = GWGameStat.story_continue;
lbl_1_bss_B8[boxno] = GWGameStat.party_continue;
if (GWGameStat.story_continue) {

View file

@ -2441,7 +2441,7 @@ s32 fn_1_19A98(MpexDllUnkStruct4 *arg0)
goto block_2;
}
}
if (GWGameStat.field10E_bit4 == 1) {
if (GWGameStat.veryHardUnlock == 1) {
arg0->unk_54++;
var_r28 = 1;
if (arg0->unk_54 > 3) {
@ -2457,7 +2457,7 @@ s32 fn_1_19A98(MpexDllUnkStruct4 *arg0)
goto block_1;
block_2:
if (HuPadStkX[lbl_1_bss_45C->unk_58] <= -5 || HuPadBtn[lbl_1_bss_45C->unk_58] & PAD_BUTTON_LEFT) {
if (GWGameStat.field10E_bit4 == 1) {
if (GWGameStat.veryHardUnlock == 1) {
arg0->unk_54--;
var_r28 = -1;
if (arg0->unk_54 < 0) {

View file

@ -105,7 +105,7 @@ void fn_1_188F0(Process *arg0, s32 arg1)
{
lbl_1_bss_B38 = arg0;
if (GWSystem.diff_story == 2) {
GWGameStat.field10E_bit4 = TRUE;
GWGameStat.veryHardUnlock = TRUE;
}
lbl_1_bss_C0C.unk0C = arg1;
fn_1_C30();
@ -298,7 +298,7 @@ void fn_1_19334(void)
Hu3DModelAttrSet(lbl_1_bss_B94.unk00->model[1], 1);
HuAudSeqFadeOut(lbl_1_bss_78[0], 100);
lbl_1_bss_B3C = 2;
GWGameStat.field10E_bit6 = TRUE;
GWGameStat.musicAllF = TRUE;
WipeColorSet(0, 0, 0);
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, -1);
while (WipeStatGet()) {
@ -406,8 +406,8 @@ void fn_1_199A0(void)
HuPrcVSleep();
}
fn_1_BE8(60);
var_r28 = GWUnkB1Get();
GWSystem.unk0B |= 1 << var_r28;
var_r28 = GWStoryCharGet();
GWSystem.storyCharBit |= 1 << var_r28;
if (SLSaveFlagGet() == 1) {
HuWinInit(1);
HuWinMesMaxSizeGet(1, sp8, MAKE_MESSID(30, 22));

View file

@ -171,7 +171,7 @@ void fn_1_4F4(void) {
case 1:
for (i = 0; i < 4; i++) {
if (GWPlayerCfg[i].character == GWUnkB1Get()) {
if (GWPlayerCfg[i].character == GWStoryCharGet()) {
break;
}
}
@ -179,7 +179,7 @@ void fn_1_4F4(void) {
break;
case 2:
for (i = 0; i < 4; i++) {
if (GWPlayerCfg[i].character == GWUnkB1Get()) {
if (GWPlayerCfg[i].character == GWStoryCharGet()) {
break;
}
}

View file

@ -619,7 +619,7 @@ void fn_1_17570(void) {
} else {
fn_1_159A4();
for (i = 0; i < 4; i++) {
if (lbl_1_bss_1A0C.unk38[i].unk10 != GWUnkB1Get()) {
if (lbl_1_bss_1A0C.unk38[i].unk10 != GWStoryCharGet()) {
continue;
}
_SetFlag(9);

View file

@ -575,15 +575,13 @@ void fn_1_13A0(void)
GWPlayerCfg[0].character = itemno/6;
{
s32 i;
s32 character;
for(i=1; i<4; i++) {
GWPlayerCfg[i].character = GWPlayerCfg[i-1].character+1;
if(GWPlayerCfg[i].character > GW_CHARACTER_MAX) {
GWPlayerCfg[i].character = 0;
}
}
character = GWPlayerCfg[0].character;
GWSystem.unk0C = character;
GWStoryCharSet(GWPlayerCfg[0].character);
GWPlayer[0].character = GWPlayerCfg[0].character;
GWPlayer[1].character = GWPlayerCfg[1].character;
GWPlayer[2].character = GWPlayerCfg[2].character;

View file

@ -147,7 +147,7 @@ void fn_1_488(void) {
switch (omovlevtno) {
case 0:
for (i = 0; i < 4; i++) {
if (GWPlayerCfg[i].character == GWUnkB1Get()) {
if (GWPlayerCfg[i].character == GWStoryCharGet()) {
break;
}
}
@ -155,7 +155,7 @@ void fn_1_488(void) {
break;
case 1:
for (i = 0; i < 4; i++) {
if (GWPlayerCfg[i].character == GWUnkB1Get()) {
if (GWPlayerCfg[i].character == GWStoryCharGet()) {
break;
}
}

View file

@ -513,9 +513,9 @@ omObjData *OptionSoundCreate(void)
for (i = 0; i < NUM_BOARDS; i++) {
musicPageOn[i + 3] = (GWGameStat.board_play_count[i] != 0) ? TRUE : FALSE;
}
musicPageOn[11] = (GWGameStat.field10E_bit6 != 0) ? TRUE : FALSE;
musicPageOn[12] = (GWGameStat.field10E_bit6 != 0) ? TRUE : FALSE;
musicPageOn[13] = (GWGameStat.field10E_bit6 != 0) ? TRUE : FALSE;
musicPageOn[11] = (GWGameStat.musicAllF != 0) ? TRUE : FALSE;
musicPageOn[12] = (GWGameStat.musicAllF != 0) ? TRUE : FALSE;
musicPageOn[13] = (GWGameStat.musicAllF != 0) ? TRUE : FALSE;
return object;
}

View file

@ -19,7 +19,9 @@
#include "REL/resultdll.h"
DataListModel lbl_1_data_4E8[] = { { DATA_MAKE_NUM(DATADIR_RESULT, 0x08), 0, 0, -1, -1, { -300, 0, 0 }, { 0, 0, 0 }, { 0.9f, 0.9f, 0.9f } },
#define COIN_EFFECT_MAX 180
static StageModel resultBattleModel[] = { { DATA_MAKE_NUM(DATADIR_RESULT, 0x08), 0, 0, -1, -1, { -300, 0, 0 }, { 0, 0, 0 }, { 0.9f, 0.9f, 0.9f } },
{ DATA_MAKE_NUM(DATADIR_RESULT, 0x09), 0, 0, -1, -1, { -100, 0, 0 }, { 0, 0, 0 }, { 0.9f, 0.9f, 0.9f } },
{ DATA_MAKE_NUM(DATADIR_RESULT, 0x0A), 0, 0, -1, -1, { 100, 0, 0 }, { 0, 0, 0 }, { 0.9f, 0.9f, 0.9f } },
{ DATA_MAKE_NUM(DATADIR_RESULT, 0x0A), 0, 0, -1, -1, { 300, 0, 0 }, { 0, 0, 0 }, { 0.9f, 0.9f, 0.9f } },
@ -32,12 +34,12 @@ DataListModel lbl_1_data_4E8[] = { { DATA_MAKE_NUM(DATADIR_RESULT, 0x08), 0, 0,
{ DATA_MAKE_NUM(DATADIR_RESULT, 0x0F), 0x40000002, 0, -1, -1, { 5000, 0, 0 }, { 0, 0, 0 }, { 2.0f, 2.0f, 2.0f } },
{ -1, 0, 0, -1, -1, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 1, 1 } } };
DataListSprite lbl_1_data_758[] = {
static StageSprite resultBattleSprite[] = {
{ DATA_MAKE_NUM(DATADIR_RESULT, 0x43), 0, 10, 288, 240, { 255, 255, 255, 255 } },
{ 0, 0, 0, 0, 0, { 0, 0, 0, 0 } },
};
HsfanimStruct00 lbl_1_data_780 = { 80, { 0, 0 }, 3, 30, 90, { 0, -0.2, 0 }, 5.0f, 0.95f, 10.0f, 0.995f, 2,
static HsfanimStruct00 resultBattleEffParMan = { 80, { 0, 0 }, 3, 30, 90, { 0, -0.2, 0 }, 5.0f, 0.95f, 10.0f, 0.995f, 2,
{
{ 255, 192, 112, 255 },
{ 0, 0, 0, 0 },
@ -49,9 +51,10 @@ HsfanimStruct00 lbl_1_data_780 = { 80, { 0, 0 }, 3, 30, 90, { 0, -0.2, 0 }, 5.0f
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
} };
}
};
s16 lbl_1_data_7D0[] = {
static s16 resultStatPosTbl[] = {
320,
132,
500,
@ -70,103 +73,103 @@ s16 lbl_1_data_7D0[] = {
387,
};
Vec lbl_1_data_7F0[] = { { -300, 270, 0 }, { -100, 180, 500 }, { 100, 90, 500 }, { 300, 0, 500 } };
static Vec playerPosTbl[] = { { -300, 270, 0 }, { -100, 180, 500 }, { 100, 90, 500 }, { 300, 0, 500 } };
s16 lbl_1_data_820[] = { -284, 148, -84, 233, 116, 318, 316, 403 };
s32 lbl_1_data_830[] = { DATA_MAKE_NUM(DATADIR_RESULT, 0x08), DATA_MAKE_NUM(DATADIR_RESULT, 0x09), DATA_MAKE_NUM(DATADIR_RESULT, 0x0A),
static s32 bomheiCubeMdlTbl[] = { DATA_MAKE_NUM(DATADIR_RESULT, 0x08), DATA_MAKE_NUM(DATADIR_RESULT, 0x09), DATA_MAKE_NUM(DATADIR_RESULT, 0x0A),
DATA_MAKE_NUM(DATADIR_RESULT, 0x0A) };
float lbl_1_data_840[] = { 130, 150, 170, 150, 150, 130, 170, 190 };
static float coinEffectYOfs[] = { 130, 150, 170, 150, 150, 130, 170, 190 };
float lbl_1_data_860[] = { 130, 150, 180, 150, 150, 170, 180, 210 };
static float coinAddYOfs[] = { 130, 150, 180, 150, 150, 170, 180, 210 };
float lbl_1_data_880[] = { 140, 160, 180, 150, 150, 120, 180, 210 };
static float coinBlankYOfs[] = { 140, 160, 180, 150, 150, 120, 180, 210 };
s16 lbl_1_data_8A0[] = { 8, 0, -8 };
static s16 coinNumXOfs[] = { 8, 0, -8 };
typedef struct struct_unk194 {
s16 unk0;
s16 unk2;
Vec unk4;
Vec unk10;
float unk1C;
} StructUnk194;
typedef struct CoinEffect_s {
s16 playerNo;
s16 rank;
Vec pos;
Vec rotVel;
float velY;
} CoinEffect;
u8 lbl_1_bss_19F8[32];
s16 lbl_1_bss_19F0[4];
s16 lbl_1_bss_19E8[4];
s16 lbl_1_bss_19E0[4];
s16 lbl_1_bss_19B8[4][5];
s16 lbl_1_bss_19B0[4];
s16 lbl_1_bss_1990[4][4];
s16 lbl_1_bss_1828[180];
static s16 resultBattleOrder[4];
static s16 resultBattleRank[4];
static s16 coinNumGrpId[4];
static s16 coinNumSprId[4][5];
static s16 resultBattleCharMdl[4];
static s16 resultBattleCharMot[4][4];
static s16 coinEffectMdlId[COIN_EFFECT_MAX];
s16 lbl_1_bss_181C[6];
s16 lbl_1_bss_1814[4];
StructUnk194 lbl_1_bss_194[180];
s32 lbl_1_bss_190;
static s16 resultBattleEffParManId[4];
static CoinEffect coinEffectData[COIN_EFFECT_MAX];
static s32 resultBattleSkipF;
void fn_1_6760(void);
void fn_1_6824(void);
void fn_1_7544(void);
static void ResultBattleIdle(void);
static void ResultBattleCreate(void);
static void ResultBattleStatAdd(void);
void fn_1_6490(void)
void ResultBattleMain(void)
{
s16 player;
s16 playerNo;
s16 i;
s16 window;
s16 button;
Process *process = HuPrcCurrentGet();
s16 winId;
s16 btnDown;
Process *proc = HuPrcCurrentGet();
HuAudSeqPlay(10);
for (i = player = 0; i < 4; i++) {
for (i = playerNo = 0; i < 4; i++) {
if (GWPlayerCfg[i].iscom) {
player++;
playerNo++;
}
}
if (player == 4) {
lbl_1_bss_190 = 1;
if (playerNo == 4) {
resultBattleSkipF = 1;
}
else {
lbl_1_bss_190 = 0;
resultBattleSkipF = 0;
}
fn_1_6824();
HuPrcChildCreate(fn_1_6760, 100, 8192, 0, process);
ResultBattleCreate();
HuPrcChildCreate(ResultBattleIdle, 100, 8192, 0, proc);
WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 20);
while (WipeStatGet()) {
HuPrcVSleep();
}
lbl_1_bss_178 = 0;
HuPrcChildCreate(fn_1_3FD8, 100, 12288, 0, process);
resultReadEndF = 0;
HuPrcChildCreate(ResultBoardDataRead, 100, 12288, 0, proc);
HuPrcSleep(10);
if (!lbl_1_bss_174) {
if (!resultFastF) {
HuPrcSleep(20);
}
fn_1_7544();
fn_1_40DC();
window = HuWinCreate(-10000.0f, 400.0f, 320, 40, 0);
HuWinMesSpeedSet(window, 0);
HuWinBGTPLvlSet(window, 0);
HuWinAttrSet(window, 0x800);
HuWinMesSet(window, MAKE_MESSID(0x24, 0x07));
ResultBattleStatAdd();
ResultCoinAdd();
winId = HuWinCreate(-10000.0f, 400.0f, 320, 40, 0);
HuWinMesSpeedSet(winId, 0);
HuWinBGTPLvlSet(winId, 0);
HuWinAttrSet(winId, 0x800);
HuWinMesSet(winId, MAKE_MESSID(0x24, 0x07));
i = 0;
while (1) {
if (lbl_1_bss_190 && i > 120) {
if (resultBattleSkipF && i > 120) {
break;
}
for (player = button = 0; player < 4; player++) {
if (!GWPlayerCfg[player].iscom) {
button |= HuPadBtnDown[GWPlayerCfg[player].pad_idx];
for (playerNo = btnDown = 0; playerNo < 4; playerNo++) {
if (!GWPlayerCfg[playerNo].iscom) {
btnDown |= HuPadBtnDown[GWPlayerCfg[playerNo].pad_idx];
}
}
if (button & PAD_BUTTON_A) {
if (btnDown & PAD_BUTTON_A) {
HuAudFXPlay(28);
break;
}
HuPrcVSleep();
i++;
}
HuWinKill(window);
while (!lbl_1_bss_178) {
HuWinKill(winId);
while (!resultReadEndF) {
HuPrcVSleep();
}
WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 30);
@ -183,45 +186,45 @@ void fn_1_6490(void)
}
}
void fn_1_6760(void)
static void ResultBattleIdle(void)
{
Vec temp;
temp.z = 0.0f;
temp.y = 0.0f;
temp.x = 0.0f;
while (1) {
if (((HuPadBtn[0] | HuPadBtn[1] | HuPadBtn[2] | HuPadBtn[3]) & 0x100) != 0 || lbl_1_bss_190 != 0) {
lbl_1_bss_174 = 1;
if (((HuPadBtn[0] | HuPadBtn[1] | HuPadBtn[2] | HuPadBtn[3]) & 0x100) != 0 || resultBattleSkipF != 0) {
resultFastF = 1;
}
else {
lbl_1_bss_174 = 0;
resultFastF = 0;
}
HuPrcVSleep();
}
}
void fn_1_7F98(void);
void fn_1_8338(s16 group, s16 value);
void fn_1_8484(void);
void fn_1_8658(void);
void fn_1_86DC(s16 player);
void fn_1_8CB8(struct model_data *model, Mtx matrix);
static void ResultBattleCoinAddShow(void);
static void ResultBattleCoinAddNumSet(s16 grpId, s16 value);
static void ResultBattleOrderSet(void);
static void CoinEffectInit(void);
static void CoinEffectAdd(s16 playerNo);
static void ResultShadowDraw(struct model_data *model, Mtx matrix);
void fn_1_6824(void)
static void ResultBattleCreate(void)
{
s16 i;
s16 character;
s16 player;
s16 x_ofs;
s16 charNo;
s16 playerNo;
s16 xOfs;
AnimData *anim;
AnimData *anim2;
AnimData *anim3;
s16 char_mdl;
s16 charMdlId;
Vec pos;
Vec target;
Vec up;
s16 gains[5];
Process *process = HuPrcCurrentGet();
s16 coinNum[5];
Process *proc = HuPrcCurrentGet();
CRot.x = 0;
CRot.y = 0;
CRot.z = 0;
@ -240,168 +243,167 @@ void fn_1_6824(void)
up.y = 1;
up.z = 0;
Hu3DShadowPosSet(&pos, &up, &target);
i = Hu3DHookFuncCreate(fn_1_8CB8);
i = Hu3DHookFuncCreate(ResultShadowDraw);
Hu3DModelPosSet(i, 0, 0, 0);
fn_1_8484();
fn_1_423C(gains);
gains[lbl_1_bss_172] += gains[4];
ResultBattleOrderSet();
ResultCoinNumGet(coinNum);
coinNum[resultBonusPlayer] += coinNum[4];
for (i = 0; i < 4; i++) {
lbl_1_data_4E8[i].datanum = lbl_1_data_830[lbl_1_bss_19E8[i]];
if (lbl_1_bss_19E8[i] == 3) {
lbl_1_data_4E8[i].attr = 1;
resultBattleModel[i].datanum = bomheiCubeMdlTbl[resultBattleRank[i]];
if (resultBattleRank[i] == 3) {
resultBattleModel[i].attr = 1;
}
}
fn_1_8FF8(lbl_1_data_4E8);
fn_1_927C(lbl_1_data_758);
espDrawNoSet(lbl_1_bss_1A1A[0], 127);
StageModelCreate(resultBattleModel);
StageSpriteCreate(resultBattleSprite);
espDrawNoSet(stageSprId[0], 127);
for (i = 0; i < 4; i++) {
Hu3DModelShadowSet(lbl_1_bss_1A9C[i]);
Hu3DModelShadowSet(stageMdlId[i]);
}
for (i = 0; i < 4; i++) {
anim = HuSprAnimRead(HuDataReadNum(lbl_1_bss_19E8[i] + DATA_MAKE_NUM(DATADIR_RESULT, 0x44), MEMORY_DEFAULT_NUM));
;
if (lbl_1_bss_19E8[i] <= 2) {
anim = HuSprAnimRead(HuDataReadNum(resultBattleRank[i] + DATA_MAKE_NUM(DATADIR_RESULT, 0x44), MEMORY_DEFAULT_NUM));
if (resultBattleRank[i] <= 2) {
anim2 = HuSprAnimRead(HuDataReadNum(DATA_MAKE_NUM(DATADIR_RESULT, 0x48), MEMORY_DEFAULT_NUM));
}
else {
anim2 = HuSprAnimRead(HuDataReadNum(DATA_MAKE_NUM(DATADIR_RESULT, 0x48), MEMORY_DEFAULT_NUM));
}
Hu3DAnimCreate(anim, lbl_1_bss_1A9C[i + 4], "ys22_a0");
Hu3DAnimCreate(anim2, lbl_1_bss_1A9C[i + 4], "ys22_a1");
Hu3DModelAttrSet(lbl_1_bss_1A9C[i + 4], HU3D_MOTATTR_PAUSE);
Hu3DAnimCreate(anim, stageMdlId[i + 4], "ys22_a0");
Hu3DAnimCreate(anim2, stageMdlId[i + 4], "ys22_a1");
Hu3DModelAttrSet(stageMdlId[i + 4], HU3D_MOTATTR_PAUSE);
}
anim = HuSprAnimRead(HuDataReadNum(DATA_MAKE_NUM(DATADIR_RESULT, 0x3D), MEMORY_DEFAULT_NUM));
anim2 = HuSprAnimRead(HuDataReadNum(DATA_MAKE_NUM(DATADIR_RESULT, 0x3B), MEMORY_DEFAULT_NUM));
anim3 = HuSprAnimRead(HuDataReadNum(DATA_MAKE_NUM(DATADIR_RESULT, 0x3C), MEMORY_DEFAULT_NUM));
for (i = 0; i < 4; i++) {
if (gains[lbl_1_bss_19F0[i]] >= 100) {
x_ofs = lbl_1_data_8A0[2];
if (coinNum[resultBattleOrder[i]] >= 100) {
xOfs = coinNumXOfs[2];
}
else if (gains[lbl_1_bss_19F0[i]] >= 10) {
x_ofs = lbl_1_data_8A0[1];
else if (coinNum[resultBattleOrder[i]] >= 10) {
xOfs = coinNumXOfs[1];
}
else {
x_ofs = lbl_1_data_8A0[0];
xOfs = coinNumXOfs[0];
}
lbl_1_bss_19E0[i] = HuSprGrpCreate(5);
lbl_1_bss_19B8[i][0] = HuSprCreate(anim, 10, 0);
HuSprGrpMemberSet(lbl_1_bss_19E0[i], 0, lbl_1_bss_19B8[i][0]);
HuSprPosSet(lbl_1_bss_19E0[i], 0, 17, -32);
lbl_1_bss_19B8[i][1] = HuSprCreate(anim2, 0, 0);
HuSprGrpMemberSet(lbl_1_bss_19E0[i], 1, lbl_1_bss_19B8[i][1]);
HuSprPosSet(lbl_1_bss_19E0[i], 1, x_ofs, -36);
lbl_1_bss_19B8[i][2] = HuSprCreate(anim3, 0, 0);
HuSprGrpMemberSet(lbl_1_bss_19E0[i], 2, lbl_1_bss_19B8[i][2]);
HuSprPosSet(lbl_1_bss_19E0[i], 2, x_ofs + 16, -36);
lbl_1_bss_19B8[i][3] = HuSprCreate(anim3, 0, 0);
HuSprGrpMemberSet(lbl_1_bss_19E0[i], 3, lbl_1_bss_19B8[i][3]);
HuSprPosSet(lbl_1_bss_19E0[i], 3, x_ofs + 32, -36);
lbl_1_bss_19B8[i][4] = HuSprCreate(anim3, 0, 0);
HuSprGrpMemberSet(lbl_1_bss_19E0[i], 4, lbl_1_bss_19B8[i][4]);
HuSprPosSet(lbl_1_bss_19E0[i], 4, x_ofs + 48, -36);
HuSprGrpPosSet(lbl_1_bss_19E0[i], 0, 0);
fn_1_8338(lbl_1_bss_19E0[i], 9);
HuSprGrpScaleSet(lbl_1_bss_19E0[i], 0, 0);
coinNumGrpId[i] = HuSprGrpCreate(5);
coinNumSprId[i][0] = HuSprCreate(anim, 10, 0);
HuSprGrpMemberSet(coinNumGrpId[i], 0, coinNumSprId[i][0]);
HuSprPosSet(coinNumGrpId[i], 0, 17, -32);
coinNumSprId[i][1] = HuSprCreate(anim2, 0, 0);
HuSprGrpMemberSet(coinNumGrpId[i], 1, coinNumSprId[i][1]);
HuSprPosSet(coinNumGrpId[i], 1, xOfs, -36);
coinNumSprId[i][2] = HuSprCreate(anim3, 0, 0);
HuSprGrpMemberSet(coinNumGrpId[i], 2, coinNumSprId[i][2]);
HuSprPosSet(coinNumGrpId[i], 2, xOfs + 16, -36);
coinNumSprId[i][3] = HuSprCreate(anim3, 0, 0);
HuSprGrpMemberSet(coinNumGrpId[i], 3, coinNumSprId[i][3]);
HuSprPosSet(coinNumGrpId[i], 3, xOfs + 32, -36);
coinNumSprId[i][4] = HuSprCreate(anim3, 0, 0);
HuSprGrpMemberSet(coinNumGrpId[i], 4, coinNumSprId[i][4]);
HuSprPosSet(coinNumGrpId[i], 4, xOfs + 48, -36);
HuSprGrpPosSet(coinNumGrpId[i], 0, 0);
ResultBattleCoinAddNumSet(coinNumGrpId[i], 9);
HuSprGrpScaleSet(coinNumGrpId[i], 0, 0);
}
(void)anim3;
Hu3DMotionSet(lbl_1_bss_1A9C[8], lbl_1_bss_1A5C[9]);
Hu3DModelAttrSet(lbl_1_bss_1A9C[8], HU3D_MOTATTR_LOOP);
Hu3DModelShadowSet(lbl_1_bss_1A9C[8]);
for (i = 0; i < 180; i++) {
Hu3DMotionSet(stageMdlId[8], stageMotId[9]);
Hu3DModelAttrSet(stageMdlId[8], HU3D_MOTATTR_LOOP);
Hu3DModelShadowSet(stageMdlId[8]);
for (i = 0; i < COIN_EFFECT_MAX; i++) {
if (i == 0) {
lbl_1_bss_1828[0] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_RESULT, 0x0C));
coinEffectMdlId[0] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_RESULT, 0x0C));
}
else {
lbl_1_bss_1828[i] = Hu3DModelLink(lbl_1_bss_1828[0]);
coinEffectMdlId[i] = Hu3DModelLink(coinEffectMdlId[0]);
}
Hu3DModelScaleSet(lbl_1_bss_1828[i], 0.5f, 0.5f, 0.5f);
Hu3DModelAttrSet(lbl_1_bss_1828[i], HU3D_ATTR_DISPOFF);
Hu3DModelScaleSet(coinEffectMdlId[i], 0.5f, 0.5f, 0.5f);
Hu3DModelAttrSet(coinEffectMdlId[i], HU3D_ATTR_DISPOFF);
}
fn_1_8658();
CoinEffectInit();
anim = HuSprAnimRead(HuAR_ARAMtoMRAMFileRead(DATA_MAKE_NUM(DATADIR_EFFECT, 4), MEMORY_DEFAULT_NUM, HEAP_DATA));
for (i = 0; i < 4; i++) {
lbl_1_bss_1814[i] = Hu3DParManCreate(anim, 300, &lbl_1_data_780);
Hu3DParManAttrSet(lbl_1_bss_1814[i], 0x65);
Hu3DParticleBlendModeSet(Hu3DParManModelIDGet(lbl_1_bss_1814[i]), 1);
Hu3DParManRotSet(lbl_1_bss_1814[i], 90, 0, 0);
resultBattleEffParManId[i] = Hu3DParManCreate(anim, 300, &resultBattleEffParMan);
Hu3DParManAttrSet(resultBattleEffParManId[i], 0x65);
Hu3DParticleBlendModeSet(Hu3DParManModelIDGet(resultBattleEffParManId[i]), 1);
Hu3DParManRotSet(resultBattleEffParManId[i], 90, 0, 0);
}
HuDataDirClose(DATADIR_RESULT);
for (i = 0; i < 4; i++) {
player = lbl_1_bss_19F0[i];
character = GWPlayerCfg[lbl_1_bss_19F0[i]].character;
char_mdl = CharModelCreate(character, 2);
lbl_1_bss_19B0[player] = char_mdl;
lbl_1_bss_1990[player][0] = CharModelMotionCreate(character, DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x00));
lbl_1_bss_1990[player][1] = CharModelMotionCreate(character, DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x17));
lbl_1_bss_1990[player][2] = CharModelMotionCreate(character, DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x49));
CharModelVoiceEnableSet(character, lbl_1_bss_1990[player][1], 0);
CharModelMotionSet(character, lbl_1_bss_1990[player][0]);
Hu3DModelPosSet(char_mdl, lbl_1_data_7F0[i].x, lbl_1_data_7F0[lbl_1_bss_19E8[i]].y, 0);
Hu3DModelAttrSet(char_mdl, HU3D_MOTATTR_LOOP);
Hu3DModelShadowSet(char_mdl);
playerNo = resultBattleOrder[i];
charNo = GWPlayerCfg[resultBattleOrder[i]].character;
charMdlId = CharModelCreate(charNo, 2);
resultBattleCharMdl[playerNo] = charMdlId;
resultBattleCharMot[playerNo][0] = CharModelMotionCreate(charNo, DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x00));
resultBattleCharMot[playerNo][1] = CharModelMotionCreate(charNo, DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x17));
resultBattleCharMot[playerNo][2] = CharModelMotionCreate(charNo, DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x49));
CharModelVoiceEnableSet(charNo, resultBattleCharMot[playerNo][1], 0);
CharModelMotionSet(charNo, resultBattleCharMot[playerNo][0]);
Hu3DModelPosSet(charMdlId, playerPosTbl[i].x, playerPosTbl[resultBattleRank[i]].y, 0);
Hu3DModelAttrSet(charMdlId, HU3D_MOTATTR_LOOP);
Hu3DModelShadowSet(charMdlId);
}
CharModelDataClose(-1);
}
Vec lbl_1_data_8B8[] = { { 8, 0, 0 }, { 0, 8, 0 }, { 10, 5, 0 }, { -5, 10, 0 }, { 0, -8, 0 }, { 8, 10, 0 }, { -10, 8, 0 }, { 15, 0, 0 } };
static Vec cameraShakeOfs[] = { { 8, 0, 0 }, { 0, 8, 0 }, { 10, 5, 0 }, { -5, 10, 0 }, { 0, -8, 0 }, { 8, 10, 0 }, { -10, 8, 0 }, { 15, 0, 0 } };
void fn_1_7544(void)
static void ResultBattleStatAdd(void)
{
s16 i;
s16 time;
s16 done_cnt;
float pos_y;
s16 gains[5];
s16 time_player[4];
fn_1_423C(gains);
s16 coinNum[5];
s16 delay[4];
ResultCoinNumGet(coinNum);
for (time = 0; time <= 5; time++) {
pos_y = ((5 - time) * 50) + 580;
for (i = 0; i < 4; i++) {
Hu3DModelPosSet(lbl_1_bss_1A9C[i + 4], lbl_1_data_7F0[i].x, pos_y, 0);
Hu3DModelPosSet(stageMdlId[i + 4], playerPosTbl[i].x, pos_y, 0);
}
HuPrcVSleep();
}
for (i = 0; i < 4; i++) {
Hu3DModelAttrReset(lbl_1_bss_1A9C[i + 4], HU3D_MOTATTR_PAUSE);
Hu3DMotionSpeedSet(lbl_1_bss_1A9C[i + 4], 1.5f);
Hu3DModelAttrReset(stageMdlId[i + 4], HU3D_MOTATTR_PAUSE);
Hu3DMotionSpeedSet(stageMdlId[i + 4], 1.5f);
}
HuPrcSleep(35);
for (i = 0; i < 4; i++) {
if (gains[lbl_1_bss_19F0[i]] > 0) {
Hu3DParManAttrReset(lbl_1_bss_1814[i], 1);
time_player[i] = frandmod(10);
if (coinNum[resultBattleOrder[i]] > 0) {
Hu3DParManAttrReset(resultBattleEffParManId[i], 1);
delay[i] = frandmod(10);
}
else {
time_player[i] = 0;
delay[i] = 0;
}
Hu3DParManPosSet(lbl_1_bss_1814[i], lbl_1_data_7F0[i].x, 610.0f, 0.0f);
Hu3DParManPosSet(resultBattleEffParManId[i], playerPosTbl[i].x, 610.0f, 0.0f);
}
while (1) {
for (i = done_cnt = 0; i < 4; i++) {
if (time_player[i]) {
time_player[i]--;
if (delay[i]) {
delay[i]--;
continue;
}
if (gains[lbl_1_bss_19F0[i]] <= 0) {
Hu3DParManAttrSet(lbl_1_bss_1814[i], 1);
if (coinNum[resultBattleOrder[i]] <= 0) {
Hu3DParManAttrSet(resultBattleEffParManId[i], 1);
done_cnt++;
}
else {
fn_1_86DC(i);
gains[lbl_1_bss_19F0[i]]--;
if (gains[lbl_1_bss_19F0[i]] <= 10) {
time_player[i] = 4;
CoinEffectAdd(i);
coinNum[resultBattleOrder[i]]--;
if (coinNum[resultBattleOrder[i]] <= 10) {
delay[i] = 4;
}
else {
if (gains[lbl_1_bss_19F0[i]] <= 20) {
time_player[i] = 3;
if (coinNum[resultBattleOrder[i]] <= 20) {
delay[i] = 3;
}
else {
if (gains[lbl_1_bss_19F0[i]] <= 40) {
time_player[i] = 2;
if (coinNum[resultBattleOrder[i]] <= 40) {
delay[i] = 2;
}
else {
time_player[i] = 1;
delay[i] = 1;
}
}
}
@ -412,234 +414,233 @@ void fn_1_7544(void)
}
HuPrcVSleep();
}
if (gains[4]) {
if (coinNum[4]) {
HuPrcSleep(20);
Hu3DModelRotSet(lbl_1_bss_1A9C[8], 0, -90, 0);
Hu3DModelScaleSet(lbl_1_bss_1A9C[8], 0.8f, 0.8f, 0.8f);
Hu3DMotionSpeedSet(lbl_1_bss_1A9C[8], 2.0f);
Hu3DModelRotSet(stageMdlId[8], 0, -90, 0);
Hu3DModelScaleSet(stageMdlId[8], 0.8f, 0.8f, 0.8f);
Hu3DMotionSpeedSet(stageMdlId[8], 2.0f);
for (i = 0; i <= 40; i++) {
Hu3DModelPosSet(lbl_1_bss_1A9C[8], 500.0f * (1.0f - (i / 40.0f)), 0, 100.0f);
Hu3DModelPosSet(stageMdlId[8], 500.0f * (1.0f - (i / 40.0f)), 0, 100.0f);
HuPrcVSleep();
}
HuAudFXPlay(828);
Hu3DModelAttrReset(lbl_1_bss_1A9C[10], HU3D_MOTATTR_PAUSE);
Hu3DModelPosSet(lbl_1_bss_1A9C[10], 0, 0, 200);
for (i = 0; i < Hu3DMotionMaxTimeGet(lbl_1_bss_1A9C[10]); i++) {
Hu3DModelAttrReset(stageMdlId[10], HU3D_MOTATTR_PAUSE);
Hu3DModelPosSet(stageMdlId[10], 0, 0, 200);
for (i = 0; i < Hu3DMotionMaxTimeGet(stageMdlId[10]); i++) {
if (i > 10) {
Hu3DModelAttrSet(lbl_1_bss_1A9C[8], HU3D_ATTR_DISPOFF);
Hu3DModelAttrSet(stageMdlId[8], HU3D_ATTR_DISPOFF);
}
Center.x = lbl_1_data_8B8[(i / 2) & 0x7].x;
Center.y = 330.0f + lbl_1_data_8B8[(i / 2) & 0x7].y;
Center.z = lbl_1_data_8B8[(i / 2) & 0x7].z;
espPosSet(lbl_1_bss_1A1A[0], 288.0f + lbl_1_data_8B8[(i / 2) & 0x7].x, 240.0f - lbl_1_data_8B8[(i / 2) & 0x7].y);
Center.x = cameraShakeOfs[(i / 2) & 0x7].x;
Center.y = 330.0f + cameraShakeOfs[(i / 2) & 0x7].y;
Center.z = cameraShakeOfs[(i / 2) & 0x7].z;
espPosSet(stageSprId[0], 288.0f + cameraShakeOfs[(i / 2) & 0x7].x, 240.0f - cameraShakeOfs[(i / 2) & 0x7].y);
HuPrcVSleep();
}
espPosSet(lbl_1_bss_1A1A[0], 288.0, 240.0);
espPosSet(stageSprId[0], 288.0, 240.0);
Center.x = 0;
Center.y = 330;
Center.z = 0;
time_player[0] = 10;
delay[0] = 10;
for (i = 0; i < 4; i++) {
if (lbl_1_bss_172 == lbl_1_bss_19F0[i]) {
if (resultBonusPlayer == resultBattleOrder[i]) {
break;
}
}
Hu3DParManAttrReset(lbl_1_bss_1814[i], 1);
Hu3DParManAttrReset(resultBattleEffParManId[i], 1);
while (1) {
if (time_player[0] != 0) {
time_player[0]--;
if (delay[0] != 0) {
delay[0]--;
HuPrcVSleep();
continue;
}
if (gains[4] <= 0) {
Hu3DParManAttrSet(lbl_1_bss_1814[i], 1);
if (coinNum[4] <= 0) {
Hu3DParManAttrSet(resultBattleEffParManId[i], 1);
break;
}
fn_1_86DC(i);
gains[4]--;
time_player[0] = 5;
CoinEffectAdd(i);
coinNum[4]--;
delay[0] = 5;
HuPrcVSleep();
}
Hu3DParManAttrSet(lbl_1_bss_1814[i], 1);
Hu3DParManAttrSet(resultBattleEffParManId[i], 1);
}
fn_1_423C(gains);
gains[lbl_1_bss_172] += gains[4];
ResultCoinNumGet(coinNum);
coinNum[resultBonusPlayer] += coinNum[4];
for (i = 0; i < 4; i++) {
if (gains[lbl_1_bss_19F0[i]]) {
CharModelMotionShiftSet(GWPlayerCfg[lbl_1_bss_19F0[i]].character, lbl_1_bss_1990[lbl_1_bss_19F0[i]][1], 0, 4, HU3D_MOTATTR_NONE);
HuAudPlayerVoicePlay(lbl_1_bss_19F0[i], 293);
if (coinNum[resultBattleOrder[i]]) {
CharModelMotionShiftSet(GWPlayerCfg[resultBattleOrder[i]].character, resultBattleCharMot[resultBattleOrder[i]][1], 0, 4, HU3D_MOTATTR_NONE);
HuAudPlayerVoicePlay(resultBattleOrder[i], 293);
}
else {
CharModelMotionShiftSet(GWPlayerCfg[lbl_1_bss_19F0[i]].character, lbl_1_bss_1990[lbl_1_bss_19F0[i]][2], 0, 4, HU3D_MOTATTR_NONE);
CharModelMotionShiftSet(GWPlayerCfg[resultBattleOrder[i]].character, resultBattleCharMot[resultBattleOrder[i]][2], 0, 4, HU3D_MOTATTR_NONE);
}
}
HuPrcSleep(20);
fn_1_7F98();
ResultBattleCoinAddShow();
HuPrcSleep(120);
}
void fn_1_7F98(void)
static void ResultBattleCoinAddShow(void)
{
s16 i;
s16 time;
s16 delay;
s16 gains[5];
Vec pos_3d;
Vec pos_2d;
fn_1_423C(gains);
gains[lbl_1_bss_172] += gains[4];
s16 speed;
s16 coinNum[5];
Vec pos3D;
Vec pos2D;
ResultCoinNumGet(coinNum);
coinNum[resultBonusPlayer] += coinNum[4];
for (i = 0; i < 4; i++) {
fn_1_8338(lbl_1_bss_19E0[i], gains[lbl_1_bss_19F0[i]]);
pos_3d.x = lbl_1_data_7F0[i].x;
if (gains[lbl_1_bss_19F0[i]]) {
pos_3d.y = lbl_1_data_7F0[lbl_1_bss_19E8[i]].y + lbl_1_data_860[GWPlayerCfg[lbl_1_bss_19F0[i]].character];
ResultBattleCoinAddNumSet(coinNumGrpId[i], coinNum[resultBattleOrder[i]]);
pos3D.x = playerPosTbl[i].x;
if (coinNum[resultBattleOrder[i]]) {
pos3D.y = playerPosTbl[resultBattleRank[i]].y + coinAddYOfs[GWPlayerCfg[resultBattleOrder[i]].character];
}
else {
pos_3d.y = lbl_1_data_7F0[lbl_1_bss_19E8[i]].y + lbl_1_data_880[GWPlayerCfg[lbl_1_bss_19F0[i]].character];
pos3D.y = playerPosTbl[resultBattleRank[i]].y + coinBlankYOfs[GWPlayerCfg[resultBattleOrder[i]].character];
}
pos_3d.z = 0;
Hu3D3Dto2D(&pos_3d, 1, &pos_2d);
HuSprGrpPosSet(lbl_1_bss_19E0[i], pos_2d.x, pos_2d.y);
pos3D.z = 0;
Hu3D3Dto2D(&pos3D, 1, &pos2D);
HuSprGrpPosSet(coinNumGrpId[i], pos2D.x, pos2D.y);
}
delay = (lbl_1_bss_174) ? 3 : 10;
for (time = 0; time <= delay; time++) {
float scale = sind((90.0 / delay) * time);
speed = (resultFastF) ? 3 : 10;
for (time = 0; time <= speed; time++) {
float scale = sind((90.0 / speed) * time);
for (i = 0; i < 4; i++) {
HuSprGrpScaleSet(lbl_1_bss_19E0[i], scale, scale);
HuSprGrpScaleSet(coinNumGrpId[i], scale, scale);
}
HuPrcVSleep();
}
for (i = 0; i < 4; i++) {
HuSprGrpScaleSet(lbl_1_bss_19E0[i], 1.0f, 1.0f);
HuSprGrpScaleSet(coinNumGrpId[i], 1.0f, 1.0f);
}
}
void fn_1_8338(s16 group, s16 value)
static void ResultBattleCoinAddNumSet(s16 grpId, s16 value)
{
s16 digit;
s16 digit_value;
digit = 2;
digit_value = value / 100;
if (digit_value != 0) {
HuSprBankSet(group, digit, digit_value);
HuSprAttrReset(group, digit, 4);
digit++;
s16 no;
s16 bank;
no = 2;
bank = value / 100;
if (bank != 0) {
HuSprBankSet(grpId, no, bank);
HuSprAttrReset(grpId, no, 4);
no++;
}
value -= digit_value * 100;
digit_value = value / 10;
if (digit_value != 0 || digit == 3) {
HuSprBankSet(group, digit, digit_value);
HuSprAttrReset(group, digit, 4);
digit++;
value -= bank * 100;
bank = value / 10;
if (bank != 0 || no == 3) {
HuSprBankSet(grpId, no, bank);
HuSprAttrReset(grpId, no, 4);
no++;
}
value -= digit_value * 10;
HuSprBankSet(group, digit, value);
HuSprAttrReset(group, digit, 4);
digit++;
for (digit_value = digit; digit_value < 5; digit_value++) {
HuSprAttrSet(group, digit_value, 4);
value -= bank * 10;
HuSprBankSet(grpId, no, value);
HuSprAttrReset(grpId, no, 4);
no++;
for (bank = no; bank < 5; bank++) {
HuSprAttrSet(grpId, bank, 4);
}
}
void fn_1_8484(void)
static void ResultBattleOrderSet(void)
{
s16 i;
s16 j;
for (i = 0; i < 4; i++) {
lbl_1_bss_19E8[i] = GWPlayerCoinWinGet(i);
lbl_1_bss_19F0[i] = i;
resultBattleRank[i] = GWPlayerCoinWinGet(i);
resultBattleOrder[i] = i;
}
for (j = 1; j < 4; j++) {
for (i = 0; i < 4 - j; i++) {
if (lbl_1_bss_19E8[i] > lbl_1_bss_19E8[i + 1]) {
if (resultBattleRank[i] > resultBattleRank[i + 1]) {
s16 temp;
temp = lbl_1_bss_19E8[i];
lbl_1_bss_19E8[i] = lbl_1_bss_19E8[i + 1];
lbl_1_bss_19E8[i + 1] = temp;
temp = lbl_1_bss_19F0[i];
lbl_1_bss_19F0[i] = lbl_1_bss_19F0[i + 1];
lbl_1_bss_19F0[i + 1] = temp;
temp = resultBattleRank[i];
resultBattleRank[i] = resultBattleRank[i + 1];
resultBattleRank[i + 1] = temp;
temp = resultBattleOrder[i];
resultBattleOrder[i] = resultBattleOrder[i + 1];
resultBattleOrder[i + 1] = temp;
}
}
}
}
void fn_1_8998(void);
static void CoinEffectMain(void);
void fn_1_8658(void)
static void CoinEffectInit(void)
{
s16 i;
Process *process = HuPrcCurrentGet();
for (i = 0; i < 180; i++) {
lbl_1_bss_194[i].unk0 = -1;
for (i = 0; i < COIN_EFFECT_MAX; i++) {
coinEffectData[i].playerNo = -1;
}
HuPrcChildCreate(fn_1_8998, 100, 8192, 0, process);
HuPrcChildCreate(CoinEffectMain, 100, 8192, 0, process);
}
void fn_1_86DC(s16 player)
static void CoinEffectAdd(s16 playerNo)
{
s16 i;
for (i = 0; i < 180; i++) {
if (lbl_1_bss_194[i].unk0 == -1) {
for (i = 0; i < COIN_EFFECT_MAX; i++) {
if (coinEffectData[i].playerNo == -1) {
break;
}
}
if (i == 180) {
if (i == COIN_EFFECT_MAX) {
return;
}
lbl_1_bss_194[i].unk0 = player;
lbl_1_bss_194[i].unk4.x = lbl_1_data_7F0[player].x;
lbl_1_bss_194[i].unk4.y = 610.0f;
lbl_1_bss_194[i].unk4.z = 0.0f;
lbl_1_bss_194[i].unk2 = lbl_1_bss_19E8[player];
lbl_1_bss_194[i].unk10.x = frandmod(20) - 10.0f;
lbl_1_bss_194[i].unk10.y = frandmod(20) - 10.0f;
lbl_1_bss_194[i].unk10.z = 0;
lbl_1_bss_194[i].unk1C = 10.0f;
Hu3DModelAttrReset(lbl_1_bss_1828[i], HU3D_ATTR_DISPOFF);
Hu3DModelPosSet(lbl_1_bss_1828[i], 0, 100, 0);
Hu3DModelRotSet(lbl_1_bss_1828[i], 0, 0, 0);
coinEffectData[i].playerNo = playerNo;
coinEffectData[i].pos.x = playerPosTbl[playerNo].x;
coinEffectData[i].pos.y = 610.0f;
coinEffectData[i].pos.z = 0.0f;
coinEffectData[i].rank = resultBattleRank[playerNo];
coinEffectData[i].rotVel.x = frandmod(20) - 10.0f;
coinEffectData[i].rotVel.y = frandmod(20) - 10.0f;
coinEffectData[i].rotVel.z = 0;
coinEffectData[i].velY = 10.0f;
Hu3DModelAttrReset(coinEffectMdlId[i], HU3D_ATTR_DISPOFF);
Hu3DModelPosSet(coinEffectMdlId[i], 0, 100, 0);
Hu3DModelRotSet(coinEffectMdlId[i], 0, 0, 0);
}
void fn_1_8998(void)
static void CoinEffectMain(void)
{
s16 i;
ModelData *model_ptr;
ModelData *modelP;
s16 player;
while (1) {
for (i = 0; i < 180; i++) {
if (lbl_1_bss_194[i].unk0 == -1) {
for (i = 0; i < COIN_EFFECT_MAX; i++) {
if (coinEffectData[i].playerNo == -1) {
continue;
}
player = lbl_1_bss_194[i].unk0;
model_ptr = &Hu3DData[lbl_1_bss_1828[i]];
model_ptr->pos = lbl_1_bss_194[i].unk4;
model_ptr->rot.x += lbl_1_bss_194[i].unk10.x;
model_ptr->rot.y += lbl_1_bss_194[i].unk10.y;
lbl_1_bss_194[i].unk4.y -= lbl_1_bss_194[i].unk1C;
lbl_1_bss_194[i].unk1C += 0.2f;
if (lbl_1_bss_194[i].unk4.y < ((3 - lbl_1_bss_194[i].unk2) * 100) + lbl_1_data_840[GWPlayerCfg[lbl_1_bss_19F0[player]].character]) {
player = coinEffectData[i].playerNo;
modelP = &Hu3DData[coinEffectMdlId[i]];
modelP->pos = coinEffectData[i].pos;
modelP->rot.x += coinEffectData[i].rotVel.x;
modelP->rot.y += coinEffectData[i].rotVel.y;
coinEffectData[i].pos.y -= coinEffectData[i].velY;
coinEffectData[i].velY += 0.2f;
if (coinEffectData[i].pos.y < ((3 - coinEffectData[i].rank) * 100) + coinEffectYOfs[GWPlayerCfg[resultBattleOrder[player]].character]) {
Vec pos;
pos.x = lbl_1_data_7F0[player].x;
pos.y = ((3 - lbl_1_bss_194[i].unk2) * 100) + lbl_1_data_840[GWPlayerCfg[lbl_1_bss_19F0[player]].character];
pos.x = playerPosTbl[player].x;
pos.y = ((3 - coinEffectData[i].rank) * 100) + coinEffectYOfs[GWPlayerCfg[resultBattleOrder[player]].character];
pos.z = 0.0f;
CharModelCoinEffectCreate(1, &pos);
lbl_1_bss_194[i].unk0 = -1;
coinEffectData[i].playerNo = -1;
HuAudFXPlay(7);
Hu3DModelAttrSet(lbl_1_bss_1828[i], HU3D_ATTR_DISPOFF);
Hu3DModelAttrSet(coinEffectMdlId[i], HU3D_ATTR_DISPOFF);
}
}
HuPrcVSleep();
}
}
void fn_1_8CB8(struct model_data *model, Mtx matrix)
static void ResultShadowDraw(struct model_data *model, Mtx matrix)
{
s32 sp8 = 0;
GXTexObj tex;
Mtx final;
Mtx inv_camera;
Mtx invCamera;
Mtx shadow;
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
@ -647,8 +648,8 @@ void fn_1_8CB8(struct model_data *model, Mtx matrix)
GXInitTexObj(&tex, Hu3DShadowData.unk_04, Hu3DShadowData.unk_02, Hu3DShadowData.unk_02, GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE);
GXInitTexObjLOD(&tex, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1);
GXLoadTexObj(&tex, 0);
MTXInverse(Hu3DCameraMtx, inv_camera);
MTXConcat(inv_camera, matrix, final);
MTXInverse(Hu3DCameraMtx, invCamera);
MTXConcat(invCamera, matrix, final);
MTXConcat(Hu3DShadowData.unk_68, Hu3DShadowData.unk_38, shadow);
MTXConcat(shadow, final, final);
GXLoadTexMtxImm(final, GX_TEXMTX9, GX_MTX3x4);

View file

@ -1,13 +1,13 @@
#include "REL/resultdll.h"
s16 lbl_1_bss_1A9C[32];
s16 lbl_1_bss_1A5C[32];
s16 lbl_1_bss_1A1A[33];
s16 stageMdlId[32];
s16 stageMotId[32];
s16 stageSprId[33];
s16 lbl_1_bss_1A18;
void fn_1_8FF8(DataListModel *model_list)
void StageModelCreate(StageModel *model_list)
{
DataListModel *list;
StageModel *list;
s16 i;
s16 model;
s16 clear_i;
@ -15,24 +15,24 @@ void fn_1_8FF8(DataListModel *model_list)
void *data;
list = model_list;
for(clear_i=0; clear_i<32; clear_i++) {
lbl_1_bss_1A9C[clear_i] = lbl_1_bss_1A5C[clear_i] = -1;
stageMdlId[clear_i] = stageMotId[clear_i] = -1;
}
for(i=0; list->datanum != DATA_NUM_LISTEND; list++, i++) {
if(list->type == 0) {
data = HuDataSelHeapReadNum(list->datanum, MEMORY_DEFAULT_NUM, HEAP_DATA);
model = Hu3DModelCreate(data);
lbl_1_bss_1A9C[i] = model;
stageMdlId[i] = model;
Hu3DModelAttrSet(model, list->attr);
Hu3DModelPosSetV(model, &list->pos);
Hu3DModelRotSetV(model, &list->rot);
Hu3DModelScaleSetV(model, &list->scale);
model_ptr = &Hu3DData[model];
if(model_ptr->unk_08 != -1) {
lbl_1_bss_1A5C[i] = model_ptr->unk_08;
stageMotId[i] = model_ptr->unk_08;
}
} else if(list->type == 1) {
data = HuDataSelHeapReadNum(list->datanum, MEMORY_DEFAULT_NUM, HEAP_DATA);
lbl_1_bss_1A5C[i] = Hu3DJointMotion(lbl_1_bss_1A9C[list->mot_link], data);
stageMotId[i] = Hu3DJointMotion(stageMdlId[list->mot_link], data);
}
(void)i;
@ -40,33 +40,33 @@ void fn_1_8FF8(DataListModel *model_list)
list = model_list;
for(i=0; list->datanum != DATA_NUM_LISTEND; list++, i++) {
if(list->type == 2) {
model = Hu3DModelLink(lbl_1_bss_1A9C[list->link]);
lbl_1_bss_1A9C[i] = model;
model = Hu3DModelLink(stageMdlId[list->link]);
stageMdlId[i] = model;
Hu3DModelAttrSet(model, list->attr);
Hu3DModelPosSetV(model, &list->pos);
Hu3DModelRotSetV(model, &list->rot);
Hu3DModelScaleSetV(model, &list->scale);
}
if(list->mot_link != -1) {
Hu3DMotionSet(lbl_1_bss_1A9C[i], lbl_1_bss_1A5C[list->mot_link]);
Hu3DMotionSet(stageMdlId[i], stageMotId[list->mot_link]);
}
(void)i;
}
}
void fn_1_927C(DataListSprite *sprite_list)
void StageSpriteCreate(StageSprite *sprite_list)
{
DataListSprite *list;
StageSprite *list;
s16 sprite;
s16 clear_i;
s16 i;
list = sprite_list;
for(clear_i=0; clear_i<32; clear_i++) {
lbl_1_bss_1A1A[clear_i] = -1;
stageSprId[clear_i] = -1;
}
for(i=0; list->datanum; i++, list++) {
sprite = espEntry(list->datanum, 100, 0);
lbl_1_bss_1A1A[i] = sprite;
stageSprId[i] = sprite;
espPosSet(sprite, list->x, list->y);
espColorSet(sprite, list->color.r, list->color.g, list->color.b);
espTPLvlSet(sprite, list->color.a/255.0f);
@ -75,12 +75,12 @@ void fn_1_927C(DataListSprite *sprite_list)
}
}
void fn_1_93B4(void)
void StageSpriteKill(void)
{
s16 i;
for(i=0; i<32; i++) {
if(lbl_1_bss_1A1A[i] != -1) {
espKill(lbl_1_bss_1A1A[i]);
if(stageSprId[i] != -1) {
espKill(stageSprId[i]);
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -2511,7 +2511,7 @@ s32 fn_1_F214(ZtarDllUnkStruct2 *arg0)
var_r28 = 0;
var_r26 = arg0->unk_54;
if (HuPadStkX[lbl_1_bss_8C[0].unk_58] >= 5 || (HuPadBtn[lbl_1_bss_8C[0].unk_58] & PAD_BUTTON_RIGHT)) {
if (GWGameStat.field10E_bit4 == 1) {
if (GWGameStat.veryHardUnlock == 1) {
arg0->unk_54++;
var_r28 = 1;
if (arg0->unk_54 > 3) {
@ -2527,7 +2527,7 @@ s32 fn_1_F214(ZtarDllUnkStruct2 *arg0)
}
}
else if (HuPadStkX[lbl_1_bss_8C[0].unk_58] <= -5 || (HuPadBtn[lbl_1_bss_8C[0].unk_58] & PAD_BUTTON_LEFT)) {
if (GWGameStat.field10E_bit4 == 1) {
if (GWGameStat.veryHardUnlock == 1) {
arg0->unk_54--;
var_r28 = -1;
if (arg0->unk_54 < 0) {

View file

@ -16,7 +16,7 @@ struct DispatchEntry gTRKDispatchTable[33] = {
{ &TRKDoUnsupported }, { &TRKDoUnsupported }, { &TRKDoUnsupported },
{ &TRKDoUnsupported }, { &TRKDoReadMemory }, { &TRKDoWriteMemory },
{ &TRKDoReadRegisters }, { &TRKDoWriteRegisters }, { &TRKDoUnsupported },
{ &TRKDoUnsupported }, { &TRKDoFlushCache }, { &TRKDoUnsupported },
{ &TRKDoUnsupported }, { &TRKDoFlushCache }, { &TRKDoSetOption },
{ &TRKDoContinue }, { &TRKDoStep }, { &TRKDoStop },
{ &TRKDoUnsupported }, { &TRKDoUnsupported }, { &TRKDoUnsupported },
{ &TRKDoUnsupported }, { &TRKDoUnsupported },
@ -36,6 +36,7 @@ DSError TRKDispatchMessage(TRKBuffer* buffer)
error = DS_DispatchError;
TRKSetBufferPosition(buffer, 0);
TRKReadBuffer1_ui8(buffer, &command);
command &= 0xFF;
if (command < gTRKDispatchTableSize) {
error = gTRKDispatchTable[command].fn(buffer);
}

View file

@ -4,84 +4,95 @@
#include "amcstubs/AmcExi2Stubs.h"
#include "PowerPC_EABI_Support/MetroTRK/trk.h"
#define BUFF_LEN 4362
u8 gWriteBuf[BUFF_LEN];
u8 gReadBuf[BUFF_LEN];
s32 _MetroTRK_Has_Framing;
s32 gReadCount;
s32 gReadPos;
s32 gWritePos;
DBCommTable gDBCommTable = {};
asm void TRKLoadContext(OSContext* ctx, u32)
{
#ifdef __MWERKS__ // clang-format off
nofralloc
lwz r0, OSContext.gpr[0](r3)
lwz r1, OSContext.gpr[1](r3)
lwz r2, OSContext.gpr[2](r3)
lhz r5, OSContext.state(r3)
rlwinm. r6, r5, 0, 0x1e, 0x1e
beq lbl_80371C1C
rlwinm r5, r5, 0, 0x1f, 0x1d
sth r5, OSContext.state(r3)
lmw r5, OSContext.gpr[5](r3)
b lbl_80371C20
nofralloc
lwz r0, OSContext.gpr[0](r3)
lwz r1, OSContext.gpr[1](r3)
lwz r2, OSContext.gpr[2](r3)
lhz r5, OSContext.state(r3)
rlwinm. r6, r5, 0, 0x1e, 0x1e
beq lbl_80371C1C
rlwinm r5, r5, 0, 0x1f, 0x1d
sth r5, OSContext.state(r3)
lmw r5, OSContext.gpr[5](r3)
b lbl_80371C20
lbl_80371C1C:
lmw r13, OSContext.gpr[13](r3)
lmw r13, OSContext.gpr[13](r3)
lbl_80371C20:
mr r31, r3
mr r3, r4
lwz r4, OSContext.cr(r31)
mtcrf 0xff, r4
lwz r4, OSContext.lr(r31)
mtlr r4
lwz r4, OSContext.ctr(r31)
mtctr r4
lwz r4, OSContext.xer(r31)
mtxer r4
mfmsr r4
rlwinm r4, r4, 0, 0x11, 0xf //Turn off external exceptions
rlwinm r4, r4, 0, 0x1f, 0x1d //Turn off recoverable exception flag
mtmsr r4
mtsprg 1, r2
lwz r4, OSContext.gpr[3](r31)
mtsprg 2, r4
lwz r4, OSContext.gpr[4](r31)
mtsprg 3, r4
lwz r2, OSContext.srr0(r31)
lwz r4, OSContext.srr1(r31)
lwz r31, OSContext.gpr[31](r31)
b TRKInterruptHandler
mr r31, r3
mr r3, r4
lwz r4, OSContext.cr(r31)
mtcrf 0xff, r4
lwz r4, OSContext.lr(r31)
mtlr r4
lwz r4, OSContext.ctr(r31)
mtctr r4
lwz r4, OSContext.xer(r31)
mtxer r4
mfmsr r4
rlwinm r4, r4, 0, 0x11, 0xf //Turn off external exceptions
rlwinm r4, r4, 0, 0x1f, 0x1d //Turn off recoverable exception flag
mtmsr r4
mtsprg 1, r2
lwz r4, OSContext.gpr[3](r31)
mtsprg 2, r4
lwz r4, OSContext.gpr[4](r31)
mtsprg 3, r4
lwz r2, OSContext.srr0(r31)
lwz r4, OSContext.srr1(r31)
lwz r31, OSContext.gpr[31](r31)
b TRKInterruptHandler
#endif // clang-format on
}
void TRKEXICallBack(__OSInterrupt param_0, OSContext* ctx)
{
OSEnableScheduler();
TRKLoadContext(ctx, 0x500);
OSEnableScheduler();
TRKLoadContext(ctx, 0x500);
}
int InitMetroTRKCommTable(int hwId)
{
int result;
int result;
if (hwId == HARDWARE_GDEV) {
result = Hu_IsStub();
if (hwId == HARDWARE_GDEV) {
OSReport("MetroTRK : Set to GDEV hardware\n");
result = Hu_IsStub();
gDBCommTable.initialize_func = DBInitComm;
gDBCommTable.init_interrupts_func = DBInitInterrupts;
gDBCommTable.peek_func = DBQueryData;
gDBCommTable.read_func = DBRead;
gDBCommTable.write_func = DBWrite;
gDBCommTable.open_func = DBOpen;
gDBCommTable.close_func = DBClose;
} else {
result = AMC_IsStub();
gDBCommTable.initialize_func = DBInitComm;
gDBCommTable.init_interrupts_func = DBInitInterrupts;
gDBCommTable.peek_func = DBQueryData;
gDBCommTable.read_func = DBRead;
gDBCommTable.write_func = DBWrite;
gDBCommTable.open_func = DBOpen;
gDBCommTable.close_func = DBClose;
} else {
OSReport("MetroTRK : Set to AMC DDH hardware\n");
result = AMC_IsStub();
gDBCommTable.initialize_func = EXI2_Init;
gDBCommTable.init_interrupts_func = EXI2_EnableInterrupts;
gDBCommTable.peek_func = EXI2_Poll;
gDBCommTable.read_func = EXI2_ReadN;
gDBCommTable.write_func = EXI2_WriteN;
gDBCommTable.open_func = EXI2_Reserve;
gDBCommTable.close_func = EXI2_Unreserve;
}
gDBCommTable.initialize_func = EXI2_Init;
gDBCommTable.init_interrupts_func = EXI2_EnableInterrupts;
gDBCommTable.peek_func = EXI2_Poll;
gDBCommTable.read_func = EXI2_ReadN;
gDBCommTable.write_func = EXI2_WriteN;
gDBCommTable.open_func = EXI2_Reserve;
gDBCommTable.close_func = EXI2_Unreserve;
}
return result;
return result;
}
void TRKUARTInterruptHandler() { }
@ -89,8 +100,8 @@ void TRKUARTInterruptHandler() { }
DSError TRKInitializeIntDrivenUART(u32 param_0, u32 param_1, u32 param_2,
volatile u8** param_3)
{
gDBCommTable.initialize_func(param_3, TRKEXICallBack);
return DS_NoError;
gDBCommTable.initialize_func(param_3, TRKEXICallBack);
return DS_NoError;
}
void EnableEXI2Interrupts(void) { gDBCommTable.init_interrupts_func(); }
@ -99,14 +110,59 @@ int TRKPollUART(void) { return gDBCommTable.peek_func(); }
UARTError TRKReadUARTN(void* bytes, u32 length)
{
int readErr = gDBCommTable.read_func(bytes, length);
return readErr == 0 ? 0 : -1;
int readErr = gDBCommTable.read_func(bytes, length);
return readErr == 0 ? 0 : -1;
}
UARTError TRKWriteUARTN(const void* bytes, u32 length)
{
int writeErr = gDBCommTable.write_func(bytes, length);
return writeErr == 0 ? 0 : -1;
int writeErr = gDBCommTable.write_func(bytes, length);
return writeErr == 0 ? 0 : -1;
}
UARTError WriteUARTFlush(void)
{
UARTError readErr = 0;
while (gWritePos < 0x800) {
gWriteBuf[gWritePos] = 0;
gWritePos++;
}
if (gWritePos != 0) {
readErr = TRKWriteUARTN(gWriteBuf, gWritePos);
gWritePos = 0;
}
return readErr;
}
UARTError WriteUART1(u8 arg0)
{
gWriteBuf[gWritePos++] = arg0;
return 0;
}
UARTError TRKReadUARTPoll(u8* arg0)
{
UARTError readErr = 4;
if (gReadPos >= gReadCount) {
gReadPos = 0;
gReadCount = TRKPollUART();
if (gReadCount > 0) {
if (gReadCount > BUFF_LEN) {
gReadCount = BUFF_LEN;
}
readErr = TRKReadUARTN(gReadBuf, gReadCount);
if (readErr != 0) {
gReadCount = 0;
}
}
}
if (gReadPos < gReadCount) {
*arg0 = gReadBuf[gReadPos++];
readErr = 0;
}
return readErr;
}
void ReserveEXI2Port(void) { gDBCommTable.open_func(); }

View file

@ -245,4 +245,4 @@ lbl_8037149C:
#endif // clang-format on
}
u32 TRKTargetCPUMinorType(void) { return 0x54; }
u8 TRKTargetCPUMinorType(void) { return 0x54; }

View file

@ -2,8 +2,60 @@
#include "TRK_MINNOW_DOLPHIN/Os/dolphin/dolphin_trk_glue.h"
#include "PowerPC_EABI_Support/MetroTRK/trk.h"
// Incorrect signature? Should be u8.
UARTError WriteUART1(s8 arg0);
DSError TRKMessageSend(TRK_Msg* msg)
{
DSError write_err = TRKWriteUARTN(&msg->m_msg, msg->m_msgLength);
return DS_NoError;
u8 var_r30;
u8 var_r28;
u8 var_r28_2;
s32 var_r3;
s32 i;
var_r30 = 0;
for (i = 0; i < msg->m_msgLength; i++) {
var_r30 = var_r30 + msg->m_msg[i];
}
var_r30 = var_r30 ^ 0xFF;
var_r3 = WriteUART1(0x7E);
if (var_r3 == 0) {
for (i = 0; i < msg->m_msgLength; i++) {
var_r28 = msg->m_msg[i];
if (var_r28 == 0x7E || var_r28 == 0x7D) {
var_r3 = WriteUART1(0x7D);
var_r28 ^= 0x20;
if (var_r3 != 0) {
break;
}
}
var_r3 = WriteUART1(var_r28);
if (var_r3 != 0) {
break;
}
}
}
if (var_r3 == 0) {
var_r28_2 = var_r30;
for (i = 0; i < 1; i++) {
if (var_r28_2 == 0x7E || var_r28_2 == 0x7D) {
var_r3 = WriteUART1(0x7D);
var_r28_2 ^= 0x20;
if (var_r3 != 0) {
break;
}
}
var_r3 = WriteUART1(var_r28_2);
if (var_r3 != 0) {
break;
}
}
}
if (var_r3 == 0) {
var_r3 = WriteUART1(0x7E);
}
if (var_r3 == 0) {
var_r3 = WriteUARTFlush();
}
return var_r3;
}

View file

@ -34,7 +34,7 @@ DSError TRKGetFreeBuffer(int* msgID, TRKBuffer** outMsg)
TRKAcquireMutex(buf);
if (!buf->isInUse) {
TRKResetBuffer(buf, TRUE);
TRKResetBuffer(buf, 1);
TRKSetBufferUsed(buf, TRUE);
error = DS_NoError;
*outMsg = buf;
@ -44,6 +44,10 @@ DSError TRKGetFreeBuffer(int* msgID, TRKBuffer** outMsg)
TRKReleaseMutex(buf);
}
if (error == DS_NoMessageBufferAvailable) {
usr_puts_serial("ERROR : No buffer available\n");
}
return error;
}
@ -68,7 +72,7 @@ void TRKReleaseBuffer(int idx)
}
}
void TRKResetBuffer(TRKBuffer* msg, BOOL keepData)
void TRKResetBuffer(TRKBuffer* msg, u8 keepData)
{
msg->length = 0;
msg->position = 0;
@ -96,6 +100,7 @@ DSError TRKSetBufferPosition(TRKBuffer* msg, u32 pos)
return error;
}
#pragma dont_inline on
DSError TRKAppendBuffer(TRKBuffer* msg, const void* data, size_t length)
{
DSError error = DS_NoError; // r31
@ -129,6 +134,7 @@ DSError TRKAppendBuffer(TRKBuffer* msg, const void* data, size_t length)
return error;
}
#pragma dont_inline reset
DSError TRKReadBuffer(TRKBuffer* msg, void* data, size_t length)
{

View file

@ -45,8 +45,7 @@ DSError TRKStandardACK(TRKBuffer* buffer, MessageCommandID commandID,
DSReplyError replyError)
{
TRKMessageIntoReply(buffer, commandID, replyError);
TRKSendACK(buffer);
return;
return TRKSendACK(buffer);
}
DSError TRKDoUnsupported(TRKBuffer* buffer)
@ -107,7 +106,6 @@ DSError TRKDoVersions(TRKBuffer* buffer)
else
error = TRKSendACK(buffer);
}
return error;
}
DSError TRKDoSupportMask(TRKBuffer* buffer)
@ -140,7 +138,7 @@ DSError TRKDoCPUType(TRKBuffer* buffer)
if (buffer->length != 1) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
return error;
return;
}
TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError);
@ -166,8 +164,6 @@ DSError TRKDoCPUType(TRKBuffer* buffer)
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_CWDSError);
else
error = TRKSendACK(buffer);
return error;
}
DSError TRKDoReadMemory(TRKBuffer* buffer)
@ -175,11 +171,11 @@ DSError TRKDoReadMemory(TRKBuffer* buffer)
DSError error;
DSReplyError replyError;
u8 tempBuf[0x800];
u32 length;
u32 msg_start;
u32 length;
u16 msg_length;
u8 msg_options;
u8 msg_command;
u8 msg_options;
if (buffer->length != 8) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
@ -257,11 +253,11 @@ DSError TRKDoWriteMemory(TRKBuffer* buffer)
DSError error;
DSReplyError replyError;
u8 tmpBuffer[0x800];
u32 length;
u32 msg_start;
u32 length;
u16 msg_length;
u8 msg_options;
u8 msg_command;
u8 msg_options;
if (buffer->length <= 8) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
@ -343,14 +339,14 @@ DSError TRKDoReadRegisters(TRKBuffer* buffer)
DSReplyError replyError;
DSMessageRegisterOptions options;
u32 registerDataLength;
u16 msg_lastRegister;
u16 msg_firstRegister;
u8 msg_options;
u16 msg_lastRegister;
u8 msg_command;
u8 msg_options;
if (buffer->length != 6) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
return error;
return;
}
TRKSetBufferPosition(buffer, DSREPLY_NoError);
error = TRKReadBuffer1_ui8(buffer, &msg_command);
@ -366,13 +362,13 @@ DSError TRKDoReadRegisters(TRKBuffer* buffer)
if (msg_firstRegister > msg_lastRegister) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK,
DSREPLY_InvalidRegisterRange);
return error;
return;
}
if (error == DS_NoError)
TRKMessageIntoReply(buffer, DSMSG_ReplyACK, DSREPLY_NoError);
options = (DSMessageRegisterOptions)msg_options;
options = (DSMessageRegisterOptions)(msg_options & 7);
switch (options) {
case DSREG_Default:
error = TRKTargetAccessDefault(msg_firstRegister, msg_lastRegister,
@ -423,8 +419,6 @@ DSError TRKDoReadRegisters(TRKBuffer* buffer)
} else {
error = TRKSendACK(buffer);
}
return error;
}
DSError TRKDoWriteRegisters(TRKBuffer* buffer)
@ -433,14 +427,14 @@ DSError TRKDoWriteRegisters(TRKBuffer* buffer)
DSReplyError replyError;
DSMessageRegisterOptions options;
u32 registerDataLength;
u16 msg_lastRegister;
u16 msg_firstRegister;
u8 msg_options;
u16 msg_lastRegister;
u8 msg_command;
u8 msg_options;
if (buffer->length <= 6) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
return error;
return;
}
TRKSetBufferPosition(buffer, DSREPLY_NoError);
error = TRKReadBuffer1_ui8(buffer, &msg_command);
@ -456,7 +450,7 @@ DSError TRKDoWriteRegisters(TRKBuffer* buffer)
if (msg_firstRegister > msg_lastRegister) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK,
DSREPLY_InvalidRegisterRange);
return error;
return;
}
options = (DSMessageRegisterOptions)msg_options;
@ -516,22 +510,20 @@ DSError TRKDoWriteRegisters(TRKBuffer* buffer)
} else {
error = TRKSendACK(buffer);
}
return error;
}
DSError TRKDoFlushCache(TRKBuffer* buffer)
{
DSError error;
DSReplyError replyErr;
u32 msg_end;
u32 msg_start;
u8 msg_options;
u32 msg_end;
u8 msg_command;
u8 msg_options;
if (buffer->length != 10) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
return error;
return;
}
TRKSetBufferPosition(buffer, DSREPLY_NoError);
@ -546,7 +538,7 @@ DSError TRKDoFlushCache(TRKBuffer* buffer)
if (msg_start > msg_end) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK,
DSREPLY_InvalidMemoryRange);
return error;
return;
}
if (error == DS_NoError)
@ -570,8 +562,6 @@ DSError TRKDoFlushCache(TRKBuffer* buffer)
} else {
error = TRKSendACK(buffer);
}
return error;
}
DSError TRKDoContinue(TRKBuffer* buffer)
@ -581,14 +571,12 @@ DSError TRKDoContinue(TRKBuffer* buffer)
error = TRKTargetStopped();
if (error == DS_NoError) {
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NotStopped);
return error;
return;
}
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NoError);
if (error == DS_NoError)
error = TRKTargetContinue();
return error;
}
DSError TRKDoStep(TRKBuffer* buffer)
@ -601,8 +589,10 @@ DSError TRKDoStep(TRKBuffer* buffer)
u32 msg_rangeEnd;
u32 pc;
if (buffer->length < 3)
return TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
if (buffer->length < 3) {
TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
return;
}
TRKSetBufferPosition(buffer, DSREPLY_NoError);
@ -618,12 +608,14 @@ DSError TRKDoStep(TRKBuffer* buffer)
if (msg_count >= 1) {
break;
}
return TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_ParameterError);
TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_ParameterError);
return;
case DSSTEP_IntoRange:
case DSSTEP_OverRange:
if (buffer->length != 10)
return TRKStandardACK(buffer, DSMSG_ReplyACK,
DSREPLY_PacketSizeError);
if (buffer->length != 10) {
TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_PacketSizeError);
return;
}
if (error == DS_NoError)
error = TRKReadBuffer1_ui32(buffer, &msg_rangeStart);
@ -634,33 +626,33 @@ DSError TRKDoStep(TRKBuffer* buffer)
if (pc >= msg_rangeStart && pc <= msg_rangeEnd) {
break;
}
return TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_ParameterError);
TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_ParameterError);
return;
default:
return TRKStandardACK(buffer, DSMSG_ReplyACK,
DSREPLY_UnsupportedOptionError);
TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_UnsupportedOptionError);
return;
}
if (!TRKTargetStopped()) {
return TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NotStopped);
} else {
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NoError);
if (error == DS_NoError)
switch (msg_options) {
case DSSTEP_IntoCount:
case DSSTEP_OverCount:
error = TRKTargetSingleStep(msg_count,
(msg_options == DSSTEP_OverCount));
break;
case DSSTEP_IntoRange:
case DSSTEP_OverRange:
error = TRKTargetStepOutOfRange(
msg_rangeStart, msg_rangeEnd,
(msg_options == DSSTEP_OverRange));
break;
}
return error;
TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NotStopped);
return;
}
error = TRKStandardACK(buffer, DSMSG_ReplyACK, DSREPLY_NoError);
if (error == DS_NoError)
switch (msg_options) {
case DSSTEP_IntoCount:
case DSSTEP_OverCount:
error = TRKTargetSingleStep(msg_count,
(msg_options == DSSTEP_OverCount));
break;
case DSSTEP_IntoRange:
case DSSTEP_OverRange:
error = TRKTargetStepOutOfRange(
msg_rangeStart, msg_rangeEnd,
(msg_options == DSSTEP_OverRange));
break;
}
}
DSError TRKDoStop(TRKBuffer* b)
@ -687,3 +679,46 @@ DSError TRKDoStop(TRKBuffer* b)
return TRKStandardACK(b, DSMSG_ReplyACK, replyError);
}
DSError TRKDoSetOption(TRKBuffer* buffer) {
DSError error;
u8 spA;
u8 sp9;
u8 sp8;
spA = 0;
sp9 = 0;
sp8 = 0;
TRKSetBufferPosition(buffer, DSREPLY_NoError);
error = TRKReadBuffer1_ui8(buffer, &spA);
if (error == DS_NoError) {
error = TRKReadBuffer1_ui8(buffer, &sp9);
}
if (error == DS_NoError) {
error = TRKReadBuffer1_ui8(buffer, &sp8);
}
if (error != DS_NoError) {
TRKResetBuffer(buffer, 1);
if (buffer->position < 0x880) {
buffer->data[buffer->position++] = 0x80;
buffer->length++;
}
if (buffer->position < 0x880) {
buffer->data[buffer->position++] = 1;
buffer->length++;
}
TRKSendACK(buffer);
} else if (sp9 == 1) {
SetUseSerialIO(sp8);
}
TRKResetBuffer(buffer, 1);
if (buffer->position < 0x880) {
buffer->data[buffer->position++] = 0x80;
buffer->length++;
}
if (buffer->position < 0x880) {
buffer->data[buffer->position++] = 0;
buffer->length++;
}
return TRKSendACK(buffer);
}

112
src/TRK_MINNOW_DOLPHIN/mslsupp.c Executable file
View file

@ -0,0 +1,112 @@
#include "PowerPC_EABI_Support/MetroTRK/trk.h"
#include <stddef.h>
// forward declares
DSIOResult __read_file(u32 handle, u8* buffer, size_t* count, void* ref_con);
DSIOResult __write_file(u32 handle, u8* buffer, size_t* count, void* ref_con);
DSIOResult __access_file(u32 handle, u8* buffer, size_t* count, void* ref_con, MessageCommandID cmd);
/**
* @note Address: 0x800C0B4C
* @note Size: 0xBC
*/
DSIOResult __read_console(u32 handle, u8* buffer, size_t* count, void* ref_con)
{
if (GetUseSerialIO() == 0) {
return DS_IOError;
}
return __read_file(DS_Stdin, buffer, count, ref_con);
}
/**
* @note Address: 0x800C0A90
* @note Size: 0xBC
*/
DSIOResult __TRK_write_console(u32 handle, u8* buffer, size_t* count, void* ref_con)
{
if (GetUseSerialIO() == 0) {
return DS_IOError;
}
return __write_file(DS_Stdout, buffer, count, ref_con);
}
/**
* @note Address: N/A
* @note Size: 0xB4
*/
DSIOResult __read_file(u32 handle, u8* buffer, size_t* count, void* ref_con)
{
return __access_file(handle, buffer, count, ref_con, DSMSG_ReadFile);
}
/**
* @note Address: N/A
* @note Size: 0xB4
*/
DSIOResult __write_file(u32 handle, u8* buffer, size_t* count, void* ref_con)
{
return __access_file(handle, buffer, count, ref_con, DSMSG_WriteFile);
}
/**
* @note Address: N/A
* @note Size: 0x17C
*/
void __open_file(void)
{
// UNUSED FUNCTION
}
/**
* @note Address: N/A
* @note Size: 0xDC
*/
void __position_file(void)
{
// UNUSED FUNCTION
}
/**
* @note Address: N/A
* @note Size: 0xE0
*/
void convertFileMode(void)
{
// UNUSED FUNCTION
}
/**
* @note Address: N/A
* @note Size: 0xC0
*/
DSIOResult __access_file(u32 handle, u8* buffer, size_t* count, void* ref_con, MessageCommandID cmd)
{
size_t countTemp;
u32 r0;
if (GetTRKConnected() == DS_NoError) {
return DS_IOError;
}
countTemp = *count;
r0 = TRKAccessFile(cmd, handle, &countTemp, buffer);
*count = countTemp;
switch ((u8)r0) {
case DS_IONoError:
return DS_IONoError;
case DS_IOEOF:
return DS_IOEOF;
}
return DS_IOError;
}
/**
* @note Address: N/A
* @note Size: 0x1D0
*/
void __open_temp_file(void)
{
// UNUSED FUNCTION
}

View file

@ -9,74 +9,133 @@ static TRKFramingState gTRKFramingState;
void* gTRKInputPendingPtr;
MessageBufferID TRKTestForPacket()
{
int bytes;
int batch;
int err;
TRKBuffer* b;
int id;
static inline BOOL serpoll_inline_00(TRKBuffer* buffer) {
if (buffer->length < 2) {
TRKStandardACK(buffer, DSMSG_ReplyNAK, DSREPLY_PacketSizeError);
if (gTRKFramingState.msgBufID != -1) {
TRKReleaseBuffer(gTRKFramingState.msgBufID);
gTRKFramingState.msgBufID = -1;
}
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
return FALSE;
}
buffer->position = 0;
buffer->length--;
return TRUE;
}
bytes = TRKPollUART();
if (bytes > 0) {
TRKGetFreeBuffer(&id, &b);
if (bytes > TRKMSGBUF_SIZE) {
for (; bytes > 0; bytes -= batch) {
batch = bytes > TRKMSGBUF_SIZE ? TRKMSGBUF_SIZE : bytes;
TRKReadUARTN(b->data, batch);
}
TRKStandardACK(b, 0xff, 6);
} else {
err = TRKReadUARTN(b->data, bytes);
if (err == 0) {
b->length = bytes;
return id;
}
}
}
if (id != -1) {
TRKReleaseBuffer(id);
}
return -1;
MessageBufferID TRKTestForPacket(void) {
s32 var_r29;
s32 var_r3;
s8 sp8;
s32 temp_r3;
var_r29 = 0;
var_r3 = TRKReadUARTPoll(&sp8);
while (var_r3 == 0 && var_r29 == 0) {
if (gTRKFramingState.receiveState != DSRECV_InFrame) {
gTRKFramingState.isEscape = FALSE;
}
switch (gTRKFramingState.receiveState) {
case DSRECV_Wait:
if (sp8 == 0x7E) {
var_r29 = TRKGetFreeBuffer(&gTRKFramingState.msgBufID, &gTRKFramingState.buffer);
gTRKFramingState.fcsType = 0;
gTRKFramingState.receiveState = DSRECV_Found;
}
break;
case DSRECV_Found:
if (sp8 == 0x7E) {
break;
}
gTRKFramingState.receiveState = DSRECV_InFrame;
/* fallthrough */
case DSRECV_InFrame:
if (sp8 == 0x7E) {
if (gTRKFramingState.isEscape) {
TRKStandardACK(gTRKFramingState.buffer, DSMSG_ReplyNAK, DSREPLY_EscapeError);
if (gTRKFramingState.msgBufID != -1) {
TRKReleaseBuffer(gTRKFramingState.msgBufID);
gTRKFramingState.msgBufID = -1;
}
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
break;
}
if (serpoll_inline_00(gTRKFramingState.buffer)) {
temp_r3 = gTRKFramingState.msgBufID;
gTRKFramingState.msgBufID = -1;
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
return temp_r3;
}
gTRKFramingState.receiveState = DSRECV_Wait;
} else {
if (gTRKFramingState.isEscape) {
sp8 ^= 0x20;
gTRKFramingState.isEscape = FALSE;
} else if (sp8 == 0x7D) {
gTRKFramingState.isEscape = TRUE;
break;
}
var_r29 = TRKAppendBuffer1_ui8(gTRKFramingState.buffer, sp8);
gTRKFramingState.fcsType += sp8;
}
break;
case DSRECV_FrameOverflow:
if (sp8 == 0x7E) {
if (gTRKFramingState.msgBufID != -1) {
TRKReleaseBuffer(gTRKFramingState.msgBufID);
gTRKFramingState.msgBufID = -1;
}
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
}
break;
}
var_r3 = TRKReadUARTPoll(&sp8);
}
return -1;
}
void TRKGetInput(void)
{
MessageBufferID id;
TRKBuffer* msgBuffer;
u8 command;
TRKBuffer* msgBuffer;
MessageBufferID id;
u8 command;
id = TRKTestForPacket();
if (id == -1)
return;
id = TRKTestForPacket();
if (id == -1)
return;
msgBuffer = TRKGetBuffer(id);
TRKSetBufferPosition(msgBuffer, 0);
TRKReadBuffer1_ui8(msgBuffer, &command);
if (command < DSMSG_ReplyACK) {
TRKProcessInput(id);
} else {
TRKReleaseBuffer(id);
}
msgBuffer = TRKGetBuffer(id);
TRKSetBufferPosition(msgBuffer, 0);
TRKReadBuffer1_ui8(msgBuffer, &command);
if (command < DSMSG_ReplyACK) {
TRKProcessInput(id);
} else {
TRKReleaseBuffer(id);
}
}
void TRKProcessInput(int bufferIdx)
{
TRKEvent event;
TRKEvent event;
TRKConstructEvent(&event, NUBEVENT_Request);
gTRKFramingState.msgBufID = -1;
event.msgBufID = bufferIdx;
TRKPostEvent(&event);
TRKConstructEvent(&event, NUBEVENT_Request);
gTRKFramingState.msgBufID = -1;
event.msgBufID = bufferIdx;
TRKPostEvent(&event);
}
DSError TRKInitializeSerialHandler(void)
{
gTRKFramingState.msgBufID = -1;
gTRKFramingState.receiveState = DSRECV_Wait;
gTRKFramingState.isEscape = FALSE;
gTRKFramingState.msgBufID = -1;
gTRKFramingState.receiveState = DSRECV_Wait;
gTRKFramingState.isEscape = FALSE;
return DS_NoError;
return DS_NoError;
}
DSError TRKTerminateSerialHandler(void) { return DS_NoError; }

View file

@ -28,7 +28,7 @@ DSError TRKSuppAccessFile(u32 file_handle, u8* data, size_t* count,
*io_result = DS_IONoError;
done = 0;
error = DS_NoError;
while (!exit && done < *count && error == DS_NoError && *io_result == 0) {
while (!exit && done < *count && error == DS_NoError && *io_result == DS_IONoError) {
if (*count - done > 0x800) {
length = 0x800;
} else {
@ -175,3 +175,114 @@ DSError TRKRequestSend(TRKBuffer* msgBuf, int* bufferId, u32 p1, u32 p2, int p3)
return error;
}
DSError HandleOpenFileSupportRequest(const char* path, u8 replyError, u32* param_3, u8* ioResult) {
int sp10;
int spC;
TRKBuffer* sp8;
TRKBuffer* var_r31;
DSError var_r26;
*param_3 = 0;
var_r26 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui8(sp8, 0xD2);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui8(sp8, replyError);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui16(sp8, strlen(path) + 1);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer_ui8(sp8, (u8*) path, strlen(path) + 1);
}
if (var_r26 == DS_NoError) {
*ioResult = 0;
var_r26 = TRKRequestSend(sp8, &sp10, 7, 3, 0);
if (var_r26 == DS_NoError) {
var_r31 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r31, 2);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKReadBuffer1_ui8(var_r31, ioResult);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKReadBuffer1_ui32(var_r31, param_3);
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r26;
}
DSError HandleCloseFileSupportRequest(int replyError, u8* ioResult) {
int sp10;
int spC;
DSError var_r31;
TRKBuffer* sp8;
TRKBuffer* var_r30;
var_r31 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r31 == DS_NoError) {
var_r31 = TRKAppendBuffer1_ui8(sp8, 0xD3);
}
if (var_r31 == DS_NoError) {
var_r31 = TRKAppendBuffer1_ui32(sp8, replyError);
}
if (var_r31 == DS_NoError) {
*ioResult = DS_IONoError;
var_r31 = TRKRequestSend(sp8, &sp10, 3, 3, 0);
if (var_r31 == DS_NoError) {
var_r30 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r30, 2);
}
if (var_r31 == DS_NoError) {
var_r31 = TRKReadBuffer1_ui8(var_r30, ioResult);
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r31;
}
DSError HandlePositionFileSupportRequest(u32 replyErr, u32* param_2, u8 param_3, u8* ioResult) {
int sp10;
int spC;
TRKBuffer* sp8;
TRKBuffer* var_r31;
DSError var_r27;
var_r27 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui8(sp8, 0xD4);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui32(sp8, replyErr);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui32(sp8, *param_2);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui8(sp8, param_3);
}
if (var_r27 == DS_NoError) {
*ioResult = DS_IONoError;
var_r27 = TRKRequestSend(sp8, &sp10, 3, 3, 0);
if (var_r27 == DS_NoError) {
var_r31 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r31, 2);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKReadBuffer1_ui8(var_r31, ioResult);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKReadBuffer1_ui32(var_r31, param_2);
} else {
*param_2 = -1;
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r27;
}

View file

@ -0,0 +1,11 @@
#include "PowerPC_EABI_Support/MetroTRK/trk.h"
static u8 bUseSerialIO;
void SetUseSerialIO(u8 sio) {
bUseSerialIO = sio;
}
u8 GetUseSerialIO(void) {
return bUseSerialIO;
}

File diff suppressed because it is too large Load diff

View file

@ -2,4 +2,25 @@
#include "TRK_MINNOW_DOLPHIN/MetroTRK/Portable/msghndlr.h"
#include "PowerPC_EABI_Support/MetroTRK/trk.h"
BOOL usr_puts_serial(const char* msg)
{
BOOL connect_ = FALSE;
char c;
char buf[2];
while (!connect_ && (c = *msg++) != '\0') {
BOOL connect = GetTRKConnected();
buf[0] = c;
buf[1] = '\0';
SetTRKConnected(FALSE);
OSReport(buf);
SetTRKConnected(connect);
connect_ = FALSE;
}
return connect_;
}
void usr_put_initialize(void) { }

View file

@ -496,7 +496,7 @@ void HuAudSndGrpSetSet(s16 dataSize) {
sndGroupBak = dataSize;
err = msmSysDelGroupAll();
buf = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(1));
err = msmSysLoadGroupSet(dataSize, buf);
err = msmSysLoadGroupSet(dataSize, buf);\
OSReport("***********GroupSet Error %d\n", err);
HuMemDirectFree(buf);
}

View file

@ -619,7 +619,7 @@ static void CreateBoard(void)
s32 guest_status;
GWSystem.mg_next = -1;
if(!GWGameStat.field10E_bit5 && GWMGListGet() == 2) {
if(!GWGameStat.customPackEnable && GWMGListGet() == 2) {
GWMGListSet(0);
}
GWMessSpeedSet(GWMessSpeedGet());

View file

@ -905,7 +905,7 @@ static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) {
var_r30 |= 2;
}
temp_r29 = CheckPort(arg1->unk04);
if (GWGameStat.field10E_bit4 != 0) {
if (GWGameStat.veryHardUnlock != 0) {
var_r27 = 4;
} else {
var_r27 = 3;
@ -962,7 +962,7 @@ static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) {
arg1->unk09 = 0;
}
arg1->unk05 += var_r28;
if (GWGameStat.field10E_bit4 == 0 && arg1->unk05 == 4) {
if (GWGameStat.veryHardUnlock == 0 && arg1->unk05 == 4) {
arg1->unk05 += var_r28;
}
if (arg1->unk05 > var_r27) {
@ -1100,7 +1100,7 @@ static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
u32 temp_r28;
Mtx sp8;
if (arg2 == 3 && GWGameStat.field10E_bit5 == 0) {
if (arg2 == 3 && GWGameStat.customPackEnable == 0) {
var_r27 = 1;
} else {
var_r27 = 2;

View file

@ -112,9 +112,9 @@ static inline void ResetFlag(GameStat *game_stat)
game_stat->story_continue = 0;
game_stat->party_continue = 0;
game_stat->open_w06 = 0;
game_stat->field10E_bit4 = 0;
game_stat->field10E_bit5 = 0;
game_stat->field10E_bit6 = 0;
game_stat->veryHardUnlock = 0;
game_stat->customPackEnable = 0;
game_stat->musicAllF = 0;
}
static inline void ResetPauseConfig(GameStat *game_stat)