Fighting Dojo script revamp

This restructures the Fighting Dojo to match the new map, as well as add a few more features and safety mechanisms.
- Koichi, the Karate Master, now plays the Gym Leader theme when fought.
- Hitmontop is now an optional reward.
- Post-Game Rematch is available in addition to the gym scaling to be consistent with other Gym Leaders.
- A safety lock is on the Poke Balls prior to defeating the Karate Master, as the new structure now demands it. Indeed, this is why the reward area in vanilla is like that.
- Architecturally, there is now only one EVENT_GOT_HITMON constant, which is all that was actually needed in the vanilla game. Extreme microoptimisation, as event constants appear to be 16-bit.
This commit is contained in:
Llinos Evans 2023-06-27 21:09:38 +01:00
parent 18dd9715d0
commit 262c862a76
8 changed files with 161 additions and 22 deletions

View file

@ -100,6 +100,7 @@ Improved Areas
- Rock Tunnel has a more workable map, now being easier to go through and having new areas to explore. Includes a way to get renewable fossils, items, and other interesting bits and pieces. Overall, it makes Flash much more rewarding to bring, showing you where the items and content are instead of being an inconvenience.
- Diglett's Cave has a more detailed map with Onix, Wiglett, and Wugtrio also appearing! It also has its beta music!
- Route 25 has been given a facelift, adding Bill's Lighthouse in place of the Sea Cottage.
- The Fighting Dojo has been revamped, featuring a design reminiscent of the prototype versions; rough floors, the elder in the back, and more. Additionally, you can now get a Hitmontop as a third option. The Karate Master is also now treated somewhat more like a Gym Leader, having Gym Scaling and a Rematch system.
- Cinnabar Island is a lot bigger, with the volcano being added to it. The mansion seems different too...
- Cinnabar Lab's Trade Room now features the Trader, who will evolve trade-evolving Pokemon for you!
- Pokemon Tower was shortened, being less intensive and adding room for more maps.

View file

@ -257,9 +257,8 @@
const EVENT_BEAT_FIGHTING_DOJO_TRAINER_1
const EVENT_BEAT_FIGHTING_DOJO_TRAINER_2
const EVENT_BEAT_FIGHTING_DOJO_TRAINER_3
const EVENT_GOT_HITMONLEE
const EVENT_GOT_HITMONCHAN
const_skip 8
const EVENT_GOT_HITMON
const_skip 9
const EVENT_GOT_TM46
const EVENT_BEAT_SABRINA
const EVENT_BEAT_SAFFRON_GYM_TRAINER_0

View file

@ -88,6 +88,7 @@ DEF SHOW EQU $15
const HS_POKEMON_MANSION_1F_ITEM_2 ; 4E X
const HS_FIGHTING_DOJO_GIFT_1 ; 4F
const HS_FIGHTING_DOJO_GIFT_2 ; 50
const HS_FIGHTING_DOJO_GIFT_3
const HS_SILPH_CO_1F_RECEPTIONIST ; 51
const HS_VOLTORB_1 ; 52 X
const HS_VOLTORB_2 ; 53 X

View file

@ -384,6 +384,7 @@ PokemonMansion1FHS:
FightingDojoHS:
db FIGHTING_DOJO, $06, SHOW ; HS_FIGHTING_DOJO_GIFT_1
db FIGHTING_DOJO, $07, SHOW ; HS_FIGHTING_DOJO_GIFT_2
db FIGHTING_DOJO, $08, SHOW ; HS_FIGHTING_DOJO_GIFT_3
SilphCo1FHS:
db SILPH_CO_1F, $01, HIDE ; HS_SILPH_CO_1F_RECEPTIONIST
PowerPlantHS:

View file

@ -1,5 +1,5 @@
FightingDojo_Object:
db $3 ; border block
db $0 ; border block
def_warp_events
warp_event 4, 11, LAST_MAP, 2
@ -8,12 +8,13 @@ FightingDojo_Object:
def_bg_events
def_object_events
object_event 6, 3, SPRITE_HIKER, STAY, DOWN, 1, OPP_BLACKBELT, 1 ; koichi
object_event 3, 4, SPRITE_HIKER, STAY, RIGHT, 2, OPP_BLACKBELT, 9
object_event 3, 6, SPRITE_HIKER, STAY, RIGHT, 3, OPP_BLACKBELT, 10
object_event 6, 5, SPRITE_HIKER, STAY, LEFT, 4, OPP_BLACKBELT, 11
object_event 6, 8, SPRITE_HIKER, STAY, LEFT, 5, OPP_BLACKBELT, 12
object_event 5, 1, SPRITE_POKE_BALL, STAY, NONE, 6 ; person
object_event 7, 1, SPRITE_POKE_BALL, STAY, NONE, 7 ; person
object_event 4, 1, SPRITE_HIKER, STAY, DOWN, 1, OPP_BLACKBELT, 1 ; koichi
object_event 3, 3, SPRITE_HIKER, STAY, RIGHT, 2, OPP_BLACKBELT, 11
object_event 3, 5, SPRITE_HIKER, STAY, RIGHT, 3, OPP_BLACKBELT, 12
object_event 6, 4, SPRITE_HIKER, STAY, LEFT, 4, OPP_BLACKBELT, 13
object_event 6, 6, SPRITE_HIKER, STAY, LEFT, 5, OPP_BLACKBELT, 14
object_event 5, 1, SPRITE_POKE_BALL, STAY, NONE, 6 ; Hitmonlee
object_event 7, 1, SPRITE_POKE_BALL, STAY, NONE, 7 ; Hitmonchan
object_event 6, 1, SPRITE_POKE_BALL, STAY, NONE, 8 ; Hitmontop
def_warps_to FIGHTING_DOJO

View file

@ -68,7 +68,7 @@ Plateau_Coll::
coll_tiles $1b, $23, $2c, $2d, $3b, $45
PreGym_Coll::
coll_tiles $0B, $0E, $1E, $1F
coll_tiles $0B, $0E, $1E, $1F, $11
Citrine_Coll::
coll_tiles $2C, $31, $3F, $55, $0E, $2F, $23, $20, $10, $03, $1C, $1B, $0B, $0C, $21, $39, $3C, $48, $49, $58, $59

View file

@ -21,6 +21,8 @@ FightingDojo_ScriptPointers:
dw FightingDojoScript3
FightingDojoScript1:
CheckEvent EVENT_POST_GAME_ATTAINED ; Required in the case you have cleared the game, but not cleared the dojo. It's an optional deal.
ret nz
CheckEvent EVENT_DEFEATED_FIGHTING_DOJO
ret nz
call CheckFightingMapTrainers
@ -33,18 +35,18 @@ FightingDojoScript1:
ldh [hJoyHeld], a
ld [wcf0d], a
ld a, [wYCoord]
cp 3
cp 2
ret nz
ld a, [wXCoord]
cp 4
ret nz
ld a, $1
ld [wcf0d], a
ld a, PLAYER_DIR_RIGHT
ld a, PLAYER_DIR_UP
ld [wPlayerMovingDirection], a
ld a, $1
ldh [hSpriteIndex], a
ld a, SPRITE_FACING_LEFT
ld a, SPRITE_FACING_DOWN
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ld a, $1
@ -59,11 +61,11 @@ FightingDojoScript3:
ld a, [wcf0d]
and a
jr z, .asm_5cde4
ld a, PLAYER_DIR_RIGHT
ld a, PLAYER_DIR_UP
ld [wPlayerMovingDirection], a
ld a, $1
ldh [hSpriteIndex], a
ld a, SPRITE_FACING_LEFT
ld a, SPRITE_FACING_DOWN
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
@ -71,7 +73,7 @@ FightingDojoScript3:
ld a, $f0
ld [wJoyIgnore], a
SetEventRange EVENT_BEAT_KARATE_MASTER, EVENT_BEAT_FIGHTING_DOJO_TRAINER_3
ld a, $8
ld a, $9
ldh [hSpriteIndexOrTextID], a
call DisplayTextID
xor a
@ -88,6 +90,7 @@ FightingDojo_TextPointers:
dw FightingDojoText5
dw FightingDojoText6
dw FightingDojoText7
dw FightingDojoTextHitmontop
dw FightingDojoText8
FightingDojoTrainerHeaders:
@ -104,10 +107,36 @@ FightingDojoTrainerHeader3:
FightingDojoText1: ; gym scaling can be removed to make space
text_asm
CheckEvent EVENT_POST_GAME_ATTAINED ; No need to view previous stuff, technically you can skip Bide this way but I think that's hilarious
jp z, .normalProcessing
CheckEvent EVENT_DEFEATED_FIGHTING_DOJO
jp nz, .continue1
CheckEventReuseA EVENT_BEAT_KARATE_MASTER
jp nz, .continue2
.rematchMode ; Rematch functionality. Just loads pre-battle text and his trainer.
ld hl, KoichiRematchPreBattleText
call PrintText
ld c, BANK(Music_MeetMaleTrainer)
ld a, MUSIC_MEET_MALE_TRAINER
call PlayMusic
set 6, [hl]
set 7, [hl]
ldh a, [hSpriteIndex]
ld [wSpriteIndex], a
ld hl, KoichiRematchDefeatedText
ld de, KoichiRematchDefeatedText
call SaveEndBattleTextPointers
call EngageMapTrainer
ld a, OPP_BLACKBELT
ld [wCurOpponent], a
ld a, 10 ; Silph Gauntlet lineup.
ld [wTrainerNo], a
ld a, 1
ld [wIsTrainerBattle], a
ld a, $1
ld [wGymLeaderNo], a
jr .asm_9dba4
.normalProcessing
ld hl, FightingDojoText_5ce8e
call PrintText
ld hl, wd72d
@ -134,12 +163,15 @@ FightingDojoText1: ; gym scaling can be removed to make space
ld [wTrainerNo], a
ld a, 1
ld [wIsTrainerBattle], a
ld a, $1
ld [wGymLeaderNo], a ; play gym music
;ends here
ld a, $3
ld [wFightingDojoCurScript], a
ld [wCurMapScript], a
SetEvent EVENT_DEFEATED_FIGHTING_DOJO
jr .asm_9dba4
.continue1
ld hl, FightingDojoText_5ce9d
@ -239,10 +271,18 @@ FightingDojoAfterBattleText4:
text_far _FightingDojoAfterBattleText4
text_end
; So get this, the game had an EVENT_GOT_HITMONCHAN and EVENT_GOT_HITMONLEE here.
; However, in the way it was being used...
; You can just make it EVENT_GOT_HITMON and be outright better off.
; So when implementing the new stuff, I made this optimisation.
; Oh, and because of the new Dojo structure, I had to rework the EVENT_DEFEATED_FIGHTING_DOJO system, to ensure people don't grab their prizes early.
FightingDojoText6:
; Hitmonlee Poké Ball
text_asm
CheckEitherEventSet EVENT_GOT_HITMONLEE, EVENT_GOT_HITMONCHAN
CheckEvent EVENT_DEFEATED_FIGHTING_DOJO
jr z, .Oi
CheckEvent EVENT_GOT_HITMON
jr z, .GetMon
ld hl, OtherHitmonText
call PrintText
@ -266,7 +306,12 @@ FightingDojoText6:
ld a, HS_FIGHTING_DOJO_GIFT_1
ld [wMissableObjectIndex], a
predef HideObject
SetEvents EVENT_GOT_HITMONLEE, EVENT_DEFEATED_FIGHTING_DOJO
SetEvents EVENT_GOT_HITMON
jr .done
.Oi
ld hl, OiMateText
call PrintText
;fallthrough
.done
jp TextScriptEnd
@ -277,7 +322,9 @@ WantHitmonleeText:
FightingDojoText7:
; Hitmonchan Poké Ball
text_asm
CheckEitherEventSet EVENT_GOT_HITMONLEE, EVENT_GOT_HITMONCHAN
CheckEvent EVENT_DEFEATED_FIGHTING_DOJO
jr z, .Oi
CheckEvent EVENT_GOT_HITMON
jr z, .GetMon
ld hl, OtherHitmonText
call PrintText
@ -296,12 +343,55 @@ FightingDojoText7:
ld c, 30
call GivePokemon
jr nc, .done
SetEvents EVENT_GOT_HITMONCHAN, EVENT_DEFEATED_FIGHTING_DOJO
SetEvent EVENT_GOT_HITMON
; once Poké Ball is taken, hide sprite
ld a, HS_FIGHTING_DOJO_GIFT_2
ld [wMissableObjectIndex], a
predef HideObject
jr .done
.Oi
ld hl, OiMateText
call PrintText
;fallthrough
.done
jp TextScriptEnd
FightingDojoTextHitmontop:
; Hitmontop Poké Ball
text_asm
CheckEvent EVENT_DEFEATED_FIGHTING_DOJO
jr z, .Oi
CheckEvent EVENT_GOT_HITMON
jr z, .GetMon
ld hl, OtherHitmonText
call PrintText
jr .done
.GetMon
ld a, HITMONTOP
call DisplayPokedex
ld hl, WantHitmontopText
call PrintText
call YesNoChoice
ld a, [wCurrentMenuItem]
and a
jr nz, .done
ld a, [wcf91]
ld b, a
ld c, 30
call GivePokemon
jr nc, .done
SetEvent EVENT_GOT_HITMON
; once Poké Ball is taken, hide sprite
ld a, HS_FIGHTING_DOJO_GIFT_3
ld [wMissableObjectIndex], a
predef HideObject
jr .done
.Oi
ld hl, OiMateText
call PrintText
;fallthrough
.done
jp TextScriptEnd
@ -309,6 +399,22 @@ WantHitmonchanText:
text_far _WantHitmonchanText
text_end
WantHitmontopText:
text_far _WantHitmontopText
text_end
OtherHitmonText:
text_far _GreedyBastardText
text_end
OiMateText:
text_far _OiMateText
text_end
KoichiRematchPreBattleText:
text_far _KoichiRematchPreBattleText
text_end
KoichiRematchDefeatedText:
text_far _KoichiRematchDefeatedText
text_end

View file

@ -123,3 +123,33 @@ _WantHitmonchanText::
line "piston punching"
cont "HITMONCHAN?"
done
_WantHitmontopText::
text "You want the"
line "capoeira fighter"
cont "HITMONTOP?"
done
_OiMateText::
text "What do you think"
line "you're doing?"
para "Fight like a true"
line "warrior!"
done
_KoichiRematchPreBattleText::
text "Ho, <PLAYER>!"
para "Did you return"
line "to spar with us"
cont "again?"
para "Aha! Then I"
line "won't hold back!"
done
_KoichiRematchDefeatedText::
text "I have"
line "been defeated"
cont "once more..."