summaryrefslogtreecommitdiff
path: root/src/pokemon_jump.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-02-18 14:50:24 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-02-18 14:50:24 -0500
commitaf6f99b9314f75150d9a5681c17ef5f95a9b1269 (patch)
tree21c775a40a0a29d4ee5b29e6ebe3074ef8f8e917 /src/pokemon_jump.c
parente4d15a2338500e91e1f2a9723c48ecf25ae8111e (diff)
Port pokemon_jump from emerald, 1
Diffstat (limited to 'src/pokemon_jump.c')
-rw-r--r--src/pokemon_jump.c254
1 files changed, 254 insertions, 0 deletions
diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c
new file mode 100644
index 000000000..063176151
--- /dev/null
+++ b/src/pokemon_jump.c
@@ -0,0 +1,254 @@
+#include "global.h"
+#include "gflib.h"
+#include "battle_anim.h"
+#include "decompress.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "task.h"
+#include "constants/songs.h"
+
+static void sub_8147654(u8 taskId);
+static void sub_81477C0(u8 taskId);
+static void sub_814784C(u8 taskId);
+static void sub_81479D4(u8 taskId);
+static void sub_8147A34(u8 taskId);
+
+static const u16 gUnknown_846AFE8[] = INCBIN_U16("graphics/misc/unk_846B008.gbapal");
+static const u32 gUnknown_846B008[] = INCBIN_U32("graphics/misc/unk_846B008.4bpp.lz");
+
+static const struct CompressedSpriteSheet gUnknown_846B42C[] = {
+ {gUnknown_846B008, 0x0C00, 0x2000},
+ {}
+};
+
+static const struct SpritePalette gUnknown_846B43C[] = {
+ {gUnknown_846AFE8, 0x2000},
+ {}
+};
+
+static const union AnimCmd gUnknown_846B44C[] = {
+ ANIMCMD_FRAME(0x00, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B454[] = {
+ ANIMCMD_FRAME(0x10, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B45C[] = {
+ ANIMCMD_FRAME(0x20, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B464[] = {
+ ANIMCMD_FRAME(0x40, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B46C[] = {
+ ANIMCMD_FRAME(0x30, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B474[] = {
+ ANIMCMD_FRAME(0x50, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_846B47C[] = {
+ gUnknown_846B44C,
+ gUnknown_846B454,
+ gUnknown_846B45C,
+ gUnknown_846B464,
+ gUnknown_846B46C,
+ gUnknown_846B474
+};
+
+static const struct SpriteTemplate gUnknown_846B494[] = {
+ {
+ .tileTag = 0x2000,
+ .paletteTag = 0x2000,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gUnknown_846B47C,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+ },
+};
+
+static const TaskFunc gUnknown_846B4AC[][4] = {
+ { sub_81477C0, sub_814784C, sub_81479D4, sub_8147A34 }
+};
+
+// Unused, but looks like it was intended to be a hook
+UNUSED u8 sub_81475C0(u8 data1, u8 priority)
+{
+ u8 taskId;
+ struct Task * task;
+
+ taskId = CreateTask(sub_8147654, priority);
+ task = &gTasks[taskId];
+ task->data[0] = 1;
+ task->data[1] = data1;
+ gUnknown_846B4AC[data1][0](taskId);
+ return taskId;
+}
+
+// Unused, but looks like it was intended to be a hook
+UNUSED bool32 sub_814760C(void)
+{
+ u8 taskId;
+
+ taskId = FindTaskIdByFunc(sub_8147654);
+ if (taskId == 0xFF)
+ return FALSE;
+ gTasks[taskId].data[0] = 2;
+ return TRUE;
+}
+
+// Unused, but looks like it was intended to be a hook
+UNUSED bool32 sub_8147640(void)
+{
+ return FuncIsActiveTask(sub_8147654);
+}
+
+static void sub_8147654(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 2:
+ gUnknown_846B4AC[data[1]][2](taskId);
+ data[0] = 3;
+ break;
+ case 3:
+ gUnknown_846B4AC[data[1]][3](taskId);
+ break;
+ case 4:
+ gUnknown_846B4AC[data[1]][1](taskId);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_81476E0(u8 taskId, s16 *data)
+{
+ u8 i;
+ struct Sprite *sprite;
+
+ LoadCompressedSpriteSheet(&gUnknown_846B42C[data[3]]);
+ LoadSpritePalette(&gUnknown_846B43C[data[4]]);
+ for (i = 0; i < data[8]; i++)
+ data[13 + i] = CreateSprite(&gUnknown_846B494[data[2]], data[9], data[10], data[7]);
+ for (i = 0; i < data[8]; i++)
+ {
+ sprite = &gSprites[data[13 + i]];
+ sprite->oam.priority = data[6];
+ sprite->invisible = TRUE;
+ sprite->data[1] = data[5];
+ sprite->data[3] = taskId;
+ sprite->data[4] = i;
+ sprite->data[5] = data[13];
+ }
+}
+
+static void sub_81477C0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ data[2] = 0;
+ data[3] = 0;
+ data[4] = 0;
+ data[5] = 60;
+ data[6] = 0;
+ data[7] = 0;
+ data[8] = 3;
+ data[9] = 120;
+ data[10] = 88;
+ sub_81476E0(taskId, data);
+
+ StartSpriteAnim(&gSprites[data[14]], 4);
+ gSprites[data[14]].pos2.x = -32;
+
+ StartSpriteAnim(&gSprites[data[15]], 5);
+ gSprites[data[15]].pos2.x = 32;
+}
+
+static void sub_814784C(u8 taskId)
+{
+ u8 i = 0;
+ s16 *data = gTasks[taskId].data;
+
+ for (i = 0; i < data[8]; i++)
+ DestroySprite(&gSprites[data[13 + i]]);
+ FreeSpriteTilesByTag(gUnknown_846B42C[data[3]].tag);
+ FreeSpritePaletteByTag(gUnknown_846B43C[data[4]].tag);
+}
+
+static void sub_81478BC(struct Sprite *sprite)
+{
+ s16 *data = gTasks[sprite->data[3]].data;
+
+ if (data[11] % data[5] != 0)
+ return;
+ if (data[11] == data[10])
+ return;
+
+ data[10] = data[11];
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->invisible = FALSE;
+ case 1:
+ case 2:
+ PlaySE(SE_KON);
+ StartSpriteAnim(sprite, sprite->data[2]);
+ break;
+ case 3:
+ PlaySE(SE_PIN);
+ StartSpriteAnim(sprite, sprite->data[2]);
+ gSprites[data[14]].invisible = FALSE;
+ gSprites[data[15]].invisible = FALSE;
+ break;
+ case 4:
+ sprite->invisible = TRUE;
+ gSprites[data[14]].invisible = TRUE;
+ gSprites[data[15]].invisible = TRUE;
+ data[0] = 4;
+ return;
+ }
+ sprite->data[2]++;
+}
+
+static void sub_81479D4(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ PlaySE(SE_KON);
+ gSprites[data[13]].callback = sub_81478BC;
+ gSprites[data[13]].invisible = FALSE;
+ gTasks[taskId].data[0] = 3;
+}
+
+static void sub_8147A34(u8 taskId)
+{
+ u16 packet[6];
+ s16 *data = gTasks[taskId].data;
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ if (gRecvCmds[0][1] == 0x7FFF)
+ data[11] = gRecvCmds[0][2];
+ if (GetMultiplayerId() == 0)
+ {
+ data[12]++;
+ memset(packet, 0, sizeof(packet));
+ packet[0] = 0x7FFF;
+ packet[1] = data[12];
+ RfuPrepareSend0x2f00(packet);
+ }
+ }
+ else
+ {
+ data[11]++;
+ }
+}