On this page
  1. Related
  2. Mechanics
  3. References
  4. Sources

Fire Emblem: The Binding Blade, Fūin no Tsurugi in Japanese, is a tactical role-playing game for the Game Boy Advance. The code read here is the FireEmblemUniverse fireemblem6j decompilation, which builds the Japanese ROM.

It already rolls hit on the average of two random numbers1. Each number divides a 16-bit value by 655, so it can reach 100, and a displayed 100 misses when both do: 1,296 times in 2³², computed from the code with the two rolls taken as independent2. The Sacred Stones scales by 100/65,536 instead, so its numbers stop at 99 and a displayed 100 always hits3.

Mechanics

MechanicKindHow
Hit chanceTwo rolls averagedhit less avoid, against the average of two numbers from 0 to 100, so even a shown 100 can miss
Critical hitWeapon and statsthe weapon's crit plus half the skill, plus 30 for some classes, less the defender's luck; a critical triples the damage
Every claim about this game, by concept (4)

References

  1. ^The Binding Blade hits when the displayed hit is greater than the average of two random numbers, rounded down; each number divides a 16-bit NextRN() by 655, so it runs from 0 to 100, and 100 comes from only 36 of the 65,536 values.Codefireemblem6j
    How we know
    69int RandNext_100(void)
    ⋮
    71    // take the next rn (range 0-0xFFFF) and convert it to a range 0-99 value
    72    // NOTE: bugged due to rounding
    73    return NextRN() / (UINT16_MAX / 100);
    
    src/random.c lines 69–73 at e83dd39 · upstream ↗
    88bool RandRoll2Rn(int threshold)
    ⋮
    92    rand = RandNext_100();
    93    rand = rand + RandNext_100();
    94    rand = rand / 2;
    ⋮
    96    return (threshold > rand);
    
    src/random.c lines 88–96 at e83dd39 · upstream ↗
    746    if (BattleRandRoll2Rn(gBattleSt.hit, TRUE) == FALSE)
    ⋮
    748        gBattleHitIt->attributes |= BATTLE_HIT_ATTR_MISS;
    
    src/battle.c lines 746–749 at e83dd39 · upstream ↗
    738    gBattleSt.hit = attacker->battle_effective_hit;
    
    src/battle.c line 738 at e83dd39 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  2. ^Computed from the code, taking the two numbers as independent, a displayed 80 in The Binding Blade hits 92.16% of the time, 50 hits 50.44%, and 20 hits 8.19%; a displayed 100 misses 1,296 times in 4,294,967,296, when both numbers come out 100.Codefireemblem6jrevised
    How we know
    73    return NextRN() / (UINT16_MAX / 100);
    
    src/random.c line 73 at e83dd39 · upstream ↗
    92    rand = RandNext_100();
    93    rand = rand + RandNext_100();
    94    rand = rand / 2;
    ⋮
    96    return (threshold > rand);
    
    src/random.c lines 92–96 at e83dd39 · upstream ↗
    521    if (attacker->battle_effective_hit > 100)
    522        attacker->battle_effective_hit = 100;
    
    src/battle.c lines 521–522 at e83dd39 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Revised after a check by a second AI model, 2026-10-21.

    In the claim ledger

  3. ^In the North American build, an attack hits when the displayed hit is greater than the average of two random numbers from 0 to 99, rounded down; each number scales a 16-bit NextRN() by 100/65,536.Codefireemblem8u
    How we know
    68int NextRN_100(void) {
    69    // take the next rn (range 0-0xFFFF) and convert it to a range 0-99 value
    70    return NextRN() * 100 / 0x10000;
    
    src/rng.c lines 68–70 at 04d1edb · upstream ↗
    89s8 Roll2RN(int threshold) {
    90    int average = (NextRN_100() + NextRN_100()) / 2;
    ⋮
    92    return (threshold > average);
    
    src/rng.c lines 89–93 at 04d1edb · upstream ↗
    1007    if (!(gBattleHitIterator->attributes & BATTLE_HIT_ATTR_SURESHOT)) {
    1008        if (!BattleRoll2RN(gBattleStats.hitRate, TRUE)) {
    1009            gBattleHitIterator->attributes |= BATTLE_HIT_ATTR_MISS;
    
    src/bmbattle.c lines 1007–1011 at 04d1edb · upstream ↗
    879void BattleUpdateBattleStats(struct BattleUnit* attacker, struct BattleUnit* defender) {
    ⋮
    882    gBattleStats.hitRate = attacker->battleEffectiveHitRate;
    
    src/bmbattle.c lines 879–882 at 04d1edb · upstream ↗
    260    PutNumberTwoChr(gUiTmScratchA + 0xA8 + 0x40, 2, gBattleActor.battleEffectiveHitRate);
    
    src/bksel.c line 260 at 04d1edb · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

Sources

Code