HRO
636 bytes per hero seemed a bit excessive, so this lump was compressed. The first byte now contained the number of heroes, and the second byte contained some scaling factors, used to stuff stat caps into a byte apiece. This technically will affect the accuracy of hero stats, but except for artistic reasons (e.g., a demon with exactly 666 mp) players should not notice any difference.
The Header[edit]
Data | Meaning |
---|---|
BYTE | Number of heroes in this file |
BYTE(AABBCCDD) | Scaling factors, all -1 A=mp_multiplier (low) B=mp_multiplier (high) C=stat_multiplier (low) D=stat_multiplier (high) |
Following the header are a number of variable-length records
Hero Record Format[edit]
Data' | Meaning |
---|---|
STR | Hero name. If the first byte of this string is hex-value FF, this hero is null. No more bytes are read; the next hero record begins immediately. |
BYTE | Hero Sprite |
BYTE | Hero Palette |
BYTE | Walkabout Sprite |
BYTE | Walkabout Palette |
BYTE | Default Level (0xFF = "Party Average") |
BYTE | Default Weapon |
INT | HP Level 0 |
INT | HP Level 99 |
BYTE | MP Level 0 / mp_multiplier(low) |
BYTE | MP Level 99 / mp_multiplier(high) |
BYTE | Strength Level 0 / stat_multiplier(low) |
BYTE | Strength Level 99 / stat_multiplier(high) |
BYTE | Accuracy Level 0 / stat_multiplier(low) |
BYTE | Accuracy Level 99 / stat_multiplier(high) |
BYTE | Defense Level 0 / stat_multiplier(low) |
BYTE | Defense Level 99 / stat_multiplier(high) |
BYTE | Dodge % Level 0 / stat_multiplier(low) |
BYTE | Dodge % Level 99 / stat_multiplier(high) |
BYTE | Magic Level 0 / stat_multiplier(low) |
BYTE | Magic Level 99 / stat_multiplier(high) |
BYTE | Will Level 0 / stat_multiplier(low) |
BYTE | Will Level 99 / stat_multiplier(high) |
BYTE | Speed Level 0 / stat_multiplier(low) |
BYTE | Speed Level 99 / stat_multiplier(high) |
BYTE | Counter Level 0 / stat_multiplier(low) |
BYTE | Counter Level 99 / stat_multiplier(high) |
BYTE | Focus Level 0 / stat_multiplier(low) |
BYTE | Focus Level 99 / stat_multiplier(high) |
BYTE | Extra hits Level 0 / stat_multiplier(low) |
BYTE | Extra hits Level 99 / stat_multiplier(high) |
3 BYTES(XXXXAAAA ABBBBBCC CCCDDDDD) | Number of spells in each list A = List 1 B = List 2 C = List 3 D = List 4 X = unused |
2 BYTES * X | List 1's spells. First byte is Attack number; second byte is level learnt + 1 (if zero, it's taught by an item) |
2 BYTES * X | List 2's spells. Same format as above. |
2 BYTES * X | List 3's spells. Same format as above. |
2 BYTES * X | List 4's spells. Same format as above. |
BIT * 8 | Weak against elements 1-8 |
BIT * 8 | Strong against elements 1-8 |
BIT * 8 | Absorbs elements 1-8 |
BYTE(ABXXXXXX) | A = Show rename prompt when added to the party. B = Allow renaming from the status menu. X = undefined |
STR | Spell List 1's name |
STR | Spell List 2's name |
STR | Spell List 3's name |
STR | Spell List 4's name |
4 BYTES | Spell List 1 to 4's type: 0 = MP based 1 = FF1-style Level MP based 2 = Random 3 = reserved for item-consuming spells? |
BYTE | Have hero tag |
BYTE | Hero is alive tag |
BYTE | Hero is leader tag |
BYTE | Hero is in active party tag |
BYTE | Max length of hero name when renaming (0=default, 16?) |
INT | "Attack A" Hand X-coordinate |
INT | "Attack A" Hand Y-coordinate |
INT | "Attack B" Hand X-coordinate |
INT | "Attack B" Hand Y-coordinate |
'Note: All "STR" variables in .HRO are null-terminated Strings.
Some people have expressed concern that this format is too confining, and will crash if, say, the "Hero is leader" tag is 300. To them, "patience!" The XRPG format can always be changed (I can think of two easy fixes now...)
HEADER.LMP . _FNT.png . .PT4_# . .PT6_# . .HERO_#.png . SEZ . EFX . BFF . FOE . _TIL_#.png . _MXS_#.png . ###.MAP . HRO . ATK . SCRIPTS_#.HF . SCRIPTS.LST