tmc/src/enterPortalSubtask.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();
}