summaryrefslogtreecommitdiff
path: root/include/sprite.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/sprite.h')
-rw-r--r--include/sprite.h55
1 files changed, 38 insertions, 17 deletions
diff --git a/include/sprite.h b/include/sprite.h
index 13d94e9f3..42620c9e9 100644
--- a/include/sprite.h
+++ b/include/sprite.h
@@ -5,7 +5,7 @@
struct SpriteSheet
{
- u8 *data;
+ const u8 *data;
u16 size;
u16 tag;
};
@@ -18,7 +18,7 @@ struct SpriteFrameImage
struct SpritePalette
{
- u16 *data;
+ const u16 *data;
u16 tag;
};
@@ -45,6 +45,9 @@ struct AnimJumpCmd
u32 target:6;
};
+// The first halfword of this union specifies the type of command.
+// If it -2, then it is a jump command. If it is -1, then it is the end of the script.
+// Otherwise, it is the imageValue for a frame command.
union AnimCmd
{
s16 type;
@@ -53,6 +56,13 @@ union AnimCmd
struct AnimJumpCmd jump;
};
+#define ANIMCMD_FRAME(...) \
+ {.frame = {__VA_ARGS__}}
+#define ANIMCMD_JUMP(_target) \
+ {.jump = {.type = -2, .target = _target}}
+#define ANIMCMD_END \
+ {.type = -1}
+
struct AffineAnimFrameCmd
{
s16 xScale;
@@ -81,6 +91,11 @@ union AffineAnimCmd
struct AffineAnimJumpCmd jump;
};
+#define AFFINEANIMCMD_FRAME(_xScale, _yScale, _rotation, _duration) \
+ {.frame = {.xScale = _xScale, .yScale = _yScale, .rotation = _rotation, .duration = _duration}}
+#define AFFINEANIMCMD_END \
+ {.type = 0x7FFF}
+
struct AffineAnimState
{
u8 animNum;
@@ -121,21 +136,21 @@ struct SpriteTemplate
{
u16 tileTag;
u16 paletteTag;
- struct OamData *oam;
- union AnimCmd **anims;
+ const struct OamData *oam;
+ const union AnimCmd *const *anims;
struct SpriteFrameImage *images;
- union AffineAnimCmd **affineAnims;
+ const union AffineAnimCmd *const *affineAnims;
void (*callback)(struct Sprite *);
};
struct Sprite
{
/*0x00*/ struct OamData oam;
- /*0x08*/ union AnimCmd **anims;
- /*0x0C*/ struct SpriteFrameImage *images;
- /*0x10*/ union AffineAnimCmd **affineAnims;
+ /*0x08*/ const union AnimCmd *const *anims;
+ /*0x0C*/ const struct SpriteFrameImage *images;
+ /*0x10*/ const union AffineAnimCmd *const *affineAnims;
/*0x14*/ const struct SpriteTemplate *template;
- /*0x18*/ struct SubspriteTable *subspriteTables;
+ /*0x18*/ const struct SubspriteTable *subspriteTables;
/*0x1C*/ void (*callback)(struct Sprite *);
/*0x20*/ struct Coords16 pos1;
@@ -185,6 +200,10 @@ struct Sprite
/*0x43*/ u8 subpriority;
};
+extern const struct OamData gDummyOamData;
+extern const union AnimCmd *const gDummySpriteAnimTable[];
+extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[];
+
extern s16 gSpriteCoordOffsetX;
extern s16 gSpriteCoordOffsetY;
@@ -194,7 +213,7 @@ void ResetSpriteData(void);
void AnimateSprites(void);
void BuildOamBuffer(void);
u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
-u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority);
+u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 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);
@@ -204,7 +223,7 @@ 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 RequestSpriteCopy(const u8 *src, u8 *dest, u16 size);
void FreeSpriteTiles(struct Sprite *sprite);
void FreeSpritePalette(struct Sprite *sprite);
void FreeSpriteOamMatrix(struct Sprite *sprite);
@@ -223,18 +242,18 @@ 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 LoadSpriteSheet(const struct SpriteSheet *sheet);
+void LoadSpriteSheets(const struct SpriteSheet *sheets);
u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet);
void AllocTilesForSpriteSheets(struct SpriteSheet *sheets);
-void LoadTilesForSpriteSheet(struct SpriteSheet *sheet);
+void LoadTilesForSpriteSheet(const 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 RequestSpriteSheetCopy(const struct SpriteSheet *sheet);
+u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet);
void FreeAllSpritePalettes(void);
u8 LoadSpritePalette(const struct SpritePalette *palette);
void LoadSpritePalettes(const struct SpritePalette *palettes);
@@ -242,11 +261,13 @@ u8 AllocSpritePalette(u16 tag);
u8 IndexOfSpritePaletteTag(u16 tag);
u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum);
void FreeSpritePaletteByTag(u16 tag);
-void SetSubspriteTables(struct Sprite *sprite, struct SubspriteTable *subspriteTables);
+void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables);
bool8 AddSpriteToOamBuffer(struct Sprite *object, u8 *oamIndex);
bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex);
void CopyToSprites(u8 *src);
void CopyFromSprites(u8 *dest);
u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
+extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[];
+
#endif // GUARD_SPRITE_H