Files
Techmino/parts/kickList.lua

670 lines
20 KiB
Lua

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 id,set in next,t do
if type(id)=='number'and type(set)=='table'then
for _,R in next,set do
if not R[1]or R[1][1]~=0 or R[1][2]~=0 then
table.insert(R,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
return list
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
{131,1,2,-1, 0,0},{131,1,2, 0,-1,0},{131,1,2, 0, 0,0},--Z(misOrder)
{313,2,2, 0, 0,0},{313,2,2,-1,-1,0},{313,2,2,-1, 0,0},--S(misOrder)
{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={
centerDisp=TABLE.new(true,29),
{
[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','+1+1'},
[21]={'-1+0','+0-2','-1-2','-1-1','+1+1'},
[32]={'-1+0','-1-1','+0-1','+1-1','+0+2','-1+2','-1+1'},
[23]={'+1+0','+0-2','+1-2','+1-1','-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]={'+0+1','+1+1','-1+0','+0-3','+0+2','+0-2','+0+3','-1+2'},
[10]={'+0-1','-1-1','+1+0','+0-3','+0+2','+0-2','+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-2'},
[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.centerDisp[6]=false
TRS.centerDisp[18]=false
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 BiRS
do
local R=vecStrConv{'+0+0','-1+0','-1-1','+0-1','-1+1','+1-1','+1+0','+0+1','+1+1','+0+2','-1+2','+1+2','-2+0','+2+0'}
local L=vecStrConv{'+0+0','+1+0','+1-1','+0-1','+1+1','-1-1','-1+0','+0+1','-1+1','+0+2','+1+2','-1+2','+2+0','-2+0'}
local F=vecStrConv{'+0+0','+0-1','+0+1','+0+2'}
local list={
{[02]=L,[20]=R,[13]=R,[31]=L},--Z
{[02]=R,[20]=L,[13]=L,[31]=R},--S
{[02]=L,[20]=R,[13]=L,[31]=R},--J
{[02]=R,[20]=L,[13]=L,[31]=R},--L
{[02]=F,[20]=F,[13]=L,[31]=R},--T
{[02]=F,[20]=F,[13]=F,[31]=F},--O
{[02]=F,[20]=F,[13]=R,[31]=L},--I
{[02]=L,[20]=L,[13]=R,[31]=R},--Z5
{[02]=R,[20]=R,[13]=L,[31]=L},--S5
{[02]=L,[20]=R,[13]=L,[31]=R},--P
{[02]=R,[20]=L,[13]=R,[31]=L},--Q
{[02]=R,[20]=L,[13]=L,[31]=R},--F
{[02]=L,[20]=R,[13]=R,[31]=L},--E
{[02]=F,[20]=F,[13]=L,[31]=R},--T5
{[02]=F,[20]=F,[13]=L,[31]=R},--U
{[02]=R,[20]=L,[13]=L,[31]=R},--V
{[02]=R,[20]=L,[13]=L,[31]=R},--W
{[02]=F,[20]=F,[13]=F,[31]=F},--X
{[02]=L,[20]=R,[13]=R,[31]=L},--J5
{[02]=R,[20]=L,[13]=L,[31]=R},--L5
{[02]=L,[20]=R,[13]=R,[31]=L},--R
{[02]=R,[20]=L,[13]=L,[31]=R},--Y
{[02]=L,[20]=R,[13]=R,[31]=L},--N
{[02]=R,[20]=L,[13]=L,[31]=R},--H
{[02]=F,[20]=F,[13]=F,[31]=F},--I5
{[02]=F,[20]=F,[13]=F,[31]=F},--I3
{[02]=R,[20]=L,[13]=L,[31]=R},--C
{[02]=F,[20]=F,[13]=R,[31]=L},--I2
{[02]=F,[20]=F,[13]=F,[31]=F},--O1
}
for i=1,29 do
local a,b=R,L
if i==6 or i==18 then a,b=b,a end
list[i][01]=a;list[i][10]=b;list[i][03]=b;list[i][30]=a
list[i][12]=a;list[i][21]=b;list[i][32]=b;list[i][23]=a
end
BiRS=TABLE.new(function(P,d,ifpre)
local C=P.cur
local idir=(C.dir+d)%4
local kickList=list[C.id][C.dir*10+idir]
local icb=BLOCKS[C.id][idir]
local isc=SCS[C.id][idir]
local ix,iy=P.curX+C.sc[2]-isc[2],P.curY+C.sc[1]-isc[1]
local dx,dy=0,0 do
local pressing=P.keyPressing
if pressing[1]and P:ifoverlap(C.bk,P.curX-1,P.curY)then dx=dx-1 end
if pressing[2]and P:ifoverlap(C.bk,P.curX+1,P.curY)then dx=dx+1 end
if pressing[7]and P:ifoverlap(C.bk,P.curX,P.curY-1)then dy= -1 end
end
while true do
for test=1,#kickList do
local fdx,fdy=kickList[test][1]+dx,kickList[test][2]+dy
if
dx*fdx>=0 and
fdx^2+fdy^2<=5 and
(P.freshTime>0 or fdy<=0)
then
local x,y=ix+fdx,iy+fdy
if not P:ifoverlap(icb,x,y)then
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX()
end
P.curX,P.curY,C.dir=x,y,idir
C.sc,C.bk=isc,icb
P.spinLast=test==2 and 0 or 1
local t=P.freshTime
if not ifpre then
P:freshBlock('move')
end
if fdy>0 and P.freshTime==t and P.curY~=P.imgY then
P.freshTime=P.freshTime-1
end
if P.sound then
local sfx
if ifpre then
sfx='prerotate'
elseif P:ifoverlap(icb,x,y+1)and P:ifoverlap(icb,x-1,y)and P:ifoverlap(icb,x+1,y)then
sfx='rotatekick'
if P.gameEnv.shakeFX then
if d==1 or d==3 then
P.fieldOff.va=P.fieldOff.va+(2-d)*P.gameEnv.shakeFX*6e-3
else
P.fieldOff.va=P.fieldOff.va+P:getCenterX()*P.gameEnv.shakeFX*3e-3
end
end
else
sfx='rotate'
end
SFX.play(sfx,nil,P:getCenterX()*.15)
end
P.stat.rotate=P.stat.rotate+1
return
end
end
end
--Try release left/right, then softdrop, failed to rotate otherwise
if dx~=0 then
dx=0
elseif dy~=0 then
dy=0
else
return
end
end
end,29)
end
local ASC
do
local L={"+1+0","+0-1","+1-1","+0-2","+1-2","+2+0","+2-1","+2-2","-1+0","-1-1","+0+1","+1+1","+2+1","-1-2","-2+0","+0+2","+1+2","+2+2","-2-1","-2-2"}
local R=flipList(L)
vecStrConv(L)vecStrConv(R)
ASC={
{
[01]=R,[10]=L,[03]=L,[30]=R,
[12]=R,[21]=L,[32]=L,[23]=R,
[02]=noKickSet_180,[20]=noKickSet_180,[13]=noKickSet_180,[31]=noKickSet_180,
}
}
for i=2,29 do ASC[i]=ASC[1]end
end
local ASCplus
do
local L={"+1+0","+0-1","+1-1","+0-2","+1-2","+2+0","+2-1","+2-2","-1+0","-1-1","+0+1","+1+1","+2+1","-1-2","-2+0","+0+2","+1+2","+2+2","-2-1","-2-2"}
local R=flipList(L)
local F={"-1+0","+1+0","+0-1","-1-1","+1-1","+0-2","-1-2","+1-2","-2+0","+2+0","-2-1","+2-1","-2+1","+2+1","+0+2","-1+2","+1+2"}
vecStrConv(L)vecStrConv(R)vecStrConv(F)
ASCplus={
{
[01]=R,[12]=R,[23]=R,[30]=R,
[10]=L,[21]=L,[32]=L,[03]=L,
[02]=F,[20]=F,[13]=F,[31]=F,
}
}
for i=2,29 do ASCplus[i]=ASCplus[1]end
end
local C2
do
local L=vecStrConv{'+0+0','-1+0','+1+0','+0-1','-1-1','+1-1','-2+0','+2+0'}
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,--I5
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
local RS={
TRS=TRS,
SRS=SRS,
BiRS=BiRS,
ASC=ASC,
ASCplus=ASCplus,
C2=C2,
C2sym=C2sym,
Classic=Classic,
None=None,
}
for _,v in next,RS do
if not v.centerDisp then
v.centerDisp=TABLE.new(true,29)
end
end
return RS