summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2020-03-28 21:39:28 -0400
committerPikalaxALT <PikalaxALT@gmail.com>2020-03-28 21:39:28 -0400
commit0f618efb15b2ca6248d73c979fab7df248563e5a (patch)
tree581d1a5c7be1ab204439a390ff19ca231f0d2b6e
parent781aa8949c1e7ea0b1ac2c7fa3ae36226e98c289 (diff)
Finish overworld.c
-rw-r--r--asm/overworld.s2382
-rw-r--r--data/maps/RecordCenter/map.json8
-rw-r--r--data/overworld.s29
-rw-r--r--data/scripts/cable_club.inc6
-rw-r--r--include/cable_club.h1
-rw-r--r--include/event_scripts.h18
-rw-r--r--include/field_player_avatar.h1
-rw-r--r--include/link.h2
-rw-r--r--include/link_rfu.h10
-rw-r--r--include/overworld.h10
-rw-r--r--ld_script.txt2
-rw-r--r--src/cable_club.c2
-rw-r--r--src/field_player_avatar.c2
-rw-r--r--src/link_rfu_2.c14
-rw-r--r--src/link_rfu_3.c6
-rw-r--r--src/overworld.c1094
-rw-r--r--src/pokemon_jump_2.c2
-rw-r--r--sym_bss.txt17
18 files changed, 1146 insertions, 2460 deletions
diff --git a/asm/overworld.s b/asm/overworld.s
deleted file mode 100644
index e5c493d0c..000000000
--- a/asm/overworld.s
+++ /dev/null
@@ -1,2382 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start CB1_UpdateLinkState
-CB1_UpdateLinkState: @ 8057884
- push {r4,lr}
- ldr r0, _080578C8 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- beq _0805789E
- bl IsRfuRecvQueueEmpty
- cmp r0, 0
- beq _0805789E
- bl IsSendingKeysToLink
- cmp r0, 0
- bne _080578C0
-_0805789E:
- ldr r0, _080578CC @ =gLocalLinkPlayerId
- ldrb r4, [r0]
- ldr r0, _080578D0 @ =gLinkPartnersHeldKeys
- adds r1, r4, 0
- bl sub_8057BE4
- ldr r0, _080578D4 @ =gUnknown_3000E84
- ldr r1, [r0]
- adds r0, r4, 0
- bl _call_via_r1
- lsls r0, 16
- lsrs r0, 16
- bl sub_8057C4C
- bl ClearAllPlayerKeys
-_080578C0:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080578C8: .4byte gWirelessCommType
-_080578CC: .4byte gLocalLinkPlayerId
-_080578D0: .4byte gLinkPartnersHeldKeys
-_080578D4: .4byte gUnknown_3000E84
- thumb_func_end CB1_UpdateLinkState
-
- thumb_func_start ResetAllMultiplayerState
-ResetAllMultiplayerState: @ 80578D8
- push {lr}
- bl sub_805793C
- ldr r0, _080578E8 @ =sub_8057D5C
- bl c1_link_related_func_set
- pop {r0}
- bx r0
- .align 2, 0
-_080578E8: .4byte sub_8057D5C
- thumb_func_end ResetAllMultiplayerState
-
- thumb_func_start ClearAllPlayerKeys
-ClearAllPlayerKeys: @ 80578EC
- push {lr}
- ldr r0, _080578F8 @ =gLinkPartnersHeldKeys
- bl sub_8057D48
- pop {r0}
- bx r0
- .align 2, 0
-_080578F8: .4byte gLinkPartnersHeldKeys
- thumb_func_end ClearAllPlayerKeys
-
- thumb_func_start c1_link_related_func_set
-c1_link_related_func_set: @ 80578FC
- ldr r2, _08057908 @ =gUnknown_3000E89
- movs r1, 0
- strb r1, [r2]
- ldr r1, _0805790C @ =gUnknown_3000E84
- str r0, [r1]
- bx lr
- .align 2, 0
-_08057908: .4byte gUnknown_3000E89
-_0805790C: .4byte gUnknown_3000E84
- thumb_func_end c1_link_related_func_set
-
- thumb_func_start sub_8057910
-sub_8057910: @ 8057910
- push {lr}
- ldr r0, _08057934 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- beq _0805792E
- ldr r1, _08057938 @ =gUnknown_3000E89
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3C
- bls _0805792E
- bl LinkRfu_FatalError
-_0805792E:
- pop {r0}
- bx r0
- .align 2, 0
-_08057934: .4byte gWirelessCommType
-_08057938: .4byte gUnknown_3000E89
- thumb_func_end sub_8057910
-
- thumb_func_start sub_805793C
-sub_805793C: @ 805793C
- push {lr}
- ldr r1, _08057950 @ =gUnknown_3000E80
- movs r2, 0x80
- adds r0, r1, 0x3
-_08057944:
- strb r2, [r0]
- subs r0, 0x1
- cmp r0, r1
- bge _08057944
- pop {r0}
- bx r0
- .align 2, 0
-_08057950: .4byte gUnknown_3000E80
- thumb_func_end sub_805793C
-
- thumb_func_start sub_8057954
-sub_8057954: @ 8057954
- push {r4,lr}
- lsls r0, 16
- lsrs r3, r0, 16
- ldr r0, _08057974 @ =gFieldLinkPlayerCount
- ldrb r2, [r0]
- movs r1, 0
- cmp r1, r2
- bge _08057982
- ldr r4, _08057978 @ =gUnknown_3000E80
-_08057966:
- adds r0, r1, r4
- ldrb r0, [r0]
- cmp r0, r3
- beq _0805797C
- movs r0, 0
- b _08057984
- .align 2, 0
-_08057974: .4byte gFieldLinkPlayerCount
-_08057978: .4byte gUnknown_3000E80
-_0805797C:
- adds r1, 0x1
- cmp r1, r2
- blt _08057966
-_08057982:
- movs r0, 0x1
-_08057984:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8057954
-
- thumb_func_start sub_805798C
-sub_805798C: @ 805798C
- push {r4,lr}
- lsls r0, 16
- lsrs r3, r0, 16
- ldr r0, _080579AC @ =gFieldLinkPlayerCount
- ldrb r2, [r0]
- movs r1, 0
- cmp r1, r2
- bge _080579BA
- ldr r4, _080579B0 @ =gUnknown_3000E80
-_0805799E:
- adds r0, r1, r4
- ldrb r0, [r0]
- cmp r0, r3
- bne _080579B4
- movs r0, 0x1
- b _080579BC
- .align 2, 0
-_080579AC: .4byte gFieldLinkPlayerCount
-_080579B0: .4byte gUnknown_3000E80
-_080579B4:
- adds r1, 0x1
- cmp r1, r2
- blt _0805799E
-_080579BA:
- movs r0, 0
-_080579BC:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_805798C
-
- thumb_func_start sub_80579C4
-sub_80579C4: @ 80579C4
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- adds r7, r0, 0
- adds r6, r2, 0
- mov r9, r3
- lsls r1, 16
- lsrs r1, 16
- mov r8, r1
- ldr r0, _08057A14 @ =gUnknown_3000E80
- adds r5, r7, r0
- ldrb r0, [r5]
- cmp r0, 0x80
- beq _080579E4
- b _08057B5E
-_080579E4:
- adds r0, r6, 0
- bl sub_805801C
- adds r4, r0, 0
- cmp r4, 0
- beq _08057A1C
- bl sub_805812C
- mov r1, r9
- strh r0, [r1]
- movs r0, 0x81
- strb r0, [r5]
- ldrb r0, [r6, 0x1]
- cmp r0, 0
- bne _08057A04
- b _08057BD2
-_08057A04:
- ldr r0, _08057A18 @ =sub_8057DA4
- bl c1_link_related_func_set
- adds r0, r4, 0
- bl sub_80581DC
- b _08057BD2
- .align 2, 0
-_08057A14: .4byte gUnknown_3000E80
-_08057A18: .4byte sub_8057DA4
-_08057A1C:
- movs r0, 0x83
- bl sub_805798C
- cmp r0, 0x1
- bne _08057A44
- movs r0, 0x81
- strb r0, [r5]
- ldrb r0, [r6, 0x1]
- cmp r0, 0
- bne _08057A32
- b _08057BD2
-_08057A32:
- ldr r0, _08057A40 @ =sub_8057DA4
- bl c1_link_related_func_set
- bl sub_8058230
- b _08057BD2
- .align 2, 0
-_08057A40: .4byte sub_8057DA4
-_08057A44:
- mov r0, r8
- subs r0, 0x12
- cmp r0, 0xA
- bls _08057A4E
- b _08057B5E
-_08057A4E:
- lsls r0, 2
- ldr r1, _08057A58 @ =_08057A5C
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08057A58: .4byte _08057A5C
- .align 2, 0
-_08057A5C:
- .4byte _08057AB4
- .4byte _08057B5E
- .4byte _08057B5E
- .4byte _08057B5E
- .4byte _08057B5E
- .4byte _08057B5E
- .4byte _08057A88
- .4byte _08057AE0
- .4byte _08057B5E
- .4byte _08057B10
- .4byte _08057B3C
-_08057A88:
- adds r0, r6, 0
- bl sub_8058004
- cmp r0, 0
- beq _08057B5E
- ldr r0, _08057AAC @ =gUnknown_3000E80
- adds r0, r7, r0
- movs r1, 0x81
- strb r1, [r0]
- ldrb r0, [r6, 0x1]
- cmp r0, 0
- beq _08057B5E
- ldr r0, _08057AB0 @ =sub_8057DA4
- bl c1_link_related_func_set
- bl sub_80581C8
- b _08057B5E
- .align 2, 0
-_08057AAC: .4byte gUnknown_3000E80
-_08057AB0: .4byte sub_8057DA4
-_08057AB4:
- adds r0, r6, 0
- bl sub_8058034
- cmp r0, 0x1
- bne _08057B5E
- ldr r0, _08057AD8 @ =gUnknown_3000E80
- adds r0, r7, r0
- movs r1, 0x81
- strb r1, [r0]
- ldrb r0, [r6, 0x1]
- cmp r0, 0
- beq _08057B5E
- ldr r0, _08057ADC @ =sub_8057DA4
- bl c1_link_related_func_set
- bl sub_80581F8
- b _08057B5E
- .align 2, 0
-_08057AD8: .4byte gUnknown_3000E80
-_08057ADC: .4byte sub_8057DA4
-_08057AE0:
- adds r0, r6, 0
- bl sub_8058060
- adds r4, r0, 0
- cmp r4, 0
- beq _08057B5E
- ldr r0, _08057B08 @ =gUnknown_3000E80
- adds r0, r7, r0
- movs r1, 0x81
- strb r1, [r0]
- ldrb r0, [r6, 0x1]
- cmp r0, 0
- beq _08057B5E
- ldr r0, _08057B0C @ =sub_8057DA4
- bl c1_link_related_func_set
- adds r0, r4, 0
- bl sub_8058214
- b _08057B5E
- .align 2, 0
-_08057B08: .4byte gUnknown_3000E80
-_08057B0C: .4byte sub_8057DA4
-_08057B10:
- adds r0, r6, 0
- bl sub_8057FEC
- cmp r0, 0
- beq _08057B5E
- ldr r0, _08057B34 @ =gUnknown_3000E80
- adds r0, r7, r0
- movs r1, 0x81
- strb r1, [r0]
- ldrb r0, [r6, 0x1]
- cmp r0, 0
- beq _08057B5E
- ldr r0, _08057B38 @ =sub_8057DC8
- bl c1_link_related_func_set
- bl sub_80581BC
- b _08057B5E
- .align 2, 0
-_08057B34: .4byte gUnknown_3000E80
-_08057B38: .4byte sub_8057DC8
-_08057B3C:
- adds r0, r6, 0
- bl sub_8057FEC
- cmp r0, 0
- beq _08057B5E
- ldr r0, _08057B70 @ =gUnknown_3000E80
- adds r0, r7, r0
- movs r1, 0x81
- strb r1, [r0]
- ldrb r0, [r6, 0x1]
- cmp r0, 0
- beq _08057B5E
- ldr r0, _08057B74 @ =sub_8057DEC
- bl c1_link_related_func_set
- bl sub_80581BC
-_08057B5E:
- mov r0, r8
- cmp r0, 0x17
- beq _08057B84
- cmp r0, 0x17
- bgt _08057B78
- cmp r0, 0x16
- beq _08057B94
- b _08057BD2
- .align 2, 0
-_08057B70: .4byte gUnknown_3000E80
-_08057B74: .4byte sub_8057DEC
-_08057B78:
- mov r1, r8
- cmp r1, 0x1A
- beq _08057BA4
- cmp r1, 0x1D
- beq _08057BC4
- b _08057BD2
-_08057B84:
- ldr r0, _08057B90 @ =gUnknown_3000E80
- adds r0, r7, r0
- movs r1, 0x83
- strb r1, [r0]
- b _08057BD2
- .align 2, 0
-_08057B90: .4byte gUnknown_3000E80
-_08057B94:
- ldr r0, _08057BA0 @ =gUnknown_3000E80
- adds r0, r7, r0
- movs r1, 0x82
- strb r1, [r0]
- b _08057BD2
- .align 2, 0
-_08057BA0: .4byte gUnknown_3000E80
-_08057BA4:
- ldr r0, _08057BBC @ =gUnknown_3000E80
- adds r0, r7, r0
- movs r1, 0x80
- strb r1, [r0]
- ldrb r0, [r6, 0x1]
- cmp r0, 0
- beq _08057BD2
- ldr r0, _08057BC0 @ =sub_8057D5C
- bl c1_link_related_func_set
- b _08057BD2
- .align 2, 0
-_08057BBC: .4byte gUnknown_3000E80
-_08057BC0: .4byte sub_8057D5C
-_08057BC4:
- ldr r0, _08057BE0 @ =gUnknown_3000E80
- adds r1, r7, r0
- ldrb r0, [r1]
- cmp r0, 0x82
- bne _08057BD2
- movs r0, 0x81
- strb r0, [r1]
-_08057BD2:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08057BE0: .4byte gUnknown_3000E80
- thumb_func_end sub_80579C4
-
- thumb_func_start sub_8057BE4
-sub_8057BE4: @ 8057BE4
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x14
- mov r8, r1
- movs r6, 0
- add r5, sp, 0x10
- mov r9, r5
- adds r7, r0, 0
-_08057BF8:
- ldrb r4, [r7]
- movs r0, 0
- strh r0, [r5]
- adds r0, r6, 0
- mov r1, r8
- mov r2, sp
- bl sub_8057F84
- adds r0, r6, 0
- adds r1, r4, 0
- mov r2, sp
- adds r3, r5, 0
- bl sub_80579C4
- ldr r0, _08057C48 @ =gUnknown_3000E80
- adds r0, r6, r0
- ldrb r0, [r0]
- cmp r0, 0x80
- bne _08057C28
- adds r0, r4, 0
- bl sub_8057D14
- mov r1, r9
- strh r0, [r1]
-_08057C28:
- lsls r0, r6, 24
- lsrs r0, 24
- ldrb r1, [r5]
- bl sub_8058618
- adds r7, 0x2
- adds r6, 0x1
- cmp r6, 0x3
- ble _08057BF8
- add sp, 0x14
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08057C48: .4byte gUnknown_3000E80
- thumb_func_end sub_8057BE4
-
- thumb_func_start sub_8057C4C
-sub_8057C4C: @ 8057C4C
- push {r4,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r1, _08057C64 @ =0xffef0000
- adds r0, r1
- lsrs r0, 16
- cmp r0, 0xC
- bhi _08057C6C
- ldr r0, _08057C68 @ =gHeldKeyCodeToSend
- strh r4, [r0]
- b _08057C72
- .align 2, 0
-_08057C64: .4byte 0xffef0000
-_08057C68: .4byte gHeldKeyCodeToSend
-_08057C6C:
- ldr r1, _08057CB0 @ =gHeldKeyCodeToSend
- movs r0, 0x11
- strh r0, [r1]
-_08057C72:
- ldr r0, _08057CB4 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- beq _08057CA8
- bl sub_805833C
- cmp r0, 0x1
- bls _08057CA8
- bl IsUpdateLinkStateCBActive
- cmp r0, 0x1
- bne _08057CA8
- bl IsSendingKeysToLink
- cmp r0, 0x1
- bne _08057CA8
- cmp r4, 0x11
- blt _08057CA8
- cmp r4, 0x15
- ble _08057CA2
- cmp r4, 0x19
- bgt _08057CA8
- cmp r4, 0x18
- blt _08057CA8
-_08057CA2:
- ldr r1, _08057CB0 @ =gHeldKeyCodeToSend
- movs r0, 0
- strh r0, [r1]
-_08057CA8:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08057CB0: .4byte gHeldKeyCodeToSend
-_08057CB4: .4byte gWirelessCommType
- thumb_func_end sub_8057C4C
-
- thumb_func_start sub_8057CB8
-sub_8057CB8: @ 8057CB8
- push {lr}
- ldr r2, _08057CCC @ =gMain
- ldrh r1, [r2, 0x2C]
- movs r0, 0x40
- ands r0, r1
- cmp r0, 0
- beq _08057CD0
- movs r0, 0x13
- b _08057D10
- .align 2, 0
-_08057CCC: .4byte gMain
-_08057CD0:
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _08057CDC
- movs r0, 0x12
- b _08057D10
-_08057CDC:
- movs r0, 0x20
- ands r0, r1
- cmp r0, 0
- beq _08057CE8
- movs r0, 0x14
- b _08057D10
-_08057CE8:
- movs r0, 0x10
- ands r0, r1
- cmp r0, 0
- beq _08057CF4
- movs r0, 0x15
- b _08057D10
-_08057CF4:
- ldrh r1, [r2, 0x2E]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _08057D02
- movs r0, 0x18
- b _08057D10
-_08057D02:
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- bne _08057D0E
- movs r0, 0x11
- b _08057D10
-_08057D0E:
- movs r0, 0x19
-_08057D10:
- pop {r1}
- bx r1
- thumb_func_end sub_8057CB8
-
- thumb_func_start sub_8057D14
-sub_8057D14: @ 8057D14
- push {lr}
- lsls r0, 16
- lsrs r0, 16
- adds r1, r0, 0
- cmp r0, 0x13
- beq _08057D3A
- cmp r0, 0x13
- bgt _08057D2A
- cmp r0, 0x12
- beq _08057D3E
- b _08057D42
-_08057D2A:
- cmp r1, 0x14
- beq _08057D36
- cmp r1, 0x15
- bne _08057D42
- movs r0, 0x4
- b _08057D44
-_08057D36:
- movs r0, 0x3
- b _08057D44
-_08057D3A:
- movs r0, 0x1
- b _08057D44
-_08057D3E:
- movs r0, 0x2
- b _08057D44
-_08057D42:
- movs r0, 0
-_08057D44:
- pop {r1}
- bx r1
- thumb_func_end sub_8057D14
-
- thumb_func_start sub_8057D48
-sub_8057D48: @ 8057D48
- push {lr}
- movs r2, 0x11
- adds r1, r0, 0x6
-_08057D4E:
- strh r2, [r1]
- subs r1, 0x2
- cmp r1, r0
- bge _08057D4E
- pop {r0}
- bx r0
- thumb_func_end sub_8057D48
-
- thumb_func_start sub_8057D5C
-sub_8057D5C: @ 8057D5C
- push {r4,lr}
- adds r4, r0, 0
- bl ScriptContext2_IsEnabled
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08057D70
- movs r0, 0x11
- b _08057D92
-_08057D70:
- bl GetLinkRecvQueueLength
- cmp r0, 0x4
- bls _08057D7C
- movs r0, 0x1B
- b _08057D92
-_08057D7C:
- bl sub_805833C
- cmp r0, 0x4
- bls _08057D88
- movs r0, 0x1C
- b _08057D92
-_08057D88:
- adds r0, r4, 0
- bl sub_8057CB8
- lsls r0, 16
- lsrs r0, 16
-_08057D92:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8057D5C
-
- thumb_func_start sub_8057D98
-sub_8057D98: @ 8057D98
- push {lr}
- bl sub_8057910
- movs r0, 0x11
- pop {r1}
- bx r1
- thumb_func_end sub_8057D98
-
- thumb_func_start sub_8057DA4
-sub_8057DA4: @ 8057DA4
- push {r4,lr}
- bl ScriptContext2_IsEnabled
- lsls r0, 24
- lsrs r0, 24
- movs r4, 0x11
- cmp r0, 0x1
- beq _08057DBC
- movs r4, 0x1A
- ldr r0, _08057DC4 @ =sub_8057D98
- bl c1_link_related_func_set
-_08057DBC:
- adds r0, r4, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08057DC4: .4byte sub_8057D98
- thumb_func_end sub_8057DA4
-
- thumb_func_start sub_8057DC8
-sub_8057DC8: @ 8057DC8
- push {r4,lr}
- bl GetLinkRecvQueueLength
- movs r4, 0x11
- cmp r0, 0x2
- bhi _08057DE0
- movs r4, 0x1A
- bl ScriptContext2_Disable
- ldr r0, _08057DE8 @ =sub_8057D98
- bl c1_link_related_func_set
-_08057DE0:
- adds r0, r4, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08057DE8: .4byte sub_8057D98
- thumb_func_end sub_8057DC8
-
- thumb_func_start sub_8057DEC
-sub_8057DEC: @ 8057DEC
- push {r4,lr}
- bl sub_805833C
- movs r4, 0x11
- cmp r0, 0x2
- bhi _08057E04
- movs r4, 0x1A
- bl ScriptContext2_Disable
- ldr r0, _08057E0C @ =sub_8057D98
- bl c1_link_related_func_set
-_08057E04:
- adds r0, r4, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08057E0C: .4byte sub_8057D98
- thumb_func_end sub_8057DEC
-
- thumb_func_start sub_8057E10
-sub_8057E10: @ 8057E10
- push {lr}
- bl sub_8057910
- movs r0, 0x11
- pop {r1}
- bx r1
- thumb_func_end sub_8057E10
-
- thumb_func_start sub_8057E1C
-sub_8057E1C: @ 8057E1C
- push {lr}
- ldr r1, _08057E40 @ =gUnknown_3000E80
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x82
- bne _08057E4C
- ldr r0, _08057E44 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _08057E50
- ldr r0, _08057E48 @ =sub_8057E10
- bl c1_link_related_func_set
- movs r0, 0x1D
- b _08057E52
- .align 2, 0
-_08057E40: .4byte gUnknown_3000E80
-_08057E44: .4byte gMain
-_08057E48: .4byte sub_8057E10
-_08057E4C:
- bl sub_8057910
-_08057E50:
- movs r0, 0x11
-_08057E52:
- pop {r1}
- bx r1
- thumb_func_end sub_8057E1C
-
- thumb_func_start sub_8057E58
-sub_8057E58: @ 8057E58
- push {lr}
- ldr r0, _08057E68 @ =sub_8057E1C
- bl c1_link_related_func_set
- movs r0, 0x16
- pop {r1}
- bx r1
- .align 2, 0
-_08057E68: .4byte sub_8057E1C
- thumb_func_end sub_8057E58
-
- thumb_func_start sub_8057E6C
-sub_8057E6C: @ 8057E6C
- movs r0, 0x11
- bx lr
- thumb_func_end sub_8057E6C
-
- thumb_func_start sub_8057E70
-sub_8057E70: @ 8057E70
- push {lr}
- ldr r1, _08057E9C @ =gUnknown_3000E80
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x83
- beq _08057E80
- bl sub_8057910
-_08057E80:
- movs r0, 0x83
- bl sub_8057954
- cmp r0, 0x1
- bne _08057E96
- ldr r0, _08057EA0 @ =CableClub_EventScript_DoLinkRoomExit
- bl ScriptContext1_SetupScript
- ldr r0, _08057EA4 @ =sub_8057E6C
- bl c1_link_related_func_set
-_08057E96:
- movs r0, 0x11
- pop {r1}
- bx r1
- .align 2, 0
-_08057E9C: .4byte gUnknown_3000E80
-_08057EA0: .4byte CableClub_EventScript_DoLinkRoomExit
-_08057EA4: .4byte sub_8057E6C
- thumb_func_end sub_8057E70
-
- thumb_func_start sub_8057EA8
-sub_8057EA8: @ 8057EA8
- push {lr}
- ldr r0, _08057EB8 @ =sub_8057E70
- bl c1_link_related_func_set
- movs r0, 0x17
- pop {r1}
- bx r1
- .align 2, 0
-_08057EB8: .4byte sub_8057E70
- thumb_func_end sub_8057EA8
-
- thumb_func_start sub_8057EBC
-sub_8057EBC: @ 8057EBC
- movs r0, 0x11
- bx lr
- thumb_func_end sub_8057EBC
-
- thumb_func_start sub_8057EC0
-sub_8057EC0: @ 8057EC0
- push {lr}
- movs r0, 0x83
- bl sub_805798C
- cmp r0, 0x1
- beq _08057EFC
- ldr r0, _08057F00 @ =gUnknown_3000E84
- ldr r2, [r0]
- ldr r1, _08057F04 @ =sub_8057E1C
- adds r3, r0, 0
- cmp r2, r1
- bne _08057EE6
- ldr r1, _08057F08 @ =gUnknown_3000E80
- ldr r0, _08057F0C @ =gLocalLinkPlayerId
- ldrb r0, [r0]
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x82
- bne _08057F1E
-_08057EE6:
- ldr r1, [r3]
- ldr r0, _08057F10 @ =sub_8057E10
- cmp r1, r0
- bne _08057F14
- ldr r1, _08057F08 @ =gUnknown_3000E80
- ldr r0, _08057F0C @ =gLocalLinkPlayerId
- ldrb r0, [r0]
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x81
- bne _08057F14
-_08057EFC:
- movs r0, 0x2
- b _08057F24
- .align 2, 0
-_08057F00: .4byte gUnknown_3000E84
-_08057F04: .4byte sub_8057E1C
-_08057F08: .4byte gUnknown_3000E80
-_08057F0C: .4byte gLocalLinkPlayerId
-_08057F10: .4byte sub_8057E10
-_08057F14:
- movs r0, 0x82
- bl sub_8057954
- cmp r0, 0
- bne _08057F22
-_08057F1E:
- movs r0, 0
- b _08057F24
-_08057F22:
- movs r0, 0x1
-_08057F24:
- pop {r1}
- bx r1
- thumb_func_end sub_8057EC0
-
- thumb_func_start sub_8057F28
-sub_8057F28: @ 8057F28
- push {lr}
- movs r0, 0x83
- bl sub_805798C
- pop {r1}
- bx r1
- thumb_func_end sub_8057F28
-
- thumb_func_start sub_8057F34
-sub_8057F34: @ 8057F34
- push {lr}
- ldr r0, _08057F44 @ =sub_8057E58
- bl c1_link_related_func_set
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08057F44: .4byte sub_8057E58
- thumb_func_end sub_8057F34
-
- thumb_func_start sub_8057F48
-sub_8057F48: @ 8057F48
- push {lr}
- ldr r0, _08057F58 @ =sub_8057DA4
- bl c1_link_related_func_set
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08057F58: .4byte sub_8057DA4
- thumb_func_end sub_8057F48
-
- thumb_func_start sub_8057F5C
-sub_8057F5C: @ 8057F5C
- push {lr}
- ldr r0, _08057F6C @ =sub_8057EA8
- bl c1_link_related_func_set
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08057F6C: .4byte sub_8057EA8
- thumb_func_end sub_8057F5C
-
- thumb_func_start sub_8057F70
-sub_8057F70: @ 8057F70
- push {lr}
- ldr r0, _08057F80 @ =sub_8057EBC
- bl c1_link_related_func_set
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08057F80: .4byte sub_8057EBC
- thumb_func_end sub_8057F70
-
- thumb_func_start sub_8057F84
-sub_8057F84: @ 8057F84
- push {r4-r6,lr}
- sub sp, 0x4
- adds r4, r0, 0
- adds r6, r2, 0
- strb r4, [r6]
- movs r0, 0
- cmp r4, r1
- bne _08057F96
- movs r0, 0x1
-_08057F96:
- strb r0, [r6, 0x1]
- ldr r1, _08057FE8 @ =gLinkPlayerObjectEvents
- lsls r0, r4, 2
- adds r0, r1
- ldrb r0, [r0, 0x3]
- strb r0, [r6, 0x2]
- lsls r4, 24
- lsrs r4, 24
- adds r0, r4, 0
- bl sub_805854C
- strb r0, [r6, 0x3]
- mov r5, sp
- adds r5, 0x2
- adds r0, r4, 0
- mov r1, sp
- adds r2, r5, 0
- bl sub_8058524
- mov r0, sp
- ldrh r0, [r0]
- strh r0, [r6, 0x4]
- ldrh r0, [r5]
- strh r0, [r6, 0x6]
- adds r0, r4, 0
- bl sub_805856C
- strb r0, [r6, 0x8]
- mov r0, sp
- movs r1, 0
- ldrsh r0, [r0, r1]
- movs r2, 0
- ldrsh r1, [r5, r2]
- bl MapGridGetMetatileBehaviorAt
- strh r0, [r6, 0xC]
- add sp, 0x4
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08057FE8: .4byte gLinkPlayerObjectEvents
- thumb_func_end sub_8057F84
-
- thumb_func_start sub_8057FEC
-sub_8057FEC: @ 8057FEC
- push {lr}
- ldrb r0, [r0, 0x2]
- cmp r0, 0x2
- beq _08057FF8
- cmp r0, 0
- bne _08057FFC
-_08057FF8:
- movs r0, 0x1
- b _08057FFE
-_08057FFC:
- movs r0, 0
-_08057FFE:
- pop {r1}
- bx r1
- thumb_func_end sub_8057FEC
-
- thumb_func_start sub_8058004
-sub_8058004: @ 8058004
- push {lr}
- ldrb r0, [r0, 0x2]
- cmp r0, 0x2
- beq _08058010
- cmp r0, 0
- bne _08058014
-_08058010:
- movs r0, 0x1
- b _08058016
-_08058014:
- movs r0, 0
-_08058016:
- pop {r1}
- bx r1
- thumb_func_end sub_8058004
-
- thumb_func_start sub_805801C
-sub_805801C: @ 805801C
- push {lr}
- adds r1, r0, 0
- ldrb r0, [r1, 0x2]
- cmp r0, 0x2
- bne _0805802E
- adds r0, r1, 0x4
- bl GetCoordEventScriptAtMapPosition
- b _08058030
-_0805802E:
- movs r0, 0
-_08058030:
- pop {r1}
- bx r1
- thumb_func_end sub_805801C
-
- thumb_func_start sub_8058034
-sub_8058034: @ 8058034
- push {r4,lr}
- adds r4, r0, 0
- ldrb r0, [r4, 0x2]
- cmp r0, 0x2
- beq _08058042
- cmp r0, 0
- bne _08058058
-_08058042:
- ldrb r0, [r4, 0xC]
- bl MetatileBehavior_IsSouthArrowWarp
- lsls r0, 24
- cmp r0, 0
- beq _08058058
- ldrb r0, [r4, 0x3]
- cmp r0, 0x1
- bne _08058058
- movs r0, 0x1
- b _0805805A
-_08058058:
- movs r0, 0
-_0805805A:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8058034
-
- thumb_func_start sub_8058060
-sub_8058060: @ 8058060
- push {r4,lr}
- sub sp, 0x8
- adds r4, r0, 0
- ldrb r0, [r4, 0x2]
- cmp r0, 0
- beq _08058074
- cmp r0, 0x2
- beq _08058074
- movs r0, 0
- b _08058122
-_08058074:
- ldr r0, [r4, 0x4]
- ldr r1, [r4, 0x8]
- str r0, [sp]
- str r1, [sp, 0x4]
- ldr r3, _080580E4 @ =gDirectionToVectors
- ldrb r0, [r4, 0x3]
- lsls r0, 3
- adds r0, r3
- ldr r0, [r0]
- mov r1, sp
- ldrh r1, [r1]
- adds r0, r1
- lsls r0, 16
- lsrs r0, 16
- ldr r1, _080580E8 @ =0xffff0000
- ldr r2, [sp]
- ands r2, r1
- orrs r2, r0
- str r2, [sp]
- asrs r1, r2, 16
- ldrb r0, [r4, 0x3]
- lsls r0, 3
- adds r3, 0x4
- adds r0, r3
- ldr r0, [r0]
- adds r0, r1
- lsls r0, 16
- ldr r1, _080580EC @ =0x0000ffff
- ands r1, r2
- orrs r1, r0
- str r1, [sp]
- ldr r2, _080580F0 @ =0xffffff00
- ldr r0, [sp, 0x4]
- ands r0, r2
- str r0, [sp, 0x4]
- mov r0, sp
- movs r2, 0
- ldrsh r0, [r0, r2]
- asrs r1, 16
- bl GetLinkPlayerIdAt
- lsls r0, 24
- lsrs r1, r0, 24
- adds r2, r1, 0
- cmp r1, 0x4
- beq _08058118
- ldrb r0, [r4, 0x1]
- cmp r0, 0
- beq _080580E0
- ldr r0, _080580F4 @ =gUnknown_3000E80
- adds r0, r1, r0
- ldrb r0, [r0]
- cmp r0, 0x80
- beq _080580FC
-_080580E0:
- ldr r0, _080580F8 @ =CableClub_EventScript_TooBusyToNotice
- b _08058122
- .align 2, 0
-_080580E4: .4byte gDirectionToVectors
-_080580E8: .4byte 0xffff0000
-_080580EC: .4byte 0x0000ffff
-_080580F0: .4byte 0xffffff00
-_080580F4: .4byte gUnknown_3000E80
-_080580F8: .4byte CableClub_EventScript_TooBusyToNotice
-_080580FC:
- adds r0, r2, 0
- bl GetSeeingLinkPlayerCardMsg
- cmp r0, 0
- bne _08058110
- ldr r0, _0805810C @ =CableClub_EventScript_ReadTrainerCard
- b _08058122
- .align 2, 0
-_0805810C: .4byte CableClub_EventScript_ReadTrainerCard
-_08058110:
- ldr r0, _08058114 @ =CableClub_EventScript_ReadTrainerCardColored
- b _08058122
- .align 2, 0
-_08058114: .4byte CableClub_EventScript_ReadTrainerCardColored
-_08058118:
- ldrb r1, [r4, 0xC]
- ldrb r2, [r4, 0x3]
- mov r0, sp
- bl GetInteractedLinkPlayerScript
-_08058122:
- add sp, 0x8
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8058060
-
- thumb_func_start sub_805812C
-sub_805812C: @ 805812C
- push {lr}
- adds r1, r0, 0
- ldr r0, _08058178 @ =BattleColosseum_4P_EventScript_PlayerSpot0
- cmp r1, r0
- beq _08058172
- ldr r0, _0805817C @ =BattleColosseum_4P_EventScript_PlayerSpot1
- cmp r1, r0
- beq _080581B4
- ldr r0, _08058180 @ =BattleColosseum_4P_EventScript_PlayerSpot2
- cmp r1, r0
- beq _08058172
- ldr r0, _08058184 @ =BattleColosseum_4P_EventScript_PlayerSpot3
- cmp r1, r0
- beq _080581B4
- ldr r0, _08058188 @ =RecordCenter_EventScript_Spot
- cmp r1, r0
- beq _08058172
- ldr r0, _0805818C @ =RecordCenter_EventScript_Spot
- cmp r1, r0
- beq _080581B4
- ldr r0, _08058190 @ =RecordCenter_EventScript_Spot
- cmp r1, r0
- beq _08058172
- ldr r0, _08058194 @ =RecordCenter_EventScript_Spot
- cmp r1, r0
- beq _080581B4
- ldr r0, _08058198 @ =BattleColosseum_2P_EventScript_PlayerSpot0
- cmp r1, r0
- beq _08058172
- ldr r0, _0805819C @ =BattleColosseum_2P_EventScript_PlayerSpot1
- cmp r1, r0
- beq _080581B4
- ldr r0, _080581A0 @ =TradeCenter_EventScript_Chair0
- cmp r1, r0
- bne _080581A4
-_08058172:
- movs r0, 0xA
- b _080581B6
- .align 2, 0
-_08058178: .4byte BattleColosseum_4P_EventScript_PlayerSpot0
-_0805817C: .4byte BattleColosseum_4P_EventScript_PlayerSpot1
-_08058180: .4byte BattleColosseum_4P_EventScript_PlayerSpot2
-_08058184: .4byte BattleColosseum_4P_EventScript_PlayerSpot3
-_08058188: .4byte RecordCenter_EventScript_Spot
-_0805818C: .4byte RecordCenter_EventScript_Spot
-_08058190: .4byte RecordCenter_EventScript_Spot
-_08058194: .4byte RecordCenter_EventScript_Spot
-_08058198: .4byte BattleColosseum_2P_EventScript_PlayerSpot0
-_0805819C: .4byte BattleColosseum_2P_EventScript_PlayerSpot1
-_080581A0: .4byte TradeCenter_EventScript_Chair0
-_080581A4:
- ldr r0, _080581B0 @ =TradeCenter_EventScript_Chair1
- cmp r1, r0
- beq _080581B4
- movs r0, 0
- b _080581B6
- .align 2, 0
-_080581B0: .4byte TradeCenter_EventScript_Chair1
-_080581B4:
- movs r0, 0x9
-_080581B6:
- pop {r1}
- bx r1
- thumb_func_end sub_805812C
-
- thumb_func_start sub_80581BC
-sub_80581BC: @ 80581BC
- push {lr}
- bl ScriptContext2_Enable
- pop {r0}
- bx r0
- thumb_func_end sub_80581BC
-
- thumb_func_start sub_80581C8
-sub_80581C8: @ 80581C8
- push {lr}
- movs r0, 0x6
- bl PlaySE
- bl ShowStartMenu
- bl ScriptContext2_Enable
- pop {r0}
- bx r0
- thumb_func_end sub_80581C8
-
- thumb_func_start sub_80581DC
-sub_80581DC: @ 80581DC
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x5
- bl PlaySE
- adds r0, r4, 0
- bl ScriptContext1_SetupScript
- bl ScriptContext2_Enable
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80581DC
-
- thumb_func_start sub_80581F8
-sub_80581F8: @ 80581F8
- push {lr}
- movs r0, 0x6
- bl PlaySE
- ldr r0, _08058210 @ =TradeCenter_ConfirmLeaveRoom
- bl ScriptContext1_SetupScript
- bl ScriptContext2_Enable
- pop {r0}
- bx r0
- .align 2, 0
-_08058210: .4byte TradeCenter_ConfirmLeaveRoom
- thumb_func_end sub_80581F8
-
- thumb_func_start sub_8058214
-sub_8058214: @ 8058214
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x5
- bl PlaySE
- adds r0, r4, 0
- bl ScriptContext1_SetupScript
- bl ScriptContext2_Enable
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_8058214
-
- thumb_func_start sub_8058230
-sub_8058230: @ 8058230
- push {lr}
- ldr r0, _08058240 @ =TradeCenter_TerminateLink
- bl ScriptContext1_SetupScript
- bl ScriptContext2_Enable
- pop {r0}
- bx r0
- .align 2, 0
-_08058240: .4byte TradeCenter_TerminateLink
- thumb_func_end sub_8058230
-
- thumb_func_start sub_8058244
-sub_8058244: @ 8058244
- push {lr}
- bl IsUpdateLinkStateCBActive
- cmp r0, 0
- bne _08058252
- movs r0, 0
- b _0805826C
-_08058252:
- bl GetLinkRecvQueueLength
- cmp r0, 0x2
- bls _08058264
- ldr r1, _08058260 @ =gUnknown_3000E88
- movs r0, 0x1
- b _08058268
- .align 2, 0
-_08058260: .4byte gUnknown_3000E88
-_08058264:
- ldr r1, _08058270 @ =gUnknown_3000E88
- movs r0, 0
-_08058268:
- strb r0, [r1]
- ldrb r0, [r1]
-_0805826C:
- pop {r1}
- bx r1
- .align 2, 0
-_08058270: .4byte gUnknown_3000E88
- thumb_func_end sub_8058244
-
- thumb_func_start sub_8058274
-sub_8058274: @ 8058274
- push {lr}
- bl GetLinkRecvQueueLength
- cmp r0, 0x1
- bls _080582D8
- bl IsUpdateLinkStateCBActive
- cmp r0, 0x1
- bne _080582D8
- bl IsSendingKeysToLink
- cmp r0, 0x1
- bne _080582D8
- ldr r0, _080582C4 @ =gUnknown_3000E84
- ldr r1, [r0]
- ldr r0, _080582C8 @ =sub_8057DC8
- cmp r1, r0
- beq _080582C0
- ldr r0, _080582CC @ =sub_8057DA4
- cmp r1, r0
- bne _080582D8
- ldr r0, _080582D0 @ =gUnknown_3000E88
- ldrb r2, [r0]
- movs r1, 0
- strb r1, [r0]
- cmp r2, 0x1
- beq _080582C0
- ldr r2, _080582D4 @ =gPaletteFade
- ldrb r1, [r2, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _080582D8
- ldrb r1, [r2, 0xA]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _080582D8
-_080582C0:
- movs r0, 0x1
- b _080582DA
- .align 2, 0
-_080582C4: .4byte gUnknown_3000E84
-_080582C8: .4byte sub_8057DC8
-_080582CC: .4byte sub_8057DA4
-_080582D0: .4byte gUnknown_3000E88
-_080582D4: .4byte gPaletteFade
-_080582D8:
- movs r0, 0
-_080582DA:
- pop {r1}
- bx r1
- thumb_func_end sub_8058274
-
- thumb_func_start sub_80582E0
-sub_80582E0: @ 80582E0
- push {lr}
- bl sub_805833C
- cmp r0, 0x1
- bls _08058304
- bl IsUpdateLinkStateCBActive
- cmp r0, 0x1
- bne _08058304
- bl IsSendingKeysToLink
- cmp r0, 0x1
- bne _08058304
- ldr r0, _08058308 @ =gUnknown_3000E84
- ldr r1, [r0]
- ldr r0, _0805830C @ =sub_8057DEC
- cmp r1, r0
- beq _08058310
-_08058304:
- movs r0, 0
- b _08058312
- .align 2, 0
-_08058308: .4byte gUnknown_3000E84
-_0805830C: .4byte sub_8057DEC
-_08058310:
- movs r0, 0x1
-_08058312:
- pop {r1}
- bx r1
- thumb_func_end sub_80582E0
-
- thumb_func_start sub_8058318
-sub_8058318: @ 8058318
- push {lr}
- ldr r0, _08058330 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _08058334
- bl IsSendingKeysToLink
- cmp r0, 0
- beq _08058334
- movs r0, 0x1
- b _08058336
- .align 2, 0
-_08058330: .4byte gWirelessCommType
-_08058334:
- movs r0, 0
-_08058336:
- pop {r1}
- bx r1
- thumb_func_end sub_8058318
-
- thumb_func_start sub_805833C
-sub_805833C: @ 805833C
- push {lr}
- ldr r0, _08058350 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _0805835C
- ldr r0, _08058354 @ =gLink
- ldr r1, _08058358 @ =0x00000339
- adds r0, r1
- ldrb r0, [r0]
- b _08058364
- .align 2, 0
-_08058350: .4byte gWirelessCommType
-_08058354: .4byte gLink
-_08058358: .4byte 0x00000339
-_0805835C:
- ldr r0, _08058368 @ =Rfu
- ldr r1, _0805836C @ =0x000008d2
- adds r0, r1
- ldrb r0, [r0]
-_08058364:
- pop {r1}
- bx r1
- .align 2, 0
-_08058368: .4byte Rfu
-_0805836C: .4byte 0x000008d2
- thumb_func_end sub_805833C
-
- thumb_func_start ZeroLinkPlayerObjectEvent
-ZeroLinkPlayerObjectEvent: @ 8058370
- movs r1, 0
- str r1, [r0]
- bx lr
- thumb_func_end ZeroLinkPlayerObjectEvent
-
- thumb_func_start ClearLinkPlayerObjectEvents
-ClearLinkPlayerObjectEvents: @ 8058378
- push {lr}
- ldr r0, _08058388 @ =gLinkPlayerObjectEvents
- movs r1, 0
- movs r2, 0x10
- bl memset
- pop {r0}
- bx r0
- .align 2, 0
-_08058388: .4byte gLinkPlayerObjectEvents
- thumb_func_end ClearLinkPlayerObjectEvents
-
- thumb_func_start ZeroObjectEvent
-ZeroObjectEvent: @ 805838C
- push {lr}
- movs r1, 0
- movs r2, 0x24
- bl memset
- pop {r0}
- bx r0
- thumb_func_end ZeroObjectEvent
-
- thumb_func_start SpawnLinkPlayerObjectEvent
-SpawnLinkPlayerObjectEvent: @ 805839C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- mov r9, r1
- mov r10, r2
- mov r8, r3
- lsls r0, 24
- lsrs r7, r0, 24
- mov r0, r9
- lsls r0, 16
- lsrs r0, 16
- mov r9, r0
- mov r1, r10
- lsls r1, 16
- lsrs r1, 16
- mov r10, r1
- mov r2, r8
- lsls r2, 24
- lsrs r2, 24
- mov r8, r2
- bl GetFirstInactiveObjectEventId
- adds r6, r0, 0
- lsls r6, 24
- lsrs r6, 24
- lsls r4, r7, 2
- ldr r0, _08058440 @ =gLinkPlayerObjectEvents
- adds r4, r0
- lsls r5, r6, 3
- adds r5, r6
- lsls r5, 2
- ldr r0, _08058444 @ =gObjectEvents
- adds r5, r0
- adds r0, r4, 0
- bl ZeroLinkPlayerObjectEvent
- adds r0, r5, 0
- bl ZeroObjectEvent
- movs r2, 0
- movs r1, 0x1
- movs r0, 0x1
- strb r0, [r4]
- strb r7, [r4, 0x1]
- strb r6, [r4, 0x2]
- strb r2, [r4, 0x3]
- ldrb r0, [r5]
- orrs r0, r1
- mov r2, r8
- ands r2, r1
- lsls r2, 1
- movs r1, 0x3
- negs r1, r1
- ands r0, r1
- orrs r0, r2
- strb r0, [r5]
- movs r0, 0x2
- strb r0, [r5, 0x19]
- movs r0, 0x40
- strb r0, [r5, 0x4]
- mov r0, r9
- lsls r0, 16
- asrs r0, 16
- mov r9, r0
- mov r1, r10
- lsls r1, 16
- asrs r1, 16
- mov r10, r1
- adds r0, r5, 0
- mov r1, r9
- mov r2, r10
- bl InitLinkPlayerObjectEventPos
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08058440: .4byte gLinkPlayerObjectEvents
-_08058444: .4byte gObjectEvents
- thumb_func_end SpawnLinkPlayerObjectEvent
-
- thumb_func_start InitLinkPlayerObjectEventPos
-InitLinkPlayerObjectEventPos: @ 8058448
- push {r4,lr}
- adds r4, r0, 0
- adds r0, r1, 0
- adds r1, r2, 0
- lsls r0, 16
- lsrs r0, 16
- lsls r1, 16
- lsrs r1, 16
- strh r0, [r4, 0x10]
- strh r1, [r4, 0x12]
- strh r0, [r4, 0x14]
- strh r1, [r4, 0x16]
- lsls r0, 16
- asrs r0, 16
- lsls r1, 16
- asrs r1, 16
- adds r2, r4, 0
- adds r2, 0xC
- adds r3, r4, 0
- adds r3, 0xE
- bl SetSpritePosToMapCoords
- ldrh r0, [r4, 0xC]
- adds r0, 0x8
- strh r0, [r4, 0xC]
- adds r0, r4, 0
- bl ObjectEventUpdateZCoord
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end InitLinkPlayerObjectEventPos
-
- thumb_func_start sub_8058488
-sub_8058488: @ 8058488
- push {lr}
- lsls r0, 24
- lsls r1, 24
- lsrs r2, r1, 24
- ldr r1, _080584B0 @ =gLinkPlayerObjectEvents
- lsrs r0, 22
- adds r1, r0, r1
- ldrb r0, [r1]
- cmp r0, 0
- beq _080584AA
- ldrb r0, [r1, 0x2]
- lsls r1, r0, 3
- adds r1, r0
- lsls r1, 2
- ldr r0, _080584B4 @ =gObjectEvents
- adds r1, r0
- strb r2, [r1, 0x19]
-_080584AA:
- pop {r0}
- bx r0
- .align 2, 0
-_080584B0: .4byte gLinkPlayerObjectEvents
-_080584B4: .4byte gObjectEvents
- thumb_func_end sub_8058488
-
- thumb_func_start sub_80584B8
-sub_80584B8: @ 80584B8
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 22
- ldr r1, _080584F8 @ =gLinkPlayerObjectEvents
- adds r5, r0, r1
- ldrb r1, [r5, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _080584FC @ =gObjectEvents
- adds r4, r0, r1
- ldrb r0, [r4, 0x4]
- cmp r0, 0x40
- beq _080584E4
- adds r1, r0, 0
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _08058500 @ =gSprites
- adds r0, r1
- bl DestroySprite
-_080584E4:
- movs r0, 0
- strb r0, [r5]
- ldrb r1, [r4]
- subs r0, 0x2
- ands r0, r1
- strb r0, [r4]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080584F8: .4byte gLinkPlayerObjectEvents
-_080584FC: .4byte gObjectEvents
-_08058500: .4byte gSprites
- thumb_func_end sub_80584B8
-
- thumb_func_start GetSpriteForLinkedPlayer
-GetSpriteForLinkedPlayer: @ 8058504
- lsls r0, 24
- ldr r1, _0805851C @ =gLinkPlayerObjectEvents
- lsrs r0, 22
- adds r0, r1
- ldrb r1, [r0, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08058520 @ =gObjectEvents
- adds r0, r1
- ldrb r0, [r0, 0x4]
- bx lr
- .align 2, 0
-_0805851C: .4byte gLinkPlayerObjectEvents
-_08058520: .4byte gObjectEvents
- thumb_func_end GetSpriteForLinkedPlayer
-
- thumb_func_start sub_8058524
-sub_8058524: @ 8058524
- lsls r0, 24
- ldr r3, _08058544 @ =gLinkPlayerObjectEvents
- lsrs r0, 22
- adds r0, r3
- ldrb r3, [r0, 0x2]
- lsls r0, r3, 3
- adds r0, r3
- lsls r0, 2
- ldr r3, _08058548 @ =gObjectEvents
- adds r0, r3
- ldrh r3, [r0, 0x10]
- strh r3, [r1]
- ldrh r0, [r0, 0x12]
- strh r0, [r2]
- bx lr
- .align 2, 0
-_08058544: .4byte gLinkPlayerObjectEvents
-_08058548: .4byte gObjectEvents
- thumb_func_end sub_8058524
-
- thumb_func_start sub_805854C
-sub_805854C: @ 805854C
- lsls r0, 24
- ldr r1, _08058564 @ =gLinkPlayerObjectEvents
- lsrs r0, 22
- adds r0, r1
- ldrb r1, [r0, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08058568 @ =gObjectEvents
- adds r0, r1
- ldrb r0, [r0, 0x19]
- bx lr
- .align 2, 0
-_08058564: .4byte gLinkPlayerObjectEvents
-_08058568: .4byte gObjectEvents
- thumb_func_end sub_805854C
-
- thumb_func_start sub_805856C
-sub_805856C: @ 805856C
- lsls r0, 24
- ldr r1, _08058588 @ =gLinkPlayerObjectEvents
- lsrs r0, 22
- adds r0, r1
- ldrb r1, [r0, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _0805858C @ =gObjectEvents
- adds r0, r1
- ldrb r0, [r0, 0xB]
- lsls r0, 28
- lsrs r0, 28
- bx lr
- .align 2, 0
-_08058588: .4byte gLinkPlayerObjectEvents
-_0805858C: .4byte gObjectEvents
- thumb_func_end sub_805856C
-
- thumb_func_start sub_8058590
-sub_8058590: @ 8058590
- lsls r0, 24
- ldr r1, _080585B0 @ =gLinkPlayerObjectEvents
- lsrs r0, 22
- adds r0, r1
- ldrb r1, [r0, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _080585B4 @ =gObjectEvents
- adds r0, r1
- adds r0, 0x21
- movs r1, 0
- ldrsb r1, [r0, r1]
- movs r0, 0x10
- subs r0, r1
- bx lr
- .align 2, 0
-_080585B0: .4byte gLinkPlayerObjectEvents
-_080585B4: .4byte gObjectEvents
- thumb_func_end sub_8058590
-
- thumb_func_start GetLinkPlayerIdAt
-GetLinkPlayerIdAt: @ 80585B8
- push {r4-r6,lr}
- movs r2, 0
- ldr r5, _080585FC @ =gLinkPlayerObjectEvents
- lsls r0, 16
- asrs r4, r0, 16
- lsls r1, 16
- asrs r3, r1, 16
-_080585C6:
- lsls r0, r2, 2
- adds r1, r0, r5
- ldrb r0, [r1]
- cmp r0, 0
- beq _08058604
- ldrb r0, [r1, 0x3]
- cmp r0, 0
- beq _080585DA
- cmp r0, 0x2
- bne _08058604
-_080585DA:
- ldrb r1, [r1, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08058600 @ =gObjectEvents
- adds r1, r0, r1
- movs r6, 0x10
- ldrsh r0, [r1, r6]
- cmp r0, r4
- bne _08058604
- movs r6, 0x12
- ldrsh r0, [r1, r6]
- cmp r0, r3
- bne _08058604
- adds r0, r2, 0
- b _08058610
- .align 2, 0
-_080585FC: .4byte gLinkPlayerObjectEvents
-_08058600: .4byte gObjectEvents
-_08058604:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x3
- bls _080585C6
- movs r0, 0x4
-_08058610:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end GetLinkPlayerIdAt
-
- thumb_func_start sub_8058618
-sub_8058618: @ 8058618
- push {r4-r6,lr}
- lsls r0, 24
- lsls r1, 24
- lsrs r3, r1, 24
- adds r2, r3, 0
- lsrs r0, 22
- ldr r1, _08058648 @ =gLinkPlayerObjectEvents
- adds r5, r0, r1
- ldrb r1, [r5, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _0805864C @ =gObjectEvents
- adds r6, r0, r1
- ldrb r0, [r5]
- cmp r0, 0
- beq _08058674
- cmp r3, 0xA
- bls _08058650
- ldrb r0, [r6]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r6]
- b _08058674
- .align 2, 0
-_08058648: .4byte gLinkPlayerObjectEvents
-_0805864C: .4byte gObjectEvents
-_08058650:
- ldr r4, _0805867C @ =gUnknown_826D374
- ldr r1, _08058680 @ =gUnknown_826D33C
- ldrb r0, [r5, 0x3]
- lsls r0, 2
- adds r0, r1
- ldr r3, [r0]
- adds r0, r5, 0
- adds r1, r6, 0
- bl _call_via_r3
- lsls r0, 24
- lsrs r0, 22
- adds r0, r4
- ldr r2, [r0]
- adds r0, r5, 0
- adds r1, r6, 0
- bl _call_via_r2
-_08058674:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0805867C: .4byte gUnknown_826D374
-_08058680: .4byte gUnknown_826D33C
- thumb_func_end sub_8058618
-
- thumb_func_start sub_8058684
-sub_8058684: @ 8058684
- push {r4,lr}
- lsls r2, 24
- lsrs r2, 24
- ldr r4, _080586A0 @ =gUnknown_826D348
- lsls r3, r2, 2
- adds r3, r4
- ldr r3, [r3]
- bl _call_via_r3
- lsls r0, 24
- lsrs r0, 24
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080586A0: .4byte gUnknown_826D348
- thumb_func_end sub_8058684
-
- thumb_func_start sub_80586A4
-sub_80586A4: @ 80586A4
- movs r0, 0x1
- bx lr
- thumb_func_end sub_80586A4
-
- thumb_func_start sub_80586A8
-sub_80586A8: @ 80586A8
- push {r4,lr}
- lsls r2, 24
- lsrs r2, 24
- ldr r4, _080586C4 @ =gUnknown_826D348
- lsls r3, r2, 2
- adds r3, r4
- ldr r3, [r3]
- bl _call_via_r3
- lsls r0, 24
- lsrs r0, 24
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080586C4: .4byte gUnknown_826D348
- thumb_func_end sub_80586A8
-
- thumb_func_start sub_80586C8
-sub_80586C8: @ 80586C8
- movs r0, 0
- bx lr
- thumb_func_end sub_80586C8
-
- thumb_func_start sub_80586CC
-sub_80586CC: @ 80586CC
- push {r4-r6,lr}
- sub sp, 0x4
- adds r4, r0, 0
- adds r5, r1, 0
- lsls r0, r2, 24
- lsrs r0, 24
- ldrb r1, [r5, 0x19]
- bl npc_something3
- strb r0, [r5, 0x19]
- ldrb r1, [r5, 0x19]
- mov r6, sp
- adds r6, 0x2
- adds r0, r5, 0
- mov r2, sp
- adds r3, r6, 0
- bl ObjectEventMoveDestCoords
- ldrb r0, [r4, 0x2]
- ldrb r1, [r5, 0x19]
- mov r2, sp
- movs r3, 0
- ldrsh r2, [r2, r3]
- movs r4, 0
- ldrsh r3, [r6, r4]
- bl npc_080587EC
- lsls r0, 24
- cmp r0, 0
- bne _0805872A
- adds r1, r5, 0
- adds r1, 0x21
- movs r0, 0x10
- strb r0, [r1]
- mov r0, sp
- movs r2, 0
- ldrsh r1, [r0, r2]
- movs r3, 0
- ldrsh r2, [r6, r3]
- adds r0, r5, 0
- bl ShiftObjectEventCoords
- adds r0, r5, 0
- bl ObjectEventUpdateZCoord
- movs r0, 0x1
- b _0805872C
-_0805872A:
- movs r0, 0
-_0805872C:
- add sp, 0x4
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_80586CC
-
- thumb_func_start sub_8058734
-sub_8058734: @ 8058734
- push {r4,lr}
- adds r4, r1, 0
- lsls r0, r2, 24
- lsrs r0, 24
- ldrb r1, [r4, 0x19]
- bl npc_something3
- strb r0, [r4, 0x19]
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8058734
-
- thumb_func_start sub_805874C
-sub_805874C: @ 805874C
- movs r1, 0
- strb r1, [r0, 0x3]
- bx lr
- thumb_func_end sub_805874C
-
- thumb_func_start sub_8058754
-sub_8058754: @ 8058754
- push {r4-r6,lr}
- adds r6, r0, 0
- adds r4, r1, 0
- adds r5, r4, 0
- adds r5, 0x21
- ldrb r0, [r5]
- subs r0, 0x1
- strb r0, [r5]
- movs r0, 0x1
- strb r0, [r6, 0x3]
- ldrb r0, [r4, 0x19]
- adds r1, 0xC
- adds r2, r4, 0
- adds r2, 0xE
- bl MoveCoords
- ldrb r0, [r5]
- cmp r0, 0
- bne _08058784
- adds r0, r4, 0
- bl ShiftStillObjectEventCoords
- movs r0, 0x2
- strb r0, [r6, 0x3]
-_08058784:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_8058754
-
- thumb_func_start npc_something3
-npc_something3: @ 805878C
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r2, r1, 24
- subs r0, 0x1
- cmp r0, 0x9
- bhi _080587E4
- lsls r0, 2
- ldr r1, _080587A8 @ =_080587AC
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_080587A8: .4byte _080587AC
- .align 2, 0
-_080587AC:
- .4byte _080587D4
- .4byte _080587D8
- .4byte _080587DC
- .4byte _080587E0
- .4byte _080587E4
- .4byte _080587E4
- .4byte _080587D4
- .4byte _080587D8
- .4byte _080587DC
- .4byte _080587E0
-_080587D4:
- movs r0, 0x2
- b _080587E6
-_080587D8:
- movs r0, 0x1
- b _080587E6
-_080587DC:
- movs r0, 0x3
- b _080587E6
-_080587E0:
- movs r0, 0x4
- b _080587E6
-_080587E4:
- adds r0, r2, 0
-_080587E6:
- pop {r1}
- bx r1
- thumb_func_end npc_something3
-
- thumb_func_start npc_080587EC
-npc_080587EC: @ 80587EC
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- lsls r2, 16
- lsrs r2, 16
- mov r12, r2
- lsls r3, 16
- movs r4, 0
- ldr r0, _08058850 @ =gObjectEvents
- mov r9, r0
- lsrs r2, r3, 16
- mov r10, r2
- asrs r6, r3, 16
-_08058810:
- mov r7, r12
- lsls r3, r7, 16
- mov r0, r10
- lsls r5, r0, 16
- cmp r4, r8
- beq _08058854
- lsls r0, r4, 3
- adds r0, r4
- lsls r0, 2
- mov r2, r9
- adds r1, r0, r2
- movs r7, 0x10
- ldrsh r0, [r1, r7]
- asrs r2, r3, 16
- cmp r0, r2
- bne _08058838
- movs r7, 0x12
- ldrsh r0, [r1, r7]
- cmp r0, r6
- beq _0805884A
-_08058838:
- movs r7, 0x14
- ldrsh r0, [r1, r7]
- cmp r0, r2
- bne _08058854
- movs r0, 0x16
- ldrsh r1, [r1, r0]
- asrs r0, r5, 16
- cmp r1, r0
- bne _08058854
-_0805884A:
- movs r0, 0x1
- b _0805886A
- .align 2, 0
-_08058850: .4byte gObjectEvents
-_08058854:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xF
- bls _08058810
- asrs r0, r3, 16
- asrs r1, r5, 16
- bl MapGridIsImpassableAt
- lsls r0, 24
- lsrs r0, 24
-_0805886A:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end npc_080587EC
-
- thumb_func_start CreateLinkPlayerSprite
-CreateLinkPlayerSprite: @ 8058878
- push {r4,r5,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r1, 24
- lsrs r3, r1, 24
- lsls r2, r5, 2
- ldr r0, _080588B4 @ =gLinkPlayerObjectEvents
- adds r2, r0
- ldrb r1, [r2, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _080588B8 @ =gObjectEvents
- adds r4, r0, r1
- ldrb r0, [r2]
- cmp r0, 0
- beq _080588FC
- subs r0, r3, 0x4
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bhi _080588BC
- ldrb r1, [r4]
- lsls r1, 30
- lsrs r1, 31
- movs r0, 0
- bl GetRivalAvatarGraphicsIdByStateIdAndGender
- b _080588C6
- .align 2, 0
-_080588B4: .4byte gLinkPlayerObjectEvents
-_080588B8: .4byte gObjectEvents
-_080588BC:
- ldrb r0, [r4]
- lsls r0, 30
- lsrs r0, 31
- bl GetHoennLinkPartnerGraphicsIdByGender
-_080588C6:
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08058904 @ =SpriteCB_LinkPlayer
- movs r2, 0
- str r2, [sp]
- movs r3, 0
- bl AddPseudoObjectEvent
- strb r0, [r4, 0x4]
- ldrb r1, [r4, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _08058908 @ =gSprites
- adds r0, r1
- adds r3, r0, 0
- adds r3, 0x3E
- ldrb r1, [r3]
- movs r2, 0x2
- orrs r1, r2
- strb r1, [r3]
- strh r5, [r0, 0x2E]
- ldrb r1, [r4]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- strb r0, [r4]
-_080588FC:
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08058904: .4byte SpriteCB_LinkPlayer
-_08058908: .4byte gSprites
- thumb_func_end CreateLinkPlayerSprite
-
- thumb_func_start SpriteCB_LinkPlayer
-SpriteCB_LinkPlayer: @ 805890C
- push {r4-r6,lr}
- adds r5, r0, 0
- movs r0, 0x2E
- ldrsh r4, [r5, r0]
- lsls r4, 2
- ldr r0, _08058970 @ =gLinkPlayerObjectEvents
- adds r4, r0
- ldrb r1, [r4, 0x2]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08058974 @ =gObjectEvents
- adds r6, r0, r1
- ldrh r0, [r6, 0xC]
- strh r0, [r5, 0x20]
- ldrh r0, [r6, 0xE]
- strh r0, [r5, 0x22]
- ldrb r0, [r6, 0xB]
- lsrs r0, 4
- adds r1, r5, 0
- movs r2, 0x1
- bl SetObjectSubpriorityByZCoord
- ldrb r0, [r6, 0xB]
- lsrs r0, 4
- bl ZCoordToPriority
- movs r1, 0x3
- ands r1, r0
- lsls r1, 2
- ldrb r2, [r5, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r5, 0x5]
- ldrb r0, [r4, 0x3]
- cmp r0, 0
- bne _08058978
- ldrb r0, [r6, 0x19]
- bl GetFaceDirectionAnimNum
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl StartSpriteAnim
- b _0805898A
- .align 2, 0
-_08058970: .4byte gLinkPlayerObjectEvents
-_08058974: .4byte gObjectEvents
-_08058978:
- ldrb r0, [r6, 0x19]
- bl GetMoveDirectionAnimNum
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl StartSpriteAnimIfDifferent
-_0805898A:
- adds r0, r5, 0
- movs r1, 0
- bl UpdateObjectEventSpriteVisibility
- ldrb r0, [r6]
- lsls r0, 29
- cmp r0, 0
- bge _080589BC
- ldrh r0, [r5, 0x3C]
- movs r1, 0x4
- ands r1, r0
- lsls r1, 16
- adds r3, r5, 0
- adds r3, 0x3E
- lsrs r1, 18
- lsls r1, 2
- ldrb r2, [r3]
- movs r0, 0x5
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r3]
- ldrh r0, [r5, 0x3C]
- adds r0, 0x1
- strh r0, [r5, 0x3C]
-_080589BC:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end SpriteCB_LinkPlayer
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/maps/RecordCenter/map.json b/data/maps/RecordCenter/map.json
index 19b310814..ad4308513 100644
--- a/data/maps/RecordCenter/map.json
+++ b/data/maps/RecordCenter/map.json
@@ -67,7 +67,7 @@
"elevation": 3,
"var": "VAR_TEMP_0",
"var_value": "0",
- "script": "RecordCenter_EventScript_Spot"
+ "script": "RecordCenter_EventScript_Spot0"
},
{
"type": "trigger",
@@ -76,7 +76,7 @@
"elevation": 3,
"var": "VAR_TEMP_0",
"var_value": "0",
- "script": "RecordCenter_EventScript_Spot"
+ "script": "RecordCenter_EventScript_Spot1"
},
{
"type": "trigger",
@@ -85,7 +85,7 @@
"elevation": 3,
"var": "VAR_TEMP_0",
"var_value": "0",
- "script": "RecordCenter_EventScript_Spot"
+ "script": "RecordCenter_EventScript_Spot2"
},
{
"type": "trigger",
@@ -94,7 +94,7 @@
"elevation": 3,
"var": "VAR_TEMP_0",
"var_value": "0",
- "script": "RecordCenter_EventScript_Spot"
+ "script": "RecordCenter_EventScript_Spot3"
}
],
"bg_events": []
diff --git a/data/overworld.s b/data/overworld.s
deleted file mode 100644
index e37dfbcf4..000000000
--- a/data/overworld.s
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "constants/flags.h"
-#include "constants/maps.h"
- .include "asm/macros.inc"
- .include "constants/constants.inc"
- .section .rodata
- .align 2, 0
-
- .align 2
-gUnknown_826D33C:: @ 826D33C
- .4byte sub_8058684
- .4byte sub_80586A4
- .4byte sub_80586A8
-
-gUnknown_826D348:: @ 826D348
- .4byte sub_80586C8
- .4byte sub_80586CC
- .4byte sub_80586CC
- .4byte sub_80586CC
- .4byte sub_80586CC
- .4byte sub_80586C8
- .4byte sub_80586C8
- .4byte sub_8058734
- .4byte sub_8058734
- .4byte sub_8058734
- .4byte sub_8058734
-
-gUnknown_826D374:: @ 826D374
- .4byte sub_805874C
- .4byte sub_8058754
diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc
index 01b0d9b34..1053c1028 100644
--- a/data/scripts/cable_club.inc
+++ b/data/scripts/cable_club.inc
@@ -702,7 +702,11 @@ TradeCenter_EventScript_Chair3:: @ 81BB974
end
@ Nop in FRLG
-RecordCenter_EventScript_Spot:: @ 81BB980
+@ Separate labels to match GetDirectionForEventScript
+RecordCenter_EventScript_Spot0:: @ 81BB980
+RecordCenter_EventScript_Spot1:: @ 81BB980
+RecordCenter_EventScript_Spot2:: @ 81BB980
+RecordCenter_EventScript_Spot3:: @ 81BB980
end
CableClub_EventScript_ReadTrainerCard:: @ 81BB981
diff --git a/include/cable_club.h b/include/cable_club.h
index 57515efc7..ccdc6b98d 100644
--- a/include/cable_club.h
+++ b/include/cable_club.h
@@ -11,5 +11,6 @@
void sub_8081A90(u8 taskId);
u8 CreateTask_ReestablishLinkInCableClubRoom(void);
void CB2_ReturnFromCableClubBattle(void);
+bool32 GetSeeingLinkPlayerCardMsg(u8 who);
#endif //GUARD_CABLE_CLUB_H
diff --git a/include/event_scripts.h b/include/event_scripts.h
index add2da0d1..a1bb5e35d 100644
--- a/include/event_scripts.h
+++ b/include/event_scripts.h
@@ -1262,5 +1262,23 @@ extern const u8 EventScript_1C1361[];
// overworld
extern const u8 EventScript_ResetEliteFourEnd[];
+extern const u8 CableClub_EventScript_DoLinkRoomExit[];
+extern const u8 CableClub_EventScript_TooBusyToNotice[];
+extern const u8 CableClub_EventScript_ReadTrainerCard[];
+extern const u8 CableClub_EventScript_ReadTrainerCardColored[];
+extern const u8 BattleColosseum_4P_EventScript_PlayerSpot0[];
+extern const u8 BattleColosseum_4P_EventScript_PlayerSpot1[];
+extern const u8 BattleColosseum_4P_EventScript_PlayerSpot2[];
+extern const u8 BattleColosseum_4P_EventScript_PlayerSpot3[];
+extern const u8 RecordCenter_EventScript_Spot0[];
+extern const u8 RecordCenter_EventScript_Spot1[];
+extern const u8 RecordCenter_EventScript_Spot2[];
+extern const u8 RecordCenter_EventScript_Spot3[];
+extern const u8 BattleColosseum_2P_EventScript_PlayerSpot0[];
+extern const u8 BattleColosseum_2P_EventScript_PlayerSpot1[];
+extern const u8 TradeCenter_EventScript_Chair0[];
+extern const u8 TradeCenter_EventScript_Chair1[];
+extern const u8 TradeCenter_ConfirmLeaveRoom[];
+extern const u8 TradeCenter_TerminateLink[];
#endif //GUARD_EVENT_SCRIPTS_H
diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h
index 2dc8aab84..79e6c2aef 100644
--- a/include/field_player_avatar.h
+++ b/include/field_player_avatar.h
@@ -62,5 +62,6 @@ bool32 PlayerIsMovingOnRockStairs(u8 direction);
void sub_805BEB8(void);
void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender);
void nullsub_24(u8 direction);
+u8 GetRSAvatarGraphicsIdByGender(u8 gender);
#endif //GUARD_FIELD_PLAYER_AVATAR_H
diff --git a/include/link.h b/include/link.h
index e5a40d6a5..d6f35f66d 100644
--- a/include/link.h
+++ b/include/link.h
@@ -289,5 +289,7 @@ void sub_800A900(u8 a0);
u8 sub_800A8A4(void);
void sub_800A9A4(void);
void SetLocalLinkPlayerId(u8 playerId);
+bool32 IsSendingKeysToLink(void);
+u32 GetLinkRecvQueueLength(void);
#endif // GUARD_LINK_H
diff --git a/include/link_rfu.h b/include/link_rfu.h
index ba2eb0120..31075be77 100644
--- a/include/link_rfu.h
+++ b/include/link_rfu.h
@@ -88,7 +88,7 @@ struct UnkRfuStruct_2_Sub_124
/* 0x57b */ vu8 full;
};
-struct UnkRfuStruct_2_Sub_9e8
+struct RfuSendQueue
{
/* 0x000 */ u8 slots[40][14];
/* 0x230 */ vu8 recv_slot;
@@ -148,7 +148,7 @@ typedef struct UnkRfuStruct_2
/* 0x102 */ u8 unk_102;
/* 0x104 */ struct RfuTgtData unk_104;
/* 0x124 */ struct UnkRfuStruct_2_Sub_124 unk_124;
- /* 0x6a0 */ struct UnkRfuStruct_2_Sub_9e8 unk_9e8;
+ /* 0x6a0 */ struct RfuSendQueue sendQueue;
/* 0x8d4 */ struct UnkRfuStruct_2_Sub_c1c unk_c1c;
/* 0x8f4 */ vu8 unk_c3c;
/* 0x8f5 */ u8 reconnectedParentIdx;
@@ -227,16 +227,16 @@ void InitRFU(void);
bool32 RfuIsErrorStatus1or2(void);
void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *ptr);
-void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr);
+void RFU_queue_40_14_reset(struct RfuSendQueue *ptr);
void RfuSetErrorStatus(u8 a0, u16 msg);
u8 RfuGetErrorStatus(void);
void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2);
-bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2);
+bool8 RFU_queue_40_14_send(struct RfuSendQueue *q1, u8 *q2);
bool8 RFU_queue_2_14_send(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
void RFU_queue_2_14_recv(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2);
bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 * a0, u8 *a1);
-void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 * a0, u8 *a1);
+void RFU_queue_40_14_recv(struct RfuSendQueue * a0, u8 *a1);
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders);
void UpdateGameData_GroupLockedIn(bool8 started);
bool32 RfuSerialNumberIsValid(u32 a0);
diff --git a/include/overworld.h b/include/overworld.h
index c4d4520bf..f90d88e4e 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -38,7 +38,7 @@ struct LinkPlayerObjectEvent
u8 active;
u8 linkPlayerId;
u8 objEventId;
- u8 mode;
+ u8 movementMode;
};
struct CreditsOverworldCmd
@@ -177,11 +177,11 @@ u8 GetCurrentMapBattleScene(void);
void Overworld_ResetStateAfterFly(void);
bool8 sub_8055B38(u16 metatileBehavior);
void Overworld_ResetMapMusic(void);
-void sub_8057F5C(void);
-void sub_8057F34(void);
+u16 QueueExitLinkRoomKey(void);
+u16 sub_8057F34(void);
u32 sub_8057EC0(void);
-void sub_8057F70(void);
-void sub_8057F48(void);
+u16 sub_8057F70(void);
+u16 sub_8057F48(void);
void SetMainCallback1(MainCallback cb);
void CB1_Overworld(void);
void CB2_ReturnToFieldContinueScript(void);
diff --git a/ld_script.txt b/ld_script.txt
index 122de0d53..ecea5f2dd 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -88,7 +88,6 @@ SECTIONS {
src/play_time.o(.text);
src/new_game.o(.text);
src/overworld.o(.text);
- asm/overworld.o(.text);
src/fieldmap.o(.text);
src/metatile_behavior.o(.text);
src/field_camera.o(.text);
@@ -429,7 +428,6 @@ SECTIONS {
src/trade.o(.rodata);
src/trade_scene.o(.rodata);
src/overworld.o(.rodata);
- data/overworld.o(.rodata);
data/tilesets.o(.rodata);
data/maps.o(.rodata);
src/fieldmap.o(.rodata);
diff --git a/src/cable_club.c b/src/cable_club.c
index e1cab2d02..e75f1abf8 100644
--- a/src/cable_club.c
+++ b/src/cable_club.c
@@ -767,7 +767,7 @@ void CleanupLinkRoomState(void)
void ExitLinkRoom(void)
{
- sub_8057F5C();
+ QueueExitLinkRoomKey();
}
static void Task_EnterCableClubSeat(u8 taskId)
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index 0bc4910eb..6b51e7bc2 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -1152,7 +1152,7 @@ u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
return sPlayerAvatarGfxIds[state][gender];
}
-u8 GetHoennLinkPartnerGraphicsIdByGender(u8 gender)
+u8 GetRSAvatarGraphicsIdByGender(u8 gender)
{
return sHoennLinkPartnerGfxIds[gender];
}
diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c
index 2259e9214..15ffb4813 100644
--- a/src/link_rfu_2.c
+++ b/src/link_rfu_2.c
@@ -201,7 +201,7 @@ void ResetLinkRfuGFLayer(void)
}
ResetSendDataManager(&Rfu.cmd_8800_sendbuf);
RFU_queue_20_70_reset(&Rfu.unk_124);
- RFU_queue_40_14_reset(&Rfu.unk_9e8);
+ RFU_queue_40_14_reset(&Rfu.sendQueue);
CpuFill16(0, gSendCmd, sizeof gSendCmd);
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers);
@@ -659,7 +659,7 @@ static void sub_80F906C(void)
}
if (Rfu.unk_c3c == 0)
{
- RFU_queue_40_14_send(&Rfu.unk_9e8, Rfu.unk_4c);
+ RFU_queue_40_14_send(&Rfu.sendQueue, Rfu.unk_4c);
RFU_queue_2_14_recv(&Rfu.unk_c1c, Rfu.unk_4c);
}
}
@@ -881,7 +881,7 @@ static bool32 RfuProcessEnqueuedRecvBlock(void)
Rfu.unk_cd0--;
CallRfuFunc();
sub_80F94BC(gSendCmd, sp48);
- RFU_queue_40_14_recv(&Rfu.unk_9e8, sp48);
+ RFU_queue_40_14_recv(&Rfu.sendQueue, sp48);
for (i = 0; i < CMD_LENGTH - 1; i++)
gSendCmd[i] = 0;
}
@@ -909,7 +909,7 @@ static void HandleSendFailure(u8 unused, u32 flags)
j++;j--; // Needed to match;
}
- RFU_queue_40_14_recv(&Rfu.unk_9e8, sResendBlock8);
+ RFU_queue_40_14_recv(&Rfu.sendQueue, sResendBlock8);
Rfu.cmd_8800_sendbuf.failedFlags |= (1 << i);
}
flags >>= 1;
@@ -1853,11 +1853,11 @@ static void RfuCheckErrorStatus(void)
gWirelessCommType = 2;
SetMainCallback2(CB2_LinkError);
gMain.savedCallback = CB2_LinkError;
- SetLinkErrorFromRfu((Rfu.linkman_msg << 16) | (Rfu.linkman_param[0] << 8) | Rfu.linkman_param[1], Rfu.unk_124.count, Rfu.unk_9e8.count, RfuGetErrorStatus() == 2);
+ SetLinkErrorFromRfu((Rfu.linkman_msg << 16) | (Rfu.linkman_param[0] << 8) | Rfu.linkman_param[1], Rfu.unk_124.count, Rfu.sendQueue.count, RfuGetErrorStatus() == 2);
Rfu.errorState = 2;
CloseLink();
}
- else if (Rfu.unk_9e8.full == 1 || Rfu.unk_124.full == 1)
+ else if (Rfu.sendQueue.full == 1 || Rfu.unk_124.full == 1)
{
if (lman.childClockSlave_flag)
rfu_LMAN_requestChangeAgbClockMaster();
@@ -2851,7 +2851,7 @@ static const char gUnknown_843EEA8[][8] = {
static u32 sub_80FC44C(void)
{
- return Rfu.unk_9e8.count;
+ return Rfu.sendQueue.count;
}
u32 GetRfuRecvQueueLength(void)
diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c
index d3f6e93db..8382f1dab 100644
--- a/src/link_rfu_3.c
+++ b/src/link_rfu_3.c
@@ -184,7 +184,7 @@ void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *queue)
queue->full = 0;
}
-void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr)
+void RFU_queue_40_14_reset(struct RfuSendQueue *ptr)
{
s32 i;
s32 j;
@@ -260,7 +260,7 @@ void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *queue, u8 *data)
}
}
-void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *data)
+void RFU_queue_40_14_recv(struct RfuSendQueue *queue, u8 *data)
{
s32 i;
u16 imeBak;
@@ -325,7 +325,7 @@ bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 *queue, u8 *dest)
return TRUE;
}
-bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *dest)
+bool8 RFU_queue_40_14_send(struct RfuSendQueue *queue, u8 *dest)
{
s32 i;
u16 imeBak;
diff --git a/src/overworld.c b/src/overworld.c
index 4fb6be314..39ed1ada8 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "gflib.h"
#include "bg_regs.h"
+#include "cable_club.h"
#include "event_data.h"
#include "event_object_movement.h"
#include "event_scripts.h"
@@ -18,6 +19,7 @@
#include "heal_location.h"
#include "help_system.h"
#include "link.h"
+#include "link_rfu.h"
#include "load_save.h"
#include "m4a.h"
#include "map_name_popup.h"
@@ -38,6 +40,7 @@
#include "scanline_effect.h"
#include "script.h"
#include "script_pokemon_util.h"
+#include "start_menu.h"
#include "tileset_anims.h"
#include "trainer_pokemon_sprites.h"
#include "vs_seeker.h"
@@ -48,6 +51,23 @@
#include "constants/region_map_sections.h"
#include "constants/songs.h"
+#define PLAYER_TRADING_STATE_IDLE 0x80
+#define PLAYER_TRADING_STATE_BUSY 0x81
+#define PLAYER_TRADING_STATE_UNK_2 0x82
+#define PLAYER_TRADING_STATE_EXITING_ROOM 0x83
+
+#define FACING_NONE 0
+#define FACING_UP 1
+#define FACING_DOWN 2
+#define FACING_LEFT 3
+#define FACING_RIGHT 4
+#define FACING_FORCED_UP 7
+#define FACING_FORCED_DOWN 8
+#define FACING_FORCED_LEFT 9
+#define FACING_FORCED_RIGHT 10
+
+typedef u16 (*KeyInterCB)(u32 key);
+
struct InitialPlayerAvatarState
{
u8 transitionFlags;
@@ -55,6 +75,16 @@ struct InitialPlayerAvatarState
bool8 unk2;
};
+struct TradeRoomPlayer
+{
+ u8 playerId;
+ u8 isLocalPlayer;
+ u8 c;
+ u8 facing;
+ struct MapPosition pos;
+ u16 field_C;
+};
+
EWRAM_DATA struct WarpData gLastUsedWarp = {};
EWRAM_DATA struct WarpData sWarpDestination = {};
EWRAM_DATA struct WarpData gFixedDiveWarp = {};
@@ -86,6 +116,11 @@ u16 gHeldKeyCodeToSend;
u8 gLocalLinkPlayerId;
u8 gFieldLinkPlayerCount;
+IWRAM_DATA u8 sPlayerTradingStates[4];
+IWRAM_DATA KeyInterCB sPlayerKeyInterceptCallback;
+IWRAM_DATA bool8 gUnknown_3000E88;
+IWRAM_DATA u8 sRfuKeepAliveTimer;
+
u8 CountBadgesForOverworldWhiteOutLossCalculation(void);
void Overworld_ResetStateAfterWhitingOut(void);
void Overworld_SetWhiteoutRespawnPoint(void);
@@ -133,12 +168,54 @@ bool8 sub_8057650(void);
void sub_8057748(struct CameraObject * camera);
void sub_805781C(u8 taskId);
void sub_8057854(u8 taskId);
-void SpawnLinkPlayerObjectEvent(u8 i, s16 x, s16 y, u8 gender);
-void CreateLinkPlayerSprite(u8 i, u8 version);
-void ClearAllPlayerKeys(void);
-u8 GetSpriteForLinkedPlayer(u8 linkPlayerId);
+
void CB1_UpdateLinkState(void);
void ResetAllMultiplayerState(void);
+void ClearAllPlayerKeys(void);
+void SetKeyInterceptCallback(KeyInterCB callback);
+void ResetAllTradingStates(void);
+void UpdateAllLinkPlayers(u16 *linkKeys, s32 selfId);
+void UpdateHeldKeyCode(u16 interceptedKeys);
+u32 GetLinkSendQueueLength(void);
+u16 GetDirectionForDpadKey(u16 key);
+void SetPlayerFacingDirection(u8 linkPlayerId, u8 setFacing);
+void ResetPlayerHeldKeys(u16 *linkKeys);
+u16 KeyInterCB_SelfIdle(u32 linkPlayerId);
+u16 KeyInterCB_DeferToEventScript(u32 linkPlayerId);
+u16 KeyInterCB_DeferToRecvQueue(u32 linkPlayerId);
+u16 KeyInterCB_DeferToSendQueue(u32 linkPlayerId);
+void LoadTradeRoomPlayer(s32 i, s32 selfId, struct TradeRoomPlayer * trainer);
+bool32 PlayerIsAtSouthExit(struct TradeRoomPlayer * player);
+const u8 *TryGetTileEventScript(struct TradeRoomPlayer * player);
+const u8 *TryInteractWithPlayer(struct TradeRoomPlayer * player);
+bool32 sub_8057FEC(struct TradeRoomPlayer * player);
+bool32 sub_8058004(struct TradeRoomPlayer * player);
+u16 GetDirectionForEventScript(const u8 *script);
+void sub_80581BC(void);
+void CreateConfirmLeaveTradeRoomPrompt(void);
+void InitLinkRoomStartMenuScript(void);
+void InitMenuBasedScript(const u8 *script);
+void sub_80581DC(const u8 *script);
+void sub_8058230(void);
+void SpawnLinkPlayerObjectEvent(u8 i, s16 x, s16 y, u8 gender);
+void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y);
+u8 GetSpriteForLinkedPlayer(u8 linkPlayerId);
+void GetLinkPlayerCoords(u8 linkPlayerId, u16 *x, u16 *y);
+u8 GetLinkPlayerFacingDirection(u8 linkPlayerId);
+u8 GetLinkPlayerElevation(u8 linkPlayerId);
+u8 GetLinkPlayerIdAt(s16 x, s16 y);
+void CreateLinkPlayerSprite(u8 i, u8 version);
+u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);
+u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);
+u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);
+u8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);
+u8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);
+u8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8);
+void MovementStatusHandler_EnterFreeMode(struct LinkPlayerObjectEvent *, struct ObjectEvent *);
+void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerObjectEvent *, struct ObjectEvent *);
+u8 FlipVerticalAndClearForced(u8 newFacing, u8 oldFacing);
+u8 LinkPlayerDetectCollision(u8 selfObjEventId, u8 a2, s16 x, s16 y);
+void SpriteCB_LinkPlayer(struct Sprite * sprite);
extern const struct MapLayout * gMapLayouts[];
extern const struct MapHeader *const *gMapGroups[];
@@ -2463,3 +2540,1012 @@ void sub_8057854(u8 taskId)
DestroyTask(taskId);
}
}
+
+// Link related
+
+u8 (*const gLinkPlayerMovementModes[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) = {
+ MovementEventModeCB_Normal, // MOVEMENT_MODE_FREE
+ MovementEventModeCB_Ignored, // MOVEMENT_MODE_FROZEN
+ MovementEventModeCB_Normal_2, // MOVEMENT_MODE_SCRIPTED
+};
+
+// These handlers return TRUE if the movement was scripted and successful, and FALSE otherwise.
+bool8 (*const gLinkPlayerFacingHandlers[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) = {
+ FacingHandler_DoNothing,
+ FacingHandler_DpadMovement,
+ FacingHandler_DpadMovement,
+ FacingHandler_DpadMovement,
+ FacingHandler_DpadMovement,
+ FacingHandler_DoNothing,
+ FacingHandler_DoNothing,
+ FacingHandler_ForcedFacingChange,
+ FacingHandler_ForcedFacingChange,
+ FacingHandler_ForcedFacingChange,
+ FacingHandler_ForcedFacingChange,
+};
+
+// These handlers are run after an attempted movement.
+void (*const gMovementStatusHandler[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *) = {
+ // FALSE:
+ MovementStatusHandler_EnterFreeMode,
+ // TRUE:
+ MovementStatusHandler_TryAdvanceScript,
+};
+
+void CB1_UpdateLinkState(void)
+{
+ if (gWirelessCommType == 0 || !IsRfuRecvQueueEmpty() || !IsSendingKeysToLink())
+ {
+ u8 selfId = gLocalLinkPlayerId;
+ UpdateAllLinkPlayers(gLinkPartnersHeldKeys, selfId);
+
+ // Note: Because guestId is between 0 and 4, while the smallest key code is
+ // LINK_KEY_CODE_EMPTY, this is functionally equivalent to `sPlayerKeyInterceptCallback(0)`.
+ // It is expecting the callback to be KeyInterCB_SelfIdle, and that will
+ // completely ignore any input parameters.
+ //
+ // UpdateHeldKeyCode performs a sanity check on its input; if
+ // sPlayerKeyInterceptCallback echoes back the argument, which is selfId, then
+ // it'll use LINK_KEY_CODE_EMPTY instead.
+ //
+ // Note 2: There are some key intercept callbacks that treat the key as a player
+ // ID. It's so hacky.
+ UpdateHeldKeyCode(sPlayerKeyInterceptCallback(selfId));
+ ClearAllPlayerKeys();
+ }
+}
+
+void ResetAllMultiplayerState(void)
+{
+ ResetAllTradingStates();
+ SetKeyInterceptCallback(KeyInterCB_SelfIdle);
+}
+
+void ClearAllPlayerKeys(void)
+{
+ ResetPlayerHeldKeys(gLinkPartnersHeldKeys);
+}
+
+void SetKeyInterceptCallback(KeyInterCB func)
+{
+ sRfuKeepAliveTimer = 0;
+ sPlayerKeyInterceptCallback = func;
+}
+
+// Once every ~60 frames, if the link state hasn't changed (timer reset by calls
+// to SetKeyInterceptCallback), it does a bunch of sanity checks on the connection.
+// I'm not sure if sRfuKeepAliveTimer is reset in the process, though; rfu stuff is
+// still undocumented.
+void CheckRfuKeepAliveTimer(void)
+{
+ if (gWirelessCommType != 0 && ++sRfuKeepAliveTimer > 60)
+ LinkRfu_FatalError();
+}
+
+void ResetAllTradingStates(void)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ sPlayerTradingStates[i] = PLAYER_TRADING_STATE_IDLE;
+}
+
+// Returns true if all connected players are in tradingState.
+bool32 AreAllPlayersInTradingState(u16 tradingState)
+{
+ s32 i;
+ s32 count = gFieldLinkPlayerCount;
+
+ for (i = 0; i < count; i++)
+ if (sPlayerTradingStates[i] != tradingState)
+ return FALSE;
+ return TRUE;
+}
+
+bool32 IsAnyPlayerInTradingState(u16 tradingState)
+{
+ s32 i;
+ s32 count = gFieldLinkPlayerCount;
+
+ for (i = 0; i < count; i++)
+ if (sPlayerTradingStates[i] == tradingState)
+ return TRUE;
+ return FALSE;
+}
+
+void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlayer *trainer, u16 *forceFacing)
+{
+ const u8 *script;
+
+ if (sPlayerTradingStates[playerId] == PLAYER_TRADING_STATE_IDLE)
+ {
+ script = TryGetTileEventScript(trainer);
+ if (script)
+ {
+ *forceFacing = GetDirectionForEventScript(script);
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
+ if (trainer->isLocalPlayer)
+ {
+ SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
+ sub_80581DC(script);
+ }
+ return;
+ }
+ if (IsAnyPlayerInTradingState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE)
+ {
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
+ if (trainer->isLocalPlayer)
+ {
+ SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
+ sub_8058230();
+ }
+ return;
+ }
+
+ switch (key)
+ {
+ case LINK_KEY_CODE_START_BUTTON:
+ if (sub_8058004(trainer))
+ {
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
+ if (trainer->isLocalPlayer)
+ {
+ SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
+ InitLinkRoomStartMenuScript();
+ }
+ }
+ break;
+ case LINK_KEY_CODE_DPAD_DOWN:
+ if (PlayerIsAtSouthExit(trainer) == TRUE)
+ {
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
+ if (trainer->isLocalPlayer)
+ {
+ SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
+ CreateConfirmLeaveTradeRoomPrompt();
+ }
+ }
+ break;
+ case LINK_KEY_CODE_A_BUTTON:
+ script = TryInteractWithPlayer(trainer);
+ if (script)
+ {
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
+ if (trainer->isLocalPlayer)
+ {
+ SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
+ InitMenuBasedScript(script);
+ }
+ }
+ break;
+ case LINK_KEY_CODE_HANDLE_RECV_QUEUE:
+ if (sub_8057FEC(trainer))
+ {
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
+ if (trainer->isLocalPlayer)
+ {
+ SetKeyInterceptCallback(KeyInterCB_DeferToRecvQueue);
+ sub_80581BC();
+ }
+ }
+ break;
+ case LINK_KEY_CODE_HANDLE_SEND_QUEUE:
+ if (sub_8057FEC(trainer))
+ {
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
+ if (trainer->isLocalPlayer)
+ {
+ SetKeyInterceptCallback(KeyInterCB_DeferToSendQueue);
+ sub_80581BC();
+ }
+ }
+ break;
+ }
+ }
+
+ switch (key)
+ {
+ case LINK_KEY_CODE_EXIT_ROOM:
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_EXITING_ROOM;
+ break;
+ case LINK_KEY_CODE_UNK_2:
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_UNK_2;
+ break;
+ case LINK_KEY_CODE_UNK_4:
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_IDLE;
+ if (trainer->isLocalPlayer)
+ SetKeyInterceptCallback(KeyInterCB_SelfIdle);
+ break;
+ case LINK_KEY_CODE_UNK_7:
+ if (sPlayerTradingStates[playerId] == PLAYER_TRADING_STATE_UNK_2)
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
+ break;
+ }
+}
+
+void UpdateAllLinkPlayers(u16 *keys, s32 selfId)
+{
+ struct TradeRoomPlayer trainer;
+ s32 i;
+
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ u8 key = keys[i];
+ u16 setFacing = FACING_NONE;
+ LoadTradeRoomPlayer(i, selfId, &trainer);
+ HandleLinkPlayerKeyInput(i, key, &trainer, &setFacing);
+ if (sPlayerTradingStates[i] == PLAYER_TRADING_STATE_IDLE)
+ setFacing = GetDirectionForDpadKey(key);
+ SetPlayerFacingDirection(i, setFacing);
+ }
+}
+
+void UpdateHeldKeyCode(u16 key)
+{
+ if (key >= LINK_KEY_CODE_EMPTY && key < LINK_KEY_CODE_UNK_8)
+ gHeldKeyCodeToSend = key;
+ else
+ gHeldKeyCodeToSend = LINK_KEY_CODE_EMPTY;
+
+ if (gWirelessCommType != 0
+ && GetLinkSendQueueLength() > 1
+ && IsUpdateLinkStateCBActive() == TRUE
+ && IsSendingKeysToLink() == TRUE)
+ {
+ switch (key)
+ {
+ case LINK_KEY_CODE_EMPTY:
+ case LINK_KEY_CODE_DPAD_DOWN:
+ case LINK_KEY_CODE_DPAD_UP:
+ case LINK_KEY_CODE_DPAD_LEFT:
+ case LINK_KEY_CODE_DPAD_RIGHT:
+ case LINK_KEY_CODE_START_BUTTON:
+ case LINK_KEY_CODE_A_BUTTON:
+ gHeldKeyCodeToSend = LINK_KEY_CODE_NULL;
+ break;
+ }
+ }
+}
+
+u16 KeyInterCB_ReadButtons(u32 key)
+{
+ if (JOY_HELD(DPAD_UP))
+ return LINK_KEY_CODE_DPAD_UP;
+ else if (JOY_HELD(DPAD_DOWN))
+ return LINK_KEY_CODE_DPAD_DOWN;
+ else if (JOY_HELD(DPAD_LEFT))
+ return LINK_KEY_CODE_DPAD_LEFT;
+ else if (JOY_HELD(DPAD_RIGHT))
+ return LINK_KEY_CODE_DPAD_RIGHT;
+ else if (JOY_NEW(START_BUTTON))
+ return LINK_KEY_CODE_START_BUTTON;
+ else if (JOY_NEW(A_BUTTON))
+ return LINK_KEY_CODE_A_BUTTON;
+ else
+ return LINK_KEY_CODE_EMPTY;
+}
+
+u16 GetDirectionForDpadKey(u16 a1)
+{
+ switch (a1)
+ {
+ case LINK_KEY_CODE_DPAD_RIGHT:
+ return FACING_RIGHT;
+ case LINK_KEY_CODE_DPAD_LEFT:
+ return FACING_LEFT;
+ case LINK_KEY_CODE_DPAD_UP:
+ return FACING_UP;
+ case LINK_KEY_CODE_DPAD_DOWN:
+ return FACING_DOWN;
+ default:
+ return FACING_NONE;
+ }
+}
+
+// Overwrites the keys with 0x11
+void ResetPlayerHeldKeys(u16 *keys)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ keys[i] = LINK_KEY_CODE_EMPTY;
+}
+
+u16 KeyInterCB_SelfIdle(u32 key)
+{
+ if (ScriptContext2_IsEnabled() == TRUE)
+ return LINK_KEY_CODE_EMPTY;
+ if (GetLinkRecvQueueLength() > 4)
+ return LINK_KEY_CODE_HANDLE_RECV_QUEUE;
+ if (GetLinkSendQueueLength() <= 4)
+ return KeyInterCB_ReadButtons(key);
+ return LINK_KEY_CODE_HANDLE_SEND_QUEUE;
+}
+
+u16 sub_8057D98(u32 key)
+{
+ CheckRfuKeepAliveTimer();
+ return LINK_KEY_CODE_EMPTY;
+}
+
+// Ignore the player's inputs as long as there is an event script
+// in ScriptContext2.
+u16 KeyInterCB_DeferToEventScript(u32 key)
+{
+ u16 retVal;
+ if (ScriptContext2_IsEnabled() == TRUE)
+ {
+ retVal = LINK_KEY_CODE_EMPTY;
+ }
+ else
+ {
+ retVal = LINK_KEY_CODE_UNK_4;
+ SetKeyInterceptCallback(sub_8057D98);
+ }
+ return retVal;
+}
+
+// Ignore the player's inputs as long as there are events being recived.
+u16 KeyInterCB_DeferToRecvQueue(u32 key)
+{
+ u16 retVal;
+ if (GetLinkRecvQueueLength() > 2)
+ {
+ retVal = LINK_KEY_CODE_EMPTY;
+ }
+ else
+ {
+ retVal = LINK_KEY_CODE_UNK_4;
+ ScriptContext2_Disable();
+ SetKeyInterceptCallback(sub_8057D98);
+ }
+ return retVal;
+}
+
+// Ignore the player's inputs as long as there are events being sent.
+u16 KeyInterCB_DeferToSendQueue(u32 key)
+{
+ u16 retVal;
+ if (GetLinkSendQueueLength() > 2)
+ {
+ retVal = LINK_KEY_CODE_EMPTY;
+ }
+ else
+ {
+ retVal = LINK_KEY_CODE_UNK_4;
+ ScriptContext2_Disable();
+ SetKeyInterceptCallback(sub_8057D98);
+ }
+ return retVal;
+}
+
+u16 KeyInterCB_DoNothingAndKeepAlive(u32 key)
+{
+ CheckRfuKeepAliveTimer();
+ return LINK_KEY_CODE_EMPTY;
+}
+
+u16 sub_8057E1C(u32 keyOrPlayerId)
+{
+ if (sPlayerTradingStates[keyOrPlayerId] == PLAYER_TRADING_STATE_UNK_2)
+ {
+ if (JOY_NEW(B_BUTTON))
+ {
+ SetKeyInterceptCallback(KeyInterCB_DoNothingAndKeepAlive);
+ return LINK_KEY_CODE_UNK_7;
+ }
+ else
+ {
+ return LINK_KEY_CODE_EMPTY;
+ }
+ }
+ else
+ {
+ CheckRfuKeepAliveTimer();
+ return LINK_KEY_CODE_EMPTY;
+ }
+}
+
+u16 sub_8057E58(u32 a1)
+{
+ SetKeyInterceptCallback(sub_8057E1C);
+ return LINK_KEY_CODE_UNK_2;
+}
+
+u16 KeyInterCB_SendNothing(u32 key)
+{
+ return LINK_KEY_CODE_EMPTY;
+}
+
+u16 KeyInterCB_WaitForPlayersToExit(u32 keyOrPlayerId)
+{
+ // keyOrPlayerId could be any keycode. This callback does no sanity checking
+ // on the size of the key. It's assuming that it is being called from
+ // CB1_UpdateLinkState.
+ if (sPlayerTradingStates[keyOrPlayerId] != PLAYER_TRADING_STATE_EXITING_ROOM)
+ CheckRfuKeepAliveTimer();
+ if (AreAllPlayersInTradingState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE)
+ {
+ ScriptContext1_SetupScript(CableClub_EventScript_DoLinkRoomExit);
+ SetKeyInterceptCallback(KeyInterCB_SendNothing);
+ }
+ return LINK_KEY_CODE_EMPTY;
+}
+
+u16 KeyInterCB_SendExitRoomKey(u32 key)
+{
+ SetKeyInterceptCallback(KeyInterCB_WaitForPlayersToExit);
+ return LINK_KEY_CODE_EXIT_ROOM;
+}
+
+// Duplicate function.
+u16 KeyInterCB_SendNothing_2(u32 key)
+{
+ return LINK_KEY_CODE_EMPTY;
+}
+
+u32 sub_8057EC0(void)
+{
+ if (IsAnyPlayerInTradingState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE)
+ return 2;
+ if (sPlayerKeyInterceptCallback == sub_8057E1C && sPlayerTradingStates[gLocalLinkPlayerId] != PLAYER_TRADING_STATE_UNK_2)
+ return 0;
+ if (sPlayerKeyInterceptCallback == KeyInterCB_DoNothingAndKeepAlive && sPlayerTradingStates[gLocalLinkPlayerId] == PLAYER_TRADING_STATE_BUSY)
+ return 2;
+ if (AreAllPlayersInTradingState(PLAYER_TRADING_STATE_UNK_2) != FALSE)
+ return 1;
+ return 0;
+}
+
+bool32 sub_8057F28(void)
+{
+ return IsAnyPlayerInTradingState(PLAYER_TRADING_STATE_EXITING_ROOM);
+}
+
+u16 sub_8057F34(void)
+{
+ SetKeyInterceptCallback(sub_8057E58);
+ return 0;
+}
+
+u16 sub_8057F48(void)
+{
+ SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
+ return 0;
+}
+
+// The exit room key will be sent at the next opportunity.
+// The return value is meaningless.
+u16 QueueExitLinkRoomKey(void)
+{
+ SetKeyInterceptCallback(KeyInterCB_SendExitRoomKey);
+ return 0;
+}
+
+u16 sub_8057F70(void)
+{
+ SetKeyInterceptCallback(KeyInterCB_SendNothing_2);
+ return 0;
+}
+
+void LoadTradeRoomPlayer(s32 linkPlayerId, s32 myPlayerId, struct TradeRoomPlayer *trainer)
+{
+ s16 x, y;
+
+ trainer->playerId = linkPlayerId;
+ trainer->isLocalPlayer = (linkPlayerId == myPlayerId) ? 1 : 0;
+ trainer->c = gLinkPlayerObjectEvents[linkPlayerId].movementMode;
+ trainer->facing = GetLinkPlayerFacingDirection(linkPlayerId);
+ GetLinkPlayerCoords(linkPlayerId, &x, &y);
+ trainer->pos.x = x;
+ trainer->pos.y = y;
+ trainer->pos.height = GetLinkPlayerElevation(linkPlayerId);
+ trainer->field_C = MapGridGetMetatileBehaviorAt(x, y);
+}
+
+bool32 sub_8057FEC(struct TradeRoomPlayer *player)
+{
+ u8 v1 = player->c;
+ if (v1 == MOVEMENT_MODE_SCRIPTED || v1 == MOVEMENT_MODE_FREE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+// Duplicate function.
+bool32 sub_8058004(struct TradeRoomPlayer *player)
+{
+ u8 v1 = player->c;
+ if (v1 == MOVEMENT_MODE_SCRIPTED || v1 == MOVEMENT_MODE_FREE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+const u8 *TryGetTileEventScript(struct TradeRoomPlayer *player)
+{
+ if (player->c != MOVEMENT_MODE_SCRIPTED)
+ return FACING_NONE;
+ return GetCoordEventScriptAtMapPosition(&player->pos);
+}
+
+bool32 PlayerIsAtSouthExit(struct TradeRoomPlayer *player)
+{
+ if (player->c != MOVEMENT_MODE_SCRIPTED && player->c != MOVEMENT_MODE_FREE)
+ return FALSE;
+ else if (!MetatileBehavior_IsSouthArrowWarp(player->field_C))
+ return FALSE;
+ else if (player->facing != DIR_SOUTH)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *player)
+{
+ struct MapPosition otherPlayerPos;
+ u8 linkPlayerId;
+
+ if (player->c != MOVEMENT_MODE_FREE && player->c != MOVEMENT_MODE_SCRIPTED)
+ return FACING_NONE;
+
+ otherPlayerPos = player->pos;
+ otherPlayerPos.x += gDirectionToVectors[player->facing].x;
+ otherPlayerPos.y += gDirectionToVectors[player->facing].y;
+ otherPlayerPos.height = 0;
+ linkPlayerId = GetLinkPlayerIdAt(otherPlayerPos.x, otherPlayerPos.y);
+
+ if (linkPlayerId != 4)
+ {
+ if (!player->isLocalPlayer)
+ return CableClub_EventScript_TooBusyToNotice;
+ else if (sPlayerTradingStates[linkPlayerId] != PLAYER_TRADING_STATE_IDLE)
+ return CableClub_EventScript_TooBusyToNotice;
+ else if (!GetSeeingLinkPlayerCardMsg(linkPlayerId))
+ return CableClub_EventScript_ReadTrainerCard;
+ else
+ return CableClub_EventScript_ReadTrainerCardColored;
+ }
+
+ return GetInteractedLinkPlayerScript(&otherPlayerPos, player->field_C, player->facing);
+}
+
+// This returns which direction to force the player to look when one of
+// these event scripts runs.
+u16 GetDirectionForEventScript(const u8 *script)
+{
+ if (script == BattleColosseum_4P_EventScript_PlayerSpot0)
+ return FACING_FORCED_RIGHT;
+ else if (script == BattleColosseum_4P_EventScript_PlayerSpot1)
+ return FACING_FORCED_LEFT;
+ else if (script == BattleColosseum_4P_EventScript_PlayerSpot2)
+ return FACING_FORCED_RIGHT;
+ else if (script == BattleColosseum_4P_EventScript_PlayerSpot3)
+ return FACING_FORCED_LEFT;
+ else if (script == RecordCenter_EventScript_Spot0)
+ return FACING_FORCED_RIGHT;
+ else if (script == RecordCenter_EventScript_Spot1)
+ return FACING_FORCED_LEFT;
+ else if (script == RecordCenter_EventScript_Spot2)
+ return FACING_FORCED_RIGHT;
+ else if (script == RecordCenter_EventScript_Spot3)
+ return FACING_FORCED_LEFT;
+ else if (script == BattleColosseum_2P_EventScript_PlayerSpot0)
+ return FACING_FORCED_RIGHT;
+ else if (script == BattleColosseum_2P_EventScript_PlayerSpot1)
+ return FACING_FORCED_LEFT;
+ else if (script == TradeCenter_EventScript_Chair0)
+ return FACING_FORCED_RIGHT;
+ else if (script == TradeCenter_EventScript_Chair1)
+ return FACING_FORCED_LEFT;
+ else
+ return FACING_NONE;
+}
+
+void sub_80581BC(void)
+{
+ ScriptContext2_Enable();
+}
+
+void InitLinkRoomStartMenuScript(void)
+{
+ PlaySE(SE_WIN_OPEN);
+ ShowStartMenu();
+ ScriptContext2_Enable();
+}
+
+void sub_80581DC(const u8 *script)
+{
+ PlaySE(SE_SELECT);
+ ScriptContext1_SetupScript(script);
+ ScriptContext2_Enable();
+}
+
+void CreateConfirmLeaveTradeRoomPrompt(void)
+{
+ PlaySE(SE_WIN_OPEN);
+ ScriptContext1_SetupScript(TradeCenter_ConfirmLeaveRoom);
+ ScriptContext2_Enable();
+}
+
+void InitMenuBasedScript(const u8 *script)
+{
+ PlaySE(SE_SELECT);
+ ScriptContext1_SetupScript(script);
+ ScriptContext2_Enable();
+}
+
+void sub_8058230(void)
+{
+ ScriptContext1_SetupScript(TradeCenter_TerminateLink);
+ ScriptContext2_Enable();
+}
+
+bool32 sub_8058244(void)
+{
+ if (!IsUpdateLinkStateCBActive())
+ return FALSE;
+ if (GetLinkRecvQueueLength() >= 3)
+ gUnknown_3000E88 = TRUE;
+ else
+ gUnknown_3000E88 = FALSE;
+ return gUnknown_3000E88;
+}
+
+bool32 sub_8058274(void)
+{
+ u8 temp;
+
+ if (GetLinkRecvQueueLength() < 2)
+ return FALSE;
+ else if (IsUpdateLinkStateCBActive() != TRUE)
+ return FALSE;
+ else if (IsSendingKeysToLink() != TRUE)
+ return FALSE;
+ else if (sPlayerKeyInterceptCallback == KeyInterCB_DeferToRecvQueue)
+ return TRUE;
+ else if (sPlayerKeyInterceptCallback != KeyInterCB_DeferToEventScript)
+ return FALSE;
+
+ temp = gUnknown_3000E88;
+ gUnknown_3000E88 = FALSE;
+
+ if (temp == TRUE)
+ return TRUE;
+ else if (gPaletteFade.active && gPaletteFade.softwareFadeFinishing)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool32 sub_80582E0(void)
+{
+ if (GetLinkSendQueueLength() < 2)
+ return FALSE;
+ else if (IsUpdateLinkStateCBActive() != TRUE)
+ return FALSE;
+ else if (IsSendingKeysToLink() != TRUE)
+ return FALSE;
+ else if (sPlayerKeyInterceptCallback == KeyInterCB_DeferToSendQueue)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool32 sub_8058318(void)
+{
+ if (gWirelessCommType != 0)
+ return FALSE;
+ else if (!IsSendingKeysToLink())
+ return FALSE;
+ else
+ return TRUE;
+}
+
+u32 GetLinkSendQueueLength(void)
+{
+ if (gWirelessCommType != 0)
+ return Rfu.sendQueue.count;
+ else
+ return gLink.sendQueue.count;
+}
+
+void ZeroLinkPlayerObjectEvent(struct LinkPlayerObjectEvent *linkPlayerObjEvent)
+{
+ memset(linkPlayerObjEvent, 0, sizeof(struct LinkPlayerObjectEvent));
+}
+
+void ClearLinkPlayerObjectEvents(void)
+{
+ memset(gLinkPlayerObjectEvents, 0, sizeof(gLinkPlayerObjectEvents));
+}
+
+void ZeroObjectEvent(struct ObjectEvent *objEvent)
+{
+ memset(objEvent, 0, sizeof(struct ObjectEvent));
+}
+
+void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 a4)
+{
+ u8 objEventId = GetFirstInactiveObjectEventId();
+ struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+
+ ZeroLinkPlayerObjectEvent(linkPlayerObjEvent);
+ ZeroObjectEvent(objEvent);
+
+ linkPlayerObjEvent->active = 1;
+ linkPlayerObjEvent->linkPlayerId = linkPlayerId;
+ linkPlayerObjEvent->objEventId = objEventId;
+ linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE;
+
+ objEvent->active = 1;
+ objEvent->singleMovementActive = a4;
+ objEvent->range.as_byte = 2;
+ objEvent->spriteId = 64;
+
+ InitLinkPlayerObjectEventPos(objEvent, x, y);
+}
+
+void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y)
+{
+ objEvent->currentCoords.x = x;
+ objEvent->currentCoords.y = y;
+ objEvent->previousCoords.x = x;
+ objEvent->previousCoords.y = y;
+ SetSpritePosToMapCoords(x, y, &objEvent->initialCoords.x, &objEvent->initialCoords.y);
+ objEvent->initialCoords.x += 8;
+ ObjectEventUpdateZCoord(objEvent);
+}
+
+void sub_8058488(u8 linkPlayerId, u8 a2)
+{
+ if (gLinkPlayerObjectEvents[linkPlayerId].active)
+ {
+ u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+ objEvent->range.as_byte = a2;
+ }
+}
+
+void sub_80584B8(u8 linkPlayerId)
+{
+ struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
+ u8 objEventId = linkPlayerObjEvent->objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+ if (objEvent->spriteId != MAX_SPRITES)
+ DestroySprite(&gSprites[objEvent->spriteId]);
+ linkPlayerObjEvent->active = 0;
+ objEvent->active = 0;
+}
+
+// Returns the spriteId corresponding to this player.
+u8 GetSpriteForLinkedPlayer(u8 linkPlayerId)
+{
+ u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+ return objEvent->spriteId;
+}
+
+void GetLinkPlayerCoords(u8 linkPlayerId, u16 *x, u16 *y)
+{
+ u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+ *x = objEvent->currentCoords.x;
+ *y = objEvent->currentCoords.y;
+}
+
+u8 GetLinkPlayerFacingDirection(u8 linkPlayerId)
+{
+ u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+ return objEvent->range.as_byte;
+}
+
+u8 GetLinkPlayerElevation(u8 linkPlayerId)
+{
+ u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+ return objEvent->currentElevation;
+}
+
+s32 sub_8058590(u8 linkPlayerId)
+{
+ u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+ return 16 - (s8)objEvent->directionSequenceIndex;
+}
+
+u8 GetLinkPlayerIdAt(s16 x, s16 y)
+{
+ u8 i;
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ if (gLinkPlayerObjectEvents[i].active
+ && (gLinkPlayerObjectEvents[i].movementMode == 0 || gLinkPlayerObjectEvents[i].movementMode == 2))
+ {
+ struct ObjectEvent *objEvent = &gObjectEvents[gLinkPlayerObjectEvents[i].objEventId];
+ if (objEvent->currentCoords.x == x && objEvent->currentCoords.y == y)
+ return i;
+ }
+ }
+ return 4;
+}
+
+void SetPlayerFacingDirection(u8 linkPlayerId, u8 facing)
+{
+ struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
+ u8 objEventId = linkPlayerObjEvent->objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+
+ if (linkPlayerObjEvent->active)
+ {
+ if (facing > FACING_FORCED_RIGHT)
+ {
+ objEvent->triggerGroundEffectsOnMove = 1;
+ }
+ else
+ {
+ // This is a hack to split this code onto two separate lines, without declaring a local variable.
+ // C++ style inline variables would be nice here.
+#define TEMP gLinkPlayerMovementModes[linkPlayerObjEvent->movementMode](linkPlayerObjEvent, objEvent, facing)
+
+ gMovementStatusHandler[TEMP](linkPlayerObjEvent, objEvent);
+
+ // Clean up the hack.
+#undef TEMP
+ }
+ }
+}
+
+u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
+{
+ return gLinkPlayerFacingHandlers[a3](linkPlayerObjEvent, objEvent, a3);
+}
+
+u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
+{
+ return FACING_UP;
+}
+
+// Duplicate Function
+u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
+{
+ return gLinkPlayerFacingHandlers[a3](linkPlayerObjEvent, objEvent, a3);
+}
+
+bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
+{
+ return FALSE;
+}
+
+bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
+{
+ s16 x, y;
+
+ objEvent->range.as_byte = FlipVerticalAndClearForced(a3, objEvent->range.as_byte);
+ ObjectEventMoveDestCoords(objEvent, objEvent->range.as_byte, &x, &y);
+
+ if (LinkPlayerDetectCollision(linkPlayerObjEvent->objEventId, objEvent->range.as_byte, x, y))
+ {
+ return FALSE;
+ }
+ else
+ {
+ objEvent->directionSequenceIndex = 16;
+ ShiftObjectEventCoords(objEvent, x, y);
+ ObjectEventUpdateZCoord(objEvent);
+ return TRUE;
+ }
+}
+
+bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
+{
+ objEvent->range.as_byte = FlipVerticalAndClearForced(a3, objEvent->range.as_byte);
+ return FALSE;
+}
+
+// This is called every time a free movement happens. Most of the time it's a No-Op.
+void MovementStatusHandler_EnterFreeMode(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent)
+{
+ linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE;
+}
+
+void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent)
+{
+ objEvent->directionSequenceIndex--;
+ linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FROZEN;
+ MoveCoords(objEvent->range.as_byte, &objEvent->initialCoords.x, &objEvent->initialCoords.y);
+ if (!objEvent->directionSequenceIndex)
+ {
+ ShiftStillObjectEventCoords(objEvent);
+ linkPlayerObjEvent->movementMode = MOVEMENT_MODE_SCRIPTED;
+ }
+}
+
+// Flip Up/Down facing codes. If newFacing doesn't specify a direction, default
+// to oldFacing. Note that this clears also the "FORCED" part of the facing code,
+// even for Left/Right codes.
+u8 FlipVerticalAndClearForced(u8 newFacing, u8 oldFacing)
+{
+ switch (newFacing)
+ {
+ case FACING_UP:
+ case FACING_FORCED_UP:
+ return DIR_NORTH;
+ case FACING_DOWN:
+ case FACING_FORCED_DOWN:
+ return DIR_SOUTH;
+ case FACING_LEFT:
+ case FACING_FORCED_LEFT:
+ return DIR_WEST;
+ case FACING_RIGHT:
+ case FACING_FORCED_RIGHT:
+ return DIR_EAST;
+ }
+ return oldFacing;
+}
+
+u8 LinkPlayerDetectCollision(u8 selfObjEventId, u8 a2, s16 x, s16 y)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ {
+ if (i != selfObjEventId)
+ {
+ if ((gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y)
+ || (gObjectEvents[i].previousCoords.x == x && gObjectEvents[i].previousCoords.y == y))
+ {
+ return 1;
+ }
+ }
+ }
+ return MapGridIsImpassableAt(x, y);
+}
+
+void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion)
+{
+ struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
+ u8 objEventId = linkPlayerObjEvent->objEventId;
+ struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
+ struct Sprite *sprite;
+
+ if (linkPlayerObjEvent->active)
+ {
+ if (gameVersion == VERSION_FIRE_RED || gameVersion == VERSION_LEAF_GREEN)
+ {
+ objEvent->spriteId = AddPseudoObjectEvent(
+ GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, objEvent->singleMovementActive),
+ SpriteCB_LinkPlayer, 0, 0, 0);
+ }
+ else
+ {
+ objEvent->spriteId = AddPseudoObjectEvent(GetRSAvatarGraphicsIdByGender(objEvent->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0);
+ }
+
+ sprite = &gSprites[objEvent->spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[0] = linkPlayerId;
+ objEvent->triggerGroundEffectsOnMove = 0;
+ }
+}
+
+void SpriteCB_LinkPlayer(struct Sprite *sprite)
+{
+ struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[sprite->data[0]];
+ struct ObjectEvent *objEvent = &gObjectEvents[linkPlayerObjEvent->objEventId];
+ sprite->pos1.x = objEvent->initialCoords.x;
+ sprite->pos1.y = objEvent->initialCoords.y;
+ SetObjectSubpriorityByZCoord(objEvent->previousElevation, sprite, 1);
+ sprite->oam.priority = ZCoordToPriority(objEvent->previousElevation);
+
+ if (!linkPlayerObjEvent->movementMode != MOVEMENT_MODE_FREE)
+ StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objEvent->range.as_byte));
+ else
+ StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(objEvent->range.as_byte));
+
+ UpdateObjectEventSpriteVisibility(sprite, 0);
+ if (objEvent->triggerGroundEffectsOnMove)
+ {
+ sprite->invisible = ((sprite->data[7] & 4) >> 2);
+ sprite->data[7]++;
+ }
+}
diff --git a/src/pokemon_jump_2.c b/src/pokemon_jump_2.c
index aa1238e3f..9f2f9e404 100644
--- a/src/pokemon_jump_2.c
+++ b/src/pokemon_jump_2.c
@@ -1883,7 +1883,7 @@ static int sub_81497A8(void)
static bool32 sub_8149804(void)
{
- return !Rfu.unk_124.count && !Rfu.unk_9e8.count;
+ return !Rfu.unk_124.count && !Rfu.sendQueue.count;
}
static int sub_8149834(u8 *arg0)
diff --git a/sym_bss.txt b/sym_bss.txt
index 321e0a2b8..3c3e98c58 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -20,21 +20,8 @@
.include "src/trade.o"
.align 2
.include "src/play_time.o"
-
- .align 2
- @ .include "src/overworld.o"
-gUnknown_3000E80: @ 3000E80
- .space 0x4
-
-gUnknown_3000E84: @ 3000E84
- .space 0x4
-
-gUnknown_3000E88: @ 3000E88
- .space 0x1
-
-gUnknown_3000E89: @ 3000E89
- .space 0x7
-
+ .align 2
+ .include "src/overworld.o"
.align 3
.include "src/field_camera.o"
.align 3