summaryrefslogtreecommitdiff
path: root/src/subtask/subtaskFastTravel.c
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-09-05 22:50:19 +0200
committeranonymous <>2022-10-08 22:32:54 +0200
commit67467fd831d2928715835f8a389b4f464a0f9a7a (patch)
tree261864c07f334c35024033a908b4af8e808caebe /src/subtask/subtaskFastTravel.c
parent756a8a89da46dade06fad1723de88fa5a82cc2ec (diff)
Extract some data
And split up subtasks and world events.
Diffstat (limited to 'src/subtask/subtaskFastTravel.c')
-rw-r--r--src/subtask/subtaskFastTravel.c191
1 files changed, 191 insertions, 0 deletions
diff --git a/src/subtask/subtaskFastTravel.c b/src/subtask/subtaskFastTravel.c
new file mode 100644
index 00000000..0f657cb7
--- /dev/null
+++ b/src/subtask/subtaskFastTravel.c
@@ -0,0 +1,191 @@
+/**
+ * @file subtaskFastTravel.c
+ * @ingroup Subtasks
+ *
+ * @brief Fast Travel Subtask
+ */
+#include "subtask.h"
+#include "common.h"
+#include "menu.h"
+#include "functions.h"
+#include "message.h"
+#include "sound.h"
+#include "save.h"
+
+extern void (*const Subtask_FastTravel_Functions[])(void);
+void sub_080A6E70(void);
+u32 sub_080A6D74(u32);
+void sub_080A6EE0(u32 param_1);
+
+extern const ScreenTransitionData gUnk_08128024[];
+
+void Subtask_FastTravel(void) {
+ FlushSprites();
+ Subtask_FastTravel_Functions[gMenu.menuType]();
+ if (gMenu.field_0x0 != 0) {
+ sub_080A6E70();
+ }
+ sub_080A6498();
+ CopyOAM();
+}
+
+void Subtask_FastTravel_0(void) {
+ sub_080A4D34();
+ sub_080A4DB8(0xd);
+ sub_080A6290();
+ gMenu.field_0x3 = sub_080A6D74(0);
+ SetMenuType(1);
+ SetFade(FADE_INSTANT, 8);
+}
+
+void Subtask_FastTravel_1(void) {
+ u32 uVar1;
+ u32 uVar2;
+
+ if (gFadeControl.active) {
+ return;
+ }
+
+ gMenu.field_0x0 = 1;
+ uVar2 = 0;
+
+ switch (gInput.newKeys) {
+ case DPAD_LEFT:
+ case DPAD_UP:
+ uVar2 = -1;
+ break;
+ case DPAD_RIGHT:
+ case DPAD_DOWN:
+ uVar2 = 1;
+ break;
+ case A_BUTTON:
+ case START_BUTTON:
+ gMenu.field_0x0 = 2;
+ SetMenuType(2);
+ MessageFromTarget(TEXT_INDEX(TEXT_WINDCRESTS, 0x04));
+ break;
+ case B_BUTTON:
+ gMenu.field_0x0 = 3;
+ SetMenuType(3);
+ break;
+ }
+
+ if (uVar2) {
+ uVar1 = sub_080A6D74(uVar2);
+ if (uVar1 != gMenu.field_0x3) {
+ gMenu.field_0x3 = uVar1;
+ SoundReq(SFX_TEXTBOX_CHOICE);
+ }
+ }
+}
+
+u32 sub_080A6D74(u32 param_1) {
+ u32 uVar1;
+ u32 uVar2;
+ u32 uVar3;
+
+ uVar3 = gSave.windcrests >> 0x18;
+ uVar2 = gMenu.field_0x3;
+ if (param_1 == 0) {
+ uVar2 = 0;
+ if ((uVar3 & 1) == 0) {
+ while (++uVar2 < 8 && ((1 << uVar2) & uVar3) == 0) {}
+ }
+ } else if (uVar3 != 0) {
+ do {
+ uVar2 = (uVar2 + param_1 + 8) & 7;
+ } while ((1 << uVar2 & uVar3) == 0);
+ }
+ return uVar2 & 7;
+}
+
+void Subtask_FastTravel_2(void) {
+ u32 tmp;
+ switch (sub_08056338()) {
+#ifdef EU
+ case 0:
+ gMenu.field_0x0 = 2;
+ break;
+ case 1:
+ gMenu.field_0x0 = 3;
+ tmp = 1;
+ break;
+ default:
+ return;
+ }
+
+ if (tmp) {
+ SetMenuType(3);
+ }
+#else
+ case 0:
+ gMenu.field_0x0 = 2;
+ tmp = 3;
+ break;
+ case 1:
+ tmp = 1;
+ break;
+ default:
+ return;
+ }
+ SetMenuType(tmp);
+#endif
+}
+
+void Subtask_FastTravel_3(void) {
+ if (gMenu.field_0x0 == 2) {
+ SetMenuType(4);
+ SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
+ } else {
+ ResetPlayerAnimationAndAction();
+ sub_080042D0(&gPlayerEntity, (u32)gPlayerEntity.animIndex, gPlayerEntity.spriteIndex);
+ Subtask_Exit();
+ gPauseMenuOptions.disabled = 0;
+ SoundReq(SFX_MENU_CANCEL);
+ }
+}
+
+void Subtask_FastTravel_4(void) {
+ if (gFadeControl.active == 0) {
+ sub_080A71F4(&gUnk_08128024[gMenu.field_0x3]);
+ }
+}
+
+void sub_080A6E70(void) {
+ u32 frameIndex;
+ u32 i;
+
+ gOamCmd._4 = 0;
+ gOamCmd._6 = 0;
+ gOamCmd._8 = 0x400;
+ gGenericMenu.unk2c++;
+ sub_080A6EE0(gMenu.field_0x3);
+ if ((gGenericMenu.unk2c & 0x10) != 0) {
+ frameIndex = 0x5d;
+ } else {
+ frameIndex = 0x5e;
+ }
+
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex);
+ for (i = 0; i < 8; i++) {
+ if ((gSave.windcrests & (1 << (i + 0x18))) != 0) {
+ sub_080A6EE0(i);
+ DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x5c);
+ }
+ }
+}
+
+void sub_080A6EE0(u32 param_1) {
+ u32 x;
+ u32 y;
+ RoomHeader* roomHeader;
+ const ScreenTransitionData* ptr = &gUnk_08128024[param_1];
+
+ x = (u16)ptr->playerXPos;
+ y = (u16)ptr->playerYPos;
+ roomHeader = &gAreaRoomHeaders[ptr->area][ptr->room];
+ x += roomHeader->map_x;
+ y += roomHeader->map_y;
+ gOamCmd.x = (s32)(x * DISPLAY_HEIGHT) / 0xf90 + 0x28;
+ gOamCmd.y = (s32)(y * DISPLAY_HEIGHT) / 0xf90 + 0xc;
+}