summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/constants/card_data_constants.asm15
-rwxr-xr-xsrc/engine/bank4.asm6
-rwxr-xr-xsrc/engine/bank7.asm2
-rwxr-xr-xsrc/engine/boosters.asm993
-rwxr-xr-xsrc/engine/home.asm103
-rwxr-xr-xsrc/main.asm1
-rwxr-xr-xsrc/sram.asm17
-rwxr-xr-xsrc/wram.asm77
8 files changed, 1200 insertions, 14 deletions
diff --git a/src/constants/card_data_constants.asm b/src/constants/card_data_constants.asm
index 1148490..8ee2ed3 100644
--- a/src/constants/card_data_constants.asm
+++ b/src/constants/card_data_constants.asm
@@ -2,6 +2,7 @@ PKMN_CARD_DATA_LENGTH EQU $41
TRN_CARD_DATA_LENGTH EQU $0e
ENERGY_CARD_DATA_LENGTH EQU $0e
+DECK_NAME_SIZE EQU 24
DECK_SIZE EQU 60
BENCH_SIZE EQU 5
@@ -99,3 +100,17 @@ FLAG_3_BIT_1 EQU %00000010
;;; special retreat values
UNABLE_RETREAT EQU $64
+
+CARD_COLLECTION_SIZE EQU $100
+
+;----BOOSTER CARD TYPES----
+BOOSTER_CARD_TYPE_GRASS EQU $00
+BOOSTER_CARD_TYPE_FIRE EQU $01
+BOOSTER_CARD_TYPE_LIGHTNING EQU $03
+BOOSTER_CARD_TYPE_WATER EQU $02
+BOOSTER_CARD_TYPE_FIGHTING EQU $04
+BOOSTER_CARD_TYPE_PSYCHIC EQU $05
+BOOSTER_CARD_TYPE_COLORLESS EQU $06
+BOOSTER_CARD_TYPE_TRAINER EQU $07
+BOOSTER_CARD_TYPE_ENERGY EQU $08
+BOOSTER_CARD_TYPE_AMOUNT EQU $09
diff --git a/src/engine/bank4.asm b/src/engine/bank4.asm
index 4796f98..1ab3f13 100755
--- a/src/engine/bank4.asm
+++ b/src/engine/bank4.asm
@@ -100,7 +100,7 @@ BoosterPack_1031b: ; 1031b (4:431b)
call PlaySong
pop bc
ld a, c
- farcallx $7, $61c4
+ farcallx $7, GenerateBoosterPack
text_hl ReceivedBoosterPackText
ld a, [$d117]
cp $1
@@ -561,7 +561,7 @@ Func_11102: ; 11102 (4:5102)
ld [hl], a
ld b, c
ld c, $0
- call Func_3c5a
+ call DivideBCbyDE
ld a, [$d346]
bit 7, a
jr z, .asm_11127
@@ -597,7 +597,7 @@ Func_1113e: ; 1113e (4:513e)
.asm_11152
ld [hl], a
ld c, $0
- call Func_3c5a
+ call DivideBCbyDE
ld a, [$d344]
bit 7, a
jr z, .asm_11162
diff --git a/src/engine/bank7.asm b/src/engine/bank7.asm
index ed1f96c..e8d9743 100755
--- a/src/engine/bank7.asm
+++ b/src/engine/bank7.asm
@@ -311,4 +311,4 @@ Credits_1d6ad: ; 1d6ad (7:56ad)
ret
; 0x1d705
-INCBIN "baserom.gbc",$1d705,$20000 - $1d705
+INCBIN "baserom.gbc",$1d705,$1e1c4 - $1d705
diff --git a/src/engine/boosters.asm b/src/engine/boosters.asm
new file mode 100755
index 0000000..c6d5caf
--- /dev/null
+++ b/src/engine/boosters.asm
@@ -0,0 +1,993 @@
+GenerateBoosterPack: ; 1e1c4 (7:61c4)
+ push hl
+ push bc
+ push de
+ ld [wBoosterDataIndex], a
+.noCardsFoundLoop
+ call InitBoosterData
+ call GenerateBoosterEnergy
+ call GenerateBoosterCard
+ jr c, .noCardsFoundLoop
+ call CopyBoosterEnergiesToBooster
+ call AddBoosterCardsToCollection
+ pop de
+ pop bc
+ pop hl
+ ret
+
+GenerateBoosterCard: ; 1e1df (7:61df)
+ ld a, STAR
+ ld [wBoosterCurrRarity], a
+.generateCardLoop
+ call FindCurrRarityChance
+ ld a, [hl]
+ or a
+ jr z, .noMoreOfCurrentRarity
+ call FindCardsInSetAndRarity
+ call FindTotalTypeChances
+ or a
+ jr z, .noValidCards
+ call Random
+ call DetermineBoosterCardType
+ call FindBoosterCard
+ call UpdateBoosterCardTypesChanceByte
+ call AddCardToBoosterList
+ call FindCurrRarityChance
+ dec [hl]
+ jr .generateCardLoop
+.noMoreOfCurrentRarity
+ ld a, [wBoosterCurrRarity]
+ dec a
+ ld [wBoosterCurrRarity], a
+ bit 7, a
+ jr z, .generateCardLoop
+ or a
+ ret
+.noValidCards
+ rst $38
+ scf
+ ret
+
+FindCurrRarityChance: ; 1e219 (7:6219)
+ push bc
+ ld hl, wBoosterDataCommonAmount
+ ld a, [wBoosterCurrRarity]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ pop bc
+ ret
+
+FindCardsInSetAndRarity: ; 1e226 (7:6226)
+ ld c, BOOSTER_CARD_TYPE_AMOUNT
+ ld hl, wBoosterAmountOfCardTypeTable
+ xor a
+.deleteTypeTableLoop
+ ld [hli], a
+ dec c
+ jr nz, .deleteTypeTableLoop
+ xor a
+ ld hl, wBoosterViableCardList
+ ld [hl], a
+ ld de, $1
+.checkCardViableLoop
+ push de
+ ld a, e
+ ld [wBoosterTempData], a
+ call CheckByteInWramZeroed
+ jr c, .finishedWithCurrentCard
+ call CheckCardViable
+ jr c, .finishedWithCurrentCard
+ ld a, [wBoosterCurrentCardType]
+ call GetCardType
+ push af
+ push hl
+ ld c, a
+ ld b, $00
+ ld hl, wBoosterAmountOfCardTypeTable
+ add hl, bc
+ inc [hl]
+ pop hl
+ ld a, [wBoosterTempData]
+ ld [hli], a
+ pop af
+ ld [hli], a
+ xor a
+ ld [hl], a
+.finishedWithCurrentCard
+ pop de
+ inc e
+ ld a, e
+ cp NUM_CARDS + 1
+ jr c, .checkCardViableLoop
+ ret
+
+CheckCardViable: ; 1e268 (7:6268)
+ push bc
+ ld a, e
+ call GetCardHeader
+ ld [wBoosterCurrentCardType], a
+ ld a, b
+ ld [wBoosterCurrentCardRarity], a
+ ld a, c
+ ld [wBoosterCurrentCardSet], a
+ ld a, [wBoosterCurrentCardRarity]
+ ld c, a
+ ld a, [wBoosterCurrRarity]
+ cp c
+ jr nz, .invalidCard
+ ld a, [wBoosterCurrentCardType]
+ call GetCardType
+ cp BOOSTER_CARD_TYPE_ENERGY
+ jr z, .returnValidCard
+ ld a, [wBoosterCurrentCardSet]
+ swap a
+ and $0f
+ ld c, a
+ ld a, [wBoosterDataRarityIndex]
+ cp c
+ jr nz, .invalidCard
+.returnValidCard
+ or a
+ jr .return
+.invalidCard
+ scf
+.return
+ pop bc
+ ret
+
+GetCardType: ; 1e2a0 (7:62a0)
+ push hl
+ push bc
+ ld hl, CardTypeTable
+ cp $11
+ jr nc, .skipToTypeLoad
+ ld c, a
+ ld b, $00
+ add hl, bc
+.skipToTypeLoad
+ ld a, [hl]
+ pop bc
+ pop hl
+ ret
+
+CardTypeTable: ; 1e2b1 (7:62b1)
+ db BOOSTER_CARD_TYPE_FIRE
+ db BOOSTER_CARD_TYPE_GRASS
+ db BOOSTER_CARD_TYPE_LIGHTNING
+ db BOOSTER_CARD_TYPE_WATER
+ db BOOSTER_CARD_TYPE_FIGHTING
+ db BOOSTER_CARD_TYPE_PSYCHIC
+ db BOOSTER_CARD_TYPE_COLORLESS
+ db BOOSTER_CARD_TYPE_TRAINER
+ db BOOSTER_CARD_TYPE_ENERGY
+ db BOOSTER_CARD_TYPE_ENERGY
+ db BOOSTER_CARD_TYPE_ENERGY
+ db BOOSTER_CARD_TYPE_ENERGY
+ db BOOSTER_CARD_TYPE_ENERGY
+ db BOOSTER_CARD_TYPE_ENERGY
+ db BOOSTER_CARD_TYPE_ENERGY
+ db BOOSTER_CARD_TYPE_TRAINER
+ db BOOSTER_CARD_TYPE_TRAINER
+
+FindTotalTypeChances: ; 1e2c2 (7:62c2)
+ ld c, BOOSTER_CARD_TYPE_AMOUNT
+ xor a
+ ld hl, wBoosterTempTypeChanceTable
+.deleteTempTypeChanceTableLoop
+ ld [hli], a
+ dec c
+ jr nz, .deleteTempTypeChanceTableLoop
+ ld [wd4ca], a
+ ld bc, $00
+.checkIfTypeIsValid
+ push bc
+ ld hl, wBoosterAmountOfCardTypeTable
+ add hl, bc
+ ld a, [hl]
+ or a
+ jr z, .amountOfTypeOrChanceZero
+ ld hl, wBoosterDataTypeChanceData
+ add hl, bc
+ ld a, [hl]
+ or a
+ jr z, .amountOfTypeOrChanceZero
+ ld hl, wBoosterTempTypeChanceTable
+ add hl, bc
+ ld [hl], a
+ ld a, [wd4ca]
+ add [hl]
+ ld [wd4ca], a
+.amountOfTypeOrChanceZero
+ pop bc
+ inc c
+ ld a, c
+ cp $09
+ jr c, .checkIfTypeIsValid
+ ld a, [wd4ca]
+ ret
+
+DetermineBoosterCardType: ; 1e2fa (7:62fa)
+ ld [wd4ca], a
+ ld c, $00
+ ld hl, wBoosterTempTypeChanceTable
+.loopThroughCardTypes
+ ld a, [hl]
+ or a
+ jr z, .skipNoChanceType
+ ld a, [wd4ca]
+ sub [hl]
+ ld [wd4ca], a
+ jr c, .foundCardType
+.skipNoChanceType
+ inc hl
+ inc c
+ ld a, c
+ cp a, BOOSTER_CARD_TYPE_AMOUNT
+ jr c, .loopThroughCardTypes
+ ld a, $08
+.foundCardType
+ ld a, c
+ ld [wBoosterSelectedCardType], a
+ ret
+
+FindBoosterCard: ; 1e31d (7:631d)
+ ld a, [wBoosterSelectedCardType]
+ ld c, a
+ ld b, $00
+ ld hl, wBoosterAmountOfCardTypeTable
+ add hl, bc
+ ld a, [hl]
+ call Random
+ ld [wd4ca], a
+ ld hl, wBoosterViableCardList
+.findMatchingCardLoop
+ ld a, [hli]
+ or a
+ jr z, .noValidCardFound
+ ld [wBoosterTempData], a
+ ld a, [wBoosterSelectedCardType]
+ cp [hl]
+ jr nz, .cardIncorrectType
+ ld a, [wd4ca]
+ or a
+ jr z, .returnWithCurrentCard
+ dec a
+ ld [wd4ca], a
+.cardIncorrectType
+ inc hl
+ jr .findMatchingCardLoop
+.returnWithCurrentCard
+ or a
+ ret
+.noValidCardFound
+ rst $38
+ scf
+ ret
+
+;lowers the chance of getting the same type multiple times
+UpdateBoosterCardTypesChanceByte: ; 1e350 (7:6350)
+ push hl
+ push bc
+ ld a, [wBoosterSelectedCardType]
+ ld c, a
+ ld b, $00
+ ld hl, wBoosterDataTypeChanceData
+ add hl, bc
+ ld a,[wBoosterDataAveragedChance]
+ ld c, a
+ ld a, [hl]
+ sub c
+ ld [hl], a
+ jr z, .chanceLessThanOne
+ jr nc, .stillSomeChanceLeft
+.chanceLessThanOne
+ ld a, $01
+ ld [hl], a
+.stillSomeChanceLeft
+ pop bc
+ pop hl
+ ret
+
+GenerateBoosterEnergy: ; 1e3db (7:63db)
+ ld hl, wBoosterDataEnergyFunctionPointer + 1
+ ld a, [hld]
+ or a
+ jr z, .noFunctionPointer
+ ld l, [hl]
+ ld h, a
+ jp hl
+.noFunctionPointer
+ ld a, [hl]
+ or a
+ ret z
+ push af
+ call AddBoosterEnergyToWram
+ pop af
+ ret
+
+AddBoosterEnergyToWram: ; 1e380 (7:6380)
+ ld [wBoosterTempData], a
+ call AddCardToBoosterEnergies
+ ret
+
+GenerateEndingEnergy: ; 1e387 (7:6387)
+ ld a, $06
+ call Random
+ add a, $01
+ jr AddBoosterEnergyToWram
+
+GenerateRandomEnergyBoosterPack: ; 1e390 (7:6390)
+ ld a, $0a
+.generateEnergyLoop
+ push af
+ call GenerateEndingEnergy
+ pop af
+ dec a
+ jr nz, .generateEnergyLoop
+ jr ZeroBoosterRarityData
+
+GenerateEnergyBoosterLightningFire: ; 1e39c (7:639c)
+ ld hl, EnergyBoosterLightningFireData
+ jr CreateEnergyBooster
+
+GenerateEnergyBoosterWaterFighting: ; 1e3a1 (7:63a1)
+ ld hl, EnergyBoosterWaterFightingData
+ jr CreateEnergyBooster
+
+GenerateEnergyBoosterGrassPsychic: ; 1e3a6 (7:63a6)
+ ld hl, EnergyBoosterGrassPsychicData
+ jr CreateEnergyBooster
+
+CreateEnergyBooster: ; 1e3ab (7:63ab)
+ ld b, $02
+.addTwoEnergiesToBoosterLoop
+ ld c, $05
+.addEnergyToBoosterLoop
+ push hl
+ push bc
+ ld a, [hl]
+ call AddBoosterEnergyToWram
+ pop bc
+ pop hl
+ dec c
+ jr nz, .addEnergyToBoosterLoop
+ inc hl
+ dec b
+ jr nz, .addTwoEnergiesToBoosterLoop
+ZeroBoosterRarityData:
+ xor a
+ ld [wBoosterDataCommonAmount], a
+ ld [wBoosterDataUncommonAmount], a
+ ld [wBoosterDataRareAmount], a
+ ret
+
+EnergyBoosterLightningFireData:
+ db LIGHTNING_ENERGY, FIRE_ENERGY
+EnergyBoosterWaterFightingData:
+ db WATER_ENERGY, FIGHTING_ENERGY
+EnergyBoosterGrassPsychicData:
+ db GRASS_ENERGY, PSYCHIC_ENERGY
+
+AddCardToBoosterEnergies: ; 1e3cf (7:63cf)
+ push hl
+ ld hl, wPlayerDeck + $b
+ call CopyToFirstEmptyByte
+ call AddBoosterCardToTempCardCollection
+ pop hl
+ ret
+
+AddCardToBoosterList: ; 1e3db (7:63db)
+ push hl
+ ld hl, wPlayerDeck
+ call CopyToFirstEmptyByte
+ call AddBoosterCardToTempCardCollection
+ pop hl
+ ret
+
+CopyToFirstEmptyByte: ; 1e3e7 (7:63e7)
+ ld a, [hli]
+ or a
+ jr nz, CopyToFirstEmptyByte
+ dec hl
+ ld a, [wBoosterTempData]
+ ld [hli], a
+ xor a
+ ld [hl], a
+ ret
+
+CopyBoosterEnergiesToBooster: ; 1e3f3 (7:63f3)
+ push hl
+ ld hl, wPlayerDeck + $b
+.loopThroughExtraCards
+ ld a, [hli]
+ or a
+ jr z, .endOfCards
+ ld [wBoosterTempData], a
+ push hl
+ ld hl, wPlayerDeck
+ call CopyToFirstEmptyByte
+ pop hl
+ jr .loopThroughExtraCards
+.endOfCards
+ pop hl
+ ret
+
+AddBoosterCardsToCollection:; 1e40a (7:640a)
+ push hl
+ ld hl, wPlayerDeck
+.addCardsLoop
+ ld a, [hli]
+ or a
+ jr z, .noCardsLeft
+ call AddCardToCollection
+ jr .addCardsLoop
+.noCardsLeft
+ pop hl
+ ret
+
+AddBoosterCardToTempCardCollection: ; 1e419 (7:6419)
+ push hl
+ ld h, wTempCardCollection >> 8
+ ld a, [wBoosterTempData]
+ ld l, a
+ inc [hl]
+ pop hl
+ ret
+
+CheckByteInWramZeroed: ; 1e423 (7:6423)
+ push hl
+ ld h, wTempCardCollection >> 8
+ ld a, [wBoosterTempData]
+ ld l, a
+ ld a, [hl]
+ pop hl
+ cp $01
+ ccf
+ ret
+
+;clears wPlayerDeck and wTempCardCollection
+;copies rarity amounts to ram and averages them into wBoosterDataAveragedChance
+InitBoosterData: ; 1e430 (7:6430)
+ ld c, $16
+ ld hl, wPlayerDeck
+ xor a
+.clearPlayerDeckLoop
+ ld [hli], a
+ dec c
+ jr nz, .clearPlayerDeckLoop
+ ld c, $00
+ ld hl, wTempCardCollection
+ xor a
+.clearTempCardCollectionLoop
+ ld [hli], a
+ dec c
+ jr nz, .clearTempCardCollectionLoop
+ call FindBoosterDataPointer
+ ld de, wBoosterDataRarityIndex
+ ld bc, $c
+ call CopyData
+ call LoadRarityAmountsToWram
+ ld bc, $0
+ ld d, BOOSTER_CARD_TYPE_AMOUNT
+ ld e, $0
+ ld hl, wBoosterDataTypeChanceData
+.addChanceBytesLoop
+ ld a, [hli]
+ or a
+ jr z, .skipChanceByte
+ add c
+ ld c, a
+ inc e
+.skipChanceByte
+ dec d
+ jr nz, .addChanceBytesLoop
+ call DivideBCbyDE
+ ld a, c
+ ld [wBoosterDataAveragedChance], a
+ ret
+
+FindBoosterDataPointer: ; 1e46f (7:646f)
+ push bc
+ ld a, [wBoosterDataIndex]
+ add a
+ ld c, a
+ ld b, $0
+ ld hl, BoosterData_PtrTbl
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop bc
+ ret
+
+BoosterData_PtrTbl: ; 1e480 (7:6480)
+ dw BoosterData_1e4e4
+ dw BoosterData_1e4f0
+ dw BoosterData_1e4fc
+ dw BoosterData_1e508
+ dw BoosterData_1e514
+ dw BoosterData_1e520
+ dw BoosterData_1e52c
+ dw BoosterData_1e538
+ dw BoosterData_1e544
+ dw BoosterData_1e550
+ dw BoosterData_1e55c
+ dw BoosterData_1e568
+ dw BoosterData_1e574
+ dw BoosterData_1e580
+ dw BoosterData_1e58c
+ dw BoosterData_1e598
+ dw BoosterData_1e5a4
+ dw BoosterData_1e5b0
+ dw BoosterData_1e5bc
+ dw BoosterData_1e5c8
+ dw BoosterData_1e5d4
+ dw BoosterData_1e5e0
+ dw BoosterData_1e5ec
+ dw BoosterData_1e5f8
+ dw BoosterData_1e604
+ dw BoosterData_1e610
+ dw BoosterData_1e61c
+ dw BoosterData_1e628
+ dw BoosterData_1e634
+
+LoadRarityAmountsToWram: ; 1e4ba (7:64ba)
+ ld a, [wBoosterDataRarityIndex]
+ add a
+ add a
+ ld c, a
+ ld b, $00
+ ld hl, BoosterRarityAmountTable
+ add hl, bc
+ inc hl
+ ld a, [hli]
+ ld [wBoosterDataCommonAmount], a
+ ld a, [hli]
+ ld [wBoosterDataUncommonAmount], a
+ ld a, [hli]
+ ld [wBoosterDataRareAmount], a
+ ret
+
+BoosterRarityAmountTable: ; 1e4d4 (7::64d4)
+ db $01, $05, $03, $01 ; other, commons, uncommons, rares
+ db $01, $05, $03, $01 ; other, commons, uncommons, rares
+ db $00, $06, $03, $01 ; other, commons, uncommons, rares
+ db $00, $06, $03, $01 ; other, commons, uncommons, rares
+
+BoosterData_1e4e4:: ; 1e4e4 (7:64e4)
+ db $00 ;booster rarity table index
+ dw GenerateEndingEnergy ; energy or energy generation function
+
+; Card Type Chances
+ db $14 ; Grass Type Chance
+ db $14 ; Fire Type Chance
+ db $14 ; Water Type Chance
+ db $14 ; Lightning Type Chance
+ db $14 ; Fighting Type Chance
+ db $14 ; Psychic Type Chance
+ db $14 ; Colorless Type Chance
+ db $14 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e4f0:: ; 1e4f0 (7:64f0)
+ db $00 ;booster rarity table index
+ dw $0001 ; energy or energy generation function
+
+; Card Type Chances
+ db $30 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e4fc:: ; 1e4fc (7:64fc)
+ db $00 ;booster rarity table index
+ dw $0002 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $30 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e508:: ; 1e508 (7:6508)
+ db $00 ;booster rarity table index
+ dw $0003 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $30 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e514:: ; 1e514 (7:6514)
+ db $00 ;booster rarity table index
+ dw $0004 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $30 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e520:: ; 1e520 (7:6520)
+ db $00 ;booster rarity table index
+ dw $0005 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $30 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e52c:: ; 1e52c (7:652c)
+ db $00 ;booster rarity table index
+ dw GenerateEndingEnergy ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $30 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e538:: ; 1e538 (7:6538)
+ db $01 ;booster rarity table index
+ dw GenerateEndingEnergy ; energy or energy generation function
+
+; Card Type Chances
+ db $14 ; Grass Type Chance
+ db $14 ; Fire Type Chance
+ db $14 ; Water Type Chance
+ db $14 ; Lightning Type Chance
+ db $14 ; Fighting Type Chance
+ db $14 ; Psychic Type Chance
+ db $14 ; Colorless Type Chance
+ db $14 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e544:: ; 1e544 (7:6544)
+ db $01 ;booster rarity table index
+ dw $0001 ; energy or energy generation function
+
+; Card Type Chances
+ db $30 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e550:: ; 1e550 (7:6550)
+ db $01 ;booster rarity table index
+ dw $0002 ; energy or energy generation function
+
+; Card Type Chances
+ db $14 ; Grass Type Chance
+ db $14 ; Fire Type Chance
+ db $14 ; Water Type Chance
+ db $14 ; Lightning Type Chance
+ db $14 ; Fighting Type Chance
+ db $14 ; Psychic Type Chance
+ db $14 ; Colorless Type Chance
+ db $14 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e55c:: ; 1e55c (7:655c)
+ db $01 ;booster rarity table index
+ dw $0003 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $30 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e568:: ; 1e568 (7:6568)
+ db $01 ;booster rarity table index
+ dw $0005 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $30 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e574:: ; 1e574 (7:6574)
+ db $01 ;booster rarity table index
+ dw $0006 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $30 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e580:: ; 1e580 (7:6580)
+ db $01 ;booster rarity table index
+ dw GenerateEndingEnergy ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $30 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e58c:: ; 1e58c (7:658c)
+ db $02 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $11 ; Grass Type Chance
+ db $11 ; Fire Type Chance
+ db $11 ; Water Type Chance
+ db $11 ; Lightning Type Chance
+ db $11 ; Fighting Type Chance
+ db $11 ; Psychic Type Chance
+ db $11 ; Colorless Type Chance
+ db $11 ; Trainer Card Chance
+ db $11 ; Energy Card Chance
+
+BoosterData_1e598:: ; 1e598 (7:6598)
+ db $02 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $30 ; Grass Type Chance
+ db $0C ; Fire Type Chance
+ db $0C ; Water Type Chance
+ db $0C ; Lightning Type Chance
+ db $0C ; Fighting Type Chance
+ db $0C ; Psychic Type Chance
+ db $16 ; Colorless Type Chance
+ db $0C ; Trainer Card Chance
+ db $0C ; Energy Card Chance
+
+BoosterData_1e5a4:: ; 1e5a4 (7:65a4)
+ db $02 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $0C ; Grass Type Chance
+ db $0C ; Fire Type Chance
+ db $30 ; Water Type Chance
+ db $0C ; Lightning Type Chance
+ db $0C ; Fighting Type Chance
+ db $0C ; Psychic Type Chance
+ db $16 ; Colorless Type Chance
+ db $0C ; Trainer Card Chance
+ db $0C ; Energy Card Chance
+
+BoosterData_1e5b0:: ; 1e5b0 (7:65b0)
+ db $02 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $0C ; Grass Type Chance
+ db $0C ; Fire Type Chance
+ db $0C ; Water Type Chance
+ db $30 ; Lightning Type Chance
+ db $0C ; Fighting Type Chance
+ db $0C ; Psychic Type Chance
+ db $16 ; Colorless Type Chance
+ db $0C ; Trainer Card Chance
+ db $0C ; Energy Card Chance
+
+BoosterData_1e5bc:: ; 1e5bc (7:65bc)
+ db $02 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $0C ; Grass Type Chance
+ db $0C ; Fire Type Chance
+ db $0C ; Water Type Chance
+ db $0C ; Lightning Type Chance
+ db $30 ; Fighting Type Chance
+ db $0C ; Psychic Type Chance
+ db $16 ; Colorless Type Chance
+ db $0C ; Trainer Card Chance
+ db $0C ; Energy Card Chance
+
+BoosterData_1e5c8:: ; 1e5c8 (7:65c8)
+ db $02 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $0C ; Grass Type Chance
+ db $0C ; Fire Type Chance
+ db $0C ; Water Type Chance
+ db $0C ; Lightning Type Chance
+ db $0C ; Fighting Type Chance
+ db $0C ; Psychic Type Chance
+ db $16 ; Colorless Type Chance
+ db $30 ; Trainer Card Chance
+ db $0C ; Energy Card Chance
+
+BoosterData_1e5d4:: ; 1e5d4 (7:65d4)
+ db $03 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $14 ; Grass Type Chance
+ db $14 ; Fire Type Chance
+ db $14 ; Water Type Chance
+ db $14 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $14 ; Psychic Type Chance
+ db $14 ; Colorless Type Chance
+ db $18 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e5e0:: ; 1e5e0 (7:65e0)
+ db $03 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $30 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e5ec:: ; 1e5ec (7:65ec)
+ db $03 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $30 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e5f8:: ; 1e5f8 (7:65f8)
+ db $03 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $30 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $10 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e604:: ; 1e604 (7:6604)
+ db $03 ;booster rarity table index
+ dw $0000 ; energy or energy generation function
+
+; Card Type Chances
+ db $10 ; Grass Type Chance
+ db $10 ; Fire Type Chance
+ db $10 ; Water Type Chance
+ db $10 ; Lightning Type Chance
+ db $10 ; Fighting Type Chance
+ db $10 ; Psychic Type Chance
+ db $10 ; Colorless Type Chance
+ db $30 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e610:: ; 1e610 (7:6610)
+ db $00 ;booster rarity table index
+ dw GenerateEnergyBoosterLightningFire ; energy or energy generation function
+
+; Card Type Chances
+ db $00 ; Grass Type Chance
+ db $00 ; Fire Type Chance
+ db $00 ; Water Type Chance
+ db $00 ; Lightning Type Chance
+ db $00 ; Fighting Type Chance
+ db $00 ; Psychic Type Chance
+ db $00 ; Colorless Type Chance
+ db $00 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e61c:: ; 1e61c (7:661c)
+ db $00 ;booster rarity table index
+ dw GenerateEnergyBoosterWaterFighting ; energy or energy generation function
+
+; Card Type Chances
+ db $00 ; Grass Type Chance
+ db $00 ; Fire Type Chance
+ db $00 ; Water Type Chance
+ db $00 ; Lightning Type Chance
+ db $00 ; Fighting Type Chance
+ db $00 ; Psychic Type Chance
+ db $00 ; Colorless Type Chance
+ db $00 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e628:: ; 1e628 (7:6628)
+ db $00 ;booster rarity table index
+ dw GenerateEnergyBoosterGrassPsychic ; energy or energy generation function
+
+; Card Type Chances
+ db $00 ; Grass Type Chance
+ db $00 ; Fire Type Chance
+ db $00 ; Water Type Chance
+ db $00 ; Lightning Type Chance
+ db $00 ; Fighting Type Chance
+ db $00 ; Psychic Type Chance
+ db $00 ; Colorless Type Chance
+ db $00 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+BoosterData_1e634:: ; 1e634 (7:6634)
+ db $00 ;booster rarity table index
+ dw GenerateRandomEnergyBoosterPack ; energy or energy generation function
+
+; Card Type Chances
+ db $00 ; Grass Type Chance
+ db $00 ; Fire Type Chance
+ db $00 ; Water Type Chance
+ db $00 ; Lightning Type Chance
+ db $00 ; Fighting Type Chance
+ db $00 ; Psychic Type Chance
+ db $00 ; Colorless Type Chance
+ db $00 ; Trainer Card Chance
+ db $00 ; Energy Card Chance
+
+INCBIN "baserom.gbc",$1e640,$20000 - $1e640
diff --git a/src/engine/home.asm b/src/engine/home.asm
index b336a9e..e35bc18 100755
--- a/src/engine/home.asm
+++ b/src/engine/home.asm
@@ -462,7 +462,7 @@ FillTileMap: ; 03c0 (0:03c0)
; zero work RAM, stack area & high RAM ($C000-$DFFF, $FF80-$FFEF)
ZeroRAM: ; 03ec (0:03ec)
- ld hl, $c000
+ ld hl, wTempCardCollection
ld bc, $2000
.asm_3f2
xor a
@@ -3239,7 +3239,73 @@ PrintOpponentName: ; 1c8e (0:1c8e)
jp PrintTextBoxBorderLabel
; 0x1caa
-INCBIN "baserom.gbc",$1caa,$1dca - $1caa
+INCBIN "baserom.gbc",$1caa,$1d2e - $1caa
+
+;creates a list at $c000 of every card the player owns and how many
+CreateTempCardCollection: ; 1d2e (0:1d2e)
+ call EnableExtRAM
+ ld hl, sCardCollection
+ ld de, wTempCardCollection
+ ld bc, CARD_COLLECTION_SIZE
+ call CopyData
+ ld de, sDeck1Name
+ call AddDeckCardsToTempCardCollection
+ ld de, sDeck2Name
+ call AddDeckCardsToTempCardCollection
+ ld de, sDeck3Name
+ call AddDeckCardsToTempCardCollection
+ ld de, sDeck4Name
+ call AddDeckCardsToTempCardCollection
+ call DisableExtRAM
+ ret
+
+AddDeckCardsToTempCardCollection: ; 1d59 (0:1d59)
+ ld a, [de]
+ or a
+ ret z
+ ld hl, sDeck1Cards - sDeck1Name
+ add hl, de
+ ld e, l
+ ld d, h
+ ld h, wTempCardCollection >> 8
+ ld c, DECK_SIZE
+.asm_1d66
+ ld a, [de]
+ inc de
+ ld l, a
+ inc [hl]
+ dec c
+ jr nz, .asm_1d66
+ ret
+
+;adds card a to collection, provided the player has less than 99 of them
+AddCardToCollection: ; 1d6e (0:1d6e)
+ push hl
+ push de
+ push bc
+ ld l, a
+ push hl
+ call CreateTempCardCollection
+ pop hl
+ call EnableExtRAM
+ ld h, wTempCardCollection >> 8
+ ld a, [hl]
+ and $7f
+ cp 99
+ jr nc, .asm_1d8a
+ ld h, sCardCollection >> 8
+ ld a, [hl]
+ and $7f
+ inc a
+ ld [hl], a
+.asm_1d8a
+ call DisableExtRAM
+ pop bc
+ pop de
+ pop hl
+ ret
+
+INCBIN "baserom.gbc",$1d91,$1dca - $1d91
; memcpy(HL, DE, C)
Memcpy: ; 1dca (0:1dca)
@@ -3318,7 +3384,7 @@ DrawLabeledTextBox: ; 1e00 (0:1e00)
push bc
push hl
; top left tile of the box
- ld hl, $c000
+ ld hl, wTempCardCollection
ld a, $5
ld [hli], a
ld a, $18
@@ -3365,7 +3431,7 @@ DrawLabeledTextBox: ; 1e00 (0:1e00)
push de
push bc
call Func_22ae
- ld hl, $c000
+ ld hl, wTempCardCollection
call Func_21c5
pop bc
pop de
@@ -5327,7 +5393,31 @@ Func_2f32: ; 2f32 (0:2f32)
ret
; 0x2f45
-INCBIN "baserom.gbc",$2f45,$2f7c - $2f45
+INCBIN "baserom.gbc",$2f45,$2f5d - $2f45
+
+; from the card id in a, loads type into a, rarity into b, and set into c
+GetCardHeader: ; 2f5d (0:2f5d)
+ push hl
+ push de
+ ld d, $00
+ ld e, a
+ call GetCardPointer
+ jr c, .cardNotFound
+ ld a, $0c
+ call BankpushHome2
+ ld e, [hl]
+ ld bc, $5
+ add hl, bc
+ ld b, [hl]
+ inc hl
+ ld c, [hl]
+ call BankpopHome
+ ld a, e
+ or a
+.cardNotFound
+ pop de
+ pop hl
+ ret
; return at hl the pointer to the data of the card with id at e
; return carry if e was out of bounds, so no pointer was returned
@@ -7072,7 +7162,8 @@ DoFrameIfLCDEnabled: ; 3c48 (0:3c48)
pop af
ret
-Func_3c5a: ; 3c5a (0:3c5a)
+; divides BC by DE. Stores result in BC and stores remainder in HL
+DivideBCbyDE: ; 3c5a (0:3c5a)
ld hl, $0000
rl c
rl b
diff --git a/src/main.asm b/src/main.asm
index 697cce0..d77d6d7 100755
--- a/src/main.asm
+++ b/src/main.asm
@@ -23,6 +23,7 @@ INCLUDE "engine/bank6.asm"
SECTION "bank7",ROMX,BANK[$7]
INCLUDE "engine/bank7.asm"
+INCLUDE "engine/boosters.asm"
SECTION "bank8",ROMX,BANK[$8]
INCBIN "baserom.gbc",$20000,$4000
diff --git a/src/sram.asm b/src/sram.asm
new file mode 100755
index 0000000..6f811ff
--- /dev/null
+++ b/src/sram.asm
@@ -0,0 +1,17 @@
+SECTION "Working Cards", SRAM, BANK[0]
+
+ds $100
+
+sCardCollection:: ds $100 ; a100
+
+sDeck1Name:: ds DECK_NAME_SIZE ; a200
+sDeck1Cards:: ds DECK_SIZE ; a218
+
+sDeck2Name:: ds DECK_NAME_SIZE ; a254
+sDeck2Cards:: ds DECK_SIZE ; a26c
+
+sDeck3Name:: ds DECK_NAME_SIZE ; a2a8
+sDeck3Cards:: ds DECK_SIZE ; a2c0
+
+sDeck4Name:: ds DECK_NAME_SIZE ; a2fc
+sDeck4Cards:: ds DECK_SIZE ; a314 \ No newline at end of file
diff --git a/src/wram.asm b/src/wram.asm
index a0b46e9..6348d9e 100755
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -6,7 +6,10 @@ INCLUDE "macros.asm"
;----------------------------------------------------------
SECTION "WRAM0", WRAM0
- ds $200
+
+wTempCardCollection::
+ ds $100
+ ds $100
;--- Duel variables ----------------------------------------------
@@ -713,10 +716,25 @@ wd112:: ; d112
wMatchStartTheme:: ; d113
ds $1
- ds $1d
+ ds $9
+
+wPCPackSelection:: ; d11d
+ ds $1
+
+; 7th bit of each pack corresponds to whether or not it's been read
+wPCPacks:: ; d11e
+ ds $c
+ ds $3
+
+wPCLastDirectionPressed:: ; d12d
+ ds $1
+ ds $3
wd131:: ; d131
- ds $1fd
+ ds $2
+
+wBoosterViableCardList:: ; d133
+ ds $1fb
wd32e:: ; d32e
ds $1
@@ -777,7 +795,56 @@ wd61b:: ; d61b
ds $3
wd61e:: ; d61e
- ds $766
+ ds $4b
+
+wBoosterDataIndex:: ; d669
+ ds $1
+
+wBoosterTempData:: ; d66a
+ ds $1
+
+wBoosterSelectedCardType:: ; d66b
+ ds $1
+
+wBoosterCurrRarity:: ; d66c
+ ds $1
+
+wBoosterDataAveragedChance:: ; d66d
+ ds $1
+
+wBoosterDataCommonAmount:: ; d66e
+ ds $1
+
+wBoosterDataUncommonAmount:: ; d66f
+ ds $1
+
+wBoosterDataRareAmount:: ; d670
+ ds $1
+
+wBoosterAmountOfCardTypeTable:: ; d671
+ ds $09
+
+wBoosterTempTypeChanceTable:: ; d67a
+ ds $09
+
+wBoosterCurrentCardType:: ; d683
+ ds $1
+
+wBoosterCurrentCardRarity:: ; d684
+ ds $1
+
+wBoosterCurrentCardSet:: ; d685
+ ds $1
+
+wBoosterDataRarityIndex:: ; d686
+ ds $1
+
+wBoosterDataEnergyFunctionPointer:: ; d687
+ ds $2
+
+wBoosterDataTypeChanceData:: ; d689
+ ds $9
+ ds $6f2
wMusicDC:: ; dd84
ds $2
@@ -832,3 +899,5 @@ wMusicE4:: ; ddea
wMusicReturnAddress:: ; ddf3
ds $8
+
+INCLUDE "sram.asm"