summaryrefslogtreecommitdiff
path: root/src/menu/pauseMenuScreen6.c
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-09-05 22:50:19 +0200
committeranonymous <>2022-10-08 22:32:54 +0200
commit67467fd831d2928715835f8a389b4f464a0f9a7a (patch)
tree261864c07f334c35024033a908b4af8e808caebe /src/menu/pauseMenuScreen6.c
parent756a8a89da46dade06fad1723de88fa5a82cc2ec (diff)
Extract some data
And split up subtasks and world events.
Diffstat (limited to 'src/menu/pauseMenuScreen6.c')
-rw-r--r--src/menu/pauseMenuScreen6.c276
1 files changed, 276 insertions, 0 deletions
diff --git a/src/menu/pauseMenuScreen6.c b/src/menu/pauseMenuScreen6.c
new file mode 100644
index 00000000..4bfcd17a
--- /dev/null
+++ b/src/menu/pauseMenuScreen6.c
@@ -0,0 +1,276 @@
+/**
+ * @file pauseMenuScreen6.c
+ *
+ * @brief Pause Menu Screen 6
+ */
+#include "common.h"
+#include "fileselect.h"
+#include "flags.h"
+#include "functions.h"
+#include "kinstone.h"
+#include "main.h"
+#include "menu.h"
+#include "pauseMenu.h"
+#include "save.h"
+#include "screen.h"
+
+typedef struct {
+ u8 unk0;
+ u8 unk1;
+ u16 unk2;
+ u16 unk4;
+ u16 unk6;
+} struct_sub_080A698C;
+
+extern u8 gUnk_08128E80[];
+
+extern u16 gUnk_02017AA0[];
+
+void sub_080A68D4();
+
+void PauseMenu_Screen_6(void) {
+ extern void (*const gUnk_08128E78[])(void);
+ const struct_gUnk_08128E94* ptr;
+ gUnk_08128E78[gMenu.menuType]();
+ ptr = &gUnk_08128E94[gMenu.field_0x3];
+ gScreen.bg1.yOffset = -ptr->unk5;
+ gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6;
+ sub_080A66D0();
+}
+
+void sub_080A6650(void) {
+ extern u8 gUnk_08128E84[];
+ u32 temp;
+ sub_080A70AC((KeyButtonLayout*)gUnk_08128E84);
+ temp = gPauseMenuOptions.unk2[4];
+ gMenu.field_0x3 = temp;
+ sub_080A67C4(temp);
+ sub_080A68D4();
+ SetMenuType(1);
+}
+
+void sub_080A667C(void) {
+ u32 uVar1;
+ u32 uVar2;
+ const struct_gUnk_08128E94* ptr;
+
+ gMenu.field_0xc = gUnk_08128E80;
+ ptr = &gUnk_08128E94[gMenu.field_0x3];
+ uVar2 = gMenu.field_0xa;
+ switch (gInput.heldKeys) {
+ case DPAD_UP:
+ if (uVar2 != 0) {
+ uVar2 -= 2;
+ }
+ break;
+ case DPAD_DOWN:
+ uVar1 = ptr->unk2;
+ if (uVar1 > uVar2) {
+ uVar2 += 2;
+ }
+ if (uVar1 < uVar2) {
+ uVar2 = uVar1;
+ }
+ break;
+ }
+
+ gMenu.field_0xa = uVar2;
+ sub_080A6FB4(gMenu.field_0x3, 0);
+}
+
+void sub_080A66D0(void) {
+ u32 bVar2;
+ u32 bVar3;
+ u8 bVar4;
+ u32 uVar5;
+ u32 uVar8;
+ struct_sub_080A698C* ptr;
+ const struct_gUnk_08128E94* ptr2;
+
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd.x = 0x78;
+ ptr2 = &gUnk_08128E94[gMenu.field_0x3];
+ gGenericMenu.unk2c++;
+ if (gGenericMenu.unk2b != 1 && ((gGenericMenu.unk2c & 0x10) != 0)) {
+ gOamCmd._8 = 0x800;
+ if (gMenu.field_0xa != 0) {
+ gOamCmd.y = 0xc;
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x71);
+ }
+ if (ptr2->unk2 > gMenu.field_0xa) {
+ gOamCmd.y = 0x84;
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x72);
+ }
+ }
+ bVar2 = ptr2->unk7;
+ bVar3 = ptr2->unk3;
+ uVar5 = gMenu.field_0xa;
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0xc00;
+ bVar4 = gGenericMenu.unk2c & 0x20;
+
+ for (ptr = (struct_sub_080A698C*)&gMapDataBottomSpecial; ptr->unk2 != 0; ptr++) {
+ uVar8 = 0;
+ if (ptr->unk0 == 1) {
+ if (bVar4 != 0) {
+ uVar8 = 1;
+ }
+ } else if (bVar4 == 0) {
+ uVar8 = 1;
+ }
+
+ if (uVar8 != 0) {
+ gOamCmd.x = ptr->unk4 + bVar2;
+ gOamCmd.y = ptr->unk6 + bVar3 - uVar5;
+ DrawDirect(ptr->unk2, ptr->unk1);
+ }
+ }
+}
+
+void sub_080A67C4(u32 param_1) {
+ u16* puVar2;
+ int i;
+ int iVar4;
+ s32 room;
+ const struct_gUnk_08128E94* ptr;
+
+ LoadPaletteGroup(param_1 + 0xba);
+ iVar4 = param_1 + 0x5f;
+ switch (param_1) {
+ case 0x9:
+ if (CheckGlobalFlag(TATEKAKE_HOUSE)) {
+ iVar4 = 0x70;
+ }
+ break;
+ case 0xb:
+ if (CheckKinstoneFused(KINSTONE_E)) {
+ iVar4 = 0x71;
+ }
+ break;
+ case 0xe:
+ if (gUI.roomControls.area == 8) {
+ room = gUI.roomControls.room;
+ iVar4 = (u8)(room % 3) + 0x72;
+ }
+ break;
+ }
+
+ LoadGfxGroup(iVar4);
+ ptr = &gUnk_08128E94[param_1];
+ puVar2 = &gUnk_02017AA0[gUnk_03003DE4[0] * 0x500];
+
+ for (i = 0; i <= 7; puVar2++, i++) {
+ *puVar2 = 0x1e0a;
+ }
+
+ for (i = 8; i < (int)(ptr->unk5 + ptr->unk4); puVar2++, i++) {
+ *puVar2 = 0x1e0b;
+ }
+
+ for (; i < 0xa0; puVar2++, i++) {
+ *puVar2 = 0x1e0a;
+ }
+
+ SetVBlankDMA((u16*)&gUnk_02017AA0[gUnk_03003DE4[0] * 0x500], (u16*)REG_ADDR_BG3CNT,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) +
+ 0x1);
+ gMenu.field_0xa = ptr->unk2 >> 1;
+ MemClear(&gMapDataBottomSpecial, 0x400);
+}
+
+void sub_080A68D4(void) {
+ u32 uVar1;
+ int iVar6;
+ struct_gUnk_08128F58* pcVar4;
+ u32 i;
+ u32 uVar4;
+ const WorldEvent* ptr;
+
+ if ((gPlayerState.flags & PL_NO_CAP) != 0) {
+ iVar6 = 101;
+ } else {
+ iVar6 = 100;
+ }
+ sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y,
+ DRAW_DIRECT_SPRITE_INDEX, iVar6 + 0x100);
+ uVar1 = sub_080A6F40();
+ uVar1 &= gSave.field_0x20;
+
+ for (pcVar4 = gUnk_08128F58, i = 0; pcVar4->frameIndex != 0; i++, pcVar4++) {
+ if (((1 << i) & uVar1) != 0) {
+ sub_080A698C(pcVar4->unk4, pcVar4->unk6, DRAW_DIRECT_SPRITE_INDEX, pcVar4->unk3);
+ }
+ }
+
+ for (i = 10; i <= 100; i++) {
+ if (CheckKinstoneFused(i) && !sub_0801E810(i)) {
+ uVar4 = gKinstoneWorldEvents[i].unk7;
+ ptr = &gWorldEvents[gKinstoneWorldEvents[i].worldEventId];
+ sub_080A698C(ptr->_c, ptr->_e, DRAW_DIRECT_SPRITE_INDEX, uVar4 + 100);
+ }
+ }
+}
+
+void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4) {
+ int iVar1;
+
+ iVar1 = sub_080A69E0(param_1, param_2);
+ if (0 < iVar1) {
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk0 = param_4 >> 8;
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk1 = param_4;
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk2 = param_3;
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk4 = iVar1;
+ ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk6 = iVar1 >> 0x10;
+ gGenericMenu.unk2d++;
+ }
+}
+
+s32 sub_080A69E0(u32 param_1, u32 param_2) {
+ const struct_08127F94* pbVar1;
+ int iVar3;
+
+ if ((param_1 | param_2) == 0)
+ return -1;
+
+ pbVar1 = sub_080A6A80(param_1, param_2);
+ if (pbVar1 == NULL)
+ return -1;
+
+ if (gMenu.field_0x3 != pbVar1->_4)
+ return -1;
+
+ switch (gMenu.field_0x3) {
+ case 4:
+ case 7:
+ if (gMenu.field_0x3 == 4) {
+ iVar3 = 9;
+ } else {
+ iVar3 = 7;
+ }
+ param_2 -= gAreaRoomHeaders[iVar3]->map_y;
+ break;
+ break;
+ case 15:
+ param_1 -= 0x108;
+ break;
+ }
+
+ param_1 = (s32)((param_1 - pbVar1->_0 * 0x10) * 100) / 0x23a;
+ param_2 = (s32)((param_2 - pbVar1->_1 * 0x10) * 100) / 0x23a;
+ return (param_2 << 0x10) | param_1;
+}
+
+struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2) {
+ struct_08127F94* pbVar1;
+ param_1 >>= 4;
+ param_2 >>= 4;
+
+ for (pbVar1 = gUnk_08127F94; pbVar1->_0 != 0xff; pbVar1++) {
+ if (pbVar1->_0 <= param_1 && pbVar1->_2 >= param_1 && pbVar1->_1 <= param_2 && pbVar1->_3 >= param_2) {
+ return pbVar1;
+ }
+ }
+ return NULL;
+}