* 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>
221 lines
5.7 KiB
C
221 lines
5.7 KiB
C
#include "global.h"
|
|
#include "data.h"
|
|
#include "event_data.h"
|
|
#include "pokedex.h"
|
|
#include "pokemon.h"
|
|
#include "pokemon_size_record.h"
|
|
#include "string_util.h"
|
|
#include "text.h"
|
|
|
|
#define DEFAULT_MAX_SIZE 0x8000 // was 0x8100 in Ruby/Sapphire
|
|
|
|
struct UnknownStruct
|
|
{
|
|
u16 unk0;
|
|
u8 unk2;
|
|
u16 unk4;
|
|
};
|
|
|
|
static const struct UnknownStruct sBigMonSizeTable[] =
|
|
{
|
|
{ 290, 1, 0 },
|
|
{ 300, 1, 10 },
|
|
{ 400, 2, 110 },
|
|
{ 500, 4, 310 },
|
|
{ 600, 20, 710 },
|
|
{ 700, 50, 2710 },
|
|
{ 800, 100, 7710 },
|
|
{ 900, 150, 17710 },
|
|
{ 1000, 150, 32710 },
|
|
{ 1100, 100, -17826 },
|
|
{ 1200, 50, -7826 },
|
|
{ 1300, 20, -2826 },
|
|
{ 1400, 5, -826 },
|
|
{ 1500, 2, -326 },
|
|
{ 1600, 1, -126 },
|
|
{ 1700, 1, -26 },
|
|
};
|
|
|
|
// - 4 for unused gift ribbon bits in MON_DATA_UNUSED_RIBBONS
|
|
static const u8 sGiftRibbonsMonDataIds[GIFT_RIBBONS_COUNT - 4] =
|
|
{
|
|
MON_DATA_MARINE_RIBBON, MON_DATA_LAND_RIBBON, MON_DATA_SKY_RIBBON,
|
|
MON_DATA_COUNTRY_RIBBON, MON_DATA_NATIONAL_RIBBON, MON_DATA_EARTH_RIBBON,
|
|
MON_DATA_WORLD_RIBBON
|
|
};
|
|
|
|
extern const u8 gText_DecimalPoint[];
|
|
extern const u8 gText_Marco[];
|
|
|
|
#define CM_PER_INCH 2.54
|
|
|
|
static u32 GetMonSizeHash(struct Pokemon *pkmn)
|
|
{
|
|
u16 personality = GetMonData(pkmn, MON_DATA_PERSONALITY);
|
|
u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF;
|
|
u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF;
|
|
u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF;
|
|
u16 speedIV = GetMonData(pkmn, MON_DATA_SPEED_IV) & 0xF;
|
|
u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF;
|
|
u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF;
|
|
u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF);
|
|
u32 lobyte = ((spAtkIV ^ spDefIV) * speedIV) ^ (personality >> 8);
|
|
|
|
return (hibyte << 8) + lobyte;
|
|
}
|
|
|
|
static u8 TranslateBigMonSizeTableIndex(u16 a)
|
|
{
|
|
u8 i;
|
|
|
|
for (i = 1; i < 15; i++)
|
|
{
|
|
if (a < sBigMonSizeTable[i].unk4)
|
|
return i - 1;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
static u32 GetMonSize(u16 species, u16 b)
|
|
{
|
|
u64 unk2;
|
|
u64 unk4;
|
|
u64 unk0;
|
|
u32 height;
|
|
u32 var;
|
|
|
|
height = GetSpeciesWeight(species);
|
|
var = TranslateBigMonSizeTableIndex(b);
|
|
unk0 = sBigMonSizeTable[var].unk0;
|
|
unk2 = sBigMonSizeTable[var].unk2;
|
|
unk4 = sBigMonSizeTable[var].unk4;
|
|
unk0 += (b - unk4) / unk2;
|
|
return height * unk0 / 10;
|
|
}
|
|
|
|
static void FormatMonSizeRecord(u8 *string, u32 size)
|
|
{
|
|
#ifdef UNITS_IMPERIAL
|
|
//Convert size from centimeters to inches
|
|
size = (f64)(size * 10) / (CM_PER_INCH * 10);
|
|
#endif
|
|
|
|
string = ConvertIntToDecimalStringN(string, size / 10, STR_CONV_MODE_LEFT_ALIGN, 8);
|
|
string = StringAppend(string, gText_DecimalPoint);
|
|
ConvertIntToDecimalStringN(string, size % 10, STR_CONV_MODE_LEFT_ALIGN, 1);
|
|
}
|
|
|
|
static u8 CompareMonSize(u16 species, u16 *sizeRecord)
|
|
{
|
|
if (gSpecialVar_Result == 0xFF)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
struct Pokemon *pkmn = &gPlayerParty[gSpecialVar_Result];
|
|
|
|
if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
u32 oldSize;
|
|
u32 newSize;
|
|
u16 sizeParams;
|
|
|
|
*(&sizeParams) = GetMonSizeHash(pkmn);
|
|
newSize = GetMonSize(species, sizeParams);
|
|
oldSize = GetMonSize(species, *sizeRecord);
|
|
FormatMonSizeRecord(gStringVar2, newSize);
|
|
if (newSize <= oldSize)
|
|
{
|
|
return 2;
|
|
}
|
|
else
|
|
{
|
|
*sizeRecord = sizeParams;
|
|
return 3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Stores species name in gStringVar1, trainer's name in gStringVar2, and size in gStringVar3
|
|
static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord)
|
|
{
|
|
u32 size = GetMonSize(species, *sizeRecord);
|
|
|
|
FormatMonSizeRecord(gStringVar3, size);
|
|
StringCopy(gStringVar1, GetSpeciesName(species));
|
|
if (*sizeRecord == DEFAULT_MAX_SIZE)
|
|
StringCopy(gStringVar2, gText_Marco);
|
|
else
|
|
StringCopy(gStringVar2, gSaveBlock2Ptr->playerName);
|
|
}
|
|
|
|
void InitSeedotSizeRecord(void)
|
|
{
|
|
VarSet(VAR_SEEDOT_SIZE_RECORD, DEFAULT_MAX_SIZE);
|
|
}
|
|
|
|
void GetSeedotSizeRecordInfo(void)
|
|
{
|
|
u16 *sizeRecord = GetVarPointer(VAR_SEEDOT_SIZE_RECORD);
|
|
|
|
GetMonSizeRecordInfo(SPECIES_SEEDOT, sizeRecord);
|
|
}
|
|
|
|
void CompareSeedotSize(void)
|
|
{
|
|
u16 *sizeRecord = GetVarPointer(VAR_SEEDOT_SIZE_RECORD);
|
|
|
|
gSpecialVar_Result = CompareMonSize(SPECIES_SEEDOT, sizeRecord);
|
|
}
|
|
|
|
void InitLotadSizeRecord(void)
|
|
{
|
|
VarSet(VAR_LOTAD_SIZE_RECORD, DEFAULT_MAX_SIZE);
|
|
}
|
|
|
|
void GetLotadSizeRecordInfo(void)
|
|
{
|
|
u16 *sizeRecord = GetVarPointer(VAR_LOTAD_SIZE_RECORD);
|
|
|
|
GetMonSizeRecordInfo(SPECIES_LOTAD, sizeRecord);
|
|
}
|
|
|
|
void CompareLotadSize(void)
|
|
{
|
|
u16 *sizeRecord = GetVarPointer(VAR_LOTAD_SIZE_RECORD);
|
|
|
|
gSpecialVar_Result = CompareMonSize(SPECIES_LOTAD, sizeRecord);
|
|
}
|
|
|
|
void GiveGiftRibbonToParty(u8 index, u8 ribbonId)
|
|
{
|
|
s32 i;
|
|
bool32 gotRibbon = FALSE;
|
|
u8 data = 1;
|
|
u8 array[ARRAY_COUNT(sGiftRibbonsMonDataIds)];
|
|
memcpy(array, sGiftRibbonsMonDataIds, sizeof(sGiftRibbonsMonDataIds));
|
|
|
|
if (index < GIFT_RIBBONS_COUNT && ribbonId <= MAX_GIFT_RIBBON)
|
|
{
|
|
gSaveBlock1Ptr->giftRibbons[index] = ribbonId;
|
|
for (i = 0; i < PARTY_SIZE; i++)
|
|
{
|
|
struct Pokemon *mon = &gPlayerParty[i];
|
|
|
|
if (GetMonData(mon, MON_DATA_SPECIES) != 0 && GetMonData(mon, MON_DATA_SANITY_IS_EGG) == 0)
|
|
{
|
|
SetMonData(mon, array[index], &data);
|
|
gotRibbon = TRUE;
|
|
}
|
|
}
|
|
if (gotRibbon)
|
|
FlagSet(FLAG_SYS_RIBBON_GET);
|
|
}
|
|
}
|