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

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.

  • ContinuousF-Zero X (1998). One engine setting from 0 to 1, curved so its middle reads 0.37, blends nine machine values between two ends.1

Games

GameYearHowNote
F-Zero X1998Continuousone 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

  1. ^ 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 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.Codeinspectredc/fzeroxrevised
    How 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.

    In the claim ledger

Sources

Code