diff options
-rw-r--r-- | src/engine/bank01.asm | 108 | ||||
-rw-r--r-- | src/engine/bank04.asm | 539 | ||||
-rw-r--r-- | src/engine/home.asm | 12 | ||||
-rw-r--r-- | src/text/text1.asm | 2 | ||||
-rw-r--r-- | src/text/text_offsets.asm | 2 |
5 files changed, 616 insertions, 47 deletions
diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm index 2d0ca69..82ccfc5 100644 --- a/src/engine/bank01.asm +++ b/src/engine/bank01.asm @@ -8184,6 +8184,11 @@ Func_7344: ; 7344 (1:7344) BuildVersion: ; 7354 (1:7354) db "VER 12/20 09:36", TX_END +; possibly unreferenced, used for testing +; enters computer opponent selection screen +; handles input to select/cancel/scroll through deck IDs +; loads the NPC duel configurations if one was selected +; returns carry if selection was cancelled Func_7364: ; 7364 (1:7364) xor a ld [wTileMapFill], a @@ -8194,75 +8199,91 @@ Func_7364: ; 7364 (1:7364) call SetupText call DrawWideTextBox call EnableLCD + xor a ld [wOpponentDeckID], a - call Func_73d8 -.asm_7384 + call DrawOpponentSelectionScreen +.wait_input call DoFrame ldh a, [hDPadHeld] or a - jr z, .asm_7384 + jr z, .wait_input ld b, a + + ; handle selection/cancellation buttons and A_BUTTON | START - jr nz, .asm_73cd + jr nz, .select_opp bit B_BUTTON_F, b - jr nz, .asm_73cb + jr nz, .cancel + +; handle D-pad inputs +; check right ld a, [wOpponentDeckID] bit D_RIGHT_F, b - jr z, .asm_73a2 - inc a - cp $35 - jr c, .asm_73a2 - xor a -.asm_73a2 + jr z, .check_left + inc a ; next deck ID + cp DECK_IDS_END + 1 + jr c, .check_left + xor a ; wrap around to first deck ID + +.check_left bit D_LEFT_F, b - jr z, .asm_73ae + jr z, .check_up or a - jr nz, .asm_73ad - ld a, IMAKUNI_DECK_ID - jr .asm_73ae -.asm_73ad - dec a -.asm_73ae + jr nz, .not_first_deck_id + ld a, DECK_IDS_END ; wrap around to last deck ID + jr .check_up +.not_first_deck_id + dec a ; previous deck ID + +.check_up bit D_UP_F, b - jr z, .asm_73b9 - add $0a - cp $35 - jr c, .asm_73b9 - xor a -.asm_73b9 + jr z, .check_down + add 10 + cp DECK_IDS_END + 1 + jr c, .check_down + xor a ; wrap around to first deck ID + +.check_down bit D_DOWN_F, b - jr z, .asm_73c3 - sub $0a - jr nc, .asm_73c3 - ld a, IMAKUNI_DECK_ID -.asm_73c3 + jr z, .got_deck_id + sub 10 + jr nc, .got_deck_id + ld a, DECK_IDS_END ; wrap around to last deck ID + +.got_deck_id ld [wOpponentDeckID], a - call Func_73d8 - jr .asm_7384 -.asm_73cb + call DrawOpponentSelectionScreen + jr .wait_input + +.cancel scf ret -.asm_73cd +.select_opp ld a, [wOpponentDeckID] ld [wNPCDuelDeckID], a - call Func_3ae8 + call GetNPCDuelConfigurations or a ret ; 0x73d8 -Func_73d8: ; 73d8 (1:73d8) +; draws the current opponent to be selected +; (his/her portrait and name) +; and prints text box for selection +DrawOpponentSelectionScreen: ; 73d8 (1:73d8) ld a, [wOpponentDeckID] ld [wNPCDuelDeckID], a - call Func_3ae8 - jr c, .asm_73ec + call GetNPCDuelConfigurations + jr c, .ok + ; duel configuration not found for the NPC + ; so load a default portrait and name xor a ld [wOpponentPortrait], a ld hl, wOpponentName ld [hli], a ld [hl], a -.asm_73ec - ld hl, Data_7408 +.ok + ld hl, SelectComputerOpponentData call PlaceTextItems call DrawDuelistPortraitsAndNames ld a, [wOpponentDeckID] @@ -8272,9 +8293,14 @@ Func_73d8: ; 73d8 (1:73d8) lb bc, 15, 10 call WriteTwoByteNumberInTxSymbolFormat ret +; 0x7408 -Data_7408: ; 7408 (1:7408) - INCROM $7408, $7415 +SelectComputerOpponentData: ; 7408 (1:7408) + textitem 10, 0, Text0089 + textitem 10, 10, NumberOfPrizesText + textitem 3, 14, SelectComputerOpponentText + db $ff +; 0x7415 Func_7415: ; 7415 (1:7415) xor a diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index b780b36..41c4d28 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -1379,8 +1379,543 @@ SetNPCMatchStartTheme: ; 118d3 (4:58d3) INCLUDE "data/npcs.asm" -Func_11f4e: ; 11f4e (4:5f4e) - INCROM $11f4e, $1217b +_GetNPCDuelConfigurations: ; 11f4e (4:5f4e) + push hl + push bc + push de + ld a, [wNPCDuelDeckID] + ld e, a + ld bc, 9 ; size of struct - 1 + ld hl, DeckIDDuelConfigurations +.loop_deck_ids + ld a, [hli] + cp -1 ; end of list? + jr z, .done + cp e + jr nz, .next_deck_id + ld a, [hli] + ld [wOpponentPortrait], a + ld a, [hli] + ld [wOpponentName], a + ld a, [hli] + ld [wOpponentName + 1], a + ld a, [hl] + ld [wNPCDuelPrizes], a + scf + jr .done +.next_deck_id + add hl, bc + jr .loop_deck_ids +.done + pop de + pop bc + pop hl + ret +; 0x11f7d + +; this is most likely unreferenced +; since it expects the duel theme song +; to be stored in the duel configuration +; associated with the NPC deck ID, +; but this isn't found in the actual data +Func_11f7d: ; 11f7d (4:5f7d) + push bc + push de + ld a, [wNPCDuelDeckID] + ld e, a + ld bc, 9 ; size of struct - 1 + ld hl, $5fae +.loop_deck_ids + ld a, [hli] + cp -1 ; end of list? + jr z, .done + cp e + jr nz, .next_deck_id + push hl + ld a, [hli] + ld [wOpponentPortrait], a + ld a, [hli] + ld [wOpponentName], a + ld a, [hli] + ld [wOpponentName + 1], a + inc hl + ld a, [hli] + ld [wDuelTheme], a + pop hl + dec hl + scf + jr .done +.next_deck_id + add hl, bc + jr .loop_deck_ids +.done + pop de + pop bc + ret +; 0x11fae + +DeckIDDuelConfigurations: ; 11fae (4:5fae) + db SAMS_PRACTICE_DECK_ID ; deck ID + db SAM_PIC ; NPC portrait + tx SamNPCName ; name text ID + db 2 ; number of prize cards + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + + db SAMS_NORMAL_DECK_ID ; deck ID + db SAM_PIC ; NPC portrait + tx SamNPCName ; name text ID + db 2 ; number of prize cards + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + + db LIGHTNING_AND_FIRE_DECK_ID ; deck ID + db AARON_PIC ; NPC portrait + tx AaronNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $eb ; unknown + db $07 ; unknown + db $00 ; unknown + db $00 ; unknown + + db WATER_AND_FIGHTING_DECK_ID ; deck ID + db AARON_PIC ; NPC portrait + tx AaronNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $eb ; unknown + db $07 ; unknown + db $00 ; unknown + db $00 ; unknown + + db GRASS_AND_PSYCHIC_DECK_ID ; deck ID + db AARON_PIC ; NPC portrait + tx AaronNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $eb ; unknown + db $07 ; unknown + db $00 ; unknown + db $00 ; unknown + + db LEGENDARY_MOLTRES_DECK_ID ; deck ID + db COURTNEY_PIC ; NPC portrait + tx CourtneyNPCName ; name text ID + db 6 ; number of prize cards + db $04 ; unknown + db $ed ; unknown + db $07 ; unknown + db $00 ; unknown + db $00 ; unknown + + db LEGENDARY_ZAPDOS_DECK_ID ; deck ID + db STEVE_PIC ; NPC portrait + tx SteveNPCName ; name text ID + db 6 ; number of prize cards + db $04 ; unknown + db $ed ; unknown + db $07 ; unknown + db $00 ; unknown + db $00 ; unknown + + db LEGENDARY_ARTICUNO_DECK_ID ; deck ID + db JACK_PIC ; NPC portrait + tx JackNPCName ; name text ID + db 6 ; number of prize cards + db $04 ; unknown + db $ed ; unknown + db $07 ; unknown + db $00 ; unknown + db $00 ; unknown + + db LEGENDARY_DRAGONITE_DECK_ID ; deck ID + db ROD_PIC ; NPC portrait + tx RodNPCName ; name text ID + db 6 ; number of prize cards + db $04 ; unknown + db $ed ; unknown + db $07 ; unknown + db $00 ; unknown + db $00 ; unknown + + db FIRST_STRIKE_DECK_ID ; deck ID + db MITCH_PIC ; NPC portrait + tx MitchNPCName ; name text ID + db 6 ; number of prize cards + db $03 ; unknown + db $ea ; unknown + db $07 ; unknown + db $f9 ; unknown + db $07 ; unknown + + db ROCK_CRUSHER_DECK_ID ; deck ID + db GENE_PIC ; NPC portrait + tx GeneNPCName ; name text ID + db 6 ; number of prize cards + db $03 ; unknown + db $ea ; unknown + db $07 ; unknown + db $f9 ; unknown + db $07 ; unknown + + db GO_GO_RAIN_DANCE_DECK_ID ; deck ID + db AMY_PIC ; NPC portrait + tx AmyNPCName ; name text ID + db 6 ; number of prize cards + db $03 ; unknown + db $ea ; unknown + db $07 ; unknown + db $f8 ; unknown + db $07 ; unknown + + db ZAPPING_SELFDESTRUCT_DECK_ID ; deck ID + db ISAAC_PIC ; NPC portrait + tx IsaacNPCName ; name text ID + db 6 ; number of prize cards + db $03 ; unknown + db $ea ; unknown + db $07 ; unknown + db $f7 ; unknown + db $07 ; unknown + + db FLOWER_POWER_DECK_ID ; deck ID + db NIKKI_PIC ; NPC portrait + tx NikkiNPCName ; name text ID + db 6 ; number of prize cards + db $03 ; unknown + db $ea ; unknown + db $07 ; unknown + db $fb ; unknown + db $07 ; unknown + + db STRANGE_PSYSHOCK_DECK_ID ; deck ID + db MURRAY_PIC ; NPC portrait + tx MurrayNPCName ; name text ID + db 6 ; number of prize cards + db $03 ; unknown + db $ea ; unknown + db $07 ; unknown + db $fa ; unknown + db $07 ; unknown + + db WONDERS_OF_SCIENCE_DECK_ID ; deck ID + db RICK_PIC ; NPC portrait + tx RickNPCName ; name text ID + db 6 ; number of prize cards + db $03 ; unknown + db $ea ; unknown + db $07 ; unknown + db $fb ; unknown + db $07 ; unknown + + db FIRE_CHARGE_DECK_ID ; deck ID + db KEN_PIC ; NPC portrait + tx KenNPCName ; name text ID + db 6 ; number of prize cards + db $03 ; unknown + db $ea ; unknown + db $07 ; unknown + db $f6 ; unknown + db $07 ; unknown + + db IM_RONALD_DECK_ID ; deck ID + db RONALD_PIC ; NPC portrait + tx RonaldNPCName ; name text ID + db 6 ; number of prize cards + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + + db POWERFUL_RONALD_DECK_ID ; deck ID + db RONALD_PIC ; NPC portrait + tx RonaldNPCName ; name text ID + db 6 ; number of prize cards + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + + db INVINCIBLE_RONALD_DECK_ID ; deck ID + db RONALD_PIC ; NPC portrait + tx RonaldNPCName ; name text ID + db 4 ; number of prize cards + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + + db LEGENDARY_RONALD_DECK_ID ; deck ID + db RONALD_PIC ; NPC portrait + tx RonaldNPCName ; name text ID + db 6 ; number of prize cards + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + db $00 ; unknown + + db MUSCLES_FOR_BRAINS_DECK_ID ; deck ID + db CHRIS_PIC ; NPC portrait + tx ChrisNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f9 ; unknown + db $07 ; unknown + + db HEATED_BATTLE_DECK_ID ; deck ID + db MICHAEL_PIC ; NPC portrait + tx MichaelNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f9 ; unknown + db $07 ; unknown + + db LOVE_TO_BATTLE_DECK_ID ; deck ID + db JESSICA_PIC ; NPC portrait + tx JessicaNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f9 ; unknown + db $07 ; unknown + + db EXCAVATION_DECK_ID ; deck ID + db RYAN_PIC ; NPC portrait + tx RyanNPCName ; name text ID + db 3 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f9 ; unknown + db $07 ; unknown + + db BLISTERING_POKEMON_DECK_ID ; deck ID + db ANDREW_PIC ; NPC portrait + tx AndrewNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f9 ; unknown + db $07 ; unknown + + db HARD_POKEMON_DECK_ID ; deck ID + db MATTHEW_PIC ; NPC portrait + tx MatthewNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f9 ; unknown + db $07 ; unknown + + db WATERFRONT_POKEMON_DECK_ID ; deck ID + db SARA_PIC ; NPC portrait + tx SaraNPCName ; name text ID + db 2 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f8 ; unknown + db $07 ; unknown + + db LONELY_FRIENDS_DECK_ID ; deck ID + db AMANDA_PIC ; NPC portrait + tx AmandaNPCName ; name text ID + db 3 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f8 ; unknown + db $07 ; unknown + + db SOUND_OF_THE_WAVES_DECK_ID ; deck ID + db JOSHUA_PIC ; NPC portrait + tx JoshuaNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f8 ; unknown + db $07 ; unknown + + db PIKACHU_DECK_ID ; deck ID + db JENNIFER_PIC ; NPC portrait + tx JenniferNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f7 ; unknown + db $07 ; unknown + + db BOOM_BOOM_SELFDESTRUCT_DECK_ID ; deck ID + db NICHOLAS_PIC ; NPC portrait + tx NicholasNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f7 ; unknown + db $07 ; unknown + + db POWER_GENERATOR_DECK_ID ; deck ID + db BRANDON_PIC ; NPC portrait + tx BrandonNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f7 ; unknown + db $07 ; unknown + + db ETCETERA_DECK_ID ; deck ID + db BRITTANY_PIC ; NPC portrait + tx BrittanyNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fb ; unknown + db $07 ; unknown + + db FLOWER_GARDEN_DECK_ID ; deck ID + db KRISTIN_PIC ; NPC portrait + tx KristinNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fb ; unknown + db $07 ; unknown + + db KALEIDOSCOPE_DECK_ID ; deck ID + db HEATHER_PIC ; NPC portrait + tx HeatherNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fb ; unknown + db $07 ; unknown + + db GHOST_DECK_ID ; deck ID + db ROBERT_PIC ; NPC portrait + tx RobertNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fa ; unknown + db $07 ; unknown + + db NAP_TIME_DECK_ID ; deck ID + db DANIEL_PIC ; NPC portrait + tx DanielNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fa ; unknown + db $07 ; unknown + + db STRANGE_POWER_DECK_ID ; deck ID + db STEPHANIE_PIC ; NPC portrait + tx StephanieNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fa ; unknown + db $07 ; unknown + + db FLYIN_POKEMON_DECK_ID ; deck ID + db JOSEPH_PIC ; NPC portrait + tx JosephNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fb ; unknown + db $07 ; unknown + + db LOVELY_NIDORAN_DECK_ID ; deck ID + db DAVID_PIC ; NPC portrait + tx DavidNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fb ; unknown + db $07 ; unknown + + db POISON_DECK_ID ; deck ID + db ERIK_PIC ; NPC portrait + tx ErikNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $fb ; unknown + db $07 ; unknown + + db ANGER_DECK_ID ; deck ID + db JOHN_PIC ; NPC portrait + tx JohnNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f6 ; unknown + db $07 ; unknown + + db FLAMETHROWER_DECK_ID ; deck ID + db ADAM_PIC ; NPC portrait + tx AdamNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f6 ; unknown + db $07 ; unknown + + db RESHUFFLE_DECK_ID ; deck ID + db JONATHAN_PIC ; NPC portrait + tx JonathanNPCName ; name text ID + db 4 ; number of prize cards + db $02 ; unknown + db $e9 ; unknown + db $07 ; unknown + db $f6 ; unknown + db $07 ; unknown + + db IMAKUNI_DECK_ID ; deck ID + db IMAKUNI_PIC ; NPC portrait + tx ImakuniNPCName ; name text ID + db 6 ; number of prize cards + db $10 ; unknown + db $ec ; unknown + db $07 ; unknown + db $00 ; unknown + db $00 ; unknown + + db -1 ; end OverworldScriptTable: ; 1217b (4:617b) dw ScriptCommand_EndScript diff --git a/src/engine/home.asm b/src/engine/home.asm index 5a8c822..0651e8d 100644 --- a/src/engine/home.asm +++ b/src/engine/home.asm @@ -11084,8 +11084,16 @@ GetMapScriptPointer: ; 3abd (0:3abd) pop bc ret -Func_3ae8: ; 3ae8 (0:3ae8) - farcall Func_11f4e +; loads some configurations for the duel against +; the NPC whose deck ID is stored in wNPCDuelDeckID +; this includes NPC portrait, his/her name text ID, +; and the number of prize cards +; this was used in testing since these configurations +; are stored in the script-related NPC data for normal gameplay +; returns carry if a duel configuration was found +; for the given NPC deck ID +GetNPCDuelConfigurations: ; 3ae8 (0:3ae8) + farcall _GetNPCDuelConfigurations ret ; finds a Script from the first byte and puts the next two bytes (usually arguments?) into cb diff --git a/src/text/text1.asm b/src/text/text1.asm index bdc5fa9..e94cb49 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -620,7 +620,7 @@ SelectComputerOpponentText: ; 36f65 (d:6f65) text "Select a computer opponent." done -Text008b: ; 36f82 (d:6f82) +NumberOfPrizesText: ; 36f82 (d:6f82) text "Number of Prizes" done diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 15147ee..a62e8e7 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -140,7 +140,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer DuelistIsThinkingText ; 0x0088 textpointer Text0089 ; 0x0089 textpointer SelectComputerOpponentText ; 0x008a - textpointer Text008b ; 0x008b + textpointer NumberOfPrizesText ; 0x008b textpointer Text008c ; 0x008c textpointer Text008d ; 0x008d textpointer Text008e ; 0x008e |