#ifndef GUARD_DATA_H #define GUARD_DATA_H #include "global.h" #include "constants/trainers.h" #define SPECIES_SHINY_TAG 500 #define TRAINER_ENCOUNTER_MUSIC(trainer)((gTrainers[trainer].encounterMusic_gender & 0x7F)) struct MonCoords { // This would use a bitfield, but some function // uses it as a u8 and casting won't match. u8 size; // u8 width:4, height:4; u8 y_offset; }; #define MON_COORDS_SIZE(width, height)(DIV_ROUND_UP(width, 8) << 4 | DIV_ROUND_UP(height, 8)) #define GET_MON_COORDS_WIDTH(size)((size >> 4) * 8) #define GET_MON_COORDS_HEIGHT(size)((size & 0xF) * 8) #define MAX_TRAINER_ITEMS 4 enum { BATTLER_AFFINE_NORMAL, BATTLER_AFFINE_EMERGE, BATTLER_AFFINE_RETURN, }; struct TrainerMonNoItemDefaultMoves { u16 iv; u8 lvl; u16 species; }; struct TrainerMonItemDefaultMoves { u16 iv; u8 lvl; u16 species; u16 heldItem; }; struct TrainerMonNoItemCustomMoves { u16 iv; u8 lvl; u16 species; u16 moves[MAX_MON_MOVES]; }; struct TrainerMonItemCustomMoves { u16 iv; u8 lvl; u16 species; u16 heldItem; u16 moves[MAX_MON_MOVES]; }; #define NO_ITEM_DEFAULT_MOVES(party) { .NoItemDefaultMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = 0 #define NO_ITEM_CUSTOM_MOVES(party) { .NoItemCustomMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET #define ITEM_DEFAULT_MOVES(party) { .ItemDefaultMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_HELD_ITEM #define ITEM_CUSTOM_MOVES(party) { .ItemCustomMoves = party }, .partySize = ARRAY_COUNT(party), .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM union TrainerMonPtr { const struct TrainerMonNoItemDefaultMoves *NoItemDefaultMoves; const struct TrainerMonNoItemCustomMoves *NoItemCustomMoves; const struct TrainerMonItemDefaultMoves *ItemDefaultMoves; const struct TrainerMonItemCustomMoves *ItemCustomMoves; }; struct Trainer { /*0x00*/ u8 partyFlags; /*0x01*/ u8 trainerClass; /*0x02*/ u8 encounterMusic_gender; // last bit is gender /*0x03*/ u8 trainerPic; /*0x04*/ u8 trainerName[12]; /*0x10*/ u16 items[MAX_TRAINER_ITEMS]; /*0x18*/ bool8 doubleBattle; /*0x1C*/ u32 aiFlags; /*0x20*/ u8 partySize; /*0x24*/ const union TrainerMonPtr party; }; // extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; // extern const u8 gMoveNames[][MOVE_NAME_LENGTH + 1]; extern const u8 gTrainerClassNames[][13]; static inline u16 SanitizeTrainerId(u16 trainerId) { if (trainerId >= NUM_TRAINERS) return TRAINER_NONE; return trainerId; } struct TypeInfo { u8 name[TYPE_NAME_LENGTH + 1]; u8 generic[17]; u8 palette; u16 zMove; u16 maxMove; //u16 enhanceItem; //u16 berry; //u16 gem; //u16 plate; //u16 memory; //u16 zCrystal; //u16 teraShard; //u16 arceusForm; }; // extern const struct MonCoords gMonFrontPicCoords[]; // extern const struct CompressedSpriteSheet gMonFrontPicTable[]; // extern const struct MonCoords gMonBackPicCoords[]; // extern const struct CompressedSpriteSheet gMonBackPicTable[]; // extern const struct CompressedSpritePalette gMonPaletteTable[]; // extern const struct CompressedSpritePalette gMonShinyPaletteTable[]; extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[]; extern const struct MonCoords gTrainerFrontPicCoords[]; extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; extern const struct CompressedSpriteSheet gTrainerBackPicTable[]; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[]; extern const struct MonCoords gTrainerBackPicCoords[]; extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; extern const u8 *const gBattleAnims_General[]; extern const u8 *const gBattleAnims_Special[]; extern const union AnimCmd *const gAnims_MonPic[]; extern const union AffineAnimCmd *const gAffineAnims_BattleSpritePlayerSide[]; extern const union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[]; extern const struct SpriteFrameImage gBattlerPicTable_PlayerLeft[]; extern const struct SpriteFrameImage gBattlerPicTable_OpponentLeft[]; extern const struct SpriteFrameImage gBattlerPicTable_PlayerRight[]; extern const struct SpriteFrameImage gBattlerPicTable_OpponentRight[]; extern const struct SpriteFrameImage gTrainerBackPicTable_Red[]; extern const struct SpriteFrameImage gTrainerBackPicTable_Leaf[]; extern const struct SpriteFrameImage gTrainerBackPicTable_Pokedude[]; extern const struct SpriteFrameImage gTrainerBackPicTable_OldMan[]; extern const struct SpriteFrameImage gTrainerBackPicTable_RSBrendan[]; extern const struct SpriteFrameImage gTrainerBackPicTable_RSMay[]; extern const union AnimCmd sAnim_GeneralFrame0[]; extern const struct Trainer gTrainers[]; static inline const u8 *GetTrainerNameFromId(u16 trainerId) { // if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) // return gBattlePartners[trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName; return gTrainers[SanitizeTrainerId(trainerId)].trainerName; } // static inline const struct TrainerMon *GetTrainerPartyFromId(u16 trainerId) // { // return gTrainers[SanitizeTrainerId(trainerId)].party; // } #endif // GUARD_DATA_H