From df851221fa660f4f49014c722dab6b1df987c324 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 29 Jun 2025 15:19:34 +0200 Subject: [PATCH] Add flips sprite oam macros --- include/structs/sprite_oam.h | 19 ++++++++++++++----- src/dungeon_main.c | 34 ++++++++++++++++++---------------- src/dungeon_menu_recruitment.c | 2 +- src/dungeon_menu_team.c | 34 +++++++++++++++++----------------- src/naming_screen.c | 4 ++-- src/sprite.c | 2 +- 6 files changed, 53 insertions(+), 42 deletions(-) diff --git a/include/structs/sprite_oam.h b/include/structs/sprite_oam.h index 84d6e0042..6961cade8 100644 --- a/include/structs/sprite_oam.h +++ b/include/structs/sprite_oam.h @@ -230,13 +230,22 @@ typedef struct SpriteOAM (spritePtr)->attrib2 |= _matrixNumVal; \ } -// Needed for TryCreateModeArrows. No difference to SpriteSetMatrixNum other than not creating one additional local variable. -#define SpriteSetMatrixNum_UseLocalVar(spritePtr, _matrixNum) \ +#define SPRITEOAM_SHIFT_H_FLIP_MATRIXNUM (3) +#define SPRITEOAM_SHIFT_V_FLIP_MATRIXNUM (4) + +// Horizontal flip shares the same bits as matrixNum. +#define SpriteSetVFlip(spritePtr, _flip) \ { \ - _matrixNum &= SPRITEOAM_MAX_MATRIXNUM; \ - _matrixNum <<= SPRITEOAM_SHIFT_MATRIXNUM; \ + SpriteSetMatrixNum(spritePtr, (_flip << SPRITEOAM_SHIFT_V_FLIP_MATRIXNUM)) \ +} + +// Needed for TryCreateModeArrows. No difference to SpriteSetMatrixNum other than not creating one additional local variable. +#define SpriteSetMatrixNumFlips(spritePtr, _flips) \ +{ \ + _flips &= SPRITEOAM_MAX_MATRIXNUM; \ + _flips <<= SPRITEOAM_SHIFT_MATRIXNUM; \ (spritePtr)->attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; \ - (spritePtr)->attrib2 |= _matrixNum; \ + (spritePtr)->attrib2 |= _flips; \ } #define SpriteSetSize(spritePtr, _size) \ diff --git a/src/dungeon_main.c b/src/dungeon_main.c index bd9671173..a73f9f86e 100644 --- a/src/dungeon_main.c +++ b/src/dungeon_main.c @@ -604,8 +604,8 @@ struct DiagonalArrowInfo { s16 x; s16 y; - bool8 unk4; - bool8 unk5; + bool8 hFlip; + bool8 vFlip; }; static const struct DiagonalArrowInfo sDiagonalArrowsInfo[] = @@ -621,8 +621,8 @@ struct RotateArrowInfo s16 x; s16 y; u32 tilemapNum; - bool8 unk8; - bool8 unk9; + bool8 hFlip; + bool8 vFlip; }; static const struct RotateArrowInfo sRotateArrowsInfo[] = @@ -647,7 +647,7 @@ static void TryCreateModeArrows(Entity *leader) SpriteOAM sprite; for (i = 0; i < 4; i++) { - u32 matrixNum; + u32 flips; s32 x, xMul, x2; s32 y, yMul, y2; @@ -658,12 +658,13 @@ static void TryCreateModeArrows(Entity *leader) SpriteSetBpp(&sprite, 0); SpriteSetShape(&sprite, 0); - matrixNum = (sDiagonalArrowsInfo[i].unk4) ? 8 : 0; + flips = 0; + if (sDiagonalArrowsInfo[i].hFlip) + flips += (1 << SPRITEOAM_SHIFT_H_FLIP_MATRIXNUM); + if (sDiagonalArrowsInfo[i].vFlip) + flips += (1 << SPRITEOAM_SHIFT_V_FLIP_MATRIXNUM); - if (sDiagonalArrowsInfo[i].unk5) - matrixNum += 16; - - SpriteSetMatrixNum_UseLocalVar(&sprite, matrixNum); + SpriteSetMatrixNumFlips(&sprite, flips); SpriteSetSize(&sprite, 0); SpriteSetTileNum(&sprite, 0x213); @@ -705,7 +706,7 @@ static void TryCreateModeArrows(Entity *leader) y2 = (sArrowsFrames / 2) & 7; y = (y2 * sRotateArrowsInfo[direction].y) + yMul + 82; for (i = 0; i < to; i++) { - u32 matrixNum; + u32 flips; SpriteSetAffine1(&sprite, 0); SpriteSetAffine2(&sprite, 0); @@ -714,12 +715,13 @@ static void TryCreateModeArrows(Entity *leader) SpriteSetBpp(&sprite, 0); SpriteSetShape(&sprite, 0); - matrixNum = (sRotateArrowsInfo[direction].unk8 != 0) ? 8 : 0; + flips = 0; + if (sRotateArrowsInfo[direction].hFlip) + flips += (1 << SPRITEOAM_SHIFT_H_FLIP_MATRIXNUM); + if (sRotateArrowsInfo[direction].vFlip) + flips += (1 << SPRITEOAM_SHIFT_V_FLIP_MATRIXNUM); - if (sRotateArrowsInfo[direction].unk9) - matrixNum += 16; - - SpriteSetMatrixNum_UseLocalVar(&sprite, matrixNum); + SpriteSetMatrixNumFlips(&sprite, flips); SpriteSetSize(&sprite, 0); SpriteSetTileNum(&sprite, sRotateArrowsInfo[direction].tilemapNum); diff --git a/src/dungeon_menu_recruitment.c b/src/dungeon_menu_recruitment.c index 5cc0f8efa..d172529ac 100644 --- a/src/dungeon_menu_recruitment.c +++ b/src/dungeon_menu_recruitment.c @@ -270,7 +270,7 @@ static void CreateScrollingArrow(bool8 upArrow, s32 y) SpriteSetObjMode(&sScrollingArrowOAM, 0); SpriteSetMosaic(&sScrollingArrowOAM, 0); SpriteSetBpp(&sScrollingArrowOAM, 0); - SpriteSetMatrixNum(&sScrollingArrowOAM, (upArrow != FALSE) ? (16) : 0); + SpriteSetVFlip(&sScrollingArrowOAM, (upArrow != FALSE)); SpriteSetPalNum(&sScrollingArrowOAM, 15); SpriteSetY(&sScrollingArrowOAM, (window->y * 8) + y); SpriteSetX(&sScrollingArrowOAM, (window->x * 8) + 64); diff --git a/src/dungeon_menu_team.c b/src/dungeon_menu_team.c index 70d3949de..6d6bceb5a 100644 --- a/src/dungeon_menu_team.c +++ b/src/dungeon_menu_team.c @@ -129,7 +129,7 @@ extern const u8 *const gWhichTextPtr2; EWRAM_DATA s32 gTeamMenuChosenId = 0; static UNUSED EWRAM_DATA u8 sUnused[4] = {0}; -EWRAM_DATA static SpriteOAM gUnknown_202F268 = {0}; +EWRAM_DATA static SpriteOAM sOAMStatusDescriptionArrow = {0}; EWRAM_DATA static WindowHeader sTeamWindowHeader = {0}; struct UnkFieldTeamMenuStruct @@ -1177,7 +1177,7 @@ static void ShowUpArrowSprite(void) SpriteSetMosaic(&sprite, 0); SpriteSetBpp(&sprite, 0); SpriteSetShape(&sprite, 1); - SpriteSetMatrixNum(&sprite, 16); + SpriteSetVFlip(&sprite, 1); SpriteSetSize(&sprite, 0); SpriteSetTileNum(&sprite, 0x3F0); SpriteSetPriority(&sprite, 0); @@ -1202,7 +1202,7 @@ static void ShowDownArrowSprite(void) SpriteSetMosaic(&sprite, 0); SpriteSetBpp(&sprite, 0); SpriteSetShape(&sprite, 1); - SpriteSetMatrixNum(&sprite, 0); + SpriteSetVFlip(&sprite, 0); SpriteSetSize(&sprite, 0); SpriteSetTileNum(&sprite, 0x3F0); SpriteSetPriority(&sprite, 0); @@ -1218,20 +1218,20 @@ void ShowStatusDescriptionMenuArrow(void) if ((gDungeonFramesCounter & 8) != 0) { Window *window = &gWindows[0]; - SpriteSetAffine1(&gUnknown_202F268, 0); - SpriteSetAffine2(&gUnknown_202F268, 0); - SpriteSetObjMode(&gUnknown_202F268, 0); - SpriteSetMosaic(&gUnknown_202F268, 0); - SpriteSetBpp(&gUnknown_202F268, 0); - SpriteSetShape(&gUnknown_202F268, 1); - SpriteSetMatrixNum(&gUnknown_202F268, 0); - SpriteSetSize(&gUnknown_202F268, 0); - SpriteSetTileNum(&gUnknown_202F268, 0x3F0); - SpriteSetPriority(&gUnknown_202F268, 0); - SpriteSetPalNum(&gUnknown_202F268, 15); - SpriteSetY(&gUnknown_202F268, (window->y * 8) + 0x60); - SpriteSetX(&gUnknown_202F268, 0x70); - AddSprite(&gUnknown_202F268,0x100,NULL,NULL); + SpriteSetAffine1(&sOAMStatusDescriptionArrow, 0); + SpriteSetAffine2(&sOAMStatusDescriptionArrow, 0); + SpriteSetObjMode(&sOAMStatusDescriptionArrow, 0); + SpriteSetMosaic(&sOAMStatusDescriptionArrow, 0); + SpriteSetBpp(&sOAMStatusDescriptionArrow, 0); + SpriteSetShape(&sOAMStatusDescriptionArrow, 1); + SpriteSetVFlip(&sOAMStatusDescriptionArrow, 0); + SpriteSetSize(&sOAMStatusDescriptionArrow, 0); + SpriteSetTileNum(&sOAMStatusDescriptionArrow, 0x3F0); + SpriteSetPriority(&sOAMStatusDescriptionArrow, 0); + SpriteSetPalNum(&sOAMStatusDescriptionArrow, 15); + SpriteSetY(&sOAMStatusDescriptionArrow, (window->y * 8) + 0x60); + SpriteSetX(&sOAMStatusDescriptionArrow, 0x70); + AddSprite(&sOAMStatusDescriptionArrow,0x100,NULL,NULL); } } diff --git a/src/naming_screen.c b/src/naming_screen.c index a7a32e5c5..c61b00c99 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -384,13 +384,13 @@ u32 NamingScreen_Init(u32 type, u8 *defaultText) SpriteSetY((SpriteOAM *) &sNamingScreen->spriteLetterCursor, DISPLAY_WIDTH); if (sNamingScreen->isPassword) { - SpriteSetMatrixNum((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 0); + SpriteSetVFlip((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 0); SpriteSetTileNum((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 0x3F6); SpriteSetSize((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 0); SpriteSetShape((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 1); } else { - SpriteSetMatrixNum((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 16); + SpriteSetVFlip((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 1); SpriteSetTileNum((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 0x3F0); SpriteSetSize((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 0); SpriteSetShape((SpriteOAM *) &sNamingScreen->spriteLetterCursor, 1); diff --git a/src/sprite.c b/src/sprite.c index 48a9d876d..2122c591b 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -201,7 +201,7 @@ void AddAxSprite(ax_pose *a0, axdata1 *a1, UnkSpriteMem *a2, unkStruct_2039DB0 * spPtr->unk0 = a0->sprite; spPtr->unk2 = a0->unk2; - spPtr->oam.attrib1 = a0->flags1 & ~(0x100 | 0x200); + spPtr->oam.attrib1 = a0->flags1 & ~((1 << SPRITEOAM_SHIFT_AFFINEMODE1) | (1 << SPRITEOAM_SHIFT_AFFINEMODE2)); spPtr->oam.attrib2 = a0->flags2 & ~(0x200 | 0x400 | 0x800); spPtr->oam.attrib3 = a0->flags3; spPtr->oam.unk6 = ((a0->flags2 & (0x200 | 0x400 | 0x800)) >> 9) | ((a0->flags1 & (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20 | 0x40 | 0x80 | 0x100 | 0x200)) << 4);