summaryrefslogtreecommitdiff
path: root/src/fldeff_flash.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fldeff_flash.c')
-rw-r--r--src/fldeff_flash.c367
1 files changed, 367 insertions, 0 deletions
diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c
new file mode 100644
index 000000000..4f3a091ce
--- /dev/null
+++ b/src/fldeff_flash.c
@@ -0,0 +1,367 @@
+#include "global.h"
+#include "constants/songs.h"
+#include "braille_puzzles.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "field_effect.h"
+#include "gpu_regs.h"
+#include "gba/io_reg.h"
+#include "main.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "overworld.h"
+#include "rom6.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+
+// structures
+struct FlashStruct
+{
+ u8 unk0;
+ u8 unk1;
+ bool8 unk2;
+ bool8 unk3;
+ void (*func)(void);
+};
+
+// static functions
+static void hm2_flash(void);
+static void sub_81371B4(void);
+static bool8 sub_8137304(void);
+static void sub_81373F0(void);
+static void sub_8137404(u8 taskId);
+static void sub_8137420(u8 taskId);
+static void sub_81374C4(u8 taskId);
+static void sub_813750C(u8 taskId);
+static void sub_8137574(u8 taskId);
+static void sub_81375A8(void);
+static void sub_81375BC(u8 taskId);
+static void sub_81375D8(u8 taskId);
+static void sub_8137678(u8 taskId);
+static void sub_81376DC(u8 taskId);
+
+// rodata
+static const struct FlashStruct gUnknown_085B27C8[] =
+{
+ {1, 4, 1, 0, sub_81375A8},
+ {2, 4, 1, 0, sub_81375A8},
+ {3, 4, 1, 0, sub_81375A8},
+ {5, 4, 1, 0, sub_81375A8},
+ {6, 4, 1, 0, sub_81375A8},
+ {7, 4, 1, 0, sub_81375A8},
+ {8, 4, 1, 0, sub_81375A8},
+ {9, 4, 1, 0, sub_81375A8},
+ {4, 1, 0, 1, sub_81373F0},
+ {4, 2, 0, 1, sub_81373F0},
+ {4, 3, 0, 1, sub_81373F0},
+ {4, 5, 0, 1, sub_81373F0},
+ {4, 6, 0, 1, sub_81373F0},
+ {4, 7, 0, 1, sub_81373F0},
+ {4, 8, 0, 1, sub_81373F0},
+ {4, 9, 0, 1, sub_81373F0},
+ {0, 0, 0, 0, NULL},
+};
+
+static const u16 gCaveTransitionPalette_White[] = INCBIN_U16("graphics/misc/cave_transition_white.gbapal");
+static const u16 gCaveTransitionPalette_Black[] = INCBIN_U16("graphics/misc/cave_transition_black.gbapal");
+
+static const u16 gUnknown_085B2890[] = INCBIN_U16("graphics/misc/85B2890.gbapal");
+static const u16 gUnknown_085B28A0[] = INCBIN_U16("graphics/misc/85B28A0.gbapal");
+static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz");
+static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz");
+
+// text
+bool8 SetUpFieldMove_Flash(void)
+{
+ if (ShouldDoBrailleFlyEffect())
+ {
+ gSpecialVar_Result = GetCursorSelectionMonId();
+ gUnknown_03005DB0 = FieldCallback_Teleport;
+ gUnknown_0203CEEC = sub_8179918;
+ return TRUE;
+ }
+ else if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH))
+ {
+ gUnknown_03005DB0 = FieldCallback_Teleport;
+ gUnknown_0203CEEC = hm2_flash;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void hm2_flash(void)
+{
+ u8 taskId = oei_task_add();
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ gTasks[taskId].data[8] = (uintptr_t)sub_81371B4 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_81371B4;
+}
+
+static void sub_81371B4(void)
+{
+ PlaySE(SE_W115);
+ FlagSet(FLAG_SYS_USE_FLASH);
+ ScriptContext1_SetupScript(EventScript_2926F8);
+}
+
+static void sub_81371D4(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_81371EC(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void c2_change_map(void)
+{
+ u16 ime;
+
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+ ResetPaletteFade();
+ ResetTasks();
+ ResetSpriteData();
+ ime = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = ime;
+ SetVBlankCallback(sub_81371EC);
+ SetMainCallback2(sub_81371D4);
+ if (!sub_8137304())
+ SetMainCallback2(gMain.savedCallback);
+}
+
+static bool8 sub_8137304(void)
+{
+ u8 i;
+ u8 v0 = get_map_light_from_warp0();
+ u8 v1 = Overworld_GetMapTypeOfSaveblockLocation();
+
+ for (i = 0; gUnknown_085B27C8[i].unk0; i++)
+ {
+ if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
+ {
+ gUnknown_085B27C8[i].func();
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 sub_8137360(u8 a1, u8 a2)
+{
+ u8 i;
+ u8 v0 = a1;
+ u8 v1 = a2;
+
+ for (i = 0; gUnknown_085B27C8[i].unk0; i++)
+ {
+ if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
+ {
+ return gUnknown_085B27C8[i].unk2;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 fade_type_for_given_maplight_pair(u8 a1, u8 a2)
+{
+ u8 i;
+ u8 v0 = a1;
+ u8 v1 = a2;
+
+ for (i = 0; gUnknown_085B27C8[i].unk0; i++)
+ {
+ if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
+ {
+ return gUnknown_085B27C8[i].unk3;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_81373F0(void)
+{
+ CreateTask(sub_8137404, 0);
+}
+
+static void sub_8137404(u8 taskId)
+{
+ gTasks[taskId].func = sub_8137420;
+}
+
+static void sub_8137420(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000);
+ LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800);
+ LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
+ LoadPalette(gUnknown_085B28A0, 0xE0, 0x10);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
+ | BLDCNT_EFFECT_BLEND
+ | BLDCNT_TGT2_BG1
+ | BLDCNT_TGT2_BG2
+ | BLDCNT_TGT2_BG3
+ | BLDCNT_TGT2_OBJ
+ | BLDCNT_TGT2_BD);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(3)
+ | BGCNT_SCREENBASE(31)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_OBJ_ON);
+ gTasks[taskId].func = sub_81374C4;
+ gTasks[taskId].data[0] = 16;
+ gTasks[taskId].data[1] = 0;
+}
+
+static void sub_81374C4(u8 taskId)
+{
+ u16 count = gTasks[taskId].data[1];
+ u16 blend = count + 0x1000;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, blend);
+ if (count <= 0x10)
+ {
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_813750C;
+ }
+}
+
+static void sub_813750C(u8 taskId)
+{
+ u16 count;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 16));
+ count = gTasks[taskId].data[2];
+
+ if (count < 8)
+ {
+ gTasks[taskId].data[2]++;
+ LoadPalette(&gUnknown_085B28A0[count], 0xE0, 16 - 2 * count);
+ }
+ else
+ {
+ LoadPalette(gCaveTransitionPalette_White, 0, 0x20);
+ gTasks[taskId].func = sub_8137574;
+ gTasks[taskId].data[2] = 8;
+ }
+}
+
+static void sub_8137574(u8 taskId)
+{
+ if (gTasks[taskId].data[2])
+ gTasks[taskId].data[2]--;
+ else
+ SetMainCallback2(gMain.savedCallback);
+}
+
+static void sub_81375A8(void)
+{
+ CreateTask(sub_81375BC, 0);
+}
+
+static void sub_81375BC(u8 taskId)
+{
+ gTasks[taskId].func = sub_81375D8;
+}
+
+static void sub_81375D8(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000);
+ LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(3)
+ | BGCNT_SCREENBASE(31)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_OBJ_ON);
+ LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
+ LoadPalette(gCaveTransitionPalette_Black, 0, 0x20);
+ gTasks[taskId].func = sub_8137678;
+ gTasks[taskId].data[0] = 16;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+}
+
+static void sub_8137678(u8 taskId)
+{
+ u16 count = gTasks[taskId].data[2];
+
+ if (count < 16)
+ {
+ gTasks[taskId].data[2]++;
+ gTasks[taskId].data[2]++;
+ LoadPalette(&gUnknown_085B2890[15 - count], 0xE0, 2 * (count + 1));
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 16));
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
+ | BLDCNT_EFFECT_BLEND
+ | BLDCNT_TGT2_BG1
+ | BLDCNT_TGT2_BG2
+ | BLDCNT_TGT2_BG3
+ | BLDCNT_TGT2_OBJ
+ | BLDCNT_TGT2_BD);
+ gTasks[taskId].func = sub_81376DC;
+ }
+}
+
+static void sub_81376DC(u8 taskId)
+{
+ u16 count = 16 - gTasks[taskId].data[1];
+ u16 blend = count + 0x1000;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, blend);
+ if (count)
+ {
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ LoadPalette(gCaveTransitionPalette_Black, 0, 0x20);
+ SetMainCallback2(gMain.savedCallback);
+ }
+}