-
Notifications
You must be signed in to change notification settings - Fork 28
Timer Abuse
Several maneuvers in Madeline's moveset allow her to maintain a state and/or a certain amount of speed for some duration, controlled by a timer, and these maneuvers also have other effects if certain events occur before the timer expires. There are many unrelated events that change Madeline's state or speed without forcibly setting some or all of her timers to 0, which expands the set of situations in which those other timer-related effects can be triggered. Causing this sequence of events is referred to as "timer abuse" with respect to the timer whose effects are still active after the speed- or state-changing event.
Some timers' abuse is either well-defined enough or niche enough that it's classified as a specific tech or category of tech. Examples of this are climbhop cancels, retention tech, and some applications of jelly bumps, which abuse Madeline's forceMoveXTimer
, wallSpeedRetentionTimer
, and gliderBoostTimer
respectively.
Other timers' abuse is so loosely defined or widespread that general terms related to "timer abuse" are used to describe it. This page aims to describe those forms of timer abuse and specific applications of them.
Madeline's jump height depends on how long the player holds a jump button, up to a maximum. The implementation of this functionality is that starting a jump sets Madeline's varJumpTimer
and varJumpSpeed
, and while the jump timer is positive, holding jump sets Madeline's vertical speed to varJumpSpeed
.
Madeline's AutoJump
and AutoJumpTimer
fields are used to force her to act as if jump is held, regardless of player input. When AutoJumpTimer
decrements, if it reaches 0, AutoJump
is set to false. But if AutoJump
is set to true while AutoJumpTimer
is already 0, AutoJump
will never automatically be set to false, so it can last indefinitely (denoted as ♾️ in the table below).
varJumpTimer
is set to 0 by:
- releasing jump while
AutoJump
is false in StNormal or StDummy - colliding with a ceiling while
varJumpTimer
is less than 0.15 (9 frames) - entering a downwards screen transition
Jumps can be started by:
varJumpSpeed |
varJumpTimer |
AutoJump |
Source |
---|---|---|---|
-105 + LiftBoost.Y
|
0.2 (12f) | ❌ | ground jump, walljump, climbjump, super |
(-105 + LiftBoost.Y ) / 2 |
0.2 (12f) | ❌ | hyper |
-160 + LiftBoost.Y
|
0.25 (15f) | ❌ | wallbounce |
-140 | 0.2 (12f) | 0.1 (6f) |
Player.Bounce (bouncing on snowballs, iceballs, pufferfish, etc.) |
-105 | 0.15 (9f) | ♾️ |
Player.Rebound (dash-colliding with Kevins, power boxes, etc.) |
-105 | 0.2 (12f) | ♾️ | upwards screen transition while state is not StRedDash, StStarFly, or StReflectionFall |
-140 | 0.2 (12f) | ♾️ | side spring |
-185 | 0.2 (12f) | ♾️ | upwards spring |
-100 | 0.2 (12f) | ♾️ | bird fling |
-100 or Speed.Y
|
0.2 (12f) | ♾️ | StStarFly ending while input direction is not downwards |
-60 | 0.15 (9f) | ♾️ | hiccup |
The term jump timer abuse, often abbreviated as JTA, refers to starting a jump, temporarily altering Madeline's trajectory, then resuming the trajectory from the jump before varJumpTimer
ends. It's often used to gain upwards speed in a situation where that wouldn't otherwise be possible or optimal.
Some JTA-related tech has specific terms applied to it, but many applications of JTA are so open-ended that general terms are applied to many situations in which JTA is used. For example, "cutscene JTA" may refer to jumping, dashing, then skipping a cutscene to set Madeline's state to StNormal and resume using the jump timer, or it may refer to jumping, then skipping a cutscene to get upwards speed at a cutscene warp destination without starting a second jump, or something else entirely.
Refers to wallbouncing, then dashing again soon enough that the jump timer from the wallbounce will outlast the StDash coroutine duration, resulting in Madeline's vertical speed being set to -160 again after the second dash. This is also sometimes referred to as "shaboingboing" in reference to someone's particularly popular reaction to themself accidentally performing it.
Refers to wallbouncing, then entering a Badeline orb soon enough that the jump timer from the wallbounce will outlast the duration over which the orb coroutine moves Madeline. To keep the jump timer active, jump must be held while in the orb since the coroutine puts Madeline in StDummy.
Ground jumps, supers, and hypers can only be started if Madeline is currently touching the ground or has recently touched the ground. Both of these possibilities are accounted for by Madeline's jumpGraceTimer
, which is set to 0.1 seconds (effectively 5 frames) by:
- touching the ground
- exiting a dream block, unless
DashDir
is strictly vertical - being launched by a core block
Additionally, "normal" hiccups check if jumpGraceTimer
is positive and increase it to 0.6 seconds (35 frames) if so. Normal hiccups occur when Madeline's hiccupTimer
reaches 0 while she has more than -60 vertical speed (slower upwards or any downwards) and is in StNormal, StDash, StSwim, StHitSquash, StPickup, StTempleFall, or StIntroMoonJump.
jumpGraceTimer
is set to 0 by:
- ground jumping, climbjumping, and walljumping
- hypers, supers, and wallbounces
- entering StStarFly
-
Player.Bounce
(bouncing on Oshiro, snowballs, seekers, iceballs, pufferfish, or deadly pits in assist mode) - screen transitions
- hitting a spring
- exiting a dream block when
DashDir
is strictly vertical
In addition to having positive jumpGraceTimer
, starting a super or hyper from StRedDash requires DashDir
to be strictly horizontal, and from StDash requires DashDir
to have a vertical magnitude of less than 0.1.
Refers to using a booster while touching ground or in coyote time, so that a hyper or super can be performed from the booster.
Getting into a booster while in coyote time is usually accomplished by leaving ground using a dash. Dashing in any direction does not remove coyote time, so dashes are a commonly available way to move upwards or downwards into a booster not quite at ground level. Dashes also have their usual benefits of preserving high speed or gaining speed from a standstill, at the cost of one frame at zero speed.
Red boosters do not allow demodashing, so performing a hyper from a red booster requires Madeline to manually crouch and dash on the same frame. Crouching requires Madeline to be currently touching ground, not just in coyote time. Green boosters have no such limitation.
Refers to getting coyote time from a core block launching Madeline, then dashing to perform a hyper or super using that coyote time. The dash must be started after coyote time is given, as starting it earlier would cause the core block to disintegrate early and not give coyote time for that launch.
Refers to touching ground, then getting upwards speed in a way that does not remove coyote time, then using that coyote time to start a ground jump from above the ground.
Below are some common ways to get upwards speed after touching ground:
- performing a holdable 0f bunnyhop
- jumping, then performing a grounded ultra, then picking up a holdable. This ends StDash early, resulting in jump timer abuse which gives upwards speed
- jumping, then colliding with a ceiling, then touching ground, then getting out from under the ceiling before the jump timer falls below 0.15
There are two separate mechanisms that allow Madeline to dream jump. Madeline can use both of them consecutively to dream jump twice after exiting a single dream block.
- When
DreamDashUpdate
detects that it has moved Madeline outside of the dream block, it also checks whether a jump button is pressed, and makes Madeline jump if so. -
DreamDashUpdate
then sets Madeline's state to StNormal or StClimb. The state change causesDreamDashEnd
to be called, andDreamDashEnd
gives Madeline coyote time, allowing her to jump.
Both mechanisms only allow Madeline to jump if her DashDir
is not strictly vertical.
Refers to getting coyote time from exiting a dream block, then dashing and performing a hyper or super using that coyote time. Exiting a dream block only gives Madeline coyote time if her DashDir
is not strictly vertical.
Many interactions can only be triggered while Madeline is DashAttacking
, which is true if either she is in StDash or her dashAttackTimer
is positive. StDash lasts for 11 frames and sets the state to normal on the 12th frame, whereas entering StDash or StRedDash sets the dashAttackTimer
to 0.3 (18 frames). Each of those durations is often considered to be 3 frames longer because entering StDash causes 3 freeze frames, during which timers don't decrement.
The short duration for which dashAttackTimer
outlasts the dash state is enough for the timer to function as a leniency mechanic, but enables few new situations in which triggering interactions that require DashAttacking
wasn't already possible. DashAttacking
can be preserved into many more situations by changing Madeline's state (but not her dashAttackTimer
) soon after StDash or StRedDash begins, which often allows significant changes to her trajectory as well.
The dashAttackTimer
is set to 0 by:
- ground jumping, climbjumping, and walljumping
- hypers, supers, and wallbounces
- colliding with a solid
- entering a dream block
-
Player.Bounce
(bouncing on Oshiro, snowballs, seekers, iceballs, pufferfish, or deadly pits in assist mode)
Cancelling StDash or StRedDash without resetting the dashAttackTimer
often allows Madeline to enter dream blocks or dash-collide with solids in situations that aren't otherwise possible or optimal with the trajectory from a dash in a given direction. Dash-colliding occurs when the movement from Madeline's speed causes her to collide with a solid or jumpthrough with an OnDashCollide
method while she is DashAttacking
. Dash-colliding also requires the collision direction and dash direction (DashDir
) to have the same component on the axis of collision.
Entering dream blocks uses its own check which is independent of the axis of collision -- it only checks if either the X-component or the Y-component of the dash is the same as that of the collision direction. As a result, in addition to the dash directions allowed by dash-colliding, Madeline can also enter a dream block with a directionless dash or a strictly horizontal or vertical dash that is opposite the collision direction.
Expand for a complete table of what given collision directions result in with given dash directions.
Colliding in a certain direction while having a certain dash direction may result in:✅ a dream block entry or a dash-collision
✨ only a dream block entry
❌ neither
Collision \ Dash | ⬆️ | ➡️ | ⬇️ | ⬅️ | ➖ | ||||
---|---|---|---|---|---|---|---|---|---|
⬆️ | ✅ | ✅ | ❌ | ❌ | ✨ | ❌ | ❌ | ✅ | ✨ |
➡️ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ✨ | ❌ | ✨ |
⬇️ | ✨ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ✨ |
⬅️ | ❌ | ❌ | ✨ | ❌ | ❌ | ✅ | ✅ | ✅ | ✨ |
Note
Only speed-based movement can cause dash-collisions because the solid's OnDashCollide
method is only called by Madeline's OnCollide*
methods, and only the speed-based Move*
calls in Player.Update
pass her corresponding onCollide*
delegates. As such, movement from any other Move*
calls (such as from wind, moving solids, and states like StAttract) cannot cause dash-collision, even if it causes Madeline to collide while DashAttacking
, because it does not result in her OnCollide*
methods (and so solids' OnDashCollide
methods) being called.
Refers to entering an upwards screen transition while DashAttacking
, then triggering some interaction in the new room before the dashAttackTimer
runs out. Transition wallbounces are technically an application of this, but typically aren't described as such -- the term "kermit dash" is usually reserved for more niche uses such as activating a Kevin using the dashAttackTimer
from the room below.
Refers to performing a wallbounce from a wall with spikes on it. If Madeline is not moved into range after a frame's death check (by e.g. wind or a climbhop cancel), and the spikes' hitbox isn't lagging behind a frame due to the solid moving, performing a spiked wallbounce requires Madeline to be inside the spikes' hitbox in order to be in range of the wall.
The most common way to accomplish this is to dash upwards such that StDash ends just below the spikes, then hold away from the wall so that Madeline has speed away from the wall, preventing the spikes from killing her while she's inside their hitbox. This method sees widespread usage because it's possible to perform when a dash naturally ends, but it can also be used when StDash is ended early.