summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortheo3 <arisstephenson2@gmail.com>2022-01-03 20:16:58 -0800
committertheo3 <arisstephenson2@gmail.com>2022-01-03 20:16:58 -0800
commitf26b2e286a7f462947b395da259e185fc8ecfa7f (patch)
tree5ed071d0b27fc7b3dfa702859257999aaab4cbf8
parent0698806e00d7da64f5c007e23426ed68d52c69ea (diff)
more game.c
-rwxr-xr-xasm/fileScreen.s1032
-rw-r--r--include/asm.h1
-rw-r--r--include/common.h2
-rw-r--r--include/main.h3
-rw-r--r--include/player.h1
-rw-r--r--include/room.h4
-rw-r--r--linker.ld1
-rw-r--r--src/game.c488
-rw-r--r--src/npc/npc5.c12
-rw-r--r--src/npc/postman.c12
-rw-r--r--src/player.c21
-rw-r--r--src/playerItem/playerItemPacciCane.c20
12 files changed, 530 insertions, 1067 deletions
diff --git a/asm/fileScreen.s b/asm/fileScreen.s
deleted file mode 100755
index 699cf86a..00000000
--- a/asm/fileScreen.s
+++ /dev/null
@@ -1,1032 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
-.ifdef DEMO_USA
- thumb_func_start HandleGameplayScreen
-HandleGameplayScreen: @ 08051A28
- push {r4, lr}
- ldr r1, _08051A68 @ =0x030010A0
- ldr r0, [r1, #0x00]
- adds r0, #0x01
- str r0, [r1, #0x00]
- ldr r1, _08051A6C @ =0x080FC55C
- ldr r4, _08051A70x @ =0x03001000
- ldrb r0, [r4, #0x03]
- lsls r0, r0, #0x02
- adds r0, r0, r1
- ldr r0, [r0, #0x00]
- bl _call_via_r0
- ldr r0, _08051A74x @ =0x02002A40
- movs r2, #0x95
- lsls r2, r2, #0x03
- adds r1, r0, r2
- ldr r0, [r1, #0x00]
- cmp r0, #0x00
- beq _08051A64
- subs r0, #0x01
- str r0, [r1, #0x00]
- cmp r0, #0x00
- bne _08051A64
- movs r0, #0x07
- movs r1, #0x02
- bl DoFade
- movs r0, #0x03
- strb r0, [r4, #0x03]
-_08051A64:
- pop {r4, pc}
- .byte 0x00, 0x00
-_08051A68: .4byte gScreenTransition
-_08051A6C: .4byte gUnk_080FC9D8
-_08051A70x: .4byte gMain
-_08051A74x: .4byte gSave
-.else
- thumb_func_start HandleGameplayScreen
-HandleGameplayScreen: @ 0x08051988
- push {lr}
- ldr r1, _080519A4 @ =gScreenTransition
- ldr r0, [r1]
- adds r0, #1
- str r0, [r1]
- ldr r1, _080519A8 @ =gUnk_080FC9D8
- ldr r0, _080519AC @ =gMain
- ldrb r0, [r0, #3]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- pop {pc}
- .align 2, 0
-_080519A4: .4byte gScreenTransition
-_080519A8: .4byte gUnk_080FC9D8
-_080519AC: .4byte gMain
-.endif
-
-
- thumb_func_start sub_080519B0
-sub_080519B0: @ 0x080519B0
- push {r4, r5, lr}
- ldr r0, _08051A04 @ =gFadeControl
- ldrb r5, [r0]
- cmp r5, #0
- bne _08051A02
- movs r0, #1
- bl DispReset
- bl InitSoundPlayingInfo
- bl zMallocInit
- bl sub_080A7124
- bl sub_0807059C
- ldr r4, _08051A08 @ =gScreenTransition
- adds r0, r4, #0
- movs r1, #0xb0
- bl MemClear
- bl sub_08049CD4
- bl sub_080300AC
- bl sub_0807CA18
- ldr r0, _08051A0C @ =gUnk_02002AC8
- adds r1, r4, #0
- adds r1, #0xc
- movs r2, #0x20
- bl MemCopy
- movs r0, #4
- strb r0, [r4, #9]
- bl sub_08053518
- ldr r1, _08051A10 @ =gMain
- movs r0, #1
- strb r0, [r1, #3]
- strb r5, [r1, #4]
-_08051A02:
- pop {r4, r5, pc}
- .align 2, 0
-_08051A04: .4byte gFadeControl
-_08051A08: .4byte gScreenTransition
-_08051A0C: .4byte gUnk_02002AC8
-_08051A10: .4byte gMain
-
- thumb_func_start sub_08051A14
-sub_08051A14: @ 0x08051A14
- push {lr}
- movs r0, #1
- bl DispReset
- ldr r1, _08051A70 @ =gFadeControl
- movs r0, #1
- rsbs r0, r0, #0
- str r0, [r1, #4]
- ldr r0, _08051A74 @ =gUnk_03000000
- ldr r1, _08051A78 @ =0x00000B74
- bl MemClear
- ldr r0, _08051A7C @ =gUnk_02032EC0
- movs r1, #0xed
- lsls r1, r1, #2
- bl MemClear
- bl EraseAllEntities
- bl sub_080197AC
- bl sub_08080668
- bl ResetPalettes
- movs r0, #1
- bl sub_0801CFA8
- bl sub_0806FD8C
- ldr r2, _08051A80 @ =gRoomControls
- ldr r1, _08051A84 @ =gScreenTransition
- ldrb r0, [r1, #0xc]
- strb r0, [r2, #4]
- ldrb r0, [r1, #0xd]
- strb r0, [r2, #5]
- bl sub_08053320
- ldr r1, _08051A88 @ =gGFXSlots
- movs r0, #1
- strb r0, [r1]
- ldr r1, _08051A8C @ =gMain
- movs r0, #2
- strb r0, [r1, #3]
- pop {pc}
- .align 2, 0
-_08051A70: .4byte gFadeControl
-_08051A74: .4byte gUnk_03000000
-_08051A78: .4byte 0x00000B74
-_08051A7C: .4byte gUnk_02032EC0
-_08051A80: .4byte gRoomControls
-_08051A84: .4byte gScreenTransition
-_08051A88: .4byte gGFXSlots
-_08051A8C: .4byte gMain
-
- thumb_func_start sub_08051A90
-sub_08051A90: @ 0x08051A90
- push {lr}
- ldr r1, _08051AA4 @ =gUnk_080FC9E8
- ldr r0, _08051AA8 @ =gMain
- ldrb r0, [r0, #4]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- pop {pc}
- .align 2, 0
-_08051AA4: .4byte gUnk_080FC9E8
-_08051AA8: .4byte gMain
-
- thumb_func_start InitializeNewRoom
-InitializeNewRoom: @ 0x08051AAC
- push {lr}
- bl SetInitializationPriority
- ldr r1, _08051AE4 @ =gScreen
- movs r2, #0
- movs r0, #0xba
- lsls r0, r0, #5
- strh r0, [r1]
- ldr r1, _08051AE8 @ =gMain
- movs r0, #1
- strb r0, [r1, #4]
- ldr r0, _08051AEC @ =gScreenTransition
- strb r2, [r0, #8]
- strb r2, [r0, #4]
- strb r2, [r0, #5]
- bl MessageInitialize
- bl sub_08052CFC
- movs r0, #0
- bl sub_0801C370
- bl InitializeEntities
-.ifndef EU
- bl sub_0801855C
-.endif
- pop {pc}
- .align 2, 0
-_08051AE4: .4byte gScreen
-_08051AE8: .4byte gMain
-_08051AEC: .4byte gScreenTransition
-
- thumb_func_start sub_08051AF0
-sub_08051AF0: @ 0x08051AF0
-.ifdef EU
- push {r4, lr}
- bl UpdateEntities
- bl sub_0805BBBC
- cmp r0, #0
- bne _0805173E
- bl UpdateScroll
-_0805173E:
- bl UpdateBgAnim
- bl sub_08000108
- bl sub_0801C344
- bl UpdateManagers
- bl FlushSprites
- bl sub_0801C208
- bl sub_08078CB4
- bl sub_080AD9B0
- bl sub_080AD918
- ldr r0, _080517E0 @ =gFadeControl
- ldrb r0, [r0]
- cmp r0, #0
- bne _080517DC
- ldr r0, _080517E4 @ =gRoomControls
- ldrh r0, [r0]
- cmp r0, #0
- bne _080517DC
- bl sub_08052F1C
- ldr r0, _080517E8 @ =gArea
- movs r1, #0x86
- lsls r1, r1, #4
- adds r3, r0, r1
- adds r1, #4
- adds r0, r0, r1
- ldr r1, [r3]
- ldr r2, [r0]
- cmp r1, r2
- beq _08051796
- str r2, [r3]
- ldr r0, _080517EC @ =0x800B0000
- orrs r2, r0
- adds r0, r2, #0
- bl SoundReq
-_08051796:
- bl DeleteSleepingEntities
- bl sub_0805BC04
- adds r4, r0, #0
- cmp r4, #0
- bne _080517DC
- bl sub_08052C5C
- bl ResetSystemPriority
- bl sub_08051E04
- bl sub_080300C4
- ldr r1, _080517F0 @ =gMain
- movs r0, #2
- strb r0, [r1, #4]
- movs r0, #0
- bl SetPlayerControl
- ldr r0, _080517F4 @ =gUnk_02034490
- strb r4, [r0]
- bl sub_08053178
- bl sub_0801855C
- ldr r0, _080517F8 @ =gRoomVars
- ldrb r0, [r0]
- cmp r0, #0
- bne _080517DC
- movs r0, #0
- movs r1, #1
- bl RequestPriorityDuration
-_080517DC:
- pop {r4, pc}
- .align 2, 0
-_080517E0: .4byte gFadeControl
-_080517E4: .4byte gRoomControls
-_080517E8: .4byte gArea
-_080517EC: .4byte 0x800B0000
-_080517F0: .4byte gMain
-_080517F4: .4byte gUnk_02034490
-_080517F8: .4byte gRoomVars
-
-.else
- push {r4, r5, lr}
- bl UpdateEntities
- bl sub_0805BBBC
- cmp r0, #0
- bne _08051B02
- bl UpdateScroll
-_08051B02:
- bl UpdateBgAnim
- bl sub_08000108
- bl sub_0801C344
- bl UpdateManagers
- bl FlushSprites
- bl sub_0801C208
- bl sub_08078CB4
- bl sub_080AD9B0
- bl sub_080AD918
- ldr r0, _08051BB0 @ =gFadeControl
- ldrb r0, [r0]
- cmp r0, #0
- bne _08051BAE
- ldr r0, _08051BB4 @ =gRoomControls
- ldrh r0, [r0]
- cmp r0, #0
- bne _08051BAE
- bl sub_08052F1C
- ldr r5, _08051BB8 @ =gArea
- movs r0, #0x86
- lsls r0, r0, #4
- adds r3, r5, r0
-.ifdef EU
- adds r1, 4
-.else
- ldr r1, _08051BBC @ =0x00000864
-.endif
- adds r0, r5, r1
- ldr r1, [r3]
- ldr r2, [r0]
- cmp r1, r2
- beq _08051B5A
- str r2, [r3]
- ldr r0, _08051BC0 @ =0x800B0000
- orrs r2, r0
- adds r0, r2, #0
- bl SoundReq
-_08051B5A:
- bl DeleteSleepingEntities
- bl sub_0805BC04
- adds r4, r0, #0
- cmp r4, #0
- bne _08051BAE
- bl sub_08052C5C
- bl ResetSystemPriority
- bl sub_08051E04
- bl sub_080300C4
- ldr r1, _08051BC4 @ =gMain
- movs r0, #2
- strb r0, [r1, #4]
- movs r0, #0
- bl SetPlayerControl
- ldr r0, _08051BC8 @ =gUnk_02034490
- strb r4, [r0]
-.ifdef DEMO_JP
- ldr r0, _08051C30 @ =gScreenTransition
- adds r0,#0x31
- ldrb r0,[r0,#0x0]
- cmp r0,#0x0
- beq _08051bee
-
- bl sub_08053178
-_08051bee:
- adds r0,r5,#0x0
- adds r0,#0x28
- ldrb r0,[r0,#0x0]
- cmp r0,#0xff
- beq _08051bfc
- bl sub_0801855C
-_08051bfc:
- bl sub_08052BF8
-
-.else
-
-.ifdef JP
- bl sub_08053178
-.endif
-
-.ifndef EU
- adds r0, r5, #0
- adds r0, #0x28
- ldrb r0, [r0]
- cmp r0, #0xff
- beq _08051B96
- bl sub_0801855C
-.endif
-_08051B96:
-.ifdef EU
- bl sub_08053178 @ TODO fix addresses
- bl sub_08053178
-.else
-.ifdef DEMO_JP
- bl sub_08053178 @ TODO fix addresses
- bl sub_08053178
-.else
-.ifndef JP
- bl sub_08052BF8
- bl sub_08053178
-.endif
-.endif
-.endif
-.endif
- ldr r0, _08051BCC @ =gRoomVars
- ldrb r0, [r0]
- cmp r0, #0
- bne _08051BAE
- movs r0, #0
- movs r1, #1
- bl RequestPriorityDuration
-_08051BAE:
- pop {r4, r5, pc}
- .align 2, 0
-_08051BB0: .4byte gFadeControl
-_08051BB4: .4byte gRoomControls
-_08051BB8: .4byte gArea
-.ifndef EU
-_08051BBC: .4byte 0x00000864
-.endif
-_08051BC0: .4byte 0x800B0000
-_08051BC4: .4byte gMain
-_08051BC8: .4byte gUnk_02034490
-.ifdef DEMO_JP
-_08051C30: .4byte gScreenTransition
-.endif
-_08051BCC: .4byte gRoomVars
-.endif
-
- thumb_func_start sub_08051BD0
-sub_08051BD0: @ 0x08051BD0
- push {lr}
- bl sub_080705AC
- cmp r0, #0
- bne _08051C9C
- bl sub_0804AA84
- cmp r0, #0
- bne _08051C9C
- bl sub_0805340C
- ldr r0, _08051C5C @ =gMain
- ldrb r0, [r0, #4]
- cmp r0, #2
- bne _08051C9C
- ldr r0, _08051C60 @ =gMessage
- ldrb r1, [r0]
- movs r0, #0x7f
- ands r0, r1
- cmp r0, #0
- bne _08051C02
- ldr r0, _08051C64 @ =gPriorityHandler
- ldrh r0, [r0, #8]
- cmp r0, #0
- beq _08051C06
-_08051C02:
- bl sub_08078B48
-_08051C06:
- bl FlushSprites
- bl UpdateEntities
- bl sub_08080A40
- bl CollisionMain
- bl UpdateScroll
- bl UpdateBgAnim
- bl sub_08000108
- bl sub_08052C3C
- bl sub_0801C344
- bl UpdateManagers
- bl sub_0801C208
- bl sub_08078CB4
- bl sub_080AD9B0
- bl HandleRoomExit
- bl sub_08052C5C
- bl sub_080528B4
- bl sub_080185F8
- bl sub_080AD918
- ldr r0, _08051C68 @ =gRoomControls
- ldrh r2, [r0]
- cmp r2, #1
- beq _08051C6C
- cmp r2, #2
- beq _08051C88
- b _08051C9C
- .align 2, 0
-_08051C5C: .4byte gMain
-_08051C60: .4byte gMessage
-_08051C64: .4byte gPriorityHandler
-_08051C68: .4byte gRoomControls
-_08051C6C:
- ldr r0, _08051C80 @ =gPlayerState
- movs r1, #0x17
- strb r1, [r0, #0xc]
- ldr r0, _08051C84 @ =gMain
- strb r2, [r0, #4]
- bl SetRoomReloadPriority
- bl sub_08051D98
- b _08051C9C
- .align 2, 0
-_08051C80: .4byte gPlayerState
-_08051C84: .4byte gMain
-_08051C88:
- ldr r1, _08051CA0 @ =gPlayerState
- movs r0, #0x17
- strb r0, [r1, #0xc]
- ldr r1, _08051CA4 @ =gMain
- movs r0, #1
- strb r0, [r1, #4]
- bl SetRoomReloadPriority
- bl sub_08051DCC
-_08051C9C:
- pop {pc}
- .align 2, 0
-_08051CA0: .4byte gPlayerState
-_08051CA4: .4byte gMain
-
- thumb_func_start sub_08051CA8
-sub_08051CA8: @ 0x08051CA8
- push {lr}
- bl sub_080705AC
- cmp r0, #0
- bne _08051CEA
- bl UpdateEntities
- bl CollisionMain
- bl sub_0801C344
- bl UpdateManagers
- bl FlushSprites
- bl sub_0801C208
- bl sub_08078CB4
- bl sub_080AD9B0
- bl HandleRoomExit
- bl sub_080528B4
- bl sub_080AD918
- ldr r0, _08051CEC @ =gFadeControl
- ldrb r0, [r0]
- cmp r0, #0
- bne _08051CEA
- bl ResetSystemPriority
-_08051CEA:
- pop {pc}
- .align 2, 0
-_08051CEC: .4byte gFadeControl
-
- thumb_func_start sub_08051CF0
-sub_08051CF0: @ 0x08051CF0
- push {r4, r5, r6, lr}
- bl FlushSprites
- bl sub_0801C208
- bl sub_080AD9B0
- ldr r5, _08051D20 @ =gMain
- movs r6, #1
- strb r6, [r5, #0xb]
- bl sub_080AD918
- ldr r0, _08051D24 @ =gFadeControl
- ldrb r4, [r0]
- cmp r4, #0
- bne _08051D1E
- movs r0, #1
- bl DispReset
- strb r6, [r5, #3]
- strb r4, [r5, #4]
- ldr r0, _08051D28 @ =gScreenTransition
- strb r6, [r0, #8]
-_08051D1E:
- pop {r4, r5, r6, pc}
- .align 2, 0
-_08051D20: .4byte gMain
-_08051D24: .4byte gFadeControl
-_08051D28: .4byte gScreenTransition
-
- thumb_func_start sub_08051D2C
-sub_08051D2C: @ 0x08051D2C
-.ifdef DEMO_USA
- push {lr}
- ldr r0, _08051E04 @ =0x03000FD0
- ldrb r0, [r0]
- cmp r0, #0
- bne _08051E02
- bl DoSoftReset
-_08051E02:
- pop {pc}
- .align 2, 0
-_08051E04: .4byte 0x03000FD0
-.else
- push {lr}
- movs r0, #7
- movs r1, #8
- bl DoFade
- movs r0, #3
- bl InitScreen
- pop {pc}
- .align 2, 0
-.endif
-
- thumb_func_start InitializeEntities
-InitializeEntities: @ 0x08051D40
- push {lr}
- bl sub_08052EA0
- bl sub_0804AF90
- bl sub_0804AFDC
- bl InitializePlayer
- ldr r1, _08051D90 @ =gUnk_03004030
- movs r0, #0
- str r0, [r1]
- bl sub_0807C740
- ldr r1, _08051D94 @ =gUpdateVisibleTiles
- movs r0, #1
- strb r0, [r1]
- bl sub_0805283C
- movs r0, #0
- movs r1, #0
- bl SetColor
- bl LoadRoom
- bl CreateZeldaFollower
- bl sub_0804AFF4
- bl sub_0805329C
- bl sub_08000108
- movs r0, #1
- rsbs r0, r0, #0
- bl sub_0805BB74
- bl sub_080531F8
- pop {pc}
- .align 2, 0
-_08051D90: .4byte gUnk_03004030
-_08051D94: .4byte gUpdateVisibleTiles
-
- thumb_func_start sub_08051D98
-sub_08051D98: @ 0x08051D98
- push {lr}
- bl sub_08052EA0
- ldr r1, _08051DC8 @ =gRoomVars
- movs r0, #1
- strb r0, [r1]
- bl sub_0805E9A8
- bl sub_0804AF90
- bl sub_0804AFDC
- bl sub_0807C0DC
- bl sub_0805283C
- bl LoadRoom
- bl sub_0804AFF4
- movs r0, #1
- bl SetPlayerControl
- pop {pc}
- .align 2, 0
-_08051DC8: .4byte gRoomVars
-
- thumb_func_start sub_08051DCC
-sub_08051DCC: @ 0x08051DCC
- push {r4, lr}
- ldr r1, _08051DFC @ =gRoomControls
- ldr r4, _08051E00 @ =gScreenTransition
- ldrb r0, [r4, #0xc]
- strb r0, [r1, #4]
- ldrb r0, [r4, #0xd]
- strb r0, [r1, #5]
- bl RoomExitCallback
- movs r0, #3
- strb r0, [r4, #9]
- bl sub_08052CFC
- bl sub_08052EA0
- bl sub_0805E9A8
- bl sub_0804AF90
- bl sub_0804AFDC
- bl sub_0805283C
- pop {r4, pc}
- .align 2, 0
-_08051DFC: .4byte gRoomControls
-_08051E00: .4byte gScreenTransition
-
- thumb_func_start sub_08051E04
-sub_08051E04: @ 0x08051E04
- push {lr}
- bl CheckIsOverworld
- cmp r0, #0
- beq _08051E60
- ldr r1, _08051E2C @ =gPlayerEntity
- movs r2, #0x2e
- ldrsh r0, [r1, r2]
- cmp r0, #0
- bge _08051E1A
- adds r0, #0xf
-_08051E1A:
- asrs r2, r0, #4
- movs r3, #0x32
- ldrsh r0, [r1, r3]
- cmp r0, #0
- bge _08051E26
- adds r0, #0xf
-_08051E26:
- asrs r1, r0, #4
- ldr r3, _08051E30 @ =gUnk_08127F94
- b _08051E36
- .align 2, 0
-_08051E2C: .4byte gPlayerEntity
-_08051E30: .4byte gUnk_08127F94
-_08051E34:
- adds r3, #8
-_08051E36:
- ldrb r0, [r3]
- cmp r0, #0xff
- beq _08051E60
- cmp r0, r2
- bhi _08051E34
- ldrb r0, [r3, #2]
- cmp r0, r2
- blo _08051E34
- ldrb r0, [r3, #1]
- cmp r0, r1
- bhi _08051E34
- ldrb r0, [r3, #3]
- cmp r0, r1
- blo _08051E34
- ldr r2, _08051E64 @ =gSave
- movs r1, #1
- ldrb r3, [r3, #4]
- lsls r1, r3
- ldr r0, [r2, #0x40]
- orrs r0, r1
- str r0, [r2, #0x40]
-_08051E60:
- pop {pc}
- .align 2, 0
-_08051E64: .4byte gSave
-
- thumb_func_start sub_08051E68
-sub_08051E68: @ 0x08051E68
- push {lr}
- ldr r1, _08051E7C @ =gUnk_080FCA08
- ldr r0, _08051E80 @ =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
-_08051E7C: .4byte gUnk_080FCA08
-_08051E80: .4byte gMenu
-
- thumb_func_start sub_08051E84
-sub_08051E84: @ 0x08051E84
- push {r4, r5, r6, lr}
- ldr r0, _08051EF0 @ =gUnk_02032EC0
- ldrb r4, [r0, #3]
- lsls r4, r4, #3
- ldr r0, _08051EF4 @ =gUnk_080FCA20
- adds r4, r4, r0
- ldr r5, _08051EF8 @ =gRoomControls
- ldrb r0, [r4]
- strb r0, [r5, #4]
- ldrb r0, [r4, #1]
- strb r0, [r5, #5]
- bl sub_08053320
- ldrb r0, [r5, #4]
- bl GetFlagBankOffset
- ldr r1, _08051EFC @ =gArea
- movs r6, #0
- strh r0, [r1, #4]
- ldrb r0, [r4]
- ldrb r1, [r4, #1]
- bl SetCurrentRoomPropertyList
- ldrb r0, [r4]
- ldrb r1, [r4, #1]
- bl sub_08052FD8
- ldrh r0, [r4, #4]
- ldrh r1, [r5, #6]
- adds r0, r0, r1
- strh r0, [r5, #0xa]
- ldrh r0, [r4, #6]
- ldrh r1, [r5, #8]
- adds r0, r0, r1
- strh r0, [r5, #0xc]
- ldr r1, _08051F00 @ =gMenu
- ldrb r0, [r4, #2]
- strb r0, [r1]
- ldrb r2, [r4, #3]
- movs r0, #0xf
- ands r0, r2
- strb r0, [r1, #3]
- str r4, [r1, #0xc]
- ldrb r0, [r1, #5]
- adds r0, #1
- strb r0, [r1, #5]
- strb r6, [r1, #6]
- movs r0, #0x96
- lsls r0, r0, #1
- strh r0, [r1, #8]
- bl sub_08051F04
- pop {r4, r5, r6, pc}
- .align 2, 0
-_08051EF0: .4byte gUnk_02032EC0
-_08051EF4: .4byte gUnk_080FCA20
-_08051EF8: .4byte gRoomControls
-_08051EFC: .4byte gArea
-_08051F00: .4byte gMenu
-
- thumb_func_start sub_08051F04
-sub_08051F04: @ 0x08051F04
- push {lr}
- ldr r1, _08051F38 @ =gUnk_080FCA14
- ldr r0, _08051F3C @ =gMenu
- ldrb r0, [r0]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- bl FlushSprites
- bl UpdateEntities
- bl sub_080AD9B0
- bl sub_080AD918
- bl UpdateScroll
- bl UpdateBgAnim
- bl UpdateManagers
- bl sub_08000108
- pop {pc}
- .align 2, 0
-_08051F38: .4byte gUnk_080FCA14
-_08051F3C: .4byte gMenu
-
- thumb_func_start sub_08051F40
-sub_08051F40: @ 0x08051F40
- push {lr}
- ldr r0, _08051F60 @ =gUnk_080FCA20
- ldr r2, _08051F64 @ =gUnk_02032EC0
- ldrb r1, [r2, #3]
- lsls r1, r1, #3
- adds r1, r1, r0
- ldrb r1, [r1, #3]
- movs r0, #0xf0
- ands r0, r1
- cmp r0, #0
- beq _08051F68
- lsrs r1, r1, #4
- movs r0, #2
- bl MenuFadeIn
- b _08051F76
- .align 2, 0
-_08051F60: .4byte gUnk_080FCA20
-_08051F64: .4byte gUnk_02032EC0
-_08051F68:
- movs r0, #3
- strb r0, [r2]
- movs r0, #0x10
- bl sub_080500F4
- bl MessageInitialize
-_08051F76:
- pop {pc}
-
- thumb_func_start sub_08051F78
-sub_08051F78: @ 0x08051F78
- push {lr}
- ldr r0, _08051F94 @ =gUnk_02032EC0
- ldrb r3, [r0, #3]
- lsls r3, r3, #3
- ldr r0, _08051F98 @ =gUnk_080FCA20
- adds r3, r3, r0
- ldrb r0, [r3]
- ldrb r1, [r3, #1]
- ldrh r2, [r3, #4]
- ldrh r3, [r3, #6]
- bl sub_08051F9C
- pop {pc}
- .align 2, 0
-_08051F94: .4byte gUnk_02032EC0
-_08051F98: .4byte gUnk_080FCA20
-
- thumb_func_start sub_08051F9C
-sub_08051F9C: @ 0x08051F9C
- push {r4, r5, r6, lr}
- mov r6, r8
- push {r6}
- adds r6, r2, #0
- mov r8, r3
- ldr r5, _08051FE0 @ =gScreen
- ldrh r2, [r5]
- movs r4, #0xc0
- lsls r4, r4, #7
- ands r4, r2
- bl sub_08052FF4
- ldr r1, _08051FE4 @ =gRoomControls
- ldrh r0, [r1, #6]
- adds r0, r0, r6
- movs r6, #0
- strh r0, [r1, #0xa]
- ldrh r0, [r1, #8]
- add r0, r8
- strh r0, [r1, #0xc]
- bl sub_0807C740
- ldr r1, _08051FE8 @ =gUpdateVisibleTiles
- movs r0, #1
- strb r0, [r1]
- ldr r0, _08051FEC @ =gUsedPalettes
- str r6, [r0]
- ldrh r0, [r5]
- orrs r4, r0
- strh r4, [r5]
- pop {r3}
- mov r8, r3
- pop {r4, r5, r6, pc}
- .align 2, 0
-_08051FE0: .4byte gScreen
-_08051FE4: .4byte gRoomControls
-_08051FE8: .4byte gUpdateVisibleTiles
-_08051FEC: .4byte gUsedPalettes
-
- thumb_func_start sub_08051FF0
-sub_08051FF0: @ 0x08051FF0
- push {lr}
- ldr r0, _08052000 @ =gMenu
- ldr r1, [r0, #0xc]
- ldrb r0, [r1]
- ldrb r1, [r1, #1]
- bl sub_0804B0B0
- pop {pc}
- .align 2, 0
-_08052000: .4byte gMenu
-
- thumb_func_start sub_08052004
-sub_08052004: @ 0x08052004
- ldr r1, _0805200C @ =gMenu
- movs r0, #2
- strb r0, [r1, #5]
- bx lr
- .align 2, 0
-_0805200C: .4byte gMenu
-
- thumb_func_start sub_08052010
-sub_08052010: @ 0x08052010
- push {r4, lr}
- bl InitSoundPlayingInfo
- bl MessageInitialize
- movs r0, #1
- bl DispReset
- ldr r0, _0805207C @ =gBG1Buffer
- movs r4, #0x80
- lsls r4, r4, #4
- adds r1, r4, #0
- bl MemClear
- ldr r0, _08052080 @ =gBG2Buffer
- adds r1, r4, #0
- bl MemClear
- bl sub_080A4D34
- movs r0, #0xa
- bl LoadPaletteGroup
- movs r0, #0
- movs r1, #0
- bl SetColor
- movs r0, #4
- bl LoadGfxGroup
- movs r0, #0xc0
- lsls r0, r0, #0x13
- movs r1, #0x20
- bl MemClear
- ldr r0, _08052084 @ =gMenu
- movs r1, #0x30
- bl MemClear
- ldr r1, _08052088 @ =gScreen
- ldrh r2, [r1]
- movs r3, #0x80
- lsls r3, r3, #5
- adds r0, r3, #0
- orrs r0, r2
- strh r0, [r1]
- ldr r0, _0805208C @ =0x00001C01
- strh r0, [r1, #0x14]
- ldr r0, _08052090 @ =0x00001D05
- strh r0, [r1, #0x20]
- movs r0, #1
- strh r0, [r1, #0x1a]
- strh r0, [r1, #0x26]
- pop {r4, pc}
- .align 2, 0
-_0805207C: .4byte gBG1Buffer
-_08052080: .4byte gBG2Buffer
-_08052084: .4byte gMenu
-_08052088: .4byte gScreen
-_0805208C: .4byte 0x00001C01
-_08052090: .4byte 0x00001D05
-
- thumb_func_start HandleGameOverScreen
-HandleGameOverScreen: @ 0x08052094
- push {r4, lr}
- ldr r1, _080520BC @ =gUnk_080FCA70
- ldr r4, _080520C0 @ =gMain
- ldrb r0, [r4, #3]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- ldrb r0, [r4, #3]
- cmp r0, #0
- beq _080520B8
- bl FlushSprites
- bl DrawGameOverText
- bl sub_080AD918
-_080520B8:
- pop {r4, pc}
- .align 2, 0
-_080520BC: .4byte gUnk_080FCA70
-_080520C0: .4byte gMain
-
- thumb_func_start sub_080520C4
-sub_080520C4: @ 0x080520C4
- push {lr}
- ldr r1, _080520D4 @ =gMain
- strb r0, [r1, #3]
- movs r0, #0
- bl sub_080A7114
- pop {pc}
- .align 2, 0
-_080520D4: .4byte gMain
-
- thumb_func_start sub_080520D8
-sub_080520D8: @ 0x080520D8
- push {r4, lr}
- ldr r4, _08052118 @ =gFadeControl
- ldrb r0, [r4]
- cmp r0, #0
- bne _08052114
- bl sub_08052010
- ldr r1, _0805211C @ =gMenu
- movs r0, #0x50
- strb r0, [r1, #0x10]
- movs r2, #0x3c
- movs r0, #0x3c
- strh r0, [r1, #8]
- ldr r0, _08052120 @ =gSave
- adds r0, #0xaa
- movs r1, #0x18
- strb r1, [r0]
- ldr r0, _08052124 @ =gMain
- strb r2, [r0, #5]
- movs r0, #0xa
- bl SoundReq
- movs r0, #4
- bl sub_080500F4
- ldr r0, _08052128 @ =0xFFFF0001
- str r0, [r4, #4]
- movs r0, #1
- bl sub_080520C4
-_08052114:
- pop {r4, pc}
- .align 2, 0
-_08052118: .4byte gFadeControl
-_0805211C: .4byte gMenu
-_08052120: .4byte gSave
-_08052124: .4byte gMain
-_08052128: .4byte 0xFFFF0001
-
diff --git a/include/asm.h b/include/asm.h
index f250ebb1..5fe8a9e0 100644
--- a/include/asm.h
+++ b/include/asm.h
@@ -9,6 +9,7 @@ extern u32 GetTileTypeByEntity(struct Entity_*);
extern u32 GetTileTypeByPos(s32 x, s32 y, u32 layer);
extern u32 GetTileType(u32 pos, u32 layer);
extern void SetTile(u32 index, u32 position, u32 layer);
+extern void sub_08000108(void);
extern u32 sub_080002D0(struct Entity_*);
extern void LoadResourceAsync(const void*, u32, u32);
extern void sub_08001242(struct Entity_*);
diff --git a/include/common.h b/include/common.h
index a971ed21..e46df918 100644
--- a/include/common.h
+++ b/include/common.h
@@ -43,6 +43,8 @@ void MemCopy(const void* src, void* dest, u32 size);
*/
void ReadKeyInput(void);
+void zMallocInit(void);
+
/**
* Allocate memory on heap.
*
diff --git a/include/main.h b/include/main.h
index eda7676c..0e830bab 100644
--- a/include/main.h
+++ b/include/main.h
@@ -55,7 +55,8 @@ typedef struct {
} Main;
typedef struct {
- /*0x00*/ u16 nextToLoad;
+ /*0x00*/ u8 nextToLoad;
+ /*0x01*/ u8 _1;
/*0x02*/ u8 lastState;
/*0x03*/ u8 field_0x3;
/*0x04*/ u8 state;
diff --git a/include/player.h b/include/player.h
index 2a09e2e2..36fd7303 100644
--- a/include/player.h
+++ b/include/player.h
@@ -280,6 +280,7 @@ extern u16 gWalletSizes[];
extern PlayerState gPlayerState;
extern Entity gPlayerEntity;
+u32 sub_080705AC(void);
void SetPlayerControl(PlayerControlMode mode);
void ResetPlayer(void);
void ResetPlayerVelocity(void);
diff --git a/include/room.h b/include/room.h
index fb2e8398..bb09730f 100644
--- a/include/room.h
+++ b/include/room.h
@@ -192,9 +192,13 @@ typedef enum {
extern void SetTileType(u32, u32, u32);
extern void InitScreenShake(u32 time, u32 magnitude);
+void sub_0804AFF4(void);
+void LoadRoom(void);
+void SetCurrentRoomPropertyList(u32 area, u32 room);
extern void* GetCurrentRoomProperty(u32);
extern void LoadRoomTileEntities();
void sub_0804B3C4(void*);
+void sub_0804B0B0(u32 arg0, u32 arg1);
#endif
diff --git a/linker.ld b/linker.ld
index fc7f630c..9b1bf7e4 100644
--- a/linker.ld
+++ b/linker.ld
@@ -437,7 +437,6 @@ SECTIONS {
src/roomInit.o(.text);
src/fade.o(.text);
src/fileScreen.o(.text);
- asm/fileScreen.o(.text);
src/game.o(.text);
asm/code_080526F8.o(.text);
asm/modBombs.o(.text);
diff --git a/src/game.c b/src/game.c
index fee68b34..9b5616e4 100644
--- a/src/game.c
+++ b/src/game.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "asm.h"
#include "sound.h"
#include "screen.h"
#include "entity.h"
@@ -15,6 +16,8 @@
#include "message.h"
#include "game.h"
+extern u8 gUpdateVisibleTiles;
+
extern u8 gUnk_080FCA84[];
extern u8 gUnk_080FCAC8[];
extern u8 gUnk_02024090[];
@@ -30,6 +33,39 @@ extern void** gAreaTable[];
extern u8 gUnk_080FCAF8[];
extern u16 gUnk_020178E0[];
+extern void (*gUnk_080FC9D8[])();
+extern void (*gUnk_080FC9E8[])();
+extern void (*gUnk_080FCA08[])();
+extern void (*gUnk_080FCA14[])();
+extern void (*gUnk_080FCA70[])(void);
+
+void sub_0807CA18(void);
+void sub_080300AC(void);
+void sub_08049CD4(void);
+void sub_0807059C(void);
+void sub_080A7124(void);
+void sub_0806FD8C(void);
+void sub_080300C4(void);
+u32 sub_0805BC04(void);
+void DeleteSleepingEntities(void);
+u32 sub_0805BBBC(void);
+void sub_080185F8(void);
+void sub_08080A40(void);
+u32 sub_0804AA84(void);
+void sub_08078CB4(void);
+void sub_0801C344();
+u32 sub_080705AC();
+void CollisionMain();
+void sub_0805BB74();
+void CreateZeldaFollower(void);
+void sub_0807C0DC();
+void sub_0805E9A8();
+void sub_0804AF90();
+void sub_0804AFDC();
+void sub_0805283C();
+void UpdateScroll();
+void UpdateBgAnim();
+void sub_08052010();
void sub_080520C4();
void CleanUpGFXSlots();
void sub_080ADE24();
@@ -48,6 +84,25 @@ void sub_0807C740(void);
void sub_080197AC(void);
void sub_08053390(void);
+static void sub_08053518(void);
+static void InitializeEntities(void);
+static void sub_08053178(void);
+static void sub_08052BF8(void);
+static void sub_08051E04(void);
+static void sub_08052F1C(void);
+/* static */ void sub_08052C5C(void);
+static void sub_08052C3C(void);
+static void sub_0805340C(void);
+static void sub_08051D98(void);
+static void sub_08051DCC(void);
+/* static */ u32 sub_080528B4(void);
+/* static */ u32 HandleRoomExit(void);
+static void sub_080531F8(void);
+static void sub_0805329C(void);
+static void InitializePlayer(void);
+/* static */ void sub_08051F04(void);
+/* static */ void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4);
+static void DrawGameOverText(void);
static u32 StairsAreValid();
static void ClearFlagArray(const u16*);
static void DummyHandler(u32* a1);
@@ -59,6 +114,26 @@ static void sub_080532E4(void);
static void sub_08053460(void);
typedef struct {
+ u8 _0;
+ u8 _1;
+ u8 _2;
+ u8 _3;
+ u8 _4;
+ u16 _6;
+} struct_08127F94;
+extern struct_08127F94 gUnk_08127F94[];
+
+typedef struct {
+ u8 _0;
+ u8 _1;
+ u8 _2;
+ u8 _3;
+ u16 _4;
+ u16 _6;
+} struct_080FCA20;
+extern struct_080FCA20 gUnk_080FCA20[];
+
+typedef struct {
u16* dest;
void* gfx_dest;
void* buffer_loc;
@@ -85,6 +160,417 @@ typedef struct {
extern void CreateDialogBox();
+void HandleGameplayScreen(void) {
+ gScreenTransition.frameCount++;
+ gUnk_080FC9D8[gMain.funcIndex]();
+#ifdef DEMO_USA
+ if (gSave.unk48C[7] != 0) {
+ if (--gSave.unk48C[7] == 0) {
+ DoFade(7, 2);
+ gMain.funcIndex = 3;
+ }
+ }
+#endif
+}
+
+void sub_080519B0(void) {
+ if (gFadeControl.active)
+ return;
+
+ DispReset(1);
+ InitSoundPlayingInfo();
+ zMallocInit();
+ sub_080A7124();
+ sub_0807059C();
+ MemClear(&gScreenTransition, 0xB0);
+ sub_08049CD4();
+ sub_080300AC();
+ sub_0807CA18();
+ MemCopy(&gSave.saved_status, &gScreenTransition.player_status, 0x20);
+ gScreenTransition.transitionType = 4;
+ sub_08053518();
+ gMain.funcIndex = 1;
+ gMain.transition = 0;
+}
+
+void sub_08051A14(void) {
+ DispReset(1);
+ gFadeControl.mask = 0xffffffff;
+ MemClear(&gUnk_03000000, 0xB74);
+ MemClear(&gUnk_02032EC0, 0x3B4);
+ EraseAllEntities();
+ sub_080197AC();
+ sub_08080668();
+ ResetPalettes();
+ sub_0801CFA8(1);
+ sub_0806FD8C();
+ gRoomControls.areaID = gScreenTransition.player_status.area_next;
+ gRoomControls.roomID = gScreenTransition.player_status.room_next;
+ sub_08053320();
+ gGFXSlots.unk0 = 1;
+ gMain.funcIndex = 2;
+}
+
+void sub_08051A90(void) {
+ gUnk_080FC9E8[gMain.transition]();
+}
+
+void InitializeNewRoom(void) {
+ SetInitializationPriority();
+ gScreen.lcd.displayControl = 0x1740;
+ gMain.transition = 1;
+ gScreenTransition.transitioningOut = 0;
+ gScreenTransition.field_0x4[0] = 0;
+ gScreenTransition.field_0x4[1] = 0;
+ MessageInitialize();
+ sub_08052CFC();
+ sub_0801C370(0);
+ InitializeEntities();
+#ifndef EU
+ sub_0801855C();
+#endif
+}
+
+void sub_08051AF0(void) {
+ UpdateEntities();
+ if (!sub_0805BBBC())
+ UpdateScroll();
+ UpdateBgAnim();
+ sub_08000108();
+ sub_0801C344();
+ UpdateManagers();
+ FlushSprites();
+ sub_0801C208();
+ sub_08078CB4();
+ sub_080AD9B0();
+ sub_080AD918();
+
+ if (gFadeControl.active || gRoomControls.unk2 != 0)
+ return;
+
+ sub_08052F1C();
+ if (gArea.musicIndex != gArea.pMusicIndex) {
+ gArea.musicIndex = gArea.pMusicIndex;
+ SoundReq(gArea.pMusicIndex | 0x800B0000);
+ }
+
+ DeleteSleepingEntities();
+
+ if (sub_0805BC04())
+ return;
+
+ sub_08052C5C();
+ ResetSystemPriority();
+ sub_08051E04();
+ sub_080300C4();
+ gMain.transition = 2;
+ SetPlayerControl(0);
+ gUnk_02034490[0] = 0;
+#if defined(USA) || defined(DEMO_USA)
+ if (gArea.inventoryGfxIdx != 0xff) {
+ sub_0801855C();
+ }
+ sub_08052BF8();
+ sub_08053178();
+#elif defined(EU)
+ sub_08053178();
+ sub_0801855C();
+#elif defined(JP)
+ sub_08053178();
+ if (gArea.inventoryGfxIdx != 0xff) {
+ sub_0801855C();
+ }
+#elif defined(DEMO_JP)
+ if (gScreenTransition.field_0x2c[5])
+ sub_08053178();
+ if (gArea.inventoryGfxIdx != 0xff) {
+ sub_0801855C();
+ }
+ sub_08052BF8();
+#endif
+ if (!gRoomVars.field_0x0) {
+ RequestPriorityDuration(NULL, 1);
+ }
+}
+
+void sub_08051BD0(void) {
+ if (sub_080705AC() || sub_0804AA84()) {
+ return;
+ }
+ sub_0805340C();
+
+ if (gMain.transition != 2) {
+ return;
+ }
+
+ if ((gMessage.doTextBox & 0x7f) || gPriorityHandler.priority_timer != 0)
+ sub_08078B48();
+
+ FlushSprites();
+ UpdateEntities();
+ sub_08080A40();
+ CollisionMain();
+ UpdateScroll();
+ UpdateBgAnim();
+ sub_08000108();
+ sub_08052C3C();
+ sub_0801C344();
+ UpdateManagers();
+ sub_0801C208();
+ sub_08078CB4();
+ sub_080AD9B0();
+ HandleRoomExit();
+ sub_08052C5C();
+ sub_080528B4();
+ sub_080185F8();
+ sub_080AD918();
+ switch (gRoomControls.unk2) {
+ case 1:
+ gPlayerState.queued_action = 0x17;
+ gMain.transition = 1;
+ SetRoomReloadPriority();
+ sub_08051D98();
+ break;
+ case 2:
+ gPlayerState.queued_action = 0x17;
+ gMain.transition = 1;
+ SetRoomReloadPriority();
+ sub_08051DCC();
+ break;
+ }
+}
+
+void sub_08051CA8(void) {
+ if (sub_080705AC())
+ return;
+
+ UpdateEntities();
+ CollisionMain();
+ sub_0801C344();
+ UpdateManagers();
+ FlushSprites();
+ sub_0801C208();
+ sub_08078CB4();
+ sub_080AD9B0();
+ HandleRoomExit();
+ sub_080528B4();
+ sub_080AD918();
+ if (!gFadeControl.active)
+ ResetSystemPriority();
+}
+
+void sub_08051CF0(void) {
+ FlushSprites();
+ sub_0801C208();
+ sub_080AD9B0();
+ gMain.pad = 1;
+ sub_080AD918();
+ if (!gFadeControl.active) {
+ DispReset(1);
+ gMain.funcIndex = 1;
+ gMain.transition = 0;
+ gScreenTransition.transitioningOut = 1;
+ }
+}
+
+void sub_08051D2C(void) {
+#ifdef DEMO_USA
+ if (!gFadeControl.active)
+ DoSoftReset();
+#else
+ DoFade(7, 8);
+ InitScreen(3);
+#endif
+}
+
+static void InitializeEntities(void) {
+ sub_08052EA0();
+ sub_0804AF90();
+ sub_0804AFDC();
+ InitializePlayer();
+ gUnk_03004030.unk_00 = NULL;
+ sub_0807C740();
+ gUpdateVisibleTiles = 1;
+ sub_0805283C();
+ SetColor(0, 0);
+ LoadRoom();
+ CreateZeldaFollower();
+ sub_0804AFF4();
+ sub_0805329C();
+ sub_08000108();
+ sub_0805BB74(0xffffffff);
+ sub_080531F8();
+}
+
+void sub_08051D98(void) {
+ sub_08052EA0();
+ gRoomVars.field_0x0 = 1;
+ sub_0805E9A8();
+ sub_0804AF90();
+ sub_0804AFDC();
+ sub_0807C0DC();
+ sub_0805283C();
+ LoadRoom();
+ sub_0804AFF4();
+ SetPlayerControl(1);
+}
+
+void sub_08051DCC(void) {
+ gRoomControls.areaID = gScreenTransition.player_status.area_next;
+ gRoomControls.roomID = gScreenTransition.player_status.room_next;
+ RoomExitCallback();
+ gScreenTransition.transitionType = 3;
+ sub_08052CFC();
+ sub_08052EA0();
+ sub_0805E9A8();
+ sub_0804AF90();
+ sub_0804AFDC();
+ sub_0805283C();
+}
+
+void sub_08051E04() {
+ if (CheckIsOverworld()) {
+ struct_08127F94* i;
+ u32 hi_x, hi_y;
+ s32 x, y;
+
+ x = gPlayerEntity.x.HALF.HI;
+ if (x < 0)
+ x += 0xf;
+ hi_x = x >> 4;
+
+ y = gPlayerEntity.y.HALF.HI;
+ if (y < 0)
+ y += 0xf;
+ hi_y = y >> 4;
+
+ for (i = gUnk_08127F94; i->_0 != 0xFF; i++) {
+ if (i->_0 <= hi_x && i->_2 >= hi_x && i->_1 <= hi_y && i->_3 >= hi_y) {
+ gSave.windcrests |= 1 << i->_4;
+ break;
+ }
+ }
+ }
+}
+
+void sub_08051E68() {
+ gUnk_080FCA08[gMenu.menuType]();
+}
+
+void sub_08051E84() {
+ struct_080FCA20* p = &gUnk_080FCA20[gUnk_02032EC0.field_0x3];
+ gRoomControls.areaID = p->_0;
+ gRoomControls.roomID = p->_1;
+ sub_08053320();
+ gArea.localFlagOffset = GetFlagBankOffset(gRoomControls.areaID);
+ SetCurrentRoomPropertyList(p->_0, p->_1);
+ sub_08052FD8(p->_0, p->_1);
+ gRoomControls.roomScrollX = gRoomControls.roomOriginX + p->_4;
+ gRoomControls.roomScrollY = gRoomControls.roomOriginY + p->_6;
+ gMenu.field_0x0 = p->_2;
+ gMenu.field_0x3 = p->_3 & 0xf;
+ gMenu.field_0xc = (void*)p;
+ gMenu.menuType++;
+ gMenu.overlayType = 0;
+ gMenu.transitionTimer = 300;
+ sub_08051F04();
+}
+
+void sub_08051F04(void) {
+ gUnk_080FCA14[gMenu.field_0x0]();
+ FlushSprites();
+ UpdateEntities();
+ sub_080AD9B0();
+ sub_080AD918();
+ UpdateScroll();
+ UpdateBgAnim();
+ UpdateManagers();
+ sub_08000108();
+}
+
+void sub_08051F40(u32 a1, u32 a2, u32 a3, u32 a4) {
+ u32 flag = gUnk_080FCA20[gUnk_02032EC0.field_0x3]._3;
+ if (flag & 0xF0) {
+ MenuFadeIn(2, flag >> 4);
+ } else {
+ gUnk_02032EC0.nextToLoad = 3;
+ sub_080500F4(0x10);
+ MessageInitialize();
+ }
+}
+
+void sub_08051F78(u32 a1, u32 a2, u32 a3, u32 a4) {
+ u32 idx = gUnk_02032EC0.field_0x3;
+ struct_080FCA20* p = &gUnk_080FCA20[idx];
+ sub_08051F9C(p->_0, p->_1, p->_4, p->_6);
+}
+
+void sub_08051F9C(u32 a1, u32 a2, u32 a3, u32 a4) {
+ u32 tmp = gScreen.lcd.displayControl & 0x6000;
+ sub_08052FF4(a1, a2);
+ gRoomControls.roomScrollX = gRoomControls.roomOriginX + a3;
+ gRoomControls.roomScrollY = gRoomControls.roomOriginY + a4;
+ sub_0807C740();
+ gUpdateVisibleTiles = 1;
+ gUsedPalettes = 0;
+ gScreen.lcd.displayControl |= tmp;
+}
+
+void sub_08051FF0() {
+ sub_0804B0B0(gMenu.field_0xc[0], gMenu.field_0xc[1]);
+}
+
+void sub_08052004() {
+ gMenu.menuType = 2;
+}
+
+void sub_08052010() {
+ InitSoundPlayingInfo();
+ MessageInitialize();
+ DispReset(1);
+ MemClear(gBG1Buffer, 0x800);
+ MemClear(gBG2Buffer, 0x800);
+ sub_080A4D34();
+ LoadPaletteGroup(0xA);
+ SetColor(0, 0);
+ LoadGfxGroup(4);
+ MemClear((void*)0x06000000, 0x20);
+ MemClear(&gMenu, 0x30);
+ gScreen.lcd.displayControl |= 0x1000;
+ gScreen.bg1.control = 0x1C01;
+ gScreen.bg2.control = 0x1D05;
+ gScreen.bg1.updated = 1;
+ gScreen.bg2.updated = 1;
+}
+
+void HandleGameOverScreen() {
+ gUnk_080FCA70[gMain.funcIndex]();
+ if (gMain.funcIndex != 0) {
+ FlushSprites();
+ DrawGameOverText();
+ sub_080AD918();
+ }
+}
+
+void sub_080520C4(u32 idx) {
+ gMain.funcIndex = idx;
+ sub_080A7114(0);
+}
+
+void sub_080520D8(void) {
+ if (gFadeControl.active)
+ return;
+ sub_08052010();
+ gMenu.focusCoords[0] = 80;
+ gMenu.transitionTimer = 60;
+ gSave.stats.health = 24;
+ gMain.field_0x5 = 60;
+ SoundReq(BGM_GAMEOVER);
+ sub_080500F4(4);
+ gFadeControl.mask = 0xFFFF0001;
+ sub_080520C4(1);
+}
+
void sub_0805212C(void) {
if (gFadeControl.active)
return;
@@ -251,7 +737,7 @@ void sub_080522F4(void) {
void nullsub_107(void) {
}
-void DrawGameOverText(void) {
+static void DrawGameOverText(void) {
static const u8 sOffsets[] = {
48, 68, 88, 108, 137, 156, 174, 192,
};
diff --git a/src/npc/npc5.c b/src/npc/npc5.c
index 900d3e79..4a620dcd 100644
--- a/src/npc/npc5.c
+++ b/src/npc/npc5.c
@@ -80,6 +80,18 @@ void sub_08061AFC(Entity*);
extern u16* gUnk_0810B660[8];
+void CreateZeldaFollower(void) {
+ Entity* npc;
+ if (CheckGlobalFlag(0x1c) != 0) {
+ npc = CreateNPC(0x2e, 0, 0);
+ if (npc != NULL) {
+ CopyPosition(&gPlayerEntity, npc);
+ npc->flags |= 0x20;
+ npc->animationState = GetAnimationState(npc);
+ }
+ }
+}
+
// UNUSED zelda follower, probably because it was too resource heavy
void NPC5(Entity* this) {
gUnk_0810AC1C[this->type](this);
diff --git a/src/npc/postman.c b/src/npc/postman.c
index f72ec6d3..1f958c09 100644
--- a/src/npc/postman.c
+++ b/src/npc/postman.c
@@ -205,15 +205,3 @@ void Postman_Fusion(Entity* this) {
UpdateAnimationSingleFrame(this);
}
}
-
-void CreateZeldaFollower(void) {
- Entity* npc;
- if (CheckGlobalFlag(0x1c) != 0) {
- npc = CreateNPC(0x2e, 0, 0);
- if (npc != NULL) {
- CopyPosition(&gPlayerEntity, npc);
- npc->flags |= 0x20;
- npc->animationState = GetAnimationState(npc);
- }
- }
-}
diff --git a/src/player.c b/src/player.c
index 61cafe8c..ff9826fb 100644
--- a/src/player.c
+++ b/src/player.c
@@ -256,6 +256,7 @@ void SurfaceAction_Water(Entity*);
void SurfaceAction_Ladder(Entity*);
void SurfaceAction_AutoLadder(Entity*);
+extern void sub_080A4D88(void);
extern void RespawnPlayer();
extern void sub_080797EC();
extern void UpdatePlayerMovement();
@@ -319,6 +320,26 @@ extern u16 script_BedAtSimons;
extern Entity* gPlayerClones[];
extern ScriptExecutionContext gPlayerScriptExecutionContext;
+NONMATCH("asm/non_matching/playerItemPacciCane/sub_080705AC.inc", u32 sub_080705AC(void)) {
+ if (!((gInput.newKeys & START_BUTTON) == 0 || gFadeControl.active || gUnk_02034490[0] ||
+ (gMessage.doTextBox & 0x7F) || gSave.stats.health == 0 || !gSave.fillerD0[34] ||
+ gPlayerState.controlMode != 0 || gPriorityHandler.priority_timer != 0)) {
+ u32 tmp = gPlayerState.framestate ? gPlayerState.framestate : gPlayerState.framestate_last;
+ switch (tmp) {
+ case PL_STATE_DIE:
+ case PL_STATE_TALKEZLO:
+ case PL_STATE_ITEMGET:
+ case PL_STATE_DROWN:
+ case PL_STATE_STAIRS:
+ return 0;
+ }
+ sub_080A4D88();
+ return 1;
+ }
+ return 0;
+}
+END_NONMATCH
+
void DoPlayerAction(Entity* this) {
static void (*const sPlayerActions[])(Entity*) = {
[PLAYER_INIT] = PlayerInit,
diff --git a/src/playerItem/playerItemPacciCane.c b/src/playerItem/playerItemPacciCane.c
index 471f180e..580d65a5 100644
--- a/src/playerItem/playerItemPacciCane.c
+++ b/src/playerItem/playerItemPacciCane.c
@@ -8,7 +8,6 @@
extern void (*const gUnk_0811B9D8[])(Entity*);
void sub_080704FC(Entity*);
-extern void sub_080A4D88(void);
extern u8 gUnk_02034490[0x18];
@@ -29,22 +28,3 @@ ASM_FUNC("asm/non_matching/playerItemPacciCane/sub_080704FC.inc", void sub_08070
void sub_0807059C() {
MemClear(gUnk_02034490, sizeof(gUnk_02034490));
}
-
-NONMATCH("asm/non_matching/playerItemPacciCane/sub_080705AC.inc", u32 sub_080705AC(void)) {
- if (!((gInput.newKeys & 8) == 0 || gFadeControl.active || gUnk_02034490[0] || (gMessage.doTextBox & 0x7F) != 0 ||
- !gSave.stats.health || !gSave.fillerD0[34] || gPlayerState.controlMode || gPriorityHandler.priority_timer)) {
- u32 tmp = gPlayerState.framestate ? gPlayerState.framestate : gPlayerState.framestate_last;
- switch (tmp) {
- case 18:
- case 19:
- case 21:
- case 22:
- case 28:
- return 0;
- }
- sub_080A4D88();
- return 1;
- }
- return 0;
-}
-END_NONMATCH