From 73c9b8dbb2efd429a43b6c6201086211f3678974 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Thu, 6 Jan 2022 12:46:26 +0200 Subject: [PATCH] Work on projectile asm functions --- .../ballAndChain/sub_080AB170.inc | 133 ------------------ .../sub_080AC8DC.inc | 40 ------ .../spikedRollers/sub_080ABA74.inc | 59 -------- .../spikedRollers/sub_080ABAE0.inc | 93 ------------ .../v1DarkMagicProjectile/sub_080AACE0.inc | 77 ---------- .../v2Projectile/sub_080ABBA8.inc | 39 ----- .../v2Projectile/sub_080ABBF4.inc | 50 ------- .../v2Projectile/sub_080ABE04.inc | 63 --------- .../v3ElectricProjectile/sub_080ABFEC.inc | 69 --------- .../v3ElectricProjectile/sub_080AC168.inc | 75 ---------- .../v3ElectricProjectile/sub_080AC200.inc | 62 -------- .../v3TennisBallProjectile/sub_080ACA68.inc | 53 ------- .../v3TennisBallProjectile/sub_080ACB40.inc | 48 ------- asm/non_matching/winder/sub_080AB950.inc | 70 --------- asm/non_matching/winder/sub_080AB9FC.inc | 49 ------- include/entity.h | 14 +- src/projectile/ballAndChain.c | 67 ++++++++- src/projectile/gyorgMaleEnergyProjectile.c | 25 +++- src/projectile/spiderWeb.c | 56 +++++++- src/projectile/spikedRollers.c | 91 ++++++++++-- src/projectile/v1DarkMagicProjectile.c | 34 ++++- src/projectile/v1EyeLaser.c | 41 +++++- src/projectile/v2Projectile.c | 69 ++++++++- src/projectile/v3ElectricProjectile.c | 111 +++++++++++++-- src/projectile/v3TennisBallProjectile.c | 58 +++++++- src/projectile/winder.c | 66 ++++++++- 26 files changed, 587 insertions(+), 1025 deletions(-) delete mode 100644 asm/non_matching/ballAndChain/sub_080AB170.inc delete mode 100644 asm/non_matching/gyorgMaleEnergyProjectile/sub_080AC8DC.inc delete mode 100644 asm/non_matching/spikedRollers/sub_080ABA74.inc delete mode 100644 asm/non_matching/spikedRollers/sub_080ABAE0.inc delete mode 100644 asm/non_matching/v1DarkMagicProjectile/sub_080AACE0.inc delete mode 100644 asm/non_matching/v2Projectile/sub_080ABBA8.inc delete mode 100644 asm/non_matching/v2Projectile/sub_080ABBF4.inc delete mode 100644 asm/non_matching/v2Projectile/sub_080ABE04.inc delete mode 100644 asm/non_matching/v3ElectricProjectile/sub_080ABFEC.inc delete mode 100644 asm/non_matching/v3ElectricProjectile/sub_080AC168.inc delete mode 100644 asm/non_matching/v3ElectricProjectile/sub_080AC200.inc delete mode 100644 asm/non_matching/v3TennisBallProjectile/sub_080ACA68.inc delete mode 100644 asm/non_matching/v3TennisBallProjectile/sub_080ACB40.inc delete mode 100644 asm/non_matching/winder/sub_080AB950.inc delete mode 100644 asm/non_matching/winder/sub_080AB9FC.inc diff --git a/asm/non_matching/ballAndChain/sub_080AB170.inc b/asm/non_matching/ballAndChain/sub_080AB170.inc deleted file mode 100644 index 868c59dd..00000000 --- a/asm/non_matching/ballAndChain/sub_080AB170.inc +++ /dev/null @@ -1,133 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldr r6, [r4, #0x50] - ldr r0, [r6, #4] - cmp r0, #0 - bne _080AB180 - bl DeleteThisEntity -_080AB180: - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _080AB1AA - movs r0, #1 - strb r0, [r4, #0xc] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - subs r0, #0x3a - ands r0, r1 - strb r0, [r2] - movs r0, #5 - strb r0, [r4, #0x1e] - ldrb r1, [r2] - subs r0, #0xd - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r2] - ldr r0, _080AB1C8 @ =gHitbox_22 - str r0, [r4, #0x48] -_080AB1AA: - ldr r5, [r6, #0x50] - adds r0, r4, #0 - adds r0, #0x7c - adds r2, r5, #0 - adds r2, #0x7c - ldrb r1, [r0] - adds r3, r0, #0 - ldrb r2, [r2] - cmp r1, r2 - beq _080AB1CC - ldrb r1, [r4, #0x10] - movs r0, #0x80 - orrs r0, r1 - b _080AB1D2 - .align 2, 0 -_080AB1C8: .4byte gHitbox_22 -_080AB1CC: - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 -_080AB1D2: - strb r0, [r4, #0x10] - adds r0, r5, #0 - adds r0, #0x7c - ldrb r0, [r0] - strb r0, [r3] - adds r0, r5, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x20 - ands r0, r1 - cmp r0, #0 - bne _080AB208 - movs r0, #0x1f - ands r0, r1 - ldr r1, _080AB204 @ =gUnk_0812A4A8 - adds r0, r0, r1 - movs r2, #0 - ldrsb r2, [r0, r2] - movs r3, #1 - ldrsb r3, [r0, r3] - adds r0, r5, #0 - adds r1, r4, #0 - bl sub_0806FA90 - b _080AB216 - .align 2, 0 -_080AB204: .4byte gUnk_0812A4A8 -_080AB208: - movs r3, #0xa - rsbs r3, r3, #0 - adds r0, r5, #0 - adds r1, r4, #0 - movs r2, #0 - bl sub_0806FA90 -_080AB216: - movs r1, #0x2e - ldrsh r0, [r6, r1] - movs r2, #0x2e - ldrsh r1, [r4, r2] - subs r0, r0, r1 - ldrb r2, [r4, #0xa] - muls r0, r2, r0 - adds r3, r2, #0 - cmp r0, #0 - bge _080AB22C - adds r0, #3 -_080AB22C: - asrs r0, r0, #2 - ldrh r5, [r4, #0x2e] - adds r0, r0, r5 - strh r0, [r4, #0x2e] - movs r1, #0x32 - ldrsh r0, [r6, r1] - movs r5, #0x32 - ldrsh r1, [r4, r5] - subs r0, r0, r1 - muls r0, r3, r0 - cmp r0, #0 - bge _080AB246 - adds r0, #3 -_080AB246: - asrs r0, r0, #2 - ldrh r1, [r4, #0x32] - adds r0, r0, r1 - strh r0, [r4, #0x32] - movs r3, #0x36 - ldrsh r0, [r6, r3] - movs r5, #0x36 - ldrsh r1, [r4, r5] - subs r0, r0, r1 - muls r0, r2, r0 - cmp r0, #0 - bge _080AB260 - adds r0, #3 -_080AB260: - asrs r0, r0, #2 - ldrh r1, [r4, #0x36] - adds r0, r0, r1 - strh r0, [r4, #0x36] - pop {r4, r5, r6, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/gyorgMaleEnergyProjectile/sub_080AC8DC.inc b/asm/non_matching/gyorgMaleEnergyProjectile/sub_080AC8DC.inc deleted file mode 100644 index dbb0ab91..00000000 --- a/asm/non_matching/gyorgMaleEnergyProjectile/sub_080AC8DC.inc +++ /dev/null @@ -1,40 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x41 - ldrb r0, [r0] - movs r1, #0x7f - ands r1, r0 - cmp r1, #0 - blt _080AC8FE - cmp r1, #3 - ble _080AC8F8 - cmp r1, #0x1f - bgt _080AC8FE - cmp r1, #0x1e - blt _080AC8FE -_080AC8F8: - bl DeleteThisEntity - b _080AC920 -_080AC8FE: - ldrb r0, [r4, #0xc] - cmp r0, #3 - beq _080AC920 - movs r0, #3 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - ldrh r0, [r4, #0x24] - lsls r0, r0, #0x10 - asrs r0, r0, #0x11 - strh r0, [r4, #0x24] - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation -_080AC920: - adds r0, r4, #0 - bl GyorgMaleEnergyProjectile_OnTick - pop {r4, pc} - .syntax divided diff --git a/asm/non_matching/spikedRollers/sub_080ABA74.inc b/asm/non_matching/spikedRollers/sub_080ABA74.inc deleted file mode 100644 index e0363105..00000000 --- a/asm/non_matching/spikedRollers/sub_080ABA74.inc +++ /dev/null @@ -1,59 +0,0 @@ - .syntax unified - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xc] - adds r0, #1 - strb r0, [r2, #0xc] - adds r0, r2, #0 - adds r0, #0x86 - ldrh r0, [r0] - strh r0, [r2, #0x24] - ldrh r1, [r2, #0x2e] - adds r0, r2, #0 - adds r0, #0x68 - strh r1, [r0] - ldrh r0, [r2, #0x32] - adds r1, r2, #0 - adds r1, #0x6a - strh r0, [r1] - adds r0, r2, #0 - adds r0, #0x84 - ldrh r1, [r0] - subs r0, #0x18 - strh r1, [r0] - ldrb r0, [r2, #0xa] - cmp r0, #6 - bhi _080ABAAA - movs r0, #0 - b _080ABAAC -_080ABAAA: - movs r0, #1 -_080ABAAC: - strb r0, [r2, #0xb] - ldr r0, _080ABAC8 @ =gUnk_0812A6D4 - ldrb r1, [r2, #0xa] - adds r0, r1, r0 - ldrb r3, [r0] - ldrb r0, [r2, #0xb] - cmp r0, #0 - bne _080ABACC - movs r0, #8 - strb r0, [r2, #0x15] - ldrh r0, [r2, #0x32] - adds r0, r0, r3 - strh r0, [r2, #0x32] - b _080ABAD6 - .align 2, 0 -_080ABAC8: .4byte gUnk_0812A6D4 -_080ABACC: - movs r0, #0x10 - strb r0, [r2, #0x15] - ldrh r0, [r2, #0x2e] - adds r0, r0, r3 - strh r0, [r2, #0x2e] -_080ABAD6: - adds r0, r2, #0 - bl InitializeAnimation - pop {pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/spikedRollers/sub_080ABAE0.inc b/asm/non_matching/spikedRollers/sub_080ABAE0.inc deleted file mode 100644 index e90123ce..00000000 --- a/asm/non_matching/spikedRollers/sub_080ABAE0.inc +++ /dev/null @@ -1,93 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r4, r0, #0 - bl sub_080AF090 - ldrb r0, [r4, #0xb] - cmp r0, #0 - bne _080ABAFE - movs r1, #0x2e - ldrsh r0, [r4, r1] - adds r1, r4, #0 - adds r1, #0x68 - movs r2, #0 - ldrsh r1, [r1, r2] - subs r3, r0, r1 - b _080ABB0C -_080ABAFE: - movs r0, #0x32 - ldrsh r1, [r4, r0] - adds r0, r4, #0 - adds r0, #0x6a - movs r2, #0 - ldrsh r0, [r0, r2] - subs r3, r1, r0 -_080ABB0C: - adds r0, r4, #0 - adds r0, #0x6c - movs r1, #0 - ldrsh r2, [r0, r1] - adds r6, r0, #0 - cmp r2, #0 - bge _080ABB1E - rsbs r3, r3, #0 - rsbs r2, r2, #0 -_080ABB1E: - lsls r1, r3, #0x10 - lsls r0, r2, #0x10 - cmp r1, r0 - bls _080ABB84 - ldrb r0, [r4, #0x15] - movs r1, #0x10 - eors r0, r1 - strb r0, [r4, #0x15] - ldrb r0, [r4, #0xb] - adds r5, r0, #0 - cmp r5, #0 - bne _080ABB4E - adds r0, r4, #0 - adds r0, #0x68 - ldrh r0, [r0] - strh r0, [r4, #0x2e] - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x19 - lsrs r1, r1, #0x1f - movs r0, #1 - eors r1, r0 - lsls r1, r1, #6 - subs r0, #0x42 - b _080ABB62 -_080ABB4E: - adds r0, r4, #0 - adds r0, #0x6a - ldrh r0, [r0] - strh r0, [r4, #0x32] - ldrb r2, [r4, #0x18] - lsrs r1, r2, #7 - movs r0, #1 - eors r1, r0 - lsls r1, r1, #7 - movs r0, #0x7f -_080ABB62: - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] - cmp r3, #0 - ble _080ABB84 - lsls r0, r5, #0x18 - cmp r0, #0 - bne _080ABB7C - ldrh r0, [r6] - ldrh r2, [r4, #0x2e] - adds r0, r0, r2 - strh r0, [r4, #0x2e] - b _080ABB84 -_080ABB7C: - ldrh r0, [r6] - ldrh r1, [r4, #0x32] - adds r0, r0, r1 - strh r0, [r4, #0x32] -_080ABB84: - adds r0, r4, #0 - bl GetNextFrame - pop {r4, r5, r6, pc} - .syntax divided diff --git a/asm/non_matching/v1DarkMagicProjectile/sub_080AACE0.inc b/asm/non_matching/v1DarkMagicProjectile/sub_080AACE0.inc deleted file mode 100644 index c353756c..00000000 --- a/asm/non_matching/v1DarkMagicProjectile/sub_080AACE0.inc +++ /dev/null @@ -1,77 +0,0 @@ - .syntax unified - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _080AACF4 - ldrb r0, [r4, #0xb] - cmp r0, #0 - beq _080AACF4 - bl DeleteThisEntity -_080AACF4: - ldrb r1, [r4, #0x18] - lsls r0, r1, #0x1e - lsrs r2, r0, #0x1e - adds r5, r4, #0 - adds r5, #0x86 - cmp r2, #1 - bne _080AAD16 - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r4, #0x18] - strb r2, [r5] - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx -_080AAD16: - ldr r2, [r4, #0x50] - ldrb r0, [r4, #0xb] - cmp r0, #0 - bne _080AAD4A - adds r1, r2, #0 - adds r1, #0x74 - movs r0, #3 - strb r0, [r1] - adds r1, #0xc - adds r0, r4, #0 - adds r0, #0x81 - ldrb r0, [r0] - lsrs r0, r0, #1 - ldrb r2, [r1] - adds r0, r0, r2 - strb r0, [r1] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #8 - bls _080AAD42 - movs r0, #8 - b _080AAD56 -_080AAD42: - cmp r0, #0 - bne _080AAD58 - movs r0, #1 - b _080AAD56 -_080AAD4A: - adds r1, r2, #0 - adds r1, #0x84 - movs r0, #0 - strb r0, [r1] - subs r1, #0x45 - movs r0, #0x2b -_080AAD56: - strb r0, [r1] -_080AAD58: - ldrb r0, [r5] - cmp r0, #0 - bne _080AAD68 - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx -_080AAD68: - bl DeleteThisEntity - pop {r4, r5, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/v2Projectile/sub_080ABBA8.inc b/asm/non_matching/v2Projectile/sub_080ABBA8.inc deleted file mode 100644 index 2ed57bf3..00000000 --- a/asm/non_matching/v2Projectile/sub_080ABBA8.inc +++ /dev/null @@ -1,39 +0,0 @@ - .syntax unified - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xa] - cmp r0, #1 - beq _080ABBC4 - cmp r0, #1 - bgt _080ABBDC - cmp r0, #0 - bne _080ABBDC - ldr r0, _080ABBC0 @ =gUnk_0812A7EC - b _080ABBC6 - .align 2, 0 -_080ABBC0: .4byte gUnk_0812A7EC -_080ABBC4: - ldr r0, _080ABBD8 @ =gUnk_0812A7F8 -_080ABBC6: - ldrb r1, [r2, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r2, #0 - bl _call_via_r1 - b _080ABBEC - .align 2, 0 -_080ABBD8: .4byte gUnk_0812A7F8 -_080ABBDC: - ldr r0, _080ABBF0 @ =gUnk_0812A800 - ldrb r1, [r2, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r2, #0 - bl _call_via_r1 -_080ABBEC: - pop {pc} - .align 2, 0 -_080ABBF0: .4byte gUnk_0812A800 - .syntax divided diff --git a/asm/non_matching/v2Projectile/sub_080ABBF4.inc b/asm/non_matching/v2Projectile/sub_080ABBF4.inc deleted file mode 100644 index cedf0564..00000000 --- a/asm/non_matching/v2Projectile/sub_080ABBF4.inc +++ /dev/null @@ -1,50 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _080ABC52 - ldrb r0, [r4, #0xa] - cmp r0, #0 - blt _080ABC52 - cmp r0, #1 - ble _080ABC3E - cmp r0, #2 - bne _080ABC52 - movs r0, #0x3f - ands r0, r1 - cmp r0, #3 - beq _080ABC32 - cmp r0, #3 - bgt _080ABC24 - cmp r0, #0 - beq _080ABC2A - b _080ABC52 -_080ABC24: - cmp r0, #0x14 - beq _080ABC32 - b _080ABC52 -_080ABC2A: - movs r0, #4 - rsbs r0, r0, #0 - bl ModHealth -_080ABC32: - adds r0, r4, #0 - bl CreateDust - bl DeleteThisEntity - b _080ABC52 -_080ABC3E: - movs r0, #0x3f - ands r0, r1 - cmp r0, #0 - bne _080ABC52 - movs r0, #2 - rsbs r0, r0, #0 - bl ModHealth - bl DeleteThisEntity -_080ABC52: - pop {r4, pc} - .syntax divided diff --git a/asm/non_matching/v2Projectile/sub_080ABE04.inc b/asm/non_matching/v2Projectile/sub_080ABE04.inc deleted file mode 100644 index 825008f0..00000000 --- a/asm/non_matching/v2Projectile/sub_080ABE04.inc +++ /dev/null @@ -1,63 +0,0 @@ - .syntax unified - push {r4, r5, lr} - adds r4, r0, #0 - bl Random - adds r5, r0, #0 - movs r0, #0xff - ands r5, r0 - movs r0, #1 - strb r0, [r4, #0xc] - ldr r0, _080ABE48 @ =0xFFFF0000 - str r0, [r4, #0x20] - ldrh r0, [r4, #0x36] - subs r0, #0xa0 - strh r0, [r4, #0x36] - ldr r3, _080ABE4C @ =gRoomControls - ldrh r2, [r3, #6] - ldr r1, _080ABE50 @ =0x00007FF0 - adds r0, r1, #0 - ands r0, r2 - movs r2, #8 - orrs r0, r2 - strh r0, [r4, #0x2e] - ldrh r0, [r3, #8] - ands r1, r0 - orrs r1, r2 - strh r1, [r4, #0x32] - movs r0, #0x2e - ldrsh r1, [r4, r0] - movs r0, #0x10 - ands r0, r5 - cmp r0, #0 - beq _080ABE54 - adds r1, #0x10 - b _080ABE56 - .align 2, 0 -_080ABE48: .4byte 0xFFFF0000 -_080ABE4C: .4byte gRoomControls -_080ABE50: .4byte 0x00007FF0 -_080ABE54: - adds r1, #0xc0 -_080ABE56: - movs r0, #0xe0 - ands r0, r5 - lsrs r0, r0, #1 - adds r0, r1, r0 - strh r0, [r4, #0x2e] - movs r0, #0xf - ands r5, r0 - lsls r0, r5, #4 - ldrh r1, [r4, #0x32] - adds r0, r0, r1 - strh r0, [r4, #0x32] - adds r0, r4, #0 - bl sub_08004168 - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation - ldr r0, _080ABE84 @ =0x0000012D - bl SoundReq - pop {r4, r5, pc} - .align 2, 0 -_080ABE84: .4byte 0x0000012D - .syntax divided diff --git a/asm/non_matching/v3ElectricProjectile/sub_080ABFEC.inc b/asm/non_matching/v3ElectricProjectile/sub_080ABFEC.inc deleted file mode 100644 index cd4d966a..00000000 --- a/asm/non_matching/v3ElectricProjectile/sub_080ABFEC.inc +++ /dev/null @@ -1,69 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xa] - adds r1, #1 - bl InitializeAnimation - ldrb r1, [r4, #0xa] - cmp r1, #0 - beq _080AC030 - cmp r1, #1 - beq _080AC048 - movs r1, #0 - movs r0, #2 - strb r0, [r4, #0xc] - strb r1, [r4, #0xe] - movs r0, #0xff - strb r0, [r4, #0xf] - ldr r1, _080AC028 @ =gUnk_0812A97C - ldrb r0, [r4, #0xb] - lsls r0, r0, #1 - adds r0, r0, r1 - ldrh r0, [r0] - strh r0, [r4, #0x24] - adds r1, r4, #0 - adds r1, #0x44 - movs r0, #0x88 - strb r0, [r1] - ldr r0, _080AC02C @ =0x00000193 - b _080AC06A - .align 2, 0 -_080AC028: .4byte gUnk_0812A97C -_080AC02C: .4byte 0x00000193 -_080AC030: - movs r0, #1 - strb r0, [r4, #0xc] - strb r1, [r4, #0xe] - movs r0, #7 - strb r0, [r4, #0xf] - adds r1, r4, #0 - adds r1, #0x85 - movs r0, #0x18 - strb r0, [r1] - subs r1, #0x41 - movs r0, #0x88 - b _080AC058 -_080AC048: - strb r1, [r4, #0xc] - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - adds r1, r4, #0 - adds r1, #0x85 - movs r0, #0x18 -_080AC058: - strb r0, [r1] - ldr r0, [r4, #0x50] - adds r1, r4, #0 - bl CopyPositionAndSpriteOffset - ldrh r0, [r4, #0x36] - subs r0, #0x14 - strh r0, [r4, #0x36] - ldr r0, _080AC070 @ =0x00000149 -_080AC06A: - bl SoundReq - pop {r4, pc} - .align 2, 0 -_080AC070: .4byte 0x00000149 - .syntax divided diff --git a/asm/non_matching/v3ElectricProjectile/sub_080AC168.inc b/asm/non_matching/v3ElectricProjectile/sub_080AC168.inc deleted file mode 100644 index 6e5607e2..00000000 --- a/asm/non_matching/v3ElectricProjectile/sub_080AC168.inc +++ /dev/null @@ -1,75 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r4, r0, #0 - bl GetNextFrame - ldr r0, [r4, #0x34] - ldr r1, _080AC1C0 @ =0xFFFF8000 - adds r0, r0, r1 - str r0, [r4, #0x34] - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r6, r0, #0x18 - cmp r6, #0 - bne _080AC1F8 - movs r0, #4 - strb r0, [r4, #0xc] - strb r0, [r4, #0xe] - bl Random - adds r5, r0, #0 - movs r0, #7 - ands r5, r0 - ldr r0, _080AC1C4 @ =gUnk_0812A982 - adds r0, r5, r0 - ldrb r0, [r0] - strb r0, [r4, #0xf] - ldr r1, _080AC1C8 @ =gPlayerEntity - adds r0, r4, #0 - bl GetFacingDirection - adds r1, r0, #0 - ldr r0, [r4, #0x50] - adds r0, #0x84 - ldrb r0, [r0] - cmp r0, #3 - bne _080AC1D0 - ldr r0, _080AC1CC @ =gUnk_0812A98A - adds r0, r5, r0 - ldrb r0, [r0] - subs r1, r1, r0 - strb r6, [r4, #0xb] - b _080AC1F2 - .align 2, 0 -_080AC1C0: .4byte 0xFFFF8000 -_080AC1C4: .4byte gUnk_0812A982 -_080AC1C8: .4byte gPlayerEntity -_080AC1CC: .4byte gUnk_0812A98A -_080AC1D0: - cmp r0, #2 - bne _080AC1E4 - ldr r0, _080AC1E0 @ =gUnk_0812A98A - adds r0, r5, r0 - ldrb r0, [r0] - subs r1, r1, r0 - movs r0, #1 - b _080AC1F0 - .align 2, 0 -_080AC1E0: .4byte gUnk_0812A98A -_080AC1E4: - ldr r0, _080AC1FC @ =gUnk_0812A98A - adds r0, r5, r0 - ldrb r0, [r0] - lsrs r0, r0, #1 - subs r1, r1, r0 - movs r0, #2 -_080AC1F0: - strb r0, [r4, #0xb] -_080AC1F2: - movs r0, #0x1f - ands r1, r0 - strb r1, [r4, #0x15] -_080AC1F8: - pop {r4, r5, r6, pc} - .align 2, 0 -_080AC1FC: .4byte gUnk_0812A98A - .syntax divided diff --git a/asm/non_matching/v3ElectricProjectile/sub_080AC200.inc b/asm/non_matching/v3ElectricProjectile/sub_080AC200.inc deleted file mode 100644 index 1d117905..00000000 --- a/asm/non_matching/v3ElectricProjectile/sub_080AC200.inc +++ /dev/null @@ -1,62 +0,0 @@ - .syntax unified - push {r4, r5, lr} - adds r4, r0, #0 - bl GetNextFrame - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - movs r5, #0xff - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080AC270 - movs r0, #0x10 - strb r0, [r4, #0xe] - movs r0, #0x21 - bl CreateProjectile - adds r1, r0, #0 - cmp r1, #0 - beq _080AC23C - movs r0, #2 - strb r0, [r1, #0xa] - ldrb r0, [r4, #0xb] - strb r0, [r1, #0xb] - ldrb r0, [r4, #0x15] - strb r0, [r1, #0x15] - ldr r0, [r4, #0x50] - str r0, [r1, #0x50] - adds r0, r4, #0 - bl CopyPosition -_080AC23C: - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - ands r0, r5 - cmp r0, #0 - bne _080AC24C - bl DeleteThisEntity -_080AC24C: - ldr r0, [r4, #0x50] - adds r0, #0x84 - ldrb r0, [r0] - cmp r0, #3 - bne _080AC25C - ldrb r0, [r4, #0x15] - adds r0, #3 - b _080AC26A -_080AC25C: - cmp r0, #2 - bne _080AC266 - ldrb r0, [r4, #0x15] - adds r0, #3 - b _080AC26A -_080AC266: - ldrb r0, [r4, #0x15] - adds r0, #2 -_080AC26A: - movs r1, #0x1f - ands r0, r1 - strb r0, [r4, #0x15] -_080AC270: - pop {r4, r5, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/v3TennisBallProjectile/sub_080ACA68.inc b/asm/non_matching/v3TennisBallProjectile/sub_080ACA68.inc deleted file mode 100644 index 451a5e38..00000000 --- a/asm/non_matching/v3TennisBallProjectile/sub_080ACA68.inc +++ /dev/null @@ -1,53 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x41 - ldrb r0, [r0] - movs r1, #0x7f - ands r1, r0 - cmp r1, #0xc - bgt _080ACA82 - cmp r1, #0xa - bge _080ACA86 - cmp r1, #6 - beq _080ACA86 - b _080ACAC0 -_080ACA82: - cmp r1, #0x1a - bne _080ACAC0 -_080ACA86: - movs r0, #2 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r1, #0 - ldrh r1, [r4, #0x24] - adds r0, r0, r1 - strh r0, [r4, #0x24] - ldr r0, [r4, #0x4c] - str r0, [r4, #0x54] - adds r0, r4, #0 - bl sub_080ACB40 - cmp r0, #0 - beq _080ACAB0 - movs r0, #0 - b _080ACAB6 -_080ACAB0: - adds r0, r4, #0 - adds r0, #0x3e - ldrb r0, [r0] -_080ACAB6: - strb r0, [r4, #0x15] - movs r0, #0xd8 - bl SoundReq - b _080ACAC4 -_080ACAC0: - bl DeleteThisEntity -_080ACAC4: - pop {r4, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/v3TennisBallProjectile/sub_080ACB40.inc b/asm/non_matching/v3TennisBallProjectile/sub_080ACB40.inc deleted file mode 100644 index fde2c262..00000000 --- a/asm/non_matching/v3TennisBallProjectile/sub_080ACB40.inc +++ /dev/null @@ -1,48 +0,0 @@ - .syntax unified - push {lr} - adds r2, r0, #0 - ldr r0, [r2, #0x50] - ldr r1, [r0, #0x50] - ldr r3, [r2, #0x54] - ldr r0, [r1, #0x64] - ldr r0, [r0, #0x1c] - ldr r0, [r0, #0x54] - cmp r0, r2 - beq _080ACB5A - ldr r0, [r0, #0x54] - cmp r3, r0 - beq _080ACB86 -_080ACB5A: - ldr r1, [r1, #0x64] - ldr r0, [r1, #0x20] - ldr r0, [r0, #0x54] - cmp r0, r2 - beq _080ACB6A - ldr r0, [r0, #0x54] - cmp r3, r0 - beq _080ACB86 -_080ACB6A: - ldr r0, [r1, #0x24] - ldr r0, [r0, #0x54] - cmp r0, r2 - beq _080ACB78 - ldr r0, [r0, #0x54] - cmp r3, r0 - beq _080ACB86 -_080ACB78: - ldr r0, [r1, #0x28] - ldr r0, [r0, #0x54] - cmp r0, r2 - beq _080ACB8A - ldr r0, [r0, #0x54] - cmp r3, r0 - bne _080ACB8A -_080ACB86: - movs r0, #0 - b _080ACB8C -_080ACB8A: - movs r0, #1 -_080ACB8C: - pop {pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/winder/sub_080AB950.inc b/asm/non_matching/winder/sub_080AB950.inc deleted file mode 100644 index 0712e394..00000000 --- a/asm/non_matching/winder/sub_080AB950.inc +++ /dev/null @@ -1,70 +0,0 @@ - .syntax unified - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _080AB99C - adds r0, r4, #0 - bl ProcessMovement - ldrb r0, [r4, #0x15] - lsrs r0, r0, #3 - ldr r1, _080AB994 @ =gUnk_0812A6C4 - lsls r5, r0, #1 - adds r1, r5, r1 - ldrh r1, [r1] - ldrh r0, [r4, #0x2a] - ands r0, r1 - cmp r0, #0 - bne _080AB980 - ldrb r1, [r4, #0x15] - adds r0, r4, #0 - bl sub_080AB9FC - cmp r0, #0 - beq _080AB9D4 -_080AB980: - bl Random - ldr r2, _080AB998 @ =gUnk_0812A6BC - movs r1, #1 - ands r1, r0 - adds r1, r1, r5 - adds r1, r1, r2 - ldrb r0, [r1] - strb r0, [r4, #0x15] - b _080AB9D4 - .align 2, 0 -_080AB994: .4byte gUnk_0812A6C4 -_080AB998: .4byte gUnk_0812A6BC -_080AB99C: - ldr r0, [r4, #0x50] - cmp r0, #0 - bne _080AB9A6 - bl DeleteThisEntity -_080AB9A6: - ldr r0, [r4, #0x50] - ldr r0, [r0, #4] - cmp r0, #0 - bne _080AB9B2 - bl DeleteThisEntity -_080AB9B2: - ldr r1, [r4, #0x54] - cmp r1, #0 - beq _080AB9D0 - ldr r0, [r1, #4] - cmp r0, #0 - beq _080AB9D0 - adds r0, r1, #0 - adds r0, #0x68 - ldrh r0, [r0] - strh r0, [r4, #0x2e] - adds r0, r1, #0 - adds r0, #0x6a - ldrh r0, [r0] - strh r0, [r4, #0x32] - b _080AB9D4 -_080AB9D0: - bl DeleteThisEntity -_080AB9D4: - adds r0, r4, #0 - bl GetNextFrame - pop {r4, r5, pc} - .syntax divided diff --git a/asm/non_matching/winder/sub_080AB9FC.inc b/asm/non_matching/winder/sub_080AB9FC.inc deleted file mode 100644 index a8339867..00000000 --- a/asm/non_matching/winder/sub_080AB9FC.inc +++ /dev/null @@ -1,49 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - adds r4, r1, #0 - adds r0, #0x38 - ldrb r0, [r0] - bl GetLayerByIndex - movs r1, #0x2e - ldrsh r3, [r5, r1] - ldr r2, _080ABA4C @ =gRoomControls - ldrh r1, [r2, #6] - subs r3, r3, r1 - asrs r3, r3, #4 - movs r6, #0x3f - ands r3, r6 - movs r7, #0x32 - ldrsh r1, [r5, r7] - ldrh r2, [r2, #8] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r6 - lsls r1, r1, #6 - orrs r3, r1 - ldr r1, _080ABA50 @ =gUnk_080B4488 - lsrs r4, r4, #3 - lsls r4, r4, #1 - adds r4, r4, r1 - movs r2, #0 - ldrsh r1, [r4, r2] - adds r3, r3, r1 - ldr r7, _080ABA54 @ =0x00002004 - adds r0, r0, r7 - adds r0, r0, r3 - ldrb r0, [r0] - cmp r0, #0x1f - bls _080ABA58 - cmp r0, #0x3f - bhi _080ABA58 - movs r0, #1 - b _080ABA5A - .align 2, 0 -_080ABA4C: .4byte gRoomControls -_080ABA50: .4byte gUnk_080B4488 -_080ABA54: .4byte 0x00002004 -_080ABA58: - movs r0, #0 -_080ABA5A: - pop {r4, r5, r6, r7, pc} - .syntax divided diff --git a/include/entity.h b/include/entity.h index 0d4be294..66b5190f 100644 --- a/include/entity.h +++ b/include/entity.h @@ -101,6 +101,13 @@ typedef struct { u8 unknown2[3]; } Hitbox3D; +typedef struct { + u8 b0 : 3; // 1-4 + u8 b1 : 3; // 8 + u8 b2 : 1; // 0x40 + u8 b3 : 1; // 0x80 +} PACKED SpritePriority; + /** * Container for instantiable behavior. */ @@ -156,12 +163,7 @@ typedef struct Entity_ { /*0x20*/ s32 zVelocity; /**< Z axis speed. */ /*0x24*/ s16 speed; /**< Magnitude of speed. */ /*0x26*/ u8 spriteAnimation[3]; - /*0x29*/ struct { - /* */ u8 b0 : 3; /* 1-4 */ - /* */ u8 b1 : 3; /* 8 */ - /* */ u8 b2 : 1; /* 0x40 */ - /* */ u8 b3 : 1; /* 0x80 */ - /* */ } PACKED spritePriority; + /*0x29*/ SpritePriority spritePriority; /*0x2a*/ u16 collisions; /*0x2c*/ union SplitWord x; /**< X position, fixed point. */ /*0x30*/ union SplitWord y; /**< Y position, fixed point. */ diff --git a/src/projectile/ballAndChain.c b/src/projectile/ballAndChain.c index 61a812ba..c01f9a42 100644 --- a/src/projectile/ballAndChain.c +++ b/src/projectile/ballAndChain.c @@ -1,11 +1,17 @@ #include "entity.h" #include "functions.h" #include "projectile.h" +#include "hitbox.h" + +typedef struct { + s8 x; + s8 y; +} PACKED PosOffset; bool32 sub_080AB12C(Entity* this); extern void (*const gUnk_0812A494[])(Entity*); -extern const u8 gUnk_0812A4A8[]; +extern const PosOffset gUnk_0812A4A8[]; void BallAndChain(Entity* this) { gUnk_0812A494[this->type](this); @@ -61,7 +67,58 @@ bool32 sub_080AB12C(Entity* this) { return TRUE; } -ASM_FUNC("asm/non_matching/ballAndChain/sub_080AB170.inc", void sub_080AB170(Entity* this)) +void sub_080AB170(Entity* this) { + s32 val; + s32 type; + Entity* ent; + Entity* parent = this->parent; + if (parent->next == NULL) { + DeleteThisEntity(); + } + + if (this->action == 0) { + this->action = 1; + this->spritePriority.b1 = 0; + this->frameIndex = 5; + this->spritePriority.b0 = 3; + this->hitbox = (Hitbox*)&gHitbox_22; + } + + ent = parent->parent; + if (this->field_0x7c.BYTES.byte0 != ent->field_0x7c.BYTES.byte0) { + this->flags |= 0x80; + } else { + this->flags &= 0x7f; + } + + this->field_0x7c.BYTES.byte0 = ent->field_0x7c.BYTES.byte0; + + if ((ent->frame & 0x20) == 0) { + u8 index = ent->frame & 0x1f; + PosOffset* pOffset = (PosOffset*)((s8*)gUnk_0812A4A8 + index); + sub_0806FA90(ent, this, pOffset->x, pOffset->y); + } else { + sub_0806FA90(ent, this, 0, -10); + } + + val = (parent->x.HALF.HI - this->x.HALF.HI) * this->type; + if (val < 0) { + val += 3; + } + this->x.HALF.HI += (val >> 2); + + val = (parent->y.HALF.HI - this->y.HALF.HI) * this->type; + if (val < 0) { + val += 3; + } + this->y.HALF.HI += (val >> 2); + + val = (parent->z.HALF.HI - this->z.HALF.HI) * this->type; + if (val < 0) { + val += 3; + } + this->z.HALF.HI += (val >> 2); +} void sub_080AB26C(Entity* this) { if (this->action == 0) { @@ -82,7 +139,7 @@ void sub_080AB26C(Entity* this) { void (*const gUnk_0812A494[])(Entity*) = { sub_080AB074, sub_080AB170, sub_080AB170, sub_080AB170, sub_080AB26C, }; -const u8 gUnk_0812A4A8[] = { - 6, 240, 10, 242, 10, 240, 8, 240, 252, 242, 248, 242, 252, 246, 4, 246, - 250, 242, 248, 240, 246, 242, 248, 244, 4, 242, 8, 242, 4, 246, 252, 246, +const PosOffset gUnk_0812A4A8[] = { + { 6, -16 }, { 10, -14 }, { 10, -16 }, { 8, -16 }, { -4, -14 }, { -8, -14 }, { -4, -10 }, { 4, -10 }, + { -6, -14 }, { -8, -16 }, { -10, -14 }, { -8, -12 }, { 4, -14 }, { 8, -14 }, { 4, -10 }, { -4, -10 }, }; diff --git a/src/projectile/gyorgMaleEnergyProjectile.c b/src/projectile/gyorgMaleEnergyProjectile.c index 08946bc8..8e9983cc 100644 --- a/src/projectile/gyorgMaleEnergyProjectile.c +++ b/src/projectile/gyorgMaleEnergyProjectile.c @@ -19,7 +19,30 @@ void GyorgMaleEnergyProjectile_OnTick(Entity* this) { GyorgMaleEnergyProjectile_Actions[this->action](this); } -ASM_FUNC("asm/non_matching/gyorgMaleEnergyProjectile/sub_080AC8DC.inc", void sub_080AC8DC(Entity* this)) +void sub_080AC8DC(Entity* this) { + switch ((s8)(this->bitfield & 0x7f)) { + case 0: + case 1: + case 2: + case 3: + case 0x1e: + case 0x1f: { + DeleteThisEntity(); + break; + } + default: { + if (this->action != 3) { + this->action = 3; + this->flags &= 0x7f; + this->speed >>= 1; + InitializeAnimation(this, 1); + } + break; + } + } + + GyorgMaleEnergyProjectile_OnTick(this); +} void GyorgMaleEnergyProjectile_Init(Entity* this) { this->action = 1; diff --git a/src/projectile/spiderWeb.c b/src/projectile/spiderWeb.c index 6df74e1c..40bc8007 100644 --- a/src/projectile/spiderWeb.c +++ b/src/projectile/spiderWeb.c @@ -3,8 +3,14 @@ #include "functions.h" #include "object.h" +typedef struct { + u8 b0; + u8 direction; +} PACKED Struct_0812A074; + extern void sub_0806FBB4(Entity*); extern u32 sub_080002D4(s32, s32, u32); +extern void sub_08078930(Entity*); extern void (*const SpiderWeb_Functions[])(Entity*); extern void (*const SpiderWeb_Actions[])(Entity*); @@ -13,7 +19,7 @@ extern const Hitbox* const gUnk_0812A04C[]; extern void (*const SpiderWeb_SubActions[])(Entity*); extern const s8 gUnk_0812A064[]; extern const s8 gUnk_0812A06C[]; -extern const u8 gUnk_0812A074[]; +extern const Struct_0812A074 gUnk_0812A074[]; extern const u16 gUnk_0812A084[]; void sub_080AA6C0(Entity*); @@ -165,7 +171,50 @@ void SpiderWeb_Action3(Entity* this) { } } -ASM_FUNC("asm/non_matching/spiderWeb/sub_080AA9E0.inc", void sub_080AA9E0(Entity* this)) +NONMATCH("asm/non_matching/spiderWeb/sub_080AA9E0.inc", void sub_080AA9E0(Entity* this)) { + s32 coord1, coord2, diff; + Struct_0812A074* ptr; + SpritePriority* priorityPtr; + SpritePriority prio; + u8 val1, val2; + if (this->type & 0x1) { + coord2 = gPlayerEntity.x.HALF.HI; + coord1 = this->x.HALF.HI; + } else { + coord2 = gPlayerEntity.y.HALF.HI; + coord1 = this->y.HALF.HI; + } + + diff = coord2 - coord1; + ptr = (Struct_0812A074*)gUnk_0812A074 + (this->type << 1); + switch (this->type) { + case 3: + case 0: { + if (diff > 4) { + ptr++; + } + break; + } + case 1: + case 2: { + if (diff < -4) { + ptr++; + } + break; + } + } + + val1 = ptr->b0; + priorityPtr = (SpritePriority*)&this->spritePriority; + priorityPtr->b0 = val1 & 0x7; + // instruction order problems + // this->spritePriority.b0 = ptr->b0 & 0x7; + this->direction = ptr->direction; + if (val1 == 5) { + sub_08078930(this); + } +} +END_NONMATCH void sub_080AAA68(Entity* this) { SetTile(gUnk_0812A084[this->type], TILE(this->x.HALF.HI, this->y.HALF.HI), this->collisionLayer); @@ -205,5 +254,6 @@ void (*const SpiderWeb_SubActions[])(Entity*) = { }; const s8 gUnk_0812A064[] = { 0, 17, -15, 4, 0, -11, 15, 4 }; const s8 gUnk_0812A06C[] = { 0, 2, -2, 0, 0, -2, 2, 0 }; -const u8 gUnk_0812A074[] = { 4, 0, 5, 16, 3, 8, 5, 24, 3, 16, 5, 0, 3, 24, 5, 8 }; +const Struct_0812A074 gUnk_0812A074[] = { { 4, 0 }, { 5, 16 }, { 3, 8 }, { 5, 24 }, + { 3, 16 }, { 5, 0 }, { 3, 24 }, { 5, 8 } }; const u16 gUnk_0812A084[] = { 16419, 16421, 16422, 16420 }; diff --git a/src/projectile/spikedRollers.c b/src/projectile/spikedRollers.c index 503792ba..6c68133b 100644 --- a/src/projectile/spikedRollers.c +++ b/src/projectile/spikedRollers.c @@ -1,20 +1,95 @@ +#define NENT_DEPRECATED #include "entity.h" -extern void (*const SpikedRollers_Actions[])(Entity*); -extern const u8 gUnk_0812A6D4[]; +typedef struct { + Entity base; + s16 x2; + s16 y2; + s16 unk_0x6c; + u8 fill[0x16]; + u16 unk_0x84; + u16 speed2; +} SpikedRollersEntity; -void SpikedRollers(Entity* this) { - SpikedRollers_Actions[this->action](this); +extern s32 sub_080AF090(Entity*); + +static void (*const SpikedRollers_Actions[])(SpikedRollersEntity*); +static const u8 gSpikedRollersOffsets[]; + +void SpikedRollers(SpikedRollersEntity* this) { + SpikedRollers_Actions[super->action](this); } -ASM_FUNC("asm/non_matching/spikedRollers/sub_080ABA74.inc", void sub_080ABA74(Entity* this)) +void sub_080ABA74(SpikedRollersEntity* this) { + s32 val; + super->action++; + super->speed = this->speed2; + this->x2 = super->x.HALF.HI; + this->y2 = super->y.HALF.HI; + this->unk_0x6c = this->unk_0x84; -ASM_FUNC("asm/non_matching/spikedRollers/sub_080ABAE0.inc", void sub_080ABAE0(Entity* this)) + if (super->type <= 6) { + super->type2 = 0; + } else { + super->type2 = 1; + } -void (*const SpikedRollers_Actions[])(Entity*) = { + val = gSpikedRollersOffsets[super->type]; + + if (super->type2 == 0) { + super->direction = 8; + super->y.HALF.HI += val; + } else { + super->direction = 0x10; + super->x.HALF.HI += val; + } + + InitializeAnimation(super, super->type); +} + +void sub_080ABAE0(SpikedRollersEntity* this) { + s32 diff, unk_0x6c; + sub_080AF090(super); + + if (super->type2 == 0) { + diff = super->x.HALF.HI - this->x2; + } else { + diff = super->y.HALF.HI - this->y2; + } + + unk_0x6c = this->unk_0x6c; + if (unk_0x6c < 0) { + diff = -diff; + unk_0x6c = -unk_0x6c; + } + + if ((u32)(diff << 0x10) > (unk_0x6c << 0x10)) { + super->direction ^= 0x10; + if (super->type2 == 0) { + super->x.HALF.HI = this->x2; + super->spriteSettings.flipX ^= 1; + } else { + super->y.HALF.HI = this->y2; + super->spriteSettings.flipY ^= 1; + } + + if (diff > 0) { + if (super->type2 == 0) { + super->x.HALF.HI += this->unk_0x6c; + } else { + super->y.HALF.HI += this->unk_0x6c; + } + } + } + + GetNextFrame(super); +} + +static void (*const SpikedRollers_Actions[])(SpikedRollersEntity*) = { sub_080ABA74, sub_080ABAE0, }; -const u8 gUnk_0812A6D4[] = { + +static const u8 gSpikedRollersOffsets[] = { 8, 16, 24, 32, 40, 48, 56, 16, 24, 32, 40, 48, 56, 64, }; diff --git a/src/projectile/v1DarkMagicProjectile.c b/src/projectile/v1DarkMagicProjectile.c index 531d009c..c9a3d281 100644 --- a/src/projectile/v1DarkMagicProjectile.c +++ b/src/projectile/v1DarkMagicProjectile.c @@ -52,7 +52,39 @@ void sub_080AAC44(Entity* this) { } } -ASM_FUNC("asm/non_matching/v1DarkMagicProjectile/sub_080AACE0.inc", void sub_080AACE0(Entity* this)) +void sub_080AACE0(Entity* this) { + Entity* parent; + if (this->type && this->type2) { + DeleteThisEntity(); + } + + if (this->spriteSettings.draw == 1) { + this->spriteSettings.draw = 0; + this->field_0x86.HALF.LO = 1; + CreateFx(this, 2, 0); + } + + parent = this->parent; + if (this->type2 == 0) { + u8* ptr = &(parent->field_0x74.HALF.LO); + parent->field_0x74.HALF.LO = 3; + parent->field_0x80.HALF.LO += this->field_0x80.HALF.HI >> 1; + if (parent->field_0x80.HALF.LO > 8) { + parent->field_0x80.HALF.LO = 8; + } else if (parent->field_0x80.HALF.LO == 0) { + parent->field_0x80.HALF.LO = 1; + } + } else { + parent->cutsceneBeh.HALF.LO = 0; + parent->hitType = 0x2b; + } + + if (this->field_0x86.HALF.LO == 0) { + CreateFx(this, 2, 0); + } + + DeleteThisEntity(); +} void sub_080AAD70(Entity* this) { if (sub_0806F520() == 0) { diff --git a/src/projectile/v1EyeLaser.c b/src/projectile/v1EyeLaser.c index b1b068e8..8bdb0652 100644 --- a/src/projectile/v1EyeLaser.c +++ b/src/projectile/v1EyeLaser.c @@ -9,6 +9,7 @@ extern const Hitbox gUnk_0812A61C; void sub_080AB758(Entity*); void sub_080AB888(Entity*); +void sub_080AB844(Entity* this, s32 param_1, s32 param_2); void V1EyeLaser(Entity* this) { if (this->parent->spriteSettings.draw == 0) { @@ -50,7 +51,45 @@ void V1EyeLaser_Action2(Entity* this) { } } -ASM_FUNC("asm/non_matching/v1EyeLaser/sub_080AB758.inc", void sub_080AB758(Entity* this)) +NONMATCH("asm/non_matching/v1EyeLaser/sub_080AB758.inc", void sub_080AB758(Entity* this)) { + s32 r6 = 6; + u32 r7 = 0; + u32 index = 0; + if (((u32)this->y.HALF.HI) <= (u16)(gRoomControls.origin_y + 0xd4)) { + u32 tmp = 7; + do { + if ((index & tmp) == 7) { + sub_080AB844(this, 4, r6); + r6 += 0x3e; + r7 += 0x3e; + } + index = (index + 1) & tmp; + } while (this->y.HALF.HI + r7 + (index << 3) <= (u16)(gRoomControls.origin_y + 0xd4)); + } + index = 0; + if (this->y.HALF.HI + r7 <= (u16)(gRoomControls.origin_y + 0xd4)) { + u32 tmp = 3; + do { + if ((index & tmp) == 3) { + sub_080AB844(this, 3, r6); + r6 += 0x1e; + r7 += 0x1e; + } + index = (index + 1) & tmp; + } while (this->y.HALF.HI + r7 + (index << 3) <= (u16)(gRoomControls.origin_y + 0xd4)); + } + + if (index & 0x2) { + sub_080AB844(this, 2, r6); + r6 += 0xe; + } else if (index & 0x1) { + sub_080AB844(this, 1, r6); + r6 += 0x6; + } + + sub_080AB844(this, 6, r6); +} +END_NONMATCH void sub_080AB844(Entity* this, s32 param_1, s32 param_2) { Entity* entity; diff --git a/src/projectile/v2Projectile.c b/src/projectile/v2Projectile.c index b2c1ae7b..5d9f6eb2 100644 --- a/src/projectile/v2Projectile.c +++ b/src/projectile/v2Projectile.c @@ -2,6 +2,7 @@ #include "entity.h" #include "enemy.h" #include "functions.h" +#include "object.h" extern void (*const V2Projectile_Functions[])(Entity*); extern void (*const gUnk_0812A7EC[])(Entity*); @@ -18,9 +19,52 @@ void V2Projectile(Entity* this) { V2Projectile_Functions[GetNextFunction(this)](this); } -ASM_FUNC("asm/non_matching/v2Projectile/sub_080ABBA8.inc", void sub_080ABBA8(Entity* this)) +void sub_080ABBA8(Entity* this) { + switch (this->type) { + case 0: { + gUnk_0812A7EC[this->action](this); + break; + } + case 1: { + gUnk_0812A7F8[this->action](this); + break; + } + case 2: + default: + gUnk_0812A800[this->action](this); + } +} -ASM_FUNC("asm/non_matching/v2Projectile/sub_080ABBF4.inc", void sub_080ABBF4(Entity* this)) +void sub_080ABBF4(Entity* this) { + if ((this->bitfield & 0x80) == 0) + return; + + switch (this->type) { + case 2: { + switch ((this->bitfield & 0x3f)) { + case 0: { + ModHealth(-4); + // fallthrough + } + case 3: + case 0x14: { + CreateDust(this); + DeleteThisEntity(); + break; + } + } + break; + } + case 0: + case 1: { + if ((this->bitfield & 0x3f) == 0) { + ModHealth(-2); + DeleteThisEntity(); + } + break; + } + } +} void sub_080ABC54(Entity* this) { if (sub_0806F520() == 0) { @@ -90,7 +134,26 @@ void sub_080ABD70(Entity* this) { } } -ASM_FUNC("asm/non_matching/v2Projectile/sub_080ABE04.inc", void sub_080ABE04(Entity* this)) +void sub_080ABE04(Entity* this) { + u32 rand = Random() & 0xff; + u32 newX; + this->action = 1; + this->zVelocity = 0xffff0000; + this->z.HALF.HI -= 0xa0; + this->x.HALF.HI = (gRoomControls.origin_x & 0x7ff0) | 0x8; + this->y.HALF.HI = (gRoomControls.origin_y & 0x7ff0) | 0x8; + newX = this->x.HALF.HI; + if (rand & 0x10) { + newX += 0x10; + } else { + newX += 0xc0; + } + this->x.HALF.HI = newX + ((0xe0 & rand) >> 1); + this->y.HALF.HI += ((0xf & rand) << 4); + sub_08004168(this); + InitializeAnimation(this, 0); + SoundReq(SFX_12D); +} void sub_080ABE88(Entity* this) { if (GravityUpdate(this, 0x1800) == 0) { diff --git a/src/projectile/v3ElectricProjectile.c b/src/projectile/v3ElectricProjectile.c index 556cc709..a3461f03 100644 --- a/src/projectile/v3ElectricProjectile.c +++ b/src/projectile/v3ElectricProjectile.c @@ -2,15 +2,16 @@ #include "enemy.h" #include "player.h" #include "coord.h" +#include "functions.h" extern s32 sub_080AF090(Entity*); extern s32 IsProjectileOffScreen(Entity*); extern void (*const V3ElectricProjectile_Functions[])(Entity*); extern void (*const V3ElectricProjectile_Actions[])(Entity*); -extern const u16 gUnk_0812A97C[]; -extern const u8 gUnk_0812A982[]; -extern const u8 gUnk_0812A98A[]; +static const u16 projectileSpeeds[]; +static const u8 gUnk_0812A982[]; +static const u8 projectileDirections[]; void V3ElectricProjectile(Entity* this) { V3ElectricProjectile_Functions[GetNextFunction(this)](this); @@ -24,7 +25,44 @@ void sub_080ABFE4(Entity* this) { DeleteThisEntity(); } -ASM_FUNC("asm/non_matching/v3ElectricProjectile/sub_080ABFEC.inc", void sub_080ABFEC(Entity* this)) +void sub_080ABFEC(Entity* this) { + Sound sound; + InitializeAnimation(this, this->type + 1); + + switch (this->type) { + case 0: { + this->action = 1; + this->actionDelay = 0; + this->field_0xf = 0x7; + this->cutsceneBeh.HALF.HI = 0x18; + this->damage = 0x88; + CopyPositionAndSpriteOffset(this->parent, this); + this->z.HALF.HI -= 0x14; + sound = SFX_149; + break; + } + case 1: { + this->action = 1; + this->flags &= 0x7f; + this->cutsceneBeh.HALF.HI = 0x18; + CopyPositionAndSpriteOffset(this->parent, this); + this->z.HALF.HI -= 0x14; + sound = SFX_149; + break; + } + default: { + this->action = 2; + this->actionDelay = 0; + this->field_0xf = 0xff; + this->speed = projectileSpeeds[this->type2]; + this->damage = 0x88; + sound = SFX_193; + break; + } + } + + SoundReq(sound); +} void V3ElectricProjectile_Action1(Entity* this) { if (this->parent->next == NULL) { @@ -75,9 +113,64 @@ void V3ElectricProjectile_Action2(Entity* this) { } } -ASM_FUNC("asm/non_matching/v3ElectricProjectile/sub_080AC168.inc", void sub_080AC168(Entity* this)) +void sub_080AC168(Entity* this) { + u8 actionDelay; + GetNextFrame(this); + this->z.WORD += 0xffff8000; + actionDelay = --this->actionDelay; + if (actionDelay == 0) { + u32 rand; + u32 dir; + this->action = 4; + this->actionDelay = 4; + rand = Random() & 0x7; + this->field_0xf = gUnk_0812A982[rand]; + dir = GetFacingDirection(this, &gPlayerEntity); + if (this->parent->cutsceneBeh.HALF.LO == 3) { + dir -= projectileDirections[rand]; + this->type2 = 0; + } else if (this->parent->cutsceneBeh.HALF.LO == 2) { + dir -= projectileDirections[rand]; + this->type2 = 1; + } else { + dir -= projectileDirections[rand] >> 1; + this->type2 = 2; + } -ASM_FUNC("asm/non_matching/v3ElectricProjectile/sub_080AC200.inc", void sub_080AC200(Entity* this)) + this->direction = dir & 0x1f; + } +} + +void sub_080AC200(Entity* this) { + Entity* proj; + GetNextFrame(this); + + if (--this->actionDelay) + return; + + this->actionDelay = 0x10; + proj = CreateProjectile(0x21); + + if (proj) { + proj->type = 2; + proj->type2 = this->type2; + proj->direction = this->direction; + proj->parent = this->parent; + CopyPosition(this, proj); + } + + if (--this->field_0xf == 0) { + DeleteThisEntity(); + } + + if (this->parent->cutsceneBeh.HALF.LO == 3) { + this->direction = (this->direction + 3) & 0x1f; + } else if (this->parent->cutsceneBeh.HALF.LO == 2) { + this->direction = (this->direction + 3) & 0x1f; + } else { + this->direction = (this->direction + 2) & 0x1f; + } +} void (*const V3ElectricProjectile_Functions[])(Entity*) = { V3ElectricProjectile_OnTick, sub_080ABFE4, DeleteEntity, DeleteEntity, DeleteEntity, @@ -85,10 +178,10 @@ void (*const V3ElectricProjectile_Functions[])(Entity*) = { void (*const V3ElectricProjectile_Actions[])(Entity*) = { sub_080ABFEC, V3ElectricProjectile_Action1, V3ElectricProjectile_Action2, sub_080AC168, sub_080AC200, }; -const u16 gUnk_0812A97C[] = { 352, 480, 480 }; -const u8 gUnk_0812A982[] = { +static const u16 projectileSpeeds[] = { 352, 480, 480 }; +static const u8 gUnk_0812A982[] = { 5, 6, 7, 8, 5, 6, 7, 6, }; -const u8 gUnk_0812A98A[] = { +static const u8 projectileDirections[] = { 6, 9, 9, 12, 6, 9, 9, 9, 0, 0, }; diff --git a/src/projectile/v3TennisBallProjectile.c b/src/projectile/v3TennisBallProjectile.c index 296c830b..5d7438c0 100644 --- a/src/projectile/v3TennisBallProjectile.c +++ b/src/projectile/v3TennisBallProjectile.c @@ -8,6 +8,7 @@ extern void (*const V3TennisBallProjectile_Functions[])(Entity*); extern void (*const V3TennisBallProjectile_Actions[])(Entity*); void sub_080ACB90(Entity*); +bool32 sub_080ACB40(Entity* this); void V3TennisBallProjectile(Entity* this) { V3TennisBallProjectile_Functions[GetNextFunction(this)](this); @@ -17,7 +18,32 @@ void V3TennisBallProjectile_OnTick(Entity* this) { V3TennisBallProjectile_Actions[this->action](this); } -ASM_FUNC("asm/non_matching/v3TennisBallProjectile/sub_080ACA68.inc", void sub_080ACA68(Entity* this)) +void sub_080ACA68(Entity* this) { + switch (this->bitfield & 0x7f) { + case 0x1a: + case 0xa: + case 0xb: + case 0xc: + case 0x6: { + this->action = 2; + this->flags &= 0x7f; + this->speed += 0x80 * 2; + this->child = this->field_0x4c; + if (sub_080ACB40(this)) { + this->direction = 0; + } else { + this->direction = this->knockbackDirection; + } + + SoundReq(SFX_ITEM_SWORD_CHARGE_FINISH); + break; + } + default: { + DeleteThisEntity(); + break; + } + } +} void V3TennisBallProjectile_Init(Entity* this) { this->action = 1; @@ -48,7 +74,35 @@ void V3TennisBallProjectile_Action2(Entity* this) { } } -ASM_FUNC("asm/non_matching/v3TennisBallProjectile/sub_080ACB40.inc", void sub_080ACB40(Entity* this)) +bool32 sub_080ACB40(Entity* this) { + Entity* r1_grandparent = this->parent->parent; + Entity* child = this->child; + Entity* tmp = ((Entity*)(r1_grandparent->myHeap[7]))->child; + + if (tmp != this && child == tmp->child) { + return 0; + } + + tmp = ((Entity*)(r1_grandparent->myHeap[8]))->child; + + if (tmp != this && child == tmp->child) { + return 0; + } + + tmp = ((Entity*)(r1_grandparent->myHeap[9]))->child; + + if (tmp != this && child == tmp->child) { + return 0; + } + + tmp = ((Entity*)(r1_grandparent->myHeap[10]))->child; + + if (tmp != this && child == tmp->child) { + return 0; + } + + return 1; +} void sub_080ACB90(Entity* this) { Entity* parent = this->parent; diff --git a/src/projectile/winder.c b/src/projectile/winder.c index 8dddd4a4..d8cd54d4 100644 --- a/src/projectile/winder.c +++ b/src/projectile/winder.c @@ -5,10 +5,13 @@ #include "projectile.h" extern void (*const Winder_Actions[])(Entity*); -extern const u8 gUnk_0812A6BC[]; -extern const u8 gUnk_0812A6C4[]; +extern s16 gUnk_080B4488[]; +extern u8* GetLayerByIndex(u32); +static const u8 gUnk_0812A6BC[]; +static const u16 gUnk_0812A6C4[]; void sub_080AB9DC(Entity*); +bool32 sub_080AB9FC(Entity* this, u32 param_1); void Winder(Entity* this) { Winder_Actions[this->action](this); @@ -45,7 +48,36 @@ void Winder_Init(Entity* this) { } } -ASM_FUNC("asm/non_matching/winder/sub_080AB950.inc", void sub_080AB950(Entity* this)) +void sub_080AB950(Entity* this) { + if (this->type == 0) { + u8 dir; + ProcessMovement(this); + dir = this->direction >> 3; + if (((gUnk_0812A6C4)[dir] & this->collisions) || sub_080AB9FC(this, this->direction)) { + this->direction = gUnk_0812A6BC[(Random() & 0x1) + (dir << 1)]; + } + } else { + Entity* child; + + if (this->parent == NULL) { + DeleteThisEntity(); + } + + if (this->parent->next == NULL) { + DeleteThisEntity(); + } + + child = this->child; + if (child && child->next) { + this->x.HALF.HI = child->field_0x68.HWORD; + this->y.HALF.HI = child->field_0x6a.HWORD; + } else { + DeleteThisEntity(); + } + } + + GetNextFrame(this); +} void sub_080AB9DC(Entity* this) { MemCopy(&this->field_0x6c, &this->field_0x68, 0x1c); @@ -53,7 +85,26 @@ void sub_080AB9DC(Entity* this) { this->field_0x86.HWORD = this->y.HALF.HI; } -ASM_FUNC("asm/non_matching/winder/sub_080AB9FC.inc", void sub_080AB9FC(Entity* this)) +bool32 sub_080AB9FC(Entity* this, u32 dir) { + u32 val; + u8* layer = GetLayerByIndex(this->collisionLayer); + u32 tmp; + val = (((this->x.HALF.HI - gRoomControls.origin_x) >> 4) & 0x3f) | + ((((this->y.HALF.HI - gRoomControls.origin_y) >> 4) & 0x3f) << 6); + val += gUnk_080B4488[dir >> 3]; + layer += 0x2004; + layer += val; + tmp = *layer; + if (tmp <= 0x1f) { + return 0; + } + + if (tmp > 0x3f) { + return 0; + } + + return 1; +} void (*const Winder_Actions[])(Entity*) = { Winder_Init, @@ -62,6 +113,9 @@ void (*const Winder_Actions[])(Entity*) = { const u8 gUnk_0812A6BC[] = { 8, 24, 0, 16, 8, 24, 0, 16, }; -const u8 gUnk_0812A6C4[] = { - 14, 0, 0, 224, 224, 0, 0, 14, +const u16 gUnk_0812A6C4[] = { + 0xe, + 0xe000, + 0xe0, + 0xe00, };