-
Notifications
You must be signed in to change notification settings - Fork 37
Tutorial: PSI Abilities
What would our heroes do without PSI abilities? Ness, Paula, Jeff, Poo... each has their own distinct
set of PSI powers. And wouldn't you know it, CoilSnake lets you customize them... to some extent. For
one thing, there is, as of this writing, no support for PSI animations.
List of files used:
psi_ability_table.yml
psi_anim_palettes.yml
psi_name_table.yml
psi_teleport_dest_table.yml
All PSI abilities used by the playable characters are declared in psi_ability_table.yml
, using the same standard format; let'slook at the declaration for "Healing γ", ID 29
:
29:
Action: 38
Level learned by Ness: 53
Level learned by Paula: 0
Level learned by Poo: 36
PSI Menu position (X): 13
PSI Menu position (Y): 1
PSI Name: 7
Strength: gamma
Text Address: $ef5239
Type:
- recovery
Usability Outside of Battle: usable
-
Action
- Specifies the battle action the PSI power should have. To modify the nature of this action, edit the associated entry inbattle_action_table.yml
(which we will cover in a later chapter). -
Level learned by Ness
- Indicates the lowest level at which the power is attained by Ness. -
Level learned by Paula
- Indicates the lowest level at which the power is attained by Paula. -
Level learned by Poo
- Indicates the lowest level at which the power is attained by Poo. -
PSI Menu position (Y)
- Specifies the row on which the ability's name is written (going from 0 to 2) in the PSI selection menu. -
PSI Menu position (X)
- Specifies the horizontal location of the symbol for that level of power (α, β, γ, Ω, Σ). -
PSI Name
- Takes the ID of one of the names defined inpsi_name_table.yml
, such as ID6
for "Lifeup ". -
Strength
- Indicates the level of the power (alpha
,beta
,gamma
,omega
,sigma
, ornone
(which you should never use)). -
Text Address
- Either a pointer or a CCScript label to some text used to describe the PSI ability in the Status menu. -
Type
- A list of classification under which this ability should appear in the various PSI menus of the game. Possible values areoffense
,recovery
,assist
, orother
. -
Usability Outside of Battle
- Specifies whether the power can be used bothin battle and out of battle (usable
), usable only in battle (unusable
), or a special power such as Teleport (other
).
Note: Never edit the first or last entries in psi_ability_table.yml
.
In the case of teleportation powers, additional configuration is required to specify the possible
destinations; this is handled through psi_teleport_dest_table.yml
. The syntax is simple as usual. Let's look at the entry for Twoson for example:
2:
Event Flag: 0xd2
Name: Twoson
X: 176
Y: 820
-
Name
- The displayed label for the location in the game's ability menu. -
X
andY
- The coordinates on the map in the 8x8 format; that is, they specify a 8x8 pixel-sized tile somewhere on the world map (as can be seen in the Map Editor under Options->Show Coordinates->Warp X, Y). -
Event Flag
- Specifies the flag required to be set in order for this destination to be displayed in the menu.
While editing the PSI Abilities for your hack, you might notice that there's one in particular that doesn't change. The 0 entry, PSI(????). This one gets its name from the Favorite Thing that EarthBound asks for at the very start of the game. However, the "PSI" prefix that accompanies this ability doesn't change at all, even if you modify the "PSI" in the YML file.
So how can you modify what this part says?
Well, there are two ways to tackle this. First off, let's try to change "PSI" to "PK" for that ability in particular. The following code should handle that just fine:
ROM[0xC1C415] = byte [0] 0x26
ROM[0xC1FE3D] = byte [0] 0x80
ROM[0xC1FE42] = byte [0] 0x7B
But what if you don't want to remove the first letter, and want to keep all three but rename them to something else? That's simple as well, all you have to do is know what Hex value corresponds to the letter you want to overwrite, and then you are good to go with the following code:
ROM[0xC1FE38] = byte [0] 0x7D
ROM[0xC1FE3D] = byte [0] 0x88
ROM[0xC1FE42] = byte [0] 0x7E
In this code, each value after "byte [0]" is a particular character taken from the Font 0.png file. The original game uses "PSI", which in Hex values are:
- 0x80 = P
- 0x83 = S
- 0x79 = I
For this example, I replaced each letter with a different character from Font #0. Now the attack will say "MXN" instead of "PSI".
- 0x7D = M
- 0x88 = X
- 0x7E = N
Refer to the Modifying Game Fonts section for further details!
- Overworld Sprites
- Battle Backgrounds
- Battle Sprites
- Title Screen
- Window Graphics
- Logos
- Fonts
- Animations
- Swirls
- EB Project Editor
- Tile Data
- Tile Editor
- Collision Data
- Adding Map Palettes
- Map Editor
- Doors
- Warp Styles
- Enemy Placement
- Hotspots