* Added SpeciesInfo fields # Conflicts: # include/pokemon.h * Added missing comments * Renamed gigantamax to isGigantamax * Converted species flags to agbcc bit flags * Added padding after flags * Pikachu form config * Dex text * Reordered Paradox flag * Missing Pikachu ifdef comments * Moved P_GEN_x_POKEMON settings to the species_families file * Gen 1 Dex entries * Renamed file to species_enabled.h * Prevent Pokémon from evolving if their evolution is disabled * Prevent Pokémon from being affected by Eviolite if their evolution is disabled * Prevent Pokémon offspring if they're disabled * Corrected imprementation of evolution prevention It could potentially overwrite items by accident * Cross-evo configs * Gen 2 dex entries * Changed cry table to use assignable IDs # Conflicts: # include/pokemon.h * Form table pointers * Beginning support for moving data to gSpeciesInfo * Pokédexes reads text from gSpeciesInfo * Reading species names from gSpeciesInfo * Fixed erroneous copy-paste * Moved Bulbasaur to Raichu Family data do gSpeciesinfo * Added female pic sizes * Macros for Front, Back, Palette and Learnsets * Sandshrew to Dugtrio Families * Obtains Height/Weight from gSpeciesInfo * Read category from gSpeciesInfo * Removed unused data from pokedex_entries.h * Moved Gen 1 data to gSpeciesInfo * Moved Gen 2 data to gSpeciesInfo + fixed Ursaluna Bloodmoon not producing Teddiursa eggs * Moved Gen 3 data to gSpeciesInfo * Moved Gen 4 data to gSpeciesInfo * HGSS dex properly shows form sprites * Fixed data type for GetSpeciesHeight/Weight * Reading Pokédex Size data from gSpeciesInfo * Cleaned up mon graphic decompression function * Reading Front Pics gSpeciesInfo * Reading Back Pics gSpeciesInfo * Updated uses of GetMonSpritePalStruct to allow loading the data directly instead of reading the struct * Reading palettes from gSpeciesInfo * Reading animation delay from gSpeciesInfo * Fixed Pokémon Debug Menu not reading animation delay * Reading front anim Id from gSpeciesInfo * Reading back anim Id from gSpeciesInfo * Reading Animation Frames from gSpeciesInfo * Reading Icon Sprites from gSpeciesInfo * Reading Icon Palette IDs from gSpeciesInfo * Reading Footprints from gSpeciesInfo * Reading Mon Pic sizes from gSpeciesInfo * Separate mon pic sizes for female mon * Reading Level Up Learnsets from gSpeciesInfo * Reading Teachable Learnsets from gSpeciesInfo * Reading National Dex Number from gSpeciesInfo * Reading Enemy Mon Elevation from gSpeciesInfo * Reading Evolutions from gSpeciesInfo * Reading form table from gSpeciesInfo * Fixed button label inconsistency in pokémon debug menu * Reading form change table from gSpeciesInfo * Removed need to define mon graphics in include/graphics.h * Reordered mon graphics by family * Fixed National dex number offset * gFrontierBannedSpecies now checks IsSpeciesEnabled * Added 3 more toggles for Fusions, Primal Reversions and Ultra Burst * Gen 3 & 4 family toggles for dex entries * Fixed missing Mr. Rime data * Gen 1 dex descriptions as compound strings * Gen 2 dex descriptions as compound strings * Gen 3 dex descriptions as compound strings * Gen 4 dex descriptions as compound strings * Fixed compile in agbcc * Moved Gen 5 data to gSpeciesInfo * Using PLACEHOLDER_ANIM_SINGLE_FRAME when needed (same hash) * Renamed PLACEHOLDER_TWO_FRAME_ANIMATION to PLACEHOLDER_ANIM_TWO_FRAMES * Fixed capitalization for front pic anims * Fixed `CanEvolve` * Moved Gen 6 data to gSpeciesInfo * Gen 7 without macros * Gen 8 without macros * Gen 9 without macros * Fixed Gen 9 sound data * Finished moving Gen 7 data in macros (by Alex) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * Ultra Necrozma is now included in the fusion forms define * Cries are now properly excluded from the rom when disabling species * Removed P_GEN_x_POKEMON from form_change_tables.h * Fixed Yanmega's cry ignoring the P_GEN_4_CROSS_EVOS setting * Added P_NEW_EVOS_IN_REGIONAL_DEX setting * Automatic ASSUMPTION_FAIL when used species are disabled * Finished moving Gen 8 data in macros (by Alex) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * Expanded Alcremie macro * Finished moving Gen 9 data in macros (by Alex) * Fixed missing data for Komala and Marshadow * Form species id tables use family toggles + added missing Ursaluna form species id table * Fixed Genesect palettes * Fixed Flabébé family graphics * Fixed Minior Graphics * Fixed missing Calyrex data * Family toggles in mon graphcis (By Jasper/Bassoonian) Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Fixed missing Ogerpon data * Ordered Level Up Learnsets (missing toggles) Also added White Basculin learnset * Added more Minior synonyms * Fixed enamorus order * Reordered teachable learnsets * Removed sSpeciesXXX level up learnsets + reordered * Removed unneeded assumes * Removed unused extra animations * Family toggles in mon level up learnsets (By Jasper/Bassoonian) Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Fixed Phione graphics inclusion * Family toggles for Teachable Learnsets Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Ordered Front Pic Anims * Family toggles for front pic animations Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Fixed HGSS dex incorrectly showing the wrong mon when catching it * Family toggles for Egg Moves + reodered Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Fixed HGSS not checking for null footprints * Review changes * Fixed Female difference mon not using their macros * Fixed Alcremie Macro * Fixed compile error when disabling the Bulbasaur family * Fixed Turtwig and Chimchar family + Houndour and Mareep cries not being excluded properly * Re-added missing Egg graphical data * Fixed crash during the Birch Intro when Lotad is disabled * Renamed PALLETE to PALETTES * Removed extra spacing for YOffsets * Fixed compile when only disabling cross-gen evolutions * Added Tera Forms define (Ogerpon and Terapagos) * Fixed Necrozma macro * Removed .noFlip = FALSE * Fixed dex number in summary screen for forms when nat dex is disabled * Fixed Paldean form paths --------- Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
236 lines
5.9 KiB
C
236 lines
5.9 KiB
C
#include "global.h"
|
|
#include "international_string_util.h"
|
|
#include "list_menu.h"
|
|
#include "pokedex.h"
|
|
#include "script_menu.h"
|
|
#include "string_util.h"
|
|
#include "strings.h"
|
|
#include "text.h"
|
|
#include "window.h"
|
|
|
|
|
|
int GetStringCenterAlignXOffset(int fontId, const u8 *str, int totalWidth)
|
|
{
|
|
return GetStringCenterAlignXOffsetWithLetterSpacing(fontId, str, totalWidth, 0);
|
|
}
|
|
|
|
int GetStringRightAlignXOffset(int fontId, const u8 *str, int totalWidth)
|
|
{
|
|
return GetStringWidthDifference(fontId, str, totalWidth, 0);
|
|
}
|
|
|
|
int GetStringCenterAlignXOffsetWithLetterSpacing(int fontId, const u8 *str, int totalWidth, int letterSpacing)
|
|
{
|
|
return GetStringWidthDifference(fontId, str, totalWidth, letterSpacing) / 2;
|
|
}
|
|
|
|
int GetStringWidthDifference(int fontId, const u8 *str, int totalWidth, int letterSpacing)
|
|
{
|
|
int stringWidth = GetStringWidth(fontId, str, letterSpacing);
|
|
if (totalWidth > stringWidth)
|
|
return totalWidth - stringWidth;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
int GetMaxWidthInMenuTable(const struct MenuAction *actions, int numActions)
|
|
{
|
|
int i, maxWidth;
|
|
|
|
for (maxWidth = 0, i = 0; i < numActions; i++)
|
|
{
|
|
int stringWidth = GetStringWidth(FONT_NORMAL, actions[i].text, 0);
|
|
if (stringWidth > maxWidth)
|
|
maxWidth = stringWidth;
|
|
}
|
|
|
|
return ConvertPixelWidthToTileWidth(maxWidth);
|
|
}
|
|
|
|
int GetMaxWidthInSubsetOfMenuTable(const struct MenuAction *actions, const u8 *actionIds, int numActions)
|
|
{
|
|
int i, maxWidth;
|
|
|
|
for (maxWidth = 0, i = 0; i < numActions; i++)
|
|
{
|
|
int stringWidth = GetStringWidth(FONT_NORMAL, actions[actionIds[i]].text, 0);
|
|
if (stringWidth > maxWidth)
|
|
maxWidth = stringWidth;
|
|
}
|
|
|
|
return ConvertPixelWidthToTileWidth(maxWidth);
|
|
}
|
|
|
|
int Intl_GetListMenuWidth(const struct ListMenuTemplate *listMenu)
|
|
{
|
|
int i, maxWidth, finalWidth;
|
|
const struct ListMenuItem *items = listMenu->items;
|
|
|
|
maxWidth = 0;
|
|
for (i = 0; i < listMenu->totalItems; i++)
|
|
{
|
|
int width = GetStringWidth(listMenu->fontId, items[i].name, 0);
|
|
if (width > maxWidth)
|
|
maxWidth = width;
|
|
}
|
|
|
|
finalWidth = maxWidth + listMenu->item_X + 9;
|
|
if (finalWidth < 0)
|
|
finalWidth += 7;
|
|
|
|
finalWidth >>= 3;
|
|
if (finalWidth > 28)
|
|
finalWidth = 28;
|
|
|
|
return finalWidth;
|
|
}
|
|
|
|
void CopyMonCategoryText(u16 species, u8 *dest)
|
|
{
|
|
u8 *str = StringCopy(dest, GetSpeciesCategory(species));
|
|
*str = CHAR_SPACE;
|
|
StringCopy(str + 1, gText_Pokemon);
|
|
}
|
|
|
|
u8 *GetStringClearToWidth(u8 *dest, int fontId, const u8 *str, int totalStringWidth)
|
|
{
|
|
u8 *buffer;
|
|
int width;
|
|
int clearWidth;
|
|
|
|
if (str)
|
|
{
|
|
buffer = StringCopy(dest, str);
|
|
width = GetStringWidth(fontId, str, 0);
|
|
}
|
|
else
|
|
{
|
|
buffer = dest;
|
|
width = 0;
|
|
}
|
|
|
|
clearWidth = totalStringWidth - width;
|
|
if (clearWidth > 0)
|
|
{
|
|
*(buffer++) = EXT_CTRL_CODE_BEGIN;
|
|
*(buffer++) = EXT_CTRL_CODE_CLEAR;
|
|
*(buffer++) = clearWidth;
|
|
*buffer = EOS;
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
|
|
void PadNameString(u8 *dest, u8 padChar)
|
|
{
|
|
u8 length;
|
|
|
|
StripExtCtrlCodes(dest);
|
|
length = StringLength(dest);
|
|
if (padChar == EXT_CTRL_CODE_BEGIN)
|
|
{
|
|
while (length < PLAYER_NAME_LENGTH - 1)
|
|
{
|
|
dest[length] = EXT_CTRL_CODE_BEGIN;
|
|
dest[length + 1] = EXT_CTRL_CODE_RESET_FONT;
|
|
length += 2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (length < PLAYER_NAME_LENGTH - 1)
|
|
{
|
|
dest[length] = padChar;
|
|
length++;
|
|
}
|
|
}
|
|
|
|
dest[length] = EOS;
|
|
}
|
|
|
|
void ConvertInternationalPlayerName(u8 *str)
|
|
{
|
|
if (StringLength(str) < PLAYER_NAME_LENGTH - 1)
|
|
ConvertInternationalString(str, LANGUAGE_JAPANESE);
|
|
else
|
|
StripExtCtrlCodes(str);
|
|
}
|
|
|
|
void ConvertInternationalPlayerNameStripChar(u8 *str, u8 removeChar)
|
|
{
|
|
u8 *buffer;
|
|
if (StringLength(str) < PLAYER_NAME_LENGTH - 1)
|
|
{
|
|
ConvertInternationalString(str, LANGUAGE_JAPANESE);
|
|
}
|
|
else if (removeChar == EXT_CTRL_CODE_BEGIN)
|
|
{
|
|
StripExtCtrlCodes(str);
|
|
}
|
|
else
|
|
{
|
|
buffer = str;
|
|
while (buffer[1] != EOS)
|
|
buffer++;
|
|
|
|
while (buffer >= str && buffer[0] == removeChar)
|
|
{
|
|
buffer[0] = EOS;
|
|
buffer--;
|
|
}
|
|
}
|
|
}
|
|
|
|
void ConvertInternationalContestantName(u8 *str)
|
|
{
|
|
if (*str++ == EXT_CTRL_CODE_BEGIN && *str++ == EXT_CTRL_CODE_JPN)
|
|
{
|
|
while (*str != EOS)
|
|
{
|
|
if (str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_ENG)
|
|
return;
|
|
|
|
str++;
|
|
}
|
|
|
|
*str++ = EXT_CTRL_CODE_BEGIN;
|
|
*str++ = EXT_CTRL_CODE_ENG;
|
|
*str = EOS;
|
|
}
|
|
}
|
|
|
|
void TVShowConvertInternationalString(u8 *dest, const u8 *src, int language)
|
|
{
|
|
StringCopy(dest, src);
|
|
ConvertInternationalString(dest, language);
|
|
}
|
|
|
|
// It's impossible to distinguish between Latin languages just from a string alone, so the function defaults to LANGUAGE_ENGLISH. This is the case in all of the versions of the game.
|
|
int GetNicknameLanguage(u8 *str)
|
|
{
|
|
if (str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_JPN)
|
|
return LANGUAGE_JAPANESE;
|
|
else
|
|
return LANGUAGE_ENGLISH;
|
|
}
|
|
|
|
// Used by Pokénav's Match Call to erase the previous trainer's flavor text when switching between their info pages.
|
|
void FillWindowTilesByRow(int windowId, int columnStart, int rowStart, int numFillTiles, int numRows)
|
|
{
|
|
u8 *windowTileData;
|
|
int fillSize, windowRowSize, i;
|
|
struct Window *window = &gWindows[windowId];
|
|
|
|
fillSize = numFillTiles * TILE_SIZE_4BPP;
|
|
windowRowSize = window->window.width * TILE_SIZE_4BPP;
|
|
windowTileData = window->tileData + (rowStart * windowRowSize) + (columnStart * TILE_SIZE_4BPP);
|
|
if (numRows > 0)
|
|
{
|
|
for (i = numRows; i != 0; i--)
|
|
{
|
|
CpuFastFill8(0x11, windowTileData, fillSize);
|
|
windowTileData += windowRowSize;
|
|
}
|
|
}
|
|
}
|