mirror of
https://github.com/zeldaret/tmc
synced 2026-07-11 07:25:23 -04:00
Extract some data
And split up subtasks and world events.
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
/**
|
||||
* @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].unk7 != 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user