ref: 08891da82254aa4051bf594d4abc2db8e4043d8f
dir: /engine/move_mon.asm/
TryAddMonToParty: ; d88c ; Check if to copy wild Pkmn or generate new Pkmn ; Whose is it? ld de, PartyCount ld a, [MonType] and $f jr z, .getpartylocation ; PARTYMON ld de, OTPartyCount .getpartylocation ; Do we have room for it? ld a, [de] inc a cp PARTY_LENGTH + 1 ret nc ; Increase the party count ld [de], a ld a, [de] ; Why are we doing this? ld [hMoveMon], a ; HRAM backup add e ld e, a jr nc, .loadspecies inc d .loadspecies ; Load the species of the Pokemon into the party list. ; The terminator is usually here, but it'll be back. ld a, [CurPartySpecies] ld [de], a ; Load the terminator into the next slot. inc de ld a, -1 ld [de], a ; Now let's load the OT name. ld hl, PartyMonOT ld a, [MonType] and $f jr z, .loadOTname ld hl, OTPartyMonOT .loadOTname ld a, [hMoveMon] ; Restore index from backup dec a call SkipNames ld d, h ld e, l ld hl, PlayerName ld bc, NAME_LENGTH call CopyBytes ld a, [MonType] and a jr nz, .skipnickname ld a, [CurPartySpecies] ld [wd265], a call GetPokemonName ld hl, PartyMonNicknames ld a, [hMoveMon] dec a call SkipNames ld d, h ld e, l ld hl, StringBuffer1 ld bc, MON_NAME_LENGTH call CopyBytes .skipnickname ld hl, PartyMon1Species ld a, [MonType] and $f jr z, .initializeStats ld hl, OTPartyMon1Species .initializeStats ld a, [hMoveMon] dec a ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes GeneratePartyMonStats: ; d906 ld e, l ld d, h push hl ld a, [CurPartySpecies] ld [CurSpecies], a call GetBaseData ld a, [BaseDexNo] ld [de], a inc de ld a, [wBattleMode] and a ld a, $0 jr z, .skipitem ld a, [EnemyMonItem] .skipitem ld [de], a inc de push de ld h, d ld l, e ld a, [wBattleMode] and a jr z, .randomlygeneratemoves ld a, [MonType] and a jr nz, .randomlygeneratemoves ld de, EnemyMonMoves rept NUM_MOVES + -1 ld a, [de] inc de ld [hli], a endr ld a, [de] ld [hl], a jr .next .randomlygeneratemoves xor a rept NUM_MOVES + -1 ld [hli], a endr ld [hl], a ld [Buffer1], a predef FillMoves .next pop de rept 4 inc de endr ld a, [PlayerID] ld [de], a inc de ld a, [PlayerID + 1] ld [de], a inc de push de ld a, [CurPartyLevel] ld d, a callfar CalcExpAtLevel pop de ld a, [hProduct + 1] ld [de], a inc de ld a, [hProduct + 2] ld [de], a inc de ld a, [hProduct + 3] ld [de], a inc de xor a ld b, $a .loop ld [de], a inc de dec b jr nz, .loop pop hl push hl ld a, [MonType] and $f jr z, .generateDVs push hl farcall GetTrainerDVs pop hl jr .initializetrainermonstats .generateDVs ld a, [CurPartySpecies] ld [wd265], a dec a push de call CheckCaughtMon ld a, [wd265] dec a call SetSeenAndCaughtMon pop de pop hl push hl ld a, [wBattleMode] and a jr nz, .copywildmonstats call Random ld b, a call Random ld c, a .initializetrainermonstats ld a, b ld [de], a inc de ld a, c ld [de], a inc de push hl push de inc hl inc hl call FillPP pop de pop hl rept 4 inc de endr ld a, 70 ld [de], a inc de xor a ld [de], a inc de ld [de], a inc de ld [de], a inc de ld a, [CurPartyLevel] ld [de], a inc de xor a ld [de], a inc de ld [de], a inc de ld bc, 10 add hl, bc ld a, $1 ld c, a ld b, FALSE call CalcPkmnStatC ld a, [hProduct + 2] ld [de], a inc de ld a, [hProduct + 3] ld [de], a inc de jr .next2 .copywildmonstats ld a, [EnemyMonDVs] ld [de], a inc de ld a, [EnemyMonDVs + 1] ld [de], a inc de push hl ld hl, EnemyMonPP ld b, NUM_MOVES .wildmonpploop ld a, [hli] ld [de], a inc de dec b jr nz, .wildmonpploop pop hl ld a, BASE_HAPPINESS ld [de], a inc de xor a ld [de], a inc de ld [de], a inc de ld [de], a inc de ld a, [CurPartyLevel] ld [de], a inc de ld hl, EnemyMonStatus ; Copy EnemyMonStatus ld a, [hli] ld [de], a inc de ; Copy EnemyMonUnused ld a, [hli] ld [de], a inc de ; Copy EnemyMonHP ld a, [hli] ld [de], a inc de ld a, [hl] ld [de], a inc de .next2 ld a, [wBattleMode] dec a jr nz, .generatestats ld hl, EnemyMonMaxHP ld bc, 2 * 6 ; MaxHP + 5 Stats call CopyBytes pop hl jr .next3 .generatestats pop hl ld bc, MON_STAT_EXP - 1 add hl, bc ld b, $0 ; if b = 1, then stat calculation takes stat exp into account. call CalcPkmnStats .next3 ld a, [MonType] and $f jr nz, .done ld a, [CurPartySpecies] cp UNOWN jr nz, .done ld hl, PartyMon1DVs ld a, [PartyCount] dec a ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes predef GetUnownLetter callfar UpdateUnownDex .done scf ; When this function returns, the carry flag indicates success vs failure. ret ; da6d FillPP: ; da6d push bc ld b, NUM_MOVES .loop ld a, [hli] and a jr z, .next dec a push hl push de push bc ld hl, Moves ld bc, MOVE_LENGTH call AddNTimes ld de, StringBuffer1 ld a, BANK(Moves) call FarCopyBytes pop bc pop de pop hl ld a, [StringBuffer1 + MOVE_PP] .next ld [de], a inc de dec b jr nz, .loop pop bc ret ; da96 AddTempmonToParty: ; da96 ld hl, PartyCount ld a, [hl] cp PARTY_LENGTH scf ret z inc a ld [hl], a ld c, a ld b, 0 add hl, bc ld a, [CurPartySpecies] ld [hli], a ld [hl], $ff ld hl, PartyMon1Species ld a, [PartyCount] dec a ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld e, l ld d, h ld hl, TempMonSpecies call CopyBytes ld hl, PartyMonOT ld a, [PartyCount] dec a call SkipNames ld d, h ld e, l ld hl, OTPartyMonOT ld a, [CurPartyMon] call SkipNames ld bc, NAME_LENGTH call CopyBytes ld hl, PartyMonNicknames ld a, [PartyCount] dec a call SkipNames ld d, h ld e, l ld hl, OTPartyMonNicknames ld a, [CurPartyMon] call SkipNames ld bc, MON_NAME_LENGTH call CopyBytes ld a, [CurPartySpecies] ld [wNamedObjectIndexBuffer], a cp EGG jr z, .egg dec a call SetSeenAndCaughtMon ld hl, PartyMon1Happiness ld a, [PartyCount] dec a ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld [hl], BASE_HAPPINESS .egg ld a, [CurPartySpecies] cp UNOWN jr nz, .done ld hl, PartyMon1DVs ld a, [PartyCount] dec a ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes predef GetUnownLetter callfar UpdateUnownDex ld a, [wFirstUnownSeen] and a jr nz, .done ld a, [UnownLetter] ld [wFirstUnownSeen], a .done and a ret SendGetPkmnIntoFromBox: ; db3f ; Sents/Gets Pkmn into/from Box depending on Parameter ; wPokemonWithdrawDepositParameter == 0: get Pkmn into Party ; wPokemonWithdrawDepositParameter == 1: sent Pkmn into Box ; wPokemonWithdrawDepositParameter == 2: get Pkmn from DayCare ; wPokemonWithdrawDepositParameter == 3: put Pkmn into DayCare ld a, BANK(sBoxCount) call GetSRAMBank ld a, [wPokemonWithdrawDepositParameter] and a jr z, .check_IfPartyIsFull cp DAY_CARE_WITHDRAW jr z, .check_IfPartyIsFull cp DAY_CARE_DEPOSIT ld hl, wBreedMon1Species jr z, .breedmon ; we want to sent a Pkmn into the Box ; so check if there's enough space ld hl, sBoxCount ld a, [hl] cp MONS_PER_BOX jr nz, .there_is_room jp CloseSRAM_And_SetCarryFlag .check_IfPartyIsFull ld hl, PartyCount ld a, [hl] cp PARTY_LENGTH jp z, CloseSRAM_And_SetCarryFlag .there_is_room inc a ld [hl], a ld c, a ld b, 0 add hl, bc ld a, [wPokemonWithdrawDepositParameter] cp DAY_CARE_WITHDRAW ld a, [wBreedMon1Species] jr z, .okay1 ld a, [CurPartySpecies] .okay1 ld [hli], a ld [hl], $ff ld a, [wPokemonWithdrawDepositParameter] dec a ld hl, PartyMon1Species ld bc, PARTYMON_STRUCT_LENGTH ld a, [PartyCount] jr nz, .okay2 ld hl, sBoxMon1Species ld bc, BOXMON_STRUCT_LENGTH ld a, [sBoxCount] .okay2 dec a ; PartyCount - 1 call AddNTimes .breedmon push hl ld e, l ld d, h ld a, [wPokemonWithdrawDepositParameter] and a ld hl, sBoxMon1Species ld bc, BOXMON_STRUCT_LENGTH jr z, .okay3 cp DAY_CARE_WITHDRAW ld hl, wBreedMon1Species jr z, .okay4 ld hl, PartyMon1Species ld bc, PARTYMON_STRUCT_LENGTH .okay3 ld a, [CurPartyMon] call AddNTimes .okay4 ld bc, BOXMON_STRUCT_LENGTH call CopyBytes ld a, [wPokemonWithdrawDepositParameter] cp DAY_CARE_DEPOSIT ld de, wBreedMon1OT jr z, .okay5 dec a ld hl, PartyMonOT ld a, [PartyCount] jr nz, .okay6 ld hl, sBoxMonOT ld a, [sBoxCount] .okay6 dec a call SkipNames ld d, h ld e, l .okay5 ld hl, sBoxMonOT ld a, [wPokemonWithdrawDepositParameter] and a jr z, .okay7 ld hl, wBreedMon1OT cp DAY_CARE_WITHDRAW jr z, .okay8 ld hl, PartyMonOT .okay7 ld a, [CurPartyMon] call SkipNames .okay8 ld bc, NAME_LENGTH call CopyBytes ld a, [wPokemonWithdrawDepositParameter] cp DAY_CARE_DEPOSIT ld de, wBreedMon1Nick jr z, .okay9 dec a ld hl, PartyMonNicknames ld a, [PartyCount] jr nz, .okay10 ld hl, sBoxMonNicknames ld a, [sBoxCount] .okay10 dec a call SkipNames ld d, h ld e, l .okay9 ld hl, sBoxMonNicknames ld a, [wPokemonWithdrawDepositParameter] and a jr z, .okay11 ld hl, wBreedMon1Nick cp DAY_CARE_WITHDRAW jr z, .okay12 ld hl, PartyMonNicknames .okay11 ld a, [CurPartyMon] call SkipNames .okay12 ld bc, MON_NAME_LENGTH call CopyBytes pop hl ld a, [wPokemonWithdrawDepositParameter] cp PC_DEPOSIT jr z, .took_out_of_box cp DAY_CARE_DEPOSIT jp z, .CloseSRAM_And_ClearCarryFlag push hl srl a add $2 ld [MonType], a predef CopyPkmnToTempMon callfar CalcLevel ld a, d ld [CurPartyLevel], a pop hl ld b, h ld c, l ld hl, MON_LEVEL add hl, bc ld [hl], a ld hl, MON_MAXHP add hl, bc ld d, h ld e, l ld hl, MON_STAT_EXP - 1 add hl, bc push bc ld b, $1 call CalcPkmnStats pop bc ld a, [wPokemonWithdrawDepositParameter] and a jr nz, .CloseSRAM_And_ClearCarryFlag ld hl, MON_STATUS add hl, bc xor a ld [hl], a ld hl, MON_HP add hl, bc ld d, h ld e, l ld a, [CurPartySpecies] cp EGG jr z, .egg inc hl inc hl ld a, [hli] ld [de], a ld a, [hl] inc de ld [de], a jr .CloseSRAM_And_ClearCarryFlag .egg xor a ld [de], a inc de ld [de], a jr .CloseSRAM_And_ClearCarryFlag .took_out_of_box ld a, [sBoxCount] dec a ld b, a call RestorePPofDepositedPokemon .CloseSRAM_And_ClearCarryFlag: call CloseSRAM and a ret ; dcb1 CloseSRAM_And_SetCarryFlag: ; dcb1 call CloseSRAM scf ret ; dcb6 RestorePPofDepositedPokemon: ; dcb6 ld a, b ld hl, sBoxMons ld bc, BOXMON_STRUCT_LENGTH call AddNTimes ld b, h ld c, l ld hl, MON_PP add hl, bc push hl push bc ld de, TempMonPP ld bc, NUM_MOVES call CopyBytes pop bc ld hl, MON_MOVES add hl, bc push hl ld de, TempMonMoves ld bc, NUM_MOVES call CopyBytes pop hl pop de ld a, [wMenuCursorY] push af ld a, [MonType] push af ld b, 0 .loop ld a, [hli] and a jr z, .done ld [TempMonMoves], a ld a, BOXMON ld [MonType], a ld a, b ld [wMenuCursorY], a push bc push hl push de farcall GetMaxPPOfMove pop de pop hl ld a, [wd265] ld b, a ld a, [de] and %11000000 add b ld [de], a pop bc inc de inc b ld a, b cp NUM_MOVES jr c, .loop .done pop af ld [MonType], a pop af ld [wMenuCursorY], a ret ; dd21 RetrievePokemonFromDayCareMan: ; dd21 ld a, [wBreedMon1Species] ld [CurPartySpecies], a ld de, SFX_TRANSACTION call PlaySFX call WaitSFX call GetBreedMon1LevelGrowth ld a, b ld [wd002], a ld a, e ld [CurPartyLevel], a xor a ld [wPokemonWithdrawDepositParameter], a jp Functiondd64 ; dd42 RetrievePokemonFromDayCareLady: ; dd42 ld a, [wBreedMon2Species] ld [CurPartySpecies], a ld de, SFX_TRANSACTION call PlaySFX call WaitSFX call GetBreedMon2LevelGrowth ld a, b ld [wd002], a ld a, e ld [CurPartyLevel], a ld a, PC_DEPOSIT ld [wPokemonWithdrawDepositParameter], a jp Functiondd64 ; dd64 Functiondd64: ; dd64 ld hl, PartyCount ld a, [hl] cp PARTY_LENGTH jr nz, .room_in_party scf ret .room_in_party inc a ld [hl], a ld c, a ld b, 0 add hl, bc ld a, [wPokemonWithdrawDepositParameter] and a ld a, [wBreedMon1Species] ld de, wBreedMon1Nick jr z, .okay ld a, [wBreedMon2Species] ld de, wBreedMon2Nick .okay ld [hli], a ld [CurSpecies], a ld a, $ff ld [hl], a ld hl, PartyMonNicknames ld a, [PartyCount] dec a call SkipNames push hl ld h, d ld l, e pop de call CopyBytes push hl ld hl, PartyMonOT ld a, [PartyCount] dec a call SkipNames ld d, h ld e, l pop hl call CopyBytes push hl call Functionde1a pop hl ld bc, BOXMON_STRUCT_LENGTH call CopyBytes call GetBaseData call Functionde1a ld b, d ld c, e ld hl, MON_LEVEL add hl, bc ld a, [CurPartyLevel] ld [hl], a ld hl, MON_MAXHP add hl, bc ld d, h ld e, l ld hl, $a add hl, bc push bc ld b, $1 call CalcPkmnStats ld hl, PartyMon1Moves ld a, [PartyCount] dec a ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld d, h ld e, l ld a, $1 ld [Buffer1], a predef FillMoves ld a, [PartyCount] dec a ld [CurPartyMon], a farcall HealPartyMon ld a, [CurPartyLevel] ld d, a callfar CalcExpAtLevel pop bc ld hl, $8 add hl, bc ld a, [hMultiplicand] ld [hli], a ld a, [hMultiplicand + 1] ld [hli], a ld a, [hMultiplicand + 2] ld [hl], a and a ret ; de1a Functionde1a: ; de1a ld a, [PartyCount] dec a ld hl, PartyMon1Species ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld d, h ld e, l ret ; de2a DepositMonWithDayCareMan: ; de2a ld de, wBreedMon1Nick call DepositBreedmon xor a ld [wPokemonWithdrawDepositParameter], a jp RemoveMonFromPartyOrBox ; de37 DepositMonWithDayCareLady: ; de37 ld de, wBreedMon2Nick call DepositBreedmon xor a ld [wPokemonWithdrawDepositParameter], a jp RemoveMonFromPartyOrBox ; de44 DepositBreedmon: ; de44 ld a, [CurPartyMon] ld hl, PartyMonNicknames call SkipNames call CopyBytes ld a, [CurPartyMon] ld hl, PartyMonOT call SkipNames call CopyBytes ld a, [CurPartyMon] ld hl, PartyMon1Species ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld bc, BOXMON_STRUCT_LENGTH jp CopyBytes SendPkmnIntoBox: ; de6e ; Sends the Pkmn into one of Bills Boxes ; the data comes mainly from 'EnemyMon:' ld a, BANK(sBoxCount) call GetSRAMBank ld de, sBoxCount ld a, [de] cp MONS_PER_BOX jp nc, .full inc a ld [de], a ld a, [CurPartySpecies] ld [CurSpecies], a ld c, a .loop inc de ld a, [de] ld b, a ld a, c ld c, b ld [de], a inc a jr nz, .loop call GetBaseData call ShiftBoxMon ld hl, PlayerName ld de, sBoxMonOT ld bc, NAME_LENGTH call CopyBytes ld a, [CurPartySpecies] ld [wd265], a call GetPokemonName ld de, sBoxMonNicknames ld hl, StringBuffer1 ld bc, MON_NAME_LENGTH call CopyBytes ld hl, EnemyMon ld de, sBoxMon1 ld bc, 1 + 1 + NUM_MOVES ; species + item + moves call CopyBytes ld hl, PlayerID ld a, [hli] ld [de], a inc de ld a, [hl] ld [de], a inc de push de ld a, [CurPartyLevel] ld d, a callfar CalcExpAtLevel pop de ld a, [hProduct + 1] ld [de], a inc de ld a, [hProduct + 2] ld [de], a inc de ld a, [hProduct + 3] ld [de], a inc de ; Set all 5 Experience Values to 0 xor a ld b, 2 * 5 .loop2 ld [de], a inc de dec b jr nz, .loop2 ld hl, EnemyMonDVs ld b, 2 + NUM_MOVES ; DVs and PP ; EnemyMonHappiness - EnemyMonDVs .loop3 ld a, [hli] ld [de], a inc de dec b jr nz, .loop3 ld a, BASE_HAPPINESS ld [de], a inc de xor a ld [de], a inc de ld [de], a inc de ld [de], a inc de ld a, [CurPartyLevel] ld [de], a ld a, [CurPartySpecies] dec a call SetSeenAndCaughtMon ld a, [CurPartySpecies] cp UNOWN jr nz, .not_unown ld hl, sBoxMon1DVs predef GetUnownLetter callfar UpdateUnownDex .not_unown ld hl, sBoxMon1Moves ld de, TempMonMoves ld bc, NUM_MOVES call CopyBytes ld hl, sBoxMon1PP ld de, TempMonPP ld bc, NUM_MOVES call CopyBytes ld b, 0 call RestorePPofDepositedPokemon call CloseSRAM scf ret ; df42 .full ; df42 call CloseSRAM and a ret ; df47 ShiftBoxMon: ; df47 ld hl, sBoxMonOT ld bc, NAME_LENGTH call .shift ld hl, sBoxMonNicknames ld bc, MON_NAME_LENGTH call .shift ld hl, sBoxMons ld bc, BOXMON_STRUCT_LENGTH .shift ld a, [sBoxCount] cp 2 ret c push hl call AddNTimes dec hl ld e, l ld d, h pop hl ld a, [sBoxCount] dec a call AddNTimes dec hl push hl ld a, [sBoxCount] dec a ld hl, 0 call AddNTimes ld c, l ld b, h pop hl .loop ld a, [hld] ld [de], a dec de dec bc ld a, c or b jr nz, .loop ret ; df8c GiveEgg:: ; df8c ld a, [CurPartySpecies] push af callfar GetPreEvolution callfar GetPreEvolution ld a, [CurPartySpecies] dec a ; TryAddMonToParty sets Seen and Caught flags ; when it is successful. This routine will make ; sure that we aren't newly setting flags. push af call CheckCaughtMon pop af push bc call CheckSeenMon push bc call TryAddMonToParty ; If we haven't caught this Pokemon before receiving ; the Egg, reset the flag that was just set by ; TryAddMonToParty. pop bc ld a, c and a jr nz, .skip_caught_flag ld a, [CurPartySpecies] dec a ld c, a ld d, $0 ld hl, PokedexCaught ld b, RESET_FLAG predef SmallFarFlagAction .skip_caught_flag ; If we haven't seen this Pokemon before receiving ; the Egg, reset the flag that was just set by ; TryAddMonToParty. pop bc ld a, c and a jr nz, .skip_seen_flag ld a, [CurPartySpecies] dec a ld c, a ld d, $0 ld hl, PokedexSeen ld b, RESET_FLAG predef SmallFarFlagAction .skip_seen_flag pop af ld [CurPartySpecies], a ld a, [PartyCount] dec a ld bc, PARTYMON_STRUCT_LENGTH ld hl, PartyMon1Species call AddNTimes ld a, [CurPartySpecies] ld [hl], a ld hl, PartyCount ld a, [hl] ld b, 0 ld c, a add hl, bc ld a, EGG ld [hl], a ld a, [PartyCount] dec a ld hl, PartyMonNicknames call SkipNames ld de, String_Egg call CopyName2 ld a, [PartyCount] dec a ld hl, PartyMon1Happiness ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld a, [wMonStatusFlags] bit 1, a ld a, 1 jr nz, .got_init_happiness ld a, [BaseEggSteps] .got_init_happiness ld [hl], a ld a, [PartyCount] dec a ld hl, PartyMon1HP ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes xor a ld [hli], a ld [hl], a and a ret ; e035 String_Egg: ; e035 db "EGG@" ; e039 RemoveMonFromPartyOrBox: ; e039 ld hl, PartyCount ld a, [wPokemonWithdrawDepositParameter] and a jr z, .okay ld a, BANK(sBoxCount) call GetSRAMBank ld hl, sBoxCount .okay ld a, [hl] dec a ld [hli], a ld a, [CurPartyMon] ld c, a ld b, 0 add hl, bc ld e, l ld d, h inc de .loop ld a, [de] inc de ld [hli], a inc a jr nz, .loop ld hl, PartyMonOT ld d, PARTY_LENGTH - 1 ld a, [wPokemonWithdrawDepositParameter] and a jr z, .party ld hl, sBoxMonOT ld d, MONS_PER_BOX - 1 .party ; If this is the last mon in our party (box), ; shift all the other mons up to close the gap. ld a, [CurPartyMon] call SkipNames ld a, [CurPartyMon] cp d jr nz, .delete_inside ld [hl], -1 jp .finish .delete_inside ; Shift the OT names ld d, h ld e, l ld bc, MON_NAME_LENGTH add hl, bc ld bc, PartyMonNicknames ld a, [wPokemonWithdrawDepositParameter] and a jr z, .party2 ld bc, sBoxMonNicknames .party2 call CopyDataUntil ; Shift the struct ld hl, PartyMons ld bc, PARTYMON_STRUCT_LENGTH ld a, [wPokemonWithdrawDepositParameter] and a jr z, .party4 ld hl, sBoxMons ld bc, BOXMON_STRUCT_LENGTH .party4 ld a, [CurPartyMon] call AddNTimes ld d, h ld e, l ld a, [wPokemonWithdrawDepositParameter] and a jr z, .party5 ld bc, BOXMON_STRUCT_LENGTH add hl, bc ld bc, sBoxMonOT jr .copy .party5 ld bc, PARTYMON_STRUCT_LENGTH add hl, bc ld bc, PartyMonOT .copy call CopyDataUntil ; Shift the nicknames ld hl, PartyMonNicknames ld a, [wPokemonWithdrawDepositParameter] and a jr z, .party6 ld hl, sBoxMonNicknames .party6 ld bc, MON_NAME_LENGTH ld a, [CurPartyMon] call AddNTimes ld d, h ld e, l ld bc, MON_NAME_LENGTH add hl, bc ld bc, PartyMonNicknamesEnd ld a, [wPokemonWithdrawDepositParameter] and a jr z, .party7 ld bc, sBoxMonNicknamesEnd .party7 call CopyDataUntil ; Mail time! .finish ld a, [wPokemonWithdrawDepositParameter] and a jp nz, CloseSRAM ld a, [wLinkMode] and a ret nz ; Shift mail ld a, BANK(sPartyMail) call GetSRAMBank ; If this is the last mon in our party, no need to shift mail. ld hl, PartyCount ld a, [CurPartyMon] cp [hl] jr z, .close_sram ; Shift our mail messages up. ld hl, sPartyMail ld bc, MAIL_STRUCT_LENGTH call AddNTimes push hl add hl, bc pop de ld a, [CurPartyMon] ld b, a .loop2 push bc push hl ld bc, MAIL_STRUCT_LENGTH call CopyBytes pop hl push hl ld bc, MAIL_STRUCT_LENGTH add hl, bc pop de pop bc inc b ld a, [PartyCount] cp b jr nz, .loop2 .close_sram jp CloseSRAM ; e134 ComputeNPCTrademonStats: ; e134 ld a, MON_LEVEL call GetPartyParamLocation ld a, [hl] ld [MON_LEVEL], a ; wow ld a, MON_SPECIES call GetPartyParamLocation ld a, [hl] ld [CurSpecies], a call GetBaseData ld a, MON_MAXHP call GetPartyParamLocation ld d, h ld e, l push de ld a, MON_STAT_EXP - 1 call GetPartyParamLocation ld b, $1 call CalcPkmnStats pop de ld a, MON_HP call GetPartyParamLocation ld a, [de] inc de ld [hli], a ld a, [de] ld [hl], a ret ; e167 CalcPkmnStats: ; e167 ; Calculates all 6 Stats of a Pkmn ; b: Take into account stat EXP if TRUE ; 'c' counts from 1-6 and points with 'BaseStats' to the base value ; hl is the path to the Stat EXP ; results in $ffb5 and $ffb6 are saved in [de] ld c, $0 .loop inc c call CalcPkmnStatC ld a, [hMultiplicand + 1] ld [de], a inc de ld a, [hMultiplicand + 2] ld [de], a inc de ld a, c cp STAT_SDEF jr nz, .loop ret ; e17b CalcPkmnStatC: ; e17b ; 'c' is 1-6 and points to the BaseStat ; 1: HP ; 2: Attack ; 3: Defense ; 4: Speed ; 5: SpAtk ; 6: SpDef push hl push de push bc ld a, b ld d, a push hl ld hl, BaseStats dec hl ; has to be decreased, because 'c' begins with 1 ld b, $0 add hl, bc ld a, [hl] ld e, a pop hl push hl ld a, c cp STAT_SDEF jr nz, .not_spdef dec hl dec hl .not_spdef sla c ld a, d and a jr z, .no_stat_exp add hl, bc push de ld a, [hld] ld e, a ld d, [hl] farcall GetSquareRoot pop de .no_stat_exp srl c pop hl push bc ld bc, MON_DVS - MON_HP_EXP + 1 add hl, bc pop bc ld a, c cp STAT_ATK jr z, .Attack cp STAT_DEF jr z, .Defense cp STAT_SPD jr z, .Speed cp STAT_SATK jr z, .Special cp STAT_SDEF jr z, .Special ; DV_HP = (DV_ATK & 1) << 3 + (DV_DEF & 1) << 2 + (DV_SPD & 1) << 1 + (DV_SPC & 1) push bc ld a, [hl] swap a and $1 add a add a add a ld b, a ld a, [hli] and $1 add a add a add b ld b, a ld a, [hl] swap a and $1 add a add b ld b, a ld a, [hl] and $1 add b pop bc jr .GotDV .Attack: ld a, [hl] swap a and $f jr .GotDV .Defense: ld a, [hl] and $f jr .GotDV .Speed: inc hl ld a, [hl] swap a and $f jr .GotDV .Special: inc hl ld a, [hl] and $f .GotDV: ld d, 0 add e ld e, a jr nc, .no_overflow_1 inc d .no_overflow_1 sla e rl d srl b srl b ld a, b add e jr nc, .no_overflow_2 inc d .no_overflow_2 ld [hMultiplicand + 2], a ld a, d ld [hMultiplicand + 1], a xor a ld [hMultiplicand + 0], a ld a, [CurPartyLevel] ld [hMultiplier], a call Multiply ld a, [hProduct + 1] ld [hDividend + 0], a ld a, [hProduct + 2] ld [hDividend + 1], a ld a, [hProduct + 3] ld [hDividend + 2], a ld a, 100 ld [hDivisor], a ld a, 3 ld b, a call Divide ld a, c cp STAT_HP ld a, STAT_MIN_NORMAL jr nz, .not_hp ld a, [CurPartyLevel] ld b, a ld a, [hQuotient + 2] add b ld [hMultiplicand + 2], a jr nc, .no_overflow_3 ld a, [hQuotient + 1] inc a ld [hMultiplicand + 1], a .no_overflow_3 ld a, STAT_MIN_HP .not_hp ld b, a ld a, [hQuotient + 2] add b ld [hMultiplicand + 2], a jr nc, .no_overflow_4 ld a, [hQuotient + 1] inc a ld [hMultiplicand + 1], a .no_overflow_4 ld a, [hQuotient + 1] cp HIGH(MAX_STAT_VALUE + 1) + 1 jr nc, .max_stat cp HIGH(MAX_STAT_VALUE + 1) jr c, .stat_value_okay ld a, [hQuotient + 2] cp LOW(MAX_STAT_VALUE + 1) jr c, .stat_value_okay .max_stat ld a, HIGH(MAX_STAT_VALUE) ld [hMultiplicand + 1], a ld a, LOW(MAX_STAT_VALUE) ld [hMultiplicand + 2], a .stat_value_okay pop bc pop de pop hl ret ; e277 GivePoke:: ; e277 push de push bc xor a ; PARTYMON ld [MonType], a call TryAddMonToParty jr nc, .failed ld hl, PartyMonNicknames ld a, [PartyCount] dec a ld [CurPartyMon], a call SkipNames ld d, h ld e, l pop bc ld a, b ld b, 0 push bc push de push af ld a, [CurItem] and a jr z, .done ld a, [CurPartyMon] ld hl, PartyMon1Item ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld a, [CurItem] ld [hl], a jr .done .failed ld a, [CurPartySpecies] ld [TempEnemyMonSpecies], a callfar LoadEnemyMon call SendPkmnIntoBox jp nc, .FailedToGiveMon ld a, BOXMON ld [MonType], a xor a ld [CurPartyMon], a ld de, wMonOrItemNameBuffer pop bc ld a, b ld b, 1 push bc push de push af ld a, [CurItem] and a jr z, .done ld a, [CurItem] ld [sBoxMon1Item], a .done ld a, [CurPartySpecies] ld [wd265], a ld [TempEnemyMonSpecies], a call GetPokemonName ld hl, StringBuffer1 ld de, wMonOrItemNameBuffer ld bc, MON_NAME_LENGTH call CopyBytes pop af and a jp z, .wildmon pop de pop bc pop hl push bc push hl ld a, [ScriptBank] call GetFarHalfword ld bc, MON_NAME_LENGTH ld a, [ScriptBank] call FarCopyBytes pop hl inc hl inc hl ld a, [ScriptBank] call GetFarHalfword pop bc ld a, b and a push de push bc jr nz, .send_to_box push hl ld a, [CurPartyMon] ld hl, PartyMonOT call SkipNames ld d, h ld e, l pop hl .otnameloop ld a, [ScriptBank] call GetFarByte ld [de], a inc hl inc de cp "@" jr nz, .otnameloop ld a, [ScriptBank] call GetFarByte ld b, a push bc ld a, [CurPartyMon] ld hl, PartyMon1ID ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld a, HIGH(01001) ld [hli], a ld [hl], LOW(01001) pop bc farcall SetGiftPartyMonCaughtData jr .skip_nickname .send_to_box ld a, BANK(sBoxMonOT) call GetSRAMBank ld de, sBoxMonOT .loop ld a, [ScriptBank] call GetFarByte ld [de], a inc hl inc de cp "@" jr nz, .loop ld a, [ScriptBank] call GetFarByte ld b, a ld hl, sBoxMon1ID call Random ld [hli], a call Random ld [hl], a call CloseSRAM farcall SetGiftBoxMonCaughtData jr .skip_nickname .wildmon pop de pop bc push bc push de ld a, b and a jr z, .party farcall SetBoxMonCaughtData jr .set_caught_data .party farcall SetCaughtData .set_caught_data farcall GiveANickname_YesNo pop de jr c, .skip_nickname call InitNickname .skip_nickname pop bc pop de ld a, b and a ret z ld hl, TextJump_WasSentToBillsPC call PrintText ld a, BANK(sBoxMonNicknames) call GetSRAMBank ld hl, wMonOrItemNameBuffer ld de, sBoxMonNicknames ld bc, MON_NAME_LENGTH call CopyBytes call CloseSRAM ld b, $1 ret ; e3d4 .FailedToGiveMon: ; e3d4 pop bc pop de ld b, $2 ret ; e3d9 TextJump_WasSentToBillsPC: ; 0xe3d9 ; was sent to BILL's PC. text_jump Text_WasSentToBillsPC db "@" ; 0xe3de InitNickname: ; e3de push de call LoadStandardMenuHeader call DisableSpriteUpdates pop de push de ld b, $0 farcall NamingScreen pop hl ld de, StringBuffer1 call InitName ld a, $4 ; ExitAllMenus is in bank 0, XXX could this be in bank 4 in pokered? ld hl, ExitAllMenus rst FarCall ret ; e3fd