ground sprite decompiled

This commit is contained in:
DizzyEggg
2025-05-15 20:37:16 +02:00
parent a281afff6f
commit b7f5d9da2a
9 changed files with 187 additions and 435 deletions

View File

@@ -1,420 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_80A73EC
sub_80A73EC:
push {lr}
bl CopySpritesToOam
bl nullsub_13
bl sub_8005304
bl nullsub_14
ldr r1, _080A7420
ldrh r0, [r1]
adds r0, 0x1
strh r0, [r1]
ldr r1, _080A7424
ldrh r0, [r1]
adds r0, 0x1
strh r0, [r1]
lsls r0, 16
lsrs r0, 16
cmp r0, 0xB
bls _080A741A
movs r0, 0
strh r0, [r1]
_080A741A:
pop {r0}
bx r0
.align 2, 0
_080A7420: .4byte gUnknown_2039DCC
_080A7424: .4byte gUnknown_2039DCE
thumb_func_end sub_80A73EC
thumb_func_start sub_80A7428
sub_80A7428:
push {r4-r7,lr}
mov r7, r8
push {r7}
sub sp, 0x14
adds r6, r0, 0
mov r8, r3
lsls r1, 16
asrs r7, r1, 16
lsls r2, 16
asrs r2, 16
adds r4, r2, 0
ldr r1, _080A7480
mov r0, sp
bl sprintf
ldr r1, _080A7484
mov r0, sp
bl OpenFile
adds r5, r0, 0
movs r1, 0
bl GetFileDataPtr
adds r0, r4, 0
bl GetBodySize
lsls r0, 24
lsrs r0, 24
ldr r1, _080A7488
ldr r2, [sp, 0xC]
ands r2, r1
orrs r2, r0
str r2, [sp, 0xC]
movs r0, 0xD3
lsls r0, 1
cmp r4, r0
bne _080A7490
ldr r0, _080A748C
ands r0, r2
movs r1, 0x91
lsls r1, 17
orrs r0, r1
str r0, [sp, 0xC]
b _080A74AC
.align 2, 0
_080A7480: .4byte gUnknown_8117EDC
_080A7484: .4byte gMonsterFileArchive
_080A7488: .4byte 0xffff0000
_080A748C: .4byte 0x0000ffff
_080A7490:
movs r1, 0
cmp r7, 0x47
bne _080A7498
movs r1, 0x1
_080A7498:
adds r0, r4, 0
bl GetPokemonOverworldPalette
lsls r0, 24
lsrs r0, 8
ldr r2, _080A74E0
ldr r1, [sp, 0xC]
ands r1, r2
orrs r1, r0
str r1, [sp, 0xC]
_080A74AC:
ldr r0, [r5, 0x4]
add r1, sp, 0xC
str r0, [r1, 0x4]
adds r0, r6, 0
mov r2, r8
bl sub_80A67CC
str r5, [r6, 0x54]
adds r0, r6, 0
adds r0, 0x52
movs r1, 0
ldrsh r0, [r0, r1]
cmp r0, 0
blt _080A74D4
movs r1, 0xC0
lsls r1, 2
adds r0, r6, 0
movs r2, 0
bl sub_80A6EFC
_080A74D4:
add sp, 0x14
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_080A74E0: .4byte 0x0000ffff
thumb_func_end sub_80A7428
thumb_func_start sub_80A74E4
sub_80A74E4:
push {lr}
bl sub_80A68A0
pop {r0}
bx r0
thumb_func_end sub_80A74E4
thumb_func_start sub_80A74F0
sub_80A74F0:
push {r4-r6,lr}
adds r6, r0, 0
lsls r1, 16
asrs r4, r1, 16
lsls r2, 24
asrs r5, r2, 24
cmp r3, 0
bge _080A7514
movs r0, 0xE0
lsls r0, 1
cmp r4, r0
beq _080A7512
adds r0, r4, 0
bl sub_800E700
adds r3, r0, 0
b _080A7514
_080A7512:
movs r3, 0
_080A7514:
adds r0, r6, 0
adds r1, r4, 0
adds r2, r5, 0
bl sub_80A7040
pop {r4-r6}
pop {r0}
bx r0
thumb_func_end sub_80A74F0
thumb_func_start sub_80A7524
sub_80A7524:
push {r4-r7,lr}
mov r7, r8
push {r7}
sub sp, 0x18
adds r5, r0, 0
adds r6, r2, 0
adds r7, r3, 0
lsls r1, 16
asrs r1, 16
mov r8, r1
mov r1, sp
bl sub_80A7094
lsls r0, 24
cmp r0, 0
beq _080A75C0
ldr r1, [r5, 0x5C]
movs r0, 0x1
negs r0, r0
cmp r1, r0
beq _080A758C
ldr r2, [r5, 0x60]
cmp r2, 0x3
bgt _080A7580
cmp r2, 0
blt _080A7580
add r4, sp, 0x8
lsls r2, 24
lsrs r2, 24
adds r0, r4, 0
adds r1, r5, 0
bl sub_800569C
movs r1, 0
ldrsh r0, [r4, r1]
str r0, [sp, 0xC]
movs r1, 0x2
ldrsh r0, [r4, r1]
add r2, sp, 0xC
str r0, [r2, 0x4]
adds r0, r5, 0
adds r1, r6, 0
adds r3, r7, 0
bl sub_80A7310
b _080A758C
_080A7580:
adds r0, r5, 0
adds r1, r6, 0
movs r2, 0
adds r3, r7, 0
bl sub_80A7310
_080A758C:
adds r0, r5, 0
adds r0, 0x50
ldrh r1, [r0]
movs r0, 0x80
lsls r0, 1
ands r0, r1
cmp r0, 0
beq _080A75B4
ldr r0, [sp]
lsls r0, 16
ldr r1, [sp, 0x4]
lsls r1, 16
lsrs r0, 16
orrs r0, r1
str r0, [sp, 0x14]
add r1, sp, 0x14
mov r0, r8
adds r2, r5, 0
bl AddShadowSprite
_080A75B4:
adds r0, r5, 0
adds r1, r6, 0
movs r2, 0
adds r3, r7, 0
bl sub_80A7310
_080A75C0:
add sp, 0x18
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_80A7524
thumb_func_start sub_80A75CC
sub_80A75CC:
push {r4-r6,lr}
sub sp, 0x8
adds r4, r0, 0
adds r6, r3, 0
lsls r2, 16
asrs r2, 13
ldr r0, _080A7618
adds r2, r0
movs r5, 0
movs r0, 0
ldrsb r0, [r2, r0]
lsls r0, 16
lsrs r0, 16
ldr r3, _080A761C
ldr r1, [sp]
ands r1, r3
orrs r1, r0
str r1, [sp]
ldrh r3, [r2, 0x2]
lsls r3, 16
ldr r0, _080A7620
ands r0, r1
orrs r0, r3
str r0, [sp]
ldr r0, [r2, 0x4]
cmp r0, 0
beq _080A7628
ldr r1, _080A7624
bl OpenFile
adds r5, r0, 0
movs r1, 0
bl GetFileDataPtr
ldr r0, [r5, 0x4]
str r0, [sp, 0x4]
b _080A762A
.align 2, 0
_080A7618: .4byte gGroundObjectKinds
_080A761C: .4byte 0xffff0000
_080A7620: .4byte 0x0000ffff
_080A7624: .4byte gOrnamentFileArchive
_080A7628:
str r5, [sp, 0x4]
_080A762A:
adds r0, r4, 0
mov r1, sp
adds r2, r6, 0
bl sub_80A67CC
str r5, [r4, 0x54]
adds r0, r4, 0
adds r0, 0x52
movs r1, 0
ldrsh r0, [r0, r1]
cmp r0, 0
blt _080A764E
movs r1, 0x80
lsls r1, 4
adds r0, r4, 0
movs r2, 0
bl sub_80A6EFC
_080A764E:
add sp, 0x8
pop {r4-r6}
pop {r0}
bx r0
thumb_func_end sub_80A75CC
thumb_func_start sub_80A7658
sub_80A7658:
push {lr}
bl sub_80A68A0
pop {r0}
bx r0
thumb_func_end sub_80A7658
thumb_func_start sub_80A7664
sub_80A7664:
push {r4-r6,lr}
adds r4, r0, 0
adds r5, r1, 0
adds r6, r2, 0
movs r1, 0
adds r2, r5, 0
adds r3, r6, 0
bl sub_80A7094
adds r0, r4, 0
adds r1, r5, 0
movs r2, 0
adds r3, r6, 0
bl sub_80A7310
pop {r4-r6}
pop {r0}
bx r0
thumb_func_end sub_80A7664
thumb_func_start sub_80A7688
sub_80A7688:
push {r4-r6,lr}
sub sp, 0x8
adds r4, r0, 0
adds r6, r3, 0
lsls r2, 16
asrs r2, 13
ldr r0, _080A76D4
adds r2, r0
movs r5, 0
movs r0, 0
ldrsb r0, [r2, r0]
lsls r0, 16
lsrs r0, 16
ldr r3, _080A76D8
ldr r1, [sp]
ands r1, r3
orrs r1, r0
str r1, [sp]
ldrh r3, [r2, 0x2]
lsls r3, 16
ldr r0, _080A76DC
ands r0, r1
orrs r0, r3
str r0, [sp]
ldr r0, [r2, 0x4]
cmp r0, 0
beq _080A76E4
ldr r1, _080A76E0
bl OpenFile
adds r5, r0, 0
movs r1, 0
bl GetFileDataPtr
ldr r0, [r5, 0x4]
str r0, [sp, 0x4]
b _080A76E6
.align 2, 0
_080A76D4: .4byte gUnknown_8117E8C
_080A76D8: .4byte 0xffff0000
_080A76DC: .4byte 0x0000ffff
_080A76E0: .4byte gOrnamentFileArchive
_080A76E4:
str r5, [sp, 0x4]
_080A76E6:
adds r0, r4, 0
mov r1, sp
adds r2, r6, 0
bl sub_80A67CC
str r5, [r4, 0x54]
adds r0, r4, 0
adds r0, 0x52
movs r1, 0
ldrsh r0, [r0, r1]
cmp r0, 0
blt _080A770A
movs r1, 0x80
lsls r1, 4
adds r0, r4, 0
movs r2, 0
bl sub_80A6EFC
_080A770A:
add sp, 0x8
pop {r4-r6}
pop {r0}
bx r0
thumb_func_end sub_80A7688
.align 2,0

View File

@@ -53,7 +53,7 @@ void sub_8005180(void);
void sub_8005304(void);
void sub_8005610(OpenedFile *, s32 vramIdx, s32 brightness, const RGB *ramp);
const RGB *sub_8005674(const EfoFileData *, s32 vramIdx);
void sub_800569C(DungeonPos *, axObject *, u8);
void sub_800569C(DungeonPos *, axdata *, u8);
void sub_8005700(DungeonPos *, axObject *);
void sub_8005770(s32, const RGB *color, s32 brightness, const RGB *ramp);

View File

@@ -346,7 +346,6 @@ SECTIONS {
asm/code_80A59DC.o(.text);
src/ground_map_2.o(.text);
src/ground_sprite.o(.text);
asm/ground_sprite.o(.text);
src/code_80A7714.o(.text);
src/ground_lives.o(.text);
asm/ground_lives.o(.text);

View File

@@ -100,7 +100,7 @@ static void sub_8040C4C(Entity *entity, Move *move, bool32 a2)
s32 r2 = sub_800E710(apparentId, sub_80412E0(move->id, GetApparentWeather(entity), TRUE));
if (r2 != -1) {
sub_800569C(&sp.unk8, &entity->axObj, r2);
sub_800569C(&sp.unk8, &entity->axObj.axdata, r2);
}
else {
sp.unk8 = (DungeonPos) {0};
@@ -252,7 +252,7 @@ static void sub_8041038(struct UnkStruct_8040094 *a0, Entity *entity, Move *move
s32 r2 = sub_800E710(entInfo->apparentID, sub_80412E0(move->id, GetApparentWeather(entity), a2));
if (r2 != -1) {
sub_800569C(&a0->unk8, &entity->axObj, r2);
sub_800569C(&a0->unk8, &entity->axObj.axdata, r2);
}
else {
a0->unk8 = (DungeonPos) {0};
@@ -312,7 +312,7 @@ void sub_8041168(Entity *entity, Entity *entity2, Move *move, DungeonPos *pos)
var2 = sub_800ECA4(var)->unk1c;
if (var2 != -1) {
if (EntityIsValid(entity2)) {
sub_800569C(&sp.unk8, &entity2->axObj, var2);
sub_800569C(&sp.unk8, &entity2->axObj.axdata, var2);
}
else {
sp.unk8 = (DungeonPos) {0};

View File

@@ -229,7 +229,7 @@ s32 sub_8041550(Entity *entity, s32 a1, u8 a2, u8 a3, s32 a4, u8 a5)
sub_804178C(a4 == 2);
}
sub_800569C(&pos, &entity->axObj, a3);
sub_800569C(&pos, &entity->axObj.axdata, a3);
if (pos.x != 99 && pos.y != 99) {
pixelPos.x = entity->pixelPos.x + (pos.x << 8);
pixelPos.y = (entity->pixelPos.y + (pos.y << 8)) - entInfo->unk174.raw;
@@ -1718,7 +1718,7 @@ void sub_8042EC8(Entity *a0, s32 a1)
if (strPtr->unk8 != -1) {
sub_800569C(&sp4,
&a0->axObj,
&a0->axObj.axdata,
strPtr->unk8);
}

View File

@@ -1489,7 +1489,7 @@ s32 sub_80861F8(s32 param_1,Entity *param_2,bool32 param_3)
pos.y = 0;
uStack_38 = sub_800E700(param_1Copy);
if (uStack_38 != -1) {
sub_800569C(&pos, &param_2->axObj, uStack_38);
sub_800569C(&pos, &param_2->axObj.axdata, uStack_38);
}
stack.unk0 = param_1Copy;
stack.unk4 = 0;

View File

@@ -567,7 +567,7 @@ s32 sub_8056564(Entity *entity, DungeonPos *pos, Move *move, s32 r4)
DungeonRunFrameActions(0x5E);
someRetVal = sub_800E710(entInfo->apparentID, sub_80412E0(move->id, GetApparentWeather(entity), 1));
if (someRetVal != -1) {
sub_800569C(&unkSp1.unk8, &entity->axObj, someRetVal);
sub_800569C(&unkSp1.unk8, &entity->axObj.axdata, someRetVal);
}
else {
unkSp1.unk8 = (DungeonPos) {0};

View File

@@ -918,3 +918,176 @@ bool8 sub_80A7310(struct UnkGroundSpriteStruct *ptr, PixelPos *posArg1, PixelPos
return FALSE;
}
}
void sub_80A73EC(void)
{
CopySpritesToOam();
nullsub_13();
sub_8005304();
nullsub_14();
gUnknown_2039DCC++;
if (++gUnknown_2039DCE > 11) {
gUnknown_2039DCE = 0;
}
}
#include "pokemon.h"
extern const char gUnknown_8117EDC[];
void sub_80A7428(struct UnkGroundSpriteStruct *ptr, s32 a1_, s32 monsterId_, s32 a3)
{
u8 name[12];
OpenedFile *file;
struct UnkGroundSpriteSubStructx48 spStruct;
s32 a1 = (s16) a1_;
// s16 memes strike again...
s32 monsterId = (s16) monsterId_;
s32 monsterIdS16 = (s16) monsterId;
sprintf(name, gUnknown_8117EDC, monsterIdS16);
file = OpenFile(name, &gMonsterFileArchive);
GetFileDataPtr(file, 0); // Unused return value
spStruct.unk0 = GetBodySize(monsterId);
if (monsterId == MONSTER_STATUE) {
spStruct.unk2 = 0x122;
}
else {
bool32 kecleonShop = (a1 == 71);
spStruct.unk2 = GetPokemonOverworldPalette(monsterId, kecleonShop);
}
spStruct.axmain = (axmain *) file->data;
sub_80A67CC(ptr, &spStruct, a3);
ptr->unk54 = file;
if (ptr->unk52 >= 0) {
sub_80A6EFC(ptr, 0x300, 0);
}
}
void sub_80A74E4(struct UnkGroundSpriteStruct *ptr)
{
sub_80A68A0(ptr);
}
extern s32 sub_800E700(s32);
extern bool8 AddShadowSprite(s32 species, DungeonPos* a2, axdata* a3);
void sub_80A74F0(struct UnkGroundSpriteStruct *ptr, s32 a1_, s32 a2_, s32 a3)
{
s32 a1 = (s16) a1_;
s32 a2 = (s8) a2_;
if (a3 < 0) {
if (a1 != 0x1C0) {
a3 = sub_800E700(a1);
}
else {
a3 = 0;
}
}
sub_80A7040(ptr, a1, a2, a3);
}
void sub_80A7524(struct UnkGroundSpriteStruct *ptr, s32 monsterId_, PixelPos *pixelPosArg, s32 a3)
{
PixelPos pixelPosSp;
DungeonPos pos;
s32 monsterId = (s16) monsterId_;
if (sub_80A7094(ptr, &pixelPosSp, pixelPosArg, a3)) {
if (ptr->unk5C != -1) {
PixelPos pixelPosSp2;
switch (ptr->unk60) {
case 0:
case 1:
case 2:
case 3:
sub_800569C(&pos, &ptr->axdata, ptr->unk60);
pixelPosSp2.x = pos.x;
pixelPosSp2.y = pos.y;
sub_80A7310(ptr, pixelPosArg, &pixelPosSp2, a3);
break;
default:
sub_80A7310(ptr, pixelPosArg, NULL, a3);
break;
}
}
if (ptr->flags_0x50 & 0x100) {
DungeonPos shadowPos = {pixelPosSp.x, pixelPosSp.y};
AddShadowSprite(monsterId, &shadowPos, &ptr->axdata);
}
sub_80A7310(ptr, pixelPosArg, NULL, a3);
}
}
struct GroundObjectKind
{
s8 unk0;
u16 unk2;
const char *fileName;
};
extern const struct GroundObjectKind gGroundObjectKinds[];
extern const struct GroundObjectKind gUnknown_8117E8C[];
void sub_80A75CC(struct UnkGroundSpriteStruct *ptr, s32 unused, s32 a2_, s32 a3)
{
struct UnkGroundSpriteSubStructx48 sp;
s32 a2 = (s16) a2_;
const struct GroundObjectKind *objKind = &gGroundObjectKinds[a2];
OpenedFile *file = NULL;
sp.unk0 = objKind->unk0;
sp.unk2 = objKind->unk2;
if (objKind->fileName != 0) {
file = OpenFile(objKind->fileName, &gOrnamentFileArchive);
GetFileDataPtr(file, 0);
sp.axmain = (axmain *) file->data;
}
else {
sp.axmain = NULL;
}
sub_80A67CC(ptr, &sp, a3);
ptr->unk54 = file;
if (ptr->unk52 >= 0) {
sub_80A6EFC(ptr, 0x800, 0);
}
}
void sub_80A7658(struct UnkGroundSpriteStruct *ptr)
{
sub_80A68A0(ptr);
}
void sub_80A7664(struct UnkGroundSpriteStruct *ptr, PixelPos *pixelPos, s32 a3)
{
sub_80A7094(ptr, NULL, pixelPos, a3);
sub_80A7310(ptr, pixelPos, NULL, a3);
}
// Identical to sub_80A75CC, except uses a different table.
void sub_80A7688(struct UnkGroundSpriteStruct *ptr, s32 unused, s32 a2_, s32 a3)
{
struct UnkGroundSpriteSubStructx48 sp;
s32 a2 = (s16) a2_;
const struct GroundObjectKind *objKind = &gUnknown_8117E8C[a2];
OpenedFile *file = NULL;
sp.unk0 = objKind->unk0;
sp.unk2 = objKind->unk2;
if (objKind->fileName != 0) {
file = OpenFile(objKind->fileName, &gOrnamentFileArchive);
GetFileDataPtr(file, 0);
sp.axmain = (axmain *) file->data;
}
else {
sp.axmain = NULL;
}
sub_80A67CC(ptr, &sp, a3);
ptr->unk54 = file;
if (ptr->unk52 >= 0) {
sub_80A6EFC(ptr, 0x800, 0);
}
}

View File

@@ -647,7 +647,7 @@ const RGB *sub_8005674(const EfoFileData *a0, s32 vramIdx)
}
// arm9.bin::02001894
void sub_800569C(DungeonPos *a0, axObject *a1, u8 a2)
void sub_800569C(DungeonPos *a0, axdata *a1, u8 a2)
{
DungeonPos *ptr;
DungeonPos *ptr2;
@@ -656,11 +656,11 @@ void sub_800569C(DungeonPos *a0, axObject *a1, u8 a2)
a0->x = 0;
a0->y = 0;
if (!(a1->axdata.flags >> 15) || a2 >= 4)
if (!(a1->flags >> 15) || a2 >= 4)
return;
if (a1->axdata.positions != NULL) {
ptr = &((DungeonPos*)a1->axdata.positions)[a1->axdata.sub1.poseId * 4];
if (a1->positions != NULL) {
ptr = &((DungeonPos*)a1->positions)[a1->sub1.poseId * 4];
ptr2 = &ptr[a2];
if (*&ptr2->x == 99 && *&ptr2->y == 99) {
a0->x = 99;
@@ -668,8 +668,8 @@ void sub_800569C(DungeonPos *a0, axObject *a1, u8 a2)
}
else {
ptr3 = &ptr[a2];
a0->x = a1->axdata.sub1.offset.x + ptr3->x;
a0->y = a1->axdata.sub1.offset.y + ptr3->y;
a0->x = a1->sub1.offset.x + ptr3->x;
a0->y = a1->sub1.offset.y + ptr3->y;
}
}
else {