From d799c4cb2dd8f0d8ac54a52f1b2e935aed31acbd Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 17 Apr 2022 15:59:15 +0300 Subject: [PATCH] Match lilypadLarge functions and add const data --- .../lilypadLarge/sub_080855E8.inc | 564 ------------------ .../lilypadLarge/sub_08085D60.inc | 139 ----- assets/assets.json | 15 - data/const/object/lilypadLarge.s | 27 - linker.ld | 2 +- src/object/lilypadLarge.c | 287 ++++++++- 6 files changed, 270 insertions(+), 764 deletions(-) delete mode 100644 asm/non_matching/lilypadLarge/sub_080855E8.inc delete mode 100644 asm/non_matching/lilypadLarge/sub_08085D60.inc delete mode 100644 data/const/object/lilypadLarge.s diff --git a/asm/non_matching/lilypadLarge/sub_080855E8.inc b/asm/non_matching/lilypadLarge/sub_080855E8.inc deleted file mode 100644 index 2c8e391c..00000000 --- a/asm/non_matching/lilypadLarge/sub_080855E8.inc +++ /dev/null @@ -1,564 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r7, r0, #0 - ldrb r1, [r7, #0x10] - movs r0, #0x20 - orrs r0, r1 - strb r0, [r7, #0x10] - ldr r6, _0808564C @ =gPlayerEntity - adds r0, r7, #0 - adds r1, r6, #0 - movs r2, #0x18 - bl sub_0806FC80 - adds r1, r0, #0 - cmp r1, #0 - beq _080856EE - ldr r3, _08085650 @ =gPlayerState - ldr r0, [r3, #0x30] - movs r1, #2 - orrs r0, r1 - str r0, [r3, #0x30] - ldr r4, [r6, #0x34] - cmp r4, #0 - beq _0808561C - b _080857CE -_0808561C: - adds r5, r3, #0 - adds r5, #0x26 - ldrb r0, [r5] - cmp r0, #0 - beq _08085634 - adds r2, r6, #0 - adds r2, #0x3c - ldrb r1, [r2] - movs r0, #0xfb - ands r0, r1 - strb r0, [r2] - strb r4, [r5] -_08085634: - adds r0, r3, #0 - adds r0, #0x84 - str r7, [r0] - adds r0, r7, #0 - adds r0, #0x38 - ldrb r0, [r0] - cmp r0, #1 - bne _08085654 - adds r0, r6, #0 - bl ResetCollisionLayer - b _0808565A - .align 2, 0 -_0808564C: .4byte gPlayerEntity -_08085650: .4byte gPlayerState -_08085654: - adds r0, r6, #0 - bl sub_08004542 -_0808565A: - ldrb r0, [r7, #0xf] - cmp r0, #0 - bne _0808568C - movs r0, #4 - strb r0, [r7, #0xf] -_08085664: - adds r0, r7, #0 - movs r1, #8 - movs r2, #0xa - bl sub_080A2AF4 - ldrb r0, [r7, #0xf] - subs r0, #1 - strb r0, [r7, #0xf] - lsls r0, r0, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #0 - bne _08085664 - movs r0, #1 - strb r0, [r7, #0xf] - ldrb r1, [r7, #0xe] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r7, #0xe] - str r2, [r7, #0x70] - str r2, [r7, #0x6c] -_0808568C: - ldr r2, _080856B8 @ =gPlayerState - ldrb r0, [r2, #0x1c] - cmp r0, #3 - beq _08085696 - b _080857CE -_08085696: - ldr r1, _080856BC @ =gUnk_08120620 - ldrb r0, [r2, #0x1d] - subs r0, #1 - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r4, [r0] - ldr r0, _080856C0 @ =gPlayerEntity - ldrb r0, [r0, #0x14] - movs r1, #6 - ands r1, r0 - cmp r1, #2 - beq _080856DE - cmp r1, #2 - bgt _080856C4 - cmp r1, #0 - beq _080856D6 - b _080857CE - .align 2, 0 -_080856B8: .4byte gPlayerState -_080856BC: .4byte gUnk_08120620 -_080856C0: .4byte gPlayerEntity -_080856C4: - cmp r1, #4 - beq _080856CE - cmp r1, #6 - beq _080856E6 - b _080857CE -_080856CE: - ldr r0, [r7, #0x70] - subs r0, r0, r4 - str r0, [r7, #0x70] - b _080857CE -_080856D6: - ldr r0, [r7, #0x70] - adds r0, r0, r4 - str r0, [r7, #0x70] - b _080857CE -_080856DE: - ldr r0, [r7, #0x6c] - subs r0, r0, r4 - str r0, [r7, #0x6c] - b _080857CE -_080856E6: - ldr r0, [r7, #0x6c] - adds r0, r0, r4 - str r0, [r7, #0x6c] - b _080857CE -_080856EE: - ldrb r0, [r7, #0xf] - cmp r0, #0 - beq _080856FC - strb r1, [r7, #0xf] - movs r0, #0x83 - bl SoundReq -_080856FC: - adds r2, r7, #0 - adds r2, #0x41 - ldrb r1, [r2] - movs r0, #0x7f - ands r0, r1 - mov r8, r2 - cmp r0, #0x13 - bne _080857C8 - movs r0, #0x2e - ldrsh r1, [r6, r0] - ldr r3, _08085758 @ =gUnk_08126EE4 - ldrb r2, [r6, #0x14] - movs r0, #0xe - ands r0, r2 - adds r0, r0, r3 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r5, r1, r0 - movs r0, #0x32 - ldrsh r1, [r6, r0] - movs r0, #1 - orrs r0, r2 - adds r0, r0, r3 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r3, r1, r0 - movs r1, #0x2e - ldrsh r0, [r7, r1] - movs r2, #0x32 - ldrsh r1, [r7, r2] - adds r2, r5, #0 - bl CalculateDirectionTo - strb r0, [r7, #0x15] - ldr r0, _0808575C @ =gPlayerState - ldrb r0, [r0, #0x1d] - cmp r0, #2 - beq _0808576A - cmp r0, #2 - bgt _08085760 - cmp r0, #1 - beq _08085770 - b _08085774 - .align 2, 0 -_08085758: .4byte gUnk_08126EE4 -_0808575C: .4byte gPlayerState -_08085760: - cmp r0, #3 - bne _08085774 - movs r4, #0x80 - lsls r4, r4, #3 - b _08085774 -_0808576A: - movs r4, #0xc0 - lsls r4, r4, #2 - b _08085774 -_08085770: - movs r4, #0x80 - lsls r4, r4, #2 -_08085774: - ldr r6, _080858A8 @ =gSineTable - ldrb r0, [r7, #0x15] - lsls r0, r0, #4 - adds r0, r0, r6 - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r4, r4, #0x10 - asrs r4, r4, #0x18 - adds r1, r4, #0 - bl FixedMul - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r5, #0x80 - lsls r5, r5, #1 - adds r1, r5, #0 - bl FixedDiv - lsls r0, r0, #0x10 - asrs r0, r0, #8 - ldr r1, [r7, #0x6c] - adds r1, r1, r0 - str r1, [r7, #0x6c] - ldrb r0, [r7, #0x15] - lsls r0, r0, #4 - adds r0, #0x80 - adds r0, r0, r6 - movs r2, #0 - ldrsh r0, [r0, r2] - adds r1, r4, #0 - bl FixedMul - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - adds r1, r5, #0 - bl FixedDiv - lsls r0, r0, #0x10 - asrs r0, r0, #8 - ldr r1, [r7, #0x70] - subs r1, r1, r0 - str r1, [r7, #0x70] -_080857C8: - movs r0, #0 - mov r1, r8 - strb r0, [r1] -_080857CE: - ldr r0, [r7, #0x2c] - str r0, [r7, #0x54] - ldr r0, [r7, #0x30] - str r0, [r7, #0x50] - ldr r0, [r7, #0x6c] - cmp r0, #0 - bne _080857E4 - ldr r0, [r7, #0x70] - cmp r0, #0 - bne _080857E4 - b _080859F4 -_080857E4: - ldr r0, [r7, #0x70] - ldr r1, _080858AC @ =0xFFFF0000 - cmp r0, r1 - blt _080857F4 - movs r1, #0x80 - lsls r1, r1, #9 - cmp r0, r1 - ble _080857F6 -_080857F4: - str r1, [r7, #0x70] -_080857F6: - ldr r0, [r7, #0x6c] - ldr r1, _080858AC @ =0xFFFF0000 - cmp r0, r1 - blt _08085806 - movs r1, #0x80 - lsls r1, r1, #9 - cmp r0, r1 - ble _08085808 -_08085806: - str r1, [r7, #0x6c] -_08085808: - ldr r0, _080858B0 @ =gRoomTransition - ldr r0, [r0] - movs r1, #0xf - ands r0, r1 - cmp r0, #0 - bne _0808581A - adds r0, r7, #0 - bl CreateLargeWaterTrace -_0808581A: - ldr r0, [r7, #0x2c] - ldr r1, [r7, #0x6c] - adds r5, r0, r1 - ldr r1, [r7, #0x30] - ldr r2, [r7, #0x70] - adds r3, r1, r2 - adds r2, r5, #0 - bl CalculateDirectionTo - strb r0, [r7, #0x15] - ldr r0, [r7, #0x6c] - lsls r0, r0, #8 - asrs r0, r0, #0x10 - movs r4, #0x80 - lsls r4, r4, #1 - adds r1, r4, #0 - bl FixedMul - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - ldr r5, _080858A8 @ =gSineTable - ldrb r1, [r7, #0x15] - lsls r1, r1, #4 - adds r1, r1, r5 - movs r2, #0 - ldrsh r1, [r1, r2] - bl FixedDiv - strh r0, [r7, #0x24] - ldr r0, [r7, #0x70] - lsls r0, r0, #8 - asrs r0, r0, #0x10 - adds r1, r4, #0 - bl FixedMul - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - ldrb r1, [r7, #0x15] - lsls r1, r1, #4 - adds r1, #0x80 - adds r1, r1, r5 - movs r2, #0 - ldrsh r1, [r1, r2] - bl FixedDiv - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - rsbs r4, r0, #0 - movs r1, #0x24 - ldrsh r0, [r7, r1] - cmp r4, r0 - ble _08085884 - strh r4, [r7, #0x24] -_08085884: - ldrb r0, [r7, #0xb] - cmp r0, #0 - beq _080858BC - adds r0, r7, #0 - adds r0, #0x7e - movs r2, #0 - ldrsh r1, [r0, r2] - ldr r0, _080858B4 @ =0x00000FFF - cmp r1, r0 - bgt _080858B8 - movs r0, #0x24 - ldrsh r1, [r7, r0] - lsls r1, r1, #0xc - ldr r0, [r7, #0x7c] - adds r0, r0, r1 - str r0, [r7, #0x7c] - b _080858E0 - .align 2, 0 -_080858A8: .4byte gSineTable -_080858AC: .4byte 0xFFFF0000 -_080858B0: .4byte gRoomTransition -_080858B4: .4byte 0x00000FFF -_080858B8: - movs r0, #0 - b _080858DE -_080858BC: - adds r0, r7, #0 - adds r0, #0x7e - movs r2, #0 - ldrsh r1, [r0, r2] - ldr r0, _080858D8 @ =0xFFFFF000 - cmp r1, r0 - ble _080858DC - movs r0, #0x24 - ldrsh r1, [r7, r0] - lsls r1, r1, #0xc - ldr r0, [r7, #0x7c] - subs r0, r0, r1 - str r0, [r7, #0x7c] - b _080858E0 - .align 2, 0 -_080858D8: .4byte 0xFFFFF000 -_080858DC: - movs r0, #1 -_080858DE: - strb r0, [r7, #0xb] -_080858E0: - adds r0, r7, #0 - bl sub_08085EFC - adds r0, r7, #0 - bl ProcessMovement4 - ldr r1, [r7, #0x54] - ldr r0, [r7, #0x2c] - cmp r1, r0 - bne _0808590C - adds r0, r7, #0 - adds r0, #0x85 - ldrb r1, [r0] - adds r2, r0, #0 - cmp r1, #2 - bne _08085906 - movs r0, #0 - str r0, [r7, #0x6c] - b _08085916 -_08085906: - adds r0, r1, #1 - strb r0, [r2] - b _08085916 -_0808590C: - adds r1, r7, #0 - adds r1, #0x85 - movs r0, #0 - strb r0, [r1] - adds r2, r1, #0 -_08085916: - ldr r1, [r7, #0x50] - ldr r0, [r7, #0x30] - cmp r1, r0 - bne _0808592E - ldrb r0, [r2] - cmp r0, #2 - bne _0808592A - movs r0, #0 - str r0, [r7, #0x70] - b _08085932 -_0808592A: - adds r0, #1 - b _08085930 -_0808592E: - movs r0, #0 -_08085930: - strb r0, [r2] -_08085932: - ldr r0, _0808595C @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #2 - ands r0, r1 - cmp r0, #0 - beq _08085944 - adds r0, r7, #0 - bl sub_08085F1C -_08085944: - ldr r1, [r7, #0x6c] - cmp r1, #0 - beq _08085998 - cmp r1, #0 - bge _0808596E - movs r0, #0x80 - rsbs r0, r0, #0 - cmp r1, r0 - ble _08085960 - movs r0, #0 - b _08085964 - .align 2, 0 -_0808595C: .4byte gPlayerState -_08085960: - adds r0, r1, #0 - adds r0, #0x80 -_08085964: - str r0, [r7, #0x6c] - ldrh r2, [r7, #0x2a] - movs r1, #0xe0 - lsls r1, r1, #4 - b _08085982 -_0808596E: - cmp r1, #0x7f - bhi _08085976 - movs r0, #0 - b _0808597A -_08085976: - adds r0, r1, #0 - subs r0, #0x80 -_0808597A: - str r0, [r7, #0x6c] - ldrh r2, [r7, #0x2a] - movs r1, #0xe0 - lsls r1, r1, #8 -_08085982: - adds r0, r1, #0 - ands r0, r2 - cmp r0, r1 - bne _08085998 - ldr r0, [r7, #0x6c] - cmp r0, #0 - bge _08085992 - adds r0, #3 -_08085992: - asrs r0, r0, #2 - rsbs r0, r0, #0 - str r0, [r7, #0x6c] -_08085998: - ldr r1, [r7, #0x70] - cmp r1, #0 - beq _080859E6 - cmp r1, #0 - bge _080859C0 - movs r0, #0x80 - rsbs r0, r0, #0 - cmp r1, r0 - ble _080859AE - movs r0, #0 - b _080859B2 -_080859AE: - adds r0, r1, #0 - adds r0, #0x80 -_080859B2: - str r0, [r7, #0x70] - ldrh r1, [r7, #0x2a] - movs r0, #0xe - ands r0, r1 - cmp r0, #0xe - bne _080859E6 - b _080859D8 -_080859C0: - cmp r1, #0x7f - bhi _080859C8 - movs r0, #0 - b _080859CC -_080859C8: - adds r0, r1, #0 - subs r0, #0x80 -_080859CC: - str r0, [r7, #0x70] - ldrh r1, [r7, #0x2a] - movs r0, #0xe0 - ands r0, r1 - cmp r0, #0xe0 - bne _080859E6 -_080859D8: - ldr r0, [r7, #0x70] - cmp r0, #0 - bge _080859E0 - adds r0, #3 -_080859E0: - asrs r0, r0, #2 - rsbs r0, r0, #0 - str r0, [r7, #0x70] -_080859E6: - adds r0, r7, #0 - bl sub_08085D28 - adds r0, r7, #0 - bl sub_08085D60 - b _08085A0A -_080859F4: - ldr r0, _08085A18 @ =gRoomTransition - ldr r0, [r0] - movs r1, #0x1f - ands r0, r1 - cmp r0, #0 - bne _08085A0A - adds r0, r7, #0 - movs r1, #8 - movs r2, #0xa - bl sub_080A2AF4 -_08085A0A: - adds r0, r7, #0 - bl sub_08085F48 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08085A18: .4byte gRoomTransition - .syntax divided diff --git a/asm/non_matching/lilypadLarge/sub_08085D60.inc b/asm/non_matching/lilypadLarge/sub_08085D60.inc deleted file mode 100644 index 334ce788..00000000 --- a/asm/non_matching/lilypadLarge/sub_08085D60.inc +++ /dev/null @@ -1,139 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r0, #0 - ldr r2, _08085D94 @ =gPlayerState - ldr r0, [r2, #0x30] - movs r1, #2 - ands r0, r1 - cmp r0, #0 - beq _08085E64 - adds r0, r2, #0 - adds r0, #0xa8 - ldrb r0, [r0] - cmp r0, #0x12 - beq _08085E64 - ldrb r0, [r2, #2] - cmp r0, #0 - bne _08085E64 - ldrb r1, [r5, #0x15] - movs r0, #7 - ands r0, r1 - cmp r0, #0 - bne _08085D98 - ldrb r6, [r5, #0x15] - adds r4, r6, #0 - b _08085DB0 - .align 2, 0 -_08085D94: .4byte gPlayerState -_08085D98: - movs r0, #0x10 - ands r0, r1 - movs r4, #8 - cmp r0, #0 - beq _08085DA4 - movs r4, #0x18 -_08085DA4: - ldrb r0, [r5, #0x15] - subs r0, #8 - movs r6, #0x10 - cmp r0, #0x10 - ble _08085DB0 - movs r6, #0 -_08085DB0: - cmp r4, #0x18 - beq _08085DB8 - cmp r4, #8 - bne _08085E20 -_08085DB8: - lsrs r3, r4, #2 - ldr r1, _08085E10 @ =gUnk_08120638 - adds r0, r3, r1 - movs r7, #0 - ldrsb r7, [r0, r7] - adds r0, r3, #1 - adds r0, r0, r1 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - mov r8, r0 - adds r0, r5, #0 - adds r1, r7, #0 - mov r2, r8 - bl sub_080B1AF0 - cmp r0, #0xff - bne _08085E20 - movs r1, #0x2e - ldrsh r0, [r5, r1] - ldr r2, _08085E14 @ =gRoomControls - ldrh r1, [r2, #6] - subs r0, r0, r1 - adds r0, r0, r7 - movs r3, #0x32 - ldrsh r1, [r5, r3] - ldrh r2, [r2, #8] - subs r1, r1, r2 - add r1, r8 - adds r2, r4, #0 - movs r3, #5 - bl sub_080806BC - cmp r0, #0 - bne _08085E1C - ldr r0, _08085E18 @ =gPlayerEntity - lsrs r1, r4, #3 - bl sub_0807BD14 - cmp r0, #0 - beq _08085E20 - strb r4, [r5, #0x15] - b _08085E52 - .align 2, 0 -_08085E10: .4byte gUnk_08120638 -_08085E14: .4byte gRoomControls -_08085E18: .4byte gPlayerEntity -_08085E1C: - strb r4, [r5, #0x15] - b _08085E6C -_08085E20: - cmp r6, #0 - beq _08085E28 - cmp r6, #0x10 - bne _08085E6C -_08085E28: - lsrs r3, r6, #2 - ldr r2, _08085E5C @ =gUnk_08120638 - adds r0, r3, r2 - movs r1, #0 - ldrsb r1, [r0, r1] - adds r0, r3, #1 - adds r0, r0, r2 - movs r2, #0 - ldrsb r2, [r0, r2] - adds r0, r5, #0 - bl sub_080B1AF0 - cmp r0, #0xff - bne _08085E6C - ldr r0, _08085E60 @ =gPlayerEntity - lsrs r1, r6, #3 - bl sub_0807BD14 - cmp r0, #0 - beq _08085E6C - strb r6, [r5, #0x15] -_08085E52: - adds r0, r5, #0 - bl sub_08085E74 - b _08085E6C - .align 2, 0 -_08085E5C: .4byte gUnk_08120638 -_08085E60: .4byte gPlayerEntity -_08085E64: - ldrb r1, [r5, #0x10] - movs r0, #0xdf - ands r0, r1 - strb r0, [r5, #0x10] -_08085E6C: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - .syntax divided diff --git a/assets/assets.json b/assets/assets.json index 31faaf38..402901aa 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -41971,21 +41971,6 @@ "size": 4, "type": "animation" }, - { - "path": "lilypadLarge/gUnk_08120620.bin", - "start": 1181216, - "size": 12 - }, - { - "path": "lilypadLarge/gUnk_08120638.bin", - "start": 1181240, - "size": 8 - }, - { - "path": "lilypadLarge/gUnk_08120640.bin", - "start": 1181248, - "size": 8 - }, { "path": "evilSpirit/gUnk_08120678.bin", "start": 1181304, diff --git a/data/const/object/lilypadLarge.s b/data/const/object/lilypadLarge.s deleted file mode 100644 index 59a23b7b..00000000 --- a/data/const/object/lilypadLarge.s +++ /dev/null @@ -1,27 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08120608:: @ 08120608 - .4byte sub_08085504 - .4byte sub_080855E8 - .4byte sub_08085A1C - .4byte sub_08085C5C - .4byte sub_08085CDC - .4byte sub_08085D10 - -gUnk_08120620:: @ 08120620 - .incbin "lilypadLarge/gUnk_08120620.bin" - -gUnk_0812062C:: @ 0812062C - .4byte sub_08085A44 - .4byte sub_08085A98 - .4byte sub_08085B40 - -gUnk_08120638:: @ 08120638 - .incbin "lilypadLarge/gUnk_08120638.bin" - -gUnk_08120640:: @ 08120640 - .incbin "lilypadLarge/gUnk_08120640.bin" diff --git a/linker.ld b/linker.ld index f847aa6f..6d594db6 100644 --- a/linker.ld +++ b/linker.ld @@ -1352,7 +1352,7 @@ SECTIONS { src/object/object12.o(.rodata); src/object/railtrack.o(.rodata); data/animations/object/railtrack.o(.rodata); - data/const/object/lilypadLarge.o(.rodata); + src/object/lilypadLarge.o(.rodata); src/object/object15.o(.rodata); src/object/floatingPlatform.o(.rodata); src/object/object17.o(.rodata); diff --git a/src/object/lilypadLarge.c b/src/object/lilypadLarge.c index e447e036..2e478e2c 100644 --- a/src/object/lilypadLarge.c +++ b/src/object/lilypadLarge.c @@ -27,12 +27,7 @@ typedef struct { u8 unk_85; } LilypadLargeEntity; -extern void (*const gUnk_08120608[])(LilypadLargeEntity*); -extern Hitbox gUnk_08120640; -extern void (*const gUnk_0812062C[])(LilypadLargeEntity*); -extern u8 gUnk_08120638[]; extern u8 gUnk_08126EE4[]; -extern u32 gUnk_08120620[]; void sub_080855E8(LilypadLargeEntity*); void sub_08085CDC(LilypadLargeEntity*); @@ -42,11 +37,25 @@ void sub_08085E74(LilypadLargeEntity*); void sub_08085F48(LilypadLargeEntity*); void sub_08085D28(LilypadLargeEntity*); void sub_08085D60(LilypadLargeEntity*); +void sub_08085504(LilypadLargeEntity*); +void sub_080855E8(LilypadLargeEntity*); +void sub_08085A1C(LilypadLargeEntity*); +void sub_08085C5C(LilypadLargeEntity*); +void sub_08085CDC(LilypadLargeEntity*); +void sub_08085D10(LilypadLargeEntity*); +void sub_08085B40(LilypadLargeEntity*); +void sub_08085A98(LilypadLargeEntity*); +void sub_08085A44(LilypadLargeEntity*); void LilypadLarge(LilypadLargeEntity* this) { - gUnk_08120608[super->action](this); + static void (*const actionFuncs[])(LilypadLargeEntity*) = { + sub_08085504, sub_080855E8, sub_08085A1C, sub_08085C5C, sub_08085CDC, sub_08085D10, + }; + actionFuncs[super->action](this); } +static const Hitbox gUnk_08120640; + void sub_08085504(LilypadLargeEntity* this) { if (super->type == 0xff) { if (GetInventoryValue(ITEM_FLIPPERS)) { @@ -79,7 +88,7 @@ void sub_08085504(LilypadLargeEntity* this) { super->action = 1; super->speed = 0x100; super->spritePriority.b0 = 6; - super->hitbox = &gUnk_08120640; + super->hitbox = (Hitbox*)&gUnk_08120640; super->flags |= ENT_COLLIDE; super->collisionFlags = 7; super->hitType = 1; @@ -92,10 +101,245 @@ void sub_08085504(LilypadLargeEntity* this) { sub_080855E8(this); } -ASM_FUNC("asm/non_matching/lilypadLarge/sub_080855E8.inc", void sub_080855E8(LilypadLargeEntity* this)); +void sub_080855E8(LilypadLargeEntity* this) { + static const u32 gUnk_08120620[] = { + 0x5000, + 0x18000, + 0x28000, + }; + s16 sVar3; + u32 uVar1; + u16 uVar8; + s32 sVar10; + u32 uVar5; + u32 tmp; + u32 uVar4; + + super->flags |= 0x20; + if (sub_0806FC80(super, &gPlayerEntity, 0x18) != 0) { + + gPlayerState.flags |= 2; + if (gPlayerEntity.z.WORD == 0) { + if (gPlayerState.swim_state != 0) { + gPlayerEntity.collisionFlags &= 0xfb; + gPlayerState.swim_state = 0; + } + *(u32*)&gPlayerState.field_0x82[2] = (u32)this; // TODO + if (super->collisionLayer == 1) { + ResetCollisionLayer(&gPlayerEntity); + } else { + sub_08004542(&gPlayerEntity); + } + if (super->subtimer == 0) { + super->subtimer = 4; + while (super->subtimer != 0) { + sub_080A2AF4(super, 8, 10); + super->subtimer--; + } + super->subtimer = 1; + super->timer |= 0x80; + this->unk_70 = 0; + this->unk_6c = 0; + } + if (gPlayerState.field_0x1c == 3) { + tmp = gUnk_08120620[gPlayerState.gustJarSpeed - 1]; + switch (gPlayerEntity.animationState & 6) { + case 4: + this->unk_70 -= tmp; + break; + case 0: + this->unk_70 += tmp; + break; + case 2: + this->unk_6c -= tmp; + break; + case 6: + this->unk_6c += tmp; + break; + } + } + } + + } else { + if (super->subtimer != 0) { + super->subtimer = 0; + SoundReq(SFX_WATER_WALK); + } + if ((super->contactFlags & 0x7f) == 0x13) { + sVar10 = gPlayerEntity.x.HALF.HI + (s8)gUnk_08126EE4[gPlayerEntity.animationState & 0xe]; + uVar4 = gPlayerEntity.y.HALF.HI + (s8)gUnk_08126EE4[gPlayerEntity.animationState | 1]; + super->direction = CalculateDirectionTo(super->x.HALF.HI, super->y.HALF.HI, sVar10, uVar4); + + switch (gPlayerState.gustJarSpeed) { + case 3: + tmp = 0x400; + break; + case 2: + tmp = 0x300; + break; + case 1: + tmp = 0x200; + break; + } + + //! @bug: tmp could be uninitialized here + sVar3 = FixedMul(gSineTable[(u32)super->direction * 8], ((s16)tmp) >> 8); + sVar3 = FixedDiv(sVar3, 0x100); + this->unk_6c = this->unk_6c + (((s32)sVar3 << 0x10) >> 8); + sVar3 = FixedMul(gSineTable[(u32)super->direction * 8 + 0x40], ((s16)tmp) >> 8); + sVar3 = FixedDiv(sVar3, 0x100); + this->unk_70 = this->unk_70 - (((s32)sVar3 << 0x10) >> 8); + } + super->contactFlags = 0; + } + super->child = (Entity*)super->x.WORD; + super->parent = (Entity*)super->y.WORD; + if (this->unk_6c != 0 || this->unk_70 != 0) { + if ((this->unk_70 < -0x10000)) { + this->unk_70 = -0x10000; + } else if ((this->unk_70) > 0x10000) { + this->unk_70 = 0x10000; + } + + if ((this->unk_6c < -0x10000)) { + this->unk_6c = -0x10000; + } else if ((this->unk_6c) > 0x10000) { + this->unk_6c = 0x10000; + } + + if ((gRoomTransition.frameCount & 0xfU) == 0) { + CreateLargeWaterTrace(super); + } + sVar10 = super->x.WORD + this->unk_6c; + uVar4 = super->y.WORD + this->unk_70; + super->direction = CalculateDirectionTo(super->x.WORD, super->y.WORD, sVar10, uVar4); + sVar3 = FixedMul((s16)((this->unk_6c << 8) >> 0x10), 0x100); + sVar3 = FixedDiv(sVar3, gSineTable[(u32)super->direction * 8]); + super->speed = sVar3; + sVar3 = FixedMul((s16)((this->unk_70 << 8) >> 0x10), 0x100); + sVar3 = FixedDiv(sVar3, gSineTable[(u32)super->direction * 8 + 0x40]); + tmp = -sVar3; + if ((s32)tmp > super->speed) { + super->speed = tmp; + } + + if (super->type2 != 0) { + if (this->unk_7c.HALF.HI < 0x1000) { + this->unk_7c.WORD += super->speed * 0x1000; + } else { + super->type2 = 0; + } + } else { + if (this->unk_7c.HALF.HI > -0x1000) { + this->unk_7c.WORD += super->speed * -0x1000; + } else { + super->type2 = 1; + } + } + + sub_08085EFC(this); + ProcessMovement4(super); + if (super->child == (Entity*)super->x.WORD) { + if (this->unk_85 == 2) { + this->unk_6c = 0; + } else { + this->unk_85++; + } + } else { + this->unk_85 = 0; + } + + if (super->parent == (Entity*)super->y.WORD) { + if (this->unk_85 == 2) { + this->unk_70 = 0; + } else { + this->unk_85++; + } + } else { + this->unk_85 = 0; + } + + if ((gPlayerState.flags & 2) != 0) { + sub_08085F1C(this); + } + + if (this->unk_6c != 0) { + if (this->unk_6c < 0) { + if (this->unk_6c > -0x80) { + this->unk_6c = 0; + } else { + this->unk_6c += 0x80; + } + if ((super->collisions & 0xe00) == 0xe00) { + s32 tmp = this->unk_6c; + if (this->unk_6c < 0) { + tmp += 3; + } + this->unk_6c = -(tmp >> 2); + } + } else { + if (this->unk_6c < 0x80u) { + this->unk_6c = 0; + } else { + this->unk_6c -= 0x80; + } + if ((super->collisions & 0xe000) == 0xe000) { + s32 tmp = this->unk_6c; + if (this->unk_6c < 0) { + tmp += 3; + } + this->unk_6c = -(tmp >> 2); + } + } + } + if (this->unk_70 != 0) { + if ((s32)this->unk_70 < 0) { + if ((s32)this->unk_70 > -0x80) { + this->unk_70 = 0; + } else { + this->unk_70 += 0x80; + } + if ((super->collisions & 0xe) == 0xe) { + u32 tmp2 = this->unk_70; + if ((s32)this->unk_70 < 0) { + tmp2 += 3; + } + this->unk_70 = -((s32)tmp2 >> 2); + } + } else { + if (this->unk_70 < 0x80u) { + this->unk_70 = 0; + } else { + this->unk_70 -= 0x80; + } + if ((super->collisions & 0xe0) == 0xe0) { + // goto _080859D8; + u32 tmp2 = this->unk_70; + if ((s32)this->unk_70 < 0) { + tmp2 += 3; + } + this->unk_70 = -((s32)tmp2 >> 2); + } + } + } + sub_08085D28(this); + sub_08085D60(this); + } else { + end: + if ((gRoomTransition.frameCount & 0x1fU) == 0) { + sub_080A2AF4(super, 8, 10); + } + } + sub_08085F48(this); +} void sub_08085A1C(LilypadLargeEntity* this) { - gUnk_0812062C[super->subAction](this); + static void (*const subActionFuncs[])(LilypadLargeEntity*) = { + sub_08085A44, + sub_08085A98, + sub_08085B40, + }; + subActionFuncs[super->subAction](this); gPlayerState.flags |= PL_FLAGS2; sub_08078B48(); } @@ -236,9 +480,15 @@ void sub_08085D28(LilypadLargeEntity* this) { } } -NONMATCH("asm/non_matching/lilypadLarge/sub_08085D60.inc", void sub_08085D60(LilypadLargeEntity* this)) { +void sub_08085D60(LilypadLargeEntity* this) { + static const s8 gUnk_08120638[] = { + 0, -24, 24, 0, 0, 24, -24, 0, + }; u32 r4; // horizontal direction? u32 r6; // vertical direction? + u32 tmp; + s32 tmpX, tmpX2; + s32 tmpY, tmpY2; if ((gPlayerState.flags & PL_FLAGS2) != 0) { if (gPlayerState.framestate != PL_STATE_DIE) { if (gPlayerState.jump_status == 0) { @@ -258,9 +508,9 @@ NONMATCH("asm/non_matching/lilypadLarge/sub_08085D60.inc", void sub_08085D60(Lil } } if (r4 == DirectionWest || r4 == DirectionEast) { // Handle horizontal - u32 tmp = r4 >> 2; - s32 tmpX = gUnk_08120638[tmp]; - s32 tmpY = gUnk_08120638[tmp + 1]; + tmp = r4 >> 2; + tmpX = gUnk_08120638[tmp]; + tmpY = gUnk_08120638[tmp + 1]; if (sub_080B1AF0(super, tmpX, tmpY) == 0xff) { if (sub_080806BC((super->x.HALF.HI - gRoomControls.origin_x) + tmpX, @@ -277,10 +527,10 @@ NONMATCH("asm/non_matching/lilypadLarge/sub_08085D60.inc", void sub_08085D60(Lil } } if (r6 == DirectionNorth || r6 == DirectionSouth) { // Handle vertical - u32 tmp = r6 >> 2; - s32 tmpX = (u8)gUnk_08120638[tmp]; - s32 tmpY = gUnk_08120638[tmp + 1]; - if (sub_080B1AF0(super, tmpX, tmpY) == 0xff) { + tmp = r6 >> 2; + tmpX2 = gUnk_08120638[tmp]; + tmpY2 = gUnk_08120638[tmp + 1]; + if (sub_080B1AF0(super, tmpX2, tmpY2) == 0xff) { if (sub_0807BD14(&gPlayerEntity, r6 >> 3) != 0) { super->direction = (u8)r6; sub_08085E74(this); @@ -293,7 +543,6 @@ NONMATCH("asm/non_matching/lilypadLarge/sub_08085D60.inc", void sub_08085D60(Lil } super->flags &= ~ENT_PERSIST; } -END_NONMATCH void sub_08085E74(LilypadLargeEntity* this) { super->flags |= ENT_PERSIST; @@ -383,3 +632,5 @@ void sub_08085F48(LilypadLargeEntity* this) { } SetAffineInfo(super, this->unk_78.HALF_U.HI, this->unk_78.HALF_U.HI, this->unk_7c.HALF_U.HI); } + +static const Hitbox gUnk_08120640 = { 0, 0, { 16, 14, 14, 16 }, 16, 16 };