Merge branch '26F-Studio-main'

This commit is contained in:
Trebor-Huang
2021-08-09 14:16:00 +08:00
179 changed files with 2232 additions and 1933 deletions

View File

@@ -9,6 +9,14 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- name: GetCommitID
run: |
$CommitID=git rev-parse --short "${{ GITHUB.SHA }}"
echo "CommitID=${CommitID}" >> $env:GITHUB_ENV
- name: GetVersion
run: |
$Version=python .github/workflows/getVersion.py
echo "Version=${Version}" >> $env:GITHUB_ENV
- name: Download love
run: |
curl -OL https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
@@ -26,16 +34,24 @@ jobs:
copy /b love-11.3-win64\love.exe + game.love love-11.3-win64\Techmino.exe
del love-11.3-win64\love.exe
del love-11.3-win64\lovec.exe
- name: Artifact
uses: actions/upload-artifact@v1.0.0
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Windows
name: Techmino_${{ env.Version }}_${{ env.CommitID }}_Windows
path: love-11.3-win64
build-linux:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: GetCommitID
run: |
CommitID=$(git rev-parse --short "${{ GITHUB.SHA }}")
echo "CommitID=${CommitID}" >> $GITHUB_ENV
- name: GetVersion
run: |
Version=$(python3 .github/workflows/getVersion.py)
echo "Version=${Version}" >> $GITHUB_ENV
- name: Download AppImageKit
run: curl -OL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage
- name: Unpack and Repack
@@ -49,16 +65,24 @@ jobs:
cd ../../../..
cp -r document media parts Zframework conf.lua font.ttf main.lua squashfs-root/usr/share/Techmino
./appimagetool-x86_64.AppImage squashfs-root Techmino.AppImage
- name: Artifact
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Linux
name: Techmino_${{ env.Version }}_${{ env.CommitID }}_Linux
path: Techmino.AppImage
build-android:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: GetCommitID
run: |
CommitID=$(git rev-parse --short "${{ GITHUB.SHA }}")
echo "CommitID=${CommitID}" >> $GITHUB_ENV
- name: GetVersion
run: |
Version=$(python3 .github/workflows/getVersion.py)
echo "Version=${Version}" >> $GITHUB_ENV
- name: Download Apktool
run: curl -OL https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.5.0.jar
- name: Unpack and Repack
@@ -68,7 +92,7 @@ jobs:
7z x -o. apk/assets/game.love libAndroid
rm apk/assets/game.love Techmino.apk
7z a -tzip apk/assets/game.love document libAndroid media parts Zframework conf.lua font.ttf main.lua
python3 .github/workflows/updateVersion.py
python3 .github/workflows/updateAndroidVersion.py
java -jar apktool_2.5.0.jar b -o Techmino.apk apk
- uses: 26F-Studio/sign-android-release@master
name: Sign app APK
@@ -81,18 +105,27 @@ jobs:
keyPassword: ${{ secrets.KEY_PASSWORD }}
env:
BUILD_TOOLS_VERSION: "30.0.2"
- name: Artifact
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Android
name: Techmino_${{ env.Version }}_${{ env.CommitID }}_Android
path: ${{steps.sign_app.outputs.signedReleaseFile}}
build-macOS:
runs-on: macos-10.15
steps:
- uses: actions/checkout@v2
- name: GetCommitID
run: |
CommitID=$(git rev-parse --short "${{ GITHUB.SHA }}")
echo "CommitID=${CommitID}" >> $GITHUB_ENV
- name: GetVersion
run: |
Version=$(python3 .github/workflows/getVersion.py)
echo "Version=${Version}" >> $GITHUB_ENV
- name: Pack love
run : zip -r Techmino.love document media parts Zframework conf.lua font.ttf main.lua
run: |
zip -r Techmino.love document media parts Zframework conf.lua font.ttf main.lua
- name: Download template
run: |
curl -OL https://github.com/26F-Studio/Techmino/releases/download/v0.15.1/Techmino.app.zip
@@ -116,11 +149,8 @@ jobs:
security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PWD -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k Techminohaowan build.keychain
/usr/bin/codesign --force --deep -s 79B81FC5EA155243C973B5417B0996501F00EF55 ./Techmino.app -v
- name: Pack Techmino
run: |
zip -r -y Techmino-Packed.app.zip Techmino.app
- name: Artifact
uses: actions/upload-artifact@v1.0.0
- name: Upload
uses: actions/upload-artifact@v2
with:
name: macOS
path: Techmino-Packed.app.zip
name: Techmino_${{ env.Version }}_${{ env.CommitID }}_macOS
path: Techmino-Packed.app

11
.github/workflows/getVersion.py vendored Normal file
View File

@@ -0,0 +1,11 @@
import re
def getVersion():
with open("conf.lua", "r", encoding="utf-8") as file:
data = file.read()
versionCode = re.search("build=(\\d+)", data).group()
versionName = re.search('(?<=string=").*(?=@)', data).group()
return versionCode, versionName
if __name__ == "__main__":
versionCode, versionName = getVersion()
print (versionName)

View File

@@ -1,12 +1,12 @@
import re
with open("conf.lua", "r") as file:
data = file.read()
versionCode = re.search("build=(\\d+)", data).group(1)
versionName = re.search('short="([^"]+)', data).group(1)
import getVersion
versionCode, versionName = getVersion.getVersion()
with open("apk/apktool.yml", "r+") as file:
data = file.read()
data = re.sub("versionCode:.+", f"versionCode: '{versionCode}'", data)
data = re.sub("versionName:.+", f"versionName: {versionName}", data)
file.seek(0)
file.truncate()
file.write(data)
file.write(data)

View File

@@ -1,4 +1,5 @@
import re, datetime
import getVersion
info = r"""<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
@@ -57,9 +58,8 @@ info = r"""<?xml version="1.0" encoding="UTF-8"?>
</plist>
"""
with open("conf.lua", "r") as file:
data = file.read()
versionName = re.search('short="([^"]+)', data).group(1)
versionCode, versionName = getVersion.getVersion()
print("Updating to", versionName)
with open("Techmino.app/Contents/info.plist", "w") as file:
file.write(info % (versionName, datetime.datetime.today().year))

View File

@@ -5,4 +5,4 @@
集合各种现代方块规则,更多玩法,全新体验。
官网(建设中) https://home.techmino.org
官网(建设中) http://home.techmino.org

View File

@@ -1,6 +1,6 @@
local gc_clear=love.graphics.clear
local BGs={
none={draw=function()gc_clear(.15,.15,.15)end}
none={draw=function()gc_clear(.08,.08,.084)end}
}
local BGlist={'none'}
local BG={

View File

@@ -1,60 +1,60 @@
local COLOR={
red= {1.0, 0.0, 0.0},
fire= {1.0, 0.4, 0.0},
orange= {1.0, 0.6, 0.0},
yellow= {1.0, 1.0, 0.0},
lime= {0.7, 1.0, 0.0},
jade= {0.5, 1.0, 0.0},
green= {0.0, 1.0, 0.0},
aqua= {0.0, 1.0, 0.6},
cyan= {0.0, 1.0, 1.0},
navy= {0.0, 0.7, 1.0},
sea= {0.0, 0.4, 1.0},
blue= {0.2, 0.2, 1.0},
violet= {0.4, 0.0, 1.0},
purple= {0.7, 0.0, 1.0},
magenta= {1.0, 0.0, 1.0},
wine= {1.0, 0.0, 0.5},
red= {.92, .12, .12},
fire= {.92, 0.4, .12},
orange= {.92, 0.6, .12},
yellow= {.92, .92, .12},
lime= {0.7, .92, .12},
jade= {0.5, .92, .12},
green= {.12, .92, .12},
aqua= {.12, .92, 0.6},
cyan= {.12, .92, .92},
navy= {.12, 0.7, .92},
sea= {.12, 0.4, .92},
blue= {0.2, 0.2, .92},
violet= {0.4, .12, .92},
purple= {0.7, .12, .92},
magenta= {.92, .12, .92},
wine= {.92, .12, 0.5},
lRed= {1.0, 0.5, 0.5},
lFire= {1.0, 0.7, 0.5},
lOrange= {1.0, 0.8, 0.3},
lYellow= {1.0, 1.0, 0.5},
lLime= {0.8, 1.0, 0.4},
lJade= {0.6, 1.0, 0.4},
lGreen= {0.5, 1.0, 0.5},
lAqua= {0.4, 1.0, 0.7},
lCyan= {0.5, 1.0, 1.0},
lNavy= {0.5, 0.8, 1.0},
lSea= {0.4, 0.7, 1.0},
lBlue= {0.7, 0.7, 1.0},
lViolet= {0.7, 0.4, 1.0},
lPurple= {0.8, 0.4, 1.0},
lMagenta= {1.0, 0.5, 1.0},
lWine= {1.0, 0.4, 0.7},
lRed= {.95, 0.5, 0.5},
lFire= {.95, 0.7, 0.5},
lOrange= {.95, 0.8, 0.3},
lYellow= {.95, .95, 0.5},
lLime= {0.8, .95, 0.4},
lJade= {0.6, .95, 0.4},
lGreen= {0.5, .95, 0.5},
lAqua= {0.4, .95, 0.7},
lCyan= {0.5, .95, .95},
lNavy= {0.4, .85, .95},
lSea= {0.5, 0.7, .95},
lBlue= {0.7, 0.7, .95},
lViolet= {0.7, 0.4, .95},
lPurple= {0.8, 0.4, .95},
lMagenta= {.95, 0.5, .95},
lWine= {.95, 0.4, 0.7},
dRed= {0.6, 0.0, 0.0},
dFire= {0.6, 0.3, 0.0},
dOrange= {0.6, 0.4, 0.0},
dYellow= {0.6, 0.6, 0.0},
dLime= {0.5, 0.6, 0.0},
dJade= {0.3, 0.6, 0.0},
dGreen= {0.0, 0.6, 0.0},
dAqua= {0.0, 0.6, 0.4},
dCyan= {0.0, 0.6, 0.6},
dNavy= {0.0, 0.4, 0.6},
dSea= {0.0, 0.2, 0.6},
dRed= {0.6, .08, .08},
dFire= {0.6, 0.3, .08},
dOrange= {0.6, 0.4, .08},
dYellow= {0.6, 0.6, .08},
dLime= {0.5, 0.6, .08},
dJade= {0.3, 0.6, .08},
dGreen= {.08, 0.6, .08},
dAqua= {.08, 0.6, 0.4},
dCyan= {.08, 0.6, 0.6},
dNavy= {.08, 0.4, 0.6},
dSea= {.08, 0.2, 0.6},
dBlue= {0.1, 0.1, 0.6},
dViolet= {0.2, 0.0, 0.6},
dPurple= {0.4, 0.0, 0.6},
dMagenta= {0.6, 0.0, 0.6},
dWine= {0.6, 0.0, 0.3},
dViolet= {0.2, .08, 0.6},
dPurple= {0.4, .08, 0.6},
dMagenta= {0.6, .08, 0.6},
dWine= {0.6, .08, 0.3},
black= {0.0, 0.0, 0.0},
black= {.05, .05, .05},
dGray= {0.3, 0.3, 0.3},
gray= {0.6, 0.6, 0.6},
lGray= {0.8, 0.8, 0.8},
white= {1.0, 1.0, 1.0},
white= {.97, .97, .97},
}
for k,v in next,{
R='red',F='fire',O='orange',Y='yellow',L='lime',J='jade',G='green',A='aqua',C='cyan',N='navy',S='sea',B='blue',V='violet',P='purple',M='magenta',W='wine',

View File

@@ -1,6 +1,7 @@
local setColor=love.graphics.setColor
local printf=love.graphics.printf
local draw=love.graphics.draw
local gc=love.graphics
local setColor=gc.setColor
local printf=gc.printf
local draw=gc.draw
local GC={}
function GC.str(obj,x,y)printf(obj,x-626,y,1252,'center')end
function GC.simpX(obj,x,y)draw(obj,x-obj:getWidth()*.5,y)end
@@ -31,4 +32,129 @@ function GC.shadedPrint(str,x,y,mode,d,clr1,clr2)
setColor(clr2 or COLOR.Z)
printf(str,x,y,w,mode)
end
function GC.regularPolygon(mode,x,y,R,segments,r,phase)
local X,Y={},{}
local ang=phase or 0
local angStep=6.283185307179586/segments
for i=1,segments do
X[i]=x+R*math.cos(ang)
Y[i]=y+R*math.sin(ang)
ang=ang+angStep
end
X[segments+1]=x+R*math.cos(ang)
Y[segments+1]=y+R*math.sin(ang)
local halfAng=6.283185307179586/segments/2
local erasedLen=r*math.tan(halfAng)
if mode=='line'then
erasedLen=erasedLen+1--Fix 1px cover
for i=1,segments do
--Line
local x1,y1,x2,y2=X[i],Y[i],X[i+1],Y[i+1]
local dir=math.atan2(y2-y1,x2-x1)
gc.line(x1+erasedLen*math.cos(dir),y1+erasedLen*math.sin(dir),x2-erasedLen*math.cos(dir),y2-erasedLen*math.sin(dir))
--Arc
ang=ang+angStep
local R2=R-r/math.cos(halfAng)
local arcCX,arcCY=x+R2*math.cos(ang),y+R2*math.sin(ang)
gc.arc('line','open',arcCX,arcCY,r,ang-halfAng,ang+halfAng)
end
elseif mode=='fill'then
local L={}
for i=1,segments do
--Line
local x1,y1,x2,y2=X[i],Y[i],X[i+1],Y[i+1]
local dir=math.atan2(y2-y1,x2-x1)
table.insert(L,x1+erasedLen*math.cos(dir))
table.insert(L,y1+erasedLen*math.sin(dir))
table.insert(L,x2-erasedLen*math.cos(dir))
table.insert(L,y2-erasedLen*math.sin(dir))
--Arc
ang=ang+angStep
local R2=R-r/math.cos(halfAng)
local arcCX,arcCY=x+R2*math.cos(ang),y+R2*math.sin(ang)
gc.arc('fill','open',arcCX,arcCY,r,ang-halfAng,ang+halfAng)
end
gc.polygon('fill',L)
else
error("Draw mode should be 'line' or 'fill'")
end
end
do--function GC.DO(L)
local cmds={
origin="origin",
move="translate",
scale="scale",
rotate="rotate",
shear="shear",
clear="clear",
setCL="setColor",
setCM="setColorMask",
setLW="setLineWidth",
setLS="setLineStyle",
setLJ="setLineJoin",
print="print",
setFT=setFont,
mText=GC.str,
mDraw=GC.draw,
mOutDraw=GC.outDraw,
draw="draw",
line="line",
fRect=function(...)gc.rectangle('fill',...)end,
dRect=function(...)gc.rectangle('line',...)end,
fCirc=function(...)gc.circle('fill',...)end,
dCirc=function(...)gc.circle('line',...)end,
fElps=function(...)gc.ellipse('fill',...)end,
dElps=function(...)gc.ellipse('line',...)end,
fPoly=function(...)gc.polygon('fill',...)end,
dPoly=function(...)gc.polygon('line',...)end,
dPie=function(...)gc.arc('line',...)end,
dArc=function(...)gc.arc('line','open',...)end,
dBow=function(...)gc.arc('line','closed',...)end,
fPie=function(...)gc.arc('fill',...)end,
fArc=function(...)gc.arc('fill','open',...)end,
fBow=function(...)gc.arc('fill','closed',...)end,
fRPol=function(...)GC.regularPolygon('fill',...)end,
dRPol=function(...)GC.regularPolygon('line',...)end,
}
local sizeLimit=gc.getSystemLimits().texturesize
function GC.DO(L)
gc.push()
::REPEAT_tryAgain::
local success,canvas=pcall(gc.newCanvas,math.min(L[1],sizeLimit),math.min(L[2],sizeLimit))
if not success then
sizeLimit=math.floor(sizeLimit*.8)
goto REPEAT_tryAgain
end
gc.setCanvas(canvas)
gc.origin()
gc.setColor(1,1,1)
gc.setLineWidth(1)
for i=3,#L do
local cmd=L[i][1]
if type(cmd)=='boolean'and cmd then
table.remove(L[i],1)
cmd=L[i][1]
end
if type(cmd)=='string'then
local func=cmds[cmd]
if type(func)=='string'then func=gc[func]end
if func then
func(unpack(L[i],2))
else
error("No gc command: "..cmd)
end
end
end
gc.setCanvas()
gc.pop()
return canvas
end
end
return GC

View File

@@ -25,7 +25,6 @@ VIB= require'Zframework.vibrate'
SFX= require'Zframework.sfx'
LIGHT= require'Zframework.light'
DOGC= require'Zframework.doGC'
BG= require'Zframework.background'
WIDGET= require'Zframework.widget'
TEXT= require'Zframework.text'
@@ -66,7 +65,7 @@ joysticks={}
local devMode
local batteryImg=DOGC{31,20,
local batteryImg=GC.DO{31,20,
{'fRect',1,0,26,2},
{'fRect',1,18,26,2},
{'fRect',0,1,2,18},
@@ -97,12 +96,12 @@ local function updatePowerInfo()
gc.rectangle('fill',76,6,pow*.22,14)
if pow<100 then
setFont(15)
gc_setColor(0,0,0)
gc.setColor(COLOR.D)
gc_print(pow,77,1)
gc_print(pow,77,3)
gc_print(pow,79,1)
gc_print(pow,79,3)
gc_setColor(1,1,1)
gc_setColor(COLOR.Z)
gc_print(pow,78,2)
end
end
@@ -149,10 +148,10 @@ end
function love.mousereleased(x,y,k,touch)
if touch or SCN.swapping then return end
mx,my=ITP(xOy,x,y)
if SCN.mouseUp then SCN.mouseUp(mx,my,k)end
if WIDGET.sel then
WIDGET.release(mx,my)
else
if SCN.mouseUp then SCN.mouseUp(mx,my,k)end
if lastX and SCN.mouseClick and(mx-lastX)^2+(my-lastY)^2<62 then
SCN.mouseClick(mx,my,k)
end
@@ -496,28 +495,28 @@ local wsBottomImage do
ins(L,{'setCL',1,1,1,i*.005})
ins(L,{'fRect',i,0,1,18})
end
wsBottomImage=DOGC(L)
wsBottomImage=GC.DO(L)
end
local ws_deadImg=DOGC{20,20,
local ws_deadImg=GC.DO{20,20,
{'setFT',20},
{'setCL',1,.3,.3},
{'print',"X",3,-4},
}
local ws_connectingImg=DOGC{20,20,
local ws_connectingImg=GC.DO{20,20,
{'setLW',3},
{'dArc',11.5,10,6.26,1,5.28},
}
local ws_runningImg=DOGC{20,20,
local ws_runningImg=GC.DO{20,20,
{'setFT',20},
{'setCL',.5,1,0},
{'print',"R",3,-4},
}
local cursorImg=DOGC{16,16,
local cursorImg=GC.DO{16,16,
{'fCirc',8,8,4},
{'setCL',1,1,1,.7},
{'fCirc',8,8,6},
}
local cursor_holdImg=DOGC{16,16,
local cursor_holdImg=GC.DO{16,16,
{'setLW',2},
{'dCirc',8,8,7},
{'fCirc',8,8,3},
@@ -603,7 +602,7 @@ function love.run()
local R=int((time+1)/2)%7+1
_=minoColor[SETTING.skin[R]]
gc_setColor(_[1],_[2],_[3],min(abs(1-time%2),.3))
_=SCS[R][0]
_=DSCP[R][0]
gc_draw(TEXTURE.miniBlock[R],mx,my,time%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5)
gc_setColor(1,1,1)
gc_draw(ms.isDown(1)and cursor_holdImg or cursorImg,mx,my,nil,nil,nil,8,8)
@@ -657,11 +656,11 @@ function love.run()
gc_line(x,0,x,SCR.h)
gc_line(0,y,SCR.w,y)
local t=int(mx+.5)..","..int(my+.5)
gc_setColor(0,0,0)
gc.setColor(COLOR.D)
gc_print(t,x+1,y)
gc_print(t,x+1,y-1)
gc_print(t,x+2,y-1)
gc_setColor(1,1,1)
gc_setColor(COLOR.Z)
gc_print(t,x+2,y)
gc_replaceTransform(SCR.xOy_dr)

View File

@@ -6,7 +6,7 @@ local ins,rem=table.insert,table.remove
local mesList={}
local mesIcon={
check=DOGC{40,40,
check=GC.DO{40,40,
{'setLW',10},
{'setCL',0,0,0},
{'line',4,19,15,30,36,9},
@@ -14,7 +14,7 @@ local mesIcon={
{'setCL',.7,1,.6},
{'line',5,20,15,30,35,10},
},
info=DOGC{40,40,
info=GC.DO{40,40,
{'setCL',.2,.25,.85},
{'fCirc',20,20,15},
{'setCL',1,1,1},
@@ -23,7 +23,7 @@ local mesIcon={
{'fRect',18,11,4,4},
{'fRect',18,17,4,12},
},
broadcast=DOGC{40,40,
broadcast=GC.DO{40,40,
{'setCL',1,1,1},
{'fRect',2,4,36,26,3},
{'fPoly',2,27,2,37,14,25},
@@ -31,7 +31,7 @@ local mesIcon={
{'fRect',6,11,4,4},{'fRect',14,11,19,4},
{'fRect',6,19,4,4},{'fRect',14,19,19,4},
},
warn=DOGC{40,40,
warn=GC.DO{40,40,
{'setCL',.95,.83,.4},
{'fPoly',20.5,1,0,38,40,38},
{'setCL',0,0,0},
@@ -42,7 +42,7 @@ local mesIcon={
{'fRect',18,11,5,16},
{'fRect',18,30,5,5},
},
error=DOGC{40,40,
error=GC.DO{40,40,
{'setCL',.95,.3,.3},
{'fCirc',20,20,19},
{'setCL',0,0,0},
@@ -92,7 +92,7 @@ function MES.new(icon,str,time)
startTime=.5,
endTime=.5,
time=time or 3,
canvas=DOGC(L),
canvas=GC.DO(L),
width=w,height=h,
scale=h>400 and 1/math.min(h/400,2.6)or 1
})

View File

@@ -10,7 +10,7 @@ local SCN={
stat={
tar=false, --Swapping target
style=false,--Swapping style
mid=false, --Loading point
changeTime=false, --Loading point
time=false, --Full swap time
draw=false, --Swap draw func
},
@@ -50,7 +50,7 @@ end
function SCN.swapUpdate()
local S=SCN.stat
S.time=S.time-1
if S.time==S.mid then
if S.time==S.changeTime then
SCN.init(S.tar,SCN.cur)
collectgarbage()
--Scene swapped this moment
@@ -103,36 +103,36 @@ function SCN.pop()
end
local swap={
none={1,0,function()end},--swapTime, changeTime, drawFunction
flash={8,1,function()gc.clear(1,1,1)end},
fade={30,15,function(t)
none={duration=1,changeTime=0,draw=function()end},--swapTime, changeTime, drawFunction
flash={duration=8,changeTime=1,draw=function()gc.clear(1,1,1)end},
fade={duration=30,changeTime=15,draw=function(t)
t=t>15 and 2-t/15 or t/15
gc.setColor(0,0,0,t)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
end},
fade_togame={120,20,function(t)
fade_togame={duration=120,changeTime=20,draw=function(t)
t=t>20 and(120-t)/100 or t/20
gc.setColor(0,0,0,t)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
end},
slowFade={180,90,function(t)
slowFade={duration=180,changeTime=90,draw=function(t)
t=t>90 and 2-t/90 or t/90
gc.setColor(0,0,0,t)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
end},
swipeL={30,15,function(t)
swipeL={duration=30,changeTime=15,draw=function(t)
t=t/30
gc.setColor(.1,.1,.1,1-abs(t-.5))
t=t*t*(3-2*t)*2-1
gc.rectangle('fill',t*SCR.w,0,SCR.w,SCR.h)
end},
swipeR={30,15,function(t)
swipeR={duration=30,changeTime=15,draw=function(t)
t=t/30
gc.setColor(.1,.1,.1,1-abs(t-.5))
t=t*t*(2*t-3)*2+1
gc.rectangle('fill',t*SCR.w,0,SCR.w,SCR.h)
end},
swipeD={30,15,function(t)
swipeD={duration=30,changeTime=15,draw=function(t)
t=t/30
gc.setColor(.1,.1,.1,1-abs(t-.5))
t=t*t*(2*t-3)*2+1
@@ -146,8 +146,9 @@ function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back
SCN.swapping=true
local S=SCN.stat
S.tar,S.style=tar,style
local s=swap[style]
S.time,S.mid,S.draw=s[1],s[2],s[3]
S.time=swap[style].duration
S.changeTime=swap[style].changeTime
S.draw=swap[style].draw
end
else
MES.new('warn',"No Scene: "..tar)

View File

@@ -12,26 +12,28 @@ function TABLE.new(val,count)
end
--Get a copy of [1~#] elements
function TABLE.shift(org)
function TABLE.shift(org,depth)
if not depth then depth=1e99 end
local L={}
for i=1,#org do
if type(org[i])~='table'then
if type(org[i])~='table'or depth==0 then
L[i]=org[i]
else
L[i]=TABLE.shift(org[i])
L[i]=TABLE.shift(org[i],depth-1)
end
end
return L
end
--Get a full copy of a table
function TABLE.copy(org)
--Get a full copy of a table, depth = how many layers will be recreate, default to inf
function TABLE.copy(org,depth)
if not depth then depth=1e99 end
local L={}
for k,v in next,org do
if type(v)~='table'then
if type(v)~='table'or depth==0 then
L[k]=v
else
L[k]=TABLE.copy(v)
L[k]=TABLE.copy(v,depth-1)
end
end
return L

View File

@@ -19,22 +19,22 @@ local getFont,setFont,mStr=getFont,setFont,mStr
local mDraw,mDraw_X,mDraw_Y=GC.draw,GC.simpX,GC.simpY
local xOy=SCR.xOy
local downArrowIcon=DOGC{40,25,{'fPoly',0,0,20,25,40,0}}
local upArrowIcon=DOGC{40,25,{'fPoly',0,25,20,0,40,25}}
local clearIcon=DOGC{40,40,
local downArrowIcon=GC.DO{40,25,{'fPoly',0,0,20,25,40,0}}
local upArrowIcon=GC.DO{40,25,{'fPoly',0,25,20,0,40,25}}
local clearIcon=GC.DO{40,40,
{'fRect',16,5,8,3},
{'fRect',8,8,24,3},
{'fRect',11,14,18,21},
}
local sureIcon=DOGC{40,40,
local sureIcon=GC.DO{40,40,
{'setFT',35},
{'mText',"?",20,-6},
}
local smallerThen=DOGC{20,20,
local smallerThen=GC.DO{20,20,
{'setLW',5},
{'line',18,2,1,10,18,18},
}
local largerThen=DOGC{20,20,
local largerThen=GC.DO{20,20,
{'setLW',5},
{'line',2,2,19,10,2,18},
}
@@ -166,39 +166,43 @@ function button:draw()
local ATV=self.ATV
local c=self.color
local r,g,b=c[1],c[2],c[3]
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
gc_rectangle('fill',x-ATV,y-ATV,w+2*ATV,h+2*ATV)
--Button
gc_setColor(.15+r*.7,.15+g*.7,.15+b*.7,.9)
gc_rectangle('fill',x-ATV,y-ATV,w+2*ATV,h+2*ATV,3)
if ATV>0 then
gc_setLineWidth(4)
gc_setColor(1,1,1,ATV*.125)
gc_rectangle('line',x-ATV+2,y-ATV+2,w+2*ATV-4,h+2*ATV-4)
gc_setLineWidth(2)
gc_setColor(.97,.97,.975,ATV*.125)
gc_rectangle('line',x-ATV+2,y-ATV+2,w+2*ATV-4,h+2*ATV-4,3)
end
--Object
local obj=self.obj
local y0=y+h*.5-ATV*.5
gc_setColor(1,1,1,.2+ATV*.05)
if self.align=='M'then
local x0=x+w*.5
mDraw(obj,x0-1.5,y0-1.5)
mDraw(obj,x0-1.5,y0+1.5)
mDraw(obj,x0+1.5,y0-1.5)
mDraw(obj,x0+1.5,y0+1.5)
gc_setColor(r*.5,g*.5,b*.5)
mDraw(obj,x0-1,y0-1)
mDraw(obj,x0-1,y0+1)
mDraw(obj,x0+1,y0-1)
mDraw(obj,x0+1,y0+1)
gc_setColor(r*.55,g*.55,b*.55)
mDraw(obj,x0,y0)
elseif self.align=='L'then
local edge=self.edge
mDraw_Y(obj,x+edge-1.5,y0-1.5)
mDraw_Y(obj,x+edge-1.5,y0+1.5)
mDraw_Y(obj,x+edge+1.5,y0-1.5)
mDraw_Y(obj,x+edge+1.5,y0+1.5)
gc_setColor(r*.5,g*.5,b*.5)
mDraw_Y(obj,x+edge-1,y0-1)
mDraw_Y(obj,x+edge-1,y0+1)
mDraw_Y(obj,x+edge+1,y0-1)
mDraw_Y(obj,x+edge+1,y0+1)
gc_setColor(r*.55,g*.55,b*.55)
mDraw_Y(obj,x+edge,y0)
elseif self.align=='R'then
local x0=x+w-self.edge-obj:getWidth()
mDraw_Y(obj,x0-1.5,y0-1.5)
mDraw_Y(obj,x0-1.5,y0+1.5)
mDraw_Y(obj,x0+1.5,y0-1.5)
mDraw_Y(obj,x0+1.5,y0+1.5)
gc_setColor(r*.5,g*.5,b*.5)
mDraw_Y(obj,x0-1,y0-1)
mDraw_Y(obj,x0-1,y0+1)
mDraw_Y(obj,x0+1,y0-1)
mDraw_Y(obj,x0+1,y0+1)
gc_setColor(r*.55,g*.55,b*.55)
mDraw_Y(obj,x0,y0)
end
end
@@ -287,21 +291,38 @@ function key:draw()
local x,y,w,h=self.x,self.y,self.w,self.h
local ATV=self.ATV
local c=self.color
local align=self.align
local r,g,b=c[1],c[2],c[3]
gc_setColor(1,1,1,ATV*.1)
gc_rectangle('fill',x,y,w,h)
--Frame
if not self.noFrame then
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
gc_setLineWidth(2)
gc_rectangle('line',x,y,w,h,3)
end
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
gc_setLineWidth(4)
gc_rectangle('line',x,y,w,h)
--Fill
if self.fShade then
gc_setColor(r,g,b,ATV*.25)
if align=='M'then
mDraw(self.fShade,x+w*.5,y+h*.5)
elseif align=='L'then
mDraw_Y(self.fShade,x+self.edge,y+h*.5)
elseif align=='R'then
mDraw_Y(self.fShade,x+w-self.edge-self.fShade:getWidth(),y+h*.5)
end
else
gc_setColor(1,1,1,ATV*.05)
gc_rectangle('fill',x,y,w,h,3)
end
gc_setColor(r,g,b,1.2)
if self.align=='M'then
--Object
gc_setColor(r,g,b)
if align=='M'then
mDraw(self.obj,x+w*.5,y+h*.5)
elseif self.align=='L'then
elseif align=='L'then
mDraw_Y(self.obj,x+self.edge,y+h*.5)
elseif self.align=='R'then
elseif align=='R'then
mDraw_Y(self.obj,x+w-self.edge-self.obj:getWidth(),y+h*.5)
end
end
@@ -312,7 +333,7 @@ function key:press(_,_,k)
self.code(k)
if self.sound then SFX.play('key')end
end
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hideF][,hide]
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hideF][,hide]
if not D.h then D.h=D.w end
local _={
name= D.name or"_",
@@ -331,6 +352,8 @@ function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true]
},
fText= D.fText,
fShade= D.fShade,
noFrame=D.noFrame,
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
font= D.font or 30,
sound= D.sound~=false,
@@ -375,22 +398,22 @@ function switch:draw()
local x,y=self.x,self.y-25
local ATV=self.ATV
--Frame
gc_setLineWidth(2)
gc_setColor(1,1,1,.6+ATV*.1)
gc_rectangle('line',x,y,50,50,3)
--Checked
if ATV>0 then
gc_setColor(1,1,1,ATV*.08)
gc_rectangle('fill',x,y,50,50)
gc_setColor(1,1,1,ATV*.06)
gc_rectangle('fill',x,y,50,50,3)
end
if self.CHK>0 then
gc_setColor(.9,1,.9,self.CHK/6)
gc_setLineWidth(6)
gc_setLineWidth(5)
gc_line(x+5,y+25,x+18,y+38,x+45,y+11)
end
--Frame
gc_setLineWidth(4)
gc_setColor(1,1,1,.6+ATV*.05)
gc_rectangle('line',x,y,50,50)
--Drawable
gc_setColor(self.color)
mDraw_Y(self.obj,x-12-ATV-self.obj:getWidth(),y+25)
@@ -501,16 +524,19 @@ function slider:draw()
local cx=x+(x2-x)*self.pos/self.unit
local bx,by,bw,bh=cx-10-ATV*.5,y-16-ATV,20+ATV,32+2*ATV
gc_setColor(.8,.8,.8)
gc_rectangle('fill',bx,by,bw,bh)
gc_rectangle('fill',bx,by,bw,bh,3)
--Glow
if ATV>0 then
gc_setLineWidth(2)
gc_setColor(1,1,1,ATV*.16)
gc_rectangle('line',bx+1,by+1,bw-2,bh-2)
gc_setColor(.97,.97,.975,ATV*.16)
gc_rectangle('line',bx+1,by+1,bw-2,bh-2,3)
end
--Float text
if self.TAT>0 and self.show then
setFont(25)
gc_setColor(1,1,1,self.TAT/180)
gc_setColor(.97,.97,.975,self.TAT/180)
mStr(self:show(),cx,by-30)
end
@@ -657,10 +683,12 @@ function selector:draw()
local w=self.w
local ATV=self.ATV
--Frame
gc_setColor(1,1,1,.6+ATV*.1)
gc_setLineWidth(3)
gc_rectangle('line',x,y,w,60)
gc_setLineWidth(2)
gc_rectangle('line',x,y,w,60,3)
--Arrow
gc_setColor(1,1,1,.2+ATV*.1)
local t=(TIME()%.5)^.5
if self.select>1 then
@@ -815,11 +843,11 @@ function inputBox:draw()
local ATV=self.ATV
gc_setColor(1,1,1,ATV*.08)
gc_rectangle('fill',x,y,w,h)
gc_rectangle('fill',x,y,w,h,3)
gc_setColor(1,1,1)
gc_setLineWidth(3)
gc_rectangle('line',x,y,w,h)
gc_rectangle('line',x,y,w,h,3)
--Drawable
setFont(self.font)
@@ -971,12 +999,12 @@ function textBox:draw()
--Background
gc_setColor(0,0,0,.4)
gc_rectangle('fill',x,y,w,h)
gc_rectangle('fill',x,y,w,h,3)
--Frame
gc_setLineWidth(3)
gc_setLineWidth(2)
gc_setColor(WIDGET.sel==self and COLOR.lN or COLOR.Z)
gc_rectangle('line',x,y,w,h)
gc_rectangle('line',x,y,w,h,3)
--Texts
setFont(self.font)
@@ -987,12 +1015,12 @@ function textBox:draw()
gc_setColor(1,1,1)
if #texts>cap then
local len=h*h/(#texts*lineH)
gc_rectangle('fill',-15,(h-len)*scrollPos/((#texts-cap)*lineH),12,len)
gc_rectangle('fill',-15,(h-len)*scrollPos/((#texts-cap)*lineH),12,len,3)
end
--Clear button
if not self.fix then
gc_rectangle('line',w-40,0,40,40)
gc_rectangle('line',w-40,0,40,40,3)
gc_draw(self.sure==0 and clearIcon or sureIcon,w-40,0)
end
@@ -1144,14 +1172,14 @@ function listBox:draw()
--Frame
gc_setColor(WIDGET.sel==self and COLOR.lN or COLOR.Z)
gc_setLineWidth(3)
gc_rectangle('line',0,0,w,h)
gc_setLineWidth(2)
gc_rectangle('line',0,0,w,h,3)
--Slider
if #list>cap then
gc_setColor(1,1,1)
local len=h*h/(#list*lineH)
gc_rectangle('fill',-15,(h-len)*scrollPos/((#list-cap)*lineH),12,len)
gc_rectangle('fill',-15,(h-len)*scrollPos/((#list-cap)*lineH),12,len,3)
end
--List
@@ -1443,7 +1471,7 @@ local widgetCover do
ins(L,{'fRect',0,i,1,2})
ins(L,{'fRect',0,360-i,1,2})
end
widgetCover=DOGC(L)
widgetCover=GC.DO(L)
end
local scr_w,scr_h
function WIDGET.resize(w,h)

View File

@@ -1,8 +1,7 @@
VERSION={
build=353,
build=356,
code=1600,
short="V0.16.0",
string="Alpha V0.16.0",
string="V0.16.0@DEV",
room="V1.1",
name="空间站 Space station",
}

View File

@@ -138,7 +138,7 @@ return{--返回一个table你也可以在之前定义一些常量或者函数
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,265)--把计算出来的剩余行数r显示出来
mStr(r,63,265)--把计算出来的剩余行数r显示出来
PLY.draw.drawTargetLine(P,r)--使用自带的境界高度线绘制函数
end,
score=function(P)return{P.stat.time,P.stat.piece}end,--游戏结束时需要保存的本局关键信息

View File

@@ -78,6 +78,7 @@ NET= require'parts.net'
VK= require'parts.virtualKey'
AIFUNC= require'parts.ai'
AIBUILDER= require'parts.AITemplate'
RSlist= require'parts.RSlist'DSCP=RSlist.TRS.centerPos
PLY= require'parts.player'
netPLY= require'parts.netPlayer'
MODES= require'parts.modes'
@@ -300,7 +301,11 @@ do
SETTING.dataSaving=nil
if not SETTING.VKSkin then SETTING.VKSkin=1 end
for _,v in next,SETTING.skin do if v<1 or v>17 then v=17 end end
if SETTING.RS=='ZRS'or SETTING.RS=='BRS'then SETTING.RS='BiRS'end
if
SETTING.RS=='ZRS'or SETTING.RS=='BRS'or
SETTING.RS=='ASCplus'or SETTING.RS=='C2sym'or
SETTING.RS=='Classic'
then SETTING.RS='TRS'end
if SETTING.ghostType=='greyCell'then SETTING.ghostType='grayCell'end
if type(SETTING.skinSet)=='number'then SETTING.skinSet='crystal_scf'end
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul)then SETTING.frameMul=100 end

802
parts/RSlist.lua Normal file
View File

@@ -0,0 +1,802 @@
local defaultCenterTex=GC.DO{1,1}--No texture
local defaultCenterPos={--For SRS-like RSs
--Tetromino
{[0]={0,1},{1,0},{1,1},{1,1}},--Z
{[0]={0,1},{1,0},{1,1},{1,1}},--S
{[0]={0,1},{1,0},{1,1},{1,1}},--L
{[0]={0,1},{1,0},{1,1},{1,1}},--J
{[0]={0,1},{1,0},{1,1},{1,1}},--T
{[0]={.5,.5},{.5,.5},{.5,.5},{.5,.5}},--O
{[0]={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}},--I
--Pentomino
{[0]={1,1},{1,1},{1,1},{1,1}},--Z5
{[0]={1,1},{1,1},{1,1},{1,1}},--S5
{[0]={0,1},{1,0},{1,1},{1,1}},--P
{[0]={0,1},{1,0},{1,1},{1,1}},--Q
{[0]={1,1},{1,1},{1,1},{1,1}},--F
{[0]={1,1},{1,1},{1,1},{1,1}},--E
{[0]={1,1},{1,1},{1,1},{1,1}},--T5
{[0]={0,1},{1,0},{1,1},{1,1}},--U
{[0]={.5,1.5},{.5,.5},{1.5,.5},{1.5,1.5}},--V
{[0]={1,1},{1,1},{1,1},{1,1}},--W
{[0]={1,1},{1,1},{1,1},{1,1}},--X
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--J5
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--L5
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--R
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--Y
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--N
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--H
{[0]={0,2},{2,0},{0,2},{2,0}},--I5
--Trimino
{[0]={0,1},{1,0},{0,1},{1,0}},--I3
{[0]={.5,.5},{.5,.5},{.5,.5},{.5,.5}},--C
--Domino
{[0]={-.5,.5},{.5,-.5},{.5,.5},{.5,.5}},--I2
--Dot
{[0]={0,0},{0,0},{0,0},{0,0}},--O1
}
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 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}
end
local function strToVec(list)
for i,vecStr in next,list do
list[i]=map[tonumber(vecStr:sub(1,2))][tonumber(vecStr:sub(3,4))]
end
return list
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={
centerTex=GC.DO{10,10,
{'clear',1,1,1,.2},
{'setCL',1,1,1,.4},
{'fRect',1,1,8,8},
{'setCL',1,1,1,.6},
{'fRect',2,2,6,6},
{'setCL',1,1,1,.8},
{'fRect',3,3,4,4},
{'setCL',1,1,1},
{'fRect',4,4,2,2},
},
centerDisp=TABLE.new(true,29),
kickTable={
{
[01]={'+0+0','-1+0','-1+1','+0-2','-1+2','+0+1'},
[10]={'+0+0','+1+0','+1-1','+0+2','+1-2','+1-2'},
[03]={'+0+0','+1+0','+1+1','+0-2','+1-1','+1-2'},
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0-1'},
[12]={'+0+0','+1+0','+1-1','+0+2','+1+2'},
[21]={'+0+0','-1+0','-1+1','+0-2','-1-2'},
[32]={'+0+0','-1+0','-1-1','+0+2','-1+2'},
[23]={'+0+0','+1+0','+1+1','+0-2','+1-2'},
[02]={'+0+0','+1+0','-1+0','+0-1','+0+1'},
[20]={'+0+0','-1+0','+1+0','+0+1','+0-1'},
[13]={'+0+0','+0-1','+0+1','+0-2'},
[31]={'+0+0','+0+1','+0-1','+0+2'},
},--Z
false,--S
{
[01]={'+0+0','-1+0','-1+1','+1+0','+0-2','+1+1'},
[10]={'+0+0','+1+0','+1-1','-1+0','+0+2','+1+2'},
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2','+1-1','+0+1'},
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0-1','-1+1'},
[12]={'+0+0','+1+0','+1-1','+1+1','-1+0','+0-1','+0+2','+1+2'},
[21]={'+0+0','-1+0','-1+1','-1-1','+1+0','+0+1','+0-2','-1-2'},
[32]={'+0+0','-1+0','-1-1','+1+0','+0+2','-1+2','-1+1'},
[23]={'+0+0','+1+0','+1-1','-1+0','+1+1','+0-2','+1-2'},
[02]={'+0+0','-1+0','+1+0','+0-1','+0+1'},
[20]={'+0+0','+1+0','-1+0','+0+1','+0-1'},
[13]={'+0+0','+0-1','+0+1','+1+0'},
[31]={'+0+0','+0+1','+0-1','-1+0'},
},--J
false,--L
{
[01]={'+0+0','-1+0','-1+1','+0-2','-1-2','+0+1'},
[10]={'+0+0','+1+0','+1-1','+0+2','+1+2','+0-1'},
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2','+0+1'},
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0-1'},
[12]={'+0+0','+1+0','+1-1','+0-1','-1-1','+0+2','+1+2','+1+1'},
[21]={'+0+0','-1+0','+0-2','-1-2','-1-1','+1+1'},
[32]={'+0+0','-1+0','-1-1','+0-1','+1-1','+0+2','-1+2','-1+1'},
[23]={'+0+0','+1+0','+0-2','+1-2','+1-1','-1+1'},
[02]={'+0+0','-1+0','+1+0','+0+1'},
[20]={'+0+0','+1+0','-1+0','+0-1'},
[13]={'+0+0','+0-1','+0+1','+1+0','+0-2','+0+2'},
[31]={'+0+0','+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,defaultCenterPos[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+0','+0+1','+1+0','-2+0','-2-1','+1+2'},
[10]={'+0+0','+2+0','-1+0','-1-2','+2+1','+0+1'},
[03]={'+0+0','+0+1','-1+0','+2+0','+2-1','-1+2'},
[30]={'+0+0','-2+0','+1+0','+1-2','-2+1','+0+1'},
[12]={'+0+0','-1+0','+2+0','+2-1','+0-1','-1+2'},
[21]={'+0+0','-2+0','+1+0','+1-2','-2+1','+0+1'},
[32]={'+0+0','+1+0','-2+0','-2-1','+0-1','+1+2'},
[23]={'+0+0','+2+0','-1+0','-1-2','+2+1','+0+1'},
[02]={'+0+0','-1+0','+1+0','+0-1','+0+1'},
[20]={'+0+0','+1+0','-1+0','+0+1','+0-1'},
[13]={'+0+0','+0-1','-1+0','+1+0','+0+1'},
[31]={'+0+0','+0-1','+1+0','-1+0','+0+1'},
},--I
{
[01]={'+0+0','+0+1','+1+1','-1+0','+0-3','+0+2','+0-2','+0+3','-1+2'},
[10]={'+0+0','+0-1','-1-1','+1+0','+0-3','+0+2','+0-2','+0+3','+1-2'},
[03]={'+0+0','+1+0','+0-3','+0+1','+0+2','+0+3','+1+2'},
[30]={'+0+0','-1+0','+0+1','+0-2','+0-3','+0+3','-1-2'},
},--Z5
false,--S5
{
[01]={'+0+0','-1+0','-1+1','+0-2','-1-2','-1-1','+0+1'},
[10]={'+0+0','+1+0','+1-1','+0+2','+1+2','+0-1','+1+1'},
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2'},
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2'},
[12]={'+0+0','+1+0','+1-1','+0+2','+1+2','+1+1'},
[21]={'+0+0','-1+0','-1-1','-1+1','+0-2','-1-2','-1-1'},
[32]={'+0+0','-1+0','-1-1','-1+1','+0-1','+0+2','-1+2'},
[23]={'+0+0','+1+0','+1+1','-1+0','+0-2','+1-2'},
[02]={'+0+0','-1+0','+0-1','+0+1'},
[20]={'+0+0','+1+0','+0+1','+0-1'},
[13]={'+0+0','+1+0','+0+1','-1+0'},
[31]={'+0+0','-1+0','+0-1','+1+0'},
},--P
false,--Q
{
[01]={'+0+0','-1+0','+1+0','-1+1','+0-2','+0-3'},
[10]={'+0+0','+1+0','+1-1','-1+0','+0+2','+0+3'},
[03]={'+0+0','+1+0','+1-1','+0+1','+0-2','+0-3'},
[30]={'+0+0','-1+1','+1+0','+0-1','+0+2','+0+3'},
[12]={'+0+0','+1+0','+0-1','-1+0','+0+2'},
[21]={'+0+0','-1+0','+0+1','+1+0','+0-2'},
[32]={'+0+0','-1+0','+0+1','-1+1','+1+0','+0+2','-2+0'},
[23]={'+0+0','+1+0','+1-1','+0-1','-1+0','+0-2','+2+0'},
[02]={'+0+0','+1+0','-1+0','-1-1'},
[20]={'+0+0','-1+0','+1+0','+1+1'},
[13]={'+0+0','+0-1','-1+1','+0+1'},
[31]={'+0+0','+0-1','+1-1','+0+1'},
},--F
false,--E
{
[01]={'+0+0','+0-1','-1-1','+1+0','+1+1','+0-3','-1+0','+0+2','-1+2'},
[10]={'+0+0','+1+0','+0-1','-1-1','+0-2','-1+1','+0-3','+1-2','+0+1'},
[03]={'+0+0','+0-1','+1-1','-1+0','-1+1','+0-3','+1+0','+0+2','+1+2'},
[30]={'+0+0','-1+0','+0-1','+1-1','+0-2','+1+1','+0-3','-1-2','+0+1'},
[12]={'+0+0','+1+0','-1+0','+0-2','+0-3','+0+1','-1+1'},
[21]={'+0+0','+1-1','-1+0','+1+0','+0-1','+0+2','+0+3'},
[32]={'+0+0','-1+0','+1+0','+0-2','+0-3','+0+1','+1+1'},
[23]={'+0+0','-1-1','+1+0','-1+0','+0-1','+0+2','+0+3'},
[02]={'+0+0','+0-1','+0+1','+0+2'},
[20]={'+0+0','+0-1','+0+1','+0-2'},
[13]={'+0+0','+1+0','-1+1','-2+0'},
[31]={'+0+0','-1+0','+1+1','+2+0'},
},--T5
{
[01]={'+0+0','-1+0','-1+1','+0-2','-1-2'},
[10]={'+0+0','+1+0','+1-1','+0+2','+1+2'},
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2'},
[30]={'+0+0','-1+0','-1-1','+0-2','-1+2'},
[12]={'+0+0','+1+0','+1-1','+1+1'},
[21]={'+0+0','-1-1','-1+1','-1-1'},
[32]={'+0+0','-1+0','-1-1','-1+1'},
[23]={'+0+0','+1-1','+1+1','+1-1'},
[02]={'+0+0','+0+1'},
[20]={'+0+0','+0-1'},
[13]={'+0+0','+0-1','+0+1','+1+0'},
[31]={'+0+0','+0-1','+0+1','-1+0'},
},--U
{
[01]={'+0+0','+0+1','-1+0','+0-2','-1-2'},
[10]={'+0+0','+0+1','+1+0','+0-2','+1-2'},
[03]={'+0+0','+0-1','+0+1','+0+2'},
[30]={'+0+0','+0-1','+0+1','+0-2'},
[12]={'+0+0','+0-1','+0+1'},
[21]={'+0+0','+0-1','+0-2'},
[32]={'+0+0','+1+0','-1+0'},
[23]={'+0+0','-1+0','+1+0'},
[02]={'+0+0','-1+1','+1-1'},
[20]={'+0+0','+1-1','-1+1'},
[13]={'+0+0','+1+1','-1-1'},
[31]={'+0+0','-1-1','+1+1'},
},--V
{
[01]={'+0+0','+0-1','-1+0','+1+0','+1-1','+0+2'},
[10]={'+0+0','+0-1','-1-1','+0+1','+0-2','+1-2','+0+2'},
[03]={'+0+0','+1+0','+1+1','+0-1','+0-2','+0-3','+1-1','+0+1','+0+2','+0+3'},
[30]={'+0+0','-1+0','-1+1','+0-1','+0-2','+0-3','-1-1','+0+1','+0+2','+0+3'},
[12]={'+0+0','+1+0','+0-1','-2+0','+1+1','-1+0','+0+1','-1-1'},
[21]={'+0+0','-1+0','+0-1','+2+0','-1+1','+1+0','+0+1','+1-1'},
[32]={'+0+0','+0-1','+1+0','+0+1','-1+0','-1-1','+0+2'},
[23]={'+0+0','+0-1','+1-1','+0+1','+0-2','-1-2','+0+2'},
[02]={'+0+0','+0-1','-1+0'},
[20]={'+0+0','+0+1','+1+0'},
[13]={'+0+0','+0+1','-1+0'},
[31]={'+0+0','+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]={'+0+0','-1+0','-1+1','+0-3','-1+1','-1+2','+0+1'},
[10]={'+0+0','-1+0','+1-1','+0+3','+1-1','+1-2','+0+1'},
[03]={'+0+0','+0-1','+1-1','-1+0','+1+1','+0-2','+1-2','+0-3','+1-3','-1+1'},
[30]={'+0+0','+0+1','-1+1','+1+0','-1-1','+0+2','-1+2','+0+3','-1+3','+1-1'},
[12]={'+0+0','+1+0','+1-1','+0-1','+1-2','+0-2','+1+1','-1+0','+0+2','+1+2'},
[21]={'+0+0','-1+0','-1+1','+0+1','-1+2','+0+2','-1-1','+1+0','+0-2','-1-2'},
[32]={'+0+0','-1+0','-1+1','-1-1','+1+0','+0+2','-1+2','+0-2'},
[23]={'+0+0','+1+0','+1-1','+1+1','-1+0','+0-2','+1-2','+0+2'},
[02]={'+0+0','+0-1','+1-1','-1+0','+2-1'},
[20]={'+0+0','+0+1','-1+1','+1+0','-2+1'},
[13]={'+0+0','-1+0','-1-1','+0+1','-1-2'},
[31]={'+0+0','+1+0','+1+1','+0-1','+1+2'},
},--J5
false,--L5
{
[01]={'+0+0','-1+0','-1+0','-1+1','+1+0','-1+2','-1-1','+0-3','+0+1'},
[10]={'+0+0','-1+0','+1+0','+1-1','+1+0','+1-2','+1+1','+0+3','+0+1'},
[03]={'+0+0','+0-1','+0+1','+1+0','+1-1','-1+0','+1+1','+0-2','+1-2','+0-3','+1-3','-1+1'},
[30]={'+0+0','+0-1','+0+1','-1+0','-1+1','+1+0','-1-1','+0+2','-1+2','+0+3','-1+3','+1-1'},
[12]={'+0+0','+1+0','+1-1','+0-1','+1-2','+0-2','+1+1','-1+0','+0+2','+1+2'},
[21]={'+0+0','-1+0','-1+1','+0+1','-1+2','+0+2','-1-1','+1+0','+0-2','-1-2'},
[32]={'+0+0','+0-1','-1+0','-1+1','-1-1','+1+0','+0+2','-1+2','+0-2'},
[23]={'+0+0','+0+1','+1+0','+1-1','+1+1','-1+0','+0-2','+1-2','+0+2'},
[02]={'+0+0','+0-1','+1-1','-1+0','+2-1','+0+1'},
[20]={'+0+0','+0+1','-1+1','+1+0','-2+1','+0-1'},
[13]={'+0+0','-1+0','-1-1','+0+1','-1-2'},
[31]={'+0+0','+1+0','+1+1','+0-1','+1+2'},
},--R
false,--Y
{
[01]={'+0+0','-1+0','-1+1','+0+1','+1+0','-1+2','-2+0','+0-2'},
[10]={'+0+0','+1+0','-1+0','+0-1','+1-1','+1-2','+2+0','+0+2'},
[03]={'+0+0','-1+0','+1-1','+0-2','+0-3','+1+0','+1-2','+1-3','+0+1','-1+1'},
[30]={'+0+0','-1+0','+1-1','+1-2','+1+0','+0-2','+1-3','-1+2','+0+3','-1+3'},
[12]={'+0+0','-1+0','+1-1','-1-1','+1-2','+1+0','+0-2','+1-3','-1+2','+0+3','-1+3'},
[21]={'+0+0','-1+0','+1-1','+1+1','+0-2','+0-3','+1+0','+1-2','+1-3','+0+1','-1+1'},
[32]={'+0+0','-1+0','+0-1','-1-2','+1-1','+1+0','+1+1','+0+2','+0+3'},
[23]={'+0+0','+0-2','+0-3','+1+2','+1+0','+0+1','-1+1','+0-1','+0+2'},
[02]={'+0+0','-1+0','+0+2','+0-1'},
[20]={'+0+0','+1+0','+0-2','+0+1'},
[13]={'+0+0','-1+0','-1-1','+0+1','+1+2'},
[31]={'+0+0','+1+0','+1+1','+0-1','-1-2'},
},--N
false,--H
{
[01]={'+0+0','+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]={'+0+0','-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]={'+0+0','-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]={'+0+0','+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]={'+0+0','-1+0','-1-1','+1+1','-1+1'},
[10]={'+0+0','-1+0','+1+0','-1-1','+1+1'},
[03]={'+0+0','+1+0','+1-1','-1+1','+1+1'},
[30]={'+0+0','+1+0','-1+0','+1-1','-1+1'},
},--I3
{
[01]={'+0+0','-1+0','+1+0'},
[10]={'+0+0','+1+0','-1+0'},
[03]={'+0+0','+0+1','+0-1'},
[30]={'+0+0','+0-1','+0+1'},
[12]={'+0+0','+0+1','+0-1'},
[21]={'+0+0','+0-1','+0+1'},
[32]={'+0+0','-1+0','+1+0'},
[23]={'+0+0','+1+0','-1+0'},
[02]={'+0+0','+0-1','+1-1','-1-1'},
[20]={'+0+0','+0+1','-1+1','+1+1'},
[13]={'+0+0','+0-1','-1-1','+1-1'},
[31]={'+0+0','+0+1','+1+1','-1+1'},
},--C
{
[01]={'+0+0','-1+0','+0+1'},
[10]={'+0+0','+1+0','+0+1'},
[03]={'+0+0','+1+0','+0+1'},
[30]={'+0+0','-1+0','+0+1'},
[12]={'+0+0','+1+0','+0+2'},
[21]={'+0+0','+0-1','-1+0'},
[32]={'+0+0','-1+0','+0+2'},
[23]={'+0+0','+0-1','-1+0'},
[02]={'+0+0','+0-1','+0+1'},
[20]={'+0+0','+0+1','+0-1'},
[13]={'+0+0','-1+0','+1+0'},
[31]={'+0+0','+1+0','-1+0'},
},--I2
nil,--O1
}
}
TRS.centerDisp[6]=false
TRS.centerDisp[18]=false
TRS.kickTable[2]= reflect(TRS.kickTable[1])--SZ
TRS.kickTable[4]= reflect(TRS.kickTable[3])--LJ
TRS.kickTable[9]= reflect(TRS.kickTable[8])--S5Z5
TRS.kickTable[11]=reflect(TRS.kickTable[10])--PQ
TRS.kickTable[13]=reflect(TRS.kickTable[12])--FE
TRS.kickTable[20]=reflect(TRS.kickTable[19])--L5J5
TRS.kickTable[22]=reflect(TRS.kickTable[21])--RY
TRS.kickTable[24]=reflect(TRS.kickTable[23])--NH
centroSymSet(TRS.kickTable[8])centroSymSet(TRS.kickTable[9])--S5Z5
centroSymSet(TRS.kickTable[25])centroSymSet(TRS.kickTable[26])--I5I3
end
local SRS
do
SRS={
centerTex=GC.DO{10,10,
{'setCL',1,1,1,.2},
{'fCirc',5,5,5},
{'setCL',1,1,1,.6},
{'fCirc',5,5,4},
{'setCL',1,1,1,.8},
{'fCirc',5,5,3},
{'setCL',1,1,1},
{'fCirc',5,5,2},
},
kickTable={
{
[01]={'+0+0','-1+0','-1+1','+0-2','-1-2'},
[10]={'+0+0','+1+0','+1-1','+0+2','+1+2'},
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2'},
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2'},
[12]={'+0+0','+1+0','+1-1','+0+2','+1+2'},
[21]={'+0+0','-1+0','-1+1','+0-2','-1-2'},
[32]={'+0+0','-1+0','-1-1','+0+2','-1+2'},
[23]={'+0+0','+1+0','+1+1','+0-2','+1-2'},
[02]={},[20]={},[13]={},[31]={},
},--Z
false,--S
false,--J
false,--L
false,--T
noKickSet,--O
{
[01]={'+0+0','-2+0','+1+0','-2-1','+1+2'},
[10]={'+0+0','+2+0','-1+0','+2+1','-1-2'},
[12]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[21]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[23]={'+0+0','+2+0','-1+0','+2+1','-1-2'},
[32]={'+0+0','-2+0','+1+0','-2-1','+1+2'},
[30]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[03]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[02]={},[20]={},[13]={},[31]={},
}--I
}
}
for i=2,5 do SRS.kickTable[i]=SRS.kickTable[1]end
for i=8,29 do SRS.kickTable[i]=SRS.kickTable[1]end
end
local BiRS
do
local R=strToVec{'+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=strToVec{'+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=strToVec{'+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={
centerTex=GC.DO{10,10,
{'setCL',1,1,1,.6},
{'fRect',0,3,10,4},
{'fRect',3,0,4,10},
{'setCL',1,1,1},
{'fRect',1,4,8,2},
{'fRect',4,1,2,8},
{'fRect',3,3,4,4},
},
kickTable=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=defaultCenterPos[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={'+0+0','+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={'+0+0'}
local centerPos=TABLE.shift(defaultCenterPos,0)
centerPos[6]={[0]={0,0},{1,0},{1,1},{0,1}}
centerPos[7]={[0]={0,1},{2,0},{0,2},{1,0}}
ASC={
centerTex=GC.DO{10,10,
{'setLW',2},
{'setCL',1,1,1,.7},
{'line',1,1,9,9},
{'line',1,9,9,1},
{'setLW',1},
{'setCL',1,1,1},
{'line',1,1,9,9},
{'line',1,9,9,1},
},
centerPos=centerPos,
kickTable=TABLE.new({
[01]=R,[10]=L,[03]=L,[30]=R,
[12]=R,[21]=L,[32]=L,[23]=R,
[02]=F,[20]=F,[13]=F,[31]=F,
},29)
}
end
local ASC_plus
do
local L={'+0+0','+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={'+0+0','-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'}
local centerPos=TABLE.shift(defaultCenterPos,0)
centerPos[6]={[0]={0,0},{1,0},{1,1},{0,1}}
centerPos[7]={[0]={0,1},{2,0},{0,2},{1,0}}
ASC_plus={
centerTex=GC.DO{10,10,
{'setLW',2},
{'setCL',1,1,1,.7},
{'line',1,1,9,9},
{'line',1,9,9,1},
{'setLW',1},
{'setCL',1,1,1},
{'line',1,1,9,9},
{'line',1,9,9,1},
{'fCirc',5,5,3},
},
centerPos=centerPos,
kickTable=TABLE.new({
[01]=R,[12]=R,[23]=R,[30]=R,
[10]=L,[21]=L,[32]=L,[03]=L,
[02]=F,[20]=F,[13]=F,[31]=F,
},29)
}
end
local C2
do
local L={'+0+0','-1+0','+1+0','+0-1','-1-1','+1-1','-2+0','+2+0'}
C2={
centerTex=GC.DO{10,10,
{'setLW',2},
{'dRect',2,2,6,6},
},
kickTable=TABLE.new({
[01]=L,[10]=L,[12]=L,[21]=L,
[23]=L,[32]=L,[30]=L,[03]=L,
[02]=L,[20]=L,[13]=L,[31]=L,
},29)
}
end
local C2_sym
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)
C2_sym={
centerTex=GC.DO{10,10,
{'setLW',2},
{'dRect',1,1,8,8},
{'fRect',3,3,4,4},
},
kickTable={
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 do
local centerPos=TABLE.shift(defaultCenterPos,0)
centerPos[1]={[0]={1,1},{1,0},{1,1},{1,0}}
centerPos[2]={[0]={1,1},{1,0},{1,1},{1,0}}
centerPos[7]={[0]={0,2},{1,0},{0,2},{1,0}}
Classic={
centerDisp=TABLE.new(false,29),
centerPos=centerPos,
kickTable=TABLE.new(noKickSet,29)
}
end
local Classic_plus do
local centerPos=TABLE.shift(defaultCenterPos,0)
centerPos[1]={[0]={1,1},{1,0},{1,1},{1,0}}
centerPos[2]={[0]={1,1},{1,0},{1,1},{1,0}}
centerPos[7]={[0]={0,2},{1,0},{0,2},{1,0}}
Classic_plus={
centerDisp=TABLE.new(false,29),
centerPos=centerPos,
kickTable=TABLE.new(noKickSet_180,29)
}
end
local None={
centerTex=GC.DO{10,10,
{'setLW',2},
{'line',2,2,6,6},
},
kickTable=TABLE.new(noKickSet_180,29)
}
local None_plus={
centerTex=GC.DO{10,10,
{'setLW',2},
{'line',1,1,7,7},
{'fRect',2,2,4,4},
},
kickTable=TABLE.new(noKickSet,29)
}
local RSlist={
TRS=TRS,
SRS=SRS,
BiRS=BiRS,
ASC=ASC,
ASC_plus=ASC_plus,
C2=C2,
C2_sym=C2_sym,
Classic=Classic,
Classic_plus=Classic_plus,
None=None,
None_plus=None_plus,
}
for _,rs in next,RSlist do
if not rs.centerDisp then rs.centerDisp=TABLE.new(true,29)end
if not rs.centerPos then rs.centerPos=defaultCenterPos end
if not rs.centerTex then rs.centerTex=defaultCenterTex end
--Make all string vec to the same table vec
for _,set in next,rs.kickTable do
if type(set)=='table'then
for _,list in next,set do
if type(list[1])=='string'then
strToVec(list)
end
end
end
end
end
return RSlist

View File

@@ -16,7 +16,7 @@ function back.update(dt)
t=t+dt
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)

View File

@@ -15,7 +15,7 @@ function back.update(dt)
t=t+dt
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)

View File

@@ -15,7 +15,7 @@ function back.update(dt)
t=t+dt
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)

View File

@@ -40,7 +40,7 @@ function back.update()
end
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
for i=1,#mino do
local C=mino[i]
local c=C.color

View File

@@ -37,7 +37,7 @@ function back.update(dt)
end
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
gc.setColor(1,1,1,.2)
local img=IMG.lanterns
for i=1,#lanterns do

View File

@@ -8,7 +8,7 @@ local upCover do
table.insert(L,{'setCL',.6,1,1,i*.01})
table.insert(L,{'fRect',0,63-i,1,1})
end
upCover=DOGC(L)
upCover=GC.DO(L)
end
local downCover do
local L={1,64}
@@ -16,7 +16,7 @@ local downCover do
table.insert(L,{'setCL',1,.5,.8,i*.01})
table.insert(L,{'fRect',0,i,1,1})
end
downCover=DOGC(L)
downCover=GC.DO(L)
end
local W,H
@@ -29,7 +29,7 @@ end
function back.update()
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
gc.draw(upCover,0,0,0,W,H*.3/64)
gc.draw(downCover,0,H*.7,0,W,H*.3/64)
end

View File

@@ -10,7 +10,7 @@ local scs
function back.init()
colorLib=minoColor
blocks=BLOCKS
scs=SCS
scs=DSCP
t=rnd()*2600
end
function back.update(dt)

View File

@@ -16,7 +16,7 @@ function back.update(dt)
t=t+dt
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)

View File

@@ -16,7 +16,7 @@ function back.update(dt)
t=t+dt
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)

View File

@@ -38,7 +38,7 @@ function back.update()
end
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
gc.setColor(.7,.7,.7)
for i=1,#snow do
local P=snow[i]

View File

@@ -31,7 +31,7 @@ function back.update()
end
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
if not stars[1]then return end
gc.translate(-10,-10)
gc.setColor(1,1,1,.6)

View File

@@ -29,7 +29,7 @@ function back.update(dt)
end
end
function back.draw()
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
gc.setColor(1,1,1,.1)
for i=1,#ring do
local r=ring[i]^2/12

View File

@@ -16,7 +16,7 @@ function back.draw()
if -t%13.55<.1283 then
gc.clear(.2+.1*sin(t),.2+.1*sin(1.26*t),.2+.1*sin(1.626*t))
else
gc.clear(.1,.1,.1)
gc.clear(.08,.08,.084)
end
gc.push('transform')
gc.translate(SCR.cx,SCR.cy+20*sin(t*.02))

View File

@@ -595,10 +595,10 @@ do--function drawSelfProfile()
ins(img,{"clear",0,0,0})
ins(img,{"setLW",4})
ins(img,{"setCL",.5,.8,1})
ins(img,{"dRect",2,2,21,21})
ins(img,{"dRect",2,2,21,21,2})
--TODO: draw with lv
img=DOGC(img)
img=GC.DO(img)
rawset(self,lv,img)
return img
end})
@@ -612,7 +612,7 @@ do--function drawSelfProfile()
--Draw avatar
gc_setLineWidth(2)
gc_setColor(.3,.3,.3,.8)gc_rectangle('fill',0,0,-300,80)
gc_setColor(1,1,1)gc_rectangle('line',0,0,-300,80)
gc_setColor(1,1,1)gc_rectangle('line',-300,0,300,80,5)
gc_rectangle('line',-73,7,66,66,2)
gc_draw(selfAvatar,-72,8,nil,.5)
@@ -656,10 +656,6 @@ do--function drawWarning()
end
end
end
do--function drawSystemInfo(
--你竟然找到了这里!说明你是真的闲(
--感谢支持Techmino!!!
end

View File

@@ -4,94 +4,94 @@ local function disableKey(P,key)
end
MODOPT={--Mod options
{no=0,id="NX",name="next",
key="q",x=80,y=230,color='O',
key="q",x=80,y=230,color='lO',
list={0,1,2,3,4,5,6},
func=function(P,O)P.gameEnv.nextCount=O end,
unranked=true,
},
{no=1,id="HL",name="hold",
key="w",x=200,y=230,color='O',
key="w",x=200,y=230,color='lO',
list={0,1,2,3,4,5,6},
func=function(P,O)P.gameEnv.holdCount=O end,
unranked=true,
},
{no=2,id="FL",name="hideNext",
key="e",x=320,y=230,color='A',
key="e",x=320,y=230,color='lA',
list={1,2,3,4,5},
func=function(P,O)P.gameEnv.nextStartPos=O+1 end,
unranked=true,
},
{no=3,id="IH",name="infHold",
key="r",x=440,y=230,color='A',
key="r",x=440,y=230,color='lA',
func=function(P)P.gameEnv.infHold=true end,
unranked=true,
},
{no=4,id="HB",name="hideBlock",
key="y",x=680,y=230,color='V',
key="y",x=680,y=230,color='lV',
func=function(P)P.gameEnv.block=false end,
unranked=true,
},
{no=5,id="HG",name="hideGhost",
key="u",x=800,y=230,color='V',
key="u",x=800,y=230,color='lV',
func=function(P)P.gameEnv.ghost=false end,
unranked=true,
},
{no=6,id="HD",name="hidden",
key="i",x=920,y=230,color='P',
key="i",x=920,y=230,color='lP',
list={'easy','slow','medium','fast','none'},
func=function(P,O)P.gameEnv.visible=O end,
unranked=true,
},
{no=7,id="HB",name="hideBoard",
key="o",x=1040,y=230,color='P',
key="o",x=1040,y=230,color='lP',
list={'down','up','all'},
func=function(P,O)P.gameEnv.hideBoard=O end,
unranked=true,
},
{no=8,id="FB",name="flipBoard",
key="p",x=1160,y=230,color='J',
key="p",x=1160,y=230,color='lJ',
list={'U-D','L-R','180'},
func=function(P,O)P.gameEnv.flipBoard=O end,
unranked=true,
},
{no=9,id="DT",name="dropDelay",
key="a",x=140,y=350,color='R',
key="a",x=140,y=350,color='lR',
list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
func=function(P,O)P.gameEnv.drop=O end,
unranked=true,
},
{no=10,id="LT",name="lockDelay",
key="s",x=260,y=350,color='R',
key="s",x=260,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
func=function(P,O)P.gameEnv.lock=O end,
unranked=true,
},
{no=11,id="ST",name="waitDelay",
key="d",x=380,y=350,color='R',
key="d",x=380,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
func=function(P,O)P.gameEnv.wait=O end,
unranked=true,
},
{no=12,id="CT",name="fallDelay",
key="f",x=500,y=350,color='R',
key="f",x=500,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
func=function(P,O)P.gameEnv.fall=O end,
unranked=true,
},
{no=13,id="LF",name="life",
key="j",x=860,y=350,color='Y',
key="j",x=860,y=350,color='lY',
list={0,1,2,3,5,10,15,26,42,87,500},
func=function(P,O)P.gameEnv.life=O end,
unranked=true,
},
{no=14,id="FB",name="forceB2B",
key="k",x=980,y=350,color='Y',
key="k",x=980,y=350,color='lY',
func=function(P)P.gameEnv.b2bKill=true end,
unranked=true,
},
{no=15,id="PF",name="forceFinesse",
key="l",x=1100,y=350,color='Y',
key="l",x=1100,y=350,color='lY',
func=function(P)P.gameEnv.fineKill=true end,
unranked=true,
},
@@ -124,19 +124,19 @@ MODOPT={--Mod options
unranked=true,
},
{no=19,id="CS",name="customSeq",
key="b",x=680,y=470,color='B',
key="b",x=680,y=470,color='lB',
list={'bag','his','hisPool','c2','rnd','mess','reverb'},
func=function(P,O)P.gameEnv.sequence=O end,
unranked=true,
},
{no=20,id="PS",name="pushSpeed",
key="n",x=800,y=470,color='B',
key="n",x=800,y=470,color='lB',
list={.5,1,2,3,5,15,1e99},
func=function(P,O)P.gameEnv.pushSpeed=O end,
unranked=true,
},
{no=21,id="BN",name="boneBlock",
key="m",x=920,y=470,color='B',
key="m",x=920,y=470,color='lB',
list={'on','off'},
func=function(P,O)P.gameEnv.bone=O=='on'end,
unranked=true,
@@ -250,6 +250,7 @@ SETTING={--Settings
--System
reTime=4,
autoPause=true,
menuPos='right',
fine=false,
simpMode=false,
lang=1,

View File

@@ -1,670 +0,0 @@
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

View File

@@ -340,7 +340,7 @@ return{
{"O-Spin",
"ospin",
"term",
"In most cases, it's a meme.\nThe O Tetrimino (a.k.a. the Square) does not change upon rotation, thus making it lack interesting spins/kicks that other Tetriminoes have, or be stuck in a place unable to get out.\nAs a joke, some people have made heavily edited videos or even programmed games where the O piece can change shape and \"spin\" into different positions.\nTechmino also supports O-Spin in most modes.",
"In most cases, it's a meme.\nThe O Tetromino (a.k.a. the Square) does not change upon rotation, thus making it lack interesting spins/kicks that other Tetrominoes have, or be stuck in a place unable to get out.\nAs a joke, some people have made heavily edited videos or even programmed games where the O piece can change shape and \"spin\" into different positions.\nTechmino also supports O-Spin in most modes.",
},
{"Rotation Systems",
"wallkick rotationsystem",
@@ -385,7 +385,7 @@ return{
{"SRS",
"srs superrotationsystem",
"term",
"Super Rotation System\nThe rotation system used in modern, official Tetris games.\nEach Tetrimino has a rotation center for the piece to rotate around. Should a Tetrimino overlap with the wall, floor or another mino on the field after rotation, a few offset positions will be checked, allowing pieces to kick off walls and floors. This also allows pieces to rotate into openings that are otherwise unreachable.\n\nMany unofficial games implement some modification of this rotation system that adds a kick for 180 spins. In Techmino, such a modification is called SRS+.",
"Super Rotation System\nThe rotation system used in modern, official Tetris games.\nEach Tetromino has a rotation center for the piece to rotate around. Should a Tetromino overlap with the wall, floor or another mino on the field after rotation, a few offset positions will be checked, allowing pieces to kick off walls and floors. This also allows pieces to rotate into openings that are otherwise unreachable.\n\nMany unofficial games implement some modification of this rotation system that adds a kick for 180 spins. In Techmino, such a modification is called SRS+.",
},
{"TRS",
"trs techminorotationsystem",
@@ -590,12 +590,12 @@ return{
{"Bag7 generator",
"bag7bag randomgenerator",
"term",
"Also known as \"7-Bag Generator\". Officially known as \"Random Generator\".\nThis is the algorithm used by modern, official Tetris games to generate pieces. Starting from the beginning of a game, every 7 pieces there are guaranteed to be one of each of the 7 Tetriminoes.",
"Also known as \"7-Bag Generator\". Officially known as \"Random Generator\".\nThis is the algorithm used by modern, official Tetris games to generate pieces. Starting from the beginning of a game, every 7 pieces there are guaranteed to be one of each of the 7 Tetrominoes.",
},
{"His generator",
"history hisgenerator",
"term",
"A way to generate pieces, notably used in Tetris: The Grand Master games. Every time a random Tetrimino is selected, but if this Tetrimino is the same as one of the few previous pieces, then reroll until a different piece is rolled or until a reroll limit is reached.\nFor example, a \"his 4 roll 6\" (h4r6) generator rerolls when the piece is the same as one of the 4 previous pieces, and rerolls up to 6 times.\nThere are other variations as well, such as \"his4 roll6 pool35\", which further reduces the randomness of the piece sequence.\n\nIn Techmino, the max. reroll count is half of the sequence length, rounded up.",
"A way to generate pieces, notably used in Tetris: The Grand Master games. Every time a random Tetromino is selected, but if this Tetromino is the same as one of the few previous pieces, then reroll until a different piece is rolled or until a reroll limit is reached.\nFor example, a \"his 4 roll 6\" (h4r6) generator rerolls when the piece is the same as one of the 4 previous pieces, and rerolls up to 6 times.\nThere are other variations as well, such as \"his4 roll6 pool35\", which further reduces the randomness of the piece sequence.\n\nIn Techmino, the max. reroll count is half of the sequence length, rounded up.",
},
{"Hypertapping",
"hypertapping",
@@ -615,17 +615,17 @@ return{
{"C2 Generator",
"cultris2generator cultrisiigenerator c2generator",
"term",
"All Tetriminoes have a initial weight of 0.\nEvery time, divide all weights by 2, add a random number between 0 and 1, pick the piece with the highest weight, and divide this piece's weight by 3.5.",
"All Tetrominoes have a initial weight of 0.\nEvery time, divide all weights by 2, add a random number between 0 and 1, pick the piece with the highest weight, and divide this piece's weight by 3.5.",
},
{"C2 wall kicks",
"cultris2wallkicks cultrisiiwallkicks c2wallkicks cultris2kicks cultrisiikicks c2kicks",
"term",
"Left, right, down, bottom-left, bottom-right, left 2, right 2. (This applies to *any* rotation of *any* Tetrimino.)",
"Left, right, down, bottom-left, bottom-right, left 2, right 2. (This applies to *any* rotation of *any* Tetromino.)",
},
{"Stacking",
"stacking",
"term",
"Often refers to stacking Tetriminoes without leaving holes in the stack.",
"Often refers to stacking Tetrominoes without leaving holes in the stack.",
},
{"Rotation buttons (1)",
"doublerotation",
@@ -640,7 +640,7 @@ return{
{"Drought",
"drought",
"term",
"A situation where a piece you want, often the I Tetrimino (a.k.a. the Long Bar), does not spawn for a long time. This often happens, and can be deadly, for classic Tetris, but it is almost impossible for modern Tetris thanks to the Random Generator.\nWith the Random Generator, there can be at most 12 other pieces between two I Tetriminoes.",
"A situation where a piece you want, often the I Tetromino (a.k.a. the Long Bar), does not spawn for a long time. This often happens, and can be deadly, for classic Tetris, but it is almost impossible for modern Tetris thanks to the Random Generator.\nWith the Random Generator, there can be at most 12 other pieces between two I Tetrominoes.",
},
{"MPH mode",
"mph",

View File

@@ -145,7 +145,7 @@ return{
{"Puyopuyo Tetris",
"噗哟方块 ppt puyopuyotetris",
"game",
"简称PPT多平台方块(steamPC版手感网络等都不太好,不建议购买)将tetris和puyopuyo两个下落消除游戏放到一个游戏里二者可以对战联机单机模式都很多很有趣",
"简称PPT多平台方块(steamPC版相对NS版手感网络等都不太好)将tetris和puyopuyo两个下落消除游戏放到一个游戏里二者可以对战联机单机模式都很多很有趣",
},
{"Tetris Online",
"top tetris online study",

View File

@@ -34,7 +34,7 @@ return{
missionFailed="Wrong Clear",
speedLV="Speed Level",
line="Lines",atk="Attack",eff="Efficiency",
piece="Piece",line="Lines",atk="Attack",eff="Efficiency",
rpm="RPM",tsd="TSD",
grade="Grade",techrash="Techrash",
wave="Wave",nextWave="Next",
@@ -54,7 +54,7 @@ return{
page="Page:",
ai_fixed="The AI is incompatible with fixed sequences.",
ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",
ai_prebag="The AI is incompatible with custom sequences which have nontetromino.",
ai_mission="The AI is incompatible with custom missions.",
switchSpawnSFX="Please turn on the spawn SFX .",
ranks={"D","C","B","A","S"},
@@ -185,7 +185,7 @@ return{
"Powered by LÖVE",
"",
"Program: MrZ, Particle_G, [FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Art: MrZ, Gnyar, ScF, [旋律星萤, T0722]",
"Music: MrZ, ERM, [T0722, Aether]",
"Voice & Sound: Miya, Xiaoya, Naki, MrZ",
"Performance: 模电, HBM",
@@ -312,6 +312,7 @@ return{
RS="Rotation System",
layout="Layout",
autoPause="Pause while unfocused",
menuPos="Menu button pos.",
swap="Key Combination (Change Atk. Mode)",
simpMode="Simplistic Style",
},
@@ -892,7 +893,7 @@ return{
"Techmino is so fun!",
"TetroDictionary is now available in English.",
"The stacker future is yours in Techmino!",
"There are three hidden modes in the game.",
"There are four hidden modes in the game.",
"There is a total of 18 different pentominoes.",
"There is a total of 7 different tetrominoes.",
"Try using multiple Hold Queues!",
@@ -931,4 +932,4 @@ return{
{C.Y,"O-Spin Triple!"},
{C.Z,"What? ",C.lC,"Xspin?"},
}
}
}

View File

@@ -24,7 +24,7 @@ return{
missionFailed="Misión Fallida",
speedLV="Vel. de juego",
line="Líneas",atk="Ataque",eff="Eficiencia",
piece="Piezas",line="Líneas",atk="Ataque",eff="Eficiencia",
rpm="RPM",tsd="TSD",
grade="Grado",techrash="Techrash",
wave="Ronda",nextWave="Sig. ronda",
@@ -44,7 +44,7 @@ return{
page="Página:",
ai_fixed="La IA no es compatible con secuencias de piezas prefijadas.",
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",a IA no es compatible con secuencias de piezas personalizadas.",
--ai_prebag="The AI is incompatible with custom sequences which have nontetromino.",a IA no es compatible con secuencias de piezas personalizadas.",
ai_mission="La IA no es compatible con misiones personalizadas.",
switchSpawnSFX="Habilita los sonidos de aparición de las piezas ;)",
needRestart="Reinicia Techmino para que los cambios tengan efecto.",
@@ -151,7 +151,7 @@ return{
"Creado con LÖVE",
"",
"Programación: MrZ, Particle_G, [FinnTenzor]",
"Artistas: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Artistas: MrZ, Gnyar, ScF, [旋律星萤, T0722]",
"Música: MrZ, ERM, [T0722, Aether]",
"Voces/Sonidos: Miya, Xiaoya, Naki, MrZ Performance: 模电, HBM",
"Performance: 模电, HBM",
@@ -278,6 +278,7 @@ return{
RS="Sistema de Rotación",
layout="Diseño",
autoPause="Pausar cuando la ventana no está enfocada",
-- menuPos="Menu button pos.",
swap="Combinación de Teclas (Cambiar Modo de Ataque)",
simpMode="Modo Sencillo",
},
@@ -721,4 +722,4 @@ return{
['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"},
},
}
}

View File

@@ -24,7 +24,7 @@ return{
missionFailed="Mission échouée",
speedLV="niveau de vitesse",
line="Lignes",atk="Attaque",eff="Efficacité",
piece="Pièce",line="Lignes",atk="Attaque",eff="Efficacité",
rpm="RPM",tsd="TSD",
grade="Grade",techrash="Techrash",
wave="Vague",nextWave="Prochain",
@@ -45,7 +45,7 @@ return{
page="Page:",
ai_fixed="L'IA est incompatible avec les séquences fixes.",
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",'IA est incompatible avec les séquences personnalisées.",
--ai_prebag="The AI is incompatible with custom sequences which have nontetromino.",'IA est incompatible avec les séquences personnalisées.",
ai_mission="L'IA est incompatible avec les missions personnalisées.",
switchSpawnSFX="Activez les effets sonores d'apparition des pièces pour jouer",
needRestart="Fonctionnera dès la prochaine partie",
@@ -151,7 +151,7 @@ return{
"Powered by LÖVE",
"",
"Programme : MrZ, Particle_G, [FinnTenzor]",
"Art : MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Art : MrZ, Gnyar, ScF, [旋律星萤, T0722]",
"Musique : MrZ, ERM, [T0722, Aether]",
"Voix & Sons: Miya, Xiaoya, Naki, MrZ Performance: 模电, HBM",
"Performance: 模电, HBM",
@@ -275,6 +275,7 @@ return{
RS="Système de rotation",
layout="Disposition",
autoPause="Mettre en pause en cas de perte de focus",
-- menuPos="Menu button pos.",
swap="Combinaison de touches (changer le mode d'attaque)",
-- simpMode="Simple mode",
},
@@ -724,4 +725,4 @@ return{
['custom_clear']= {"Perso.", "NORMAL"},
['custom_puzzle']= {"Perso.", "PUZZLE"},
},
}
}

View File

@@ -25,7 +25,7 @@ return{
missionFailed="Missão falha",
speedLV="Nível de velocidade",
line="Linhas",atk="Ataque",eff="Eficiência",
piece="Peça",line="Linhas",atk="Ataque",eff="Eficiência",
rpm="RPM",tsd="TSD",
grade="Grade",techrash="Techrash",
wave="Onda",nextWave="Próxima",
@@ -45,7 +45,7 @@ return{
page="Página:",
ai_fixed="A inteligência é incompatível com sequências fixas.",
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.", inteligência é incompatível com sequências fixas.",
--ai_prebag="The AI is incompatible with custom sequences which have nontetromino.", inteligência é incompatível com sequências fixas.",
ai_mission="A inteligência é incompatível com missões costumizadas.",
switchSpawnSFX="Switch on spawn SFX to play",
needRestart="Funciona após reiniciar",
@@ -175,7 +175,7 @@ return{
"Powered by LÖVE",
"",
"Programa: MrZ, Particle_G, [FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Art: MrZ, Gnyar, ScF, [旋律星萤, T0722]",
"Music: MrZ, ERM, [T0722, Aether]",
"Voice & Sound: Miya, Xiaoya, Naki, MrZ",
"Performance: 模电, HBM",
@@ -302,6 +302,7 @@ return{
RS="Sistema de rotação",
layout="Layout",
autoPause="Pausar quando foco for perco",
-- menuPos="Menu button pos.",
swap="Combinação de tecla(Mudar modo de atk)",
-- simpMode="Simple mode",
},
@@ -875,7 +876,7 @@ return{
"Techmino tem uma edição Nspire-CX!",
"Techmino é legal!",
"TetroDictionary está disponível em Inglês.",
"Tem 3 modos escondidos no jogo.",
"Tem 4 modos escondidos no jogo.",
"Tem um total de 18 pentominoes diferentes.",
"Tem um total de 7 diferentes tetrominoes.",
"Tente usar dois botões de rotação. Todos três é melhor.",
@@ -923,4 +924,4 @@ return{
{C.Y,"暫定段位:MV"},
{C.Y,"O-spin Triple!"},
}
}
}

View File

@@ -135,6 +135,7 @@ return{
RS="''?",
layout="=-=-=",
autoPause="A||",
menuPos="←M→?",
swap="=+=+=",
simpMode=".",
},

View File

@@ -25,7 +25,7 @@ return{
maxspeed="速度封顶",
speedLV="速度等级",
line="行数",atk="",eff="",
piece="块数",line="行数",atk="",eff="",
rpm="收每分",tsd="T2",
grade="段位",techrash="消四",
wave="波数",nextWave="下一波",

View File

@@ -34,7 +34,7 @@ return{
missionFailed="非任务消除",
speedLV="速度等级",
line="行数",atk="攻击",eff="效率",
piece="块数",line="行数",atk="攻击",eff="效率",
rpm="RPM",tsd="T2",
grade="段位",techrash="Techrash",
wave="波数",nextWave="下一波",
@@ -185,7 +185,7 @@ return{
"使用LÖVE引擎",
"",
"程序: MrZ, Particle_G, [FinnTenzor]",
"美术: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"美术: MrZ, Gnyar, ScF, [旋律星萤, T0722]",
"音乐: MrZ, ERM, [T0722, Aether]",
"音效/语音: Miya, Xiaoya, Naki, MrZ",
"演出: 模电, HBM",
@@ -312,6 +312,7 @@ return{
RS="旋转系统",
layout="外观",
autoPause="失去焦点自动暂停",
menuPos="菜单按钮位置",
swap="组合键切换攻击模式",
simpMode="简洁模式",
},
@@ -1032,7 +1033,7 @@ return{
"游戏也是一种艺术形式",
"游戏中左下角三个信息分别是分数/时间/极简连击数",
"有建议的话可以把信息反馈给作者~",
"个隐藏模式不能从地图进入,到处找找看吧",
"个隐藏模式不能从地图进入,到处找找看吧",
"有疑问? 先看设置有没有你想要的",
"右下角那个问号按钮是游戏说明书",
"长期睡眠不足会引起不可逆的脑损伤(变傻)",

View File

@@ -11,7 +11,7 @@ return{
continue="继续。",
speedLV="速度等级",
line="行数",atk="攻击",eff="效率",
piece="块数",line="行数",atk="攻击",eff="效率",
rpm="收每分",tsd="T2",
grade="段位",techrash="消四",
wave="波数",nextWave="下一波",
@@ -62,13 +62,7 @@ return{
ihs="提前暂存",
},
setting_skin={
spin1="",
spin2="",
spin3="",
spin4="",
spin5="",
spin6="",
spin7="",
spin1="",spin2="",spin3="",spin4="",spin5="",spin6="",spin7="",
},
customGame={
mod="模组(F1)",

View File

@@ -164,7 +164,7 @@ do--drawableText
gamewin=T(100),gameover=T(100),pause=T(120),
speedLV=T(20),
line=T(25),atk=T(20),eff=T(20),
piece=T(25),line=T(25),atk=T(20),eff=T(20),
rpm=T(35),tsd=T(35),
grade=T(25),techrash=T(25),
wave=T(30),nextWave=T(30),
@@ -177,7 +177,7 @@ end
do--BLOCKS
local O,_=true,false
BLOCKS={
--Tetramino
--Tetromino
{{_,O,O},{O,O,_}}, --Z
{{O,O,_},{_,O,O}}, --S
{{O,O,O},{O,_,_}}, --J
@@ -236,54 +236,6 @@ do--BLOCKS
end
end
end
do--SCS(spinCenters)
local N1,N2,N3,N4={0,1},{1,0},{1,1},{.5,.5}
local I1,I2,I3,I4={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}
local V4={1.5,1.5}
local L1,L2={0,2},{2,0}
local S1,S2={-.5,.5},{.5,-.5}
local D={0,0}
SCS={
--Tetramino
{[0]=N1,N2,N3,N3},--Z
{[0]=N1,N2,N3,N3},--S
{[0]=N1,N2,N3,N3},--L
{[0]=N1,N2,N3,N3},--J
{[0]=N1,N2,N3,N3},--T
{[0]=N4,N4,N4,N4},--O
{[0]=I1,I2,I3,I4},--I
--Pentomino
{[0]=N3,N3,N3,N3},--Z5
{[0]=N3,N3,N3,N3},--S5
{[0]=N1,N2,N3,N3},--P
{[0]=N1,N2,N3,N3},--Q
{[0]=N3,N3,N3,N3},--F
{[0]=N3,N3,N3,N3},--E
{[0]=N3,N3,N3,N3},--T5
{[0]=N1,N2,N3,N3},--U
{[0]=I3,N4,I4,V4},--V
{[0]=N3,N3,N3,N3},--W
{[0]=N3,N3,N3,N3},--X
{[0]=I3,I4,I3,I4},--J5
{[0]=I3,I4,I3,I4},--L5
{[0]=I3,I4,I3,I4},--R
{[0]=I3,I4,I3,I4},--Y
{[0]=I3,I4,I3,I4},--N
{[0]=I3,I4,I3,I4},--H
{[0]=L1,L2,L1,L2},--I5
--Trimino
{[0]=N1,N2,N1,N2},--I3
{[0]=N4,N4,N4,N4},--C
--Domino
{[0]=S1,S2,N4,N4},--I2
--Dot
{[0]=D,D,D,D},--O1
}
end
oldModeNameTable={
attacker_hard="attacker_h",
attacker_ultimate="attacker_u",

View File

@@ -37,10 +37,10 @@ return{
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,69,200)
mStr("22",69,320)
mText(drawableText.wave,69,260)
mText(drawableText.nextWave,69,380)
mStr(P.modeData.wave,63,200)
mStr("22",63,320)
mText(drawableText.wave,63,260)
mText(drawableText.nextWave,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,

View File

@@ -45,10 +45,10 @@ return{
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,69,200)
mStr(20+4*math.min(math.floor(P.modeData.wave/10),2),69,320)
mText(drawableText.wave,69,260)
mText(drawableText.nextWave,69,380)
mStr(P.modeData.wave,63,200)
mStr(20+4*math.min(math.floor(P.modeData.wave/10),2),63,320)
mText(drawableText.wave,63,260)
mText(drawableText.nextWave,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,

View File

@@ -14,9 +14,9 @@ return{
bg='tunnel',bgm='echo',
},
mesDisp=function(P)
setFont(65)
mStr(P.stat.atk,69,310)
mText(drawableText.atk,69,380)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,

View File

@@ -14,9 +14,9 @@ return{
bg='blackhole',bgm='echo',
},
mesDisp=function(P)
setFont(65)
mStr(P.stat.atk,69,310)
mText(drawableText.atk,69,380)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,

View File

@@ -13,9 +13,9 @@ return{
bg='tunnel',bgm='echo',
},
mesDisp=function(P)
setFont(65)
mStr(P.stat.atk,69,310)
mText(drawableText.atk,69,380)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,

View File

@@ -14,9 +14,9 @@ return{
bg='blackhole',bgm='echo',
},
mesDisp=function(P)
setFont(65)
mStr(P.stat.atk,69,310)
mText(drawableText.atk,69,380)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,

View File

@@ -9,11 +9,11 @@ return{
bg='glow',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -13,11 +13,11 @@ return{
bg='rgb',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
gc.push('transform')
PLY.draw.applyFieldOffset(P)
gc.setColor(1,1,1,.1)

View File

@@ -14,11 +14,11 @@ return{
bg='rgb',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
gc.push('transform')
PLY.draw.applyFieldOffset(P)
gc.setColor(1,1,1,.1)

View File

@@ -10,11 +10,11 @@ return{
bg='glow',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
gc.push('transform')
PLY.draw.applyFieldOffset(P)
gc.setColor(1,1,1,.1)

View File

@@ -13,11 +13,11 @@ return{
bg='rgb',bgm='far',
},
mesDisp=function(P)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
gc.push('transform')
PLY.draw.applyFieldOffset(P)
gc.setColor(1,1,1,.1)

View File

@@ -1,3 +1,11 @@
local boarder=GC.DO{334,620,
{'setLW',2},
{'setCL',.97,.97,.975},
{'dRect',16,1,302,618,5},
{'fRect',17,612,300,2},
{'dRect',318,9,15,596,3},
{'dRect',1,9,15,596,3},
}
local gc=love.graphics
local sin,min=math.sin,math.min
return{
@@ -30,9 +38,7 @@ return{
gc.translate(150,0)
gc.setColor(.5,.5,.5)
--Frame
gc.rectangle('line',-1,-11,302,612)--Boarder
gc.rectangle('line',301,-3,15,604)--AtkBuffer boarder
gc.rectangle('line',-16,-3,15,604)--B2b bar boarder
gc.draw(boarder,-17,-12)
end
gc.pop()
end
@@ -45,11 +51,11 @@ return{
--Texts
gc.setColor(.8,.8,.8)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{min(P.stat.row,40),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -54,10 +54,10 @@ return{
end,
mesDisp=function(P)
setFont(45)
mStr(P.combo,69,310)
mStr(P.modeData.maxCombo,69,400)
mText(drawableText.combo,69,358)
mText(drawableText.maxcmb,69,450)
mStr(P.combo,63,310)
mStr(P.modeData.maxCombo,63,400)
mText(drawableText.combo,63,358)
mText(drawableText.maxcmb,63,450)
end,
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,

View File

@@ -52,10 +52,10 @@ return{
end,
mesDisp=function(P)
setFont(45)
mStr(P.combo,69,310)
mStr(P.modeData.maxCombo,69,400)
mText(drawableText.combo,69,358)
mText(drawableText.maxcmb,69,450)
mStr(P.combo,63,310)
mStr(P.modeData.maxCombo,63,400)
mText(drawableText.combo,63,358)
mText(drawableText.maxcmb,63,450)
end,
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,

View File

@@ -1,19 +1,18 @@
local gc=love.graphics
return{
color=COLOR.lBlue,
env={
smooth=false,
noTele=true,keyCancel={5,6},
das=16,arr=6,sddas=2,sdarr=2,
irs=false,ims=false,
center=0,ghost=0,
smooth=false,
drop=3,lock=3,wait=10,fall=25,
fieldH=19,
nextCount=1,holdCount=false,
sequence='rnd',
RS='Classic',
sequence='rnd',
freshLimit=0,
face={0,0,2,2,2,0,0},
noTele=true,keyCancel={5,6},
task=function(P)P.modeData.target=10 end,
dropPiece=function(P)
local D=P.modeData
@@ -36,12 +35,9 @@ return{
mesDisp=function(P)
setFont(75)
local r=P.modeData.target*.1
mStr(r<11 and 18 or r<22 and r+8 or("%02x"):format(r*10-220),69,210)
mText(drawableText.speedLV,69,290)
setFont(45)
mStr(P.stat.row,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
mStr(r<11 and 18 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
mText(drawableText.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
end,
score=function(P)return{P.stat.score,P.stat.row}end,
scoreDisp=function(D)return D[1].." "..D[2].." Lines"end,

View File

@@ -74,7 +74,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(P.stat.row,69,225)
mText(drawableText.line,69,290)
mStr(P.stat.row,63,225)
mText(drawableText.line,63,290)
end,
}

View File

@@ -50,8 +50,8 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(P.stat.row,69,225)
mText(drawableText.line,69,290)
mStr(P.stat.row,63,225)
mText(drawableText.line,63,290)
gc.push('transform')
PLY.draw.applyFieldOffset(P)
if P.modeData.showMark==0 then

View File

@@ -44,10 +44,10 @@ return{
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,69,200)
mStr(P.modeData.rpm,69,320)
mText(drawableText.wave,69,260)
mText(drawableText.rpm,69,380)
mStr(P.modeData.wave,63,200)
mStr(P.modeData.rpm,63,320)
mText(drawableText.wave,63,260)
mText(drawableText.rpm,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,

View File

@@ -44,10 +44,10 @@ return{
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,69,200)
mStr(P.modeData.rpm,69,320)
mText(drawableText.wave,69,260)
mText(drawableText.rpm,69,380)
mStr(P.modeData.wave,63,200)
mStr(P.modeData.rpm,63,320)
mText(drawableText.wave,63,260)
mText(drawableText.rpm,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,

View File

@@ -24,7 +24,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(100-P.stat.dig,69,265)
mStr(100-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,

View File

@@ -21,7 +21,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(10-P.stat.dig,69,265)
mStr(10-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,

View File

@@ -24,7 +24,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(400-P.stat.dig,69,265)
mStr(400-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,

View File

@@ -24,7 +24,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(40-P.stat.dig,69,265)
mStr(40-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,

View File

@@ -22,9 +22,9 @@ return{
bg='bg2',bgm='shift',
},
mesDisp=function(P)
setFont(65)
mStr(P.modeData.wave,69,310)
mText(drawableText.wave,69,375)
setFont(60)
mStr(P.modeData.wave,63,310)
mText(drawableText.wave,63,375)
end,
score=function(P)return{P.modeData.wave,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,

View File

@@ -21,9 +21,9 @@ return{
bg='bg2',bgm='shift',
},
mesDisp=function(P)
setFont(65)
mStr(P.modeData.wave,69,310)
mText(drawableText.wave,69,375)
setFont(60)
mStr(P.modeData.wave,63,310)
mText(drawableText.wave,63,375)
end,
score=function(P)return{P.modeData.wave,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,

View File

@@ -82,9 +82,11 @@ return{
bg='blockfall',bgm='reason',
},
mesDisp=function(P)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,265)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{math.min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -12,9 +12,11 @@ return{
bg='blockfall',bgm='reason',
},
mesDisp=function(P)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,265)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -7,9 +7,9 @@ return{
},
mesDisp=function(P)
setFont(45)
mStr(("%.1f"):format(P.stat.atk),69,190)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
mStr(("%.1f"):format(P.stat.atk),63,190)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310)
mText(drawableText.atk,63,243)
mText(drawableText.eff,63,363)
end,
}

View File

@@ -44,11 +44,11 @@ return{
end,
mesDisp=function(P)
setFont(45)
mStr(P.stat.dig,69,190)
mStr(P.stat.atk,69,310)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),69,420)
mText(drawableText.line,69,243)
mText(drawableText.atk,69,363)
mText(drawableText.eff,69,475)
mStr(P.stat.dig,63,190)
mStr(P.stat.atk,63,310)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,420)
mText(drawableText.line,63,243)
mText(drawableText.atk,63,363)
mText(drawableText.eff,63,475)
end,
}

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local dropSpeed={50,40,30,25,20,15,12,9,7,5,4,3,2,1,1,.5,.5,.25,.25}
return{
@@ -36,10 +35,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
getRank=function(P)

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
return{
color=COLOR.magenta,
env={
@@ -27,10 +25,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local dropSpeed={50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25}
return{
@@ -24,10 +23,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,

View File

@@ -41,16 +41,16 @@ return{
},
slowMark=true,
mesDisp=function(P)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
mText(drawableText.grade,69,170)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
mText(drawableText.grade,63,170)
setFont(55)
mStr(P.modeData.rankName,69,110)
mStr(P.modeData.rankName,63,110)
setFont(20)
mStr(("%.1f"):format(P.modeData.rankPoint/10),69,198)
mStr(("%.1f"):format(P.modeData.rankPoint/10),63,198)
setFont(75)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{P.modeData.rankPoint,P.stat.score}end,
scoreDisp=function(D)return sectionName[math.floor(D[1]/10)+1].." "..D[2]end,

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local function score(P)
local D=P.modeData
@@ -58,10 +57,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.pt,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local death_lock={12,11,10,9,8, 7,7,7,7,6}
local death_wait={10,9, 8, 7,6, 6,6,5,5,4}
local death_fall={10,9, 8, 7,6, 6,5,5,4,4}
@@ -74,10 +73,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.pt,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local rush_lock={20,18,16,15,14}
local rush_wait={12,10, 9, 8, 7}
local rush_fall={18,16,14,13,12}
@@ -60,10 +59,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.pt,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local rush_lock={20,18,16,15,14, 14,13,12,11,11}
local rush_wait={12,11,11,10,10, 10,10, 9, 9, 9}
local rush_fall={18,16,14,13,12, 12,11,11,10,10}
@@ -74,10 +73,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.pt,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
return{
color=COLOR.black,
env={
@@ -147,10 +145,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.pt,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.result=='win'and 260 or P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local death_lock={12,11,10,9,8, 7,7,7,6,6}
local death_wait={10, 9, 8,7,6, 6,5,4,4,3}
local death_fall={10, 9, 8,7,6, 5,5,4,3,3}
@@ -69,10 +68,7 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.pt,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,

View File

@@ -10,7 +10,7 @@ return{
color=COLOR.white,
env={
bg={'bg1','bg2','blackhole','blockfall','blockrain','blockspace','cubes','fan','flink','glow','lightning','matrix','rainbow','rainbow2','rgb','tunnel','welcome'},
bgm={'battle','beat5th','cruelty','distortion','echo','far','final','here','hope','memory','moonbeam','push','rectification','secret7th remix','secret7th','secret8th remix','secret8th','shift','shining terminal','storm','super7th','there','truth','vapor','warped','waterfall'},
bgm={'battle','beat5th','cruelty','distortion','echo','far','final','here','hope','memory','moonbeam','push','rectification','secret7th remix','secret7th','secret8th remix','secret8th','shift','shining terminal','storm','super7th','there','truth','vapor','waterfall'},
},
load=function()
for k,v in next,NET.roomState.roomData do

View File

@@ -9,13 +9,15 @@ return{
bg='rgb',bgm='truth',
},
mesDisp=function(P)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,220)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
setFont(70)
mStr(P.stat.pc,69,300)
mText(drawableText.pc,69,380)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,350)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,

View File

@@ -23,8 +23,8 @@ return{
},
mesDisp=function(P)
setFont(70)
mStr(P.stat.pc,69,300)
mText(drawableText.pc,69,380)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,350)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,

View File

@@ -9,13 +9,15 @@ return{
bg='rgb',bgm='moonbeam',
},
mesDisp=function(P)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,220)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
setFont(70)
mStr(P.stat.pc,69,300)
mText(drawableText.pc,69,380)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,350)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,

View File

@@ -7,13 +7,15 @@ return{
bg='rgb',bgm='truth',
},
mesDisp=function(P)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,220)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
setFont(70)
mStr(P.stat.pc,69,300)
mText(drawableText.pc,69,380)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,350)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,

View File

@@ -58,8 +58,8 @@ return{
end,
mesDisp=function(P)
setFont(70)
mStr(P.stat.pc,69,300)
mText(drawableText.pc,69,380)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,350)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,

View File

@@ -49,8 +49,8 @@ return{
end,
mesDisp=function(P)
setFont(70)
mStr(P.stat.pc,69,300)
mText(drawableText.pc,69,380)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,350)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,

View File

@@ -45,21 +45,18 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,69,178)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',69,200,30)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',69,200,30+45*beat)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -45,21 +45,18 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,69,178)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',69,200,30)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',69,200,30+45*beat)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -51,21 +51,18 @@ return{
},
slowMark=true,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,320)
mStr(P.modeData.target,69,370)
gc.rectangle('fill',25,375,90,4)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,69,178)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',69,200,30)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',69,200,30+45*beat)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -8,10 +8,10 @@ return{
},
mesDisp=function(P)
setFont(45)
mStr(("%.1f"):format(P.stat.atk),69,190)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
mStr(("%.1f"):format(P.stat.atk),63,190)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310)
mText(drawableText.atk,63,243)
mText(drawableText.eff,63,363)
end,
score=function(P)return{P.stat.atk<=100 and math.floor(P.stat.atk)or 100,P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,

View File

@@ -11,7 +11,7 @@ return{
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,265)
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
getRank=function(P)

View File

@@ -10,7 +10,7 @@ return{
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,265)
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
getRank=function(P)

View File

@@ -11,7 +11,7 @@ return{
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,265)
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,

View File

@@ -10,7 +10,7 @@ return{
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,265)
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,

View File

@@ -11,7 +11,7 @@ return{
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,265)
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
getRank=function(P)

View File

@@ -9,7 +9,7 @@ return{
setFont(55)
local r=1000-P.stat.row
if r<0 then r=0 end
mStr(r,69,265)
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,

Some files were not shown because too many files have changed in this diff Show More