document filescreen

This commit is contained in:
theo3 2021-02-02 13:58:05 -08:00
parent f26c22b0bf
commit 32fc754306
39 changed files with 3159 additions and 3183 deletions

View File

@ -38,7 +38,7 @@ MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR)
ASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(REVISION) --defsym $(GAME_LANGUAGE)=1 ASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(REVISION) --defsym $(GAME_LANGUAGE)=1
CC1 := tools/agbcc/bin/agbcc CC1 := tools/agbcc/bin/agbcc
override CFLAGS += -Wimplicit -Wparentheses -Werror -Wno-multichar -O2 override CFLAGS += -O2 -Wimplicit -Wparentheses -Werror -Wno-multichar
# -fhex-asm # -fhex-asm
ifeq ($(DINFO),1) ifeq ($(DINFO),1)

View File

@ -128,7 +128,7 @@ _08016ED6:
cmp r1, #0 cmp r1, #0
beq _08016EFC beq _08016EFC
ldr r2, _08016F14 @ =0x040000D4 ldr r2, _08016F14 @ =0x040000D4
ldr r0, _08016F24 @ =gUnk_020344B0 ldr r0, _08016F24 @ =gBG2Buffer
str r0, [r2] str r0, [r2]
ldrh r1, [r1] ldrh r1, [r1]
movs r0, #0xf8 movs r0, #0xf8
@ -155,7 +155,7 @@ _08016F14: .4byte 0x040000D4
_08016F18: .4byte gBG1Buffer _08016F18: .4byte gBG1Buffer
_08016F1C: .4byte 0x84000170 _08016F1C: .4byte 0x84000170
_08016F20: .4byte gUnk_0200B650 _08016F20: .4byte gUnk_0200B650
_08016F24: .4byte gUnk_020344B0 _08016F24: .4byte gBG2Buffer
thumb_func_start sub_08016F28 thumb_func_start sub_08016F28
sub_08016F28: @ 0x08016F28 sub_08016F28: @ 0x08016F28

View File

@ -359,7 +359,7 @@ sub_08019698: @ 0x08019698
_08019700: _08019700:
movs r0, #0x11 movs r0, #0x11
bl LoadGfxGroup bl LoadGfxGroup
bl sub_080AD90C bl FlushSprites
bl sub_080AD9B0 bl sub_080AD9B0
bl sub_080AD918 bl sub_080AD918
movs r0, #4 movs r0, #4
@ -402,7 +402,7 @@ _08019760: .4byte gUnk_02018EB0
thumb_func_start sub_08019764 thumb_func_start sub_08019764
sub_08019764: @ 0x08019764 sub_08019764: @ 0x08019764
push {lr} push {lr}
bl sub_080AD90C bl FlushSprites
bl sub_0805E5C0 bl sub_0805E5C0
bl sub_080AD9B0 bl sub_080AD9B0
bl sub_080AD918 bl sub_080AD918

View File

@ -378,7 +378,7 @@ sub_0801DB34: @ 0x0801DB34
str r0, [r4, #0x1c] str r0, [r4, #0x1c]
ldr r0, _0801DB7C @ =0x00001C01 ldr r0, _0801DB7C @ =0x00001C01
strh r0, [r4, #0x14] strh r0, [r4, #0x14]
ldr r0, _0801DB80 @ =gUnk_020344B0 ldr r0, _0801DB80 @ =gBG2Buffer
str r0, [r4, #0x28] str r0, [r4, #0x28]
ldr r0, _0801DB84 @ =0x00001D02 ldr r0, _0801DB84 @ =0x00001D02
strh r0, [r4, #0x20] strh r0, [r4, #0x20]
@ -398,7 +398,7 @@ _0801DB70: .4byte gBG0Buffer
_0801DB74: .4byte 0x00001F0C _0801DB74: .4byte 0x00001F0C
_0801DB78: .4byte gBG1Buffer _0801DB78: .4byte gBG1Buffer
_0801DB7C: .4byte 0x00001C01 _0801DB7C: .4byte 0x00001C01
_0801DB80: .4byte gUnk_020344B0 _0801DB80: .4byte gBG2Buffer
_0801DB84: .4byte 0x00001D02 _0801DB84: .4byte 0x00001D02
_0801DB88: .4byte gBG3Buffer _0801DB88: .4byte gBG3Buffer
_0801DB8C: .4byte 0x00001E03 _0801DB8C: .4byte 0x00001E03

View File

@ -120,7 +120,7 @@ _0804AC5E:
strh r0, [r2, #0x16] strh r0, [r2, #0x16]
ldrh r0, [r1, #0xc] ldrh r0, [r1, #0xc]
strh r0, [r2, #0x18] strh r0, [r2, #0x18]
bl sub_080AD90C bl FlushSprites
bl sub_080AD9B0 bl sub_080AD9B0
bl sub_080AD918 bl sub_080AD918
ldr r0, _0804AC98 @ =gUnk_02018EB0 ldr r0, _0804AC98 @ =gUnk_02018EB0

View File

@ -1574,7 +1574,7 @@ sub_08053320: @ 0x08053320
ldr r0, _08053380 @ =gBG1Buffer ldr r0, _08053380 @ =gBG1Buffer
adds r1, r4, #0 adds r1, r4, #0
bl _DmaZero bl _DmaZero
ldr r0, _08053384 @ =gUnk_020344B0 ldr r0, _08053384 @ =gBG2Buffer
adds r1, r4, #0 adds r1, r4, #0
bl _DmaZero bl _DmaZero
ldr r0, _08053388 @ =gBG3Buffer ldr r0, _08053388 @ =gBG3Buffer
@ -1604,7 +1604,7 @@ _08053362:
.align 2, 0 .align 2, 0
_0805337C: .4byte gBG0Buffer _0805337C: .4byte gBG0Buffer
_08053380: .4byte gBG1Buffer _08053380: .4byte gBG1Buffer
_08053384: .4byte gUnk_020344B0 _08053384: .4byte gBG2Buffer
_08053388: .4byte gBG3Buffer _08053388: .4byte gBG3Buffer
_0805338C: .4byte gRoomControls _0805338C: .4byte gRoomControls

View File

@ -57,7 +57,7 @@ sub_080548E8: @ 0x080548E8
adds r0, r0, r1 adds r0, r0, r1
ldr r0, [r0] ldr r0, [r0]
bl _call_via_r0 bl _call_via_r0
bl sub_080AD90C bl FlushSprites
bl sub_0805E5C0 bl sub_0805E5C0
bl sub_080AD9B0 bl sub_080AD9B0
bl sub_080AD918 bl sub_080AD918

View File

@ -982,8 +982,8 @@ _080A3200:
pop {r4, r5, pc} pop {r4, r5, pc}
.align 2, 0 .align 2, 0
thumb_func_start sub_080A3204 thumb_func_start InitSound
sub_080A3204: @ 0x080A3204 InitSound: @ 0xInitSound
push {lr} push {lr}
bl sub_080A3210 bl sub_080A3210
bl m4aSoundInit bl m4aSoundInit

View File

@ -586,7 +586,7 @@ sub_080A38D0: @ 0x080A38D0
mov r8, r0 mov r8, r0
movs r5, #1 movs r5, #1
strh r5, [r4, #0x1a] strh r5, [r4, #0x1a]
ldr r0, _080A3928 @ =gUnk_020344B0 ldr r0, _080A3928 @ =gBG2Buffer
adds r1, r6, #0 adds r1, r6, #0
bl _DmaZero bl _DmaZero
strh r5, [r4, #0x26] strh r5, [r4, #0x26]
@ -608,7 +608,7 @@ _080A3914:
_080A391C: .4byte gFadeControl _080A391C: .4byte gFadeControl
_080A3920: .4byte gBG1Buffer _080A3920: .4byte gBG1Buffer
_080A3924: .4byte gScreen _080A3924: .4byte gScreen
_080A3928: .4byte gUnk_020344B0 _080A3928: .4byte gBG2Buffer
_080A392C: .4byte gMenu _080A392C: .4byte gMenu
thumb_func_start sub_080A3930 thumb_func_start sub_080A3930

View File

@ -1207,7 +1207,7 @@ _080A45A2:
thumb_func_start sub_080A45A4 thumb_func_start sub_080A45A4
sub_080A45A4: @ 0x080A45A4 sub_080A45A4: @ 0x080A45A4
push {lr} push {lr}
bl sub_080AD90C bl FlushSprites
ldr r0, _080A45C4 @ =gUnk_02032EC0 ldr r0, _080A45C4 @ =gUnk_02032EC0
ldrb r0, [r0, #3] ldrb r0, [r0, #3]
cmp r0, #0xff cmp r0, #0xff
@ -2249,7 +2249,7 @@ sub_080A4DB8: @ 0x080A4DB8
ldr r0, _080A4E5C @ =gBG1Buffer ldr r0, _080A4E5C @ =gBG1Buffer
adds r1, r4, #0 adds r1, r4, #0
bl _DmaZero bl _DmaZero
ldr r0, _080A4E60 @ =gUnk_020344B0 ldr r0, _080A4E60 @ =gBG2Buffer
adds r1, r4, #0 adds r1, r4, #0
bl _DmaZero bl _DmaZero
ldr r0, _080A4E64 @ =gUnk_0200AF34 ldr r0, _080A4E64 @ =gUnk_0200AF34
@ -2314,7 +2314,7 @@ _080A4E54:
.align 2, 0 .align 2, 0
_080A4E58: .4byte gBG0Buffer _080A4E58: .4byte gBG0Buffer
_080A4E5C: .4byte gBG1Buffer _080A4E5C: .4byte gBG1Buffer
_080A4E60: .4byte gUnk_020344B0 _080A4E60: .4byte gBG2Buffer
_080A4E64: .4byte gUnk_0200AF34 _080A4E64: .4byte gUnk_0200AF34
_080A4E68: .4byte gMenu _080A4E68: .4byte gMenu
_080A4E6C: .4byte 0x0000FFFF _080A4E6C: .4byte 0x0000FFFF
@ -2357,7 +2357,7 @@ sub_080A4EA0: @ 0x080A4EA0
.align 2, 0 .align 2, 0
_080A4EB8: .4byte gUnk_02034490 _080A4EB8: .4byte gUnk_02034490
_080A4EBC: _080A4EBC:
bl sub_080AD90C bl FlushSprites
ldr r1, _080A4F18 @ =gUnk_08128B30 ldr r1, _080A4F18 @ =gUnk_08128B30
ldrb r0, [r4, #0x11] ldrb r0, [r4, #0x11]
lsls r0, r0, #2 lsls r0, r0, #2

View File

@ -1980,7 +1980,7 @@ _080A64F8: .4byte 0x00003D3F
thumb_func_start sub_080A64FC thumb_func_start sub_080A64FC
sub_080A64FC: @ 0x080A64FC sub_080A64FC: @ 0x080A64FC
push {r4, lr} push {r4, lr}
bl sub_080AD90C bl FlushSprites
ldr r1, _080A652C @ =gUnk_08128E70 ldr r1, _080A652C @ =gUnk_08128E70
ldr r4, _080A6530 @ =gMenu ldr r4, _080A6530 @ =gMenu
ldrb r0, [r4, #5] ldrb r0, [r4, #5]
@ -2710,7 +2710,7 @@ _080A6AB6:
thumb_func_start sub_080A6AB8 thumb_func_start sub_080A6AB8
sub_080A6AB8: @ 0x080A6AB8 sub_080A6AB8: @ 0x080A6AB8
push {r4, lr} push {r4, lr}
bl sub_080AD90C bl FlushSprites
ldr r1, _080A6AF4 @ =gUnk_08128F1C ldr r1, _080A6AF4 @ =gUnk_08128F1C
ldr r4, _080A6AF8 @ =gMenu ldr r4, _080A6AF8 @ =gMenu
ldrb r0, [r4, #5] ldrb r0, [r4, #5]
@ -2912,7 +2912,7 @@ _080A6C70: .4byte gMenu
thumb_func_start sub_080A6C74 thumb_func_start sub_080A6C74
sub_080A6C74: @ 0x080A6C74 sub_080A6C74: @ 0x080A6C74
push {r4, lr} push {r4, lr}
bl sub_080AD90C bl FlushSprites
ldr r1, _080A6CA0 @ =gUnk_08128F24 ldr r1, _080A6CA0 @ =gUnk_08128F24
ldr r4, _080A6CA4 @ =gMenu ldr r4, _080A6CA4 @ =gMenu
ldrb r0, [r4, #5] ldrb r0, [r4, #5]
@ -3955,7 +3955,7 @@ sub_080A74F4: @ 0x080A74F4
ldr r1, _080A7524 @ =gUnk_03001000 ldr r1, _080A7524 @ =gUnk_03001000
movs r0, #0 movs r0, #0
strb r0, [r1, #0xb] strb r0, [r1, #0xb]
bl sub_080AD90C bl FlushSprites
bl sub_0805E5C0 bl sub_0805E5C0
bl sub_0805E5F8 bl sub_0805E5F8
bl sub_0801C344 bl sub_0801C344

View File

@ -5,8 +5,8 @@
.text .text
thumb_func_start sub_080AD90C thumb_func_start FlushSprites
sub_080AD90C: @ 0x080AD90C FlushSprites: @ 0x080AD90C
ldr r1, _080AD914 @ =gUnk_03000000 ldr r1, _080AD914 @ =gUnk_03000000
movs r0, #0 movs r0, #0
strb r0, [r1, #3] strb r0, [r1, #3]

View File

@ -5,428 +5,8 @@
.text .text
thumb_func_start sub_08050B3C thumb_func_start HandleFileOptions
sub_08050B3C: @ 0x08050B3C HandleFileOptions: @ 0x08050E9C
push {r4, r5, r6, r7, lr}
mov r7, sl
mov r6, sb
mov r5, r8
push {r5, r6, r7}
sub sp, #8
str r0, [sp]
ldr r1, _08050C18 @ =gUnk_02002A40
adds r0, r1, #0
adds r0, #0xaa
ldrb r0, [r0]
lsrs r2, r0, #1
cmp r2, #0
bne _08050B5A
movs r2, #1
_08050B5A:
adds r0, r1, #0
adds r0, #0xab
ldrb r0, [r0]
lsrs r3, r0, #1
cmp r3, #0
beq RETURN
cmp r2, r3
ble _08050B6C
adds r2, r3, #0
_08050B6C:
movs r0, #3
ands r0, r2
str r0, [sp, #4]
adds r0, r2, #0
asrs r5, r0, #2
mov ip, r5
cmp r5, #0xa
ble _08050B80
movs r2, #0xa
mov ip, r2
_08050B80:
adds r6, r5, #0
subs r6, #0xa
mov sb, r6
cmp r6, #0
bge _08050B8E
movs r7, #0
mov sb, r7
_08050B8E:
adds r0, r3, #0
asrs r3, r0, #2
adds r0, r3, #0
cmp r3, #0xa
ble _08050B9A
movs r3, #0xa
_08050B9A:
adds r4, r0, #0
subs r4, #0xa
ldr r2, [sp]
ldr r0, _08050C1C @ =0x0000F24C
mov sl, r0
strh r0, [r2]
ldr r1, _08050C20 @ =0x040000D4
movs r7, #0xa
mov r8, r7
mov r0, r8
mov r7, ip @ var5
subs r0, r0, r7 @ 10 - var5
lsls r0, r0, #1
ldr r7, _08050C24 @ =gUnk_080FC914
mov ip, r7
add r0, ip
str r0, [r1]
adds r0, r2, #2
str r0, [r1, #4]
movs r0, #0x80
lsls r0, r0, #0x18
orrs r3, r0
str r3, [r1, #8]
ldr r0, [r1, #8]
cmp r4, #0
ble _08050BEE
adds r2, #0x40
mov r3, sl
strh r3, [r2]
mov r7, r8
mov r3, sb
subs r0, r7, r3
lsls r0, r0, #1
add r0, ip
str r0, [r1]
adds r0, r2, #2
str r0, [r1, #4]
movs r7, #0x80
lsls r7, r7, #0x18
orrs r4, r7
str r4, [r1, #8]
ldr r0, [r1, #8]
_08050BEE:
ldr r0, [sp, #4]
cmp r0, #0
beq RETURN
ldr r2, [sp]
cmp r5, #9
ble _08050BFE
adds r5, r6, #0
adds r2, #0x40
_08050BFE:
lsls r0, r5, #1
adds r0, r0, r2
ldr r2, [sp, #4]
ldr r3, _08050C28 @ =0xFFFFF24D
adds r1, r2, r3
strh r1, [r0, #2]
RETURN:
add sp, #8
pop {r3, r4, r5}
mov r8, r3
mov sb, r4
mov sl, r5
pop {r4, r5, r6, r7, pc}
.align 2, 0
_08050C18: .4byte gUnk_02002A40
_08050C1C: .4byte 0x0000F24C
_08050C20: .4byte 0x040000D4
_08050C24: .4byte gUnk_080FC914
_08050C28: .4byte 0xFFFFF24D
thumb_func_start sub_08050C2C
sub_08050C2C: @ 0x08050C2C
push {lr}
ldr r1, _08050C48 @ =gUnk_080FC93C
ldr r0, _08050C4C @ =gMenu
ldrb r0, [r0, #5]
lsls r0, r0, #2
adds r0, r0, r1
ldr r0, [r0]
bl _call_via_r0
ldr r0, _08050C50 @ =gUnk_02019EE0
ldrb r0, [r0, #6]
bl sub_08050A64
pop {pc}
.align 2, 0
_08050C48: .4byte gUnk_080FC93C
_08050C4C: .4byte gMenu
_08050C50: .4byte gUnk_02019EE0
thumb_func_start sub_08050C54
sub_08050C54: @ 0x08050C54
push {r4, lr}
ldr r0, _08050C78 @ =gUnk_02019EE0
ldrb r0, [r0]
cmp r0, #0
beq _08050C60
b _08050D60
_08050C60:
ldr r0, _08050C7C @ =gMenu
ldrb r4, [r0, #1]
ldr r0, _08050C80 @ =gUnk_03000FF0
ldrh r0, [r0, #2]
subs r0, #1
cmp r0, #0x1f
bhi _08050D44
lsls r0, r0, #2
ldr r1, _08050C84 @ =_08050C88
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_08050C78: .4byte gUnk_02019EE0
_08050C7C: .4byte gMenu
_08050C80: .4byte gUnk_03000FF0
_08050C84: .4byte _08050C88
_08050C88: @ jump table
.4byte _08050D08 @ case 0
.4byte _08050D30 @ case 1
.4byte _08050D44 @ case 2
.4byte _08050D44 @ case 3
.4byte _08050D44 @ case 4
.4byte _08050D44 @ case 5
.4byte _08050D44 @ case 6
.4byte _08050D08 @ case 7
.4byte _08050D44 @ case 8
.4byte _08050D44 @ case 9
.4byte _08050D44 @ case 10
.4byte _08050D44 @ case 11
.4byte _08050D44 @ case 12
.4byte _08050D44 @ case 13
.4byte _08050D44 @ case 14
.4byte _08050D42 @ case 15
.4byte _08050D44 @ case 16
.4byte _08050D44 @ case 17
.4byte _08050D44 @ case 18
.4byte _08050D44 @ case 19
.4byte _08050D44 @ case 20
.4byte _08050D44 @ case 21
.4byte _08050D44 @ case 22
.4byte _08050D44 @ case 23
.4byte _08050D44 @ case 24
.4byte _08050D44 @ case 25
.4byte _08050D44 @ case 26
.4byte _08050D44 @ case 27
.4byte _08050D44 @ case 28
.4byte _08050D44 @ case 29
.4byte _08050D44 @ case 30
.4byte _08050D3E @ case 31
_08050D08:
cmp r4, #0
bne _08050D12
ldr r0, _08050D28 @ =0x80080000
bl PlaySFX
_08050D12:
ldr r1, _08050D2C @ =gMenu
movs r0, #0xf
strh r0, [r1, #8]
movs r0, #1
bl sub_080A7114
movs r0, #0x6a
bl PlaySFX
b _08050D44
.align 2, 0
_08050D28: .4byte 0x80080000
_08050D2C: .4byte gMenu
_08050D30:
movs r0, #0x6c
bl PlaySFX
movs r0, #0
bl sub_080503BC
b _08050D44
_08050D3E:
subs r4, #1
b _08050D44
_08050D42:
adds r4, #1
_08050D44:
cmp r4, #0
bge _08050D4A
movs r4, #0
_08050D4A:
cmp r4, #2
ble _08050D50
movs r4, #2
_08050D50:
ldr r1, _08050D64 @ =gMenu
ldrb r0, [r1, #1]
cmp r0, r4
beq _08050D60
strb r4, [r1, #1]
movs r0, #0x69
bl PlaySFX
_08050D60:
pop {r4, pc}
.align 2, 0
_08050D64: .4byte gMenu
thumb_func_start sub_08050D68
sub_08050D68: @ 0x08050D68
push {lr}
ldr r1, _08050D84 @ =gMenu
ldrh r0, [r1, #8]
cmp r0, #0
bne _08050D94
ldrb r0, [r1, #1]
cmp r0, #1
beq _08050D88
cmp r0, #1
ble _08050D80
cmp r0, #2
beq _08050D8C
_08050D80:
movs r0, #7
b _08050D8E
.align 2, 0
_08050D84: .4byte gMenu
_08050D88:
movs r0, #5
b _08050D8E
_08050D8C:
movs r0, #6
_08050D8E:
bl sub_080503BC
b _08050D98
_08050D94:
subs r0, #1
strh r0, [r1, #8]
_08050D98:
pop {pc}
.align 2, 0
thumb_func_start sub_08050D9C
sub_08050D9C: @ 0x08050D9C
push {lr}
ldr r1, _08050DB0 @ =gUnk_080FC944
ldr r0, _08050DB4 @ =gMenu
ldrb r0, [r0, #5]
lsls r0, r0, #2
adds r0, r0, r1
ldr r0, [r0]
bl _call_via_r0
pop {pc}
.align 2, 0
_08050DB0: .4byte gUnk_080FC944
_08050DB4: .4byte gMenu
thumb_func_start sub_08050DB8
sub_08050DB8: @ 0x08050DB8
push {lr}
ldr r0, _08050DDC @ =gUnk_020344B0
movs r1, #0x80
lsls r1, r1, #4
bl _DmaZero
movs r0, #0xc
bl sub_080503A8
ldr r1, _08050DE0 @ =gMenu
movs r0, #0x80
lsls r0, r0, #0x12
ldrb r0, [r0, #7]
strb r0, [r1, #4]
movs r0, #1
bl sub_080A7114
pop {pc}
.align 2, 0
_08050DDC: .4byte gUnk_020344B0
_08050DE0: .4byte gMenu
thumb_func_start sub_08050DE4
sub_08050DE4: @ 0x08050DE4
push {r4, lr}
ldr r0, _08050E0C @ =gUnk_02019EE0
ldrb r0, [r0]
cmp r0, #0
bne _08050E80
movs r1, #0x80
lsls r1, r1, #0x12
ldrb r4, [r1, #7]
ldr r0, _08050E10 @ =gUnk_03000FF0
ldrh r0, [r0, #2]
cmp r0, #8
beq _08050E26
cmp r0, #8
bgt _08050E14
cmp r0, #1
beq _08050E26
cmp r0, #2
beq _08050E50
b _08050E62
.align 2, 0
_08050E0C: .4byte gUnk_02019EE0
_08050E10: .4byte gUnk_03000FF0
_08050E14:
cmp r0, #0x40
beq _08050E1E
cmp r0, #0x80
beq _08050E22
b _08050E62
_08050E1E:
subs r4, #1
b _08050E62
_08050E22:
adds r4, #1
b _08050E62
_08050E26:
movs r0, #0x6a
bl PlaySFX
ldr r0, _08050E44 @ =gMenu
ldrb r0, [r0, #4]
cmp r0, r4
beq _08050E48
movs r0, #2
bl sub_080A7114
movs r0, #8
movs r1, #0
bl sub_08050318
b _08050E62
.align 2, 0
_08050E44: .4byte gMenu
_08050E48:
movs r0, #0
bl sub_080503BC
b _08050E62
_08050E50:
ldr r0, _08050E84 @ =gMenu
ldrb r4, [r0, #4]
strb r4, [r1, #7]
movs r0, #0x6c
bl PlaySFX
movs r0, #0
bl sub_080503BC
_08050E62:
cmp r4, #1
bgt _08050E68
movs r4, #2
_08050E68:
cmp r4, #6
ble _08050E6E
movs r4, #6
_08050E6E:
movs r1, #0x80
lsls r1, r1, #0x12
ldrb r0, [r1, #7]
cmp r0, r4
beq _08050E80
strb r4, [r1, #7]
movs r0, #0x69
bl PlaySFX
_08050E80:
pop {r4, pc}
.align 2, 0
_08050E84: .4byte gMenu
thumb_func_start sub_08050E88
sub_08050E88: @ 0x08050E88
push {lr}
movs r0, #2
bl sub_0807CDA4
cmp r0, #0
beq _08050E9A
movs r0, #0
bl sub_080503BC
_08050E9A:
pop {pc}
thumb_func_start sub_08050E9C
sub_08050E9C: @ 0x08050E9C
push {lr} push {lr}
ldr r1, _08050EB0 @ =gUnk_080FC950 ldr r1, _08050EB0 @ =gUnk_080FC950
ldr r0, _08050EB4 @ =gMenu ldr r0, _08050EB4 @ =gMenu
@ -581,7 +161,7 @@ _08050FBA:
bl sub_080A7114 bl sub_080A7114
ldr r0, _08050FCC @ =gUnk_02019EE0 ldr r0, _08050FCC @ =gUnk_02019EE0
ldrb r0, [r0, #6] ldrb r0, [r0, #6]
bl sub_0805041C bl SetActiveSave
b _08050FF4 b _08050FF4
.align 2, 0 .align 2, 0
_08050FCC: .4byte gUnk_02019EE0 _08050FCC: .4byte gUnk_02019EE0
@ -599,7 +179,7 @@ _08050FE2:
beq _08050FF4 beq _08050FF4
strb r2, [r4] strb r2, [r4]
ldrb r0, [r6, #6] ldrb r0, [r6, #6]
bl sub_080503E4 bl LoadOptionsFromSave
movs r0, #0x69 movs r0, #0x69
bl PlaySFX bl PlaySFX
_08050FF4: _08050FF4:
@ -669,12 +249,12 @@ _08051060:
_08051068: .4byte gUnk_03000FF0 _08051068: .4byte gUnk_03000FF0
_0805106C: _0805106C:
movs r0, #0 movs r0, #0
bl sub_080503BC bl SetFileSelectState
_08051072: _08051072:
pop {pc} pop {pc}
thumb_func_start sub_08051074 thumb_func_start HandleFileNew
sub_08051074: @ 0x08051074 HandleFileNew: @ 0x08051074
push {lr} push {lr}
ldr r1, _08051088 @ =gUnk_080FC960 ldr r1, _08051088 @ =gUnk_080FC960
ldr r0, _0805108C @ =gMenu ldr r0, _0805108C @ =gMenu
@ -1189,7 +769,7 @@ _08051448:
sub_0805144C: @ 0x0805144C sub_0805144C: @ 0x0805144C
push {lr} push {lr}
movs r0, #0 movs r0, #0
bl sub_080503BC bl SetFileSelectState
pop {pc} pop {pc}
.align 2, 0 .align 2, 0
@ -1372,8 +952,8 @@ _08051594: .4byte gUnk_02002A40
_08051598: .4byte gUnk_02019EE0 _08051598: .4byte gUnk_02019EE0
_0805159C: .4byte 0x000004B4 _0805159C: .4byte 0x000004B4
thumb_func_start sub_080515A0 thumb_func_start HandleFileDelete
sub_080515A0: @ 0x080515A0 HandleFileDelete: @ 0x080515A0
push {lr} push {lr}
ldr r1, _080515BC @ =gUnk_080FC9BC ldr r1, _080515BC @ =gUnk_080FC9BC
ldr r0, _080515C0 @ =gMenu ldr r0, _080515C0 @ =gMenu
@ -1480,7 +1060,7 @@ _08051694:
_080516B0: .4byte gMenu _080516B0: .4byte gMenu
_080516B4: _080516B4:
movs r0, #0 movs r0, #0
bl sub_080503BC bl SetFileSelectState
movs r0, #0x6c movs r0, #0x6c
bl PlaySFX bl PlaySFX
b _080516C8 b _080516C8
@ -1518,15 +1098,15 @@ sub_080516E0: @ 0x080516E0
movs r0, #2 movs r0, #2
strh r0, [r1, #8] strh r0, [r1, #8]
movs r0, #0 movs r0, #0
bl sub_080503BC bl SetFileSelectState
_08051706: _08051706:
pop {r4, pc} pop {r4, pc}
.align 2, 0 .align 2, 0
_08051708: .4byte gUnk_02019EE0 _08051708: .4byte gUnk_02019EE0
_0805170C: .4byte gMenu _0805170C: .4byte gMenu
thumb_func_start sub_08051710 thumb_func_start HandleFileCopy
sub_08051710: @ 0x08051710 HandleFileCopy: @ 0x08051710
push {lr} push {lr}
ldr r1, _0805172C @ =gUnk_080FC9C8 ldr r1, _0805172C @ =gUnk_080FC9C8
ldr r0, _08051730 @ =gMenu ldr r0, _08051730 @ =gMenu
@ -1697,7 +1277,7 @@ _08051848:
movs r0, #0x6c movs r0, #0x6c
bl PlaySFX bl PlaySFX
movs r0, #0 movs r0, #0
bl sub_080503BC bl SetFileSelectState
_08051858: _08051858:
adds r0, r4, #0 adds r0, r4, #0
bl sub_080517B4 bl sub_080517B4
@ -1744,7 +1324,7 @@ sub_08051874: @ 0x08051874
adds r1, r1, r3 adds r1, r1, r3
bl _DmaCopy bl _DmaCopy
movs r0, #0 movs r0, #0
bl sub_080503BC bl SetFileSelectState
b _080518DE b _080518DE
.align 2, 0 .align 2, 0
_080518B8: .4byte gUnk_02019EE0 _080518B8: .4byte gUnk_02019EE0
@ -1780,7 +1360,7 @@ sub_080518E4: @ 0x080518E4
cmp r0, #0 cmp r0, #0
beq _08051910 beq _08051910
movs r0, #0 movs r0, #0
bl sub_080503BC bl SetFileSelectState
b _08051910 b _08051910
.align 2, 0 .align 2, 0
_08051904: .4byte gMenu _08051904: .4byte gMenu
@ -1792,8 +1372,8 @@ _08051910:
pop {pc} pop {pc}
.align 2, 0 .align 2, 0
thumb_func_start sub_08051914 thumb_func_start HandleFileStart
sub_08051914: @ 0x08051914 HandleFileStart: @ 0x08051914
push {lr} push {lr}
ldr r1, _08051940 @ =gMenu ldr r1, _08051940 @ =gMenu
ldrb r0, [r1, #5] ldrb r0, [r1, #5]
@ -2014,7 +1594,7 @@ _08051B02:
bl sub_08000108 bl sub_08000108
bl sub_0801C344 bl sub_0801C344
bl sub_0805E5F8 bl sub_0805E5F8
bl sub_080AD90C bl FlushSprites
bl sub_0801C208 bl sub_0801C208
bl sub_08078CB4 bl sub_08078CB4
bl sub_080AD9B0 bl sub_080AD9B0
@ -2115,7 +1695,7 @@ sub_08051BD0: @ 0x08051BD0
_08051C02: _08051C02:
bl sub_08078B48 bl sub_08078B48
_08051C06: _08051C06:
bl sub_080AD90C bl FlushSprites
bl sub_0805E5C0 bl sub_0805E5C0
bl sub_08080A40 bl sub_08080A40
bl sub_080175F4 bl sub_080175F4
@ -2182,7 +1762,7 @@ sub_08051CA8: @ 0x08051CA8
bl sub_080175F4 bl sub_080175F4
bl sub_0801C344 bl sub_0801C344
bl sub_0805E5F8 bl sub_0805E5F8
bl sub_080AD90C bl FlushSprites
bl sub_0801C208 bl sub_0801C208
bl sub_08078CB4 bl sub_08078CB4
bl sub_080AD9B0 bl sub_080AD9B0
@ -2202,7 +1782,7 @@ _08051CEC: .4byte gFadeControl
thumb_func_start sub_08051CF0 thumb_func_start sub_08051CF0
sub_08051CF0: @ 0x08051CF0 sub_08051CF0: @ 0x08051CF0
push {r4, r5, r6, lr} push {r4, r5, r6, lr}
bl sub_080AD90C bl FlushSprites
bl sub_0801C208 bl sub_0801C208
bl sub_080AD9B0 bl sub_080AD9B0
ldr r5, _08051D20 @ =gUnk_03001000 ldr r5, _08051D20 @ =gUnk_03001000
@ -2449,7 +2029,7 @@ sub_08051F04: @ 0x08051F04
adds r0, r0, r1 adds r0, r0, r1
ldr r0, [r0] ldr r0, [r0]
bl _call_via_r0 bl _call_via_r0
bl sub_080AD90C bl FlushSprites
bl sub_0805E5C0 bl sub_0805E5C0
bl sub_080AD9B0 bl sub_080AD9B0
bl sub_080AD918 bl sub_080AD918
@ -2581,7 +2161,7 @@ sub_08052010: @ 0x08052010
lsls r4, r4, #4 lsls r4, r4, #4
adds r1, r4, #0 adds r1, r4, #0
bl _DmaZero bl _DmaZero
ldr r0, _08052080 @ =gUnk_020344B0 ldr r0, _08052080 @ =gBG2Buffer
adds r1, r4, #0 adds r1, r4, #0
bl _DmaZero bl _DmaZero
bl sub_080A4D34 bl sub_080A4D34
@ -2616,7 +2196,7 @@ sub_08052010: @ 0x08052010
pop {r4, pc} pop {r4, pc}
.align 2, 0 .align 2, 0
_0805207C: .4byte gBG1Buffer _0805207C: .4byte gBG1Buffer
_08052080: .4byte gUnk_020344B0 _08052080: .4byte gBG2Buffer
_08052084: .4byte gMenu _08052084: .4byte gMenu
_08052088: .4byte gScreen _08052088: .4byte gScreen
_0805208C: .4byte 0x00001C01 _0805208C: .4byte 0x00001C01
@ -2635,7 +2215,7 @@ HandleGameOverScreen: @ 0x08052094
ldrb r0, [r4, #3] ldrb r0, [r4, #3]
cmp r0, #0 cmp r0, #0
beq _080520B8 beq _080520B8
bl sub_080AD90C bl FlushSprites
bl sub_080523D4 bl sub_080523D4
bl sub_080AD918 bl sub_080AD918
_080520B8: _080520B8:

View File

@ -0,0 +1,125 @@
.syntax unified
push {r4, r5, r6, r7, lr}
mov r7, sl
mov r6, sb
mov r5, r8
push {r5, r6, r7}
sub sp, #8
str r0, [sp]
ldr r1, _08050C18 @ =gUnk_02002A40
adds r0, r1, #0
adds r0, #0xaa
ldrb r0, [r0]
lsrs r2, r0, #1
cmp r2, #0
bne _08050B5A
movs r2, #1
_08050B5A:
adds r0, r1, #0
adds r0, #0xab
ldrb r0, [r0]
lsrs r3, r0, #1
cmp r3, #0
beq RETURN
cmp r2, r3
ble _08050B6C
adds r2, r3, #0
_08050B6C:
movs r0, #3
ands r0, r2
str r0, [sp, #4]
adds r0, r2, #0
asrs r5, r0, #2
mov ip, r5
cmp r5, #0xa
ble _08050B80
movs r2, #0xa
mov ip, r2
_08050B80:
adds r6, r5, #0
subs r6, #0xa
mov sb, r6
cmp r6, #0
bge _08050B8E
movs r7, #0
mov sb, r7
_08050B8E:
adds r0, r3, #0
asrs r3, r0, #2
adds r0, r3, #0
cmp r3, #0xa
ble _08050B9A
movs r3, #0xa
_08050B9A:
adds r4, r0, #0
subs r4, #0xa
ldr r2, [sp]
ldr r0, _08050C1C @ =0x0000F24C
mov sl, r0
strh r0, [r2]
ldr r1, _08050C20 @ =0x040000D4
movs r7, #0xa
mov r8, r7
mov r0, r8
mov r7, ip @ var5
subs r0, r0, r7 @ 10 - var5
lsls r0, r0, #1
ldr r7, _08050C24 @ =gUnk_080FC914
mov ip, r7
add r0, ip
str r0, [r1]
adds r0, r2, #2
str r0, [r1, #4]
movs r0, #0x80
lsls r0, r0, #0x18
orrs r3, r0
str r3, [r1, #8]
ldr r0, [r1, #8]
cmp r4, #0
ble _08050BEE
adds r2, #0x40
mov r3, sl
strh r3, [r2]
mov r7, r8
mov r3, sb
subs r0, r7, r3
lsls r0, r0, #1
add r0, ip
str r0, [r1]
adds r0, r2, #2
str r0, [r1, #4]
movs r7, #0x80
lsls r7, r7, #0x18
orrs r4, r7
str r4, [r1, #8]
ldr r0, [r1, #8]
_08050BEE:
ldr r0, [sp, #4]
cmp r0, #0
beq RETURN
ldr r2, [sp]
cmp r5, #9
ble _08050BFE
adds r5, r6, #0
adds r2, #0x40
_08050BFE:
lsls r0, r5, #1
adds r0, r0, r2
ldr r2, [sp, #4]
ldr r3, _08050C28 @ =0xFFFFF24D
adds r1, r2, r3
strh r1, [r0, #2]
RETURN:
add sp, #8
pop {r3, r4, r5}
mov r8, r3
mov sb, r4
mov sl, r5
pop {r4, r5, r6, r7, pc}
.align 2, 0
_08050C18: .4byte gUnk_02002A40
_08050C1C: .4byte 0x0000F24C
_08050C20: .4byte 0x040000D4
_08050C24: .4byte gUnk_080FC914
_08050C28: .4byte 0xFFFFF24D
.syntax divided

File diff suppressed because it is too large Load Diff

1928
data/data_080FC8A4.s Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,15 +4,6 @@
.section .rodata .section .rodata
.align 2 .align 2
gUnk_08107BC8:: @ 08107BC8
.incbin "baserom.gba", 0x107BC8, 0x0000018
gUnk_08107BE0:: @ 08107BE0
.incbin "baserom.gba", 0x107BE0, 0x0000014
gUnk_08107BF4:: @ 08107BF4
.incbin "baserom.gba", 0x107BF4, 0x0000018
gUnk_08107C0C:: @ 08107C0C gUnk_08107C0C:: @ 08107C0C
.incbin "baserom.gba", 0x107C0C, 0x0000003 .incbin "baserom.gba", 0x107C0C, 0x0000003

View File

@ -4,30 +4,6 @@
.section .rodata .section .rodata
.align 2 .align 2
gUnk_0811E454:: @ 0811E454
.incbin "baserom.gba", 0x11E454, 0x000001C
gUnk_0811E470:: @ 0811E470
.incbin "baserom.gba", 0x11E470, 0x0000008
gUnk_0811E478:: @ 0811E478
.incbin "baserom.gba", 0x11E478, 0x000000C
gUnk_0811E484:: @ 0811E484
.incbin "baserom.gba", 0x11E484, 0x0000020
gUnk_0811E4A4:: @ 0811E4A4
.incbin "baserom.gba", 0x11E4A4, 0x0000008
gUnk_0811E4AC:: @ 0811E4AC
.incbin "baserom.gba", 0x11E4AC, 0x0000001
gUnk_0811E4AD:: @ 0811E4AD
.incbin "baserom.gba", 0x11E4AD, 0x0000007
gUnk_0811E4B4:: @ 0811E4B4
.incbin "baserom.gba", 0x11E4B4, 0x0000008
gUnk_0811E4BC:: @ 0811E4BC gUnk_0811E4BC:: @ 0811E4BC
.incbin "baserom.gba", 0x11E4BC, 0x0000054 .incbin "baserom.gba", 0x11E4BC, 0x0000054

77
include/fileScreen.h Normal file
View File

@ -0,0 +1,77 @@
#ifndef FILESELECT_H
#define FILESELECT_H
#include "global.h"
#include "functions.h"
#include "main.h"
#include "player.h"
#include "readKeyInput.h"
#include "screen.h"
#include "menu.h"
#include "save.h"
typedef struct {
u8 filler0[0x5];
u8 state;
u8 subState;
u16 timer;
u8 fillerA[0x26];
} ChooseFileState;
// TODO: This occupies the same memory region as gMenu
extern ChooseFileState gChooseFileState;
typedef struct {
u8 filler0[0x1];
u8 unk1;
u8 charColor;
u8 bgColor;
u16 unk4;
u16 unk6;
u8* unk8;
} struct_02036540;
typedef struct {
u8 filler0[0x10];
u16 unk10;
u8 filler12[0x6];
} struct_080FC844;
typedef struct {
u8 filler0[0x4];
} struct_020227E8;
extern struct_020227E8 gUnk_020227E8;
extern SaveFile gSaveFiles[];
extern u32 gUsedPalettes;
extern u8 gUnk_02000D00[];
struct OAMCommand {
u16 x;
u16 y;
u16 _4;
u16 _6;
u16 _8;
} extern gUnk_03001010;
extern void sub_08056FEC(u32, struct_020227E8*);
extern void sub_0805F46C(u32, struct_080FC844*);
extern void sub_0801C4A0(u32, u32);
extern void sub_08080668(void);
extern void sub_0805194C(u32);
extern void LoadPalettes(const u8*, int, int);
extern struct_02036540* sub_0805F2C8(void);
extern void sub_0805F7DC(u32, struct_02036540*);
extern void sub_0805F300(struct_02036540*);
extern void sub_08050A64(u32);
extern void sub_08050AFC(u32);
extern const struct_080FC844 gUnk_080FC844;
extern const u16 gUnk_080FC85C[][3];
extern void (*const gUnk_080FC908[])(void);
extern const u16 gUnk_080FC8DE[];
extern const u8 gGlobalGfxAndPalettes[];
extern void (*const gUnk_080FC93C[])();
#endif

View File

@ -65,12 +65,6 @@ extern u32 IsItemEquipped(u32);
extern void DeleteManager(Manager*); extern void DeleteManager(Manager*);
extern bool32 CheckPlayerInRegion(u32 centerX, u32 centerY, u32 radiusX, u32 radiusY); extern bool32 CheckPlayerInRegion(u32 centerX, u32 centerY, u32 radiusX, u32 radiusY);
extern u32 CheckIsDungeon(); extern u32 CheckIsDungeon();
extern void HandleIntroScreen(void);
extern void HandleChooseFileScreen(void);
extern void HandleGameplayScreen(void);
extern void HandleGameOverScreen(void);
extern void HandleCreditsScreen(void);
extern void HandleDebugTextScreen(void);
extern u32 GetTileTypeByEntity(Entity*); extern u32 GetTileTypeByEntity(Entity*);
// Unidentified // Unidentified
@ -136,7 +130,7 @@ extern s32 sub_0807887C(Entity*, u32, u32);
extern s32 sub_08078904(); extern s32 sub_08078904();
extern void sub_0805E5A8(void); extern void sub_0805E5A8(void);
extern void sub_0805E5C0(void); extern void sub_0805E5C0(void);
extern void sub_080AD90C(void); extern void FlushSprites(void);
extern void sub_080AD9B0(void); extern void sub_080AD9B0(void);
extern void sub_080AD918(void); extern void sub_080AD918(void);
extern void sub_0801E104(void); extern void sub_0801E104(void);
@ -190,7 +184,7 @@ extern void sub_0804F578(void);
extern void sub_08059994(void); extern void sub_08059994(void);
extern s32 sub_0801CFA8(u32); extern s32 sub_0801CFA8(u32);
extern void sub_080A3210(void); extern void sub_080A3210(void);
extern void sub_080ADA14(u32, u32); extern void sub_080ADA14(u32, u32); // trampoline to sub_080B27F4
extern void sub_0801E1B8(u32, u32); extern void sub_0801E1B8(u32, u32);
extern void sub_0801E1EC(s32, s32, s32); extern void sub_0801E1EC(s32, s32, s32);
extern void sub_08050008(void); extern void sub_08050008(void);
@ -203,7 +197,6 @@ extern u32 sub_080A4494(void);
extern void sub_080A4528(void); extern void sub_080A4528(void);
extern void sub_080A4398(void); extern void sub_080A4398(void);
extern void sub_0801E738(u32); extern void sub_0801E738(u32);
extern void sub_080A70AC(const void*);
extern void sub_080A7114(u32); extern void sub_080A7114(u32);
extern void sub_08001324(Entity*); extern void sub_08001324(Entity*);
extern void sub_08001242(Entity*); extern void sub_08001242(Entity*);
@ -219,7 +212,7 @@ extern void sub_0807A108(void);
extern void sub_0801766C(Entity*); extern void sub_0801766C(Entity*);
extern void sub_08004168(Entity*); extern void sub_08004168(Entity*);
extern u32 sub_08052638(u32); extern u32 sub_08052638(u32);
extern void sub_0805616C(void); extern void InitDMA(void);
extern u32 sub_0807CF08(u32, u8*); extern u32 sub_0807CF08(u32, u8*);
extern void sub_0807CF48(u32); extern void sub_0807CF48(u32);
extern u32 sub_0807CF10(u8*); extern u32 sub_0807CF10(u8*);
@ -227,12 +220,11 @@ extern void sub_08056208(void);
extern void sub_08050384(); extern void sub_08050384();
extern void sub_080B1520(u32); extern void sub_080B1520(u32);
extern struct_0807D1C4* sub_0807D1C4(u32); extern struct_0807D1C4* sub_0807D1C4(u32);
extern u32 sub_0807D24C(u32, char*, u32); extern u32 sub_0807D24C(u32, const char*, u32);
extern void sub_0807CF68(u32); extern void sub_0807CF68(u32);
extern void sub_0807D20C(u32, char*, u32); extern void sub_0807D20C(u32, const char*, u32);
extern u32 sub_0807CF88(u32, u8*); extern u32 sub_0807CF88(u32, u8*);
extern u32 sub_0807D008(u32, void*); extern void sub_0807D184(u32, const char*);
extern void sub_0807D184(u32, char*);
extern u32 sub_0806F520(); extern u32 sub_0806F520();
extern void sub_0806F4E8(Entity*); extern void sub_0806F4E8(Entity*);
extern u32 sub_0806F3E4(Entity*); extern u32 sub_0806F3E4(Entity*);
@ -323,7 +315,7 @@ extern void sub_08008790(Entity*, u32);
extern void sub_0804ACF8(); extern void sub_0804ACF8();
extern void sub_08073904(Entity*); extern void sub_08073904(Entity*);
extern u32 sub_08056134(void); extern u32 sub_08056134(void);
extern u32 sub_0807CF30(void*); extern u32 sub_0807CF30(SaveFile*);
extern void sub_08004484(Entity*, Entity*); extern void sub_08004484(Entity*, Entity*);
extern void sub_080564C8(u32); extern void sub_080564C8(u32);
extern void sub_08056F70(void); extern void sub_08056F70(void);

View File

@ -13,6 +13,26 @@ typedef struct { // 0x03001000
u8 field_0xb; u8 field_0xb;
u32 spritePriority; u32 spritePriority;
} MainStruct; } MainStruct;
#define SIGNATURE 'MCZ3'
#define MAX_MSG_SPEED 3
#define NUM_SAVE_SLOTS 3
#define MAX_BRIGHTNESS 3
typedef enum {
LANGUAGE_JP,
LANGUAGE_EN,
LANGUAGE_FR,
LANGUAGE_DE,
LANGUAGE_ES,
LANGUAGE_IT,
NUM_LANGUAGES,
} Language;
#ifdef ENGLISH
#define GAME_LANGUAGE LANGUAGE_EN
#else
#define GAME_LANGUAGE LANGUAGE_JP
#endif
enum { enum {
SCREEN_INTRO, SCREEN_INTRO,
@ -23,13 +43,6 @@ enum {
SCREEN_DEBUG_TEXT, SCREEN_DEBUG_TEXT,
}; };
#define GAME_LANGUAGE GAME_LANGUAGE_EN
#define SIGNATURE 'MCZ3'
#define GAME_LANGUAGE_EN 1
#define MAX_MSG_SPEED 3
#define MAX_SAVE_FILES 3
#define MAX_BRIGHTNESS 3
typedef struct { typedef struct {
u8 interruptFlag; u8 interruptFlag;
u8 field_0x1; u8 field_0x1;
@ -47,7 +60,7 @@ typedef struct {
typedef struct { typedef struct {
/*0x00*/ u16 nextToLoad; /*0x00*/ u16 nextToLoad;
/*0x02*/ u8 transitionType; /*0x02*/ u8 lastState;
/*0x03*/ u8 field_0x3; /*0x03*/ u8 field_0x3;
/*0x04*/ u8 state; /*0x04*/ u8 state;
/*0x05*/ u8 field_0x5; /*0x05*/ u8 field_0x5;
@ -62,7 +75,7 @@ static_assert(sizeof(UI) == 0x3b4);
extern Main gUnk_03001000; extern Main gUnk_03001000;
extern UI gUnk_02032EC0; extern UI gUnk_02032EC0;
extern void sub_080A3204(void); extern void InitSound(void);
extern void sub_0807CE90(void); extern void sub_0807CE90(void);
extern void sub_080560B8(void); extern void sub_080560B8(void);
extern void sub_08056208(void); extern void sub_08056208(void);
@ -76,9 +89,19 @@ extern void ReadKeyInput(void);
extern void DoSoftReset(void); extern void DoSoftReset(void);
extern void sub_08056260(void); extern void sub_08056260(void);
extern void VBlankIntrWait(); extern void VBlankIntrWait();
extern s32 _call_via_r0(s32);
extern void sub_08056458(void); extern void sub_08056458(void);
extern void sub_08050154(void); extern void sub_08050154(void);
extern void sub_080A3480(void); extern void sub_080A3480(void);
extern u8 gUnk_03003DE4;
extern void sub_0804FF84(u32);
extern u16 gPaletteBuffer[];
extern void VBlankInterruptWait(void);
extern void DisableInterruptsAndDMA(void);
extern void sub_08016B34(void);
static void sub_08055F70(void);
static bool32 SoftResetKeysPressed(void);
#endif #endif

View File

@ -17,9 +17,30 @@ typedef struct {
u32 filler3[3]; u32 filler3[3];
} MenuControls; } MenuControls;
typedef struct {
u8 key;
u8 value;
} KeySetting;
typedef struct {
u8 aButtonX;
u8 aButtonY;
u8 aButtonText;
u8 bButtonX;
u8 bButtonY;
u8 bButtonText;
u8 rButtonX;
u8 rButtonY;
u8 rButtonText;
KeySetting settingDict[0];
u8 eof;
} PACKED KeyButtonLayout;
extern void sub_080A70AC(const KeyButtonLayout*);
typedef struct { typedef struct {
u8 field_0x0; u8 field_0x0;
u8 field_0x1; u8 column_idx;
u8 field_0x2; u8 field_0x2;
u8 field_0x3; u8 field_0x3;
u8 field_0x4; u8 field_0x4;

View File

@ -76,7 +76,7 @@ extern void Object44(Entity*);
extern void Object45(Entity*); extern void Object45(Entity*);
extern void GiantBookLadder(Entity*); extern void GiantBookLadder(Entity*);
extern void HeartContainer(Entity*); extern void HeartContainer(Entity*);
extern void Object48(Entity*); extern void FileScreenObjects(Entity*);
extern void Object49(Entity*); extern void Object49(Entity*);
extern void BackgroundCloud(Entity*); extern void BackgroundCloud(Entity*);
extern void Object4B(Entity*); extern void Object4B(Entity*);

24
include/save.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef SAVE_H
#define SAVE_H
#include "global.h"
#include "entity.h"
#include "functions.h"
#include "menu.h"
#include "structures.h"
typedef enum {
SAVE_BUSY = 0,
SAVE_OK = 1,
SAVE_ERROR = 0xFFFFFFFF,
} SaveResult;
typedef enum {
SAVE_INIT,
SAVE_IN_PROGRESS,
SAVE_DONE,
} SaveState;
extern u32 sub_0807CDA4(SaveState state);
#endif

View File

@ -114,14 +114,15 @@ typedef struct {
} ScreenTransitionData; } ScreenTransitionData;
typedef struct { typedef struct {
/*0x00*/ u8 unk0; /*0x00*/ u8 isTransitioning;
/*0x01*/ u8 unk1; /*0x01*/ u8 unk1;
/*0x02*/ u8 unk2; /*0x02*/ u8 unk2;
/*0x03*/ u8 unk3; /*0x03*/ u8 unk3;
/*0x04*/ u8 filler4[0x2]; /*0x04*/ u8 filler4[0x2];
/*0x06*/ u8 unk6; /*0x06*/ u8 unk6;
/*0x07*/ u8 unk7; /*0x07*/ u8 unk7;
/*0x08*/ s8 unk8[0xE20]; /*0x08*/ s8 saveStatus[3];
/*0x0b*/ u8 unkB[0xE1D];
} struct_02019EE0; } struct_02019EE0;
extern struct_02019EE0 gUnk_02019EE0; extern struct_02019EE0 gUnk_02019EE0;
@ -147,9 +148,9 @@ extern struct_03000FD0 gFadeControl;
typedef struct { typedef struct {
u8 filler0[0x1A]; u8 filler0[0x1A];
u16 unk1A; u16 rButtonX;
u8 filler1C[0x4]; u8 filler1C[0x4];
u16 unk20; u16 rButtonY;
u8 filler22[0x2]; u8 filler22[0x2];
u8 ezloNagFuncIndex; u8 ezloNagFuncIndex;
u8 filler25[0x30F]; u8 filler25[0x30F];
@ -200,6 +201,7 @@ typedef struct {
} BGBuffer; } BGBuffer;
extern BGBuffer gBG0Buffer; extern BGBuffer gBG0Buffer;
extern BGBuffer gBG1Buffer; extern BGBuffer gBG1Buffer;
extern BGBuffer gBG2Buffer;
static_assert(sizeof(BGBuffer) == 0x800); static_assert(sizeof(BGBuffer) == 0x800);
/* /*

View File

@ -19,10 +19,46 @@ typedef struct {
u16 field_0xe; u16 field_0xe;
u32 field_0x10; u32 field_0x10;
} TextBox; } TextBox;
extern TextBox gTextBox; extern TextBox gTextBox;
void TextboxNoOverlap(u32 index, Entity* ent); typedef struct {
u8 _0;
u8 _1;
u8 _2;
u8 _3[5];
u16 _8;
u8 _b[0x16];
u8 _20;
u8 _21;
u8 _22[0xa];
void* _2c;
u8 _30[0x23];
u8 _53;
u16 _54;
u8 _56[0x2];
void* _58;
u8 _5c;
u8 _5d;
u8 _5e[24];
u8 _76;
u8 _77[0x11];
u8 _88;
u8 _89;
u8 _8a;
u8 _8b[0xe];
u8 _99;
u8 _9a;
u8 _9b;
u8 _9c;
u8 _9d;
u8 _9e[0xa];
} struct_02022780;
extern struct_02022780 gUnk_02022780;
static_assert(sizeof(struct_02022780) == 0xa8);
void ShowTextbox(u32 index);
void TextboxAtPosition(u32 index, u32 x, u32 y);
void TextboxNoOverlap(u32 index, Entity* ent);
void TextboxNoOverlapFollow(u32 index);
extern void TextboxNoOverlapFollow(u32 index);
#endif #endif

View File

@ -87,7 +87,11 @@ SECTIONS {
. = 0x00022740; gUnk_02022740 = .; . = 0x00022740; gUnk_02022740 = .;
. = 0x00022750; gUnk_02022750 = .; . = 0x00022750; gUnk_02022750 = .;
. = 0x00022780; gUnk_02022780 = .; . = 0x00022780; gUnk_02022780 = .;
. = 0x000227DC; gUnk_020227DC = .;
. = 0x000227E8; gUnk_020227E8 = .; . = 0x000227E8; gUnk_020227E8 = .;
. = 0x000227F0; gUnk_020227F0 = .;
. = 0x000227F8; gUnk_020227F8 = .;
. = 0x00022800; gUnk_02022800 = .;
. = 0x0002281E; gUnk_0202281E = .; . = 0x0002281E; gUnk_0202281E = .;
. = 0x00022830; gUnk_02022830 = .; . = 0x00022830; gUnk_02022830 = .;
. = 0x00024030; gUnk_02024030 = .; . = 0x00024030; gUnk_02024030 = .;
@ -124,7 +128,7 @@ SECTIONS {
. = 0x00034490; gUnk_02034490 = .; . = 0x00034490; gUnk_02034490 = .;
. = 0x00034492; gUnk_02034492 = .; . = 0x00034492; gUnk_02034492 = .;
. = 0x000344A0; gUnk_020344A0 = .; . = 0x000344A0; gUnk_020344A0 = .;
. = 0x000344B0; gUnk_020344B0 = .; . = 0x000344B0; gBG2Buffer = .;
. = 0x000344F0; gUnk_020344F0 = .; . = 0x000344F0; gUnk_020344F0 = .;
. = 0x00034CB0; gBG0Buffer = .; . = 0x00034CB0; gBG0Buffer = .;
. = 0x00034CB2; gUnk_02034CB2 = .; . = 0x00034CB2; gUnk_02034CB2 = .;
@ -452,8 +456,8 @@ SECTIONS {
src/sub_08050008.o(.text); src/sub_08050008.o(.text);
src/sub_08050024.o(.text); src/sub_08050024.o(.text);
asm/code_08050038.o(.text); asm/code_08050038.o(.text);
src/chooseFile.o(.text); src/fileScreen.o(.text);
asm/chooseFile.o(.text); asm/fileScreen.o(.text);
asm/sub_08052418.o(.text); asm/sub_08052418.o(.text);
src/initializePlayer.o(.text); src/initializePlayer.o(.text);
src/area.o(.text); src/area.o(.text);
@ -671,7 +675,7 @@ SECTIONS {
asm/getInventoryValue.o(.text); asm/getInventoryValue.o(.text);
asm/code_0807CAA0.o(.text); asm/code_0807CAA0.o(.text);
src/flags.o(.text); src/flags.o(.text);
src/code_0807CC3C.o(.text); src/save.o(.text);
asm/code_0807CC3C.o(.text); asm/code_0807CC3C.o(.text);
src/executeScriptCommandSet.o(.text); src/executeScriptCommandSet.o(.text);
asm/code_0807F0D8.o(.text); asm/code_0807F0D8.o(.text);
@ -755,7 +759,7 @@ SECTIONS {
asm/object45.o(.text); asm/object45.o(.text);
asm/giantBookLadder.o(.text); asm/giantBookLadder.o(.text);
src/object/heartContainer.o(.text); src/object/heartContainer.o(.text);
src/object/object48.o(.text); src/object/fileScreenObjects.o(.text);
src/object/object49.o(.text); src/object/object49.o(.text);
src/object/backgroundCloud.o(.text); src/object/backgroundCloud.o(.text);
asm/object4B.o(.text); asm/object4B.o(.text);
@ -992,20 +996,23 @@ SECTIONS {
data/data_080D3D94.o(.rodata); data/data_080D3D94.o(.rodata);
data/entity_headers.o(.rodata); data/entity_headers.o(.rodata);
data/data_080D5360.o(.rodata); data/data_080D5360.o(.rodata);
src/fileScreen.o(.rodata);
data/data_080FC8A4.o(.rodata);
src/main.o(.rodata); src/main.o(.rodata);
data/tileset_headers.o(.rodata); data/tileset_headers.o(.rodata);
data/metatile_headers.o(.rodata); data/metatile_headers.o(.rodata);
data/map_headers.o(.rodata); data/map_headers.o(.rodata);
src/textbox.o(.rodata);
data/data_08107BC8.o(.rodata); data/data_08107BC8.o(.rodata);
src/manager/manager5.o(.rodata); src/manager/manager5.o(.rodata);
src/manager/manager7.o(.rodata); src/manager/manager7.o(.rodata);
. = ALIGN(4); . = ALIGN(4);
src/manager/manager9.o(.rodata); src/manager/manager9.o(.rodata);
src/manager/managerA.o(.rodata); src/manager/managerA.o(.rodata);
src/manager/managerB.o(.rodata); src/manager/managerB.o(.rodata);
src/manager/managerC.o(.rodata); src/manager/managerC.o(.rodata);
data/data_08108308.o(.rodata); data/data_08108308.o(.rodata);
src/manager/manager1E.o(.rodata); src/manager/manager1E.o(.rodata);
data/data_08108C94.o(.rodata); data/data_08108C94.o(.rodata);
src/manager/manager26.o(.rodata); src/manager/manager26.o(.rodata);
src/manager/manager27.o(.rodata); src/manager/manager27.o(.rodata);
@ -1014,8 +1021,9 @@ SECTIONS {
src/item.o(.rodata); src/item.o(.rodata);
data/data_0811BD44.o(.rodata); data/data_0811BD44.o(.rodata);
data/room_headers.o(.rodata); data/room_headers.o(.rodata);
src/save.o(.rodata);
data/data_0811E454.o(.rodata); data/data_0811E454.o(.rodata);
src/executeScriptCommandSet.o(.rodata); src/executeScriptCommandSet.o(.rodata);
data/data_0811E750.o(.rodata); data/data_0811E750.o(.rodata);
src/object/greatFairy.o(.rodata); src/object/greatFairy.o(.rodata);
data/animations/greatFairy.o(.rodata); data/animations/greatFairy.o(.rodata);

View File

@ -1,557 +0,0 @@
#include "global.h"
#include "functions.h"
#include "main.h"
#include "player.h"
#include "readKeyInput.h"
#include "screen.h"
typedef struct {
u8 filler0[0x5];
u8 state;
u8 subState;
u16 timer;
u8 fillerA[0x26];
} ChooseFileState;
// TODO: This occupies the same memory region as gMenu
extern ChooseFileState gChooseFileState;
typedef struct {
u8 filler0[0x1];
u8 unk1;
u8 unk2;
u8 unk3;
u16 unk4;
u16 unk6;
u8* unk8;
} struct_02036540;
typedef struct {
u8 filler0[0x10];
u16 unk10;
u8 filler12[0x6];
} struct_080FC844;
typedef struct {
u8 filler0[0x4];
} struct_020227E8;
extern struct_020227E8 gUnk_020227E8;
extern SaveFile gSaveFiles[];
extern u32 gUsedPalettes;
extern u8 gUnk_02000D00[];
extern u16 gUnk_03001010[5];
static void sub_08050624(u32);
static void sub_0805066C(void);
static void sub_080507FC(void);
extern void sub_08056FEC(u32, struct_020227E8*);
extern void sub_0805F46C(u32, struct_080FC844*);
extern void sub_0801C4A0(u32, u32);
extern void sub_08080668(void);
extern void sub_0805194C(u32);
extern void LoadPalettes(const u8*, int, int);
extern struct_02036540* sub_0805F2C8(void);
extern void sub_0805F7DC(u32, struct_02036540*);
extern void sub_0805F300(struct_02036540*);
extern void sub_08050A64(u32);
extern void sub_08050AFC(u32);
extern const struct_080FC844 gUnk_080FC844;
extern const u16 gUnk_080FC85C[][3];
extern void (*const gUnk_080FC8A4[])(void);
extern void (*const gUnk_080FC8B0[])(void);
extern void (*const gUnk_080FC8FC[])(void);
extern void (*const gUnk_080FC908[])(void);
extern const u8 gUnk_080FC8D0[];
extern const u16 gUnk_080FC8DE[];
extern const u8 gGlobalGfxAndPalettes[];
void sub_08050318(u32 arg0, u32 arg1) {
u32 sfx;
struct_080FC844 var0;
sub_08050384();
_DmaCopy(&gUnk_080FC844, &var0, sizeof(gUnk_080FC844));
sub_08056FEC(arg1, &gUnk_020227E8);
var0.unk10 |= gUnk_080FC85C[arg0][0] << 0xC;
sub_0805F46C(gUnk_080FC85C[arg0][1], &var0);
sfx = gUnk_080FC85C[arg0][2];
if (sfx) {
PlaySFX(sfx);
}
gScreen.bg.bg3Control = 1;
}
void sub_08050384(void) {
sub_0801C4A0(0, 0);
_DmaZero(&gBG0Buffer, sizeof(gBG0Buffer));
gScreen.bg.bg3Control = 1;
}
void sub_080503A8(u32 gfxGroup) {
LoadGfxGroup(gfxGroup);
gScreen.bg.bg2yOffset = 1;
gScreen.affine.unk = 1;
}
void sub_080503BC(u8 state) {
gUnk_02032EC0.state = state;
_DmaZero(&gBG0Buffer, sizeof(gBG0Buffer));
_DmaZero(&gBG1Buffer, sizeof(gBG1Buffer));
}
void sub_080503E4(u32 saveFileId) {
u8 messageSpeed;
u8 brightnessPref;
if (saveFileId > 2) {
messageSpeed = 1;
brightnessPref = 1;
} else {
SaveFile* saveFile = &gSaveFiles[saveFileId];
messageSpeed = saveFile->messageSpeed;
brightnessPref = saveFile->brightnessPref;
}
((struct_02000000*)0x2000000)->messageSpeed = messageSpeed;
((struct_02000000*)0x2000000)->brightnessPref = brightnessPref;
gUsedPalettes = 0xFFFFFFFF;
}
void sub_0805041C(u32 saveFileId) {
SaveFile* saveFile;
if (saveFileId < 3) {
((struct_02000000*)0x2000000)->saveFileId = saveFileId;
saveFile = &gSaveFiles[saveFileId];
_DmaCopy(saveFile, &gUnk_02002A40, sizeof(*saveFile));
}
sub_080503E4(saveFileId);
}
void HandleChooseFileScreen(void) {
sub_080AD90C();
gUnk_080FC8A4[gUnk_03001000.funcIndex]();
if (gUnk_02032EC0.transitionType != gUnk_02032EC0.state) {
gUnk_02032EC0.transitionType = gUnk_02032EC0.state;
gScreen.bg.bg1Control = 0;
gScreen.bg.bg2Control = 0;
gScreen.bg.bg1yOffset = 0;
gScreen.bg.bg2xOffset = 0;
gScreen.affine.bg2xOffset = 0;
gScreen.affine.bg2yOffset = 0;
_DmaZero(&gChooseFileState, sizeof(gChooseFileState));
}
sub_080507FC();
gUnk_080FC8B0[gUnk_02032EC0.transitionType]();
gUnk_02019EE0.unk0 = 0;
sub_0805E5C0();
sub_0805066C();
sub_0801C1D4();
sub_0801C208();
sub_080AD9B0();
sub_080AD918();
if (gUnk_02019EE0.unk3 != ((struct_02000000*)0x2000000)->gameLanguage) {
gUnk_02019EE0.unk3 = ((struct_02000000*)0x2000000)->gameLanguage;
sub_080503A8(0x6);
sub_080503A8(0xF);
}
}
void sub_080504F4(void) {
u32 i;
sub_0801DA90(1);
sub_080A3210();
_DmaZero((void*)VRAM, 0x80);
sub_08056418();
EraseAllEntities();
sub_08080668();
sub_080ADD30();
sub_0801CFA8(0);
_DmaZero(&gUnk_0200AF00, sizeof(gUnk_0200AF00));
_DmaZero(&gUnk_02019EE0, sizeof(gUnk_02019EE0));
gUnk_02019EE0.unk3 = 7;
gUnk_02019EE0.unk6 = ((struct_02000000*)0x2000000)->gameLanguage > 1 ? 3 : 0;
_DmaZero(&gUnk_02032EC0, sizeof(gUnk_02032EC0));
gUnk_02032EC0.transitionType = 8;
sub_080503BC(0);
sub_0805616C();
sub_08050624(0);
sub_08050624(1);
sub_08050624(2);
sub_08056208();
sub_080503A8(0x5);
LoadPaletteGroup(0x9);
for (i = 0; i < 26; i++) {
CreateObject(0x48, i, 0);
}
sub_080A70AC(gUnk_080FC8D0);
sub_080507FC();
gScreen.lcd.displayControl |= 0x1F00;
gScreen.affine.bg3Control = 0x1E0B;
gScreen.controls.layerFXControl = 0x844;
gScreen.controls.alphaBlend = BLDALPHA_BLEND(15, 10);
gUnk_02024490.unk0 = 1;
gUnk_03001000.funcIndex = 1;
PlaySFX(0x7);
DoFade(4, 8);
}
void nullsub_479(void) {
}
void sub_0805060C(void) {
if (!gFadeControl.active) {
InitScreen(SCREEN_GAMEPLAY);
}
}
static void sub_08050624(u32 saveFileId) {
SaveFile* saveFile = &gSaveFiles[saveFileId];
int var0 = sub_0807CF28(saveFileId, saveFile);
switch (var0) {
case -1:
sub_0807CF48(saveFileId);
// fallthrough
case 0:
sub_0805194C(saveFileId);
break;
}
gUnk_02019EE0.unk8[saveFileId] = var0;
}
static void sub_0805066C(void) {
u32 loadNewPalette;
const u8* paletteOffset;
loadNewPalette = FALSE;
if (--gUnk_02019EE0.unk1 == 0) {
gUnk_02019EE0.unk1 = 16;
gUnk_02019EE0.unk2 = (gUnk_02019EE0.unk2 + 1) % 15;
loadNewPalette = TRUE;
}
if (gUnk_02019EE0.unk2 == 0) {
gUnk_02019EE0.unk2 = 1;
gUnk_02019EE0.unk1 = (Random() & 0x7) * 16 + 8;
loadNewPalette = TRUE;
}
if (loadNewPalette) {
paletteOffset = &gGlobalGfxAndPalettes[gUnk_080FC8DE[gUnk_02019EE0.unk2]];
LoadPalettes(&paletteOffset[0x11AA0], 11, 1);
LoadPalettes(&paletteOffset[0x11BA0], 12, 1);
LoadPalettes(&paletteOffset[0x11CA0], 13, 1);
LoadPalettes(&paletteOffset[0x11DA0], 14, 1);
}
}
void sub_0805070C(void) {
u32 i;
int j;
struct_02036540* var0;
u8* playerName;
var0 = sub_0805F2C8();
if (var0) {
var0->unk2 = 0;
var0->unk3 = 5;
var0->unk1 = 1;
var0->unk4 = 0x30;
var0->unk8 = gUnk_02000D00;
for (i = 0; i < 3; i++) {
var0->unk6 = 0;
_DmaZero(var0->unk8, 0x200);
playerName = gSaveFiles[i].playerName;
for (j = 0; j < 6; j++) {
sub_0805F7DC(playerName[j], var0);
}
_DmaCopy(var0->unk8, (void*)(OBJ_VRAM0 + 0x4000 + i * 0x200), 0x200);
}
sub_0805F300(var0);
}
}
void sub_08050790(void) {
u32 i, j;
struct_02036540* var0;
u32 var1;
var0 = sub_0805F2C8();
if (var0) {
var0->unk2 = 0;
var0->unk3 = 5;
var0->unk1 = 1;
var0->unk4 = 0x80;
var0->unk8 = gUnk_02000D00;
for (i = 0; i < 16; i++) {
var0->unk6 = 0;
var1 = i * 16;
for (j = 0; j < 16; j++) {
sub_0805F7DC(var1, var0);
var1++;
}
_DmaCopy(gUnk_02000D00, (void*)(BG_VRAM + i * 0x400), 0x400);
}
sub_0805F300(var0);
}
}
static void sub_080507FC(void) {
gUnk_0200AF00.unk1A = 0x140;
gUnk_0200AF00.unk20 = 0x24;
}
void sub_08050810(void) {
gUnk_0200AF00.unk1A = 0xD0;
gUnk_0200AF00.unk20 = 0x24;
}
void sub_08050820(void) {
gUnk_080FC8FC[gChooseFileState.state]();
sub_08050A64(gUnk_02019EE0.unk6);
}
void sub_08050848(void) {
sub_080503A8(0x7);
sub_0805070C();
gUnk_02019EE0.unk7 = 0;
sub_08050AFC(gUnk_02019EE0.unk6);
sub_080A7114(1);
}
void sub_0805086C(void) {
gUnk_080FC908[gChooseFileState.subState]();
}
void sub_08050888(void) {
if (!gFadeControl.active) {
switch (gUnk_02019EE0.unk8[gUnk_02019EE0.unk7]) {
case 0:
sub_0805194C(gUnk_02019EE0.unk7);
gChooseFileState.subState = 2;
break;
case 1:
gChooseFileState.subState = 2;
break;
default:
sub_0805194C(gUnk_02019EE0.unk7);
sub_08050318(0, gUnk_02019EE0.unk7 + 1);
gChooseFileState.timer = 30;
gChooseFileState.subState = 1;
break;
}
}
}
void sub_080508E4(void) {
if (gChooseFileState.timer == 0) {
if (gUnk_03000FF0.newKeys & (A_BUTTON | START_BUTTON)) {
gChooseFileState.subState = 2;
}
} else {
gChooseFileState.timer--;
}
}
void sub_08050910(void) {
sub_08050384();
if (++gUnk_02019EE0.unk7 > 2) {
sub_080A7114(2);
} else {
gChooseFileState.subState = 0;
}
}
void sub_08050940(void) {
int saveFileId;
u32 newKeys;
int var1;
u32 var2;
if (gUnk_02019EE0.unk0) {
return;
}
saveFileId = gUnk_02019EE0.unk6;
newKeys = gUnk_03000FF0.newKeys;
if ((gUnk_03000FF0.heldKeys & L_BUTTON) && gUnk_02019EE0.unk8[saveFileId] == 1) {
newKeys &= ~(DPAD_UP | DPAD_DOWN);
}
var1 = ((struct_02000000*)0x2000000)->gameLanguage > 1 ? 4 : 3;
var2 = gUnk_02032EC0.transitionType;
switch (newKeys) {
case DPAD_UP:
if (saveFileId > 0) {
saveFileId--;
}
break;
case DPAD_DOWN:
if (var1 - 1 > saveFileId) {
saveFileId++;
}
break;
case R_BUTTON:
if (gUnk_02019EE0.unk8[saveFileId] == 1) {
var2 = 3;
}
break;
case A_BUTTON:
case START_BUTTON:
sub_0805041C(saveFileId);
if (saveFileId == 3) {
var2 = 2;
} else {
switch (gUnk_02019EE0.unk8[saveFileId]) {
case 0:
var2 = 1;
break;
case 1:
var2 = 4;
break;
}
}
break;
}
if (gUnk_02032EC0.transitionType != var2) {
sub_080503BC(var2);
PlaySFX(0x6A);
}
saveFileId = (saveFileId + var1) % var1;
if (gUnk_02019EE0.unk6 != saveFileId) {
gUnk_02019EE0.unk6 = saveFileId;
sub_08050AFC(saveFileId);
PlaySFX(0x69);
}
if (gUnk_02019EE0.unk8[gUnk_02019EE0.unk6] == 1) {
sub_08050810();
}
}
void sub_08050A64(u32 saveFileId) {
if (gUnk_02019EE0.unk8[saveFileId] != 1) {
return;
}
gUnk_03001010[2] = 0;
gUnk_03001010[3] = 0;
gUnk_03001010[4] = 0x400;
// Draw the save file's obtained elements.
if (GetInventoryValue(0x40)) {
gUnk_03001010[0] = 0xA2;
gUnk_03001010[1] = 0x36;
sub_080ADA14(0x145, 0x24);
}
if (GetInventoryValue(0x41)) {
gUnk_03001010[0] = 0x96;
gUnk_03001010[1] = 0x3D;
sub_080ADA14(0x145, 0x22);
}
if (GetInventoryValue(0x42)) {
gUnk_03001010[0] = 0xAE;
gUnk_03001010[1] = 0x3D;
sub_080ADA14(0x145, 0x23);
}
if (GetInventoryValue(0x43)) {
gUnk_03001010[0] = 0xA2;
gUnk_03001010[1] = 0x44;
sub_080ADA14(0x145, 0x21);
}
}
void sub_08050B3C(u16*);
void sub_08050AFC(u32 saveFileId) {
sub_0805041C(saveFileId);
_DmaZero(&gBG1Buffer, sizeof(gBG1Buffer));
if (gUnk_02019EE0.unk8[saveFileId] == 1) {
sub_08050B3C(&gBG1Buffer.unk29C);
}
gScreen.bg.bg2yOffset = 1;
}
// typedef struct {
// u16* unk0;
// u32 unk4;
// } unk_08050B3C;
// extern const u16 gUnk_080FC914[];
// void sub_08050B3C(u16* arg0) {
// unk_08050B3C sp;
// int var0;
// int var1;
// int var2;
// int var3;
// int var4;
// int var5;
// int var6;
// int var7;
// u16* var8;
// sp.unk0 = arg0;
// var0 = gUnk_02002A40.stats.health * 2;
// if (var0 == 0) {
// var0 = 1;
// }
// var1 = gUnk_02002A40.stats.maxHealth * 2;
// if (var1 == 0) {
// return;
// }
// if (var0 > var1) {
// var0 = var1;
// }
// sp.unk4 = var0 & 0x3;
// var2 = var0 >> 2;
// var5 = var2;
// if (var2 > 10) {
// var5 = 10;
// }
// var6 = var2;
// var6 -= 10;
// var7 = var6;
// if (var6 < 0) {
// var7 = 0;
// }
// var1 = var1 >> 2;
// var4 = var1;
// if (var1 > 10) {
// var1 = 10;
// }
// var4 -= 10;
// sp.unk0[0] = 0xF24C;
// DmaCopy16(3, &gUnk_080FC914[10 - var5], &sp.unk0[1], var1 * 2);
// if (var4 > 0) {
// sp.unk0[0x20] = 0xF24C;
// DmaCopy16(3, &gUnk_080FC914[10 - var7], &sp.unk0[1], var4 * 2);
// }
// if (!sp.unk4) {
// return;
// }
// var8 = sp.unk0;
// if (var2 >= 10) {
// var2 = var6;
// var8 += 0x20;
// }
// var8[var2 + 1] = sp.unk4 - 0xDB3;
// }

View File

@ -47,7 +47,7 @@ void sub_0804AAD4(void) {
void sub_0804AB04(void) { void sub_0804AB04(void) {
sub_0805E5C0(); sub_0805E5C0();
if (gArea.field_0x10 != 0) { if (gArea.field_0x10 != 0) {
sub_080AD90C(); FlushSprites();
sub_080AD9B0(); sub_080AD9B0();
sub_080AD918(); sub_080AD918();
} }

View File

@ -39,7 +39,6 @@ void sub_08080910(void) {
void sub_0808091C(ScreenTransitionData* param_1, u32 param_2) { void sub_0808091C(ScreenTransitionData* param_1, u32 param_2) {
DoExitTransition(param_1); DoExitTransition(param_1);
gScreenTransition.transitionType = param_2; gScreenTransition.transitionType = param_2;
return;
} }
void sub_08080930(void) void sub_08080930(void)
@ -50,7 +49,6 @@ void sub_08080930(void)
gRoomControls.unk2 = 2; gRoomControls.unk2 = 2;
gRoomControls.filler[0] = 0; gRoomControls.filler[0] = 0;
sub_0805E5A8(); sub_0805E5A8();
return;
} }
u32* GetLayerByIndex(u32 param_1) { u32* GetLayerByIndex(u32 param_1) {
@ -65,7 +63,6 @@ u32* GetLayerByIndex(u32 param_1) {
void sub_08080964(u32 time, u32 magnitude) { void sub_08080964(u32 time, u32 magnitude) {
gRoomControls.screenShakeTime = time; gRoomControls.screenShakeTime = time;
gRoomControls.screenShakeMagnitude = magnitude & 7; gRoomControls.screenShakeMagnitude = magnitude & 7;
return;
} }
void sub_08080974(u32 arg0, u32 arg1) { void sub_08080974(u32 arg0, u32 arg1) {

680
src/fileScreen.c Normal file
View File

@ -0,0 +1,680 @@
#include "fileScreen.h"
// copy, erase, start
#define NUM_FILE_OPERATIONS 3
// todo: does this belong with gUnk_02019EE0?
typedef enum {
SAVE_EMPTY = 0,
SAVE_VALID = 1,
SAVE_DELETED = 0xFFFFFFFF,
} SaveStatus;
typedef enum {
STATE_NONE,
STATE_NEW,
STATE_CHOOSE_LANG,
STATE_OPTIONS,
STATE_VIEW,
STATE_COPY,
STATE_ERASE,
STATE_START,
} FileSelectState;
static void HandleFileScreenEnter(void);
static void HandleFileScreenActive(void);
static void HandleFileScreenExit(void);
static void (*const sScreenHandlers[])(void) = {
HandleFileScreenEnter,
HandleFileScreenActive,
HandleFileScreenExit,
};
static void HandleFileSelect(void);
extern void HandleFileNew(void);
static void HandleFileLanguageSelect(void);
extern void HandleFileOptions(void);
static void HandleFileView(void);
extern void HandleFileCopy(void);
extern void HandleFileDelete(void);
extern void HandleFileStart(void);
static void (*const sFileScreenSubHandlers[])(void) = {
HandleFileSelect, HandleFileNew, HandleFileLanguageSelect, HandleFileOptions,
HandleFileView, HandleFileCopy, HandleFileDelete, HandleFileStart,
};
extern KeyButtonLayout gUnk_080FC8D0;
// static const KeyButtonLayout gUnk_080FC8D0 = {
// 0xFF, 0xD8, 0x0, 0xFF, 0xD8, 0x0, 0xE0, 0x10, 0xF, {{0x5, 0x0}, { 0x2, 0x0 }}, 0xFF
// };
// main "file selection" screen
extern void (*const sFileSelectDefaultHandlers[])(void);
// handles submenus
extern void (*const sFileScreenSubHandlers[])(void);
extern void (*const gUnk_080FC944[])(void);
static void sub_08050624(u32);
static void sub_0805066C(void);
static void HideButtonR(void);
static void ShowButtonR(void);
void sub_08050318(u32 arg0, u32 arg1) {
u32 sfx;
struct_080FC844 var0;
sub_08050384();
_DmaCopy(&gUnk_080FC844, &var0, sizeof(gUnk_080FC844));
sub_08056FEC(arg1, &gUnk_020227E8);
var0.unk10 |= gUnk_080FC85C[arg0][0] << 0xC;
sub_0805F46C(gUnk_080FC85C[arg0][1], &var0);
sfx = gUnk_080FC85C[arg0][2];
if (sfx) {
PlaySFX(sfx);
}
gScreen.bg.bg3Control = BGCNT_PRIORITY(1);
}
void sub_08050384(void) {
sub_0801C4A0(0, 0);
_DmaZero(&gBG0Buffer, sizeof(gBG0Buffer));
gScreen.bg.bg3Control = BGCNT_PRIORITY(1);
}
void sub_080503A8(u32 gfxGroup) {
LoadGfxGroup(gfxGroup);
gScreen.bg.bg2yOffset = 1;
gScreen.affine.unk = 1;
}
void SetFileSelectState(FileSelectState mode) {
gUnk_02032EC0.state = mode;
_DmaZero(&gBG0Buffer, sizeof(gBG0Buffer));
_DmaZero(&gBG1Buffer, sizeof(gBG1Buffer));
}
void LoadOptionsFromSave(u32 idx) {
u8 messageSpeed;
u8 brightnessPref;
if (idx >= NUM_SAVE_SLOTS) {
// these apply to the language selection screen
messageSpeed = 1;
brightnessPref = 1;
} else {
SaveFile* saveFile = &gSaveFiles[idx];
messageSpeed = saveFile->messageSpeed;
brightnessPref = saveFile->brightnessPref;
}
gUnk_02000000->messageSpeed = messageSpeed;
gUnk_02000000->brightnessPref = brightnessPref;
gUsedPalettes = 0xFFFFFFFF;
}
void SetActiveSave(u32 idx) {
if (idx < NUM_SAVE_SLOTS) {
gUnk_02000000->saveFileId = idx;
_DmaCopy(&gSaveFiles[idx], &gUnk_02002A40, sizeof(gSaveFiles[idx]));
}
LoadOptionsFromSave(idx);
}
void HandleChooseFileScreen(void) {
FlushSprites();
sScreenHandlers[gUnk_03001000.funcIndex]();
if (gUnk_02032EC0.lastState != gUnk_02032EC0.state) {
gUnk_02032EC0.lastState = gUnk_02032EC0.state;
gScreen.bg.bg1Control = 0;
gScreen.bg.bg2Control = 0;
gScreen.bg.bg1yOffset = 0;
gScreen.bg.bg2xOffset = 0;
gScreen.affine.bg2xOffset = 0;
gScreen.affine.bg2yOffset = 0;
_DmaZero(&gChooseFileState, sizeof(gChooseFileState));
}
HideButtonR();
sFileScreenSubHandlers[gUnk_02032EC0.lastState]();
gUnk_02019EE0.isTransitioning = FALSE;
sub_0805E5C0();
sub_0805066C();
sub_0801C1D4();
sub_0801C208();
sub_080AD9B0();
sub_080AD918();
if (gUnk_02019EE0.unk3 != gUnk_02000000->gameLanguage) {
gUnk_02019EE0.unk3 = gUnk_02000000->gameLanguage;
sub_080503A8(0x6);
sub_080503A8(0xF);
}
}
static void HandleFileScreenEnter(void) {
u32 i;
sub_0801DA90(1);
sub_080A3210();
_DmaZero((void*)VRAM, 0x80); // clear palettes
sub_08056418();
EraseAllEntities();
sub_08080668();
sub_080ADD30();
sub_0801CFA8(0);
_DmaZero(&gUnk_0200AF00, sizeof(gUnk_0200AF00));
_DmaZero(&gUnk_02019EE0, sizeof(gUnk_02019EE0));
gUnk_02019EE0.unk3 = 7;
gUnk_02019EE0.unk6 = gUnk_02000000->gameLanguage > LANGUAGE_EN ? 3 : 0;
_DmaZero(&gUnk_02032EC0, sizeof(gUnk_02032EC0));
gUnk_02032EC0.lastState = 8;
SetFileSelectState(STATE_NONE);
InitDMA();
sub_08050624(0);
sub_08050624(1);
sub_08050624(2);
sub_08056208();
sub_080503A8(0x5);
LoadPaletteGroup(0x9);
for (i = 0; i < 26; i++) {
CreateObject(0x48, i, 0);
}
sub_080A70AC(&gUnk_080FC8D0);
HideButtonR();
gScreen.lcd.displayControl |= DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
gScreen.affine.bg3Control = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(30);
gScreen.controls.layerFXControl = BLDCNT_TGT1_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND;
gScreen.controls.alphaBlend = BLDALPHA_BLEND(15, 10);
gUnk_02024490.unk0 = 1;
gUnk_03001000.funcIndex = 1;
PlaySFX(0x7);
DoFade(4, 8);
}
static void HandleFileScreenActive(void) {
}
static void HandleFileScreenExit(void) {
if (!gFadeControl.active) {
InitScreen(SCREEN_GAMEPLAY);
}
}
static void sub_08050624(u32 idx) {
SaveFile* saveFile = &gSaveFiles[idx];
int status = sub_0807CF28(idx, saveFile);
switch (status) {
case SAVE_DELETED:
sub_0807CF48(idx);
// fallthrough
case SAVE_EMPTY:
sub_0805194C(idx);
break;
}
gUnk_02019EE0.saveStatus[idx] = status;
}
static void sub_0805066C(void) {
u32 loadNewPalette;
const u8* paletteOffset;
loadNewPalette = FALSE;
if (--gUnk_02019EE0.unk1 == 0) {
gUnk_02019EE0.unk1 = 16;
gUnk_02019EE0.unk2 = (gUnk_02019EE0.unk2 + 1) % 15;
loadNewPalette = TRUE;
}
if (gUnk_02019EE0.unk2 == 0) {
gUnk_02019EE0.unk2 = 1;
gUnk_02019EE0.unk1 = (Random() & 0x7) * 16 + 8;
loadNewPalette = TRUE;
}
if (loadNewPalette) {
paletteOffset = &gGlobalGfxAndPalettes[gUnk_080FC8DE[gUnk_02019EE0.unk2]];
LoadPalettes(&paletteOffset[0x11AA0], 11, 1);
LoadPalettes(&paletteOffset[0x11BA0], 12, 1);
LoadPalettes(&paletteOffset[0x11CA0], 13, 1);
LoadPalettes(&paletteOffset[0x11DA0], 14, 1);
}
}
void sub_0805070C(void) {
u32 i;
int j;
struct_02036540* var0;
u8* playerName;
var0 = sub_0805F2C8();
if (var0) {
var0->charColor = 0;
var0->bgColor = 5;
var0->unk1 = 1;
var0->unk4 = 0x30;
var0->unk8 = gUnk_02000D00;
for (i = 0; i < 3; i++) {
var0->unk6 = 0;
_DmaZero(var0->unk8, 0x200);
playerName = gSaveFiles[i].playerName;
for (j = 0; j < 6; j++) {
sub_0805F7DC(playerName[j], var0);
}
// i is a struct of size 0x200
_DmaCopy(var0->unk8, (void*)(OBJ_VRAM0 + 0x4000 + i * 0x200), 0x200);
}
sub_0805F300(var0);
}
}
void sub_08050790(void) {
u32 i, j;
struct_02036540* var0;
u32 var1;
var0 = sub_0805F2C8();
if (var0) {
var0->charColor = 0;
var0->bgColor = 5;
var0->unk1 = 1;
var0->unk4 = 0x80;
var0->unk8 = gUnk_02000D00;
for (i = 0; i < 16; i++) {
var0->unk6 = 0;
var1 = i * 16;
for (j = 0; j < 16; j++) {
sub_0805F7DC(var1, var0);
var1++;
}
_DmaCopy(gUnk_02000D00, (void*)(BG_VRAM + i * 0x400), 0x400);
}
sub_0805F300(var0);
}
}
static void HideButtonR(void) {
gUnk_0200AF00.rButtonX = 0x140;
gUnk_0200AF00.rButtonY = 0x24;
}
static void ShowButtonR(void) {
gUnk_0200AF00.rButtonX = 0xD0;
gUnk_0200AF00.rButtonY = 0x24;
}
static void HandleFileSelect(void) {
sFileSelectDefaultHandlers[gChooseFileState.state]();
sub_08050A64(gUnk_02019EE0.unk6);
}
void sub_08050848(void) {
sub_080503A8(0x7);
sub_0805070C();
gUnk_02019EE0.unk7 = 0;
sub_08050AFC(gUnk_02019EE0.unk6);
sub_080A7114(1);
}
void sub_0805086C(void) {
gUnk_080FC908[gChooseFileState.subState]();
}
// transitioning away from submenu
void sub_08050888(void) {
if (!gFadeControl.active) {
switch (gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk7]) {
case SAVE_EMPTY:
sub_0805194C(gUnk_02019EE0.unk7);
gChooseFileState.subState = 2;
break;
case SAVE_VALID:
gChooseFileState.subState = 2;
break;
default:
sub_0805194C(gUnk_02019EE0.unk7);
sub_08050318(0, gUnk_02019EE0.unk7 + 1);
gChooseFileState.timer = 30;
gChooseFileState.subState = 1;
break;
}
}
}
void sub_080508E4(void) {
if (gChooseFileState.timer == 0) {
if (gUnk_03000FF0.newKeys & (A_BUTTON | START_BUTTON)) {
gChooseFileState.subState = 2;
}
} else {
gChooseFileState.timer--;
}
}
void sub_08050910(void) {
sub_08050384();
if (++gUnk_02019EE0.unk7 > 2) {
sub_080A7114(2);
} else {
gChooseFileState.subState = 0;
}
}
void sub_08050940(void) {
int row_idx;
u32 keys;
int num_rows;
FileSelectState mode;
if (gUnk_02019EE0.isTransitioning) {
return;
}
row_idx = gUnk_02019EE0.unk6;
keys = gUnk_03000FF0.newKeys;
if ((gUnk_03000FF0.heldKeys & L_BUTTON) && gUnk_02019EE0.saveStatus[row_idx] == SAVE_VALID) {
keys &= ~(DPAD_UP | DPAD_DOWN);
}
num_rows = gUnk_02000000->gameLanguage > GAME_LANGUAGE ? NUM_SAVE_SLOTS + 1 : NUM_SAVE_SLOTS;
mode = gUnk_02032EC0.lastState;
switch (keys) {
case DPAD_UP:
if (row_idx > 0)
row_idx--;
break;
case DPAD_DOWN:
if (num_rows - 1 > row_idx)
row_idx++;
break;
case R_BUTTON:
if (gUnk_02019EE0.saveStatus[row_idx] == SAVE_VALID)
mode = STATE_OPTIONS;
break;
case A_BUTTON:
case START_BUTTON:
SetActiveSave(row_idx);
if (row_idx == 3)
mode = STATE_CHOOSE_LANG;
else
switch (gUnk_02019EE0.saveStatus[row_idx]) {
case SAVE_EMPTY:
mode = STATE_NEW;
break;
case SAVE_VALID:
mode = STATE_VIEW;
break;
}
break;
}
if (gUnk_02032EC0.lastState != mode) {
SetFileSelectState(mode);
PlaySFX(0x6A);
}
row_idx = (row_idx + num_rows) % num_rows;
if (gUnk_02019EE0.unk6 != row_idx) {
gUnk_02019EE0.unk6 = row_idx;
sub_08050AFC(row_idx);
PlaySFX(0x69);
}
if (gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk6] == SAVE_VALID) {
ShowButtonR();
}
}
void sub_08050A64(u32 idx) {
if (gUnk_02019EE0.saveStatus[idx] != SAVE_VALID) {
return;
}
gUnk_03001010._4 = 0;
gUnk_03001010._6 = 0;
gUnk_03001010._8 = 0x400;
// Draw the save file's obtained elements.
if (GetInventoryValue(0x40)) {
gUnk_03001010.x = 0xA2;
gUnk_03001010.y = 0x36;
sub_080ADA14(0x145, 0x24);
}
if (GetInventoryValue(0x41)) {
gUnk_03001010.x = 0x96;
gUnk_03001010.y = 0x3D;
sub_080ADA14(0x145, 0x22);
}
if (GetInventoryValue(0x42)) {
gUnk_03001010.x = 0xAE;
gUnk_03001010.y = 0x3D;
sub_080ADA14(0x145, 0x23);
}
if (GetInventoryValue(0x43)) {
gUnk_03001010.x = 0xA2;
gUnk_03001010.y = 0x44;
sub_080ADA14(0x145, 0x21);
}
}
void sub_08050B3C(u16*);
void sub_08050AFC(u32 idx) {
SetActiveSave(idx);
_DmaZero(&gBG1Buffer, sizeof(gBG1Buffer));
if (gUnk_02019EE0.saveStatus[idx] == SAVE_VALID) {
sub_08050B3C(&gBG1Buffer.unk29C);
}
gScreen.bg.bg2yOffset = 1;
}
typedef struct {
u16* unk0;
u32 unk4;
} unk_08050B3C;
extern const u16 gUnk_080FC914[];
// Handles drawing of hearts
NONMATCH("asm/non_matching/save/sub_08050B3C.inc", void sub_08050B3C(u16* arg0)) {
unk_08050B3C sp;
int var0;
int var1;
int var2;
int var3;
int var4;
int var5;
int var6;
int var7;
u16* var8;
sp.unk0 = arg0;
var0 = gUnk_02002A40.stats.health / 2;
if (var0 == 0) {
var0 = 1;
}
var1 = gUnk_02002A40.stats.maxHealth / 2;
if (var1 == 0) {
return;
}
if (var0 > var1) {
var0 = var1;
}
sp.unk4 = var0 & 0x3;
var2 = var0 * 2;
var5 = var2;
if (var2 > 10) {
var5 = 10;
}
var6 = var2;
var6 -= 10;
var7 = var6;
if (var6 < 0) {
var7 = 0;
}
var1 = var1 >> 2;
var4 = var1;
if (var1 > 10) {
var1 = 10;
}
var4 -= 10;
sp.unk0[0] = 0xF24C;
DmaCopy16(3, &gUnk_080FC914[10 - var5], &sp.unk0[1], var1 * 2);
if (var4 > 0) {
sp.unk0[0x20] = 0xF24C;
DmaCopy16(3, &gUnk_080FC914[10 - var7], &sp.unk0[1], var4 * 2);
}
if (!sp.unk4) {
return;
}
var8 = sp.unk0;
if (var2 >= 10) {
var2 = var6;
var8 += 0x20;
}
var8[var2 + 1] = sp.unk4 - 0xDB3;
}
END_NONMATCH
void HandleFileView(void) {
gUnk_080FC93C[gMenu.menuType]();
sub_08050A64(gUnk_02019EE0.unk6);
}
extern Input gUnk_03000FF0;
void sub_08050C54(void) {
s32 column_idx;
if (gUnk_02019EE0.isTransitioning)
return;
column_idx = gMenu.column_idx;
switch (gUnk_03000FF0.newKeys) {
case A_BUTTON:
case START_BUTTON:
if (column_idx == 0) {
PlaySFX(0x80080000);
}
gMenu.transitionTimer = 0xf;
sub_080A7114(1);
PlaySFX(0x6a);
break;
case B_BUTTON:
PlaySFX(0x6c);
SetFileSelectState(STATE_NONE);
break;
case DPAD_LEFT:
column_idx--;
break;
case DPAD_RIGHT:
column_idx++;
break;
}
if (column_idx < 0) {
column_idx = 0;
}
if (column_idx >= NUM_FILE_OPERATIONS) {
column_idx = NUM_FILE_OPERATIONS - 1;
}
if (gMenu.column_idx != column_idx) {
gMenu.column_idx = column_idx;
PlaySFX(0x69);
}
}
void sub_08050D68(void) {
u32 state;
if (gMenu.transitionTimer == 0) {
switch (gMenu.column_idx) {
default:
case 0:
state = STATE_START;
break;
case 1:
state = STATE_COPY;
break;
case 2:
state = STATE_ERASE;
break;
}
SetFileSelectState(state);
} else {
gMenu.transitionTimer--;
}
}
void HandleFileLanguageSelect(void) {
gUnk_080FC944[gMenu.menuType]();
}
void sub_08050DB8(void) {
_DmaZero(&gBG2Buffer, sizeof(gBG2Buffer));
sub_080503A8(0xc);
gMenu.field_0x4 = gUnk_02000000->gameLanguage;
sub_080A7114(1);
}
void sub_08050DE4(void) {
s32 row_idx;
if (gUnk_02019EE0.isTransitioning)
return;
row_idx = gUnk_02000000->gameLanguage;
switch (gUnk_03000FF0.newKeys) {
case DPAD_UP:
row_idx--;
break;
case DPAD_DOWN:
row_idx++;
break;
case A_BUTTON:
case START_BUTTON:
PlaySFX(0x6a);
if (gMenu.field_0x4 != row_idx) {
sub_080A7114(2);
sub_08050318(8, 0);
} else {
SetFileSelectState(STATE_NONE);
}
break;
case B_BUTTON:
row_idx = gMenu.field_0x4;
gUnk_02000000->gameLanguage = gMenu.field_0x4;
PlaySFX(0x6c);
SetFileSelectState(STATE_NONE);
break;
}
// Lazy solution for positioning the rows lower on the screen
if (row_idx < 2) {
row_idx = 2;
}
if (row_idx > 6) {
row_idx = 6;
}
if (gUnk_02000000->gameLanguage != row_idx) {
gUnk_02000000->gameLanguage = row_idx;
PlaySFX(0x69);
}
}
void sub_08050E88(void) {
if (sub_0807CDA4(SAVE_DONE))
SetFileSelectState(0);
}

View File

@ -53,22 +53,22 @@ static const u16 sLightRaysAlphaBlends[] = {
}; };
static u32 AdvanceIntroSequence(u32 transition) { static u32 AdvanceIntroSequence(u32 transition) {
gUnk_02032EC0.transitionType = transition; gUnk_02032EC0.lastState = transition;
gUnk_03001000.funcIndex = 2; gUnk_03001000.funcIndex = 2;
_DmaZero(&gIntroState, sizeof(gIntroState)); _DmaZero(&gIntroState, sizeof(gIntroState));
DoFade(7, 8); DoFade(7, 8);
} }
void HandleIntroScreen(void) { void HandleIntroScreen(void) {
sub_080AD90C(); FlushSprites();
switch (gUnk_03001000.funcIndex) { switch (gUnk_03001000.funcIndex) {
case 0: case 0:
sub_08056418(); sub_08056418();
_DmaZero(&gUnk_02032EC0, 0x3b4); _DmaZero(&gUnk_02032EC0, sizeof(gUnk_02032EC0));
AdvanceIntroSequence(0); AdvanceIntroSequence(0);
break; break;
case 1: case 1:
sIntroSequenceHandlers[gUnk_02032EC0.transitionType](); sIntroSequenceHandlers[gUnk_02032EC0.lastState]();
break; break;
case 2: case 2:
if (gFadeControl.active) { if (gFadeControl.active) {
@ -92,13 +92,13 @@ static void HandleNintendoCapcomLogos(void) {
gIntroState.timer = 120; gIntroState.timer = 120;
LoadGfxGroup(16); LoadGfxGroup(16);
LoadGfxGroup(1); LoadGfxGroup(1);
if (((struct_02000000*)0x2000000)->gameLanguage == 0) { if (gUnk_02000000->gameLanguage == 0) {
paletteGroup = 1; paletteGroup = 1;
} else { } else {
paletteGroup = 2; paletteGroup = 2;
} }
LoadPaletteGroup(paletteGroup); LoadPaletteGroup(paletteGroup);
gScreen.lcd.displayControl |= 0x400; gScreen.lcd.displayControl |= DISPCNT_BG2_ON;
gScreen.bg.bg2yOffset = 1; gScreen.bg.bg2yOffset = 1;
DoFade(6, 8); DoFade(6, 8);
advance = ADVANCE_NONE; advance = ADVANCE_NONE;
@ -132,28 +132,30 @@ static void HandleTitlescreen(void) {
sub_080ADD30(); sub_080ADD30();
gUnk_02024490.unk0 = 1; gUnk_02024490.unk0 = 1;
LoadGfxGroup(2); LoadGfxGroup(2);
if (((struct_02000000*)0x2000000)->gameLanguage == 0) { if (gUnk_02000000->gameLanguage == 0) {
paletteGroup = 3; paletteGroup = 3;
} else { } else {
paletteGroup = 4; paletteGroup = 4;
} }
LoadPaletteGroup(paletteGroup); LoadPaletteGroup(paletteGroup);
if (((struct_02000000*)0x2000000)->gameLanguage == 0) { if (gUnk_02000000->gameLanguage == 0) {
gScreen.controls.layerFXControl = 0x844; // Blend first and second layer
gScreen.controls.layerFXControl = BLDCNT_TGT1_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND;
gScreen.controls.alphaBlend = BLDALPHA_BLEND(9, 9); gScreen.controls.alphaBlend = BLDALPHA_BLEND(9, 9);
gScreen.bg.bg1xOffset = 0x1c09; gScreen.bg.bg1xOffset = 0x1c09;
gScreen.affine.bg2Control = 0x1d02; gScreen.affine.bg2Control = BGCNT_SCREENBASE(29) | BGCNT_PRIORITY(2);
gScreen.affine.bg3Control = 0x1e03; gScreen.affine.bg3Control = BGCNT_SCREENBASE(30) | BGCNT_PRIORITY(3);
gScreen.lcd.displayControl |= 0x1e00; gScreen.lcd.displayControl |= DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
gScreen.bg.bg2xOffset = 0xff60; gScreen.bg.bg2xOffset = 0xff60;
} else { } else {
gScreen.controls.layerFXControl = 0x241; gScreen.controls.layerFXControl = BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND;
gScreen.controls.alphaBlend = BLDALPHA_BLEND(9, 9); gScreen.controls.alphaBlend = BLDALPHA_BLEND(9, 9);
gScreen.bg.bg0Control = 0x1d02; gScreen.bg.bg0Control = BGCNT_SCREENBASE(29) | BGCNT_PRIORITY(2);
gScreen.bg.bg1xOffset = 0x1E03; gScreen.bg.bg1xOffset = 0x1E03;
gScreen.affine.bg2Control = 0x7C89; gScreen.affine.bg2Control = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(2) | BGCNT_256COLOR |
gScreen.lcd.displayControl |= 1; BGCNT_SCREENBASE(28) | BGCNT_WRAP | BGCNT_TXT512x256;
gScreen.lcd.displayControl |= 0x1300; gScreen.lcd.displayControl |= DISPCNT_MODE_1;
gScreen.lcd.displayControl |= DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON;
gIntroState.swordBgScaleRatio = 0x10; gIntroState.swordBgScaleRatio = 0x10;
UpdateSwordBgAffineData(); UpdateSwordBgAffineData();
} }
@ -165,7 +167,7 @@ static void HandleTitlescreen(void) {
if (gFadeControl.active) { if (gFadeControl.active) {
return; return;
} }
if (((struct_02000000*)0x2000000)->gameLanguage == 0) { if (gUnk_02000000->gameLanguage == 0) {
HandleJapaneseTitlescreenAnimationIntro(); HandleJapaneseTitlescreenAnimationIntro();
} else { } else {
HandleTitlescreenAnimationIntro(); HandleTitlescreenAnimationIntro();
@ -196,8 +198,8 @@ static void HandleTitlescreen(void) {
sub_080ADA14(0x1ff, 0); sub_080ADA14(0x1ff, 0);
} }
} }
if (gIntroState.gameLanguage != ((struct_02000000*)0x2000000)->gameLanguage) { if (gIntroState.gameLanguage != gUnk_02000000->gameLanguage) {
gIntroState.gameLanguage = ((struct_02000000*)0x2000000)->gameLanguage; gIntroState.gameLanguage = gUnk_02000000->gameLanguage;
LoadGfxGroup(3); LoadGfxGroup(3);
} }
UpdateLightRays(); UpdateLightRays();
@ -219,8 +221,8 @@ static void UpdateSwordBgAffineData(void) {
struct BgAffineSrcData aff; struct BgAffineSrcData aff;
aff.texY = 0x8000; aff.texY = 0x8000;
aff.texX = 0x8000; aff.texX = 0x8000;
aff.scrX = 0x78; aff.scrX = DISPLAY_WIDTH / 2;
aff.scrY = 0x48; aff.scrY = DISPLAY_HEIGHT / 2 - 8;
aff.alpha = 0; aff.alpha = 0;
aff.sy = aff.sx = gIntroState.swordBgScaleRatio; aff.sy = aff.sx = gIntroState.swordBgScaleRatio;
BgAffineSet(&aff, (struct BgAffineDstData*)&gBgControls, 1); BgAffineSet(&aff, (struct BgAffineDstData*)&gBgControls, 1);
@ -254,7 +256,7 @@ static void HandleJapaneseTitlescreenAnimationIntro(void) {
pEVar2 = CreateObject(0xb4, 0, 0); pEVar2 = CreateObject(0xb4, 0, 0);
if (pEVar2 != NULL) { if (pEVar2 != NULL) {
pEVar2->x.HALF.HI = 0; pEVar2->x.HALF.HI = 0;
pEVar2->y.HALF.HI = 0x48; pEVar2->y.HALF.HI = DISPLAY_HEIGHT / 2 - 8;
} }
} }
break; break;
@ -271,7 +273,7 @@ static void HandleTitlescreenAnimationIntro(void) {
case 0: case 0:
if (!gFadeControl.active) { if (!gFadeControl.active) {
gIntroState.subState = 1; gIntroState.subState = 1;
gScreen.lcd.displayControl |= 0x400; gScreen.lcd.displayControl |= DISPCNT_BG2_ON;
PlaySFX(0xF6); PlaySFX(0xF6);
} }
break; break;
@ -334,14 +336,14 @@ static u32 GetAdvanceState(void) {
} }
static void UpdateLightRays(void) { static void UpdateLightRays(void) {
// Periodically rotate the palette to give a shimmeriming effect. // Periodically rotate the palette to give a shimmering effect.
if ((gIntroState.counter & 0x7) == 0) { if ((gIntroState.counter & 0x7) == 0) {
gIntroState.lightRaysPaletteGroup++; gIntroState.lightRaysPaletteGroup++;
gIntroState.lightRaysPaletteGroup &= 0x3; gIntroState.lightRaysPaletteGroup &= 0x3;
LoadPaletteGroup(5 + gIntroState.lightRaysPaletteGroup); LoadPaletteGroup(5 + gIntroState.lightRaysPaletteGroup);
} }
// Periodiccally update the transparency of the light rays. // Periodically update the transparency of the light rays.
if ((gIntroState.counter & 0x1F) == 0) { if ((gIntroState.counter & 0x1F) == 0) {
gIntroState.lightRaysAlphaBlendIndex = (gIntroState.lightRaysAlphaBlendIndex + 1) & 0x7; gIntroState.lightRaysAlphaBlendIndex = (gIntroState.lightRaysAlphaBlendIndex + 1) & 0x7;
gScreen.controls.alphaBlend = sLightRaysAlphaBlends[gIntroState.lightRaysAlphaBlendIndex]; gScreen.controls.alphaBlend = sLightRaysAlphaBlends[gIntroState.lightRaysAlphaBlendIndex];

View File

@ -6,16 +6,12 @@
#include "random.h" #include "random.h"
#include "readKeyInput.h" #include "readKeyInput.h"
extern u8 gUnk_03003DE4; extern void HandleIntroScreen(void);
extern void HandleChooseFileScreen(void);
extern void sub_0804FF84(u32); extern void HandleGameplayScreen(void);
extern u16 gPaletteBuffer[]; extern void HandleGameOverScreen(void);
extern void VBlankInterruptWait(void); extern void HandleCreditsScreen(void);
extern void DisableInterruptsAndDMA(void); extern void HandleDebugTextScreen(void);
extern void sub_08016B34(void);
static void sub_08055F70(void);
static bool32 SoftResetKeysPressed(void);
static void (*const sScreenHandlers[])(void) = { static void (*const sScreenHandlers[])(void) = {
[SCREEN_INTRO] = HandleIntroScreen, [SCREEN_CHOOSE_FILE] = HandleChooseFileScreen, [SCREEN_INTRO] = HandleIntroScreen, [SCREEN_CHOOSE_FILE] = HandleChooseFileScreen,
@ -27,8 +23,8 @@ void MainLoop(void) {
int var0; int var0;
sub_08055F70(); sub_08055F70();
sub_080A3204(); InitSound();
sub_0805616C(); InitDMA();
sub_0807CE90(); sub_0807CE90();
sub_080560B8(); sub_080560B8();
sub_08056208(); sub_08056208();
@ -176,7 +172,7 @@ NONMATCH("asm/non_matching/sub_080560B8.inc", void sub_080560B8(void)) {
END_NONMATCH END_NONMATCH
u32 sub_08056134(void) { u32 sub_08056134(void) {
if ((gUnk_02000000->signature != SIGNATURE) || (gUnk_02000000->saveFileId >= MAX_SAVE_FILES) || if ((gUnk_02000000->signature != SIGNATURE) || (gUnk_02000000->saveFileId >= NUM_SAVE_SLOTS) ||
(gUnk_02000000->messageSpeed >= MAX_MSG_SPEED) || (gUnk_02000000->brightnessPref >= MAX_BRIGHTNESS) || (gUnk_02000000->messageSpeed >= MAX_MSG_SPEED) || (gUnk_02000000->brightnessPref >= MAX_BRIGHTNESS) ||
(gUnk_02000000->gameLanguage != GAME_LANGUAGE) || (gUnk_02000000->_e != 0)) (gUnk_02000000->gameLanguage != GAME_LANGUAGE) || (gUnk_02000000->_e != 0))
return FALSE; return FALSE;
@ -184,7 +180,7 @@ u32 sub_08056134(void) {
return TRUE; return TRUE;
} }
void sub_0805616C() { void InitDMA() {
PlaySFX(0x80040000); PlaySFX(0x80040000);
gScreen._6d = gScreen._6c; gScreen._6d = gScreen._6c;
gScreen._6c = 0; gScreen._6c = 0;

View File

@ -2,6 +2,7 @@
#include "entity.h" #include "entity.h"
#include "object.h" #include "object.h"
//clang-format off //clang-format off
void (*const gObjectFunctions[])(Entity*) = { void (*const gObjectFunctions[])(Entity*) = {
/*0x00*/ ItemOnGround, /*0x00*/ ItemOnGround,
/*0x01*/ DeathFx, /*0x01*/ DeathFx,
@ -75,7 +76,7 @@ void (*const gObjectFunctions[])(Entity*) = {
/*0x45*/ Object45, /*0x45*/ Object45,
/*0x46*/ GiantBookLadder, /*0x46*/ GiantBookLadder,
/*0x47*/ HeartContainer, /*0x47*/ HeartContainer,
/*0x48*/ Object48, /*0x48*/ FileScreenObjects,
/*0x49*/ Object49, /*0x49*/ Object49,
/*0x4a*/ BackgroundCloud, /*0x4a*/ BackgroundCloud,
/*0x4b*/ Object4B, /*0x4b*/ Object4B,

View File

@ -47,7 +47,7 @@ extern const u16 gUnk_08121D18[][8];
extern const u8 gUnk_08121D48[]; extern const u8 gUnk_08121D48[];
extern const struct_08121D54 gUnk_08121D54[]; extern const struct_08121D54 gUnk_08121D54[];
void Object48(Entity* this) { void FileScreenObjects(Entity* this) {
if (this->currentHealth == 0) { if (this->currentHealth == 0) {
sub_0808EFF0(this); sub_0808EFF0(this);
} }
@ -91,7 +91,7 @@ void sub_0808E818(Entity* this) {
LoadPalettes(&gGlobalGfxAndPalettes[var1], 31, 1); LoadPalettes(&gGlobalGfxAndPalettes[var1], 31, 1);
} }
if (gUnk_02032EC0.transitionType == 0) { if (gUnk_02032EC0.lastState == 0) {
if (gUnk_03000FF0.heldKeys & L_BUTTON) { if (gUnk_03000FF0.heldKeys & L_BUTTON) {
switch (gUnk_03000FF0.newKeys) { switch (gUnk_03000FF0.newKeys) {
case DPAD_UP: case DPAD_UP:
@ -126,13 +126,13 @@ void sub_0808E818(Entity* this) {
static bool32 sub_0808E950(void) { static bool32 sub_0808E950(void) {
bool32 result = FALSE; bool32 result = FALSE;
switch (gUnk_02032EC0.transitionType) { switch (gUnk_02032EC0.lastState) {
case 0: case 0:
case 4: case 4:
case 5: case 5:
case 6: case 6:
case 7: case 7:
result = gUnk_02019EE0.unk8[gUnk_02019EE0.unk6] == 1; result = gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk6] == 1;
break; break;
} }
return result; return result;
@ -179,7 +179,7 @@ void sub_0808EA28(Entity* this) {
u32 var1; u32 var1;
if (this->entityType.form == 3) { if (this->entityType.form == 3) {
if (((struct_02000000*)0x2000000)->gameLanguage > 1) { if (gUnk_02000000->gameLanguage > LANGUAGE_EN) {
this->spriteSettings.b.draw = 2; this->spriteSettings.b.draw = 2;
} else { } else {
this->spriteSettings.b.draw = 0; this->spriteSettings.b.draw = 0;
@ -190,7 +190,7 @@ void sub_0808EA28(Entity* this) {
var0 = 12; var0 = 12;
var1 = 1; var1 = 1;
} else { } else {
if (gUnk_02032EC0.transitionType == 5 && this->entityType.form == gUnk_02019EE0.unk7) { if (gUnk_02032EC0.lastState == 5 && this->entityType.form == gUnk_02019EE0.unk7) {
var0 = 13; var0 = 13;
var1 = 2; var1 = 2;
} else { } else {
@ -202,14 +202,14 @@ void sub_0808EA28(Entity* this) {
this->palette.b.b0 = var0; this->palette.b.b0 = var0;
this->spriteRendering.b3 = var1; this->spriteRendering.b3 = var1;
sub_0808EABC(this); sub_0808EABC(this);
gUnk_02019EE0.unk0 |= sub_0808EF6C(this); gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
} }
void sub_0808EABC(Entity* this) { void sub_0808EABC(Entity* this) {
int var0 = -72; int var0 = -72;
int var1 = this->entityType.form * 32 + 40; int var1 = this->entityType.form * 32 + 40;
int var2 = gUnk_02019EE0.unk6 == this->entityType.form; int var2 = gUnk_02019EE0.unk6 == this->entityType.form;
switch (gUnk_02032EC0.transitionType) { switch (gUnk_02032EC0.lastState) {
case 0: case 0:
var0 = 24; var0 = 24;
break; break;
@ -272,15 +272,15 @@ void sub_0808EBB8(Entity* this) {
u32 x, y; u32 x, y;
Entity* entity; Entity* entity;
switch (gUnk_02032EC0.transitionType) { switch (gUnk_02032EC0.lastState) {
case 4: case 4:
var0 = gMenu.field_0x1 + 4; var0 = gMenu.column_idx + 4;
break; break;
case 5: case 5:
var0 = 2; var0 = 2;
break; break;
case 6: case 6:
var0 = gMenu.field_0x1 == 0 ? 7 : 6; var0 = gMenu.column_idx == 0 ? 7 : 6;
break; break;
case 7: case 7:
var0 = 4; var0 = 4;
@ -341,8 +341,8 @@ void sub_0808ECBC(Entity* this) {
int var2; int var2;
const struct_08121CD4* var3; const struct_08121CD4* var3;
var0 = gMenu.field_0x1; var0 = gMenu.column_idx;
switch (gUnk_02032EC0.transitionType) { switch (gUnk_02032EC0.lastState) {
case 4: case 4:
var1 = 1; var1 = 1;
break; break;
@ -371,12 +371,12 @@ void sub_0808ECBC(Entity* this) {
this->palette.b.b0 = 14; this->palette.b.b0 = 14;
} }
gUnk_02019EE0.unk0 |= sub_0808EF6C(this); gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
} }
void sub_0808ED64(Entity* this) { void sub_0808ED64(Entity* this) {
int y = 255; int y = 255;
if (gUnk_02032EC0.transitionType == 1 && gMenu.focusCoords[1] != 5) { if (gUnk_02032EC0.lastState == 1 && gMenu.focusCoords[1] != 5) {
this->x.HALF.HI = gMenu.focusCoords[0] * 16 + 28; this->x.HALF.HI = gMenu.focusCoords[0] * 16 + 28;
y = gMenu.focusCoords[1] * 16 + 58; y = gMenu.focusCoords[1] * 16 + 58;
} }
@ -385,7 +385,7 @@ void sub_0808ED64(Entity* this) {
void sub_0808ED98(Entity* this) { void sub_0808ED98(Entity* this) {
int y; int y;
if (gUnk_02032EC0.transitionType != 1) { if (gUnk_02032EC0.lastState != 1) {
this->field_0x68.HWORD = 27; this->field_0x68.HWORD = 27;
y = -10; y = -10;
} else { } else {
@ -413,7 +413,7 @@ void sub_0808EE00(Entity* this) {
this->x.HALF.HI = gUnk_08121D18[var0][var1]; this->x.HALF.HI = gUnk_08121D18[var0][var1];
this->field_0x68.HWORD = gUnk_08121D18[var0][var1]; this->field_0x68.HWORD = gUnk_08121D18[var0][var1];
var1 -= var0; var1 -= var0;
if (gUnk_02032EC0.transitionType != 1) { if (gUnk_02032EC0.lastState != 1) {
var1 = 128; var1 = 128;
var2 = 176; var2 = 176;
} else { } else {
@ -422,14 +422,14 @@ void sub_0808EE00(Entity* this) {
this->field_0x6a.HWORD = var2; this->field_0x6a.HWORD = var2;
this->palette.b.b0 = gMenu.focusCoords[1] == 5 && var1 == gMenu.field_0x12 ? 11 : 9; this->palette.b.b0 = gMenu.focusCoords[1] == 5 && var1 == gMenu.field_0x12 ? 11 : 9;
gUnk_02019EE0.unk0 |= sub_0808EF6C(this); gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
} }
void nullsub_522(Entity* this) { void nullsub_522(Entity* this) {
} }
void sub_0808EE98(Entity* this) { void sub_0808EE98(Entity* this) {
this->actionDelay = gUnk_02032EC0.transitionType; this->actionDelay = gUnk_02032EC0.lastState;
this->frameIndex = gUnk_08121D48[this->actionDelay]; this->frameIndex = gUnk_08121D48[this->actionDelay];
if (this->actionDelay != 2) { if (this->actionDelay != 2) {
this->field_0x68.HWORD = 96; this->field_0x68.HWORD = 96;
@ -441,18 +441,18 @@ void sub_0808EE98(Entity* this) {
void sub_0808EED8(Entity* this) { void sub_0808EED8(Entity* this) {
int var0; int var0;
if (gUnk_02032EC0.transitionType != 3) { if (gUnk_02032EC0.lastState != 3) {
this->spriteSettings.b.draw = 0; this->spriteSettings.b.draw = 0;
} else { } else {
this->spriteSettings.b.draw = 2; this->spriteSettings.b.draw = 2;
var0 = this->entityType.form - 19; var0 = this->entityType.form - 19;
this->palette.b.b0 = gMenu.field_0x1 == var0 ? 4 : 3; this->palette.b.b0 = gMenu.column_idx == var0 ? 4 : 3;
} }
} }
void sub_0808EF24(Entity* this) { void sub_0808EF24(Entity* this) {
int var0; int var0;
if (gUnk_02032EC0.transitionType != 3) { if (gUnk_02032EC0.lastState != 3) {
this->spriteSettings.b.draw = 0; this->spriteSettings.b.draw = 0;
} else { } else {
this->spriteSettings.b.draw = 2; this->spriteSettings.b.draw = 2;
@ -515,7 +515,7 @@ static u32 sub_0808EF6C(Entity* this) {
static void sub_0808EFF0(Entity* this) { static void sub_0808EFF0(Entity* this) {
const struct_08121D54* var0; const struct_08121D54* var0;
int var1; u8 var1;
this->spriteSettings.b.draw = 2; this->spriteSettings.b.draw = 2;
this->nonPlanarMovement = 0x400; this->nonPlanarMovement = 0x400;
@ -533,7 +533,7 @@ static void sub_0808EFF0(Entity* this) {
this->field_0x6c.HWORD = var0->unk0; this->field_0x6c.HWORD = var0->unk0;
var1 = var0->unk7; var1 = var0->unk7;
if (var1 & 0x80) { if (var1 & 0x80) {
var1 &= 0x7F; var1 &= ~(0x80);
this->frameIndex = var1; this->frameIndex = var1;
this->lastFrameIndex = var1; this->lastFrameIndex = var1;
} else { } else {

View File

@ -1,38 +1,52 @@
#include "global.h" #include "save.h"
#include "entity.h"
#include "functions.h"
#include "menu.h"
#include "structures.h"
extern void (*const gUnk_0811E478[])(u32); extern u32 sub_0807D008(u32, SaveFile*);
const u16 gUnk_0811E454[] = { 0x0, 0x0, 0x100, 0x200, 0x300, 0x400, 0x500,
0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 };
const char gUnk_0811E470[6] = "LINK";
static SaveResult HandleSaveInit(u32);
static SaveResult HandleSaveInProgress(u32);
static SaveResult HandleSaveDone(u32);
static SaveResult (*const sSaveHandlers[])(u32) = { HandleSaveInit, HandleSaveInProgress, HandleSaveDone };
static const char sSignatureLong[32] = "AGBZELDA:THE MINISH CAP:ZELDA 5";
// Save file is untouched
static const char sSaveDescInit[8] = "\xFF\xFF\xFF\xFF"
"INIT";
// Save file is deleted
static const char sSaveDescDeleted[8] = "\xFF\xFF\xFF\xFF"
"DelF";
const char gUnk_0811E4B4[8] = "DAMEDAME";
extern s16 gUnk_02021EE0[6]; extern s16 gUnk_02021EE0[6];
extern char gUnk_0811E484[];
extern char gUnk_0811E4AC[];
extern char gUnk_0811E4A4[];
void sub_0807CD9C() { void sub_0807CD9C() {
sub_080530C8(); sub_080530C8();
} }
void sub_0807CDA4(u32 arg0) { SaveResult sub_0807CDA4(SaveState state) {
gUnk_0811E478[gMenu.storyPanelIndex](arg0); return sSaveHandlers[gMenu.storyPanelIndex](state);
} }
u32 sub_0807CDC0(void) { SaveResult HandleSaveInit(u32 arg0) {
gUnk_02021EE0[5] -= 8; gUnk_02021EE0[5] -= 8;
if (gUnk_02021EE0[4] <= 0) { if (gUnk_02021EE0[4] <= 0) {
gMenu.field_0xa = 8; gMenu.field_0xa = 8;
gMenu.storyPanelIndex = 1; gMenu.storyPanelIndex = 1;
} }
return 0; return SAVE_BUSY;
} }
u32 sub_0807CDE8(u32 arg0) { SaveResult HandleSaveInProgress(u32 arg0) {
u32 temp; u32 temp;
if (gMenu.field_0xa == 0) { if (gMenu.field_0xa == 0) {
sub_0805616C(); InitDMA();
switch (arg0) { switch (arg0) {
case 0: case 0:
temp = sub_0807CF08(gUnk_02000000->saveFileId, gUnk_02002A40.filler0); temp = sub_0807CF08(gUnk_02000000->saveFileId, gUnk_02002A40.filler0);
@ -51,25 +65,25 @@ u32 sub_0807CDE8(u32 arg0) {
} else { } else {
gMenu.field_0xa--; gMenu.field_0xa--;
} }
return 0; return SAVE_BUSY;
} }
s32 sub_0807CE54(void) { SaveResult HandleSaveDone(u32 arg0) {
u32 uVar1; SaveResult result;
uVar1 = 0; result = SAVE_BUSY;
gUnk_02021EE0[5] += 8; gUnk_02021EE0[5] += 8;
if (gUnk_02021EE0[3] <= gUnk_02021EE0[5]) { if (gUnk_02021EE0[3] <= gUnk_02021EE0[5]) {
gUnk_02021EE0[5] = gUnk_02021EE0[3]; gUnk_02021EE0[5] = gUnk_02021EE0[3];
sub_08050384(); sub_08050384();
gMenu.storyPanelIndex = 0; gMenu.storyPanelIndex = 0;
if (gMenu.field_0xa == 1) { if (gMenu.field_0xa == 1) {
uVar1 = 1; result = SAVE_OK;
} else { } else {
uVar1 = -1; result = SAVE_ERROR;
} }
} }
return uVar1; return result;
} }
u32 sub_0807CE90(void) { u32 sub_0807CE90(void) {
@ -80,10 +94,10 @@ u32 sub_0807CE90(void) {
sub_080B1520(0x40); sub_080B1520(0x40);
puVar1 = sub_0807D1C4(4); puVar1 = sub_0807D1C4(4);
iVar3 = 0; iVar3 = 0;
if (sub_0807D24C(puVar1->field_0x6, gUnk_0811E484, puVar1->field_0x0) == 0) { if (sub_0807D24C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0) == 0) {
iVar3 += 1; iVar3 += 1;
} }
if (sub_0807D24C(puVar1->field_0x8, gUnk_0811E484, puVar1->field_0x0) == 0) { if (sub_0807D24C(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0) == 0) {
iVar3 += 2; iVar3 += 2;
} }
if (iVar3 != 0) { if (iVar3 != 0) {
@ -94,8 +108,8 @@ u32 sub_0807CE90(void) {
sub_0807CF68(1); sub_0807CF68(1);
sub_0807CF68(0); sub_0807CF68(0);
} }
sub_0807D20C(puVar1->field_0x8, gUnk_0811E484, puVar1->field_0x0); sub_0807D20C(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0);
sub_0807D20C(puVar1->field_0x6, gUnk_0811E484, puVar1->field_0x0); sub_0807D20C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0);
} }
return 1; return 1;
} }
@ -116,11 +130,11 @@ int sub_0807CF28(u32 arg0, SaveFile* arg1) {
return sub_0807D008(arg0, arg1); return sub_0807D008(arg0, arg1);
} }
u32 sub_0807CF30(void* arg0) { u32 sub_0807CF30(SaveFile* arg0) {
return sub_0807D008(3, arg0); return sub_0807D008(3, arg0);
} }
u32 sub_0807CF3C(void* arg0) { u32 sub_0807CF3C(SaveFile* arg0) {
return sub_0807D008(5, arg0); return sub_0807D008(5, arg0);
} }
@ -128,16 +142,16 @@ void sub_0807CF48(u32 arg0) {
struct_0807D1C4* temp; struct_0807D1C4* temp;
temp = sub_0807D1C4(arg0); temp = sub_0807D1C4(arg0);
sub_0807D184(temp->field_0x4, gUnk_0811E4AC); sub_0807D184(temp->field_0x4, sSaveDescDeleted);
sub_0807D184(temp->field_0x2, gUnk_0811E4AC); sub_0807D184(temp->field_0x2, sSaveDescDeleted);
} }
void sub_0807CF68(u32 arg0) { void sub_0807CF68(u32 arg0) {
struct_0807D1C4* temp; struct_0807D1C4* temp;
char* str; const char* str;
temp = sub_0807D1C4(arg0); temp = sub_0807D1C4(arg0);
str = gUnk_0811E4A4; str = sSaveDescInit;
sub_0807D184(temp->field_0x4, str); sub_0807D184(temp->field_0x4, str);
sub_0807D184(temp->field_0x2, str); sub_0807D184(temp->field_0x2, str);
} }

View File

@ -8,7 +8,7 @@ extern void (*const gUnk_081280C4[])();
void DrawKinstoneMenu(void) { void DrawKinstoneMenu(void) {
gScreenTransition.field_0x24[8] = 2; gScreenTransition.field_0x24[8] = 2;
sub_080AD90C(); FlushSprites();
gUnk_081280C4[gMenu.menuType](); gUnk_081280C4[gMenu.menuType]();
sub_080A3B74(); sub_080A3B74();
sub_080A4054(); sub_080A4054();
@ -26,7 +26,7 @@ void sub_080A3BD0(void) {
s32 iVar1; s32 iVar1;
s32 iVar2; s32 iVar2;
gMenu.field_0x1 = 1; gMenu.column_idx = 1;
gMenu.unk2a = 0; gMenu.unk2a = 0;
sub_080A4D34(); sub_080A4D34();
LoadPaletteGroup(0xcb); LoadPaletteGroup(0xcb);

View File

@ -5,53 +5,34 @@
#include "textbox.h" #include "textbox.h"
#include "structures.h" #include "structures.h"
void ShowTextbox(); u32 sub_080564DC(void);
void TextboxAtPosition(); u32 sub_080564EC(void);
u32 sub_08056654(void);
u32 sub_080565B4(void);
u32 sub_080565F8(void);
u32 sub_08056640(void);
typedef struct { u32 (*const gUnk_08107BC8[])(void) = { sub_080564DC, sub_080564EC, sub_08056654,
u8 _0; sub_080565B4, sub_080565F8, sub_08056640 };
u8 _1;
u8 _2;
u8 _3[5];
u16 _8;
u8 _b[0x16];
u8 _20;
u8 _21;
u8 _22[0xa];
void* _2c;
u8 _30[0x23];
u8 _53;
u16 _54;
u8 _56[0x2];
void* _58;
u8 _5c;
u8 _5d;
u8 _5e[24];
u8 _76;
u8 _77[0x11];
u8 _88;
u8 _89;
u8 _8a;
u8 _8b[0xe];
u8 _99;
u8 _9a;
u8 _9b;
u8 _9c;
u8 _9d;
u8 _9e[0xa];
} struct_02022780;
extern struct_02022780 gUnk_02022780;
static_assert(sizeof(struct_02022780) == 0xa8);
extern const s32 (*const gUnk_08107BC8[])(); extern u8 gUnk_020227DC, gUnk_020227E8, gUnk_020227F0, gUnk_020227F8, gUnk_02022800;
extern const void (*const gUnk_08107BF4[])(struct_02022780*); u8* const gUnk_08107BE0[] = { &gUnk_020227DC, &gUnk_020227E8, &gUnk_020227F0, &gUnk_020227F8, &gUnk_02022800 };
void sub_08056684(struct_02022780*);
void sub_080566B8(struct_02022780*);
void sub_08056BA0(struct_02022780*);
void sub_08056B1C(struct_02022780*);
void sub_08056B7C(struct_02022780*);
void sub_080569D4(struct_02022780*);
void (*const gUnk_08107BF4[])(struct_02022780*) = { sub_08056684, sub_080566B8, sub_08056BA0,
sub_08056B1C, sub_08056B7C, sub_080569D4 };
extern u32 gUnk_02036A40; extern u32 gUnk_02036A40;
extern u32 gUnk_02036A38; extern u32 gUnk_02036A38;
extern u8 gUnk_02024030; extern u8 gUnk_02024030;
extern u8 gUnk_020227A0; extern u8 gUnk_020227A0;
extern u8 gUnk_02000D00; extern u8 gUnk_02000D00;
extern u8 gUnk_08107BE0;
s32 sub_08056338(void) { s32 sub_08056338(void) {
s32 result; s32 result;
@ -100,7 +81,7 @@ void TextboxAtPosition(u32 index, u32 x, u32 y) {
gTextBox.textWindowPosY = y; gTextBox.textWindowPosY = y;
} }
void ShowTextbox(u32 index, u32 param_2, u32* dest) { void ShowTextbox(u32 index) {
_DmaZero(&gTextBox, 32); _DmaZero(&gTextBox, 32);
gTextBox.textIndex = index; gTextBox.textIndex = index;
gTextBox.textSpeed = 99; gTextBox.textSpeed = 99;
@ -158,10 +139,10 @@ NONMATCH("asm/non_matching/textbox/sub_080564EC.inc", u32 sub_080564EC(void)) {
char* dest; char* dest;
u32 i; u32 i;
char c; char c;
_DmaZero((void *)&gUnk_02036A40, 8); _DmaZero((void*)&gUnk_02036A40, 8);
_DmaZero((void *)&gUnk_02024030, 0x18); _DmaZero((void*)&gUnk_02024030, 0x18);
_DmaZero((void *)&gUnk_02022780, 0xa8); _DmaZero((void*)&gUnk_02022780, 0xa8);
_DmaCopy(&gTextBox, &gUnk_02022780, 32); _DmaCopy(&gTextBox, &gUnk_02022780, 32);
if (gUnk_02022780._2 == 0x63) { if (gUnk_02022780._2 == 0x63) {
gUnk_02022780._2 = gUnk_02000000->messageSpeed; gUnk_02022780._2 = gUnk_02000000->messageSpeed;
@ -174,7 +155,8 @@ NONMATCH("asm/non_matching/textbox/sub_080564EC.inc", u32 sub_080564EC(void)) {
for (i = 0; i < 6; ++i) { for (i = 0; i < 6; ++i) {
c = gUnk_02002A40.playerName[i]; c = gUnk_02002A40.playerName[i];
if (c == '\0') break; if (c == '\0')
break;
dest[i] = c; dest[i] = c;
} }

View File

@ -5,7 +5,14 @@
"ios": "c", "ios": "c",
"functions.h": "c", "functions.h": "c",
"textbox.h": "c", "textbox.h": "c",
"structures.h": "c" "structures.h": "c",
"fileselect.h": "c",
"menu.h": "c",
"save.h": "c",
"main.h": "c",
"object.h": "c",
"filescreen.h": "c",
"screen.h": "c"
} }
} }
} }