diff options
-rw-r--r-- | data/event_scripts.s | 12 | ||||
-rw-r--r-- | data/maps/Route117/map.json | 2 | ||||
-rw-r--r-- | data/maps/Route117_PokemonDayCare/map.json | 2 | ||||
-rw-r--r-- | data/scripts/day_care.inc | 307 | ||||
-rw-r--r-- | data/specials.inc | 4 | ||||
-rw-r--r-- | include/constants/daycare.h | 32 | ||||
-rw-r--r-- | include/constants/global.h | 2 | ||||
-rw-r--r-- | include/constants/pokemon.h | 2 | ||||
-rw-r--r-- | include/daycare.h | 2 | ||||
-rw-r--r-- | include/egg_hatch.h | 4 | ||||
-rw-r--r-- | include/global.h | 2 | ||||
-rw-r--r-- | src/daycare.c | 285 | ||||
-rw-r--r-- | src/egg_hatch.c | 14 |
13 files changed, 351 insertions, 319 deletions
diff --git a/data/event_scripts.s b/data/event_scripts.s index d5a6ce14d..1ed8581f9 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -1,33 +1,35 @@ #include "constants/global.h" +#include "constants/battle.h" #include "constants/battle_frontier.h" #include "constants/battle_setup.h" #include "constants/berry.h" #include "constants/contest.h" +#include "constants/daycare.h" +#include "constants/decorations.h" #include "constants/easy_chat.h" #include "constants/event_objects.h" #include "constants/event_object_movement_constants.h" #include "constants/field_effects.h" #include "constants/field_specials.h" #include "constants/flags.h" -#include "constants/decorations.h" +#include "constants/game_stat.h" #include "constants/item.h" #include "constants/items.h" #include "constants/heal_locations.h" #include "constants/layouts.h" +#include "constants/lilycove_lady.h" #include "constants/map_scripts.h" #include "constants/maps.h" +#include "constants/metatile_labels.h" #include "constants/moves.h" #include "constants/pokemon.h" #include "constants/script_menu.h" #include "constants/songs.h" #include "constants/species.h" +#include "constants/trainer_hill.h" #include "constants/trainers.h" #include "constants/vars.h" #include "constants/weather.h" -#include "constants/trainer_hill.h" -#include "constants/lilycove_lady.h" -#include "constants/battle.h" -#include "constants/metatile_labels.h" .include "asm/macros.inc" .include "asm/macros/event.inc" .include "constants/constants.inc" diff --git a/data/maps/Route117/map.json b/data/maps/Route117/map.json index b29b58639..12420784c 100644 --- a/data/maps/Route117/map.json +++ b/data/maps/Route117/map.json @@ -61,7 +61,7 @@ "movement_range_y": 0, "trainer_type": "0", "trainer_sight_or_berry_tree_id": "0", - "script": "Route117_EventScript_291C18", + "script": "Route117_EventScript_DaycareMan", "flag": "0" }, { diff --git a/data/maps/Route117_PokemonDayCare/map.json b/data/maps/Route117_PokemonDayCare/map.json index c233701e5..9cb052633 100644 --- a/data/maps/Route117_PokemonDayCare/map.json +++ b/data/maps/Route117_PokemonDayCare/map.json @@ -24,7 +24,7 @@ "movement_range_y": 0, "trainer_type": "0", "trainer_sight_or_berry_tree_id": "0", - "script": "Route117_PokemonDayCare_EventScript_291D11", + "script": "Route117_PokemonDayCare_EventScript_DaycareWoman", "flag": "0" } ], diff --git a/data/scripts/day_care.inc b/data/scripts/day_care.inc index 057a2fa07..9006029cd 100644 --- a/data/scripts/day_care.inc +++ b/data/scripts/day_care.inc @@ -1,245 +1,245 @@ -Route117_EventScript_291C18:: @ 8291C18 +Route117_EventScript_DaycareMan:: @ 8291C18 lock faceplayer special GetDaycareMonNicknames specialvar VAR_RESULT, GetDaycareState - compare VAR_RESULT, 1 - goto_if_eq Route117_EventScript_291C4D - compare VAR_RESULT, 2 - goto_if_eq Route117_EventScript_291CD1 - compare VAR_RESULT, 3 - goto_if_eq Route117_EventScript_291CE8 - msgbox Route117_Text_291FCF, MSGBOX_DEFAULT + compare VAR_RESULT, DAYCARE_EGG_WAITING + goto_if_eq Route117_EventScript_DaycareEggWaiting + compare VAR_RESULT, DAYCARE_ONE_MON + goto_if_eq Route117_EventScript_CheckOnOneMon + compare VAR_RESULT, DAYCARE_TWO_MONS + goto_if_eq Route117_EventScript_CheckOnTwoMons + msgbox Route117_Text_SeeWifeIfYoudLikeMeToRaiseMon, MSGBOX_DEFAULT release end -Route117_EventScript_291C4D:: @ 8291C4D - msgbox Route117_Text_29205D, MSGBOX_YESNO +Route117_EventScript_DaycareEggWaiting:: @ 8291C4D + msgbox Route117_Text_DoYouWantEgg, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_EventScript_291C83 - msgbox Route117_Text_2922C6, MSGBOX_YESNO + goto_if_eq Route117_EventScript_DaycareAcceptEgg + msgbox Route117_Text_IWillKeepDoYouWantIt, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_EventScript_291C83 - msgbox Route117_Text_292149, MSGBOX_DEFAULT + goto_if_eq Route117_EventScript_DaycareAcceptEgg + msgbox Route117_Text_IllKeepIt, MSGBOX_DEFAULT clearflag FLAG_PENDING_DAYCARE_EGG special RejectEggFromDayCare release end -Route117_EventScript_291C83:: @ 8291C83 +Route117_EventScript_DaycareAcceptEgg:: @ 8291C83 specialvar VAR_RESULT, CalculatePlayerPartyCount - compare VAR_RESULT, 6 - goto_if_ne Route117_EventScript_291C9D - msgbox Route117_Text_29216A, MSGBOX_DEFAULT + compare VAR_RESULT, PARTY_SIZE + goto_if_ne Route117_EventScript_DaycareReceiveEgg + msgbox Route117_Text_YouHaveNoRoomForIt, MSGBOX_DEFAULT release end -Route117_EventScript_291C9D:: @ 8291C9D - message Route117_Text_2921A4 +Route117_EventScript_DaycareReceiveEgg:: @ 8291C9D + message Route117_Text_ReceivedEgg playfanfare MUS_FANFA1 waitfanfare waitbuttonpress - msgbox Route117_Text_2921CF, MSGBOX_DEFAULT + msgbox Route117_Text_TakeGoodCareOfIt, MSGBOX_DEFAULT special GiveEggFromDaycare clearflag FLAG_PENDING_DAYCARE_EGG release end -Route117_EventScript_291CB7:: @ 8291CB7 - specialvar VAR_RESULT, sub_8071614 +Route117_EventScript_CheckMonReceivedMail:: @ 8291CB7 + specialvar VAR_RESULT, CheckDaycareMonReceivedMail compare VAR_RESULT, 1 - call_if_eq Route117_EventScript_291CC8 + call_if_eq Route117_EventScript_MonReceivedMail return -Route117_EventScript_291CC8:: @ 8291CC8 - msgbox Route117_Text_2921E5, MSGBOX_DEFAULT +Route117_EventScript_MonReceivedMail:: @ 8291CC8 + msgbox Route117_Text_FriendlyWithOtherTrainersMon, MSGBOX_DEFAULT return -Route117_EventScript_291CD1:: @ 8291CD1 +Route117_EventScript_CheckOnOneMon:: @ 8291CD1 special GetDaycareMonNicknames - msgbox Route117_Text_292114, MSGBOX_DEFAULT - setvar VAR_0x8004, 0 - call Route117_EventScript_291CB7 + msgbox Route117_Text_YourMonIsDoingFine, MSGBOX_DEFAULT + setvar VAR_0x8004, EGG_MOTHER + call Route117_EventScript_CheckMonReceivedMail release end -Route117_EventScript_291CE8:: @ 8291CE8 +Route117_EventScript_CheckOnTwoMons:: @ 8291CE8 special GetDaycareMonNicknames - msgbox Route117_Text_292299, MSGBOX_DEFAULT + msgbox Route117_Text_YourMonsAreDoingFine, MSGBOX_DEFAULT special SetDaycareCompatibilityString special ShowFieldMessageStringVar4 waitmessage waitbuttonpress - setvar VAR_0x8004, 0 - call Route117_EventScript_291CB7 - setvar VAR_0x8004, 1 - call Route117_EventScript_291CB7 + setvar VAR_0x8004, EGG_MOTHER + call Route117_EventScript_CheckMonReceivedMail + setvar VAR_0x8004, EGG_FATHER + call Route117_EventScript_CheckMonReceivedMail release end -Route117_PokemonDayCare_EventScript_291D11:: @ 8291D11 +Route117_PokemonDayCare_EventScript_DaycareWoman:: @ 8291D11 lock faceplayer specialvar VAR_RESULT, GetDaycareState + compare VAR_RESULT, DAYCARE_EGG_WAITING + goto_if_eq Route117_PokemonDayCare_EventScript_EggWaiting + compare VAR_RESULT, DAYCARE_ONE_MON + goto_if_eq Route117_PokemonDayCare_EventScript_OneMonInDaycare + compare VAR_RESULT, DAYCARE_TWO_MONS + goto_if_eq Route117_PokemonDayCare_EventScript_TwoMonsInDaycare + msgbox Route117_PokemonDayCare_Text_WouldYouLikeUsToRaiseAMon, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291E0B - compare VAR_RESULT, 2 - goto_if_eq Route117_PokemonDayCare_EventScript_291E2F - compare VAR_RESULT, 3 - goto_if_eq Route117_PokemonDayCare_EventScript_291F5C - msgbox Route117_PokemonDayCare_Text_2922F4, MSGBOX_YESNO - compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291D56 + goto_if_eq Route117_PokemonDayCare_EventScript_GiveMonToRaise msgbox Route117_PokemonDayCare_Text_292416, MSGBOX_DEFAULT release end -Route117_PokemonDayCare_EventScript_291D56:: @ 8291D56 +Route117_PokemonDayCare_EventScript_GiveMonToRaise:: @ 8291D56 specialvar VAR_RESULT, CountPartyNonEggMons compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291DED - specialvar VAR_RESULT, sub_80722E0 + goto_if_eq Route117_PokemonDayCare_EventScript_OnlyOneMon + specialvar VAR_RESULT, CountPartyAliveNonEggMons compare VAR_RESULT, 2 - goto_if_eq Route117_PokemonDayCare_EventScript_291E01 - msgbox Route117_PokemonDayCare_Text_292349, MSGBOX_DEFAULT + goto_if_eq Route117_PokemonDayCare_EventScript_OnlyTwoAliveMons + msgbox Route117_PokemonDayCare_Text_WhichMonShouldWeRaise, MSGBOX_DEFAULT fadescreen 1 special ChooseSendDaycareMon waitstate compare VAR_0x8004, 255 - goto_if_eq Route117_PokemonDayCare_EventScript_291DCA + goto_if_eq Route117_PokemonDayCare_EventScript_ComeAgain specialvar VAR_RESULT, CountPartyAliveNonEggMons_IgnoreVar0x8004Slot compare VAR_RESULT, 0 - goto_if_eq Route117_PokemonDayCare_EventScript_291DF7 + goto_if_eq Route117_PokemonDayCare_EventScript_OnlyOneAliveMon specialvar VAR_0x8005, GetSelectedMonNickAndSpecies waitse playmoncry VAR_0x8005, 0 - msgbox Route117_PokemonDayCare_Text_292370, MSGBOX_DEFAULT + msgbox Route117_PokemonDayCare_Text_WellRaiseYourMon, MSGBOX_DEFAULT waitmoncry special StoreSelectedPokemonInDaycare - incrementgamestat 47 + incrementgamestat GAME_STAT_USED_DAYCARE specialvar VAR_RESULT, GetDaycareState - compare VAR_RESULT, 2 - goto_if_eq Route117_PokemonDayCare_EventScript_291DD4 + compare VAR_RESULT, DAYCARE_ONE_MON + goto_if_eq Route117_PokemonDayCare_EventScript_CanRaiseOneMore release end -Route117_PokemonDayCare_EventScript_291DCA:: @ 8291DCA - msgbox Route117_PokemonDayCare_Text_292476, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_ComeAgain:: @ 8291DCA + msgbox Route117_PokemonDayCare_Text_ComeAgain, MSGBOX_DEFAULT release end -Route117_PokemonDayCare_EventScript_291DD4:: @ 8291DD4 - msgbox Route117_PokemonDayCare_Text_2923AF, MSGBOX_YESNO +Route117_PokemonDayCare_EventScript_CanRaiseOneMore:: @ 8291DD4 + msgbox Route117_PokemonDayCare_Text_WeCanRaiseOneMore, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291D56 - goto Route117_PokemonDayCare_EventScript_291DCA + goto_if_eq Route117_PokemonDayCare_EventScript_GiveMonToRaise + goto Route117_PokemonDayCare_EventScript_ComeAgain end -Route117_PokemonDayCare_EventScript_291DED:: @ 8291DED - msgbox Route117_PokemonDayCare_Text_2925BB, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_OnlyOneMon:: @ 8291DED + msgbox Route117_PokemonDayCare_Text_YouHaveJustOneMon, MSGBOX_DEFAULT release end -Route117_PokemonDayCare_EventScript_291DF7:: @ 8291DF7 - msgbox Route117_PokemonDayCare_Text_292617, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_OnlyOneAliveMon:: @ 8291DF7 + msgbox Route117_PokemonDayCare_Text_WhatWillYouBattleWith, MSGBOX_DEFAULT release end -Route117_PokemonDayCare_EventScript_291E01:: @ 8291E01 - msgbox Route117_PokemonDayCare_Text_29266D, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_OnlyTwoAliveMons:: @ 8291E01 + msgbox Route117_PokemonDayCare_Text_YoullBeLeftWithJustOne, MSGBOX_DEFAULT release end -Route117_PokemonDayCare_EventScript_291E0B:: @ 8291E0B - msgbox Route117_PokemonDayCare_Text_2923F6, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_EggWaiting:: @ 8291E0B + msgbox Route117_PokemonDayCare_Text_HusbandWasLookingForYou, MSGBOX_DEFAULT release end -Route117_PokemonDayCare_EventScript_291E15:: @ 8291E15 - msgbox Route117_PokemonDayCare_Text_2924CC, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_YourMonHasGrownXLevels:: @ 8291E15 + msgbox Route117_PokemonDayCare_Text_YourMonHasGrownXLevels, MSGBOX_DEFAULT return -Route117_PokemonDayCare_EventScript_291E1E:: @ 8291E1E +Route117_PokemonDayCare_EventScript_DisplayLevelsGained:: @ 8291E1E specialvar VAR_RESULT, GetNumLevelsGainedFromDaycare compare VAR_RESULT, 0 - call_if_ne Route117_PokemonDayCare_EventScript_291E15 + call_if_ne Route117_PokemonDayCare_EventScript_YourMonHasGrownXLevels return -Route117_PokemonDayCare_EventScript_291E2F:: @ 8291E2F - msgbox Route117_PokemonDayCare_Text_292488, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_OneMonInDaycare:: @ 8291E2F + msgbox Route117_PokemonDayCare_Text_GoodToSeeYou, MSGBOX_DEFAULT setvar VAR_0x8004, 0 - call Route117_PokemonDayCare_EventScript_291E1E - msgbox Route117_PokemonDayCare_Text_2923AF, MSGBOX_YESNO + call Route117_PokemonDayCare_EventScript_DisplayLevelsGained + msgbox Route117_PokemonDayCare_Text_WeCanRaiseOneMore, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291D56 - msgbox Route117_PokemonDayCare_Text_2925F6, MSGBOX_YESNO + goto_if_eq Route117_PokemonDayCare_EventScript_GiveMonToRaise + msgbox Route117_PokemonDayCare_Text_TakeYourMonBack, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291E6D - goto Route117_PokemonDayCare_EventScript_291DCA + goto_if_eq Route117_PokemonDayCare_EventScript_TryRetrieveMon + goto Route117_PokemonDayCare_EventScript_ComeAgain end -Route117_PokemonDayCare_EventScript_291E6D:: @ 8291E6D +Route117_PokemonDayCare_EventScript_TryRetrieveMon:: @ 8291E6D specialvar VAR_RESULT, CalculatePlayerPartyCount - compare VAR_RESULT, 6 - goto_if_eq Route117_PokemonDayCare_EventScript_291F3D + compare VAR_RESULT, PARTY_SIZE + goto_if_eq Route117_PokemonDayCare_EventScript_NoRoom specialvar VAR_RESULT, GetDaycareState setvar VAR_0x8004, 0 - compare VAR_RESULT, 2 - goto_if_eq Route117_PokemonDayCare_EventScript_291EAC + compare VAR_RESULT, DAYCARE_ONE_MON + goto_if_eq Route117_PokemonDayCare_EventScript_CostPrompt special ShowDaycareLevelMenu waitstate copyvar VAR_0x8004, VAR_RESULT - compare VAR_RESULT, 2 - goto_if_eq Route117_PokemonDayCare_EventScript_291DCA - goto Route117_PokemonDayCare_EventScript_291EAC + compare VAR_RESULT, DAYCARE_EXITED_LEVEL_MENU + goto_if_eq Route117_PokemonDayCare_EventScript_ComeAgain + goto Route117_PokemonDayCare_EventScript_CostPrompt end -Route117_PokemonDayCare_EventScript_291EAC:: @ 8291EAC +Route117_PokemonDayCare_EventScript_CostPrompt:: @ 8291EAC special GetDaycareCost - msgbox Route117_PokemonDayCare_Text_292549, MSGBOX_YESNO + msgbox Route117_PokemonDayCare_Text_ItWillCostX, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291EC8 - goto Route117_PokemonDayCare_EventScript_291DCA + goto_if_eq Route117_PokemonDayCare_EventScript_CheckEnoughMoney + goto Route117_PokemonDayCare_EventScript_ComeAgain end -Route117_PokemonDayCare_EventScript_291EC8:: @ 8291EC8 +Route117_PokemonDayCare_EventScript_CheckEnoughMoney:: @ 8291EC8 specialvar VAR_RESULT, IsEnoughForCostInVar0x8005 compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291EE2 - msgbox Route117_PokemonDayCare_Text_292432, MSGBOX_DEFAULT + goto_if_eq Route117_PokemonDayCare_EventScript_RetrieveMon + msgbox Route117_PokemonDayCare_Text_NotEnoughMoney, MSGBOX_DEFAULT release end -Route117_PokemonDayCare_EventScript_291EE2:: @ 8291EE2 - applymovement 1, Route117_PokemonDayCare_Movement_291F47 +Route117_PokemonDayCare_EventScript_RetrieveMon:: @ 8291EE2 + applymovement 1, Route117_PokemonDayCare_Movement_RetrieveDaycareMon waitmovement 0 specialvar VAR_RESULT, TakePokemonFromDaycare special SubtractMoneyFromVar0x8005 playse SE_REGI - msgbox Route117_PokemonDayCare_Text_292575, MSGBOX_DEFAULT + msgbox Route117_PokemonDayCare_Text_HeresYourMon, MSGBOX_DEFAULT waitse playmoncry VAR_RESULT, 0 - msgbox Route117_PokemonDayCare_Text_292593, MSGBOX_DEFAULT + msgbox Route117_PokemonDayCare_Text_TookBackMon, MSGBOX_DEFAULT waitmoncry specialvar VAR_RESULT, GetDaycareState - compare VAR_RESULT, 2 - goto_if_eq Route117_PokemonDayCare_EventScript_291F24 - goto Route117_PokemonDayCare_EventScript_291DCA + compare VAR_RESULT, DAYCARE_ONE_MON + goto_if_eq Route117_PokemonDayCare_EventScript_AskRetrieveOtherMon + goto Route117_PokemonDayCare_EventScript_ComeAgain end -Route117_PokemonDayCare_EventScript_291F24:: @ 8291F24 - msgbox Route117_PokemonDayCare_Text_29244F, MSGBOX_YESNO +Route117_PokemonDayCare_EventScript_AskRetrieveOtherMon:: @ 8291F24 + msgbox Route117_PokemonDayCare_Text_TakeOtherOneBackToo, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291E6D - goto Route117_PokemonDayCare_EventScript_291DCA + goto_if_eq Route117_PokemonDayCare_EventScript_TryRetrieveMon + goto Route117_PokemonDayCare_EventScript_ComeAgain end -Route117_PokemonDayCare_EventScript_291F3D:: @ 8291F3D - msgbox Route117_PokemonDayCare_Text_2924EF, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_NoRoom:: @ 8291F3D + msgbox Route117_PokemonDayCare_Text_YourTeamIsFull, MSGBOX_DEFAULT release end -Route117_PokemonDayCare_Movement_291F47: @ 8291F47 +Route117_PokemonDayCare_Movement_RetrieveDaycareMon: @ 8291F47 delay_16 delay_16 face_left @@ -261,50 +261,52 @@ Route117_PokemonDayCare_Movement_291F47: @ 8291F47 walk_slow_down step_end +@ Unused. Possibly a commented script, or a typo end added to the above Movement script Route117_PokemonDayCare_EventScript_291F5B:: @ 8291F5B end -Route117_PokemonDayCare_EventScript_291F5C:: @ 8291F5C - msgbox Route117_PokemonDayCare_Text_292488, MSGBOX_DEFAULT +Route117_PokemonDayCare_EventScript_TwoMonsInDaycare:: @ 8291F5C + msgbox Route117_PokemonDayCare_Text_GoodToSeeYou, MSGBOX_DEFAULT setvar VAR_0x8004, 0 - call Route117_PokemonDayCare_EventScript_291E1E + call Route117_PokemonDayCare_EventScript_DisplayLevelsGained setvar VAR_0x8004, 1 - call Route117_PokemonDayCare_EventScript_291E1E - msgbox Route117_PokemonDayCare_Text_2925F6, MSGBOX_YESNO + call Route117_PokemonDayCare_EventScript_DisplayLevelsGained + msgbox Route117_PokemonDayCare_Text_TakeYourMonBack, MSGBOX_YESNO compare VAR_RESULT, 1 - goto_if_eq Route117_PokemonDayCare_EventScript_291E6D - msgbox Route117_PokemonDayCare_Text_292476, MSGBOX_DEFAULT + goto_if_eq Route117_PokemonDayCare_EventScript_TryRetrieveMon + msgbox Route117_PokemonDayCare_Text_ComeAgain, MSGBOX_DEFAULT release end +@ Unused Route117_PokemonDayCare_EventScript_291F95:: @ 8291F95 special ShowDaycareLevelMenu waitstate compare VAR_RESULT, 2 - goto_if_eq Route117_PokemonDayCare_EventScript_291DCA + goto_if_eq Route117_PokemonDayCare_EventScript_ComeAgain copyvar VAR_0x8004, VAR_RESULT specialvar VAR_RESULT, TakePokemonFromDaycare - msgbox Route117_PokemonDayCare_Text_292575, MSGBOX_DEFAULT - msgbox Route117_PokemonDayCare_Text_292476, MSGBOX_DEFAULT + msgbox Route117_PokemonDayCare_Text_HeresYourMon, MSGBOX_DEFAULT + msgbox Route117_PokemonDayCare_Text_ComeAgain, MSGBOX_DEFAULT release end EventScript_EggHatch:: @ 8291FC0 lockall - msgbox Text_292668, MSGBOX_DEFAULT + msgbox Text_EggHatchHuh, MSGBOX_DEFAULT special EggHatch waitstate releaseall end -Route117_Text_291FCF: @ 8291FCF +Route117_Text_SeeWifeIfYoudLikeMeToRaiseMon: @ 8291FCF .string "I'm the DAY-CARE MAN.\p" .string "I help take care of the precious\n" .string "POKéMON of TRAINERS.\p" .string "If you'd like me to raise your POKéMON,\n" .string "have a word with my wife.$" -Route117_Text_29205D: @ 829205D +Route117_Text_DoYouWantEgg: @ 829205D .string "Ah, it's you!\p" .string "We were raising your POKéMON,\n" .string "and my goodness, were we surprised!\p" @@ -313,124 +315,125 @@ Route117_Text_29205D: @ 829205D .string "but your POKéMON had it.\p" .string "You do want it, yes?$" -Route117_Text_292114: @ 8292114 +Route117_Text_YourMonIsDoingFine: @ 8292114 .string "Ah, it's you! Good to see you.\n" .string "Your {STR_VAR_1}'s doing fine.$" -Route117_Text_292149: @ 8292149 +Route117_Text_IllKeepIt: @ 8292149 .string "Well then, I'll keep it.\n" .string "Thanks!$" -Route117_Text_29216A: @ 829216A +Route117_Text_YouHaveNoRoomForIt: @ 829216A .string "You have no room for it…\n" .string "Come back when you've made room.$" -Route117_Text_2921A4: @ 82921A4 +Route117_Text_ReceivedEgg: @ 82921A4 .string "{PLAYER} received the EGG from\n" .string "the DAY-CARE MAN.$" -Route117_Text_2921CF: @ 82921CF +Route117_Text_TakeGoodCareOfIt: @ 82921CF .string "Take good care of it.$" -Route117_Text_2921E5: @ 82921E5 +Route117_Text_FriendlyWithOtherTrainersMon: @ 82921E5 .string "By the way, about your {STR_VAR_1},\n" .string "it seemed to be friendly with\l" .string "{STR_VAR_2}'s {STR_VAR_3}.\p" .string "I may even have seen it receiving\n" .string "a piece of MAIL.$" -Route117_Text_29225A: @ 829225A +@ Unused +Route117_Text_SeeWifeIfYouWantToPickUpMon: @ 829225A .string "If you want to pick up your POKéMON,\n" .string "have a word with my wife.$" -Route117_Text_292299: @ 8292299 +Route117_Text_YourMonsAreDoingFine: @ 8292299 .string "Ah, it's you! Your {STR_VAR_1} and\n" .string "{STR_VAR_2} are doing fine.$" -Route117_Text_2922C6: @ 82922C6 +Route117_Text_IWillKeepDoYouWantIt: @ 82922C6 .string "I really will keep it.\n" .string "You do want this, yes?$" -Route117_PokemonDayCare_Text_2922F4: @ 82922F4 +Route117_PokemonDayCare_Text_WouldYouLikeUsToRaiseAMon: @ 82922F4 .string "I'm the DAY-CARE LADY.\p" .string "We can raise POKéMON for you.\p" .string "Would you like us to raise one?$" -Route117_PokemonDayCare_Text_292349: @ 8292349 +Route117_PokemonDayCare_Text_WhichMonShouldWeRaise: @ 8292349 .string "Which POKéMON should we raise for\n" .string "you?$" -Route117_PokemonDayCare_Text_292370: @ 8292370 +Route117_PokemonDayCare_Text_WellRaiseYourMon: @ 8292370 .string "Fine, we'll raise your {STR_VAR_1}\n" .string "for a while.\p" .string "Come back for it later.$" -Route117_PokemonDayCare_Text_2923AF: @ 82923AF +Route117_PokemonDayCare_Text_WeCanRaiseOneMore: @ 82923AF .string "We can raise two of your POKéMON.\n" .string "Would you like us to raise one more?$" -Route117_PokemonDayCare_Text_2923F6: @ 82923F6 +Route117_PokemonDayCare_Text_HusbandWasLookingForYou: @ 82923F6 .string "My husband was looking for you.$" Route117_PokemonDayCare_Text_292416: @ 8292416 .string "Oh, fine, then.\n" .string "Come again.$" -Route117_PokemonDayCare_Text_292432: @ 8292432 +Route117_PokemonDayCare_Text_NotEnoughMoney: @ 8292432 .string "You don't have enough money…$" -Route117_PokemonDayCare_Text_29244F: @ 829244F +Route117_PokemonDayCare_Text_TakeOtherOneBackToo: @ 829244F .string "Will you take back the other one,\n" .string "too?$" -Route117_PokemonDayCare_Text_292476: @ 8292476 +Route117_PokemonDayCare_Text_ComeAgain: @ 8292476 .string "Fine.\n" .string "Come again.$" -Route117_PokemonDayCare_Text_292488: @ 8292488 +Route117_PokemonDayCare_Text_GoodToSeeYou: @ 8292488 .string "Ah, it's you! Good to see you.\n" .string "Your POKéMON can only be doing good!$" -Route117_PokemonDayCare_Text_2924CC: @ 82924CC +Route117_PokemonDayCare_Text_YourMonHasGrownXLevels: @ 82924CC .string "By level, your {STR_VAR_1} has\n" .string "grown by {STR_VAR_2}.$" -Route117_PokemonDayCare_Text_2924EF: @ 82924EF +Route117_PokemonDayCare_Text_YourTeamIsFull: @ 82924EF .string "Your POKéMON team is full.\n" .string "Make room, then come see me.$" Route117_PokemonDayCare_Text_292527: @ 8292527 .string "Which POKéMON will you take back?$" -Route117_PokemonDayCare_Text_292549: @ 8292549 +Route117_PokemonDayCare_Text_ItWillCostX: @ 8292549 .string "If you want your {STR_VAR_1} back,\n" .string "it will cost ¥{STR_VAR_2}.$" -Route117_PokemonDayCare_Text_292575: @ 8292575 +Route117_PokemonDayCare_Text_HeresYourMon: @ 8292575 .string "Perfect!\n" .string "Here's your POKéMON.$" -Route117_PokemonDayCare_Text_292593: @ 8292593 +Route117_PokemonDayCare_Text_TookBackMon: @ 8292593 .string "{PLAYER} took back {STR_VAR_1} from\n" .string "the DAY-CARE LADY.$" -Route117_PokemonDayCare_Text_2925BB: @ 82925BB +Route117_PokemonDayCare_Text_YouHaveJustOneMon: @ 82925BB .string "Oh? But you have just one\n" .string "POKéMON.\p" .string "Come back another time.$" -Route117_PokemonDayCare_Text_2925F6: @ 82925F6 +Route117_PokemonDayCare_Text_TakeYourMonBack: @ 82925F6 .string "Will you take your POKéMON back?$" -Route117_PokemonDayCare_Text_292617: @ 8292617 +Route117_PokemonDayCare_Text_WhatWillYouBattleWith: @ 8292617 .string "If you leave me that POKéMON,\n" .string "what will you battle with?\p" .string "Come back another time.$" -Text_292668: @ 8292668 +Text_EggHatchHuh: @ 8292668 .string "Huh?$" -Route117_PokemonDayCare_Text_29266D: @ 829266D +Route117_PokemonDayCare_Text_YoullBeLeftWithJustOne: @ 829266D .string "Huh?\n" .string "Now, now.\p" .string "If you leave that POKéMON with\n" diff --git a/data/specials.inc b/data/specials.inc index f1feaec85..ef6a722bf 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -206,7 +206,7 @@ gSpecials:: @ 81DBA64 def_special TakePokemonFromDaycare def_special ScriptHatchMon def_special EggHatch - def_special sub_8071614 + def_special CheckDaycareMonReceivedMail def_special ShowLinkBattleRecords def_special IsEnoughForCostInVar0x8005 def_special SubtractMoneyFromVar0x8005 @@ -530,7 +530,7 @@ gSpecials:: @ 81DBA64 def_special sub_80B4808 def_special ResetHealLocationFromDewford def_special sub_81B9918 - def_special sub_80722E0 + def_special CountPartyAliveNonEggMons def_special TryPrepareSecondApproachingTrainer def_special RemoveRecordsWindow def_special CloseDeptStoreElevatorWindow diff --git a/include/constants/daycare.h b/include/constants/daycare.h new file mode 100644 index 000000000..cc7f67a25 --- /dev/null +++ b/include/constants/daycare.h @@ -0,0 +1,32 @@ +#ifndef GUARD_DAYCARE_CONSTANTS_H +#define GUARD_DAYCARE_CONSTANTS_H + +// Egg parents +#define EGG_MOTHER 0 +#define EGG_FATHER 1 +#define NEITHER_PARENT -1 + +// Parent compatability scores +#define PARENTS_INCOMPATIBLE 0 +#define PARENTS_LOW_COMPATIBILITY 20 +#define PARENTS_MED_COMPATABILITY 50 +#define PARENTS_MAX_COMPATABILITY 70 + +// Daycare state +#define DAYCARE_NO_MONS 0 +#define DAYCARE_EGG_WAITING 1 +#define DAYCARE_ONE_MON 2 +#define DAYCARE_TWO_MONS 3 + +#define INHERITED_IV_COUNT 3 +#define EGG_HATCH_LEVEL 5 +#define EGG_GENDER_MALE 0x8000 // used to create a male egg from a female-only parent species (e.g. Nidoran) + +#define DAYCARE_LEVEL_MENU_EXIT 5 +#define DAYCARE_EXITED_LEVEL_MENU 2 // would be redundant with above if GF had used the same value + +// Array buffers +#define EGG_MOVES_ARRAY_COUNT 10 +#define EGG_LVL_UP_MOVES_ARRAY_COUNT 50 + +#endif //GUARD_DAYCARE_CONSTANTS_H diff --git a/include/constants/global.h b/include/constants/global.h index ba06ff721..7e0b5cfa4 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -51,6 +51,7 @@ #define HALL_FACILITIES_COUNT 9 // 7 facilities for single mode + tower double mode + tower multi mode. #define TRAINER_ID_LENGTH 4 +#define PARTY_SIZE 6 #define MAX_MON_MOVES 4 // string lengths @@ -62,6 +63,7 @@ #define MALE 0 #define FEMALE 1 +#define GENDER_COUNT 2 #define OPTIONS_BUTTON_MODE_NORMAL 0 #define OPTIONS_BUTTON_MODE_LR 1 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 14c2acdf6..52a4f0254 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -41,6 +41,8 @@ #define EGG_GROUP_DRAGON 14 #define EGG_GROUP_UNDISCOVERED 15 +#define EGG_GROUPS_PER_MON 2 + // Pokemon natures #define NATURE_HARDY 0 #define NATURE_LONELY 1 diff --git a/include/daycare.h b/include/daycare.h index ecd875865..b4c4a955d 100644 --- a/include/daycare.h +++ b/include/daycare.h @@ -1,7 +1,7 @@ #ifndef GUARD_DAYCARE_H #define GUARD_DAYCARE_H -#define EGG_HATCH_LEVEL 5 +#include "constants/daycare.h" u8 *GetMonNick(struct Pokemon *mon, u8 *dest); u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest); diff --git a/include/egg_hatch.h b/include/egg_hatch.h index 862d33947..64d07c813 100644 --- a/include/egg_hatch.h +++ b/include/egg_hatch.h @@ -2,9 +2,9 @@ #define GUARD_EGG_HATCH_H void ScriptHatchMon(void); -bool8 sub_8071614(void); +bool8 CheckDaycareMonReceivedMail(void); void EggHatch(void); u8 GetEggStepsToSubtract(void); -u16 sub_80722E0(void); +u16 CountPartyAliveNonEggMons(void); #endif // GUARD_EGG_HATCH_H diff --git a/include/global.h b/include/global.h index fa8fe8eb3..44a4d0164 100644 --- a/include/global.h +++ b/include/global.h @@ -63,8 +63,6 @@ // Converts a Q24.8 fixed-point format number to a regular integer #define Q_24_8_TO_INT(n) ((int)((n) >> 8)) -#define PARTY_SIZE 6 - #define POKEMON_SLOTS_NUMBER 412 #define min(a, b) ((a) < (b) ? (a) : (b)) diff --git a/src/daycare.c b/src/daycare.c index dc44b4887..bd705e73f 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -3,14 +3,11 @@ #include "battle.h" #include "daycare.h" #include "string_util.h" -#include "constants/species.h" -#include "constants/items.h" #include "mail.h" #include "pokemon_storage_system.h" #include "event_data.h" #include "random.h" #include "main.h" -#include "constants/moves.h" #include "egg_hatch.h" #include "text.h" #include "menu.h" @@ -22,9 +19,10 @@ #include "party_menu.h" #include "list_menu.h" #include "overworld.h" - -#define EGG_MOVES_ARRAY_COUNT 10 -#define EGG_LVL_UP_MOVES_ARRAY_COUNT 50 +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/region_map_sections.h" +#include "constants/species.h" // this file's functions static void ClearDaycareMonMail(struct DayCareMail *mail); @@ -52,11 +50,13 @@ static const struct WindowTemplate sDaycareLevelMenuWindowTemplate = .baseBlock = 8 }; +// Indices here are assigned by Task_HandleDaycareLevelMenuInput to VAR_RESULT, +// which is copied to VAR_0x8004 and used as an index for GetDaycareCost static const struct ListMenuItem sLevelMenuItems[] = { - {gExpandedPlaceholder_Empty, 0}, - {gExpandedPlaceholder_Empty, 1}, - {gText_Exit, 5} + {gExpandedPlaceholder_Empty, EGG_MOTHER}, + {gExpandedPlaceholder_Empty, EGG_FATHER}, + {gText_Exit, DAYCARE_LEVEL_MENU_EXIT} }; static const struct ListMenuTemplate sDaycareListMenuLevelTemplate = @@ -202,16 +202,16 @@ void StoreSelectedPokemonInDaycare(void) static void ShiftDaycareSlots(struct DayCare *daycare) { // This condition is only satisfied when the player takes out the first pokemon from the daycare. - if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != 0 - && GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) == 0) + if (GetBoxMonData(&daycare->mons[EGG_FATHER].mon, MON_DATA_SPECIES) != SPECIES_NONE + && GetBoxMonData(&daycare->mons[EGG_MOTHER].mon, MON_DATA_SPECIES) == SPECIES_NONE) { - daycare->mons[0].mon = daycare->mons[1].mon; - ZeroBoxMonData(&daycare->mons[1].mon); + daycare->mons[EGG_MOTHER].mon = daycare->mons[EGG_FATHER].mon; + ZeroBoxMonData(&daycare->mons[EGG_FATHER].mon); - daycare->mons[0].mail = daycare->mons[1].mail; - daycare->mons[0].steps = daycare->mons[1].steps; - daycare->mons[1].steps = 0; - ClearDaycareMonMail(&daycare->mons[1].mail); + daycare->mons[EGG_MOTHER].mail = daycare->mons[EGG_FATHER].mail; + daycare->mons[EGG_MOTHER].steps = daycare->mons[EGG_FATHER].steps; + daycare->mons[EGG_FATHER].steps = 0; + ClearDaycareMonMail(&daycare->mons[EGG_FATHER].mail); } } @@ -341,8 +341,8 @@ void GetDaycareCost(void) static void Debug_AddDaycareSteps(u16 numSteps) { - gSaveBlock1Ptr->daycare.mons[0].steps += numSteps; - gSaveBlock1Ptr->daycare.mons[1].steps += numSteps; + gSaveBlock1Ptr->daycare.mons[EGG_MOTHER].steps += numSteps; + gSaveBlock1Ptr->daycare.mons[EGG_FATHER].steps += numSteps; } u8 GetNumLevelsGainedFromDaycare(void) @@ -419,18 +419,18 @@ static u16 GetEggSpecies(u16 species) return species; } -static s32 GetSlotToInheritNature(struct DayCare *daycare) +static s32 GetParentToInheritNature(struct DayCare *daycare) { u32 species[DAYCARE_MON_COUNT]; s32 i; s32 dittoCount; - s32 slot = -1; + s32 parent = NEITHER_PARENT; // search for female gender for (i = 0; i < DAYCARE_MON_COUNT; i++) { if (GetBoxMonGender(&daycare->mons[i].mon) == MON_FEMALE) - slot = i; + parent = i; } // search for ditto @@ -438,50 +438,52 @@ static s32 GetSlotToInheritNature(struct DayCare *daycare) { species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES); if (species[i] == SPECIES_DITTO) - dittoCount++, slot = i; + dittoCount++, parent = i; } // coin flip on ...two Dittos - if (dittoCount == 2) + if (dittoCount == DAYCARE_MON_COUNT) { if (Random() >= USHRT_MAX / 2) - slot = 0; + parent = EGG_MOTHER; else - slot = 1; + parent = EGG_FATHER; } - // nature inheritance only if holds everstone - if (GetBoxMonData(&daycare->mons[slot].mon, MON_DATA_HELD_ITEM) != ITEM_EVERSTONE + // Don't inherit nature if not holding Everstone + if (GetBoxMonData(&daycare->mons[parent].mon, MON_DATA_HELD_ITEM) != ITEM_EVERSTONE || Random() >= USHRT_MAX / 2) { - return -1; + return NEITHER_PARENT; } - return slot; + return parent; } static void _TriggerPendingDaycareEgg(struct DayCare *daycare) { - s32 natureSlot; + s32 parent; s32 natureTries = 0; SeedRng2(gMain.vblankCounter2); - natureSlot = GetSlotToInheritNature(daycare); + parent = GetParentToInheritNature(daycare); - if (natureSlot < 0) + // don't inherit nature + if (parent < 0) { - daycare->offspringPersonality = (Random2() << 0x10) | ((Random() % 0xfffe) + 1); + daycare->offspringPersonality = (Random2() << 16) | ((Random() % 0xfffe) + 1); } + // inherit nature else { - u8 wantedNature = GetNatureFromPersonality(GetBoxMonData(&daycare->mons[natureSlot].mon, MON_DATA_PERSONALITY, NULL)); + u8 wantedNature = GetNatureFromPersonality(GetBoxMonData(&daycare->mons[parent].mon, MON_DATA_PERSONALITY, NULL)); u32 personality; do { - personality = (Random2() << 0x10) | (Random()); + personality = (Random2() << 16) | (Random()); if (wantedNature == GetNatureFromPersonality(personality) && personality != 0) - break; // we found a personality with the same nature + break; // found a personality with the same nature natureTries++; } while (natureTries <= 2400); @@ -492,9 +494,10 @@ static void _TriggerPendingDaycareEgg(struct DayCare *daycare) FlagSet(FLAG_PENDING_DAYCARE_EGG); } +// Functionally unused static void _TriggerPendingDaycareMaleEgg(struct DayCare *daycare) { - daycare->offspringPersonality = (Random()) | (0x8000); + daycare->offspringPersonality = (Random()) | (EGG_GENDER_MALE); FlagSet(FLAG_PENDING_DAYCARE_EGG); } @@ -503,6 +506,7 @@ void TriggerPendingDaycareEgg(void) _TriggerPendingDaycareEgg(&gSaveBlock1Ptr->daycare); } +// Unused static void TriggerPendingDaycareMaleEgg(void) { _TriggerPendingDaycareMaleEgg(&gSaveBlock1Ptr->daycare); @@ -532,9 +536,9 @@ static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare) { u8 i; - u8 selectedIvs[3]; + u8 selectedIvs[INHERITED_IV_COUNT]; u8 availableIVs[NUM_STATS]; - u8 whichParent[ARRAY_COUNT(selectedIvs)]; + u8 whichParent[INHERITED_IV_COUNT]; u8 iv; // Initialize a list of IV indices. @@ -544,23 +548,21 @@ static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare) } // Select the 3 IVs that will be inherited. - for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) + for (i = 0; i < INHERITED_IV_COUNT; i++) { - // Randomly pick an IV from the available list. + // Randomly pick an IV from the available list and stop from being chosen again. selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)]; - - // Remove the selected IV index from the available IV indices. RemoveIVIndexFromList(availableIVs, i); } // Determine which parent each of the selected IVs should inherit from. - for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) + for (i = 0; i < INHERITED_IV_COUNT; i++) { - whichParent[i] = Random() % 2; + whichParent[i] = Random() % DAYCARE_MON_COUNT; } // Set each of inherited IVs on the egg mon. - for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) + for (i = 0; i < INHERITED_IV_COUNT; i++) { switch (selectedIvs[i]) { @@ -638,14 +640,14 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru numSharedParentMoves = 0; for (i = 0; i < MAX_MON_MOVES; i++) { - sHatchedEggMotherMoves[i] = 0; - sHatchedEggFatherMoves[i] = 0; - sHatchedEggFinalMoves[i] = 0; + sHatchedEggMotherMoves[i] = MOVE_NONE; + sHatchedEggFatherMoves[i] = MOVE_NONE; + sHatchedEggFinalMoves[i] = MOVE_NONE; } for (i = 0; i < EGG_MOVES_ARRAY_COUNT; i++) - sHatchedEggEggMoves[i] = 0; + sHatchedEggEggMoves[i] = MOVE_NONE; for (i = 0; i < EGG_LVL_UP_MOVES_ARRAY_COUNT; i++) - sHatchedEggLevelUpMoves[i] = 0; + sHatchedEggLevelUpMoves[i] = MOVE_NONE; numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), sHatchedEggLevelUpMoves); for (i = 0; i < MAX_MON_MOVES; i++) @@ -732,8 +734,8 @@ static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare u16 motherItem, fatherItem; if (*species == SPECIES_WYNAUT || *species == SPECIES_AZURILL) { - motherItem = GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM); - fatherItem = GetBoxMonData(&daycare->mons[1].mon, MON_DATA_HELD_ITEM); + motherItem = GetBoxMonData(&daycare->mons[EGG_MOTHER].mon, MON_DATA_HELD_ITEM); + fatherItem = GetBoxMonData(&daycare->mons[EGG_FATHER].mon, MON_DATA_HELD_ITEM); if (*species == SPECIES_WYNAUT && motherItem != ITEM_LAX_INCENSE && fatherItem != ITEM_LAX_INCENSE) { *species = SPECIES_WOBBUFFET; @@ -748,8 +750,8 @@ static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare static void GiveVoltTackleIfLightBall(struct Pokemon *mon, struct DayCare *daycare) { - u32 motherItem = GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM); - u32 fatherItem = GetBoxMonData(&daycare->mons[1].mon, MON_DATA_HELD_ITEM); + u32 motherItem = GetBoxMonData(&daycare->mons[EGG_MOTHER].mon, MON_DATA_HELD_ITEM); + u32 fatherItem = GetBoxMonData(&daycare->mons[EGG_FATHER].mon, MON_DATA_HELD_ITEM); if (motherItem == ITEM_LIGHT_BALL || fatherItem == ITEM_LIGHT_BALL) { @@ -761,60 +763,57 @@ static void GiveVoltTackleIfLightBall(struct Pokemon *mon, struct DayCare *dayca static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots) { u16 i; - u16 species[2]; + u16 species[DAYCARE_MON_COUNT]; u16 eggSpecies; - // Determine which of the daycare mons is the mother and father of the egg. - // The 0th index of the parentSlots array is considered the mother slot, and the - // 1st index is the father slot. - for (i = 0; i < 2; i++) + for (i = 0; i < DAYCARE_MON_COUNT; i++) { species[i] = GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES); if (species[i] == SPECIES_DITTO) { - parentSlots[0] = i ^ 1; - parentSlots[1] = i; + parentSlots[EGG_MOTHER] = i ^ 1; + parentSlots[EGG_FATHER] = i; } else if (GetBoxMonGender(&daycare->mons[i].mon) == MON_FEMALE) { - parentSlots[0] = i; - parentSlots[1] = i ^ 1; + parentSlots[EGG_MOTHER] = i; + parentSlots[EGG_FATHER] = i ^ 1; } } - eggSpecies = GetEggSpecies(species[parentSlots[0]]); - if (eggSpecies == SPECIES_NIDORAN_F && daycare->offspringPersonality & 0x8000) + eggSpecies = GetEggSpecies(species[parentSlots[EGG_MOTHER]]); + if (eggSpecies == SPECIES_NIDORAN_F && daycare->offspringPersonality & EGG_GENDER_MALE) { eggSpecies = SPECIES_NIDORAN_M; } - if (eggSpecies == SPECIES_ILLUMISE && daycare->offspringPersonality & 0x8000) + if (eggSpecies == SPECIES_ILLUMISE && daycare->offspringPersonality & EGG_GENDER_MALE) { eggSpecies = SPECIES_VOLBEAT; } // Make Ditto the "mother" slot if the other daycare mon is male. - if (species[parentSlots[1]] == SPECIES_DITTO && GetBoxMonGender(&daycare->mons[parentSlots[0]].mon) != MON_FEMALE) + if (species[parentSlots[EGG_FATHER]] == SPECIES_DITTO && GetBoxMonGender(&daycare->mons[parentSlots[EGG_MOTHER]].mon) != MON_FEMALE) { - u8 temp = parentSlots[1]; - parentSlots[1] = parentSlots[0]; - parentSlots[0] = temp; + u8 ditto = parentSlots[EGG_FATHER]; + parentSlots[EGG_FATHER] = parentSlots[EGG_MOTHER]; + parentSlots[EGG_MOTHER] = ditto; } return eggSpecies; } -static void _GiveEggFromDaycare(struct DayCare *daycare) // give_egg +static void _GiveEggFromDaycare(struct DayCare *daycare) { struct Pokemon egg; u16 species; - u8 parentSlots[2]; // 0th index is "mother" daycare slot, 1st is "father" + u8 parentSlots[DAYCARE_MON_COUNT]; bool8 isEgg; species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots); AlterEggSpeciesWithIncenseItem(&species, daycare); SetInitialEggData(&egg, species, daycare); InheritIVs(&egg, daycare); - BuildEggMoveset(&egg, &daycare->mons[parentSlots[1]].mon, &daycare->mons[parentSlots[0]].mon); + BuildEggMoveset(&egg, &daycare->mons[parentSlots[EGG_FATHER]].mon, &daycare->mons[parentSlots[EGG_MOTHER]].mon); if (species == SPECIES_PICHU) GiveVoltTackleIfLightBall(&egg, daycare); @@ -835,7 +834,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation) u8 metLocation; u8 isEgg; - CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0); + CreateMon(mon, species, EGG_HATCH_LEVEL, 32, FALSE, 0, OT_ID_PLAYER_ID, 0); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; @@ -846,7 +845,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation) SetMonData(mon, MON_DATA_LANGUAGE, &language); if (setHotSpringsLocation) { - metLocation = 253; // hot springs; see PokemonSummaryScreen_PrintEggTrainerMemo + metLocation = METLOC_SPECIAL_EGG; SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation); } @@ -862,7 +861,7 @@ static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare * u8 language; personality = daycare->offspringPersonality; - CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, TRUE, personality, OT_ID_PLAYER_ID, 0); + CreateMon(mon, species, EGG_HATCH_LEVEL, 32, TRUE, personality, OT_ID_PLAYER_ID, 0); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; @@ -889,7 +888,7 @@ static bool8 _DoEggActions_CheckHatch(struct DayCare *daycare) } // try to trigger poke sex - if (daycare->offspringPersonality == 0 && validEggs == 2 && (daycare->mons[1].steps & 0xFF) == 0xFF) + if (daycare->offspringPersonality == 0 && validEggs == DAYCARE_MON_COUNT && (daycare->mons[EGG_FATHER].steps & 0xFF) == 0xFF) { u8 loveScore = GetDaycareCompatibilityScore(daycare); if (loveScore > (Random() * 100u) / USHRT_MAX) @@ -945,16 +944,16 @@ static bool8 IsEggPending(struct DayCare *daycare) static void _GetDaycareMonNicknames(struct DayCare *daycare) { u8 text[12]; - if (GetBoxMonData(&daycare->mons[0].mon, MON_DATA_SPECIES) != 0) + if (GetBoxMonData(&daycare->mons[EGG_MOTHER].mon, MON_DATA_SPECIES) != 0) { - GetBoxMonNick(&daycare->mons[0].mon, gStringVar1); - GetBoxMonData(&daycare->mons[0].mon, MON_DATA_OT_NAME, text); + GetBoxMonNick(&daycare->mons[EGG_MOTHER].mon, gStringVar1); + GetBoxMonData(&daycare->mons[EGG_MOTHER].mon, MON_DATA_OT_NAME, text); StringCopy(gStringVar3, text); } - if (GetBoxMonData(&daycare->mons[1].mon, MON_DATA_SPECIES) != 0) + if (GetBoxMonData(&daycare->mons[EGG_FATHER].mon, MON_DATA_SPECIES) != 0) { - GetBoxMonNick(&daycare->mons[1].mon, gStringVar2); + GetBoxMonNick(&daycare->mons[EGG_FATHER].mon, gStringVar2); } } @@ -971,26 +970,19 @@ void GetDaycareMonNicknames(void) u8 GetDaycareState(void) { - // The daycare can be in 4 possible states: - // 0: default state--no deposited mons, no egg - // 1: there is an egg waiting for the player to pick it up - // 2: there is a single pokemon in the daycare - // 3: there are two pokemon in the daycare, no egg - u8 numMons; if (IsEggPending(&gSaveBlock1Ptr->daycare)) { - // There is an Egg waiting for the player. - return 1; + return DAYCARE_EGG_WAITING; } numMons = CountPokemonInDaycare(&gSaveBlock1Ptr->daycare); if (numMons != 0) { - return numMons + 1; + return numMons + 1; // DAYCARE_ONE_MON or DAYCARE_TWO_MONS } - return 0; + return DAYCARE_NO_MONS; } static u8 GetDaycarePokemonCount(void) @@ -1002,15 +994,15 @@ static u8 GetDaycarePokemonCount(void) return 0; } +// Determine if the two given egg group lists contain any of the +// same egg groups. static bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2) { - // Determine if the two given egg group lists contain any of the - // same egg groups. s32 i, j; - for (i = 0; i < 2; i++) + for (i = 0; i < EGG_GROUPS_PER_MON; i++) { - for (j = 0; j < 2; j++) + for (j = 0; j < EGG_GROUPS_PER_MON; j++) { if (eggGroups1[i] == eggGroups2[j]) return TRUE; @@ -1023,12 +1015,12 @@ static bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2) static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) { u32 i; - u16 eggGroups[2][2]; - u16 species[2]; - u32 trainerIds[2]; - u32 genders[2]; + u16 eggGroups[DAYCARE_MON_COUNT][EGG_GROUPS_PER_MON]; + u16 species[DAYCARE_MON_COUNT]; + u32 trainerIds[DAYCARE_MON_COUNT]; + u32 genders[DAYCARE_MON_COUNT]; - for (i = 0; i < 2; i++) + for (i = 0; i < DAYCARE_MON_COUNT; i++) { u32 personality; @@ -1041,42 +1033,43 @@ static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) } // check unbreedable egg group - if (eggGroups[0][0] == EGG_GROUP_UNDISCOVERED || eggGroups[1][0] == EGG_GROUP_UNDISCOVERED) - return 0; + if (eggGroups[EGG_MOTHER][0] == EGG_GROUP_UNDISCOVERED || eggGroups[EGG_FATHER][0] == EGG_GROUP_UNDISCOVERED) + return PARENTS_INCOMPATIBLE; // two Ditto can't breed - if (eggGroups[0][0] == EGG_GROUP_DITTO && eggGroups[1][0] == EGG_GROUP_DITTO) - return 0; + if (eggGroups[EGG_MOTHER][0] == EGG_GROUP_DITTO && eggGroups[EGG_FATHER][0] == EGG_GROUP_DITTO) + return PARENTS_INCOMPATIBLE; - // now that we checked, one ditto can breed with any other mon - if (eggGroups[0][0] == EGG_GROUP_DITTO || eggGroups[1][0] == EGG_GROUP_DITTO) + // one parent is Ditto + if (eggGroups[EGG_MOTHER][0] == EGG_GROUP_DITTO || eggGroups[EGG_FATHER][0] == EGG_GROUP_DITTO) { - if (trainerIds[0] == trainerIds[1]) // same trainer - return 20; + if (trainerIds[EGG_MOTHER] == trainerIds[EGG_FATHER]) + return PARENTS_LOW_COMPATIBILITY; - return 50; // different trainers, more chance of poke sex + return PARENTS_MED_COMPATABILITY; } + // neither parent is Ditto else { - if (genders[0] == genders[1]) // no homo - return 0; - if (genders[0] == MON_GENDERLESS || genders[1] == MON_GENDERLESS) - return 0; - if (!EggGroupsOverlap(eggGroups[0], eggGroups[1])) // not compatible with each other - return 0; - - if (species[0] == species[1]) // same species + if (genders[EGG_MOTHER] == genders[EGG_FATHER]) + return PARENTS_INCOMPATIBLE; + if (genders[EGG_MOTHER] == MON_GENDERLESS || genders[EGG_FATHER] == MON_GENDERLESS) + return PARENTS_INCOMPATIBLE; + if (!EggGroupsOverlap(eggGroups[EGG_MOTHER], eggGroups[EGG_FATHER])) + return PARENTS_INCOMPATIBLE; + + if (species[EGG_MOTHER] == species[EGG_FATHER]) { - if (trainerIds[0] == trainerIds[1]) // same species and trainer - return 50; + if (trainerIds[EGG_MOTHER] == trainerIds[EGG_FATHER]) + return PARENTS_MED_COMPATABILITY; // same species, same trainer - return 70; // different trainers, same species + return PARENTS_MAX_COMPATABILITY; // same species, different trainers } else { - if (trainerIds[0] != trainerIds[1]) // different trainers, different species - return 50; + if (trainerIds[EGG_MOTHER] != trainerIds[EGG_FATHER]) + return PARENTS_MED_COMPATABILITY; // different species, different trainers - return 20; // different species, same trainer + return PARENTS_LOW_COMPATIBILITY; // different species, same trainer } } } @@ -1093,13 +1086,13 @@ void SetDaycareCompatibilityString(void) relationshipScore = GetDaycareCompatibilityScoreFromSave(); whichString = 0; - if (relationshipScore == 0) + if (relationshipScore == PARENTS_INCOMPATIBLE) whichString = 3; - if (relationshipScore == 20) + if (relationshipScore == PARENTS_LOW_COMPATIBILITY) whichString = 2; - if (relationshipScore == 50) + if (relationshipScore == PARENTS_MED_COMPATABILITY) whichString = 1; - if (relationshipScore == 70) + if (relationshipScore == PARENTS_MAX_COMPATABILITY) whichString = 0; StringCopy(gStringVar4, sCompatibilityMessages[whichString]); @@ -1108,20 +1101,20 @@ void SetDaycareCompatibilityString(void) bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) { u8 i; - u8 symbolsCount[2]; // male, female - symbolsCount[0] = symbolsCount[1] = 0; + u8 symbolsCount[GENDER_COUNT]; + symbolsCount[MALE] = symbolsCount[FEMALE] = 0; for (i = 0; name[i] != EOS; i++) { if (name[i] == CHAR_MALE) - symbolsCount[0]++; + symbolsCount[MALE]++; if (name[i] == CHAR_FEMALE) - symbolsCount[1]++; + symbolsCount[FEMALE]++; } - if (genderRatio == MON_MALE && symbolsCount[0] != 0 && symbolsCount[1] == 0) + if (genderRatio == MON_MALE && symbolsCount[MALE] != 0 && symbolsCount[FEMALE] == 0) return TRUE; - if (genderRatio == MON_FEMALE && symbolsCount[1] != 0 && symbolsCount[0] == 0) + if (genderRatio == MON_FEMALE && symbolsCount[FEMALE] != 0 && symbolsCount[MALE] == 0) return TRUE; return FALSE; @@ -1150,19 +1143,19 @@ static u8 *AppendMonGenderSymbol(u8 *name, struct BoxPokemon *boxMon) static void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest) { - u8 monNames[2][20]; + u8 monNames[DAYCARE_MON_COUNT][20]; u8 i; *dest = EOS; - for (i = 0; i < 2; i++) + for (i = 0; i < DAYCARE_MON_COUNT; i++) { GetBoxMonNick(&daycare->mons[i].mon, monNames[i]); AppendMonGenderSymbol(monNames[i], &daycare->mons[i].mon); } - StringCopy(dest, monNames[0]); + StringCopy(dest, monNames[EGG_MOTHER]); StringAppend(dest, gText_NewLine2); - StringAppend(dest, monNames[1]); + StringAppend(dest, monNames[EGG_FATHER]); StringAppend(dest, gText_NewLine2); StringAppend(dest, gText_Exit4); } @@ -1174,7 +1167,7 @@ static void GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest) u8 text[20]; *dest = EOS; - for (i = 0; i < 2; i++) + for (i = 0; i < DAYCARE_MON_COUNT; i++) { StringAppend(dest, gText_Lv); level = GetLevelAfterDaycareSteps(&daycare->mons[i].mon, daycare->mons[i].steps); @@ -1250,12 +1243,12 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId) { switch (input) { - case 0: - case 1: + case EGG_MOTHER: + case EGG_FATHER: gSpecialVar_Result = input; break; - case 5: - gSpecialVar_Result = 2; + case DAYCARE_LEVEL_MENU_EXIT: + gSpecialVar_Result = DAYCARE_EXITED_LEVEL_MENU; break; } DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL); @@ -1266,7 +1259,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId) } else if (gMain.newKeys & B_BUTTON) { - gSpecialVar_Result = 2; + gSpecialVar_Result = DAYCARE_EXITED_LEVEL_MENU; DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL); ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); RemoveWindow(gTasks[taskId].tWindowId); diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 4fba8578c..5262c4af4 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -388,13 +388,13 @@ void ScriptHatchMon(void) AddHatchedMonToParty(gSpecialVar_0x8004); } -static bool8 sub_807158C(struct DayCare *daycare, u8 daycareId) +static bool8 _CheckDaycareMonReceivedMail(struct DayCare *daycare, u8 daycareId) { - u8 nick[0x20]; + u8 nick[32]; struct DaycareMon *daycareMon = &daycare->mons[daycareId]; GetBoxMonNick(&daycareMon->mon, nick); - if (daycareMon->mail.message.itemId != 0 + if (daycareMon->mail.message.itemId != ITEM_NONE && (StringCompareWithoutExtCtrlCodes(nick, daycareMon->mail.monName) != 0 || StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0)) { @@ -406,9 +406,9 @@ static bool8 sub_807158C(struct DayCare *daycare, u8 daycareId) return FALSE; } -bool8 sub_8071614(void) +bool8 CheckDaycareMonReceivedMail(void) { - return sub_807158C(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); + return _CheckDaycareMonReceivedMail(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); } static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc) @@ -880,9 +880,9 @@ u8 GetEggStepsToSubtract(void) return 1; } -u16 sub_80722E0(void) +u16 CountPartyAliveNonEggMons(void) { u16 aliveNonEggMonsCount = CountStorageNonEggMons(); - aliveNonEggMonsCount += CountPartyAliveNonEggMonsExcept(6); + aliveNonEggMonsCount += CountPartyAliveNonEggMonsExcept(PARTY_SIZE); return aliveNonEggMonsCount; } |