More pause screen code

This commit is contained in:
y.demaisonregne 2023-03-31 22:50:44 +02:00
parent 5978b4dcdf
commit d899078b40
9 changed files with 616 additions and 29 deletions

View File

@ -2,7 +2,7 @@
This is a work in progress decompilation of Metroid - Zero Mission.
2378/2721 functions decompiled (87.39%, 343 left)
2385/2721 functions decompiled (87.65%, 336 left)
Progress can be seen here : https://docs.google.com/spreadsheets/d/1X8XarD5evY8ZI7r_GQqh1pYmdVMbBcINYfRBUlogmKY/edit#gid=0
**This decomp is not shiftable, don't use it as a base to work on anything**

View File

@ -5,7 +5,7 @@
#include "structs/menu.h"
#include "structs/cutscene.h"
u8 unk_68168(u16 param_1, u8 param_2, u8 param_3);
u32 unk_68168(u16 param_1, u8 param_2, u8 param_3);
u8 unk_681c8(void);
u32 PauseScreenUpdateOrStartFading(u8 stage);
void PauseScreenCopyPalramToEwram_Unused(u8 param_1);
@ -14,7 +14,7 @@ void PauseScreenUpdateMapArrows(void);
void PauseScreenUpdateBossIcons(void);
void PauseScreenDrawCompletionInfo(u8 dontDraw);
u8 unk_68a58(u8 param_1);
u8 PauseScreenDrawStatusScreenSamus(u8 param_1);
u8 PauseScreenUpdateStatusScreenOam(u8 param_1);
void PauseScreenUpdateWireframeSamus(u8 param_1);
void unk_68ec0(void);
void PauseScreenUpdateWorldMapHighlight(u8 area);

View File

@ -98,9 +98,24 @@ struct BossFlameData {
};
struct PauseScreenEwramData {
u8 padding[0x9800];
u8 padding_0[0x4000];
u16 easySleepTextFormatted_1[1024];
u16 easySleepTextFormatted_2[1024];
u16 unk_5000[1024];
u16 unk_5800[1024];
u16 unk_6000[1024];
u8 padding_6800[0x800];
u16 statusScreenTilemap[1024];
u16 unk_7800[1024];
u16 unk_8000[1024];
u16 easySleepTilemap[1024];
u16 visorOverlayTilemap[1024];
u16 mapScreenOverlayTilemap[1024];
u16 worldMapOverlayTilemap[1024];
u16 equipmentNamesGfxBackup[1024];
u16 unk_b000[1024];
u16 unk_b800[1024];
u16 unk_c000[1024];
};
struct PauseScreenData {

View File

@ -143,7 +143,4 @@ extern struct Unused_3005504 gUnusedStruct_3005504;
extern u8 gDestinationRoom;
// Temp
extern i8 gCurrentItemBeingAcquired;
#endif

View File

@ -34,7 +34,6 @@ union NonGameplayRAM {
union EwramData {
struct PauseScreenEwramData pauseScreen;
void* voidPointer;
};
extern u16 unk_02035400;

View File

@ -24,6 +24,7 @@
#include "structs/samus.h"
#include "structs/room.h"
#include "structs/bg_clip.h"
#include "structs/text.h"
/**
* @brief 5f8f4 | 464 | Handles the samus close up cutscene

View File

@ -4,6 +4,8 @@
#include "macros.h"
#include "oam_id.h"
#include "event.h"
#include "text.h"
#include "menus/status_screen.h"
#include "data/shortcut_pointers.h"
#include "data/menus/pause_screen_data.h"
@ -21,8 +23,9 @@
#include "structs/display.h"
#include "structs/minimap.h"
#include "structs/game_state.h"
#include "structs/text.h"
u8 unk_68168(u16 param_1, u8 param_2, u8 param_3)
u32 unk_68168(u16 param_1, u8 param_2, u8 param_3)
{
}
@ -294,7 +297,7 @@ u8 unk_68a58(u8 param_1)
* @param param_1 To document
* @return u8 To document
*/
u8 PauseScreenDrawStatusScreenSamus(u8 param_1)
u8 PauseScreenUpdateStatusScreenOam(u8 param_1)
{
i32 i;
struct MenuOamData* pOam;
@ -662,7 +665,7 @@ void PauseScreenLoadAreaNamesAndIcons(void)
if (PAUSE_SCREEN_DATA.typeFlags & PAUSE_SCREEN_TYPE_GETTING_NEW_ITEM)
{
PauseScreenDrawStatusScreenSamus(0);
PauseScreenUpdateStatusScreenOam(0);
return;
}
@ -1739,7 +1742,7 @@ u32 PauseScreenSubroutine(void)
}
else
{
gButtonInput = gChangedInput = gButtonInput;
gButtonInput = gChangedInput = 0;
if (PauseScreenCallCurrentSubroutine())
{
gGameModeSub2 = 11;
@ -1823,6 +1826,7 @@ void PauseScreenDetermineMapsViewable(void)
PAUSE_SCREEN_DATA.areasViewables |= PAUSE_SCREEN_DATA.areasWithVisitedTiles;
PAUSE_SCREEN_DATA.areasViewables |= PAUSE_SCREEN_DATA.areasWithHints;
// Seriously?
PAUSE_SCREEN_DATA.areasViewablesTotal = (PAUSE_SCREEN_DATA.areasViewables >> AREA_BRINSTAR) & 1;
PAUSE_SCREEN_DATA.areasViewablesTotal += (PAUSE_SCREEN_DATA.areasViewables >> AREA_KRAID) & 1;
PAUSE_SCREEN_DATA.areasViewablesTotal += (PAUSE_SCREEN_DATA.areasViewables >> AREA_NORFAIR) & 1;
@ -1833,6 +1837,7 @@ void PauseScreenDetermineMapsViewable(void)
if (PAUSE_SCREEN_DATA.areasViewablesTotal <= 1)
{
// Remove "press select" text from the tilemap
for (i = 0x24C; i < 0x252; i++)
{
PAUSE_SCREEN_EWRAM.mapScreenOverlayTilemap[i] = 0;
@ -1847,7 +1852,55 @@ void PauseScreenDetermineMapsViewable(void)
void PauseScreenUpdateBottomVisorOverlay(u8 param_1, u8 param_2)
{
// https://decomp.me/scratch/kHRx8
i32 var_0;
i32 var_1;
u16* dst;
u16* src;
i16 temp;
dst = VRAM_BASE + 0xCC40;
src = &PAUSE_SCREEN_EWRAM.visorOverlayTilemap[0x380];
var_0 = -1;
var_1 = -1;
if (param_1)
{
var_0 = 0;
if (param_1 == 1 && !PAUSE_SCREEN_DATA.onWorldMap)
var_0 = 0x16;
}
if (param_2)
{
var_1 = 0;
if (param_2 == 1 && PAUSE_SCREEN_DATA.areasViewablesTotal > 1)
var_1 = 0x2D;
}
if (var_0 == 0 && var_1 == 0)
{
BitFill(3, 0, dst, 0x80, 32);
return;
}
if (var_0 >= 0)
{
dst[0x16] = src[var_0 + 0];
dst[0x17] = src[var_0 + 1];
dst[0x16 + 32] = src[var_0 + 0 + 32];
dst[0x17 + 32] = src[var_0 + 1 + 32];
}
if (var_1 >= 0)
{
temp = var_1;
dst[0x2D] = src[temp++];
dst[0x2E] = src[temp++];
dst[0x2F] = src[temp++];
dst[0x30] = src[temp++];
}
}
void PauseScreenGetMinimapData(u8 area, u16* dst)
@ -1860,9 +1913,83 @@ u32 PauseScreenCallCurrentSubroutine(void)
}
/**
* @brief 6b504 | 168 | Movement hanhdler for the debug cursor
*
* @param allowOverflow Allow screen overflow
*/
void PauseScreenMoveDebugCursor(u8 allowOverflow)
{
// Stick to block position
PAUSE_SCREEN_DATA.miscOam[0].yPosition &= (~HALF_BLOCK_SIZE + 1);
PAUSE_SCREEN_DATA.miscOam[0].xPosition &= (~HALF_BLOCK_SIZE + 1);
if (gButtonInput & KEY_A)
return;
if (PAUSE_SCREEN_DATA.subroutineInfo.stage != 0)
return;
if (allowOverflow == FALSE)
{
// Move cursor horizontally
if (gChangedInput & KEY_RIGHT)
{
if (PAUSE_SCREEN_DATA.miscOam[0].xPosition < HALF_BLOCK_SIZE * 29)
PAUSE_SCREEN_DATA.miscOam[0].xPosition += HALF_BLOCK_SIZE;
}
else if (gChangedInput & KEY_LEFT)
{
if (PAUSE_SCREEN_DATA.miscOam[0].xPosition != 0)
PAUSE_SCREEN_DATA.miscOam[0].xPosition -= HALF_BLOCK_SIZE;
}
// Move cursor vertically
if (gChangedInput & KEY_UP)
{
if (PAUSE_SCREEN_DATA.miscOam[0].yPosition != 0)
PAUSE_SCREEN_DATA.miscOam[0].yPosition -= HALF_BLOCK_SIZE;
}
else if (gChangedInput & KEY_DOWN)
{
if (PAUSE_SCREEN_DATA.miscOam[0].yPosition < HALF_BLOCK_SIZE * 19)
PAUSE_SCREEN_DATA.miscOam[0].yPosition += HALF_BLOCK_SIZE;
}
}
else
{
// Move cursor horizontally
if (gChangedInput & KEY_RIGHT)
{
if (PAUSE_SCREEN_DATA.miscOam[0].xPosition < HALF_BLOCK_SIZE * 29)
PAUSE_SCREEN_DATA.miscOam[0].xPosition += HALF_BLOCK_SIZE;
else
PAUSE_SCREEN_DATA.miscOam[0].xPosition = 0;
}
else if (gChangedInput & KEY_LEFT)
{
if (PAUSE_SCREEN_DATA.miscOam[0].xPosition != 0)
PAUSE_SCREEN_DATA.miscOam[0].xPosition -= HALF_BLOCK_SIZE;
else
PAUSE_SCREEN_DATA.miscOam[0].xPosition = HALF_BLOCK_SIZE * 29;
}
// Move cursor vertically
if (gChangedInput & KEY_UP)
{
if (PAUSE_SCREEN_DATA.miscOam[0].yPosition != 0)
PAUSE_SCREEN_DATA.miscOam[0].yPosition -= HALF_BLOCK_SIZE;
else
PAUSE_SCREEN_DATA.miscOam[0].yPosition = HALF_BLOCK_SIZE * 19;
}
else if (gChangedInput & KEY_DOWN)
{
if (PAUSE_SCREEN_DATA.miscOam[0].yPosition < HALF_BLOCK_SIZE * 19)
PAUSE_SCREEN_DATA.miscOam[0].yPosition += HALF_BLOCK_SIZE;
else
PAUSE_SCREEN_DATA.miscOam[0].yPosition = 0;
}
}
}
u32 unk_6b66c(u16* param_1, u16 param_2)
@ -1875,34 +2002,486 @@ u32 unk_6b6c4(u16* param_1, u16 param_2)
}
/**
* @brief 6b718 | 60 | Updates the top visor overlay
*
* @param oamId Oam id
*/
void PauseScreenUpdateTopVisorOverlay(u8 oamId)
{
i32 offset;
if (oamId != UCHAR_MAX)
{
UpdateMenuOamDataID(&PAUSE_SCREEN_DATA.areaNameOam[1], oamId);
}
if (oamId == 0xF)
offset = 1;
else if (oamId == 0x10)
offset = 2;
else if (oamId == 0)
offset = 0;
else
offset = 3;
DMATransfer(3, &PAUSE_SCREEN_EWRAM.visorOverlayTilemap[0x280 + offset * 0x40], VRAM_BASE + 0xC800, 0x80, 16);
}
/**
* @brief 6b778 | c0 | Initializes the status screen for a suit change (suitless or fully powered)
*
* @return i32 bool, ended (-1 and 0)
*/
i32 PauseScreenSuitChangingStart(void)
{
i32 stage;
stage = 0;
switch (PAUSE_SCREEN_DATA.subroutineInfo.stage)
{
case 0:
// Nothing to do, next stage
stage = UCHAR_MAX + 1;
break;
case 1:
// Update upgrade headers
PauseScreenUpdateStatusScreenOam(3);
// Next stage
stage = UCHAR_MAX + 1;
break;
case 2:
// Draw status screen
if (StatusScreenDrawItems(PAUSE_SCREEN_DATA.subroutineInfo.timer - 1))
stage = UCHAR_MAX + 1;
break;
case 3:
// Setup cursor for the new item
PAUSE_SCREEN_DATA.statusScreenData.currentStatusSlot = StatusScreenGetSlotForNewItem(2, gCurrentItemBeingAcquired);
StatusScreenInitCursorAndItems();
// Display text background
PAUSE_SCREEN_DATA.dispcnt |= DCNT_BG0;
// Clear text buffer graphics
BitFill(3, 0, VRAM_BASE + 0x7800, 0x800, 16);
// Mark as ended
stage = -1;
}
// Check should update stage
if (stage > 0)
{
// Set direct value or increment
if (stage > UCHAR_MAX)
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
else
PAUSE_SCREEN_DATA.subroutineInfo.stage = stage;
PAUSE_SCREEN_DATA.subroutineInfo.timer = 0;
stage = FALSE;
}
return stage;
}
/**
* @brief 6b838 | 1fc | Initializes the status screen
*
* @return i32 bool, ended (-1 and 0)
*/
i32 PauseScreenStatusScreenInit(void)
{
i32 stage;
stage = 0;
switch (PAUSE_SCREEN_DATA.subroutineInfo.stage)
{
case 0:
// Background tilemap?
if (gEquipment.suitType == SUIT_SUITLESS)
{
DMATransfer(3, PAUSE_SCREEN_EWRAM.unk_8000, VRAM_BASE + 0xC000, 0x500, 32);
}
else
{
DMATransfer(3, PAUSE_SCREEN_EWRAM.unk_7800, VRAM_BASE + 0xC000, 0x500, 32);
}
// Set stage 1
stage = 1;
break;
case 1:
// Update top overlay
PauseScreenUpdateTopVisorOverlay(0xF);
stage = UCHAR_MAX + 1;
SoundPlay(0x1F4);
break;
case 2:
if (unk_68168(0x1000, 2, 0))
{
// Update bottom overlay
PauseScreenUpdateBottomVisorOverlay(2, 2);
stage = UCHAR_MAX + 1;
}
break;
case 3:
// Flag as status screen
PAUSE_SCREEN_DATA.typeFlags |= PAUSE_SCREEN_TYPE_ON_STATUS_SCREEN;
PAUSE_SCREEN_DATA.bg2cnt = PAUSE_SCREEN_DATA.unk_74;
PAUSE_SCREEN_DATA.bldcnt = BLDCNT_BG2_FIRST_TARGET_PIXEL | BLDCNT_ALPHA_BLENDING_EFFECT |
BLDCNT_BG2_SECOND_TARGET_PIXEL | BLDCNT_BG3_SECOND_TARGET_PIXEL | BLDCNT_OBJ_SECOND_TARGET_PIXEL |
BLDCNT_BACKDROP_SECOND_TARGET_PIXEL;
PauseScreenUpdateStatusScreenOam(1);
stage = UCHAR_MAX + 1;
break;
case 4:
if (PauseScreenUpdateStatusScreenOam(2))
stage = UCHAR_MAX + 1;
break;
case 5:
if (unk_68168(0x10, 2, 0))
stage = UCHAR_MAX + 1;
break;
case 6:
// Update upgrade headers
PauseScreenUpdateStatusScreenOam(3);
stage = UCHAR_MAX + 1;
break;
case 7:
// Draw status screen
if (StatusScreenDrawItems(PAUSE_SCREEN_DATA.subroutineInfo.timer - 1))
stage = UCHAR_MAX + 1;
break;
case 8:
// Setup cursor
StatusScreenInitCursorAndItems();
// Display text background
PAUSE_SCREEN_DATA.dispcnt |= DCNT_BG0;
// Clear text buffer graphics
BitFill(3, 0, VRAM_BASE + 0x7800, 0x800, 16);
stage = -1;
break;
case 9:
PAUSE_SCREEN_DATA.bg2cnt = PAUSE_SCREEN_DATA.unk_78;
PAUSE_SCREEN_DATA.dispcnt &= ~DCNT_BG1;
PAUSE_SCREEN_DATA.areaNameOam[0].exists = FALSE;
stage = -1;
}
// Check should update stage
if (stage > 0)
{
// Set direct value or increment
if (stage > UCHAR_MAX)
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
else
PAUSE_SCREEN_DATA.subroutineInfo.stage = stage;
PAUSE_SCREEN_DATA.subroutineInfo.timer = 0;
stage = FALSE;
}
else if (stage < 0)
{
gWrittenToBLDALPHA_H = 0;
gWrittenToBLDALPHA_L = 16;
}
return stage;
}
/**
* @brief 6ba34 | 200 | Un-initializes the status screen
*
* @return i32 bool, ended (-1 and 0)
*/
i32 PauseScreenQuitStatusScreen(void)
{
i32 stage;
stage = 0;
switch (PAUSE_SCREEN_DATA.subroutineInfo.stage)
{
case 0:
SoundPlay(0x1F5);
PAUSE_SCREEN_DATA.miscOam[0].oamID = 0;
PauseScreenUpdateTopVisorOverlay(0);
stage = UCHAR_MAX + 1;
break;
case 1:
PauseScreenUpdateStatusScreenOam(4);
PAUSE_SCREEN_DATA.miscOam[1].exists = FALSE;
stage = UCHAR_MAX + 1;
break;
case 2:
if (PAUSE_SCREEN_DATA.subroutineInfo.timer > 12)
stage = UCHAR_MAX + 1;
break;
case 3:
if (unk_68168(0x1000, 2, 0))
{
PAUSE_SCREEN_DATA.dispcnt &= ~DCNT_BG0;
PAUSE_SCREEN_DATA.areaNameOam[3].exists = FALSE;
stage = UCHAR_MAX + 1;
}
break;
case 4:
PAUSE_SCREEN_DATA.bldcnt = BLDCNT_BG2_FIRST_TARGET_PIXEL | BLDCNT_ALPHA_BLENDING_EFFECT |
BLDCNT_BG3_SECOND_TARGET_PIXEL | BLDCNT_OBJ_SECOND_TARGET_PIXEL | BLDCNT_BACKDROP_SECOND_TARGET_PIXEL;
PauseScreenUpdateStatusScreenOam(5);
PAUSE_SCREEN_DATA.currentStatusSlot = 0;
stage = UCHAR_MAX + 1;
break;
case 5:
gWrittenToBLDALPHA_H = 16;
gWrittenToBLDALPHA_L = 0;
PAUSE_SCREEN_DATA.dispcnt |= DCNT_BG1;
PAUSE_SCREEN_DATA.areaNameOam[0].exists = TRUE;
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
case 6:
PAUSE_SCREEN_DATA.bg2cnt = PAUSE_SCREEN_DATA.unk_72;
stage = UCHAR_MAX + 1;
break;
case 7:
if (unk_68168(PAUSE_SCREEN_DATA.unk_68, 2, 0))
{
PAUSE_SCREEN_DATA.typeFlags &= ~PAUSE_SCREEN_TYPE_ON_STATUS_SCREEN;
stage = UCHAR_MAX + 1;
}
break;
case 8:
PauseScreenUpdateBottomVisorOverlay(1, 1);
stage = -1;
}
// Check should update stage
if (stage > 0)
{
// Set direct value or increment
if (stage > UCHAR_MAX)
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
else
PAUSE_SCREEN_DATA.subroutineInfo.stage = stage;
PAUSE_SCREEN_DATA.subroutineInfo.timer = 0;
stage = FALSE;
}
else if (stage < 0)
{
gWrittenToBLDALPHA_H = PAUSE_SCREEN_DATA.unk_68 >> 8;
gWrittenToBLDALPHA_L = PAUSE_SCREEN_DATA.unk_68 & 0xFF;
}
return stage;
}
/**
* @brief 6bc34 | 2d4 | Initializes the easy sleep screen
*
* @return i32 bool, ended
*/
i32 PauseScreenEasySleepInit(void)
{
// Update text processing
if (PAUSE_SCREEN_DATA.easySleepTextState >= 0)
TextDrawEasySleep();
switch (PAUSE_SCREEN_DATA.subroutineInfo.stage)
{
case 0:
if (!unk_68168(0x1000, 4, 0))
PAUSE_SCREEN_DATA.subroutineInfo.stage--;
break;
case 1:
PauseScreenUpdateBottomVisorOverlay(2, 2);
PauseScreenUpdateTopVisorOverlay(0x10);
PAUSE_SCREEN_DATA.dispcnt &= ~DCNT_BG2;
break;
case 2:
// Transfer tilemap
DMATransfer(3, PAUSE_SCREEN_EWRAM.easySleepTilemap, VRAM_BASE + 0xD000, sizeof(PAUSE_SCREEN_EWRAM.easySleepTilemap), 16);
break;
case 3:
// Make a backup of some GFX
DMATransfer(3, VRAM_BASE + 0x6000, PAUSE_SCREEN_EWRAM.equipmentNamesGfxBackup,
sizeof(PAUSE_SCREEN_EWRAM.equipmentNamesGfxBackup), 16);
DMATransfer(3, VRAM_BASE + 0x6800, PAUSE_SCREEN_EWRAM.unk_b000,
sizeof(PAUSE_SCREEN_EWRAM.unk_b000), 16);
break;
case 4:
// More backups
DMATransfer(3, VRAM_BASE + 0x7000, PAUSE_SCREEN_EWRAM.unk_b800,
sizeof(PAUSE_SCREEN_EWRAM.unk_b800), 16);
DMATransfer(3, VRAM_BASE + 0x7800, PAUSE_SCREEN_EWRAM.unk_c000,
sizeof(PAUSE_SCREEN_EWRAM.unk_c000), 16);
break;
case 6:
// Format easy sleep tilemap
dma_set(3, &PAUSE_SCREEN_EWRAM.unk_6000[0], &PAUSE_SCREEN_EWRAM.easySleepTextFormatted_1[0x1C0], DMA_ENABLE << 16 | 0x40);
dma_set(3, &PAUSE_SCREEN_EWRAM.unk_6000[0x200], &PAUSE_SCREEN_EWRAM.easySleepTextFormatted_1[0x3C0], DMA_ENABLE << 16 | 0x40);
dma_set(3, &PAUSE_SCREEN_EWRAM.unk_6000[0xE0], &PAUSE_SCREEN_EWRAM.easySleepTextFormatted_2[0x1C0], DMA_ENABLE << 16 | 0x40);
dma_set(3, &PAUSE_SCREEN_EWRAM.unk_6000[0x2E0], &PAUSE_SCREEN_EWRAM.easySleepTextFormatted_2[0x3C0], DMA_ENABLE << 16 | 0x40);
break;
case 7:
// Transfer message text
if ((u8)PAUSE_SCREEN_DATA.easySleepTextState > 1)
{
DMATransfer(3, PAUSE_SCREEN_EWRAM.easySleepTextFormatted_1, VRAM_BASE + 0x6000,
sizeof(PAUSE_SCREEN_EWRAM.easySleepTextFormatted_1), 16);
DMATransfer(3, PAUSE_SCREEN_EWRAM.easySleepTextFormatted_2, VRAM_BASE + 0x6800,
sizeof(PAUSE_SCREEN_EWRAM.easySleepTextFormatted_2), 16);
}
else
{
PAUSE_SCREEN_DATA.subroutineInfo.stage--;
}
break;
case 8:
// Transfer prompt text
if (PAUSE_SCREEN_DATA.easySleepTextState < 0)
{
DMATransfer(3, PAUSE_SCREEN_EWRAM.unk_5000, VRAM_BASE + 0x7000,
sizeof(PAUSE_SCREEN_EWRAM.unk_5000), 16);
DMATransfer(3, PAUSE_SCREEN_EWRAM.unk_5800, VRAM_BASE + 0x7800,
sizeof(PAUSE_SCREEN_EWRAM.unk_5800), 16);
}
else
{
PAUSE_SCREEN_DATA.subroutineInfo.stage--;
}
break;
case 9:
PAUSE_SCREEN_DATA.bldcnt = BLDCNT_BG2_FIRST_TARGET_PIXEL | BLDCNT_ALPHA_BLENDING_EFFECT |
BLDCNT_BG2_SECOND_TARGET_PIXEL | BLDCNT_BG3_SECOND_TARGET_PIXEL | BLDCNT_OBJ_SECOND_TARGET_PIXEL |
BLDCNT_BACKDROP_SECOND_TARGET_PIXEL;
PAUSE_SCREEN_DATA.dispcnt |= DCNT_BG2;
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
case 10:
if (!unk_68168(0x10, 4, 0))
PAUSE_SCREEN_DATA.subroutineInfo.stage--;
break;
case 11:
// Setup cursor
UpdateMenuOamDataID(&PAUSE_SCREEN_DATA.miscOam[1], 2);
PAUSE_SCREEN_DATA.miscOam[1].xPosition = BLOCK_SIZE * 8 + QUARTER_BLOCK_SIZE;
PAUSE_SCREEN_DATA.miscOam[1].yPosition = BLOCK_SIZE * 4 + QUARTER_BLOCK_SIZE;
PAUSE_SCREEN_DATA.miscOam[1].objMode = 1;
gDisableSoftreset = TRUE;
PAUSE_SCREEN_DATA.subroutineInfo.stage = 0;
PAUSE_SCREEN_DATA.subroutineInfo.timer = 0;
return TRUE;
}
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
return FALSE;
}
/**
* @brief 6bf08 | 1d8 | Un-initializes the status screen
*
* @return i32 bool, ended
*/
i32 PauseScreenQuitEasySleep(void)
{
switch (PAUSE_SCREEN_DATA.subroutineInfo.stage)
{
case 0:
gDisableSoftreset = FALSE;
PauseScreenUpdateTopVisorOverlay(0);
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
case 1:
if (!unk_68168(0x1000, 4, 0))
PAUSE_SCREEN_DATA.subroutineInfo.stage--;
break;
case 2:
PAUSE_SCREEN_DATA.dispcnt &= ~DCNT_BG2;
UpdateMenuOamDataID(&PAUSE_SCREEN_DATA.miscOam[1], 0);
PAUSE_SCREEN_DATA.miscOam[1].objMode = 0;
break;
case 3:
dma_set(3, PAUSE_SCREEN_EWRAM.mapScreenOverlayTilemap, VRAM_BASE + 0xD000,
DMA_ENABLE << 16 | ARRAY_SIZE(PAUSE_SCREEN_EWRAM.mapScreenOverlayTilemap));
break;
case 4:
DMATransfer(3, PAUSE_SCREEN_EWRAM.equipmentNamesGfxBackup, VRAM_BASE + 0x6000,
sizeof(PAUSE_SCREEN_EWRAM.equipmentNamesGfxBackup), 16);
DMATransfer(3, PAUSE_SCREEN_EWRAM.unk_b000, VRAM_BASE + 0x6800,
sizeof(PAUSE_SCREEN_EWRAM.unk_b000), 16);
break;
case 5:
DMATransfer(3, PAUSE_SCREEN_EWRAM.unk_b800, VRAM_BASE + 0x7000,
sizeof(PAUSE_SCREEN_EWRAM.unk_b800), 16);
DMATransfer(3, PAUSE_SCREEN_EWRAM.unk_c000, VRAM_BASE + 0x7800,
sizeof(PAUSE_SCREEN_EWRAM.unk_c000), 16);
break;
case 6:
PAUSE_SCREEN_DATA.bldcnt = BLDCNT_BG2_FIRST_TARGET_PIXEL | BLDCNT_ALPHA_BLENDING_EFFECT |
BLDCNT_BG3_SECOND_TARGET_PIXEL | BLDCNT_OBJ_SECOND_TARGET_PIXEL | BLDCNT_BACKDROP_SECOND_TARGET_PIXEL;
PAUSE_SCREEN_DATA.dispcnt |= DCNT_BG2;
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
case 7:
if (!unk_68168(PAUSE_SCREEN_DATA.unk_68, 4, 0))
PAUSE_SCREEN_DATA.subroutineInfo.stage--;
break;
case 8:
PauseScreenUpdateBottomVisorOverlay(1, 1);
PAUSE_SCREEN_DATA.subroutineInfo.stage = 0;
PAUSE_SCREEN_DATA.subroutineInfo.timer = 0;
return TRUE;
}
PAUSE_SCREEN_DATA.subroutineInfo.stage++;
return FALSE;
}
/**

View File

@ -16,8 +16,6 @@
#include "structs/text.h"
#include "structs/menus/pause_screen.h"
#define STATUS_SCREEN_TILEMAP ((u16*)((void*)sEwramPointer + 0x7000))
void UpdateMinimapAnimatedPalette(void)
{
@ -88,7 +86,7 @@ u32 StatusScreenDrawItems(u8 row)
j = 0;
while (j < sStatusScreenRowsData[i][2])
{
*(((u16*)VRAM_BASE + 0x6000) + position) = STATUS_SCREEN_TILEMAP[position];
*(((u16*)VRAM_BASE + 0x6000) + position) = PAUSE_SCREEN_EWRAM.statusScreenTilemap[position];
j++;
position++;
@ -118,15 +116,15 @@ void StatusScreenDraw(void)
if (gEquipment.suitType == SUIT_SUITLESS)
{
DMATransfer(3, (void*)sEwramPointer + 0x8000, STATUS_SCREEN_TILEMAP, 0x800, 0x10);
DMATransfer(3, (void*)sEwramPointer + 0x8000, PAUSE_SCREEN_EWRAM.statusScreenTilemap, 0x800, 0x10);
BiFill(3, 0, &PAUSE_SCREEN_DATA.statusScreenData, sizeof(PAUSE_SCREEN_DATA.statusScreenData), 0x20);
StatusScreenSetPistolVisibility(STATUS_SCREEN_TILEMAP);
StatusScreenSetPistolVisibility(PAUSE_SCREEN_EWRAM.statusScreenTilemap);
StatusScreenDrawSingleTankAmount(ABILITY_GROUP_CURRENT_ENERGY, gEquipment.currentEnergy, 11, FALSE);
StatusScreenDrawSingleTankAmount(ABILITY_GROUP_MAX_ENERGY, gEquipment.maxEnergy, 11, TRUE);
return;
}
DMATransfer(3, (void*)sEwramPointer + 0x7800, STATUS_SCREEN_TILEMAP, 0x800, 0x10);
DMATransfer(3, (void*)sEwramPointer + 0x7800, PAUSE_SCREEN_EWRAM.statusScreenTilemap, 0x800, 0x10);
previousSlots[0] = PAUSE_SCREEN_DATA.statusScreenData.currentStatusSlot;
previousSlots[1] = PAUSE_SCREEN_DATA.statusScreenData.previousLeftStatusSlot;
@ -134,11 +132,11 @@ void StatusScreenDraw(void)
BiFill(3, 0, &PAUSE_SCREEN_DATA.statusScreenData, sizeof(PAUSE_SCREEN_DATA.statusScreenData), 0x20);
StatusScreenSetBeamsVisibility(STATUS_SCREEN_TILEMAP);
StatusScreenSetSuitsVisibility(STATUS_SCREEN_TILEMAP);
StatusScreenSetBombsVisibility(STATUS_SCREEN_TILEMAP);
StatusScreenSetMiscVisibility(STATUS_SCREEN_TILEMAP);
StatusScreenSetMissilesVisibility(STATUS_SCREEN_TILEMAP);
StatusScreenSetBeamsVisibility(PAUSE_SCREEN_EWRAM.statusScreenTilemap);
StatusScreenSetSuitsVisibility(PAUSE_SCREEN_EWRAM.statusScreenTilemap);
StatusScreenSetBombsVisibility(PAUSE_SCREEN_EWRAM.statusScreenTilemap);
StatusScreenSetMiscVisibility(PAUSE_SCREEN_EWRAM.statusScreenTilemap);
StatusScreenSetMissilesVisibility(PAUSE_SCREEN_EWRAM.statusScreenTilemap);
StatusScreenDrawSingleTankAmount(ABILITY_GROUP_CURRENT_ENERGY, gEquipment.currentEnergy, 11, FALSE);
StatusScreenDrawSingleTankAmount(ABILITY_GROUP_MAX_ENERGY, gEquipment.maxEnergy, 11, TRUE);
@ -264,6 +262,7 @@ void StatusScreenEnableUnknownItem(u8 group, u8 row)
i32 groupX;
u32 dstPosition;
u16* dst;
i32 i;
switch (group)
{
@ -286,13 +285,9 @@ void StatusScreenEnableUnknownItem(u8 group, u8 row)
tilemapPosition++;
while (groupX > 1)
for (i = 0; i < groupX - 1; )
{
*dst = STATUS_SCREEN_TILEMAP[tilemapPosition];
groupX--;
dst++;
tilemapPosition++;
dst[i++] = PAUSE_SCREEN_EWRAM.statusScreenTilemap[tilemapPosition++];
}
}

View File

@ -31,6 +31,7 @@
#include "structs/scroll.h"
#include "structs/room.h"
#include "structs/samus.h"
#include "structs/text.h"
#include "structs/screen_shake.h"
#include "structs/visual_effects.h"