diff --git a/asm/ground_sprite.s b/asm/ground_sprite.s index db21cc1fa..b72e62b27 100644 --- a/asm/ground_sprite.s +++ b/asm/ground_sprite.s @@ -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} diff --git a/include/ground_sprite.h b/include/ground_sprite.h index fdaf41da7..c83fe64a1 100644 --- a/include/ground_sprite.h +++ b/include/ground_sprite.h @@ -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 \ No newline at end of file +#endif // GUARD_GROUND_SPRITE_H diff --git a/src/ground_sprite.c b/src/ground_sprite.c index 0c807d3ae..0a5441833 100644 --- a/src/ground_sprite.c +++ b/src/ground_sprite.c @@ -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; + } +}