diff options
author | PikalaxALT <PikalaxALT@gmail.com> | 2020-03-28 21:39:28 -0400 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2020-03-28 21:39:28 -0400 |
commit | 0f618efb15b2ca6248d73c979fab7df248563e5a (patch) | |
tree | 581d1a5c7be1ab204439a390ff19ca231f0d2b6e | |
parent | 781aa8949c1e7ea0b1ac2c7fa3ae36226e98c289 (diff) |
Finish overworld.c
-rw-r--r-- | asm/overworld.s | 2382 | ||||
-rw-r--r-- | data/maps/RecordCenter/map.json | 8 | ||||
-rw-r--r-- | data/overworld.s | 29 | ||||
-rw-r--r-- | data/scripts/cable_club.inc | 6 | ||||
-rw-r--r-- | include/cable_club.h | 1 | ||||
-rw-r--r-- | include/event_scripts.h | 18 | ||||
-rw-r--r-- | include/field_player_avatar.h | 1 | ||||
-rw-r--r-- | include/link.h | 2 | ||||
-rw-r--r-- | include/link_rfu.h | 10 | ||||
-rw-r--r-- | include/overworld.h | 10 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/cable_club.c | 2 | ||||
-rw-r--r-- | src/field_player_avatar.c | 2 | ||||
-rw-r--r-- | src/link_rfu_2.c | 14 | ||||
-rw-r--r-- | src/link_rfu_3.c | 6 | ||||
-rw-r--r-- | src/overworld.c | 1094 | ||||
-rw-r--r-- | src/pokemon_jump_2.c | 2 | ||||
-rw-r--r-- | sym_bss.txt | 17 |
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 |