Decompile Subtask_FadeIn/Out

This commit is contained in:
Tal Hayon 2022-04-10 20:27:22 +03:00
parent e50351df20
commit c06564fd55
9 changed files with 90 additions and 117 deletions

View File

@ -1,87 +0,0 @@
.syntax unified
push {r4, lr}
ldr r0, _080A72E8 @ =gFadeControl
ldrb r0, [r0]
cmp r0, #0
bne _080A72E4
ldr r0, _080A72EC @ =gScreen
ldr r1, _080A72F0 @ =gUnk_03001020
movs r2, #0x7c
bl MemCopy
ldr r0, _080A72F4 @ =gPaletteBuffer
ldr r1, _080A72F8 @ =gUnk_02024090
movs r2, #0x80
lsls r2, r2, #3
bl MemCopy
ldr r0, _080A72FC @ =gGFXSlots
ldr r4, _080A7300 @ =gUnk_02032F14
movs r2, #0x85
lsls r2, r2, #2
adds r1, r4, #0
bl MemCopy
ldr r0, _080A7304 @ =gPaletteList
movs r2, #0x85
lsls r2, r2, #2
adds r1, r4, r2
movs r2, #0x40
bl MemCopy
ldr r0, _080A7308 @ =gRoomControls
adds r1, r4, #0
subs r1, #0x38
movs r2, #0x38
bl MemCopy
ldr r0, _080A730C @ =gUnk_03000420
movs r2, #0x95
lsls r2, r2, #2
adds r1, r4, r2
movs r2, #0x80
lsls r2, r2, #1
bl MemCopy
ldr r0, _080A7310 @ =gActiveScriptInfo
movs r2, #0xd5
lsls r2, r2, #2
adds r1, r4, r2
movs r2, #0xc
bl MemCopy
bl sub_0805E958
adds r1, r4, #0
subs r1, #0x54
ldr r0, _080A7314 @ =gRoomTransition
adds r0, #0x2f
ldrb r0, [r0]
strb r0, [r1, #0xd]
ldr r0, _080A7318 @ =gPlayerState
adds r0, #0x8b
ldrb r0, [r0]
strb r0, [r1, #0xc]
ldr r0, _080A731C @ =gCurrentRoomProperties
ldr r0, [r0]
str r0, [r1, #0x10]
ldr r0, _080A7320 @ =gMapBottom
ldr r0, [r0]
str r0, [r1, #0x14]
ldr r0, _080A7324 @ =gMapTop
ldr r0, [r0]
str r0, [r1, #0x18]
movs r0, #1
strb r0, [r1]
_080A72E4:
pop {r4, pc}
.align 2, 0
_080A72E8: .4byte gFadeControl
_080A72EC: .4byte gScreen
_080A72F0: .4byte gUnk_03001020
_080A72F4: .4byte gPaletteBuffer
_080A72F8: .4byte gUnk_02024090
_080A72FC: .4byte gGFXSlots
_080A7300: .4byte gUnk_02032F14
_080A7304: .4byte gPaletteList
_080A7308: .4byte gRoomControls
_080A730C: .4byte gUnk_03000420
_080A7310: .4byte gActiveScriptInfo
_080A7314: .4byte gRoomTransition
_080A7318: .4byte gPlayerState
_080A731C: .4byte gCurrentRoomProperties
_080A7320: .4byte gMapBottom
_080A7324: .4byte gMapTop
.syntax divided

View File

@ -485,6 +485,8 @@ void SetInitializationPriority(void);
*/
void ResetSystemPriority(void);
void sub_0805E958(void);
/**
* LinkedList's which point to allocate Entities.
* These work together with Entity.prev and Entity.next fields

View File

@ -2,7 +2,9 @@
#define MAIN_H
#include "global.h"
#include "room.h" // just to get the type of screenTransitionData
#include "structures.h"
#include "room.h"
#include "script.h"
/** File signature */
#define SIGNATURE 'MCZ3'
@ -69,19 +71,28 @@ typedef struct {
* HUD structure.
*/
typedef struct {
/*0x00*/ u8 nextToLoad;
/*0x01*/ u8 _1;
/*0x02*/ u8 lastState;
/*0x03*/ u8 field_0x3;
/*0x04*/ u8 state;
/*0x05*/ u8 field_0x5;
/*0x06*/ u8 field_0x6;
/*0x07*/ u8 pauseFadeIn;
/*0x08*/ u16 isLoading;
/*0x0A*/ u16 fadeInTime;
/*0x0C*/ u8 fillerC[0x10];
/*0x1c*/ RoomControls unk_1c;
/*0x2e+4*/ u8 unk_2e[0x360];
/*0x000*/ u8 nextToLoad;
/*0x001*/ u8 _1;
/*0x002*/ u8 lastState;
/*0x003*/ u8 field_0x3;
/*0x004*/ u8 state;
/*0x005*/ u8 field_0x5;
/*0x006*/ u8 field_0x6;
/*0x007*/ u8 pauseFadeIn;
/*0x008*/ u16 fadeType;
/*0x00A*/ u16 fadeInTime;
/*0x00C*/ u8 controlMode;
/*0x00D*/ u8 unk_d;
/*0x00E*/ u8 unk_e;
/*0x00F*/ u8 unk_f;
/*0x010*/ void** currentRoomProperties;
/*0x014*/ u16* mapBottomBgControlPtr;
/*0x018*/ u16* mapTopBgControlPtr;
/*0x01C*/ RoomControls roomControls;
/*0x054*/ GfxSlotList gfxSlotList;
/*0x268*/ Palette palettes[0x10];
/*0x2A8*/ u8 unk_2a8[0x100];
/*0x3A8*/ ActiveScriptInfo activeScriptInfo;
} UI;
static_assert(sizeof(UI) == 0x3b4);

View File

@ -216,6 +216,8 @@ typedef enum {
TILE_ENTITY_D,
} TileEntityType;
extern void** gCurrentRoomProperties;
void SetTileType(u32, u32, u32);
void InitScreenShake(u32 time, u32 magnitude);

View File

@ -105,8 +105,6 @@ SECTIONS {
. = 0x00030EB4; gUnk_02030EB4 = .;
. = 0x00031EC0; gUnk_02031EC0 = .;
. = 0x00032EC0; gUI = .;
. = 0x00032EDC; gUnk_02032EDC = .;
. = 0x00032F14; gUnk_02032F14 = .;
. = 0x00033280; gActiveScriptInfo = .;
. = 0x00033290; gUnk_02033290 = .;
. = 0x00033A90; gArea = .;

View File

@ -89,7 +89,7 @@ void sub_0804AB70(void) {
gScreen.bg1.yOffset = 0;
controls->scroll_y = 0;
portalId = gArea.portal_type;
if ((portalId == 2) && (gUI.unk_1c.area != 2)) {
if ((portalId == 2) && (gUI.roomControls.area != 2)) {
portalId = 3;
}
ptr = &gUnk_080D4138[portalId * 2];
@ -142,7 +142,7 @@ bool32 sub_0804ACA8(void) {
void sub_0804ACC8(void) {
if (gFadeControl.active == 0) {
SetGlobalFlag(gArea.portal_type + ENTRANCE_0);
sub_0804AD6C((RoomControls*)&gUI.unk_1c);
sub_0804AD6C(&gUI.roomControls);
sub_080A71F4(0);
}
}

View File

@ -1828,11 +1828,11 @@ void sub_0805368C(void) {
}
void sub_080536A8(void) {
sub_080A71C4(5, 5, 4, 0x10);
sub_080A71C4(5, 5, FADE_INSTANT, 0x10);
}
void sub_080536B8(void) {
sub_080A71C4(5, 3, 4, 4);
sub_080A71C4(5, 3, FADE_INSTANT, 4);
SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
}
@ -1972,7 +1972,7 @@ void sub_08053B10(void) {
}
void sub_08053B3C(void) {
sub_080A71C4(5, 4, 5, 0x100);
sub_080A71C4(5, 4, FADE_IN_OUT | FADE_INSTANT, 0x100);
SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
}
@ -2002,7 +2002,7 @@ void sub_08053BBC(void) {
}
void sub_08053BE8(void) {
sub_080A71C4(5, 2, 5, 0x100);
sub_080A71C4(5, 2, FADE_IN_OUT | FADE_INSTANT, 0x100);
SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
}

View File

@ -4974,7 +4974,7 @@ extern u32 script_PlayerIntro;
void sub_StateChange_HouseInteriors2_LinksHouseBedroom(void) {
if (!CheckGlobalFlag(START) && !CheckLocalFlag(0x46)) {
sub_080A71C4(5, 1, 4, 4);
sub_080A71C4(5, 1, FADE_INSTANT, 4);
gUpdateVisibleTiles = 0;
SetFade(FADE_IN_OUT | FADE_INSTANT, 256);
sub_080751E8(0, 6, &script_PlayerIntro);

View File

@ -30,6 +30,9 @@ extern u8 gUnk_08128C00[];
extern Frame* gSpriteAnimations_322[];
extern u32 gUnk_085C4620[];
extern u16* gMoreSpritePtrs[];
extern Screen gUnk_03001020;
extern u8 gUnk_02024090[];
extern u8 gUnk_03000420[];
void sub_080A5CFC(u32, void*, u32);
void sub_080A6FB4(u32, u32);
@ -1262,7 +1265,7 @@ void MenuFadeIn(u32 param_1, u32 param_2) {
gUI.nextToLoad = 1;
}
gUI.field_0x6 = 0;
gUI.isLoading = -1;
gUI.fadeType = -1;
gUI.fadeInTime = 0x20;
gMain.substate = GAMEMAIN_SUBTASK;
SetFade(FADE_IN_OUT | FADE_INSTANT, 0x20);
@ -1272,16 +1275,16 @@ void MenuFadeIn(u32 param_1, u32 param_2) {
void sub_080A71A4(u32 param_1, u32 param_2, u32 param_3) {
if (gUI.nextToLoad == 0) {
gUI.fillerC[2] = param_3;
gUI.unk_e = param_3;
} else {
gUI.fillerC[3] = param_3;
gUI.unk_f = param_3;
}
MenuFadeIn(param_1, param_2);
}
void sub_080A71C4(u32 param_1, u32 param_2, u32 param_3, u32 param_4) {
void sub_080A71C4(u32 param_1, u32 param_2, u32 fadeType, u32 param_4) {
MenuFadeIn(param_1, param_2);
gUI.isLoading = param_3;
gUI.fadeType = fadeType;
gUI.fadeInTime = param_4;
}
@ -1312,7 +1315,24 @@ void GameMain_Subtask(void) {
gUnk_0812901C[gUI.nextToLoad]();
}
ASM_FUNC("asm/non_matching/subtask2/Subtask_FadeIn.inc", void Subtask_FadeIn())
void Subtask_FadeIn(void) {
if (!gFadeControl.active) {
MemCopy(&gScreen, &gUnk_03001020, sizeof(Screen));
MemCopy(gPaletteBuffer, gUnk_02024090, 0x400);
MemCopy(&gGFXSlots, &gUI.gfxSlotList, sizeof(GfxSlotList));
MemCopy(gPaletteList, gUI.palettes, sizeof(gUI.palettes));
MemCopy(&gRoomControls, &gUI.roomControls, sizeof(RoomControls));
MemCopy(gUnk_03000420, gUI.unk_2a8, sizeof(gUI.unk_2a8));
MemCopy(&gActiveScriptInfo, &gUI.activeScriptInfo, sizeof(ActiveScriptInfo));
sub_0805E958();
gUI.unk_d = gRoomTransition.field_0x2c[2];
gUI.controlMode = gPlayerState.controlMode;
gUI.currentRoomProperties = gCurrentRoomProperties;
gUI.mapBottomBgControlPtr = gMapBottom.bgControlPtr;
gUI.mapTopBgControlPtr = gMapTop.bgControlPtr;
gUI.nextToLoad = 1;
}
}
void Subtask_Init(void) {
if (gFadeControl.active == 0) {
@ -1332,7 +1352,34 @@ void Subtask_Init(void) {
}
}
ASM_FUNC("asm/non_matching/subtask2/Subtask_FadeOut.inc", void Subtask_FadeOut())
void Subtask_FadeOut(void) {
if (!gFadeControl.active) {
DeleteAllEntities();
sub_0805E974();
gCurrentRoomProperties = gUI.currentRoomProperties;
gPlayerState.controlMode = gUI.controlMode;
gMapBottom.bgControlPtr = gUI.mapBottomBgControlPtr;
gMapTop.bgControlPtr = gUI.mapTopBgControlPtr;
MemCopy(&gUI.activeScriptInfo, &gActiveScriptInfo, sizeof(ActiveScriptInfo));
MemCopy(gUI.unk_2a8, gUnk_03000420, sizeof(gUI.unk_2a8));
MemCopy(gUI.palettes, gPaletteList, sizeof(gUI.palettes));
MemCopy(&gUI.gfxSlotList, &gGFXSlots, sizeof(gGFXSlots));
MemCopy(&gUI.roomControls, &gRoomControls, sizeof(RoomControls));
MemCopy(&gUnk_03001020, &gScreen, sizeof(Screen));
gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area);
gArea.pCurrentRoomInfo = GetCurrentRoomInfo();
RestoreGameTask(gUI.field_0x6);
sub_0801D000(gUI.unk_d != 0);
sub_080A74F4();
if (gUI.fadeType != 0xffff) {
SetFade(gUI.fadeType, gUI.fadeInTime);
} else {
SetFadeInverted(gUI.fadeInTime);
}
gUI.nextToLoad = 4;
gRoomTransition.field_0x2c[3] = 0;
}
}
void Subtask_Die(void) {
sub_080A74F4();