diff --git a/include/structs/sprite_oam.h b/include/structs/sprite_oam.h index 781128ca8..b1e1c6e98 100644 --- a/include/structs/sprite_oam.h +++ b/include/structs/sprite_oam.h @@ -108,10 +108,220 @@ typedef struct SpriteOAM #define SPRITEOAM_MASK_UNK6_3 (SPRITEOAM_MAX_UNK6_3 << SPRITEOAM_SHIFT_UNK6_3) // ~ 0xFFF7 */ -// Seems to be the "working" Y coord. Gets copied to attrib1's Y coord in `AddSprite()`. -// kermalis is too lazy to rename it atm since we're still figuring things out -#define SPRITEOAM_MAX_UNK6_4 0xFFF -#define SPRITEOAM_SHIFT_UNK6_4 4 -#define SPRITEOAM_MASK_UNK6_4 (SPRITEOAM_MAX_UNK6_4 << SPRITEOAM_SHIFT_UNK6_4) // ~ 0xF +// It's the "working" Y coord. Gets copied to attrib1's Y coord in `AddSprite()`. +#define SPRITEOAM_MAX_WORKING_Y 0xFFF +#define SPRITEOAM_SHIFT_WORKING_Y 4 +#define SPRITEOAM_MASK_WORKING_Y (SPRITEOAM_MAX_WORKING_Y << SPRITEOAM_SHIFT_WORKING_Y) // ~ 0xF + +// These seem to work most(all?) of the time. +// These have to be macros, because static inlines WON'T match. + +#define SpriteSetOamY(spritePtr, _oamY) \ +{ \ + u32 _oamYSpriteVal = _oamY; \ + _oamYSpriteVal &= SPRITEOAM_MAX_Y; \ + _oamYSpriteVal <<= SPRITEOAM_SHIFT_Y; \ + (spritePtr)->attrib1 &= ~SPRITEOAM_MASK_Y; \ + (spritePtr)->attrib1 |= _oamYSpriteVal; \ +} + +#define SpriteSetAffine1(spritePtr, _affine1) \ +{ \ + u32 _affine1Val = _affine1; \ + _affine1Val &= SPRITEOAM_MAX_AFFINEMODE1; \ + _affine1Val <<= SPRITEOAM_SHIFT_AFFINEMODE1; \ + (spritePtr)->attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; \ + (spritePtr)->attrib1 |= _affine1Val; \ +} + +#define SpriteSetAffine2(spritePtr, _affine2) \ +{ \ + u32 _affine2Val = _affine2; \ + _affine2Val &= SPRITEOAM_MAX_AFFINEMODE2; \ + _affine2Val <<= SPRITEOAM_SHIFT_AFFINEMODE2; \ + (spritePtr)->attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; \ + (spritePtr)->attrib1 |= _affine2Val; \ +} + +#define SpriteSetObjMode(spritePtr, _objMode) \ +{ \ + u32 _objModeVal = _objMode; \ + _objModeVal &= SPRITEOAM_MAX_OBJMODE; \ + _objModeVal <<= SPRITEOAM_SHIFT_OBJMODE; \ + (spritePtr)->attrib1 &= ~SPRITEOAM_MASK_OBJMODE; \ + (spritePtr)->attrib1 |= _objModeVal; \ +} + +#define SpriteSetMosaic(spritePtr, _mosaic) \ +{ \ + u32 _mosaicVal = _mosaic; \ + _mosaicVal &= SPRITEOAM_MAX_MOSAIC; \ + _mosaicVal <<= SPRITEOAM_SHIFT_MOSAIC; \ + (spritePtr)->attrib1 &= ~SPRITEOAM_MASK_MOSAIC; \ + (spritePtr)->attrib1 |= _mosaicVal; \ +} + +#define SpriteSetBpp(spritePtr, _bpp) \ +{ \ + u32 _bppVal = _bpp; \ + _bppVal &= SPRITEOAM_MAX_BPP; \ + _bppVal <<= SPRITEOAM_SHIFT_BPP; \ + (spritePtr)->attrib1 &= ~SPRITEOAM_MASK_BPP; \ + (spritePtr)->attrib1 |= _bppVal; \ +} + +#define SpriteSetShape(spritePtr, _shape) \ +{ \ + u32 _shapeVal = _shape; \ + _shapeVal &= SPRITEOAM_MAX_SHAPE; \ + _shapeVal <<= SPRITEOAM_SHIFT_SHAPE; \ + (spritePtr)->attrib1 &= ~SPRITEOAM_MASK_SHAPE; \ + (spritePtr)->attrib1 |= _shapeVal; \ +} + +#define SpriteGetTileNum_LocalVar(spritePtr, _tileNum) \ +{ \ + _tileNum = (spritePtr)->attrib3; \ + _tileNum >>= SPRITEOAM_SHIFT_TILENUM; \ + _tileNum &= SPRITEOAM_MAX_TILENUM; \ +} + +#define SpriteSetTileNum(spritePtr, _tileNum) \ +{ \ + u32 _tileNumVal = _tileNum; \ + _tileNumVal &= SPRITEOAM_MAX_TILENUM; \ + _tileNumVal <<= SPRITEOAM_SHIFT_TILENUM; \ + (spritePtr)->attrib3 &= ~SPRITEOAM_MASK_TILENUM; \ + (spritePtr)->attrib3 |= _tileNumVal; \ +} + +#define SpriteAddTileNum(spritePtr, addVal) \ +{ \ + u32 _tileNumValAdd; \ + SpriteGetTileNum_LocalVar(spritePtr, _tileNumValAdd); \ + _tileNumValAdd += (addVal); \ + SpriteSetTileNum(spritePtr, _tileNumValAdd); \ +} + +#define SpriteSetPriority(spritePtr, _priority) \ +{ \ + u32 _priorityVal = _priority; \ + _priorityVal &= SPRITEOAM_MAX_PRIORITY; \ + _priorityVal <<= SPRITEOAM_SHIFT_PRIORITY; \ + (spritePtr)->attrib3 &= ~SPRITEOAM_MASK_PRIORITY; \ + (spritePtr)->attrib3 |= _priorityVal; \ +} + +#define SpriteSetPalNum(spritePtr, _palNum) \ +{ \ + u32 _palNumVal = _palNum; \ + _palNumVal &= SPRITEOAM_MAX_PALETTENUM; \ + _palNumVal <<= SPRITEOAM_SHIFT_PALETTENUM; \ + (spritePtr)->attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; \ + (spritePtr)->attrib3 |= _palNumVal; \ +} + +#define SpriteSetMatrixNum(spritePtr, _matrixNum) \ +{ \ + u32 _matrixNumVal = _matrixNum; \ + _matrixNumVal &= SPRITEOAM_MAX_MATRIXNUM; \ + _matrixNumVal <<= SPRITEOAM_SHIFT_MATRIXNUM; \ + (spritePtr)->attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; \ + (spritePtr)->attrib2 |= _matrixNumVal; \ +} + +// Needed for TryCreateModeArrows. No difference to SpriteSetMatrixNum other than not creating one additional local variable. +#define SpriteSetMatrixNum_UseLocalVar(spritePtr, _matrixNum) \ +{ \ + _matrixNum &= SPRITEOAM_MAX_MATRIXNUM; \ + _matrixNum <<= SPRITEOAM_SHIFT_MATRIXNUM; \ + (spritePtr)->attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; \ + (spritePtr)->attrib2 |= _matrixNum; \ +} + +#define SpriteSetSize(spritePtr, _size) \ +{ \ + u32 _sizeVal = _size; \ + _sizeVal &= SPRITEOAM_MAX_SIZE; \ + _sizeVal <<= SPRITEOAM_SHIFT_SIZE; \ + (spritePtr)->attrib2 &= ~SPRITEOAM_MASK_SIZE; \ + (spritePtr)->attrib2 |= _sizeVal; \ +} + +#define SpriteGetX(spritePtr)(((spritePtr)->attrib2 >> SPRITEOAM_SHIFT_X) & SPRITEOAM_MAX_X) + +#define SpriteSetX(spritePtr, _x) \ +{ \ + u32 _xSpriteVal = _x; \ + _xSpriteVal &= SPRITEOAM_MAX_X; \ + _xSpriteVal <<= SPRITEOAM_SHIFT_X; \ + (spritePtr)->attrib2 &= ~SPRITEOAM_MASK_X; \ + (spritePtr)->attrib2 |= _xSpriteVal; \ +} + +// Hacky way of matching functions in menu_input.c AddMenuCursorSprite_, sub_801332C sub_8013470 +#define SpriteSetX_MatrixNumSize0(spritePtr, _x) \ +{ \ + u32 _xSpriteVal = _x; \ + _xSpriteVal &= SPRITEOAM_MAX_X; \ + _xSpriteVal <<= SPRITEOAM_SHIFT_X; \ + (spritePtr)->attrib2 &= ~SPRITEOAM_MASK_X; \ + (spritePtr)->attrib2 = _xSpriteVal; \ +} + +#define SpriteGetY(spritePtr)(((spritePtr)->unk6 >> SPRITEOAM_SHIFT_WORKING_Y) & SPRITEOAM_MAX_WORKING_Y) + +#define SpriteGetY_LocalVar(spritePtr, _y) \ +{ \ + _y = (spritePtr)->unk6; \ + _y >>= SPRITEOAM_SHIFT_WORKING_Y; \ + _y &= SPRITEOAM_MAX_WORKING_Y; \ +} + +#define SpriteSetY(spritePtr, _y) \ +{ \ + u32 _ySpriteVal = _y; \ + _ySpriteVal &= SPRITEOAM_MAX_WORKING_Y; \ + _ySpriteVal <<= SPRITEOAM_SHIFT_WORKING_Y; \ + (spritePtr)->unk6 &= ~SPRITEOAM_MASK_WORKING_Y; \ + (spritePtr)->unk6 |= _ySpriteVal; \ +} + +#define SpriteAddY(spritePtr, addVal) \ +{ \ + u32 _yVal; \ + SpriteGetY_LocalVar(spritePtr, _yVal); \ + _yVal += (addVal); \ + SpriteSetY(spritePtr, _yVal); \ +} + +#define SpriteSetUnk6_0(spritePtr, _unk6_0) \ +{ \ + u32 _unk6_0Val = _unk6_0; \ + _unk6_0Val &= SPRITEOAM_MAX_UNK6_0; \ + _unk6_0Val <<= SPRITEOAM_SHIFT_UNK6_0; \ + (spritePtr)->unk6 &= ~SPRITEOAM_MASK_UNK6_0; \ + (spritePtr)->unk6 |= _unk6_0Val; \ +} + +#define SpriteGetUnk6_1(spritePtr)(((spritePtr)->unk6 >> SPRITEOAM_SHIFT_UNK6_1) & SPRITEOAM_MAX_UNK6_1) + +#define SpriteSetUnk6_1(spritePtr, _unk6_1) \ +{ \ + u32 _unk6_1Val = _unk6_1; \ + _unk6_1Val &= SPRITEOAM_MAX_UNK6_1; \ + _unk6_1Val <<= SPRITEOAM_SHIFT_UNK6_1; \ + (spritePtr)->unk6 &= ~SPRITEOAM_MASK_UNK6_1; \ + (spritePtr)->unk6 |= _unk6_1Val; \ +} + +#define SpriteSetUnk6_2(spritePtr, _unk6_2) \ +{ \ + u32 _unk6_2Val = _unk6_2; \ + _unk6_2Val &= SPRITEOAM_MAX_UNK6_2; \ + _unk6_2Val <<= SPRITEOAM_SHIFT_UNK6_2; \ + (spritePtr)->unk6 &= ~SPRITEOAM_MASK_UNK6_2; \ + (spritePtr)->unk6 |= _unk6_2Val; \ +} #endif // GUARD_SPRITE_OAM_H diff --git a/src/code_803E724.c b/src/code_803E724.c index 8d6293c1c..fd7ce16ef 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -367,52 +367,23 @@ void sub_803EDF0(void) // sprite oam memes strike again if (x >= -32 && y >= -8 && x < 240 && y < 160) { - u32 r9; - u32 unk6; - u32 shape, spriteX, palNum, prio, tileNum; + SpriteSetY(&gUnknown_202EDDC, y); + SpriteSetAffine1(&gUnknown_202EDDC, 0); + SpriteSetAffine2(&gUnknown_202EDDC, 0); + SpriteSetObjMode(&gUnknown_202EDDC, 0); + SpriteSetMosaic(&gUnknown_202EDDC, 0); + SpriteSetBpp(&gUnknown_202EDDC, 0); + SpriteSetShape(&gUnknown_202EDDC, 1); + SpriteSetX(&gUnknown_202EDDC, x); + SpriteSetMatrixNum(&gUnknown_202EDDC, 0); + SpriteSetSize(&gUnknown_202EDDC, 1); + SpriteSetTileNum(&gUnknown_202EDDC, 0x216); + SpriteSetPriority(&gUnknown_202EDDC, gDungeon->unk181e8.unk18208); + SpriteSetPalNum(&gUnknown_202EDDC, gUnknown_202EDE8.unk2); - unk6 = y & SPRITEOAM_MAX_UNK6_4; - unk6 <<= SPRITEOAM_SHIFT_UNK6_4; - gUnknown_202EDDC.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - gUnknown_202EDDC.unk6 |= unk6; - - gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; - r9 = 3; - gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_BPP; - - shape = 1 << SPRITEOAM_SHIFT_SHAPE; - gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_SHAPE; - gUnknown_202EDDC.attrib1 |= shape; - - spriteX = x & SPRITEOAM_MAX_X; - gUnknown_202EDDC.attrib2 &= ~SPRITEOAM_MASK_X; - gUnknown_202EDDC.attrib2 |= spriteX; - - gUnknown_202EDDC.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - gUnknown_202EDDC.attrib2 &= ~SPRITEOAM_MASK_SIZE; - gUnknown_202EDDC.attrib2 |= 1 << SPRITEOAM_SHIFT_SIZE; - - tileNum = 0x216 << SPRITEOAM_SHIFT_TILENUM; - gUnknown_202EDDC.attrib3 &= ~SPRITEOAM_MASK_TILENUM; - gUnknown_202EDDC.attrib3 |= tileNum; - - prio = gDungeon->unk181e8.unk18208 & r9; - prio <<= SPRITEOAM_SHIFT_PRIORITY; - gUnknown_202EDDC.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - gUnknown_202EDDC.attrib3 |= prio; - - palNum = gUnknown_202EDE8.unk2; - palNum &= 0xF; - palNum <<= SPRITEOAM_SHIFT_PALETTENUM; - gUnknown_202EDDC.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - gUnknown_202EDDC.attrib3 |= palNum; - - gUnknown_202EDDC.unk6 &= ~SPRITEOAM_MASK_UNK6_0; - gUnknown_202EDDC.unk6 &= ~SPRITEOAM_MASK_UNK6_1; - gUnknown_202EDDC.unk6 &= ~SPRITEOAM_MASK_UNK6_2; + SpriteSetUnk6_0(&gUnknown_202EDDC, 0); + SpriteSetUnk6_1(&gUnknown_202EDDC, 0); + SpriteSetUnk6_2(&gUnknown_202EDDC, 0); AddSprite(&gUnknown_202EDDC, 0x100, NULL, NULL); } diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index d32adff7e..1fd19e071 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -624,8 +624,6 @@ struct UnkStruct_8106AE8 extern const struct UnkStruct_8106AE8 gUnknown_8106AE8[]; -#ifdef NONMATCHING -// Sprite OAM memes. https://decomp.me/scratch/Jm4oC // Creates arrow sprites which are used when in rotate or diagonal modes. static void TryCreateModeArrows(Entity *leader) { @@ -636,145 +634,90 @@ static void TryCreateModeArrows(Entity *leader) SpriteOAM sprite; for (i = 0; i < 4; i++) { - u32 objMode, matrixNum, tileNum, prio, xSprite, unk6; + u32 matrixNum; s32 x, xMul, x2; - s32 unk1, unk1Mul, unk2; + s32 y, yMul, y2; - sprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - sprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; + SpriteSetAffine1(&sprite, 0); + SpriteSetAffine2(&sprite, 0); + SpriteSetObjMode(&sprite, 1); + SpriteSetMosaic(&sprite, 0); + SpriteSetBpp(&sprite, 0); + SpriteSetShape(&sprite, 0); - objMode = 1 << SPRITEOAM_SHIFT_OBJMODE; - sprite.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - sprite.attrib1 |= objMode; - - sprite.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - sprite.attrib1 &= ~SPRITEOAM_MASK_BPP; - - sprite.attrib1 &= ~SPRITEOAM_MASK_SHAPE; - - if (gUnknown_8106AC8[i].unk4 != 0) - matrixNum = 8; - else - matrixNum = 0; + matrixNum = (gUnknown_8106AC8[i].unk4 != 0) ? 8 : 0; if (gUnknown_8106AC8[i].unk5) matrixNum += 16; - matrixNum &= SPRITEOAM_MAX_MATRIXNUM; - matrixNum <<= SPRITEOAM_SHIFT_MATRIXNUM; - sprite.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - sprite.attrib2 |= matrixNum; + SpriteSetMatrixNum_UseLocalVar(&sprite, matrixNum); + SpriteSetSize(&sprite, 0); - sprite.attrib2 &= ~SPRITEOAM_MASK_SHAPE; + SpriteSetTileNum(&sprite, 0x213); + SpriteSetPriority(&sprite, 2); + SpriteSetPalNum(&sprite, 0); - tileNum = 0x213 << SPRITEOAM_SHIFT_TILENUM; - sprite.attrib3 &= ~SPRITEOAM_MASK_TILENUM; - sprite.attrib3 |= tileNum; + SpriteSetUnk6_0(&sprite, 0); + SpriteSetUnk6_1(&sprite, 0); - prio = 2 << SPRITEOAM_SHIFT_PRIORITY; - sprite.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - sprite.attrib3 |= prio; - - sprite.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - - sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_0; - sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_1; - - x = gUnknown_8106AC8[i].unk0; - xMul = x * 10; + xMul = gUnknown_8106AC8[i].unk0 * 10; x2 = (sArrowsFrames / 2) & 7; - xSprite = xMul + 116 + (x2 * x); - xSprite &= SPRITEOAM_MAX_X; - xSprite <<= SPRITEOAM_SHIFT_X; - sprite.attrib2 &= ~SPRITEOAM_MASK_X; - sprite.attrib2 |= xSprite; + x = (x2 * gUnknown_8106AC8[i].unk0) + xMul + 116; + SpriteSetX(&sprite, x); - unk1 = gUnknown_8106AC8[i].unk2; - unk1Mul = unk1 * 10; - unk2 = (sArrowsFrames / 2) & 7; - unk6 = 82 + unk1Mul + (unk2 * unk1); - unk6 &= SPRITEOAM_MAX_UNK6_4; - unk6 <<= SPRITEOAM_SHIFT_UNK6_4; - sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - sprite.unk6 |= unk6; + yMul = gUnknown_8106AC8[i].unk2 * 10; + y2 = (sArrowsFrames / 2) & 7; + y = (y2 * gUnknown_8106AC8[i].unk2) + yMul + 82; + SpriteSetY(&sprite, y); AddSprite(&sprite, 0x100, NULL, NULL); } } + else if (unkPtr->unk1821A) { - s32 i, to; + s32 i; SpriteOAM sprite; s32 var_2C = unkPtr->unk1821B; - s32 x, y; - s32 x1, x2, xMul; - s32 y1, y2, yMul; - if (var_2C < 8u) { - to = (sShowThreeArrows2 != 0 && sShowThreeArrows1 != 0) ? 3 : 1; + if (unkPtr->unk1821B < 8) { + s32 x, xMul, x2; + s32 y, yMul, y2; + s32 to = (sShowThreeArrows2 != FALSE && sShowThreeArrows1 != FALSE) ? 3 : 1; - x1 = gUnknown_8106AE8[var_2C].unk0; - xMul = x1 * 10; + xMul = gUnknown_8106AE8[var_2C].unk0 * 10; x2 = (sArrowsFrames / 2) & 7; - x = xMul + 116 + (x1 * x2); + x = (gUnknown_8106AE8[var_2C].unk0 * x2) + xMul + 116; - y1 = gUnknown_8106AE8[var_2C].unk2; - yMul = y1 * 10; + yMul = gUnknown_8106AE8[var_2C].unk2 * 10; y2 = (sArrowsFrames / 2) & 7; - y = 82 + yMul + (y2 * y1); + y = (y2 * gUnknown_8106AE8[var_2C].unk2) + yMul + 82; for (i = 0; i < to; i++) { - u32 objMode, tileNum, prio, matrixNum, xSprite, ySprite; + u32 matrixNum; - sprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - sprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; + SpriteSetAffine1(&sprite, 0); + SpriteSetAffine2(&sprite, 0); + SpriteSetObjMode(&sprite, 1); + SpriteSetMosaic(&sprite, 0); + SpriteSetBpp(&sprite, 0); + SpriteSetShape(&sprite, 0); - objMode = 1 << SPRITEOAM_SHIFT_OBJMODE; - sprite.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - sprite.attrib1 |= objMode; - - sprite.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - sprite.attrib1 &= ~SPRITEOAM_MASK_BPP; - - sprite.attrib1 &= ~SPRITEOAM_MASK_SHAPE; - - if (gUnknown_8106AE8[var_2C].unk8 != 0) - matrixNum = 8; - else - matrixNum = 0; + matrixNum = (gUnknown_8106AE8[var_2C].unk8 != 0) ? 8 : 0; if (gUnknown_8106AE8[var_2C].unk9) matrixNum += 16; - matrixNum &= SPRITEOAM_MAX_MATRIXNUM; - matrixNum <<= SPRITEOAM_SHIFT_MATRIXNUM; - sprite.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - sprite.attrib2 |= matrixNum; + SpriteSetMatrixNum_UseLocalVar(&sprite, matrixNum); + SpriteSetSize(&sprite, 0); - sprite.attrib2 &= ~SPRITEOAM_MASK_SIZE; + SpriteSetTileNum(&sprite, gUnknown_8106AE8[var_2C].unk4); + SpriteSetPriority(&sprite, 2); + SpriteSetPalNum(&sprite, 0); - tileNum = gUnknown_8106AE8[var_2C].unk4; - sprite.attrib3 &= ~SPRITEOAM_MASK_TILENUM; - sprite.attrib3 |= tileNum; + SpriteSetUnk6_0(&sprite, 0); + SpriteSetUnk6_1(&sprite, 0); - prio = 2 << SPRITEOAM_SHIFT_PRIORITY; - sprite.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - sprite.attrib3 |= prio; - - sprite.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - - sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_0; - sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_1; - - xSprite = x; - xSprite &= SPRITEOAM_MAX_X; - xSprite <<= SPRITEOAM_SHIFT_X; - sprite.attrib2 &= ~SPRITEOAM_MASK_X; - sprite.attrib2 |= xSprite; - - ySprite = y; - ySprite &= SPRITEOAM_MAX_UNK6_4; - ySprite <<= SPRITEOAM_SHIFT_UNK6_4; - sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - sprite.unk6 |= ySprite; + SpriteSetX(&sprite, x); + SpriteSetY(&sprite, y); AddSprite(&sprite, 0x100, NULL, NULL); x += gUnknown_8106AE8[var_2C].unk0 * 4; @@ -789,558 +732,6 @@ static void TryCreateModeArrows(Entity *leader) } } -#else -NAKED static void TryCreateModeArrows(Entity *leader) -{ - asm_unified( "\n" -" push {r4-r7,lr}\n" -" mov r7, r10\n" -" mov r6, r9\n" -" mov r5, r8\n" -" push {r5-r7}\n" -" sub sp, 0x28\n" -" str r0, [sp, 0x10]\n" -" ldr r0, _0805E47C\n" -" ldr r1, [r0]\n" -" ldr r0, _0805E480\n" -" adds r0, r1, r0\n" -" str r0, [sp, 0x14]\n" -" ldr r0, _0805E484\n" -" ldrb r0, [r0]\n" -" cmp r0, 0\n" -" bne _0805E2E6\n" -" b _0805E4C4\n" -"_0805E2E6:\n" -" movs r1, 0\n" -" str r1, [sp, 0x18]\n" -" mov r7, sp\n" -" ldr r2, _0805E488\n" -" mov r10, r2\n" -"_0805E2F0:\n" -" ldrh r0, [r7]\n" -" ldr r3, _0805E48C\n" -" adds r1, r3, 0\n" -" ands r1, r0\n" -" ldr r0, [sp]\n" -" mov r4, r10\n" -" ands r0, r4\n" -" orrs r0, r1\n" -" str r0, [sp]\n" -" ldrh r1, [r7]\n" -" mov r2, r10\n" -" ands r2, r0\n" -" orrs r2, r1\n" -" str r2, [sp]\n" -" ldrh r0, [r7]\n" -" ldr r5, _0805E490\n" -" adds r1, r5, 0\n" -" ands r1, r0\n" -" mov r0, r10\n" -" ands r0, r2\n" -" orrs r0, r1\n" -" str r0, [sp]\n" -" ldrh r2, [r7]\n" -" mov r1, r10\n" -" ands r1, r0\n" -" orrs r1, r2\n" -" str r1, [sp]\n" -" ldrh r2, [r7]\n" -" ldr r0, _0805E494\n" -" ands r0, r2\n" -" mov r3, r10\n" -" ands r3, r1\n" -" orrs r3, r0\n" -" str r3, [sp]\n" -" ldrh r1, [r7]\n" -" movs r0, 0x80\n" -" lsls r0, 3\n" -" orrs r0, r1\n" -" movs r6, 0\n" -" orrs r0, r6\n" -" mov r2, r10\n" -" ands r2, r3\n" -" orrs r2, r0\n" -" str r2, [sp]\n" -" ldrh r0, [r7]\n" -" ldr r3, _0805E498\n" -" adds r1, r3, 0\n" -" ands r1, r0\n" -" mov r0, r10\n" -" ands r0, r2\n" -" orrs r0, r1\n" -" str r0, [sp]\n" -" ldrh r1, [r7]\n" -" mov r2, r10\n" -" ands r2, r0\n" -" orrs r2, r1\n" -" str r2, [sp]\n" -" ldrh r0, [r7]\n" -" ldr r4, _0805E49C\n" -" adds r1, r4, 0\n" -" ands r1, r0\n" -" mov r0, r10\n" -" ands r0, r2\n" -" orrs r0, r1\n" -" str r0, [sp]\n" -" ldrh r1, [r7]\n" -" mov r2, r10\n" -" ands r2, r0\n" -" orrs r2, r1\n" -" str r2, [sp]\n" -" ldrh r1, [r7]\n" -" ldr r0, _0805E4A0\n" -" ands r0, r1\n" -" mov r1, r10\n" -" ands r1, r2\n" -" orrs r1, r0\n" -" str r1, [sp]\n" -" ldrh r2, [r7]\n" -" mov r0, r10\n" -" ands r0, r1\n" -" orrs r0, r2\n" -" str r0, [sp]\n" -" ldr r1, _0805E4A4\n" -" ldr r5, [sp, 0x18]\n" -" lsls r0, r5, 3\n" -" adds r0, r1\n" -" mov r12, r0\n" -" ldrb r1, [r0, 0x4]\n" -" negs r0, r1\n" -" orrs r0, r1\n" -" asrs r1, r0, 31\n" -" movs r0, 0x8\n" -" ands r1, r0\n" -" mov r6, r12\n" -" ldrb r0, [r6, 0x5]\n" -" cmp r0, 0\n" -" beq _0805E3B4\n" -" adds r1, 0x10\n" -"_0805E3B4:\n" -" movs r0, 0x1F\n" -" ands r1, r0\n" -" lsls r1, 9\n" -" ldrh r3, [r7, 0x2]\n" -" ldr r2, _0805E4A8\n" -" adds r0, r2, 0\n" -" ands r3, r0\n" -" orrs r3, r1\n" -" ldr r4, _0805E4A0\n" -" ands r3, r4\n" -" strh r3, [r7, 0x2]\n" -" ldr r2, _0805E4AC\n" -" ldrh r0, [r7, 0x4]\n" -" movs r5, 0xFC\n" -" lsls r5, 8\n" -" adds r1, r5, 0\n" -" ands r0, r1\n" -" orrs r0, r2\n" -" movs r6, 0\n" -" orrs r0, r6\n" -" movs r1, 0x80\n" -" lsls r1, 4\n" -" ldr r2, _0805E494\n" -" ands r0, r2\n" -" orrs r0, r1\n" -" orrs r0, r6\n" -" ldr r4, _0805E4B0\n" -" mov r9, r4\n" -" ands r0, r4\n" -" strh r0, [r7, 0x4]\n" -" ldrh r4, [r7, 0x6]\n" -" ldr r5, _0805E4B4\n" -" adds r0, r5, 0\n" -" ands r4, r0\n" -" ldr r6, _0805E4B8\n" -" adds r0, r6, 0\n" -" ands r4, r0\n" -" strh r4, [r7, 0x6]\n" -" mov r0, r12\n" -" movs r1, 0\n" -" ldrsh r5, [r0, r1]\n" -" lsls r2, r5, 2\n" -" adds r2, r5\n" -" lsls r2, 1\n" -" ldr r6, _0805E4BC\n" -" mov r8, r6\n" -" movs r1, 0\n" -" ldrsh r0, [r6, r1]\n" -" lsrs r1, r0, 31\n" -" adds r0, r1\n" -" asrs r0, 1\n" -" movs r6, 0x7\n" -" ands r0, r6\n" -" muls r0, r5\n" -" adds r0, r2\n" -" adds r0, 0x74\n" -" ldr r1, _0805E4C0\n" -" ands r0, r1\n" -" movs r2, 0xFE\n" -" lsls r2, 8\n" -" adds r1, r2, 0\n" -" ands r3, r1\n" -" orrs r3, r0\n" -" strh r3, [r7, 0x2]\n" -" mov r5, r12\n" -" movs r0, 0x2\n" -" ldrsh r3, [r5, r0]\n" -" lsls r2, r3, 2\n" -" adds r2, r3\n" -" lsls r2, 1\n" -" mov r1, r8\n" -" movs r5, 0\n" -" ldrsh r0, [r1, r5]\n" -" lsrs r1, r0, 31\n" -" adds r0, r1\n" -" asrs r0, 1\n" -" ands r0, r6\n" -" muls r0, r3\n" -" adds r0, r2\n" -" adds r0, 0x52\n" -" mov r6, r9\n" -" ands r0, r6\n" -" lsls r0, 4\n" -" movs r1, 0xF\n" -" ands r4, r1\n" -" orrs r4, r0\n" -" strh r4, [r7, 0x6]\n" -" mov r0, sp\n" -" adds r1, 0xF1\n" -" movs r2, 0\n" -" movs r3, 0\n" -" bl AddSprite\n" -" ldr r2, [sp, 0x18]\n" -" adds r2, 0x1\n" -" str r2, [sp, 0x18]\n" -" cmp r2, 0x3\n" -" bgt _0805E47A\n" -" b _0805E2F0\n" -"_0805E47A:\n" -" b _0805E6AC\n" -" .align 2, 0\n" -"_0805E47C: .4byte gDungeon\n" -"_0805E480: .4byte 0x000181e8\n" -"_0805E484: .4byte sInDiagonalMode\n" -"_0805E488: .4byte 0xffff0000\n" -"_0805E48C: .4byte 0x0000feff\n" -"_0805E490: .4byte 0x0000fdff\n" -"_0805E494: .4byte 0x0000f3ff\n" -"_0805E498: .4byte 0x0000efff\n" -"_0805E49C: .4byte 0x0000dfff\n" -"_0805E4A0: .4byte 0x00003fff\n" -"_0805E4A4: .4byte gUnknown_8106AC8\n" -"_0805E4A8: .4byte 0x0000c1ff\n" -"_0805E4AC: .4byte 0x00000213\n" -"_0805E4B0: .4byte 0x00000fff\n" -"_0805E4B4: .4byte 0x0000fffe\n" -"_0805E4B8: .4byte 0x0000fffd\n" -"_0805E4BC: .4byte sArrowsFrames\n" -"_0805E4C0: .4byte 0x000001ff\n" -"_0805E4C4:\n" -" ldr r3, _0805E6E4\n" -" adds r0, r1, r3\n" -" ldrb r0, [r0]\n" -" cmp r0, 0\n" -" bne _0805E4D0\n" -" b _0805E6AC\n" -"_0805E4D0:\n" -" ldr r4, _0805E6E8\n" -" adds r0, r1, r4\n" -" ldrb r0, [r0]\n" -" str r0, [sp, 0x1C]\n" -" cmp r0, 0x7\n" -" bls _0805E4DE\n" -" b _0805E6AC\n" -"_0805E4DE:\n" -" ldr r0, _0805E6EC\n" -" ldrb r0, [r0]\n" -" movs r7, 0x1\n" -" cmp r0, 0\n" -" beq _0805E4F2\n" -" ldr r0, _0805E6F0\n" -" ldrb r0, [r0]\n" -" cmp r0, 0\n" -" beq _0805E4F2\n" -" movs r7, 0x3\n" -"_0805E4F2:\n" -" ldr r5, _0805E6F4\n" -" mov r12, r5\n" -" ldr r6, [sp, 0x1C]\n" -" lsls r5, r6, 1\n" -" adds r3, r5, r6\n" -" lsls r3, 2\n" -" add r3, r12\n" -" movs r0, 0\n" -" ldrsh r4, [r3, r0]\n" -" lsls r1, r4, 2\n" -" adds r1, r4\n" -" lsls r1, 1\n" -" ldr r0, _0805E6F8\n" -" movs r6, 0\n" -" ldrsh r2, [r0, r6]\n" -" lsrs r0, r2, 31\n" -" adds r2, r0\n" -" asrs r2, 1\n" -" movs r0, 0x7\n" -" ands r2, r0\n" -" adds r0, r4, 0\n" -" muls r0, r2\n" -" adds r0, r1\n" -" adds r0, 0x74\n" -" str r0, [sp, 0x20]\n" -" movs r1, 0x2\n" -" ldrsh r0, [r3, r1]\n" -" lsls r1, r0, 2\n" -" adds r1, r0\n" -" lsls r1, 1\n" -" muls r0, r2\n" -" adds r0, r1\n" -" adds r0, 0x52\n" -" mov r10, r0\n" -" str r5, [sp, 0x24]\n" -" cmp r7, 0\n" -" bne _0805E53E\n" -" b _0805E6AC\n" -"_0805E53E:\n" -" add r6, sp, 0x8\n" -" ldr r2, _0805E6FC\n" -" mov r8, r2\n" -" mov r9, r7\n" -"_0805E546:\n" -" ldrh r0, [r6]\n" -" ldr r3, _0805E700\n" -" adds r1, r3, 0\n" -" ands r1, r0\n" -" ldr r0, [sp, 0x8]\n" -" mov r4, r8\n" -" ands r0, r4\n" -" orrs r0, r1\n" -" str r0, [sp, 0x8]\n" -" ldrh r1, [r6]\n" -" mov r2, r8\n" -" ands r2, r0\n" -" orrs r2, r1\n" -" str r2, [sp, 0x8]\n" -" ldrh r0, [r6]\n" -" ldr r5, _0805E704\n" -" adds r1, r5, 0\n" -" ands r1, r0\n" -" mov r0, r8\n" -" ands r0, r2\n" -" orrs r0, r1\n" -" str r0, [sp, 0x8]\n" -" ldrh r2, [r6]\n" -" mov r1, r8\n" -" ands r1, r0\n" -" orrs r1, r2\n" -" str r1, [sp, 0x8]\n" -" ldrh r2, [r6]\n" -" ldr r0, _0805E708\n" -" ands r0, r2\n" -" mov r3, r8\n" -" ands r3, r1\n" -" orrs r3, r0\n" -" str r3, [sp, 0x8]\n" -" ldrh r1, [r6]\n" -" movs r0, 0x80\n" -" lsls r0, 3\n" -" orrs r0, r1\n" -" movs r1, 0\n" -" orrs r0, r1\n" -" mov r2, r8\n" -" ands r2, r3\n" -" orrs r2, r0\n" -" str r2, [sp, 0x8]\n" -" ldrh r0, [r6]\n" -" ldr r3, _0805E70C\n" -" adds r1, r3, 0\n" -" ands r1, r0\n" -" mov r0, r8\n" -" ands r0, r2\n" -" orrs r0, r1\n" -" str r0, [sp, 0x8]\n" -" ldrh r1, [r6]\n" -" mov r2, r8\n" -" ands r2, r0\n" -" orrs r2, r1\n" -" str r2, [sp, 0x8]\n" -" ldrh r0, [r6]\n" -" ldr r4, _0805E710\n" -" adds r1, r4, 0\n" -" ands r1, r0\n" -" mov r0, r8\n" -" ands r0, r2\n" -" orrs r0, r1\n" -" str r0, [sp, 0x8]\n" -" ldrh r1, [r6]\n" -" mov r2, r8\n" -" ands r2, r0\n" -" orrs r2, r1\n" -" str r2, [sp, 0x8]\n" -" ldrh r1, [r6]\n" -" ldr r0, _0805E714\n" -" ands r0, r1\n" -" mov r1, r8\n" -" ands r1, r2\n" -" orrs r1, r0\n" -" str r1, [sp, 0x8]\n" -" ldrh r2, [r6]\n" -" mov r0, r8\n" -" ands r0, r1\n" -" orrs r0, r2\n" -" str r0, [sp, 0x8]\n" -" ldr r5, [sp, 0x24]\n" -" ldr r1, [sp, 0x1C]\n" -" adds r0, r5, r1\n" -" lsls r2, r0, 2\n" -" ldr r3, _0805E6F4\n" -" adds r7, r2, r3\n" -" ldrb r1, [r7, 0x8]\n" -" negs r0, r1\n" -" orrs r0, r1\n" -" asrs r1, r0, 31\n" -" movs r0, 0x8\n" -" ands r1, r0\n" -" ldrb r0, [r7, 0x9]\n" -" cmp r0, 0\n" -" beq _0805E60A\n" -" adds r1, 0x10\n" -"_0805E60A:\n" -" movs r0, 0x1F\n" -" ands r1, r0\n" -" lsls r1, 9\n" -" ldrh r3, [r6, 0x2]\n" -" ldr r4, _0805E718\n" -" adds r0, r4, 0\n" -" ands r3, r0\n" -" orrs r3, r1\n" -" ldr r5, _0805E714\n" -" ands r3, r5\n" -" strh r3, [r6, 0x2]\n" -" ldr r1, _0805E71C\n" -" adds r0, r2, r1\n" -" ldr r2, [r0]\n" -" ldr r0, _0805E720\n" -" ands r2, r0\n" -" ldrh r0, [r6, 0x4]\n" -" movs r4, 0xFC\n" -" lsls r4, 8\n" -" adds r1, r4, 0\n" -" ands r0, r1\n" -" orrs r0, r2\n" -" movs r1, 0x80\n" -" lsls r1, 4\n" -" ldr r5, _0805E708\n" -" ands r0, r5\n" -" orrs r0, r1\n" -" movs r1, 0\n" -" orrs r0, r1\n" -" movs r2, 0xF\n" -" mov r12, r2\n" -" ldr r4, _0805E724\n" -" ands r0, r4\n" -" strh r0, [r6, 0x4]\n" -" ldrh r1, [r6, 0x6]\n" -" ldr r5, _0805E728\n" -" adds r0, r5, 0\n" -" ands r1, r0\n" -" ldr r2, _0805E72C\n" -" adds r0, r2, 0\n" -" ands r1, r0\n" -" ldr r0, _0805E730\n" -" ldr r5, [sp, 0x20]\n" -" ands r0, r5\n" -" movs r5, 0xFE\n" -" lsls r5, 8\n" -" adds r2, r5, 0\n" -" ands r3, r2\n" -" orrs r3, r0\n" -" strh r3, [r6, 0x2]\n" -" mov r0, r10\n" -" ands r0, r4\n" -" lsls r0, 4\n" -" mov r2, r12\n" -" ands r1, r2\n" -" orrs r1, r0\n" -" strh r1, [r6, 0x6]\n" -" adds r0, r6, 0\n" -" movs r1, 0x80\n" -" lsls r1, 1\n" -" movs r2, 0\n" -" movs r3, 0\n" -" bl AddSprite\n" -" movs r3, 0\n" -" ldrsh r0, [r7, r3]\n" -" lsls r0, 2\n" -" ldr r4, [sp, 0x20]\n" -" adds r4, r0\n" -" str r4, [sp, 0x20]\n" -" movs r5, 0x2\n" -" ldrsh r0, [r7, r5]\n" -" lsls r0, 2\n" -" add r10, r0\n" -" movs r0, 0x1\n" -" negs r0, r0\n" -" add r9, r0\n" -" mov r1, r9\n" -" cmp r1, 0\n" -" beq _0805E6AC\n" -" b _0805E546\n" -"_0805E6AC:\n" -" ldr r4, _0805E734\n" -" ldrb r0, [r4]\n" -" cmp r0, 0\n" -" beq _0805E6D4\n" -" ldr r2, [sp, 0x14]\n" -" adds r2, 0x34\n" -" ldr r3, [sp, 0x14]\n" -" adds r3, 0x33\n" -" ldrb r1, [r3]\n" -" ldrb r0, [r2]\n" -" cmp r0, r1\n" -" beq _0805E6D4\n" -" strb r1, [r2]\n" -" ldr r0, [sp, 0x10]\n" -" adds r0, 0x4\n" -" ldrb r1, [r3]\n" -" ldrb r3, [r4]\n" -" movs r2, 0\n" -" bl sub_804A728\n" -"_0805E6D4:\n" -" add sp, 0x28\n" -" pop {r3-r5}\n" -" mov r8, r3\n" -" mov r9, r4\n" -" mov r10, r5\n" -" pop {r4-r7}\n" -" pop {r0}\n" -" bx r0\n" -" .align 2, 0\n" -"_0805E6E4: .4byte 0x0001821a\n" -"_0805E6E8: .4byte 0x0001821b\n" -"_0805E6EC: .4byte sShowThreeArrows2\n" -"_0805E6F0: .4byte sShowThreeArrows1\n" -"_0805E6F4: .4byte gUnknown_8106AE8\n" -"_0805E6F8: .4byte sArrowsFrames\n" -"_0805E6FC: .4byte 0xffff0000\n" -"_0805E700: .4byte 0x0000feff\n" -"_0805E704: .4byte 0x0000fdff\n" -"_0805E708: .4byte 0x0000f3ff\n" -"_0805E70C: .4byte 0x0000efff\n" -"_0805E710: .4byte 0x0000dfff\n" -"_0805E714: .4byte 0x00003fff\n" -"_0805E718: .4byte 0x0000c1ff\n" -"_0805E71C: .4byte gUnknown_8106AE8 + 4\n" -"_0805E720: .4byte 0x000003ff\n" -"_0805E724: .4byte 0x00000fff\n" -"_0805E728: .4byte 0x0000fffe\n" -"_0805E72C: .4byte 0x0000fffd\n" -"_0805E730: .4byte 0x000001ff\n" -"_0805E734: .4byte sInRotateMode" -); -} - -#endif // NONMATCHING - void sub_805E738(Entity *a0) { const Tile *tile; diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index cf559ce08..335656fb1 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -2290,18 +2290,8 @@ void sub_806C51C(Entity *entity) if (xSprite >= -32 && ySprite >= -32 && xSprite <= 271 && ySprite <= 191 && r7 != 6 && entity->unk22 == 0) { struct unkStruct_202ED28 *spriteStructPtr = &gUnknown_202ED28[var_34][r7]; if (entInfo->unk156 != 0) { - u32 finalXSprite, finalYSprite; - - finalXSprite = xSprite + spriteStructPtr->x; - finalXSprite &= SPRITEOAM_MASK_X; - spriteStructPtr->sprite.attrib2 &= ~SPRITEOAM_MASK_X; - spriteStructPtr->sprite.attrib2 |= finalXSprite; - - finalYSprite = ySprite + spriteStructPtr->y; - finalYSprite &= SPRITEOAM_MAX_UNK6_4; - finalYSprite <<= SPRITEOAM_SHIFT_UNK6_4; - spriteStructPtr->sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - spriteStructPtr->sprite.unk6 |= finalYSprite; + SpriteSetX(&spriteStructPtr->sprite, xSprite + spriteStructPtr->x); + SpriteSetY(&spriteStructPtr->sprite, ySprite + spriteStructPtr->y); AddSprite(&spriteStructPtr->sprite, 0, NULL, NULL); } diff --git a/src/code_807E5AC.c b/src/code_807E5AC.c index 31da4c6d6..05bf64e5a 100644 --- a/src/code_807E5AC.c +++ b/src/code_807E5AC.c @@ -1455,38 +1455,12 @@ void sub_807FA9C(void) s32 spriteX = (x * 24) - gDungeon->unk181e8.cameraPixelPos.x; s32 spriteY = (y * 24) - gDungeon->unk181e8.cameraPixelPos.y; if (spriteX >= -32 && spriteY >= -32 && spriteX <= 272 && spriteY <= 192) { - u32 spriteXMasked, spriteYMasked, priority, palNum, tileNum, objMode; - - objMode = 0; - objMode &= SPRITEOAM_MAX_OBJMODE; - objMode <<= SPRITEOAM_SHIFT_OBJMODE; - gUnknown_202EDC0.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - gUnknown_202EDC0.attrib1 |= objMode; - - spriteYMasked = (spriteY & SPRITEOAM_MAX_UNK6_4); - spriteYMasked <<= SPRITEOAM_SHIFT_UNK6_4; - gUnknown_202EDC0.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - gUnknown_202EDC0.unk6 |= spriteYMasked; - - spriteXMasked = (spriteX & SPRITEOAM_MAX_X); - spriteXMasked <<= SPRITEOAM_SHIFT_X; - gUnknown_202EDC0.attrib2 &= ~SPRITEOAM_MASK_X; - gUnknown_202EDC0.attrib2 |= spriteXMasked; - - priority = 3 & SPRITEOAM_MAX_PRIORITY; - priority <<= SPRITEOAM_SHIFT_PRIORITY; - gUnknown_202EDC0.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - gUnknown_202EDC0.attrib3 |= priority; - - palNum = 10 & SPRITEOAM_MAX_PALETTENUM; - palNum <<= SPRITEOAM_SHIFT_PALETTENUM; - gUnknown_202EDC0.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - gUnknown_202EDC0.attrib3 |= palNum; - - tileNum = 0x1FC & SPRITEOAM_MAX_TILENUM; - tileNum <<= SPRITEOAM_SHIFT_TILENUM; - gUnknown_202EDC0.attrib3 &= ~SPRITEOAM_MASK_TILENUM; - gUnknown_202EDC0.attrib3 |= tileNum; + SpriteSetObjMode(&gUnknown_202EDC0, 0); + SpriteSetY(&gUnknown_202EDC0, spriteY); + SpriteSetX(&gUnknown_202EDC0, spriteX); + SpriteSetPriority(&gUnknown_202EDC0, 3); + SpriteSetPalNum(&gUnknown_202EDC0, 10); + SpriteSetTileNum(&gUnknown_202EDC0, 0x1FC); AddSprite(&gUnknown_202EDC0, 0, NULL, NULL); } diff --git a/src/code_808333C.c b/src/code_808333C.c index 863723cfe..e0635cd11 100644 --- a/src/code_808333C.c +++ b/src/code_808333C.c @@ -9,18 +9,8 @@ bool8 sub_8083568(s32 inX, s32 inY, u8 index) if (x >= -16 && y >= -16 && x <= 255 && y <= 175) { - u32 finalXSprite, finalYSprite; - - finalXSprite = x + gUnknown_202ED28[0][index].x; - finalXSprite &= SPRITEOAM_MASK_X; - gUnknown_202ED28[0][index].sprite.attrib2 &= ~SPRITEOAM_MASK_X; - gUnknown_202ED28[0][index].sprite.attrib2 |= finalXSprite; - - finalYSprite = y + gUnknown_202ED28[0][index].y; - finalYSprite &= SPRITEOAM_MAX_UNK6_4; - finalYSprite <<= SPRITEOAM_SHIFT_UNK6_4; - gUnknown_202ED28[0][index].sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - gUnknown_202ED28[0][index].sprite.unk6 |= finalYSprite; + SpriteSetX(&gUnknown_202ED28[0][index].sprite, x + gUnknown_202ED28[0][index].x); + SpriteSetY(&gUnknown_202ED28[0][index].sprite, y + gUnknown_202ED28[0][index].y); AddSprite(&gUnknown_202ED28[0][index].sprite, 0, NULL, NULL); return TRUE; diff --git a/src/dungeon_message.c b/src/dungeon_message.c index 2506818d6..758ba61d8 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -763,41 +763,19 @@ void sub_8052FB8(const u8 *str) else { r9++; if (r9 & 8) { - u32 shape, tileNum, unk6, spriteX, mask, palNum; - - sUnknown_202F1F0.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - sUnknown_202F1F0.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; - sUnknown_202F1F0.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - sUnknown_202F1F0.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - sUnknown_202F1F0.attrib1 &= ~SPRITEOAM_MASK_BPP; - - sUnknown_202F1F0.attrib1 &= ~SPRITEOAM_MASK_SHAPE; - shape = 1; - shape <<= SPRITEOAM_SHIFT_SHAPE; - ASM_MATCH_TRICK(shape); - sUnknown_202F1F0.attrib1 |= shape; - - tileNum = 0x3F0 << SPRITEOAM_SHIFT_TILENUM; - sUnknown_202F1F0.attrib3 &= ~SPRITEOAM_MASK_TILENUM; - sUnknown_202F1F0.attrib3 |= tileNum; - - sUnknown_202F1F0.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - - mask = 0xF; - palNum = (15 & SPRITEOAM_MAX_PALETTENUM) << SPRITEOAM_SHIFT_PALETTENUM; - sUnknown_202F1F0.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - sUnknown_202F1F0.attrib3 |= palNum; - - unk6 = 0x78 << SPRITEOAM_SHIFT_UNK6_4; - sUnknown_202F1F0.unk6 &= mask; // ~SPRITEOAM_MASK_UNK6_4 - sUnknown_202F1F0.unk6 |= unk6; - - sUnknown_202F1F0.attrib2 &= ~SPRITEOAM_MASK_X; - sUnknown_202F1F0.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - - spriteX = 0x70 & SPRITEOAM_MAX_X; - sUnknown_202F1F0.attrib2 &= ~SPRITEOAM_MASK_SIZE; - sUnknown_202F1F0.attrib2 |= spriteX; + SpriteSetAffine1(&sUnknown_202F1F0, 0); + SpriteSetAffine2(&sUnknown_202F1F0, 0); + SpriteSetObjMode(&sUnknown_202F1F0, 0); + SpriteSetMosaic(&sUnknown_202F1F0, 0); + SpriteSetBpp(&sUnknown_202F1F0, 0); + SpriteSetShape(&sUnknown_202F1F0, 1); + SpriteSetTileNum(&sUnknown_202F1F0, 0x3F0); + SpriteSetPriority(&sUnknown_202F1F0, 0); + SpriteSetPalNum(&sUnknown_202F1F0, 15); + SpriteSetY(&sUnknown_202F1F0, 120); + SpriteSetMatrixNum(&sUnknown_202F1F0, 0); + SpriteSetSize(&sUnknown_202F1F0, 0); + SpriteSetX(&sUnknown_202F1F0, 112); AddSprite(&sUnknown_202F1F0, 0x100, NULL, NULL); } @@ -1081,39 +1059,20 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y) { struct UnkTextStruct1 *unkStr = &gUnknown_2027370[0]; if (!(gUnknown_202EDCC & 8)) { - u32 matrixNum, xSprite, mask, ySprite, shape, yMask; - - sMessageLogArrowSpriteOAM.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - sMessageLogArrowSpriteOAM.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; - sMessageLogArrowSpriteOAM.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - sMessageLogArrowSpriteOAM.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - sMessageLogArrowSpriteOAM.attrib1 &= ~SPRITEOAM_MASK_BPP; - - matrixNum = (upArrow != FALSE) ? (16) : 0; - // You may be thinking what is this empty loop doing here, but the better question is: Why do these unholy sprite macros exist? - do {} while (0); - matrixNum <<= 9; - sMessageLogArrowSpriteOAM.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - sMessageLogArrowSpriteOAM.attrib2 |= matrixNum; - - mask = 0xF; // ~SPRITEOAM_MASK_UNK6_4 - yMask = SPRITEOAM_MAX_UNK6_4; - ySprite = (yMask & (unkStr->unk2 * 8 + y)) << 4; - sMessageLogArrowSpriteOAM.unk6 &= mask; - sMessageLogArrowSpriteOAM.unk6 |= ySprite; - - xSprite = SPRITEOAM_MAX_X & ((unkStr->unk0 * 8) + 92); - sMessageLogArrowSpriteOAM.attrib2 &= ~SPRITEOAM_MASK_X; - sMessageLogArrowSpriteOAM.attrib2 |= xSprite; - - shape = 1; - shape <<= SPRITEOAM_SHIFT_SHAPE; - sMessageLogArrowSpriteOAM.attrib1 &= ~SPRITEOAM_MASK_SHAPE; - sMessageLogArrowSpriteOAM.attrib1 |= shape; - - sMessageLogArrowSpriteOAM.attrib2 &= ~SPRITEOAM_MASK_SIZE; - - sMessageLogArrowSpriteOAM.attrib3 = 0xF3F0; + SpriteSetAffine1(&sMessageLogArrowSpriteOAM, 0); + SpriteSetAffine2(&sMessageLogArrowSpriteOAM, 0); + SpriteSetObjMode(&sMessageLogArrowSpriteOAM, 0); + SpriteSetMosaic(&sMessageLogArrowSpriteOAM, 0); + SpriteSetBpp(&sMessageLogArrowSpriteOAM, 0); + SpriteSetMatrixNum(&sMessageLogArrowSpriteOAM, (upArrow != FALSE) ? (16) : 0); + SpriteSetPalNum(&sMessageLogArrowSpriteOAM, 15); + SpriteSetY(&sMessageLogArrowSpriteOAM, (unkStr->unk2 * 8) + y); + SpriteSetX(&sMessageLogArrowSpriteOAM, (unkStr->unk0 * 8) + 92); + SpriteSetShape(&sMessageLogArrowSpriteOAM, 1); + SpriteSetSize(&sMessageLogArrowSpriteOAM, 0); + SpriteSetPriority(&sMessageLogArrowSpriteOAM, 0); + SpriteSetPalNum(&sMessageLogArrowSpriteOAM, 15); + SpriteSetTileNum(&sMessageLogArrowSpriteOAM, 0x3f0); AddSprite(&sMessageLogArrowSpriteOAM, 127, NULL, NULL); } diff --git a/src/menu_input.c b/src/menu_input.c index 72a32bb74..16f95c5bd 100644 --- a/src/menu_input.c +++ b/src/menu_input.c @@ -603,74 +603,26 @@ void AddMenuCursorSprite(MenuInputStruct *param_1) void AddMenuCursorSprite_(MenuInputStruct *a0, u8 *a1) { - SpriteOAM sp = {}; - SpriteOAM* ptr; - s32 value; - s32 r0; - s32 r1; - s32 r2; - s32 r5; + struct SpriteOAM sp = {0}; if (a0->unk1A > 0) { UpdateMenuCursorSpriteCoords(a0); if (!(a0->unk24 & 8)) { - #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/T9aXl - u32 tmp, tmp2; - #else - register u32 tmp asm("r0"), tmp2 asm("r1"); - #endif - - tmp = sp.attrib1; - sp.attrib1 = tmp & ~SPRITEOAM_MASK_AFFINEMODE1; - sp.attrib1 = sp.attrib1; - - tmp2 = sp.attrib1; - sp.attrib1 = tmp2 & ~SPRITEOAM_MASK_AFFINEMODE2; - sp.attrib1 = sp.attrib1; - - tmp2 = sp.attrib1; - sp.attrib1 = tmp2 & ~SPRITEOAM_MASK_OBJMODE; - sp.attrib1 = sp.attrib1; - - tmp2 = sp.attrib1; - sp.attrib1 = tmp2 & ~SPRITEOAM_MASK_MOSAIC; - sp.attrib1 = sp.attrib1; - - tmp2 = sp.attrib1; - sp.attrib1 = tmp2 & ~SPRITEOAM_MASK_BPP; - sp.attrib1 = sp.attrib1; - - tmp2 = sp.attrib1; - sp.attrib1 = tmp2 & ~SPRITEOAM_MASK_SHAPE; - sp.attrib1 = sp.attrib1; - - ptr = &sp; - - r2 = 0x3F4 << SPRITEOAM_SHIFT_TILENUM; - ptr->attrib3 &= ~SPRITEOAM_MASK_TILENUM; - ptr->attrib3 |= r2; - - ptr->attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - - r5 = (u16)~SPRITEOAM_MASK_UNK6_4; - - r1 = 15 << SPRITEOAM_SHIFT_PALETTENUM; - ptr->attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - ptr->attrib3 |= r1; - - ptr->unk6 &= ~SPRITEOAM_MASK_UNK6_0; - ptr->unk6 &= ~SPRITEOAM_MASK_UNK6_1; - - r0 = a0->unk8.x; - r0 &= SPRITEOAM_MAX_X; - ptr->attrib2 = r0; - - value = a0->unk8.y + 1; - value &= SPRITEOAM_MAX_UNK6_4; - value <<= SPRITEOAM_SHIFT_UNK6_4; - ptr->unk6 &= r5; - ptr->unk6 |= value; + SpriteSetAffine1(&sp, 0); + SpriteSetAffine2(&sp, 0); + SpriteSetObjMode(&sp, 0); + SpriteSetMosaic(&sp, 0); + SpriteSetBpp(&sp, 0); + SpriteSetShape(&sp, 0); + SpriteSetSize(&sp, 0); + SpriteSetTileNum(&sp, 0x3F4); + SpriteSetPriority(&sp, 0); + SpriteSetPalNum(&sp, 15); + SpriteSetUnk6_0(&sp, 0); + SpriteSetUnk6_1(&sp, 0); + SpriteSetX_MatrixNumSize0(&sp, a0->unk8.x); + SpriteSetY(&sp, a0->unk8.y + 1); AddSprite(&sp, 0xFF, 0, 0); } @@ -689,197 +641,64 @@ void nullsub_34(MenuInputStructSub *a0, s32 a1) static void sub_801332C(DungeonPos *a0) { - SpriteOAM sp = {}; - SpriteOAM* ptr; - #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/zeLxS - u32 r0, r1, r2; - #else - register u32 r0 asm("r0"); - register u32 r1 asm("r1"); - register u32 r2 asm("r2"); - #endif - u32 r3; - u32 r5; - u32 r6; + struct SpriteOAM sp = {0}; - r1 = sp.attrib1; - sp.attrib1 = r1 & ~SPRITEOAM_MASK_AFFINEMODE1; - sp.attrib1 = sp.attrib1; - - r2 = sp.attrib1; - sp.attrib1 = r2 & ~SPRITEOAM_MASK_AFFINEMODE2; - sp.attrib1 = sp.attrib1; - - r5 = 1 << SPRITEOAM_SHIFT_OBJMODE; - r2 = sp.attrib1; - sp.attrib1 = r2 & ~SPRITEOAM_MASK_OBJMODE; - sp.attrib1 = sp.attrib1 | r5; - - r2 = sp.attrib1; - sp.attrib1 = r2 & ~SPRITEOAM_MASK_MOSAIC; - sp.attrib1 = sp.attrib1; - - r2 = sp.attrib1; - sp.attrib1 = r2 & ~SPRITEOAM_MASK_BPP; - sp.attrib1 = sp.attrib1; - - r2 = sp.attrib1; - sp.attrib1 = r2 & ~SPRITEOAM_MASK_SHAPE; - sp.attrib1 = sp.attrib1; - - ptr = &sp; - - r3 = 0x3F5 << SPRITEOAM_SHIFT_TILENUM; - ptr->attrib3 &= ~SPRITEOAM_MASK_TILENUM; - ptr->attrib3 |= r3; - - ptr->attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - - r6 = (u16)~SPRITEOAM_MASK_UNK6_4; - - r2 = 15 << SPRITEOAM_SHIFT_PALETTENUM; - ptr->attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - ptr->attrib3 |= r2; - - ptr->unk6 &= ~SPRITEOAM_MASK_UNK6_0; - ptr->unk6 &= ~SPRITEOAM_MASK_UNK6_1; - - r1 = a0->x; - r1 &= SPRITEOAM_MAX_X; - ptr->attrib2 = r1; - - r0 = a0->y + 1; - r0 &= SPRITEOAM_MAX_UNK6_4; - r0 <<= SPRITEOAM_SHIFT_UNK6_4; - ptr->unk6 &= r6; - ptr->unk6 |= r0; + SpriteSetAffine1(&sp, 0); + SpriteSetAffine2(&sp, 0); + SpriteSetObjMode(&sp, 1); + SpriteSetMosaic(&sp, 0); + SpriteSetBpp(&sp, 0); + SpriteSetShape(&sp, 0); + SpriteSetSize(&sp, 0); + SpriteSetTileNum(&sp, 0x3F5); + SpriteSetPriority(&sp, 0); + SpriteSetPalNum(&sp, 15); + SpriteSetUnk6_0(&sp, 0); + SpriteSetUnk6_1(&sp, 0); + SpriteSetX_MatrixNumSize0(&sp, a0->x); + SpriteSetY(&sp, a0->y + 1); AddSprite(&sp, 0xFF, NULL, NULL); } static void sub_8013470(MenuInputStruct *a0) { - SpriteOAM sp = {}; - #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/70Ieb - SpriteOAM *ptr; - u32 r0, r1, r5; - #else - register SpriteOAM *ptr asm("r3"); - register u32 r0 asm("r0"); - register u32 r1 asm("r1"); - register u32 r5 asm("r5"); - #endif - u32 r2; + struct SpriteOAM sp = {0}; if (a0->unkC != 0) { if (a0->unk1E != 0) { - r0 = sp.attrib1; - sp.attrib1 = r0 & ~SPRITEOAM_MASK_AFFINEMODE1; - sp.attrib1 = sp.attrib1; - - r1 = sp.attrib1; - sp.attrib1 = r1 & ~SPRITEOAM_MASK_AFFINEMODE2; - sp.attrib1 = sp.attrib1; - - r1 = sp.attrib1; - sp.attrib1 = r1 & (u16)~SPRITEOAM_MASK_OBJMODE; - sp.attrib1 = sp.attrib1; - - r1 = sp.attrib1; - sp.attrib1 = r1 & ~SPRITEOAM_MASK_MOSAIC; - sp.attrib1 = sp.attrib1; - - r1 = sp.attrib1; - sp.attrib1 = r1 & ~SPRITEOAM_MASK_BPP; - sp.attrib1 = sp.attrib1; - - r1 = sp.attrib1; - sp.attrib1 = r1 & ~SPRITEOAM_MASK_SHAPE; - sp.attrib1 = sp.attrib1; - - ptr = &sp; - - r2 = 0x3F2 << SPRITEOAM_SHIFT_TILENUM; - r1 = ptr->attrib3; - r0 = r1 & (u16)~SPRITEOAM_MASK_TILENUM; - r0 |= r2; - - r0 &= (u16)~SPRITEOAM_MASK_PRIORITY; - - r5 = (u16)~SPRITEOAM_MASK_UNK6_4; - - r1 = 15 << SPRITEOAM_SHIFT_PALETTENUM; - r0 &= (u16)~SPRITEOAM_MASK_PALETTENUM; - r0 |= r1; - ptr->attrib3 = r0; - - r0 = ptr->unk6; - r1 = r0 & (u16)~SPRITEOAM_MASK_UNK6_0; - r1 &= (u16)~SPRITEOAM_MASK_UNK6_1; - - r0 = a0->unkC; - r0 &= SPRITEOAM_MAX_X; - ptr->attrib2 = r0; - - r0 = a0->unkE; - r0 &= SPRITEOAM_MAX_UNK6_4; - r0 <<= SPRITEOAM_SHIFT_UNK6_4; - r1 &= r5; - r1 |= r0; - ptr->unk6 = r1; + SpriteSetAffine1(&sp, 0); + SpriteSetAffine2(&sp, 0); + SpriteSetObjMode(&sp, 0); + SpriteSetMosaic(&sp, 0); + SpriteSetBpp(&sp, 0); + SpriteSetShape(&sp, 0); + SpriteSetSize(&sp, 0); + SpriteSetTileNum(&sp, 0x3F2); + SpriteSetPriority(&sp, 0); + SpriteSetPalNum(&sp, 15); + SpriteSetUnk6_0(&sp, 0); + SpriteSetUnk6_1(&sp, 0); + SpriteSetX_MatrixNumSize0(&sp, a0->unkC); + SpriteSetY(&sp, a0->unkE); AddSprite(&sp, 0xFF, NULL, NULL); } if (a0->unk20 != 0 && a0->unk20 != a0->unk1E + 1) { - r0 = sp.attrib1; - sp.attrib1 = r0 & ~SPRITEOAM_MASK_AFFINEMODE1; - sp.attrib1 = sp.attrib1; - - sp.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; - sp.attrib1 = sp.attrib1; - - sp.attrib1 &= (u16)~SPRITEOAM_MASK_OBJMODE; - sp.attrib1 = sp.attrib1; - - sp.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - sp.attrib1 = sp.attrib1; - - sp.attrib1 &= ~SPRITEOAM_MASK_BPP; - sp.attrib1 = sp.attrib1; - - sp.attrib1 &= ~SPRITEOAM_MASK_SHAPE; - sp.attrib1 = sp.attrib1; - - ptr = &sp; - - r2 = 0x3F3 << SPRITEOAM_SHIFT_TILENUM; - r1 = ptr->attrib3; - r0 = r1 & (u16)~SPRITEOAM_MASK_TILENUM; - r0 |= r2; - - r0 &= (u16)~SPRITEOAM_MASK_PRIORITY; - - r5 = (u16)~SPRITEOAM_MASK_UNK6_4; - - r1 = 15 << SPRITEOAM_SHIFT_PALETTENUM; - r0 &= (u16)~SPRITEOAM_MASK_PALETTENUM; - r0 |= r1; - ptr->attrib3 = r0; - - r0 = ptr->unk6; - r1 = r0 & (u16)~SPRITEOAM_MASK_UNK6_0; - r1 &= (u16)~SPRITEOAM_MASK_UNK6_1; - - r0 = a0->unkC + 10; - r0 &= SPRITEOAM_MAX_X; - ptr->attrib2 = r0; - - r0 = a0->unkE; - r0 &= SPRITEOAM_MAX_UNK6_4; - r0 <<= SPRITEOAM_SHIFT_UNK6_4; - r1 &= r5; - r1 |= r0; - ptr->unk6 = r1; + SpriteSetAffine1(&sp, 0); + SpriteSetAffine2(&sp, 0); + SpriteSetObjMode(&sp, 0); + SpriteSetMosaic(&sp, 0); + SpriteSetBpp(&sp, 0); + SpriteSetShape(&sp, 0); + SpriteSetSize(&sp, 0); + SpriteSetTileNum(&sp, 0x3F3); + SpriteSetPriority(&sp, 0); + SpriteSetPalNum(&sp, 15); + SpriteSetUnk6_0(&sp, 0); + SpriteSetUnk6_1(&sp, 0); + SpriteSetX_MatrixNumSize0(&sp, a0->unkC + 10); + SpriteSetY(&sp, a0->unkE); AddSprite(&sp, 0xFF, NULL, NULL); } @@ -1196,48 +1015,21 @@ void sub_8013A7C(MenuInputStruct *param_1) void sub_8013AA0(unkStructFor8013AA0 *a0) { - s32 r1; - s32 test; - s32 r3; - s32 r4; - s32 test2; - s16 earlyF; s32 sp[10]; - a0->unk28.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - a0->unk28.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; - a0->unk28.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - a0->unk28.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - a0->unk28.attrib1 &= ~SPRITEOAM_MASK_BPP; - - r1 = 1 << SPRITEOAM_SHIFT_SHAPE; - a0->unk28.attrib1 &= ~SPRITEOAM_MASK_SHAPE; - a0->unk28.attrib1 |= r1; - - test = 16 << SPRITEOAM_SHIFT_MATRIXNUM; - a0->unk28.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - a0->unk28.attrib2 |= test; - - a0->unk28.attrib2 &= ~SPRITEOAM_MASK_SIZE; - - r3 = 0x3F0 << SPRITEOAM_SHIFT_TILENUM; - a0->unk28.attrib3 &= ~SPRITEOAM_MASK_TILENUM; - a0->unk28.attrib3 |= r3; - - a0->unk28.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - - earlyF = (s16)~SPRITEOAM_MASK_UNK6_4; - - r4 = 15 << SPRITEOAM_SHIFT_PALETTENUM; - a0->unk28.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - a0->unk28.attrib3 |= r4; - - a0->unk28.attrib2 &= ~SPRITEOAM_MASK_X; - a0->unk28.attrib2 |= DISPLAY_WIDTH; - - test2 = DISPLAY_WIDTH << SPRITEOAM_SHIFT_UNK6_4; - a0->unk28.unk6 &= earlyF; - a0->unk28.unk6 |= test2; + SpriteSetAffine1(&a0->unk28, 0); + SpriteSetAffine2(&a0->unk28, 0); + SpriteSetObjMode(&a0->unk28, 0); + SpriteSetMosaic(&a0->unk28, 0); + SpriteSetBpp(&a0->unk28, 0); + SpriteSetShape(&a0->unk28, 1); + SpriteSetMatrixNum(&a0->unk28, 16); + SpriteSetSize(&a0->unk28, 0); + SpriteSetTileNum(&a0->unk28, 0x3F0); + SpriteSetPriority(&a0->unk28, 0); + SpriteSetPalNum(&a0->unk28, 15); + SpriteSetX(&a0->unk28, DISPLAY_WIDTH); + SpriteSetY(&a0->unk28, DISPLAY_WIDTH); a0->unk26 = 0; @@ -1265,24 +1057,12 @@ u32 sub_8013BBC(unkStructFor8013AA0 *a0) sub_8013D10(a0); if (a0->unk26 & 8) { - { - s32 temp = 16 << SPRITEOAM_SHIFT_MATRIXNUM; - a0->unk28.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - a0->unk28.attrib2 |= temp; - } + SpriteSetMatrixNum(&a0->unk28, 16); AddSprite(&a0->unk28, 0x100, NULL, NULL); - a0->unk28.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - { - u32 temp = a0->unk28.unk6; - s32 max = SPRITEOAM_MAX_UNK6_4; - temp >>= SPRITEOAM_SHIFT_UNK6_4; - temp += 16; - temp &= max; - temp <<= SPRITEOAM_SHIFT_UNK6_4; - a0->unk28.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - a0->unk28.unk6 |= temp; - } + SpriteSetMatrixNum(&a0->unk28, 0); + SpriteAddY(&a0->unk28, 16); + AddSprite(&a0->unk28, 0x100, NULL, NULL); } @@ -1326,6 +1106,7 @@ void sub_8013C68(unkStructFor8013AA0 *a0) void sub_8013D10(unkStructFor8013AA0 *a0) { + s32 x, y; u8 uVar4; UnkTextStruct1 *ptr; @@ -1347,21 +1128,11 @@ void sub_8013D10(unkStructFor8013AA0 *a0) a0->unk26 = 8; } - { - s32 temp = (a0->unk1C - ((a0->unk24 + 1) * 12) + (ptr->unk0 * 8)) - 3; - temp &= SPRITEOAM_MAX_X; - temp <<= SPRITEOAM_SHIFT_X; - a0->unk28.attrib2 &= ~SPRITEOAM_MASK_X; - a0->unk28.attrib2 |= temp; - } while (0); + x = (a0->unk1C - ((a0->unk24 + 1) * 12) + (ptr->unk0 * 8)) - 3; + SpriteSetX(&a0->unk28, x); - { - s32 temp = a0->unk20 + (ptr->unk2 * 8) - 7; - temp &= SPRITEOAM_MAX_UNK6_4; - temp <<= SPRITEOAM_SHIFT_UNK6_4; - a0->unk28.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - a0->unk28.unk6 |= temp; - } while (0); + y = a0->unk20 + (ptr->unk2 * 8) - 7; + SpriteSetY(&a0->unk28, y); } static bool8 sub_8013DD0(unkStructFor8013AA0 *a0) diff --git a/src/other_menus1.c b/src/other_menus1.c index 1c0c21a60..3cc5485d3 100644 --- a/src/other_menus1.c +++ b/src/other_menus1.c @@ -330,70 +330,25 @@ static void sub_8037400(void) static void sub_80376CC(void) { -#ifdef NONMATCHING // SpriteOAM memes - u32 r0; - u32 r2; -#else - register u32 r0 asm("r0"); - register u32 r2 asm("r2"); -#endif - u32 r1; - u32 r4; - - r1 = sUnknown_203B35C->unkC.attrib1; - r0 = (u16)~SPRITEOAM_MASK_AFFINEMODE1; - r0 &= r1; - - r0 &= (u16)~SPRITEOAM_MASK_AFFINEMODE2; - - r0 &= (u16)~SPRITEOAM_MASK_OBJMODE; - - r0 &= (u16)~SPRITEOAM_MASK_MOSAIC; - - r0 &= (u16)~SPRITEOAM_MASK_BPP; - - r2 = 1 << SPRITEOAM_SHIFT_SHAPE; - r0 &= (u16)~SPRITEOAM_MASK_SHAPE; - r0 |= r2; - - sUnknown_203B35C->unkC.attrib1 = r0; - - r2 = 0x3F0 << SPRITEOAM_SHIFT_TILENUM; - r1 = sUnknown_203B35C->unkC.attrib3; - r0 = (u16)~SPRITEOAM_MASK_TILENUM; - r0 &= r1; - r0 |= r2; - - r0 &= (u16)~SPRITEOAM_MASK_PRIORITY; - - r2 = (u16)~SPRITEOAM_MASK_UNK6_4; - - r4 = 15 << SPRITEOAM_SHIFT_PALETTENUM; - r0 &= (u16)~SPRITEOAM_MASK_PALETTENUM; - r0 |= r4; - - sUnknown_203B35C->unkC.attrib3 = r0; - - r0 = 0; // Set x/matrixNum/size to 0 - sUnknown_203B35C->unkC.attrib2 = r0; - - r1 = 192 << SPRITEOAM_SHIFT_UNK6_4; - r0 = sUnknown_203B35C->unkC.unk6; - r2 &= r0; - r2 |= r1; - sUnknown_203B35C->unkC.unk6 = r2; + SpriteSetAffine1(&sUnknown_203B35C->unkC, 0); + SpriteSetAffine2(&sUnknown_203B35C->unkC, 0); + SpriteSetObjMode(&sUnknown_203B35C->unkC, 0); + SpriteSetMosaic(&sUnknown_203B35C->unkC, 0); + SpriteSetBpp(&sUnknown_203B35C->unkC, 0); + SpriteSetShape(&sUnknown_203B35C->unkC, 1); + SpriteSetTileNum(&sUnknown_203B35C->unkC, 0x3F0); + SpriteSetPriority(&sUnknown_203B35C->unkC, 0); + SpriteSetPalNum(&sUnknown_203B35C->unkC, 15); + SpriteSetX(&sUnknown_203B35C->unkC, 0); + SpriteSetMatrixNum(&sUnknown_203B35C->unkC, 0); + SpriteSetSize(&sUnknown_203B35C->unkC, 0); + SpriteSetY(&sUnknown_203B35C->unkC, 192); } static void sub_8037748(void) { - u16 temp2; - - sUnknown_203B35C->unkC.attrib2 &= ~SPRITEOAM_MASK_X; // Clear x - sUnknown_203B35C->unkC.attrib2 |= 112; // Set x to 112 - - temp2 = 104 << SPRITEOAM_SHIFT_UNK6_4; - sUnknown_203B35C->unkC.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - sUnknown_203B35C->unkC.unk6 |= temp2; + SpriteSetX(&sUnknown_203B35C->unkC, 112); + SpriteSetY(&sUnknown_203B35C->unkC, 104); if ((sUnknown_203B35C->unk14 & 8) != 0) AddSprite(&sUnknown_203B35C->unkC, 0x100, NULL, NULL); diff --git a/src/pokemon.c b/src/pokemon.c index 24d46680c..406cb8c99 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1410,52 +1410,21 @@ void InitShadowSprites(s32 param_1, s32 param_2) CloseFile(file); for (spriteIndex = 0; spriteIndex < 3; spriteIndex++) { - u32 objMode, shape, size, tileNum, priority; - SpriteOAM *sprite = &gShadowSprites[spriteIndex]; - sprite->attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - sprite->attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; - - objMode = 0; - objMode &= SPRITEOAM_MAX_OBJMODE; - objMode <<= SPRITEOAM_SHIFT_OBJMODE; - sprite->attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - sprite->attrib1 |= objMode; - - sprite->attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - sprite->attrib1 &= ~SPRITEOAM_MASK_BPP; - - shape = gShadowSpriteSizeFlags_8107698[spriteIndex].shape; - shape &= SPRITEOAM_MAX_SHAPE; - shape <<= SPRITEOAM_SHIFT_SHAPE; - sprite->attrib1 &= ~SPRITEOAM_MASK_SHAPE; - sprite->attrib1 |= shape; - - sprite->attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - - size = gShadowSpriteSizeFlags_8107698[spriteIndex].size; - size &= SPRITEOAM_MAX_SIZE; - size <<= SPRITEOAM_SHIFT_SIZE; - sprite->attrib2 &= ~SPRITEOAM_MASK_SIZE; - sprite->attrib2 |= size; - - tileNum = gShadowSpriteSizeFlags_8107698[spriteIndex].tileNum + param_1; - tileNum &= SPRITEOAM_MAX_TILENUM; - tileNum <<= SPRITEOAM_SHIFT_TILENUM; - sprite->attrib3 &= ~SPRITEOAM_MASK_TILENUM; - sprite->attrib3 |= tileNum; - - priority = param_2; - priority &= SPRITEOAM_MAX_PRIORITY; - priority <<= SPRITEOAM_SHIFT_PRIORITY; - sprite->attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - sprite->attrib3 |= priority; - - sprite->attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - - sprite->unk6 &= ~SPRITEOAM_MASK_UNK6_0; - sprite->unk6 &= ~SPRITEOAM_MASK_UNK6_1; + SpriteSetAffine1(sprite, 0); + SpriteSetAffine2(sprite, 0); + SpriteSetObjMode(sprite, 0); + SpriteSetMosaic(sprite, 0); + SpriteSetBpp(sprite, 0); + SpriteSetShape(sprite, gShadowSpriteSizeFlags_8107698[spriteIndex].shape); + SpriteSetMatrixNum(sprite, 0); + SpriteSetSize(sprite, gShadowSpriteSizeFlags_8107698[spriteIndex].size); + SpriteSetTileNum(sprite, gShadowSpriteSizeFlags_8107698[spriteIndex].tileNum + param_1); + SpriteSetPriority(sprite, param_2); + SpriteSetPalNum(sprite, 0); + SpriteSetUnk6_0(sprite, 0); + SpriteSetUnk6_1(sprite, 0); } } @@ -1466,24 +1435,16 @@ bool8 AddShadowSprite(s16 species, s16* a2, s16* a3) if (species != MONSTER_DIGLETT && species != MONSTER_DUGTRIO) { s32 shadowSize = GetShadowSize(species); s32 x, y; - SpriteOAM* spr; x = a2[0] + a3[8]; y = a2[1] + a3[9]; x += gUnknown_81076C4[shadowSize]; y -= 4; - x &= SPRITEOAM_MAX_X; - x <<= SPRITEOAM_SHIFT_X; - spr = &gShadowSprites[shadowSize]; - spr->attrib2 &= ~SPRITEOAM_MASK_X; - spr->attrib2 |= x; + SpriteSetX(&gShadowSprites[shadowSize], x); + SpriteSetY(&gShadowSprites[shadowSize], y); - y &= SPRITEOAM_MAX_UNK6_4; - y <<= SPRITEOAM_SHIFT_UNK6_4; - spr->unk6 &= ~SPRITEOAM_MASK_UNK6_4; - spr->unk6 |= y; - AddSprite(spr, 0, NULL, NULL); + AddSprite(&gShadowSprites[shadowSize], 0, NULL, NULL); } return TRUE; diff --git a/src/rescue_password_menu.c b/src/rescue_password_menu.c index 87220eff3..e574f1ca9 100644 --- a/src/rescue_password_menu.c +++ b/src/rescue_password_menu.c @@ -679,67 +679,29 @@ u32 sub_8039068(u32 mailMode, u8 *passwordBuffer, unkStruct_203B480 *param_3) void sub_8039174(void) { - struct SpriteOAM* spr; - s16 earlyF; + SpriteSetAffine1(&gRescuePasswordMenu->unk208, 0); + SpriteSetAffine2(&gRescuePasswordMenu->unk208, 0); + SpriteSetObjMode(&gRescuePasswordMenu->unk208, 0); + SpriteSetMosaic(&gRescuePasswordMenu->unk208, 0); + SpriteSetBpp(&gRescuePasswordMenu->unk208, 0); + SpriteSetShape(&gRescuePasswordMenu->unk208, 1); + SpriteSetTileNum(&gRescuePasswordMenu->unk208, 0x3F0); + SpriteSetPriority(&gRescuePasswordMenu->unk208, 0); + SpriteSetPalNum(&gRescuePasswordMenu->unk208, 15); + SpriteSetMatrixNum(&gRescuePasswordMenu->unk208, 0); + SpriteSetSize(&gRescuePasswordMenu->unk208, 0); - spr = &gRescuePasswordMenu->unk208; - - spr->attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - spr->attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; - spr->attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - spr->attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - spr->attrib1 &= ~SPRITEOAM_MASK_BPP; - - { - s32 temp = 1 << SPRITEOAM_SHIFT_SHAPE; - spr->attrib1 &= ~SPRITEOAM_MASK_SHAPE; - spr->attrib1 |= temp; - } while(0); - - { - s32 temp = 0x3F0 << SPRITEOAM_SHIFT_TILENUM; - spr->attrib3 &= ~SPRITEOAM_MASK_TILENUM; - spr->attrib3 |= temp; - } while(0); - - spr->attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - - earlyF = (s16)~SPRITEOAM_MASK_UNK6_4; - - { - s32 temp = 15 << SPRITEOAM_SHIFT_PALETTENUM; - spr->attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - spr->attrib3 |= temp; - } while(0); - - { - s32 temp = 0; - spr->attrib2 = temp; - } while(0); - - { - s32 temp = 192 << SPRITEOAM_SHIFT_UNK6_4; - spr->unk6 &= earlyF; - spr->unk6 |= temp; - } while(0); + SpriteSetX(&gRescuePasswordMenu->unk208, 0); + SpriteSetY(&gRescuePasswordMenu->unk208, 192); } void sub_80391F8(void) { - SpriteOAM *spr; - u32 val; - - spr = &gRescuePasswordMenu->unk208; - - spr->attrib2 &= ~SPRITEOAM_MASK_X; - spr->attrib2 |= 112; - - val = 112 << SPRITEOAM_SHIFT_UNK6_4; - spr->unk6 &= ~SPRITEOAM_MASK_UNK6_4; - spr->unk6 |= val; + SpriteSetX(&gRescuePasswordMenu->unk208, 112); + SpriteSetY(&gRescuePasswordMenu->unk208, 112); if (gRescuePasswordMenu->unk210 & 8) - AddSprite(spr, 0x100, NULL, NULL); + AddSprite(&gRescuePasswordMenu->unk208, 0x100, NULL, NULL); DrawDialogueBoxString(); gRescuePasswordMenu->unk210++; diff --git a/src/save_menu.c b/src/save_menu.c index e8112b02f..7933ea70b 100644 --- a/src/save_menu.c +++ b/src/save_menu.c @@ -266,61 +266,24 @@ s32 UpdateSaveMenu(void) void sub_8038830(void) { -#ifdef NONMATCHING // SpriteOAM memes - u32 r0; - u32 r2; -#else - register u32 r0 asm("r0"); - register u32 r2 asm("r2"); -#endif - u32 r1; - u32 r4; - u32 r5; - SpriteOAM *sprite; + SpriteSetAffine1(&sUnknown_203B364->unk1A8, 0); + SpriteSetAffine2(&sUnknown_203B364->unk1A8, 0); + SpriteSetObjMode(&sUnknown_203B364->unk1A8, 0); + SpriteSetMosaic(&sUnknown_203B364->unk1A8, 0); + SpriteSetBpp(&sUnknown_203B364->unk1A8, 0); + SpriteSetShape(&sUnknown_203B364->unk1A8, 1); - r5 = 0; - sprite = &sUnknown_203B364->unk1A8; + SpriteSetTileNum(&sUnknown_203B364->unk1A8, 0x3F0); + SpriteSetPriority(&sUnknown_203B364->unk1A8, 0); + SpriteSetPalNum(&sUnknown_203B364->unk1A8, 15); - r1 = sprite->attrib1; - r0 = (u16)~SPRITEOAM_MASK_AFFINEMODE1; - r0 &= r1; + SpriteSetMatrixNum(&sUnknown_203B364->unk1A8, 0); + SpriteSetSize(&sUnknown_203B364->unk1A8, 0); - r0 &= (u16)~SPRITEOAM_MASK_AFFINEMODE2; + SpriteSetX(&sUnknown_203B364->unk1A8, 112); + SpriteSetY(&sUnknown_203B364->unk1A8, 104); - r0 &= (u16)~SPRITEOAM_MASK_OBJMODE; - - r0 &= (u16)~SPRITEOAM_MASK_MOSAIC; - - r0 &= (u16)~SPRITEOAM_MASK_BPP; - - r2 = 1 << SPRITEOAM_SHIFT_SHAPE; - r0 &= (u16)~SPRITEOAM_MASK_SHAPE; - r0 |= r2; - sprite->attrib1 = r0; - - r2 = 0x3F0 << SPRITEOAM_SHIFT_TILENUM; - r1 = sprite->attrib3; - r0 = (u16)~SPRITEOAM_MASK_TILENUM; - r0 &= r1; - r0 |= r2; - - r0 &= (u16)~SPRITEOAM_MASK_PRIORITY; - - r2 = (u16)~SPRITEOAM_MASK_UNK6_4; - - r4 = 15 << SPRITEOAM_SHIFT_PALETTENUM; - r0 &= (u16)~SPRITEOAM_MASK_PALETTENUM; - r0 |= r4; - sprite->attrib3 = r0; - - sprite->attrib2 = 112; // Set x to 112. Set matrixNum/size to 0 - - r1 = 104 << SPRITEOAM_SHIFT_UNK6_4; - r2 &= sprite->unk6; - r2 |= r1; - sprite->unk6 = r2; - - sUnknown_203B364->unk1B0 = r5; + sUnknown_203B364->unk1B0 = 0; ResetSprites(FALSE); } diff --git a/src/sprite.c b/src/sprite.c index 2fcadddc8..5b6f433d7 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -4,13 +4,7 @@ #include "sprite.h" static EWRAM_DATA u16 sOAMSpriteCount = {0}; // 2025670 Written to but never read -#ifndef NONMATCHING -UNUSED // TODO: Remove the "UNUSED" attribute after AddAxSprite is done -#endif static EWRAM_DATA s16 sUnknown_2025672[8] = {0}; -#ifndef NONMATCHING -UNUSED // TODO: Remove the "UNUSED" attribute after AddAxSprite is done -#endif static EWRAM_DATA s16 sUnknown_2025682[9] = {0}; static EWRAM_DATA DungeonPos sUnknown_2025694 = {0}; static EWRAM_DATA u32 sUnknown_2025698 = {0}; @@ -152,43 +146,42 @@ void sub_8004E8C(unkStruct_2039DB0 *a0) a0->unkA = 0; } -// This makes it seem that SpriteOAM is actually a struct of an array of 4. To verify later -static inline void CopySprite(SpriteOAM *_dst, SpriteOAM *_src) { - u16 *dst = (void *) _dst; - u16 *src = (void *) _src; - - *(dst++) = *(src++); - *(dst++) = *(src++); - *(dst++) = *(src++); - *(dst++) = *(src++); +// Needed to match AddAxSprite and AddAxSprite. These macros assume SpriteOAM struct has size of 8 +#define SpriteCopy(_dst, _src) \ +{ \ + u16 *_dstVar = (void *) _dst; \ + u16 *_srcVar = (void *) _src; \ + \ + *(_dstVar++) = *(_srcVar++); \ + *(_dstVar++) = *(_srcVar++); \ + *(_dstVar++) = *(_srcVar++); \ + *(_dstVar++) = *(_srcVar++); \ } -static inline void CopySpriteWithMasks(SpriteOAM *_dst, SpriteOAM *_src, struct unkStruct_2039DB0 *spriteMasks) { - u16 *dst = (void *) _dst; - u16 *src = (void *) _src; - - *(dst++) = (*(src++) & spriteMasks->unk0) | spriteMasks->unk6; - *(dst++) = (*(src++) & spriteMasks->unk2) | spriteMasks->unk8; - *(dst++) = (*(src++) & spriteMasks->unk4) | spriteMasks->unkA; - *(dst++) = *(src++); +#define SpriteCopyWithMasks(_dst, _src, _spriteMasks) \ +{ \ + u16 *_dstVar = (void *) _dst; \ + u16 *_srcVar = (void *) _src; \ + \ + *(_dstVar++) = (*(_srcVar++) & _spriteMasks->unk0) | _spriteMasks->unk6; \ + *(_dstVar++) = (*(_srcVar++) & _spriteMasks->unk2) | _spriteMasks->unk8; \ + *(_dstVar++) = (*(_srcVar++) & _spriteMasks->unk4) | _spriteMasks->unkA; \ + *(_dstVar++) = *(_srcVar++); \ } -// https://decomp.me/scratch/VYqKb / https://decomp.me/scratch/33KIb - Same issue as AddSprite() -// Should be functionally equivalent. -#ifdef NONMATCHING void AddAxSprite(ax_pose *a0, axdata1 *a1, UnkSpriteMem *a2, unkStruct_2039DB0 *spriteMasks) { // size: 0xC struct UnkStackFor8004EA8 { - u16 unk0; + s16 unk0; ax_pose_unk2 unk2; SpriteOAM oam; } sp; SpriteOAM *sprite; - s32 r7; - s32 x; - s32 y; + s32 spriteId; + s32 pos; // Has to be used for both x and y to match + struct UnkStackFor8004EA8 *spPtr; if (a2 != NULL) RegisterSpriteParts_80052BC(a2); @@ -196,362 +189,71 @@ void AddAxSprite(ax_pose *a0, axdata1 *a1, UnkSpriteMem *a2, unkStruct_2039DB0 * if (sSpriteCount >= 128) return; - sp.unk0 = a0->sprite; - sp.unk2 = a0->unk2; - sp.oam.attrib1 = a0->flags1 & ~(0x100 | 0x200); - sp.oam.attrib2 = a0->flags2 & ~(0x200 | 0x400 | 0x800); - sp.oam.attrib3 = a0->flags3; - sp.oam.unk6 = ((a0->flags2 & (0x200 | 0x400 | 0x800)) >> 9) | ((a0->flags1 & (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20 | 0x40 | 0x80 | 0x100 | 0x200)) << 4); - sprite = sUnknown_20262A8 + sSpriteCount; - r7 = a1->unk16 + sp.unk2.unk1; + spPtr = &sp; + spPtr->unk0 = a0->sprite; + spPtr->unk2 = a0->unk2; - if (r7 < 0) - r7 = 0; - if (r7 > 255) - r7 = 255; + spPtr->oam.attrib1 = a0->flags1 & ~(0x100 | 0x200); + 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); + sprite = &sUnknown_20262A8[sSpriteCount]; + spriteId = a1->unk16 + sp.unk2.unk1; + + if (spriteId < 0) + spriteId = 0; + if (spriteId > 255) + spriteId = 255; if (spriteMasks == NULL) { - CopySprite(sprite, &sp.oam); + SpriteCopy(sprite, &spPtr->oam); } else { - CopySpriteWithMasks(sprite, &sp.oam, spriteMasks); + SpriteCopyWithMasks(sprite, &spPtr->oam, spriteMasks); } // Set tileNum if (sp.unk2.unk0 != 0 && sUnknown_2025672[sp.unk2.unk0] != 0) { - s32 tileNum = sUnknown_2025672[sp.unk2.unk0]; - tileNum &= SPRITEOAM_MAX_TILENUM; - tileNum <<= SPRITEOAM_SHIFT_TILENUM; - sprite->attrib3 &= ~SPRITEOAM_MASK_TILENUM; - sprite->attrib3 |= tileNum; + SpriteSetTileNum(sprite, sUnknown_2025672[sp.unk2.unk0]); } else { // Animations add to existing tileNum - s32 newTileNum; - s32 tileNum = sprite->attrib3; - tileNum &= SPRITEOAM_MAX_TILENUM; - tileNum >>= SPRITEOAM_SHIFT_TILENUM; - - newTileNum = (tileNum + a1->vramTileOrMaybeAnimTimer) & SPRITEOAM_MAX_TILENUM; - newTileNum <<= SPRITEOAM_SHIFT_TILENUM; - sprite->attrib3 &= ~SPRITEOAM_MASK_TILENUM; - sprite->attrib3 |= newTileNum; + SpriteAddTileNum(sprite, a1->vramTileOrMaybeAnimTimer); } - x = ((sprite->attrib2 >> SPRITEOAM_SHIFT_X) & SPRITEOAM_MAX_X); - x += a1->pos.x - 0x100; - if (x < -64) + pos = SpriteGetX(sprite); + pos += a1->pos.x - 0x100; + + if (pos < -64) return; - if (x >= DISPLAY_WIDTH) + if (pos >= DISPLAY_WIDTH) return; - // Set x, maintain matrixNum/size - x &= SPRITEOAM_MAX_X; - x <<= SPRITEOAM_SHIFT_X; - sprite->attrib2 &= ~SPRITEOAM_MASK_X; - sprite->attrib2 |= x; + SpriteSetX(sprite, pos); - y = ((sprite->unk6 >> 4) & 0xFFF); - y += a1->pos.y - 0x200; - if (y < -64) + pos = SpriteGetY(sprite); + pos += a1->pos.y - 0x200; + if (pos < -64) return; - if (y >= DISPLAY_HEIGHT) + if (pos >= DISPLAY_HEIGHT) return; - // Set y, maintain affineMode/objMode/mosaic/bpp/shape - y &= SPRITEOAM_MAX_Y; - y <<= SPRITEOAM_SHIFT_Y; - sprite->attrib1 &= ~SPRITEOAM_MASK_Y; - sprite->attrib1 |= y; + SpriteSetOamY(sprite, pos); - // Set paletteNum, maintain tileNum/priority - - if (((sprite->unk6 >> 1) & SPRITEOAM_MAX_UNK6_1) == 0) { - s32 newPalNum = a1->paletteNum; - newPalNum &= SPRITEOAM_MAX_PALETTENUM; - newPalNum <<= SPRITEOAM_SHIFT_PALETTENUM; - sprite->attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - sprite->attrib3 |= newPalNum; + // Set paletteNum + if (!SpriteGetUnk6_1(sprite)) { + SpriteSetPalNum(sprite, a1->paletteNum); } if (sp.unk2.unk0 != 0) { - s32 newPalNum = sUnknown_2025682[sp.unk2.unk0]; - newPalNum &= SPRITEOAM_MAX_PALETTENUM; - newPalNum <<= SPRITEOAM_SHIFT_PALETTENUM; - sprite->attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - sprite->attrib3 |= newPalNum; + SpriteSetPalNum(sprite, sUnknown_2025682[sp.unk2.unk0]); } - sUnknown_2025EA8[sSpriteCount].unk0 = sUnknown_20256A0.sprites[r7].unk0; - sUnknown_20256A0.sprites[r7].unk0 = sUnknown_2025EA8 + sSpriteCount; + sUnknown_2025EA8[sSpriteCount].unk0 = sUnknown_20256A0.sprites[spriteId].unk0; + sUnknown_20256A0.sprites[spriteId].unk0 = sUnknown_2025EA8 + sSpriteCount; sSpriteCount++; } -#else -NAKED static void AddAxSprite(ax_pose *a0, axdata1 *a1, UnkSpriteMem *a2, unkStruct_2039DB0 *spriteMasks) -{ - asm_unified( - "push {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tsub sp, 0xC\n" - "\tadds r5, r0, 0\n" - "\tmov r8, r1\n" - "\tadds r0, r2, 0\n" - "\tadds r6, r3, 0\n" - "\tcmp r0, 0\n" - "\tbeq _08004EC2\n" - "\tbl RegisterSpriteParts_80052BC\n" -"_08004EC2:\n" - "\tldr r0, _08004F40\n" - "\tldr r7, [r0]\n" - "\tmov r12, r0\n" - "\tcmp r7, 0x7F\n" - "\tble _08004ECE\n" - "\tb _08005082\n" -"_08004ECE:\n" - "\tmov r2, sp\n" - "\tldrh r0, [r5]\n" - "\tstrh r0, [r2]\n" - "\tldrh r0, [r5, 0x2]\n" - "\tstrh r0, [r2, 0x2]\n" - "\tldrh r4, [r5, 0x4]\n" - "\tldr r0, _08004F44\n" - "\tands r0, r4\n" - "\tstrh r0, [r2, 0x4]\n" - "\tldrh r3, [r5, 0x6]\n" - "\tldr r0, _08004F48\n" - "\tands r0, r3\n" - "\tstrh r0, [r2, 0x6]\n" - "\tldrh r0, [r5, 0x8]\n" - "\tstrh r0, [r2, 0x8]\n" - "\tmovs r1, 0xE0\n" - "\tlsls r1, 4\n" - "\tands r1, r3\n" - "\tlsrs r1, 9\n" - "\tldr r0, _08004F4C\n" - "\tands r0, r4\n" - "\tlsls r0, 4\n" - "\torrs r1, r0\n" - "\tstrh r1, [r2, 0xA]\n" - "\tlsls r1, r7, 3\n" - "\tldr r0, _08004F50\n" - "\tadds r3, r1, r0\n" - "\tmov r0, r8\n" - "\tmovs r2, 0x16\n" - "\tldrsh r1, [r0, r2]\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0, 0x3]\n" - "\tlsls r0, 24\n" - "\tasrs r0, 24\n" - "\tadds r7, r1, r0\n" - "\tcmp r7, 0\n" - "\tbge _08004F1A\n" - "\tmovs r7, 0\n" -"_08004F1A:\n" - "\tcmp r7, 0xFF\n" - "\tble _08004F20\n" - "\tmovs r7, 0xFF\n" -"_08004F20:\n" - "\tcmp r6, 0\n" - "\tbne _08004F54\n" - "\tadd r2, sp, 0x4\n" - "\tldrh r0, [r2]\n" - "\tstrh r0, [r3]\n" - "\tadds r2, 0x2\n" - "\tldrh r0, [r2]\n" - "\tstrh r0, [r3, 0x2]\n" - "\tadds r2, 0x2\n" - "\tadds r1, r3, 0x4\n" - "\tldrh r0, [r2]\n" - "\tstrh r0, [r1]\n" - "\tadds r2, 0x2\n" - "\tldrh r0, [r2]\n" - "\tstrh r0, [r1, 0x2]\n" - "\tb _08004F86\n" - "\t.align 2, 0\n" -"_08004F40: .4byte sSpriteCount\n" -"_08004F44: .4byte 0x0000fcff\n" -"_08004F48: .4byte 0x0000f1ff\n" -"_08004F4C: .4byte 0x000003ff\n" -"_08004F50: .4byte sUnknown_20262A8\n" -"_08004F54:\n" - "\tadd r4, sp, 0x4\n" - "\tldrh r1, [r4]\n" - "\tldrh r0, [r6]\n" - "\tands r0, r1\n" - "\tldrh r1, [r6, 0x6]\n" - "\torrs r0, r1\n" - "\tstrh r0, [r3]\n" - "\tadds r4, 0x2\n" - "\tldrh r1, [r4]\n" - "\tldrh r0, [r6, 0x2]\n" - "\tands r0, r1\n" - "\tldrh r1, [r6, 0x8]\n" - "\torrs r0, r1\n" - "\tstrh r0, [r3, 0x2]\n" - "\tadds r4, 0x2\n" - "\tadds r2, r3, 0x4\n" - "\tldrh r1, [r4]\n" - "\tldrh r0, [r6, 0x4]\n" - "\tands r0, r1\n" - "\tldrh r1, [r6, 0xA]\n" - "\torrs r0, r1\n" - "\tstrh r0, [r2]\n" - "\tadds r4, 0x2\n" - "\tldrh r0, [r4]\n" - "\tstrh r0, [r2, 0x2]\n" -"_08004F86:\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0, 0x2]\n" - "\tcmp r0, 0\n" - "\tbeq _08004FB0\n" - "\tldr r1, _08004FA8\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0, 0x2]\n" - "\tlsls r0, 1\n" - "\tadds r1, r0, r1\n" - "\tmovs r4, 0\n" - "\tldrsh r0, [r1, r4]\n" - "\tcmp r0, 0\n" - "\tbeq _08004FB0\n" - "\tadds r1, r0, 0\n" - "\tldr r0, _08004FAC\n" - "\tands r1, r0\n" - "\tb _08004FC0\n" - "\t.align 2, 0\n" -"_08004FA8: .4byte sUnknown_2025672\n" -"_08004FAC: .4byte 0x000003ff\n" -"_08004FB0:\n" - "\tldrh r1, [r3, 0x4]\n" - "\tldr r2, _08005090\n" - "\tands r1, r2\n" - "\tmov r6, r8\n" - "\tmovs r4, 0x14\n" - "\tldrsh r0, [r6, r4]\n" - "\tadds r1, r0\n" - "\tands r1, r2\n" -"_08004FC0:\n" - "\tldrh r2, [r3, 0x4]\n" - "\tmovs r0, 0xFC\n" - "\tlsls r0, 8\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrh r0, [r3, 0x4]\n" - "\tldrh r4, [r3, 0x2]\n" - "\tldr r5, _08005094\n" - "\tadds r2, r5, 0\n" - "\tands r2, r4\n" - "\tldr r6, _08005098\n" - "\tadds r1, r2, r6\n" - "\tmov r2, r8\n" - "\tmovs r6, 0\n" - "\tldrsh r0, [r2, r6]\n" - "\tadds r2, r1, r0\n" - "\tmovs r0, 0x40\n" - "\tnegs r0, r0\n" - "\tmov r9, r0\n" - "\tcmp r2, r9\n" - "\tblt _08005082\n" - "\tcmp r2, 0xEF\n" - "\tbgt _08005082\n" - "\tands r2, r5\n" - "\tmovs r0, 0xFE\n" - "\tlsls r0, 8\n" - "\tands r0, r4\n" - "\torrs r0, r2\n" - "\tstrh r0, [r3, 0x2]\n" - "\tldrh r0, [r3, 0x6]\n" - "\tlsls r4, r0, 16\n" - "\tldr r1, _0800509C\n" - "\tadds r5, r1, 0\n" - "\tlsrs r2, r4, 20\n" - "\tldr r6, _080050A0\n" - "\tadds r1, r2, r6\n" - "\tmov r2, r8\n" - "\tmovs r6, 0x2\n" - "\tldrsh r0, [r2, r6]\n" - "\tadds r2, r1, r0\n" - "\tcmp r2, r9\n" - "\tblt _08005082\n" - "\tcmp r2, 0x9F\n" - "\tbgt _08005082\n" - "\tmovs r0, 0xFF\n" - "\tands r2, r0\n" - "\tldrh r1, [r3]\n" - "\tmovs r0, 0xFF\n" - "\tlsls r0, 8\n" - "\tands r0, r1\n" - "\torrs r0, r2\n" - "\tstrh r0, [r3]\n" - "\tlsrs r0, r4, 17\n" - "\tmovs r1, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _08005044\n" - "\tmov r0, r8\n" - "\tldrb r1, [r0, 0x1E]\n" - "\tmovs r0, 0xF\n" - "\tands r1, r0\n" - "\tlsls r1, 12\n" - "\tldrh r0, [r3, 0x4]\n" - "\tands r0, r5\n" - "\torrs r0, r1\n" - "\tstrh r0, [r3, 0x4]\n" -"_08005044:\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0, 0x2]\n" - "\tcmp r0, 0\n" - "\tbeq _08005068\n" - "\tldr r1, _080050A4\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0, 0x2]\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r2, 0\n" - "\tldrsh r1, [r0, r2]\n" - "\tmovs r0, 0xF\n" - "\tands r1, r0\n" - "\tlsls r1, 12\n" - "\tldrh r0, [r3, 0x4]\n" - "\tands r0, r5\n" - "\torrs r0, r1\n" - "\tstrh r0, [r3, 0x4]\n" -"_08005068:\n" - "\tldr r0, _080050A8\n" - "\tmov r4, r12\n" - "\tldr r3, [r4]\n" - "\tlsls r2, r3, 3\n" - "\tadds r2, r0\n" - "\tldr r1, _080050AC\n" - "\tlsls r0, r7, 3\n" - "\tadds r0, r1\n" - "\tldr r1, [r0]\n" - "\tstr r1, [r2]\n" - "\tstr r2, [r0]\n" - "\tadds r3, 0x1\n" - "\tstr r3, [r4]\n" -"_08005082:\n" - "\tadd sp, 0xC\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" -"_08005090: .4byte 0x000003ff\n" -"_08005094: .4byte 0x000001ff\n" -"_08005098: .4byte 0xffffff00\n" -"_0800509C: .4byte 0x00000fff\n" -"_080050A0: .4byte 0xfffffe00\n" -"_080050A4: .4byte sUnknown_2025682\n" -"_080050A8: .4byte sUnknown_2025EA8\n" -"_080050AC: .4byte sUnknown_20256A0"); -} - -#endif // NONMATCHING // a2 and spriteMasks are always called with NULL lol void AddSprite(struct SpriteOAM *a0, s32 a1, struct UnkSpriteMem *a2, struct unkStruct_2039DB0 *spriteMasks) { @@ -569,13 +271,13 @@ void AddSprite(struct SpriteOAM *a0, s32 a1, struct UnkSpriteMem *a2, struct unk a1 = 255; if (spriteMasks == NULL) { - CopySprite(spr, a0); + SpriteCopy(spr, a0); } else { - CopySpriteWithMasks(spr, a0, spriteMasks); + SpriteCopyWithMasks(spr, a0, spriteMasks); } - yPos = spr->unk6 >> SPRITEOAM_SHIFT_UNK6_4; + yPos = spr->unk6 >> SPRITEOAM_SHIFT_WORKING_Y; nullsub_3(yPos, 0); yPos &= SPRITEOAM_MAX_Y; spr->attrib1 &= ~SPRITEOAM_MASK_Y; diff --git a/src/string_format.c b/src/string_format.c index 14731ca7f..7516b9934 100644 --- a/src/string_format.c +++ b/src/string_format.c @@ -527,49 +527,25 @@ void DrawDialogueBoxString(void) if (!buttonPress) { sArrowFrames++; if (!(sUnknownTextFlags & 0x2) && sArrowFrames & 8) { - u32 shape, tileNum, palNum, pal; - - sDialogueBoxArrowSprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; - sDialogueBoxArrowSprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; - sDialogueBoxArrowSprite.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; - sDialogueBoxArrowSprite.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; - sDialogueBoxArrowSprite.attrib1 &= ~SPRITEOAM_MASK_BPP; - - shape = 1; - shape <<= SPRITEOAM_SHIFT_SHAPE; - sDialogueBoxArrowSprite.attrib1 &= ~SPRITEOAM_MASK_SHAPE; - sDialogueBoxArrowSprite.attrib1 |= shape; - - sDialogueBoxArrowSprite.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; - sDialogueBoxArrowSprite.attrib2 &= ~SPRITEOAM_MASK_SIZE; - - tileNum = 0x3F0 << SPRITEOAM_SHIFT_TILENUM; - sDialogueBoxArrowSprite.attrib3 &= ~SPRITEOAM_MASK_TILENUM; - sDialogueBoxArrowSprite.attrib3 |= tileNum; - - sDialogueBoxArrowSprite.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; - - pal = 15; - palNum = (pal & SPRITEOAM_MAX_PALETTENUM) << SPRITEOAM_SHIFT_PALETTENUM; - sDialogueBoxArrowSprite.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; - sDialogueBoxArrowSprite.attrib3 |= palNum; + SpriteSetAffine1(&sDialogueBoxArrowSprite, 0); + SpriteSetAffine2(&sDialogueBoxArrowSprite, 0); + SpriteSetObjMode(&sDialogueBoxArrowSprite, 0); + SpriteSetMosaic(&sDialogueBoxArrowSprite, 0); + SpriteSetBpp(&sDialogueBoxArrowSprite, 0); + SpriteSetShape(&sDialogueBoxArrowSprite, 1); + SpriteSetMatrixNum(&sDialogueBoxArrowSprite, 0); + SpriteSetSize(&sDialogueBoxArrowSprite, 0); + SpriteSetTileNum(&sDialogueBoxArrowSprite, 0x3F0); + SpriteSetPriority(&sDialogueBoxArrowSprite, 0); + SpriteSetPalNum(&sDialogueBoxArrowSprite, 15); if (sUnknownTextFlags & 0x10) { - u32 var = (0x78 & SPRITEOAM_MAX_UNK6_4) << SPRITEOAM_SHIFT_UNK6_4; - sDialogueBoxArrowSprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - sDialogueBoxArrowSprite.unk6 |= var; - sDialogueBoxArrowSprite.attrib2 &= ~SPRITEOAM_MASK_X; - sDialogueBoxArrowSprite.attrib2 |= (0x70 & SPRITEOAM_MAX_X) << SPRITEOAM_SHIFT_X; + SpriteSetY(&sDialogueBoxArrowSprite, 120); + SpriteSetX(&sDialogueBoxArrowSprite, 112); } else { - s16 x; - - u32 var = ((gUnknown_202E748.unkA + 1) & SPRITEOAM_MAX_UNK6_4) << SPRITEOAM_SHIFT_UNK6_4; - sDialogueBoxArrowSprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; - sDialogueBoxArrowSprite.unk6 |= var; - x = gUnknown_202E748.unk8; - sDialogueBoxArrowSprite.attrib2 &= ~SPRITEOAM_MASK_X; - sDialogueBoxArrowSprite.attrib2 |= (x & SPRITEOAM_MAX_X) << SPRITEOAM_SHIFT_X; + SpriteSetY(&sDialogueBoxArrowSprite, gUnknown_202E748.unkA + 1); + SpriteSetX(&sDialogueBoxArrowSprite, gUnknown_202E748.unk8); } AddSprite(&sDialogueBoxArrowSprite, 0x100, NULL, NULL); diff --git a/src/unk_menu_203B360.c b/src/unk_menu_203B360.c index 2c3e7ea06..7b2e37de1 100644 --- a/src/unk_menu_203B360.c +++ b/src/unk_menu_203B360.c @@ -127,66 +127,26 @@ u32 sub_80383D4(void) void sub_8038440(void) { -#ifdef NONMATCHING // SpriteOAM memes - u32 r0; - u32 r2; -#else - register u32 r0 asm("r0"); - register u32 r2 asm("r2"); -#endif - u32 r1; - u32 r4; - u32 r5; - SpriteOAM *sprite; + SpriteSetAffine1(&sUnknown_203B360->unk1A8, 0); + SpriteSetAffine2(&sUnknown_203B360->unk1A8, 0); + SpriteSetObjMode(&sUnknown_203B360->unk1A8, 0); + SpriteSetMosaic(&sUnknown_203B360->unk1A8, 0); + SpriteSetBpp(&sUnknown_203B360->unk1A8, 0); + SpriteSetShape(&sUnknown_203B360->unk1A8, 1); - r5 = 0; - sprite = &sUnknown_203B360->unk1A8; + SpriteSetTileNum(&sUnknown_203B360->unk1A8, 0x3F0); + SpriteSetPriority(&sUnknown_203B360->unk1A8, 0); + SpriteSetPalNum(&sUnknown_203B360->unk1A8, 15); - r1 = sprite->attrib1; - r0 = (u16)~SPRITEOAM_MASK_AFFINEMODE1; - r0 &= r1; + SpriteSetMatrixNum(&sUnknown_203B360->unk1A8, 0); + SpriteSetSize(&sUnknown_203B360->unk1A8, 0); - r0 &= (u16)~SPRITEOAM_MASK_AFFINEMODE2; + SpriteSetX(&sUnknown_203B360->unk1A8, 112); + SpriteSetY(&sUnknown_203B360->unk1A8, 112); - r0 &= (u16)~SPRITEOAM_MASK_OBJMODE; - - r0 &= (u16)~SPRITEOAM_MASK_MOSAIC; - - r0 &= (u16)~SPRITEOAM_MASK_BPP; - - r2 = 1 << SPRITEOAM_SHIFT_SHAPE; - r0 &= (u16)~SPRITEOAM_MASK_SHAPE; - r0 |= r2; - - sprite->attrib1 = r0; - - r2 = 0x3F0 << SPRITEOAM_SHIFT_TILENUM; - r1 = sprite->attrib3; - r0 = (u16)~SPRITEOAM_MASK_TILENUM; - r0 &= r1; - r0 |= r2; - - r0 &= (u16)~SPRITEOAM_MASK_PRIORITY; - - r2 = (u16)~SPRITEOAM_MASK_UNK6_4; - - r4 = 15 << SPRITEOAM_SHIFT_PALETTENUM; - r0 &= (u16)~SPRITEOAM_MASK_PALETTENUM; - r0 |= r4; - - sprite->attrib3 = r0; - - sprite->attrib2 = 112; // Set x to 112. Set matrixNum/size to 0 - - r1 = 112 << SPRITEOAM_SHIFT_UNK6_4; - r2 &= sprite->unk6; - r2 |= r1; - sprite->unk6 = r2; - - sUnknown_203B360->unk1B0 = r5; + sUnknown_203B360->unk1B0 = 0; } - void sub_80384D0(void) { if ((sUnknown_203B360->unk1B0 & 8) != 0) {