summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-02-03 21:23:20 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-02-05 13:07:06 +0100
commite59664435ef5808d6dedebf3d143ef24c6e00802 (patch)
tree75c7cbb5bda5d36094f94db9d57f7dbd1523806f
parent67d369c53becab9c5efbe5d3daba0373ef1b4106 (diff)
Decompile Enemy64
-rw-r--r--asm/enemy/enemy64.s1461
-rw-r--r--assets/assets.json5
-rw-r--r--data/const/enemy/enemy64.s44
-rw-r--r--include/enemy.h2
-rw-r--r--linker.ld6
-rw-r--r--src/enemy/enemy64.c523
6 files changed, 527 insertions, 1514 deletions
diff --git a/asm/enemy/enemy64.s b/asm/enemy/enemy64.s
deleted file mode 100644
index 5646660e..00000000
--- a/asm/enemy/enemy64.s
+++ /dev/null
@@ -1,1461 +0,0 @@
- .include "asm/macros.inc"
-
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
-
- thumb_func_start Enemy64
-Enemy64: @ 0x0804905C
- push {r4, r5, lr}
- adds r5, r0, #0
- ldrb r0, [r5, #0xc]
- cmp r0, #0
- beq _0804907C
- adds r0, r5, #0
- adds r0, #0x7d
- ldrb r1, [r0]
- movs r0, #3
- ands r1, r0
- ldrb r2, [r5, #0x18]
- movs r0, #4
- rsbs r0, r0, #0
- ands r0, r2
- orrs r0, r1
- strb r0, [r5, #0x18]
-_0804907C:
- adds r1, r5, #0
- adds r1, #0x45
- ldrb r0, [r1]
- adds r2, r0, #0
- cmp r2, #0
- bne _08049092
- movs r0, #0xff
- strb r0, [r1]
- movs r0, #4
- strb r0, [r5, #0xc]
- strb r2, [r5, #0xd]
-_08049092:
- ldr r1, _080490F8 @ =gUnk_080D2974
- ldrb r0, [r5, #0xc]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r1, [r0]
- adds r0, r5, #0
- bl _call_via_r1
- adds r4, r5, #0
- adds r4, #0x78
- ldrh r3, [r4]
- adds r0, r5, #0
- movs r1, #0xaa
- movs r2, #0xaa
- bl sub_0805EC9C
- ldrh r0, [r4]
- lsrs r0, r0, #8
- rsbs r0, r0, #0
- strb r0, [r5, #0x14]
- adds r0, r5, #0
- bl sub_080499F0
- ldrb r0, [r5, #0x18]
- lsls r0, r0, #0x1e
- lsrs r0, r0, #0x1e
- adds r1, r5, #0
- adds r1, #0x7d
- strb r0, [r1]
- ldrb r2, [r5, #0x18]
- lsls r0, r2, #0x1e
- lsrs r0, r0, #0x1e
- cmp r0, #1
- bne _080490F4
- movs r1, #0x32
- ldrsh r0, [r5, r1]
- ldr r1, _080490FC @ =gRoomControls
- movs r3, #0xc
- ldrsh r1, [r1, r3]
- subs r0, r0, r1
- adds r0, #0x30
- movs r1, #0x80
- lsls r1, r1, #1
- cmp r0, r1
- bls _080490F4
- movs r0, #4
- rsbs r0, r0, #0
- ands r0, r2
- strb r0, [r5, #0x18]
-_080490F4:
- pop {r4, r5, pc}
- .align 2, 0
-_080490F8: .4byte gUnk_080D2974
-_080490FC: .4byte gRoomControls
-
- thumb_func_start sub_08049100
-sub_08049100: @ 0x08049100
- push {r4, r5, lr}
- adds r5, r0, #0
- movs r0, #0x7c
- bl CheckFlags
- cmp r0, #0
- beq _08049144
- ldr r4, _08049140 @ =0x00004081
- adds r0, r4, #0
- movs r1, #0xa
- movs r2, #2
- bl SetTile
- adds r0, r4, #0
- movs r1, #0x4a
- movs r2, #2
- bl SetTile
- adds r0, r4, #0
- movs r1, #0x8a
- movs r2, #2
- bl SetTile
- adds r0, r4, #0
- movs r1, #0xca
- movs r2, #2
- bl SetTile
- bl DeleteThisEntity
- b _0804916E
- .align 2, 0
-_08049140: .4byte 0x00004081
-_08049144:
- ldr r4, _080491E8 @ =0x00000323
- adds r0, r4, #0
- movs r1, #0xa
- movs r2, #1
- bl sub_0807B7D8
- adds r0, r4, #0
- movs r1, #0x4a
- movs r2, #1
- bl sub_0807B7D8
- adds r0, r4, #0
- movs r1, #0x8a
- movs r2, #1
- bl sub_0807B7D8
- adds r0, r4, #0
- movs r1, #0xca
- movs r2, #1
- bl sub_0807B7D8
-_0804916E:
- movs r0, #0x22
- bl CreateProjectile
- adds r2, r0, #0
- cmp r2, #0
- beq _080491E4
- movs r1, #0
- movs r3, #1
- movs r0, #1
- strb r0, [r2, #0xa]
- str r5, [r2, #0x50]
- str r2, [r5, #0x54]
- strb r0, [r5, #0xc]
- strb r1, [r5, #0xd]
- movs r0, #0x3c
- strb r0, [r5, #0xe]
- movs r0, #0xc0
- strb r0, [r5, #0x15]
- strb r0, [r5, #0x14]
- movs r4, #0
- movs r0, #0xc0
- lsls r0, r0, #2
- strh r0, [r5, #0x24]
- ldrb r1, [r5, #0x19]
- movs r0, #3
- orrs r1, r0
- ldrb r2, [r5, #0x18]
- movs r0, #4
- rsbs r0, r0, #0
- ands r0, r2
- orrs r0, r3
- strb r0, [r5, #0x18]
- ldrb r2, [r5, #0x1b]
- movs r3, #0x3f
- adds r0, r3, #0
- ands r0, r2
- movs r2, #0x80
- orrs r0, r2
- strb r0, [r5, #0x1b]
- ands r1, r3
- orrs r1, r2
- strb r1, [r5, #0x19]
- adds r1, r5, #0
- adds r1, #0x38
- movs r0, #2
- strb r0, [r1]
- adds r0, r5, #0
- adds r0, #0x7c
- strb r4, [r0]
- subs r0, #4
- movs r1, #0x80
- lsls r1, r1, #7
- strh r1, [r0]
- adds r0, #2
- strh r1, [r0]
- adds r0, r5, #0
- movs r1, #0
- bl InitAnimationForceUpdate
-_080491E4:
- pop {r4, r5, pc}
- .align 2, 0
-_080491E8: .4byte 0x00000323
-
- thumb_func_start sub_080491EC
-sub_080491EC: @ 0x080491EC
- push {r4, lr}
- adds r4, r0, #0
- ldr r1, _08049208 @ =gUnk_080D2988
- ldrb r0, [r4, #0xd]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r1, [r0]
- adds r0, r4, #0
- bl _call_via_r1
- adds r0, r4, #0
- bl UpdateAnimationSingleFrame
- pop {r4, pc}
- .align 2, 0
-_08049208: .4byte gUnk_080D2988
-
- thumb_func_start sub_0804920C
-sub_0804920C: @ 0x0804920C
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0xe]
- cmp r0, #0
- beq _0804921C
- subs r0, #1
- strb r0, [r4, #0xe]
- b _08049268
-_0804921C:
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- ldr r2, _0804926C @ =gRoomControls
- ldrh r0, [r2, #6]
- ldr r1, _08049270 @ =0xFFFFFF00
- adds r0, r0, r1
- movs r3, #0x2e
- ldrsh r1, [r4, r3]
- cmp r0, r1
- ble _08049268
- movs r0, #1
- strb r0, [r4, #0xd]
- movs r0, #0x80
- strb r0, [r4, #0x15]
- strb r0, [r4, #0x14]
- movs r0, #0xc0
- strh r0, [r4, #0x24]
- ldrh r0, [r2, #6]
- adds r0, #0xa8
- strh r0, [r4, #0x2e]
- ldrh r0, [r2, #8]
- subs r0, #0x40
- strh r0, [r4, #0x32]
- adds r0, r4, #0
- adds r0, #0x78
- movs r1, #0x80
- lsls r1, r1, #8
- strh r1, [r0]
- adds r0, #2
- strh r1, [r0]
-_08049268:
- pop {r4, pc}
- .align 2, 0
-_0804926C: .4byte gRoomControls
-_08049270: .4byte 0xFFFFFF00
-
- thumb_func_start sub_08049274
-sub_08049274: @ 0x08049274
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- ldr r0, _080492A4 @ =gRoomControls
- ldrh r0, [r0, #8]
- adds r0, #0x40
- movs r2, #0x32
- ldrsh r1, [r4, r2]
- cmp r0, r1
- bge _080492A2
- movs r1, #0
- movs r0, #2
- strb r0, [r4, #0xc]
- strb r1, [r4, #0xd]
-_080492A2:
- pop {r4, pc}
- .align 2, 0
-_080492A4: .4byte gRoomControls
-
- thumb_func_start sub_080492A8
-sub_080492A8: @ 0x080492A8
- push {r4, lr}
- adds r4, r0, #0
- ldr r1, _080492C4 @ =gUnk_080D2990
- ldrb r0, [r4, #0xd]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r1, [r0]
- adds r0, r4, #0
- bl _call_via_r1
- adds r0, r4, #0
- bl UpdateAnimationSingleFrame
- pop {r4, pc}
- .align 2, 0
-_080492C4: .4byte gUnk_080D2990
-
- thumb_func_start sub_080492C8
-sub_080492C8: @ 0x080492C8
- push {r4, r5, lr}
- adds r3, r0, #0
- movs r0, #1
- strb r0, [r3, #0xd]
- movs r1, #0
- movs r0, #0x90
- lsls r0, r0, #1
- strh r0, [r3, #0x24]
- adds r0, r3, #0
- adds r0, #0x6e
- strb r1, [r0]
- movs r0, #0x2e
- ldrsh r1, [r3, r0]
- ldr r2, _08049300 @ =gRoomControls
- ldrh r0, [r2, #6]
- subs r1, r1, r0
- adds r5, r2, #0
- cmp r1, #0xa7
- bgt _08049304
- adds r2, r3, #0
- adds r2, #0x80
- movs r0, #0xd8
- strh r0, [r2]
- adds r1, r3, #0
- adds r1, #0x74
- adds r0, #0x28
- b _08049314
- .align 2, 0
-_08049300: .4byte gRoomControls
-_08049304:
- adds r2, r3, #0
- adds r2, #0x80
- movs r0, #0x78
- strh r0, [r2]
- adds r1, r3, #0
- adds r1, #0x74
- movs r0, #0xff
- lsls r0, r0, #8
-_08049314:
- strh r0, [r1]
- adds r4, r1, #0
- ldrh r0, [r5, #6]
- ldrh r1, [r2]
- adds r0, r0, r1
- strh r0, [r2]
- movs r2, #0x32
- ldrsh r0, [r3, r2]
- ldrh r1, [r5, #8]
- subs r0, r0, r1
- cmp r0, #0x7f
- bgt _08049336
- adds r1, r3, #0
- adds r1, #0x82
- movs r0, #0xb0
- strh r0, [r1]
- b _08049346
-_08049336:
- adds r1, r3, #0
- adds r1, #0x82
- movs r0, #0x50
- strh r0, [r1]
- movs r2, #0
- ldrsh r0, [r4, r2]
- rsbs r0, r0, #0
- strh r0, [r4]
-_08049346:
- ldrh r0, [r5, #8]
- ldrh r2, [r1]
- adds r0, r0, r2
- strh r0, [r1]
- adds r0, r3, #0
- bl sub_08049358
- pop {r4, r5, pc}
- .align 2, 0
-
- thumb_func_start sub_08049358
-sub_08049358: @ 0x08049358
- push {r4, r5, lr}
- adds r4, r0, #0
- adds r0, #0x80
- ldrh r0, [r0]
- movs r2, #0x2e
- ldrsh r1, [r4, r2]
- subs r0, r0, r1
- adds r1, r4, #0
- adds r1, #0x82
- ldrh r1, [r1]
- movs r3, #0x32
- ldrsh r2, [r4, r3]
- subs r1, r1, r2
- bl sub_080045DA
- adds r3, r0, #0
- ldrb r2, [r4, #0x15]
- subs r0, r2, r3
- adds r0, #2
- movs r1, #0xff
- ands r0, r1
- cmp r0, #4
- bls _08049398
- subs r0, r3, r2
- movs r1, #0x80
- ands r0, r1
- cmp r0, #0
- beq _08049394
- subs r0, r2, #1
- b _08049396
-_08049394:
- adds r0, r2, #1
-_08049396:
- strb r0, [r4, #0x15]
-_08049398:
- ldrb r1, [r4, #0x15]
- movs r5, #0x80
- lsls r5, r5, #1
- subs r1, r5, r1
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- adds r0, r4, #0
- adds r0, #0x80
- ldrh r1, [r0]
- adds r0, #2
- ldrh r2, [r0]
- movs r0, #0x24
- ldrsh r3, [r4, r0]
- asrs r3, r3, #0x10
- adds r3, #0x10
- adds r0, r4, #0
- bl EntityWithinDistance
- cmp r0, #0
- beq _080493E0
- movs r0, #2
- strb r0, [r4, #0xd]
- movs r0, #0xc0
- strh r0, [r4, #0x24]
- adds r0, r4, #0
- adds r0, #0x7e
- strh r5, [r0]
- ldrb r0, [r4, #0x15]
- lsls r0, r0, #8
- adds r1, r4, #0
- adds r1, #0x76
- strh r0, [r1]
-_080493E0:
- pop {r4, r5, pc}
- .align 2, 0
-
- thumb_func_start sub_080493E4
-sub_080493E4: @ 0x080493E4
- push {r4, lr}
- adds r4, r0, #0
- adds r1, r4, #0
- adds r1, #0x76
- adds r0, #0x74
- ldrh r0, [r0]
- ldrh r2, [r1]
- adds r0, r0, r2
- strh r0, [r1]
- lsls r0, r0, #0x10
- lsrs r0, r0, #0x18
- strb r0, [r4, #0x15]
- movs r1, #0x1f
- ands r0, r1
- cmp r0, #0
- bne _0804943A
- movs r1, #0x2e
- ldrsh r0, [r4, r1]
- movs r2, #0x32
- ldrsh r1, [r4, r2]
- ldr r3, _08049458 @ =gRoomControls
- ldrh r2, [r3, #6]
- adds r2, #0xa8
- ldrh r3, [r3, #8]
- adds r3, #0x80
- bl CalculateDirectionTo
- adds r0, #2
- movs r1, #0x1c
- ands r0, r1
- ldrb r1, [r4, #0x15]
- lsrs r1, r1, #3
- subs r0, r0, r1
- movs r1, #0xf
- ands r0, r1
- cmp r0, #8
- bne _0804943A
- movs r0, #4
- strb r0, [r4, #0xd]
- movs r0, #0x3c
- strb r0, [r4, #0xe]
- movs r0, #7
- strb r0, [r4, #0xf]
-_0804943A:
- adds r0, r4, #0
- bl sub_08049944
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08047EA4
- pop {r4, pc}
- .align 2, 0
-_08049458: .4byte gRoomControls
-
- thumb_func_start sub_0804945C
-sub_0804945C: @ 0x0804945C
- push {r4, lr}
- adds r4, r0, #0
- adds r1, r4, #0
- adds r1, #0x76
- adds r0, #0x74
- ldrh r0, [r0]
- ldrh r2, [r1]
- adds r0, r0, r2
- strh r0, [r1]
- lsls r0, r0, #0x10
- lsrs r1, r0, #0x18
- strb r1, [r4, #0x15]
- ldrb r0, [r4, #0xe]
- cmp r0, #0
- bne _0804948C
- movs r0, #0x1f
- ands r1, r0
- cmp r1, #0
- bne _080494B2
- movs r0, #4
- strb r0, [r4, #0xd]
- movs r0, #0x5a
- strb r0, [r4, #0xe]
- b _080494B2
-_0804948C:
- adds r0, r4, #0
- bl sub_08049A8C
- cmp r0, #0
- beq _080494B2
- movs r0, #0x23
- bl CreateProjectile
- adds r2, r0, #0
- cmp r2, #0
- beq _080494B2
- adds r1, r2, #0
- adds r1, #0x38
- movs r0, #2
- strb r0, [r1]
- str r4, [r2, #0x50]
- adds r0, r2, #0
- bl UpdateSpriteForCollisionLayer
-_080494B2:
- adds r0, r4, #0
- bl sub_08049944
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08047EA4
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_080494D0
-sub_080494D0: @ 0x080494D0
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- ldrb r0, [r4, #0xe]
- subs r1, r0, #1
- strb r1, [r4, #0xe]
- movs r2, #0xff
- lsls r0, r1, #0x18
- cmp r0, #0
- bne _08049518
- ldrb r0, [r4, #0xf]
- subs r0, #1
- strb r0, [r4, #0xf]
- ands r0, r2
- cmp r0, #0
- bne _0804950E
- movs r0, #5
- strb r0, [r4, #0xd]
- ldrh r0, [r4, #0x24]
- adds r0, #0x40
- strh r0, [r4, #0x24]
- b _08049534
-_0804950E:
- movs r0, #3
- strb r0, [r4, #0xd]
- movs r0, #0xa
- strb r0, [r4, #0xe]
- b _08049534
-_08049518:
- lsls r0, r1, #0x18
- lsrs r0, r0, #0x18
- cmp r0, #0x50
- bne _08049534
- bl Random
- movs r1, #3
- ands r1, r0
- movs r0, #0x62
- bl CreateEnemy
- cmp r0, #0
- beq _08049534
- str r4, [r0, #0x50]
-_08049534:
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_08049538
-sub_08049538: @ 0x08049538
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- ldr r0, _08049570 @ =gRoomControls
- ldrh r1, [r0, #6]
- adds r1, #0xa8
- ldrh r2, [r0, #8]
- adds r2, #0x80
- adds r0, r4, #0
- movs r3, #0x70
- bl EntityWithinDistance
- adds r1, r0, #0
- cmp r1, #0
- bne _0804956E
- movs r0, #3
- strb r0, [r4, #0xc]
- strb r1, [r4, #0xd]
-_0804956E:
- pop {r4, pc}
- .align 2, 0
-_08049570: .4byte gRoomControls
-
- thumb_func_start sub_08049574
-sub_08049574: @ 0x08049574
- push {r4, lr}
- adds r4, r0, #0
- ldr r1, _08049590 @ =gUnk_080D29A8
- ldrb r0, [r4, #0xd]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r1, [r0]
- adds r0, r4, #0
- bl _call_via_r1
- adds r0, r4, #0
- bl UpdateAnimationSingleFrame
- pop {r4, pc}
- .align 2, 0
-_08049590: .4byte gUnk_080D29A8
-
- thumb_func_start sub_08049594
-sub_08049594: @ 0x08049594
- push {r4, lr}
- adds r4, r0, #0
- ldr r2, _080495C8 @ =gRoomControls
- ldrh r0, [r2, #6]
- movs r3, #0x2e
- ldrsh r1, [r4, r3]
- subs r1, #0xa8
- subs r0, r0, r1
- ldrh r1, [r2, #8]
- movs r3, #0x32
- ldrsh r2, [r4, r3]
- subs r2, #0x80
- subs r1, r1, r2
- bl sub_080045DA
- ldrb r2, [r4, #0x15]
- cmp r0, r2
- beq _080495D2
- subs r0, r0, r2
- movs r1, #0x80
- ands r0, r1
- cmp r0, #0
- beq _080495CC
- subs r0, r2, #1
- strb r0, [r4, #0x15]
- b _080495DC
- .align 2, 0
-_080495C8: .4byte gRoomControls
-_080495CC:
- adds r0, r2, #1
- strb r0, [r4, #0x15]
- b _080495DC
-_080495D2:
- movs r0, #1
- strb r0, [r4, #0xd]
- movs r0, #0xc0
- lsls r0, r0, #1
- strh r0, [r4, #0x24]
-_080495DC:
- adds r0, r4, #0
- bl sub_08049944
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08047EA4
- pop {r4, pc}
-
- thumb_func_start sub_080495F8
-sub_080495F8: @ 0x080495F8
- push {r4, lr}
- adds r4, r0, #0
- ldr r0, _08049654 @ =gRoomControls
- ldrh r1, [r0, #6]
- adds r1, #0xa8
- ldrh r2, [r0, #8]
- adds r2, #0x80
- adds r0, r4, #0
- movs r3, #0x28
- bl EntityWithinDistance
- cmp r0, #0
- beq _0804963C
- movs r0, #2
- strb r0, [r4, #0xd]
- movs r0, #0x2d
- strb r0, [r4, #0xe]
- bl Random
- ldr r2, _08049658 @ =gUnk_080D29B8
- movs r1, #7
- ands r1, r0
- adds r1, r1, r2
- ldrb r1, [r1]
- lsls r1, r1, #0x18
- asrs r1, r1, #0x18
- adds r0, r4, #0
- adds r0, #0x74
- strh r1, [r0]
- ldrb r0, [r4, #0x15]
- lsls r0, r0, #8
- adds r1, r4, #0
- adds r1, #0x76
- strh r0, [r1]
-_0804963C:
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- pop {r4, pc}
- .align 2, 0
-_08049654: .4byte gRoomControls
-_08049658: .4byte gUnk_080D29B8
-
- thumb_func_start sub_0804965C
-sub_0804965C: @ 0x0804965C
- push {r4, lr}
- adds r4, r0, #0
- adds r1, r4, #0
- adds r1, #0x76
- adds r0, #0x74
- ldrh r0, [r0]
- ldrh r2, [r1]
- adds r0, r0, r2
- strh r0, [r1]
- lsrs r0, r0, #8
- strb r0, [r4, #0x15]
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- ldrb r0, [r4, #0xe]
- subs r0, #1
- strb r0, [r4, #0xe]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _0804969A
- movs r0, #3
- strb r0, [r4, #0xd]
- movs r0, #0x1e
- strb r0, [r4, #0xe]
-_0804969A:
- pop {r4, pc}
-
- thumb_func_start sub_0804969C
-sub_0804969C: @ 0x0804969C
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- ldrb r0, [r4, #0xe]
- subs r0, #1
- strb r0, [r4, #0xe]
- lsls r0, r0, #0x18
- lsrs r1, r0, #0x18
- cmp r1, #0
- bne _080496C8
- movs r0, #2
- strb r0, [r4, #0xc]
- strb r1, [r4, #0xd]
-_080496C8:
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_080496CC
-sub_080496CC: @ 0x080496CC
- push {r4, lr}
- adds r4, r0, #0
- ldr r1, _080496E8 @ =gUnk_080D29C0
- ldrb r0, [r4, #0xd]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r1, [r0]
- adds r0, r4, #0
- bl _call_via_r1
- adds r0, r4, #0
- bl UpdateAnimationSingleFrame
- pop {r4, pc}
- .align 2, 0
-_080496E8: .4byte gUnk_080D29C0
-
- thumb_func_start sub_080496EC
-sub_080496EC: @ 0x080496EC
- push {r4, lr}
- adds r4, r0, #0
- movs r0, #0x94
- lsls r0, r0, #1
- bl SoundReq
- bl sub_08079F8C
- cmp r0, #0
- beq _08049720
- ldr r0, _0804971C @ =gPlayerEntity
- movs r1, #0x36
- ldrsh r0, [r0, r1]
- cmp r0, #0
- bne _08049720
- movs r0, #2
- bl SetPlayerControl
- movs r0, #2
- strb r0, [r4, #0xd]
- movs r0, #0x1e
- strb r0, [r4, #0xe]
- b _08049724
- .align 2, 0
-_0804971C: .4byte gPlayerEntity
-_08049720:
- movs r0, #1
- strb r0, [r4, #0xd]
-_08049724:
- adds r0, r4, #0
- bl sub_08049944
- pop {r4, pc}
-
- thumb_func_start sub_0804972C
-sub_0804972C: @ 0x0804972C
- push {r4, lr}
- adds r4, r0, #0
- bl sub_08079F8C
- cmp r0, #0
- beq _08049750
- ldr r0, _08049758 @ =gPlayerEntity
- movs r1, #0x36
- ldrsh r0, [r0, r1]
- cmp r0, #0
- bne _08049750
- movs r0, #2
- bl SetPlayerControl
- movs r0, #2
- strb r0, [r4, #0xd]
- movs r0, #1
- strb r0, [r4, #0xe]
-_08049750:
- adds r0, r4, #0
- bl sub_08049944
- pop {r4, pc}
- .align 2, 0
-_08049758: .4byte gPlayerEntity
-
- thumb_func_start sub_0804975C
-sub_0804975C: @ 0x0804975C
- push {lr}
- adds r1, r0, #0
- ldrb r0, [r1, #0xe]
- subs r0, #1
- strb r0, [r1, #0xe]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _0804977E
- movs r0, #3
- strb r0, [r1, #0xd]
- movs r0, #0xb4
- strb r0, [r1, #0xe]
- adds r0, #0x4c
- strh r0, [r1, #0x24]
- ldrb r0, [r1, #0x15]
- subs r0, #0x40
- strb r0, [r1, #0x15]
-_0804977E:
- adds r0, r1, #0
- bl sub_08049944
- pop {pc}
- .align 2, 0
-
- thumb_func_start sub_08049788
-sub_08049788: @ 0x08049788
- push {r4, lr}
- adds r4, r0, #0
- bl sub_08049AB0
- ldrb r0, [r4, #0xe]
- subs r0, #1
- strb r0, [r4, #0xe]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _080497B8
- movs r0, #0x1e
- strb r0, [r4, #0xe]
- movs r0, #4
- strb r0, [r4, #0xd]
- movs r0, #0x80
- lsls r0, r0, #3
- strh r0, [r4, #0x24]
- ldrb r0, [r4, #0x14]
- strb r0, [r4, #0x15]
- movs r0, #0x94
- lsls r0, r0, #1
- bl SoundReq
- b _080497C6
-_080497B8:
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- eors r0, r1
- strb r0, [r4, #0x15]
- adds r0, r4, #0
- bl sub_08049B20
-_080497C6:
- adds r0, r4, #0
- bl sub_08049944
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_080497D0
-sub_080497D0: @ 0x080497D0
- push {r4, lr}
- adds r4, r0, #0
- bl sub_08049AB0
- ldrb r0, [r4, #0x15]
- movs r1, #0x80
- lsls r1, r1, #1
- subs r1, r1, r0
- movs r0, #0xff
- ands r1, r0
- lsls r1, r1, #8
- adds r0, r4, #0
- bl sub_08049998
- ldrb r0, [r4, #0xe]
- subs r0, #1
- strb r0, [r4, #0xe]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _08049802
- movs r0, #5
- strb r0, [r4, #0xd]
- movs r1, #0x10
- bl SetFade
-_08049802:
- pop {r4, pc}
-
- thumb_func_start sub_08049804
-sub_08049804: @ 0x08049804
- push {r4, lr}
- adds r4, r0, #0
- bl sub_08049944
- ldr r0, _0804987C @ =gFadeControl
- ldrb r0, [r0]
- cmp r0, #0
- bne _08049878
- movs r0, #6
- strb r0, [r4, #0xd]
- ldrb r1, [r4, #0x18]
- movs r3, #4
- rsbs r3, r3, #0
- adds r0, r3, #0
- ands r0, r1
- strb r0, [r4, #0x18]
- ldr r4, [r4, #0x54]
- ldrb r2, [r4, #0x10]
- movs r1, #0x7f
- adds r0, r1, #0
- ands r0, r2
- strb r0, [r4, #0x10]
- ldrb r2, [r4, #0x18]
- adds r0, r3, #0
- ands r0, r2
- strb r0, [r4, #0x18]
- ldr r4, [r4, #0x54]
- ldrb r2, [r4, #0x10]
- adds r0, r1, #0
- ands r0, r2
- strb r0, [r4, #0x10]
- ldrb r2, [r4, #0x18]
- adds r0, r3, #0
- ands r0, r2
- strb r0, [r4, #0x18]
- ldr r4, [r4, #0x54]
- ldrb r0, [r4, #0x10]
- ands r1, r0
- strb r1, [r4, #0x10]
- ldrb r0, [r4, #0x18]
- ands r3, r0
- strb r3, [r4, #0x18]
- ldr r4, _08049880 @ =gPlayerEntity
- ldr r1, _08049884 @ =gRoomControls
- ldrh r0, [r1, #6]
- adds r0, #0xa8
- movs r2, #0
- strh r0, [r4, #0x2e]
- ldrh r0, [r1, #8]
- adds r0, #0x80
- strh r0, [r4, #0x32]
- strb r2, [r4, #0x14]
- bl sub_080809D4
- movs r0, #4
- movs r1, #4
- bl SetFade
-_08049878:
- pop {r4, pc}
- .align 2, 0
-_0804987C: .4byte gFadeControl
-_08049880: .4byte gPlayerEntity
-_08049884: .4byte gRoomControls
-
- thumb_func_start sub_08049888
-sub_08049888: @ 0x08049888
- push {lr}
- adds r1, r0, #0
- ldr r0, _080498B0 @ =gFadeControl
- ldrb r0, [r0]
- cmp r0, #0
- bne _080498AE
- movs r0, #7
- strb r0, [r1, #0xd]
- movs r0, #0xa0
- strb r0, [r1, #0xe]
- movs r0, #0x72
- bl SoundReq
- movs r0, #0x7c
- bl SetFlag
- movs r0, #1
- bl SetPlayerControl
-_080498AE:
- pop {pc}
- .align 2, 0
-_080498B0: .4byte gFadeControl
-
- thumb_func_start sub_080498B4
-sub_080498B4: @ 0x080498B4
- push {lr}
- ldrb r1, [r0, #0xe]
- subs r1, #1
- strb r1, [r0, #0xe]
- lsls r0, r1, #0x18
- cmp r0, #0
- bne _080498C8
- bl DeleteThisEntity
- b _0804993E
-_080498C8:
- lsls r0, r1, #0x18
- lsrs r0, r0, #0x18
- cmp r0, #0x10
- bne _080498E4
- movs r0, #0x36
- movs r1, #0xca
- movs r2, #1
- bl sub_0807B7D8
- ldr r0, _080498E0 @ =0x00004081
- movs r1, #0xca
- b _0804990E
- .align 2, 0
-_080498E0: .4byte 0x00004081
-_080498E4:
- cmp r0, #0x18
- bne _080498FC
- movs r0, #0x36
- movs r1, #0x8a
- movs r2, #1
- bl sub_0807B7D8
- ldr r0, _080498F8 @ =0x00004081
- movs r1, #0x8a
- b _0804990E
- .align 2, 0
-_080498F8: .4byte 0x00004081
-_080498FC:
- cmp r0, #0x20
- bne _08049920
- movs r0, #0x36
- movs r1, #0x4a
- movs r2, #1
- bl sub_0807B7D8
- ldr r0, _0804991C @ =0x00004081
- movs r1, #0x4a
-_0804990E:
- movs r2, #2
- bl SetTile
- movs r0, #0x71
- bl SoundReq
- b _0804993E
- .align 2, 0
-_0804991C: .4byte 0x00004081
-_08049920:
- cmp r0, #0x28
- bne _0804993E
- movs r0, #0x36
- movs r1, #0xa
- movs r2, #1
- bl sub_0807B7D8
- ldr r0, _08049940 @ =0x00004081
- movs r1, #0xa
- movs r2, #2
- bl SetTile
- movs r0, #0x71
- bl SoundReq
-_0804993E:
- pop {pc}
- .align 2, 0
-_08049940: .4byte 0x00004081
-
- thumb_func_start sub_08049944
-sub_08049944: @ 0x08049944
- push {r4, r5, lr}
- adds r4, r0, #0
- adds r4, #0x7c
- ldrb r3, [r4]
- lsls r2, r3, #1
- movs r1, #0x7f
- ands r2, r1
- movs r1, #0x80
- ands r1, r3
- orrs r2, r1
- strb r2, [r4]
- ldr r5, _08049990 @ =gPlayerEntity
- movs r2, #0x2e
- ldrsh r1, [r5, r2]
- movs r3, #0x32
- ldrsh r2, [r5, r3]
- movs r3, #0x20
- bl EntityWithinDistance
- cmp r0, #0
- beq _0804998C
- ldr r2, _08049994 @ =gPlayerState
- movs r0, #1
- strb r0, [r2, #0x14]
- movs r1, #0x36
- ldrsh r0, [r5, r1]
- cmp r0, #0
- bne _0804998C
- ldr r0, [r2, #0x30]
- movs r1, #2
- orrs r0, r1
- str r0, [r2, #0x30]
- ldrb r0, [r4]
- movs r1, #1
- orrs r0, r1
- strb r0, [r4]
-_0804998C:
- pop {r4, r5, pc}
- .align 2, 0
-_08049990: .4byte gPlayerEntity
-_08049994: .4byte gPlayerState
-
- thumb_func_start sub_08049998
-sub_08049998: @ 0x08049998
- push {r4, r5, r6, lr}
- adds r5, r0, #0
- adds r4, r1, #0
- bl sub_08049944
- adds r0, r5, #0
- adds r1, r4, #0
- bl sub_08047EA4
- movs r0, #0x2e
- ldrsh r4, [r5, r0]
- movs r2, #0x32
- ldrsh r6, [r5, r2]
- movs r0, #0x24
- ldrsh r1, [r5, r0]
- ldrb r2, [r5, #0x15]
- adds r0, r5, #0
- bl LinearMoveAngle
- adds r0, r5, #0
- adds r0, #0x7c
- ldrb r1, [r0]
- movs r0, #1
- ands r0, r1
- cmp r0, #0
- beq _080499EA
- bl sub_08079F8C
- cmp r0, #0
- beq _080499EA
- ldr r0, _080499EC @ =gPlayerEntity
- ldrh r1, [r5, #0x2e]
- subs r1, r1, r4
- ldrh r2, [r0, #0x2e]
- adds r1, r1, r2
- strh r1, [r0, #0x2e]
- ldrh r1, [r5, #0x32]
- subs r1, r1, r6
- ldrh r2, [r0, #0x32]
- adds r1, r1, r2
- strh r1, [r0, #0x32]
-_080499EA:
- pop {r4, r5, r6, pc}
- .align 2, 0
-_080499EC: .4byte gPlayerEntity
-
- thumb_func_start sub_080499F0
-sub_080499F0: @ 0x080499F0
- push {r4, r5, r6, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0xc]
- cmp r0, #0
- beq _08049A82
- ldr r5, _08049A84 @ =gPlayerEntity
- movs r1, #0x36
- ldrsh r0, [r5, r1]
- cmp r0, #0
- bne _08049A82
- bl sub_08079F8C
- cmp r0, #0
- beq _08049A82
- adds r2, r4, #0
- adds r2, #0x7c
- ldrb r1, [r2]
- movs r0, #1
- ands r0, r1
- adds r6, r2, #0
- cmp r0, #0
- bne _08049A82
- movs r2, #0x2e
- ldrsh r1, [r4, r2]
- movs r3, #0x32
- ldrsh r2, [r4, r3]
- adds r0, r5, #0
- movs r3, #0x24
- bl EntityWithinDistance
- cmp r0, #0
- beq _08049A7E
- ldrb r1, [r6]
- movs r0, #2
- ands r0, r1
- cmp r0, #0
- bne _08049A7E
- movs r1, #0x2e
- ldrsh r0, [r5, r1]
- movs r2, #0x2e
- ldrsh r1, [r4, r2]
- subs r0, r0, r1
- movs r3, #0x32
- ldrsh r1, [r5, r3]
- movs r3, #0x32
- ldrsh r2, [r4, r3]
- subs r1, r1, r2
- bl sub_080045DA
- ldr r3, _08049A88 @ =gSineTable
- lsls r1, r0, #1
- adds r1, r1, r3
- movs r2, #0
- ldrsh r1, [r1, r2]
- lsls r2, r1, #3
- adds r2, r2, r1
- lsls r2, r2, #0xa
- ldr r1, [r4, #0x2c]
- adds r1, r1, r2
- str r1, [r5, #0x2c]
- adds r0, #0x40
- lsls r0, r0, #1
- adds r0, r0, r3
- movs r3, #0
- ldrsh r0, [r0, r3]
- lsls r1, r0, #3
- adds r1, r1, r0
- lsls r1, r1, #0xa
- ldr r0, [r4, #0x30]
- subs r0, r0, r1
- str r0, [r5, #0x30]
-_08049A7E:
- movs r0, #0
- strb r0, [r6]
-_08049A82:
- pop {r4, r5, r6, pc}
- .align 2, 0
-_08049A84: .4byte gPlayerEntity
-_08049A88: .4byte gSineTable
-
- thumb_func_start sub_08049A8C
-sub_08049A8C: @ 0x08049A8C
- push {lr}
- ldrb r1, [r0, #0xe]
- subs r1, #1
- strb r1, [r0, #0xe]
- lsls r1, r1, #0x18
- cmp r1, #0
- bne _08049AAA
- bl Random
- movs r1, #0xf
- ands r1, r0
- cmp r1, #0
- beq _08049AAA
- movs r0, #1
- b _08049AAC
-_08049AAA:
- movs r0, #0
-_08049AAC:
- pop {pc}
- .align 2, 0
-
- thumb_func_start sub_08049AB0
-sub_08049AB0: @ 0x08049AB0
- push {r4, r5, lr}
- adds r2, r0, #0
- ldrb r0, [r2, #0xf]
- adds r0, #1
- strb r0, [r2, #0xf]
- movs r1, #0xff
- ands r0, r1
- movs r1, #0xf
- ands r0, r1
- cmp r0, #0
- bne _08049B18
- adds r0, r2, #0
- movs r1, #0x48
- movs r2, #0
- bl CreateFx
- adds r4, r0, #0
- cmp r4, #0
- beq _08049B18
- bl Random
- movs r3, #0x30
- adds r1, r0, #0
- ands r1, r3
- ldr r5, _08049B1C @ =0x0000FFE8
- adds r2, r5, #0
- adds r1, r2, r1
- ldrh r5, [r4, #0x2e]
- adds r1, r1, r5
- strh r1, [r4, #0x2e]
- lsrs r0, r0, #8
- ands r0, r3
- adds r2, r2, r0
- ldrh r0, [r4, #0x32]
- adds r2, r2, r0
- strh r2, [r4, #0x32]
- adds r2, r4, #0
- adds r2, #0x29
- ldrb r1, [r2]
- movs r0, #8
- rsbs r0, r0, #0
- ands r0, r1
- movs r1, #3
- orrs r0, r1
- strb r0, [r2]
- adds r1, r4, #0
- adds r1, #0x38
- movs r0, #2
- strb r0, [r1]
- adds r0, r4, #0
- bl UpdateSpriteForCollisionLayer
-_08049B18:
- pop {r4, r5, pc}
- .align 2, 0
-_08049B1C: .4byte 0x0000FFE8
-
- thumb_func_start sub_08049B20
-sub_08049B20: @ 0x08049B20
- push {r4, r5, r6, lr}
- adds r4, r0, #0
- bl sub_08049944
- movs r0, #0x2e
- ldrsh r5, [r4, r0]
- movs r2, #0x32
- ldrsh r6, [r4, r2]
- movs r0, #0x24
- ldrsh r1, [r4, r0]
- ldrb r2, [r4, #0x15]
- adds r0, r4, #0
- bl LinearMoveAngle
- adds r0, r4, #0
- adds r0, #0x7c
- ldrb r1, [r0]
- movs r0, #1
- ands r0, r1
- cmp r0, #0
- beq _08049B68
- bl sub_08079F8C
- cmp r0, #0
- beq _08049B68
- ldr r0, _08049B6C @ =gPlayerEntity
- ldrh r1, [r4, #0x2e]
- subs r1, r1, r5
- ldrh r2, [r0, #0x2e]
- adds r1, r1, r2
- strh r1, [r0, #0x2e]
- ldrh r1, [r4, #0x32]
- subs r1, r1, r6
- ldrh r2, [r0, #0x32]
- adds r1, r1, r2
- strh r1, [r0, #0x32]
-_08049B68:
- pop {r4, r5, r6, pc}
- .align 2, 0
-_08049B6C: .4byte gPlayerEntity
diff --git a/assets/assets.json b/assets/assets.json
index 84d3d877..b1e30e55 100644
--- a/assets/assets.json
+++ b/assets/assets.json
@@ -29131,11 +29131,6 @@
"type": "animation"
},
{
- "path": "enemy64/gUnk_080D29B8.bin",
- "start": 862648,
- "size": 8
- },
- {
"path": "data_080D3D94/gUnk_080D3D94.bin",
"start": 867732,
"size": 224
diff --git a/data/const/enemy/enemy64.s b/data/const/enemy/enemy64.s
deleted file mode 100644
index 87d0e668..00000000
--- a/data/const/enemy/enemy64.s
+++ /dev/null
@@ -1,44 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .section .rodata
- .align 2
-
-
-gUnk_080D2974:: @ 080D2974
- .4byte sub_08049100
- .4byte sub_080491EC
- .4byte sub_080492A8
- .4byte sub_08049574
- .4byte sub_080496CC
-
-gUnk_080D2988:: @ 080D2988
- .4byte sub_0804920C
- .4byte sub_08049274
-
-gUnk_080D2990:: @ 080D2990
- .4byte sub_080492C8
- .4byte sub_08049358
- .4byte sub_080493E4
- .4byte sub_0804945C
- .4byte sub_080494D0
- .4byte sub_08049538
-
-gUnk_080D29A8:: @ 080D29A8
- .4byte sub_08049594
- .4byte sub_080495F8
- .4byte sub_0804965C
- .4byte sub_0804969C
-
-gUnk_080D29B8:: @ 080D29B8
- .incbin "enemy64/gUnk_080D29B8.bin"
-
-gUnk_080D29C0:: @ 080D29C0
- .4byte sub_080496EC
- .4byte sub_0804972C
- .4byte sub_0804975C
- .4byte sub_08049788
- .4byte sub_080497D0
- .4byte sub_08049804
- .4byte sub_08049888
- .4byte sub_080498B4
diff --git a/include/enemy.h b/include/enemy.h
index 4bbecfec..07bd48cc 100644
--- a/include/enemy.h
+++ b/include/enemy.h
@@ -232,7 +232,7 @@ void GyorgChild();
void GyorgFemaleEye();
void Enemy62(Entity*);
void GyorgFemaleMouth();
-void Enemy64(Entity*);
+void Enemy64();
void TreeItem(Entity*);
void Enemy66(Entity*);
diff --git a/linker.ld b/linker.ld
index e2071a6c..b97afccf 100644
--- a/linker.ld
+++ b/linker.ld
@@ -422,9 +422,9 @@ SECTIONS {
src/enemy/vaatiWrathEye.o(.text);
src/enemy/gyorgChild.o(.text);
src/enemy/gyorgFemaleEye.o(.text);
- asm/enemy/enemy62.o(.text);
+ asm/enemy/enemy62.o(.text); /* TODO gyorgMaleEye? */
src/enemy/gyorgFemaleMouth.o(.text);
- asm/enemy/enemy64.o(.text);
+ src/enemy/enemy64.o(.text);
src/enemy/treeItem.o(.text);
src/enemy/enemy66.o(.text);
/* END enemies */
@@ -1115,7 +1115,7 @@ SECTIONS {
data/animations/enemy/enemy62.o(.rodata);
src/enemy/gyorgFemaleMouth.o(.rodata);
data/animations/enemy/gyorgFemaleMouth.o(.rodata);
- data/const/enemy/enemy64.o(.rodata);
+ src/enemy/enemy64.o(.rodata);
src/enemy/treeItem.o(.rodata);
src/enemy/enemy66.o(.rodata);
src/enemy.o(.rodata);
diff --git a/src/enemy/enemy64.c b/src/enemy/enemy64.c
new file mode 100644
index 00000000..8fde9fbc
--- /dev/null
+++ b/src/enemy/enemy64.c
@@ -0,0 +1,523 @@
+/**
+ * @file enemy64.c
+ * @ingroup Enemies
+ *
+ * @brief Enemy64 enemy
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "enemy.h"
+#include "functions.h"
+#include "fade.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u8 unk_68[0x6];
+ /*0x6e*/ u8 unk_6e;
+ /*0x6f*/ u8 unk_6f[0x5];
+ /*0x74*/ s16 unk_74;
+ /*0x76*/ u16 unk_76;
+ /*0x78*/ u16 unk_78;
+ /*0x7a*/ u16 unk_7a;
+ /*0x7c*/ u8 unk_7c;
+ /*0x7d*/ u8 unk_7d;
+ /*0x7e*/ u16 unk_7e;
+ /*0x80*/ u16 unk_80;
+ /*0x82*/ u16 unk_82;
+} Enemy64Entity;
+
+extern void sub_08047EA4(Entity*, u32); // gyorgMale
+
+extern void (*const Enemy64_Actions[])(Enemy64Entity*);
+extern void (*const Enemy64_Action1_SubActions[])(Enemy64Entity*);
+extern void (*const Enemy64_Action2_SubActions[])(Enemy64Entity*);
+extern void (*const Enemy64_Action3_SubActions[])(Enemy64Entity*);
+extern const u8 gUnk_080D29B8[];
+extern void (*const Enemy64_Action4_SubActions[])(Enemy64Entity*);
+
+void sub_080499F0(Enemy64Entity*);
+void sub_08049998(Enemy64Entity*, u32);
+void Enemy64_Action2_SubAction1(Enemy64Entity*);
+void sub_08049944(Enemy64Entity*);
+bool32 sub_08049A8C(Enemy64Entity*);
+void sub_08049AB0(Enemy64Entity*);
+void sub_08049B20(Enemy64Entity*);
+
+void Enemy64(Enemy64Entity* this) {
+ if (super->action != 0) {
+ super->spriteSettings.draw = this->unk_7d;
+ }
+ if (super->health == 0) {
+ super->health = 0xff;
+ super->action = 4;
+ super->subAction = 0;
+ }
+ Enemy64_Actions[super->action](this);
+ sub_0805EC9C(super, 0xaa, 0xaa, this->unk_78);
+ super->animationState = -(this->unk_78 >> 8);
+ sub_080499F0(this);
+ this->unk_7d = super->spriteSettings.draw;
+ if (((super->spriteSettings.draw == 1) && (0x100 < (super->y.HALF.HI - gRoomControls.scroll_y) + 0x30U))) {
+ super->spriteSettings.draw = 0;
+ }
+}
+
+void Enemy64_Init(Enemy64Entity* this) {
+ Entity* tail;
+
+ if (CheckFlags(0x7c)) {
+ SetTile(0x4081, 10, 2);
+ SetTile(0x4081, 0x4a, 2);
+ SetTile(0x4081, 0x8a, 2);
+ SetTile(0x4081, 0xca, 2);
+ DeleteThisEntity();
+ } else {
+ sub_0807B7D8(0x323, 10, 1);
+ sub_0807B7D8(0x323, 0x4a, 1);
+ sub_0807B7D8(0x323, 0x8a, 1);
+ sub_0807B7D8(0x323, 0xca, 1);
+ }
+ tail = CreateProjectile(GYORG_TAIL);
+ if (tail != NULL) {
+ tail->type = 1;
+ tail->parent = super;
+ super->child = tail;
+ super->action = 1;
+ super->subAction = 0;
+ super->actionDelay = 0x3c;
+ super->direction = 0xc0;
+ super->animationState = 0xc0;
+ super->speed = 0x300;
+ super->spriteRendering.b0 = 3;
+ super->spriteSettings.draw = 1;
+ super->spriteOrientation.flipY = 2;
+ super->spriteRendering.b3 = 2;
+ super->collisionLayer = 2;
+ this->unk_7c = 0;
+ this->unk_78 = 0x4000;
+ this->unk_7a = 0x4000;
+ InitAnimationForceUpdate(super, 0);
+ }
+}
+
+void Enemy64_Action1(Enemy64Entity* this) {
+ Enemy64_Action1_SubActions[super->subAction](this);
+ UpdateAnimationSingleFrame(super);
+}
+
+void Enemy64_Action1_SubAction0(Enemy64Entity* this) {
+ if (super->actionDelay != 0) {
+ super->actionDelay--;
+ } else {
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+ if ((gRoomControls.origin_x - 0x100) > super->x.HALF.HI) {
+ super->subAction = 1;
+ super->direction = 0x80;
+ super->animationState = 0x80;
+ super->speed = 0xc0;
+ super->x.HALF.HI = gRoomControls.origin_x + 0xa8;
+ super->y.HALF.HI = gRoomControls.origin_y - 0x40;
+ this->unk_78 = 0x8000;
+ this->unk_7a = 0x8000;
+ }
+ }
+}
+
+void Enemy64_Action1_SubAction1(Enemy64Entity* this) {
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+ if ((gRoomControls.origin_y + 0x40) < super->y.HALF.HI) {
+ super->action = 2;
+ super->subAction = 0;
+ }
+}
+
+void Enemy64_Action2(Enemy64Entity* this) {
+ Enemy64_Action2_SubActions[super->subAction](this);
+ UpdateAnimationSingleFrame(super);
+}
+
+void Enemy64_Action2_SubAction0(Enemy64Entity* this) {
+ u16 uVar1;
+ u16* puVar2;
+
+ super->subAction = 1;
+ super->speed = 0x120;
+ this->unk_6e = 0;
+ if ((s32)(super->x.HALF.HI - (u32)gRoomControls.origin_x) < 0xa8) {
+ this->unk_80 = 0xd8;
+ this->unk_74 = 0x100;
+ } else {
+ this->unk_80 = 0x78;
+ this->unk_74 = 0xff00;
+ }
+ this->unk_80 += gRoomControls.origin_x;
+ if ((s32)(super->y.HALF.HI - (u32)gRoomControls.origin_y) < 0x80) {
+ this->unk_82 = 0xb0;
+ } else {
+ this->unk_82 = 0x50;
+ this->unk_74 *= -1;
+ }
+ this->unk_82 += gRoomControls.origin_y;
+ Enemy64_Action2_SubAction1(this);
+}
+
+void Enemy64_Action2_SubAction1(Enemy64Entity* this) {
+ u32 tmp = sub_080045DA(this->unk_80 - super->x.HALF.HI, this->unk_82 - super->y.HALF.HI);
+ if (4 < (((super->direction - tmp) + 2) & 0xff)) {
+ if (((tmp - super->direction) & 0x80) != 0) {
+ super->direction--;
+ } else {
+ super->direction++;
+ }
+ }
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+ if (EntityWithinDistance(super, this->unk_80, this->unk_82, (super->speed >> 0x10) + 0x10)) {
+ super->subAction = 2;
+ super->speed = 0xc0;
+ this->unk_7e = 0x100;
+ this->unk_76 = (u16)super->direction << 8;
+ }
+}
+
+void Enemy64_Action2_SubAction2(Enemy64Entity* this) {
+ u32 iVar1;
+ u32 uVar2;
+ u32 uVar3;
+
+ iVar1 = this->unk_76 += this->unk_74;
+ uVar2 = iVar1 * 0x10000;
+ super->direction = (u8)(uVar2 >> 0x18);
+ if (((uVar2 >> 0x18 & 0x1f) == 0) &&
+ (uVar3 = CalculateDirectionTo(super->x.HALF.HI, super->y.HALF.HI, gRoomControls.origin_x + 0xa8,
+ gRoomControls.origin_y + 0x80),
+ ((((uVar3 + 2) & 0x1c) - (super->direction >> 3)) & 0xf) == 8)) {
+ super->subAction = 4;
+ super->actionDelay = 0x3c;
+ super->field_0xf = 7;
+ }
+ sub_08049944(this);
+ sub_08047EA4(super, ((0x100 - super->direction) & 0xff) << 8);
+}
+
+void Enemy64_Action2_SubAction3(Enemy64Entity* this) {
+ s32 iVar1;
+ u32 uVar2;
+
+ iVar1 = this->unk_76 += this->unk_74;
+ uVar2 = iVar1 * 0x10000;
+ super->direction = (uVar2 >> 0x18);
+ if (super->actionDelay == 0) {
+ if ((uVar2 >> 0x18 & 0x1f) == 0) {
+ super->subAction = 4;
+ super->actionDelay = 0x5a;
+ }
+ } else {
+ if (sub_08049A8C(this)) {
+ Entity* projectile = CreateProjectile(GYORG_MALE_ENERGY_PROJECTILE);
+ if (projectile != NULL) {
+ projectile->collisionLayer = 2;
+ projectile->parent = super;
+ UpdateSpriteForCollisionLayer(projectile);
+ }
+ }
+ }
+ sub_08049944(this);
+ sub_08047EA4(super, ((0x100 - super->direction) & 0xff) << 8);
+}
+
+void Enemy64_Action2_SubAction4(Enemy64Entity* this) {
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+ if (--super->actionDelay == 0) {
+ if (--super->field_0xf == 0) {
+ super->subAction = 5;
+ super->speed += 0x40;
+ } else {
+ super->subAction = 3;
+ super->actionDelay = 0xa;
+ }
+ } else if (super->actionDelay == 0x50) {
+ Entity* enemy = CreateEnemy(GYORG_MALE_EYE, Random() & 3);
+ if (enemy != NULL) {
+ enemy->parent = super;
+ }
+ }
+}
+
+void Enemy64_Action2_SubAction5(Enemy64Entity* this) {
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+ if (EntityWithinDistance(super, gRoomControls.origin_x + 0xa8, gRoomControls.origin_y + 0x80, 0x70) == FALSE) {
+ super->action = 3;
+ super->subAction = 0;
+ }
+}
+
+void Enemy64_Action3(Enemy64Entity* this) {
+ Enemy64_Action3_SubActions[super->subAction](this);
+ UpdateAnimationSingleFrame(super);
+}
+
+void Enemy64_Action3_SubAction0(Enemy64Entity* this) {
+ u32 tmp = sub_080045DA(gRoomControls.origin_x + 0xa8 - super->x.HALF.HI,
+ gRoomControls.origin_y + 0x80 - super->y.HALF.HI);
+ if (tmp != super->direction) {
+ if (((tmp - super->direction) & 0x80) != 0) {
+ super->direction--;
+ } else {
+ super->direction++;
+ }
+ } else {
+ super->subAction = 1;
+ super->speed = 0x180;
+ }
+ sub_08049944(this);
+ sub_08047EA4(super, ((0x100 - super->direction) & 0xff) << 8);
+}
+
+void Enemy64_Action3_SubAction1(Enemy64Entity* this) {
+ if (EntityWithinDistance(super, gRoomControls.origin_x + 0xa8, gRoomControls.origin_y + 0x80, 0x28)) {
+ super->subAction = 2;
+ super->actionDelay = 0x2d;
+ this->unk_74 = gUnk_080D29B8[Random() & 7] << 0x18 >> 0x18;
+ this->unk_76 = super->direction << 8;
+ }
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+}
+
+void Enemy64_Action3_SubAction2(Enemy64Entity* this) {
+ this->unk_76 += this->unk_74;
+ super->direction = this->unk_76 >> 8;
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+ if (--super->actionDelay == 0) {
+ super->subAction = 3;
+ super->actionDelay = 0x1e;
+ }
+}
+
+void Enemy64_Action3_SubAction3(Enemy64Entity* this) {
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+ if (--super->actionDelay == 0) {
+ super->action = 2;
+ super->subAction = 0;
+ }
+}
+
+void Enemy64_Action4(Enemy64Entity* this) {
+ Enemy64_Action4_SubActions[super->subAction](this);
+ UpdateAnimationSingleFrame(super);
+}
+
+void Enemy64_Action4_SubAction0(Enemy64Entity* this) {
+ SoundReq(SFX_BOSS_DIE);
+ if (sub_08079F8C() && gPlayerEntity.z.HALF.HI == 0) {
+ SetPlayerControl(CONTROL_2);
+ super->subAction = 2;
+ super->actionDelay = 0x1e;
+ } else {
+ super->subAction = 1;
+ }
+ sub_08049944(this);
+}
+
+void Enemy64_Action4_SubAction1(Enemy64Entity* this) {
+ if (sub_08079F8C() && gPlayerEntity.z.HALF.HI == 0) {
+ SetPlayerControl(CONTROL_2);
+ super->subAction = 2;
+ super->actionDelay = 1;
+ }
+ sub_08049944(this);
+}
+
+void Enemy64_Action4_SubAction2(Enemy64Entity* this) {
+ if (--super->actionDelay == 0) {
+ super->subAction = 3;
+ super->actionDelay = 0xb4;
+ super->speed = 0x100;
+ super->direction -= 0x40;
+ }
+ sub_08049944(this);
+}
+
+void Enemy64_Action4_SubAction3(Enemy64Entity* this) {
+ sub_08049AB0(this);
+ if (--super->actionDelay == 0) {
+ super->actionDelay = 0x1e;
+ super->subAction = 4;
+ super->speed = 0x400;
+ super->direction = super->animationState;
+ SoundReq(SFX_BOSS_DIE);
+ } else {
+ super->direction ^= 0x80;
+ sub_08049B20(this);
+ }
+ sub_08049944(this);
+}
+
+void Enemy64_Action4_SubAction4(Enemy64Entity* this) {
+ sub_08049AB0(this);
+ sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
+ if (--super->actionDelay == 0) {
+ super->subAction = 5;
+ SetFade(5, 0x10);
+ }
+}
+
+void Enemy64_Action4_SubAction5(Enemy64Entity* this) {
+ Entity* entity;
+ sub_08049944(this);
+ if (gFadeControl.active == 0) {
+ super->subAction = 6;
+ super->spriteSettings.draw = 0;
+ entity = super->child;
+ entity->flags &= 0x7f;
+ entity->spriteSettings.draw = 0;
+ entity = entity->child;
+ entity->flags &= 0x7f;
+ entity->spriteSettings.draw = 0;
+ entity = entity->child;
+ entity->flags &= 0x7f;
+ entity->spriteSettings.draw = 0;
+ entity = &gPlayerEntity;
+ entity->x.HALF.HI = gRoomControls.origin_x + 0xa8;
+ entity->y.HALF.HI = gRoomControls.origin_y + 0x80;
+ entity->animationState = 0;
+ sub_080809D4();
+ SetFade(4, 4);
+ }
+}
+
+void Enemy64_Action4_SubAction6(Enemy64Entity* this) {
+ if (gFadeControl.active == 0) {
+ super->subAction = 7;
+ super->actionDelay = 0xa0;
+ SoundReq(SFX_SECRET);
+ SetFlag(0x7c);
+ SetPlayerControl(CONTROL_1);
+ }
+}
+
+void Enemy64_Action4_SubAction7(Enemy64Entity* this) {
+ if (--super->actionDelay == 0) {
+ DeleteThisEntity();
+ } else if (super->actionDelay == 0x10) {
+ sub_0807B7D8(0x36, 0xca, 1);
+ SetTile(0x4081, 0xca, 2);
+ SoundReq(SFX_HEART_GET);
+ } else if (super->actionDelay == 0x18) {
+ sub_0807B7D8(0x36, 0x8a, 1);
+ SetTile(0x4081, 0x8a, 2);
+ SoundReq(SFX_HEART_GET);
+ } else if (super->actionDelay == 0x20) {
+ sub_0807B7D8(0x36, 0x4a, 1);
+ SetTile(0x4081, 0x4a, 2);
+ SoundReq(SFX_HEART_GET);
+ } else if (super->actionDelay == 0x28) {
+ sub_0807B7D8(0x36, 10, 1);
+ SetTile(0x4081, 10, 2);
+ SoundReq(SFX_HEART_GET);
+ }
+}
+
+void sub_08049944(Enemy64Entity* this) {
+ this->unk_7c = (this->unk_7c << 1 & 0x7f) | (this->unk_7c & 0x80);
+ if (EntityWithinDistance(super, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI, 0x20)) {
+ gPlayerState.field_0x14 = 1;
+ if (gPlayerEntity.z.HALF.HI == 0) {
+ gPlayerState.flags |= 2;
+ this->unk_7c |= 1;
+ }
+ }
+}
+
+void sub_08049998(Enemy64Entity* this, u32 param_2) {
+ s32 tmpX;
+ s32 tmpY;
+
+ sub_08049944(this);
+ sub_08047EA4(super, param_2);
+ tmpX = super->x.HALF.HI;
+ tmpY = super->y.HALF.HI;
+ LinearMoveAngle(super, super->speed, super->direction);
+ if (((this->unk_7c & 1) != 0) && sub_08079F8C()) {
+ gPlayerEntity.x.HALF.HI = (super->x.HALF.HI - tmpX) + gPlayerEntity.x.HALF.HI;
+ gPlayerEntity.y.HALF.HI = (super->y.HALF.HI - tmpY) + gPlayerEntity.y.HALF.HI;
+ }
+}
+
+void sub_080499F0(Enemy64Entity* this) {
+ u32 tmp;
+
+ if ((((super->action != 0) && (gPlayerEntity.z.HALF.HI == 0)) && (sub_08079F8C())) && ((this->unk_7c & 1) == 0)) {
+ if (EntityWithinDistance(&gPlayerEntity, super->x.HALF.HI, super->y.HALF.HI, 0x24) &&
+ ((this->unk_7c & 2) == 0)) {
+ tmp = sub_080045DA((s32)gPlayerEntity.x.HALF.HI - super->x.HALF.HI,
+ (s32)gPlayerEntity.y.HALF.HI - super->y.HALF.HI);
+ gPlayerEntity.x.WORD = super->x.WORD + gSineTable[tmp] * 0x2400;
+ gPlayerEntity.y.WORD = super->y.WORD + gSineTable[tmp + 0x40] * -0x2400;
+ }
+ this->unk_7c = 0;
+ }
+}
+
+bool32 sub_08049A8C(Enemy64Entity* this) {
+ if (--super->actionDelay == 0 && (Random() & 0xf) != 0) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+void sub_08049AB0(Enemy64Entity* this) {
+ u32 rand;
+
+ if ((++super->field_0xf & 0xf) == 0) {
+ Entity* effect = CreateFx(super, FX_GIANT_EXPLOSION3, 0);
+ if (effect != NULL) {
+ rand = Random();
+ effect->x.HALF.HI += ((rand & 0x30) - 0x18);
+ effect->y.HALF.HI += (((rand >> 8) & 0x30) - 0x18);
+ effect->spritePriority.b0 = 3;
+ effect->collisionLayer = 2;
+ UpdateSpriteForCollisionLayer(effect);
+ }
+ }
+}
+
+void sub_08049B20(Enemy64Entity* this) {
+ s32 tmpX;
+ s32 tmpY;
+
+ sub_08049944(this);
+ tmpX = super->x.HALF.HI;
+ tmpY = super->y.HALF.HI;
+ LinearMoveAngle(super, super->speed, super->direction);
+ if (((this->unk_7c & 1) != 0) && sub_08079F8C()) {
+ gPlayerEntity.x.HALF.HI = (super->x.HALF.HI - tmpX) + gPlayerEntity.x.HALF.HI;
+ gPlayerEntity.y.HALF.HI = (super->y.HALF.HI - tmpY) + gPlayerEntity.y.HALF.HI;
+ }
+}
+
+void (*const Enemy64_Actions[])(Enemy64Entity*) = {
+ Enemy64_Init, Enemy64_Action1, Enemy64_Action2, Enemy64_Action3, Enemy64_Action4,
+};
+void (*const Enemy64_Action1_SubActions[])(Enemy64Entity*) = {
+ Enemy64_Action1_SubAction0,
+ Enemy64_Action1_SubAction1,
+};
+void (*const Enemy64_Action2_SubActions[])(Enemy64Entity*) = {
+ Enemy64_Action2_SubAction0, Enemy64_Action2_SubAction1, Enemy64_Action2_SubAction2,
+ Enemy64_Action2_SubAction3, Enemy64_Action2_SubAction4, Enemy64_Action2_SubAction5,
+};
+void (*const Enemy64_Action3_SubActions[])(Enemy64Entity*) = {
+ Enemy64_Action3_SubAction0,
+ Enemy64_Action3_SubAction1,
+ Enemy64_Action3_SubAction2,
+ Enemy64_Action3_SubAction3,
+};
+const u8 gUnk_080D29B8[] = {
+ 144, 112, 56, 200, 0, 0, 0, 0,
+};
+void (*const Enemy64_Action4_SubActions[])(Enemy64Entity*) = {
+ Enemy64_Action4_SubAction0, Enemy64_Action4_SubAction1, Enemy64_Action4_SubAction2, Enemy64_Action4_SubAction3,
+ Enemy64_Action4_SubAction4, Enemy64_Action4_SubAction5, Enemy64_Action4_SubAction6, Enemy64_Action4_SubAction7,
+};