Mechanic · resources & economy · rail shooter
Boost meter
A gauge that a speed-up or slow-down drains while it's held and that refills when it's let go.
On this page
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
| Game | Year | How | Note |
|---|---|---|---|
| Star Fox 64 | 1997 | Shared, with cooldown | 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 |
| Descent 3 | 1999 | Free refill | a 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
- ^ 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 setsboostCooldown, which blocks both actions until the meter is back to 0.Codesonicdcer/sf64How 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.
- ^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/Descent3revisedHow 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.
Sources
Code
- sonicdcer and sf64 contributors. 2026. “sf64: a decompilation of Star Fox 64 (sonicdcer/sf64).” Commit 4235c59. sonicdcer/sf64 @ 4235c59 · licence, all uses