mirror of https://github.com/zeldaret/tmc.git
192 lines
4.1 KiB
C
192 lines
4.1 KiB
C
/**
|
|
* @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 (IS_BIT_SET(gSave.windcrests, i + 24)) {
|
|
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;
|
|
}
|