diff options
Diffstat (limited to 'include/sprite.h')
-rw-r--r-- | include/sprite.h | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/include/sprite.h b/include/sprite.h new file mode 100644 index 000000000..27b3222ee --- /dev/null +++ b/include/sprite.h @@ -0,0 +1,242 @@ +#ifndef GUARD_SPRITE_H +#define GUARD_SPRITE_H + +struct SpriteSheet +{ + u8 *data; + u16 size; + u16 tag; +}; + +struct SpriteFrameImage +{ + u8 *data; + u16 size; +}; + +struct SpritePalette +{ + u8 *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 FreeAllSpriteTiles(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 |