pokecrystal/engine/events/daycare.asm

752 lines
14 KiB
NASM

; PrintDayCareText.TextTable indexes
const_def
const DAYCARETEXT_MAN_INTRO
const DAYCARETEXT_MAN_EGG
const DAYCARETEXT_LADY_INTRO
const DAYCARETEXT_LADY_EGG
const DAYCARETEXT_WHICH_ONE
const DAYCARETEXT_DEPOSIT
const DAYCARETEXT_CANT_BREED_EGG
const DAYCARETEXT_LAST_MON
const DAYCARETEXT_LAST_ALIVE_MON
const DAYCARETEXT_COME_BACK_LATER
const DAYCARETEXT_REMOVE_MAIL
const DAYCARETEXT_GENIUSES
const DAYCARETEXT_ASK_WITHDRAW
const DAYCARETEXT_WITHDRAW
const DAYCARETEXT_GOT_BACK
const DAYCARETEXT_TOO_SOON
const DAYCARETEXT_PARTY_FULL
const DAYCARETEXT_NOT_ENOUGH_MONEY
const DAYCARETEXT_OH_FINE
const DAYCARETEXT_COME_AGAIN
DayCareMan:
ld hl, wDayCareMan
bit DAYCAREMAN_HAS_MON_F, [hl]
jr nz, .AskWithdrawMon
ld hl, wDayCareMan
ld a, DAYCARETEXT_MAN_INTRO
call DayCareManIntroText
jr c, .cancel
call DayCareAskDepositPokemon
jr c, .print_text
farcall DepositMonWithDayCareMan
ld hl, wDayCareMan
set DAYCAREMAN_HAS_MON_F, [hl]
call DayCare_DepositPokemonText
call DayCare_InitBreeding
ret
.AskWithdrawMon:
farcall GetBreedMon1LevelGrowth
ld hl, wBreedMon1Nick
call GetPriceToRetrieveBreedmon
call DayCare_AskWithdrawBreedMon
jr c, .print_text
farcall RetrieveMonFromDayCareMan
call DayCare_GetBackMonForMoney
ld hl, wDayCareMan
res DAYCAREMAN_HAS_MON_F, [hl]
res DAYCAREMAN_MONS_COMPATIBLE_F, [hl]
jr .cancel
.print_text
call PrintDayCareText
.cancel
ld a, DAYCARETEXT_COME_AGAIN
call PrintDayCareText
ret
DayCareLady:
ld hl, wDayCareLady
bit DAYCARELADY_HAS_MON_F, [hl]
jr nz, .AskWithdrawMon
ld hl, wDayCareLady
ld a, DAYCARETEXT_LADY_INTRO
call DayCareLadyIntroText
jr c, .cancel
call DayCareAskDepositPokemon
jr c, .print_text
farcall DepositMonWithDayCareLady
ld hl, wDayCareLady
set DAYCARELADY_HAS_MON_F, [hl]
call DayCare_DepositPokemonText
call DayCare_InitBreeding
ret
.AskWithdrawMon:
farcall GetBreedMon2LevelGrowth
ld hl, wBreedMon2Nick
call GetPriceToRetrieveBreedmon
call DayCare_AskWithdrawBreedMon
jr c, .print_text
farcall RetrieveMonFromDayCareLady
call DayCare_GetBackMonForMoney
ld hl, wDayCareLady
res DAYCARELADY_HAS_MON_F, [hl]
ld hl, wDayCareMan
res DAYCAREMAN_MONS_COMPATIBLE_F, [hl]
jr .cancel
.print_text
call PrintDayCareText
.cancel
ld a, DAYCARETEXT_COME_AGAIN
call PrintDayCareText
ret
DayCareLadyIntroText:
bit DAYCARELADY_ACTIVE_F, [hl]
jr nz, .okay
set DAYCARELADY_ACTIVE_F, [hl]
inc a
.okay
call PrintDayCareText
call YesNoBox
ret
DayCareManIntroText:
set DAYCAREMAN_ACTIVE_F, [hl]
call PrintDayCareText
call YesNoBox
ret
DayCareAskDepositPokemon:
ld a, [wPartyCount]
cp 2
jr c, .OnlyOneMon
ld a, DAYCARETEXT_WHICH_ONE
call PrintDayCareText
ld b, PARTYMENUACTION_GIVE_MON
farcall SelectTradeOrDayCareMon
jr c, .Declined
ld a, [wCurPartySpecies]
cp EGG
jr z, .Egg
farcall CheckCurPartyMonFainted
jr c, .OutOfUsableMons
ld hl, wPartyMon1Item
ld bc, PARTYMON_STRUCT_LENGTH
ld a, [wCurPartyMon]
call AddNTimes
ld d, [hl]
farcall ItemIsMail
jr c, .HoldingMail
ld hl, wPartyMonNicknames
ld a, [wCurPartyMon]
call GetNick
and a
ret
.Declined:
ld a, DAYCARETEXT_OH_FINE
scf
ret
.Egg:
ld a, DAYCARETEXT_CANT_BREED_EGG
scf
ret
.OnlyOneMon:
ld a, DAYCARETEXT_LAST_MON
scf
ret
.OutOfUsableMons:
ld a, DAYCARETEXT_LAST_ALIVE_MON
scf
ret
.HoldingMail:
ld a, DAYCARETEXT_REMOVE_MAIL
scf
ret
.DummyText:
;
text_far UnknownText_0x1bdaa7
text_end
DayCare_DepositPokemonText:
ld a, DAYCARETEXT_DEPOSIT
call PrintDayCareText
ld a, [wCurPartySpecies]
call PlayMonCry
ld a, DAYCARETEXT_COME_BACK_LATER
call PrintDayCareText
ret
DayCare_AskWithdrawBreedMon:
ld a, [wStringBuffer2 + 1]
and a
jr nz, .grew_at_least_one_level
ld a, DAYCARETEXT_TOO_SOON
call PrintDayCareText
call YesNoBox
jr c, .refused
jr .check_money
.grew_at_least_one_level
ld a, DAYCARETEXT_GENIUSES
call PrintDayCareText
call YesNoBox
jr c, .refused
ld a, DAYCARETEXT_ASK_WITHDRAW
call PrintDayCareText
call YesNoBox
jr c, .refused
.check_money
ld de, wMoney
ld bc, wStringBuffer2 + 2
farcall CompareMoney
jr c, .not_enough_money
ld a, [wPartyCount]
cp PARTY_LENGTH
jr nc, .PartyFull
and a
ret
.refused
ld a, DAYCARETEXT_OH_FINE
scf
ret
.not_enough_money
ld a, DAYCARETEXT_NOT_ENOUGH_MONEY
scf
ret
.PartyFull:
ld a, DAYCARETEXT_PARTY_FULL
scf
ret
DayCare_GetBackMonForMoney:
ld bc, wStringBuffer2 + 2
ld de, wMoney
farcall TakeMoney
ld a, DAYCARETEXT_WITHDRAW
call PrintDayCareText
ld a, [wCurPartySpecies]
call PlayMonCry
ld a, DAYCARETEXT_GOT_BACK
call PrintDayCareText
ret
GetPriceToRetrieveBreedmon:
ld a, b
ld [wStringBuffer2], a
ld a, d
ld [wStringBuffer2 + 1], a
ld de, wStringBuffer1
ld bc, NAME_LENGTH
call CopyBytes
ld hl, 0
ld bc, 100
ld a, [wStringBuffer2 + 1]
call AddNTimes
ld de, 100
add hl, de
xor a
ld [wStringBuffer2 + 2], a
ld a, h
ld [wStringBuffer2 + 3], a
ld a, l
ld [wStringBuffer2 + 4], a
ret
PrintDayCareText:
ld e, a
ld d, 0
ld hl, .TextTable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
call PrintText
ret
.TextTable:
; entries correspond to DAYCARETEXT_* constants
dw .DayCareManIntro ; 00
dw .DayCareManOddEgg ; 01
dw .DayCareLadyIntro ; 02
dw .DayCareLadyOddEgg ; 03
dw .WhichOne ; 04
dw .OkayIllRaiseYourMon ; 05
dw .CantAcceptEgg ; 06
dw .JustOneMon ; 07
dw .LastHealthyMon ; 08
dw .ComeBackForItLater ; 09
dw .RemoveMail ; 0a
dw .AreWeGeniusesOrWhat ; 0b
dw .AskRetrieveMon ; 0c
dw .PerfectHeresYourMon ; 0d
dw .GotBackMon ; 0e
dw .ImmediatelyWithdrawMon ; 0f
dw .PartyFull ; 10
dw .NotEnoughMoney ; 11
dw .OhFineThen ; 12
dw .ComeAgain ; 13
.DayCareManIntro:
; I'm the DAY-CARE MAN. Want me to raise a #MON?
text_far UnknownText_0x1bdaa9
text_end
.DayCareManOddEgg:
; I'm the DAY-CARE MAN. Do you know about EGGS? I was raising #MON with my wife, you see. We were shocked to find an EGG! How incredible is that? So, want me to raise a #MON?
text_far UnknownText_0x1bdad8
text_end
.DayCareLadyIntro:
; I'm the DAY-CARE LADY. Should I raise a #MON for you?
text_far UnknownText_0x1bdb85
text_end
.DayCareLadyOddEgg:
; I'm the DAY-CARE LADY. Do you know about EGGS? My husband and I were raising some #MON, you see. We were shocked to find an EGG! How incredible could that be? Should I raise a #MON for you?
text_far UnknownText_0x1bdbbb
text_end
.WhichOne:
; What should I raise for you?
text_far UnknownText_0x1bdc79
text_end
.JustOneMon:
; Oh? But you have just one #MON.
text_far UnknownText_0x1bdc97
text_end
.CantAcceptEgg:
; Sorry, but I can't accept an EGG.
text_far UnknownText_0x1bdcb8
text_end
.RemoveMail:
; Remove MAIL before you come see me.
text_far UnknownText_0x1bdcda
text_end
.LastHealthyMon:
; If you give me that, what will you battle with?
text_far UnknownText_0x1bdcff
text_end
.OkayIllRaiseYourMon:
; OK. I'll raise your @ .
text_far UnknownText_0x1bdd30
text_end
.ComeBackForItLater:
; Come back for it later.
text_far UnknownText_0x1bdd4b
text_end
.AreWeGeniusesOrWhat:
; Are we geniuses or what? Want to see your @ ?
text_far UnknownText_0x1bdd64
text_end
.AskRetrieveMon:
; Your @ has grown a lot. By level, it's grown by @ . If you want your #MON back, it will cost ¥@ .
text_far UnknownText_0x1bdd96
text_end
.PerfectHeresYourMon:
; Perfect! Here's your #MON.
text_far UnknownText_0x1bde04
text_end
.GotBackMon:
; got back @ .
text_far UnknownText_0x1bde1f
text_end
.ImmediatelyWithdrawMon:
; Huh? Back already? Your @ needs a little more time with us. If you want your #MON back, it will cost ¥100.
text_far UnknownText_0x1bde32
text_end
.PartyFull:
; You have no room for it.
text_far UnknownText_0x1bdea2
text_end
.NotEnoughMoney:
; You don't have enough money.
text_far UnknownText_0x1bdebc
text_end
.OhFineThen:
; Oh, fine then.
text_far UnknownText_0x1bded9
text_end
.ComeAgain:
; Come again.
text_far UnknownText_0x1bdee9
text_end
DayCareManOutside:
ld hl, wDayCareMan
bit DAYCAREMAN_HAS_EGG_F, [hl]
jr nz, .AskGiveEgg
ld hl, .NotYet
call PrintText
ret
.NotYet:
; Not yet…
text_far UnknownText_0x1bdef6
text_end
.AskGiveEgg:
ld hl, .IntroText
call PrintText
call YesNoBox
jr c, .Declined
ld a, [wPartyCount]
cp PARTY_LENGTH
jr nc, .PartyFull
call DayCare_GiveEgg
ld hl, wDayCareMan
res DAYCAREMAN_HAS_EGG_F, [hl]
call DayCare_InitBreeding
ld hl, .GotEggText
call PrintText
ld de, SFX_GET_EGG_FROM_DAY_CARE_LADY
call PlaySFX
ld c, 120
call DelayFrames
ld hl, .TakeGoodCareOfItText
jr .Load0
.Declined:
ld hl, .IllKeepItThanksText
.Load0:
call PrintText
xor a ; FALSE
ld [wScriptVar], a
ret
.PartyFull:
ld hl, .PartyFullText
call PrintText
ld a, TRUE
ld [wScriptVar], a
ret
.IntroText:
; Ah, it's you! We were raising your #MON, and my goodness, were we surprised! Your #MON had an EGG! We don't know how it got there, but your #MON had it. You want it?
text_far UnknownText_0x1bdf00
text_end
.GotEggText:
; received the EGG!
text_far UnknownText_0x1bdfa5
text_end
.TakeGoodCareOfItText:
; Take good care of it.
text_far UnknownText_0x1bdfba
text_end
.IllKeepItThanksText:
; Well then, I'll keep it. Thanks!
text_far UnknownText_0x1bdfd1
text_end
.PartyFullText:
; You have no room in your party. Come back later.
text_far UnknownText_0x1bdff2
text_end
DayCare_GiveEgg:
ld a, [wEggMonLevel]
ld [wCurPartyLevel], a
ld hl, wPartyCount
ld a, [hl]
cp PARTY_LENGTH
jr nc, .PartyFull
inc a
ld [hl], a
ld c, a
ld b, 0
add hl, bc
ld a, EGG
ld [hli], a
ld a, [wEggMonSpecies]
ld [wCurSpecies], a
ld [wCurPartySpecies], a
ld a, -1
ld [hl], a
ld hl, wPartyMonNicknames
ld bc, MON_NAME_LENGTH
call DayCare_GetCurrentPartyMember
ld hl, wEggNick
call CopyBytes
ld hl, wPartyMonOT
ld bc, NAME_LENGTH
call DayCare_GetCurrentPartyMember
ld hl, wEggOT
call CopyBytes
ld hl, wPartyMon1
ld bc, PARTYMON_STRUCT_LENGTH
call DayCare_GetCurrentPartyMember
ld hl, wEggMon
ld bc, wEggMonEnd - wEggMon
call CopyBytes
call GetBaseData
ld a, [wPartyCount]
dec a
ld hl, wPartyMon1
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
ld b, h
ld c, l
ld hl, MON_ID + 1
add hl, bc
push hl
ld hl, MON_MAXHP
add hl, bc
ld d, h
ld e, l
pop hl
push bc
ld b, FALSE
predef CalcMonStats
pop bc
ld hl, MON_HP
add hl, bc
xor a
ld [hli], a
ld [hl], a
and a
ret
.PartyFull:
scf
ret
DayCare_GetCurrentPartyMember:
ld a, [wPartyCount]
dec a
call AddNTimes
ld d, h
ld e, l
ret
DayCare_InitBreeding:
ld a, [wDayCareLady]
bit DAYCARELADY_HAS_MON_F, a
ret z
ld a, [wDayCareMan]
bit DAYCAREMAN_HAS_MON_F, a
ret z
callfar CheckBreedmonCompatibility
ld a, [wBreedingCompatibility]
and a
ret z
inc a
ret z
ld hl, wDayCareMan
set DAYCAREMAN_MONS_COMPATIBLE_F, [hl]
.loop
call Random
cp 150
jr c, .loop
ld [wStepsToEgg], a
jp .UselessJump
.UselessJump:
xor a
ld hl, wEggMon
ld bc, wEggMonEnd - wEggMon
call ByteFill
ld hl, wEggNick
ld bc, MON_NAME_LENGTH
call ByteFill
ld hl, wEggOT
ld bc, NAME_LENGTH
call ByteFill
ld a, [wBreedMon1DVs]
ld [wTempMonDVs], a
ld a, [wBreedMon1DVs + 1]
ld [wTempMonDVs + 1], a
ld a, [wBreedMon1Species]
ld [wCurPartySpecies], a
ld a, $3
ld [wMonType], a
ld a, [wBreedMon1Species]
cp DITTO
ld a, $1
jr z, .LoadWhichBreedmonIsTheMother
ld a, [wBreedMon2Species]
cp DITTO
ld a, $0
jr z, .LoadWhichBreedmonIsTheMother
farcall GetGender
ld a, $0
jr z, .LoadWhichBreedmonIsTheMother
inc a
.LoadWhichBreedmonIsTheMother:
ld [wBreedMotherOrNonDitto], a
and a
ld a, [wBreedMon1Species]
jr z, .GotMother
ld a, [wBreedMon2Species]
.GotMother:
ld [wCurPartySpecies], a
callfar GetPreEvolution
callfar GetPreEvolution
ld a, EGG_LEVEL
ld [wCurPartyLevel], a
; Nidoran♀ can give birth to either gender of Nidoran
ld a, [wCurPartySpecies]
cp NIDORAN_F
jr nz, .GotEggSpecies
call Random
cp 50 percent + 1
ld a, NIDORAN_F
jr c, .GotEggSpecies
ld a, NIDORAN_M
.GotEggSpecies:
ld [wCurPartySpecies], a
ld [wCurSpecies], a
ld [wEggMonSpecies], a
call GetBaseData
ld hl, wEggNick
ld de, .String_EGG
call CopyName2
ld hl, wPlayerName
ld de, wEggOT
ld bc, NAME_LENGTH
call CopyBytes
xor a
ld [wEggMonItem], a
ld de, wEggMonMoves
xor a
ld [wBuffer1], a
predef FillMoves
farcall InitEggMoves
ld hl, wEggMonID
ld a, [wPlayerID]
ld [hli], a
ld a, [wPlayerID + 1]
ld [hl], a
ld a, [wCurPartyLevel]
ld d, a
callfar CalcExpAtLevel
ld hl, wEggMonExp
ldh a, [hMultiplicand]
ld [hli], a
ldh a, [hMultiplicand + 1]
ld [hli], a
ldh a, [hMultiplicand + 2]
ld [hl], a
xor a
ld b, wEggMonDVs - wEggMonStatExp
ld hl, wEggMonStatExp
.loop2
ld [hli], a
dec b
jr nz, .loop2
ld hl, wEggMonDVs
call Random
ld [hli], a
ld [wTempMonDVs], a
call Random
ld [hld], a
ld [wTempMonDVs + 1], a
ld de, wBreedMon1DVs
ld a, [wBreedMon1Species]
cp DITTO
jr z, .GotDVs
ld de, wBreedMon2DVs
ld a, [wBreedMon2Species]
cp DITTO
jr z, .GotDVs
ld a, TEMPMON
ld [wMonType], a
push hl
farcall GetGender
pop hl
ld de, wBreedMon1DVs
ld bc, wBreedMon2DVs
jr c, .SkipDVs
jr z, .ParentCheck2
ld a, [wBreedMotherOrNonDitto]
and a
jr z, .GotDVs
ld d, b
ld e, c
jr .GotDVs
.ParentCheck2:
ld a, [wBreedMotherOrNonDitto]
and a
jr nz, .GotDVs
ld d, b
ld e, c
.GotDVs:
ld a, [de]
inc de
and $f
ld b, a
ld a, [hl]
and $f0
add b
ld [hli], a
ld a, [de]
and $7
ld b, a
ld a, [hl]
and $f8
add b
ld [hl], a
.SkipDVs:
ld hl, wStringBuffer1
ld de, wMonOrItemNameBuffer
ld bc, NAME_LENGTH
call CopyBytes
ld hl, wEggMonMoves
ld de, wEggMonPP
predef FillPP
ld hl, wMonOrItemNameBuffer
ld de, wStringBuffer1
ld bc, NAME_LENGTH
call CopyBytes
ld a, [wBaseEggSteps]
ld hl, wEggMonHappiness
ld [hli], a
xor a
ld [hli], a
ld [hli], a
ld [hl], a
ld a, [wCurPartyLevel]
ld [wEggMonLevel], a
ret
.String_EGG:
db "EGG@"