summaryrefslogtreecommitdiff
path: root/src/pc_screen_effect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pc_screen_effect.c')
-rw-r--r--src/pc_screen_effect.c156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/pc_screen_effect.c b/src/pc_screen_effect.c
new file mode 100644
index 000000000..5cc09df71
--- /dev/null
+++ b/src/pc_screen_effect.c
@@ -0,0 +1,156 @@
+#include "global.h"
+#include "task.h"
+#include "gpu_regs.h"
+#include "palette.h"
+
+static void sub_80A0AC0(TaskFunc func, u16 a2, UNUSED u16 a3, u8 priority);
+static void sub_80A0B0C(u8 taskId);
+static void sub_80A0C78(u8 taskId);
+
+void sub_80A0A48(u16 a1, u16 a2, u8 a3)
+{
+ sub_80A0AC0(sub_80A0B0C, a1, a2, a3);
+}
+
+void sub_80A0A70(u16 a1, u16 a2, u8 a3)
+{
+ sub_80A0AC0(sub_80A0C78, a1, a2, a3);
+}
+
+bool8 sub_80A0A98(void)
+{
+ return FuncIsActiveTask(sub_80A0B0C);
+}
+
+bool8 sub_80A0AAC(void)
+{
+ return FuncIsActiveTask(sub_80A0C78);
+}
+
+static void sub_80A0AC0(TaskFunc func, u16 a2, UNUSED u16 a3, u8 priority)
+{
+ u8 taskId = CreateTask(func, priority);
+
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = a2 == 0 ? 16 : a2;
+ gTasks[taskId].data[2] = a2 == 0 ? 20 : a2;
+ gTasks[taskId].func(taskId);
+}
+
+static void sub_80A0B0C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[3] = 120;
+ task->data[4] = 120;
+ task->data[5] = 80;
+ task->data[6] = 81;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ break;
+ case 1:
+ task->data[7] = GetGpuReg(REG_OFFSET_BLDCNT);
+ task->data[8] = GetGpuReg(REG_OFFSET_BLDY);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN);
+ SetGpuReg(REG_OFFSET_BLDY, 16);
+ break;
+ case 2:
+ task->data[3] -= task->data[1];
+ task->data[4] += task->data[1];
+ if (task->data[3] <= 0 || task->data[4] >= DISPLAY_WIDTH)
+ {
+ task->data[3] = 0;
+ task->data[4] = DISPLAY_WIDTH;
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, task->data[7]);
+ BlendPalettes(0xFFFFFFFF, 0, RGB_BLACK);
+ gPlttBufferFaded[0] = 0;
+ }
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4]));
+ if (task->data[3])
+ return;
+ break;
+ case 3:
+ task->data[5] -= task->data[2];
+ task->data[6] += task->data[2];
+ if (task->data[5] <= 0 || task->data[6] >= DISPLAY_HEIGHT)
+ {
+ task->data[5] = 0;
+ task->data[6] = DISPLAY_HEIGHT;
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6]));
+ if (task->data[5])
+ return;
+ break;
+ default:
+ SetGpuReg(REG_OFFSET_BLDCNT, task->data[7]);
+ DestroyTask(taskId);
+ return;
+ }
+ ++task->data[0];
+}
+
+static void sub_80A0C78(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ gPlttBufferFaded[0] = 0;
+ break;
+ case 1:
+ task->data[3] = 0;
+ task->data[4] = DISPLAY_WIDTH;
+ task->data[5] = 0;
+ task->data[6] = DISPLAY_HEIGHT;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ break;
+ case 2:
+ task->data[5] += task->data[2];
+ task->data[6] -= task->data[2];
+ if (task->data[5] >= 80 || task->data[6] <= 81)
+ {
+ task->data[5] = 80;
+ task->data[6] = 81;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN);
+ SetGpuReg(REG_OFFSET_BLDY, 16);
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6]));
+ if (task->data[5] != 80)
+ return;
+ break;
+ case 3:
+ task->data[3] += task->data[1];
+ task->data[4] -= task->data[1];
+ if (task->data[3] >= 120 || task->data[4] <= 120)
+ {
+ task->data[3] = 120;
+ task->data[4] = 120;
+ BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK);
+ gPlttBufferFaded[0] = 0;
+ }
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4]));
+ if (task->data[3] != 120)
+ return;
+ break;
+ default:
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ DestroyTask(taskId);
+ return;
+ }
+ ++task->data[0];
+}