summaryrefslogtreecommitdiff
path: root/engine/cable_club.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/cable_club.asm')
-rwxr-xr-xengine/cable_club.asm937
1 files changed, 479 insertions, 458 deletions
diff --git a/engine/cable_club.asm b/engine/cable_club.asm
index a8a1f90f..43900694 100755
--- a/engine/cable_club.asm
+++ b/engine/cable_club.asm
@@ -1,4 +1,7 @@
-Func_5317: ; 5317 (1:5317)
+; performs the appropriate action when the player uses the gameboy on the table in the Colosseum or Trade Centre
+; In the Colosseum, it starts a battle. In the Trade Centre, it displays the trade selection screen.
+; Before doing either action, it swaps random numbers, trainer names and party data with the other gameboy.
+CableClub_DoBattleOrTrade: ; 5317 (1:5317)
ld c, $50
call DelayFrames
call ClearScreen
@@ -7,286 +10,292 @@ Func_5317: ; 5317 (1:5317)
call LoadHpBarAndStatusTilePatterns
call LoadTrainerInfoTextBoxTiles
hlCoord 3, 8
- ld b, $2
- ld c, $c
- call Func_5ab3
+ ld b, 2
+ ld c, 12
+ call CableClub_TextBoxBorder
hlCoord 4, 10
- ld de, PleaseWaitString ; $550f
+ ld de, PleaseWaitString
call PlaceString
- ld hl, W_NUMHITS ; wd074
+ ld hl, wPlayerNumHits
xor a
ld [hli], a
ld [hl], $50
+ ; fall through
-Func_5345: ; 5345
- ld hl, wd152
- ld a, $fd
- ld b, $6
-.asm_534c
+; This is called after completing a trade.
+CableClub_DoBattleOrTradeAgain: ; 5345
+ ld hl, wSerialPlayerDataBlock
+ ld a, SERIAL_PREAMBLE_BYTE
+ ld b, 6
+.writePlayeDataBlockPreambleLoop
ld [hli], a
dec b
- jr nz, .asm_534c
- ld hl, wd141
- ld a, $fd
- ld b, $7
-.asm_5357
+ jr nz, .writePlayeDataBlockPreambleLoop
+ ld hl, wSerialRandomNumberListBlock
+ ld a, SERIAL_PREAMBLE_BYTE
+ ld b, 7
+.writeRandomNumberListPreambleLoop
ld [hli], a
dec b
- jr nz, .asm_5357
- ld b, $a
-.asm_535d
+ jr nz, .writeRandomNumberListPreambleLoop
+ ld b, 10
+.generateRandomNumberListLoop
call Random
- cp $fd
- jr nc, .asm_535d
+ cp SERIAL_PREAMBLE_BYTE ; all the random numbers have to be less than the preamble byte
+ jr nc, .generateRandomNumberListLoop
ld [hli], a
dec b
- jr nz, .asm_535d
- ld hl, wTileMapBackup
- ld a, $fd
+ jr nz, .generateRandomNumberListLoop
+ ld hl, wSerialPartyMonsPatchList
+ ld a, SERIAL_PREAMBLE_BYTE
ld [hli], a
ld [hli], a
ld [hli], a
ld b, $c8
xor a
-.asm_5373
+.zeroPlayerDataPatchListLoop
ld [hli], a
dec b
- jr nz, .asm_5373
- ld hl, W_GRASSRATE ; W_GRASSRATE
- ld bc, $1a9
-.asm_537d
+ jr nz, .zeroPlayerDataPatchListLoop
+ ld hl, W_GRASSRATE
+ ld bc, W_TRAINERHEADERPTR - W_GRASSRATE
+.zeroEnemyPartyLoop
xor a
ld [hli], a
dec bc
ld a, b
or c
- jr nz, .asm_537d
+ jr nz, .zeroEnemyPartyLoop
ld hl, wPartyMons - 1
- ld de, wTileMapBackup + 10
- ld bc, $0
-.asm_538d
+ ld de, wSerialPartyMonsPatchList + 10
+ ld bc, 0
+.patchPartyMonsLoop
inc c
ld a, c
- cp $fd
- jr z, .asm_53a9
+ cp SERIAL_PREAMBLE_BYTE
+ jr z, .startPatchListPart2
ld a, b
- dec a
- jr nz, .asm_539c
+ dec a ; are we in part 2 of the patch list?
+ jr nz, .checkPlayerDataByte ; jump if in part 1
+; if we're in part 2
ld a, c
- cp $d
- jr z, .asm_53b2
-.asm_539c
+ cp (wPartyMonOT - (wPartyMons - 1)) - (SERIAL_PREAMBLE_BYTE - 1)
+ jr z, .finishedPatchingPlayerData
+.checkPlayerDataByte
inc hl
ld a, [hl]
- cp $fe
- jr nz, .asm_538d
+ cp SERIAL_NO_DATA_BYTE
+ jr nz, .patchPartyMonsLoop
+; if the player data byte matches SERIAL_NO_DATA_BYTE, patch it with $FF and record the offset in the patch list
ld a, c
ld [de], a
inc de
ld [hl], $ff
- jr .asm_538d
-.asm_53a9
- ld a, $ff
- ld [de], a
+ jr .patchPartyMonsLoop
+.startPatchListPart2
+ ld a, SERIAL_PATCH_LIST_PART_TERMINATOR
+ ld [de], a ; end of part 1
inc de
ld bc, $100
- jr .asm_538d
-.asm_53b2
- ld a, $ff
- ld [de], a
- call Func_227f
- ld a, [$ffaa]
- cp $2
- jr nz, .asm_53d2
+ jr .patchPartyMonsLoop
+.finishedPatchingPlayerData
+ ld a, SERIAL_PATCH_LIST_PART_TERMINATOR
+ ld [de], a ; end of part 2
+ call Serial_SyncAndExchangeNybble
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK
+ jr nz, .skipSendingTwoZeroBytes
+; if using internal clock
+; send two zero bytes for syncing purposes?
call Delay3
xor a
- ld [$ffac], a
- ld a, $81
- ld [$ff02], a
+ ld [hSerialSendData], a
+ ld a, START_TRANSFER_INTERNAL_CLOCK
+ ld [rSC], a
call DelayFrame
xor a
- ld [$ffac], a
- ld a, $81
- ld [$ff02], a
-.asm_53d2
+ ld [hSerialSendData], a
+ ld a, START_TRANSFER_INTERNAL_CLOCK
+ ld [rSC], a
+.skipSendingTwoZeroBytes
call Delay3
- ld a, $8
- ld [rIE], a ; $ffff
- ld hl, wd141
- ld de, wTileMapBackup2
+ ld a, (1 << SERIAL)
+ ld [rIE], a
+ ld hl, wSerialRandomNumberListBlock
+ ld de, wSerialOtherGameboyRandomNumberListBlock
ld bc, $11
- call Func_216f
- ld a, $fe
+ call Serial_ExchangeBytes
+ ld a, SERIAL_NO_DATA_BYTE
ld [de], a
- ld hl, wd152
- ld de, wd893
+ ld hl, wSerialPlayerDataBlock
+ ld de, wSerialEnemyDataBlock
ld bc, $1a8
- call Func_216f
- ld a, $fe
+ call Serial_ExchangeBytes
+ ld a, SERIAL_NO_DATA_BYTE
ld [de], a
- ld hl, wTileMapBackup
- ld de, wTileMapBackup + 200
+ ld hl, wSerialPartyMonsPatchList
+ ld de, wSerialEnemyMonsPatchList
ld bc, $c8
- call Func_216f
- ld a, $d
- ld [rIE], a ; $ffff
+ call Serial_ExchangeBytes
+ ld a, (1 << SERIAL) | (1 << TIMER) | (1 << VBLANK)
+ ld [rIE], a
ld a, $ff
call PlaySound
- ld a, [$ffaa]
- cp $2
- jr z, .asm_5431
- ld hl, wTileMapBackup2
-.asm_5415
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK
+ jr z, .skipCopyingRandomNumberList ; the list generated by the gameboy clocking the connection is used by both gameboys
+ ld hl, wSerialOtherGameboyRandomNumberListBlock
+.findStartOfRandomNumberListLoop
ld a, [hli]
and a
- jr z, .asm_5415
- cp $fd
- jr z, .asm_5415
- cp $fe
- jr z, .asm_5415
+ jr z, .findStartOfRandomNumberListLoop
+ cp SERIAL_PREAMBLE_BYTE
+ jr z, .findStartOfRandomNumberListLoop
+ cp SERIAL_NO_DATA_BYTE
+ jr z, .findStartOfRandomNumberListLoop
dec hl
- ld de, wd148
- ld c, $a
-.asm_5427
+ ld de, wLinkBattleRandomNumberList
+ ld c, 10
+.copyRandomNumberListLoop
ld a, [hli]
- cp $fe
- jr z, .asm_5427
+ cp SERIAL_NO_DATA_BYTE
+ jr z, .copyRandomNumberListLoop
ld [de], a
inc de
dec c
- jr nz, .asm_5427
-.asm_5431
- ld hl, wd896
-.asm_5434
+ jr nz, .copyRandomNumberListLoop
+.skipCopyingRandomNumberList
+ ld hl, wSerialEnemyDataBlock + 3
+.findStartOfEnemyNameLoop
ld a, [hli]
and a
- jr z, .asm_5434
- cp $fd
- jr z, .asm_5434
- cp $fe
- jr z, .asm_5434
+ jr z, .findStartOfEnemyNameLoop
+ cp SERIAL_PREAMBLE_BYTE
+ jr z, .findStartOfEnemyNameLoop
+ cp SERIAL_NO_DATA_BYTE
+ jr z, .findStartOfEnemyNameLoop
dec hl
- ld de, W_GRASSRATE ; W_GRASSRATE
- ld c, $b
-.asm_5446
+ ld de, wLinkEnemyTrainerName
+ ld c, 11
+.copyEnemyNameLoop
ld a, [hli]
- cp $fe
- jr z, .asm_5446
+ cp SERIAL_NO_DATA_BYTE
+ jr z, .copyEnemyNameLoop
ld [de], a
inc de
dec c
- jr nz, .asm_5446
- ld de, wEnemyPartyCount ; wEnemyPartyCount
- ld bc, $194
-.asm_5456
+ jr nz, .copyEnemyNameLoop
+ ld de, wEnemyPartyCount
+ ld bc, W_TRAINERHEADERPTR - wEnemyPartyCount
+.copyEnemyPartyLoop
ld a, [hli]
- cp $fe
- jr z, .asm_5456
+ cp SERIAL_NO_DATA_BYTE
+ jr z, .copyEnemyPartyLoop
ld [de], a
inc de
dec bc
ld a, b
or c
- jr nz, .asm_5456
- ld de, wTileMapBackup
+ jr nz, .copyEnemyPartyLoop
+ ld de, wSerialPartyMonsPatchList
ld hl, wPartyMons
- ld c, $2
-.asm_546a
+ ld c, 2 ; patch list has 2 parts
+.unpatchPartyMonsLoop
ld a, [de]
inc de
and a
- jr z, .asm_546a
- cp $fd
- jr z, .asm_546a
- cp $fe
- jr z, .asm_546a
- cp $ff
- jr z, .asm_5489
+ jr z, .unpatchPartyMonsLoop
+ cp SERIAL_PREAMBLE_BYTE
+ jr z, .unpatchPartyMonsLoop
+ cp SERIAL_NO_DATA_BYTE
+ jr z, .unpatchPartyMonsLoop
+ cp SERIAL_PATCH_LIST_PART_TERMINATOR
+ jr z, .finishedPartyMonsPatchListPart
push hl
push bc
ld b, 0
dec a
ld c, a
add hl, bc
- ld a, $fe
+ ld a, SERIAL_NO_DATA_BYTE
ld [hl], a
pop bc
pop hl
- jr .asm_546a
-.asm_5489
- ld hl, wPartyMons + $fc ; wd267
- dec c
- jr nz, .asm_546a
- ld de, wTileMapBackup + 200
+ jr .unpatchPartyMonsLoop
+.finishedPartyMonsPatchListPart
+ ld hl, wPartyMons + (SERIAL_PREAMBLE_BYTE - 1)
+ dec c ; is there another part?
+ jr nz, .unpatchPartyMonsLoop
+ ld de, wSerialEnemyMonsPatchList
ld hl, wEnemyMons
- ld c, $2
-.asm_5497
+ ld c, 2 ; patch list has 2 parts
+.unpatchEnemyMonsLoop
ld a, [de]
inc de
and a
- jr z, .asm_5497
- cp $fd
- jr z, .asm_5497
- cp $fe
- jr z, .asm_5497
- cp $ff
- jr z, .asm_54b6
+ jr z, .unpatchEnemyMonsLoop
+ cp SERIAL_PREAMBLE_BYTE
+ jr z, .unpatchEnemyMonsLoop
+ cp SERIAL_NO_DATA_BYTE
+ jr z, .unpatchEnemyMonsLoop
+ cp SERIAL_PATCH_LIST_PART_TERMINATOR
+ jr z, .finishedEnemyMonsPatchListPart
push hl
push bc
- ld b, $0
+ ld b, 0
dec a
ld c, a
add hl, bc
- ld a, $fe
+ ld a, SERIAL_NO_DATA_BYTE
ld [hl], a
pop bc
pop hl
- jr .asm_5497
-.asm_54b6
- ld hl, wEnemyMons + $fc
+ jr .unpatchEnemyMonsLoop
+.finishedEnemyMonsPatchListPart
+ ld hl, wEnemyMons + (SERIAL_PREAMBLE_BYTE - 1)
dec c
- jr nz, .asm_5497
- ld a, $ac
+ jr nz, .unpatchEnemyMonsLoop
+ ld a, wEnemyMonOT % $100
ld [wcf8d], a
- ld a, $d9
+ ld a, wEnemyMonOT / $100
ld [wcf8e], a
xor a
- ld [wcc38], a
+ ld [wTradeCenterPointerTableIndex], a
ld a, $ff
call PlaySound
- ld a, [$ffaa]
- cp $2
- ld c, $42
- call z, DelayFrames
- ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
- cp $3
- ld a, $32
- ld [W_ISLINKBATTLE], a ; W_ISLINKBATTLE
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK
+ ld c, 66
+ call z, DelayFrames ; delay if using internal clock
+ ld a, [wLinkState]
+ cp LINK_STATE_START_BATTLE
+ ld a, LINK_STATE_TRADING
+ ld [wLinkState], a
jr nz, .asm_5506
- ld a, $4
- ld [W_ISLINKBATTLE], a ; W_ISLINKBATTLE
+ ld a, LINK_STATE_BATTLING
+ ld [wLinkState], a
ld a, SONY1 + $c8
- ld [W_CUROPPONENT], a ; wd059
+ ld [W_CUROPPONENT], a
call ClearScreen
call Delay3
- ld hl, W_OPTIONS ; W_OPTIONS
+ ld hl, W_OPTIONS
res 7, [hl]
predef InitOpponent
predef HealParty
- jp Func_577d
+ jp ReturnToCableClubRoom
.asm_5506
ld c, BANK(Music_GameCorner)
ld a, MUSIC_GAME_CORNER
call PlayMusic
- jr Func_551c
+ jr CallCurrentTradeCenterFunction
PleaseWaitString: ; 550f (1:550f)
db "PLEASE WAIT!@"
-Func_551c:
- ld hl, PointerTable_5a5b ; $5a5b
- ld b, $0
- ld a, [wcc38]
+CallCurrentTradeCenterFunction:
+ ld hl, TradeCenterPointerTable
+ ld b, 0
+ ld a, [wTradeCenterPointerTableIndex]
cp $ff
jp z, LoadTitlescreenGraphics
add a
@@ -300,10 +309,10 @@ Func_551c:
TradeCenter_SelectMon:
call ClearScreen
call LoadTrainerInfoTextBoxTiles
- call Func_57f2
- call Func_57a2
+ call TradeCenter_DrawPartyLists
+ call TradeCenter_DrawCancelBox
xor a
- ld hl, wcc3d
+ ld hl, wSerialSyncAndExchangeNybbleReceiveData
ld [hli], a
ld [hli], a
ld [hli], a
@@ -313,51 +322,53 @@ TradeCenter_SelectMon:
ld [wLastMenuItem], a
ld [wMenuJoypadPollCount], a
inc a
- ld [wcc42], a
- jp .asm_55dc
-.asm_5557
+ ld [wSerialExchangeNybbleSendData], a
+ jp .playerMonMenu
+.enemyMonMenu
xor a
ld [wcc37], a
inc a
- ld [wcc49], a
- ld a, $a1
+ ld [wWhichTradeMonSelectionMenu], a
+ ld a, D_DOWN | D_LEFT | A_BUTTON
ld [wMenuWatchedKeys], a
ld a, [wEnemyPartyCount]
ld [wMaxMenuItem], a
- ld a, $9
+ ld a, 9
ld [wTopMenuItemY], a
- ld a, $1
+ ld a, 1
ld [wTopMenuItemX], a
-.asm_5574
+.enemyMonMenu_HandleInput
ld hl, $fff6
set 1, [hl]
call HandleMenuInput
ld hl, $fff6
res 1, [hl]
and a
- jp z, .asm_565b
- bit 0, a
- jr z, .asm_55b0 ; 0x5587 $27
+ jp z, .getNewInput
+ bit 0, a ; A button pressed?
+ jr z, .enemyMonMenu_ANotPressed
+; if A button pressed
ld a, [wMaxMenuItem]
ld c, a
ld a, [wCurrentMenuItem]
cp c
- jr c, .asm_559a ; 0x5591 $7
+ jr c, .displayEnemyMonStats
ld a, [wMaxMenuItem]
dec a
ld [wCurrentMenuItem], a
-.asm_559a
+.displayEnemyMonStats
ld a, $1
ld [wd11b], a
callab Func_39bd5
ld hl, wEnemyMons
- call Func_57d6
- jp .asm_565b
-.asm_55b0
- bit 5, a
- jr z, .asm_55d4 ; 0x55b2 $20
- xor a
- ld [wcc49], a
+ call TradeCenter_DisplayStats
+ jp .getNewInput
+.enemyMonMenu_ANotPressed
+ bit 5, a ; Left pressed?
+ jr z, .enemyMonMenu_LeftNotPressed
+; if Left pressed, switch back to the player mon menu
+ xor a ; player mon menu
+ ld [wWhichTradeMonSelectionMenu], a
ld a, [wMenuCursorLocation]
ld l, a
ld a, [wMenuCursorLocation + 1]
@@ -369,51 +380,53 @@ TradeCenter_SelectMon:
ld a, [wPartyCount]
dec a
cp b
- jr nc, .asm_55dc ; 0x55cd $d
+ jr nc, .playerMonMenu
ld [wCurrentMenuItem], a
- jr .asm_55dc ; 0x55d2 $8
-.asm_55d4
- bit 7, a
- jp z, .asm_565b
- jp .asm_572f
-.asm_55dc
- xor a
- ld [wcc49], a
+ jr .playerMonMenu
+.enemyMonMenu_LeftNotPressed
+ bit 7, a ; Down pressed?
+ jp z, .getNewInput
+ jp .selectedCancelMenuItem ; jump if Down pressed
+.playerMonMenu
+ xor a ; player mon menu
+ ld [wWhichTradeMonSelectionMenu], a
ld [wcc37], a
- ld a, $91
+ ld a, D_DOWN | D_RIGHT | A_BUTTON
ld [wMenuWatchedKeys], a
ld a, [wPartyCount]
ld [wMaxMenuItem], a
- ld a, $1
+ ld a, 1
ld [wTopMenuItemY], a
- ld a, $1
+ ld a, 1
ld [wTopMenuItemX], a
- ld hl, wTileMap + $15
+ hlCoord 1, 1
ld bc, $0601
call ClearScreenArea
-.asm_5601
+.playerMonMenu_HandleInput
ld hl, $fff6
set 1, [hl]
call HandleMenuInput
ld hl, $fff6
res 1, [hl]
- and a
- jr nz, .asm_5614 ; 0x560f $3
- jp .asm_565b
-.asm_5614
- bit 0, a
- jr z, .asm_562e ; 0x5616 $16
- jp .asm_5665
+ and a ; was anything pressed?
+ jr nz, .playerMonMenu_SomethingPressed
+ jp .getNewInput
+.playerMonMenu_SomethingPressed
+ bit 0, a ; A button pressed?
+ jr z, .playerMonMenu_ANotPressed
+ jp .chosePlayerMon ; jump if A button pressed
+; unreachable code
ld a, $4
ld [wd11b], a
callab Func_39bd5
- call Func_57d6
- jp .asm_565b
-.asm_562e
- bit 4, a
- jr z, .asm_5654 ; 0x5630 $22
- ld a, $1
- ld [wcc49], a
+ call TradeCenter_DisplayStats
+ jp .getNewInput
+.playerMonMenu_ANotPressed
+ bit 4, a ; Right pressed?
+ jr z, .playerMonMenu_RightNotPressed
+; if Right pressed, switch to the enemy mon menu
+ ld a, $1 ; enemy mon menu
+ ld [wWhichTradeMonSelectionMenu], a
ld a, [wMenuCursorLocation]
ld l, a
ld a, [wMenuCursorLocation + 1]
@@ -425,36 +438,37 @@ TradeCenter_SelectMon:
ld a, [wEnemyPartyCount]
dec a
cp b
- jr nc, .asm_5651 ; 0x564c $3
+ jr nc, .notPastLastEnemyMon
+; when switching to the enemy mon menu, if the menu selection would be past the last enemy mon, select the last enemy mon
ld [wCurrentMenuItem], a
-.asm_5651
- jp .asm_5557
-.asm_5654
- bit 7, a
- jr z, .asm_565b ; 0x5656 $3
- jp .asm_572f
-.asm_565b
- ld a, [wcc49]
+.notPastLastEnemyMon
+ jp .enemyMonMenu
+.playerMonMenu_RightNotPressed
+ bit 7, a ; Down pressed?
+ jr z, .getNewInput
+ jp .selectedCancelMenuItem ; jump if Down pressed
+.getNewInput
+ ld a, [wWhichTradeMonSelectionMenu]
and a
- jp z, .asm_5601
- jp .asm_5574
-.asm_5665
+ jp z, .playerMonMenu_HandleInput
+ jp .enemyMonMenu_HandleInput
+.chosePlayerMon
call SaveScreenTilesToBuffer1
call PlaceUnfilledArrowMenuCursor
ld a, [wMaxMenuItem]
ld c, a
ld a, [wCurrentMenuItem]
cp c
- jr c, .asm_5679 ; 0x5673 $4
+ jr c, .displayStatsTradeMenu
ld a, [wMaxMenuItem]
dec a
-.asm_5679
+.displayStatsTradeMenu
push af
- ld hl, wTileMap + $118
- ld b, $2
- ld c, $12
- call Func_5ab3
- ld hl, wTileMap + $142
+ hlCoord 0, 14
+ ld b, 2
+ ld c, 18
+ call CableClub_TextBoxBorder
+ hlCoord 2, 16
ld de, .statsTrade
call PlaceString
xor a
@@ -462,105 +476,107 @@ TradeCenter_SelectMon:
ld [wLastMenuItem], a
ld [wMenuJoypadPollCount], a
ld [wMaxMenuItem], a
- ld a, $10
+ ld a, 16
ld [wTopMenuItemY], a
-.asm_569f
- ld a, $7f
- ld [wTileMap + $14b], a
- ld a, $13
+.selectStatsMenuItem
+ ld a, " "
+ Coorda 11, 16
+ ld a, D_RIGHT | B_BUTTON | A_BUTTON
ld [wMenuWatchedKeys], a
- ld a, $1
+ ld a, 1
ld [wTopMenuItemX], a
call HandleMenuInput
- bit 4, a
- jr nz, .asm_56c3 ; 0x56b3 $e
- bit 1, a
- jr z, .asm_56df ; 0x56b7 $26
-.asm_56b9
+ bit 4, a ; Right pressed?
+ jr nz, .selectTradeMenuItem
+ bit 1, a ; B button pressed?
+ jr z, .displayPlayerMonStats
+.cancelPlayerMonChoice
pop af
ld [wCurrentMenuItem], a
call LoadScreenTilesFromBuffer1
- jp .asm_55dc
-.asm_56c3
- ld a, $7f
- ld [wTileMap + $141], a
- ld a, $23
+ jp .playerMonMenu
+.selectTradeMenuItem
+ ld a, " "
+ Coorda 1, 16
+ ld a, D_LEFT | B_BUTTON | A_BUTTON
ld [wMenuWatchedKeys], a
- ld a, $b
+ ld a, 11
ld [wTopMenuItemX], a
call HandleMenuInput
- bit 5, a
- jr nz, .asm_569f ; 0x56d7 $c6
- bit 1, a
- jr nz, .asm_56b9 ; 0x56db $dc
- jr .asm_56f9 ; 0x56dd $1a
-.asm_56df
+ bit 5, a ; Left pressed?
+ jr nz, .selectStatsMenuItem
+ bit 1, a ; B button pressed?
+ jr nz, .cancelPlayerMonChoice
+ jr .choseTrade
+.displayPlayerMonStats
pop af
ld [wCurrentMenuItem], a
ld a, $4
ld [wd11b], a
callab Func_39bd5
- call Func_57d6
+ call TradeCenter_DisplayStats
call LoadScreenTilesFromBuffer1
- jp .asm_55dc
-.asm_56f9
+ jp .playerMonMenu
+.choseTrade
call PlaceUnfilledArrowMenuCursor
pop af
ld [wCurrentMenuItem], a
- ld [wWhichTrade], a
- ld [wcc42], a
- call Func_226e
- ld a, [wcc3d]
+ ld [wTradingWhichPlayerMon], a
+ ld [wSerialExchangeNybbleSendData], a
+ call Serial_PrintWaitingTextAndSyncAndExchangeByte
+ ld a, [wSerialSyncAndExchangeNybbleReceiveData]
cp $f
- jp z, Func_551c
- ld [wTrainerEngageDistance], a
- call Func_57c7
- ld a, $1
- ld [wcc38], a
- jp Func_551c
+ jp z, CallCurrentTradeCenterFunction ; go back to the beginning of the trade selection menu if the other person cancelled
+ ld [wTradingWhichEnemyMon], a
+ call TradeCenter_PlaceSelectedEnemyMonMenuCursor
+ ld a, $1 ; TradeCenter_Trade
+ ld [wTradeCenterPointerTableIndex], a
+ jp CallCurrentTradeCenterFunction
.statsTrade
db "STATS TRADE@"
-.asm_572f
+.selectedCancelMenuItem
ld a, [wCurrentMenuItem]
ld b, a
ld a, [wMaxMenuItem]
cp b
- jp nz, .asm_565b
+ jp nz, .getNewInput
ld a, [wMenuCursorLocation]
ld l, a
ld a, [wMenuCursorLocation + 1]
ld h, a
- ld a, $7f
+ ld a, " "
ld [hl], a
-.asm_5745
- ld a, $ed
- ld [wTileMap + $141], a
-.asm_574a
+.cancelMenuItem_Loop
+ ld a, $ed ; filled arrow cursor
+ Coorda 1, 16
+.cancelMenuItem_JoypadLoop
call JoypadLowSensitivity
- ld a, [hJoy5]
- and a
- jr z, .asm_574a ; 0x5750 $f8
- bit 0, a
- jr nz, .asm_5769 ; 0x5754 $13
- bit 6, a
- jr z, .asm_574a ; 0x5758 $f0
- ld a, $7f
- ld [wTileMap + $141], a
+ ld a, [$ffb5]
+ and a ; pressed anything?
+ jr z, .cancelMenuItem_JoypadLoop
+ bit 0, a ; A button pressed?
+ jr nz, .cancelMenuItem_APressed
+ bit 6, a ; Up pressed?
+ jr z, .cancelMenuItem_JoypadLoop
+; if Up pressed
+ ld a, " "
+ Coorda 1, 16
ld a, [wPartyCount]
dec a
ld [wCurrentMenuItem], a
- jp .asm_55dc
-.asm_5769
- ld a, $ec
- ld [wTileMap + $141], a
+ jp .playerMonMenu
+.cancelMenuItem_APressed
+ ld a, $ec ; unfilled arrow cursor
+ Coorda 1, 16
ld a, $f
- ld [wcc42], a
- call Func_226e
- ld a, [wcc3d]
- cp $f
- jr nz, .asm_5745 ; 0x577b $c8
+ ld [wSerialExchangeNybbleSendData], a
+ call Serial_PrintWaitingTextAndSyncAndExchangeByte
+ ld a, [wSerialSyncAndExchangeNybbleReceiveData]
+ cp $f ; did the other person choose Cancel too?
+ jr nz, .cancelMenuItem_Loop
+ ; fall through
-Func_577d: ; 577d (1:577d)
+ReturnToCableClubRoom: ; 577d (1:577d)
call GBPalWhiteOutWithDelay3
ld hl, wcfc4
ld a, [hl]
@@ -579,64 +595,65 @@ Func_577d: ; 577d (1:577d)
call GBFadeInFromWhite
ret
-Func_57a2:
- ld hl, wTileMap + $137
+TradeCenter_DrawCancelBox:
+ hlCoord 11, 15
ld a, $7e
- ld bc, $0031
+ ld bc, 2 * 20 + 9
call FillMemory
- ld hl, wTileMap + $12c
- ld b, $1
- ld c, $9
- call Func_5ab3
- ld hl, wTileMap + $142
+ hlCoord 0, 15
+ ld b, 1
+ ld c, 9
+ call CableClub_TextBoxBorder
+ hlCoord 2, 16
ld de, CancelTextString
jp PlaceString
CancelTextString:
db "CANCEL@"
-Func_57c7:
- ld a, [wcc3d]
- ld hl, wTileMap + $b5
- ld bc, $0014
+TradeCenter_PlaceSelectedEnemyMonMenuCursor:
+ ld a, [wSerialSyncAndExchangeNybbleReceiveData]
+ hlCoord 1, 9
+ ld bc, 20
call AddNTimes
- ld [hl], $ec
+ ld [hl], $ec ; cursor
ret
-Func_57d6:
+TradeCenter_DisplayStats:
ld a, [wCurrentMenuItem]
ld [wWhichPokemon], a
predef StatusScreen
predef StatusScreen2
call GBPalNormal
call LoadTrainerInfoTextBoxTiles
- call Func_57f2
- jp Func_57a2
+ call TradeCenter_DrawPartyLists
+ jp TradeCenter_DrawCancelBox
-Func_57f2:
- ld hl, wTileMap
- ld b, $6
- ld c, $12
- call Func_5ab3
- ld hl, wTileMap + $a0
- ld b, $6
- ld c, $12
- call Func_5ab3
- ld hl, wTileMap + $5
+TradeCenter_DrawPartyLists:
+ hlCoord 0, 0
+ ld b, 6
+ ld c, 18
+ call CableClub_TextBoxBorder
+ hlCoord 0, 8
+ ld b, 6
+ ld c, 18
+ call CableClub_TextBoxBorder
+ hlCoord 5, 0
ld de, wPlayerName
call PlaceString
- ld hl, wTileMap + $a5
- ld de, W_GRASSRATE
+ hlCoord 5, 8
+ ld de, wLinkEnemyTrainerName
call PlaceString
- ld hl, wTileMap + $16
+ hlCoord 2, 1
ld de, wPartySpecies
- call Func_5827
- ld hl, wTileMap + $b6
+ call TradeCenter_PrintPartyListNames
+ hlCoord 2, 9
ld de, wEnemyPartyMons
+ ; fall through
-Func_5827:
+TradeCenter_PrintPartyListNames:
ld c, $0
-.asm_5829
+.loop
ld a, [de]
cp $ff
ret z
@@ -653,144 +670,146 @@ Func_5827:
pop de
inc de
pop hl
- ld bc, $0014
+ ld bc, 20
add hl, bc
pop bc
inc c
- jr .asm_5829 ; 0x5847 $e0
+ jr .loop
TradeCenter_Trade:
- ld c, $64
+ ld c, 100
call DelayFrames
xor a
- ld [wcc43], a
- ld [wcc3e], a
+ ld [wSerialExchangeNybbleSendData + 1], a ; unnecessary
+ ld [wSerialExchangeNybbleReceiveData], a
ld [wcc37], a
ld [wMenuJoypadPollCount], a
- ld hl, wTileMap + $f0
- ld b, $4
- ld c, $12
- call Func_5ab3
- ld a, [wWhichTrade]
+ hlCoord 0, 12
+ ld b, 4
+ ld c, 18
+ call CableClub_TextBoxBorder
+ ld a, [wTradingWhichPlayerMon]
ld hl, wPartySpecies
ld c, a
- ld b, $0
+ ld b, 0
add hl, bc
ld a, [hl]
ld [wd11e], a
call GetMonName
ld hl, wcd6d
- ld de, wTrainerFacingDirection
- ld bc, $000b
+ ld de, wNameOfPlayerMonToBeTraded
+ ld bc, 11
call CopyData
- ld a, [wTrainerEngageDistance]
+ ld a, [wTradingWhichEnemyMon]
ld hl, wEnemyPartyMons
ld c, a
- ld b, $0
+ ld b, 0
add hl, bc
ld a, [hl]
ld [wd11e], a
call GetMonName
ld hl, WillBeTradedText
- ld bc, wTileMap + $119
+ bcCoord 1, 14
call TextCommandProcessor
call SaveScreenTilesToBuffer1
- ld hl, wTileMap + $96
+ hlCoord 10, 7
ld bc, $080b
- ld a, $5
- ld [wd12c], a
+ ld a, TRADE_CANCEL_MENU
+ ld [wTwoOptionMenuID], a
ld a, $14
- ld [wd125], a
+ ld [wTextBoxID], a
call DisplayTextBoxID
call LoadScreenTilesFromBuffer1
ld a, [wCurrentMenuItem]
and a
- jr z, .asm_58d9 ; 0x58b9 $1e
+ jr z, .tradeConfirmed
+; if trade cancelled
ld a, $1
- ld [wcc42], a
- ld hl, wTileMap + $f0
- ld b, $4
- ld c, $12
- call Func_5ab3
- ld hl, wTileMap + $119
+ ld [wSerialExchangeNybbleSendData], a
+ hlCoord 0, 12
+ ld b, 4
+ ld c, 18
+ call CableClub_TextBoxBorder
+ hlCoord 1, 14
ld de, TradeCanceled
call PlaceString
- call Func_226e
- jp Func_5a18
-.asm_58d9
+ call Serial_PrintWaitingTextAndSyncAndExchangeByte
+ jp .tradeCancelled
+.tradeConfirmed
ld a, $2
- ld [wcc42], a
- call Func_226e
- ld a, [wcc3d]
- dec a
- jr nz, .asm_58fd ; 0x58e5 $16
- ld hl, wTileMap + $f0
- ld b, $4
- ld c, $12
- call Func_5ab3
- ld hl, wTileMap + $119
+ ld [wSerialExchangeNybbleSendData], a
+ call Serial_PrintWaitingTextAndSyncAndExchangeByte
+ ld a, [wSerialSyncAndExchangeNybbleReceiveData]
+ dec a ; did the other person cancel?
+ jr nz, .doTrade
+; if the other person cancelled
+ hlCoord 0, 12
+ ld b, 4
+ ld c, 18
+ call CableClub_TextBoxBorder
+ hlCoord 1, 14
ld de, TradeCanceled
call PlaceString
- jp Func_5a18
-.asm_58fd
- ld a, [wWhichTrade]
- ld hl, wPartyMonOT ; OT names of player
+ jp .tradeCancelled
+.doTrade
+ ld a, [wTradingWhichPlayerMon]
+ ld hl, wPartyMonOT
call SkipFixedLengthTextEntries
- ld de, wTrainerScreenX
- ld bc, $000b
+ ld de, wTradedPlayerMonOT
+ ld bc, 11
call CopyData
ld hl, wPartyMon1Species
- ld a, [wWhichTrade]
- ld bc, $002c
+ ld a, [wTradingWhichPlayerMon]
+ ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
- ld bc, $000c
+ ld bc, wPartyMon1OTID - wPartyMon1
add hl, bc
ld a, [hli]
- ld [wcd4c], a
+ ld [wTradedPlayerMonOTID], a
ld a, [hl]
- ld [wcd4d], a
- ld a, [wTrainerEngageDistance]
- ld hl, wEnemyMonOT ; OT names of other player
+ ld [wTradedPlayerMonOTID + 1], a
+ ld a, [wTradingWhichEnemyMon]
+ ld hl, wEnemyMonOT
call SkipFixedLengthTextEntries
- ld de, wcd4e
- ld bc, $000b
+ ld de, wTradedEnemyMonOT
+ ld bc, 11
call CopyData
ld hl, wEnemyMons
- ld a, [wTrainerEngageDistance]
- ld bc, $002c
+ ld a, [wTradingWhichEnemyMon]
+ ld bc, wEnemyMon2 - wEnemyMon1
call AddNTimes
- ld bc, $000c
+ ld bc, wEnemyMon1OTID - wEnemyMon1
add hl, bc
ld a, [hli]
- ld [wcd59], a
+ ld [wTradedEnemyMonOTID], a
ld a, [hl]
- ld [wcd5a], a
- ld a, [wWhichTrade]
+ ld [wTradedEnemyMonOTID + 1], a
+ ld a, [wTradingWhichPlayerMon]
ld [wWhichPokemon], a
ld hl, wPartySpecies
- ld b, $0
+ ld b, 0
ld c, a
add hl, bc
ld a, [hl]
- ld [wWhichTrade], a
+ ld [wTradedPlayerMonSpecies], a
xor a
ld [wcf95], a
call RemovePokemon
- ld a, [wTrainerEngageDistance]
+ ld a, [wTradingWhichEnemyMon]
ld c, a
ld [wWhichPokemon], a
ld hl, wEnemyPartyMons
- ld d, $0
+ ld d, 0
ld e, a
add hl, de
ld a, [hl]
ld [wcf91], a
ld hl, wEnemyMons
ld a, c
- ld bc, $002c
+ ld bc, wEnemyMon2 - wEnemyMon1
call AddNTimes
ld de, wcf98
- ld bc, $002c
+ ld bc, wEnemyMon2 - wEnemyMon1
call CopyData
call AddEnemyMonToPlayerParty
ld a, [wPartyCount]
@@ -798,13 +817,13 @@ TradeCenter_Trade:
ld [wWhichPokemon], a
ld a, $1
ld [wccd4], a
- ld a, [wTrainerEngageDistance]
+ ld a, [wTradingWhichEnemyMon]
ld hl, wEnemyPartyMons
- ld b, $0
+ ld b, 0
ld c, a
add hl, bc
ld a, [hl]
- ld [wTrainerEngageDistance], a
+ ld [wTradedEnemyMonSpecies], a
ld a, $a
ld [wMusicHeaderPointer], a
ld a, $2
@@ -812,46 +831,45 @@ TradeCenter_Trade:
ld a, MUSIC_SAFARI_ZONE
ld [wc0ee], a
call PlaySound
- ld c, $64
+ ld c, 100
call DelayFrames
call ClearScreen
call LoadHpBarAndStatusTilePatterns
xor a
ld [wcc5b], a
- ld a, [$ffaa]
- cp $1
- jr z, .asm_59d9 ; 0x59d0 $7
+ ld a, [hSerialConnectionStatus]
+ cp USING_EXTERNAL_CLOCK
+ jr z, .usingExternalClock
predef Func_410e2
- jr .asm_59de ; 0x59d7 $5
-.asm_59d9
+ jr .tradeCompleted
+.usingExternalClock
predef Func_410f3
-.asm_59de
+.tradeCompleted
callab TryEvolvingMon
call ClearScreen
call LoadTrainerInfoTextBoxTiles
- call Func_226e
- ld c, $28
+ call Serial_PrintWaitingTextAndSyncAndExchangeByte
+ ld c, 40
call DelayFrames
- ld hl, wTileMap + $f0
- ld b, $4
- ld c, $12
- call Func_5ab3
- ld hl, wTileMap + $119
+ hlCoord 0, 12
+ ld b, 4
+ ld c, 18
+ call CableClub_TextBoxBorder
+ hlCoord 1, 14
ld de, TradeCompleted
call PlaceString
predef SaveSAVtoSRAM2
- ld c, $32
+ ld c, 50
call DelayFrames
xor a
- ld [wcc38], a
- jp Func_5345
-
-Func_5a18:
- ld c, $64
+ ld [wTradeCenterPointerTableIndex], a
+ jp CableClub_DoBattleOrTradeAgain
+.tradeCancelled
+ ld c, 100
call DelayFrames
- xor a
- ld [wcc38], a
- jp Func_551c
+ xor a ; TradeCenter_SelectMon
+ ld [wTradeCenterPointerTableIndex], a
+ jp CallCurrentTradeCenterFunction
WillBeTradedText: ; 5a24 (1:5a24)
TX_FAR _WillBeTradedText
@@ -864,22 +882,22 @@ TradeCanceled:
db "Too bad! The trade"
next "was canceled!@"
-PointerTable_5a5b: ; 5a5b (1:5a5b)
+TradeCenterPointerTable: ; 5a5b (1:5a5b)
dw TradeCenter_SelectMon
dw TradeCenter_Trade
-Func_5a5f: ; 5a5f (1:5a5f)
- ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
- cp $2
- jr z, .asm_5a75
- cp $3
- jr z, .asm_5a75
- cp $5
+CableClub_Run: ; 5a5f (1:5a5f)
+ ld a, [wLinkState]
+ cp LINK_STATE_START_TRADE
+ jr z, .doBattleOrTrade
+ cp LINK_STATE_START_BATTLE
+ jr z, .doBattleOrTrade
+ cp LINK_STATE_RESET ; this is never used
ret nz
- predef Func_5aaf
+ predef EmptyFunc3
jp Init
-.asm_5a75
- call Func_5317
+.doBattleOrTrade
+ call CableClub_DoBattleOrTrade
ld hl, Club_GFX
ld a, h
ld [W_TILESETGFXPTR + 1], a
@@ -893,10 +911,10 @@ Func_5a5f: ; 5a5f (1:5a5f)
ld a, l
ld [W_TILESETCOLLISIONPTR], a
xor a
- ld [W_GRASSRATE], a ; W_GRASSRATE
- inc a
- ld [W_ISLINKBATTLE], a ; W_ISLINKBATTLE
- ld [hJoy5], a
+ ld [W_GRASSRATE], a
+ inc a ; LINK_STATE_IN_CABLE_CLUB
+ ld [wLinkState], a
+ ld [$ffb5], a
ld a, $a
ld [wMusicHeaderPointer], a
ld a, BANK(Music_Celadon)
@@ -905,43 +923,46 @@ Func_5a5f: ; 5a5f (1:5a5f)
ld [wc0ee], a
jp PlaySound
-Func_5aaf: ; 5aaf (1:5aaf)
+EmptyFunc3: ; 5aaf (1:5aaf)
ret
-Func_5ab0:
+Diploma_TextBoxBorder: ; 5ab0 (1:5ab0)
call GetPredefRegisters
-Func_5ab3: ; 5ab3 (1:5ab3)
+; b = height
+; c = width
+CableClub_TextBoxBorder: ; 5ab3 (1:5ab3)
push hl
- ld a, $78
+ ld a, $78 ; border upper left corner tile
ld [hli], a
- inc a
- call Func_5ae0
- inc a
+ inc a ; border top horizontal line tile
+ call CableClub_DrawHorizontalLine
+ inc a ; border upper right corner tile
ld [hl], a
pop hl
- ld de, $14
+ ld de, 20
add hl, de
-.asm_5ac2
+.loop
push hl
- ld a, $7b
+ ld a, $7b ; border left vertical line tile
ld [hli], a
- ld a, $7f
- call Func_5ae0
- ld [hl], $77
+ ld a, " "
+ call CableClub_DrawHorizontalLine
+ ld [hl], $77 ; border right vertical line tile
pop hl
- ld de, $14
+ ld de, 20
add hl, de
dec b
- jr nz, .asm_5ac2
- ld a, $7c
+ jr nz, .loop
+ ld a, $7c ; border lower left corner tile
ld [hli], a
- ld a, $76
- call Func_5ae0
- ld [hl], $7d
+ ld a, $76 ; border bottom horizontal line tile
+ call CableClub_DrawHorizontalLine
+ ld [hl], $7d ; border lower right corner tile
ret
-Func_5ae0: ; 5ae0 (1:5ae0)
+; c = width
+CableClub_DrawHorizontalLine: ; 5ae0 (1:5ae0)
ld d, c
.asm_5ae1
ld [hli], a