Slightly more pause screen code

This commit is contained in:
y.demaisonregne 2023-04-01 12:34:47 +02:00
parent cc6174ab18
commit a4d51a522c
5 changed files with 212 additions and 10 deletions

View File

@ -2,7 +2,7 @@
This is a work in progress decompilation of Metroid - Zero Mission.
2388/2721 functions decompiled (87.76%, 333 left)
2390/2721 functions decompiled (87.86%, 331 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

@ -41,3 +41,8 @@
#define ITEM_ACQUISITION_SCREW_ATTACK 19
#define ITEM_ACQUISITION_SPACE_JUMP 20
#define ITEM_ACQUISITION_POWER_GRIP 21
#define PAUSE_SCREEN_FADING_IN_INIT 2
#define PAUSE_SCREEN_FADING_IN 3
#define PAUSE_SCREEN_FADING_OUT_INIT 4
#define PAUSE_SCREEN_FADING_OUT 5

View File

@ -5,7 +5,7 @@
#include "structs/menu.h"
#include "structs/cutscene.h"
u32 unk_68168(u16 param_1, u8 param_2, u8 param_3);
u32 unk_68168(u16 param_1, u8 param_2, u32 param_3);
u8 unk_681c8(void);
u32 PauseScreenUpdateOrStartFading(u8 stage);
void PauseScreenCopyPalramToEwram_Unused(u8 param_1);

View File

@ -104,7 +104,8 @@ struct PauseScreenEwramData {
u16 unk_5000[1024];
u16 unk_5800[1024];
u16 unk_6000[1024];
u8 padding_6800[0x800];
u16 unk_6800[512];
u16 backgroundPalette[512];
u16 statusScreenTilemap[1024];
u16 unk_7800[1024];
u16 unk_8000[1024];

View File

@ -5,6 +5,7 @@
#include "oam_id.h"
#include "event.h"
#include "text.h"
#include "color_effects.h"
#include "menus/status_screen.h"
#include "data/shortcut_pointers.h"
@ -25,19 +26,214 @@
#include "structs/game_state.h"
#include "structs/text.h"
u32 unk_68168(u16 param_1, u8 param_2, u8 param_3)
u32 unk_68168(u16 param_1, u8 param_2, u32 param_3)
{
// https://decomp.me/scratch/7coJ2
i32 _param_3 = (i8)param_3;
if (!PAUSE_SCREEN_DATA.unk_7C && param_2 != 0)
{
PAUSE_SCREEN_DATA.unk_7C++;
PAUSE_SCREEN_DATA.unk_7D = param_2;
PAUSE_SCREEN_DATA.unk_7F = _param_3;
PAUSE_SCREEN_DATA.unk_80 = (param_1 >> 0) & 0x1F;
PAUSE_SCREEN_DATA.unk_81 = (param_1 >> 8) & 0x1F;
PAUSE_SCREEN_DATA.unk_7E = 0;
return TRUE;
}
return FALSE;
}
/**
* @brief 681c8 | 124 | To document
*
* @return u8 bool, ended
*/
u8 unk_681c8(void)
{
u8 ended;
ended = FALSE;
if (PAUSE_SCREEN_DATA.unk_7C)
{
PAUSE_SCREEN_DATA.unk_7E++;
if (PAUSE_SCREEN_DATA.unk_7F <= PAUSE_SCREEN_DATA.unk_7E)
{
PAUSE_SCREEN_DATA.unk_7E = 0;
if (gWrittenToBLDALPHA_L != PAUSE_SCREEN_DATA.unk_80)
{
if (gWrittenToBLDALPHA_L > PAUSE_SCREEN_DATA.unk_80)
{
if (gWrittenToBLDALPHA_L - PAUSE_SCREEN_DATA.unk_80 > PAUSE_SCREEN_DATA.unk_7D)
gWrittenToBLDALPHA_L -= PAUSE_SCREEN_DATA.unk_7D;
else
gWrittenToBLDALPHA_L = PAUSE_SCREEN_DATA.unk_80;
}
else
{
gWrittenToBLDALPHA_L += PAUSE_SCREEN_DATA.unk_7D;
if (gWrittenToBLDALPHA_L > PAUSE_SCREEN_DATA.unk_80)
gWrittenToBLDALPHA_L = PAUSE_SCREEN_DATA.unk_80;
}
}
if (gWrittenToBLDALPHA_H != PAUSE_SCREEN_DATA.unk_81)
{
if (gWrittenToBLDALPHA_H > PAUSE_SCREEN_DATA.unk_81)
{
if (gWrittenToBLDALPHA_H - PAUSE_SCREEN_DATA.unk_81 > PAUSE_SCREEN_DATA.unk_7D)
gWrittenToBLDALPHA_H -= PAUSE_SCREEN_DATA.unk_7D;
else
gWrittenToBLDALPHA_H = PAUSE_SCREEN_DATA.unk_81;
}
else
{
gWrittenToBLDALPHA_H += PAUSE_SCREEN_DATA.unk_7D;
if (gWrittenToBLDALPHA_H > PAUSE_SCREEN_DATA.unk_81)
gWrittenToBLDALPHA_H = PAUSE_SCREEN_DATA.unk_81;
}
}
if (gWrittenToBLDALPHA_L == PAUSE_SCREEN_DATA.unk_80 && gWrittenToBLDALPHA_H == PAUSE_SCREEN_DATA.unk_81)
{
PAUSE_SCREEN_DATA.unk_7C = FALSE;
ended = TRUE;
}
}
}
return ended;
}
/**
* @brief 682ec | 2cc | Starts and updates the pause screen fading
*
* @param stage Stage to start
* @return u32 bool, ended
*/
u32 PauseScreenUpdateOrStartFading(u8 stage)
{
u16* src;
u16* dst;
if (stage)
PAUSE_SCREEN_DATA.mapScreenFading.stage = stage;
switch (PAUSE_SCREEN_DATA.mapScreenFading.stage)
{
case 0:
break;
case 1:
if (!PAUSE_SCREEN_DATA.mapScreenFading.unk_2)
{
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply = 0;
PAUSE_SCREEN_DATA.mapScreenFading.stage = 0;
return TRUE;
}
break;
case PAUSE_SCREEN_FADING_IN_INIT:
DMATransfer(3, PALRAM_BASE, PAUSE_SCREEN_EWRAM.unk_6800, PALRAM_SIZE, 16);
BitFill(3, 0, PALRAM_BASE, PALRAM_SIZE, 16);
DMATransfer(3, PALRAM_BASE, PAUSE_SCREEN_EWRAM.backgroundPalette, PALRAM_SIZE, 16);
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply = 0;
PAUSE_SCREEN_DATA.mapScreenFading.unk_2 = FALSE;
PAUSE_SCREEN_DATA.mapScreenFading.stage = PAUSE_SCREEN_FADING_IN;
break;
case PAUSE_SCREEN_FADING_IN:
if (PAUSE_SCREEN_DATA.mapScreenFading.unk_2)
break;
if (PAUSE_SCREEN_DATA.mapScreenFading.colorToApply < 32)
{
src = &PAUSE_SCREEN_EWRAM.unk_6800[0];
dst = &PAUSE_SCREEN_EWRAM.backgroundPalette[0];
ApplySpecialBackgroundFadingColor(FADING_TYPE_IN, PAUSE_SCREEN_DATA.mapScreenFading.colorToApply, &src, &dst, USHORT_MAX);
src = &PAUSE_SCREEN_EWRAM.unk_6800[16 * 16];
dst = &PAUSE_SCREEN_EWRAM.backgroundPalette[16 * 16];
ApplySpecialBackgroundFadingColor(FADING_TYPE_IN, PAUSE_SCREEN_DATA.mapScreenFading.colorToApply, &src, &dst, USHORT_MAX);
PAUSE_SCREEN_DATA.mapScreenFading.unk_2 = TRUE;
if (PAUSE_SCREEN_DATA.mapScreenFading.colorToApply == 31)
{
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply++;
break;
}
if (PAUSE_SCREEN_DATA.mapScreenFading.colorToApply + 2 > 31)
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply = 31;
else
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply += 2;
}
else
{
DMATransfer(3, PAUSE_SCREEN_EWRAM.unk_6800, PAUSE_SCREEN_EWRAM.backgroundPalette, PALRAM_SIZE, 16);
PAUSE_SCREEN_DATA.mapScreenFading.unk_2 = TRUE;
PAUSE_SCREEN_DATA.mapScreenFading.stage = 1;
}
break;
case PAUSE_SCREEN_FADING_OUT_INIT:
DMATransfer(3, PALRAM_BASE, PAUSE_SCREEN_EWRAM.unk_6800, PALRAM_SIZE, 16);
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply = 0;
PAUSE_SCREEN_DATA.mapScreenFading.unk_2 = FALSE;
PAUSE_SCREEN_DATA.mapScreenFading.stage = PAUSE_SCREEN_FADING_OUT;
break;
case PAUSE_SCREEN_FADING_OUT:
if (PAUSE_SCREEN_DATA.mapScreenFading.unk_2)
break;
if (PAUSE_SCREEN_DATA.mapScreenFading.colorToApply < 32)
{
src = &PAUSE_SCREEN_EWRAM.unk_6800[0];
dst = &PAUSE_SCREEN_EWRAM.backgroundPalette[0];
ApplySpecialBackgroundFadingColor(FADING_TYPE_OUT, PAUSE_SCREEN_DATA.mapScreenFading.colorToApply, &src, &dst, USHORT_MAX);
src = &PAUSE_SCREEN_EWRAM.unk_6800[16 * 16];
dst = &PAUSE_SCREEN_EWRAM.backgroundPalette[16 * 16];
ApplySpecialBackgroundFadingColor(FADING_TYPE_OUT, PAUSE_SCREEN_DATA.mapScreenFading.colorToApply, &src, &dst, USHORT_MAX);
PAUSE_SCREEN_DATA.mapScreenFading.unk_2 = TRUE;
if (PAUSE_SCREEN_DATA.mapScreenFading.colorToApply == 31)
{
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply++;
break;
}
if (PAUSE_SCREEN_DATA.mapScreenFading.colorToApply + 2 > 31)
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply = 31;
else
PAUSE_SCREEN_DATA.mapScreenFading.colorToApply += 2;
}
else
{
BitFill(3, 0, PAUSE_SCREEN_EWRAM.backgroundPalette, PALRAM_SIZE, 16);
PAUSE_SCREEN_DATA.mapScreenFading.unk_2 = TRUE;
PAUSE_SCREEN_DATA.mapScreenFading.stage = 1;
}
}
if (PAUSE_SCREEN_DATA.mapScreenFading.unk_2)
{
DMATransfer(3, PAUSE_SCREEN_EWRAM.backgroundPalette, PALRAM_BASE, PALRAM_SIZE, 16);
PAUSE_SCREEN_DATA.mapScreenFading.unk_2 = FALSE;
}
return FALSE;
}
/**
@ -49,13 +245,13 @@ void PauseScreenCopyPalramToEwram_Unused(u8 param_1)
{
if (!param_1)
{
DMATransfer(3, PALRAM_BASE, (void*)sEwramPointer + 0x6800, PALRAM_SIZE, 16);
DMATransfer(3, PALRAM_BASE, PAUSE_SCREEN_EWRAM.unk_6800, PALRAM_SIZE, 16);
BitFill(3, 0, PALRAM_BASE, PALRAM_SIZE, 16);
DMATransfer(3, PALRAM_BASE, (void*)sEwramPointer + 0x6C00, PALRAM_SIZE, 16);
DMATransfer(3, PALRAM_BASE, PAUSE_SCREEN_EWRAM.unk_6800, PALRAM_SIZE, 16);
}
else
{
DMATransfer(3, PALRAM_BASE, (void*)sEwramPointer + 0x6800, PALRAM_SIZE, 16);
DMATransfer(3, PALRAM_BASE, PAUSE_SCREEN_EWRAM.unk_6800, PALRAM_SIZE, 16);
}
PAUSE_SCREEN_DATA.mapScreenFading.stage = 0;
@ -69,7 +265,7 @@ void PauseScreenCopyBackgroundPalette_Unused(void)
{
if (PAUSE_SCREEN_DATA.mapScreenFading.unk_2)
{
DMATransfer(3, (void*)sEwramPointer + 0x6C00, PALRAM_BASE, PALRAM_SIZE, 16);
DMATransfer(3, PAUSE_SCREEN_EWRAM.backgroundPalette, PALRAM_BASE, PALRAM_SIZE, 16);
PAUSE_SCREEN_DATA.mapScreenFading.unk_2 = FALSE;
}
}
@ -1705,7 +1901,7 @@ u32 PauseScreenSubroutine(void)
PauseScreenUpdateOrStartFading(0);
if (PauseScreenCallCurrentSubroutine())
{
PauseScreenUpdateOrStartFading(4);
PauseScreenUpdateOrStartFading(PAUSE_SCREEN_FADING_OUT_INIT);
gSubGameModeStage++;
}
@ -1752,7 +1948,7 @@ u32 PauseScreenSubroutine(void)
}
if (leaving)
PauseScreenUpdateOrStartFading(4);
PauseScreenUpdateOrStartFading(PAUSE_SCREEN_FADING_OUT_INIT);
if (PAUSE_SCREEN_DATA.mapScreenFading.stage == 0)
UpdateMinimapAnimatedPalette();