Mechanic · simulation · racing
Setup slider
A pre-race control that trades one vehicle trait against another along a single axis.
On this page
A setup slider gives the player one dial instead of a garage. In F-Zero X a single engine setting is mapped through a curve and then blends nine machine values between two ends, each end weighted by the machine’s weight1.
Games
| Game | Year | How | Note |
|---|---|---|---|
| F-Zero X | 1998 | Continuous | one engine setting from 0 to 1, curved so its middle reads 0.37, blends nine machine values between two ends |
Every claim about this mechanic, by game (1)
References
- ^ abIn 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 inGAMEMODE_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 nameaMachineAccelerationMaxSpeedTex. At the race,func_8008960C, x ↦ 1/(1.69/x − 0.69), maps the setting tounk_1A8, keeping 0 and 1 and taking 0.5 to about 0.37 (computed).Racer_InitMachineStatsthen 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 byunk_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.Codeinspectredc/fzeroxrevisedHow we know
615 if (gGameMode != GAMEMODE_LX_GP_RACE_NEXT_MACHINE_SETTINGS) { 616 gPlayerEngine[i] = 0.5f; ⋮ 620 if ((gNumPlayers == 1) && (gCourseIndex < COURSE_EDIT_1)) { 621 Save_UpdateCharacterSave(gCourseIndex); 622 gPlayerEngine[0] = gCharacterLastEngine[gRacers[0].character];
src/overlays/ovl_i4/machine.c lines 615–622 at 4b00f36 · upstream ↗ 840 stickX = temp_s1->stickX; 841 temp_fa0 = gPlayerEngine[i]; 842 temp_fv0 = (f32) stickX * 0.003; 843 var_fa1 = SQ(temp_fv0); 844 if (var_fa1 < 0.001) { 845 var_fa1 = 0.0078125f; 846 stickX = 0; 847 if (gInputPressed & BTN_LEFT) { 848 stickX = -1; 849 } else if (!(gInputPressed & BTN_RIGHT)) { 850 var_fa1 = 0.0f; ⋮ 853 if (stickX < 0) { ⋮
src/overlays/ovl_i4/machine.c lines 840–863 at 4b00f36 · upstream ↗ 426CacheTexInfo sMachineAccelerationMaxSpeedCacheTexInfo[] = 427 CACHE_TEX_INFO_COMP(TEX_CACHE_FMT_RGBA16, aMachineAccelerationMaxSpeedTex);
src/overlays/ovl_i4/machine.c lines 426–427 at 4b00f36 · upstream ↗ 836f32 func_8008960C(f32 arg0) { 837 if (arg0 != 0.0f) { 838 return 1.0f / (((1.0f + 0.6899998f) / arg0) - 0.6899998f); ⋮ 840 return 0.0f;
src/game/racer.c lines 836–841 at 4b00f36 · upstream ↗ 865 gRacers[i].unk_1A8 = func_8008960C(gPlayerEngine[i]);src/game/racer.c line 865 at 4b00f36 · upstream ↗ 1428 temp_fs0 = (racer->unk_1F0 - 780.0f) / 1560.0f; ⋮ 1432 temp_fv0 = ((((f32) ((ROM_READ(0x078) >> 0xF) & 0xFF) * 0.1f) - 1433 ((f32) (((ROM_READ(0x50C) >> 0x13) & 0xFF) | 0x600) * 0.001f)) * 1434 temp_fs0) + 1435 ((f32) (((ROM_READ(0x50C) >> 0x13) & 0xFF) | 0x600) * 0.001f); ⋮ 1438 temp_fs0) + ⋮ 1441 racer->unk_1B4 = 1442 ((temp_fv1 - temp_fv0) * arg1) + temp_fv0 + (0.2f * (temp_fv0 - temp_fv1) * (1.0f - SQ((2.0f * arg1) - 1.0f)));
src/game/racer.c lines 1428–1442 at 4b00f36 · upstream ↗ 1536 temp_fa1 = ((temp_fv1 - temp_fv0) * racer->unk_1A8) + temp_fv0;src/game/racer.c line 1536 at 4b00f36 · upstream ↗ 1640 racer->unk_1F0 = machine->weight; ⋮ 1649 temp_fv0_4 = Racer_InitMachineStats(racer, racer->unk_1A8);
src/game/racer.c lines 1640–1649 at 4b00f36 · upstream ↗ 40#define PHYS_TO_K1ROM(x) (((u32) (x) | 0xB0000000)) 41#define ROM_READ(addr) (*(vu32*) PHYS_TO_K1ROM(addr))
include/macros.h lines 40–41 at 4b00f36 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
Sources
Code
- inspectredc and fzerox contributors. 2026. “F-Zero X decompilation (inspectredc/fzerox).” Commit 4b00f36. inspectredc/fzerox @ 4b00f36 · licence, all uses