diff --git a/asm/non_matching/frozenOctorok/FrozenOctorok_Action1.inc b/asm/non_matching/frozenOctorok/FrozenOctorok_Action1.inc new file mode 100644 index 00000000..a764d5b5 --- /dev/null +++ b/asm/non_matching/frozenOctorok/FrozenOctorok_Action1.inc @@ -0,0 +1,267 @@ + .syntax unified + push {r4, r5, r6, r7, lr} + adds r5, r0, #0 + ldrb r0, [r5, #0xa] + cmp r0, #7 + bls _0809C5D0 + b _0809C7DE +_0809C5D0: + lsls r0, r0, #2 + ldr r1, _0809C5DC @ =_0809C5E0 + adds r0, r0, r1 + ldr r0, [r0] + mov pc, r0 + .align 2, 0 +_0809C5DC: .4byte _0809C5E0 +_0809C5E0: @ jump table + .4byte _0809C738 @ case 0 + .4byte _0809C600 @ case 1 + .4byte _0809C600 @ case 2 + .4byte _0809C600 @ case 3 + .4byte _0809C600 @ case 4 + .4byte _0809C6B8 @ case 5 + .4byte _0809C7B4 @ case 6 + .4byte _0809C7D2 @ case 7 +_0809C600: + ldr r0, [r5, #0x50] + adds r1, r5, #0 + bl SortEntityBelow + ldr r0, [r5, #0x50] + ldrb r0, [r0, #0xd] + adds r6, r5, #0 + adds r6, #0x84 + cmp r0, #6 + bne _0809C630 + movs r0, #0xf + ldrsb r0, [r5, r0] + cmp r0, #0 + bge _0809C624 + ldr r0, [r6] + ldrb r0, [r0] + rsbs r0, r0, #0 + b _0809C628 +_0809C624: + ldr r0, [r6] + ldrb r0, [r0] +_0809C628: + strb r0, [r5, #0xf] + adds r0, r5, #0 + bl sub_0809CBE4 +_0809C630: + ldr r4, [r5, #0x50] + adds r0, r4, #0 + adds r0, #0x76 + ldrh r1, [r0] + movs r0, #0x80 + lsls r0, r0, #9 + bl __divsi3 + adds r3, r0, #0 + lsls r0, r3, #0xd + lsrs r3, r0, #8 + ldr r0, _0809C660 @ =0xFFFFE000 + adds r3, r3, r0 + ldr r0, [r6] + ldr r0, [r0, #8] + adds r0, #0x45 + ldrb r0, [r0] + cmp r0, #1 + bne _0809C664 + movs r1, #0x88 + lsls r1, r1, #6 + adds r3, r3, r1 + b _0809C66C + .align 2, 0 +_0809C660: .4byte 0xFFFFE000 +_0809C664: + lsrs r0, r3, #1 + movs r1, #0x88 + lsls r1, r1, #6 + adds r3, r0, r1 +_0809C66C: + adds r2, r4, #0 + adds r2, #0x7b + ldr r1, _0809C6B0 @ =gUnk_08123E18 + ldrb r0, [r5, #0xa] + subs r0, #1 + adds r0, r0, r1 + ldrb r0, [r0] + ldrb r2, [r2] + adds r0, r0, r2 + rsbs r0, r0, #0 + lsls r0, r0, #0x18 + lsrs r1, r0, #0x18 + adds r0, r5, #0 + adds r2, r3, #0 + bl sub_0809CB70 + ldr r2, [r5, #0x50] + adds r2, #0x7b + ldr r1, _0809C6B4 @ =gUnk_08123E1C + ldrb r0, [r5, #0xa] + subs r0, #1 + adds r0, r0, r1 + ldrb r1, [r0] + ldrb r2, [r2] + adds r1, r1, r2 + adds r0, r5, #0 + adds r0, #0x79 + ldrb r0, [r0] + adds r0, r0, r1 + adds r1, r5, #0 + adds r1, #0x7b + strb r0, [r1] + b _0809C7BC + .align 2, 0 +_0809C6B0: .4byte gUnk_08123E18 +_0809C6B4: .4byte gUnk_08123E1C +_0809C6B8: + ldr r0, [r5, #0x50] + adds r1, r5, #0 + bl SortEntityBelow + ldr r0, [r5, #0x50] + ldrb r0, [r0, #0xd] + adds r6, r5, #0 + adds r6, #0x79 + adds r7, r5, #0 + adds r7, #0x76 + cmp r0, #4 + beq _0809C6F6 + adds r0, r5, #0 + adds r0, #0x45 + ldrb r0, [r0] + cmp r0, #1 + beq _0809C6F6 + ldrb r0, [r6] + cmp r0, #0x1c + bls _0809C6E4 + subs r0, #1 + strb r0, [r6] +_0809C6E4: + ldrh r0, [r7] + movs r1, #0x80 + lsls r1, r1, #1 + cmp r0, r1 + bls _0809C6F4 + subs r0, #1 + strh r0, [r7] + b _0809C6F6 +_0809C6F4: + strh r1, [r7] +_0809C6F6: + ldr r4, [r5, #0x50] + adds r0, r4, #0 + adds r0, #0x74 + ldrh r1, [r0] + movs r0, #0x80 + lsls r0, r0, #9 + bl __divsi3 + adds r3, r0, #0 + ldrb r0, [r6] + lsls r0, r0, #8 + muls r0, r3, r0 + lsrs r3, r0, #8 + adds r4, #0x7b + ldrb r0, [r4] + adds r0, #0x80 + rsbs r0, r0, #0 + lsls r0, r0, #0x18 + lsrs r1, r0, #0x18 + adds r0, r5, #0 + adds r2, r3, #0 + bl sub_0809CB70 + ldr r0, [r5, #0x50] + adds r0, #0x7b + ldrb r0, [r0] + adds r1, r5, #0 + adds r1, #0x7b + strb r0, [r1] + ldrh r1, [r7] + adds r0, r5, #0 + adds r0, #0x74 + b _0809C7C4 +_0809C738: + movs r0, #0x37 + bl CheckFlags + cmp r0, #0 + beq _0809C74A + adds r0, r5, #0 + movs r1, #0x1e + bl RequestPriorityDuration +_0809C74A: + ldr r1, _0809C7A8 @ =FrozenOctorok_Action1SubActions + ldrb r0, [r5, #0xd] + lsls r0, r0, #2 + adds r0, r0, r1 + ldr r1, [r0] + adds r0, r5, #0 + bl _call_via_r1 + ldrb r0, [r5, #0xf] + cmp r0, #0 + beq _0809C7BC + ldr r0, _0809C7AC @ =gRoomTransition + ldr r0, [r0] + movs r1, #7 + ands r0, r1 + cmp r0, #0 + bne _0809C772 + ldr r0, [r5, #0x54] + bl CreateSparkle +_0809C772: + adds r3, r5, #0 + adds r3, #0x7e + ldrh r0, [r3] + cmp r0, #0 + beq _0809C7BC + ldr r2, [r5, #0x54] + movs r1, #0 + ldrsh r0, [r3, r1] + ldr r1, [r2, #0x20] + subs r1, r1, r0 + str r1, [r2, #0x20] + ldr r0, [r2, #0x34] + adds r0, r0, r1 + str r0, [r2, #0x34] + ldr r0, [r5, #0x54] + ldr r1, [r0, #0x20] + movs r0, #0xc0 + lsls r0, r0, #6 + cmp r1, r0 + beq _0809C7A0 + ldr r0, _0809C7B0 @ =0xFFFFD000 + cmp r1, r0 + bne _0809C7BC +_0809C7A0: + ldrh r0, [r3] + rsbs r0, r0, #0 + strh r0, [r3] + b _0809C7BC + .align 2, 0 +_0809C7A8: .4byte FrozenOctorok_Action1SubActions +_0809C7AC: .4byte gRoomTransition +_0809C7B0: .4byte 0xFFFFD000 +_0809C7B4: + ldr r0, [r5, #0x50] + adds r1, r5, #0 + bl CopyPosition +_0809C7BC: + adds r0, r5, #0 + adds r0, #0x76 + ldrh r1, [r0] + subs r0, #2 +_0809C7C4: + ldrh r2, [r0] + adds r0, #6 + ldrh r3, [r0] + adds r0, r5, #0 + bl sub_0805EC9C + b _0809C7DE +_0809C7D2: + ldr r0, _0809C7E0 @ =gRoomControls + ldr r0, [r0, #0x30] + cmp r0, r5 + beq _0809C7DE + bl DeleteThisEntity +_0809C7DE: + pop {r4, r5, r6, r7, pc} + .align 2, 0 +_0809C7E0: .4byte gRoomControls + .syntax divided diff --git a/asm/non_matching/frozenOctorok/FrozenOctorok_Action1SubAction5.inc b/asm/non_matching/frozenOctorok/FrozenOctorok_Action1SubAction5.inc new file mode 100644 index 00000000..b5be2bc9 --- /dev/null +++ b/asm/non_matching/frozenOctorok/FrozenOctorok_Action1SubAction5.inc @@ -0,0 +1,122 @@ + .syntax unified + push {r4, r5, r6, r7, lr} + adds r4, r0, #0 + ldr r0, _0809CA04 @ =gRoomTransition + ldr r1, [r0] + movs r2, #2 + ands r1, r2 + adds r7, r0, #0 + cmp r1, #0 + beq _0809CA08 + adds r2, r4, #0 + adds r2, #0x84 + ldr r0, [r2] + ldr r1, [r0, #8] + adds r1, #0x76 + ldrh r0, [r1] + subs r0, #8 + b _0809CA16 + .align 2, 0 +_0809CA04: .4byte gRoomTransition +_0809CA08: + adds r2, r4, #0 + adds r2, #0x84 + ldr r0, [r2] + ldr r1, [r0, #8] + adds r1, #0x76 + ldrh r0, [r1] + adds r0, #8 +_0809CA16: + strh r0, [r1] + adds r5, r2, #0 + ldr r0, [r7] + movs r6, #3 + ands r0, r6 + cmp r0, #0 + bne _0809CA30 + adds r0, r4, #0 + movs r1, #0x87 + movs r2, #2 + movs r3, #0 + bl CreateObjectWithParent +_0809CA30: + adds r2, r4, #0 + adds r2, #0x79 + ldrb r0, [r2] + adds r1, r0, #0 + cmp r1, #0 + bne _0809CA92 + ldr r0, [r4, #0x54] + adds r0, #0x62 + strb r1, [r0] + ldr r0, [r4, #0x54] + movs r1, #0x80 + lsls r1, r1, #2 + adds r2, #2 + ldrb r2, [r2] + rsbs r2, r2, #0 + bl LinearMoveAngle + ldr r1, [r4, #0x54] + adds r0, r4, #0 + movs r2, #0x48 + bl sub_0806FC80 + cmp r0, #0 + beq _0809CAC4 + movs r0, #6 + strb r0, [r4, #0xd] + movs r1, #0 + movs r0, #0xc0 + strh r0, [r4, #0x24] + strb r1, [r4, #0xb] + strb r1, [r4, #0xf] + ldr r2, [r4, #0x54] + ldrb r1, [r2, #0x18] + subs r0, #0xc4 + ands r0, r1 + strb r0, [r2, #0x18] + ldr r0, [r5] + ldr r0, [r0, #8] + adds r0, #0x76 + movs r1, #0x80 + lsls r1, r1, #1 + strh r1, [r0] + ldr r1, [r5] + movs r0, #1 + strb r0, [r1] + movs r0, #0xed + bl SoundReq + b _0809CAC4 +_0809CA92: + subs r0, #1 + strb r0, [r2] + ldr r0, [r7] + ands r0, r6 + cmp r0, #1 + beq _0809CAB4 + cmp r0, #1 + blo _0809CAAC + cmp r0, #2 + beq _0809CAAC + cmp r0, #3 + beq _0809CABC + b _0809CAC4 +_0809CAAC: + ldr r0, [r4, #0x54] + adds r0, #0x62 + movs r1, #0 + b _0809CAC2 +_0809CAB4: + ldr r0, [r4, #0x54] + adds r0, #0x62 + movs r1, #0xfc + b _0809CAC2 +_0809CABC: + ldr r0, [r4, #0x54] + adds r0, #0x62 + movs r1, #4 +_0809CAC2: + strb r1, [r0] +_0809CAC4: + pop {r4, r5, r6, r7, pc} + .align 2, 0 + .syntax divided diff --git a/asm/non_matching/frozenOctorok/FrozenOctorok_Init.inc b/asm/non_matching/frozenOctorok/FrozenOctorok_Init.inc new file mode 100644 index 00000000..07fe19c3 --- /dev/null +++ b/asm/non_matching/frozenOctorok/FrozenOctorok_Init.inc @@ -0,0 +1,236 @@ + .syntax unified + push {r4, r5, r6, r7, lr} + mov r7, r8 + push {r7} + adds r4, r0, #0 + movs r0, #1 + strb r0, [r4, #0xc] + ldrb r0, [r4, #0xa] + cmp r0, #7 + bls _0809C400 + b _0809C5A4 +_0809C400: + lsls r0, r0, #2 + ldr r1, _0809C40C @ =_0809C410 + adds r0, r0, r1 + ldr r0, [r0] + mov pc, r0 + .align 2, 0 +_0809C40C: .4byte _0809C410 +_0809C410: @ jump table + .4byte _0809C430 @ case 0 + .4byte _0809C53E @ case 1 + .4byte _0809C53E @ case 2 + .4byte _0809C53E @ case 3 + .4byte _0809C53E @ case 4 + .4byte _0809C586 @ case 5 + .4byte _0809C440 @ case 6 + .4byte _0809C5BA @ case 7 +_0809C430: + adds r0, r4, #0 + movs r1, #6 + bl SetDefaultPriority + adds r1, r4, #0 + adds r1, #0x7e + movs r0, #0 + strh r0, [r1] +_0809C440: + movs r0, #1 + strb r0, [r4, #0xe] + movs r0, #0x10 + strb r0, [r4, #0x15] + adds r1, r4, #0 + adds r1, #0x79 + movs r0, #0xf0 + strb r0, [r1] + ldr r1, _0809C4B4 @ =gRoomControls + movs r2, #0x84 + lsls r2, r2, #1 + adds r0, r2, #0 + ldrh r2, [r1, #6] + adds r0, r0, r2 + strh r0, [r4, #0x2e] + movs r2, #0xb4 + lsls r2, r2, #1 + adds r0, r2, #0 + ldrh r1, [r1, #8] + adds r0, r0, r1 + strh r0, [r4, #0x32] + ldrb r0, [r4, #0x19] + movs r1, #3 + orrs r0, r1 + strb r0, [r4, #0x19] + adds r0, r4, #0 + adds r0, #0x76 + movs r1, #0xa0 + strh r1, [r0] + subs r0, #2 + strh r1, [r0] + adds r1, r4, #0 + adds r1, #0x7b + movs r0, #0x80 + strb r0, [r1] + ldrb r0, [r4, #0xa] + cmp r0, #0 + bne _0809C52E + subs r1, #0x19 + movs r0, #0x29 + strb r0, [r1] + adds r1, #1 + movs r0, #0xe0 + strb r0, [r1] + movs r0, #0x30 + bl zMalloc + adds r2, r0, #0 + adds r0, r4, #0 + adds r0, #0x84 + str r2, [r0] + mov r8, r0 + cmp r2, #0 + bne _0809C4B8 + bl DeleteThisEntity + b _0809C5BA + .align 2, 0 +_0809C4B4: .4byte gRoomControls +_0809C4B8: + str r2, [r4, #0x64] + mov r0, r8 + ldr r1, [r0] + movs r0, #5 + strb r0, [r1, #1] + movs r5, #0 + mov r7, r8 +_0809C4C6: + adds r6, r5, #1 + adds r0, r4, #0 + movs r1, #0x91 + adds r2, r6, #0 + movs r3, #0 + bl CreateObjectWithParent + str r0, [r4, #0x54] + cmp r0, #0 + beq _0809C4EE + adds r1, r0, #0 + adds r1, #0x84 + ldr r0, [r7] + str r0, [r1] + ldr r1, [r7] + lsls r0, r5, #2 + adds r1, #0x20 + adds r1, r1, r0 + ldr r0, [r4, #0x54] + str r0, [r1] +_0809C4EE: + adds r5, r6, #0 + cmp r5, #3 + bls _0809C4C6 + adds r0, r4, #0 + movs r1, #0x91 + movs r2, #5 + movs r3, #0 + bl CreateObjectWithParent + str r0, [r4, #0x54] + cmp r0, #0 + beq _0809C510 + adds r1, r0, #0 + adds r1, #0x84 + mov r2, r8 + ldr r0, [r2] + str r0, [r1] +_0809C510: + adds r0, r4, #0 + movs r1, #0x91 + movs r2, #6 + movs r3, #0 + bl CreateObjectWithParent + str r0, [r4, #0x50] + cmp r0, #0 + beq _0809C5A4 + adds r1, r0, #0 + adds r1, #0x84 + mov r2, r8 + ldr r0, [r2] + str r0, [r1] + b _0809C5A4 +_0809C52E: + adds r1, r4, #0 + adds r1, #0x62 + movs r0, #0xd7 + strb r0, [r1] + adds r1, #1 + movs r0, #0xe0 + strb r0, [r1] + b _0809C5A4 +_0809C53E: + movs r1, #0 + movs r0, #0x10 + strb r0, [r4, #0xe] + adds r0, r4, #0 + adds r0, #0x79 + strb r1, [r0] + ldrb r1, [r4, #0xa] + movs r2, #2 + adds r0, r2, #0 + ands r0, r1 + cmp r0, #0 + bne _0809C55A + strb r2, [r4, #0xf] + b _0809C55E +_0809C55A: + movs r0, #0xfe + strb r0, [r4, #0xf] +_0809C55E: + adds r0, r4, #0 + adds r0, #0x74 + movs r2, #0x80 + lsls r2, r2, #1 + strh r2, [r0] + ldrb r1, [r4, #0xa] + movs r0, #1 + ands r0, r1 + cmp r0, #0 + bne _0809C57E + adds r1, r4, #0 + adds r1, #0x76 + movs r0, #0xff + lsls r0, r0, #8 + strh r0, [r1] + b _0809C5A4 +_0809C57E: + adds r0, r4, #0 + adds r0, #0x76 + strh r2, [r0] + b _0809C5A4 +_0809C586: + adds r0, r4, #0 + adds r0, #0x76 + movs r1, #0x80 + lsls r1, r1, #1 + strh r1, [r0] + subs r0, #2 + strh r1, [r0] + adds r1, r4, #0 + adds r1, #0x79 + movs r0, #0x1c + strb r0, [r1] + adds r0, r4, #0 + adds r0, #0x84 + ldr r0, [r0] + str r4, [r0, #8] +_0809C5A4: + ldr r0, _0809C5C0 @ =gUnk_08123DDC + ldrb r1, [r4, #0xa] + lsls r1, r1, #2 + adds r1, r1, r0 + ldrb r1, [r1] + adds r0, r4, #0 + bl InitializeAnimation + adds r0, r4, #0 + bl FrozenOctorok_Action1 +_0809C5BA: + pop {r3} + mov r8, r3 + pop {r4, r5, r6, r7, pc} + .align 2, 0 +_0809C5C0: .4byte gUnk_08123DDC + .syntax divided diff --git a/asm/non_matching/frozenOctorok/sub_0809CBE4.inc b/asm/non_matching/frozenOctorok/sub_0809CBE4.inc new file mode 100644 index 00000000..eac592d4 --- /dev/null +++ b/asm/non_matching/frozenOctorok/sub_0809CBE4.inc @@ -0,0 +1,40 @@ + .syntax unified + push {r4, lr} + adds r2, r0, #0 + adds r3, r2, #0 + adds r3, #0x79 + ldrb r0, [r2, #0xf] + ldrb r4, [r3] + adds r1, r0, r4 + strb r1, [r3] + ldrb r4, [r2, #0xf] + movs r0, #0xf + ldrsb r0, [r2, r0] + cmp r0, #0 + bge _0809CC16 + ldrb r0, [r2, #0xe] + lsls r1, r1, #0x18 + lsls r0, r0, #0x18 + cmn r1, r0 + bge _0809CC2C + rsbs r0, r4, #0 + strb r0, [r2, #0xf] + movs r0, #0xcf + lsls r0, r0, #1 + bl SoundReq + b _0809CC2C +_0809CC16: + movs r0, #0 + ldrsb r0, [r3, r0] + ldrb r1, [r2, #0xe] + cmp r0, r1 + ble _0809CC2C + rsbs r0, r4, #0 + strb r0, [r2, #0xf] + movs r0, #0xcf + lsls r0, r0, #1 + bl SoundReq +_0809CC2C: + pop {r4, pc} + .align 2, 0 + .syntax divided diff --git a/asm/object/object90.s b/asm/object/object90.s deleted file mode 100644 index 277942fc..00000000 --- a/asm/object/object90.s +++ /dev/null @@ -1,41 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object90 -Object90: @ 0x0809C394 - push {lr} - ldr r2, _0809C3A8 @ =gUnk_08123DCC - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809C3A8: .4byte gUnk_08123DCC - - thumb_func_start sub_0809C3AC -sub_0809C3AC: @ 0x0809C3AC - movs r2, #0 - movs r1, #1 - strb r1, [r0, #0xc] - strb r2, [r0, #0x1e] - adds r0, #0x29 - ldrb r2, [r0] - subs r1, #9 - ands r1, r2 - movs r2, #5 - orrs r1, r2 - strb r1, [r0] - bx lr - - thumb_func_start nullsub_536 -nullsub_536: @ 0x0809C3C4 - bx lr - .align 2, 0 diff --git a/asm/object/object91.s b/asm/object/object91.s deleted file mode 100644 index f4fed50e..00000000 --- a/asm/object/object91.s +++ /dev/null @@ -1,1129 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object91 -Object91: @ 0x0809C3C8 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0809C3E8 @ =gUnk_08123DD4 - ldrb r0, [r4, #0xc] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - ldrb r0, [r4, #0x19] - movs r1, #0xc0 - orrs r0, r1 - strb r0, [r4, #0x19] - pop {r4, pc} - .align 2, 0 -_0809C3E8: .4byte gUnk_08123DD4 - - thumb_func_start sub_0809C3EC -sub_0809C3EC: @ 0x0809C3EC - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r0, [r4, #0xa] - cmp r0, #7 - bls _0809C400 - b _0809C5A4 -_0809C400: - lsls r0, r0, #2 - ldr r1, _0809C40C @ =_0809C410 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809C40C: .4byte _0809C410 -_0809C410: @ jump table - .4byte _0809C430 @ case 0 - .4byte _0809C53E @ case 1 - .4byte _0809C53E @ case 2 - .4byte _0809C53E @ case 3 - .4byte _0809C53E @ case 4 - .4byte _0809C586 @ case 5 - .4byte _0809C440 @ case 6 - .4byte _0809C5BA @ case 7 -_0809C430: - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority - adds r1, r4, #0 - adds r1, #0x7e - movs r0, #0 - strh r0, [r1] -_0809C440: - movs r0, #1 - strb r0, [r4, #0xe] - movs r0, #0x10 - strb r0, [r4, #0x15] - adds r1, r4, #0 - adds r1, #0x79 - movs r0, #0xf0 - strb r0, [r1] - ldr r1, _0809C4B4 @ =gRoomControls - movs r2, #0x84 - lsls r2, r2, #1 - adds r0, r2, #0 - ldrh r2, [r1, #6] - adds r0, r0, r2 - strh r0, [r4, #0x2e] - movs r2, #0xb4 - lsls r2, r2, #1 - adds r0, r2, #0 - ldrh r1, [r1, #8] - adds r0, r0, r1 - strh r0, [r4, #0x32] - ldrb r0, [r4, #0x19] - movs r1, #3 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r0, r4, #0 - adds r0, #0x76 - movs r1, #0xa0 - strh r1, [r0] - subs r0, #2 - strh r1, [r0] - adds r1, r4, #0 - adds r1, #0x7b - movs r0, #0x80 - strb r0, [r1] - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _0809C52E - subs r1, #0x19 - movs r0, #0x29 - strb r0, [r1] - adds r1, #1 - movs r0, #0xe0 - strb r0, [r1] - movs r0, #0x30 - bl zMalloc - adds r2, r0, #0 - adds r0, r4, #0 - adds r0, #0x84 - str r2, [r0] - mov r8, r0 - cmp r2, #0 - bne _0809C4B8 - bl DeleteThisEntity - b _0809C5BA - .align 2, 0 -_0809C4B4: .4byte gRoomControls -_0809C4B8: - str r2, [r4, #0x64] - mov r0, r8 - ldr r1, [r0] - movs r0, #5 - strb r0, [r1, #1] - movs r5, #0 - mov r7, r8 -_0809C4C6: - adds r6, r5, #1 - adds r0, r4, #0 - movs r1, #0x91 - adds r2, r6, #0 - movs r3, #0 - bl CreateObjectWithParent - str r0, [r4, #0x54] - cmp r0, #0 - beq _0809C4EE - adds r1, r0, #0 - adds r1, #0x84 - ldr r0, [r7] - str r0, [r1] - ldr r1, [r7] - lsls r0, r5, #2 - adds r1, #0x20 - adds r1, r1, r0 - ldr r0, [r4, #0x54] - str r0, [r1] -_0809C4EE: - adds r5, r6, #0 - cmp r5, #3 - bls _0809C4C6 - adds r0, r4, #0 - movs r1, #0x91 - movs r2, #5 - movs r3, #0 - bl CreateObjectWithParent - str r0, [r4, #0x54] - cmp r0, #0 - beq _0809C510 - adds r1, r0, #0 - adds r1, #0x84 - mov r2, r8 - ldr r0, [r2] - str r0, [r1] -_0809C510: - adds r0, r4, #0 - movs r1, #0x91 - movs r2, #6 - movs r3, #0 - bl CreateObjectWithParent - str r0, [r4, #0x50] - cmp r0, #0 - beq _0809C5A4 - adds r1, r0, #0 - adds r1, #0x84 - mov r2, r8 - ldr r0, [r2] - str r0, [r1] - b _0809C5A4 -_0809C52E: - adds r1, r4, #0 - adds r1, #0x62 - movs r0, #0xd7 - strb r0, [r1] - adds r1, #1 - movs r0, #0xe0 - strb r0, [r1] - b _0809C5A4 -_0809C53E: - movs r1, #0 - movs r0, #0x10 - strb r0, [r4, #0xe] - adds r0, r4, #0 - adds r0, #0x79 - strb r1, [r0] - ldrb r1, [r4, #0xa] - movs r2, #2 - adds r0, r2, #0 - ands r0, r1 - cmp r0, #0 - bne _0809C55A - strb r2, [r4, #0xf] - b _0809C55E -_0809C55A: - movs r0, #0xfe - strb r0, [r4, #0xf] -_0809C55E: - adds r0, r4, #0 - adds r0, #0x74 - movs r2, #0x80 - lsls r2, r2, #1 - strh r2, [r0] - ldrb r1, [r4, #0xa] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - bne _0809C57E - adds r1, r4, #0 - adds r1, #0x76 - movs r0, #0xff - lsls r0, r0, #8 - strh r0, [r1] - b _0809C5A4 -_0809C57E: - adds r0, r4, #0 - adds r0, #0x76 - strh r2, [r0] - b _0809C5A4 -_0809C586: - adds r0, r4, #0 - adds r0, #0x76 - movs r1, #0x80 - lsls r1, r1, #1 - strh r1, [r0] - subs r0, #2 - strh r1, [r0] - adds r1, r4, #0 - adds r1, #0x79 - movs r0, #0x1c - strb r0, [r1] - adds r0, r4, #0 - adds r0, #0x84 - ldr r0, [r0] - str r4, [r0, #8] -_0809C5A4: - ldr r0, _0809C5C0 @ =gUnk_08123DDC - ldrb r1, [r4, #0xa] - lsls r1, r1, #2 - adds r1, r1, r0 - ldrb r1, [r1] - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_0809C5C4 -_0809C5BA: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0809C5C0: .4byte gUnk_08123DDC - - thumb_func_start sub_0809C5C4 -sub_0809C5C4: @ 0x0809C5C4 - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xa] - cmp r0, #7 - bls _0809C5D0 - b _0809C7DE -_0809C5D0: - lsls r0, r0, #2 - ldr r1, _0809C5DC @ =_0809C5E0 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809C5DC: .4byte _0809C5E0 -_0809C5E0: @ jump table - .4byte _0809C738 @ case 0 - .4byte _0809C600 @ case 1 - .4byte _0809C600 @ case 2 - .4byte _0809C600 @ case 3 - .4byte _0809C600 @ case 4 - .4byte _0809C6B8 @ case 5 - .4byte _0809C7B4 @ case 6 - .4byte _0809C7D2 @ case 7 -_0809C600: - ldr r0, [r5, #0x50] - adds r1, r5, #0 - bl SortEntityBelow - ldr r0, [r5, #0x50] - ldrb r0, [r0, #0xd] - adds r6, r5, #0 - adds r6, #0x84 - cmp r0, #6 - bne _0809C630 - movs r0, #0xf - ldrsb r0, [r5, r0] - cmp r0, #0 - bge _0809C624 - ldr r0, [r6] - ldrb r0, [r0] - rsbs r0, r0, #0 - b _0809C628 -_0809C624: - ldr r0, [r6] - ldrb r0, [r0] -_0809C628: - strb r0, [r5, #0xf] - adds r0, r5, #0 - bl sub_0809CBE4 -_0809C630: - ldr r4, [r5, #0x50] - adds r0, r4, #0 - adds r0, #0x76 - ldrh r1, [r0] - movs r0, #0x80 - lsls r0, r0, #9 - bl __divsi3 - adds r3, r0, #0 - lsls r0, r3, #0xd - lsrs r3, r0, #8 - ldr r0, _0809C660 @ =0xFFFFE000 - adds r3, r3, r0 - ldr r0, [r6] - ldr r0, [r0, #8] - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #1 - bne _0809C664 - movs r1, #0x88 - lsls r1, r1, #6 - adds r3, r3, r1 - b _0809C66C - .align 2, 0 -_0809C660: .4byte 0xFFFFE000 -_0809C664: - lsrs r0, r3, #1 - movs r1, #0x88 - lsls r1, r1, #6 - adds r3, r0, r1 -_0809C66C: - adds r2, r4, #0 - adds r2, #0x7b - ldr r1, _0809C6B0 @ =gUnk_08123E18 - ldrb r0, [r5, #0xa] - subs r0, #1 - adds r0, r0, r1 - ldrb r0, [r0] - ldrb r2, [r2] - adds r0, r0, r2 - rsbs r0, r0, #0 - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - adds r0, r5, #0 - adds r2, r3, #0 - bl sub_0809CB70 - ldr r2, [r5, #0x50] - adds r2, #0x7b - ldr r1, _0809C6B4 @ =gUnk_08123E1C - ldrb r0, [r5, #0xa] - subs r0, #1 - adds r0, r0, r1 - ldrb r1, [r0] - ldrb r2, [r2] - adds r1, r1, r2 - adds r0, r5, #0 - adds r0, #0x79 - ldrb r0, [r0] - adds r0, r0, r1 - adds r1, r5, #0 - adds r1, #0x7b - strb r0, [r1] - b _0809C7BC - .align 2, 0 -_0809C6B0: .4byte gUnk_08123E18 -_0809C6B4: .4byte gUnk_08123E1C -_0809C6B8: - ldr r0, [r5, #0x50] - adds r1, r5, #0 - bl SortEntityBelow - ldr r0, [r5, #0x50] - ldrb r0, [r0, #0xd] - adds r6, r5, #0 - adds r6, #0x79 - adds r7, r5, #0 - adds r7, #0x76 - cmp r0, #4 - beq _0809C6F6 - adds r0, r5, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #1 - beq _0809C6F6 - ldrb r0, [r6] - cmp r0, #0x1c - bls _0809C6E4 - subs r0, #1 - strb r0, [r6] -_0809C6E4: - ldrh r0, [r7] - movs r1, #0x80 - lsls r1, r1, #1 - cmp r0, r1 - bls _0809C6F4 - subs r0, #1 - strh r0, [r7] - b _0809C6F6 -_0809C6F4: - strh r1, [r7] -_0809C6F6: - ldr r4, [r5, #0x50] - adds r0, r4, #0 - adds r0, #0x74 - ldrh r1, [r0] - movs r0, #0x80 - lsls r0, r0, #9 - bl __divsi3 - adds r3, r0, #0 - ldrb r0, [r6] - lsls r0, r0, #8 - muls r0, r3, r0 - lsrs r3, r0, #8 - adds r4, #0x7b - ldrb r0, [r4] - adds r0, #0x80 - rsbs r0, r0, #0 - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - adds r0, r5, #0 - adds r2, r3, #0 - bl sub_0809CB70 - ldr r0, [r5, #0x50] - adds r0, #0x7b - ldrb r0, [r0] - adds r1, r5, #0 - adds r1, #0x7b - strb r0, [r1] - ldrh r1, [r7] - adds r0, r5, #0 - adds r0, #0x74 - b _0809C7C4 -_0809C738: - movs r0, #0x37 - bl CheckFlags - cmp r0, #0 - beq _0809C74A - adds r0, r5, #0 - movs r1, #0x1e - bl RequestPriorityDuration -_0809C74A: - ldr r1, _0809C7A8 @ =gUnk_08123DF8 - ldrb r0, [r5, #0xd] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r5, #0 - bl _call_via_r1 - ldrb r0, [r5, #0xf] - cmp r0, #0 - beq _0809C7BC - ldr r0, _0809C7AC @ =gRoomTransition - ldr r0, [r0] - movs r1, #7 - ands r0, r1 - cmp r0, #0 - bne _0809C772 - ldr r0, [r5, #0x54] - bl CreateSparkle -_0809C772: - adds r3, r5, #0 - adds r3, #0x7e - ldrh r0, [r3] - cmp r0, #0 - beq _0809C7BC - ldr r2, [r5, #0x54] - movs r1, #0 - ldrsh r0, [r3, r1] - ldr r1, [r2, #0x20] - subs r1, r1, r0 - str r1, [r2, #0x20] - ldr r0, [r2, #0x34] - adds r0, r0, r1 - str r0, [r2, #0x34] - ldr r0, [r5, #0x54] - ldr r1, [r0, #0x20] - movs r0, #0xc0 - lsls r0, r0, #6 - cmp r1, r0 - beq _0809C7A0 - ldr r0, _0809C7B0 @ =0xFFFFD000 - cmp r1, r0 - bne _0809C7BC -_0809C7A0: - ldrh r0, [r3] - rsbs r0, r0, #0 - strh r0, [r3] - b _0809C7BC - .align 2, 0 -_0809C7A8: .4byte gUnk_08123DF8 -_0809C7AC: .4byte gRoomTransition -_0809C7B0: .4byte 0xFFFFD000 -_0809C7B4: - ldr r0, [r5, #0x50] - adds r1, r5, #0 - bl CopyPosition -_0809C7BC: - adds r0, r5, #0 - adds r0, #0x76 - ldrh r1, [r0] - subs r0, #2 -_0809C7C4: - ldrh r2, [r0] - adds r0, #6 - ldrh r3, [r0] - adds r0, r5, #0 - bl sub_0805EC9C - b _0809C7DE -_0809C7D2: - ldr r0, _0809C7E0 @ =gRoomControls - ldr r0, [r0, #0x30] - cmp r0, r5 - beq _0809C7DE - bl DeleteThisEntity -_0809C7DE: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0809C7E0: .4byte gRoomControls - - thumb_func_start sub_0809C7E4 -sub_0809C7E4: @ 0x0809C7E4 - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xf] - cmp r0, #0 - beq _0809C84A - adds r3, r5, #0 - adds r3, #0x7e - ldrh r0, [r3] - cmp r0, #0 - bne _0809C82A - ldr r2, [r5, #0x54] - movs r0, #0x36 - ldrsh r1, [r2, r0] - movs r0, #0x10 - rsbs r0, r0, #0 - cmp r1, r0 - ble _0809C814 - ldr r0, [r2, #0x34] - ldr r1, _0809C810 @ =0xFFFFC000 - adds r0, r0, r1 - str r0, [r2, #0x34] - b _0809C82A - .align 2, 0 -_0809C810: .4byte 0xFFFFC000 -_0809C814: - ldr r0, [r2, #0x34] - ldr r1, _0809C84C @ =0xFFFFF000 - adds r0, r0, r1 - str r0, [r2, #0x34] - ldr r1, [r5, #0x54] - movs r0, #0xc0 - lsls r0, r0, #6 - str r0, [r1, #0x20] - movs r0, #0x80 - lsls r0, r0, #2 - strh r0, [r3] -_0809C82A: - adds r4, r5, #0 - adds r4, #0x79 - ldrb r0, [r4] - subs r0, #1 - strb r0, [r4] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _0809C84A - ldr r0, _0809C850 @ =0x00000B43 - bl MessageFromTarget - movs r0, #1 - strb r0, [r5, #0xd] - movs r0, #8 - strb r0, [r4] -_0809C84A: - pop {r4, r5, pc} - .align 2, 0 -_0809C84C: .4byte 0xFFFFF000 -_0809C850: .4byte 0x00000B43 - - thumb_func_start sub_0809C854 -sub_0809C854: @ 0x0809C854 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, _0809C8A8 @ =gMessage - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _0809C8B8 - adds r5, r4, #0 - adds r5, #0x79 - ldrb r0, [r5] - subs r0, #1 - strb r0, [r5] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _0809C8B8 - adds r0, r4, #0 - movs r1, #0x91 - movs r2, #7 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0809C892 - ldrh r0, [r1, #0x32] - subs r0, #0x50 - strh r0, [r1, #0x32] - ldr r0, _0809C8AC @ =gRoomControls - str r1, [r0, #0x30] -_0809C892: - ldrb r0, [r4, #0xf] - cmp r0, #2 - bhi _0809C8B0 - movs r0, #2 - strb r0, [r4, #0xd] - movs r0, #0x1e - strb r0, [r5] - movs r0, #0xe6 - bl SoundReq - b _0809C8B8 - .align 2, 0 -_0809C8A8: .4byte gMessage -_0809C8AC: .4byte gRoomControls -_0809C8B0: - movs r0, #3 - strb r0, [r4, #0xd] - movs r0, #0x78 - strb r0, [r5] -_0809C8B8: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0809C8BC -sub_0809C8BC: @ 0x0809C8BC - push {lr} - adds r2, r0, #0 - adds r3, r2, #0 - adds r3, #0x79 - ldrb r0, [r3] - subs r1, r0, #1 - strb r1, [r3] - lsls r0, r1, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _0809C8E2 - movs r0, #1 - strb r0, [r2, #0xd] - movs r0, #0x1e - strb r0, [r3] - ldrb r0, [r2, #0xf] - adds r0, #1 - strb r0, [r2, #0xf] - b _0809C922 -_0809C8E2: - movs r0, #3 - ands r0, r1 - cmp r0, #1 - beq _0809C90A - cmp r0, #1 - bgt _0809C8F4 - cmp r0, #0 - beq _0809C8FE - b _0809C922 -_0809C8F4: - cmp r0, #2 - beq _0809C8FE - cmp r0, #3 - beq _0809C916 - b _0809C922 -_0809C8FE: - ldrh r1, [r2, #0x2e] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r1 - adds r0, #8 - b _0809C920 -_0809C90A: - ldrh r1, [r2, #0x2e] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - adds r0, #4 - b _0809C920 -_0809C916: - ldrh r1, [r2, #0x2e] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - subs r0, #4 -_0809C920: - strh r0, [r2, #0x2e] -_0809C922: - pop {pc} - - thumb_func_start sub_0809C924 -sub_0809C924: @ 0x0809C924 - push {r4, r5, lr} - adds r5, r0, #0 - adds r1, r5, #0 - adds r1, #0x79 - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - beq _0809C948 - adds r0, r5, #0 - movs r1, #0x87 - movs r2, #6 - movs r3, #0 - bl CreateObjectWithParent - b _0809C980 -_0809C948: - movs r0, #4 - strb r0, [r5, #0xd] - movs r0, #0x3c - strb r0, [r1] - ldr r4, _0809C984 @ =0x00000115 - adds r0, r5, #0 - adds r1, r4, #0 - bl LoadFixedGFX - ldr r0, [r5, #0x50] - adds r1, r4, #0 - bl LoadFixedGFX - adds r0, r5, #0 - movs r1, #0xef - bl ChangeObjPalette - ldr r0, [r5, #0x50] - movs r1, #0xef - bl ChangeObjPalette - adds r0, r5, #0 - movs r1, #0xef - bl sub_0809CC30 - movs r0, #0xe8 - bl SoundReq -_0809C980: - pop {r4, r5, pc} - .align 2, 0 -_0809C984: .4byte 0x00000115 - - thumb_func_start sub_0809C988 -sub_0809C988: @ 0x0809C988 - push {lr} - adds r2, r0, #0 - adds r1, r2, #0 - adds r1, #0x79 - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _0809C9AC - movs r0, #5 - strb r0, [r2, #0xd] - movs r0, #0xb4 - strb r0, [r1] - movs r0, #3 - strb r0, [r2, #0xb] - b _0809C9DC -_0809C9AC: - ldr r0, _0809C9C8 @ =gRoomTransition - ldr r0, [r0] - movs r1, #8 - ands r0, r1 - cmp r0, #0 - beq _0809C9CC - adds r0, r2, #0 - adds r0, #0x84 - ldr r0, [r0] - ldr r1, [r0, #8] - adds r1, #0x76 - ldrh r0, [r1] - subs r0, #4 - b _0809C9DA - .align 2, 0 -_0809C9C8: .4byte gRoomTransition -_0809C9CC: - adds r0, r2, #0 - adds r0, #0x84 - ldr r0, [r0] - ldr r1, [r0, #8] - adds r1, #0x76 - ldrh r0, [r1] - adds r0, #4 -_0809C9DA: - strh r0, [r1] -_0809C9DC: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0809C9E0 -sub_0809C9E0: @ 0x0809C9E0 - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - ldr r0, _0809CA04 @ =gRoomTransition - ldr r1, [r0] - movs r2, #2 - ands r1, r2 - adds r7, r0, #0 - cmp r1, #0 - beq _0809CA08 - adds r2, r4, #0 - adds r2, #0x84 - ldr r0, [r2] - ldr r1, [r0, #8] - adds r1, #0x76 - ldrh r0, [r1] - subs r0, #8 - b _0809CA16 - .align 2, 0 -_0809CA04: .4byte gRoomTransition -_0809CA08: - adds r2, r4, #0 - adds r2, #0x84 - ldr r0, [r2] - ldr r1, [r0, #8] - adds r1, #0x76 - ldrh r0, [r1] - adds r0, #8 -_0809CA16: - strh r0, [r1] - adds r5, r2, #0 - ldr r0, [r7] - movs r6, #3 - ands r0, r6 - cmp r0, #0 - bne _0809CA30 - adds r0, r4, #0 - movs r1, #0x87 - movs r2, #2 - movs r3, #0 - bl CreateObjectWithParent -_0809CA30: - adds r2, r4, #0 - adds r2, #0x79 - ldrb r0, [r2] - adds r1, r0, #0 - cmp r1, #0 - bne _0809CA92 - ldr r0, [r4, #0x54] - adds r0, #0x62 - strb r1, [r0] - ldr r0, [r4, #0x54] - movs r1, #0x80 - lsls r1, r1, #2 - adds r2, #2 - ldrb r2, [r2] - rsbs r2, r2, #0 - bl LinearMoveAngle - ldr r1, [r4, #0x54] - adds r0, r4, #0 - movs r2, #0x48 - bl sub_0806FC80 - cmp r0, #0 - beq _0809CAC4 - movs r0, #6 - strb r0, [r4, #0xd] - movs r1, #0 - movs r0, #0xc0 - strh r0, [r4, #0x24] - strb r1, [r4, #0xb] - strb r1, [r4, #0xf] - ldr r2, [r4, #0x54] - ldrb r1, [r2, #0x18] - subs r0, #0xc4 - ands r0, r1 - strb r0, [r2, #0x18] - ldr r0, [r5] - ldr r0, [r0, #8] - adds r0, #0x76 - movs r1, #0x80 - lsls r1, r1, #1 - strh r1, [r0] - ldr r1, [r5] - movs r0, #1 - strb r0, [r1] - movs r0, #0xed - bl SoundReq - b _0809CAC4 -_0809CA92: - subs r0, #1 - strb r0, [r2] - ldr r0, [r7] - ands r0, r6 - cmp r0, #1 - beq _0809CAB4 - cmp r0, #1 - blo _0809CAAC - cmp r0, #2 - beq _0809CAAC - cmp r0, #3 - beq _0809CABC - b _0809CAC4 -_0809CAAC: - ldr r0, [r4, #0x54] - adds r0, #0x62 - movs r1, #0 - b _0809CAC2 -_0809CAB4: - ldr r0, [r4, #0x54] - adds r0, #0x62 - movs r1, #0xfc - b _0809CAC2 -_0809CABC: - ldr r0, [r4, #0x54] - adds r0, #0x62 - movs r1, #4 -_0809CAC2: - strb r1, [r0] -_0809CAC4: - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_0809CAC8 -sub_0809CAC8: @ 0x0809CAC8 - push {r4, r5, lr} - adds r5, r0, #0 - bl LinearMoveUpdate - ldr r2, _0809CB3C @ =gRoomControls - ldrh r0, [r2, #8] - movs r1, #0xe4 - lsls r1, r1, #1 - adds r0, r0, r1 - movs r3, #0x32 - ldrsh r1, [r5, r3] - cmp r0, r1 - bge _0809CB26 - movs r0, #4 - strb r0, [r2, #0xe] - ldr r0, _0809CB40 @ =gPlayerEntity - str r0, [r2, #0x30] - movs r0, #0x9b - bl SetLocalFlag - ldr r0, [r5, #0x50] - bl DeleteEntity - adds r4, r5, #0 - adds r4, #0x84 - ldr r0, [r4] - ldr r0, [r0, #8] - bl DeleteEntity - ldr r0, [r4] - ldr r0, [r0, #0x20] - bl DeleteEntity - ldr r0, [r4] - ldr r0, [r0, #0x24] - bl DeleteEntity - ldr r0, [r4] - ldr r0, [r0, #0x28] - bl DeleteEntity - ldr r0, [r4] - ldr r0, [r0, #0x2c] - bl DeleteEntity - movs r0, #7 - strb r0, [r5, #0xd] -_0809CB26: - ldr r0, _0809CB44 @ =gRoomTransition - ldr r0, [r0] - movs r1, #0xf - ands r0, r1 - cmp r0, #0 - bne _0809CB38 - ldr r0, _0809CB48 @ =0x00000163 - bl SoundReq -_0809CB38: - pop {r4, r5, pc} - .align 2, 0 -_0809CB3C: .4byte gRoomControls -_0809CB40: .4byte gPlayerEntity -_0809CB44: .4byte gRoomTransition -_0809CB48: .4byte 0x00000163 - - thumb_func_start sub_0809CB4C -sub_0809CB4C: @ 0x0809CB4C - push {lr} - ldr r0, _0809CB68 @ =gRoomControls - ldrb r1, [r0, #0xf] - movs r0, #4 - ands r0, r1 - cmp r0, #0 - bne _0809CB66 - ldr r0, _0809CB6C @ =0x00000B44 - movs r1, #0 - bl CreateEzloHint - bl DeleteThisEntity -_0809CB66: - pop {pc} - .align 2, 0 -_0809CB68: .4byte gRoomControls -_0809CB6C: .4byte 0x00000B44 - - thumb_func_start sub_0809CB70 -sub_0809CB70: @ 0x0809CB70 - push {r4, r5, r6, lr} - mov r6, sb - mov r5, r8 - push {r5, r6} - adds r6, r0, #0 - adds r4, r1, #0 - adds r5, r2, #0 - ldr r0, _0809CBE0 @ =gSineTable - mov sb, r0 - lsls r0, r4, #1 - add r0, sb - movs r1, #0 - ldrsh r0, [r0, r1] - lsls r5, r5, #0x10 - asrs r5, r5, #0x10 - adds r1, r5, #0 - bl FixedMul - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r1, #0x80 - lsls r1, r1, #1 - mov r8, r1 - bl FixedDiv - ldr r1, [r6, #0x50] - lsls r0, r0, #0x10 - asrs r0, r0, #8 - ldr r1, [r1, #0x2c] - adds r1, r1, r0 - str r1, [r6, #0x2c] - adds r4, #0x40 - lsls r4, r4, #1 - add r4, sb - movs r1, #0 - ldrsh r0, [r4, r1] - adds r1, r5, #0 - bl FixedMul - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - mov r1, r8 - bl FixedDiv - ldr r2, [r6, #0x50] - lsls r0, r0, #0x10 - asrs r0, r0, #8 - ldr r1, [r2, #0x30] - subs r1, r1, r0 - str r1, [r6, #0x30] - ldr r0, [r2, #0x34] - str r0, [r6, #0x34] - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, pc} - .align 2, 0 -_0809CBE0: .4byte gSineTable - - thumb_func_start sub_0809CBE4 -sub_0809CBE4: @ 0x0809CBE4 - push {r4, lr} - adds r2, r0, #0 - adds r3, r2, #0 - adds r3, #0x79 - ldrb r0, [r2, #0xf] - ldrb r4, [r3] - adds r1, r0, r4 - strb r1, [r3] - ldrb r4, [r2, #0xf] - movs r0, #0xf - ldrsb r0, [r2, r0] - cmp r0, #0 - bge _0809CC16 - ldrb r0, [r2, #0xe] - lsls r1, r1, #0x18 - lsls r0, r0, #0x18 - cmn r1, r0 - bge _0809CC2C - rsbs r0, r4, #0 - strb r0, [r2, #0xf] - movs r0, #0xcf - lsls r0, r0, #1 - bl SoundReq - b _0809CC2C -_0809CC16: - movs r0, #0 - ldrsb r0, [r3, r0] - ldrb r1, [r2, #0xe] - cmp r0, r1 - ble _0809CC2C - rsbs r0, r4, #0 - strb r0, [r2, #0xf] - movs r0, #0xcf - lsls r0, r0, #1 - bl SoundReq -_0809CC2C: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809CC30 -sub_0809CC30: @ 0x0809CC30 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r6, r1, #0 - adds r4, #0x84 - ldr r0, [r4] - ldr r0, [r0, #8] - bl ChangeObjPalette - movs r5, #0 -_0809CC42: - ldr r0, [r4] - lsls r1, r5, #2 - adds r0, #0x20 - adds r0, r0, r1 - ldr r0, [r0] - adds r1, r6, #0 - bl ChangeObjPalette - adds r5, #1 - cmp r5, #3 - bls _0809CC42 - pop {r4, r5, r6, pc} - .align 2, 0 diff --git a/asm/vram.s b/asm/vram.s deleted file mode 100644 index 31e20355..00000000 --- a/asm/vram.s +++ /dev/null @@ -1,1083 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start ResetPalettes -ResetPalettes: @ 0x080ADD30 - push {r4, r5, r6, lr} - ldr r4, _080ADD6C @ =gGFXSlots - movs r1, #0x85 - lsls r1, r1, #2 - adds r0, r4, #0 - bl MemClear - movs r5, #0 - adds r4, #4 - movs r0, #0x10 - rsbs r0, r0, #0 - adds r6, r0, #0 -_080ADD48: - adds r0, r5, #0 - movs r1, #0 - movs r2, #1 - bl ReserveGFXSlots - ldrb r0, [r4] - ands r0, r6 - movs r1, #6 - orrs r0, r1 - strb r0, [r4] - movs r0, #0x80 - strb r0, [r4, #2] - adds r4, #0xc - adds r5, #1 - cmp r5, #3 - bls _080ADD48 - pop {r4, r5, r6, pc} - .align 2, 0 -_080ADD6C: .4byte gGFXSlots - - thumb_func_start sub_080ADD70 -sub_080ADD70: @ 0x080ADD70 -.ifdef EU - push {r4, r5, lr} - ldr r0, _080AD540 @ =gGFXSlots - ldrb r0, [r0] - cmp r0, #0 - beq _080AD56A - movs r4, #0 - movs r5, #0 -_080AD522: - ldr r0, _080AD544 @ =gUnk_02024494 - adds r2, r5, r0 - ldrb r1, [r2] - lsls r0, r1, #0x1c - lsrs r0, r0, #0x1c - cmp r0, #2 - bne _080AD548 - movs r3, #0x10 - rsbs r3, r3, #0 - adds r0, r3, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2] - b _080AD562 - .align 2, 0 -_080AD540: .4byte gGFXSlots -_080AD544: .4byte gUnk_02024494 -_080AD548: - cmp r0, #2 - blt _080AD562 - cmp r0, #6 - bgt _080AD562 - cmp r0, #4 - blt _080AD562 - movs r0, #0xf0 - ands r0, r1 - cmp r0, #0x30 - bne _080AD562 - adds r0, r4, #0 - bl sub_080ADE74 -_080AD562: - adds r5, #0xc - adds r4, #1 - cmp r4, #0x2b - bls _080AD522 -_080AD56A: - pop {r4, r5, pc} - -.else - push {r4, r5, lr} - ldr r1, _080ADD88 @ =gGFXSlots - ldrb r0, [r1] - cmp r0, #0 - beq _080ADDD6 - ldrb r0, [r1, #3] - cmp r0, #0 - beq _080ADD8C - bl sub_080ADE24 - b _080ADDD6 - .align 2, 0 -_080ADD88: .4byte gGFXSlots -_080ADD8C: - movs r4, #0 - movs r5, #0 -_080ADD90: - ldr r0, _080ADDB0 @ =gUnk_02024494 - adds r2, r5, r0 - ldrb r1, [r2] - lsls r0, r1, #0x1c - lsrs r0, r0, #0x1c - cmp r0, #2 - bne _080ADDB4 - movs r3, #0x10 - rsbs r3, r3, #0 - adds r0, r3, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2] - b _080ADDCE - .align 2, 0 -_080ADDB0: .4byte gUnk_02024494 -_080ADDB4: - cmp r0, #2 - blt _080ADDCE - cmp r0, #6 - bgt _080ADDCE - cmp r0, #4 - blt _080ADDCE - movs r0, #0xf0 - ands r0, r1 - cmp r0, #0x30 - bne _080ADDCE - adds r0, r4, #0 - bl sub_080ADE74 -_080ADDCE: - adds r5, #0xc - adds r4, #1 - cmp r4, #0x2b - bls _080ADD90 -_080ADDD6: - pop {r4, r5, pc} -.endif - - thumb_func_start sub_080ADDD8 -sub_080ADDD8: @ 0x080ADDD8 - push {lr} - adds r2, r1, #0 - lsls r1, r0, #1 - adds r1, r1, r0 - lsls r1, r1, #2 - ldr r0, _080ADDFC @ =gUnk_02024494 - adds r3, r1, r0 - ldr r0, _080ADE00 @ =0x00FFFFFC - ands r0, r2 - ldr r1, _080ADE04 @ =gGlobalGfxAndPalettes - adds r0, r0, r1 - str r0, [r3, #8] - movs r0, #1 - ands r0, r2 - cmp r0, #0 - beq _080ADE0C - ldr r0, _080ADE08 @ =0x0000FFFF - b _080ADE14 - .align 2, 0 -_080ADDFC: .4byte gUnk_02024494 -_080ADE00: .4byte 0x00FFFFFC -_080ADE04: .4byte gGlobalGfxAndPalettes -_080ADE08: .4byte 0x0000FFFF -_080ADE0C: - movs r0, #0xfe - lsls r0, r0, #0x17 - ands r0, r2 - lsrs r0, r0, #0x14 -_080ADE14: - strh r0, [r3, #6] - ldrb r0, [r3] - movs r1, #0xf - ands r1, r0 - movs r0, #0x30 - orrs r1, r0 - strb r1, [r3] - pop {pc} - - thumb_func_start sub_080ADE24 -sub_080ADE24: @ 0x080ADE24 - push {r4, r5, lr} - ldr r1, _080ADE50 @ =gGFXSlots - movs r0, #1 - strb r0, [r1, #3] - movs r4, #0 - movs r5, #0 -_080ADE30: - ldr r0, _080ADE54 @ =gUnk_02024494 - adds r1, r5, r0 - ldrb r0, [r1] - lsls r0, r0, #0x1c - lsrs r0, r0, #0x1c - cmp r0, #3 - beq _080ADE60 - cmp r0, #3 - blt _080ADE58 - cmp r0, #6 - bgt _080ADE58 - adds r0, r4, #0 - bl sub_080ADE74 - b _080ADE60 - .align 2, 0 -_080ADE50: .4byte gGFXSlots -_080ADE54: .4byte gUnk_02024494 -_080ADE58: - adds r0, r1, #0 - movs r1, #0xc - bl MemClear -_080ADE60: - adds r5, #0xc - adds r4, #1 - cmp r4, #0x2b - bls _080ADE30 - movs r1, #0 - ldr r0, _080ADE70 @ =gGFXSlots - strb r1, [r0, #3] - pop {r4, r5, pc} - .align 2, 0 -_080ADE70: .4byte gGFXSlots - - thumb_func_start sub_080ADE74 -sub_080ADE74: @ 0x080ADE74 - push {r4, r5, r6, lr} - adds r2, r0, #0 - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, _080ADF00 @ =gUnk_02024494 - adds r3, r0, r1 - ldrb r1, [r3] - movs r0, #0xf0 - ands r0, r1 - cmp r0, #0 - beq _080ADF7C - movs r0, #0xf - ands r0, r1 - movs r1, #0x10 - orrs r0, r1 - strb r0, [r3] - ldrh r1, [r3, #6] - ldr r0, _080ADF04 @ =0x0000FFFF - cmp r1, r0 - beq _080ADF18 - ldrb r0, [r3, #3] - cmp r0, #0 - beq _080ADF18 - lsls r0, r0, #6 - ldr r1, _080ADF08 @ =gUnk_020000C0 - adds r4, r0, r1 - movs r5, #4 - movs r6, #9 - rsbs r6, r6, #0 -_080ADEB0: - ldrb r1, [r4] - movs r0, #4 - ands r0, r1 - cmp r0, #0 - beq _080ADEF6 - ldr r0, _080ADF0C @ =gGFXSlots - ldrb r0, [r0, #3] - cmp r0, #0 - bne _080ADECA - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _080ADEF6 -_080ADECA: - adds r0, r6, #0 - ands r0, r1 - strb r0, [r4] - ldrb r0, [r4, #9] - lsls r2, r0, #5 - cmp r2, #0 - beq _080ADEF6 - ldrh r0, [r4, #0xa] - lsls r0, r0, #5 - ldr r3, _080ADF10 @ =0x06010000 - adds r1, r0, r3 - ldr r3, _080ADF14 @ =0x040000D4 - ldr r0, [r4, #0xc] - str r0, [r3] - str r1, [r3, #4] - adds r0, r2, #0 - asrs r0, r0, #2 - movs r1, #0x84 - lsls r1, r1, #0x18 - orrs r0, r1 - str r0, [r3, #8] - ldr r0, [r3, #8] -_080ADEF6: - adds r4, #0x10 - subs r5, #1 - cmp r5, #0 - bgt _080ADEB0 - b _080ADF7C - .align 2, 0 -_080ADF00: .4byte gUnk_02024494 -_080ADF04: .4byte 0x0000FFFF -_080ADF08: .4byte gUnk_020000C0 -_080ADF0C: .4byte gGFXSlots -_080ADF10: .4byte 0x06010000 -_080ADF14: .4byte 0x040000D4 -_080ADF18: - lsls r0, r2, #9 - ldr r2, _080ADF4C @ =0x06012800 - adds r1, r0, r2 - ldrh r2, [r3, #6] - cmp r2, #0 - beq _080ADF58 - ldr r0, _080ADF50 @ =0x0000FFFF - cmp r2, r0 - beq _080ADF62 - ldr r2, _080ADF54 @ =0x040000D4 - ldr r0, [r3, #8] - str r0, [r2] - str r1, [r2, #4] - ldrh r0, [r3, #6] - lsls r0, r0, #3 - movs r1, #0x84 - lsls r1, r1, #0x18 - orrs r0, r1 - str r0, [r2, #8] - ldr r0, [r2, #8] - ldrh r2, [r3, #6] - subs r2, #0x10 - cmp r2, #0 - ble _080ADF7C - b _080ADF70 - .align 2, 0 -_080ADF4C: .4byte 0x06012800 -_080ADF50: .4byte 0x0000FFFF -_080ADF54: .4byte 0x040000D4 -_080ADF58: - ldrb r1, [r3] - movs r0, #0xf - ands r0, r1 - strb r0, [r3] - b _080ADF7C -_080ADF62: - ldrb r0, [r3, #3] - cmp r0, #0 - bne _080ADF7C - ldr r0, [r3, #8] - bl LZ77UnCompVram - b _080ADF7C -_080ADF70: - adds r3, #0xc - movs r0, #0 - strh r0, [r3, #6] - subs r2, #0x10 - cmp r2, #0 - bgt _080ADF70 -_080ADF7C: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start LoadFixedGFX -LoadFixedGFX: @ 0x080ADF80 -.ifdef EU - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - mov r8, r0 - adds r5, r1, #0 - cmp r5, #0 - bne _080AD726 - movs r0, #1 - b _080AD77E -_080AD726: - movs r4, #4 - ldr r0, _080AD774 @ =gGFXSlots - adds r0, #0x30 -_080AD72C: - ldrh r1, [r0, #8] - cmp r5, r1 - beq _080AD766 - adds r0, #0xc - adds r4, #1 - cmp r4, #0x2b - bls _080AD72C - ldr r0, _080AD778 @ =gFixedTypeGfxData - lsls r1, r5, #2 - adds r1, r1, r0 - ldr r7, [r1] - movs r0, #0xfe - lsls r0, r0, #0x17 - ands r0, r7 - lsrs r6, r0, #0x18 - adds r0, r6, #0 - bl FindFreeGFXSlots - adds r4, r0, #0 - cmp r4, #0 - beq _080AD77C - adds r1, r5, #0 - adds r2, r6, #0 - bl ReserveGFXSlots - adds r0, r4, #0 - adds r1, r7, #0 - bl sub_080ADDD8 -_080AD766: - adds r0, r4, #0 - mov r1, r8 - movs r2, #4 - bl sub_080AE0C8 - movs r0, #1 - b _080AD77E - .align 2, 0 -_080AD774: .4byte gGFXSlots -_080AD778: .4byte gFixedTypeGfxData -_080AD77C: - movs r0, #0 -_080AD77E: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - -.else - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - mov r8, r0 - adds r7, r1, #0 - cmp r7, #0 - beq _080ADFFC - movs r5, #4 - ldr r0, _080ADFD4 @ =gGFXSlots - adds r0, #0x30 -_080ADF94: - ldrh r1, [r0, #8] - cmp r7, r1 - beq _080ADFF2 - adds r0, #0xc - adds r5, #1 - cmp r5, #0x2b - bls _080ADF94 - ldr r0, _080ADFD8 @ =gFixedTypeGfxData - lsls r4, r7, #2 - adds r0, r4, r0 - ldr r0, [r0] - movs r1, #0xfe - lsls r1, r1, #0x17 - ands r0, r1 - lsrs r6, r0, #0x18 - adds r0, r6, #0 - bl FindFreeGFXSlots - adds r5, r0, #0 - cmp r5, #0 - bne _080ADFDC - bl CleanUpGFXSlots - adds r0, r6, #0 - bl FindFreeGFXSlots - adds r5, r0, #0 - cmp r5, #0 - bne _080ADFDC - movs r0, #0 - b _080ADFFE - .align 2, 0 -_080ADFD4: .4byte gGFXSlots -_080ADFD8: .4byte gFixedTypeGfxData -_080ADFDC: - adds r0, r5, #0 - adds r1, r7, #0 - adds r2, r6, #0 - bl ReserveGFXSlots - ldr r0, _080AE004 @ =gFixedTypeGfxData - adds r0, r4, r0 - ldr r1, [r0] - adds r0, r5, #0 - bl sub_080ADDD8 -_080ADFF2: - adds r0, r5, #0 - mov r1, r8 - movs r2, #4 - bl sub_080AE0C8 -_080ADFFC: - movs r0, #1 -_080ADFFE: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080AE004: .4byte gFixedTypeGfxData -.endif - - thumb_func_start LoadSwapGFX -LoadSwapGFX: @ 0x080AE008 -.ifdef EU - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r5, r1, #0 - adds r4, r2, #0 - cmp r4, #0 - bne _080AD79C - adds r0, r5, #0 - bl FindFreeGFXSlots - adds r4, r0, #0 - cmp r4, #0 - beq _080AD7C4 -_080AD79C: - ldr r0, _080AD7D0 @ =gGFXSlots - lsls r1, r4, #1 - adds r1, r1, r4 - lsls r1, r1, #2 - adds r1, r1, r0 - ldrb r0, [r1, #4] - lsls r0, r0, #0x1c - lsrs r2, r0, #0x1c - cmp r2, #6 - beq _080AD7BC - adds r0, r4, #0 - movs r1, #0 - adds r2, r5, #0 - bl ReserveGFXSlots - movs r2, #5 -_080AD7BC: - adds r0, r4, #0 - adds r1, r6, #0 - bl sub_080AE0C8 -_080AD7C4: - adds r0, r4, #0 - cmp r0, #0 - beq _080AD7CC - movs r0, #1 -_080AD7CC: - pop {r4, r5, r6, pc} - .align 2, 0 -_080AD7D0: .4byte gGFXSlots - -.else - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r5, r1, #0 - adds r4, r2, #0 - cmp r4, #0 - bne _080AE030 - adds r0, r5, #0 - bl FindFreeGFXSlots - adds r4, r0, #0 - cmp r4, #0 - bne _080AE030 - bl CleanUpGFXSlots - adds r0, r5, #0 - bl FindFreeGFXSlots - adds r4, r0, #0 - cmp r4, #0 - beq _080AE058 -_080AE030: - ldr r0, _080AE064 @ =gGFXSlots - lsls r1, r4, #1 - adds r1, r1, r4 - lsls r1, r1, #2 - adds r1, r1, r0 - ldrb r0, [r1, #4] - lsls r0, r0, #0x1c - lsrs r2, r0, #0x1c - cmp r2, #6 - beq _080AE050 - adds r0, r4, #0 - movs r1, #0 - adds r2, r5, #0 - bl ReserveGFXSlots - movs r2, #5 -_080AE050: - adds r0, r4, #0 - adds r1, r6, #0 - bl sub_080AE0C8 -_080AE058: - adds r0, r4, #0 - cmp r0, #0 - beq _080AE060 - movs r0, #1 -_080AE060: - pop {r4, r5, r6, pc} - .align 2, 0 -_080AE064: .4byte gGFXSlots -.endif - - thumb_func_start UnloadGFXSlots -UnloadGFXSlots: @ 0x080AE068 - push {r4, r5, lr} - adds r0, #0x26 - ldrb r2, [r0] - movs r1, #0 - strb r1, [r0] - cmp r2, #0 - beq _080AE0C2 - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, _080AE0C4 @ =gUnk_02024494 - adds r3, r0, r1 - ldrb r0, [r3] - lsls r0, r0, #0x1c - lsrs r0, r0, #0x1c - cmp r0, #5 - bgt _080AE0C2 - cmp r0, #4 - blt _080AE0C2 - ldrb r0, [r3, #2] - cmp r0, #0 - beq _080AE0C2 - subs r0, #1 - strb r0, [r3, #2] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080AE0C2 - ldrb r2, [r3, #1] - adds r0, r2, #0 - subs r2, #1 - cmp r0, #0 - ble _080AE0C2 - movs r5, #0x10 - rsbs r5, r5, #0 - movs r4, #1 -_080AE0AE: - ldrb r0, [r3] - adds r1, r5, #0 - ands r1, r0 - orrs r1, r4 - strb r1, [r3] - adds r3, #0xc - adds r0, r2, #0 - subs r2, #1 - cmp r0, #0 - bgt _080AE0AE -_080AE0C2: - pop {r4, r5, pc} - .align 2, 0 -_080AE0C4: .4byte gUnk_02024494 - - thumb_func_start sub_080AE0C8 -sub_080AE0C8: @ 0x080AE0C8 - push {r4, lr} - adds r4, r2, #0 - lsls r2, r0, #4 - movs r3, #0xa0 - lsls r3, r3, #1 - adds r2, r2, r3 - adds r3, r1, #0 - adds r3, #0x60 - strh r2, [r3] - adds r1, #0x26 - strb r0, [r1] - lsls r1, r0, #1 - adds r1, r1, r0 - lsls r1, r1, #2 - ldr r0, _080AE100 @ =gUnk_02024494 - adds r1, r1, r0 - ldrb r2, [r1, #2] - movs r0, #2 - ldrsb r0, [r1, r0] - cmp r0, #0 - blt _080AE0F6 - adds r0, r2, #1 - strb r0, [r1, #2] -_080AE0F6: - adds r0, r1, #0 - adds r1, r4, #0 - bl SetGFXSlotStatus - pop {r4, pc} - .align 2, 0 -_080AE100: .4byte gUnk_02024494 - - thumb_func_start ReserveGFXSlots -ReserveGFXSlots: @ 0x080AE104 - push {r4, r5, r6, lr} - adds r6, r1, #0 - adds r5, r2, #0 - lsls r4, r0, #1 - adds r4, r4, r0 - lsls r4, r4, #2 - ldr r0, _080AE130 @ =gUnk_02024494 - adds r4, r4, r0 - lsls r1, r5, #1 - adds r1, r1, r5 - lsls r1, r1, #2 - adds r0, r4, #0 - bl MemClear - strb r5, [r4, #1] - strh r6, [r4, #4] - adds r0, r4, #0 - movs r1, #4 - bl SetGFXSlotStatus - pop {r4, r5, r6, pc} - .align 2, 0 -_080AE130: .4byte gUnk_02024494 - - thumb_func_start SetGFXSlotStatus -SetGFXSlotStatus: @ 0x080AE134 - push {r4, r5, r6, lr} - adds r3, r0, #0 - adds r4, r1, #0 - movs r6, #0xf - adds r0, r4, #0 - ands r0, r6 - ldrb r2, [r3] - movs r5, #0x10 - rsbs r5, r5, #0 - adds r1, r5, #0 - ands r1, r2 - orrs r1, r0 - strb r1, [r3] - ldrb r2, [r3, #1] - cmp r4, #6 - beq _080AE156 - movs r4, #3 -_080AE156: - subs r2, #1 - cmp r2, #0 - ble _080AE170 - ands r4, r6 -_080AE15E: - adds r3, #0xc - ldrb r1, [r3] - adds r0, r5, #0 - ands r0, r1 - orrs r0, r4 - strb r0, [r3] - subs r2, #1 - cmp r2, #0 - bgt _080AE15E -_080AE170: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start FindFreeGFXSlots -FindFreeGFXSlots: @ 0x080AE174 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0 - movs r2, #4 - ldr r0, _080AE194 @ =gGFXSlots - adds r3, r0, #0 - adds r3, #0x30 -_080AE182: - ldrb r0, [r3, #4] - lsls r0, r0, #0x1c - cmp r0, #0 - bne _080AE198 - adds r1, #1 - cmp r4, r1 - bhi _080AE19A - b _080AE1BC - .align 2, 0 -_080AE194: .4byte gGFXSlots -_080AE198: - movs r1, #0 -_080AE19A: - adds r3, #0xc - adds r2, #1 - cmp r2, #0x2b - bls _080AE182 - movs r1, #0 - movs r2, #4 - ldr r0, _080AE1C4 @ =gGFXSlots - adds r3, r0, #0 - adds r3, #0x30 -_080AE1AC: - ldrb r0, [r3, #4] - lsls r0, r0, #0x1c - lsrs r0, r0, #0x1c - cmp r0, #1 -.ifdef EU - bne _080AE1C8 -.else - bhi _080AE1C8 -.endif - adds r1, #1 - cmp r4, r1 - bhi _080AE1CA -_080AE1BC: - subs r0, r2, r1 - adds r0, #1 - b _080AE1D4 - .align 2, 0 -_080AE1C4: .4byte gGFXSlots -_080AE1C8: - movs r1, #0 -_080AE1CA: - adds r3, #0xc - adds r2, #1 - cmp r2, #0x2b - bls _080AE1AC - movs r0, #0 -_080AE1D4: - pop {r4, pc} - .align 2, 0 - -.ifndef EU - thumb_func_start CleanUpGFXSlots -CleanUpGFXSlots: @ 0x080AE1D8 - push {r4, r5, lr} - ldr r0, _080AE1E8 @ =gGFXSlots - ldrb r0, [r0] - cmp r0, #0 - beq _080AE216 - movs r5, #4 - b _080AE20A - .align 2, 0 -_080AE1E8: .4byte gGFXSlots -_080AE1EC: - bl FindFirstFreeGFXSlot - adds r4, r0, #0 - cmp r4, r5 - bhi _080AE208 - adds r0, r5, #0 - adds r1, r4, #0 - bl sub_080AE218 - adds r0, r5, #0 - adds r1, r4, #0 - bl sub_080AE324 - adds r5, r4, #0 -_080AE208: - adds r5, #1 -_080AE20A: - adds r0, r5, #0 - bl FindNextOccupiedGFXSlot - adds r5, r0, #0 - cmp r5, #0 - bne _080AE1EC -_080AE216: - pop {r4, r5, pc} - - thumb_func_start sub_080AE218 -sub_080AE218: @ 0x080AE218 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - mov sl, r0 - mov r8, r1 - lsls r0, r1, #4 - movs r1, #0xa0 - lsls r1, r1, #1 - adds r0, r0, r1 - mov ip, r0 - mov r2, sl - lsls r0, r2, #4 - adds r3, r0, r1 - ldr r1, _080AE30C @ =gGFXSlots - lsls r0, r2, #1 - add r0, sl - lsls r0, r0, #2 - adds r0, r0, r1 - ldrb r0, [r0, #5] - lsls r0, r0, #4 - adds r7, r3, r0 - movs r4, #0 - ldr r6, _080AE310 @ =gUnk_020000C0 - mov sb, r6 - ldr r0, _080AE314 @ =gPlayerEntity - adds r2, r0, #0 - adds r2, #0x26 - adds r5, r0, #0 -_080AE254: - ldr r0, [r5, #4] - cmp r0, #0 - beq _080AE276 - ldrb r0, [r2] - cmp sl, r0 - bne _080AE264 - mov r1, r8 - strb r1, [r2] -_080AE264: - ldrh r0, [r2, #0x3a] - cmp r3, r0 - bhi _080AE276 - cmp r7, r0 - bls _080AE276 - subs r0, r0, r3 - mov r6, ip - adds r1, r0, r6 - strh r1, [r2, #0x3a] -_080AE276: - adds r2, #0x88 - adds r5, #0x88 - adds r4, #1 - cmp r4, #0x4f - bls _080AE254 - movs r0, #0 -_080AE282: - movs r4, #0 - adds r1, r0, #1 - mov r8, r1 - lsls r5, r0, #6 -_080AE28A: - lsls r0, r4, #4 - add r0, sb - adds r2, r5, r0 - ldrb r1, [r2] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _080AE2B4 - movs r0, #2 - ands r0, r1 - cmp r0, #0 - bne _080AE2B4 - ldrh r1, [r2, #0xa] - cmp r3, r1 - bhi _080AE2B4 - cmp r7, r1 - bls _080AE2B4 - subs r0, r1, r3 - mov r6, ip - adds r1, r0, r6 - strh r1, [r2, #0xa] -_080AE2B4: - adds r4, #1 - cmp r4, #3 - bls _080AE28A - mov r0, r8 - cmp r0, #0x2f - bls _080AE282 - movs r4, #0 - ldr r0, _080AE318 @ =0xFFFFFC00 - mov sl, r0 - ldr r5, _080AE31C @ =gOAMControls - adds r5, #0x24 - ldr r1, _080AE320 @ =0x000003FF - mov sb, r1 - movs r2, #1 - mov r8, r2 -_080AE2D2: - ldrh r2, [r5] - lsls r0, r2, #0x16 - lsrs r1, r0, #0x16 - cmp r3, r1 - bhi _080AE2F8 - cmp r7, r1 - bls _080AE2F8 - subs r0, r1, r3 - mov r6, ip - adds r1, r0, r6 - mov r0, sb - ands r1, r0 - mov r0, sl - ands r0, r2 - orrs r0, r1 - strh r0, [r5] - mov r2, r8 - ldr r1, _080AE31C @ =gOAMControls - strb r2, [r1] -_080AE2F8: - adds r5, #8 - adds r4, #1 - cmp r4, #0x7f - bls _080AE2D2 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080AE30C: .4byte gGFXSlots -_080AE310: .4byte gUnk_020000C0 -_080AE314: .4byte gPlayerEntity -_080AE318: .4byte 0xFFFFFC00 -_080AE31C: .4byte gOAMControls -_080AE320: .4byte 0x000003FF - - thumb_func_start sub_080AE324 -sub_080AE324: @ 0x080AE324 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r3, r1, #0 - ldr r2, _080AE380 @ =gGFXSlots - lsls r1, r0, #1 - adds r1, r1, r0 - lsls r1, r1, #2 - adds r5, r1, r2 - ldrb r4, [r5, #5] - subs r4, #1 - movs r0, #1 - rsbs r0, r0, #0 - cmp r4, r0 - beq _080AE372 - lsls r0, r3, #1 - adds r0, r0, r3 - lsls r0, r0, #2 - adds r0, r0, r2 - mov r8, r0 - adds r0, r1, #4 - adds r6, r0, r2 -_080AE350: - mov r0, r8 - adds r0, #4 - adds r1, r5, #4 - ldm r1!, {r2, r3, r7} - stm r0!, {r2, r3, r7} - adds r0, r6, #0 - movs r1, #0xc - bl MemClear - adds r6, #0xc - adds r5, #0xc - movs r0, #0xc - add r8, r0 - subs r4, #1 - subs r0, #0xd - cmp r4, r0 - bne _080AE350 -_080AE372: - ldr r1, _080AE380 @ =gGFXSlots - movs r0, #1 - strb r0, [r1, #3] - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080AE380: .4byte gGFXSlots - - thumb_func_start FindNextOccupiedGFXSlot -FindNextOccupiedGFXSlot: @ 0x080AE384 - push {lr} - adds r2, r0, #0 - cmp r2, #0x2a - bhi _080AE3B4 - ldr r1, _080AE3A8 @ =gGFXSlots - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - adds r1, r0, r1 -_080AE396: - ldrb r0, [r1, #4] - lsls r0, r0, #0x1c - lsrs r0, r0, #0x1c - cmp r0, #5 - bgt _080AE3AC - cmp r0, #4 - blt _080AE3AC - adds r0, r2, #0 - b _080AE3B6 - .align 2, 0 -_080AE3A8: .4byte gGFXSlots -_080AE3AC: - adds r1, #0xc - adds r2, #1 - cmp r2, #0x2a - bls _080AE396 -_080AE3B4: - movs r0, #0 -_080AE3B6: - pop {pc} - - thumb_func_start FindFirstFreeGFXSlot -FindFirstFreeGFXSlot: @ 0x080AE3B8 - push {lr} - movs r1, #4 - ldr r0, _080AE3D4 @ =gGFXSlots - adds r2, r0, #0 - adds r2, #0x30 -_080AE3C2: - ldrb r0, [r2, #4] - lsls r0, r0, #0x1c - lsrs r0, r0, #0x1c - cmp r0, #1 - bgt _080AE3D8 - cmp r0, #0 - blt _080AE3D8 - adds r0, r1, #0 - b _080AE3E2 - .align 2, 0 -_080AE3D4: .4byte gGFXSlots -_080AE3D8: - adds r2, #0xc - adds r1, #1 - cmp r1, #0x2b - bls _080AE3C2 - movs r0, #0 -_080AE3E2: - pop {pc} -.endif - diff --git a/assets/assets.json b/assets/assets.json index ac248f28..cde1d600 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44859,21 +44859,6 @@ "size": 41, "type": "animation" }, - { - "path": "object91/gUnk_08123DDC.bin", - "start": 1195484, - "size": 28 - }, - { - "path": "object91/gUnk_08123E18.bin", - "start": 1195544, - "size": 4 - }, - { - "path": "object91/gUnk_08123E1C.bin", - "start": 1195548, - "size": 4 - }, { "path": "animations/gSpriteAnimations_BakerOven_0.bin", "start": 1195564, diff --git a/data/const/object/object90.s b/data/const/object/object90.s deleted file mode 100644 index 893a15d5..00000000 --- a/data/const/object/object90.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08123DCC:: @ 08123DCC - .4byte sub_0809C3AC - .4byte nullsub_536 diff --git a/data/const/object/object91.s b/data/const/object/object91.s deleted file mode 100644 index 329728ac..00000000 --- a/data/const/object/object91.s +++ /dev/null @@ -1,28 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08123DD4:: @ 08123DD4 - .4byte sub_0809C3EC - .4byte sub_0809C5C4 - -gUnk_08123DDC:: @ 08123DDC - .incbin "object91/gUnk_08123DDC.bin" - -gUnk_08123DF8:: @ 08123DF8 - .4byte sub_0809C7E4 - .4byte sub_0809C854 - .4byte sub_0809C8BC - .4byte sub_0809C924 - .4byte sub_0809C988 - .4byte sub_0809C9E0 - .4byte sub_0809CAC8 - .4byte sub_0809CB4C - -gUnk_08123E18:: @ 08123E18 - .incbin "object91/gUnk_08123E18.bin" - -gUnk_08123E1C:: @ 08123E1C - .incbin "object91/gUnk_08123E1C.bin" diff --git a/include/enemy.h b/include/enemy.h index de83eea7..f2ffb760 100644 --- a/include/enemy.h +++ b/include/enemy.h @@ -190,7 +190,7 @@ void SpinyBeetle(Entity*); void MazaalHead(Entity*); void MazaalMacro(Entity*); void MazaalHand(Entity*); -void OctorokBoss(Entity*); +void OctorokBoss(); void FlyingPot(Entity*); void Gibdo(Entity*); void OctorokGolden(Entity*); diff --git a/include/enemy/octorokBoss.h b/include/enemy/octorokBoss.h new file mode 100644 index 00000000..dcdfa2ca --- /dev/null +++ b/include/enemy/octorokBoss.h @@ -0,0 +1,77 @@ +#ifndef ENEMY_OCTOROK_BOSS_H +#define ENEMY_OCTOROK_BOSS_H + +#include "enemy.h" + +typedef struct OctorokBossEntity OctorokBossEntity; +typedef struct { + /*0x00*/ u8 unk_0; // [0,1,2,4] is later stored in super->field_0xf + /*0x01*/ u8 tailCount; + /*0x02*/ u8 field_0x2; // [0,1] + /*0x03*/ u8 targetAngle; // relates to this->field_0x7a.HALF.HI + /*0x04*/ u8 rotation; // [0,1,0xff] + /*0x05*/ u8 phase4PrevAttackPattern; // [0-4], sets this->phase4AttackPattern + /*0x06*/ u8 fallingStonesTimer; + /*0x07*/ u8 field_0x7; // some sort of counter that is only set when hit for the first time? + /*0x08*/ OctorokBossEntity* mouthObject; + /*0x0c*/ OctorokBossEntity* tailObjects[5]; + /*0x20*/ OctorokBossEntity* legObjects[4]; +} OctorokBossHeap; +static_assert(sizeof(OctorokBossHeap) == 0x30); + +struct OctorokBossEntity { + Entity base; + /*0x68*/ union SplitHWord field_0x68; + /*0x6a*/ union SplitHWord field_0x6a; + /*0x6c*/ union SplitHWord field_0x6c; + /*0x6e*/ union SplitHWord field_0x6e; + /*0x70*/ union SplitWord field_0x70; + /*0x74*/ u16 unk_74; + /*0x76*/ u16 unk_76; + /*0x78*/ u8 attackWaitTurns; /**< Turns until the next attack */ + /*0x79*/ u8 timer; /**< Reused timer */ + /*0x7a*/ union SplitHWord angle; /**< Angle of legs */ + /*0x7c*/ u8 bossPhase; /**< Boss Phase + 0: unfrozen + 1: frozen 1 + 2: unfrozen + 3: frozen 2 + 4: unfrozen -> death */ + /*0x7d*/ u8 currentAttack; + /*0x7e*/ u8 nextAttackIndex; + /*0x7f*/ u8 unk_7f; + /*0x80*/ u8 unk_80; + /*0x81*/ u8 phase4AttackPattern; /**< Which attack pattern is currently used in phase 4 */ + /*0x82*/ union SplitHWord angularSpeed; + /*0x84*/ OctorokBossHeap* heap; /**< Heap data allocated with #zMalloc. */ +}; + +enum OctorokRotation { ROTATION_CW, ROTATION_CCW, NO_ROTATION = 0xff }; + +enum OctorokBossPart { WHOLE, LEG_BR, LEG_FR, LEG_FL, LEG_BL, MOUTH, TAIL_END, TAIL }; +enum OctorokBossAction { + INIT, // 0 + ACTION1, // 1 + HIT, // 2 + INTRO, // 3 + BURNING, // 4 +}; + +enum OctorokBossAttack { + ATTACK_SPITROCK, // 0 + ATTACK_VACUUM, // 1 + ATTACK_SMOKE, // 2 + ATTACK_FREEZE, // 3 + NO_ATTACK, // 4 + END_OF_ATTACK_PATTERN // 5 +}; + +enum OctorokBossAction1SubAction { + ACTION1_AIMTOWARDSPLAYER, // Moving around with step sounds + ACTION1_WAITFORTURN, // Also step sounds + ACTION1_SUBACTION2, // Step sounds, some kind of attack that is started in OctorokBoss_StartRegularAttack? + ACTION1_WAITFORATTACK, // Wait for GET_TIMER(), then OctorokBoss_SetWaitTurnsForNextAttack + ACTION1_ATTACK, // Attack +}; + +#endif \ No newline at end of file diff --git a/include/functions.h b/include/functions.h index fb07a803..f9abcf26 100644 --- a/include/functions.h +++ b/include/functions.h @@ -66,6 +66,7 @@ extern void SetDirtTile(u32); extern void SetInventoryValue(u32, u32); extern void SoundReqClipped(Entity*, u32); extern void TryLoadPrologueHyruleTown(void); +extern void UnloadGFXSlots(Entity*); extern void UnloadOBJPalette(Entity*); extern void UpdateDisplayControls(void); extern void UpdateItemAnim(ItemBehavior*); @@ -243,7 +244,6 @@ extern void sub_080A57F4(void); extern void sub_080A71C4(u32, u32, u32, u32); extern void sub_080A7C18(u32, u32, u32); extern void sub_080ADD70(void); -extern void UnloadGFXSlots(Entity*); extern bool32 sub_080AE4CC(Entity*, u32, u32, u32); extern void sub_080AE58C(Entity*, u32, u32); extern void sub_080AF284(void); diff --git a/include/object.h b/include/object.h index 9969a39e..740bbeb4 100644 --- a/include/object.h +++ b/include/object.h @@ -175,7 +175,7 @@ typedef enum { OBJECT_8E, FROZEN_WATER_ELEMENT, OBJECT_90, - OBJECT_91, + FROZEN_OCTOROK, BAKER_OVEN, LAMP, WIND_TRIBE_FLAG, @@ -371,7 +371,7 @@ void Fireplace(Entity*); void Object8E(); void FrozenWaterElement(); void Object90(Entity*); -void Object91(Entity*); +void FrozenOctorok(); void BakerOven(Entity*); void Lamp(Entity*); void WindTribeFlag(Entity*); diff --git a/linker.ld b/linker.ld index abeb3001..b2349021 100644 --- a/linker.ld +++ b/linker.ld @@ -766,8 +766,8 @@ SECTIONS { src/object/fireplace.o(.text); src/object/object8E.o(.text); src/object/frozenWaterElement.o(.text); - asm/object/object90.o(.text); - asm/object/object91.o(.text); + src/object/object90.o(.text); + src/object/frozenOctorok.o(.text); src/object/bakerOven.o(.text); src/object/lamp.o(.text); src/object/windTribeFlag.o(.text); @@ -1518,8 +1518,8 @@ SECTIONS { data/const/object/fireplace.o(.rodata); src/object/object8E.o(.rodata); src/object/frozenWaterElement.o(.rodata); - data/const/object/object90.o(.rodata); - data/const/object/object91.o(.rodata); + src/object/object90.o(.rodata); + src/object/frozenOctorok.o(.rodata); data/const/object/bakerOven.o(.rodata); data/animations/object/bakerOven.o(.rodata); src/object/lamp.o(.rodata); diff --git a/src/enemy/octorokBoss.c b/src/enemy/octorokBoss.c index b984eb85..b4fbc73a 100644 --- a/src/enemy/octorokBoss.c +++ b/src/enemy/octorokBoss.c @@ -4,155 +4,92 @@ * * @brief Octorok boss enemy */ - -#include "enemy.h" +#define NENT_DEPRECATED +#include "enemy/octorokBoss.h" #include "functions.h" +#include "game.h" #include "object.h" #include "projectile.h" -#include "game.h" -enum OctorokRotation { ROTATION_CW, ROTATION_CCW, NO_ROTATION = 0xff }; - -typedef struct HelperStruct { - u8 field_0x0; // [0,1,2,4] is later stored in this->field_0xf - u8 tailCount; - u8 field_0x2; // [0,1] - u8 targetAngle; // relates to this->field_0x7a.HALF.HI - u8 rotation; // [0,1,0xff] - u8 phase4PrevAttackPattern; // [0-4], sets this->field_0x80.HALF.HI - u8 fallingStonesTimer; - u8 field_0x7; // some sort of counter that is only set when hit for the first time? - Entity* mouthObject; - Entity* tailObjects[5]; - Entity* legObjects[4]; -} HelperStruct; - -static_assert(sizeof(HelperStruct) == 0x30); - -/* -this->field_0x7c.BYTES.byte0 Boss Phase -0: unfrozen -1: frozen 1 -2: unfrozen -3: frozen 2 -4: unfrozen -> death -*/ -#define IS_FROZEN(this) ((this)->field_0x7c.BYTES.byte0 & 1) -#define GET_BOSS_PHASE(this) ((this)->field_0x7c.BYTES.byte0) -/* -this->field_0x78.HALF.HI reused timer -*/ -#define GET_TIMER(this) ((this)->field_0x78.HALF.HI) -/* -this->field_0x78.HALF.LO turns until the next attack -*/ -#define GET_ATTACK_WAIT_TURNS(this) ((this)->field_0x78.HALF.LO) -/* -this->field_0x7a.HALF.HI angle of legs -*/ -#define GET_ANGLE(this) ((this)->field_0x7a.HWORD) -#define GET_ANGLE_HI(this) ((this)->field_0x7a.HALF.HI) -/* -this->field_0x82.HWORD angular speed -*/ -#define GET_ANGULAR_VEL(this) ((this)->field_0x82.HWORD) - -enum OctorokBossPart { WHOLE, LEG_BR, LEG_FR, LEG_FL, LEG_BL, MOUTH, TAIL_END, TAIL }; -enum OctorokBossAction { - INIT, // 0 - ACTION1, // 1 - HIT, // 2 - INTRO, // 3 - BURNING, // 4 -}; - -enum OctorokBossAttack { - ATTACK_SPITROCK, // 0 - ATTACK_VACUUM, // 1 - ATTACK_SMOKE, // 2 - ATTACK_FREEZE, // 3 - NO_ATTACK, // 4 - END_OF_ATTACK_PATTERN // 5 -}; - -enum OctorokBossAction1SubAction { - ACTION1_AIMTOWARDSPLAYER, // Moving around with step sounds - ACTION1_WAITFORTURN, // Also step sounds - ACTION1_SUBACTION2, // Step sounds, some kind of attack that is started in OctorokBoss_StartRegularAttack? - ACTION1_WAITFORATTACK, // Wait for GET_TIMER(), then OctorokBoss_SetWaitTurnsForNextAttack - ACTION1_ATTACK, // Attack -}; - -/* -this->field_0x7c.BYTES.byte1 currentAttack -*/ -#define GET_CURRENT_ATTACK(this) this->field_0x7c.BYTES.byte1 -/* -this->field_0x7c.BYTES.byte2 nextAttackIndex -*/ -#define GET_NEXT_ATTACK_INDEX(this) this->field_0x7c.BYTES.byte2 +#define IS_FROZEN(this) ((this)->bossPhase & 1) /* for TAIL_END object: this->field_0x7c.BYTES.byte1 tailRadius */ -#define GET_TAIL_RADIUS(this) this->field_0x7c.BYTES.byte1 +#define GET_TAIL_RADIUS(this) this->currentAttack // this->field_0x7c.BYTES.byte1 -#define GET_HELPER(this) (*(HelperStruct**)&this->cutsceneBeh) - -// Which attack pattern is currently used in phase 4 -#define GET_PHASE4_ATTACK_PATTERN(this) this->field_0x80.HALF.HI - -extern void (*const OctorokBoss_Functions[])(Entity*); -extern void (*const OctorokBoss_Hit_SubActions[])(Entity*); -extern const u8 OctorokBoss_HealthPerPhase[]; -extern void (*const OctorokBoss_Actions[])(Entity*); -extern const u8 gUnk_080CF08C[]; -extern void (*const OctorokBoss_Intro_SubActions[])(Entity*); -extern void (*const OctorokBoss_Action1_SubActions[])(Entity*); -extern const u8 OctorokBoss_LegAngleOffset[]; -extern const u8 OctorokBoss_LegAngleOffset2[]; -extern void (*const OctorokBoss_Action1_Attack_Type2s[])(Entity*); -extern void (*const OctorokBoss_AttackFunctions[])(Entity*); -extern void (*const OctorokBoss_Burning_SubActions[])(Entity*); -extern const u8 OctorokBoss_AttackTimerWeights[]; -extern const u8 OctorokBoss_AttackTimerValues[]; -extern const u8* const OctorokBoss_Phase4AttackPatterns[]; -extern const u8 OctorokBoss_TurnTimeWeights[]; -extern const u8 OctorokBoss_TurnTimeValues[]; -extern const u8 OctorokBoss_WaitForAttackTurnsWeights[]; -extern const u8 OctorokBoss_WaitForAttackTurnsValues[]; -extern const u8 OctorokBoss_NormalAttackPatterns[]; -extern const u8 OctorokBoss_FrozenAttackPatterns[]; - -void OctorokBoss_Hit(Entity*); -void OctorokBoss_Action1(Entity*); -void OctorokBoss_Burning_SubAction1(Entity*); -void sub_080368D8(Entity*); +void OctorokBoss_Hit(OctorokBossEntity*); +void OctorokBoss_Action1(OctorokBossEntity*); +void OctorokBoss_Burning_SubAction1(OctorokBossEntity*); +void sub_080368D8(OctorokBossEntity*); void sub_08036914(Entity*, s32, s32); -void sub_08036998(Entity*); -void sub_080369D0(Entity*, s32, s32); -void sub_08036AF0(Entity*, s32, s32); -void OctorokBoss_SetAttackTimer(Entity*); -void OctorokBoss_ResetToSubAction0(Entity*); -void OctorokBoss_WaitAnotherTurn(Entity*); -void OctorokBoss_SetWaitTurnsForNextAttack(Entity*); -void OctorokBoss_StartRegularAttack(Entity*); -void OctorokBoss_ChangePalette(Entity*, u32); -void sub_08036F60(Entity*); -void OctorokBoss_StepSound(Entity*, u32); -void sub_08036FE4(Entity*); +void sub_08036998(OctorokBossEntity*); +void sub_080369D0(OctorokBossEntity*, s32, s32); +void sub_08036AF0(OctorokBossEntity*, s32, s32); +void OctorokBoss_SetAttackTimer(OctorokBossEntity*); +void OctorokBoss_ResetToSubAction0(OctorokBossEntity*); +void OctorokBoss_WaitAnotherTurn(OctorokBossEntity*); +void OctorokBoss_SetWaitTurnsForNextAttack(OctorokBossEntity*); +void OctorokBoss_StartRegularAttack(OctorokBossEntity*); +void OctorokBoss_ChangePalette(OctorokBossEntity*, u32); +void sub_08036F60(OctorokBossEntity*); +void OctorokBoss_StepSound(OctorokBossEntity*, u32); +void sub_08036FE4(OctorokBossEntity*); +void OctorokBoss_OnTick(OctorokBossEntity*); +void OctorokBoss_OnDeath(OctorokBossEntity*); +void OctorokBoss_Hit_SubAction0(OctorokBossEntity*); +void OctorokBoss_Hit_SubAction1(OctorokBossEntity*); +void OctorokBoss_Hit_SubAction2(OctorokBossEntity*); +void OctorokBoss_Hit_SubAction3(OctorokBossEntity*); +void OctorokBoss_Hit_SubAction4(OctorokBossEntity*); +void OctorokBoss_Hit_SubAction5(OctorokBossEntity*); +void OctorokBoss_Hit_SubAction6(OctorokBossEntity*); +void OctorokBoss_Intro_SubAction0(OctorokBossEntity*); +void OctorokBoss_Intro_SubAction1(OctorokBossEntity*); +void OctorokBoss_Intro_SubAction2(OctorokBossEntity*); +void OctorokBoss_Intro_SubAction3(OctorokBossEntity*); +void OctorokBoss_Intro_SubAction4(OctorokBossEntity*); +void OctorokBoss_Intro_SubAction5(OctorokBossEntity*); +void OctorokBoss_Action1_AimTowardsPlayer(OctorokBossEntity*); +void OctorokBoss_Action1_WaitForTurn(OctorokBossEntity*); +void OctorokBoss_Action1_WaitForAttack(OctorokBossEntity*); +void OctorokBoss_Action1_ChargeAttack(OctorokBossEntity*); +void OctorokBoss_Action1_Attack(OctorokBossEntity*); +void OctorokBoss_Init(OctorokBossEntity*); +void OctorokBoss_Action1(OctorokBossEntity*); +void OctorokBoss_Hit(OctorokBossEntity*); +void OctorokBoss_Intro(OctorokBossEntity*); +void OctorokBoss_Burning(OctorokBossEntity*); +void OctorokBoss_Action1_Attack_Type2_0(OctorokBossEntity*); +void OctorokBoss_Action1_Attack_Type2_1(OctorokBossEntity*); +void OctorokBoss_Action1_Attack_Type2_2(OctorokBossEntity*); +void OctorokBoss_Action1_Attack_Type2_3(OctorokBossEntity*); +void OctorokBoss_ExecuteAttackSpitRock(OctorokBossEntity*); +void OctorokBoss_ExecuteAttackVacuum(OctorokBossEntity*); +void OctorokBoss_ExecuteAttackSmoke(OctorokBossEntity*); +void OctorokBoss_ExecuteAttackFreeze(OctorokBossEntity*); +void OctorokBoss_Burning_SubAction0(OctorokBossEntity*); +void OctorokBoss_Burning_SubAction1(OctorokBossEntity*); +void OctorokBoss_Burning_SubAction2(OctorokBossEntity*); -void OctorokBoss(Entity* this) { - OctorokBoss_Functions[GetNextFunction(this)](this); +void OctorokBoss(OctorokBossEntity* this) { + static void (*const OctorokBoss_Functions[])(OctorokBossEntity*) = { + OctorokBoss_OnTick, + OctorokBoss_OnTick, + (void (*)(OctorokBossEntity*))GenericKnockback, + OctorokBoss_OnDeath, + (void (*)(OctorokBossEntity*))GenericConfused, + }; + OctorokBoss_Functions[GetNextFunction(super)](this); } -void OctorokBoss_Death(Entity* this) { - if (this->type == WHOLE) { - this->action = HIT; - this->subAction = 0; - this->knockbackDuration = 0; - this->health = 1; +void OctorokBoss_OnDeath(OctorokBossEntity* this) { + if (super->type == WHOLE) { + super->action = HIT; + super->subAction = 0; + super->knockbackDuration = 0; + super->health = 1; sub_080368D8(this); OctorokBoss_Hit(this); } else { @@ -166,573 +103,476 @@ Hit SubActions 1-3: 4- */ -void OctorokBoss_Hit(Entity* this) { - if (GET_BOSS_PHASE(this) == 0) { - if (this->subAction != 3) { - gRoomControls.camera_target = GET_HELPER(this)->tailObjects[0]; - GET_HELPER(this)->field_0x7 = 0x5a; +void OctorokBoss_Hit(OctorokBossEntity* this) { + static void (*const OctorokBoss_Hit_SubActions[])(OctorokBossEntity*) = { + OctorokBoss_Hit_SubAction0, OctorokBoss_Hit_SubAction1, OctorokBoss_Hit_SubAction2, OctorokBoss_Hit_SubAction3, + OctorokBoss_Hit_SubAction4, OctorokBoss_Hit_SubAction5, OctorokBoss_Hit_SubAction6, + }; + if (this->bossPhase == 0) { + if (super->subAction != 3) { + gRoomControls.camera_target = &this->heap->tailObjects[0]->base; + this->heap->field_0x7 = 0x5a; sub_08078B48(); } } else { - if (GET_HELPER(this)->field_0x7 != 0) { - GET_HELPER(this)->field_0x7--; + if (this->heap->field_0x7 != 0) { + this->heap->field_0x7--; sub_08078B48(); } } - OctorokBoss_Hit_SubActions[this->subAction](this); - if (this->subAction > 3) { + OctorokBoss_Hit_SubActions[super->subAction](this); + if (super->subAction > 3) { sub_08078B48(); } - sub_0800445C(this); - sub_0805EC9C(this, this->field_0x76.HWORD, this->field_0x74.HWORD, GET_ANGLE(this)); + sub_0800445C(super); + sub_0805EC9C(super, this->unk_76, this->unk_74, this->angle.HWORD); } -void OctorokBoss_Hit_SubAction0(Entity* this) { - this->field_0x76.HWORD = 0xa0; - this->field_0x74.HWORD = 0xa0; - GET_HELPER(this)->fallingStonesTimer = 0; - if (GET_BOSS_PHASE(this) == 4) { - this->subAction = 4; +void OctorokBoss_Hit_SubAction0(OctorokBossEntity* this) { + this->unk_76 = 0xa0; + this->unk_74 = 0xa0; + this->heap->fallingStonesTimer = 0; + if (this->bossPhase == 4) { + super->subAction = 4; gUnk_02034490.unk0 = 1; sub_08078B48(); SoundReq(SFX_BOSS_DIE); } else { if (IS_FROZEN(this) == FALSE) { - this->type2 = 0; - GET_TIMER(this) = 0x3c; + super->type2 = 0; + this->timer = 0x3c; } else { - if (GET_HELPER(this)->tailCount > 3) { - GET_HELPER(this)->tailCount--; + if (this->heap->tailCount > 3) { + this->heap->tailCount--; } - GET_HELPER(this)->tailObjects[0]->field_0x7c.BYTES.byte1 = 0; - GET_TIMER(this) = 0x78; + this->heap->tailObjects[0]->currentAttack = 0; + this->timer = 0x78; } - this->subAction = 1; + super->subAction = 1; } } -void OctorokBoss_Hit_SubAction1(Entity* this) { +void OctorokBoss_Hit_SubAction1(OctorokBossEntity* this) { bool32 frozen = IS_FROZEN(this); u16 diffX; u16 diffY; if (frozen == 0) { - if (GET_HELPER(this)->tailObjects[0]->field_0x7c.BYTES.byte1 != 0) { - GET_HELPER(this)->tailObjects[0]->field_0x7c.BYTES.byte1--; + if (this->heap->tailObjects[0]->currentAttack != 0) { + this->heap->tailObjects[0]->currentAttack--; } // Move to the center of the screen before freezing - diffX = 0x108 + gRoomControls.origin_x - this->x.HALF.HI + 0x4; - diffY = gRoomControls.origin_y - this->y.HALF.HI + 0x8c; + diffX = 0x108 + gRoomControls.origin_x - super->x.HALF.HI + 0x4; + diffY = gRoomControls.origin_y - super->y.HALF.HI + 0x8c; if (diffX > 8 || diffY > 8) { - GET_HELPER(this)->field_0x2 = 1; + this->heap->field_0x2 = 1; #if defined(JP) || defined(DEMO_JP) || defined(EU) - this->direction = ((s32)sub_080045DA((((gRoomControls.origin_x + 0x108) << 0x10) - this->x.WORD), - (((gRoomControls.origin_y + 0x88) << 0x10) - this->y.WORD))) >> - 3; + super->direction = ((s32)sub_080045DA((((gRoomControls.origin_x + 0x108) << 0x10) - super->x.WORD), + (((gRoomControls.origin_y + 0x88) << 0x10) - super->y.WORD))) >> + 3; #else - this->direction = ((s32)sub_080045DA(gRoomControls.origin_x + 0x108 - this->x.HALF.HI, - gRoomControls.origin_y + 0x88 - this->y.HALF.HI)) >> - 3; + super->direction = ((s32)sub_080045DA(gRoomControls.origin_x + 0x108 - super->x.HALF.HI, + gRoomControls.origin_y + 0x88 - super->y.HALF.HI)) >> + 3; #endif - this->speed = 0x100; - ProcessMovement0(this); + super->speed = 0x100; + ProcessMovement0(super); } else { // Freeze - if (this->type2 == 0) { - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 5, 0); - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 5, 1); - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 5, 2); - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 5, 3); - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 5, 4); - this->type2 = 1; + if (super->type2 == 0) { + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 5, 0); + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 5, 1); + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 5, 2); + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 5, 3); + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 5, 4); + super->type2 = 1; } - GET_HELPER(this)->field_0x2 = frozen; - GET_TIMER(this)--; + this->heap->field_0x2 = frozen; + this->timer--; } } else { u32 i; - for (i = GET_HELPER(this)->tailCount - 1; i != 0; i--) { - Entity* tail = GET_HELPER(this)->tailObjects[i - 1]; - tail->spriteSettings.draw |= 1; + for (i = this->heap->tailCount - 1; i != 0; i--) { + OctorokBossEntity* tail = this->heap->tailObjects[i - 1]; + tail->base.spriteSettings.draw |= 1; } if ((gRoomTransition.frameCount & 2) != 0) { - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 6, 0); + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 6, 0); } - GET_TIMER(this)--; + this->timer--; } - if (GET_TIMER(this) == 0) { - this->subAction = 2; - GET_BOSS_PHASE(this)++; - UnloadGFXSlots(this); + if (this->timer == 0) { + super->subAction = 2; + this->bossPhase++; + UnloadGFXSlots(super); if (IS_FROZEN(this) == FALSE) { - this->hitType = 0x5f; - LoadFixedGFX(this, 0x108); - ChangeObjPalette(this, 0xef); + super->hitType = 0x5f; + LoadFixedGFX(super, 0x108); + ChangeObjPalette(super, 0xef); OctorokBoss_ChangePalette(this, 0xef); - InitAnimationForceUpdate(GET_HELPER(this)->tailObjects[0], 1); + InitAnimationForceUpdate(&(this->heap->tailObjects[0]->base), 1); } else { - this->hitType = 0x61; - LoadFixedGFX(this, 0x109); - ChangeObjPalette(this, 0xf0); + super->hitType = 0x61; + LoadFixedGFX(super, 0x109); + ChangeObjPalette(super, 0xf0); OctorokBoss_ChangePalette(this, 0xf3); - InitAnimationForceUpdate(GET_HELPER(this)->tailObjects[0], 2); + InitAnimationForceUpdate(&(this->heap->tailObjects[0]->base), 2); } - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 8, 0); + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 8, 0); } } -void OctorokBoss_Hit_SubAction2(Entity* this) { - if (GET_HELPER(this)->tailObjects[0]->field_0x7c.BYTES.byte1 != 0x80) { - GET_HELPER(this)->tailObjects[0]->field_0x7c.BYTES.byte1++; +void OctorokBoss_Hit_SubAction2(OctorokBossEntity* this) { + if (this->heap->tailObjects[0]->currentAttack != 0x80) { + this->heap->tailObjects[0]->currentAttack++; } else { - this->subAction = 3; - GET_TIMER(this) = 0x96; + super->subAction = 3; + this->timer = 0x96; gRoomControls.camera_target = &gPlayerEntity; } } -void OctorokBoss_Hit_SubAction3(Entity* this) { - if (GET_TIMER(this)-- == 0) { - this->health = OctorokBoss_HealthPerPhase[GET_BOSS_PHASE(this)]; - COLLISION_ON(this); - this->action = ACTION1; - this->subAction = ACTION1_AIMTOWARDSPLAYER; - GET_NEXT_ATTACK_INDEX(this) = 0; +void OctorokBoss_Hit_SubAction3(OctorokBossEntity* this) { + static const u8 OctorokBoss_HealthPerPhase[] = { + 3, 1, 3, 1, 3, 1, 3, 0, + }; + if (this->timer-- == 0) { + super->health = OctorokBoss_HealthPerPhase[this->bossPhase]; + COLLISION_ON(super); + super->action = ACTION1; + super->subAction = ACTION1_AIMTOWARDSPLAYER; + this->nextAttackIndex = 0; OctorokBoss_SetWaitTurnsForNextAttack(this); } } -void OctorokBoss_Hit_SubAction4(Entity* this) { +void OctorokBoss_Hit_SubAction4(OctorokBossEntity* this) { Entity* object; - this->subAction = 5; - object = CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 9, 0); + super->subAction = 5; + object = CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 9, 0); if (object != NULL) { gRoomControls.camera_target = object; } } -void OctorokBoss_Hit_SubAction5(Entity* this) { - this->subAction = 6; - GET_TIMER(this) = 0x78; - this->field_0x80.HALF.LO = 0; - this->field_0x82.HALF.LO = 0; +void OctorokBoss_Hit_SubAction5(OctorokBossEntity* this) { + super->subAction = 6; + this->timer = 0x78; + this->unk_80 = 0; + this->angularSpeed.HALF.LO = 0; } // Wildly rotating with explosion fx -void OctorokBoss_Hit_SubAction6(Entity* this) { +void OctorokBoss_Hit_SubAction6(OctorokBossEntity* this) { s16 tmp; - GET_ANGLE_HI(this) -= 4; - this->field_0x80.HALF.HI += 8; - if ((this->field_0x80.HALF.LO & 0x80) != 0) { - this->field_0x80.HALF.LO -= (Random() & 3); - if ((this->field_0x80.HALF.LO & 0x80) == 0) { - this->field_0x80.HALF.LO = ((this->field_0x80.HALF.LO & 0x80) << 0x18) >> 0x18; + this->angle.HALF.HI -= 4; + this->phase4AttackPattern += 8; + if ((this->unk_80 & 0x80) != 0) { + this->unk_80 -= (Random() & 3); + if ((this->unk_80 & 0x80) == 0) { + this->unk_80 = ((this->unk_80 & 0x80) << 0x18) >> 0x18; } } else { - this->field_0x80.HALF.LO += (Random() & 3); - if ((this->field_0x80.HALF.LO) >= 0x19) { - this->field_0x80.HALF.LO |= 0x80; + this->unk_80 += (Random() & 3); + if ((this->unk_80) >= 0x19) { + this->unk_80 |= 0x80; } } - tmp = FixedMul(gSineTable[this->field_0x80.HALF.HI], (this->field_0x80.HALF.LO & 0x7f) << 8); + tmp = FixedMul(gSineTable[this->phase4AttackPattern], (this->unk_80 & 0x7f) << 8); tmp = FixedDiv(tmp, 0x100); - this->spriteOffsetX = tmp >> 8; - tmp = FixedMul(gSineTable[this->field_0x80.HALF.HI + 0x40], (this->field_0x80.HALF.LO & 0x7f) * 0x100); + super->spriteOffsetX = tmp >> 8; + tmp = FixedMul(gSineTable[this->phase4AttackPattern + 0x40], (this->unk_80 & 0x7f) * 0x100); tmp = FixedDiv(tmp, 0x100); - this->spriteOffsetY = -((tmp << 0x10) >> 8) >> 0x10; - if (GET_TIMER(this) == 0) { + super->spriteOffsetY = -((tmp << 0x10) >> 8) >> 0x10; + if (this->timer == 0) { if ((gRoomTransition.frameCount & 0xfU) == 0) { // Explosion in the center - CreateFx(this, FX_GIANT_EXPLOSION3, 0); + CreateFx(super, FX_GIANT_EXPLOSION3, 0); // Explosion at the front right leg - CreateFx(GET_HELPER(this)->legObjects[0], FX_GIANT_EXPLOSION3, 0); + CreateFx(&this->heap->legObjects[0]->base, FX_GIANT_EXPLOSION3, 0); } - if (++this->field_0x82.HALF.LO == 0x79) { - GET_HELPER(this)->mouthObject->health = 1; + if (++this->angularSpeed.HALF.LO == 0x79) { + this->heap->mouthObject->base.health = 1; SoundReq(SFX_BOSS_DIE); // Kill this boss - GenericDeath(this); + GenericDeath(super); } } else { - GET_TIMER(this)--; + this->timer--; } } -void OctorokBoss_OnTick(Entity* this) { - OctorokBoss_Actions[this->action](this); - this->spriteRendering.b3 = 3; +void OctorokBoss_OnTick(OctorokBossEntity* this) { + static void (*const OctorokBoss_Actions[])(OctorokBossEntity*) = { + OctorokBoss_Init, OctorokBoss_Action1, OctorokBoss_Hit, OctorokBoss_Intro, OctorokBoss_Burning, + }; + + OctorokBoss_Actions[super->action](this); + super->spriteRendering.b3 = 3; } -ASM_FUNC("asm/non_matching/octorokBoss/OctorokBoss_Init.inc", void OctorokBoss_Init(Entity* this)) -/*{ +const u8 gUnk_080CF08C[] = { + 0, 4, 0, 0, 1, 5, 0, 0, 1, 4, 0, 0, 1, 3, 0, 0, 1, 2, 0, 0, 2, 1, 0, 0, 1, 1, 0, 0, 3, 6, 0, 0, +}; - // TODO where to use GET_HELPER(this) and where to use helper? - u32 leg; - u32 nextLeg; - u32 tail; - u32 nextTail; - HelperStruct* helper; +ASM_FUNC("asm/non_matching/octorokBoss/OctorokBoss_Init.inc", void OctorokBoss_Init(OctorokBossEntity* this)) - this->action = ACTION1; - this->spriteSettings.draw = 3; - switch (this->type) { - case WHOLE: - this->spritePriority.b0 = 4; - GET_BOSS_PHASE(this) = 0; - this->actionDelay = 1; - helper = (HelperStruct*)zMalloc(sizeof(HelperStruct)); - GET_HELPER(this) = helper; - if (helper == NULL) { - // Kill this boss - GenericDeath(this); - return; - } - this->myHeap = (u32*)helper; - GET_HELPER(this)->fallingStonesTimer = 0; - helper->field_0x0 = 2; - helper->field_0x2 = 0; - helper->tailCount = 5; - this->spriteRendering.b0 = 3; - this->field_0x6c.HALF.HI |= 1; - this->field_0x76.HWORD = 0xa0; - this->field_0x74.HWORD = 0xa0; - GET_ANGLE(this) = 0; - - // Create legs - leg = 0; - while (leg < 4) { - this->child = CreateEnemy(OCTOROK_BOSS, leg + 1); - if (this->child != NULL) { - CopyPosition(this, this->child); - this->child->parent = this; - GET_HELPER(this->child) = helper; - helper->legObjects[leg] = this->child; - } - leg = leg + 1; - } - - // Create mouth - this->child = CreateEnemy(OCTOROK_BOSS, MOUTH); - if (this->child != NULL) { - CopyPosition(this, this->child); - this->child->parent = this; - GET_HELPER(this->child) = GET_HELPER(this); - } - - // Create tail end - this->child = CreateEnemy(OCTOROK_BOSS, TAIL_END); - if (this->child != NULL) { - CopyPosition(this, this->child); - this->child->parent = this; - GET_HELPER(this->child) = helper; - GET_HELPER(this)->tailObjects[0] = this->child; - } - - // Create tails - tail = 0; - while (tail < 4) { - this->child = CreateEnemy(OCTOROK_BOSS, TAIL); - nextTail = tail + 1; - if (this->child != NULL) { - this->child->type2 = tail; - CopyPosition(this, this->child); - this->child->parent = this; - GET_HELPER(this->child) = helper; - helper->tailObjects[tail + 1] = this->child; - } - tail = nextTail; - } - - this->action = INTRO; - this->subAction = 0; - GET_TIMER(this) = 0x3c; - gPlayerEntity.spriteSettings.draw = 0; - gPlayerEntity.x.HALF.HI = this->x.HALF.HI; - gPlayerEntity.y.HALF.HI = this->y.HALF.HI - 0xa0; - gRoomControls.camera_target = this; - break; - - case LEG_BR: - case LEG_FR: - case LEG_FL: - case LEG_BL: - this->actionDelay = 0x10; - GET_TIMER(this) = 0; - if ((this->type & 2) == 0) { - this->field_0xf = 2; - } else { - this->field_0xf = 0xfe; - } - this->field_0x74.HWORD = 0x100; - if ((this->type & 1) == 0) { - this->field_0x76.HWORD = 0xff00; - } else { - this->field_0x76.HWORD = 0x100; - } - break; - - case MOUTH: - this->field_0x76.HWORD = 0x100; - this->field_0x74.HWORD = 0x100; - GET_TIMER(this) = 0x1c; - GET_HELPER(this)->mouthObject = this; - break; - - case TAIL_END: - this->field_0x76.HWORD = 0x100; - this->field_0x74.HWORD = 0x100; - this->spritePriority.b0 = 0; - GET_TIMER(this) = 0; - this->actionDelay = 0x10; - this->field_0xf = 1; - GET_TAIL_RADIUS(this) = 0x80; - break; - } - if (this->type != TAIL_END) { - InitializeAnimation(this, gUnk_080CF08C[this->type * 4]); - } else { - InitAnimationForceUpdate(this, gUnk_080CF08C[this->type * 4]); - } - OctorokBoss_Action1(this); -} -*/ - -void OctorokBoss_Intro(Entity* this) { +void OctorokBoss_Intro(OctorokBossEntity* this) { + static void (*const OctorokBoss_Intro_SubActions[])(OctorokBossEntity*) = { + OctorokBoss_Intro_SubAction0, OctorokBoss_Intro_SubAction1, OctorokBoss_Intro_SubAction2, + OctorokBoss_Intro_SubAction3, OctorokBoss_Intro_SubAction4, OctorokBoss_Intro_SubAction5, + }; sub_08078B48(); gUnk_02034490.unk0 = 1; sub_08036F60(this); - OctorokBoss_Intro_SubActions[this->subAction](this); - sub_0805EC9C(this, this->field_0x76.HWORD, this->field_0x74.HWORD, GET_ANGLE(this)); + OctorokBoss_Intro_SubActions[super->subAction](this); + sub_0805EC9C(super, this->unk_76, this->unk_74, this->angle.HWORD); } -void OctorokBoss_Intro_SubAction0(Entity* this) { +void OctorokBoss_Intro_SubAction0(OctorokBossEntity* this) { // Wait until the camera is on the Octorok - if (GET_TIMER(this)-- == 0) { - this->subAction = 1; - GET_ANGULAR_VEL(this) = 0x100; - GET_HELPER(this)->field_0x0 = 2; + if (this->timer-- == 0) { + super->subAction = 1; + this->angularSpeed.HWORD = 0x100; + this->heap->unk_0 = 2; } } -void OctorokBoss_Intro_SubAction1(Entity* this) { +void OctorokBoss_Intro_SubAction1(OctorokBossEntity* this) { // Rotate Octorok to player - if (GET_ANGLE_HI(this) == 0x80) { - GET_TIMER(this) = 0x3c; - this->subAction = 2; - GET_HELPER(this)->field_0x0 = 0; + if (this->angle.HALF.HI == 0x80) { + this->timer = 0x3c; + super->subAction = 2; + this->heap->unk_0 = 0; // Octorok scream SoundReq(SFX_159); } else { - GET_ANGLE(this) += GET_ANGULAR_VEL(this); + this->angle.HWORD += this->angularSpeed.HWORD; } OctorokBoss_StepSound(this, 0xf); } -void OctorokBoss_Intro_SubAction2(Entity* this) { +void OctorokBoss_Intro_SubAction2(OctorokBossEntity* this) { // Wait for scream end - if (GET_TIMER(this)-- == 0) { - this->subAction = 3; - GET_TIMER(this) = 0x3c; + if (this->timer-- == 0) { + super->subAction = 3; + this->timer = 0x3c; gPlayerEntity.spriteSettings.draw |= 1; gRoomControls.camera_target = &gPlayerEntity; gRoomControls.unk5 = 1; } } -void OctorokBoss_Intro_SubAction3(Entity* this) { +void OctorokBoss_Intro_SubAction3(OctorokBossEntity* this) { // Move the camera to the player - if (GET_TIMER(this)-- == 0) { + if (this->timer-- == 0) { // Move the player inside the arena gPlayerEntity.direction = 0x10; gPlayerEntity.animationState = 4; sub_08078AC0(0x1e, 0, 0); - GET_TIMER(this) = 0x3c; - this->subAction = 4; + this->timer = 0x3c; + super->subAction = 4; } } -void OctorokBoss_Intro_SubAction4(Entity* this) { - if (GET_TIMER(this)-- == 0) { - this->subAction = 5; - GET_TIMER(this) = 0x2d; +void OctorokBoss_Intro_SubAction4(OctorokBossEntity* this) { + if (this->timer-- == 0) { + super->subAction = 5; + this->timer = 0x2d; // Make the player look towards the exit gPlayerEntity.animationState = 0; } else { // Spawn exclamation bubble at a certain time - if (GET_TIMER(this) == 0x1e) { + if (this->timer == 0x1e) { CreateSpeechBubbleExclamationMark(&gPlayerEntity, 0xc, -0x18); } } } -void OctorokBoss_Intro_SubAction5(Entity* this) { +void OctorokBoss_Intro_SubAction5(OctorokBossEntity* this) { if (gPlayerEntity.animationState == 4) { - if (GET_TIMER(this)++ > 0x1e) { + if (this->timer++ > 0x1e) { // Play boss theme, enable control and switch to main action - this->action = ACTION1; - this->subAction = 0; + super->action = ACTION1; + super->subAction = 0; gRoomControls.unk5 = gPlayerEntity.animationState; OctorokBoss_SetAttackTimer(this); gUnk_02034490.unk0 = 0; SoundReq(BGM_BOSS_THEME); } } else { - if (GET_TIMER(this)-- == 0) { + if (this->timer-- == 0) { // Player looks back towards Octorok gPlayerEntity.animationState = 4; } } } -void OctorokBoss_Action1(Entity* this) { +void OctorokBoss_Action1(OctorokBossEntity* this) { + static void (*const OctorokBoss_Action1_SubActions[])(OctorokBossEntity*) = { + OctorokBoss_Action1_AimTowardsPlayer, OctorokBoss_Action1_WaitForTurn, OctorokBoss_Action1_ChargeAttack, + OctorokBoss_Action1_WaitForAttack, OctorokBoss_Action1_Attack, + }; + static const u8 OctorokBoss_LegAngleOffset[] = { + 40, + 80, + 176, + 216, + }; + static const u8 OctorokBoss_LegAngleOffset2[] = { + 128, + 0, + 0, + 128, + }; Entity* object; u32 radius; u8 angle; - if (this->type != WHOLE) { - this->iframes = this->parent->iframes; + if (super->type != WHOLE) { + super->iframes = super->parent->iframes; } - switch (this->type) { + switch (super->type) { case LEG_BR: case LEG_FR: case LEG_FL: case LEG_BL: - if ((this->parent->field_0x6c.HALF.HI & 2) != 0) { + if ((((OctorokBossEntity*)super->parent)->field_0x6c.HALF.HI & 2) != 0) { DeleteThisEntity(); } - if (GET_HELPER(this)->mouthObject->health == 1) { - if ((s16)this->field_0x76.HWORD < 0) { - this->field_0x76.HWORD -= 4; + if (this->heap->mouthObject->base.health == 1) { + if ((s16)this->unk_76 < 0) { + this->unk_76 -= 4; } else { - this->field_0x76.HWORD += 4; + this->unk_76 += 4; } - if ((s16)this->field_0x74.HWORD < 0) { - this->field_0x74.HWORD -= 4; + if ((s16)this->unk_74 < 0) { + this->unk_74 -= 4; } else { - this->field_0x74.HWORD += 4; + this->unk_74 += 4; } } - SortEntityBelow(this->parent, this); - if (((GET_HELPER(this)->field_0x2 != 0) || (this->parent->action == INTRO)) || - (1 < (u8)(this->parent->subAction - 3))) { - if ((s8)this->field_0xf < 0) { - this->field_0xf = -GET_HELPER(this)->field_0x0; + SortEntityBelow(super->parent, super); + if (((this->heap->field_0x2 != 0) || (super->parent->action == INTRO)) || + (1 < (u8)(super->parent->subAction - 3))) { + if ((s8)super->field_0xf < 0) { + super->field_0xf = -this->heap->unk_0; } else { - this->field_0xf = GET_HELPER(this)->field_0x0; + super->field_0xf = this->heap->unk_0; } sub_08036998(this); } - radius = 0x10000 / this->parent->field_0x76.HWORD; + radius = 0x10000 / ((OctorokBossEntity*)super->parent)->unk_76; radius = radius << 0xd >> 0x8; radius = radius - 0x2000; - if (GET_HELPER(this)->mouthObject->health == 1) { + if (this->heap->mouthObject->base.health == 1) { radius = radius + 0x2200; } else { radius = (radius >> 1) + 0x2200; } - angle = -(this->parent->field_0x7a.HALF.HI + OctorokBoss_LegAngleOffset[this->type - 1]); - sub_08036914(this, angle, radius); - GET_ANGLE_HI(this) = - this->parent->field_0x7a.HALF.HI + OctorokBoss_LegAngleOffset2[this->type - 1] + GET_TIMER(this); - sub_0805EC9C(this, this->field_0x76.HWORD, this->field_0x74.HWORD, GET_ANGLE(this)); + angle = -(((OctorokBossEntity*)super->parent)->angle.HALF.HI + OctorokBoss_LegAngleOffset[super->type - 1]); + sub_08036914(super, angle, radius); + this->angle.HALF.HI = ((OctorokBossEntity*)super->parent)->angle.HALF.HI + + OctorokBoss_LegAngleOffset2[super->type - 1] + this->timer; + sub_0805EC9C(super, this->unk_76, this->unk_74, this->angle.HWORD); break; case TAIL: - if (GET_HELPER(this)->mouthObject->health < 2) { + if (this->heap->mouthObject->base.health < 2) { DeleteThisEntity(); } - if ((GET_HELPER(this)->tailCount - 2) < this->type2) { + if ((this->heap->tailCount - 2) < super->type2) { DeleteThisEntity(); } - SortEntityAbove(this->parent, this); - if (GET_HELPER(this)->tailCount - 2 == this->type2) { - SortEntityAbove(this->parent, this); - radius = 0x10000 / this->parent->field_0x74.HWORD; + SortEntityAbove(super->parent, super); + if (this->heap->tailCount - 2 == super->type2) { + SortEntityAbove(super->parent, super); + radius = 0x10000 / ((OctorokBossEntity*)super->parent)->unk_74; radius = radius << 0xd >> 0x8; - angle = -this->parent->field_0x7a.HALF.HI; - sub_08036914(this, angle, radius); - GET_ANGLE_HI(this) = -this->parent->field_0x7a.HALF.HI; + angle = -((OctorokBossEntity*)super->parent)->angle.HALF.HI; + sub_08036914(super, angle, radius); + this->angle.HALF.HI = -((OctorokBossEntity*)super->parent)->angle.HALF.HI; } - if (IS_FROZEN(this->parent) == 0) { - this->spriteSettings.draw |= 1; + if (IS_FROZEN((OctorokBossEntity*)super->parent) == 0) { + super->spriteSettings.draw |= 1; } break; case TAIL_END: - if (GET_HELPER(this)->mouthObject->health < 2) { + if (this->heap->mouthObject->base.health < 2) { DeleteThisEntity(); } - UpdateAnimationSingleFrame(this); - if (IS_FROZEN(this->parent)) { + UpdateAnimationSingleFrame(super); + if (IS_FROZEN((OctorokBossEntity*)super->parent)) { sub_08036AF0(this, GET_TAIL_RADIUS(this), 0x10); - if ((this->bitfield & 0x7f) == 7) { - COLLISION_OFF(this); - object = CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 0, 0); - this->child = object; + if ((super->bitfield & 0x7f) == 7) { + COLLISION_OFF(super); + object = CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 0, 0); + super->child = object; if (object != NULL) { - object->parent = this->parent; - GET_HELPER(this->child) = GET_HELPER(this); + object->parent = super->parent; + ((OctorokBossEntity*)super->child)->heap = this->heap; } } } else { - COLLISION_ON(this); - this->spriteSettings.draw |= 1; + COLLISION_ON(super); + super->spriteSettings.draw |= 1; sub_08036998(this); sub_080369D0(this, GET_TAIL_RADIUS(this), 4); } - this->bitfield = 0; - sub_0805EC9C(this, this->field_0x76.HWORD, this->field_0x74.HWORD, -GET_ANGLE(this) ^ 0x8000); + super->bitfield = 0; + sub_0805EC9C(super, this->unk_76, this->unk_74, -this->angle.HWORD ^ 0x8000); break; case MOUTH: - if (this->health == 1) { - this->health = 0; + if (super->health == 1) { + super->health = 0; } else { - SortEntityBelow(this->parent, this); - if ((this->parent->subAction != 4) && (this->health != 1)) { - if (GET_TIMER(this) > 0x1c) { - GET_TIMER(this)--; + SortEntityBelow(super->parent, super); + if ((super->parent->subAction != 4) && (super->health != 1)) { + if (this->timer > 0x1c) { + this->timer--; } - if (this->field_0x76.HWORD > 0x100) { - this->field_0x76.HWORD--; + if (this->unk_76 > 0x100) { + this->unk_76--; } else { - this->field_0x76.HWORD = 0x100; + this->unk_76 = 0x100; } } - radius = 0x10000 / this->parent->field_0x74.HWORD; - radius = radius * (GET_TIMER(this) << 8) >> 8; - angle = -(this->parent->field_0x7a.HALF.HI + 0x80); - sub_08036914(this, angle, radius); + radius = 0x10000 / ((OctorokBossEntity*)super->parent)->unk_74; + radius = radius * (this->timer << 8) >> 8; + angle = -(((OctorokBossEntity*)super->parent)->angle.HALF.HI + 0x80); + sub_08036914(super, angle, radius); - GET_ANGLE_HI(this) = this->parent->field_0x7a.HALF.HI; - sub_0805EC9C(this, this->field_0x76.HWORD, this->field_0x74.HWORD, GET_ANGLE(this)); - sub_0800445C(this); + this->angle.HALF.HI = ((OctorokBossEntity*)super->parent)->angle.HALF.HI; + sub_0805EC9C(super, this->unk_76, this->unk_74, this->angle.HWORD); + sub_0800445C(super); } break; case WHOLE: - sub_0800445C(this); + sub_0800445C(super); sub_08036F60(this); - if (GET_HELPER(this)->fallingStonesTimer != 0) { - GET_HELPER(this)->fallingStonesTimer--; + if (this->heap->fallingStonesTimer != 0) { + this->heap->fallingStonesTimer--; if ((gRoomTransition.frameCount & 3) == 0) { // Falling stones - CreateProjectileWithParent(this, OCTOROK_BOSS_PROJECTILE, 3); + CreateProjectileWithParent(super, OCTOROK_BOSS_PROJECTILE, 3); } } - OctorokBoss_Action1_SubActions[this->subAction](this); - sub_0805EC9C(this, this->field_0x76.HWORD, this->field_0x74.HWORD, GET_ANGLE(this)); + OctorokBoss_Action1_SubActions[super->subAction](this); + sub_0805EC9C(super, this->unk_76, this->unk_74, this->angle.HWORD); break; } } -void OctorokBoss_Action1_AimTowardsPlayer(Entity* this) { +void OctorokBoss_Action1_AimTowardsPlayer(OctorokBossEntity* this) { s32 tmp1; s32 tmp2; - tmp1 = (u8)(sub_080045DA(gPlayerEntity.x.WORD - this->x.WORD, gPlayerEntity.y.WORD - this->y.WORD) - - (((u8)(-GET_ANGLE_HI(this)) ^ 0x80))); + tmp1 = (u8)(sub_080045DA(gPlayerEntity.x.WORD - super->x.WORD, gPlayerEntity.y.WORD - super->y.WORD) - + (((u8)(-this->angle.HALF.HI) ^ 0x80))); if (IS_FROZEN(this) == FALSE) { tmp2 = 8; } else { @@ -740,11 +580,11 @@ void OctorokBoss_Action1_AimTowardsPlayer(Entity* this) { } // Probably that the boss is aiming at the player? if (tmp1 > -tmp2 && tmp1 < tmp2) { - if (GET_PHASE4_ATTACK_PATTERN(this) != 0xff) { + if (this->phase4AttackPattern != 0xff) { OctorokBoss_SetAttackTimer(this); return; } - if (GET_ATTACK_WAIT_TURNS(this) == 0) { + if (this->attackWaitTurns == 0) { OctorokBoss_StartRegularAttack(this); } else { OctorokBoss_WaitAnotherTurn(this); // Resets to subaction1 @@ -752,22 +592,22 @@ void OctorokBoss_Action1_AimTowardsPlayer(Entity* this) { } else { // Rotate to face the player if ((u32)tmp1 > 0x80) { - GET_ANGLE(this) += GET_ANGULAR_VEL(this); - GET_HELPER(this)->rotation = ROTATION_CW; + this->angle.HWORD += this->angularSpeed.HWORD; + this->heap->rotation = ROTATION_CW; } else { - GET_ANGLE(this) -= GET_ANGULAR_VEL(this); - GET_HELPER(this)->rotation = ROTATION_CCW; + this->angle.HWORD -= this->angularSpeed.HWORD; + this->heap->rotation = ROTATION_CCW; } } - this->direction = (u8)(-GET_ANGLE_HI(this) ^ 0x80U) >> 3; + super->direction = (u8)(-this->angle.HALF.HI ^ 0x80U) >> 3; if (IS_FROZEN(this)) { - if (GET_ANGULAR_VEL(this) < 0x280) { - switch (GET_BOSS_PHASE(this)) { + if (this->angularSpeed.HWORD < 0x280) { + switch (this->bossPhase) { case 1: - GET_ANGULAR_VEL(this)++; + this->angularSpeed.HWORD++; break; case 3: - GET_ANGULAR_VEL(this) += 2; + this->angularSpeed.HWORD += 2; break; } } @@ -775,174 +615,186 @@ void OctorokBoss_Action1_AimTowardsPlayer(Entity* this) { OctorokBoss_StepSound(this, 0x1f); } -void OctorokBoss_Action1_WaitForTurn(Entity* this) { - if (((GET_TIMER(this)-- == 0) || (GET_BOSS_PHASE(this) == 0)) || (IS_FROZEN(this))) { - GET_ATTACK_WAIT_TURNS(this)--; +void OctorokBoss_Action1_WaitForTurn(OctorokBossEntity* this) { + if (((this->timer-- == 0) || (this->bossPhase == 0)) || (IS_FROZEN(this))) { + this->attackWaitTurns--; OctorokBoss_ResetToSubAction0(this); } else { - if (ProcessMovement0(this) == 0) { - GET_TIMER(this) = 0; + if (ProcessMovement0(super) == 0) { + this->timer = 0; } } OctorokBoss_StepSound(this, 0x1f); } -void OctorokBoss_Action1_WaitForAttack(Entity* this) { - if (GET_TIMER(this)-- == 0) { +void OctorokBoss_Action1_WaitForAttack(OctorokBossEntity* this) { + if (this->timer-- == 0) { OctorokBoss_SetWaitTurnsForNextAttack(this); } } // Charge forwards and let stones fall when a collision occurs. -void OctorokBoss_Action1_ChargeAttack(Entity* this) { +void OctorokBoss_Action1_ChargeAttack(OctorokBossEntity* this) { bool32 knockbackCondition; - if (GET_TIMER(this) == 0) { - ProcessMovement0(this); + if (this->timer == 0) { + ProcessMovement0(super); knockbackCondition = 0; - if ((this->direction != 0) && (this->direction != 0x10)) { - knockbackCondition = ((u32)this->collisions & 0xee00) != 0; + if ((super->direction != 0) && (super->direction != 0x10)) { + knockbackCondition = ((u32)super->collisions & 0xee00) != 0; } - if (((this->direction != 0x18) && (this->direction != 8)) && ((this->collisions & 0xee) != 0)) { + if (((super->direction != 0x18) && (super->direction != 8)) && ((super->collisions & 0xee) != 0)) { knockbackCondition = 1; } if (knockbackCondition != 0) { - this->knockbackDuration = 0x20; - this->knockbackSpeed = 0x200; - this->knockbackDirection = this->direction ^ 0x10; - GET_HELPER(this)->fallingStonesTimer += 0x3c; + super->knockbackDuration = 0x20; + super->knockbackSpeed = 0x200; + super->knockbackDirection = super->direction ^ 0x10; + this->heap->fallingStonesTimer += 0x3c; OctorokBoss_SetAttackTimer(this); InitScreenShake(0x3c, 0); SoundReq(SFX_158); SoundReq(SFX_14C); } } else { - GET_TIMER(this)--; + this->timer--; } OctorokBoss_StepSound(this, 0xf); } -void OctorokBoss_Action1_Attack(Entity* this) { - OctorokBoss_Action1_Attack_Type2s[this->type2](this); +void OctorokBoss_Action1_Attack(OctorokBossEntity* this) { + static void (*const OctorokBoss_Action1_Attack_Type2s[])(OctorokBossEntity*) = { + OctorokBoss_Action1_Attack_Type2_0, + OctorokBoss_Action1_Attack_Type2_1, + OctorokBoss_Action1_Attack_Type2_2, + OctorokBoss_Action1_Attack_Type2_3, + }; + OctorokBoss_Action1_Attack_Type2s[super->type2](this); sub_08036FE4(this); - if (this->field_0x80.HALF.LO != 0) { + if (this->unk_80 != 0) { gPlayerEntity.spriteSettings.draw = 0; gPlayerEntity.flags &= ~ENT_COLLIDE; gPlayerEntity.collisionLayer = 2; sub_08078B48(); sub_08077B20(); - gPlayerEntity.parent = this; - sub_08036914(&gPlayerEntity, (u8) - (GET_ANGLE_HI(this) + 0x80), 0x3800); + gPlayerEntity.parent = super; + sub_08036914(&gPlayerEntity, (u8) - (this->angle.HALF.HI + 0x80), 0x3800); } } -void OctorokBoss_Action1_Attack_Type2_0(Entity* this) { - if (GET_CURRENT_ATTACK(this) == NO_ATTACK) { +void OctorokBoss_Action1_Attack_Type2_0(OctorokBossEntity* this) { + if (this->currentAttack == NO_ATTACK) { OctorokBoss_ResetToSubAction0(this); } else { - GET_ANGULAR_VEL(this) = 0x100; - this->type2 = 1; + this->angularSpeed.HWORD = 0x100; + super->type2 = 1; if (IS_FROZEN(this) == FALSE) { - GET_TIMER(this) = 0x16; + this->timer = 0x16; } else { - GET_TIMER(this) = 0; + this->timer = 0; } SoundReq(SFX_155); } } -void OctorokBoss_Action1_Attack_Type2_1(Entity* this) { - if (this->field_0x74.HWORD < 0xc0) { - this->field_0x74.HWORD++; +void OctorokBoss_Action1_Attack_Type2_1(OctorokBossEntity* this) { + if (this->unk_74 < 0xc0) { + this->unk_74++; } else { - if (GET_TIMER(this)-- == 0) { - if (GET_CURRENT_ATTACK(this) == ATTACK_VACUUM) { - this->type2 = 3; + if (this->timer-- == 0) { + if (this->currentAttack == ATTACK_VACUUM) { + super->type2 = 3; if (IS_FROZEN(this)) { - GET_TIMER(this) = 0x3c; + this->timer = 0x3c; } else { - GET_TIMER(this) = 0x78; + this->timer = 0x78; } - GET_HELPER(this)->targetAngle = GET_ANGLE_HI(this); + this->heap->targetAngle = this->angle.HALF.HI; } else { - this->type2 = 2; - GET_TIMER(this) = 0x2d; + super->type2 = 2; + this->timer = 0x2d; } SoundReq(SFX_155); } } } -void OctorokBoss_Action1_Attack_Type2_2(Entity* this) { - if (GET_TIMER(this) == 0) { - if (this->field_0x76.HWORD < this->field_0x74.HWORD) { - this->field_0x74.HWORD -= 8; +void OctorokBoss_Action1_Attack_Type2_2(OctorokBossEntity* this) { + if (this->timer == 0) { + if (this->unk_76 < this->unk_74) { + this->unk_74 -= 8; return; } - this->type2 = 3; - this->field_0x74.HWORD = this->field_0x76.HWORD; - if (GET_CURRENT_ATTACK(this) != ATTACK_SMOKE) { - GET_TIMER(this) = 0x3c; + super->type2 = 3; + this->unk_74 = this->unk_76; + if (this->currentAttack != ATTACK_SMOKE) { + this->timer = 0x3c; } else { - GET_TIMER(this) = 0; - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 4, 0); + this->timer = 0; + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 4, 0); } } else { - GET_TIMER(this)--; + this->timer--; } } -void OctorokBoss_Action1_Attack_Type2_3(Entity* this) { +void OctorokBoss_Action1_Attack_Type2_3(OctorokBossEntity* this) { + static void (*const OctorokBoss_AttackFunctions[])(OctorokBossEntity*) = { + OctorokBoss_ExecuteAttackSpitRock, + OctorokBoss_ExecuteAttackVacuum, + OctorokBoss_ExecuteAttackSmoke, + OctorokBoss_ExecuteAttackFreeze, + }; if ((gRoomTransition.frameCount & 2) != 0) { - GET_HELPER(this)->mouthObject->field_0x76.HWORD -= 8; + this->heap->mouthObject->unk_76 -= 8; } else { - GET_HELPER(this)->mouthObject->field_0x76.HWORD += 8; - if (0x180 < GET_HELPER(this)->mouthObject->field_0x76.HWORD) { - GET_HELPER(this)->mouthObject->field_0x76.HWORD = 0x180; + this->heap->mouthObject->unk_76 += 8; + if (0x180 < this->heap->mouthObject->unk_76) { + this->heap->mouthObject->unk_76 = 0x180; } } - if (GET_CURRENT_ATTACK(this) != ATTACK_VACUUM) { - if (GET_HELPER(this)->mouthObject->field_0x78.HALF.HI < 0x20) { - GET_HELPER(this)->mouthObject->field_0x78.HALF.HI++; - GET_HELPER(this)->mouthObject->field_0x76.HWORD += 8; + if (this->currentAttack != ATTACK_VACUUM) { + if (this->heap->mouthObject->timer < 0x20) { + this->heap->mouthObject->timer++; + this->heap->mouthObject->unk_76 += 8; } } - OctorokBoss_AttackFunctions[GET_CURRENT_ATTACK(this)](this); + OctorokBoss_AttackFunctions[this->currentAttack](this); } -void OctorokBoss_ExecuteAttackSpitRock(Entity* this) { - this->child = CreateProjectileWithParent(this, OCTOROK_BOSS_PROJECTILE, 0); - if (this->child != NULL) { - this->child->parent = this; - this->child->direction = ((u8)-GET_ANGLE_HI(this) ^ 0x80); +void OctorokBoss_ExecuteAttackSpitRock(OctorokBossEntity* this) { + super->child = CreateProjectileWithParent(super, OCTOROK_BOSS_PROJECTILE, 0); + if (super->child != NULL) { + super->child->parent = super; + super->child->direction = ((u8) - this->angle.HALF.HI ^ 0x80); } - GET_HELPER(this)->mouthObject->field_0x78.HALF.HI++; + this->heap->mouthObject->timer++; OctorokBoss_SetAttackTimer(this); } -void OctorokBoss_ExecuteAttackVacuum(Entity* this) { +void OctorokBoss_ExecuteAttackVacuum(OctorokBossEntity* this) { s32 tmp; - if (this->field_0x80.HALF.LO == 0) { - this->direction = sub_080045DA(gPlayerEntity.x.WORD - this->x.WORD, gPlayerEntity.y.WORD - this->y.WORD); - tmp = ((u8) - (GET_ANGLE_HI(this) + 0x80)) - this->direction; + if (this->unk_80 == 0) { + super->direction = sub_080045DA(gPlayerEntity.x.WORD - super->x.WORD, gPlayerEntity.y.WORD - super->y.WORD); + tmp = ((u8) - (this->angle.HALF.HI + 0x80)) - super->direction; if (tmp < 0) { tmp = -tmp; } if (tmp < 0x10) { - if (sub_0806FC80(this, &gPlayerEntity, 0xf0) != 0) { + if (sub_0806FC80(super, &gPlayerEntity, 0xf0) != 0) { if ((gPlayerState.flags & PL_FROZEN) == 0) { if ((gPlayerEntity.flags & PL_MINISH) != 0) { - LinearMoveAngle(&gPlayerEntity, 0x280, -GET_ANGLE_HI(this)); - if (sub_0806FC80(this, &gPlayerEntity, 0x48) != 0) { - this->field_0x80.HALF.LO = 1; - GET_TIMER(this) = 2; - GET_HELPER(this)->targetAngle = - sub_080045DA((gRoomControls.origin_x + 0x108) * 0x10000 - this->x.WORD, - (gRoomControls.origin_y + 0x88) * 0x10000 - this->y.WORD); - GET_HELPER(this)->targetAngle = (u8) - (GET_HELPER(this)->targetAngle + 0x80); + LinearMoveAngle(&gPlayerEntity, 0x280, -this->angle.HALF.HI); + if (sub_0806FC80(super, &gPlayerEntity, 0x48) != 0) { + this->unk_80 = 1; + this->timer = 2; + this->heap->targetAngle = + sub_080045DA((gRoomControls.origin_x + 0x108) * 0x10000 - super->x.WORD, + (gRoomControls.origin_y + 0x88) * 0x10000 - super->y.WORD); + this->heap->targetAngle = (u8) - (this->heap->targetAngle + 0x80); SoundReq(SFX_ED); } } @@ -952,167 +804,172 @@ void OctorokBoss_ExecuteAttackVacuum(Entity* this) { } } if ((gRoomTransition.frameCount & 3) == 0) { - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 2, 0); + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 2, 0); } } else { - if ((IS_FROZEN(this)) || (GET_HELPER(this)->targetAngle == GET_ANGLE_HI(this))) { - if (this->field_0x80.HALF.LO == 1) { - this->field_0x80.HALF.LO = 2; - this->type2 = 2; - GET_TIMER(this) = 0x2d; - GET_ANGULAR_VEL(this) = 0x100; - GET_HELPER(this)->field_0x2 = 0; + if ((IS_FROZEN(this)) || (this->heap->targetAngle == this->angle.HALF.HI)) { + if (this->unk_80 == 1) { + this->unk_80 = 2; + super->type2 = 2; + this->timer = 0x2d; + this->angularSpeed.HWORD = 0x100; + this->heap->field_0x2 = 0; return; } - this->field_0x80.HALF.LO = 0; - GET_ANGULAR_VEL(this) = 0x100; - GET_HELPER(this)->mouthObject->field_0x78.HALF.HI++; + this->unk_80 = 0; + this->angularSpeed.HWORD = 0x100; + this->heap->mouthObject->timer++; gPlayerEntity.spriteSettings.draw = 1; gPlayerEntity.flags &= ~ENT_COLLIDE; gPlayerEntity.collisionLayer = 1; - sub_080792BC(0x400, (u32)(-(GET_ANGLE_HI(this) + 0x80) * 0x1000000) >> 0x1b, 0x30); + sub_080792BC(0x400, (u32)(-(this->angle.HALF.HI + 0x80) * 0x1000000) >> 0x1b, 0x30); OctorokBoss_SetAttackTimer(this); SoundReq(SFX_EF); return; } - GET_TIMER(this) = 2; + this->timer = 2; } - if (GET_TIMER(this) == 0) { - this->field_0x74.HWORD = this->field_0x76.HWORD; - this->type2 = 0; + if (this->timer == 0) { + this->unk_74 = this->unk_76; + super->type2 = 0; OctorokBoss_SetAttackTimer(this); } else { - GET_TIMER(this)--; - if ((gPlayerState.flags == PL_FROZEN) && (GET_TIMER(this) == 0x3c)) { - tmp = sub_080045DA(gPlayerEntity.x.WORD - this->x.WORD, gPlayerEntity.y.WORD - this->y.WORD); - if ((u8)((tmp - ((u8)-GET_ANGLE_HI(this) ^ 0x80))) > 0x80) { - GET_HELPER(this)->targetAngle = GET_ANGLE_HI(this) + 0x30; + this->timer--; + if ((gPlayerState.flags == PL_FROZEN) && (this->timer == 0x3c)) { + tmp = sub_080045DA(gPlayerEntity.x.WORD - super->x.WORD, gPlayerEntity.y.WORD - super->y.WORD); + if ((u8)((tmp - ((u8) - this->angle.HALF.HI ^ 0x80))) > 0x80) { + this->heap->targetAngle = this->angle.HALF.HI + 0x30; } else { - GET_HELPER(this)->targetAngle = GET_ANGLE_HI(this) - 0x30; + this->heap->targetAngle = this->angle.HALF.HI - 0x30; } } if (IS_FROZEN(this) == FALSE) { - if (GET_HELPER(this)->targetAngle != GET_ANGLE_HI(this)) { - GET_HELPER(this)->field_0x2 = 1; - if ((u8)(GET_HELPER(this)->targetAngle - GET_ANGLE_HI(this)) > 0x80) { - GET_ANGLE(this) -= GET_ANGULAR_VEL(this); + if (this->heap->targetAngle != this->angle.HALF.HI) { + this->heap->field_0x2 = 1; + if ((u8)(this->heap->targetAngle - this->angle.HALF.HI) > 0x80) { + this->angle.HWORD -= this->angularSpeed.HWORD; } else { - GET_ANGLE(this) += GET_ANGULAR_VEL(this); + this->angle.HWORD += this->angularSpeed.HWORD; } } else { - GET_HELPER(this)->field_0x2 = IS_FROZEN(this); + this->heap->field_0x2 = IS_FROZEN(this); } } } } -void OctorokBoss_ExecuteAttackSmoke(Entity* this) { - if (GET_TIMER(this) == 0xff) { - this->type2 = 0; +void OctorokBoss_ExecuteAttackSmoke(OctorokBossEntity* this) { + if (this->timer == 0xff) { + super->type2 = 0; OctorokBoss_SetAttackTimer(this); - GET_TIMER(this) = 0x78; + this->timer = 0x78; } else { - GET_TIMER(this)++; + this->timer++; ChangeLightLevel(-1); if ((gRoomTransition.frameCount & 3) == 0) { if ((gRoomTransition.frameCount & 7) == 0) { SoundReq(SFX_124); } - CreateObjectWithParent(this, OCTOROK_BOSS_OBJECT, 3, 0); + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 3, 0); } } } -void OctorokBoss_ExecuteAttackFreeze(Entity* this) { - if (GET_TIMER(this) == 0) { - GET_HELPER(this)->field_0x2 = 0; +void OctorokBoss_ExecuteAttackFreeze(OctorokBossEntity* this) { + if (this->timer == 0) { + this->heap->field_0x2 = 0; OctorokBoss_SetAttackTimer(this); } else { - GET_TIMER(this)--; + this->timer--; if ((gRoomTransition.frameCount & 3) == 0) { - this->child = CreateProjectileWithParent(this, OCTOROK_BOSS_PROJECTILE, 2); - if (this->child != NULL) { - this->child->parent = this; - this->child->direction = (u8)-GET_ANGLE_HI(this) ^ 0x80; + super->child = CreateProjectileWithParent(super, OCTOROK_BOSS_PROJECTILE, 2); + if (super->child != NULL) { + super->child->parent = super; + super->child->direction = (u8) - this->angle.HALF.HI ^ 0x80; } } } } -void OctorokBoss_Burning(Entity* this) { - OctorokBoss_Burning_SubActions[this->subAction](this); - if (GET_HELPER(this)->fallingStonesTimer != 0) { - GET_HELPER(this)->fallingStonesTimer--; +void OctorokBoss_Burning(OctorokBossEntity* this) { + static void (*const OctorokBoss_Burning_SubActions[])(OctorokBossEntity*) = { + OctorokBoss_Burning_SubAction0, + OctorokBoss_Burning_SubAction1, + OctorokBoss_Burning_SubAction2, + }; + OctorokBoss_Burning_SubActions[super->subAction](this); + if (this->heap->fallingStonesTimer != 0) { + this->heap->fallingStonesTimer--; if ((gRoomTransition.frameCount & 7) == 0) { // Falling stones - CreateProjectileWithParent(this, OCTOROK_BOSS_PROJECTILE, 3); + CreateProjectileWithParent(super, OCTOROK_BOSS_PROJECTILE, 3); } } - sub_0805EC9C(this, this->field_0x76.HWORD, this->field_0x74.HWORD, GET_ANGLE(this)); + sub_0805EC9C(super, this->unk_76, this->unk_74, this->angle.HWORD); } -void OctorokBoss_Burning_SubAction0(Entity* this) { - this->subAction = 1; - this->speed = 0x200; - this->collisions = 0; - this->direction = (u8)(-GET_ANGLE_HI(this) ^ 0x80U) >> 3; - GET_TIMER(this) = 0x78; - GET_ANGULAR_VEL(this) = 0x180; - GET_HELPER(this)->field_0x0 = 4; +void OctorokBoss_Burning_SubAction0(OctorokBossEntity* this) { + super->subAction = 1; + super->speed = 0x200; + super->collisions = 0; + super->direction = (u8)(-this->angle.HALF.HI ^ 0x80U) >> 3; + this->timer = 0x78; + this->angularSpeed.HWORD = 0x180; + this->heap->unk_0 = 4; sub_080368D8(this); OctorokBoss_Burning_SubAction1(this); } -void OctorokBoss_Burning_SubAction1(Entity* this) { - ProcessMovement0(this); - if (this->collisions != 0) { - this->subAction = 2; - GET_HELPER(this)->targetAngle = GET_ANGLE_HI(this); - if ((this->collisions & 0xee00) != 0) { - GET_HELPER(this)->targetAngle = -GET_HELPER(this)->targetAngle; +void OctorokBoss_Burning_SubAction1(OctorokBossEntity* this) { + ProcessMovement0(super); + if (super->collisions != 0) { + super->subAction = 2; + this->heap->targetAngle = this->angle.HALF.HI; + if ((super->collisions & 0xee00) != 0) { + this->heap->targetAngle = -this->heap->targetAngle; } - if ((this->collisions & 0xee) != 0) { - GET_HELPER(this)->targetAngle = -GET_HELPER(this)->targetAngle ^ 0x80; + if ((super->collisions & 0xee) != 0) { + this->heap->targetAngle = -this->heap->targetAngle ^ 0x80; } - this->knockbackDuration = 0x18; - this->knockbackSpeed = 0x200; - this->knockbackDirection = this->direction ^ 0x10; - GET_HELPER(this)->fallingStonesTimer += 0x1e; + super->knockbackDuration = 0x18; + super->knockbackSpeed = 0x200; + super->knockbackDirection = super->direction ^ 0x10; + this->heap->fallingStonesTimer += 0x1e; InitScreenShake(0x1e, 0); SoundReq(SFX_158); SoundReq(SFX_14C); } - if (GET_TIMER(this)-- == 0) { - this->health = 0; + if (this->timer-- == 0) { + super->health = 0; } if ((gRoomTransition.frameCount & 0x1f) == 0) { SoundReq(SFX_159); } } -void OctorokBoss_Burning_SubAction2(Entity* this) { - if ((u32)(GET_HELPER(this)->targetAngle - GET_ANGLE_HI(this) + 7) < 0xf) { - this->subAction = 1; - this->direction = ((u8)-GET_ANGLE_HI(this) ^ 0x80) >> 3; - this->collisions = 0; - ProcessMovement0(this); +void OctorokBoss_Burning_SubAction2(OctorokBossEntity* this) { + if ((u32)(this->heap->targetAngle - this->angle.HALF.HI + 7) < 0xf) { + super->subAction = 1; + super->direction = ((u8) - this->angle.HALF.HI ^ 0x80) >> 3; + super->collisions = 0; + ProcessMovement0(super); } else { - if ((u8)(GET_HELPER(this)->targetAngle - GET_ANGLE_HI(this)) >= 0x81) { - GET_ANGLE(this) -= GET_ANGULAR_VEL(this); + if ((u8)(this->heap->targetAngle - this->angle.HALF.HI) >= 0x81) { + this->angle.HWORD -= this->angularSpeed.HWORD; } else { - GET_ANGLE(this) += GET_ANGULAR_VEL(this); + this->angle.HWORD += this->angularSpeed.HWORD; } } } -void sub_080368D8(Entity* this) { - if (this->field_0x80.HALF.LO != 0) { +void sub_080368D8(OctorokBossEntity* this) { + if (this->unk_80 != 0) { gPlayerEntity.spriteSettings.draw = 1; gPlayerEntity.flags |= ENT_COLLIDE; gPlayerEntity.collisionLayer = 1; } - this->field_0x76.HWORD = 0xa0; - this->field_0x74.HWORD = 0xa0; + this->unk_76 = 0xa0; + this->unk_74 = 0xa0; } void sub_08036914(Entity* this, s32 angle, s32 radius) { @@ -1128,245 +985,198 @@ void sub_08036914(Entity* this, s32 angle, s32 radius) { this->spriteOffsetY = this->parent->spriteOffsetY; } -NONMATCH("asm/non_matching/octorokBoss/sub_08036998.inc", void sub_08036998(Entity* this)) { +NONMATCH("asm/non_matching/octorokBoss/sub_08036998.inc", void sub_08036998(OctorokBossEntity* this)) { u32 tmp; s8* tmp2; s8 tmp3; s32 a, b; // TODO regalloc in this awful structure here - tmp2 = &GET_TIMER(this); - tmp = this->field_0xf + (u8)*tmp2; + tmp2 = &this->timer; + tmp = super->field_0xf + (u8)*tmp2; *tmp2 = tmp; - if ((s8)this->field_0xf < 0) { + if ((s8)super->field_0xf < 0) { a = tmp; - b = -this->actionDelay; + b = -super->actionDelay; if (a << 0x18 < b << 0x18) { - this->field_0xf = -this->field_0xf; + super->field_0xf = -super->field_0xf; } } else { - if (((s8)*tmp2) > ((s32)this->actionDelay)) { - this->field_0xf = -this->field_0xf; + if (((s8)*tmp2) > ((s32)super->actionDelay)) { + super->field_0xf = -super->field_0xf; } } } END_NONMATCH -// Calculate tail angles regular -ASM_FUNC("asm/non_matching/octorokBoss/sub_080369D0.inc", void sub_080369D0(Entity* this, s32 radius, s32 angleSpeed)) -/*{ - s16 r1; - s32 iVar7; +/** Calculate tail angles regular */ +ASM_FUNC("asm/non_matching/octorokBoss/sub_080369D0.inc", + void sub_080369D0(OctorokBossEntity* this, s32 radius, s32 angleSpeed)) - u32 index; - s32 tmp; +/** Calculate tail angles frozen sub_08036AF0 */ +ASM_FUNC("asm/non_matching/octorokBoss/sub_08036AF0.inc", + void sub_08036AF0(OctorokBossEntity* this, s32 radius, s32 angleSpeed)) - s16 angleDiff; - Entity** tailObj; +void OctorokBoss_SetAttackTimer(OctorokBossEntity* this) { + // These attack timers are only used if the boss isn't frozen and gRoomVars.field_0xc != 0x100 + static const u8 OctorokBoss_AttackTimerWeights[] = { + 48, + 96, + 80, + 32, + }; + static const u8 OctorokBoss_AttackTimerValues[] = { + 5, + 10, + 15, + 30, + }; - HelperStruct* helper = GET_HELPER(this); + // 5: don't attack + static const u8 OctorokBoss_Phase4AttackPattern0[] = { + ATTACK_SPITROCK, NO_ATTACK, ATTACK_SPITROCK, ATTACK_SMOKE, END_OF_ATTACK_PATTERN, + }; + static const u8 OctorokBoss_Phase4AttackPattern1[] = { + ATTACK_VACUUM, NO_ATTACK, ATTACK_SPITROCK, ATTACK_SMOKE, END_OF_ATTACK_PATTERN, + }; + static const u8 OctorokBoss_Phase4AttackPattern2[] = { + ATTACK_SPITROCK, NO_ATTACK, ATTACK_SPITROCK, NO_ATTACK, ATTACK_SPITROCK, END_OF_ATTACK_PATTERN, + }; - // Calculate the angle for the tail end - helper->tailObjects[0]->field_0x7a.HALF.HI = - helper->tailObjects[helper->tailCount - 1]->field_0x7a.HALF.HI + GET_TIMER(this); - - // iterate tails from 0 to tailCount-1 to calculate the angles - for (index = 0; index < helper->tailCount - 1; index++) { - if (helper->tailObjects[index]->field_0x7a.HALF.HI != helper->tailObjects[index + 1]->field_0x7a.HALF.HI) { - angleDiff = - helper->tailObjects[index + 1]->field_0x7a.HALF.HI - helper->tailObjects[index]->field_0x7a.HALF.HI; - if (angleDiff >= 1) { - if ((s8)-angleSpeed > angleDiff) { - helper->tailObjects[index + 1]->field_0x7a.HALF.HI = - helper->tailObjects[index]->field_0x7a.HALF.HI + angleSpeed; - } - } else { - if ((u8)angleSpeed < angleDiff) { - helper->tailObjects[index + 1]->field_0x7a.HALF.HI = - helper->tailObjects[index]->field_0x7a.HALF.HI - angleSpeed; - } - } - } - } - - // iterate tails from tailCount-1 to 0 to calculate the positions - index = helper->tailCount - 1; - tailObj = &helper->tailObjects[index]; - while (index != 0) { - // r1 = (s16)((u32)(radius << 0x14) >> 0x10); - index--; - tmp = FixedMul(gSineTable[(*tailObj)->prev->field_0x7a.HALF.HI ^ 0x80], radius); - tmp = FixedDiv(tmp, 0x100); - (*tailObj)->prev->x.WORD = (*tailObj)->next->x.WORD + ((tmp << 0x10) >> 8); - tmp = FixedMul(gSineTable[((*tailObj)->prev->field_0x7a.HALF.HI ^ 0x80) + 0x40], radius); - tmp = FixedDiv(tmp, 0x100); - (*tailObj)->prev->y.WORD = (*tailObj)->next->y.WORD - ((tmp << 0x10) >> 8); - tailObj--; - } -}*/ - -// calculate tail angles frozen sub_08036AF0 -ASM_FUNC("asm/non_matching/octorokBoss/sub_08036AF0.inc", void sub_08036AF0(Entity* this, s32 radius, s32 angleSpeed)) -/*{ - u8 bVar1; - u8 cVar2; - s16 _newY; - Entity** tailObjects; - u32 uVar5; - - s16 angleDiff; - s16 tmp; - u32 index; - Entity* prevTailObject; - Entity* currentTailObject; - HelperStruct* helper; - - helper = GET_HELPER(this); - for (index = helper->tailCount - 1; index != 0; index--) { - if (angleSpeed == 0) { - if (radius >= sub_080041DC(helper->tailObjects[index], helper->tailObjects[index - 1]->x.HALF.HI, - helper->tailObjects[index - 1]->y.HALF.HI)) { - return; - } else { - helper->tailObjects[index - 1]->field_0x7a.HALF.HI = - sub_080045DA(helper->tailObjects[index - 1]->x.WORD - helper->tailObjects[index]->x.WORD, - helper->tailObjects[index - 1]->y.WORD - helper->tailObjects[index]->y.WORD); - - tmp = FixedMul(gSineTable[helper->tailObjects[index - 1]->field_0x7a.HALF.HI], radius); - tmp = FixedDiv(tmp, 0x100); - helper->tailObjects[index - 1]->x.WORD = helper->tailObjects[index]->x.WORD + (((s32)tmp << 0x10) >> 8); - tmp = FixedMul(gSineTable[helper->tailObjects[index - 1]->field_0x7a.HALF.HI + 0x40], radius); - helper->tailObjects[index - 1]->y.WORD = - helper->tailObjects[index]->y.WORD - ((FixedDiv(tmp, 0x100) << 0x10) >> 8); - } - } else { - if (helper->tailObjects[index - 1]->field_0x7a.HALF.HI != helper->tailObjects[index]->field_0x7a.HALF.HI) { - angleDiff = ((helper->tailObjects[index]->field_0x7a.HALF.HI - - helper->tailObjects[index - 1]->field_0x7a.HALF.HI) * - 0x1000000) >> - 0x18; - if (angleDiff >= 1) { - if ((u8)angleSpeed > angleDiff) { - helper->tailObjects[index - 1]->field_0x7a.HALF.HI = - helper->tailObjects[index]->field_0x7a.HALF.HI - angleSpeed; - } - } else { - if ((s8)-angleSpeed < angleDiff) { - helper->tailObjects[index - 1]->field_0x7a.HALF.HI = - helper->tailObjects[index]->field_0x7a.HALF.HI + angleSpeed; - } - } - } - tmp = FixedMul(gSineTable[helper->tailObjects[index - 1]->field_0x7a.HALF.HI], radius); - tmp = FixedDiv(tmp, 0x100); - helper->tailObjects[index - 1]->x.WORD = helper->tailObjects[index]->x.WORD + ((tmp << 0x10) >> 8); - tmp = FixedMul(gSineTable[helper->tailObjects[index - 1]->field_0x7a.HALF.HI + 0x40], radius); - helper->tailObjects[index - 1]->y.WORD = - helper->tailObjects[index]->y.WORD - ((FixedDiv(tmp, 0x100) << 0x10) >> 8); - } - } -}*/ - -void OctorokBoss_SetAttackTimer(Entity* this) { + static const u8* const OctorokBoss_Phase4AttackPatterns[] = { + OctorokBoss_Phase4AttackPattern0, + OctorokBoss_Phase4AttackPattern1, + OctorokBoss_Phase4AttackPattern2, + OctorokBoss_Phase4AttackPattern1, + }; const u8* attackPatterns; - if ((GET_BOSS_PHASE(this) == 4) && (GET_PHASE4_ATTACK_PATTERN(this) != 0xff)) { - this->subAction = ACTION1_ATTACK; - this->type2 = 0; - this->field_0x80.HALF.LO = 0; - attackPatterns = OctorokBoss_Phase4AttackPatterns[GET_PHASE4_ATTACK_PATTERN(this)]; - GET_CURRENT_ATTACK(this) = attackPatterns[GET_NEXT_ATTACK_INDEX(this)]; - GET_NEXT_ATTACK_INDEX(this) += 1; - if (GET_CURRENT_ATTACK(this) != END_OF_ATTACK_PATTERN) { + if ((this->bossPhase == 4) && (this->phase4AttackPattern != 0xff)) { + super->subAction = ACTION1_ATTACK; + super->type2 = 0; + this->unk_80 = 0; + attackPatterns = OctorokBoss_Phase4AttackPatterns[this->phase4AttackPattern]; + this->currentAttack = attackPatterns[this->nextAttackIndex]; + this->nextAttackIndex += 1; + if (this->currentAttack != END_OF_ATTACK_PATTERN) { return; } // End of this pattern, choose the next pattern. - GET_PHASE4_ATTACK_PATTERN(this) = 0xff; + this->phase4AttackPattern = 0xff; } - this->subAction = ACTION1_WAITFORATTACK; + super->subAction = ACTION1_WAITFORATTACK; if (IS_FROZEN(this)) { - switch (GET_BOSS_PHASE(this)) { + switch (this->bossPhase) { case 1: - GET_TIMER(this) = 30; + this->timer = 30; break; case 3: - GET_TIMER(this) = 10; + this->timer = 10; break; } } else { if ((s16)gRoomVars.lightLevel != 0x100) { // Constantly attack when its dark. - GET_TIMER(this) = 1; + this->timer = 1; } else { - GET_TIMER(this) = OctorokBoss_AttackTimerValues[GetRandomByWeight(OctorokBoss_AttackTimerWeights)]; + this->timer = OctorokBoss_AttackTimerValues[GetRandomByWeight(OctorokBoss_AttackTimerWeights)]; } } } -void OctorokBoss_ResetToSubAction0(Entity* this) { - GET_ANGULAR_VEL(this) = 0x100; - GET_HELPER(this)->field_0x0 = 2; - GET_HELPER(this)->rotation = NO_ROTATION; - this->subAction = ACTION1_AIMTOWARDSPLAYER; +void OctorokBoss_ResetToSubAction0(OctorokBossEntity* this) { + this->angularSpeed.HWORD = 0x100; + this->heap->unk_0 = 2; + this->heap->rotation = NO_ROTATION; + super->subAction = ACTION1_AIMTOWARDSPLAYER; } -void OctorokBoss_WaitAnotherTurn(Entity* this) { - this->subAction = ACTION1_WAITFORTURN; - this->speed = 0xc0; - GET_HELPER(this)->field_0x0 = 1; - GET_TIMER(this) = OctorokBoss_TurnTimeValues[GetRandomByWeight(OctorokBoss_TurnTimeWeights)]; +void OctorokBoss_WaitAnotherTurn(OctorokBossEntity* this) { + static const u8 OctorokBoss_TurnTimeWeights[] = { + 48, + 96, + 80, + 32, + }; + static const u8 OctorokBoss_TurnTimeValues[] = { + 70, + 80, + 90, + 100, + }; + super->subAction = ACTION1_WAITFORTURN; + super->speed = 0xc0; + this->heap->unk_0 = 1; + this->timer = OctorokBoss_TurnTimeValues[GetRandomByWeight(OctorokBoss_TurnTimeWeights)]; } -void OctorokBoss_SetWaitTurnsForNextAttack(Entity* this) { - GET_PHASE4_ATTACK_PATTERN(this) = 0xff; +void OctorokBoss_SetWaitTurnsForNextAttack(OctorokBossEntity* this) { + static const u8 OctorokBoss_WaitForAttackTurnsWeights[] = { + 64, + 128, + 64, + }; + static const u8 OctorokBoss_WaitForAttackTurnsValues[] = { + 1, + 2, + 3, + }; + this->phase4AttackPattern = 0xff; if (IS_FROZEN(this) == FALSE) { if ((s16)gRoomVars.lightLevel != 0x100) { // Constantly attack when its dark. - GET_ATTACK_WAIT_TURNS(this) = IS_FROZEN(this); + this->attackWaitTurns = IS_FROZEN(this); } else { - GET_ATTACK_WAIT_TURNS(this) = + this->attackWaitTurns = OctorokBoss_WaitForAttackTurnsValues[GetRandomByWeight(OctorokBoss_WaitForAttackTurnsWeights)]; } } else { - GET_ATTACK_WAIT_TURNS(this) = 0; + this->attackWaitTurns = 0; } OctorokBoss_ResetToSubAction0(this); } -void OctorokBoss_StartRegularAttack(Entity* this) { +void OctorokBoss_StartRegularAttack(OctorokBossEntity* this) { + static const u8 OctorokBoss_NormalAttackPatterns[] = { + ATTACK_VACUUM, ATTACK_SPITROCK, ATTACK_VACUUM, ATTACK_SPITROCK, ATTACK_SPITROCK, + }; + static const u8 OctorokBoss_FrozenAttackPatterns[] = { + ATTACK_VACUUM, ATTACK_FREEZE, ATTACK_VACUUM, ATTACK_FREEZE, ATTACK_VACUUM, + }; + const u8* attackPattern; // Set us up for an attack - this->subAction = ACTION1_ATTACK; - this->type2 = 0; - GET_PHASE4_ATTACK_PATTERN(this) = 0xff; - this->field_0x80.HALF.LO = 0; - GET_HELPER(this)->field_0x2 = 0; - if (GET_BOSS_PHASE(this) == 0) { + super->subAction = ACTION1_ATTACK; + super->type2 = 0; + this->phase4AttackPattern = 0xff; + this->unk_80 = 0; + this->heap->field_0x2 = 0; + if (this->bossPhase == 0) { // In phase 0 just spit rocks. - GET_CURRENT_ATTACK(this) = ATTACK_SPITROCK; + this->currentAttack = ATTACK_SPITROCK; return; } - if (GET_BOSS_PHASE(this) == 4) { + if (this->bossPhase == 4) { if (((Random() & 3) == 0) || ((s16)gRoomVars.lightLevel != 0x100)) { - this->subAction = ACTION1_SUBACTION2; - this->speed = 0x200; - GET_TIMER(this) = 0x3c; - this->collisions = 0; - GET_HELPER(this)->field_0x0 = 4; + super->subAction = ACTION1_SUBACTION2; + super->speed = 0x200; + this->timer = 0x3c; + super->collisions = 0; + this->heap->unk_0 = 4; SoundReq(SFX_159); return; } - if (GET_BOSS_PHASE(this) == 4) { + if (this->bossPhase == 4) { // Select a new attack pattern that is not the previous one. u32 rand; - GET_NEXT_ATTACK_INDEX(this) = 0; + this->nextAttackIndex = 0; rand = Random() & 3; - if (GET_HELPER(this)->phase4PrevAttackPattern != rand) { - GET_PHASE4_ATTACK_PATTERN(this) = rand; + if (this->heap->phase4PrevAttackPattern != rand) { + this->phase4AttackPattern = rand; } else { - GET_PHASE4_ATTACK_PATTERN(this) = (GET_HELPER(this)->phase4PrevAttackPattern + 1) & 3; + this->phase4AttackPattern = (this->heap->phase4PrevAttackPattern + 1) & 3; } - GET_HELPER(this)->phase4PrevAttackPattern = GET_PHASE4_ATTACK_PATTERN(this); + this->heap->phase4PrevAttackPattern = this->phase4AttackPattern; OctorokBoss_SetAttackTimer(this); return; } @@ -1377,41 +1187,41 @@ void OctorokBoss_StartRegularAttack(Entity* this) { } else { attackPattern = OctorokBoss_FrozenAttackPatterns; } - GET_CURRENT_ATTACK(this) = attackPattern[GET_NEXT_ATTACK_INDEX(this)]; - if (++GET_NEXT_ATTACK_INDEX(this) > 4) { - GET_NEXT_ATTACK_INDEX(this) = 0; + this->currentAttack = attackPattern[this->nextAttackIndex]; + if (++this->nextAttackIndex > 4) { + this->nextAttackIndex = 0; } } -void OctorokBoss_ChangePalette(Entity* this, u32 paletteIndex) { +void OctorokBoss_ChangePalette(OctorokBossEntity* this, u32 paletteIndex) { u32 i; - ChangeObjPalette(GET_HELPER(this)->mouthObject, paletteIndex); + ChangeObjPalette(&this->heap->mouthObject->base, paletteIndex); for (i = 0; i < 4; i++) { - ChangeObjPalette(GET_HELPER(this)->legObjects[i], paletteIndex); + ChangeObjPalette(&this->heap->legObjects[i]->base, paletteIndex); } - for (i = GET_HELPER(this)->tailCount - 1; i != 0; i--) { - ChangeObjPalette(GET_HELPER(this)->tailObjects[i], paletteIndex); + for (i = this->heap->tailCount - 1; i != 0; i--) { + ChangeObjPalette(&this->heap->tailObjects[i]->base, paletteIndex); } } -void sub_08036F60(Entity* this) { - if ((this->subAction != 4) && (IS_FROZEN(this) == FALSE)) { - this->field_0x76.HWORD += (s8)this->actionDelay; - this->field_0x74.HWORD += (s8)this->actionDelay; - if (this->field_0x76.HWORD < 0x9c) { - this->actionDelay = 1; +void sub_08036F60(OctorokBossEntity* this) { + if ((super->subAction != 4) && (IS_FROZEN(this) == FALSE)) { + this->unk_76 += (s8)super->actionDelay; + this->unk_74 += (s8)super->actionDelay; + if (this->unk_76 < 0x9c) { + super->actionDelay = 1; } else { - if (this->field_0x76.HWORD > 0xa4) { - this->actionDelay = 0xff; + if (this->unk_76 > 0xa4) { + super->actionDelay = 0xff; } } } } -void OctorokBoss_StepSound(Entity* this, u32 frameMask) { +void OctorokBoss_StepSound(OctorokBossEntity* this, u32 frameMask) { if ((gRoomTransition.frameCount & frameMask) == 0) { if (IS_FROZEN(this) == FALSE) { SoundReq(SFX_163); @@ -1421,144 +1231,24 @@ void OctorokBoss_StepSound(Entity* this, u32 frameMask) { } } -void sub_08036FE4(Entity* this) { - if ((IS_FROZEN(this)) && (this->field_0x80.HALF.LO == 0)) { - if (GET_ANGULAR_VEL(this) != 0) { - if (GET_HELPER(this)->rotation != NO_ROTATION) { - if (GET_HELPER(this)->rotation == ROTATION_CW) { - GET_ANGLE(this) += GET_ANGULAR_VEL(this); +void sub_08036FE4(OctorokBossEntity* this) { + if ((IS_FROZEN(this)) && (this->unk_80 == 0)) { + if (this->angularSpeed.HWORD != 0) { + if (this->heap->rotation != NO_ROTATION) { + if (this->heap->rotation == ROTATION_CW) { + this->angle.HWORD += this->angularSpeed.HWORD; } else { - GET_ANGLE(this) -= GET_ANGULAR_VEL(this); + this->angle.HWORD -= this->angularSpeed.HWORD; } } - switch (GET_BOSS_PHASE(this)) { + switch (this->bossPhase) { case 1: - GET_ANGULAR_VEL(this)--; + this->angularSpeed.HWORD--; break; case 3: - GET_ANGULAR_VEL(this) -= 2; + this->angularSpeed.HWORD -= 2; break; } } } } - -void (*const OctorokBoss_Functions[])(Entity*) = { - OctorokBoss_OnTick, OctorokBoss_OnTick, GenericKnockback, OctorokBoss_Death, GenericConfused, -}; - -void (*const OctorokBoss_Hit_SubActions[])(Entity*) = { - OctorokBoss_Hit_SubAction0, OctorokBoss_Hit_SubAction1, OctorokBoss_Hit_SubAction2, OctorokBoss_Hit_SubAction3, - OctorokBoss_Hit_SubAction4, OctorokBoss_Hit_SubAction5, OctorokBoss_Hit_SubAction6, -}; - -const u8 OctorokBoss_HealthPerPhase[] = { - 3, 1, 3, 1, 3, 1, 3, 0, -}; - -void (*const OctorokBoss_Actions[])(Entity*) = { - OctorokBoss_Init, OctorokBoss_Action1, OctorokBoss_Hit, OctorokBoss_Intro, OctorokBoss_Burning, -}; - -const u8 gUnk_080CF08C[] = { - 0, 4, 0, 0, 1, 5, 0, 0, 1, 4, 0, 0, 1, 3, 0, 0, 1, 2, 0, 0, 2, 1, 0, 0, 1, 1, 0, 0, 3, 6, 0, 0, -}; - -void (*const OctorokBoss_Intro_SubActions[])(Entity*) = { - OctorokBoss_Intro_SubAction0, OctorokBoss_Intro_SubAction1, OctorokBoss_Intro_SubAction2, - OctorokBoss_Intro_SubAction3, OctorokBoss_Intro_SubAction4, OctorokBoss_Intro_SubAction5, -}; -void (*const OctorokBoss_Action1_SubActions[])(Entity*) = { - OctorokBoss_Action1_AimTowardsPlayer, OctorokBoss_Action1_WaitForTurn, OctorokBoss_Action1_ChargeAttack, - OctorokBoss_Action1_WaitForAttack, OctorokBoss_Action1_Attack, -}; - -const u8 OctorokBoss_LegAngleOffset[] = { - 40, - 80, - 176, - 216, -}; -const u8 OctorokBoss_LegAngleOffset2[] = { - 128, - 0, - 0, - 128, -}; -void (*const OctorokBoss_Action1_Attack_Type2s[])(Entity*) = { - OctorokBoss_Action1_Attack_Type2_0, - OctorokBoss_Action1_Attack_Type2_1, - OctorokBoss_Action1_Attack_Type2_2, - OctorokBoss_Action1_Attack_Type2_3, -}; -void (*const OctorokBoss_AttackFunctions[])(Entity*) = { - OctorokBoss_ExecuteAttackSpitRock, - OctorokBoss_ExecuteAttackVacuum, - OctorokBoss_ExecuteAttackSmoke, - OctorokBoss_ExecuteAttackFreeze, -}; -void (*const OctorokBoss_Burning_SubActions[])(Entity*) = { - OctorokBoss_Burning_SubAction0, - OctorokBoss_Burning_SubAction1, - OctorokBoss_Burning_SubAction2, -}; - -// These attack timers are only used if the boss isn't frozen and gRoomVars.field_0xc != 0x100 -const u8 OctorokBoss_AttackTimerWeights[] = { - 48, - 96, - 80, - 32, -}; -const u8 OctorokBoss_AttackTimerValues[] = { - 5, - 10, - 15, - 30, -}; - -// 5: don't attack -const u8 OctorokBoss_Phase4AttackPattern0[] = { - ATTACK_SPITROCK, NO_ATTACK, ATTACK_SPITROCK, ATTACK_SMOKE, END_OF_ATTACK_PATTERN, -}; -const u8 OctorokBoss_Phase4AttackPattern1[] = { - ATTACK_VACUUM, NO_ATTACK, ATTACK_SPITROCK, ATTACK_SMOKE, END_OF_ATTACK_PATTERN, -}; -const u8 OctorokBoss_Phase4AttackPattern2[] = { - ATTACK_SPITROCK, NO_ATTACK, ATTACK_SPITROCK, NO_ATTACK, ATTACK_SPITROCK, END_OF_ATTACK_PATTERN, -}; - -const u8* const OctorokBoss_Phase4AttackPatterns[] = { - OctorokBoss_Phase4AttackPattern0, - OctorokBoss_Phase4AttackPattern1, - OctorokBoss_Phase4AttackPattern2, - OctorokBoss_Phase4AttackPattern1, -}; -const u8 OctorokBoss_TurnTimeWeights[] = { - 48, - 96, - 80, - 32, -}; -const u8 OctorokBoss_TurnTimeValues[] = { - 70, - 80, - 90, - 100, -}; -const u8 OctorokBoss_WaitForAttackTurnsWeights[] = { - 64, - 128, - 64, -}; -const u8 OctorokBoss_WaitForAttackTurnsValues[] = { - 1, - 2, - 3, -}; -const u8 OctorokBoss_NormalAttackPatterns[] = { - ATTACK_VACUUM, ATTACK_SPITROCK, ATTACK_VACUUM, ATTACK_SPITROCK, ATTACK_SPITROCK, -}; -const u8 OctorokBoss_FrozenAttackPatterns[] = { - ATTACK_VACUUM, ATTACK_FREEZE, ATTACK_VACUUM, ATTACK_FREEZE, ATTACK_VACUUM, -}; diff --git a/src/object.c b/src/object.c index a2ffb4b8..caddaddc 100644 --- a/src/object.c +++ b/src/object.c @@ -147,7 +147,7 @@ void (*const gObjectFunctions[])(Entity*) = { [OBJECT_8E] = Object8E, [FROZEN_WATER_ELEMENT] = FrozenWaterElement, [OBJECT_90] = Object90, - [OBJECT_91] = Object91, + [FROZEN_OCTOROK] = FrozenOctorok, [BAKER_OVEN] = BakerOven, [LAMP] = Lamp, [WIND_TRIBE_FLAG] = WindTribeFlag, diff --git a/src/object/frozenOctorok.c b/src/object/frozenOctorok.c new file mode 100644 index 00000000..ea1ea894 --- /dev/null +++ b/src/object/frozenOctorok.c @@ -0,0 +1,280 @@ +/** + * @file frozenOctorok.c + * @ingroup Objects + * + * @brief Frozen Octorok object + */ + +#define NENT_DEPRECATED +#include "enemy/octorokBoss.h" +#include "global.h" +#include "object.h" +#include "functions.h" +#include "message.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[0xc]; + /*0x74*/ u16 unk_74; + /*0x76*/ u16 unk_76; + /*0x78*/ u8 unk_78; + /*0x79*/ u8 unk_79; + /*0x7a*/ u8 unk_7a; + /*0x7b*/ u8 unk_7b; + /*0x7c*/ u8 unk_7c[2]; + /*0x7e*/ u16 unk_7e; + /*0x7f*/ u8 unk_7f[4]; + /*0x84*/ OctorokBossHeap* heap; +} FrozenOctorokEntity; + +void FrozenOctorok_Init(FrozenOctorokEntity*); +void FrozenOctorok_Action1(FrozenOctorokEntity*); +void FrozenOctorok_Action1SubAction0(FrozenOctorokEntity*); +void FrozenOctorok_Action1SubAction1(FrozenOctorokEntity*); +void FrozenOctorok_Action1SubAction2(FrozenOctorokEntity*); +void FrozenOctorok_Action1SubAction3(FrozenOctorokEntity*); +void FrozenOctorok_Action1SubAction4(FrozenOctorokEntity*); +void FrozenOctorok_Action1SubAction5(FrozenOctorokEntity*); +void FrozenOctorok_Action1SubAction6(FrozenOctorokEntity*); +void FrozenOctorok_Action1SubAction7(FrozenOctorokEntity*); +void FrozenOctorok_ChangeObjPaletteOfChildren(FrozenOctorokEntity*, u32); +void sub_0809CBE4(FrozenOctorokEntity*); +void sub_0809CB70(FrozenOctorokEntity*, s32, s32); + +void FrozenOctorok(FrozenOctorokEntity* this) { + static void (*const FrozenOctorok_Actions[])(FrozenOctorokEntity*) = { + FrozenOctorok_Init, + FrozenOctorok_Action1, + }; + FrozenOctorok_Actions[super->action](this); + super->spriteRendering.b3 = 3; +} + +const u8 gUnk_08123DDC[] = { + 9, 4, 0, 0, 1, 5, 0, 0, 1, 4, 0, 0, 1, 3, 0, 0, 1, 2, 0, 0, 2, 1, 0, 0, 10, 4, 0, 0, +}; + +ASM_FUNC("asm/non_matching/frozenOctorok/FrozenOctorok_Init.inc", void FrozenOctorok_Init(FrozenOctorokEntity* this)) + +void (*const FrozenOctorok_Action1SubActions[])(FrozenOctorokEntity*) = { + FrozenOctorok_Action1SubAction0, FrozenOctorok_Action1SubAction1, FrozenOctorok_Action1SubAction2, + FrozenOctorok_Action1SubAction3, FrozenOctorok_Action1SubAction4, FrozenOctorok_Action1SubAction5, + FrozenOctorok_Action1SubAction6, FrozenOctorok_Action1SubAction7, +}; + +const u8 gUnk_08123E18[] = { + 40, + 80, + 176, + 216, +}; +const u8 gUnk_08123E1C[] = { + 128, + 0, + 0, + 128, +}; + +ASM_FUNC("asm/non_matching/frozenOctorok/FrozenOctorok_Action1.inc", + void FrozenOctorok_Action1(FrozenOctorokEntity* this)) + +void FrozenOctorok_Action1SubAction0(FrozenOctorokEntity* this) { + Entity* child; + if (super->field_0xf != 0) { + if (this->unk_7e == 0) { + child = super->child; + if (child->z.HALF.HI > -0x10) { + child->z.WORD -= 0x4000; + } else { + child->z.WORD -= 0x1000; + (super->child)->zVelocity = 0x3000; + this->unk_7e = 0x200; + } + } + if (this->unk_79-- == 0) { + MessageFromTarget(0xb43); + super->subAction = 1; + this->unk_79 = 8; + } + } +} + +void FrozenOctorok_Action1SubAction1(FrozenOctorokEntity* this) { + Entity* obj; + if ((gMessage.doTextBox & 0x7f) == 0) { + if (this->unk_79-- == 0) { + obj = CreateObjectWithParent(super, FROZEN_OCTOROK, 7, 0); + if (obj != NULL) { + obj->y.HALF.HI -= 0x50; + gRoomControls.camera_target = obj; + } + if (super->field_0xf < 3) { + super->subAction = 2; + this->unk_79 = 0x1e; + SoundReq(SFX_THUD_HEAVY); + } else { + super->subAction = 3; + this->unk_79 = 0x78; + } + } + } +} + +void FrozenOctorok_Action1SubAction2(FrozenOctorokEntity* this) { + if (this->unk_79-- == 0) { + super->subAction = 1; + this->unk_79 = 0x1e; + super->field_0xf++; + return; + } + switch (this->unk_79 & 3) { + case 0: + case 2: + super->x.HALF.HI = (super->x.HALF.HI & 0xfff0) + 8; + break; + case 1: + super->x.HALF.HI = (super->x.HALF.HI & 0xfff8) + 4; + break; + case 3: + super->x.HALF.HI = (super->x.HALF.HI & 0xfff8) - 4; + break; + } +} + +void FrozenOctorok_Action1SubAction3(FrozenOctorokEntity* this) { + if (this->unk_79-- != 0) { + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 6, 0); + } else { + super->subAction = 4; + this->unk_79 = 0x3c; + LoadFixedGFX(super, 0x115); + LoadFixedGFX(super->parent, 0x115); + ChangeObjPalette(super, 0xef); + ChangeObjPalette(super->parent, 0xef); + FrozenOctorok_ChangeObjPaletteOfChildren(this, 0xef); + SoundReq(SFX_WIND2); + } +} + +void FrozenOctorok_Action1SubAction4(FrozenOctorokEntity* this) { + u8 bVar1; + s16 sVar2; + u8* pbVar3; + u8* puVar4; + + if (this->unk_79-- == 0) { + super->subAction = 5; + this->unk_79 = 0xb4; + super->type2 = 3; + } else { + if ((gRoomTransition.frameCount & 8) != 0) { + this->heap->mouthObject->unk_76 -= 4; + } else { + this->heap->mouthObject->unk_76 += 4; + } + } +} + +NONMATCH("asm/non_matching/frozenOctorok/FrozenOctorok_Action1SubAction5.inc", + void FrozenOctorok_Action1SubAction5(FrozenOctorokEntity* this)) { + Entity* child; + + if ((gRoomTransition.frameCount & 2) != 0) { + this->heap->mouthObject->unk_76 -= 8; + } else { + this->heap->mouthObject->unk_76 += 8; + } + if ((gRoomTransition.frameCount & 3) == 0) { + CreateObjectWithParent(super, OCTOROK_BOSS_OBJECT, 2, 0); + } + if (this->unk_79 == 0) { + (super->child)->spriteOffsetX = 0; + LinearMoveAngle(super->child, 0x200, -this->unk_7b); + if (sub_0806FC80(super, super->child, 0x48) != 0) { + super->subAction = 6; + super->speed = 0xc0; + super->type2 = 0; + super->field_0xf = 0; + child = super->child; + child->spriteSettings.draw = 0; + this->heap->mouthObject->unk_76 = 0x100; + this->heap->unk_0 = 1; + SoundReq(SFX_ED); + } + } else { + this->unk_79--; + switch ((gRoomTransition.frameCount & 3)) { + case 0: + case 2: + (super->child)->spriteOffsetX = 0; + break; + case 1: + (super->child)->spriteOffsetX = 0xfc; + break; + case 3: + (super->child)->spriteOffsetX = 4; + break; + } + } +} +END_NONMATCH + +void FrozenOctorok_Action1SubAction6(FrozenOctorokEntity* this) { + LinearMoveUpdate(super); + if ((gRoomControls.origin_y + 0x1c8) < super->y.HALF.HI) { + gRoomControls.unk5 = 4; + gRoomControls.camera_target = &gPlayerEntity; + SetLocalFlag(0x9b); + DeleteEntity(super->parent); + DeleteEntity(&this->heap->mouthObject->base); + DeleteEntity(&this->heap->legObjects[0]->base); + DeleteEntity(&this->heap->legObjects[1]->base); + DeleteEntity(&this->heap->legObjects[2]->base); + DeleteEntity(&this->heap->legObjects[3]->base); + super->subAction = 7; + } + if ((gRoomTransition.frameCount & 0xf) == 0) { + SoundReq(SFX_163); + } +} + +void FrozenOctorok_Action1SubAction7(FrozenOctorokEntity* this) { + if ((gRoomControls.scroll_flags & 4) == 0) { + CreateEzloHint(0xb44, 0); + DeleteThisEntity(); + } +} + +void sub_0809CB70(FrozenOctorokEntity* this, s32 angle, s32 radius) { + s32 tmp; + tmp = FixedMul(gSineTable[angle], radius); + tmp = FixedDiv(tmp, 0x100); + super->x.WORD = (super->parent)->x.WORD + ((tmp << 0x10) >> 8); + tmp = FixedMul(gSineTable[angle + 0x40], radius); + tmp = FixedDiv(tmp, 0x100); + super->y.WORD = super->parent->y.WORD - ((tmp << 0x10) >> 8); + super->z.WORD = super->parent->z.WORD; +} + +NONMATCH("asm/non_matching/frozenOctorok/sub_0809CBE4.inc", void sub_0809CBE4(FrozenOctorokEntity* this)) { + this->unk_79 += super->field_0xf; + if ((s8)super->field_0xf < 0) { + if (super->actionDelay < -(this->unk_79 << 0x18 >> 0x18)) { + super->field_0xf = -super->field_0xf; + SoundReq(SFX_19E); + } + } else if ((s8)this->unk_79 > super->actionDelay) { + super->field_0xf = -super->field_0xf; + SoundReq(SFX_19E); + } +} +END_NONMATCH + +void FrozenOctorok_ChangeObjPaletteOfChildren(FrozenOctorokEntity* this, u32 palette) { + u32 index; + + ChangeObjPalette(&this->heap->mouthObject->base, palette); + for (index = 0; index < 4; index++) { + ChangeObjPalette(&this->heap->legObjects[index]->base, palette); + } +} diff --git a/src/object/frozenWaterElement.c b/src/object/frozenWaterElement.c index f4c5964f..c0019201 100644 --- a/src/object/frozenWaterElement.c +++ b/src/object/frozenWaterElement.c @@ -39,7 +39,7 @@ void sub_0809BECC(FrozenWaterElementEntity* this) { if (CheckFlags(0x9b)) { DeleteThisEntity(); } - obj = CreateObject(OBJECT_91, 0, 0); + obj = CreateObject(FROZEN_OCTOROK, 0, 0); super->child = obj; if (obj != NULL) { super->action = 1; diff --git a/src/object/object90.c b/src/object/object90.c new file mode 100644 index 00000000..d975f54c --- /dev/null +++ b/src/object/object90.c @@ -0,0 +1,31 @@ +/** + * @file object90.c + * @ingroup Objects + * + * @brief Object90 object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +void Object90_Init(Entity*); +void Object90_Action1(Entity*); + +void Object90(Entity* this) { + static void (*const Object90_Actions[])(Entity*) = { + Object90_Init, + Object90_Action1, + }; + Object90_Actions[this->action](this); +} + +void Object90_Init(Entity* this) { + this->action = 1; + this->frameIndex = 0; + this->spritePriority.b0 = 5; +} + +void Object90_Action1(Entity* this) { +}