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

This commit is contained in:
Marcus Huderle 2025-08-22 09:12:32 -05:00
parent ff916bd380
commit 8dc38fc8b1
5 changed files with 314 additions and 1268 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -445,7 +445,7 @@ extern void sub_1B140(s8);
//extern ? sub_1C544();
extern void sub_1C560(void);
extern void sub_1C5AC(void);
//extern ? sub_1C73C();
extern void sub_1C73C(void);
extern void sub_1C7F4(u16, u16);
extern void sub_1D128(void);
extern void sub_1D4D0(void);

View File

@ -313,7 +313,8 @@ struct PinballGame
/*0x281*/ s8 evolvablePartySize;
/*0x282*/ s8 unk282;
/*0x283*/ u8 numCompletedBonusStages;
/*0x284*/ u8 filler284[0x2];
/*0x284*/ s8 unk284;
/*0x285*/ u8 filler285[0x1];
/*0x286*/ s16 unk286;
/*0x288*/ s16 unk288;
/*0x28A*/ s16 unk28A;
@ -361,12 +362,12 @@ struct PinballGame
/*0x301*/ u8 unk301;
/*0x302*/ u8 filler302[0x4];
/*0x306*/ s8 unk306;
/*0x307*/ u8 filler307[0x1];
/*0x307*/ s8 unk307;
/*0x308*/ u16 unk308;
/*0x30A*/ u16 unk30A;
/*0x30C*/ u16 unk30C;
/*0x30E*/ s16 unk30E;
/*0x310*/ u16 unk310;
/*0x310*/ s16 unk310;
/*0x312*/ u8 filler312[0x2];
/*0x314*/ s16 unk314;
/*0x316*/ s16 unk316;

View File

@ -1,4 +1,16 @@
#include "global.h"
#include "m4a.h"
#include "main.h"
#include "constants/bg_music.h"
extern const s16 gUnknown_086AE45A[];
extern const s16 gUnknown_086AE3DC[][3];
extern const s8 gUnknown_08137CBC[][2];
extern const u8 gUnknown_084BB16C[][0x480];
extern const u16 gUnknown_086B3EF6[][4][3];
extern struct SongHeader gUnknown_086A11A4;
void sub_2E67C(void)
{
@ -10,3 +22,300 @@ void sub_2E67C(void)
gCurrentPinballGame->unk306 = 0;
}
}
void sub_2E6AC(void)
{
s16 i;
struct SpriteGroup *group = &gMain.spriteGroups[60];
struct OamDataSimple *oamSimple;
u16 *dst;
const u16 *src;
s16 var_sl;
s16 sp0;
s16 index;
var_sl = 0;
sp0 = 0;
switch (gCurrentPinballGame->unk306)
{
case 0:
gCurrentPinballGame->unk30E = 0;
var_sl = (gCurrentPinballGame->unk290 % 50) / 25;
gCurrentPinballGame->unk320 = 0;
gCurrentPinballGame->unk322 = 0;
break;
case 1:
var_sl = gUnknown_086AE45A[(gCurrentPinballGame->unk290 % 40) / 10];
gCurrentPinballGame->unk320 = 0;
gCurrentPinballGame->unk322 = 0;
gCurrentPinballGame->unk307 = 0;
gCurrentPinballGame->unk30A = 0;
if (gCurrentPinballGame->unk13 > 2)
{
gCurrentPinballGame->unk306 = 0;
var_sl = 0;
}
break;
case 2:
var_sl = 4;
break;
case 3:
if (gCurrentPinballGame->unk30C < 3)
{
if (gCurrentPinballGame->unk30C == 0)
{
gCurrentPinballGame->unk5F7 = 1;
gCurrentPinballGame->unk1F = 1;
gCurrentPinballGame->ball->velocity.x = 0;
gCurrentPinballGame->ball->velocity.y = 0;
gCurrentPinballGame->ball->unk6 = 0;
m4aSongNumStart(SE_UNKNOWN_0xE2);
sub_11B0(7);
gCurrentPinballGame->unk3C = 100000;
}
gCurrentPinballGame->ball->positionQ0.x = 156;
gCurrentPinballGame->ball->positionQ0.y = 121 + gCurrentPinballGame->unk30C * 2;
var_sl = 4;
}
else if (gCurrentPinballGame->unk30C < 23)
{
gCurrentPinballGame->ball->positionQ0.x = 157;
gCurrentPinballGame->ball->positionQ0.y = 134;
gCurrentPinballGame->ball->unk0 = 1;
var_sl = 5;
}
else
{
gCurrentPinballGame->unk306 = 4;
gCurrentPinballGame->unk30C = 0;
var_sl = 2;
}
gCurrentPinballGame->ball->positionQ1.x = gCurrentPinballGame->ball->positionQ0.x * 2;
gCurrentPinballGame->ball->positionQ1.y = gCurrentPinballGame->ball->positionQ0.y * 2;
gCurrentPinballGame->ball->positionQ8.x = gCurrentPinballGame->ball->positionQ0.x << 8;
gCurrentPinballGame->ball->positionQ8.y = gCurrentPinballGame->ball->positionQ0.y << 8;
gCurrentPinballGame->unk30C++;
gCurrentPinballGame->unk310 = 0;
break;
case 4:
if (gUnknown_086AE3DC[gCurrentPinballGame->unk307][2] > gCurrentPinballGame->unk30A)
{
gCurrentPinballGame->unk30A++;
}
else
{
gCurrentPinballGame->unk30A = 0;
gCurrentPinballGame->unk307++;
if (gCurrentPinballGame->unk307 == 21)
{
gCurrentPinballGame->unk307 = 20;
gCurrentPinballGame->unk306 = 5;
gCurrentPinballGame->unk30C = 0;
}
if (gCurrentPinballGame->unk307 == 1)
m4aSongNumStart(SE_UNKNOWN_0xE3);
}
sp0 = gUnknown_086AE3DC[gCurrentPinballGame->unk307][0];
var_sl = gUnknown_086AE3DC[gCurrentPinballGame->unk307][1];
if (gCurrentPinballGame->unk310++ % 35 == 34)
m4aSongNumStart(SE_UNKNOWN_0xE3);
break;
case 5:
if (gCurrentPinballGame->unk30C == 0)
{
gCurrentPinballGame->unk320 = -360;
gCurrentPinballGame->unk322 = -200;
}
index = (gCurrentPinballGame->unk30C % 26) / 2;
var_sl = gUnknown_08137CBC[index][0];
gCurrentPinballGame->unk30E = gUnknown_08137CBC[index][1] * 10;
gCurrentPinballGame->unk31C = -12;
gCurrentPinballGame->unk31E = -10;
gCurrentPinballGame->unk320 += gCurrentPinballGame->unk31C;
gCurrentPinballGame->unk322 += gCurrentPinballGame->unk31E;
gCurrentPinballGame->ball->positionQ0.x = gCurrentPinballGame->unk320 / 10 + 157;
gCurrentPinballGame->ball->positionQ0.y = gCurrentPinballGame->unk322 / 10 + 134;
gCurrentPinballGame->ball->positionQ1.x = gCurrentPinballGame->ball->positionQ0.x * 2;
gCurrentPinballGame->ball->positionQ1.y = gCurrentPinballGame->ball->positionQ0.y * 2;
gCurrentPinballGame->ball->positionQ8.x = gCurrentPinballGame->ball->positionQ0.x << 8;
gCurrentPinballGame->ball->positionQ8.y = gCurrentPinballGame->ball->positionQ0.y << 8;
gCurrentPinballGame->unk30C++;
if (gCurrentPinballGame->ball->positionQ0.y < -12)
{
if (gCurrentPinballGame->unk308 > 99)
{
gCurrentPinballGame->unk308 = 0;
gCurrentPinballGame->unk306 = 6;
gCurrentPinballGame->unk30C = 65;
m4aMPlayAllStop();
}
else
{
gCurrentPinballGame->unk30C = 0;
gCurrentPinballGame->unk306 = 7;
}
}
if (gCurrentPinballGame->unk310++ % 35 == 34)
m4aSongNumStart(SE_UNKNOWN_0xE3);
break;
case 6:
gCurrentPinballGame->unk1100 = 1;
var_sl = gUnknown_08137CBC[0][0];
if (gCurrentPinballGame->unk30C == 65)
{
m4aSongNumStart(SE_UNKNOWN_0x9F);
gMain.blendControl = 0x9E;
}
if (gCurrentPinballGame->unk30C)
{
gCurrentPinballGame->unk30C--;
gMain.blendBrightness = 16 - gCurrentPinballGame->unk30C / 4;
if (gCurrentPinballGame->unk30C == 0)
{
gCurrentPinballGame->unk284 = 7;
gCurrentPinballGame->unk282 = 2;
gCurrentPinballGame->unk73C = gCurrentPinballGame->unk72E;
gCurrentPinballGame->catchModeArrows = gCurrentPinballGame->unk72F;
sub_1C73C();
}
}
break;
case 7:
gCurrentPinballGame->unk320 = -1880;
gCurrentPinballGame->unk322 = -800;
gCurrentPinballGame->unk31C = 82;
gCurrentPinballGame->unk31E = 0;
gCurrentPinballGame->unk30C = 0;
gCurrentPinballGame->unk306 = 8;
var_sl = 13;
sp0 = 9;
break;
case 8:
var_sl = (gCurrentPinballGame->unk30C % 24) / 6 + 13;
gCurrentPinballGame->unk30E = (Sin(gCurrentPinballGame->unk30C * 0x400) * 240) / 20000;
if (gCurrentPinballGame->unk30C == 0)
m4aSongNumStart(SE_UNKNOWN_0xE4);
if (gCurrentPinballGame->unk30C < 40)
{
gCurrentPinballGame->unk320 += gCurrentPinballGame->unk31C;
gCurrentPinballGame->unk322 += gCurrentPinballGame->unk31E;
}
else if (gCurrentPinballGame->unk30C >= 70)
{
gCurrentPinballGame->unk30C = 0;
gCurrentPinballGame->unk306 = 9;
gCurrentPinballGame->unk320 = 1200;
gCurrentPinballGame->unk322 = -1000;
m4aSongNumStart(SE_UNKNOWN_0xE3);
gCurrentPinballGame->unk310 = 0;
}
if (gCurrentPinballGame->unk30C == 13)
{
gCurrentPinballGame->ball->unk0 = 0;
gCurrentPinballGame->unk314 = 5;
gCurrentPinballGame->unk316 = -25;
gCurrentPinballGame->unk318 = (gCurrentPinballGame->unk320 / 10 + 157) * 10;
gCurrentPinballGame->unk31A = (gCurrentPinballGame->unk322 / 10 + 134) * 10;
gCurrentPinballGame->ball->unk1 = 1;
}
if (gCurrentPinballGame->unk1F)
{
if (gCurrentPinballGame->unk30C < 13)
{
gCurrentPinballGame->ball->positionQ0.x = gCurrentPinballGame->unk320 / 10 + 157;
gCurrentPinballGame->ball->positionQ0.y = gCurrentPinballGame->unk322 / 10 + 134;
gCurrentPinballGame->ball->positionQ1.x = gCurrentPinballGame->ball->positionQ0.x * 2;
gCurrentPinballGame->ball->positionQ1.y = gCurrentPinballGame->ball->positionQ0.y * 2;
gCurrentPinballGame->ball->positionQ8.x = gCurrentPinballGame->ball->positionQ0.x << 8;
gCurrentPinballGame->ball->positionQ8.y = gCurrentPinballGame->ball->positionQ0.y << 8;
}
else
{
gCurrentPinballGame->unk316 += 2;
gCurrentPinballGame->unk318 += gCurrentPinballGame->unk314;
gCurrentPinballGame->unk31A += gCurrentPinballGame->unk316;
gCurrentPinballGame->ball->positionQ0.x = gCurrentPinballGame->unk318 / 10;
gCurrentPinballGame->ball->positionQ0.y = gCurrentPinballGame->unk31A / 10;
if (gCurrentPinballGame->ball->positionQ0.y >= 91)
{
gCurrentPinballGame->ball->positionQ0.y = 91;
gCurrentPinballGame->unk5F7 = 0;
gCurrentPinballGame->unk1F = 0;
gCurrentPinballGame->ball->velocity.x = 128;
gCurrentPinballGame->ball->velocity.y = 256;
gCurrentPinballGame->ball->unk1 = 3;
gCurrentPinballGame->unk24 = 0;
m4aSongNumStart(SE_UNKNOWN_0xE5);
sub_11B0(7);
}
gCurrentPinballGame->ball->positionQ1.x = gCurrentPinballGame->ball->positionQ0.x * 2;
gCurrentPinballGame->ball->positionQ1.y = gCurrentPinballGame->ball->positionQ0.y * 2;
gCurrentPinballGame->ball->positionQ8.x = gCurrentPinballGame->ball->positionQ0.x << 8;
gCurrentPinballGame->ball->positionQ8.y = gCurrentPinballGame->ball->positionQ0.y << 8;
}
}
sp0 = 9;
gCurrentPinballGame->unk30C++;
break;
case 9:
index = (gCurrentPinballGame->unk30C % 26) / 2;
var_sl = gUnknown_08137CBC[index][0] + 4;
gCurrentPinballGame->unk30E = gUnknown_08137CBC[index][1];
gCurrentPinballGame->unk31C = -12;
gCurrentPinballGame->unk31E = 10;
if (gCurrentPinballGame->unk30C < 100)
{
gCurrentPinballGame->unk320 += gCurrentPinballGame->unk31C;
gCurrentPinballGame->unk322 += gCurrentPinballGame->unk31E;
}
else
{
gCurrentPinballGame->unk30C = 0;
gCurrentPinballGame->unk306 = 10;
MPlayStart(&gMPlayInfo_SE1, &gUnknown_086A11A4);
}
if (gCurrentPinballGame->unk310++ % 35 == 34)
MPlayStart(&gMPlayInfo_SE1, &gUnknown_086A11A4);
gCurrentPinballGame->unk30C++;
break;
case 10:
gCurrentPinballGame->unk30E = 0;
gCurrentPinballGame->unk306 = 0;
gCurrentPinballGame->unk30C = 0;
var_sl = 0;
break;
}
if (group->available)
{
DmaCopy16(3, gUnknown_084BB16C[var_sl], (void *)0x060122A0, 0x480);
group->baseX = gCurrentPinballGame->unk320 / 10 + 146 - gCurrentPinballGame->unk58;
group->baseY = gCurrentPinballGame->unk322 / 10 + 110 - gCurrentPinballGame->unk5A + gCurrentPinballGame->unk30E / 10;
for (i = 0; i < 4; i++)
{
oamSimple = &group->oam[i];
dst = (u16*)&gOamBuffer[oamSimple->oamId];
src = gUnknown_086B3EF6[sp0][i];
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
gOamBuffer[oamSimple->oamId].x += group->baseX;
gOamBuffer[oamSimple->oamId].y += group->baseY;
}
}
}