User:Nightmareci/SRS

From TetrisWiki
Revision as of 00:02, 5 July 2009 by Nightmareci (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The internal true rotations used in SRS; offsets are applied to these.
The default rotations for SRS. These are actually the true rotations with the first offset pairs applied.

Super Rotation System, or SRS is the current Tetris Guideline standard for how tetrominoes behave, in a broad sense. SRS represents where and how tetrominoes spawn, how they rotate, and what wall kicks they may perform. SRS traces its routes back to 1991 when BPS introduced its signature third and fourth orientations for the S, Z, and I tetrominoes in their Tetris 2+Bombliss. Later would come flipped-side-up spawned T, L, and J tetrominoes and flexible new wall kicks. Probably the most accurate SRS finds itself in BPS's latest games Tetris Worlds and Tetris Deluxe, which both have identical rotation behavior.

Description

How SRS actually works is quite complex in comparison to most other rotations systems; the following is an attempt at describing it, based on analysis of Tetris Worlds.

Offsets

I
(+0, +0) (-1, +0) (+2, +0) (-1, +0) (+2, +0)
90° (-1, +0) (+0, +0) (+0, +0) (+0, +1) (+0, -2)
180° (-1, +1) (+1, +1) (-2, +1) (+1, +0) (-2, +0)
270° (+0, +1) (+0, +1) (+0, +1) (+0, -1) (+0, +2)


J, L, S, T and Z
(+0, +0) (+0, +0) (+0, +0) (+0, +0) (+0, +0)
90° (+0, +0) (+1, +0) (+1, -1) (+0, +2) (+1, +2)
180° (+0, +0) (+0, +0) (+0, +0) (+0, +0) (+0, +0)
270° (+0, +0) (-1, +0) (-1, -1) (+0, +2) (-1, +2)


O
(+0, +0)
90° (+0, -1)
180° (-1, -1)
270° (-1, +0)

Explanation of Offsets

Upon pressing a rotation input, clockwise or counterclockwise, there is orientation-start (the orientation before the rotation input is sent) and orientation-end (the orientation that will possibly be changed to). True rotation is performed from orientation-start to orientation-end, even if intersection occurs. Next, the first offset pair is attempted; given (a, b) as the first offset for orientation-start and (c, d) as the offset for orientation-end, the number of columns the offset attempt goes rightward is a-c when a-c is positive and leftward if a-c is negative, and the number of rows upward is b-d if b-d is positive and downward if b-d is negative. If applying the first pair of offsets results in some intersection with the field or walls, then the tetromino is reset to the true rotation before applying offsets, then the next offset pair is tried, if that fails the tetromino is reset to the true rotation, and so on, until an offset pair succeeds; if none succeed, then no change in state will have occurred.

Examples

This is an example of I rotating from 0° to 90°, which is one clockwise rotation input in-game, with the true rotation center marked all the way through:

.....
.....
.ICII
.....
.....

Start.

.....
..I..
..C..
..I..
..I..

0° -> 90°, true rotation.

.....
...I.
...C.
...I.
...I.
    Subtract
  |----------|----------|
  v          v          v
(+0, +0) - (-1, +0) => +1 horizontal offset, +0 vertical offset. Success.
      ^          ^                            ^
      |----------|----------------------------|
        Subtract
.....
...I.
...C.
...I.
...I.

End.

This is a rather contrived example, but it shows how the offsets are tried in order until one works:

GGGG.G
GGGG.G
GGGG.G
GICIIG
GGGGGG
GGGGGG
GGGGGG

Start.

GGGG.G
GGGG.G
GGIG.G
G.C..G
GGIGGG
GGIGGG
GGGGGG

0° -> 90°, true rotation.

GGGG.G
GGGG.G
GGGX.G
G..C.G
GGGXGG
GGGXGG
GGGGGG

(+0, +0) - (-1, +0) => Intersection, fail.

GGGG.G
GGGG.G
GGIG.G
G.C..G
GGIGGG
GGIGGG
GGGGGG

Undo previous offset, change back to true rotation.

GGGG.G
GGGG.G
GXGG.G
GC...G
GXGGGG
GXGGGG
GGGGGG

(-1, +0) - (+0, +0) => Intersection, fail.

GGGG.G
GGGG.G
GGIG.G
G.C..G
GGIGGG
GGIGGG
GGGGGG

Undo previous offset, change back to true rotation.

GGGG.G
GGGG.G
GGGGIG
G...CG
GGGGXG
GGGGXG
GGGGGG

(+2, +0) - (+0, +0) => Intersection, fail.

GGGG.G
GGGG.G
GGIG.G
G.C..G
GGIGGG
GGIGGG
GGGGGG

Undo previous offset, change back to true rotation.

GGGG.G
GGGG.G
GGGG.G
GI...G
GCGGGG
GXGGGG
GXGGGG

(-1, +0) - (+0, +1) => Intersection, fail; the true rotation center is intersecting, too.

GGGG.G
GGGG.G
GGIG.G
G.C..G
GGIGGG
GGIGGG
GGGGGG

Undo previous offset, change back to true rotation.

GGGGIG
GGGGCG
GGGGIG
G...IG
GGGGGG
GGGGGG
GGGGGG

(+2, +0) - (+0, -2) => Success.

GGGGIG
GGGGCG
GGGGIG
G...IG
GGGGGG
GGGGGG
GGGGGG

End.