Basic Piece Movement

Basic Movement

Piece movements for games in this genre:

  • Left/Right - Lateral movement, the piece stops if it is blocked
  • Rotate CW or CCW - Rotate around the center of rotation, with a set of “wall kicks” which check other locations for the piece if it is blocked
  • Rotate 180 - Also a rotation, but uses different kicks (not equivalent to rotating CW or CCW twice)
  • Soft Drop - Drops the piece down similarly to gravity
  • Hard Drop - Instantly drops and places the piece

Rotation

Following the SRS guidelines, every piece has a center of rotation:

I piece
J piece
L piece
O piece
S piece
T piece
Z piece

Pieces rotate mathematically around this point, meaning that an identical clockwise rotation from these two states will cause the piece to visually appear in a different column:

Default state
After CW
180 state
After CW

Kicks

If a rotation key is pressed, but any tile of the piece would intersect with a solid block or wall, different positions are checked. These are usually non-intrusive and contribute to the game feeling less janky - for example, the T piece rotation shown below would cancel the input and do nothing if kicks weren’t in the game:

Default state
After CCW (fails)

Instead, after checking a list of preset kick positions, the T piece ends up here:

Piece center 1 to the right and 1 up

Comprehensive documentation for all tetromino kicks exists here. The 180 kicks used in UltraStack are identical to TETR.IO’s kicks, found here.

3-Mino Rotation

UltraStack adds functionality to 3mino pieces as shown below:

I3
L3

I3 wall kicks (identical to JLSTZ)

  1 2 3 4 5
0→R (0, 0) (-1, 0) (-1, 1) (0, -2) (-1, -2)
R→0 (0, 0) (1, 0) (1, -1) (0, 2) (1, 2)
R→2 (0, 0) (1, 0) (1, -1) (0, 2) (1, 2)
2→R (0, 0) (-1, 0) (-1, 1) (0, -2) (-1, -2)
2→L (0, 0) (1, 0) (1, 1) (0, -2) (1, -2)
L→2 (0, 0) (-1, 0) (-1, -1) (0, 2) (-1, 2)
L→0 (0, 0) (-1, 0) (-1, -1) (0, 2) (-1, 2)
0→L (0, 0) (1, 0) (1, 1) (0, -2) (1, -2)

L3 wall kicks

  1 2 3 4 5
0→R (0, 0) (-1, 0) (0, 1) (-1, -1) (1, 1)
R→0 (0, 0) (1, 0) (0, -1) (1, 1) (-1, -1)
R→2 (0, 0) (1, 0) (0, -1) (1, 1) (-1, -1)
2→R (0, 0) (-1, 0) (0, 1) (-1, -1) (1, 1)
2→L (0, 0) (1, 0) (0, 1) (1, -1) (-1, 1)
L→2 (0, 0) (-1, 0) (0, -1) (-1, 1) (1, -1)
L→0 (0, 0) (-1, 0) (0, -1) (-1, 1) (1, -1)
0→L (0, 0) (1, 0) (0, 1) (1, -1) (-1, 1)

I3 180 wall kicks

  1
0→2 (0, 1)
R→L (1, 0)
2→0 (0, -1)
L→R (-1, 0)

L3 180 wall kicks (identical to JLSTZ)

  1 2 3 4 5
0→2 (0, 1) (1, 1) (-1, 1) (1, 0) (-1, 0)
R→L (1, 0) (1, 2) (1, 1) (0, 2) (0, 1)
2→0 (0, -1) (-1, -1) (1, -1) (-1, 0) (1, 0)
L→R (-1, 0) (-1, 2) (-1, 1) (0, 2) (0, 1)

Repeating Movements

Left/Right and Soft Drop are repeating actions - when pressed, the piece performs the movement immediately and repeats at set intervals if the key is still held down. The timing for these repeats are as follows:

DAS and ARR

  1. Holding Left/Right will perform the action immediately.
  2. After DAS milliseconds, the action is performed again.
  3. (repeating) After ARR milliseconds, the action is performed again.

With a DAS of 100 and an ARR of 32, piece movement occurs at:

0 (instant), 100 (DAS), 132 (ARR), 164 (ARR), 196 (ARR), etc.

  • DAS stands for Delayed Auto Shift.
  • ARR stands for Automatic Repeat Rate.

Soft Drops

Drops the piece down by a tile at a repeating interval (usually, but not always, a factor of gravity).

In some games with adjustable soft drop speeds, an instant soft drop can be set - teleporting the piece to the ground like a hard drop without placing it. UltraStack does not have adjustable DAS, ARR, or soft drop speed.

Hard Drops

Places the piece and performs a Line Clear.