diff --git a/graphics/pokedex/cry_screen.bin b/graphics/pokedex/cry_screen.bin index 411311b531..5e5087ae0d 100644 Binary files a/graphics/pokedex/cry_screen.bin and b/graphics/pokedex/cry_screen.bin differ diff --git a/graphics/pokedex/evo_tileset.bin b/graphics/pokedex/evo_tileset.bin new file mode 100644 index 0000000000..18bcc40a13 Binary files /dev/null and b/graphics/pokedex/evo_tileset.bin differ diff --git a/graphics/pokedex/evo_tileset.png b/graphics/pokedex/evo_tileset.png new file mode 100644 index 0000000000..9e6df6b283 Binary files /dev/null and b/graphics/pokedex/evo_tileset.png differ diff --git a/graphics/pokedex/info_screen.bin b/graphics/pokedex/info_screen.bin index 4fe214f815..cc30551abc 100644 Binary files a/graphics/pokedex/info_screen.bin and b/graphics/pokedex/info_screen.bin differ diff --git a/graphics/pokedex/menu.png b/graphics/pokedex/menu.png index 302bbba4c3..e9bcae9a1f 100644 Binary files a/graphics/pokedex/menu.png and b/graphics/pokedex/menu.png differ diff --git a/graphics/pokedex/menu_rest.png b/graphics/pokedex/menu_rest.png index 724ef52010..e4b649c870 100644 Binary files a/graphics/pokedex/menu_rest.png and b/graphics/pokedex/menu_rest.png differ diff --git a/graphics/pokedex/screen_select_bar_submenu.bin b/graphics/pokedex/screen_select_bar_submenu.bin index 5b94416834..390bcbd3f0 100644 Binary files a/graphics/pokedex/screen_select_bar_submenu.bin and b/graphics/pokedex/screen_select_bar_submenu.bin differ diff --git a/graphics/pokedex/size_screen.bin b/graphics/pokedex/size_screen.bin index cbcfbf3412..9260fbf368 100644 Binary files a/graphics/pokedex/size_screen.bin and b/graphics/pokedex/size_screen.bin differ diff --git a/graphics/pokedex/stats_screen.bin b/graphics/pokedex/stats_screen.bin index 0156472a3a..a6eb2fd162 100644 Binary files a/graphics/pokedex/stats_screen.bin and b/graphics/pokedex/stats_screen.bin differ diff --git a/include/graphics.h b/include/graphics.h index 6c78508593..1ffc6e9828 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3286,6 +3286,7 @@ extern const u32 gBattleTerrainPalette_StadiumWallace[]; extern const u32 gPokedexInterface_Gfx[]; extern const u16 gPokedexBgHoenn_Pal[]; extern const u32 gPokedexMenuRest_Gfx[]; +extern const u32 gPokedexEvo_Gfx[]; extern const u32 gPokedexMenuList_Gfx[]; extern const u32 gPokedexMenu_Gfx[]; extern const u8 gPokedexList_Tilemap[]; @@ -3296,6 +3297,7 @@ extern const u16 gPokedexSearchResults_Pal[]; extern const u16 gPokedexBgNational_Pal[]; extern const u8 gPokedexInfoScreen_Tilemap[]; extern const u8 gPokedexStatsScreen_Tilemap[]; +extern const u8 gPokedexEvolutionScreen_Tilemap[]; extern const u8 gPokedexCryScreen_Tilemap[]; extern const u8 gPokedexSizeScreen_Tilemap[]; extern const u8 gPokedexScreenSelectBarMain_Tilemap[]; diff --git a/include/strings.h b/include/strings.h index 5f224e2459..fd773e7f52 100644 --- a/include/strings.h +++ b/include/strings.h @@ -595,6 +595,41 @@ extern const u8 gText_Stats_eggGroup_UNDISCOVERED[]; extern const u8 gText_Dex_SEEN[]; extern const u8 gText_Dex_OWN[]; +extern const u8 gText_EVO_Name[]; +extern const u8 gText_EVO_FRIENDSHIP[]; +extern const u8 gText_EVO_FRIENDSHIP_DAY[]; +extern const u8 gText_EVO_FRIENDSHIP_NIGHT[]; +extern const u8 gText_EVO_LEVEL[]; +extern const u8 gText_EVO_TRADE[]; +extern const u8 gText_EVO_TRADE_ITEM[]; +extern const u8 gText_EVO_ITEM[]; +extern const u8 gText_EVO_LEVEL_ATK_GT_DEF[]; +extern const u8 gText_EVO_LEVEL_ATK_EQ_DEF[]; +extern const u8 gText_EVO_LEVEL_ATK_LT_DEF[]; +extern const u8 gText_EVO_LEVEL_SILCOON[]; +extern const u8 gText_EVO_LEVEL_CASCOON[]; +extern const u8 gText_EVO_LEVEL_NINJASK[]; +extern const u8 gText_EVO_LEVEL_SHEDINJA[]; +extern const u8 gText_EVO_BEAUTY[]; +extern const u8 gText_EVO_LEVEL_FEMALE[]; +extern const u8 gText_EVO_LEVEL_MALE[]; +extern const u8 gText_EVO_LEVEL_NIGHT[]; +extern const u8 gText_EVO_LEVEL_DAY[]; +extern const u8 gText_EVO_LEVEL_DUSK[]; +extern const u8 gText_EVO_ITEM_HOLD_DAY[]; +extern const u8 gText_EVO_ITEM_HOLD_NIGHT[]; +extern const u8 gText_EVO_MOVE[]; +extern const u8 gText_EVO_MOVE_TYPE[]; +extern const u8 gText_EVO_MAPSEC[]; +extern const u8 gText_EVO_ITEM_MALE[]; +extern const u8 gText_EVO_ITEM_FEMALE[]; +extern const u8 gText_EVO_LEVEL_RAIN[]; +extern const u8 gText_EVO_SPECIFIC_MON_IN_PARTY[]; +extern const u8 gText_EVO_LEVEL_DARK_TYPE_MON_IN_PARTY[]; +extern const u8 gText_EVO_TRADE_SPECIFIC_MON[]; +extern const u8 gText_EVO_SPECIFIC_MAP[]; +extern const u8 gText_EVO_NONE[]; + // birch dex rating text extern const u8 gBirchDexRatingText_LessThan10[]; diff --git a/src/graphics.c b/src/graphics.c index 6ee521d1c5..8abc6d76fb 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1258,6 +1258,7 @@ const u16 gPokedexCaughtScreen_Pal[] = INCBIN_U16("graphics/pokedex/caught_scree const u16 gPokedexSearchResults_Pal[] = INCBIN_U16("graphics/pokedex/search_results_bg.gbapal"); const u16 gPokedexBgNational_Pal[] = INCBIN_U16("graphics/pokedex/bg_national.gbapal"); const u32 gPokedexMenuRest_Gfx[] = INCBIN_U32("graphics/pokedex/menu_rest.4bpp.lz"); +const u32 gPokedexEvo_Gfx[] = INCBIN_U32("graphics/pokedex/evo_tileset.4bpp.lz"); const u32 gPokedexMenuList_Gfx[] = INCBIN_U32("graphics/pokedex/menu_list.4bpp.lz"); const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.lz"); const u32 gPokedexInterface_Gfx[] = INCBIN_U32("graphics/pokedex/interface.4bpp.lz"); @@ -1275,6 +1276,7 @@ const u32 gPokedexScreenSelectBarSubmenu_Tilemap_Clear[] = INCBIN_U32("graphics/ // const u32 gPokedexScreenSelectBarSubmenu_Size_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_submenu_size.bin.lz"); const u32 gPokedexInfoScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/info_screen.bin.lz"); const u32 gPokedexStatsScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/stats_screen.bin.lz"); +const u32 gPokedexEvolutionScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/evo_tileset.bin.lz"); const u32 gPokedexCryScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/cry_screen.bin.lz"); const u16 gPokedexSearchMenu_Pal[] = INCBIN_U16("graphics/pokedex/search_menu.gbapal"); const u32 gPokedexSearchMenu_Gfx[] = INCBIN_U32("graphics/pokedex/search_menu.4bpp.lz"); diff --git a/src/pokedex.c b/src/pokedex.c index b6bbba63d1..b426da226c 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -60,6 +60,7 @@ enum { INFO_SCREEN, STATS_SCREEN, + EVO_SCREEN, AREA_SCREEN, CRY_SCREEN, SIZE_SCREEN, @@ -348,6 +349,11 @@ static void PrintMonStatsToggle(u8 taskId); static void PrintInfoScreenTextWhite(const u8* str, u8 left, u8 top); static void PrintInfoScreenTextSmall(const u8* str, u8 left, u8 top); static void PrintInfoScreenTextSmallWhite(const u8* str, u8 left, u8 top); +static void Task_LoadEvolutionScreen(u8 taskId); +static void Task_HandleEvolutionScreenInput(u8 taskId); +static void Task_SwitchScreensFromEvolutionScreen(u8 taskId); +static void Task_ExitEvolutionScreen(u8 taskId); +static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species); #ifdef BATTLE_ENGINE static u8 ShowSplitIcon(u32 split); //Physical/Special Split from BE @@ -3910,7 +3916,7 @@ static void Task_SwitchScreensFromCryScreen(u8 taskId) gTasks[taskId].func = Task_LoadInfoScreen; break; case 2: - gTasks[taskId].func = Task_LoadStatsScreen; + gTasks[taskId].func = Task_LoadEvolutionScreen; break; case 3: gTasks[taskId].func = Task_LoadSizeScreen; @@ -6114,7 +6120,12 @@ static void Task_LoadStatsScreen(u8 taskId) //Icon FreeMonIconPalettes(); //Free space for new pallete LoadMonIconPalette(NationalPokedexNumToSpecies(sPokedexListItem->dexNum)); //Loads pallete for current mon - gTasks[taskId].data[4] = CreateMonIcon(NationalPokedexNumToSpecies(sPokedexListItem->dexNum), SpriteCB_MonIcon, 17, 31, 4, 0, TRUE); //Create pokemon sprite + #ifndef POKEMON_EXPANSION + gTasks[taskId].data[4] = CreateMonIcon(NationalPokedexNumToSpecies(sPokedexListItem->dexNum), SpriteCB_MonIcon, 17, 31, 4, 0, TRUE); //Create pokemon sprite + #endif + #ifdef POKEMON_EXPANSION + gTasks[taskId].data[6] = CreateMonIcon(NationalPokedexNumToSpecies(sPokedexListItem->dexNum), SpriteCB_MonIcon, 17, 31, 4, 0); //Create pokemon sprite + #endif gSprites[gTasks[taskId].data[4]].oam.priority = 0; } gMain.state++; @@ -6239,14 +6250,13 @@ static void Task_HandleStatsScreenInput(u8 taskId) PlaySE(SE_FAILURE); else { - sPokedexView->selectedScreen = AREA_SCREEN; + sPokedexView->selectedScreen = EVO_SCREEN; BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); - sPokedexView->screenSwitchState = 2; + sPokedexView->screenSwitchState = 3; gTasks[taskId].func = Task_SwitchScreensFromStatsScreen; PlaySE(SE_PIN); } } - } #define ITEM_TAG 0xFDF3 static void DestroyMoveIcon(u8 taskId) @@ -6848,6 +6858,9 @@ static void Task_SwitchScreensFromStatsScreen(u8 taskId) case 2: gTasks[taskId].func = Task_LoadCryScreen; break; + case 3: + gTasks[taskId].func = Task_LoadEvolutionScreen; + break; default: gTasks[taskId].func = Task_LoadInfoScreen; break; @@ -6882,7 +6895,6 @@ static u8 ShowSplitIcon(u32 split) StartSpriteAnim(&gSprites[sPokedexView->splitIconSpriteId], split); return sPokedexView->splitIconSpriteId; } - static void DestroySplitIcon(void) { if (sPokedexView->splitIconSpriteId != 0xFF) @@ -6890,3 +6902,465 @@ static void DestroySplitIcon(void) sPokedexView->splitIconSpriteId = 0xFF; } #endif + +//PokedexPlus HGSS_Ui Evolution Page +static void Task_LoadEvolutionScreen(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + u16 r2; + + sPokedexView->currentPage = EVO_SCREEN; + gPokedexVBlankCB = gMain.vblankCallback; + SetVBlankCallback(NULL); + r2 = 0; + if (gTasks[taskId].data[1] != 0) + r2 += DISPCNT_OBJ_ON; + if (gTasks[taskId].data[2] != 0) + r2 |= DISPCNT_BG1_ON; + ResetOtherVideoRegisters(r2); + gMain.state = 1; + } + break; + case 1: + DecompressAndLoadBgGfxUsingHeap(3, gPokedexEvo_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, gPokedexEvolutionScreen_Tilemap, 0, 0); + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); + PutWindowTilemap(WIN_INFO); + CopyWindowToVram(WIN_INFO, 3); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 2: + LoadScreenSelectBarMain(0xD); + LoadPokedexBgPalette(sPokedexView->isSearchResults); + gMain.state++; + break; + case 3: + if (gTasks[taskId].data[1] == 0) + { + //Icon + FreeMonIconPalettes(); //Free space for new pallete + LoadMonIconPalette(NationalPokedexNumToSpecies(sPokedexListItem->dexNum)); //Loads pallete for current mon + #ifndef POKEMON_EXPANSION + gTasks[taskId].data[4] = CreateMonIcon(NationalPokedexNumToSpecies(sPokedexListItem->dexNum), SpriteCB_MonIcon, 17, 31, 4, 0, TRUE); //Create pokemon sprite + #endif + #ifdef POKEMON_EXPANSION + gTasks[taskId].data[4] = CreateMonIcon(NationalPokedexNumToSpecies(sPokedexListItem->dexNum), SpriteCB_MonIcon, 17, 31, 4, 0); //Create pokemon sprite + #endif + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + } + gMain.state++; + break; + case 4: + //Print evo info and icons + gTasks[taskId].data[3] = 0; + PrintEvolutionTargetSpeciesAndMethod(taskId, NationalPokedexNumToSpecies(sPokedexListItem->dexNum)); + gMain.state++; + break; + case 5: + { + u32 preservedPalettes = 0; + + if (gTasks[taskId].data[2] != 0) + preservedPalettes = 0x14; // each bit represents a palette index + if (gTasks[taskId].data[1] != 0) + preservedPalettes |= (1 << (gSprites[gTasks[taskId].tMonSpriteId].oam.paletteNum + 16)); + BeginNormalPaletteFade(~preservedPalettes, 0, 16, 0, RGB_BLACK); + SetVBlankCallback(gPokedexVBlankCB); + gMain.state++; + } + break; + case 6: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + HideBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 7: + if (!gPaletteFade.active) + gMain.state++; + break; + case 8: + gMain.state++; + break; + case 9: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 1; + gTasks[taskId].func = Task_HandleEvolutionScreenInput; + gMain.state = 0; + break; + } +} +static void Task_HandleEvolutionScreenInput(u8 taskId) +{ + //Exit to overview + if (JOY_NEW(B_BUTTON)) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_ExitEvolutionScreen; + PlaySE(SE_PC_OFF); + return; + } + + //Switch screens + if ((JOY_NEW(DPAD_LEFT) || (JOY_NEW(L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR))) + { + sPokedexView->selectedScreen = STATS_SCREEN; + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + sPokedexView->screenSwitchState = 1; + gTasks[taskId].func = Task_SwitchScreensFromEvolutionScreen; + PlaySE(SE_PIN); + } + if ((JOY_NEW(DPAD_RIGHT) || (JOY_NEW(R_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR))) + { + if (!sPokedexListItem->owned) + PlaySE(SE_FAILURE); + else + { + sPokedexView->selectedScreen = CRY_SCREEN; + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + sPokedexView->screenSwitchState = 2; + gTasks[taskId].func = Task_SwitchScreensFromEvolutionScreen; + PlaySE(SE_PIN); + } + } +} +static void handleTargetSpeciesPrint(u8 taskId, u16 targetSpecies, u8 base_x, u8 base_y, u8 base_offset, u8 base_i) +{ + StringCopy(gStringVar3, gSpeciesNames[targetSpecies]); //evolution mon name + StringExpandPlaceholders(gStringVar3, gText_EVO_Name); //evolution mon name + PrintInfoScreenTextSmall(gStringVar3, base_x, base_y + base_offset*base_i); //evolution mon name + + if(base_i < 6) + { + LoadMonIconPalette(targetSpecies); //Loads pallete for current mon + #ifndef POKEMON_EXPANSION + gTasks[taskId].data[4+base_i] = CreateMonIcon(targetSpecies, SpriteCB_MonIcon, 50 + 32*base_i, 31, 4, 0, TRUE); //Create pokemon sprite + #endif + #ifdef POKEMON_EXPANSION + gTasks[taskId].data[4+base_i] = CreateMonIcon(targetSpecies, SpriteCB_MonIcon, 50 + 32*base_i, 31, 4, 0); //Create pokemon sprite + #endif + gSprites[gTasks[taskId].data[4+base_i]].oam.priority = 0; + } +} +#define EVO_SCREEN_LVL_DIGITS 2 +static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species) +{ + int i; + #ifdef POKEMON_EXPANSION + int j; + u16 currentMap; + #endif + u16 targetSpecies = 0; + + u16 item; + + bool8 left = TRUE; + u8 base_x = 5; + u8 base_x_offset = 54; + u8 base_y = 52; + u8 base_offset = 9; + u8 base_i = 0; + u8 times = 0; + + StringCopy(gStringVar1, gSpeciesNames[species]); + + //Calculate number of possible direct evolutions (e.g. Eevee has 5 but torchic has 1) + for (i = 0; i < EVOS_PER_MON; i++) + { + if(gEvolutionTable[species][i].method != 0) + times += 1; + gTasks[taskId].data[3] = times; + } + + //If there are no evolutions print text + if (times == 0) + { + StringExpandPlaceholders(gStringVar4, gText_EVO_NONE); + PrintInfoScreenTextSmall(gStringVar4, base_x, base_y + base_offset*base_i); + } + + //If there are evolutions find out which and print them 1 by 1 + for (i = 0; i < times; i++) + { + base_i = i; + left = !left; + switch (gEvolutionTable[species][i].method) + { + case EVO_FRIENDSHIP: + targetSpecies = gEvolutionTable[species][i].targetSpecies; + ConvertIntToDecimalStringN(gStringVar2, 220, STR_CONV_MODE_LEADING_ZEROS, 3); //friendship value + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_FRIENDSHIP ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_FRIENDSHIP_DAY: + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_FRIENDSHIP_DAY ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_FRIENDSHIP_NIGHT: + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_FRIENDSHIP_NIGHT ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL: + targetSpecies = gEvolutionTable[species][i].targetSpecies; + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_TRADE: + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_TRADE ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_TRADE_ITEM: + item = gEvolutionTable[species][i].param; //item + CopyItemName(item, gStringVar2); //item + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_TRADE_ITEM ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_ITEM: + item = gEvolutionTable[species][i].param; + CopyItemName(item, gStringVar2); + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_ITEM ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_ATK_GT_DEF: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_ATK_GT_DEF ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_ATK_EQ_DEF: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_ATK_EQ_DEF ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_ATK_LT_DEF: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon namee + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_ATK_LT_DEF ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_SILCOON: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_SILCOON ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_CASCOON: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_CASCOON ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_NINJASK: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_NINJASK ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_BEAUTY: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, 3); //beauty + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_BEAUTY ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + #ifdef POKEMON_EXPANSION + case EVO_LEVEL_FEMALE: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_FEMALE ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_MALE: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_MALE ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_NIGHT: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_NIGHT ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_DAY: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_DAY ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_DUSK: + ConvertIntToDecimalStringN(gStringVar2, gEvolutionTable[species][i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_DUSK ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_ITEM_HOLD_DAY: + item = gEvolutionTable[species][i].param; //item + CopyItemName(item, gStringVar2); //item + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_ITEM_HOLD_DAY ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_ITEM_HOLD_NIGHT: + item = gEvolutionTable[species][i].param; //item + CopyItemName(item, gStringVar2); //item + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_ITEM_HOLD_NIGHT ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_MOVE: + StringCopy(gStringVar2, gMoveNames[gEvolutionTable[species][i].param]); + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_MOVE ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_MOVE_TYPE: + StringCopy(gStringVar2, gTypeNames[gEvolutionTable[species][i].param]); + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_MOVE_TYPE ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_MAPSEC: + StringCopy(gStringVar2, gRegionMapEntries[gEvolutionTable[species][i].param].name); + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_MAPSEC ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_ITEM_MALE: + item = gEvolutionTable[species][i].param; //item + CopyItemName(item, gStringVar2); //item + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_ITEM_MALE ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_ITEM_FEMALE: + item = gEvolutionTable[species][i].param; //item + CopyItemName(item, gStringVar2); //item + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_ITEM_FEMALE ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_RAIN: + //if (j == WEATHER_RAIN || j == WEATHER_RAIN_THUNDERSTORM || j == WEATHER_DOWNPOUR) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_RAIN ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_SPECIFIC_MON_IN_PARTY: + StringCopy(gStringVar2, gSpeciesNames[gEvolutionTable[species][i].param]); //mon name + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_SPECIFIC_MON_IN_PARTY ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_LEVEL_DARK_TYPE_MON_IN_PARTY: + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_LEVEL_DARK_TYPE_MON_IN_PARTY ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_TRADE_SPECIFIC_MON: + StringCopy(gStringVar2, gSpeciesNames[gEvolutionTable[species][i].param]); //mon name + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_TRADE_SPECIFIC_MON ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + case EVO_SPECIFIC_MAP: + //currentMap = ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum); + GetMapName(gStringVar2, gEvolutionTable[species][i].param, 0); + targetSpecies = gEvolutionTable[species][i].targetSpecies; + handleTargetSpeciesPrint(taskId, targetSpecies, base_x, base_y, base_offset, base_i); //evolution mon name + StringExpandPlaceholders(gStringVar4, gText_EVO_SPECIFIC_MAP ); + PrintInfoScreenTextSmall(gStringVar4, base_x+base_x_offset, base_y + base_offset*base_i); + break; + #endif + }//Switch end + }//For loop end +} +static void Task_SwitchScreensFromEvolutionScreen(u8 taskId) +{ + if (!gPaletteFade.active) + { + FreeMonIconPalettes(); //Destroy pokemon icon sprite + FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].data[4]]); //Destroy pokemon icon sprite + + FreeAndDestroyMonPicSprite(gTasks[taskId].tMonSpriteId); + switch (sPokedexView->screenSwitchState) + { + case 1: + gTasks[taskId].func = Task_LoadStatsScreen; + break; + case 2: + gTasks[taskId].func = Task_LoadCryScreen; + break; + default: + gTasks[taskId].func = Task_LoadInfoScreen; + break; + } + } +} +static void Task_ExitEvolutionScreen(u8 taskId) +{ + u8 i; + if (!gPaletteFade.active) + { + FreeMonIconPalettes(); //Destroy pokemon icon sprite + FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].data[4]]); //Destroy pokemon icon sprite + for (i = 1; i <= gTasks[taskId].data[3]; i++) + { + FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].data[4+i]]); //Destroy pokemon icon sprite + } + + FreeAndDestroyMonPicSprite(gTasks[taskId].tMonSpriteId); + FreeInfoScreenWindowAndBgBuffers(); + DestroyTask(taskId); + } +} diff --git a/src/strings.c b/src/strings.c index f8b3ede6de..f36626461a 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1880,3 +1880,38 @@ const u8 gText_Stats_eggGroup_DRAGON[] = _("DRAGON"); const u8 gText_Stats_eggGroup_UNDISCOVERED[]= _("---"); const u8 gText_Dex_SEEN[] = _("SEEN"); const u8 gText_Dex_OWN[] = _("OWN"); + +const u8 gText_EVO_Name[] = _("{STR_VAR_3}:"); +const u8 gText_EVO_FRIENDSHIP[] = _("Lvl up with friendship >= 220"); +const u8 gText_EVO_FRIENDSHIP_DAY[] = _("Lvl up at day with friendship >= 220"); +const u8 gText_EVO_FRIENDSHIP_NIGHT[] = _("Lvl up at night with friendship >= 220"); +const u8 gText_EVO_LEVEL[] = _("Lvl up to {STR_VAR_2}"); +const u8 gText_EVO_TRADE[] = _("via trading"); +const u8 gText_EVO_TRADE_ITEM[] = _("via trading while holding {STR_VAR_2}"); +const u8 gText_EVO_ITEM[] = _("{STR_VAR_2} is used on Pokémon"); +const u8 gText_EVO_LEVEL_ATK_GT_DEF[] = _("Lvl up to {STR_VAR_2} with attack > defense"); +const u8 gText_EVO_LEVEL_ATK_EQ_DEF[] = _("Lvl up to {STR_VAR_2} with attack = defense"); +const u8 gText_EVO_LEVEL_ATK_LT_DEF[] = _("Lvl up to {STR_VAR_2} with attack < defense"); +const u8 gText_EVO_LEVEL_SILCOON[] = _("Lvl up to {STR_VAR_2} with Silcoon persona"); +const u8 gText_EVO_LEVEL_CASCOON[] = _("Lvl up to {STR_VAR_2} with Cascoon persona"); +const u8 gText_EVO_LEVEL_NINJASK[] = _("Lvl up to {STR_VAR_2} (special value for Ninjask)"); +const u8 gText_EVO_LEVEL_SHEDINJA[] = _("Lvl up to {STR_VAR_2} (special value for Shedinja)"); +const u8 gText_EVO_BEAUTY[] = _("Lvl up with beauty >= {STR_VAR_2}"); +const u8 gText_EVO_LEVEL_FEMALE[] = _("Lvl up to {STR_VAR_2}, is female"); +const u8 gText_EVO_LEVEL_MALE[] = _("Lvl up to {STR_VAR_2}, is male"); +const u8 gText_EVO_LEVEL_NIGHT[] = _("Lvl up to {STR_VAR_2} at night"); +const u8 gText_EVO_LEVEL_DAY[] = _("Lvl up to {STR_VAR_2} at day"); +const u8 gText_EVO_LEVEL_DUSK[] = _("Lvl up to {STR_VAR_2} at dusk (5-6 P.M)"); +const u8 gText_EVO_ITEM_HOLD_DAY[] = _("Lvl up, holds {STR_VAR_2} at day"); +const u8 gText_EVO_ITEM_HOLD_NIGHT[] = _("Lvl up, holds{STR_VAR_2} at night"); +const u8 gText_EVO_MOVE[] = _("Lvl up, knows {STR_VAR_2}"); +const u8 gText_EVO_MOVE_TYPE[] = _("Lvl up, knows {STR_VAR_2} type move"); +const u8 gText_EVO_MAPSEC[] = _("Lvl up on {STR_VAR_2}"); +const u8 gText_EVO_ITEM_MALE[] = _("{STR_VAR_2} used on male"); +const u8 gText_EVO_ITEM_FEMALE[] = _("{STR_VAR_2} used on female"); +const u8 gText_EVO_LEVEL_RAIN[] = _("Lvl up to {STR_VAR_2} while raining"); +const u8 gText_EVO_SPECIFIC_MON_IN_PARTY[] = _("Lvl up with a {STR_VAR_2} in party"); +const u8 gText_EVO_LEVEL_DARK_TYPE_MON_IN_PARTY[] = _("Lvl up with with dark type in party"); +const u8 gText_EVO_TRADE_SPECIFIC_MON[] = _("is traded for a {STR_VAR_2}"); +const u8 gText_EVO_SPECIFIC_MAP[] = _("Lvl up on {STR_VAR_2}"); +const u8 gText_EVO_NONE[] = _("There is no evolution for {STR_VAR_1}.");