diff --git a/data/maps/objects/VermilionCity.asm b/data/maps/objects/VermilionCity.asm index af5bf58f..455f13fb 100644 --- a/data/maps/objects/VermilionCity.asm +++ b/data/maps/objects/VermilionCity.asm @@ -10,17 +10,17 @@ VermilionCity_Object: warp_event 18, 31, VERMILION_DOCK, 1 warp_event 19, 31, VERMILION_DOCK, 1 warp_event 15, 13, VERMILION_TRADE_HOUSE, 1 - warp_event 10, 31, CITRINE_CITY, 7 - warp_event 11, 31, CITRINE_CITY, 8 + warp_event 10, 31, FARAWAY_ISLAND_OUTSIDE, 1 + warp_event 26, 31, CITRINE_CITY, 7 def_bg_events - bg_event 27, 3, 9 ; VermilionCityText7 - bg_event 37, 13, 10 ; VermilionCityText8 - bg_event 24, 13, 11 ; MartSignText - bg_event 12, 3, 12 ; PokeCenterSignText - bg_event 7, 13, 13 ; VermilionCityText11 - bg_event 7, 19, 14 ; VermilionCityText12 - bg_event 29, 15, 15 ; VermilionCityText13 + bg_event 27, 3, 11 ; VermilionCityText7 + bg_event 37, 13, 12 ; VermilionCityText8 + bg_event 24, 13, 13 ; MartSignText + bg_event 12, 3, 14 ; PokeCenterSignText + bg_event 7, 13, 15 ; VermilionCityText11 + bg_event 7, 19, 16 ; VermilionCityText12 + bg_event 29, 15, 17 ; VermilionCityText13 def_object_events object_event 23, 5, SPRITE_BEAUTY, WALK, LEFT_RIGHT, 1 ; person @@ -31,5 +31,7 @@ VermilionCity_Object: object_event 25, 27, SPRITE_SAILOR, WALK, LEFT_RIGHT, 6 ; person object_event 19, 8, SPRITE_OFFICER_JENNY, STAY, ANY_DIR, 7 ; squirtle event object_event 12, 13, SPRITE_BEAUTY, STAY, DOWN, 8 ; arc/pers event + object_event 11, 30, SPRITE_SAILOR, STAY, UP, 9 ; person - Faraway Island + object_event 27, 30, SPRITE_SAILOR, STAY, UP, 10 ; person - Citrine City def_warps_to VERMILION_CITY diff --git a/maps/VermilionCity.blk b/maps/VermilionCity.blk index cdba83ed..07a49252 100644 --- a/maps/VermilionCity.blk +++ b/maps/VermilionCity.blk @@ -1 +1 @@ -CCC ! ! !1 !11111111Ckk7~|r7~17~wVwww111Cd1111111111111111C-111111111IH111CCC-111111DE111CCC !C !11 !111111Cd|~1|~11|swwwwVwCd1111111111111111Cd1 1111 !TCdV21|~edTeCCCCd11111ed111e-T.CCCCd11111e-.CTCdC-.CCCCCCTCdCCCCTTTTTTTTTTTC-gCCCCTxxxTxxxxxxCCCkkkTkTkkkkkkkCCCCCCCCCCCCCCCCCCCCCCCCTCCCTCCCCCCCCCC \ No newline at end of file +CCC ! ! !1 !11111111Ckk7~|r7~17~wVwww111Cd1111111111111111C-111111111IH111CCC-111111DE111CCC !C !11 !111111Cd|~1|~11|swwwwVwCd1111111111111111Cd1 1111 !TCdV21|~edTeCCCCd11111ed111e-T.CCCCd11111e-.CTCdC-.CCCCCCTCdCCCCTTTTTTTTTTTC-gCCCCTxxxTxxxTxxCCCkkkTkTkTkkkCCCCCCCCCCCCTCCCCCCCCCCCTCCCTCCCTCCCCCC \ No newline at end of file diff --git a/scripts/RedsHouse1F.asm b/scripts/RedsHouse1F.asm index 2e8257d5..120d5ade 100644 --- a/scripts/RedsHouse1F.asm +++ b/scripts/RedsHouse1F.asm @@ -48,7 +48,7 @@ ChiefLetter2: ld a, $1 ; Load Mom's NPC ID ldh [hSpriteIndex], a ; Slap it in the index ld a, SPRITE_FACING_RIGHT ; Get this ready - ldh [hSpriteFacingDirection], a ; Now she'll face right, simulatiung talking to her. + ldh [hSpriteFacingDirection], a ; Now she'll face right, simulating talking to her. call SetSpriteFacingDirectionAndDelay ; Get this all out. call DisplayTextID ; Display her text ID, using the same thing from before. ; We did a little tomfoolery with her base text to make this work. Look below if you dare. diff --git a/scripts/VermilionCity.asm b/scripts/VermilionCity.asm index 58d6212e..4939c967 100644 --- a/scripts/VermilionCity.asm +++ b/scripts/VermilionCity.asm @@ -56,6 +56,13 @@ VermilionCityScript0: CheckEvent EVENT_SS_ANNE_LEFT jr nz, .shipHasDeparted .default + ld hl, OldSeaMapCheckCoords + call ArePlayerCoordsInArray + jp c, MovePlayerVermilion + ld hl, CitrineCityCheckCoords + call ArePlayerCoordsInArray + jp c, MovePlayerVermilion + ld b, S_S_TICKET predef GetQuantityOfItemInBag ld a, b @@ -71,10 +78,22 @@ VermilionCityScript0: ld [wVermilionCityCurScript], a ret -SSAnneTicketCheckCoords: - dbmapcoord 18, 30 +SSAnneTicketCheckCoords: ; Mother coords - use to universally trigger the same event + dbmapcoord 18, 30 ; S. S. Anne + dbmapcoord 10, 30 ; Faraway Island + dbmapcoord 26, 30 ; Citrine City db -1 ; end +; I know it looks awful but I use the individual ones to launch off the new ticket script. +; We don't need an S.S. Anne one, as I'm using a process of elimination check system. +OldSeaMapCheckCoords: + dbmapcoord 10, 30 + db -1 + +CitrineCityCheckCoords: + dbmapcoord 26, 30 + db -1 + VermilionCityScript4: ld hl, SSAnneTicketCheckCoords call ArePlayerCoordsInArray @@ -117,145 +136,186 @@ VermilionCityScript1: ld [wVermilionCityCurScript], a ret -; New Pass script begins here -VermillionCityScript_GetPassesInBag: +; We call these four commands to stop text from autoskipping 4 times, may as well just make this. +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 + +; So get this: If you check multiple tickets, there's a really janky crash. +; I can't be fucked fixing it, so let's force the player through the warp instead. +; Yes, I'm serious. +MovePlayerVermilion: + ld a, PLAYER_DIR_DOWN + ld [wPlayerMovingDirection], a + call UpdateSprites + ld a, $ff ; Firstly... + ld [wJoyIgnore], a ; No joypad inputs. No funny business. RLE is weird as fuck without it. + ld hl, wSimulatedJoypadStatesEnd + ld de, WalkIntoWarp_RLEMovement + call DecodeRLEList + dec a + ld [wSimulatedJoypadStatesIndex], a + call StartSimulatingJoypadStates ; By this point, we're auto-moving. + ld a, $0 + ld [wVermilionCityCurScript], a ; safety + ret + +WalkIntoWarp_RLEMovement: + db D_DOWN, 2 + db -1 ; end + +; ================================================================ +; THIS IS NO LONGER USED, KEPT IN CASE A BETTER WARP SYSTEM COMES UP. +; Alright, so I'll explain the issue. +; For some reason, all the warp methods that exist do not seem to like this system. +; Faraway Island would load but have botched collision and break when you leave. +; Citrine City would outright crash. +; Bank movements and stuff were tried but nothing seemed to work as desired. +; Instead, we use a triple-harbour method, which makes the city look more lively anyway. + +;VermillionCityScript_GetPassesInBag: ; Gets a list of Passes in the player's bag. ; Ripped and modified from the fossil guy - xor a - ld [wFilteredBagItemsCount], a - ld de, wFilteredBagItems - ld hl, PassList -.loop - ld a, [hli] - and a - jr z, .done - push hl - push de - ld [wd11e], a - ld b, a - predef GetQuantityOfItemInBag - pop de - pop hl - ld a, b - and a - jr z, .loop +; xor a +; ld [wFilteredBagItemsCount], a +; ld de, wFilteredBagItems +; ld hl, PassList +;.loop +; ld a, [hli] +; and a +; jr z, .done +; push hl +; push de +; ld [wd11e], a +; ld b, a +; predef GetQuantityOfItemInBag +; pop de +; pop hl +; ld a, b +; and a +; jr z, .loop - ; A Pass is in the bag - ld a, [wd11e] - ld [de], a - inc de - push hl - ld hl, wFilteredBagItemsCount - inc [hl] - pop hl - jr .loop -.done - ld a, $ff - ld [de], a - ret +; ; A Pass is in the bag +; ld a, [wd11e] +; ld [de], a +; inc de +; push hl +; ld hl, wFilteredBagItemsCount +; inc [hl] +; pop hl +; jr .loop +;.done +; ld a, $ff +; ld [de], a +; ret -PassList: - db S_S_TICKET - db OLD_SEA_MAP - db CITRINE_PASS - ;db RAINBOW_PASS maybe someday - db 0 ; end +;PassList: +; db S_S_TICKET +; db OLD_SEA_MAP +; db CITRINE_PASS +; ;db RAINBOW_PASS I planned this for a while, but the space wasn't there, and the scope was strange. +; db 0 ; end -PrintPassesInBag: +;PrintPassesInBag: ; Prints each pass in the player's bag on a separate line in the menu. - ld hl, wFilteredBagItems - xor a - ldh [hItemCounter], a -.loop - ld a, [hli] - cp $ff - ret z - push hl - ld [wd11e], a - call GetItemName - hlcoord 2, 2 - ldh a, [hItemCounter] - ld bc, SCREEN_WIDTH * 2 - call AddNTimes - ld de, wcd6d - call PlaceString - ld hl, hItemCounter - inc [hl] - pop hl - jr .loop +; ld hl, wFilteredBagItems +; xor a +; ldh [hItemCounter], a +;.loop +; ld a, [hli] +; cp $ff +; ret z +; push hl +; ld [wd11e], a +; call GetItemName +; hlcoord 2, 2 +; ldh a, [hItemCounter] +; ld bc, SCREEN_WIDTH * 2 +; call AddNTimes +; ld de, wcd6d +; call PlaceString +; ld hl, hItemCounter +; inc [hl] +; pop hl +; jr .loop -PassListings: - ld hl, VermillionCityPassSelectionText - call PrintText - call VermillionCityScript_GetPassesInBag - ld hl, wd730 - set 6, [hl] - xor a - ld [wCurrentMenuItem], a - ld a, A_BUTTON | B_BUTTON - ld [wMenuWatchedKeys], a - ld a, [wFilteredBagItemsCount] - dec a - ld [wMaxMenuItem], a - ld a, 2 - ld [wTopMenuItemY], a - ld a, 1 - ld [wTopMenuItemX], a - ld a, [wFilteredBagItemsCount] - dec a - ld bc, 2 - ld hl, 3 - call AddNTimes - dec l - ld b, l - ld c, $d - hlcoord 0, 0 - call TextBoxBorder - call UpdateSprites - call PrintPassesInBag - ld hl, wd730 - res 6, [hl] - call HandleMenuInput - bit BIT_B_BUTTON, a - jr nz, .cancelledPass - ld hl, wFilteredBagItems - ld a, [wCurrentMenuItem] - ld d, 0 - ld e, a - add hl, de - ld a, [hl] - ldh [hItemToRemoveID], a - cp S_S_TICKET - jp z, VermilionCityText3.playerHasTicket ; Saves time and less risk of bugs - cp OLD_SEA_MAP - jr z, .choseFaraway - cp CITRINE_PASS - jr z, .choseCitrine +;PassListings: +; ld hl, VermillionCityPassSelectionText +; call PrintText +; call VermillionCityScript_GetPassesInBag +; ld hl, wd730 +; set 6, [hl] +; xor a +; ld [wCurrentMenuItem], a +; ld a, A_BUTTON | B_BUTTON +; ld [wMenuWatchedKeys], a +; ld a, [wFilteredBagItemsCount] +; dec a +; ld [wMaxMenuItem], a +; ld a, 2 +; ld [wTopMenuItemY], a +; ld a, 1 +; ld [wTopMenuItemX], a +; ld a, [wFilteredBagItemsCount] +; dec a +; ld bc, 2 +; ld hl, 3 +; call AddNTimes +; dec l +; ld b, l +; ld c, $d +; hlcoord 0, 0 +; call TextBoxBorder +; call UpdateSprites +; call PrintPassesInBag +; ld hl, wd730 +; res 6, [hl] +; call HandleMenuInput +; bit BIT_B_BUTTON, a +; jr nz, .cancelledPass +; ld hl, wFilteredBagItems +; ld a, [wCurrentMenuItem] +; ld d, 0 +; ld e, a +; add hl, de +; ld a, [hl] +; ldh [hItemToRemoveID], a +; cp S_S_TICKET +; jp z, VermilionCityText3.playerHasTicket ; Saves time and less risk of bugs +; cp OLD_SEA_MAP +; jr z, .choseFaraway +; cp CITRINE_PASS +; jr z, .choseCitrine ; god bless the safari game and pokemon tower 7f for being the few times a forcewarp exists ; For some reason, these aren't working properly... -.choseFaraway - ld hl, EventVermillionCityOldSeaMap - call PrintText - ld a, FARAWAY_ISLAND_OUTSIDE - ld [wDestinationMap], a - ld hl, wd732 - set 2, [hl] ; fly warp or dungeon warp - call SpecialWarpIn - jp SpecialEnterMap -.choseCitrine - ld hl, EventVermillionCityCitrinePass - call PrintText - ld a, CITRINE_CITY - ldh [hWarpDestinationMap], a - ld a, $6 - ld [wDestinationWarpID], a - call WarpFound2 - jr .done -.cancelledPass - ld hl, PassRefuse - call PrintText -.done - ret +;.choseFaraway +; ld hl, EventVermillionCityOldSeaMap +; call PrintText +; ld a, FARAWAY_ISLAND_OUTSIDE +; ld [wDestinationMap], a +; ld hl, wd732 +; set 2, [hl] ; fly warp or dungeon warp +; call SpecialWarpIn +; jp SpecialEnterMap +;.choseCitrine +; ld hl, EventVermillionCityCitrinePass +; call PrintText +; ld a, CITRINE_CITY +; ldh [hWarpDestinationMap], a +; ld a, $6 +; ld [wDestinationWarpID], a +; call WarpFound2 +; jr .done +;.cancelledPass +; ld hl, PassRefuse +; call PrintText +;.done +; ret +; +; ================================================================ VermilionCity_TextPointers: dw VermilionCityText1 @@ -266,6 +326,8 @@ VermilionCity_TextPointers: dw VermilionCityText6 dw OfficerJennySquirtle dw VermilionBeauty + dw EventVermillionCityOldSeaMapGreeting + dw EventVermillionCityCitrinePassGreeting dw VermilionCityText7 dw VermilionCityText8 dw MartSignText @@ -302,25 +364,36 @@ VermilionCityTextSSAnneDeparted: VermilionCityText3: text_asm - ; If you have either of these, go to Pass List. - ; You only access these in the post-game, really, so it works out. - ld b, OLD_SEA_MAP - predef GetQuantityOfItemInBag - ld a, b - and a - jp nz, PassListings - ld b, CITRINE_PASS - predef GetQuantityOfItemInBag - ld a, b - and a - jp nz, PassListings + ; Checking the location that the script flagged earlier. + ; Instead of using an item checker, this is more effective and easy on memory. + ; Also, it doesn't get cross-threaded if you have multiples of the same thing. I had issues working around that one - I ain't a programmer by trade, unfortunately, I'm a TEFL student. + ; Anyway, the code kicks you to different versions of the same script; I've had them isolated to call text in a way that's easier architecturally. Otherwise, we're checking the item found every time, and I'm 90% sure that nicks a WRAM entry. + ; All in all: Yes, this is suboptimal, but I've been doing this for months. Sue me. + ld hl, OldSeaMapCheckCoords + call ArePlayerCoordsInArray + jr c, HasOldSeaMap + ld hl, CitrineCityCheckCoords + call ArePlayerCoordsInArray + jp c, HasCitrinePass + + ; If you have neither, this will continue as normal, see? + ; This is why we needed the child coords. + + ; Before the coord system, we used this with the unused pass listing code. + ; See where the issues arose? Possibly a neat exercise! + ;ld b, OLD_SEA_MAP + ;predef GetQuantityOfItemInBag + ;ld a, b + ;and a + ;jp nz, PassListings + ;ld b, CITRINE_PASS + ;predef GetQuantityOfItemInBag + ;ld a, b + ;and a + ;jp nz, PassListings - ld a, [wObtainedBadges] - bit 5, a ; after obtaining marsh badge the ship returns - jr nz, .default CheckEvent EVENT_SS_ANNE_LEFT jr nz, .shipHasDeparted -.default ld a, [wSpritePlayerStateData1FacingDirection] cp SPRITE_FACING_RIGHT jr z, .greetPlayer @@ -334,6 +407,7 @@ VermilionCityText3: .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 @@ -354,9 +428,13 @@ VermilionCityText3: .end jp TextScriptEnd -.inFrontOfOrBehindGuardCoords - dbmapcoord 19, 29 ; in front of guard - dbmapcoord 19, 31 ; behind guard +.inFrontOfOrBehindGuardCoords ; This can be all at once don't worry. + dbmapcoord 19, 29 ; in front of guard - S. S. Anne + dbmapcoord 19, 31 ; behind guard - S. S. Anne + dbmapcoord 11, 29 ; Faraway Island + dbmapcoord 11, 31 ; Faraway Island + dbmapcoord 27, 29 ; Citrine City + dbmapcoord 27, 31 ; Citrine City db -1 ; end SSAnneWelcomeText4: @@ -379,6 +457,93 @@ SSAnneNotHereText: text_far _SSAnneNotHereText text_end +HasOldSeaMap: + text_asm + ld a, [wSpritePlayerStateData1FacingDirection] + cp SPRITE_FACING_RIGHT + jr z, .greetPlayer + ld hl, VermilionCityText3.inFrontOfOrBehindGuardCoords + call ArePlayerCoordsInArray + jr nc, .greetPlayerAndCheckTicket +.greetPlayer + ld hl, EventVermillionCityOldSeaMapGreeting + call PrintText + jr .end +.greetPlayerAndCheckTicket + ld hl, EventVermillionCityOldSeaMapGreeting + call PrintText + call TheAutoskipStopinator + ld b, OLD_SEA_MAP + predef GetQuantityOfItemInBag + ld a, b + and a + jr nz, .playerHasTicket + ld hl, EventVermillionCityOldSeaMapGreetCheck + call PrintText + jr .end +.playerHasTicket + ld hl, EventVermillionCityOldSeaMap + call PrintText + ld a, $4 + ld [wVermilionCityCurScript], a +.end + jp TextScriptEnd + +EventVermillionCityOldSeaMapGreeting: + text "I am looking for" + line "a certain map..." + done + text_end + +EventVermillionCityOldSeaMapGreetCheck: + text "Do you have it?" + done + text_end + +HasCitrinePass: + text_asm + ld a, [wSpritePlayerStateData1FacingDirection] + cp SPRITE_FACING_RIGHT + jr z, .greetPlayer + ld hl, VermilionCityText3.inFrontOfOrBehindGuardCoords + call ArePlayerCoordsInArray + jr nc, .greetPlayerAndCheckTicket +.greetPlayer + ld hl, EventVermillionCityCitrinePassGreeting + call PrintText + jr .end +.greetPlayerAndCheckTicket + ld hl, EventVermillionCityCitrinePassGreeting + call PrintText + call TheAutoskipStopinator + ld b, CITRINE_PASS + predef GetQuantityOfItemInBag + ld a, b + and a + jr nz, .playerHasTicket + ld hl, EventVermillionCityCitrinePassGreetCheck + call PrintText + jr .end +.playerHasTicket + ld hl, EventVermillionCityCitrinePass + call PrintText + ld a, $4 + ld [wVermilionCityCurScript], a +.end + jp TextScriptEnd + +EventVermillionCityCitrinePassGreeting: + text "Hah! I only serve" + line "strong TRAINERs!" + done + text_end + +EventVermillionCityCitrinePassGreetCheck: + text "Gonna need to see" + line "proof, shrimp!" + done + text_end + VermilionCityText4: text_far _VermilionCityText4 text_end @@ -581,10 +746,7 @@ VermilionBeauty: ld hl, BeautyFinish2 .skip2 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. GivePokemon is very hasty. + 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. @@ -622,7 +784,7 @@ CatsDogsChoice: jr DisplayCatsDogsChoice InitCatsDogsTextBoxParameters: - ld a, $2 ; loads the value for the unused SOUTH/EAST choice, that was changed to say CATS/DOGS + 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 diff --git a/text/VermilionCity.asm b/text/VermilionCity.asm index 463dac68..929c3d75 100644 --- a/text/VermilionCity.asm +++ b/text/VermilionCity.asm @@ -163,12 +163,11 @@ _VermillionCityCitrinePass:: text " flashed" line "the CITRINE PASS!" - para "Ah! You must be" - line "pretty strong to" - cont "have this PASS!" + para "Crikey!" - para "Come on, come" - line "on!" + para "Right this way!" + line "I can't believe" + cont "it..." done _VermillionCityHarborRefuse::