sub_804C9D0

This commit is contained in:
DizzyEggg 2024-11-07 22:00:18 +01:00
parent 5701369a9a
commit 2510f03439
2 changed files with 310 additions and 959 deletions

View File

@ -6,855 +6,6 @@
.text
thumb_func_start sub_804C53C
sub_804C53C:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
ldr r4, _0804C6F8
add sp, r4
mov r10, r2
adds r7, r0, 0
adds r6, r1, 0
ldr r0, _0804C6FC
add r0, sp
ldr r1, _0804C700
add r1, sp
adds r2, r7, 0
adds r3, r6, 0
bl sub_804D024
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
bl sub_804D084
movs r2, 0
cmp r2, r7
bge _0804C594
_0804C570:
adds r3, r2, 0x1
cmp r6, 0
ble _0804C58E
lsls r0, r2, 4
subs r0, r2
movs r2, 0x1
lsls r0, 5
add r0, sp
adds r0, 0x8
adds r1, r6, 0
_0804C584:
strb r2, [r0, 0xA]
adds r0, 0x20
subs r1, 0x1
cmp r1, 0
bne _0804C584
_0804C58E:
adds r2, r3, 0
cmp r2, r7
blt _0804C570
_0804C594:
movs r2, 0x1
subs r0, r7, 0x1
mov r8, r0
subs r1, r6, 0x1
mov r9, r1
mov r0, r10
ldrb r0, [r0, 0xD]
mov r12, r0
cmp r2, r8
bge _0804C5D2
mov r4, r9
mov r5, r8
_0804C5AC:
adds r3, r2, 0x1
cmp r4, 0x1
ble _0804C5CC
lsls r0, r2, 4
subs r0, r2
movs r2, 0x1
lsls r0, 5
add r0, sp
adds r0, 0x8
adds r0, 0x20
subs r1, r4, 0x1
_0804C5C2:
strb r2, [r0, 0x8]
adds r0, 0x20
subs r1, 0x1
cmp r1, 0
bne _0804C5C2
_0804C5CC:
adds r2, r3, 0
cmp r2, r5
blt _0804C5AC
_0804C5D2:
ldr r3, _0804C6FC
add r3, sp
ldr r0, _0804C700
add r0, sp
str r0, [sp]
mov r1, r12
str r1, [sp, 0x4]
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
bl sub_804D2D0
movs r2, 0
cmp r2, r8
bge _0804C636
movs r4, 0x1
mov r0, r9
lsls r5, r0, 5
subs r1, r7, 0x2
mov r12, r1
_0804C5FA:
cmp r2, 0
beq _0804C614
lsls r0, r2, 4
subs r0, r2
lsls r0, 5
mov r1, sp
adds r1, r0
adds r1, 0x8
strb r4, [r1, 0x16]
adds r0, r5, r0
add r0, sp
adds r0, 0x8
strb r4, [r0, 0x16]
_0804C614:
adds r3, r2, 0x1
cmp r2, r12
bge _0804C630
lsls r0, r3, 4
subs r0, r3
lsls r0, 5
mov r1, sp
adds r1, r0
adds r1, 0x8
strb r4, [r1, 0x15]
adds r0, r5, r0
add r0, sp
adds r0, 0x8
strb r4, [r0, 0x15]
_0804C630:
adds r2, r3, 0
cmp r2, r8
blt _0804C5FA
_0804C636:
movs r1, 0
cmp r1, r9
bge _0804C66A
movs r3, 0x1
mov r2, r8
lsls r0, r2, 4
subs r0, r2
lsls r0, 5
add r0, sp
adds r0, 0x8
add r2, sp, 0x8
subs r5, r6, 0x2
mov r4, r9
_0804C650:
cmp r1, 0
beq _0804C658
strb r3, [r2, 0x13]
strb r3, [r0, 0x13]
_0804C658:
cmp r1, r5
bge _0804C660
strb r3, [r2, 0x14]
strb r3, [r0, 0x14]
_0804C660:
adds r0, 0x20
adds r2, 0x20
adds r1, 0x1
cmp r1, r4
blt _0804C650
_0804C66A:
ldr r5, _0804C6FC
add r5, sp
ldr r4, _0804C700
add r4, sp
str r4, [sp]
movs r0, 0
str r0, [sp, 0x4]
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
adds r3, r5, 0
bl sub_804D8C8
str r4, [sp]
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
adds r3, r5, 0
bl sub_804E590
mov r0, r10
ldrb r3, [r0, 0x9]
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
bl sub_804F0D0
ldr r0, _0804C704
movs r1, 0
ldrsh r3, [r0, r1]
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
bl sub_804EBC8
ldr r0, _0804C708
movs r2, 0
ldrsh r3, [r0, r2]
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
bl sub_804EEE4
mov r0, r10
ldrb r3, [r0, 0x13]
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
bl sub_804CBEC
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
bl sub_804E03C
add r0, sp, 0x8
adds r1, r7, 0
adds r2, r6, 0
bl sub_804D534
movs r3, 0xE5
lsls r3, 5
add sp, r3
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0804C6F8: .4byte 0xffffe360
_0804C6FC: .4byte 0x00001c28
_0804C700: .4byte 0x00001c64
_0804C704: .4byte gUnknown_202F1B0
_0804C708: .4byte gUnknown_202F1B2
thumb_func_end sub_804C53C
thumb_func_start sub_804C70C
sub_804C70C:
push {r4-r7,lr}
mov r7, r8
push {r7}
sub sp, 0x8
adds r7, r0, 0
mov r8, r1
ldr r0, _0804C73C
ldr r0, [r0]
ldr r1, _0804C740
adds r0, r1
ldr r0, [r0]
ldr r1, [r0, 0x4]
lsls r0, r7, 2
adds r0, r1
ldr r0, [r0]
ldrb r5, [r0]
ldrb r6, [r0, 0x1]
cmp r5, 0
beq _0804C736
cmp r6, 0
bne _0804C744
_0804C736:
bl sub_804C918
b _0804C782
.align 2, 0
_0804C73C: .4byte gDungeon
_0804C740: .4byte 0x00013568
_0804C744:
cmp r7, 0x31
bgt _0804C752
adds r0, r7, 0
bl sub_8051288
movs r0, 0x1
b _0804C784
_0804C752:
adds r1, r5, 0x4
movs r0, 0x38
bl __divsi3
adds r4, r0, 0
cmp r4, 0x1
bgt _0804C762
movs r4, 0x1
_0804C762:
adds r1, r6, 0x4
movs r0, 0x20
bl __divsi3
adds r1, r0, 0
cmp r1, 0x1
bgt _0804C772
movs r1, 0x1
_0804C772:
str r7, [sp]
mov r0, r8
str r0, [sp, 0x4]
adds r0, r4, 0
adds r2, r5, 0
adds r3, r6, 0
bl sub_804C790
_0804C782:
movs r0, 0
_0804C784:
add sp, 0x8
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_804C70C
thumb_func_start sub_804C790
sub_804C790:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
ldr r4, _0804C81C
add sp, r4
adds r5, r0, 0
adds r4, r1, 0
ldr r0, _0804C820
add r0, sp
str r2, [r0]
ldr r1, _0804C824
add r1, sp
str r3, [r1]
movs r2, 0
mov r10, r2
mov r8, r2
ldr r0, _0804C828
add r0, sp
ldr r1, _0804C82C
add r1, sp
adds r2, r5, 0
adds r3, r4, 0
bl sub_804D024
add r0, sp, 0x10
adds r1, r5, 0
adds r2, r4, 0
bl sub_804D084
ldr r0, _0804C830
add r0, sp
ldr r0, [r0]
movs r3, 0x1
ldrsb r3, [r0, r3]
add r0, sp, 0x10
adds r1, r5, 0
adds r2, r4, 0
bl sub_804D154
mov r6, r8
cmp r8, r5
bge _0804C818
_0804C7E8:
movs r1, 0
mov r8, r1
adds r2, r6, 0x1
cmp r8, r4
bge _0804C812
lsls r0, r6, 4
subs r0, r6
movs r1, 0x1
lsls r0, 5
add r0, sp
adds r0, 0x10
mov r8, r4
_0804C800:
strb r1, [r0, 0x1B]
adds r0, 0x20
movs r3, 0x1
negs r3, r3
add r8, r3
mov r3, r8
cmp r3, 0
bne _0804C800
mov r8, r4
_0804C812:
adds r6, r2, 0
cmp r6, r5
blt _0804C7E8
_0804C818:
movs r7, 0
b _0804C836
.align 2, 0
_0804C81C: .4byte 0xffffe350
_0804C820: .4byte 0x00001ca8
_0804C824: .4byte 0x00001cac
_0804C828: .4byte 0x00001c30
_0804C82C: .4byte 0x00001c6c
_0804C830: .4byte 0x00001cd4
_0804C834:
adds r7, 0x1
_0804C836:
cmp r7, 0x3F
bgt _0804C864
adds r0, r5, 0
bl DungeonRandInt
adds r6, r0, 0
adds r0, r4, 0
bl DungeonRandInt
mov r8, r0
mov r0, r8
muls r0, r5
adds r0, r6
mov r10, r0
lsls r0, r6, 4
subs r0, r6
add r0, r8
lsls r0, 5
add r0, sp
adds r0, 0x10
ldrb r0, [r0, 0xA]
cmp r0, 0
beq _0804C834
_0804C864:
ldr r0, _0804C8FC
add r0, sp
mov r9, r0
ldr r7, _0804C900
add r7, sp
str r7, [sp]
mov r1, r10
str r1, [sp, 0x4]
ldr r2, _0804C904
add r2, sp
ldr r2, [r2]
str r2, [sp, 0x8]
ldr r3, _0804C908
add r3, sp
ldr r3, [r3]
str r3, [sp, 0xC]
add r0, sp, 0x10
adds r1, r5, 0
adds r2, r4, 0
mov r3, r9
bl sub_8050F90
cmp r5, 0x1
bne _0804C898
cmp r4, 0x1
beq _0804C8D0
_0804C898:
mov r0, r8
str r0, [sp]
ldr r1, _0804C90C
add r1, sp
ldr r1, [r1]
str r1, [sp, 0x4]
add r0, sp, 0x10
adds r1, r5, 0
adds r2, r4, 0
adds r3, r6, 0
bl sub_804D5F0
str r7, [sp]
movs r0, 0x1
str r0, [sp, 0x4]
add r0, sp, 0x10
adds r1, r5, 0
adds r2, r4, 0
mov r3, r9
bl sub_804D8C8
str r7, [sp]
add r0, sp, 0x10
adds r1, r5, 0
adds r2, r4, 0
mov r3, r9
bl sub_804E590
_0804C8D0:
lsls r0, r6, 4
subs r0, r6
lsls r0, 5
add r0, sp
adds r0, 0x10
mov r2, r8
lsls r1, r2, 5
adds r0, r1
ldr r3, _0804C910
add r3, sp
ldr r1, [r3]
bl sub_8051438
ldr r3, _0804C914
add sp, r3
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0804C8FC: .4byte 0x00001c30
_0804C900: .4byte 0x00001c6c
_0804C904: .4byte 0x00001ca8
_0804C908: .4byte 0x00001cac
_0804C90C: .4byte 0x00001cd4
_0804C910: .4byte 0x00001cd0
_0804C914: .4byte 0x00001cb0
thumb_func_end sub_804C790
thumb_func_start sub_804C918
sub_804C918:
push {r4-r7,lr}
mov r7, r9
mov r6, r8
push {r6,r7}
ldr r4, _0804C9C4
add sp, r4
mov r0, sp
movs r1, 0x1
movs r2, 0x1
bl sub_804D084
mov r0, sp
movs r3, 0
movs r2, 0x2
strh r2, [r0]
mov r1, sp
movs r0, 0x36
strh r0, [r1, 0x4]
mov r0, sp
strh r2, [r0, 0x2]
movs r0, 0x1E
strh r0, [r1, 0x6]
mov r0, sp
movs r1, 0x1
strb r1, [r0, 0xA]
strb r1, [r0, 0xB]
strb r3, [r0, 0x8]
movs r1, 0
ldrsh r5, [r0, r1]
movs r2, 0x4
ldrsh r0, [r0, r2]
cmp r5, r0
bge _0804C9A6
mov r6, sp
_0804C95C:
movs r0, 0x2
ldrsh r4, [r6, r0]
movs r1, 0x6
ldrsh r0, [r6, r1]
adds r7, r5, 0x1
cmp r4, r0
bge _0804C99C
movs r2, 0
mov r9, r2
ldr r0, _0804C9C8
mov r8, r0
_0804C972:
adds r0, r5, 0
adds r1, r4, 0
bl GetTileSafe
ldrh r1, [r0]
mov r2, r8
ands r1, r2
movs r2, 0x1
orrs r1, r2
strh r1, [r0]
adds r0, r5, 0
adds r1, r4, 0
bl GetTileSafe
mov r1, r9
strb r1, [r0, 0x9]
adds r4, 0x1
movs r2, 0x6
ldrsh r0, [r6, r2]
cmp r4, r0
blt _0804C972
_0804C99C:
adds r5, r7, 0
movs r1, 0x4
ldrsh r0, [r6, r1]
cmp r5, r0
blt _0804C95C
_0804C9A6:
ldr r3, _0804C9CC
mov r0, sp
movs r1, 0x1
movs r2, 0x1
bl sub_804EEE4
movs r3, 0xE1
lsls r3, 5
add sp, r3
pop {r3,r4}
mov r8, r3
mov r9, r4
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0804C9C4: .4byte 0xffffe3e0
_0804C9C8: .4byte 0x0000fffc
_0804C9CC: .4byte 0x000003e7
thumb_func_end sub_804C918
thumb_func_start sub_804C9D0
sub_804C9D0:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
ldr r4, _0804CBB4
add sp, r4
movs r0, 0
movs r1, 0xE5
lsls r1, 5
add r1, sp
str r0, [r1]
ldr r1, _0804CBB8
add r1, sp
movs r2, 0x2
str r2, [r1]
movs r0, 0x1C
str r0, [r1, 0x4]
movs r0, 0x36
str r0, [r1, 0x8]
ldr r1, _0804CBBC
add r1, sp
str r2, [r1]
movs r0, 0x1E
str r0, [r1, 0x4]
add r0, sp, 0x8
movs r1, 0x2
movs r2, 0x1
bl sub_804D084
movs r0, 0
ldr r2, _0804CBB8
add r2, sp
ldr r3, _0804CBC0
add r3, sp
str r2, [r3]
ldr r4, _0804CBBC
add r4, sp
ldr r1, _0804CBC4
add r1, sp
str r4, [r1]
_0804CA22:
movs r7, 0
lsls r2, r0, 2
ldr r3, _0804CBC8
add r3, sp
str r2, [r3]
adds r4, r0, 0x1
ldr r1, _0804CBCC
add r1, sp
str r4, [r1]
lsls r0, 5
ldr r2, _0804CBD0
add r2, sp
str r0, [r2]
_0804CA3C:
lsls r0, r7, 2
ldr r3, _0804CBC0
add r3, sp
ldr r3, [r3]
adds r0, r3, r0
ldr r1, [r0]
adds r4, r1, 0x1
mov r10, r4
ldr r2, _0804CBC4
add r2, sp
ldr r2, [r2]
ldr r3, _0804CBC8
add r3, sp
ldr r3, [r3]
adds r0, r2, r3
ldr r2, [r0]
adds r4, r2, 0x1
ldr r0, _0804CBD4
add r0, sp
str r4, [r0]
adds r3, r7, 0x1
mov r9, r3
lsls r0, r3, 2
ldr r4, _0804CBC0
add r4, sp
ldr r4, [r4]
adds r0, r4, r0
ldr r4, [r0]
subs r4, r1
subs r4, 0x3
ldr r1, _0804CBCC
add r1, sp
ldr r1, [r1]
lsls r0, r1, 2
ldr r3, _0804CBC4
add r3, sp
ldr r3, [r3]
adds r0, r3, r0
ldr r5, [r0]
subs r5, r2
subs r5, 0x3
movs r0, 0xA
adds r1, r4, 0
bl DungeonRandRange
mov r8, r0
movs r0, 0x10
adds r1, r5, 0
bl DungeonRandRange
adds r6, r0, 0
mov r0, r8
subs r4, r0
adds r0, r4, 0
bl DungeonRandInt
adds r4, r0, 0
add r4, r10
subs r5, r6
adds r0, r5, 0
bl DungeonRandInt
ldr r2, _0804CBD4
add r2, sp
ldr r1, [r2]
adds r1, r0
mov r10, r1
mov r0, r8
adds r3, r4, r0
add r6, r10
lsls r0, r7, 4
subs r0, r7
lsls r0, 5
ldr r1, _0804CBD0
add r1, sp
ldr r1, [r1]
adds r0, r1, r0
add r0, sp
adds r0, 0x8
movs r1, 0x1
strb r1, [r0, 0xA]
strh r4, [r0]
strh r3, [r0, 0x4]
mov r2, r10
strh r2, [r0, 0x2]
strh r6, [r0, 0x6]
mov r0, r9
ldr r1, _0804CBD8
add r1, sp
str r0, [r1]
movs r0, 0xE5
lsls r0, 5
add r0, sp
ldr r2, [r0]
adds r2, 0x1
mov r9, r2
cmp r4, r3
bge _0804CB4E
_0804CB00:
mov r5, r10
adds r7, r4, 0x1
cmp r5, r6
bge _0804CB48
ldr r1, _0804CBDC
mov r8, r1
_0804CB0C:
adds r0, r4, 0
adds r1, r5, 0
movs r2, 0xE6
lsls r2, 5
add r2, sp
str r3, [r2]
bl GetTileSafe
ldrh r1, [r0]
mov r2, r8
ands r1, r2
movs r2, 0x1
orrs r1, r2
strh r1, [r0]
adds r0, r4, 0
adds r1, r5, 0
bl GetTileSafe
movs r1, 0xE5
lsls r1, 5
add r1, sp
ldrb r1, [r1]
strb r1, [r0, 0x9]
adds r5, 0x1
movs r2, 0xE6
lsls r2, 5
add r2, sp
ldr r3, [r2]
cmp r5, r6
blt _0804CB0C
_0804CB48:
adds r4, r7, 0
cmp r4, r3
blt _0804CB00
_0804CB4E:
mov r3, r9
movs r4, 0xE5
lsls r4, 5
add r4, sp
str r3, [r4]
ldr r0, _0804CBD8
add r0, sp
ldr r7, [r0]
cmp r7, 0x1
bgt _0804CB64
b _0804CA3C
_0804CB64:
ldr r1, _0804CBCC
add r1, sp
ldr r0, [r1]
cmp r0, 0
bgt _0804CB70
b _0804CA22
_0804CB70:
add r0, sp, 0x8
movs r2, 0
movs r1, 0x1
strb r1, [r0, 0x16]
ldr r0, _0804CBE0
add r0, sp
strb r1, [r0]
ldr r3, _0804CBB8
add r3, sp
ldr r0, _0804CBBC
add r0, sp
str r0, [sp]
str r2, [sp, 0x4]
add r0, sp, 0x8
movs r1, 0x2
movs r2, 0x1
bl sub_804D8C8
ldr r3, _0804CBE4
add r0, sp, 0x8
movs r1, 0x2
movs r2, 0x1
bl sub_804EEE4
ldr r3, _0804CBE8
add sp, r3
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0804CBB4: .4byte 0xffffe33c
_0804CBB8: .4byte 0x00001c28
_0804CBBC: .4byte 0x00001c64
_0804CBC0: .4byte 0x00001ca4
_0804CBC4: .4byte 0x00001cac
_0804CBC8: .4byte 0x00001cb0
_0804CBCC: .4byte 0x00001cbc
_0804CBD0: .4byte 0x00001cb4
_0804CBD4: .4byte 0x00001ca8
_0804CBD8: .4byte 0x00001cb8
_0804CBDC: .4byte 0x0000fffc
_0804CBE0: .4byte 0x000001fd
_0804CBE4: .4byte 0x000003e7
_0804CBE8: .4byte 0x00001cc4
thumb_func_end sub_804C9D0
thumb_func_start sub_804CBEC
sub_804CBEC:
push {r4-r7,lr}

View File

@ -59,6 +59,12 @@ void sub_80506F0(s32 a0, UnkDungeonGlobal_unk1C574 *a1);
void sub_804FF08(UnkDungeonGlobal_unk1C574 *a0, bool8 a1);
void sub_8050438(UnkDungeonGlobal_unk1C574 *a0, bool8 a1);
struct FileFixedmapPosStruct
{
u8 x;
u8 y;
};
// Some weird-ass regswap prevents the function from being matched - https://decomp.me/scratch/9SUV3
#ifdef NONMATCHING
void sub_804AFAC(void)
@ -969,12 +975,7 @@ void sub_804B534(s32 xStart, s32 yStart, s32 maxX, s32 maxY)
}
}
// Note: 15 seems to determine the array size, give it a better name and a define.
// Size 480 = 32 * 15
struct UnkHugeSpStructSubUnk0
struct GridCell
{
Position unk0;
Position unk4;
@ -1004,46 +1005,42 @@ struct UnkHugeSpStructSubUnk0
u8 unk31;
};
// Size 7200, however this struct is usually put at sp+8, so 8 needs to be added to these fields(in decimal)
struct UnkHugeSpStruct
{
struct UnkHugeSpStructSubUnk0 unk0[15][15];
};
#define GRID_CELL_LEN 15
void sub_804D024(s32 *a0, s32 *a1, s32 x, s32 y);
void sub_804D084(struct UnkHugeSpStruct *a0, s32 x, s32 y);
void sub_804E03C(struct UnkHugeSpStruct *a0, s32 x, s32 y);
void sub_804D534(struct UnkHugeSpStruct *a0, s32 x, s32 y);
void sub_804D154(struct UnkHugeSpStruct *a0, s32 x, s32 y, s32 a3);
void sub_804D2D0(struct UnkHugeSpStruct *a0, s32 x, s32 y, s32 *a3, s32 *a4, s32 a5);
void sub_804D8C8(struct UnkHugeSpStruct *a0, s32 x, s32 y, s32 *a3, s32 *a4, s32 a5);
void sub_804E590(struct UnkHugeSpStruct *a0, s32 x, s32 y, s32 *a3, s32 *a4);
void sub_804D5B0(struct UnkHugeSpStruct *a0, s32 x, s32 y, UnkDungeonGlobal_unk1C574 *unkPtr);
void sub_804F0D0(struct UnkHugeSpStruct *a0, s32 x, s32 y, s32 a3);
void sub_804EBC8(struct UnkHugeSpStruct *a0, s32 x, s32 y, s32 a3);
void sub_804EEE4(struct UnkHugeSpStruct *a0, s32 x, s32 y, s32 a3);
void sub_804CBEC(struct UnkHugeSpStruct *a0, s32 x, s32 y, s32 a3);
void sub_804C43C(s32 a0, s32 a1, s32 a2, struct UnkHugeSpStructSubUnk0 sp[15][15]);
void sub_804D084(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y);
void sub_804E03C(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y);
void sub_804D534(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y);
void sub_804D154(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 a3);
void sub_804D2D0(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 *a3, s32 *a4, s32 a5);
void sub_804D8C8(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 *a3, s32 *a4, s32 a5);
void sub_804E590(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 *a3, s32 *a4);
void sub_804D5B0(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, UnkDungeonGlobal_unk1C574 *unkPtr);
void sub_804F0D0(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 a3);
void sub_804EBC8(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 a3);
void sub_804EEE4(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 a3);
void sub_804CBEC(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 a3);
void sub_804C43C(s32 a0, s32 a1, s32 a2, struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]);
void sub_804B634(s32 x, s32 y, UnkDungeonGlobal_unk1C574 *unkPtr)
{
struct UnkHugeSpStruct sp;
s32 unk7200[15];
s32 unk7260[15];
struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN];
s32 unk7200[GRID_CELL_LEN];
s32 unk7260[GRID_CELL_LEN];
sub_804D024(unk7200, unk7260, x, y);
sub_804D084(&sp, x, y);
sub_804D154(&sp, x, y, unkPtr->unk1);
sub_804D2D0(&sp, x, y, unk7200, unk7260, unkPtr->unkD);
sub_804D5B0(&sp, x, y, unkPtr);
sub_804D8C8(&sp, x, y, unk7200, unk7260, 0);
sub_804E590(&sp, x, y, unk7200, unk7260);
sub_804F0D0(&sp, x, y, unkPtr->unk9);
sub_804EBC8(&sp, x, y, gUnknown_202F1B0);
sub_804EEE4(&sp, x, y, gUnknown_202F1B2);
sub_804CBEC(&sp, x, y, unkPtr->unk13);
sub_804E03C(&sp, x, y);
sub_804D534(&sp, x, y);
sub_804D084(grid, x, y);
sub_804D154(grid, x, y, unkPtr->unk1);
sub_804D2D0(grid, x, y, unk7200, unk7260, unkPtr->unkD);
sub_804D5B0(grid, x, y, unkPtr);
sub_804D8C8(grid, x, y, unk7200, unk7260, 0);
sub_804E590(grid, x, y, unk7200, unk7260);
sub_804F0D0(grid, x, y, unkPtr->unk9);
sub_804EBC8(grid, x, y, gUnknown_202F1B0);
sub_804EEE4(grid, x, y, gUnknown_202F1B2);
sub_804CBEC(grid, x, y, unkPtr->unk13);
sub_804E03C(grid, x, y);
sub_804D534(grid, x, y);
}
// Decompile once data structure is better understood
@ -1051,7 +1048,7 @@ void sub_804B634(s32 x, s32 y, UnkDungeonGlobal_unk1C574 *unkPtr)
#ifdef NONMATCHING
void sub_804B72C(UnkDungeonGlobal_unk1C574 *unkPtr)
{
struct UnkHugeSpStruct sp;
struct GridCell grid[15][15];
sp.unk7200[0] = 0;
sp.unk7200[1] = 5;
@ -1067,7 +1064,7 @@ void sub_804B72C(UnkDungeonGlobal_unk1C574 *unkPtr)
sp.unk7260[3] = 25;
sp.unk7260[4] = 30;
sub_804D084(&sp, 6, 4);
sub_804D084(grid, 6, 4);
}
#else
NAKED void sub_804B72C(UnkDungeonGlobal_unk1C574 *unkPtr)
@ -2235,9 +2232,9 @@ NAKED void sub_804BC80(UnkDungeonGlobal_unk1C574 *a0)
void sub_804C0A8(UnkDungeonGlobal_unk1C574 *unkPtr)
{
struct UnkHugeSpStruct sp;
s32 unk7200[15];
s32 unk7260[15];
struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN];
s32 unk7200[GRID_CELL_LEN];
s32 unk7260[GRID_CELL_LEN];
s32 x, y, unk;
unk7200[0] = 0;
@ -2252,23 +2249,23 @@ void sub_804C0A8(UnkDungeonGlobal_unk1C574 *unkPtr)
unk = 1;
x = 5, y = 1;
sub_804D084(&sp, x, y);
sub_804D154(&sp, x, y, unkPtr->unk1);
sub_804D2D0(&sp, x, y, unk7200, unk7260, unkPtr->unkD);
sub_804D5B0(&sp, x, y, unkPtr);
sub_804D8C8(&sp, x, y, unk7200, unk7260, unk);
sub_804E590(&sp, x, y, unk7200, unk7260);
sub_804EBC8(&sp, x, y, gUnknown_202F1B0);
sub_804EEE4(&sp, x, y, gUnknown_202F1B2);
sub_804CBEC(&sp, x, y, unkPtr->unk13);
sub_804E03C(&sp, x, y);
sub_804D084(grid, x, y);
sub_804D154(grid, x, y, unkPtr->unk1);
sub_804D2D0(grid, x, y, unk7200, unk7260, unkPtr->unkD);
sub_804D5B0(grid, x, y, unkPtr);
sub_804D8C8(grid, x, y, unk7200, unk7260, unk);
sub_804E590(grid, x, y, unk7200, unk7260);
sub_804EBC8(grid, x, y, gUnknown_202F1B0);
sub_804EEE4(grid, x, y, gUnknown_202F1B2);
sub_804CBEC(grid, x, y, unkPtr->unk13);
sub_804E03C(grid, x, y);
}
void sub_804C190(UnkDungeonGlobal_unk1C574 *unkPtr)
{
struct UnkHugeSpStruct sp;
s32 unk7200[15];
s32 unk7260[15];
struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN];
s32 unk7200[GRID_CELL_LEN];
s32 unk7260[GRID_CELL_LEN];
s32 i, j, x, y;
unk7200[0] = 11;
@ -2282,40 +2279,40 @@ void sub_804C190(UnkDungeonGlobal_unk1C574 *unkPtr)
unk7260[3] = 30;
x = 3, y = 3;
sub_804D084(&sp, x, y);
sub_804D084(grid, x, y);
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++) {
sp.unk0[i][j].unk10 = 1;
grid[i][j].unk10 = 1;
}
}
sp.unk0[0][0].unk8 = 1;
sp.unk0[2][0].unk8 = 1;
sp.unk0[0][2].unk8 = 1;
sp.unk0[2][2].unk8 = 1;
grid[0][0].unk8 = 1;
grid[2][0].unk8 = 1;
grid[0][2].unk8 = 1;
grid[2][2].unk8 = 1;
sub_804D2D0(&sp, x, y, unk7200, unk7260, unkPtr->unkD);
sub_804D2D0(grid, x, y, unk7200, unk7260, unkPtr->unkD);
sp.unk0[0][1].unk22 = 1;
sp.unk0[1][1].unk21 = 1;
sp.unk0[1][1].unk22 = 1;
sp.unk0[2][1].unk21 = 1;
sp.unk0[1][0].unk20 = 1;
sp.unk0[1][1].unk19 = 1;
sp.unk0[1][1].unk20 = 1;
sp.unk0[1][2].unk19 = 1;
sub_804D8C8(&sp, x, y, unk7200, unk7260, 1);
sub_804E590(&sp, x, y, unk7200, unk7260);
sub_804EBC8(&sp, x, y, gUnknown_202F1B0);
sub_804EEE4(&sp, x, y, gUnknown_202F1B2);
sub_804CBEC(&sp, x, y, unkPtr->unk13);
sub_804E03C(&sp, x, y);
grid[0][1].unk22 = 1;
grid[1][1].unk21 = 1;
grid[1][1].unk22 = 1;
grid[2][1].unk21 = 1;
grid[1][0].unk20 = 1;
grid[1][1].unk19 = 1;
grid[1][1].unk20 = 1;
grid[1][2].unk19 = 1;
sub_804D8C8(grid, x, y, unk7200, unk7260, 1);
sub_804E590(grid, x, y, unk7200, unk7260);
sub_804EBC8(grid, x, y, gUnknown_202F1B0);
sub_804EEE4(grid, x, y, gUnknown_202F1B2);
sub_804CBEC(grid, x, y, unkPtr->unk13);
sub_804E03C(grid, x, y);
}
void sub_804C2F4(UnkDungeonGlobal_unk1C574 *unkPtr)
{
struct UnkHugeSpStruct sp;
s32 unk7200[15];
s32 unk7260[15];
struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN];
s32 unk7200[GRID_CELL_LEN];
s32 unk7260[GRID_CELL_LEN];
s32 i, j, x, y;
unk7200[0] = 5;
@ -2329,38 +2326,38 @@ void sub_804C2F4(UnkDungeonGlobal_unk1C574 *unkPtr)
unk7260[3] = 30;
x = 3, y = 3;
sub_804D084(&sp, x, y);
sub_804D084(grid, x, y);
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++) {
sp.unk0[i][j].unk10 = 1;
grid[i][j].unk10 = 1;
}
}
sub_804D2D0(&sp, x, y, unk7200, unk7260, unkPtr->unkD);
sub_804D2D0(grid, x, y, unk7200, unk7260, unkPtr->unkD);
for (j = 0; j < 3; j++) {
sp.unk0[0][j].unk22 = 1;
sp.unk0[1][j].unk21 = 1;
sp.unk0[1][j].unk22 = 1;
sp.unk0[2][j].unk21 = 1;
grid[0][j].unk22 = 1;
grid[1][j].unk21 = 1;
grid[1][j].unk22 = 1;
grid[2][j].unk21 = 1;
}
sub_804D8C8(&sp, x, y, unk7200, unk7260, 1);
sub_804C43C(1, 0, 1, sp.unk0);
sub_804C43C(1, 0, 2, sp.unk0);
sub_804E590(&sp, x, y, unk7200, unk7260);
sub_804EBC8(&sp, x, y, gUnknown_202F1B0);
sub_804EEE4(&sp, x, y, gUnknown_202F1B2);
sub_804CBEC(&sp, x, y, unkPtr->unk13);
sub_804E03C(&sp, x, y);
sub_804D8C8(grid, x, y, unk7200, unk7260, 1);
sub_804C43C(1, 0, 1, grid);
sub_804C43C(1, 0, 2, grid);
sub_804E590(grid, x, y, unk7200, unk7260);
sub_804EBC8(grid, x, y, gUnknown_202F1B0);
sub_804EEE4(grid, x, y, gUnknown_202F1B2);
sub_804CBEC(grid, x, y, unkPtr->unk13);
sub_804E03C(grid, x, y);
}
void sub_804C43C(s32 a0, s32 a1, s32 a2, struct UnkHugeSpStructSubUnk0 sp[15][15])
void sub_804C43C(s32 a0, s32 a1, s32 a2, struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN])
{
s32 x, y;
s32 xStart = (sp[a0][a1].unk0.x < sp[a0][a1+a2].unk0.x) ? sp[a0][a1].unk0.x : sp[a0][a1+a2].unk0.x;
s32 yStart = sp[a0][a1].unk0.y;
s32 xMax = (sp[a0][a1].unk4.x > sp[a0][a1+a2].unk4.x) ? sp[a0][a1].unk4.x : sp[a0][a1+a2].unk4.x;
s32 yMax = sp[a0][a1 + a2].unk4.y;
u8 room = GetTile(sp[a0][a1].unk0.x, sp[a0][a1].unk0.y)->room;
s32 xStart = (grid[a0][a1].unk0.x < grid[a0][a1+a2].unk0.x) ? grid[a0][a1].unk0.x : grid[a0][a1+a2].unk0.x;
s32 yStart = grid[a0][a1].unk0.y;
s32 xMax = (grid[a0][a1].unk4.x > grid[a0][a1+a2].unk4.x) ? grid[a0][a1].unk4.x : grid[a0][a1+a2].unk4.x;
s32 yMax = grid[a0][a1 + a2].unk4.y;
u8 room = GetTile(grid[a0][a1].unk0.x, grid[a0][a1].unk0.y)->room;
for (x = xStart; x < xMax; x++) {
for (y = yStart; y < yMax; y++) {
@ -2371,14 +2368,217 @@ void sub_804C43C(s32 a0, s32 a1, s32 a2, struct UnkHugeSpStructSubUnk0 sp[15][15
}
}
sp[a0][a1].unk0.x = xStart;
sp[a0][a1].unk4.x = xMax;
sp[a0][a1].unk0.y = yStart;
sp[a0][a1].unk4.y = yMax;
sp[a0][a1 + a2].unk18 = 1;
sp[a0][a1].unk18 = 1;
sp[a0][a1 + a2].unk11 = 0;
sp[a0][a1 + a2].unk17 = 1;
grid[a0][a1].unk0.x = xStart;
grid[a0][a1].unk4.x = xMax;
grid[a0][a1].unk0.y = yStart;
grid[a0][a1].unk4.y = yMax;
grid[a0][a1 + a2].unk18 = 1;
grid[a0][a1].unk18 = 1;
grid[a0][a1 + a2].unk11 = 0;
grid[a0][a1 + a2].unk17 = 1;
}
void sub_804C53C(s32 x_, s32 y_, UnkDungeonGlobal_unk1C574 *unkPtr)
{
struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN];
s32 unk7200[GRID_CELL_LEN];
s32 unk7260[GRID_CELL_LEN];
s32 i, j;
s32 x = x_;
s32 y = y_;
sub_804D024(unk7200, unk7260, x, y);
sub_804D084(grid, x, y);
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++) {
grid[i][j].unk10 = 1;
}
}
for (i = 1; i < x - 1; i++) {
for (j = 1; j < y - 1; j++) {
grid[i][j].unk8 = 1;
}
}
sub_804D2D0(grid, x, y, unk7200, unk7260, unkPtr->unkD);
for (i = 0; i < x - 1; i++) {
if (i != 0) {
grid[i][0].unk22 = 1;
grid[i][y-1].unk22 = 1;
}
if (i < x - 2) {
grid[i+1][0].unk21 = 1;
grid[i+1][y-1].unk21 = 1;
}
}
for (j = 0; j < y - 1; j++) {
if (j != 0) {
grid[0][j].unk19 = 1;
grid[x-1][j].unk19 = 1;
}
if (j < y - 2) {
grid[0][j].unk20 = 1;
grid[x-1][j].unk20 = 1;
}
}
sub_804D8C8(grid, x, y, unk7200, unk7260, 0);
sub_804E590(grid, x, y, unk7200, unk7260);
sub_804F0D0(grid, x, y, unkPtr->unk9);
sub_804EBC8(grid, x, y, gUnknown_202F1B0);
sub_804EEE4(grid, x, y, gUnknown_202F1B2);
sub_804CBEC(grid, x, y, unkPtr->unk13);
sub_804E03C(grid, x, y);
sub_804D534(grid, x, y);
}
void sub_804C790(s32 x1, s32 y1, s32 x2, s32 y2, s32 a4, UnkDungeonGlobal_unk1C574 *unkPtr);
extern void sub_8051288(s32 a0);
bool8 sub_804C70C(s32 a0, UnkDungeonGlobal_unk1C574 *unkPtr)
{
struct FileFixedmapPosStruct **fileData = (void *) gDungeon->unk13568->data;
s32 x1 = fileData[a0]->x;
s32 y1 = fileData[a0]->y;
s32 x2, y2;
if (x1 == 0 || y1 == 0) {
sub_804C918();
return FALSE;
}
else if (a0 < 50) {
sub_8051288(a0);
return TRUE;
}
else {
x2 = DUNGEON_MAX_SIZE_X / (x1 + 4);
if (x2 <= 1)
x2 = 1;
y2 = DUNGEON_MAX_SIZE_Y / (y1 + 4);
if (y2 <= 1)
y2 = 1;
sub_804C790(x2, y2, x1, y1, a0, unkPtr);
return FALSE;
}
}
void sub_8050F90(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x1, s32 y1, s32 *a3, s32 *a4, s32 a5, s32 x2, s32 y2);
void sub_804D5F0(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 x, s32 y, s32 x2, s32 y2, UnkDungeonGlobal_unk1C574 *unkPtr);
void sub_8051438(struct GridCell *cell, s32 a1);
void sub_804C790(s32 x1, s32 y1, s32 x2, s32 y2, s32 a4, UnkDungeonGlobal_unk1C574 *unkPtr)
{
s32 tries;
struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN];
s32 unk7200[GRID_CELL_LEN];
s32 unk7260[GRID_CELL_LEN];
s32 r10 = 0;
s32 x3 = 0, y3 = 0;
sub_804D024(unk7200, unk7260, x1, y1);
sub_804D084(grid, x1, y1);
sub_804D154(grid, x1, y1, unkPtr->unk1);
for (x3 = 0; x3 < x1; x3++) {
for (y3 = 0; y3 < y1; y3++) {
grid[x3][y3].unk27 = 1;
}
}
for (tries = 0; tries < 64; tries++) {
x3 = DungeonRandInt(x1);
y3 = DungeonRandInt(y1);
r10 = y3 * x1 + x3;
if (grid[x3][y3].unk10)
break;
}
sub_8050F90(grid, x1, y1, unk7200, unk7260, r10, x2, y2);
if (x1 != 1 || y1 != 1) {
sub_804D5F0(grid, x1, y1, x3, y3, unkPtr);
sub_804D8C8(grid, x1, y1, unk7200, unk7260, 1);
sub_804E590(grid, x1, y1, unk7200, unk7260);
}
sub_8051438(&grid[x3][y3], a4);
}
void sub_804C918(void)
{
s32 i, j;
struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN];
sub_804D084(grid, 1, 1);
grid[0][0].unk0.x = 2;
grid[0][0].unk4.x = DUNGEON_MAX_SIZE_X - 2;
grid[0][0].unk0.y = 2;
grid[0][0].unk4.y = DUNGEON_MAX_SIZE_Y - 2;
grid[0][0].unk10 = 1;
grid[0][0].unk11 = 1;
grid[0][0].unk8 = 0;
for (i = grid[0][0].unk0.x; i < grid[0][0].unk4.x; i++) {
for (j = grid[0][0].unk0.y; j < grid[0][0].unk4.y; j++) {
Tile *tile = GetTileSafe(i, j);
tile->terrainType &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY);
tile->terrainType |= TERRAIN_TYPE_NORMAL;
// Unnecessary call again
GetTileSafe(i, j)->room = 0;
}
}
sub_804EEE4(grid, 1, 1, 999);
}
void sub_804C9D0(void)
{
struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN];
s32 listX[GRID_CELL_LEN];
s32 listY[GRID_CELL_LEN];
s32 currRoomId = 0;
s32 x, y;
listX[0] = 2;
listX[1] = 28;
listX[2] = 54;
listY[0] = 2;
listY[1] = 30;
sub_804D084(grid, 2, 1);
for (y = 0; y < 1; y++) {
for (x = 0; x < 2; x++) {
s32 currX, currY;
s32 minX = listX[x] + 1;
s32 minY = listY[y] + 1;
s32 rangeX = listX[x + 1] - listX[x] - 3;
s32 rangeY = listY[y + 1] - listY[y] - 3;
s32 roomSizeX = DungeonRandRange(10, rangeX);
s32 roomSizeY = DungeonRandRange(16, rangeY);
s32 startX = DungeonRandInt(rangeX - roomSizeX) + minX;
s32 startY = DungeonRandInt(rangeY - roomSizeY) + minY;
s32 endX = startX + roomSizeX;
s32 endY = startY + roomSizeY;
grid[x][y].unk10 = 1;
grid[x][y].unk0.x = startX;
grid[x][y].unk4.x = endX;
grid[x][y].unk0.y = startY;
grid[x][y].unk4.y = endY;
for (currX = startX; currX < endX; currX++) {
for (currY = startY; currY < endY; currY++) {
Tile *tile = GetTileSafe(currX, currY);
tile->terrainType &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY);
tile->terrainType |= TERRAIN_TYPE_NORMAL;
// Unnecessary call again
GetTileSafe(currX, currY)->room = currRoomId;
}
}
currRoomId++;
}
}
grid[0][0].unk22 = 1;
grid[1][0].unk21 = 1;
sub_804D8C8(grid, 2, 1, listX, listY, 0);
sub_804EEE4(grid, 2, 1, 999);
}
//