Decompile sub_13D24; sub_14074; add 'anglemath.h' (#115)
Some checks are pending
CI / build (push) Waiting to run

* Decompile sub_13D24

* remove temp names from extern function definition

* decompile sub_14074

* cleanup

---------

Co-authored-by: Marcus Huderle <huderlem@gmail.com>
This commit is contained in:
Retnuhytnuob 2025-06-19 10:31:39 -05:00 committed by GitHub
parent 1c0a9314f8
commit e8822d07ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 286 additions and 872 deletions

View File

@ -262,877 +262,8 @@ _08013D14:
pop {r0}
bx r0
thumb_func_start sub_13D24
sub_13D24: @ 0x08013D24
push {r4, r5, r6, r7, lr}
mov r7, sl
mov r6, sb
mov r5, r8
push {r5, r6, r7}
sub sp, #0x24
adds r4, r1, #0
str r2, [sp, #0xc]
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
str r0, [sp, #8]
ldrh r0, [r4]
rsbs r0, r0, #0
lsls r0, r0, #0x10
asrs r0, r0, #0x10
movs r2, #2
ldrsh r1, [r4, r2]
bl ArcTan2
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
str r0, [sp, #0x10]
movs r1, #0
ldrsh r0, [r4, r1]
adds r1, r0, #0
muls r1, r0, r1
movs r2, #2
ldrsh r0, [r4, r2]
adds r2, r0, #0
muls r2, r0, r2
adds r0, r2, #0
adds r1, r1, r0
lsls r0, r1, #2
bl Sqrt
lsls r0, r0, #0x10
lsrs r0, r0, #0x11
str r0, [sp, #0x18]
ldr r0, [sp, #0x10]
ldr r1, [sp, #8]
cmp r0, r1
bls _08013D84
subs r4, r0, r1
ldr r1, _08013D80 @ =0x0000FFFF
b _08013D8C
.align 2, 0
_08013D80: .4byte 0x0000FFFF
_08013D84:
ldr r2, [sp, #8]
ldr r0, [sp, #0x10]
subs r4, r2, r0
movs r1, #1
_08013D8C:
movs r0, #0x80
lsls r0, r0, #8
cmp r4, r0
ble _08013DA0
movs r0, #0x80
lsls r0, r0, #9
subs r4, r0, r4
lsls r0, r1, #0x10
rsbs r0, r0, #0
lsrs r1, r0, #0x10
_08013DA0:
lsls r1, r1, #0x10
asrs r0, r1, #2
ldr r2, [sp, #8]
adds r0, r2, r0
str r0, [sp, #0x14]
mov r8, r1
cmp r0, #0
bge _08013DB8
movs r1, #0x80
lsls r1, r1, #9
adds r0, r0, r1
str r0, [sp, #0x14]
_08013DB8:
lsls r4, r4, #0x10
lsrs r4, r4, #0x10
adds r0, r4, #0
bl Sin
lsls r0, r0, #0x10
asrs r0, r0, #0x10
ldr r2, [sp, #0x18]
muls r0, r2, r0
ldr r5, _08013E40 @ =0x00004E20
adds r1, r5, #0
bl __divsi3
str r0, [sp, #0x1c]
adds r0, r4, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
ldr r1, [sp, #0x18]
muls r0, r1, r0
adds r1, r5, #0
bl __divsi3
adds r7, r0, #0
adds r0, r4, #0
bl Cos
lsls r0, r0, #0x10
ldr r1, _08013E44 @ =0x1F3F0000
cmp r0, r1
ble _08013E2A
cmp r7, #0x46
ble _08013E02
movs r0, SE_UNKNOWN_0x77
bl m4aSongNumStart
_08013E02:
movs r0, #0x8c
lsls r0, r0, #1
cmp r7, r0
ble _08013E2A
ldr r0, _08013E48 @ =gCurrentPinballGame
ldr r0, [r0]
ldr r2, _08013E4C @ =0x0000061C
adds r0, r0, r2
ldrb r0, [r0]
lsls r0, r0, #0x18
asrs r0, r0, #0x18
cmp r0, #0
bne _08013E2A
ldr r0, _08013E50 @ =gMain
ldrb r0, [r0, #4]
cmp r0, #1
bhi _08013E2A
movs r0, #6
bl sub_11B0
_08013E2A:
ldr r0, _08013E48 @ =gCurrentPinballGame
ldr r1, [r0]
adds r1, #0x31
ldrb r1, [r1]
cmp r1, #0
beq _08013E54
lsls r0, r7, #2
adds r0, r0, r7
lsls r0, r0, #2
adds r0, r0, r7
b _08013E58
.align 2, 0
_08013E40: .4byte 0x00004E20
_08013E44: .4byte 0x1F3F0000
_08013E48: .4byte gCurrentPinballGame
_08013E4C: .4byte 0x0000061C
_08013E50: .4byte gMain
_08013E54:
movs r0, #0x1a
muls r0, r7, r0
_08013E58:
movs r1, #0x64
bl __divsi3
adds r7, r0, #0
ldr r1, [sp, #0x1c]
lsls r0, r1, #3
movs r1, #0xa
bl __divsi3
adds r6, r0, #0
ldr r2, _08014004 @ =gCurrentPinballGame
ldr r0, [r2]
ldr r1, _08014008 @ =0x0000132C
adds r0, r0, r1
ldr r4, [r0]
movs r2, #6
ldrsh r0, [r4, r2]
ldr r5, _0801400C @ =0x00000EB8
muls r0, r5, r0
movs r1, #0xaf
lsls r1, r1, #0xa
bl __divsi3
mov sb, r0
mov r1, r8
asrs r0, r1, #0x10
rsbs r0, r0, #0
mov r8, r0
lsls r0, r0, #1
add r0, r8
lsls r0, r0, #3
add r0, r8
lsls r0, r0, #0xa
muls r0, r6, r0
adds r1, r5, #0
bl __divsi3
ldrh r1, [r4, #4]
adds r1, r1, r0
strh r1, [r4, #6]
ldr r0, [sp, #8]
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r7, r0
str r0, [sp]
ldr r0, [sp, #8]
bl Sin
rsbs r1, r7, #0
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r1, r0
mov r2, sp
str r2, [sp, #0x20]
str r0, [sp, #4]
ldr r1, [sp, #0x14]
lsls r0, r1, #0x10
lsrs r5, r0, #0x10
adds r0, r5, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
ldr r2, [sp, #0x1c]
muls r0, r2, r0
ldr r1, [sp]
adds r0, r0, r1
str r0, [sp]
adds r0, r5, #0
bl Sin
ldr r2, [sp, #0x1c]
rsbs r1, r2, #0
lsls r0, r0, #0x10
asrs r0, r0, #0x10
adds r4, r1, #0
muls r4, r0, r4
ldr r0, [sp, #4]
adds r4, r4, r0
str r4, [sp, #4]
ldr r0, [sp]
ldr r7, _08014010 @ =0x00004E20
adds r1, r7, #0
bl __divsi3
str r0, [sp]
adds r0, r4, #0
adds r1, r7, #0
bl __divsi3
str r0, [sp, #4]
movs r4, #1
mov r0, sb
cmp r0, #0
bge _08013F20
subs r4, #2
rsbs r0, r0, #0
mov sb, r0
_08013F20:
mov r1, r8
muls r1, r4, r1
adds r4, r1, #0
adds r0, r5, #0
bl Cos
mov r1, sb
muls r1, r4, r1
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r1, r0
adds r1, r7, #0
bl __divsi3
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ldr r1, _08014014 @ =0xFFFF0000
mov r2, sl
ands r2, r1
orrs r2, r0
mov sl, r2
adds r0, r5, #0
bl Sin
rsbs r1, r4, #0
mov r2, sb
muls r2, r1, r2
adds r1, r2, #0
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r1, r0
adds r1, r7, #0
bl __divsi3
lsls r0, r0, #0x10
ldr r1, _08014018 @ =0x0000FFFF
mov r2, sl
ands r2, r1
orrs r2, r0
mov sl, r2
ldr r0, [sp]
adds r1, r0, #0
muls r1, r0, r1
ldr r0, [sp, #4]
adds r2, r0, #0
muls r2, r0, r2
adds r0, r2, #0
adds r6, r1, r0
lsls r0, r6, #2
bl Sqrt
lsls r0, r0, #0x10
lsrs r6, r0, #0x11
mov r1, sl
lsls r0, r1, #0x10
asrs r0, r0, #0x10
ldr r1, [sp]
adds r0, r0, r1
str r0, [sp]
mov r2, sl
asrs r0, r2, #0x10
ldr r1, [sp, #4]
adds r0, r0, r1
str r0, [sp, #4]
mov r0, sp
movs r1, #0
ldrsh r0, [r0, r1]
ldr r2, [sp, #0x20]
ldrh r1, [r2, #4]
rsbs r1, r1, #0
lsls r1, r1, #0x10
asrs r1, r1, #0x10
bl ArcTan2
lsls r0, r0, #0x10
lsrs r5, r0, #0x10
ldr r0, _0801401C @ =gMain
ldrb r0, [r0, #4]
cmp r0, #1
bne _08014020
ldr r0, _08014004 @ =gCurrentPinballGame
ldr r1, [r0]
adds r0, r1, #0
adds r0, #0x24
ldrb r0, [r0]
lsls r0, r0, #0x18
asrs r0, r0, #0x18
cmp r0, #0
ble _08014020
ldr r2, _08014008 @ =0x0000132C
adds r0, r1, r2
ldr r0, [r0]
movs r1, #0x12
ldrsh r0, [r0, r1]
cmp r0, #0xd1
bgt _08014020
adds r0, r5, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
ldr r2, [sp, #0x18]
muls r0, r2, r0
adds r1, r7, #0
bl __divsi3
str r0, [sp]
adds r0, r5, #0
bl Sin
ldr r2, [sp, #0x18]
rsbs r1, r2, #0
b _0801403E
.align 2, 0
_08014004: .4byte gCurrentPinballGame
_08014008: .4byte 0x0000132C
_0801400C: .4byte 0x00000EB8
_08014010: .4byte 0x00004E20
_08014014: .4byte 0xFFFF0000
_08014018: .4byte 0x0000FFFF
_0801401C: .4byte gMain
_08014020:
adds r0, r5, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r6, r0
ldr r4, _08014070 @ =0x00004E20
adds r1, r4, #0
bl __divsi3
str r0, [sp]
adds r0, r5, #0
bl Sin
rsbs r1, r6, #0
_0801403E:
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r1, r0
ldr r1, _08014070 @ =0x00004E20
bl __divsi3
str r0, [sp, #4]
ldr r0, [sp, #8]
mov r1, sp
ldr r2, [sp, #0x10]
bl sub_14074
ldr r0, [sp]
ldr r1, [sp, #0xc]
strh r0, [r1]
ldr r0, [sp, #4]
strh r0, [r1, #2]
add sp, #0x24
pop {r3, r4, r5}
mov r8, r3
mov sb, r4
mov sl, r5
pop {r4, r5, r6, r7}
pop {r0}
bx r0
.align 2, 0
_08014070: .4byte 0x00004E20
thumb_func_start sub_14074
sub_14074: @ 0x08014074
push {r4, r5, r6, r7, lr}
mov r7, sl
mov r6, sb
mov r5, r8
push {r5, r6, r7}
mov r8, r1
lsls r0, r0, #0x10
lsrs r5, r0, #0x10
adds r7, r5, #0
lsls r2, r2, #0x10
lsrs r4, r2, #0x10
mov ip, r4
ldr r0, _080140CC @ =gCurrentPinballGame
mov sl, r0
ldr r1, [r0]
ldr r2, _080140D0 @ =0x0000132C
adds r0, r1, r2
ldr r3, [r0]
movs r2, #0x30
ldrsh r0, [r3, r2]
adds r2, r0, #0
muls r2, r0, r2
mov sb, r2
movs r2, #0x32
ldrsh r0, [r3, r2]
adds r2, r0, #0
muls r2, r0, r2
adds r0, r2, #0
add sb, r0
adds r1, #0x23
ldrb r0, [r1]
cmp r0, #2
beq _080140B8
b _08014230
_080140B8:
movs r1, #0x28
ldrsh r0, [r3, r1]
cmp r0, #0xe0
ble _080140DC
ldr r2, _080140D4 @ =0xFFFFD5E4
adds r0, r4, r2
lsls r0, r0, #0x10
lsrs r2, r0, #0x10
ldr r7, _080140D8 @ =0x00006A1C
b _080140E8
.align 2, 0
_080140CC: .4byte gCurrentPinballGame
_080140D0: .4byte 0x0000132C
_080140D4: .4byte 0xFFFFD5E4
_080140D8: .4byte 0x00006A1C
_080140DC:
ldr r0, _080140FC @ =0x000055E4
mov r1, ip
subs r0, r0, r1
lsls r0, r0, #0x10
lsrs r2, r0, #0x10
ldr r7, _08014100 @ =0x000015E4
_080140E8:
movs r0, #0x90
lsls r0, r0, #5
cmp r2, r0
bhi _08014108
ldr r0, _08014104 @ =0x00003FFF
cmp sb, r0
bgt _08014108
movs r6, #0
b _0801439C
.align 2, 0
_080140FC: .4byte 0x000055E4
_08014100: .4byte 0x000015E4
_08014104: .4byte 0x00003FFF
_08014108:
mov r2, r8
ldr r0, [r2]
movs r1, #5
bl __divsi3
mov r1, r8
str r0, [r1]
ldr r0, [r1, #4]
movs r1, #5
bl __divsi3
mov r2, r8
str r0, [r2, #4]
ldr r0, _08014180 @ =gCurrentPinballGame
ldr r4, [r0]
ldr r1, _08014184 @ =0x0000132C
adds r0, r4, r1
ldr r5, [r0]
movs r2, #6
ldrsh r0, [r5, r2]
lsls r0, r0, #2
movs r1, #0xa
bl __divsi3
strh r0, [r5, #6]
adds r4, #0x31
ldrb r0, [r4]
cmp r0, #0
beq _08014190
adds r0, r7, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
movs r1, #0xe6
muls r0, r1, r0
ldr r4, _08014188 @ =0x00004E20
adds r1, r4, #0
bl __divsi3
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ldr r1, _0801418C @ =0xFFFF0000
ands r6, r1
orrs r6, r0
adds r0, r7, #0
bl Sin
adds r1, r0, #0
lsls r1, r1, #0x10
asrs r1, r1, #0x10
lsls r0, r1, #3
subs r0, r0, r1
lsls r0, r0, #2
adds r0, r0, r1
lsls r0, r0, #2
subs r0, r0, r1
lsls r0, r0, #1
b _080141C8
.align 2, 0
_08014180: .4byte gCurrentPinballGame
_08014184: .4byte 0x0000132C
_08014188: .4byte 0x00004E20
_0801418C: .4byte 0xFFFF0000
_08014190:
adds r0, r7, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
ldr r1, _08014200 @ =0x0000011D
muls r0, r1, r0
ldr r4, _08014204 @ =0x00004E20
adds r1, r4, #0
bl __divsi3
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ldr r1, _08014208 @ =0xFFFF0000
ands r6, r1
orrs r6, r0
adds r0, r7, #0
bl Sin
adds r1, r0, #0
lsls r1, r1, #0x10
asrs r1, r1, #0x10
lsls r0, r1, #3
adds r0, r0, r1
lsls r0, r0, #3
subs r0, r0, r1
lsls r0, r0, #2
adds r0, r0, r1
_080141C8:
rsbs r0, r0, #0
adds r1, r4, #0
bl __divsi3
lsls r0, r0, #0x10
ldr r1, _0801420C @ =0x0000FFFF
ands r6, r1
orrs r6, r0
ldr r2, _08014210 @ =gCurrentPinballGame
ldr r0, [r2]
ldr r1, _08014214 @ =0x00000716
adds r0, r0, r1
movs r1, #4
strb r1, [r0]
ldr r1, [r2]
ldr r2, _08014218 @ =0x0000132C
adds r0, r1, r2
ldr r0, [r0]
movs r2, #0x10
ldrsh r0, [r0, r2]
cmp r0, #0x77
bgt _08014220
ldr r0, _0801421C @ =0x00000717
adds r1, r1, r0
movs r0, #0
strb r0, [r1]
b _0801439C
.align 2, 0
_08014200: .4byte 0x0000011D
_08014204: .4byte 0x00004E20
_08014208: .4byte 0xFFFF0000
_0801420C: .4byte 0x0000FFFF
_08014210: .4byte gCurrentPinballGame
_08014214: .4byte 0x00000716
_08014218: .4byte 0x0000132C
_0801421C: .4byte 0x00000717
_08014220:
ldr r2, _0801422C @ =0x00000717
adds r1, r1, r2
movs r0, #1
strb r0, [r1]
b _0801439C
.align 2, 0
_0801422C: .4byte 0x00000717
_08014230:
cmp r0, #1
beq _08014236
b _08014340
_08014236:
mov r1, r8
ldr r0, [r1]
movs r1, #5
bl __divsi3
mov r2, r8
str r0, [r2]
ldr r0, [r2, #4]
movs r1, #5
bl __divsi3
mov r1, r8
str r0, [r1, #4]
ldr r2, _08014298 @ =0x00005FFF
adds r0, r5, r2
lsls r0, r0, #0x10
ldr r1, _0801429C @ =0x3FFE0000
cmp r0, r1
bhi _080142A8
adds r0, r5, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
lsls r1, r0, #4
subs r1, r1, r0
lsls r1, r1, #2
ldr r4, _080142A0 @ =0x00004E20
adds r0, r1, #0
adds r1, r4, #0
bl __divsi3
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ldr r1, _080142A4 @ =0xFFFF0000
ands r6, r1
orrs r6, r0
adds r0, r5, #0
bl Sin
adds r1, r0, #0
lsls r1, r1, #0x10
asrs r1, r1, #0x10
lsls r0, r1, #4
subs r0, r0, r1
lsls r0, r0, #2
rsbs r0, r0, #0
b _0801438E
.align 2, 0
_08014298: .4byte 0x00005FFF
_0801429C: .4byte 0x3FFE0000
_080142A0: .4byte 0x00004E20
_080142A4: .4byte 0xFFFF0000
_080142A8:
ldr r1, _080142F0 @ =0xFFFFF000
adds r0, r5, r1
lsls r0, r0, #0x10
movs r1, #0xc0
lsls r1, r1, #0x17
cmp r0, r1
bhi _080142FC
adds r0, r5, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
lsls r1, r0, #4
subs r1, r1, r0
lsls r1, r1, #4
ldr r4, _080142F4 @ =0x00004E20
adds r0, r1, #0
adds r1, r4, #0
bl __divsi3
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ldr r1, _080142F8 @ =0xFFFF0000
ands r6, r1
orrs r6, r0
adds r0, r5, #0
bl Sin
adds r1, r0, #0
lsls r1, r1, #0x10
asrs r1, r1, #0x10
lsls r0, r1, #4
subs r0, r0, r1
lsls r0, r0, #4
rsbs r0, r0, #0
b _0801438E
.align 2, 0
_080142F0: .4byte 0xFFFFF000
_080142F4: .4byte 0x00004E20
_080142F8: .4byte 0xFFFF0000
_080142FC:
adds r0, r5, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
lsls r1, r0, #4
subs r1, r1, r0
lsls r1, r1, #3
ldr r4, _08014338 @ =0x00004E20
adds r0, r1, #0
adds r1, r4, #0
bl __divsi3
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ldr r1, _0801433C @ =0xFFFF0000
ands r6, r1
orrs r6, r0
adds r0, r5, #0
bl Sin
adds r1, r0, #0
lsls r1, r1, #0x10
asrs r1, r1, #0x10
lsls r0, r1, #4
subs r0, r0, r1
lsls r0, r0, #3
rsbs r0, r0, #0
b _0801438E
.align 2, 0
_08014338: .4byte 0x00004E20
_0801433C: .4byte 0xFFFF0000
_08014340:
adds r0, r7, #0
bl Cos
ldr r5, _080143D4 @ =gUnknown_086ACDF4
mov r2, sl
ldr r1, [r2]
adds r1, #0x23
ldrb r1, [r1]
lsls r1, r1, #1
adds r1, r1, r5
movs r2, #0
ldrsh r1, [r1, r2]
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r1, r0
ldr r4, _080143D8 @ =0x00004E20
adds r1, r4, #0
bl __divsi3
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ldr r1, _080143DC @ =0xFFFF0000
ands r6, r1
orrs r6, r0
adds r0, r7, #0
bl Sin
mov r2, sl
ldr r1, [r2]
adds r1, #0x23
ldrb r1, [r1]
lsls r1, r1, #1
adds r1, r1, r5
movs r2, #0
ldrsh r1, [r1, r2]
rsbs r1, r1, #0
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r1, r0
_0801438E:
adds r1, r4, #0
bl __divsi3
lsls r0, r0, #0x10
ldr r1, _080143E0 @ =0x0000FFFF
ands r6, r1
orrs r6, r0
_0801439C:
lsls r0, r6, #0x10
asrs r0, r0, #0x10
mov r2, r8
ldr r1, [r2]
adds r4, r1, r0
str r4, [r2]
asrs r1, r6, #0x10
ldr r0, [r2, #4]
adds r0, r0, r1
str r0, [r2, #4]
ldr r1, _080143E4 @ =gCurrentPinballGame
ldr r0, [r1]
ldr r2, _080143E8 @ =0x000005A4
adds r3, r0, r2
ldrb r2, [r3]
adds r5, r1, #0
cmp r2, #0
beq _0801446C
lsls r0, r4, #0x10
lsrs r1, r0, #0x10
movs r4, #1
cmp r2, #1
bne _080143EC
movs r0, #0
strb r0, [r3]
movs r0, #0x80
mov sb, r0
b _080143F2
.align 2, 0
_080143D4: .4byte gUnknown_086ACDF4
_080143D8: .4byte 0x00004E20
_080143DC: .4byte 0xFFFF0000
_080143E0: .4byte 0x0000FFFF
_080143E4: .4byte gCurrentPinballGame
_080143E8: .4byte 0x000005A4
_080143EC:
movs r2, #0xa0
lsls r2, r2, #2
mov sb, r2
_080143F2:
lsls r0, r1, #0x10
asrs r0, r0, #0x10
cmp r0, #0
bge _08014402
rsbs r0, r0, #0
lsls r0, r0, #0x10
lsrs r1, r0, #0x10
ldr r4, _0801447C @ =0x0000FFFF
_08014402:
lsls r0, r1, #0x10
asrs r0, r0, #0x10
cmp r0, #0xff
bgt _08014412
lsls r0, r4, #0x10
asrs r0, r0, #8
mov r1, r8
str r0, [r1]
_08014412:
ldr r0, [r5]
ldr r2, _08014480 @ =0x0000132C
adds r0, r0, r2
ldr r1, [r0]
movs r0, #0
strh r0, [r1, #6]
mov r1, r8
movs r2, #0
ldrsh r0, [r1, r2]
ldr r1, [r1, #4]
rsbs r1, r1, #0
lsls r1, r1, #0x10
asrs r1, r1, #0x10
bl ArcTan2
adds r4, r0, #0
lsls r4, r4, #0x10
lsrs r4, r4, #0x10
adds r0, r4, #0
bl Cos
lsls r0, r0, #0x10
asrs r0, r0, #0x10
mov r1, sb
muls r1, r0, r1
adds r0, r1, #0
ldr r5, _08014484 @ =0x00004E20
adds r1, r5, #0
bl __divsi3
mov r2, r8
str r0, [r2]
adds r0, r4, #0
bl Sin
mov r2, sb
rsbs r1, r2, #0
lsls r0, r0, #0x10
asrs r0, r0, #0x10
muls r0, r1, r0
adds r1, r5, #0
bl __divsi3
mov r1, r8
str r0, [r1, #4]
_0801446C:
pop {r3, r4, r5}
mov r8, r3
mov sb, r4
mov sl, r5
pop {r4, r5, r6, r7}
pop {r0}
bx r0
.align 2, 0
_0801447C: .4byte 0x0000FFFF
_08014480: .4byte 0x0000132C
_08014484: .4byte 0x00004E20
.section .text14488
thumb_func_start sub_14488
sub_14488: @ 0x08014488

View File

@ -0,0 +1,8 @@
#ifndef GUARD_CONSTANTS_ANGLE_MATH_H
#define GUARD_CONSTANTS_ANGLE_MATH_H
#define ANGLE_90 0x4000
#define ANGLE_180 0x8000
#define ANGLE_360 0x10000
#endif //GUARD_CONSTANTS_ANGLE_MATH_H

View File

@ -377,7 +377,7 @@ extern void sub_1333C();
extern u16 sub_13824(struct Vector16*);
extern void sub_13B28(struct Vector16*, struct Vector16*, s16);
extern void sub_13D24(u16, struct Vector16*, struct Vector16*);
//extern ? sub_14074();
extern void sub_14074(u16, struct Vector32*, u16);
extern u16 sub_14488(struct Vector16*, struct Vector16);
//extern ? sub_1467C();
//extern ? sub_14740();

View File

@ -431,7 +431,7 @@ struct PinballGame
/*0x714*/ s8 unk714;
/*0x715*/ u8 filler715[0x1];
/*0x716*/ s8 unk716;
/*0x717*/ u8 filler717[0x1];
/*0x717*/ u8 unk717;
/*0x718*/ s8 leftBallPowerUpLight;
/*0x719*/ s8 centerBallPowerUpLight;
/*0x71A*/ s8 rightBallPowerUpLight;
@ -551,5 +551,6 @@ extern s32 gUnknown_081B36A4[64];
extern s32 gUnknown_082EE0E0[0x3E0];
extern const u16 gUnknown_08391A4C[0x1000];
extern const u16 gUnknown_08393A4C[0x1000];
extern const s16 gUnknown_086ACDF4[9];
#endif // GUARD_GLOBAL_H

View File

@ -46,6 +46,8 @@ SECTIONS
src/rom_11B9C.o(.text);
src/rom_1332C.o(.text);
asm/rom_11B9C.o(.text1333C);
src/rom_13D24.o(.text);
asm/rom_11B9C.o(.text14488);
src/rom_17634.o(.text);
asm/rom_11B9C.o(.text176B0);
src/rom_18784.o(.text);

272
src/rom_13D24.c Normal file
View File

@ -0,0 +1,272 @@
#include "global.h"
#include "main.h"
#include "constants/bg_music.h"
#include "m4a.h"
#include "constants/anglemath.h"
void sub_13D24(u16 arg0, struct Vector16 *arg1, struct Vector16 *arg2)
{
u16 angleOfFlippedArg1;
s32 angleDelta, adjustedAngle;
s16 angleSign;
u16 halfMag;
s32 halfMag2;
s32 forwardMag, lateralMag, scaledForwardMag, scaledLateralMag;
u32 vxSquared, vySquared;
s32 curveDir, curveSign, curveDirScaledFactor, curveScaleFactor;
u16 finalAngle;
struct Vector32 tempVec;
struct Vector16 tempVec2;
angleOfFlippedArg1 = ArcTan2(-arg1->x, arg1->y);
vxSquared = (arg1->x * arg1->x) + (arg1->y * arg1->y);
halfMag = Sqrt(vxSquared * 4) /2;
// Determine smallest angle difference and its direction
if (angleOfFlippedArg1 > arg0)
{
angleDelta = angleOfFlippedArg1 - arg0;
angleSign = -1;
}
else
{
angleDelta = arg0 - angleOfFlippedArg1;
angleSign = 1;
}
//Note on angle representation:
//0x4000 = 90 degrees
//0x8000 = 180 degrees
//0x10000 = 360 degrees
//Clamps to the closest 180, with direction
if (angleDelta > ANGLE_180)
{
angleDelta = ANGLE_360 - angleDelta;
angleSign = -angleSign;
}
//Adds a 90 degree offset based on the delta factor
adjustedAngle = arg0 + angleSign * ANGLE_90;
// Apply signed adjustedAngle to stay in 0..0xFFFF
if (adjustedAngle < 0)
adjustedAngle = ANGLE_360 + adjustedAngle;
// Project a curved arg2 delta based on half the magnitude
// Note: the trigonometric functions return s16, typically scaled by 0x1000 or more
lateralMag = halfMag * Sin(angleDelta) / 20000;
forwardMag = halfMag * Cos(angleDelta) / 20000;
// 'wall' sound if collision angle is high enough
if (Cos(angleDelta) > 0x1F3F)
{
if (forwardMag > 0x46)
m4aSongNumStart(SE_UNKNOWN_0x77);
if (forwardMag > 0x118
&& gCurrentPinballGame->unk61C == 0
&& gMain.selectedField < MAIN_FIELD_COUNT)
{
sub_11B0(6);
}
}
if (gCurrentPinballGame->ballSpeed != 0)
scaledForwardMag = forwardMag * 21;
else
scaledForwardMag = forwardMag * 26;
forwardMag = scaledForwardMag / 100;
scaledLateralMag = (lateralMag * 8) / 10;
curveScaleFactor = gCurrentPinballGame->ball->unk6 * 0xEB8 / 0x2BC00;
curveDir = -angleSign;
curveDirScaledFactor = (curveDir * 25) * 1024;
gCurrentPinballGame->ball->unk6 =
curveDirScaledFactor * scaledLateralMag / 0xEB8
+ gCurrentPinballGame->ball->unk4;
tempVec.x = forwardMag * Cos(arg0);
tempVec.y = -forwardMag * Sin(arg0);
tempVec.x = lateralMag * Cos(adjustedAngle) + tempVec.x;
tempVec.y = -lateralMag * Sin(adjustedAngle) + tempVec.y;
tempVec.x = tempVec.x / 20000;
tempVec.y = tempVec.y / 20000;
// With how the curveSign/curveScaleFactor are only used 'multiplied together'
// with the tempVec calculation, the negations cancel out. - Shouldn't be needed.
// Speculation is that this might have been a defensive code measure against
// sign misbehavior, written by someone familar with assembly patterns.
curveSign = 1;
if (curveScaleFactor < 0)
{
curveSign = curveSign -2;
curveScaleFactor = -curveScaleFactor;
}
curveSign = curveDir * curveSign;
tempVec2.x = curveSign * curveScaleFactor * Cos(adjustedAngle) / 20000;
tempVec2.y = -curveSign * curveScaleFactor * Sin(adjustedAngle) / 20000;
vxSquared = tempVec.x * tempVec.x;
vySquared = tempVec.y * tempVec.y;
//Yes, the name is weird here. -- var reuse was needed for register match
halfMag2 = vxSquared + vySquared;
halfMag2 = Sqrt(halfMag2 * 4) /2;
tempVec.x = tempVec2.x + tempVec.x;
tempVec.y = tempVec2.y + tempVec.y;
finalAngle = ArcTan2( tempVec.x, -tempVec.y);
if (gMain.selectedField == FIELD_SAPPHIRE
&& gCurrentPinballGame->unk24 > 0
&& gCurrentPinballGame->ball->positionQ0.y < 0xD2)
{
tempVec.x = halfMag * Cos(finalAngle) / 20000;
tempVec.y = -halfMag * Sin(finalAngle) / 20000;
}
else
{
tempVec.x = halfMag2 * Cos(finalAngle) / 20000;
tempVec.y = -halfMag2 * Sin(finalAngle) / 20000;
}
sub_14074(arg0, &tempVec, angleOfFlippedArg1);
arg2->x = tempVec.x;
arg2->y = tempVec.y;
}
void sub_14074(u16 arg0, struct Vector32 *arg1, u16 arg2)
{
const u16 VECTORSCALEDOWN = 0x4E20;
s32 vMagSquared;
s16 x, y;
s16 var0;
struct Vector16 tempVec;
x = gCurrentPinballGame->ball->velocity.x;
y = gCurrentPinballGame->ball->velocity.y;
vMagSquared = (x * x) + (y * y);
if (gCurrentPinballGame->unk23 == 2)
{
if (gCurrentPinballGame->ball->positionQ1.x > 0xE0)
{
s32 value = -0x2A1C;
var0 = value + arg2;
arg0 = 0x6a1c;
}
else
{
s32 value = 0x55e4;
var0 = value - arg2;
arg0 = 0x15e4;
}
if (var0 >= 0 && var0 <= 0x1200 && vMagSquared < 0x4000)
{
tempVec.x = 0;
tempVec.y = 0;
}
else
{
arg1->x = arg1->x / 5;
arg1->y = arg1->y / 5;
gCurrentPinballGame->ball->unk6 = (gCurrentPinballGame->ball->unk6 * 4) / 10;
if ( gCurrentPinballGame->ballSpeed > 0)
{
tempVec.x = 230 * Cos(arg0) / VECTORSCALEDOWN;
tempVec.y = -230 * Sin(arg0) / VECTORSCALEDOWN;
}
else
{
tempVec.x = 285 * Cos(arg0) / VECTORSCALEDOWN;
tempVec.y = -285 * Sin(arg0) / VECTORSCALEDOWN;
}
gCurrentPinballGame->unk716 = 4;
if (gCurrentPinballGame->ball->positionQ0.x < 120)
gCurrentPinballGame->unk717 = 0;
else
gCurrentPinballGame->unk717 = 1;
}
}
else
{
if (gCurrentPinballGame->unk23 == 1)
{
arg1->x = arg1->x / 5;
arg1->y = arg1->y / 5;
if (arg0 > 0xA000 && arg0 < 0xE000)
{
tempVec.x = 60 * Cos(arg0) / VECTORSCALEDOWN;
tempVec.y = -60 * Sin(arg0) / VECTORSCALEDOWN;
}
else if (arg0 >= 0x1000 && arg0 <= 0x7000)
{
tempVec.x = 240 * Cos(arg0) / VECTORSCALEDOWN;
tempVec.y = -240 * Sin(arg0) / VECTORSCALEDOWN;
}
else
{
tempVec.x = 120 * Cos(arg0) / VECTORSCALEDOWN;
tempVec.y = -120 * Sin(arg0) / VECTORSCALEDOWN;
}
}
else
{
tempVec.x = gUnknown_086ACDF4[gCurrentPinballGame->unk23] * Cos(arg0) / VECTORSCALEDOWN;
tempVec.y = -gUnknown_086ACDF4[gCurrentPinballGame->unk23] * Sin(arg0) / VECTORSCALEDOWN;
}
}
arg1->x = arg1->x + tempVec.x;
arg1->y = arg1->y + tempVec.y;
if (gCurrentPinballGame->unk5A4 != 0)
{
s16 x2 = arg1->x;
s16 xSign = 1;
u16 angle;
if (gCurrentPinballGame->unk5A4 == 1)
{
gCurrentPinballGame->unk5A4 = 0;
vMagSquared = 0x80;
}
else
{
vMagSquared = 0x280;
}
if (x2 < 0)
{
x2 = -x2;
xSign = -1;
}
if (x2 < 0x100)
arg1->x = xSign * 256;
gCurrentPinballGame->ball->unk6 = 0;
angle = ArcTan2(arg1->x, -arg1->y);
arg1->x = vMagSquared * Cos(angle) / VECTORSCALEDOWN;
arg1->y = -vMagSquared * Sin(angle) / VECTORSCALEDOWN;
}
}