summaryrefslogtreecommitdiff
path: root/src/field_select.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/field_select.c')
-rw-r--r--src/field_select.c374
1 files changed, 374 insertions, 0 deletions
diff --git a/src/field_select.c b/src/field_select.c
new file mode 100644
index 0000000..ea6acba
--- /dev/null
+++ b/src/field_select.c
@@ -0,0 +1,374 @@
+#include "global.h"
+#include "main.h"
+#include "m4a.h"
+#include "titlescreen.h"
+
+enum
+{
+ FIELD_RUBY,
+ FIELD_SAPPHIRE,
+};
+
+static void sub_8F94(void);
+static void sub_8C38(void);
+
+struct FieldSelectData
+{
+ u16 unk0;
+ u16 unk2;
+ u16 unk4;
+ u16 unk6;
+ u16 selectedField;
+ u16 state;
+ s16 unkC;
+ s16 unkE;
+ u8 ballSpeed;
+ s16 unk12;
+ s8 unk14;
+ u16 nextMainState;
+};
+
+extern struct FieldSelectData gFieldSelectData;
+
+void FieldSelectMain(void)
+{
+ gFieldSelectStateFuncs[gMain.subState]();
+}
+
+void LoadFieldSelectGraphics(void)
+{
+ ResetSomeGraphicsRelatedStuff();
+
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_FORCED_BLANK | DISPCNT_OBJ_ON;
+
+ REG_BG0CNT = BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(0) | BGCNT_PRIORITY(0) | BGCNT_TXT256x256;
+ REG_DISPCNT |= DISPCNT_BG0_ON;
+
+ REG_BG1CNT = BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(1) | BGCNT_PRIORITY(1) | BGCNT_TXT256x256;
+ REG_DISPCNT |= DISPCNT_BG1_ON;
+
+ REG_BG2CNT = BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(2) | BGCNT_PRIORITY(2) | BGCNT_TXT256x256;
+ REG_DISPCNT |= DISPCNT_BG2_ON;
+
+ gMain.unk16 = REG_DISPCNT;
+
+ DmaCopy16(3, gFieldSelectBGPals, (void *)(PLTT), 0x200);
+ DmaCopy16(3, gFieldSelectWindow_Gfx, (void *)(VRAM + 0x4000), 0x1400);
+ DmaCopy16(3, gFieldSelectMiniFields_Gfx, (void *)(VRAM + 0x8000), 0x3800);
+ DmaCopy16(3, gUnknown_080A2400, (void *)(VRAM), 0x800);
+ DmaCopy16(3, gFieldSelectFrameShadowTilemap, (void *)(VRAM + 0x800), 0x800);
+ DmaCopy16(3, gFieldSelectWindowTilemap, (void *)(VRAM + 0x1000), 0x800);
+ DmaCopy16(3, gFieldSelectSpritePals, (void *)(PLTT + 0x200), 0x200);
+ DmaCopy16(3, gFieldSelectSpriteGfx, (void *)(VRAM + 0x10000), 0x4020);
+
+ sub_CBC();
+ sub_8C38();
+ sub_FD5C(sub_8F94);
+ gMain.subState++;
+ m4aSongNumStart(3);
+}
+
+static void sub_8C38(void)
+{
+ gFieldSelectData.unk0 = 2;
+ gFieldSelectData.unk2 = 3;
+ gFieldSelectData.unk4 = 0;
+ gFieldSelectData.unk6 = 1;
+ gFieldSelectData.selectedField = FIELD_RUBY;
+ gFieldSelectData.state = 0;
+ gFieldSelectData.unkC = 0;
+ gFieldSelectData.unkE = 0;
+ gFieldSelectData.nextMainState = STATE_INTRO;
+ gFieldSelectData.unk12 = 0;
+ gFieldSelectData.unk14 = 0;
+
+ gFieldSelectData.ballSpeed = gMain_saveData.ballSpeed;
+ gMain.unk4 = 0;
+ gUnknown_02002850 = 0;
+}
+
+void sub_8C7C(void)
+{
+ sub_8F94();
+ if ((gMain.heldKeys & (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON)) == (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON))
+ {
+ gUnknown_02002850 = 1;
+ gFieldSelectData.nextMainState = STATE_INTRO;
+ gMain.subState++;
+ }
+ if (gUnknown_02002850 == 0)
+ {
+ switch (gFieldSelectData.state)
+ {
+ case 0:
+ if (gMain.newKeys & DPAD_LEFT)
+ {
+ if (gFieldSelectData.selectedField == FIELD_SAPPHIRE)
+ {
+ m4aSongNumStart(0x6D);
+ gFieldSelectData.selectedField = FIELD_RUBY;
+ gFieldSelectData.unk4 = 0;
+ gFieldSelectData.unk6 = 1;
+ gFieldSelectData.state = 1;
+ }
+ }
+ else if (gMain.newKeys & DPAD_RIGHT)
+ {
+ if (gFieldSelectData.selectedField == FIELD_RUBY)
+ {
+ m4aSongNumStart(0x6D);
+ gFieldSelectData.selectedField = FIELD_SAPPHIRE;
+ gFieldSelectData.unk4 = 1;
+ gFieldSelectData.unk6 = 0;
+ gFieldSelectData.state = 1;
+ }
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ m4aSongNumStart(0x65);
+ gFieldSelectData.state = 2;
+ gFieldSelectData.unk14 = 1;
+ gFieldSelectData.unkE = 0;
+ if (gFieldSelectData.selectedField == FIELD_RUBY)
+ {
+ gFieldSelectData.unk4 = 0;
+ gFieldSelectData.unk6 = 1;
+ gFieldSelectData.unk0 = 2;
+ gFieldSelectData.unk2 = 3;
+ gFieldSelectData.unkC = 0;
+ }
+ else
+ {
+ gFieldSelectData.unk4 = 1;
+ gFieldSelectData.unk6 = 0;
+ gFieldSelectData.unk0 = 7;
+ gFieldSelectData.unk2 = 11;
+ gFieldSelectData.unkC = 0;
+ }
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ m4aSongNumStart(0x66);
+ gMain.subState++;
+ gFieldSelectData.nextMainState = STATE_TITLE;
+ if (gFieldSelectData.selectedField == FIELD_RUBY)
+ {
+ gFieldSelectData.unk4 = 0;
+ gFieldSelectData.unk6 = 1;
+ gFieldSelectData.unk0 = 2;
+ gFieldSelectData.unk2 = 3;
+ gFieldSelectData.unkC = 0;
+ }
+ else
+ {
+ gFieldSelectData.unk4 = 1;
+ gFieldSelectData.unk6 = 0;
+ gFieldSelectData.unk0 = 7;
+ gFieldSelectData.unk2 = 11;
+ gFieldSelectData.unkC = 0;
+ }
+ }
+ if (gMain.unk4 < 2)
+ gMain.unk6 = 0;
+ else
+ gMain.unk6 = 1;
+ break;
+ case 2: // Choose ball speed
+ if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
+ {
+ m4aSongNumStart(0x67);
+ gFieldSelectData.ballSpeed = 1 - gFieldSelectData.ballSpeed;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ m4aSongNumStart(0x65);
+ gFieldSelectData.unkE = 0;
+ gFieldSelectData.unkC = 0;
+ gMain_saveData.ballSpeed = gFieldSelectData.ballSpeed;
+ SaveFile_WriteToSram();
+ gFieldSelectData.state = 3;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ m4aSongNumStart(0x66);
+ gFieldSelectData.unk14 = 0;
+ gFieldSelectData.state = 0;
+ }
+ gFieldSelectData.unkE++;
+ if (gFieldSelectData.unkE > 4)
+ {
+ gFieldSelectData.unkE = 0;
+ gFieldSelectData.unk12 = 1 - gFieldSelectData.unk12;
+ }
+ break;
+ case 1:
+ if (gFieldSelectData.selectedField == FIELD_RUBY)
+ {
+ gFieldSelectData.unk0 = gUnknown_086A6B14.unk0[4 - gFieldSelectData.unkC];
+ gFieldSelectData.unk2 = gUnknown_086A6B14.unkA[4 - gFieldSelectData.unkC];
+ }
+ else
+ {
+ gFieldSelectData.unk0 = gUnknown_086A6B14.unk0[gFieldSelectData.unkC];
+ gFieldSelectData.unk2 = gUnknown_086A6B14.unkA[gFieldSelectData.unkC];
+ }
+ if (!(gMain.frameCount & 1))
+ {
+ if (gFieldSelectData.unkC < 4)
+ {
+ gFieldSelectData.unkC++;
+ }
+ else
+ {
+ gFieldSelectData.unkC = 0;
+ gFieldSelectData.state = 0;
+ }
+ }
+ if (gMain.newKeys & DPAD_LEFT)
+ {
+ if (gFieldSelectData.selectedField == FIELD_SAPPHIRE)
+ {
+ m4aSongNumStart(0x6D);
+ gFieldSelectData.selectedField = FIELD_RUBY;
+ gFieldSelectData.unk4 = 0;
+ gFieldSelectData.unk6 = 1;
+ gFieldSelectData.unk0 = 2;
+ gFieldSelectData.unk2 = 3;
+ gFieldSelectData.unkC = 0;
+ gFieldSelectData.state = 0;
+ }
+ }
+ else if (gMain.newKeys & DPAD_RIGHT)
+ {
+ if (gFieldSelectData.selectedField == FIELD_RUBY)
+ {
+ m4aSongNumStart(0x6D);
+ gFieldSelectData.selectedField = FIELD_SAPPHIRE;
+ gFieldSelectData.unk4 = 1;
+ gFieldSelectData.unk6 = 0;
+ gFieldSelectData.unk0 = 7;
+ gFieldSelectData.unk2 = 11;
+ gFieldSelectData.unkC = 0;
+ gFieldSelectData.state = 0;
+ }
+ }
+ break;
+ case 3:
+ gFieldSelectData.unkE++;
+ if (gFieldSelectData.unkE > 3)
+ {
+ gFieldSelectData.unkE = 0;
+ if (gFieldSelectData.selectedField == FIELD_RUBY)
+ gFieldSelectData.unk4 = 1 - gFieldSelectData.unk4;
+ else
+ gFieldSelectData.unk6 = 1 - gFieldSelectData.unk6;
+ gFieldSelectData.unkC++;
+ if (gFieldSelectData.unkC > 5)
+ {
+ gFieldSelectData.nextMainState = STATE_GAME_MAIN;
+ gMain.subState++;
+ }
+ }
+ break;
+ }
+ gMain.unk4 = gFieldSelectData.selectedField;
+ gMain.unk5 = gFieldSelectData.selectedField;
+ }
+}
+
+void sub_8F64(void)
+{
+ sub_FE04(sub_8F94);
+ m4aMPlayAllStop();
+ sub_D10();
+ gAutoDisplayTitlescreenMenu = TRUE;
+ SetMainGameState(gFieldSelectData.nextMainState);
+}
+
+static void sub_8F94(void)
+{
+ struct SpriteGroup *r6;
+ struct SpriteGroup *r9;
+ struct SpriteGroup *sp0;
+ struct SpriteGroup *r10;
+ struct SpriteGroup *r8;
+ const struct SpriteSet *spriteSet;
+ int i;
+
+ gMain.blendControl = BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2;
+ gMain.blendAlpha = BLDALPHA_BLEND(8, 8);
+ REG_BLDCNT = gMain.blendControl;
+ REG_BLDALPHA = gMain.blendAlpha;
+
+ r6 = &gMain.spriteGroups[0];
+ r9 = &gMain.spriteGroups[1];
+ sp0 = &gMain.spriteGroups[gFieldSelectData.unk0];
+ r10 = &gMain.spriteGroups[gFieldSelectData.unk2];
+ r8 = &gMain.spriteGroups[12 + gFieldSelectData.ballSpeed * 2 + gFieldSelectData.unk12];
+
+ r6->available = gFieldSelectData.unk4;
+ r9->available = gFieldSelectData.unk6;
+ sp0->available = 1;
+ r10->available = 1;
+ r8->available = gFieldSelectData.unk14;
+
+ LoadSpriteSets(gUnknown_086A6AD4, 16, r6);
+
+ if (gFieldSelectData.unk4 == 1)
+ {
+ r6->baseX = 0x25;
+ r6->baseY = 0x18;
+ for (i = 0; i < 2; i++)
+ {
+ gOamBuffer[r6->oam[i].oamId].x = r6->oam[i].xOffset + r6->baseX;
+ gOamBuffer[r6->oam[i].oamId].y = r6->oam[i].yOffset + r6->baseY;
+ }
+ }
+
+ if (gFieldSelectData.unk6 == 1)
+ {
+ r9->baseX = 0x8D;
+ r9->baseY = 0x18;
+ for (i = 0; i < 2; i++)
+ {
+ gOamBuffer[r9->oam[i].oamId].x = r9->oam[i].xOffset + r9->baseX;
+ gOamBuffer[r9->oam[i].oamId].y = r9->oam[i].yOffset + r9->baseY;
+ }
+ }
+
+ sp0->baseX = 32;
+ sp0->baseY = 32;
+ spriteSet = gUnknown_086A6AD4[gFieldSelectData.unk0];
+ for (i = 0; i < spriteSet->count; i++)
+ {
+ gOamBuffer[sp0->oam[i].oamId].objMode = 1;
+ gOamBuffer[sp0->oam[i].oamId].x = sp0->oam[i].xOffset + sp0->baseX;
+ gOamBuffer[sp0->oam[i].oamId].y = sp0->oam[i].yOffset + sp0->baseY;
+ }
+
+ r10->baseX = 0x88;
+ r10->baseY = 32;
+ spriteSet = gUnknown_086A6AD4[gFieldSelectData.unk2];
+ for (i = 0; i < spriteSet->count; i++)
+ {
+ gOamBuffer[r10->oam[i].oamId].objMode = 1;
+ gOamBuffer[r10->oam[i].oamId].x = r10->oam[i].xOffset + r10->baseX;
+ gOamBuffer[r10->oam[i].oamId].y = r10->oam[i].yOffset + r10->baseY;
+ }
+
+ if (r8->available == 1)
+ {
+ r8->baseX = gUnknown_086A6B28[gFieldSelectData.selectedField].x;
+ r8->baseY = gUnknown_086A6B28[gFieldSelectData.selectedField].y;
+ for (i = 0; i < 5; i++)
+ {
+ gOamBuffer[r8->oam[i].oamId].objMode = 0;
+ gOamBuffer[r8->oam[i].oamId].x = r8->oam[i].xOffset + r8->baseX;
+ gOamBuffer[r8->oam[i].oamId].y = r8->oam[i].yOffset + r8->baseY;
+ }
+ }
+
+ sp0->available = 0;
+ r10->available = 0;
+ r8->available = 0;
+}