summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_7.c50
-rw-r--r--src/battle_anim.c4
-rw-r--r--src/berry_tag_screen.c4
-rw-r--r--src/credits.c6
-rw-r--r--src/decompress.c64
-rwxr-xr-xsrc/field_effect.c3
-rw-r--r--src/intro.c18
-rw-r--r--src/money.c4
-rw-r--r--src/pokeball.c1193
-rw-r--r--src/pokedex.c10
-rw-r--r--src/pokemon_3.c8
-rw-r--r--src/script_pokemon_util_80C4BF0.c19
-rw-r--r--src/starter_choose.c4
-rw-r--r--src/title_screen.c6
-rw-r--r--src/wallclock.c2
15 files changed, 1296 insertions, 99 deletions
diff --git a/src/battle_7.c b/src/battle_7.c
index a2990018e..a93237608 100644
--- a/src/battle_7.c
+++ b/src/battle_7.c
@@ -55,21 +55,21 @@ extern void (*gAnimScriptCallback)(void);
extern u8 gAnimScriptActive;
extern const u8 *const gBattleAnims_Unknown1[];
extern const u8 *const gBattleAnims_Unknown2[];
-extern const struct SpriteSheet gTrainerFrontPicTable[];
+extern const struct CompressedSpriteSheet gTrainerFrontPicTable[];
extern const struct MonCoords gTrainerFrontPicCoords[];
-extern const struct SpritePalette gTrainerFrontPicPaletteTable[];
+extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const u8 gSubstituteDollTilemap[];
extern const u8 gSubstituteDollGfx[];
extern const u8 gSubstituteDollPal[];
-extern const struct SpriteSheet gUnknown_081FAF24;
+extern const struct CompressedSpriteSheet gUnknown_081FAF24;
extern const struct SpriteTemplate gSpriteTemplate_81FAF34;
extern void (*const gOpponentBufferCommands[])(void);
-extern const struct SpriteSheet gUnknown_0820A47C;
-extern const struct SpriteSheet gUnknown_0820A484;
-extern const struct SpriteSheet gUnknown_0820A48C[];
-extern const struct SpriteSheet gUnknown_0820A49C[];
-extern const struct SpriteSheet gUnknown_0820A4AC;
-extern const struct SpriteSheet gUnknown_0820A4B4[];
+extern const struct CompressedSpriteSheet gUnknown_0820A47C;
+extern const struct CompressedSpriteSheet gUnknown_0820A484;
+extern const struct CompressedSpriteSheet gUnknown_0820A48C[];
+extern const struct CompressedSpriteSheet gUnknown_0820A49C[];
+extern const struct CompressedSpriteSheet gUnknown_0820A4AC;
+extern const struct CompressedSpriteSheet gUnknown_0820A4B4[];
extern const struct SpritePalette gUnknown_0820A4D4[];
extern const u8 gUnknown_08D09C48[];
@@ -84,10 +84,8 @@ extern u8 sub_8078874(u8);
extern u8 sub_8077F68(u8);
extern u8 sub_8077F7C(u8);
extern void sub_8094958(void);
-extern const u16 *pokemon_get_pal(struct Pokemon *);
extern void sub_80105DC(struct Sprite *);
extern void move_anim_start_t2();
-extern const u16 *species_and_otid_get_pal();
void sub_80315E8(u8);
u8 sub_803163C(u8);
@@ -283,7 +281,7 @@ void sub_8031794(struct Pokemon *pkmn, u8 b)
u32 otId;
u8 var;
u16 paletteOffset;
- const u16 *palette;
+ const u8 *lzPaletteData;
personalityValue = GetMonData(pkmn, MON_DATA_PERSONALITY);
if (ewram17800[b].unk2 == 0)
@@ -308,16 +306,16 @@ void sub_8031794(struct Pokemon *pkmn, u8 b)
r7);
paletteOffset = 0x100 + b * 16;
if (ewram17800[b].unk2 == 0)
- palette = pokemon_get_pal(pkmn);
+ lzPaletteData = pokemon_get_pal(pkmn);
else
- palette = species_and_otid_get_pal(species, otId, personalityValue);
- sub_800D238(palette, ewram);
+ lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue);
+ sub_800D238(lzPaletteData, ewram);
LoadPalette(ewram, paletteOffset, 0x20);
LoadPalette(ewram, 0x80 + b * 16, 0x20);
if (species == SPECIES_CASTFORM)
{
paletteOffset = 0x100 + b * 16;
- sub_800D238(palette, ewram + 0x16400);
+ sub_800D238(lzPaletteData, ewram + 0x16400);
LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20);
}
if (ewram17800[b].unk2 != 0)
@@ -335,7 +333,7 @@ void sub_80318FC(struct Pokemon *pkmn, u8 b)
u32 otId;
u8 var;
u16 paletteOffset;
- const u16 *palette;
+ const u8 *lzPaletteData;
personalityValue = GetMonData(pkmn, MON_DATA_PERSONALITY);
if (ewram17800[b].unk2 == 0)
@@ -360,16 +358,16 @@ void sub_80318FC(struct Pokemon *pkmn, u8 b)
r7);
paletteOffset = 0x100 + b * 16;
if (ewram17800[b].unk2 == 0)
- palette = pokemon_get_pal(pkmn);
+ lzPaletteData = pokemon_get_pal(pkmn);
else
- palette = species_and_otid_get_pal(species, otId, personalityValue);
- sub_800D238(palette, ewram);
+ lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue);
+ sub_800D238(lzPaletteData, ewram);
LoadPalette(ewram, paletteOffset, 0x20);
LoadPalette(ewram, 0x80 + b * 16, 0x20);
if (species == SPECIES_CASTFORM)
{
paletteOffset = 0x100 + b * 16;
- sub_800D238(palette, ewram + 0x16400);
+ sub_800D238(lzPaletteData, ewram + 0x16400);
LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20);
}
if (ewram17800[b].unk2 != 0)
@@ -390,7 +388,7 @@ void nullsub_9(u16 unused)
void sub_8031A6C(u16 a, u8 b)
{
u8 status;
- struct SpriteSheet spriteSheet;
+ struct CompressedSpriteSheet spriteSheet;
status = GetBankIdentity(b);
DecompressPicFromTable_2(
@@ -624,7 +622,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
u32 personalityValue;
u32 otId;
u8 r10;
- const u16 *palette;
+ const u8 *lzPaletteData;
if (c)
{
@@ -697,14 +695,14 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
dst = (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32);
DmaCopy32(3, src, dst, 0x800);
paletteOffset = 0x100 + a * 16;
- palette = species_and_otid_get_pal(species, otId, personalityValue);
- sub_800D238(palette, ewram);
+ lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue);
+ sub_800D238(lzPaletteData, ewram);
LoadPalette(ewram, paletteOffset, 32);
if (species == SPECIES_CASTFORM)
{
u16 *paletteSrc = (u16 *)(ewram + 0x16400);
- sub_800D238(palette, paletteSrc);
+ sub_800D238(lzPaletteData, paletteSrc);
LoadPalette(paletteSrc + gBattleMonForms[b] * 16, paletteOffset, 32);
}
BlendPalette(paletteOffset, 16, 6, 0x7FFF);
diff --git a/src/battle_anim.c b/src/battle_anim.c
index cc856d5cd..55ede1788 100644
--- a/src/battle_anim.c
+++ b/src/battle_anim.c
@@ -58,8 +58,8 @@ extern struct MusicPlayerInfo gMPlay_SE2;
extern const u16 gUnknown_081C7160[];
extern const u8 *const gBattleAnims_Moves[];
-extern const struct SpriteSheet gBattleAnimPicTable[];
-extern const struct SpritePalette gBattleAnimPaletteTable[];
+extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
+extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
extern const struct BattleAnimBackground gBattleAnimBackgroundTable[];
static void RunAnimScriptCommand(void);
diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c
index 5647d4593..116ca2cca 100644
--- a/src/berry_tag_screen.c
+++ b/src/berry_tag_screen.c
@@ -38,8 +38,8 @@ extern struct BerryTagStatus gUnknown_0203932E;
extern u16 gScriptItemId;
extern u16 gUnknown_030041B4;
-extern const struct SpriteSheet gUnknown_083C1F74;
-extern const struct SpritePalette gUnknown_083C1F7C;
+extern const struct CompressedSpriteSheet gUnknown_083C1F74;
+extern const struct CompressedSpritePalette gUnknown_083C1F7C;
extern u8 *gUnknown_0841192C[];
diff --git a/src/credits.c b/src/credits.c
index a7d6191e6..8ec126a41 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -1495,7 +1495,7 @@ void spritecb_81454E0(struct Sprite *sprite) {
static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position)
{
u32 personality;
- const u16 *palette;
+ const u8 *lzPaletteData;
u8 spriteId;
u8 spriteId2;
@@ -1527,8 +1527,8 @@ static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position)
1
);
- palette = species_and_otid_get_pal(species, 0, 0xFFFF);
- LoadCompressedPalette(palette, 0x100 + (position * 16), 0x20);
+ lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF);
+ LoadCompressedPalette(lzPaletteData, 0x100 + (position * 16), 0x20);
sub_8143648(position, position);
spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0);
diff --git a/src/decompress.c b/src/decompress.c
index 1d38447b5..d7f7087a7 100644
--- a/src/decompress.c
+++ b/src/decompress.c
@@ -16,57 +16,57 @@ void LZDecompressVram(const void *src, void *dest)
LZ77UnCompVram(src, dest);
}
-void LoadCompressedObjectPic(const struct SpriteSheet *a)
+void LoadCompressedObjectPic(const struct CompressedSpriteSheet *src)
{
- struct SpriteSheet spriteSheet;
+ struct SpriteSheet dest;
- LZ77UnCompWram(a->data, (void *)WRAM);
- spriteSheet.data = (void *)WRAM;
- spriteSheet.size = a->size;
- spriteSheet.tag = a->tag;
- LoadSpriteSheet(&spriteSheet);
+ LZ77UnCompWram(src->data, (void *)WRAM);
+ dest.data = (void *)WRAM;
+ dest.size = src->size;
+ dest.tag = src->tag;
+ LoadSpriteSheet(&dest);
}
-void LoadCompressedObjectPicOverrideBuffer(const struct SpriteSheet *a, void *buffer)
+void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer)
{
- struct SpriteSheet spriteSheet;
+ struct SpriteSheet dest;
- LZ77UnCompWram(a->data, buffer);
- spriteSheet.data = buffer;
- spriteSheet.size = a->size;
- spriteSheet.tag = a->tag;
- LoadSpriteSheet(&spriteSheet);
+ LZ77UnCompWram(src->data, buffer);
+ dest.data = buffer;
+ dest.size = src->size;
+ dest.tag = src->tag;
+ LoadSpriteSheet(&dest);
}
-void LoadCompressedObjectPalette(const struct SpritePalette *a)
+void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src)
{
- struct SpritePalette spritePalette;
+ struct SpritePalette dest;
- LZ77UnCompWram(a->data, (void *)WRAM);
- spritePalette.data = (void *)WRAM;
- spritePalette.tag = a->tag;
- LoadSpritePalette(&spritePalette);
+ LZ77UnCompWram(src->data, (void *)WRAM);
+ dest.data = (void *)WRAM;
+ dest.tag = src->tag;
+ LoadSpritePalette(&dest);
}
-void LoadCompressedObjectPaletteOverrideBuffer(const struct SpritePalette *a, void *buffer)
+void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer)
{
- struct SpritePalette spritePalette;
+ struct SpritePalette dest;
LZ77UnCompWram(a->data, buffer);
- spritePalette.data = buffer;
- spritePalette.tag = a->tag;
- LoadSpritePalette(&spritePalette);
+ dest.data = buffer;
+ dest.tag = a->tag;
+ LoadSpritePalette(&dest);
}
-void DecompressPicFromTable_2(const struct SpriteSheet *a, u8 b, u8 c, void *d, void *e, s32 species)
+void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, u8 b, u8 c, void *d, void *buffer, s32 species)
{
if (species > SPECIES_EGG)
- LZ77UnCompWram(gMonFrontPicTable[0].data, e);
+ LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
else
- LZ77UnCompWram(a->data, e);
+ LZ77UnCompWram(src->data, buffer);
}
-void HandleLoadSpecialPokePic(const struct SpriteSheet *spriteSheet, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g)
+void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g)
{
u32 frontOrBack;
@@ -76,10 +76,10 @@ void HandleLoadSpecialPokePic(const struct SpriteSheet *spriteSheet, u32 b, u32
else
frontOrBack = 1; // frontPic
- LoadSpecialPokePic(spriteSheet, b, c, d, dest, species, g, frontOrBack);
+ LoadSpecialPokePic(src, b, c, d, dest, species, g, frontOrBack);
}
-void LoadSpecialPokePic(const struct SpriteSheet *spriteSheet, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g, u32 frontOrBack)
+void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g, u32 frontOrBack)
{
u8 frontOrBack8 = frontOrBack;
@@ -101,7 +101,7 @@ void LoadSpecialPokePic(const struct SpriteSheet *spriteSheet, u32 b, u32 c, u32
else if (species > SPECIES_EGG) // is species unknown? draw the ? icon
LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
else
- LZ77UnCompWram(spriteSheet->data, dest);
+ LZ77UnCompWram(src->data, dest);
DrawSpindaSpots(species, g, dest, frontOrBack8);
}
diff --git a/src/field_effect.c b/src/field_effect.c
index 9591bb6a0..a7f0e4129 100755
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -657,7 +657,8 @@ u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority)
u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority)
{
- const struct SpritePalette *spritePalette;
+ const struct CompressedSpritePalette *spritePalette;
+
HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g);
spritePalette = sub_80409C8(species, d, g);
LoadCompressedObjectPalette(spritePalette);
diff --git a/src/intro.c b/src/intro.c
index f13bd04e6..396f5e5df 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -31,7 +31,7 @@ extern struct GcmbStruct gMultibootProgramStruct;
extern u16 gSaveFileStatus;
extern u8 gReservedSpritePaletteCount;
extern const u8 gInterfaceGfx_PokeBall[];
-extern const u16 gInterfacePal_PokeBall[];
+extern const u8 gInterfacePal_PokeBall[];
extern const u8 gIntroCopyright_Gfx[];
extern const u16 gIntroCopyright_Pal[];
extern const u16 gIntroCopyright_Tilemap[];
@@ -411,12 +411,12 @@ static const struct SpriteTemplate gSpriteTemplate_840AFF0 =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_813DA64,
};
-const struct SpriteSheet gUnknown_0840B008[] =
+const struct CompressedSpriteSheet gUnknown_0840B008[] =
{
{gIntroTiles, 0x1400, 2000},
{NULL},
};
-const struct SpriteSheet gUnknown_0840B018[] =
+const struct CompressedSpriteSheet gUnknown_0840B018[] =
{
{gIntro1EonTiles, 0x400, 2002},
{NULL},
@@ -738,17 +738,17 @@ static const struct SpriteTemplate gSpriteTemplate_840B1F4 =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_813EDFC,
};
-const struct SpriteSheet gIntro3PokeballGfx_Table[] =
+const struct CompressedSpriteSheet gIntro3PokeballGfx_Table[] =
{
{gInterfaceGfx_PokeBall, 0x100, 2002},
{NULL},
};
-const struct SpriteSheet gIntro3MiscGfx_Table[] =
+const struct CompressedSpriteSheet gIntro3MiscGfx_Table[] =
{
{gIntro3MiscTiles, 0xa00, 2003},
{NULL},
};
-const struct SpritePalette gInterfacePokeballPal_Table[] =
+const struct CompressedSpritePalette gInterfacePokeballPal_Table[] =
{
{gInterfacePal_PokeBall, 2002},
{NULL},
@@ -1772,15 +1772,15 @@ void sub_813CE30(u16 scrX, u16 scrY, u16 zoom, u16 alpha)
static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front)
{
- const u16 *pal;
+ const u8 *lzPaletteData;
u8 spriteId;
if (front)
LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1);
else
LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0);
- pal = species_and_otid_get_pal(species, 0, 0xFFFF);
- LoadCompressedPalette(pal, 0x100 + d * 0x10, 0x20);
+ lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF);
+ LoadCompressedPalette(lzPaletteData, 0x100 + d * 0x10, 0x20);
sub_8143648(d, d);
spriteId = CreateSprite(&gUnknown_02024E8C, x, y, (d + 1) * 4);
gSprites[spriteId].oam.paletteNum = d;
diff --git a/src/money.c b/src/money.c
index de0730951..ab4508a39 100644
--- a/src/money.c
+++ b/src/money.c
@@ -10,8 +10,8 @@
extern u16 gSpecialVar_0x8005;
extern u8 gUnknown_02038734;
-extern const struct SpriteSheet gUnknown_083CF584;
-extern const struct SpritePalette gUnknown_083CF58C;
+extern const struct CompressedSpriteSheet gUnknown_083CF584;
+extern const struct CompressedSpritePalette gUnknown_083CF58C;
extern const struct SpriteTemplate gSpriteTemplate_83CF56C;
bool8 IsEnoughMoney(u32 budget, u32 cost)
diff --git a/src/pokeball.c b/src/pokeball.c
new file mode 100644
index 000000000..ee3b95678
--- /dev/null
+++ b/src/pokeball.c
@@ -0,0 +1,1193 @@
+#include "global.h"
+#include "gba/m4a_internal.h"
+#include "battle.h"
+#include "decompress.h"
+#include "graphics.h"
+#include "m4a.h"
+#include "main.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "rom_8077ABC.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "util.h"
+
+extern struct MusicPlayerInfo gMPlay_BGM;
+extern u16 gBattleTypeFlags;
+extern u8 gBankTarget;
+extern u8 gActiveBank;
+extern u16 gBattlePartyID[];
+extern u8 gObjectBankIDs[];
+extern u8 gDoingBattleAnim;
+extern u8 gHealthboxIDs[];
+
+#define GFX_TAG_POKEBALL 55000
+#define GFX_TAG_GREATBALL 55001
+#define GFX_TAG_SAFARIBALL 55002
+#define GFX_TAG_ULTRABALL 55003
+#define GFX_TAG_MASTERBALL 55004
+#define GFX_TAG_NETBALL 55005
+#define GFX_TAG_DIVEBALL 55006
+#define GFX_TAG_NESTBALL 55007
+#define GFX_TAG_REPEATBALL 55008
+#define GFX_TAG_TIMERBALL 55009
+#define GFX_TAG_LUXURYBALL 55010
+#define GFX_TAG_PREMIERBALL 55011
+
+static const struct CompressedSpriteSheet sBallSpriteSheets[] =
+{
+ {gInterfaceGfx_PokeBall, 384, GFX_TAG_POKEBALL},
+ {gInterfaceGfx_GreatBall, 384, GFX_TAG_GREATBALL},
+ {gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARIBALL},
+ {gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRABALL},
+ {gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTERBALL},
+ {gInterfaceGfx_NetBall, 384, GFX_TAG_NETBALL},
+ {gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVEBALL},
+ {gInterfaceGfx_NestBall, 384, GFX_TAG_NESTBALL},
+ {gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEATBALL},
+ {gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMERBALL},
+ {gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURYBALL},
+ {gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIERBALL},
+};
+
+static const struct CompressedSpritePalette sBallSpritePalettes[] =
+{
+ {gInterfacePal_PokeBall, GFX_TAG_POKEBALL},
+ {gInterfacePal_GreatBall, GFX_TAG_GREATBALL},
+ {gInterfacePal_SafariBall, GFX_TAG_SAFARIBALL},
+ {gInterfacePal_UltraBall, GFX_TAG_ULTRABALL},
+ {gInterfacePal_MasterBall, GFX_TAG_MASTERBALL},
+ {gInterfacePal_NetBall, GFX_TAG_NETBALL},
+ {gInterfacePal_DiveBall, GFX_TAG_DIVEBALL},
+ {gInterfacePal_NestBall, GFX_TAG_NESTBALL},
+ {gInterfacePal_RepeatBall, GFX_TAG_REPEATBALL},
+ {gInterfacePal_TimerBall, GFX_TAG_TIMERBALL},
+ {gInterfacePal_LuxuryBall, GFX_TAG_LUXURYBALL},
+ {gInterfacePal_PremierBall, GFX_TAG_PREMIERBALL},
+};
+
+static const struct OamData sBallOamData =
+{
+ .y = 0,
+ .affineMode = 3,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sBallAnimSeq3[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sBallAnimSeq5[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sBallAnimSeq4[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sBallAnimSeq6[] =
+{
+ ANIMCMD_FRAME(12, 1),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sBallAnimSeq0[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sBallAnimSeq1[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sBallAnimSeq2[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sBallAnimSequences[] =
+{
+ sBallAnimSeq0,
+ sBallAnimSeq1,
+ sBallAnimSeq2,
+
+ // unused?
+ sBallAnimSeq3,
+ sBallAnimSeq4,
+ sBallAnimSeq5,
+ sBallAnimSeq6,
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq0[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq1[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -3, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq2[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 3, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq3[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq4[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 25, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sBallAffineAnimSequences[] =
+{
+ sBallAffineAnimSeq0,
+ sBallAffineAnimSeq1,
+ sBallAffineAnimSeq2,
+ sBallAffineAnimSeq3,
+ sBallAffineAnimSeq4,
+};
+
+static void objc_0804ABD4(struct Sprite *sprite);
+const struct SpriteTemplate gBallSpriteTemplates[] =
+{
+ {
+ .tileTag = GFX_TAG_POKEBALL,
+ .paletteTag = GFX_TAG_POKEBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_GREATBALL,
+ .paletteTag = GFX_TAG_GREATBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_SAFARIBALL,
+ .paletteTag = GFX_TAG_SAFARIBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_ULTRABALL,
+ .paletteTag = GFX_TAG_ULTRABALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_MASTERBALL,
+ .paletteTag = GFX_TAG_MASTERBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_NETBALL,
+ .paletteTag = GFX_TAG_NETBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_DIVEBALL,
+ .paletteTag = GFX_TAG_DIVEBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_NESTBALL,
+ .paletteTag = GFX_TAG_NESTBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_REPEATBALL,
+ .paletteTag = GFX_TAG_REPEATBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_TIMERBALL,
+ .paletteTag = GFX_TAG_TIMERBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_LUXURYBALL,
+ .paletteTag = GFX_TAG_LUXURYBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+ {
+ .tileTag = GFX_TAG_PREMIERBALL,
+ .paletteTag = GFX_TAG_PREMIERBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = objc_0804ABD4,
+ },
+};
+
+extern u32 ball_number_to_ball_processing_index(u16); // not sure of return type
+extern void sub_80786EC();
+extern bool8 sub_8078718(struct Sprite *);
+extern u8 sub_814086C(u8, u8, int, int, u8);
+extern u8 sub_8141314(u8, u8, int, u8);
+
+static void sub_8046464(u8);
+static void sub_80466E8(struct Sprite *);
+static void sub_80466F4(struct Sprite *);
+static void sub_8046760(struct Sprite *);
+static void sub_80467F8(struct Sprite *);
+static void sub_804684C(struct Sprite *);
+static void sub_8046944(struct Sprite *);
+static void sub_8046984(struct Sprite *);
+static void sub_8046C78(struct Sprite *);
+static void sub_8046E7C(struct Sprite *);
+static void sub_8046E9C(struct Sprite *);
+static void sub_8046FBC(struct Sprite *);
+static void sub_8047074(struct Sprite *);
+static void sub_80470C4(struct Sprite *);
+static void sub_8047230(struct Sprite *);
+static void sub_8047254(struct Sprite *);
+static void sub_80473D0(struct Sprite *);
+static void sub_804748C(struct Sprite *);
+static void sub_8047638(struct Sprite *);
+static void sub_80476E0(struct Sprite *);
+static void sub_8047754(struct Sprite *);
+static void sub_804780C(struct Sprite *);
+static void sub_8047830(struct Sprite *);
+static void oamc_804BEB4(struct Sprite *);
+static u16 sub_8047978(u8);
+
+u8 sub_8046400(u16 a, u8 b)
+{
+ u8 taskId;
+
+ gDoingBattleAnim = 1;
+ ewram17810[gActiveBank].unk0_3 = 1;
+ taskId = CreateTask(sub_8046464, 5);
+ gTasks[taskId].data[1] = a;
+ gTasks[taskId].data[2] = b;
+ gTasks[taskId].data[3] = gActiveBank;
+ return 0;
+}
+
+static void sub_8046464(u8 taskId)
+{
+ bool8 sp0 = FALSE;
+ u16 r8;
+ u8 r5;
+ u16 ball;
+ u8 r4;
+ u8 spriteId;
+
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gTasks[taskId].data[0]++;
+ return;
+ }
+ r8 = gTasks[taskId].data[2];
+ r5 = gTasks[taskId].data[3];
+ if (GetBankSide(r5) != 0)
+ ball = GetMonData(&gEnemyParty[gBattlePartyID[r5]], MON_DATA_POKEBALL);
+ else
+ ball = GetMonData(&gPlayerParty[gBattlePartyID[r5]], MON_DATA_POKEBALL);
+ r4 = ball_number_to_ball_processing_index(ball);
+ sub_80478DC(r4);
+ spriteId = CreateSprite(&gBallSpriteTemplates[r4], 32, 80, 0x1D);
+ gSprites[spriteId].data0 = 0x80;
+ gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data7 = r8;
+ switch (r8)
+ {
+ case 0xFF:
+ gBankTarget = r5;
+ gSprites[spriteId].pos1.x = 24;
+ gSprites[spriteId].pos1.y = 68;
+ gSprites[spriteId].callback = sub_8047074;
+ break;
+ case 0xFE:
+ gSprites[spriteId].pos1.x = sub_8077ABC(r5, 0);
+ gSprites[spriteId].pos1.y = sub_8077ABC(r5, 1) + 24;
+ gBankTarget = r5;
+ gSprites[spriteId].data0 = 0;
+ gSprites[spriteId].callback = sub_8047254;
+ break;
+ default:
+ gBankTarget = GetBankByPlayerAI(1);
+ sp0 = TRUE;
+ break;
+ }
+ gSprites[spriteId].data6 = gBankTarget;
+ if (!sp0)
+ {
+ DestroyTask(taskId);
+ return;
+ }
+ gSprites[spriteId].data0 = 0x22;
+ gSprites[spriteId].data2 = sub_8077ABC(gBankTarget, 0);
+ gSprites[spriteId].data4 = sub_8077ABC(gBankTarget, 1) - 16;
+ gSprites[spriteId].data5 = -40;
+ sub_80786EC(&gSprites[spriteId]);
+ gSprites[spriteId].oam.affineParam = taskId;
+ gTasks[taskId].data[4] = gBankTarget;
+ gTasks[taskId].func = TaskDummy;
+ PlaySE(SE_NAGERU);
+}
+
+static void objc_0804ABD4(struct Sprite *sprite)
+{
+ if (sub_8078718(sprite))
+ {
+ u8 taskId = sprite->oam.affineParam;
+ u8 r5 = gTasks[taskId].data[4];
+ u8 r8 = gTasks[taskId].data[2];
+ u32 r4; // not sure of this type
+
+ StartSpriteAnim(sprite, 1);
+ sprite->affineAnimPaused = TRUE;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data5 = 0;
+ r4 = ball_number_to_ball_processing_index(sub_8047978(r5));
+ sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4);
+ sprite->data0 = sub_8141314(0, r5, 14, r4);
+ sprite->data6 = r5;
+ sprite->data7 = r8;
+ DestroyTask(taskId);
+ sprite->callback = sub_80466E8;
+ }
+}
+
+static void sub_80466E8(struct Sprite *sprite)
+{
+ sprite->callback = sub_80466F4;
+}
+
+static void sub_80466F4(struct Sprite *sprite)
+{
+ sprite->data5++;
+ if (sprite->data5 == 10)
+ {
+ sprite->data5 = 0;
+ sprite->callback = sub_8046760;
+ StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data6]], 2);
+ AnimateSprite(&gSprites[gObjectBankIDs[sprite->data6]]);
+ gSprites[gObjectBankIDs[sprite->data6]].data1 = 0;
+ }
+}
+
+static void sub_8046760(struct Sprite *sprite)
+{
+ sprite->data5++;
+ if (sprite->data5 == 11)
+ PlaySE(SE_SUIKOMU);
+ if (gSprites[gObjectBankIDs[sprite->data6]].affineAnimEnded)
+ {
+ StartSpriteAnim(sprite, 2);
+ gSprites[gObjectBankIDs[sprite->data6]].invisible = TRUE;
+ sprite->data5 = 0;
+ sprite->callback = sub_80467F8;
+ }
+ else
+ {
+ gSprites[gObjectBankIDs[sprite->data6]].data1 += 0x60;
+ gSprites[gObjectBankIDs[sprite->data6]].pos2.y = -gSprites[gObjectBankIDs[sprite->data6]].data1 >> 8;
+ }
+}
+
+static void sub_80467F8(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ sprite->data5++;
+ if (sprite->data5 == 1)
+ {
+ sprite->data3 = 0;
+ sprite->data4 = 32;
+ sprite->data5 = 0;
+ sprite->pos1.y += Cos(0, 32);
+ sprite->pos2.y = -Cos(0, sprite->data4);
+ sprite->callback = sub_804684C;
+ }
+ }
+}
+
+static void sub_804684C(struct Sprite *sprite)
+{
+ bool8 r5 = FALSE;
+
+ switch (sprite->data3 & 0xFF)
+ {
+ case 0:
+ sprite->pos2.y = -Cos(sprite->data5, sprite->data4);
+ sprite->data5 += 4 + (sprite->data3 >> 8);
+ if (sprite->data5 >= 64)
+ {
+ sprite->data4 -= 10;
+ sprite->data3 += 0x101;
+ if (sprite->data3 >> 8 == 4)
+ r5 = TRUE;
+ switch (sprite->data3 >> 8)
+ {
+ case 1:
+ PlaySE(SE_KON);
+ break;
+ case 2:
+ PlaySE(SE_KON2);
+ break;
+ case 3:
+ PlaySE(SE_KON3);
+ break;
+ default:
+ PlaySE(SE_KON4);
+ break;
+ }
+ }
+ break;
+ case 1:
+ sprite->pos2.y = -Cos(sprite->data5, sprite->data4);
+ sprite->data5 -= 4 + (sprite->data3 >> 8);
+ if (sprite->data5 <= 0)
+ {
+ sprite->data5 = 0;
+ sprite->data3 &= 0xFF00;
+ }
+ break;
+ }
+ if (r5)
+ {
+ sprite->data3 = 0;
+ sprite->pos1.y += Cos(64, 32);
+ sprite->pos2.y = 0;
+ if (sprite->data7 == 0)
+ {
+ sprite->callback = sub_8046C78;
+ }
+ else
+ {
+ sprite->callback = sub_8046944;
+ sprite->data4 = 1;
+ sprite->data5 = 0;
+ }
+ }
+}
+
+static void sub_8046944(struct Sprite *sprite)
+{
+ sprite->data3++;
+ if (sprite->data3 == 31)
+ {
+ sprite->data3 = 0;
+ sprite->affineAnimPaused = TRUE;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_8046984;
+ PlaySE(SE_BOWA);
+ }
+}
+
+static void sub_8046984(struct Sprite *sprite)
+{
+ switch (sprite->data3 & 0xFF)
+ {
+ case 0:
+ case 2:
+ sprite->pos2.x += sprite->data4;
+ sprite->data5 += sprite->data4;
+ sprite->affineAnimPaused = FALSE;
+ if (sprite->data5 > 3 || sprite->data5 < -3)
+ {
+ sprite->data3++;
+ sprite->data5 = 0;
+ }
+ break;
+ case 1:
+ sprite->data5++;
+ if (sprite->data5 == 1)
+ {
+ sprite->data5 = 0;
+ sprite->data4 = -sprite->data4;
+ sprite->data3++;
+ sprite->affineAnimPaused = FALSE;
+ if (sprite->data4 < 0)
+ ChangeSpriteAffineAnim(sprite, 2);
+ else
+ ChangeSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->affineAnimPaused = TRUE;
+ }
+ break;
+ case 3:
+ sprite->data3 += 0x100;
+ if (sprite->data3 >> 8 == sprite->data7)
+ {
+ sprite->callback = sub_8046C78;
+ }
+ else
+ {
+ if (sprite->data7 == 4 && sprite->data3 >> 8 == 3)
+ {
+ sprite->callback = sub_8046E7C;
+ sprite->affineAnimPaused = TRUE;
+ }
+ else
+ {
+ sprite->data3++;
+ sprite->affineAnimPaused = TRUE;
+ }
+ }
+ break;
+ case 4:
+ default:
+ sprite->data5++;
+ if (sprite->data5 == 31)
+ {
+ sprite->data5 = 0;
+ sprite->data3 &= 0xFF00;
+ StartSpriteAffineAnim(sprite, 3);
+ if (sprite->data4 < 0)
+ StartSpriteAffineAnim(sprite, 2);
+ else
+ StartSpriteAffineAnim(sprite, 1);
+ PlaySE(SE_BOWA);
+ }
+ break;
+ }
+}
+
+static void sub_8046AD0(u8 taskId)
+{
+ u8 r6 = gTasks[taskId].data[2];
+ u8 r3 = gTasks[taskId].data[1];
+ u16 species = gTasks[taskId].data[0];
+
+ switch (gTasks[taskId].data[15])
+ {
+ case 0:
+ default:
+ if (gTasks[taskId].data[8] < 3)
+ gTasks[taskId].data[8]++;
+ else
+ gTasks[taskId].data[15] = r6 + 1;
+ break;
+ case 1:
+ PlayCry1(species, r3);
+ DestroyTask(taskId);
+ break;
+ case 2:
+ StopCryAndClearCrySongs();
+ gTasks[taskId].data[10] = 3;
+ gTasks[taskId].data[15] = 20;
+ break;
+ case 20:
+ if (gTasks[taskId].data[10] != 0)
+ {
+ gTasks[taskId].data[10]--;
+ break;
+ }
+ PlayCry4(species, r3, 1);
+ DestroyTask(taskId);
+ break;
+ case 3:
+ gTasks[taskId].data[10] = 6;
+ gTasks[taskId].data[15] = 30;
+ break;
+ case 30:
+ if (gTasks[taskId].data[10] != 0)
+ {
+ gTasks[taskId].data[10]--;
+ break;
+ }
+ gTasks[taskId].data[15]++;
+ // fall through
+ case 31:
+ if (!IsCryPlayingOrClearCrySongs())
+ {
+ StopCryAndClearCrySongs();
+ gTasks[taskId].data[10] = 3;
+ gTasks[taskId].data[15]++;
+ }
+ break;
+ case 32:
+ if (gTasks[taskId].data[10] != 0)
+ {
+ gTasks[taskId].data[10]--;
+ break;
+ }
+ PlayCry4(species, r3, 0);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_8046C78(struct Sprite *sprite)
+{
+ u8 r5 = sprite->data6;
+ u32 r4; // not sure of this type
+
+ StartSpriteAnim(sprite, 1);
+ r4 = ball_number_to_ball_processing_index(sub_8047978(r5));
+ sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4);
+ sprite->data0 = sub_8141314(1, sprite->data6, 14, r4);
+ sprite->callback = sub_8046E9C;
+ if (gMain.inBattle)
+ {
+ struct Pokemon *pkmn;
+ u16 species;
+ s8 r8;
+ u16 r4_2;
+ u8 taskId;
+
+ if (GetBankSide(r5) != 0)
+ {
+ pkmn = &gEnemyParty[gBattlePartyID[r5]];
+ r8 = 25;
+ }
+ else
+ {
+ pkmn = &gPlayerParty[gBattlePartyID[r5]];
+ r8 = -25;
+ }
+ species = GetMonData(pkmn, MON_DATA_SPECIES);
+ if ((r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1))
+ && IsDoubleBattle() && ewram17840.unk9_0)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (IsBGMPlaying())
+ m4aMPlayStop(&gMPlay_BGM);
+ }
+ else
+ {
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128);
+ }
+ }
+ if (!IsDoubleBattle() || !ewram17840.unk9_0)
+ r4_2 = 0;
+ else if (r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1))
+ r4_2 = 1;
+ else
+ r4_2 = 2;
+ taskId = CreateTask(sub_8046AD0, 3);
+ gTasks[taskId].data[0] = species;
+ gTasks[taskId].data[1] = r8;
+ gTasks[taskId].data[2] = r4_2;
+ gTasks[taskId].data[15] = 0;
+ }
+ StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data6]], 1);
+ AnimateSprite(&gSprites[gObjectBankIDs[sprite->data6]]);
+ gSprites[gObjectBankIDs[sprite->data6]].data1 = 0x1000;
+}
+
+static void sub_8046E7C(struct Sprite *sprite)
+{
+ sprite->animPaused = TRUE;
+ sprite->callback = sub_8046FBC;
+ sprite->data3 = 0;
+ sprite->data4 = 0;
+ sprite->data5 = 0;
+}
+
+static void sub_8046E9C(struct Sprite *sprite)
+{
+ bool8 r7 = FALSE;
+ u8 r4 = sprite->data6;
+
+ gSprites[gObjectBankIDs[r4]].invisible = FALSE;
+ if (sprite->animEnded)
+ sprite->invisible = TRUE;
+ if (gSprites[gObjectBankIDs[r4]].affineAnimEnded)
+ {
+ StartSpriteAffineAnim(&gSprites[gObjectBankIDs[r4]], 0);
+ r7 = TRUE;
+ }
+ else
+ {
+ gSprites[gObjectBankIDs[r4]].data1 -= 288;
+ gSprites[gObjectBankIDs[r4]].pos2.y = gSprites[gObjectBankIDs[r4]].data1 >> 8;
+ }
+ if (sprite->animEnded && r7)
+ {
+ s32 i;
+ u32 r3;
+
+ gSprites[gObjectBankIDs[r4]].pos2.y = 0;
+ gDoingBattleAnim = 0;
+ ewram17810[r4].unk0_3 = 0;
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ for (r3 = 0, i = 0; i < 4; i++)
+ {
+ if (ewram17810[i].unk0_3 == 0)
+ r3++;
+ }
+ if (r3 == 4)
+ {
+ for (i = 0; i < 12; i++)
+ sub_804794C(i);
+ }
+ }
+}
+
+static void sub_8046FBC(struct Sprite *sprite)
+{
+ u8 r7 = sprite->data6;
+
+ sprite->data4++;
+ if (sprite->data4 == 40)
+ {
+ return;
+ }
+ else if (sprite->data4 == 95)
+ {
+ gDoingBattleAnim = 0;
+ m4aMPlayAllStop();
+ PlaySE(BGM_FANFA5);
+ }
+ else if (sprite->data4 == 315)
+ {
+ FreeOamMatrix(gSprites[gObjectBankIDs[sprite->data6]].oam.matrixNum);
+ DestroySprite(&gSprites[gObjectBankIDs[sprite->data6]]);
+ DestroySpriteAndFreeResources(sprite);
+ if (gMain.inBattle)
+ ewram17810[r7].unk0_3 = 0;
+ }
+}
+
+static void sub_8047074(struct Sprite *sprite)
+{
+ sprite->data0 = 25;
+ sprite->data2 = sub_8077ABC(sprite->data6, 2);
+ sprite->data4 = sub_8077ABC(sprite->data6, 3) + 24;
+ sprite->data5 = -30;
+ sprite->oam.affineParam = sprite->data6;
+ sub_80786EC(sprite);
+ sprite->callback = sub_80470C4;
+}
+
+#define HIBYTE(x) (((x) >> 8) & 0xFF)
+
+static void sub_80470C4(struct Sprite *sprite)
+{
+ u32 r6;
+ u32 r7;
+
+ if (HIBYTE(sprite->data7) >= 35 && HIBYTE(sprite->data7) < 80)
+ {
+ s16 r4;
+
+ if ((sprite->oam.affineParam & 0xFF00) == 0)
+ {
+ r6 = sprite->data1 & 1;
+ r7 = sprite->data2 & 1;
+ sprite->data1 = ((sprite->data1 / 3) & ~1) | r6;
+ sprite->data2 = ((sprite->data2 / 3) & ~1) | r7;
+ StartSpriteAffineAnim(sprite, 4);
+ }
+ r4 = sprite->data0;
+ sub_8078B5C(sprite);
+ sprite->data7 += sprite->data6 / 3;
+ sprite->pos2.y += Sin(HIBYTE(sprite->data7), sprite->data5);
+ sprite->oam.affineParam += 0x100;
+ if ((sprite->oam.affineParam >> 8) % 3 != 0)
+ sprite->data0 = r4;
+ else
+ sprite->data0 = r4 - 1;
+ if (HIBYTE(sprite->data7) >= 80)
+ {
+ r6 = sprite->data1 & 1;
+ r7 = sprite->data2 & 1;
+ sprite->data1 = ((sprite->data1 * 3) & ~1) | r6;
+ sprite->data2 = ((sprite->data2 * 3) & ~1) | r7;
+ }
+ }
+ else
+ {
+ if (sub_8078718(sprite))
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data6 = sprite->oam.affineParam & 0xFF;
+ sprite->data0 = 0;
+ if (IsDoubleBattle() && ewram17840.unk9_0
+ && sprite->data6 == GetBankByPlayerAI(2))
+ sprite->callback = sub_8047230;
+ else
+ sprite->callback = sub_8046C78;
+ StartSpriteAffineAnim(sprite, 0);
+ }
+ }
+}
+
+static void sub_8047230(struct Sprite *sprite)
+{
+ if (sprite->data0++ > 24)
+ {
+ sprite->data0 = 0;
+ sprite->callback = sub_8046C78;
+ }
+}
+
+static void sub_8047254(struct Sprite *sprite)
+{
+ sprite->data0++;
+ if (sprite->data0 > 15)
+ {
+ sprite->data0 = 0;
+ if (IsDoubleBattle() && ewram17840.unk9_0
+ && sprite->data6 == GetBankByPlayerAI(3))
+ sprite->callback = sub_8047230;
+ else
+ sprite->callback = sub_8046C78;
+ }
+}
+
+static u8 sub_80472B0(u8 a, u8 b, u8 c, u8 d)
+{
+ return sub_814086C(a, b, c, d, 0);
+}
+
+static u8 sub_80472D8(u8 a, u8 b, u32 c)
+{
+ return sub_8141314(a, b, c, 0);
+}
+
+void CreatePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPic(&sBallSpriteSheets[0]);
+ LoadCompressedObjectPalette(&sBallSpritePalettes[0]);
+ spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f);
+ gSprites[spriteId].data0 = a;
+ gSprites[spriteId].data5 = gSprites[a].pos1.x;
+ gSprites[spriteId].data6 = gSprites[a].pos1.y;
+ gSprites[a].pos1.x = x;
+ gSprites[a].pos1.y = y;
+ gSprites[spriteId].data1 = g;
+ gSprites[spriteId].data2 = b;
+ gSprites[spriteId].data3 = h;
+ gSprites[spriteId].data4 = h >> 16;
+ gSprites[spriteId].oam.priority = e;
+ gSprites[spriteId].callback = sub_80473D0;
+ gSprites[a].invisible = TRUE;
+}
+
+static void sub_80473D0(struct Sprite *sprite)
+{
+ if (sprite->data1 == 0)
+ {
+ u8 r5;
+ u8 r7 = sprite->data0;
+ u8 r8 = sprite->data2;
+ u32 r4 = (u16)sprite->data3 | ((u16)sprite->data4 << 16);
+
+ if (sprite->subpriority != 0)
+ r5 = sprite->subpriority - 1;
+ else
+ r5 = 0;
+ StartSpriteAnim(sprite, 1);
+ sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r5);
+ sprite->data1 = sub_80472D8(1, r8, r4);
+ sprite->callback = sub_804748C;
+ gSprites[r7].invisible = FALSE;
+ StartSpriteAffineAnim(&gSprites[r7], 1);
+ AnimateSprite(&gSprites[r7]);
+ gSprites[r7].data1 = 0x1000;
+ sprite->data7 = 0;
+ }
+ else
+ {
+ sprite->data1--;
+ }
+}
+
+static void sub_804748C(struct Sprite *sprite)
+{
+ bool8 r12 = FALSE;
+ bool8 r6 = FALSE;
+ u8 r3 = sprite->data0;
+ u16 var1;
+ u16 var2;
+
+ if (sprite->animEnded)
+ sprite->invisible = TRUE;
+ if (gSprites[r3].affineAnimEnded)
+ {
+ StartSpriteAffineAnim(&gSprites[r3], 0);
+ r12 = TRUE;
+ }
+ var1 = (sprite->data5 - sprite->pos1.x) * sprite->data7 / 128 + sprite->pos1.x;
+ var2 = (sprite->data6 - sprite->pos1.y) * sprite->data7 / 128 + sprite->pos1.y;
+ gSprites[r3].pos1.x = var1;
+ gSprites[r3].pos1.y = var2;
+ if (sprite->data7 < 128)
+ {
+ s16 sine = -(gSineTable[(u8)sprite->data7] / 8);
+
+ sprite->data7 += 4;
+ gSprites[r3].pos2.x = sine;
+ gSprites[r3].pos2.y = sine;
+ }
+ else
+ {
+ gSprites[r3].pos1.x = sprite->data5;
+ gSprites[r3].pos1.y = sprite->data6;
+ gSprites[r3].pos2.x = 0;
+ gSprites[r3].pos2.y = 0;
+ r6 = TRUE;
+ }
+ if (sprite->animEnded && r12 && r6)
+ DestroySpriteAndFreeResources(sprite);
+}
+
+u8 sub_8047580(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPic(&sBallSpriteSheets[0]);
+ LoadCompressedObjectPalette(&sBallSpritePalettes[0]);
+ spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f);
+ gSprites[spriteId].data0 = a;
+ gSprites[spriteId].data1 = g;
+ gSprites[spriteId].data2 = b;
+ gSprites[spriteId].data3 = h;
+ gSprites[spriteId].data4 = h >> 16;
+ gSprites[spriteId].oam.priority = e;
+ gSprites[spriteId].callback = sub_8047638;
+ return spriteId;
+}
+
+static void sub_8047638(struct Sprite *sprite)
+{
+ if (sprite->data1 == 0)
+ {
+ u8 r6;
+ u8 r7 = sprite->data0;
+ u8 r8 = sprite->data2;
+ u32 r5 = (u16)sprite->data3 | ((u16)sprite->data4 << 16);
+
+ if (sprite->subpriority != 0)
+ r6 = sprite->subpriority - 1;
+ else
+ r6 = 0;
+ StartSpriteAnim(sprite, 1);
+ sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r6);
+ sprite->data1 = sub_80472D8(1, r8, r5);
+ sprite->callback = sub_80476E0;
+ StartSpriteAffineAnim(&gSprites[r7], 2);
+ AnimateSprite(&gSprites[r7]);
+ gSprites[r7].data1 = 0;
+ }
+ else
+ {
+ sprite->data1--;
+ }
+}
+
+static void sub_80476E0(struct Sprite *sprite)
+{
+ u8 r1;
+
+ sprite->data5++;
+ if (sprite->data5 == 11)
+ PlaySE(SE_SUIKOMU);
+ r1 = sprite->data0;
+ if (gSprites[r1].affineAnimEnded)
+ {
+ StartSpriteAnim(sprite, 2);
+ gSprites[r1].invisible = TRUE;
+ sprite->data5 = 0;
+ sprite->callback = sub_8047754;
+ }
+ else
+ {
+ gSprites[r1].data1 += 96;
+ gSprites[r1].pos2.y = -gSprites[r1].data1 >> 8;
+ }
+}
+
+static void sub_8047754(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ sprite->callback = SpriteCallbackDummy;
+}
+
+void obj_delete_and_free_associated_resources_(struct Sprite *sprite)
+{
+ DestroySpriteAndFreeResources(sprite);
+}
+
+void sub_804777C(u8 a)
+{
+ struct Sprite *sprite = &gSprites[gHealthboxIDs[a]];
+
+ sprite->data0 = 5;
+ sprite->data1 = 0;
+ sprite->pos2.x = 0x73;
+ sprite->pos2.y = 0;
+ sprite->callback = sub_8047830;
+ if (GetBankSide(a) != 0)
+ {
+ sprite->data0 = -sprite->data0;
+ sprite->data1 = -sprite->data1;
+ sprite->pos2.x = -sprite->pos2.x;
+ sprite->pos2.y = -sprite->pos2.y;
+ }
+ gSprites[sprite->data5].callback(&gSprites[sprite->data5]);
+ if (GetBankIdentity(a) == 2)
+ sprite->callback = sub_804780C;
+}
+
+static void sub_804780C(struct Sprite *sprite)
+{
+ sprite->data1++;
+ if (sprite->data1 == 20)
+ {
+ sprite->data1 = 0;
+ sprite->callback = sub_8047830;
+ }
+}
+
+static void sub_8047830(struct Sprite *sprite)
+{
+ sprite->pos2.x -= sprite->data0;
+ sprite->pos2.y -= sprite->data1;
+ if (sprite->pos2.x == 0 && sprite->pos2.y == 0)
+ sprite->callback = SpriteCallbackDummy;
+}
+
+void sub_8047858(u8 a)
+{
+ u8 spriteId;
+
+ spriteId = CreateInvisibleSpriteWithCallback(oamc_804BEB4);
+ gSprites[spriteId].data0 = 1;
+ gSprites[spriteId].data1 = gHealthboxIDs[a];
+ gSprites[spriteId].callback = oamc_804BEB4;
+}
+
+static void oamc_804BEB4(struct Sprite *sprite)
+{
+ u8 r1 = sprite->data1;
+
+ gSprites[r1].pos2.y = sprite->data0;
+ sprite->data0 = -sprite->data0;
+ sprite->data2++;
+ if (sprite->data2 == 21)
+ {
+ gSprites[r1].pos2.x = 0;
+ gSprites[r1].pos2.y = 0;
+ DestroySprite(sprite);
+ }
+}
+
+void sub_80478DC(u8 a)
+{
+ u16 var;
+
+ if (GetSpriteTileStartByTag(sBallSpriteSheets[a].tag) == 0xFFFF)
+ {
+ LoadCompressedObjectPic(&sBallSpriteSheets[a]);
+ LoadCompressedObjectPalette(&sBallSpritePalettes[a]);
+ }
+ switch (a)
+ {
+ case 6:
+ case 10:
+ case 11:
+ break;
+ default:
+ var = GetSpriteTileStartByTag(sBallSpriteSheets[a].tag);
+ LZDecompressVram(gUnknown_08D030D0, (void *)(VRAM + 0x10100 + var * 32));
+ break;
+ }
+}
+
+void sub_804794C(u8 a)
+{
+ FreeSpriteTilesByTag(sBallSpriteSheets[a].tag);
+ FreeSpritePaletteByTag(sBallSpritePalettes[a].tag);
+}
+
+static u16 sub_8047978(u8 a)
+{
+ if (GetBankSide(a) == 0)
+ return GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_POKEBALL);
+ else
+ return GetMonData(&gEnemyParty[gBattlePartyID[a]], MON_DATA_POKEBALL);
+}
diff --git a/src/pokedex.c b/src/pokedex.c
index 8674c3d2b..17ae9a597 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -162,7 +162,7 @@ extern const u8 gUnknown_08E96ACC[];
extern const u8 gUnknown_08E96B58[];
extern const u16 gPokedexMenu_Pal[];
extern const u16 gPokedexMenu2_Pal[];
-extern const struct SpriteSheet gTrainerFrontPicTable[];
+extern const struct CompressedSpriteSheet gTrainerFrontPicTable[];
extern const struct MonCoords gTrainerFrontPicCoords[];
extern const struct PokedexEntry gPokedexEntries[];
extern const u8 gPokedexMenuSearch_Gfx[];
@@ -493,7 +493,7 @@ static const struct SpriteTemplate gSpriteTemplate_83A05B4 =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_808F168,
};
-static const struct SpriteSheet gUnknown_083A05CC[] =
+static const struct CompressedSpriteSheet gUnknown_083A05CC[] =
{
{gPokedexMenu2_Gfx, 0x1F00, 0x1000},
{NULL, 0, 0},
@@ -3921,7 +3921,7 @@ static void sub_8090B8C(u8 taskId)
u32 otId;
u32 personality;
u8 paletteNum;
- const u16 *palette;
+ const u8 *lzPaletteData;
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
CpuCopy16(gUnknown_08D00524, (void *)(VRAM + 0xC000), 0x1000);
@@ -3930,8 +3930,8 @@ static void sub_8090B8C(u8 taskId)
otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12];
personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14];
paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum;
- palette = species_and_otid_get_pal(species, otId, personality);
- LoadCompressedPalette(palette, 0x100 | paletteNum * 16, 32);
+ lzPaletteData = species_and_otid_get_pal(species, otId, personality);
+ LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32);
DestroyTask(taskId);
}
}
diff --git a/src/pokemon_3.c b/src/pokemon_3.c
index ef9a1698d..cb8eb2a46 100644
--- a/src/pokemon_3.c
+++ b/src/pokemon_3.c
@@ -1172,7 +1172,7 @@ void current_map_music_set__default_for_battle(u16 song)
PlayNewMapMusic(sub_8040728());
}
-const u16 *pokemon_get_pal(struct Pokemon *mon)
+const u8 *pokemon_get_pal(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
@@ -1186,7 +1186,7 @@ const u16 *pokemon_get_pal(struct Pokemon *mon)
//Extracts the lower 16 bits of a 32-bit number
#define LOHALF(n) ((n) & 0xFFFF)
-const u16 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality)
+const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality)
{
u32 shinyValue;
@@ -1200,7 +1200,7 @@ const u16 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality)
return gMonPaletteTable[species].data;
}
-const struct SpritePalette *sub_8040990(struct Pokemon *mon)
+const struct CompressedSpritePalette *sub_8040990(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
@@ -1208,7 +1208,7 @@ const struct SpritePalette *sub_8040990(struct Pokemon *mon)
return sub_80409C8(species, otId, personality);
}
-const struct SpritePalette *sub_80409C8(u16 species, u32 otId , u32 personality)
+const struct CompressedSpritePalette *sub_80409C8(u16 species, u32 otId , u32 personality)
{
u32 shinyValue;
diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c
index fb72be527..ecfd8111b 100644
--- a/src/script_pokemon_util_80C4BF0.c
+++ b/src/script_pokemon_util_80C4BF0.c
@@ -407,7 +407,7 @@ u8 sub_80C5044(void)
void ShowContestEntryMonPic(void)
{
- struct SpritePalette *paletteData;
+ const struct CompressedSpritePalette *palette;
u32 var1, var2;
u16 species;
u8 spriteId;
@@ -425,13 +425,18 @@ void ShowContestEntryMonPic(void)
taskId = CreateTask(sub_80C5190, 0x50);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = species;
- HandleLoadSpecialPokePic((struct SpriteSheet *)&gMonFrontPicTable[species].data,
- gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset,
- (u32)gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], species, var1);
- paletteData = (struct SpritePalette *) sub_80409C8(species, var2, var1);
- LoadCompressedObjectPalette(paletteData);
+ HandleLoadSpecialPokePic(
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].coords,
+ gMonFrontPicCoords[species].y_offset,
+ (u32)gUnknown_081FAF4C[0],
+ gUnknown_081FAF4C[1],
+ species,
+ var1);
+ palette = sub_80409C8(species, var2, var1);
+ LoadCompressedObjectPalette(palette);
GetMonSpriteTemplate_803C56C(species, 1);
- gUnknown_02024E8C.paletteTag = paletteData->tag;
+ gUnknown_02024E8C.paletteTag = palette->tag;
spriteId = CreateSprite(&gUnknown_02024E8C, 0x78, 0x40, 0);
gTasks[taskId].data[2] = spriteId;
gTasks[taskId].data[3] = left;
diff --git a/src/starter_choose.c b/src/starter_choose.c
index f30be8e08..c838f2dc0 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -172,12 +172,12 @@ static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7790[] =
{
gSpriteAffineAnim_83F7774,
};
-static const struct SpriteSheet gUnknown_083F7794[] =
+static const struct CompressedSpriteSheet gUnknown_083F7794[] =
{
{gBirchBallarrow_Gfx, 0x0800, 0x1000},
{NULL},
};
-static const struct SpriteSheet gUnknown_083F77A4[] =
+static const struct CompressedSpriteSheet gUnknown_083F77A4[] =
{
{gBirchCircle_Gfx, 0x0800, 0x1001},
{NULL},
diff --git a/src/title_screen.c b/src/title_screen.c
index 12c31d10a..dd06956c3 100644
--- a/src/title_screen.c
+++ b/src/title_screen.c
@@ -152,7 +152,7 @@ static const struct SpriteTemplate sVersionBannerRightSpriteTemplate =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallback_VersionBannerRight,
};
-static const struct SpriteSheet gUnknown_08393EFC[] =
+static const struct CompressedSpriteSheet gUnknown_08393EFC[] =
{
{gVersionTiles, 0x1000, 1000},
{NULL},
@@ -234,7 +234,7 @@ static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallback_PressStartCopyrightBanner,
};
-static const struct SpriteSheet gUnknown_08393F8C[] =
+static const struct CompressedSpriteSheet gUnknown_08393F8C[] =
{
{gTitleScreenPressStart_Gfx, 0x520, 1001},
{NULL},
@@ -279,7 +279,7 @@ static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallback_PokemonLogoShine,
};
-static const struct SpriteSheet sPokemonLogoShineSpriteSheet[] =
+static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] =
{
{sLogoShineTiles, 0x800, 1002},
{NULL},
diff --git a/src/wallclock.c b/src/wallclock.c
index efc7dd42a..8db13dc2d 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -24,7 +24,7 @@ extern u16 gMiscClockFemale_Pal[];
//--------------------------------------------------
static const u8 ClockGfx_Misc[] = INCBIN_U8("graphics/misc/clock_misc.4bpp.lz");
-static const struct SpriteSheet gUnknown_083F7A90[] =
+static const struct CompressedSpriteSheet gUnknown_083F7A90[] =
{
{ClockGfx_Misc, 0x2000, 0x1000},
{NULL},