-
Notifications
You must be signed in to change notification settings - Fork 1k
Adding gym leader rematches
Today we're going to add gym leader rematches to the game. This means that we are going to add rematchable gym leaders once the game is beaten. In this tutorial we'll add it to Brock, but it's done in nearly the same way for every gym leader.
We're going to create a check to see if it's post game or not. If not, the rematch won't be triggered. Go to ram/wram.asm
and make the following changes:
...
wFirstLockTrashCanIndex:: db
wSecondLockTrashCanIndex:: db
- ds 2
+ ds 1
+wGameStage:: db
+ ; $00 = before champion fight
+ ; $01 = post game
...
Since we're making a rematch for Brock, we'll add him a party in data/trainers/parties.asm
. Make these changes, or create your own team if you don't like it.
...
BrockData:
db $FF, 12, GEODUDE, 14, ONIX, 0
+; Rematch
+ db $FF, 62, OMASTAR, 63, ONIX, 63, KABUTOPS, 62, GOLEM, 64, DUGTRIO, 64, AERODACTYL, 0
...
Open scripts/PewterGym.asm
and make these changes.
PewterGym_Script:
ld hl, wCurrentMapScriptFlags
bit 6, [hl]
res 6, [hl]
call nz, .LoadNames
call EnableAutoTextBoxDrawing
ld hl, PewterGymTrainerHeaders
ld de, PewterGym_ScriptPointers
ld a, [wPewterGymCurScript]
call ExecuteCurMapScriptInTable
ld [wPewterGymCurScript], a
ret
.LoadNames:
ld hl, .CityName
ld de, .LeaderName
jp LoadGymLeaderAndCityName
.CityName:
db "PEWTER CITY@"
.LeaderName:
db "BROCK@"
PewterGymResetScripts:
xor a
ld [wJoyIgnore], a
ld [wPewterGymCurScript], a
ld [wCurMapScript], a
ret
PewterGym_ScriptPointers:
def_script_pointers
dw_const CheckFightingMapTrainers, SCRIPT_PEWTERGYM_DEFAULT
dw_const DisplayEnemyTrainerTextAndStartBattle, SCRIPT_PEWTERGYM_START_BATTLE
dw_const EndTrainerBattle, SCRIPT_PEWTERGYM_END_BATTLE
dw_const PewterGymBrockPostBattle, SCRIPT_PEWTERGYM_BROCK_POST_BATTLE
PewterGymBrockPostBattle:
ld a, [wIsInBattle]
cp $ff
jp z, PewterGymResetScripts
ld a, D_RIGHT | D_LEFT | D_UP | D_DOWN
ld [wJoyIgnore], a
+ ld a, [wGameStage] ; Check if player has beat the game
+ and a
+ jr nz, BrockRematchPostBattle
; fallthrough
PewterGymScriptReceiveTM34:
ld a, TEXT_PEWTERGYM_BROCK_WAIT_TAKE_THIS
ldh [hSpriteIndexOrTextID], a
call DisplayTextID
SetEvent EVENT_BEAT_BROCK
lb bc, TM_BIDE, 1
call GiveItem
jr nc, .BagFull
ld a, TEXT_PEWTERGYM_RECEIVED_TM34
ldh [hSpriteIndexOrTextID], a
call DisplayTextID
SetEvent EVENT_GOT_TM34
jr .gymVictory
.BagFull
ld a, TEXT_PEWTERGYM_TM34_NO_ROOM
ldh [hSpriteIndexOrTextID], a
call DisplayTextID
.gymVictory
ld hl, wObtainedBadges
set BIT_BOULDERBADGE, [hl]
ld hl, wBeatGymFlags
set BIT_BOULDERBADGE, [hl]
ld a, HS_GYM_GUY
ld [wMissableObjectIndex], a
predef HideObject
ld a, HS_ROUTE_22_RIVAL_1
ld [wMissableObjectIndex], a
predef HideObject
ResetEvents EVENT_1ST_ROUTE22_RIVAL_BATTLE, EVENT_ROUTE22_RIVAL_WANTS_BATTLE
; deactivate gym trainers
SetEvent EVENT_BEAT_PEWTER_GYM_TRAINER_0
jp PewterGymResetScripts
+BrockRematchPostBattle:
+ ld a, TEXT_PEWTERGYM_REMATCH_POST_BATTLE
+ ldh [hSpriteIndexOrTextID], a
+ call DisplayTextID
+ jp PewterGymResetScripts
PewterGym_TextPointers:
def_text_pointers
dw_const PewterGymBrockText, TEXT_PEWTERGYM_BROCK
dw_const PewterGymCooltrainerMText, TEXT_PEWTERGYM_COOLTRAINER_M
dw_const PewterGymGuideText, TEXT_PEWTERGYM_GYM_GUIDE
dw_const PewterGymBrockWaitTakeThisText, TEXT_PEWTERGYM_BROCK_WAIT_TAKE_THIS
dw_const PewterGymReceivedTM34Text, TEXT_PEWTERGYM_RECEIVED_TM34
dw_const PewterGymTM34NoRoomText, TEXT_PEWTERGYM_TM34_NO_ROOM
+ dw_const PewterGymRematchPostBattleText, TEXT_PEWTERGYM_REMATCH_POST_BATTLE
PewterGymTrainerHeaders:
def_trainers 2
PewterGymTrainerHeader0:
trainer EVENT_BEAT_PEWTER_GYM_TRAINER_0, 5, PewterGymCooltrainerMBattleText, PewterGymCooltrainerMEndBattleText, PewterGymCooltrainerMAfterBattleText
db -1 ; end
PewterGymBrockText:
text_asm
CheckEvent EVENT_BEAT_BROCK
jr z, .beforeBeat
CheckEventReuseA EVENT_GOT_TM34
jr nz, .afterBeat
call z, PewterGymScriptReceiveTM34
call DisableWaitingAfterTextDisplay
jr .done
.afterBeat
+ ld a, [wGameStage] ; Check if player has beat the game
+ and a
+ jr nz, .BrockRematch
ld hl, .PostBattleAdviceText
call PrintText
jr .done
.beforeBeat
ld hl, .PreBattleText
call PrintText
ld hl, wStatusFlags3
set BIT_TALKED_TO_TRAINER, [hl]
set BIT_PRINT_END_BATTLE_TEXT, [hl]
ld hl, PewterGymBrockReceivedBoulderBadgeText
ld de, PewterGymBrockReceivedBoulderBadgeText
call SaveEndBattleTextPointers
ldh a, [hSpriteIndex]
ld [wSpriteIndex], a
call EngageMapTrainer
call InitBattleEnemyParameters
ld a, $1
ld [wGymLeaderNo], a
xor a
ldh [hJoyHeld], a
jr .endBattle
+.BrockRematch
+ ld hl, .PreBattleRematch1Text
+ call PrintText
+ call YesNoChoice
+ ld a, [wCurrentMenuItem]
+ and a
+ jr nz, .refused
+ ld hl, .PreBattleRematch2Text
+ call PrintText
+ call Delay3
+ ld hl, wStatusFlags3
+ set BIT_TALKED_TO_TRAINER, [hl]
+ set BIT_PRINT_END_BATTLE_TEXT, [hl]
+ ld hl, PewterGymRematchDefeatedText
+ ld de, PewterGymRematchVictoryText
+ call SaveEndBattleTextPointers
+ ld a, OPP_BROCK
+ ld [wCurOpponent], a
+ ld a, 2
+ ld [wTrainerNo], a
+ ld a, $4 ; new script
+ ld [wPewterGymCurScript], a
+ ld [wCurMapScript], a
+ jr .endBattle
+.refused
+ ld hl, .PreBattleRematchRefusedText
+ call PrintText
+ jr .done
.endBattle
ld a, SCRIPT_PEWTERGYM_BROCK_POST_BATTLE
ld [wPewterGymCurScript], a
ld [wCurMapScript], a
.done
jp TextScriptEnd
...
Open text/PewterGym.asm and put these lines at the end. Customize the text for other gym leaders to make them sound more like themselves.
...
+_PewterGymRematchPreBattle1Text::
+ text "Since our last"
+ line "battle, my"
+ para "#MON have"
+ line "grown!"
+ para "ROCK-hard will"
+ line "meets peak skill"
+ cont "today!"
+ para "Ready for the"
+ line "rematch of a"
+ cont "lifetime?"
+ done
+_PewterGymPreRematchBattle2Text::
+ text "Stones sharpen!"
+ line "Let's battle!"
+ done
+_PewterGymRematchRefusedText::
+ text "Maybe some other"
+ line "time."
+ done
+_PewterGymRematchDefeatedText::
+ text "I knew"
+ line "you were strong,"
+ cont "but this..."
+ prompt
+_PewterGymRematchVictoryText::
+ text "The best"
+ line "offense is a"
+ cont "good defense!"
+ para "That's my way of"
+ line "doing things!"
+ prompt
+_PewterGymRematchPostBattleText::
+ text "Incredible!"
+ para "Your strength"
+ line "is unmatched!"
+ para "True to your"
+ line "title, CHAMPION."
+ para "Continue to lead"
+ line "#MON with"
+ cont "honor and"
+ cont "courage!"
+ para "New challenges"
+ line "await."
+ done
And I think that's about it! Improve this tutorial if needed.