#ifndef POKEHEARTGOLD_SPRITE_H #define POKEHEARTGOLD_SPRITE_H #include "unk_02009D48.h" typedef enum SpriteAnimType { SPRITE_ANIM_TYPE_NULL, SPRITE_ANIM_TYPE_CELL, SPRITE_ANIM_TYPE_MULTICELL, SPRITE_ANIM_TYPE_CELL_TRANSFER, } SpriteAnimType; typedef struct SimpleSpriteTemplate { SpriteList *spriteList; // 000 const SpriteResourcesHeader *header; // 004 VecFx32 position; // 008 u32 priority; // 014 NNS_G2D_VRAM_TYPE whichScreen; // 018 HeapID heapId; // 01C } SimpleSpriteTemplate; typedef struct SpriteTemplate { SpriteList *spriteList; // 000 const SpriteResourcesHeader *header; // 004 VecFx32 position; // 008 VecFx32 scale; // 014 u16 rotation; // 020 u32 priority; // 024 NNS_G2D_VRAM_TYPE whichScreen; // 028 HeapID heapId; // 02C } SpriteTemplate; typedef struct SpriteAnimationData { const NNSG2dCellDataBank *cellBank; const NNSG2dCellAnimBankData *animBankData; NNSG2dCellAnimation animation; } SpriteAnimationData; typedef struct SpriteAnimationDataWithTransfer { const NNSG2dCellDataBank *cellBank; const NNSG2dCellAnimBankData *animBankData; NNSG2dCellAnimation animation; u32 cellTransferStateHandle; } SpriteAnimationDataWithTransfer; typedef struct SpriteMultiAnimationData { const NNSG2dCellDataBank *cellBank; const NNSG2dCellAnimBankData *animBankData; NNSG2dMultiCellAnimation animation; const NNSG2dMultiCellDataBank *multiCellBank; const NNSG2dMultiCellAnimBankData *multiAnimBankData; NNSG2dNode *node; NNSG2dCellAnimation *cellAnim; } SpriteMultiAnimationData; // UB: this is too small #ifdef BUGFIX_SPRITE_ANIM_SIZE #define max(a, b) ((a) > (b) ? (a) : (b)) #define SPRITE_ANIMATION_DATA_WORD_COUNT (max(sizeof(SpriteAnimationData), sizeof(SpriteMultiAnimationData)) / 4) #else #define SPRITE_ANIMATION_DATA_WORD_COUNT 29 #endif // BUGFIX_SPRITE_ANIM_SIZE typedef struct Sprite { VecFx32 matrix; // 000 VecFx32 affineMatrix; // 00C VecFx32 scale; // 018 u16 rotation; // 024 u8 affine; // 026 u8 flip; // 027 u8 overwrite; // 028 u8 palIndex; // 029 u8 palOffset; // 02a BOOL mosaic; // 02c GXOamMode mode; // 030 u8 drawFlag; // 034 u8 animActive; // 035 fx32 speed; // 038 SpriteList *spriteList; // 03c u32 animationData[SPRITE_ANIMATION_DATA_WORD_COUNT]; // 040 NNSG2dImageProxy imageProxy; // 0b4 NNSG2dImagePaletteProxy paletteProxy; // 0d8 SpriteAnimType flag; // 0ec u16 animationNo; // 0f0 u8 priority; // 0f2 u16 drawPriority; // 0f4 NNS_G2D_VRAM_TYPE type; // 0f8 struct Sprite *prev; // 0fc struct Sprite *next; // 100 } Sprite; typedef struct UnkImageStruct { Sprite *sprite; SpriteResourcesHeader *spriteResourcesHeader; SpriteResourceHeaderList *spriteResourceHeaderList; int vramTransfer; } UnkImageStruct; struct SpriteList { Sprite *sprites; // 0x000 int numSprites; // 0x004 Sprite **stack; // 0x008 int stackPointer; // 0x00C Sprite dummy; // 0x010 NNSG2dRendererInstance *renderer; // 0x114 void *animBuff; // 0x118 NNSG2dCellAnimBankData *animBank; // 0x11C u32 flag; // 0x120 }; SpriteList *SpriteList_Create(SpriteListParam *param); BOOL SpriteList_Delete(SpriteList *spriteList); BOOL SpriteList_DeleteAllSprites(SpriteList *spriteList); void SpriteList_RenderAndAnimateSprites(SpriteList *spriteList); Sprite *Sprite_CreateAffine(const SpriteTemplate *template); Sprite *Sprite_Create(const SimpleSpriteTemplate *simpleTemplate); void Sprite_Delete(Sprite *sprite); void Sprite_SetMatrix(Sprite *sprite, VecFx32 *vec); void Sprite_SetAffineMatrix(Sprite *sprite, VecFx32 *vec); void Sprite_SetScale(Sprite *sprite, VecFx32 *vec); void Sprite_SetScaleAndAffineType(Sprite *sprite, VecFx32 *vec, u8 affine); void Sprite_SetRotation(Sprite *sprite, u32 a1); void Sprite_SetRotationAndAffineType(Sprite *sprite, u32 rotation, u8 affine); void Sprite_SetVisibleFlag(Sprite *sprite, BOOL flag); void Sprite_SetAnimActiveFlag(Sprite *sprite, BOOL flag); void Sprite_SetAnimSpeed(Sprite *sprite, fx32 frame); void Sprite_SetAffineOverwriteType(Sprite *sprite, u8 affine); void Sprite_SetFlip_AffineOff(Sprite *sprite, u8 flip); VecFx32 *Sprite_GetMatrixPtr(Sprite *sprite); VecFx32 *Sprite_GetScalePtr(Sprite *sprite); u16 Sprite_GetRotation(Sprite *sprite); BOOL Sprite_GetVisibleFlag(Sprite *sprite); BOOL Sprite_GetAnimActiveFlag(Sprite *sprite); u32 Sprite_GetNumAnimSeqs(Sprite *sprite); void Sprite_SetAnimCtrlSeq(Sprite *sprite, int a1seq); void Sprite_TryChangeAnimSeq(Sprite *sprite, int seq); void Sprite_ResetAnimCtrlState(Sprite *sprite); u16 Sprite_GetAnimationNumber(Sprite *sprite); void Sprite_TickAnimCtrlFrame(Sprite *sprite, fx32 frames); void Sprite_SetAnimCtrlCurrentFrame(Sprite *sprite, u16 frame); u16 Sprite_GetAnimCtrlCurrentFrame(Sprite *sprite); void Sprite_SetPriority(Sprite *sprite, u8 priority); u8 Sprite_GetPriority(Sprite *sprite); void Sprite_SetPalIndex(Sprite *sprite, int index); void Sprite_SetPalIndexRespectVramOffset(Sprite *sprite, int index); int Sprite_GetPalIndex(Sprite *sprite); void Sprite_SetPalOffset(Sprite *sprite, u8 offset); void Sprite_SetPalOffsetRespectVramOffset(Sprite *sprite, u8 offset); u8 Sprite_GetPalOffset(Sprite *sprite); void Sprite_SetDrawPriority(Sprite *sprite, u32 priority); u16 Sprite_GetDrawPriority(Sprite *sprite); void Sprite_SetImageProxy(Sprite *sprite, NNSG2dImageProxy *proxy); NNSG2dImageProxy *Sprite_GetImageProxy(Sprite *sprite); void Sprite_SetPaletteProxy(Sprite *sprite, NNSG2dImagePaletteProxy *proxy); NNSG2dImagePaletteProxy *Sprite_GetPaletteProxy(Sprite *sprite); void Sprite_SetMosaic(Sprite *sprite, BOOL mosaic); NNS_G2D_VRAM_TYPE Sprite_GetVramType(Sprite *sprite); int Sprite_IsCellAnimationRunning(Sprite *sprite); void Sprite_SetOamMode(Sprite *sprite, GXOamMode mode); GXOamMode Sprite_GetOamMode(Sprite *sprite); void ClearMainOAM(HeapID heapId); void ClearSubOAM(HeapID heapId); u32 Sprite_GetCurrentAnimFrameExAttr(Sprite *sprite); NNSG2dCellAnimation *Sprite_GetCellAnim(Sprite *sprite); #endif // POKEHEARTGOLD_SPRITE_H