Merge pull request #250 from hatal175/projectileasm

This commit is contained in:
notyourav
2022-01-06 09:29:43 -08:00
committed by GitHub
26 changed files with 587 additions and 1025 deletions
@@ -1,133 +0,0 @@
.syntax unified
push {r4, r5, r6, lr}
adds r4, r0, #0
ldr r6, [r4, #0x50]
ldr r0, [r6, #4]
cmp r0, #0
bne _080AB180
bl DeleteThisEntity
_080AB180:
ldrb r0, [r4, #0xc]
cmp r0, #0
bne _080AB1AA
movs r0, #1
strb r0, [r4, #0xc]
adds r2, r4, #0
adds r2, #0x29
ldrb r1, [r2]
subs r0, #0x3a
ands r0, r1
strb r0, [r2]
movs r0, #5
strb r0, [r4, #0x1e]
ldrb r1, [r2]
subs r0, #0xd
ands r0, r1
movs r1, #3
orrs r0, r1
strb r0, [r2]
ldr r0, _080AB1C8 @ =gHitbox_22
str r0, [r4, #0x48]
_080AB1AA:
ldr r5, [r6, #0x50]
adds r0, r4, #0
adds r0, #0x7c
adds r2, r5, #0
adds r2, #0x7c
ldrb r1, [r0]
adds r3, r0, #0
ldrb r2, [r2]
cmp r1, r2
beq _080AB1CC
ldrb r1, [r4, #0x10]
movs r0, #0x80
orrs r0, r1
b _080AB1D2
.align 2, 0
_080AB1C8: .4byte gHitbox_22
_080AB1CC:
ldrb r1, [r4, #0x10]
movs r0, #0x7f
ands r0, r1
_080AB1D2:
strb r0, [r4, #0x10]
adds r0, r5, #0
adds r0, #0x7c
ldrb r0, [r0]
strb r0, [r3]
adds r0, r5, #0
adds r0, #0x5a
ldrb r1, [r0]
movs r0, #0x20
ands r0, r1
cmp r0, #0
bne _080AB208
movs r0, #0x1f
ands r0, r1
ldr r1, _080AB204 @ =gUnk_0812A4A8
adds r0, r0, r1
movs r2, #0
ldrsb r2, [r0, r2]
movs r3, #1
ldrsb r3, [r0, r3]
adds r0, r5, #0
adds r1, r4, #0
bl sub_0806FA90
b _080AB216
.align 2, 0
_080AB204: .4byte gUnk_0812A4A8
_080AB208:
movs r3, #0xa
rsbs r3, r3, #0
adds r0, r5, #0
adds r1, r4, #0
movs r2, #0
bl sub_0806FA90
_080AB216:
movs r1, #0x2e
ldrsh r0, [r6, r1]
movs r2, #0x2e
ldrsh r1, [r4, r2]
subs r0, r0, r1
ldrb r2, [r4, #0xa]
muls r0, r2, r0
adds r3, r2, #0
cmp r0, #0
bge _080AB22C
adds r0, #3
_080AB22C:
asrs r0, r0, #2
ldrh r5, [r4, #0x2e]
adds r0, r0, r5
strh r0, [r4, #0x2e]
movs r1, #0x32
ldrsh r0, [r6, r1]
movs r5, #0x32
ldrsh r1, [r4, r5]
subs r0, r0, r1
muls r0, r3, r0
cmp r0, #0
bge _080AB246
adds r0, #3
_080AB246:
asrs r0, r0, #2
ldrh r1, [r4, #0x32]
adds r0, r0, r1
strh r0, [r4, #0x32]
movs r3, #0x36
ldrsh r0, [r6, r3]
movs r5, #0x36
ldrsh r1, [r4, r5]
subs r0, r0, r1
muls r0, r2, r0
cmp r0, #0
bge _080AB260
adds r0, #3
_080AB260:
asrs r0, r0, #2
ldrh r1, [r4, #0x36]
adds r0, r0, r1
strh r0, [r4, #0x36]
pop {r4, r5, r6, pc}
.align 2, 0
.syntax divided
@@ -1,40 +0,0 @@
.syntax unified
push {r4, lr}
adds r4, r0, #0
adds r0, #0x41
ldrb r0, [r0]
movs r1, #0x7f
ands r1, r0
cmp r1, #0
blt _080AC8FE
cmp r1, #3
ble _080AC8F8
cmp r1, #0x1f
bgt _080AC8FE
cmp r1, #0x1e
blt _080AC8FE
_080AC8F8:
bl DeleteThisEntity
b _080AC920
_080AC8FE:
ldrb r0, [r4, #0xc]
cmp r0, #3
beq _080AC920
movs r0, #3
strb r0, [r4, #0xc]
ldrb r1, [r4, #0x10]
movs r0, #0x7f
ands r0, r1
strb r0, [r4, #0x10]
ldrh r0, [r4, #0x24]
lsls r0, r0, #0x10
asrs r0, r0, #0x11
strh r0, [r4, #0x24]
adds r0, r4, #0
movs r1, #1
bl InitializeAnimation
_080AC920:
adds r0, r4, #0
bl GyorgMaleEnergyProjectile_OnTick
pop {r4, pc}
.syntax divided
@@ -1,59 +0,0 @@
.syntax unified
push {lr}
adds r2, r0, #0
ldrb r0, [r2, #0xc]
adds r0, #1
strb r0, [r2, #0xc]
adds r0, r2, #0
adds r0, #0x86
ldrh r0, [r0]
strh r0, [r2, #0x24]
ldrh r1, [r2, #0x2e]
adds r0, r2, #0
adds r0, #0x68
strh r1, [r0]
ldrh r0, [r2, #0x32]
adds r1, r2, #0
adds r1, #0x6a
strh r0, [r1]
adds r0, r2, #0
adds r0, #0x84
ldrh r1, [r0]
subs r0, #0x18
strh r1, [r0]
ldrb r0, [r2, #0xa]
cmp r0, #6
bhi _080ABAAA
movs r0, #0
b _080ABAAC
_080ABAAA:
movs r0, #1
_080ABAAC:
strb r0, [r2, #0xb]
ldr r0, _080ABAC8 @ =gUnk_0812A6D4
ldrb r1, [r2, #0xa]
adds r0, r1, r0
ldrb r3, [r0]
ldrb r0, [r2, #0xb]
cmp r0, #0
bne _080ABACC
movs r0, #8
strb r0, [r2, #0x15]
ldrh r0, [r2, #0x32]
adds r0, r0, r3
strh r0, [r2, #0x32]
b _080ABAD6
.align 2, 0
_080ABAC8: .4byte gUnk_0812A6D4
_080ABACC:
movs r0, #0x10
strb r0, [r2, #0x15]
ldrh r0, [r2, #0x2e]
adds r0, r0, r3
strh r0, [r2, #0x2e]
_080ABAD6:
adds r0, r2, #0
bl InitializeAnimation
pop {pc}
.align 2, 0
.syntax divided
@@ -1,93 +0,0 @@
.syntax unified
push {r4, r5, r6, lr}
adds r4, r0, #0
bl sub_080AF090
ldrb r0, [r4, #0xb]
cmp r0, #0
bne _080ABAFE
movs r1, #0x2e
ldrsh r0, [r4, r1]
adds r1, r4, #0
adds r1, #0x68
movs r2, #0
ldrsh r1, [r1, r2]
subs r3, r0, r1
b _080ABB0C
_080ABAFE:
movs r0, #0x32
ldrsh r1, [r4, r0]
adds r0, r4, #0
adds r0, #0x6a
movs r2, #0
ldrsh r0, [r0, r2]
subs r3, r1, r0
_080ABB0C:
adds r0, r4, #0
adds r0, #0x6c
movs r1, #0
ldrsh r2, [r0, r1]
adds r6, r0, #0
cmp r2, #0
bge _080ABB1E
rsbs r3, r3, #0
rsbs r2, r2, #0
_080ABB1E:
lsls r1, r3, #0x10
lsls r0, r2, #0x10
cmp r1, r0
bls _080ABB84
ldrb r0, [r4, #0x15]
movs r1, #0x10
eors r0, r1
strb r0, [r4, #0x15]
ldrb r0, [r4, #0xb]
adds r5, r0, #0
cmp r5, #0
bne _080ABB4E
adds r0, r4, #0
adds r0, #0x68
ldrh r0, [r0]
strh r0, [r4, #0x2e]
ldrb r2, [r4, #0x18]
lsls r1, r2, #0x19
lsrs r1, r1, #0x1f
movs r0, #1
eors r1, r0
lsls r1, r1, #6
subs r0, #0x42
b _080ABB62
_080ABB4E:
adds r0, r4, #0
adds r0, #0x6a
ldrh r0, [r0]
strh r0, [r4, #0x32]
ldrb r2, [r4, #0x18]
lsrs r1, r2, #7
movs r0, #1
eors r1, r0
lsls r1, r1, #7
movs r0, #0x7f
_080ABB62:
ands r0, r2
orrs r0, r1
strb r0, [r4, #0x18]
cmp r3, #0
ble _080ABB84
lsls r0, r5, #0x18
cmp r0, #0
bne _080ABB7C
ldrh r0, [r6]
ldrh r2, [r4, #0x2e]
adds r0, r0, r2
strh r0, [r4, #0x2e]
b _080ABB84
_080ABB7C:
ldrh r0, [r6]
ldrh r1, [r4, #0x32]
adds r0, r0, r1
strh r0, [r4, #0x32]
_080ABB84:
adds r0, r4, #0
bl GetNextFrame
pop {r4, r5, r6, pc}
.syntax divided
@@ -1,77 +0,0 @@
.syntax unified
push {r4, r5, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xa]
cmp r0, #0
beq _080AACF4
ldrb r0, [r4, #0xb]
cmp r0, #0
beq _080AACF4
bl DeleteThisEntity
_080AACF4:
ldrb r1, [r4, #0x18]
lsls r0, r1, #0x1e
lsrs r2, r0, #0x1e
adds r5, r4, #0
adds r5, #0x86
cmp r2, #1
bne _080AAD16
movs r0, #4
rsbs r0, r0, #0
ands r0, r1
strb r0, [r4, #0x18]
strb r2, [r5]
adds r0, r4, #0
movs r1, #2
movs r2, #0
bl CreateFx
_080AAD16:
ldr r2, [r4, #0x50]
ldrb r0, [r4, #0xb]
cmp r0, #0
bne _080AAD4A
adds r1, r2, #0
adds r1, #0x74
movs r0, #3
strb r0, [r1]
adds r1, #0xc
adds r0, r4, #0
adds r0, #0x81
ldrb r0, [r0]
lsrs r0, r0, #1
ldrb r2, [r1]
adds r0, r0, r2
strb r0, [r1]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #8
bls _080AAD42
movs r0, #8
b _080AAD56
_080AAD42:
cmp r0, #0
bne _080AAD58
movs r0, #1
b _080AAD56
_080AAD4A:
adds r1, r2, #0
adds r1, #0x84
movs r0, #0
strb r0, [r1]
subs r1, #0x45
movs r0, #0x2b
_080AAD56:
strb r0, [r1]
_080AAD58:
ldrb r0, [r5]
cmp r0, #0
bne _080AAD68
adds r0, r4, #0
movs r1, #2
movs r2, #0
bl CreateFx
_080AAD68:
bl DeleteThisEntity
pop {r4, r5, pc}
.align 2, 0
.syntax divided
@@ -1,39 +0,0 @@
.syntax unified
push {lr}
adds r2, r0, #0
ldrb r0, [r2, #0xa]
cmp r0, #1
beq _080ABBC4
cmp r0, #1
bgt _080ABBDC
cmp r0, #0
bne _080ABBDC
ldr r0, _080ABBC0 @ =gUnk_0812A7EC
b _080ABBC6
.align 2, 0
_080ABBC0: .4byte gUnk_0812A7EC
_080ABBC4:
ldr r0, _080ABBD8 @ =gUnk_0812A7F8
_080ABBC6:
ldrb r1, [r2, #0xc]
lsls r1, r1, #2
adds r1, r1, r0
ldr r1, [r1]
adds r0, r2, #0
bl _call_via_r1
b _080ABBEC
.align 2, 0
_080ABBD8: .4byte gUnk_0812A7F8
_080ABBDC:
ldr r0, _080ABBF0 @ =gUnk_0812A800
ldrb r1, [r2, #0xc]
lsls r1, r1, #2
adds r1, r1, r0
ldr r1, [r1]
adds r0, r2, #0
bl _call_via_r1
_080ABBEC:
pop {pc}
.align 2, 0
_080ABBF0: .4byte gUnk_0812A800
.syntax divided
@@ -1,50 +0,0 @@
.syntax unified
push {r4, lr}
adds r4, r0, #0
adds r0, #0x41
ldrb r1, [r0]
movs r0, #0x80
ands r0, r1
cmp r0, #0
beq _080ABC52
ldrb r0, [r4, #0xa]
cmp r0, #0
blt _080ABC52
cmp r0, #1
ble _080ABC3E
cmp r0, #2
bne _080ABC52
movs r0, #0x3f
ands r0, r1
cmp r0, #3
beq _080ABC32
cmp r0, #3
bgt _080ABC24
cmp r0, #0
beq _080ABC2A
b _080ABC52
_080ABC24:
cmp r0, #0x14
beq _080ABC32
b _080ABC52
_080ABC2A:
movs r0, #4
rsbs r0, r0, #0
bl ModHealth
_080ABC32:
adds r0, r4, #0
bl CreateDust
bl DeleteThisEntity
b _080ABC52
_080ABC3E:
movs r0, #0x3f
ands r0, r1
cmp r0, #0
bne _080ABC52
movs r0, #2
rsbs r0, r0, #0
bl ModHealth
bl DeleteThisEntity
_080ABC52:
pop {r4, pc}
.syntax divided
@@ -1,63 +0,0 @@
.syntax unified
push {r4, r5, lr}
adds r4, r0, #0
bl Random
adds r5, r0, #0
movs r0, #0xff
ands r5, r0
movs r0, #1
strb r0, [r4, #0xc]
ldr r0, _080ABE48 @ =0xFFFF0000
str r0, [r4, #0x20]
ldrh r0, [r4, #0x36]
subs r0, #0xa0
strh r0, [r4, #0x36]
ldr r3, _080ABE4C @ =gRoomControls
ldrh r2, [r3, #6]
ldr r1, _080ABE50 @ =0x00007FF0
adds r0, r1, #0
ands r0, r2
movs r2, #8
orrs r0, r2
strh r0, [r4, #0x2e]
ldrh r0, [r3, #8]
ands r1, r0
orrs r1, r2
strh r1, [r4, #0x32]
movs r0, #0x2e
ldrsh r1, [r4, r0]
movs r0, #0x10
ands r0, r5
cmp r0, #0
beq _080ABE54
adds r1, #0x10
b _080ABE56
.align 2, 0
_080ABE48: .4byte 0xFFFF0000
_080ABE4C: .4byte gRoomControls
_080ABE50: .4byte 0x00007FF0
_080ABE54:
adds r1, #0xc0
_080ABE56:
movs r0, #0xe0
ands r0, r5
lsrs r0, r0, #1
adds r0, r1, r0
strh r0, [r4, #0x2e]
movs r0, #0xf
ands r5, r0
lsls r0, r5, #4
ldrh r1, [r4, #0x32]
adds r0, r0, r1
strh r0, [r4, #0x32]
adds r0, r4, #0
bl sub_08004168
adds r0, r4, #0
movs r1, #0
bl InitializeAnimation
ldr r0, _080ABE84 @ =0x0000012D
bl SoundReq
pop {r4, r5, pc}
.align 2, 0
_080ABE84: .4byte 0x0000012D
.syntax divided
@@ -1,69 +0,0 @@
.syntax unified
push {r4, lr}
adds r4, r0, #0
ldrb r1, [r4, #0xa]
adds r1, #1
bl InitializeAnimation
ldrb r1, [r4, #0xa]
cmp r1, #0
beq _080AC030
cmp r1, #1
beq _080AC048
movs r1, #0
movs r0, #2
strb r0, [r4, #0xc]
strb r1, [r4, #0xe]
movs r0, #0xff
strb r0, [r4, #0xf]
ldr r1, _080AC028 @ =gUnk_0812A97C
ldrb r0, [r4, #0xb]
lsls r0, r0, #1
adds r0, r0, r1
ldrh r0, [r0]
strh r0, [r4, #0x24]
adds r1, r4, #0
adds r1, #0x44
movs r0, #0x88
strb r0, [r1]
ldr r0, _080AC02C @ =0x00000193
b _080AC06A
.align 2, 0
_080AC028: .4byte gUnk_0812A97C
_080AC02C: .4byte 0x00000193
_080AC030:
movs r0, #1
strb r0, [r4, #0xc]
strb r1, [r4, #0xe]
movs r0, #7
strb r0, [r4, #0xf]
adds r1, r4, #0
adds r1, #0x85
movs r0, #0x18
strb r0, [r1]
subs r1, #0x41
movs r0, #0x88
b _080AC058
_080AC048:
strb r1, [r4, #0xc]
ldrb r1, [r4, #0x10]
movs r0, #0x7f
ands r0, r1
strb r0, [r4, #0x10]
adds r1, r4, #0
adds r1, #0x85
movs r0, #0x18
_080AC058:
strb r0, [r1]
ldr r0, [r4, #0x50]
adds r1, r4, #0
bl CopyPositionAndSpriteOffset
ldrh r0, [r4, #0x36]
subs r0, #0x14
strh r0, [r4, #0x36]
ldr r0, _080AC070 @ =0x00000149
_080AC06A:
bl SoundReq
pop {r4, pc}
.align 2, 0
_080AC070: .4byte 0x00000149
.syntax divided
@@ -1,75 +0,0 @@
.syntax unified
push {r4, r5, r6, lr}
adds r4, r0, #0
bl GetNextFrame
ldr r0, [r4, #0x34]
ldr r1, _080AC1C0 @ =0xFFFF8000
adds r0, r0, r1
str r0, [r4, #0x34]
ldrb r0, [r4, #0xe]
subs r0, #1
strb r0, [r4, #0xe]
lsls r0, r0, #0x18
lsrs r6, r0, #0x18
cmp r6, #0
bne _080AC1F8
movs r0, #4
strb r0, [r4, #0xc]
strb r0, [r4, #0xe]
bl Random
adds r5, r0, #0
movs r0, #7
ands r5, r0
ldr r0, _080AC1C4 @ =gUnk_0812A982
adds r0, r5, r0
ldrb r0, [r0]
strb r0, [r4, #0xf]
ldr r1, _080AC1C8 @ =gPlayerEntity
adds r0, r4, #0
bl GetFacingDirection
adds r1, r0, #0
ldr r0, [r4, #0x50]
adds r0, #0x84
ldrb r0, [r0]
cmp r0, #3
bne _080AC1D0
ldr r0, _080AC1CC @ =gUnk_0812A98A
adds r0, r5, r0
ldrb r0, [r0]
subs r1, r1, r0
strb r6, [r4, #0xb]
b _080AC1F2
.align 2, 0
_080AC1C0: .4byte 0xFFFF8000
_080AC1C4: .4byte gUnk_0812A982
_080AC1C8: .4byte gPlayerEntity
_080AC1CC: .4byte gUnk_0812A98A
_080AC1D0:
cmp r0, #2
bne _080AC1E4
ldr r0, _080AC1E0 @ =gUnk_0812A98A
adds r0, r5, r0
ldrb r0, [r0]
subs r1, r1, r0
movs r0, #1
b _080AC1F0
.align 2, 0
_080AC1E0: .4byte gUnk_0812A98A
_080AC1E4:
ldr r0, _080AC1FC @ =gUnk_0812A98A
adds r0, r5, r0
ldrb r0, [r0]
lsrs r0, r0, #1
subs r1, r1, r0
movs r0, #2
_080AC1F0:
strb r0, [r4, #0xb]
_080AC1F2:
movs r0, #0x1f
ands r1, r0
strb r1, [r4, #0x15]
_080AC1F8:
pop {r4, r5, r6, pc}
.align 2, 0
_080AC1FC: .4byte gUnk_0812A98A
.syntax divided
@@ -1,62 +0,0 @@
.syntax unified
push {r4, r5, lr}
adds r4, r0, #0
bl GetNextFrame
ldrb r0, [r4, #0xe]
subs r0, #1
strb r0, [r4, #0xe]
movs r5, #0xff
lsls r0, r0, #0x18
cmp r0, #0
bne _080AC270
movs r0, #0x10
strb r0, [r4, #0xe]
movs r0, #0x21
bl CreateProjectile
adds r1, r0, #0
cmp r1, #0
beq _080AC23C
movs r0, #2
strb r0, [r1, #0xa]
ldrb r0, [r4, #0xb]
strb r0, [r1, #0xb]
ldrb r0, [r4, #0x15]
strb r0, [r1, #0x15]
ldr r0, [r4, #0x50]
str r0, [r1, #0x50]
adds r0, r4, #0
bl CopyPosition
_080AC23C:
ldrb r0, [r4, #0xf]
subs r0, #1
strb r0, [r4, #0xf]
ands r0, r5
cmp r0, #0
bne _080AC24C
bl DeleteThisEntity
_080AC24C:
ldr r0, [r4, #0x50]
adds r0, #0x84
ldrb r0, [r0]
cmp r0, #3
bne _080AC25C
ldrb r0, [r4, #0x15]
adds r0, #3
b _080AC26A
_080AC25C:
cmp r0, #2
bne _080AC266
ldrb r0, [r4, #0x15]
adds r0, #3
b _080AC26A
_080AC266:
ldrb r0, [r4, #0x15]
adds r0, #2
_080AC26A:
movs r1, #0x1f
ands r0, r1
strb r0, [r4, #0x15]
_080AC270:
pop {r4, r5, pc}
.align 2, 0
.syntax divided
@@ -1,53 +0,0 @@
.syntax unified
push {r4, lr}
adds r4, r0, #0
adds r0, #0x41
ldrb r0, [r0]
movs r1, #0x7f
ands r1, r0
cmp r1, #0xc
bgt _080ACA82
cmp r1, #0xa
bge _080ACA86
cmp r1, #6
beq _080ACA86
b _080ACAC0
_080ACA82:
cmp r1, #0x1a
bne _080ACAC0
_080ACA86:
movs r0, #2
strb r0, [r4, #0xc]
ldrb r1, [r4, #0x10]
movs r0, #0x7f
ands r0, r1
strb r0, [r4, #0x10]
movs r1, #0x80
lsls r1, r1, #1
adds r0, r1, #0
ldrh r1, [r4, #0x24]
adds r0, r0, r1
strh r0, [r4, #0x24]
ldr r0, [r4, #0x4c]
str r0, [r4, #0x54]
adds r0, r4, #0
bl sub_080ACB40
cmp r0, #0
beq _080ACAB0
movs r0, #0
b _080ACAB6
_080ACAB0:
adds r0, r4, #0
adds r0, #0x3e
ldrb r0, [r0]
_080ACAB6:
strb r0, [r4, #0x15]
movs r0, #0xd8
bl SoundReq
b _080ACAC4
_080ACAC0:
bl DeleteThisEntity
_080ACAC4:
pop {r4, pc}
.align 2, 0
.syntax divided
@@ -1,48 +0,0 @@
.syntax unified
push {lr}
adds r2, r0, #0
ldr r0, [r2, #0x50]
ldr r1, [r0, #0x50]
ldr r3, [r2, #0x54]
ldr r0, [r1, #0x64]
ldr r0, [r0, #0x1c]
ldr r0, [r0, #0x54]
cmp r0, r2
beq _080ACB5A
ldr r0, [r0, #0x54]
cmp r3, r0
beq _080ACB86
_080ACB5A:
ldr r1, [r1, #0x64]
ldr r0, [r1, #0x20]
ldr r0, [r0, #0x54]
cmp r0, r2
beq _080ACB6A
ldr r0, [r0, #0x54]
cmp r3, r0
beq _080ACB86
_080ACB6A:
ldr r0, [r1, #0x24]
ldr r0, [r0, #0x54]
cmp r0, r2
beq _080ACB78
ldr r0, [r0, #0x54]
cmp r3, r0
beq _080ACB86
_080ACB78:
ldr r0, [r1, #0x28]
ldr r0, [r0, #0x54]
cmp r0, r2
beq _080ACB8A
ldr r0, [r0, #0x54]
cmp r3, r0
bne _080ACB8A
_080ACB86:
movs r0, #0
b _080ACB8C
_080ACB8A:
movs r0, #1
_080ACB8C:
pop {pc}
.align 2, 0
.syntax divided
-70
View File
@@ -1,70 +0,0 @@
.syntax unified
push {r4, r5, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xa]
cmp r0, #0
bne _080AB99C
adds r0, r4, #0
bl ProcessMovement
ldrb r0, [r4, #0x15]
lsrs r0, r0, #3
ldr r1, _080AB994 @ =gUnk_0812A6C4
lsls r5, r0, #1
adds r1, r5, r1
ldrh r1, [r1]
ldrh r0, [r4, #0x2a]
ands r0, r1
cmp r0, #0
bne _080AB980
ldrb r1, [r4, #0x15]
adds r0, r4, #0
bl sub_080AB9FC
cmp r0, #0
beq _080AB9D4
_080AB980:
bl Random
ldr r2, _080AB998 @ =gUnk_0812A6BC
movs r1, #1
ands r1, r0
adds r1, r1, r5
adds r1, r1, r2
ldrb r0, [r1]
strb r0, [r4, #0x15]
b _080AB9D4
.align 2, 0
_080AB994: .4byte gUnk_0812A6C4
_080AB998: .4byte gUnk_0812A6BC
_080AB99C:
ldr r0, [r4, #0x50]
cmp r0, #0
bne _080AB9A6
bl DeleteThisEntity
_080AB9A6:
ldr r0, [r4, #0x50]
ldr r0, [r0, #4]
cmp r0, #0
bne _080AB9B2
bl DeleteThisEntity
_080AB9B2:
ldr r1, [r4, #0x54]
cmp r1, #0
beq _080AB9D0
ldr r0, [r1, #4]
cmp r0, #0
beq _080AB9D0
adds r0, r1, #0
adds r0, #0x68
ldrh r0, [r0]
strh r0, [r4, #0x2e]
adds r0, r1, #0
adds r0, #0x6a
ldrh r0, [r0]
strh r0, [r4, #0x32]
b _080AB9D4
_080AB9D0:
bl DeleteThisEntity
_080AB9D4:
adds r0, r4, #0
bl GetNextFrame
pop {r4, r5, pc}
.syntax divided
-49
View File
@@ -1,49 +0,0 @@
.syntax unified
push {r4, r5, r6, r7, lr}
adds r5, r0, #0
adds r4, r1, #0
adds r0, #0x38
ldrb r0, [r0]
bl GetLayerByIndex
movs r1, #0x2e
ldrsh r3, [r5, r1]
ldr r2, _080ABA4C @ =gRoomControls
ldrh r1, [r2, #6]
subs r3, r3, r1
asrs r3, r3, #4
movs r6, #0x3f
ands r3, r6
movs r7, #0x32
ldrsh r1, [r5, r7]
ldrh r2, [r2, #8]
subs r1, r1, r2
asrs r1, r1, #4
ands r1, r6
lsls r1, r1, #6
orrs r3, r1
ldr r1, _080ABA50 @ =gUnk_080B4488
lsrs r4, r4, #3
lsls r4, r4, #1
adds r4, r4, r1
movs r2, #0
ldrsh r1, [r4, r2]
adds r3, r3, r1
ldr r7, _080ABA54 @ =0x00002004
adds r0, r0, r7
adds r0, r0, r3
ldrb r0, [r0]
cmp r0, #0x1f
bls _080ABA58
cmp r0, #0x3f
bhi _080ABA58
movs r0, #1
b _080ABA5A
.align 2, 0
_080ABA4C: .4byte gRoomControls
_080ABA50: .4byte gUnk_080B4488
_080ABA54: .4byte 0x00002004
_080ABA58:
movs r0, #0
_080ABA5A:
pop {r4, r5, r6, r7, pc}
.syntax divided
+8 -6
View File
@@ -101,6 +101,13 @@ typedef struct {
u8 unknown2[3];
} Hitbox3D;
typedef struct {
u8 b0 : 3; // 1-4
u8 b1 : 3; // 8
u8 b2 : 1; // 0x40
u8 b3 : 1; // 0x80
} PACKED SpritePriority;
/**
* Container for instantiable behavior.
*/
@@ -156,12 +163,7 @@ typedef struct Entity_ {
/*0x20*/ s32 zVelocity; /**< Z axis speed. */
/*0x24*/ s16 speed; /**< Magnitude of speed. */
/*0x26*/ u8 spriteAnimation[3];
/*0x29*/ struct {
/* */ u8 b0 : 3; /* 1-4 */
/* */ u8 b1 : 3; /* 8 */
/* */ u8 b2 : 1; /* 0x40 */
/* */ u8 b3 : 1; /* 0x80 */
/* */ } PACKED spritePriority;
/*0x29*/ SpritePriority spritePriority;
/*0x2a*/ u16 collisions;
/*0x2c*/ union SplitWord x; /**< X position, fixed point. */
/*0x30*/ union SplitWord y; /**< Y position, fixed point. */
+62 -5
View File
@@ -1,11 +1,17 @@
#include "entity.h"
#include "functions.h"
#include "projectile.h"
#include "hitbox.h"
typedef struct {
s8 x;
s8 y;
} PACKED PosOffset;
bool32 sub_080AB12C(Entity* this);
extern void (*const gUnk_0812A494[])(Entity*);
extern const u8 gUnk_0812A4A8[];
extern const PosOffset gUnk_0812A4A8[];
void BallAndChain(Entity* this) {
gUnk_0812A494[this->type](this);
@@ -61,7 +67,58 @@ bool32 sub_080AB12C(Entity* this) {
return TRUE;
}
ASM_FUNC("asm/non_matching/ballAndChain/sub_080AB170.inc", void sub_080AB170(Entity* this))
void sub_080AB170(Entity* this) {
s32 val;
s32 type;
Entity* ent;
Entity* parent = this->parent;
if (parent->next == NULL) {
DeleteThisEntity();
}
if (this->action == 0) {
this->action = 1;
this->spritePriority.b1 = 0;
this->frameIndex = 5;
this->spritePriority.b0 = 3;
this->hitbox = (Hitbox*)&gHitbox_22;
}
ent = parent->parent;
if (this->field_0x7c.BYTES.byte0 != ent->field_0x7c.BYTES.byte0) {
this->flags |= 0x80;
} else {
this->flags &= 0x7f;
}
this->field_0x7c.BYTES.byte0 = ent->field_0x7c.BYTES.byte0;
if ((ent->frame & 0x20) == 0) {
u8 index = ent->frame & 0x1f;
PosOffset* pOffset = (PosOffset*)((s8*)gUnk_0812A4A8 + index);
sub_0806FA90(ent, this, pOffset->x, pOffset->y);
} else {
sub_0806FA90(ent, this, 0, -10);
}
val = (parent->x.HALF.HI - this->x.HALF.HI) * this->type;
if (val < 0) {
val += 3;
}
this->x.HALF.HI += (val >> 2);
val = (parent->y.HALF.HI - this->y.HALF.HI) * this->type;
if (val < 0) {
val += 3;
}
this->y.HALF.HI += (val >> 2);
val = (parent->z.HALF.HI - this->z.HALF.HI) * this->type;
if (val < 0) {
val += 3;
}
this->z.HALF.HI += (val >> 2);
}
void sub_080AB26C(Entity* this) {
if (this->action == 0) {
@@ -82,7 +139,7 @@ void sub_080AB26C(Entity* this) {
void (*const gUnk_0812A494[])(Entity*) = {
sub_080AB074, sub_080AB170, sub_080AB170, sub_080AB170, sub_080AB26C,
};
const u8 gUnk_0812A4A8[] = {
6, 240, 10, 242, 10, 240, 8, 240, 252, 242, 248, 242, 252, 246, 4, 246,
250, 242, 248, 240, 246, 242, 248, 244, 4, 242, 8, 242, 4, 246, 252, 246,
const PosOffset gUnk_0812A4A8[] = {
{ 6, -16 }, { 10, -14 }, { 10, -16 }, { 8, -16 }, { -4, -14 }, { -8, -14 }, { -4, -10 }, { 4, -10 },
{ -6, -14 }, { -8, -16 }, { -10, -14 }, { -8, -12 }, { 4, -14 }, { 8, -14 }, { 4, -10 }, { -4, -10 },
};
+24 -1
View File
@@ -19,7 +19,30 @@ void GyorgMaleEnergyProjectile_OnTick(Entity* this) {
GyorgMaleEnergyProjectile_Actions[this->action](this);
}
ASM_FUNC("asm/non_matching/gyorgMaleEnergyProjectile/sub_080AC8DC.inc", void sub_080AC8DC(Entity* this))
void sub_080AC8DC(Entity* this) {
switch ((s8)(this->bitfield & 0x7f)) {
case 0:
case 1:
case 2:
case 3:
case 0x1e:
case 0x1f: {
DeleteThisEntity();
break;
}
default: {
if (this->action != 3) {
this->action = 3;
this->flags &= 0x7f;
this->speed >>= 1;
InitializeAnimation(this, 1);
}
break;
}
}
GyorgMaleEnergyProjectile_OnTick(this);
}
void GyorgMaleEnergyProjectile_Init(Entity* this) {
this->action = 1;
+53 -3
View File
@@ -3,8 +3,14 @@
#include "functions.h"
#include "object.h"
typedef struct {
u8 b0;
u8 direction;
} PACKED Struct_0812A074;
extern void sub_0806FBB4(Entity*);
extern u32 sub_080002D4(s32, s32, u32);
extern void sub_08078930(Entity*);
extern void (*const SpiderWeb_Functions[])(Entity*);
extern void (*const SpiderWeb_Actions[])(Entity*);
@@ -13,7 +19,7 @@ extern const Hitbox* const gUnk_0812A04C[];
extern void (*const SpiderWeb_SubActions[])(Entity*);
extern const s8 gUnk_0812A064[];
extern const s8 gUnk_0812A06C[];
extern const u8 gUnk_0812A074[];
extern const Struct_0812A074 gUnk_0812A074[];
extern const u16 gUnk_0812A084[];
void sub_080AA6C0(Entity*);
@@ -165,7 +171,50 @@ void SpiderWeb_Action3(Entity* this) {
}
}
ASM_FUNC("asm/non_matching/spiderWeb/sub_080AA9E0.inc", void sub_080AA9E0(Entity* this))
NONMATCH("asm/non_matching/spiderWeb/sub_080AA9E0.inc", void sub_080AA9E0(Entity* this)) {
s32 coord1, coord2, diff;
Struct_0812A074* ptr;
SpritePriority* priorityPtr;
SpritePriority prio;
u8 val1, val2;
if (this->type & 0x1) {
coord2 = gPlayerEntity.x.HALF.HI;
coord1 = this->x.HALF.HI;
} else {
coord2 = gPlayerEntity.y.HALF.HI;
coord1 = this->y.HALF.HI;
}
diff = coord2 - coord1;
ptr = (Struct_0812A074*)gUnk_0812A074 + (this->type << 1);
switch (this->type) {
case 3:
case 0: {
if (diff > 4) {
ptr++;
}
break;
}
case 1:
case 2: {
if (diff < -4) {
ptr++;
}
break;
}
}
val1 = ptr->b0;
priorityPtr = (SpritePriority*)&this->spritePriority;
priorityPtr->b0 = val1 & 0x7;
// instruction order problems
// this->spritePriority.b0 = ptr->b0 & 0x7;
this->direction = ptr->direction;
if (val1 == 5) {
sub_08078930(this);
}
}
END_NONMATCH
void sub_080AAA68(Entity* this) {
SetTile(gUnk_0812A084[this->type], TILE(this->x.HALF.HI, this->y.HALF.HI), this->collisionLayer);
@@ -205,5 +254,6 @@ void (*const SpiderWeb_SubActions[])(Entity*) = {
};
const s8 gUnk_0812A064[] = { 0, 17, -15, 4, 0, -11, 15, 4 };
const s8 gUnk_0812A06C[] = { 0, 2, -2, 0, 0, -2, 2, 0 };
const u8 gUnk_0812A074[] = { 4, 0, 5, 16, 3, 8, 5, 24, 3, 16, 5, 0, 3, 24, 5, 8 };
const Struct_0812A074 gUnk_0812A074[] = { { 4, 0 }, { 5, 16 }, { 3, 8 }, { 5, 24 },
{ 3, 16 }, { 5, 0 }, { 3, 24 }, { 5, 8 } };
const u16 gUnk_0812A084[] = { 16419, 16421, 16422, 16420 };
+83 -8
View File
@@ -1,20 +1,95 @@
#define NENT_DEPRECATED
#include "entity.h"
extern void (*const SpikedRollers_Actions[])(Entity*);
extern const u8 gUnk_0812A6D4[];
typedef struct {
Entity base;
s16 x2;
s16 y2;
s16 unk_0x6c;
u8 fill[0x16];
u16 unk_0x84;
u16 speed2;
} SpikedRollersEntity;
void SpikedRollers(Entity* this) {
SpikedRollers_Actions[this->action](this);
extern s32 sub_080AF090(Entity*);
static void (*const SpikedRollers_Actions[])(SpikedRollersEntity*);
static const u8 gSpikedRollersOffsets[];
void SpikedRollers(SpikedRollersEntity* this) {
SpikedRollers_Actions[super->action](this);
}
ASM_FUNC("asm/non_matching/spikedRollers/sub_080ABA74.inc", void sub_080ABA74(Entity* this))
void sub_080ABA74(SpikedRollersEntity* this) {
s32 val;
super->action++;
super->speed = this->speed2;
this->x2 = super->x.HALF.HI;
this->y2 = super->y.HALF.HI;
this->unk_0x6c = this->unk_0x84;
ASM_FUNC("asm/non_matching/spikedRollers/sub_080ABAE0.inc", void sub_080ABAE0(Entity* this))
if (super->type <= 6) {
super->type2 = 0;
} else {
super->type2 = 1;
}
void (*const SpikedRollers_Actions[])(Entity*) = {
val = gSpikedRollersOffsets[super->type];
if (super->type2 == 0) {
super->direction = 8;
super->y.HALF.HI += val;
} else {
super->direction = 0x10;
super->x.HALF.HI += val;
}
InitializeAnimation(super, super->type);
}
void sub_080ABAE0(SpikedRollersEntity* this) {
s32 diff, unk_0x6c;
sub_080AF090(super);
if (super->type2 == 0) {
diff = super->x.HALF.HI - this->x2;
} else {
diff = super->y.HALF.HI - this->y2;
}
unk_0x6c = this->unk_0x6c;
if (unk_0x6c < 0) {
diff = -diff;
unk_0x6c = -unk_0x6c;
}
if ((u32)(diff << 0x10) > (unk_0x6c << 0x10)) {
super->direction ^= 0x10;
if (super->type2 == 0) {
super->x.HALF.HI = this->x2;
super->spriteSettings.flipX ^= 1;
} else {
super->y.HALF.HI = this->y2;
super->spriteSettings.flipY ^= 1;
}
if (diff > 0) {
if (super->type2 == 0) {
super->x.HALF.HI += this->unk_0x6c;
} else {
super->y.HALF.HI += this->unk_0x6c;
}
}
}
GetNextFrame(super);
}
static void (*const SpikedRollers_Actions[])(SpikedRollersEntity*) = {
sub_080ABA74,
sub_080ABAE0,
};
const u8 gUnk_0812A6D4[] = {
static const u8 gSpikedRollersOffsets[] = {
8, 16, 24, 32, 40, 48, 56, 16, 24, 32, 40, 48, 56, 64,
};
+33 -1
View File
@@ -52,7 +52,39 @@ void sub_080AAC44(Entity* this) {
}
}
ASM_FUNC("asm/non_matching/v1DarkMagicProjectile/sub_080AACE0.inc", void sub_080AACE0(Entity* this))
void sub_080AACE0(Entity* this) {
Entity* parent;
if (this->type && this->type2) {
DeleteThisEntity();
}
if (this->spriteSettings.draw == 1) {
this->spriteSettings.draw = 0;
this->field_0x86.HALF.LO = 1;
CreateFx(this, 2, 0);
}
parent = this->parent;
if (this->type2 == 0) {
u8* ptr = &(parent->field_0x74.HALF.LO);
parent->field_0x74.HALF.LO = 3;
parent->field_0x80.HALF.LO += this->field_0x80.HALF.HI >> 1;
if (parent->field_0x80.HALF.LO > 8) {
parent->field_0x80.HALF.LO = 8;
} else if (parent->field_0x80.HALF.LO == 0) {
parent->field_0x80.HALF.LO = 1;
}
} else {
parent->cutsceneBeh.HALF.LO = 0;
parent->hitType = 0x2b;
}
if (this->field_0x86.HALF.LO == 0) {
CreateFx(this, 2, 0);
}
DeleteThisEntity();
}
void sub_080AAD70(Entity* this) {
if (sub_0806F520() == 0) {
+40 -1
View File
@@ -9,6 +9,7 @@ extern const Hitbox gUnk_0812A61C;
void sub_080AB758(Entity*);
void sub_080AB888(Entity*);
void sub_080AB844(Entity* this, s32 param_1, s32 param_2);
void V1EyeLaser(Entity* this) {
if (this->parent->spriteSettings.draw == 0) {
@@ -50,7 +51,45 @@ void V1EyeLaser_Action2(Entity* this) {
}
}
ASM_FUNC("asm/non_matching/v1EyeLaser/sub_080AB758.inc", void sub_080AB758(Entity* this))
NONMATCH("asm/non_matching/v1EyeLaser/sub_080AB758.inc", void sub_080AB758(Entity* this)) {
s32 r6 = 6;
u32 r7 = 0;
u32 index = 0;
if (((u32)this->y.HALF.HI) <= (u16)(gRoomControls.origin_y + 0xd4)) {
u32 tmp = 7;
do {
if ((index & tmp) == 7) {
sub_080AB844(this, 4, r6);
r6 += 0x3e;
r7 += 0x3e;
}
index = (index + 1) & tmp;
} while (this->y.HALF.HI + r7 + (index << 3) <= (u16)(gRoomControls.origin_y + 0xd4));
}
index = 0;
if (this->y.HALF.HI + r7 <= (u16)(gRoomControls.origin_y + 0xd4)) {
u32 tmp = 3;
do {
if ((index & tmp) == 3) {
sub_080AB844(this, 3, r6);
r6 += 0x1e;
r7 += 0x1e;
}
index = (index + 1) & tmp;
} while (this->y.HALF.HI + r7 + (index << 3) <= (u16)(gRoomControls.origin_y + 0xd4));
}
if (index & 0x2) {
sub_080AB844(this, 2, r6);
r6 += 0xe;
} else if (index & 0x1) {
sub_080AB844(this, 1, r6);
r6 += 0x6;
}
sub_080AB844(this, 6, r6);
}
END_NONMATCH
void sub_080AB844(Entity* this, s32 param_1, s32 param_2) {
Entity* entity;
+66 -3
View File
@@ -2,6 +2,7 @@
#include "entity.h"
#include "enemy.h"
#include "functions.h"
#include "object.h"
extern void (*const V2Projectile_Functions[])(Entity*);
extern void (*const gUnk_0812A7EC[])(Entity*);
@@ -18,9 +19,52 @@ void V2Projectile(Entity* this) {
V2Projectile_Functions[GetNextFunction(this)](this);
}
ASM_FUNC("asm/non_matching/v2Projectile/sub_080ABBA8.inc", void sub_080ABBA8(Entity* this))
void sub_080ABBA8(Entity* this) {
switch (this->type) {
case 0: {
gUnk_0812A7EC[this->action](this);
break;
}
case 1: {
gUnk_0812A7F8[this->action](this);
break;
}
case 2:
default:
gUnk_0812A800[this->action](this);
}
}
ASM_FUNC("asm/non_matching/v2Projectile/sub_080ABBF4.inc", void sub_080ABBF4(Entity* this))
void sub_080ABBF4(Entity* this) {
if ((this->bitfield & 0x80) == 0)
return;
switch (this->type) {
case 2: {
switch ((this->bitfield & 0x3f)) {
case 0: {
ModHealth(-4);
// fallthrough
}
case 3:
case 0x14: {
CreateDust(this);
DeleteThisEntity();
break;
}
}
break;
}
case 0:
case 1: {
if ((this->bitfield & 0x3f) == 0) {
ModHealth(-2);
DeleteThisEntity();
}
break;
}
}
}
void sub_080ABC54(Entity* this) {
if (sub_0806F520() == 0) {
@@ -90,7 +134,26 @@ void sub_080ABD70(Entity* this) {
}
}
ASM_FUNC("asm/non_matching/v2Projectile/sub_080ABE04.inc", void sub_080ABE04(Entity* this))
void sub_080ABE04(Entity* this) {
u32 rand = Random() & 0xff;
u32 newX;
this->action = 1;
this->zVelocity = 0xffff0000;
this->z.HALF.HI -= 0xa0;
this->x.HALF.HI = (gRoomControls.origin_x & 0x7ff0) | 0x8;
this->y.HALF.HI = (gRoomControls.origin_y & 0x7ff0) | 0x8;
newX = this->x.HALF.HI;
if (rand & 0x10) {
newX += 0x10;
} else {
newX += 0xc0;
}
this->x.HALF.HI = newX + ((0xe0 & rand) >> 1);
this->y.HALF.HI += ((0xf & rand) << 4);
sub_08004168(this);
InitializeAnimation(this, 0);
SoundReq(SFX_12D);
}
void sub_080ABE88(Entity* this) {
if (GravityUpdate(this, 0x1800) == 0) {
+102 -9
View File
@@ -2,15 +2,16 @@
#include "enemy.h"
#include "player.h"
#include "coord.h"
#include "functions.h"
extern s32 sub_080AF090(Entity*);
extern s32 IsProjectileOffScreen(Entity*);
extern void (*const V3ElectricProjectile_Functions[])(Entity*);
extern void (*const V3ElectricProjectile_Actions[])(Entity*);
extern const u16 gUnk_0812A97C[];
extern const u8 gUnk_0812A982[];
extern const u8 gUnk_0812A98A[];
static const u16 projectileSpeeds[];
static const u8 gUnk_0812A982[];
static const u8 projectileDirections[];
void V3ElectricProjectile(Entity* this) {
V3ElectricProjectile_Functions[GetNextFunction(this)](this);
@@ -24,7 +25,44 @@ void sub_080ABFE4(Entity* this) {
DeleteThisEntity();
}
ASM_FUNC("asm/non_matching/v3ElectricProjectile/sub_080ABFEC.inc", void sub_080ABFEC(Entity* this))
void sub_080ABFEC(Entity* this) {
Sound sound;
InitializeAnimation(this, this->type + 1);
switch (this->type) {
case 0: {
this->action = 1;
this->actionDelay = 0;
this->field_0xf = 0x7;
this->cutsceneBeh.HALF.HI = 0x18;
this->damage = 0x88;
CopyPositionAndSpriteOffset(this->parent, this);
this->z.HALF.HI -= 0x14;
sound = SFX_149;
break;
}
case 1: {
this->action = 1;
this->flags &= 0x7f;
this->cutsceneBeh.HALF.HI = 0x18;
CopyPositionAndSpriteOffset(this->parent, this);
this->z.HALF.HI -= 0x14;
sound = SFX_149;
break;
}
default: {
this->action = 2;
this->actionDelay = 0;
this->field_0xf = 0xff;
this->speed = projectileSpeeds[this->type2];
this->damage = 0x88;
sound = SFX_193;
break;
}
}
SoundReq(sound);
}
void V3ElectricProjectile_Action1(Entity* this) {
if (this->parent->next == NULL) {
@@ -75,9 +113,64 @@ void V3ElectricProjectile_Action2(Entity* this) {
}
}
ASM_FUNC("asm/non_matching/v3ElectricProjectile/sub_080AC168.inc", void sub_080AC168(Entity* this))
void sub_080AC168(Entity* this) {
u8 actionDelay;
GetNextFrame(this);
this->z.WORD += 0xffff8000;
actionDelay = --this->actionDelay;
if (actionDelay == 0) {
u32 rand;
u32 dir;
this->action = 4;
this->actionDelay = 4;
rand = Random() & 0x7;
this->field_0xf = gUnk_0812A982[rand];
dir = GetFacingDirection(this, &gPlayerEntity);
if (this->parent->cutsceneBeh.HALF.LO == 3) {
dir -= projectileDirections[rand];
this->type2 = 0;
} else if (this->parent->cutsceneBeh.HALF.LO == 2) {
dir -= projectileDirections[rand];
this->type2 = 1;
} else {
dir -= projectileDirections[rand] >> 1;
this->type2 = 2;
}
ASM_FUNC("asm/non_matching/v3ElectricProjectile/sub_080AC200.inc", void sub_080AC200(Entity* this))
this->direction = dir & 0x1f;
}
}
void sub_080AC200(Entity* this) {
Entity* proj;
GetNextFrame(this);
if (--this->actionDelay)
return;
this->actionDelay = 0x10;
proj = CreateProjectile(0x21);
if (proj) {
proj->type = 2;
proj->type2 = this->type2;
proj->direction = this->direction;
proj->parent = this->parent;
CopyPosition(this, proj);
}
if (--this->field_0xf == 0) {
DeleteThisEntity();
}
if (this->parent->cutsceneBeh.HALF.LO == 3) {
this->direction = (this->direction + 3) & 0x1f;
} else if (this->parent->cutsceneBeh.HALF.LO == 2) {
this->direction = (this->direction + 3) & 0x1f;
} else {
this->direction = (this->direction + 2) & 0x1f;
}
}
void (*const V3ElectricProjectile_Functions[])(Entity*) = {
V3ElectricProjectile_OnTick, sub_080ABFE4, DeleteEntity, DeleteEntity, DeleteEntity,
@@ -85,10 +178,10 @@ void (*const V3ElectricProjectile_Functions[])(Entity*) = {
void (*const V3ElectricProjectile_Actions[])(Entity*) = {
sub_080ABFEC, V3ElectricProjectile_Action1, V3ElectricProjectile_Action2, sub_080AC168, sub_080AC200,
};
const u16 gUnk_0812A97C[] = { 352, 480, 480 };
const u8 gUnk_0812A982[] = {
static const u16 projectileSpeeds[] = { 352, 480, 480 };
static const u8 gUnk_0812A982[] = {
5, 6, 7, 8, 5, 6, 7, 6,
};
const u8 gUnk_0812A98A[] = {
static const u8 projectileDirections[] = {
6, 9, 9, 12, 6, 9, 9, 9, 0, 0,
};
+56 -2
View File
@@ -8,6 +8,7 @@ extern void (*const V3TennisBallProjectile_Functions[])(Entity*);
extern void (*const V3TennisBallProjectile_Actions[])(Entity*);
void sub_080ACB90(Entity*);
bool32 sub_080ACB40(Entity* this);
void V3TennisBallProjectile(Entity* this) {
V3TennisBallProjectile_Functions[GetNextFunction(this)](this);
@@ -17,7 +18,32 @@ void V3TennisBallProjectile_OnTick(Entity* this) {
V3TennisBallProjectile_Actions[this->action](this);
}
ASM_FUNC("asm/non_matching/v3TennisBallProjectile/sub_080ACA68.inc", void sub_080ACA68(Entity* this))
void sub_080ACA68(Entity* this) {
switch (this->bitfield & 0x7f) {
case 0x1a:
case 0xa:
case 0xb:
case 0xc:
case 0x6: {
this->action = 2;
this->flags &= 0x7f;
this->speed += 0x80 * 2;
this->child = this->field_0x4c;
if (sub_080ACB40(this)) {
this->direction = 0;
} else {
this->direction = this->knockbackDirection;
}
SoundReq(SFX_ITEM_SWORD_CHARGE_FINISH);
break;
}
default: {
DeleteThisEntity();
break;
}
}
}
void V3TennisBallProjectile_Init(Entity* this) {
this->action = 1;
@@ -48,7 +74,35 @@ void V3TennisBallProjectile_Action2(Entity* this) {
}
}
ASM_FUNC("asm/non_matching/v3TennisBallProjectile/sub_080ACB40.inc", void sub_080ACB40(Entity* this))
bool32 sub_080ACB40(Entity* this) {
Entity* r1_grandparent = this->parent->parent;
Entity* child = this->child;
Entity* tmp = ((Entity*)(r1_grandparent->myHeap[7]))->child;
if (tmp != this && child == tmp->child) {
return 0;
}
tmp = ((Entity*)(r1_grandparent->myHeap[8]))->child;
if (tmp != this && child == tmp->child) {
return 0;
}
tmp = ((Entity*)(r1_grandparent->myHeap[9]))->child;
if (tmp != this && child == tmp->child) {
return 0;
}
tmp = ((Entity*)(r1_grandparent->myHeap[10]))->child;
if (tmp != this && child == tmp->child) {
return 0;
}
return 1;
}
void sub_080ACB90(Entity* this) {
Entity* parent = this->parent;
+60 -6
View File
@@ -5,10 +5,13 @@
#include "projectile.h"
extern void (*const Winder_Actions[])(Entity*);
extern const u8 gUnk_0812A6BC[];
extern const u8 gUnk_0812A6C4[];
extern s16 gUnk_080B4488[];
extern u8* GetLayerByIndex(u32);
static const u8 gUnk_0812A6BC[];
static const u16 gUnk_0812A6C4[];
void sub_080AB9DC(Entity*);
bool32 sub_080AB9FC(Entity* this, u32 param_1);
void Winder(Entity* this) {
Winder_Actions[this->action](this);
@@ -45,7 +48,36 @@ void Winder_Init(Entity* this) {
}
}
ASM_FUNC("asm/non_matching/winder/sub_080AB950.inc", void sub_080AB950(Entity* this))
void sub_080AB950(Entity* this) {
if (this->type == 0) {
u8 dir;
ProcessMovement(this);
dir = this->direction >> 3;
if (((gUnk_0812A6C4)[dir] & this->collisions) || sub_080AB9FC(this, this->direction)) {
this->direction = gUnk_0812A6BC[(Random() & 0x1) + (dir << 1)];
}
} else {
Entity* child;
if (this->parent == NULL) {
DeleteThisEntity();
}
if (this->parent->next == NULL) {
DeleteThisEntity();
}
child = this->child;
if (child && child->next) {
this->x.HALF.HI = child->field_0x68.HWORD;
this->y.HALF.HI = child->field_0x6a.HWORD;
} else {
DeleteThisEntity();
}
}
GetNextFrame(this);
}
void sub_080AB9DC(Entity* this) {
MemCopy(&this->field_0x6c, &this->field_0x68, 0x1c);
@@ -53,7 +85,26 @@ void sub_080AB9DC(Entity* this) {
this->field_0x86.HWORD = this->y.HALF.HI;
}
ASM_FUNC("asm/non_matching/winder/sub_080AB9FC.inc", void sub_080AB9FC(Entity* this))
bool32 sub_080AB9FC(Entity* this, u32 dir) {
u32 val;
u8* layer = GetLayerByIndex(this->collisionLayer);
u32 tmp;
val = (((this->x.HALF.HI - gRoomControls.origin_x) >> 4) & 0x3f) |
((((this->y.HALF.HI - gRoomControls.origin_y) >> 4) & 0x3f) << 6);
val += gUnk_080B4488[dir >> 3];
layer += 0x2004;
layer += val;
tmp = *layer;
if (tmp <= 0x1f) {
return 0;
}
if (tmp > 0x3f) {
return 0;
}
return 1;
}
void (*const Winder_Actions[])(Entity*) = {
Winder_Init,
@@ -62,6 +113,9 @@ void (*const Winder_Actions[])(Entity*) = {
const u8 gUnk_0812A6BC[] = {
8, 24, 0, 16, 8, 24, 0, 16,
};
const u8 gUnk_0812A6C4[] = {
14, 0, 0, 224, 224, 0, 0, 14,
const u16 gUnk_0812A6C4[] = {
0xe,
0xe000,
0xe0,
0xe00,
};