starting checkpoint

This commit is contained in:
Retnuhytnuob 2026-02-24 02:04:41 -06:00
parent f8a935cdd4
commit 29f8eb46ef
12 changed files with 209 additions and 168 deletions

View File

@ -0,0 +1,28 @@
#ifndef GUARD_CONSTANTS_RUBY_STATES_H
#define GUARD_CONSTANTS_RUBY_STATES_H
enum RubyPondStates{
RUBY_POND_STATE_CHINCHOU_STAGGERED = 0,
RUBY_POND_STATE_CHINCHOU_CLOCKWISE = 1,
RUBY_POND_STATE_CHINCHOU_COUNTERCLOCKWISE = 2,
RUBY_POND_STATE_CHINCHOU_ROWS = 3,
RUBY_POND_STATE_LOTAD = 4,
RUBY_POND_STATE_CHINCHOU_SINGLE_CLOCKWISE = 5,
RUBY_POND_STATE_WHISCASH = 6
};
enum WhiscashStates{
WHISCASH_STATE_0 = 0,
WHISCASH_STATE_1 = 1,
WHISCASH_STATE_2 = 2,
WHISCASH_STATE_3 = 3,
WHISCASH_STATE_4 = 4,
WHISCASH_STATE_5 = 5,
WHISCASH_STATE_6 = 6,
WHISCASH_STATE_7 = 7,
WHISCASH_STATE_8 = 8,
WHISCASH_STATE_9 = 9,
WHISCASH_STATE_10 = 10,
};
#endif // GUARD_CONSTANTS_RUBY_STATES_H

View File

@ -254,17 +254,17 @@ struct PinballGame
/*0x166*/ u16 unk166;
/*0x168*/ u16 unk168;
/*0x16A*/ s16 unk16A;
/*0x16C*/ s8 unk16C;
/*0x16C*/ s8 rubyPondState;
/*0x16D*/ u8 filler16D[0x1];
/*0x16E*/ s8 unk16E;
/*0x16F*/ s8 unk16F;
/*0x16F*/ s8 rubyPondContentsChanging;
/*0x170*/ s8 unk170[3];
/*0x173*/ u8 unk173;
/*0x174*/ u16 unk174;
/*0x174*/ u16 rubyPondChangeTimer;
/*0x176*/ u8 unk176;
/*0x177*/ u8 filler177[0x1];
/*0x178*/ struct Vector16 unk178[3];
/*0x184*/ struct Vector16 unk184[3];
/*0x178*/ struct Vector16 rubyBumperLogicPosition[3]; //chinchou or lotad
/*0x184*/ struct Vector16 rubyBumperCollisionPosition[3]; //chinchou or lotad
/*0x190*/ s16 unk190;
/*0x192*/ u8 coins;
/*0x193*/ s8 unk193;
@ -381,9 +381,9 @@ struct PinballGame
/*0x29E*/ u8 unk29E;
/*0x29F*/ s8 unk29F;
/*0x2A0*/ u16 unk2A0;
/*0x2A2*/ s8 unk2A2;
/*0x2A2*/ s8 whiscashState;
/*0x2A3*/ s8 unk2A3;
/*0x2A4*/ s8 unk2A4;
/*0x2A4*/ s8 shouldProcessWhiscash;
/*0x2A5*/ s8 unk2A5;
/*0x2A6*/ u16 unk2A6;
/*0x2A8*/ u16 unk2A8;

View File

@ -62,7 +62,7 @@ void RubyBoardProcess_0B_50918(void)
gMain.spriteGroups[51].available = 1;
gMain.spriteGroups[61].available = 1;
gMain.spriteGroups[64].available = 1;
if (gCurrentPinballGame->unk2A4 != 0)
if (gCurrentPinballGame->shouldProcessWhiscash)
gMain.spriteGroups[63].available = 1;
else
gMain.spriteGroups[62].available = 1;

View File

@ -575,11 +575,11 @@ void sub_4E598(void)
gCurrentPinballGame->unk70E = 1;
if (gCurrentPinballGame->unk2A5 == 45)
{
gCurrentPinballGame->unk2A4 = 0;
gCurrentPinballGame->shouldProcessWhiscash = 0;
gCurrentPinballGame->unk2A5 = 0;
gCurrentPinballGame->unk2A6 = 0;
gCurrentPinballGame->unk16F = 1;
gCurrentPinballGame->unk174 = 0x40;
gCurrentPinballGame->rubyPondContentsChanging = 1;
gCurrentPinballGame->rubyPondChangeTimer = 0x40;
gCurrentPinballGame->unk2AA = 0;
}

View File

@ -3,6 +3,7 @@
#include "main.h"
#include "m4a.h"
#include "constants/bg_music.h"
#include "constants/ruby_states.h"
extern const void (*gUnknown_086AD4C4[])(void);
extern const void (*gUnknown_086AD4E8[])(void);
@ -50,7 +51,7 @@ void RubyBoardProcess_3A_19A20(void)
gCurrentPinballGame->unk170[0] = 10;
gCurrentPinballGame->unk170[1] = 10;
gCurrentPinballGame->unk170[2] = 10;
gCurrentPinballGame->unk16C = 0;
gCurrentPinballGame->rubyPondState = RUBY_POND_STATE_CHINCHOU_STAGGERED;
sub_1EC48();
sub_1F158();
@ -246,7 +247,7 @@ void sub_19E10(void)
if (gCurrentPinballGame->unk68 < 220)
{
sub_23E18();
if (gCurrentPinballGame->unk2A4 != 0)
if (gCurrentPinballGame->shouldProcessWhiscash)
{
sub_1DC7C();
}

View File

@ -3,6 +3,7 @@
#include "m4a.h"
#include "constants/bg_music.h"
#include "constants/dusclops_states.h"
#include "constants/ruby_states.h"
extern const u16 gUnknown_08254B10[];
extern const u16 gUnknown_08257390[];
@ -95,7 +96,7 @@ s16 COLLISION_CHECK_RUBY_14E08(struct Vector16 *arg0, u16* arg1) {
break;
case 4:
gCurrentPinballGame->unk2A2 = 2;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_2;
gCurrentPinballGame->unk1F = 1;
some_enum = 0;
break;
@ -123,13 +124,13 @@ void sub_15054(struct Vector16* arg0, u16* arg1, u8* arg2)
if (gCurrentPinballGame->unk24 != 0)
return;
if (gCurrentPinballGame->unk2A4 != 0)
if (gCurrentPinballGame->shouldProcessWhiscash != 0)
{
if (gCurrentPinballGame->unk2A3 == 0)
return;
deltaX = arg0->x + gCurrentPinballGame->unk184[0].x;
deltaY = arg0->y + gCurrentPinballGame->unk184[0].y;
deltaX = arg0->x + gCurrentPinballGame->rubyBumperCollisionPosition[0].x;
deltaY = arg0->y + gCurrentPinballGame->rubyBumperCollisionPosition[0].y;
if (deltaX > 79U)
return;
@ -145,10 +146,10 @@ void sub_15054(struct Vector16* arg0, u16* arg1, u8* arg2)
*arg1 = maskedResult;
if (gCurrentPinballGame->unk2A2 <= 1)
if (gCurrentPinballGame->whiscashState <= WHISCASH_STATE_1)
{
*arg2 = lowerNibble;
gCurrentPinballGame->unk2A2 = 7;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_7;
return;
}
@ -159,8 +160,8 @@ void sub_15054(struct Vector16* arg0, u16* arg1, u8* arg2)
if (0xF & *arg2)
return;
deltaX = arg0->x + (u16) gCurrentPinballGame->unk184[0].x;
deltaY = arg0->y + (u16) gCurrentPinballGame->unk184[0].y;
deltaX = arg0->x + (u16) gCurrentPinballGame->rubyBumperCollisionPosition[0].x;
deltaY = arg0->y + (u16) gCurrentPinballGame->rubyBumperCollisionPosition[0].y;
if (deltaX <= 63U && deltaY <= 63U)
{
@ -173,8 +174,8 @@ void sub_15054(struct Vector16* arg0, u16* arg1, u8* arg2)
if (lowerNibble == 0)
{
deltaX = gCurrentPinballGame->unk184[1].x + arg0->x;
deltaY = gCurrentPinballGame->unk184[1].y + arg0->y;
deltaX = gCurrentPinballGame->rubyBumperCollisionPosition[1].x + arg0->x;
deltaY = gCurrentPinballGame->rubyBumperCollisionPosition[1].y + arg0->y;
if (deltaX <= 63U && deltaY <= 63U)
{
@ -186,8 +187,8 @@ void sub_15054(struct Vector16* arg0, u16* arg1, u8* arg2)
if (lowerNibble == 0)
{
deltaX = gCurrentPinballGame->unk184[2].x + arg0->x;
deltaY = gCurrentPinballGame->unk184[2].y + arg0->y;
deltaX = gCurrentPinballGame->rubyBumperCollisionPosition[2].x + arg0->x;
deltaY = gCurrentPinballGame->rubyBumperCollisionPosition[2].y + arg0->y;
if (deltaX <= 63U && deltaY <= 63U)
{
@ -205,7 +206,7 @@ void sub_15054(struct Vector16* arg0, u16* arg1, u8* arg2)
}
}
if (gCurrentPinballGame->unk16F == 0)
if (gCurrentPinballGame->rubyPondContentsChanging == 0)
gCurrentPinballGame->unk170[ix] = 107;
*arg1 = maskedResult;
@ -337,8 +338,8 @@ void sub_153CC(s32 arg0, s16* arg1, u16* arg2)
else if (gCurrentPinballGame->ball->positionQ0.x > 91)
{
gCurrentPinballGame->scoreAddedInFrame = 2000;
gCurrentPinballGame->unk174 = 0;
gCurrentPinballGame->unk16F = 1;
gCurrentPinballGame->rubyPondChangeTimer = 0;
gCurrentPinballGame->rubyPondContentsChanging = 1;
}
else
{
@ -940,8 +941,8 @@ void sub_162B8(struct Vector16 *arg0, s16 *arg1, u8 *arg2) {
if (gCurrentPinballGame->unk24 != 0)
return;
deltaX = arg0->x + gCurrentPinballGame->unk184[0].x;
deltaY = arg0->y + gCurrentPinballGame->unk184[0].y;
deltaX = arg0->x + gCurrentPinballGame->rubyBumperCollisionPosition[0].x;
deltaY = arg0->y + gCurrentPinballGame->rubyBumperCollisionPosition[0].y;
if (deltaX <= 63U && deltaY <= 63U)
{
@ -951,8 +952,8 @@ void sub_162B8(struct Vector16 *arg0, s16 *arg1, u8 *arg2) {
}
if (lowerNibble == 0)
{
deltaX = gCurrentPinballGame->unk184[1].x + arg0->x;
deltaY = gCurrentPinballGame->unk184[1].y + arg0->y;
deltaX = gCurrentPinballGame->rubyBumperCollisionPosition[1].x + arg0->x;
deltaY = gCurrentPinballGame->rubyBumperCollisionPosition[1].y + arg0->y;
if (deltaX <= 63U && deltaY <= 63U)
{
@ -963,8 +964,8 @@ void sub_162B8(struct Vector16 *arg0, s16 *arg1, u8 *arg2) {
if (lowerNibble == 0)
{
deltaX = gCurrentPinballGame->unk184[2].x + arg0->x;
deltaY = gCurrentPinballGame->unk184[2].y + arg0->y;
deltaX = gCurrentPinballGame->rubyBumperCollisionPosition[2].x + arg0->x;
deltaY = gCurrentPinballGame->rubyBumperCollisionPosition[2].y + arg0->y;
if (deltaX <= 63U && deltaY <= 63U)
{

View File

@ -4,6 +4,7 @@
#include "m4a.h"
#include "constants/ereader.h"
#include "constants/fields.h"
#include "constants/ruby_states.h"
extern struct PinballGame gUnknown_02000000;
@ -409,7 +410,7 @@ void sub_4A6A0(void)
gCurrentPinballGame->ball->unk0 = 1;
gCurrentPinballGame->unk1F = 1;
gCurrentPinballGame->unk730 = 0;
gCurrentPinballGame->unk2A2 = 5;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_5;
gCurrentPinballGame->unk4C = 0;
gCurrentPinballGame->unk4E = 118;
break;

View File

@ -2,6 +2,7 @@
#include "main.h"
#include "m4a.h"
#include "constants/bg_music.h"
#include "constants/ruby_states.h"
void sub_1AAA0(void);
void sub_1AA38(void);
@ -292,7 +293,7 @@ void sub_1ADF4(void)
gCurrentPinballGame->unk28++;
else
{
if (gCurrentPinballGame->scoreHi != 0 && gCurrentPinballGame->unk16C == 4)
if (gCurrentPinballGame->scoreHi != 0 && gCurrentPinballGame->rubyPondState == RUBY_POND_STATE_LOTAD)
sub_22978();
else
sub_22C6C();
@ -300,7 +301,7 @@ void sub_1ADF4(void)
}
else
{
if (gCurrentPinballGame->scoreHi != 0 && gCurrentPinballGame->unk16C == 4)
if (gCurrentPinballGame->scoreHi != 0 && gCurrentPinballGame->rubyPondState == RUBY_POND_STATE_LOTAD)
sub_22A30();
else
sub_22D54();

View File

@ -2,6 +2,7 @@
#include "m4a.h"
#include "main.h"
#include "constants/bg_music.h"
#include "constants/ruby_states.h"
extern const u8 gUnknown_0847FD0C[][0x100];
extern const s16 gUnknown_086ADEB0[][2];
@ -588,8 +589,8 @@ void sub_1DC7C(void)
var0 = var1[0];
DmaCopy16(3, gUnknown_081379D8 + gCurrentPinballGame->unk6F * 0x60, (void *)0x05000320, 0x20);
DmaCopy16(3, gUnknown_084B7FEC[var0], (void *)0x06014680, 0x460);
gCurrentPinballGame->unk184[0].x = -248;
gCurrentPinballGame->unk184[0].y = -316;
gCurrentPinballGame->rubyBumperCollisionPosition[0].x = -248;
gCurrentPinballGame->rubyBumperCollisionPosition[0].y = -316;
group->baseX = var1[2] + 124u - gCurrentPinballGame->unk58;
group->baseY = var1[3] + 150u - gCurrentPinballGame->unk5A;
for (i = 0; i < 4; i++)
@ -606,6 +607,7 @@ void sub_1DC7C(void)
}
}
//Ruby Pond + Whiscash
void sub_1DDDC(void)
{
s16 i;
@ -617,26 +619,29 @@ void sub_1DDDC(void)
struct Vector32 tempVec2;
int squaredMagnitude;
if (gCurrentPinballGame->unk2A4)
// 2A4 = wishcash present
if (gCurrentPinballGame->shouldProcessWhiscash)
{
// If board is currently in one of the modes (catch/etc) force reset to the 3 chinchou
if (gCurrentPinballGame->unk13 > 2)
gCurrentPinballGame->unk16F = 1;
gCurrentPinballGame->rubyPondContentsChanging = 1;
if (gCurrentPinballGame->unk16F)
// Don't immediately force change state if Wishcash is actively doing something
if (gCurrentPinballGame->rubyPondContentsChanging)
{
if (gCurrentPinballGame->unk2A2 < 2)
if (gCurrentPinballGame->whiscashState < WHISCASH_STATE_2)
{
gCurrentPinballGame->unk2A2 = 9;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_9;
gCurrentPinballGame->unk2A5 = 8;
gCurrentPinballGame->unk2A6 = 0;
}
gCurrentPinballGame->unk16F = 0;
gCurrentPinballGame->rubyPondContentsChanging = 0;
}
switch (gCurrentPinballGame->unk2A2)
switch (gCurrentPinballGame->whiscashState)
{
case 0:
case WHISCASH_STATE_0:
if (gUnknown_086AD862[gCurrentPinballGame->unk2A5][1] > gCurrentPinballGame->unk2A6)
{
gCurrentPinballGame->unk2A6++;
@ -646,26 +651,26 @@ void sub_1DDDC(void)
gCurrentPinballGame->unk2A6 = 0;
gCurrentPinballGame->unk2A5++;
if (gCurrentPinballGame->unk2A5 == 4)
gCurrentPinballGame->unk2A2 = 1;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_1;
if (gCurrentPinballGame->unk2A5 == 2)
m4aSongNumStart(SE_UNKNOWN_0xD3);
}
break;
case 1:
case WHISCASH_STATE_1:
gCurrentPinballGame->unk2A5 = (gCurrentPinballGame->unk2A6 % 44) / 22 + 4;
gCurrentPinballGame->unk2A6++;
break;
case 2:
case WHISCASH_STATE_2:
gCurrentPinballGame->unk2A5 = 6;
gCurrentPinballGame->unk2A6 = 0;
gCurrentPinballGame->unk2A2 = 3;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_3;
gCurrentPinballGame->ball->oamPriority = 0;
gCurrentPinballGame->scoreAddedInFrame = 5000;
m4aSongNumStart(SE_UNKNOWN_0xD5);
playRumbleType(7);
break;
case 3:
case WHISCASH_STATE_3:
if (gUnknown_086AD862[gCurrentPinballGame->unk2A5][1] > gCurrentPinballGame->unk2A6)
{
gCurrentPinballGame->unk2A6++;
@ -678,7 +683,7 @@ void sub_1DDDC(void)
{
gCurrentPinballGame->unk2A5 = 12;
gCurrentPinballGame->unk2A6 = 65;
gCurrentPinballGame->unk2A2 = 4;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_4;
}
if (gCurrentPinballGame->unk2A5 == 9)
@ -706,7 +711,7 @@ void sub_1DDDC(void)
if (gCurrentPinballGame->unk2A5 == 8)
gCurrentPinballGame->ball->unk0 = 1;
break;
case 4:
case WHISCASH_STATE_4:
gCurrentPinballGame->unk1100 = 1;
if (gCurrentPinballGame->unk2A6 == 65)
{
@ -720,7 +725,7 @@ void sub_1DDDC(void)
gMain.blendBrightness = 16 - gCurrentPinballGame->unk2A6 / 4;
if (gCurrentPinballGame->unk2A6 == 0)
{
gCurrentPinballGame->unk284 = 7;
gCurrentPinballGame->unk284 = FIELD_SPHEAL;
gCurrentPinballGame->unk282 = 1;
gCurrentPinballGame->unk73C = gCurrentPinballGame->unk72E;
gCurrentPinballGame->catchModeArrows = gCurrentPinballGame->unk72F;
@ -728,13 +733,13 @@ void sub_1DDDC(void)
}
}
break;
case 5:
case WHISCASH_STATE_5: //from board initialization
gCurrentPinballGame->unk2A5 = 12;
gCurrentPinballGame->unk2A6 = 0;
gCurrentPinballGame->unk2A2 = 6;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_6;
gCurrentPinballGame->ball->oamPriority = 0;
break;
case 6:
case WHISCASH_STATE_6:
if (gUnknown_086AD862[gCurrentPinballGame->unk2A5][1] > gCurrentPinballGame->unk2A6)
{
gCurrentPinballGame->unk2A6++;
@ -746,7 +751,7 @@ void sub_1DDDC(void)
if (gCurrentPinballGame->unk2A5 == 31)
{
gCurrentPinballGame->unk2A5 = 0;
gCurrentPinballGame->unk2A2 = 10;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_10;
}
if (gCurrentPinballGame->unk2A5 == 21)
@ -784,17 +789,17 @@ void sub_1DDDC(void)
if (gCurrentPinballGame->unk2A5 == 22)
gCurrentPinballGame->unk1F = 0;
break;
case 7:
case WHISCASH_STATE_7:
gCurrentPinballGame->unk2A5 = 31;
gCurrentPinballGame->unk2A6 = 0;
gCurrentPinballGame->unk2A2 = 8;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_8;
gCurrentPinballGame->scoreAddedInFrame = 10;
m4aSongNumStart(SE_UNKNOWN_0xB6);
playRumbleType(7);
if (gCurrentPinballGame->unk724)
gCurrentPinballGame->unk724 = 1;
break;
case 8:
case WHISCASH_STATE_8:
if (gUnknown_086AD862[gCurrentPinballGame->unk2A5][1] > gCurrentPinballGame->unk2A6)
{
gCurrentPinballGame->unk2A6++;
@ -806,16 +811,17 @@ void sub_1DDDC(void)
if (gCurrentPinballGame->unk2A5 == 46)
{
gCurrentPinballGame->unk2A5 = 0;
gCurrentPinballGame->unk2A2 = 10;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_10;
}
if (gCurrentPinballGame->unk2A5 == 42)
m4aSongNumStart(SE_UNKNOWN_0xD4);
if (gCurrentPinballGame->unk2A5 == 33)
m4aSongNumStart(SE_UNKNOWN_0x14C);
m4aSongNumStart(SE_UNKNOWN_0x14C); //Wishcash angry
}
// Heavy shaking starts
if (gCurrentPinballGame->unk2A5 == 45)
{
gCurrentPinballGame->unk2AA = gUnknown_086AD9EC[gCurrentPinballGame->unk2A6 % 8];
@ -826,7 +832,7 @@ void sub_1DDDC(void)
playRumbleType(12);
}
break;
case 9:
case WHISCASH_STATE_9: //Early Exit (mode started)
if (gUnknown_086AD862[gCurrentPinballGame->unk2A5][1] > gCurrentPinballGame->unk2A6)
{
gCurrentPinballGame->unk2A6++;
@ -838,126 +844,126 @@ void sub_1DDDC(void)
if (gCurrentPinballGame->unk2A5 == 13)
{
gCurrentPinballGame->unk2A5 = 0;
gCurrentPinballGame->unk2A2 = 10;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_10;
}
if (gCurrentPinballGame->unk2A5 == 9)
m4aSongNumStart(SE_UNKNOWN_0xD4);
}
break;
case 10:
gCurrentPinballGame->unk2A4 = 0;
case WHISCASH_STATE_10: //cleanup
gCurrentPinballGame->shouldProcessWhiscash = 0;
gCurrentPinballGame->unk2A5 = 0;
gCurrentPinballGame->unk2A6 = 0;
gCurrentPinballGame->unk16F = 1;
gCurrentPinballGame->unk174 = 64;
gCurrentPinballGame->rubyPondContentsChanging = 1;
gCurrentPinballGame->rubyPondChangeTimer = 64;
gCurrentPinballGame->unk2AA = 0;
break;
}
}
else
{
if (gCurrentPinballGame->unk16F)
if (gCurrentPinballGame->rubyPondContentsChanging)
{
if (gCurrentPinballGame->unk174 < 144)
if (gCurrentPinballGame->rubyPondChangeTimer < 144)
{
gCurrentPinballGame->unk170[0] = gUnknown_08137968[gCurrentPinballGame->unk174 / 8];
gCurrentPinballGame->unk170[0] = gUnknown_08137968[gCurrentPinballGame->rubyPondChangeTimer / 8];
gCurrentPinballGame->unk170[1] = gCurrentPinballGame->unk170[0];
gCurrentPinballGame->unk170[2] = gCurrentPinballGame->unk170[0];
}
else
{
gCurrentPinballGame->unk16F = 0;
gCurrentPinballGame->rubyPondContentsChanging = 0;
}
if (gCurrentPinballGame->unk170[0] == 10)
{
if (gCurrentPinballGame->unk174 % 8 == 0 && gCurrentPinballGame->unk174 / 8 == 8)
if (gCurrentPinballGame->rubyPondChangeTimer % 8 == 0 && gCurrentPinballGame->rubyPondChangeTimer / 8 == 8)
{
gCurrentPinballGame->unk2A8++;
if (gCurrentPinballGame->unk2A8 < 3 || gCurrentPinballGame->unk13 > 2)
{
var2 = (gMain.systemFrameCount % 5) + 1;
if (gCurrentPinballGame->unk16C == var2)
gCurrentPinballGame->unk16C = ((gMain.systemFrameCount + 1) % 5) + 1;
if (gCurrentPinballGame->rubyPondState == var2)
gCurrentPinballGame->rubyPondState = ((gMain.systemFrameCount + 1) % 5) + 1;
else
gCurrentPinballGame->unk16C = var2;
gCurrentPinballGame->rubyPondState = var2;
}
else
{
var2 = (gMain.systemFrameCount % 6) + 1;
if (gCurrentPinballGame->unk16C == var2)
gCurrentPinballGame->unk16C = ((gMain.systemFrameCount + 1) % 6) + 1;
if (gCurrentPinballGame->rubyPondState == var2)
gCurrentPinballGame->rubyPondState = ((gMain.systemFrameCount + 1) % 6) + 1;
else
gCurrentPinballGame->unk16C = var2;
gCurrentPinballGame->rubyPondState = var2;
}
if (gCurrentPinballGame->unk162)
{
gCurrentPinballGame->unk162 = 0;
gCurrentPinballGame->unk16C = 6;
gCurrentPinballGame->rubyPondState = RUBY_POND_STATE_WHISCASH;
}
if (gCurrentPinballGame->unk16C == 6)
if (gCurrentPinballGame->rubyPondState == RUBY_POND_STATE_WHISCASH)
{
gCurrentPinballGame->unk2A4 = 1;
gCurrentPinballGame->unk2A2 = 0;
gCurrentPinballGame->shouldProcessWhiscash = 1;
gCurrentPinballGame->whiscashState = WHISCASH_STATE_0;
gCurrentPinballGame->unk2A6 = 0;
gCurrentPinballGame->unk2A5 = 0;
gCurrentPinballGame->unk16F = 0;
gCurrentPinballGame->rubyPondContentsChanging = 0;
gCurrentPinballGame->unk2A8 = 0;
}
if (gCurrentPinballGame->unk16C == 5)
if (gCurrentPinballGame->rubyPondState == RUBY_POND_STATE_CHINCHOU_SINGLE_CLOCKWISE)
{
gCurrentPinballGame->unk178[0].x = gUnknown_086AD9DC[0].x * 10;
gCurrentPinballGame->unk178[0].y = gUnknown_086AD9DC[0].y * 10;
gCurrentPinballGame->rubyBumperLogicPosition[0].x = gUnknown_086AD9DC[0].x * 10;
gCurrentPinballGame->rubyBumperLogicPosition[0].y = gUnknown_086AD9DC[0].y * 10;
}
}
}
gCurrentPinballGame->unk174++;
if (gCurrentPinballGame->unk174 == 32)
gCurrentPinballGame->rubyPondChangeTimer++;
if (gCurrentPinballGame->rubyPondChangeTimer == 32)
m4aSongNumStart(SE_UNKNOWN_0xC9);
switch (gCurrentPinballGame->unk16C)
switch (gCurrentPinballGame->rubyPondState)
{
case 0:
case 1:
case 2:
case 3:
if (gCurrentPinballGame->unk174 == 102)
case RUBY_POND_STATE_CHINCHOU_STAGGERED:
case RUBY_POND_STATE_CHINCHOU_CLOCKWISE:
case RUBY_POND_STATE_CHINCHOU_COUNTERCLOCKWISE:
case RUBY_POND_STATE_CHINCHOU_ROWS:
if (gCurrentPinballGame->rubyPondChangeTimer == 102)
m4aSongNumStart(SE_UNKNOWN_0xC8);
if (gCurrentPinballGame->unk174 == 116)
if (gCurrentPinballGame->rubyPondChangeTimer == 116)
m4aSongNumStart(SE_UNKNOWN_0xC8);
if (gCurrentPinballGame->unk174 == 130)
if (gCurrentPinballGame->rubyPondChangeTimer == 130)
m4aSongNumStart(SE_UNKNOWN_0xC8);
break;
case 4:
if (gCurrentPinballGame->unk174 == 102)
case RUBY_POND_STATE_LOTAD:
if (gCurrentPinballGame->rubyPondChangeTimer == 102)
m4aSongNumStart(SE_UNKNOWN_0xC8);
if (gCurrentPinballGame->unk174 == 118)
if (gCurrentPinballGame->rubyPondChangeTimer == 118)
m4aSongNumStart(SE_UNKNOWN_0xC8);
if (gCurrentPinballGame->unk174 == 134)
if (gCurrentPinballGame->rubyPondChangeTimer == 134)
m4aSongNumStart(SE_UNKNOWN_0xC8);
break;
case 5:
if (gCurrentPinballGame->unk174 == 104)
case RUBY_POND_STATE_CHINCHOU_SINGLE_CLOCKWISE:
if (gCurrentPinballGame->rubyPondChangeTimer == 104)
m4aSongNumStart(SE_UNKNOWN_0xC8);
break;
}
}
}
switch (gCurrentPinballGame->unk16C)
switch (gCurrentPinballGame->rubyPondState)
{
case 0:
gCurrentPinballGame->unk178[0].x = 1250;
gCurrentPinballGame->unk178[0].y = 1270;
gCurrentPinballGame->unk178[2].x = 1600;
gCurrentPinballGame->unk178[2].y = 1360;
gCurrentPinballGame->unk178[1].x = 1370;
gCurrentPinballGame->unk178[1].y = 1610;
gCurrentPinballGame->rubyBumperLogicPosition[0].x = 1250;
gCurrentPinballGame->rubyBumperLogicPosition[0].y = 1270;
gCurrentPinballGame->rubyBumperLogicPosition[2].x = 1600;
gCurrentPinballGame->rubyBumperLogicPosition[2].y = 1360;
gCurrentPinballGame->rubyBumperLogicPosition[1].x = 1370;
gCurrentPinballGame->rubyBumperLogicPosition[1].y = 1610;
break;
case 1:
for (i = 0; i < 3; i++)
@ -968,8 +974,8 @@ void sub_1DDDC(void)
var1 = -var1;
gCurrentPinballGame->unk190 = 180;
gCurrentPinballGame->unk178[i].x = (gCurrentPinballGame->unk190 * Cos(angle)) / 20000 + 1380;
gCurrentPinballGame->unk178[i].y = (gCurrentPinballGame->unk190 * Sin(angle)) / 20000 + 1500;
gCurrentPinballGame->rubyBumperLogicPosition[i].x = (gCurrentPinballGame->unk190 * Cos(angle)) / 20000 + 1380;
gCurrentPinballGame->rubyBumperLogicPosition[i].y = (gCurrentPinballGame->unk190 * Sin(angle)) / 20000 + 1500;
}
break;
case 2:
@ -981,8 +987,8 @@ void sub_1DDDC(void)
var1 = -var1;
gCurrentPinballGame->unk190 = 180;
gCurrentPinballGame->unk178[i].x = (gCurrentPinballGame->unk190 * Cos(angle)) / 20000 + 1380;
gCurrentPinballGame->unk178[i].y = (gCurrentPinballGame->unk190 * Sin(angle)) / 20000 + 1500;
gCurrentPinballGame->rubyBumperLogicPosition[i].x = (gCurrentPinballGame->unk190 * Cos(angle)) / 20000 + 1380;
gCurrentPinballGame->rubyBumperLogicPosition[i].y = (gCurrentPinballGame->unk190 * Sin(angle)) / 20000 + 1500;
}
break;
case 3:
@ -992,49 +998,49 @@ void sub_1DDDC(void)
if (var1 < 0)
var1 = -var1;
gCurrentPinballGame->unk178[i + 1].x = (i * 33 + 121) * 10;
gCurrentPinballGame->unk178[i + 1].y = var1 * 5 + 1340;
gCurrentPinballGame->rubyBumperLogicPosition[i + 1].x = (i * 33 + 121) * 10;
gCurrentPinballGame->rubyBumperLogicPosition[i + 1].y = var1 * 5 + 1340;
}
var1 = 23 - (gCurrentPinballGame->unk290 + 23) % 46;
if (var1 < 0)
var1 = 0-var1;
gCurrentPinballGame->unk178[0].x = 1370;
gCurrentPinballGame->unk178[0].y = var1 * 5 + 1620;
gCurrentPinballGame->rubyBumperLogicPosition[0].x = 1370;
gCurrentPinballGame->rubyBumperLogicPosition[0].y = var1 * 5 + 1620;
break;
case 4:
gCurrentPinballGame->unk178[0].x = 1210;
gCurrentPinballGame->unk178[0].y = gUnknown_0813798C[(gCurrentPinballGame->unk290 % 60) / 10] + 1300;
gCurrentPinballGame->unk178[1].x = 1600;
gCurrentPinballGame->unk178[1].y = gUnknown_0813798C[((gCurrentPinballGame->unk290 + 20) % 60) / 10] + 1410;
gCurrentPinballGame->unk178[2].x = 1370;
gCurrentPinballGame->unk178[2].y = gUnknown_0813798C[((gCurrentPinballGame->unk290 + 40) % 60) / 10] + 1660;
gCurrentPinballGame->rubyBumperLogicPosition[0].x = 1210;
gCurrentPinballGame->rubyBumperLogicPosition[0].y = gUnknown_0813798C[(gCurrentPinballGame->unk290 % 60) / 10] + 1300;
gCurrentPinballGame->rubyBumperLogicPosition[1].x = 1600;
gCurrentPinballGame->rubyBumperLogicPosition[1].y = gUnknown_0813798C[((gCurrentPinballGame->unk290 + 20) % 60) / 10] + 1410;
gCurrentPinballGame->rubyBumperLogicPosition[2].x = 1370;
gCurrentPinballGame->rubyBumperLogicPosition[2].y = gUnknown_0813798C[((gCurrentPinballGame->unk290 + 40) % 60) / 10] + 1660;
break;
case 5:
tempVec.x = gUnknown_086AD9DC[gCurrentPinballGame->unk16E].x * 10 - gCurrentPinballGame->unk178[0].x;
tempVec.y = gUnknown_086AD9DC[gCurrentPinballGame->unk16E].y * 10 - gCurrentPinballGame->unk178[0].y;
tempVec.x = gUnknown_086AD9DC[gCurrentPinballGame->unk16E].x * 10 - gCurrentPinballGame->rubyBumperLogicPosition[0].x;
tempVec.y = gUnknown_086AD9DC[gCurrentPinballGame->unk16E].y * 10 - gCurrentPinballGame->rubyBumperLogicPosition[0].y;
squaredMagnitude = (tempVec.x * tempVec.x) + (tempVec.y * tempVec.y);
angle2 = ArcTan2(tempVec.x, -tempVec.y);
tempVec2.x = (Cos(angle2) * 7) / 20000;
tempVec2.y = (Sin(angle2) * -7) / 20000;
gCurrentPinballGame->unk178[0].x += tempVec2.x;
gCurrentPinballGame->unk178[0].y += tempVec2.y;
gCurrentPinballGame->rubyBumperLogicPosition[0].x += tempVec2.x;
gCurrentPinballGame->rubyBumperLogicPosition[0].y += tempVec2.y;
if (squaredMagnitude < 2500)
gCurrentPinballGame->unk16E = Random() % 4;
gCurrentPinballGame->unk178[1].x = 0;
gCurrentPinballGame->unk178[1].y = -300;
gCurrentPinballGame->unk178[2].x = 0;
gCurrentPinballGame->unk178[2].y = -300;
gCurrentPinballGame->rubyBumperLogicPosition[1].x = 0;
gCurrentPinballGame->rubyBumperLogicPosition[1].y = -300;
gCurrentPinballGame->rubyBumperLogicPosition[2].x = 0;
gCurrentPinballGame->rubyBumperLogicPosition[2].y = -300;
break;
case 6:
gCurrentPinballGame->unk178[0].x = 0;
gCurrentPinballGame->unk178[0].y = -300;
gCurrentPinballGame->unk178[1].x = 0;
gCurrentPinballGame->unk178[1].y = -300;
gCurrentPinballGame->unk178[2].x = 0;
gCurrentPinballGame->unk178[2].y = -300;
gCurrentPinballGame->rubyBumperLogicPosition[0].x = 0;
gCurrentPinballGame->rubyBumperLogicPosition[0].y = -300;
gCurrentPinballGame->rubyBumperLogicPosition[1].x = 0;
gCurrentPinballGame->rubyBumperLogicPosition[1].y = -300;
gCurrentPinballGame->rubyBumperLogicPosition[2].x = 0;
gCurrentPinballGame->rubyBumperLogicPosition[2].y = -300;
break;
}
}
@ -1067,7 +1073,7 @@ void sub_1EC48(void)
{
if (gCurrentPinballGame->unk6C6 == 0)
{
if (gCurrentPinballGame->unk16C == 4)
if (gCurrentPinballGame->rubyPondState == RUBY_POND_STATE_LOTAD)
{
gMain.modeChangeFlags |= MODE_CHANGE_BANNER;
gCurrentPinballGame->unkEA = 50;
@ -1117,7 +1123,7 @@ void sub_1EC48(void)
}
group = &gMain.spriteGroups[62];
if (gCurrentPinballGame->unk16C == 4)
if (gCurrentPinballGame->rubyPondState == RUBY_POND_STATE_LOTAD)
{
for (i = 0; i < 3; i++)
{
@ -1177,13 +1183,14 @@ void sub_1EC48(void)
for (i = 0; i < 3; i++)
{
group->baseX = gCurrentPinballGame->unk178[i].x / 10 - gCurrentPinballGame->unk58 - 8;
group->baseY = gCurrentPinballGame->unk178[i].y / 10 - gCurrentPinballGame->unk5A - 4;
gCurrentPinballGame->unk184[i].x = (-(gCurrentPinballGame->unk178[i].x / 10) + 8) * 2;
gCurrentPinballGame->unk184[i].y = (-(gCurrentPinballGame->unk178[i].y / 10) + 7) * 2;
group->baseX = gCurrentPinballGame->rubyBumperLogicPosition[i].x / 10 - gCurrentPinballGame->unk58 - 8;
group->baseY = gCurrentPinballGame->rubyBumperLogicPosition[i].y / 10 - gCurrentPinballGame->unk5A - 4;
gCurrentPinballGame->rubyBumperCollisionPosition[i].x = (-(gCurrentPinballGame->rubyBumperLogicPosition[i].x / 10) + 8) * 2;
gCurrentPinballGame->rubyBumperCollisionPosition[i].y = (-(gCurrentPinballGame->rubyBumperLogicPosition[i].y / 10) + 7) * 2;
if (group->baseY < -40)
group->baseY = -40;
//sprites have a left/right half.
for (j = 0; j < 2; j++)
{
oamSimple = &group->oam[j + i * 2];

View File

@ -2,6 +2,7 @@
#include "m4a.h"
#include "main.h"
#include "constants/bg_music.h"
#include "constants/ruby_states.h"
#define BONUS_CATCH_TIME 7200 //2 minutes, 60FPS
@ -2556,7 +2557,7 @@ void sub_260B8(void)
gCurrentPinballGame->unk170[1] = 0;
gCurrentPinballGame->unk170[2] = 0;
}
gCurrentPinballGame->unk174 = 0;
gCurrentPinballGame->rubyPondChangeTimer = 0;
break;
case 2:
if (gCurrentPinballGame->unk5FC == 0)
@ -2567,16 +2568,16 @@ void sub_260B8(void)
if (gMain.selectedField == FIELD_RUBY)
{
if (gCurrentPinballGame->unk174 < 143)
gCurrentPinballGame->unk170[0] = gUnknown_08137944[gCurrentPinballGame->unk174 / 8];
if (gCurrentPinballGame->rubyPondChangeTimer < 143)
gCurrentPinballGame->unk170[0] = gUnknown_08137944[gCurrentPinballGame->rubyPondChangeTimer / 8];
if (gCurrentPinballGame->unk174 >= 18 && gCurrentPinballGame->unk174 < 161)
gCurrentPinballGame->unk170[2] = gUnknown_08137944[(gCurrentPinballGame->unk174 - 18) / 8];
if (gCurrentPinballGame->rubyPondChangeTimer >= 18 && gCurrentPinballGame->rubyPondChangeTimer < 161)
gCurrentPinballGame->unk170[2] = gUnknown_08137944[(gCurrentPinballGame->rubyPondChangeTimer - 18) / 8];
if (gCurrentPinballGame->unk174 >= 36 && gCurrentPinballGame->unk174 < 179)
gCurrentPinballGame->unk170[1] = gUnknown_08137944[(gCurrentPinballGame->unk174 - 36) / 8];
if (gCurrentPinballGame->rubyPondChangeTimer >= 36 && gCurrentPinballGame->rubyPondChangeTimer < 179)
gCurrentPinballGame->unk170[1] = gUnknown_08137944[(gCurrentPinballGame->rubyPondChangeTimer - 36) / 8];
gCurrentPinballGame->unk174++;
gCurrentPinballGame->rubyPondChangeTimer++;
}
gCurrentPinballGame->unk6E0 = (gCurrentPinballGame->unk6F0 * 32) / gCurrentPinballGame->unk6F2;
@ -2620,7 +2621,7 @@ void sub_260B8(void)
gCurrentPinballGame->unk163 = 1;
gCurrentPinballGame->unk21 = 1;
gCurrentPinballGame->unk724 = 3600;
gCurrentPinballGame->unk16C = 2;
gCurrentPinballGame->rubyPondState = RUBY_POND_STATE_CHINCHOU_COUNTERCLOCKWISE;
}
}

View File

@ -1417,10 +1417,10 @@ void sub_2A354(void)
}
break;
case 22:
if (gCurrentPinballGame->unk6DE == 150 && gCurrentPinballGame->unk2A4 == 0)
if (gCurrentPinballGame->unk6DE == 150 && gCurrentPinballGame->shouldProcessWhiscash == 0)
{
gCurrentPinballGame->unk174 = 0;
gCurrentPinballGame->unk16F = 1;
gCurrentPinballGame->rubyPondChangeTimer = 0;
gCurrentPinballGame->rubyPondContentsChanging = 1;
gCurrentPinballGame->unk162 = 1;
}
break;

View File

@ -895,6 +895,7 @@ void sub_2E67C(void)
}
}
//Sapphire pond - Pelliper
void sub_2E6AC(void)
{
s16 i;
@ -1679,12 +1680,12 @@ void sub_2FCD0(void)
void sub_300D8(void)
{
gCurrentPinballGame->unk178[0].x = 920;
gCurrentPinballGame->unk178[0].y = (133 - (gCurrentPinballGame->unk290 % 60) / 30) * 10;
gCurrentPinballGame->unk178[1].x = 1260;
gCurrentPinballGame->unk178[1].y = (131 - ((gCurrentPinballGame->unk290 + 10) % 60) / 30) * 10;
gCurrentPinballGame->unk178[2].x = 1080;
gCurrentPinballGame->unk178[2].y = (161 - ((gCurrentPinballGame->unk290 + 20) % 60) / 30) * 10;
gCurrentPinballGame->rubyBumperLogicPosition[0].x = 920;
gCurrentPinballGame->rubyBumperLogicPosition[0].y = (133 - (gCurrentPinballGame->unk290 % 60) / 30) * 10;
gCurrentPinballGame->rubyBumperLogicPosition[1].x = 1260;
gCurrentPinballGame->rubyBumperLogicPosition[1].y = (131 - ((gCurrentPinballGame->unk290 + 10) % 60) / 30) * 10;
gCurrentPinballGame->rubyBumperLogicPosition[2].x = 1080;
gCurrentPinballGame->rubyBumperLogicPosition[2].y = (161 - ((gCurrentPinballGame->unk290 + 20) % 60) / 30) * 10;
}
void sub_30178(void)
@ -1766,10 +1767,10 @@ void sub_30178(void)
DmaCopy16(3, &gUnknown_0845690C[index], (void *)0x060133A0 + i * 0x200, 0x200);
group->baseX = gCurrentPinballGame->unk178[i].x / 10 - gCurrentPinballGame->unk58 - 8;
group->baseY = gCurrentPinballGame->unk178[i].y / 10 - gCurrentPinballGame->unk5A - 10;
gCurrentPinballGame->unk184[i].x = (-(gCurrentPinballGame->unk178[i].x / 10) + 8) * 2;
gCurrentPinballGame->unk184[i].y = (-(gCurrentPinballGame->unk178[i].y / 10) + 3) * 2;
group->baseX = gCurrentPinballGame->rubyBumperLogicPosition[i].x / 10 - gCurrentPinballGame->unk58 - 8;
group->baseY = gCurrentPinballGame->rubyBumperLogicPosition[i].y / 10 - gCurrentPinballGame->unk5A - 10;
gCurrentPinballGame->rubyBumperCollisionPosition[i].x = (-(gCurrentPinballGame->rubyBumperLogicPosition[i].x / 10) + 8) * 2;
gCurrentPinballGame->rubyBumperCollisionPosition[i].y = (-(gCurrentPinballGame->rubyBumperLogicPosition[i].y / 10) + 3) * 2;
oamSimple = &group->oam[i];
gOamBuffer[oamSimple->oamId].x = oamSimple->xOffset + group->baseX;