Movement steps: Difference between revisions

No edit summary
mNo edit summary
 
(11 intermediate revisions by 5 users not shown)
Line 1: Line 1:
Typically, Mario's position is updated incrementally using his velocity. These increments are called '''steps''', and they behave differently when Mario is on the ground, in the air, in water, hanging, and climbing a pole. When on the ground or in the air, these steps typically occur four times per frame, and are commonly referred to as '''quarter steps''' or sometimes '''quarter frames'''.
Typically, Mario's position is updated incrementally using his velocity. These increments are called '''steps''', and they behave differently when Mario is on the ground, in the air, in water, hanging, and climbing a pole. When on the ground or in the air, these steps typically occur four times per frame, and are commonly referred to as '''quarter steps''' or colloquially '''quarter frames'''.


Steps are also responsible for detecting collision with [[surfaces]], updating Mario's [[referenced surfaces]], and updating Mario's [[Water|water level]]. However, quarter steps don't detect object collisions or warps.
Steps are also responsible for detecting collision with [[surfaces]], updating Mario's [[referenced surfaces]], and updating Mario's [[Water|water level]]. However, quarter steps don't detect object collisions or warps.
 
== Stationary Step ==
https://github.com/n64decomp/sm64/blob/66018e9f3caaa67399218971d61366cb3f7ba7d7/src/game/mario_step.c#L236
# Mario's x and z forward velocity and sliding velocity is set to 0
# mario_update_moving_sand
# mario_update_windy_ground
# If updated by moving sand or windy ground, return perform_ground_step
# Else, set Mario's y position to the floor, (possibly causing a [[downwarp]]), and update graphics. Return GROUND_STEP_NONE.
Also see [[Idle#stationary ground step]]
== Air Step ==
== Air Step ==
''Certain things here are more explained on their individual pages. If something lacks detail, check the link for more information.''
''Certain things here are more explained on their individual pages. If something lacks detail, check the link for more information.''


When an action performs a ''common'' air step, the first thing Mario does is update his horizontal velocity/sideways position via [[straining]]. This is only for the common air step and is not part of the quarter-frame checks.
When an action performs a ''common'' air step, the first thing Mario does is update his horizontal velocity/sideways position via [[straining]]. This is only for the common air step and is not part of the quarter-frame checks.
=== Quarter-Frame Checks ===
=== Quarter-Frame Checks ===
After that is updated, the movement is split into "quarter-steps" that breakdown Mario's movement and determine what his outcome of each step is. The checks for the quarter-steps are as follows:
After that is updated, the movement is split into "quarter-steps" that breakdown Mario's movement and determine what his outcome of each step is. The checks for the quarter-steps are as follows:
# The position a quarter of Mario's velocity ahead of Mario is checked for cancels/outcomes. Anything in bold is an exit out of the rest of the checks.
# The position a quarter of Mario's velocity ahead of Mario is checked for cancels/outcomes. Anything in bold is an exit out of the rest of the checks.
## If the position is above OOB but below Mario's current floor height, Mario's height is changed to the floor height and he '''lands'''.
## If the position is above OOB but below Mario's current floor height, Mario's height is changed to the floor height and he '''lands'''.
## If the position is above OOB but not below Mario's current floor height, Mario's height is set to the new height and he '''hits a wall'''.
## If the position is above OOB but not below Mario's current floor height, Mario's height is set to the new height and he '''hits a wall'''.
## If the action has the "riding shell" flag and the water level at the position is above the position's floor (up to 78 units above the position):
## If the action has the <span style="color:green;">"riding shell" flag</span> and the water level at the position is above the position's floor (up to 78 units above the position):
##* The floor height from here on is the water height.
##* The floor height from here on is the water height.
##* The floor from this point on is a "fake" floor on the surface of the water.
##* The floor from this point on is a "fake" floor on the surface of the water.
Line 28: Line 33:
## If the position's height is 160 units under, at, or above a ceiling and his vertical velocity is positive or zero:
## If the position's height is 160 units under, at, or above a ceiling and his vertical velocity is positive or zero:
##* Mario's vertical velocity is set to zero.
##* Mario's vertical velocity is set to zero.
##* If the ceiling above Mario is hangable and the air step has the "check hang" flag, Mario '''hangs'''. (Since this did not use the new position's ceiling/location, this is potentially a [[Hangable-Ceiling Upwarp|hangable-ceiling upwarp.]])
##* If the ceiling above Mario is hangable and the air step has the <span style="color:green;">"check hang" flag</span>, Mario '''hangs'''. (Since this did not use the new position's ceiling/location, this is potentially a [[Hangable Ceiling Upwarp|hangable-ceiling upwarp.]])
##* Otherwise, '''nothing happens'''.
##* Otherwise, '''nothing happens'''.
## If the position's height is 160 units under, at, or above a ceiling and his vertical velocity is negative:
## If the position's height is 160 units under, at, or above a ceiling and his vertical velocity is negative:
##* If the position's height is at or below Mario's floor height, Mario's height is set to the floor height, and he '''lands'''.
##* If the position's height is at or below Mario's floor height, Mario's height is set to the floor height, and he '''lands'''.
##* Otherwise, Mario's height is set to the new height and he '''hits a wall'''.
##* Otherwise, Mario's height is set to the new height and he '''hits a wall'''.
## If there is a wall 30 units above the position but not 150 units above the position and the air step has the "check ledge grab" flag:
## If there is a wall 30 units above the position but not 150 units above the position and the air step has the <span style="color:green;">"check ledge grab" flag</span>:
##* If Mario's velocity is positive, Mario is pushed by the wall opposite the velocity direction, and there is a floor 60 units behind the wall within 238 units upward, Mario '''ledge grabs'''. (Potentially a [[GLG]])
##* If Mario's velocity is positive, Mario is pushed by the wall opposite the velocity direction, and there is a floor 60 units behind the wall within 238 units upward, Mario '''ledge grabs'''. (Potentially a [[GLG]])
##* Otherwise Mario's position is set to the new position, his floor and floor height are updated, and '''nothing happens'''.
##* Otherwise Mario's position is set to the new position, his floor and floor height are updated, and '''nothing happens'''.
Line 43: Line 48:
# Mario tracks his "exit", with '''nothing happens''' being tracked if the whole process completed four times.
# Mario tracks his "exit", with '''nothing happens''' being tracked if the whole process completed four times.


With the outcome selected and the movement mostly done, a series of things happen.
=== Perform Air Step ===
* If Mario's velocity is not negative, his "peak height" is updated.
 
* Mario's step noise is updated based on his floor.
# Set Mario's wall to null
* If Mario is not flying, [[Gravity#Mario|gravity]] is applied.
# (this is a loop) Do 4 times:
* [[Vertical Wind|Vertical wind]] is now applied/accounted for.
## Let the next intended position be Mario's position plus velocity/4
* Mario's visual position is updated to Mario's position.
## Perform an air quarter step, where "new position" means "next intended position" btw, as shown above
* Mario's yaw is updated to match the in-game angle.
## If nothing happens, continue loop, else exit loop
# Let stepResult be the result of the last air quarter step performed
# If Mario's y velocity is positive, set peak height to Mario's y position (the peak height field is used for things like fall damage)
# Mario's step noise is updated based on his floor.
# If Mario is not flying, [[Gravity#Mario|gravity]] is applied.
#[[Vertical Wind|Vertical wind]] is now applied/accounted for.
# Mario's visual position is updated to Mario's position.
# Mario's yaw is updated to match the in-game angle.
# Return stepResult


=== Common Air Step Results ===
=== Common Air Step Results ===
If doing a common air step, Mario now decides what to do based off the "exit" from the quarter-frame checks before. Here is what he does for each exit:
If doing a common air step, Mario now decides what to do based off the "exit" from Perform Air Step. Here is what he does for each exit:
* '''Nothing Happens''':  
* '''Nothing Happens''':
** Mario's animation is now applied.
** Mario's animation is now applied.
* '''Lands''':
* '''Lands''':
Line 77: Line 90:
*** Mario plays a noise depending on whether or not he is wearing a metal cap.
*** Mario plays a noise depending on whether or not he is wearing a metal cap.
** If Mario's forward velocity is more than 16 and he is not in contact with a physical wall/surface (i.e. OOB):
** If Mario's forward velocity is more than 16 and he is not in contact with a physical wall/surface (i.e. OOB):
*** A different sound is played, but Mario's yaw is not reflected. <!-- Some of these reflection calculations may be wrong -->
*** A different sound is played, but Mario's yaw is not reflected.
** If Mario is in contact with a wall, his action is set to the [[Air Hit Wall|air hit wall]] action.
** If Mario is in contact with a wall, his action is set to the [[Air Hit Wall|air hit wall]] action.
** If Mario is not in contact with a wall (i.e. hitting OOB):
** If Mario is not in contact with a wall (i.e. hitting OOB):
Line 94: Line 107:
** If Mario is not wearing a metal cap, he is hurt 12 (or 18 without his hat).
** If Mario is not wearing a metal cap, he is hurt 12 (or 18 without his hat).
** Mario plays the noise for being burned.
** Mario plays the noise for being burned.
** The camera preset is set to the area's default preset. <!-- This is overly simplified, perhaps best put on the camera page -->
** The camera preset is set to the area's default preset.
** Mario enters the [[Lava Boost|lava boost]] action while dropping any held objects and no longer riding a shell.
** Mario enters the [[Lava Boost|lava boost]] action while dropping any held objects and no longer riding a shell.
=== Common Air Knockback Step ===
Similar to Common Air Step, it uses the "exit" from Perform Air Step. This function takes in a '''''landing action''''', a '''''hard fall action''''', and a '''''speed'''''.
Before calling Perform Air Step, it sets Mario's speed to '''''speed'''''.
Common Air Knockback Step can cancel into [[Feet Stuck In Ground]], '''''landing action''''', and '''''hard fall action'''''.
Mario cannot '''Hang''' or '''Ledge Grab'''. '''Nothing Happens''' and '''Lava Wall Boosts''' (contains cancel [[Lava Boost]]) are the same as for Perform Air Step.
* '''Lands'''
** If should get stuck in ground, drop and set action to [[Feet Stuck In Ground]]
** If y-velocity less than negative 55 and floor is not lava,
*** If fell more than 3000 units, shake camera, play MARIO_SOUND_ATTACKED, and drop and set mario action to the '''''hard fall action''''' with argument 4
*** Else if fell more than 1500 units and floor is not slippery
**** Hurt counter += 8 if cap, else 12
**** Squish counter += 30
** If neither of the first two checks canceled, set action to '''''landing action''''' (not changing the action argument, though there are differences in the Japanese version where the [[Thrown Forward]] and [[Thrown Backward]] intermediate actions cause the landing action argument to be hurtCounter)
* '''Hits a wall'''
** Change to the background air kb Animation
** If Mario's wall is not null
*** Mario's facingAngle[1] = wallAngle - (s32)(facingAngle[1] - wallAngle)
**** basically this step added two wallAngle
*** play either METAL_BONK or BONK sound
** else
*** play HIT sound
** facingAngle[1] += 0x8000
** Cap vel[1] to 0
** Set forward velocity to negative '''''speed''''' (and update slide and xz velocities to match)
[[Category:Action Mechanics]]

Latest revision as of 13:24, 25 May 2024

Typically, Mario's position is updated incrementally using his velocity. These increments are called steps, and they behave differently when Mario is on the ground, in the air, in water, hanging, and climbing a pole. When on the ground or in the air, these steps typically occur four times per frame, and are commonly referred to as quarter steps or colloquially quarter frames.

Steps are also responsible for detecting collision with surfaces, updating Mario's referenced surfaces, and updating Mario's water level. However, quarter steps don't detect object collisions or warps.

Stationary Step

https://github.com/n64decomp/sm64/blob/66018e9f3caaa67399218971d61366cb3f7ba7d7/src/game/mario_step.c#L236

  1. Mario's x and z forward velocity and sliding velocity is set to 0
  2. mario_update_moving_sand
  3. mario_update_windy_ground
  4. If updated by moving sand or windy ground, return perform_ground_step
  5. Else, set Mario's y position to the floor, (possibly causing a downwarp), and update graphics. Return GROUND_STEP_NONE.

Also see Idle#stationary ground step

Air Step

Certain things here are more explained on their individual pages. If something lacks detail, check the link for more information.

When an action performs a common air step, the first thing Mario does is update his horizontal velocity/sideways position via straining. This is only for the common air step and is not part of the quarter-frame checks.

Quarter-Frame Checks

After that is updated, the movement is split into "quarter-steps" that breakdown Mario's movement and determine what his outcome of each step is. The checks for the quarter-steps are as follows:

  1. The position a quarter of Mario's velocity ahead of Mario is checked for cancels/outcomes. Anything in bold is an exit out of the rest of the checks.
    1. If the position is above OOB but below Mario's current floor height, Mario's height is changed to the floor height and he lands.
    2. If the position is above OOB but not below Mario's current floor height, Mario's height is set to the new height and he hits a wall.
    3. If the action has the "riding shell" flag and the water level at the position is above the position's floor (up to 78 units above the position):
      • The floor height from here on is the water height.
      • The floor from this point on is a "fake" floor on the surface of the water.
      • The floor's origin offset is set to the water height.
    4. If the position's height is 78 units or less below a floor and there is not a ceiling 160 units or less above it (because of how variable types an overflow jump may occur here):
      • Mario's position horizontally is updated to the new position.
      • Mario's height is set to that of the floor's height.
      • Mario's floor and floor height are updated.
      • Mario lands.
    5. If the position's height is 78 units or less below a floor and there is a ceiling 160 units or less above it (because of how variable types an overflow jump may occur here):
      • Mario's height is set to that of the floor's height.
      • Mario lands. (Because Mario's floor is not updated, this is where a pedro spot may occur)
    6. If the position's height is 160 units under, at, or above a ceiling and his vertical velocity is positive or zero:
      • Mario's vertical velocity is set to zero.
      • If the ceiling above Mario is hangable and the air step has the "check hang" flag, Mario hangs. (Since this did not use the new position's ceiling/location, this is potentially a hangable-ceiling upwarp.)
      • Otherwise, nothing happens.
    7. If the position's height is 160 units under, at, or above a ceiling and his vertical velocity is negative:
      • If the position's height is at or below Mario's floor height, Mario's height is set to the floor height, and he lands.
      • Otherwise, Mario's height is set to the new height and he hits a wall.
    8. If there is a wall 30 units above the position but not 150 units above the position and the air step has the "check ledge grab" flag:
      • If Mario's velocity is positive, Mario is pushed by the wall opposite the velocity direction, and there is a floor 60 units behind the wall within 238 units upward, Mario ledge grabs. (Potentially a GLG)
      • Otherwise Mario's position is set to the new position, his floor and floor height are updated, and nothing happens.
    9. Mario's position is set to the new position and his floor and floor height are updated.
    10. If Mario is colliding with a wall 150 or 30 units up and the upper or only wall is lava, he lava wall boosts.
    11. If Mario is colliding with a wall 150 or 30 units up and Mario is facing perpendicular to 0x6000 units away, he hits a wall.
    12. If no other exit has occurred, nothing happens.
  2. This repeats until Mario encounters something besides nothing happens, up to four times including the initial time.
  3. Mario tracks his "exit", with nothing happens being tracked if the whole process completed four times.

Perform Air Step

  1. Set Mario's wall to null
  2. (this is a loop) Do 4 times:
    1. Let the next intended position be Mario's position plus velocity/4
    2. Perform an air quarter step, where "new position" means "next intended position" btw, as shown above
    3. If nothing happens, continue loop, else exit loop
  3. Let stepResult be the result of the last air quarter step performed
  4. If Mario's y velocity is positive, set peak height to Mario's y position (the peak height field is used for things like fall damage)
  5. Mario's step noise is updated based on his floor.
  6. If Mario is not flying, gravity is applied.
  7. Vertical wind is now applied/accounted for.
  8. Mario's visual position is updated to Mario's position.
  9. Mario's yaw is updated to match the in-game angle.
  10. Return stepResult

Common Air Step Results

If doing a common air step, Mario now decides what to do based off the "exit" from Perform Air Step. Here is what he does for each exit:

  • Nothing Happens:
    • Mario's animation is now applied.
  • Lands:
    • If Mario is not over a hard surface, the terrain is either snow or desert, Mario's peak height is more than 1000 units above him, the surface does not belong to an object, and the Y normal of the surface is not less than .8660254 (square root of 3 divided by 2):
    • If Mario's action is not twirling, the floor is not lava, his negative velocity is less than -55, and the distance from the peak height to Mario is more than 3000 units:
      • Mario is hurt by 16 (24 without his hat).
      • The camera shakes.
      • Mario plays the "attacked" noise.
      • Mario is set to the hard backward ground knockback action and the lands checks stop.
    • If Mario's action is not twirling, the floor is not lava, his negative velocity is less than -55, and the distance from the peak height to Mario is more than 1150 units:
      • Mario is hurt by 8 (12 without his hat).
      • Mario is squished for 30.
      • The camera shakes.
      • Mario plays the "attacked" noise.
    • Mario is set to his action's landing action.
  • Hits a Wall:
    • Mario's animation is now applied.
    • If Mario's forward velocity is more than 16 and is in contact with a physical wall/surface:
      • Mario's yaw is "reflected" across the most recent wall Mario collided with, up to the first 4 walls. (This can be glitchy with more than 1 wall, i.e. unreferenced walls).
      • Mario plays a noise depending on whether or not he is wearing a metal cap.
    • If Mario's forward velocity is more than 16 and he is not in contact with a physical wall/surface (i.e. OOB):
      • A different sound is played, but Mario's yaw is not reflected.
    • If Mario is in contact with a wall, his action is set to the air hit wall action.
    • If Mario is not in contact with a wall (i.e. hitting OOB):
      • Any positive vertical speed is capped to 0.
      • If Mario's forward velocity is 38 or more, spawn particles and set his action to the backward air knockback action.
      • If Mario's forward velocity is more than 8 but less than 38, set Mario's forward speed to -8 and set his action to the soft bonk action.
    • If Mario's forward velocity is 16 or less (initially, not after these other changes), set the forward velocity to 0.
  • Ledge Grabs
    • Mario's animation is set the idle ledge grab animation.
    • Mario enters the ledge grab action while dropping any held objects and no longer riding a shell.
  • Hangs
  • Lava Wall Boosts
    • Mario's yaw is set perpendicular to the wall.
    • Mario's forward speed is capped to 24.
    • If Mario is not wearing a metal cap, he is hurt 12 (or 18 without his hat).
    • Mario plays the noise for being burned.
    • The camera preset is set to the area's default preset.
    • Mario enters the lava boost action while dropping any held objects and no longer riding a shell.

Common Air Knockback Step

Similar to Common Air Step, it uses the "exit" from Perform Air Step. This function takes in a landing action, a hard fall action, and a speed.

Before calling Perform Air Step, it sets Mario's speed to speed.

Common Air Knockback Step can cancel into Feet Stuck In Ground, landing action, and hard fall action.

Mario cannot Hang or Ledge Grab. Nothing Happens and Lava Wall Boosts (contains cancel Lava Boost) are the same as for Perform Air Step.

  • Lands
    • If should get stuck in ground, drop and set action to Feet Stuck In Ground
    • If y-velocity less than negative 55 and floor is not lava,
      • If fell more than 3000 units, shake camera, play MARIO_SOUND_ATTACKED, and drop and set mario action to the hard fall action with argument 4
      • Else if fell more than 1500 units and floor is not slippery
        • Hurt counter += 8 if cap, else 12
        • Squish counter += 30
    • If neither of the first two checks canceled, set action to landing action (not changing the action argument, though there are differences in the Japanese version where the Thrown Forward and Thrown Backward intermediate actions cause the landing action argument to be hurtCounter)
  • Hits a wall
    • Change to the background air kb Animation
    • If Mario's wall is not null
      • Mario's facingAngle[1] = wallAngle - (s32)(facingAngle[1] - wallAngle)
        • basically this step added two wallAngle
      • play either METAL_BONK or BONK sound
    • else
      • play HIT sound
    • facingAngle[1] += 0x8000
    • Cap vel[1] to 0
    • Set forward velocity to negative speed (and update slide and xz velocities to match)