#ifndef POKEDIAMOND_POKEMON_H #define POKEDIAMOND_POKEMON_H #include "nitro/types.h" // Enums typedef enum { EGG=0, EVENT=0, HATCHED=0, PAL_PARK=0, TALL_GRASS=2, DIALGA_GAME_EVENT=4, PALKIA_GAME_EVENT=4, CAVE=5, HALL_OF_ORIGIN=5, SURFING=7, FISHING=7, BUILDING=9, SAFARI_ZONE=10, STARTER=12, FOSSIL=12, GIFT_EEVEE=12 } EncounterType; typedef enum { JAPANESE=1, ENGLISH=2, FRENCH=3, ITALIAN=4, GERMAN=5, SPANISH=7, KOREAN=8 } OriginLanguage; typedef enum { // TODO: Add all Arceus forms // and sort by value ARCEUS_EARTH=32, ARCEUS_FIST=8, ARCEUS_NORMAL=0, ARCEUS_SKY=16, ARCEUS_STONE=40, ARCEUS_TOXIC=24, BURMY_PLANT=0, BURMY_SANDY=8, BURMY_TRASH=16, DEOXYS_ATTACK=8, DEOXYS_DEFENSE=16, DEOXYS_NORMAL=0, DEOXYS_SPEED=24, GIRATINA_ALTERED=0, GIRATINA_ORIGIN=8, ROTOM_FAN=32, ROTOM_FROST=24, ROTOM_HEAT=8, ROTOM_MOW=40, ROTOM_NORMAL=0, ROTOM_WASH=16, SHAYMIN_LAND=0, SHAYMIN_SKY=8, SHELLOS_EAST=8, SHELLOS_WEST=0, UNOWN_EXCLAMATIONMARK =208, UNOWN_QUESTIONMARK=216, UNOWN_A=0, UNOWN_B=8, UNOWN_C=16, UNOWN_D=24, UNOWN_E=32, UNOWN_F=40, UNOWN_G=48, UNOWN_H=56, UNOWN_I=64, UNOWN_J=72, UNOWN_K=80, UNOWN_L=88, UNOWN_M=96, UNOWN_N=104, UNOWN_O=112, UNOWN_P=120, UNOWN_Q=128, UNOWN_R=136, UNOWN_S=144, UNOWN_T=152, UNOWN_U=160, UNOWN_V=168, UNOWN_W=176, UNOWN_X=184, UNOWN_Y=192, UNOWN_Z=200 } AlternateForms; // Structs typedef struct { u16 species; u16 heldItem; u16 otID; u16 otSecretID; u32 exp; u8 friendship; u8 ability; u8 circleMarking:1, triangleMarking:1, squareMarking:1, heartMarking:1, starMarking:1, diamondMarking:1; OriginLanguage originLanguage; u8 hpEV; u8 atkEV; u8 defEV; u8 spdEV; u8 spatkEV; u8 spdefEV; u8 coolStat; u8 beautyStat; u8 cuteStat; u8 smartStat; u8 toughStat; u8 sheen; // TODO: Finish SinnohRibbonSet1 u8 sinnohChampRibbon:1, abilityRibbon:1; u8 field_0x1d; u8 gorgeousRoyalRibbon:1, footprintRibbon:1; u8 field_0x1f; } PokemonDataBlockA; typedef struct { u16 move1; u16 move2; u16 move3; u16 move4; u8 move1pp; u8 move2pp; u8 move3pp; u8 move4pp; u8 move1ppUps; u8 move2ppUps; u8 move3ppUps; u8 move4ppUps; u32 hpIV:5, atkIV:5, defIV:5, spdIV:5, spatkIV:5, spdefIV:5, isEgg:1, isNicknamed:1; // TODO: Finish HoennRibbonSet u8 coolRibbon:1; u8 field_0x15; u8 field_0x16; u8 field_0x17; u8 fatefulEncounter:1, female:1, genderless:1, alternateForm:5; u8 HGSS_shinyLeaves; // TODO: Turn into bitfield u16 Unused; u16 Platinum_EggLocation; u16 Platinum_MetLocation; } PokemonDataBlockB; typedef struct { u16 nickname[11]; u8 Unused; u8 originGame; // TODO: Finish SinnohRibbonSet2 u8 coolRibbon:1; u8 field_0x19; u8 field_0x1a; u8 field_0x1b; u32 Unused2; } PokemonDataBlockC; typedef struct { u16 otTrainerName[8]; u8 dateEggReceived[3]; u8 dateMet[3]; u16 DP_EggLocation; u16 DP_MetLocation; u8 pokerus; u8 pokeball; u8 flags; EncounterType encounterType; u8 HGSS_Pokeball; u8 HGSS_Performance; } PokemonDataBlockD; typedef union { PokemonDataBlockA blockA; PokemonDataBlockB blockB; PokemonDataBlockC blockC; PokemonDataBlockD blockD; } PokemonDataBlock; struct PokemonData { u32 personalityValue; u16 Unused; // Might be used for validity checks u16 checksum; // Stored checksum of pokemon PokemonDataBlock block1; // Blocks A-D; Order based on personalityValue PokemonDataBlock block2; PokemonDataBlock block3; PokemonDataBlock block4; }; #endif //POKEDIAMOND_POKEMON_H