mirror of
https://github.com/pret/pokeruby.git
synced 2026-08-08 02:24:08 -05:00
243 lines
5.7 KiB
C
243 lines
5.7 KiB
C
#ifndef GUARD_SPRITE_H
|
|
#define GUARD_SPRITE_H
|
|
|
|
struct SpriteSheet
|
|
{
|
|
u8 *data;
|
|
u16 size;
|
|
u16 tag;
|
|
};
|
|
|
|
struct SpriteFrameImage
|
|
{
|
|
u8 *data;
|
|
u16 size;
|
|
};
|
|
|
|
struct SpritePalette
|
|
{
|
|
u16 *data;
|
|
u16 tag;
|
|
};
|
|
|
|
struct AnimFrameCmd
|
|
{
|
|
// If the sprite has an array of images, this is the array index.
|
|
// If the sprite has a sheet, this is the tile offset.
|
|
u32 imageValue:16;
|
|
|
|
u32 duration:6;
|
|
u32 hFlip:1;
|
|
u32 vFlip:1;
|
|
};
|
|
|
|
struct AnimLoopCmd
|
|
{
|
|
u32 type:16;
|
|
u32 count:6;
|
|
};
|
|
|
|
struct AnimJumpCmd
|
|
{
|
|
u32 type:16;
|
|
u32 target:6;
|
|
};
|
|
|
|
union AnimCmd
|
|
{
|
|
s16 type;
|
|
struct AnimFrameCmd frame;
|
|
struct AnimLoopCmd loop;
|
|
struct AnimJumpCmd jump;
|
|
};
|
|
|
|
struct AffineAnimFrameCmd
|
|
{
|
|
s16 xScale;
|
|
s16 yScale;
|
|
u8 rotation;
|
|
u8 duration;
|
|
};
|
|
|
|
struct AffineAnimLoopCmd
|
|
{
|
|
s16 type;
|
|
u16 count;
|
|
};
|
|
|
|
struct AffineAnimJumpCmd
|
|
{
|
|
s16 type;
|
|
u16 target;
|
|
};
|
|
|
|
union AffineAnimCmd
|
|
{
|
|
s16 type;
|
|
struct AffineAnimFrameCmd frame;
|
|
struct AffineAnimLoopCmd loop;
|
|
struct AffineAnimJumpCmd jump;
|
|
};
|
|
|
|
struct AffineAnimState
|
|
{
|
|
u8 animNum;
|
|
u8 animCmdIndex;
|
|
u8 delayCounter;
|
|
u8 loopCounter;
|
|
s16 xScale;
|
|
s16 yScale;
|
|
u16 rotation;
|
|
};
|
|
|
|
enum
|
|
{
|
|
SUBSPRITES_OFF,
|
|
SUBSPRITES_ON,
|
|
SUBSPRITES_IGNORE_PRIORITY, // on but priority is ignored
|
|
};
|
|
|
|
struct Subsprite
|
|
{
|
|
u16 x;
|
|
u16 y;
|
|
u16 shape:2;
|
|
u16 size:2;
|
|
u16 tileOffset:10;
|
|
u16 priority:2;
|
|
};
|
|
|
|
struct SubspriteTable
|
|
{
|
|
u8 subspriteCount;
|
|
struct Subsprite *subsprites;
|
|
};
|
|
|
|
struct Sprite;
|
|
|
|
struct SpriteTemplate
|
|
{
|
|
u16 tileTag;
|
|
u16 paletteTag;
|
|
struct OamData *oam;
|
|
union AnimCmd **anims;
|
|
struct SpriteFrameImage *images;
|
|
union AffineAnimCmd **affineAnims;
|
|
void (*callback)(struct Sprite *);
|
|
};
|
|
|
|
struct Sprite
|
|
{
|
|
struct OamData oam;
|
|
union AnimCmd **anims;
|
|
struct SpriteFrameImage *images;
|
|
union AffineAnimCmd **affineAnims;
|
|
struct SpriteTemplate *template;
|
|
struct SubspriteTable *subspriteTables;
|
|
void (*callback)(struct Sprite *);
|
|
|
|
struct Coords16 pos1;
|
|
struct Coords16 pos2;
|
|
s8 centerToCornerVecX;
|
|
s8 centerToCornerVecY;
|
|
|
|
u8 animNum;
|
|
u8 animCmdIndex;
|
|
u8 animDelayCounter:6;
|
|
u8 animPaused:1;
|
|
u8 affineAnimPaused:1;
|
|
u8 animLoopCounter;
|
|
|
|
// general purpose data fields
|
|
u16 data0;
|
|
u16 data1;
|
|
u16 data2;
|
|
u16 data3;
|
|
u16 data4;
|
|
u16 data5;
|
|
u16 data6;
|
|
u16 data7;
|
|
|
|
u16 inUse:1;
|
|
u16 coordOffsetEnabled:1;
|
|
u16 invisible:1;
|
|
u16 flags_3:1;
|
|
u16 flags_4:1;
|
|
u16 flags_5:1;
|
|
u16 flags_6:1;
|
|
u16 flags_7:1;
|
|
u16 hFlip:1;
|
|
u16 vFlip:1;
|
|
u16 animBeginning:1;
|
|
u16 affineAnimBeginning:1;
|
|
u16 animEnded:1;
|
|
u16 affineAnimEnded:1;
|
|
u16 usingSheet:1;
|
|
u16 flags_f:1;
|
|
|
|
u16 sheetTileStart;
|
|
|
|
u8 subspriteTableNum:6;
|
|
u8 subspriteMode:2;
|
|
|
|
u8 subpriority;
|
|
};
|
|
|
|
void ResetSpriteData(void);
|
|
void AnimateSprites(void);
|
|
void BuildOamBuffer(void);
|
|
u8 CreateSprite(struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority);
|
|
u8 CreateSpriteAtEnd(struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority);
|
|
u8 CreateInvisibleSprite(void (*callback)(struct Sprite *));
|
|
u8 CreateSpriteAndAnimate(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
|
|
void DestroySprite(struct Sprite *sprite);
|
|
void ResetOamRange(u8 a, u8 b);
|
|
void LoadOam(void);
|
|
void SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d);
|
|
void CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode);
|
|
void SpriteCallbackDummy(struct Sprite *sprite);
|
|
void ProcessSpriteCopyRequests(void);
|
|
void RequestSpriteCopy(u8 *src, u8 *dest, u16 size);
|
|
void FreeSpriteTiles(struct Sprite *sprite);
|
|
void FreeSpritePalette(struct Sprite *sprite);
|
|
void FreeSpriteOamMatrix(struct Sprite *sprite);
|
|
void DestroySpriteAndFreeResources(struct Sprite *sprite);
|
|
void sub_800142C(u32 a1, u32 a2, u16 *a3, u16 a4, u32 a5);
|
|
void AnimateSprite(struct Sprite *sprite);
|
|
void StartSpriteAnim(struct Sprite *sprite, u8 animNum);
|
|
void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum);
|
|
void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex);
|
|
void StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum);
|
|
void StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum);
|
|
void ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum);
|
|
void ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum);
|
|
void SetSpriteSheetFrameTileNum(struct Sprite *sprite);
|
|
u8 AllocOamMatrix(void);
|
|
void FreeOamMatrix(u8 matrixNum);
|
|
void InitSpriteAffineAnim(struct Sprite *sprite);
|
|
void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation);
|
|
u16 LoadSpriteSheet(struct SpriteSheet *sheet);
|
|
void LoadSpriteSheets(struct SpriteSheet *sheets);
|
|
u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet);
|
|
void AllocTilesForSpriteSheets(struct SpriteSheet *sheets);
|
|
void LoadTilesForSpriteSheet(struct SpriteSheet *sheet);
|
|
void LoadTilesForSpriteSheets(struct SpriteSheet *sheets);
|
|
void FreeSpriteTilesByTag(u16 tag);
|
|
void FreeSpriteTileRanges(void);
|
|
u16 GetSpriteTileStartByTag(u16 tag);
|
|
u16 GetSpriteTileTagByTileStart(u16 start);
|
|
void RequestSpriteSheetCopy(struct SpriteSheet *sheet);
|
|
u16 LoadSpriteSheetDeferred(struct SpriteSheet *sheet);
|
|
void FreeAllSpritePalettes(void);
|
|
u8 LoadSpritePalette(struct SpritePalette *palette);
|
|
void LoadSpritePalettes(struct SpritePalette *palettes);
|
|
u8 AllocSpritePalette(u16 tag);
|
|
u8 IndexOfSpritePaletteTag(u16 tag);
|
|
u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum);
|
|
void FreeSpritePaletteByTag(u16 tag);
|
|
void SetSubspriteTables(struct Sprite *sprite, struct SubspriteTable *subspriteTables);
|
|
bool8 AddSpriteToOamBuffer(struct Sprite *object, u8 *oamIndex);
|
|
bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex);
|
|
|
|
#endif // GUARD_SPRITE_H
|