summaryrefslogtreecommitdiff
path: root/src/field_screen_effect.c
diff options
context:
space:
mode:
authordrifloony <drifloony@users.noreply.github.com>2017-07-14 08:14:10 -0700
committerdrifloony <drifloony@users.noreply.github.com>2017-07-14 15:50:29 -0700
commit1cc8e50292621ab30332d192782fd8a1e855ea51 (patch)
tree9a7c1af5e16fa464793ab6d4bd17212facee5b2c /src/field_screen_effect.c
parenta0e590b739a2bdd8e76c004ae60662bd81d33ca9 (diff)
decompile field_screen_effect and unknown_task
Diffstat (limited to 'src/field_screen_effect.c')
-rw-r--r--src/field_screen_effect.c339
1 files changed, 339 insertions, 0 deletions
diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c
new file mode 100644
index 000000000..c6bd8cb77
--- /dev/null
+++ b/src/field_screen_effect.c
@@ -0,0 +1,339 @@
+#include "global.h"
+#include "field_camera.h"
+#include "menu.h"
+#include "palette.h"
+#include "rom4.h"
+#include "script.h"
+#include "task.h"
+#include "text.h"
+#include "unknown_task.h"
+
+struct UnknownStruct1
+{
+ u8 filler0[0x14];
+ u8 unk14;
+ u8 filler15[0xB];
+};
+extern struct UnknownStruct1 gUnknown_03004DC0;
+
+extern u16 gUnknown_03004DE0[][0x3C0];
+
+const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 };
+
+const s32 gUnknown_0839ACE8 = 4;
+
+const static u32 gUnknown_0839ACEC[3] =
+{
+ REG_ADDR_WIN0H,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
+ 1
+};
+
+static void sub_808136C(u16 *dest, u32 a2, s32 a3, s32 a4)
+{
+ if (a2 <= 0xA0)
+ {
+ if (a3 < 0)
+ a3 = 0;
+ if (a3 > 255)
+ a3 = 255;
+ if (a4 < 0)
+ a4 = 0;
+ if (a4 > 255)
+ a4 = 255;
+ dest[a2] = (a3 << 8) | a4;
+ }
+}
+
+static void sub_8081398(u16 *dest, s32 a2, s32 a3, s32 a4)
+{
+ s32 v1 = a4;
+ s32 v2 = a4;
+ s32 v3 = 0;
+ while (v1 >= v3)
+ {
+ sub_808136C(dest, a3 - v3, a2 - v1, a2 + v1);
+ sub_808136C(dest, a3 + v3, a2 - v1, a2 + v1);
+ sub_808136C(dest, a3 - v1, a2 - v3, a2 + v3);
+ sub_808136C(dest, a3 + v1, a2 - v3, a2 + v3);
+ v2 -= (v3 * 2) - 1;
+ v3++;
+ if (v2 < 0)
+ {
+ v2 += 2 * (v1 - 1);
+ v1--;
+ }
+ }
+}
+
+static void sub_8081424(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.unk14][0], data[1], data[2], data[3]);
+ data[0] = 1;
+ break;
+ case 1:
+ sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.unk14][0], data[1], data[2], data[3]);
+ data[0] = 0;
+ data[3] += data[5];
+ if (data[3] > data[4])
+ {
+ if (data[6] == 1)
+ {
+ remove_some_task();
+ data[0] = 2;
+ }
+ else
+ {
+ DestroyTask(taskId);
+ }
+ }
+ break;
+ case 2:
+ dp12_8087EA4();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_80814E8(u8 taskId)
+{
+ if (!FuncIsActiveTask(sub_8081424))
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_8081510(void)
+{
+ if (!FuncIsActiveTask(sub_80814E8))
+ CreateTask(sub_80814E8, 80);
+}
+
+static u8 sub_8081534(s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, u8 a6)
+{
+ u8 taskId = CreateTask(sub_8081424, 80);
+ s16 *data = gTasks[taskId].data;
+
+ data[3] = a3;
+ data[4] = a4;
+ data[1] = a1;
+ data[2] = a2;
+ data[6] = a5;
+
+ if (a3 < a4)
+ data[5] = a6;
+ else
+ data[5] = -a6;
+
+ return taskId;
+}
+
+void sub_8081594(u8 a1)
+{
+ u8 index = sav1_get_flash_used_on_map();
+ u8 value = 0;
+ if (!a1)
+ value = 1;
+ sub_8081534(120, 80, gUnknown_0839ACDC[index], gUnknown_0839ACDC[a1], value, 1);
+ sub_8081510();
+ ScriptContext2_Enable();
+}
+
+void sub_80815E0(u8 a1)
+{
+ if (a1)
+ {
+ sub_8081398(&gUnknown_03004DE0[0][0], 120, 80, gUnknown_0839ACDC[a1]);
+ CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480);
+ }
+}
+
+static void sub_808161C(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_8081658(u16 a1)
+{
+ u8 lo = REG_BLDALPHA & 0xFF;
+ u8 hi = REG_BLDALPHA >> 8;
+
+ if (a1)
+ {
+ if (lo)
+ {
+ lo--;
+ }
+ }
+ else
+ {
+ if (hi < 0x10)
+ {
+ hi++;
+ }
+ }
+
+ REG_BLDALPHA = (hi << 8) | lo;
+
+ if (lo == 0 && hi == 0x10)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_80816A8(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;
+ REG_DISPCNT &= 0xBFFF;
+ REG_BLDCNT |= gUnknown_081E29E8[0];
+ REG_BLDALPHA = 1804;
+ REG_WININ = 63;
+ REG_WINOUT = 30;
+ sub_8081398(&gUnknown_03004DE0[0][0], data[2], data[3], 1);
+ CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480);
+ sub_80895F8(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]);
+ data[0] = 1;
+ break;
+ case 1:
+ MenuFillWindowRectWithBlankTile(0, 0, 29, 19);
+ sub_808161C(data[1]);
+ sub_8081534(data[2], data[3], 1, 160, 1, 2);
+ data[0] = 2;
+ break;
+ case 2:
+ if (!FuncIsActiveTask(sub_8081424))
+ {
+ 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_8081658(data[5]) == TRUE)
+ data[0] = 5;
+ }
+ break;
+ case 5:
+ MenuZeroFillWindowRect(0, 0, 29, 19);
+ LoadFontDefaultPalette(&gWindowConfig_81E6CE4);
+ REG_WIN0H = 255;
+ REG_DISPCNT = data[6];
+ REG_BLDCNT = data[7];
+ REG_BLDALPHA = data[8];
+ REG_WININ = data[9];
+ REG_WINOUT = data[10];
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80818A4(void)
+{
+ u8 taskId = CreateTask(sub_80816A8, 80);
+ s16 *data = gTasks[taskId].data;
+
+ if (gScriptResult == 0)
+ {
+ data[1] = 0;
+ data[2] = 104;
+ }
+ else if (gScriptResult == 1)
+ {
+ data[1] = 1;
+ data[2] = 104;
+ }
+ else if (gScriptResult == 2)
+ {
+ data[1] = 0;
+ data[2] = 120;
+ }
+ else
+ {
+ data[1] = 1;
+ data[2] = 120;
+ }
+
+ data[3] = 80;
+}
+
+void sub_80818FC(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80816A8);
+ gTasks[taskId].data[0] = 6;
+}
+
+static void task50_0807F0C8(u8);
+
+void sub_8081924(void)
+{
+ sub_8054044();
+ CreateTask(task50_0807F0C8, 80);
+}
+
+static void task50_0807F0C8(u8 taskId)
+{
+ if (sub_8054034() == TRUE)
+ {
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+}