mirror of https://github.com/zeldaret/tmc.git
205 lines
5.3 KiB
C
205 lines
5.3 KiB
C
#include "global.h"
|
|
#include "entity.h"
|
|
#include "area.h"
|
|
#include "main.h"
|
|
#include "common.h"
|
|
#include "screen.h"
|
|
#include "object.h"
|
|
#include "functions.h"
|
|
#include "game.h"
|
|
#include "fileselect.h"
|
|
|
|
typedef struct {
|
|
u8 filler[18];
|
|
Entity* unk_14;
|
|
u8 unk_18;
|
|
u8 unk_19;
|
|
u8 unk_1a;
|
|
u8 unk_1b;
|
|
} struct_02018EB0;
|
|
|
|
extern void ClearArmosData(void);
|
|
extern void sub_080300C4(void);
|
|
|
|
extern struct_02018EB0 gUnk_02018EB0;
|
|
extern u16 gUnk_020178E0[];
|
|
extern u8 gUnk_02017700[];
|
|
|
|
extern void (*const gUnk_080D4120[])(void);
|
|
extern void (*const gUnk_080D412C[])(void);
|
|
extern const u16 gUnk_080D4140[];
|
|
extern const u8 gUnk_080D4138[];
|
|
extern const EntityData* gUnk_080D4110[];
|
|
|
|
bool32 sub_0804AD18(void);
|
|
void sub_0804AD6C(RoomControls*);
|
|
void sub_080A71F4(ScreenTransitionData*);
|
|
bool32 sub_0804ACA8(void);
|
|
|
|
bool32 IsEnterPortal(void) {
|
|
if (gArea.playShrinkSeq) {
|
|
gMain.substate = GAMEMAIN_MINISHPORTAL;
|
|
gArea.filler[8] = 0;
|
|
gArea.filler[9] = 0;
|
|
*(u16*)&gArea.filler[10] = 0;
|
|
SetInitializationPriority();
|
|
return 1;
|
|
} else {
|
|
gArea.filler[18] = gArea.playShrinkSeq;
|
|
*(vu8*)&gArea.playShrinkSeq = gArea.playShrinkSeq;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void GameMain_MinishPortal(void) {
|
|
gUnk_080D4120[gArea.filler[8]]();
|
|
}
|
|
|
|
void sub_0804AAD4(void) {
|
|
MemClear(&gUnk_02018EB0, 0x28);
|
|
gUnk_02018EB0.unk_14 = NULL;
|
|
EraseAllEntities();
|
|
CreateObject(OBJECT_3D, gArea.curPortalType, 0);
|
|
gArea.filler[8]++;
|
|
}
|
|
|
|
void sub_0804AB04(void) {
|
|
UpdateEntities();
|
|
if (gArea.field_0x10 != 0) {
|
|
FlushSprites();
|
|
DrawEntities();
|
|
CopyOAM();
|
|
}
|
|
}
|
|
|
|
void sub_0804AB24(void) {
|
|
if (!gFadeControl.active) {
|
|
gScreen.lcd.displayControl = 0;
|
|
sub_0801E104();
|
|
gArea.filler[8] = 0;
|
|
MenuFadeIn(6, 0);
|
|
gFadeControl.active = 0;
|
|
}
|
|
}
|
|
|
|
void Subtask_PortalCutscene(void) {
|
|
gUnk_080D412C[gArea.filler[8]]();
|
|
}
|
|
void sub_0804AB70(void) {
|
|
const u8* ptr;
|
|
RoomControls* controls;
|
|
u32 portalId;
|
|
|
|
DispReset(0);
|
|
gScreen.lcd.displayControl = 0x1240;
|
|
gScreen.bg1.control = 0x9e83;
|
|
controls = &gRoomControls;
|
|
gScreen.bg1.xOffset = 0;
|
|
controls->scroll_x = 0;
|
|
gScreen.bg1.yOffset = 0;
|
|
controls->scroll_y = 0;
|
|
portalId = gArea.curPortalType;
|
|
if ((portalId == 2) && (gUI.unk_1c.area != 2)) {
|
|
portalId = 3;
|
|
}
|
|
ptr = &gUnk_080D4138[portalId * 2];
|
|
LoadPaletteGroup(ptr[0]);
|
|
LoadGfxGroup(ptr[1]);
|
|
MemCopy(&gUnk_02017700, gUnk_02017700 + 0x240, 0x20);
|
|
gUsedPalettes |= 0x200000;
|
|
EraseAllEntities();
|
|
LoadRoomEntityList((EntityData*)gUnk_080D4110[portalId]);
|
|
ResetSystemPriority();
|
|
gArea.filler3[0]++;
|
|
SetFade(4, 8);
|
|
}
|
|
|
|
void sub_0804AC1C(void) {
|
|
s32 tmp;
|
|
|
|
UpdateEntities();
|
|
if (gUnk_02018EB0.unk_14 != NULL) {
|
|
tmp = gRoomControls.scroll_y + 0x50 - gUnk_02018EB0.unk_14->y.HALF.HI - gUnk_02018EB0.unk_14->z.HALF.HI;
|
|
if (tmp != 0) {
|
|
tmp = gRoomControls.scroll_y = gRoomControls.scroll_y - tmp;
|
|
if (tmp * 0x10000 < 0) {
|
|
gRoomControls.scroll_y = 0;
|
|
}
|
|
if (0x9f < gRoomControls.scroll_y) {
|
|
gRoomControls.scroll_y = 0x9f;
|
|
}
|
|
}
|
|
}
|
|
gScreen.bg1.xOffset = gRoomControls.scroll_x;
|
|
gScreen.bg1.yOffset = gRoomControls.scroll_y;
|
|
FlushSprites();
|
|
DrawEntities();
|
|
CopyOAM();
|
|
if ((gUnk_02018EB0.unk_1b != 0) || sub_0804ACA8()) {
|
|
gArea.filler3[0]++;
|
|
SetFade(7, 0x10);
|
|
}
|
|
}
|
|
|
|
bool32 sub_0804ACA8(void) {
|
|
if ((gInput.newKeys & (R_BUTTON | B_BUTTON)) == 0) {
|
|
return 0;
|
|
} else {
|
|
return sub_0804AD18();
|
|
}
|
|
}
|
|
|
|
void sub_0804ACC8(void) {
|
|
if (gFadeControl.active == 0) {
|
|
SetGlobalFlag(gArea.curPortalType + ENTRANCE_0);
|
|
sub_0804AD6C((RoomControls*)&gUI.unk_1c);
|
|
sub_080A71F4(0);
|
|
}
|
|
}
|
|
|
|
void RespawnAsMinish(void) {
|
|
if (sub_0804AD18()) {
|
|
sub_0804AD6C(&gRoomControls);
|
|
SetInitializationPriority();
|
|
SoundReq(SFX_F8);
|
|
}
|
|
}
|
|
|
|
bool32 sub_0804AD18(void) {
|
|
switch (gArea.curPortalType) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
if (!CheckGlobalFlag(ENTRANCE_0 + gArea.curPortalType)) {
|
|
return FALSE;
|
|
}
|
|
// else: return TRUE implicitely, because it's stored in r0. But does not match if returning explicitely.
|
|
break;
|
|
case 6:
|
|
return FALSE;
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
default:
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
void sub_0804AD6C(RoomControls* controls) {
|
|
Area* area;
|
|
gRoomTransition.transitioningOut = 1;
|
|
gRoomTransition.type = 0;
|
|
area = &gArea;
|
|
gRoomTransition.player_status.start_pos_x =
|
|
(area->curPortalX + gUnk_080D4140[area->curPortalExitDirection * 2]) - controls->origin_x;
|
|
gRoomTransition.player_status.start_pos_y =
|
|
(area->curPortalY + gUnk_080D4140[area->curPortalExitDirection * 2 + 1]) - controls->origin_y;
|
|
gRoomTransition.player_status.start_anim = area->curPortalExitDirection << 1;
|
|
gRoomTransition.player_status.spawn_type = 1;
|
|
gRoomTransition.player_status.area_next = controls->area;
|
|
gRoomTransition.player_status.room_next = controls->room;
|
|
gRoomTransition.player_status.layer = 0;
|
|
ClearArmosData();
|
|
sub_080300C4();
|
|
}
|