Difference between revisions of "Subpixels"

From ALttP Speedrunning Wiki
Jump to: navigation, search
Line 15: Line 15:
 
** Dashing, shallow water: $30
 
** Dashing, shallow water: $30
 
** Diagonal, shallow water: $0D
 
** Diagonal, shallow water: $0D
 +
** Walking, slope: $10 (both directions)
 +
** Dashing, slope: $2A (both directions)
 
* When walking leftwards or upwards, the speed is reversed ($18 becomes $E8)
 
* When walking leftwards or upwards, the speed is reversed ($18 becomes $E8)
 
* The first significant digit (1 in the case of walking on normal ground) is added to the coordinate directly, no matter what.
 
* The first significant digit (1 in the case of walking on normal ground) is added to the coordinate directly, no matter what.
Line 30: Line 32:
 
* Downwards
 
* Downwards
 
** frame 1: Subpixel = 0x00 + 0x80 = 0x80. Coordinate = 0 + 1 + 0 = 1
 
** frame 1: Subpixel = 0x00 + 0x80 = 0x80. Coordinate = 0 + 1 + 0 = 1
** frame 2: Subpixel = 0x80 + 0x80 = 0x00. Coordinate = 1 + 1 + 1 = 3  (subpixel overflow).
+
** frame 2: Subpixel = 0x80 + 0x80 = 0x00. Coordinate = 1 + 1 + 1 = 3  (subpixel overflow)
 
** frame 3: Subpixel = 0x00 + 0x80 = 0x80. Coordinate = 3 + 1 + 0 = 4
 
** frame 3: Subpixel = 0x00 + 0x80 = 0x80. Coordinate = 3 + 1 + 0 = 4
** frame 4: Subpixel = 0x80 + 0x80 = 0x00. Coordinate = 4 + 1 + 1 = 6  (subpixel overflow).
+
** frame 4: Subpixel = 0x80 + 0x80 = 0x00. Coordinate = 4 + 1 + 1 = 6  (subpixel overflow)
 
** Etc
 
** Etc
  
Line 50: Line 52:
  
 
* Upwards
 
* Upwards
** frame 1: Subpixel = 0x00 - 0xB0 = 0x50. Coordinate = 0 + 0 + 1 = 1  (subpixel overflow
+
** frame 1: Subpixel = 0x00 - 0xB0 = 0x50. Coordinate = 0 + 0 + 1 = 1  (subpixel overflow)
 
** frame 2: Subpixel = 0x50 - 0xB0 = 0xA0. Coordinate = 1 + 0 + 1 = 2  (subpixel overflow)
 
** frame 2: Subpixel = 0x50 - 0xB0 = 0xA0. Coordinate = 1 + 0 + 1 = 2  (subpixel overflow)
** frame 3: Subpixel = 0xA0 - 0xB0 = 0xF0. Coordinate = 1 + 0 + 1 = 3  (subpixel overflow)
+
** frame 3: Subpixel = 0xA0 - 0xB0 = 0xF0. Coordinate = 2 + 0 + 1 = 3  (subpixel overflow)
 
** frame 4: Subpixel = 0xF0 - 0xB0 = 0x40. Coordinate = 3 + 0 + 0 = 3
 
** frame 4: Subpixel = 0xF0 - 0xB0 = 0x40. Coordinate = 3 + 0 + 0 = 3
 
** Etc
 
** Etc
Line 58: Line 60:
 
== How it affects slope dashes ==
 
== How it affects slope dashes ==
  
Dashing on a slope is a fairly volatile thing when you frame advance through it. Link will move anything from 0 to 3 pixels in both the horizontal or vertical direction, seemingly at random. We're not sure the exact rules, but it looks like different parts of the slope will give different pixel boosts.
+
Dashing on a slope is a fairly volatile thing when you frame advance through it. Link will move anything from 0 to 3 pixels in both the horizontal or vertical direction, seemingly at random. This is now understood better. The base speed is 2, and when the subpixel overflows you will get a 3 movement.
  
Another factor is subpixels. Depending on what subpixel you have, you might or might not get an extra pixel boost at any point during the slope dash. This means that even if you start your dash from the exact same coordinate, the slopedash can go fast or slow depending on the subpixel value.
+
We're not completely sure why we get the 0 movements, but it looks like the game is trying to align Link with the slope. For example if you start your dash at the very first pixel you can start a slope dash, Link will move 1px/f until he's properly aligned and can start the slope dash.
  
One way to make sure you get the same subpixel is to hit diagonal before starting the dash.
+
In any event, the subpixel you have when a dash is started, will affect how the slopedash will end up working out. If it's close to overflowing, you might get an extra pixel boost immediately, which will completely change the coordinates Link travels through during the slope dash. Basically, even if you start your dash from the exact same coordinate, the slopedash can go fast or slow depending what the subpixel value is before the dash.
 +
 
 +
One way to make sure you get the same subpixel every time is to hit diagonal before starting the dash.
  
 
=== Bomb Clips ===
 
=== Bomb Clips ===
  
Since a criteria for performing a [[Bomb Clip]] is that you are positioned exactly below the explosion, your subpixel value will matter just as much as your coordinate, since different paths through the slope might or might not include the coordinate where Link is directly below.
+
Since a criteria for performing a [[Bomb Clip]] is that you are positioned ''exactly'' below the explosion, your subpixel value will matter just as much as your coordinate when you start the slopedash, since different paths through the slope might or might not include the coordinate you need to visit.
 
 
Some setups works the same for both subpixel=0x00 and subpixel=0x80, in which case it doesn't matter.
 
  
If a setup requires a specific subpixel, you would need to go from a standstill to a movement for an exact amount of frames, before starting the dash (for example hit > + A on the same frame).
+
Some setups works the same for all subpixels, in which case only the coordinate matters.

Revision as of 15:29, 12 January 2018

This game uses subpixels for its movement. This is how Link gets the movement speed of 2-1-2-1 on normal ground etc.

How the coordinate and subpixel is updated during movement

Speed

  • Link has a static speed when moving around.
    • Walking, normal ground: $18
    • Dashing, normal ground: $40
    • Diagonal, normal ground: $10
    • Walking, stairs: $0B
    • Dashing, stairs: $0A
    • Diagonal, stairs: $0B
    • Walking, shallow water: $14
    • Dashing, shallow water: $30
    • Diagonal, shallow water: $0D
    • Walking, slope: $10 (both directions)
    • Dashing, slope: $2A (both directions)
  • When walking leftwards or upwards, the speed is reversed ($18 becomes $E8)
  • The first significant digit (1 in the case of walking on normal ground) is added to the coordinate directly, no matter what.
  • The least significant digit (8 in the case of walking on normal ground) is shifted left four times, and added first to the subpixel. If this causes the subpixel to overflow/wrap, we add an additional pixel to the coordinate.

Subpixel

  • The game will reset Link's subpixel whenever you change direction of movement. A movement after a standstill counts as changing the direction of movement.
    • The game only looks at your dpad to find out if the directionchanged. So if you walk upwards alongside a wall, and then press up and rightwards into the wall, it will treat this as a change of direction, even though Link is still moving upwards.
This means that pumping into a wall will function as two pumps, both when you press (from ^ to ^>) and when you release (from ^> to ^).
  • Starting/executing a dash will not reset the subpixel accumulator. But if you cancel the dash with a movement, it will be reset.
    • If you however start a dash that ends up transitioning to another screen, the subpixel accumulator is not reset unless you start moving in a different direction on the next screen.

Example: Walking on ground (movement speed is $18)

  • Downwards
    • frame 1: Subpixel = 0x00 + 0x80 = 0x80. Coordinate = 0 + 1 + 0 = 1
    • frame 2: Subpixel = 0x80 + 0x80 = 0x00. Coordinate = 1 + 1 + 1 = 3 (subpixel overflow)
    • frame 3: Subpixel = 0x00 + 0x80 = 0x80. Coordinate = 3 + 1 + 0 = 4
    • frame 4: Subpixel = 0x80 + 0x80 = 0x00. Coordinate = 4 + 1 + 1 = 6 (subpixel overflow)
    • Etc
  • Upwards
    • frame 1: Subpixel = 0x00 - 0x80 = 0x80. Coordinate = 0 + 1 + 1 = 2 (subpixel overflow)
    • frame 2: Subpixel = 0x80 - 0x80 = 0x00. Coordinate = 2 + 1 + 0 = 3
    • Etc

Example: Walking on stairs (movement speed is $0B)

  • Downwards
    • frame 1: Subpixel = 0x00 + 0xB0 = 0xB0. Coordinate = 0 + 0 + 0 = 0
    • frame 2: Subpixel = 0xB0 + 0xB0 = 0x60. Coordinate = 0 + 0 + 1 = 1 (subpixel overflow)
    • frame 3: Subpixel = 0x60 + 0xB0 = 0x10. Coordinate = 1 + 0 + 1 = 2 (subpixel overflow)
    • frame 4: Subpixel = 0x10 + 0xB0 = 0xC0. Coordinate = 2 + 0 + 0 = 2
    • Etc
  • Upwards
    • frame 1: Subpixel = 0x00 - 0xB0 = 0x50. Coordinate = 0 + 0 + 1 = 1 (subpixel overflow)
    • frame 2: Subpixel = 0x50 - 0xB0 = 0xA0. Coordinate = 1 + 0 + 1 = 2 (subpixel overflow)
    • frame 3: Subpixel = 0xA0 - 0xB0 = 0xF0. Coordinate = 2 + 0 + 1 = 3 (subpixel overflow)
    • frame 4: Subpixel = 0xF0 - 0xB0 = 0x40. Coordinate = 3 + 0 + 0 = 3
    • Etc

How it affects slope dashes

Dashing on a slope is a fairly volatile thing when you frame advance through it. Link will move anything from 0 to 3 pixels in both the horizontal or vertical direction, seemingly at random. This is now understood better. The base speed is 2, and when the subpixel overflows you will get a 3 movement.

We're not completely sure why we get the 0 movements, but it looks like the game is trying to align Link with the slope. For example if you start your dash at the very first pixel you can start a slope dash, Link will move 1px/f until he's properly aligned and can start the slope dash.

In any event, the subpixel you have when a dash is started, will affect how the slopedash will end up working out. If it's close to overflowing, you might get an extra pixel boost immediately, which will completely change the coordinates Link travels through during the slope dash. Basically, even if you start your dash from the exact same coordinate, the slopedash can go fast or slow depending what the subpixel value is before the dash.

One way to make sure you get the same subpixel every time is to hit diagonal before starting the dash.

Bomb Clips

Since a criteria for performing a Bomb Clip is that you are positioned exactly below the explosion, your subpixel value will matter just as much as your coordinate when you start the slopedash, since different paths through the slope might or might not include the coordinate you need to visit.

Some setups works the same for all subpixels, in which case only the coordinate matters.