sub_40288
Some checks are pending
CI / build (push) Waiting to run

This commit is contained in:
Marcus Huderle 2025-08-01 17:59:18 -05:00
parent 88be970282
commit 4c810c275e
6 changed files with 566 additions and 2362 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -610,8 +610,8 @@ extern void sub_3E5D0(void);
//extern ? sub_3EDF0();
//extern ? sub_3FAE0();
//extern ? sub_40288();
//extern ? sub_41580();
//extern ? sub_417F8();
extern void sub_41580(void);
extern void sub_417F8(void);
//extern ? sub_423D8();
//extern ? sub_42E48();
//extern ? sub_43228();

View File

@ -345,12 +345,13 @@ struct PinballGame
/*0x36E*/ u16 unk36E[0x2];
/*0x372*/ u8 filler372[0x11];
/*0x383*/ s8 unk383;
/*0x384*/ u8 unk384;
/*0x384*/ s8 unk384;
/*0x385*/ s8 unk385;
/*0x386*/ s8 unk386;
/*0x387*/ s8 unk387;
/*0x388*/ s8 unk388;
/*0x389*/ u8 filler389[0x3];
/*0x389*/ u8 filler389[0x1];
/*0x38A*/ s16 unk38A;
/*0x38C*/ s16 unk38C;
/*0x38E*/ u8 filler38E[0x4];
/*0x392*/ u16 unk392;
@ -415,17 +416,13 @@ struct PinballGame
/*0x438*/ struct Vector16 unk438;
/*0x43C*/ struct Vector16 unk43C;
/*0x440*/ u8 filler440[0x1];
/*0x441*/ s8 unk441;
/*0x442*/ s8 unk442;
/*0x441*/ s8 unk441[2];
/*0x443*/ u8 filler443[0xF];
/*0x452*/ u16 unk452;
/*0x454*/ u8 filler454[0x4];
/*0x458*/ s16 unk458;
/*0x45A*/ s16 unk45A;
/*0x45C*/ struct Vector16 unk45C;
/*0x460*/ struct Vector16 unk460;
/*0x464*/ struct Vector16 unk464;
/*0x468*/ struct Vector16 unk468;
/*0x458*/ u16 unk458[2];
/*0x45C*/ struct Vector16 unk45C[2];
/*0x464*/ struct Vector16 unk464[2];
/*0x46C*/ u8 filler46C[0x13];
/*0x47F*/ s8 unk47F;
/*0x480*/ u16 unk480;
@ -441,15 +438,22 @@ struct PinballGame
/*0x4D5*/ s8 unk4D5[3];
/*0x4D8*/ u8 filler4D8[0x20];
/*0x4F8*/ struct Vector16 unk4F8[3];
/*0x504*/ u8 filler504[0x2];
/*0x504*/ u8 filler504[0x1];
/*0x505*/ s8 unk505;
/*0x506*/ s8 unk506;
/*0x507*/ u8 filler507[0x1];
/*0x507*/ s8 unk507;
/*0x508*/ s16 unk508;
/*0x50A*/ u8 filler50A[0xA];
/*0x50A*/ u8 filler50A[0x4];
/*0x50E*/ u16 unk50E;
/*0x510*/ u16 unk510;
/*0x512*/ u8 filler512[0x2];
/*0x514*/ u16 unk514;
/*0x516*/ u16 unk516;
/*0x518*/ s16 unk518;
/*0x51A*/ u8 filler51A[0xE];
/*0x51A*/ u8 filler51A[0x2];
/*0x51C*/ struct Vector16 unk51C;
/*0x520*/ struct Vector16 unk520;
/*0x524*/ struct Vector16 unk524;
/*0x528*/ struct Vector16 unk528;
/*0x52C*/ s8 unk52C[2];
/*0x52E*/ s8 unk52E[2];
@ -537,7 +541,7 @@ struct PinballGame
/*0x6B4*/ u32 unk6B4;
/*0x6B8*/ u32 unk6B8;
/*0x6BC*/ u8 filler6BC[0x8];
/*0x6C4*/ u8 unk6C4;
/*0x6C4*/ s8 unk6C4;
/*0x6C5*/ u8 unk6C5; // TODO: unknown type
/*0x6C6*/ u8 unk6C6;
/*0x6C7*/ u8 unk6C7;
@ -546,7 +550,11 @@ struct PinballGame
/*0x6CA*/ u16 unk6CA;
/*0x6CC*/ u8 unk6CC;
/*0x6CD*/ u8 unk6CD[6];
/*0x6D3*/ u8 filler6D3[0x1B];
/*0x6D3*/ u8 filler6D3[0x8];
/*0x6DB*/ u8 unk6DB;
/*0x6DC*/ u8 filler6DC[0x8];
/*0x6E4*/ struct Vector16 unk6E4;
/*0x6E8*/ u8 filler6E8[0x6];
/*0x6EE*/ u16 unk6EE;
/*0x6F0*/ u8 filler6F0[0x1E];
/*0x70E*/ s8 unk70E;

View File

@ -10,6 +10,7 @@ void m4aSoundInit(void);
void m4aSoundMain(void);
void m4aSongNumStart(u16 n);
void m4aSongNumStartOrChange(u16 n);
void m4aSongNumStop(u16 n);
void m4aMPlayAllStop(void);
void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);

View File

@ -99,6 +99,10 @@ extern const u16 gUnknown_086AFB2C[][3];
extern const u8 gUnknown_084B046C[][0x120];
extern const u16 gUnknown_086B56D8[][4][3];
extern const u16 gUnknown_086B5D56[][2][3];
extern const u16 gUnknown_086B609E[][3][3];
extern const u16 gUnknown_086B5ECA[][6][3];
extern const u16 gUnknown_086B5DCE[][7][3];
extern const u16 gUnknown_086B5CC0[][5][3];
extern const u16 gUnknown_086AFAE2[][2];
extern const u16 gUnknown_086AFAE0[][2];
extern const u8 gUnknown_084B47EC[][0x800];
@ -107,6 +111,7 @@ extern const s16 gUnknown_086AF784[];
extern const struct Vector16 gUnknown_086AF744[32];
extern const s16 gUnknown_086AEF28[];
extern const s16 gUnknown_08137D48[];
extern const u8 gUnknown_084A6EEC[][0x280];
struct Unk_086AFAC0
{
@ -130,6 +135,524 @@ extern u8 gUnknown_0200FBB0[];
extern u8 gUnknown_020030A0[];
void sub_40288(void)
{
s16 sp0;
s16 sp4;
s16 sp8;
s16 i, j;
struct SpriteGroup *group;
struct Vector32 tempVector2;
struct Vector32 tempVector;
s16 var0;
int x, y;
int xx, yy;
int squaredMagnitude;
u16 *dst;
const u16 *src;
struct OamDataSimple *oamSimple;
sp8 = 0;
sp4 = 0;
var0 = 0;
sp0 = 0;
group = &gMain.spriteGroups[10];
if (group->available)
{
if (gCurrentPinballGame->unk6C4 == 3)
{
group->baseX = 240;
group->baseY = 180;
}
else
{
group->baseX = 96;
group->baseY = 55;
}
gCurrentPinballGame->unk6E4.x = group->baseX;
gCurrentPinballGame->unk6E4.y = group->baseY;
if (group->baseY >= 200)
group->baseY = 200;
for (j = 0; j < 6; j++)
{
oamSimple = &group->oam[j];
gOamBuffer[oamSimple->oamId].paletteNum = 13;
gOamBuffer[oamSimple->oamId].priority = gCurrentPinballGame->unk6DB;
gOamBuffer[oamSimple->oamId].x = oamSimple->xOffset + group->baseX;
gOamBuffer[oamSimple->oamId].y = oamSimple->yOffset + group->baseY;
}
group = &gMain.spriteGroups[9];
group->baseX = gCurrentPinballGame->unk6E4.x - 8;
group->baseY = gCurrentPinballGame->unk6E4.y - 8;
if (group->baseY >= 200)
group->baseY = 200;
for (j = 0; j < 6; j++)
{
oamSimple = &group->oam[j];
gOamBuffer[oamSimple->oamId].priority = gCurrentPinballGame->unk6DB;
gOamBuffer[oamSimple->oamId].x = oamSimple->xOffset + group->baseX;
gOamBuffer[oamSimple->oamId].y = oamSimple->yOffset + group->baseY;
}
}
sub_41580();
switch (gCurrentPinballGame->unk507)
{
case 0:
gCurrentPinballGame->unk510 = 0;
var0 = 7;
sp4 = 12;
sp8 = 5;
break;
case 1:
if (gCurrentPinballGame->unk510 == 0)
m4aSongNumStart(SE_UNKNOWN_0x128);
if (gCurrentPinballGame->unk510 == 8)
m4aSongNumStop(SE_UNKNOWN_0x128);
if (gCurrentPinballGame->unk510 == 24)
m4aSongNumStart(SE_UNKNOWN_0x128);
if (gCurrentPinballGame->unk510 == 36)
m4aSongNumStop(SE_UNKNOWN_0x128);
if (gCurrentPinballGame->unk510 == 50)
m4aSongNumStart(SE_UNKNOWN_0x128);
if (gCurrentPinballGame->unk510 == 56)
m4aSongNumStop(SE_UNKNOWN_0x128);
if (gCurrentPinballGame->unk510 < 14)
var0 = gCurrentPinballGame->unk510 / 2;
else if (gCurrentPinballGame->unk510 < 42)
var0 = 7;
else if (gCurrentPinballGame->unk510 < 56)
var0 = (gCurrentPinballGame->unk510 - 42) / 2;
else if (gCurrentPinballGame->unk510 < 61)
var0 = 7;
else
var0 = (gCurrentPinballGame->unk510 - 61) / 2;
if (gCurrentPinballGame->unk510 < 8)
sp4 = gCurrentPinballGame->unk510 / 2;
else if (gCurrentPinballGame->unk510 < 48)
sp4 = 12;
else if (gCurrentPinballGame->unk510 < 64)
sp4 = (gCurrentPinballGame->unk510 - 48) / 2 + 4;
else
sp4 = 12;
sp8 = 5;
gCurrentPinballGame->unk510++;
if (gCurrentPinballGame->unk510 == 75)
{
gCurrentPinballGame->unk510 = 0;
gCurrentPinballGame->unk507 = 2;
}
break;
case 2:
var0 = 7;
sp4 = 12;
sp8 = 5;
if (gCurrentPinballGame->unk510 < 34)
{
gCurrentPinballGame->unk510++;
if (gCurrentPinballGame->unk510 == 28)
{
if (gCurrentPinballGame->unk388)
{
gCurrentPinballGame->unk51C.x = 200 - (Random() % 160);
gCurrentPinballGame->unk51C.y = gCurrentPinballGame->ball->positionQ0.y - 347 - (Random() % 80);
}
else
{
gCurrentPinballGame->unk51C.x = gCurrentPinballGame->ball->positionQ0.x - 13;
gCurrentPinballGame->unk51C.y = gCurrentPinballGame->ball->positionQ0.y - 347;
}
}
}
else
{
gCurrentPinballGame->unk510 = 0;
gCurrentPinballGame->unk507 = 3;
m4aSongNumStart(SE_UNKNOWN_0x129);
}
break;
case 3:
var0 = 7;
sp4 = 12;
if (gCurrentPinballGame->unk510 < 2)
{
sp8 = gCurrentPinballGame->unk510;
}
else if (gCurrentPinballGame->unk510 < 10)
{
sp8 = (gCurrentPinballGame->unk510 - 2) / 2 + 2;
gCurrentPinballGame->unk508 = sp4;
if (sp8 == 2)
{
int a = 13;
int b = 347;
tempVector.x = gCurrentPinballGame->ball->positionQ0.x - a - gCurrentPinballGame->unk51C.x;
tempVector.y = gCurrentPinballGame->ball->positionQ0.y - b - gCurrentPinballGame->unk51C.y;
xx = tempVector.x * tempVector.x;
yy = tempVector.y * tempVector.y;
squaredMagnitude = xx + yy;
sub_11B0(8);
if (gCurrentPinballGame->unk441[0] < 3 && gCurrentPinballGame->unk441[1] < 3 &&
gCurrentPinballGame->unk388 == 0 && squaredMagnitude < 200)
{
gMain.spriteGroups[36].available = 1;
gCurrentPinballGame->unk486 = 600;
m4aSongNumStart(SE_UNKNOWN_0x12A);
sub_11B0(9);
}
}
}
else
{
sp8 = 5;
gCurrentPinballGame->unk507 = 4;
}
gCurrentPinballGame->unk510++;
break;
case 4:
gCurrentPinballGame->unk510 = 0;
gCurrentPinballGame->unk507 = 0;
break;
}
group = &gMain.spriteGroups[17];
if (group->available)
{
// ! odd behavior in the assembly with the addition and subtraction
group->baseX = gCurrentPinballGame->unk3E8 / 10 - (gCurrentPinballGame->unk58 - 88);
group->baseY = gCurrentPinballGame->unk3EA / 10 - gCurrentPinballGame->unk5A + 96;
for (j = 0; j < 3; j++)
{
oamSimple = &group->oam[j];
dst = (u16*)&gOamBuffer[oamSimple->oamId];
src = gUnknown_086B609E[var0][j];
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
gOamBuffer[oamSimple->oamId].x += group->baseX;
gOamBuffer[oamSimple->oamId].y += group->baseY;
}
if (gCurrentPinballGame->unk507 == 4)
gMain.spriteGroups[17].available = 0;
}
group = &gMain.spriteGroups[18];
if (group->available)
{
group->baseX = gCurrentPinballGame->unk3E8 / 10 - (gCurrentPinballGame->unk58 - 88);
group->baseY = gCurrentPinballGame->unk3EA / 10 - gCurrentPinballGame->unk5A + 96;
for (j = 0; j < 6; j++)
{
oamSimple = &group->oam[j];
dst = (u16*)&gOamBuffer[oamSimple->oamId];
src = gUnknown_086B5ECA[sp4][j];
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
gOamBuffer[oamSimple->oamId].x += group->baseX;
gOamBuffer[oamSimple->oamId].y += group->baseY;
}
if (gCurrentPinballGame->unk507 == 4)
gMain.spriteGroups[18].available = 0;
}
group = &gMain.spriteGroups[19];
if (group->available)
{
group->baseX = gCurrentPinballGame->unk51C.x - gCurrentPinballGame->unk58;
group->baseY = gCurrentPinballGame->unk51C.y - gCurrentPinballGame->unk5A;
for (j = 0; j < 7; j++)
{
oamSimple = &group->oam[j];
dst = (u16*)&gOamBuffer[oamSimple->oamId];
src = gUnknown_086B5DCE[sp8][j];
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
if ((s8)gOamBuffer[oamSimple->oamId].y + group->baseY < -300)
{
gOamBuffer[oamSimple->oamId].x = 0;
gOamBuffer[oamSimple->oamId].y = 180;
}
else
{
gOamBuffer[oamSimple->oamId].x += group->baseX;
gOamBuffer[oamSimple->oamId].y += group->baseY;
}
}
if (gCurrentPinballGame->unk507 == 4)
gMain.spriteGroups[19].available = 0;
}
group = &gMain.spriteGroups[22];
if (group->available)
{
group->baseX = gCurrentPinballGame->unk524.x / 10 - (gCurrentPinballGame->unk58 + 120);
group->baseY = gCurrentPinballGame->unk524.y / 10 - (gCurrentPinballGame->unk5A - 128);
for (j = 0; j < 18; j++)
{
oamSimple = &group->oam[j];
gOamBuffer[oamSimple->oamId].x = oamSimple->xOffset + group->baseX;
gOamBuffer[oamSimple->oamId].y = oamSimple->yOffset + group->baseY;
}
}
group = &gMain.spriteGroups[23];
if (group->available)
{
group->baseX = gCurrentPinballGame->unk524.x / 10 - (gCurrentPinballGame->unk58 - 360);
group->baseY = gCurrentPinballGame->unk524.y / 10 - (gCurrentPinballGame->unk5A - 128);
for (j = 0; j < 18; j++)
{
oamSimple = &group->oam[j];
gOamBuffer[oamSimple->oamId].x = oamSimple->xOffset + group->baseX;
gOamBuffer[oamSimple->oamId].y = oamSimple->yOffset + group->baseY;
}
}
if (gCurrentPinballGame->unk38C > 0)
gCurrentPinballGame->ball->unk1 = 1;
else
gCurrentPinballGame->ball->unk1 = 2;
for (i = 0; i < 2; i++)
{
group = &gMain.spriteGroups[15 + i];
switch (gCurrentPinballGame->unk441[i])
{
case 0:
sp0 = 0;
gCurrentPinballGame->unk45C[i].x = 0;
gCurrentPinballGame->unk45C[i].y = 0;
break;
case 1:
sp0 = gCurrentPinballGame->unk458[i] / 5 + 1;
if (gCurrentPinballGame->unk458[i] < 14)
{
gCurrentPinballGame->unk458[i]++;
}
else
{
gCurrentPinballGame->unk458[i] = 0;
gCurrentPinballGame->unk441[i] = 2;
}
break;
case 2:
sp0 = gCurrentPinballGame->unk458[i] % 16;
if (sp0 < 4)
sp0 = 4;
else if (sp0 < 10)
sp0 = 5;
else
sp0 = 6;
if (gCurrentPinballGame->unk441[i] < 3)
{
s16 angle = (((gMain.systemFrameCount + 120 * i) % 240) << 0x10) / 240;
gCurrentPinballGame->unk45C[i].x = gCurrentPinballGame->unk464[i].x + (Cos(angle) * 4) / 2000;
gCurrentPinballGame->unk45C[i].y = gCurrentPinballGame->unk464[i].y + (Sin(angle) * 4) / 2000;
tempVector.x = gCurrentPinballGame->ball->positionQ0.x - (gCurrentPinballGame->unk45C[i].x / 10) - 16;
tempVector.y = gCurrentPinballGame->ball->positionQ0.y - (gCurrentPinballGame->unk45C[i].y / 10) - 32;;
xx = tempVector.x * tempVector.x;
yy = tempVector.y * tempVector.y;
squaredMagnitude = xx + yy;
if (gCurrentPinballGame->unk383 == 0 && gCurrentPinballGame->unk388 == 0 &&
gCurrentPinballGame->unk385 < gCurrentPinballGame->unk384 &&
gCurrentPinballGame->unk452 == 0 && squaredMagnitude < 300)
{
gCurrentPinballGame->unk486 = 6;
gCurrentPinballGame->unk1F = 1;
gCurrentPinballGame->unk458[i] = 0;
gCurrentPinballGame->unk441[i] = 3;
gCurrentPinballGame->unk5FA = 1;
tempVector2.x = gCurrentPinballGame->unk45C[i].x / 10 + 16;
tempVector2.y = gCurrentPinballGame->unk45C[i].y / 10 + 32;
tempVector.x = (tempVector2.x << 8) - gCurrentPinballGame->ball->positionQ8.x;
tempVector.y = (tempVector2.y << 8) - gCurrentPinballGame->ball->positionQ8.y;
gCurrentPinballGame->unk5AC = (tempVector.x * tempVector.x) + (tempVector.y * tempVector.y);
gCurrentPinballGame->unk5AC = Sqrt(gCurrentPinballGame->unk5AC * 4) / 2;
gCurrentPinballGame->unk5B0 = ArcTan2(-tempVector.x, tempVector.y);
gCurrentPinballGame->unk505 = i + 1;
gCurrentPinballGame->unk520.x = gCurrentPinballGame->unk45C[i].x;
gCurrentPinballGame->unk520.y = gCurrentPinballGame->unk45C[i].y;
m4aSongNumStart(SE_UNKNOWN_0x12B);
sub_11B0(13);
}
}
if (gCurrentPinballGame->unk458[i] < 840)
{
gCurrentPinballGame->unk458[i]++;
}
else
{
gCurrentPinballGame->unk458[i] = 0;
gCurrentPinballGame->unk441[i] = 5;
}
break;
case 3: {
s16 var4;
int var5;
sp0 = gCurrentPinballGame->unk458[i] % 16;
if (sp0 < 4)
sp0 = 4;
else if (sp0 < 10)
sp0 = 5;
else
sp0 = 6;
var4 = 29 - gCurrentPinballGame->unk458[i];
if (var4 < 10)
var4 = 10;
gCurrentPinballGame->unk5B0 -= ((0x2000 - (var4 * 0x2000) / 30) * 2) / 5;
gCurrentPinballGame->ball->unkA -= 0x2000;
var5 = (gCurrentPinballGame->unk5AC * var4) / 30;
tempVector2.x = gCurrentPinballGame->unk45C[i].x / 10 + 16;
tempVector2.y = gCurrentPinballGame->unk45C[i].y / 10 + 32;
gCurrentPinballGame->ball->positionQ8.x = (tempVector2.x << 8) + ((Cos(gCurrentPinballGame->unk5B0) * var5) / 20000);
gCurrentPinballGame->ball->positionQ8.y = (tempVector2.y << 8) - ((Sin(gCurrentPinballGame->unk5B0) * var5) / 20000);
gCurrentPinballGame->ball->velocity.x = (gCurrentPinballGame->ball->velocity.x * 4) / 5;
gCurrentPinballGame->ball->velocity.y = (gCurrentPinballGame->ball->velocity.y * 4) / 5;
if (gCurrentPinballGame->unk38C < 1800)
{
gCurrentPinballGame->unk38A = 0;
gCurrentPinballGame->unk38C += 32;
}
if (gCurrentPinballGame->unk458[i] < 180)
{
gCurrentPinballGame->unk458[i]++;
}
else
{
gCurrentPinballGame->unk458[i] = 0;
gCurrentPinballGame->unk441[i] = 4;
gCurrentPinballGame->unk5AC /= 2;
gCurrentPinballGame->ball->positionQ8.y = 0xA500;
}
break;
}
case 4:
if (gCurrentPinballGame->unk458[i] < 130)
{
if (gCurrentPinballGame->unk458[i] == 10)
m4aSongNumStart(SE_UNKNOWN_0x12C);
gCurrentPinballGame->unk38A--;
gCurrentPinballGame->unk38C += gCurrentPinballGame->unk38A;
if (gCurrentPinballGame->unk38C <= 0)
{
gCurrentPinballGame->unk38C = 0;
gCurrentPinballGame->ball->velocity.y = -((gCurrentPinballGame->unk38A * 0x80) / 10) / 2;
gCurrentPinballGame->unk1F = 0;
gCurrentPinballGame->unk458[i] = 0;
gCurrentPinballGame->ball->velocity.x = 0;
gCurrentPinballGame->unk441[i] = 0;
gCurrentPinballGame->unk5FA = 0;
sub_11B0(8);
}
gCurrentPinballGame->unk458[i]++;
}
break;
case 5:
sp0 = gCurrentPinballGame->unk458[i] / 6 + 7;
if (gCurrentPinballGame->unk458[i] < 11)
{
gCurrentPinballGame->unk458[i]++;
}
else
{
gCurrentPinballGame->unk458[i] = 0;
gCurrentPinballGame->unk441[i] = 0;
}
break;
}
if (group->available)
{
DmaCopy16(3, gUnknown_084A6EEC[sp0], (void *)0x06011EA0, 0x280);
group->baseX = gCurrentPinballGame->unk45C[i].x / 10 - gCurrentPinballGame->unk58;
group->baseY = gCurrentPinballGame->unk45C[i].y / 10 - gCurrentPinballGame->unk5A;
for (j = 0; j < 2; j++)
{
oamSimple = &group->oam[j];
gOamBuffer[oamSimple->oamId].x = oamSimple->xOffset + group->baseX;
gOamBuffer[oamSimple->oamId].y = oamSimple->yOffset + group->baseY;
}
if (gCurrentPinballGame->unk441[i] == 0)
group->available = 0;
if (gCurrentPinballGame->unk505 && i == (gCurrentPinballGame->unk505 - 1))
group->available = 0;
}
}
sub_417F8();
group = &gMain.spriteGroups[20];
if (group->available)
{
s16 a;
group->baseX = gCurrentPinballGame->unk520.x / 10 - gCurrentPinballGame->unk58;
group->baseY = gCurrentPinballGame->unk520.y / 10 - gCurrentPinballGame->unk5A;
a = gCurrentPinballGame->unk50E / 5;
for (j = 0; j < 5; j++)
{
oamSimple = &group->oam[j];
dst = (u16*)&gOamBuffer[oamSimple->oamId];
src = gUnknown_086B5CC0[a][j];
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
gOamBuffer[oamSimple->oamId].x += group->baseX;
gOamBuffer[oamSimple->oamId].y += group->baseY;
}
if (gCurrentPinballGame->unk50E < 25)
{
gCurrentPinballGame->unk50E++;
if (gCurrentPinballGame->unk50E == 25)
group->available = 0;
}
}
if (gCurrentPinballGame->unk505)
{
gCurrentPinballGame->unk505 = 0;
gCurrentPinballGame->unk50E = 0;
group->available = 1;
}
}
void sub_41580(void)
{
s16 i;
@ -375,7 +898,7 @@ void sub_417F8(void)
gMain.spriteGroups[25].available = 0;
gMain.spriteGroups[26].available = 1;
gMain.spriteGroups[27].available = 1;
if (gCurrentPinballGame->unk441 < 3 && gCurrentPinballGame->unk442 < 3 && gCurrentPinballGame->unk388 == 0)
if (gCurrentPinballGame->unk441[0] < 3 && gCurrentPinballGame->unk441[1] < 3 && gCurrentPinballGame->unk388 == 0)
{
gCurrentPinballGame->ball->velocity.x += 500;
sub_11B0(13);
@ -404,7 +927,7 @@ void sub_417F8(void)
gMain.spriteGroups[31].available = 0;
gMain.spriteGroups[32].available = 1;
gMain.spriteGroups[33].available = 1;
if (gCurrentPinballGame->unk441 < 3 && gCurrentPinballGame->unk442 < 3 && gCurrentPinballGame->unk388 == 0)
if (gCurrentPinballGame->unk441[0] < 3 && gCurrentPinballGame->unk441[1] < 3 && gCurrentPinballGame->unk388 == 0)
{
gCurrentPinballGame->ball->velocity.x -= 500;
sub_11B0(13);
@ -428,34 +951,34 @@ void sub_417F8(void)
if (gCurrentPinballGame->unk514 == 10)
{
if (gCurrentPinballGame->unk441 < 3)
if (gCurrentPinballGame->unk441[0] < 3)
{
gCurrentPinballGame->unk458 = 0;
gCurrentPinballGame->unk441 = 1;
gCurrentPinballGame->unk458[0] = 0;
gCurrentPinballGame->unk441[0] = 1;
gMain.spriteGroups[15].available = 1;
rand = Random() % 8;
var0 = ((gMain.systemFrameCount % 240) << 0x10) / 240;
gCurrentPinballGame->unk464.x = gUnknown_086AF744[rand].x;
gCurrentPinballGame->unk464.y = gUnknown_086AF744[rand].y;
gCurrentPinballGame->unk45C.x = gCurrentPinballGame->unk464.x + (Cos(var0) * 4) / 2000;
gCurrentPinballGame->unk45C.y = gCurrentPinballGame->unk464.y + (Sin(var0) * 4) / 2000;
gCurrentPinballGame->unk464[0].x = gUnknown_086AF744[rand].x;
gCurrentPinballGame->unk464[0].y = gUnknown_086AF744[rand].y;
gCurrentPinballGame->unk45C[0].x = gCurrentPinballGame->unk464[0].x + (Cos(var0) * 4) / 2000;
gCurrentPinballGame->unk45C[0].y = gCurrentPinballGame->unk464[0].y + (Sin(var0) * 4) / 2000;
m4aSongNumStart(SE_UNKNOWN_0x12D);
}
}
if (gCurrentPinballGame->unk514 == 16)
{
if (gCurrentPinballGame->unk442 < 3)
if (gCurrentPinballGame->unk441[1] < 3)
{
gCurrentPinballGame->unk45A = 0;
gCurrentPinballGame->unk442 = 1;
gCurrentPinballGame->unk458[1] = 0;
gCurrentPinballGame->unk441[1] = 1;
gMain.spriteGroups[16].available = 1;
rand = (Random() % 8 + 8) % 32; // Force 8 to be added to r1
var0 = (((gMain.systemFrameCount + 120) % 240) << 0x10) / 240;
gCurrentPinballGame->unk468.x = gUnknown_086AF744[rand].x;
gCurrentPinballGame->unk468.y = gUnknown_086AF744[rand].y;
gCurrentPinballGame->unk460.x = gCurrentPinballGame->unk468.x + (Cos(var0) * 4) / 2000;
gCurrentPinballGame->unk460.y = gCurrentPinballGame->unk468.y + (Sin(var0) * 4) / 2000;
gCurrentPinballGame->unk464[1].x = gUnknown_086AF744[rand].x;
gCurrentPinballGame->unk464[1].y = gUnknown_086AF744[rand].y;
gCurrentPinballGame->unk45C[1].x = gCurrentPinballGame->unk464[1].x + (Cos(var0) * 4) / 2000;
gCurrentPinballGame->unk45C[1].y = gCurrentPinballGame->unk464[1].y + (Sin(var0) * 4) / 2000;
m4aSongNumStart(SE_UNKNOWN_0x12D);
}
}