sub_80A69FC

This commit is contained in:
DizzyEggg
2025-05-14 15:01:22 +02:00
parent eda1ebec35
commit 867956cf8a
3 changed files with 221 additions and 465 deletions

View File

@@ -7,449 +7,6 @@
thumb_func_start IsOnscreen_80A675C
IsOnscreen_80A675C:
push {r4-r6,lr}
sub sp, 0x8
adds r6, r1, 0
mov r0, sp
bl sub_809D248
lsls r0, 24
cmp r0, 0
beq _080A678C
ldr r1, [r6]
cmp r1, 0
bge _080A6776
adds r1, 0xFF
_080A6776:
asrs r1, 8
ldr r0, [sp]
subs r4, r1, r0
ldr r1, [r6, 0x4]
cmp r1, 0
bge _080A6784
adds r1, 0xFF
_080A6784:
asrs r1, 8
ldr r0, [sp, 0x4]
subs r5, r1, r0
b _080A67A0
_080A678C:
ldr r0, [r6]
cmp r0, 0
bge _080A6794
adds r0, 0xFF
_080A6794:
asrs r4, r0, 8
ldr r1, [r6, 0x4]
cmp r1, 0
bge _080A679E
adds r1, 0xFF
_080A679E:
asrs r5, r1, 8
_080A67A0:
adds r1, r4, 0
adds r1, 0x40
ldr r0, _080A67BC
cmp r1, r0
bhi _080A67C0
movs r0, 0x10
negs r0, r0
cmp r5, r0
blt _080A67C0
cmp r5, 0xCF
bgt _080A67C0
movs r0, 0x1
b _080A67C2
.align 2, 0
_080A67BC: .4byte 0x0000016f
_080A67C0:
movs r0, 0
_080A67C2:
add sp, 0x8
pop {r4-r6}
pop {r1}
bx r1
thumb_func_end IsOnscreen_80A675C
thumb_func_start sub_80A67CC
sub_80A67CC:
push {r4-r7,lr}
adds r4, r0, 0
adds r5, r1, 0
movs r7, 0
cmp r5, 0
beq _080A67E2
movs r1, 0
ldrsh r0, [r5, r1]
cmp r0, 0
ble _080A67E2
movs r7, 0x1
_080A67E2:
adds r0, r2, 0
bl sub_80A65E0
adds r1, r0, 0
lsls r1, 16
lsrs r1, 16
adds r0, r4, 0
bl sub_80A65F0
movs r1, 0
str r1, [r4, 0x74]
str r1, [r4, 0x78]
movs r6, 0x1
negs r6, r6
str r6, [r4, 0x7C]
adds r0, r4, 0
adds r0, 0x70
strb r1, [r0]
subs r0, 0x4
strh r1, [r0]
adds r0, 0x2
strh r1, [r0]
adds r2, r4, 0
adds r2, 0x52
ldr r0, _080A6884
strh r0, [r2]
str r1, [r4, 0x54]
adds r0, r4, 0
adds r0, 0x64
strh r1, [r0]
adds r2, 0x14
adds r0, r6, 0
adds r3, r0, 0
strh r0, [r2]
adds r0, r4, 0
adds r0, 0x68
strh r1, [r0]
subs r0, 0x10
strh r1, [r0]
adds r1, r4, 0
adds r1, 0x5A
movs r0, 0xFF
strb r0, [r1]
str r6, [r4, 0x5C]
str r6, [r4, 0x60]
cmp r7, 0
beq _080A6888
ldr r0, [r5]
ldr r1, [r5, 0x4]
str r0, [r4, 0x48]
str r1, [r4, 0x4C]
adds r5, r4, 0
adds r5, 0x48
adds r0, r4, 0
adds r1, r5, 0
adds r2, r6, 0
bl sub_80A68F8
lsls r0, 24
cmp r0, 0
bne _080A689A
adds r0, r4, 0
adds r0, 0x50
ldrh r1, [r0]
movs r0, 0x80
lsls r0, 5
ands r0, r1
cmp r0, 0
bne _080A689A
adds r0, r5, 0
bl sub_80A6CF4
lsls r0, 24
cmp r0, 0
beq _080A689A
adds r0, r4, 0
adds r1, r5, 0
adds r2, r6, 0
bl sub_80A68F8
b _080A689A
.align 2, 0
_080A6884: .4byte 0x0000ffff
_080A6888:
adds r1, r4, 0
adds r1, 0x48
ldrh r0, [r1]
orrs r0, r3
strh r0, [r1]
adds r0, r4, 0
adds r0, 0x4A
strh r7, [r0]
str r7, [r4, 0x4C]
_080A689A:
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_80A67CC
thumb_func_start sub_80A68A0
sub_80A68A0:
push {r4,lr}
adds r4, r0, 0
adds r0, 0x50
ldrh r1, [r0]
movs r0, 0x80
lsls r0, 2
ands r0, r1
cmp r0, 0
beq _080A68CE
adds r0, r4, 0
adds r0, 0x58
movs r1, 0
ldrsh r0, [r0, r1]
cmp r0, 0
beq _080A68CE
ldr r1, [r4, 0x5C]
movs r0, 0x1
negs r0, r0
cmp r1, r0
beq _080A68CE
adds r0, r1, 0
bl sub_800DC14
_080A68CE:
ldr r0, [r4, 0x54]
cmp r0, 0
beq _080A68DC
bl CloseFile
movs r0, 0
str r0, [r4, 0x54]
_080A68DC:
adds r0, r4, 0
bl sub_80A69FC
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_80A68A0
thumb_func_start sub_80A68E8
sub_80A68E8:
push {lr}
movs r0, 0x15
_080A68EC:
subs r0, 0x1
cmp r0, 0
bge _080A68EC
pop {r0}
bx r0
thumb_func_end sub_80A68E8
thumb_func_start sub_80A68F8
sub_80A68F8:
push {r4-r7,lr}
mov r12, r0
adds r5, r2, 0
ldr r0, _080A6924
ldr r4, [r0]
movs r2, 0
ldrsh r0, [r1, r2]
cmp r0, r5
blt _080A6956
adds r5, r0, 0
movs r3, 0
ldr r0, [r4]
mov r6, r12
adds r6, 0x52
mov r7, r12
adds r7, 0x64
cmp r0, 0
bne _080A6928
movs r2, 0x1
cmp r2, r5
blt _080A692A
b _080A6986
.align 2, 0
_080A6924: .4byte gUnknown_3001B7C
_080A6928:
movs r2, 0
_080A692A:
adds r0, r3, 0x1
lsls r0, 16
asrs r3, r0, 16
adds r4, 0xC
cmp r3, 0x15
bgt _080A6986
ldr r0, [r4]
cmp r0, 0
bne _080A6928
adds r2, 0x1
cmp r2, r5
blt _080A692A
lsls r0, r2, 1
adds r0, r2
lsls r0, 2
subs r0, 0xC
subs r4, r0
adds r0, r3, 0x1
subs r0, r2
lsls r0, 16
asrs r3, r0, 16
b _080A6986
_080A6956:
movs r3, 0x15
adds r4, 0xFC
ldr r0, [r4]
mov r6, r12
adds r6, 0x52
mov r7, r12
adds r7, 0x64
cmp r0, 0
bne _080A696C
movs r2, 0x1
b _080A6982
_080A696C:
movs r2, 0
_080A696E:
subs r0, r3, 0x1
lsls r0, 16
asrs r3, r0, 16
subs r4, 0xC
cmp r3, 0
blt _080A6986
ldr r0, [r4]
cmp r0, 0
bne _080A696C
adds r2, 0x1
_080A6982:
cmp r2, r5
blt _080A696E
_080A6986:
cmp r2, r5
blt _080A69C4
strh r3, [r6]
strh r5, [r7]
movs r0, 0x1
str r0, [r4]
mov r0, r12
str r0, [r4, 0x8]
ldrh r1, [r1, 0x2]
bl GroundSprite_ExtendPaletteAdd
cmp r5, 0x1
ble _080A69B2
movs r2, 0x2
adds r0, r4, 0
adds r0, 0xC
subs r1, r5, 0x1
_080A69A8:
str r2, [r0]
adds r0, 0xC
subs r1, 0x1
cmp r1, 0
bne _080A69A8
_080A69B2:
ldr r1, _080A69C0
ldr r0, [r1]
subs r0, r5
str r0, [r1]
movs r0, 0x1
b _080A69EC
.align 2, 0
_080A69C0: .4byte gUnknown_2039DD4
_080A69C4:
ldr r1, _080A69F4
movs r0, 0
strb r0, [r1]
movs r0, 0x1
negs r0, r0
mov r1, r12
str r0, [r1, 0x7C]
mov r0, r12
adds r0, 0x70
movs r1, 0
strb r1, [r0]
ldr r0, _080A69F8
strh r0, [r6]
strh r1, [r7]
mov r0, r12
adds r0, 0x6C
strh r1, [r0]
adds r0, 0x2
strh r1, [r0]
movs r0, 0
_080A69EC:
pop {r4-r7}
pop {r1}
bx r1
.align 2, 0
_080A69F4: .4byte gUnknown_2039DD0
_080A69F8: .4byte 0x0000ffff
thumb_func_end sub_80A68F8
thumb_func_start sub_80A69FC
sub_80A69FC:
push {r4-r7,lr}
adds r6, r0, 0
adds r7, r6, 0
adds r7, 0x52
movs r0, 0
ldrsh r4, [r7, r0]
ldr r0, _080A6A80
lsls r1, r4, 1
adds r1, r4
lsls r1, 2
ldr r0, [r0]
adds r5, r0, r1
cmp r4, 0
blt _080A6A7A
adds r0, r6, 0
bl GroundSprite_ExtendPaletteDelete
movs r0, 0
str r0, [r5, 0x8]
str r0, [r5]
adds r5, 0xC
ldr r1, _080A6A84
ldr r0, [r1]
adds r0, 0x1
str r0, [r1]
adds r0, r4, 0x1
lsls r0, 16
asrs r4, r0, 16
adds r6, 0x64
mov r12, r6
cmp r4, 0x15
bgt _080A6A6A
ldr r0, [r5]
cmp r0, 0x2
bne _080A6A6A
movs r6, 0
adds r2, r1, 0
lsls r1, r4, 16
movs r0, 0x80
lsls r0, 9
adds r1, r0
adds r3, r0, 0
_080A6A50:
str r6, [r5]
adds r5, 0xC
ldr r0, [r2]
adds r0, 0x1
str r0, [r2]
adds r0, r1, 0
adds r1, r3
asrs r4, r0, 16
cmp r4, 0x15
bgt _080A6A6A
ldr r0, [r5]
cmp r0, 0x2
beq _080A6A50
_080A6A6A:
ldr r0, _080A6A88
strh r0, [r7]
movs r0, 0
mov r1, r12
strh r0, [r1]
ldr r1, _080A6A8C
movs r0, 0x1
strb r0, [r1]
_080A6A7A:
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_080A6A80: .4byte gUnknown_3001B7C
_080A6A84: .4byte gUnknown_2039DD4
_080A6A88: .4byte 0x0000ffff
_080A6A8C: .4byte gUnknown_2039DD0
thumb_func_end sub_80A69FC
thumb_func_start GroundSprite_ExtendPaletteAdd
GroundSprite_ExtendPaletteAdd:
push {r4-r7,lr}

View File

@@ -1,12 +1,48 @@
#ifndef GUARD_GROUND_SPRITE_H
#define GUARD_GROUND_SPRITE_H
#include "structs/sprite_oam.h"
// TODO: Clean up these structs
struct UnkGroundSpriteSubStructx48
{
s16 unk0;
u16 unk2;
s32 unk4;
};
struct UnkGroundSpriteStruct
{
u16 unk0;
u8 fill2[0x3a];
unkStruct_2039DB0 unk3C;
struct UnkGroundSpriteSubStructx48 unk48;
u16 unk50;
s16 unk52;
OpenedFile *unk54;
s16 unk58;
u8 unk5A;
s32 unk5C;
s32 unk60;
u16 unk64;
s16 unk66;
u16 unk68;
u16 unk6A;
u16 unk6C;
u16 unk6E;
u8 unk70;
s32 unk74;
s32 unk78;
s32 unk7C;
};
// size: 0xC
typedef struct unkStruct_3001B7C_sub0
{
u32 unk0;
s32 unk4;
u32 unk8;
struct UnkGroundSpriteStruct *unk8;
} unkStruct_3001B7C_sub0;
// size: 0x4
@@ -16,13 +52,15 @@ typedef struct unkStruct_3001B7C_sub108
s16 unk2;
} unkStruct_3001B7C_sub108;
#define UNK_3001B7C_SUB0_COUNT 22
// size: 0x110
typedef struct unkStruct_3001B7C
{
unkStruct_3001B7C_sub0 unk0[22];
unkStruct_3001B7C_sub0 unk0[UNK_3001B7C_SUB0_COUNT];
unkStruct_3001B7C_sub108 unk108[2];
} unkStruct_3001B7C;
void GroundSprite_Reset(s16);
#endif // GUARD_GROUND_SPRITE_H
#endif // GUARD_GROUND_SPRITE_H

View File

@@ -206,23 +206,6 @@ u16 sub_80A65E0(u32 a0)
return (a0 >> 16) & 0x337F;
}
// TODO: This struct should probable be merged with an already existing one? Or
struct UnkGroundSpriteStruct
{
u16 unk0;
u8 fill2[0x3a];
unkStruct_2039DB0 unk3C;
s16 unk48;
u8 fill4A[6];
u16 unk50;
s16 unk52;
u8 fill54[4];
s16 unk58;
u32 unk5C;
u8 fill60[0x6a-0x60];
u16 unk6A;
};
void sub_80A65F0(struct UnkGroundSpriteStruct *ptr, u16 a1)
{
ptr->unk50 = a1;
@@ -249,7 +232,7 @@ void sub_80A6688(struct UnkGroundSpriteStruct *ptr, s32 a0)
bool8 SpriteHasPokemonSize_80A66A4(struct UnkGroundSpriteStruct *ptr)
{
return (ptr->unk48 > 0);
return (ptr->unk48.unk0 > 0);
}
UNUSED static bool8 sub_80A66BC(struct UnkGroundSpriteStruct *ptr)
@@ -262,7 +245,7 @@ UNUSED static bool8 sub_80A66BC(struct UnkGroundSpriteStruct *ptr)
bool8 sub_80A66D4(struct UnkGroundSpriteStruct *ptr)
{
if (ptr->unk52 < 0 && ptr->unk48 > 0)
if (ptr->unk52 < 0 && ptr->unk48.unk0 > 0)
return TRUE;
else
return FALSE;
@@ -290,3 +273,181 @@ bool8 sub_80A671C(struct UnkGroundSpriteStruct *ptr)
}
return FALSE;
}
extern u8 sub_809D248(PixelPos *r0);
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;
}
bool8 sub_80A68F8(struct UnkGroundSpriteStruct *ptr, struct UnkGroundSpriteSubStructx48 *a1, s32 a2);
bool8 sub_80A6CF4(struct UnkGroundSpriteSubStructx48 *a0);
void sub_80A69FC(struct UnkGroundSpriteStruct *ptr);
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 = 0;
ptr->unk78 = 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->unk50 & 0x1000) && sub_80A6CF4(&ptr->unk48)) {
sub_80A68F8(ptr, &ptr->unk48, -1);
}
}
else {
ptr->unk48.unk0 = -1;
ptr->unk48.unk2 = 0;
ptr->unk48.unk4 = 0;
}
}
void sub_80A68A0(struct UnkGroundSpriteStruct *ptr)
{
if ((ptr->unk50 & 0x200) && ptr->unk58 != 0 && ptr->unk5C != -1) {
sub_800DC14(ptr->unk5C);
}
if (ptr->unk54 != NULL) {
CloseFile(ptr->unk54);
ptr->unk54 = NULL;
}
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++) {
;
}
}
void GroundSprite_ExtendPaletteAdd(struct UnkGroundSpriteStruct *ptr, u16);
void GroundSprite_ExtendPaletteDelete(struct UnkGroundSpriteStruct *ptr);
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;
}
}
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;
}
}