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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
; return, in hl, the total amount of cards owned anywhere, including duplicates
GetAmountOfCardsOwned:
push de
push bc
call EnableSRAM
ld hl, $0000
ld de, sDeck1Cards
ld c, NUM_DECKS
.next_deck
ld a, [de]
or a
jr z, .skip_deck ; jump if deck empty
ld a, c
ld bc, DECK_SIZE
add hl, bc
ld c, a
.skip_deck
ld a, sDeck2Cards - sDeck1Cards
add e
ld e, a
ld a, $0
adc d
ld d, a ; de = sDeck*Cards[x]
dec c
jr nz, .next_deck
; hl = DECK_SIZE * (no. of non-empty decks)
ld de, sCardCollection
.next_card
ld a, [de]
bit CARD_NOT_OWNED_F, a
jr nz, .skip_card
ld c, a ; card count in sCardCollection
ld b, $0
add hl, bc
.skip_card
inc e
jr nz, .next_card ; assumes sCardCollection is $100 bytes long (CARD_COLLECTION_SIZE)
call DisableSRAM
pop bc
pop de
ret
; return carry if the count in sCardCollection plus the count in each deck (sDeck*)
; of the card with id given in a is 0 (if card not owned).
; also return the count (total owned amount) in a.
GetCardCountInCollectionAndDecks:
push hl
push de
push bc
call EnableSRAM
ld c, a
ld b, $0
ld hl, sDeck1Cards
ld d, NUM_DECKS
.next_deck
ld a, [hl]
or a
jr z, .deck_done ; jump if deck empty
push hl
ld e, DECK_SIZE
.next_card
ld a, [hli]
cp c
jr nz, .no_match
inc b ; this deck card matches card c
.no_match
dec e
jr nz, .next_card
pop hl
.deck_done
push de
ld de, sDeck2Cards - sDeck1Cards
add hl, de
pop de
dec d
jr nz, .next_deck
; all decks done
ld h, HIGH(sCardCollection)
ld l, c
ld a, [hl]
bit CARD_NOT_OWNED_F, a
jr nz, .done
add b ; if card seen, add b to count
.done
and CARD_COUNT_MASK
call DisableSRAM
pop bc
pop de
pop hl
or a
ret nz
scf
ret
; return carry if the count in sCardCollection of the card with id given in a is 0.
; also return the count (amount owned outside of decks) in a.
GetCardCountInCollection:
push hl
call EnableSRAM
ld h, HIGH(sCardCollection)
ld l, a
ld a, [hl]
call DisableSRAM
pop hl
and CARD_COUNT_MASK
ret nz
scf
ret
; creates a list at wTempCardCollection of every card the player owns and how many
CreateTempCardCollection:
call EnableSRAM
ld hl, sCardCollection
ld de, wTempCardCollection
ld bc, CARD_COLLECTION_SIZE
call CopyDataHLtoDE
ld de, sDeck1Name
call AddDeckCardsToTempCardCollection
ld de, sDeck2Name
call AddDeckCardsToTempCardCollection
ld de, sDeck3Name
call AddDeckCardsToTempCardCollection
ld de, sDeck4Name
call AddDeckCardsToTempCardCollection
call DisableSRAM
ret
; adds the cards from a deck to wTempCardCollection given de = sDeck*Name
AddDeckCardsToTempCardCollection:
ld a, [de]
or a
ret z ; return if empty name (empty deck)
ld hl, sDeck1Cards - sDeck1Name
add hl, de
ld e, l
ld d, h
ld h, HIGH(wTempCardCollection)
ld c, DECK_SIZE
.next_card_loop
ld a, [de] ; count of current card being added
inc de ; move to next card for next iteration
ld l, a
inc [hl] ; increment count
dec c
jr nz, .next_card_loop
ret
; add card with id given in a to sCardCollection, provided that
; the player has less than MAX_AMOUNT_OF_CARD (99) of them
AddCardToCollection:
push hl
push de
push bc
ld l, a
push hl
call CreateTempCardCollection
pop hl
call EnableSRAM
ld h, HIGH(wTempCardCollection)
ld a, [hl]
and CARD_COUNT_MASK
cp MAX_AMOUNT_OF_CARD
jr nc, .already_max
ld h, HIGH(sCardCollection)
ld a, [hl]
and CARD_COUNT_MASK
inc a
ld [hl], a
.already_max
call DisableSRAM
pop bc
pop de
pop hl
ret
; remove a card with id given in a from sCardCollection (decrement its count if non-0)
RemoveCardFromCollection:
push hl
call EnableSRAM
ld h, HIGH(sCardCollection)
ld l, a
ld a, [hl]
and CARD_COUNT_MASK
jr z, .zero
dec a
ld [hl], a
.zero
call DisableSRAM
pop hl
ret
; return the amount of different cards that the player has collected in d
; return NUM_CARDS in e, minus 1 if VENUSAUR1 or MEW2 has not been collected (minus 2 if neither)
GetCardAlbumProgress:
push hl
call EnableSRAM
ld e, NUM_CARDS
ld h, HIGH(sCardCollection)
ld l, VENUSAUR1
bit CARD_NOT_OWNED_F, [hl]
jr z, .next1
dec e ; if VENUSAUR1 not owned
.next1
ld l, MEW2
bit CARD_NOT_OWNED_F, [hl]
jr z, .next2
dec e ; if MEW2 not owned
.next2
ld d, LOW(sCardCollection)
ld l, d
.next_card
bit CARD_NOT_OWNED_F, [hl]
jr nz, .skip
inc d ; if this card owned
.skip
inc l
jr nz, .next_card ; assumes sCardCollection is $100 bytes long (CARD_COLLECTION_SIZE)
call DisableSRAM
pop hl
ret
|