mirror of
https://github.com/pret/pokepinballrs.git
synced 2026-04-26 08:49:23 -05:00
2855 lines
85 KiB
C
2855 lines
85 KiB
C
#include "global.h"
|
|
#include "main.h"
|
|
#include "m4a.h"
|
|
#include "constants/bg_music.h"
|
|
|
|
extern const u16 gUnknown_08254B10[];
|
|
extern const u16 gUnknown_08257390[];
|
|
extern const u16 gUnknown_08259C10[];
|
|
|
|
extern struct SongHeader gUnknown_0869FC0C;
|
|
extern u16 gUnknown_086ACE70[];
|
|
|
|
|
|
s16 COLLISION_CHECK_RUBY_14E08(struct Vector16 *arg0, u16* arg1) {
|
|
struct Vector16 vec1;
|
|
struct Vector16 vec2;
|
|
u16 sp00;
|
|
u8 sp02;
|
|
u16 return_val;
|
|
s16 unk0;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
|
|
u32 some_enum;
|
|
u32 switch_enum;
|
|
|
|
return_val = 0;
|
|
gCurrentPinballGame->ball->unk4 = 0;
|
|
|
|
vec1.x = arg0->x / 8;
|
|
vec1.y = arg0->y / 8;
|
|
vec2.x = arg0->x % 8;
|
|
vec2.y = arg0->y % 8;
|
|
unk1 = vec1.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
vec1.y %= 64;
|
|
|
|
unk0 = gUnknown_02031520.unk14.unk38[unk2 + unk1][vec1.y * 64 + vec1.x];
|
|
sp00 = gUnknown_02031520.unk14.unk48[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
sp02 = gUnknown_02031520.unk14.unk58[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
|
|
sub_15054(arg0, &sp00, &sp02);
|
|
|
|
switch_enum = sp02 & 0xF;
|
|
some_enum = sp02 >> 4;
|
|
|
|
switch (switch_enum-1) {
|
|
case 0:
|
|
case 3:
|
|
case 5:
|
|
gCurrentPinballGame->unk23 = (switch_enum - 1);
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp00;
|
|
|
|
if (*arg1 >= 0x3FF0 && *arg1 <= 0x4010)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < gUnknown_02031520.unk14.unk26 - 8 ||
|
|
gCurrentPinballGame->ball->positionQ0.y < gUnknown_02031520.unk14.unk28 - 8)
|
|
{
|
|
|
|
if (gCurrentPinballGame->ball->unk6 > 0)
|
|
{
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else if (gCurrentPinballGame->ball->unk6 != 0)
|
|
{
|
|
*arg1 = 0x4100;
|
|
}
|
|
else
|
|
{
|
|
if (gMain.systemFrameCount & 1)
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 0x28;
|
|
gCurrentPinballGame->ball->unk6 = 1;
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 0xFFD8;
|
|
gCurrentPinballGame->ball->unk6 = 0xFFFF;
|
|
*arg1 = 0x4100;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return_val = 1;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg1 = sp00 & 0x0000FFF0;
|
|
return_val = 1;
|
|
|
|
break;
|
|
case 4:
|
|
gCurrentPinballGame->unk2A2 = 2;
|
|
gCurrentPinballGame->unk1F = 1;
|
|
some_enum = 0;
|
|
break;
|
|
}
|
|
sub_153CC((s32) some_enum, &return_val, arg1);
|
|
|
|
return return_val;
|
|
}
|
|
|
|
|
|
void sub_15054(struct Vector16* arg0, u16* arg1, u8* arg2)
|
|
{
|
|
s16 deltaX;
|
|
s16 deltaY;
|
|
u16 maskedResult;
|
|
u8 lowerNibble;
|
|
s32 ix;
|
|
|
|
maskedResult = 0;
|
|
lowerNibble = 0;
|
|
ix = 0;
|
|
|
|
if (gCurrentPinballGame->unk5B2 == 0)
|
|
{
|
|
if (gCurrentPinballGame->unk24 != 0)
|
|
return;
|
|
|
|
if (gCurrentPinballGame->unk2A4 != 0)
|
|
{
|
|
if (gCurrentPinballGame->unk2A3 == 0)
|
|
return;
|
|
|
|
deltaX = arg0->x + gCurrentPinballGame->unk184[0].x;
|
|
deltaY = arg0->y + gCurrentPinballGame->unk184[0].y;
|
|
|
|
if (deltaX > 79U)
|
|
return;
|
|
|
|
if (deltaY > 87U)
|
|
return;
|
|
|
|
maskedResult = 0xFFF0 & gUnknown_08259C10[(deltaY * 80) + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08259C10[(deltaY * 80) + deltaX];
|
|
|
|
if (lowerNibble == 0)
|
|
return;
|
|
|
|
*arg1 = maskedResult;
|
|
|
|
if (gCurrentPinballGame->unk2A2 <= 1)
|
|
{
|
|
*arg2 = lowerNibble;
|
|
gCurrentPinballGame->unk2A2 = 7;
|
|
return;
|
|
}
|
|
|
|
*arg2 = 1;
|
|
return;
|
|
}
|
|
|
|
if (0xF & *arg2)
|
|
return;
|
|
|
|
deltaX = arg0->x + (u16) gCurrentPinballGame->unk184[0].x;
|
|
deltaY = arg0->y + (u16) gCurrentPinballGame->unk184[0].y;
|
|
|
|
if (deltaX <= 63U && deltaY <= 63U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
|
|
if (lowerNibble != 0)
|
|
ix = 0;
|
|
}
|
|
|
|
if (lowerNibble == 0)
|
|
{
|
|
deltaX = gCurrentPinballGame->unk184[1].x + arg0->x;
|
|
deltaY = gCurrentPinballGame->unk184[1].y + arg0->y;
|
|
|
|
if (deltaX <= 63U && deltaY <= 63U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
if (lowerNibble != 0)
|
|
ix = 1;
|
|
}
|
|
|
|
if (lowerNibble == 0)
|
|
{
|
|
deltaX = gCurrentPinballGame->unk184[2].x + arg0->x;
|
|
deltaY = gCurrentPinballGame->unk184[2].y + arg0->y;
|
|
|
|
if (deltaX <= 63U && deltaY <= 63U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
|
|
if (lowerNibble == 0)
|
|
return;
|
|
|
|
ix = 2;
|
|
}
|
|
|
|
if (lowerNibble == 0)
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk16F == 0)
|
|
gCurrentPinballGame->unk170[ix] = 107;
|
|
|
|
*arg1 = maskedResult;
|
|
*arg2 = lowerNibble;
|
|
|
|
if (gCurrentPinballGame->unk624 > 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk624 = 2;
|
|
}
|
|
else
|
|
{
|
|
if ((*arg2 & 0xF) == 0)
|
|
{
|
|
if (gCurrentPinballGame->unk2E5[0] > 0)
|
|
{
|
|
s16 deltaY_alt;
|
|
deltaX = 2 * (-24 -gCurrentPinballGame->unk2EC[0]) + arg0->x;
|
|
deltaY_alt = arg0->y -580;
|
|
|
|
if (deltaX <= 71U && deltaY_alt <= 71U)
|
|
{
|
|
*arg1 = 0xFFF0 & gUnknown_08254B10[(deltaY_alt * 72) + deltaX];
|
|
*arg2 = 0xF & gUnknown_08254B10[(deltaY_alt * 72) + deltaX];
|
|
|
|
if (*arg2 & 1)
|
|
{
|
|
gCurrentPinballGame->unk2E2 = 1;
|
|
*arg2 = 6;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk2E5[1] > 0)
|
|
{
|
|
deltaX = ((gCurrentPinballGame->unk2EC[1] - 180) * 2) + arg0->x;
|
|
deltaY = arg0->y -580;
|
|
|
|
if (deltaX <= 71U && deltaY <= 71U)
|
|
{
|
|
*arg1 = 0xFFF0 & gUnknown_08257390[(deltaY * 72) + deltaX];
|
|
*arg2 = 0xF & gUnknown_08257390[(deltaY * 72) + deltaX];
|
|
|
|
if (*arg2 & 1)
|
|
{
|
|
gCurrentPinballGame->unk2E2 = 2;
|
|
*arg2 = 6;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_153CC(s32 arg0, s16* arg1, u16* arg2)
|
|
{
|
|
s16 absVelY;
|
|
|
|
switch ((u8)arg0 - 1)
|
|
{
|
|
case 0:
|
|
if (gCurrentPinballGame->unk26 == 0)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ1.x > 359)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ1.y > 199)
|
|
gCurrentPinballGame->unk25 = 1;
|
|
else
|
|
gCurrentPinballGame->unk25 = 3;
|
|
}
|
|
else
|
|
gCurrentPinballGame->unk25= 2;
|
|
|
|
sub_1A98C();
|
|
gCurrentPinballGame->unk22 = 7;
|
|
*arg1 = 1;
|
|
return;
|
|
}
|
|
default:
|
|
return;
|
|
case 1:
|
|
if (gCurrentPinballGame->unk24 == 0)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 2;
|
|
gCurrentPinballGame->unk24 = 2;
|
|
break;
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk24 == 2)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 2;
|
|
gCurrentPinballGame->unk24 = 3;
|
|
}
|
|
|
|
break;
|
|
case 2:
|
|
if (gCurrentPinballGame->unk24 == 2)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 3;
|
|
gCurrentPinballGame->unk24 = 0;
|
|
}
|
|
else if (gCurrentPinballGame->unk24 == 3)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 2;
|
|
gCurrentPinballGame->unk24 = 2;
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk2FB == 6)
|
|
gCurrentPinballGame->unk2FB = 7;
|
|
|
|
if (gCurrentPinballGame->unk2F0 & 0xF0 )
|
|
gCurrentPinballGame->unk2F0 = 0;
|
|
|
|
if (gCurrentPinballGame->unk1AB & 0xF0)
|
|
gCurrentPinballGame->unk1AB = 0;
|
|
|
|
break;
|
|
case 3:
|
|
if (gCurrentPinballGame->unk600 == 0)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x > 131)
|
|
{
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
|
|
if (gCurrentPinballGame->unk70E <= 98)
|
|
gCurrentPinballGame->unk70E++;
|
|
}
|
|
else if (gCurrentPinballGame->ball->positionQ0.x > 91)
|
|
{
|
|
gCurrentPinballGame->unk3C = 2000;
|
|
gCurrentPinballGame->unk174 = 0;
|
|
gCurrentPinballGame->unk16F = 1;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
|
|
if (gCurrentPinballGame->unk2B2 == 0)
|
|
{
|
|
gCurrentPinballGame->unk2B2 = 1;
|
|
gCurrentPinballGame->unk2B0 = 0;
|
|
}
|
|
}
|
|
gCurrentPinballGame->unk600 = 45;
|
|
|
|
m4aSongNumStart(SE_UNKNOWN_0x76);
|
|
}
|
|
break;
|
|
case 4:
|
|
gCurrentPinballGame->unk20 = 1;
|
|
gCurrentPinballGame->unk165 = 1;
|
|
gCurrentPinballGame->unk732 = 0;
|
|
return;
|
|
case 5:
|
|
if (gCurrentPinballGame->unk5B2 == 0)
|
|
{
|
|
sub_46FD4(1);
|
|
gCurrentPinballGame->unk29E = 1;
|
|
}
|
|
break;
|
|
case 6:
|
|
if (gCurrentPinballGame->ball->positionQ0.x < 50)
|
|
{
|
|
if (gCurrentPinballGame->unk2FA == 0)
|
|
{
|
|
gCurrentPinballGame->unk2FA = 1;
|
|
gCurrentPinballGame->unk2FB = 1;
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xB000;
|
|
*arg1 = 1;
|
|
}
|
|
}
|
|
else if (gCurrentPinballGame->unk2FA == 1)
|
|
{
|
|
gCurrentPinballGame->unk2FA = 2;
|
|
gCurrentPinballGame->unk2FB = 3;
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xA000;
|
|
*arg1 = 1;
|
|
gCurrentPinballGame->ball->velocity.x = 0;
|
|
gCurrentPinballGame->ball->velocity.y = 0;
|
|
|
|
memcpy(&gCurrentPinballGame->unk1334[1], gCurrentPinballGame->unk1334, 0x44U);
|
|
|
|
gCurrentPinballGame->unk1330 = &gCurrentPinballGame->unk1334[1];
|
|
gCurrentPinballGame->unk1328 = 120;
|
|
}
|
|
|
|
gCurrentPinballGame->unk732 = 14;
|
|
return;
|
|
case 7:
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 50)
|
|
{
|
|
if (gCurrentPinballGame->unk732 == 8)
|
|
{
|
|
if (gCurrentPinballGame->unk13 <= 2 && gCurrentPinballGame->unk72E <= 2)
|
|
{
|
|
if (gCurrentPinballGame->unk72E == 0)
|
|
gCurrentPinballGame->unk3C = 2000;
|
|
else if (gCurrentPinballGame->unk72E == 1)
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
else
|
|
gCurrentPinballGame->unk3C = 10000;
|
|
|
|
gCurrentPinballGame->unk72E++;
|
|
|
|
m4aSongNumStart(SE_UNKNOWN_0x99);
|
|
}
|
|
|
|
gCurrentPinballGame->unk6BC = 1;
|
|
}
|
|
gCurrentPinballGame->unk732 = 2;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 100)
|
|
{
|
|
if (gCurrentPinballGame->unk732 == 7)
|
|
{
|
|
gCurrentPinballGame->unk194 = 10;
|
|
|
|
if(gCurrentPinballGame->unk72B <= 2)
|
|
{
|
|
if(gCurrentPinballGame->unk72B == 0)
|
|
{
|
|
gCurrentPinballGame->unk3C = 2000;
|
|
gCurrentPinballGame->unk194 = 1;
|
|
}
|
|
else if(gCurrentPinballGame->unk72B == 1)
|
|
{
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
gCurrentPinballGame->unk194 = 5;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->unk3C = 10000;
|
|
gCurrentPinballGame->unk194 = 10;
|
|
}
|
|
gCurrentPinballGame->unk72B++;
|
|
}
|
|
|
|
gCurrentPinballGame->unk196 = 0;
|
|
gCurrentPinballGame->unk72C = 0;
|
|
}
|
|
|
|
gCurrentPinballGame->unk732 = 1;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 126)
|
|
{
|
|
if (gCurrentPinballGame->ballPowerUpLight[0] == 0)
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
|
|
gCurrentPinballGame->ballPowerUpLight[0] = 1;
|
|
gCurrentPinballGame->unk732 = 3;
|
|
|
|
if (gCurrentPinballGame->unk71B == 0)
|
|
{
|
|
if (!(gCurrentPinballGame->ballPowerUpLight[1] &
|
|
gCurrentPinballGame->ballPowerUpLight[2]))
|
|
return;
|
|
|
|
gCurrentPinballGame->unk71B = 1;
|
|
gCurrentPinballGame->unk71C = 60;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 148)
|
|
{
|
|
if (gCurrentPinballGame->ballPowerUpLight[1] == 0)
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
|
|
gCurrentPinballGame->ballPowerUpLight[1] = 1;
|
|
gCurrentPinballGame->unk732 = 4;
|
|
|
|
if (gCurrentPinballGame->unk71B != 0)
|
|
return;
|
|
|
|
if (!(gCurrentPinballGame->ballPowerUpLight[0] &
|
|
gCurrentPinballGame->ballPowerUpLight[2]))
|
|
return;
|
|
|
|
gCurrentPinballGame->unk71B = 1;
|
|
gCurrentPinballGame->unk71C = 60;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 172)
|
|
{
|
|
if (gCurrentPinballGame->ballPowerUpLight[2] == 0)
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
|
|
gCurrentPinballGame->ballPowerUpLight[2] = 1;
|
|
gCurrentPinballGame->unk732 = 5;
|
|
|
|
if (gCurrentPinballGame->unk71B != 0)
|
|
return;
|
|
|
|
if (!(gCurrentPinballGame->ballPowerUpLight[0] &
|
|
gCurrentPinballGame->ballPowerUpLight[1]))
|
|
return;
|
|
|
|
gCurrentPinballGame->unk71B = 1;
|
|
gCurrentPinballGame->unk71C = 60;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk732 == 9)
|
|
{
|
|
if (gCurrentPinballGame->unk13 <= 2 && gCurrentPinballGame->unk72F <= 2)
|
|
{
|
|
if (gCurrentPinballGame->unk72F == 0)
|
|
gCurrentPinballGame->unk3C = 2000;
|
|
else if (gCurrentPinballGame->unk72F == 1)
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
else
|
|
gCurrentPinballGame->unk3C = 10000;
|
|
|
|
gCurrentPinballGame->unk72F++;
|
|
|
|
MPlayStart(&gMPlayInfo_SE1, &gUnknown_0869FC0C);
|
|
|
|
if (gCurrentPinballGame->unk72F > 1)
|
|
gCurrentPinballGame->unk731 = 1;
|
|
}
|
|
|
|
gCurrentPinballGame->unk6BC = 2;
|
|
}
|
|
|
|
gCurrentPinballGame->unk732 = 6;
|
|
return;
|
|
}
|
|
break;
|
|
case 8:
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 50)
|
|
{
|
|
gCurrentPinballGame->unk732 = 8;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 100)
|
|
{
|
|
gCurrentPinballGame->unk732 = 7;
|
|
return;
|
|
}
|
|
|
|
gCurrentPinballGame->unk732 = 9;
|
|
return;
|
|
case 9:
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 46)
|
|
{
|
|
gCurrentPinballGame->unk732 = 10;
|
|
|
|
if (gCurrentPinballGame->holeIndicators[0] != 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
gCurrentPinballGame->holeIndicators[0] = 1;
|
|
|
|
if (gCurrentPinballGame->unk714 != 0)
|
|
return;
|
|
|
|
if (!(gCurrentPinballGame->holeIndicators[1] &
|
|
gCurrentPinballGame->holeIndicators[2] &
|
|
gCurrentPinballGame->holeIndicators[3]))
|
|
return;
|
|
|
|
gCurrentPinballGame->unk714 = 1;
|
|
gCurrentPinballGame->unk715 = 126;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 120)
|
|
{
|
|
gCurrentPinballGame->unk732 = 11;
|
|
|
|
if (gCurrentPinballGame->holeIndicators[1] != 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
gCurrentPinballGame->holeIndicators[1] = 1;
|
|
|
|
if (gCurrentPinballGame->unk714 != 0)
|
|
return;
|
|
|
|
if (!(gCurrentPinballGame->holeIndicators[0] &
|
|
gCurrentPinballGame->holeIndicators[2] &
|
|
gCurrentPinballGame->holeIndicators[3]))
|
|
return;
|
|
|
|
gCurrentPinballGame->unk714 = 1;
|
|
gCurrentPinballGame->unk715 = 126;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 193)
|
|
{
|
|
gCurrentPinballGame->unk732 = 12;
|
|
|
|
if (gCurrentPinballGame->holeIndicators[2] != 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
gCurrentPinballGame->holeIndicators[2] = 1;
|
|
|
|
if (gCurrentPinballGame->unk714 != 0)
|
|
return;
|
|
|
|
if (!(gCurrentPinballGame->holeIndicators[0] &
|
|
gCurrentPinballGame->holeIndicators[1] &
|
|
gCurrentPinballGame->holeIndicators[3]))
|
|
return;
|
|
|
|
gCurrentPinballGame->unk714 = 1;
|
|
gCurrentPinballGame->unk715 = 126;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
return;
|
|
}
|
|
|
|
gCurrentPinballGame->unk732 = 13;
|
|
|
|
if (gCurrentPinballGame->holeIndicators[3] != 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
gCurrentPinballGame->holeIndicators[3] = 1;
|
|
|
|
if (gCurrentPinballGame->unk714 != 0)
|
|
return;
|
|
|
|
if (!(gCurrentPinballGame->holeIndicators[0] &
|
|
gCurrentPinballGame->holeIndicators[1] &
|
|
gCurrentPinballGame->holeIndicators[2]))
|
|
return;
|
|
|
|
gCurrentPinballGame->unk714 = 1;
|
|
gCurrentPinballGame->unk715 = 126;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
return;
|
|
case 10:
|
|
if (gCurrentPinballGame->unk5B2 == 0)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x > 170)
|
|
{
|
|
if (gCurrentPinballGame->unk2F0 > 2U)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xB000;
|
|
*arg1 = 1;
|
|
|
|
if (gCurrentPinballGame->unk13 <= 2 && gCurrentPinballGame->unk1AB <= 2)
|
|
{
|
|
gCurrentPinballGame->unk1AB = 3;
|
|
gCurrentPinballGame->unk2F2 = 5;
|
|
}
|
|
|
|
gCurrentPinballGame->unk3C = 50000;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk2FB <= 4)
|
|
{
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xF800;
|
|
*arg1 = 1;
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk2FB == 5)
|
|
gCurrentPinballGame->unk2FB = 6;
|
|
|
|
if (gCurrentPinballGame->unk29F == 0)
|
|
return;
|
|
|
|
if (gCurrentPinballGame->unk29F == 1)
|
|
gCurrentPinballGame->unk286 = 90;
|
|
else
|
|
{
|
|
gCurrentPinballGame->unk2F8 = 1;
|
|
gCurrentPinballGame->unk71B = 1;
|
|
gCurrentPinballGame->unk71C = 60;
|
|
m4aSongNumStart(SE_UNKNOWN_0xD8);
|
|
}
|
|
|
|
gCurrentPinballGame->unk29F = 0;
|
|
gCurrentPinballGame->unk2A0 = 600;
|
|
return;
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk1C4 != 0)
|
|
return;
|
|
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 120)
|
|
gCurrentPinballGame->unk1C2 = 1;
|
|
else
|
|
gCurrentPinballGame->unk1C2 = 2;
|
|
|
|
if (gCurrentPinballGame->outLanePikaPosition <= 1)
|
|
{
|
|
if (gCurrentPinballGame->outLanePikaPosition != gCurrentPinballGame->unk1C2 - 1)
|
|
return;
|
|
else
|
|
gCurrentPinballGame->unk1C4 = 120;
|
|
return;
|
|
}
|
|
|
|
gCurrentPinballGame->unk1C4 = 120;
|
|
return;
|
|
|
|
case 11:
|
|
if (gCurrentPinballGame->unk616 != 0)
|
|
return;
|
|
|
|
absVelY = gCurrentPinballGame->ball->velocity.y;
|
|
gCurrentPinballGame->unk614 = gCurrentPinballGame->ball->velocity.y;
|
|
|
|
if (absVelY < 0) {
|
|
absVelY = -absVelY;
|
|
}
|
|
|
|
gCurrentPinballGame->unk1C6 += (absVelY) / 3;
|
|
|
|
if (gCurrentPinballGame->unk1C6 > 168)
|
|
gCurrentPinballGame->unk1C6 = 168;
|
|
|
|
gCurrentPinballGame->unk616 = 20;
|
|
return;
|
|
case 12:
|
|
if (gCurrentPinballGame->unk2D8 == 0)
|
|
return;
|
|
|
|
if (gCurrentPinballGame->unk26 != 0)
|
|
return;
|
|
|
|
if (gCurrentPinballGame->unk2DA != 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk2DA++;
|
|
|
|
gCurrentPinballGame->unk2D8 = 0;
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
|
|
*arg2 = 0xD000;
|
|
*arg1 = 1;
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
m4aSongNumStart(SE_UNKNOWN_0xB7);
|
|
sub_11B0(7);
|
|
return;
|
|
case 13:
|
|
if (gCurrentPinballGame->unk2D8 == 0)
|
|
return;
|
|
|
|
if (gCurrentPinballGame->unk26 != 0)
|
|
return;
|
|
|
|
if (gCurrentPinballGame->unk2DA != 1)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk2DA++;
|
|
gCurrentPinballGame->unk2D8 = 0;
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xCC00;
|
|
*arg1 = 1;
|
|
|
|
m4aSongNumStart(SE_UNKNOWN_0xB7);
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
sub_11B0(7);
|
|
return;
|
|
case 14:
|
|
if ((gCurrentPinballGame->unk13 > 2) && (gCurrentPinballGame->unk13 != 5))
|
|
{
|
|
if (gCurrentPinballGame->unk2E0 == 0)
|
|
{
|
|
if (gCurrentPinballGame->unk2DA == 2)
|
|
{
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xC800;
|
|
*arg1 = 1;
|
|
gCurrentPinballGame->unk2DA++;
|
|
|
|
m4aSongNumStart(SE_UNKNOWN_0xB7);
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
sub_11B0(7);
|
|
return;
|
|
}
|
|
else if (gCurrentPinballGame->unk2DA == 3)
|
|
{
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xC800;
|
|
*arg1 = 1;
|
|
|
|
m4aSongNumStart(SE_UNKNOWN_0xB7);
|
|
gCurrentPinballGame->unk2D9 = 1;
|
|
sub_11B0(7);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else if (gCurrentPinballGame->unk2D8 != 0 && gCurrentPinballGame->unk2DA == 2)
|
|
{
|
|
gCurrentPinballGame->unk2DA++;
|
|
gCurrentPinballGame->unk2D8 = 0;
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xC800;
|
|
*arg1 = 1;
|
|
|
|
m4aSongNumStart(SE_UNKNOWN_0xB7);
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
sub_11B0(7);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
s16 COLLISION_CHECK_SAPPHIRE_16090(struct Vector16 *arg0, u16* arg1) {
|
|
struct Vector16 vec1;
|
|
struct Vector16 vec2;
|
|
u16 sp00;
|
|
u8 sp02;
|
|
u16 return_val;
|
|
s16 unk0;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
|
|
u32 some_enum;
|
|
u8 switch_enum;
|
|
|
|
return_val = 0;
|
|
gCurrentPinballGame->ball->unk4 = 0;
|
|
|
|
vec1.x = arg0->x / 8;
|
|
vec1.y = arg0->y / 8;
|
|
vec2.x = arg0->x % 8;
|
|
vec2.y = arg0->y % 8;
|
|
unk1 = vec1.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
vec1.y %= 64;
|
|
|
|
unk0 = gUnknown_02031520.unk14.unk38[unk2 + unk1][vec1.y * 64 + vec1.x];
|
|
sp00 = gUnknown_02031520.unk14.unk48[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
sp02 = gUnknown_02031520.unk14.unk58[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
|
|
sub_162B8(arg0, &sp00, &sp02);
|
|
|
|
switch_enum = sp02 & 0xF;
|
|
some_enum = sp02 >> 4;
|
|
|
|
switch (switch_enum)
|
|
{
|
|
case 1:
|
|
case 4:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp00;
|
|
if (*arg1 >= 0x3FF0 && *arg1 <= 0x4010)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < gUnknown_02031520.unk14.unk26 - 8 ||
|
|
gCurrentPinballGame->ball->positionQ0.y < gUnknown_02031520.unk14.unk28 - 8)
|
|
{
|
|
|
|
if (gCurrentPinballGame->ball->unk6 > 0)
|
|
{
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else if (gCurrentPinballGame->ball->unk6 != 0)
|
|
{
|
|
*arg1 = 0x4100;
|
|
}
|
|
else
|
|
{
|
|
if (gMain.systemFrameCount & 1)
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 0x28;
|
|
gCurrentPinballGame->ball->unk6 = 1;
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 0xFFD8;
|
|
gCurrentPinballGame->ball->unk6 = 0xFFFF;
|
|
*arg1 = 0x4100;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
return_val = 1;
|
|
break;
|
|
case 3:
|
|
case 2:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg1 = sp00 & 0x0000FFF0;
|
|
return_val = 1;
|
|
break;
|
|
}
|
|
|
|
sub_1642C((s32) some_enum, &return_val, arg1);
|
|
return return_val;
|
|
}
|
|
|
|
void sub_162B8(struct Vector16 *arg0, s16 *arg1, u8 *arg2) {
|
|
|
|
s16 deltaX;
|
|
s16 deltaY;
|
|
u16 maskedResult = 0;
|
|
u8 lowerNibble = 0;
|
|
s32 ix = 0;
|
|
|
|
if (gCurrentPinballGame->unk5B2 == 0)
|
|
{
|
|
if (gCurrentPinballGame->unk24 != 0)
|
|
return;
|
|
|
|
deltaX = arg0->x + gCurrentPinballGame->unk184[0].x;
|
|
deltaY = arg0->y + gCurrentPinballGame->unk184[0].y;
|
|
|
|
if (deltaX <= 63U && deltaY <= 63U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
ix = 0;
|
|
}
|
|
if (lowerNibble == 0)
|
|
{
|
|
deltaX = gCurrentPinballGame->unk184[1].x + arg0->x;
|
|
deltaY = gCurrentPinballGame->unk184[1].y + arg0->y;
|
|
|
|
if (deltaX <= 63U && deltaY <= 63U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
ix = 1;
|
|
}
|
|
|
|
if (lowerNibble == 0)
|
|
{
|
|
deltaX = gCurrentPinballGame->unk184[2].x + arg0->x;
|
|
deltaY = gCurrentPinballGame->unk184[2].y + arg0->y;
|
|
|
|
if (deltaX <= 63U && deltaY <= 63U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[(deltaY * 64) + deltaX];
|
|
ix = 2;
|
|
}
|
|
|
|
if (lowerNibble == 0)
|
|
return;
|
|
}
|
|
}
|
|
gCurrentPinballGame->unk170[ix] = 6;
|
|
|
|
*arg1 = maskedResult;
|
|
*arg2 = lowerNibble;
|
|
|
|
if (gCurrentPinballGame->unk624 <= 0)
|
|
gCurrentPinballGame->unk624 = 2;
|
|
}
|
|
}
|
|
|
|
|
|
void sub_1642C(u8 arg0, u16* arg1, u16* arg2)
|
|
{
|
|
s16 absVelY;
|
|
s16 x0Position;
|
|
s16 modRes;
|
|
s16 index;
|
|
u16 angle;
|
|
int squaredMagnitude;
|
|
|
|
switch (arg0)
|
|
{
|
|
case 1:
|
|
if (gCurrentPinballGame->unk26 == 0)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ1.x >= 200)
|
|
gCurrentPinballGame->unk25 = 1;
|
|
else
|
|
gCurrentPinballGame->unk25 = 3;
|
|
|
|
sub_32914();
|
|
gCurrentPinballGame->unk22 = 7;
|
|
*arg1 = 1;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (gCurrentPinballGame->unk24 == 0)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 2;
|
|
gCurrentPinballGame->unk24 = 2;
|
|
}
|
|
else if (gCurrentPinballGame->unk24 == 2)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 2;
|
|
gCurrentPinballGame->unk24 = 3;
|
|
}
|
|
else if (gCurrentPinballGame->unk24 == 3)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 1;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (gCurrentPinballGame->unk24 == 2)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 3;
|
|
gCurrentPinballGame->unk24 = 0;
|
|
}
|
|
else if (gCurrentPinballGame->unk24 == 3)
|
|
{
|
|
gCurrentPinballGame->ball->oamPriority = 2;
|
|
gCurrentPinballGame->unk24 = 2;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (gCurrentPinballGame->unk600 == 0)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.y < 260)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < 74)
|
|
{
|
|
if (gCurrentPinballGame->unk13 < 3 && gCurrentPinballGame->unk36A[1] < 3)
|
|
{
|
|
if (gCurrentPinballGame->unk36A[1] == 1)
|
|
gCurrentPinballGame->unk36C[1] = 6;
|
|
else
|
|
gCurrentPinballGame->unk36C[1] = 4;
|
|
|
|
gCurrentPinballGame->unk36E[1] = 0;
|
|
gCurrentPinballGame->unk36A[1] = 1;
|
|
sub_11B0(7);
|
|
|
|
gCurrentPinballGame->ball->velocity.x /= 2;
|
|
gCurrentPinballGame->ball->velocity.y /= 2;
|
|
|
|
memcpy(&gCurrentPinballGame->unk1334[1], &gCurrentPinballGame->unk1334[0], sizeof(*gCurrentPinballGame->unk1334));
|
|
|
|
gCurrentPinballGame->unk1330 = &gCurrentPinballGame->unk1334[1];
|
|
gCurrentPinballGame->unk1328 = 25;
|
|
}
|
|
}
|
|
else if (gCurrentPinballGame->ball->positionQ0.x < 116)
|
|
{
|
|
if (gCurrentPinballGame->unk13 < 3 && gCurrentPinballGame->unk36A[0] < 3)
|
|
{
|
|
if (gCurrentPinballGame->unk36A[0] == 1)
|
|
gCurrentPinballGame->unk36C[0] = 6;
|
|
else
|
|
gCurrentPinballGame->unk36C[0] = 4;
|
|
|
|
gCurrentPinballGame->unk36E[0] = 0;
|
|
gCurrentPinballGame->unk36A[0] = 1;
|
|
|
|
sub_11B0(7);
|
|
|
|
gCurrentPinballGame->ball->velocity.x /= 2;
|
|
gCurrentPinballGame->ball->velocity.y /= 2;
|
|
|
|
memcpy(&gCurrentPinballGame->unk1334[1], &gCurrentPinballGame->unk1334[0], sizeof(*gCurrentPinballGame->unk1334));
|
|
|
|
gCurrentPinballGame->unk1330 = &gCurrentPinballGame->unk1334[1];
|
|
gCurrentPinballGame->unk1328 = 25;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->unk30C = 1800;
|
|
gCurrentPinballGame->unk306 = 1;
|
|
|
|
if (gCurrentPinballGame->unk70E < 99)
|
|
gCurrentPinballGame->unk70E++;
|
|
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < 110)
|
|
{
|
|
gCurrentPinballGame->unk328 = 1;
|
|
gCurrentPinballGame->ball->velocity.y /= 2;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk378 == 0)
|
|
gCurrentPinballGame->unk378 = 1;
|
|
else
|
|
gCurrentPinballGame->unk378 = 0;
|
|
|
|
gCurrentPinballGame->ball->velocity.y /=2;
|
|
gCurrentPinballGame->unk3C = 3000;
|
|
}
|
|
}
|
|
|
|
gCurrentPinballGame->unk600 = 45;
|
|
m4aSongNumStart(SE_UNKNOWN_0x76);
|
|
}
|
|
break;
|
|
case 5:
|
|
gCurrentPinballGame->unk165 = 1;
|
|
gCurrentPinballGame->unk20 = 1;
|
|
gCurrentPinballGame->unk732 = 0;
|
|
gCurrentPinballGame->unk342 = 0;
|
|
break;
|
|
case 6:
|
|
if (gCurrentPinballGame->ball->positionQ0.x < 120)
|
|
{
|
|
if (gCurrentPinballGame->ball->velocity.y > 0)
|
|
{
|
|
angle = 0xDA00;
|
|
squaredMagnitude =
|
|
gCurrentPinballGame->ball->velocity.x * gCurrentPinballGame->ball->velocity.x +
|
|
gCurrentPinballGame->ball->velocity.y * gCurrentPinballGame->ball->velocity.y;
|
|
|
|
squaredMagnitude = Sqrt(squaredMagnitude * 4) / 2;
|
|
gCurrentPinballGame->ball->velocity.x = squaredMagnitude * Cos(angle) / 20000;
|
|
gCurrentPinballGame->ball->velocity.y = -squaredMagnitude * Sin(angle) / 20000;
|
|
}
|
|
}
|
|
else
|
|
gCurrentPinballGame->unk342 = 1;
|
|
break;
|
|
case 7:
|
|
if (gCurrentPinballGame->unk366 != 3)
|
|
{
|
|
gCurrentPinballGame->unk368 = 17;
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg2 = 0xD800;
|
|
*arg1 = 1;
|
|
}
|
|
break;
|
|
case 8:
|
|
x0Position = gCurrentPinballGame->ball->positionQ0.x;
|
|
if (gCurrentPinballGame->unk24 > 0)
|
|
{
|
|
if (gCurrentPinballGame->unk732 == 7)
|
|
{
|
|
gCurrentPinballGame->unk194 = 10;
|
|
if (gCurrentPinballGame->unk72B < 3)
|
|
{
|
|
if (gCurrentPinballGame->unk72B == 0)
|
|
{
|
|
gCurrentPinballGame->unk3C = 2000;
|
|
gCurrentPinballGame->unk194 = 1;
|
|
}
|
|
else if (gCurrentPinballGame->unk72B == 1)
|
|
{
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
gCurrentPinballGame->unk194 = 5;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->unk3C = 10000;
|
|
gCurrentPinballGame->unk194 = 10;
|
|
}
|
|
|
|
gCurrentPinballGame->unk72B++;
|
|
}
|
|
|
|
gCurrentPinballGame->unk196 = 0;
|
|
gCurrentPinballGame->unk72C = 0;
|
|
}
|
|
|
|
gCurrentPinballGame->unk732 = 1;
|
|
}
|
|
else
|
|
{
|
|
if (x0Position <= 72)
|
|
{
|
|
if (gCurrentPinballGame->unk732 == 8)
|
|
{
|
|
if (gCurrentPinballGame->unk13 < 3 && gCurrentPinballGame->unk72E < 3)
|
|
{
|
|
if (gCurrentPinballGame->unk72E == 0)
|
|
gCurrentPinballGame->unk3C = 2000;
|
|
else if (gCurrentPinballGame->unk72E == 1)
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
else
|
|
gCurrentPinballGame->unk3C = 10000;
|
|
|
|
gCurrentPinballGame->unk72E++;
|
|
m4aSongNumStart(SE_UNKNOWN_0x99);
|
|
}
|
|
|
|
gCurrentPinballGame->unk6BC = 1;
|
|
}
|
|
|
|
gCurrentPinballGame->unk732 = 2;
|
|
}
|
|
else if (x0Position <= 98)
|
|
{
|
|
if (gCurrentPinballGame->ballPowerUpLight[0] == 0)
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
|
|
gCurrentPinballGame->ballPowerUpLight[0] = 1;
|
|
gCurrentPinballGame->unk732 = 3;
|
|
|
|
if (gCurrentPinballGame->unk71B == 0 && (gCurrentPinballGame->ballPowerUpLight[1] & gCurrentPinballGame->ballPowerUpLight[2]))
|
|
{
|
|
gCurrentPinballGame->unk71B = 1;
|
|
gCurrentPinballGame->unk71C = 60;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
}
|
|
}
|
|
else if (x0Position <= 118)
|
|
{
|
|
if (gCurrentPinballGame->ballPowerUpLight[1] == 0)
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
|
|
gCurrentPinballGame->ballPowerUpLight[1] = 1;
|
|
gCurrentPinballGame->unk732 = 4;
|
|
|
|
if (gCurrentPinballGame->unk71B == 0 && (gCurrentPinballGame->ballPowerUpLight[0] & gCurrentPinballGame->ballPowerUpLight[2]))
|
|
{
|
|
gCurrentPinballGame->unk71B = 1;
|
|
gCurrentPinballGame->unk71C = 60;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
}
|
|
}
|
|
else if (x0Position <= 146)
|
|
{
|
|
if (gCurrentPinballGame->ballPowerUpLight[2] == 0)
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
|
|
gCurrentPinballGame->ballPowerUpLight[2] = 1;
|
|
gCurrentPinballGame->unk732 = 5;
|
|
|
|
if (gCurrentPinballGame->unk71B == 0 && (gCurrentPinballGame->ballPowerUpLight[0] & gCurrentPinballGame->ballPowerUpLight[1]))
|
|
{
|
|
gCurrentPinballGame->unk71B = 1;
|
|
gCurrentPinballGame->unk71C = 60;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk732 == 9)
|
|
{
|
|
if (gCurrentPinballGame->unk13 <= 2 && gCurrentPinballGame->unk72F < 3)
|
|
{
|
|
if (gCurrentPinballGame->unk72F == 0)
|
|
gCurrentPinballGame->unk3C = 2000;
|
|
else if (gCurrentPinballGame->unk72F == 1)
|
|
gCurrentPinballGame->unk3C = 5000;
|
|
else
|
|
gCurrentPinballGame->unk3C = 10000;
|
|
|
|
gCurrentPinballGame->unk72F++;
|
|
|
|
if (gCurrentPinballGame->unk1CA == 13)
|
|
m4aSongNumStart(SE_UNKNOWN_0x99);
|
|
|
|
if (gCurrentPinballGame->unk72F > 1)
|
|
gCurrentPinballGame->unk731 = 1;
|
|
}
|
|
|
|
gCurrentPinballGame->unk6BC = 2;
|
|
}
|
|
|
|
gCurrentPinballGame->unk732 = 6;
|
|
}
|
|
}
|
|
break;
|
|
case 9:
|
|
x0Position = gCurrentPinballGame->ball->positionQ0.x;
|
|
if (gCurrentPinballGame->unk24 > 0)
|
|
gCurrentPinballGame->unk732 = 7;
|
|
else if (x0Position <= 50)
|
|
gCurrentPinballGame->unk732 = 8;
|
|
else
|
|
gCurrentPinballGame->unk732 = 9;
|
|
break;
|
|
case 10:
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 46)
|
|
{
|
|
gCurrentPinballGame->unk732 = 10;
|
|
if (gCurrentPinballGame->holeIndicators[0] == 0)
|
|
{
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
gCurrentPinballGame->holeIndicators[0] = 1;
|
|
if (gCurrentPinballGame->unk714 == 0 && (
|
|
gCurrentPinballGame->holeIndicators[1] &
|
|
gCurrentPinballGame->holeIndicators[2] &
|
|
gCurrentPinballGame->holeIndicators[3]))
|
|
{
|
|
gCurrentPinballGame->unk714 = 1;
|
|
gCurrentPinballGame->unk715 = 126;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
}
|
|
}
|
|
}
|
|
else if (gCurrentPinballGame->ball->positionQ0.x <= 120)
|
|
{
|
|
gCurrentPinballGame->unk732 = 11;
|
|
|
|
if (gCurrentPinballGame->holeIndicators[1] == 0)
|
|
{
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
gCurrentPinballGame->holeIndicators[1] = 1;
|
|
if (gCurrentPinballGame->unk714 == 0 && (
|
|
gCurrentPinballGame->holeIndicators[0] &
|
|
gCurrentPinballGame->holeIndicators[2] &
|
|
gCurrentPinballGame->holeIndicators[3]))
|
|
{
|
|
gCurrentPinballGame->unk714 = 1;
|
|
gCurrentPinballGame->unk715 = 126;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
}
|
|
}
|
|
}
|
|
else if (gCurrentPinballGame->ball->positionQ0.x <= 193)
|
|
{
|
|
gCurrentPinballGame->unk732 = 12;
|
|
if (gCurrentPinballGame->holeIndicators[2] == 0)
|
|
{
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
gCurrentPinballGame->holeIndicators[2] = 1;
|
|
|
|
if (gCurrentPinballGame->unk714 == 0 && (
|
|
gCurrentPinballGame->holeIndicators[0] &
|
|
gCurrentPinballGame->holeIndicators[1] &
|
|
gCurrentPinballGame->holeIndicators[3]))
|
|
{
|
|
gCurrentPinballGame->unk714 = 1;
|
|
gCurrentPinballGame->unk715 = 126;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->unk732 = 13;
|
|
if (gCurrentPinballGame->holeIndicators[3] == 0)
|
|
{
|
|
gCurrentPinballGame->unk3C = 1000;
|
|
gCurrentPinballGame->holeIndicators[3] = 1;
|
|
if (gCurrentPinballGame->unk714 == 0 && (
|
|
gCurrentPinballGame->holeIndicators[0] &
|
|
gCurrentPinballGame->holeIndicators[1] &
|
|
gCurrentPinballGame->holeIndicators[2]))
|
|
{
|
|
gCurrentPinballGame->unk714 = 1;
|
|
gCurrentPinballGame->unk715 = 126;
|
|
gCurrentPinballGame->unk3C = 4000;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 11:
|
|
if (gCurrentPinballGame->unk1C4 == 0)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x <= 120)
|
|
gCurrentPinballGame->unk1C2 = 1;
|
|
else
|
|
gCurrentPinballGame->unk1C2 = 2;
|
|
|
|
if (gCurrentPinballGame->outLanePikaPosition < 2)
|
|
{
|
|
if (gCurrentPinballGame->outLanePikaPosition == gCurrentPinballGame->unk1C2 - 1)
|
|
gCurrentPinballGame->unk1C4 = 120;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->unk1C4 = 120;
|
|
}
|
|
}
|
|
break;
|
|
case 12:
|
|
if (gCurrentPinballGame->unk616 == 0)
|
|
{
|
|
absVelY = gCurrentPinballGame->ball->velocity.y;
|
|
gCurrentPinballGame->unk614 = absVelY;
|
|
if (absVelY < 0)
|
|
absVelY = -absVelY;
|
|
|
|
gCurrentPinballGame->unk1C6 = gCurrentPinballGame->unk1C6 + (absVelY / 3);
|
|
if (gCurrentPinballGame->unk1C6 > 168)
|
|
gCurrentPinballGame->unk1C6 = 168;
|
|
|
|
gCurrentPinballGame->unk616 = 20;
|
|
}
|
|
break;
|
|
case 13:
|
|
if (gCurrentPinballGame->unk732 != 14)
|
|
{
|
|
gCurrentPinballGame->unk732 = 14;
|
|
index = gUnknown_086ACE70[gCurrentPinballGame->unk34A];
|
|
gCurrentPinballGame->unk34B[index] = 10;
|
|
gCurrentPinballGame->unk34A++;
|
|
if (gCurrentPinballGame->unk34A == 3)
|
|
{
|
|
memcpy(&gCurrentPinballGame->unk1334[1], &gCurrentPinballGame->unk1334[0], sizeof(*gCurrentPinballGame->unk1334));
|
|
gCurrentPinballGame->unk1330 = &gCurrentPinballGame->unk1334[1];
|
|
if (gCurrentPinballGame->unk342)
|
|
gCurrentPinballGame->unk344 = 1;
|
|
}
|
|
|
|
if (gCurrentPinballGame->unk34A == 11)
|
|
gCurrentPinballGame->unk1330 = gCurrentPinballGame->unk1334;
|
|
|
|
modRes = (gCurrentPinballGame->unk34A - 1) % 4;
|
|
gMain.spriteGroups[modRes + 47].available = 1;
|
|
gCurrentPinballGame->unk355[modRes] = 0;
|
|
gCurrentPinballGame->unk35E[modRes] = 0;
|
|
gCurrentPinballGame->unk359[modRes] = gCurrentPinballGame->unk34A - 1;
|
|
|
|
if (gCurrentPinballGame->unk34A > 12)
|
|
gCurrentPinballGame->unk34A = 0;
|
|
|
|
if (index == 0 && gCurrentPinballGame->ball->velocity.y > -120)
|
|
gCurrentPinballGame->ball->velocity.y = -120;
|
|
|
|
if (index == 2 && gCurrentPinballGame->ball->velocity.y > -180)
|
|
gCurrentPinballGame->ball->velocity.y = -180;
|
|
}
|
|
break;
|
|
case 14:
|
|
if (gCurrentPinballGame->unk732 != 15)
|
|
{
|
|
gCurrentPinballGame->unk732 = 15;
|
|
index = gUnknown_086ACE70[gCurrentPinballGame->unk34A];
|
|
gCurrentPinballGame->unk34B[index] = 10;
|
|
gCurrentPinballGame->unk34A++;
|
|
|
|
modRes = (gCurrentPinballGame->unk34A -1) % 4;
|
|
gMain.spriteGroups[modRes + 47].available = 1;
|
|
gCurrentPinballGame->unk355[modRes] = 0;
|
|
gCurrentPinballGame->unk35E[modRes] = 0;
|
|
gCurrentPinballGame->unk359[modRes] = gCurrentPinballGame->unk34A - 1;
|
|
if (index == 1 && gCurrentPinballGame->ball->velocity.y > -150)
|
|
gCurrentPinballGame->ball->velocity.y = -150;
|
|
}
|
|
break;
|
|
case 15:
|
|
if (gCurrentPinballGame->ball->positionQ0.y < 80)
|
|
{
|
|
if (gCurrentPinballGame->unk306 == 1)
|
|
gCurrentPinballGame->unk306 = 2;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk306 == 2)
|
|
{
|
|
gCurrentPinballGame->unk306 = 3;
|
|
gCurrentPinballGame->unk30C = 0;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
s16 COLLISION_CHECK_DUSCLOPS_171C8(struct Vector16* arg0, u16* arg1) {
|
|
struct Vector16 vec1;
|
|
struct Vector16 vec2;
|
|
u16 sp00;
|
|
u8 sp02;
|
|
u16 return_val;
|
|
s16 unk0;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
|
|
u32 some_enum;
|
|
u32 switch_enum;
|
|
|
|
return_val = 0;
|
|
gCurrentPinballGame->ball->unk4 = 0;
|
|
|
|
vec1.x = arg0->x / 8;
|
|
vec1.y = arg0->y / 8;
|
|
vec2.x = arg0->x % 8;
|
|
vec2.y = arg0->y % 8;
|
|
unk1 = vec1.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
vec1.y %= 64;
|
|
unk0 = gUnknown_02031520.unk14.unk38[unk2 + unk1][vec1.y * 64 + vec1.x];
|
|
sp00 = gUnknown_02031520.unk14.unk48[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
sp02 = gUnknown_02031520.unk14.unk58[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
|
|
sub_173FC(arg0, &sp00, &sp02);
|
|
switch_enum = sp02 & 0xF;
|
|
some_enum = sp02 >> 4;
|
|
|
|
switch (switch_enum)
|
|
{
|
|
case 1:
|
|
case 4:
|
|
case 6:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp00;
|
|
if (*arg1 >= 0x3FF0 && *arg1 <= 0x4010)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < gUnknown_02031520.unk14.unk26 - 8 ||
|
|
gCurrentPinballGame->ball->positionQ0.y < gUnknown_02031520.unk14.unk28 - 8)
|
|
{
|
|
|
|
if (gCurrentPinballGame->ball->unk6 > 0)
|
|
{
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else if (gCurrentPinballGame->ball->unk6 != 0)
|
|
{
|
|
*arg1 = 0x4100;
|
|
}
|
|
else
|
|
{
|
|
if (gMain.systemFrameCount & 1)
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 0x28;
|
|
gCurrentPinballGame->ball->unk6 = 1;
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 0xFFD8;
|
|
gCurrentPinballGame->ball->unk6 = 0xFFFF;
|
|
*arg1 = 0x4100;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
return_val = 1;
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg1 = sp00 & 0x0000FFF0;
|
|
return_val = 1;
|
|
break;
|
|
case 5:
|
|
some_enum = 4;
|
|
break;
|
|
}
|
|
|
|
sub_17634(some_enum, &return_val, arg1);
|
|
return return_val;
|
|
}
|
|
|
|
void sub_173FC(struct Vector16 *arg0, s16* arg1, u8* arg2) {
|
|
s16 deltaX;
|
|
s16 deltaY;
|
|
u16 maskedResult;
|
|
u8 lowerNibble;
|
|
u8 temp;
|
|
|
|
maskedResult = 0;
|
|
lowerNibble = 0;
|
|
|
|
if(gCurrentPinballGame->unk387 == 2)
|
|
{
|
|
if (*arg2 != 0)
|
|
return;
|
|
|
|
deltaX = arg0->x -gCurrentPinballGame->unk3F0;
|
|
deltaY = arg0->y -gCurrentPinballGame->unk3F2;
|
|
|
|
if (deltaX > 95U || deltaY > 119U)
|
|
return;
|
|
|
|
maskedResult = 0xFFF0 & gUnknown_083071D4[(deltaY * 96 ) + deltaX];
|
|
lowerNibble = 0xF & gUnknown_083071D4[(deltaY * 96 ) + deltaX];
|
|
|
|
if (lowerNibble == 0)
|
|
return;
|
|
|
|
temp = gCurrentPinballGame->unk3DC -3;
|
|
if (temp <= 1U)
|
|
*arg2 = 1;
|
|
else
|
|
*arg2 = lowerNibble;
|
|
|
|
gCurrentPinballGame->unk3DC = 4;
|
|
*arg1 = maskedResult;
|
|
|
|
return;
|
|
}
|
|
|
|
if(gCurrentPinballGame->unk387 == 1)
|
|
{
|
|
if (*arg2 != 0)
|
|
return;
|
|
|
|
if (gCurrentPinballGame->unk3A9[0] != 0)
|
|
{
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3D0[0].x;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3D0[0].y;
|
|
|
|
if (deltaX < 64U && deltaY < 64U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[deltaY * 64 + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[deltaY * 64 + deltaX];
|
|
|
|
if (lowerNibble != 0)
|
|
gCurrentPinballGame->unk3A0[0] = 4;
|
|
}
|
|
}
|
|
|
|
if (lowerNibble == 0)
|
|
{
|
|
if (gCurrentPinballGame->unk3A9[1] != 0)
|
|
{
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3D0[1].x;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3D0[1].y;
|
|
|
|
if (deltaX < 64U && deltaY < 64U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[deltaY * 64 + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[deltaY * 64 + deltaX];
|
|
|
|
if (lowerNibble != 0)
|
|
gCurrentPinballGame->unk3A0[1] = 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (lowerNibble == 0)
|
|
{
|
|
if ( gCurrentPinballGame->unk3A9[2] != 0)
|
|
{
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3D0[2].x;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3D0[2].y;
|
|
|
|
if (deltaX < 64U && deltaY < 64U)
|
|
{
|
|
maskedResult = 0xFFF0 & gUnknown_08252B10[deltaY * 64 + deltaX];
|
|
lowerNibble = 0xF & gUnknown_08252B10[deltaY * 64 + deltaX];
|
|
|
|
if (lowerNibble != 0)
|
|
{
|
|
gCurrentPinballGame->unk3A0[2] = 4;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (lowerNibble != 0)
|
|
{
|
|
*arg1 = maskedResult;
|
|
*arg2 = 6;
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
void sub_17634(u8 arg0, u16 *arg1, u16 *arg2)
|
|
{
|
|
switch (arg0)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
break;
|
|
case 4:
|
|
gCurrentPinballGame->unk3DC = 6;
|
|
gCurrentPinballGame->unk1F = 1;
|
|
gCurrentPinballGame->unk387 = 0;
|
|
break;
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
break;
|
|
}
|
|
}
|
|
|
|
s16 COLLISION_CHECK_KECLEON_176B0(struct Vector16 *arg0, u16 *arg1)
|
|
{
|
|
struct Vector16 vec1;
|
|
struct Vector16 vec2;
|
|
u16 sp00;
|
|
u8 sp02;
|
|
u16 return_val;
|
|
s16 unk0;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
|
|
u32 some_enum;
|
|
u32 switch_enum;
|
|
|
|
return_val = 0;
|
|
gCurrentPinballGame->ball->unk4 = 0;
|
|
|
|
vec1.x = arg0->x / 8;
|
|
vec1.y = arg0->y / 8;
|
|
vec2.x = arg0->x % 8;
|
|
vec2.y = arg0->y % 8;
|
|
unk1 = vec1.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
vec1.y %= 64;
|
|
unk0 = gUnknown_02031520.unk14.unk38[unk2 + unk1][vec1.y * 64 + vec1.x];
|
|
sp00 = gUnknown_02031520.unk14.unk48[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
sp02 = gUnknown_02031520.unk14.unk58[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
|
|
sub_17898(arg0, &sp00, &sp02);
|
|
switch_enum = sp02 & 0xF;
|
|
some_enum = sp02 >> 4;
|
|
|
|
switch (switch_enum)
|
|
{
|
|
case 1:
|
|
case 4:
|
|
case 6:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp00;
|
|
return_val = 1;
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp00 & 0x0000FFF0;
|
|
return_val = 1;
|
|
if (gCurrentPinballGame->unk404 == 0)
|
|
{
|
|
s32 unk3 = gCurrentPinballGame->unk406;
|
|
if (unk3 == 0)
|
|
{
|
|
gCurrentPinballGame->unk404 = 1;
|
|
gCurrentPinballGame->unk40A = unk3;
|
|
}
|
|
}
|
|
gCurrentPinballGame->unk40C = 40;
|
|
break;
|
|
case 5:
|
|
some_enum = 4;
|
|
break;
|
|
}
|
|
|
|
sub_179D0(some_enum, &return_val, arg1);
|
|
return return_val;
|
|
}
|
|
|
|
void sub_17898(struct Vector16 *arg0, u16 *arg1, u8 *arg2)
|
|
{
|
|
s16 deltaX;
|
|
s16 deltaY;
|
|
u16 arrayValue;
|
|
|
|
if (gCurrentPinballGame->unk387 == 1)
|
|
{
|
|
if (*arg2 & 0xF)
|
|
return;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3F0;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3F2;
|
|
|
|
if ((deltaX < 0 || deltaX > 0x3F) || (deltaY < 0 || deltaY > 0x57))
|
|
return;
|
|
|
|
arrayValue = (u8)(gUnknown_0832D604[(deltaY * 0x40) + deltaX]) & 0xF;
|
|
|
|
if (arrayValue == 0)
|
|
return;
|
|
if (gCurrentPinballGame->ball->unk0 != 0)
|
|
return;
|
|
if (gCurrentPinballGame->unk3DC > 8)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk3DC = 9;
|
|
}
|
|
else if (gCurrentPinballGame->unk387 == 2)
|
|
{
|
|
u16 maskedResult;
|
|
|
|
if (*arg2 & 0xF)
|
|
return;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3F0;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3F2;
|
|
|
|
if ((deltaX < 0 || deltaX > 0x57) || (deltaY < 0 || deltaY > 0x3F))
|
|
return;
|
|
|
|
maskedResult = gUnknown_08330204[(deltaY * 0x58) + deltaX] & 0xFFF0;
|
|
arrayValue = gUnknown_08330204[(deltaY * 0x58) + deltaX] & 0xF;
|
|
|
|
if (arrayValue == 0)
|
|
return;
|
|
if (gCurrentPinballGame->ball->unk0 != 0)
|
|
return;
|
|
if (gCurrentPinballGame->unk3DC == 12)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk3DC = 11;
|
|
*arg1 = maskedResult;
|
|
*arg2 = 6;
|
|
}
|
|
}
|
|
|
|
void sub_179D0(u8 arg0, u16 *arg1, u16 *arg2)
|
|
{
|
|
s16 x, y;
|
|
x = gCurrentPinballGame->ball->positionQ0.x;
|
|
y = gCurrentPinballGame->ball->positionQ0.y;
|
|
|
|
switch (arg0)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
return;
|
|
case 8:
|
|
if (x <= 0x72)
|
|
{
|
|
if (y <= 0x38)
|
|
{
|
|
if (gCurrentPinballGame->unk41C[0] <= 0)
|
|
gCurrentPinballGame->unk41C[0] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk41C[1] <= 0)
|
|
gCurrentPinballGame->unk41C[1] = 0x18;
|
|
}
|
|
}
|
|
else if (y <= 0x63)
|
|
{
|
|
if (gCurrentPinballGame->unk41C[3] <= 0)
|
|
gCurrentPinballGame->unk41C[3] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk41C[2] <= 0)
|
|
gCurrentPinballGame->unk41C[2] = 0x18;
|
|
}
|
|
break;
|
|
case 9:
|
|
if (x <= 0x72)
|
|
{
|
|
if (y <= 0x45)
|
|
{
|
|
if (gCurrentPinballGame->unk420[7] <= 0)
|
|
gCurrentPinballGame->unk420[7] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[5] <= 0)
|
|
gCurrentPinballGame->unk420[5] = 0x18;
|
|
}
|
|
}
|
|
else if (y <= 0x45)
|
|
{
|
|
if (gCurrentPinballGame->unk420[8] <= 0)
|
|
gCurrentPinballGame->unk420[8] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[0] <= 0)
|
|
gCurrentPinballGame->unk420[0] = 0x18;
|
|
}
|
|
break;
|
|
case 10:
|
|
if (gCurrentPinballGame->unk410 == 0)
|
|
{
|
|
gCurrentPinballGame->unk42A[0] = 0xB;
|
|
gCurrentPinballGame->unkD0[0].x = gCurrentPinballGame->ball->positionQ0.x - 7;
|
|
gCurrentPinballGame->unkD0[0].y = gCurrentPinballGame->ball->positionQ0.y - 7;
|
|
}
|
|
else if (gCurrentPinballGame->unk410 == 3)
|
|
{
|
|
gCurrentPinballGame->unk42A[1] = 0xB;
|
|
gCurrentPinballGame->unkD0[1].x = gCurrentPinballGame->ball->positionQ0.x - 7;
|
|
gCurrentPinballGame->unkD0[1].y = gCurrentPinballGame->ball->positionQ0.y - 7;
|
|
}
|
|
else if (gCurrentPinballGame->unk410 == 6)
|
|
{
|
|
gCurrentPinballGame->unk42A[2] = 0xB;
|
|
gCurrentPinballGame->unkD0[2].x = gCurrentPinballGame->ball->positionQ0.x - 7;
|
|
gCurrentPinballGame->unkD0[2].y = gCurrentPinballGame->ball->positionQ0.y - 7;
|
|
}
|
|
else if (gCurrentPinballGame->unk410 == 9)
|
|
{
|
|
gCurrentPinballGame->unk42A[3] = 0xB;
|
|
gCurrentPinballGame->unkD0[3].x = gCurrentPinballGame->ball->positionQ0.x - 7;
|
|
gCurrentPinballGame->unkD0[3].y = gCurrentPinballGame->ball->positionQ0.y - 7;
|
|
}
|
|
break;
|
|
case 11:
|
|
if (x <= 0x72)
|
|
{
|
|
if (y <= 0x45)
|
|
{
|
|
if (gCurrentPinballGame->unk420[9] <= 0)
|
|
gCurrentPinballGame->unk420[9] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[2] <= 0)
|
|
gCurrentPinballGame->unk420[2] = 0x18;
|
|
}
|
|
}
|
|
else if (y <= 0x45)
|
|
{
|
|
if (gCurrentPinballGame->unk420[6] <= 0)
|
|
gCurrentPinballGame->unk420[6] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[1] <= 0)
|
|
gCurrentPinballGame->unk420[1] = 0x18;
|
|
}
|
|
break;
|
|
case 12:
|
|
if (x <= 0x72)
|
|
{
|
|
if (gCurrentPinballGame->unk420[4] <= 0)
|
|
gCurrentPinballGame->unk420[4] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[3] <= 0)
|
|
gCurrentPinballGame->unk420[3] = 0x18;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_17C1C(struct Vector16 *arg0)
|
|
{
|
|
struct Vector16 vec1;
|
|
struct Vector16 vec2;
|
|
s16 x, y;
|
|
u16 sp00;
|
|
u8 sp02;
|
|
s16 unk0;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
u32 some_enum;
|
|
|
|
gCurrentPinballGame->unk3F8 = 1;
|
|
vec1.x = arg0->x / 8;
|
|
vec1.y = arg0->y / 8;
|
|
vec2.x = arg0->x % 8;
|
|
vec2.y = arg0->y % 8;
|
|
unk1 = vec1.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
vec1.y %= 64;
|
|
unk0 = gUnknown_02031520.unk14.unk38[unk2 + unk1][vec1.y * 64 + vec1.x];
|
|
sp00 = gUnknown_02031520.unk14.unk48[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
sp02 = gUnknown_02031520.unk14.unk58[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
|
|
some_enum = (sp02 >> 2) >> 2;
|
|
|
|
x = gCurrentPinballGame->unk400.x;
|
|
y = gCurrentPinballGame->unk400.y;
|
|
|
|
switch (some_enum)
|
|
{
|
|
case 8:
|
|
if (x <= 0x72)
|
|
{
|
|
if (y <= 0x38)
|
|
{
|
|
if (gCurrentPinballGame->unk41C[0] <= 0)
|
|
gCurrentPinballGame->unk41C[0] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk41C[1] <= 0)
|
|
gCurrentPinballGame->unk41C[1] = 0x18;
|
|
}
|
|
}
|
|
else if (y <= 0x63)
|
|
{
|
|
if (gCurrentPinballGame->unk41C[3] <= 0)
|
|
gCurrentPinballGame->unk41C[3] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk41C[2] <= 0)
|
|
gCurrentPinballGame->unk41C[2] = 0x18;
|
|
}
|
|
break;
|
|
case 9:
|
|
if (x <= 0x72)
|
|
{
|
|
if (y <= 0x45)
|
|
{
|
|
if (gCurrentPinballGame->unk420[7] <= 0)
|
|
gCurrentPinballGame->unk420[7] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[5] <= 0)
|
|
gCurrentPinballGame->unk420[5] = 0x18;
|
|
}
|
|
}
|
|
else if (y <= 0x45)
|
|
{
|
|
if (gCurrentPinballGame->unk420[8] <= 0)
|
|
gCurrentPinballGame->unk420[8] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[0] <= 0)
|
|
gCurrentPinballGame->unk420[0] = 0x18;
|
|
}
|
|
break;
|
|
case 10:
|
|
gCurrentPinballGame->unk3F8 = 0;
|
|
if (gCurrentPinballGame->unk412 == 0)
|
|
{
|
|
if (gCurrentPinballGame->unk400.x != gCurrentPinballGame->unk434[0].x || gCurrentPinballGame->unk400.y != gCurrentPinballGame->unk434[0].y)
|
|
{
|
|
gCurrentPinballGame->unk42A[4] = 0x11;
|
|
gCurrentPinballGame->unk434[0].x = gCurrentPinballGame->unk400.x;
|
|
gCurrentPinballGame->unk434[0].y = gCurrentPinballGame->unk400.y;
|
|
}
|
|
}
|
|
else if (gCurrentPinballGame->unk412 == 8)
|
|
{
|
|
if (gCurrentPinballGame->unk400.x != gCurrentPinballGame->unk434[1].x || gCurrentPinballGame->unk400.y != gCurrentPinballGame->unk434[1].y)
|
|
{
|
|
gCurrentPinballGame->unk42A[5] = 0x11;
|
|
gCurrentPinballGame->unk434[1].x = gCurrentPinballGame->unk400.x;
|
|
gCurrentPinballGame->unk434[1].y = gCurrentPinballGame->unk400.y;
|
|
}
|
|
}
|
|
else if (gCurrentPinballGame->unk412 == 16)
|
|
{
|
|
if (gCurrentPinballGame->unk400.x != gCurrentPinballGame->unk434[2].x || gCurrentPinballGame->unk400.y != gCurrentPinballGame->unk434[2].y)
|
|
{
|
|
gCurrentPinballGame->unk42A[6] = 0x11;
|
|
gCurrentPinballGame->unk434[2].x = gCurrentPinballGame->unk400.x;
|
|
gCurrentPinballGame->unk434[2].y = gCurrentPinballGame->unk400.y;
|
|
}
|
|
}
|
|
break;
|
|
case 11:
|
|
if (x <= 0x72)
|
|
{
|
|
if (y <= 0x45)
|
|
{
|
|
if (gCurrentPinballGame->unk420[9] <= 0)
|
|
gCurrentPinballGame->unk420[9] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[2] <= 0)
|
|
gCurrentPinballGame->unk420[2] = 0x18;
|
|
}
|
|
}
|
|
else if (y <= 0x45)
|
|
{
|
|
if (gCurrentPinballGame->unk420[6] <= 0)
|
|
gCurrentPinballGame->unk420[6] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[1] <= 0)
|
|
gCurrentPinballGame->unk420[1] = 0x18;
|
|
}
|
|
break;
|
|
case 12:
|
|
if (x <= 0x72)
|
|
{
|
|
if (gCurrentPinballGame->unk420[4] <= 0)
|
|
gCurrentPinballGame->unk420[4] = 0x18;
|
|
}
|
|
else
|
|
{
|
|
if (gCurrentPinballGame->unk420[3] <= 0)
|
|
gCurrentPinballGame->unk420[3] = 0x18;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
s16 COLLISION_CHECK_KYOGRE_17F28(struct Vector16 *arg0, u16 *arg1)
|
|
{
|
|
struct Vector16 vec1;
|
|
struct Vector16 vec2;
|
|
u16 sp00;
|
|
u8 sp02;
|
|
u16 return_val;
|
|
s16 unk0;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
|
|
u32 some_enum;
|
|
u32 switch_enum;
|
|
|
|
return_val = 0;
|
|
gCurrentPinballGame->ball->unk4 = 0;
|
|
if (arg0->y < 0x200)
|
|
{
|
|
vec1.x = arg0->x / 8;
|
|
vec1.y = arg0->y / 8;
|
|
vec2.x = arg0->x % 8;
|
|
vec2.y = arg0->y % 8;
|
|
unk1 = vec1.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
vec1.y %= 64;
|
|
unk0 = gUnknown_02031520.unk14.unk38[unk2 + unk1][vec1.y * 64 + vec1.x];
|
|
sp00 = gUnknown_02031520.unk14.unk48[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
sp02 = gUnknown_02031520.unk14.unk58[unk2 + unk1][unk0 * 64 + vec2.y * 8 + vec2.x];
|
|
}
|
|
else
|
|
{
|
|
sp00 = 0;
|
|
sp02 = 0;
|
|
}
|
|
|
|
sub_18180(arg0, &sp00, &sp02);
|
|
switch_enum = sp02 & 0xF;
|
|
some_enum = sp02 >> 4;
|
|
|
|
switch (switch_enum)
|
|
{
|
|
case 1:
|
|
case 4:
|
|
case 6:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp00;
|
|
if (*arg1 >= 0x3FF0 && *arg1 <= 0x4010)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < gUnknown_02031520.unk14.unk26 - 8 ||
|
|
gCurrentPinballGame->ball->positionQ0.y < gUnknown_02031520.unk14.unk28 - 8)
|
|
{
|
|
|
|
if (gCurrentPinballGame->ball->unk6 > 0)
|
|
{
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else if (gCurrentPinballGame->ball->unk6 != 0)
|
|
{
|
|
*arg1 = 0x4100;
|
|
}
|
|
else
|
|
{
|
|
if (gMain.systemFrameCount & 1)
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 0x28;
|
|
gCurrentPinballGame->ball->unk6 = 1;
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 0xFFD8;
|
|
gCurrentPinballGame->ball->unk6 = 0xFFFF;
|
|
*arg1 = 0x4100;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
return_val = 1;
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg1 = sp00 & 0x0000FFF0;
|
|
return_val = 1;
|
|
break;
|
|
case 5:
|
|
some_enum = 4;
|
|
break;
|
|
}
|
|
|
|
sub_182B4(some_enum, &return_val, arg1);
|
|
return return_val;
|
|
}
|
|
|
|
void sub_18180(struct Vector16 *arg0, u16 *arg1, u8 *arg2)
|
|
{
|
|
s16 deltaX;
|
|
s16 deltaY;
|
|
u16 arrayValue;
|
|
u16 maskedResult;
|
|
|
|
if (gCurrentPinballGame->unk387 == 1)
|
|
{
|
|
if (*arg2 & 0xF)
|
|
return;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3F0;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3F2;
|
|
|
|
if ((deltaX < 0 || deltaX >= 0x78) || (deltaY < 0 || deltaY >= 0x98))
|
|
return;
|
|
|
|
maskedResult = gUnknown_08340B58[(deltaY * 0x78) + deltaX] & 0xFFF0;
|
|
arrayValue = gUnknown_08340B58[(deltaY * 0x78) + deltaX] & 0xF;
|
|
|
|
if (arrayValue == 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk452 = 8;
|
|
*arg1 = maskedResult;
|
|
*arg2 = 6;
|
|
}
|
|
else if (gCurrentPinballGame->unk387 == 2)
|
|
{
|
|
if (*arg2 & 0xF)
|
|
return;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3F0;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3F2;
|
|
|
|
if ((deltaX < 0 || deltaX >= 0x60) || (deltaY < 0 || deltaY >= 0x58))
|
|
return;
|
|
|
|
maskedResult = gUnknown_083499D8[(deltaY * 0x60) + deltaX] & 0xFFF0;
|
|
arrayValue = gUnknown_083499D8[(deltaY * 0x60) + deltaX] & 0xF;
|
|
|
|
if (arrayValue == 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk452 = 8;
|
|
*arg1 = maskedResult;
|
|
*arg2 = 6;
|
|
}
|
|
else if (gCurrentPinballGame->unk387 == 3)
|
|
{
|
|
if (*arg2 & 0xF)
|
|
return;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3F0;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3F2;
|
|
|
|
if ((deltaX < 0 || deltaX >= 0x60) || (deltaY < 0 || deltaY >= 0x68))
|
|
return;
|
|
|
|
maskedResult = gUnknown_0834DBD8[(deltaY * 0x60) + deltaX] & 0xFFF0;
|
|
arrayValue = gUnknown_0834DBD8[(deltaY * 0x60) + deltaX] & 0xF;
|
|
|
|
if (arrayValue == 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk452 = 8;
|
|
*arg1 = maskedResult;
|
|
*arg2 = 6;
|
|
}
|
|
}
|
|
|
|
void sub_182B4(u8 arg0, u16 *arg1, u16 *arg2)
|
|
{
|
|
switch (arg0)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
break;
|
|
case 4:
|
|
gCurrentPinballGame->unk3DC = 6;
|
|
gCurrentPinballGame->unk1F = 1;
|
|
break;
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
break;
|
|
}
|
|
}
|
|
|
|
s16 COLLISION_CHECK_GROUDON_18324(struct Vector16 *arg0, u16 *arg1)
|
|
{
|
|
struct Vector16 vec1;
|
|
struct Vector16 vec2;
|
|
u16 sp00;
|
|
u8 sp02;
|
|
u16 return_val;
|
|
u32 some_enum;
|
|
u32 switch_enum;
|
|
|
|
return_val = 0;
|
|
gCurrentPinballGame->ball->unk4 = 0;
|
|
|
|
if (arg0->y < 0x200)
|
|
{
|
|
s16 r2;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
vec1.x = arg0->x / 8;
|
|
vec1.y = arg0->y / 8;
|
|
vec2.x = arg0->x % 8;
|
|
vec2.y = arg0->y % 8;
|
|
unk1 = vec1.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
vec1.y %= 64;
|
|
r2 = gUnknown_02031520.unk14.unk38[unk2 + unk1][vec1.y * 64 + vec1.x];
|
|
sp00 = gUnknown_02031520.unk14.unk48[unk2 + unk1][r2 * 64 + vec2.y * 8 + vec2.x];
|
|
sp02 = gUnknown_02031520.unk14.unk58[unk2 + unk1][r2 * 64 + vec2.y * 8 + vec2.x];
|
|
}
|
|
else
|
|
{
|
|
sp00 = 0;
|
|
sp02 = 0;
|
|
}
|
|
|
|
sub_1857C(arg0, &sp00, &sp02);
|
|
switch_enum = sp02 & 0xF;
|
|
some_enum = sp02 >> 4;
|
|
|
|
switch (switch_enum)
|
|
{
|
|
case 1:
|
|
case 4:
|
|
case 6:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp00;
|
|
if (*arg1 >= 0x3FF0 && *arg1 <= 0x4010)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < (gUnknown_02031520.unk14.unk26 - 8) || gCurrentPinballGame->ball->positionQ0.y < gUnknown_02031520.unk14.unk28 - 8)
|
|
{
|
|
if (gCurrentPinballGame->ball->unk6 > 0)
|
|
{
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else if (gCurrentPinballGame->ball->unk6 != 0)
|
|
{
|
|
*arg1 = 0x4100;
|
|
}
|
|
else
|
|
{
|
|
if (gMain.systemFrameCount & 1)
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 40;
|
|
gCurrentPinballGame->ball->unk6 = 1;
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = -40;
|
|
gCurrentPinballGame->ball->unk6 = -1;
|
|
*arg1 = 0x4100;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return_val = 1;
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg1 = sp00 & 0xFFF0;
|
|
return_val = 1;
|
|
break;
|
|
case 5:
|
|
some_enum = 4;
|
|
break;
|
|
}
|
|
|
|
sub_18784(some_enum, &return_val, arg1);
|
|
return return_val;
|
|
}
|
|
|
|
void sub_1857C(struct Vector16 *arg0, u16 *arg1, u8 *arg2)
|
|
{
|
|
s16 deltaX;
|
|
s16 deltaY;
|
|
u16 resultFromArray;
|
|
u16 maskedResult;
|
|
u16 lowerNibble;
|
|
s16 i;
|
|
|
|
if (gCurrentPinballGame->unk387 == 1)
|
|
{
|
|
if ((*arg2 & 0xF) == 0)
|
|
{
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3F0;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3F2;
|
|
|
|
if ((deltaX >= 0 && deltaX < 0x70) && (deltaY >= 0 && deltaY < 0x80))
|
|
{
|
|
resultFromArray = gUnknown_083579C8[(deltaY * 0x70) + deltaX];
|
|
maskedResult = resultFromArray & 0xFFF0;
|
|
lowerNibble = resultFromArray & 0xF;
|
|
if (lowerNibble != 0)
|
|
{
|
|
if (gCurrentPinballGame->unk452 == 0)
|
|
gCurrentPinballGame->unk452 = 0x27;
|
|
|
|
*arg1 = maskedResult;
|
|
*arg2 = lowerNibble;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < 3; i++)
|
|
{
|
|
if (gCurrentPinballGame->unk4F8[i].x <= 0)
|
|
continue;
|
|
if ((*arg2 & 0xF) != 0)
|
|
continue;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk4F8[i].x;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk4F8[i].y;
|
|
|
|
if ((deltaX < 0 || deltaX >= 0x50) || (deltaY < 0 || deltaY >= 0x50))
|
|
continue;
|
|
|
|
maskedResult = gUnknown_0835E9C8[(deltaY * 0x50) + deltaX] & 0xFFF0;
|
|
lowerNibble = gUnknown_0835E9C8[(deltaY * 0x50) + deltaX] & 0xF;
|
|
|
|
if (lowerNibble == 0)
|
|
continue;
|
|
|
|
*arg1 = maskedResult;
|
|
*arg2 = 6;
|
|
gCurrentPinballGame->unk4D5[i] = 1;
|
|
}
|
|
for (i = 0; i < 4; i++)
|
|
{
|
|
if (gCurrentPinballGame->unk4B4[i].x <= 0)
|
|
continue;
|
|
if ((*arg2 & 0xF) != 0)
|
|
continue;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk4B4[i].x;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk4B4[i].y;
|
|
|
|
if ((deltaX < 0 || deltaX >= 0x50) || (deltaY < 0 || deltaY >= 0x50))
|
|
continue;
|
|
|
|
maskedResult = gUnknown_0835E9C8[(deltaY * 0x50) + deltaX] & 0xFFF0;
|
|
lowerNibble = gUnknown_0835E9C8[(deltaY * 0x50) + deltaX] & 0xF;
|
|
|
|
if (lowerNibble == 0)
|
|
continue;
|
|
|
|
*arg1 = maskedResult;
|
|
*arg2 = 6;
|
|
gCurrentPinballGame->unk4A4[i] = 8;
|
|
}
|
|
}
|
|
|
|
void sub_18784(u8 arg0, u16 *arg1, u16 *arg2)
|
|
{
|
|
switch (arg0)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
break;
|
|
case 4:
|
|
gCurrentPinballGame->unk3DC = 6;
|
|
gCurrentPinballGame->unk1F = 1;
|
|
break;
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//One known callsite is 080145D2 during the rayquaza bonus stage
|
|
s16 COLLISION_CHECK_RAYQUAZA_187F4(struct Vector16 *arg0, u16 *arg1)
|
|
{
|
|
struct Vector16 vec1;
|
|
struct Vector16 vec2;
|
|
u16 sp00;
|
|
u8 sp02;
|
|
u16 return_val;
|
|
u32 some_enum;
|
|
u32 switch_enum;
|
|
|
|
return_val = 0;
|
|
gCurrentPinballGame->ball->unk4 = 0;
|
|
|
|
if (arg0->y < 0x200)
|
|
{
|
|
s16 r2;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
vec1.x = arg0->x / 8;
|
|
vec1.y = arg0->y / 8;
|
|
vec2.x = arg0->x % 8;
|
|
vec2.y = arg0->y % 8;
|
|
unk1 = vec1.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
vec1.y %= 64;
|
|
r2 = gUnknown_02031520.unk14.unk38[unk2 + unk1][vec1.y * 64 + vec1.x];
|
|
sp00 = gUnknown_02031520.unk14.unk48[unk2 + unk1][r2 * 64 + vec2.y * 8 + vec2.x];
|
|
sp02 = gUnknown_02031520.unk14.unk58[unk2 + unk1][r2 * 64 + vec2.y * 8 + vec2.x];
|
|
}
|
|
else
|
|
{
|
|
sp00 = 0;
|
|
sp02 = 0;
|
|
}
|
|
|
|
sub_18A4C(arg0, &sp00, &sp02);
|
|
switch_enum = sp02 & 0xF;
|
|
some_enum = sp02 >> 4;
|
|
|
|
switch (switch_enum)
|
|
{
|
|
case 1:
|
|
case 4:
|
|
case 6:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp00;
|
|
if (*arg1 >= 0x3FF0 && *arg1 <= 0x4010)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < (gUnknown_02031520.unk14.unk26 - 8) || gCurrentPinballGame->ball->positionQ0.y < gUnknown_02031520.unk14.unk28 - 8)
|
|
{
|
|
if (gCurrentPinballGame->ball->unk6 > 0)
|
|
{
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else if (gCurrentPinballGame->ball->unk6 != 0)
|
|
{
|
|
*arg1 = 0x4100;
|
|
}
|
|
else
|
|
{
|
|
if (gMain.systemFrameCount & 1)
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 40;
|
|
gCurrentPinballGame->ball->unk6 = 1;
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = -40;
|
|
gCurrentPinballGame->ball->unk6 = -1;
|
|
*arg1 = 0x4100;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return_val = 1;
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
gCurrentPinballGame->unk23 = switch_enum - 1;
|
|
gCurrentPinballGame->unk22 = 2;
|
|
*arg1 = sp00 & 0xFFF0;
|
|
return_val = 1;
|
|
break;
|
|
case 5:
|
|
some_enum = 4;
|
|
break;
|
|
}
|
|
|
|
sub_18AE0(some_enum, &return_val, arg1);
|
|
return return_val;
|
|
}
|
|
|
|
void sub_18A4C(struct Vector16 *arg0, u16 *arg1, u8 *arg2)
|
|
{
|
|
s16 deltaX;
|
|
s16 deltaY;
|
|
u16 maskedResult;
|
|
u16 lowerNibble;
|
|
|
|
if (gCurrentPinballGame->unk387 != 1)
|
|
return;
|
|
if (*arg2 & 0xF)
|
|
return;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk3F0;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk3F2;
|
|
|
|
if ((deltaX < 0 || deltaX >= 0x80) || (deltaY < 0 || deltaY >= 0x80))
|
|
return;
|
|
|
|
maskedResult = gUnknown_083722E8[(deltaY * 0x80) + deltaX] & 0xFFF0;
|
|
lowerNibble = gUnknown_083722E8[(deltaY * 0x80) + deltaX] & 0xF;
|
|
|
|
if (lowerNibble == 0)
|
|
return;
|
|
|
|
gCurrentPinballGame->unk452 = 9;
|
|
*arg1 = maskedResult;
|
|
*arg2 = lowerNibble;
|
|
}
|
|
|
|
void sub_18AE0(u8 arg0, u16 *arg1, u16 *arg2)
|
|
{
|
|
switch (arg0)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
break;
|
|
case 4:
|
|
gCurrentPinballGame->unk3DC = 6;
|
|
gCurrentPinballGame->unk1F = 1;
|
|
break;
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
break;
|
|
}
|
|
}
|
|
|
|
s16 COLLISION_CHECK_SPHEAL_18B50(struct Vector16 *arg0, u16 *arg1)
|
|
{
|
|
u16 sp0;
|
|
u8 sp2;
|
|
u16 sp4_return;
|
|
|
|
struct Vector16 div_result;
|
|
struct Vector16 div_remainder;
|
|
s32 unk1;
|
|
s32 unk2;
|
|
s16 unk3;
|
|
u8 enum1, enum2;
|
|
|
|
sp4_return = 0;
|
|
gCurrentPinballGame->ball->unk4 = 0;
|
|
|
|
div_result.x = arg0->x / 8;
|
|
div_result.y = arg0->y / 8;
|
|
div_remainder.x = arg0->x % 8;
|
|
div_remainder.y = arg0->y % 8;
|
|
unk1 = div_result.y / 64;
|
|
unk2 = gCurrentPinballGame->unk24;
|
|
div_result.y %= 64;
|
|
|
|
unk3 = gUnknown_02031520.unk14.unk38[unk2 + unk1][div_result.y * 64 + div_result.x];
|
|
sp0 = gUnknown_02031520.unk14.unk48[unk2 + unk1][unk3 * 64 + div_remainder.y * 8 + div_remainder.x];
|
|
sp2 = gUnknown_02031520.unk14.unk58[unk2 + unk1][unk3 * 64 + div_remainder.y * 8 + div_remainder.x];
|
|
|
|
sub_18DAC(arg0, &sp0, &sp2);
|
|
|
|
enum1 = sp2 & 0xF;
|
|
enum2 = sp2 >> 4;
|
|
switch (enum1)
|
|
{
|
|
case 1:
|
|
case 4:
|
|
case 6:
|
|
gCurrentPinballGame->unk23 = enum1 - 1;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp0;
|
|
if (*arg1 >= 0x3FF0 && *arg1 <= 0x4010)
|
|
{
|
|
if (gCurrentPinballGame->ball->positionQ0.x < (gUnknown_02031520.unk14.unk26 - 8) ||
|
|
gCurrentPinballGame->ball->positionQ0.y < (gUnknown_02031520.unk14.unk28 - 8))
|
|
{
|
|
if (gCurrentPinballGame->ball->unk6 > 0)
|
|
{
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else if (gCurrentPinballGame->ball->unk6 != 0)
|
|
{
|
|
*arg1 = 0x4100;
|
|
}
|
|
else
|
|
{
|
|
if (gMain.systemFrameCount & 1)
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = 40;
|
|
gCurrentPinballGame->ball->unk6 = 1;
|
|
*arg1 = 0x3E00;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->ball->unk4 = -40;
|
|
gCurrentPinballGame->ball->unk6 = -1;
|
|
*arg1 = 0x4100;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
sp4_return = 1;
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
gCurrentPinballGame->unk23 = 0;
|
|
gCurrentPinballGame->unk22 = 1;
|
|
*arg1 = sp0 & 0x0000FFF0;
|
|
|
|
if (gCurrentPinballGame->ball->positionQ0.x < 120)
|
|
gCurrentPinballGame->unk548[0] = 24;
|
|
else
|
|
gCurrentPinballGame->unk548[1] = 24;
|
|
|
|
sp4_return = 1;
|
|
break;
|
|
case 5:
|
|
enum2 = 4;
|
|
break;
|
|
}
|
|
|
|
sub_18F38(enum2, &sp4_return, arg1);
|
|
return sp4_return;
|
|
}
|
|
|
|
void sub_18DAC(struct Vector16 *arg0, u16 *arg1, u8 *arg2)
|
|
{
|
|
s16 i;
|
|
s16 deltaX, deltaY;
|
|
u16 lowerReadFromRom;
|
|
u16 upperReadFromRom;
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
|
|
if (gCurrentPinballGame->unk54F[i] == 1)
|
|
{
|
|
if ((arg2[0] & 0xf) != 0)
|
|
continue;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk570[i].x;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk570[i].y;
|
|
if ((deltaX >= 64 || deltaX < 0) || (deltaY >= 64 || deltaY < 0))
|
|
continue;
|
|
|
|
upperReadFromRom = gUnknown_08393A4C[(deltaY * 64) + deltaX] & 0xFFF0;
|
|
lowerReadFromRom = gUnknown_08393A4C[(deltaY * 64) + deltaX] & 0xF;
|
|
if (lowerReadFromRom == 0)
|
|
continue;
|
|
|
|
if (gCurrentPinballGame->unk388 != 0)
|
|
continue;
|
|
|
|
arg1[0] = upperReadFromRom;
|
|
arg2[0] = lowerReadFromRom;
|
|
arg2[0] = 6;
|
|
gCurrentPinballGame->unk553[i] = 4;
|
|
}
|
|
else if (gCurrentPinballGame->unk54F[i] != 0)
|
|
{
|
|
if ((arg2[0] & 0xf) != 0)
|
|
continue;
|
|
|
|
deltaX = arg0->x - gCurrentPinballGame->unk570[i].x;
|
|
deltaY = arg0->y - gCurrentPinballGame->unk570[i].y;
|
|
if ((deltaX >= 64 || deltaX < 0) || (deltaY >= 64 || deltaY < 0))
|
|
continue;
|
|
|
|
upperReadFromRom = gUnknown_08391A4C[(deltaY * 64) + deltaX] & 0xFFF0;
|
|
lowerReadFromRom = gUnknown_08391A4C[(deltaY * 64) + deltaX] & 0xF;
|
|
if (lowerReadFromRom == 0)
|
|
continue;
|
|
|
|
arg1[0] = upperReadFromRom;
|
|
arg2[0] = lowerReadFromRom;
|
|
arg2[0] = 6;
|
|
if (gCurrentPinballGame->unk54F[i] == 2)
|
|
{
|
|
gCurrentPinballGame->unk553[i] = 4;
|
|
}
|
|
else
|
|
{
|
|
gCurrentPinballGame->unk54D[i] = 24;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_18F38(u8 arg0_enum, u16 *arg1, u16 *arg2)
|
|
{
|
|
switch (arg0_enum)
|
|
{
|
|
case 2:
|
|
gCurrentPinballGame->unk530[2] = 0;
|
|
gCurrentPinballGame->unk536[2] = 2;
|
|
break;
|
|
case 3:
|
|
gCurrentPinballGame->unk530[2] = 1;
|
|
gCurrentPinballGame->unk536[2] = 2;
|
|
break;
|
|
case 8:
|
|
gCurrentPinballGame->unk530[2] = 0;
|
|
gCurrentPinballGame->unk536[2] = 1;
|
|
gCurrentPinballGame->unk53C[2] = 100;
|
|
break;
|
|
case 9:
|
|
gCurrentPinballGame->unk530[2] = 1;
|
|
gCurrentPinballGame->unk536[2] = 1;
|
|
gCurrentPinballGame->unk53C[2] = 100;
|
|
break;
|
|
case 1:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
break;
|
|
}
|
|
} |