local map={}for x=-4,4 do map[x]={}for y=-4,4 do map[x][y]={x,y}end end local noKickSet,noKickSet_180,pushZero do local Zero={map[0][0]} noKickSet={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero} noKickSet_180={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero,[02]=Zero,[20]=Zero,[13]=Zero,[31]=Zero} function pushZero(t) for _,L in next,t do if type(L)=='table'then for _,v in next,L do if not v[1]or v[1][1]~=0 or v[1][2]~=0 then table.insert(v,1,map[0][0]) end end end end end end --Convert vector string to table local function vecStrConv(list) for k,vecStr in next,list do list[k]=map[tonumber(vecStr:sub(1,2))][tonumber(vecStr:sub(3,4))] end end --Make all vec point to the same vec local function collectSet(set) if type(set)~='table'then return end for _,list in next,set do if type(list[1])=='string'then vecStrConv(list) end end end --Use this if the block is centrosymmetry, *PTR!!! local function centroSymSet(L) L[23]=L[01]L[32]=L[10] L[21]=L[03]L[12]=L[30] L[20]=L[02]L[31]=L[13] end --Use this to copy a symmetry set local function flipList(O) if not O then return end local L={} for i,s in next,O do L[i]=string.char(88-s:byte())..s:sub(2) end return L end local function reflect(a) return{ [03]=flipList(a[01]), [01]=flipList(a[03]), [30]=flipList(a[10]), [32]=flipList(a[12]), [23]=flipList(a[21]), [21]=flipList(a[23]), [10]=flipList(a[30]), [12]=flipList(a[32]), [02]=flipList(a[02]), [20]=flipList(a[20]), [31]=flipList(a[13]), [13]=flipList(a[31]), } end local TRS do local OspinList={ {111,5,2, 0,-1,0},{111,5,2,-1,-1,0},{111,5,0,-1, 0,0},--T {333,5,2,-1,-1,0},{333,5,2, 0,-1,0},{333,5,0, 0, 0,0},--T {313,1,2,-1, 0,0},{313,1,2, 0,-1,0},{313,1,2, 0, 0,0},--Z {131,2,2, 0, 0,0},{131,2,2,-1,-1,0},{131,2,2,-1, 0,0},--S {331,3,2, 0,-1,0},--J(farDown) {113,4,2,-1,-1,0},--L(farDown) {113,3,2,-1,-1,0},{113,3,0, 0, 0,0},--J {331,4,2, 0,-1,0},{331,4,0,-1, 0,0},--L {222,7,2,-1, 0,2},{222,7,2,-2, 0,2},{222,7,2, 0, 0,2},--I {222,7,0,-1, 1,1},{222,7,0,-2, 1,1},{222,7,0, 0, 1,1},--I(high) {121,6,0, 1,-1,2},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},--O {323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},--O }--{keys, ID, dir, dx, dy, freeLevel (0=immovable, 1=U/D-immovable, 2=free)} local XspinList={ {{ 1,-1},{ 1, 0},{ 1, 1},{ 1,-2},{ 1, 2}}, {{ 0,-1},{ 0,-2},{ 0, 1},{ 0,-2},{ 0, 2}}, {{-1,-1},{-1, 0},{-1, 1},{-1,-2},{-1, 2}}, } TRS={ { [01]={"-1+0","-1+1","+0-2","-1+2","+0+1"}, [10]={"+1+0","+1-1","+0+2","+1-2","+1-2"}, [03]={"+1+0","+1+1","+0-2","+1-1","+1-2"}, [30]={"-1+0","-1-1","+0+2","-1+2","+0-1"}, [12]={"+1+0","+1-1","+0+2","+1+2"}, [21]={"-1+0","-1+1","+0-2","-1-2"}, [32]={"-1+0","-1-1","+0+2","-1+2"}, [23]={"+1+0","+1+1","+0-2","+1-2"}, [02]={"+1+0","-1+0","+0-1","+0+1"}, [20]={"-1+0","+1+0","+0+1","+0-1"}, [13]={"+0-1","+0+1","+0-2"}, [31]={"+0+1","+0-1","+0+2"}, },--Z false,--S { [01]={"-1+0","-1+1","+1+0","+0-2","+1+1"}, [10]={"+1+0","+1-1","-1+0","+0+2","+1+2"}, [03]={"+1+0","+1+1","+0-2","+1-2","+1-1","+0+1"}, [30]={"-1+0","-1-1","+0+2","-1+2","+0-1","-1+1"}, [12]={"+1+0","+1-1","+1+1","-1+0","+0-1","+0+2","+1+2"}, [21]={"-1+0","-1+1","-1-1","+1+0","+0+1","+0-2","-1-2"}, [32]={"-1+0","-1-1","+1+0","+0+2","-1+2","-1+1"}, [23]={"+1+0","+1-1","-1+0","+1+1","+0-2","+1-2"}, [02]={"-1+0","+1+0","+0-1","+0+1"}, [20]={"+1+0","-1+0","+0+1","+0-1"}, [13]={"+0-1","+0+1","+1+0"}, [31]={"+0+1","+0-1","-1+0"}, },--J false,--L { [01]={"-1+0","-1+1","+0-2","-1-2","+0+1"}, [10]={"+1+0","+1-1","+0+2","+1+2","+0-1"}, [03]={"+1+0","+1+1","+0-2","+1-2","+0+1"}, [30]={"-1+0","-1-1","+0+2","-1+2","+0-1"}, [12]={"+1+0","+1-1","+0-1","-1-1","+0+2","+1+2"}, [21]={"-1+0","+0-2","-1-2","+1+1"}, [32]={"-1+0","-1-1","+0-1","+1-1","+0+2","-1+2"}, [23]={"+1+0","+0-2","+1-2","-1+1"}, [02]={"-1+0","+1+0","+0+1"}, [20]={"+1+0","-1+0","+0-1"}, [13]={"+0-1","+0+1","+1+0","+0-2","+0+2"}, [31]={"+0-1","+0+1","-1+0","+0-2","+0+2"}, },--T function(P,d) if P.gameEnv.easyFresh then P:freshBlock('fresh') end if P.gameEnv.ospin then local x,y=P.curX,P.curY if y==P.ghoY and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then if P.sound then SFX.play('rotatekick',nil,P:getCenterX()*.15)end P.spinSeq=P.spinSeq%100*10+d if P.spinSeq<100 then return end for i=1,#OspinList do local L=OspinList[i] if P.spinSeq==L[1]then local id,dir=L[2],L[3] local bk=BLOCKS[id][dir] x,y=P.curX+L[4],P.curY+L[5] if not P:ifoverlap(bk,x,y)and( L[6]>0 or(P:ifoverlap(bk,x-1,y)and P:ifoverlap(bk,x+1,y)) )and( L[6]==2 or(P:ifoverlap(bk,x,y-1)and P:ifoverlap(bk,x,y+1)) ) then local C=P.cur C.id=id C.bk=bk P.curX,P.curY=x,y P.cur.dir,P.cur.sc=dir,SCS[id][dir] P.spinLast=2 P.stat.rotate=P.stat.rotate+1 P:freshBlock('move') P.spinSeq=0 return end end end else if P.sound then SFX.play('rotate',nil,P:getCenterX()*.15)end P.spinSeq=0 end else if P.sound then SFX.play('rotate',nil,P:getCenterX()*.15)end end end,--O { [01]={"+0+1","+1+0","-2+0","-2-1","+1+2"}, [10]={"+2+0","-1+0","-1-2","+2+1","+0+1"}, [03]={"+0+1","-1+0","+2+0","+2-1","-1+2"}, [30]={"-2+0","+1+0","+1-2","-2+1","+0+1"}, [12]={"-1+0","+2+0","+2-1","+0-1","-1+2"}, [21]={"-2+0","+1+0","+1-2","-2+1","+0+1"}, [32]={"+1+0","-2+0","-2-1","+0-1","+1+2"}, [23]={"+2+0","-1+0","-1-2","+2+1","+0+1"}, [02]={"-1+0","+1+0","+0-1","+0+1"}, [20]={"+1+0","-1+0","+0+1","+0-1"}, [13]={"+0-1","-1+0","+1+0","+0+1"}, [31]={"+0-1","+1+0","-1+0","+0+1"}, },--I { [01]={"-1+0","+0+1","+1+1","+0-3","+0+2","+0+3","-1+2"}, [10]={"+1+0","+0-1","-1-1","+0-2","+0-3","+0+3","+1-2"}, [03]={"+1+0","+0-3","+0+1","+0+2","+0+3","+1+2"}, [30]={"-1+0","+0+1","+0-2","+0-3","+0+3","-1-2"}, },--Z5 false,--S5 { [01]={"-1+0","-1+1","+0-2","-1-2","-1-1","+0+1"}, [10]={"+1+0","+1-1","+0+2","+1+2","+0-1","+1+1"}, [03]={"+1+0","+1+1","+0-2","-1+1"}, [30]={"-1+0","-1-1","+0+2","-1+2"}, [12]={"+1+0","+1-1","+0+2","+1+2","+1+1"}, [21]={"-1+0","-1-1","-1+1","+0-2","-1-2","-1-1"}, [32]={"-1+0","-1-1","-1+1","+0-1","+0+2","-1+2"}, [23]={"+1+0","+1+1","-1+0","+0-2","+1-2"}, [02]={"-1+0","+0-1","+0+1"}, [20]={"+1+0","+0+1","+0-1"}, [13]={"+1+0","+0+1","-1+0"}, [31]={"-1+0","+0-1","+1+0"}, },--P false,--Q { [01]={"-1+0","+1+0","-1+1","+0-2","+0-3"}, [10]={"+1+0","+1-1","-1+0","+0+2","+0+3"}, [03]={"+1+0","+1-1","+0+1","+0-2","+0-3"}, [30]={"-1+1","+1+0","+0-1","+0+2","+0+3"}, [12]={"+1+0","+0-1","-1+0","+0+2"}, [21]={"-1+0","+0+1","+1+0","+0-2"}, [32]={"-1+0","+0+1","-1+1","+1+0","+0+2","-2+0"}, [23]={"+1+0","+1-1","+0-1","-1+0","+0-2","+2+0"}, [02]={"+1+0","-1+0","-1-1"}, [20]={"-1+0","+1+0","+1+1"}, [13]={"+0-1","-1+1","+0+1"}, [31]={"+0-1","+1-1","+0+1"}, },--F false,--E { [01]={"+0-1","-1-1","+1+0","+1+1","+0-3","-1+0","+0+2","-1+2"}, [10]={"+1+0","+0-1","-1-1","+0-2","-1+1","+0-3","+1-2","+0+1"}, [03]={"+0-1","+1-1","-1+0","-1+1","+0-3","+1+0","+0+2","+1+2"}, [30]={"-1+0","+0-1","+1-1","+0-2","+1+1","+0-3","-1-2","+0+1"}, [12]={"+1+0","-1+0","+0-2","+0-3","+0+1","-1+1"}, [21]={"+1-1","-1+0","+1+0","+0-1","+0+2","+0+3"}, [32]={"-1+0","+1+0","+0-2","+0-3","+0+1","+1+1"}, [23]={"-1-1","+1+0","-1+0","+0-1","+0+2","+0+3"}, [02]={"+0-1","+0+1","+0+2"}, [20]={"+0-1","+0+1","+0-2"}, [13]={"+1+0","-1+1","-2+0"}, [31]={"-1+0","+1+1","+2+0"}, },--T5 { [01]={"-1+0","-1+1","+0-2","-1-2"}, [10]={"+1+0","+1-1","+0+2","+1+2"}, [03]={"+1+0","+1+1","+0-2","+1-2"}, [30]={"-1+0","-1-1","+0-2","-1+2"}, [12]={"+1+0","+1-1","+1+1"}, [21]={"-1-1","-1+1","-1-1"}, [32]={"-1+0","-1-1","-1+1"}, [23]={"+1-1","+1+1","+1-1"}, [02]={"+0+1"}, [20]={"+0-1"}, [13]={"+0-1","+0+1","+1+0"}, [31]={"+0-1","+0+1","-1+0"}, },--U { [01]={"+0+1","-1+0","+0-2","-1-2"}, [10]={"+0+1","+1+0","+0-2","+1-2"}, [03]={"+0-1","+0+1","+0+2"}, [30]={"+0-1","+0+1","+0-2"}, [12]={"+0-1","+0+1"}, [21]={"+0-1","+0-2"}, [32]={"+1+0","-1+0"}, [23]={"-1+0","+1+0"}, [02]={"-1+1","+1-1"}, [20]={"+1-1","-1+1"}, [13]={"+1+1","-1-1"}, [31]={"-1-1","+1+1"}, },--V { [01]={"+0-1","-1+0","+1+0","+1-1","+0+2"}, [10]={"+0-1","-1-1","+0+1","+0-2","+1-2","+0+2"}, [03]={"+1+0","+1+1","+0-1","+0-2","+0-3","+1-1","+0+1","+0+2","+0+3"}, [30]={"-1+0","-1+1","+0-1","+0-2","+0-3","-1-1","+0+1","+0+2","+0+3"}, [12]={"+1+0","+0-1","-2+0","+1+1","-1+0","+0+1","-1-1"}, [21]={"-1+0","+0-1","+2+0","-1+1","+1+0","+0+1","+1-1"}, [32]={"+0-1","+1+0","+0+1","-1+0","-1-1","+0+2"}, [23]={"+0-1","+1-1","+0+1","+0-2","-1-2","+0+2"}, [02]={"+0-1","-1+0"}, [20]={"+0+1","+1+0"}, [13]={"+0+1","-1+0"}, [31]={"+0-1","+1+0"}, },--W function(P,d) if P.type=='human'then SFX.play('rotate',nil,P:getCenterX()*.15)end local kickData=XspinList[d] for test=1,#kickData do local x,y=P.curX+kickData[test][1],P.curY+kickData[test][2] if not P:ifoverlap(P.cur.bk,x,y)then P.curX,P.curY=x,y P.spinLast=1 P:freshBlock('move') P.stat.rotate=P.stat.rotate+1 return end end P:freshBlock('fresh') end,--X { [01]={"-1+0","-1+1","+0-3","-1+1","-1+2","+0+1"}, [10]={"-1+0","+1-1","+0+3","+1-1","+1-2","+0+1"}, [03]={"+0-1","+1-1","-1+0","+1+1","+0-2","+1-2","+0-3","+1-3","-1+1"}, [30]={"+0+1","-1+1","+1+0","-1-1","+0+2","-1+2","+0+3","-1+3","+1-1"}, [12]={"+1+0","+1-1","+0-1","+1-2","+0-2","+1+1","-1+0","+0+2","+1+2"}, [21]={"-1+0","-1+1","+0+1","-1+2","+0+2","-1-1","+1+0","+0-2","-1-2"}, [32]={"-1+0","-1+1","-1-1","+1+0","+0+2","-1+2","+0-2"}, [23]={"+1+0","+1-1","+1+1","-1+0","+0-2","+1-2","+0+2"}, [02]={"+0-1","+1-1","-1+0","+2-1"}, [20]={"+0+1","-1+1","+1+0","-2+1"}, [13]={"-1+0","-1-1","+0+1","-1-2"}, [31]={"+1+0","+1+1","+0-1","+1+2"}, },--J5 false,--L5 { [01]={"-1+0","-1+0","-1+1","+1+0","-1+2","-1-1","+0-3","+0+1"}, [10]={"-1+0","+1+0","+1-1","+1+0","+1-2","+1+1","+0+3","+0+1"}, [03]={"+0-1","+1+0","+1-1","-1+0","+1+1","+0-2","+1-2","+0-3","+1-3","-1+1"}, [30]={"+0+1","-1+0","-1+1","+1+0","-1-1","+0+2","-1+2","+0+3","-1+3","+1-1"}, [12]={"+1+0","+1-1","+0-1","+1-2","+0-2","+1+1","-1+0","+0+2","+1+2"}, [21]={"-1+0","-1+1","+0+1","-1+2","+0+2","-1-1","+1+0","+0-2","-1-2"}, [32]={"+0-1","-1+0","-1+1","-1-1","+1+0","+0+2","-1+2","+0-2"}, [23]={"+0+1","+1+0","+1-1","+1+1","-1+0","+0-2","+1-2","+0+2"}, [02]={"+0-1","+1-1","-1+0","+2-1","+0+1"}, [20]={"+0+1","-1+1","+1+0","-2+1","+0-1"}, [13]={"-1+0","-1-1","+0+1","-1-2"}, [31]={"+1+0","+1+1","+0-1","+1+2"}, },--R false,--Y { [01]={"-1+0","-1+1","+0+1","+1+0","-1+2","-2+0","+0-2"}, [10]={"+1+0","-1+0","+0-1","+1-1","+1-2","+2+0","+0+2"}, [03]={"-1+0","+1-1","+0-2","+0-3","+1+0","+1-2","+1-3","+0+1","-1+1"}, [30]={"-1+0","+1-1","+1-2","+1+0","+0-2","+1-3","-1+2","+0+3","-1+3"}, [12]={"-1+0","+1-1","-1-1","+1-2","+1+0","+0-2","+1-3","-1+2","+0+3","-1+3"}, [21]={"-1+0","+1-1","+1+1","+0-2","+0-3","+1+0","+1-2","+1-3","+0+1","-1+1"}, [32]={"-1+0","+0-1","-1-2","+1-1","+1+0","+1+1","+0+2","+0+3"}, [23]={"+0-2","+0-3","+1+2","+1+0","+0+1","-1+1","+0-1","+0+2"}, [02]={"-1+0","+0+2","+0-1"}, [20]={"+1+0","+0-2","+0+1"}, [13]={"-1+0","-1-1","+0+1","+1+2"}, [31]={"+1+0","+1+1","+0-1","-1-2"}, },--N false,--H { [01]={"+1-1","+1+0","+1+1","+0+1","-1+1","-1+0","-1-1","+0-1","+0-2","-2-1","-2-2","+2+0","+2-1","+2-2","+1+2","+2+2","-1+2","-2+2"}, [10]={"-1+0","-1-1","+0-1","+1-1","-2-2","-2-1","-2+0","-1-2","+0-2","+1-2","+2-2","-1+1","-2+1","-2+2","+1+0","+2+0","+2-1","+0+1","+1-1","+2-2"}, [03]={"-1-1","-1+0","-1+1","-0+1","+1+1","+1+0","+1-1","-0-1","-0-2","+2-1","+2-2","-2+0","-2-1","-2-2","-1+2","-2+2","+1+2","+2+2"}, [30]={"+1+0","+1-1","-0-1","-1-1","+2-2","+2-1","+2+0","+1-2","-0-2","-1-2","-2-2","+1+1","+2+1","+2+2","-1+0","-2+0","-2-1","+0+1","-1-1","-2-2"}, },--I5 { [01]={"-1+0","-1-1","+1+1","-1+1"}, [10]={"-1+0","+1+0","-1-1","+1+1"}, [03]={"+1+0","+1-1","-1+1","+1+1"}, [30]={"+1+0","-1+0","+1-1","-1+1"}, },--I3 { [01]={"-1+0","+1+0"}, [10]={"+1+0","-1+0"}, [03]={"+0+1","+0-1"}, [30]={"+0-1","+0+1"}, [12]={"+0+1","+0-1"}, [21]={"+0-1","+0+1"}, [32]={"-1+0","+1+0"}, [23]={"+1+0","-1+0"}, [02]={"+0-1","+1-1","-1-1"}, [20]={"+0+1","-1+1","+1+1"}, [13]={"+0-1","-1-1","+1-1"}, [31]={"+0+1","+1+1","-1+1"}, },--C { [01]={"-1+0","+0+1"}, [10]={"+1+0","+0+1"}, [03]={"+1+0","+0+1"}, [30]={"-1+0","+0+1"}, [12]={"+1+0","+0+2"}, [21]={"+0-1","-1+0"}, [32]={"-1+0","+0+2"}, [23]={"+0-1","-1+0"}, [02]={"+0-1","+0+1"}, [20]={"+0+1","+0-1"}, [13]={"-1+0","+1+0"}, [31]={"+1+0","-1+0"}, },--I2 nil,--O1 } TRS[2]= reflect(TRS[1])--SZ TRS[4]= reflect(TRS[3])--LJ TRS[9]= reflect(TRS[8])--S5Z5 TRS[11]=reflect(TRS[10])--PQ TRS[13]=reflect(TRS[12])--FE TRS[20]=reflect(TRS[19])--L5J5 TRS[22]=reflect(TRS[21])--RY TRS[24]=reflect(TRS[23])--NH centroSymSet(TRS[8])centroSymSet(TRS[9])--S5Z5 centroSymSet(TRS[25])centroSymSet(TRS[26])--I5I3 for i=1,29 do collectSet(TRS[i])end pushZero(TRS) end local SRS do SRS={ { [01]={"-1+0","-1+1","+0-2","-1-2"}, [10]={"+1+0","+1-1","+0+2","+1+2"}, [03]={"+1+0","+1+1","+0-2","+1-2"}, [30]={"-1+0","-1-1","+0+2","-1+2"}, [12]={"+1+0","+1-1","+0+2","+1+2"}, [21]={"-1+0","-1+1","+0-2","-1-2"}, [32]={"-1+0","-1-1","+0+2","-1+2"}, [23]={"+1+0","+1+1","+0-2","+1-2"}, [02]={},[20]={},[13]={},[31]={}, },--Z false,--S false,--J false,--L false,--T noKickSet,--O { [01]={"-2+0","+1+0","-2-1","+1+2"}, [10]={"+2+0","-1+0","+2+1","-1-2"}, [12]={"-1+0","+2+0","-1+2","+2-1"}, [21]={"+1+0","-2+0","+1-2","-2+1"}, [23]={"+2+0","-1+0","+2+1","-1-2"}, [32]={"-2+0","+1+0","-2-1","+1+2"}, [30]={"+1+0","-2+0","+1-2","-2+1"}, [03]={"-1+0","+2+0","-1+2","+2-1"}, [02]={},[20]={},[13]={},[31]={}, }--I } collectSet(SRS[1]) collectSet(SRS[7]) pushZero(SRS) for i=2,5 do SRS[i]=SRS[1]end for i=8,29 do SRS[i]=SRS[1]end end local C2 do local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"} vecStrConv(L) C2={ { [01]=L,[10]=L,[12]=L,[21]=L, [23]=L,[32]=L,[30]=L,[03]=L, [02]=L,[20]=L,[13]=L,[31]=L, } } for i=2,29 do C2[i]=C2[1]end end local C2sym do local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"} local R={"+0+0","+1+0","-1+0","+0-1","+1-1","-1-1","+2+0","-2+0"} local Z={ [01]=R,[10]=L,[03]=L,[30]=R, [12]=R,[21]=L,[32]=L,[23]=R, [02]=R,[20]=L,[13]=L,[31]=R, } local S=reflect(Z) collectSet(Z) collectSet(S) C2sym={ Z,S,--Z,S Z,S,--J,L Z,--T noKickSet,--O Z,--I Z,S,--Z5,S5 Z,S,--P,Q Z,S,--F,E Z,Z,Z,Z,--T5,U,V,W noKickSet,--X Z,S,--J5,L5 Z,S,--R,Y Z,S,--N,H Z,Z,--I3,C Z,Z,--I2,O1 } end local Classic={} for i=1,29 do Classic[i]=noKickSet end local None={} for i=1,29 do None[i]=noKickSet_180 end return{ TRS=TRS, SRS=SRS, C2=C2, C2sym=C2sym, Classic=Classic, None=None, }