mirror of
https://github.com/zeldaret/tmc
synced 2026-06-11 21:19:02 -04:00
277 lines
7.1 KiB
C
277 lines
7.1 KiB
C
/**
|
|
* @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) && !CheckFusionMapMarkerDisabled(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;
|
|
}
|