Claim set · data/claims/banjo-kazooie.yaml

Banjo-Kazooie (the banjo.decomp decompilation, banjo.decomp/banjo-kazooie)

Game: Banjo-Kazooie.

Banjo-Kazooie keeps Banjo's speeds in world units per second and his gravity in units per second squared, scaled by each frame's time: __baphysics_update_normal adds the gravity times time_getDelta() to his vertical speed, then moves him by his velocity times that same time. The frame's time is a count from the video manager over 60 (50 on a PAL build): viMgr_entry adds 1 to D_802808D8 for each message on its queue, and each buffer swap copies the count to D_80280724 and zeroes it; the atlas reads the messages as vertical blanks, so the count as the blanks the frame took. func_8033DC20 turns the count into seconds and the caller back into a whole count, clamped to 1 to 15, then capped at 0.05 s in US 1.0 (0.06 s on PAL), so at most three sixtieths (computed); that is multiplied by a multiplier that time_reset sets to 1. banjo-kazooie/units

About: Banjo-Kazooie Gravity

Value: 0.05 s

Codebanjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/ba/physics.c#L97-L107//update velocity for gravity s_player_velocity[1] = s_player_velocity[1] + time_getDelta()*s_gravity ; if(s_player_velocity[1] < s_terminal_velocity) s_player_velocity[1] = s_terminal_velocity; … s_delta_position[1] = s_delta_position[1] + s_player_velocity[1]; ml_vec3f_scale(s_delta_position, time_getDelta());banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/time.c#L14-L40void time_reset(void){ s_dTimeReal_sec = 0.01f; s_timeMultiplier = 1.0f; … s_dTimeReal_sec = MIN(d_seconds, VER_SELECT(0.05, 0.06, 0.05, 0.05)); … void time_setDeltaReal_frames(s32 d_frames){ s_dTimeReal_frames = MAX(MIN(0xf, d_frames) , 1); time_setDeltaReal_sec(s_dTimeReal_frames*(1.0/FRAMERATE)); … f32 time_getDelta(void){ return s_dTimeReal_sec*s_timeMultiplier;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/code_5C870.c#L426time_setDeltaReal_frames((s32)(func_8033DC20()*(float)FRAMERATE + 0.5));banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/code_B6C60.c#L22-L26f32 func_8033DC20(void){ f32 out; D_80384470 = viMgr_func_8024BD94(); out = (1.0 / FRAMERATE)*D_80384470; return out;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core1/vimgr.c#L92-L93s32 viMgr_func_8024BD94(void){ return D_80280724;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core1/vimgr.c#L180-L188osViSwapBuffer(gFramebuffers[sActiveFramebuffer = getOtherFramebuffer()]); … D_80280724 = D_802808D8; D_802808D8 = 0;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core1/vimgr.c#L219-L225void viMgr_entry(void *arg){ … osRecvMesg(&sMesgQueue1, &sp48, OS_MESG_BLOCK); thread5_checkAndExecutePreNMI(); D_802808D8++;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/ba/physics.c#L80-L83ml_vec3f_scale_copy(sp84, sp60, func_8029CED0()); ml_vec3f_scale_copy(sp78, sp6C, func_8029CED0()); ml_vec3f_diff(sp84, sp78); ml_vec3f_scale(sp84, time_getDelta()/0.0333333);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · include/version.h#L34-L48#if VERSION == VERSION_USA_1_0 #define VER_SELECT(usa0, pal, usa1, jp) usa0 … #if VERSION == VERSION_PAL #define FRAMERATE 50 #else #define FRAMERATE 60Checked by claude, 2026-10-22 — read __baphysics_update_normal whole, time.c whole, the caller of time_setDeltaReal_frames in code_5C870.c, and the VER_SELECT and FRAMERATE defines; func_8033DC20 reads viMgr_func_8024BD94, which returns the count viMgr_entry keeps; which events post to sMesgQueue1 isn't read here, so vertical blanks are the atlas's reading

Super Mario 64 works the other way: fixed per-frame speeds in units/frame, at most 30 frames a second (sm64/units). The two games' world units aren't the same size, so only ratios within a game compare. The horizontal step (L80-L83) scales by the frame's time over 1/30 s, so the horizontal approach also keeps pace with the frame rate.

Cited by: Banjo-Kazooie

A jump sets Banjo's vertical speed to 710 units/s (610 from water) and his gravity to −1350 units/s², half the usual −2700, and sets his horizontal speed at once to the target speed the stick gives on the ground (banjo-kazooie/walking-speed). On a frame of the jump with A up while he still rises, bsjump_update resets the gravity to −2700 for the rest of the jump; nothing sets −1350 again, and with A held the lighter gravity lasts past the peak. Until Banjo has learned the ability the code names ABILITY_A_HOLD_A_JUMP_HIGHER, it resets the gravity every frame. A jump entered from a peck sets neither the speed nor the gravity. A take-off from a spring pad sets a flag that skips the reset; the first frame with A up clears it after the check, so the reset starts the frame after. While that flag is set, the jump's second phase turns into the Shock Spring Jump's charge (BS_21_BSHOCK_CHARGE). Leaving the jump state for anything but a peck restores −2700. Computed without the frame steps, a held jump rises about 187 units in 0.53 s, and one released at once about 93. Super Mario 64 instead adds a quarter of the forward speed to its take-off (sm64/jump-speed) and divides the rise by 4 on each frame A is up while Mario rises faster than 20 units/frame (sm64/jump-release). banjo-kazooie/jump

About: Banjo-Kazooie Jump

Value: 710 units/s

Codebanjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L20-L21f32 D_80364CD0 = 710.0f; f32 D_80364CD4 = -1350.0f;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L25f32 D_80364CE4 = 610.0f;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L41D_8037D4C2 = baflag_isTrue(BA_FLAG_2_ON_SPRING_PAD);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L47-L54if(sp30 == BS_11_BPECK){ … D_8037D4C0 = 1; } else {banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L55D_8037D4C1 = (sp30 == BS_2D_SWIM_IDLE) || (sp30 == BS_2E_SWIM);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L69-L76func_802B6FA8(); baphysics_set_horizontal_velocity(yaw_getIdeal(), baphysics_get_target_horizontal_velocity()); if(D_8037D4C1){ baphysics_set_vertical_velocity(D_80364CE4); } else { baphysics_set_vertical_velocity(D_80364CD0); } baphysics_set_gravity(D_80364CD4);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L101-L104baphysics_get_velocity(velocity); if((bakey_released(BUTTON_A) && 0.0f < velocity[1] && !D_8037D4C2) || !can_control_jump_height()){ baphysics_reset_gravity(); }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L121-L128case 1://L802B14B4 if( 500.0f < (playerPosition_getY() - func_80294438())){ sp34 = BS_2F_FALL; } if(D_8037D4C2){ D_8037D4C2 = 0; sp34 = BS_21_BSHOCK_CHARGE;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L143-L144if(bakey_released(BUTTON_A)) D_8037D4C2 = 0;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L171-L173if (bs_getNextState() != BS_11_BPECK) { baphysics_reset_gravity(); }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bakey.c#L50-L52bakey.released_count[i] = bakey.pressed_count[i] ? 0 : bakey.released_count[i] + 1;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bakey.c#L79-L81int bakey_released(s32 button_indx){ return bakey.released_count[button_indx]; }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/ba/physics.c#L10-L11f32 baphysics_default_gravity = -2700.0f; //defaultGravity f32 baphysics_default_terminal_velocity = -4000.0f;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/ba/physics.c#L397-L399void baphysics_reset_gravity(void){ baphysics_set_gravity(baphysics_default_gravity); }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/playerutils.c#L67-L68s32 can_control_jump_height(void){ return ability_hasLearned(ABILITY_A_HOLD_A_JUMP_HIGHER);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L821-L826case ACT_JUMP: case ACT_HOLD_JUMP: … set_mario_y_vel_based_on_fspeed(m, 42.0f, 0.25f); m->forwardVel *= 0.8f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L559-L560} else if (should_strengthen_gravity_for_jump_ascent(m)) { m->vel[1] /= 4.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_step.c#L528-L529if (!(m->input & INPUT_A_DOWN) && m->vel[1] > 20.0f) { return (m->action & ACT_FLAG_CONTROL_JUMP_HEIGHT) != 0;Checked by claude, 2026-10-22 — read bsjump_init, bsjump_update, and bsjump_end whole, bakey_update (released_count counts frames with the button up, so bakey_released is true on every such frame, not only the first), baphysics_reset_gravity, and can_control_jump_height; the jump's physics type is BA_PHYSICS_AIRBORN, which runs __baphysics_update_normal and its gravity step (banjo-kazooie/units)

The 187 and 93 are v²/2g at 710 units/s under −1350 and −2700; the frame steps lower them a little. Bottles teaches the hold-A ability in Spiral Mountain (src/SM/ch/jumptutorial.c L57), and skipping his tutorial grants it with the others (src/SM/ch/smbottles.c L115-L121). More than 500 units above the floor the jump hands over to the fall state (L122-L124), which keeps no lighter gravity. Fall damage and the pecks in the air aren't read here.

Cited by: Banjo-Kazooie, Gravity, Jump, Variable jump height

With the Feathery Flap learned, A pressed during a jump or a fall starts it, once per time in the air: the flag it sets clears only on stable ground, while climbing, or in water, and a peck in the air blocks it. It stops Banjo's rise (vertical speed 0, gravity −1100 units/s²); when the opening animation reaches 0.9 of its length, it sets him rising at 280 units/s with his fall capped at −399.9, against the usual cap of −4000. A let go in the first 0.67 s of the flap, counted from its start through the opening animation by D_8037D308 (the atlas's reading of that unnamed variable as elapsed time), does nothing; after that, A up restores the usual gravity and cap. A 2.5-second timer ends the flap in any case. Once D_8037D301, which counts the frames the flap animation passes 0.9 of its length from the lift on (the atlas reads it as a loop count), reaches 4, holding A scales the target horizontal speed to 0.35 of what the stick gives. Super Mario 64's act_jump checks B and Z but not A; its second jump comes from a press during a landing (sm64/double-jump). banjo-kazooie/feathery-flap

About: Banjo-Kazooie Flight

Value: -399.9 units/s

Codebanjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bainput.c#L40-L42int bainput_should_feathery_flap(void){ return bakey_pressed(BUTTON_A) && can_feathery_flap(); }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/playerutils.c#L53-L56bool can_feathery_flap(void){ return baflag_isFalse(BA_FLAG_12_HAS_FLAPPED) && baflag_isFalse(BA_FLAG_5_HAS_PECKED) && ability_hasLearned(ABILITY_7_FEATHERY_FLAP);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/code_D9B0.c#L187-L195if(player_isStable() || bsclimb_inSet(bs_getState())){ baflag_clear(BA_FLAG_5_HAS_PECKED); baflag_clear(BA_FLAG_12_HAS_FLAPPED); } … if(player_inWater()){ baflag_clear(BA_FLAG_5_HAS_PECKED); baflag_clear(BA_FLAG_12_HAS_FLAPPED);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L146-L147if(bainput_should_feathery_flap()) sp34 = BS_10_BFLAP;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L225-L226if(bainput_should_feathery_flap() && baflag_isFalse(BA_FLAG_5_HAS_PECKED)) sp2C = BS_10_BFLAP;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bFlap.c#L13-L15const f32 D_80364A10 = 280.0f; const f32 D_80364A14 = -1100.0f; const f32 D_80364A18 = -399.9f;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bFlap.c#L33-L37baphysics_set_vertical_velocity(0.0f); baphysics_set_gravity(D_80364A14); modelAppendages_setKazooiesUpperHalfVisibility(TRUE); baflag_set(BA_FLAG_12_HAS_FLAPPED); batimer_set(0, 2.5f);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bFlap.c#L55-L60void func_802A2810(void) { … if (anctrl_isAt(plyrMvPtr, 0.9f)) { D_8037D301++;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bFlap.c#L86-L89void func_802A2900(void){ D_8037D304 = D_8037D308; D_8037D308 += time_getDelta(); }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bFlap.c#L113-L182func_802B6FA8(); switch(D_8037D300){ case 0: … if(anctrl_isAt(sp18, 0.9f)){ … baphysics_set_vertical_velocity(D_80364A10); baphysics_set_gravity(D_80364A14); baphysics_set_terminal_velocity(D_80364A18); D_8037D300 = 1; … if(0.67 <= D_8037D308){ …banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/ba/physics.c#L10-L11f32 baphysics_default_gravity = -2700.0f; //defaultGravity f32 baphysics_default_terminal_velocity = -4000.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L446-L453s32 act_jump(struct MarioState *m) { if (check_kick_or_dive_in_air(m)) { … if (m->input & INPUT_Z_PRESSED) { return set_mario_action(m, ACT_GROUND_POUND, 0);sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L108-L110s32 check_kick_or_dive_in_air(struct MarioState *m) { if (m->input & INPUT_B_PRESSED) { return set_mario_action(m, m->forwardVel > 28.0f ? ACT_DIVE : ACT_JUMP_KICK, 0);Checked by claude, 2026-10-22 — read bsbflap_init and bsbflap_update whole, the flap helpers above them, can_feathery_flap, bainput_should_feathery_flap (bakey_pressed is pressed_count == 1, the first frame down), the flag clears in func_80294E60, and the jump and fall states' checks; in SM64, act_jump and check_kick_or_dive_in_air whole. D_8037D300, D_8037D301, and D_8037D308 are unnamed; the atlas reads them as the flap's phase, its animation loop count, and its elapsed time, from how the cited lines use them

The flap's lift is small beside the jump's 710 units/s; what it gives is the slow fall, held to about a tenth of the usual cap for up to 2.5 s. In phase 0, before the 280 kick, the −1100 gravity already pulls Banjo down from a standstill. The flap's physics type is BA_PHYSICS_NORMAL. Z ends it in a Beak Buster (L184-L185), and landing turns it into a slow walk. The flap's sounds and the per-loop animation speeds (func_802A2858) aren't read here.

Cited by: Banjo-Kazooie, Flight, Super Mario Sunshine

With the Beak Buster learned, Z pressed during a jump (or in the air in another state) starts it. Banjo stops dead: his velocity, his target horizontal speed, and his gravity all go to 0, and he hangs until the opening stretch of his animation stops and then one more frame. Then he pops up at 2300 units/s under a gravity of −20000 units/s², 7.4 times the usual −2700 (computed), with his fall capped at −5000 instead of −4000. Water ends the move at any phase. When he lands (stable ground, an unnamed flag BA_FLAG_8, or four frames in a row with under 1 unit of an unnamed vertical measure from func_8029445C), a landing with fall damage goes to a splat (BS_72_SPLAT); otherwise his speed and gravity go to 0 for 0.09 s; then he bounces up at 730 units/s under −2110, or at 400 under −800 if the Beak Buster hit an object whose marker id is 0x9E or 0xA1, which the hit kills. Super Mario 64's ground pound has no upward pop: Mario rises at most 110 units over 10 frames while he holds, then falls from −50 units/frame (sm64/ground-pound). banjo-kazooie/beak-buster

About: Banjo-Kazooie Ground pound

Value: -5000 units/s

Codebanjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bainput.c#L12-L14int bainput_should_beak_bust(void){ return bakey_pressed(BUTTON_Z) && can_beak_bust(); }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/playerutils.c#L27-L28s32 can_beak_bust(void){ return ability_hasLearned(ABILITY_2_BEAK_BUSTER);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/jump.c#L152-L153if(bainput_should_beak_bust()) sp34 = BS_F_BBUSTER;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bbuster.c#L9-L17const f32 D_80364990 = 400.0f; const f32 D_80364994 = -800.0f; … const f32 D_80364998 = 730.0f; const f32 D_8036499C = -2110.0f; … const f32 D_803649A0 = 2300.0f; const f32 D_803649A4 = -20000.0f; const f32 D_803649A8 = -5000.0f;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bbuster.c#L64-L78anctrl_setDuration(aCtrl, 1.02f); anctrl_setSubRange(aCtrl, 0.0f, 0.35f); … baphysics_set_gravity(0.0f); baphysics_set_target_horizontal_velocity(0.0f); ml_vec3f_clear(sp20); baphysics_set_velocity(sp20); … D_8037D2B0 = 0.0001f;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bbuster.c#L98-L113case 0://8029FDF0 if(anctrl_isStopped(baanim_getAnimCtrlPtr())){ … D_8037D2BA = 1; … case 1://8029FE24 D_8037D2B0 -= time_getDelta(); if(D_8037D2B0 <= 0.0f){ baphysics_reset_gravity(); baphysics_set_terminal_velocity(D_803649A8); baphysics_set_gravity(D_803649A4); baphysics_set_vertical_velocity(D_803649A0);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bbuster.c#L128-L148D_8037D2B9 = baflag_isTrue(BA_FLAG_8); func_8029445C(sp30); //L8029FF78 if(((0.0f <= sp30[1])? sp30[1] : -sp30[1]) < 1.0){ D_8037D2BC++; }else{ D_8037D2BC = 0; } … if(player_isStable() || D_8037D2B9 || !(D_8037D2BC < 4)){ … baphysics_set_velocity(0); …banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bbuster.c#L152-L154if(bafalldamage_get_damage(&sp3C)){ sp44 = BS_72_SPLAT; }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bbuster.c#L195-L196if(player_inWater()) sp44 = BS_4C_LANDING_IN_WATER;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bbuster.c#L163-L171D_8037D2B0 -= time_getDelta(); if(D_8037D2B0 <= 0.0f){ if(D_8037D2BB){ baphysics_set_vertical_velocity(D_80364990); baphysics_set_gravity(D_80364994); }else{ baphysics_set_vertical_velocity(D_80364998); baphysics_set_gravity(D_8036499C);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/bbuster.c#L209-L210void func_802A02B4(s32 arg0){ D_8037D2BB = arg0;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/ba/marker.c#L273switch(marker->id){banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/ba/marker.c#L313-L317case 0x9E: //L8028BF54 case 0xA1: //L8028BF54 if(plyr_hitbox_type == HITBOX_1_BEAK_BUSTER){ func_802A02B4(1); obj_collision_type = MARKER_COLLISION_FUNC_2_DIE;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_airborne.c#L924-L935if (m->actionState == 0) { if (m->actionTimer < 10) { yOffset = 20 - 2 * m->actionTimer; if (m->pos[1] + yOffset + 160.0f < m->ceilHeight) { m->pos[1] += yOffset; … m->vel[1] = -50.0f; mario_set_forward_vel(m, 0.0f);Checked by claude, 2026-10-22 — read bsbbuster_init, bsbbuster_update, and bsbbuster_end whole, bainput_should_beak_bust, can_beak_bust, the jump state's Z check, and the marker collision case that calls func_802A02B4(1) (init sets it to 0); in SM64, act_ground_pound's hold phase. D_8037D2B0, D_8037D2BA, and D_8037D2BB are unnamed; the atlas reads them as a timer, the phase, and the bounce choice from how the cited lines use them. The 7.4 is 20000/2700

Computed without the frame steps, the pop rises about 132 units in 0.115 s, and the fall reaches the −5000 cap 0.25 s after the peak. The hitbox is live from the pop to the landing (D_8037D2B7, L111 and L146). The opening stretch is the first 0.35 of an animation the code gives a duration of 1.02; how long that takes in seconds depends on anctrl, not read here. Z also starts a Beak Buster from the fall state (jump.c L231-L232), the Feathery Flap (bFlap.c L184-L185), the Flap Flip, the Shock Spring Jump, and flight.

Cited by: Banjo-Kazooie, Ground pound

On the ground the stick's tilt sets Banjo's target speed in five bands of the stick's distance from center, each axis clamped to a raw 7 to 59 (x) or 7 to 61 (y) and scaled to 0 to 1, and the distance capped at 1. Up to 0.12 the target is 0; above it the target rises linearly within each band: 30 to 80 units/s up to 0.2, 80 to 150 up to 0.5, 150 to 225 up to 0.75, and 225 to 500 at full tilt. The decompilers name the bands creep, slow walk, walk, and fast walk. On ground flagged BA_FLAG_13_TOUCHING_DANGEROUS_GROUND, the target is instead 30 to 150 by the distance itself, and 0 inside the 0.12 dead zone. Each frame the horizontal velocity closes the gap to the target by a fraction from a five-entry table (0, 0.07, 0.29, 0.15, 0.05) indexed by the unnamed D_8037C284 (the atlas reads the index as a movement state), unless func_8029CF48 has set an override for that index, which func_8029CED0 then returns instead, times the frame's time over 1/30 s; when an unnamed floor check (func_80294548) passes, the target is first scaled by the slope. Super Mario 64's target is 32 times the square of the tilt, and Mario gains a fixed 1.1 − speed/43 units/frame below it (sm64/walking-speed). banjo-kazooie/walking-speed

About: Banjo-Kazooie Running

Value: 500 units/s

Codebanjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/walk.c#L18-L24f32 bsWalkMinCreepVelocity = 30.0f;//creep_min f32 bsWalkCreepSlowWalkVelocityThreshold = 80.0f;//creep_max/slow_walk_min f32 bsWalkSlowWalkWalkVelocityThreshold = 150.0f;//slow_walk_max/walk_min f32 bsWalkWalkFastWalkVelocityThreshold = 225.0f;//walk_max/walk_fast_min f32 bsWalkMaxFastWalkVelocity = 500.0f;//walk_fast_max f32 bsWalkMinMudVelocity = 30.0f; //mud_min f32 bsWalkMaxMudVelocity = 150.0f; //mud_maxbanjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bs/walk.c#L41-L72void func_802B6D00(void){ … sp1C = bastick_getZonePosition(); sp18 = bastick_getZone(); if(player_isOnDangerousGround()){ if(sp18 == 0){ baphysics_set_target_horizontal_velocity(0.0f); }else{//L802B6D48 baphysics_set_target_horizontal_velocity(ml_interpolate_f(bastick_distance(), bsWalkMinMudVelocity, bsWalkMaxMudVelocity)); … switch(sp18){ case 0://802B6D98 …banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bastick.c#L28-L69f32 bastick_calculateZonePosition(f32 arg0, f32 arg1, f32 arg2){ return (arg0 - arg1)/(arg2 - arg1); … if (bastick.distance <= bastick.zone_markers[0]) { bastick.zone = 0; bastick.zone_position = 0.0f; … void bastick_resetZones(void) { bastick_setZoneMax(0, 0.12f); bastick_setZoneMax(1, 0.2f); bastick_setZoneMax(2, 0.5f); bastick_setZoneMax(3, 0.75f); …banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/bastick.c#L85-L102bastick.distance = sqrtf(bastick.value[0]*bastick.value[0] + bastick.value[1]*bastick.value[1]); … if (bastick.distance > 1.0) { bastick.distance = 1.0f;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core1/joy.c#L51-L72f32 controller_clampAndNormaliseJoyAxis(s32 input, s32 min, s32 max) { f32 unit = 1 / 80.f; … if (input > 0) { input = input > max ? max : input < min ? min : input; input = ((input - min) * 80) / (max - min); … return unit *= input;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core1/joy.c#L155-L156dst[0] = controller_clampAndNormaliseJoyAxis(sInputs[controllerIdx].stick_x, 7, 59); dst[1] = controller_clampAndNormaliseJoyAxis(sInputs[controllerIdx].stick_y, 7, 61);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core1/ml.c#L705-L707f32 ml_interpolate_f(f32 arg0, f32 arg1, f32 arg2) { return arg0 * (arg2 - arg1) + arg1;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/playerutils.c#L188-L189bool player_isOnDangerousGround(void){ return baflag_isTrue(BA_FLAG_13_TOUCHING_DANGEROUS_GROUND);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/ba/physics.c#L49-L86func_80256D0C(0.0f, baphysics_target_yaw, 0.0f, 0.0f, baphysics_target_horizontal_velocity, &baphysics_target_velocity[0], &baphysics_target_velocity[1], &baphysics_target_velocity[2]); … if(func_80294548()){ … ml_vec3f_scale(sp60, 1.0 + sp40); … ml_vec3f_scale(sp60, sp40 + 1.0); … ml_vec3f_scale_copy(sp84, sp60, func_8029CED0()); ml_vec3f_scale_copy(sp78, sp6C, func_8029CED0()); ml_vec3f_diff(sp84, sp78); ml_vec3f_scale(sp84, time_getDelta()/0.0333333); …banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/code_15F20.c#L16-L23f32 func_8029CED0(void) { … temp_v0 = func_8029CEB0(); if (D_8037D1F0[temp_v0] != 0) { return D_8037D1F8[temp_v0]; } return func_8033DE30(temp_v0);banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/code_15F20.c#L30-L33void func_8029CF48(s32 arg0, s32 arg1, f32 arg2) { D_8037D1F0[arg0] = arg1; D_8037D1F8[arg0] = arg2; }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/code_C4B0.c#L440-L441s32 func_802944F4(void){ return D_8037C284;banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/commonParticle.c#L77-L83Struct_Core2_B6CE0_1 D_80371E30[] ={ { 0, 0, 0.0f }, { 1, 0, 0.07f }, { 2, 1, 0.29f }, { 3, 2, 0.15f }, { 4, 1, 0.05f }banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie) · src/core2/commonParticle.c#L97-L98f32 func_8033DE30(s32 arg0){ return D_80371E30[arg0].unk4;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario.c#L1295-L1298f32 mag = ((controller->stickMag / 64.0f) * (controller->stickMag / 64.0f)) * 64.0f; … m->intendedMag = mag / 2.0f;sm64: a decompilation of Super Mario 64 (n64decomp/sm64) · src/game/mario_actions_moving.c#L450-L453if (m->forwardVel <= 0.0f) { m->forwardVel += 1.1f; } else if (m->forwardVel <= targetSpeed) { m->forwardVel += 1.1f - m->forwardVel / 43.0f;Checked by claude, 2026-10-22 — read func_802B6D00 (the target map, which func_802B6FA8 wraps and the walk, jump, and flap states call), bastick_update, bastick_updateZone, bastick_resetZones, controller_clampAndNormaliseJoyAxis, ml_interpolate_f, __baphysics_update_normal, func_8029CED0 and the table func_8033DE30 reads; in SM64, the intendedMag lines and update_walking_speed's gain. The table entry is picked by func_802944F4's D_8037C284, which unnamed collision code sets to 1 to 4; the atlas doesn't name the states.

The creep band starts at 30, so the target jumps from 0 to 30 at the 0.12 dead zone. In the dangerous-ground branch the interpolation reads the whole distance (0 to 1) rather than a band's position, so the target there runs from about 44 at the dead zone's edge to 150. The stick read is the live one; demo playback reads cached values instead (joy.c L148-L152). Under an ANTI_TAMPER build flag, a failed checksum halves unit (joy.c L55-L59), which would halve the stick's reach; the atlas hasn't checked when that flag is set. B pressed above the walk band's 225 rolls, below it claws (walk.c L96-L107).

Cited by: Banjo-Kazooie, Running