kep-hack/engine/events/in_game_trades.asm
Llinos Evans dadd7ee6a6 Bug Fixes & Enhancements
- Most, if not all, Silph Co. warps have been fixed. Inappropriate ones have been removed.
- The Metal Coat can now be found where one corrupted Silph Co. warp was to fill dead space, and another is in the Power Plant, replacing Carbos.
- Bill now trades you Hisuian Arcanine after being saved.
- Bill's Grandfather now trades you Hisuian Electrode. Had to remove Crinkles, but Tangela is literally right next to Cinnabar, c'mon lol
- Toedscool can now be found behind Pallet Town, replacing Gloom and Weepinbell, making it more focused.
- Now you can't run from Omega! May expand this to more Pokemon depending on feedback and whether it's ok on processing. Main concern is making the run button too laggy - it raised some eyebrows.
2023-09-02 19:33:14 +01:00

589 lines
11 KiB
NASM

DoInGameTradeDialogue:
; trigger the trade offer/action specified by wWhichTrade
call SaveScreenTilesToBuffer2
ld hl, TradeMons
ld a, [wWhichTrade]
ld b, 0
ld c, 3 + NAME_LENGTH ; new code from Chatot4444, this bypasses the 16-limit on in-game trades.
call AddNTimes ; Also from chatot4444
ld a, [hli]
ld [wInGameTradeGiveMonSpecies], a
ld a, [hli]
ld [wInGameTradeReceiveMonSpecies], a
ld a, [hli]
push af
ld de, wInGameTradeMonNick
ld bc, NAME_LENGTH
call CopyData
pop af
ld l, a
ld h, 0
ld de, InGameTradeTextPointers
add hl, hl
add hl, de
ld a, [hli]
ld [wInGameTradeTextPointerTablePointer], a
ld a, [hl]
ld [wInGameTradeTextPointerTablePointer + 1], a
ld a, [wInGameTradeGiveMonSpecies]
ld de, wInGameTradeGiveMonName
call InGameTrade_GetMonName
ld a, [wInGameTradeReceiveMonSpecies]
ld de, wInGameTradeReceiveMonName
call InGameTrade_GetMonName
ld hl, wCompletedInGameTradeFlags
ld a, [wWhichTrade]
ld c, a
ld b, FLAG_TEST
predef FlagActionPredef
ld a, c
and a
ld a, $4
ld [wInGameTradeTextPointerTableIndex], a
jr nz, .printText
; if the trade hasn't been done yet
xor a
ld [wInGameTradeTextPointerTableIndex], a
call .printText
ld a, $1
ld [wInGameTradeTextPointerTableIndex], a
call YesNoChoice
ld a, [wCurrentMenuItem]
and a
jr nz, .printText
call InGameTrade_DoTrade
jr c, .printText
ld a, [wInGameTradeGiveMonSpecies]; for trader
cp NO_MON ; for trader
jr z, .printText ; for trader
ld hl, TradedForText
call PrintText
.printText
ld hl, wInGameTradeTextPointerTableIndex
ld a, [hld] ; wInGameTradeTextPointerTableIndex
ld e, a
ld d, 0
ld a, [hld] ; wInGameTradeTextPointerTablePointer + 1
ld l, [hl] ; wInGameTradeTextPointerTablePointer
ld h, a
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp PrintText
; copies name of species a to hl
InGameTrade_GetMonName:
push de
ld [wd11e], a
call GetMonName
ld hl, wcd6d
pop de
ld bc, NAME_LENGTH
jp CopyData
INCLUDE "data/events/trades.asm"
InGameTrade_DoTrade:
xor a ; NORMAL_PARTY_MENU
ld [wPartyMenuTypeOrMessageID], a
dec a
ld [wUpdateSpritesEnabled], a
call DisplayPartyMenu
push af
call InGameTrade_RestoreScreen
pop af
ld a, $1
jp c, .tradeFailed ; jump if the player didn't select a pokemon
ld a, [wInGameTradeGiveMonSpecies]
cp NO_MON ; for trader
jr z, .skip_mon_check ; for trader
ld b, a
ld a, [wcf91]
cp b
ld a, $2
jp nz, .tradeFailed ; jump if the selected mon's species is not the required one - changed for trader
.skip_mon_check ; for trader
ld a, [wWhichPokemon]
ld hl, wPartyMon1Level
ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
ld a, [hl]
ld [wCurEnemyLVL], a
ld a, [wInGameTradeGiveMonSpecies] ; for trader
cp NO_MON ; for trader
jr z, .skip_flag_set ; for trader
ld hl, wCompletedInGameTradeFlags
ld a, [wWhichTrade]
ld c, a
ld b, FLAG_SET
predef FlagActionPredef
.skip_flag_set
ld hl, ConnectCableText
call PrintText
ld a, [wWhichPokemon]
push af
ld a, [wCurEnemyLVL]
push af
call LoadHpBarAndStatusTilePatterns
ld a, [wInGameTradeGiveMonSpecies] ; for trader
cp NO_MON ; for trader
jr nz, .normal_in_game_trade_data ; for trader
call TradeSelf_PrepareTradeData ; for trader
jr .self_trade_data ; for trader
.normal_in_game_trade_data ; for trader
call InGameTrade_PrepareTradeData
.self_trade_data ; for trader
predef InternalClockTradeAnim
pop af
ld [wCurEnemyLVL], a
pop af
ld [wWhichPokemon], a
ld a, [wInGameTradeReceiveMonSpecies]
ld [wcf91], a
xor a
push af
ld a, [wInGameTradeGiveMonSpecies] ; for trader
cp NO_MON ; for trader
jr z, .skip_swap_mons ; for trader
pop af
ld [wRemoveMonFromBox], a
call RemovePokemon
ld a, $80 ; prevent the player from naming the mon
ld [wMonDataLocation], a
call AddPartyMon
call InGameTrade_CopyDataToReceivedMon
ld a, [wPartyCount]
dec a
ld [wWhichPokemon], a
.skip_swap_mons
callfar EvolveTradeMon
call ClearScreen
call InGameTrade_RestoreScreen
farcall RedrawMapView
and a
ld a, $3
jr .tradeSucceeded
.tradeFailed
scf
.tradeSucceeded
ld [wInGameTradeTextPointerTableIndex], a
ret
InGameTrade_RestoreScreen:
call GBPalWhiteOutWithDelay3
call RestoreScreenTilesAndReloadTilePatterns
call ReloadTilesetTilePatterns
call LoadScreenTilesFromBuffer2
call Delay3
call LoadGBPal
ld c, 10
call DelayFrames
farjp LoadWildData
TradeSelf_PrepareTradeData:
ld a, [wWhichPokemon]
ld hl, wPartySpecies
ld b, 0
ld c, a
add hl, bc
ld a, [hl]
ld [wTradedPlayerMonSpecies], a
ld [wInGameTradeReceiveMonSpecies], a
ld hl, wTradedPlayerMonSpecies
jr InGameTrade_PrepareTradeData.loaded_self_trade_instead
InGameTrade_PrepareTradeData:
ld hl, wTradedPlayerMonSpecies
ld a, [wInGameTradeGiveMonSpecies]
.loaded_self_trade_instead
ld [hli], a ; wTradedPlayerMonSpecies
ld a, [wInGameTradeReceiveMonSpecies]
ld [hl], a ; wTradedEnemyMonSpecies
ld hl, wPartyMonOT
ld bc, NAME_LENGTH
ld a, [wWhichPokemon]
call AddNTimes
ld de, wTradedPlayerMonOT
ld bc, NAME_LENGTH
call InGameTrade_CopyData
ld hl, InGameTrade_TrainerString
ld de, wTradedEnemyMonOT
call InGameTrade_CopyData
ld de, wLinkEnemyTrainerName
call InGameTrade_CopyData
ld hl, wPartyMon1OTID
ld bc, wPartyMon2 - wPartyMon1
ld a, [wWhichPokemon]
call AddNTimes
ld de, wTradedPlayerMonOTID
ld bc, $2
call InGameTrade_CopyData
call Random
ld hl, hRandomAdd
ld de, wTradedEnemyMonOTID
jp CopyData
InGameTrade_CopyData:
push hl
push bc
call CopyData
pop bc
pop hl
ret
InGameTrade_CopyDataToReceivedMon:
ld hl, wPartyMonNicks
ld bc, NAME_LENGTH
call InGameTrade_GetReceivedMonPointer
ld hl, wInGameTradeMonNick
ld bc, NAME_LENGTH
call CopyData
ld hl, wPartyMonOT
ld bc, NAME_LENGTH
call InGameTrade_GetReceivedMonPointer
ld hl, InGameTrade_TrainerString
ld bc, NAME_LENGTH
call CopyData
ld hl, wPartyMon1OTID
ld bc, wPartyMon2 - wPartyMon1
call InGameTrade_GetReceivedMonPointer
ld hl, wTradedEnemyMonOTID
ld bc, $2
jp CopyData
; the received mon's index is (partyCount - 1),
; so this adds bc to hl (partyCount - 1) times and moves the result to de
InGameTrade_GetReceivedMonPointer:
ld a, [wPartyCount]
dec a
call AddNTimes
ld e, l
ld d, h
ret
InGameTrade_TrainerString:
db "<TRAINER>@@@@@@@@@@"
InGameTradeTextPointers:
; entries correspond to TRADE_DIALOGSET_* constants
dw TradeTextPointers1
dw TradeTextPointers2
dw TradeTextPointers3
dw TradeTextPointers4
dw TradeTextPointers5
dw TradeTextPointers6 ; Combat Tauros
dw TradeTextPointers7 ; Aqua Tauros
dw TradeTextPointers8 ; Blaze Tauros
dw TradeTextPointersBill
dw TradeTextPointersGramps
TradeTextPointers1:
dw WannaTrade1Text
dw NoTrade1Text
dw WrongMon1Text
dw Thanks1Text
dw AfterTrade1Text
TradeTextPointers2:
dw WannaTrade2Text
dw NoTrade2Text
dw WrongMon2Text
dw Thanks2Text
dw AfterTrade2Text
TradeTextPointers3:
dw WannaTrade3Text
dw NoTrade3Text
dw WrongMon3Text
dw Thanks3Text
dw AfterTrade3Text
TradeTextPointers4:
dw WannaTrade4Text
dw NoTrade4Text
dw WrongMon1Text
dw Thanks4Text
dw AfterTrade1Text
TradeTextPointers5:
dw WannaTrade5Text
dw NoTrade5Text
dw WrongMon3Text
dw Thanks1Text
dw AfterTrade1Text
TradeTextPointers6: ; Combat Tauros
dw WannaTrade6Text
dw NoTrade1Text
dw WrongMon6Text
dw Thanks6Text
dw AfterTrade6Text
TradeTextPointers7: ; Aqua Tauros
dw WannaTrade7Text
dw NoTrade1Text
dw WrongMon7Text
dw Thanks6Text
dw AfterTrade7Text
TradeTextPointers8: ; Aqua Tauros
dw WannaTrade8Text
dw NoTrade1Text
dw WrongMon8Text
dw Thanks6Text
dw AfterTrade8Text
TradeTextPointersBill: ; Bill
dw BillWannaTradeText
dw BillNoTradeText
dw BillWrongMonText
dw BillThanksText
dw BillAfterTradeText
TradeTextPointersGramps: ; Bill's grandfather
dw GrampsWannaTradeText
dw GrampsNoTradeText
dw GrampsWrongMonText
dw GrampsThanksText
dw GrampsAfterTradeText
ConnectCableText:
text_far _ConnectCableText
text_end
TradedForText:
text_far _TradedForText
sound_get_key_item
text_pause
text_end
WannaTrade1Text:
text_far _WannaTrade1Text
text_end
NoTrade1Text:
text_far _NoTrade1Text
text_end
WrongMon1Text:
text_far _WrongMon1Text
text_end
Thanks1Text:
text_far _Thanks1Text
text_end
AfterTrade1Text:
text_far _AfterTrade1Text
text_end
WannaTrade2Text:
text_far _WannaTrade2Text
text_end
NoTrade2Text:
text_far _NoTrade2Text
text_end
WrongMon2Text:
text_far _WrongMon2Text
text_end
Thanks2Text:
text_far _Thanks2Text
text_end
AfterTrade2Text:
text_far _AfterTrade2Text
text_end
WannaTrade3Text:
text_far _WannaTrade3Text
text_end
NoTrade3Text:
text_far _NoTrade3Text
text_end
WrongMon3Text:
text_far _WrongMon3Text
text_end
Thanks3Text:
text_far _Thanks3Text
text_end
AfterTrade3Text:
text_far _AfterTrade3Text
text_end
WannaTrade4Text:
text_far _WannaTrade4Text
text_end
NoTrade4Text:
text_far _NoTrade4Text
text_end
Thanks4Text:
text_far _Thanks4Text
text_end
WannaTrade5Text:
text_far _WannaTrade5Text
text_end
NoTrade5Text:
text_far _NoTrade5Text
text_end
WannaTrade6Text:
text_far _WannaTrade6Text
text_end
WrongMon6Text:
text_far _WrongMon6Text
text_end
Thanks6Text:
text_far _Thanks6Text
text_end
AfterTrade6Text:
text_far _AfterTrade6Text
text_end
WannaTrade7Text:
text_far _WannaTrade7Text
text_end
WrongMon7Text:
text_far _WrongMon7Text
text_end
AfterTrade7Text:
text_far _AfterTrade7Text
text_end
WannaTrade8Text:
text_far _WannaTrade8Text
text_end
WrongMon8Text:
text_far _WrongMon8Text
text_end
AfterTrade8Text:
text_far _AfterTrade8Text
text_end
BillWannaTradeText:
text "BILL: Say, bud,"
line "do you happen"
cont "to have an"
cont "ARCANINE?"
para "I caught this"
line "special one in"
cont "my experiments,"
cont "but it's not"
cont "tame at all."
para "If you trade"
line "me yours, you"
cont "can have it!"
done
text_end
BillNoTradeText:
text "No? Well, it"
line "isn't going"
cont "anywhere..."
done
text_end
BillWrongMonText:
text "That's no"
line "ARCANINE, bud!"
cont "You trying to"
cont "con me?"
done
text_end
BillThanksText:
text "Thanks a bunch!"
done
text_end
BillAfterTradeText:
text "I've been working"
line "on a machine to"
cont "connect with the"
cont "past."
para "That's how I got"
line "that ARCANINE!"
para "Take care of it,"
line "would ya?"
done
text_end
GrampsWannaTradeText:
text "Hmm? You've met"
line "BILL?"
para "He's my grandson!"
para "He gave me this"
line "ELECTRODE that"
cont "reminds me of my"
cont "younger years,"
cont "but..."
para "It's just too"
line "aggressive! Do"
cont "you mind trading"
cont "me a more modern"
cont "one?"
done
text_end
GrampsNoTradeText:
text "No? Oh..."
done
text_end
GrampsWrongMonText:
text "My eyes aren't"
line "what they used"
cont "to be..."
para "But that's no"
line "ELECTRODE!"
done
text_end
GrampsThanksText:
text "Thank you so"
line "much!"
done
text_end
GrampsAfterTradeText:
text "I don't know"
line "where BILL got"
cont "that ELECTRODE."
para "He said something"
line "about a time"
cont "machine..."
para "That has to be"
line "impossible..."
done
text_end