kep-hack/scripts/VermilionCity.asm
2024-01-18 18:25:16 -06:00

509 lines
11 KiB
NASM

VermilionCity_Script:
call EnableAutoTextBoxDrawing
ld hl, wCurrentMapScriptFlags
bit 6, [hl]
res 6, [hl]
push hl
call nz, .initCityScript
pop hl
bit 5, [hl]
res 5, [hl]
call nz, .setFirstLockTrashCanIndex
ld hl, VermilionCity_ScriptPointers
ld a, [wVermilionCityCurScript]
jp CallFunctionInTable
.setFirstLockTrashCanIndex
call Random
ldh a, [hRandomSub]
and $e
ld [wFirstLockTrashCanIndex], a
ret
.initCityScript
CheckEventHL EVENT_SS_ANNE_LEFT
ret z
CheckEventReuseHL EVENT_WALKED_PAST_GUARD_AFTER_SS_ANNE_LEFT
SetEventReuseHL EVENT_WALKED_PAST_GUARD_AFTER_SS_ANNE_LEFT
ret nz
ld a, $2
ld [wVermilionCityCurScript], a
ret
VermilionCity_ScriptPointers:
dw VermilionCityScript0
dw VermilionCityScript1
dw VermilionCityScript2
dw VermilionCityScript3
dw VermilionCityScript4
VermilionCityScript0:
ld a, [wSpritePlayerStateData1FacingDirection]
and a ; cp SPRITE_FACING_DOWN
ret nz
ld hl, SSAnneTicketCheckCoords
call ArePlayerCoordsInArray
ret nc
xor a
ldh [hJoyHeld], a
ld [wcf0d], a
ld a, $3
ldh [hSpriteIndexOrTextID], a
call DisplayTextID
CheckEvent EVENT_SS_ANNE_LEFT
jr nz, .shipHasDeparted
ld b, S_S_TICKET
predef GetQuantityOfItemInBag
ld a, b
and a
ret nz
.shipHasDeparted
ld a, D_UP
ld [wSimulatedJoypadStatesEnd], a
ld a, $1
ld [wSimulatedJoypadStatesIndex], a
call StartSimulatingJoypadStates
ld a, $1
ld [wVermilionCityCurScript], a
ret
SSAnneTicketCheckCoords:
dbmapcoord 18, 30
db -1 ; end
VermilionCityScript4:
ld hl, SSAnneTicketCheckCoords
call ArePlayerCoordsInArray
ret c
ld a, $0
ld [wVermilionCityCurScript], a
ret
VermilionCityScript2:
ld a, $ff
ld [wJoyIgnore], a
ld a, D_UP
ld [wSimulatedJoypadStatesEnd], a
ld [wSimulatedJoypadStatesEnd + 1], a
ld a, 2
ld [wSimulatedJoypadStatesIndex], a
call StartSimulatingJoypadStates
ld a, $3
ld [wVermilionCityCurScript], a
ret
VermilionCityScript3:
ld a, [wSimulatedJoypadStatesIndex]
and a
ret nz
xor a
ld [wJoyIgnore], a
ldh [hJoyHeld], a
ld a, $0
ld [wVermilionCityCurScript], a
ret
VermilionCityScript1:
ld a, [wSimulatedJoypadStatesIndex]
and a
ret nz
ld c, 10
call DelayFrames
ld a, $0
ld [wVermilionCityCurScript], a
ret
TheAutoskipStopinator:
ld a, [wSimulatedJoypadStatesEnd] ; ensuring that the text doesn't autoskip.
and a ; yep, here too.
call z, WaitForTextScrollButtonPress ; and here.
call EnableAutoTextBoxDrawing ; and here.
ret
VermilionCity_TextPointers:
dw VermilionCityText1
dw VermilionCityText2
dw VermilionCityText3
dw VermilionCityText4
dw VermilionCityText5
dw VermilionCityText6
dw OfficerJennySquirtle
dw VermilionBeauty
dw VermilionCityText7
dw VermilionCityText8
dw MartSignText
dw PokeCenterSignText
dw VermilionCityText11
dw VermilionCityText12
dw VermilionCityText13
VermilionCityText1:
text_far _VermilionCityText1
text_end
VermilionCityText2:
text_asm
CheckEvent EVENT_SS_ANNE_LEFT
jr nz, .shipHasDeparted
ld hl, VermilionCityTextDidYouSee
call PrintText
jr .end
.shipHasDeparted
ld hl, VermilionCityTextSSAnneDeparted
call PrintText
.end
jp TextScriptEnd
VermilionCityTextDidYouSee:
text_far _VermilionCityTextDidYouSee
text_end
VermilionCityTextSSAnneDeparted:
text_far _VermilionCityTextSSAnneDeparted
text_end
VermilionCityText3:
text_asm
CheckEvent EVENT_SS_ANNE_LEFT
jr nz, .shipHasDeparted
ld a, [wSpritePlayerStateData1FacingDirection]
cp SPRITE_FACING_RIGHT
jr z, .greetPlayer
ld hl, .inFrontOfOrBehindGuardCoords
call ArePlayerCoordsInArray
jr nc, .greetPlayerAndCheckTicket
.greetPlayer
ld hl, SSAnneWelcomeText4
call PrintText
jr .end
.greetPlayerAndCheckTicket
ld hl, SSAnneWelcomeText9
call PrintText
call TheAutoskipStopinator ; this actually fixes a bug from vanilla...
ld b, S_S_TICKET
predef GetQuantityOfItemInBag
ld a, b
and a
jr nz, .playerHasTicket
ld hl, SSAnneNoTicketText
call PrintText
jr .end
.playerHasTicket
ld hl, SSAnneFlashedTicketText
call PrintText
ld a, $4
ld [wVermilionCityCurScript], a
jr .end
.shipHasDeparted
ld hl, SSAnneNotHereText
call PrintText
.end
jp TextScriptEnd
.inFrontOfOrBehindGuardCoords
dbmapcoord 19, 29 ; in front of guard
dbmapcoord 19, 31 ; behind guard
db -1 ; end
SSAnneWelcomeText4:
text_far _SSAnneWelcomeText4
text_end
SSAnneWelcomeText9:
text_far _SSAnneWelcomeText9
text_end
SSAnneFlashedTicketText:
text_far _SSAnneFlashedTicketText
text_end
SSAnneNoTicketText:
text_far _SSAnneNoTicketText
text_end
SSAnneNotHereText:
text_far _SSAnneNotHereText
text_end
VermilionCityText4:
text_far _VermilionCityText4
text_end
VermilionCityText5:
text_far _VermilionCityText5
text_asm
ld a, MACHOP
call PlayCry
call WaitForSoundToFinish
ld hl, VermilionCityText14
ret
VermilionCityText14:
text_far _VermilionCityText14
text_end
VermilionCityText6:
text_far _VermilionCityText6
text_end
VermilionCityText7:
text_far _VermilionCityText7
text_end
VermilionCityText8:
text_far _VermilionCityText8
text_end
VermilionCityText11:
text_far _VermilionCityText11
text_end
VermilionCityText12:
text_far _VermilionCityText12
text_end
VermilionCityText13:
text_far _VermilionCityText13
text_end
OfficerJennySquirtle:
text_asm
CheckEvent EVENT_GOT_SQUIRTLE
jr nz, .howDoing
CheckEvent EVENT_BEAT_LT_SURGE
jr z, .noBadge
ld hl, OfficerJennyHasBadge
call PrintText
call YesNoChoice
ld a, [wCurrentMenuItem]
and a
jr nz, .refuse
call SaveScreenTilesToBuffer1 ; prevents nickname screen corruption
ld a, SQUIRTLE
ld [wd11e], a
ld [wcf91], a
call GetMonName
ld a, $1
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
lb bc, SQUIRTLE, 16
call GivePokemon
jp nc, .fullParty
ld a, [wAddedToParty]
and a
call z, WaitForTextScrollButtonPress
ld a, $1
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
ld hl, OfficerJennyGive
call PrintText
SetEvent EVENT_GOT_SQUIRTLE
jp TextScriptEnd
.howDoing
ld hl, OfficerJennyHowDoing
jr .done
.noBadge
ld hl, OfficerJennyNoBadge
jr .done
.fullParty
ld hl, JennyFullParty
call PrintText
ld a, [wSimulatedJoypadStatesEnd] ; ensuring that the text doesn't autoskip.
and a ; yep, here too.
call z, WaitForTextScrollButtonPress ; and here.
call EnableAutoTextBoxDrawing ; and here.
; falls through to the next quote.
.refuse
ld hl, OfficerJennyRefuse
; fallthrough
.done
call PrintText
jp TextScriptEnd
OfficerJennyNoBadge:
text_far _OfficerJennyText1
text_end
OfficerJennyHasBadge:
text_far _OfficerJennyText2
text_end
OfficerJennyGive:
text_far _OfficerJennyText3
text_waitbutton
text_end
OfficerJennyRefuse:
text_far _OfficerJennyText4
text_end
OfficerJennyHowDoing:
text_far _OfficerJennyText5
text_end
JennyFullParty:
text_far _JennyFullParty
text_end
EventVermillionCitySSTicket:
text_far _SSAnneFlashedTicketText
text_end
; LGPE Beauty who gives you a Persian or Arcanine depending on the game.
; Here, we make it a Cats vs Dogs question and change based on that.
; The way it works is it makes the player catch the opposite Pokemon, and then get the one they picked.
; Meowth = Arcanine
; Growlithe = Persian
; This code is nightmare fuel but it does the job.
; Basically, at some point, wBeautyChoice stops working for reasons scientists are still trying to figure out.
VermilionBeauty:
text_asm
CheckEvent EVENT_VERMILION_BEAUTY_DONE ; First, check if the event is actually done.
jp nz, .beautyDone ; Yes? Alright, no need for this.
ld a, [wBeautyChoice] ; Next, we check if wBeautyChoice has been set. This saves an event constant.
cp 0 ; It will never be 0 if the player has made their choice.
jr z, .eventStart ; If it is, then the event needs to start.
; We need to do 2 skips here which triggers me but it works.
; You could put the finish check before the choice check, but then it gets a little weird.
; All it really achieves is weird architecture for like 3-4 less machine cycles.
ld a, [wBeautyCounter] ; Alright, if you got here, then the event is in progress.
cp 5 ; Do you have 5 of the scrunklies?
; jr z, .eventIsFinished ; Big if true.
; jr nz, .eventInProgress ; Small if false.
jr nc, .eventIsFinished ; A set z flag happens for exactly 5. A cleared carry flag happens for values 5 to 255.
jr c, .eventInProgress ; And a set carry flag happens for values 0 to 4.
; Let us start the game.
.eventStart
ld hl, BeautyText1 ; Let's open the text.
call PrintText
call CatsDogsChoice
;account for cancelling with the B button
ld hl, _BeautyWait
ldh a, [hJoyHeld]
and B_BUTTON
jr nz, .skip5
ld a, [wCurrentMenuItem] ; Let's load what they picked. 0 is cats, 1 is dogs.
and a
jr nz, .getArcanine ; Skip storing Growlithe if dogs.
ld a, GROWLITHE ; If they picked cats, then store Growlithe.
jr .skip ; I know this looks bad, but if it isn't here, it'd store Growlithe and then go to Meowth anyway.
.getArcanine ; If they get here, they picked dogs, so we store Meowth.
ld a, MEOWTH
.skip ; Now we land here.
ld [wBeautyChoice], a ; Finally store the choice in wBeautyChoice.
ld hl, BeautyText2 ; Now spit it out.
call PrintText
; This is a jump point for if the event was already started.
.eventInProgress
ld a, [wBeautyChoice]
ld [wd11e], a
call GetMonName
ld hl, BeautyChoice
call PrintText
jr .done ; no give pokemon. bad.
; Now if the event is finished, she needs to hand the Pokemon over.
.eventIsFinished
; call SaveScreenTilesToBuffer1 ; saves us from some corruption disasters if nicknaming.
; ...not needed anymore as this was fixed in commit dd71684
ld hl, BeautyFinish1
ld a, [wBeautyChoice]
cp GROWLITHE
jr z, .skip2
ld hl, BeautyFinish2
.skip2
call PrintText
call TheAutoskipStopinator
lb bc, PERSIAN, 16 ; because we're elitists, let's see if they chose cats first.
ld a, [wBeautyChoice] ; *sigh*, but if they're dog lovers, let's make sure they actually want Persian.
cp GROWLITHE ; Do they? If yes, skip.
jr z, .skip3 ; electric boogaloo
lb bc, ARCANINE, 16 ; ok but skip2 means arc never gets loaded in. very good sequel. disney would NEVER.
.skip3
call GivePokemon
jr nc, .done
; call LoadScreenTilesFromBuffer1 ; saves us from some corruption disasters if nicknaming.
SetEvent EVENT_VERMILION_BEAUTY_DONE ; and now we can finally rest.
; ld hl, wd72e ;not needed since EVENT_VERMILION_BEAUTY_DONE is the event bit for this.
; set 0, [hl]
jr .done
; Now if it's already been said and done, we go here.
; Due to man-made horrors beyond my comprehension, we need to split the text here.
.beautyDone
ld hl, BeautyExplain1
ld a, [wBeautyChoice]
cp GROWLITHE
jr z, .skip4
ld hl, BeautyExplain2
.skip4
call PrintText
ld hl, BeautyExplainCont
.skip5
call PrintText
;fallthrough
.done
jp TextScriptEnd
; displays cats/dogs choice
CatsDogsChoice:
call SaveScreenTilesToBuffer1
call InitCatsDogsTextBoxParameters
jr DisplayCatsDogsChoice
InitCatsDogsTextBoxParameters:
ld a, $2 ; loads the value for the unused SOUTH/EAST choice, which was changed to say CATS/DOGS
ld [wTwoOptionMenuID], a
hlcoord 12, 8
lb bc, 10, 13
ret
DisplayCatsDogsChoice:
ld a, $14
ld [wTextBoxID], a
call DisplayTextBoxID
jp LoadScreenTilesFromBuffer1
BeautyText1:
text_far _BeautyText1
text_end
BeautyText2:
text_far _BeautyText2
text_end
BeautyChoice:
text_far _BeautyChoice
text_end
BeautyFinish1:
text_far _BeautyFinish1
text_end
BeautyFinish2:
text_far _BeautyFinish2
text_end
BeautyExplain1:
text_far _BeautyExplain1
text_end
BeautyExplain2:
text_far _BeautyExplain2
text_end
BeautyExplainCont:
text_far _BeautyExplainCont
text_end
_BeautyWait:
text "I can wait on"
line "your answer."
done
db "@"