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

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

MechanicKindHow
Rocket startGraded pressthe 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 distributionPlacedeach balloon's color is fixed on the track, and taking the same color again raises the weapon up to a third level
Drift boostHeld speedholding R through a car's power slide raises its top speed by a tenth, and the slide ends with no boost
Boost padWhen idlea zip-pad surface sets a 45-count boost timer when none is running
Boost padRefresha ground zipper sets 45 whenever less than 15 is left
Every claim about this game, by concept (4)
Boost padIn 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.Code
Drift boostIn 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.Code
Item distributionIn 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_80042D20 can 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.Code
Rocket startIn 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's THROTTLE flag isn't already set, and every such start gets the Mushroom's boost timer, 80.Code

References

  1. ^ 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's THROTTLE flag isn't already set, and every such start gets the Mushroom's boost timer, 80.CodeDavidSM64/Diddy-Kong-Racing · n64decomp/mk64revised
    How 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 claim ledger

  2. ^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 gets START_SPINOUT_TRIGGER, the spin-out for holding the gas.Coden64decomp/mk64revised
    How 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 race
    
    include/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.

    In the claim ledger

  3. ^ 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_80042D20 can 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/mk64revised
    How 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 claim ledger

  4. ^In the US version of Mario Kart 64, gen_random_item picks 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 read common_grand_prix_human_item_curve and CPU drivers common_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/mk64revised
    How 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.

    In the claim ledger

  5. ^ 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.

    In the claim ledger

  6. ^ 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-Racingrevised
    How 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.

    In the claim ledger

Sources

Code