mirror of
https://github.com/zeldaret/tmc
synced 2026-07-10 23:22:03 -04:00
104 lines
2.7 KiB
C
104 lines
2.7 KiB
C
/**
|
|
* @file subtaskWorldEvent.c
|
|
*
|
|
* @brief World Event Subtask
|
|
*/
|
|
#include "area.h"
|
|
#include "asm.h"
|
|
#include "common.h"
|
|
#include "flags.h"
|
|
#include "functions.h"
|
|
#include "game.h"
|
|
#include "kinstone.h"
|
|
#include "main.h"
|
|
#include "menu.h"
|
|
#include "message.h"
|
|
#include "room.h"
|
|
#include "screen.h"
|
|
#include "subtask.h"
|
|
|
|
void Subtask_WorldEvent_Update(void);
|
|
|
|
extern void (*const gUnk_080FE2A0[])(void);
|
|
void Subtask_WorldEvent(void) {
|
|
#if !(defined(DEMO_USA) || defined(DEMO_JP))
|
|
gUnk_080FE2A0[gMenu.menuType]();
|
|
#endif
|
|
}
|
|
|
|
void Subtask_WorldEvent_Init(void) {
|
|
const WorldEvent* ptr = &gWorldEvents[gUI.field_0x3];
|
|
gMenu.field_0x0 = ptr->type;
|
|
gMenu.field_0x3 = ptr->entity_idx;
|
|
gMenu.field_0x4 = gUI.field_0x3;
|
|
gMenu.field_0xc = (u8*)ptr;
|
|
gMenu.menuType++;
|
|
gMenu.overlayType = 0;
|
|
gMenu.transitionTimer = 300;
|
|
DispReset(0);
|
|
sub_08054974(gUI.field_0x3, 1);
|
|
sub_0806F364();
|
|
ClearRoomFlag(0xff);
|
|
Subtask_WorldEvent_Update();
|
|
}
|
|
|
|
extern void (*const gWorldEventFunctions[])(void);
|
|
|
|
void Subtask_WorldEvent_Update(void) {
|
|
gWorldEventFunctions[gMenu.field_0x0]();
|
|
FlushSprites();
|
|
UpdateEntities();
|
|
DrawEntities();
|
|
CopyOAM();
|
|
UpdateScroll();
|
|
UpdateBgAnimations();
|
|
UpdateScrollVram();
|
|
}
|
|
|
|
void Subtask_WorldEvent_End(void) {
|
|
MessageInitialize();
|
|
sub_0806F38C();
|
|
if (gKinstoneWorldEvents[gFuseInfo.kinstoneId].mapMarkerIcon != 0) {
|
|
// Show the map hint.
|
|
MenuFadeIn(SUBTASK_LOCALMAPHINT, gUI.field_0x3);
|
|
} else {
|
|
gUI.nextToLoad = 3; // Subtask_FadeOut
|
|
SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 0x10);
|
|
}
|
|
}
|
|
|
|
void sub_08054968(void) {
|
|
gMenu.menuType = 2;
|
|
}
|
|
|
|
// Controls showing the world event cutscene?
|
|
void sub_08054974(u32 worldEventId, bool32 param_2) {
|
|
const WorldEvent* ptr = &gWorldEvents[worldEventId];
|
|
SetCurrentRoomPropertyList(ptr->area, ptr->room);
|
|
gRoomControls.area = ptr->area;
|
|
gRoomControls.room = ptr->room;
|
|
LoadGfxGroups();
|
|
gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.area);
|
|
if (param_2) {
|
|
LoadAuxiliaryRoom(ptr->area, ptr->room);
|
|
} else {
|
|
sub_08052FF4(ptr->area, ptr->room);
|
|
InitializeCamera();
|
|
gUpdateVisibleTiles = 1;
|
|
}
|
|
gScreen.lcd.displayControl &= 0x1fff;
|
|
gRoomControls.scroll_x = gRoomControls.origin_x + ptr->offsetX;
|
|
gRoomControls.scroll_y = gRoomControls.origin_y + ptr->offsetY;
|
|
if (ptr->area == AREA_HYRULE_TOWN) {
|
|
TryLoadPrologueHyruleTown();
|
|
}
|
|
sub_08018710(gUI.field_0x3);
|
|
}
|
|
|
|
void sub_08054A14(s32 worldEventId) {
|
|
const WorldEvent* ptr = &gWorldEvents[worldEventId];
|
|
if (ptr->bank < 0xe) {
|
|
SetLocalFlagByBank(gLocalFlagBanks[ptr->bank], ptr->flag);
|
|
}
|
|
}
|