summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/link_rfu_3.s2
-rw-r--r--asm/link_rfu_4.s1034
-rw-r--r--data/link_rfu_4.s4
-rw-r--r--include/link_rfu.h4
-rw-r--r--src/link_rfu_4.c334
-rw-r--r--sym_ewram.txt5
6 files changed, 342 insertions, 1041 deletions
diff --git a/asm/link_rfu_3.s b/asm/link_rfu_3.s
index 1bd5420fa..e054a98ad 100644
--- a/asm/link_rfu_3.s
+++ b/asm/link_rfu_3.s
@@ -3544,7 +3544,7 @@ _081175E4:
.4byte _0811761C
.4byte _0811761C
_0811761C:
- bl sub_80FD1A0
+ bl RecordMixTrainerNames
_08117620:
ldr r0, _08117638 @ =gUnknown_203B058
ldrb r0, [r0]
diff --git a/asm/link_rfu_4.s b/asm/link_rfu_4.s
index ab67ce135..d4a41d2b3 100644
--- a/asm/link_rfu_4.s
+++ b/asm/link_rfu_4.s
@@ -5,1038 +5,6 @@
.text
- thumb_func_start sub_80FCB54
-sub_80FCB54: @ 80FCB54
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- adds r7, r0, 0
- lsls r1, 24
- lsrs r1, 24
- mov r9, r1
- movs r4, 0
- ldr r0, _080FCC30 @ =gSaveBlock2Ptr
- mov r8, r0
- adds r6, r7, 0x2
- ldr r0, [r0]
- adds r5, r0, 0
- adds r5, 0xA
-_080FCB72:
- adds r0, r6, r4
- adds r1, r5, r4
- ldrb r1, [r1]
- strb r1, [r0]
- adds r4, 0x1
- cmp r4, 0x1
- ble _080FCB72
- movs r4, 0
- lsls r2, 7
- mov r12, r2
- adds r1, r7, 0x4
-_080FCB88:
- adds r0, r1, r4
- strb r3, [r0]
- asrs r3, 8
- adds r4, 0x1
- cmp r4, 0x3
- ble _080FCB88
- mov r1, r8
- ldr r0, [r1]
- ldrb r0, [r0, 0x8]
- movs r6, 0x1
- movs r1, 0x1
- ands r1, r0
- ldrb r2, [r7, 0xB]
- movs r5, 0x2
- negs r5, r5
- adds r0, r5, 0
- ands r0, r2
- orrs r0, r1
- strb r0, [r7, 0xB]
- movs r4, 0x7F
- mov r1, r9
- ands r1, r4
- ldrb r2, [r7, 0xA]
- movs r0, 0x80
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- ands r0, r4
- mov r1, r12
- orrs r0, r1
- strb r0, [r7, 0xA]
- ldrb r0, [r7]
- movs r1, 0x10
- negs r1, r1
- ands r1, r0
- movs r0, 0x2
- orrs r1, r0
- ldrb r2, [r7, 0x1]
- movs r0, 0x3D
- negs r0, r0
- ands r0, r2
- .ifdef FIRERED
- movs r2, 0x10 @ VERSION_FIRE_RED << 2
- .else
- .ifdef LEAFGREEN
- movs r2, 0x14 @ VERSION_LEAF_GREEN << 2
- .endif
- .endif
- orrs r0, r2
- strb r0, [r7, 0x1]
- movs r0, 0x11
- negs r0, r0
- ands r1, r0
- subs r0, 0x10
- ands r1, r0
- subs r0, 0x20
- ands r1, r0
- strb r1, [r7]
- ldr r0, _080FCC34 @ =0x00000844
- bl FlagGet
- lsls r0, 7
- ldrb r1, [r7]
- ands r4, r1
- orrs r4, r0
- strb r4, [r7]
- bl IsNationalPokedexEnabled
- ands r0, r6
- ldrb r1, [r7, 0x1]
- ands r5, r1
- orrs r5, r0
- strb r5, [r7, 0x1]
- ldr r0, _080FCC38 @ =0x0000082c
- bl FlagGet
- ands r6, r0
- lsls r6, 1
- ldrb r1, [r7, 0x1]
- movs r0, 0x3
- negs r0, r0
- ands r0, r1
- orrs r0, r6
- strb r0, [r7, 0x1]
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080FCC30: .4byte gSaveBlock2Ptr
-_080FCC34: .4byte 0x00000844
-_080FCC38: .4byte 0x0000082c
- thumb_func_end sub_80FCB54
-
- thumb_func_start sub_80FCC3C
-sub_80FCC3C: @ 80FCC3C
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- adds r7, r0, 0
- mov r8, r1
- lsls r2, 24
- lsrs r5, r2, 24
- ldr r0, _080FCC90 @ =gUnknown_3005E10
- ldrb r0, [r0, 0x6]
- cmp r0, 0x1
- bne _080FCC98
- movs r0, 0x1
- mov r9, r0
- ldr r6, _080FCC94 @ =gRfuLinkStatus
- ldr r0, [r6]
- lsls r4, r5, 5
- adds r0, r4
- ldrh r0, [r0, 0x18]
- bl sub_80FA44C
- cmp r0, 0
- beq _080FCC78
- ldr r1, [r6]
- ldrb r0, [r1, 0x7]
- asrs r0, r5
- mov r2, r9
- ands r0, r2
- cmp r0, 0
- bne _080FCCB0
-_080FCC78:
- adds r0, r7, 0
- movs r1, 0
- movs r2, 0xD
- bl memset
- mov r0, r8
- movs r1, 0
- movs r2, 0x8
- bl memset
- b _080FCCE4
- .align 2, 0
-_080FCC90: .4byte gUnknown_3005E10
-_080FCC94: .4byte gRfuLinkStatus
-_080FCC98:
- movs r0, 0
- mov r9, r0
- ldr r6, _080FCCCC @ =gRfuLinkStatus
- ldr r0, [r6]
- lsls r4, r5, 5
- adds r0, r4
- ldrh r0, [r0, 0x18]
- bl sub_80FA44C
- cmp r0, 0
- beq _080FCCD0
- ldr r1, [r6]
-_080FCCB0:
- adds r1, r4, r1
- adds r1, 0x1A
- adds r0, r7, 0
- movs r2, 0xD
- bl memcpy
- ldr r1, [r6]
- adds r1, r4, r1
- adds r1, 0x29
- mov r0, r8
- movs r2, 0x8
- bl memcpy
- b _080FCCE4
- .align 2, 0
-_080FCCCC: .4byte gRfuLinkStatus
-_080FCCD0:
- adds r0, r7, 0
- movs r1, 0
- movs r2, 0xD
- bl memset
- mov r0, r8
- movs r1, 0
- movs r2, 0x8
- bl memset
-_080FCCE4:
- mov r0, r9
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80FCC3C
-
- thumb_func_start sub_80FCCF4
-sub_80FCCF4: @ 80FCCF4
- push {r4-r7,lr}
- adds r3, r0, 0
- adds r5, r1, 0
- lsls r2, 24
- movs r7, 0
- ldr r6, _080FCD2C @ =gRfuLinkStatus
- ldr r0, [r6]
- lsrs r4, r2, 19
- adds r2, r0, r4
- ldrh r1, [r2, 0x18]
- ldr r0, _080FCD30 @ =0x00007f7d
- cmp r1, r0
- bne _080FCD34
- adds r1, r2, 0
- adds r1, 0x1A
- adds r0, r3, 0
- movs r2, 0xD
- bl memcpy
- ldr r1, [r6]
- adds r1, r4, r1
- adds r1, 0x29
- adds r0, r5, 0
- movs r2, 0x8
- bl memcpy
- movs r7, 0x1
- b _080FCD48
- .align 2, 0
-_080FCD2C: .4byte gRfuLinkStatus
-_080FCD30: .4byte 0x00007f7d
-_080FCD34:
- adds r0, r3, 0
- movs r1, 0
- movs r2, 0xD
- bl memset
- adds r0, r5, 0
- movs r1, 0
- movs r2, 0x8
- bl memset
-_080FCD48:
- adds r0, r7, 0
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80FCCF4
-
- thumb_func_start sub_80FCD50
-sub_80FCD50: @ 80FCD50
- push {r4,lr}
- adds r4, r1, 0
- ldr r1, _080FCD6C @ =gUnknown_3005440
- movs r2, 0xD
- bl memcpy
- ldr r1, _080FCD70 @ =gUnknown_3005E00
- adds r0, r4, 0
- movs r2, 0x8
- bl memcpy
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080FCD6C: .4byte gUnknown_3005440
-_080FCD70: .4byte gUnknown_3005E00
- thumb_func_end sub_80FCD50
-
- thumb_func_start CreateWirelessStatusIndicatorSprite
-CreateWirelessStatusIndicatorSprite: @ 80FCD74
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r3, r0, 24
- lsls r1, 24
- lsrs r2, r1, 24
- cmp r3, 0
- bne _080FCD8A
- cmp r2, 0
- bne _080FCD8A
- movs r3, 0xE7
- movs r2, 0x8
-_080FCD8A:
- ldr r0, _080FCDCC @ =gRfuLinkStatus
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _080FCDE4
- ldr r0, _080FCDD0 @ =sWirelessStatusIndicatorSpriteTemplate
- adds r1, r3, 0
- movs r3, 0
- bl CreateSprite
- adds r5, r0, 0
- lsls r5, 24
- lsrs r5, 24
- ldr r0, _080FCDD4 @ =gSprites
- lsls r4, r5, 4
- adds r4, r5
- lsls r4, 2
- adds r4, r0
- ldr r0, _080FCDD8 @ =0x00001234
- strh r0, [r4, 0x3C]
- ldr r0, _080FCDDC @ =sWirelessStatusIndicatorSpriteSheet
- ldrh r0, [r0, 0x6]
- bl GetSpriteTileStartByTag
- strh r0, [r4, 0x3A]
- adds r4, 0x3E
- ldrb r0, [r4]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r4]
- ldr r0, _080FCDE0 @ =gUnknown_203ACE4
- strb r5, [r0]
- b _080FCE2A
- .align 2, 0
-_080FCDCC: .4byte gRfuLinkStatus
-_080FCDD0: .4byte sWirelessStatusIndicatorSpriteTemplate
-_080FCDD4: .4byte gSprites
-_080FCDD8: .4byte 0x00001234
-_080FCDDC: .4byte sWirelessStatusIndicatorSpriteSheet
-_080FCDE0: .4byte gUnknown_203ACE4
-_080FCDE4:
- ldr r0, _080FCE30 @ =sWirelessStatusIndicatorSpriteTemplate
- adds r1, r3, 0
- movs r3, 0
- bl CreateSprite
- ldr r4, _080FCE34 @ =gUnknown_203ACE4
- strb r0, [r4]
- ldr r5, _080FCE38 @ =gSprites
- ldrb r1, [r4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r5
- ldr r1, _080FCE3C @ =0x00001234
- strh r1, [r0, 0x3C]
- ldr r0, _080FCE40 @ =sWirelessStatusIndicatorSpriteSheet
- ldrh r0, [r0, 0x6]
- bl GetSpriteTileStartByTag
- ldrb r2, [r4]
- lsls r1, r2, 4
- adds r1, r2
- lsls r1, 2
- adds r1, r5
- strh r0, [r1, 0x3A]
- ldrb r1, [r4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r5
- adds r0, 0x3E
- ldrb r1, [r0]
- movs r2, 0x4
- orrs r1, r2
- strb r1, [r0]
-_080FCE2A:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080FCE30: .4byte sWirelessStatusIndicatorSpriteTemplate
-_080FCE34: .4byte gUnknown_203ACE4
-_080FCE38: .4byte gSprites
-_080FCE3C: .4byte 0x00001234
-_080FCE40: .4byte sWirelessStatusIndicatorSpriteSheet
- thumb_func_end CreateWirelessStatusIndicatorSprite
-
- thumb_func_start DestroyWirelessStatusIndicatorSprite
-DestroyWirelessStatusIndicatorSprite: @ 80FCE44
- push {r4,lr}
- ldr r4, _080FCE90 @ =gSprites
- ldr r3, _080FCE94 @ =gUnknown_203ACE4
- ldrb r1, [r3]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r2, r0, r4
- movs r0, 0x3C
- ldrsh r1, [r2, r0]
- ldr r0, _080FCE98 @ =0x00001234
- cmp r1, r0
- bne _080FCE8A
- movs r0, 0
- strh r0, [r2, 0x3C]
- ldrb r1, [r3]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- bl DestroySprite
- ldr r3, _080FCE9C @ =gMain
- movs r0, 0x84
- lsls r0, 3
- adds r3, r0
- ldr r0, _080FCEA0 @ =gDummyOamData
- ldr r1, [r0]
- ldr r2, [r0, 0x4]
- str r1, [r3]
- str r2, [r3, 0x4]
- ldr r1, _080FCEA4 @ =0x070003e8
- movs r2, 0x4
- bl CpuSet
-_080FCE8A:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080FCE90: .4byte gSprites
-_080FCE94: .4byte gUnknown_203ACE4
-_080FCE98: .4byte 0x00001234
-_080FCE9C: .4byte gMain
-_080FCEA0: .4byte gDummyOamData
-_080FCEA4: .4byte 0x070003e8
- thumb_func_end DestroyWirelessStatusIndicatorSprite
-
- thumb_func_start LoadWirelessStatusIndicatorSpriteGfx
-LoadWirelessStatusIndicatorSpriteGfx: @ 80FCEA8
- push {r4,lr}
- ldr r4, _080FCED4 @ =sWirelessStatusIndicatorSpriteSheet
- ldrh r0, [r4, 0x6]
- bl GetSpriteTileStartByTag
- lsls r0, 16
- ldr r1, _080FCED8 @ =0xffff0000
- cmp r0, r1
- bne _080FCEC0
- adds r0, r4, 0
- bl LoadCompressedSpriteSheet
-_080FCEC0:
- ldr r0, _080FCEDC @ =sWirelessStatusIndicatorSpritePalette
- bl LoadSpritePalette
- ldr r1, _080FCEE0 @ =gUnknown_203ACE4
- movs r0, 0xFF
- strb r0, [r1]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080FCED4: .4byte sWirelessStatusIndicatorSpriteSheet
-_080FCED8: .4byte 0xffff0000
-_080FCEDC: .4byte sWirelessStatusIndicatorSpritePalette
-_080FCEE0: .4byte gUnknown_203ACE4
- thumb_func_end LoadWirelessStatusIndicatorSpriteGfx
-
- thumb_func_start sub_80FCEE4
-sub_80FCEE4: @ 80FCEE4
- push {r4,lr}
- ldr r1, _080FCF04 @ =gRfuLinkStatus
- ldr r0, [r1]
- ldrb r2, [r0, 0x2]
- movs r3, 0
- movs r4, 0x1
-_080FCEF0:
- adds r0, r2, 0
- ands r0, r4
- cmp r0, 0
- beq _080FCF08
- ldr r0, [r1]
- adds r0, 0xA
- adds r0, r3
- ldrb r0, [r0]
- b _080FCF16
- .align 2, 0
-_080FCF04: .4byte gRfuLinkStatus
-_080FCF08:
- lsrs r2, 1
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x3
- bls _080FCEF0
- movs r0, 0
-_080FCF16:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80FCEE4
-
- thumb_func_start sub_80FCF1C
-sub_80FCF1C: @ 80FCF1C
- push {lr}
- adds r2, r0, 0
- movs r3, 0x32
- ldrsh r0, [r2, r3]
- cmp r0, r1
- beq _080FCF30
- movs r0, 0
- strh r1, [r2, 0x32]
- strh r0, [r2, 0x34]
- strh r0, [r2, 0x36]
-_080FCF30:
- pop {r0}
- bx r0
- thumb_func_end sub_80FCF1C
-
- thumb_func_start sub_80FCF34
-sub_80FCF34: @ 80FCF34
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- ldr r1, _080FCF78 @ =gUnknown_203ACE4
- ldrb r0, [r1]
- cmp r0, 0xFF
- bne _080FCF44
- b _080FD106
-_080FCF44:
- ldr r2, _080FCF7C @ =gSprites
- adds r1, r0, 0
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r2, r0, r2
- movs r0, 0x3C
- ldrsh r1, [r2, r0]
- ldr r0, _080FCF80 @ =0x00001234
- cmp r1, r0
- beq _080FCF5C
- b _080FD106
-_080FCF5C:
- adds r6, r2, 0
- movs r5, 0xFF
- movs r4, 0
- ldr r0, _080FCF84 @ =gRfuLinkStatus
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _080FCFB6
- adds r7, r6, 0
- adds r7, 0x28
- movs r1, 0x29
- adds r1, r6
- mov r8, r1
- b _080FCFA6
- .align 2, 0
-_080FCF78: .4byte gUnknown_203ACE4
-_080FCF7C: .4byte gSprites
-_080FCF80: .4byte 0x00001234
-_080FCF84: .4byte gRfuLinkStatus
-_080FCF88:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl sub_80FCADC
- lsls r0, 24
- lsrs r0, 24
- cmp r5, r0
- bcc _080FCFA6
- adds r0, r4, 0
- bl sub_80FCADC
- lsls r0, 24
- lsrs r5, r0, 24
-_080FCFA6:
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- subs r0, 0x1
- cmp r4, r0
- blt _080FCF88
- b _080FCFC8
-_080FCFB6:
- bl sub_80FCEE4
- lsls r0, 24
- lsrs r5, r0, 24
- adds r7, r6, 0
- adds r7, 0x28
- movs r2, 0x29
- adds r2, r6
- mov r8, r2
-_080FCFC8:
- bl sub_80FC1B0
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080FCFD8
- movs r0, 0x4
- b _080FD006
-_080FCFD8:
- cmp r5, 0x18
- bhi _080FCFE0
- movs r0, 0x3
- b _080FD006
-_080FCFE0:
- adds r0, r5, 0
- subs r0, 0x19
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x65
- bhi _080FCFF0
- movs r0, 0x2
- b _080FD006
-_080FCFF0:
- adds r0, r5, 0
- subs r0, 0x7F
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x65
- bhi _080FD000
- movs r0, 0x1
- b _080FD006
-_080FD000:
- cmp r5, 0xE4
- bls _080FD008
- movs r0, 0
-_080FD006:
- strh r0, [r6, 0x2E]
-_080FD008:
- movs r3, 0x2E
- ldrsh r1, [r6, r3]
- movs r2, 0x30
- ldrsh r0, [r6, r2]
- cmp r1, r0
- beq _080FD01E
- adds r0, r6, 0
- bl sub_80FCF1C
- ldrh r0, [r6, 0x2E]
- strh r0, [r6, 0x30]
-_080FD01E:
- movs r0, 0x32
- ldrsh r1, [r6, r0]
- ldr r2, [r6, 0x8]
- lsls r1, 2
- adds r1, r2
- movs r3, 0x36
- ldrsh r0, [r6, r3]
- ldr r1, [r1]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- lsls r0, 10
- lsrs r0, 26
- movs r3, 0x34
- ldrsh r1, [r6, r3]
- cmp r0, r1
- bge _080FD06C
- ldrh r0, [r6, 0x36]
- adds r0, 0x1
- movs r3, 0
- strh r0, [r6, 0x36]
- strh r3, [r6, 0x34]
- movs r1, 0x32
- ldrsh r0, [r6, r1]
- lsls r0, 2
- adds r0, r2
- movs r2, 0x36
- ldrsh r1, [r6, r2]
- ldr r0, [r0]
- lsls r1, 2
- adds r1, r0
- movs r0, 0
- ldrsh r1, [r1, r0]
- movs r0, 0x2
- negs r0, r0
- cmp r1, r0
- bne _080FD072
- strh r3, [r6, 0x36]
- b _080FD072
-_080FD06C:
- ldrh r0, [r6, 0x34]
- adds r0, 0x1
- strh r0, [r6, 0x34]
-_080FD072:
- ldr r4, _080FD110 @ =gMain
- movs r1, 0x84
- lsls r1, 3
- adds r0, r4, r1
- ldr r1, _080FD114 @ =sWirelessStatusIndicatorOamData
- ldr r2, [r1, 0x4]
- ldr r1, [r1]
- str r1, [r0]
- str r2, [r0, 0x4]
- movs r3, 0x20
- ldrsh r2, [r6, r3]
- movs r1, 0
- ldrsb r1, [r7, r1]
- adds r2, r1
- ldr r1, _080FD118 @ =0x00000422
- adds r5, r4, r1
- ldr r3, _080FD11C @ =0x000001ff
- adds r1, r3, 0
- ands r2, r1
- ldrh r3, [r5]
- ldr r1, _080FD120 @ =0xfffffe00
- ands r1, r3
- orrs r1, r2
- strh r1, [r5]
- ldrh r1, [r6, 0x22]
- mov r2, r8
- ldrb r2, [r2]
- adds r1, r2
- strb r1, [r0]
- ldrb r2, [r6, 0x5]
- ldr r3, _080FD124 @ =0x00000425
- adds r5, r4, r3
- lsrs r2, 4
- lsls r2, 4
- ldrb r3, [r5]
- movs r1, 0xF
- ands r1, r3
- orrs r1, r2
- strb r1, [r5]
- movs r1, 0x32
- ldrsh r2, [r6, r1]
- ldr r1, [r6, 0x8]
- lsls r2, 2
- adds r2, r1
- movs r3, 0x36
- ldrsh r1, [r6, r3]
- ldr r2, [r2]
- lsls r1, 2
- adds r1, r2
- ldrh r2, [r1]
- ldrh r6, [r6, 0x3A]
- adds r2, r6
- ldr r1, _080FD128 @ =0x00000424
- adds r4, r1
- ldr r3, _080FD12C @ =0x000003ff
- adds r1, r3, 0
- ands r2, r1
- ldrh r3, [r4]
- ldr r1, _080FD130 @ =0xfffffc00
- ands r1, r3
- orrs r1, r2
- strh r1, [r4]
- ldr r1, _080FD134 @ =0x070003e8
- movs r2, 0x4
- bl CpuSet
- bl sub_80FB9F4
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080FD106
- bl DestroyWirelessStatusIndicatorSprite
-_080FD106:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080FD110: .4byte gMain
-_080FD114: .4byte sWirelessStatusIndicatorOamData
-_080FD118: .4byte 0x00000422
-_080FD11C: .4byte 0x000001ff
-_080FD120: .4byte 0xfffffe00
-_080FD124: .4byte 0x00000425
-_080FD128: .4byte 0x00000424
-_080FD12C: .4byte 0x000003ff
-_080FD130: .4byte 0xfffffc00
-_080FD134: .4byte 0x070003e8
- thumb_func_end sub_80FCF34
-
- thumb_func_start sub_80FD138
-sub_80FD138: @ 80FD138
- push {r4,r5,lr}
- adds r4, r0, 0
- str r1, [r4]
- movs r3, 0
- ldrb r0, [r2]
- cmp r0, 0xFF
- beq _080FD15C
- adds r5, r4, 0x4
-_080FD148:
- adds r1, r5, r3
- ldrb r0, [r2]
- strb r0, [r1]
- adds r2, 0x1
- adds r3, 0x1
- cmp r3, 0x6
- bgt _080FD15C
- ldrb r0, [r2]
- cmp r0, 0xFF
- bne _080FD148
-_080FD15C:
- adds r0, r4, 0x4
- adds r0, r3
- movs r1, 0xFF
- strb r1, [r0]
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_80FD138
-
- thumb_func_start sub_80FD16C
-sub_80FD16C: @ 80FD16C
- push {lr}
- movs r2, 0
- movs r1, 0x7
-_080FD172:
- strb r2, [r0]
- adds r0, 0x1
- subs r1, 0x1
- cmp r1, 0
- bge _080FD172
- pop {r0}
- bx r0
- thumb_func_end sub_80FD16C
-
- thumb_func_start sub_80FD180
-sub_80FD180: @ 80FD180
- push {lr}
- adds r1, r0, 0
- movs r2, 0
-_080FD186:
- ldrb r0, [r1]
- adds r1, 0x1
- cmp r0, 0
- beq _080FD192
- movs r0, 0
- b _080FD19A
-_080FD192:
- adds r2, 0x1
- cmp r2, 0x7
- ble _080FD186
- movs r0, 0x1
-_080FD19A:
- pop {r1}
- bx r1
- thumb_func_end sub_80FD180
-
- thumb_func_start sub_80FD1A0
-sub_80FD1A0: @ 80FD1A0
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x20
- ldr r0, _080FD1C4 @ =gWirelessCommType
- ldrb r0, [r0]
- cmp r0, 0
- bne _080FD1B6
- b _080FD318
-_080FD1B6:
- movs r0, 0xF0
- bl AllocZeroed
- str r0, [sp, 0x14]
- movs r4, 0
- b _080FD22C
- .align 2, 0
-_080FD1C4: .4byte gWirelessCommType
-_080FD1C8:
- lsls r2, r4, 2
- mov r0, sp
- adds r1, r0, r2
- movs r0, 0x1
- negs r0, r0
- str r0, [r1]
- movs r5, 0
- mov r8, r2
- lsls r0, r4, 3
- adds r1, r4, 0x1
- mov r9, r1
- subs r0, r4
- lsls r0, 2
- str r0, [sp, 0x1C]
- ldr r2, _080FD24C @ =gLinkPlayers + 8
- mov r10, r2
- ldr r6, _080FD250 @ =0x00003ba8
- movs r4, 0
- mov r0, r10
- subs r0, 0x4
- ldr r7, [sp, 0x1C]
- adds r3, r7, r0
-_080FD1F4:
- ldrh r1, [r3]
- ldr r0, _080FD254 @ =gSaveBlock1Ptr
- ldr r2, [r0]
- ldr r7, _080FD250 @ =0x00003ba8
- adds r0, r2, r7
- adds r0, r4
- ldr r0, [r0]
- cmp r1, r0
- bne _080FD220
- adds r1, r2, r6
- adds r1, 0x4
- ldr r0, [sp, 0x1C]
- add r0, r10
- str r3, [sp, 0x18]
- bl StringCompare
- ldr r3, [sp, 0x18]
- cmp r0, 0
- bne _080FD220
- mov r0, sp
- add r0, r8
- str r5, [r0]
-_080FD220:
- adds r6, 0xC
- adds r4, 0xC
- adds r5, 0x1
- cmp r5, 0x13
- ble _080FD1F4
- mov r4, r9
-_080FD22C:
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- cmp r4, r0
- blt _080FD1C8
- movs r0, 0
- mov r8, r0
- movs r4, 0
- ldr r1, _080FD254 @ =gSaveBlock1Ptr
- mov r9, r1
- mov r7, sp
- movs r5, 0
- ldr r6, [sp, 0x14]
- b _080FD2A4
- .align 2, 0
-_080FD24C: .4byte gLinkPlayers + 8
-_080FD250: .4byte 0x00003ba8
-_080FD254: .4byte gSaveBlock1Ptr
-_080FD258:
- bl GetMultiplayerId
- lsls r0, 24
- lsrs r0, 24
- cmp r4, r0
- beq _080FD29E
- ldr r2, _080FD328 @ =gLinkPlayers
- adds r0, r5, r2
- ldrh r0, [r0, 0x1A]
- cmp r0, 0x1
- beq _080FD29E
- adds r0, r2, 0x4
- adds r0, r5, r0
- ldrh r1, [r0]
- adds r2, 0x8
- adds r2, r5, r2
- adds r0, r6, 0
- bl sub_80FD138
- ldr r1, [r7]
- cmp r1, 0
- blt _080FD298
- lsls r0, r1, 1
- adds r0, r1
- lsls r0, 2
- mov r2, r9
- ldr r1, [r2]
- adds r0, r1
- ldr r1, _080FD32C @ =0x00003bac
- adds r0, r1
- bl sub_80FD16C
-_080FD298:
- adds r6, 0xC
- movs r2, 0x1
- add r8, r2
-_080FD29E:
- adds r7, 0x4
- adds r5, 0x1C
- adds r4, 0x1
-_080FD2A4:
- bl GetLinkPlayerCount
- lsls r0, 24
- lsrs r0, 24
- cmp r4, r0
- blt _080FD258
- movs r4, 0
- ldr r7, _080FD330 @ =gSaveBlock1Ptr
- mov r9, r7
- ldr r6, _080FD334 @ =0x00003ba8
- movs r7, 0
- mov r1, r8
- lsls r0, r1, 1
- add r0, r8
- lsls r0, 2
- ldr r2, [sp, 0x14]
- adds r5, r0, r2
-_080FD2C6:
- mov r1, r9
- ldr r0, [r1]
- adds r0, r6
- adds r0, 0x4
- bl sub_80FD180
- cmp r0, 0
- bne _080FD2F8
- mov r0, r9
- ldr r2, [r0]
- ldr r1, _080FD334 @ =0x00003ba8
- adds r0, r2, r1
- adds r0, r7
- ldr r1, [r0]
- adds r2, r6
- adds r2, 0x4
- adds r0, r5, 0
- bl sub_80FD138
- adds r5, 0xC
- movs r2, 0x1
- add r8, r2
- mov r0, r8
- cmp r0, 0x13
- bgt _080FD302
-_080FD2F8:
- adds r6, 0xC
- adds r7, 0xC
- adds r4, 0x1
- cmp r4, 0x13
- ble _080FD2C6
-_080FD302:
- ldr r0, _080FD330 @ =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r1, _080FD334 @ =0x00003ba8
- adds r0, r1
- ldr r1, [sp, 0x14]
- movs r2, 0xF0
- bl memcpy
- ldr r0, [sp, 0x14]
- bl Free
-_080FD318:
- add sp, 0x20
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080FD328: .4byte gLinkPlayers
-_080FD32C: .4byte 0x00003bac
-_080FD330: .4byte gSaveBlock1Ptr
-_080FD334: .4byte 0x00003ba8
- thumb_func_end sub_80FD1A0
-
thumb_func_start sub_80FD338
sub_80FD338: @ 80FD338
push {r4-r7,lr}
@@ -1076,7 +44,7 @@ _080FD37C:
ldr r0, [r6]
adds r0, r4
adds r0, 0x4
- bl sub_80FD180
+ bl NameIsEmpty
cmp r0, 0
bne _080FD394
adds r4, 0xC
diff --git a/data/link_rfu_4.s b/data/link_rfu_4.s
deleted file mode 100644
index a6e9accb7..000000000
--- a/data/link_rfu_4.s
+++ /dev/null
@@ -1,4 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
- .section .rodata
- .align 2, 0
diff --git a/include/link_rfu.h b/include/link_rfu.h
index f23d1d95e..e6fb946a6 100644
--- a/include/link_rfu.h
+++ b/include/link_rfu.h
@@ -223,6 +223,8 @@ struct UnkRfuStruct_2
}; // size: 0x9AC
extern struct UnkRfuStruct_1 gUnknown_3005E10;
+extern struct GFtgtGname gUnknown_3005440;
+extern u8 gUnknown_3005E00[];
void AddTextPrinterToWindow1(const u8 *str);
bool32 MG_PrintTextOnWindow1AndWaitButton(u8 * cmdPtr, const u8 * src);
@@ -291,6 +293,8 @@ void LinkRfu_syncVBlank_(void);
s32 sub_80FD430(void (*func1)(u8, u8), void (*func2)(u16));
void sub_80FEB3C(void);
void sub_80FAFE0(u8 a0);
+bool32 sub_80FA44C(u32 a0);
+bool8 sub_80FC1B0(void);
#include "mevent_server.h"
extern const struct mevent_server_cmd gMEventSrvScript_OtherTrainerCanceled[];
diff --git a/src/link_rfu_4.c b/src/link_rfu_4.c
index 44ea69d35..80973e30d 100644
--- a/src/link_rfu_4.c
+++ b/src/link_rfu_4.c
@@ -1,7 +1,15 @@
#include "global.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "link.h"
#include "link_rfu.h"
+#include "malloc.h"
#include "random.h"
+#include "string_util.h"
#include "text.h"
+#include "constants/flags.h"
+
+EWRAM_DATA u8 gWirelessStatusIndicatorSpriteId = 0;
const u16 gWirelessLinkIconPalette[] = INCBIN_U16("graphics/interface/wireless_link_icon.gbapal");
@@ -594,3 +602,329 @@ u8 sub_80FCADC(u8 maxFlags)
"\tbx r1");
}
#endif
+
+void sub_80FCB54(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3)
+{
+ s32 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ data->unk_00.playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+ }
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ data->unk_04[i] = r3;
+ r3 >>= 8;
+ }
+ data->playerGender = gSaveBlock2Ptr->playerGender;
+ data->unk_0a_0 = r9;
+ data->unk_0a_7 = r2;
+ data->unk_00.unk_00_0 = GAME_LANGUAGE;
+ data->unk_00.unk_01_2 = GAME_VERSION;
+ data->unk_00.unk_00_4 = 0;
+ data->unk_00.unk_00_5 = 0;
+ data->unk_00.unk_00_6 = 0;
+ data->unk_00.isChampion = FlagGet(FLAG_SYS_CAN_LINK_WITH_RS);
+ data->unk_00.hasNationalDex = IsNationalPokedexEnabled();
+ data->unk_00.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR);
+}
+
+bool8 sub_80FCC3C(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
+{
+ bool8 retVal;
+
+ if (gUnknown_3005E10.unk_06 == 1)
+ {
+ retVal = TRUE;
+ if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
+ {
+ memcpy(buff1, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
+ memcpy(buff2, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
+ }
+ else
+ {
+ memset(buff1, 0, RFU_GAME_NAME_LENGTH);
+ memset(buff2, 0, RFU_USER_NAME_LENGTH);
+ }
+ }
+ else
+ {
+ retVal = FALSE;
+ if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo))
+ {
+ memcpy(buff1, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
+ memcpy(buff2, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
+ }
+ else
+ {
+ memset(buff1, 0, RFU_GAME_NAME_LENGTH);
+ memset(buff2, 0, RFU_USER_NAME_LENGTH);
+ }
+ }
+ return retVal;
+}
+
+bool8 sub_80FCCF4(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
+{
+ bool8 retVal = FALSE;
+ if (gRfuLinkStatus->partner[idx].serialNo == 0x7F7D)
+ {
+ memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
+ memcpy(buff2, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
+ retVal = TRUE;
+ }
+ else
+ {
+ memset(buff1, 0, RFU_GAME_NAME_LENGTH);
+ memset(buff2, 0, RFU_USER_NAME_LENGTH);
+ }
+ return retVal;
+}
+
+void sub_80FCD50(struct GFtgtGname *buff1, u8 *buff2)
+{
+ memcpy(buff1, &gUnknown_3005440, RFU_GAME_NAME_LENGTH);
+ memcpy(buff2, gUnknown_3005E00, RFU_USER_NAME_LENGTH);
+}
+
+void CreateWirelessStatusIndicatorSprite(u8 x, u8 y)
+{
+ u8 sprId;
+
+ if (x == 0 && y == 0)
+ {
+ x = 0xE7;
+ y = 0x08;
+ }
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ sprId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);
+ gSprites[sprId].data[7] = 0x1234;
+ gSprites[sprId].data[6] = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
+ gSprites[sprId].invisible = TRUE;
+ gWirelessStatusIndicatorSpriteId = sprId;
+ }
+ else
+ {
+ gWirelessStatusIndicatorSpriteId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);
+ gSprites[gWirelessStatusIndicatorSpriteId].data[7] = 0x1234;
+ gSprites[gWirelessStatusIndicatorSpriteId].data[6] = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
+ gSprites[gWirelessStatusIndicatorSpriteId].invisible = TRUE;
+ }
+}
+
+void DestroyWirelessStatusIndicatorSprite(void)
+{
+ if (gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234)
+ {
+ gSprites[gWirelessStatusIndicatorSpriteId].data[7] = 0;
+ DestroySprite(&gSprites[gWirelessStatusIndicatorSpriteId]);
+ gMain.oamBuffer[125] = gDummyOamData;
+ CpuCopy16(&gDummyOamData, (struct OamData *)OAM + 125, sizeof(struct OamData));
+ }
+}
+
+void LoadWirelessStatusIndicatorSpriteGfx(void)
+{
+ if (GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag) == 0xFFFF)
+ {
+ LoadCompressedSpriteSheet(&sWirelessStatusIndicatorSpriteSheet);
+ }
+ LoadSpritePalette(&sWirelessStatusIndicatorSpritePalette);
+ gWirelessStatusIndicatorSpriteId = 0xFF;
+}
+
+u8 sub_80FCEE4(void)
+{
+ u8 i;
+ u8 flags = gRfuLinkStatus->connSlotFlag;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if (flags & 1)
+ {
+ return gRfuLinkStatus->strength[i];
+ }
+ flags >>= 1;
+ }
+ return 0;
+}
+
+void sub_80FCF1C(struct Sprite *sprite, s32 signalStrengthAnimNum)
+{
+ if (sprite->data[2] != signalStrengthAnimNum)
+ {
+ sprite->data[2] = signalStrengthAnimNum;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ }
+}
+
+void sub_80FCF34(void)
+{
+ if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234)
+ {
+ struct Sprite *sprite = &gSprites[gWirelessStatusIndicatorSpriteId];
+ u8 signalStrength = 255;
+ u8 i = 0;
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ for (i = 0; i < GetLinkPlayerCount() - 1; i++)
+ {
+ if (signalStrength >= sub_80FCADC(i + 1))
+ {
+ signalStrength = sub_80FCADC(i + 1);
+ }
+ }
+ }
+ else
+ {
+ signalStrength = sub_80FCEE4();
+ }
+ if (sub_80FC1B0() == TRUE)
+ {
+ sprite->data[0] = 4;
+ }
+ else if (signalStrength < 25)
+ {
+ sprite->data[0] = 3;
+ }
+ else if (signalStrength >= 25 && signalStrength < 127)
+ {
+ sprite->data[0] = 2;
+ }
+ else if (signalStrength >= 127 && signalStrength < 229)
+ {
+ sprite->data[0] = 1;
+ }
+ else if (signalStrength >= 229)
+ {
+ sprite->data[0] = 0;
+ }
+ if (sprite->data[0] != sprite->data[1])
+ {
+ sub_80FCF1C(sprite, sprite->data[0]);
+ sprite->data[1] = sprite->data[0];
+ }
+ if (sprite->anims[sprite->data[2]][sprite->data[4]].frame.duration < sprite->data[3])
+ {
+ sprite->data[4]++;
+ sprite->data[3] = 0;
+ if (sprite->anims[sprite->data[2]][sprite->data[4]].type == -2)
+ {
+ sprite->data[4] = 0;
+ }
+ }
+ else
+ {
+ sprite->data[3]++;
+ }
+ gMain.oamBuffer[125] = sWirelessStatusIndicatorOamData;
+ gMain.oamBuffer[125].x = sprite->pos1.x + sprite->centerToCornerVecX;
+ gMain.oamBuffer[125].y = sprite->pos1.y + sprite->centerToCornerVecY;
+ gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum;
+ gMain.oamBuffer[125].tileNum = sprite->data[6] + sprite->anims[sprite->data[2]][sprite->data[4]].frame.imageValue;
+ CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData));
+ if (sub_80FB9F4() == 1)
+ {
+ DestroyWirelessStatusIndicatorSprite();
+ }
+ }
+}
+
+void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name)
+{
+ int i;
+ dest->trainerId = trainerId;
+ for (i = 0; i < 7; i++)
+ {
+ if (name[i] == EOS)
+ break;
+ dest->trainerName[i] = name[i];
+ }
+ dest->trainerName[i] = EOS;
+}
+
+void ZeroName(u8 *name)
+{
+ s32 i;
+
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ {
+ *name++ = 0;
+ }
+}
+
+bool32 NameIsEmpty(const u8 *name)
+{
+ s32 i;
+
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ {
+ if (*name++ != 0)
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+// Save the currently connected players into the trainer records, shifting all previous records down.
+void RecordMixTrainerNames(void)
+{
+ if (gWirelessCommType != 0)
+ {
+ s32 i;
+ s32 j;
+ s32 nextSpace;
+ s32 connectedTrainerRecordIndices[5];
+ struct TrainerNameRecord *newRecords = AllocZeroed(20 * sizeof(struct TrainerNameRecord));
+
+ // Check if we already have a record saved for connected trainers.
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ connectedTrainerRecordIndices[i] = -1;
+ for (j = 0; j < 20; j++)
+ {
+ if ((u16)gLinkPlayers[i].trainerId == gSaveBlock1Ptr->trainerNameRecords[j].trainerId && StringCompare(gLinkPlayers[i].name, gSaveBlock1Ptr->trainerNameRecords[j].trainerName) == 0)
+ {
+ connectedTrainerRecordIndices[i] = j;
+ }
+ }
+ }
+
+ // Save the connected trainers first, at the top of the list.
+ nextSpace = 0;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (i != GetMultiplayerId() && gLinkPlayers[i].language != LANGUAGE_JAPANESE)
+ {
+ CopyTrainerRecord(&newRecords[nextSpace], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name);
+
+ // If we already had a record for this trainer, wipe it so that the next step doesn't duplicate it.
+ if (connectedTrainerRecordIndices[i] >= 0)
+ {
+ ZeroName(gSaveBlock1Ptr->trainerNameRecords[connectedTrainerRecordIndices[i]].trainerName);
+ }
+ nextSpace++;
+ }
+ }
+
+ // Copy all non-empty records to the new list, in the order they appear on the old list. If the list is full,
+ // the last (oldest) records will be dropped.
+ for (i = 0; i < 20; i++)
+ {
+ if (!NameIsEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))
+ {
+ CopyTrainerRecord(&newRecords[nextSpace], gSaveBlock1Ptr->trainerNameRecords[i].trainerId, gSaveBlock1Ptr->trainerNameRecords[i].trainerName);
+ if (++nextSpace >= 20)
+ {
+ break;
+ }
+ }
+ }
+
+ // Finalize the new list, and clean up.
+ memcpy(gSaveBlock1Ptr->trainerNameRecords, newRecords, 20 * sizeof(struct TrainerNameRecord));
+ Free(newRecords);
+ }
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 2647ced8c..210932fe9 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -332,10 +332,9 @@ gUnknown_203ABE8: @ 203ABE8
.include "src/map_preview_screen.o"
.align 2
.include "src/link_rfu_2.o"
-
.align 2
-gUnknown_203ACE4: @ 203ACE4
- .space 0x4
+ .include "src/link_rfu_4.o"
+ .align 2
gUnknown_203ACE8: @ 203ACE8
.space 0x4