pmd-red/src/sprite.c
2024-12-06 15:44:04 -05:00

858 lines
21 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 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};
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
#define UNK_20266B0_ARR_COUNT 160
static EWRAM_DATA unkStruct_20266B0 sUnknown_20266B0[UNK_20266B0_ARR_COUNT] = {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 AddAxSprite is done
#endif
static void RegisterSpriteParts_80052BC(UnkSpriteMem *);
static void AxResInitUnoriented(axdata *, axmain *, 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 = 0xFFFF;
a0->unk4 = 0xFFFF;
a0->unk6 = 0;
a0->unk8 = 0;
a0->unkA = 0;
}
// https://decomp.me/scratch/VYqKb - Same issue as AddSprite()
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");
}
// 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 *spriteMasks)
{
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 (spriteMasks == NULL) {
spr->attrib1 = a0->attrib1;
spr->attrib2 = a0->attrib2;
spr->attrib3 = a0->attrib3;
spr->unk6 = a0->unk6;
}
else {
spr->attrib1 = (a0->attrib1 & spriteMasks->unk0) | spriteMasks->unk6;
spr->attrib2 = (a0->attrib2 & spriteMasks->unk2) | spriteMasks->unk8;
spr->attrib3 = (a0->attrib3 & spriteMasks->unk4) | spriteMasks->unkA;
spr->unk6 = a0->unk6;
}
yPos = spr->unk6 >> SPRITEOAM_SHIFT_UNK6_4;
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 *spriteMasks)
{
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(DungeonPos *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;
}
}
void RegisterSpriteParts_80052BC(struct UnkSpriteMem *a0)
{
while (a0->byteCount != 0) {
if ((uintptr_t)sUnknown_203B074 >= (uintptr_t)&sUnknown_20266B0[UNK_20266B0_ARR_COUNT])
return;
sUnknown_203B074->byteCount = a0->byteCount;
sUnknown_203B074->src = a0->src;
sUnknown_203B074->dest = sCharMemCursor;
sCharMemCursor += a0->byteCount;
sUnknown_203B074++;
a0++;
}
}
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);
}
}
void sub_800533C(ax_pose **a0, UnkSpriteMem **a1, axdata1 *a2, unkStruct_2039DB0 *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 || *((u16*)&r4->unk2) != 0xFFFF; r4++, mem = NULL) {
if (a4 != 0 && r4->sprite > -1)
mem = a1[r4->sprite];
AddAxSprite(r4, a2, mem, spriteMasks);
}
}
void AxResInitFile(axdata *a0, OpenedFile *a1, u32 a2, u32 a3, u32 a4, u32 spriteAnimIndex, bool8 a6)
{
AxResInit(a0, (axmain *)a1->data, a2, a3, a4, spriteAnimIndex, a6);
}
void AxResInit(axdata *a0, axmain *a1, u32 a2, u32 direction, u32 a4, u32 spriteAnimIndex, bool8 a6)
{
a0->flags = 0x8000;
if (a6)
a0->flags |= 0x1000;
a0->animFrames = 0;
a0->animWaitFrames = spriteAnimIndex;
a0->sub1.offset.x = 0;
a0->sub1.offset.y = 0;
a0->sub1.vramTileOrMaybeAnimTimer = a4;
a0->sub1.poseId = 0xFFFF;
a0->sub1.lastPoseId = 0xFFFF;
a0->sub1.unkC = 0;
a0->sub1.unk10 = 0;
a0->totalFrames = 0;
a0->nextAnimData = a1->animations[a2][direction];
a0->activeAnimData = a0->nextAnimData;
a0->poseData = a1->poses;
a0->spriteData = a1->spriteData;
a0->paletteData = a1->palettes;
}
void AxResInitUnorientedFile(axdata *a0, OpenedFile *a1, u32 a2, u32 a3, u32 spriteAnimIndex, bool8 a5)
{
AxResInitUnoriented(a0, (axmain *)a1->data, a2, a3, spriteAnimIndex, a5);
}
static void AxResInitUnoriented(axdata *a0, axmain *a1, u32 a2, u32 a3, u32 spriteAnimIndex, bool8 a5)
{
a0->flags = 0x8000;
if (a5)
a0->flags |= 0x1000;
a0->animFrames = 0;
a0->animWaitFrames = spriteAnimIndex;
a0->sub1.offset.x = 0;
a0->sub1.offset.y = 0;
a0->sub1.vramTileOrMaybeAnimTimer = a3;
a0->sub1.poseId = 0xFFFF;
a0->sub1.lastPoseId = 0xFFFF;
a0->sub1.unkC = 0;
a0->sub1.unk10 = 0;
a0->totalFrames = 0;
a0->nextAnimData = a1->animations[a2][0];
a0->activeAnimData = a0->nextAnimData;
a0->poseData = a1->poses;
a0->paletteData = 0;
}
static inline s16 check_flag_for_80054BC(u16 flags) {
if (flags & 0x2000)
return 0;
else
return flags >> 15;
}
void RunAxAnimationFrame(struct axObject *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.offset.x = aData->offset.x;
a0->axdata.sub1.offset.y = aData->offset.y;
a0->axdata.sub1.shadow.x = aData->shadow.x;
a0->axdata.sub1.shadow.y = aData->shadow.y;
a0->axdata.sub1.unkC = aData->unkFlags;
a0->axdata.sub1.unk10 |= aData->unkFlags;
a0->axdata.activeAnimData = aData + 1;
}