pokeemmo/docs/tutorials/how_to_trainer_pic.md
Frank DeBlasio 4e8ddebb8d
Updated trainer pic tutorial (#6049)
Co-authored-by: Pawkkie <61265402+Pawkkie@users.noreply.github.com>
2025-01-25 19:36:19 -05:00

5.3 KiB

How to add a new trainer pic

Content

Quick Summary

If you've done this before and just need a quick lookup, here's what files you need:

  1. GFX into graphics/trainers/front_pics
  2. Palette into graphics/trainers/palettes
  3. Point game to where graphic files are found: src/data/graphics/trainers
  4. Add trainer to include/constants/trainers.h

The Graphics

1. Edit the sprites

We will start with a graphic that we want to use for our new trainer pic. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: graphics/trainers/front_pics

Remember to limit yourself to 16 colors including transparency in the first slot!

Export the palette and place into the same folder.

2. Register the sprites

Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files. src/data/graphics/trainers:

const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz");

const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire.4bpp.lz");
const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz");

+ const u32 gTrainerFrontPic_myTrainerClass[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass.4bpp.lz");
+ const u32 gTrainerPalette_myTrainerClass[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz");

const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp");

3. Connecting the Pictures to the Data

The last few things we have to do is prepare the graphics for usage. In src/data/graphics/trainers.h you'll find the gTrainerSprites struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the trainer type with the image we defined earlier.

So, finally, it needs to look like this:

define TRAINER_SPRITE(trainerPic, picFile, paletteFile, ...)                  \
    [trainerPic] =                                                             \
    {                                                                          \
        .frontPic = {picFile, TRAINER_PIC_SIZE, trainerPic},                   \
        .palette = {paletteFile, trainerPic},                                  \
        .mugshotCoords = {DEFAULT(0, __VA_ARGS__), DEFAULT_2(0, __VA_ARGS__)}, \
        .mugshotRotation = DEFAULT_3(0x200, __VA_ARGS__),                      \
    }

const struct TrainerSprite gTrainerSprites[] =
{
    TRAINER_SPRITE(TRAINER_PIC_HIKER, gTrainerFrontPic_Hiker, gTrainerPalette_Hiker),
    TRAINER_SPRITE(TRAINER_PIC_AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, gTrainerPalette_AquaGruntM),
    ...
    TRAINER_SPRITE(TRAINER_PIC_RS_MAY, gTrainerFrontPic_RubySapphireMay, gTrainerPalette_RubySapphireMay),
    TRAINER_SPRITE(TRAINER_PIC_MY_TRAINER_CLASS, gTrainerFrontPic_myTrainerClass, gTrainerPalette_myTrainerClass)
};

The Data

4. Defining the trainer pic

Finally, let's bring it all together by defining our new trainer pic in include/constants/trainers.h:

#define TRAINER_PIC_RS_MAY                92
+ #define TRAINER_PIC_MY_TRAINER_CLASS      93

#define TRAINER_BACK_PIC_BRENDAN                0
#define TRAINER_BACK_PIC_MAY                    1

Remember to count the number next to the trainer pic up by one!

Usage

You can test your trainer type by going to src/data/trainers and changing a trainer type. For example:

    [TRAINER_BRENDAN_PLACEHOLDER] =
    {
        .partyFlags = 0,
        .trainerClass = TRAINER_CLASS_RS_PROTAG,
        .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
-       .trainerPic = TRAINER_PIC_RS_BRENDAN,
+       .trainerPic = TRAINER_PIC_MY_TRAINER_CLASS,
        .trainerName = _("BRENDAN"),
        .items = {},
        .doubleBattle = FALSE,
        .aiFlags = 0,
        .partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder),
        .party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder},
    },