pokemon rom researcher

Seen July 2nd, 2016
Posted August 31st, 2015
104 posts
12.6 Years
It's been a long time since I last posted, but I'm back with some new information on Items. Today, I'll be updating you on how Party-screen Items work.

Party screen Items are a variety of items that are used directly on your pokemon on the party screen, or that are used in battle and affect your party pokemon. These include Healing items, Rare candy, Stones, Vitamins and stat-boosting items (like X-attack). TM's use a different system.

Party-items use the same routines to be executed, but differ in the routine called. Namely, they are:
Healing Item Function
Used by: Potion, Antidote, revive,, Vitamins, Berries
Does: Allows pokemon selection, prints the "restored X HP" or "cured from X" after displaying the health bar restoring.
Normal routine: 080a16e1
Battle routine:  080a1fbd
PP Restoring Function
Used by: Elixir, Ether, Leppa berry
Does: Allows pokemon selection,then attack selection on a small mini-screen, prints the "restored X PP"
Normal routine: 080a16fd
Battle routine:  080a1ff5
Healing item on all Pokemon
Used by: Sacred Ash
Does: Allows pokemon selection,then uses desired effect on all pokemon that are capable of using it
Normal routine: 080a176d
Battle routine:  none
Level up screen
Used by: Rare candy
Does: Allows pokemon selection, prints the stats screen after use
Normal routine: 080a1735
Battle routine:  none
Increase PP screen
Used by: PP Up
Does: Allows pokemon selection,attack selection, prints effect
Differs only from the restore screen because of the "PP to increase" line that appears next to the Attack selection box.
Normal routine: 080a1719
Battle routine:  none
Battle stats
Used by: X Attack, Dire Hit
Does: No pokemon selection, prints effect after used.
Normal routine: none
Battle routine:  080a1e7d
CanUse-ShowHP screen
Used by: Fire Stone, Leaf stone
Does: Allows pokemon selection, Shows "can't use" on top of pokemon where the item has no effect and HP bars over the ones where it works.
Normal routine: 080a1751
Battle routine:  none
There is still one used by Yellow flute at 080a2239

Putting this UI differences aside, the code beneath is pretty much the same. It runs two functions, one at 080413E4, that actually executes the code, and one at 08042414, that is called before, when the item is to be used on the pokemon, to determine if it will work at all. If either of them fails a "It Won't work" message is displayed.
Each of this functions border the 4KB in size, so I won't be posting them here. But they work by reading from a table of Item Flags, and working on each.
ItemFlags are stored in a table starting at 082528BC, starting with the value for the potion, and going all the way to Sitrus Berry, placing 0 on the items that have no party use. Those flags are a group of 6 to 10 bytes(depends on the flags present). Their layout is as follows:
byte 0
80 heals infatuation
40 forces to apply to first pokemon (no selection)
20 is dire-hit (up to 30)
1-f is increase attack battle stat by the given value
byte 1
1-f is increase speed battle stat by given value
10-f0 is increase defence, in the same manner
byte 2
1-f is increase special attack (note: x special raises only special attack)
10-f0 is increase accuracy
byte 3
80 is guard-spec 
40 for level up
20 for clear sleep
10 for clear poison
8 for clear burn
4 for clear ice
2 for clear paralyze
1 for clear confusion
byte 4
1 is up HP EV
2 is up Attack EV
4 means heal HP
8 means heal PP
10 means only to selected attack (select made by GUI choice)
20 means increase max PP
40 means revive and heal
80 means it's an evolution stone
when 40 and 4 are set, item only heals fainted pokemon
4 and 8 are mutually exclusive, you cannot heal PP and HP at the same time. 4 takes precedence over 8. 
byte 5
0x80 is the change happiness when 200+
0x40 is the change happiness when 100-->199
0x20 is the change happiness when -99
0x10 is the increase PP to max on selected attack
0x08 special defense ev up
0x04 special attack ev up
0x02 speed ev up
0x01 defense ev up
byte 6 
recovery value for Potion-like items,
increase in EV for EV-increasing items.
PP restoring items have a maximum of 7f
For health restoration, ff means max health, fe means half max health, fd is used by rare candy (only increase with level up)
byte 7
happiness increase/decrease for happiness on the range of 0-99
byte 8
happiness increase/decrease for happiness on the range of 100-199
byte 9
happiness increase/decrease for happiness on the range of 200-255
bytes 7 to 9 are signed bytes, meaning that FF = decrease of 1 happiness

So, what can we do with this information? Well, we can start designing new items with uses, such as new types of potions, new evolution stones, or new battle items. However, please note that you are limited to using items in the range between Potion(0d) and Sitrus berry (8e). To change that, we can erase the limiters at 0x08042508 (for the check routine) and the one at 0x0804152C (for the actual item usage). Replace each of those locations with 00 00 00 00. That will replace the jump with nop operations, erasing the check. Remember to repoint the entire table to a safe location if you do.

But the best part about this find is that we now know all items of this type call two functions to determine what to do. If we change these functions, we can make items do whatever we want to the pokemon in our party.
The system in place right now gives you some freedom to combine effects. But it will not allow you to do much. Even something as simple as an item that heals both PP and HP is impossible (without changing the routine).

To end, an example of a new item, a candy that boosts happiness and heals 10 hp to your pokemon:
The script would be
00 00 00 00 04 e0 0a 0a 06 04
Which means happiness boosted by 10 if less than 99, 6 if between 100 and 199 and 4 if over 200.
Placing this item immediately before HP-up, you would:
- place this in the rom in some location
- place the address to this location at 08252980
- overwrite the item above HP-up (Starting at 083dbad0), with all the usual data (index, name, price...)
- place as the Normal usage pointer the healing item function.
Here are the links for my work

Currently working on:
Battle Script Documentation
Another large project