pokediamond/structs/pokemon.h
2020-04-10 17:33:55 +02:00

196 lines
3.9 KiB
C

#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