Skip to content

How To Add New Items

judicornadamsfoster edited this page Jun 15, 2026 · 1 revision

Want to add new items to your hack?

There are 63 item slots (and 24 from FR/LG) unused that can be turned in to new items.

For this example we will use unused item ITEM_034 and replace already-defined (but unused) item ITEM_OAKS_PARCEL to add 2 new items:

pokeemerald-1 pokeemerald-0

-- important note: only replace unused entries or the unused items from FireRed/LeafGreen;
don't replace ITEM_MYSTIC_TICKET 370 or ITEM_AURORA_TICKET 371 as these are used for events in Emerald.


include/constants/items.h

add a new define for the new item, keeping the same number being replaced
comment out or delete the original entry:

	//#define ITEM_034        52
	#define ITEM_ODD_KEYSTONE 52

    //#define ITEM_OAKS_PARCEL 349
    #define ITEM_EGG_TICKET    349

include/graphics.h

-- there are no listings for unused items in this file so you only have to remove entries if replacing a used item.

add a gItemIcon_* and gItemIconPalette_* entry
comment out or delete the original entry:

extern const u32 gItemIcon_OddKeystone[];
extern const u32 gItemIconPalette_OddKeystone[];

//extern const u32 gItemIcon_OaksParcel[];
//extern const u32 gItemIconPalette_OaksParcel[];
extern const u32 gItemIcon_EggTicket[];
extern const u32 gItemIconPalette_EggTicket[];

src/data/graphics/items.h

-- there are no listings for unused items in this file so you only have to remove entries if replacing a used item.

add a gItemIcon_* and gItemIconPalette_* entry, this should be named exactly the same as the entry above
comment out or delete the original entry:

const u32 gItemIcon_OddKeystone[] = INCGFX_U32("graphics/items/icons/odd_keystone.png", ".4bpp.lz");
const u32 gItemIconPalette_OddKeystone[] = INCGFX_U32("graphics/items/icon_palettes/odd_keystone.pal", ".gbapal.lz");

//const u32 gItemIcon_OaksParcel[] = INCGFX_U32("graphics/items/icons/oaks_parcel.png", ".4bpp.lz");
//const u32 gItemIconPalette_OaksParcel[] = INCGFX_U32("graphics/items/icon_palettes/oaks_parcel.pal", ".gbapal.lz");
const u32 gItemIcon_EggTicket[] = INCGFX_U32("graphics/items/icons/egg_ticket.png", ".4bpp.lz");
const u32 gItemIconPalette_EggTicket[] = INCGFX_U32("graphics/items/icon_palettes/egg_ticket.pal", ".gbapal.lz");

if you don't have or don't want custom images for your item, don't add anything to this file (but still comment or delete any used items)

if you still use an older version of pokeemerald that uses INCBIN and not INCGFX, see here


src/data/item_icon_table.h

link the item define with the gItemIcon_* and gItemIconPalette_*
comment out or delete the original entry:

    //[ITEM_034] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark},
	[ITEM_ODD_KEYSTONE] = {gItemIcon_OddKeystone, gItemIconPalette_OddKeystone},
	
    //[ITEM_OAKS_PARCEL] = {gItemIcon_OaksParcel, gItemIconPalette_OaksParcel},
	[ITEM_EGG_TICKET] = {gItemIcon_EggTicket, gItemIconPalette_EggTicket},

if you don't have or don't want custom images for your item, use:
{gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}
or any other item image you wish.


src/data/items.h

links all details together
For this example, Odd Keystone is being added as a standard pocket item, while Egg Ticket is being added as a Key Item
comment out or delete the original entry:

.name is what name you want to show in-game
.price is how much to buy the item in a mart; can be sold for half this price
.importance is if the item can be sold, = 1 means it can't be sold; if not listed then it can be sold
.pocket is where you want the item to be stored, these are defined in include/constants/item.h
.fieldUseFunc is if the item can be used in the overworld; evo stones use ItemUseOutOfBattle_EvolutionStone for example while potions use ItemUseOutOfBattle_Medicine. Items that have no effects use ItemUseOutOfBattle_CannotUse

/*
    [ITEM_034] =
    {
        .name = _("????????"),
        .itemId = ITEM_NONE,
        .price = 0,
        .description = sDummyDesc,
        .pocket = POCKET_ITEMS,
        .type = ITEM_USE_BAG_MENU,
        .fieldUseFunc = ItemUseOutOfBattle_CannotUse,
    },
*/

    [ITEM_ODD_KEYSTONE] =
    {
        .name = _("ODD KEYSTONE"),
        .itemId = ITEM_ODD_KEYSTONE,
        .price = 12500,
        .description = sOddKeystoneDesc,
        .pocket = POCKET_ITEMS,
        .type = ITEM_USE_BAG_MENU,
        .fieldUseFunc = ItemUseOutOfBattle_CannotUse,
    },

/*
    [ITEM_OAKS_PARCEL] =
    {
        .name = _("OAK'S PARCEL"),
        .itemId = ITEM_OAKS_PARCEL,
        .price = 0,
        .description = sOaksParcelDesc,
        .importance = 2,
        .pocket = POCKET_KEY_ITEMS,
        .type = ITEM_USE_BAG_MENU,
        .fieldUseFunc = ItemUseOutOfBattle_CannotUse,
    },
*/

    [ITEM_EGG_TICKET] =
    {
        .name = _("EGG TICKET"),
        .itemId = ITEM_EGG_TICKET,
        .price = 0,
        .description = sEggTicketDesc,
        .importance = 1,
        .pocket = POCKET_KEY_ITEMS,
        .type = ITEM_USE_BAG_MENU,
        .fieldUseFunc = ItemUseOutOfBattle_CannotUse,
    },

src/data/text/item_descriptions.h

this is the item description that will show in game
it must fit in 3 lines or it won't show properly
the s*Desc must match the .description line in src/data/items.h
comment out or delete the original entry:

	// odd keystone
	static const u8 sOddKeystoneDesc[] = _(
	"An odd stone,\n"
    "whispers can be\n"
    "heard from it.");

/*
static const u8 sOaksParcelDesc[] = _(
    "A parcel for PROF.\n"
    "OAK from a POKéMON\n"
    "MART's clerk.");
*/

static const u8 sEggTicketDesc[] = _(
    "A ticket for an\n"
    "ODD EGG from\n"
    "FALLARBOR MART.");

Older

If you still use an older version of pokeemerald that doesn't use INCGFX yet, use this instead
in src/data/graphics/items.h:

const u32 gItemIcon_OddKeystone[] = INCBIN_U32("graphics/items/icons/odd_keystone.4bpp.lz");
const u32 gItemIconPalette_OddKeystone[] = INCBIN_U32("graphics/items/icon_palettes/odd_keystone.gbapal.lz");

//const u32 gItemIcon_OaksParcel[] = INCBIN_U32("graphics/items/icons/oaks_parcel.4bpp.lz");
//const u32 gItemIconPalette_OaksParcel[] = INCBIN_U32("graphics/items/icon_palettes/oaks_parcel.gbapal.lz");
const u32 gItemIcon_EggTicket[] = INCBIN_U32("graphics/items/icons/egg_ticket.4bpp.lz");
const u32 gItemIconPalette_EggTicket[] = INCBIN_U32("graphics/items/icon_palettes/egg_ticket.gbapal.lz");

Clone this wiki locally