-
Notifications
You must be signed in to change notification settings - Fork 4.2k
How To Add New Items
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:
-- important note: only replace unused entries or the unused items from FireRed/LeafGreen;
don't replaceITEM_MYSTIC_TICKET 370orITEM_AURORA_TICKET 371as these are used for events in Emerald.
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
-- 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[];
-- 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
INCBINand notINCGFX, see here
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.
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:
.nameis what name you want to show in-game
.priceis how much to buy the item in a mart; can be sold for half this price
.importanceis if the item can be sold,= 1means it can't be sold; if not listed then it can be sold
include/constants/item.h
.fieldUseFuncis if the item can be used in the overworld; evo stones useItemUseOutOfBattle_EvolutionStonefor example while potions useItemUseOutOfBattle_Medicine. Items that have no effects useItemUseOutOfBattle_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,
},
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.");
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");