Shining Companion
Mega Drive & Game Boy Advance · level-up code

Stat growth

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.

Shining Force

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.

Shining Force GBA

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.

Shining Force II

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.

Shining Force · level-up code at $24708

Shining Force: a target for every level

Data

What the ROM stores per character

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.

10
curve 2 (early+late)
010001
growth +17
= $91, Max's ATT growth byte
Curves

Four curves, all finishing at level 20

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.

target(L) = lv0 + ⌊growth × curve%(L) ÷ 100⌋

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).

Roll

The level-up roll

The level goes up first. Then, for each stat:

  1. Compute the target for the new level. If the target is 0, the stat never changes (this is why non-casters stay at 0 MP).
  2. Set the spread k = min(⌊target ÷ 4⌋, 5).
  3. Roll v = target + rand(k) − rand(k), capped at 99. rand(k) returns 0 to k−1.
  4. The stat becomes 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:

Past Lv 20

After level 20: a coin flip, weighted

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.

Promotion

Promotion wipes your luck

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.

promoted start = ⌊(lv0 + ⌊growth × curve%(P) ÷ 100⌋) × 85 ÷ 100⌋ promoted target(L) = promoted start + ⌊promoted growth × curve%(L) ÷ 100⌋

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.

New game

Recruits are rolled when you start the game

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

CRIT, the sixth stat

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.

Quirks

Odd cases

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.

Shining Force: Resurrection of the Dark Dragon (GBA) · level-up roll at $08029E18 in the Japanese ROM

The GBA remake: the same targets, new rules around them

Data

Seven stats and a curve word

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.

10000100
MR · CRIT · MP · HP
101010
AGI · DEF · ATT
= $212A, Max's curve word below its two unused top bits: early ATT, DEF, AGI and MR, linear HP and CRIT, late MP

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.

Curves

Two curves changed shape

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.

target(L) = lv0 + ⌊growth × curve%(L) ÷ 100⌋ used for L = 1 to 19

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).

Roll

A roll that only goes up

The level goes up first. Then, for each stat:

  1. If the stat's growth byte is 0, it never changes.
  2. Compute the target for the new level and set the spread k = min(⌊target ÷ 4⌋, 5).
  3. Roll v = target + max(0, ⌊(256 + r1 − r2) ÷ 256⌋), where r1 and r2 are each rand(256 × k).
  4. The stat becomes 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:

Reroll

Empty level-ups are rolled again

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.

Lv 20 and up

The curve stops one level early

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.

Promotion

Promotion keeps 85% of what you have

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.

promoted stat = ⌊stat × 85 ÷ 100⌋ + 1 promoted target(L) = lv0 + ⌊promoted growth × curve%(L) ÷ 100⌋

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.

Recruits

Rolled up from level 0, as before

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

Magic resistance

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.

Shining Force II · CalculateStatGain at $096BA

Shining Force II: gains that add up, with a safety net

Data

One block per class

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.

Curves

Five curves, all finishing at level 30

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.

Gain

The per-level gain

Leveling from L to L+1 below level 30, with growth Δ = projected − start:

gain = ⌊(Δ × b + r1 − r2 + 128) ÷ 256⌋ r1, r2 = rand(128)

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.

Safety net

The catch-up bonus

After rolling the gain, the game checks where the stat would land against the curve:

if current + gain < start + round(Δ × a ÷ 256): gain += 1

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.

Past Lv 30

From level 30 on: 1 or 2 per level

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.

Promotion

Promotion keeps every point

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.

Caps

Limits

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.

Computed in your browser

Character explorer

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.

Game
20

Max

Mean 5th–95th percentile Target Rolled before joining
Level-by-level table (mean, with 5th–95th percentile)
Every character, all three games

All character data

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.

Shining Force

Level 0 stats, then growth by level 20 as +amount and curve. The promoted columns use the promoted class's table.

Shining Force GBA

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.

Shining Force II

Each class block as start → projected at level 30, with its curve. Join class and level come from the ally start table.

How this page was made

Method and versions

  • The Shining Force rules come from my own disassembly of the USA ROM: level-up at $24708, target at $249D8, roll at $247F0, curve at $24A56, promotion at $24912, new-game setup at $21AEE.
  • The GBA reference tables come from the same ROMs: spells at $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.
  • The GBA enemy drops come from the per-battle enemy table at $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.
  • The GBA rules come from my disassembly of the Japanese ROM Shining Force: Kuroki Ryuu no Fukkatsu: level-up roll at $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.
  • The Shining Force II rules come from the ROM's CalculateStatGain at $096BA, which matches the public SF2DISASM disassembly byte for byte.
  • All tables were read from the ROMs. The data and the level-up logic are identical in all six Shining Force dumps (USA, Europe, Japan, USA beta, and both Mini releases) and all eight Shining Force II dumps (USA, Europe, Japan, three betas, and both Switch Online releases). The only difference: Shining Force II Beta 1 keeps its random number routine at a different address.
  • The Mega Drive curves are exact probability distributions, not simulations. For each stat, the page tracks the probability of every possible value and applies the level-up rule one level at a time (dynamic programming over the stat's value).
  • One modeling assumption: the random generator's state at each level-up is uniform and independent of the previous level-up. Battles draw many random numbers between level-ups, which makes this reasonable. Within a single roll, the dependence between the two consecutive draws is modeled exactly.
  • The GBA curves are simulated, because the reroll makes the stats depend on each other: 10,000 playthroughs per view, using the game's own random generator and starting each level-up from a random generator state.
  • The bands are per stat. They do not describe how stats move together.
  • Percentiles are the smallest value whose cumulative probability reaches 5% or 95%.