diff options
author | yenatch <yenatch@gmail.com> | 2016-04-18 08:01:12 -0400 |
---|---|---|
committer | yenatch <yenatch@gmail.com> | 2016-04-18 08:01:12 -0400 |
commit | 7aef59841489ea449b9a34d424c681a4b48b88ab (patch) | |
tree | 72d46f1cc076564f62b11f5379960cd745a7fc9a /event | |
parent | c5fb2c947ffcdd0ddd80319a24a6acbe828d9598 (diff) | |
parent | 5d94fb22ed0e4c9edfca506b80f50ef71fd78664 (diff) |
Merge pull request #338 from PikalaxALT/master
Battle anims, HP Bar anim
Diffstat (limited to 'event')
-rw-r--r-- | event/battle_tower.asm | 4 | ||||
-rw-r--r-- | event/buena.asm | 18 | ||||
-rwxr-xr-x | event/celebi.asm | 16 | ||||
-rwxr-xr-x | event/daycare.asm | 36 | ||||
-rw-r--r-- | event/dratini.asm | 14 | ||||
-rwxr-xr-x | event/field_moves.asm | 2 | ||||
-rwxr-xr-x | event/forced_movement.asm | 8 | ||||
-rwxr-xr-x | event/halloffame.asm | 8 | ||||
-rwxr-xr-x | event/happiness_egg.asm | 238 | ||||
-rwxr-xr-x | event/itemball.asm | 6 | ||||
-rw-r--r-- | event/kurt.asm | 2 | ||||
-rw-r--r-- | event/magikarp.asm | 8 | ||||
-rwxr-xr-x | event/magnet_train.asm | 14 | ||||
-rw-r--r-- | event/mom.asm | 38 | ||||
-rwxr-xr-x | event/mom_phone.asm | 4 | ||||
-rwxr-xr-x | event/overworld.asm | 1890 | ||||
-rwxr-xr-x | event/poisonstep.asm | 2 | ||||
-rw-r--r-- | event/poke_seer.asm | 3 | ||||
-rwxr-xr-x | event/special.asm | 231 |
19 files changed, 2451 insertions, 91 deletions
diff --git a/event/battle_tower.asm b/event/battle_tower.asm index a938e34c7..091fe7fe1 100644 --- a/event/battle_tower.asm +++ b/event/battle_tower.asm @@ -300,7 +300,7 @@ VerifyUniqueness: ; 8b2e9 ret ; 8b31a -.nextmon: ; 8b31a +.nextmon ; 8b31a push bc ld bc, PARTYMON_STRUCT_LENGTH add hl, bc @@ -309,7 +309,7 @@ VerifyUniqueness: ; 8b2e9 ret ; 8b322 -.isegg: ; 8b322 +.isegg ; 8b322 push bc ld b, a ld a, [de] diff --git a/event/buena.asm b/event/buena.asm index 97aab0c05..5cff72d53 100644 --- a/event/buena.asm +++ b/event/buena.asm @@ -121,15 +121,15 @@ SpecialBuenaPrize: ; 8afd4 call PrintBlueCardBalance jr .Purchase -.InsufficientBalance +.InsufficientBalance: ld hl, .Text_NotEnoughPoints jr .print -.BagFull +.BagFull: ld hl, .Text_NoRoom jr .print -.Purchase +.Purchase: ld de, SFX_TRANSACTION call PlaySFX ld hl, .Text_HereYouGo @@ -160,7 +160,7 @@ SpecialBuenaPrize: ; 8afd4 db "@" ; 0x8b07c -.Text_HereYouGo ; Here you go! +.Text_HereYouGo: ; Here you go! text_jump UnknownText_0x1c58d1 db "@" ; 0x8b081 @@ -236,7 +236,7 @@ Buena_PlacePrizeMenuBox: ; 8b0d6 ret ; 8b0dd -.menudataheader: ; 0x8b0dd +.menudataheader ; 0x8b0dd db $40 ; flags db 00, 00 ; start coords db 11, 17 ; end coords @@ -288,13 +288,13 @@ Buena_PrizeMenu: ; 8b0e2 dba .prizepoints ; 8b129 -.indices: ; 8b129 +.indices ; 8b129 db 9 db 1, 2, 3, 4, 5, 6, 7, 8, 9 db -1 ; 8b134 -.prizeitem: ; 8b134 +.prizeitem ; 8b134 ld a, [MenuSelection] call Buena_getprize ld a, [hl] @@ -306,7 +306,7 @@ Buena_PrizeMenu: ; 8b0e2 ret ; 8b147 -.prizepoints: ; 8b147 +.prizepoints ; 8b147 ld a, [MenuSelection] call Buena_getprize inc hl @@ -328,7 +328,7 @@ endr ret ; 8b15e -.prizes: ; 8b15e +.prizes ; 8b15e db ULTRA_BALL, 2 db FULL_RESTORE, 2 db NUGGET, 3 diff --git a/event/celebi.asm b/event/celebi.asm index 3e01e31f6..c6d8346b0 100755 --- a/event/celebi.asm +++ b/event/celebi.asm @@ -53,7 +53,7 @@ Special_CelebiShrineEvent: ; 4989a ld hl, Sprites + 2 xor a ld c, $4 -.OAMloop +.OAMloop: ld [hli], a rept 3 inc hl @@ -171,7 +171,7 @@ UpdateCelebiPosition: ; 49aa2 (12:5aa2) jr nc, .ShiftY cp 8 * 8 + 4 jr nc, .ReinitSpriteAnimFrame -.ShiftY +.ShiftY: pop af push af cp d @@ -203,7 +203,7 @@ UpdateCelebiPosition: ; 49aa2 (12:5aa2) ld a, [hl] add $1 ld [hl], a -.ReinitSpriteAnimFrame +.ReinitSpriteAnimFrame: pop af ld hl, SPRITEANIMSTRUCT_XCOORD add hl, bc @@ -279,7 +279,7 @@ endr ; 49b6e (12:5b6e) -.sinewave: ; 49b6e +.sinewave ; 49b6e sine_wave $100 ; 49bae @@ -306,22 +306,22 @@ GetCelebiSpriteTile: ; 49bae jr .restart -.Frame1 +.Frame1: ld a, $84 jr .load_tile -.Frame2 +.Frame2: ld a, $88 jr .load_tile -.Frame3 +.Frame3: ld a, $8c jr .load_tile -.Frame4 +.Frame4: ld a, $90 .load_tile diff --git a/event/daycare.asm b/event/daycare.asm index c83701e28..3fa8e30c2 100755 --- a/event/daycare.asm +++ b/event/daycare.asm @@ -37,7 +37,7 @@ Special_DayCareMan: ; 166d6 call DayCare_InitBreeding ret -.AskWithdrawMon +.AskWithdrawMon: callba GetBreedMon1LevelGrowth ld hl, wBreedMon1Nick call GetPriceToRetrieveBreedmon @@ -76,7 +76,7 @@ Special_DayCareLady: ; 1672a call DayCare_InitBreeding ret -.AskWithdrawMon +.AskWithdrawMon: callba GetBreedMon2LevelGrowth ld hl, wBreedMon2Nick call GetPriceToRetrieveBreedmon @@ -144,27 +144,27 @@ DayCareAskDepositPokemon: ; 16798 and a ret -.Declined +.Declined: ld a, DAYCARETEXT_COME_AGAIN scf ret -.Egg +.Egg: ld a, DAYCARETEXT_CANT_BREED_EGG scf ret -.OnlyOneMon +.OnlyOneMon: ld a, DAYCARETEXT_LAST_MON scf ret -.OutOfUsableMons +.OutOfUsableMons: ld a, DAYCARETEXT_LAST_ALIVE_MON scf ret -.HoldingMail +.HoldingMail: ld a, DAYCARETEXT_REMOVE_MAIL scf ret @@ -227,7 +227,7 @@ DayCare_AskWithdrawBreedMon: ; 16807 scf ret -.PartyFull +.PartyFull: ld a, DAYCARETEXT_NOT_ENOUGH_MONEY scf ret @@ -460,16 +460,16 @@ Special_DayCareManOutside: ; 16936 ld hl, .TakeGoodCareOfItText jr .Load0 -.Declined +.Declined: ld hl, .IllKeepItThanksText -.Load0 +.Load0: call PrintText xor a ld [ScriptVar], a ret -.PartyFull +.PartyFull: ld hl, .PartyFullText call PrintText ld a, $1 @@ -575,7 +575,7 @@ DayCare_GiveEgg: ; 169ac and a ret -.PartyFull +.PartyFull: scf ret ; 16a31 @@ -644,14 +644,14 @@ DayCare_InitBreeding: ; 16a3b jr z, .LoadWhichBreedmonIsTheMother inc a -.LoadWhichBreedmonIsTheMother +.LoadWhichBreedmonIsTheMother: ld [wBreedMotherOrNonDitto], a and a ld a, [wBreedMon1Species] jr z, .GotMother ld a, [wBreedMon2Species] -.GotMother +.GotMother: ld [CurPartySpecies], a callab GetPreEvolution callab GetPreEvolution @@ -666,7 +666,7 @@ DayCare_InitBreeding: ; 16a3b ld a, NIDORAN_F jr c, .GotEggSpecies ld a, NIDORAN_M -.GotEggSpecies +.GotEggSpecies: ld [CurPartySpecies], a ld [CurSpecies], a ld [wEggMonSpecies], a @@ -739,14 +739,14 @@ DayCare_InitBreeding: ; 16a3b ld e, c jr .GotDVs -.ParentCheck2 +.ParentCheck2: ld a, [wBreedMotherOrNonDitto] and a jr nz, .GotDVs ld d, b ld e, c -.GotDVs +.GotDVs: ld a, [de] inc de and $f @@ -763,7 +763,7 @@ DayCare_InitBreeding: ; 16a3b add b ld [hl], a -.SkipDVs +.SkipDVs: ld hl, StringBuffer1 ld de, wMonOrItemNameBuffer ld bc, NAME_LENGTH diff --git a/event/dratini.asm b/event/dratini.asm index d8ecdc803..5923ca363 100644 --- a/event/dratini.asm +++ b/event/dratini.asm @@ -13,7 +13,7 @@ SpecialDratini: ; 0x8b170 ld a, [bc] ld c, a ld de, PARTYMON_STRUCT_LENGTH -.CheckForDratini +.CheckForDratini: ; start at the end of the party and search backwards for a Dratini ld a, [hl] cp DRATINI @@ -28,7 +28,7 @@ SpecialDratini: ; 0x8b170 jr nz, .CheckForDratini ret -.GiveMoveset +.GiveMoveset: push hl ld a, [ScriptVar] ld hl, .Movesets @@ -41,7 +41,7 @@ rept 2 inc de endr -.GiveMoves +.GiveMoves: ld a, [hl] and a ; is the move 00? ret z ; if so, we're done here @@ -69,15 +69,15 @@ endr inc hl jr .GiveMoves -.Movesets -.Moveset0 +.Movesets: +.Moveset0: ; Dratini does not normally learn Extremespeed. This is a special gift. db WRAP db THUNDER_WAVE db TWISTER db EXTREMESPEED db 0 -.Moveset1 +.Moveset1: ; This is the normal moveset of a level 15 Dratini db WRAP db LEER @@ -107,7 +107,7 @@ endr jr nz, .loop ret -.EmptyParty +.EmptyParty: scf ret ; 8b1e1 diff --git a/event/field_moves.asm b/event/field_moves.asm index 658a21698..cf9e1bef0 100755 --- a/event/field_moves.asm +++ b/event/field_moves.asm @@ -174,7 +174,7 @@ endr ; 8ca1b -.dw: ; 8ca1b (23:4a1b) +.dw ; 8ca1b (23:4a1b) dw Cut_SpawnAnimateTree dw Cut_SpawnAnimateLeaves dw Cut_StartWaiting diff --git a/event/forced_movement.asm b/event/forced_movement.asm index b6e6091ff..aa0473803 100755 --- a/event/forced_movement.asm +++ b/event/forced_movement.asm @@ -7,22 +7,22 @@ Script_ForcedMovement:: ; 0x1253d end ; 0x12550 -.up: ; 0x12550 +.up ; 0x12550 applymovement PLAYER, .MovementData_up end ; 0x12555 -.down: ; 0x12555 +.down ; 0x12555 applymovement PLAYER, .MovementData_down end ; 0x1255a -.right: ; 0x1255a +.right ; 0x1255a applymovement PLAYER, .MovementData_right end ; 0x1255f -.left: ; 0x1255f +.left ; 0x1255f applymovement PLAYER, .MovementData_left end ; 0x12564 diff --git a/event/halloffame.asm b/event/halloffame.asm index 00716e20c..d6f2d15ed 100755 --- a/event/halloffame.asm +++ b/event/halloffame.asm @@ -310,7 +310,7 @@ _HallOfFamePC: ; 86650 call LoadFontsBattleExtra xor a ld [wJumptableIndex], a -.MasterLoop +.MasterLoop: call LoadHOFTeam ret c call .DisplayTeam @@ -319,7 +319,7 @@ _HallOfFamePC: ; 86650 inc [hl] jr .MasterLoop -.DisplayTeam +.DisplayTeam: xor a ld [wcf64], a .next @@ -353,7 +353,7 @@ _HallOfFamePC: ; 86650 and a ret -.DisplayMonAndStrings +.DisplayMonAndStrings: ; Print the number of times the player has entered the Hall of Fame. ; If that number is above 200, print "HOF Master!" instead. ld a, [wcf64] @@ -616,7 +616,7 @@ HOF_AnimatePlayerPic: ; 86810 ret ; 868ed -.PlayTime +.PlayTime: db "PLAY TIME@" ; 868f7 diff --git a/event/happiness_egg.asm b/event/happiness_egg.asm new file mode 100755 index 000000000..1e8c2a853 --- /dev/null +++ b/event/happiness_egg.asm @@ -0,0 +1,238 @@ +GetFirstPokemonHappiness: ; 718d + ld hl, PartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + ld de, PartySpecies +.loop + ld a, [de] + cp EGG + jr nz, .done + inc de + add hl, bc + jr .loop + +.done + ld [wd265], a + ld a, [hl] + ld [ScriptVar], a + call GetPokemonName + jp CopyPokemonName_Buffer1_Buffer3 + +CheckFirstMonIsEgg: ; 71ac + ld a, [PartySpecies] + ld [wd265], a + cp EGG + ld a, $1 + jr z, .egg + xor a + +.egg + ld [ScriptVar], a + call GetPokemonName + jp CopyPokemonName_Buffer1_Buffer3 + +ChangeHappiness: ; 71c2 +; Perform happiness action c on CurPartyMon + + ld a, [CurPartyMon] + inc a + ld e, a + ld d, 0 + ld hl, PartySpecies - 1 + add hl, de + ld a, [hl] + cp EGG + ret z + + push bc + ld hl, PartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [CurPartyMon] + call AddNTimes + pop bc + + ld d, h + ld e, l + + push de + ld a, [de] + cp 100 + ld e, 0 + jr c, .ok + inc e + cp 200 + jr c, .ok + inc e + +.ok + dec c + ld b, 0 + ld hl, .Actions +rept 3 + add hl, bc +endr + ld d, 0 + add hl, de + ld a, [hl] + cp 100 + pop de + + ld a, [de] + jr nc, .negative + add [hl] + jr nc, .done + ld a, -1 + jr .done + +.negative + add [hl] + jr c, .done + xor a + +.done + ld [de], a + ld a, [wBattleMode] + and a + ret z + ld a, [CurPartyMon] + ld b, a + ld a, [wPartyMenuCursor] + cp b + ret nz + ld a, [de] + ld [BattleMonHappiness], a + ret + +.Actions: + db +5, +3, +2 ; Gained a level + db +5, +3, +2 ; Vitamin + db +1, +1, +0 ; X Item + db +3, +2, +1 ; Battled a Gym Leader + db +1, +1, +0 ; Learned a move + db -1, -1, -1 ; Lost to an enemy + db -5, -5, -10 ; Fainted due to poison + db -5, -5, -10 ; Lost to a much stronger enemy + db +1, +1, +1 ; Haircut (Y1) + db +3, +3, +1 ; Haircut (Y2) + db +5, +5, +2 ; Haircut (Y3) + db +1, +1, +1 ; Haircut (O1) + db +3, +3, +1 ; Haircut (O2) + db +10, +10, +4 ; Haircut (O3) + db -5, -5, -10 ; Used Heal Powder or Energypowder (bitter) + db -10, -10, -15 ; Used Energy Root (bitter) + db -15, -15, -20 ; Used Revival Herb (bitter) + db +3, +3, +1 ; Grooming + db +10, +6, +4 ; Gained a level in the place where it was caught + +StepHappiness:: ; 725a +; Raise the party's happiness by 1 point every other step cycle. + + ld hl, wHappinessStepCount + ld a, [hl] + inc a + and 1 + ld [hl], a + ret nz + + ld de, PartyCount + ld a, [de] + and a + ret z + + ld c, a + ld hl, PartyMon1Happiness +.loop + inc de + ld a, [de] + cp EGG + jr z, .next + inc [hl] + jr nz, .next + ld [hl], $ff + +.next + push de + ld de, PARTYMON_STRUCT_LENGTH + add hl, de + pop de + dec c + jr nz, .loop + ret + +DaycareStep:: ; 7282 + + ld a, [wDaycareMan] + bit 0, a + jr z, .daycare_lady + + ld a, [wBreedMon1Level] ; level + cp 100 + jr nc, .daycare_lady + ld hl, wBreedMon1Exp + 2 ; exp + inc [hl] + jr nz, .daycare_lady + dec hl + inc [hl] + jr nz, .daycare_lady + dec hl + inc [hl] + ld a, [hl] + cp 5242880 / $10000 + jr c, .daycare_lady + ld a, 5242880 / $10000 + ld [hl], a + +.daycare_lady + ld a, [wDaycareLady] + bit 0, a + jr z, .check_egg + + ld a, [wBreedMon2Level] ; level + cp 100 + jr nc, .check_egg + ld hl, wBreedMon2Exp + 2 ; exp + inc [hl] + jr nz, .check_egg + dec hl + inc [hl] + jr nz, .check_egg + dec hl + inc [hl] + ld a, [hl] + cp 5242880 / $10000 + jr c, .check_egg + ld a, 5242880 / $10000 + ld [hl], a + +.check_egg + ld hl, wDaycareMan + bit 5, [hl] ; egg + ret z + ld hl, wStepsToEgg + dec [hl] + ret nz + + call Random + ld [hl], a + callab CheckBreedmonCompatibility + ld a, [wd265] + cp 230 + ld b, -1 + 32 percent + jr nc, .okay + ld a, [wd265] + cp 170 + ld b, 16 percent + jr nc, .okay + ld a, [wd265] + cp 110 + ld b, 12 percent + jr nc, .okay + ld b, 4 percent + +.okay + call Random + cp b + ret nc + ld hl, wDaycareMan + res 5, [hl] + set 6, [hl] + ret diff --git a/event/itemball.asm b/event/itemball.asm index 083d7efc2..ed0c6a9e0 100755 --- a/event/itemball.asm +++ b/event/itemball.asm @@ -11,7 +11,7 @@ FindItemInBallScript:: ; 0x122ce end ; 0x122e3 -.no_room: ; 0x122e3 +.no_room ; 0x122e3 opentext writetext .text_found waitbutton @@ -21,13 +21,13 @@ FindItemInBallScript:: ; 0x122ce end ; 0x122ee -.text_found: ; 0x122ee +.text_found ; 0x122ee ; found @ ! text_jump UnknownText_0x1c0a1c db "@" ; 0x122f3 -.text_bag_full: ; 0x122f3 +.text_bag_full ; 0x122f3 ; But can't carry any more items. text_jump UnknownText_0x1c0a2c db "@" diff --git a/event/kurt.asm b/event/kurt.asm index 1473e4631..ac341de49 100644 --- a/event/kurt.asm +++ b/event/kurt.asm @@ -315,7 +315,7 @@ Kurt_GiveUpSelectedQuantityOfSelectedApricorn: ; 88161 cp -1 jr nz, .loop2 -.OnlyOne +.OnlyOne: ld hl, wApricorns .loop4 ld a, [hl] diff --git a/event/magikarp.asm b/event/magikarp.asm index 2a5b98332..b9f73552c 100644 --- a/event/magikarp.asm +++ b/event/magikarp.asm @@ -10,7 +10,7 @@ Special_CheckMagikarpLength: ; fbb32 ld a, [CurPartySpecies] cp MAGIKARP jr nz, .not_magikarp - + ; Now let's compute its length based on its DVs and ID. ld a, [CurPartyMon] ld hl, PartyMon1Species @@ -31,14 +31,14 @@ Special_CheckMagikarpLength: ; fbb32 callba MagikarpLength_Mobile ld hl, .MeasureItText call PrintText - + ; Did we beat the record? ld hl, Buffer1 ld de, wBestMagikarpLengthFeet ld c, 2 call StringCmp jr nc, .not_long_enough - + ; NEW RECORD!!! Let's save that. ld hl, Buffer1 ld de, wBestMagikarpLengthFeet @@ -86,7 +86,7 @@ Magikarp_LoadFeetInchesChars: ; fbbae ret ; fbbbb -.feetinchchars: ; fbbb +.feetinchchars ; fbbb INCBIN "gfx/unknown/0fbbbb.2bpp" ; fbbdb diff --git a/event/magnet_train.asm b/event/magnet_train.asm index eb29fd296..c074e6835 100755 --- a/event/magnet_train.asm +++ b/event/magnet_train.asm @@ -7,7 +7,7 @@ Special_MagnetTrain: ; 8cc04 lb de, (11 * 8) - (11 * 8 + 4), -$60 jr .continue -.ToGoldenrod +.ToGoldenrod: ld a, -1 ; backwards lb bc, -$40, -$60 lb de, (11 * 8) + (11 * 8 + 4), $60 @@ -187,7 +187,7 @@ DrawMagnetTrain: ; 8cd27 ret ; 8cd65 -.FillLine ; 8cd65 +.FillLine: ; 8cd65 ld a, [de] inc de ld [hli], a @@ -196,7 +196,7 @@ DrawMagnetTrain: ; 8cd27 ret ; 8cd6c -.FillAlt ; 8cd6c +.FillAlt: ; 8cd6c ld [hl], e inc hl ld [hl], d @@ -306,7 +306,7 @@ endr ; 8ce06 .Jumptable: ; 8ce06 - + dw .InitPlayerSpriteAnim dw .WaitScene dw .MoveTrain1 @@ -367,7 +367,7 @@ endr ld [hl], a ret -.PrepareToHoldTrain +.PrepareToHoldTrain: call .Next ld a, $80 ld [wcf66], a @@ -382,7 +382,7 @@ endr dec [hl] ret -.DoneWaiting +.DoneWaiting: call .Next ret ; 8ce7a @@ -414,7 +414,7 @@ endr ret -.PrepareToFinishAnim +.PrepareToFinishAnim: call .Next ret ; 8cea2 diff --git a/event/mom.asm b/event/mom.asm index ab405a27c..d2b7d2a7c 100644 --- a/event/mom.asm +++ b/event/mom.asm @@ -32,8 +32,8 @@ endr jp [hl] ; 16242 -.dw: ; 16242 - +.dw ; 16242 + dw .CheckIfBankInitialized dw .InitializeBank dw .IsThisAboutYourMoney @@ -72,7 +72,7 @@ endr ld a, %10000001 jr .done_1 -.DontSaveMoney +.DontSaveMoney: ld a, %10000000 .done_1 @@ -188,17 +188,17 @@ endr ld a, $8 jr .done_4 -.DontHaveThatMuchToDeposit +.DontHaveThatMuchToDeposit: ld hl, UnknownText_0x1667b call PrintText ret -.CantDepositThatMuch +.CantDepositThatMuch: ld hl, UnknownText_0x16680 call PrintText ret -.CancelDeposit +.CancelDeposit: ld a, $7 .done_4 @@ -256,17 +256,17 @@ endr ld a, $8 jr .done_5 -.InsufficientFundsInBank +.InsufficientFundsInBank: ld hl, UnknownText_0x16671 call PrintText ret -.NotEnoughRoomInWallet +.NotEnoughRoomInWallet: ld hl, UnknownText_0x16676 call PrintText ret -.CancelWithdraw +.CancelWithdraw: ld a, $7 .done_5 @@ -287,7 +287,7 @@ endr ld [wJumptableIndex], a ret -.StopSavingMoney +.StopSavingMoney: ld a, $80 ld [wMomSavingMoney], a ld a, $7 @@ -315,12 +315,12 @@ DSTChecks: ; 16439 jr z, .LostBooklet jr .loop -.NotDST +.NotDST: cp 23 ; within one hour of 23:00? jr nz, .loop ; fallthrough -.LostBooklet +.LostBooklet: call .ClearBox bccoord 1, 14 ld hl, .Text_AdjustClock @@ -353,7 +353,7 @@ DSTChecks: ; 16439 call PlaceWholeStringInBoxAtOnce ret -.SetDST +.SetDST: ld hl, .Text_SwitchToDST call PlaceWholeStringInBoxAtOnce call YesNoBox @@ -375,7 +375,7 @@ DSTChecks: ; 16439 sub 24 jr nc, .DontLoopHourForward add 24 -.DontLoopHourForward +.DontLoopHourForward: ld [StartHour], a ccf ld a, [StartDay] @@ -389,13 +389,13 @@ DSTChecks: ; 16439 sub 1 jr nc, .DontLoopHourBack add 24 -.DontLoopHourBack +.DontLoopHourBack: ld [StartHour], a ld a, [StartDay] sbc 0 jr nc, .DontLoopDayBack add 7 -.DontLoopDayBack +.DontLoopDayBack: ld [StartDay], a ret ; 164ea @@ -480,7 +480,7 @@ Function1651a: ; 1651a lb bc, PRINTNUM_MONEY | PRINTNUM_LEADINGZEROS | 3, 6 call PrintNum call UpdateSprites - call Function3238 + call CGBOnly_LoadEDTile ret ; 1656b @@ -534,7 +534,7 @@ Function16571: ; 16571 ret ; 165b9 -.dpadaction: ; 165b9 +.dpadaction ; 165b9 ld hl, hJoyLast ld a, [hl] and D_UP @@ -586,7 +586,7 @@ Function16571: ; 16571 ret ; 16607 -.getdigitquantity: ; 16607 +.getdigitquantity ; 16607 ld a, [wMomBankDigitCursorPosition] push de ld e, a diff --git a/event/mom_phone.asm b/event/mom_phone.asm index a750b7475..f689745f1 100755 --- a/event/mom_phone.asm +++ b/event/mom_phone.asm @@ -103,7 +103,7 @@ CheckBalance_MomItem2: ; fd044 scf ret -.AddMoney +.AddMoney: ld de, MomItemTriggerBalance ld bc, hMoneyTemp callba AddMoney @@ -198,7 +198,7 @@ GetItemFromMom: ; fd117 .ok ld de, MomItems_2 -.GetFromList1 +.GetFromList1: ld l, a ld h, 0 rept 3 ; multiply hl by 8 diff --git a/event/overworld.asm b/event/overworld.asm new file mode 100755 index 000000000..c9fe754fe --- /dev/null +++ b/event/overworld.asm @@ -0,0 +1,1890 @@ +FieldMoveJumptableReset: ; c6ea + xor a + ld hl, Buffer1 + ld bc, 7 + call ByteFill + ret + +FieldMoveJumptable: ; c6f5 + ld a, [Buffer1] + rst JumpTable + ld [Buffer1], a + bit 7, a + jr nz, .okay + and a + ret + +.okay + and $7f + scf + ret + +GetPartyNick: ; c706 +; write CurPartyMon nickname to StringBuffer1-3 + ld hl, PartyMonNicknames + ld a, BOXMON + ld [MonType], a + ld a, [CurPartyMon] + call GetNick + call CopyName1 +; copy text from StringBuffer2 to StringBuffer3 + ld de, StringBuffer2 + ld hl, StringBuffer3 + call CopyName2 + ret + +CheckEngineFlag: ; c721 +; Check engine flag de +; Return carry if flag is not set + ld b, CHECK_FLAG + callba EngineFlagAction + ld a, c + and a + jr nz, .isset + scf + ret +.isset + xor a + ret + +CheckBadge: ; c731 +; Check engine flag a (ENGINE_ZEPHYRBADGE thru ENGINE_EARTHBADGE) +; Display "Badge required" text and return carry if the badge is not owned + call CheckEngineFlag + ret nc + ld hl, .BadgeRequiredText + call MenuTextBoxBackup ; push text to queue + scf + ret + +.BadgeRequiredText: ; c73d + ; Sorry! A new BADGE + ; is required. + text_jump _BadgeRequiredText + db "@" + +CheckPartyMove: ; c742 +; Check if a monster in your party has move d. + + ld e, 0 + xor a + ld [CurPartyMon], a +.loop + ld c, e + ld b, 0 + ld hl, PartySpecies + add hl, bc + ld a, [hl] + and a + jr z, .no + cp a, -1 + jr z, .no + cp a, EGG + jr z, .next + + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, PartyMon1Moves + ld a, e + call AddNTimes + ld b, NUM_MOVES +.check + ld a, [hli] + cp d + jr z, .yes + dec b + jr nz, .check + +.next + inc e + jr .loop + +.yes + ld a, e + ld [CurPartyMon], a ; which mon has the move + xor a + ret +.no + scf + ret + +FieldMoveFailed: ; c779 + ld hl, .CantUseHere + call MenuTextBoxBackup + ret + +.CantUseHere: ; 0xc780 + ; Can't use that here. + text_jump UnknownText_0x1c05c8 + db "@" + +CutFunction: ; c785 + call FieldMoveJumptableReset +.loop + ld hl, .Jumptable + call FieldMoveJumptable + jr nc, .loop + and $7f + ld [wFieldMoveSucceeded], a + ret + +.Jumptable: ; c796 (3:4796) + + dw .CheckAble + dw .DoCut + dw .FailCut + +.CheckAble: ; c79c (3:479c) + ld de, ENGINE_HIVEBADGE + call CheckBadge + jr c, .nohivebadge + call CheckMapForSomethingToCut + jr c, .nothingtocut + ld a, $1 + ret + +.nohivebadge + ld a, $80 + ret + +.nothingtocut + ld a, $2 + ret + +.DoCut: ; c7b2 (3:47b2) + ld hl, Script_CutFromMenu + call QueueScript + ld a, $81 + ret + +.FailCut: ; c7bb (3:47bb) + ld hl, Text_NothingToCut + call MenuTextBoxBackup + ld a, $80 + ret + +Text_UsedCut: ; 0xc7c4 + ; used CUT! + text_jump UnknownText_0x1c05dd + db "@" + +Text_NothingToCut: ; 0xc7c9 + ; There's nothing to CUT here. + text_jump UnknownText_0x1c05ec + db "@" + +CheckMapForSomethingToCut: ; c7ce + ; Does the collision data of the facing tile permit cutting? + call GetFacingTileCoord + ld c, a + push de + callba CheckCutCollision + pop de + jr nc, .fail + ; Get the location of the current block in OverworldMap. + call GetBlockLocation + ld c, [hl] + ; See if that block contains something that can be cut. + push hl + ld hl, CutTreeBlockPointers + call CheckOverworldTileArrays + pop hl + jr nc, .fail + ; Back up the OverworldMap address to Buffer3 + ld a, l + ld [Buffer3], a + ld a, h + ld [Buffer4], a + ; Back up the replacement tile to Buffer5 + ld a, b + ld [Buffer5], a + ; Back up the animation index to Buffer6 + ld a, c + ld [Buffer6], a + xor a + ret + +.fail + scf + ret + +Script_CutFromMenu: ; c7fe + reloadmappart + special UpdateTimePals + +Script_Cut: ; 0xc802 + callasm GetPartyNick + writetext Text_UsedCut + reloadmappart + callasm CutDownTreeOrGrass + closetext + end + +CutDownTreeOrGrass: ; c810 + ld hl, Buffer3 ; OverworldMapTile + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [Buffer5] ; ReplacementTile + ld [hl], a + xor a + ld [hBGMapMode], a + call OverworldTextModeSwitch + call UpdateSprites + call DelayFrame + ld a, [Buffer6] ; Animation type + ld e, a + callba OWCutAnimation + call BufferScreen + call GetMovementPermissions + call UpdateSprites + call DelayFrame + call LoadStandardFont + ret + +CheckOverworldTileArrays: ; c840 + ; Input: c contains the tile you're facing + ; Output: Replacement tile in b and effect on wild encounters in c, plus carry set. + ; Carry is not set if the facing tile cannot be replaced, or if the tileset + ; does not contain a tile you can replace. + + ; Dictionary lookup for pointer to tile replacement table + push bc + ld a, [wTileset] + ld de, 3 + call IsInArray + pop bc + jr nc, .nope + ; Load the pointer + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ; Look up the tile you're facing + ld de, 3 + ld a, c + call IsInArray + jr nc, .nope + ; Load the replacement to b + inc hl + ld b, [hl] + ; Load the animation type parameter to c + inc hl + ld c, [hl] + scf + ret + +.nope + xor a + ret + +CutTreeBlockPointers: ; c862 +; Which tileset are we in? + dbw TILESET_JOHTO_1, .johto1 + dbw TILESET_JOHTO_2, .johto2 + dbw TILESET_KANTO, .kanto + dbw TILESET_PARK, .park + dbw TILESET_ILEX_FOREST, .ilex + db -1 + +.johto1 ; Johto OW +; Which meta tile are we facing, which should we replace it with, and which animation? + db $03, $02, $01 ; grass + db $5b, $3c, $00 ; tree + db $5f, $3d, $00 ; tree + db $63, $3f, $00 ; tree + db $67, $3e, $00 ; tree + db -1 + +.johto2 ; Goldenrod area + db $03, $02, $01 ; grass + db -1 + +.kanto ; Kanto OW + db $0b, $0a, $01 ; grass + db $32, $6d, $00 ; tree + db $33, $6c, $00 ; tree + db $34, $6f, $00 ; tree + db $35, $4c, $00 ; tree + db $60, $6e, $00 ; tree + db -1 + +.park ; National Park + db $13, $03, $01 ; grass + db $03, $04, $01 ; grass + db -1 + +.ilex ; Ilex Forest + db $0f, $17, $00 + db -1 + +WhirlpoolBlockPointers: ; c8a4 + dbw TILESET_JOHTO_1, .johto + db -1 + +.johto ; c8a8 + db $07, $36, $00 + db -1 + +OWFlash: ; c8ac + call .CheckUseFlash + and $7f + ld [wFieldMoveSucceeded], a + ret + +.CheckUseFlash: ; c8b5 +; Flash + ld de, ENGINE_ZEPHYRBADGE + callba CheckBadge + jr c, .nozephyrbadge + push hl + callba SpecialAerodactylChamber + pop hl + jr c, .useflash + ld a, [wTimeOfDayPalset] + cp %11111111 ; 3, 3, 3, 3 + jr nz, .notadarkcave +.useflash + call UseFlash + ld a, $81 + ret + +.notadarkcave + call FieldMoveFailed + ld a, $80 + ret + +.nozephyrbadge + ld a, $80 + ret + +UseFlash: ; c8e0 + ld hl, Script_UseFlash + jp QueueScript + +Script_UseFlash: ; 0xc8e6 + reloadmappart + special UpdateTimePals + writetext UnknownText_0xc8f3 + callasm BlindingFlash + closetext + end + +UnknownText_0xc8f3: ; 0xc8f3 + text_jump UnknownText_0x1c0609 + start_asm + call WaitSFX + ld de, SFX_FLASH + call PlaySFX + call WaitSFX + ld hl, .BlankText + ret + +.BlankText: ; 0xc908 + db "@" + +SurfFunction: ; c909 + call FieldMoveJumptableReset +.loop + ld hl, .Jumptable + call FieldMoveJumptable + jr nc, .loop + and $7f + ld [wFieldMoveSucceeded], a + ret + +.Jumptable: ; c91a (3:491a) + dw .TrySurf + dw .DoSurf + dw .FailSurf + dw .AlreadySurfing + +.TrySurf: ; c922 (3:4922) + ld de, ENGINE_FOGBADGE + call CheckBadge + jr c, .asm_c956 + ld hl, BikeFlags + bit 1, [hl] ; always on bike + jr nz, .cannotsurf + ld a, [PlayerState] + cp PLAYER_SURF + jr z, .alreadyfail + cp PLAYER_SURF_PIKA + jr z, .alreadyfail + call GetFacingTileCoord + call GetTileCollision + cp $1 + jr nz, .cannotsurf + call CheckDirection + jr c, .cannotsurf + callba CheckFacingObject + jr c, .cannotsurf + ld a, $1 + ret +.asm_c956 + ld a, $80 + ret +.alreadyfail + ld a, $3 + ret +.cannotsurf + ld a, $2 + ret + +.DoSurf: ; c95f (3:495f) + call GetSurfType + ld [Buffer2], a ; wd1eb (aliases: MovementType) + call GetPartyNick + ld hl, SurfFromMenuScript + call QueueScript + ld a, $81 + ret + +.FailSurf: ; c971 (3:4971) + ld hl, CantSurfText + call MenuTextBoxBackup + ld a, $80 + ret + +.AlreadySurfing: ; c97a (3:497a) + ld hl, AlreadySurfingText + call MenuTextBoxBackup + ld a, $80 + ret + +SurfFromMenuScript: ; c983 + special UpdateTimePals + +UsedSurfScript: ; c986 + writetext UsedSurfText ; "used SURF!" + waitbutton + closetext + + callasm .empty_fn ; empty function + + copybytetovar Buffer2 + writevarcode VAR_MOVEMENT + + special ReplaceKrisSprite + special PlayMapMusic +; step into the water + special Special_SurfStartStep ; (slow_step_x, step_end) + applymovement PLAYER, MovementBuffer ; PLAYER, MovementBuffer + end + +.empty_fn ; c9a2 + callba MobileFn_1060bb ; empty + ret + +UsedSurfText: ; c9a9 + text_jump _UsedSurfText + db "@" + +CantSurfText: ; c9ae + text_jump _CantSurfText + db "@" + +AlreadySurfingText: ; c9b3 + text_jump _AlreadySurfingText + db "@" + +GetSurfType: ; c9b8 +; Surfing on Pikachu uses an alternate sprite. +; This is done by using a separate movement type. + + ld a, [CurPartyMon] + ld e, a + ld d, 0 + ld hl, PartySpecies + add hl, de + + ld a, [hl] + cp PIKACHU + ld a, PLAYER_SURF_PIKA + ret z + ld a, PLAYER_SURF + ret + +CheckDirection: ; c9cb +; Return carry if a tile permission prevents you +; from moving in the direction you're facing. + +; Get player direction + ld a, [PlayerDirection] + and a, %00001100 ; bits 2 and 3 contain direction + rrca + rrca + ld e, a + ld d, 0 + ld hl, .Directions + add hl, de + +; Can you walk in this direction? + ld a, [TilePermissions] + and [hl] + jr nz, .quit + xor a + ret + +.quit + scf + ret + +.Directions: + db FACE_DOWN + db FACE_UP + db FACE_LEFT + db FACE_RIGHT + +TrySurfOW:: ; c9e7 +; Checking a tile in the overworld. +; Return carry if fail is allowed. + +; Don't ask to surf if already fail. + ld a, [PlayerState] + cp PLAYER_SURF_PIKA + jr z, .quit + cp PLAYER_SURF + jr z, .quit + +; Must be facing water. + ld a, [EngineBuffer1] + call GetTileCollision + cp 1 ; surfable + jr nz, .quit + +; Check tile permissions. + call CheckDirection + jr c, .quit + + ld de, ENGINE_FOGBADGE + call CheckEngineFlag + jr c, .quit + + ld d, SURF + call CheckPartyMove + jr c, .quit + + ld hl, BikeFlags + bit 1, [hl] ; always on bike (can't surf) + jr nz, .quit + + call GetSurfType + ld [MovementType], a + call GetPartyNick + + ld a, BANK(AskSurfScript) + ld hl, AskSurfScript + call CallScript + + scf + ret + +.quit + xor a + ret + +AskSurfScript: ; ca2c + opentext + writetext AskSurfText + yesorno + iftrue UsedSurfScript + closetext + end + +AskSurfText: ; ca36 + text_jump _AskSurfText ; The water is calm. + db "@" ; Want to SURF? + +FlyFunction: ; ca3b + call FieldMoveJumptableReset +.loop + ld hl, .Jumptable + call FieldMoveJumptable + jr nc, .loop + and $7f + ld [wFieldMoveSucceeded], a + ret + +.Jumptable: + dw .TryFly + dw .DoFly + dw .FailFly + +.TryFly: ; ca52 +; Fly + ld de, ENGINE_STORMBADGE + call CheckBadge + jr c, .nostormbadge + call GetMapPermission + call CheckOutdoorMap + jr z, .outdoors + jr .indoors + +.outdoors + xor a + ld [hMapAnims], a + call LoadStandardMenuDataHeader + call ClearSprites + callba _FlyMap + ld a, e + cp -1 + jr z, .illegal + cp NUM_SPAWNS + jr nc, .illegal + + ld [wd001], a + call CloseWindow + ld a, $1 + ret + +.nostormbadge + ld a, $82 + ret + +.indoors + ld a, $2 + ret + +.illegal + call CloseWindow + call WaitBGMap + ld a, $80 + ret + +.DoFly: ; ca94 + ld hl, .FlyScript + call QueueScript + ld a, $81 + ret + +.FailFly: ; ca9d + call FieldMoveFailed + ld a, $82 + ret + +.FlyScript: ; 0xcaa3 + reloadmappart + callasm HideSprites + special UpdateTimePals + callasm FlyFromAnim + farscall Script_AbortBugContest + special WarpToSpawnPoint + callasm DelayLoadingNewSprites + writecode VAR_MOVEMENT, PLAYER_NORMAL + newloadmap MAPSETUP_FLY + callasm FlyToAnim + special WaitSFX + callasm .ReturnFromFly + end + +.ReturnFromFly: ; cacb + callba Function561d + call DelayFrame + call ReplaceKrisSprite + callba LoadOverworldFont + ret + +WaterfallFunction: ; cade + call .TryWaterfall + and $7f + ld [wFieldMoveSucceeded], a + ret + +.TryWaterfall: ; cae7 +; Waterfall + ld de, ENGINE_RISINGBADGE + callba CheckBadge + ld a, $80 + ret c + call CheckMapCanWaterfall + jr c, .failed + ld hl, Script_WaterfallFromMenu + call QueueScript + ld a, $81 + ret + +.failed + call FieldMoveFailed + ld a, $80 + ret + +CheckMapCanWaterfall: ; cb07 + ld a, [PlayerDirection] + and $c + cp FACE_UP + jr nz, .failed + ld a, [TileUp] + call CheckWaterfallTile + jr nz, .failed + xor a + ret + +.failed + scf + ret + +Script_WaterfallFromMenu: ; 0xcb1c + reloadmappart + special UpdateTimePals + +Script_UsedWaterfall: ; 0xcb20 + callasm GetPartyNick + writetext .Text_UsedWaterfall + waitbutton + closetext + playsound SFX_BUBBLEBEAM +.loop + applymovement PLAYER, .WaterfallStep + callasm .CheckContinueWaterfall + iffalse .loop + end + +.CheckContinueWaterfall: ; cb38 + xor a + ld [ScriptVar], a + ld a, [PlayerStandingTile] + call CheckWaterfallTile + ret z + callba MobileFn_1060c1 + ld a, $1 + ld [ScriptVar], a + ret + +.WaterfallStep: ; cb4f + turn_waterfall_up + step_end + +.Text_UsedWaterfall: ; 0xcb51 + ; used WATERFALL! + text_jump UnknownText_0x1c068e + db "@" + +TryWaterfallOW:: ; cb56 + ld d, WATERFALL + call CheckPartyMove + jr c, .failed + ld de, ENGINE_RISINGBADGE + call CheckEngineFlag + jr c, .failed + call CheckMapCanWaterfall + jr c, .failed + ld a, BANK(Script_AskWaterfall) + ld hl, Script_AskWaterfall + call CallScript + scf + ret + +.failed + ld a, BANK(Script_CantDoWaterfall) + ld hl, Script_CantDoWaterfall + call CallScript + scf + ret + +Script_CantDoWaterfall: ; 0xcb7e + jumptext .Text_CantDoWaterfall + +.Text_CantDoWaterfall: ; 0xcb81 + ; Wow, it's a huge waterfall. + text_jump UnknownText_0x1c06a3 + db "@" + +Script_AskWaterfall: ; 0xcb86 + opentext + writetext .AskUseWaterfall + yesorno + iftrue Script_UsedWaterfall + closetext + end + +.AskUseWaterfall: ; 0xcb90 + ; Do you want to use WATERFALL? + text_jump UnknownText_0x1c06bf + db "@" + +EscapeRopeFunction: ; cb95 + call FieldMoveJumptableReset + ld a, $1 + jr dig_incave + +DigFunction: ; cb9c + call FieldMoveJumptableReset + ld a, $2 + +dig_incave + ld [Buffer2], a +.loop + ld hl, .DigTable + call FieldMoveJumptable + jr nc, .loop + and $7f + ld [wFieldMoveSucceeded], a + ret + +.DigTable: ; cbb2 + dw .CheckCanDig + dw .DoDig + dw .FailDig + +.CheckCanDig: ; cbb8 + call GetMapPermission + cp CAVE + jr z, .incave + cp DUNGEON + jr z, .incave +.fail + ld a, $2 + ret + +.incave + ld hl, wDigWarp + ld a, [hli] + and a + jr z, .fail + ld a, [hli] + and a + jr z, .fail + ld a, [hl] + and a + jr z, .fail + ld a, $1 + ret + +.DoDig: ; cbd8 + ld hl, wDigWarp + ld de, wNextWarp + ld bc, 3 + call CopyBytes + call GetPartyNick + ld a, [Buffer2] + cp $2 + jr nz, .escaperope + ld hl, .UsedDigScript + call QueueScript + ld a, $81 + ret + +.escaperope + callba SpecialKabutoChamber + ld hl, .UsedEscapeRopeScript + call QueueScript + ld a, $81 + ret + +.FailDig: ; cc06 + ld a, [Buffer2] + cp $2 + jr nz, .failescaperope + ld hl, .Text_CantUseHere + call MenuTextBox + call WaitPressAorB_BlinkCursor + call CloseWindow + +.failescaperope + ld a, $80 + ret + +.Text_UsedDig: ; 0xcc1c + ; used DIG! + text_jump UnknownText_0x1c06de + db "@" + +.Text_UsedEscapeRope: ; 0xcc21 + ; used an ESCAPE ROPE. + text_jump UnknownText_0x1c06ed + db "@" + +.Text_CantUseHere: ; 0xcc26 + ; Can't use that here. + text_jump UnknownText_0x1c0705 + db "@" + +.UsedEscapeRopeScript: ; 0xcc2b + reloadmappart + special UpdateTimePals + writetext .Text_UsedEscapeRope + jump .UsedDigOrEscapeRopeScript + +.UsedDigScript: ; 0xcc35 + reloadmappart + special UpdateTimePals + writetext .Text_UsedDig + +.UsedDigOrEscapeRopeScript: ; 0xcc3c + waitbutton + closetext + playsound SFX_WARP_TO + applymovement PLAYER, .DigOut + farscall Script_AbortBugContest + special WarpToSpawnPoint + writecode VAR_MOVEMENT, PLAYER_NORMAL + newloadmap MAPSETUP_DOOR + playsound SFX_WARP_FROM + applymovement PLAYER, .DigReturn + end + +.DigOut: ; 0xcc59 + step_dig 32 + hide_person + step_end + +.DigReturn: ; 0xcc5d + show_person + return_dig 32 + step_end + +TeleportFunction: ; cc61 + call FieldMoveJumptableReset +.loop + ld hl, .Jumptable + call FieldMoveJumptable + jr nc, .loop + and $7f + ld [wFieldMoveSucceeded], a + ret + +.Jumptable: ; cc72 + dw .TryTeleport + dw .DoTeleport + dw .FailTeleport + +.TryTeleport: ; cc78 + call GetMapPermission + call CheckOutdoorMap + jr z, .CheckIfSpawnPoint + jr .nope + +.CheckIfSpawnPoint: + ld a, [wLastSpawnMapGroup] + ld d, a + ld a, [wLastSpawnMapNumber] + ld e, a + callba IsSpawnPoint + jr nc, .nope + ld a, c + ld [wd001], a + ld a, $1 + ret + +.nope + ld a, $2 + ret + +.DoTeleport: ; cc9c + call GetPartyNick + ld hl, .TeleportScript + call QueueScript + ld a, $81 + ret + +.FailTeleport: ; cca8 + ld hl, .Text_CantUseHere + call MenuTextBoxBackup + ld a, $80 + ret + +.Text_ReturnToLastMonCenter: ; 0xccb1 + ; Return to the last #MON CENTER. + text_jump UnknownText_0x1c071a + db "@" + +.Text_CantUseHere: ; 0xccb6 + ; Can't use that here. + text_jump UnknownText_0x1c073b + db "@" + +.TeleportScript: ; 0xccbb + reloadmappart + special UpdateTimePals + writetext .Text_ReturnToLastMonCenter + pause 60 + reloadmappart + closetext + playsound SFX_WARP_TO + applymovement PLAYER, .TeleportFrom + farscall Script_AbortBugContest + special WarpToSpawnPoint + writecode VAR_MOVEMENT, PLAYER_NORMAL + newloadmap MAPSETUP_TELEPORT + playsound SFX_WARP_FROM + applymovement PLAYER, .TeleportTo + end + +.TeleportFrom: ; cce1 + teleport_from + step_end + +.TeleportTo: ; cce3 + teleport_to + step_end + +StrengthFunction: ; cce5 + call .TryStrength + and $7f + ld [wFieldMoveSucceeded], a + ret + +.TryStrength: ; ccee +; Strength + ld de, ENGINE_PLAINBADGE + call CheckBadge + jr c, .Failed + jr .UseStrength + +.AlreadyUsing: ; unreferenced + ld hl, .JumpText + call MenuTextBoxBackup + ld a, $80 + ret + +.JumpText: ; 0xcd01 + text_jump UnknownText_0x1c0751 + db "@" + +.Failed: ; cd06 + ld a, $80 + ret + +.UseStrength: ; cd09 + ld hl, Script_StrengthFromMenu + call QueueScript + ld a, $81 + ret + +SetStrengthFlag: ; cd12 + ld hl, BikeFlags + set 0, [hl] + ld a, [CurPartyMon] + ld e, a + ld d, 0 + ld hl, PartySpecies + add hl, de + ld a, [hl] + ld [Buffer6], a + call GetPartyNick + ret + +Script_StrengthFromMenu: ; 0xcd29 + reloadmappart + special UpdateTimePals + +Script_UsedStrength: ; 0xcd2d + callasm SetStrengthFlag + writetext .UsedStrength + copybytetovar Buffer6 + cry 0 + pause 3 + writetext .StrengthAllowedItToMoveBoulders + closetext + end + +.UsedStrength: ; 0xcd41 + text_jump UnknownText_0x1c0774 + db "@" + +.StrengthAllowedItToMoveBoulders: ; 0xcd46 + text_jump UnknownText_0x1c0788 + db "@" + +AskStrengthScript: + callasm TryStrengthOW + iffalse .AskStrength + if_equal $1, .DontMeetRequirements + jump .AlreadyUsedStrength + +.DontMeetRequirements: ; 0xcd59 + jumptext UnknownText_0xcd73 + +.AlreadyUsedStrength: ; 0xcd5c + jumptext UnknownText_0xcd6e + +.AskStrength: ; 0xcd5f + opentext + writetext UnknownText_0xcd69 + yesorno + iftrue Script_UsedStrength + closetext + end + +UnknownText_0xcd69: ; 0xcd69 + ; A #MON may be able to move this. Want to use STRENGTH? + text_jump UnknownText_0x1c07a0 + db "@" + +UnknownText_0xcd6e: ; 0xcd6e + ; Boulders may now be moved! + text_jump UnknownText_0x1c07d8 + db "@" + +UnknownText_0xcd73: ; 0xcd73 + ; A #MON may be able to move this. + text_jump UnknownText_0x1c07f4 + db "@" + +TryStrengthOW: ; cd78 + ld d, STRENGTH + call CheckPartyMove + jr c, .nope + + ld de, ENGINE_PLAINBADGE + call CheckEngineFlag + jr c, .nope + + ld hl, BikeFlags + bit 0, [hl] + jr z, .already_using + + ld a, 2 + jr .done + +.nope + ld a, 1 + jr .done + +.already_using + xor a + jr .done + +.done + ld [ScriptVar], a + ret + +WhirlpoolFunction: ; cd9d + call FieldMoveJumptableReset +.loop + ld hl, Jumptable_cdae + call FieldMoveJumptable + jr nc, .loop + and $7f + ld [wFieldMoveSucceeded], a + ret + +Jumptable_cdae: ; cdae + dw .TryWhirlpool + dw .DoWhirlpool + dw .FailWhirlpool + +.TryWhirlpool: ; cdb4 + ld de, ENGINE_GLACIERBADGE + call CheckBadge + jr c, .noglacierbadge + call TryWhirlpoolMenu + jr c, .failed + ld a, $1 + ret + +.failed + ld a, $2 + ret + +.noglacierbadge + ld a, $80 + ret + +.DoWhirlpool: ; cdca + ld hl, Script_WhirlpoolFromMenu + call QueueScript + ld a, $81 + ret + +.FailWhirlpool: ; cdd3 + call FieldMoveFailed + ld a, $80 + ret + +Text_UsedWhirlpool: ; 0xcdd9 + ; used WHIRLPOOL! + text_jump UnknownText_0x1c0816 + db "@" + +TryWhirlpoolMenu: ; cdde + call GetFacingTileCoord + ld c, a + push de + call CheckWhirlpoolTile + pop de + jr c, .failed + call GetBlockLocation + ld c, [hl] + push hl + ld hl, WhirlpoolBlockPointers + call CheckOverworldTileArrays + pop hl + jr nc, .failed + ld a, l + ld [Buffer3], a + ld a, h + ld [Buffer4], a + ld a, b + ld [Buffer5], a + ld a, c + ld [Buffer6], a + xor a + ret + +.failed + scf + ret + +Script_WhirlpoolFromMenu: ; 0xce0b + reloadmappart + special UpdateTimePals + +Script_UsedWhirlpool: ; 0xce0f + callasm GetPartyNick + writetext Text_UsedWhirlpool + reloadmappart + callasm DisappearWhirlpool + closetext + end + +DisappearWhirlpool: ; ce1d + ld hl, Buffer3 + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [Buffer5] + ld [hl], a + xor a + ld [hBGMapMode], a + call OverworldTextModeSwitch + ld a, [Buffer6] + ld e, a + callba PlayWhirlpoolSound + call BufferScreen + call GetMovementPermissions + ret + +TryWhirlpoolOW:: ; ce3e + ld d, WHIRLPOOL + call CheckPartyMove + jr c, .failed + ld de, ENGINE_GLACIERBADGE + call CheckEngineFlag + jr c, .failed + call TryWhirlpoolMenu + jr c, .failed + ld a, BANK(Script_AskWhirlpoolOW) + ld hl, Script_AskWhirlpoolOW + call CallScript + scf + ret + +.failed + ld a, BANK(Script_MightyWhirlpool) + ld hl, Script_MightyWhirlpool + call CallScript + scf + ret + +Script_MightyWhirlpool: ; 0xce66 + jumptext .MightyWhirlpoolText + +.MightyWhirlpoolText: ; 0xce69 + text_jump UnknownText_0x1c082b + db "@" + +Script_AskWhirlpoolOW: ; 0xce6e + opentext + writetext UnknownText_0xce78 + yesorno + iftrue Script_UsedWhirlpool + closetext + end + +UnknownText_0xce78: ; 0xce78 + text_jump UnknownText_0x1c0864 + db "@" + +HeadbuttFunction: ; ce7d + call TryHeadbuttFromMenu + and $7f + ld [wFieldMoveSucceeded], a + ret + +TryHeadbuttFromMenu: ; ce86 + call GetFacingTileCoord + call CheckHeadbuttTreeTile + jr nz, .no_tree + + ld hl, HeadbuttFromMenuScript + call QueueScript + ld a, $81 + ret + +.no_tree + call FieldMoveFailed + ld a, $80 + ret + +UnknownText_0xce9d: ; 0xce9d + ; did a HEADBUTT! + text_jump UnknownText_0x1c0897 + db "@" + +UnknownText_0xcea2: ; 0xcea2 + ; Nope. Nothing… + text_jump UnknownText_0x1c08ac + db "@" + +HeadbuttFromMenuScript: ; 0xcea7 + reloadmappart + special UpdateTimePals + +HeadbuttScript: ; 0xceab + callasm GetPartyNick + writetext UnknownText_0xce9d + + reloadmappart + callasm ShakeHeadbuttTree + + callasm TreeMonEncounter + iffalse .no_battle + closetext + randomwildmon + startbattle + reloadmapafterbattle + end + +.no_battle + writetext UnknownText_0xcea2 + waitbutton + closetext + end + +TryHeadbuttOW:: ; cec9 + ld d, HEADBUTT + call CheckPartyMove + jr c, .no + + ld a, BANK(AskHeadbuttScript) + ld hl, AskHeadbuttScript + call CallScript + scf + ret + +.no + xor a + ret + +AskHeadbuttScript: ; 0xcedc + opentext + writetext UnknownText_0xcee6 + yesorno + iftrue HeadbuttScript + closetext + end + +UnknownText_0xcee6: ; 0xcee6 + ; A #MON could be in this tree. Want to HEADBUTT it? + text_jump UnknownText_0x1c08bc + db "@" + +RockSmashFunction: ; ceeb + call TryRockSmashFromMenu + and $7f + ld [wFieldMoveSucceeded], a + ret + +TryRockSmashFromMenu: ; cef4 + call GetFacingObject + jr c, .no_rock + ld a, d + cp $18 + jr nz, .no_rock + + ld hl, RockSmashFromMenuScript + call QueueScript + ld a, $81 + ret + +.no_rock + call FieldMoveFailed + ld a, $80 + ret + +GetFacingObject: ; cf0d + callba CheckFacingObject + jr nc, .fail + + ld a, [hObjectStructIndexBuffer] + call GetObjectStruct + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, bc + ld a, [hl] + ld [hLastTalked], a + call GetMapObject + ld hl, MAPOBJECT_MOVEMENT + add hl, bc + ld a, [hl] + ld d, a + and a + ret + +.fail + scf + ret + +RockSmashFromMenuScript: ; 0xcf2e + reloadmappart + special UpdateTimePals + +RockSmashScript: ; cf32 + callasm GetPartyNick + writetext UnknownText_0xcf58 + closetext + special WaitSFX + playsound SFX_STRENGTH + earthquake 84 + applymovement2 MovementData_0xcf55 + disappear -2 + + callasm RockMonEncounter + copybytetovar TempWildMonSpecies + iffalse .done + randomwildmon + startbattle + reloadmapafterbattle +.done + end + +MovementData_0xcf55: ; 0xcf55 + rock_smash 10 + step_end + +UnknownText_0xcf58: ; 0xcf58 + text_jump UnknownText_0x1c08f0 + db "@" + +AskRockSmashScript: ; 0xcf5d + callasm HasRockSmash + if_equal 1, .no + + opentext + writetext UnknownText_0xcf77 + yesorno + iftrue RockSmashScript + closetext + end +.no + jumptext UnknownText_0xcf72 + +UnknownText_0xcf72: ; 0xcf72 + ; Maybe a #MON can break this. + text_jump UnknownText_0x1c0906 + db "@" + +UnknownText_0xcf77: ; 0xcf77 + ; This rock looks breakable. Want to use ROCK SMASH? + text_jump UnknownText_0x1c0924 + db "@" + +HasRockSmash: ; cf7c + ld d, ROCK_SMASH + call CheckPartyMove + jr nc, .yes +.no + ld a, 1 + jr .done +.yes + xor a + jr .done +.done + ld [ScriptVar], a + ret + +FishFunction: ; cf8e + ld a, e + push af + call FieldMoveJumptableReset + pop af + ld [Buffer2], a +.loop + ld hl, .FishTable + call FieldMoveJumptable + jr nc, .loop + and $7f + ld [wFieldMoveSucceeded], a + ret + +.FishTable: ; cfa5 + dw .TryFish + dw .FishNoBite + dw .FishGotSomething + dw .FailFish + dw .FishNoFish + +.TryFish: ; cfaf + ld a, [PlayerState] + cp PLAYER_SURF + jr z, .fail + cp PLAYER_SURF_PIKA + jr z, .fail + call GetFacingTileCoord + call GetTileCollision + cp $1 + jr z, .facingwater +.fail + ld a, $3 + ret + +.facingwater + call GetFishingGroup + and a + jr nz, .goodtofish + ld a, $4 + ret + +.goodtofish + ld d, a + ld a, [Buffer2] + ld e, a + callba Fish + ld a, d + and a + jr z, .nonibble + ld [TempWildMonSpecies], a + ld a, e + ld [CurPartyLevel], a + ld a, BATTLETYPE_FISH + ld [BattleType], a + ld a, $2 + ret + +.nonibble + ld a, $1 + ret + +.FailFish: ; cff1 + ld a, $80 + ret + +.FishGotSomething: ; cff4 + ld a, $1 + ld [Buffer6], a + ld hl, Script_GotABite + call QueueScript + ld a, $81 + ret + +.FishNoBite: ; d002 + ld a, $2 + ld [Buffer6], a + ld hl, Script_NotEvenANibble + call QueueScript + ld a, $81 + ret + +.FishNoFish: ; d010 + ld a, $0 + ld [Buffer6], a + ld hl, Script_NotEvenANibble2 + call QueueScript + ld a, $81 + ret + +Script_NotEvenANibble: ; 0xd01e + scall Script_FishCastRod + writetext UnknownText_0xd0a9 + jump Script_NotEvenANibble_FallThrough + +Script_NotEvenANibble2: ; 0xd027 + scall Script_FishCastRod + writetext UnknownText_0xd0a9 + +Script_NotEvenANibble_FallThrough: ; 0xd02d + loademote EMOTE_SHADOW + callasm PutTheRodAway + closetext + end + +Script_GotABite: ; 0xd035 + scall Script_FishCastRod + callasm Fishing_CheckFacingUp + iffalse .NotFacingUp + applymovement PLAYER, .Movement_FacingUp + jump .FightTheHookedPokemon + +.NotFacingUp: ; 0xd046 + applymovement PLAYER, .Movement_NotFacingUp + +.FightTheHookedPokemon: ; 0xd04a + pause 40 + applymovement PLAYER, .Movement_RestoreRod + writetext UnknownText_0xd0a4 + callasm PutTheRodAway + closetext + randomwildmon + startbattle + reloadmapafterbattle + end + +.Movement_NotFacingUp: ; d05c + fish_got_bite + fish_got_bite + fish_got_bite + fish_got_bite + show_emote + step_end + +.Movement_FacingUp: ; d062 + fish_got_bite + fish_got_bite + fish_got_bite + fish_got_bite + step_sleep_1 + show_emote + step_end + +.Movement_RestoreRod: ; d069 + hide_emote + fish_cast_rod + step_end + +Fishing_CheckFacingUp: ; d06c + ld a, [PlayerDirection] + and $c + cp OW_UP + ld a, $1 + jr z, .up + xor a + +.up + ld [ScriptVar], a + ret + +Script_FishCastRod: ; 0xd07c + reloadmappart + loadvar hBGMapMode, $0 + special UpdateTimePals + loademote EMOTE_ROD + callasm LoadFishingGFX + loademote EMOTE_SHOCK + applymovement PLAYER, MovementData_0xd093 + pause 40 + end + +MovementData_0xd093: ; d093 + fish_cast_rod + step_end + +PutTheRodAway: ; d095 + xor a + ld [hBGMapMode], a + ld a, $1 + ld [PlayerAction], a + call UpdateSprites + call ReplaceKrisSprite + ret + +UnknownText_0xd0a4: ; 0xd0a4 + ; Oh! A bite! + text_jump UnknownText_0x1c0958 + db "@" + +UnknownText_0xd0a9: ; 0xd0a9 + ; Not even a nibble! + text_jump UnknownText_0x1c0965 + db "@" + +UnknownText_0xd0ae: ; unused + ; Looks like there's nothing here. + text_jump UnknownText_0x1c0979 + db "@" + +BikeFunction: ; d0b3 + call .TryBike + and $7f + ld [wFieldMoveSucceeded], a + ret + +.TryBike: ; d0bc + call .CheckEnvironment + jr c, .CannotUseBike + ld a, [PlayerState] + cp PLAYER_NORMAL + jr z, .GetOnBike + cp PLAYER_BIKE + jr z, .GetOffBike + jr .CannotUseBike + +.GetOnBike: + ld hl, Script_GetOnBike + ld de, Script_GetOnBike_Register + call .CheckIfRegistered + call QueueScript + xor a + ld [MusicFade], a + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + call MaxVolume + ld de, MUSIC_BICYCLE + ld a, e + ld [wMapMusic], a + call PlayMusic + ld a, $1 + ret + +.GetOffBike: + ld hl, BikeFlags + bit 1, [hl] + jr nz, .CantGetOffBike + ld hl, Script_GetOffBike + ld de, Script_GetOffBike_Register + call .CheckIfRegistered + ld a, BANK(Script_GetOffBike) + jr .done + +.CantGetOffBike: + ld hl, Script_CantGetOffBike + jr .done + +.CannotUseBike: + ld a, $0 + ret + +.done + call QueueScript + ld a, $1 + ret + +.CheckIfRegistered: ; d119 + ld a, [wUsingItemWithSelect] + and a + ret z + ld h, d + ld l, e + ret + +.CheckEnvironment: ; d121 + call GetMapPermission + call CheckOutdoorMap + jr z, .ok + cp CAVE + jr z, .ok + cp GATE + jr z, .ok + jr .nope + +.ok + call GetPlayerStandingTile + and $f ; can't use our bike in a wall or on water + jr nz, .nope + xor a + ret + +.nope + scf + ret + +Script_GetOnBike: ; 0xd13e + reloadmappart + special UpdateTimePals + writecode VAR_MOVEMENT, PLAYER_BIKE + writetext GotOnTheBikeText + waitbutton + closetext + special ReplaceKrisSprite + end + +Script_GetOnBike_Register: ; 0xd14e + writecode VAR_MOVEMENT, PLAYER_BIKE + closetext + special ReplaceKrisSprite + end + +; XXX + nop + ret + +Script_GetOffBike: ; 0xd158 + reloadmappart + special UpdateTimePals + writecode VAR_MOVEMENT, PLAYER_NORMAL + writetext GotOffTheBikeText + waitbutton + +FinishGettingOffBike: + closetext + special ReplaceKrisSprite + special PlayMapMusic + end + +Script_GetOffBike_Register: ; 0xd16b + writecode VAR_MOVEMENT, PLAYER_NORMAL + jump FinishGettingOffBike + +Script_CantGetOffBike: ; 0xd171 + writetext .CantGetOffBikeText + waitbutton + closetext + end + +.CantGetOffBikeText: ; 0xd177 + ; You can't get off here! + text_jump UnknownText_0x1c099a + db "@" + +GotOnTheBikeText: ; 0xd17c + ; got on the @ . + text_jump UnknownText_0x1c09b2 + db "@" + +GotOffTheBikeText: ; 0xd181 + ; got off the @ . + text_jump UnknownText_0x1c09c7 + db "@" + +TryCutOW:: ; d186 + ld d, CUT + call CheckPartyMove + jr c, .cant_cut + + ld de, ENGINE_HIVEBADGE + call CheckEngineFlag + jr c, .cant_cut + + ld a, BANK(AskCutScript) + ld hl, AskCutScript + call CallScript + scf + ret + +.cant_cut + ld a, BANK(CantCutScript) + ld hl, CantCutScript + call CallScript + scf + ret + +AskCutScript: ; 0xd1a9 + opentext + writetext UnknownText_0xd1c8 + yesorno + iffalse .script_d1b8 + callasm .CheckMap + iftrue Script_Cut +.script_d1b8 + closetext + end + +.CheckMap: ; d1ba + xor a + ld [ScriptVar], a + call CheckMapForSomethingToCut + ret c + ld a, TRUE + ld [ScriptVar], a + ret + +UnknownText_0xd1c8: ; 0xd1c8 + text_jump UnknownText_0x1c09dd + db "@" + +CantCutScript: ; 0xd1cd + jumptext UnknownText_0xd1d0 + +UnknownText_0xd1d0: ; 0xd1d0 + text_jump UnknownText_0x1c0a05 + db "@" diff --git a/event/poisonstep.asm b/event/poisonstep.asm index c0f2e1b9c..1e81e188f 100755 --- a/event/poisonstep.asm +++ b/event/poisonstep.asm @@ -118,7 +118,7 @@ DoPoisonStep:: ; 505da end ; 50677 -.whiteout: ; 50677 +.whiteout ; 50677 farjump Script_OverworldWhiteout ; 5067b diff --git a/event/poke_seer.asm b/event/poke_seer.asm index 08d0924c9..2e942ef07 100644 --- a/event/poke_seer.asm +++ b/event/poke_seer.asm @@ -163,6 +163,7 @@ GetCaughtLevel: ; 4f18c call ByteFill ; caught level + ; Limited to between 1 and 63 for some reason. ld a, [wSeerCaughtData] and $3f jr z, .unknown @@ -247,7 +248,7 @@ GetCaughtLocation: ; 4f20a and a ret -.Unknown +.Unknown: ld de, wSeerCaughtLocation jp UnknownCaughtData diff --git a/event/special.asm b/event/special.asm new file mode 100755 index 000000000..c5ddabbcf --- /dev/null +++ b/event/special.asm @@ -0,0 +1,231 @@ +SpecialGiveShuckle: ; 7305 + +; Adding to the party. + xor a + ld [MonType], a + +; Level 15 Shuckle. + ld a, SHUCKLE + ld [CurPartySpecies], a + ld a, 15 + ld [CurPartyLevel], a + + predef TryAddMonToParty + jr nc, .NotGiven + +; Caught data. + ld b, 0 + callba SetGiftPartyMonCaughtData + +; Holding a Berry. + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [PartyCount] + dec a + push af + push bc + ld hl, PartyMon1Item + call AddNTimes + ld [hl], BERRY + pop bc + pop af + +; OT ID. + ld hl, PartyMon1ID + call AddNTimes + ld a, $2 + ld [hli], a + ld [hl], $6 + +; Nickname. + ld a, [PartyCount] + dec a + ld hl, PartyMonNicknames + call SkipNames + ld de, SpecialShuckleNick + call CopyName2 + +; OT. + ld a, [PartyCount] + dec a + ld hl, PartyMonOT + call SkipNames + ld de, SpecialShuckleOT + call CopyName2 + +; Engine flag for this event. + ld hl, DailyFlags + set 5, [hl] +; setflag ENGINE_SHUCKLE_GIVEN + ld a, 1 + ld [ScriptVar], a + ret + +.NotGiven: + xor a + ld [ScriptVar], a + ret + +SpecialShuckleOT: + db "MANIA@" +SpecialShuckleNick: + db "SHUCKIE@" + +SpecialReturnShuckle: ; 737e + callba SelectMonFromParty + jr c, .refused + + ld a, [CurPartySpecies] + cp SHUCKLE + jr nz, .DontReturn + + ld a, [CurPartyMon] + ld hl, PartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + +; OT ID + ld a, [hli] + cp 00518 / $100 + jr nz, .DontReturn + ld a, [hl] + cp 00518 % $100 + jr nz, .DontReturn + +; OT + ld a, [CurPartyMon] + ld hl, PartyMonOT + call SkipNames + ld de, SpecialShuckleOT +.CheckOT: + ld a, [de] + cp [hl] + jr nz, .DontReturn + cp "@" + jr z, .done + inc de + inc hl + jr .CheckOT + +.done + callba CheckCurPartyMonFainted + jr c, .fainted + ld a, [CurPartyMon] + ld hl, PartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + cp 150 + ld a, $3 + jr nc, .HappyToStayWithYou + xor a ; take from pc + ld [wPokemonWithdrawDepositParameter], a + callab RemoveMonFromPartyOrBox + ld a, $2 +.HappyToStayWithYou: + ld [ScriptVar], a + ret + +.refused + ld a, $1 + ld [ScriptVar], a + ret + +.DontReturn: + xor a + ld [ScriptVar], a + ret + +.fainted + ld a, $4 + ld [ScriptVar], a + ret + +Special_BillsGrandfather: ; 73f7 + callba SelectMonFromParty + jr c, .cancel + ld a, [CurPartySpecies] + ld [ScriptVar], a + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + jp CopyPokemonName_Buffer1_Buffer3 + +.cancel + xor a + ld [ScriptVar], a + ret + +Special_YoungerHaircutBrother: ; 7413 + ld hl, Data_YoungerHaircutBrother + jr MassageOrHaircut + +Special_OlderHaircutBrother: ; 7418 + ld hl, Data_OlderHaircutBrother + jr MassageOrHaircut + +Special_DaisyMassage: ; 741d + ld hl, Data_DaisyMassage + +MassageOrHaircut: ; 7420 + push hl + callba SelectMonFromParty + pop hl + jr c, .nope + ld a, [CurPartySpecies] + cp EGG + jr z, .egg + push hl + call GetCurNick + call CopyPokemonName_Buffer1_Buffer3 + pop hl + call Random +; Bug: Subtracting $ff from $ff fails to set c. +; This can result in overflow into the next data array. +; In the case of getting a massage from Daisy, we bleed +; into CopyPokemonName_Buffer1_Buffer3, which passes +; $d0 to ChangeHappiness and returns $73 to the script. +; The end result is that there is a 0.4% chance your +; Pokemon's happiness will not change at all. +.loop + sub [hl] + jr c, .ok +rept 3 + inc hl +endr + jr .loop + +.ok + inc hl + ld a, [hli] + ld [ScriptVar], a + ld c, [hl] + call ChangeHappiness + ret + +.nope + xor a + ld [ScriptVar], a + ret + +.egg + ld a, 1 + ld [ScriptVar], a + ret + +Data_YoungerHaircutBrother: ; 7459 + db $4c, 2, HAPPINESS_YOUNGCUT1 ; 30% chance + db $80, 3, HAPPINESS_YOUNGCUT2 ; 20% chance + db $ff, 4, HAPPINESS_YOUNGCUT3 ; 50% chance + +Data_OlderHaircutBrother: ; 7462 + db $9a, 2, HAPPINESS_OLDERCUT1 ; 60% chance + db $4c, 3, HAPPINESS_OLDERCUT2 ; 10% chance + db $ff, 4, HAPPINESS_OLDERCUT3 ; 30% chance + +Data_DaisyMassage: ; 746b + db $ff, 2, HAPPINESS_MASSAGE ; 99.6% chance + +CopyPokemonName_Buffer1_Buffer3: ; 746e + ld hl, StringBuffer1 + ld de, StringBuffer3 + ld bc, PKMN_NAME_LENGTH + jp CopyBytes |