summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2022-08-27 23:04:51 -0700
committerGitHub <noreply@github.com>2022-08-27 23:04:51 -0700
commitbdf796fffe54f7b80224b0ed342a91fd9d49d5cf (patch)
tree386010433595236f386a00e15a1c02680a166f3f
parentb1ec50a19811984750e17058645ac87cab6ad6cc (diff)
parent7579127914b708460b195103aabd6f1601d919ff (diff)
Merge pull request #569 from hatal175/sub_080369D0
Match sub_080369D0
-rw-r--r--asm/non_matching/octorokBoss/sub_080369D0.inc149
-rw-r--r--src/enemy/octorokBoss.c36
2 files changed, 34 insertions, 151 deletions
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",