mirror of
https://github.com/pret/pokefirered.git
synced 2026-05-11 14:35:05 -05:00
sync sprite.c/h
This commit is contained in:
parent
b4ec4a717f
commit
ba6cbb267b
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef GUARD_SPRITE_H
|
||||
#define GUARD_SPRITE_H
|
||||
|
||||
#define OAM_MATRIX_COUNT 32
|
||||
#define MAX_SPRITES 64
|
||||
#define SPRITE_NONE 0xFF
|
||||
#define TAG_NONE 0xFFFF
|
||||
|
|
@ -30,6 +31,7 @@ struct SpriteFrameImage
|
|||
};
|
||||
|
||||
#define obj_frame_tiles(ptr) {.data = (u8 *)ptr, .size = sizeof ptr}
|
||||
|
||||
#define overworld_frame(ptr, width, height, frame) {.data = (u8 *)ptr + (width * height * frame * 64)/2, .size = (width * height * 64)/2}
|
||||
#define overworld_ascending_frames(ptr, width, height) {.data = (u8 *)ptr, .size = (width * height * 64)/2, .relativeFrames=TRUE}
|
||||
|
||||
|
|
@ -120,7 +122,7 @@ union AffineAnimCmd
|
|||
struct AffineAnimFrameCmd frame;
|
||||
struct AffineAnimLoopCmd loop;
|
||||
struct AffineAnimJumpCmd jump;
|
||||
struct AffineAnimEndCmdAlt end;
|
||||
struct AffineAnimEndCmdAlt end; // unused in code
|
||||
};
|
||||
|
||||
#define AFFINEANIMCMDTYPE_LOOP 0x7FFD
|
||||
|
|
@ -187,6 +189,10 @@ struct SpriteTemplate
|
|||
SpriteCallback callback;
|
||||
};
|
||||
|
||||
// UB: template pointer is often used to point to temporary storage,
|
||||
// then later dereferenced after being freed. Usually this won't
|
||||
// be visible in-game, but this is (part of) what causes the item
|
||||
// icon palette to flicker when changing items in the bag.
|
||||
struct Sprite
|
||||
{
|
||||
/*0x00*/ struct OamData oam;
|
||||
|
|
@ -252,24 +258,26 @@ struct OamMatrix
|
|||
extern const struct OamData gDummyOamData;
|
||||
extern const union AnimCmd *const gDummySpriteAnimTable[];
|
||||
extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[];
|
||||
extern const struct SpriteTemplate gDummySpriteTemplate;
|
||||
|
||||
extern u8 gReservedSpritePaletteCount;
|
||||
extern struct Sprite gSprites[MAX_SPRITES + 1];
|
||||
extern u8 gOamLimit;
|
||||
extern u16 gReservedSpriteTileCount;
|
||||
extern s16 gSpriteCoordOffsetX;
|
||||
extern s16 gSpriteCoordOffsetY;
|
||||
extern const struct SpriteTemplate gDummySpriteTemplate;
|
||||
extern struct Sprite gSprites[];
|
||||
extern u8 gOamLimit;
|
||||
extern struct OamMatrix gOamMatrices[];
|
||||
extern struct OamMatrix gOamMatrices[OAM_MATRIX_COUNT];
|
||||
extern bool8 gAffineAnimsDisabled;
|
||||
extern u16 gReservedSpriteTileCount;
|
||||
|
||||
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, s16 x, s16 y, u8 subpriority);
|
||||
u8 CreateInvisibleSprite(void (*callback)(struct Sprite *));
|
||||
u32 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority);
|
||||
u32 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority);
|
||||
u32 CreateInvisibleSprite(void (*callback)(struct Sprite *));
|
||||
u32 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority);
|
||||
void DestroySprite(struct Sprite *sprite);
|
||||
void ResetOamRange(u32 a, u32 b);
|
||||
void ResetOamRange(u32 start, u32 end);
|
||||
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);
|
||||
|
|
@ -281,6 +289,7 @@ void FreeSpritePalette(struct Sprite *sprite);
|
|||
void FreeSpriteOamMatrix(struct Sprite *sprite);
|
||||
void DestroySpriteAndFreeResources(struct Sprite *sprite);
|
||||
void AnimateSprite(struct Sprite *sprite);
|
||||
void SetSpriteMatrixAnchor(struct Sprite *sprite, s16 x, s16 y);
|
||||
void StartSpriteAnim(struct Sprite *sprite, u8 animNum);
|
||||
void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum);
|
||||
void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex);
|
||||
|
|
@ -299,6 +308,8 @@ void LoadSpriteSheets(const struct SpriteSheet *sheets);
|
|||
s16 AllocSpriteTiles(u16 tileCount);
|
||||
u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet);
|
||||
void AllocTilesForSpriteSheets(struct SpriteSheet *sheets);
|
||||
void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet);
|
||||
void LoadTilesForSpriteSheets(struct SpriteSheet *sheets);
|
||||
void FreeSpriteTilesByTag(u16 tag);
|
||||
void FreeSpriteTileRanges(void);
|
||||
u16 GetSpriteTileStartByTag(u16 tag);
|
||||
|
|
@ -306,10 +317,10 @@ u16 GetSpriteTileTagByTileStart(u16 start);
|
|||
void RequestSpriteSheetCopy(const struct SpriteSheet *sheet);
|
||||
u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet);
|
||||
void FreeAllSpritePalettes(void);
|
||||
u8 LoadSpritePalette(const struct SpritePalette *palette);
|
||||
u32 LoadSpritePalette(const struct SpritePalette *palette);
|
||||
void LoadSpritePalettes(const struct SpritePalette *palettes);
|
||||
u8 AllocSpritePalette(u16 tag);
|
||||
u8 IndexOfSpritePaletteTag(u16 tag);
|
||||
u32 AllocSpritePalette(u16 tag);
|
||||
u32 IndexOfSpritePaletteTag(u16 tag);
|
||||
u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum);
|
||||
void FreeSpritePaletteByTag(u16 tag);
|
||||
void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables);
|
||||
|
|
@ -320,7 +331,8 @@ void CopyFromSprites(u8 *dest);
|
|||
u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
|
||||
void ClearSpriteCopyRequests(void);
|
||||
void ResetAffineAnimData(void);
|
||||
void SetSpriteMatrixAnchor(struct Sprite* sprite, s16 xmod, s16 ymod);
|
||||
u32 GetSpanPerImage(u32 shape, u32 size);
|
||||
void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images);
|
||||
void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip);
|
||||
|
||||
#endif //GUARD_SPRITE_H
|
||||
|
|
|
|||
|
|
@ -669,11 +669,14 @@ static void Bag_BuildListMenuTemplate(u8 pocket)
|
|||
|
||||
static void BagListMenuGetItemNameColored(u8 *dest, u16 itemId)
|
||||
{
|
||||
u8* end;
|
||||
if (itemId == ITEM_TM_CASE || itemId == ITEM_BERRY_POUCH)
|
||||
StringCopy(dest, sListItemTextColor_TmCase_BerryPouch);
|
||||
else
|
||||
StringCopy(dest, sListItemTextColor_RegularItem);
|
||||
StringAppend(dest, ItemId_GetName(itemId));
|
||||
|
||||
end = StringAppend(dest, ItemId_GetName(itemId));
|
||||
PrependFontIdToFit(dest, end, FONT_NARROW, 61);
|
||||
}
|
||||
|
||||
static void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
|
||||
|
|
|
|||
211
src/sprite.c
211
src/sprite.c
|
|
@ -5,8 +5,6 @@
|
|||
|
||||
#define MAX_SPRITE_COPY_REQUESTS 64
|
||||
|
||||
#define OAM_MATRIX_COUNT 32
|
||||
|
||||
#define sAnchorX data[6]
|
||||
#define sAnchorY data[7]
|
||||
|
||||
|
|
@ -16,17 +14,17 @@
|
|||
(sSpriteTileRanges + 1)[index * 2] = count; \
|
||||
}
|
||||
|
||||
#define ALLOC_SPRITE_TILE(n) \
|
||||
#define ALLOC_SPRITE_TILE(n) \
|
||||
{ \
|
||||
sSpriteTileAllocBitmap[(n) / 8] |= (1 << ((n) % 8)); \
|
||||
}
|
||||
|
||||
#define FREE_SPRITE_TILE(n) \
|
||||
{ \
|
||||
gSpriteTileAllocBitmap[(n) >> 3] |= (1 << ((n) & 7)); \
|
||||
sSpriteTileAllocBitmap[(n) / 8] &= ~(1 << ((n) % 8)); \
|
||||
}
|
||||
|
||||
#define FREE_SPRITE_TILE(n) \
|
||||
{ \
|
||||
gSpriteTileAllocBitmap[(n) >> 3] &= ~(1 << ((n) & 7)); \
|
||||
}
|
||||
|
||||
#define SPRITE_TILE_IS_ALLOCATED(n) ((gSpriteTileAllocBitmap[(n) >> 3] >> ((n) & 7)) & 1)
|
||||
#define SPRITE_TILE_IS_ALLOCATED(n) ((sSpriteTileAllocBitmap[(n) / 8] >> ((n) % 8)) & 1)
|
||||
|
||||
|
||||
struct SpriteCopyRequest
|
||||
|
|
@ -52,7 +50,6 @@ static void SortSprites(u32 *spritePriorities, s32 n);
|
|||
static u32 CreateSpriteAt(u32 index, const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority);
|
||||
static void ResetOamMatrices(void);
|
||||
static void ResetSprite(struct Sprite *sprite);
|
||||
static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images);
|
||||
static void ResetAllSprites(void);
|
||||
static void BeginAnim(struct Sprite *sprite);
|
||||
static void ContinueAnim(struct Sprite *sprite);
|
||||
|
|
@ -75,7 +72,6 @@ static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite);
|
|||
static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite);
|
||||
static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix);
|
||||
static u8 GetSpriteMatrixNum(struct Sprite *sprite);
|
||||
static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip);
|
||||
static void AffineAnimStateRestartAnim(u8 matrixNum);
|
||||
static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum);
|
||||
static void AffineAnimStateReset(u8 matrixNum);
|
||||
|
|
@ -89,7 +85,7 @@ static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameC
|
|||
static u8 IndexOfSpriteTileTag(u16 tag);
|
||||
static void AllocSpriteTileRange(u16 tag, u16 start, u16 count);
|
||||
static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset);
|
||||
static void UpdateSpriteMatrixAnchorPos(struct Sprite* sprite, s32 a1, s32 a2);
|
||||
static void UpdateSpriteMatrixAnchorPos(struct Sprite *, s32, s32);
|
||||
|
||||
typedef void (*AnimFunc)(struct Sprite *);
|
||||
typedef void (*AnimCmdFunc)(struct Sprite *);
|
||||
|
|
@ -228,71 +224,54 @@ static const struct OamDimensions32 sOamDimensions32[3][4] =
|
|||
},
|
||||
};
|
||||
|
||||
static const s32 sOamDimensionsCopy[3][4][2] =
|
||||
{
|
||||
[ST_OAM_SQUARE] = {
|
||||
[ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8
|
||||
[ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16
|
||||
[ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32
|
||||
[ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64
|
||||
},
|
||||
[ST_OAM_H_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8
|
||||
[ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8
|
||||
[ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16
|
||||
[ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32
|
||||
},
|
||||
[ST_OAM_V_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16
|
||||
[ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32
|
||||
[ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32
|
||||
[ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64
|
||||
},
|
||||
};
|
||||
|
||||
static const struct OamDimensions sOamDimensions[3][4] =
|
||||
{
|
||||
[ST_OAM_SQUARE] = {
|
||||
[ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8
|
||||
[ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16
|
||||
[ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32
|
||||
[ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64
|
||||
[ST_OAM_SQUARE] =
|
||||
{
|
||||
[SPRITE_SIZE(8x8)] = { 8, 8 },
|
||||
[SPRITE_SIZE(16x16)] = { 16, 16 },
|
||||
[SPRITE_SIZE(32x32)] = { 32, 32 },
|
||||
[SPRITE_SIZE(64x64)] = { 64, 64 },
|
||||
},
|
||||
[ST_OAM_H_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8
|
||||
[ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8
|
||||
[ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16
|
||||
[ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32
|
||||
[ST_OAM_H_RECTANGLE] =
|
||||
{
|
||||
[SPRITE_SIZE(16x8)] = { 16, 8 },
|
||||
[SPRITE_SIZE(32x8)] = { 32, 8 },
|
||||
[SPRITE_SIZE(32x16)] = { 32, 16 },
|
||||
[SPRITE_SIZE(64x32)] = { 64, 32 },
|
||||
},
|
||||
[ST_OAM_V_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16
|
||||
[ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32
|
||||
[ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32
|
||||
[ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64
|
||||
[ST_OAM_V_RECTANGLE] =
|
||||
{
|
||||
[SPRITE_SIZE(8x16)] = { 8, 16 },
|
||||
[SPRITE_SIZE(8x32)] = { 8, 32 },
|
||||
[SPRITE_SIZE(16x32)] = { 16, 32 },
|
||||
[SPRITE_SIZE(32x64)] = { 32, 64 },
|
||||
},
|
||||
};
|
||||
|
||||
// iwram bss
|
||||
static u16 sSpriteTileRangeTags[MAX_SPRITES];
|
||||
static u16 sSpriteTileRanges[MAX_SPRITES * 2];
|
||||
static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT];
|
||||
static u16 sSpritePaletteTags[16];
|
||||
|
||||
// iwram common
|
||||
COMMON_DATA u32 gOamMatrixAllocBitmap = 0;
|
||||
COMMON_DATA u8 gReservedSpritePaletteCount = 0;
|
||||
|
||||
EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0};
|
||||
EWRAM_DATA static u8 sSpriteOrder[MAX_SPRITES] = {0};
|
||||
EWRAM_DATA bool8 gShouldProcessSpriteCopyRequests = 0;
|
||||
EWRAM_DATA u8 gSpriteCopyRequestCount = 0;
|
||||
EWRAM_DATA struct SpriteCopyRequest gSpriteCopyRequests[MAX_SPRITES] = {0};
|
||||
EWRAM_DATA static bool8 sShouldProcessSpriteCopyRequests = 0;
|
||||
EWRAM_DATA static u8 sSpriteCopyRequestCount = 0;
|
||||
EWRAM_DATA static struct SpriteCopyRequest sSpriteCopyRequests[MAX_SPRITES] = {0};
|
||||
EWRAM_DATA u8 gOamLimit = 0;
|
||||
static EWRAM_DATA u8 sOamDummyIndex = 0;
|
||||
EWRAM_DATA u16 gReservedSpriteTileCount = 0;
|
||||
EWRAM_DATA u8 gSpriteTileAllocBitmap[128] = {0};
|
||||
EWRAM_DATA static u8 sSpriteTileAllocBitmap[128] = {0};
|
||||
EWRAM_DATA s16 gSpriteCoordOffsetX = 0;
|
||||
EWRAM_DATA s16 gSpriteCoordOffsetY = 0;
|
||||
EWRAM_DATA struct OamMatrix gOamMatrices[OAM_MATRIX_COUNT] = {0};
|
||||
EWRAM_DATA bool8 gAffineAnimsDisabled = 0;
|
||||
EWRAM_DATA bool8 gAffineAnimsDisabled = FALSE;
|
||||
|
||||
void ResetSpriteData(void)
|
||||
{
|
||||
|
|
@ -427,7 +406,7 @@ void BuildOamBuffer(void)
|
|||
}
|
||||
|
||||
gMain.oamLoadDisabled = oamLoadDisabled;
|
||||
gShouldProcessSpriteCopyRequests = TRUE;
|
||||
sShouldProcessSpriteCopyRequests = TRUE;
|
||||
}
|
||||
|
||||
static inline void InsertionSort(u32 *spritePriorities, s32 n)
|
||||
|
|
@ -452,7 +431,7 @@ static void SortSprites(u32 *spritePriorities, s32 n)
|
|||
InsertionSort(spritePriorities, n);
|
||||
}
|
||||
|
||||
u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)
|
||||
u32 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
|
|
@ -463,7 +442,7 @@ u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subprior
|
|||
return MAX_SPRITES;
|
||||
}
|
||||
|
||||
u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)
|
||||
u32 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u32 subpriority)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
|
|
@ -474,7 +453,7 @@ u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 sub
|
|||
return MAX_SPRITES;
|
||||
}
|
||||
|
||||
u8 CreateInvisibleSprite(void (*callback)(struct Sprite *))
|
||||
u32 CreateInvisibleSprite(void (*callback)(struct Sprite *))
|
||||
{
|
||||
u32 index = CreateSprite(&gDummySpriteTemplate, 0, 0, 31);
|
||||
|
||||
|
|
@ -600,14 +579,14 @@ void ClearSpriteCopyRequests(void)
|
|||
{
|
||||
u32 i;
|
||||
|
||||
gShouldProcessSpriteCopyRequests = FALSE;
|
||||
gSpriteCopyRequestCount = 0;
|
||||
sShouldProcessSpriteCopyRequests = FALSE;
|
||||
sSpriteCopyRequestCount = 0;
|
||||
|
||||
for (i = 0; i < MAX_SPRITE_COPY_REQUESTS; i++)
|
||||
{
|
||||
gSpriteCopyRequests[i].src = 0;
|
||||
gSpriteCopyRequests[i].dest = 0;
|
||||
gSpriteCopyRequests[i].size = 0;
|
||||
sSpriteCopyRequests[i].src = 0;
|
||||
sSpriteCopyRequests[i].dest = 0;
|
||||
sSpriteCopyRequests[i].size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -712,20 +691,20 @@ u8 SpriteTileAllocBitmapOp(u16 bit, u8 op)
|
|||
u8 val = bit % 8;
|
||||
u8 retVal = 0;
|
||||
|
||||
if (op == 0) // clear
|
||||
if (op == 0)
|
||||
{
|
||||
val = ~(1 << val);
|
||||
gSpriteTileAllocBitmap[index] &= val;
|
||||
sSpriteTileAllocBitmap[index] &= val;
|
||||
}
|
||||
else if (op == 1) // set
|
||||
else if (op == 1)
|
||||
{
|
||||
val = (1 << val);
|
||||
gSpriteTileAllocBitmap[index] |= val;
|
||||
sSpriteTileAllocBitmap[index] |= val;
|
||||
}
|
||||
else // check
|
||||
else
|
||||
{
|
||||
retVal = 1 << shift;
|
||||
retVal &= gSpriteTileAllocBitmap[index];
|
||||
retVal &= sSpriteTileAllocBitmap[index];
|
||||
}
|
||||
|
||||
return retVal;
|
||||
|
|
@ -737,48 +716,48 @@ void SpriteCallbackDummy(struct Sprite *sprite)
|
|||
|
||||
void ProcessSpriteCopyRequests(void)
|
||||
{
|
||||
if (gShouldProcessSpriteCopyRequests)
|
||||
if (sShouldProcessSpriteCopyRequests)
|
||||
{
|
||||
u8 i = 0;
|
||||
|
||||
while (gSpriteCopyRequestCount > 0)
|
||||
while (sSpriteCopyRequestCount > 0)
|
||||
{
|
||||
CpuCopy16(gSpriteCopyRequests[i].src, gSpriteCopyRequests[i].dest, gSpriteCopyRequests[i].size);
|
||||
gSpriteCopyRequestCount--;
|
||||
CpuCopy16(sSpriteCopyRequests[i].src, sSpriteCopyRequests[i].dest, sSpriteCopyRequests[i].size);
|
||||
sSpriteCopyRequestCount--;
|
||||
i++;
|
||||
}
|
||||
|
||||
gShouldProcessSpriteCopyRequests = FALSE;
|
||||
sShouldProcessSpriteCopyRequests = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images)
|
||||
{
|
||||
if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS)
|
||||
if (sSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS)
|
||||
{
|
||||
if (!images[0].relativeFrames)
|
||||
{
|
||||
gSpriteCopyRequests[gSpriteCopyRequestCount].src = images[index].data;
|
||||
gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size;
|
||||
sSpriteCopyRequests[sSpriteCopyRequestCount].src = images[index].data;
|
||||
sSpriteCopyRequests[sSpriteCopyRequestCount].size = images[index].size;
|
||||
}
|
||||
else
|
||||
{
|
||||
gSpriteCopyRequests[gSpriteCopyRequestCount].src = images[0].data + images[0].size * index;
|
||||
gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[0].size;
|
||||
sSpriteCopyRequests[sSpriteCopyRequestCount].src = images[0].data + images[0].size * index;
|
||||
sSpriteCopyRequests[sSpriteCopyRequestCount].size = images[0].size;
|
||||
}
|
||||
gSpriteCopyRequests[gSpriteCopyRequestCount].dest = (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum;
|
||||
gSpriteCopyRequestCount++;
|
||||
sSpriteCopyRequests[sSpriteCopyRequestCount].dest = (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum;
|
||||
sSpriteCopyRequestCount++;
|
||||
}
|
||||
}
|
||||
|
||||
void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size)
|
||||
{
|
||||
if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS)
|
||||
if (sSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS)
|
||||
{
|
||||
gSpriteCopyRequests[gSpriteCopyRequestCount].src = src;
|
||||
gSpriteCopyRequests[gSpriteCopyRequestCount].dest = dest;
|
||||
gSpriteCopyRequests[gSpriteCopyRequestCount].size = size;
|
||||
gSpriteCopyRequestCount++;
|
||||
sSpriteCopyRequests[sSpriteCopyRequestCount].src = src;
|
||||
sSpriteCopyRequests[sSpriteCopyRequestCount].dest = dest;
|
||||
sSpriteCopyRequests[sSpriteCopyRequestCount].size = size;
|
||||
sSpriteCopyRequestCount++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -808,7 +787,7 @@ void CopyToSprites(u8 *src)
|
|||
|
||||
void ResetAllSprites(void)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < MAX_SPRITES; i++)
|
||||
{
|
||||
|
|
@ -1067,9 +1046,13 @@ void ContinueAffineAnim(struct Sprite *sprite)
|
|||
u8 matrixNum = GetSpriteMatrixNum(sprite);
|
||||
|
||||
if (sAffineAnimStates[matrixNum].delayCounter)
|
||||
{
|
||||
AffineAnimDelay(matrixNum, sprite);
|
||||
}
|
||||
else if (sprite->affineAnimPaused)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
s16 type;
|
||||
|
|
@ -1176,23 +1159,25 @@ u8 GetSpriteMatrixNum(struct Sprite *sprite)
|
|||
return matrixNum;
|
||||
}
|
||||
|
||||
void SetSpriteMatrixAnchor(struct Sprite* sprite, s16 x, s16 y)
|
||||
// Used to shift a sprite's position as it scales.
|
||||
// Only used by the minigame countdown, so that for instance the numbers don't slide up as they squish down before jumping.
|
||||
void SetSpriteMatrixAnchor(struct Sprite *sprite, s16 x, s16 y)
|
||||
{
|
||||
sprite->sAnchorX = x;
|
||||
sprite->sAnchorY = y;
|
||||
sprite->anchored = TRUE;
|
||||
}
|
||||
|
||||
static s32 GetAnchorCoord(s32 baseDim, s32 xformed, s32 modifier)
|
||||
static s32 GetAnchorCoord(s32 a0, s32 a1, s32 coord)
|
||||
{
|
||||
s32 subResult, shiftResult;
|
||||
s32 subResult, var1;
|
||||
|
||||
subResult = xformed - baseDim;
|
||||
subResult = a1 - a0;
|
||||
if (subResult < 0)
|
||||
shiftResult = -(subResult) >> 9;
|
||||
var1 = -(subResult) >> 9;
|
||||
else
|
||||
shiftResult = -(subResult >> 9);
|
||||
return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult);
|
||||
var1 = -(subResult >> 9);
|
||||
return coord - ((u32)(coord * a1) / (u32)(a0) + var1);
|
||||
}
|
||||
|
||||
static void UpdateSpriteMatrixAnchorPos(struct Sprite *sprite, s32 x, s32 y)
|
||||
|
|
@ -1388,9 +1373,9 @@ void SetSpriteSheetFrameTileNum(struct Sprite *sprite)
|
|||
|
||||
void ResetAffineAnimData(void)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
|
||||
gAffineAnimsDisabled = 0;
|
||||
gAffineAnimsDisabled = FALSE;
|
||||
gOamMatrixAllocBitmap = 0;
|
||||
|
||||
ResetOamMatrices();
|
||||
|
|
@ -1497,7 +1482,7 @@ u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u32 frame,
|
|||
|
||||
void LoadSpriteSheets(const struct SpriteSheet *sheets)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
for (i = 0; sheets[i].data != NULL; i++)
|
||||
LoadSpriteSheet(&sheets[i]);
|
||||
}
|
||||
|
|
@ -1526,7 +1511,7 @@ void FreeSpriteTilesByTag(u16 tag)
|
|||
|
||||
void FreeSpriteTileRanges(void)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < MAX_SPRITES; i++)
|
||||
{
|
||||
|
|
@ -1539,13 +1524,13 @@ u16 GetSpriteTileStartByTag(u16 tag)
|
|||
{
|
||||
u8 index = IndexOfSpriteTileTag(tag);
|
||||
if (index == 0xFF)
|
||||
return TAG_NONE;
|
||||
return 0xFFFF;
|
||||
return sSpriteTileRanges[index * 2];
|
||||
}
|
||||
|
||||
u8 IndexOfSpriteTileTag(u16 tag)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < MAX_SPRITES; i++)
|
||||
if (sSpriteTileRangeTags[i] == tag)
|
||||
|
|
@ -1556,7 +1541,7 @@ u8 IndexOfSpriteTileTag(u16 tag)
|
|||
|
||||
u16 GetSpriteTileTagByTileStart(u16 start)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < MAX_SPRITES; i++)
|
||||
{
|
||||
|
|
@ -1576,15 +1561,15 @@ void AllocSpriteTileRange(u16 tag, u16 start, u16 count)
|
|||
|
||||
void FreeAllSpritePalettes(void)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
gReservedSpritePaletteCount = 0;
|
||||
for (i = 0; i < ARRAY_COUNT(sSpritePaletteTags); i++)
|
||||
for (i = 0; i < 16; i++)
|
||||
sSpritePaletteTags[i] = TAG_NONE;
|
||||
}
|
||||
|
||||
u8 LoadSpritePalette(const struct SpritePalette *palette)
|
||||
u32 LoadSpritePalette(const struct SpritePalette *palette)
|
||||
{
|
||||
u8 index = IndexOfSpritePaletteTag(palette->tag);
|
||||
u32 index = IndexOfSpritePaletteTag(palette->tag);
|
||||
|
||||
if (index != 0xFF)
|
||||
return index;
|
||||
|
|
@ -1605,20 +1590,20 @@ u8 LoadSpritePalette(const struct SpritePalette *palette)
|
|||
|
||||
void LoadSpritePalettes(const struct SpritePalette *palettes)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
for (i = 0; palettes[i].data != NULL; i++)
|
||||
if (LoadSpritePalette(&palettes[i]) == 0xFF)
|
||||
break;
|
||||
}
|
||||
|
||||
static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset)
|
||||
void DoLoadSpritePalette(const u16 *src, u16 paletteOffset)
|
||||
{
|
||||
LoadPalette(src, paletteOffset + OBJ_PLTT_OFFSET, PLTT_SIZE_4BPP);
|
||||
LoadPalette(src, OBJ_PLTT_OFFSET + paletteOffset, PLTT_SIZE_4BPP);
|
||||
}
|
||||
|
||||
u8 AllocSpritePalette(u16 tag)
|
||||
u32 AllocSpritePalette(u16 tag)
|
||||
{
|
||||
u8 index = IndexOfSpritePaletteTag(TAG_NONE);
|
||||
u32 index = IndexOfSpritePaletteTag(TAG_NONE);
|
||||
if (index == 0xFF)
|
||||
{
|
||||
return 0xFF;
|
||||
|
|
@ -1630,9 +1615,9 @@ u8 AllocSpritePalette(u16 tag)
|
|||
}
|
||||
}
|
||||
|
||||
u8 IndexOfSpritePaletteTag(u16 tag)
|
||||
u32 IndexOfSpritePaletteTag(u16 tag)
|
||||
{
|
||||
u8 i;
|
||||
u32 i;
|
||||
for (i = gReservedSpritePaletteCount; i < 16; i++)
|
||||
if (sSpritePaletteTags[i] == tag)
|
||||
return i;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user