From b7f5d9da2a2c2ea181c4c8f19a69c20b87f5b528 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 15 May 2025 20:37:16 +0200 Subject: [PATCH] ground sprite decompiled --- asm/ground_sprite.s | 420 ---------------------------------------- include/sprite.h | 2 +- ld_script.txt | 1 - src/code_8040094_1.c | 6 +- src/code_8041AD0.c | 4 +- src/code_80848F0.c | 2 +- src/dungeon_move_util.c | 2 +- src/ground_sprite.c | 173 +++++++++++++++++ src/sprite.c | 12 +- 9 files changed, 187 insertions(+), 435 deletions(-) delete mode 100644 asm/ground_sprite.s diff --git a/asm/ground_sprite.s b/asm/ground_sprite.s deleted file mode 100644 index a75f24ce7..000000000 --- a/asm/ground_sprite.s +++ /dev/null @@ -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 diff --git a/include/sprite.h b/include/sprite.h index ecb160733..d8d81f121 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -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); diff --git a/ld_script.txt b/ld_script.txt index afd29e6dc..2560b9f39 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -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); diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index 07efa330b..7e699edf3 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -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}; diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index e7929a8e8..c5ee25342 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -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); } diff --git a/src/code_80848F0.c b/src/code_80848F0.c index 404f3fa8e..4fec4cc09 100644 --- a/src/code_80848F0.c +++ b/src/code_80848F0.c @@ -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, ¶m_2->axObj, uStack_38); + sub_800569C(&pos, ¶m_2->axObj.axdata, uStack_38); } stack.unk0 = param_1Copy; stack.unk4 = 0; diff --git a/src/dungeon_move_util.c b/src/dungeon_move_util.c index c8907f3ef..3fac45050 100644 --- a/src/dungeon_move_util.c +++ b/src/dungeon_move_util.c @@ -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}; diff --git a/src/ground_sprite.c b/src/ground_sprite.c index f6d021249..8b4e3777c 100644 --- a/src/ground_sprite.c +++ b/src/ground_sprite.c @@ -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); + } +} diff --git a/src/sprite.c b/src/sprite.c index d4c95ef09..3e68ecf71 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -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 {