1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
; sets up to start a link duel
; decides which device will pick the number of prizes
; then exchanges names and duels between the players
; and starts the main duel routine
_SetUpAndStartLinkDuel:
ld hl, sp+$00
ld a, l
ld [wDuelReturnAddress + 0], a
ld a, h
ld [wDuelReturnAddress + 1], a
call SetSpriteAnimationsAsVBlankFunction
ld a, SCENE_GAMEBOY_LINK_TRANSMITTING
lb bc, 0, 0
call LoadScene
bank1call LoadPlayerDeck
call SwitchToCGBNormalSpeed
bank1call DecideLinkDuelVariables
push af
call RestoreVBlankFunction
pop af
jp c, .error
ld a, DUELIST_TYPE_PLAYER
ld [wPlayerDuelistType], a
ld a, DUELIST_TYPE_LINK_OPP
ld [wOpponentDuelistType], a
ld a, DUELTYPE_LINK
ld [wDuelType], a
call EmptyScreen
ld a, [wSerialOp]
cp $29
jr nz, .asm_1a540
ld a, PLAYER_TURN
ldh [hWhoseTurn], a
call .ExchangeNamesAndDecks
jr c, .error
lb de, 6, 2
lb bc, 8, 6
call DrawRegularTextBox
lb de, 7, 4
call InitTextPrinting
ldtx hl, PrizesCardsText
call ProcessTextFromID
ldtx hl, ChooseTheNumberOfPrizesText
call DrawWideTextBox_PrintText
call EnableLCD
call .PickNumberOfPrizeCards
ld a, [wNPCDuelPrizes]
call SerialSend8Bytes
jr .prizes_decided
.asm_1a540
ld a, OPPONENT_TURN
ldh [hWhoseTurn], a
call .ExchangeNamesAndDecks
jr c, .error
ldtx hl, PleaseWaitDecidingNumberOfPrizesText
call DrawWideTextBox_PrintText
call EnableLCD
call SerialRecv8Bytes
ld [wNPCDuelPrizes], a
.prizes_decided
call ExchangeRNG
ld a, LINK_OPP_PIC
ld [wOpponentPortrait], a
ldh a, [hWhoseTurn]
push af
call EmptyScreen
bank1call SetDefaultConsolePalettes
ld a, SHUFFLE_DECK
ld [wDuelDisplayedScreen], a
bank1call DrawDuelistPortraitsAndNames
ld a, OPPONENT_TURN
ldh [hWhoseTurn], a
ld a, [wNPCDuelPrizes]
ld l, a
ld h, $00
call LoadTxRam3
ldtx hl, BeginAPrizeDuelWithText
call DrawWideTextBox_WaitForInput
pop af
ldh [hWhoseTurn], a
call ExchangeRNG
bank1call StartDuel_VSLinkOpp
call SwitchToCGBDoubleSpeed
ret
.error
ld a, -1
ld [wDuelResult], a
call SetSpriteAnimationsAsVBlankFunction
ld a, SCENE_GAMEBOY_LINK_NOT_CONNECTED
lb bc, 0, 0
call LoadScene
ldtx hl, TransmissionErrorText
call DrawWideTextBox_WaitForInput
call RestoreVBlankFunction
call ResetSerial
ret
.ExchangeNamesAndDecks
ld de, wDefaultText
push de
call CopyPlayerName
pop hl
ld de, wNameBuffer
ld c, NAME_BUFFER_LENGTH
call SerialExchangeBytes
ret c
xor a
ld hl, wOpponentName
ld [hli], a
ld [hl], a
ld hl, wPlayerDeck
ld de, wOpponentDeck
ld c, DECK_SIZE
call SerialExchangeBytes
ret
; handles player choice of number of prize cards
; pressing left/right makes it decrease/increase respectively
; selection is confirmed by pressing A button
.PickNumberOfPrizeCards
ld a, PRIZES_4
ld [wNPCDuelPrizes], a
xor a
ld [wPrizeCardSelectionFrameCounter], a
.loop_input
call DoFrame
ld a, [wNPCDuelPrizes]
add SYM_0
ld e, a
; check frame counter so that it
; either blinks or shows number
ld hl, wPrizeCardSelectionFrameCounter
ld a, [hl]
inc [hl]
and $10
jr z, .no_blink
ld e, SYM_SPACE
.no_blink
ld a, e
lb bc, 9, 6
call WriteByteToBGMap0
ldh a, [hDPadHeld]
ld b, a
ld a, [wNPCDuelPrizes]
bit D_LEFT_F, b
jr z, .check_d_right
dec a
cp PRIZES_2
jr nc, .got_prize_count
ld a, PRIZES_6 ; wrap around to 6
jr .got_prize_count
.check_d_right
bit D_RIGHT_F, b
jr z, .check_a_btn
inc a
cp PRIZES_6 + 1
jr c, .got_prize_count
ld a, PRIZES_2
.got_prize_count
ld [wNPCDuelPrizes], a
xor a
ld [wPrizeCardSelectionFrameCounter], a
.check_a_btn
bit A_BUTTON_F, b
jr z, .loop_input
ret
|