summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/field_effect.c24
-rw-r--r--src/field_fadetransition.c1258
-rw-r--r--src/fldeff_flash.c4
-rw-r--r--src/overworld.c6
4 files changed, 1275 insertions, 17 deletions
diff --git a/src/field_effect.c b/src/field_effect.c
index 935501130..6bfa4facf 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -244,7 +244,7 @@ extern void pal_fill_for_maplights(void);
extern void sub_80E1558(u8);
extern void sub_80E1570(void);
extern bool8 sub_80E1584(void);
-extern void sub_80AF0B4(void);
+extern void WarpFadeScreen(void);
// .rodata
const u32 gNewGameBirchPic[] = INCBIN_U32("graphics/birch_speech/birch.4bpp");
@@ -1593,8 +1593,8 @@ static void sub_80B7004(struct Task *task)
static void sub_80B7050(void)
{
- music_something();
- sub_80AF0B4();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
}
static void sub_80B7060(void)
@@ -1943,8 +1943,8 @@ static bool8 sub_80B7704(struct Task *task, struct EventObject *eventObject, str
static bool8 sub_80B77F8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
- music_something();
- sub_80AF0B4();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
task->data[0]++;
return FALSE;
}
@@ -2099,8 +2099,8 @@ static bool8 sub_80B7BCC(struct Task *task, struct EventObject *eventObject, str
{
if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
{
- music_something();
- sub_80AF0B4();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
task->data[0]++;
}
return FALSE;
@@ -2161,8 +2161,8 @@ static void EscapeRopeFieldEffect_Step1(struct Task *task)
u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
if (task->data[14] != 0 && (--task->data[14]) == 0)
{
- music_something();
- sub_80AF0B4();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
}
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject))
@@ -2314,8 +2314,8 @@ static void TeleportFieldEffectTask3(struct Task *task)
if (task->data[4] >= 0xa8)
{
task->data[0]++;
- music_something();
- sub_80AF0B4();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
}
}
@@ -3123,7 +3123,7 @@ static void sub_80B9474(struct Task *task)
{
if (sub_80B9508(task->data[1]))
{
- sub_80AF0B4();
+ WarpFadeScreen();
task->data[0]++;
}
}
diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c
new file mode 100644
index 000000000..2d8a6c303
--- /dev/null
+++ b/src/field_fadetransition.c
@@ -0,0 +1,1258 @@
+#include "global.h"
+#include "cable_club.h"
+#include "event_data.h"
+#include "fieldmap.h"
+#include "field_camera.h"
+#include "field_door.h"
+#include "field_effect.h"
+#include "field_fadetransition.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "field_special_scene.h"
+#include "field_weather.h"
+// #include "fldeff_flash.h"
+#include "gpu_regs.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "load_save.h"
+#include "main.h"
+#include "menu.h"
+#include "event_obj_lock.h"
+#include "metatile_behavior.h"
+#include "palette.h"
+#include "overworld.h"
+#include "scanline_effect.h"
+#include "script.h"
+#include "sound.h"
+#include "start_menu.h"
+#include "task.h"
+#include "text.h"
+#include "constants/event_object_movement_constants.h"
+#include "constants/songs.h"
+#include "constants/rgb.h"
+
+extern bool32 sub_81D6534(void);
+extern bool8 walkrun_is_standing_still(void);
+extern void ScriptUnfreezeEventObjects(void);
+extern void sub_81BE72C(void);
+extern void sub_80FB768(void);
+extern void sub_808D194(void);
+extern void sub_808D1C8(void);
+extern bool32 sub_808D1B4(void);
+extern bool32 sub_808D1E8(void);
+
+extern const u16 gUnknown_82EC7CC[];
+
+void sub_8080B9C(u8);
+void task_map_chg_seq_0807E20C(u8);
+void task_map_chg_seq_0807E2CC(u8);
+void task0A_fade_n_map_maybe(u8);
+void sub_808115C(u8);
+void palette_bg_faded_fill_white(void);
+u8 GetMapPairFadeToType(u8, u8);
+u8 GetMapPairFadeFromType(u8, u8);
+void sub_808C0A8(u8);
+void sub_80AF438(u8);
+bool32 sub_80AF71C(void);
+void task0A_mpl_807E31C(u8 taskId);
+void sub_80AFA0C(u8 taskId);
+void sub_80AFA88(u8 taskId);
+void sub_80B6B68(void);
+void sub_80B6E4C(u8, u8);
+void sub_80B75D8(u8);
+void sub_80B7A74(u8);
+/*static*/ void task50_0807F0C8(u8);
+
+const u16 sFlashLevelPixelRadii[] = { 200, 72, 64, 56, 48, 40, 32, 24, 0 };
+const s32 gMaxFlashLevel = 8;
+
+const struct ScanlineEffectParams sFlashEffectParams =
+{
+ (void *)REG_ADDR_WIN0H,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
+ 1
+};
+
+void palette_bg_faded_fill_white(void)
+{
+ CpuFastFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE);
+}
+
+void palette_bg_faded_fill_black(void)
+{
+ CpuFastFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE);
+}
+
+void pal_fill_for_maplights(void)
+{
+ u8 previousMapType = GetLastUsedWarpMapType();
+ switch (GetMapPairFadeFromType(previousMapType, Overworld_GetMapTypeOfSaveblockLocation()))
+ {
+ case 0:
+ palette_bg_faded_fill_black();
+ FadeScreen(FADE_FROM_BLACK, 0);
+ break;
+ case 1:
+ palette_bg_faded_fill_white();
+ FadeScreen(FADE_FROM_WHITE, 0);
+ }
+}
+
+void sub_80AF08C(void)
+{
+ palette_bg_faded_fill_white();
+ FadeScreen(FADE_FROM_WHITE, 8);
+}
+
+void pal_fill_black(void)
+{
+ palette_bg_faded_fill_black();
+ FadeScreen(FADE_FROM_BLACK, 0);
+}
+
+void WarpFadeScreen(void)
+{
+ u8 currentMapType = Overworld_GetMapTypeOfSaveblockLocation();
+ switch (GetMapPairFadeToType(currentMapType, GetDestinationWarpMapHeader()->mapType))
+ {
+ case 0:
+ FadeScreen(FADE_TO_BLACK, 0);
+ break;
+ case 1:
+ FadeScreen(FADE_TO_WHITE, 0);
+ }
+}
+
+void sub_80AF0F4(u8 arg)
+{
+ sub_808C0A8(!arg);
+}
+
+void task0A_nop_for_a_while(u8 taskId)
+{
+ if (sub_80AF71C() == TRUE)
+ DestroyTask(taskId);
+}
+
+void sub_80AF128(void)
+{
+ ScriptContext2_Enable();
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_black();
+ CreateTask(task0A_nop_for_a_while, 10);
+}
+
+void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID)
+{
+ if (sub_80AF71C() == TRUE)
+ {
+ DestroyTask(taskID);
+ EnableBothScriptContexts();
+ }
+}
+
+void sub_80AF168(void)
+{
+ ScriptContext2_Enable();
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_black();
+ CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10);
+}
+
+void sub_80AF188(void)
+{
+ ScriptContext2_Enable();
+ pal_fill_black();
+ CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10);
+}
+
+void task_mpl_807DD60(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[1] = sub_80B3050();
+ task->data[0]++;
+ break;
+ case 1:
+ if (gTasks[task->data[1]].isActive != TRUE)
+ {
+ pal_fill_for_maplights();
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (sub_80AF71C() == TRUE)
+ {
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80AF214(void)
+{
+ ScriptContext2_Enable();
+ Overworld_PlaySpecialMapMusic();
+ palette_bg_faded_fill_black();
+ CreateTask(task_mpl_807DD60, 10);
+}
+
+void sub_80AF234(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_800ADF8();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!sub_800A520())
+ {
+ if (++task->data[1] > 1800)
+ sub_8011170(0x6000);
+ }
+ else
+ {
+ pal_fill_for_maplights();
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (sub_80AF71C() == TRUE)
+ {
+ sub_8009F18();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80AF2B4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_800ADF8();
+ task->data[0]++;
+ break;
+ case 1:
+ if (sub_800A520())
+ {
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ sub_8009F18();
+ sub_8086C2C();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80AF314(void)
+{
+ ScriptContext2_Enable();
+ Overworld_PlaySpecialMapMusic();
+ palette_bg_faded_fill_black();
+ CreateTask(sub_80AF234, 10);
+}
+
+void sub_80AF334(void)
+{
+ s16 x, y;
+ u8 behavior;
+ TaskFunc func;
+
+ PlayerGetDestCoords(&x, &y);
+ behavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (MetatileBehavior_IsDoor(behavior) == TRUE)
+ func = sub_80AF438;
+ else if (MetatileBehavior_IsNonAnimDoor(behavior) == TRUE)
+ func = task_map_chg_seq_0807E20C;
+ else
+ func = task_map_chg_seq_0807E2CC;
+ CreateTask(func, 10);
+}
+
+void mapldr_default(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_for_maplights();
+ sub_80AF334();
+ ScriptContext2_Enable();
+}
+
+void sub_80AF3B0(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ sub_80AF08C();
+ sub_80AF334();
+ ScriptContext2_Enable();
+}
+
+void sub_80AF3C8(void)
+{
+ if (!sub_81D6534())
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_black();
+ sub_80AF334();
+ ScriptContext2_Enable();
+}
+
+void sub_80AF3E8(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_for_maplights();
+ PlaySE(SE_TK_WARPOUT);
+ CreateTask(task0A_mpl_807E31C, 10);
+ ScriptContext2_Enable();
+}
+
+void sub_80AF40C(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_for_maplights();
+ PlaySE(SE_TK_WARPOUT);
+ CreateTask(task_map_chg_seq_0807E2CC, 10);
+ ScriptContext2_Enable();
+ sub_8085540(0xE);
+}
+
+void sub_80AF438(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ s16 *x = &task->data[2];
+ s16 *y = &task->data[3];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_80AF0F4(0);
+ FreezeEventObjects();
+ PlayerGetDestCoords(x, y);
+ FieldSetDoorOpened(*x, *y);
+ task->data[0] = 1;
+ break;
+ case 1:
+ if (sub_80AF71C())
+ {
+ u8 eventObjId;
+ sub_80AF0F4(1);
+ eventObjId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectSetHeldMovement(&gEventObjects[eventObjId], MOVEMENT_ACTION_WALK_NORMAL_DOWN);
+ task->data[0] = 2;
+ }
+ break;
+ case 2:
+ if (walkrun_is_standing_still())
+ {
+ u8 eventObjId;
+ task->data[1] = FieldAnimateDoorClose(*x, *y);
+ eventObjId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[eventObjId]);
+ task->data[0] = 3;
+ }
+ break;
+ case 3:
+ if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE)
+ {
+ UnfreezeEventObjects();
+ task->data[0] = 4;
+ }
+ break;
+ case 4:
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void task_map_chg_seq_0807E20C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ s16 *x = &task->data[2];
+ s16 *y = &task->data[3];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_80AF0F4(0);
+ FreezeEventObjects();
+ PlayerGetDestCoords(x, y);
+ task->data[0] = 1;
+ break;
+ case 1:
+ if (sub_80AF71C())
+ {
+ u8 eventObjId;
+ sub_80AF0F4(1);
+ eventObjId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectSetHeldMovement(&gEventObjects[eventObjId], GetWalkNormalMovementAction(GetPlayerFacingDirection()));
+ task->data[0] = 2;
+ }
+ break;
+ case 2:
+ if (walkrun_is_standing_still())
+ {
+ UnfreezeEventObjects();
+ task->data[0] = 3;
+ }
+ break;
+ case 3:
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void task_map_chg_seq_0807E2CC(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ FreezeEventObjects();
+ ScriptContext2_Enable();
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (sub_80AF71C())
+ {
+ UnfreezeEventObjects();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80AF660(u8 taskId)
+{
+ if (sub_80AF71C() == TRUE)
+ {
+ DestroyTask(taskId);
+ CreateTask(sub_809FA34, 80);
+ }
+}
+
+void sub_80AF688(void)
+{
+ pal_fill_black();
+ CreateTask(sub_80AF660, 0x50);
+ ScriptContext2_Enable();
+}
+
+bool32 sub_80AF6A4(void)
+{
+ sub_809FA18();
+ return FALSE;
+}
+
+void task_mpl_807E3C8(u8 taskId)
+{
+ if (sub_80AF71C() == 1)
+ {
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ ScriptUnfreezeEventObjects();
+ }
+}
+
+void sub_80AF6D4(void)
+{
+ ScriptContext2_Enable();
+ pal_fill_black();
+ CreateTask(task_mpl_807E3C8, 10);
+}
+
+void sub_80AF6F0(void)
+{
+ ScriptContext2_Enable();
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_black();
+ CreateTask(task_mpl_807E3C8, 10);
+}
+
+bool32 PaletteFadeActive(void)
+{
+ return gPaletteFade.active;
+}
+
+bool32 sub_80AF71C(void)
+{
+ if (IsWeatherNotFadingIn() == TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_80AF734(void)
+{
+ ScriptContext2_Enable();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
+ PlayRainSoundEffect();
+ PlaySE(SE_KAIDAN);
+ gFieldCallback = mapldr_default;
+ CreateTask(sub_80AFA0C, 10);
+}
+
+void sp13E_warp_to_last_warp(void)
+{
+ ScriptContext2_Enable();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
+ PlayRainSoundEffect();
+ gFieldCallback = mapldr_default;
+ CreateTask(sub_80AFA0C, 10);
+}
+
+void sub_80AF79C(void)
+{
+ ScriptContext2_Enable();
+ TryFadeOutOldMapMusic();
+ FadeScreen(FADE_TO_WHITE, 8);
+ PlayRainSoundEffect();
+ gFieldCallback = sub_80AF3B0;
+ CreateTask(sub_80AFA0C, 10);
+}
+
+void sub_80AF7D0(void)
+{
+ ScriptContext2_Enable();
+ gFieldCallback = mapldr_default;
+ CreateTask(sub_80AFA88, 10);
+}
+
+void sp13F_fall_to_last_warp(void)
+{
+ sp13E_warp_to_last_warp();
+ gFieldCallback = sub_80B6B68;
+}
+
+void sub_80AF80C(u8 metatileBehavior)
+{
+ ScriptContext2_Enable();
+ sub_80B6E4C(metatileBehavior, 10);
+}
+
+void sub_80AF828(void)
+{
+ ScriptContext2_Enable();
+ sub_80B75D8(10);
+}
+
+void sub_80AF838(void)
+{
+ ScriptContext2_Enable();
+ sub_80B7A74(10);
+}
+
+void sub_80AF848(void)
+{
+ ScriptContext2_Enable();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
+ PlaySE(SE_TK_WARPIN);
+ CreateTask(sub_80AFA0C, 10);
+ gFieldCallback = sub_80AF3E8;
+}
+
+void sub_80AF87C(void)
+{
+ sub_8085540(1);
+ ScriptContext2_Enable();
+ SaveEventObjects();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
+ PlaySE(SE_TK_WARPIN);
+ CreateTask(sub_80AFA0C, 10);
+ gFieldCallback = sub_80AF40C;
+}
+
+void sub_80AF8B8(void)
+{
+ ScriptContext2_Enable();
+ WarpFadeScreen();
+ CreateTask(sub_80AFA0C, 10);
+ gFieldCallback = sub_80FB768;
+}
+
+void sub_80AF8E0(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ ScriptContext2_Enable();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!PaletteFadeActive() && BGMusicStopped())
+ task->data[0]++;
+ break;
+ case 2:
+ WarpIntoMap();
+ SetMainCallback2(sub_8086074);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80AF948(void)
+{
+ ScriptContext2_Enable();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
+ PlaySE(SE_KAIDAN);
+ CreateTask(sub_80AF8E0, 10);
+}
+
+void sub_80AF96C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ ClearLinkCallback_2();
+ FadeScreen(FADE_TO_BLACK, 0);
+ TryFadeOutOldMapMusic();
+ PlaySE(SE_KAIDAN);
+ data[0]++;
+ break;
+ case 1:
+ if (!PaletteFadeActive() && BGMusicStopped())
+ {
+ sub_800AC34();
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ WarpIntoMap();
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80AF9F8(void)
+{
+ CreateTask(sub_80AF96C, 10);
+}
+
+void sub_80AFA0C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ FreezeEventObjects();
+ ScriptContext2_Enable();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!PaletteFadeActive())
+ {
+ if (task->data[1] == 0)
+ {
+ sub_81BE72C();
+ task->data[1] = 1;
+ }
+ if (BGMusicStopped())
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ WarpIntoMap();
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80AFA88(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ s16 *x = &task->data[2];
+ s16 *y = &task->data[3];
+
+ switch (task->data[0])
+ {
+ case 0:
+ FreezeEventObjects();
+ PlayerGetDestCoords(x, y);
+ PlaySE(GetDoorSoundEffect(*x, *y - 1));
+ task->data[1] = FieldAnimateDoorOpen(*x, *y - 1);
+ task->data[0] = 1;
+ break;
+ case 1:
+ if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE)
+ {
+ u8 eventObjId;
+ eventObjId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectClearHeldMovementIfActive(&gEventObjects[eventObjId]);
+ eventObjId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectSetHeldMovement(&gEventObjects[eventObjId], MOVEMENT_ACTION_WALK_NORMAL_UP);
+ task->data[0] = 2;
+ }
+ break;
+ case 2:
+ if (walkrun_is_standing_still())
+ {
+ u8 eventObjId;
+ task->data[1] = FieldAnimateDoorClose(*x, *y - 1);
+ eventObjId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[eventObjId]);
+ sub_80AF0F4(0);
+ task->data[0] = 3;
+ }
+ break;
+ case 3:
+ if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE)
+ {
+ task->data[0] = 4;
+ }
+ break;
+ case 4:
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
+ PlayRainSoundEffect();
+ task->data[0] = 0;
+ task->func = sub_80AFA0C;
+ break;
+ }
+}
+
+void task0A_fade_n_map_maybe(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ FreezeEventObjects();
+ ScriptContext2_Enable();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!PaletteFadeActive() && BGMusicStopped())
+ {
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ WarpIntoMap();
+ SetMainCallback2(sub_8086024);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80AFC60(void)
+{
+ ScriptContext2_Enable();
+ TryFadeOutOldMapMusic();
+ WarpFadeScreen();
+ PlayRainSoundEffect();
+ PlaySE(SE_KAIDAN);
+ gFieldCallback = sub_80AF3C8;
+ CreateTask(task0A_fade_n_map_maybe, 10);
+}
+
+/*static*/ void SetFlashScanlineEffectWindowBoundary(u16 *dest, u32 y, s32 left, s32 right)
+{
+ if (y <= 160)
+ {
+ if (left < 0)
+ left = 0;
+ if (left > 255)
+ left = 255;
+ if (right < 0)
+ right = 0;
+ if (right > 255)
+ right = 255;
+ dest[y] = (left << 8) | right;
+ }
+}
+
+/*static*/ void SetFlashScanlineEffectWindowBoundaries(u16 *dest, s32 centerX, s32 centerY, s32 radius)
+{
+ s32 r = radius;
+ s32 v2 = radius;
+ s32 v3 = 0;
+ while (r >= v3)
+ {
+ SetFlashScanlineEffectWindowBoundary(dest, centerY - v3, centerX - r, centerX + r);
+ SetFlashScanlineEffectWindowBoundary(dest, centerY + v3, centerX - r, centerX + r);
+ SetFlashScanlineEffectWindowBoundary(dest, centerY - r, centerX - v3, centerX + v3);
+ SetFlashScanlineEffectWindowBoundary(dest, centerY + r, centerX - v3, centerX + v3);
+ v2 -= (v3 * 2) - 1;
+ v3++;
+ if (v2 < 0)
+ {
+ v2 += 2 * (r - 1);
+ r--;
+ }
+ }
+}
+
+/*static*/ void SetFlash2ScanlineEffectWindowBoundary(u16 *dest, u32 y, s32 left, s32 right)
+{
+ if (y <= 160)
+ {
+ if (left < 0)
+ left = 0;
+ if (left > 240)
+ left = 240;
+ if (right < 0)
+ right = 0;
+ if (right > 240)
+ right = 240;
+ dest[y] = (left << 8) | right;
+ }
+}
+
+/*static*/ void SetFlash2ScanlineEffectWindowBoundaries(u16 *dest, s32 centerX, s32 centerY, s32 radius)
+{
+ s32 r = radius;
+ s32 v2 = radius;
+ s32 v3 = 0;
+ while (r >= v3)
+ {
+ SetFlash2ScanlineEffectWindowBoundary(dest, centerY - v3, centerX - r, centerX + r);
+ SetFlash2ScanlineEffectWindowBoundary(dest, centerY + v3, centerX - r, centerX + r);
+ SetFlash2ScanlineEffectWindowBoundary(dest, centerY - r, centerX - v3, centerX + v3);
+ SetFlash2ScanlineEffectWindowBoundary(dest, centerY + r, centerX - v3, centerX + v3);
+ v2 -= (v3 * 2) - 1;
+ v3++;
+ if (v2 < 0)
+ {
+ v2 += 2 * (r - 1);
+ r--;
+ }
+ }
+}
+
+#define tFlashCenterX data[1]
+#define tFlashCenterY data[2]
+#define tCurFlashRadius data[3]
+#define tDestFlashRadius data[4]
+#define tFlashRadiusDelta data[5]
+#define tClearScanlineEffect data[6]
+
+/*static*/ void UpdateFlashLevelEffect(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ SetFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius);
+ data[0] = 1;
+ break;
+ case 1:
+ SetFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius);
+ data[0] = 0;
+ tCurFlashRadius += tFlashRadiusDelta;
+ if (tCurFlashRadius > tDestFlashRadius)
+ {
+ if (tClearScanlineEffect == 1)
+ {
+ ScanlineEffect_Stop();
+ data[0] = 2;
+ }
+ else
+ {
+ DestroyTask(taskId);
+ }
+ }
+ break;
+ case 2:
+ ScanlineEffect_Clear();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+/*static*/ void UpdateFlash2LevelEffect(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ SetFlash2ScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius);
+ data[0] = 1;
+ break;
+ case 1:
+ SetFlash2ScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius);
+ data[0] = 0;
+ tCurFlashRadius += tFlashRadiusDelta;
+ if (tCurFlashRadius > tDestFlashRadius)
+ {
+ if (tClearScanlineEffect == 1)
+ {
+ ScanlineEffect_Stop();
+ data[0] = 2;
+ }
+ else
+ {
+ DestroyTask(taskId);
+ }
+ }
+ break;
+ case 2:
+ ScanlineEffect_Clear();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+/*static*/ void sub_80AFF90(u8 taskId)
+{
+ if (!FuncIsActiveTask(UpdateFlashLevelEffect))
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+/*static*/ void sub_80AFFB8(void)
+{
+ if (!FuncIsActiveTask(sub_80AFF90))
+ CreateTask(sub_80AFF90, 80);
+}
+
+/*static*/ u8 sub_80AFFDC(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, s32 clearScanlineEffect, u8 delta)
+{
+ u8 taskId = CreateTask(UpdateFlashLevelEffect, 80);
+ s16 *data = gTasks[taskId].data;
+
+ tCurFlashRadius = initialFlashRadius;
+ tDestFlashRadius = destFlashRadius;
+ tFlashCenterX = centerX;
+ tFlashCenterY = centerY;
+ tClearScanlineEffect = clearScanlineEffect;
+
+ if (initialFlashRadius < destFlashRadius)
+ tFlashRadiusDelta = delta;
+ else
+ tFlashRadiusDelta = -delta;
+
+ return taskId;
+}
+
+/*static*/ u8 sub_80B003C(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, s32 clearScanlineEffect, u8 delta)
+{
+ u8 taskId = CreateTask(UpdateFlash2LevelEffect, 80);
+ s16 *data = gTasks[taskId].data;
+
+ tCurFlashRadius = initialFlashRadius;
+ tDestFlashRadius = destFlashRadius;
+ tFlashCenterX = centerX;
+ tFlashCenterY = centerY;
+ tClearScanlineEffect = clearScanlineEffect;
+
+ if (initialFlashRadius < destFlashRadius)
+ tFlashRadiusDelta = delta;
+ else
+ tFlashRadiusDelta = -delta;
+
+ return taskId;
+}
+
+#undef tCurFlashRadius
+#undef tDestFlashRadius
+#undef tFlashRadiusDelta
+#undef tClearScanlineEffect
+
+void sub_80B009C(u8 flashLevel)
+{
+ u8 curFlashLevel = Overworld_GetFlashLevel();
+ u8 value = 0;
+ if (!flashLevel)
+ value = 1;
+ sub_80AFFDC(120, 80, sFlashLevelPixelRadii[curFlashLevel], sFlashLevelPixelRadii[flashLevel], value, 1);
+ sub_80AFFB8();
+ ScriptContext2_Enable();
+}
+
+void WriteFlashScanlineEffectBuffer(u8 flashLevel)
+{
+ if (flashLevel)
+ {
+ SetFlashScanlineEffectWindowBoundaries(&gScanlineEffectRegBuffers[0][0], 120, 80, sFlashLevelPixelRadii[flashLevel]);
+ CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480);
+ }
+}
+
+void door_upload_tiles(void)
+{
+ SetFlashScanlineEffectWindowBoundaries(&gScanlineEffectRegBuffers[0][0], 120, 80, gSaveBlock2Ptr->frontier.field_E68);
+ CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480);
+}
+
+void task0A_mpl_807E31C(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ FreezeEventObjects();
+ ScriptContext2_Enable();
+ sub_808D194();
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (sub_80AF71C() && sub_808D1B4() != TRUE)
+ {
+ UnfreezeEventObjects();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80B01BC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ FreezeEventObjects();
+ ScriptContext2_Enable();
+ PlaySE(SE_TK_WARPIN);
+ sub_808D1C8();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!sub_808D1E8())
+ {
+ WarpFadeScreen();
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (!PaletteFadeActive() && BGMusicStopped())
+ task->data[0]++;
+ break;
+ case 3:
+ WarpIntoMap();
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80B0244(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(sub_80AFA0C, 10);
+ gFieldCallback = sub_80AF3E8;
+}
+
+void sub_80B0268(void)
+{
+ ScriptContext2_Enable();
+ gFieldCallback = mapldr_default;
+ CreateTask(sub_80B01BC, 10);
+}
+
+/*static*/ void sub_80B028C(u8 a1)
+{
+ int i;
+ u16 color[1];
+
+ if (!a1)
+ color[0] = 0x1F;
+ else
+ color[0] = 0x7C00;
+
+ for (i = 0; i < 16; i++)
+ {
+ LoadPalette(color, 0xF0 + i, 2);
+ }
+}
+
+/*static*/ bool8 sub_80B02C8(u16 a1)
+{
+ u8 lo = REG_BLDALPHA & 0xFF;
+ u8 hi = REG_BLDALPHA >> 8;
+
+ if (a1)
+ {
+ if (lo)
+ {
+ lo--;
+ }
+ }
+ else
+ {
+ if (hi < 0x10)
+ {
+ hi++;
+ }
+ }
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, (hi << 8) | lo);
+
+ if (lo == 0 && hi == 0x10)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+/*static*/ void sub_80B0318(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[6] = REG_DISPCNT;
+ data[7] = REG_BLDCNT;
+ data[8] = REG_BLDALPHA;
+ data[9] = REG_WININ;
+ data[10] = REG_WINOUT;
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);
+ SetGpuRegBits(REG_OFFSET_BLDCNT, gUnknown_82EC7CC[0]);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 1804);
+ SetGpuReg(REG_OFFSET_WININ, 63);
+ SetGpuReg(REG_OFFSET_WINOUT, 30);
+ sub_8199C30(0, 0, 0, 0x1E, 0x14, 0xF);
+ schedule_bg_copy_tilemap_to_vram(0);
+ SetFlash2ScanlineEffectWindowBoundaries(&gScanlineEffectRegBuffers[0][0], data[2], data[3], 1);
+ CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480);
+ ScanlineEffect_SetParams(sFlashEffectParams);
+ data[0] = 1;
+ break;
+ case 1:
+ sub_8199DF0(0, 17, 0, 1);
+ sub_80B028C(data[1]);
+ sub_80B003C(data[2], data[3], 1, 160, 1, 2);
+ data[0] = 2;
+ break;
+ case 2:
+ if (!FuncIsActiveTask(UpdateFlash2LevelEffect))
+ {
+ EnableBothScriptContexts();
+ data[0] = 3;
+ }
+ break;
+ case 3:
+ InstallCameraPanAheadCallback();
+ SetCameraPanningCallback(NULL);
+ data[5] = 0;
+ data[4] = 4;
+ data[0] = 4;
+ break;
+ case 4:
+ data[4]--;
+ if (!data[4])
+ {
+ s32 panning;
+ data[4] = 4;
+ data[5] ^= 1;
+ if (data[5])
+ panning = 4;
+ else
+ panning = -4;
+ SetCameraPanning(0, panning);
+ }
+ break;
+ case 6:
+ InstallCameraPanAheadCallback();
+ data[4] = 8;
+ data[0] = 7;
+ break;
+ case 7:
+ data[4]--;
+ if (!data[4])
+ {
+ data[4] = 8;
+ data[5] ^= 1;
+ if (sub_80B02C8(data[5]) == TRUE)
+ {
+ data[0] = 5;
+ sub_8199DF0(0, 0, 0, 1);
+ }
+ }
+ break;
+ case 5:
+ SetGpuReg(REG_OFFSET_WIN0H, 255);
+ SetGpuReg(REG_OFFSET_DISPCNT, data[6]);
+ SetGpuReg(REG_OFFSET_BLDCNT, data[7]);
+ SetGpuReg(REG_OFFSET_BLDALPHA, data[8]);
+ SetGpuReg(REG_OFFSET_WININ, data[9]);
+ SetGpuReg(REG_OFFSET_WINOUT, data[10]);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80B0534(void)
+{
+ u8 taskId = CreateTask(sub_80B0318, 80);
+ s16 *data = gTasks[taskId].data;
+
+ if (gSpecialVar_Result == 0)
+ {
+ data[1] = 0;
+ data[2] = 104;
+ }
+ else if (gSpecialVar_Result == 1)
+ {
+ data[1] = 1;
+ data[2] = 136;
+ }
+ else if (gSpecialVar_Result == 2)
+ {
+ data[1] = 0;
+ data[2] = 120;
+ }
+ else
+ {
+ data[1] = 1;
+ data[2] = 120;
+ }
+
+ data[3] = 80;
+}
+
+void sub_80B058C(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80B0318);
+ gTasks[taskId].data[0] = 6;
+}
+
+void sub_80B05B4(void)
+{
+ Overworld_FadeOutMapMusic();
+ CreateTask(task50_0807F0C8, 80);
+}
+
+/*static*/ void task50_0807F0C8(u8 taskId)
+{
+ if (BGMusicStopped() == TRUE)
+ {
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+}
diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c
index 9771232f2..8862caa9f 100644
--- a/src/fldeff_flash.c
+++ b/src/fldeff_flash.c
@@ -170,7 +170,7 @@ static bool8 sub_8137304(void)
return FALSE;
}
-bool8 sub_8137360(u8 a1, u8 a2)
+bool8 GetMapPairFadeToType(u8 a1, u8 a2)
{
u8 i;
u8 v0 = a1;
@@ -187,7 +187,7 @@ bool8 sub_8137360(u8 a1, u8 a2)
return FALSE;
}
-bool8 fade_type_for_given_maplight_pair(u8 a1, u8 a2)
+bool8 GetMapPairFadeFromType(u8 a1, u8 a2)
{
u8 i;
u8 v0 = a1;
diff --git a/src/overworld.c b/src/overworld.c
index 470e27ffc..a60ac9a54 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -129,7 +129,7 @@ extern void sub_80A0A38(void);
extern void trainer_hill_map_load_related(void);
extern void sub_8087D74(void);
extern void battle_pyramid_map_load_related(u8);
-extern void sub_80B00E8(u8);
+extern void WriteFlashScanlineEffectBuffer(u8);
extern void sub_80E9238(u8);
extern void sub_81AA2F8(void);
extern void sub_8195E10(void);
@@ -1241,7 +1241,7 @@ u8 GetMapMusicFadeoutSpeed(void)
return 4;
}
-void music_something(void)
+void TryFadeOutOldMapMusic(void)
{
u16 currentMusic = GetCurrentMapMusic();
u16 warpMusic = GetWarpDestinationMusic();
@@ -1819,7 +1819,7 @@ static void InitCurrentFlashLevelScanlineEffect(void)
}
else if ((flashLevel = Overworld_GetFlashLevel()))
{
- sub_80B00E8(flashLevel);
+ WriteFlashScanlineEffectBuffer(flashLevel);
ScanlineEffect_SetParams(sFlashEffectParams);
}
}