diff --git a/asm/ground_lives.s b/asm/ground_lives.s index 26808de70..291417865 100644 --- a/asm/ground_lives.s +++ b/asm/ground_lives.s @@ -6,457 +6,7 @@ .text - thumb_func_start sub_80AAF68 -sub_80AAF68: - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x8E - lsls r1, 1 - adds r0, r4, r1 - ldr r0, [r0] - movs r1, 0x80 - lsls r1, 7 - ands r0, r1 - cmp r0, 0 - beq _080AB002 - movs r2, 0 - ldrsh r0, [r4, r2] - movs r1, 0x1 - bl sub_80A93F0 - lsls r0, 24 - cmp r0, 0 - beq _080AAFD0 - movs r1, 0xE4 - lsls r1, 1 - adds r0, r4, r1 - movs r2, 0 - ldrsh r1, [r0, r2] - cmp r1, 0 - bne _080AAFA6 - movs r0, 0xB5 - lsls r0, 1 - adds r1, r4, r0 - adds r0, 0x4C - b _080AAFB4 -_080AAFA6: - movs r0, 0xDB - lsls r0, 1 - cmp r1, r0 - beq _080AAFC2 - subs r0, 0x4C - adds r1, r4, r0 - adds r0, 0x56 -_080AAFB4: - strh r0, [r1] - movs r2, 0xB6 - lsls r2, 1 - adds r1, r4, r2 - movs r0, 0x1 - negs r0, r0 - str r0, [r1] -_080AAFC2: - movs r1, 0 - ldrsh r0, [r4, r1] - movs r1, 0x80 - lsls r1, 17 - bl sub_80A8750 - b _080AB002 -_080AAFD0: - movs r2, 0xE4 - lsls r2, 1 - adds r0, r4, r2 - movs r2, 0 - ldrsh r1, [r0, r2] - movs r0, 0xDB - lsls r0, 1 - cmp r1, r0 - bne _080AAFF6 - subs r0, 0x4C - adds r1, r4, r0 - adds r0, 0x56 - strh r0, [r1] - movs r2, 0xB6 - lsls r2, 1 - adds r1, r4, r2 - movs r0, 0x1 - negs r0, r0 - str r0, [r1] -_080AAFF6: - movs r1, 0 - ldrsh r0, [r4, r1] - movs r1, 0x80 - lsls r1, 17 - bl sub_80A86C8 -_080AB002: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80AAF68 - thumb_func_start CallbackLivesGetIndex -CallbackLivesGetIndex: - movs r1, 0 - ldrsh r0, [r0, r1] - bx lr - thumb_func_end CallbackLivesGetIndex - - thumb_func_start CallbackLivesGetSize -CallbackLivesGetSize: - ldr r2, [r0, 0xC] - ldr r3, [r0, 0x10] - str r2, [r1] - str r3, [r1, 0x4] - bx lr - thumb_func_end CallbackLivesGetSize - - thumb_func_start CallbackLivesSetHitboxPos -CallbackLivesSetHitboxPos: - push {r4,lr} - adds r3, r0, 0 - adds r4, r1, 0 - cmp r4, 0 - beq _080AB05C - movs r0, 0xA2 - lsls r0, 1 - adds r2, r3, r0 - ldr r1, [r4] - ldr r0, [r3, 0x14] - subs r0, r1, r0 - str r0, [r2] - movs r0, 0xA6 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x14] - adds r1, r0 - str r1, [r2] - movs r0, 0xA4 - lsls r0, 1 - adds r2, r3, r0 - ldr r1, [r4, 0x4] - ldr r0, [r3, 0x18] - subs r0, r1, r0 - str r0, [r2] - movs r0, 0xA8 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x18] - adds r1, r0 - str r1, [r2] - b _080AB0C2 -_080AB05C: - movs r0, 0xA2 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x20] - ldr r1, [r3, 0x14] - subs r0, r1 - str r0, [r2] - movs r0, 0xA6 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x20] - ldr r1, [r3, 0x14] - adds r0, r1 - str r0, [r2] - movs r0, 0xA4 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x24] - ldr r1, [r3, 0x18] - subs r0, r1 - str r0, [r2] - movs r0, 0xA8 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x24] - ldr r1, [r3, 0x18] - adds r0, r1 - str r0, [r2] - movs r2, 0xAA - lsls r2, 1 - adds r1, r3, r2 - adds r2, 0x4 - adds r0, r3, r2 - str r4, [r0] - str r4, [r1] - movs r0, 0xA1 - lsls r0, 1 - adds r2, r3, r0 - movs r1, 0 - ldrsb r1, [r2, r1] - movs r0, 0x1C - ldrsb r0, [r3, r0] - cmp r1, r0 - beq _080AB0BE - movs r0, 0xAE - lsls r0, 1 - adds r1, r3, r0 - movs r0, 0x1 - strb r0, [r1] -_080AB0BE: - ldrb r0, [r3, 0x1C] - strb r0, [r2] -_080AB0C2: - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackLivesSetHitboxPos - - thumb_func_start CallbackLivesSetPositionBounds -CallbackLivesSetPositionBounds: - push {r4,lr} - ldr r3, [r1] - ldr r4, [r1, 0x4] - str r3, [r0, 0x28] - str r4, [r0, 0x2C] - ldr r1, [r2] - ldr r2, [r2, 0x4] - str r1, [r0, 0x30] - str r2, [r0, 0x34] - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackLivesSetPositionBounds - - thumb_func_start CallbackLivesGetHitboxCenter -CallbackLivesGetHitboxCenter: - adds r3, r0, 0 - movs r2, 0xA2 - lsls r2, 1 - adds r0, r3, r2 - ldr r0, [r0] - ldr r2, [r3, 0x14] - adds r0, r2 - str r0, [r1] - movs r2, 0xA4 - lsls r2, 1 - adds r0, r3, r2 - ldr r0, [r0] - ldr r2, [r3, 0x18] - adds r0, r2 - str r0, [r1, 0x4] - bx lr - thumb_func_end CallbackLivesGetHitboxCenter - - thumb_func_start CallbackLivesMoveReal -CallbackLivesMoveReal: - push {lr} - bl sub_80A9F20 - pop {r1} - bx r1 - thumb_func_end CallbackLivesMoveReal - - thumb_func_start CallbackLivesGetPosHeightAndUnk -CallbackLivesGetPosHeightAndUnk: - push {r4,lr} - adds r3, r0, 0 - movs r4, 0xAA - lsls r4, 1 - adds r0, r3, r4 - ldr r0, [r0] - str r0, [r1] - movs r1, 0xAC - lsls r1, 1 - adds r0, r3, r1 - ldr r0, [r0] - str r0, [r2] - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackLivesGetPosHeightAndUnk - - thumb_func_start CallbackLivesSetPosHeight -CallbackLivesSetPosHeight: - movs r2, 0xAA - lsls r2, 1 - adds r0, r2 - str r1, [r0] - bx lr - thumb_func_end CallbackLivesSetPosHeight - - thumb_func_start CallbackLivesGetDirection -CallbackLivesGetDirection: - movs r2, 0xA1 - lsls r2, 1 - adds r0, r2 - ldrb r0, [r0] - strb r0, [r1] - bx lr - thumb_func_end CallbackLivesGetDirection - - thumb_func_start CallbackLivesSetDirection -CallbackLivesSetDirection: - push {lr} - adds r3, r0, 0 - lsls r1, 24 - asrs r1, 24 - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080AB17C - movs r0, 0xA1 - lsls r0, 1 - adds r2, r3, r0 - lsls r0, r1, 24 - lsrs r0, 24 - strb r0, [r2] - ldr r2, _080AB180 - adds r1, r3, r2 - ldrb r1, [r1] - lsls r1, 24 - asrs r1, 24 - lsls r0, 24 - asrs r0, 24 - cmp r1, r0 - beq _080AB17C - movs r0, 0xAE - lsls r0, 1 - adds r1, r3, r0 - movs r0, 0x1 - strb r0, [r1] -_080AB17C: - pop {r0} - bx r0 - .align 2, 0 -_080AB180: .4byte 0x0000015d - thumb_func_end CallbackLivesSetDirection - - thumb_func_start CallbackLivesSetEventIndex -CallbackLivesSetEventIndex: - push {lr} - lsls r1, 16 - lsrs r1, 16 - bl sub_80A9750 - pop {r0} - bx r0 - thumb_func_end CallbackLivesSetEventIndex - - thumb_func_start CallbackLivesSetUnk_80AB194 -CallbackLivesSetUnk_80AB194: - push {lr} - mov r12, r0 - lsls r1, 16 - asrs r1, 16 - adds r3, r1, 0 - cmp r1, 0 - bne _080AB1A8 - movs r0, 0xE0 - lsls r0, 1 - adds r3, r0, 0 -_080AB1A8: - movs r0, 0xB5 - lsls r0, 1 - add r0, r12 - strh r3, [r0] - movs r0, 0xB6 - lsls r0, 1 - add r0, r12 - str r2, [r0] - pop {r0} - bx r0 - thumb_func_end CallbackLivesSetUnk_80AB194 - - thumb_func_start nullsub_211 -nullsub_211: - bx lr - thumb_func_end nullsub_211 - - thumb_func_start CallbackLivesSpriteRelatedCheck_80AB1C0 -CallbackLivesSpriteRelatedCheck_80AB1C0: - push {lr} - adds r1, r0, 0 - movs r2, 0xAE - lsls r2, 1 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _080AB1DE - adds r2, 0x14 - adds r0, r1, r2 - bl sub_80A66F8 - lsls r0, 24 - lsrs r0, 24 - b _080AB1E0 -_080AB1DE: - movs r0, 0x1 -_080AB1E0: - pop {r1} - bx r1 - thumb_func_end CallbackLivesSpriteRelatedCheck_80AB1C0 - - thumb_func_start CallbackLivesSpriteRelated_80AB1E4 -CallbackLivesSpriteRelated_80AB1E4: - push {lr} - adds r1, r0, 0 - movs r2, 0xB5 - lsls r2, 1 - adds r0, r1, r2 - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r0, 0 - bne _080AB206 - movs r2, 0xB8 - lsls r2, 1 - adds r0, r1, r2 - bl sub_80A671C - lsls r0, 24 - lsrs r0, 24 - b _080AB208 -_080AB206: - movs r0, 0x1 -_080AB208: - pop {r1} - bx r1 - thumb_func_end CallbackLivesSpriteRelated_80AB1E4 - - thumb_func_start CallbackLivesGetFlags -CallbackLivesGetFlags: - movs r2, 0x8E - lsls r2, 1 - adds r0, r2 - ldr r0, [r0] - str r0, [r1] - bx lr - thumb_func_end CallbackLivesGetFlags - - thumb_func_start CallbackLivesSetFlags -CallbackLivesSetFlags: - push {lr} - movs r2, 0 - ldrsh r0, [r0, r2] - bl sub_80A86C8 - pop {r0} - bx r0 - thumb_func_end CallbackLivesSetFlags - - thumb_func_start CallbackLivesClearFlags -CallbackLivesClearFlags: - push {lr} - movs r2, 0 - ldrsh r0, [r0, r2] - bl sub_80A8750 - pop {r0} - bx r0 - thumb_func_end CallbackLivesClearFlags - - thumb_func_start CallbackLivesSpriteRelated_80AB238 -CallbackLivesSpriteRelated_80AB238: - push {lr} - movs r2, 0xB8 - lsls r2, 1 - adds r0, r2 - bl sub_80A6EC8 - pop {r0} - bx r0 - thumb_func_end CallbackLivesSpriteRelated_80AB238 - - thumb_func_start CallbackLivesMoveRelative -CallbackLivesMoveRelative: - push {lr} - bl sub_80A9F94 - pop {r1} - bx r1 - thumb_func_end CallbackLivesMoveRelative thumb_func_start GroundLives_Action GroundLives_Action: diff --git a/src/ground_lives.c b/src/ground_lives.c index 4f073e231..f3f6eef46 100644 --- a/src/ground_lives.c +++ b/src/ground_lives.c @@ -65,8 +65,8 @@ struct unkStruct_3001B84_sub u16 unk160; s32 unk164; s16 unk168; - u16 unk16A; - u8 fill16C[1]; + s16 unk16A; + s32 unk16C; struct UnkGroundSpriteStruct unk170; }; @@ -906,7 +906,7 @@ void sub_80A8750(s32 id_, u32 flags) } extern void sub_809CD8C(struct Struct3001B84_sub120 *dst, s32 a1); -extern bool8 sub_809B1C0(s32 a0, u32 kind, u8 *a2); +extern bool8 sub_809B1C0(s32 a0, u32 kind, PokemonStruct1 *a2); extern bool8 GetPredefinedScript(Action *param_1, ScriptInfoSmall *script, s32 _index); extern bool8 sub_809D678(Action *action); @@ -920,7 +920,7 @@ void sub_80A87AC(s32 id_, s32 a1) } } -bool8 sub_80A87E0(s32 id_, u8 *a1) +bool8 sub_80A87E0(s32 id_, PokemonStruct1 *a1) { s32 id = (s16) id_; struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; @@ -1915,7 +1915,7 @@ s32 sub_80AA180(struct unkStruct_3001B84_sub *livesPtr, u32 flags, PixelPos *pix s8 *dirDst = &livesPtr->unk142; s8 dirS8 = (s8) dir; *dirDst = dirS8; - if (livesPtr->unk15D != dirS8) { + if (livesPtr->unk15D != livesPtr->unk142) { livesPtr->unk15C = 1; } if (sub_80AA3F8(livesPtr, livesPtr->unk142)) @@ -1938,7 +1938,7 @@ s32 sub_80AA180(struct unkStruct_3001B84_sub *livesPtr, u32 flags, PixelPos *pix s8 *dirDst = &livesPtr->unk142; s8 dirS8 = (s8) dir; *dirDst = dirS8; - if (livesPtr->unk15D != dirS8) { + if (livesPtr->unk15D != livesPtr->unk142) { livesPtr->unk15C = 1; } if (sub_80AA3F8(livesPtr, livesPtr->unk142)) @@ -2417,7 +2417,7 @@ void sub_80AAAE8(struct unkStruct_3001B84_sub *livesPtr, u32 a1, s32 dir_) GetFunctionScript(NULL, &scriptInfo, 6); GroundLives_ExecuteScript(sp, (void *) &livesPtr->unk38.unk8, &scriptInfo); _ExecutePlayerScript(livesPtr, NULL, NULL); - sub_809B1C0(7, 0, (void *) sub_80A8E9C(sp)); // TODO: fix + sub_809B1C0(7, 0, sub_80A8E9C(sp)); // TODO: fix } else { sub_809B1C0(7, 0, NULL); @@ -2460,4 +2460,184 @@ void sub_80AAAE8(struct unkStruct_3001B84_sub *livesPtr, u32 a1, s32 dir_) } } +void sub_80AAF68(struct unkStruct_3001B84_sub *livesPtr, u32 unused) +{ + if (livesPtr->unk11C & 0x4000) { + if (sub_80A93F0(livesPtr->unk0, 1)) { + if (livesPtr->unk170.unk58 == 0) { + livesPtr->unk16A = 438; + livesPtr->unk16C = -1; + } + else if (livesPtr->unk170.unk58 != 438) { + livesPtr->unk16A = 448; + livesPtr->unk16C = -1; + } + sub_80A8750(livesPtr->unk0, 0x1000000); + } + else { + if (livesPtr->unk170.unk58 == 438) { + livesPtr->unk16A = 448; + livesPtr->unk16C = -1; + } + sub_80A86C8(livesPtr->unk0, 0x1000000); + } + } +} + +s32 CallbackLivesGetIndex(struct unkStruct_3001B84_sub *livesPtr) +{ + return livesPtr->unk0; +} + +void CallbackLivesGetSize(struct unkStruct_3001B84_sub *livesPtr, PixelPos *out) +{ + *out = livesPtr->unkC; +} + +void CallbackLivesSetHitboxPos(struct unkStruct_3001B84_sub *livesPtr, PixelPos *posOrNull) +{ + if (posOrNull != NULL) { + livesPtr->unk144.x = posOrNull->x - livesPtr->unk14.x; + livesPtr->unk14C.x = posOrNull->x + livesPtr->unk14.x; + livesPtr->unk144.y = posOrNull->y - livesPtr->unk14.y; + livesPtr->unk14C.y = posOrNull->y + livesPtr->unk14.y; + } + else { + livesPtr->unk144.x = livesPtr->unk20.x - livesPtr->unk14.x; + livesPtr->unk14C.x = livesPtr->unk20.x + livesPtr->unk14.x; + livesPtr->unk144.y = livesPtr->unk20.y - livesPtr->unk14.y; + livesPtr->unk14C.y = livesPtr->unk20.y + livesPtr->unk14.y; + livesPtr->unk154.x = livesPtr->unk154.y = 0; + if (livesPtr->unk142 != livesPtr->unk1C) { + livesPtr->unk15C = 1; + } + livesPtr->unk142 = livesPtr->unk1C; + } +} + +void CallbackLivesSetPositionBounds(struct unkStruct_3001B84_sub *livesPtr, PixelPos *from, PixelPos *to) +{ + livesPtr->unk28 = *from; + livesPtr->unk30 = *to; +} + +void CallbackLivesGetHitboxCenter(struct unkStruct_3001B84_sub *livesPtr, PixelPos *out) +{ + out->x = livesPtr->unk144.x + livesPtr->unk14.x; + out->y = livesPtr->unk144.y + livesPtr->unk14.y; +} + +bool32 CallbackLivesMoveReal(struct unkStruct_3001B84_sub *livesPtr, PixelPos *pos) +{ + return sub_80A9F20(livesPtr, pos); +} + +void CallbackLivesGetPosHeightAndUnk(struct unkStruct_3001B84_sub *livesPtr, u32 *height, u32 *unk) +{ + *height = livesPtr->unk154.x; + *unk = livesPtr->unk154.y; +} + +void CallbackLivesSetPosHeight(struct unkStruct_3001B84_sub *livesPtr, u32 height) +{ + livesPtr->unk154.x = height; +} + +void CallbackLivesGetDirection(struct unkStruct_3001B84_sub *livesPtr, s8 *dir) +{ + *dir = livesPtr->unk142; +} + +void CallbackLivesSetDirection(struct unkStruct_3001B84_sub *livesPtr, s32 dir_) +{ + s32 dir = (s8) dir_; + + if (dir != -1) { + // s8 memes + s8 *dirDst = &livesPtr->unk142; + s8 dirS8 = (s8) dir; + *dirDst = dirS8; + if (livesPtr->unk15D != livesPtr->unk142) { + livesPtr->unk15C = 1; + } + } +} + +void CallbackLivesSetEventIndex(struct unkStruct_3001B84_sub *livesPtr, u16 a1) +{ + sub_80A9750(livesPtr, a1); +} + +// s16 memes forced a fakematch https://decomp.me/scratch/x2ALy +void CallbackLivesSetUnk_80AB194(struct unkStruct_3001B84_sub *livesPtr, s32 a1_, s32 a2) +{ + s32 a1Match = (s16) a1_; + #ifndef NONMATCHING + register s16 a1 asm("r3") = a1Match; + #else + s32 a1 = a1Match; + #endif + + if (a1Match == 0) { + a1 = 448; + } + + livesPtr->unk16A = a1; + livesPtr->unk16C = a2; +} + +void nullsub_211(void) +{ + +} + +extern bool8 sub_80A66F8(struct UnkGroundSpriteStruct *ptr); +extern bool8 sub_80A671C(struct UnkGroundSpriteStruct *ptr); +extern void sub_80A6EC8(struct UnkGroundSpriteStruct *ptr, s32 a1); + +bool8 CallbackLivesSpriteRelatedCheck_80AB1C0(struct unkStruct_3001B84_sub *livesPtr) +{ + if (livesPtr->unk15C != 0) { + return TRUE; + } + else { + return sub_80A66F8(&livesPtr->unk170); + } +} + +bool8 CallbackLivesSpriteRelated_80AB1E4(struct unkStruct_3001B84_sub *livesPtr) +{ + if (livesPtr->unk16A != 0) { + return TRUE; + } + else { + return sub_80A671C(&livesPtr->unk170); + } +} + +void CallbackLivesGetFlags(struct unkStruct_3001B84_sub *livesPtr, u32 *flags) +{ + *flags = livesPtr->unk11C; +} + +void CallbackLivesSetFlags(struct unkStruct_3001B84_sub *livesPtr, u32 flags) +{ + sub_80A86C8(livesPtr->unk0, flags); +} + +void CallbackLivesClearFlags(struct unkStruct_3001B84_sub *livesPtr, u32 flags) +{ + sub_80A8750(livesPtr->unk0, flags); +} + +void CallbackLivesSpriteRelated_80AB238(struct unkStruct_3001B84_sub *livesPtr, s32 a1) +{ + sub_80A6EC8(&livesPtr->unk170, a1); +} + +s32 CallbackLivesMoveRelative(struct unkStruct_3001B84_sub *livesPtr, PixelPos *pos) +{ + return sub_80A9F94(livesPtr, pos); +} + //