decompile Helmasaur

This commit is contained in:
Behemoth 2020-09-21 17:47:22 +02:00
parent e6e690107c
commit 1a1d35e392
7 changed files with 537 additions and 1006 deletions

View File

@ -1,936 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start Helmasaur
Helmasaur: @ 0x0802BB6C
push {r4, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xa]
cmp r0, #0
bne _0802BB94
ldr r1, _0802BB90 @ =gUnk_080CD3E4
adds r0, r4, #0
bl EnemyFunctionHandler
movs r3, #0x10
rsbs r3, r3, #0
adds r0, r4, #0
movs r1, #0
movs r2, #1
bl SetChildOffset
b _0802BBA4
.align 2, 0
_0802BB90: .4byte gUnk_080CD3E4
_0802BB94:
ldr r0, _0802BBA8 @ =gUnk_080CD3FC
ldrb r1, [r4, #0xc]
lsls r1, r1, #2
adds r1, r1, r0
ldr r1, [r1]
adds r0, r4, #0
bl _call_via_r1
_0802BBA4:
pop {r4, pc}
.align 2, 0
_0802BBA8: .4byte gUnk_080CD3FC
thumb_func_start sub_0802BBAC
sub_0802BBAC: @ 0x0802BBAC
push {lr}
ldr r2, _0802BBC0 @ =gUnk_080CD408
ldrb r1, [r0, #0xc]
lsls r1, r1, #2
adds r1, r1, r2
ldr r1, [r1]
bl _call_via_r1
pop {pc}
.align 2, 0
_0802BBC0: .4byte gUnk_080CD408
thumb_func_start sub_0802BBC4
sub_0802BBC4: @ 0x0802BBC4
push {r4, lr}
adds r4, r0, #0
adds r0, #0x3f
ldrb r0, [r0]
cmp r0, #0x19
beq _0802BBFE
adds r0, r4, #0
adds r0, #0x41
ldrb r0, [r0]
movs r1, #0x7f
ands r1, r0
cmp r1, #0
beq _0802BBEA
cmp r1, #0
blt _0802BBFE
cmp r1, #3
bgt _0802BBFE
cmp r1, #2
blt _0802BBFE
_0802BBEA:
ldrb r0, [r4, #0xc]
cmp r0, #4
bne _0802BBFE
adds r1, r4, #0
adds r1, #0x42
movs r0, #0
strb r0, [r1]
adds r0, r4, #0
bl sub_0802C218
_0802BBFE:
adds r0, r4, #0
adds r0, #0x43
ldrb r0, [r0]
cmp r0, #0
beq _0802BC10
adds r0, r4, #0
movs r1, #0x1c
bl sub_0804A9FC
_0802BC10:
ldr r1, _0802BC1C @ =gUnk_080CD3E4
adds r0, r4, #0
bl sub_0804AA30
pop {r4, pc}
.align 2, 0
_0802BC1C: .4byte gUnk_080CD3E4
thumb_func_start sub_0802BC20
sub_0802BC20: @ 0x0802BC20
push {r4, lr}
adds r4, r0, #0
adds r0, #0x3f
ldrb r0, [r0]
cmp r0, #0x19
beq _0802BC4C
adds r0, r4, #0
bl sub_0806F520
cmp r0, #0
beq _0802BC6C
ldr r0, _0802BC48 @ =gUnk_080CD42C
ldrb r1, [r4, #0xd]
lsls r1, r1, #2
adds r1, r1, r0
ldr r1, [r1]
adds r0, r4, #0
bl _call_via_r1
b _0802BC6C
.align 2, 0
_0802BC48: .4byte gUnk_080CD42C
_0802BC4C:
ldrb r0, [r4, #0xd]
cmp r0, #2
bhi _0802BC5C
adds r0, r4, #0
bl sub_0806F520
cmp r0, #0
beq _0802BC6C
_0802BC5C:
ldr r0, _0802BC70 @ =gUnk_080CD438
ldrb r1, [r4, #0xd]
lsls r1, r1, #2
adds r1, r1, r0
ldr r1, [r1]
adds r0, r4, #0
bl _call_via_r1
_0802BC6C:
pop {r4, pc}
.align 2, 0
_0802BC70: .4byte gUnk_080CD438
thumb_func_start sub_0802BC74
sub_0802BC74: @ 0x0802BC74
push {r4, lr}
adds r4, r0, #0
bl sub_0802C1C0
movs r0, #1
strb r0, [r4, #0xd]
movs r0, #0x3c
strb r0, [r4, #0x1d]
ldr r0, _0802BC9C @ =gPlayerEntity
ldrb r0, [r0, #0x14]
lsrs r0, r0, #1
movs r1, #2
eors r0, r1
strb r0, [r4, #0x14]
ldrb r1, [r4, #0x14]
adds r0, r4, #0
bl InitializeAnimation
pop {r4, pc}
.align 2, 0
_0802BC9C: .4byte gPlayerEntity
thumb_func_start sub_0802BCA0
sub_0802BCA0: @ 0x0802BCA0
push {lr}
bl sub_0806F4E8
pop {pc}
thumb_func_start sub_0802BCA8
sub_0802BCA8: @ 0x0802BCA8
push {r4, lr}
adds r4, r0, #0
adds r1, r4, #0
adds r1, #0x3f
ldrb r0, [r1]
cmp r0, #0x19
beq _0802BCFA
movs r0, #7
strb r0, [r4, #0xc]
movs r0, #0x5a
strb r0, [r4, #0xe]
movs r0, #0xc0
lsls r0, r0, #9
str r0, [r4, #0x20]
movs r0, #0x19
strb r0, [r1]
adds r2, r4, #0
adds r2, #0x3a
ldrb r1, [r2]
movs r0, #0xfb
ands r0, r1
strb r0, [r2]
movs r0, #0x12
strb r0, [r4, #0x1c]
movs r0, #0x20
movs r1, #1
bl CreateEnemy
adds r1, r0, #0
cmp r1, #0
beq _0802BCF0
ldrb r0, [r4, #0x14]
strb r0, [r1, #0x14]
adds r0, r4, #0
bl CopyPosition
_0802BCF0:
ldrb r1, [r4, #0x14]
adds r1, #4
adds r0, r4, #0
bl InitializeAnimation
_0802BCFA:
pop {r4, pc}
thumb_func_start sub_0802BCFC
sub_0802BCFC: @ 0x0802BCFC
movs r1, #1
strb r1, [r0, #0xd]
movs r1, #0x3c
strb r1, [r0, #0x1d]
bx lr
.align 2, 0
thumb_func_start sub_0802BD08
sub_0802BD08: @ 0x0802BD08
push {lr}
bl sub_0806F3E4
pop {pc}
thumb_func_start sub_0802BD10
sub_0802BD10: @ 0x0802BD10
push {lr}
ldrb r2, [r0, #0x10]
movs r1, #0x7f
ands r1, r2
strb r1, [r0, #0x10]
movs r1, #2
bl UpdateAnimationVariableFrames
pop {pc}
.align 2, 0
thumb_func_start nullsub_145
nullsub_145: @ 0x0802BD24
bx lr
.align 2, 0
thumb_func_start sub_0802BD28
sub_0802BD28: @ 0x0802BD28
push {lr}
adds r2, r0, #0
ldrb r3, [r2, #0x10]
movs r0, #0x80
ands r0, r3
lsls r0, r0, #0x18
lsrs r1, r0, #0x18
cmp r1, #0
beq _0802BD4C
movs r0, #0x80
orrs r0, r3
strb r0, [r2, #0x10]
adds r2, #0x3a
ldrb r1, [r2]
movs r0, #0xfb
ands r0, r1
strb r0, [r2]
b _0802BD52
_0802BD4C:
adds r0, r2, #0
adds r0, #0x45
strb r1, [r0]
_0802BD52:
pop {pc}
thumb_func_start sub_0802BD54
sub_0802BD54: @ 0x0802BD54
push {r4, lr}
adds r4, r0, #0
bl sub_0804A720
movs r0, #1
strb r0, [r4, #0xc]
bl Random
adds r1, r4, #0
adds r1, #0x78
strb r0, [r1]
movs r0, #0x3c
strb r0, [r4, #0x1d]
adds r1, #1
movs r0, #0xff
strb r0, [r1]
bl Random
movs r1, #0x18
ands r0, r1
strb r0, [r4, #0x15]
lsrs r0, r0, #3
strb r0, [r4, #0x14]
ldrb r1, [r4, #0x14]
adds r0, r4, #0
bl InitializeAnimation
pop {r4, pc}
thumb_func_start sub_0802BD8C
sub_0802BD8C: @ 0x0802BD8C
push {r4, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xe]
cmp r0, #0
beq _0802BD9C
subs r0, #1
strb r0, [r4, #0xe]
b _0802BDDE
_0802BD9C:
adds r0, r4, #0
movs r1, #1
bl sub_08049FDC
cmp r0, #0
beq _0802BDCA
adds r0, r4, #0
movs r1, #1
movs r2, #0x10
bl sub_0804A024
adds r1, r0, #0
cmp r1, #0xff
beq _0802BDCA
adds r0, r4, #0
adds r0, #0x79
ldrb r0, [r0]
cmp r1, r0
beq _0802BDCA
adds r0, r4, #0
bl sub_0802C058
b _0802BDDE
_0802BDCA:
adds r0, r4, #0
bl sub_0802C020
adds r1, r0, #0
ldrb r0, [r4, #0x15]
cmp r1, r0
beq _0802BDDE
adds r0, r4, #0
bl sub_0802C058
_0802BDDE:
pop {r4, pc}
thumb_func_start sub_0802BDE0
sub_0802BDE0: @ 0x0802BDE0
push {r4, lr}
adds r4, r0, #0
bl sub_0802C06C
cmp r0, #0
beq _0802BDFE
movs r0, #3
strb r0, [r4, #0xc]
movs r0, #0x3c
strb r0, [r4, #0xe]
adds r1, r4, #0
adds r1, #0x79
movs r0, #0xff
strb r0, [r1]
b _0802BE16
_0802BDFE:
movs r0, #1
strb r0, [r4, #0xc]
bl Random
movs r1, #0xf
ands r0, r1
adds r0, #0xf
strb r0, [r4, #0xe]
ldrb r1, [r4, #0x15]
adds r0, r4, #0
adds r0, #0x79
strb r1, [r0]
_0802BE16:
pop {r4, pc}
thumb_func_start sub_0802BE18
sub_0802BE18: @ 0x0802BE18
push {r4, lr}
adds r4, r0, #0
movs r1, #2
bl UpdateAnimationVariableFrames
ldrb r0, [r4, #0xe]
subs r0, #1
strb r0, [r4, #0xe]
lsls r0, r0, #0x18
cmp r0, #0
bne _0802BE3E
movs r0, #4
strb r0, [r4, #0xc]
movs r0, #0x1e
strb r0, [r4, #0xe]
movs r0, #0xc0
lsls r0, r0, #2
strh r0, [r4, #0x24]
b _0802BE44
_0802BE3E:
adds r0, r4, #0
bl sub_0802C18C
_0802BE44:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_0802BE48
sub_0802BE48: @ 0x0802BE48
push {r4, lr}
adds r4, r0, #0
bl sub_080AEFE0
cmp r0, #0
bne _0802BE64
adds r0, r4, #0
bl sub_0802C218
movs r0, #8
movs r1, #0
bl sub_08080964
b _0802BE7E
_0802BE64:
adds r0, r4, #0
bl GetNextFrame
adds r0, r4, #0
bl sub_0802C1CC
adds r0, r4, #0
bl sub_0802C0E8
cmp r0, #0
beq _0802BE7E
movs r0, #5
strb r0, [r4, #0xc]
_0802BE7E:
pop {r4, pc}
thumb_func_start sub_0802BE80
sub_0802BE80: @ 0x0802BE80
push {r4, lr}
adds r4, r0, #0
ldrh r0, [r4, #0x24]
subs r0, #0x20
strh r0, [r4, #0x24]
lsls r0, r0, #0x10
asrs r0, r0, #0x10
cmp r0, #0xff
ble _0802BE98
adds r0, r4, #0
bl sub_0802C1CC
_0802BE98:
movs r1, #0x24
ldrsh r0, [r4, r1]
cmp r0, #0
ble _0802BEAE
adds r0, r4, #0
bl sub_080AEFE0
adds r0, r4, #0
bl sub_0802C18C
b _0802BEBA
_0802BEAE:
adds r0, r4, #0
bl sub_0802C1C0
ldrb r0, [r4, #0xe]
adds r0, #0x1e
strb r0, [r4, #0xe]
_0802BEBA:
pop {r4, pc}
thumb_func_start sub_0802BEBC
sub_0802BEBC: @ 0x0802BEBC
push {r4, r5, lr}
adds r5, r0, #0
ldrb r0, [r5, #0x15]
movs r4, #0x10
eors r0, r4
strb r0, [r5, #0x15]
adds r0, r5, #0
bl sub_080AEFE0
ldrb r0, [r5, #0x15]
eors r0, r4
strb r0, [r5, #0x15]
movs r1, #0x80
lsls r1, r1, #6
adds r0, r5, #0
bl sub_080044EC
cmp r0, #0
bne _0802BEE8
adds r0, r5, #0
bl sub_0802C1C0
_0802BEE8:
pop {r4, r5, pc}
.align 2, 0
thumb_func_start sub_0802BEEC
sub_0802BEEC: @ 0x0802BEEC
push {r4, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xe]
cmp r0, #0
beq _0802BF1E
subs r0, #1
strb r0, [r4, #0xe]
movs r1, #0xff
ands r0, r1
movs r1, #0x1f
ands r0, r1
cmp r0, #0
bne _0802BF3A
ldrb r0, [r4, #0x14]
movs r1, #2
eors r0, r1
strb r0, [r4, #0x14]
lsls r0, r0, #3
strb r0, [r4, #0x15]
ldrb r1, [r4, #0x14]
adds r1, #4
adds r0, r4, #0
bl InitializeAnimation
b _0802BF3A
_0802BF1E:
movs r1, #0xe0
lsls r1, r1, #5
adds r0, r4, #0
bl sub_08003FC4
cmp r0, #0
bne _0802BF3A
movs r0, #8
strb r0, [r4, #0xc]
movs r0, #0x1e
strb r0, [r4, #0xe]
movs r0, #0x90
lsls r0, r0, #1
strh r0, [r4, #0x24]
_0802BF3A:
pop {r4, pc}
thumb_func_start sub_0802BF3C
sub_0802BF3C: @ 0x0802BF3C
push {r4, lr}
adds r4, r0, #0
bl ProcessMovement
adds r0, r4, #0
bl GetNextFrame
ldrb r0, [r4, #0xe]
subs r0, #1
strb r0, [r4, #0xe]
lsls r0, r0, #0x18
cmp r0, #0
bne _0802BF76
movs r0, #0x1e
strb r0, [r4, #0xe]
adds r0, r4, #0
bl sub_0802C020
strb r0, [r4, #0x15]
lsls r0, r0, #0x18
lsrs r0, r0, #0x1b
ldrb r1, [r4, #0x14]
cmp r0, r1
beq _0802BF76
strb r0, [r4, #0x14]
adds r1, r0, #4
adds r0, r4, #0
bl InitializeAnimation
_0802BF76:
pop {r4, pc}
thumb_func_start sub_0802BF78
sub_0802BF78: @ 0x0802BF78
push {lr}
movs r2, #1
strb r2, [r0, #0xc]
adds r3, r0, #0
adds r3, #0x3b
movs r1, #4
strb r1, [r3]
strb r2, [r0, #0x1c]
ldrb r1, [r0, #0x14]
lsls r1, r1, #3
strb r1, [r0, #0x15]
ldrb r1, [r0, #0x14]
adds r1, #8
bl InitializeAnimation
pop {pc}
thumb_func_start sub_0802BF98
sub_0802BF98: @ 0x0802BF98
push {r4, lr}
adds r4, r0, #0
bl sub_0806F520
cmp r0, #0
beq _0802BFBC
ldr r0, _0802BFB8 @ =gUnk_080CD450
ldrb r1, [r4, #0xd]
lsls r1, r1, #2
adds r1, r1, r0
ldr r1, [r1]
adds r0, r4, #0
bl _call_via_r1
b _0802BFCC
.align 2, 0
_0802BFB8: .4byte gUnk_080CD450
_0802BFBC:
movs r0, #2
strb r0, [r4, #0xc]
movs r0, #0x1e
strb r0, [r4, #0xe]
ldrb r1, [r4, #0x10]
movs r0, #0x7f
ands r0, r1
strb r0, [r4, #0x10]
_0802BFCC:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_0802BFD0
sub_0802BFD0: @ 0x0802BFD0
movs r1, #2
strb r1, [r0, #0xd]
bx lr
.align 2, 0
thumb_func_start sub_0802BFD8
sub_0802BFD8: @ 0x0802BFD8
push {lr}
bl sub_0806F4E8
pop {pc}
thumb_func_start sub_0802BFE0
sub_0802BFE0: @ 0x0802BFE0
push {r4, lr}
adds r4, r0, #0
bl sub_0806F3E4
cmp r0, #0
beq _0802BFF2
adds r0, r4, #0
bl DeleteEntity
_0802BFF2:
pop {r4, pc}
thumb_func_start sub_0802BFF4
sub_0802BFF4: @ 0x0802BFF4
push {lr}
adds r3, r0, #0
ldrb r2, [r3, #0x18]
lsls r1, r2, #0x1e
lsrs r1, r1, #0x1e
movs r0, #1
eors r1, r0
subs r0, #5
ands r0, r2
orrs r0, r1
strb r0, [r3, #0x18]
ldrb r0, [r3, #0xe]
subs r0, #1
strb r0, [r3, #0xe]
lsls r0, r0, #0x18
cmp r0, #0
bne _0802C01C
adds r0, r3, #0
bl DeleteEntity
_0802C01C:
pop {pc}
.align 2, 0
thumb_func_start sub_0802C020
sub_0802C020: @ 0x0802C020
push {r4, r5, r6, lr}
adds r5, r0, #0
bl Random
adds r4, r0, #0
adds r0, r5, #0
bl sub_08049FA0
cmp r0, #0
bne _0802C03E
movs r6, #1
adds r0, r4, #0
ands r0, r6
cmp r0, #0
beq _0802C044
_0802C03E:
movs r0, #0x18
ands r0, r4
b _0802C056
_0802C044:
adds r0, r5, #0
bl sub_08049EE4
lsrs r1, r4, #0x10
ands r1, r6
lsls r1, r1, #2
adds r0, r0, r1
movs r1, #0x18
ands r0, r1
_0802C056:
pop {r4, r5, r6, pc}
thumb_func_start sub_0802C058
sub_0802C058: @ 0x0802C058
push {lr}
movs r2, #2
strb r2, [r0, #0xc]
strb r1, [r0, #0x15]
lsrs r1, r1, #3
strb r1, [r0, #0x14]
ldrb r1, [r0, #0x14]
bl InitializeAnimation
pop {pc}
thumb_func_start sub_0802C06C
sub_0802C06C: @ 0x0802C06C
push {r4, r5, r6, r7, lr}
mov r7, sb
mov r6, r8
push {r6, r7}
movs r1, #0x2e
ldrsh r2, [r0, r1]
ldr r3, [r0, #0x48]
movs r1, #0
ldrsb r1, [r3, r1]
adds r6, r2, r1
movs r1, #0x32
ldrsh r2, [r0, r1]
movs r1, #1
ldrsb r1, [r3, r1]
adds r5, r2, r1
ldr r3, _0802C0CC @ =gUnk_080CD45C
ldrb r1, [r0, #0x15]
lsrs r1, r1, #2
adds r2, r1, r3
ldrb r2, [r2]
lsls r2, r2, #0x18
asrs r2, r2, #0x18
mov sb, r2
adds r1, #1
adds r1, r1, r3
ldrb r1, [r1]
lsls r1, r1, #0x18
asrs r1, r1, #0x18
mov r8, r1
adds r0, #0x38
ldrb r0, [r0]
ldr r7, _0802C0D0 @ =gUnk_02027EB4
cmp r0, #2
bne _0802C0B2
ldr r7, _0802C0D4 @ =gUnk_0200D654
_0802C0B2:
movs r4, #0
_0802C0B4:
add r6, sb
add r5, r8
adds r0, r7, #0
adds r1, r6, #0
adds r2, r5, #0
movs r3, #0
bl sub_080AE4CC
cmp r0, #0
beq _0802C0D8
movs r0, #0
b _0802C0E0
.align 2, 0
_0802C0CC: .4byte gUnk_080CD45C
_0802C0D0: .4byte gUnk_02027EB4
_0802C0D4: .4byte gUnk_0200D654
_0802C0D8:
adds r4, #1
cmp r4, #7
bls _0802C0B4
movs r0, #1
_0802C0E0:
pop {r3, r4}
mov r8, r3
mov sb, r4
pop {r4, r5, r6, r7, pc}
thumb_func_start sub_0802C0E8
sub_0802C0E8: @ 0x0802C0E8
push {r4, r5, r6, r7, lr}
adds r5, r0, #0
ldrb r0, [r5, #0xe]
subs r0, #1
strb r0, [r5, #0xe]
lsls r0, r0, #0x18
cmp r0, #0
bne _0802C0FC
movs r0, #1
b _0802C178
_0802C0FC:
ldrb r3, [r5, #0x15]
lsrs r3, r3, #2
ldr r0, _0802C17C @ =gUnk_080CD45C
adds r3, r3, r0
movs r0, #0x2e
ldrsh r2, [r5, r0]
ldr r4, [r5, #0x48]
movs r0, #0
ldrsb r0, [r4, r0]
adds r2, r2, r0
movs r1, #0
ldrsb r1, [r3, r1]
lsls r0, r1, #1
adds r0, r0, r1
lsls r0, r0, #1
adds r6, r2, r0
movs r0, #0x32
ldrsh r2, [r5, r0]
movs r0, #1
ldrsb r0, [r4, r0]
adds r2, r2, r0
movs r1, #1
ldrsb r1, [r3, r1]
lsls r0, r1, #1
adds r0, r0, r1
lsls r0, r0, #1
adds r4, r2, r0
adds r0, r5, #0
adds r0, #0x38
ldrb r0, [r0]
ldr r7, _0802C180 @ =gUnk_02027EB4
cmp r0, #2
bne _0802C140
ldr r7, _0802C184 @ =gUnk_0200D654
_0802C140:
movs r5, #0
ldr r1, _0802C188 @ =gRoomControls
ldrh r0, [r1, #6]
subs r0, r6, r0
asrs r0, r0, #4
movs r2, #0x3f
ands r0, r2
ldrh r1, [r1, #8]
subs r1, r4, r1
asrs r1, r1, #4
ands r1, r2
lsls r1, r1, #6
orrs r0, r1
movs r1, #9
bl sub_0806FC24
cmp r0, #0
bne _0802C176
adds r0, r7, #0
adds r1, r6, #0
adds r2, r4, #0
movs r3, #0
bl sub_080AE4CC
rsbs r1, r0, #0
orrs r1, r0
lsrs r5, r1, #0x1f
_0802C176:
adds r0, r5, #0
_0802C178:
pop {r4, r5, r6, r7, pc}
.align 2, 0
_0802C17C: .4byte gUnk_080CD45C
_0802C180: .4byte gUnk_02027EB4
_0802C184: .4byte gUnk_0200D654
_0802C188: .4byte gRoomControls
thumb_func_start sub_0802C18C
sub_0802C18C: @ 0x0802C18C
push {r4, lr}
adds r4, r0, #0
adds r0, #0x78
ldrb r1, [r0]
subs r1, #1
strb r1, [r0]
movs r0, #7
ands r1, r0
cmp r1, #0
bne _0802C1BC
movs r0, #0xf
movs r1, #0x11
movs r2, #0x40
bl CreateObject
adds r1, r0, #0
cmp r1, #0
beq _0802C1BC
movs r3, #0x80
lsls r3, r3, #9
adds r0, r4, #0
movs r2, #0
bl PositionRelative
_0802C1BC:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_0802C1C0
sub_0802C1C0: @ 0x0802C1C0
movs r1, #1
strb r1, [r0, #0xc]
movs r1, #0x1e
strb r1, [r0, #0xe]
bx lr
.align 2, 0
thumb_func_start sub_0802C1CC
sub_0802C1CC: @ 0x0802C1CC
push {r4, r5, lr}
adds r5, r0, #0
ldrb r4, [r5, #0x14]
lsls r4, r4, #2
ldr r0, _0802C214 @ =gUnk_080CD464
adds r4, r4, r0
movs r0, #0x2e
ldrsh r2, [r5, r0]
movs r0, #0
ldrsb r0, [r4, r0]
adds r2, r2, r0
movs r0, #0x32
ldrsh r3, [r5, r0]
movs r0, #1
ldrsb r0, [r4, r0]
adds r3, r3, r0
adds r0, r5, #0
movs r1, #9
bl sub_08008796
movs r0, #0x2e
ldrsh r2, [r5, r0]
movs r0, #2
ldrsb r0, [r4, r0]
adds r2, r2, r0
movs r0, #0x32
ldrsh r3, [r5, r0]
movs r0, #3
ldrsb r0, [r4, r0]
adds r3, r3, r0
adds r0, r5, #0
movs r1, #9
bl sub_08008796
pop {r4, r5, pc}
.align 2, 0
_0802C214: .4byte gUnk_080CD464
thumb_func_start sub_0802C218
sub_0802C218: @ 0x0802C218
movs r1, #6
strb r1, [r0, #0xc]
movs r1, #0xe0
strh r1, [r0, #0x24]
movs r1, #0xc0
lsls r1, r1, #9
str r1, [r0, #0x20]
bx lr

View File

@ -0,0 +1,47 @@
.syntax unified
.text
push {r4, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xe]
cmp r0, #0
beq _0802BD9C
subs r0, #1
strb r0, [r4, #0xe]
b _0802BDDE
_0802BD9C:
adds r0, r4, #0
movs r1, #1
bl sub_08049FDC
cmp r0, #0
beq _0802BDCA
adds r0, r4, #0
movs r1, #1
movs r2, #0x10
bl sub_0804A024
adds r1, r0, #0
cmp r1, #0xff
beq _0802BDCA
adds r0, r4, #0
adds r0, #0x79
ldrb r0, [r0]
cmp r1, r0
beq _0802BDCA
adds r0, r4, #0
bl sub_0802C058
b _0802BDDE
_0802BDCA:
adds r0, r4, #0
bl sub_0802C020
adds r1, r0, #0
ldrb r0, [r4, #0x15]
cmp r1, r0
beq _0802BDDE
adds r0, r4, #0
bl sub_0802C058
_0802BDDE:
pop {r4, pc}
.syntax divided

View File

@ -0,0 +1,43 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
gUnk_080CD474:: @ 080CD474
.incbin "baserom.gba", 0x0CD474, 0x0000011
gUnk_080CD485:: @ 080CD485
.incbin "baserom.gba", 0x0CD485, 0x0000011
gUnk_080CD496:: @ 080CD496
.incbin "baserom.gba", 0x0CD496, 0x0000011
gUnk_080CD4A7:: @ 080CD4A7
.incbin "baserom.gba", 0x0CD4A7, 0x0000011
gUnk_080CD4B8:: @ 080CD4B8
.incbin "baserom.gba", 0x0CD4B8, 0x0000011
gUnk_080CD4C9:: @ 080CD4C9
.incbin "baserom.gba", 0x0CD4C9, 0x0000011
gUnk_080CD4DA:: @ 080CD4DA
.incbin "baserom.gba", 0x0CD4DA, 0x0000011
gUnk_080CD4EB:: @ 080CD4EB
.incbin "baserom.gba", 0x0CD4EB, 0x0000011
gUnk_080CD4FC:: @ 080CD4FC
.incbin "baserom.gba", 0x0CD4FC, 0x0000004
gUnk_080CD500:: @ 080CD500
.incbin "baserom.gba", 0x0CD500, 0x0000004
gUnk_080CD504:: @ 080CD504
.incbin "baserom.gba", 0x0CD504, 0x0000004
gUnk_080CD508:: @ 080CD508
.incbin "baserom.gba", 0x0CD508, 0x0000004
gUnk_080CD50C:: @ 080CD50C
.incbin "baserom.gba", 0x0CD50C, 0x0000034

View File

@ -3,69 +3,6 @@
.section .rodata
gUnk_080CD3E4:: @ 080CD3E4
.incbin "baserom.gba", 0x0CD3E4, 0x0000018
gUnk_080CD3FC:: @ 080CD3FC
.incbin "baserom.gba", 0x0CD3FC, 0x000000C
gUnk_080CD408:: @ 080CD408
.incbin "baserom.gba", 0x0CD408, 0x0000024
gUnk_080CD42C:: @ 080CD42C
.incbin "baserom.gba", 0x0CD42C, 0x000000C
gUnk_080CD438:: @ 080CD438
.incbin "baserom.gba", 0x0CD438, 0x0000018
gUnk_080CD450:: @ 080CD450
.incbin "baserom.gba", 0x0CD450, 0x000000C
gUnk_080CD45C:: @ 080CD45C
.incbin "baserom.gba", 0x0CD45C, 0x0000008
gUnk_080CD464:: @ 080CD464
.incbin "baserom.gba", 0x0CD464, 0x0000010
gUnk_080CD474:: @ 080CD474
.incbin "baserom.gba", 0x0CD474, 0x0000011
gUnk_080CD485:: @ 080CD485
.incbin "baserom.gba", 0x0CD485, 0x0000011
gUnk_080CD496:: @ 080CD496
.incbin "baserom.gba", 0x0CD496, 0x0000011
gUnk_080CD4A7:: @ 080CD4A7
.incbin "baserom.gba", 0x0CD4A7, 0x0000011
gUnk_080CD4B8:: @ 080CD4B8
.incbin "baserom.gba", 0x0CD4B8, 0x0000011
gUnk_080CD4C9:: @ 080CD4C9
.incbin "baserom.gba", 0x0CD4C9, 0x0000011
gUnk_080CD4DA:: @ 080CD4DA
.incbin "baserom.gba", 0x0CD4DA, 0x0000011
gUnk_080CD4EB:: @ 080CD4EB
.incbin "baserom.gba", 0x0CD4EB, 0x0000011
gUnk_080CD4FC:: @ 080CD4FC
.incbin "baserom.gba", 0x0CD4FC, 0x0000004
gUnk_080CD500:: @ 080CD500
.incbin "baserom.gba", 0x0CD500, 0x0000004
gUnk_080CD504:: @ 080CD504
.incbin "baserom.gba", 0x0CD504, 0x0000004
gUnk_080CD508:: @ 080CD508
.incbin "baserom.gba", 0x0CD508, 0x0000004
gUnk_080CD50C:: @ 080CD50C
.incbin "baserom.gba", 0x0CD50C, 0x0000034
gUnk_080CD540:: @ 080CD540
.incbin "baserom.gba", 0x0CD540, 0x0000018

View File

@ -138,13 +138,15 @@ typedef struct Entity {
/*0x86*/ union SplitHWord field_0x86;
} Entity;
#define TILE(x, y) \
((((x - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \
(((y - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6)
#define COORD_TO_TILE(entity) \
((((entity->x.HALF.HI - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \
(((entity->y.HALF.HI - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6)
TILE(entity->x.HALF.HI, entity->y.HALF.HI)
#define COORD_TO_TILE_OFFSET(entity, xOff, yOff) \
((((entity->x.HALF.HI - xOff - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \
(((entity->y.HALF.HI - yOff - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6)
TILE(entity->x.HALF.HI - xOff, entity->y.HALF.HI - yOff)
extern Entity* CreateEnemy(u32 subtype, u32 form);
extern Entity* CreateObject(u32 subtype, u32 form, u32 parameter);

View File

@ -357,7 +357,7 @@ SECTIONS {
src/enemy/chaser.o(.text);
src/enemy/spikedBeetle.o(.text);
src/enemy/sensorBladeTrap.o(.text);
asm/helmasaur.o(.text);
src/enemy/helmasaur.o(.text);
asm/fallingBoulder.o(.text);
asm/bobomb.o(.text);
asm/wallMaster2.o(.text);
@ -965,6 +965,8 @@ SECTIONS {
src/enemy/spikedBeetle.o(.rodata);
data/animations/spikedBeetle.o(.rodata);
src/enemy/sensorBladeTrap.o(.rodata);
src/enemy/helmasaur.o(.rodata);
data/animations/helmasaur.o(.rodata);
data/data_080CC6FC.o(.rodata);
src/enemy.o(.rodata);
data/data_080D3D94.o(.rodata);

436
src/enemy/helmasaur.c Normal file
View File

@ -0,0 +1,436 @@
#include "enemy.h"
#include "functions.h"
extern void sub_08008796(Entity*, u32, u32, u32);
extern u32 sub_0804A024(Entity*, u32, u32);
extern bool32 sub_080AE4CC(Entity*, u32, u32, u32);
extern Entity gUnk_0200D654;
extern Entity gUnk_02027EB4;
void sub_0802C18C(Entity*);
void sub_0802C218(Entity*);
void sub_0802C1C0(Entity*);
u32 sub_0802C020(Entity*);
void sub_0802C058(Entity*, u32);
bool32 sub_0802C06C(Entity*);
void sub_08080964(u32, u32);
void sub_0802C1CC(Entity*);
bool32 sub_0802C0E8(Entity*);
extern void (*const gUnk_080CD3E4[])(Entity*);
extern void (*const gUnk_080CD3FC[])(Entity*);
extern void (*const gUnk_080CD408[])(Entity*);
extern void (*const gUnk_080CD42C[])(Entity*);
extern void (*const gUnk_080CD438[])(Entity*);
extern void (*const gUnk_080CD450[])(Entity*);
extern const s8 gUnk_080CD45C[];
extern const s8 gUnk_080CD464[];
void Helmasaur(Entity* this) {
if (this->entityType.form == 0) {
EnemyFunctionHandler(this, gUnk_080CD3E4);
SetChildOffset(this, 0, 1, -0x10);
} else {
gUnk_080CD3FC[this->action](this);
}
}
void sub_0802BBAC(Entity* this) {
gUnk_080CD408[this->action](this);
}
void sub_0802BBC4(Entity* this) {
if (this->damageType != 0x19) {
switch (this->bitfield & 0x7f) {
case 0:
case 2:
case 3:
if (this->action == 4) {
this->field_0x42 = 0;
sub_0802C218(this);
}
break;
}
}
if (this->field_0x43 != 0) {
sub_0804A9FC(this, 0x1c);
}
sub_0804AA30(this, gUnk_080CD3E4);
}
void sub_0802BC20(Entity* this) {
if (this->damageType != 0x19) {
if (sub_0806F520(this)) {
gUnk_080CD42C[this->previousActionFlag](this);
}
} else if (2 < this->previousActionFlag || sub_0806F520(this)) {
gUnk_080CD438[this->previousActionFlag](this);
}
}
void sub_0802BC74(Entity* this) {
sub_0802C1C0(this);
this->previousActionFlag = 1;
this->field_0x1d = 60;
this->animationState = (gPlayerEntity.animationState >> 1) ^ 2;
InitializeAnimation(this, this->animationState);
}
void sub_0802BCA0(Entity* this) {
sub_0806F4E8(this);
}
void sub_0802BCA8(Entity* this) {
if (this->damageType != 0x19) {
Entity* ent;
this->action = 7;
this->actionDelay = 0x5a;
this->field_0x20 = 0x18000;
this->damageType = 0x19;
this->field_0x3a = this->field_0x3a & 0xfb;
this->field_0x1c = 0x12;
ent = CreateEnemy(0x20, 1);
if (ent) {
ent->animationState = this->animationState;
CopyPosition(this, ent);
}
InitializeAnimation(this, this->animationState + 4);
}
}
void sub_0802BCFC(Entity* this) {
this->previousActionFlag = 1;
this->field_0x1d = 60;
}
void sub_0802BD08(Entity* this) {
sub_0806F3E4(this);
}
void sub_0802BD10(Entity* this) {
this->flags &= ~0x80;
UpdateAnimationVariableFrames(this, 2);
}
void nullsub_145(Entity* this) {
/* ... */
}
void sub_0802BD28(Entity* this) {
if (this->flags & 0x80) {
this->flags |= 0x80;
this->field_0x3a &= ~0x4;
} else {
this->currentHealth = 0;
}
}
void sub_0802BD54(Entity* this) {
sub_0804A720(this);
this->action = 1;
this->field_0x78.HALF.LO = Random();
this->field_0x1d = 60;
this->field_0x78.HALF.HI = 0xff;
this->direction = DirectionRound(Random());
this->animationState = this->direction >> 3;
InitializeAnimation(this, this->animationState);
}
void sub_0802BD8C(Entity* this) {
if (this->actionDelay) {
this->actionDelay--;
} else {
u32 direction;
if (sub_08049FDC(this, 1)) {
direction = sub_0804A024(this, 1, 0x10);
if (direction != 0xff && direction != this->field_0x78.HALF.HI) {
sub_0802C058(this, direction);
return;
}
}
direction = sub_0802C020(this);
if (direction != this->direction) {
sub_0802C058(this, direction);
}
}
}
void sub_0802BDE0(Entity* this) {
if (sub_0802C06C(this)) {
this->action = 3;
this->actionDelay = 60;
this->field_0x78.HALF.HI = 0xff;
} else {
this->action = 1;
this->actionDelay = (Random() & 0xf) + 0xf;
this->field_0x78.HALF.HI = this->direction;
}
}
void sub_0802BE18(Entity* this) {
UpdateAnimationVariableFrames(this, 2);
if (--this->actionDelay == 0) {
this->action = 4;
this->actionDelay = 0x1e;
this->nonPlanarMovement = 0x300;
} else {
sub_0802C18C(this);
}
}
void sub_0802BE48(Entity* this) {
if (!sub_080AEFE0(this)) {
sub_0802C218(this);
sub_08080964(8, 0);
} else {
GetNextFrame(this);
sub_0802C1CC(this);
if (sub_0802C0E8(this)) {
this->action = 5;
}
}
}
void sub_0802BE80(Entity* this) {
this->nonPlanarMovement -= 0x20;
if (0xff < this->nonPlanarMovement) {
sub_0802C1CC(this);
}
if (this->nonPlanarMovement > 0) {
sub_080AEFE0(this);
sub_0802C18C(this);
} else {
sub_0802C1C0(this);
this->actionDelay += 30;
}
}
void sub_0802BEBC(Entity* this) {
this->direction ^= 0x10;
sub_080AEFE0(this);
this->direction ^= 0x10;
if (!sub_080044EC(this, 0x2000)) {
sub_0802C1C0(this);
}
}
void sub_0802BEEC(Entity* this) {
if (this->actionDelay) {
if ((--this->actionDelay & 0x1f) == 0) {
this->animationState ^= 2;
this->direction = this->animationState << 3;
InitializeAnimation(this, this->animationState + 4);
}
} else if (!sub_08003FC4(this, 0x1c00)) {
this->action = 8;
this->actionDelay = 30;
this->nonPlanarMovement = 0x120;
}
}
void sub_0802BF3C(Entity* this) {
ProcessMovement(this);
GetNextFrame(this);
if (--this->actionDelay == 0) {
u32 sprite;
this->actionDelay = 30;
this->direction = sub_0802C020(this);
sprite = this->direction >> 3;
if (sprite != this->animationState) {
this->animationState = sprite;
InitializeAnimation(this, sprite + 4);
}
}
}
void sub_0802BF78(Entity* this) {
this->action = 1;
this->flags2 = 4;
this->field_0x1c = 1;
this->direction = this->animationState << 3;
InitializeAnimation(this, this->animationState + 8);
}
void sub_0802BF98(Entity* this) {
if (sub_0806F520(this)) {
gUnk_080CD450[this->previousActionFlag](this);
} else {
this->action = 2;
this->actionDelay = 30;
this->flags &= ~0x80;
}
}
void sub_0802BFD0(Entity* this) {
this->previousActionFlag = 2;
}
void sub_0802BFD8(Entity* this) {
sub_0806F4E8(this);
}
void sub_0802BFE0(Entity* this) {
if (sub_0806F3E4(this)) {
DeleteEntity(this);
}
}
void sub_0802BFF4(Entity* this) {
this->spriteSettings.b.draw ^= 1;
if (--this->actionDelay == 0) {
DeleteEntity(this);
}
}
u32 sub_0802C020(Entity* this) {
u32 uVar1 = Random();
if (sub_08049FA0(this) || (uVar1 & 1))
return DirectionRound(uVar1);
return (sub_08049EE4(this) + (uVar1 >> 0x10 & 1) * 4) & 0x18;
}
void sub_0802C058(Entity* this, u32 param_2) {
this->action = 2;
this->direction = param_2;
this->animationState = param_2 >> 3;
InitializeAnimation(this, this->animationState);
}
bool32 sub_0802C06C(Entity* this) {
u32 x = this->x.HALF.HI + (s8)this->boundingBox->unknown[0];
u32 y = this->y.HALF.HI + (s8)this->boundingBox->unknown[1];
u32 xdiff = gUnk_080CD45C[(this->direction >> 2) + 0];
u32 ydiff = gUnk_080CD45C[(this->direction >> 2) + 1];
Entity* ent = this->collisionLayer == 2 ? &gUnk_0200D654 : &gUnk_02027EB4;
u32 i;
for (i = 0; i < 8; i++) {
x += xdiff;
y += ydiff;
if (sub_080AE4CC(ent, x, y, 0))
return FALSE;
}
return TRUE;
}
bool32 sub_0806FC24(u32, u32);
bool32 sub_0802C0E8(Entity* this) {
if (--this->actionDelay == 0) {
return TRUE;
} else {
const s8* ptr = &gUnk_080CD45C[this->direction >> 2];
s32 x = this->x.HALF.HI + (s8)this->boundingBox->unknown[0] + ptr[0] * 6;
s32 y = this->y.HALF.HI + (s8)this->boundingBox->unknown[1] + ptr[1] * 6;
Entity* ent = this->collisionLayer == 2 ? &gUnk_0200D654 : &gUnk_02027EB4;
u32 ret = FALSE;
if (!sub_0806FC24(TILE(x, y), 9)) {
u32 tmp = sub_080AE4CC(ent, x, y, 0);
ret = (-tmp | tmp) >> 0x1f;
}
return ret;
}
}
void sub_0802C18C(Entity* this) {
this->field_0x78.HALF.LO--;
if ((this->field_0x78.HALF.LO & 7) == 0) {
Entity* ent = CreateObject(0xf, 0x11, 0x40);
if (ent) {
PositionRelative(this, ent, 0, 0x10000);
}
}
}
void sub_0802C1C0(Entity* this) {
this->action = 1;
this->actionDelay = 30;
}
void sub_0802C1CC(Entity* this) {
const s8* ptr = &gUnk_080CD464[this->animationState << 2];
sub_08008796(this, 9, this->x.HALF.HI + ptr[0], this->y.HALF.HI + ptr[1]);
sub_08008796(this, 9, this->x.HALF.HI + ptr[2], this->y.HALF.HI + ptr[3]);
}
void sub_0802C218(Entity* this) {
this->action = 6;
this->nonPlanarMovement = 0xe0;
this->field_0x20 = 0x18000;
}
// clang-format off
void (*const gUnk_080CD3E4[])(Entity*) = {
sub_0802BBAC,
sub_0802BBC4,
sub_08001324,
sub_0804A7D4,
sub_08001242,
sub_0802BC20,
};
void (*const gUnk_080CD3FC[])(Entity*) = {
sub_0802BF78,
sub_0802BF98,
sub_0802BFF4,
};
void (*const gUnk_080CD408[])(Entity*) = {
sub_0802BD54,
sub_0802BD8C,
sub_0802BDE0,
sub_0802BE18,
sub_0802BE48,
sub_0802BE80,
sub_0802BEBC,
sub_0802BEEC,
sub_0802BF3C,
};
void (*const gUnk_080CD42C[])(Entity*) = {
sub_0802BC74,
sub_0802BCA0,
sub_0802BCA8,
};
void (*const gUnk_080CD438[])(Entity*) = {
sub_0802BCFC,
sub_0802BCA0,
sub_0802BD08,
sub_0802BD10,
nullsub_145,
sub_0802BD28,
};
void (*const gUnk_080CD450[])(Entity*) = {
sub_0802BFD0,
sub_0802BFD8,
sub_0802BFE0,
};
const s8 gUnk_080CD45C[] = {
0, -8,
8, 0,
0, 8,
-8, 0,
};
const s8 gUnk_080CD464[] = {
-3, -8, 3, -8,
8, -3, 8, 3,
-3, 8, 3, 8,
-8, -3, -8, 3,
};
// clang-format on