diff --git a/data/maps/ViridianCity_Mart/scripts.inc b/data/maps/ViridianCity_Mart/scripts.inc index b986ccbe8..fa44f8b84 100644 --- a/data/maps/ViridianCity_Mart/scripts.inc +++ b/data/maps/ViridianCity_Mart/scripts.inc @@ -134,6 +134,8 @@ ViridianCity_Mart_Items:: .2byte ITEM_DYNAMAX_CANDY .2byte ITEM_ROTOM_CATALOG .2byte ITEM_ZYGARDE_CUBE + .2byte ITEM_METEORITE + .2byte ITEM_YELLOW_NECTAR .2byte ITEM_NONE release end diff --git a/include/item_use.h b/include/item_use.h index d61cb7d13..a72afcfe8 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -18,6 +18,8 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId); void ItemUseOutOfBattle_EnigmaBerry(u8 taskId); void ItemUseOutOfBattle_EvolutionStone(u8 taskId); void ItemUseOutOfBattle_FameChecker(u8 taskId); +void ItemUseOutOfBattle_FormChange(u8 taskId); +void ItemUseOutOfBattle_FormChange_ConsumedOnUse(u8 taskId); void ItemUseOutOfBattle_Itemfinder(u8 taskId); void ItemUseOutOfBattle_Mail(u8 taskId); void ItemUseOutOfBattle_Medicine(u8 taskId); diff --git a/include/party_menu.h b/include/party_menu.h index ae9fb4c9a..c7c814be3 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -90,6 +90,8 @@ void ChooseMonForDaycare(void); void ChoosePartyMonByMenuType(u8 menuType); void ItemUseCB_BattleChooseMove(u8 taskId, TaskFunc task); const u8* GetItemEffect(u16 item); +void ItemUseCB_FormChange(u8 taskId, TaskFunc task); +void ItemUseCB_FormChange_ConsumedOnUse(u8 taskId, TaskFunc task); void ItemUseCB_RotomCatalog(u8 taskId, TaskFunc task); void ItemUseCB_ZygardeCube(u8 taskId, TaskFunc task); diff --git a/src/data/items.h b/src/data/items.h index c102eb3a1..c716702a7 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -3892,7 +3892,7 @@ const struct Item gItemsInfo[] = .description = sNectarDesc, .pocket = POCKET_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, }, @@ -3904,7 +3904,7 @@ const struct Item gItemsInfo[] = .description = sNectarDesc, .pocket = POCKET_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, }, @@ -3916,7 +3916,7 @@ const struct Item gItemsInfo[] = .description = sNectarDesc, .pocket = POCKET_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, }, @@ -3928,7 +3928,7 @@ const struct Item gItemsInfo[] = .description = sNectarDesc, .pocket = POCKET_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, }, @@ -10789,7 +10789,7 @@ const struct Item gItemsInfo[] = "token of gratitude."), .pocket = POCKET_KEY_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_FormChange, }, [ITEM_REVEAL_GLASS] = @@ -10804,7 +10804,7 @@ const struct Item gItemsInfo[] = "its original form."), .pocket = POCKET_KEY_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_FormChange, }, [ITEM_DNA_SPLICERS] = @@ -10847,7 +10847,7 @@ const struct Item gItemsInfo[] = "\nPokémon long ago."), .pocket = POCKET_KEY_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_FormChange, }, [ITEM_N_SOLARIZER] = @@ -11473,7 +11473,7 @@ const struct Item gItemsInfo[] = .importance = 1, .pocket = POCKET_KEY_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_FormChange, }, [ITEM_MAGMA_EMBLEM] = diff --git a/src/data/wild_encounters.json b/src/data/wild_encounters.json index 1378cbaad..9cac0c9a3 100644 --- a/src/data/wild_encounters.json +++ b/src/data/wild_encounters.json @@ -8263,32 +8263,32 @@ { "min_level": 3, "max_level": 3, - "species": "SPECIES_ZYGARDE" + "species": "SPECIES_DEOXYS" }, { "min_level": 3, "max_level": 3, - "species": "SPECIES_ZYGARDE" + "species": "SPECIES_DEOXYS" }, { "min_level": 3, "max_level": 3, - "species": "SPECIES_ZYGARDE" + "species": "SPECIES_DEOXYS" }, { "min_level": 3, "max_level": 3, - "species": "SPECIES_ZYGARDE" + "species": "SPECIES_ORICORIO" }, { "min_level": 2, "max_level": 2, - "species": "SPECIES_ZYGARDE" + "species": "SPECIES_ORICORIO" }, { "min_level": 2, "max_level": 2, - "species": "SPECIES_ZYGARDE" + "species": "SPECIES_ORICORIO" }, { "min_level": 3, diff --git a/src/daycare.c b/src/daycare.c index 73db90a86..9f8411e7c 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1142,7 +1142,8 @@ static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parent { u16 i; u16 species[DAYCARE_MON_COUNT]; - u16 eggSpecies; + u16 eggSpecies, parentSpecies; + bool32 hasMotherEverstone; for (i = 0; i < DAYCARE_MON_COUNT; i++) { @@ -1159,34 +1160,28 @@ static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parent } } + hasMotherEverstone = ItemId_GetHoldEffect(GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM)) == HOLD_EFFECT_PREVENT_EVOLVE; + if (GET_BASE_SPECIES_ID(species[parentSlots[0]]) == GET_BASE_SPECIES_ID(species[parentSlots[1]])) { - bool32 hasSlot0Everstone = ItemId_GetHoldEffect(GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM)) == HOLD_EFFECT_PREVENT_EVOLVE; - bool32 hasSlot1Everstone = ItemId_GetHoldEffect(GetBoxMonData(&daycare->mons[1].mon, MON_DATA_HELD_ITEM)) == HOLD_EFFECT_PREVENT_EVOLVE; - u16 parentSpecies; - - if (hasSlot0Everstone && hasSlot1Everstone) - { + bool32 hasFatherEverstone = ItemId_GetHoldEffect(GetBoxMonData(&daycare->mons[1].mon, MON_DATA_HELD_ITEM)) == HOLD_EFFECT_PREVENT_EVOLVE; + if (hasMotherEverstone && hasFatherEverstone) parentSpecies = species[parentSlots[Random() & 1]]; - } - else if (hasSlot0Everstone) - { + else if (hasMotherEverstone) parentSpecies = species[parentSlots[0]]; - } - else if (hasSlot1Everstone) - { + else if (hasFatherEverstone) parentSpecies = species[parentSlots[1]]; - } else - { parentSpecies = GET_BASE_SPECIES_ID(species[parentSlots[0]]); - } - eggSpecies = GetEggSpecies(parentSpecies); } else { - eggSpecies = GetEggSpecies(species[parentSlots[0]]); + if (hasMotherEverstone) + parentSpecies = species[parentSlots[0]]; + else + parentSpecies = GET_BASE_SPECIES_ID(species[parentSlots[0]]); } + eggSpecies = GetEggSpecies(parentSpecies); if (eggSpecies == SPECIES_NIDORAN_F && daycare->offspringPersonality & EGG_GENDER_MALE) eggSpecies = SPECIES_NIDORAN_M; diff --git a/src/item_use.c b/src/item_use.c index 517563573..ed5986d3b 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -252,6 +252,36 @@ void ItemUseOutOfBattle_Rod(u8 taskId) PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); } +void ItemUseOutOfBattle_FormChange(u8 taskId) +{ + if (!gTasks[taskId].tUsingRegisteredKeyItem) + { + gItemUseCB = ItemUseCB_FormChange; + gTasks[taskId].data[0] = FALSE; + SetUpItemUseOnFieldCallback(taskId); + } + else + { + // TODO: handle key items with callbacks to menus allow to be used by registering them. + PrintNotTheTimeToUseThat(taskId, gTasks[taskId].tUsingRegisteredKeyItem); + } +} + +void ItemUseOutOfBattle_FormChange_ConsumedOnUse(u8 taskId) +{ + if (!gTasks[taskId].tUsingRegisteredKeyItem) + { + gItemUseCB = ItemUseCB_FormChange_ConsumedOnUse; + gTasks[taskId].data[0] = TRUE; + SetUpItemUseOnFieldCallback(taskId); + } + else + { + // TODO: handle key items with callbacks to menus allow to be used by registering them. + PrintNotTheTimeToUseThat(taskId, gTasks[taskId].tUsingRegisteredKeyItem); + } +} + void ItemUseOutOfBattle_RotomCatalog(u8 taskId) { if (!gTasks[taskId].tUsingRegisteredKeyItem) diff --git a/src/party_menu.c b/src/party_menu.c index 89c92f106..4ee8b1251 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -7209,6 +7209,17 @@ bool32 TryMultichoiceFormChange(u8 taskId) } } +void ItemUseCB_FormChange(u8 taskId, TaskFunc task) +{ + TryItemUseFormChange(taskId, task); +} + +void ItemUseCB_FormChange_ConsumedOnUse(u8 taskId, TaskFunc task) +{ + if (TryItemUseFormChange(taskId, task)) + RemoveBagItem(gSpecialVar_ItemId, 1); +} + void ItemUseCB_RotomCatalog(u8 taskId, TaskFunc task) { PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]);