Claim set · data/claims/fzerox.yaml

F-Zero X (the inspectredc/fzerox decompilation)

Game: F-Zero X.

In F-Zero X's US build, Racer_InitRacer sets a machine's energy and maxEnergy from gBodyHealthValues by its body grade (BODY_STAT): 190 for grade A, 178 for B, 166 for C, 154 for D, and 142 for E, so a racer starts each race with a full meter. In Death Race (GAMEMODE_DEATH_RACE), Racer_Init then halves both values for every racer after gRacers[0], which holds player 1's machine, so the other machines run on half a meter (71 to 95). fzerox/max-energy

About: F-Zero X Energy meter

Value
{
 "A": 190,
 "B": 178,
 "C": 166,
 "D": 154,
 "E": 142
}
CodeF-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L440-L442f32 gBodyHealthValues[] = { 190.0f, 178.0f, 166.0f, 154.0f, 142.0f, };F-Zero X decompilation (inspectredc/fzerox) · include/fzx_racer.h#L58-L64typedef enum BodyStat { /* 0 */ BODY_A, … /* 4 */ BODY_E, } BodyStat;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1660-L1660racer->energy = racer->maxEnergy = gBodyHealthValues[machine->machineStats[BODY_STAT]];F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1823-L1828if (gGameMode == GAMEMODE_DEATH_RACE) { for (racer = sLastRacer; racer > gRacers; racer--) { racer->energy *= 0.5f; racer->maxEnergy *= 0.5f; } }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L862-L866for (i = gNumPlayers - 1; i >= 0; i--) { gPlayerCharacters[i] = gRacers[i].character; … }Checked by claude, 2026-10-22 — read the table, the BodyStat enum, Racer_InitRacer's energy lines, and Racer_Init, which calls Racer_InitRacer for every racer (L1797) before the Death Race loop; the loop's `racer > gRacers` stops before gRacers[0]. Players occupy gRacers[0] up (L862-L866).

Cited by: F-Zero X

In F-Zero X's US build, Racer_ReceiveDamage subtracts the damage it's given from energy, unless the machine is crashed or has finished (RACER_STATE_CRASHED, RACER_STATE_FINISHED). If that takes the energy below 0, a machine whose machineLod is 0 is set to 0.1 instead, and nothing else happens; Racer_Draw sets that field to 0 for a machine outside the camera's view (behind it, more than 2500 ahead, or off the screen's edges), and Racer_Update sets every machine's to 1 when more than one player is racing. Any other machine is set to 0 and, unless already crashed or spinning out, put into the state the decompilers name RACER_STATE_SPINNING_OUT. Racer_HitWall deals 0.7 times the machine's speed into the wall, when that speed is above 0.01, and a landmine (within 30 units of the machine) deals 12.5. fzerox/damage

About: F-Zero X Energy meter

Value
{
 "wall-factor": 0.7,
 "landmine": 12.5
}
CodeF-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L2240-L2240if (racer->stateFlags & (RACER_STATE_CRASHED | RACER_STATE_FINISHED)) {F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L2292-L2316} else { #if BUILD_REVISION >= REVISION_C … racer->energy -= damageStrength; … if (racer->energy < 0.0f) { if (racer->machineLod == 0) { racer->energy = 0.1f; return; } racer->energy = 0.0f; … …F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L5609-L5618for (racer = sLastRacer; racer >= gRacers; racer--) { racer->machineLod = racer->unk_2B2 = racer->unk_2B3 = 0; if (racer->stateFlags & RACER_STATE_ACTIVE) { … if ((temp_fa0 < 0.0f) || (temp_fa0 > 2500.0f)) { continue; }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L5094-L5097if (gNumPlayers != 1) { for (racer = sLastRacer; racer >= gRacers; racer--) { racer->machineLod = racer->unk_2B2 = racer->unk_2B3 = 1; }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L2353-L2366if (lateralVelocity * wallDirection > 0.01f) { … Racer_ReceiveDamage(racer, lateralVelocity * wallDirection * 0.7f); }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L3641-L3646if ((SQ(var_fs1) + SQ(var_fs0) + SQ(var_ft4)) < 900.0f) { … racer->stateFlags |= RACER_STATE_TOUCHING_LANDMINE; Racer_ReceiveDamage(racer, 12.5f);Checked by claude, 2026-10-22 — read Racer_ReceiveDamage whole (the crashed branch only sets off an explosion), Racer_HitWall, the landmine loop in Racer_UpdateFromControls, and the lod loop in Racer_Draw (L5609-L5652: depth 0 to 2500 and the projected x and y within ±1, else 0). The REVISION_C guard is off in the US build (REVISION_B, Makefile L166), so the subtraction always runs. Other callers (a 2.0 hit in func_8008E54C, and collisions) aren't covered here.

Cited by: Energy meter, F-Zero X

In F-Zero X's US build, pressing B starts a boost only when no boost is running (boostTimer is 0), energy isn't exactly 0, and the machine has RACER_STATE_CAN_BOOST. The boost sets boostTimer to 100 (sInitialBoostTimer), and on each update while it runs, the machine pays boostEnergyUsage, 0.0015 of its maxEnergy, from energy; if that takes the energy below 0, it's set to 0 and the boost ends on that update. A whole boost costs 0.15 of the meter and lasts 100 updates, about 1.7 seconds at 60 updates a second, the rate the race clock counts (computed). In a multiplayer race with the VS handicap on, the cost falls with distance behind the leader, linearly to 0.1 of it at 2000 or more behind. fzerox/boost-cost

About: F-Zero X Energy meter

Value
{
 "per-update": 0.0015,
 "updates": 100,
 "per-boost": 0.15
}
CodeF-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L3598-L3603if ((buttonPressed & BTN_B) && (racer->boostTimer == 0) && (racer->energy != 0.0) && (racer->stateFlags & RACER_STATE_CAN_BOOST)) { … racer->boostTimer = sInitialBoostTimer;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L386-L386s32 sInitialBoostTimer = 100;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1661-L1661racer->boostEnergyUsage = racer->maxEnergy * 0.0015f;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L4035-L4071if (racer->boostTimer != 0) { if (racer->stateFlags & RACER_STATE_DASH_PAD_BOOST) { … } else { … if ((gNumPlayers == 1) || (gSettingVsHandicap == 0)) { sp128 = racer->boostEnergyUsage; } else { sp128 = (gRacersByPosition[0]->raceDistance - racer->raceDistance); sp128 /= D_800CE4D8; if (sp128 >= 1.0f) { sp128 = racer->boostEnergyUsage * 0.1f; …F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L343-L343f32 D_800CE4D8 = 2000.0f;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L4303-L4305racer->unk_2A4++; #if OS_TV_TYPE == OS_TV_TYPE_NTSC racer->raceTime = (s32) (racer->unk_2A4 * 50) / 3;Checked by claude, 2026-10-22 — read the B-button test and the boost block of Racer_UpdateFromControls; the EXPANSION_KIT guard around the cost is off in the US build. The race clock in the same function adds 50/3 ms per update on NTSC. The seconds and the 0.15 are 100 × 0.0015 and 100 / 60.

Cited by: Energy meter, F-Zero X

In F-Zero X's US build, a machine starts the race without RACER_STATE_CAN_BOOST unless the race is the title demo, Practice, or Death Race, which set it from the start. A machine starts at lap 0 with lapsCompleted 1, and lap counts up at each crossing of the line; when it reaches one more than lapsCompleted (and no more than one past the last lap), the code records the lap and sets the flag. The first crossing, at the start, brings lap to 1 and doesn't set it; completing the first lap does, so in the Grand Prix and VS races boosting opens from the second lap (computed from the counters). fzerox/boost-unlock

About: F-Zero X Energy meter

Value: 2 lap (first lap a boost is allowed)

CodeF-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1580-L1590if ((gTitleDemoState != TITLE_DEMO_INACTIVE) || (gGameMode == GAMEMODE_PRACTICE) || (gGameMode == GAMEMODE_DEATH_RACE)) { … racer->stateFlags = RACER_STATE_ACTIVE | RACER_STATE_FLAGS_20000000 | RACER_STATE_CAN_BOOST | RACER_STATE_FLAGS_8000; } else { racer->stateFlags = RACER_STATE_ACTIVE | RACER_STATE_FLAGS_20000000 | RACER_STATE_FLAGS_8000; }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1614-L1625racer->lapsCompletedDistance = -gCurrentCourseInfo->length; … racer->lapsCompleted = 1; … racer->bodyWhiteTimer = racer->spinOutTimer = racer->completedLapsTime = racer->raceTime = racer->lap = … racer->vibrationStrength = 0;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L4309-L4314if (sCourseHalfLength < sp128) { racer->lapsCompletedDistance += gCurrentCourseInfo->length; racer->lap++; if ((racer->lap == racer->lapsCompleted + 1) && (racer->lap <= (gTotalLapCount + 1))) { racer->lapsCompleted = racer->lap; racer->stateFlags |= RACER_STATE_CAN_BOOST;Checked by claude, 2026-10-22 — read Racer_InitRacer's flags and counters (the EXPANSION_KIT branch adding Course Edit is off in the US build) and the lap code in Racer_UpdateFromControls; the race starts a course length behind the line, so the first crossing is the start. No other code sets RACER_STATE_CAN_BOOST (grep). The HUD reads the flag (ovl_i3/hud.c L626); what it draws isn't read.

Cited by: F-Zero X

In F-Zero X's US build, on each update that a machine is on a pit surface (COURSE_EFFECT_PIT) and isn't crashed, airborne, or spinning out, it gains energyIncrease, 0.008 of its maxEnergy (sEnergyRefillScale), up to the maximum. An empty meter refills in 125 updates, about 2.1 seconds at 60 updates a second (computed). fzerox/pit-refill

About: F-Zero X Energy meter

Value: 0.008 of maximum energy per update

CodeF-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L387-L387f32 sEnergyRefillScale = 0.008f;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1666-L1666racer->energyIncrease = racer->maxEnergy * sEnergyRefillScale;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L4482-L4487if ((racer->stateFlags & (RACER_STATE_CRASHED | RACER_STATE_AIRBORNE | RACER_STATE_SPINNING_OUT | COURSE_EFFECT_MASK)) == COURSE_EFFECT_PIT) { racer->energy += racer->energyIncrease; if (racer->maxEnergy < racer->energy) { racer->energy = racer->maxEnergy; }Checked by claude, 2026-10-22 — read the pit block of Racer_UpdateFromControls and the setup in Racer_InitRacer; 1 / 0.008 = 125. The pit's force field (pitForceFieldSize, L4489) isn't covered.

Cited by: Energy meter, F-Zero X

In F-Zero X's US build, when two machines first touch and one belongs to a human player, the other records that player as its last contact (unk_28C) and resets a counter (unk_288) that counts up on each update while the machine isn't crashed, finished, or falling off the track, the race intro timer (gRaceIntroTimer) is under 40, and the mode isn't GAMEMODE_RECORDS. When damage puts a machine into its spin-out, func_8008DBB8 credits that player if the contact was no more than 60 updates before and the player isn't finished, retired, or spinning out: it adds to gRacersKOd (by the atlas's reading of the name, a count of knock-outs), and in the Grand Prix the fifth (gRacersKOd == 5) gives player 1 a life. The player gains an eighth of their maxEnergy (energyRegain), added on the next update they aren't crashed or spinning out, up to the maximum. fzerox/ko-regain

About: F-Zero X Energy meter

Value: 0.125 of maximum energy (per knock-out)

CodeF-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L5148-L5156if (!racerPair->areColliding) { if (racer->id < gNumPlayers) { racer2->unk_288 = 0; racer2->unk_28C = racer; } if (racer2->id < gNumPlayers) { racer->unk_288 = 0; racer->unk_28C = racer2; }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L4298-L4302if (!(racer->stateFlags & (RACER_STATE_CRASHED | RACER_STATE_FINISHED | RACER_STATE_FALLING_OFF_TRACK)) && (gRaceIntroTimer < 40) && (gGameMode != GAMEMODE_RECORDS)) { … racer->unk_288++;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L2315-L2320if (!(racer->stateFlags & (RACER_STATE_CRASHED | RACER_STATE_SPINNING_OUT))) { racer->stateFlags |= RACER_STATE_SPINNING_OUT; … func_8008DBB8(racer, 60);F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L2196-L2221void func_8008DBB8(Racer* arg0, s32 arg1) { … if (arg1 < arg0->unk_288) { return; } temp_v0 = arg0->unk_28C; if (temp_v0 == NULL) { return; } if (temp_v0->stateFlags & (RACER_STATE_FINISHED | RACER_STATE_RETIRED | RACER_STATE_SPINNING_OUT)) { return; } …F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L5085-L5091if ((racer->energyRegain != 0.0f) && !(racer->stateFlags & (RACER_STATE_CRASHED | RACER_STATE_SPINNING_OUT))) { racer->energy += racer->energyRegain; if (racer->energy > racer->maxEnergy) { racer->energy = racer->maxEnergy; } racer->energyRegain = 0.0f; }Checked by claude, 2026-10-22 — read the first-contact block of the pair loop in Racer_Update, the counter in the race-clock block of Racer_UpdateFromControls (it runs only under that block's conditions: not crashed, finished, or falling, and gRaceIntroTimer under 40), the spin-out entry in Racer_ReceiveDamage, func_8008DBB8, and the regain block of Racer_Update. "Knock-out" is the atlas's reading of gRacersKOd's name. unk_28C starts as NULL (L1620).

Cited by: F-Zero X

In F-Zero X's US build, when two machines first touch, the impact is 1.1 times their closing speed along the line between them. If neither is attacking (attackState, whose states the decompilers name side and spin attacks), each takes that impact times the other's share of their two collidingStrengths, a number set from body grade and weight, with a crashed machine's strength counted at a third (0.333). If only one is attacking, the other takes the whole impact, and ten times the impact when the attacker is gRacers[0] in a one-player race; the pair loop always puts the lower-numbered racer second, so player 1's machine is the attacker in that test whenever it attacks. If both attack, each takes its share as if neither were. fzerox/collision-attack

Value: 10 × impact (player 1's attacks, one-player race)

CodeF-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L5107-L5107racer2 = racer - 1;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L5132-L5144if (racer->stateFlags & RACER_STATE_CRASHED) { var_fs2 = racer->collidingStrength * 0.333f; } else { var_fs2 = racer->collidingStrength; } if (racer2->stateFlags & RACER_STATE_CRASHED) { var_fs1 = racer2->collidingStrength * 0.333f; } else { var_fs1 = racer2->collidingStrength; } temp_fv1_3 = var_fs2 + var_fs1; var_fs2 /= temp_fv1_3; …F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L5168-L5172var_fs0 = (var_fa0 * xVelocityDiff) + (var_fa1 * yVelocityDiff) + (var_ft4 * zVelocityDiff); … if (var_fs0 < 0.0f) { var_fs0 = -var_fs0; }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L5186-L5201var_fs0 *= 1.1f; if (racer->attackState == ATTACK_STATE_NONE) { if (racer2->attackState == ATTACK_STATE_NONE) { Racer_ReceiveDamage(racer, var_fs1 * var_fs0); Racer_ReceiveDamage(racer2, var_fs2 * var_fs0); } else if ((racer2 == gRacers) && (gNumPlayers == 1)) { Racer_ReceiveDamage(racer, var_fs0 * 10.0f); } else { Racer_ReceiveDamage(racer, var_fs0); } } else if (racer2->attackState == ATTACK_STATE_NONE) { Racer_ReceiveDamage(racer2, var_fs0); …F-Zero X decompilation (inspectredc/fzerox) · include/fzx_racer.h#L89-L91/* 0 */ ATTACK_STATE_NONE, /* 1 */ ATTACK_STATE_SIDE, /* 2 */ ATTACK_STATE_SPIN,F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1641-L1642racer->collidingStrength = ((4 - machine->machineStats[BODY_STAT]) * 312.0f) + 780.0f + ((312.0f * (machine->weight - 780.0f)) / 1560.0f);Checked by claude, 2026-10-22 — read the pair loop of Racer_Update from L5099 to L5201: racer2 runs down from racer - 1, so gRacers[0] is only ever racer2; the separation (sp110, sp10C, sp108) is normalised before the dot product, and the damage runs once per touch (!racerPair->areColliding). The strength is squared after L1642 (L1646). How attackState is set isn't covered.

Cited by: F-Zero X

In F-Zero X's US build, on each update that a machine isn't crashed and is on a dash surface (COURSE_EFFECT_DASH), and B isn't starting a boost, the code holds A for it, sets RACER_STATE_DASH_PAD_BOOST, and sets boostTimer to 100, so a dash plate starts a boost or tops a running one back up. While that flag is set the boost costs no energy, and the boost multiplies the machine's two acceleration terms by at least unk_1C4, a value set with grade C's boost number (0.204, D_800CF174[2]), where a B boost uses unk_1C0, set with the machine's own boost grade. fzerox/dash-plate

About: F-Zero X Boost pad

Value: 100 updates (boostTimer)

CodeF-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L3608-L3621} else { #ifndef EXPANSION_KIT if ((racer->stateFlags & (RACER_STATE_CRASHED | COURSE_EFFECT_MASK)) == COURSE_EFFECT_DASH) { … buttonCurrent |= BTN_A; … racer->stateFlags |= RACER_STATE_DASH_PAD_BOOST; racer->boostTimer = sInitialBoostTimer;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L4035-L4043if (racer->boostTimer != 0) { if (racer->stateFlags & RACER_STATE_DASH_PAD_BOOST) { if (var_ft4 < racer->unk_1C4) { var_ft4 = racer->unk_1C4; } } else { if (var_ft4 < racer->unk_1C0) { var_ft4 = racer->unk_1C0; }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L4073-L4074var_fs1 *= var_ft4; var_fs0 *= var_ft4;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1538-L1540racer->unk_1C0 = (D_800CF174[temp_a1->machineStats[BOOST_STAT]] + temp_fa1) / racer->unk_1B8; temp_fs1 += racer->unk_1C0; racer->unk_1C4 = (D_800CF174[2] + temp_fa1) / racer->unk_1B8;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L444-L446f32 D_800CF174[] = { 0.210f, 0.207f, 0.204f, 0.201f, 0.198f, };Checked by claude, 2026-10-22 — read the B-boost test and its else branch in Racer_UpdateFromControls (the US build takes the #ifndef EXPANSION_KIT side), the boost block at L4035-L4074 (the cost is in the non-dash branch only), and Racer_InitMachineStats; var_fs1 and var_fs0 are the acceleration ends chosen at L4011-L4022. The BoostStat enum puts BOOST_A at 0 (include/fzx_racer.h L67).

Cited by: F-Zero X

In F-Zero X's US build, the machine-settings screen holds each player's engine setting (gPlayerEngine) between 0 and 1, set to 0.5 when the screen opens, except in GAMEMODE_LX_GP_RACE_NEXT_MACHINE_SETTINGS, which keeps the previous setting; in one-player races on the built-in courses, player 1's is then set to the character's last setting. The stick moves it by the square of 0.003 times its x position per update; with the stick under that threshold (a square below 0.001), D-pad left or right moves it by 1/128. The screen draws it with a texture the decompilers name aMachineAccelerationMaxSpeedTex. At the race, func_8008960C, x ↦ 1/(1.69/x − 0.69), maps the setting to unk_1A8, keeping 0 and 1 and taking 0.5 to about 0.37 (computed). Racer_InitMachineStats then blends nine machine values (unk_1B0, unk_1B4, unk_1B8, unk_1BC, unk_1C8, unk_1F8, unk_1FC, unk_1CC's divisor, and a term in both boost multipliers) between two ends by unk_1A8; four of the blends add 0.2 times the gap between the ends times 1 − (2s − 1)², which is 0 at either end and largest at the middle. Each end is itself a blend by the machine's weight, (weight − 780)/1560, of two numbers the function reads from fixed offsets of the cartridge ROM, from 0x078 to 0xA20 (ROM_READ), so the repo doesn't hold the values. fzerox/engine-setting

About: F-Zero X Setup slider

Value
{
 "default": 0.5,
 "mapped-default": 0.37,
 "dpad-step": 0.0078125
}
CodeF-Zero X decompilation (inspectredc/fzerox) · src/overlays/ovl_i4/machine.c#L615-L622if (gGameMode != GAMEMODE_LX_GP_RACE_NEXT_MACHINE_SETTINGS) { gPlayerEngine[i] = 0.5f; } } if ((gNumPlayers == 1) && (gCourseIndex < COURSE_EDIT_1)) { Save_UpdateCharacterSave(gCourseIndex); gPlayerEngine[0] = gCharacterLastEngine[gRacers[0].character];F-Zero X decompilation (inspectredc/fzerox) · src/overlays/ovl_i4/machine.c#L840-L863stickX = temp_s1->stickX; temp_fa0 = gPlayerEngine[i]; temp_fv0 = (f32) stickX * 0.003; var_fa1 = SQ(temp_fv0); if (var_fa1 < 0.001) { var_fa1 = 0.0078125f; stickX = 0; if (gInputPressed & BTN_LEFT) { stickX = -1; } else if (!(gInputPressed & BTN_RIGHT)) { var_fa1 = 0.0f; } …F-Zero X decompilation (inspectredc/fzerox) · src/overlays/ovl_i4/machine.c#L426-L427CacheTexInfo sMachineAccelerationMaxSpeedCacheTexInfo[] = CACHE_TEX_INFO_COMP(TEX_CACHE_FMT_RGBA16, aMachineAccelerationMaxSpeedTex);F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L836-L841f32 func_8008960C(f32 arg0) { if (arg0 != 0.0f) { return 1.0f / (((1.0f + 0.6899998f) / arg0) - 0.6899998f); } return 0.0f; }F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L865-L865gRacers[i].unk_1A8 = func_8008960C(gPlayerEngine[i]);F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1428-L1442temp_fs0 = (racer->unk_1F0 - 780.0f) / 1560.0f; … temp_fv0 = ((((f32) ((ROM_READ(0x078) >> 0xF) & 0xFF) * 0.1f) - ((f32) (((ROM_READ(0x50C) >> 0x13) & 0xFF) | 0x600) * 0.001f)) * temp_fs0) + ((f32) (((ROM_READ(0x50C) >> 0x13) & 0xFF) | 0x600) * 0.001f); … racer->unk_1B4 = ((temp_fv1 - temp_fv0) * arg1) + temp_fv0 + (0.2f * (temp_fv0 - temp_fv1) * (1.0f - SQ((2.0f * arg1) - 1.0f)));F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1536-L1536temp_fa1 = ((temp_fv1 - temp_fv0) * racer->unk_1A8) + temp_fv0;F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1640-L1649racer->unk_1F0 = machine->weight; … temp_fv0_4 = Racer_InitMachineStats(racer, racer->unk_1A8);F-Zero X decompilation (inspectredc/fzerox) · include/macros.h#L40-L41#define PHYS_TO_K1ROM(x) (((u32) (x) | 0xB0000000)) #define ROM_READ(addr) (*(vu32*) PHYS_TO_K1ROM(addr))Checked by claude, 2026-10-22 — read MachineSettings_Init and the per-player input block of the settings update in machine.c, func_8008960C, the copy at race setup (L862-L866), and Racer_InitMachineStats whole (L1419-L1548): the bulge term is on unk_1B4 and unk_1B0 as (fv0 − fv1) and on unk_1C8 and the unk_1CC divisor as (fv1 − fv0); the boost term (L1536) blends by racer->unk_1A8, the same value passed as arg1. The lowest and highest offsets are 0x078 and 0xA20. 1/(1.69/0.5 − 0.69) = 0.3717. Which end of the slider the texture labels acceleration, and which machine value is top speed, isn't read.

Cited by: F-Zero X, Setup slider

In F-Zero X's US build, Machine_DrawBlueFalconLod1, by its name a draw routine for the Blue Falcon, reads the word at offset 0x510 of the cartridge ROM until it has read the same value three times in a row (the first read is compared with 0). If its lowest bit is set, it counts the call (D_800CE784), and from the 13th such call it sets all five gBodyHealthValues to 1.0, the maximum energy machines are given when a race is set up, and calls func_i2_801039BC. The atlas hasn't read what the word holds on a retail cartridge. fzerox/body-check

About: F-Zero X Energy meter

Value: 1 energy (maximum, after the check trips)

CodeF-Zero X decompilation (inspectredc/fzerox) · src/overlays/ovl_i9/machine_draw.c#L4941-L4969Gfx* Machine_DrawBlueFalconLod1(Gfx* gfx) { … while (var_a0 < 2) { while (IO_READ(PI_STATUS_REG) & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) {} temp_v1 = ROM_READ(0x510); if (temp_v1 == var_a1) { var_a0++; } else { var_a0 = 0; } var_a1 = temp_v1; } …F-Zero X decompilation (inspectredc/fzerox) · src/game/racer.c#L1660-L1660racer->energy = racer->maxEnergy = gBodyHealthValues[machine->machineStats[BODY_STAT]];Checked by claude, 2026-10-22 — read the function's opening (L4941-L4969); the rest draws the model. D_800CE784 starts at 0 (racer.c L390). func_i2_801039BC isn't read.

Cited by: F-Zero X