Each stat chases a target.
Every level has a target value for each stat. The game rolls near that target and keeps whichever is higher, your current stat or the roll. Luck washes out over time, and promotion resets everything to a fixed formula.
How every character in Shining Force, its GBA remake and Shining Force II gains stats on level up, decoded from the game code, with probability curves for each stat.
Each stat chases a target.
Every level has a target value for each stat. The game rolls near that target and keeps whichever is higher, your current stat or the roll. Luck washes out over time, and promotion resets everything to a fixed formula.
Same targets, rolled only upward.
The remake keeps the Mega Drive targets but only ever rolls on or above them. A level that gains nothing is rerolled. Promotion keeps 85% of the stats you actually have, and base classes level past 20.
Each stat adds up, with a safety net.
Every level adds a small random gain. If the stat falls below the expected curve, it gets +1 extra. Nothing ever resets, so extra levels before promotion are pure profit.
$24708
Each character has a record with class, join level, MOV, and level 0 values for ATT, DEF, AGI, CRIT, HP and MP. Two more tables hold one growth byte per stat: one table for the base class and one for the promoted class. Six stats grow: ATT, DEF, AGI, HP, MP and CRIT. MOV never changes on level up.
A growth byte packs two things. The top two bits pick one of four curves. The low six bits are the total amount the stat grows above its level 0 value by level 20, from 0 to 63.
The target for a stat at level L is its level 0 value plus a share of its total growth. The share comes from the stat's curve: straight-line segments between a few fixed points, rounded down.
Share of total growth reached at each level. Points from the ROM: late (10,20) (14,40) (20,100); early (4,50) (6,70) (10,90) (14,95) (20,100); early+late (4,30) (6,40) (14,60) (16,70) (20,100).
The level goes up first. Then, for each stat:
k = min(⌊target ÷ 4⌋, 5).v = target + rand(k) − rand(k), capped at 99. rand(k) returns 0 to k−1.max(current, v).So a stat never drops and never strays more than 4 from its target. A character who got lucky simply stops gaining until the target catches up. An unlucky one jumps back toward the target in a single level. Targets under 8 have no spread at all.
The two draws come from back-to-back steps of the same random generator, so their difference is not quite a textbook triangle. These are the exact odds, found by trying all 65,536 generator states:
Base classes stop at level 20. Promoted characters keep going to 99, and once their level is above 20 the curve is spent. From then on, each stat has a 25% chance of +1 per level, and nothing else. A stat with a target of 0 still never moves, and nothing passes 99.
Musashi, Hanzou and Domingo join already in a promoted-tier class. They use a single growth table all the way and switch to this 25% rule above level 20.
The church promotes characters at level 10 or higher. When it does, the game overwrites all six stats with 85% of what the stat should be at the promotion level P, ignoring what it actually is. Then the level resets to 1 and the promoted growth table takes over, measured from that new starting point.
Every curve reaches 100% at level 20, so promoting at 20 gives the best start. Promoting early costs stats for good, because the promoted targets are built on top of the smaller start.
Every recruit's ROM record holds their level 0 stats. When a new game starts, the game sets each recruit (except Jogurt) to level 0 and runs the normal level-up up to their joining level. Alef, for example, joins at 15, so 15 level-ups are rolled before you ever meet him.
The record's values do double duty: they're the level 0 stats and the level 1 target, because every curve starts at 0%. So even reaching level 1 is a roll. Max's HP of 12 has a spread of 3, so he reaches level 1 with 12, 13 or 14 HP.
CRIT is the critical-hit chance in percent. The battle code rolls rand(100) < CRIT, and a hit that passes deals double damage. Most recruits start at 3. It grows like any other stat: Max goes from 3 to 7 by level 20, Musashi from 7 to 25, and Gong's promoted Master Monk class adds 20 more.
Jogurt has all-zero growth, and the level-up routine skips his level increment by name. He never gains a level or a stat. The church also checks for him and skips his promotion.
Level caps: base classes cap at 20, promoted classes at 99, and every stat at 99.
$08029E18 in the Japanese ROM
Each of the 33 characters has a 20-byte record with class, join level, MOV and level 0 values for seven stats: ATT, DEF, AGI, HP, MP, CRIT, and magic resistance (MR). Growth sits in two 12-byte tables, one for the base class and one for the promoted class. Each entry is a 16-bit curve word, two bits per stat, followed by one full growth byte per stat.
Three recruits are new: Narsha (Shaman, promotes to Saint), Zuika (Assassin, promotes to Killer Machine) and Mawlock (Card User, no promotion). Character names are from the USA release. The names of the new classes are translated from the Japanese ROM, because the USA ROM doesn't store its class names as plain text. Musashi and Hanzou start in base classes here and promote to Sword Master and Super Shinobi.
The target works as on the Mega Drive, with the same truncating interpolation. "Late" now reaches 30% at level 10 and 50% at 14, up from 20% and 40%. "Early" reaches 40, 60, 70 and 80% at levels 4, 6, 10 and 14, down from 50, 70, 90 and 95%. "Early+late" is unchanged.
Share of total growth reached at each level. Points from the ROM: late (10,30) (14,50) (20,100); early (4,40) (6,60) (10,70) (14,80) (20,100); early+late (4,30) (6,40) (14,60) (16,70) (20,100).
The level goes up first. Then, for each stat:
k = min(⌊target ÷ 4⌋, 5).v = target + max(0, ⌊(256 + r1 − r2) ÷ 256⌋), where r1 and r2 are each rand(256 × k).max(current, v).The Mega Drive roll scatters around the target. This one lands exactly on it about half the time and above it the rest, by up to k. A target under 4 has k = 0, and then v is always the target + 1. These are the exact odds over all 232 states of the GBA's random generator:
A level-up rolls all seven stats in the order HP, MP, ATT, DEF, AGI, CRIT, MR. If every gain comes out 0, the game throws the roll away and tries again, up to four tries. If all four come up empty and the character is promoted and has just reached level 4 or lower, HP gets +1 anyway.
The reroll ties the stats together, so the explorer simulates whole level-ups for the GBA instead of computing each stat on its own.
When the new level is 20 or higher, each stat with nonzero growth gains +1 with probability 16,400 in 65,536 (25.02%) and nothing else. The Mega Drive game switches only above 20, so the 100% end of each GBA curve is never used as a target. Base classes don't stop at level 20: every character can level to 99.
The church promotes characters at level 10 or higher. Each stat above 0 is scaled from its actual value, so good and bad luck carry over. The level resets to 1 and the promoted growth table takes over, but the promoted targets are measured from the same level 0 stats, not from the scaled values.
Right after promotion the targets sit far below the scaled stats, so the first promoted levels mostly roll nothing until the targets catch up. That is where the +1 HP for empty early levels comes in.
Because the promoted targets don't depend on when you promoted, an early promotion costs little in the long run. Max promoted at 10 is weaker for his first 15 or so HERO levels, but by HERO level 19 the targets pass whatever he carried over, and he ends up where a level 20 or 40 promotion would have put him. Only a very late promotion keeps an edge, because 85% of a heavily leveled stat can stay above the promoted target. On the Mega Drive, an early promotion costs stats for good.
Building a character from the ROM sets level 0 and runs the normal level-up up to the record's join level, as on the Mega Drive. Musashi and Hanzou have a join level of 1 in this table. Jogurt gets the level 0 to 1 step, and after that the game ignores his level-ups. His growth is all zero anyway.
MR is magic resistance in percentage points. Each class has a resistance level for each spell element, which the game turns into a percentage of 100, 66, 33 or 0. When a spell hits a unit, the routine at $08029D50 looks up that unit's class percentage for the spell's element and, when its caller asks, subtracts that unit's MR including equipment. The result is the percent of the damage the unit takes, or for Sleep and Soul Steal the percent chance the spell lands. MR is stored next to CRIT, capped at 100 like CRIT, and rolled like every other stat. Spellcasters have the most: mages start with 20 to 40 and Wizards add 20 to 40 more, while most fighters have none. Adam has 5 at level 0 and gains 20 more as a Cyborg.
Caps: HP, MP, ATT, DEF and AGI stop at 99, CRIT and MR at 100, and level at 99.
$096BA
Each character has a block for every class they can be: base class, regular promotion, and a special promotion for characters who can take one through an item. A block lists three numbers for each of HP, MP, ATT, DEF and AGI: a curve, a start value, and a projected value the stat should reach at level 30 of that class. There is no CRIT stat in this system.
Each curve is a 29-row table for levels 2 to 30. A row holds two fractions out of 256: a, the share of growth expected by that level, and b, the share gained on that level. A sixth type, "none", means the stat never grows.
Cumulative share a ÷ 256 at each level, straight from the ROM table at $1EE02C.
Leveling from L to L+1 below level 30, with growth Δ = projected − start:
That is this level's share of the growth, rounded, with up to half a point of noise either way. Here too the two draws are consecutive generator steps, so r1 − r2 spans −118 to +118 with a near-triangular shape.
After rolling the gain, the game checks where the stat would land against the curve:
This pins stats to the curve. A stat that falls behind gets +1 extra every level until it catches up, while a stat that runs ahead keeps its lead. In the explorer you will see the 5th percentile hugging the gold expected line.
At level 30 and above, the per-level share is replaced by a flat 1.5 points, so each stat gains 1 or 2. The catch-up bonus still applies, now measured against the projected value. Base classes can level to 40, and promoted classes to 99. A stat with curve "none" never moves.
The church promotes at level 20 or higher. Promotion changes the class, MOV, resistances and the like, sets the level to 1, and switches to the promoted class's block. Stats are untouched. Every level-up still adds a gain, so the extra levels you put into the base class (up to 40) carry straight through.
HP, MP, ATT and DEF stop at 200. Base AGI stops at 100. Characters who join above level 1 get those levels rolled with the same rules when they join.
Pick a character and a promotion plan. Each panel shows the mean of one stat at every level, the band holding the middle 90% of outcomes (5th to 95th percentile), and the gold line the game is steering toward: the target in Shining Force and the GBA remake, the expected curve in Shining Force II. The Mega Drive curves are exact. The GBA curves come from 10,000 simulated playthroughs, redone whenever you change a setting.
Values as stored in the USA Mega Drive ROMs and the GBA ROMs, whose Japanese and USA tables are identical. Select a row to open that character in the explorer.
Level 0 stats, then growth by level 20 as +amount and curve. The promoted columns use the promoted class's table.
Level 0 stats, then growth as +amount and curve, for the base and promoted tables. A curve reaches its full amount at level 20, but rolls follow it only through level 19.
Each class block as start → projected at level 30, with its curve. Join class and level come from the ally start table.
$24708, target at $249D8, roll at $247F0, curve at $24A56, promotion at $24912, new-game setup at $21AEE.$081F1904, spell effects at $081F201C, items at $081F0704, classes at $081F2358 and monsters at $081F010C in the Japanese ROM, with identical contents in the USA ROM. Resistances and MR are confirmed in the spell routines at $08031608 (damage) and $08031660 (status), which go through $08029D50. Spell learning runs after each level-up at $08029F60: it teaches every entry in the character's list whose level is at or below the unit's level, the same field that promotion at $0802B2B8 resets to 1.$081F05F0 in the Japanese ROM, identical in the USA ROM at $081E1628. Monster setup at $0802B434 reads each record, the item id lookup is at $08037104, and the drop roll at $0802B9F8 compares rand(100) with the record's chance.$08029E18, per-stat routines at $08036AB8 to $08036E30, curve at $08077304, random generator at $0800A918, promotion at $0802B2B8, character setup at $0802A180. The USA release, Resurrection of the Dark Dragon, has identical tables at different addresses, and the character names on this page come from it. I checked the per-stat model by running the ROM's own routine in an ARM emulator against it on 30,000 random cases, with no mismatches.CalculateStatGain at $096BA, which matches the public SF2DISASM disassembly byte for byte.