diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-18 14:50:24 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-18 14:50:24 -0500 |
commit | af6f99b9314f75150d9a5681c17ef5f95a9b1269 (patch) | |
tree | 21c775a40a0a29d4ee5b29e6ebe3074ef8f8e917 /src/pokemon_jump.c | |
parent | e4d15a2338500e91e1f2a9723c48ecf25ae8111e (diff) |
Port pokemon_jump from emerald, 1
Diffstat (limited to 'src/pokemon_jump.c')
-rw-r--r-- | src/pokemon_jump.c | 254 |
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]++; + } +} |