diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm index 0bad2f6..1e3b7fb 100644 --- a/src/constants/duel_constants.asm +++ b/src/constants/duel_constants.asm @@ -29,6 +29,15 @@ DEF TURN_PLAYER_TIED EQU $3 DEF DUEL_WIN EQU $0 DEF DUEL_LOSS EQU $1 +; wChallengeMachineDuelResult constants +DEF CHALLENGE_MACHINE_DUEL_WIN EQU TURN_PLAYER_WON ; 1 +DEF CHALLENGE_MACHINE_DUEL_LOSS_OR_QUIT EQU TURN_PLAYER_LOST ; 2 + +; challenge machines +DEF NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET EQU 5 +DEF NUM_TCG_CHALLENGE_MACHINE_OPPONENT_POOL EQU 49 +DEF NUM_GR_CHALLENGE_MACHINE_OPPONENT_POOL EQU 37 + ; wPlayerDuelVariables or wOpponentDuelVariables constants DEF DUELVARS_CARD_LOCATIONS EQUS "LOW(wPlayerCardLocations)" ; 00 DEF DUELVARS_PRIZE_CARDS EQUS "LOW(wPlayerPrizeCards)" ; 3c diff --git a/src/constants/var_constants.asm b/src/constants/var_constants.asm index 805bc51..1b4ecf0 100644 --- a/src/constants/var_constants.asm +++ b/src/constants/var_constants.asm @@ -1,64 +1,64 @@ const_def - const VAR_00 ; $00 - const VAR_01 ; $01 - const VAR_02 ; $02 - const VAR_03 ; $03 - const VAR_TIMES_MET_RONALD ; $04 - const VAR_05 ; $05 - const VAR_06 ; $06 - const VAR_07 ; $07 - const VAR_08 ; $08 - const VAR_09 ; $09 - const VAR_0A ; $0a - const VAR_0B ; $0b - const VAR_0C ; $0c - const VAR_0D ; $0d - const VAR_0E ; $0e - const VAR_0F ; $0f - const VAR_GRANDMASTERCUP_PRIZE_INDEX_0 ; $10 - const VAR_GRANDMASTERCUP_PRIZE_INDEX_1 ; $11 - const VAR_GRANDMASTERCUP_PRIZE_INDEX_2 ; $12 - const VAR_GRANDMASTERCUP_PRIZE_INDEX_3 ; $13 - const VAR_GRANDMASTERCUP_OPPONENT_DECK_0 ; $14 - const VAR_GRANDMASTERCUP_OPPONENT_DECK_1 ; $15 - const VAR_GRANDMASTERCUP_OPPONENT_DECK_2 ; $16 - const VAR_GRANDMASTERCUP_OPPONENT_DECK_3 ; $17 - const VAR_GRANDMASTERCUP_OPPONENT_DECK_4 ; $18 - const VAR_GRANDMASTERCUP_OPPONENT_DECK_5 ; $19 - const VAR_GRANDMASTERCUP_OPPONENT_DECK_6 ; $1a - const VAR_1B ; $1b - const VAR_1C ; $1c - const VAR_1D ; $1d - const VAR_1E ; $1e - const VAR_1F ; $1f - const VAR_20 ; $20 - const VAR_21 ; $21 - const VAR_IMAKUNI_BLACK_WIN_COUNT ; $22 - const VAR_23 ; $23 - const VAR_24 ; $24 - const VAR_25 ; $25 - const VAR_26 ; $26 - const VAR_27 ; $27 - const VAR_TCG_CHALLENGE_CUP_STATE ; $28 - const VAR_TCG_CHALLENGE_CUP_PRIZE_INDEX ; $29 - const VAR_TIMES_WON_TCG_CHALLENGE_CUP ; $2a - const VAR_TCG_CHALLENGE_CUP_RESULT ; $2b - const VAR_CHALLENGECUP_CURRENT_ROUND ; $2c - const VAR_CHALLENGECUP_ROUND1_OPPONENT_DECK_ID ; $2d - const VAR_CHALLENGECUP_ROUND2_OPPONENT_DECK_ID ; $2e - const VAR_CHALLENGECUP_ROUND3_OPPONENT_DECK_ID ; $2f - const VAR_GR_CHALLENGE_CUP_STATE ; $30 - const VAR_GR_CHALLENGE_CUP_PRIZE_INDEX ; $31 - const VAR_TIMES_WON_GR_CHALLENGE_CUP ; $32 - const VAR_GR_CHALLENGE_CUP_RESULT ; $33 - const VAR_34 ; $34 - const VAR_35 ; $35 - const VAR_36 ; $36 - const VAR_37 ; $37 - const VAR_38 ; $38 - const VAR_39 ; $39 - const VAR_CARD_DUNGEON_PROGRESS ; $3a - const VAR_3B ; $3b: AARON_STEP_*; Fighting Fort - const VAR_NPC_DECK_ID ; $3c - const VAR_DUEL_START_THEME ; $3d - const VAR_3E ; $3e + const VAR_00 ; $00 + const VAR_01 ; $01 + const VAR_02 ; $02 + const VAR_03 ; $03 + const VAR_TIMES_MET_RONALD ; $04 + const VAR_05 ; $05 + const VAR_06 ; $06 + const VAR_07 ; $07 + const VAR_08 ; $08 + const VAR_09 ; $09 + const VAR_0A ; $0a + const VAR_0B ; $0b + const VAR_0C ; $0c + const VAR_0D ; $0d + const VAR_0E ; $0e + const VAR_0F ; $0f + const VAR_GRANDMASTERCUP_PRIZE_INDEX_0 ; $10 + const VAR_GRANDMASTERCUP_PRIZE_INDEX_1 ; $11 + const VAR_GRANDMASTERCUP_PRIZE_INDEX_2 ; $12 + const VAR_GRANDMASTERCUP_PRIZE_INDEX_3 ; $13 + const VAR_GRANDMASTERCUP_OPPONENT_DECK_0 ; $14 + const VAR_GRANDMASTERCUP_OPPONENT_DECK_1 ; $15 + const VAR_GRANDMASTERCUP_OPPONENT_DECK_2 ; $16 + const VAR_GRANDMASTERCUP_OPPONENT_DECK_3 ; $17 + const VAR_GRANDMASTERCUP_OPPONENT_DECK_4 ; $18 + const VAR_GRANDMASTERCUP_OPPONENT_DECK_5 ; $19 + const VAR_GRANDMASTERCUP_OPPONENT_DECK_6 ; $1a + const VAR_1B ; $1b + const VAR_1C ; $1c + const VAR_1D ; $1d + const VAR_1E ; $1e + const VAR_1F ; $1f + const VAR_20 ; $20 + const VAR_21 ; $21 + const VAR_IMAKUNI_BLACK_WIN_COUNT ; $22 + const VAR_23 ; $23 + const VAR_24 ; $24 + const VAR_25 ; $25 + const VAR_26 ; $26 + const VAR_27 ; $27 + const VAR_TCG_CHALLENGE_CUP_STATE ; $28 + const VAR_TCG_CHALLENGE_CUP_PRIZE_INDEX ; $29 + const VAR_TIMES_WON_TCG_CHALLENGE_CUP ; $2a + const VAR_TCG_CHALLENGE_CUP_RESULT ; $2b + const VAR_CHALLENGECUP_CURRENT_ROUND ; $2c + const VAR_CHALLENGECUP_ROUND1_OPPONENT_DECK_ID ; $2d + const VAR_CHALLENGECUP_ROUND2_OPPONENT_DECK_ID ; $2e + const VAR_CHALLENGECUP_ROUND3_OPPONENT_DECK_ID ; $2f + const VAR_GR_CHALLENGE_CUP_STATE ; $30 + const VAR_GR_CHALLENGE_CUP_PRIZE_INDEX ; $31 + const VAR_TIMES_WON_GR_CHALLENGE_CUP ; $32 + const VAR_GR_CHALLENGE_CUP_RESULT ; $33 + const VAR_CHALLENGEMACHINE_CURRENT_ROUND ; $34 + const VAR_CHALLENGEMACHINE_ROUND1_OPPONENT_DECK_ID ; $35 + const VAR_CHALLENGEMACHINE_ROUND2_OPPONENT_DECK_ID ; $36 + const VAR_CHALLENGEMACHINE_ROUND3_OPPONENT_DECK_ID ; $37 + const VAR_CHALLENGEMACHINE_ROUND4_OPPONENT_DECK_ID ; $38 + const VAR_CHALLENGEMACHINE_ROUND5_OPPONENT_DECK_ID ; $39 + const VAR_CARD_DUNGEON_PROGRESS ; $3a + const VAR_3B ; $3b: AARON_STEP_* / Fighting Fort + const VAR_NPC_DECK_ID ; $3c + const VAR_DUEL_START_THEME ; $3d + const VAR_3E ; $3e diff --git a/src/data/challenge_machine_opponents.asm b/src/data/challenge_machine_opponents.asm new file mode 100644 index 0000000..bab5716 --- /dev/null +++ b/src/data/challenge_machine_opponents.asm @@ -0,0 +1,91 @@ +; deck id and bitmask + +TCGChallengeMachineOpponents:: + db OVERFLOW_DECK_ID, %00111 + db TRIPLE_ZAPDOS_DECK_ID, %00111 + db I_LOVE_PIKACHU_DECK_ID, %00111 + db TEN_THOUSAND_VOLTS_DECK_ID, %00111 + db PSYCHOKINESIS_DECK_ID, %00111 + db PHANTOM_DECK_ID, %00111 + db PUPPET_MASTER_DECK_ID, %00111 + db ROLLING_STONE_DECK_ID, %00111 + db GREAT_EARTHQUAKE_DECK_ID, %00111 + db AWESOME_FOSSIL_DECK_ID, %00111 + db YOU_CAN_DO_IT_MACHOP_DECK_ID, %00111 + db NEW_MACHOKE_DECK_ID, %00111 + db SKILLED_WARRIOR_DECK_ID, %00111 + db I_LOVE_TO_FIGHT_DECK_ID, %00111 + db REMAINING_GREEN_DECK_ID, %00111 + db POISON_CURSE_DECK_ID, %00111 + db GLITTERING_SCALES_DECK_ID, %00111 + db STEADY_INCREASE_DECK_ID, %00111 + db NATURAL_SCIENCE_DECK_ID, %00111 + db POISONOUS_SWAMP_DECK_ID, %00111 + db GATHERING_NIDORAN_DECK_ID, %00111 + db CONSERVING_WATER_DECK_ID, %00111 + db ENERGY_REMOVAL_DECK_ID, %00111 + db SPLASHING_ABOUT_DECK_ID, %00111 + db BEACH_DECK_ID, %00111 + db FLAME_FESTIVAL_DECK_ID, %00111 + db IMMORTAL_FLAME_DECK_ID, %00111 + db ELECTRIC_CURRENT_SHOCK_DECK_ID, %00111 + db ELECTRIC_SELFDESTRUCT_DECK_ID, %01000 + db PSYCHIC_ELITE_DECK_ID, %01000 + db EVEN3_YEARS_ON_A_ROCK_DECK_ID, %01000 + db RAGING_BILLOW_OF_FISTS_DECK_ID, %01000 + db MAX_ENERGY_DECK_ID, %01000 + db DARK_SCIENCE_DECK_ID, %01000 + db RAIN_DANCE_CONFUSION_DECK_ID, %01000 + db GO_ARCANINE_DECK_ID, %01000 + db GREAT_ROCKET1_DECK_ID, %01000 + db GREAT_ROCKET2_DECK_ID, %01000 + db GREAT_ROCKET3_DECK_ID, %01000 + db GREAT_ROCKET4_DECK_ID, %01000 + db BRICK_WALK_DECK_ID, %10000 + db BENCH_TRAP_DECK_ID, %10000 + db GRAND_FIRE_DECK_ID, %10000 + db LEGENDARY_FOSSIL_DECK_ID, %10000 + db WATER_LEGEND_DECK_ID, %10000 + db GREAT_DRAGON_DECK_ID, %10000 + db WEIRD_DECK_ID, %10000 + db RONALDS_UNCOOL_DECK_ID, %10000 + db RONALDS_GRX_DECK_ID, %10000 + +GRChallengeMachineOpponents:: + db BUG_COLLECTING_DECK_ID, %00111 + db DEMONIC_FOREST_DECK_ID, %00111 + db STICKY_POISON_GAS_DECK_ID, %00111 + db CHAIN_LIGHTNING_BY_PIKACHU_DECK_ID, %00111 + db THIS_IS_THE_POWER_OF_ELECTRICITY_DECK_ID, %00111 + db COMPLETE_COMBUSTION_DECK_ID, %00111 + db FIREBALL_DECK_ID, %00111 + db EEVEE_SHOWDOWN_DECK_ID, %00111 + db WHIRLPOOL_SHOWER_DECK_ID, %00111 + db PARALYZED_PARALYZED_DECK_ID, %00111 + db BENCH_CALL_DECK_ID, %00111 + db ROCK_BLAST_DECK_ID, %00111 + db FULL_STRENGTH_DECK_ID, %00111 + db DIRECT_HIT_DECK_ID, %00111 + db SUPERDESTRUCTIVE_POWER_DECK_ID, %00111 + db BAD_DREAM_DECK_ID, %00111 + db POKEMON_POWER_DECK_ID, %00111 + db MAD_PETALS_DECK_ID, %01000 + db QUICK_ATTACK_DECK_ID, %01000 + db GAZE_UPON_THE_POWER_OF_FIRE_DECK_ID, %01000 + db WATER_STREAM_DECK_ID, %01000 + db RUNNING_WILD_DECK_ID, %01000 + db SPIRITED_AWAY_DECK_ID, %01000 + db SNORLAX_GUARD_DECK_ID, %01000 + db EYE_OF_THE_STORM_DECK_ID, %01000 + db SUDDEN_GROWTH_DECK_ID, %01000 + db BAD_GUYS_DECK_ID, %10000 + db POISON_MIST_DECK_ID, %10000 + db ULTRA_REMOVAL_DECK_ID, %10000 + db PSYCHIC_BATTLE_DECK_ID, %10000 + db STOP_LIFE_DECK_ID, %10000 + db SCORCHER_DECK_ID, %10000 + db TSUNAMI_STARTER_DECK_ID, %10000 + db SMASH_TO_MINCEMEAT_DECK_ID, %10000 + db STRANGE_DECK_ID, %10000 + db RONALDS_POWER_DECK_ID, %10000 + db RONALDS_PSYCHIC_DECK_ID, %10000 diff --git a/src/data/save.asm b/src/data/save.asm index f334373..b86aea6 100644 --- a/src/data/save.asm +++ b/src/data/save.asm @@ -68,9 +68,9 @@ WRAMToSRAMMapper_GeneralSave:: ; 64 bytes WRAMToSRAMMapper_ChallengeMachineSave:: - wram_sram_map wddf9, 20, $00, $ff - wram_sram_map wde0d, 4, $00, $ff - wram_sram_map wde11, 4, $00, $ff - wram_sram_map wde15, 4, $00, $ff - wram_sram_map wde19, 32, $00, $ff + wram_sram_map wChallengeMachineOpponentTitlesAndNames, 4 * NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET, $00, $ff + wram_sram_map wChallengeMachineSetsWonRecords, 2 * 2, $00, $ff + wram_sram_map wChallengeMachineCurWinStreaks, 2 * 2, $00, $ff + wram_sram_map wChallengeMachineWinStreakRecords, 2 * 2, $00, $ff + wram_sram_map wChallengeMachinePlayerNames, NAME_BUFFER_LENGTH * 2, $00, $ff dw NULL diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index 9d36ae2..0937694 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -34,7 +34,7 @@ StartMenu_NewGame: farcall InitSaveData call ClearSaveData call Func_c24d - call Func_eb97 + call ClearChallengeMachineRecords xor a ; FALSE farcall ReadOrInitSaveData ld a, GAME_EVENT_NEWGAME_PROLOGUE @@ -350,9 +350,9 @@ Func_c24d: ld [wSentMailBitfield + 1], a ld [wSentMailBitfield + 2], a ld [wSentMailBitfield + 3], a - call Func_ebc6 + call ValidateChallengeMachineSaveData jr nc, .asm_c299 - call Func_eb39 + call InitChallengeMachine .asm_c299 call Func_c2a7 ret @@ -1108,9 +1108,8 @@ GRIslandLocationNamePointers: tx MapGRCastleText ; OWMAP_GR_CASTLE INCLUDE "data/challenge_cup_prizes.asm" -; 0xd1ed -SECTION "Bank 3@5299", ROMX[$5299], BANK[$3] +INCLUDE "data/challenge_machine_opponents.asm" ; main ow handler for GAME_EVENT_OVERWORLD_UPDATE ; e.g. map loading, player movement/interactions, game event transitions @@ -2196,12 +2195,12 @@ GeneralVarMasks: db $21, %11111000 ; VAR_GR_CHALLENGE_CUP_PRIZE_INDEX db $22, %00001111 ; VAR_TIMES_WON_GR_CHALLENGE_CUP db $22, %00110000 ; VAR_GR_CHALLENGE_CUP_RESULT - db $23, %00000111 ; VAR_34 - db $24, %11111111 ; VAR_35 - db $25, %11111111 ; VAR_36 - db $26, %11111111 ; VAR_37 - db $27, %11111111 ; VAR_38 - db $28, %11111111 ; VAR_39 + db $23, %00000111 ; VAR_CHALLENGEMACHINE_CURRENT_ROUND + db $24, %11111111 ; VAR_CHALLENGEMACHINE_ROUND1_OPPONENT_DECK_ID + db $25, %11111111 ; VAR_CHALLENGEMACHINE_ROUND2_OPPONENT_DECK_ID + db $26, %11111111 ; VAR_CHALLENGEMACHINE_ROUND3_OPPONENT_DECK_ID + db $27, %11111111 ; VAR_CHALLENGEMACHINE_ROUND4_OPPONENT_DECK_ID + db $28, %11111111 ; VAR_CHALLENGEMACHINE_ROUND5_OPPONENT_DECK_ID db $29, %00000111 ; VAR_CARD_DUNGEON_PROGRESS db $2a, %11111111 ; VAR_3B db $2b, %11111111 ; VAR_NPC_DECK_ID @@ -4489,62 +4488,67 @@ ScriptCommand_WaitInput: INCLUDE "engine/save.asm" INCLUDE "data/save.asm" -Func_ef40: +; a = TCG_ISLAND or GR_ISLAND +; set five opponents for the set +SetChallengeMachineOpponents: or a - jr nz, .asm_ef54 - ld a, $31 + jr nz, .gr_machine + ld a, NUM_TCG_CHALLENGE_MACHINE_OPPONENT_POOL ld [wNumRandomDuelists], a - ld a, LOW($51ed) + ld a, LOW(TCGChallengeMachineOpponents) ld [wFilteredListPtr], a - ld a, HIGH($51ed) + ld a, HIGH(TCGChallengeMachineOpponents) ld [wFilteredListPtr + 1], a - jr .asm_ef63 -.asm_ef54 - ld a, $25 + jr .init +.gr_machine + ld a, NUM_GR_CHALLENGE_MACHINE_OPPONENT_POOL ld [wNumRandomDuelists], a - ld a, LOW($524f) + ld a, LOW(GRChallengeMachineOpponents) ld [wFilteredListPtr], a - ld a, HIGH($524f) + ld a, HIGH(GRChallengeMachineOpponents) ld [wFilteredListPtr + 1], a -.asm_ef63 - ld e, $05 - ld d, VAR_35 +.init + ld e, NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET + ld d, VAR_CHALLENGEMACHINE_ROUND1_OPPONENT_DECK_ID ld c, $ff -.asm_ef69 +.loop_init ld a, d call SetVarValue inc d dec e - jr nz, .asm_ef69 - ld c, $00 -.asm_ef73 - ld b, $01 + jr nz, .loop_init +; set +; b = 1 << c for c = round number [0, 4] +; set opponents randomly with the bitmask b + ld c, 0 +.loop_set_opponents + ld b, 1 ld a, c or a -.asm_ef77 - jr z, .asm_ef7e +.loop_shift + jr z, .loop_pick sla b dec a - jr .asm_ef77 -.asm_ef7e - call Func_ef97 - call Func_efb3 - jr c, .asm_ef7e + jr .loop_shift +.loop_pick + call .PickOpponent + call .CheckDupe + jr c, .loop_pick push bc ld d, a - ld a, VAR_35 + ld a, VAR_CHALLENGEMACHINE_ROUND1_OPPONENT_DECK_ID add c ld c, d call SetVarValue pop bc inc c - ld a, $05 + ld a, NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET cp c - jr nz, .asm_ef73 + jr nz, .loop_set_opponents ret -Func_ef97: -.loop +; for b = bitmask, choose a random opponent and return their deck id in a +.PickOpponent: ld a, [wFilteredListPtr] ld l, a ld a, [wFilteredListPtr + 1] @@ -4556,38 +4560,39 @@ Func_ef97: inc hl ld a, [hld] and b - jr z, .loop + jr z, .PickOpponent ld a, [hl] ret -Func_efb3: +; set carry if the opponent is already picked +.CheckDupe: ld d, a call GetNPCByDeck ld l, a - ld e, VAR_35 -.asm_efba + ld e, VAR_CHALLENGEMACHINE_ROUND1_OPPONENT_DECK_ID +.loop_check ld a, e call GetVarValue cp $ff - jr z, .asm_efcc + jr z, .done call GetNPCByDeck inc e cp l - jr nz, .asm_efba + jr nz, .loop_check ld a, d scf ret -.asm_efcc +.done ld a, d scf ccf ret -Func_efd0: - ld c, $05 - ld a, VAR_35 - ld hl, wddf9 -.asm_efd7 +LoadChallengeMachineOpponentTitlesAndNames: + ld c, NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET + ld a, VAR_CHALLENGEMACHINE_ROUND1_OPPONENT_DECK_ID + ld hl, wChallengeMachineOpponentTitlesAndNames +.loop_load push af call GetVarValue call GetNPCByDeck @@ -4607,16 +4612,16 @@ Func_efd0: pop af inc a dec c - jr nz, .asm_efd7 + jr nz, .loop_load ret -Func_eff7: - call Func_ec38 - ld a, VAR_34 +SetChallengeMachineDuelParams: + call SaveChallengeMachine + ld a, VAR_CHALLENGEMACHINE_CURRENT_ROUND call GetVarValue dec a ld c, a - ld a, VAR_35 + ld a, VAR_CHALLENGEMACHINE_ROUND1_OPPONENT_DECK_ID add c call GetVarValue ld [wNPCDuelDeckID], a diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index f79db28..473d56c 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -5479,7 +5479,7 @@ PlaySlotsPrompt: call PauseSong_SaveState push af ld a, MUSIC_GAME_CENTER_POWER_ON - call Func_3d09 + call CallPlaySong pop af call WaitForSongToFinish call ResumeSong_ClearTemp @@ -6433,7 +6433,7 @@ Func_131bd: call PauseSong_SaveState push af ld a, MUSIC_GAME_CENTER_POWER_ON - call Func_3d09 + call CallPlaySong pop af call WaitForSongToFinish call ResumeSong_ClearTemp @@ -7053,365 +7053,7 @@ ENDR pop de ret -Func_135ec: - call Func_102a4 - call Func_135f6 - call Func_102c4 - ret - -Func_135f6: - push bc - push de - push hl - ld [wddf6], a - ld a, c - ld [wddf8], a - ld a, b - ld [wddf7], a - and a - jr nz, .asm_1360e - call Func_13617 - ld a, $00 - jr c, .asm_13613 -.asm_1360e - call Func_136e4 - ld a, $01 -.asm_13613 - pop hl - pop de - pop bc - ret - -Func_13617: - call ClearSpriteAnimsAndSetInitialGraphicsConfiguration - lb de, $40, $ff - call SetupText - call Func_1362d - call SetFrameFuncAndFadeFromWhite - call Func_136db - call FadeToWhiteAndUnsetFrameFunc - ret - -Func_1362d: - lb de, 0, 0 - lb bc, 20, 13 - call DrawRegularTextBoxVRAM0 - lb de, 0, 12 - lb bc, 20, 6 - call DrawRegularTextBoxVRAM0 - ld a, [wddf6] - add a - ld c, a - ld b, $00 - ld hl, $76b0 - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - lb de, 1, 0 - call Func_2c4b - ld hl, $7697 - call PlaceTextItemsVRAM0 - ldtx hl, ChallengeMachineScoreTitleText - lb de, 1, 2 - call PrintTextNoDelay_InitVRAM0 - ld hl, wde0d - lb de, 14, 4 - call .PrintScore - ld hl, wde11 - lb de, 14, 6 - call .PrintScore - ld hl, wde15 - lb de, 14, 10 - call .PrintScore - call Func_136b4 - ret - -.PrintScore: - push hl - ld a, [wddf6] - add a - ld c, a - ld b, $00 - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld a, 3 - ld b, TRUE - farcall PrintNumber - pop hl - ret -; 0x13697 - -SECTION "Bank 4@76b4", ROMX[$76b4], BANK[$4] - -Func_136b4: - ld de, wde39 - call Func_13d1f - ld a, [wddf6] - add a - add a - add a - add a - ld c, a - ld b, $00 - ld hl, wde19 - add hl, bc - call SavePlayerName - ldtx hl, TxRam1Text - lb de, 2, 10 - call PrintTextNoDelay_InitVRAM0 - ld hl, wde39 - call SavePlayerName - ret - -Func_136db: - ldtx hl, ChallengeMachineStartPromptText - ld a, $01 - call DrawWideTextBox_PrintTextWithYesOrNoMenu - ret - -Func_136e4: - call ClearSpriteAnimsAndSetInitialGraphicsConfiguration - lb de, $40, $ff - call SetupText - call Func_1371f - call SetFrameFuncAndFadeFromWhite - ld a, [wddf8] - and a - jr z, .asm_1370b - call Func_137fa - ld a, [wddf8] - cp $02 - jr z, .asm_13718 - ld a, [wddf7] - cp $05 - scf - jr z, .asm_13718 -.asm_1370b - call Func_13792 - call Func_137df - jr nc, .asm_1371b - ld a, $02 - ld [wddf8], a -.asm_13718 - call Func_1382e -.asm_1371b - call FadeToWhiteAndUnsetFrameFunc - ret - -Func_1371f: - lb de, 0, 0 - lb bc, 20, 13 - call DrawRegularTextBoxVRAM0 - lb de, 0, 12 - lb bc, 20, 6 - call DrawRegularTextBoxVRAM0 - ld a, [wddf6] - add a - ld c, a - ld b, $00 - ld hl, $7749 - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - lb de, 1, 0 - call Func_2c4b - call Func_1374d - ret -; 0x13749 - -SECTION "Bank 4@774d", ROMX[$774d], BANK[$4] - -Func_1374d: - ld hl, wddf9 - ld c, $05 - ld e, $02 -.asm_13754 - call Func_13763 - call Func_13778 - call Func_13785 - inc e - inc e - dec c - jr nz, .asm_13754 - ret - -Func_13763: - push hl - ld a, $06 - sub c - ld [wTxRam3], a - xor a - ld [wTxRam3 + 1], a - ldtx hl, TxRam3Text - ld d, $02 - call PrintTextNoDelay_InitVRAM0 - pop hl - ret - -Func_13778: - push hl - ld a, [hli] - ld h, [hl] - ld l, a - ld d, $04 - call PrintTextNoDelay_InitVRAM0 - pop hl - inc hl - inc hl - ret - -Func_13785: - push hl - ld a, [hli] - ld h, [hl] - ld l, a - ld d, $0e - call PrintTextNoDelay_InitVRAM0 - pop hl - inc hl - inc hl - ret - -Func_13792: - ld a, [wddf7] - and a - jr nz, .asm_1379e - ldtx hl, ChallengeMachineOpponentListDialogText - call PrintScrollableText_NoTextBoxLabelVRAM0 -.asm_1379e - ld a, [wddf6] - add a - ld c, a - ld b, $00 - ld hl, wde11 - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - ld de, $1 - call CompareBCAndDE - ret c - ret z - ld h, b - ld l, c - call LoadTxRam3 - ld a, [wddf7] - inc a - ld [wTxRam3_b], a - xor a - ld [wTxRam3_b + 1], a - ld a, [wddf7] - add a - add a - ld c, a - ld b, $00 - ld hl, wddf9 - add hl, bc - inc hl - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - call LoadTxRam2 - ldtx hl, ChallengeMachineOpponentXDialogText - call PrintScrollableText_NoTextBoxLabelVRAM0 - ret - -Func_137df: -.asm_137df - ldtx hl, ChallengeMachineDuelPromptText - ld a, $01 - call DrawWideTextBox_PrintTextWithYesOrNoMenu - ret nc - ldtx hl, ChallengeMachineQuitWinStreakWarningText - call PrintScrollableText_NoTextBoxLabelVRAM0 - ldtx hl, ChallengeMachineQuitPromptText - ld a, $01 - call DrawWideTextBox_PrintTextWithYesOrNoMenu - jr c, .asm_137df - scf - ret - -Func_137fa: - ld a, [wddf7] - dec a - add a - add a - ld c, a - ld b, $00 - ld hl, wddf9 - add hl, bc - inc hl - inc hl - ld a, [hli] - ld [wTxRam2], a - ld a, [hl] - ld [wTxRam2 + 1], a - ld a, [wddf7] - ld l, a - ld h, $00 - call LoadTxRam3 - ld a, [wddf8] - dec a - jr z, .asm_13827 - ldtx hl, ChallengeMachineLossDialogText - call PrintScrollableText_NoTextBoxLabelVRAM0 - ret -.asm_13827 - ldtx hl, ChallengeMachineWinDialogText - call PrintScrollableText_NoTextBoxLabelVRAM0 - ret - -Func_1382e: - push af - ld a, [wddf8] - dec a - jr z, .asm_1384e - ld a, [wddf6] - add a - ld c, a - ld b, $00 - ld hl, wde11 - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - call LoadTxRam3 - ldtx hl, ChallengeMachineLossDialogWinStreakText - call PrintScrollableText_NoTextBoxLabelVRAM0 - jr .asm_1387e -.asm_1384e - call PauseSong_SaveState - push af - ld a, MUSIC_MEDAL - call Func_3d09 - pop af - ldtx hl, ChallengeMachineWonASetText - call PrintTextInWideTextBox - call WaitForSongToFinish - call ResumeSong_ClearTemp - call WaitForWideTextBoxInput - ld a, [wddf6] - add a - ld c, a - ld b, $00 - ld hl, wde0d - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - call LoadTxRam3 - ldtx hl, ChallengeMachineSetsWonText - call PrintScrollableText_NoTextBoxLabelVRAM0 -.asm_1387e - ldtx hl, ChallengeMachineComeAgainText - call PrintScrollableText_NoTextBoxLabelVRAM0 - pop af - ret +INCLUDE "engine/challenge_machine.asm" INCLUDE "engine/credits_commands.asm" @@ -7656,6 +7298,7 @@ LoadPlayerName: pop bc ret +; from hl to sPlayerName SavePlayerName: push af push bc @@ -7672,14 +7315,15 @@ SavePlayerName: pop af ret -Func_13d1f: +; from sPlayerName to de +LoadPlayerNameToDE: push af push bc push de push hl call EnableSRAM ld hl, sPlayerName - ld bc, $10 + ld bc, NAME_BUFFER_LENGTH call CopyBCBytesFromHLToDE call DisableSRAM pop hl diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm index 214f521..87c4852 100644 --- a/src/engine/bank07.asm +++ b/src/engine/bank07.asm @@ -3737,7 +3737,7 @@ Func_1db81: call DoAFrames_WithPreCheck push af ld a, MUSIC_MEDAL - call Func_3d09 + call CallPlaySong pop af call WaitForSongToFinish ld a, 60 @@ -5331,7 +5331,7 @@ Func_1e60c: ld a, [wDuelStartTheme] push af ld a, a ; wow - call Func_3d09 + call CallPlaySong pop af ; print duelist intro text @@ -5694,7 +5694,7 @@ _GiveBoosterPack: call PauseSong_SaveState push af ld a, MUSIC_BOOSTER_PACK - call Func_3d09 + call CallPlaySong pop af ld a, [wCurBoosterPack] add a diff --git a/src/engine/bank10.asm b/src/engine/bank10.asm index f2da20e..95ea67e 100644 --- a/src/engine/bank10.asm +++ b/src/engine/bank10.asm @@ -1341,8 +1341,8 @@ MasonLaboratoryMain_NPCInteractions: MasonLaboratoryMain_OWInteractions: ow_script 1, 2, PCMenu ow_script 2, 2, PCMenu - ow_script 6, 3, Func_4101d - ow_script 7, 3, Func_4101d + ow_script 6, 3, Script_TCGChallengeMachine + ow_script 7, 3, Script_TCGChallengeMachine db $ff MasonLaboratoryMain_MapScripts: @@ -1461,7 +1461,7 @@ Func_40f21: scf ret .asm_40f34 - farcall Func_ec6c + farcall LoadChallengeMachineSave call Func_41074 scf ret @@ -1586,45 +1586,45 @@ Func_40fff: call Func_40fbc ret -Func_4101d: +Script_TCGChallengeMachine: ld a, EVENT_MASONS_LAB_CHALLENGE_MACHINE_STATE farcall GetEventValue ret z - farcall Func_ebc6 - jr nc, .asm_41038 - farcall Func_eb39 + farcall ValidateChallengeMachineSaveData + jr nc, .no_error + farcall InitChallengeMachine xor a start_script start_dialog print_text ChallengeMachineWinStreakRecordCorruptedAndResetText end_dialog end_script -.asm_41038 - farcall Func_ec6c +.no_error + farcall LoadChallengeMachineSave xor a - farcall Func_ef40 - farcall Func_efd0 + farcall SetChallengeMachineOpponents + farcall LoadChallengeMachineOpponentTitlesAndNames xor a ld bc, $0 - farcall Func_135ec + farcall ChallengeMachine jr c, .asm_41061 xor a start_script set_event EVENT_EB - set_var VAR_34, $01 + set_var VAR_CHALLENGEMACHINE_CURRENT_ROUND, $01 send_mail $0d end_script - farcall Func_eff7 + farcall SetChallengeMachineDuelParams jr .asm_41073 .asm_41061 or a jr z, .asm_41073 ld bc, $0 ld a, c - ld [wde11], a + ld [wTCGChallengeMachineCurWinStreak], a ld a, b - ld [wde11 + 1], a - farcall Func_ec38 + ld [wTCGChallengeMachineCurWinStreak + 1], a + farcall SaveChallengeMachine .asm_41073 ret @@ -1632,78 +1632,78 @@ Func_41074: ld a, EVENT_SET_UNTIL_MAP_RELOAD_2 farcall GetEventValue jp z, .asm_410ee - ld a, [wde11] + ld a, [wTCGChallengeMachineCurWinStreak] ld c, a - ld a, [wde11 + 1] + ld a, [wTCGChallengeMachineCurWinStreak + 1] ld b, a inc bc cp16bc_long 1000 jr nc, .asm_4109a ld a, c - ld [wde11], a + ld [wTCGChallengeMachineCurWinStreak], a ld a, b - ld [wde11 + 1], a + ld [wTCGChallengeMachineCurWinStreak + 1], a .asm_4109a - ld a, VAR_34 + ld a, VAR_CHALLENGEMACHINE_CURRENT_ROUND farcall GetVarValue cp $05 jr z, .asm_410c4 ld b, a xor a ld c, $01 - farcall Func_135ec + farcall ChallengeMachine jp c, .asm_410fc - ld a, VAR_34 + ld a, VAR_CHALLENGEMACHINE_CURRENT_ROUND ld d, a farcall GetVarValue inc a ld c, a ld a, d farcall SetVarValue - farcall Func_eff7 + farcall SetChallengeMachineDuelParams jp .asm_41114 .asm_410c4 - ld a, [wde0d] + ld a, [wTCGChallengeMachineSetsWonRecord] ld c, a - ld a, [wde0d + 1] + ld a, [wTCGChallengeMachineSetsWonRecord + 1] ld b, a inc bc cp16bc_long 1000 jr nc, .asm_410e1 ld a, c - ld [wde0d], a + ld [wTCGChallengeMachineSetsWonRecord], a ld a, b - ld [wde0d + 1], a + ld [wTCGChallengeMachineSetsWonRecord + 1], a .asm_410e1 call Func_4112e xor a ld bc, $501 - farcall Func_135ec + farcall ChallengeMachine jr .asm_41115 .asm_410ee - ld a, VAR_34 + ld a, VAR_CHALLENGEMACHINE_CURRENT_ROUND farcall GetVarValue ld b, a xor a ld c, $02 - farcall Func_135ec + farcall ChallengeMachine .asm_410fc call Func_4112e ld bc, $0 ld a, c - ld [wde11], a + ld [wTCGChallengeMachineCurWinStreak], a ld a, b - ld [wde11 + 1], a + ld [wTCGChallengeMachineCurWinStreak + 1], a .asm_4110a ld a, EVENT_EB farcall ZeroOutEventValue - farcall Func_ec38 + farcall SaveChallengeMachine .asm_41114 ret .asm_41115 - ld a, [wde11] + ld a, [wTCGChallengeMachineCurWinStreak] ld e, a - ld a, [wde11 + 1] + ld a, [wTCGChallengeMachineCurWinStreak + 1] ld d, a cp16_long 50 jr nz, .asm_4110a @@ -1711,13 +1711,13 @@ Func_41074: jr .asm_4110a Func_4112e: - ld a, [wde11] + ld a, [wTCGChallengeMachineCurWinStreak] ld c, a - ld a, [wde11 + 1] + ld a, [wTCGChallengeMachineCurWinStreak + 1] ld b, a - ld a, [wde15] + ld a, [wTCGChallengeMachineWinStreakRecord] ld e, a - ld a, [wde15 + 1] + ld a, [wTCGChallengeMachineWinStreakRecord + 1] ld d, a cp16bc_long de jr nc, .asm_4114a @@ -1725,12 +1725,12 @@ Func_4112e: ret .asm_4114a ld a, c - ld [wde15], a + ld [wTCGChallengeMachineWinStreakRecord], a ld a, b - ld [wde15 + 1], a + ld [wTCGChallengeMachineWinStreakRecord + 1], a call EnableSRAM ld hl, sPlayerName - ld de, wde19 + ld de, wTCGChallengeMachinePlayerName ld bc, $10 call CopyDataHLtoDE_SaveRegisters call DisableSRAM @@ -4514,7 +4514,7 @@ Func_426d6: jp z, Script_GRCupRound2AfterDuel jp Script_GRCupRound3AfterDuel .asm_426ef - farcall Func_ec6c + farcall LoadChallengeMachineSave call Func_42776 scf ret @@ -4546,9 +4546,9 @@ Script_GRChallengeMachine: ld a, EVENT_MASONS_LAB_CHALLENGE_MACHINE_STATE farcall GetEventValue ret z - farcall Func_ebc6 + farcall ValidateChallengeMachineSaveData jr nc, .asm_4273a - farcall Func_eb39 + farcall InitChallengeMachine xor a start_script start_dialog @@ -4556,30 +4556,30 @@ Script_GRChallengeMachine: end_dialog end_script .asm_4273a - farcall Func_ec6c + farcall LoadChallengeMachineSave ld a, $01 - farcall Func_ef40 - farcall Func_efd0 + farcall SetChallengeMachineOpponents + farcall LoadChallengeMachineOpponentTitlesAndNames ld a, $01 ld bc, $0 - farcall Func_135ec + farcall ChallengeMachine jr c, .asm_42763 xor a start_script set_event EVENT_EB - set_var VAR_34, $01 + set_var VAR_CHALLENGEMACHINE_CURRENT_ROUND, $01 end_script - farcall Func_eff7 + farcall SetChallengeMachineDuelParams jr .asm_42775 .asm_42763 or a jr z, .asm_42775 ld bc, $0 ld a, c - ld [wde13], a + ld [wGRChallengeMachineCurWinStreak], a ld a, b - ld [wde13 + 1], a - farcall Func_ec38 + ld [wGRChallengeMachineCurWinStreak + 1], a + farcall SaveChallengeMachine .asm_42775 ret @@ -4587,78 +4587,78 @@ Func_42776: ld a, EVENT_SET_UNTIL_MAP_RELOAD_2 farcall GetEventValue jp z, .asm_427f2 - ld a, [wde13] + ld a, [wGRChallengeMachineCurWinStreak] ld c, a - ld a, [wde13 + 1] + ld a, [wGRChallengeMachineCurWinStreak + 1] ld b, a inc bc cp16bc_long 1000 jr nc, .asm_4279c ld a, c - ld [wde13], a + ld [wGRChallengeMachineCurWinStreak], a ld a, b - ld [wde13 + 1], a + ld [wGRChallengeMachineCurWinStreak + 1], a .asm_4279c - ld a, VAR_34 + ld a, VAR_CHALLENGEMACHINE_CURRENT_ROUND farcall GetVarValue cp $05 jr z, .asm_427c7 ld b, a ld a, $01 ld c, $01 - farcall Func_135ec + farcall ChallengeMachine jp c, .asm_42801 - ld a, VAR_34 + ld a, VAR_CHALLENGEMACHINE_CURRENT_ROUND ld d, a farcall GetVarValue inc a ld c, a ld a, d farcall SetVarValue - farcall Func_eff7 + farcall SetChallengeMachineDuelParams jp .asm_42819 .asm_427c7 - ld a, [wde0f] + ld a, [wGRChallengeMachineSetsWonRecord] ld c, a - ld a, [wde0f + 1] + ld a, [wGRChallengeMachineSetsWonRecord + 1] ld b, a inc bc cp16bc_long 1000 jr nc, .asm_427e4 ld a, c - ld [wde0f], a + ld [wGRChallengeMachineSetsWonRecord], a ld a, b - ld [wde0f + 1], a + ld [wGRChallengeMachineSetsWonRecord + 1], a .asm_427e4 call Func_42833 ld a, $01 ld bc, $501 - farcall Func_135ec + farcall ChallengeMachine jr .asm_4281a .asm_427f2 - ld a, VAR_34 + ld a, VAR_CHALLENGEMACHINE_CURRENT_ROUND farcall GetVarValue ld b, a ld a, $01 ld c, $02 - farcall Func_135ec + farcall ChallengeMachine .asm_42801 call Func_42833 ld bc, $0 ld a, c - ld [wde13], a + ld [wGRChallengeMachineCurWinStreak], a ld a, b - ld [wde13 + 1], a + ld [wGRChallengeMachineCurWinStreak + 1], a .asm_4280f ld a, EVENT_EB farcall ZeroOutEventValue - farcall Func_ec38 + farcall SaveChallengeMachine .asm_42819 ret .asm_4281a - ld a, [wde13] + ld a, [wGRChallengeMachineCurWinStreak] ld e, a - ld a, [wde13 + 1] + ld a, [wGRChallengeMachineCurWinStreak + 1] ld d, a cp16_long 50 jr nz, .asm_4280f @@ -4666,13 +4666,13 @@ Func_42776: jr .asm_4280f Func_42833: - ld a, [wde13] + ld a, [wGRChallengeMachineCurWinStreak] ld c, a - ld a, [wde13 + 1] + ld a, [wGRChallengeMachineCurWinStreak + 1] ld b, a - ld a, [wde17] + ld a, [wGRChallengeMachineWinStreakRecord] ld e, a - ld a, [wde17 + 1] + ld a, [wGRChallengeMachineWinStreakRecord + 1] ld d, a cp16bc_long de jr nc, .asm_4284f @@ -4680,12 +4680,12 @@ Func_42833: ret .asm_4284f ld a, c - ld [wde17], a + ld [wGRChallengeMachineWinStreakRecord], a ld a, b - ld [wde17 + 1], a + ld [wGRChallengeMachineWinStreakRecord + 1], a call EnableSRAM ld hl, sPlayerName - ld de, wde29 + ld de, wGRChallengeMachinePlayerName ld bc, NAME_BUFFER_LENGTH call CopyDataHLtoDE_SaveRegisters call DisableSRAM diff --git a/src/engine/challenge_machine.asm b/src/engine/challenge_machine.asm new file mode 100644 index 0000000..e3815b6 --- /dev/null +++ b/src/engine/challenge_machine.asm @@ -0,0 +1,378 @@ +; a -> wChallengeMachineIndex (island) +; b -> wChallengeMachineCurRound [0, 4] +; c -> wChallengeMachineDuelResult +ChallengeMachine: + call Func_102a4 + call _ChallengeMachine + call Func_102c4 + ret + +_ChallengeMachine: + push bc + push de + push hl + ld [wChallengeMachineIndex], a + ld a, c + ld [wChallengeMachineDuelResult], a + ld a, b + ld [wChallengeMachineCurRound], a + and a + jr nz, .resume_challenge +; new challenge + call ChallengeMachine_Start + ld a, $00 + jr c, .exit +.resume_challenge + call ChallengeMachine_DrawCurSet + ld a, $01 +.exit + pop hl + pop de + pop bc + ret + +ChallengeMachine_Start: + call ClearSpriteAnimsAndSetInitialGraphicsConfiguration + lb de, $40, $ff + call SetupText + call ChallengeMachine_DrawScoreScreen + call SetFrameFuncAndFadeFromWhite + call ChallengeMachine_StartConfirmation + call FadeToWhiteAndUnsetFrameFunc + ret + +ChallengeMachine_DrawScoreScreen: + lb de, 0, 0 + lb bc, 20, 13 + call DrawRegularTextBoxVRAM0 + lb de, 0, 12 + lb bc, 20, 6 + call DrawRegularTextBoxVRAM0 + ld a, [wChallengeMachineIndex] + add a + ld c, a + ld b, $00 + ld hl, .name_table + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + lb de, 1, 0 + call Func_2c4b + ld hl, .text_items + call PlaceTextItemsVRAM0 + ldtx hl, ChallengeMachineScoreTitleText + lb de, 1, 2 + call PrintTextNoDelay_InitVRAM0 + ld hl, wChallengeMachineSetsWonRecords + lb de, 14, 4 + call .PrintScore + ld hl, wChallengeMachineCurWinStreaks + lb de, 14, 6 + call .PrintScore + ld hl, wChallengeMachineWinStreakRecords + lb de, 14, 10 + call .PrintScore + call .PrintPlayerName + ret + +.PrintScore: + push hl + ld a, [wChallengeMachineIndex] + add a + ld c, a + ld b, $00 + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld a, 3 + ld b, TRUE + farcall PrintNumber + pop hl + ret + +.text_items: + textitem 2, 4, ChallengeMachineSetsWonRecordText + textitem 2, 6, ChallengeMachineCurrentWinStreakText + textitem 1, 8, ChallengeMachineWinStreakRecordText + textitem 17, 4, AttemptsUnitText + textitem 17, 6, WinsUnitText + textitem 17, 10, WinsUnitText + textitems_end + +.name_table: + tx TCGChallengeMachineText + tx GRChallengeMachineText + +.PrintPlayerName: + ld de, wChallengeMachineTempPlayerName + call LoadPlayerNameToDE + ld a, [wChallengeMachineIndex] +REPT 4 ; *= NAME_BUFFER_LENGTH + add a +ENDR + ld c, a + ld b, $00 + ld hl, wChallengeMachinePlayerNames + add hl, bc + call SavePlayerName + ldtx hl, TxRam1Text + lb de, 2, 10 + call PrintTextNoDelay_InitVRAM0 + ld hl, wChallengeMachineTempPlayerName + call SavePlayerName + ret + +ChallengeMachine_StartConfirmation: + ldtx hl, ChallengeMachineStartPromptText + ld a, $01 + call DrawWideTextBox_PrintTextWithYesOrNoMenu + ret + +ChallengeMachine_DrawCurSet: + call ClearSpriteAnimsAndSetInitialGraphicsConfiguration + lb de, $40, $ff + call SetupText + call ChallengeMachine_DrawOpponentList + call SetFrameFuncAndFadeFromWhite + ld a, [wChallengeMachineDuelResult] + and a + jr z, .next_opponent + call ChallengeMachine_PrintRoundResult + ld a, [wChallengeMachineDuelResult] + cp CHALLENGE_MACHINE_DUEL_LOSS_OR_QUIT + jr z, .finished_set + ld a, [wChallengeMachineCurRound] + cp NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET + scf + jr z, .finished_set +.next_opponent + call ChallengeMachine_PrintOpponentDialog + call ChallengeMachine_ProceedConfirmation + jr nc, .done +; quit + ld a, CHALLENGE_MACHINE_DUEL_LOSS_OR_QUIT + ld [wChallengeMachineDuelResult], a +.finished_set + call ChallengeMachine_PrintSetResult +.done + call FadeToWhiteAndUnsetFrameFunc + ret + +ChallengeMachine_DrawOpponentList: + lb de, 0, 0 + lb bc, 20, 13 + call DrawRegularTextBoxVRAM0 + lb de, 0, 12 + lb bc, 20, 6 + call DrawRegularTextBoxVRAM0 + ld a, [wChallengeMachineIndex] + add a + ld c, a + ld b, $00 + ld hl, .name_table + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + lb de, 1, 0 + call Func_2c4b + call ChallengeMachine_PrintOpponentInfo + ret + +.name_table: + tx TCGChallengeMachineText + tx GRChallengeMachineText + +ChallengeMachine_PrintOpponentInfo: + ld hl, wChallengeMachineOpponentTitlesAndNames + ld c, NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET + ld e, 2 ; beginning y-pos +.loop_rounds + call .PrintRoundNumber + call .PrintOpponentTitle + call .PrintOpponentName +; down 2 rows + inc e + inc e + dec c + jr nz, .loop_rounds + ret + +.PrintRoundNumber: + push hl + ld a, NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET + 1 + sub c + ld [wTxRam3], a + xor a + ld [wTxRam3 + 1], a + ldtx hl, TxRam3Text + ld d, 2 ; x-pos + call PrintTextNoDelay_InitVRAM0 + pop hl + ret + +.PrintOpponentTitle: + push hl + ld a, [hli] + ld h, [hl] + ld l, a + ld d, 4 ; x-pos + call PrintTextNoDelay_InitVRAM0 + pop hl + inc hl + inc hl + ret + +.PrintOpponentName: + push hl + ld a, [hli] + ld h, [hl] + ld l, a + ld d, 14 ; x-pos + call PrintTextNoDelay_InitVRAM0 + pop hl + inc hl + inc hl + ret + +ChallengeMachine_PrintOpponentDialog: + ld a, [wChallengeMachineCurRound] + and a + jr nz, .next_opponent + ldtx hl, ChallengeMachineOpponentListDialogText + call PrintScrollableText_NoTextBoxLabelVRAM0 +.next_opponent + ld a, [wChallengeMachineIndex] + add a + ld c, a + ld b, $00 + ld hl, wChallengeMachineCurWinStreaks + add hl, bc + ld c, [hl] + inc hl + ld b, [hl] + ld de, 1 + call CompareBCAndDE + ret c + ret z + ld h, b + ld l, c + call LoadTxRam3 ; current win streak + ld a, [wChallengeMachineCurRound] + inc a + ld [wTxRam3_b], a ; next round num + xor a + ld [wTxRam3_b + 1], a + ld a, [wChallengeMachineCurRound] + add a + add a + ld c, a + ld b, $00 + ld hl, wChallengeMachineOpponentTitlesAndNames + add hl, bc + inc hl + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + call LoadTxRam2 ; next opp name + ldtx hl, ChallengeMachineOpponentXDialogText + call PrintScrollableText_NoTextBoxLabelVRAM0 + ret + +ChallengeMachine_ProceedConfirmation: +.duel_prompt + ldtx hl, ChallengeMachineDuelPromptText + ld a, $01 + call DrawWideTextBox_PrintTextWithYesOrNoMenu + ret nc + ldtx hl, ChallengeMachineQuitWinStreakWarningText + call PrintScrollableText_NoTextBoxLabelVRAM0 + ldtx hl, ChallengeMachineQuitPromptText + ld a, $01 + call DrawWideTextBox_PrintTextWithYesOrNoMenu + jr c, .duel_prompt +; quit + scf + ret + +ChallengeMachine_PrintRoundResult: + ld a, [wChallengeMachineCurRound] + dec a + add a + add a + ld c, a + ld b, $00 + ld hl, wChallengeMachineOpponentTitlesAndNames + add hl, bc + inc hl + inc hl + ld a, [hli] ; last opp name + ld [wTxRam2], a + ld a, [hl] + ld [wTxRam2 + 1], a + ld a, [wChallengeMachineCurRound] + ld l, a + ld h, $00 + call LoadTxRam3 ; cur round num + ld a, [wChallengeMachineDuelResult] + dec a + jr z, .won_round +; lost round + ldtx hl, ChallengeMachineLossDialogText + call PrintScrollableText_NoTextBoxLabelVRAM0 + ret +.won_round + ldtx hl, ChallengeMachineWinDialogText + call PrintScrollableText_NoTextBoxLabelVRAM0 + ret + +ChallengeMachine_PrintSetResult: + push af + ld a, [wChallengeMachineDuelResult] + dec a + jr z, .won_set +; lost or quit + ld a, [wChallengeMachineIndex] + add a + ld c, a + ld b, $00 + ld hl, wChallengeMachineCurWinStreaks + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call LoadTxRam3 ; cur win streak + ldtx hl, ChallengeMachineLossDialogWinStreakText + call PrintScrollableText_NoTextBoxLabelVRAM0 + jr .exit +.won_set + call PauseSong_SaveState + push af + ld a, MUSIC_MEDAL + call CallPlaySong + pop af + ldtx hl, ChallengeMachineWonASetText + call PrintTextInWideTextBox + call WaitForSongToFinish + call ResumeSong_ClearTemp + call WaitForWideTextBoxInput + ld a, [wChallengeMachineIndex] + add a + ld c, a + ld b, $00 + ld hl, wChallengeMachineSetsWonRecords + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call LoadTxRam3 ; sets won + ldtx hl, ChallengeMachineSetsWonText + call PrintScrollableText_NoTextBoxLabelVRAM0 +.exit + ldtx hl, ChallengeMachineComeAgainText + call PrintScrollableText_NoTextBoxLabelVRAM0 + pop af + ret diff --git a/src/engine/save.asm b/src/engine/save.asm index 95e0e75..f9a4447 100644 --- a/src/engine/save.asm +++ b/src/engine/save.asm @@ -377,72 +377,76 @@ LoadMainSave: farcall Func_10f78 ret -Func_eb39: - ld hl, wddf9 +InitChallengeMachine: + ld hl, wChallengeMachineOpponentTitlesAndNames xor a - ld c, $14 + ld c, (2 + 2) * NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET .loop_init ld [hli], a dec c jr nz, .loop_init -; init verbosely from wde0d to wde17 - ld hl, wde0d +; init records verbosely + ld hl, wChallengeMachineSetsWonRecords xor a REPT 4 ld [hli], a ENDR - ld hl, wde11 + ld hl, wChallengeMachineCurWinStreaks xor a REPT 4 ld [hli], a ENDR - ld hl, wde15 + ld hl, wChallengeMachineWinStreakRecords xor a REPT 4 ld [hli], a ENDR - ld a, $01 - ld [wde15], a - ld a, $05 - ld [wde17], a - ld hl, .data - ld de, wde19 - ld c, $20 +; set default scorers + ld a, 1 + ld [wTCGChallengeMachineWinStreakRecord], a + ld a, 5 + ld [wGRChallengeMachineWinStreakRecord], a + ld hl, .default_scorers + ld de, wChallengeMachinePlayerNames + ld c, NAME_BUFFER_LENGTH * 2 .loop_copy ld a, [hli] ld [de], a inc de dec c jr nz, .loop_copy - call Func_ec38 + call SaveChallengeMachine ret -.data - db $04, $13, $79, $15, $0f, $6b, $0f, $34, $0f, $2f, $0f, $00, $00, $00, $00, $00, $4e, $0f, $39, $0f, $38, $0f, $5f, $0f, $21, $0f, $00, $00, $00, $00, $00, $00 +.default_scorers + db $04, $13, $79, $15, $0f, $6b, $0f, $34, $0f, $2f, $0f, $00, $00, $00, $00, $00 ; "Dr.オーヤマ" + db $4e, $0f, $39, $0f, $38, $0f, $5f, $0f, $21, $0f, $00, $00, $00, $00, $00, $00 ; "ビルリッチ" -Func_eb97: - call Func_ebc6 - jr nc, .asm_eb9f - call Func_eb39 -.asm_eb9f - call Func_ec6c -; init verbosely from wde0d to wde13 - ld hl, wde0d +; also init if has invalid save +ClearChallengeMachineRecords: + call ValidateChallengeMachineSaveData + jr nc, .valid + call InitChallengeMachine +.valid + call LoadChallengeMachineSave +; init records verbosely + ld hl, wChallengeMachineSetsWonRecords xor a REPT 4 ld [hli], a ENDR - ld hl, wde11 + ld hl, wChallengeMachineCurWinStreaks xor a REPT 4 ld [hli], a ENDR - call Func_ec38 + call SaveChallengeMachine ret -Func_ebb6: +; unused? +InitChallengeMachineChecksums: call EnableSRAM xor a ld [sChallengeMachineSaveDataChecksum0], a @@ -451,7 +455,7 @@ Func_ebb6: call DisableSRAM ret -Func_ebc6: +ValidateChallengeMachineSaveData: xor a ; BANK(sChallengeMachineSaveData) ld [wSaveDataCurBankSRAM], a ld a, LOW(WRAMToSRAMMapper_ChallengeMachineSave) @@ -483,15 +487,15 @@ Func_ebc6: ld a, c cp e jr nz, .error - ld a, [wde15 + 0] + ld a, [wTCGChallengeMachineWinStreakRecord + 0] ld e, a - ld a, [wde15 + 1] + ld a, [wTCGChallengeMachineWinStreakRecord + 1] ld d, a cp16_long 0 jr z, .error - ld a, [wde17 + 0] + ld a, [wGRChallengeMachineWinStreakRecord + 0] ld e, a - ld a, [wde17 + 1] + ld a, [wGRChallengeMachineWinStreakRecord + 1] ld d, a cp16_long 0 jr z, .error @@ -502,7 +506,7 @@ Func_ebc6: scf ret -Func_ec38: +SaveChallengeMachine: xor a ; BANK(sChallengeMachineSaveData) ld [wSaveDataCurBankSRAM], a ld a, LOW(WRAMToSRAMMapper_ChallengeMachineSave) @@ -524,7 +528,7 @@ Func_ec38: call DisableSRAM ret -Func_ec6c: +LoadChallengeMachineSave: xor a ; BANK(sChallengeMachineSaveData) ld [wSaveDataCurBankSRAM], a ld a, LOW(WRAMToSRAMMapper_ChallengeMachineSave) diff --git a/src/home/unsorted.asm b/src/home/unsorted.asm index 968d180..b757a87 100644 --- a/src/home/unsorted.asm +++ b/src/home/unsorted.asm @@ -2421,7 +2421,8 @@ Func_3d02:: ret ; a = MUSIC_* constant -Func_3d09:: +; intended for short songs? +CallPlaySong:: call PlaySong ret diff --git a/src/text/text4.asm b/src/text/text4.asm index 6c3c041..ad4f65a 100644 --- a/src/text/text4.asm +++ b/src/text/text4.asm @@ -2581,7 +2581,7 @@ MainMenuContinueFromDiaryInsteadOfDuelConfirmText: textfw "「つづきを あそぶ」で はじめます?" done -ChallengeMachineText: +TCGChallengeMachineText: textfw "チャレンジマシン" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index c5fa9e1..612153c 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -1939,7 +1939,7 @@ TextOffsets:: textpointer MainMenuContinueFromDiaryInsteadOfDuelWarning3Text ; 0x078a textpointer MainMenuContinueFromDiaryInsteadOfDuelWarning4Text ; 0x078b textpointer MainMenuContinueFromDiaryInsteadOfDuelConfirmText ; 0x078c - textpointer ChallengeMachineText ; 0x078d + textpointer TCGChallengeMachineText ; 0x078d textpointer GRChallengeMachineText ; 0x078e textpointer ChallengeMachineScoreTitleText ; 0x078f textpointer ChallengeMachineSetsWonRecordText ; 0x0790 diff --git a/src/wram.asm b/src/wram.asm index 7d3a3d5..fc0f254 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -3473,45 +3473,50 @@ wCardTilemapOffset:: ; ddf4 wddf5:: ; ddf5 ds $1 -wddf6:: ; ddf6 +; TCG_ISLAND or GR_ISLAND +wChallengeMachineIndex:: ; ddf6 ds $1 -wddf7:: ; ddf7 +wChallengeMachineCurRound:: ; ddf7 ds $1 -wddf8:: ; ddf8 +wChallengeMachineDuelResult:: ; ddf8 ds $1 -; challenge machine -wddf9:: ; ddf9 - ds $14 +; title name, dialog name for 5 rounds of the set +wChallengeMachineOpponentTitlesAndNames:: ; ddf9 + ds (2 + 2) * NUM_CHALLENGE_MACHINE_ROUNDS_PER_SET -wde0d:: ; de0d +wChallengeMachineSetsWonRecords:: ; de0d +wTCGChallengeMachineSetsWonRecord:: ; de0d ds $2 -wde0f:: ; de0f +wGRChallengeMachineSetsWonRecord:: ; de0f ds $2 -wde11:: ; de11 +wChallengeMachineCurWinStreaks:: ; de11 +wTCGChallengeMachineCurWinStreak:: ; de11 ds $2 -wde13:: ; de13 +wGRChallengeMachineCurWinStreak:: ; de13 ds $2 -wde15:: ; de15 +wChallengeMachineWinStreakRecords:: ; de15 +wTCGChallengeMachineWinStreakRecord:: ; de15 ds $2 -wde17:: ; de17 +wGRChallengeMachineWinStreakRecord:: ; de17 ds $2 -wde19:: ; de19 - ds $10 +wChallengeMachinePlayerNames:: ; de19 +wTCGChallengeMachinePlayerName:: ; de19 + ds NAME_BUFFER_LENGTH -wde29:: ; de29 - ds $10 +wGRChallengeMachinePlayerName:: ; de29 + ds NAME_BUFFER_LENGTH -wde39:: ; de39 - ds $10 +wChallengeMachineTempPlayerName:: ; de39 + ds NAME_BUFFER_LENGTH wCreditsCmdArg1:: ; de49 ds $1 diff --git a/tools/constants.py b/tools/constants.py index ec6a72f..de0106c 100644 --- a/tools/constants.py +++ b/tools/constants.py @@ -3008,12 +3008,12 @@ vars = [ "VAR_GR_CHALLENGE_CUP_PRIZE_INDEX", "VAR_TIMES_WON_GR_CHALLENGE_CUP", "VAR_GR_CHALLENGE_CUP_RESULT", - "VAR_34", - "VAR_35", - "VAR_36", - "VAR_37", - "VAR_38", - "VAR_39", + "VAR_CHALLENGEMACHINE_CURRENT_ROUND", + "VAR_CHALLENGEMACHINE_ROUND1_OPPONENT_DECK_ID", + "VAR_CHALLENGEMACHINE_ROUND2_OPPONENT_DECK_ID", + "VAR_CHALLENGEMACHINE_ROUND3_OPPONENT_DECK_ID", + "VAR_CHALLENGEMACHINE_ROUND4_OPPONENT_DECK_ID", + "VAR_CHALLENGEMACHINE_ROUND5_OPPONENT_DECK_ID", "VAR_CARD_DUNGEON_PROGRESS", "VAR_3B", "VAR_NPC_DECK_ID",