summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/events/special_pointers.asm2
-rw-r--r--engine/link/link.asm178
-rw-r--r--maps/Pokecenter2F.asm6
3 files changed, 109 insertions, 77 deletions
diff --git a/data/events/special_pointers.asm b/data/events/special_pointers.asm
index b7e4d213..c2a625fe 100644
--- a/data/events/special_pointers.asm
+++ b/data/events/special_pointers.asm
@@ -17,7 +17,7 @@ SpecialsPointers::
; Communications
add_special SetBitsForLinkTradeRequest
add_special WaitForLinkedFriend
- add_special CheckLinkTimeout
+ add_special CheckLinkTimeout_Receptionist
add_special TryQuickSave
add_special CheckBothSelectedSameRoom
add_special FailedLinkToPast
diff --git a/engine/link/link.asm b/engine/link/link.asm
index 230a62ae..789e3d5e 100644
--- a/engine/link/link.asm
+++ b/engine/link/link.asm
@@ -15,7 +15,7 @@ LinkCommunications:
call UpdateSprites
call LoadStandardFont
call LoadFontsBattleExtra
- call LoadTradeScreenBorder
+ call LoadTradeScreenBorderGFX
call SetTradeRoomBGPals
call WaitBGMap
hlcoord 3, 8
@@ -99,9 +99,9 @@ Gen2ToGen1LinkComms:
ld a, [hl]
pop hl
and a
- jp z, Function28a04
+ jp z, ExitLinkCommunications
cp $7
- jp nc, Function28a04
+ jp nc, ExitLinkCommunications
ld de, wLinkData
ld bc, $1a2
call Link_CopyOTData
@@ -161,7 +161,7 @@ Gen2ToGen1LinkComms:
.done_party
ld [de], a
ld hl, wTimeCapsulePartyMon1Species
- call Function285db
+ call Link_ConvertPartyStruct1to2
ld a, LOW(wOTPartyMonOT)
ld [wUnusedCFFE], a
ld a, HIGH(wOTPartyMonOT)
@@ -180,7 +180,7 @@ Gen2ToGen2LinkComms:
call ClearLinkData
call Link_PrepPartyData_Gen2
call FixDataForLinkTransfer
- call Function29bf4
+ call CheckLinkTimeout_Gen2
ld a, [wScriptVar]
and a
jp z, LinkTimeout
@@ -418,7 +418,7 @@ Gen2ToGen2LinkComms:
pop af
ld [wOptions], a
farcall LoadPokemonData
- jp Function28a04
+ jp ExitLinkCommunications
.ready_to_trade
ld de, MUSIC_ROUTE_30
@@ -772,9 +772,9 @@ Link_PrepPartyData_Gen2:
; Fill 5 bytes at wc8f4 with $20
ld de, wc8f4
ld a, $20
- call Function285d3
+ call Link_CopyMailPreamble
-; Copy all the mail messages to wc9f9
+; Copy all the mail messages to wc8f9
ld a, BANK(sPartyMail)
call OpenSRAM
ld hl, sPartyMail
@@ -788,7 +788,7 @@ Link_PrepPartyData_Gen2:
pop bc
dec b
jr nz, .loop2
-; Copy the mail data to wcabf
+; Copy the mail data to wc9bf
ld hl, sPartyMail
ld b, PARTY_LENGTH
.loop3
@@ -838,7 +838,8 @@ Link_PrepPartyData_Gen2:
ld [de], a
ret
-Function285d3:
+Link_CopyMailPreamble:
+; fill 5 bytes with the value of a, starting at de
ld c, 5
.loop
ld [de], a
@@ -847,7 +848,7 @@ Function285d3:
jr nz, .loop
ret
-Function285db:
+Link_ConvertPartyStruct1to2:
push hl
ld d, h
ld e, l
@@ -1076,9 +1077,9 @@ Link_FindFirstNonControlCharacter_AllowZero:
InitTradeMenuDisplay:
call ClearTilemap
- call LoadTradeScreenBorder
- call Function28dcf
- call Function28a16
+ call LoadTradeScreenBorderGFX
+ call PlaceTradeScreenTextbox
+ call PlaceTradeScreenFooter
xor a
ld hl, wOtherPlayerLinkMode
ld [hli], a
@@ -1144,7 +1145,7 @@ LinkTradeOTPartymonMenuLoop:
.not_d_up
bit D_DOWN_F, a
jp z, LinkTradePartiesMenuMasterLoop
- jp Function289c2
+ jp LinkTradeCheckCancel
LinkTrade_PlayerPartyMenu:
xor a
@@ -1177,7 +1178,7 @@ LinkTradePartymonMenuLoop:
.check_joypad
bit A_BUTTON_F, a
jr z, .not_a_button
- jp Function2884a
+ jp LinkTrade_TradeStatsMenu
.not_a_button
bit D_DOWN_F, a
@@ -1211,7 +1212,7 @@ LinkTradePartiesMenuMasterLoop:
jp z, LinkTradePartymonMenuLoop ; PARTYMON
jp LinkTradeOTPartymonMenuLoop ; OTPARTYMON
-Function2884a:
+LinkTrade_TradeStatsMenu:
call HideCursor
call LoadTilemapToTempTilemap
call PlaceHollowCursor
@@ -1307,7 +1308,7 @@ Function2884a:
cp $f
jp z, InitTradeMenuDisplay
ld [wceee], a
- call Function28a3c
+ call LinkTradePlaceArrow
ld c, 100
call DelayFrames
farcall ValidateOTTrademon
@@ -1372,12 +1373,11 @@ Function2884a:
text_far _LinkAbnormalMonText
text_end
-Function289c2:
+LinkTradeCheckCancel:
ld a, [wMenuCursorY]
cp 1
jp nz, LinkTradePartiesMenuMasterLoop
call HideCursor
-Function289cd:
.loop1
ld a, "▶"
ldcoord_a 1, 16
@@ -1405,7 +1405,7 @@ Function289cd:
ld a, [wOtherPlayerLinkMode]
cp $f
jr nz, .loop1
-Function28a04:
+ExitLinkCommunications:
xor a
ld [wd8b7], a
xor a
@@ -1417,15 +1417,18 @@ Function28a04:
ldh [rSC], a
ret
-Function28a16:
+PlaceTradeScreenFooter:
+; Fill the screen footer with pattern tile
hlcoord 0, 16
- ld a, "┘"
+ ld a, $7e
ld bc, 2 * SCREEN_WIDTH
call ByteFill
+; Clear out area for cancel string
hlcoord 1, 16
ld a, " "
ld bc, SCREEN_WIDTH - 2
call ByteFill
+; Place the string
hlcoord 2, 16
ld de, .CancelString
jp PlaceString
@@ -1433,7 +1436,8 @@ Function28a16:
.CancelString:
db "CANCEL@"
-Function28a3c:
+LinkTradePlaceArrow:
+; Indicates which pokemon the other player has selected to trade
ld a, [wOtherPlayerLinkMode]
hlcoord 6, 9
ld bc, SCREEN_WIDTH
@@ -1453,11 +1457,11 @@ LinkMonStatsScreen:
call ClearTilemap
call ClearBGPalettes
call MaxVolume
- call LoadTradeScreenBorder
+ call LoadTradeScreenBorderGFX
call SetTradeRoomBGPals
call WaitBGMap
- call Function28dcf
- jp Function28a16
+ call PlaceTradeScreenTextbox
+ jp PlaceTradeScreenFooter
LinkTrade:
xor a
@@ -1495,7 +1499,7 @@ LinkTrade:
ld b, 3
ld c, 7
call LinkTextboxAtHL
- ld de, String28d44
+ ld de, String_TradeCancel
hlcoord 12, 8
call PlaceString
ld a, 8
@@ -1521,12 +1525,12 @@ LinkTrade:
call SafeLoadTempTilemapToTilemap
pop af
bit 1, a
- jr nz, .asm_28b16
+ jr nz, .canceled
ld a, [wMenuCursorY]
dec a
- jr z, .asm_28b34
+ jr z, .try_trade
-.asm_28b16
+.canceled
ld a, $1
ld [wPlayerLinkAction], a
hlcoord 0, 12
@@ -1537,15 +1541,16 @@ LinkTrade:
ld de, String_TooBadTheTradeWasCanceled
call PlaceString
call Serial_PrintWaitingTextAndSyncAndExchangeNybble
- jp Function28d3c
+ jp InitTradeMenuDisplay_Delay
-.asm_28b34
+.try_trade
ld a, $2
ld [wPlayerLinkAction], a
call Serial_PrintWaitingTextAndSyncAndExchangeNybble
ld a, [wOtherPlayerLinkMode]
dec a
- jr nz, .asm_28b58
+ jr nz, .do_trade
+; If we're here, the other player canceled the trade
hlcoord 0, 12
ld b, 4
ld c, 18
@@ -1553,9 +1558,9 @@ LinkTrade:
hlcoord 1, 14
ld de, String_TooBadTheTradeWasCanceled
call PlaceString
- jp Function28d3c
+ jp InitTradeMenuDisplay_Delay
-.asm_28b58
+.do_trade:
ld hl, sPartyMail
ld a, [wceed]
ld bc, MAIL_STRUCT_LENGTH
@@ -1568,18 +1573,18 @@ LinkTrade:
add hl, bc
ld a, [wceed]
ld c, a
-.asm_28b73
+.copy_mail
inc c
ld a, c
cp PARTY_LENGTH
- jr z, .asm_28b83
+ jr z, .copy_player_data
push bc
ld bc, MAIL_STRUCT_LENGTH
call CopyBytes
pop bc
- jr .asm_28b73
+ jr .copy_mail
-.asm_28b83
+.copy_player_data
ld hl, sPartyMail
ld a, [wPartyCount]
dec a
@@ -1594,10 +1599,14 @@ LinkTrade:
ld bc, MAIL_STRUCT_LENGTH
call CopyBytes
call CloseSRAM
+
+; Buffer player data
+; nickname
ld hl, wPlayerName
ld de, wPlayerTrademonSenderName
ld bc, NAME_LENGTH
call CopyBytes
+; species
ld a, [wceed]
ld hl, wPartySpecies
ld b, 0
@@ -1606,12 +1615,14 @@ LinkTrade:
ld a, [hl]
ld [wPlayerTrademonSpecies], a
push af
+; OT name
ld a, [wceed]
ld hl, wPartyMonOT
call SkipNames
ld de, wPlayerTrademonOTName
ld bc, NAME_LENGTH
call CopyBytes
+; ID
ld hl, wPartyMon1ID
ld a, [wceed]
call GetPartyLocation
@@ -1619,6 +1630,7 @@ LinkTrade:
ld [wPlayerTrademonID], a
ld a, [hl]
ld [wPlayerTrademonID + 1], a
+; DVs
ld hl, wPartyMon1DVs
ld a, [wceed]
call GetPartyLocation
@@ -1626,10 +1638,14 @@ LinkTrade:
ld [wPlayerTrademonDVs], a
ld a, [hl]
ld [wPlayerTrademonDVs + 1], a
+
+; Buffer other player data
+; nickname
ld hl, wOTPlayerName
ld de, wOTTrademonSenderName
ld bc, NAME_LENGTH
call CopyBytes
+; species
ld a, [wceee]
ld hl, wOTPartySpecies
ld b, 0
@@ -1637,12 +1653,14 @@ LinkTrade:
add hl, bc
ld a, [hl]
ld [wOTTrademonSpecies], a
+; OT name
ld a, [wceee]
ld hl, wOTPartyMonOT
call SkipNames
ld de, wOTTrademonOTName
ld bc, NAME_LENGTH
call CopyBytes
+; ID
ld hl, wOTPartyMon1ID
ld a, [wceee]
call GetPartyLocation
@@ -1650,6 +1668,7 @@ LinkTrade:
ld [wOTTrademonID], a
ld a, [hl]
ld [wOTTrademonID + 1], a
+; DVs
ld hl, wOTPartyMon1DVs
ld a, [wceee]
call GetPartyLocation
@@ -1657,6 +1676,7 @@ LinkTrade:
ld [wOTTrademonDVs], a
ld a, [hl]
ld [wOTTrademonDVs + 1], a
+
ld a, [wceed]
ld [wCurPartyMon], a
ld hl, wPartySpecies
@@ -1665,6 +1685,7 @@ LinkTrade:
add hl, bc
ld a, [hl]
ld [wceed], a
+
xor a ; REMOVE_PARTY
ld [wPokemonWithdrawDepositParameter], a
callfar RemoveMonFromPartyOrBox
@@ -1681,6 +1702,7 @@ LinkTrade:
add hl, bc
ld a, [hl]
ld [wceee], a
+
ld c, 100
call DelayFrames
call ClearTilemap
@@ -1716,7 +1738,7 @@ LinkTrade:
ld [wCurPartyMon], a
callfar EvolvePokemon
call ClearTilemap
- call LoadTradeScreenBorder
+ call LoadTradeScreenBorderGFX
call SetTradeRoomBGPals
call WaitBGMap
@@ -1768,7 +1790,7 @@ LinkTrade:
ld c, 18
call LinkTextboxAtHL
hlcoord 1, 14
- ld de, String28d56
+ ld de, String_TradeCompleted
call PlaceString
ld c, 50
call DelayFrames
@@ -1777,12 +1799,12 @@ LinkTrade:
jp z, Gen2ToGen1LinkComms
jp Gen2ToGen2LinkComms
-Function28d3c:
+InitTradeMenuDisplay_Delay:
ld c, 100
call DelayFrames
jp InitTradeMenuDisplay
-String28d44:
+String_TradeCancel:
db "TRADE"
next "CANCEL@"
@@ -1790,7 +1812,7 @@ LinkAskTradeForText:
text_far _LinkAskTradeForText
text_end
-String28d56:
+String_TradeCompleted:
db "Trade completed!@"
String_TooBadTheTradeWasCanceled:
@@ -1836,7 +1858,7 @@ LinkTextboxAtHL:
jr nz, .row_loop
ret
-LoadTradeScreenBorder:
+LoadTradeScreenBorderGFX:
ld de, LinkCommsBorderGFX
ld hl, vTiles2 tile $76
lb bc, BANK(LinkCommsBorderGFX), 9
@@ -1847,7 +1869,7 @@ SetTradeRoomBGPals:
call GetSGBLayout
jp SetPalettes
-Function28dcf:
+PlaceTradeScreenTextbox:
hlcoord 0, 0
ld b, 6
ld c, 18
@@ -1930,19 +1952,20 @@ CheckTimeCapsuleCompatibility:
call GetMoveName
call CopyName1
pop bc
- call Function29ab3
+ call GetIncompatibleMonName
ld a, $2
jr .done
.mon_has_mail
- call Function29ab3
+ call GetIncompatibleMonName
ld a, $3
.done
ld [wScriptVar], a
ret
-Function29ab3:
+GetIncompatibleMonName:
+; Calulate which pokemon is incompatible, and get that pokemon's name
ld a, [wPartyCount]
sub b
ld c, a
@@ -2102,7 +2125,7 @@ WaitForLinkedFriend:
ld [wScriptVar], a
ret
-CheckLinkTimeout:
+CheckLinkTimeout_Receptionist:
ld a, $1
ld [wPlayerLinkAction], a
ld hl, wLinkTimeoutFrames
@@ -2123,11 +2146,12 @@ CheckLinkTimeout:
ret nz
jp Link_ResetSerialRegistersAfterLinkClosure
-Function29bf4:
+CheckLinkTimeout_Gen2:
+; if wScriptVar = 0 on exit, link connection is closed
ld a, $5
ld [wPlayerLinkAction], a
ld hl, wLinkTimeoutFrames
- ld a, $3
+ ld a, 3
ld [hli], a
xor a
ld [hl], a
@@ -2139,33 +2163,39 @@ Function29bf4:
call Link_CheckCommunicationError
ld a, [wScriptVar]
and a
- jr z, .vblank
- ld bc, -1
+ jr z, .exit
+
+; Wait for ~$70000 cycles to give the other GB time to be ready
+ ld bc, $ffff
.wait
dec bc
ld a, b
or c
jr nz, .wait
+
+; If other GB is not ready at this point, disconnect due to timeout
ld a, [wOtherPlayerLinkMode]
cp $5
- jr nz, .script_var
+ jr nz, .timeout
+
+; Another check to increase reliability
ld a, $6
ld [wPlayerLinkAction], a
ld hl, wLinkTimeoutFrames
- ld a, $1
+ ld a, 1
ld [hli], a
- ld [hl], $32
+ ld [hl], 50
call Link_CheckCommunicationError
ld a, [wOtherPlayerLinkMode]
cp $6
- jr z, .vblank
+ jr z, .exit
-.script_var
+.timeout
xor a
ld [wScriptVar], a
ret
-.vblank
+.exit
xor a
ldh [hVBlank], a
ret
@@ -2174,6 +2204,7 @@ Link_CheckCommunicationError:
xor a
ldh [hSerialReceivedNewData], a
call WaitLinkTransfer
+
ld hl, wLinkTimeoutFrames
ld a, [hli]
inc a
@@ -2181,23 +2212,23 @@ Link_CheckCommunicationError:
ld a, [hl]
inc a
jr nz, .load_true
+
ld b, 10
-
-.acknowledge_serial
.loop
call DelayFrame
call LinkDataReceived
dec b
jr nz, .loop
-
- xor a
- jr .load_scriptvar
-
+
+ xor a ; FALSE
+ jr .done
+
.load_true
- ld a, $1
-
-.load_scriptvar
+ ld a, TRUE
+
+.done
ld [wScriptVar], a
+
ld hl, wLinkTimeoutFrames
xor a
ld [hli], a
@@ -2340,10 +2371,11 @@ CableClubCheckWhichChris:
LinkCommsBorderGFX:
INCBIN "gfx/trade/border_tiles.2bpp"
-Function29deb: ; unreferenced
- ld a, BANK(sPartyMail)
+CheckSRAM0Flag: ; unreferenced
+; input: hl = unknown flag array in "SRAM Bank 0"
+ ld a, BANK("SRAM Bank 0")
call OpenSRAM
- ld d, FALSE
+ ld d, 0
ld b, CHECK_FLAG
predef SmallFarFlagAction
call CloseSRAM
diff --git a/maps/Pokecenter2F.asm b/maps/Pokecenter2F.asm
index 1fc358d0..b4178834 100644
--- a/maps/Pokecenter2F.asm
+++ b/maps/Pokecenter2F.asm
@@ -74,7 +74,7 @@ LinkReceptionistScript_Trade:
special TryQuickSave
iffalse .DidNotSave
writetext Text_PleaseWait
- special CheckLinkTimeout
+ special CheckLinkTimeout_Receptionist
iffalse .LinkTimedOut
readmem wOtherPlayerLinkMode
iffalse .LinkedToFirstGen
@@ -135,7 +135,7 @@ LinkReceptionistScript_Battle:
special TryQuickSave
iffalse .DidNotSave
writetext Text_PleaseWait
- special CheckLinkTimeout
+ special CheckLinkTimeout_Receptionist
iffalse .LinkTimedOut
readmem wOtherPlayerLinkMode
iffalse .LinkedToFirstGen
@@ -211,7 +211,7 @@ LinkReceptionistScript_TimeCapsule:
special TryQuickSave
iffalse .DidNotSave
writetext Text_PleaseWait
- special CheckLinkTimeout
+ special CheckLinkTimeout_Receptionist
iffalse .LinkTimedOut
readmem wOtherPlayerLinkMode
iffalse .OK