Merge pull request #308 from DizzyEggg/sprite_oams
Some checks are pending
GithubCI / build (push) Waiting to run

This commit is contained in:
Seth Barberee
2024-12-23 09:45:47 -08:00
committed by GitHub
15 changed files with 550 additions and 1815 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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)

View File

@@ -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);

View File

@@ -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;

View File

@@ -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++;

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);

View File

@@ -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) {