diff --git a/constants/event_constants.asm b/constants/event_constants.asm index 73fe458e..6927aa12 100644 --- a/constants/event_constants.asm +++ b/constants/event_constants.asm @@ -153,7 +153,8 @@ const_next $150 const_skip const EVENT_GOT_BIKE_VOUCHER - const_skip 4 + const EVENT_VERMILION_BEAUTY_DONE + const_skip 3 const EVENT_SEEL_FAN_BOAST const EVENT_PIKACHU_FAN_BOAST const_skip 8 diff --git a/constants/menu_constants.asm b/constants/menu_constants.asm index 660ae77a..9d7a3fc9 100644 --- a/constants/menu_constants.asm +++ b/constants/menu_constants.asm @@ -35,8 +35,8 @@ DEF PC_ITEM_CAPACITY EQU 50 ; TwoOptionMenuStrings indexes (see data/yes_no_menu_strings.asm) const_def const YES_NO_MENU ; 0 - const NORTH_WEST_MENU ; 1 - const SOUTH_EAST_MENU ; 2 + const BOY_GIRL_MENU ; 1 + const CATS_DOGS_MENU ; 2 const WIDE_YES_NO_MENU ; 3 const NORTH_EAST_MENU ; 4 const TRADE_CANCEL_MENU ; 5 diff --git a/data/maps/objects/VermilionCity.asm b/data/maps/objects/VermilionCity.asm index 40e5df2d..98cd2f96 100644 --- a/data/maps/objects/VermilionCity.asm +++ b/data/maps/objects/VermilionCity.asm @@ -30,5 +30,6 @@ VermilionCity_Object: object_event 29, 9, SPRITE_MONSTER, WALK, UP_DOWN, 5 ; person object_event 25, 27, SPRITE_SAILOR, WALK, LEFT_RIGHT, 6 ; person object_event 31, 27, SPRITE_COOLTRAINER_F, WALK, LEFT_RIGHT, 14 ; person + object_event 12, 13, SPRITE_BEAUTY, STAY, DOWN, 15 ; person def_warps_to VERMILION_CITY diff --git a/data/text/text_2.asm b/data/text/text_2.asm index dd5c830d..fdae41fe 100644 --- a/data/text/text_2.asm +++ b/data/text/text_2.asm @@ -1740,7 +1740,7 @@ _OakSpeechText2B:: prompt _IntroducePlayerText:: - text "Next, what is" + text "Now, what is" line "your name?" prompt diff --git a/data/wild/maps/Route6.asm b/data/wild/maps/Route6.asm index 8e552664..24226e3a 100644 --- a/data/wild/maps/Route6.asm +++ b/data/wild/maps/Route6.asm @@ -1,16 +1,30 @@ +; The Wild Data here has been redesigned to fit the Vermilion Beauty quest. +; Meowth and Growlithe have 19.6% chances of appearing. +; I've limited the amount of Pokemon that can appear by proxy, making it so it's easier to get what the player wants. +; Oh, and the water encounters are a mishmash of what's seen here over the franchise. Route6WildMons: def_grass_wildmons 15 ; encounter rate - db 13, ODDISH - db 13, PSYDUCK + db 13, RATTATA + db 13, PIDGEY db 15, PIDGEOTTO - db 10, MANKEY - db 12, MANKEY - db 15, BELLSPROUT - db 16, BELLSPROUT - db 16, PSYDUCK - db 14, JIGGLYPUFF - db 16, MEOWTH + db 10, MEOWTH + db 12, MEOWTH + db 15, GROWLITHE + db 16, GROWLITHE + db 16, JIGGLYPUFF + db 14, GROWLITHE + db 16, ABRA end_grass_wildmons - def_water_wildmons 0 ; encounter rate + def_water_wildmons 10 ; encounter rate + db 12, PSYDUCK + db 12, SLOWPOKE + db 15, PSYDUCK + db 15, SLOWPOKE + db 15, GOLDEEN + db 15, WEIRDUCK + db 15, WEIRDUCK + db 16, SEAKING + db 15, GOLDUCK + db 20, GOLDUCK end_water_wildmons diff --git a/data/yes_no_menu_strings.asm b/data/yes_no_menu_strings.asm index bcc3ebc2..cbd2a555 100644 --- a/data/yes_no_menu_strings.asm +++ b/data/yes_no_menu_strings.asm @@ -9,7 +9,7 @@ TwoOptionMenuStrings: ; width, height, blank line before first menu item?, text pointer two_option_menu 4, 3, FALSE, .YesNoMenu two_option_menu 5, 3, FALSE, .BoyGirlMenu - two_option_menu 6, 3, FALSE, .SouthEastMenu + two_option_menu 6, 3, TRUE, .CatsDogsMenu two_option_menu 6, 3, FALSE, .YesNoMenu two_option_menu 6, 3, FALSE, .NorthEastMenu two_option_menu 7, 3, FALSE, .TradeCancelMenu @@ -26,13 +26,16 @@ TwoOptionMenuStrings: next "NO@" ; There is probably a better way to word this... +; Replaced North/West .BoyGirlMenu: db "BOY" next "GIRL@" -.SouthEastMenu: - db "SOUTH" - next "EAST@" +; For the Vermilion Beauty event. +; Replaced South/East +.CatsDogsMenu: + db "CATS" + next "DOGS@" .NorthEastMenu: db "NORTH" diff --git a/engine/battle/core.asm b/engine/battle/core.asm index 0017cd60..5ef271ae 100644 --- a/engine/battle/core.asm +++ b/engine/battle/core.asm @@ -2379,6 +2379,7 @@ UseBagItem: ret .returnAfterCapturingMon + call VermilionBeautyCheck ; before you go, would you like to talk about our lord and saviour LGPE? call GBPalNormal xor a ld [wCapturedMonSpecies], a @@ -7225,3 +7226,22 @@ StupidBattleTentFix: text "Oops! Better" line "luck next time!" prompt + +; Vermilion Beauty functionality. +; If we have a Meowth or Growlithe on our hands, increment the counter. +VermilionBeautyCheck: + ld a, [wBeautyChoice] ; Firstly, was this even started? + jr z, .skipCounting ; Yeah? Alright, skip. + ld a, [wBeautyCounter] ; Now to cap this at 5. + cp 5 ; First, we check if we're at 5... + jr z, .skipCounting ; and if so, we skip doing this at all. + + ld a, [wCapturedMonSpecies] ; Now to check the species. + ld hl, wBeautyChoice + cp [hl] ; Is it our guy? + jr nz, .skipCounting ; Fuck right off then. + ld a, [wBeautyCounter] ; Ok, now grab the counter... + inc a ; Increment it... + ld [wBeautyCounter], a ; and get the FUCK out of my office!!! +.skipCounting + ret \ No newline at end of file diff --git a/engine/debug/debug_party.asm b/engine/debug/debug_party.asm index aa6c2935..c405b352 100644 --- a/engine/debug/debug_party.asm +++ b/engine/debug/debug_party.asm @@ -48,6 +48,14 @@ IF DEF(_DEBUG) ld a, 39 ld [wCandyJarCount], a + ; Test Vermilion Beauty + ; Set a to 4 to test increments. + ; Set BeautyChoice to GROWLITHE to test the other choice. + ld a, 5 + ld [wBeautyCounter], a + ld a, MEOWTH + ld [wBeautyChoice], a + ; Get all badges except Earth Badge. ld a, ~(1 << BIT_EARTHBADGE) ld [wObtainedBadges], a @@ -165,15 +173,14 @@ DebugSetPokedexEntries: ret DebugItemsList: - db POKE_BALL, 99 + db MASTER_BALL, 99 db MYSTERY_BOX, 1 db CANDY_JAR, 1 db BICYCLE, 1 db FULL_RESTORE, 99 db MAX_REPEL, 99 db RARE_CANDY, 99 - db MASTER_BALL, 99 - db ULTRA_BALL, 99 + db POKE_BALL, 99 ; test ball miss text with this db SECRET_KEY, 1 db CARD_KEY, 1 db S_S_TICKET, 1 diff --git a/maps/VermilionCity.blk b/maps/VermilionCity.blk index 6db44247..cdba83ed 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 !TCdVm1|~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-gCCCCTxxxTxxxxxxCCCkkkTkTkkkkkkkCCCCCCCCCCCCCCCCCCCCCCCCTCCCTCCCCCCCCCC \ No newline at end of file diff --git a/ram/wram.asm b/ram/wram.asm index e9d1dd97..753186cf 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -1948,12 +1948,15 @@ wBoxItems:: ds PC_ITEM_CAPACITY * 2 + 1 ; bit 7: whether the player has changed boxes before wCurrentBoxNum:: db - ds 1 - ; number of HOF teams wNumHoFTeams:: db -ds 1 ; was wUnusedD5A3, removed when putting the Mystery Box in. +; LGPE Vermilion Beauty event-related stuff. +; wBeautyChoice stores either MEOWTH or GROWLITHE, which the counter will increment with. +; We use wBeautyChoice to spit out text during the cutscene too. +; wBeautyCounter will count up to 5 and gives the player a L16 Persian or Arcanine depending on what counts up. +wBeautyChoice:: db ; Stores the ID of the Pokemon chosen. +wBeautyCounter:: db ; was wUnusedD5A3, removed when putting the Mystery Box in. wPlayerCoins:: ds 2 ; BCD diff --git a/scripts/VermilionCity.asm b/scripts/VermilionCity.asm index 1ef9cfb9..bd8d6c38 100644 --- a/scripts/VermilionCity.asm +++ b/scripts/VermilionCity.asm @@ -274,6 +274,7 @@ VermilionCity_TextPointers: dw VermilionCityText12 dw VermilionCityText13 dw RoingusText + dw VermilionBeauty VermilionCityText1: text_far _VermilionCityText1 @@ -459,3 +460,120 @@ EventVermillionCitySSTicket: PassRefuse: text_far _VermillionCityHarborRefuse 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. +; So Meowth gets Arcanine, and Growlithe gets Persian. +; This code is kind of schizophrenic but it does the job. +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. + +.eventStart + ld hl, BeautyText1 ; Let's open the text. + call PrintText + call CatsDogsChoice + + 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 + +.eventInProgress ; This is a jump point for if the event was already started. + ld a, [wBeautyChoice] + ld [wd11e], a + call GetMonName + ld hl, BeautyChoice + call PrintText + jr .done ; no give pokemon. bad. +.eventIsFinished + call SaveScreenTilesToBuffer1 ; saves us from some corruption disasters if nicknaming. + ld a, [wBeautyChoice] + ld [wd11e], a + call GetMonName + ld hl, BeautyFinish + call PrintText + + lb bc, PERSIAN, 16 + ld a, [wBeautyChoice] ; Let's make sure they actually need Persian. + cp PERSIAN ; Do they? + jr z, .skip2 ; electric boogaloo + lb bc, ARCANINE, 16 ; ok but skip2 means arc never gets loaded in. very good sequel. disney would NEVER. +.skip2 + call GivePokemon + call LoadScreenTilesFromBuffer1 ; saves us from some corruption disasters if nicknaming. + SetEvent EVENT_VERMILION_BEAUTY_DONE ; and now we can finally rest. +.done + jp TextScriptEnd + +; This needs to be separate for reasons I refuse to elaborate on for fear of angering God. +BeautyDone: + text_asm + ld a, [wBeautyChoice] + ld [wd11e], a + call GetMonName + ld hl, BeautyExplain + call PrintText + 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, that 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 + +BeautyFinish: + text_far _BeautyFinish + text_end + +BeautyExplain: + text_far _BeautyExplain + text_end \ No newline at end of file diff --git a/text/VermilionCity.asm b/text/VermilionCity.asm index e7d0d2ce..0cc6cdcf 100644 --- a/text/VermilionCity.asm +++ b/text/VermilionCity.asm @@ -175,3 +175,54 @@ _VermillionCityHarborRefuse:: text "Alright! Have a" line "nice day!" done + +_BeautyText1:: + text "Hey! Do you like" + line "cats or dogs?" + prompt + +_BeautyText2:: + text "Ah! I knew it!" + + para "Sorry, it was a" + line "silly question..." + prompt ; needed for text to scroll correctly - it looks and acts fine in-game, don't worry. + +_BeautyChoice:: ; this is separate for the in-progress event. + text "If you catch 5" + line "@" + text_ram wcd6d ; efficiency - means we don't need two separate texts... + text ", I'll" + cont "give you a great" + cont "#MON!" + + para "See you then!" + done + +_BeautyFinish:: + text "Oh! You've caught" + line "5 " + text_ram wcd6d + text "!" + prompt + +_BeautyExplain:: + text "When " + text_ram wcd6d + line "evolves, it will" + cont "look like this." + + para "Hm? Why did I" + line "make you catch" + cont "the opposite" + cont "#MON?" + + para "Well, I wanted" + line "to see if your" + cont "preferences" + cont "stayed the same." + + para "It seems I was" + line "wrong!" + done +