Party growth, items, techniques, skills, enemies, shops and combos, read from the USA ROM. Table layouts come from the ps4disasm disassembly, checked byte for byte against the ROM, and every record names the ROM address it came from.
inn prices
Each attack rolls r from 0 to 63 against each target:
With DEX equal to AGI, 5 rolls in 64 miss (7.8%) and 5 in 64 are critical. Attacks that hit every enemy never land a critical.
On average that's ATK − DEF against a normal target, and about 1¼ × ATK − DEF on a critical.
A plain attack's element is the weapon's. The game looks up the target's vulnerability to the element of whatever is in each hand and keeps the higher of the two. Skills with the Weapon element do the same.
The shipped game reads both hands without checking what they hold, so a shield's element counts as if it were a second weapon: a Fire shield makes every swing hit a Fire-weak enemy as Fire. Only three shields have an element (), so it shows only with those. The disassembly's bugfix option skips shields.
An empty hand adds nothing, and a hand whose item has no element reads a value of 0, which never beats the other hand. With nothing usable in either hand the vulnerability is 0 and every hit does 1 damage; read from the code (Character_DamageEnemy), not checked in an emulator.
A helmet, body armor or shield with an element sets the wearer's vulnerability to that element to Resists ×½, whatever it was before: it lifts a weakness, and it also lowers an immunity to merely resisting. Several pieces of the same element do no more than one. Every other element keeps the character's own value. The game recomputes this whenever equipment changes (UpdateCharElems).
| Element | Armor |
|---|
These always connect and do at least 1 damage.
Both come to about M + power. Full heals restore 999. Reviving in the field brings the character back with 1 HP. ATARAXIA's amount goes to TP instead of HP. In the field, healing items do nothing for androids.
An effect with a "Resisted by" stat lands when
Your stat is the one that powers the ability. Against an immune target (vulnerability 0) the effect never lands. Without a "Resisted by" stat, the effect always lands.
Buffs set the stat to its base value plus your power stat, so casting again replaces the buff instead of stacking it. Debuffs set it to the base minus your power stat, down to 0 for ATK and DEF and 1 for AGI and DEX. Paralysis and android death drop AGI and DEX to 1.
A status carried by a plain attack, such as an enemy's poison, lands when (r + attacker STR − target STR) × the target's vulnerability > 112, using a fixed element: Efess for poison, paralysis and android death, Psychic for sleep and seal, Biological for death, Physical for stat drops.
In the shipped game, cure poison, cure paralysis, revive and full revive in battle also reset the target's AGI and DEX to their unbuffed values, whether or not there was anything to cure. The disassembly's bugfix option limits that to targets that had the status.
Every fighter has a vulnerability to each element, 0 to 4. It scales damage before defense is subtracted, and multiplies the status roll before the comparison.
| Vulnerability | Value | Damage | Status roll |
|---|---|---|---|
| Immune ×0 | 0 | ×0, then the minimum of 1 | never lands |
| Resists ×½ | 1 | ×½ | ×1 |
| Normal ×1 | 2 | ×1 | ×2 |
| Weak ×1½ | 3 | ×1½ | ×3 |
| Very weak ×2 | 4 | ×2 | ×4 |
When the round's actions match one of a combo's sets, they merge into the combo. Its stats are each technique user's MEN and each skill user's skill stat, added in the order the round lists the actions; its power is the parts' power, added.
A status combo's roll uses the stats alone; the parts' power doesn't enter it. In a set, + joins parts that may come in any order and → parts that must follow each other.
A technique user's MEN is added as a single byte, so two technique users whose MEN adds up to 256 or more count as the sum less 256 (loc_28B4, loc_6006). checked in an emulator
Each round, every fighter that isn't asleep, paralyzed or dead scores its AGI plus a random number from 0 to half the highest AGI in the battle, less one. The highest score acts first.
Event battles never start with a surprise. Each battle's surprise and escape values are on the map pages with its enemies.
Each map belongs to an encounter group, and each group holds 32 battle slots; a battle picks one at random, so a battle filling 4 slots comes up 4 times in 32. On the world maps the group depends on where the party stands, in a grid of 64-pixel cells. In a vehicle the grid is skipped: Motavia uses group 9 or 10 on battle backgrounds 1 and 3 and group 8 elsewhere, and Dezolis uses group 13.
A drop belongs to the battle, not to an enemy in it: after a win the battle's item drops when a roll of 0 to 127 is below its rate, once per battle. No event battle has a drop.
Each level's record lists eight skill use counts, the first for the skill at the bottom of the list (the first learned). A level-up copies all eight, whether or not the slot holds a skill yet, so a skill an event writes into a slot later starts with that slot's count for the current level.
A character who leaves the party keeps their equipment. Three scenes overwrite equipment without returning it to the inventory: Rune rejoining at Ladea (Force Cane, Psy Circlet, Psy Robe), Chaz's hands at Elsydeon, and the five fifth-member candidates at the reunion. The walkthrough marks the departures before those.
Seth's level 99 record has a stray zero byte after TP, so the game reads the level shifted by one: STR 0, technique 99 (which doesn't exist) and the skill uses moved one slot. The disassembly's bugfix option removes the byte.
The field menu's Talk command shows the line of the latest story flag in a table of 48 flags, so each of those flags opens a stage. Inside a stage, steps are placed by what their triggers test (map events, dialog checks, chests), else by the area their map is in, else by flag number. story order beyond prerequisites
The ps4disasm disassembly names and documents the game's tables and routines. The build reads it for the USA release, finds each table in the ROM by its bytes, checks every byte against the ROM, and confirms the address with the code that reads it; the values on this site are read from the ROM at those addresses. The formulas on this tab are read from the routines named in FINDINGS.md. ROM: .
Not decoded yet: enemy action routines, inn prices, enemy setup routines (Zio and others), map data manager changes.