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

A boost meter limits how long a craft can speed up or slow down. In Star Fox 64 boost and brake drain one meter, and letting go of both buttons or using it up locks both until it has refilled1.

  • Shared, with cooldownStar Fox 64 (1997). Boost and brake fill one 90-unit meter by 3 an update on rails; once let go or full it must empty to 0 before either works again.1
  • Free refillDescent 3 (1999). A 5-second afterburner tank at 1.6 times forward thrust, refilled while let go at a cost in energy.2

Games

GameYearHowNote
Star Fox 641997Shared, with cooldownboost and brake fill one 90-unit meter by 3 an update on rails; once let go or full it must empty to 0 before either works again
Descent 31999Free refilla 5-second afterburner tank at 1.6 times forward thrust, refilled while let go at a cost in energy
Every claim about this mechanic, by game (2)

References

  1. ^ abIn the US 1.1 version of Star Fox 64, the Arwing's boost and brake share one meter, boostMeter, which counts up from 0 as it is used and stops at 90. Holding the boost button adds 3 a player update on rails and 1.5 in all-range mode (Player_ArwingBoost), and holding brake adds the same amounts (Player_ArwingBrake). Each of the two functions takes back 0.5 a update on rails (0.35 in all-range mode) whenever its own action isn't running, so the meter falls by 1 an update on rails when neither button is held. Reaching 90, holding both buttons with the meter above 0, or letting go of both with the meter above 0 sets boostCooldown, which blocks both actions until the meter is back to 0.Codesonicdcer/sf64
    How we know
    4951void Player_ArwingBoost(Player* player) {
    ⋮
    4956    if ((player->boostMeter != 0.0f) && (gInputHold->button & gBrakeButton[player->num]) &&
    4957        (gInputHold->button & gBoostButton[player->num])) {
    4958        player->boostCooldown = true;
    ⋮
    4961    if (gLevelMode == LEVELMODE_ON_RAILS) {
    4962        boostDepleteRate = 3.0f;
    4963        boostRecoverRate = 0.5f;
    ⋮
    4966        boostDepleteRate = 1.5f;
    4967        boostRecoverRate = 0.35f;
    
    src/engine/fox_play.c lines 4951–4968 at 4235c59 · upstream ↗
    5024        if (!(gInputHold->button & gBrakeButton[player->num]) && !(gInputHold->button & gBoostButton[player->num])) {
    5025            player->boostCooldown = true;
    5026            if (player->boostMeter == 0.0f) {
    5027                player->boostCooldown = false;
    ⋮
    5030        if ((gInputHold->button & gBoostButton[player->num]) && !(gInputHold->button & gBrakeButton[player->num]) &&
    5031            (player->state != PLAYERSTATE_U_TURN) && !player->boostCooldown) {
    
    src/engine/fox_play.c lines 5024–5031 at 4235c59 · upstream ↗
    5047            player->boostMeter += boostDepleteRate;
    5048            if (player->boostMeter > 90.0f) {
    5049                player->boostMeter = 90.0f;
    5050                player->boostCooldown = true;
    
    src/engine/fox_play.c lines 5047–5051 at 4235c59 · upstream ↗
    5064        } else {
    5065            if (player->boostMeter > 0.0f) {
    5066                player->boostMeter -= boostRecoverRate;
    5067                if (player->boostMeter <= 0.0f) {
    5068                    player->boostMeter = 0.0f;
    5069                    player->boostCooldown = false;
    
    src/engine/fox_play.c lines 5064–5069 at 4235c59 · upstream ↗
    5092    if (gLevelMode == LEVELMODE_ON_RAILS) {
    5093        brakeDepleteRate = 3.0f;
    5094        brakeRecoverRate = 0.5f;
    5095    } else {
    5096        brakeDepleteRate = 1.5f;
    5097        brakeRecoverRate = 0.35f;
    
    src/engine/fox_play.c lines 5092–5098 at 4235c59 · upstream ↗
    5130    if ((gInputHold->button & gBrakeButton[player->num]) && !(gInputHold->button & gBoostButton[player->num]) &&
    5131        (player->state != PLAYERSTATE_U_TURN) && !player->boostCooldown) {
    ⋮
    5146        player->boostMeter += brakeDepleteRate;
    5147        if (player->boostMeter > 90.0f) {
    5148            player->boostCooldown = true;
    5149            player->boostMeter = 90.0f;
    ⋮
    5161    } else if (player->boostMeter > 0.0f) {
    5162        player->boostMeter -= brakeRecoverRate;
    5163        if (player->boostMeter <= 0.0f) {
    5164            player->boostMeter = 0.0f;
    5165            player->boostCooldown = false;
    
    src/engine/fox_play.c lines 5130–5165 at 4235c59 · upstream ↗
    5601void Player_Update360(Player* player) {
    5602    switch (player->form) {
    5603        case FORM_ARWING:
    5604            Player_ArwingBank(player);
    5605            Player_ArwingBoost(player);
    5606            Player_ArwingBrake(player);
    
    src/engine/fox_play.c lines 5601–5606 at 4235c59 · upstream ↗

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

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

    In the claim ledger

  2. ^Descent 3's released source gives the afterburner a 5-second tank (AFTERBURN_TIME, 5000 in an E3 demo build): while it is held and time is left, the forward control is replaced by the afterburner control times 1.6, and times a punch factor of 1.8 while over 90% of the tank is left, the factor easing to 1 by 80%, and the tank drains by the frame time. Let go, the tank refills by the frame time, or twice that with the "Afterburner" item in the inventory, but only while energy is above 5, and energy drops by the same amount, so a full refill costs 5 energy (computed) whichever rate applies.CodeDescentDevelopers/Descent3revised
    How we know
    372// How long afterburner lasts before it has to be recharged
    373#ifdef E3_DEMO
    374#define AFTERBURN_TIME	5000.0
    375#else
    376#define AFTERBURN_TIME	5.0
    377#endif
    
    Descent3/player.h lines 372–377 at 61bb9a3 · upstream ↗
    2289	if (controls->afterburn_thrust>0)
    ⋮
    2293		if (Players[slot].afterburn_time_left>0)
    ⋮
    2295			float punch_scalar=1.0;
    ⋮
    2300			if (Players[slot].afterburn_time_left>(AFTERBURN_TIME*.90))
    2301				punch_scalar=1.8f;
    2302			else if (Players[slot].afterburn_time_left>(AFTERBURN_TIME*.80) && Players[slot].afterburn_time_left<(AFTERBURN_TIME*.90))
    ⋮
    2304				float norm=Players[slot].afterburn_time_left-(AFTERBURN_TIME*.80);
    2305				norm/=(AFTERBURN_TIME*.1);
    2306				punch_scalar=1.0+(norm*.8);
    ⋮
    2310				controls->forward_thrust=controls->afterburn_thrust*1.6*punch_scalar;
    2311			else
    2312				controls->forward_thrust=controls->afterburn_thrust*1.6*punch_scalar;
    ⋮
    
    Descent3/object.cpp lines 2289–2317 at 61bb9a3 · upstream ↗
    2325	else
    ⋮
    2329		if (Players[slot].afterburn_time_left<AFTERBURN_TIME)
    ⋮
    2331			if (Players[slot].energy>5.0)
    ⋮
    2337				if( afterburner_id!=-1 && Players[slot].inventory.CheckItem(OBJ_POWERUP,afterburner_id))
    2338					useage = Frametime*2;
    2339				else
    2340					useage = Frametime;
    ⋮
    2342				Players[slot].afterburn_time_left+=useage;
    2343				Players[slot].afterburn_time_left=min (AFTERBURN_TIME,Players[slot].afterburn_time_left);
    ⋮
    2345				Players[slot].energy-=(useage);
    
    Descent3/object.cpp lines 2325–2345 at 61bb9a3 · 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