From Hard Drop Tetris Wiki
That's TGM, not SRS
In the 20g section, colour_thief added the example:
|
|
That's TGM rotation, not SRS. SRS would process it like this:
|
|
where the L tetromino rotates around its center (represented here as a yellow block). --Tepples 12:57, 21 June 2006 (EDT)
- Thanks CT for fixing it. But in my experience even at slower levels (TDS standard marathon level 1 and 11), the difference seems to be related to the game's slow ass DAS rather than a difference in processing order, as I get one or two frames of the "intermediate" state visible on the screen. --Tepples 15:08, 21 June 2006 (EDT)
- Thanks for the comments Tepples. Lots of TGM clones (all using 60 fps DAS) get this detail wrong because of misordering, so I may have been quick to jump to conclusions. After further testing it seems you are right, it is related to slow DAS. Well, it could be any number of DAS things really... Charge time, repeat rate... In TGM, a charged DAS will move on the first frame it can, while in TDS I think it waits for an amount equal to the repeat rate. This means the move will work as long as gravity is below (1/repeat rate)g. I've found that if you tap both rotation buttons with one continuous slide, such that you rotate on 2 successive frames, you can do the move in the example even up to speed 12. This rotates twice before the piece can fall, which gives you a 1 block height advantage. So the piece can fall 1 space before DAS kicks in and the move will still work. This allows the move to work while gravity is below (2/repeat rate)g. Did that make sense at all? What's you opinion? It would be nice if you could do some testing to compare notes before we edit the wiki further. --Colour Thief 20:38, 21 June 2006 (EDT)
About one of the c2 kicks
I got that srs kick on tetris.com. 108.66.234.163 11:32, 15 July 2017 (PDT)
The above-mentioned kick is shown here.
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
108.66.234.160 15:18, 29 July 2017 (PDT)
Is this an srs kick?
I did a 180 on tetris.com:
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
108.66.234.160 12:53, 29 July 2017 (PDT)
Another peculiar tetris.com wall kick
Is this for both srs and c2, or just the latter?
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
108.66.234.160 15:17, 29 July 2017 (PDT)
180° rotation is not defined in SRS. The kick above is not in SRS.
- If you move your mouse the right way on tetris.com, you can rotate the j or l-tetrimino 180 degrees! 108.66.234.160 05:15, 30 July 2017 (PDT)
- Moving mouse is just moving to x position of mouse and predicting the orientation. Piotr Grochowski 05:53, 30 July 2017 (PDT)
SRS+
NullpoMino also has SRS+ as a rotation system, but I don't know the wall kicks. Should we split this page into SRS and SRS+? 108.66.234.160 13:49, 31 July 2017 (PDT)
Not possible
The kicks that you say are "not used" in SRS are not possible because if they work, basic rotation also works, so basic rotation is used. 108.66.234.95 04:17, 15 October 2017 (PDT)
Read the guideline docs. You can find it with searching on google. On guideline doc, it says "not used" instead of "not possible." It means those kicks aren't used in SRS. So I am writing it "not used" wallkicks in SRS.
- Blink banned the guideline docs. Also, this wiki is not intended to match the spelling of guideline docs.
- Idk but pls make Blink for decision.
how I piece kick table should have looked like
the I piece SRS kick table
Test 1 | Test 2 | Test 3 | Test 4 | Test 5 |
---|
0->R | ( 0, 0) | (-2, 0) | (+1, 0) | (-2,-1) | (+1,+2) |
R->0 | ( 0, 0) | (+2, 0) | (-1, 0) | (+2,+1) | (-1,-2) |
R->2 | ( 0, 0) | (-1, 0) | (+2, 0) | (-1,+2) | (+2,-1) |
2->R | ( 0, 0) | (+1, 0) | (-2, 0) | (+1,-2) | (-2,+1) |
2->L | ( 0, 0) | (+2, 0) | (-1, 0) | (+2,+1) | (-1,-2) |
L->2 | ( 0, 0) | (-2, 0) | (+1, 0) | (-2,-1) | (+1,+2) |
L->0 | ( 0, 0) | (+1, 0) | (-2, 0) | (+1,-2) | (-2,+1) |
0->L | ( 0, 0) | (-1, 0) | (+2, 0) | (-1,+2) | (+2,-1) |
example for a symmetric kick table
- from 0 to R: check right (+1,0) before left (-2,0) to get I piece to the right wall
- from 0 to L: check downkick (-2,-1) before upkick (+1,+2) to have stronger kicks from horizontal positions
- from R to 2: check downkick (+2,-1) before upkick (-1,+2) to have stronger kicks back to horizontal positions
- from L to 2: check right (+1,0) before left (-2,0) for no special reason (+1 is closer to 0 than -2 though so should be checked first)
Test 1 | Test 2 | Test 3 | Test 4 | Test 5 |
---|
0->R | ( 0, 0) | (+1, 0) | (-2, 0) | (-2,-1) | (+1,+2) |
R->0 | ( 0, 0) | (-1, 0) | (+2, 0) | (+2,+1) | (-1,-2) |
R->2 | ( 0, 0) | (-1, 0) | (+2, 0) | (+2,-1) | (-1,+2) |
2->R | ( 0, 0) | (+1, 0) | (-2, 0) | (-2,+1) | (+1,-2) |
2->L | ( 0, 0) | (-1, 0) | (+2, 0) | (+2,+1) | (-1,-2) |
L->2 | ( 0, 0) | (+1, 0) | (-2, 0) | (-2,-1) | (+1,+2) |
L->0 | ( 0, 0) | (+1, 0) | (-2, 0) | (-2,+1) | (+1,-2) |
0->L | ( 0, 0) | (-1, 0) | (+2, 0) | (+2,-1) | (-1,+2) |
calculating a Tetris Company-like table from it
- assuming (0,0) for state 0; only difference between states matters in each column so this is a degree of freedom
- values for R correspond to row R -> 0
- values for L correspond to row L -> 0
- values for 2 correspond to row 2 -> R plus row R -> 0
- this is not the final table because the standard offsets for each state must still be applied
Offset 1 | Offset 2 | Offset 3 | Offset 4 | Offset 5 | |
---|---|---|---|---|---|
0 | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0, 0) |
R | ( 0, 0) | (-1, 0) | (+2, 0) | (+2,+1) | (-1,-2) |
2 | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0,+2) | ( 0,-4) |
L | ( 0, 0) | (+1, 0) | (-2, 0) | (-2,+1) | (+1,-2) |
how Tetris Company's table should have looked like
- applying the center offset for Tetris Company-like standard rotation
- R: reduce x by 1
- L: increase y by +1
- 2: reduce x by 1, increase y by +1
Offset 1 | Offset 2 | Offset 3 | Offset 4 | Offset 5 | |
---|---|---|---|---|---|
0 | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0, 0) |
R | (-1, 0) | (-2, 0) | (+1, 0) | (+1,+1) | (-2,-2) |
2 | (-1,+1) | (-1,+1) | (-1,+1) | (-1,+3) | (-1,-3) |
L | ( 0,+1) | (+1,+1) | (-2,+1) | (-2,+2) | (+1,-1) |
-- eRR0R 08:36, 25 March 2018 (PDT)
About Offset Data
I'm just curious that it is used on official tetris games because I have no idea. Sampleaccount 09:43, 25 March 2018 (PDT)
The tables you find under SRS#How_Guideline_SRS_Really_Works are indeed used by the Tetris Company. Here are those tables again:
Offset 1 | Offset 2 | Offset 3 | Offset 4 | Offset 5 | |
---|---|---|---|---|---|
0 | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0, 0) |
R | ( 0, 0) | (+1, 0) | (+1,-1) | ( 0,+2) | (+1,+2) |
2 | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0, 0) | ( 0, 0) |
L | ( 0, 0) | (-1, 0) | (-1,-1) | ( 0,+2) | (-1,+2) |
Offset 1 | Offset 2 | Offset 3 | Offset 4 | Offset 5 | |
---|---|---|---|---|---|
0 | ( 0, 0) | (-1, 0) | (+2, 0) | (-1, 0) | (+2, 0) |
R | (-1, 0) | ( 0, 0) | ( 0, 0) | ( 0,+1) | ( 0,-2) |
2 | (-1,+1) | (+1,+1) | (-2,+1) | (+1, 0) | (-2, 0) |
L | ( 0,+1) | ( 0,+1) | ( 0,+1) | ( 0,-1) | ( 0,+2) |
The numbers you find under Offset1 are the offsets for the rotation without kicks. The numbers you find under Offset2 are the offsets for the first tested kick, and so on. For example for the first kick of T,L,J,S,Z,I pieces we have an offset of (0,0) for the state 0 (spawning orientation) and (+1,0) for the state R (piece rotated to right side). If you rotate from 0 to R, official games will check the kick (0,0) - (+1,0) = (0,-1) first. If you rotate from R to 0, official games will check the kick (+1,0) - (0,0) = (+1,0) first. It's a little more complicated for I piece because the standard rotation is also implemented with an offset. This implementation also means that for every kick from state A to state B, you have a reversed kick from state B to state A which is checked in the same order. This has some advantages for multiplayer but also some disadvantages for Marathon mode.
Those 2 tables are indeed used by the Tetris company as you can see in the following source code which is taken from the Flash games you find at Tetris Online Poland (once used on the Tetris Online Japan web page). A rotation point presents a row in the table
private static function CreateNewRotationDef(p_PieceID:int) : TetSuperRotationDef { var rotationDef:TetSuperRotationDef = new TetSuperRotationDef(null); switch(p_PieceID) { case k_TetStandardPieces_PieceID_S: case k_TetStandardPieces_PieceID_Z: case k_TetStandardPieces_PieceID_J: case k_TetStandardPieces_PieceID_L: case k_TetStandardPieces_PieceID_T: rotationDef.AddRotationPoint(0,0,0,0,0,0,0,0); rotationDef.AddRotationPoint(0,0,1,0,0,0,-1,0); rotationDef.AddRotationPoint(0,0,1,-1,0,0,-1,-1); rotationDef.AddRotationPoint(0,0,0,2,0,0,0,2); rotationDef.AddRotationPoint(0,0,1,2,0,0,-1,2); break; case k_TetStandardPieces_PieceID_O: rotationDef.AddRotationPoint(0,0,0,-1,-1,-1,-1,0); break; case k_TetStandardPieces_PieceID_I: rotationDef.AddRotationPoint(0,0,-1,0,-1,1,0,1); rotationDef.AddRotationPoint(-1,0,0,0,1,1,0,1); rotationDef.AddRotationPoint(2,0,0,0,-2,1,0,1); rotationDef.AddRotationPoint(-1,0,0,1,1,0,0,-1); rotationDef.AddRotationPoint(2,0,0,-2,-2,0,0,2); break; // some further code related to Dominoes and Trominoes }
A little more of the source code and explanation
-- eRR0R 02:05, 26 March 2018 (PDT)
Oh, ok thx eRR0R. It made me confused because nullpomino doesn't use offset kick data. Where did you get the source code of tetris? And if you can, could you please post or send the source code?Sampleaccount 04:55, 27 March 2018 (PDT)
I don't really have the source code. I used a Flash Decompiler called FFdec and used it on http://tetrisonline.pl/toj_flash/Tetris1989.swf (I once wanted to edit the piece sequence in this game to make a video and noticed this part of the code). You can download a file on the internet by copying the URL to the clipboard (mark text and press Ctrl + C), opening Firefox, pressing Ctrl + J (Firefox download menu) and pressing Ctrl + V. The class I mentioned can be found under scripts -> TetrionCore -> Components.
--eRR0R 23:39, 27 March 2018 (PDT)
Very late edit: The first ever game using SRS was the PC version of Tetris Worlds. And if you look in the folder /assets/any_plat/any_lang/scripts you will find scripts defining the piece datas. A snippet from Tet2001.tws:
Tetramino { Name "T Tetrimino" NumberInBag 1 ID 1 MinoList { "T color" (0,1) "T color" (-1,0) "T color" (0,0) "T color" (1,0) } Rot0CWOffsetList (0,0),(0,0),(0,0),(0,0),(0,0) Rot90CWOffsetList (0,0),(1,0),(1,-1),(0,2),(1,2) Rot180CWOffsetList (0,0),(0,0),(0,0),(0,0),(0,0) Rot270CWOffsetList (0,0),(-1,0),(-1,-1),(0,2),(-1,2) } ... Tetramino { Name "I Tetrimino" NumberInBag 1 ID 6 MinoList { "I color" (-1,0) "I color" (0,0) "I color" (1,0) "I color" (2,0) } Rot0CWOffsetList (0,0),(-1,0),(2,0),(-1,0),(2,0) Rot90CWOffsetList (-1,0),(0,0),(0,0),(0,1),(0,-2) Rot180CWOffsetList (-1,1),(1,1),(-2,1),(1,0),(-2,0) Rot270CWOffsetList (0,1),(0,1),(0,1),(0,-1),(0,2) }
That's some further proof that The Tetris Company originally used offset data instead of kick tables. However, iirc people reading the assembly code from Puyo Puyo Tetris said that it uses wall kick tables (and not offset data). I assume official Tetris games use kick tables nowadays, and newer versions of the Tetris guideline will include those kick tables to make it easier for the developers. The leaked 2009 guideline didn't include kick tables yet and spoke about rotation points. -- eRR0R 06:20, 10 August 2021 (PDT)