Strats are a concept that encompasses performing a series of maneuvers in a room.
Strats are usually presented within an array of strats, where all individual strats are a way to attain roughly the same goal.
A strat
can have the following properties:
- name: The name of the strat.
- entranceCondition: Indicates that this strat requires entering through the door transition in a special way, combining with a strat in the previous room.
- requires: The logical requirements that must be fulfilled to execute that strat.
- exitCondition: Indicates that this strat leaves through the door transition in a special way that combines with a strat in the next room.
- clearsObstacles: An array containing the ID of obstacles that will be cleared by executing this strat (if they are not already cleared).
- resetsObstacles: An array containing the ID of obstacles that will be reset (i.e. returned to their original state) by executing this strat.
- comesThroughToilet: Indicates whether this strat is applicable if the Toilet comes between this room and the other room.
- gModeRegainMobility: Indicates that this strat allows regaining mobility when entering with G-mode immobile.
- bypassesDoorShell: Indicates that this strat allows exiting without opening the door.
- unlocksDoors: An array describing possible doors that can be unlocked as part of this strat.
- collectsItems: An array listing items that are collected as part of this strat (e.g. for G-mode remote item acquire).
- setsFlags: An array listing game flags that are set as part of this strat. These properties are described below in more detail.
- flashSuitChecked: Indicates that the logical requirements of the strat have been verified to be logically sound with respect to whether a flash suit can be carried or not. Note that a
true
value does not necessarily mean that a flash suit can be carried with this strat, only that its logical requirements can be relied on to determine whether it can or not.
Here's a simple example of a strat:
{
"name": "Base",
"requires": ["Morph"]
}
A strat has logical requirements which must be fulfilled in order to execute it. These must always be specified, although they may be explicitly set to an empty array if there are no requirements.
Execution of a strat may have an effect of clearing one or more obstacles in the room. This is indicated by a clearsObstacles
property on the strat. It can represent, for example, that certain enemies or special blocks are destroyed by executing this strat. This allows later performing strats in the room that have an obstaclesCleared
logical requirement on this obstacle, while disallowing strats that have an [obstaclesNotCleared
] requirement.
Similarly, the resetsObstacles
property is used to indicate that a strat results in an obstacle returning to its original, uncleared state.
Some strats involve leaving the room in a special way that allows a corresponding strat in the next room to be executed. Common examples include leaving the room with a shinespark or shinecharge, or running out of the room in order to complete a shinecharge in the next room. Strats that exit a room in such a way are identified by a strat property exitCondition
, containing a property describing the type of exit condition, such as leaveWithRunway
, leaveShinecharged
, or leaveWithSpark
. Likewise, strats that require entering the room in a special way are identified by a strat property entranceCondition
, containing a property describing the type of entrance condition required, such as comeInRunning
, comeInShinecharged
, or comeInWithSpark
.
Even strats that leave/enter the room in a "normal" way require a leaveNormally
exit condition or comeInNormally
entrance condition in order to specify that they cross the room. This is made easier by the fact that in most cases implicit strats exist for leaving or entering the room through a door node
Many cross-room strats involve the use of runways. The geometry of a runway is summarized by an object having the following properties:
- length: The number of tiles in the runway.
- openEnd: Any runway that is used to gain momentum has two ends. An open end is when a platform drops off into nothingness, as opposed to ending against a wall or a door transition tile. An open end offers a bit more room to run. This property indicates the number of open ends that are available to use (0 or 1).
- The following properties further define the tiles in
length
, by indicating how many of them have some particularities. Samus temporarily moves more slowly over sloped tiles, which effectively gives a longer distance over which to gain speed on the runway. These properties will be missing if there are no such tiles. In places with more than 45 tiles where it's not relevant, that information will also be omitted.- gentleUpTiles: Indicates how many tiles gently slope upwards (like in Speed Booster Hall).
- gentleDownTiles: Indicates how many tiles gently slope downwards (like in Speed Booster Hall).
- steepUpTiles: Indicates how many tiles steeply slope upwards (like in Landing Site).
- steepDownTiles: Indicates how many tiles steeply slope downwards (like in Landing Site).
- startingDownTiles: Indicates how many tiles slope downwards at the expected start of the running space. A stutter can't be executed on those tiles.
In most cases, what matters is the effective runway length (ERL), which takes into account how slopes temporarily slow down Samus' horizontal movement:
ERL = length - startingDownTiles - 9/16 * (1 - openEnd) + 1/3 * steepUpTiles + 1/7 * steepDownTiles + 5/27 * gentleUpTiles + 5/59 * gentleDownTiles
There is some variance in how much downward slopes slow Samus' movement, depending on specific alignment of Samus' X position. The amount of variance is small enough to be neglected as long as some small amount of lenience is included in how runways are required to be used.
In all strats with an exitCondition
, the to
node of the strat must be a door node or exit node. An exitCondition
object must contain exactly one of the following properties, which indicates the type of exit condition provided by the strat:
- leaveNormally: This indicates that can Samus leave through this door in a "normal" way, by walking, falling, or jumping.
- leaveWithRunway: This indicates that a runway of a certain length is connected to the door, with which Samus can gain speed and run or jump through the door, among other possible actions.
- leaveShinecharged: This indicates that it is possible to charge a shinespark and leave the room with a certain amount of time remaining on the shinecharge timer (e.g., so that a shinespark can be activated in the next room).
- leaveWithTemporaryBlue: This indicates that Samus may leave through this door by jumping with temporary blue.
- leaveWithSpark: This indicates that it is possible to shinespark through the door transition.
- leaveSpinning: This indicates that it is possible to jump through this door with a spin jump from a runway not connected to the door, possibly with blue speed.
- leaveWithMockball: This indicates that it is possible to mockball through the door with a certain amount of momentum, and possibly with blue speed, from a runway not connected to the door.
- leaveWithSpringBallBounce: This indicates that it is possible to leave through this door with a spring ball bounce with a certain amount of momentum.
- leaveSpaceJumping: This indicates that it is possible to Space Jump through the bottom of the doorway (through a horizontal transition) with a certain amount of momentum, and possibly with blue speed.
- leaveWithStoredFallSpeed: This indicates that is is possible to walk through the door with the stored velocity to clip through floor tiles using a Moonfall.
- leaveWithGModeSetup: This indicates that Samus can take enemy damage through the door transition, to set up R-mode or direct G-mode in the next room.
- leaveWithGMode: This indicates that Samus can carry G-mode into the next room (where it will become indirect G-mode).
- leaveWithDoorFrameBelow: This indicates that Samus can go up through this door with momentum by jumping in the door frame, e.g. using a wall-jump or Space Jump.
- leaveWithPlatformBelow: This indicates that Samus can go up through this door with momentum by jumping from a platform below, possibly with run speed.
- leaveWithGrappleSwing: This indicates that Samus can leave through this door by swinging using Grapple, carrying momentum and the ability to grapple jump in the next room.
- leaveWithGrappleJump: This indicates that Samus can go up through this door by grapple jumping, with no horizontal momentum.
- leaveWithGrappleTeleport: This indicates that Samus can leave through this door while grappling, which can enable a teleport in the next room.
- leaveWithSamusEaterTeleport: This indicates that Samus can leave through this door immediately after teleporting into a Samus Eater by exiting G-Mode.
Each of these properties is described in more detail below.
A strat with an exit condition implicitly has a doorUnlockedAtNode
requirement on its to
node, unless it has the bypassesDoorShell
property set to true
. This means that if the to
door has a lock on it, it must either be unlocked before the strat can be executed, or the door's requirements under the strat property unlocksDoors
must be satisfied.
A leaveNormally
object indicates that Samus can leave the room through this door, with no other particular requirements.
{
"name": "Leave Normally",
"exitCondition": {
"leaveNormally": {}
},
"requires": []
}
A leaveWithRunway
object indicates that a strat exits the current room using a runway. The leaveWithRunway
exit condition is unique in that it describes available geometry rather than a specific way to leave the room. This is done in order to reduce the amount of redundant boilerplate that would otherwise be required, since every door node in the game will have at least one strat with leaveWithRunway
. The specific way that the runway is used depends on the entrance condition in the destination room. A leaveWithRunway
condition implies that the area around the door must be clear of any enemies that would interfere with using the runway.
A leaveWithRunway
exit condition can satisfy the following entrance conditions in the next room: comeInRunning
, comeInJumping
, comeInShinecharging
, comeInGettingBlueSpeed
, comeInShinecharged
, comeInWithSpark
, comeInWithBombBoost
, comeInWithStutter
, comeInWithDoorStuckSetup
, comeInSpeedballing
, comeInWithTemporaryBlue
, comeInSpinning
, comeInBlueSpinning
, and comeInWithMockball
. Details are given under the corresponding entrance conditions below.
leaveWithRunway
has the following properties describing the runway geometry (see runway geometry above for details):
- length, openEnd, gentleUpTiles, gentleDownTiles, steepUpTiles, steepDownTiles, startingDownTiles
The runway length should not include the transition tile, but it should include the door shell tile if applicable.
In a heated room, a leaveWithRunway
exit condition implicitly includes heatFrames
needed to use the runway. The amount of heatFrames
required depends on the entrance condition in the next room, and the details of how these heatFrames
may be calculated are described under each entrance condition below. If the from
and to
nodes of the strat are different nodes, then it is assumed that the strat property requires
already includes any heat frames needed to reach the starting point of the runway (the side furthest from the door), in which case the implicit heatFrames
in leaveWithRunway
will only account for the heat frames needed to use the runway in one direction, moving towards the door. If the from
and to
nodes of the strat are the same node, then the implicit heatFrames
includes all heat frames needed to position appropriately on the runway (starting from the door), execute the required movement, and exit the room through the door.
When a leaveWithRunway
condition is used to charge a shinespark, it implicitly includes a canShinecharge
requirement with usedTiles
based on the runway length (and also based on a continuation of the runway in the destination room where applicable). Again, this is described in more detail under the applicable entrance conditions below.
When a leaveWithRunway
conditions occurs on a door in a water environment, it may implicitly include a Gravity
requirement, depending on whether this is needed for the corresponding entrance condition.
{
"name": "Leave With Runway",
"requires": [],
"exitCondition": {
"leaveWithRunway": {
"length": 20,
"openEnd": 1
}
}
}
A leaveShinecharged
object represents that Samus can leave through this door with a shinecharge (shinespark charge). It has no properties.
A strat with a leaveShinecharged
should include a logical requirement for obtaining the shinecharge, e.g. canShineCharge
; alternatively, it may contain a comeInShinecharged
or comeInShinecharging
entrance condition or startsWithShineCharge: true
property if the shinecharge is obtained as part of an earlier strat. It should also include a shineChargeFrames
logical requirement to account for shinecharge frames that elapse before reaching the door transition.
A leaveShinecharged
condition implicitly requires canShinechargeMovement
tech.
Note: Using a runway connected to a door to leave the room with a shinecharge is already covered by leaveWithRunway
, so leaveShinecharged
only needs to be used in cases where the shinecharge is obtained in another part of the room and then carried through the door.
A leaveShinecharged
object does not provide any way to specify Samus' position or momentum through the door transition, but these details can affect the execution of the strat in the next room. Instead, as a way of normalizing these requirements, we make the following assumptions:
-
For a horizontal door transition, the
framesRemaining
(and any other strat requirements such as heat frames) should be based on Samus touching the door transition while running, with an unspecified amount of horizontal momentum but no vertical momentum. -
For a vertical door transition, the
framesRemaining
(and other strat requirements) should be based on the worst-case position, among all possible horizontal positions within the door frame, with an unspecified amount of horizontal and vertical momentum. Samus must enter the transition in a normal "jumping" or "falling" pose. For example, entering an upward transition with a jump into mid-air morph would not be valid, because in the next room it would not be possible to control the effects of the jump in the expected way. Breaking spin before the transition would be valid, and it is recommended to do so since it allows reaching the transition more quickly.
{
"name": "Leave Shinecharged",
"requires": [
{"canShinecharge": {
"usedTiles": 20,
"openEnd": 0
}}
],
"exitCondition": {
"leaveShinecharged": {
"framesRemaining": 90
}
}
}
A leaveWithTemporaryBlue
exit condition represents that Samus can leave through this door by jumping with temporary blue. It can be applied to either horizontal or vertical transitions.
The leaveWithTemporaryBlue
object has the following property:
- direction: This takes three possible values "left", "right", and "any", indicating the direction that Samus is facing through the transition. It should be specified for all vertical transitions but not horizontal ones.
Note: Using a runway connected to a door to leave the room with temporary blue is already covered by leaveWithRunway
.
{
"name": "Leave With Temporary Blue",
"requires": [
{"canShinecharge": {
"usedTiles": 20,
"openEnd": 0
}}
],
"exitCondition": {
"leaveWithTemporaryBlue": {}
}
}
A leaveWithSpark
exit condition represents that Samus can leave through this door while shinesparking. A strat with a leaveWithSpark
condition should include a canShinecharge
and shinespark
requirements in its requires
.
The leaveWithSpark
object has the following property:
- position: For a horizontal transition, if specified, this takes two possible values, "top" or "bottom". The value "top" represents that the strat sparks through the doorway high enough to clear a single-tile block level with the bottom of the doorway. The value "bottom" represents that the strat sparks through the doorway low enough to clear a single-tile block level with the top of the doorway. If unspecified, it is understood that the strat can exit through either the top or bottom of the doorway, whichever is needed in the next room.
The direction of the spark is assumed to be horizontal when sparking through horizontal door transitions, or vertical when sparking through vertical door transitions. There is an implicit requirement of canHorizontalShinespark
when sparking through a horizontal door.
Note: Using a runway connected to a door to leave the room with a shinespark is already covered by leaveWithRunway
. Likewise leaveShinecharged
implicitly includes the possibility of leaving the room with a shinespark. It is only necessary to use leaveWithSpark
in cases where it would not be possible to reach the door before the shinecharge timer expires, or, to account for the possibility of shinecharge frame leniency, where the door can only be reached with less than about 30 shinecharge frames remaining.
{
"name": "Leave With Spark",
"requires": [
{"canShinecharge": {
"usedTiles": 20,
"openEnd": 0
}},
{"shinespark": {
"frames": 200
}}
],
"exitCondition": {
"leaveWithSpark": {}
}
}
A leaveSpinning
exit condition represents that Samus can spin jump through a horizontal transition with a certain amount of momentum, and possibly with blue speed, depending on the length of available runway and short-charging skill assumption. This exit condition applies to jumps from a runway disconnected from the door (e.g. below a ledge in front of the door). It should only be applied where there is air physics at the door. It should also only be applied in cases where there is flexibility to exit at a wide range of positions between the top and bottom of the doorway. Specifically, for every vertical position at least 8 pixels below the top of the doorway, it should be possible to control the jump to leave at that position. This means being able to leave at screen positions in the range between 116 ($74) and 148 ($94); the highest of these positions corresponds to Samus' hitbox just barely fitting in the top half of the doorway.
The leaveSpinning
object has the following properties:
- remoteRunway: A runway geometry object describing the tiles available to gain speed for the jump.
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) with which it is possible to leave with this condition. For leaving with blue speed, there is already an implicit minimum speed based on shortcharging skill, so this property only needs to be specified as an additional constraint in case something else prevents Samus from reaching the door transition (in the needed positions) at low speeds.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) with which it is possible to leave with this condition. There is already an implicit speed limit based on the length of the remote runway (see the full run speed table), and for leaving with blue speed there is a different implicit limit based on a combination of runway length and shortcharging skill (see the blue run speed table); so this property only needs to be specified as an additional constraint in case something else prevents Samus from reaching the door transition (in the needed positions) at high speeds.
- blue: This takes one of three possible values, "yes", "no", or "any", indicating whether this strat can be used for leaving with blue speed, without blue speed, or either. This could be used, for example, in case of a difference in usable runway length if shortcharging is being performed, or a difference in heat damage taken. The default is "any".
If a leaveSpinning
condition is used for blue speed in the next room, then it implicitly includes a canShinecharge
requirement (including the SpeedBooster
item). Heat frames are not included and would have to described explicitly in the strat "requires".
{
"name": "Leave Spinning",
"requires": [],
"exitCondition": {
"leaveSpinning": {
"remoteRunway": {
"length": 12,
"openEnd": 1
}
}
}
}
A leaveWithMockball
exit condition represents that Samus can leave through a horizontal transition while in a mockball (or process of morphing into a mockball) with a certain amount of momentum, and possibly with blue speed, depending on the length of available runway and short-charging skill assumption. It should only be applied where there is air physics at the door.
The leaveWithMockball
object has the following properties:
- remoteRunway: A runway geometry object describing the tiles available to gain speed for the jump before the mockball.
- landingRunway: A runway geometry object describing the tiles available to land and gain speed in a mockball before hitting the transition.
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) with which it is possible to leave with this condition. For leaving with blue speed, there is already an implicit minimum speed based on shortcharging skill, so this property only needs to be specified as an additional constraint in case something else prevents Samus from reaching the door transition (in the needed positions) at low speeds.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) with which it is possible to leave with this condition. There is already an implicit speed limit based on the length of the remote runway (see the full run speed table), and for leaving with blue speed there is a different implicit limit based on a combination of runway length and shortcharging skill (see the blue run speed table); so this property only needs to be specified as an additional constraint in case something else prevents Samus from reaching the door transition (in the needed positions) at high speeds.
- blue: This takes one of three possible values, "yes", "no", or "any", indicating whether this strat can be used for leaving with blue speed, without blue speed, or either. The default is "any".
A leaveWithMockball
condition implicitly includes the canMockball
tech requirement (including the Morph
item requirement). If it is used for blue speed in the next room, then it also implicitly includes a canShinecharge
requirement (including the SpeedBooster
item) and the canSpeedball
tech requirement. Heat frames are not included and would have to described explicitly in the strat "requires".
{
"name": "Leave With Mockball",
"requires": [],
"exitCondition": {
"leaveWithMockball": {
"remoteRunway": {
"length": 12,
"openEnd": 1
},
"landingRunway": {
"length": 3,
"openEnd": 1
}
}
}
}
A leaveWithSpringBallBounce
exit condition represents that Samus can leave through a horizontal transition with a spring ball bounce in front of the door, with a certain amount of momentum, and possibly with blue speed. It should only be applied where there is air physics at the door.
The leaveWithSpringBallBounce
object has the following properties:
- remoteRunway: A runway geometry object describing the tiles available to gain speed for the jump before the mockball.
- landingRunway: A runway geometry object describing the tiles available to land and gain speed in a mockball before hitting the transition.
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) with which it is possible to leave with this condition. For leaving with blue speed, there is already an implicit minimum speed based on shortcharging skill, so this property only needs to be specified as an additional constraint in case something else prevents Samus from reaching the door transition (in the needed positions) at low speeds.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) with which it is possible to leave with this condition. There is already an implicit speed limit based on the length of the remote runway (see the full run speed table), and for leaving with blue speed there is a different implicit limit based on a combination of runway length and shortcharging skill (see the blue run speed table); so this property only needs to be specified as an additional constraint in case something else prevents Samus from reaching the door transition (in the needed positions) at high speeds.
- blue: This takes one of three possible values, "yes", "no", or "any", indicating whether this strat can be used for leaving with blue speed, without blue speed, or either. The default is "any".
- movementType: This takes one of three possible values, "controlled", "uncontrolled", or "any", indicating the type of bounce that can be used.
- "controlled" refers to movement type $12, which occurs when jumping using Spring Ball while rolling on the ground (e.g. from a mockball). In this state it is possible to control the height of each bounce by releasing jump.
- "uncontrolled" refers to movement type $13, which occurs when performing a lateral mid-air morph high enough that the morph animation completes before landing and bouncing. This state also occurs when rolling off of a ledge (e.g. after a mockball). In this state, Samus' horizontal speed will reach a slightly higher value, and without the need for a longer landing platform to accelerate on. However, it will not be possible to control the height of the bounce.
A leaveWithSpringBallBounce
condition implicitly includes the canSpringBallBounce
tech requirement (including the Morph
and SpringBall
item requirements). If it is used for blue speed in the next room, then it also implicitly includes a canShinecharge
requirement (including the SpeedBooster
item) and the canSpeedball
tech requirement. Heat frames are not included and would have to described explicitly in the strat "requires".
Note that using a mockball in front of the door to perform a spring ball bounce is already covered by leaveWithMockball
. Therefore strats for leaveWithStringBallBounce
are generally only needed to cover the "uncontrolled" case; they can also be used for cases where a controlled-type bounce is carried from elsewhere by bouncing across the room.
{
"name": "Leave With Spring Ball Bounce",
"requires": [],
"exitCondition": {
"leaveWithSpringBallBounce": {
"remoteRunway": {
"length": 12,
"openEnd": 1
},
"landingRunway": {
"length": 3,
"openEnd": 1
},
"movementType": "uncontrolled"
}
}
}
A leaveSpaceJumping
exit condition represents that Samus can Space Jump through the bottom of a horizontal transition just before hitting the transition, using momentum (and possibly blue speed) available from a remote runway (one not connected to the door). It should also only be applied where there is air physics at the door.
The leaveSpaceJumping
object has the following properties:
- remoteRunway: A runway geometry object describing the tiles available to gain speed for the Space Jump.
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) with which it is possible to leave with this condition. For leaving with blue speed, there is already an implicit minimum speed based on shortcharging skill, so this property only needs to be specified as an additional constraint in case something else prevents Samus from reaching the door transition (in the needed positions) at low speeds.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) with which it is possible to leave with this condition. There is already an implicit speed limit based on the length of the remote runway (see the full run speed table), and for leaving with blue speed there is a different implicit limit based on a combination of runway length and shortcharging skill (see the blue run speed table); so this property only needs to be specified as an additional constraint in case something else prevents Samus from reaching the door transition (in the needed positions) at high speeds.
- blue: This takes one of three possible values, "yes", "no", or "any", indicating whether this strat can be used for leaving with blue speed, without blue speed, or either. The default is "any".
A leaveSpaceJumping
condition implicitly includes the SpaceJump
item requirement. If it is used for blue speed in the next room, then it also implicitly includes a canShinecharge
requirement (including the SpeedBooster
item) and the canBlueSpaceJump
tech requirement. Heat frames are not included and would have to described explicitly in the strat "requires".
{
"name": "Leave Space Jumping",
"requires": [],
"exitCondition": {
"leaveSpaceJumping": {
"remoteRunway": {
"length": 12,
"openEnd": 1
}
}
}
}
A leaveWithStoredFallSpeed
exit condition represents that Samus can leave through this door with stored fall speed.
The leaveWithStoredFallSpeed
object has a single property:
- fallSpeedInTiles: The number of tiles Samus would clip through by Moonfalling on top of a solid floor.
A leaveWithStoredFallSpeed
entrance condition must match with a comeInWithStoredFallSpeed
condition on the other side of the door. A strat with a leaveWithStoredFallSpeed
condition must include a method of storing fall speed within its requirements, such as a Moondance. Entering a room with a comeInWithStoredFallSpeed
condition would also be a possible way to exit with a leaveWithStoredFallSpeed
condition so long as the stored speed is not lost. For this to happen, both doors must be connected by one Runway
, and Samus must not Crouch or become Knocked back.
{
"name": "Moondance to Store Fall Speed",
"requires": [
"h_canUseBombs",
"canMoondance"
],
"exitCondition": {
"leaveWithStoredFallSpeed": {
"fallSpeedInTiles": 1
}
}
}
A leaveWithGModeSetup
exit condition represents that Samus can leave through this door while taking damage through the transition, in a pose that would allow using X-Ray on the first frame after the transition. This sets up the player to enter R-mode or direct G-mode in the next room. The only known way to achieve this is to use an enemy that can follow Samus into the doorway during the transition. It will not work with enemy projectiles since these do not move during transitions, and environmental damage such as heat, lava, acid do not work as these are not active during the transition. Also note that the damage must happen during (not before) the transition, so being able to take a hit that knocks Samus into the door transition does not work. The enemy damage through the transition should not be included in the requires
, as the type/amount of enemy damage is irrelevant since Samus' energy will always reach zero here in order to trigger reserves.
A leaveWithGModeSetup
object contains the following property:
- knockback: If true, then Samus gets knockback frames through the transition. This makes it possible for Samus to retain mobility in the next room if reserve energy is at most 4. Most enemies provide knockback, so this property is true by default if unspecified. Certain enemies such as Beetoms, Metroids, and Mochtroids do not provide knockback, so this property should be set to false for strats that use these enemies for the transition damage.
A leaveWithGModeSetup
comes with implicit requirements, which are described in detail under the entrance conditions comeInWithRMode
and comeInWithGMode
. The implicit requirements depend on the specifics of the entrance condition in the next room, but they always include at least the following:
- The
XRayScope
item requirement. - A requirement to have at least 1 reserve energy.
- A requirement to damage down to 0 energy, triggering reserves.
{
"name": "Leave With G-Mode Setup",
"requires": [],
"exitCondition": {
"leaveWithGModeSetup": {}
}
}
A leaveWithGMode
exit condition represents that Samus can leave through this door while in G-mode, resulting in indirect G-mode in the next room. A strat with a leaveWithGMode
exit condition should always also have a comeInWithGMode
entrance condition since the only (known) way to enter G-mode is while (or before) coming into the room.
A leaveWithGMode
object has the following property:
- morphed: If true, then this strat results in leaving the room in a morphed state, either by maintaining artificial morph or by having the Morph item.
For most doors in the game, it is possible to enter the room with a G-mode setup and then immediately exit back through the same door. This is because in direct G-mode the door does not close behind Samus. To avoid the need to write out tedious boilerplate, these strats are understood to be included implicitly, as described here.
Aside from the implicit strats, there are a limited amount of leaveWithGMode
strats possible. Normally entering a room with G-mode (or a G-mode setup) and then leaving with G-mode through a different door is not possible, since door shells cannot be opened while in G-mode. However, some door transitions do not have door shells (e.g. in Crateria Tube, Glass Tunnel, Crab Hole, Big Pink; also elevators and sand transitions), and some door shells are possible to bypass using glitches, so leaveWithGMode
can be used in these situations.
A leaveWithDoorFrameBelow
exit condition represents that Samus can go up through this door with momentum by jumping in the door frame, e.g. using a wall-jump or Space Jump. A leaveWithDoorFrameBelow
exit condition can satisfy comeInWithWallJumpBelow
and comeInWithSpaceJumpBelow
entrance conditions in the room above.
A leaveWithDoorFrameBelow
object has the following property:
- height: The number of tiles beneath the door transition (not including the transition tiles) usable for wall-jumping.
In a heated room, heat frames must be explicitly included in the strat requires
, based on an assumption of wall-jumping up through the door. If the strat in the neighboring room has a comeInWithSpaceJumpBelow
entrance condition, then additional heat frames will be implicitly included to use Space Jump, so that does not need to be included in the leaveWithDoorFrameBelow
strat. Likewise, requirements for canWalljump
or SpaceJump
do not need to included, as these will be implicitly included in the corresponding entrance conditions. If a strat starts at the same (door) node that it ends at, then heat frames should include the time required to fall down from the door, shoot it open, and then wall-jump back out.
{
"name": "Leave With Door Frame Below",
"requires": [],
"exitCondition": {
"leaveWithDoorFrame": {
"height": 2
}
}
}
A leaveWithPlatformBelow
exit condition represents that that Samus can go up through this door with momentum by jumping from a platform below, possibly with run speed. A leaveWithPlatformBelow
exit condition can satisfy a comeInWithPlatformBelow
entrance condition in the room above.
A leaveWithPlatformBelow
object has the following properties:
- height: The number of tiles between the door transition and the platform, not including the transition tiles or platform itself. A horizontal slope tile (as in Blue Hopper Room) counts as a half tile.
- leftPosition: This indicates the position of the furthest left usable tile of the platform, relative to the center of the door. A negative values indicates a position to the left of the door center, while a positive value indicates a position to the right of the door center. An open end, if applicable, is represented by an extra half tile.
- rightPosition: This indicates the position of the furthest right usable tile of the platform, relative to the center of the door. A negative values indicates a position to the left of the door center, while a positive value indicates a position to the right of the door center. An open end, if applicable, is represented by an extra half tile.
In a heated room, heat frames must be explicitly included in the strat requires
, based on a worst-case assumption of how the platform could need to be used. If a strat starts at the same (door) node that it ends at, then heat frames should include the time required to fall down from the door, shoot it open, position at the far end of the runway, and jump out.
{
"name": "Leave With Platform Below",
"requires": [],
"exitCondition": {
"leaveWithDoorFrame": {
"height": 7,
"leftPosition": -2.5,
"rightPosition": 2.5,
}
}
}
A leaveWithGrappleSwing
exit condition represents that Samus can leave through this door by swinging using Grapple, allowing Samus to carry momentum and the ability to grapple jump in the next room. This can apply to horizontal doors or to vertical doors leading upward.
A leaveWithGrappleSwing
object has the following property:
- blocks: An array of block objects, each described a specific block that Samus could use to swing out of the room. Each block object has the following properties:
- position: Tile coordinates of blocks that Samus could be grappled to, to swing out of the room. Coordinates
[x, y]
are represented as tile counts with[0, 0]
representing the top-left corner of the screen containing the door transition. - environment: A string "air" or "water" indicating the environment Samus will be in when using this block to swing out of the room.
- obstructions: An array of coordinates of blocks that Samus must avoid while swinging out of the room.
- position: Tile coordinates of blocks that Samus could be grappled to, to swing out of the room. Coordinates
A leaveWithGrappleSwing
implicitly comes with a canPreciseGrapple
requirement, which includes the Grapple item requirement. If a mid-air morph or grapple jump is required, this should be specified explicitly in the requires
either in this strat or in matching strats in the other room.
{
"name": "Leave with Grapple Swing",
"requires": [],
"exitCondition": {
"leaveWithGrappleSwing": {
"blocks": [
{"position": [-1, 5], "environment": "water"}
]
}
}
}
A leaveWithGrappleJump
exit condition represents that Samus can leave through this door by grapple jumping vertically up through the door, with no horizontal momentum.
A leaveWithGrappleJump
object has the following property:
- position: This takes one of three possible values, "left", "right", or "any". The value "left" represents that Samus may leave while positioned within the left-most tile of the doorway. The value "right" represents that Samus may leave while positioned within the right-most tile of the doorway. The value "any" represents that Samus may leave in either a left or right position, depending on whichever is needed for the next room.
A leaveWithGrappleJump
implicitly comes with a canGrappleJump
tech requirement, which includes the Grapple and Morph item requirements.
{
"name": "Leave with Grapple Jump",
"requires": [],
"exitCondition": {
"leaveWithGrappleJump": {
"position": "right"
}
}
}
A leaveWithGrappleTeleport
exit condition represents that Samus can leave through this door while grappled, which can enable a teleport in the next room. The position of the block that Samus is grappled to (counted in tiles from the top left corner of the room) determines the destination of the teleport in the next room. For the teleport to work, the next room must have a block in a corresponding position that Samus can remain grappled to; e.g. a solid tile will work but air will not.
A leaveWithGrappleTeleport
object has the following property:
- blockPositions: A list of tile coordinates of (grapple) blocks that Samus could be grappled to while exiting the room. Coordinates
[x, y]
are represented as tile counts with[0, 0]
representing the top-left corner of the room.
A leaveWithGrappleTeleport
comes with an implicit tech requirement canGrappleTeleport
.
{
"name": "Leave with Grapple Teleport",
"requires": [],
"exitCondition": {
"leaveWithGrappleTeleport": {
"blockPositions": [[5, 3]]
}
}
}
A leaveWithSamusEaterTeleport
exit condition represents that Samus can leave through this door immediately after initiating a teleport to the position of a Samus Eater in the room, by exiting G-mode. The position where Samus touched the Samus Eater determines where Samus will be placed in the next room. Most positions will result in Samus being placed behind the door after the transition, which will likely put Samus out of bounds. In some rooms, however, the space behind the door may be in-bounds; and there is a possibility of using specific Samus Eater locations to spawn Samus slightly in front of the door but lower than normal.
A leaveWithSamusEaterTeleport
object has the following properties:
- floorPositions: A list of screen-local tile coordinates of floor Samus Eaters, indicating the left-most tile of the Samus Eater that Samus can interact with.
- ceilingPositions: A list of screen-local tile coordinates of ceiling Samus Eaters, indicating the left-most tile of the Samus Eater that Samus can interact with.
A leaveWithSamusEaterTeleport
comes with an implicit tech requirement canSamusEaterTeleport
.
{
"link": [1, 1],
"name": "Leave with Samus Eater Teleport",
"entranceCondition": {
"comeInWithGMode": {
"mode": "direct",
"morphed": false
}
},
"requires": [],
"exitCondition": {
"leaveWithSamusEaterTeleport": {
"floorPositions": [[12, 13], [2, 13], [8, 13]],
"ceilingPositions": []
}
}
}
In all strats with an entranceCondition
, the from
node of the strat must be a door node or entrance node. An entranceCondition
object must contain exactly one of the following properties:
- comeInNormally: This indicates that Samus must come into the room through the specified door, with no other particular requirements.
- comeInRunning: This indicates that Samus must run into the room, with speed in a certain range.
- comeInJumping: This indicates that Samus must run and jump just before hitting the transition, with speed in a certain range.
- comeInSpaceJumping: This indicates that Samus must Space Jump through the bottom of the doorway.
- comeInShinecharging: This indicates that Samus must run into the room with enough space to complete a shinecharge.
- comeInShinecharged: This indicates that Samus must enter the room with a shinecharge.
- comeInShinechargedJumping: This indicates that Samus must jump into the the room with a shinecharge.
- comeInWithSpark: This indicates that Samus must shinespark into the room.
- comeInWithBombBoost: This indicates that Samus must come into the room with a horizontal bomb boost.
- comeInStutterShinecharging: This indicates that Samus must run into the room with a stutter immediately before the transition.
- comeInWithDoorStuckSetup: This indicates that Samus must enter the room in a way that allows getting stuck in the door as it closes.
- comeInSpeedballing: This indicates that Samus must enter the room either in a speedball from the previous room, or in a process of running, jumping, or falling into a speedball.
- comeInWithTemporaryBlue: This indicates that Samus must come in by jumping through this door with temporary blue.
- comeInWithMockball: This indicates that Samus must roll into the room with a mockball with a certain amount of momentum.
- comeInWithSpringBallBounce: This indicates that Samus get a spring ball bounce in the doorway of the previous room.
- comeInWithBlueSpringBallBounce: This indicates that Samus get a spring ball bounce in the doorway of the previous room while having blue speed.
- comeInSpinning: This indicates that Samus come in with a spin jump through the doorway with speed in a certain range.
- comeInBlueSpinning: This indicates that Samus come in with a spin jump through the doorway while having blue speed.
- comeInWithStoredFallSpeed: This indicates that Samus must enter the room with fall speed stored, and is able to clip through a floor with a Moonfall.
- comeInWithRMode: This indicates that Samus must have or obtain R-mode while coming through this door.
- comeInWithGMode: This indicates that Samus must have or obtain G-mode (direct or indirect) while coming through this door.
- comeInWithWallJumpBelow: This indicates that Samus must come up through this door with momentum by wall-jumping in the door frame below.
- comeInWithSpaceJumpBelow: This indicates that Samus must come up through this door with momentum by using Space Jump in the door frame below.
- comeInWithPlatformBelow: This indicates that Samus must come up through this door with momentum by jumping from a platform below, possibly with run speed.
- comeInWithGrappleSwing: This indicates that Samus swing into the room using Grapple, giving momentum and possibly the ability to grapple jump.
- comeInWithGrappleJump: This indicates that Samus must come into the room by grapple jumping vertically through this door, with no horizontal momentum.
- comeInWithGrappleTeleport: This indicates that Samus must come into the room while grappling, teleporting Samus to a position in this room corresponding to the location of the (grapple) block in the other room.
- comeInWithSamusEaterTeleport: This indicates that Samus must come into the room immediately after initiating a teleport into a Samus Eater by exiting G-Mode in the other room.
In addition it may contain the following property:
- comesThroughToilet: This indicates whether the strat is applicable if the Toilet comes between this room and the other room.
Each of these properties is described in more detail below.
A comeInNormally
entrance condition represents the need for Samus to enter the room through this door, with no other particular requirements. It has no properties.
A comeInNormally
condition can be satisfied by a matching strat on the other side of the door with a leaveNormally
or leaveWithRunway
exit condition.
When matching with a leaveWithRunway
condition in a heated room on a strat having distinct from
and to
nodes, heat frame requirements must be included for the run performed in the other room; for details, see the comeInRunning
condition below.
{
"name": "Come In Normally",
"entranceCondition": {
"comeInNormally": {}
},
"requires": []
}
A comeInRunning
entrance condition represents the need for Samus to be able to run into the room with speed in a certain range. It has the following properties:
- speedBooster: If true, then Speed Booster must be used while running into the room. If false, then Speed Booster must not be used. If "any", then Speed Booster may or may not be used.
- minTiles: The minimum horizontal speed that will satisfy the condition, measured in effective runway tiles with dash held.
- maxTiles: The maximum horizontal speed that will satisfy the condition, measured in effective runway tiles with dash held.
A comeInRunning
condition can be satisfied only by a matching strat on the other side of the door with a leaveWithRunway
exit condition: a match is valid if all of the following are true:
- The effective runway length of the
leaveWithRunway
is at least as long as theminTiles
in thecomeInRunning
condition.
Where applicable, a comeInRunning
condition also includes implicit requirements for actions to be performed in the previous room, which are effectively prepended to the start of the strat's requires
(or equivalently but more properly, onto the end of the requires
of the leaveWithRunway
strat in the other room):
- If
speedBooster
is true, then there is an implicitSpeedBooster
item requirement. - If
speedBooster
is false, then there is an implicitcanDisableEquipment
tech requirement. - If the previous room is heated, then
heatFrames
are required based on the time needed to perform the run. - If the previous door environment is water, then
Gravity
is required.
Heat frames may be calculated based on the following table of approximations (which include almost no lenience):
Action | Heat frames |
---|---|
Run from a standstill in one direction, without Speedbooster, 0-6 tiles | 9 + 4 * tiles |
Run from a standstill in one direction, without Speedbooster, 7+ tiles | 13 + 64 / 19 * tiles |
Run from a standstill in one direction, with Speedbooster, 0-6 tiles | 9 + 4 * tiles |
Run from a standstill in one direction, with Speedbooster, 7-16 tiles | 15 + 3 * tiles |
Run from a standstill in one direction, with Speedbooster, 17-42 tiles | 32 + 2 * tiles |
Run from a standstill in one direction, with Speedbooster, 43+ tiles | 47 + 64 / 39 * tiles |
Turn around | 8 |
Position using moonwalk (and shoot open the door) | 12 |
The way to calculate minimally required heat frames depends on the type of leaveWithRunway
:
- If the
from
node of theleaveWithRunway
is the same as theto
node, then this represents that the runway is used starting from the door. In this case heat frames must be included for running in both directions. The distance to run is determined by theminTiles
in thecomeInRunning
object. The heat frames for this run length should be doubled; then heat frames should be added to allow time to turn around and position. Even with optimal movement, time to position is necessary if the full length of the runway is required; in theory this time could be reduced by using X-Ray Scope to buffer the positioning and to turn-around in place. - If the
from
node of theleaveWithRunway
is different from theto
node, then this represents that the runway is used starting at the end opposite the door. In this case heat frames only need to be included for running in one direction, toward the door. However, if thecomeInRunning
condition has amaxTiles
and it is less than the effective runway length in theleaveWithRunway
, then it will not work to run through the entire length of the runway; there are a couple options in this case:- The player can hold run until at a distance of
maxTiles
from the transition, then stop and restart running (by briefly releasing forward while holding an angle button). In this case the runway is partitioned into two runs, and the heat frames from the two individual runs must be added, along with any time for positioning. - The player can hold dash at the beginning of the runway for a distance between
minTiles
andmaxTiles
(with the optimal strategy being to run as close tomaxTiles
as possible without going over), then release dash for the remainder of the run to maintain a constant speed.
- The player can hold run until at a distance of
{
"name": "Come In Running",
"entranceCondition": {
"comeInRunning": {
"speedBooster": "any",
"minTiles": 2
}
},
"requires": []
}
A comeInJumping
entrance condition represents the need for Samus to be able to run toward the door in the previous room, with speed in a certain range, and spin jump just before hitting the transition. It has the following properties:
- speedBooster: If true, then Speed Booster must be used while running into the room. If false, then Speed Booster must not be used. If "any", then Speed Booster may or may not be used.
- minTiles: The minimum horizontal speed that will satisfy the condition, measured in effective runway tiles with dash held.
- maxTiles: The maximum horizontal speed that will satisfy the condition, measured in effective runway tiles with dash held.
comeInJumping
is very similar to comeInRunning
, the only difference being the jump which happens just before the transition. Heat frames and other implicit requirements are generated in exactly the same way.
{
"name": "Cross Room Jump",
"entranceCondition": {
"comeInJumping": {
"speedBooster": "any",
"minTiles": 2
}
},
"requires": []
}
A comeInSpaceJumping
entrance condition indicates that Samus must come in with a Space Jump through the bottom of the doorway, applicable to horizontal transitions. It has the following properties:
- speedBooster: If true, then Speed Booster must be used while gaining run speed. If false, then Speed Booster must not be used. If "any", then Speed Booster may or may not be used.
- minTiles: The minimum horizontal speed that will satisfy the condition, measured in effective runway tiles with dash held on the remote runway.
- maxTiles: The maximum horizontal speed that will satisfy the condition, measured in effective runway tiles with dash held on the remote runway.
A comeInSpaceJumping
entrance condition must match with a leaveSpaceJumping
on the other side of the door. To match, the blue
property of leaveSpaceJumping
must be "no" or "any". This comes with an implicit SpaceJump
item requirement.
{
"name": "Come In Space Jumping",
"entranceCondtion": {
"comeInSpaceJumping": {
"speedBooster": "any",
"minTiles": 4
}
},
"requires": [
"canCrossRoomJumpIntoWater"
]
}
A comeInShinecharging
entrance condition represents the need for Samus to run into the room with enough space to complete a shinecharge. It has the following properties describing the geometry of the runway in the current room which can be used to help complete the shinecharge (see runway geometry above for details):
- length, openEnd, gentleUpTiles, gentleDownTiles, steepUpTiles, steepDownTiles
The length should not include any tiles that Samus skips over through the transition (e.g. door transition tiles and door shell tiles).
A comeInShinecharging
must match with a corresponding leaveWithRunway
condition on the other side of the door.
A comeInShinecharging
object also includes implicit requirements for actions to be performed in the previous room, which are effectively prepended to the start of the current strat's requires
(or equivalently but more properly, onto the end of the requires
of the leaveWithRunway
strat in the other room):
- A
canShinecharge
requirement is included based on the combined runway length. This includes aSpeedBooster
item requirement as well as a check that the combined runway length is long enough that charging a shinespark is possible. - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. - If the current room is heated, then
heatFrames
are included based on the time spent running in this room. - If the previous door environment is water, then
Gravity
is required.
The way to calculate minimally required heat frames depends on the type of leaveWithRunway
and on which of the two rooms (or both) are heated:
-
If the
from
node of theleaveWithRunway
is the same as theto
node, then this represents that the runway in the other room is used starting from the door. In this case Samus will need to run in both directions. The way to calculate heat frames then depends on which rooms are heated:-
If both rooms are heated, then it is best to use smallest amount of runway possible in the other room. If the required shinecharge tiles (based on the desired difficulty) is no more than the effective runway length in the current room (based on the
comeInShinecharging
properties), then there is no need to add heat frames for running in the other room. Otherwise, the amount of runway to use in the other room is the difference between the required shinecharge tiles and the effective runway length in the current room (but at leastminTiles
, if specified). The run in the other room to get positioned on the runway can be done at full speed, so the table can be used to determine the required heat frames for this run, including heat frames for turning around and positioning. For the run back to charge the spark, there are two cases:- If the combined effective runway length is at least 31.3 tiles, then dash can be held through the entire run, so the table can be used to get the total heat frames.
- If the combined effective runway length is less than 31.3 tiles, then run back to charge the spark requires a constant 85 frames (essentially independent of shortcharging technique).
-
If only the current room is heated, then heat frames are minimized by using the full available runway in the other room to gain as much speed as possible before the transition.
-
If the combined effective runway length is at least 31.3 tiles, then dash can be held through the entire run. In this case, the frames spent on the combined run can be found in the table, as can the frames spent in the other room; subtracting these two values gives the frames spent on the heated part of the run (i.e. the part in the current room).
-
If the combined effective runway length is less than 31.3 tiles, then the run can be completed in the constant 85 frames needed to perform the shinecharge (regardless of shortcharging technique). The precise amount of frames spent in the current room is complicated to determine as it depends on details of how the shortcharge is performed. We can get a reasonable approximation by modeling as the movement as starting at a speed of 0.125 tiles/frame (somewhat less than the full walking speed of 0.171875 tiles/frame) and having constant acceleration up to the end of the combined runway. This is a quadratic model which has the following solution:
$$T = \text{total time} = 85 \text{ frames}$$ $$C = \text{initial speed} = 0.125 \text{ tiles per frame}$$ $$L = \text{combined effective runway length (in tiles)}$$ $$L_o = \text{effective runway length in other room}$$ $$a = \text{acceleration} = 2(L - CT) / T^2$$ $$T_o = \text{time in other room} = \frac{\sqrt{C^2 + 2aL_o} - C}{a}$$ $$T_c = \text{time in current room} = T - T_o$$
For medium-length runways (ones significantly longer than the player's minimum shortcharge length, but significantly less than 31.3 tiles), this model is somewhat lenient. It assumes essentially that the player would perform the shortcharge over the full length of the runway, like doing a 4-tap with relatively long, safe taps. If instead the player did a more precise start to the shortcharge and then held dash for the remainder of the run (e.g. like a stutter 2-tap), then the heat frames in the current room could be slightly reduced. This could be modeled, but it is probably not worth the hassle for the small difference it would make.
-
-
If only the other room is heated, then it is again best to use smallest amount of runway possible in the other room. The heat frames for the first run in the other room (if it is needed) and to turn-around and position can be obtained using the table. Heat frames for the run back can be approximated using either the table or the formula for
$T_o$ in the quadratic model above, depending on if the combined runway has length greater 31.3 tiles. In the case of medium-length runways, this model is technically a bit lenient. We are assuming a uniform rate of acceleration, but it could be possible to get out of the other room faster by holding dash at the start of the short-charge for as long as possible and then switch to tapping; this type of movement would be highly unintuitive and only save a few heat frames, so we don't try to model it.
-
-
If the
from
node of theleaveWithRunway
is different from theto
node, then this represents that the runway in the other room is used starting at the end opposite the door. The way to calculate heat frames in this case is similar to above, except the full combined runway is used in every case, and it is only necessary to consider the one run from the other room to the current room (there being no need to start by doing a separate run in the opposite direction).
{
"name": "Come In Shinecharging",
"entranceCondition": {
"comeInShinecharging": {
"length": 5,
"openEnd": 1
}
},
"requires": [
{"shinespark": {
"frames": 40,
"excessFrames": 3
}}
]
}
A comeInGettingBlueSpeed
entrance condition represents the need for Samus to run into the room with enough space to gain blue speed. It is similar to comeInShinecharging
and includes the same set of properties, with the following additional properties:
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) needed at the end of the combined runway. This can be specified if something would prevent the strat from working at too low of a speed.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) needed at the end of the combined runway. This can be specified if something would prevent the strat from working at too high of a speed.
A comeInGettingBlueSpeed
must match with a corresponding leaveWithRunway
condition on the other side of the door, and it includes the same requirements as a comeInShinecharging
except with a getBlueSpeed
requirement in place of a canShinecharge
.
Note that a comeInGettingBlueSpeed
entrance condition is compatible with preserving a flash suit, while comeInShinecharging
is not.
{
"name": "Come In Getting Blue Speed",
"entranceCondition": {
"comeInGettingBlueSpeed": {
"length": 5,
"openEnd": 1
}
},
"requires": []
}
A comeInShinecharged
entrance condition represents the need for Samus to run or jump into the room with a shinecharge. It has no properties.
A strat with a comeInShinecharged
condition should include a shineChargeFrames
logical requirement to account for shinecharge frames that are required in order to be able to position for the spark (or to reach the ending location of the strat, if the shinecharge is still active). The shinecharge frame counts are based on highly skilled (but humanly viable) play; leniency could be added by adjusting these counts or reducing the assumed starting shinecharge frames of 180. A shinespark
requirement should also be included in the requires
; alternatively it may include a leaveShinecharged
exit condition or "endsWithShineCharge": true
property, if the shinecharge is still active at the end of the strat.
A comeInShinecharged
must match with either a leaveShinecharged
condition or a leaveWithRunway
condition on the other side of the door.
-
A
comeInShinecharged
condition has no implicit requirements when matched with aleaveShinecharged
conditions: all requirements in the other room are assumed to be explicitly accounted for in the strat with theleaveShinecharged
. -
A
comeInShinecharged
condition may also match with aleaveWithRunway
condition. In this case it is assumed that the runway in the other room is used to obtain a shinecharge just before entering the transition, with 170 frames remaining. This comes with implicit requirements for actions to be performed in the previous room:- A
canShinecharge
requirement is included based on the runway length. This includes aSpeedBooster
item requirement as well as a check that the effective runway length is enough that charging a shinespark is possible. - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. The minimally required heat frames are calculated the same way as incomeInShinecharging
, except here withcomeInShinecharged
there is no second runway to combine with. An extra 10 heat frames are assumed for leaving the room after the shinecharge is obtained. - If the previous door environment is water, then
Gravity
is required.
- A
In every case, a comeInShinecharged
condition comes with an implicit requirement of canShinechargeMovement
tech.
A comeInShinecharged
object does not provide any way to specify Samus' position or momentum through the door transition, but these details can affect the execution of the strat. As a way of normalizing the requirements, we make the following assumptions:
-
For a horizontal door transition, the
framesRequired
(and any other strat requirements such as heat frames) should be based on an assumption that Samus enters the room either while running or spin-jumping just before the transition, with an unspecified amount of momentum. So the requirements should be based on the worst-case scenario, which in most cases means entering the room with no momentum. If entering with a spin jump is required, keep in mind that acomeInShinecharged
condition does not require air physics in the previous room, so the jump may be low; if a spin jump with more momentum is required then thecomeInShinechargedJumping
condition should be used. -
For an vertical door transition, the
framesRemaining
(and other strat requirements) should be based on an assumption that Samus can enter through any horizontal position of the doorway (whichever is most favorable), in a jumping or falling pose, but with an unspecified amount of horizontal and vertical momentum. The requirements should be based on the worst-case momentum scenario, which generally means entering the room with no momentum, since any unwanted vertical momentum can be cancelled by releasing jump through the transition.
{
"name": "Come In Shinecharged",
"entranceCondition": {
"comeInShinecharged": {
"framesRequired": 65
}
},
"requires": [
{"shinespark": {
"frames": 40,
"excessFrames": 3
}}
]
}
A comeInShinechargedJumping
entrance condition represents the need for Samus to jump into the room with a shinecharge. The jump must occur from an air environment on the other side of the door. It has no properties.
A strat with a comeInShinechargedJumping
condition should include shineChargeFrames
and shinespark
requirements in its requires
.
The conditions for comeInShinechargedJumping
are the same as for comeInShinecharged
, with the added condition that the other side of the door must be an air environment. As with comeInShinecharged
, it comes with an implicit requirement of canShinechargeMovement
tech.
A comeInWithSpark
entrance condition indicates that Samus must shinespark into the room.
The comeInWithSpark
object has the following property:
- position: For a horizontal transition, if specified, this takes two possible values, "top" or "bottom". The value "top" represents that the strat requires sparking through the doorway high enough to clear a single-tile block level with the bottom of the doorway. The value "bottom" represents that the strat requires sparking through the doorway low enough to clear a single-tile block level with the top of the doorway. If unspecified, it is understood that sparking in any position will work.
The direction of the spark is assumed to be horizontal when sparking through horizontal door transitions, or vertical when sparking through vertical door transitions.
A strat with a comeInWithSpark
condition should include a shinespark
requirement in its requires
.
A comeInWithSpark
condition must match with either a leaveWithSpark
, leaveShinecharged
, or leaveWithRunway
condition on the other side of the door:
- A match with
leaveWithSpark
is valid as long as theposition
properties are compatible. Theposition
properties of aleaveWithSpark
andcomeInWithSpark
are compatible if they are equal or if at least one of them are unspecified. - A match with
leaveShinecharged
is always valid. It comes with an implicit requirement ofcanShinechargeMovement
. - A match with
leaveWithRunway
comes with the following implicit requirements (the same as forcomeInShinecharged
) for actions to be performed in the previous room:- A
canShinecharge
requirement is included based on the runway length. This includes aSpeedBooster
item requirement as well as a check that the effective runway length is enough that charging a shinespark is possible. - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. The minimally required heat frames are calculated the same way as incomeInShinecharging
, except here withcomeInShinecharged
there is no second runway to combine with. - If the previous door environment is water, then
Gravity
is required.
- A
In all three cases, there is an implicit requirement of canHorizontalShinespark
when sparking through a horizontal door. There is also an implicit requirement of canMidairShinespark
if the position
property is "top" in either the comeInWithSpark
or a matching leaveWithSpark
.
{
"name": "Come In With Spark",
"entranceCondition": {
"comeInWithSpark": {}
},
"requires": [
{"shinespark": {
"frames": 50,
"excessFrames": 3
}}
]
}
A comeInStutterShinecharging
entrance condition indicates that Samus must run into the room with SpeedBooster equipped, with a stutter immediately before the transition. This is used when entering a water room in order to obtain a shinecharge in a shorter amount of space than would otherwise be possible. It has the following property:
- minTiles: The minimum amount of effective runway tiles in other room needed for this strat.
A comeInStutterShinecharging
condition must match with a leaveWithRunway
condition on the other side of the door, which must have an "air" environment and an effective length of at least minTiles
. A match comes with the following implicit requirements for actions to be performed in the previous room:
- The tech
canStutterWaterShineCharge
, which includes a requirement for theSpeedBooster
item. - If the previous room is heated, then heat frame requirements are included based on
minTiles
, in the same way as for acomeInRunning
requirement.
{
"name": "Come In Stutter Shinecharging",
"entranceCondition": {
"comeInStutterShinecharging": {
"minTiles": 2
}
},
"requires": [
{"shinespark": {"frames": 60}}
]
}
A comeInWithBombBoost
entrance condition indicates that Samus must come into the room with a horizontal bomb boost. This object has no properties.
A comeInWithBombBoost
condition must match with a leaveWithRunway
condition on the other side of the door, which must have an "air" environment. A match comes with the following implicit requirements for actions to be performed in the previous room:
- A requirement
h_canBombThings
, to be able to use Bombs or a Power Bomb, as well as the techcanBombHorizontally
. - If the previous room is heated, a requirement of
{"heatFrames": 100}
is included, for positioning, placing the bomb, and waiting for it to detonate.
{
"name": "Come In With Bomb Boost",
"entranceCondition": {
"comeInWithBombBoost": {}
},
"requires": []
}
A comeInWithDoorStuckSetup
entrance condition indicates that Samus must enter the room in a way that allows getting stuck in the door as it closes. This object has no properties.
A comeInWithDoorStuckSetup
condition must match with a leaveWithRunway
condition on the other side of the door. A match comes with the following implicit requirements for actions to be performed in the previous room:
- If the previous room is heated, a minimum requirement of
{"heatFrames": 100}
is included, for positioning and executing the door stuck setup; depending on the desired difficulty, this requirement can be increased to add leniency. Note that if X-Ray Scope is available (and it always should be for a strat with this condition, since the only known application of door stuck setups is for X-Ray climbing), then minimizing heat damage is made easier by using X-Ray to buffer the positioning near the door and to turn around in place. - If the current room is heated and leniency is desired for failed attempts, then a minimum requirement of
{"heatFrames": 50}
should be included per potential failed attempt. - If the previous room is to the left, then a tech requirement
canStationarySpinJump
is included. - If the previous room is to the right, then a tech requirement
canRightSideDoorStuck
is included. - If the previous door environment is water and is to the right, then a requirement
{"or": ["Gravity", "canRightSideDoorStuckFromWater"]}
is included.
{
"name": "X-Ray Climb",
"entranceCondition": {
"comeInWithDoorStuckSetup": {}
},
"requires": [
"canXRayClimb"
]
}
A comeInSpeedballing
entrance condition indicates that Samus must enter the room either in a speedball from the previous room, or in a process of running, jumping, or falling into a speedball. It has the following properties:
- runway: A runway geometry object describing the tiles available in the current room to complete the speedball. The end of this runway represents the point by which the speedball must be complete (i.e. when Samus must be morphed and on the ground with blue speed). A runway length of 0 would represent that the speedball must be completed before the transition.
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) needed while in speedball. This can be specified if something would prevent the strat from working at too low of a speed.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) needed while in speedball. This can be specified if something would prevent the strat from working at too high of a speed.
It is assumed that the runway in the current room is level or sloping up; adjustments would be needed to handle a case where it sloped down.
Note that a comeInSpeedballing
entrance condition can always be satisfied by coming into the room while already in a speedball. Therefore, a different entrance condition (e.g. comeInGettingBlueSpeed
or comeInBlueSpinning
) must be used if the strat specifically requires obtaining the speedball after entering the room (either by jumping through the transition, or by running through the transition and jumping afterward).
A comeInSpeedballing
entrance condition must match with one of the following conditions on the other side of the door: leaveWithRunway
, leaveSpinning
, leaveWithMockball
.
In every case, there is an implicit tech requirement of canSpeedball
. A match with a leaveWithRunway
comes with the following implicit requirements:
- A
speedBall
requirement based on the combined runway length. - If the previous door environment is water, then
Gravity
is required. - If the previous room is heated, then
heatFrames
are required based on the time needed. This can be calculated in the same way as forcomeInShinecharging
.
For leaveSpinning
and leaveWithMockball
, their blue
property must be either "yes" or "any", and there is an implicit getBlueSpeed
requirement based on the runway length in the exit condition.
A comeInWithTemporaryBlue
entrance condition indicates that Samus must come in by jumping through this door with temporary blue. It is applicable to horizontal and vertical transitions. It has the following property:
- direction: This takes three possible values "left", "right", and "any", indicating the direction that Samus must be facing through the transition. It should be specified for all vertical transitions but not horizontal ones.
A comeInWithTemporaryBlue
entrance condition must match with one of the following exit conditions on the other side of the door: leaveWithTemporaryBlue
, leaveWithRunway
:
- To match with a
leaveWithTemporaryBlue
, itsdirection
properties must equal that ofcomeInWithTemporaryBlue
, unless one of them is unspecified or "any". It has an implicit tech requirement ofcanTemporaryBlue
. - A match with
leaveWithRunway
comes with implicit requirements:- The tech
canTemporaryBlue
. - A
canShinecharge
requirement based on the runway length (including theSpeedBooster
item requirement). - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. The minimally required heat frames are calculated the same way as incomeInShinecharging
, except here there is no second runway to combine with. An extra{"heatFrames": 200}
is assumed for gaining temporary blue and leaving the room. - If the previous door environment is water, then
Gravity
is required.
- The tech
A comeInSpinning
entrance condition indicates that Samus must come in with a spin jump through the doorway, with speed in a certain range, applicable to horizontal transitions. It has the following properties:
- speedBooster: If true, then Speed Booster must be equipped while entering the room. If false, then Speed Booster must not be equipped. If "any", then Speed Booster may or may not be equipped.
- unusableTiles: For a runway connected to the door, the number of tiles before the door that are unusable for gaining speed, because of needing to jump.
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) needed. This only needs to be specified if something would prevent the strat from working at too low of a speed.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) needed. This only needs to be specified if something would prevent the strat from working at too high of a speed.
A comeInSpinning
entrance condition must match with a leaveSpinning
or leaveWithRunway
exit condition on the other side of the door.
- A match with
leaveSpinning
has the following requirements:- The
blue
property must be "no" or "any". - There must exist a possible value of extra run speed satisfying any applicable constraints, including any
minExtraRunSpeed
ormaxExtraRunSpeed
properties in the entrance condition and/or exit condition, and the effective runway length of theremoteRunway
in the exit condition (see the full run speed table). Note thatunusableTiles
is ignored in this case.
- The
- A match with
leaveWithRunway
has the following requirements:- There must exist a possible value of extra run speed satisfying any applicable constraints:
minExtraRunSpeed
ormaxExtraRunSpeed
in the entrance condition, and the effective runway length (withunusableTiles
subtracted) in the exit condition (see the full run speed table). - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. The minimally required heat frames are calculated the same way as incomeInRunning
, except here there is no second runway to combine with. TheunusableTiles
are ignored (i.e. not subtracted) for the purposes of determining heat frames, since heat damage is still taken during the jump. - If the previous door environment is water, then
Gravity
is required.
- There must exist a possible value of extra run speed satisfying any applicable constraints:
{
"name": "Come In Spinning",
"entranceCondtion": {
"comeInBlueSpinning": {
"unusableTiles": 2,
"minExtraRunSpeed": "$2.0"
}
},
"requires": []
}
A comeInBlueSpinning
entrance condition indicates that Samus must come in with a spin jump through the doorway, possibly while having blue speed, applicable to horizontal transitions. It has the following properties:
- unusableTiles: For a runway connected to the door, the number of tiles before the door that are unusable for gaining speed, because of needing to jump.
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) needed. This only needs to be specified if something would prevent the strat from working at too low of a speed.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) needed. This only needs to be specified if something would prevent the strat from working at too high of a speed.
A comeInBlueSpinning
entrance condition must match with a leaveSpinning
or leaveWithRunway
exit condition on the other side of the door.
- A match with
leaveSpinning
has the following requirements:- The
blue
property must be "yes" or "any". - A
SpeedBooster
requirement. - There must exist a possible value of extra run speed satisfying any applicable constraints, including any
minExtraRunSpeed
ormaxExtraRunSpeed
properties in the entrance condition and/or exit condition, along with implicit constraints based on shortcharge skill and the effective runway length of theremoteRunway
in the exit condition (see the blue run speed table). Note thatunusableTiles
is ignored in this case.
- The
- A match with
leaveWithRunway
has the following requirements:- There must exist a possible value of extra run speed satisfying any applicable constraints:
minExtraRunSpeed
ormaxExtraRunSpeed
in the entrance condition, along with implicit constraints based on shortcharge skill and the effective runway length (withunusableTiles
subtracted) in the exit condition (see the blue run speed table). - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. The minimally required heat frames are calculated the same way as incomeInShinecharging
, except here there is no second runway to combine with. TheunusableTiles
are ignored (i.e. not subtracted) for the purposes of determining heat frames, since heat damage is still taken during the jump. - If the previous door environment is water, then
Gravity
is required.
- There must exist a possible value of extra run speed satisfying any applicable constraints:
{
"name": "Come In Blue Spinning",
"entranceCondtion": {
"comeInBlueSpinning": {
"unusableTiles": 2
}
},
"requires": []
}
A comeInWithMockball
entrance condition indicates that Samus must roll into the room in a mockball with a certain amount of momentum, applicable to horizontal transitions. It has the following properties:
- speedBooster: If true, then Speed Booster must be equipped while entering the room. If false, then Speed Booster must not be equipped. If "any", then Speed Booster may or may not be equipped.
- adjacentMinTiles: This is the minimum effective runway length in case an adjacent runway (connected to the door) is used to gain speed, jump, and enter a mockball.
- remoteAndLandingMinTiles: When entering a mockball, it takes some time to accelerate up to full speed, which means that even when using a remote runway (i.e. one not connected to the door) to gain speed for the jump, the amount of landing space in front of the door still matters. Depending on the strat, different combinations of remote runway and landing lengths may work (e.g. with shorter landing lengths possibly requiring longer remote runways to compensate). This property is a list of pairs, where in each pair the first value gives a minimal remote runway used to gain speed, and the second value gives the corresponding minimal amount of landing tiles in front of the door usable to gain speed at the start of the mockball.
A comeInWithMockball
entrance condition must match with one of the following conditions on the other side of the door: leaveWithMockball
or leaveWithRunway
:
- A match with
leaveWithMockball
has the following requirements:- The
blue
property ofleaveWithMockball
must be "no" or "any". remoteAndLandingMinTiles
must contain at least one pair(minRemoteLength, minLandingLength)
such that the effective length of theremoteRunway
is at leastminRemoteLength
and the effective length of thelandingRunway
is at leastminLandingLength
.- The
canMockball
tech (includingMorph
item).
- The
- A match with
leaveWithRunway
has the following requirements:- The effective runway length must be at least
adjacentMinTiles
. - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. The minimally required heat frames are calculated the same way as forcomeInRunning
(andcomeInJumping
). - If the previous door environment is water, then
Gravity
is required. - The
canMockball
tech (includingMorph
item) is required.
- The effective runway length must be at least
{
"name": "Come In With Mockball",
"entranceCondtion": {
"comeInWithMockball": {
"adjacentMinTiles": 11,
"remoteAndLandingMinTiles": [[8, 2], [7, 3]]
}
},
"requires": []
}
A comeInWithSpringBallBounce
entrance condition indicates that Samus must enter the room by spring ball bouncing in from the previous room, applicable to horizontal transitions. It has the following properties:
- speedBooster: If true, then Speed Booster must be equipped while entering the room. If false, then Speed Booster must not be equipped. If "any", then Speed Booster may or may not be equipped.
- adjacentMinTiles: This is the minimum effective runway length in case an adjacent runway (connected to the door) is used to gain speed, jump, and bounce.
- remoteAndLandingMinTiles: A list of pairs, where in each pair the first value gives a minimal remote runway used to gain speed, and the second value gives the corresponding minimal amount of landing tiles in front of the door usable for the bounce.
-
movementType: This takes one of three possible values, "controlled", "uncontrolled", and "any", indicating the type of bounce that is required.
- "controlled" refers to movement type $12, which occurs when jumping using Spring Ball while rolling on the ground (e.g. from a mockball). In this state it is possible to control the height of each bounce by releasing jump.
- "uncontrolled" refers to movement type $13, which occurs when performing a lateral mid-air morph high enough that the morph animation completes before landing and bouncing. This state also occurs when rolling off of a ledge (e.g. after a mockball). In this state, Samus' horizontal speed will reach a slightly higher value, and without the need for a longer landing platform to accelerate on. However, it will not be possible to control the height of the bounce.
A comeInWithSpringBallBounce
entrance condition must match with a leaveWithSpringBallBounce
, leaveWithMockball
, or leaveWithRunway
on the other side of the door. The following requirement applies in every case:
- The
canSpringBallBounce
tech (includingMorph
andSpringBall
items) is implicitly required.
There are additional requirements depending on the exit condition:
- A match with
leaveWithSpringBallBounce
has the following additional requirements:- The
movementType
of the exit condition must equal that of the entrance condition, or one of them must be "any". - If the
movementType
of either the exit condition or entrance condition is "controlled", thencanMockball
is required. remoteAndLandingMinTiles
must contain at least one pair(minRemoteLength, minLandingLength)
such that the effective length of theremoteRunway
is at leastminRemoteLength
and the effective length of thelandingRunway
is at leastminLandingLength
.- The
blue
property of the exit condition must be "no" or "any".
- The
- A match with
leaveWithMockball
has the following requirements:- The
movementType
of the entrance condition must be "controlled" or "any". - The
canMockball
tech is required. remoteAndLandingMinTiles
must contain at least one pair(minRemoteLength, minLandingLength)
such that the effective length of theremoteRunway
is at leastminRemoteLength
and the effective length of thelandingRunway
is at leastminLandingLength
.- The
blue
property of the exit condition must be "no" or "any".
- The
- A match with
leaveWithRunway
has the following requirements:- The effective runway length must be at least
adjacentMinTiles
. - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. The minimally required heat frames are calculated the same way as forcomeInRunning
(andcomeInJumping
). - If the previous door environment is water, then
Gravity
is required. - The
canMockball
tech (includingMorph
item) is required.
- The effective runway length must be at least
{
"name": "Come In With Spring Ball Bounce",
"entranceCondition": {
"comeInWithSpringBallBounce": {
"remoteAndLandingMinTiles": [[4, 1]],
"movementType": "any"
}
},
"requires": [
"canCrossRoomJumpIntoWater"
]
}
A comeInWithBlueSpringBallBounce
entrance condition indicates that Samus must enter the room by spring ball bouncing in from the previous room, while having blue speed. This is applicable to horizontal transitions. It has the following properties:
- minExtraRunSpeed: The minimum extra run speed (as a hexadecimal string) needed. This only needs to be specified if something would prevent the strat from working at too low of a speed.
- maxExtraRunSpeed: The maximum extra run speed (as a hexadecimal string) needed. This only needs to be specified if something would prevent the strat from working at too high of a speed.
- minLandingTiles: The minimum effective length of landing runway in the other room which is needed to ensure the strat can work.
-
movementType: This takes one of three possible values, "controlled", "uncontrolled", and "any", indicating the type of bounce that is required.
- "controlled" refers to movement type $12, which occurs when jumping using Spring Ball while rolling on the ground (e.g. from a mockball). In this state it is possible to control the height of each bounce by releasing jump.
- "uncontrolled" refers to movement type $13, which occurs when performing a lateral mid-air morph high enough that the morph animation completes before landing and bouncing. This state also occurs when rolling off of a ledge (e.g. after a mockball). In this state, Samus' horizontal speed will reach a slightly higher value, and without the need for a longer landing platform to accelerate on. However, it will not be possible to control the height of the bounce.
A comeInWithBlueSpringBallBounce
entrance condition must match with a leaveWithSpringBallBounce
, leaveWithMockball
, or leaveWithRunway
on the other side of the door. The following requirement applies in every case:
- The
canSpringBallBounce
tech (includingMorph
andSpringBall
items). - The
Speedbooster
item. - There must exist a possible value of extra run speed satisfying any applicable constraints, including any
minExtraRunSpeed
ormaxExtraRunSpeed
properties in the entrance condition and/or exit condition, along with implicit constraints based on shortcharge skill and the effective runway length of the runway in the exit condition (see the blue run speed table).
There are additional requirements depending on the exit condition:
- A match with
leaveWithBlueSpringBallBounce
has the following additional requirements:- The
movementType
of the exit condition must equal that of the entrance condition, or one of them must be "any". - If the
movementType
of either the exit condition or entrance condition is "controlled", thencanSpeedball
is required. - The effective length of the
landingRunway
is at leastminLandingLength
(if specified). - The
blue
property of the exit condition must be "yes" or "any". - A
getBlueSpeed
requirement is included based on the remote runway length.
- The
- A match with
leaveWithMockball
has the following requirements:- The
movementType
of the entrance condition must be "controlled" or "any". - The
canSpeedball
tech is required. - The effective length of the
landingRunway
is at leastminLandingLength
(if specified). - The
blue
property of the exit condition must be "yes" or "any". - A
getBlueSpeed
requirement is included based on the remote runway length.
- The
- A match with
leaveWithRunway
has the following requirements:- A
speedBall
requirement is included based on the runway length minusminLandingLength
, except that thecanSpeedball
tech requirement is only included if themovementType
of the entrance condition is "controlled". - If the previous room is heated, then
heatFrames
are included based on the time spent running in that room. The minimally required heat frames can be approximately calculated in the same way as forcomeInGettingBlueSpeed
. - If the previous door environment is water, then
Gravity
is required.
- A
{
"name": "Come In With Blue Spring Ball Bounce",
"entranceCondition": {
"comeInWithBlueSpringBallBounce": {
"remoteAndLandingMinTiles": [[15, 1]],
"movementType": "controlled"
}
},
"requires": []
}
A comeInWithStoredFallSpeed
entrance condition represents that Samus can enter through this door with stored fall speed.
The comeInWithStoredFallSpeed
object has a single property:
- fallSpeedInTiles: The number of tiles Samus would clip through by Moonfalling on top of a solid floor.
A comeInWithStoredFallSpeed
entrance condition must match with a leaveWithStoredFallSpeed
condition on the other side of the door. The comeInWithStoredFallSpeed
can lead to another leaveWithStoredFallSpeed
so long as the stored speed is not lost. For this to happen, both doors must be connected by one Runway
, and Samus must not Crouch or become Knocked back. A strat with a comeInWithStoredFallSpeed
condition should only include requirements needed to position Samus for the clip.
Note: There is an implicit canMoonfall
requirement on strats which have the comeInWithStoredFallSpeed
condition as a means of using the stored fall speed.
{
"name": "Stored Fall Speed Clip",
"entranceCondtion": {
"comeInWithStoredFallSpeed": {
"fallSpeedInTiles": 1
}
},
"requires": []
}
A comeInWithRMode
entrance condition indicates that Samus must obtain R-mode while coming through this door.
A comeInWithRMode
object does not have any properties.
A comeInWithRMode
entrance condition must match with a leaveWithGModeSetup
entrance condition on the other side of the door. It comes with the following implicit requirements:
- The tech requirement
canEnterRMode
. - The
XRayScope
item requirement. - A requirement to have at least 1 reserve energy.
- A requirement to damage down to 0 energy, triggering reserves (causing the reserve energy to become zero and the regular energy to become what the reserve energy was).
{
"name": "R-Mode Frozen Beetom X-Ray Climb",
"entranceCondition": {
"comeInWithRMode": {}
},
"requires": [
"canWalljump",
{"enemyDamage": {
"enemy": "Beetom",
"type": "contact",
"hits": 1
}},
{"enemyDamage": {
"enemy": "Ripper",
"type": "contact",
"hits": 1
}},
"canWallIceClip",
"canXRayClimb"
]
}
A comeInWithGMode
entrance condition indicates that Samus must have or obtain G-mode (direct or indirect) while coming through this door.
A comeInWithGMode
object has the following properties:
- mode: Takes one of three possible values, "direct", "indirect", or "any", indicating whether Samus must enter in direct G-mode, indirect G-mode, or either. Direct G-mode is the state obtained when G-mode is first entered (i.e., the next room after the G-mode setup is performed), while indirect G-mode is the state after passing a door transition with G-mode (usually back into the room where the G-mode setup was performed).
- morphed: A boolean indicating whether Samus must enter the room in a morphed state. This can be satisfied by obtaining or already being in an artificially morphed state, or by having collected the Morph item.
- mobility: Takes one of three possible values, "mobile", "immobile", or "any", indicating whether or not Samus is required to be mobile (or immobile) after entering the room. The default value is "any". When entering with indirect G-mode, Samus is always mobile. With direct G-mode, Samus can be mobile if she takes knockback through the door transition and the reserve energy is low enough (<= 4 energy) so that knockback frames do not expire until after reserves finish filling.
A comeInWithGMode
entrance condition must match with either a leaveWithGModeSetup
or leaveWithGMode
entrance condition on the other side of the door:
- If
mode
is "direct", then it can only match with aleaveWithGModeSetup
. Ifmode
is "indirect", then it can only match with aleaveWithGMode
.
When matching with a leaveWithGModeSetup
, a comeInWithGMode
has implicit requirements:
- The tech requirement
canEnterGMode
. - The
XRayScope
item requirement. - A requirement to have at least 1 reserve energy.
- A requirement to damage down to 0 energy, triggering reserves (causing the reserve energy to become zero and the regular energy to become what the reserve energy was).
- The requirement
{"or": ["Morph", "canArtificialMorph"]}
, if themorphed
property ofcomeInWithGMode
is true. - The Toilet must not come between the room with the
leaveWithGModeSetup
and thecomeInWithGMode
, because obtaining direct G-mode in the Toilet is not possible, due to Samus not having an ability to use X-Ray while entering the room. - Requirements for regaining mobility (there may be multiple options here, and they should be treated either as separate strats or the requirements should be joined as though with an
or
):- G-mode mobile: Samus uses the knockback from the previous room to retain mobility. Here the
knockback
property of theleaveWithGModeSetup
must be true, and reserve energy is assumed to have been drained to at most 4 before doing the strat. - G-mode immobile: Samus uses knockback from a hit in the current room to regain mobility. The possibility of doing this is indicated by the presence of a strat with a
gModeRegainMobility
property withfrom
andto
node matching entrance/door node of the current strat (thefrom
node of the strat withcomeInWithGMode
). Any requirements of thegModeRegainMobility
strat should be included as requirements to execute the current strat; it is important that these requirements be applied after the requirement to damage down to 0 energy and trigger reserves. If there are multiple suchgModeRegainMobility
strats, then these should be treated as multiple options.
- G-mode mobile: Samus uses the knockback from the previous room to retain mobility. Here the
When matching with a leaveWithGMode
, a comeInWithGMode
has an implicit requirement in one scenario:
- If
morphed
property ofcomeInWithGMode
is true but a matchingleaveWithGMode
hasmorphed
false, then theMorph
item is implicitly required.
Example:
{
"name": "G-Mode Morph",
"entranceCondition": {
"comeInWithGMode": {
"mode": "any",
"morphed": true
}
},
"requires": []
}
A comeInWithWallJumpBelow
entrance condition indicates that Samus must come up through this door with momentum by wall-jumping in the door frame below.
A comeInWithWallJumpBelow
object has the following property:
- minHeight: Minimum height of door frame (tiles below the transition tiles) that will satisfy the condition.
A comeInWithWallJumpBelow
entrance condition must match with a leaveWithDoorFrameBelow
exit condition on the other side of the door:
- A match is valid provided the
height
property on theleaveWithDoorFrameBelow
is at least as large as theminHeight
property on thecomeInWithWallJumpBelow
.
A comeInWithWallJumpBelow
implicitly includes a canWalljump
tech requirement.
Example:
{
"name": "Cross Room Jump - Wall Jump",
"entranceCondition": {
"comeInWithWallJumpBelow": {
"minHeight": 2
}
},
"requires": [
"canCrossRoomJumpIntoWater"
]
}
A comeInWithSpaceJumpBelow
entrance condition indicates that Samus must come up through this door with momentum by using Space Jump in the door frame below. It has no properties.
A comeInWithSpaceJumpBelow
entrance condition must match with a leaveWithDoorFrameBelow
exit condition on the other side of the door.
A comeInWithSpaceJumpBelow
implicitly includes a SpaceJump
item requirement. If the room below is heated, then a requirement of {"heatFrames": 30}
is implicitly included.
Example:
{
"name": "Cross Room Jump - Space Jump",
"entranceCondition": {
"comeInWithSpaceJumpBelow": {}
},
"requires": [
"canCrossRoomJumpIntoWater"
]
}
A comeInWithPlatformBelow
entrance condition indicates that Samus must come up through this door with momentum by jumping from a platform below, possibly with run speed. It has the following properties:
- minHeight: Minimum height of the platform below that can satisfy this condition. It expresses that the platform must be positioned at least a certain distance below the door transition (in tiles, not including the transition tiles or platform tiles).
- maxHeight: Maximum height of the platform below that can satisfy this condition. It expresses that the platform must be positioned at most a certain distance below the door transition.
- maxLeftPosition: Maximum value of "leftPosition" of the platform below that can satisfy this condition. It expresses that the platform extends at least a certain distance to the left (in tiles, relative to the center of the door, with negative values indicating a position to the left of the door center).
- minRightPosition: Minimum value of "rightPosition" of the platform below that can satisfy this condition. It expresses that the platform extends at least a certain distance to the right (in tiles, relative to the center of the door, with negative values indicating a position to the left of the door center).
A comeInWithPlatformBelow
entrance condition must match with a leaveWithPlatformBelow
exit condition on the other side of the door. A match is valid provided the height
, leftPosition
, and rightPosition
properties on the leaveWithDoorFrameBelow
satisfy all applicable constraints indicated by properties in the comeInWithPlatformBelow
:
A comeInWithPlatformBelow
entrance condition has no implicit requirements.
Example:
{
"name": "Cross Room Jump - Standing Jump",
"entranceCondition": {
"comeInWithPlatformBelow": {
"minHeight": 6,
"maxHeight": 6,
"maxLeftPosition": 1,
"minRightPosition": 2
}
},
"requires": [
"canCrossRoomJumpIntoWater"
]
}
A comeInWithGrappleSwing
entrance condition represents that Samus must come in through this door by swinging using Grapple, allowing Samus to carry momentum and possibly the ability to grapple jump in the current room. This can apply to horizontal doors or to bottom vertical doors.
A comeInWithGrappleSwing
object has the following properties:
- blocks: An array of block objects, each described a specific block that Samus could use to swing out of the previous room. Each block object has the following properties:
- position: Tile coordinates of blocks that Samus could be grappled to, to swing out of the room. Coordinates
[x, y]
are represented as tile counts with[0, 0]
representing the top-left corner of the screen containing the door transition. - environment: A string "air" or "water" indicating the environment Samus will be in when using this block to swing out of the room. The default is "air".
- obstructions: An array of coordinates of blocks that Samus must avoid while swinging out of the room. By default this is an empty array.
- position: Tile coordinates of blocks that Samus could be grappled to, to swing out of the room. Coordinates
A comeInWithGrappleSwing
entrance condition matches with a leaveWithGrappleSwing
exit condition if they share a common block object, having equality across all three fields position
, environment
, and obstructions
.
A comeInWithGrappleSwing
implicitly comes with a canPreciseGrapple
requirement, which includes the Grapple item requirement. If a mid-air morph or grapple jump is required, it would need to be specified explicitly in the requires
of this strat or the matching strat in the other room.
{
"name": "Grapple Jump",
"entranceCondition": {
"comeInWithGrappleSwing": {
"blocks": [
{"position": [-1, 5], "environment": "water", "note": "Mt. Everest"},
{"position": [8, 3], "note": "Grapple Beam Room"},
{"position": [7, 3], "note": "Colosseum"}
]
}
},
"requires": [
"canGrappleJump"
]
}```
## Come In With Grapple Jump
A `comeInWithGrappleJump` entrance condition represents that Samus must enter by grapple jumping vertically up through this door, with no horizontal momentum.
A `comeWithGrappleJump` object has the following property:
- _position_: This takes one of three possible values, "left", "right", or "any". The value "left" represents that Samus must enter while positioned within the left-most tile of the doorway. The value "right" represents that Samus must enter while positioned within the right-most tile of the doorway. The value "any" represents that Samus can enter in either a left or right position.
A `comeInWithGrappleJump` implicitly comes with a `canGrappleJump` tech requirement, which includes the Grapple and Morph item requirements.
#### Example
```json
{
"name": "Grapple Jump",
"entranceCondition": {
"comeInWithGrappleJump": {
"position": "right"
}
},
"requires": []
}
A comeInWithGrappleTeleport
entrance condition represents that Samus must come into the room while grappling, teleporting Samus to a position in this room corresponding to the location of the (grapple) block in the other room.
A comeInWithGrappleTeleport
object has the following property:
- blockPositions: A list of tile coordinates of (grapple) blocks that Samus could be grappled to while exiting the other room. Coordinates
[x, y]
are represented as tile counts with[0, 0]
representing the top-left corner of the room.
A comeInWithGrappleTeleport
comes with an implicit tech requirement canGrappleTeleport
.
{
"name": "Come in With Grapple Teleport",
"requires": [],
"exitCondition": {
"leaveWithGrappleTeleport": {
"blockPositions": [[5, 3]]
}
}
}
A comeInWithSamusEaterTeleport
entrance condition represents that Samus must come into the room immediately after teleporting Samus to a Samus Eater in the other room, causing Samus to be placed in a different position in the current room.
A comeInWithSamusEaterTeleport
object has the following properties:
- floorPositions: A list of screen-local tile coordinates of floor Samus Eaters that can work for this strat, matching with an entry of the corresponding
floorPositions
in theleaveWithSamusEaterTeleport
strat in the other room. - ceilingPositions: A list of screen-local tile coordinates of ceiling Samus Eaters that can work for this strat, matching with an entry of the corresponding
ceilingPositions
in theleaveWithSamusEaterTeleport
strat in the other room.
A comeInWithSamusEaterTeleport
comes with an implicit tech requirement canSamusEaterTeleport
.
{
"link": [5, 13],
"name": "Samus Eater Teleport",
"entranceCondition": {
"comeInWithSamusEaterTeleport": {
"floorPositions": [[12, 13], [14, 13], [15, 13]],
"ceilingPositions": []
}
},
"requires": [
"Morph"
]
}
Inside an entranceCondition
object, a comesThroughToilet
property indicates if the strat is applicable when the Toilet comes between this room and the other room (one with a matching exitCondition
). This property should be specified on every strat having an entranceCondition
through a vertical transition. It has three possible values:
- "yes": The strat is applicable only if the Toilet comes between this room and the other room.
- "no": The strat is applicable only if the Toilet does not come between this room and the other room.
- "any": The strat is applicable regardless of whether the Toilet comes between this room and the other room.
{
"name": "Cross Room Jump - Toilet HiJump Wall Jump",
"entranceCondition": {
"comeInWithWallJumpBelow": {
"minHeight": 2
},
"comesThroughToilet": "yes"
},
"requires": [
"canCrossRoomJumpIntoWater",
"HiJump",
"canPreciseWalljump",
"canDownGrab"
]
}
A gModeRegainMobility
property on a strat indicates that the strat allows Samus to regain mobility (by taking knockback from an enemy) after entering with G-mode immobile. In all strats with a gModeRegainMobility
property, the from
node of the strat must be the same as the to
node and must be a door or entrance node. A strat with gModeRegainMobility
should normally include an enemyDamage
requirement in its requires
.
A gModeRegainMobility
object has no properties.
{
"name": "G-Mode Regain Mobility",
"requires": [
"h_ZebesIsAwake",
{"enemyDamage": {
"enemy": "Geemer (blue)",
"type": "contact",
"hits": 1
}}
],
"gModeRegainMobility": {}
}
A bypassesDoorShell
property on a strat indicates that Samus can leave through the door transition in the to
node
without first unlocking or opening the door. For this to be valid, the to
node must have "nodeType": "door"
. This can be used even for doors that are easy to open (e.g. blue doors), to support randomizers that may alter door colors. A strat with "bypassesDoorShell": true
may also have an exit condition, but it is not required to have one.
A strat with "bypassesDoorShell": true
has an implicit tech requirement of canSkipDoorLock
.
{
"name": "Bypass Door Shell",
"requires": [
"canWallIceClip"
],
"bypassesDoorShell": true
}
An unlocksDoors
array lists possibilities of doors that can be unlocked as part of executing this strat. The objects in the array have the following properties:
- nodeId: The node ID of the door that can be unlocked. If unspecified, it is assumed to be the destination node of the strat.
- types: A list of door unlock types, among "missiles", "super", "powerbomb", "gray", "gadoraMissiles" and "gadoraSuper":
- "missiles": A door which can be opened using 5 Missiles, e.g. red doors.
- "super": A door which can be opened using a single Super, e.g. red or green doors.
- "powerbomb": A door which can be opened using a single Power Bomb, e.g. a yellow door.
- "ammo": A door which can be opened with ammo. This is a shorthand for ["missiles", "super", "powerbomb"].
- "gadoraMissiles": A gadora eye door which is opened using 3 Missiles.
- "gadoraSuper": A gadora eye door which is opened using a single Super.
- requires: A list of additional logical requirements which must be satisfied in order for the door to be unlocked using this strat.
- useImplicitRequires: A boolean, true by default, indicating whether standard requirements should be implicitly appended to the
requires
in this object. This can be set this to false if the standard requirements are already accounted for in the stratrequires
, for example if the strat involves using a Power Bomb which would already unlock the door as a side effect, or if it uses a Super as a hero shot to open the door. If this property is set to true, the implicit standard requirements are based on the door type, as follows:- For "missiles", the implicit requirement is
{"ammo": {"type": "Missile", "count": 5}}
. - For "super", the implicit requirement is
{"ammo": {"type": "Super", "count": 1}}
. - For "powerbomb", the implicit requirement is
h_canUsePowerBombs
. - For "gadoraMissiles", the implicit requirement is
{"ammo": {"type": "Missile", "count": 3}}
. - For "gadoraSuper", the implicit requirement is
{"ammo": {"type": "Super", "count": 1}}
.
- For "missiles", the implicit requirement is
In general the requires
in an unlocksDoors
object do not need to be satisfied in order to perform the strat; if satisfied, they provide a way to unlock the door. However, if the strat has a doorUnlockedAtNode
requirement and the door is locked, then these requirements become part of the strat requirements; this applies, in particular, if the strat has an exit condition, in which case there is an implicit doorUnlockedAtNode
requirement on the destination door except if bypassesDoorShell
is set to true
.
If an unlocksDoors
property is not specified, then it is assumed to be an empty array. If a strat has any doorUnlockedAtNode
requirements (including an implicit one based on having an exit condition without a bypassesDoorShell
), then the unlocksDoors
property should be specified explicitly and include items for each of the three possible types "missiles", "super", and "powerbomb" (or the catch-all "any") for each applicable node. The only exception is if the strat has no entrance condition then the starting node of the strat does not need to be included in the unlocksDoors
property; in this case, the door could be unlocked immediately prior to the strat being executed (e.g. by an implicit unlock strat; see below), so generally it would not be necessary to describe how to unlock it as part of the strat. Where applicable, cases should be included for all three main types of door unlock methods, "missiles", "super", and "powerbomb" (or using "ammo" as a catch-all), in order to support randomizers which may modify the door colors. Currently the inclusion of "gadoraMissiles" and "gadoraSuper" are optional, and cross-room strats going through them are not usable unless the door has previously been unlocked.
When using this data to support vanilla door colors, which are specified by their nodeSubType
, the door is required to be unlocked with an unlocksDoors
object if and only if there is no locks
property with a lockType
of coloredDoor
specified; otherwise the strats included in the locks
should be used.
By default every door node has an implicit strat from the node to itself, for unlocking the door in a standard way. In an unheated room, this implicit strat has an unlocksDoors
of the following form:
{
"link": [1, 1],
"name": "Unlock Door",
"requires": [],
"unlocksDoors": [
{"types": ["ammo"], "requires": []},
{"types": ["gadoraMissiles"], "requires": []},
{"types": ["gadoraSuper"], "requires": []}
]
}
In a heated room, it instead has the form:
{
"link": [1, 1],
"name": "Unlock Door",
"requires": [],
"unlocksDoors": [
{"types": ["missiles"], "requires": [{"heatFrames": 50}]},
{"types": ["super"], "requires": []},
{"types": ["powerbomb"], "requires": [{"heatFrames": 110}]},
{"types": ["gadoraMissiles"], "requires": [{"heatFrames": 300}]},
{"types": ["gadoraSuper"], "requires": [{"heatFrames": 100}]}
]
}
The implicit unlock strats can be disabled by setting the node property useImplicitDoorUnlocks
to false.
A collectsItems
array lists the node IDs (within the room) of items that become collected (if not already collected) as part of executing this strat. This can be useful, for example, for strats that use G-mode to "remote acquire" items at a location different from the item node.
For items collected in this way, the locks
property of the item node plays no role, so the strat requires
must include any necessary requirements to ensure the item has spawned.
{
"link": [1, 2],
"name": "G-Mode Remote Acquire Item",
"requires": [],
"collectsItems": [3]
}
A setsFlags
array lists the names of game flags that become set (if not already set) as part of executing this strat.
{
"link": [5, 6],
"name": "Break the Tube",
"requires": [
"h_canUsePowerBombs"
],
"setsFlags": ["f_MaridiaTubeBroken"]
}
The startsWithShineCharge
property indicates that a strat must start while in a shinecharge state, from a shinecharge obtained in an earlier strat. The amount of frames required is determined by shineChargeFrames
requirements in this strat. A strat with "startsWithShineCharge": true
is only logically valid if it immediately follows a strat with "endsWithShineCharge": true
.
This property should not be combined with a comeInShinecharged
entrance condition.
The endsWithShineCharge
property indicates that a strat ends while in a shinecharge state, allowing a shinespark to be used in a subsequent strat. The amount of frames remaining is determined by shineChargeFrames
requirements coming after the most recent canShineCharge
requirement.
This property should not be combined with a leaveShinecharged
exit condition.
By default, door nodes come with implicit strats for entering and exiting the room through the door. These implicit strats can individually be disabled by setting certain node properties, as described below in detail for each kind of implicit strat. Disabling an implicit strat can make sense if enemies or other hazards are near the door, making the door not free to use.
In this section, a door node refers to a node with "nodeType": "door"
. Likewise, an entrance node refers to a node with "nodeType": "entrance"
, and an exit node refers to a node with "nodeType": "exit"
.
By default every door node and exit node has an implicit strat from the node to itself, for exiting the room in a standard way. This implicit strat has a leaveNormally
exit condition and is of the following form:
{
"link": [1, 1],
"name": "Leave Normally",
"requires": [],
"exitCondition": {
"leaveNormally": {}
}
}
This implicit strat can be disabled by setting the node property "useImplicitLeaveNormally": false
.
With certain exceptions described below, by default every door node and entrance node has an implicit strat from the node to itself, for entering the room in a standard way. This implicit strat has a comeInNormally
entrance condition and is of the following form:
{
"link": [1, 1],
"name": "Come In Normally",
"entranceCondition": {
"comeInNormally": {}
},
"requires": []
}
This implicit strat can be disabled by setting the node property "useImplicitComeInNormally": false
.
With certain exceptions described below, by default every horizontal door node has an implicit strat from the node to itself, for entering the room through the door while in a mockball (or speedball). This implicit strat has a comeInWithMockball
entrance condition. In unheated rooms, it has the following form:
{
"link": [1, 1],
"name": "Come In With Mockball",
"entranceCondition": {
"comeInWithMockball": {
"adjacentMinTiles": 0,
"remoteAndLandingMinTiles": [[0, 0]],
"speedBooster": "any"
}
},
"requires": []
}
In heated rooms it instead has this form:
{
"link": [1, 1],
"name": "Come In With Mockball",
"entranceCondition": {
"comeInWithMockball": {
"adjacentMinTiles": 0,
"remoteAndLandingMinTiles": [[0, 0]],
"speedBooster": "any"
}
},
"requires": [
{"heatFrames": 10}
]
}
This implicit strat is to cover cases where leaving with a mockball may be desirable or unavoidable in the previous room, but where the mockball may be unhelpful in the current room. The 10 heat frames are to cover the time potentially needed to stop and unmorph after entering the room.
This implicit strat can be disabled by setting the node property "useImplicitComeInWithMockball": false
.
With certain exceptions described below, by default every door node has an implicit strat from the node to itself, for entering the room in direct G-mode through the door and then walking back out through the open doorway while still in G-mode. This implicit strat has a comeInWithGMode
entrance condition and a leaveWithGMode
exit condition and is of the following form:
{
"link": [1, 1],
"name": "Carry G-Mode Back Through",
"entranceCondition": {
"comeInWithGMode": {
"mode": "direct",
"morphed": false
}
},
"requires": [],
"exitCondition": {
"leaveWithGMode": {
"morphed": false
}
}
}
Note that if there are strats from this door node to itself with "gModeRegainMobility": true
, then using those strats to regain mobility are considered to be an option as part of this implicit strat, the same as with other strats having a comeInWithGMode
entrance condition.
This implicit strat can be disabled by setting the node property "useImplicitCarryGModeBackThrough": false
.
If the node has "isDoorImmediatelyClosed": true
, then this implicit strat is disabled unless the node is explicitly marked as "useImplicitCarryGModeBackThrough": true
.
With certain exceptions described below, by default every door node has an implicit strat from the node to itself, for entering the room in direct G-mode and then going back out through the open doorway while still morphed in G-mode.
This implicit strat has a comeInWithGMode
entrance condition and a leaveWithGMode
exit condition and is of the following form:
{
"link": [1, 1],
"name": "Carry G-Mode Morph Back Through",
"entranceCondition": {
"comeInWithGMode": {
"mode": "direct",
"morphed": true
}
},
"requires": [],
"exitCondition": {
"leaveWithGMode": {
"morphed": true
}
}
}
As with other comeInWithGMode
strats having "morphed": true
, it is assumed here that Samus morphs by either using the Morph item or by obtaining artificial morph. Also note that if there are strats from this door node to itself with "gModeRegainMobility": true
, then using those strats to regain mobility are considered to be an option as part of this implicit strat, again the same as with other strats having a comeInWithGMode
entrance condition.
This implicit strat can be disabled by setting the node property "useImplicitCarryGModeMorphBackThrough": false
.
If the node has "isDoorImmediatelyClosed": true
, or if the node is a vertical door in bottom position (leading up), then this implicit strat is disabled unless the node is explicitly marked as "useImplicitCarryGModeMorphBackThrough": true
. Note that the exception about the node being a door in bottom position differs from unmorphed implicit strats for carrying G-mode back through a door, described in the previous section, which have no such exception.
By default every bottom vertical door node has an implicit strat from the node to itself, for entering the room through the door while grapple jumping. This implicit strat has a comeInWithGrappleJump
entrance condition. It has the following form:
{
"link": [1, 1],
"name": "Come In With Grapple Jump",
"entranceCondition": {
"comeInWithGrappleJump": {
"position": "any"
}
},
"requires": []
}
This implicit strat is to avoid the need to create duplicate copies of strats that leave through a vertical door by grapple jumping. This way the same strat can be used to either continue grapple jumping in the next room, or stop after reaching the door.
This implicit strat can be disabled by setting the node property "useImplicitComeInWithGrappleJump": false
.
There are many kinds of cross-room strats that require Samus to enter the room with a certain amount of speed. For easier interpretation, these requirements are usually specified in terms of runway tiles required. In certain situations, however, it is necessary to directly reference speed values. There are several types of Samus horizontal speed:
- Base speed: This gradually increases from to $0.0 to $2.C over the first 11 frames of Samus beginning walking or running. It gradually decreases to $0.0 when stopping holding forward while walking/running. Base speed will change in certain ways when Samus jumps, breaks spin, morphs, or performs other actions.
- Extra run speed: This increases by $0.1 for each frame that dash is held while running. With Speed Booster it reaches a maximum value of $7.0, while without Speed Booster it reaches a maximum value of $2.0. When stopping holding forward while walking/running, the extra run speed is immediately converted into base speed, i.e., base speed is increased by the value of the extra run speed, while the extra run speed immediately becomes zero. Other actions will either leave the extra run speed unchanged (e.g., jumping, breaking spin with jump held, or performing an airball or mockball) or immediately set it to zero (e.g., turning around, or breaking spin without jump held).
- Combined run speed: This is the total of base speed and extra run speed, and represents the actual amount that Samus will move horizontally.
All these speed values are measured in pixels (and subpixels) per frame. Since extra run speed remains stable through various movement actions, it is generally the more useful quantity to reference in cross-room strats. The following table shows how Samus' relative position and horizontal speeds change while running, starting from a stand, with dash held the entire time, with Speedbooster equipped. The initial vertical speed when jumping is also shown (both without and with HiJump, and in air vs. water environments).
Frame | Position | Base Speed | Extra Run Speed | Jump | HiJump | Water Jump | Water HiJump |
---|---|---|---|---|---|---|---|
0 | $0.0 | $0.0 | $0.0 | $4.E | $6.0 | $1.C | $2.8 |
1 | $1.0 | $0.0 | $0.0 | $4.E | $6.0 | $1.C | $2.8 |
2 | $1.4 | $0.3 | $0.1 | $4.F | $6.1 | $1.D | $2.9 |
3 | $1.C | $0.6 | $0.2 | $4.0 | $6.2 | $1.E | $2.A |
4 | $2.8 | $0.9 | $0.3 | $4.1 | $6.3 | $1.F | $2.B |
5 | $3.8 | $0.C | $0.4 | $4.2 | $6.4 | $1.0 | $2.C |
6 | $4.C | $0.F | $0.5 | $4.3 | $6.5 | $1.1 | $2.D |
7 | $6.4 | $1.2 | $0.6 | $4.4 | $6.6 | $1.2 | $2.E |
8 | $8.0 | $1.5 | $0.7 | $4.5 | $6.7 | $1.3 | $2.F |
9 | $A.0 | $1.8 | $0.8 | $4.6 | $6.8 | $1.4 | $2.0 |
10 | $C.4 | $1.B | $0.9 | $4.7 | $6.9 | $1.5 | $2.1 |
11 | $E.C | $1.E | $0.A | $4.8 | $6.A | $1.6 | $2.2 |
12 | $12.3 | $2.C | $0.B | $4.9 | $6.B | $1.7 | $2.3 |
13 | $15.B | $2.C | $0.C | $4.A | $6.C | $1.8 | $2.4 |
14 | $19.4 | $2.C | $0.D | $4.B | $6.D | $1.9 | $2.5 |
15 | $1C.E | $2.C | $0.E | $4.C | $6.E | $1.A | $2.6 |
16 | $20.9 | $2.C | $0.F | $4.D | $6.F | $1.B | $2.7 |
17 | $24.5 | $2.C | $1.0 | $4.E | $6.0 | $1.C | $2.8 |
18 | $28.2 | $2.C | $1.1 | $4.F | $6.1 | $1.D | $2.9 |
19 | $2C.0 | $2.C | $1.2 | $4.0 | $6.2 | $1.E | $2.A |
20 | $2F.F | $2.C | $1.3 | $4.1 | $6.3 | $1.F | $2.B |
21 | $33.F | $2.C | $1.4 | $4.2 | $6.4 | $1.0 | $2.C |
22 | $38.0 | $2.C | $1.5 | $4.3 | $6.5 | $1.1 | $2.D |
23 | $3C.2 | $2.C | $1.6 | $4.4 | $6.6 | $1.2 | $2.E |
24 | $40.5 | $2.C | $1.7 | $4.5 | $6.7 | $1.3 | $2.F |
25 | $44.9 | $2.C | $1.8 | $4.6 | $6.8 | $1.4 | $2.0 |
26 | $48.E | $2.C | $1.9 | $4.7 | $6.9 | $1.5 | $2.1 |
27 | $4D.4 | $2.C | $1.A | $4.8 | $6.A | $1.6 | $2.2 |
28 | $51.B | $2.C | $1.B | $4.9 | $6.B | $1.7 | $2.3 |
29 | $56.3 | $2.C | $1.C | $4.A | $6.C | $1.8 | $2.4 |
30 | $5A.C | $2.C | $1.D | $4.B | $6.D | $1.9 | $2.5 |
31 | $5F.6 | $2.C | $1.E | $4.C | $6.E | $1.A | $2.6 |
32 | $64.1 | $2.C | $1.F | $4.D | $6.F | $1.B | $2.7 |
33 | $68.D | $2.C | $2.0 | $5.E | $7.0 | $2.C | $3.8 |
34 | $6D.A | $2.C | $2.1 | $5.F | $7.1 | $2.D | $3.9 |
35 | $72.8 | $2.C | $2.2 | $5.0 | $7.2 | $2.E | $3.A |
36 | $77.7 | $2.C | $2.3 | $5.1 | $7.3 | $2.F | $3.B |
37 | $7C.7 | $2.C | $2.4 | $5.2 | $7.4 | $2.0 | $3.C |
38 | $81.8 | $2.C | $2.5 | $5.3 | $7.5 | $2.1 | $3.D |
39 | $86.A | $2.C | $2.6 | $5.4 | $7.6 | $2.2 | $3.E |
40 | $8B.D | $2.C | $2.7 | $5.5 | $7.7 | $2.3 | $3.F |
41 | $91.1 | $2.C | $2.8 | $5.6 | $7.8 | $2.4 | $3.0 |
42 | $96.6 | $2.C | $2.9 | $5.7 | $7.9 | $2.5 | $3.1 |
43 | $9B.C | $2.C | $2.A | $5.8 | $7.A | $2.6 | $3.2 |
44 | $A1.3 | $2.C | $2.B | $5.9 | $7.B | $2.7 | $3.3 |
45 | $A6.B | $2.C | $2.C | $5.A | $7.C | $2.8 | $3.4 |
46 | $AC.4 | $2.C | $2.D | $5.B | $7.D | $2.9 | $3.5 |
47 | $B1.E | $2.C | $2.E | $5.C | $7.E | $2.A | $3.6 |
48 | $B7.9 | $2.C | $2.F | $5.D | $7.F | $2.B | $3.7 |
49 | $BD.5 | $2.C | $3.0 | $5.E | $7.0 | $2.C | $3.8 |
50 | $C3.2 | $2.C | $3.1 | $5.F | $7.1 | $2.D | $3.9 |
51 | $C9.0 | $2.C | $3.2 | $5.0 | $7.2 | $2.E | $3.A |
52 | $CE.F | $2.C | $3.3 | $5.1 | $7.3 | $2.F | $3.B |
53 | $D4.F | $2.C | $3.4 | $5.2 | $7.4 | $2.0 | $3.C |
54 | $DB.0 | $2.C | $3.5 | $5.3 | $7.5 | $2.1 | $3.D |
55 | $E1.2 | $2.C | $3.6 | $5.4 | $7.6 | $2.2 | $3.E |
56 | $E7.5 | $2.C | $3.7 | $5.5 | $7.7 | $2.3 | $3.F |
57 | $ED.9 | $2.C | $3.8 | $5.6 | $7.8 | $2.4 | $3.0 |
58 | $F3.E | $2.C | $3.9 | $5.7 | $7.9 | $2.5 | $3.1 |
59 | $FA.4 | $2.C | $3.A | $5.8 | $7.A | $2.6 | $3.2 |
60 | $100.B | $2.C | $3.B | $5.9 | $7.B | $2.7 | $3.3 |
61 | $107.3 | $2.C | $3.C | $5.A | $7.C | $2.8 | $3.4 |
62 | $10D.C | $2.C | $3.D | $5.B | $7.D | $2.9 | $3.5 |
63 | $114.6 | $2.C | $3.E | $5.C | $7.E | $2.A | $3.6 |
64 | $11B.1 | $2.C | $3.F | $5.D | $7.F | $2.B | $3.7 |
65 | $121.D | $2.C | $4.0 | $6.E | $8.0 | $3.C | $4.8 |
66 | $128.A | $2.C | $4.1 | $6.F | $8.1 | $3.D | $4.9 |
67 | $12F.8 | $2.C | $4.2 | $6.0 | $8.2 | $3.E | $4.A |
68 | $136.7 | $2.C | $4.3 | $6.1 | $8.3 | $3.F | $4.B |
69 | $13D.7 | $2.C | $4.4 | $6.2 | $8.4 | $3.0 | $4.C |
70 | $144.8 | $2.C | $4.5 | $6.3 | $8.5 | $3.1 | $4.D |
71 | $14B.A | $2.C | $4.6 | $6.4 | $8.6 | $3.2 | $4.E |
72 | $152.D | $2.C | $4.7 | $6.5 | $8.7 | $3.3 | $4.F |
73 | $15A.1 | $2.C | $4.8 | $6.6 | $8.8 | $3.4 | $4.0 |
74 | $161.6 | $2.C | $4.9 | $6.7 | $8.9 | $3.5 | $4.1 |
75 | $168.C | $2.C | $4.A | $6.8 | $8.A | $3.6 | $4.2 |
76 | $170.3 | $2.C | $4.B | $6.9 | $8.B | $3.7 | $4.3 |
77 | $177.B | $2.C | $4.C | $6.A | $8.C | $3.8 | $4.4 |
78 | $17F.4 | $2.C | $4.D | $6.B | $8.D | $3.9 | $4.5 |
79 | $186.E | $2.C | $4.E | $6.C | $8.E | $3.A | $4.6 |
80 | $18E.9 | $2.C | $4.F | $6.D | $8.F | $3.B | $4.7 |
81 | $196.5 | $2.C | $5.0 | $6.E | $8.0 | $3.C | $4.8 |
82 | $19E.2 | $2.C | $5.1 | $6.F | $8.1 | $3.D | $4.9 |
83 | $1A6.0 | $2.C | $5.2 | $6.0 | $8.2 | $3.E | $4.A |
84 | $1AD.F | $2.C | $5.3 | $6.1 | $8.3 | $3.F | $4.B |
85 | $1B5.F | $2.C | $5.4 | $6.2 | $8.4 | $3.0 | $4.C |
86 | $1BE.0 | $2.C | $5.5 | $6.3 | $8.5 | $3.1 | $4.D |
87 | $1C6.2 | $2.C | $5.6 | $6.4 | $8.6 | $3.2 | $4.E |
88 | $1CE.5 | $2.C | $5.7 | $6.5 | $8.7 | $3.3 | $4.F |
89 | $1D6.9 | $2.C | $5.8 | $6.6 | $8.8 | $3.4 | $4.0 |
90 | $1DE.E | $2.C | $5.9 | $6.7 | $8.9 | $3.5 | $4.1 |
91 | $1E7.4 | $2.C | $5.A | $6.8 | $8.A | $3.6 | $4.2 |
92 | $1EF.B | $2.C | $5.B | $6.9 | $8.B | $3.7 | $4.3 |
93 | $1F8.3 | $2.C | $5.C | $6.A | $8.C | $3.8 | $4.4 |
94 | $200.C | $2.C | $5.D | $6.B | $8.D | $3.9 | $4.5 |
95 | $209.6 | $2.C | $5.E | $6.C | $8.E | $3.A | $4.6 |
96 | $212.1 | $2.C | $5.F | $6.D | $8.F | $3.B | $4.7 |
97 | $21A.D | $2.C | $6.0 | $7.E | $9.0 | $4.C | $5.8 |
98 | $223.A | $2.C | $6.1 | $7.F | $9.1 | $4.D | $5.9 |
99 | $22C.8 | $2.C | $6.2 | $7.0 | $9.2 | $4.E | $5.A |
100 | $235.7 | $2.C | $6.3 | $7.1 | $9.3 | $4.F | $5.B |
101 | $23E.7 | $2.C | $6.4 | $7.2 | $9.4 | $4.0 | $5.C |
102 | $247.8 | $2.C | $6.5 | $7.3 | $9.5 | $4.1 | $5.D |
103 | $250.A | $2.C | $6.6 | $7.4 | $9.6 | $4.2 | $5.E |
104 | $259.D | $2.C | $6.7 | $7.5 | $9.7 | $4.3 | $5.F |
105 | $263.1 | $2.C | $6.8 | $7.6 | $9.8 | $4.4 | $5.0 |
106 | $26C.6 | $2.C | $6.9 | $7.7 | $9.9 | $4.5 | $5.1 |
107 | $275.C | $2.C | $6.A | $7.8 | $9.A | $4.6 | $5.2 |
108 | $27F.3 | $2.C | $6.B | $7.9 | $9.B | $4.7 | $5.3 |
109 | $288.B | $2.C | $6.C | $7.A | $9.C | $4.8 | $5.4 |
110 | $292.4 | $2.C | $6.D | $7.B | $9.D | $4.9 | $5.5 |
111 | $29B.E | $2.C | $6.E | $7.C | $9.E | $4.A | $5.6 |
112 | $2A5.9 | $2.C | $6.F | $7.D | $9.F | $4.B | $5.7 |
113 | $2AF.5 | $2.C | $7.0 | $7.E | $9.0 | $4.C | $5.8 |
Without Speedbooster, the same table is also valid up through row 33 (when extra run speed reaches $2.0), except that in that case the Jump Speed and HiJump Speeds are just constants ($4.E and $6.0) independent of run speed. The jump speeds shown are applicable for all kinds of jumps, including spin jumps, Space Jumps, and spring ball jumps (from a mockball, bounce, or mid-air jump).
The following table shows the maximum extra run speed attainable with a last-frame jump from a given runway length, with Speedbooster equipped and holding dash the entire time, with various starting and ending conditions:
- Wall -> door: Start backed up against a wall, jump on the last possible frame before a door transition
- Wall -> open: Start backed up against a wall, jump on the last possible frame before falling off a ledge
- Open -> door: Start hanging off a ledge, jump on the last possible frame before a door transition
- Open -> open: Start hanging off a ledge, jump on the last possible frame before falling off a ledge
Runway length | Wall -> door | Wall -> open | Open -> door | Open -> open |
---|---|---|---|---|
1 | $0.7 | $0.A | $0.B | $0.C |
2 | $0.D | $0.E | $0.F | $1.1* |
3 | $1.1 | $1.2 | $1.4* | $1.5 |
4 | $1.5 | $1.6 | $1.7 | $1.9* |
5 | $1.9 | $1.A | $1.B | $1.C |
6 | $1.D | $1.E | $1.F* | $2.0* |
7 | $2.0 | $2.1 | $2.2 | $2.3 |
8 | $2.3 | $2.4 | $2.5 | $2.6 |
9 | $2.7 | $2.7 | $2.8 | $2.9 |
10 | $2.9 | $2.A | $2.B | $2.C |
11 | $2.D | $2.D | $2.E | $2.F |
12 | $2.F | $3.0 | $3.1 | $3.1 |
13 | $3.2 | $3.3 | $3.4 | $3.4 |
14 | $3.5 | $3.5 | $3.6 | $3.7 |
15 | $3.7 | $3.8 | $3.9 | $3.9 |
16 | $3.A | $3.A | $3.B | $3.C |
17 | $3.C | $3.D | $3.E | $3.E |
18 | $3.F | $3.F | $4.0 | $4.1* |
19 | $4.1 | $4.2 | $4.3* | $4.3 |
20 | $4.4 | $4.4 | $4.5 | $4.5 |
21 | $4.6 | $4.6 | $4.7 | $4.7 |
22 | $4.8 | $4.8 | $4.9 | $4.A* |
23 | $4.A | $4.A | $4.B | $4.C |
24 | $4.C | $4.D | $4.E* | $4.E |
25 | $4.F | $4.F | $5.0 | $5.0 |
26 | $5.1 | $5.1 | $5.2 | $5.2 |
27 | $5.3 | $5.3 | $5.4 | $5.4 |
28 | $5.5 | $5.5 | $5.6 | $5.6 |
29 | $5.7 | $5.7 | $5.8 | $5.8 |
30 | $5.9 | $5.9 | $5.A | $5.A |
31 | $5.A | $5.B | $5.C* | $5.C* |
32 | $5.C | $5.C | $5.D | $5.D |
33 | $5.E | $5.E | $5.F | $5.F |
34 | $6.0 | $6.0 | $6.1 | $6.1 |
35 | $6.2 | $6.2 | $6.3 | $6.3 |
36 | $6.4 | $6.4 | $6.5 | $6.5 |
37 | $6.5 | $6.5 | $6.6 | $6.6 |
38 | $6.7 | $6.7 | $6.8 | $6.8 |
39 | $6.9 | $6.9 | $6.A | $6.A |
40 | $6.B | $6.B | $6.C* | $6.C* |
41 | $6.C | $6.C | $6.D | $6.D |
42 | $6.E | $6.E | $6.F | $6.F* |
43+ | $7.0 | $7.0 | $7.0 | $7.0 |
In cases marked with an asterisk, the maximum speed depends on the starting subpixels, so without a method to normalize the subpixels the maximum speed may be $0.1 less.
Without Speed Booster, the same table is valid except that extra run speed is capped at $2.0.
If running and falling off an open ledge rather than jumping, an extra $0.1 of run speed would be available. On the other hand, running through a door transition gives the same amount of run speed in the next room as jumping through the door transition. If using a combined runway across both sides of a transition, the table will not be accurate, because of how Samus is repositioned after the transition.
Calculating attainable run speed becomes more complex when using a runway to gain blue speed state before jumping, e.g. to be able to destroy bomb blocks and enemies on contact. The amount of speed obtained can depend on how the shortcharge is executed as well as the length of runway used. Lowest speed can be achieved by pressing dash only with crisp taps on the 4 magic frames, in order to minimize the time that dash is held; given a limited length of runway, stutters also help to reset Samus' base speed at the start of the run. High speed can be achieved by again using stutters and crisp taps, but with as few taps as necessary, holding dash continuously at the end of the run, starting as soon as possible while still getting blue before the end of the runway. We define several levels of shortcharging skill:
Difficulty level | Minimal shortcharge length | Description |
---|---|---|
A | 25 | No stutter, 1-tap held at least 15 frames before first magic frame |
B | 20 | Single stutter, up to 2-tap, taps at least 11 frames each |
C | 16 | Single stutter, up to 3-tap, taps at least 7 frames each |
D | 15 | Single stutter, up to 4-tap, taps at least 5 frames each |
E | 14 | Double stutter, up to 4-tap, taps at least 4 frames each |
F | 13 | Triple stutter, up to 4-tap, taps at least 3 frames each |
G | 11 | Near-perfect stutters and taps |
Based on these definitions and some testing, we can determine a range of attainable run speed for each combination of runway length and skill level. For each runway length, we define an "ideal speed" to be the extra run speed that would result by performing the shortcharge in the easiest possible way for that length of runway, i.e. using the techniques in the lowest possible difficulty level. For each difficulty level at or above that level, we then measure a maximum speed reasonably attainable using those techniques. The following table shows possible values for representative runway lengths; values for other runway lengths can be obtained by linearly interpolating the values in this table. All speed values refer to extra run speed:
Runway length | Ideal speed | A | B | C | D | E | F | G |
---|---|---|---|---|---|---|---|---|
30 | $5.9 | $5.9 | $5.9 | $5.9 | $5.9 | $5.9 | $5.9 | $5.9 |
25 | $4.8 | $4.9 | $4.B | $4.C | $4.D | $4.E | $4.E | $4.E |
20 | $3.7 | - | $3.A | $3.C | $3.E | $4.0 | $4.1 | $4.2 |
17 | $1.E | - | - | $2.9 | $2.D | $3.3 | $3.8 | $3.A |
16 | $1.B | - | - | $2.3 | $2.B | $3.1 | $3.3 | $3.5 |
15 | $1.6 | - | - | - | $1.B | $2.9 | $2.B | $2.F |
14 | $1.2 | - | - | - | - | $1.A | $2.4 | $2.A |
13 | $1.0 | - | - | - | - | - | $1.2 | $1.E |
12 | $0.B | - | - | - | - | - | - | $0.B |
11 | $0.7 | - | - | - | - | - | - | $0.7 |