diff options
author | xCrystal <rgr.crystal@gmail.com> | 2018-07-29 18:17:43 +0200 |
---|---|---|
committer | xCrystal <rgr.crystal@gmail.com> | 2018-07-29 18:17:43 +0200 |
commit | 00f7e8038194d8ef42e006fd2e6d0e573ee83f1d (patch) | |
tree | 530aeecdc2d69a0c8fc95326d16a0d1a4eb7e049 /src | |
parent | 5621850eb451524b3f7c2ac2d036fd27a918ec30 (diff) |
More duel bank1 disasm
Diffstat (limited to 'src')
-rw-r--r-- | src/constants/card_constants.asm | 258 | ||||
-rw-r--r-- | src/constants/duel_constants.asm | 1 | ||||
-rw-r--r-- | src/engine/bank01.asm | 579 | ||||
-rw-r--r-- | src/engine/home.asm | 17 | ||||
-rw-r--r-- | src/text/text1.asm | 18 | ||||
-rw-r--r-- | src/text/text_offsets.asm | 18 | ||||
-rw-r--r-- | src/wram.asm | 9 |
7 files changed, 643 insertions, 257 deletions
diff --git a/src/constants/card_constants.asm b/src/constants/card_constants.asm index 30560c2..df6da6b 100644 --- a/src/constants/card_constants.asm +++ b/src/constants/card_constants.asm @@ -8,12 +8,12 @@ const DOUBLE_COLORLESS_ENERGY ; $07 const BULBASAUR ; $08 const IVYSAUR ; $09 - const VENUSAUR1 ; $0A - const VENUSAUR2 ; $0B - const CATERPIE ; $0C - const METAPOD ; $0D - const BUTTERFREE ; $0E - const WEEDLE ; $0F + const VENUSAUR1 ; $0a + const VENUSAUR2 ; $0b + const CATERPIE ; $0c + const METAPOD ; $0d + const BUTTERFREE ; $0e + const WEEDLE ; $0f const KAKUNA ; $10 const BEEDRILL ; $11 const EKANS ; $12 @@ -24,12 +24,12 @@ const NIDORANM ; $17 const NIDORINO ; $18 const NIDOKING ; $19 - const ZUBAT ; $1A - const GOLBAT ; $1B - const ODDISH ; $1C - const GLOOM ; $1D - const VILEPLUME ; $1E - const PARAS ; $1F + const ZUBAT ; $1a + const GOLBAT ; $1b + const ODDISH ; $1c + const GLOOM ; $1d + const VILEPLUME ; $1e + const PARAS ; $1f const PARASECT ; $20 const VENONAT ; $21 const VENOMOTH ; $22 @@ -40,12 +40,12 @@ const MUK ; $27 const EXEGGCUTE ; $28 const EXEGGUTOR ; $29 - const KOFFING ; $2A - const WEEZING ; $2B - const TANGELA1 ; $2C - const TANGELA2 ; $2D - const SCYTHER ; $2E - const PINSIR ; $2F + const KOFFING ; $2a + const WEEZING ; $2b + const TANGELA1 ; $2c + const TANGELA2 ; $2d + const SCYTHER ; $2e + const PINSIR ; $2f const CHARMANDER ; $30 const CHARMELEON ; $31 const CHARIZARD ; $32 @@ -56,12 +56,12 @@ const ARCANINE1 ; $37 const ARCANINE2 ; $38 const PONYTA ; $39 - const RAPIDASH ; $3A - const MAGMAR1 ; $3B - const MAGMAR2 ; $3C - const FLAREON1 ; $3D - const FLAREON2 ; $3E - const MOLTRES1 ; $3F + const RAPIDASH ; $3a + const MAGMAR1 ; $3b + const MAGMAR2 ; $3c + const FLAREON1 ; $3d + const FLAREON2 ; $3e + const MOLTRES1 ; $3f const MOLTRES2 ; $40 const SQUIRTLE ; $41 const WARTORTLE ; $42 @@ -72,12 +72,12 @@ const POLIWHIRL ; $47 const POLIWRATH ; $48 const TENTACOOL ; $49 - const TENTACRUEL ; $4A - const SEEL ; $4B - const DEWGONG ; $4C - const SHELLDER ; $4D - const CLOYSTER ; $4E - const KRABBY ; $4F + const TENTACRUEL ; $4a + const SEEL ; $4b + const DEWGONG ; $4c + const SHELLDER ; $4d + const CLOYSTER ; $4e + const KRABBY ; $4f const KINGLER ; $50 const HORSEA ; $51 const SEADRA ; $52 @@ -88,12 +88,12 @@ const MAGIKARP ; $57 const GYARADOS ; $58 const LAPRAS ; $59 - const VAPOREON1 ; $5A - const VAPOREON2 ; $5B - const OMANYTE ; $5C - const OMASTAR ; $5D - const ARTICUNO1 ; $5E - const ARTICUNO2 ; $5F + const VAPOREON1 ; $5a + const VAPOREON2 ; $5b + const OMANYTE ; $5c + const OMASTAR ; $5d + const ARTICUNO1 ; $5e + const ARTICUNO2 ; $5f const PIKACHU1 ; $60 const PIKACHU2 ; $61 const PIKACHU3 ; $62 @@ -104,12 +104,12 @@ const RAICHU1 ; $67 const RAICHU2 ; $68 const MAGNEMITE1 ; $69 - const MAGNEMITE2 ; $6A - const MAGNETON1 ; $6B - const MAGNETON2 ; $6C - const VOLTORB ; $6D - const ELECTRODE1 ; $6E - const ELECTRODE2 ; $6F + const MAGNEMITE2 ; $6a + const MAGNETON1 ; $6b + const MAGNETON2 ; $6c + const VOLTORB ; $6d + const ELECTRODE1 ; $6e + const ELECTRODE2 ; $6f const ELECTABUZZ1 ; $70 const ELECTABUZZ2 ; $71 const JOLTEON1 ; $72 @@ -120,12 +120,12 @@ const SANDSHREW ; $77 const SANDSLASH ; $78 const DIGLETT ; $79 - const DUGTRIO ; $7A - const MANKEY ; $7B - const PRIMEAPE ; $7C - const MACHOP ; $7D - const MACHOKE ; $7E - const MACHAMP ; $7F + const DUGTRIO ; $7a + const MANKEY ; $7b + const PRIMEAPE ; $7c + const MACHOP ; $7d + const MACHOKE ; $7e + const MACHAMP ; $7f const GEODUDE ; $80 const GRAVELER ; $81 const GOLEM ; $82 @@ -136,12 +136,12 @@ const HITMONLEE ; $87 const HITMONCHAN ; $88 const RHYHORN ; $89 - const RHYDON ; $8A - const KABUTO ; $8B - const KABUTOPS ; $8C - const AERODACTYL ; $8D - const ABRA ; $8E - const KADABRA ; $8F + const RHYDON ; $8a + const KABUTO ; $8b + const KABUTOPS ; $8c + const AERODACTYL ; $8d + const ABRA ; $8e + const KADABRA ; $8f const ALAKAZAM ; $90 const SLOWPOKE1 ; $91 const SLOWPOKE2 ; $92 @@ -152,79 +152,79 @@ const HAUNTER2 ; $97 const GENGAR ; $98 const DROWZEE ; $99 - const HYPNO ; $9A - const MR_MIME ; $9B - const JYNX ; $9C - const MEWTWO1 ; $9D - const MEWTWO2 ; $9E - const MEWTWO3 ; $9F - const MEW1 ; $A0 - const MEW2 ; $A1 - const MEW3 ; $A2 - const PIDGEY ; $A3 - const PIDGEOTTO ; $A4 - const PIDGEOT1 ; $A5 - const PIDGEOT2 ; $A6 - const RATTATA ; $A7 - const RATICATE ; $A8 - const SPEAROW ; $A9 - const FEAROW ; $AA - const CLEFAIRY ; $AB - const CLEFABLE ; $AC - const JIGGLYPUFF1 ; $AD - const JIGGLYPUFF2 ; $AE - const JIGGLYPUFF3 ; $AF - const WIGGLYTUFF ; $B0 - const MEOWTH1 ; $B1 - const MEOWTH2 ; $B2 - const PERSIAN ; $B3 - const FARFETCHD ; $B4 - const DODUO ; $B5 - const DODRIO ; $B6 - const LICKITUNG ; $B7 - const CHANSEY ; $B8 - const KANGASKHAN ; $B9 - const TAUROS ; $BA - const DITTO ; $BB - const EEVEE ; $BC - const PORYGON ; $BD - const SNORLAX ; $BE - const DRATINI ; $BF - const DRAGONAIR ; $C0 - const DRAGONITE1 ; $C1 - const DRAGONITE2 ; $C2 - const PROFESSOR_OAK ; $C3 - const IMPOSTER_PROFESSOR_OAK ; $C4 - const BILL ; $C5 - const MR_FUJI ; $C6 - const LASS ; $C7 - const IMAKUNI_CARD ; $C8 - const POKEMON_TRADER ; $C9 - const POKEMON_BREEDER ; $CA - const CLEFAIRY_DOLL ; $CB - const MYSTERIOUS_FOSSIL ; $CC - const ENERGY_RETRIEVAL ; $CD - const SUPER_ENERGY_RETRIEVAL ; $CE - const ENERGY_SEARCH ; $CF - const ENERGY_REMOVAL ; $D0 - const SUPER_ENERGY_REMOVAL ; $D1 - const SWITCH ; $D2 - const POKEMON_CENTER ; $D3 - const POKE_BALL ; $D4 - const SCOOP_UP ; $D5 - const COMPUTER_SEARCH ; $D6 - const POKEDEX ; $D7 - const PLUSPOWER ; $D8 - const DEFENDER ; $D9 - const ITEM_FINDER ; $DA - const GUST_OF_WIND ; $DB - const DEVOLUTION_SPRAY ; $DC - const POTION ; $DD - const SUPER_POTION ; $DE - const FULL_HEAL ; $DF - const REVIVE ; $E0 - const MAINTENANCE ; $E1 - const POKEMON_FLUTE ; $E2 - const GAMBLER ; $E3 - const RECYCLE ; $E4 + const HYPNO ; $9a + const MR_MIME ; $9b + const JYNX ; $9c + const MEWTWO1 ; $9d + const MEWTWO2 ; $9e + const MEWTWO3 ; $9f + const MEW1 ; $a0 + const MEW2 ; $a1 + const MEW3 ; $a2 + const PIDGEY ; $a3 + const PIDGEOTTO ; $a4 + const PIDGEOT1 ; $a5 + const PIDGEOT2 ; $a6 + const RATTATA ; $a7 + const RATICATE ; $a8 + const SPEAROW ; $a9 + const FEAROW ; $aa + const CLEFAIRY ; $ab + const CLEFABLE ; $ac + const JIGGLYPUFF1 ; $ad + const JIGGLYPUFF2 ; $ae + const JIGGLYPUFF3 ; $af + const WIGGLYTUFF ; $b0 + const MEOWTH1 ; $b1 + const MEOWTH2 ; $b2 + const PERSIAN ; $b3 + const FARFETCHD ; $b4 + const DODUO ; $b5 + const DODRIO ; $b6 + const LICKITUNG ; $b7 + const CHANSEY ; $b8 + const KANGASKHAN ; $b9 + const TAUROS ; $ba + const DITTO ; $bb + const EEVEE ; $bc + const PORYGON ; $bd + const SNORLAX ; $be + const DRATINI ; $bf + const DRAGONAIR ; $c0 + const DRAGONITE1 ; $c1 + const DRAGONITE2 ; $c2 + const PROFESSOR_OAK ; $c3 + const IMPOSTER_PROFESSOR_OAK ; $c4 + const BILL ; $c5 + const MR_FUJI ; $c6 + const LASS ; $c7 + const IMAKUNI_CARD ; $c8 + const POKEMON_TRADER ; $c9 + const POKEMON_BREEDER ; $ca + const CLEFAIRY_DOLL ; $cb + const MYSTERIOUS_FOSSIL ; $cc + const ENERGY_RETRIEVAL ; $cd + const SUPER_ENERGY_RETRIEVAL ; $ce + const ENERGY_SEARCH ; $cf + const ENERGY_REMOVAL ; $d0 + const SUPER_ENERGY_REMOVAL ; $d1 + const SWITCH ; $d2 + const POKEMON_CENTER ; $d3 + const POKE_BALL ; $d4 + const SCOOP_UP ; $d5 + const COMPUTER_SEARCH ; $d6 + const POKEDEX ; $d7 + const PLUSPOWER ; $d8 + const DEFENDER ; $d9 + const ITEM_FINDER ; $da + const GUST_OF_WIND ; $db + const DEVOLUTION_SPRAY ; $dc + const POTION ; $dd + const SUPER_POTION ; $de + const FULL_HEAL ; $df + const REVIVE ; $e0 + const MAINTENANCE ; $e1 + const POKEMON_FLUTE ; $e2 + const GAMBLER ; $e3 + const RECYCLE ; $e4 NUM_CARDS EQU const_value + -1 diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index a456a4a..652c5b8 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -33,6 +33,7 @@ DUEL_LOSS EQU $1 ; wPlayerDuelVariables or wOpponentDuelVariables constants DUELVARS_CARD_LOCATIONS EQUS "LOW(wPlayerCardLocations)" ; 00 +DUELVARS_PRIZE_CARDS EQUS "LOW(wPlayerPrizeCards)" ; 3c DUELVARS_HAND EQUS "LOW(wPlayerHand)" ; 42 DUELVARS_DECK_CARDS EQUS "LOW(wPlayerDeckCards)" ; 7e DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK EQUS "LOW(wPlayerNumberOfCardsNotInDeck)" ; ba diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index c01c433..9445f72 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -87,8 +87,8 @@ HandleFailedToContinueDuel: ; 4097 (1:4097) ret ; 0x409f -; this function begins the duel after the opponent's -; graphics, name and deck have been introduced +; this function begins the duel after the opponent's graphics, name and deck have been introduced +; loads both player's decks and sets up the variables and resources required to begin a duel. StartDuel: ; 409f (1:409f) ld a, PLAYER_TURN ldh [hWhoseTurn], a @@ -122,7 +122,7 @@ StartDuel: ; 409f (1:409f) call SetupDuel ld a, [wcc18] ld [wDuelInitialPrizes], a - call Func_70aa + call InitVariablesToBeginDuel ld a, [wDuelTheme] call PlaySong call Func_4b60 @@ -134,7 +134,7 @@ MainDuelLoop ; 40ee (1:40ee) xor a ld [wCurrentDuelMenuItem], a call UpdateSubstatusConditions_StartOfTurn - call DisplayDuelistsTurnScreen + call DisplayDuelistTurnScreen call HandleTurn .between_turns @@ -182,8 +182,8 @@ MainDuelLoop ; 40ee (1:40ee) push af ld a, PLAYER_TURN ldh [hWhoseTurn], a - call Func_4a97 - call Func_4ad6 + call DrawDuelistPortraitsAndNames + call PrintDuelResultStats pop af ldh [hWhoseTurn], a call Func_3b21 @@ -253,7 +253,7 @@ MainDuelLoop ; 40ee (1:40ee) call DrawWideTextBox_WaitForInput ld a, 1 ld [wDuelInitialPrizes], a - call Func_70aa + call InitVariablesToBeginDuel ld a, [wDuelType] cp DUELTYPE_LINK jr z, .link_duel @@ -261,7 +261,6 @@ MainDuelLoop ; 40ee (1:40ee) ldh [hWhoseTurn], a call Func_4b60 jp MainDuelLoop - .link_duel call ExchangeRNG ld h, PLAYER_TURN @@ -269,7 +268,6 @@ MainDuelLoop ; 40ee (1:40ee) cp $29 jr z, .got_turn ld h, OPPONENT_TURN - .got_turn ld a, h ldh [hWhoseTurn], a @@ -292,7 +290,9 @@ SetupDuel: ; 420b (1:420b) ret ; 0x4225 -; handle the turn of the duelist identified by hWhoseTurn +; handle the turn of the duelist identified by hWhoseTurn. +; if player's turn, display the animation of the player drawing the card at +; hTempCardIndex_ff98, and save the duel state to SRAM. HandleTurn: ; 4225 (1:4225) ld a, DUELVARS_DUELIST_TYPE call GetTurnDuelistVariable @@ -301,7 +301,6 @@ HandleTurn: ; 4225 (1:4225) cp 2 jr c, .skip_let_evolve ; jump if it's the turn holder's first turn call SetAllPlayAreaPokemonCanEvolve - .skip_let_evolve call Func_70e6 call Func_4933 @@ -316,17 +315,17 @@ HandleTurn: ; 4225 (1:4225) call AddCardToHand ld a, [wDuelistType] cp DUELIST_TYPE_PLAYER - jr z, HandleTurn_PlayerDrewCard + jr z, .player_turn + +; opponent's turn call SwapTurn call IsClairvoyanceActive call SwapTurn call c, DisplayPlayerDrawCardScreen jr DuelMainInterface -; display the animation of the player drawing the card at hTempCardIndex_ff98, -; save duel state to SRAM, and fall through to DuelMainInterface -; to effectively begin the turn -HandleTurn_PlayerDrewCard: +; player's turn +.player_turn call DisplayPlayerDrawCardScreen call SaveDuelStateToSRAM ; fallthrough @@ -1439,7 +1438,7 @@ Func_4933: ; 4933 (1:4933) cp $09 jr z, .asm_495f call EmptyScreen - call Func_4a97 + call DrawDuelistPortraitsAndNames .asm_495f ld a, $07 ld [wcac2], a @@ -1560,8 +1559,11 @@ Func_49ed: ; 49ed (1:49ed) INCROM $4a35, $4a97 -Func_4a97: ; 4a97 (1:4a97) +; draw the portraits of the two duelists and print their names. +; also draw an horizontal line separating the two sides. +DrawDuelistPortraitsAndNames: ; 4a97 (1:4a97) call LoadSymbolsFont + ; player's name ld de, wDefaultText push de call CopyPlayerName @@ -1569,8 +1571,10 @@ Func_4a97: ; 4a97 (1:4a97) call InitTextPrinting pop hl call ProcessText - ld bc, $5 + ; player's portrait + lb bc, 0, 5 call Func_3e10 + ; opponent's name (aligned to the right) ld de, wDefaultText push de call CopyOpponentName @@ -1583,45 +1587,52 @@ Func_4a97: ; 4a97 (1:4a97) call InitTextPrinting pop hl call ProcessText + ; opponent's portrait ld a, [wOpponentPortrait] - ld bc, $d01 + lb bc, 13, 1 call Func_3e2a + ; middle line call DrawDuelHorizontalSeparator ret ; 0x4ad6 -Func_4ad6: ; 4ad6 (1:4ad6) +; print the number of prizes left, of active Pokemon, and of cards left in the deck +; of both duelists. this is called when the duel ends. +PrintDuelResultStats: ; 4ad6 (1:4ad6) lb de, 8, 8 - call Func_4ae9 + call PrintDuelistResultStats call SwapTurn lb de, 1, 1 - call Func_4ae9 + call PrintDuelistResultStats call SwapTurn ret ; 0x4ae9 -Func_4ae9: ; 4ae9 (1:4ae9) - call $5f4a - ld hl, $7b +; print, at d,e, the number of prizes left, of active Pokemon, and of cards left in +; the deck of the turn duelist. b,c are used throughout as input coords for +; WriteTwoDigitNumberInTxSymbolFormat, and d,e for InitTextPrinting_ProcessTextFromID. +PrintDuelistResultStats: ; 4ae9 (1:4ae9) + call SetNoLineSeparation + ldtx hl, PrizesLeftActivePokemonCardsInDeckText call InitTextPrinting_ProcessTextFromID - call $5f50 + call SetOneLineSeparation ld c, e ld a, d - add $07 + add 7 ld b, a inc a inc a ld d, a call CountPrizes - call .asm_4b22 + call .print_x_cards inc e inc c ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetTurnDuelistVariable - ld hl, $7d + ldtx hl, YesText or a jr nz, .pkmn_in_play_area - ld hl, $7c + ldtx hl, NoneText .pkmn_in_play_area dec d call InitTextPrinting_ProcessTextFromID @@ -1632,9 +1643,9 @@ Func_4ae9: ; 4ae9 (1:4ae9) call GetTurnDuelistVariable ld a, DECK_SIZE sub [hl] -.asm_4b22 +.print_x_cards call WriteTwoDigitNumberInTxSymbolFormat - ld hl, $7e + ldtx hl, CardsText call InitTextPrinting_ProcessTextFromID ret ; 0x4b2c @@ -1673,59 +1684,61 @@ Func_4b38: ; 4b38 (1:4b38) ; 0x4b60 Func_4b60: ; 4b60 (1:4b60) - call $7107 + call InitializeDuelVariables call SwapTurn - call $7107 + call InitializeDuelVariables call SwapTurn - call $4e84 - call $4d97 + call Func_4e84 + call ShuffleDeckAndDrawSevenCards ldh [hTemp_ffa0], a call SwapTurn - call $4d97 + call ShuffleDeckAndDrawSevenCards call SwapTurn ld c, a ldh a, [hTemp_ffa0] ld b, a and c - jr nz, .asm_4bd0 + jr nz, .hand_cards_ok ld a, b or c - jr z, .asm_4bb2 + jr z, .neither_drew_basic_pkmn ld a, b or a - jr nz, .asm_4b9c -.asm_4b8c - call $4df3 - call $7107 - call $4e6e - call $4d97 - jr c, .asm_4b8c - jr .asm_4bd0 - -.asm_4b9c + jr nz, .opp_drew_no_basic_pkmn + +;.player_drew_no_basic_pkmn +.ensure_player_basic_pkmn_loop + call DisplayNoBasicPokemonInHandScreenAndText + call InitializeDuelVariables + call Func_4e6e + call ShuffleDeckAndDrawSevenCards + jr c, .ensure_player_basic_pkmn_loop + jr .hand_cards_ok + +.opp_drew_no_basic_pkmn call SwapTurn -.asm_4b9f - call $4df3 - call $7107 - call $4e6e - call $4d97 - jr c, .asm_4b9f +.ensure_opp_basic_pkmn_loop + call DisplayNoBasicPokemonInHandScreenAndText + call InitializeDuelVariables + call Func_4e6e + call ShuffleDeckAndDrawSevenCards + jr c, .ensure_opp_basic_pkmn_loop call SwapTurn - jr .asm_4bd0 + jr .hand_cards_ok -.asm_4bb2 +.neither_drew_basic_pkmn ldtx hl, NeitherPlayerHasBasicPkmnText call DrawWideTextBox_WaitForInput - call $4e06 - call $7107 + call DisplayNoBasicPokemonInHandScreen + call InitializeDuelVariables call SwapTurn - call $4e06 - call $7107 + call DisplayNoBasicPokemonInHandScreen + call InitializeDuelVariables call SwapTurn - call $4dfc + call PrintReturnCardsToDeckDrawAgain jp Func_4b60 -.asm_4bd0 +.hand_cards_ok ldh a, [hWhoseTurn] push af ld a, PLAYER_TURN @@ -1734,7 +1747,7 @@ Func_4b60: ; 4b60 (1:4b60) call SwapTurn call Func_4cd5 call SwapTurn - jp c, $4c77 + jp c, .asm_4c77 call Func_311d ldtx hl, PlacingThePrizesText call DrawWideTextBox_WaitForInput @@ -1746,13 +1759,13 @@ Func_4b60: ; 4b60 (1:4b60) ldtx hl, PleasePlacePrizesText call DrawWideTextBox_PrintText call EnableLCD - call $4c7c + call .asm_4c7c call WaitForWideTextBoxInput pop af ldh [hWhoseTurn], a - call $7133 + call InitTurnDuelistPrizes call SwapTurn - call $7133 + call InitTurnDuelistPrizes call SwapTurn call EmptyScreen ld a, BOXMSG_COIN_TOSS @@ -1772,7 +1785,6 @@ Func_4b60: ; 4b60 (1:4b60) jr c, .asm_4c4a call SwapTurn ldtx hl, YouPlaySecondText - .asm_4c4a call DrawWideTextBox_WaitForInput call ExchangeRNG @@ -1790,24 +1802,75 @@ Func_4b60: ; 4b60 (1:4b60) jr c, .asm_4c6f call SwapTurn ldtx hl, YouPlayFirstText - .asm_4c6f call DrawWideTextBox_WaitForInput call ExchangeRNG or a ret -; 0x4c77 - INCROM $4c77, $4cd5 +.asm_4c77 + pop af + ldh [hWhoseTurn], a + scf + ret + +.asm_4c7c + ld hl, .data_4cbd + ld e, $34 + ld a, [wDuelInitialPrizes] + ld d, a +.asm_4c85 + push de + ld b, $14 +.asm_4c88 + call DoFrame + call Func_67b2 + jr c, .asm_4c93 + dec b + jr nz, .asm_4c88 +.asm_4c93 + call .asm_4cb4 + call .asm_4cb4 + push hl + ld a, $08 + call PlaySFX + lb bc, 3, 5 + ld a, e + call WriteTwoDigitNumberInTxSymbolFormat + lb bc, 18, 7 + ld a, e + call WriteTwoDigitNumberInTxSymbolFormat + pop hl + pop de + dec e + dec d + jr nz, .asm_4c85 + ret + +.asm_4cb4 + ld b, [hl] + inc hl + ld c, [hl] + inc hl + ld a, $ac + jp WriteByteToBGMap0 + +.data_4cbd + db $05, $06, $0e, $05 + db $06, $06, $0d, $05 + db $05, $07, $0e, $04 + db $06, $07, $0d, $04 + db $05, $08, $0e, $03 + db $06, $08, $0d, $03 +; 0x4cd5 -; Select Basic Pokemon From Hand Func_4cd5: ; 4cd5 (1:4cd5) ld a, DUELVARS_DUELIST_TYPE call GetTurnDuelistVariable cp DUELIST_TYPE_PLAYER - jr z, .asm_4d15 + jr z, .player_choose_arena cp DUELIST_TYPE_LINK_OPP - jr z, .asm_4cec + jr z, .exchange_duelvars push af push hl call Func_2bc3 @@ -1817,28 +1880,27 @@ Func_4cd5: ; 4cd5 (1:4cd5) or a ret -.asm_4cec +.exchange_duelvars ldtx hl, TransmitingDataText call DrawWideTextBox_PrintText call ExchangeRNG - ld hl, wPlayerCardLocations - ld de, wOpponentCardLocations - ld c, $80 + ld hl, wPlayerDuelVariables + ld de, wOpponentDuelVariables + ld c, (wOpponentDuelVariables - wPlayerDuelVariables) / 2 call SerialExchangeBytes - jr c, .asm_4d12 - ld c, $80 + jr c, .error + ld c, (wOpponentDuelVariables - wPlayerDuelVariables) / 2 call SerialExchangeBytes - jr c, .asm_4d12 + jr c, .error ld a, DUELVARS_DUELIST_TYPE call GetTurnDuelistVariable ld [hl], DUELIST_TYPE_LINK_OPP or a ret - -.asm_4d12 +.error jp DuelTransmissionError -.asm_4d15 +.player_choose_arena call EmptyScreen ld a, BOXMSG_ARENA_POKEMON call DrawDuelBoxMessage @@ -1848,8 +1910,8 @@ Func_4cd5: ; 4cd5 (1:4cd5) call DoPracticeDuelAction .asm_4d28 xor a - ld hl, $006e - call $5502 + ldtx hl, PleaseChooseAnActivePokemonText + call Func_5502 jr c, .asm_4d28 ldh a, [hTempCardIndex_ff98] call LoadCardDataToBuffer1_FromDeckIndex @@ -1861,9 +1923,9 @@ Func_4cd5: ; 4cd5 (1:4cd5) ldh a, [hTempCardIndex_ff98] ldtx hl, PlacedInTheArenaText call DisplayCardDetailScreen - jr .asm_4d4c + jr .choose_bench -.asm_4d4c +.choose_bench call EmptyScreen ld a, BOXMSG_BENCH_POKEMON call DrawDuelBoxMessage @@ -1871,15 +1933,15 @@ Func_4cd5: ; 4cd5 (1:4cd5) call PrintScrollableText_NoTextBoxLabel ld a, $3 call DoPracticeDuelAction -.asm_4d5f +.bench_loop ld a, $1 - ld hl, $006f - call $5502 + ldtx hl, ChooseYourBenchPokemonText + call Func_5502 jr c, .asm_4d8e ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA call GetTurnDuelistVariable cp MAX_PLAY_AREA_POKEMON - jr nc, .asm_4d86 + jr nc, .no_space ldh a, [hTempCardIndex_ff98] call PutHandPokemonCardInPlayArea ldh a, [hTempCardIndex_ff98] @@ -1887,22 +1949,131 @@ Func_4cd5: ; 4cd5 (1:4cd5) call DisplayCardDetailScreen ld a, $5 call DoPracticeDuelAction - jr .asm_4d5f + jr .bench_loop -.asm_4d86 +.no_space ldtx hl, NoSpaceOnTheBenchText call DrawWideTextBox_WaitForInput - jr .asm_4d5f + jr .bench_loop .asm_4d8e ld a, $4 call DoPracticeDuelAction - jr c, .asm_4d5f + jr c, .bench_loop or a ret ; 0x4d97 - INCROM $4d97, $4e40 +; the turn duelist shuffles the deck unless it's a practice duel, then draws 7 cards +; returns $00 in a and carry if no basic Pokemon cards are drawn, and $01 in a otherwise +ShuffleDeckAndDrawSevenCards: ; 4d97 (1:4d97) + call InitializeDuelVariables + ld a, [wDuelType] + cp DUELTYPE_PRACTICE + jr z, .deck_ready + call ShuffleDeck + call ShuffleDeck +.deck_ready + ld b, 7 +.draw_loop + call DrawCardFromDeck + call AddCardToHand + dec b + jr nz, .draw_loop + ld a, DUELVARS_HAND + call GetTurnDuelistVariable + ld b, $00 + ld c, 7 +.cards_loop + ld a, [hli] + push hl + push bc + call LoadCardDataToBuffer1_FromDeckIndex + call .check_basic_pokemon + pop bc + pop hl + or b + ld b, a + dec c + jr nz, .cards_loop + ld a, b + or a + ret nz + xor a + scf + ret + +.asm_4dd1 + ld a, [wLoadedCard1ID] + cp MYSTERIOUS_FOSSIL + jr z, .basic + cp CLEFAIRY_DOLL + jr z, .basic +.check_basic_pokemon + ld a, [wLoadedCard1Type] + cp TYPE_ENERGY + jr nc, .energy_trainer_nonbasic + ld a, [wLoadedCard1Stage] + or a + jr nz, .energy_trainer_nonbasic + +; basic + ld a, $01 + ret +.energy_trainer_nonbasic + xor a + scf + ret +.basic + ld a, $01 + or a + ret +; 0x4df3 + +DisplayNoBasicPokemonInHandScreenAndText: ; 4df3 (1:4df3) + ldtx hl, ThereAreNoBasicPokemonInHand + call DrawWideTextBox_WaitForInput + call DisplayNoBasicPokemonInHandScreen +; fallthrough + +; prints ReturnCardsToDeckAndDrawAgainText in a textbox and calls ExchangeRNG +PrintReturnCardsToDeckDrawAgain: ; 4dfc (1:4dfc) + ldtx hl, ReturnCardsToDeckAndDrawAgainText + call DrawWideTextBox_WaitForInput + call ExchangeRNG + ret +; 0x4e06 + +; display a bare list of seven hand cards of the turn duelist, and the duelist's name above +; used to let the player know that there are no basic Pokemon in the hand and need to redraw +DisplayNoBasicPokemonInHandScreen: ; 4e06 (1:4e06) + call EmptyScreen + call LoadDuelCardSymbolTiles + lb de, 0, 0 + lb bc, 20, 18 + call DrawRegularTextBox + call CreateHandCardList + call CountCardsInDuelTempList + ld hl, NoBasicPokemonCardListParameters + lb de, 0, 0 + call PrintCardListItems + ldtx hl, DuelistHandText + lb de, 1, 1 + call InitTextPrinting + call PrintTextNoDelay + call EnableLCD + call WaitForWideTextBoxInput + ret +; 0x4e37 + +NoBasicPokemonCardListParameters: + db 1, 3 ; cursor x, cursor y + db 4 ; item x + db 14 ; maximum length, in tiles, occupied by the name and level string of each card in the list + db 7 ; number of items selectable without scrolling + db SYM_CURSOR_R ; cursor tile number + db SYM_SPACE ; tile behind cursor + dw $0000 ; function pointer if non-0 Func_4e40: ; 4e40 (1:4e40) call CreateHandCardList @@ -1923,7 +2094,108 @@ Func_4e40: ; 4e40 (1:4e40) ret ; 0x4e6e - INCROM $4e6e, $4f2d +Func_4e6e: ; 4e6e (1:4e6e) + ld b, $51 + ld c, $56 + ldh a, [hWhoseTurn] + cp PLAYER_TURN + jr z, .asm_4e7c + ld b, $52 + ld c, $57 +.asm_4e7c + ld hl, $63 + ld de, $67 + jr Func_4e98 + +Func_4e84: ; 4e84 (1:4e84) + ld b, $53 + ld c, $55 + ld hl, $65 + ld de, $66 + ld a, [wDuelType] + cp DUELTYPE_PRACTICE + jr nz, Func_4e98 + ld hl, $64 +; fallthrough + +Func_4e98: ; 4e98 (1:4e98) + push bc + push de + push hl + call ZeroObjectPositionsAndToggleOAMCopy + call EmptyScreen + call DrawDuelistPortraitsAndNames + call LoadDuelDrawCardsScreenTiles + ld a, $09 + ld [wcac2], a + pop hl + call DrawWideTextBox_PrintText + call EnableLCD + ld a, [wDuelType] + cp DUELTYPE_PRACTICE + jr nz, .asm_4ebf + call WaitForWideTextBoxInput + jr .asm_4ee0 +.asm_4ebf + call Func_3b21 + ld hl, sp+$03 + ld a, [hl] + call Func_3b6a + ld a, [hl] + call Func_3b6a + ld a, [hl] + call Func_3b6a +.asm_4ed0 + call DoFrame + call Func_67b2 + jr c, .asm_4edd + call Func_3b52 + jr c, .asm_4ed0 +.asm_4edd + call Func_3b31 +.asm_4ee0 + xor a + ld [wcbe9], a + call Func_49ca + call Func_3b21 + pop hl + call DrawWideTextBox_PrintText +.asm_4eee + ld hl, sp+$00 + ld a, [hl] + call Func_3b6a +.asm_4ef4 + call DoFrame + call Func_67b2 + jr c, .asm_4f28 + call Func_3b52 + jr c, .asm_4ef4 + ld hl, wcbe9 + inc [hl] + ld hl, sp+$00 + ld a, [hl] + cp $55 + jr nz, .asm_4f11 + call Func_49ca.not_cgb + jr .asm_4f14 +.asm_4f11 + call Func_49ed +.asm_4f14 + ld a, [wcbe9] + cp $07 + jr c, .asm_4eee + ld c, $1e +.asm_4f1d + call DoFrame + call Func_67b2 + jr c, .asm_4f28 + dec c + jr nz, .asm_4f1d +.asm_4f28 + call Func_3b31 + pop bc + ret +; 0x4f2d Func_4f2d: ; 4f2d (1:4f2d) ld a, [wcac2] @@ -1931,7 +2203,7 @@ Func_4f2d: ; 4f2d (1:4f2d) jr z, .asm_4f3d call ZeroObjectPositionsAndToggleOAMCopy call EmptyScreen - call Func_4a97 + call DrawDuelistPortraitsAndNames .asm_4f3d ld a, $09 ld [wcac2], a @@ -2418,7 +2690,7 @@ Func_52bc: ; 52bc (1:52bc) ; display BOXMSG_PLAYERS_TURN or BOXMSG_OPPONENTS_TURN and print ; DuelistsTurnText in a textbox. also call ExchangeRNG. -DisplayDuelistsTurnScreen: ; 54c8 (1:54c8) +DisplayDuelistTurnScreen: ; 54c8 (1:54c8) call EmptyScreen ld c, BOXMSG_PLAYERS_TURN ldh a, [hWhoseTurn] @@ -2450,7 +2722,49 @@ DuelMenuData: ; 54e9 (1:54e9) db $ff ; 0x5502 - INCROM $5502, $5550 +Func_5502: ; 5502 (1:5502) + ld [wcbfd], a + push hl + call CreateHandCardList + call DrawCardListScreenLayout + pop hl + call SetCardListInfoBoxText + ld a, $01 + ld [wcbde], a +.asm_5515 + call Func_55f0 + jr nc, .asm_5523 + ld a, [wcbfd] + or a + jr z, .asm_5515 + scf + jr .asm_5538 +.asm_5523 + ldh a, [hTempCardIndex_ff98] + call LoadCardDataToBuffer1_FromDeckIndex + call Func_4dd1 + jr nc, .asm_5538 + ldtx hl, YouCannotSelectThisCardText + call DrawWideTextBox_WaitForInput + call DrawCardListScreenLayout.draw + jr .asm_5515 +.asm_5538 + push af + ld a, [wSortCardListByID] + or a + call nz, SortHandCardsByID + pop af + ret +; 0x5542 + +Func_5542: ; 5542 (1:5542) + call CreateDiscardPileCardList + ret c + call DrawCardListScreenLayout + call SetDiscardPileScreenTexts + call Func_55f0 + ret +; 0x5550 ; draw the turn holder's discard pile screen OpenDiscardPileScreen: ; 5550 (1:5550) @@ -5202,7 +5516,9 @@ PrintThereWasNoEffectFromStatusText: ; 700a (1:700a) INCROM $7045, $70aa -Func_70aa: ; 70aa (1:70aa) +; initializes variables when a duel begins, such as zeroing wDuelFinished or wDuelTurns, +; and setting wDuelType based on wPlayerDuelistType and wOpponentDuelistType +InitVariablesToBeginDuel: ; 70aa (1:70aa) xor a ld [wDuelFinished], a ld [wDuelTurns], a @@ -5298,7 +5614,62 @@ InitializeDuelVariables: ; 7107 (1:7107) ret ; 0x7133 - INCROM $7133, $717a +; draw [wDuelInitialPrizes] cards from the turn holder's deck and place them as prizes: +; write their deck indexes to DUELVARS_PRIZE_CARDS, set their location to +; CARD_LOCATION_PRIZE, and set [wDuelInitialPrizes] bits of DUELVARS_PRIZES. +InitTurnDuelistPrizes: ; 7133 (1:7133) + ldh a, [hWhoseTurn] + ld d, a + ld e, DUELVARS_PRIZE_CARDS + ld a, [wDuelInitialPrizes] + ld c, a + ld b, 0 +.draw_prizes_loop + call DrawCardFromDeck + ld [de], a + inc de + ld h, d + ld l, a + ld [hl], CARD_LOCATION_PRIZE + inc b + ld a, b + cp c + jr nz, .draw_prizes_loop + push hl + ld e, c + ld d, $00 + ld hl, PrizeBitmasks + add hl, de + ld a, [hl] + pop hl + ld l, DUELVARS_PRIZES + ld [hl], a + ret +; 0x715a + +PrizeBitmasks: ; 715a (1:715a) + db %0, %1, %11, %111, %1111, %11111, %111111 +; 0x7161 + +Func_7161: ; 7161 (1:7161) + or a + ret z + ld c, a + call CountPrizes + sub c + jr nc, .asm_716b + xor a +.asm_716b + ld c, a + ld b, $00 + ld hl, PrizeBitmasks + add hl, bc + ld b, [hl] + ld a, DUELVARS_PRIZES + call GetTurnDuelistVariable + ld [hl], b + ret +; 0x717a ; clear the non-turn holder's duelvars starting at DUELVARS_ARENA_CARD_DISABLED_MOVE_INDEX ; these duelvars only last a two-player turn at most. diff --git a/src/engine/home.asm b/src/engine/home.asm index 38a748e..31a447b 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -7541,7 +7541,10 @@ DuelMenuCursorCoords: ; 278d (0:278d) db 14, 16 ; Done ; print the items of a list of cards (hand cards in a duel, cards from a booster pack...) -; and initialize the parameters of the list +; and initialize the parameters of the list given: + ; a = list length + ; de = initial page scroll offset, initial item (in the visible page) + ; hl: 9 bytes with the rest of the parameters PrintCardListItems: ; 2799 (0:2799) call InitializeCardListParameters ld hl, wMenuFunctionPointer @@ -11164,7 +11167,7 @@ Func_3b11: ; 3b11 (0:3b11) Func_3b21: ; 3b21 (0:3b21) ldh a, [hBankROM] push af - ld a, $7 + ld a, $07 call BankswitchROM call $48bc pop af @@ -11174,9 +11177,9 @@ Func_3b21: ; 3b21 (0:3b21) Func_3b31: ; 3b31 (0:3b31) ldh a, [hBankROM] push af - ld a, $7 + ld a, BANK(Func_1cb18) call BankswitchROM - call $4b18 + call Func_1cb18 jr c, .asm_3b45 xor a ld [wDoFrameFunction], a @@ -11215,7 +11218,7 @@ Func_3b6a: ; 3b6a (0:3b6a) push hl push bc push de - ld a, $7 + ld a, $07 call BankswitchROM ld a, [wd422] cp $61 @@ -11711,10 +11714,13 @@ Func_3df3: ; 3df3 (0:3df3) ret ; 0x3e10 +; draws player's portrait at b,c Func_3e10: ; 3e10 (0:3e10) ld a, $1 ld [wd61e], a ld a, $62 +; fallthrough + Func_3e17: ; 3e17 (0:3e17) ld [wd131], a ldh a, [hBankROM] @@ -11726,6 +11732,7 @@ Func_3e17: ; 3e17 (0:3e17) call BankswitchROM ret +; draws opponent's portrait given in a at b,c Func_3e2a: ; 3e2a (0:3e2a) ld [wd61e], a ld a, $63 diff --git a/src/text/text1.asm b/src/text/text1.asm index d4124c2..a483926 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -462,7 +462,7 @@ ChooseBasicPkmnToPlaceInArenaText: ; 36bc2 (d:6bc2) line "to place in the Arena." done -Text006a: ; 36bf1 (d:6bf1) +ThereAreNoBasicPokemonInHand: ; 36bf1 (d:6bf1) text "There are no Basic Pokémon" line "in <RAMNAME>'s hand." done @@ -472,7 +472,7 @@ NeitherPlayerHasBasicPkmnText: ; 36c1a (d:6c1a) line "Pokémon in his or her hand." done -Text006c: ; 36c54 (d:6c54) +ReturnCardsToDeckAndDrawAgainText: ; 36c54 (d:6c54) text "Return the cards to the Deck" line "and draw again." done @@ -482,12 +482,12 @@ ChooseUpTo5BasicPkmnToPlaceOnBenchText: ; 36c82 (d:6c82) line "to place on the Bench." done -Text006e: ; 36cbf (d:6cbf) +PleaseChooseAnActivePokemonText: ; 36cbf (d:6cbf) text "Please choose an" line "Active Pokémon." done -Text006f: ; 36ce1 (d:6ce1) +ChooseYourBenchPokemonText: ; 36ce1 (d:6ce1) text "Choose your" line "Bench Pokémon." done @@ -496,7 +496,7 @@ YouDrewText: ; 36cfd (d:6cfd) text "You drew <RAMTEXT>." done -Text0071: ; 36d0a (d:6d0a) +YouCannotSelectThisCardText: ; 36d0a (d:6d0a) text "You cannot select this card." done @@ -543,21 +543,21 @@ StartSuddenDeathMatchText: ; 36e05 (d:6e05) line "Match for 1 Prize!" done -Text007b: ; 36e2e (d:6e2e) +PrizesLeftActivePokemonCardsInDeckText: ; 36e2e (d:6e2e) text "Prizes Left" line "Active Pokémon" line "Cards in Deck" done -Text007c: ; 36e58 (d:6e58) +NoneText: ; 36e58 (d:6e58) text "None" done -Text007d: ; 36e5e (d:6e5e) +YesText: ; 36e5e (d:6e5e) text "Yes" done -Text007e: ; 36e63 (d:6e63) +CardsText: ; 36e63 (d:6e63) text "Cards" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 5f817b6..6b917ef 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -107,14 +107,14 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text0067 ; 0x0067 textpointer DeckHasXCardsText ; 0x0068 textpointer ChooseBasicPkmnToPlaceInArenaText ; 0x0069 - textpointer Text006a ; 0x006a + textpointer ThereAreNoBasicPokemonInHand ; 0x006a textpointer NeitherPlayerHasBasicPkmnText ; 0x006b - textpointer Text006c ; 0x006c + textpointer ReturnCardsToDeckAndDrawAgainText ; 0x006c textpointer ChooseUpTo5BasicPkmnToPlaceOnBenchText ; 0x006d - textpointer Text006e ; 0x006e - textpointer Text006f ; 0x006f + textpointer PleaseChooseAnActivePokemonText ; 0x006e + textpointer ChooseYourBenchPokemonText ; 0x006f textpointer YouDrewText ; 0x0070 - textpointer Text0071 ; 0x0071 + textpointer YouCannotSelectThisCardText ; 0x0071 textpointer PlacingThePrizesText ; 0x0072 textpointer PleasePlacePrizesText ; 0x0073 textpointer IfHeadPlayerPlaysFirstText ; 0x0074 @@ -124,10 +124,10 @@ TextOffsets:: ; 34000 (d:4000) textpointer WonDuelText ; 0x0078 textpointer LostDuelText ; 0x0079 textpointer StartSuddenDeathMatchText ; 0x007a - textpointer Text007b ; 0x007b - textpointer Text007c ; 0x007c - textpointer Text007d ; 0x007d - textpointer Text007e ; 0x007e + textpointer PrizesLeftActivePokemonCardsInDeckText ; 0x007b + textpointer NoneText ; 0x007c + textpointer YesText ; 0x007d + textpointer CardsText ; 0x007e textpointer Text007f ; 0x007f textpointer Text0080 ; 0x0080 textpointer WasKnockedOutText ; 0x0081 diff --git a/src/wram.asm b/src/wram.asm index 0379dec..b81e9f2 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -43,6 +43,8 @@ wPlayerDuelVariables:: ; c200 wPlayerCardLocations:: ; c200 ds DECK_SIZE +; deck indexes of the up to 6 cards placed as prizes +wPlayerPrizeCards:: ; c23c ds $6 ; Deck indexes of the cards that are in the player's hand @@ -203,6 +205,7 @@ wOpponentDuelVariables:: ; c300 wOpponentCardLocations:: ; c300 ds DECK_SIZE +wOpponentPrizeCards:: ; c33c ds $6 wOpponentHand:: ; c342 @@ -750,7 +753,11 @@ wcbfa:: ; cbfa wcbfb:: ; cbfb ds $1 - ds $2 +wcbfc:: ; cbfc + ds $1 + +wcbfd:: ; cbfd + ds $1 ; during a practice duel, identifies an entry of PracticeDuelActionTable wPracticeDuelAction:: ; cbfe |