Diddy Kong Racing
Rare's 1997 kart racer for the Nintendo 64, with cars, hovercraft, and planes, read through the DavidSM64 decompilation.
On this page
The atlas reads Diddy Kong Racing through DavidSM64 and contributors’ decompilation, C that builds every release. Names and comments quoted here are theirs, and the claims cite the code the US 1.0 build compiles. Its timers lose a varying update rate each update, so a count here isn’t one update1. Nothing has been measured in the game yet.
The start boost is graded: a racer’s first press of A during the countdown sets the boost timer, more the later it comes, and a press in the last 14 counts of 801 gives the most1. Mario Kart 64 gives one fixed boost for a press inside its window2. Weapons come from balloons whose color is fixed on the track, and taking the same color again raises the weapon a level, up to 3 levels3,3; in Grand Prix, Mario Kart 64 rolls its items by place4. A car’s power slide gives 1.1 × top speed while held5, and no boost when it ends5. A zip pad sets the boost timer to 45 counts6 when none is running6.
Mechanics
| Mechanic | Kind | How |
|---|---|---|
| Rocket start | 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 |
| Item distribution | Placed | each balloon's color is fixed on the track, and taking the same color again raises the weapon up to a third level |
| Drift boost | Held speed | holding R through a car's power slide raises its top speed by a tenth, and the slide ends with no boost |
| Boost pad | When idle | a zip-pad surface sets a 45-count boost timer when none is running |
| Boost pad | Refresh | a ground zipper sets 45 whenever less than 15 is left |
Every claim about this game, by concept (4)
References
- ^ abcIn 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.
- ^In 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 weapon balloon's type is set by its entry in the track's object list, with no roll: the code names five types, boost, missile, trap, shield, and magnet, which the decompilers' names for the all-balloons cheats pair with blue, red, green, yellow, and rainbow. A racer that touches a balloon takes its type. If the racer already held the same type with any left, the weapon's level rises by one, up to the third (level 2); otherwise it starts at the first. In a challenge the level stops at the second, and trap balloons start there; the Maximum Power-up cheat makes every pickup third-level, and CPU-driven boss vehicles collect none. The weapon and its quantity come from a table the game loads as an asset, two bytes for each type and level, so they aren't in the repo. A CPU racer's driving routine
func_80042D20can also raise a first-level pickup by one, on a percent chance from the AI behavior table. Mario Kart 64 instead picks an item box's item in Grand Prix from a 100-slot row for the driver's place.CodeDavidSM64/Diddy-Kong-Racing · n64decomp/mk64revisedHow we know
120typedef enum BalloonType { 121 BALLOON_TYPE_BOOST, 122 BALLOON_TYPE_MISSILE, 123 BALLOON_TYPE_TRAP, 124 BALLOON_TYPE_SHIELD, 125 BALLOON_TYPE_MAGNET
include/enums.h lines 120–126 at a5eb080 · upstream ↗ 193typedef struct LevelObjectEntry_WeaponBalloon { ⋮ 196 /* 0x09 */ u8 balloonType; Hint((Enum:BalloonType))
include/level_object_entries.h lines 193–196 at a5eb080 · upstream ↗ 4658 if (cheats & CHEAT_ALL_BALLOONS_ARE_BLUE) { 4659 entry->balloonType = BALLOON_TYPE_BOOST; 4660 } else if (cheats & CHEAT_ALL_BALLOONS_ARE_RED) { 4661 entry->balloonType = BALLOON_TYPE_MISSILE; 4662 } else if (cheats & CHEAT_ALL_BALLOONS_ARE_GREEN) { 4663 entry->balloonType = BALLOON_TYPE_TRAP; 4664 } else if (cheats & CHEAT_ALL_BALLOONS_ARE_YELLOW) { 4665 entry->balloonType = BALLOON_TYPE_SHIELD; 4666 } else if (cheats & CHEAT_ALL_BALLOONS_ARE_RAINBOW) { 4667 entry->balloonType = BALLOON_TYPE_MAGNET;
src/object_functions.c lines 4658–4667 at a5eb080 · upstream ↗ 4679 obj->modelIndex = entry->balloonType; 4680 obj->properties.weaponBalloon.balloonID = obj->modelIndex;
src/object_functions.c lines 4679–4680 at a5eb080 · upstream ↗ 4745 if (racer->vehicleID < VEHICLE_BOSSES || racer->playerIndex != PLAYER_COMPUTER) { 4746 prevBalloonType = racer->balloon_type; 4747 racer->balloon_type = weaponBalloonObj->properties.weaponBalloon.balloonID; 4748 if (prevBalloonType == racer->balloon_type && racer->balloon_quantity != 0) { 4749 racer->balloon_level++; 4750 } else { 4751 racer->balloon_level = 0; ⋮ 4754 if (level_type() & RACETYPE_CHALLENGE) { 4755 if (racer->balloon_level > 1) { 4756 racer->balloon_level = 1; ⋮ 4759 if (racer->balloon_type == BALLOON_TYPE_TRAP) { 4760 racer->balloon_level = 1; ⋮
src/object_functions.c lines 4745–4775 at a5eb080 · upstream ↗ 7009 miscAsset = (s8 *) get_misc_asset(ASSET_MISC_BALLOON_DATA); 7010 weaponID = miscAsset[(racer->balloon_type * 10) + (racer->balloon_level * 2)];
src/racer.c lines 7009–7010 at a5eb080 · upstream ↗ 327 sp38 = sp54->percentages[1][0] + (((sp54->percentages[1][1] - sp54->percentages[1][0]) * (7 - var_t5)) / 7); ⋮ 332 if (racer->unk209 & 1) { 333 if (racer->unk201 == 0) { 334 if (racer->balloon_level == 0) { 335 if (roll_percent_chance(sp38)) { 336 racer->balloon_level++;
src/racer.c lines 327–337 at a5eb080 · upstream ↗ 4303 } else { 4304 racer_AI_pathing_inputs(obj, tempRacer, updateRate);
src/racer.c lines 4303–4304 at a5eb080 · upstream ↗ 750 gAIBehaviourTable = mempool_alloc_safe(temp, COLOUR_TAG_YELLOW); 751 asset_load(ASSET_AI_BEHAVIOUR, (u32) gAIBehaviourTable, temp2, temp);
src/game.c lines 750–751 at a5eb080 · upstream ↗ 3687 } else if (gModeSelection == BATTLE) { 3688 curve = segmented_to_virtual((void*) common_battle_item_curve); 3689 randomItem = curve[sRandomItemIndex]; 3690 } else { // GP Mode 3691 if (isCpu == 0) { 3692 curve = segmented_to_virtual((void*) common_grand_prix_human_item_curve); 3693 } else { 3694 curve = segmented_to_virtual((void*) common_grand_prix_cpu_item_curve); ⋮ 3696 randomItem = *((rank * 100) + curve + sRandomItemIndex);
src/update_objects.c lines 3687–3696 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.
- ^In the US version of Mario Kart 64,
gen_random_itempicks an item as one byte from a 100-byte row of a table, the row for the driver's current place. In Grand Prix, human players readcommon_grand_prix_human_item_curveand CPU driverscommon_grand_prix_cpu_item_curve, and that branch reads no player count. Versus picks one of three tables by the number of players (two, three, or four), and Battle reads one row whatever the place. The slot is a random number from 0 to 100 (random_int(100)) plus the previous slot, a counter that held A, B, and R buttons advance, and the race frame counter, taken mod 100.Coden64decomp/mk64revisedHow we know
3665u8 gen_random_item(s16 rank, s16 isCpu) { 3666 u16 rand = random_int(100); ⋮ 3671 sRandomItemIndex = ((u32) rand + (sRandomItemIndex + gControllerRandom) + gRaceFrameCounter) % 100U;
src/update_objects.c lines 3665–3671 at 58cfcb0 · upstream ↗ 3673 if (gModeSelection == VERSUS) { 3674 switch (gPlayerCountSelection1) { 3675 case TWO_PLAYERS_SELECTED: ⋮ 3678 case THREE_PLAYERS_SELECTED: ⋮ 3681 case FOUR_PLAYERS_SELECTED: ⋮ 3685 randomItem = *((rank * 100) + curve + sRandomItemIndex);
src/update_objects.c lines 3673–3685 at 58cfcb0 · upstream ↗ 3687 } else if (gModeSelection == BATTLE) { 3688 curve = segmented_to_virtual((void*) common_battle_item_curve); 3689 randomItem = curve[sRandomItemIndex]; 3690 } else { // GP Mode 3691 if (isCpu == 0) { 3692 curve = segmented_to_virtual((void*) common_grand_prix_human_item_curve); 3693 } else { 3694 curve = segmented_to_virtual((void*) common_grand_prix_cpu_item_curve); ⋮ 3696 randomItem = *((rank * 100) + curve + sRandomItemIndex);
src/update_objects.c lines 3687–3696 at 58cfcb0 · upstream ↗ 3702u8 gen_random_item_human(UNUSED s16 arg0, s16 rank) { 3703 return gen_random_item(rank, false); ⋮ 3706u8 cpu_gen_random_item(UNUSED s32 arg0, s16 rank) { 3707 return gen_random_item(rank, true); ⋮ 3714 randomItem = gen_random_item_human(gLapCountByPlayerId[arg1], gGPCurrentRaceRankByPlayerId[arg1]);
src/update_objects.c lines 3702–3714 at 58cfcb0 · upstream ↗ 3918 cpu_decisions_branch_item(playerId, &cpuStrategy->branch, 3919 cpu_gen_random_item((s16) gLapCountByPlayerId[playerId], 3920 gGPCurrentRaceRankByPlayerId[playerId]));
src/cpu_vehicles_camera_path.c lines 3918–3920 at 58cfcb0 · upstream ↗ 1205void randomize_seed_from_controller(s32 arg0) { ⋮ 1208 if ((controller->button & A_BUTTON) != 0) { 1209 gControllerRandom++; ⋮ 1211 if ((controller->button & B_BUTTON) != 0) { 1212 gControllerRandom++; ⋮ 1214 if ((controller->button & R_TRIG) != 0) { 1215 gControllerRandom++;
src/code_80057C60.c lines 1205–1215 at 58cfcb0 · upstream ↗ 1269u16 random_int(u16 arg0) { 1270 return arg0 * (((f32) random_u16()) / 65535.0);
src/racing/math_util.c lines 1269–1270 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 car's power slide starts in its ground routine when R is held, the stick is past 15 either way, and the car is going forward faster than 3 (the code's velocity below -3). While R stays held the routine multiplies the top-speed value by 1.1. Letting go of R, or slowing to a velocity above -2, ends the slide and sets nothing else. During a slide the car update clamps the stick to 50 either way, quarters steering into the slide, and adds 60 toward it; holding the stick 26 or more against the slide adds the update rate to a count, and past 80 the car spins out and the slide ends. In an atlas search of src/, every write to the boost timer belongs to a zip pad, zipper, the start, a Nitro, a magnet, a plane trick, the loop-the-loop vehicle, or a boss, so a slide ends without a boost. Mario Kart 64 instead charges stages toward a mini-turbo while the stick counter-steers a drift.CodeDavidSM64/Diddy-Kong-Racing · n64decomp/mk64
How we know
5224 // Decide which way to drift when the R button is held 5225 if (racer->drift_direction == 0 && gCurrentRacerInput & R_TRIG && racer->velocity < -3.0 && 5226 (gCurrentStickX > 15 || gCurrentStickX < -15)) { ⋮ 5234 // Disable drifting if going too slow 5235 if (racer->velocity > -2.0) { 5236 racer->drift_direction = 0; ⋮ 5238 // Get top speed value 5239 topSpeed = handle_racer_top_speed(obj, racer); 5240 // If currently drifting, apply a minor speed multiplier and tilt the natural steering towards the drift direction 5241 if (gCurrentRacerInput & R_TRIG && racer->drift_direction != 0) { 5242 topSpeed *= 1.1; ⋮ 5249 } else { ⋮
src/racer.c lines 5224–5251 at a5eb080 · upstream ↗ 5519 racer->velocity -= traction * racer->throttle;src/racer.c line 5519 at a5eb080 · upstream ↗ 4751 if (racer->drift_direction != 0) { 4752 if (racer->drift_direction < 0 && gCurrentStickX >= 26) { 4753 racer->unk16E += updateRate; ⋮ 4755 racer->unk16E = 0; ⋮ 4757 } else if (racer->drift_direction > 0 && gCurrentStickX <= -26) { 4758 racer->unk16E -= updateRate; ⋮ 4760 racer->unk16E = 0; ⋮ 4762 } else { 4763 racer->unk16E = 0; ⋮ 4769 if (spB8 > 80.0f) { 4770 racer_play_sound(racerObj, SOUND_CAR_BRAKE); 4771 racer->spinout_timer = -racer->drift_direction; ⋮
src/racer.c lines 4751–4785 at a5eb080 · upstream ↗ 4794 if (racer->spinout_timer != 0) { 4795 racer_spinout_car(racerObj, racer, updateRate, updateRateF); 4796 } else if (racer->groundedWheels > 0) { 4797 update_player_car_velocity_ground(racerObj, racer, updateRate, updateRateF);
src/racer.c lines 4794–4797 at a5eb080 · upstream ↗ 1148void update_drift_state_counter(Player* player, s8 playerIndex) { 1149 if (((s16) player->unk_0C0 / DEGREES(1)) > 0) { 1150 if (((s32) player->steerPosition >> 16) <= -10) { 1151 if (player->driftStateCounter <= 100) { 1152 player->driftStateCounter++; ⋮ 1158 if ((player->driftStateCounter >= 18) && (player->driftStateCounter < 100)) { 1159 if (player->driftState < 3) { 1160 player->driftState++;
src/player_controller.c lines 1148–1160 at 58cfcb0 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abIn the US 1.0 version of Diddy Kong Racing, a zip-pad surface sets a racer's boost timer to 45 when it's at 0, in the car, hovercraft, and plane routines alike, and a ground zipper object sets 45 for a grounded racer within its radius whenever the timer is below 15. A Nitro sets 35, 55, or 75 at its first, second, and third level. In the car's ground routine, while the 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.CodeDavidSM64/Diddy-Kong-RacingrevisedHow we know
5420 // If driving over a zip pad, apply a boost. 5421 if (racer->boostTimer == 0 && surfaceType == SURFACE_ZIP_PAD) { 5422 racer->boostTimer = normalise_time(45);
src/racer.c lines 5420–5422 at a5eb080 · upstream ↗ 4400 switch (tempRacer->vehicleID) { 4401 case VEHICLE_CAR: 4402 update_car(updateRate, updateRateF, obj, tempRacer); 4403 break; ⋮ 4406 break; 4407 case VEHICLE_HOVERCRAFT: 4408 func_80046524(updateRate, updateRateF, obj, tempRacer); 4409 break; 4410 case VEHICLE_PLANE: 4411 func_80049794(updateRate, updateRateF, obj, tempRacer);
src/racer.c lines 4400–4411 at a5eb080 · upstream ↗ 1906 if ((racer->boostTimer == 0) && (lastWheelSurface == 3)) { 1907 racer->boostTimer = normalise_time(45);
src/racer.c lines 1906–1907 at a5eb080 · upstream ↗ 152typedef enum SurfaceType { 153 SURFACE_DEFAULT, 154 SURFACE_GRASS, 155 SURFACE_SAND, 156 SURFACE_ZIP_PAD,
include/enums.h lines 152–156 at a5eb080 · upstream ↗ 2795 if (racer->boostTimer == 0 && i == SURFACE_ZIP_PAD) { 2796 racer->boostTimer = normalise_time(45);
src/racer.c lines 2795–2796 at a5eb080 · upstream ↗ 1011 if (racer->boostTimer < 15 && racer->groundedWheels) { ⋮ 1015 if ((s32) sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < obj->properties.zipper.radius) { ⋮ 1020 racer->boostTimer = normalise_time(45);
src/object_functions.c lines 1011–1020 at a5eb080 · upstream ↗ 7092 case WEAPON_NITRO_LEVEL_3: ⋮ 7094 racer->boostTimer = normalise_time(75); \ ⋮ 7097 case WEAPON_NITRO_LEVEL_2: ⋮ 7099 racer->boostTimer = normalise_time(55); \ ⋮ 7102 default: ⋮ 7104 racer->boostTimer = normalise_time(35); \
src/racer.c lines 7092–7104 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 ↗ 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
- 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
- n64decomp. 2026. “mk64: a decompilation of Mario Kart 64 (n64decomp/mk64).” Commit 58cfcb0. n64decomp/mk64 @ 58cfcb0 · licence, all uses