Rocket start
A better start to a race for pressing the accelerator, or holding the revs, at the right moment of the countdown.
On this page
A rocket start gives a racer a boost for timing the accelerator against the countdown. Mario Kart 64 opens a short window near the end of Lakitu’s countdown, and a press inside it gives the Mushroom’s boost; revving too high without it spins the kart out1. Diddy Kong Racing instead grades the first press of A: a press in the countdown’s the last 14 counts of 802 sets the longest boost, an earlier press inside the window a shorter one, and a press before the window none. Ridge Racer has no boost, only a penalty: the further the revs are from 7500 as the race starts, the longer the wheelspin3.
- Press windowMario Kart 64 (1996). A fresh press of A within 8 race frame counts of the window opening gives a Mushroom boost; revving to 90% of top speed without it spins the kart out.1
- Graded pressDiddy Kong Racing (1997). The first press of A in the countdown's last 29 counts sets the boost timer, 20 for 14 or less, and 4 up to 11 as the reading falls from 29 to 15; an earlier press forfeits it.2
- Rev targetRidge Racer (1993). With the accelerator held, the start's wheelspin lasts 4 updates when the tachometer reads 7500 as the race starts, and 61 when it reads 10000.3
Games
| Game | Year | How | Note |
|---|---|---|---|
| Mario Kart 64 | 1996 | Press window | a fresh press of A within 8 race frame counts of the window opening gives a Mushroom boost; revving to 90% of top speed without it spins the kart out |
| Diddy Kong Racing | 1997 | Graded press | the first press of A in the countdown's last 29 counts sets the boost timer, 20 for 14 or less, and 4 up to 11 as the reading falls from 29 to 15; an earlier press forfeits it |
| Ridge Racer | 1993 | Rev target | with the accelerator held, the start's wheelspin lasts 4 updates when the tachometer reads 7500 as the race starts, and 61 when it reads 10000 |
Every claim about this mechanic, by game (3)
References
- ^ abIn the US version of Mario Kart 64, the start boost's window opens when Lakitu's countdown finishes the animation after its second light sound, before the green-light sound. A press of A that begins within 8 counts of the race frame counter from the first update the window is open (20 in Time Trials) sets
START_BOOST_TRIGGER, and letting go of A before the start clears it. The trigger gives the kart the Mushroom's effect and the same boost timer, 80. Once the window is open, a kart that revs to 90% of its top speed without the trigger getsSTART_SPINOUT_TRIGGER, the spin-out for holding the gas.Coden64decomp/mk64revisedHow we know
3037 case 7: 3038 if (set_and_run_timer_object(objectIndex, 0x00000014) != 0) { ⋮ 3041 play_sound2(SOUND_ACTION_COUNTDOWN_LIGHT); ⋮ 3048 case 9: 3049 if ((set_and_run_timer_object(objectIndex, 8) != 0) && (arg1 == 0)) { 3050 play_sound2(SOUND_ACTION_COUNTDOWN_LIGHT); ⋮ 3053 case 10: 3054 if ((func_80072E54(objectIndex, 0x00000010, 0x00000017, 1, 6, 0) != 0) && (arg1 == 0)) { 3055 D_801656F0 = 1; ⋮ 3058 case 11: 3059 if (set_and_run_timer_object(objectIndex, 8) != 0) { ⋮ 3062 play_sound2(SOUND_ACTION_GREEN_LIGHT);
src/update_objects.c lines 3037–3063 at 58cfcb0 · upstream ↗ 4749 } else if (D_8018D168 == 1) { 4750 if (D_801656F0 == 1) { 4751 if (D_801652E0[playerIndex] == 0) { 4752 D_801652E0[playerIndex] = gRaceFrameCounter; ⋮ 4755 if (controller->button & A_BUTTON) { 4756 player_accelerate_during_start_sequence(player); 4757 } else { 4758 player_decelerate_during_start_sequence(player, 5.0f);
src/player_controller.c lines 4749–4759 at 58cfcb0 · upstream ↗ 3669 if (D_801656F0 == 1) { 3670 time_delta = gRaceFrameCounter - D_801652E0[playerIndex]; 3671 if (gModeSelection == TIME_TRIALS) { 3672 var_v0 = 0x14; 3673 } else { 3674 var_v0 = 8; ⋮ 3676 if ((time_delta < var_v0) && ((player->kartProps & THROTTLE) != THROTTLE)) { 3677 player->triggers |= START_BOOST_TRIGGER; 3678 } else if ((player->topSpeed * 0.9f) <= player->currentSpeed) { 3679 if ((player->triggers & START_BOOST_TRIGGER) != START_BOOST_TRIGGER) { 3680 player->triggers |= START_SPINOUT_TRIGGER; ⋮ 3685 player->kartProps |= THROTTLE;
src/player_controller.c lines 3669–3685 at 58cfcb0 · upstream ↗ 3703 player->triggers &= ~START_BOOST_TRIGGER; 3704 player->kartProps &= ~THROTTLE;
src/player_controller.c lines 3703–3704 at 58cfcb0 · upstream ↗ 1392 if ((player->triggers & START_BOOST_TRIGGER) == START_BOOST_TRIGGER) { 1393 func_8002A704(player, playerId);
src/player_controller.c lines 1392–1393 at 58cfcb0 · upstream ↗ 1112void func_8002A704(Player* player, s8 playerIndex) { 1113 player->effects |= MUSHROOM_EFFECT; 1114 player->triggers &= ~START_BOOST_TRIGGER; ⋮ 1120 player->boostTimer = 0x0050;
src/player_controller.c lines 1112–1120 at 58cfcb0 · upstream ↗ 522void trigger_shroom(Player* player, s8 playerIndex) { ⋮ 526 player->effects |= MUSHROOM_EFFECT; ⋮ 544 player->boostTimer = 0x50;
src/effects.c lines 522–544 at 58cfcb0 · upstream ↗ 441#define START_SPINOUT_TRIGGER 0x10000000 // Spinning out by holding gas at start of raceinclude/defines.h line 441 at 58cfcb0 · upstream ↗ 1254 if (gIsGamePaused == false) { 1255 func_8008C1D8(&D_80165678); 1256 gRaceFrameCounter++;
src/code_80057C60.c lines 1253–1256 at 58cfcb0 · 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.
- ^ abIn the US 1.0 version of Diddy Kong Racing, a race, challenge, or time trial starts its countdown at 80, and once the HUD signals the start each update takes the update rate off it; "Get Ready" shows while it reads 2 or more. A racer's first fresh press of A after the countdown drops below 80 decides its start boost. A press while the countdown reads 29 to 15 sets a boost timer of 4 up to 11 as the reading falls, half of 24 less the reading's excess over 14, rounded down (computed), and a press while it reads 14 or less sets 20 with a select sound; holding Z also counts a reading of 15 as 20. A first press while it reads 30 to 79 gives no boost and spends the chance. A Master CPU driver takes the start boost a human set, or 5 if none did, and an Expert one copies a human's if there is one. In the car's ground routine, while the boost timer is above 0 after the countdown, the throttle is held open and the factor the code calls
traction, unless it's 0, becomes 2.0. Mario Kart 64 instead takes a press of A that begins within 8 race frame counts of its window opening (20 in Time Trials), while the kart'sTHROTTLEflag isn't already set, and every such start gets the Mushroom's boost timer, 80.CodeDavidSM64/Diddy-Kong-Racing · n64decomp/mk64revisedHow we know
1474 if (raceType == RACETYPE_DEFAULT || raceType & RACETYPE_CHALLENGE || gIsTimeTrial || D_8011AD3C != 0) { 1475 gEventCountdown = 80; 1476 } else { 1477 gEventCountdown = 0;
src/objects.c lines 1474–1478 at a5eb080 · upstream ↗ 2831 gEventStartTimer = gEventCountdown; 2832 if (gEventCountdown > 0 && race_starting() != FALSE) { 2833 gEventCountdown -= updateRate; ⋮ 2838 if (gEventCountdown <= 0) { 2839 gEventCountdown = 0;
src/objects.c lines 2831–2840 at a5eb080 · upstream ↗ 4143 gRaceStartTimer = get_race_countdown();src/racer.c line 4143 at a5eb080 · upstream ↗ 805 countdown = get_race_countdown() >> 1;src/game_ui.c line 805 at a5eb080 · upstream ↗ 1901 if (countdown > 0) { 1902 if (gHudRaceStart) { ⋮ 1904 hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_START_READY]);
src/game_ui.c lines 1901–1904 at a5eb080 · upstream ↗ 7465 timer3 = get_race_start_timer(); ⋮ 7469 if (gRaceStartTimer > 0 && gRaceStartTimer < 30 && !racer->startInput) { 7470 timer = gRaceStartTimer - 14; 7471 if (gCurrentButtonsPressed & A_BUTTON) { 7472 if (timer < 0 && timer3 >= 0) { 7473 timer = 0; ⋮ 7479 if (gCurrentRacerInput & Z_TRIG) { 7480 if (timer < 2) { 7481 timer = 0; ⋮ 7484 timer2 = 24 - timer; 7485 racer->boostTimer = normalise_time(timer2 >> 1); 7486 if (timer2 == 24) { ⋮
src/racer.c lines 7465–7499 at a5eb080 · upstream ↗ 7501 // For the AI, expert AI will match the players start, and master AI will get a good start always. 7502 if (racer->playerIndex == PLAYER_COMPUTER && 7503 (racer->aiSkill == AI_MASTER || (racer->aiSkill == AI_EXPERT && gStartBoostTime))) { 7504 if (gStartBoostTime) { 7505 racer->boostTimer = gStartBoostTime; 7506 } else { 7507 racer->boostTimer = normalise_time(5);
src/racer.c lines 7501–7508 at a5eb080 · upstream ↗ 7521 if (gRaceStartTimer < 80 && gCurrentButtonsPressed & A_BUTTON) { 7522 racer->startInput = 1;
src/racer.c lines 7521–7523 at a5eb080 · upstream ↗ 938s32 normalise_time(s32 timer) { 939 if (osTvType != OS_TV_TYPE_PAL || timer < 0) { 940 return timer; 941 } else { 942 return (timer * 5) / 6;
src/objects.c lines 938–944 at a5eb080 · upstream ↗ 5492 // Force the throttle wide open if boosting 5493 if (racer->boostTimer > 0) { 5494 if (gRaceStartTimer == 0) { 5495 racer->throttle = 1.0f; 5496 if (traction != 0.0) { 5497 traction = 2.0f; ⋮ 5499 racer->boostTimer -= updateRate;
src/racer.c lines 5492–5499 at a5eb080 · upstream ↗ 3669 if (D_801656F0 == 1) { 3670 time_delta = gRaceFrameCounter - D_801652E0[playerIndex]; 3671 if (gModeSelection == TIME_TRIALS) { 3672 var_v0 = 0x14; 3673 } else { 3674 var_v0 = 8; ⋮ 3676 if ((time_delta < var_v0) && ((player->kartProps & THROTTLE) != THROTTLE)) { 3677 player->triggers |= START_BOOST_TRIGGER;
src/player_controller.c lines 3669–3685 at 58cfcb0 · upstream ↗ 1112void func_8002A704(Player* player, s8 playerIndex) { 1113 player->effects |= MUSHROOM_EFFECT; 1114 player->triggers &= ~START_BOOST_TRIGGER; ⋮ 1120 player->boostTimer = 0x0050;
src/player_controller.c lines 1112–1120 at 58cfcb0 · 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.
- ^ abIn Ridge Racer's Japanese release (SLPS-00001), the player's car starts a race in state 3 (func_80028294). When the grid phase ends at race update 211 and the race begins, func_8001B284 reads the rev counter shown on the tachometer (
D_801D7800, the car's revs smoothed and held between 500 and 10000) and sets a counter to 1000 plus its distance below 7500, or 1000 plus six times its distance above 7500, in which case it also halves the engine field at car offset 0xB0. In state 3 the car moves a quarter of what its speed would carry it, and the counter falls each update by the accelerator plus the brake plus 8; at 10 or below the car goes to grip (state 0). With the accelerator held on a digital pad (0x100), revs of 7500 give 4 updates of this, 5000 give 14, and 10000 give 61 (computed).Codekazuyette/rr-decompHow we know
65 q->x5C = 3;src/fn/func_8001AA60.c line 65 at 3b42b36 · upstream ↗ 130 case 1: 131 if (D_80173310 >= 211) { 132 func_8001B284(p); 133 D_801D9060 = 2;
src/fn/func_80014C2C.c lines 130–134 at 3b42b36 · upstream ↗ 10 temp_a1 = D_801D7800 - 0x1D4C; 11 if (temp_a1 < 0) { 12 var_a1 = -temp_a1; 13 } else { 14 var_a1 = temp_a1 * 6; 15 M2C_FIELD(arg0, s32 *, 0xB0) = (s32) ((s32) M2C_FIELD(arg0, s32 *, 0xB0) / 2); ⋮ 17 D_8012CFF0 = var_a1 + 0x3E8;
src/fn/func_8001B284.c lines 10–17 at 3b42b36 · upstream ↗ 31 D_801D7800 += (D_8007C2DC - D_801D7800) / 4; 32 if (D_801D7800 > 10000) 33 D_801D7800 = 10000; 34 if (D_801D7800 < 500) 35 D_801D7800 = 500;
src/fn/func_8001B0CC.c lines 31–35 at 3b42b36 · upstream ↗ 27 car->u.c.vx = func_80044D0C(car->u.c.dir) * car->u.c.spd / 256; ⋮ 31 car->u.c.vx = s * v.vz / 4096 / 4; 32 car->u.c.vz = c * v.vz / 4096 / 4; 33 if (D_8012CFF0 > 10) { 34 D_8012CFF0 -= car->u.c.wear; 35 w = car->u.c.grip + 8; 36 D_8012CFF0 -= w; 37 if (D_8012CFF0 <= 0) 38 car->u.c.slide = 0; ⋮ 40 } else { 41 car->u.c.slide = 0;
src/fn/func_80028294.c lines 27–41 at 3b42b36 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
Sources
Code
- n64decomp. 2026. “mk64: a decompilation of Mario Kart 64 (n64decomp/mk64).” Commit 58cfcb0. n64decomp/mk64 @ 58cfcb0 · licence, all uses
- DavidSM64 and Diddy-Kong-Racing contributors. 2026. “Diddy-Kong-Racing: a decompilation of Diddy Kong Racing (DavidSM64/Diddy-Kong-Racing).” Commit a5eb080. DavidSM64/Diddy-Kong-Racing @ a5eb080 · licence, all uses
- kazuyette. 2026. “Ridge Racer decompilation (kazuyette/rr-decomp).” Commit 3b42b36. kazuyette/rr-decomp @ 3b42b36 · licence, all uses