Groundwork for Tradeback Move Tutor

Currently the move tutor is a little bit broken - the IDs are 1 above how they should be. Shell speculates that it's searching at the table starting from Kangaskhan due to the way the decrements shake up but it may just be making things more complicated than they are.

Big cheese code is `PrepareTradebackMoveList`, it's where things are mucking up.

Also, the code can be significantly optimised, as it's currently being adapted from the function above, `PrepareRelearnableMoveList`; It doesn't need to check levels, for example.

Note that the relearner functions properly, so use it as a reference. I may have removed something important.

Technically, we could have NO_MON as an entry which may make things shake out properly. But I'd rather have a proper fix.
This commit is contained in:
Llinos Evans 2023-04-23 06:11:05 +01:00
parent 5e21c159f9
commit 2f01628cd9
24 changed files with 1657 additions and 97 deletions

View file

@ -183,7 +183,7 @@ DEF FIRST_INDOOR_MAP EQU const_value
map_const SEAFOAM_ISLANDS_B2F, 15, 9 ; $A1 map_const SEAFOAM_ISLANDS_B2F, 15, 9 ; $A1
map_const SEAFOAM_ISLANDS_B3F, 15, 9 ; $A2 map_const SEAFOAM_ISLANDS_B3F, 15, 9 ; $A2
map_const SEAFOAM_ISLANDS_B4F, 15, 9 ; $A3 map_const SEAFOAM_ISLANDS_B4F, 15, 9 ; $A3
map_const VERMILION_OLD_ROD_HOUSE, 4, 4 ; $A4 - Now unused map_const CITRINE_TRADEBACK_HOUSE, 4, 4 ; $A4 - Was Vermillion Old Rod house
map_const FUCHSIA_GOOD_ROD_HOUSE, 4, 4 ; $A5 map_const FUCHSIA_GOOD_ROD_HOUSE, 4, 4 ; $A5
map_const POKEMON_MANSION_1F, 15, 14 ; $A6 map_const POKEMON_MANSION_1F, 15, 14 ; $A6
map_const CINNABAR_GYM, 10, 9 ; $A7 map_const CINNABAR_GYM, 10, 9 ; $A7

View file

@ -0,0 +1,2 @@
map_header CitrineTradebackHouse, CITRINE_TRADEBACK_HOUSE, HOUSE, 0
end_map_header

View file

@ -1,2 +0,0 @@
map_header VermilionOldRodHouse, VERMILION_OLD_ROD_HOUSE, HOUSE, 0
end_map_header

View file

@ -165,7 +165,7 @@ MapHeaderBanks::
db BANK(SeafoamIslandsB2F_h) db BANK(SeafoamIslandsB2F_h)
db BANK(SeafoamIslandsB3F_h) db BANK(SeafoamIslandsB3F_h)
db BANK(SeafoamIslandsB4F_h) db BANK(SeafoamIslandsB4F_h)
db BANK(VermilionOldRodHouse_h) db BANK(CitrineTradebackHouse_h)
db BANK(FuchsiaGoodRodHouse_h) db BANK(FuchsiaGoodRodHouse_h)
db BANK(PokemonMansion1F_h) db BANK(PokemonMansion1F_h)
db BANK(CinnabarGym_h) db BANK(CinnabarGym_h)

View file

@ -165,7 +165,7 @@ MapHeaderPointers::
dw SeafoamIslandsB2F_h dw SeafoamIslandsB2F_h
dw SeafoamIslandsB3F_h dw SeafoamIslandsB3F_h
dw SeafoamIslandsB4F_h dw SeafoamIslandsB4F_h
dw VermilionOldRodHouse_h dw CitrineTradebackHouse_h
dw FuchsiaGoodRodHouse_h dw FuchsiaGoodRodHouse_h
dw PokemonMansion1F_h dw PokemonMansion1F_h
dw CinnabarGym_h dw CinnabarGym_h

View file

@ -3,6 +3,7 @@ CitrineCity_Object:
def_warp_events def_warp_events
warp_event 9, 27, CITRINE_ROCKET_HOUSE, 1 warp_event 9, 27, CITRINE_ROCKET_HOUSE, 1
warp_event 9, 17, CITRINE_TRADEBACK_HOUSE, 1
def_bg_events def_bg_events

View file

@ -0,0 +1,15 @@
CitrineTradebackHouse_Object:
db $a ; border block
def_warp_events
warp_event 2, 7, LAST_MAP, 2
warp_event 3, 7, LAST_MAP, 2
def_bg_events
def_object_events
object_event 2, 4, SPRITE_GAMBLER, STAY, RIGHT, 1 ; person
object_event 5, 4, SPRITE_COOLTRAINER_M, STAY, LEFT, 2 ; person
object_event 4, 3, SPRITE_PAPER, STAY, DOWN, 3 ; person
def_warps_to CITRINE_TRADEBACK_HOUSE

View file

@ -2,11 +2,11 @@ Route25_Object:
db $2c ; border block db $2c ; border block
def_warp_events def_warp_events
warp_event 49, 11, BILLS_HOUSE, 1 warp_event 49, 5, BILLS_HOUSE, 1
warp_event 60, 1, UNDERWATER_TUNNEL, 1 warp_event 60, 1, UNDERWATER_TUNNEL, 1
def_bg_events def_bg_events
bg_event 53, 11, 11 ; Route25Text11 bg_event 51, 7, 11 ; Route25Text11
def_object_events def_object_events
object_event 14, 2, SPRITE_YOUNGSTER, STAY, DOWN, 1, OPP_YOUNGSTER, 5 object_event 14, 2, SPRITE_YOUNGSTER, STAY, DOWN, 1, OPP_YOUNGSTER, 5

View file

@ -1,13 +0,0 @@
VermilionOldRodHouse_Object:
db $a ; border block
def_warp_events
warp_event 2, 7, LAST_MAP, 9
warp_event 3, 7, LAST_MAP, 9
def_bg_events
def_object_events
object_event 2, 4, SPRITE_FISHING_GURU, STAY, RIGHT, 1 ; person
def_warps_to VERMILION_OLD_ROD_HOUSE

View file

@ -164,7 +164,7 @@ MapSongBanks::
db MUSIC_DUNGEON2, 0 ; SEAFOAM_ISLANDS_B2F db MUSIC_DUNGEON2, 0 ; SEAFOAM_ISLANDS_B2F
db MUSIC_DUNGEON2, 0 ; SEAFOAM_ISLANDS_B3F db MUSIC_DUNGEON2, 0 ; SEAFOAM_ISLANDS_B3F
db MUSIC_DUNGEON2, 0 ; SEAFOAM_ISLANDS_B4F db MUSIC_DUNGEON2, 0 ; SEAFOAM_ISLANDS_B4F
db MUSIC_CITIES2, 0 ; VERMILION_OLD_ROD_HOUSE db MUSIC_CITIES2, 0 ; CITRINE_TRADEBACK_HOUSE, was old rod house
db MUSIC_CITIES2, 0 ; FUCHSIA_GOOD_ROD_HOUSE db MUSIC_CITIES2, 0 ; FUCHSIA_GOOD_ROD_HOUSE
db MUSIC_CINNABAR_MANSION, 0 ; POKEMON_MANSION_1F db MUSIC_CINNABAR_MANSION, 0 ; POKEMON_MANSION_1F
db MUSIC_GYM, 0 ; CINNABAR_GYM db MUSIC_GYM, 0 ; CINNABAR_GYM

View file

@ -95,7 +95,6 @@ InternalMapEntries:
internal_map SAFARI_ZONE_GATE, 8, 12, SafariZoneName internal_map SAFARI_ZONE_GATE, 8, 12, SafariZoneName
internal_map FUCHSIA_MEETING_ROOM, 8, 13, FuchsiaCityName internal_map FUCHSIA_MEETING_ROOM, 8, 13, FuchsiaCityName
internal_map SEAFOAM_ISLANDS_B4F, 5, 15, SeafoamIslandsName internal_map SEAFOAM_ISLANDS_B4F, 5, 15, SeafoamIslandsName
internal_map VERMILION_OLD_ROD_HOUSE, 10, 9, VermilionCityName
internal_map FUCHSIA_GOOD_ROD_HOUSE, 8, 13, FuchsiaCityName internal_map FUCHSIA_GOOD_ROD_HOUSE, 8, 13, FuchsiaCityName
internal_map POKEMON_MANSION_1F, 2, 15, PokemonMansionName internal_map POKEMON_MANSION_1F, 2, 15, PokemonMansionName
internal_map CINNABAR_MART, 2, 15, CinnabarIslandName internal_map CINNABAR_MART, 2, 15, CinnabarIslandName

File diff suppressed because it is too large Load diff

View file

@ -22,8 +22,8 @@ SetIshiharaTeam:
IshiharaTeam: IshiharaTeam:
db EXEGGUTOR_A, 90 db EXEGGUTOR_A, 90
db PINSIR, 90 db RHYDON, 90
db CARAPTHOR, 90 db KANGASKHAN, 90
db KASANAGI, 50 db KASANAGI, 50
IF DEF(_DEBUG) IF DEF(_DEBUG)
db KOKANA, 50 db KOKANA, 50

View file

@ -702,4 +702,109 @@ PrepareRelearnableMoveList:: ; I don't know how the fuck you're a single colon i
ld [hl], c ld [hl], c
ret ret
; Modified Mateo/jojobear13 code for a Tradeback Move Tutor
PrepareTradebackMoveList:: ; I still don't know how the fuck you're a single colon in shin pokered but it sure as shit doesn't work here - PvK
; Loads Tradeback move list to wRelearnableMoves - we can reuse this variable.
; Input: party mon index = [wWhichPokemon]
; Get mon id.
ld a, [wWhichPokemon]
ld c, a
ld b, 0
ld hl, wPartySpecies
add hl, bc
ld a, [hl] ; a = mon id
ld [wd0b5], a ;joenote - put mon id into wram for potential later usage of GetMonHeader
; Get pointer to evos moves data.
dec a
ld c, a
ld b, 0
ld hl, TradebackMovesPointerTable
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a ; hl = pointer to evos moves data for our mon
push hl
; Get pointer to mon's currently-known moves.
ld a, [wWhichPokemon]
ld hl, wPartyMon1Level
ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
ld a, [hl]
ld b, a
push bc
ld a, [wWhichPokemon]
ld hl, wPartyMon1Moves
ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
pop bc
ld d, h
ld e, l
pop hl
; Skip over evolution data.
.skipEvoEntriesLoop
ld a, [hli]
and a
jr nz, .skipEvoEntriesLoop
; Write list of relearnable moves, while keeping count along the way.
; de = pointer to mon's currently-known moves
; hl = pointer to moves data for our mon
; b = mon's level
ld c, 0 ; c = count of relearnable moves
.loop
ld a, [hli]
and a
jr z, .done
cp b
jr c, .addMove
jr nz, .done
.addMove
push bc
ld a, [hli] ; move id
ld b, a
; Check if move is already known by our mon.
push de
ld a, [de]
cp b
jr z, .knowsMove
inc de
ld a, [de]
cp b
jr z, .knowsMove
inc de
ld a, [de]
cp b
jr z, .knowsMove
inc de
ld a, [de]
cp b
jr z, .knowsMove
.tradebackMove
pop de
push hl
; Add move to the list, and update the running count.
ld a, b
ld b, 0
ld hl, wMoveBuffer + 1
add hl, bc
ld [hl], a
pop hl
pop bc
inc c
jr .loop
.knowsMove
pop de
pop bc
jr .loop
.done
ld b, 0
ld hl, wMoveBuffer + 1
add hl, bc
ld a, $ff
ld [hl], a
ld hl, wMoveBuffer
ld [hl], c
ret
INCLUDE "data/pokemon/evos_moves.asm" INCLUDE "data/pokemon/evos_moves.asm"
INCLUDE "data/pokemon/tradeback_moves.asm"

View file

@ -694,7 +694,6 @@ INCLUDE "data/maps/headers/Route21.asm"
INCLUDE "data/maps/objects/Route21.asm" INCLUDE "data/maps/objects/Route21.asm"
Route21_Blocks: INCBIN "maps/Route21.blk" Route21_Blocks: INCBIN "maps/Route21.blk"
VermilionOldRodHouse_Blocks:
Route12SuperRodHouse_Blocks: Route12SuperRodHouse_Blocks:
Daycare_Blocks: INCBIN "maps/Daycare.blk" Daycare_Blocks: INCBIN "maps/Daycare.blk"
@ -714,10 +713,6 @@ INCLUDE "scripts/Route17.asm"
INCLUDE "scripts/Route19.asm" INCLUDE "scripts/Route19.asm"
INCLUDE "scripts/Route21.asm" INCLUDE "scripts/Route21.asm"
INCLUDE "data/maps/headers/VermilionOldRodHouse.asm"
INCLUDE "scripts/VermilionOldRodHouse.asm"
INCLUDE "data/maps/objects/VermilionOldRodHouse.asm"
INCLUDE "data/maps/headers/CeladonMart2F.asm" INCLUDE "data/maps/headers/CeladonMart2F.asm"
INCLUDE "scripts/CeladonMart2F.asm" INCLUDE "scripts/CeladonMart2F.asm"
INCLUDE "data/maps/objects/CeladonMart2F.asm" INCLUDE "data/maps/objects/CeladonMart2F.asm"
@ -1329,3 +1324,9 @@ INCLUDE "data/maps/headers/CitrineRocketHouse.asm"
INCLUDE "scripts/CitrineRocketHouse.asm" INCLUDE "scripts/CitrineRocketHouse.asm"
INCLUDE "data/maps/objects/CitrineRocketHouse.asm" INCLUDE "data/maps/objects/CitrineRocketHouse.asm"
CitrineRocketHouse_Blocks: INCBIN "maps/CitrineRocketHouse.blk" CitrineRocketHouse_Blocks: INCBIN "maps/CitrineRocketHouse.blk"
INCLUDE "data/maps/headers/CitrineTradebackHouse.asm"
INCLUDE "scripts/CitrineTradebackHouse.asm"
INCLUDE "data/maps/objects/CitrineTradebackHouse.asm"
INCLUDE "scripts/tradeback_move_tutor.asm"
CitrineTradebackHouse_Blocks: INCBIN "maps/CitrineTradebackHouse.blk"

View file

@ -10,9 +10,9 @@ eC<Fd
't t' 't t'
oooooteC<Fd oooooteC<Fd
' 'n meC<Fd ' 'n meC<Fd
'89 'n lll 'tt 'n lll
eC<Fd eC<Fd
'wA=r'n ooo '=r'n ooo
eC<Fd&#####"n meC<Fd eC<Fd&#####"n meC<Fd
' 'tlllllteC<Fd ' 'tlllllteC<Fd
'6 't '6 't

View file

@ -1,23 +1,27 @@
,,,,+WWWWWWWWWWWWWWWWWW%QQ$WWWWWWWW%WWWW%n ,,,,+WWWWWWWWWWWWWWWWWW%hiWWWWWWWW%WWWW%n
n n
n n
`ttt `ttt
6CCCCd eCd11eCCCC 6CCCCdhied11eCCCC
LLL LLL
nlnttnt nlnttnt
nCCCCduveC-.CCCCLlL nCCCCd|}~e-.CCCCLlL
mln mln
ttottt ttottt
TTCCdhieCCCCCCCCC11111ml CCdUUUUUUUeCCCCCC11111ml
mL mL
ttmtt ttmtt
nxTCC-hi.CCCCCCCCCQQQQQQQQQQQQQQQQQ
nCTTd TTT
|~eCCd1eCCC??????????????????;CxTT T
tt eCCCCCCQQQQQQQQQQQQQQQQQ
eCC-.CCC,,,,,,,,,,,,,,,,,,)CCxx.CCCCCCCC,,,,,,,,,,,,,,,,,,,?????????????????? nxxxteCTCdted1eCCC??????????????????;CCd
t
T
t
e-.CCC,,,,,,,,,,,,,,,,,,)CC-.CCCCCC,,,,,,,,,,,,,,,,,,,??????????????????

View file

@ -0,0 +1,15 @@
CitrineTradebackHouse_Script:
jp EnableAutoTextBoxDrawing
CitrineTradebackHouse_TextPointers:
dw TradebackTutorText1
dw CitrineTradebackHouseGuy
dw CitrineTradebackHouseBooklet
CitrineTradebackHouseBooklet:
text_far _CitrineTradebackHouseBooklet
text_end
CitrineTradebackHouseGuy:
text_far _CitrineTradebackHouseGuy
text_end

View file

@ -1,57 +0,0 @@
VermilionOldRodHouse_Script:
jp EnableAutoTextBoxDrawing
VermilionOldRodHouse_TextPointers:
dw VermilionHouse2Text1
VermilionHouse2Text1:
text_asm
ld a, [wd728]
bit 3, a ; got old rod?
jr nz, .got_item
ld hl, VermilionHouse2Text_560b1
call PrintText
call YesNoChoice
ld a, [wCurrentMenuItem]
and a
jr nz, .refused
lb bc, CANDY_JAR, 1 ; used to be the old rod, but since I've replaced it, for now he'll give you this. I believe this house is currently unused, so no issues..? ~ PvK
call GiveItem
jr nc, .bag_full
ld hl, wd728
set 3, [hl] ; got old rod
ld hl, VermilionHouse2Text_560b6
jr .done
.bag_full
ld hl, VermilionHouse2Text_560ca
jr .done
.refused
ld hl, VermilionHouse2Text_560c0
jr .done
.got_item
ld hl, VermilionHouse2Text_560c5
.done
call PrintText
jp TextScriptEnd
VermilionHouse2Text_560b1:
text_far _VermilionHouse2Text_560b1
text_end
VermilionHouse2Text_560b6:
text_far _VermilionHouse2Text_560b6
sound_get_item_1
text_far _VermilionHouse2Text_560bb
text_end
VermilionHouse2Text_560c0:
text_far _VermilionHouse2Text_560c0
text_end
VermilionHouse2Text_560c5:
text_far _VermilionHouse2Text_560c5
text_end
VermilionHouse2Text_560ca:
text_far _VermilionHouse2Text_560ca
text_end

View file

@ -0,0 +1,131 @@
TradebackTutorText1:
text_asm
; Display the list of moves to the player.
ld hl, TradebackTutorGreetingText
call PrintText
call YesNoChoice
ld a, [wCurrentMenuItem]
and a
jp nz, .exit
xor a
;charge 1000 money
ld [hMoney], a
ld [hMoney + 2], a
ld a, $0A
ld [hMoney + 1], a
call HasEnoughMoney
jr nc, .enoughMoney
; not enough money
ld hl, TradebackTutorNotEnoughMoneyText
call PrintText
jp TextScriptEnd
.enoughMoney
ld hl, TradebackTutorSaidYesText
call PrintText
; Select pokemon from party.
call SaveScreenTilesToBuffer2
xor a
ld [wListScrollOffset], a
ld [wPartyMenuTypeOrMessageID], a
ld [wUpdateSpritesEnabled], a
ld [wMenuItemToSwap], a
call DisplayPartyMenu
push af
call GBPalWhiteOutWithDelay3
call RestoreScreenTilesAndReloadTilePatterns
call LoadGBPal
pop af
jp c, .exit
ld a, [wWhichPokemon]
ld b, a
push bc
ld hl, PrepareTradebackMoveList
ld b, Bank(PrepareTradebackMoveList)
call Bankswitch
ld a, [wMoveBuffer]
and a
jr nz, .chooseMove
pop bc
ld hl, TradebackTutorNoMovesText
call PrintText
jp TextScriptEnd
.chooseMove
ld hl, TradebackTutorWhichMoveText
call PrintText
xor a
ld [wCurrentMenuItem], a
ld [wLastMenuItem], a
ld a, MOVESLISTMENU
ld [wListMenuID], a
ld de, wMoveBuffer
ld hl, wListPointer
ld [hl], e
inc hl
ld [hl], d
xor a
ld [wPrintItemPrices], a ; don't print prices
call DisplayListMenuID
pop bc
jr c, .exit ; exit if player chose cancel
push bc
; Save the selected move id.
ld a, [wcf91]
ld [wMoveNum], a
ld [wd11e],a
call GetMoveName
call CopyToStringBuffer ; copy name to wcf4b
pop bc
ld a, b
ld [wWhichPokemon], a
ld a, [wLetterPrintingDelayFlags]
push af
xor a
ld [wLetterPrintingDelayFlags], a
predef LearnMove
pop af
ld [wLetterPrintingDelayFlags], a
ld a, b
and a
jr z, .exit
; Charge 1000 money
xor a
ld [wPriceTemp], a
ld [wPriceTemp + 2], a
ld a, $0A
ld [wPriceTemp + 1], a
ld hl, wPriceTemp + 2
ld de, wPlayerMoney + 2
ld c, $3
predef SubBCDPredef
ld hl, TradebackTutorByeText
call PrintText
jp TextScriptEnd
.exit
ld hl, TradebackTutorByeText
call PrintText
jp TextScriptEnd
TradebackTutorGreetingText:
text_far _TradebackTutorGreetingText
text_end
TradebackTutorSaidYesText:
text_far _TradebackTutorSaidYesText
text_end
TradebackTutorNotEnoughMoneyText:
text_far _TradebackTutorNotEnoughMoneyText
text_end
TradebackTutorWhichMoveText:
text_far _TradebackTutorWhichMoveText
text_end
TradebackTutorByeText:
text_far _TradebackTutorByeText
text_end
TradebackTutorNoMovesText:
text_far _TradebackTutorNoMovesText
text_end

View file

@ -281,6 +281,8 @@ INCLUDE "text/move_relearner.asm"
SECTION "Text 12", ROMX SECTION "Text 12", ROMX
INCLUDE "text/CitrineRocketHouse.asm" INCLUDE "text/CitrineRocketHouse.asm"
INCLUDE "text/CitrineTradebackHouse.asm"
INCLUDE "text/tradeback_move_tutor.asm"
SECTION "Pokédex Text", ROMX SECTION "Pokédex Text", ROMX

View file

@ -0,0 +1,15 @@
_CitrineTradebackHouseGuy::
text "This man is a"
line "legend in these"
cont "parts."
para "He taught my"
line "SNORLAX how to"
cont "use LOVELY KISS!"
done
_CitrineTradebackHouseBooklet::
text "It's a book showing"
line "two strange BIRD"
cont "#MON."
done

View file

@ -0,0 +1,37 @@
_TradebackTutorGreetingText::
text "In a far-off land,"
line "our #MON can"
cont "learn different"
cont "moves."
para "For ¥1000, I can"
line "teach yours."
done
_TradebackTutorSaidYesText::
text "Which #MON"
line "should I tutor?"
prompt
_TradebackTutorNotEnoughMoneyText::
text "Great power comes"
line "at a price, you"
cont "know!"
done
_TradebackTutorWhichMoveText::
text "Which move should"
line "it learn?"
done
_TradebackTutorByeText::
text "If any of your"
line "#MON desires"
cont "power, come"
cont "visit me!"
done
_TradebackTutorNoMovesText::
text "This #MON"
line "isn't capable..."
done