#ifndef GUARD_ROM_8077ABC_H
#define GUARD_ROM_8077ABC_H

#include "sprite.h"
#include "task.h"

struct Struct_sub_8078914 {
    u8 *field_0;
    u8 *field_4;
    u8 field_8;
};

struct TransformStatus
{
    u8 unk0;
    u16 species;
};

u8 GetBattlerSpriteCoord(u8, u8);
u8 GetBattlerSpriteFinal_Y(u8 slot, u16 species, u8 a3);
u8 GetAnimBattlerSpriteId(u8 bank);
void StoreSpriteCallbackInData(struct Sprite *sprite, void(*callback)(struct Sprite *));
void sub_8078314(struct Sprite *sprite);
void TranslateSpriteOverDuration(struct Sprite *sprite);
void TranslateMonBGUntil(struct Sprite *sprite);
void TranslateMonBGSubPixelUntil(struct Sprite *sprite);
u8 GetBattlerSide(u8);
u8 GetBattlerSide(u8);
u8 GetBattlerSide(u8 side);
u8 GetBattlerSide(u8 slot);
u8 GetBattlerSide(u8);
u8 GetBattlerPosition(u8);
u8 GetBattlerPosition(u8 slot);
u8 GetBattlerAtPosition(u8);
u8 GetBattlerAtPosition(u8);
u8 GetBattlerAtPosition(u8 state);
bool8 IsBankSpritePresent(u8);
bool8 IsDoubleBattle();
u8 IsDoubleBattle(void);
bool8 IsDoubleBattle(void);
void sub_8078914(struct Struct_sub_8078914 * unk);
u8 sub_80789BC();
void InitSpriteDataForLinearTranslation(struct Sprite *sprite);
void InitAnimLinearTranslation(struct Sprite *sprite);
bool8 TranslateAnimLinear(struct Sprite *sprite);
void TranslateAnimLinearUntil(struct Sprite *sprite);
void sub_8078D44(struct Sprite *sprite);
void obj_id_set_rotscale(u8 sprite, s16, s16, u16);
bool8 sub_8078E38();
void PrepareBattlerSpriteForRotScale(u8 sprite, u8);
void sub_8078F40(u8 sprite);
void sub_8078F9C(u8 sprite);
void sub_8079518(struct Sprite *sprite);
void sub_8079534(struct Sprite *sprite);
void sub_80796F8(u8 task);
void AnimTask_BlendMonInAndOutSetup(struct Task *task);
void AnimTask_BlendMonInAndOutStep(u8 taskId);
void sub_8079A64(u8 sprite);
u16 sub_8079B10(u8 sprite);
void sub_8079BF4(s16 *bottom, s16 *top, const void *ptr);
void *sub_8079BFC(s16 bottom, s16 top);
// u8 a2 := u8 sprite
void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7);
u8 sub_8079C74(struct Task *task);
void UpdateBattlerSpritePriorities();
u8 GetBattlerSubpriority(u8 bank);
u8 GetBattlerPosition_permutated(u8 slot);
void sub_807A784(u8 taskId);
void sub_807A850(struct Task *task, u8 taskId);
void sub_807A8D4(struct Sprite *sprite);
void sub_807A960(struct Sprite *sprite);
void sub_8078A34(struct Sprite *sprite);
void InitAnimSpritePos(struct Sprite *sprite, u8);
void sub_8078764(struct Sprite *sprite, bool8);
void StartAnimLinearTranslation(struct Sprite *sprite);
void sub_8078D60(struct Sprite *sprite);
void InitAnimArcTranslation(struct Sprite *sprite);
void sub_8078D8C(struct Sprite *sprite);
void WaitAnimForDuration(struct Sprite *sprite);
void sub_8078CC0(struct Sprite *sprite);
void sub_8078600(struct Sprite *sprite);
void sub_8078504(struct Sprite *sprite);
void sub_807861C(struct Sprite *sprite);
void sub_8078650(struct Sprite *sprite);
void sub_8078394(struct Sprite *sprite);
void sub_80785E4(struct Sprite *sprite);
void sub_8078278(struct Sprite *sprite);
void sub_8078C00(struct Sprite *sprite);
void sub_8078114(struct Sprite *sprite);
void sub_8078174(struct Sprite *sprite);
void sub_80793C4(struct Sprite *sprite);
void SetAverageBattlerPositions(u8 slot, u8 a2, s16 *a3, s16 *a4);
u8 GetBattlerSpriteBGPriority(u8 slot);
s16 GetBattlerSpriteCoordAttr(u8 slot, u8 a2);
u16 ArcTan2Neg(s16 a, s16 b);
void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation);
void sub_807867C(struct Sprite *sprite, s16 a2);
u8 sub_8077EE4(u8 slot, u8 a2);
u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7);
u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4);
s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1);
void obj_delete_but_dont_free_vram(struct Sprite *sprite);
void sub_8079108(u16 a1, bool8 a2);
void PrepareAffineAnimInTaskData(struct Task *task, u8 a2, const void *a3);
bool8 RunAffineAnimFromTaskData(struct Task *task);
u8 sub_8077FC0(u8 slot);
void DestroySpriteAndMatrix(struct Sprite *sprite);
bool8 TranslateAnimArc(struct Sprite *sprite);
bool8 sub_8078CE8(struct Sprite *sprite);
void oamt_add_pos2_onto_pos1(struct Sprite *sprite);
void sub_8078BD4(struct Sprite *sprite);
void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite);
void sub_80789D4(bool8 a1);
void sub_8079AB8(u8 sprite, u8 sprite2);
u8 sub_807A4A0(int bank, u8 sprite, int species);
void sub_80794A8(struct Sprite *sprite);
void sub_807A9BC(struct Sprite *sprite);
void sub_8078954(struct Struct_sub_8078914*, u8);
u8 sub_8079F44(u16 species, bool8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8);
void sub_8079098(struct Sprite *sprite);
void DestroySpriteAndFreeResources_(struct Sprite *sprite);
void sub_8078634(u8 task);
u8 sub_80793A8(u8);

#endif // GUARD_ROM_8077ABC_H
