mirror of
https://github.com/pret/pmd-red.git
synced 2026-06-16 13:40:31 -05:00
1013 lines
24 KiB
C
1013 lines
24 KiB
C
#include "global.h"
|
|
#include "cpu.h"
|
|
#include "random.h"
|
|
#include "sprite.h"
|
|
|
|
static EWRAM_DATA u16 sOAMSpriteCount = {0}; // 2025670 Written to but never read
|
|
#ifndef NONMATCHING
|
|
UNUSED // TODO: Remove the "UNUSED" attribute after sub_8004EA8 is done
|
|
#endif
|
|
static EWRAM_DATA s16 sUnknown_2025672[8] = {0};
|
|
#ifndef NONMATCHING
|
|
UNUSED // TODO: Remove the "UNUSED" attribute after sub_8004EA8 is done
|
|
#endif
|
|
static EWRAM_DATA s16 sUnknown_2025682[9] = {0};
|
|
static EWRAM_DATA Position sUnknown_2025694 = {0};
|
|
static EWRAM_DATA u32 sUnknown_2025698 = {0};
|
|
UNUSED static EWRAM_DATA u32 sUnused1 = {0}; // 202569C
|
|
static EWRAM_DATA SpriteList sUnknown_20256A0 = {0};
|
|
static EWRAM_DATA UnkSpriteLink sUnknown_2025EA8[128] = {0};
|
|
static EWRAM_DATA SpriteOAM sUnknown_20262A8[128] = {0};
|
|
static EWRAM_DATA s32 sSpriteCount = {0}; // 20266A8
|
|
UNUSED static EWRAM_DATA u32 sUnused2 = {0}; // 20266AC
|
|
static EWRAM_DATA unkStruct_20266B0 sUnknown_20266B0[160] = {0};
|
|
static EWRAM_DATA void *sCharMemCursor = {0}; // 2026E30
|
|
UNUSED static EWRAM_DATA u32 sUnused3 = {0}; // 2026E34
|
|
|
|
static EWRAM_DATA_2 unkStruct_20266B0 *sUnknown_203B074 = {0};
|
|
|
|
// code.c
|
|
extern void nullsub_3(s32, s32);
|
|
|
|
#ifndef NONMATCHING
|
|
UNUSED // TODO: Remove the "UNUSED" attribute after sub_8004EA8 is done
|
|
#endif
|
|
static void RegisterSpriteParts_80052BC(UnkSpriteMem *);
|
|
|
|
static void sub_800545C(EntitySpriteInfo *, Dungeon_ax *, u32, u32, u32, bool8);
|
|
|
|
void InitSprites(void)
|
|
{
|
|
ResetSprites(TRUE);
|
|
SetSavingIconCoords(NULL);
|
|
}
|
|
|
|
void ResetSprites(bool8 a0)
|
|
{
|
|
s32 i;
|
|
UnkSpriteLink *a;
|
|
UnkSpriteLink *b;
|
|
SpriteOAM *c;
|
|
SpriteOAM *d;
|
|
UnkSpriteLink *e;
|
|
|
|
sSpriteCount = 0;
|
|
sCharMemCursor = OBJ_VRAM0;
|
|
sUnknown_203B074 = &sUnknown_20266B0[0];
|
|
|
|
a = &sUnknown_20256A0.sprites[0];
|
|
b = a + 1;
|
|
|
|
// 16 loops, very smart
|
|
for (i = 0; i < 256; i += 16) {
|
|
c = NULL;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
a->unk0 = b;
|
|
a->unk4 = c;
|
|
a++;
|
|
b++;
|
|
}
|
|
|
|
if (a0) {
|
|
e = NULL;
|
|
d = &sUnknown_20262A8[0];
|
|
a = &sUnknown_2025EA8[0];
|
|
for (i = 0; i < 128; i++) {
|
|
a->unk0 = e;
|
|
a->unk4 = d;
|
|
d++;
|
|
a++;
|
|
}
|
|
}
|
|
|
|
sUnknown_20256A0.unk800 = 0;
|
|
sUnknown_20256A0.unk804 = 0;
|
|
}
|
|
|
|
void sub_8004E8C(unkStruct_2039DB0 *a0)
|
|
{
|
|
a0->unk0 = 0xFFFF;
|
|
a0->unk2 = -1;
|
|
a0->unk4 = 0xFFFF;
|
|
a0->unk6 = 0;
|
|
a0->unk8 = 0;
|
|
a0->unkA = 0;
|
|
}
|
|
|
|
// https://decomp.me/scratch/VYqKb
|
|
// spriteMasks is a u16[6]
|
|
#ifdef NONMATCHING
|
|
static void sub_8004EA8(ax_pose *a0, axdata1 *a1, UnkSpriteMem *a2, u16 *spriteMasks)
|
|
{
|
|
// size: 0xC
|
|
struct UnkStackFor8004EA8
|
|
{
|
|
u16 unk0;
|
|
u8 unk2;
|
|
s8 unk3;
|
|
u16 flags1;
|
|
u16 flags2;
|
|
u16 flags3;
|
|
u16 unkA;
|
|
} sp;
|
|
SpriteOAM *sprite;
|
|
u32 uVar9;
|
|
s32 r7;
|
|
|
|
s32 x;
|
|
s32 y;
|
|
s32 tileNum;
|
|
s32 earlyMask;
|
|
|
|
if (a2 != NULL)
|
|
RegisterSpriteParts_80052BC(a2);
|
|
|
|
if (sSpriteCount >= 128)
|
|
return;
|
|
|
|
sp.unk0 = a0->sprite;
|
|
*((u16 *)&sp.unk2) = a0->unk2; // ?????????
|
|
sp.flags1 = a0->flags1 & ~(0x100 | 0x200);
|
|
sp.flags2 = a0->flags2 & ~(0x200 | 0x400 | 0x800);
|
|
sp.flags3 = a0->flags3;
|
|
sp.unkA = ((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.unk3;
|
|
|
|
if (r7 < 0)
|
|
r7 = 0;
|
|
if (r7 > 255)
|
|
r7 = 255;
|
|
|
|
if (spriteMasks == NULL) {
|
|
sprite->attrib1 = sp.flags1;
|
|
sprite->attrib2 = sp.flags2;
|
|
sprite->attrib3 = sp.flags3;
|
|
sprite->unk6 = sp.unkA;
|
|
}
|
|
else {
|
|
sprite->attrib1 = (spriteMasks[0] & sp.flags1) | spriteMasks[3];
|
|
sprite->attrib2 = (spriteMasks[1] & sp.flags2) | spriteMasks[4];
|
|
sprite->attrib3 = (spriteMasks[2] & sp.flags3) | spriteMasks[5];
|
|
sprite->unk6 = sp.unkA;
|
|
}
|
|
|
|
if (sp.unk2 != 0 && sUnknown_2025672[sp.unk2] != 0) {
|
|
tileNum = sUnknown_2025672[sp.unk2] & 0x3FF;
|
|
}
|
|
else {
|
|
tileNum = (sprite->attrib3 & 0x3FF) + a1->vramTileOrMaybeAnimTimer;
|
|
tileNum &= 0x3FF;
|
|
}
|
|
|
|
// Set tileNum, maintain priority/paletteNum
|
|
sprite->attrib3 = tileNum | (sprite->attrib3 & 0xFC00);
|
|
|
|
x = (sprite->attrib2 & 0x1FF) - 256;
|
|
x += a1->xPos;
|
|
if (x < -64)
|
|
return;
|
|
if (x >= DISPLAY_WIDTH)
|
|
return;
|
|
|
|
// Set x, maintain matrixNum/size
|
|
sprite->attrib2 = (x & 0x1FF) | (sprite->attrib2 & 0xFE00);
|
|
|
|
uVar9 = sprite->unk6 << 16;
|
|
earlyMask = 0xFFF;
|
|
|
|
y = (uVar9 >> 20) - 512;
|
|
y += a1->yPos;
|
|
if (y < -64)
|
|
return;
|
|
if (y >= DISPLAY_HEIGHT)
|
|
return;
|
|
|
|
// Set y, maintain affineMode/objMode/mosaic/bpp/shape
|
|
sprite->attrib1 = (y & 0xFF) | (sprite->attrib1 & 0xFF00);
|
|
|
|
// Set paletteNum, maintain tileNum/priority
|
|
if (((uVar9 >> 17) & 1) == 0)
|
|
sprite->attrib3 = ((a1->paletteNum & 0xF) << 12) | (sprite->attrib3 & earlyMask);
|
|
|
|
if (sp.unk2 != 0)
|
|
sprite->attrib3 = ((sUnknown_2025682[sp.unk2] & 0xF) << 12) | (sprite->attrib3 & earlyMask);
|
|
|
|
sUnknown_2025EA8[sSpriteCount].unk0 = sUnknown_20256A0.sprites[r7].unk0;
|
|
sUnknown_20256A0.sprites[r7].unk0 = sUnknown_2025EA8 + sSpriteCount;
|
|
sSpriteCount++;
|
|
}
|
|
#else
|
|
NAKED
|
|
static void sub_8004EA8(ax_pose *a0, axdata1 *a1, UnkSpriteMem *a2, u16 *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 a3 are always called with NULL lol
|
|
#ifdef NONMATCHING // https://decomp.me/scratch/YCfKG
|
|
void AddSprite(SpriteOAM *a0, s32 a1, UnkSpriteMem *a2, unkStruct_2039DB0 *a3)
|
|
{
|
|
s32 yPos;
|
|
SpriteOAM *spr;
|
|
UnkSpriteLink *a;
|
|
UnkSpriteLink *b;
|
|
|
|
if (sSpriteCount >= 128)
|
|
return;
|
|
|
|
spr = &sUnknown_20262A8[sSpriteCount];
|
|
|
|
if (a1 < 0)
|
|
a1 = 0;
|
|
if (a1 > 255)
|
|
a1 = 255;
|
|
|
|
if (a3 == NULL) {
|
|
spr->attrib1 = a0->attrib1;
|
|
spr->attrib2 = a0->attrib2;
|
|
spr->attrib3 = a0->attrib3;
|
|
spr->unk6 = a0->unk6;
|
|
}
|
|
else {
|
|
spr->attrib1 = (a0->attrib1 & a3->unk0) | a3->unk6;
|
|
spr->attrib2 = (a0->attrib2 & a3->unk2) | a3->unk8;
|
|
spr->attrib3 = (a0->attrib3 & a3->unk4) | a3->unkA;
|
|
spr->unk6 = a0->unk6;
|
|
}
|
|
|
|
yPos = spr->unk6 / 16;
|
|
nullsub_3(yPos, 0);
|
|
yPos &= SPRITEOAM_MAX_Y;
|
|
spr->attrib1 &= ~SPRITEOAM_MASK_Y;
|
|
spr->attrib1 |= yPos;
|
|
|
|
if (a2 != NULL)
|
|
RegisterSpriteParts_80052BC(a2);
|
|
|
|
a = &sUnknown_2025EA8[0];
|
|
a += sSpriteCount;
|
|
b = &sUnknown_20256A0.sprites[0];
|
|
b += a1;
|
|
a->unk0 = b->unk0;
|
|
b->unk0 = a;
|
|
|
|
sSpriteCount++;
|
|
}
|
|
#else
|
|
NAKED
|
|
void AddSprite(SpriteOAM *a0, s32 a1, UnkSpriteMem *a2, unkStruct_2039DB0 *a3)
|
|
{
|
|
asm_unified(
|
|
"push {r4-r7,lr}\n"
|
|
"\tmov r7, r8\n"
|
|
"\tpush {r7}\n"
|
|
"\tadds r6, r0, 0\n"
|
|
"\tadds r7, r1, 0\n"
|
|
"\tmov r8, r2\n"
|
|
"\tadds r4, r3, 0\n"
|
|
"\tldr r0, _080050F4\n"
|
|
"\tldr r0, [r0]\n"
|
|
"\tcmp r0, 0x7F\n"
|
|
"\tbgt _08005168\n"
|
|
"\tlsls r1, r0, 3\n"
|
|
"\tldr r0, _080050F8\n"
|
|
"\tadds r5, r1, r0\n"
|
|
"\tcmp r7, 0\n"
|
|
"\tbge _080050D2\n"
|
|
"\tmovs r7, 0\n"
|
|
"_080050D2:\n"
|
|
"\tcmp r7, 0xFF\n"
|
|
"\tble _080050D8\n"
|
|
"\tmovs r7, 0xFF\n"
|
|
"_080050D8:\n"
|
|
"\tcmp r4, 0\n"
|
|
"\tbne _080050FC\n"
|
|
"\tldrh r0, [r6]\n"
|
|
"\tstrh r0, [r5]\n"
|
|
"\tldrh r0, [r6, 0x2]\n"
|
|
"\tstrh r0, [r5, 0x2]\n"
|
|
"\tadds r1, r6, 0x4\n"
|
|
"\tadds r2, r5, 0x4\n"
|
|
"\tldrh r0, [r1]\n"
|
|
"\tstrh r0, [r2]\n"
|
|
"\tldrh r0, [r1, 0x2]\n"
|
|
"\tstrh r0, [r2, 0x2]\n"
|
|
"\tb _08005128\n"
|
|
"\t.align 2, 0\n"
|
|
"_080050F4: .4byte sSpriteCount\n"
|
|
"_080050F8: .4byte sUnknown_20262A8\n"
|
|
"_080050FC:\n"
|
|
"\tldrh r1, [r6]\n"
|
|
"\tldrh r0, [r4]\n"
|
|
"\tands r0, r1\n"
|
|
"\tldrh r1, [r4, 0x6]\n"
|
|
"\torrs r0, r1\n"
|
|
"\tstrh r0, [r5]\n"
|
|
"\tldrh r1, [r6, 0x2]\n"
|
|
"\tldrh r0, [r4, 0x2]\n"
|
|
"\tands r0, r1\n"
|
|
"\tldrh r1, [r4, 0x8]\n"
|
|
"\torrs r0, r1\n"
|
|
"\tstrh r0, [r5, 0x2]\n"
|
|
"\tadds r2, r6, 0x4\n"
|
|
"\tadds r3, r5, 0x4\n"
|
|
"\tldrh r1, [r2]\n"
|
|
"\tldrh r0, [r4, 0x4]\n"
|
|
"\tands r0, r1\n"
|
|
"\tldrh r1, [r4, 0xA]\n"
|
|
"\torrs r0, r1\n"
|
|
"\tstrh r0, [r3]\n"
|
|
"\tldrh r0, [r2, 0x2]\n"
|
|
"\tstrh r0, [r3, 0x2]\n"
|
|
"_08005128:\n"
|
|
"\tldrh r4, [r5, 0x6]\n"
|
|
"\tlsrs r4, 4\n"
|
|
"\tadds r0, r4, 0\n"
|
|
"\tmovs r1, 0\n"
|
|
"\tbl nullsub_3\n"
|
|
"\tmovs r0, 0xFF\n"
|
|
"\tands r4, r0\n"
|
|
"\tldrh r1, [r5]\n"
|
|
"\tmovs r0, 0xFF\n"
|
|
"\tlsls r0, 8\n"
|
|
"\tands r0, r1\n"
|
|
"\torrs r0, r4\n"
|
|
"\tstrh r0, [r5]\n"
|
|
"\tmov r0, r8\n"
|
|
"\tcmp r0, 0\n"
|
|
"\tbeq _0800514E\n"
|
|
"\tbl RegisterSpriteParts_80052BC\n"
|
|
"_0800514E:\n"
|
|
"\tldr r0, _08005174\n"
|
|
"\tldr r4, _08005178\n"
|
|
"\tldr r3, [r4]\n"
|
|
"\tlsls r2, r3, 3\n"
|
|
"\tadds r2, r0\n"
|
|
"\tldr r1, _0800517C\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"
|
|
"_08005168:\n"
|
|
"\tpop {r3}\n"
|
|
"\tmov r8, r3\n"
|
|
"\tpop {r4-r7}\n"
|
|
"\tpop {r0}\n"
|
|
"\tbx r0\n"
|
|
"\t.align 2, 0\n"
|
|
"_08005174: .4byte sUnknown_2025EA8\n"
|
|
"_08005178: .4byte sSpriteCount\n"
|
|
"_0800517C: .4byte sUnknown_20256A0");
|
|
}
|
|
#endif
|
|
|
|
void sub_8005180(void)
|
|
{
|
|
UnkSpriteLink *r1;
|
|
UnkSpriteLink *r2;
|
|
|
|
r2 = &sUnknown_20256A0.sprites[0];
|
|
r1 = r2;
|
|
|
|
if (r2 != NULL) {
|
|
do {
|
|
if (r1->unk4 != NULL) {
|
|
if (r2 != NULL)
|
|
r2->unk0 = r1;
|
|
r2 = r1;
|
|
}
|
|
r1 = r1->unk0;
|
|
} while (r1 != NULL);
|
|
}
|
|
|
|
r2->unk0 = NULL;
|
|
}
|
|
|
|
void CopySpritesToOam(void)
|
|
{
|
|
UnkSpriteLink *sLink;
|
|
SpriteOAM *spr;
|
|
vu16 *oam;
|
|
s32 count;
|
|
|
|
sLink = &sUnknown_20256A0.sprites[0];
|
|
oam = (vu16 *)(OAM + OAM_SIZE); // End of OAM. Work backwards
|
|
count = 0;
|
|
|
|
while (sLink != NULL && (u32)oam > (OAM + sizeof(struct OamData))) {
|
|
spr = sLink->unk4;
|
|
|
|
// Each OAM entry is 8 bytes [struct OamData]
|
|
if (spr != NULL) {
|
|
// Skip affineParam
|
|
oam -= 2;
|
|
// Set tileNum/priority/paletteNum
|
|
*oam = spr->attrib3;
|
|
// Set x/matrixNum/size
|
|
oam--;
|
|
*oam = spr->attrib2;
|
|
// Set y/affineMode/objMode/mosaic/bpp/shape
|
|
oam--;
|
|
*oam = spr->attrib1;
|
|
|
|
count++;
|
|
}
|
|
|
|
sLink = sLink->unk0;
|
|
}
|
|
|
|
// Clear remaining object slots
|
|
while ((u32)oam > (OAM + sizeof(struct OamData))) {
|
|
// Skip affineParam
|
|
oam -= 2;
|
|
// Set tileNum/priority/paletteNum
|
|
*oam = 0;
|
|
// Set x/matrixNum/size
|
|
oam--;
|
|
*oam = 0;
|
|
// Set y/affineMode/objMode/mosaic/bpp/shape
|
|
oam--;
|
|
*oam = DISPLAY_HEIGHT;
|
|
}
|
|
|
|
sOAMSpriteCount = count;
|
|
}
|
|
|
|
void SetSavingIconCoords(Position *pos)
|
|
{
|
|
if (pos == NULL) {
|
|
sUnknown_2025694.x = 0;
|
|
sUnknown_2025694.y = DISPLAY_HEIGHT;
|
|
}
|
|
else {
|
|
sUnknown_2025694.x = pos->x;
|
|
sUnknown_2025694.y = pos->y;
|
|
sUnknown_2025698 = 0;
|
|
}
|
|
}
|
|
|
|
void BlinkSavingIcon(void)
|
|
{
|
|
vu16 *oam;
|
|
u32 uVar1;
|
|
|
|
oam = (vu16 *)OAM;
|
|
uVar1 = sUnknown_2025698++;
|
|
|
|
if (uVar1 & 16) {
|
|
// Set y to 160
|
|
// Set affineMode/objMode/mosaic/bpp/shape to 0
|
|
*oam++ = DISPLAY_HEIGHT;
|
|
// Set x/matrixNum to 0
|
|
// Set size to 1
|
|
*oam++ = 0x4000;
|
|
// Set tileNum to 0x3FC
|
|
// Set priority to 0
|
|
// Set paletteNum to 15
|
|
*oam++ = 0xF3FC;
|
|
// Set affineParam to 0
|
|
*oam = 0;
|
|
}
|
|
else {
|
|
// Set y to sUnknown_2025694.y
|
|
// Set affineMode/objMode/mosaic/bpp/shape to 0
|
|
*oam++ = sUnknown_2025694.y;
|
|
// Set x to sUnknown_2025694.x
|
|
// Set matrixNum to 0
|
|
// Set size to 1
|
|
*oam++ = sUnknown_2025694.x + 0x4000;
|
|
// Set tileNum to 0x3FC
|
|
// Set priority to 0
|
|
// Set paletteNum to 15
|
|
*oam++ = 0xF3FC;
|
|
// Set affineParam to 0
|
|
*oam = 0;
|
|
}
|
|
}
|
|
|
|
#ifdef NONMATCHING // https://decomp.me/scratch/taTIU
|
|
extern u32 RegisterSpriteParts_80052BC_end[0] asm("sCharMemCursor");
|
|
static void RegisterSpriteParts_80052BC(UnkSpriteMem *a0)
|
|
{
|
|
if (a0->byteCount) {
|
|
unkStruct_20266B0 **r5 = &sUnknown_203B074;
|
|
void *r6 = RegisterSpriteParts_80052BC_end;
|
|
void **r4 = &sCharMemCursor;
|
|
do {
|
|
unkStruct_20266B0 *r2 = *r5;
|
|
if ((uintptr_t)r2 >= (uintptr_t)r6)
|
|
return;
|
|
r2->byteCount = a0->byteCount;
|
|
r2->src = a0->src;
|
|
r2->dest = *r4;
|
|
*r4 = r2->dest + a0->byteCount;
|
|
*r5 = r2 + 1;
|
|
a0++;
|
|
} while (a0->byteCount);
|
|
}
|
|
}
|
|
#else
|
|
UNUSED // TODO: Remove the "UNUSED" attribute after sub_8004EA8 is done
|
|
NAKED
|
|
static void RegisterSpriteParts_80052BC(UnkSpriteMem *a0)
|
|
{
|
|
asm_unified(
|
|
"push {r4-r6,lr}\n"
|
|
"\tadds r3, r0, 0\n"
|
|
"\tldr r0, [r3, 0x4]\n"
|
|
"\tcmp r0, 0\n"
|
|
"\tbeq _080052F2\n"
|
|
"\tldr r5, _080052F8\n"
|
|
"\tldr r6, _080052FC\n"
|
|
"\tldr r4, _08005300\n"
|
|
"_080052CC:\n"
|
|
"\tldr r2, [r5]\n"
|
|
"\tcmp r2, r6\n"
|
|
"\tbcs _080052F2\n"
|
|
"\tldr r0, [r3, 0x4]\n"
|
|
"\tstr r0, [r2]\n"
|
|
"\tldr r0, [r3]\n"
|
|
"\tstr r0, [r2, 0x4]\n"
|
|
"\tldr r1, [r4]\n"
|
|
"\tstr r1, [r2, 0x8]\n"
|
|
"\tldr r0, [r3, 0x4]\n"
|
|
"\tadds r1, r0\n"
|
|
"\tstr r1, [r4]\n"
|
|
"\tadds r0, r2, 0\n"
|
|
"\tadds r0, 0xC\n"
|
|
"\tstr r0, [r5]\n"
|
|
"\tadds r3, 0x8\n"
|
|
"\tldr r0, [r3, 0x4]\n"
|
|
"\tcmp r0, 0\n"
|
|
"\tbne _080052CC\n"
|
|
"_080052F2:\n"
|
|
"\tpop {r4-r6}\n"
|
|
"\tpop {r0}\n"
|
|
"\tbx r0\n"
|
|
"\t.align 2, 0\n"
|
|
"_080052F8: .4byte sUnknown_203B074\n"
|
|
"_080052FC: .4byte sCharMemCursor\n"
|
|
"_08005300: .4byte sCharMemCursor");
|
|
}
|
|
#endif // NONMATCHING
|
|
|
|
void sub_8005304(void)
|
|
{
|
|
unkStruct_20266B0 *s;
|
|
|
|
for (s = &sUnknown_20266B0[0]; s < sUnknown_203B074; s++) {
|
|
if (s->src != NULL)
|
|
CpuCopy(s->dest, s->src, s->byteCount);
|
|
else
|
|
CpuClear(s->dest, s->byteCount);
|
|
}
|
|
}
|
|
|
|
// spriteMasks is a u16[6]
|
|
void sub_800533C(ax_pose **a0, UnkSpriteMem **a1, axdata1 *a2, u16 *spriteMasks, bool8 a4)
|
|
{
|
|
UnkSpriteMem *mem;
|
|
ax_pose *r4;
|
|
|
|
r4 = a0[a2->poseId];
|
|
sCharMemCursor = OBJ_VRAM0 + (a2->vramTileOrMaybeAnimTimer * 0x20);
|
|
for (mem = NULL; (u16)r4->sprite != 0xFFFF || r4->unk2 != 0xFFFF; r4++, mem = NULL) {
|
|
if (a4 != 0 && r4->sprite > -1)
|
|
mem = a1[r4->sprite];
|
|
|
|
sub_8004EA8(r4, a2, mem, spriteMasks);
|
|
}
|
|
}
|
|
|
|
void sub_80053AC(EntitySpriteInfo *a0, OpenedFile *a1, u32 a2, u32 a3, u32 a4, u32 spriteAnimIndex, bool8 a6)
|
|
{
|
|
sub_80053D0(a0, (Dungeon_ax *)a1->data, a2, a3, a4, spriteAnimIndex, a6);
|
|
}
|
|
|
|
void sub_80053D0(EntitySpriteInfo *a0, Dungeon_ax *a1, u32 a2, u32 direction, u32 a4, u32 spriteAnimIndex, bool8 a6)
|
|
{
|
|
a0->unk0 = 0x8000;
|
|
if (a6)
|
|
a0->unk0 |= 0x1000;
|
|
|
|
a0->spriteAnimationCounter = 0;
|
|
a0->spriteAnimationIndex = spriteAnimIndex;
|
|
a0->spritePosOffset.x = 0;
|
|
a0->spritePosOffset.y = 0;
|
|
a0->unk1C = a4;
|
|
a0->spriteIndexForEntity = 0xFFFF;
|
|
a0->spriteIndexForEntity2 = 0xFFFF;
|
|
a0->unk14 = 0;
|
|
a0->unk18 = 0;
|
|
a0->spriteAnimationCounter2 = 0;
|
|
a0->spriteBaseForDirection = a1->unk4[a2][direction];
|
|
a0->spriteGlobalIndex = a0->spriteBaseForDirection;
|
|
a0->unk34 = a1->unk0;
|
|
a0->unk38 = a1->unkC;
|
|
a0->unk30 = a1->unk10;
|
|
}
|
|
|
|
void sub_800543C(EntitySpriteInfo *a0, OpenedFile *a1, u32 a2, u32 a3, u32 spriteAnimIndex, bool8 a5)
|
|
{
|
|
sub_800545C(a0, (Dungeon_ax *)a1->data, a2, a3, spriteAnimIndex, a5);
|
|
}
|
|
|
|
static void sub_800545C(EntitySpriteInfo *a0, Dungeon_ax *a1, u32 a2, u32 a3, u32 spriteAnimIndex, bool8 a5)
|
|
{
|
|
a0->unk0 = 0x8000;
|
|
if (a5)
|
|
a0->unk0 |= 0x1000;
|
|
|
|
a0->spriteAnimationCounter = 0;
|
|
a0->spriteAnimationIndex = spriteAnimIndex;
|
|
a0->spritePosOffset.x = 0;
|
|
a0->spritePosOffset.y = 0;
|
|
a0->unk1C = a3;
|
|
a0->spriteIndexForEntity = 0xFFFF;
|
|
a0->spriteIndexForEntity2 = 0xFFFF;
|
|
a0->unk14 = 0;
|
|
a0->unk18 = 0;
|
|
a0->spriteAnimationCounter2 = 0;
|
|
a0->spriteBaseForDirection = a1->unk4[a2][0];
|
|
a0->spriteGlobalIndex = a0->spriteBaseForDirection;
|
|
a0->unk34 = a1->unk0;
|
|
a0->unk30 = 0;
|
|
}
|
|
|
|
static inline s16 check_flag_for_80054BC(u16 flags) {
|
|
if (flags & 0x2000)
|
|
return 0;
|
|
else
|
|
return flags >> 15;
|
|
}
|
|
|
|
|
|
void sub_80054BC(struct axPokemon *a0)
|
|
{
|
|
ax_anim *aData;
|
|
|
|
if (!check_flag_for_80054BC(a0->axdata.flags))
|
|
return;
|
|
|
|
if (a0->axdata.sub1.poseId >= 0) {
|
|
if (a0->axdata.flags & 0x4000)
|
|
return;
|
|
|
|
if (a0->axdata.totalFrames < 30000)
|
|
a0->axdata.totalFrames++;
|
|
|
|
if (a0->axdata.animWaitFrames != 0) {
|
|
a0->axdata.animWaitFrames--;
|
|
return;
|
|
}
|
|
|
|
if (a0->axdata.animFrames != 0 && --a0->axdata.animFrames > 0)
|
|
return;
|
|
}
|
|
|
|
if (a0->axdata.activeAnimData->frames == 0) {
|
|
if (!(a0->axdata.flags & 0x1000)) {
|
|
a0->axdata.flags |= 0x2000;
|
|
return;
|
|
}
|
|
|
|
a0->axdata.activeAnimData = a0->axdata.nextAnimData;
|
|
a0->axdata.animWaitFrames = Rand32Bit() & 1;
|
|
}
|
|
|
|
a0->axdata.flags |= 0x800;
|
|
|
|
aData = a0->axdata.activeAnimData;
|
|
a0->axdata.animFrames = aData->frames;
|
|
a0->axdata.sub1.poseId = aData->poseId;
|
|
a0->axdata.sub1.xOffset = aData->xOffset;
|
|
a0->axdata.sub1.yOffset = aData->yOffset;
|
|
a0->axdata.sub1.xShadow = aData->xShadow;
|
|
a0->axdata.sub1.yShadow = aData->yShadow;
|
|
a0->axdata.sub1.unkC = aData->unkFlags;
|
|
a0->axdata.sub1.unk10 |= aData->unkFlags;
|
|
a0->axdata.activeAnimData = aData + 1;
|
|
}
|