summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tileset_anim.c596
1 files changed, 596 insertions, 0 deletions
diff --git a/src/tileset_anim.c b/src/tileset_anim.c
new file mode 100644
index 000000000..96030f037
--- /dev/null
+++ b/src/tileset_anim.c
@@ -0,0 +1,596 @@
+#include "global.h"
+
+extern u8 *gTilesetAnimTable_General_0[];
+extern u8 *gTilesetAnimTable_General_1[];
+extern u8 *gTilesetAnimTable_General_2[];
+extern u8 *gTilesetAnimTable_General_3[];
+extern u8 *gTilesetAnimTable_General_4[];
+extern u8 *gTilesetAnimTable_Lavaridge[];
+extern u8 *gTilesetAnimTable_Pacifidlog_0[];
+extern u8 *gTilesetAnimTable_Underwater[];
+extern u8 *gTilesetAnimTable_Pacifidlog_1[];
+extern u8 *gUnknown_0837BAE4[];
+extern u8 *gUnknown_0837BB04[];
+extern u8 *gTilesetAnimTable_Mauville_0A[];
+extern u8 *gTilesetAnimTable_Mauville_1A[];
+extern u8 *gTilesetAnimTable_Mauville_0B[];
+extern u8 *gTilesetAnimTable_Mauville_1B[];
+extern u8 *gUnknown_0837BFA4[];
+extern u8 *gTilesetAnimTable_Rustboro_0[];
+extern u8 *gTilesetAnimTable_Rustboro_1[];
+extern u8 *gTilesetAnimTable_Cave[];
+extern u8 *gUnknown_0837C93C[];
+extern u8 *gTilesetAnimTable_EverGrande[];
+extern u8 *gTilesetAnimTable_Building[];
+extern u8 *gTilesetAnimTable_SootopolisGym_0[];
+extern u8 *gTilesetAnimTable_SootopolisGym_1[];
+extern u8 *gTilesetAnimTable_EliteFour_0[];
+extern u8 *gTilesetAnimTable_EliteFour_1[];
+extern u8 *gTilesetAnimTable_MauvilleGym[];
+extern u8 *gTilesetAnimTable_BikeShop[];
+
+struct Dma {
+ u8 *src;
+ u8 *dest;
+ u16 size;
+};
+
+EWRAM_DATA static struct Dma gTilesetAnimDmas[20] = {0};
+
+static u8 gNumTilesetAnimDmas;
+static u16 gTileset1AnimFrame;
+static u16 gTileset1AnimLength;
+static u16 gTileset2AnimFrame;
+static u16 gTileset2AnimLength;
+static void (*gTileset1AnimCallback)(u16);
+static void (*gTileset2AnimCallback)(u16);
+
+static void StartTileset1Animation(void);
+static void StartTileset2Animation(void);
+
+static void sub_8073014(u16);
+static void sub_8073058(u16);
+
+static void sub_8073070(u16);
+static void sub_8073098(u16);
+static void sub_80730C0(u16);
+static void sub_80730E8(u16);
+static void sub_807361C(u16);
+
+static void sub_8073424(u16);
+static void sub_80734A0(u16);
+static void sub_8073514(u16);
+static void sub_8073540(u16);
+static void sub_80735B4(u16);
+static void sub_80735E4(u16);
+static void sub_80738A8(u16);
+static void sub_8073600(u16);
+static void sub_80738C0(u16);
+static void sub_8073890(u16);
+static void sub_80738EC(u16);
+
+static void sub_80737A4(u16, u8);
+static void sub_80737E0(u16);
+static void sub_8073704(u16, u8);
+static void sub_8073644(u8);
+static void sub_8073808(u16);
+static void sub_8073830(u16, u8);
+static void sub_807368C(u8);
+static void sub_80736DC(u8);
+static void sub_80736B4(u8);
+static void sub_8073868(u16);
+
+static void sub_8073904(u16);
+static void sub_80739C4(u16);
+static void sub_807392C(u16);
+static void sub_807399C(u16);
+static void sub_8073974(u16);
+static void sub_80739EC(u16);
+
+static void ClearTilesetAnimDmas(void) {
+ gNumTilesetAnimDmas = 0;
+ CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas));
+}
+
+static void QueueTilesetAnimDma(u8 *src, u8 *dest, u16 size) {
+ if (gNumTilesetAnimDmas < 20) {
+ gTilesetAnimDmas[gNumTilesetAnimDmas].src = src;
+ gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest;
+ gTilesetAnimDmas[gNumTilesetAnimDmas].size = size;
+ gNumTilesetAnimDmas++;
+ }
+}
+
+void sub_8072E74(void) {
+ int i;
+ for (i = 0; i < gNumTilesetAnimDmas; i++) {
+ DmaCopy16(3,
+ gTilesetAnimDmas[i].src,
+ gTilesetAnimDmas[i].dest,
+ gTilesetAnimDmas[i].size);
+ }
+ gNumTilesetAnimDmas = 0;
+}
+
+void cur_mapheader_run_tileset_funcs_after_some_cpuset(void) {
+ ClearTilesetAnimDmas();
+ StartTileset1Animation();
+ StartTileset2Animation();
+}
+
+void sub_8072ED0(void) {
+ StartTileset2Animation();
+}
+
+void sub_8072EDC(void) {
+ ClearTilesetAnimDmas();
+ if (++gTileset1AnimFrame >= gTileset1AnimLength) {
+ gTileset1AnimFrame = 0;
+ }
+ if (++gTileset2AnimFrame >= gTileset2AnimLength) {
+ gTileset2AnimFrame = 0;
+ }
+ if (gTileset1AnimCallback) {
+ gTileset1AnimCallback(gTileset1AnimFrame);
+ }
+ if (gTileset2AnimCallback) {
+ gTileset2AnimCallback(gTileset2AnimFrame);
+ }
+}
+
+static void StartTileset1Animation(void) {
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0;
+ gTileset1AnimCallback = 0;
+ if (gMapHeader.mapData->primaryTileset) {
+ if (gMapHeader.mapData->primaryTileset->callback) {
+ gMapHeader.mapData->primaryTileset->callback();
+ }
+ }
+}
+
+static void StartTileset2Animation(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0;
+ gTileset2AnimCallback = 0;
+ if (gMapHeader.mapData->secondaryTileset) {
+ if (gMapHeader.mapData->secondaryTileset->callback) {
+ gMapHeader.mapData->secondaryTileset->callback();
+ }
+ }
+}
+
+void TilesetCB_General(void) {
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0x100;
+ gTileset1AnimCallback = sub_8073014;
+}
+
+void TilesetCB_Building(void) {
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0x100;
+ gTileset1AnimCallback = sub_8073058;
+}
+
+static void sub_8073014(u16 a1) {
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_8073070(a1 / 0x10);
+ if (v1 == 1) sub_8073098(a1 / 0x10);
+ if (v1 == 2) sub_80730C0(a1 / 0x10);
+ if (v1 == 3) sub_80730E8(a1 / 0x10);
+ if (v1 == 4) sub_807361C(a1 / 0x10);
+}
+
+static void sub_8073058(u16 a1) {
+ if (a1 % 8 == 0) {
+ sub_8073904(a1 / 8);
+ }
+}
+
+static void sub_8073070(u16 a1) {
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1],
+ (u8 *)(BG_VRAM + 0x3f80),
+ 0x80);
+}
+
+static void sub_8073098(u16 a1) {
+ u8 v1;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1],
+ (u8 *)(BG_VRAM + 0x3600),
+ 0x3c0);
+}
+
+static void sub_80730C0(u16 a1) {
+ int v1;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1],
+ (u8 *)(BG_VRAM + 0x3a00),
+ 0x140);
+}
+
+static void sub_80730E8(u16 a1) {
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1],
+ (u8 *)(BG_VRAM + 0x3e00),
+ 0xc0);
+}
+
+void TilesetCB_Petalburg(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Rustboro(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073424;
+}
+
+void TilesetCB_Dewford(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Slateport(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Mauville(void) {
+ gTileset2AnimFrame = gTileset1AnimFrame;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80734A0;
+}
+
+void TilesetCB_Lavaridge(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073514;
+}
+
+void TilesetCB_Fallarbor(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Fortree(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Lilycove(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Mossdeep(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_EverGrande(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073540;
+}
+
+void TilesetCB_Pacifidlog(void) {
+ gTileset2AnimFrame = gTileset1AnimFrame;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80735B4;
+}
+
+void TilesetCB_Sootopolis(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Underwater(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0x80;
+ gTileset2AnimCallback = sub_80735E4;
+}
+
+void TilesetCB_SootopolisGym(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0xf0;
+ gTileset2AnimCallback = sub_80738A8;
+}
+
+void TilesetCB_Cave(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073600;
+}
+
+void TilesetCB_EliteFour(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0x80;
+ gTileset2AnimCallback = sub_80738C0;
+}
+
+void TilesetCB_MauvilleGym(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073890;
+}
+
+void TilesetCB_BikeShop(void) {
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80738EC;
+}
+
+static void sub_8073424(u16 a1) {
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0) {
+ sub_80737A4(a1 / 8, 0);
+ sub_80737E0(a1 / 8);
+ }
+ if (v1 == 1) sub_80737A4(a1 / 8, 1);
+ if (v1 == 2) sub_80737A4(a1 / 8, 2);
+ if (v1 == 3) sub_80737A4(a1 / 8, 3);
+ if (v1 == 4) sub_80737A4(a1 / 8, 4);
+ if (v1 == 5) sub_80737A4(a1 / 8, 5);
+ if (v1 == 6) sub_80737A4(a1 / 8, 6);
+ if (v1 == 7) sub_80737A4(a1 / 8, 7);
+}
+
+static void sub_80734A0(u16 a1) {
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0) sub_8073704(a1 / 8, 0);
+ if (v1 == 1) sub_8073704(a1 / 8, 1);
+ if (v1 == 2) sub_8073704(a1 / 8, 2);
+ if (v1 == 3) sub_8073704(a1 / 8, 3);
+ if (v1 == 4) sub_8073704(a1 / 8, 4);
+ if (v1 == 5) sub_8073704(a1 / 8, 5);
+ if (v1 == 6) sub_8073704(a1 / 8, 6);
+ if (v1 == 7) sub_8073704(a1 / 8, 7);
+}
+
+static void sub_8073514(u16 a1) {
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_8073644(a1 / 0x10);
+ if (v1 == 1) sub_8073808(a1 / 0x10);
+}
+
+static void sub_8073540(u16 a1) {
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0) sub_8073830(a1 / 8, 0);
+ if (v1 == 1) sub_8073830(a1 / 8, 1);
+ if (v1 == 2) sub_8073830(a1 / 8, 2);
+ if (v1 == 3) sub_8073830(a1 / 8, 3);
+ if (v1 == 4) sub_8073830(a1 / 8, 4);
+ if (v1 == 5) sub_8073830(a1 / 8, 5);
+ if (v1 == 6) sub_8073830(a1 / 8, 6);
+ if (v1 == 7) sub_8073830(a1 / 8, 7);
+}
+
+static void sub_80735B4(u16 a1) {
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_807368C(a1 / 0x10);
+ if (v1 == 1) sub_80736DC(a1 / 0x10);
+}
+
+static void sub_80735E4(u16 a1) {
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_80736B4(a1 / 0x10);
+}
+
+static void sub_8073600(u16 a1) {
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 1) sub_8073868(a1 / 0x10);
+}
+
+static void sub_807361C(u16 a1) {
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1],
+ (u8 *)(BG_VRAM + 0x3c00),
+ 0x140);
+}
+
+static void sub_8073644(u8 a1) {
+ u8 v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1],
+ (u8 *)(BG_VRAM + 0x6400),
+ 0x80);
+ v1 = (a1 + 2) % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1],
+ (u8 *)(BG_VRAM + 0x6480),
+ 0x80);
+}
+
+static void sub_807368C(u8 a1) {
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1],
+ (u8 *)(BG_VRAM + 0x7a00),
+ 0x3c0);
+}
+
+static void sub_80736B4(u8 a1) {
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1],
+ (u8 *)(BG_VRAM + 0x7e00),
+ 0x80);
+}
+
+static void sub_80736DC(u8 a1) {
+ int v1;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1],
+ (u8 *)(BG_VRAM + 0x7e00),
+ 0x100);
+}
+
+static void sub_8073704(u16 a1, u8 a2) {
+ int v1;
+ a1 -= a2;
+ if (a1 < 12) {
+ v1 = a1 % 12;
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1],
+ gUnknown_0837BAE4[a2],
+ 0x80);
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1],
+ gUnknown_0837BB04[a2],
+ 0x80);
+ } else {
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1],
+ gUnknown_0837BAE4[a2],
+ 0x80);
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1],
+ gUnknown_0837BB04[a2],
+ 0x80);
+ }
+}
+
+static void sub_80737A4(u16 a1, u8 a2) {
+ int v1;
+ a1 -= a2;
+
+ v1 = a1 % 8;
+ if (gTilesetAnimTable_Rustboro_0[v1]) {
+ QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1],
+ gUnknown_0837BFA4[a2],
+ 0x80);
+ }
+}
+
+static void sub_80737E0(u16 a1) {
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1],
+ (u8 *)(BG_VRAM + 0x7800),
+ 0x80);
+}
+
+static void sub_8073808(u16 a1) {
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1],
+ (u8 *)(BG_VRAM + 0x5400),
+ 0x80);
+}
+
+static void sub_8073830(u16 a1, u8 a2) {
+ int v1;
+ a1 -= a2;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1],
+ gUnknown_0837C93C[a2],
+ 0x80);
+}
+
+static void sub_8073868(u16 a1) {
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1],
+ (u8 *)(BG_VRAM + 0x7400),
+ 0x80);
+}
+
+static void sub_8073890(u16 a1) {
+ int v1;
+ v1 = a1 % 2;
+ if (!v1) {
+ sub_80739C4(a1 / 2);
+ }
+}
+
+static void sub_80738A8(u16 a1) {
+ int v1;
+ v1 = a1 % 8;
+ if (!v1) {
+ sub_807392C(a1 / 8);
+ }
+}
+
+static void sub_80738C0(u16 a1) {
+ if (a1 % 0x40 == 0) {
+ sub_807399C(a1 / 0x40);
+ }
+ if (a1 % 8 == 1) {
+ sub_8073974(a1 / 8);
+ }
+}
+
+static void sub_80738EC(u16 a1) {
+ if (a1 % 4 == 0) {
+ sub_80739EC(a1 / 4);
+ }
+}
+
+static void sub_8073904(u16 a1) {
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_Building[v1],
+ (u8 *)(BG_VRAM + 0x3e00),
+ 0x80);
+}
+
+static void sub_807392C(u16 a1) {
+ int v1;
+ v1 = a1 % 3;
+ QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1],
+ (u8 *)(BG_VRAM + 0x7e00),
+ 0x180);
+ QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1],
+ (u8 *)(BG_VRAM + 0x7a00),
+ 0x280);
+}
+
+static void sub_8073974(u16 a1) {
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1],
+ (u8 *)(BG_VRAM + 0x7f00),
+ 0x20);
+}
+
+static void sub_807399C(u16 a1) {
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1],
+ (u8 *)(BG_VRAM + 0x7c00),
+ 0x80);
+}
+
+static void sub_80739C4(u16 a1) {
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1],
+ (u8 *)(BG_VRAM + 0x5200),
+ 0x200);
+}
+
+static void sub_80739EC(u16 a1) {
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1],
+ (u8 *)(BG_VRAM + 0x7e00),
+ 0x120);
+}