Ground pound
A midair move that drops the character straight down, fast, to hit what's below.
On this page
A ground pound turns a jump into a drop. In Super Mario 64, Z in the air stops Mario dead, lifts him up to 110 units over 10 frames if the ceiling allows, holds him until his spin ends, and then drops him from −50 units/frame under the usual gravity1. Banjo-Kazooie’s Beak Buster also stops Banjo dead, but after the hang he pops up before he falls, and Super Mario 64’s ground pound has no pop2,1. The Beak Buster’s pop, gravity, and fall cap are up 2300, gravity −20000, cap −5000 (units/s)2.
- Hover then dropSuper Mario 64 (1996). Z in the air: a short rise and hold, then a fall from −50 units/frame.1Banjo-Kazooie (1998). The Beak Buster: a hang, a pop up at 2300 units/s, then a drop under −20000 to a cap of −5000.2
Games
| Game | Year | How | Note |
|---|---|---|---|
| Super Mario 64 | 1996 | Hover then drop | Z in the air: a short rise and hold, then a fall from −50 units/frame |
| Banjo-Kazooie | 1998 | Hover then drop | the Beak Buster: a hang, a pop up at 2300 units/s, then a drop under −20000 to a cap of −5000 |
Every claim about this mechanic, by game (2)
References
- ^ abcZ in the air starts a ground pound. Mario stops dead and, on each of the first 10 frames (t counting from 0), rises 20 − 2t units, 110 in all, each rise skipped unless his new height plus 160 stays below the ceiling. He holds there until his spin animation ends plus 4 frames; then he falls from −50 units/frame under the usual gravity.Coden64decomp/sm64revised
How we know
451 if (m->input & INPUT_Z_PRESSED) { 452 return set_mario_action(m, ACT_GROUND_POUND, 0);
src/game/mario_actions_airborne.c lines 451–453 at 9921382 · upstream ↗ 924 if (m->actionState == 0) { 925 if (m->actionTimer < 10) { 926 yOffset = 20 - 2 * m->actionTimer; 927 if (m->pos[1] + yOffset + 160.0f < m->ceilHeight) { 928 m->pos[1] += yOffset; ⋮ 934 m->vel[1] = -50.0f; 935 mario_set_forward_vel(m, 0.0f); ⋮ 943 m->actionTimer++; 944 if (m->actionTimer >= m->marioObj->header.gfx.animInfo.curAnim->loopEnd + 4) { ⋮ 946 m->actionState = 1;
src/game/mario_actions_airborne.c lines 924–947 at 9921382 · upstream ↗ 948 } else { 949 set_mario_animation(m, MARIO_ANIM_GROUND_POUND); ⋮ 951 stepResult = perform_air_step(m, 0);
src/game/mario_actions_airborne.c lines 948–951 at 9921382 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abcWith 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 fromfunc_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).Codebanjo.decomp/banjo-kazooie · n64decomp/sm64revisedHow we know
12int bainput_should_beak_bust(void){ 13 return bakey_pressed(BUTTON_Z) && can_beak_bust();
src/core2/bainput.c lines 12–14 at e8d31fa · upstream ↗ 27s32 can_beak_bust(void){ 28 return ability_hasLearned(ABILITY_2_BEAK_BUSTER);
src/core2/playerutils.c lines 27–28 at e8d31fa · upstream ↗ 152 if(bainput_should_beak_bust()) 153 sp34 = BS_F_BBUSTER;
src/core2/bs/jump.c lines 152–153 at e8d31fa · upstream ↗ 9const f32 D_80364990 = 400.0f; 10const f32 D_80364994 = -800.0f; ⋮ 12const f32 D_80364998 = 730.0f; 13const f32 D_8036499C = -2110.0f; ⋮ 15const f32 D_803649A0 = 2300.0f; 16const f32 D_803649A4 = -20000.0f; 17const f32 D_803649A8 = -5000.0f;
src/core2/bs/bbuster.c lines 9–17 at e8d31fa · upstream ↗ 64 anctrl_setDuration(aCtrl, 1.02f); 65 anctrl_setSubRange(aCtrl, 0.0f, 0.35f); ⋮ 69 baphysics_set_gravity(0.0f); 70 baphysics_set_target_horizontal_velocity(0.0f); 71 ml_vec3f_clear(sp20); 72 baphysics_set_velocity(sp20); ⋮ 78 D_8037D2B0 = 0.0001f;
src/core2/bs/bbuster.c lines 64–78 at e8d31fa · upstream ↗ 98 case 0://8029FDF0 99 if(anctrl_isStopped(baanim_getAnimCtrlPtr())){ ⋮ 101 D_8037D2BA = 1; ⋮ 104 case 1://8029FE24 105 D_8037D2B0 -= time_getDelta(); 106 if(D_8037D2B0 <= 0.0f){ 107 baphysics_reset_gravity(); 108 baphysics_set_terminal_velocity(D_803649A8); 109 baphysics_set_gravity(D_803649A4); 110 baphysics_set_vertical_velocity(D_803649A0);
src/core2/bs/bbuster.c lines 98–113 at e8d31fa · upstream ↗ 128 D_8037D2B9 = baflag_isTrue(BA_FLAG_8); 129 func_8029445C(sp30); 130 //L8029FF78 131 if(((0.0f <= sp30[1])? sp30[1] : -sp30[1]) < 1.0){ 132 D_8037D2BC++; 133 }else{ 134 D_8037D2BC = 0; ⋮ 139 if(player_isStable() || D_8037D2B9 || !(D_8037D2BC < 4)){ ⋮ 143 baphysics_set_velocity(0); 144 baphysics_set_gravity(0.0f); 145 baphysics_set_target_horizontal_velocity(0.0f); ⋮ 148 D_8037D2B0 = 0.09f;
src/core2/bs/bbuster.c lines 128–148 at e8d31fa · upstream ↗ 152 if(bafalldamage_get_damage(&sp3C)){ 153 sp44 = BS_72_SPLAT;
src/core2/bs/bbuster.c lines 152–154 at e8d31fa · upstream ↗ 195 if(player_inWater()) 196 sp44 = BS_4C_LANDING_IN_WATER;
src/core2/bs/bbuster.c lines 195–196 at e8d31fa · upstream ↗ 163 D_8037D2B0 -= time_getDelta(); 164 if(D_8037D2B0 <= 0.0f){ 165 if(D_8037D2BB){ 166 baphysics_set_vertical_velocity(D_80364990); 167 baphysics_set_gravity(D_80364994); 168 }else{ 169 baphysics_set_vertical_velocity(D_80364998); 170 baphysics_set_gravity(D_8036499C);
src/core2/bs/bbuster.c lines 163–171 at e8d31fa · upstream ↗ 209void func_802A02B4(s32 arg0){ 210 D_8037D2BB = arg0;
src/core2/bs/bbuster.c lines 209–210 at e8d31fa · upstream ↗ 273 switch(marker->id){src/core2/ba/marker.c line 273 at e8d31fa · upstream ↗ 313 case 0x9E: //L8028BF54 314 case 0xA1: //L8028BF54 315 if(plyr_hitbox_type == HITBOX_1_BEAK_BUSTER){ 316 func_802A02B4(1); 317 obj_collision_type = MARKER_COLLISION_FUNC_2_DIE;
src/core2/ba/marker.c lines 313–317 at e8d31fa · upstream ↗ 924 if (m->actionState == 0) { 925 if (m->actionTimer < 10) { 926 yOffset = 20 - 2 * m->actionTimer; 927 if (m->pos[1] + yOffset + 160.0f < m->ceilHeight) { 928 m->pos[1] += yOffset; ⋮ 934 m->vel[1] = -50.0f; 935 mario_set_forward_vel(m, 0.0f);
src/game/mario_actions_airborne.c lines 924–935 at 9921382 · 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
- n64decomp. 2023. “sm64: a decompilation of Super Mario 64 (n64decomp/sm64).” Commit 9921382. n64decomp/sm64 @ 9921382 · licence, all uses
- banjo.decomp. 2026. “banjo-kazooie: a decompilation of Banjo-Kazooie (banjo.decomp/banjo-kazooie).” Commit e8d31fa. banjo.decomp/banjo-kazooie @ e8d31fa · licence, all uses