User:Nightmareci/SRS: Difference between revisions
Nightmareci (talk | contribs) A very new description of SRS |
Nightmareci (talk | contribs) No edit summary |
||
(3 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
==Offsets== | [[File:SRS-true-rotations.png | thumb | The internal true rotations used in SRS; offsets are applied to these.]] | ||
[[File:SRS-pieces.png | thumb | 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 [[tetromino|tetrominoes]] behave, in a broad sense. SRS represents where and how tetrominoes spawn, how they [[rotate]], and what [[wall kick|wall kicks]] they may perform. SRS traces its routes back to 1991 when [[BPS]] introduced its signature third and fourth [[orientation|orientations]] for the ''S'', ''Z'', and ''I'' tetrominoes in their [[Tetris 2 and Bombliss|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 === | |||
{| border="1" style="font-family: Monospace;" | {| border="1" style="font-family: Monospace;" | ||
|+ I | |+ I | ||
Line 50: | Line 56: | ||
|} | |} | ||
==Explanation of Offsets== | === 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 next offset pair is tried, and so on, until an offset pair succeeds; if none succeed, then no change in state will have occurred. | 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: | |||
<playfield> | |||
..... | |||
..... | |||
.ICII | |||
..... | |||
..... | |||
</playfield> | |||
Start. | |||
<playfield> | |||
..... | |||
..I.. | |||
..C.. | |||
..I.. | |||
..I.. | |||
</playfield> | |||
<tt>0° -> 90°</tt>, true rotation. | |||
<playfield> | |||
..... | |||
...I. | |||
...C. | |||
...I. | |||
...I. | |||
</playfield> | |||
<pre> | |||
Subtract | |||
|----------|----------| | |||
v v v | |||
(+0, +0) - (-1, +0) => +1 horizontal offset, +0 vertical offset. Success. | |||
^ ^ ^ | |||
|----------|----------------------------| | |||
Subtract | |||
</pre> | |||
<playfield> | |||
..... | |||
...I. | |||
...C. | |||
...I. | |||
...I. | |||
</playfield> | |||
End. | |||
This is a rather contrived example, but it shows how the offsets are tried in order until one works: | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGGG.G | |||
GICIIG | |||
GGGGGG | |||
GGGGGG | |||
GGGGGG | |||
</playfield> | |||
Start. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGIG.G | |||
G.C..G | |||
GGIGGG | |||
GGIGGG | |||
GGGGGG | |||
</playfield> | |||
<tt>0° -> 90°</tt>, true rotation. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGGX.G | |||
G..C.G | |||
GGGXGG | |||
GGGXGG | |||
GGGGGG | |||
</playfield> | |||
<tt>(+0, +0) - (-1, +0) =></tt> Intersection, fail. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGIG.G | |||
G.C..G | |||
GGIGGG | |||
GGIGGG | |||
GGGGGG | |||
</playfield> | |||
Undo previous offset, change back to true rotation. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GXGG.G | |||
GC...G | |||
GXGGGG | |||
GXGGGG | |||
GGGGGG | |||
</playfield> | |||
<tt>(-1, +0) - (+0, +0) =></tt> Intersection, fail. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGIG.G | |||
G.C..G | |||
GGIGGG | |||
GGIGGG | |||
GGGGGG | |||
</playfield> | |||
Undo previous offset, change back to true rotation. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGGGIG | |||
G...CG | |||
GGGGXG | |||
GGGGXG | |||
GGGGGG | |||
</playfield> | |||
<tt>(+2, +0) - (+0, +0) =></tt> Intersection, fail. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGIG.G | |||
G.C..G | |||
GGIGGG | |||
GGIGGG | |||
GGGGGG | |||
</playfield> | |||
Undo previous offset, change back to true rotation. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGGG.G | |||
GI...G | |||
GCGGGG | |||
GXGGGG | |||
GXGGGG | |||
</playfield> | |||
<tt>(-1, +0) - (+0, +1) =></tt> Intersection, fail; the true rotation center is intersecting, too. | |||
<playfield> | |||
GGGG.G | |||
GGGG.G | |||
GGIG.G | |||
G.C..G | |||
GGIGGG | |||
GGIGGG | |||
GGGGGG | |||
</playfield> | |||
Undo previous offset, change back to true rotation. | |||
<playfield> | |||
GGGGIG | |||
GGGGCG | |||
GGGGIG | |||
G...IG | |||
GGGGGG | |||
GGGGGG | |||
GGGGGG | |||
</playfield> | |||
<tt>(+2, +0) - (+0, -2) =></tt> Success. | |||
<playfield> | |||
GGGGIG | |||
GGGGCG | |||
GGGGIG | |||
G...IG | |||
GGGGGG | |||
GGGGGG | |||
GGGGGG | |||
</playfield> | |||
End. |
Latest revision as of 00:02, 5 July 2009
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
0° | (+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) |
0° | (+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) |
0° | (+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:
Start.
0° -> 90°, true rotation.
Subtract |----------|----------| v v v (+0, +0) - (-1, +0) => +1 horizontal offset, +0 vertical offset. Success. ^ ^ ^ |----------|----------------------------| Subtract
End.
This is a rather contrived example, but it shows how the offsets are tried in order until one works:
Start.
0° -> 90°, true rotation.
(+0, +0) - (-1, +0) => Intersection, fail.
Undo previous offset, change back to true rotation.
(-1, +0) - (+0, +0) => Intersection, fail.
Undo previous offset, change back to true rotation.
(+2, +0) - (+0, +0) => Intersection, fail.
Undo previous offset, change back to true rotation.
(-1, +0) - (+0, +1) => Intersection, fail; the true rotation center is intersecting, too.
Undo previous offset, change back to true rotation.
(+2, +0) - (+0, -2) => Success.
End.