From 7579127914b708460b195103aabd6f1601d919ff Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 28 Aug 2022 07:07:19 +0300 Subject: [PATCH] Match sub_080369D0 --- asm/non_matching/octorokBoss/sub_080369D0.inc | 149 ------------------ src/enemy/octorokBoss.c | 36 ++++- 2 files changed, 34 insertions(+), 151 deletions(-) delete mode 100644 asm/non_matching/octorokBoss/sub_080369D0.inc diff --git a/asm/non_matching/octorokBoss/sub_080369D0.inc b/asm/non_matching/octorokBoss/sub_080369D0.inc deleted file mode 100644 index 13584527..00000000 --- a/asm/non_matching/octorokBoss/sub_080369D0.inc +++ /dev/null @@ -1,149 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - mov ip, r1 - adds r6, r2, #0 - adds r1, r0, #0 - adds r1, #0x84 - ldr r4, [r1] - ldr r2, [r4, #0xc] - ldrb r1, [r4, #1] - subs r1, #1 - lsls r1, r1, #2 - adds r3, r4, #0 - adds r3, #0xc - adds r1, r3, r1 - ldr r1, [r1] - adds r1, #0x7b - adds r0, #0x79 - ldrb r0, [r0] - ldrb r1, [r1] - adds r0, r0, r1 - adds r2, #0x7b - strb r0, [r2] - ldrb r0, [r4, #1] - movs r2, #0 - cmp r0, #1 - beq _08036A58 - adds r5, r3, #0 - lsls r0, r6, #0x18 - lsrs r0, r0, #0x18 - mov r8, r0 - rsbs r0, r6, #0 - lsls r0, r0, #0x18 - asrs r7, r0, #0x18 -_08036A16: - lsls r0, r2, #2 - adds r0, r5, r0 - ldr r1, [r0] - adds r1, #0x7b - adds r2, #1 - lsls r0, r2, #2 - adds r0, r5, r0 - ldr r0, [r0] - adds r3, r0, #0 - adds r3, #0x7b - ldrb r1, [r1] - ldrb r0, [r3] - cmp r1, r0 - beq _08036A4C - subs r0, r0, r1 - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - ble _08036A44 - cmp r0, r8 - ble _08036A4C - adds r0, r1, r6 - b _08036A4A -_08036A44: - cmp r0, r7 - bge _08036A4C - subs r0, r1, r6 -_08036A4A: - strb r0, [r3] -_08036A4C: - ldrb r0, [r4, #1] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r2, r0 - blo _08036A16 -_08036A58: - ldrb r0, [r4, #1] - subs r2, r0, #1 - cmp r2, #0 - beq _08036AE4 - ldr r0, _08036AEC @ =gSineTable - mov sb, r0 - movs r1, #0x80 - mov r8, r1 - mov r1, ip - lsls r0, r1, #0x14 - asrs r6, r0, #0x10 - lsls r0, r2, #2 - adds r0, #8 - adds r5, r0, r4 - movs r7, #0x80 - lsls r7, r7, #1 -_08036A78: - subs r4, r2, #1 - ldr r0, [r5] - adds r0, #0x7b - ldrb r0, [r0] - mov r1, r8 - eors r0, r1 - lsls r0, r0, #1 - add r0, sb - movs r1, #0 - ldrsh r0, [r0, r1] - adds r1, r6, #0 - bl FixedMul - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - adds r1, r7, #0 - bl FixedDiv - ldr r2, [r5] - ldr r1, [r5, #4] - lsls r0, r0, #0x10 - asrs r0, r0, #8 - ldr r1, [r1, #0x2c] - adds r1, r1, r0 - str r1, [r2, #0x2c] - ldr r0, [r5] - adds r0, #0x7b - ldrb r0, [r0] - mov r1, r8 - eors r0, r1 - adds r0, #0x40 - lsls r0, r0, #1 - add r0, sb - movs r1, #0 - ldrsh r0, [r0, r1] - adds r1, r6, #0 - bl FixedMul - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - adds r1, r7, #0 - bl FixedDiv - ldr r2, [r5] - ldr r1, [r5, #4] - lsls r0, r0, #0x10 - asrs r0, r0, #8 - ldr r1, [r1, #0x30] - subs r1, r1, r0 - str r1, [r2, #0x30] - subs r5, #4 - adds r2, r4, #0 - cmp r2, #0 - bne _08036A78 -_08036AE4: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08036AEC: .4byte gSineTable - .syntax divided diff --git a/src/enemy/octorokBoss.c b/src/enemy/octorokBoss.c index aea3acb2..2e3283e0 100644 --- a/src/enemy/octorokBoss.c +++ b/src/enemy/octorokBoss.c @@ -1012,8 +1012,40 @@ void sub_08036998(OctorokBossEntity* this) { } /** Calculate tail angles regular */ -ASM_FUNC("asm/non_matching/octorokBoss/sub_080369D0.inc", - void sub_080369D0(OctorokBossEntity* this, s32 radius, s32 angleSpeed)) +void sub_080369D0(OctorokBossEntity* this, s32 radius, s32 angleSpeed) { + u32 index; + s32 tmp; + s8 angleDiff; + OctorokBossHeap* heap = this->heap; + // Calculate the angle for the tail end + (heap->tailObjects[0])->angle.HALF.HI = (heap->tailObjects[heap->tailCount - 1])->angle.HALF.HI + this->timer; + // iterate tails from 0 to tailCount-1 to calculate the angles + for (index = 0; index < (u8)(heap->tailCount - 1); index++) { + if ((heap->tailObjects[index])->angle.HALF.HI != (heap->tailObjects[index + 1])->angle.HALF.HI) { + angleDiff = (heap->tailObjects[index + 1])->angle.HALF.HI - (heap->tailObjects[index])->angle.HALF.HI; + if (angleDiff >= 1) { + if (angleDiff > (u8)angleSpeed) { + (heap->tailObjects[index + 1])->angle.HALF.HI = + (heap->tailObjects[index])->angle.HALF.HI + angleSpeed; + } + } else { + if (angleDiff < (s8)-angleSpeed) { + (heap->tailObjects[index + 1])->angle.HALF.HI = + (heap->tailObjects[index])->angle.HALF.HI - angleSpeed; + } + } + } + } + // iterate tails from tailCount-1 to 0 to calculate the positions + for (index = heap->tailCount - 1; index != 0; index--) { + tmp = FixedMul(gSineTable[heap->tailObjects[index - 1]->angle.HALF.HI ^ 0x80], radius << 4); + tmp = FixedDiv(tmp, 0x100); + heap->tailObjects[index - 1]->base.x.WORD = heap->tailObjects[index]->base.x.WORD + ((tmp << 0x10) >> 8); + tmp = FixedMul(gSineTable[(heap->tailObjects[index - 1]->angle.HALF.HI ^ 0x80) + 0x40], radius << 4); + tmp = FixedDiv(tmp, 0x100); + heap->tailObjects[index - 1]->base.y.WORD = heap->tailObjects[index]->base.y.WORD - ((tmp << 0x10) >> 8); + } +} /** Calculate tail angles frozen sub_08036AF0 */ ASM_FUNC("asm/non_matching/octorokBoss/sub_08036AF0.inc",