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
|
; sets up the initial hand of boss deck.
; always draws at least 2 Basic Pokemon cards and 2 Energy cards.
; also sets up so that the next cards to be drawn have
; some minimum number of Basic Pokemon and Energy cards.
SetUpBossStartingHandAndDeck:
; shuffle all hand cards in deck
ld a, DUELVARS_HAND
call GetTurnDuelistVariable
ld b, STARTING_HAND_SIZE
.loop_hand
ld a, [hl]
call RemoveCardFromHand
call ReturnCardToDeck
dec b
jr nz, .loop_hand
jr .count_energy_basic
.shuffle_deck
call ShuffleDeck
; count number of Energy and basic Pokemon cards
; in the first STARTING_HAND_SIZE in deck.
.count_energy_basic
xor a
ld [wAISetupBasicPokemonCount], a
ld [wAISetupEnergyCount], a
ld a, DUELVARS_DECK_CARDS
call GetTurnDuelistVariable
ld b, STARTING_HAND_SIZE
.loop_deck_1
ld a, [hli]
push bc
call LoadCardDataToBuffer1_FromDeckIndex
pop bc
ld a, [wLoadedCard1Type]
cp TYPE_ENERGY
jr c, .pokemon_card_1
cp TYPE_TRAINER
jr z, .next_card_deck_1
; energy card
ld a, [wAISetupEnergyCount]
inc a
ld [wAISetupEnergyCount], a
jr .next_card_deck_1
.pokemon_card_1
ld a, [wLoadedCard1Stage]
or a
jr nz, .next_card_deck_1 ; not basic
ld a, [wAISetupBasicPokemonCount]
inc a
ld [wAISetupBasicPokemonCount], a
.next_card_deck_1
dec b
jr nz, .loop_deck_1
; tally the number of Energy and basic Pokemon cards
; and if any of them is smaller than 2, re-shuffle deck.
ld a, [wAISetupBasicPokemonCount]
cp 2
jr c, .shuffle_deck
ld a, [wAISetupEnergyCount]
cp 2
jr c, .shuffle_deck
; now check the following 6 cards (prize cards).
; re-shuffle deck if any of these cards is listed in wAICardListAvoidPrize.
ld b, 6
.check_card_ids
ld a, [hli]
push bc
call .CheckIfIDIsInList
pop bc
jr c, .shuffle_deck
dec b
jr nz, .check_card_ids
; finally, check 6 cards after that.
; if Energy or Basic Pokemon counter is below 4
; (counting with the ones found in the initial hand)
; then re-shuffle deck.
ld b, 6
.loop_deck_2
ld a, [hli]
push bc
call LoadCardDataToBuffer1_FromDeckIndex
pop bc
ld a, [wLoadedCard1Type]
cp TYPE_ENERGY
jr c, .pokemon_card_2
cp TYPE_TRAINER
jr z, .next_card_deck_2
; energy card
ld a, [wAISetupEnergyCount]
inc a
ld [wAISetupEnergyCount], a
jr .next_card_deck_2
.pokemon_card_2
ld a, [wLoadedCard1Stage]
or a
jr nz, .next_card_deck_2
ld a, [wAISetupBasicPokemonCount]
inc a
ld [wAISetupBasicPokemonCount], a
.next_card_deck_2
dec b
jr nz, .loop_deck_2
ld a, [wAISetupBasicPokemonCount]
cp 4
jp c, .shuffle_deck
ld a, [wAISetupEnergyCount]
cp 4
jp c, .shuffle_deck
; draw new set of hand cards
ld a, DUELVARS_DECK_CARDS
call GetTurnDuelistVariable
ld b, STARTING_HAND_SIZE
.draw_loop
ld a, [hli]
call SearchCardInDeckAndAddToHand
call AddCardToHand
dec b
jr nz, .draw_loop
ret
; expectation: return carry if card ID corresponding
; to the input deck index is listed in wAICardListAvoidPrize;
; reality: always returns no carry because when checking terminating
; byte in wAICardListAvoidPrize ($00), it wrongfully uses 'cp a' instead of 'or a',
; so it always ends up returning in the first item in list.
; input:
; - a = deck index of card to check
.CheckIfIDIsInList ; 17366 (5:7366)
ld b, a
ld a, [wAICardListAvoidPrize + 1]
or a
ret z ; null
push hl
ld h, a
ld a, [wAICardListAvoidPrize]
ld l, a
ld a, b
call GetCardIDFromDeckIndex
.loop_id_list
ld a, [hli]
cp a ; bug, should be 'or a'
jr z, .false
cp e
jr nz, .loop_id_list
; true
pop hl
scf
ret
.false
pop hl
or a
ret
|