pmd-red/src/ground_sprite.c
2026-02-03 18:24:17 -05:00

915 lines
22 KiB
C

#include "global.h"
#include "globaldata.h"
#include "code_8099360.h"
#include "ground_sprite.h"
#include "structs/axdata.h"
#include "effect_main.h"
#include "debug.h"
#include "def_filearchives.h"
#include "file_system.h"
#include "ground_map.h"
#include "ground_sprite_data.h"
#include "ground_lives.h"
#include "memory.h"
#include "sprite.h"
#include "effect_sub_1.h"
#include "palette_util.h"
#include "pokemon.h"
#include "ground_effect.h"
#include "ground_object.h"
#include "code_809D148.h"
// size: 0xC
typedef struct unkStruct_3001B7C_sub0
{
u32 unk0;
s32 unk4;
struct UnkGroundSpriteStruct *unk8;
} unkStruct_3001B7C_sub0;
// size: 0x4
typedef struct unkStruct_3001B7C_sub108
{
u16 unk0;
s16 unk2;
} unkStruct_3001B7C_sub108;
#define UNK_3001B7C_SUB0_COUNT 22
#define UNK_3001B7C_SUB108_COUNT 2
// size: 0x110
typedef struct unkStruct_3001B7C
{
unkStruct_3001B7C_sub0 unk0[UNK_3001B7C_SUB0_COUNT];
unkStruct_3001B7C_sub108 unk108[UNK_3001B7C_SUB108_COUNT];
} unkStruct_3001B7C;
static EWRAM_DATA unkStruct_2039DB0 gUnknown_2039DB0 = {0};
UNUSED static EWRAM_DATA u32 sUnknown_2039DBC = {0}; // Unused, for alignment
static EWRAM_DATA unkStruct_2039DB0 gUnknown_2039DC0 = {0};
static EWRAM_DATA u16 gUnknown_2039DCC = {0};
static EWRAM_DATA u16 gUnknown_2039DCE = {0};
static EWRAM_DATA u8 gUnknown_2039DD0 = {0};
static EWRAM_DATA u32 gUnknown_2039DD4 = {0};
static EWRAM_DATA PixelPos gUnknown_2039DD8 = {0};
static EWRAM_INIT OpenedFile *gUnknown_203B4B4 = {NULL};
static IWRAM_INIT unkStruct_3001B7C *gUnknown_3001B7C = {NULL};
static bool8 sub_80A68F8(struct UnkGroundSpriteStruct *ptr, struct UnkGroundSpriteSubStructx48 *a1, s32 a2);
static bool8 sub_80A6CF4(struct UnkGroundSpriteSubStructx48 *a0);
static void sub_80A69FC(struct UnkGroundSpriteStruct *ptr);
static void sub_80A6460(void);
static void sub_80A72B8(struct UnkGroundSpriteStruct *ptr, bool8 a1);
void sub_80A62F0(void)
{
s32 r0;
unkStruct_3001B7C_sub0 *sub0;
unkStruct_3001B7C_sub108 *sub108;
s32 r6;
gUnknown_3001B7C = MemoryAlloc(sizeof(unkStruct_3001B7C), MEMALLOC_GROUP_6);
gUnknown_203B4B4 = OpenFileAndGetFileDataPtr("etcfonta", &gDungeonFileArchive);
sub_800DAC0(1);
sub0 = gUnknown_3001B7C->unk0;
gUnknown_2039DD4 = 22;
gUnknown_2039DD0 = 1;
for (r0 = 0; r0 < 22; r0 = (s16)(r0 + 1), sub0++) {
sub0->unk0 = 0;
sub0->unk4 = r0 * 16;
sub0->unk8 = 0;
}
sub108 = gUnknown_3001B7C->unk108;
for (r6 = 0; r6 < 2; r6++, sub108++) {
sub108->unk0 = 0;
sub108->unk2 = 0;
sub_80997F4(r6 + 29, 0);
}
GroundSprite_Reset(-1);
}
void GroundSprite_Reset(s32 a0)
{
s32 uVar2 = (s16) a0;
Log(0, "GroundSprite Reset");
gUnknown_2039DCC = 0;
gUnknown_2039DCE = 0;
sub_80A6460();
InitShadowSprites(496, sub_80A4D48(uVar2) ? 3 : 2);
sub_8004E8C(&gUnknown_2039DB0);
sub_8004E8C(&gUnknown_2039DC0);
gUnknown_2039DC0.unk4 &= ~(0x400 | 0x800);
gUnknown_2039DC0.unkA &= ~(0x400 | 0x800);
gUnknown_2039DC0.unkA |= 0x800;
if (sub_80A4D48(a0)) {
gUnknown_2039DB0.unk4 &= ~(0x400 | 0x800);
gUnknown_2039DB0.unkA &= ~(0x400 | 0x800);
gUnknown_2039DB0.unkA |= (0x400 | 0x800);
}
else {
gUnknown_2039DB0.unk4 &= ~(0x400 | 0x800);
gUnknown_2039DB0.unkA &= ~(0x400 | 0x800);
gUnknown_2039DB0.unkA |= 0x800;
}
ResetSprites(TRUE);
nullsub_10(TRUE);
}
static void sub_80A6460(void)
{
OpenedFile *file;
s32 i;
const u8 *data;
u16 something;
file = OpenFileAndGetFileDataPtr("palet", &gMonsterFileArchive);
something = 0x100;
data = file->data;
for (i = 0; i < 13; i++) {
sub_809971C(something, (RGB_Array*)data, 0x10);
something += 0x10;
data += 0x40;
}
CloseFile(file);
}
UNUSED static void sub_80A64A4(void)
{
const u8 *r2;
u16 r4;
u32 r5;
OpenedFile *file;
unkStruct_3001B7C_sub108 *r7;
s32 i;
s16 r9;
u16 sl;
u16 flag;
u16 flag2;
r7 = gUnknown_3001B7C->unk108;
sub_80A6460();
for (i = 0; i < UNK_3001B7C_SUB108_COUNT; i++, r7++)
{
if (r7->unk2 > 0) {
r5 = r7->unk0;
sl = i + 29;
r9 = 0x1D0 + i * 16;
flag = r5 & 0x200;
if (flag) {
file = OpenFileAndGetFileDataPtr("palet", &gMonsterFileArchive);
r2 = file->data + (r5 & 0xFF) * 0x40;
}
else {
u32 id = r5 & 0xFF;
file = OpenFileAndGetFileDataPtr(id[gUnknown_81178F4], &gOrnamentFileArchive);
r2 = file->data;
}
flag2 = r5 & 0x1000;
r4 = flag2 != 0;
flag = r5 & 0x2000;
if (flag)
r4 |= 2;
sub_809971C(r9, (RGB_Array*)r2, 16);
sub_80997F4(sl, r4);
TRY_CLOSE_FILE(file);
}
}
}
void sub_80A658C(void)
{
sub_800DB7C();
ResetSprites(FALSE);
nullsub_10(FALSE);
sub_8005180();
nullsub_12();
CopySpritesToOam();
nullsub_13();
sub_8005304();
nullsub_14();
CloseFile(gUnknown_203B4B4);
MemoryFree(gUnknown_3001B7C);
gUnknown_3001B7C = NULL;
}
UNUSED static u16 sub_80A65D8(u16 *a0)
{
return a0[40];
}
static u16 sub_80A65E0(u32 a0)
{
return (a0 >> 16) & 0x337F;
}
static void sub_80A65F0(struct UnkGroundSpriteStruct *ptr, u16 a1)
{
ptr->flags_0x50 = a1;
ptr->unk6A = ((a1 & 4) ? 0x40 : 0) - ((a1 & 2) ? 0x40 : 0) + ((a1 & 1) ? 0x8 : 0) + 0x40;
if (ptr->flags_0x50 & 0x8) {
ptr->unk3C = gUnknown_2039DC0;
}
else {
ptr->unk3C = gUnknown_2039DB0;
}
if (ptr->flags_0x50 & 0x20) {
ptr->unk3C.unk0 &= 0xF3FF;
ptr->unk3C.unk6 &= 0xF3FF;
ptr->unk3C.unk6 |= 0x400;
}
}
void sub_80A6688(struct UnkGroundSpriteStruct *ptr, s32 a0)
{
sub_80A65F0(ptr, sub_80A65E0(a0));
}
bool8 SpriteHasPokemonSize_80A66A4(struct UnkGroundSpriteStruct *ptr)
{
return (ptr->unk48.unk0 > 0);
}
UNUSED static bool8 sub_80A66BC(struct UnkGroundSpriteStruct *ptr)
{
if (ptr->unk52 >= 0)
return TRUE;
else
return FALSE;
}
bool8 sub_80A66D4(struct UnkGroundSpriteStruct *ptr)
{
if (ptr->unk52 < 0 && ptr->unk48.unk0 > 0)
return TRUE;
else
return FALSE;
}
bool8 sub_80A66F8(struct UnkGroundSpriteStruct *ptr)
{
if (ptr->unk52 >= 0 && !(ptr->axdata.flags & 0x2000)) {
return (ptr->axdata.flags & 0x8000) != 0;
}
return FALSE;
}
bool8 sub_80A671C(struct UnkGroundSpriteStruct *ptr)
{
if (ptr->unk58 != 0) {
if (ptr->unk58 == 0x1C0)
return TRUE;
if (ptr->unk5C == -1)
return TRUE;
if (sub_800E9E4(ptr->unk5C))
return TRUE;
ptr->unk5C = -1;
ptr->unk58 = 0;
}
return FALSE;
}
bool8 IsOnscreen_80A675C(struct UnkGroundSpriteStruct *ptr, PixelPos *pixPosArg)
{
PixelPos result;
PixelPos pixelPos;
if (sub_809D248(&pixelPos)) {
result.x = (pixPosArg->x / 256) - pixelPos.x;
result.y = (pixPosArg->y / 256) - pixelPos.y;
}
else {
result.x = (pixPosArg->x / 256);
result.y = (pixPosArg->y / 256);
}
if (result.x >= -64 && result.x <= 303 && result.y >= -16 && result.y <= 207) {
return TRUE;
}
return FALSE;
}
void sub_80A67CC(struct UnkGroundSpriteStruct *ptr, struct UnkGroundSpriteSubStructx48 *a1, s32 a2)
{
bool8 r7;
if (a1 != NULL && a1->unk0 > 0) {
r7 = TRUE;
}
else {
r7 = FALSE;
}
sub_80A65F0(ptr, sub_80A65E0(a2));
ptr->unk74.x = 0;
ptr->unk74.y = 0;
ptr->unk7C = -1;
ptr->unk70 = 0;
ptr->unk6C = 0;
ptr->unk6E = 0;
ptr->unk52 = -1;
ptr->unk54 = NULL;
ptr->unk64 = 0;
ptr->unk66 = -1;
ptr->unk68 = 0;
ptr->unk58 = 0;
ptr->unk5A = 0xFF;
ptr->unk5C = -1;
ptr->unk60 = -1;
if (r7) {
ptr->unk48 = *a1;
if (!sub_80A68F8(ptr, &ptr->unk48, -1) && !(ptr->flags_0x50 & 0x1000) && sub_80A6CF4(&ptr->unk48)) {
sub_80A68F8(ptr, &ptr->unk48, -1);
}
}
else {
ptr->unk48.unk0 = -1;
ptr->unk48.unk2 = 0;
ptr->unk48.axmain = NULL;
}
}
void sub_80A68A0(struct UnkGroundSpriteStruct *ptr)
{
if ((ptr->flags_0x50 & 0x200) && ptr->unk58 != 0 && ptr->unk5C != -1) {
sub_800DC14(ptr->unk5C);
}
TRY_CLOSE_FILE_AND_SET_NULL(ptr->unk54);
sub_80A69FC(ptr);
}
// I guess the code inside the loop was commented out or under an ifdef.
UNUSED static void sub_80A68E8(void)
{
s32 i;
for (i = 0; i < UNK_3001B7C_SUB0_COUNT; i++) {
;
}
}
static bool8 sub_80A68F8(struct UnkGroundSpriteStruct *ptr, struct UnkGroundSpriteSubStructx48 *a1, s32 a2)
{
s32 id, count;
unkStruct_3001B7C_sub0 *unkPtr = &gUnknown_3001B7C->unk0[0];
if (a1->unk0 >= a2) {
a2 = a1->unk0;
count = 0;
for (id = 0; id < UNK_3001B7C_SUB0_COUNT; id = (s16)(id + 1), unkPtr++) {
if (unkPtr->unk0 == 0) {
if (++count >= a2) {
unkPtr -= count - 1;
id = (s16) (id - (count - 1));
break;
}
}
else {
count = 0;
}
}
}
else {
count = 0;
id = UNK_3001B7C_SUB0_COUNT - 1;
unkPtr = &gUnknown_3001B7C->unk0[UNK_3001B7C_SUB0_COUNT - 1];
for (; id >= 0; id = (s16)(id - 1), unkPtr--) {
if (unkPtr->unk0 == 0) {
if (++count >= a2) {
break;
}
}
else {
count = 0;
}
}
}
if (count >= a2) {
s32 i;
ptr->unk52 = id;
ptr->unk64 = a2;
unkPtr->unk0 = 1;
unkPtr->unk8 = ptr;
GroundSprite_ExtendPaletteAdd(ptr, a1->unk2);
for (i = 1; i < a2; i++) {
unkPtr[i].unk0 = 2;
}
gUnknown_2039DD4 -= a2;
return TRUE;
}
else {
gUnknown_2039DD0 = 0;
ptr->unk7C = -1;
ptr->unk70 = 0;
ptr->unk52 = -1;
ptr->unk64 = 0;
ptr->unk6C = 0;
ptr->unk6E = 0;
return FALSE;
}
}
static void sub_80A69FC(struct UnkGroundSpriteStruct *ptr)
{
s32 id = ptr->unk52;
unkStruct_3001B7C_sub0 *unkPtr = &gUnknown_3001B7C->unk0[id];
if (id >= 0) {
GroundSprite_ExtendPaletteDelete(ptr);
unkPtr->unk8 = NULL;
unkPtr->unk0 = 0;
unkPtr++;
gUnknown_2039DD4++;
id = (s16)(id + 1);
for (; id < UNK_3001B7C_SUB0_COUNT && unkPtr->unk0 == 2; id = (s16)(id + 1)) {
unkPtr->unk0 = 0;
unkPtr++;
gUnknown_2039DD4++;
}
ptr->unk52 = -1;
ptr->unk64 = 0;
gUnknown_2039DD0 = 1;
}
}
void GroundSprite_ExtendPaletteAdd(struct UnkGroundSpriteStruct *ptr, u16 a1)
{
OpenedFile *file;
s32 r8;
unkStruct_3001B7C_sub108 *sub108Ptr;
u16 var_28;
u16 var_24;
u16 r6;
const void *r7;
s32 r2;
if (a1 & (0x100 | 0x200)) {
if (a1 & 0x400) {
sub108Ptr = &gUnknown_3001B7C->unk108[1];
if (sub108Ptr->unk0 == a1) {
sub108Ptr->unk2++;
return;
}
}
else {
r8 = 0;
sub108Ptr = &gUnknown_3001B7C->unk108[0];
for (; r8 < UNK_3001B7C_SUB108_COUNT; r8++, sub108Ptr++) {
if (sub108Ptr->unk0 == a1) {
u16 r1 = r8 + 29;
sub108Ptr->unk2++;
if (ptr != NULL) {
ptr->unk68 = r1 - 16;
}
Log(0, "extend palette %3d[%3d] %04x up %04x", r8, r1, r1 - 16, a1);
return;
}
}
}
if (a1 & 0x400) {
r8 = 1;
sub108Ptr = &gUnknown_3001B7C->unk108[1];
if (sub108Ptr->unk2 > 0) {
FATAL_ERROR_ARGS("../ground/ground_sprite.c", 1008, "extend palette buffer error %08x", a1);
}
}
else {
r8 = 0;
sub108Ptr = &gUnknown_3001B7C->unk108[0];
for (; r8 < UNK_3001B7C_SUB108_COUNT; r8++, sub108Ptr++) {
if (sub108Ptr->unk2 <= 0) {
break;
}
}
if (r8 >= UNK_3001B7C_SUB108_COUNT) {
FATAL_ERROR_ARGS("../ground/ground_sprite.c", 1016, "extend palette buffer error %08x", a1);
}
}
var_28 = r8 + 29;
var_24 = (r8 * 16) + 464;
if (a1 & 0x200) {
file = OpenFileAndGetFileDataPtr("palet", &gMonsterFileArchive);
r7 = file->data;
r7 += (a1 & 0xFF) * 64;
}
else {
u32 id = a1 & 0xff;
file = OpenFileAndGetFileDataPtr(id[gUnknown_81178F4], &gOrnamentFileArchive);
r7 = file->data;
}
if (a1 & 0x1000) {
r6 = 1;
}
else {
r6 = 0;
}
if (a1 & 0x2000) {
r6 |= 2;
}
sub_80997F4(var_28, r6);
sub_809971C(var_24, (RGB_Array*)r7, 16);
sub108Ptr->unk0 = a1;
sub108Ptr->unk2 = 1;
r2 = var_28 - 16;
if (ptr != NULL) {
ptr->unk68 = r2;
}
Log(0, "extend palette %3d[%3d] %04x set %04x %04x", r8, var_28, r2, a1, r6);
TRY_CLOSE_FILE(file);
}
else {
if (ptr != NULL) {
ptr->unk68 = a1;
}
}
}
void GroundSprite_ExtendPaletteDelete(struct UnkGroundSpriteStruct *ptr)
{
s32 r5;
unkStruct_3001B7C_sub108 *sub108Ptr;
if (ptr != NULL) {
r5 = ptr->unk68 - 13;
if (r5 < 0)
return;
}
else {
r5 = 1;
}
sub108Ptr = &gUnknown_3001B7C->unk108[r5];
if (ptr != NULL) {
ptr->unk68 = 0;
}
if (--sub108Ptr->unk2 <= 0) {
Log(0, "extend palette %3d delete %04x", r5, sub108Ptr->unk0);
sub108Ptr->unk0 = 0;
sub108Ptr->unk2 = 0;
sub_80997F4(r5 + 29, 0);
}
}
static bool8 sub_80A6CF4(struct UnkGroundSpriteSubStructx48 *a0)
{
struct UnkGroundSpriteStruct *spArray[UNK_3001B7C_SUB0_COUNT];
s32 i;
unkStruct_3001B7C_sub0 *sub0Ptr;
PixelPos pixelPos;
s32 count = 0;
s32 r9 = a0->unk0;
s32 r10 = 0;
s32 var_28 = -1;
s32 var_24 = -1;
sub_809D248(&pixelPos);
for (i = 0, sub0Ptr = &gUnknown_3001B7C->unk0[0]; i < UNK_3001B7C_SUB0_COUNT; i = (s16)(i+1), sub0Ptr++) {
if (sub0Ptr->unk0 == 1) {
struct UnkGroundSpriteStruct *ptr = sub0Ptr->unk8;
if (!(ptr->flags_0x50 & 0x2000) && ptr->unk7C >= 0) {
PixelPos resultPos;
resultPos.x = (ptr->unk74.x / 256) - pixelPos.x;
resultPos.y = (ptr->unk74.y / 256) - pixelPos.y;
if (resultPos.y > 0) {
ptr->unk7C = 0x28 + resultPos.y;
}
else {
ptr->unk7C = 0x28 - resultPos.y;
}
if (resultPos.x > 0) {
if (resultPos.x > ptr->unk7C) {
ptr->unk7C = resultPos.x;
}
}
else {
if (-resultPos.x > ptr->unk7C) {
ptr->unk7C = -resultPos.x;
}
}
r10 += ptr->unk48.unk0;
if (ptr->unk48.unk0 >= r9 && var_24 < ptr->unk7C) {
var_28 = count;
var_24 = ptr->unk7C;
}
spArray[count++] = ptr;
}
}
}
if (r10 < r9)
return FALSE;
if (var_28 >= 0) {
sub_80A69FC(spArray[var_28]);
return TRUE;
}
while (count > 0) {
s32 i;
s32 r5 = -1;
s32 r3 = -1;
s32 r6 = 0;
for (i = 0; i < count; i++) {
if (r3 < spArray[i]->unk7C) {
r5 = count; // This looks like a mistake to me? I believe it should be r5 = i instead, however I cannot verify the behavior in-game as I can't find where, if anywhere, this function runs.
r3 = spArray[i]->unk7C;
}
}
sub_80A69FC(spArray[r5]);
count--;
for (i = r5; i < count; i++) {
spArray[i] = spArray[i + 1];
}
for (i = 0, sub0Ptr = &gUnknown_3001B7C->unk0[0]; i < UNK_3001B7C_SUB0_COUNT; i++, sub0Ptr++) {
if (sub0Ptr->unk0 == 0) {
if (++r6 >= r9) {
return TRUE;
}
}
else {
r6 = 0;
}
}
}
return FALSE;
}
void sub_80A6E68(void)
{
ResetSprites(FALSE);
nullsub_10(FALSE);
sub_800E970();
}
void sub_80A6E80(void)
{
DungeonPos pos;
if (!sub_809D248(&gUnknown_2039DD8)) {
gUnknown_2039DD8.x = 0;
gUnknown_2039DD8.y = 0;
}
sub_80ABA7C();
sub_80ACAD4();
sub_80AD7AC();
pos.x = gUnknown_2039DD8.x;
pos.y = gUnknown_2039DD8.y;
sub_800E90C(&pos);
sub_8005180();
nullsub_12();
}
void sub_80A6EC8(struct UnkGroundSpriteStruct *ptr, s32 a1)
{
if (ptr->unk52 > 0) {
if (a1 <= ptr->unk48.unk0) {
a1 = ptr->unk48.unk0;
}
if (ptr->unk64 != a1) {
ptr->unk66 = a1;
}
}
}
void sub_80A6EFC(struct UnkGroundSpriteStruct *ptr, s32 a1_, s32 a2_)
{
s32 flagResult;
unkStruct_3001B7C_sub0 *sub0Ptr;
s32 a1 = (s16) a1_;
s32 a2 = (s8) a2_;
if (ptr->unk52 < 0) {
if (ptr->unk66 >= 0) {
if (!sub_80A68F8(ptr, &ptr->unk48, ptr->unk66))
return;
ptr->unk66 = -1;
}
else {
if (ptr->unk48.unk0 <= 0)
return;
if (!sub_80A68F8(ptr, &ptr->unk48, -1))
return;
}
}
else {
if (ptr->unk66 >= 0) {
sub_80A69FC(ptr);
if (!sub_80A68F8(ptr, &ptr->unk48, ptr->unk66))
return;
ptr->unk66 = -1;
}
}
// s16 memes...
flagResult = a1 & 0x400;
if ((s16)flagResult) {
ptr->axdata.flags &= ~(0x1000);
return;
}
sub0Ptr = &gUnknown_3001B7C->unk0[ptr->unk52];
ptr->unk70 = 1;
ptr->unk7C = -1;
switch ((a1 & 0x700)) {
case 0x300:
ptr->unk6C = 0;
break;
case 0x100:
ptr->unk6C = 0x80;
break;
case 0:
default:
ptr->unk6C = 0x100;
break;
case 0x200:
ptr->unk6C = 0x200;
break;
}
ptr->unk6E = 0;
AxResInit(&ptr->axdata, ptr->unk48.axmain, (a1 & 0xFF) + a2 / 8, a2 & 7, sub0Ptr->unk4, 0, ((u16)a1 & 0x800) != 0);
}
void sub_80A7040(struct UnkGroundSpriteStruct *ptr, s32 a1_, s32 a2_, s32 a3)
{
s32 a1 = (s16) a1_;
s32 a2 = (s8) a2_;
if (!(ptr->flags_0x50 & 0x200))
return;
if (a1 == 0 || a1 == 0x1C0) {
if (sub_80A671C(ptr)) {
ptr->unk58 = 0x1C0;
}
}
else {
ptr->unk58 = a1;
ptr->unk5A = a2;
ptr->unk60 = a3;
}
}
bool8 sub_80A7094(struct UnkGroundSpriteStruct *ptr, PixelPos *r10, PixelPos *posArg, s32 a3)
{
PixelPos resultPos;
s32 unkY;
ptr->unk74 = *posArg;
ptr->unk7C = 0;
if (ptr->flags_0x50 & 0x200 && ptr->unk58 != 0) {
if (ptr->unk58 == 0x1C0) {
if (ptr->unk5C != -1) {
sub_800DC14(ptr->unk5C);
ptr->unk5C = -1;
}
ptr->unk58 = 0;
}
else if (ptr->unk5C == -1) {
unkStruct_2039DB0 unkSubStruct = DEFAULT_UNK_2039DB0_MASKS;
unkStruct_80416E0 unkStruct;
sub_800EE5C(ptr->unk58);
sub_800EF64();
unkStruct.unk0 = ptr->unk58;
unkStruct.unk4 = 0;
unkStruct.dir = (s8) ptr->unk5A;
unkStruct.pos1.x = posArg->x / 256;
unkStruct.pos1.y = posArg->y / 256;
unkStruct.pos2.x = 0;
unkStruct.pos2.y = 0;
unkStruct.unk14 = -1;
unkStruct.unk18 = 0;
unkStruct.spriteMasks = unkSubStruct;
ptr->unk5C = sub_800E890(&unkStruct);
}
else if (!sub_800E9E4(ptr->unk5C)) {
ptr->unk5C = -1;
ptr->unk58 = 0;
}
}
if (ptr->unk52 < 0)
return FALSE;
if (ptr->flags_0x50 & 0x40)
return FALSE;
resultPos = (PixelPos) {(posArg->x / 256) - gUnknown_2039DD8.x, (posArg->y / 256) - gUnknown_2039DD8.y};
unkY = resultPos.y - (a3 / 256);
if (resultPos.x >= -64 && resultPos.x <= 303 && resultPos.y >= -16 && resultPos.y <= 207 && unkY >= -16 && unkY <= 207) {
if ((ptr->flags_0x50 & 0x10) && (gUnknown_2039DCC & 1)) {
sub_80A72B8(ptr, FALSE);
DoAxFrame_800558C(&ptr->axdata, 304, 208, 0, ptr->unk68, &ptr->unk3C);
ptr->unk70 = 0;
return FALSE;
}
else {
sub_80A72B8(ptr, ptr->unk70);
DoAxFrame_800558C(&ptr->axdata, resultPos.x, unkY, resultPos.y + ptr->unk6A, ptr->unk68, &ptr->unk3C);
ptr->unk70 = 0;
if (r10 != NULL) {
*r10 = resultPos;
}
return TRUE;
}
}
else if (ptr->unk70 != 0) {
sub_80A72B8(ptr, TRUE);
DoAxFrame_800558C(&ptr->axdata, 304, 208, 0, ptr->unk68, &ptr->unk3C);
ptr->unk70 = 0;
return FALSE;
}
else {
return FALSE;
}
}
static void sub_80A72B8(struct UnkGroundSpriteStruct *ptr, bool8 a1)
{
if (a1) {
ptr->unk6E = 0;
RunAxAnimationFrame(&ptr->axdata);
}
else {
ptr->unk6E += ptr->unk6C;
while (ptr->unk6E >= 0x100) {
ptr->unk6E -= 0x100;
RunAxAnimationFrame(&ptr->axdata);
}
}
}
bool8 sub_80A7310(struct UnkGroundSpriteStruct *ptr, PixelPos *posArg1, PixelPos *posArg2, s32 a3)
{
if (ptr->flags_0x50 & 0x200 && ptr->unk5C != -1) {
DungeonPos pos;
s32 r7;
pos.x = posArg1->x / 256;
pos.y = posArg1->y / 256;
r7 = (pos.y - gUnknown_2039DD8.y) + ptr->unk6A + 2;
pos.y -= a3 / 256;
if (posArg2 != NULL) {
pos.x += posArg2->x;
pos.y += posArg2->y;
}
sub_800E8AC(ptr->unk5C, &pos, NULL, r7, &ptr->unk3C);
return TRUE;
}
else {
return FALSE;
}
}
void sub_80A73EC(void)
{
CopySpritesToOam();
nullsub_13();
sub_8005304();
nullsub_14();
gUnknown_2039DCC++;
if (++gUnknown_2039DCE > 11) {
gUnknown_2039DCE = 0;
}
}