This commit is contained in:
user670
2021-06-08 21:28:36 +08:00
211 changed files with 5999 additions and 4553 deletions

View File

@@ -2,37 +2,87 @@ name: Techmino CI
on: on:
push: push:
branches: [ ci ] branches: [ main, ci ]
pull_request:
branches: [ ci ]
jobs: jobs:
build-windows: build-windows:
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
with:
lfs: true
- name: Download love - name: Download love
run: | run: |
curl -LO https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip curl -OL https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
7z x love-11.3-win64.zip 7z x love-11.3-win64.zip
- name: Download ColdClear - name: Download ColdClear
run: | run: |
curl -LO https://github.com/26F-Studio/Techmino/releases/download/coldclear/coldclear.zip curl -OL https://github.com/26F-Studio/cold_clear_ai_love2d_wrapper/releases/download/20210520/win64.zip
7z x coldclear.zip -ocoldclear 7z x win64.zip -ocoldclear
move coldclear\win64\cold_clear.dll love-11.3-win64 move coldclear\cold_clear.dll love-11.3-win64
move coldclear\win64\CCloader.dll love-11.3-win64 move coldclear\CCloader.dll love-11.3-win64
- name: Pack Techmino - name: Pack Techmino
shell: cmd shell: cmd
run: | run: |
7z a game.zip BGM document image modes parts SFX VOICE Zframework conf.lua font.ttf main.lua 7z a -tzip game.love document media parts Zframework conf.lua font.ttf main.lua
move game.zip game.love
copy /b love-11.3-win64\love.exe + game.love love-11.3-win64\Techmino.exe 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\love.exe
del love-11.3-win64\lovec.exe del love-11.3-win64\lovec.exe
- name: Artifact - name: Artifact
uses: actions/upload-artifact@v1.0.0 uses: actions/upload-artifact@v1.0.0
with: with:
name: Techmino_win64 name: Windows
path: love-11.3-win64 path: love-11.3-win64
build-linux:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Download AppImageKit
run: curl -OL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage
- name: Unpack and Repack
run: |
curl -OL https://github.com/26F-Studio/Techmino/releases/download/v0.15.1/Techmino.AppImage
chmod +x Techmino.AppImage appimagetool-x86_64.AppImage
./Techmino.AppImage --appimage-extract
rm Techmino.AppImage
cd squashfs-root/usr/share/Techmino
rm -rf document media parts Zframework conf.lua font.ttf main.lua
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
uses: actions/upload-artifact@v2
with:
name: Linux
path: Techmino.AppImage
build-android:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Download Apktool
run: curl -OL https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.5.0.jar
- name: Unpack and Repack
run: |
curl -OL https://github.com/26F-Studio/Techmino/releases/download/v0.15.1/Techmino.apk
java -jar apktool_2.5.0.jar d -s -o apk Techmino.apk
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
java -jar apktool_2.5.0.jar b -o Techmino.apk apk
- uses: 26F-Studio/sign-android-release@master
name: Sign app APK
id: sign_app
with:
releaseDirectory: .
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
env:
BUILD_TOOLS_VERSION: "30.0.2"
- name: Artifact
uses: actions/upload-artifact@v2
with:
name: Android
path: ${{steps.sign_app.outputs.signedReleaseFile}}

12
.github/workflows/updateVersion.py vendored Normal file
View File

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

View File

@@ -7,4 +7,11 @@ function aDraw.simpY(obj,x,y)draw(obj,x,y-obj:getHeight()*.5)end
function aDraw.X(obj,x,y,a,k)draw(obj,x,y,a,k,nil,obj:getWidth()*.5,0)end function aDraw.X(obj,x,y,a,k)draw(obj,x,y,a,k,nil,obj:getWidth()*.5,0)end
function aDraw.Y(obj,x,y,a,k)draw(obj,x,y,a,k,nil,0,obj:getHeight()*.5)end function aDraw.Y(obj,x,y,a,k)draw(obj,x,y,a,k,nil,0,obj:getHeight()*.5)end
function aDraw.draw(obj,x,y,a,k)draw(obj,x,y,a,k,nil,obj:getWidth()*.5,obj:getHeight()*.5)end function aDraw.draw(obj,x,y,a,k)draw(obj,x,y,a,k,nil,obj:getWidth()*.5,obj:getHeight()*.5)end
function aDraw.outDraw(obj,div,x,y,a,k)
local w,h=obj:getWidth()*.5,obj:getHeight()*.5
draw(obj,x-div,y-div,a,k,nil,w,h)
draw(obj,x-div,y+div,a,k,nil,w,h)
draw(obj,x+div,y-div,a,k,nil,w,h)
draw(obj,x+div,y+div,a,k,nil,w,h)
end
return aDraw return aDraw

View File

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

View File

@@ -50,7 +50,7 @@ function BGM.init(list)
Sources[list[i]]:setLooping(true) Sources[list[i]]:setLooping(true)
Sources[list[i]]:setVolume(0) Sources[list[i]]:setVolume(0)
else else
LOG.print("No BGM file: "..list[i],5,COLOR.O) LOG.print("No BGM file: "..list[i],5,'warn')
end end
if not skip and i~=count then if not skip and i~=count then
coroutine.yield() coroutine.yield()

View File

@@ -57,10 +57,10 @@ local COLOR={
white= {1.0, 1.0, 1.0}, white= {1.0, 1.0, 1.0},
} }
for k,v in next,{ 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", 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',
lR="lRed",lF="lFire",lO="lOrange",lY="lYellow",lL="lLime",lJ="lJade",lG="lGreen",lA="lAqua",lC="lCyan",lN="lNavy",lS="lSea",lB="lBlue",lV="lViolet",lP="lPurple",lM="lMagenta",lW="lWine", lR='lRed',lF='lFire',lO='lOrange',lY='lYellow',lL='lLime',lJ='lJade',lG='lGreen',lA='lAqua',lC='lCyan',lN='lNavy',lS='lSea',lB='lBlue',lV='lViolet',lP='lPurple',lM='lMagenta',lW='lWine',
dR="dRed",dF="dFire",dO="dOrange",dY="dYellow",dL="dLime",dJ="dJade",dG="dGreen",dA="dAqua",dC="dCyan",dN="dNavy",dS="dSea",dB="dBlue",dV="dViolet",dP="dPurple",dM="dMagenta",dW="dWine", dR='dRed',dF='dFire',dO='dOrange',dY='dYellow',dL='dLime',dJ='dJade',dG='dGreen',dA='dAqua',dC='dCyan',dN='dNavy',dS='dSea',dB='dBlue',dV='dViolet',dP='dPurple',dM='dMagenta',dW='dWine',
D="black",dH="dGray",H="gray",lH="lGray",Z="white", D='black',dH='dGray',H='gray',lH='lGray',Z='white',
--Remain letter: EIKQTUX --Remain letter: EIKQTUX
}do }do
COLOR[k]=COLOR[v] COLOR[k]=COLOR[v]
@@ -72,19 +72,19 @@ end})
do--Random generators do--Random generators
local rnd=math.random local rnd=math.random
local list_norm={"red","fire","orange","yellow","lime","jade","green","aqua","cyan","navy","sea","blue","violet","purple","magenta","wine"} local list_norm={'red','fire','orange','yellow','lime','jade','green','aqua','cyan','navy','sea','blue','violet','purple','magenta','wine'}
local len_list_norm=#list_norm local len_list_norm=#list_norm
function COLOR.random_norm() function COLOR.random_norm()
return COLOR[list_norm[rnd(len_list_norm)]] return COLOR[list_norm[rnd(len_list_norm)]]
end end
local list_bright={"lRed","lFire","lOrange","lYellow","lLime","lJade","lGreen","lAqua","lCyan","lNavy","lSea","lBlue","lViolet","lPurple","lMagenta","lWine"} local list_bright={'lRed','lFire','lOrange','lYellow','lLime','lJade','lGreen','lAqua','lCyan','lNavy','lSea','lBlue','lViolet','lPurple','lMagenta','lWine'}
local len_list_bright=#list_bright local len_list_bright=#list_bright
function COLOR.random_bright() function COLOR.random_bright()
return COLOR[list_bright[rnd(len_list_bright)]] return COLOR[list_bright[rnd(len_list_bright)]]
end end
local list_dark={"dRed","dFire","dOrange","dYellow","dLime","dJade","dGreen","dAqua","dCyan","dNavy","dSea","dBlue","dViolet","dPurple","dMagenta","dWine"} local list_dark={'dRed','dFire','dOrange','dYellow','dLime','dJade','dGreen','dAqua','dCyan','dNavy','dSea','dBlue','dViolet','dPurple','dMagenta','dWine'}
local len_list_dark=#list_dark local len_list_dark=#list_dark
function COLOR.random_dark() function COLOR.random_dark()
return COLOR[list_dark[rnd(len_list_dark)]] return COLOR[list_dark[rnd(len_list_dark)]]

View File

@@ -4,6 +4,7 @@ local cmds={
move="translate", move="translate",
scale="scale", scale="scale",
rotate="rotate", rotate="rotate",
shear="shear",
clear="clear", clear="clear",
setCL="setColor", setCL="setColor",
@@ -12,10 +13,11 @@ local cmds={
setLS="setLineStyle", setLS="setLineStyle",
setLJ="setLineJoin", setLJ="setLineJoin",
setFT=setFont,
print="print", print="print",
mText=function(...)ADRAW.str(...)end, setFT=setFont,
mDraw=function(...)ADRAW.draw(...)end, mText=ADRAW.str,
mDraw=ADRAW.draw,
mOutDraw=ADRAW.outDraw,
draw="draw", draw="draw",
line="line", line="line",
@@ -23,6 +25,8 @@ local cmds={
dRect=function(...)gc.rectangle('line',...)end, dRect=function(...)gc.rectangle('line',...)end,
fCirc=function(...)gc.circle('fill',...)end, fCirc=function(...)gc.circle('fill',...)end,
dCirc=function(...)gc.circle('line',...)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, fPoly=function(...)gc.polygon('fill',...)end,
dPoly=function(...)gc.polygon('line',...)end, dPoly=function(...)gc.polygon('line',...)end,

View File

@@ -21,7 +21,7 @@ function FILE.load(name)
return s return s
end end
end end
LOG.print(name.." "..text.loadError,COLOR.R) LOG.print(name.." "..text.loadError,'error')
end end
end end
function FILE.save(data,name,mode) function FILE.save(data,name,mode)
@@ -50,11 +50,39 @@ function FILE.save(data,name,mode)
F:flush()F:close() F:flush()F:close()
if success then if success then
if not mode:find'q'then if not mode:find'q'then
LOG.print(text.saveDone,COLOR.G) LOG.print(text.saveDone,'message')
end end
else else
LOG.print(text.saveError..(mes or"unknown error"),'error') LOG.print(text.saveError..(mes or"unknown error"),'error')
LOG.print(debug.traceback(),'error') LOG.print(debug.traceback(),'error')
end end
end end
function FILE.clear(path)
if fs.getRealDirectory(path)~=SAVEDIR or fs.getInfo(path).type~='directory'then return end
for _,name in next,fs.getDirectoryItems(path)do
name=path.."/"..name
if fs.getRealDirectory(name)==SAVEDIR then
local t=fs.getInfo(name).type
if t=='file'then
fs.remove(name)
end
end
end
end
function FILE.clear_s(path)
if path~=""and(fs.getRealDirectory(path)~=SAVEDIR or fs.getInfo(path).type~='directory')then return end
for _,name in next,fs.getDirectoryItems(path)do
name=path.."/"..name
if fs.getRealDirectory(name)==SAVEDIR then
local t=fs.getInfo(name).type
if t=='file'then
fs.remove(name)
elseif t=='directory'then
FILE.clear_s(name)
fs.remove(name)
end
end
end
fs.remove(path)
end
return FILE return FILE

View File

@@ -3,21 +3,21 @@ EDITING=""
LOADED=false LOADED=false
ERRDATA={} ERRDATA={}
SCR= require"Zframework.screen"
COLOR= require"Zframework.color"
SCN= require"Zframework.scene"
LOG= require"Zframework.log"
WS= require"Zframework.websocket"
LOADLIB=require"Zframework.loadLib"
WHEELMOV=require"Zframework.wheelScroll"
require"Zframework.setFont" require"Zframework.setFont"
ADRAW=require"Zframework.aDraw" ADRAW=require"Zframework.aDraw"
mStr=ADRAW.str mStr=ADRAW.str
mText=ADRAW.simpX mText=ADRAW.simpX
mDraw=ADRAW.draw mDraw=ADRAW.draw
SCR= require"Zframework.screen"
COLOR= require"Zframework.color"
LOG= require"Zframework.log"
SCN= require"Zframework.scene"
WS= require"Zframework.websocket"
LOADLIB=require"Zframework.loadLib"
WHEELMOV=require"Zframework.wheelScroll"
JSON=require"Zframework.json" JSON=require"Zframework.json"
TABLE=require"Zframework.tableExtend" TABLE=require"Zframework.tableExtend"
STRING=require"Zframework.stringExtend" STRING=require"Zframework.stringExtend"
@@ -45,11 +45,12 @@ THEME= require"Zframework.theme"
local ms,kb=love.mouse,love.keyboard local ms,kb=love.mouse,love.keyboard
local gc=love.graphics local gc=love.graphics
local gc_push,gc_pop=gc.push,gc.pop local gc_push,gc_pop,gc_clear=gc.push,gc.pop,gc.clear
local gc_discard,gc_present=gc.discard,gc.present local gc_replaceTransform,gc_present=gc.replaceTransform,gc.present
local gc_setColor,gc_draw,gc_rectangle=gc.setColor,gc.draw,gc.rectangle local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_print=gc.print local gc_draw,gc_line,gc_print=gc.draw,gc.line,gc.print
local setFont=setFont
local setFont,mStr=setFont,mStr
local int,rnd,abs=math.floor,math.random,math.abs local int,rnd,abs=math.floor,math.random,math.abs
local min,sin=math.min,math.sin local min,sin=math.min,math.sin
@@ -64,18 +65,27 @@ joysticks={}
local devMode local devMode
local batteryImg=DOGC{31,20,
{'fRect',1,0,26,2},
{'fRect',1,18,26,2},
{'fRect',0,1,2,18},
{'fRect',26,1,2,18},
{'fRect',29,3,2,14},
}
local infoCanvas=gc.newCanvas(108,27) local infoCanvas=gc.newCanvas(108,27)
local function updatePowerInfo() local function updatePowerInfo()
local state,pow=love.system.getPowerInfo() local state,pow=love.system.getPowerInfo()
gc.setCanvas(infoCanvas)gc_push('transform')gc.origin() gc.setCanvas(infoCanvas)
gc.clear(0,0,0,.25) gc_push('transform')
gc.origin()
gc_clear(0,0,0,.25)
if state~='unknown'then if state~='unknown'then
gc.setLineWidth(4) gc_setLineWidth(4)
local charging=state=='charging' local charging=state=='charging'
if state=='nobattery'then if state=='nobattery'then
gc_setColor(1,1,1) gc_setColor(1,1,1)
gc.setLineWidth(2) gc_setLineWidth(2)
gc.line(74,SCR.safeX+5,100,22) gc_line(74,SCR.safeX+5,100,22)
elseif pow then elseif pow then
if charging then gc_setColor(0,1,0) if charging then gc_setColor(0,1,0)
elseif pow>50 then gc_setColor(1,1,1) elseif pow>50 then gc_setColor(1,1,1)
@@ -83,7 +93,7 @@ local function updatePowerInfo()
elseif pow==26 then gc_setColor(.5,0,1) elseif pow==26 then gc_setColor(.5,0,1)
else gc_setColor(1,0,0) else gc_setColor(1,0,0)
end end
gc_rectangle('fill',76,6,pow*.22,14) gc.rectangle('fill',76,6,pow*.22,14)
if pow<100 then if pow<100 then
setFont(15) setFont(15)
gc_setColor(0,0,0) gc_setColor(0,0,0)
@@ -95,11 +105,12 @@ local function updatePowerInfo()
gc_print(pow,78,2) gc_print(pow,78,2)
end end
end end
gc_draw(IMG.batteryImage,73,3) gc_draw(batteryImg,73,3)
end end
setFont(25) setFont(25)
gc_print(os.date("%H:%M"),3,-5) gc_print(os.date("%H:%M"),3,-5)
gc_pop()gc.setCanvas() gc_pop()
gc.setCanvas()
end end
------------------------------------------------------------- -------------------------------------------------------------
local lastX,lastY=0,0--Last click pos local lastX,lastY=0,0--Last click pos
@@ -129,7 +140,7 @@ function love.mousemoved(x,y,dx,dy,touch)
dx,dy=dx/SCR.k,dy/SCR.k dx,dy=dx/SCR.k,dy/SCR.k
if SCN.mouseMove then SCN.mouseMove(mx,my,dx,dy)end if SCN.mouseMove then SCN.mouseMove(mx,my,dx,dy)end
if ms.isDown(1)then if ms.isDown(1)then
WIDGET.drag(mx,my,dx,dy) WIDGET.drag(mx,my,dx/SCR.k,dy/SCR.k)
else else
WIDGET.cursorMove(mx,my) WIDGET.cursorMove(mx,my)
end end
@@ -145,7 +156,12 @@ function love.mousereleased(x,y,k,touch)
end end
function love.wheelmoved(x,y) function love.wheelmoved(x,y)
if SCN.swapping then return end if SCN.swapping then return end
if SCN.wheelMoved then SCN.wheelMoved(x,y)end if SCN.wheelMoved then
SCN.wheelMoved(x,y)
else
WIDGET.unFocus()
WIDGET.drag(0,0,0,100*y)
end
end end
function love.touchpressed(id,x,y) function love.touchpressed(id,x,y)
@@ -153,6 +169,7 @@ function love.touchpressed(id,x,y)
if SCN.swapping then return end if SCN.swapping then return end
if not touching then if not touching then
touching=id touching=id
WIDGET.unFocus(true)
love.touchmoved(id,x,y,0,0) love.touchmoved(id,x,y,0,0)
end end
x,y=xOy:inverseTransformPoint(x,y) x,y=xOy:inverseTransformPoint(x,y)
@@ -164,15 +181,10 @@ function love.touchmoved(_,x,y,dx,dy)
if SCN.swapping then return end if SCN.swapping then return end
x,y=xOy:inverseTransformPoint(x,y) x,y=xOy:inverseTransformPoint(x,y)
if SCN.touchMove then SCN.touchMove(x,y,dx/SCR.k,dy/SCR.k)end if SCN.touchMove then SCN.touchMove(x,y,dx/SCR.k,dy/SCR.k)end
if WIDGET.sel then WIDGET.drag(x,y,dx/SCR.k,dy/SCR.k)
if touching then if touching then
WIDGET.drag(x,y,dx,dy)
end
else
WIDGET.cursorMove(x,y) WIDGET.cursorMove(x,y)
if not WIDGET.sel then if not WIDGET.sel then touching=false end
touching=false
end
end end
end end
function love.touchreleased(id,x,y) function love.touchreleased(id,x,y)
@@ -181,10 +193,9 @@ function love.touchreleased(id,x,y)
if id==touching then if id==touching then
WIDGET.press(x,y,1) WIDGET.press(x,y,1)
WIDGET.release(x,y) WIDGET.release(x,y)
WIDGET.cursorMove(x,y)
WIDGET.unFocus()
touching=false touching=false
if WIDGET.sel and not WIDGET.sel.keepFocus then
WIDGET.sel=false
end
end end
if SCN.touchUp then SCN.touchUp(x,y)end if SCN.touchUp then SCN.touchUp(x,y)end
if(x-lastX)^2+(y-lastY)^2<62 then if(x-lastX)^2+(y-lastY)^2<62 then
@@ -197,7 +208,7 @@ local function noDevkeyPressed(key)
if key=="f1"then if key=="f1"then
PROFILE.switch() PROFILE.switch()
elseif key=="f2"then elseif key=="f2"then
LOG.print(("System:%s[%s]\nluaVer:%s\njitVer:%s\njitVerNum:%s"):format(SYSTEM,jit.arch,_VERSION,jit.version,jit.version_num)) LOG.print(("System:%s[%s]\nluaVer:%s\njitVer:%s\njitVerNum:%s"):format(SYSTEM,jit.arch,_VERSION,jit.version,jit.version_num),'message')
elseif key=="f3"then elseif key=="f3"then
for _=1,8 do for _=1,8 do
local P=PLY_ALIVE[rnd(#PLY_ALIVE)] local P=PLY_ALIVE[rnd(#PLY_ALIVE)]
@@ -206,19 +217,27 @@ local function noDevkeyPressed(key)
P:lose() P:lose()
end end
end end
elseif key=="f4"then if not kb.isDown("lalt","ralt")then LOG.copy()end elseif key=="f4"and not kb.isDown("lalt","ralt")then
elseif key=="f5"then if WIDGET.sel then print(WIDGET.sel)end LOG.copy()
elseif key=="f6"then for k,v in next,_G do print(k,v)end elseif key=="f5"then
elseif key=="f7"then if love._openConsole then love._openConsole()end print(WIDGET.isFocus()or"no widget selected")
elseif key=="f8"then devMode=nil LOG.print("DEBUG OFF",COLOR.Y) elseif key=="f6"then
elseif key=="f9"then devMode=1 LOG.print("DEBUG 1",COLOR.Y) for k,v in next,_G do print(k,v)end
elseif key=="f10"then devMode=2 LOG.print("DEBUG 2",COLOR.Y) elseif key=="f7"and love._openConsole then
elseif key=="f11"then devMode=3 LOG.print("DEBUG 3",COLOR.Y) love._openConsole()
elseif key=="f12"then devMode=4 LOG.print("DEBUG 4",COLOR.Y) elseif key=="f8"then
elseif key=="\\"then _G["\100\114\97\119\70\87\77"]=NULL devMode=nil LOG.print("DEBUG OFF",10)
elseif key=="f9"then
devMode=1 LOG.print("DEBUG 1")
elseif key=="f10"then
devMode=2 LOG.print("DEBUG 2")
elseif key=="f11"then
devMode=3 LOG.print("DEBUG 3")
elseif key=="f12"then
devMode=4 LOG.print("DEBUG 4")
elseif devMode==2 then elseif devMode==2 then
if WIDGET.sel then
local W=WIDGET.sel local W=WIDGET.sel
if W then
if key=="left"then W.x=W.x-10 if key=="left"then W.x=W.x-10
elseif key=="right"then W.x=W.x+10 elseif key=="right"then W.x=W.x+10
elseif key=="up"then W.y=W.y-10 elseif key=="up"then W.y=W.y-10
@@ -244,9 +263,13 @@ function love.keypressed(key)
return return
elseif key=="f8"then elseif key=="f8"then
devMode=1 devMode=1
LOG.print("DEBUG ON",COLOR.Y) LOG.print("DEBUG ON",10)
elseif key=="f11"then elseif key=="f11"then
if kb.isDown("lctrl","rctrl")then
_G["\100\114\97\119\70\87\77"]=NULL
else
switchFullscreen() switchFullscreen()
end
elseif not SCN.swapping then elseif not SCN.swapping then
if SCN.keyDown then if SCN.keyDown then
SCN.keyDown(key) SCN.keyDown(key)
@@ -270,15 +293,14 @@ function love.textinput(texts)
end end
function love.joystickadded(JS) function love.joystickadded(JS)
joysticks[#joysticks+1]=JS ins(joysticks,JS)
LOG.print("Joystick added",'message')
end end
function love.joystickremoved(JS) function love.joystickremoved(JS)
for i=1,#joysticks do local i=TABLE.find(joysticks,JS)
if joysticks[i]==JS then if i then
rem(joysticks,i) rem(joysticks,i)
LOG.print("Joystick removed",COLOR.Y) LOG.print("Joystick removed",'message')
return
end
end end
end end
local keyMirror={ local keyMirror={
@@ -344,6 +366,7 @@ function love.resize(w,h)
SCR.resize(w,h) SCR.resize(w,h)
if BG.resize then BG.resize(w,h)end if BG.resize then BG.resize(w,h)end
if SCN.resize then SCN.resize(w,h)end if SCN.resize then SCN.resize(w,h)end
WIDGET.resize(w,h)
SHADER.warning:send("w",w*SCR.dpi) SHADER.warning:send("w",w*SCR.dpi)
SHADER.warning:send("h",h*SCR.dpi) SHADER.warning:send("h",h*SCR.dpi)
@@ -387,7 +410,7 @@ function love.errorhandler(msg)
if LOADED and #ERRDATA<3 then if LOADED and #ERRDATA<3 then
BG.set('none') BG.set('none')
local scn=SCN and SCN.cur or"NULL" local scn=SCN and SCN.cur or"NULL"
ERRDATA[#ERRDATA+1]={mes=err,scene=scn} ins(ERRDATA,{mes=err,scene=scn})
--Write messages to log file --Write messages to log file
love.filesystem.append("conf/error.log", love.filesystem.append("conf/error.log",
@@ -428,9 +451,9 @@ function love.errorhandler(msg)
SCR.resize(a,b) SCR.resize(a,b)
end end
end end
gc.clear(.3,.5,.9) gc_clear(.3,.5,.9)
gc_push('transform') gc_push('transform')
gc.replaceTransform(xOy) gc_replaceTransform(SCR.xOy)
setFont(100)gc_print(":(",100,0,0,1.2) setFont(100)gc_print(":(",100,0,0,1.2)
setFont(40)gc.printf(errorMsg,100,160,SCR.w0-100) setFont(40)gc.printf(errorMsg,100,160,SCR.w0-100)
setFont(20) setFont(20)
@@ -446,22 +469,53 @@ function love.errorhandler(msg)
end end
end end
end end
local WS=WS
local WSnames={'app','user','play','stream','chat'} love.draw,love.update=nil--remove default draw/update
local WScolor={
{1,.5,.5,.7},
{1,.8,.3,.7},
{1,1,.4,.7},
{.4,1,.7,.7},
{.5,.8,1,.7},
}
local devColor={ local devColor={
COLOR.Z, COLOR.Z,
COLOR.lM, COLOR.lM,
COLOR.lG, COLOR.lG,
COLOR.lB, COLOR.lB,
} }
love.draw,love.update=nil--remove default draw/update local WS=WS
local WSnames={'app','user','play','stream','chat','manage'}
local wsBottomImage do
local L={78,18,
{'clear',1,1,1,0},
{'setCL',1,1,1,.3},
{'fRect',60,0,18,18},
}
for i=0,59 do
ins(L,{'setCL',1,1,1,i*.005})
ins(L,{'fRect',i,0,1,18})
end
wsBottomImage=DOGC(L)
end
local ws_deadImg=DOGC{20,20,
{'setFT',20},
{'setCL',1,.3,.3},
{'print',"X",3,-4},
}
local ws_connectingImg=DOGC{20,20,
{'setLW',3},
{'dArc',11.5,10,6.26,1,5.28},
}
local ws_runningImg=DOGC{20,20,
{'setFT',20},
{'setCL',.5,1,0},
{'print',"R",3,-4},
}
local cursorImg=DOGC{16,16,
{"fCirc",8,8,4},
{"setCL",1,1,1,.7},
{"fCirc",8,8,6},
}
local cursor_holdImg=DOGC{16,16,
{"setLW",2},
{"dCirc",8,8,7},
{"fCirc",8,8,3},
}
function love.run() function love.run()
local love=love local love=love
@@ -470,7 +524,6 @@ function love.run()
local TEXTURE,TIME=TEXTURE,TIME local TEXTURE,TIME=TEXTURE,TIME
local SETTING,VERSION=SETTING,VERSION local SETTING,VERSION=SETTING,VERSION
local destroyPlayers=destroyPlayers
local STEP,WAIT=love.timer.step,love.timer.sleep local STEP,WAIT=love.timer.step,love.timer.sleep
local FPS,MINI=love.timer.getFPS,love.window.isMinimized local FPS,MINI=love.timer.getFPS,love.window.isMinimized
@@ -512,12 +565,12 @@ function love.run()
TASK.update() TASK.update()
WS.update(dt) WS.update(dt)
VOC.update() VOC.update()
BG.update(dt)--BG animation BG.update(dt)
SYSFX.update(dt) SYSFX.update(dt)
WIDGET.update()--Widgets animation WIDGET.update()
if SCN.update then SCN.update(dt)end--Scene updater if SCN.update then SCN.update(dt)end
if SCN.swapping then SCN.swapUpdate()end--Scene swapping animation if SCN.swapping then SCN.swapUpdate()end
TEXT.update()--Update global texts animation TEXT.update()
LOG.update() LOG.update()
--DRAW --DRAW
@@ -526,22 +579,14 @@ function love.run()
if FCT>=100 then if FCT>=100 then
FCT=FCT-100 FCT=FCT-100
--Draw background gc_replaceTransform(SCR.origin)
gc_setColor(1,1,1)
BG.draw() BG.draw()
gc_replaceTransform(SCR.xOy)
gc_push('transform')
gc.replaceTransform(xOy)
--Draw scene contents
if SCN.draw then SCN.draw()end if SCN.draw then SCN.draw()end
--Draw widgets
WIDGET.draw() WIDGET.draw()
SYSFX.draw()
--Draw Version string TEXT.draw()
gc_setColor(.8,.8,.8,.4)
setFont(20)
mStr(VERSION.string,640,693)
--Draw cursor --Draw cursor
if mouseShow then if mouseShow then
@@ -551,83 +596,75 @@ function love.run()
_=SCS[R][0] _=SCS[R][0]
gc_draw(TEXTURE.miniBlock[R],mx,my,time%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5) 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_setColor(1,1,1)
gc_draw(TEXTURE[ms.isDown(1)and'cursor_hold'or'cursor'],mx,my,nil,nil,nil,8,8) gc_draw(ms.isDown(1)and cursor_holdImg or cursorImg,mx,my,nil,nil,nil,8,8)
end end
SYSFX.draw() gc_replaceTransform(SCR.xOy_ul)
TEXT.draw() LOG.draw()
gc_pop() gc_replaceTransform(SCR.origin)
--Draw power info. --Draw power info.
gc_setColor(1,1,1)
if SETTING.powerInfo then if SETTING.powerInfo then
gc_setColor(1,1,1)
gc_draw(infoCanvas,SCR.safeX,0,0,SCR.k) gc_draw(infoCanvas,SCR.safeX,0,0,SCR.k)
end end
--Draw scene swapping animation --Draw scene swapping animation
if SCN.swapping then if SCN.swapping then
gc_setColor(1,1,1)
_=SCN.stat _=SCN.stat
_.draw(_.time) _.draw(_.time)
end end
gc_replaceTransform(SCR.xOy_dm)
--Draw Version string
gc_setColor(.8,.8,.8,.4)
setFont(20)
mStr(VERSION.string,0,-30)
gc_replaceTransform(SCR.xOy_dl)
--Draw FPS --Draw FPS
setFont(15) setFont(15)
_=SCR.h
gc_setColor(1,1,1) gc_setColor(1,1,1)
gc_print(FPS(),SCR.safeX+5,_-20) gc_print(FPS(),SCR.safeX+5,-20)
--Debug info. --Debug info.
if devMode then if devMode then
--Left-down infos --Left-down infos
gc_setColor(devColor[devMode]) gc_setColor(devColor[devMode])
gc_print("MEM "..gcinfo(),SCR.safeX+5,_-40) gc_print("MEM "..gcinfo(),SCR.safeX+5,-40)
gc_print("Lines "..FREEROW.getCount(),SCR.safeX+5,_-60) gc_print("Lines "..FREEROW.getCount(),SCR.safeX+5,-60)
gc_print("Cursor "..int(mx+.5).." "..int(my+.5),SCR.safeX+5,_-80) gc_print("Cursor "..int(mx+.5).." "..int(my+.5),SCR.safeX+5,-80)
gc_print("Voices "..VOC.getQueueCount(),SCR.safeX+5,_-100) gc_print("Voices "..VOC.getQueueCount(),SCR.safeX+5,-100)
gc_print("Tasks "..TASK.getCount(),SCR.safeX+5,_-120) gc_print("Tasks "..TASK.getCount(),SCR.safeX+5,-120)
--Update & draw frame time --Update & draw frame time
ins(frameTimeList,1,dt)rem(frameTimeList,126) ins(frameTimeList,1,dt)rem(frameTimeList,126)
gc_setColor(1,1,1,.3) gc_setColor(1,1,1,.3)
for i=1,#frameTimeList do for i=1,#frameTimeList do
gc_rectangle('fill',150+2*i,_-20,2,-frameTimeList[i]*4000) gc.rectangle('fill',150+2*i,-20,2,-frameTimeList[i]*4000)
end end
gc_replaceTransform(SCR.xOy_dr)
--Websocket status --Websocket status
gc_push('transform') for i=1,6 do
gc.translate(SCR.w,SCR.h-100)
gc.scale(SCR.k)
for i=1,5 do
local status=WS.status(WSnames[i]) local status=WS.status(WSnames[i])
gc_setColor(WScolor[i])
gc_rectangle('fill',0,20*i,-80,-20)
if status=='dead'then
gc_setColor(1,1,1) gc_setColor(1,1,1)
gc_draw(TEXTURE.ws_dead,-20,20*i-20) gc.draw(wsBottomImage,-79,20*i-139)
if status=='dead'then
gc_draw(ws_deadImg,-20,20*i-140)
elseif status=='connecting'then elseif status=='connecting'then
gc_setColor(1,1,1,.5+.3*sin(time*6.26)) gc_setColor(1,1,1,.5+.3*sin(time*6.26))
gc_draw(TEXTURE.ws_connecting,-20,20*i-20) gc_draw(ws_connectingImg,-20,20*i-140)
elseif status=='running'then elseif status=='running'then
gc_setColor(1,1,1) gc_draw(ws_runningImg,-20,20*i-140)
gc_draw(TEXTURE.ws_running,-20,20*i-20)
end end
local t1,t2,t3=WS.getTimers(WSnames[i]) local t1,t2,t3=WS.getTimers(WSnames[i])
gc_setColor(1,1,1,t1)gc_rectangle('fill',-60,20*i,-20,-20) gc_setColor(1,1,1,t1)gc.rectangle('fill',-60,20*i-120,-20,-20)
gc_setColor(0,1,0,t2)gc_rectangle('fill',-40,20*i,-20,-20) gc_setColor(0,1,0,t2)gc.rectangle('fill',-40,20*i-120,-20,-20)
gc_setColor(1,0,0,t3)gc_rectangle('fill',-20,20*i,-20,-20) gc_setColor(1,0,0,t3)gc.rectangle('fill',-20,20*i-120,-20,-20)
end
gc_pop()
--Slow devmode
if devMode==3 then WAIT(.1)
elseif devMode==4 then WAIT(.5)
end end
end end
LOG.draw()
gc_present() gc_present()
--SPEED UPUPUP! --SPEED UPUPUP!
if SETTING.cleanCanvas then gc_discard()end if SETTING.cleanCanvas then gc.discard()end
end end
end end
@@ -642,6 +679,11 @@ function love.run()
end end
end end
--Slow devmode
if devMode==3 then WAIT(.1)
elseif devMode==4 then WAIT(.5)
end
--Keep 60fps --Keep 60fps
_=TIME()-lastFrame _=TIME()-lastFrame
if _<.016 then WAIT(.016-_)end if _<.016 then WAIT(.016-_)end

View File

@@ -29,11 +29,6 @@ function LANG.init(langList,publicText)--Attention, calling this will destory al
if type(rawget(L,"getTip"))=='table'then if type(rawget(L,"getTip"))=='table'then
setmetatable(L.getTip,tipMeta) setmetatable(L.getTip,tipMeta)
end end
--set global name for all back button
for _,v in next,L.WidgetText do
v.back=L.back
end
end end
LANG.init,LANG.setLangList,LANG.setPublicText=nil LANG.init,LANG.setLangList,LANG.setPublicText=nil

View File

@@ -1,10 +1,10 @@
--LIGHT MODULE (Optimized by MrZ, Original on github/love2d community/simple-love-lights) --LIGHT MODULE (Optimized by MrZ, Original on github/LÖVE community/simple-love-lights)
--Heavily based on mattdesl's libGDX implementation: --Heavily based on mattdesl's libGDX implementation:
--https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows --https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows
local gc=love.graphics local gc=love.graphics
local clear,translate=gc.clear,gc.translate local clear,gc_translate=gc.clear,gc.translate
local setCanvas,setShader=gc.setCanvas,gc.setShader local gc_setCanvas,gc_setShader=gc.setCanvas,gc.setShader
local render=gc.draw local gc_setColor,gc_draw=gc.setColor,gc.draw
local shadowMapShader=gc.newShader("Zframework/light/shadowMap.glsl")--Shader for caculating the 1D shadow map. local shadowMapShader=gc.newShader("Zframework/light/shadowMap.glsl")--Shader for caculating the 1D shadow map.
local lightRenderShader=gc.newShader("Zframework/light/lightRender.glsl")--Shader for rendering blurred lights and shadows. local lightRenderShader=gc.newShader("Zframework/light/lightRender.glsl")--Shader for rendering blurred lights and shadows.
@@ -15,45 +15,40 @@ end
local function setPow(L,pow) local function setPow(L,pow)
L.size=pow L.size=pow
end end
local function destroy(L) local function drawLight(L)
L.blackCanvas:release() local s=L.size
L.shadowCanvas:release()
L.renderCanvas:release()
end
local function draw(L)
--Initialization --Initialization
local r,g,b,a=gc.getColor() gc_setCanvas(L.blackCanvas)clear()
setCanvas(L.blackCanvas)clear() gc_setCanvas(L.shadowCanvas)clear()
setCanvas(L.shadowCanvas)clear() gc_setCanvas(L.renderCanvas)clear()
setCanvas(L.renderCanvas)clear() lightRenderShader:send("xresolution",s)
lightRenderShader:send("xresolution",L.size) shadowMapShader:send("yresolution",s)
shadowMapShader:send("yresolution",L.size)
--Get up-left of light --Get up-left of light
local X=L.x-L.size*.5 local X=L.x-s*.5
local Y=L.y-L.size*.5 local Y=L.y-s*.5
--Render solid --Render solid
translate(-X,-Y) gc_translate(-X,-Y)
L.blackCanvas:renderTo(L.blackFn) L.blackCanvas:renderTo(L.blackFn)
translate(X,Y) gc_translate(X,Y)
--Render shade canvas by solid --Render shade canvas by solid
setShader(shadowMapShader) gc_setShader(shadowMapShader)
setCanvas(L.shadowCanvas) gc_setCanvas(L.shadowCanvas)
render(L.blackCanvas) gc_draw(L.blackCanvas)
--Render light canvas by shade --Render light canvas by shade
setShader(lightRenderShader) gc_setShader(lightRenderShader)
setCanvas(L.renderCanvas) gc_setCanvas(L.renderCanvas)
render(L.shadowCanvas,0,0,0,1,L.size) gc_draw(L.shadowCanvas,0,0,0,1,s)
--Ready to final render --Ready to final render
setShader()setCanvas()gc.setBlendMode('add') gc_setShader()gc_setCanvas()gc.setBlendMode('add')
--Render to screes --Render to screen
gc.setColor(r,g,b,a) gc_draw(L.renderCanvas,X,Y+s,0,1,-1)
render(L.renderCanvas,X,Y+L.size,0,1,-1)
--Reset --Reset
gc.setBlendMode('alpha') gc.setBlendMode('alpha')
@@ -61,13 +56,16 @@ end
local LIGHT={} local LIGHT={}
function LIGHT.draw() function LIGHT.draw()
gc_setColor(1,1,1)
for i=1,#Lights do for i=1,#Lights do
draw(Lights[i]) drawLight(Lights[i])
end end
end end
function LIGHT.clear() function LIGHT.clear()
for i=#Lights,1,-1 do for i=#Lights,1,-1 do
Lights[i]:destroy() Lights[i].blackCanvas:release()
Lights[i].shadowCanvas:release()
Lights[i].renderCanvas:release()
Lights[i]=nil Lights[i]=nil
end end
end end
@@ -79,11 +77,10 @@ function LIGHT.add(x,y,radius,solidFunc)
blackCanvas=gc.newCanvas(radius,radius),--Solid canvas blackCanvas=gc.newCanvas(radius,radius),--Solid canvas
shadowCanvas=gc.newCanvas(radius,1),--1D vis-depth canvas shadowCanvas=gc.newCanvas(radius,1),--1D vis-depth canvas
renderCanvas=gc.newCanvas(radius,radius),--Light canvas renderCanvas=gc.newCanvas(radius,radius),--Light canvas
blackFn=solidFunc,--Solid draw funcion blackFn=solidFunc,--Solid draw function
move=move, move=move,
setPow=setPow, setPow=setPow,
destroy=destroy,
} }
end end
return LIGHT return LIGHT

View File

@@ -4,43 +4,38 @@ return function(name,libName)
if r1 and r2 then if r1 and r2 then
return r2 return r2
else else
LOG.print("Cannot load "..name..": "..(r2 or r3),'warn',COLOR.R) LOG.print("Cannot load "..name..": "..(r2 or r3),'warn')
end end
elseif SYSTEM=="Android"then elseif SYSTEM=="Android"then
local fs=love.filesystem local fs=love.filesystem
local platform={"arm64-v8a","armeabi-v7a"} local platform={'arm64-v8a','armeabi-v7a'}
local libFunc=package.loadlib(SAVEDIR.."/lib/"..libName.Android,libName.libFunc)
if libFunc then
LOG.print(name.." lib loaded",'warn',COLOR.G)
else
for i=1,#platform do for i=1,#platform do
local soFile=fs.read('data',"libAndroid/"..platform[i].."/"..libName.Android) local soFile,_,_,mes1=fs.read('data',"libAndroid/"..platform[i].."/"..libName.Android)
if soFile then if soFile then
local success,message=fs.write("lib/"..libName.Android,soFile) local success,mes2=fs.write("lib/"..libName.Android,soFile)
if success then if success then
libFunc,message=package.loadlib(SAVEDIR.."/lib/"..libName.Android,libName.libFunc) libFunc,mes2=package.loadlib(SAVEDIR.."/lib/"..libName.Android,libName.libFunc)
if libFunc then if libFunc then
LOG.print(name.." lib loaded",'warn',COLOR.G) LOG.print(name.." lib loaded",'message')
break break
else else
LOG.print("Cannot load "..name..": "..message,'warn',COLOR.R) LOG.print("Cannot load "..name..": "..mes2,'error')
end end
else else
LOG.print("Write "..name.."-"..platform[i].." to saving failed: "..message,'warn',COLOR.R) LOG.print(("Write %s-%s to saving failed: %s"):format(name,platform[i],mes2),'error')
end end
else else
LOG.print("Read "..name.."-"..platform[i].." failed",'warn',COLOR.R) LOG.print(("Read %s-%s to saving failed: %s"):format(name,platform[i],mes1),'error')
end end
end end
if not libFunc then if not libFunc then
LOG.print("Cannot load "..name,'warn',COLOR.R) LOG.print("Cannot load "..name,'error')
return return
end end
end
return libFunc() return libFunc()
else else
LOG.print("No "..name.." for "..SYSTEM,'warn',COLOR.R) LOG.print("No "..name.." for "..SYSTEM,'error')
return return
end end
return true return true

View File

@@ -1,70 +1,64 @@
local utf8=require"utf8"
local gc=love.graphics local gc=love.graphics
local int,max,min=math.floor,math.max,math.min local gc_setColor,gc_print=gc.setColor,gc.print
local int,min=math.floor,math.min
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
local setFont=setFont
local debugMesList={} local mesList={}
local debugMesHistory={ local mesHistory={
"Version: "..VERSION.string, "Version: "..VERSION.string,
os.date("Launched at %Y/%m/%d %H:%M"), os.date("Launched at %Y/%m/%d %H:%M"),
} }
local LOG={} local LOG={}
function LOG.update() function LOG.update()
if debugMesList[1]then if mesList[1]then
for i=#debugMesList,1,-1 do for i=#mesList,1,-1 do
local M=debugMesList[i] local M=mesList[i]
if M.blink>0 then if M.blink>0 then
M.blink=M.blink-1 M.blink=M.blink-1
else else
M.time=M.time-1 M.time=M.time-1
if M.time==0 then if M.time==0 then
rem(debugMesList,i) rem(mesList,i)
end end
end end
end end
end end
end end
function LOG.draw() function LOG.draw()
if debugMesList[1]then if mesList[1]then
local k=SCR.w/SCR.w0 setFont(20)
setFont(max(int(4*k)*5,5)) for i=1,#mesList do
for i=1,#debugMesList do local M=mesList[i]
local M=debugMesList[i] M.rgba[4]=M.blink>0 and int(M.blink/3)%2 or min(M.time/26,1)
local t=M.time gc_setColor(M.rgba)
gc.setColor(M.r,M.g,M.b,M.blink>0 and int(M.blink/3)%2 or min(t/26,1)) gc_print(M.text,10+(20-min(M.time,20))^1.5/4,25*i)
gc.print(M.text,10+(20-min(t,20))^1.5/4,25*i*k)
end end
end end
end end
function LOG.print(text,T,C)--text,type/time/color,color function LOG.print(text,T)--text,type/time
local time local color=COLOR.Z
local his local his,time
if T=='warn'then if T=='message'then
C=C or COLOR.Y color=COLOR.N
his=true his,time=true,180
time=180 elseif T=='warn'then
color=COLOR.Y
his,time=true,180
elseif T=='error'then elseif T=='error'then
C=C or COLOR.R color=COLOR.R
his=true his,time=true,210
time=210
elseif T=='message'then
C=C or COLOR.N
his=true
elseif type(T)=='number'then elseif type(T)=='number'then
C=C or COLOR.Z
time=T time=T
elseif type(T)=='table'then
C=T
elseif not C then
C=COLOR.Z
end end
if his then text=tostring(text)
ins(debugMesHistory,SCN.cur..": "..tostring(text)) assert(utf8.len(text),"Error UTF-8 coding")
end if his then ins(mesHistory,SCN.cur..": "..text)end
ins(debugMesList,{text=text,r=C[1],g=C[2],b=C[3],blink=30,time=time or 120}) ins(mesList,{text=text,rgba={color[1],color[2],color[3],nil},blink=30,time=time or 120})
end end
function LOG.copy() function LOG.copy()
local str=table.concat(debugMesHistory,"\n") love.system.setClipboardText(table.concat(mesHistory,"\n"))
love.system.setClipboardText(str) LOG.print("Log copied",'message')
LOG.print("Log copied",COLOR.B)
end end
return LOG return LOG

View File

@@ -141,10 +141,10 @@ function profile.switch()
profile.stop() profile.stop()
love.system.setClipboardText(PROFILE.report()) love.system.setClipboardText(PROFILE.report())
PROFILE.reset() PROFILE.reset()
LOG.print("profile report copied!") LOG.print("profile report copied!",'message')
else else
PROFILE.start() PROFILE.start()
LOG.print("profile start!") LOG.print("profile start!",'message')
end end
switch=not switch switch=not switch
end end

View File

@@ -60,10 +60,13 @@ function SCN.swapUpdate()
end end
end end
function SCN.init(s,org) function SCN.init(s,org)
love.keyboard.setTextInput(false)
local S=scenes[s] local S=scenes[s]
SCN.cur=s SCN.cur=s
WIDGET.set(S.widgetList) WIDGET.setScrollHeight(S.widgetScrollHeight)
WIDGET.setWidgetList(S.widgetList)
SCN.sceneInit=S.sceneInit SCN.sceneInit=S.sceneInit
SCN.sceneBack=S.sceneBack SCN.sceneBack=S.sceneBack
SCN.update=S.update SCN.update=S.update

View File

@@ -10,7 +10,19 @@ local SCR={
rad=0, --Radius rad=0, --Radius
k=1, --Scale size k=1, --Scale size
dpi=1, --DPI from gc.getDPIScale() dpi=1, --DPI from gc.getDPIScale()
xOy=love.math.newTransform(),--Screen transformation object
--Screen transformation objects
origin=love.math.newTransform(),
xOy_m=love.math.newTransform(),
xOy=love.math.newTransform(),
xOy_ul=love.math.newTransform(),
xOy_um=love.math.newTransform(),
xOy_ur=love.math.newTransform(),
xOy_ml=love.math.newTransform(),
xOy_mr=love.math.newTransform(),
xOy_dl=love.math.newTransform(),
xOy_dm=love.math.newTransform(),
xOy_dr=love.math.newTransform(),
} }
function SCR.setSize(w,h) function SCR.setSize(w,h)
SCR.w0,SCR.h0=w,h SCR.w0,SCR.h0=w,h
@@ -21,15 +33,29 @@ function SCR.resize(w,h)
SCR.r=h/w SCR.r=h/w
SCR.rad=(w^2+h^2)^.5 SCR.rad=(w^2+h^2)^.5
SCR.x,SCR.y=0,0
if SCR.r>=SCR.h0/SCR.w0 then if SCR.r>=SCR.h0/SCR.w0 then
SCR.k=w/SCR.w0 SCR.k=w/SCR.w0
SCR.x,SCR.y=0,(h-w*SCR.h0/SCR.w0)/2 SCR.y=(h-SCR.h0*SCR.k)/2
else else
SCR.k=h/SCR.h0 SCR.k=h/SCR.h0
SCR.x,SCR.y=(w-h*SCR.w0/SCR.h0)/2,0 SCR.x=(w-SCR.w0*SCR.k)/2
end end
SCR.cx,SCR.cy=SCR.w/2,SCR.h/2
SCR.ex,SCR.ey=SCR.w-SCR.x,SCR.h-SCR.y
SCR.safeX,SCR.safeY,SCR.safeW,SCR.safeH=love.window.getSafeArea() SCR.safeX,SCR.safeY,SCR.safeW,SCR.safeH=love.window.getSafeArea()
SCR.xOy:setTransformation(w/2,h/2,nil,SCR.k,nil,SCR.w0/2,SCR.h0/2)
SCR.origin:setTransformation(0,0)
SCR.xOy:setTransformation(SCR.x,SCR.y,0,SCR.k)
SCR.xOy_m:setTransformation(w/2,h/2,0,SCR.k)
SCR.xOy_ul:setTransformation(0,0,0,SCR.k)
SCR.xOy_um:setTransformation(w/2,0,0,SCR.k)
SCR.xOy_ur:setTransformation(w,0,0,SCR.k)
SCR.xOy_ml:setTransformation(0,h/2,0,SCR.k)
SCR.xOy_mr:setTransformation(w,h/2,0,SCR.k)
SCR.xOy_dl:setTransformation(0,h,0,SCR.k)
SCR.xOy_dm:setTransformation(w/2,h,0,SCR.k)
SCR.xOy_dr:setTransformation(w,h,0,SCR.k)
end end
function SCR.info() function SCR.info()
return{ return{
@@ -41,7 +67,7 @@ function SCR.info()
("W,H : %d, %d"):format(SCR.W,SCR.H), ("W,H : %d, %d"):format(SCR.W,SCR.H),
("safeX,safeY : %d, %d"):format(SCR.safeX,SCR.safeY), ("safeX,safeY : %d, %d"):format(SCR.safeX,SCR.safeY),
("safeW,safeH : %d, %d"):format(SCR.safeW,SCR.safeH), ("safeW,safeH : %d, %d"):format(SCR.safeW,SCR.safeH),
("k,dpi,rad : %d, %d, %.4f"):format(SCR.k,SCR.dpi,SCR.rad), ("k,dpi,rad : %.2f, %d, %.2f"):format(SCR.k,SCR.dpi,SCR.rad),
} }
end end
return SCR return SCR

View File

@@ -17,7 +17,7 @@ function SFX.init(list)
if love.filesystem.getInfo(N)then if love.filesystem.getInfo(N)then
Sources[list[i]]={love.audio.newSource(N,'static')} Sources[list[i]]={love.audio.newSource(N,'static')}
else else
LOG.print("No SFX file: "..N,5,COLOR.O) LOG.print("No SFX file: "..N,5)
end end
if not skip and i~=count then if not skip and i~=count then
coroutine.yield() coroutine.yield()

View File

@@ -1,21 +1,28 @@
local data=love.data
local STRING={} local STRING={}
local int,format=math.floor,string.format local int,format=math.floor,string.format
local find,sub,upper=string.find,string.sub,string.upper local find,sub,upper=string.find,string.sub,string.upper
do--function STRING.shiftChar(c) do--function STRING.shiftChar(c)
local shiftMap={ local shiftMap={
["1"]="!",["2"]="@",["3"]="#",["4"]="$",["5"]="%", ['1']='!',['2']='@',['3']='#',['4']='$',['5']='%',
["6"]="^",["7"]="&",["8"]="*",["9"]="(",["0"]=")", ['6']='^',['7']='&',['8']='*',['9']='(',['0']=')',
["`"]="~",["-"]="_",["="]="+", ['`']='~',['-']='_',['=']='+',
["["]="{",["]"]="}",["\\"]="|", ['[']='{',[']']='}',['\\']='|',
[";"]=":",["'"]="\"", [';']=':',['\'']='"',
[","]="<",["."]=">",["/"]="?", [',']='<',['.']='>',['/']='?',
} }
function STRING.shiftChar(c) function STRING.shiftChar(c)
return shiftMap[c]or upper(c) return shiftMap[c]or upper(c)
end end
end end
function STRING.trim(s)
if not s:find("%S")then return""end
s=s:sub((s:find("%S"))):reverse()
return s:sub((s:find("%S"))):reverse()
end
function STRING.split(s,sep,regex) function STRING.split(s,sep,regex)
local L={} local L={}
local p1,p2=1--start,target local p1,p2=1--start,target
@@ -57,16 +64,16 @@ function STRING.time(s)
end end
end end
do--function STRING.urlEncode(str) do--function STRING.urlEncode(s)
local rshift=bit.rshift local rshift=bit.rshift
local b16={[0]="0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"} local b16={[0]='0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}
function STRING.urlEncode(str) function STRING.urlEncode(s)
local out="" local out=""
for i=1,#str do for i=1,#s do
if str:sub(i,i):match("[a-zA-Z0-9]")then if s:sub(i,i):match("[a-zA-Z0-9]")then
out=out..str:sub(i,i) out=out..s:sub(i,i)
else else
local b=str:byte(i) local b=s:byte(i)
out=out.."%"..b16[rshift(b,4)]..b16[b%16] out=out.."%"..b16[rshift(b,4)]..b16[b%16]
end end
end end
@@ -74,4 +81,31 @@ do--function STRING.urlEncode(str)
end end
end end
function STRING.packBin(s)
return data.encode('string','base64',data.compress('string','zlib',s))
end
function STRING.unpackBin(str)
local res
res,str=pcall(data.decode,'string','base64',str)
if not res then return end
res,str=pcall(data.decompress,'string','zlib',str)
if res then return str end
end
function STRING.packText(s)
return data.encode('string','base64',data.compress('string','gzip',s))
end
function STRING.unpackText(str)
local res
res,str=pcall(data.decode,'string','base64',str)
if not res then return end
res,str=pcall(data.decompress,'string','gzip',str)
if res then return str end
end
function STRING.packTable(t)
return STRING.packText(JSON.encode(t))
end
function STRING.unpackTable(t)
return JSON.decode(STRING.unpackText(t))
end
return STRING return STRING

View File

@@ -3,7 +3,7 @@ local setColor,setWidth=gc.setColor,gc.setLineWidth
local sin,cos=math.sin,math.cos local sin,cos=math.sin,math.cos
local max,min=math.max,math.min local max,min=math.max,math.min
local rnd=math.random local rnd=math.random
local rem=table.remove local ins,rem=table.insert,table.remove
local fx={} local fx={}
@@ -126,17 +126,17 @@ function SYSFX.draw()
end end
function SYSFX.newBadge(x1,y1,x2,y2) function SYSFX.newBadge(x1,y1,x2,y2)
fx[#fx+1]={ ins(fx,{
update=FXupdate.badge, update=FXupdate.badge,
draw=FXdraw.badge, draw=FXdraw.badge,
t=0, t=0,
x=x1,y=y1, x=x1,y=y1,
x1=x1,y1=y1, x1=x1,y1=y1,
x2=x2,y2=y2, x2=x2,y2=y2,
} })
end end
function SYSFX.newAttack(rate,x1,y1,x2,y2,wid,r,g,b,a) function SYSFX.newAttack(rate,x1,y1,x2,y2,wid,r,g,b,a)
fx[#fx+1]={ ins(fx,{
update=FXupdate.attack, update=FXupdate.attack,
draw=FXdraw.attack, draw=FXdraw.attack,
t=0, t=0,
@@ -145,7 +145,7 @@ function SYSFX.newAttack(rate,x1,y1,x2,y2,wid,r,g,b,a)
x2=x2,y2=y2,--End pos x2=x2,y2=y2,--End pos
wid=wid,--Line width wid=wid,--Line width
r=r,g=g,b=b,a=a, r=r,g=g,b=b,a=a,
} })
end end
function SYSFX.newTap(rate,x,y) function SYSFX.newTap(rate,x,y)
local T= local T=
@@ -162,38 +162,38 @@ function SYSFX.newTap(rate,x,y)
local ang=rnd()*6.2832 local ang=rnd()*6.2832
T.ptc[i]={x,y,x+d*cos(ang),y+d*sin(ang)} T.ptc[i]={x,y,x+d*cos(ang),y+d*sin(ang)}
end end
fx[#fx+1]=T ins(fx,T)
end end
function SYSFX.newRipple(rate,x,y,r) function SYSFX.newRipple(rate,x,y,r)
fx[#fx+1]={ ins(fx,{
update=FXupdate.ripple, update=FXupdate.ripple,
draw=FXdraw.ripple, draw=FXdraw.ripple,
t=0, t=0,
rate=rate, rate=rate,
x=x,y=y,r=r, x=x,y=y,r=r,
} })
end end
function SYSFX.newRectRipple(rate,x,y,w,h) function SYSFX.newRectRipple(rate,x,y,w,h)
fx[#fx+1]={ ins(fx,{
update=FXupdate.rectRipple, update=FXupdate.rectRipple,
draw=FXdraw.rectRipple, draw=FXdraw.rectRipple,
t=0, t=0,
rate=rate, rate=rate,
x=x,y=y,w=w,h=h, x=x,y=y,w=w,h=h,
} })
end end
function SYSFX.newShade(rate,x,y,w,h,r,g,b) function SYSFX.newShade(rate,x,y,w,h,r,g,b)
fx[#fx+1]={ ins(fx,{
update=FXupdate.shade, update=FXupdate.shade,
draw=FXdraw.shade, draw=FXdraw.shade,
t=0, t=0,
rate=rate, rate=rate,
x=x,y=y,w=w,h=h, x=x,y=y,w=w,h=h,
r=r or 1,g=g or 1,b=b or 1, r=r or 1,g=g or 1,b=b or 1,
} })
end end
function SYSFX.newCell(rate,image,size,x,y,vx,vy,ax,ay) function SYSFX.newCell(rate,image,size,x,y,vx,vy,ax,ay)
fx[#fx+1]={ ins(fx,{
update=FXupdate.cell, update=FXupdate.cell,
draw=FXdraw.cell, draw=FXdraw.cell,
t=0, t=0,
@@ -203,10 +203,10 @@ function SYSFX.newCell(rate,image,size,x,y,vx,vy,ax,ay)
x=x,y=y, x=x,y=y,
vx=vx,vy=vy, vx=vx,vy=vy,
ax=ax,ay=ay, ax=ax,ay=ay,
} })
end end
function SYSFX.newLine(rate,x1,y1,x2,y2,r,g,b,a) function SYSFX.newLine(rate,x1,y1,x2,y2,r,g,b,a)
fx[#fx+1]={ ins(fx,{
update=FXupdate.line, update=FXupdate.line,
draw=FXdraw.line, draw=FXdraw.line,
t=0, t=0,
@@ -214,6 +214,6 @@ function SYSFX.newLine(rate,x1,y1,x2,y2,r,g,b,a)
x1=x1 or 0,y1=y1 or 0, x1=x1 or 0,y1=y1 or 0,
x2=x2 or x1 or 1280,y2=y2 or y1 or 720, x2=x2 or x1 or 1280,y2=y2 or y1 or 720,
r=r or 1,g=g or 1,b=b or 1,a=a or 1, r=r or 1,g=g or 1,b=b or 1,a=a or 1,
} })
end end
return SYSFX return SYSFX

View File

@@ -75,6 +75,16 @@ function TABLE.clear(G)
end end
end end
--Find value in [1~#]
function TABLE.find(t,val)
for i=1,#t do if t[i]==val then return i end end
end
--Find value in whole table
function TABLE.search(t,val)
for k,v in next,t do if v==val then return k end end
end
--Re-index string value of a table --Re-index string value of a table
function TABLE.reIndex(org) function TABLE.reIndex(org)
for k,v in next,org do for k,v in next,org do
@@ -95,7 +105,7 @@ do--function TABLE.dump(L,t)
"\t\t\t\t", "\t\t\t\t",
"\t\t\t\t\t", "\t\t\t\t\t",
} }
function dump(L,t) local function dump(L,t)
local s local s
if t then if t then
s="{\n" s="{\n"
@@ -139,4 +149,42 @@ do--function TABLE.dump(L,t)
TABLE.dump=dump TABLE.dump=dump
end end
--Dump a simple lua table (no whitespaces)
do--function TABLE.dumpDeflate(L,t)
local find=string.find
local function dump(L)
local s="return{"
if type(L)~='table'then return end
local count=1
for k,v in next,L do
local T=type(k)
if T=='number'then
if k==count then
k=""
count=count+1
else
k="["..k.."]="
end
elseif T=='string'then
if find(k,"[^0-9a-zA-Z_]")then
k="[\""..k.."\"]="
else
k=k.."="
end
elseif T=='boolean'then k="["..k.."]="
else error("Error key type!")
end
T=type(v)
if T=='number'then v=tostring(v)
elseif T=='string'then v="\""..v.."\""
elseif T=='table'then v=dump(v)
elseif T=='boolean'then v=tostring(v)
else error("Error data type!")
end
end
return s.."}"
end
TABLE.dumpDeflate=dump
end
return TABLE return TABLE

View File

@@ -1,8 +1,9 @@
local gc=love.graphics local gc=love.graphics
local gc_getColor,gc_setColor,gc_push,gc_pop,gc_translate,gc_scale,gc_rotate,gc_shear local gc_getColor,gc_setColor,gc_push,gc_pop=gc.getColor,gc.setColor,gc.push,gc.pop
=gc.getColor,gc.setColor,gc.push,gc.pop,gc.translate,gc.scale,gc.rotate,gc.shear local gc_translate,gc_scale,gc_rotate,gc_shear=gc.translate,gc.scale,gc.rotate,gc.shear
local int,rnd,rem=math.floor,math.random,table.remove local int,rnd=math.floor,math.random
local ins,rem=table.insert,table.remove
local setFont,mStr=setFont,mStr local setFont,mStr=setFont,mStr
local texts={} local texts={}
@@ -77,7 +78,7 @@ function TEXT.clear()
texts={} texts={}
end end
function TEXT.show(text,x,y,font,style,spd,stop) function TEXT.show(text,x,y,font,style,spd,stop)
texts[#texts+1]={ ins(texts,{
c=0, --Timer c=0, --Timer
text=text, --String text=text, --String
x=x or 0, --X x=x or 0, --X
@@ -86,7 +87,7 @@ function TEXT.show(text,x,y,font,style,spd,stop)
spd=(spd or 1)/60, --Timing speed(1=last 1 sec) spd=(spd or 1)/60, --Timing speed(1=last 1 sec)
stop=stop, --Stop time(sustained text) stop=stop, --Stop time(sustained text)
draw=textFX[style or'appear']or error("unavailable type:"..style), --Draw method draw=textFX[style or'appear']or error("unavailable type:"..style), --Draw method
} })
end end
function TEXT.getText(text,x,y,font,style,spd,stop)--Another version of TEXT.show(), but only return text object, need manual management function TEXT.getText(text,x,y,font,style,spd,stop)--Another version of TEXT.show(), but only return text object, need manual management
return{ return{

View File

@@ -14,6 +14,10 @@ function THEME.calculate(Y,M,D)
M=="12"and math.abs(D-25)<4 and M=="12"and math.abs(D-25)<4 and
'xmas'or 'xmas'or
--Birthday
M=="06"and D=="06"and
'birth'or
--Spring festival --Spring festival
M<"03"and math.abs((({ M<"03"and math.abs((({
--Festival days. Jan 26=26, Feb 1=32, etc. --Festival days. Jan 26=26, Feb 1=32, etc.
@@ -33,9 +37,9 @@ function THEME.calculate(Y,M,D)
--Z day (Feb./Mar./Apr./May./June. 26) --Z day (Feb./Mar./Apr./May./June. 26)
D=="26"and( D=="26"and(
M=="01"or M=="02"and'zday1'or (M=="01"or M=="02")and'zday1'or
M=="03"or M=="04"and'zday2'or (M=="03"or M=="04")and'zday2'or
M=="05"or M=="06"and'zday3' (M=="05"or M=="06")and'zday3'
)or )or
'classic' 'classic'
@@ -44,19 +48,22 @@ end
function THEME.set(theme) function THEME.set(theme)
if theme=='classic'then if theme=='classic'then
BG.setDefault('space') BG.setDefault('space')
BGM.setDefault("blank") BGM.setDefault("space")
elseif theme=='xmas'then elseif theme=='xmas'then
BG.setDefault('snow') BG.setDefault('snow')
BGM.setDefault('xmas') BGM.setDefault('xmas')
LOG.print("==============",COLOR.R) LOG.print("==============")
LOG.print("Merry Christmas!",COLOR.Z) LOG.print("Merry Christmas!")
LOG.print("==============",COLOR.R) LOG.print("==============")
elseif theme=='birth'then
BG.setDefault('firework')
BGM.setDefault('magicblock')
elseif theme=='sprfes'then elseif theme=='sprfes'then
BG.setDefault('firework') BG.setDefault('firework')
BGM.setDefault("spring festival") BGM.setDefault("spring festival")
LOG.print(" ★☆☆★",COLOR.R) LOG.print(" ★☆☆★")
LOG.print("新年快乐!",COLOR.Z) LOG.print("新年快乐!")
LOG.print(" ★☆☆★",COLOR.R) LOG.print(" ★☆☆★")
elseif theme=='zday1'then elseif theme=='zday1'then
BG.setDefault('lanterns') BG.setDefault('lanterns')
BGM.setDefault("empty") BGM.setDefault("empty")

View File

@@ -1,4 +1,4 @@
local level={0,0,.01,.015,.02,.03,.04,.05,.06,.07} local level={0,0,.01,.016,.023,.03,.04,.05,.06,.07,.08,.09,.12,.15}
local vib=love.system.vibrate local vib=love.system.vibrate
return function(t) return function(t)
local L=SETTING.vib local L=SETTING.vib

View File

@@ -45,7 +45,7 @@ function VOC.init(list)
if n==1 then if n==1 then
if not loadVoiceFile(list[i],list[i])then if not loadVoiceFile(list[i],list[i])then
LOG.print("No VOICE file: "..list[i],5,COLOR.O) LOG.print("No VOICE file: "..list[i],5)
end end
end end
if not Source[list[i]][1]then Source[list[i]]=nil end if not Source[list[i]][1]then Source[list[i]]=nil end

View File

@@ -1,15 +1,15 @@
-- local host="127.0.0.1" local host=
-- local host="192.168.114.102" -- "127.0.0.1"
-- local host="krakens.tpddns.cn" -- "192.168.114.102"
-- local host="hdustea.3322.org" "krakens.tpddns.cn"
local host="game.techmino.org" -- "game.techmino.org"
local port="10026" local port="10026"
local path="/tech/socket/v1" local path="/tech/socket/v1"
local debug=""--S:send, R:receive, M=mark local debugMode=""--S:send, R:receive, M=mark
local wsThread=[[ local wsThread=[[
-- lua + love2d threading websocket client -- lua + LÖVE threading websocket client
-- Original pure lua ver. by flaribbit and Particle_G -- Original pure lua ver. by flaribbit and Particle_G
-- Threading version by MrZ -- Threading version by MrZ
@@ -24,8 +24,9 @@ do--Connect
local port=sendCHN:demand() local port=sendCHN:demand()
local path=sendCHN:demand() local path=sendCHN:demand()
local body=sendCHN:demand() local body=sendCHN:demand()
local timeout=sendCHN:demand()
SOCK:settimeout(2.6) SOCK:settimeout(timeout)
local res,err=SOCK:connect(host,port) local res,err=SOCK:connect(host,port)
if err then readCHN:push(err)return end if err then readCHN:push(err)return end
@@ -87,7 +88,7 @@ local _send do
local mask_str=char(unpack(mask_key)) local mask_str=char(unpack(mask_key))
function _send(op,message) function _send(op,message)
]]..(debug:find'S'and""or"--")..[[print((">> %s[%d]:%s"):format(threadName,#message,message)) ]]..(debugMode:find'S'and""or"--")..[[print((">> %s[%d]:%s"):format(threadName,#message,message))
--Message type --Message type
SOCK:send(char(bor(0x80,op))) SOCK:send(char(bor(0x80,op)))
@@ -154,7 +155,7 @@ while true do--Running
if s then if s then
res=s res=s
elseif p then--UNF head elseif p then--UNF head
]]..(debug:find'R'and""or"--")..[[print(("<< %s[%d/%d]:%s"):format(threadName,#p,length,#p<50 and p or p:sub(1,50))) ]]..(debugMode:find'R'and""or"--")..[[print(("<< %s[%d/%d]:%s"):format(threadName,#p,length,#p<50 and p or p:sub(1,50)))
UFF=true UFF=true
sBuffer=sBuffer..p sBuffer=sBuffer..p
length=length-#p length=length-#p
@@ -166,11 +167,11 @@ while true do--Running
else else
local s,e,p=SOCK:receive(length) local s,e,p=SOCK:receive(length)
if s then if s then
]]..(debug:find'R'and""or"--")..[[print(("<< %s(%d):%s"):format(threadName,length,#s<50 and s or s:sub(1,50))) ]]..(debugMode:find'R'and""or"--")..[[print(("<< %s(%d):%s"):format(threadName,length,#s<50 and s or s:sub(1,50)))
sBuffer=sBuffer..s sBuffer=sBuffer..s
length=length-#s length=length-#s
elseif p then elseif p then
]]..(debug:find'R'and""or"--")..[[print(("<< %s(%d):%s"):format(threadName,length,#p<50 and p or p:sub(1,50))) ]]..(debugMode:find'R'and""or"--")..[[print(("<< %s(%d):%s"):format(threadName,length,#p<50 and p or p:sub(1,50)))
sBuffer=sBuffer..p sBuffer=sBuffer..p
length=length-#p length=length-#p
end end
@@ -181,36 +182,35 @@ while true do--Running
break break
end end
end end
]]..(debug:find'R'and""or"--")..[[print(("<< %s[(%d)]:%s"):format(threadName,#res,#res<800 and res or res:sub(1,150).."\n...\n"..res:sub(-150))) ]]..(debugMode:find'R'and""or"--")..[[print(("<< %s[(%d)]:%s"):format(threadName,#res,#res<800 and res or res:sub(1,150).."\n...\n"..res:sub(-150)))
--React --React
if op==8 then--8=close if op==8 then--8=close
readCHN:push(op) readCHN:push(op)
SOCK:close() SOCK:close()
if type(res)=='string'then if type(res)=='string'then
res=JSON.decode(res) readCHN:push(res:sub(3))--Warning: with 2 bytes close code
readCHN:push(res and res.reason or"WS Error")
else else
readCHN:push("WS Error") readCHN:push("WS Error")
end end
elseif op==0 then--0=continue elseif op==0 then--0=continue
lBuffer=lBuffer..res lBuffer=lBuffer..res
if fin then if fin then
]]..(debug:find'M'and""or"--")..[[print("FIN=1 (c") ]]..(debugMode:find'M'and""or"--")..[[print("FIN=1 (c")
readCHN:push(lBuffer) readCHN:push(lBuffer)
lBuffer="" lBuffer=""
else else
]]..(debug:find'M'and""or"--")..[[print("FIN=0 (c") ]]..(debugMode:find'M'and""or"--")..[[print("FIN=0 (c")
end end
else else
readCHN:push(op) readCHN:push(op)
if fin then if fin then
]]..(debug:find'M'and""or"--")..[[print("OP: "..op.."\tFIN=1") ]]..(debugMode:find'M'and""or"--")..[[print("OP: "..op.."\tFIN=1")
readCHN:push(res) readCHN:push(res)
else else
]]..(debug:find'M'and""or"--")..[[print("OP: "..op.."\tFIN=0") ]]..(debugMode:find'M'and""or"--")..[[print("OP: "..op.."\tFIN=0")
sBuffer=res sBuffer=res
]]..(debug:find'M'and""or"--")..[[print("START pack: "..res) ]]..(debugMode:find'M'and""or"--")..[[print("START pack: "..res)
end end
end end
end end
@@ -234,7 +234,16 @@ local wsList=setmetatable({},{
end end
}) })
function WS.connect(name,subPath,body) function WS.switchHost(_1,_2,_3)
for k in next,wsList do
WS.close(k)
end
host=_1
port=_2 or port
path=_3 or path
end
function WS.connect(name,subPath,body,timeout)
local ws={ local ws={
real=true, real=true,
thread=love.thread.newThread(wsThread), thread=love.thread.newThread(wsThread),
@@ -243,8 +252,8 @@ function WS.connect(name,subPath,body)
readCHN=love.thread.newChannel(), readCHN=love.thread.newChannel(),
lastPingTime=0, lastPingTime=0,
lastPongTime=timer(), lastPongTime=timer(),
pingInterval=26, pingInterval=12,
status='connecting',--connecting, running, dead status='connecting',--'connecting', 'running', 'dead'
sendTimer=0, sendTimer=0,
alertTimer=0, alertTimer=0,
pongTimer=0, pongTimer=0,
@@ -255,6 +264,7 @@ function WS.connect(name,subPath,body)
ws.sendCHN:push(port) ws.sendCHN:push(port)
ws.sendCHN:push(path..subPath) ws.sendCHN:push(path..subPath)
ws.sendCHN:push(body or"") ws.sendCHN:push(body or"")
ws.sendCHN:push(timeout or 2.6)
end end
function WS.status(name) function WS.status(name)
@@ -269,7 +279,7 @@ end
function WS.setPingInterval(name,time) function WS.setPingInterval(name,time)
local ws=wsList[name] local ws=wsList[name]
ws.pingInterval=math.max(time or 1,2.6) ws.pingInterval=math.max(time or 2.6,2.6)
end end
function WS.alert(name) function WS.alert(name)
@@ -348,7 +358,7 @@ function WS.update(dt)
ws.sendCHN:push("")--ping ws.sendCHN:push("")--ping
ws.lastPingTime=time ws.lastPingTime=time
end end
if time-ws.lastPongTime>10+3*ws.pingInterval then if time-ws.lastPongTime>6+2*ws.pingInterval then
WS.close(name) WS.close(name)
end end
end end

View File

@@ -1,21 +1,40 @@
local kb=love.keyboard
local gc=love.graphics local gc=love.graphics
local gc_clear,gc_origin=gc.clear,gc.origin
local gc_translate,gc_replaceTransform=gc.translate,gc.replaceTransform
local gc_setCanvas,gc_setBlendMode=gc.setCanvas,gc.setBlendMode
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_draw,gc_line=gc.draw,gc.line
local gc_rectangle=gc.rectangle
local gc_print,gc_printf=gc.print,gc.printf
local kb=love.keyboard
local next=next
local int,abs=math.floor,math.abs local int,abs=math.floor,math.abs
local max,min=math.max,math.min local max,min=math.max,math.min
local sub=string.sub local sub,ins=string.sub,table.insert
local ins=table.insert local getFont,setFont,mStr=getFont,setFont,mStr
local setFont,mStr=setFont,mStr local mDraw,mDraw_X,mDraw_Y=ADRAW.draw,ADRAW.simpX,ADRAW.simpY
local mDraw_X,mDraw_Y=ADRAW.simpX,ADRAW.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 clearIcon=DOGC{40,40,
{"setLW",6}, {'fRect',16,5,8,3},
{"line",11,11,29,29}, {'fRect',8,8,24,3},
{"line",11,29,29,11}, {'fRect',11,14,18,21},
} }
local sureIcon=DOGC{40,40, local sureIcon=DOGC{40,40,
{"setFT",35}, {'setFT',35},
{"mText","?",20,-6}, {'mText',"?",20,-6},
}
local smallerThen=DOGC{20,20,
{'setLW',5},
{'line',18,2,1,10,18,18},
}
local largerThen=DOGC{20,20,
{'setLW',5},
{'line',2,2,19,10,2,18},
} }
local WIDGET={} local WIDGET={}
@@ -33,7 +52,7 @@ local text={
function text:reset()end function text:reset()end
function text:update() function text:update()
if self.hideCon and self.hideCon()then if self.hideF and self.hideF()then
if self.alpha>0 then if self.alpha>0 then
self.alpha=self.alpha-.125 self.alpha=self.alpha-.125
end end
@@ -44,17 +63,17 @@ end
function text:draw() function text:draw()
if self.alpha>0 then if self.alpha>0 then
local c=self.color local c=self.color
gc.setColor(c[1],c[2],c[3],self.alpha) gc_setColor(c[1],c[2],c[3],self.alpha)
if self.align=='M'then if self.align=='M'then
mDraw_X(self.obj,self.x,self.y) mDraw_X(self.obj,self.x,self.y)
elseif self.align=='L'then elseif self.align=='L'then
gc.draw(self.obj,self.x,self.y) gc_draw(self.obj,self.x,self.y)
elseif self.align=='R'then elseif self.align=='R'then
gc.draw(self.obj,self.x-self.obj:getWidth(),self.y) gc_draw(self.obj,self.x-self.obj:getWidth(),self.y)
end end
end end
end end
function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,align='M'][,hide] function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,align='M'][,hideF][,hide]
local _={ local _={
name= D.name, name= D.name,
x= D.x, x= D.x,
@@ -64,10 +83,10 @@ function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,align='M'][,hide
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z, color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
font= D.font or 30, font= D.font or 30,
align= D.align or'M', align= D.align or'M',
hideCon=D.hide, hideF= D.hideF,
} }
for k,v in next,text do _[k]=v end for k,v in next,text do _[k]=v end
if not _.hideCon then _.alpha=1 end if not _.hideF then _.alpha=1 end
setmetatable(_,widgetMetatable) setmetatable(_,widgetMetatable)
return _ return _
end end
@@ -81,10 +100,10 @@ function image:reset()
end end
end end
function image:draw() function image:draw()
gc.setColor(1,1,1,self.alpha) gc_setColor(1,1,1,self.alpha)
gc.draw(self.img,self.x,self.y,self.ang,self.k) gc_draw(self.img,self.x,self.y,self.ang,self.k)
end end
function WIDGET.newImage(D)--name[,img(name)],x,y[,ang][,k][,hide] function WIDGET.newImage(D)--name[,img(name)],x,y[,ang][,k][,hideF][,hide]
local _={ local _={
name= D.name, name= D.name,
img= D.img or D.name, img= D.img or D.name,
@@ -93,6 +112,7 @@ function WIDGET.newImage(D)--name[,img(name)],x,y[,ang][,k][,hide]
y= D.y, y= D.y,
ang= D.ang, ang= D.ang,
k= D.k, k= D.k,
hideF= D.hideF,
hide= D.hide, hide= D.hide,
} }
for k,v in next,image do _[k]=v end for k,v in next,image do _[k]=v end
@@ -126,16 +146,6 @@ end
function button:getCenter() function button:getCenter()
return self.x+self.w*.5,self.y+self.h*.5 return self.x+self.w*.5,self.y+self.h*.5
end end
function button:FX()
local ATV=self.ATV
SYSFX.newRectRipple(
6,
self.x-ATV,
self.y-ATV,
self.w+2*ATV,
self.h+2*ATV
)
end
function button:update() function button:update()
local ATV=self.ATV local ATV=self.ATV
if WIDGET.sel==self then if WIDGET.sel==self then
@@ -149,39 +159,39 @@ function button:draw()
local ATV=self.ATV local ATV=self.ATV
local c=self.color local c=self.color
local r,g,b=c[1],c[2],c[3] local r,g,b=c[1],c[2],c[3]
gc.setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7) 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) gc_rectangle('fill',x-ATV,y-ATV,w+2*ATV,h+2*ATV)
if ATV>0 then if ATV>0 then
gc.setLineWidth(4) gc_setLineWidth(4)
gc.setColor(1,1,1,ATV*.125) 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_rectangle('line',x-ATV+2,y-ATV+2,w+2*ATV-4,h+2*ATV-4)
end end
local obj=self.obj local obj=self.obj
local y0=y+h*.5-ATV*.5 local y0=y+h*.5-ATV*.5
gc.setColor(1,1,1,.2+ATV*.05) gc_setColor(1,1,1,.2+ATV*.05)
if self.align=='M'then if self.align=='M'then
local x0=x+w*.5 local x0=x+w*.5
mDraw(obj,x0-2,y0-2) mDraw(obj,x0-1.5,y0-1.5)
mDraw(obj,x0-2,y0+2) mDraw(obj,x0-1.5,y0+1.5)
mDraw(obj,x0+2,y0-2) mDraw(obj,x0+1.5,y0-1.5)
mDraw(obj,x0+2,y0+2) mDraw(obj,x0+1.5,y0+1.5)
gc.setColor(r*.5,g*.5,b*.5) gc_setColor(r*.5,g*.5,b*.5)
mDraw(obj,x0,y0) mDraw(obj,x0,y0)
elseif self.align=='L'then elseif self.align=='L'then
local edge=self.edge local edge=self.edge
mDraw_Y(obj,x+edge-2,y0-2) mDraw_Y(obj,x+edge-1.5,y0-1.5)
mDraw_Y(obj,x+edge-2,y0+2) mDraw_Y(obj,x+edge-1.5,y0+1.5)
mDraw_Y(obj,x+edge+2,y0-2) mDraw_Y(obj,x+edge+1.5,y0-1.5)
mDraw_Y(obj,x+edge+2,y0+2) mDraw_Y(obj,x+edge+1.5,y0+1.5)
gc.setColor(r*.5,g*.5,b*.5) gc_setColor(r*.5,g*.5,b*.5)
mDraw_Y(obj,x+edge,y0) mDraw_Y(obj,x+edge,y0)
elseif self.align=='R'then elseif self.align=='R'then
local x0=x+w-self.edge-obj:getWidth() local x0=x+w-self.edge-obj:getWidth()
mDraw_Y(obj,x0-2,y0-2) mDraw_Y(obj,x0-1.5,y0-1.5)
mDraw_Y(obj,x0-2,y0+2) mDraw_Y(obj,x0-1.5,y0+1.5)
mDraw_Y(obj,x0+2,y0-2) mDraw_Y(obj,x0+1.5,y0-1.5)
mDraw_Y(obj,x0+2,y0+2) mDraw_Y(obj,x0+1.5,y0+1.5)
gc.setColor(r*.5,g*.5,b*.5) gc_setColor(r*.5,g*.5,b*.5)
mDraw_Y(obj,x0,y0) mDraw_Y(obj,x0,y0)
end end
end end
@@ -190,10 +200,17 @@ function button:getInfo()
end end
function button:press(_,_,k) function button:press(_,_,k)
self.code(k) self.code(k)
self:FX() local ATV=self.ATV
SYSFX.newRectRipple(
6,
self.x-ATV,
self.y-ATV-WIDGET.scrollPos,
self.w+2*ATV,
self.h+2*ATV
)
if self.sound then SFX.play('button')end if self.sound then SFX.play('button')end
end end
function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hide] function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hideF][,hide]
if not D.h then D.h=D.w end if not D.h then D.h=D.w end
local _={ local _={
name= D.name, name= D.name,
@@ -218,6 +235,7 @@ function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=tr
edge= D.edge or 0, edge= D.edge or 0,
sound= D.sound~=false, sound= D.sound~=false,
code= D.code, code= D.code,
hideF= D.hideF,
hide= D.hide, hide= D.hide,
} }
for k,v in next,button do _[k]=v end for k,v in next,button do _[k]=v end
@@ -264,14 +282,14 @@ function key:draw()
local c=self.color local c=self.color
local r,g,b=c[1],c[2],c[3] local r,g,b=c[1],c[2],c[3]
gc.setColor(1,1,1,ATV*.125) gc_setColor(1,1,1,ATV*.1)
gc.rectangle('fill',x,y,w,h) gc_rectangle('fill',x,y,w,h)
gc.setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7) gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
gc.setLineWidth(4) gc_setLineWidth(4)
gc.rectangle('line',x,y,w,h) gc_rectangle('line',x,y,w,h)
gc.setColor(r,g,b,1.2) gc_setColor(r,g,b,1.2)
if self.align=='M'then if self.align=='M'then
mDraw(self.obj,x+w*.5,y+h*.5) mDraw(self.obj,x+w*.5,y+h*.5)
elseif self.align=='L'then elseif self.align=='L'then
@@ -287,7 +305,7 @@ function key:press(_,_,k)
self.code(k) self.code(k)
if self.sound then SFX.play('key')end if self.sound then SFX.play('key')end
end end
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hide] function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hideF][,hide]
if not D.h then D.h=D.w end if not D.h then D.h=D.w end
local _={ local _={
name= D.name, name= D.name,
@@ -312,6 +330,7 @@ function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true]
align= D.align or'M', align= D.align or'M',
edge= D.edge or 0, edge= D.edge or 0,
code= D.code, code= D.code,
hideF= D.hideF,
hide= D.hide, hide= D.hide,
} }
for k,v in next,key do _[k]=v end for k,v in next,key do _[k]=v end
@@ -351,22 +370,22 @@ function switch:draw()
--Checked --Checked
if ATV>0 then if ATV>0 then
gc.setColor(1,1,1,ATV*.08) gc_setColor(1,1,1,ATV*.08)
gc.rectangle('fill',x,y,50,50) gc_rectangle('fill',x,y,50,50)
end end
if self.CHK>0 then if self.CHK>0 then
gc.setColor(.9,1,.9,self.CHK/6) gc_setColor(.9,1,.9,self.CHK/6)
gc.setLineWidth(6) gc_setLineWidth(6)
gc.line(x+5,y+25,x+18,y+38,x+45,y+11) gc_line(x+5,y+25,x+18,y+38,x+45,y+11)
end end
--Frame --Frame
gc.setLineWidth(4) gc_setLineWidth(4)
gc.setColor(1,1,1,.6+ATV*.05) gc_setColor(1,1,1,.6+ATV*.05)
gc.rectangle('line',x,y,50,50) gc_rectangle('line',x,y,50,50)
--Drawable --Drawable
gc.setColor(self.color) gc_setColor(self.color)
mDraw_Y(self.obj,x-12-ATV-self.obj:getWidth(),y+25) mDraw_Y(self.obj,x-12-ATV-self.obj:getWidth(),y+25)
end end
function switch:getInfo() function switch:getInfo()
@@ -393,6 +412,7 @@ function WIDGET.newSwitch(D)--name,x,y[,fText][,color][,font=30][,sound=true][,d
sound= D.sound~=false, sound= D.sound~=false,
disp= D.disp, disp= D.disp,
code= D.code, code= D.code,
hideF= D.hideF,
hide= D.hide, hide= D.hide,
} }
for k,v in next,switch do _[k]=v end for k,v in next,switch do _[k]=v end
@@ -446,7 +466,7 @@ function slider:update()
self.ATV=atv self.ATV=atv
end end
end end
if not(self.hide==true or self.hide and self.hide())then if not self.hide then
self.pos=self.pos*.7+self.disp()*.3 self.pos=self.pos*.7+self.disp()*.3
end end
end end
@@ -455,41 +475,41 @@ function slider:draw()
local ATV=self.ATV local ATV=self.ATV
local x2=x+self.w local x2=x+self.w
gc.setColor(1,1,1,.5+ATV*.06) gc_setColor(1,1,1,.5+ATV*.06)
--Units --Units
if not self.smooth then if not self.smooth then
gc.setLineWidth(2) gc_setLineWidth(2)
for p=0,self.unit do for p=0,self.unit do
local X=x+(x2-x)*p/self.unit local X=x+(x2-x)*p/self.unit
gc.line(X,y+7,X,y-7) gc_line(X,y+7,X,y-7)
end end
end end
--Axis --Axis
gc.setLineWidth(4) gc_setLineWidth(4)
gc.line(x,y,x2,y) gc_line(x,y,x2,y)
--Block --Block
local cx=x+(x2-x)*self.pos/self.unit 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 local bx,by,bw,bh=cx-10-ATV*.5,y-16-ATV,20+ATV,32+2*ATV
gc.setColor(.8,.8,.8) gc_setColor(.8,.8,.8)
gc.rectangle('fill',bx,by,bw,bh) gc_rectangle('fill',bx,by,bw,bh)
if ATV>0 then if ATV>0 then
gc.setLineWidth(2) gc_setLineWidth(2)
gc.setColor(1,1,1,ATV*.16) gc_setColor(1,1,1,ATV*.16)
gc.rectangle('line',bx+1,by+1,bw-2,bh-2) gc_rectangle('line',bx+1,by+1,bw-2,bh-2)
end end
if self.TAT>0 and self.show then if self.TAT>0 and self.show then
setFont(25) setFont(25)
gc.setColor(1,1,1,self.TAT/180) gc_setColor(1,1,1,self.TAT/180)
mStr(self:show(),cx,by-30) mStr(self:show(),cx,by-30)
end end
--Drawable --Drawable
if self.obj then if self.obj then
gc.setColor(self.color) gc_setColor(self.color)
mDraw_Y(self.obj,x-12-ATV-self.obj:getWidth(),y) mDraw_Y(self.obj,x-12-ATV-self.obj:getWidth(),y)
end end
end end
@@ -510,14 +530,14 @@ function slider:drag(x)
if p~=P then if p~=P then
self.code(P) self.code(P)
end end
if self.change and TIME()-self.lastTime>.18 then if self.change and TIME()-self.lastTime>.26 then
self.lastTime=TIME() self.lastTime=TIME()
self.change() self.change()
end end
end end
function slider:release(x) function slider:release(x)
self.lastTime=0
self:drag(x) self:drag(x)
self.lastTime=0
end end
function slider:arrowKey(isLeft) function slider:arrowKey(isLeft)
local p=self.disp() local p=self.disp()
@@ -554,6 +574,7 @@ function WIDGET.newSlider(D)--name,x,y,w[,fText][,color][,unit][,smooth][,font=3
change= D.change, change= D.change,
disp= D.disp, disp= D.disp,
code= D.code, code= D.code,
hideF= D.hideF,
hide= D.hide, hide= D.hide,
show= false, show= false,
} }
@@ -589,18 +610,16 @@ local selector={
} }
function selector:reset() function selector:reset()
self.ATV=0 self.ATV=0
local V=self.disp() local V,L=self.disp(),self.list
local L=self.list local i=TABLE.find(L,V)
for i=1,#L do if i then
if L[i]==V then
self.select=i self.select=i
self.selText=self.list[i] self.selText=self.list[i]
return else
end
end
self.hide=true self.hide=true
LOG.print("Selector "..self.name.." dead, disp= "..tostring(V),'warn') LOG.print("Selector "..self.name.." dead, disp= "..tostring(V),'warn')
end end
end
function selector:isAbove(x,y) function selector:isAbove(x,y)
return return
x>self.x and x>self.x and
@@ -628,32 +647,32 @@ function selector:draw()
local w=self.w local w=self.w
local ATV=self.ATV local ATV=self.ATV
gc.setColor(1,1,1,.6+ATV*.1) gc_setColor(1,1,1,.6+ATV*.1)
gc.setLineWidth(3) gc_setLineWidth(3)
gc.rectangle('line',x,y,w,60) gc_rectangle('line',x,y,w,60)
gc.setColor(1,1,1,.2+ATV*.1) gc_setColor(1,1,1,.2+ATV*.1)
local t=(TIME()%.5)^.5 local t=(TIME()%.5)^.5
if self.select>1 then if self.select>1 then
gc.draw(drawableText.small,x+6,y+20) gc_draw(smallerThen,x+6,y+33)
if ATV>0 then if ATV>0 then
gc.setColor(1,1,1,ATV*.4*(.5-t)) gc_setColor(1,1,1,ATV*.4*(.5-t))
gc.draw(drawableText.small,x+6-t*40,y+20) gc_draw(smallerThen,x+6-t*40,y+33)
gc.setColor(1,1,1,.2+ATV*.1) gc_setColor(1,1,1,.2+ATV*.1)
end end
end end
if self.select<#self.list then if self.select<#self.list then
gc.draw(drawableText.large,x+w-24,y+20) gc_draw(largerThen,x+w-26,y+33)
if ATV>0 then if ATV>0 then
gc.setColor(1,1,1,ATV*.4*(.5-t)) gc_setColor(1,1,1,ATV*.4*(.5-t))
gc.draw(drawableText.large,x+w-24+t*40,y+20) gc_draw(largerThen,x+w-26+t*40,y+33)
end end
end end
--Drawable --Drawable
gc.setColor(self.color) gc_setColor(self.color)
ADRAW.simpX(self.obj,x+w*.5,y+17-21) ADRAW.simpX(self.obj,x+w*.5,y+17-21)
gc.setColor(1,1,1) gc_setColor(1,1,1)
setFont(30) setFont(30)
mStr(self.selText,x+w*.5,y+43-21) mStr(self.selText,x+w*.5,y+43-21)
end end
@@ -666,12 +685,12 @@ function selector:press(x)
if x<self.x+self.w*.5 then if x<self.x+self.w*.5 then
if s>1 then if s>1 then
s=s-1 s=s-1
SYSFX.newShade(3,self.x,self.y,self.w*.5,60) SYSFX.newShade(3,self.x,self.y-WIDGET.scrollPos,self.w*.5,60)
end end
else else
if s<#self.list then if s<#self.list then
s=s+1 s=s+1
SYSFX.newShade(3,self.x+self.w*.5,self.y,self.w*.5,60) SYSFX.newShade(3,self.x+self.w*.5,self.y-WIDGET.scrollPos,self.w*.5,60)
end end
end end
if self.select~=s then if self.select~=s then
@@ -687,10 +706,10 @@ function selector:arrowKey(isLeft)
if isLeft and s==1 or not isLeft and s==#self.list then return end if isLeft and s==1 or not isLeft and s==#self.list then return end
if isLeft then if isLeft then
s=s-1 s=s-1
SYSFX.newShade(3,self.x,self.y,self.w*.5,60) SYSFX.newShade(3,self.x,self.y-WIDGET.scrollPos,self.w*.5,60)
else else
s=s+1 s=s+1
SYSFX.newShade(3,self.x+self.w*.5,self.y,self.w*.5,60) SYSFX.newShade(3,self.x+self.w*.5,self.y-WIDGET.scrollPos,self.w*.5,60)
end end
self.code(self.list[s]) self.code(self.list[s])
self.select=s self.select=s
@@ -720,6 +739,7 @@ function WIDGET.newSelector(D)--name,x,y,w[,fText][,color][,sound=true],list,dis
list= D.list, list= D.list,
disp= D.disp, disp= D.disp,
code= D.code, code= D.code,
hideF= D.hideF,
hide= D.hide, hide= D.hide,
} }
for k,v in next,selector do _[k]=v end for k,v in next,selector do _[k]=v end
@@ -735,8 +755,23 @@ local inputBox={
} }
function inputBox:reset() function inputBox:reset()
self.ATV=0 self.ATV=0
if not MOBILE then end
kb.setTextInput(true) function inputBox:hasText()
return #self.value>0
end
function inputBox:getText()
return self.value
end
function inputBox:setText(str)
if type(str)=='string'then
self.value=str
end
end
function inputBox:addText(str)
if type(str)=='string'then
self.value=self.value..str
else
LOG.print("inputBox "..self.name.." dead, addText("..type(str)..")",'warn')
end end
end end
function inputBox:clear() function inputBox:clear()
@@ -764,12 +799,12 @@ function inputBox:draw()
local x,y,w,h=self.x,self.y,self.w,self.h local x,y,w,h=self.x,self.y,self.w,self.h
local ATV=self.ATV local ATV=self.ATV
gc.setColor(1,1,1,ATV*.1) gc_setColor(1,1,1,ATV*.1)
gc.rectangle('fill',x,y,w,h) gc_rectangle('fill',x,y,w,h)
gc.setColor(1,1,1) gc_setColor(1,1,1)
gc.setLineWidth(4) gc_setLineWidth(4)
gc.rectangle('line',x,y,w,h) gc_rectangle('line',x,y,w,h)
--Drawable --Drawable
setFont(self.font) setFont(self.font)
@@ -778,13 +813,13 @@ function inputBox:draw()
end end
if self.secret then if self.secret then
for i=1,#self.value do for i=1,#self.value do
gc.print("*",x-5+self.font*.5*i,y+h*.5-self.font*.7) gc_print("*",x-5+self.font*.5*i,y+h*.5-self.font*.7)
end end
else else
gc.printf(self.value,x+10,y,self.w) gc_printf(self.value,x+10,y,self.w)
setFont(self.font-10) setFont(self.font-10)
if WIDGET.sel==self then if WIDGET.sel==self then
gc.print(EDITING,x+10,y+12-self.font*1.4) gc_print(EDITING,x+10,y+12-self.font*1.4)
end end
end end
end end
@@ -793,7 +828,7 @@ function inputBox:getInfo()
end end
function inputBox:press() function inputBox:press()
if MOBILE then if MOBILE then
local _,y1=SCR.xOy:transformPoint(0,self.y+self.h) local _,y1=xOy:transformPoint(0,self.y+self.h)
kb.setTextInput(true,0,y1,1,1) kb.setTextInput(true,0,y1,1,1)
end end
end end
@@ -832,6 +867,7 @@ function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,secret][,regex],hide
font= D.font or int(D.h/7-1)*5, font= D.font or int(D.h/7-1)*5,
secret= D.secret==true, secret= D.secret==true,
regex= D.regex, regex= D.regex,
hideF= D.hideF,
hide= D.hide, hide= D.hide,
} }
for k,v in next,inputBox do _[k]=v end for k,v in next,inputBox do _[k]=v end
@@ -871,13 +907,14 @@ function textBox:update()
end end
function textBox:push(t) function textBox:push(t)
ins(self.texts,t) ins(self.texts,t)
if self.scrollPos==#self.texts-1 and not(self.hide==true or self.hide and self.hide())then if self.scrollPos==#self.texts-1 then
self.scrollPos=#self.texts self.scrollPos=#self.texts
else else
self.new=true self.new=true
end end
end end
function textBox:press(x,y) function textBox:press(x,y)
if not(x and y)then return end
self:drag(nil,nil,nil,0) self:drag(nil,nil,nil,0)
if not self.fix and x>self.x+self.w-40 and y<self.y+40 then if not self.fix and x>self.x+self.w-40 and y<self.y+40 then
if self.sure>0 then if self.sure>0 then
@@ -890,7 +927,7 @@ function textBox:press(x,y)
end end
end end
function textBox:drag(_,_,_,dy) function textBox:drag(_,_,_,dy)
_=self.scrollPix+dy*SCR.dpi _=self.scrollPix+dy
local sign=_>0 and 1 or -1 local sign=_>0 and 1 or -1
while abs(_)>30 do while abs(_)>30 do
_=_-30*sign _=_-30*sign
@@ -923,39 +960,39 @@ function textBox:draw()
end end
--Background --Background
gc.setColor(0,0,0,.3) gc_setColor(0,0,0,.4)
gc.rectangle('fill',x,y,w,h) gc_rectangle('fill',x,y,w,h)
--Frame --Frame
gc.setLineWidth(4) gc_setLineWidth(4)
gc.setColor(1,1,WIDGET.sel==self and 0 or 1) gc_setColor(1,1,WIDGET.sel==self and .8 or 1)
gc.rectangle('line',x,y,w,h) gc_rectangle('line',x,y,w,h)
--Slider --Slider
if #texts>cap then if #texts>cap then
gc.setLineWidth(2) gc_setLineWidth(2)
gc.rectangle('line',x-25,y,20,h) gc_rectangle('line',x-25,y,20,h)
local len=max(h*cap/#texts,26) local len=max(h*cap/#texts,26)
gc.rectangle('fill',x-22,y+(h-len-6)*(scroll-cap)/(#texts-cap)+3,14,len) gc_rectangle('fill',x-22,y+(h-len-6)*(scroll-cap)/(#texts-cap)+3,14,len)
end end
--Clear button --Clear button
gc.setColor(1,1,1) gc_setColor(1,1,1)
if not self.fix then if not self.fix then
gc.rectangle('line',x+w-40,y,40,40) gc_rectangle('line',x+w-40,y,40,40)
gc.draw(self.sure==0 and clearIcon or sureIcon,x+w-40,y) gc_draw(self.sure==0 and clearIcon or sureIcon,x+w-40,y)
end end
--Texts --Texts
setFont(self.font) setFont(self.font)
for i=max(scroll-cap+1,1),scroll do for i=max(scroll-cap+1,1),scroll do
gc.printf(texts[i],x+8,y+h-10-self.lineH*(scroll-i+1),w) gc_printf(texts[i],x+8,y+h-10-self.lineH*(scroll-i+1),w)
end end
--New message --New message
if self.new and self.scrollPos~=#texts then if self.new and self.scrollPos~=#texts then
gc.setColor(1,TIME()%.4<.2 and 1 or 0,0) gc_setColor(1,TIME()%.4<.2 and 1 or 0,0)
gc.print("v",x+w-25,y+h-40) gc_print("v",x+w-25,y+h-40)
end end
end end
function textBox:getInfo() function textBox:getInfo()
@@ -985,6 +1022,7 @@ function WIDGET.newTextBox(D)--name,x,y,w,h[,font=30][,lineH][,fix],hide
font= D.font or 30, font= D.font or 30,
fix= D.fix, fix= D.fix,
texts= {}, texts= {},
hideF= D.hideF,
hide= D.hide, hide= D.hide,
} }
_.lineH=D.lineH or _.font*7/5 _.lineH=D.lineH or _.font*7/5
@@ -996,8 +1034,9 @@ function WIDGET.newTextBox(D)--name,x,y,w,h[,font=30][,lineH][,fix],hide
end end
WIDGET.active={}--Table contains all active widgets WIDGET.active={}--Table contains all active widgets
WIDGET.scrollHeight=0--Max drag height, not actual container height!
WIDGET.scrollPos=0--Current scroll position
WIDGET.sel=false--Selected widget WIDGET.sel=false--Selected widget
WIDGET.indexMeta={ WIDGET.indexMeta={
__index=function(L,k) __index=function(L,k)
for i=1,#L do for i=1,#L do
@@ -1007,9 +1046,8 @@ WIDGET.indexMeta={
end end
end end
} }
function WIDGET.set(list) function WIDGET.setWidgetList(list)
kb.setTextInput(false) WIDGET.unFocus()
WIDGET.sel=false
WIDGET.active=list or NONE WIDGET.active=list or NONE
--Reset all widgets --Reset all widgets
@@ -1029,6 +1067,10 @@ function WIDGET.set(list)
end end
end end
end end
function WIDGET.setScrollHeight(height)
WIDGET.scrollHeight=height and height or 0
WIDGET.scrollPos=0
end
function WIDGET.setLang(widgetText) function WIDGET.setLang(widgetText)
for S,L in next,SCN.scenes do for S,L in next,SCN.scenes do
if L.widgetList then if L.widgetList then
@@ -1046,60 +1088,81 @@ function WIDGET.setLang(widgetText)
end end
end end
end end
function WIDGET.isFocus(W)
return W==nil and WIDGET.sel or WIDGET.sel==W
end
function WIDGET.focus(W)
if WIDGET.sel==W then return end
if WIDGET.sel and WIDGET.sel.type=='inputBox'then kb.setTextInput(false)end
WIDGET.sel=W
if W and W.type=='inputBox'then
local _,y1=xOy:transformPoint(0,W.y+W.h)
kb.setTextInput(true,0,y1,1,1)
end
end
function WIDGET.unFocus(force)
local W=WIDGET.sel
if W and(force or not W.keepFocus)then
if W.type=='inputBox'then kb.setTextInput(false)end
WIDGET.sel=false
end
end
function WIDGET.cursorMove(x,y) function WIDGET.cursorMove(x,y)
for _,W in next,WIDGET.active do for _,W in next,WIDGET.active do
if not(W.hide==true or W.hide and W.hide())and W.resCtr and W:isAbove(x,y)then if not W.hide and W.resCtr and W:isAbove(x,y+WIDGET.scrollPos)then
WIDGET.sel=W WIDGET.focus(W)
return return
end end
end end
if WIDGET.sel and not WIDGET.sel.keepFocus then if WIDGET.sel and not WIDGET.sel.keepFocus then
WIDGET.sel=false WIDGET.unFocus()
end end
end end
function WIDGET.press(x,y,k) function WIDGET.press(x,y,k)
local W=WIDGET.sel local W=WIDGET.sel
if not W then return end if W then
W:press(x,y,k) W:press(x,y and y+WIDGET.scrollPos,k)
if W.hide==true or W.hide and W.hide()then WIDGET.sel=false end if W.hide then WIDGET.unFocus()end
end
end end
function WIDGET.drag(x,y,dx,dy) function WIDGET.drag(x,y,dx,dy)
if WIDGET.sel then
local W=WIDGET.sel local W=WIDGET.sel
if not W then return end
if W.type=='slider'or W.type=='textBox'then if W.type=='slider'or W.type=='textBox'then
W:drag(x,y,dx,dy) W:drag(x,y+WIDGET.scrollPos,dx,dy)
elseif not W:isAbove(x,y)then elseif not W:isAbove(x,y)then
WIDGET.sel=false WIDGET.unFocus(true)
end
else
WIDGET.scrollPos=max(min(WIDGET.scrollPos-dy,WIDGET.scrollHeight),0)
end end
end end
function WIDGET.release(x,y) function WIDGET.release(x,y)
local W=WIDGET.sel local W=WIDGET.sel
if not W then return end if W and W.type=='slider'then
if W.type=='slider'then W:release(x,y+WIDGET.scrollPos)
W:release(x,y)
end end
end end
function WIDGET.keyPressed(k) function WIDGET.keyPressed(k)
local W=WIDGET.sel
if k=="space"or k=="return"then if k=="space"or k=="return"then
WIDGET.press() WIDGET.press()
elseif kb.isDown("lshift","lalt","lctrl")and(k=="left"or k=="right")then elseif kb.isDown("lshift","lalt","lctrl")and(k=="left"or k=="right")then
--When hold [↑], control slider with left/right --When hold [↑], control slider with left/right
local W=WIDGET.sel
if W and W.type=='slider'or W.type=='selector'then if W and W.type=='slider'or W.type=='selector'then
W:arrowKey(k=="left") W:arrowKey(k=="left")
end end
elseif k=="up"or k=="down"or k=="left"or k=="right"then elseif k=="up"or k=="down"or k=="left"or k=="right"then
if not WIDGET.sel then if not W then
for _,W in next,WIDGET.active do for _,w in next,WIDGET.active do
if not(W.hide==true or W.hide and W.hide())and W.isAbove then if not w.hide and w.isAbove then
WIDGET.sel=W WIDGET.focus(w)
return return
end end
end end
return return
end end
local W=WIDGET.sel
if not W.getCenter then return end if not W.getCenter then return end
local WX,WY=W:getCenter() local WX,WY=W:getCenter()
local dir=(k=="right"or k=="down")and 1 or -1 local dir=(k=="right"or k=="down")and 1 or -1
@@ -1108,7 +1171,7 @@ function WIDGET.keyPressed(k)
local swap_xy=k=="up"or k=="down" local swap_xy=k=="up"or k=="down"
if swap_xy then WX,WY=WY,WX end -- note that we do not swap them back later if swap_xy then WX,WY=WY,WX end -- note that we do not swap them back later
for _,W1 in ipairs(WIDGET.active)do for _,W1 in ipairs(WIDGET.active)do
if W~=W1 and W1.resCtr and not(W1.hide==true or W1.hide and W1.hide())then if W~=W1 and W1.resCtr and not W1.hide then
local L=W1.resCtr local L=W1.resCtr
for j=1,#L,2 do for j=1,#L,2 do
local x,y=L[j],L[j+1] local x,y=L[j],L[j+1]
@@ -1125,10 +1188,9 @@ function WIDGET.keyPressed(k)
end end
end end
if tar then if tar then
WIDGET.sel=tar WIDGET.focus(tar)
end end
else else
local W=WIDGET.sel
if W and W.type=='inputBox'then if W and W.type=='inputBox'then
W:keypress(k) W:keypress(k)
end end
@@ -1179,15 +1241,49 @@ end
function WIDGET.update() function WIDGET.update()
for _,W in next,WIDGET.active do for _,W in next,WIDGET.active do
if W.hideF then W.hide=W.hideF()end
if W.update then W:update()end if W.update then W:update()end
end end
end end
local widgetCanvas
local widgetCover do
local L={1,360,{'fRect',0,30,1,300}}
for i=0,30 do
ins(L,{'setCL',1,1,1,i/30})
ins(L,{'fRect',0,i,1,2})
ins(L,{'fRect',0,360-i,1,2})
end
widgetCover=DOGC(L)
end
local scr_w,scr_h
function WIDGET.resize(w,h)
scr_w,scr_h=w,h
widgetCanvas=gc.newCanvas(w,h)
end
function WIDGET.draw() function WIDGET.draw()
gc_setCanvas(widgetCanvas)
gc_clear(0,0,0,0)
gc_translate(0,-WIDGET.scrollPos)
for _,W in next,WIDGET.active do for _,W in next,WIDGET.active do
if not(W.hide==true or W.hide and W.hide())then if not W.hide then W:draw()end
W:draw()
end end
gc_origin()
gc_setColor(1,1,1)
if WIDGET.scrollHeight>0 then
if WIDGET.scrollPos>0 then
gc_draw(upArrowIcon,scr_w*.5,10,0,SCR.k,nil,upArrowIcon:getWidth()*.5,0)
end end
if WIDGET.scrollPos<WIDGET.scrollHeight then
gc_draw(downArrowIcon,scr_w*.5,scr_h-10,0,SCR.k,nil,downArrowIcon:getWidth()*.5,downArrowIcon:getHeight())
end
gc_setBlendMode('multiply','premultiplied')
gc_draw(widgetCover,nil,nil,nil,scr_w,scr_h/360)
end
gc_setCanvas()
gc_setBlendMode('alpha','premultiplied')
gc_draw(widgetCanvas)
gc_setBlendMode('alpha')
gc_replaceTransform(SCR.xOy)
end end
return WIDGET return WIDGET

View File

@@ -1,7 +1,9 @@
VERSION={ VERSION={
code=1406, build=333,
string="Alpha V0.14.6", code=1503,
name="午 Noon", short="V0.15.3",
string="Alpha V0.15.3",
name="卫星 Satellite",
} }
function love.conf(t) function love.conf(t)
t.identity='Techmino'--Saving folder t.identity='Techmino'--Saving folder
@@ -21,7 +23,6 @@ function love.conf(t)
W.minwidth,W.minheight=640,360 W.minwidth,W.minheight=640,360
W.borderless=false W.borderless=false
W.resizable=true W.resizable=true
W.fullscreentype='desktop'--'exclusive'
W.fullscreen=false W.fullscreen=false
W.vsync=0--Unlimited FPS W.vsync=0--Unlimited FPS
W.msaa=false--Num of samples to use with multi-sampled antialiasing W.msaa=false--Num of samples to use with multi-sampled antialiasing

View File

@@ -11,11 +11,15 @@
wait:出块延迟(帧) wait:出块延迟(帧)
fall:下落延迟(帧) fall:下落延迟(帧)
bone:是否开启骨块模式 bone:是否开启骨块模式
fieldH:场地高度
heightLimit:允许的最大场地高度
nextCount:显示next个数 nextCount:显示next个数
nextStartPos:next从第几个开始显示 nextStartPos:next从第几个开始显示
holdCount:hold个数 holdCount:hold个数
infHold:是否能无限hold infHold:是否能无限hold
phyHold:是否开启物理hold
ospin=是否能O-spin ospin=是否能O-spin
deepDrop:是否开启深降
RS:旋转系统名 RS:旋转系统名
das:DAS das:DAS
@@ -57,11 +61,13 @@
mission:包含任务的table说明暂时略 mission:包含任务的table说明暂时略
life:生命数 life:生命数
pushSpeed:上涨速度 garbageSpeed:垃圾行释放速度
pushSpeed:垃圾行上涨速度
noTele:是否禁止10个高级按键 noTele:是否禁止10个高级按键
visible:方块可见性,填写固定的几个字符串 visible:方块可见性,填写固定的几个字符串
freshLimit:锁延刷新次数限制 freshLimit:锁延刷新次数限制
easyFresh:是否使用简单锁延刷新规则 easyFresh:是否使用简单锁延刷新规则
bufferLimit:攻击缓冲行数上限
fkey1:按下功能键1后执行的函数 fkey1:按下功能键1后执行的函数
fkey2:按下功能键2后执行的函数 fkey2:按下功能键2后执行的函数

View File

@@ -11,10 +11,11 @@
single, double, triple, techrash single, double, triple, techrash
以上直接念就可以,用于普通直接消行 以上直接念就可以,用于普通直接消行
mini, b2b, b3b mini, b2b, b2b2b
以上直接念就可以,用于组合进spin消除 以上直接念就可以,用于组合进spin消除
注: b2b读作back to back
zspin, sspin, lspin, jspin, tspin, ospin, ispin [各种spin消除]
以上的每一个都要衍生出数条语音,例如zpin的是这五条: 以上的每一个都要衍生出数条语音,例如zpin的是这五条:
z-spin (用于不消行) z-spin (用于不消行)
z-spin single z-spin single
@@ -24,7 +25,6 @@
(z-spin pentacrash) (z-spin pentacrash)
(z-spin hexacrash) (z-spin hexacrash)
对于 S L J T O I 每一个都是这样, 五种语音, 加括号的是消5和消6, 一般不用所以可以不录 对于 S L J T O I 每一个都是这样, 五种语音, 加括号的是消5和消6, 一般不用所以可以不录
对于P, Q, F, E, U, V, W, X, R, Y, N, H 对于P, Q, F, E, U, V, W, X, R, Y, N, H
这些方块也可以有上面那些语音,但由于仅在五连块使用还会显著增加语音包体积, 所以不录也可以 这些方块也可以有上面那些语音,但由于仅在五连块使用还会显著增加语音包体积, 所以不录也可以
@@ -32,10 +32,12 @@
这俩可以直接念也可以略做修改 这俩可以直接念也可以略做修改
win, lose, bye win, lose, bye
这几个可以自由发挥 这几个可以自由发挥, 能用在三个场合就行
test, happy, doubt, sad, egg test, happy, doubt, sad, egg
第一个是拉语音条预览音量播放的, 剩下的是彩蛋音效(不录也行, 反正一般不会触发) 这几个是特殊音效,具体使用情况不定
第一个是测试音量用的音效,尽量短一点,长度在半秒内
其他是彩蛋音效(不录也行, 反正一般不会触发)
welcome_voc welcome_voc
进入游戏播放的欢迎语音(类似osu) 进入游戏播放的欢迎语音(类似osu)

BIN
font.ttf

Binary file not shown.

101
main.lua
View File

@@ -5,7 +5,13 @@
/ / / __// /__ / / / // / / / / // // / / // /_/ / / / / __// /__ / / / // / / / / // // / / // /_/ /
/_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/ /_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/
Techmino is my first "huge project" Techmino is my first "huge project"
optimization is welcomed if you also love tetromino game optimization is welcomed if you also love tetromino stacking game
Instructions:
1. I made a framework called Zframework, most code in Zframework are not directly relevant to game;
2. "xxx" are texts for reading, 'xxx' are string values just in program;
3. Some goto statement are used for better performance. All goto-labes have detailed names so don't afraid;
4. Except "gcinfo" function of lua itself, other "gc" are short for "graphics";
]]-- ]]--
@@ -31,14 +37,12 @@ love.keyboard.setKeyRepeat(true)
love.keyboard.setTextInput(false) love.keyboard.setTextInput(false)
love.mouse.setVisible(false) love.mouse.setVisible(false)
--Delete all files from too old version --Load modules
function CLEAR(root) require"Zframework"
for _,name in next,fs.getDirectoryItems(root or"")do SCR.setSize(1280,720)--Initialize Screen size
if fs.getRealDirectory(name)==SAVEDIR and fs.getInfo(name).type~='directory'then
fs.remove(name) --Delete all naked files (from too old version)
end FILE.clear("")
end
end CLEAR()
--Create directories --Create directories
for _,v in next,{"conf","record","replay","cache","lib"}do for _,v in next,{"conf","record","replay","cache","lib"}do
@@ -51,14 +55,6 @@ for _,v in next,{"conf","record","replay","cache","lib"}do
end end
end end
--Load modules
require"Zframework"
SCR.setSize(1280,720)--Initialize Screen size
require"parts.list"
require"parts.globalTables"
require"parts.gametoolfunc"
--Load shader files from SOURCE ONLY --Load shader files from SOURCE ONLY
SHADER={} SHADER={}
for _,v in next,fs.getDirectoryItems("parts/shaders")do for _,v in next,fs.getDirectoryItems("parts/shaders")do
@@ -68,6 +64,10 @@ for _,v in next,fs.getDirectoryItems("parts/shaders")do
end end
end end
require"parts.list"
require"parts.globalTables"
require"parts.gametoolfunc"
FREEROW= require"parts.freeRow" FREEROW= require"parts.freeRow"
DATA= require"parts.data" DATA= require"parts.data"
@@ -76,17 +76,17 @@ SKIN= require"parts.skin"
USERS= require"parts.users" USERS= require"parts.users"
NET= require"parts.net" NET= require"parts.net"
VK= require"parts.virtualKey" VK= require"parts.virtualKey"
PLY= require"parts.player"
netPLY= require"parts.netPlayer"
AIFUNC= require"parts.ai" AIFUNC= require"parts.ai"
AIBUILDER= require"parts.AITemplate" AIBUILDER= require"parts.AITemplate"
PLY= require"parts.player"
netPLY= require"parts.netPlayer"
MODES= require"parts.modes" MODES= require"parts.modes"
--Initialize field[1] --Initialize field[1]
FIELD[1]=DATA.newBoard() FIELD[1]=DATA.newBoard()
--First start for phones --First start for phones
if not fs.getInfo("conf/settings")and MOBILE then if not fs.getInfo('conf/settings')and MOBILE then
SETTING.VKSwitch=true SETTING.VKSwitch=true
SETTING.swap=false SETTING.swap=false
SETTING.powerInfo=true SETTING.powerInfo=true
@@ -96,19 +96,17 @@ if SETTING.fullscreen then love.window.setFullscreen(true)end
--Initialize image libs --Initialize image libs
IMG.init{ IMG.init{
batteryImage="mess/power.png",
lock="mess/lock.png", lock="mess/lock.png",
dialCircle="mess/dialCircle.png", dialCircle="mess/dialCircle.png",
dialNeedle="mess/dialNeedle.png", dialNeedle="mess/dialNeedle.png",
lifeIcon="mess/life.png", lifeIcon="mess/life.png",
badgeIcon="mess/badge.png", badgeIcon="mess/badge.png",
spinCenter="mess/spinCenter.png",
ctrlSpeedLimit="mess/ctrlSpeedLimit.png", ctrlSpeedLimit="mess/ctrlSpeedLimit.png",
speedLimit="mess/speedLimit.png", speedLimit="mess/speedLimit.png",--Not used, for future C2-mode
pay1="mess/pay1.png", pay1="mess/pay1.png",
pay2="mess/pay2.png", pay2="mess/pay2.png",
nakiCH="characters/naki.png", nakiCH="characters/nakiharu.png",
miyaCH="characters/miya.png", miyaCH="characters/miya.png",
miyaF1="characters/miya_f1.png", miyaF1="characters/miya_f1.png",
miyaF2="characters/miya_f2.png", miyaF2="characters/miya_f2.png",
@@ -161,9 +159,9 @@ SFX.init((function()
local L={} local L={}
for _,v in next,fs.getDirectoryItems("media/SFX")do for _,v in next,fs.getDirectoryItems("media/SFX")do
if fs.getRealDirectory("media/SFX/"..v)~=SAVEDIR then if fs.getRealDirectory("media/SFX/"..v)~=SAVEDIR then
L[#L+1]=v:sub(1,-5) table.insert(L,v:sub(1,-5))
else else
LOG.print("Dangerous file : %SAVE%/media/SFX/"..v) LOG.print("Dangerous file : %SAVE%/media/SFX/"..v,'warn')
end end
end end
return L return L
@@ -172,9 +170,9 @@ BGM.init((function()
local L={} local L={}
for _,v in next,fs.getDirectoryItems("media/BGM")do for _,v in next,fs.getDirectoryItems("media/BGM")do
if fs.getRealDirectory("media/BGM/"..v)~=SAVEDIR then if fs.getRealDirectory("media/BGM/"..v)~=SAVEDIR then
L[#L+1]=v:sub(1,-5) table.insert(L,v:sub(1,-5))
else else
LOG.print("Dangerous file : %SAVE%/media/BGM/"..v) LOG.print("Dangerous file : %SAVE%/media/BGM/"..v,'warn')
end end
end end
return L return L
@@ -232,56 +230,34 @@ for _,v in next,fs.getDirectoryItems("parts/scenes")do
LANG.addScene(sceneName) LANG.addScene(sceneName)
end end
end end
LANG.set(SETTING.lang)
--Update data --Update data
do do
local needSave local needSave,autoRestart
local autoRestart
if type(STAT.version)~='number'then if type(STAT.version)~='number'then
STAT.version=0 STAT.version=0
needSave=true needSave=true
end end
if STAT.version<1300 then
STAT.frame=math.floor(STAT.time*60)
STAT.lastPlay='sprint_10l'
RANKS.sprintFix=nil
RANKS.sprintLock=nil
needSave=true
for _,name in next,fs.getDirectoryItems("replay")do
fs.remove("replay/"..name)
end
end
if STAT.version<1302 then if STAT.version<1302 then
if RANKS.pctrain_n then RANKS.pctrain_n=0 end FILE.clear_s("")
if RANKS.pctrain_l then RANKS.pctrain_l=0 end
fs.remove("conf/settings")
needSave=true
autoRestart=true
end
if STAT.version<1400 then
fs.remove("conf/user")
fs.remove("conf/key")
needSave=true
autoRestart=true
end end
if STAT.version<1405 then if STAT.version<1405 then
fs.remove("conf/user") fs.remove('conf/user')
autoRestart=true fs.remove('conf/key')
end end
SETTING.appLock=nil
for _,v in next,VK_org do v.color=nil end
if STAT.version~=VERSION.code then if STAT.version~=VERSION.code then
newVersionLaunch=true
STAT.version=VERSION.code STAT.version=VERSION.code
CLEAR("lib")
needSave=true needSave=true
autoRestart=true autoRestart=true
end end
if not SETTING.VKSkin then SETTING.VKSkin=1 end
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul)then
SETTING.frameMul=100
end
SETTING.appLock=nil
SETTING.dataSaving=nil
for _,v in next,VK_org do v.color=nil end
if RANKS.GM then RANKS.GM=0 end if RANKS.GM then RANKS.GM=0 end
if RANKS.infinite then RANKS.infinite=6 end if RANKS.infinite then RANKS.infinite=6 end
if RANKS.infinite_dig then RANKS.infinite_dig=6 end if RANKS.infinite_dig then RANKS.infinite_dig=6 end
@@ -321,3 +297,6 @@ do
love.event.quit('restart') love.event.quit('restart')
end end
end end
LANG.set(SETTING.lang)
VK.setShape(SETTING.VKSkin)

BIN
media/BGM/exploration.ogg Normal file

Binary file not shown.

BIN
media/BGM/memory.ogg Normal file

Binary file not shown.

BIN
media/BGM/moonbeam.ogg Normal file

Binary file not shown.

BIN
media/BGM/space.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
media/SFX/connect.ogg Normal file

Binary file not shown.

BIN
media/SFX/connected.ogg Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 B

View File

@@ -101,17 +101,17 @@ local FCL={
{{11,4},{11,3},{1,4},{4},{3},{2,3},{2,2,3},{12,4},{12,3}}, {{11,4},{11,3},{1,4},{4},{3},{2,3},{2,2,3},{12,4},{12,3}},
}, },
[3]={ [3]={
{{11},{11,2},{1},{},{2},{2,2},{12,1},{12},}, {{11},{11,2},{1},{},{2},{2,2},{12,1},{12}},
{{3,11},{11,3},{11,2,3},{1,3},{3},{2,3},{2,2,3},{12,1,3},{12,3},}, {{3,11},{11,3},{11,2,3},{1,3},{3},{2,3},{2,2,3},{12,1,3},{12,3}},
{{11,5},{11,2,5},{1,5},{5},{2,5},{2,2,5},{12,1,5},{12,5},}, {{11,5},{11,2,5},{1,5},{5},{2,5},{2,2,5},{12,1,5},{12,5}},
{{11,4},{11,2,4},{1,4},{4},{2,4},{2,2,4},{12,1,4},{12,4},{4,12},}, {{11,4},{11,2,4},{1,4},{4},{2,4},{2,2,4},{12,1,4},{12,4},{4,12}},
}, },
[6]={ [6]={
{{11},{11,2},{1,1},{1},{},{2},{2,2},{12,1},{12},}, {{11},{11,2},{1,1},{1},{},{2},{2,2},{12,1},{12}},
}, },
[7]={ [7]={
{{11},{11,2},{1},{},{2},{12,1},{12},}, {{11},{11,2},{1},{},{2},{12,1},{12}},
{{4,11},{11,4},{11,3},{1,4},{4},{3},{2,3},{12,4},{12,3},{3,12},}, {{4,11},{11,4},{11,3},{1,4},{4},{3},{2,3},{12,4},{12,3},{3,12}},
}, },
}FCL[2],FCL[4],FCL[5]=FCL[1],FCL[3],FCL[3] }FCL[2],FCL[4],FCL[5]=FCL[1],FCL[3],FCL[3]
local LclearScore={[0]=0,-200,-120,-80,200} local LclearScore={[0]=0,-200,-120,-80,200}
@@ -199,6 +199,8 @@ local function getScore(field,cb,cy)
return score return score
end end
------------------------------------------------- -------------------------------------------------
local BLOCKS=BLOCKS
local CC=CC
return{ return{
['9S']=function(P,keys) ['9S']=function(P,keys)
while true do while true do
@@ -270,7 +272,7 @@ return{
--Check if time to change target --Check if time to change target
yield() yield()
if P:RND()<.00126 then if P.aiRND:random()<.00126 then
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3) P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
end end
end end
@@ -313,7 +315,7 @@ return{
--Check if time to change target --Check if time to change target
yield() yield()
if P:RND()<.00126 then if P.aiRND:random()<.00126 then
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3) P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
end end
end end

View File

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

View File

@@ -28,9 +28,8 @@ function back.resize()
end end
end end
function back.draw() function back.draw()
gc.clear(.2,.2,.2) gc.clear(.1,.1,.1)
local r,g,b=COLOR.rainbow_light(TIME()) gc.setColor(1,1,1,.1)
gc.setColor(r,g,b,.2)
gc.draw(video,X,Y,nil,K) gc.draw(video,X,Y,nil,K)
end end
function back.discard() function back.discard()

View File

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

View File

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

View File

@@ -1,5 +1,9 @@
--Blackhole --Blackhole
local gc=love.graphics local gc=love.graphics
local gc_clear,gc_replaceTransform=gc.clear,gc.replaceTransform
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_draw,gc_circle=gc.draw,gc.circle
local sin,cos=math.sin,math.cos local sin,cos=math.sin,math.cos
local rnd=math.random local rnd=math.random
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
@@ -37,29 +41,24 @@ function back.update()
end end
end end
function back.draw() function back.draw()
gc.clear(.1,.1,.1) gc_clear(.1,.1,.1)
gc.push('transform') gc_replaceTransform(SCR.xOy_m)
gc.origin()
gc.translate(SCR.w/2,SCR.h/2)
--Squares --Squares
gc.setColor(.5,.5,.5) gc_setColor(1,1,1,.2)
for i=1,#squares do for i=1,#squares do
local S=squares[i] local S=squares[i]
gc.draw(S.texture,S.d*cos(S.ang),S.d*sin(S.ang),S.rotate,S.size*.026,nil,15,15) gc_draw(S.texture,S.d*cos(S.ang),S.d*sin(S.ang),S.rotate,S.size*.026,nil,15,15)
end end
--Blackhole --Blackhole
gc.scale(SCR.rad/1600) gc_setColor(.07,.07,.07)
gc.setColor(0,0,0) gc_circle('fill',0,0,157)
gc.circle('fill',0,0,157) gc_setLineWidth(6)
gc.setLineWidth(6)
for i=0,15 do for i=0,15 do
gc.setColor(0,0,0,1-i*.0666) gc_setColor(.07,.07,.07,1-i*.0666)
gc.circle('line',0,0,160+6*i) gc_circle('line',0,0,160+6*i)
end end
gc.scale(1600/SCR.rad)
gc.pop()
end end
function back.discard() function back.discard()
squares=nil squares=nil

View File

@@ -1,5 +1,8 @@
--Large falling tetrominoes --Large falling tetrominoes
local gc=love.graphics local gc=love.graphics
local gc_clear=gc.clear
local gc_setColor,gc_draw=gc.setColor,gc.draw
local rnd=math.random local rnd=math.random
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
local back={} local back={}
@@ -32,22 +35,19 @@ function back.update()
end end
end end
function back.draw() function back.draw()
gc.clear(.1,.1,.1) gc_clear(.1,.1,.1)
gc.push('transform') gc_setColor(1,1,1,.2)
gc.origin()
gc.setColor(1,1,1,.4)
for i=1,#mino do for i=1,#mino do
local M=mino[i] local M=mino[i]
local b=M.block local b=M.block
for y=1,#b do for y=1,#b do
for x=1,#b[1]do for x=1,#b[1]do
if b[y][x]then if b[y][x]then
gc.draw(M.texture,M.x+(x-1)*30*M.k,M.y-y*30*M.k,nil,M.k) gc_draw(M.texture,M.x+(x-1)*30*M.k,M.y-y*30*M.k,nil,M.k)
end end
end end
end end
end end
gc.pop()
end end
function back.discard() function back.discard()
mino=nil mino=nil

View File

@@ -41,15 +41,12 @@ function back.update()
end end
function back.draw() function back.draw()
gc.clear(.1,.1,.1) gc.clear(.1,.1,.1)
gc.push('transform')
gc.origin()
for i=1,#mino do for i=1,#mino do
local C=mino[i] local C=mino[i]
local c=C.color local c=C.color
gc.setColor(c[1],c[2],c[3],.5) gc.setColor(c[1],c[2],c[3],.2)
gc.draw(C.block,C.x,C.y,C.ang,C.k,C.k,C.block:getWidth()/2,C.block:getHeight()/2) gc.draw(C.block,C.x,C.y,C.ang,C.k,C.k,C.block:getWidth()/2,C.block:getHeight()/2)
end end
gc.pop()
end end
function back.discard() function back.discard()
mino=nil mino=nil

View File

@@ -1,5 +1,8 @@
--Space but tetrominoes --Space but tetrominoes
local gc=love.graphics local gc=love.graphics
local gc_clear,gc_translate=gc.clear,gc.translate
local gc_setColor,gc_draw=gc.setColor,gc.draw
local sin,cos=math.sin,math.cos local sin,cos=math.sin,math.cos
local rnd=math.random local rnd=math.random
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
@@ -33,22 +36,20 @@ function back.update()
rem(mino,i) rem(mino,i)
else else
M.rotate=M.rotate+M.vr M.rotate=M.rotate+M.vr
M.v=M.v*(1+M.d/SCR.rad*.05) M.v=M.v*(1+M.d/rad*.05)
end end
end end
end end
function back.draw() function back.draw()
gc.clear(.1,.1,.1) gc_clear(.1,.1,.1)
gc.push('transform') gc_translate(SCR.cx,SCR.cy)
gc.origin()
gc.translate(SCR.w/2,SCR.h/2)
for i=1,#mino do for i=1,#mino do
local M=mino[i] local M=mino[i]
local c=M.color local c=M.color
gc.setColor(c[1],c[2],c[3],.4) gc_setColor(c[1],c[2],c[3],.2)
gc.draw(M.block,M.d*cos(M.ang),M.d*sin(M.ang),M.rotate,(18*M.d/SCR.rad)^1.6,nil,M.block:getWidth()/2,M.block:getHeight()/2) gc_draw(M.block,M.d*cos(M.ang),M.d*sin(M.ang),M.rotate,(18*M.d/SCR.rad)^1.6,nil,M.block:getWidth()/2,M.block:getHeight()/2)
end end
gc.pop() gc_translate(-SCR.cx,-SCR.cy)
end end
function back.discard() function back.discard()
mino=nil mino=nil

View File

@@ -1,6 +1,9 @@
--Flying cubes --Flying cubes
local gc=love.graphics local gc=love.graphics
local rectangle=gc.rectangle local gc_clear=gc.clear
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_rectangle=gc.rectangle
local rnd=math.random local rnd=math.random
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
local back={} local back={}
@@ -61,19 +64,16 @@ function back.update(dt)
end end
end end
function back.draw() function back.draw()
gc.clear(.1,.1,.1) gc_clear(.1,.1,.1)
gc.push('transform') gc_setLineWidth(6)
gc.origin()
gc.setLineWidth(6)
for i=1,#squares do for i=1,#squares do
local S=squares[i] local S=squares[i]
local c=S.color local c=S.color
gc.setColor(c[1],c[2],c[3],.6) gc_setColor(c[1],c[2],c[3],.2)
rectangle('line',S.x,S.y,S.size,S.size) gc_rectangle('line',S.x,S.y,S.size,S.size)
gc.setColor(c) gc_setColor(c[1],c[2],c[3],.3)
rectangle('fill',S.x,S.y,S.size,S.size) gc_rectangle('fill',S.x,S.y,S.size,S.size)
end end
gc.pop()
end end
function back.discard() function back.discard()
squares=nil squares=nil

View File

@@ -1,6 +1,11 @@
--UUZ's fan --UUZ's fan
local gc=love.graphics local gc=love.graphics
local polygon,ellipse=gc.polygon,gc.ellipse local gc_clear,gc_origin,gc_replaceTransform=gc.clear,gc.origin,gc.replaceTransform
local gc_translate=gc.translate
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_line,gc_polygon=gc.line,gc.polygon
local gc_arc,gc_ellipse=gc.arc,gc.ellipse
local rnd=math.random local rnd=math.random
local max,min,sin=math.max,math.min,math.sin local max,min,sin=math.max,math.min,math.sin
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
@@ -9,7 +14,7 @@ local back={}
local t local t
local fan,petal local fan,petal
function back.init() function back.init()
t=rnd(2600) t=0
fan=title_fan fan=title_fan
petal={} petal={}
end end
@@ -39,35 +44,34 @@ function back.update()
end end
end end
function back.draw() function back.draw()
gc.push('transform') gc_clear(.1,.1,.1)
gc.translate(SCR.w/2,SCR.h/2+20*sin(t*.02))
gc.scale(SCR.k)
gc.clear(.1,.1,.1)
gc.setLineWidth(320)
gc.setColor(.3,.2,.3)
gc.arc('line','open',0,420,500,-.8*3.1416,-.2*3.1416)
gc.setLineWidth(4) gc_replaceTransform(SCR.xOy_m)
gc.setColor(.7,.5,.65) gc_translate(0,20*sin(t*.02))
gc.arc('line','open',0,420,660,-.799*3.1416,-.201*3.1416)
gc.arc('line','open',0,420,340,-.808*3.1416,-.192*3.1416)
gc.line(-281,224,-530,30.5)
gc.line(281,224,530,30.5)
gc.setLineWidth(6) gc_setLineWidth(320)
gc.setColor(.55,.5,.6) gc_setColor(.9,.6,.9,.1)
for i=1,8 do gc_arc('line','open',0,420,500,-.8*3.1416,-.2*3.1416)
polygon('line',fan[i])
end
gc.setLineWidth(2) gc_setLineWidth(4)
gc.setColor(.6,.3,.5) gc_setColor(1,.7,.9,.2)
gc.origin() gc_arc('line','open',0,420,660,-.799*3.1416,-.201*3.1416)
gc_arc('line','open',0,420,340,-.808*3.1416,-.192*3.1416)
gc_line(-281,224,-530,30.5)
gc_line(281,224,530,30.5)
gc_setLineWidth(6)
gc_setColor(.8,.9,1,.3)
for i=1,8 do gc_polygon('line',fan[i])end
gc_setLineWidth(2)
gc_setColor(1,.5,.7,.3)
gc_origin()
for i=1,#petal do for i=1,#petal do
local P=petal[i] local P=petal[i]
ellipse('fill',P.x,P.y,P.rx,P.ry) gc_ellipse('fill',P.x,P.y,P.rx,P.ry)
end end
gc.pop()
end end
function back.discard() function back.discard()
petal=nil petal=nil

View File

@@ -1,6 +1,9 @@
--Firework --Firework
local gc=love.graphics local gc=love.graphics
local circle,line=gc.circle,gc.line local gc_clear=gc.clear
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_line,gc_circle=gc.line,gc.circle
local rnd=math.random local rnd=math.random
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
local back={} local back={}
@@ -22,7 +25,7 @@ function back.update(dt)
y1=SCR.h*(.15+rnd()*.4), y1=SCR.h*(.15+rnd()*.4),
t=0, t=0,
v=.5+rnd(), v=.5+rnd(),
color=COLOR.random_bright(), color=COLOR.random_dark(),
big=rnd()<.1, big=rnd()<.1,
}) })
t=rnd(26,62) t=rnd(26,62)
@@ -75,22 +78,19 @@ function back.update(dt)
end end
end end
function back.draw() function back.draw()
gc.clear(.1,.1,.1) gc_clear(.1,.1,.1)
gc.push('transform')
gc.origin()
for i=1,#firework do for i=1,#firework do
local F=firework[i] local F=firework[i]
gc.setColor(F.color) gc_setColor(F.color)
circle('fill',F.x,F.y,F.big and 8 or 4) gc_circle('fill',F.x,F.y,F.big and 8 or 4)
end end
gc.setLineWidth(3) gc_setLineWidth(3)
for i=1,#particle do for i=1,#particle do
local P=particle[i] local P=particle[i]
local c=P.color local c=P.color
gc.setColor(c[1],c[2],c[3],P.t) gc_setColor(c[1],c[2],c[3],P.t*.4)
line(P.x,P.y,P.x-P.vx*4,P.y-P.vy*4) gc_line(P.x,P.y,P.x-P.vx*4,P.y-P.vy*4)
end end
gc.pop()
end end
function back.discard() function back.discard()
firework=nil firework=nil

View File

@@ -1,6 +0,0 @@
local gc=love.graphics
local back={}
function back.draw()
gc.clear(.3,.3,.3)
end
return back

View File

@@ -38,14 +38,11 @@ function back.update(dt)
end end
function back.draw() function back.draw()
gc.clear(.1,.1,.1) gc.clear(.1,.1,.1)
gc.push('transform') gc.setColor(1,1,1,.2)
gc.origin()
gc.setColor(1,1,1)
local img=IMG.lanterns local img=IMG.lanterns
for i=1,#lanterns do for i=1,#lanterns do
local L=lanterns[i] local L=lanterns[i]
mDraw(img[int(L.phase*6)+1],L.x,L.y,nil,L.size) mDraw(img[int(L.phase*6)+1],L.x,L.y,nil,L.size)
end end
gc.pop()
end end
return back return back

View File

@@ -0,0 +1,36 @@
--Space with stars
local gc=love.graphics
local back={}
local upCover do
local L={1,64}
for i=0,63 do
table.insert(L,{'setCL',.6,1,1,i*.01})
table.insert(L,{'fRect',0,63-i,1,1})
end
upCover=DOGC(L)
end
local downCover do
local L={1,64}
for i=0,63 do
table.insert(L,{'setCL',1,.5,.8,i*.01})
table.insert(L,{'fRect',0,i,1,1})
end
downCover=DOGC(L)
end
local W,H
function back.init()
BG.resize(SCR.w,SCR.h)
end
function back.resize(w,h)
W,H=w,h
end
function back.update()
end
function back.draw()
gc.clear(.1,.1,.1)
gc.draw(upCover,0,0,0,W,H*.3/64)
gc.draw(downCover,0,H*.7,0,W,H*.3/64)
end
return back

View File

@@ -1,6 +0,0 @@
local gc=love.graphics
local back={}
function back.draw()
gc.clear(.95,.95,.95)
end
return back

View File

@@ -24,6 +24,6 @@ function back.draw()
end end
local _=colorLib[SETTING.skin[R]] local _=colorLib[SETTING.skin[R]]
gc.setColor(_[1],_[2],_[3],.12) gc.setColor(_[1],_[2],_[3],.12)
gc.draw(TEXTURE.miniBlock[R],SCR.w/2,SCR.h/2,t%3.1416*6,400*SCR.k,nil,scs[R][0][2]+.5,#blocks[R][0]-scs[R][0][1]-.5) gc.draw(TEXTURE.miniBlock[R],SCR.cx,SCR.cy,t%3.1416*6,400*SCR.k,nil,scs[R][0][2]+.5,#blocks[R][0]-scs[R][0][1]-.5)
end end
return back return back

View File

@@ -1,5 +1,9 @@
--Black-White grid --Black-White grid
local gc=love.graphics local gc=love.graphics
local gc_clear,gc_scale=gc.clear,gc.scale
local gc_setColor=gc.setColor
local gc_rectangle=gc.rectangle
local sin=math.sin local sin=math.sin
local ceil=math.ceil local ceil=math.ceil
local back={} local back={}
@@ -13,17 +17,15 @@ function back.update(dt)
t=t+dt t=t+dt
end end
function back.draw() function back.draw()
gc.clear(.1,.1,.1) gc_clear(.1,.1,.1)
gc.push('transform')
local k=SCR.k local k=SCR.k
gc.scale(k) gc_scale(k)
local Y=ceil(SCR.h/80/k) local Y=ceil(SCR.h/80/k)
for x=1,ceil(SCR.w/80/k)do for x=1,ceil(SCR.w/80/k)do
for y=1,Y do for y=1,Y do
gc.setColor(1,1,1,sin(x+matrixT[x][y]*t)*.1+.1) gc_setColor(1,1,1,sin(x+matrixT[x][y]*t)*.04+.04)
gc.rectangle('fill',80*x,80*y,-80,-80) gc_rectangle('fill',80*x,80*y,-80,-80)
end end
end end
gc.pop()
end end
return back return back

View File

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

View File

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

View File

@@ -12,9 +12,9 @@ function back.update(dt)
end end
function back.draw() function back.draw()
gc.clear( gc.clear(
sin(t*1.2)*.15+.2, sin(t*1.2)*.06+.08,
sin(t*1.5)*.15+.2, sin(t*1.5)*.06+.08,
sin(t*1.9)*.15+.2 sin(t*1.9)*.06+.08
) )
end end
return back return back

View File

@@ -38,15 +38,12 @@ function back.update()
end end
end end
function back.draw() function back.draw()
gc.clear(.2,.2,.2) gc.clear(.1,.1,.1)
gc.push('transform')
gc.setColor(.7,.7,.7) gc.setColor(.7,.7,.7)
gc.origin()
for i=1,#snow do for i=1,#snow do
local P=snow[i] local P=snow[i]
ellipse('fill',P.x,P.y,P.rx,P.ry) ellipse('fill',P.x,P.y,P.rx,P.ry)
end end
gc.pop()
end end
function back.discard() function back.discard()
snow=nil snow=nil

View File

@@ -34,7 +34,7 @@ function back.draw()
gc.clear(.1,.1,.1) gc.clear(.1,.1,.1)
if not stars[1]then return end if not stars[1]then return end
gc.translate(-10,-10) gc.translate(-10,-10)
gc.setColor(.8,.8,.8) gc.setColor(1,1,1,.6)
for i=1,1260,5 do for i=1,1260,5 do
rectangle('fill',stars[i+1],stars[i+2],stars[i],stars[i]) rectangle('fill',stars[i+1],stars[i+2],stars[i],stars[i])
end end

View File

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

View File

@@ -19,7 +19,7 @@ function back.draw()
gc.clear(.1,.1,.1) gc.clear(.1,.1,.1)
end end
gc.push('transform') gc.push('transform')
gc.translate(SCR.w/2,SCR.h/2+20*sin(t*.02)) gc.translate(SCR.cx,SCR.cy+20*sin(t*.02))
gc.scale(SCR.k) gc.scale(SCR.k)
gc.scale(1.1626,1.26) gc.scale(1.1626,1.26)
if -t%6.26<.1355 then if -t%6.26<.1355 then
@@ -28,11 +28,11 @@ function back.draw()
if -t%12.6<.1626 then if -t%12.6<.1626 then
gc.rotate(t+5*sin(.26*t)+5*sin(.626*t)) gc.rotate(t+5*sin(.26*t)+5*sin(.626*t))
end end
gc.setColor(.2,.3,.5) gc.setColor(.4,.6,1,.3)
gc.draw(txt,-883*.5+4*sin(t*.7942),-110*.5+4*sin(t*.7355)) gc.draw(txt,-883*.5+4*sin(t*.7942),-110*.5+4*sin(t*.7355))
gc.setColor(.4,.6,.8) gc.setColor(.5,.7,1,.4)
gc.draw(txt,-883*.5+2*sin(t*.77023),-110*.5+2*sin(t*.7026)) gc.draw(txt,-883*.5+2*sin(t*.77023),-110*.5+2*sin(t*.7026))
gc.setColor(.9,.9,.9) gc.setColor(1,1,1,.5)
gc.draw(txt,-883*.5+3*sin(t*.7283),-110*.5+3*sin(t*.7626)) gc.draw(txt,-883*.5+3*sin(t*.7283),-110*.5+3*sin(t*.7626))
gc.pop() gc.pop()
end end

View File

@@ -3,14 +3,14 @@ local gc=love.graphics
local rnd=math.random local rnd=math.random
local back={} local back={}
local wingColor={ local wingColor={
{0., .9, .9,.626}, {0., .9, .9,.26},
{.3, 1., .3,.626}, {.3, 1., .3,.26},
{.9, .9, 0.,.626}, {.9, .9, 0.,.26},
{1., .5, 0.,.626}, {1., .5, 0.,.26},
{1., .3, .3,.626}, {1., .3, .3,.26},
{.5, 0., 1.,.626}, {.5, 0., 1.,.26},
{.3, .3, 1.,.626}, {.3, .3, 1.,.26},
{0., .9, .9,.626}, {0., .9, .9,.26},
} }
local bar,crystal local bar,crystal
local W,H local W,H

View File

@@ -4,6 +4,8 @@ local int=math.floor
local char,byte=string.char,string.byte local char,byte=string.char,string.byte
local ins=table.insert local ins=table.insert
local BAG,FIELD,MISSION,CUSTOMENV,GAME=BAG,FIELD,MISSION,CUSTOMENV,GAME
local DATA={} local DATA={}
--Sep symbol: 33 (!) --Sep symbol: 33 (!)
--Safe char: 34~126 --Safe char: 34~126
@@ -14,7 +16,6 @@ local DATA={}
Example: "abcdefg" is [SZJLTOI], "a^aDb)" is [Z*63,Z*37,S*10] Example: "abcdefg" is [SZJLTOI], "a^aDb)" is [Z*63,Z*37,S*10]
]] ]]
function DATA.copySequence() function DATA.copySequence()
local BAG=BAG
local str="" local str=""
local count=1 local count=1
@@ -33,10 +34,8 @@ function DATA.copySequence()
return str return str
end end
function DATA.pasteSequence(str) function DATA.pasteSequence(str)
local b TABLE.cut(BAG)
local b,reg
local bag={}
local reg
for i=1,#str do for i=1,#str do
b=byte(str,i) b=byte(str,i)
if not reg then if not reg then
@@ -47,21 +46,17 @@ function DATA.pasteSequence(str)
end end
else else
if b>=97 and b<=125 then if b>=97 and b<=125 then
ins(bag,reg) ins(BAG,reg)
reg=b-96 reg=b-96
elseif b>=34 and b<=96 then elseif b>=34 and b<=96 then
for _=1,b-32 do for _=1,b-32 do
ins(bag,reg) ins(BAG,reg)
end end
reg=false reg=false
end end
end end
end end
if reg then if reg then ins(BAG,reg)end
ins(bag,reg)
end
BAG=bag
return true return true
end end
@@ -98,7 +93,7 @@ function DATA.copyBoard(page)--Copy the [page] board
end end
str=str..S str=str..S
end end
return data.encode('string','base64',data.compress('string','zlib',str)) return STRING.packBin(str)
end end
function DATA.copyBoards() function DATA.copyBoards()
local out={} local out={}
@@ -111,22 +106,18 @@ function DATA.pasteBoard(str,page)--Paste [str] data to [page] board
if not page then page=1 end if not page then page=1 end
if not FIELD[page]then FIELD[page]=DATA.newBoard()end if not FIELD[page]then FIELD[page]=DATA.newBoard()end
local F=FIELD[page] local F=FIELD[page]
local _,__
--Decode --Decode
str=str:sub(str:find("%S"),str:find(".%s-$")) str=STRING.unpackBin(str)
_,str=pcall(data.decode,'string','base64',str) if not str then return end
if not _ then return end
_,str=pcall(data.decompress,'string','zlib',str)
if not _ then return end
local fX,fY=1,1--*ptr for Field(r*10+(c-1)) local fX,fY=1,1--*ptr for Field(r*10+(c-1))
local p=1 local p=1
while true do while true do
_=byte(str,p)--1byte local b=byte(str,p)--1byte
--Str end --Str end
if not _ then if not b then
if fX~=1 then if fX~=1 then
return return
else else
@@ -134,11 +125,11 @@ function DATA.pasteBoard(str,page)--Paste [str] data to [page] board
end end
end end
__=_%32-1--Block id local id=b%32-1--Block id
if __>26 then return end--Illegal blockid if id>26 then return end--Illegal blockid
_=int(_/32)--Mode id b=int(b/32)--Mode id
F[fY][fX]=__ F[fY][fX]=id
if fX<10 then if fX<10 then
fX=fX+1 fX=fX+1
else else
@@ -176,7 +167,6 @@ end
]] ]]
function DATA.copyMission() function DATA.copyMission()
local _ local _
local MISSION=MISSION
local str="" local str=""
local count=1 local count=1
@@ -362,7 +352,7 @@ do--function DATA.saveRecording()
--Filtering modes that cannot be saved --Filtering modes that cannot be saved
for _,v in next,noRecList do for _,v in next,noRecList do
if GAME.curModeName:find(v)then if GAME.curModeName:find(v)then
LOG.print("Cannot save recording of this mode now!",COLOR.N) LOG.print("Cannot save recording of this mode now!",'warn')
return return
end end
end end
@@ -386,7 +376,7 @@ do--function DATA.saveRecording()
FILE.save(REPLAY,'conf/replay') FILE.save(REPLAY,'conf/replay')
return true return true
else else
LOG.print("Save failed: File already exists") LOG.print("Save failed: File already exists",'error')
end end
end end
end end

View File

@@ -1,13 +1,21 @@
local gc=love.graphics local gc=love.graphics
local gc_push,gc_pop=gc.push,gc.pop
local gc_origin,gc_replaceTransform=gc.origin,gc.replaceTransform
local gc_setLineWidth,gc_setColor=gc.setLineWidth,gc.setColor
local gc_setShader=gc.setShader
local gc_draw,gc_rectangle,gc_line,gc_printf=gc.draw,gc.rectangle,gc.line,gc.printf
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
local SETTING,GAME,SCR=SETTING,GAME,SCR
--System --System
function switchFullscreen() function switchFullscreen()
SETTING.fullscreen=not SETTING.fullscreen SETTING.fullscreen=not SETTING.fullscreen
love.window.setFullscreen(SETTING.fullscreen) love.window.setFullscreen(SETTING.fullscreen)
love.resize(love.graphics.getWidth(),love.graphics.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
end end
@@ -228,7 +236,7 @@ function loadGame(M,ifQuickPlay,ifNet)--Load a mode and go to game scene
if ifNet then if ifNet then
SCN.go('net_game','swipeD') SCN.go('net_game','swipeD')
else else
drawableText.modeName:set(text.modes[M][1].." "..text.modes[M][2]) drawableText.modeName:set((text.modes[M][1]or M).." "..(text.modes[M][2]or""))
SCN.go('game',ifQuickPlay and'swipeD'or'fade_togame') SCN.go('game',ifQuickPlay and'swipeD'or'fade_togame')
SFX.play('enter') SFX.play('enter')
end end
@@ -236,7 +244,8 @@ function loadGame(M,ifQuickPlay,ifNet)--Load a mode and go to game scene
end end
function gameOver()--Save record function gameOver()--Save record
if GAME.replaying then return end if GAME.replaying then return end
FILE.save(STAT,'conf/data') trySave()
local M=GAME.curMode local M=GAME.curMode
local R=M.getRank local R=M.getRank
if R then if R then
@@ -291,7 +300,61 @@ function gameOver()--Save record
end end
end end
end end
function initPlayerPosition(sudden)--Set initial position for every player function trySave()
if not GAME.statSaved and PLAYERS[1]and(PLAYERS[1].frameRun>300 or GAME.result)then
GAME.statSaved=true
STAT.game=STAT.game+1
mergeStat(STAT,PLAYERS[1].stat)
STAT.todayTime=STAT.todayTime+PLAYERS[1].stat.time
FILE.save(STAT,'conf/data')
end
end
do--function freshPlayerPosition(sudden)
local posLists={
--1~5
{
{340,75,1},
{965,390,.5},
{965,30,.5},
{20,390,.5},
{20,30,.5},
},
--6~17
(function()
local L={{340,75,1}}
for i=1,4 do ins(L,{15,-160+180*i,.25})end
for i=1,4 do ins(L,{180,-160+180*i,.25})end
for i=1,4 do ins(L,{950,-160+180*i,.25})end
for i=1,4 do ins(L,{1120,-160+180*i,.25})end
return L
end)(),
--18~31
(function()
local L={{340,75,1}}
for i=1,5 do ins(L,{10, -100+135*i,.18})end
for i=1,5 do ins(L,{120,-100+135*i,.18})end
for i=1,5 do ins(L,{230,-100+135*i,.18})end
for i=1,5 do ins(L,{940,-100+135*i,.18})end
for i=1,5 do ins(L,{1050,-100+135*i,.18})end
for i=1,5 do ins(L,{1160,-100+135*i,.18})end
return L
end)(),
--32~49
(function()
local L={{340,75,1}}
for i=1,4 do for j=1,6 do ins(L,{78*i-54,115*j-98,.09})end end
for i=9,12 do for j=1,6 do ins(L,{78*i+267,115*j-98,.09})end end
return L
end)(),
--50~99
(function()
local L={{340,75,1}}
for i=1,7 do for j=1,7 do ins(L,{46*i-36,97*j-72,.068})end end
for i=15,21 do for j=1,7 do ins(L,{46*i+264,97*j-72,.068})end end
return L
end)(),
}
function freshPlayerPosition(sudden)--Set initial position for every player
local L=PLY_ALIVE local L=PLY_ALIVE
if not sudden then if not sudden then
for i=1,#L do for i=1,#L do
@@ -299,71 +362,36 @@ function initPlayerPosition(sudden)--Set initial position for every player
end end
end end
local posList
if #L<=5 then posList=posLists[1]
elseif #L<=17 then posList=posLists[2]
elseif #L<=31 then posList=posLists[3]
elseif #L<=49 then posList=posLists[4]
elseif #L<=99 then posList=posLists[5]
else error("TOO MANY PLAYERS!")
end
local method=sudden and'setPosition'or'movePosition' local method=sudden and'setPosition'or'movePosition'
L[1][method](L[1],340,75,1) for i=1,#L do L[i][method](L[i],unpack(posList[i]))end
if #L<=5 then
if L[2]then L[2][method](L[2],965,390,.5)end
if L[3]then L[3][method](L[3],965, 30,.5)end
if L[4]then L[4][method](L[4], 20,390,.5)end
if L[5]then L[5][method](L[5], 20, 30,.5)end
elseif #L<=17 then
for i=1,4 do if L[i+1]then L[i+1][method](L[i+1], 15, -160+180*i,.25)else return end end
for i=1,4 do if L[i+5]then L[i+5][method](L[i+5], 180,-160+180*i,.25)else return end end
for i=1,4 do if L[i+9]then L[i+9][method](L[i+9], 950,-160+180*i,.25)else return end end
for i=1,4 do if L[i+13]then L[i+13][method](L[i+13],1120,-160+180*i,.25)else return end end
elseif #L<=31 then
for i=1,5 do if L[i+1]then L[i+1][method](L[i+1], 10, -100+135*i,.18)else return end end
for i=1,5 do if L[i+6]then L[i+6][method](L[i+6], 120,-100+135*i,.18)else return end end
for i=1,5 do if L[i+11]then L[i+11][method](L[i+11],230,-100+135*i,.18)else return end end
for i=1,5 do if L[i+16]then L[i+16][method](L[i+16],940,-100+135*i,.18)else return end end
for i=1,5 do if L[i+21]then L[i+21][method](L[i+21],1050,-100+135*i,.18)else return end end
for i=1,5 do if L[i+26]then L[i+26][method](L[i+26],1160,-100+135*i,.18)else return end end
elseif #L<=49 then
local n=2
for i=1,4 do for j=1,6 do
if not L[n]then return end
L[n][method](L[n],78*i-54,115*j-98,.09)
n=n+1
end end
for i=9,12 do for j=1,6 do
if not L[n]then return end
L[n][method](L[n],78*i+267,115*j-98,.09)
n=n+1
end end
elseif #L<=99 then
local n=2
for i=1,7 do for j=1,7 do
if not L[n]then return end
L[n][method](L[n],46*i-36,97*j-72,.068)
n=n+1
end end
for i=15,21 do for j=1,7 do
if not L[n]then return end
L[n][method](L[n],46*i+264,97*j-72,.068)
n=n+1
end end
else
error("TOO MANY PLAYERS!")
end end
end end
do--function dumpBasicConfig() do--function dumpBasicConfig()
local gameSetting={ local gameSetting={
--Tuning --Tuning
"das","arr","dascut","sddas","sdarr", 'das','arr','dascut','sddas','sdarr',
"ihs","irs","ims","RS","swap", 'ihs','irs','ims','RS','swap',
--System --System
"skin","face", 'skin','face',
--Graphic --Graphic
"block","ghost","center","bagLine", 'block','ghost','center','bagLine',
"dropFX","moveFX","shakeFX", 'dropFX','moveFX','shakeFX',
"text","highCam","nextPos", 'text','highCam','nextPos',
--Unnecessary graphic --Unnecessary graphic
-- "grid","smooth", -- 'grid','smooth',
-- "lockFX","clearFX","splashFX","atkFX", -- 'lockFX','clearFX','splashFX','atkFX',
-- "score", -- 'score',
} }
function dumpBasicConfig() function dumpBasicConfig()
local S={} local S={}
@@ -374,7 +402,6 @@ do--function dumpBasicConfig()
end end
end end
do--function resetGameData(args) do--function resetGameData(args)
local YIELD=YIELD
local function tick_showMods() local function tick_showMods()
local time=0 local time=0
while true do while true do
@@ -392,16 +419,16 @@ do--function resetGameData(args)
end end
local gameSetting={ local gameSetting={
--Tuning --Tuning
"das","arr","dascut","sddas","sdarr", 'das','arr','dascut','sddas','sdarr',
"ihs","irs","ims","RS","swap", 'ihs','irs','ims','RS','swap',
--System --System
"skin","face", 'skin','face',
--Graphic --Graphic
"block","ghost","center","smooth","grid","bagLine", 'block','ghost','center','smooth','grid','bagLine',
"lockFX","dropFX","moveFX","clearFX","splashFX","shakeFX","atkFX", 'lockFX','dropFX','moveFX','clearFX','splashFX','shakeFX','atkFX',
"text","score",'warn',"highCam","nextPos", 'text','score','warn','highCam','nextPos',
} }
local function copyGameSetting() local function copyGameSetting()
local S={} local S={}
@@ -416,10 +443,7 @@ do--function resetGameData(args)
end end
function resetGameData(args,seed) function resetGameData(args,seed)
if not args then args=""end if not args then args=""end
if PLAYERS[1]and not GAME.replaying and(PLAYERS[1].frameRun>400 or GAME.result)then trySave()
mergeStat(STAT,PLAYERS[1].stat)
STAT.todayTime=STAT.todayTime+PLAYERS[1].stat.time
end
GAME.result=false GAME.result=false
GAME.warnLVL0=0 GAME.warnLVL0=0
@@ -437,6 +461,7 @@ do--function resetGameData(args)
GAME.setting=copyGameSetting() GAME.setting=copyGameSetting()
GAME.rep={} GAME.rep={}
GAME.recording=true GAME.recording=true
GAME.statSaved=false
GAME.replaying=false GAME.replaying=false
GAME.rank=0 GAME.rank=0
math.randomseed(TIME()) math.randomseed(TIME())
@@ -444,11 +469,22 @@ do--function resetGameData(args)
destroyPlayers() destroyPlayers()
GAME.curMode.load() GAME.curMode.load()
initPlayerPosition(args:find'q') freshPlayerPosition(args:find'q')
VK.restore() VK.restore()
if GAME.modeEnv.task then if GAME.modeEnv.task then
local task=GAME.modeEnv.task
if type(task)=='function'then
for i=1,#PLAYERS do for i=1,#PLAYERS do
PLAYERS[i]:newTask(GAME.modeEnv.task) PLAYERS[i]:newTask(task)
end
elseif type(task)=='table'then
for i=1,#PLAYERS do
for _,t in ipairs(task)do
PLAYERS[i]:newTask(t)
end
end
else
LOG.print("Wrong task type",'warn')
end end
end end
BG.set(GAME.modeEnv.bg) BG.set(GAME.modeEnv.bg)
@@ -467,7 +503,6 @@ do--function resetGameData(args)
GAME.secDangerous=false GAME.secDangerous=false
GAME.stage=1 GAME.stage=1
end end
STAT.game=STAT.game+1
FREEROW.reset(30*#PLAYERS) FREEROW.reset(30*#PLAYERS)
TASK.removeTask_code(tick_showMods) TASK.removeTask_code(tick_showMods)
if GAME.setting.allowMod then if GAME.setting.allowMod then
@@ -495,7 +530,7 @@ do--function checkWarning()
end end
end end
end end
GAME.warnLVL0=math.log(height-(P1.gameEnv.fieldH-5)+P1.atkBuffer.sum*.8) GAME.warnLVL0=math.log(height-(P1.gameEnv.fieldH-5)+P1.atkBufferSum*.8)
end end
local _=GAME.warnLVL local _=GAME.warnLVL
if _<GAME.warnLVL0 then if _<GAME.warnLVL0 then
@@ -508,7 +543,7 @@ do--function checkWarning()
GAME.warnLVL=max(GAME.warnLVL-.026,0) GAME.warnLVL=max(GAME.warnLVL-.026,0)
end end
if GAME.warnLVL>1.126 and P1.frameRun%30==0 then if GAME.warnLVL>1.126 and P1.frameRun%30==0 then
SFX.fplay("warning",SETTING.sfx_warn) SFX.fplay('warning',SETTING.sfx_warn)
end end
end end
end end
@@ -516,50 +551,33 @@ end
--Game draw --Game draw
do--function drawFWM()
local m={
string.char(230,184,184,230,136,143,228,189,156,232,128,133,58,77,114,90,95,50,54,10,228,187,187,228,189,149,232,167,134,233,162,145,47,231,155,180,230,146,173,228,184,141,229,190,151,229,135,186,231,142,176,230,173,164,230,176,180,229,141,176,10,228,187,187,228,189,149,232,189,172,232,191,176,229,163,176,230,152,142,230,151,160,230,149,136),
string.char(230,184,184,230,136,143,228,189,156,232,128,133,58,77,114,90,95,50,54,10,228,187,187,228,189,149,232,167,134,233,162,145,47,231,155,180,230,146,173,228,184,141,229,190,151,229,135,186,231,142,176,230,173,164,230,176,180,229,141,176,10,228,187,187,228,189,149,232,189,172,232,191,176,229,163,176,230,152,142,230,151,160,230,149,136),
string.char(230,184,184,230,136,143,228,189,156,232,128,133,58,77,114,90,95,50,54,10,228,187,187,228,189,149,232,167,134,233,162,145,47,231,155,180,230,146,173,228,184,141,229,190,151,229,135,186,231,142,176,230,173,164,230,176,180,229,141,176,10,228,187,187,228,189,149,232,189,172,232,191,176,229,163,176,230,152,142,230,151,160,230,149,136),
string.char(65,117,116,104,111,114,58,32,77,114,90,95,50,54,10,82,101,99,111,114,100,105,110,103,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104,105,115,10,119,97,116,101,114,109,97,114,107,32,97,114,101,32,117,110,97,117,116,104,111,114,105,122,101,100),
string.char(67,114,195,169,97,116,101,117,114,32,100,117,32,106,101,117,58,32,77,114,90,95,50,54,10,69,110,114,101,103,105,115,116,114,101,109,101,110,116,32,110,111,110,32,97,117,116,111,114,105,115,195,169,10,99,111,110,116,101,110,97,110,116,32,99,101,32,102,105,108,105,103,114,97,110,101),
string.char(65,117,116,111,114,58,32,77,114,90,95,50,54,10,71,114,97,98,97,99,105,195,179,110,32,110,111,32,97,117,116,111,114,105,122,97,100,97,32,113,117,101,10,99,111,110,116,105,101,110,101,32,101,115,116,97,32,109,97,114,99,97,32,100,101,32,97,103,117,97),
string.char(65,117,116,111,114,32,100,111,32,106,111,103,111,58,32,77,114,90,95,50,54,10,71,114,97,118,97,195,167,195,181,101,115,32,99,111,110,116,101,110,100,111,32,101,115,116,97,32,77,97,114,99,97,10,100,101,32,195,161,103,117,97,32,110,195,163,111,32,115,195,163,111,32,97,117,116,111,114,105,122,97,100,97,115),
string.char(65,117,116,104,111,114,58,32,77,114,90,95,50,54,10,82,101,99,111,114,100,105,110,103,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104,105,115,10,119,97,116,101,114,109,97,114,107,32,97,114,101,32,117,110,97,117,116,104,111,114,105,122,101,100),
}
--你竟然找到了这里!那么在动手之前读读下面这些吧。
--【魔幻错别字躲关键字搜索警告,看得懂就行】
--千万不要为了在网络公共场合发视屏或者直播需要而擅自删除这部分代码!
--录制视屏上传到公共场合(包括但不限于任何视屏平台/论坛/好几十个人及以上的非方块社区/群等)很可能会对Techmino未来的发展有负面影响
--如果被TTC发现随时可能被他们用DMCA从法律层面强迫停止开发到时候谁都没得玩。这是真的已经有几个方块这么死了…
--氵印限制还可以减少低质量视屏泛滥,也能减轻过多不是真的感兴趣路人玩家入坑可能带来的压力
--想发视屏的话请先向作者申请,描述录制的大致内容,同意了才可以去关闭氵印
--等Techmino发展到一定程度之后会解除这个限制
--最后,别把藏在这里的东西截图/复制出去哦~
--感谢您对Techmino的支持!!!
local sin=math.sin
local setFont,TIME,mStr=setFont,TIME,mStr
function drawFWM()
local t=TIME()
setFont(25)
gc.setColor(1,1,1,.2+.1*(sin(3*t)+sin(2.6*t)))
mStr(m[_G["\83\69\84\84\73\78\71"]["\108\97\110\103"]or m[1]],240,60+26*sin(t))
end
end
do--function drawSelfProfile() do--function drawSelfProfile()
local lvIcon=setmetatable({},{__index=function(self,lv)
local img={25,25}
ins(img,{"clear",0,0,0})
ins(img,{"setLW",4})
ins(img,{"setCL",.5,.8,1})
ins(img,{"dRect",2,2,21,21})
--TODO: draw with lv
img=DOGC(img)
rawset(self,lv,img)
return img
end})
local name local name
local textObject,scaleK,width,offY local textObject,scaleK,width,offY
function drawSelfProfile() function drawSelfProfile()
local selfAvatar=USERS.getAvatar(USER.uid) local selfAvatar=USERS.getAvatar(USER.uid)
gc.push('transform') gc_push('transform')
gc.translate(1280,0) gc_replaceTransform(SCR.xOy_ur)
--Draw avatar --Draw avatar
gc.setLineWidth(2) gc_setLineWidth(2)
gc.setColor(.3,.3,.3,.8)gc.rectangle('fill',-300,0,300,80) gc_setColor(.3,.3,.3,.8)gc_rectangle('fill',-300,0,300,80)
gc.setColor(1,1,1)gc.rectangle('line',-300,0,300,80) gc_setColor(1,1,1)gc_rectangle('line',-300,0,300,80)
gc.rectangle('line',-73,7,66,66,2) gc_rectangle('line',-73,7,66,66,2)
gc.draw(selfAvatar,-72,8,nil,.5) gc_draw(selfAvatar,-72,8,nil,.5)
--Draw username --Draw username
if name~=USERS.getUsername(USER.uid)then if name~=USERS.getUsername(USER.uid)then
@@ -569,27 +587,50 @@ do--function drawSelfProfile()
scaleK=210/math.max(width,210) scaleK=210/math.max(width,210)
offY=textObject:getHeight()/2 offY=textObject:getHeight()/2
end end
gc.draw(textObject,-82,26,nil,scaleK,nil,width,offY) gc_draw(textObject,-82,26,nil,scaleK,nil,width,offY)
--Draw lv. & xp. --Draw lv. & xp.
gc.draw(TEXTURE.lvIcon[USER.lv],-295,50) gc_draw(lvIcon[USER.lv],-295,50)
gc.line(-270,55,-80,55,-80,70,-270,70) gc_line(-270,55,-80,55,-80,70,-270,70)
gc.rectangle('fill',-210,55,150*USER.xp/USER.lv/USER.lv,15) gc_rectangle('fill',-210,55,150*USER.xp/USER.lv/USER.lv,15)
gc.pop() gc_pop()
end end
end end
function drawOnlinePlayerCount()
setFont(20)
gc_setColor(1,1,1)
gc_push('transform')
gc_replaceTransform(SCR.xOy_ur)
gc_printf(("%s: %s/%s/%s"):format(text.onlinePlayerCount,NET.UserCount,NET.PlayCount,NET.StreamCount),-600,80,594,'right')
gc_pop()
end
do--function drawWarning()
local shader_warning=SHADER.warning
function drawWarning() function drawWarning()
if SETTING.warn and GAME.warnLVL>0 then if SETTING.warn and GAME.warnLVL>0 then
gc.push('transform') gc_push('transform')
gc.origin() gc_origin()
SHADER.warning:send("level",GAME.warnLVL) shader_warning:send("level",GAME.warnLVL)
gc.setShader(SHADER.warning) gc_setShader(shader_warning)
gc.rectangle('fill',0,0,SCR.w,SCR.h) gc_rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader() gc_setShader()
gc.pop() gc_pop()
end end
end end
end
do--function drawSystemInfo(
--你竟然找到了這裏!那麽在動手之前讀讀下面這些吧。
--千萬不要為了在網絡公共場合發視頻或者直播需要而擅自刪除這部分代碼!
--錄製視頻上傳到公共場合(包括但不限於任何視頻平臺/論壇/好幾十個人及以上的非方塊社區/群等)很可能會對Techmino未來的發展有負面影響
--如果被TTC發現隨時可能被他們用DMCA從法律層面強迫停止開發到時候誰都沒得玩。這是真的已經有幾個方塊這麽死了…
--氵印限製還可以減少低質量視頻泛濫,也能減輕過多不是真的感興趣路人玩家入坑可能帶來的壓力
--想發視頻的話請先向作者申請,描述錄製的大致內容,同意了才可以去關閉氵印
--等Techmino發展到一定程度之後會解除這個限製
--最後,別把藏在這裏的東西截圖/復製出去哦~
--感謝您對Techmino的支持!!!
loadstring(love.data.decode('string','base64',"CWxvY2FsIGc9bG92ZS5ncmFwaGljcztsb2NhbCB4LHMsVCxkLGM9Zy5uZXdUZXh0KGdldEZvbnQoMjUpKSxtYXRoLnNpbixUSU1FLGcuZHJhdyxnLnNldENvbG9yO3g6c2V0ZigiQXV0aOS9nOiAhTpNclpfMjZcbkFscGhh5YaF5rWL56aB5q2i5b2V5bGPL+ebtOaSrVxuTm8gcmVjb3JkaW5nL3N0cmVhbWluZyIsMzAwLCdjZW50ZXInKWZ1bmN0aW9uIGRyYXdGV00oKWxvY2FsIHQ9VCgpYygxLDEsMSwuMTYrLjA2KihzKDMuNTUqdCkrcygyLjYqdCkpKWQoeCwzMCw3Mys1MypzKHQqLjI2KSllbmQK"))()
end
@@ -598,19 +639,21 @@ function backScene()SCN.back()end
do--function goScene(name,style) do--function goScene(name,style)
local cache={} local cache={}
function goScene(name,style) function goScene(name,style)
if not cache[name]then local hash=style and name..style or name
cache[name]=function()SCN.go(name,style)end if not cache[hash]then
cache[hash]=function()SCN.go(name,style)end
end end
return cache[name] return cache[hash]
end end
end end
do--function swapScene(name,style) do--function swapScene(name,style)
local cache={} local cache={}
function swapScene(name,style) function swapScene(name,style)
if not cache[name]then local hash=style and name..style or name
cache[name]=function()SCN.swapTo(name,style)end if not cache[hash]then
cache[hash]=function()SCN.swapTo(name,style)end
end end
return cache[name] return cache[hash]
end end
end end
do--function pressKey(k) do--function pressKey(k)
@@ -623,11 +666,14 @@ do--function pressKey(k)
end end
end end
do--CUS/SETXXX(k) do--CUS/SETXXX(k)
local c,s=CUSTOMENV,SETTING local CUSTOMENV=CUSTOMENV
function CUSval(k)return function()return c[k]end end function CUSval(k)return function()return CUSTOMENV[k]end end
function SETval(k)return function()return s[k]end end function ROOMval(k)return function()return ROOMENV[k]end end
function CUSrev(k)return function()c[k]=not c[k]end end function SETval(k)return function()return SETTING[k]end end
function SETrev(k)return function()s[k]=not s[k]end end function CUSrev(k)return function()CUSTOMENV[k]=not CUSTOMENV[k]end end
function CUSsto(k)return function(i)c[k]=i end end function ROOMrev(k)return function()ROOMENV[k]=not ROOMENV[k]end end
function SETsto(k)return function(i)s[k]=i end end function SETrev(k)return function()SETTING[k]=not SETTING[k]end end
function CUSsto(k)return function(i)CUSTOMENV[k]=i end end
function ROOMsto(k)return function(i)ROOMENV[k]=i end end
function SETsto(k)return function(i)SETTING[k]=i end end
end end

View File

@@ -164,6 +164,7 @@ GAME={--Global game data
modeEnv=false, --Current gamemode environment modeEnv=false, --Current gamemode environment
setting={}, --Game settings setting={}, --Game settings
rep={}, --Recording list, key,time,key,time... rep={}, --Recording list, key,time,key,time...
statSaved=false, --If recording saved
recording=false, --If recording recording=false, --If recording
replaying=false, --If replaying replaying=false, --If replaying
saved=false, --If recording saved saved=false, --If recording saved
@@ -183,8 +184,8 @@ ROYALEDATA={
} }
--Userdata tables --Userdata tables
RANKS=FILE.load("conf/unlock")or{sprint_10l=0}--Ranks of modes RANKS=FILE.load('conf/unlock')or{sprint_10l=0}--Ranks of modes
USER=FILE.load("conf/user")or{--User infomation USER=FILE.load('conf/user')or{--User infomation
--Network infos --Network infos
uid=false, uid=false,
authToken=false, authToken=false,
@@ -192,6 +193,7 @@ USER=FILE.load("conf/user")or{--User infomation
--Local data --Local data
xp=0,lv=1, xp=0,lv=1,
} }
customEnv0={ customEnv0={
version=VERSION.code, version=VERSION.code,
@@ -213,6 +215,8 @@ customEnv0={
--Rule --Rule
sequence='bag', sequence='bag',
fieldH=20, fieldH=20,
heightLimit=1e99,
bufferLimit=1e99,
ospin=true, ospin=true,
fineKill=false, fineKill=false,
@@ -226,14 +230,59 @@ customEnv0={
opponent="X", opponent="X",
life=0, life=0,
pushSpeed=3, pushSpeed=3,
garbageSpeed=1,
missionKill=false, missionKill=false,
--Else --Else
bg='blockfall', bg='blockfall',
bgm='infinite', bgm='hang out',
}
CUSTOMENV=FILE.load('conf/customEnv')--gameEnv for cutsom game
if not CUSTOMENV or CUSTOMENV.version~=VERSION.code then
CUSTOMENV=TABLE.copy(customEnv0)
else
TABLE.complete(customEnv0,CUSTOMENV)
end
ROOMENV={
--Room config
capacity=5,
--Basic
drop=30,
lock=60,
wait=0,
fall=0,
--Control
nextCount=6,
holdCount=1,
infHold=false,
phyHold=false,
--Visual
bone=false,
--Rule
life=0,
pushSpeed=5,
garbageSpeed=2,
visible='show',
freshLimit=15,
fieldH=20,
heightLimit=1e99,
bufferLimit=1e99,
ospin=true,
fineKill=false,
b2bKill=false,
easyFresh=true,
deepDrop=false,
--Else
bg='blockfall',
bgm='hang out',
} }
CUSTOMENV=FILE.load("conf/customEnv")--gameEnv for cutsom game
if not CUSTOMENV or CUSTOMENV.version~=VERSION.code then CUSTOMENV=TABLE.copy(customEnv0)end
SETTING={--Settings SETTING={--Settings
--Tuning --Tuning
das=10,arr=2,dascut=0, das=10,arr=2,dascut=0,
@@ -255,7 +304,6 @@ SETTING={--Settings
10,13,2,8 10,13,2,8
}, },
face={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, face={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
dataSaving=false,
--Graphic --Graphic
block=true,ghost=.3,center=1, block=true,ghost=.3,center=1,
@@ -274,18 +322,20 @@ SETTING={--Settings
text=true, text=true,
score=true, score=true,
warn=true, bufferWarn=true,
highCam=false, showSpike=true,
nextPos=false, highCam=true,
nextPos=true,
fullscreen=true, fullscreen=true,
bg=true, bg=true,
powerInfo=false, powerInfo=false,
clickFX=true, clickFX=true,
warn=true,
--Sound --Sound
sfx=1, sfx=1,
sfx_spawn=.3, sfx_spawn=0,
sfx_warn=.3, sfx_warn=.4,
bgm=.7, bgm=.7,
stereo=.7, stereo=.7,
vib=0, vib=0,
@@ -296,6 +346,7 @@ SETTING={--Settings
VKSFX=.2,--SFX volume VKSFX=.2,--SFX volume
VKVIB=0,--VIB VKVIB=0,--VIB
VKSwitch=false,--If disp VKSwitch=false,--If disp
VKSkin=1,--If disp
VKTrack=false,--If tracked VKTrack=false,--If tracked
VKDodge=false,--If dodge VKDodge=false,--If dodge
VKTchW=.3,--Touch-Pos Weight VKTchW=.3,--Touch-Pos Weight
@@ -303,9 +354,9 @@ SETTING={--Settings
VKIcon=true,--If disp icon VKIcon=true,--If disp icon
VKAlpha=.3, VKAlpha=.3,
} }
local S=FILE.load("conf/settings") local S=FILE.load('conf/settings')
if S then TABLE.update(S,SETTING)end if S then TABLE.update(S,SETTING)end
S=FILE.load("conf/data") S=FILE.load('conf/data')
if S then--Statistics if S then--Statistics
STAT=S STAT=S
else else
@@ -324,7 +375,7 @@ else
todayTime=0, todayTime=0,
}for i=1,29 do STAT.clear[i]={0,0,0,0,0,0}STAT.spin[i]={0,0,0,0,0,0,0}end }for i=1,29 do STAT.clear[i]={0,0,0,0,0,0}STAT.spin[i]={0,0,0,0,0,0,0}end
end end
keyMap=FILE.load("conf/key")or{--Key setting keyMap=FILE.load('conf/key')or{--Key setting
keyboard={ keyboard={
left=1,right=2,x=3,z=4,c=5, left=1,right=2,x=3,z=4,c=5,
up=6,down=7,space=8,a=9,s=10, up=6,down=7,space=8,a=9,s=10,
@@ -336,7 +387,7 @@ keyMap=FILE.load("conf/key")or{--Key setting
leftshoulder=0, leftshoulder=0,
}, },
} }
VK_org=FILE.load("conf/virtualkey")or{--Virtualkey layout, refresh all VKs' position with this before each game VK_org=FILE.load('conf/virtualkey')or{--Virtualkey layout, refresh all VKs' position with this before each game
{ava=true, x=80, y=720-200, r=80},--moveLeft {ava=true, x=80, y=720-200, r=80},--moveLeft
{ava=true, x=320, y=720-200, r=80},--moveRight {ava=true, x=320, y=720-200, r=80},--moveRight
{ava=true, x=1280-80, y=720-200, r=80},--rotRight {ava=true, x=1280-80, y=720-200, r=80},--rotRight
@@ -358,4 +409,4 @@ VK_org=FILE.load("conf/virtualkey")or{--Virtualkey layout, refresh all VKs' posi
{ava=false, x=900, y=50, r=80},--addToLeft {ava=false, x=900, y=50, r=80},--addToLeft
{ava=false, x=1000, y=50, r=80},--addToRight {ava=false, x=1000, y=50, r=80},--addToRight
} }
REPLAY=FILE.load("conf/replay")or{} REPLAY=FILE.load('conf/replay')or{}

View File

@@ -91,48 +91,48 @@ do
} }
TRS={ TRS={
{ {
[01]={"-1+0","-1+1","+0-2","-1+2","+0+1"}, [01]={'-1+0','-1+1','+0-2','-1+2','+0+1'},
[10]={"+1+0","+1-1","+0+2","+1-2","+1-2"}, [10]={'+1+0','+1-1','+0+2','+1-2','+1-2'},
[03]={"+1+0","+1+1","+0-2","+1-1","+1-2"}, [03]={'+1+0','+1+1','+0-2','+1-1','+1-2'},
[30]={"-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+2","+1+2"}, [12]={'+1+0','+1-1','+0+2','+1+2'},
[21]={"-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"}, [32]={'-1+0','-1-1','+0+2','-1+2'},
[23]={"+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"}, [02]={'+1+0','-1+0','+0-1','+0+1'},
[20]={"-1+0","+1+0","+0+1","+0-1"}, [20]={'-1+0','+1+0','+0+1','+0-1'},
[13]={"+0-1","+0+1","+0-2"}, [13]={'+0-1','+0+1','+0-2'},
[31]={"+0+1","+0-1","+0+2"}, [31]={'+0+1','+0-1','+0+2'},
},--Z },--Z
false,--S false,--S
{ {
[01]={"-1+0","-1+1","+1+0","+0-2","+1+1"}, [01]={'-1+0','-1+1','+1+0','+0-2','+1+1'},
[10]={"+1+0","+1-1","-1+0","+0+2","+1+2"}, [10]={'+1+0','+1-1','-1+0','+0+2','+1+2'},
[03]={"+1+0","+1+1","+0-2","+1-2","+1-1","+0+1"}, [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"}, [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"}, [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"}, [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"}, [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"}, [23]={'+1+0','+1-1','-1+0','+1+1','+0-2','+1-2'},
[02]={"-1+0","+1+0","+0-1","+0+1"}, [02]={'-1+0','+1+0','+0-1','+0+1'},
[20]={"+1+0","-1+0","+0+1","+0-1"}, [20]={'+1+0','-1+0','+0+1','+0-1'},
[13]={"+0-1","+0+1","+1+0"}, [13]={'+0-1','+0+1','+1+0'},
[31]={"+0+1","+0-1","-1+0"}, [31]={'+0+1','+0-1','-1+0'},
},--J },--J
false,--L false,--L
{ {
[01]={"-1+0","-1+1","+0-2","-1-2","+0+1"}, [01]={'-1+0','-1+1','+0-2','-1-2','+0+1'},
[10]={"+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"}, [03]={'+1+0','+1+1','+0-2','+1-2','+0+1'},
[30]={"-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"}, [12]={'+1+0','+1-1','+0-1','-1-1','+0+2','+1+2'},
[21]={"-1+0","+0-2","-1-2","+1+1"}, [21]={'-1+0','+0-2','-1-2','+1+1'},
[32]={"-1+0","-1-1","+0-1","+1-1","+0+2","-1+2"}, [32]={'-1+0','-1-1','+0-1','+1-1','+0+2','-1+2'},
[23]={"+1+0","+0-2","+1-2","-1+1"}, [23]={'+1+0','+0-2','+1-2','-1+1'},
[02]={"-1+0","+1+0","+0+1"}, [02]={'-1+0','+1+0','+0+1'},
[20]={"+1+0","-1+0","+0-1"}, [20]={'+1+0','-1+0','+0-1'},
[13]={"+0-1","+0+1","+1+0","+0-2","+0+2"}, [13]={'+0-1','+0+1','+1+0','+0-2','+0+2'},
[31]={"+0-1","+0+1","-1+0","+0-2","+0+2"}, [31]={'+0-1','+0+1','-1+0','+0-2','+0+2'},
},--T },--T
function(P,d) function(P,d)
if P.gameEnv.easyFresh then if P.gameEnv.easyFresh then
@@ -179,111 +179,111 @@ do
end end
end,--O end,--O
{ {
[01]={"+0+1","+1+0","-2+0","-2-1","+1+2"}, [01]={'+0+1','+1+0','-2+0','-2-1','+1+2'},
[10]={"+2+0","-1+0","-1-2","+2+1","+0+1"}, [10]={'+2+0','-1+0','-1-2','+2+1','+0+1'},
[03]={"+0+1","-1+0","+2+0","+2-1","-1+2"}, [03]={'+0+1','-1+0','+2+0','+2-1','-1+2'},
[30]={"-2+0","+1+0","+1-2","-2+1","+0+1"}, [30]={'-2+0','+1+0','+1-2','-2+1','+0+1'},
[12]={"-1+0","+2+0","+2-1","+0-1","-1+2"}, [12]={'-1+0','+2+0','+2-1','+0-1','-1+2'},
[21]={"-2+0","+1+0","+1-2","-2+1","+0+1"}, [21]={'-2+0','+1+0','+1-2','-2+1','+0+1'},
[32]={"+1+0","-2+0","-2-1","+0-1","+1+2"}, [32]={'+1+0','-2+0','-2-1','+0-1','+1+2'},
[23]={"+2+0","-1+0","-1-2","+2+1","+0+1"}, [23]={'+2+0','-1+0','-1-2','+2+1','+0+1'},
[02]={"-1+0","+1+0","+0-1","+0+1"}, [02]={'-1+0','+1+0','+0-1','+0+1'},
[20]={"+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"}, [13]={'+0-1','-1+0','+1+0','+0+1'},
[31]={"+0-1","+1+0","-1+0","+0+1"}, [31]={'+0-1','+1+0','-1+0','+0+1'},
},--I },--I
{ {
[01]={"-1+0","+0+1","+1+1","+0-3","+0+2","+0+3","-1+2"}, [01]={'-1+0','+0+1','+1+1','+0-3','+0+2','+0+3','-1+2'},
[10]={"+1+0","+0-1","-1-1","+0-2","+0-3","+0+3","+1-2"}, [10]={'+1+0','+0-1','-1-1','+0-2','+0-3','+0+3','+1-2'},
[03]={"+1+0","+0-3","+0+1","+0+2","+0+3","+1+2"}, [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"}, [30]={'-1+0','+0+1','+0-2','+0-3','+0+3','-1-2'},
},--Z5 },--Z5
false,--S5 false,--S5
{ {
[01]={"-1+0","-1+1","+0-2","-1-2","-1-1","+0+1"}, [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"}, [10]={'+1+0','+1-1','+0+2','+1+2','+0-1','+1+1'},
[03]={"+1+0","+1+1","+0-2","-1+1"}, [03]={'+1+0','+1+1','+0-2','-1+1'},
[30]={"-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"}, [12]={'+1+0','+1-1','+0+2','+1+2','+1+1'},
[21]={"-1+0","-1-1","-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"}, [32]={'-1+0','-1-1','-1+1','+0-1','+0+2','-1+2'},
[23]={"+1+0","+1+1","-1+0","+0-2","+1-2"}, [23]={'+1+0','+1+1','-1+0','+0-2','+1-2'},
[02]={"-1+0","+0-1","+0+1"}, [02]={'-1+0','+0-1','+0+1'},
[20]={"+1+0","+0+1","+0-1"}, [20]={'+1+0','+0+1','+0-1'},
[13]={"+1+0","+0+1","-1+0"}, [13]={'+1+0','+0+1','-1+0'},
[31]={"-1+0","+0-1","+1+0"}, [31]={'-1+0','+0-1','+1+0'},
},--P },--P
false,--Q false,--Q
{ {
[01]={"-1+0","+1+0","-1+1","+0-2","+0-3"}, [01]={'-1+0','+1+0','-1+1','+0-2','+0-3'},
[10]={"+1+0","+1-1","-1+0","+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"}, [03]={'+1+0','+1-1','+0+1','+0-2','+0-3'},
[30]={"-1+1","+1+0","+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"}, [12]={'+1+0','+0-1','-1+0','+0+2'},
[21]={"-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"}, [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"}, [23]={'+1+0','+1-1','+0-1','-1+0','+0-2','+2+0'},
[02]={"+1+0","-1+0","-1-1"}, [02]={'+1+0','-1+0','-1-1'},
[20]={"-1+0","+1+0","+1+1"}, [20]={'-1+0','+1+0','+1+1'},
[13]={"+0-1","-1+1","+0+1"}, [13]={'+0-1','-1+1','+0+1'},
[31]={"+0-1","+1-1","+0+1"}, [31]={'+0-1','+1-1','+0+1'},
},--F },--F
false,--E false,--E
{ {
[01]={"+0-1","-1-1","+1+0","+1+1","+0-3","-1+0","+0+2","-1+2"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [23]={'-1-1','+1+0','-1+0','+0-1','+0+2','+0+3'},
[02]={"+0-1","+0+1","+0+2"}, [02]={'+0-1','+0+1','+0+2'},
[20]={"+0-1","+0+1","+0-2"}, [20]={'+0-1','+0+1','+0-2'},
[13]={"+1+0","-1+1","-2+0"}, [13]={'+1+0','-1+1','-2+0'},
[31]={"-1+0","+1+1","+2+0"}, [31]={'-1+0','+1+1','+2+0'},
},--T5 },--T5
{ {
[01]={"-1+0","-1+1","+0-2","-1-2"}, [01]={'-1+0','-1+1','+0-2','-1-2'},
[10]={"+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"}, [03]={'+1+0','+1+1','+0-2','+1-2'},
[30]={"-1+0","-1-1","+0-2","-1+2"}, [30]={'-1+0','-1-1','+0-2','-1+2'},
[12]={"+1+0","+1-1","+1+1"}, [12]={'+1+0','+1-1','+1+1'},
[21]={"-1-1","-1+1","-1-1"}, [21]={'-1-1','-1+1','-1-1'},
[32]={"-1+0","-1-1","-1+1"}, [32]={'-1+0','-1-1','-1+1'},
[23]={"+1-1","+1+1","+1-1"}, [23]={'+1-1','+1+1','+1-1'},
[02]={"+0+1"}, [02]={'+0+1'},
[20]={"+0-1"}, [20]={'+0-1'},
[13]={"+0-1","+0+1","+1+0"}, [13]={'+0-1','+0+1','+1+0'},
[31]={"+0-1","+0+1","-1+0"}, [31]={'+0-1','+0+1','-1+0'},
},--U },--U
{ {
[01]={"+0+1","-1+0","+0-2","-1-2"}, [01]={'+0+1','-1+0','+0-2','-1-2'},
[10]={"+0+1","+1+0","+0-2","+1-2"}, [10]={'+0+1','+1+0','+0-2','+1-2'},
[03]={"+0-1","+0+1","+0+2"}, [03]={'+0-1','+0+1','+0+2'},
[30]={"+0-1","+0+1","+0-2"}, [30]={'+0-1','+0+1','+0-2'},
[12]={"+0-1","+0+1"}, [12]={'+0-1','+0+1'},
[21]={"+0-1","+0-2"}, [21]={'+0-1','+0-2'},
[32]={"+1+0","-1+0"}, [32]={'+1+0','-1+0'},
[23]={"-1+0","+1+0"}, [23]={'-1+0','+1+0'},
[02]={"-1+1","+1-1"}, [02]={'-1+1','+1-1'},
[20]={"+1-1","-1+1"}, [20]={'+1-1','-1+1'},
[13]={"+1+1","-1-1"}, [13]={'+1+1','-1-1'},
[31]={"-1-1","+1+1"}, [31]={'-1-1','+1+1'},
},--V },--V
{ {
[01]={"+0-1","-1+0","+1+0","+1-1","+0+2"}, [01]={'+0-1','-1+0','+1+0','+1-1','+0+2'},
[10]={"+0-1","-1-1","+0+1","+0-2","+1-2","+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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [23]={'+0-1','+1-1','+0+1','+0-2','-1-2','+0+2'},
[02]={"+0-1","-1+0"}, [02]={'+0-1','-1+0'},
[20]={"+0+1","+1+0"}, [20]={'+0+1','+1+0'},
[13]={"+0+1","-1+0"}, [13]={'+0+1','-1+0'},
[31]={"+0-1","+1+0"}, [31]={'+0-1','+1+0'},
},--W },--W
function(P,d) function(P,d)
if P.type=='human'then SFX.play('rotate',nil,P:getCenterX()*.15)end if P.type=='human'then SFX.play('rotate',nil,P:getCenterX()*.15)end
@@ -301,89 +301,89 @@ do
P:freshBlock('fresh') P:freshBlock('fresh')
end,--X end,--X
{ {
[01]={"-1+0","-1+1","+0-3","-1+1","-1+2","+0+1"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [23]={'+1+0','+1-1','+1+1','-1+0','+0-2','+1-2','+0+2'},
[02]={"+0-1","+1-1","-1+0","+2-1"}, [02]={'+0-1','+1-1','-1+0','+2-1'},
[20]={"+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"}, [13]={'-1+0','-1-1','+0+1','-1-2'},
[31]={"+1+0","+1+1","+0-1","+1+2"}, [31]={'+1+0','+1+1','+0-1','+1+2'},
},--J5 },--J5
false,--L5 false,--L5
{ {
[01]={"-1+0","-1+0","-1+1","+1+0","-1+2","-1-1","+0-3","+0+1"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [02]={'+0-1','+1-1','-1+0','+2-1','+0+1'},
[20]={"+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"}, [13]={'-1+0','-1-1','+0+1','-1-2'},
[31]={"+1+0","+1+1","+0-1","+1+2"}, [31]={'+1+0','+1+1','+0-1','+1+2'},
},--R },--R
false,--Y false,--Y
{ {
[01]={"-1+0","-1+1","+0+1","+1+0","-1+2","-2+0","+0-2"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [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"}, [23]={'+0-2','+0-3','+1+2','+1+0','+0+1','-1+1','+0-1','+0+2'},
[02]={"-1+0","+0+2","+0-1"}, [02]={'-1+0','+0+2','+0-1'},
[20]={"+1+0","+0-2","+0+1"}, [20]={'+1+0','+0-2','+0+1'},
[13]={"-1+0","-1-1","+0+1","+1+2"}, [13]={'-1+0','-1-1','+0+1','+1+2'},
[31]={"+1+0","+1+1","+0-1","-1-2"}, [31]={'+1+0','+1+1','+0-1','-1-2'},
},--N },--N
false,--H 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"}, [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"}, [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"}, [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"}, [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 },--I5
{ {
[01]={"-1+0","-1-1","+1+1","-1+1"}, [01]={'-1+0','-1-1','+1+1','-1+1'},
[10]={"-1+0","+1+0","-1-1","+1+1"}, [10]={'-1+0','+1+0','-1-1','+1+1'},
[03]={"+1+0","+1-1","-1+1","+1+1"}, [03]={'+1+0','+1-1','-1+1','+1+1'},
[30]={"+1+0","-1+0","+1-1","-1+1"}, [30]={'+1+0','-1+0','+1-1','-1+1'},
},--I3 },--I3
{ {
[01]={"-1+0","+1+0"}, [01]={'-1+0','+1+0'},
[10]={"+1+0","-1+0"}, [10]={'+1+0','-1+0'},
[03]={"+0+1","+0-1"}, [03]={'+0+1','+0-1'},
[30]={"+0-1","+0+1"}, [30]={'+0-1','+0+1'},
[12]={"+0+1","+0-1"}, [12]={'+0+1','+0-1'},
[21]={"+0-1","+0+1"}, [21]={'+0-1','+0+1'},
[32]={"-1+0","+1+0"}, [32]={'-1+0','+1+0'},
[23]={"+1+0","-1+0"}, [23]={'+1+0','-1+0'},
[02]={"+0-1","+1-1","-1-1"}, [02]={'+0-1','+1-1','-1-1'},
[20]={"+0+1","-1+1","+1+1"}, [20]={'+0+1','-1+1','+1+1'},
[13]={"+0-1","-1-1","+1-1"}, [13]={'+0-1','-1-1','+1-1'},
[31]={"+0+1","+1+1","-1+1"}, [31]={'+0+1','+1+1','-1+1'},
},--C },--C
{ {
[01]={"-1+0","+0+1"}, [01]={'-1+0','+0+1'},
[10]={"+1+0","+0+1"}, [10]={'+1+0','+0+1'},
[03]={"+1+0","+0+1"}, [03]={'+1+0','+0+1'},
[30]={"-1+0","+0+1"}, [30]={'-1+0','+0+1'},
[12]={"+1+0","+0+2"}, [12]={'+1+0','+0+2'},
[21]={"+0-1","-1+0"}, [21]={'+0-1','-1+0'},
[32]={"-1+0","+0+2"}, [32]={'-1+0','+0+2'},
[23]={"+0-1","-1+0"}, [23]={'+0-1','-1+0'},
[02]={"+0-1","+0+1"}, [02]={'+0-1','+0+1'},
[20]={"+0+1","+0-1"}, [20]={'+0+1','+0-1'},
[13]={"-1+0","+1+0"}, [13]={'-1+0','+1+0'},
[31]={"+1+0","-1+0"}, [31]={'+1+0','-1+0'},
},--I2 },--I2
nil,--O1 nil,--O1
} }
@@ -405,14 +405,14 @@ local SRS
do do
SRS={ SRS={
{ {
[01]={"-1+0","-1+1","+0-2","-1-2"}, [01]={'-1+0','-1+1','+0-2','-1-2'},
[10]={"+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"}, [03]={'+1+0','+1+1','+0-2','+1-2'},
[30]={"-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"}, [12]={'+1+0','+1-1','+0+2','+1+2'},
[21]={"-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"}, [32]={'-1+0','-1-1','+0+2','-1+2'},
[23]={"+1+0","+1+1","+0-2","+1-2"}, [23]={'+1+0','+1+1','+0-2','+1-2'},
[02]={},[20]={},[13]={},[31]={}, [02]={},[20]={},[13]={},[31]={},
},--Z },--Z
false,--S false,--S
@@ -421,14 +421,14 @@ do
false,--T false,--T
noKickSet,--O noKickSet,--O
{ {
[01]={"-2+0","+1+0","-2-1","+1+2"}, [01]={'-2+0','+1+0','-2-1','+1+2'},
[10]={"+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"}, [12]={'-1+0','+2+0','-1+2','+2-1'},
[21]={"+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"}, [23]={'+2+0','-1+0','+2+1','-1-2'},
[32]={"-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"}, [30]={'+1+0','-2+0','+1-2','-2+1'},
[03]={"-1+0","+2+0","-1+2","+2-1"}, [03]={'-1+0','+2+0','-1+2','+2-1'},
[02]={},[20]={},[13]={},[31]={}, [02]={},[20]={},[13]={},[31]={},
}--I }--I
} }
@@ -441,7 +441,7 @@ end
local C2 local C2
do do
local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"} local L={'+0+0','-1+0','+1+0','+0-1','-1-1','+1-1','-2+0','+2+0'}
vecStrConv(L) vecStrConv(L)
C2={ C2={
{ {
@@ -455,8 +455,8 @@ end
local C2sym local C2sym
do do
local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"} 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 R={'+0+0','+1+0','-1+0','+0-1','+1-1','-1-1','+2+0','-2+0'}
local Z={ local Z={
[01]=R,[10]=L,[03]=L,[30]=R, [01]=R,[10]=L,[03]=L,[30]=R,

View File

@@ -6,6 +6,12 @@ return{
"help", "help",
"This translation of the TetroDictionary is provided by me, User670 (Discord: User670#9501).\n\nThe translation may not completely reflect the contents of the original Chinese text." "This translation of the TetroDictionary is provided by me, User670 (Discord: User670#9501).\n\nThe translation may not completely reflect the contents of the original Chinese text."
}, },
{"Official website",
"official website homepage",
"help",
"Official website of Techmino!\nYou can modify your profile on it",
"http://home.techmino.org",
},
{"To New Players", {"To New Players",
"guide newbie noob", "guide newbie noob",
"help", "help",
@@ -36,11 +42,6 @@ return{
"Chinese: 灰机wiki\nA Chinese Tetris wiki, written by Tetris fans from the Tetris Research community.\nCurrently, most of its pages are translated from Hard Drop Wiki and Tetris Wiki.\n(Link is in Chinese.)", "Chinese: 灰机wiki\nA Chinese Tetris wiki, written by Tetris fans from the Tetris Research community.\nCurrently, most of its pages are translated from Hard Drop Wiki and Tetris Wiki.\n(Link is in Chinese.)",
"https://tetris.huijiwiki.com", "https://tetris.huijiwiki.com",
}, },
{"Applets",
"applets",
"help",
"[Entrance of applets has been moved to console]",
},
--Games --Games
{"TTT", {"TTT",
@@ -95,7 +96,7 @@ return{
{"Nuketris", {"Nuketris",
"nuketris", "nuketris",
"game", "game",
"[NEED TRANSLATION]",--TODO "*Web-based | Single player and multiplayer*\nA block stacker game with 1-vs-1 ranked mode and a few single player modes. A PC is recommended for playing this game.",
"https://nuketris.herokuapp.com", "https://nuketris.herokuapp.com",
}, },
{"WWC", {"WWC",
@@ -184,7 +185,8 @@ return{
{"Falling lightblock", {"Falling lightblock",
"fl fallinglightblock", "fl fallinglightblock",
"game", "game",
"[NEED TRANSLATION]",--TODO "*Android, iOS, Web | Single player and multiplayer*\nA game that supports many platforms. Has delays that cannot be adjusted. Can, to some extent, customize controls on mobile. Most of the modes are similar to classic Tetris, but modern-ish modes also exist. Battles are half-turn-based-half-real-time, and garbage cannot be buffered or cancelled.",
"https://golfgl.de/lightblocks/",
}, },
{"Huopin Tetris", {"Huopin Tetris",
"huopin qq", "huopin qq",
@@ -231,7 +233,12 @@ return{
{"SPM", {"SPM",
"spm linessentperminute", "spm linessentperminute",
"term", "term",
"[lines] Sent per minute\n\tReflects *actual* offensive power of a player. (Seems like this does not count lines used for cancelling garbage in buffer.)", "[lines] Sent per minute\n\tReflects *actual* offensive power of a player. (does not count lines used for cancelling garbage in buffer.)",
},
{"RPM",
"rpm receive jieshou",
"term",
"[lines] Receive per Minute\n\tReflects pressure applied to a player.",
}, },
{"DPM", {"DPM",
"dpm digperminute defendperminute", "dpm digperminute defendperminute",
@@ -348,7 +355,7 @@ return{
{"NRS", {"NRS",
"nrs nintendorotationsystem", "nrs nintendorotationsystem",
"term", "term",
"Nintendo Rotation System\nThe rotation system used in the Tetris games on NES and Gameboy.\nIt has two mirrored versions; the left-handed version is used on Gameboy, and the right-handed version on the NES.", "Nintendo Rotation System\nThe rotation system used in the Tetris games on the NES and Gameboy.\nIt has two mirrored versions; the left-handed version is used on Gameboy, and the right-handed version on the NES.",
}, },
{"ARS", {"ARS",
"ars arikrotationsystem atarirotationsystem", "ars arikrotationsystem atarirotationsystem",
@@ -363,7 +370,7 @@ return{
{"TRS", {"TRS",
"trs techminorotationsystem", "trs techminorotationsystem",
"term", "term",
"*Techmino-exclusive*\nTechmino Rotation System\nThe rotation system used in Techmino.\nIt is based on SRS, with fixes on common cases where S/Z are locked from rotating, and some extra useful kicks. Each pentomino also has a kick table roughly based on SRS logic.", "*Techmino-exclusive*\nTechmino Rotation System\nThe rotation system used in Techmino, based on SRS.\nIt includes fixes on common cases where S/Z are locked from rotating, and some extra useful kicks. Each pentomino also has a kick table roughly based on SRS logic.",
}, },
{"Back to Back", {"Back to Back",
@@ -381,11 +388,10 @@ return{
"term", "term",
"Special T-Spin techniques that exploit the T piece's kicks and T-Spin detections.\nThey might worth different values in different games (some games consider them Minis), and hardly have real value in combat due to their relatively complex setup.", "Special T-Spin techniques that exploit the T piece's kicks and T-Spin detections.\nThey might worth different values in different games (some games consider them Minis), and hardly have real value in combat due to their relatively complex setup.",
}, },
{"Modern Tetris",
{"Modern Stack-game",
"modern", "modern",
"term", "term",
"", "The concept of a \"modern\" Tetris game or block-stacking game is a bit fuzzy. In general, a block-stacking game that somewhat resembles games that follow the Tetris Design Guideline is considered a modern game. Here are some rules of thumb, but they are not hard requirements:\n1. The visible part of the Matrix is 10w x 20h, often with additional hidden rows above this.\n2. Pieces spawn in the top-middle of the visible matrix. Each piece has a consistent spawn orientation and color.\n3. Has an appropriate randomizer like 7-Bag and His.\n4. Has an appropriate rotation system, with at least the ability to rotate both directions.\n5. Has an appropriate lockdown delay system.\n6. Has an appropriate top-out condition.\n7. Has a NEXT queue, with multiple next pieces displayed (usually 3 to 6), and with presentation in the queue matching the spawn orientation of the piece.\n8. Has a HOLD queue.\n9. If there is spawn delay or line delay, usually has IRS and IHS.\n10. Has a DAS system for precise and swift sideways movements.",
}, },
{"IRS", {"IRS",
"irs initialrotationsystem", "irs initialrotationsystem",
@@ -442,6 +448,11 @@ return{
"term", "term",
"Known in Japan as REN.\nConsecutive line clears make up combos. The second line clear in the combo is 1 combo, and the third line clear is 2 combo, and so on.\nUnlike Back to Back, placing a piece that does not clear a line will break the combo.", "Known in Japan as REN.\nConsecutive line clears make up combos. The second line clear in the combo is 1 combo, and the third line clear is 2 combo, and so on.\nUnlike Back to Back, placing a piece that does not clear a line will break the combo.",
}, },
{"Spike",
"spike",
"term",
"Send a lot of attack in a short time.\n\nTechmino and Tetr.io has a spike counter, which shows how much attack you send in a short time.\n\nNote that accumulated garbage due to network lag do not count as a spike.",
},
{"Side well", {"Side well",
"sidewell", "sidewell",
"term", "term",
@@ -487,6 +498,11 @@ return{
"term", "term",
"The stacking method where you leave a 4-block-wide well in the middle.\nThe infamous combo setup that not only makes a lot of combos, but also abuses the death conditions and won't die even if you receive some garbage. This technique is often disliked by players due to how unbalanced it is.", "The stacking method where you leave a 4-block-wide well in the middle.\nThe infamous combo setup that not only makes a lot of combos, but also abuses the death conditions and won't die even if you receive some garbage. This technique is often disliked by players due to how unbalanced it is.",
}, },
{"Residual",
"residual c4w s4w",
"term",
"Refers to how many blocks to leave in the well of a 4-wide combo setup. The most common are 3-residual and 6-residual.\n3-residual has less variations and is easier to learn, with pretty good chance of success, and it's pretty useful in combat.\n6-residual has more variables and is harder, but can be more consistent if you do it well. It can also be used for special challenges like getting 100 combos in an infinite 4-wide challenge.",
},
{"6-3 Stacking", {"6-3 Stacking",
"63stacking", "63stacking",
"term", "term",
@@ -500,7 +516,7 @@ return{
{"Topping out", {"Topping out",
"die death topout toppingout", "die death topout toppingout",
"term", "term",
"Modern Tetris games have three different conditions in which the player tops out:\n1. Block out: when a piece spawns overlapping with another block;\n2. Lock out: when a piece locks entirely above the skyline;\n3. Garbage out: when the stack exceeds 40 lines in height (often due to incoming garbage).\nTechmino does not check for locking out, and has a 42 line limit for garbage out.", "Modern Tetris games have three different conditions in which the player tops out:\n1. Block out: when a piece spawns overlapping with another block;\n2. Lock out: when a piece locks entirely above the skyline;\n3. Garbage out: when the stack exceeds 40 lines in height (often due to incoming garbage).\nTechmino does not check for locking out and garbage out.",
}, },
{"Falling speed", {"Falling speed",
"fallingspeed", "fallingspeed",
@@ -554,7 +570,7 @@ return{
{"His generator", {"His generator",
"history hisgenerator", "history hisgenerator",
"term", "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.",--TODO "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.",
}, },
{"Hypertapping", {"Hypertapping",
"hypertapping", "hypertapping",
@@ -801,22 +817,42 @@ return{
{"Console", {"Console",
"console cmd commamd minglinghang kongzhitai", "console cmd commamd minglinghang kongzhitai",
"command", "command",
"Now the way to enter console is in the main menu, clicking a specific area or pressing a speciao key on the keyboard several times", "Techmino has a console which enables debugging/advanced features.\nTo access the console, repeatedly tap the Techmino logo or press C key on the keyboard on the main menu.\n\nCareless actions in the console may result in corrupting or losing save data. Proceed at your own risk.",
},
{"Reset setting",
"reset setting",
"command",
"Go to console and type \"rm conf/setting\" then press enter.\nEffected after restart game\nplay one game to get setting back",
},
{"Reset statistics",
"reset statistic data",
"command",
"Go to console and type \"rm conf/data\" then press enter.\nEffected after restart game\nplay one game to get data back",
}, },
{"Reset unlock", {"Reset unlock",
"reset unlock chongzhi qingkong jiesuo", "reset unlock",
"command", "command",
"Go to console and type \"rm conf/unlock\" then press enter.\nEffected after restart game\nfresh a rank to get data back", "Go to console and type \"rm conf/unlock\" then press enter.\nEffected after restart game\nfresh a rank to get data back",
}, },
{"Reset record", {"Reset records",
"reset chongzhi paihangbang", "reset record",
"command", "command",
"Go to console and type \"rm /s record\" then press enter.\nEffected after restart game\nfresh a record list to get one list back", "Go to console and type \"rm -s record\" then press enter.\nEffected after restart game\nfresh a record list to get one list back",
}, },
{"Reset stat.", {"Reset key",
"reset statistic data chongzhi tongji shuju", "reset virtualkey",
"command", "command",
"Go to console and type \"rm conf/data\" then press enter.\nEffected after restart game\nplay one game to get data back", "Go to console and type \"rm conf/[keyFile]\" then press enter.\nKeyboard: key, Virtualkey: virtualkey, Virtualkey save: vkSave1(2)\nFirst two effected after restart game\nEnter setting and back to get one file back",
},
{"Delete replays",
"delete recording",
"command",
"Go to console and type \"rm -s replay\" then press enter.\nEffected immediately",
},
{"Delete cache",
"delete cache",
"command",
"Go to console and type \"rm -s cache\" then press enter.\nEffected immediately",
}, },
--English --English
@@ -925,7 +961,7 @@ return{
{"MrZ", {"MrZ",
"mrz 626", "mrz 626",
"name", "name",
"Tetris Research community member, author of Techmino.\nPersonal bests: Sprint 25.95 seconds, MPH Sprint 57 seconds, #8 on Jstris leaderboards, U rank on TETR.IO, cleared TGM3 (World rule, Shirase gold 1300).", "Tetris Research community member, author of Techmino.\nPersonal bests: Sprint 25.95 seconds, MPH Sprint 57 seconds, #8 on Jstris leaderboards, X rank on TETR.IO, cleared TGM3 (World rule, Shirase gold 1300).",
"https://space.bilibili.com/225238922", "https://space.bilibili.com/225238922",
}, },
@@ -965,9 +1001,9 @@ return{
"https://space.bilibili.com/787096", "https://space.bilibili.com/787096",
}, },
{"gggf", {"gggf",
"gggf kissne", "xiaoqi kissne gggf",
"name", "name",
"Tetris Research community member.\nPersonal bests: Sprint 22.831 seconds (25.483 seconds on mobile), MPH Sprint 56 seconds, X rank on Tetr.io\nOne of the top players of 20G in China, achieved almost every achievement in TGM3.", "Tetris Research community member.\nPersonal bests: Sprint 22.677 seconds (25.483 seconds on mobile), MPH Sprint 56 seconds, X rank on Tetr.io\nOne of the top players of 20G in China, achieved almost every achievement in TGM3.",
"https://space.bilibili.com/287769888", "https://space.bilibili.com/287769888",
}, },
{"蕴空之灵", {"蕴空之灵",

View File

@@ -7,6 +7,12 @@ return{
"致想深入玩下去的新人:\n\t两大根本原则:\n\t\t1.选手感好的版本(Techmino/Tetr.io/Jstris/TOP/Tetr.js),别用编程练习渣版本\n\t\t2.踏实打好基础(预判next稳定消四等)别总想着炫酷T旋对未来发展没好处\n\t两大主要技巧:\n\t\t1.熟悉初始位置以及到各个位置的初始操作\n\t\t2.提前计算好下一块能放哪\n(推荐阅读专栏)一位块圈dalao给新人的话\n\n[点击右下角按钮打开链接]", "致想深入玩下去的新人:\n\t两大根本原则:\n\t\t1.选手感好的版本(Techmino/Tetr.io/Jstris/TOP/Tetr.js),别用编程练习渣版本\n\t\t2.踏实打好基础(预判next稳定消四等)别总想着炫酷T旋对未来发展没好处\n\t两大主要技巧:\n\t\t1.熟悉初始位置以及到各个位置的初始操作\n\t\t2.提前计算好下一块能放哪\n(推荐阅读专栏)一位块圈dalao给新人的话\n\n[点击右下角按钮打开链接]",
"https://bilibili.com/read/cv2352939", "https://bilibili.com/read/cv2352939",
}, },
{"游戏官网",
"official website homepage guanwang",
"help",
"Techmino的官网!\n可以在上面修改头像和个人信息",
"http://home.techmino.org",
},
{"Tetris Wiki", {"Tetris Wiki",
"tetris wiki", "tetris wiki",
"help", "help",
@@ -31,11 +37,6 @@ return{
"俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n目前其大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki", "俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n目前其大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki",
"https://tetris.huijiwiki.com", "https://tetris.huijiwiki.com",
}, },
{"小程序",
"小程序 applets",
"help",
"[小程序入口已移动至控制台]",
},
--游戏(题库) --游戏(题库)
{"TTT", {"TTT",
@@ -238,6 +239,11 @@ return{
"term", "term",
"Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力\n\n或:防御(抵消+挖掘)每分", "Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力\n\n或:防御(抵消+挖掘)每分",
}, },
{"RPM",
"rpm receive jieshou",
"term",
"Receive per Minute\n接收每分,即玩家每分钟收到来自对手的垃圾行数。\n一定程度体现玩家被对手施加的压力",
},
{"ADPM", {"ADPM",
"adpm attack defend vs", "adpm attack defend vs",
"term", "term",
@@ -368,7 +374,7 @@ return{
"Techmino Rotation System\nTechmino独有的旋转系统基于SRS设计修补了一些常见SZ卡死的地形增加了不少实用踢墙每个五连块也基本按照SRS的spin逻辑单独设计了踢墙表。", "Techmino Rotation System\nTechmino独有的旋转系统基于SRS设计修补了一些常见SZ卡死的地形增加了不少实用踢墙每个五连块也基本按照SRS的spin逻辑单独设计了踢墙表。",
}, },
--术语(游戏内名词) --术语(其他)
{"B2B", {"B2B",
"大满贯 b2b btb backtoback", "大满贯 b2b btb backtoback",
"term", "term",
@@ -384,8 +390,6 @@ return{
"term", "term",
"一种特殊T2的名字不同的游戏内的攻击可能不一样没有特殊价值可以不详细了解。", "一种特殊T2的名字不同的游戏内的攻击可能不一样没有特殊价值可以不详细了解。",
}, },
--术语(其他)
{"现代方块", {"现代方块",
"现代方块 modern xiandaikuai", "现代方块 modern xiandaikuai",
"term", "term",
@@ -446,6 +450,11 @@ return{
"term", "term",
"从第二次消除起叫1ren/combo打出的攻击根据游戏设计的不同也不同", "从第二次消除起叫1ren/combo打出的攻击根据游戏设计的不同也不同",
}, },
{"Spike",
"spike baofa xingbao",
"term",
"爆发攻击\n指短时间内打出大量的攻击本游戏和TETR.IO中有spike计数器可以看到自己短时间内打出了多少攻击。\n注意网络卡顿导致的累计攻击瞬间释放不算spike。",
},
{"Side", {"Side",
"连击 ·side", "连击 ·side",
"term", "term",
@@ -509,7 +518,7 @@ return{
{"死亡判定", {"死亡判定",
"死亡判定 die death siwang", "死亡判定 die death siwang",
"term", "term",
"现代方块普遍使用的死亡判定:\n1.新出现的方块和场地方块有重叠(窒息)(c4w比s4w强的原因因为被打进18行都不会窒息)\n2.方块锁定时完全在场地的外面\n3.所有东西的总高度超出40。\n\n注:本游戏使用的死亡判定不包含上述的第二条并且第三条的40改成42", "现代方块普遍使用的死亡判定:\n1.新出现的方块和场地方块有重叠(窒息)(c4w比s4w强的原因因为被打进18行都不会窒息)\n2.方块锁定时完全在场地的外面\n3.所有东西的总高度超出40。\n\n注:本游戏使用的死亡判定不包含上述的第二条和第三条",
}, },
{"下落速度", {"下落速度",
"下落速度 drop speed", "下落速度 drop speed",
@@ -810,22 +819,42 @@ return{
{"控制台", {"控制台",
"console cmd commamd minglinghang kongzhitai", "console cmd commamd minglinghang kongzhitai",
"command", "command",
"目前进入控制台的方式是在主菜单点特定位置/按键盘某个键数次", "目前进入控制台的方式是在主菜单 点特定位置/按键盘某个键 数次",
}, },
{"重置解锁状态", {"重置设置",
"reset unlock chongzhi qingkong jiesuo", "reset setting chongzhi qingkong shezhi",
"command", "command",
"前往控制台输入\"rm conf/unlock\"并回车\n需要重启游戏生效,若反悔,刷新任意一个模式在地图上的状态即可恢复文件", "前往控制台输入\"rm conf/setting\"并回车\n需要重启游戏生效若反悔,进入设置菜单再退出即可恢复文件",
},
{"重置本地排行榜",
"reset chongzhi paihangbang",
"command",
"前往控制台输入\"rm /s record\"并回车\n需要重启游戏生效,若反悔,玩一局并更新模式排行榜即可恢复保存对应模式的单个排行榜文件",
}, },
{"重置统计数据", {"重置统计数据",
"reset statistic data chongzhi tongji shuju", "reset statistic data chongzhi tongji shuju",
"command", "command",
"前往控制台输入\"rm conf/data\"并回车\n需要重启游戏生效,若反悔,玩一局并触发结算即可恢复文件", "前往控制台输入\"rm conf/data\"并回车\n需要重启游戏生效若反悔玩一局并触发结算即可恢复文件",
},
{"重置解锁状态",
"reset unlock chongzhi qingkong jiesuo",
"command",
"前往控制台输入\"rm conf/unlock\"并回车\n需要重启游戏生效,若反悔,刷新任意一个模式在地图上的状态即可恢复文件",
},
{"重置本地排行榜",
"reset chongzhi paihangbang",
"command",
"前往控制台输入\"rm -s record\"并回车\n需要重启游戏生效,若反悔,玩一局并更新模式排行榜即可恢复对应模式的单个排行榜文件",
},
{"删除键位",
"reset virtualkey",
"command",
"前往控制台输入\"rm conf/键位文件\"并回车\n键盘是key虚拟按键是virtualkey虚拟按键预设是vkSave1(2)\n前两者重启生效,若反悔,进入对应的设置菜单再返回即可恢复文件",
},
{"删除录像",
"reset replay luxiang",
"command",
"前往控制台输入\"rm -s replay\"并回车\n立即生效",
},
{"删除缓存",
"reset cache huancun touxiang",
"command",
"前往控制台输入\"rm -s cache\"并回车\n立即生效",
}, },
--英文 --英文
@@ -930,12 +959,12 @@ return{
{"小Z", {"小Z",
"小Z xiaoz zictionary tetrodictionary littlez", "小Z xiaoz zictionary tetrodictionary littlez",
"name", "name",
"这个词典的名字!曾经是群里的答疑机器人,此词典数据库沿用机器人问答库~", "这个词典的名字!曾经是群里的答疑机器人,此词典数据库开始也是沿用机器人问答库~",
}, },
{"MrZ", {"MrZ",
"mrz zjiang ddd 026 t626", "mrz zjiang ddd 026 t626",
"name", "name",
"【研究群】「T026」\n40行25.95秒, MPH40行57秒排世界第8(jstris)tetr.io段位Utop数据约50L60A TGM3(W)shirase金1300通关\n这个游戏的作者!", "【研究群】「T026」\n40行25.95秒, MPH40行57秒排世界第8(jstris)tetr.io段位Xtop数据约50L60A TGM3(W)shirase金1300通关\n这个游戏的作者!",
"https://space.bilibili.com/225238922", "https://space.bilibili.com/225238922",
}, },
@@ -976,9 +1005,9 @@ return{
"https://space.bilibili.com/787096", "https://space.bilibili.com/787096",
}, },
{"gggf", {"gggf",
"gggf kissne t127", "xiaoqi kissne gggf t127",
"name", "name",
"【研究群】「T127」\n40行22.831秒(手机25.483)MPH40行56秒tetr.io段位X数据约60L95A\n20G规则国内一流玩家拿到了TGM3几乎全部的最终成就(全世界都没几个)\n其他名称:小柒 kissne 127\n还是车车人,几个正作成绩:永EX NM 1B FS 风L NM", "【研究群】「T127」\n40行22.677秒(手机25.483)MPH40行56秒tetr.io段位X数据约60L95A\n20G规则国内一流玩家拿到了TGM3几乎全部的最终成就(全世界都没几个)\n其他名称:小柒 kissne 127\n还是车车人,几个正作成绩:永EX NM 1B FS 风L NM",
"https://space.bilibili.com/287769888", "https://space.bilibili.com/287769888",
}, },
{"蕴空之灵", {"蕴空之灵",

View File

@@ -1,22 +1,20 @@
local C=COLOR local C=COLOR
return{ return{
back="Back",
anykey="Press a key!", anykey="Press a key!",
sureQuit="Press again to exit", sureQuit="Press again to exit",
newVersion="Thanks for updating! Changelog:",
httpTimeout="Connection error: Timed out", httpTimeout="Connection error: Timed out",
newDay="A new day, a new beginning!", newDay="A new day, a new beginning!",
playedLong="You have been playing for a long time. Make sure to rest well!", playedLong="You have been playing for a long time. Make sure to rest well!",
playedTooMuch="You have been playing too long! Playing a block game is fun, but it's time to take a break.", playedTooMuch="You have been playing for too long! Playing a block game is fun, but it's time to take a break.",
atkModeName={"Random","Badges","K.O.s","Attackers"}, atkModeName={"Random","Badges","K.O.s","Attackers"},
royale_remain="$1 Player(s) Remaining", royale_remain="$1 Player(s) Remaining",
powerUp={[0]="+000%","+025%","+050%","+075%","+100%"},
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!!","15 Combo!!","16 Combo!!","17 Combo!!!","18 Combo!!!","19 Combo!!!","MEGACMB"}, cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!!","15 Combo!!","16 Combo!!","17 Combo!!!","18 Combo!!!","19 Combo!!!","MEGACMB"},
spin="-Spin ", spin="-Spin ",
clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash"}, clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash"},
mini="Mini",b2b="B2B ",b3b="B2B2B ", mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Hemi-Perfect Clear", PC="Perfect Clear",HPC="Hemi-Perfect Clear",
hold="HOLD",next="NEXT",
replaying="[Replay]", replaying="[Replay]",
stage="Stage $1", stage="Stage $1",
@@ -39,7 +37,7 @@ return{
win="Win", win="Win",
lose="Lose", lose="Lose",
finish="Finish", finish="Finish",
gamewin="You Win!", gamewin="You Win",
gameover="Game Over", gameover="Game Over",
pause="Pause", pause="Pause",
pauseCount="Pauses", pauseCount="Pauses",
@@ -62,6 +60,8 @@ return{
exportSuccess="Exported successfully", exportSuccess="Exported successfully",
importSuccess="Imported successfully", importSuccess="Imported successfully",
dataCorrupted="Data corrupted", dataCorrupted="Data corrupted",
pasteWrongPlace="Paste at wrong place?",
noFile="File not found",
VKTchW="Touch Weight", VKTchW="Touch Weight",
VKOrgW="Origin Weight", VKOrgW="Origin Weight",
@@ -72,10 +72,9 @@ return{
newRecord="New Record!", newRecord="New Record!",
getNoticeFail="Failed fetching announcements...", getNoticeFail="Failed fetching announcements...",
getVersionFail="Update detection failed",
oldVersion="Version $1 is now available!", oldVersion="Version $1 is now available!",
needUpdate="Newer version required!", needUpdate="Newer version required!",
noInternet="Not connected to the network", versionNotMatch="Version do not match!",
notFinished="Coming soon!", notFinished="Coming soon!",
jsonError="JSON error", jsonError="JSON error",
@@ -90,20 +89,23 @@ return{
loginFailed="Failed to log in.", loginFailed="Failed to log in.",
accessSuccessed="Access Granted.", accessSuccessed="Access Granted.",
accessFailed="Access Denied.", accessFailed="Access Denied.",
wsSuccessed="WebSocket: Connected.",
wsConnecting="Websocket: Connecting",
wsFailed="WebSocket: Connection Failed.", wsFailed="WebSocket: Connection Failed.",
wsClose="WebSocket Closed: ", wsClose="WebSocket Closed: ",
netTimeout="Network connection timeout", netTimeout="Network connection timeout",
createRoomTooFast="You are creating a room too fast!", onlinePlayerCount="Online",
createRoomSuccessed="Room successfully created!", createRoomSuccessed="Room successfully created!",
started="Playing", started="Playing",
joinRoom="has joined the room.", joinRoom="has joined the room.",
leaveRoom="has left the room.", leaveRoom="has left the room.",
ready="READY", ready="Ready",
set="SET", connStream="Connecting",
champion="$1 won", waitStream="Waiting",
chatRemain="Online: ", spectating="Spectating",
chatRemain="Online",
chatStart="------Beginning of log------", chatStart="------Beginning of log------",
chatHistory="------New messages below------", chatHistory="------New messages below------",
@@ -112,7 +114,7 @@ return{
errorMsg="Techmino ran into a problem and needs to restart.\nYou can send the error log to the devs.", errorMsg="Techmino ran into a problem and needs to restart.\nYou can send the error log to the devs.",
modInstruction="Choose your modifiers!\nMods allow you to change the game\n(and possibly break it in weird ways).\nBeware! Some mods unrank your game.", modInstruction="Choose your modifiers!\nMods allow you to change the game.\nThey may also break it in weird ways.\nBeware, some mods will cause your game to be unranked!",
modInfo={ modInfo={
next="NEXT\nOverrides the number of Next pieces.", next="NEXT\nOverrides the number of Next pieces.",
hold="HOLD\nOverrides the number of Hold pieces.", hold="HOLD\nOverrides the number of Hold pieces.",
@@ -150,14 +152,7 @@ return{
"Finesse:", "Finesse:",
}, },
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={ radarData={"D'PM","ADPM","APM","SPM","L'PM","DPM"},
"D'PM",
"ADPM",
"APM",
"SPM",
"L'PM",
"DPM",
},
stat={ stat={
"Times Launched:", "Times Launched:",
"Play Count:", "Play Count:",
@@ -171,11 +166,11 @@ return{
"PC/HPC:", "PC/HPC:",
"FnsErrs./FnsRate:", "FnsErrs./FnsRate:",
}, },
help={ aboutTexts={
"This is just an *ordinary* block stacker. Really. That's it.", "This is just an *ordinary* block stacker. Really, that's it.",
"It has inspirations from TO/C2/KOS/TGM3 etc.", "It has inspirations from C2/IO/JS/WWC/KOS etc.",
"", "",
"Powered by LÖVE/love2d", "Powered by LÖVE",
"Any suggestions or bug reports are appreciated!", "Any suggestions or bug reports are appreciated!",
"Make sure to get the game only from official sources,", "Make sure to get the game only from official sources,",
"as we can't make sure you're safe if you got it elsewhere.", "as we can't make sure you're safe if you got it elsewhere.",
@@ -184,11 +179,11 @@ return{
}, },
staff={ staff={
"Author: MrZ E-mail: 1046101471@qq.com", "Author: MrZ E-mail: 1046101471@qq.com",
"Powered by LOVE2D", "Powered by LÖVE",
"", "",
"Program: MrZ, Particle_G, [FinnTenzor]", "Program: MrZ, Particle_G, [FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]", "Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Music: MrZ, ERM, [T0722]", "Music: MrZ, ERM, [T0722, Aether]",
"Voice & Sound: Miya, Naki, MrZ", "Voice & Sound: Miya, Naki, MrZ",
"Performance: 模电, HBM", "Performance: 模电, HBM",
"Translations: User670, MattMayuga, Mizu, Mr.Faq, ScF", "Translations: User670, MattMayuga, Mizu, Mr.Faq, ScF",
@@ -200,8 +195,8 @@ return{
used=[[ used=[[
Tools used: Tools used:
Beepbox Beepbox
GFIE
Goldwave Goldwave
GFIE
FL Mobile FL Mobile
Libs used: Libs used:
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
@@ -209,7 +204,7 @@ return{
profile.lua [itraykov] profile.lua [itraykov]
simple-love-lights [dylhunn] simple-love-lights [dylhunn]
]], ]],
support="Support author", support="Support the author",
group="Join our Discord: discord.gg/f9pUvkh", group="Join our Discord: discord.gg/f9pUvkh",
WidgetText={ WidgetText={
main={ main={
@@ -220,7 +215,6 @@ return{
setting="Settings", setting="Settings",
stat="Statistics", stat="Statistics",
music="Music & SE", music="Music & SE",
about="About",
dict="Zictionary", dict="Zictionary",
manual="Manual", manual="Manual",
}, },
@@ -246,26 +240,64 @@ return{
quit="Quit (Q)", quit="Quit (Q)",
}, },
net_menu={ net_menu={
league="Tech League",
ffa="FFA", ffa="FFA",
rooms="Rooms", rooms="Rooms",
chat="Chat",
logout="Log out", logout="Log out",
}, },
net_league={
match="Find Match",
},
net_rooms={ net_rooms={
refreshing="Refreshing rooms", refreshing="Refreshing rooms",
noRoom="There aren't any rooms right now...", noRoom="There aren't any rooms right now...",
refresh="Refresh", refresh="Refresh",
new="New Room(2)", new="New Room",
new2="New Room(5)",
join="Join", join="Join",
}, },
net_newRoom={
title="Custom room config",
roomName="Room name(default to username's room)",
roomDescription="Room description",
life="Lives",
pushSpeed="Push Speed",
garbageSpeed="Garbage Speed",
visible="Visibility",
freshLimit="Lock Reset Limit",
fieldH="Field Height",
bufferLimit="Buffer Limit",
heightLimit="Height Limit",
drop="Drop Delay",
lock="Lock Delay",
wait="Entry Delay",
fall="Line Delay",
capacity="Capacity",
create="Create",
ospin="O-spin",
fineKill="100% Finesse",
b2bKill="No B2B break",
easyFresh="Normal Lock Reset",
deepDrop="Deep Drop",
bone="Bone Blocks",
nextCount="Next",
holdCount="Hold",
infHold="Infinite Hold",
phyHold="In-place Hold",
bg="Background",
bgm="Music",
},
net_game={ net_game={
ready="Ready", ready="Ready",
spectate="Spectate",
cancel="Cancel", cancel="Cancel",
}, },
net_chat={
send="Send",
},
setting_game={ setting_game={
title="Game Settings", title="Game Settings",
graphic="←Video", graphic="←Video",
@@ -280,7 +312,6 @@ return{
autoPause="Pause while unfocused", autoPause="Pause while unfocused",
swap="Key Combination (Change Atk. Mode)", swap="Key Combination (Change Atk. Mode)",
fine="Finesse Error SFX", fine="Finesse Error SFX",
dataSaving="Data saving",
simpMode="Simplistic Style", simpMode="Simplistic Style",
}, },
setting_video={ setting_video={
@@ -289,14 +320,14 @@ return{
game="Game→", game="Game→",
block="Draw Block", block="Draw Block",
ghost="Ghost",
center="Center",
smooth="Smooth Falling", smooth="Smooth Falling",
grid="Grid",
upEdge="3D Block", upEdge="3D Block",
bagLine="Bag Separator", bagLine="Bag Separator",
ghost="Ghost",
grid="Grid",
center="Center",
lockFX="Lock FX", lockFX="Lock FX",
dropFX="Drop FX", dropFX="Drop FX",
moveFX="Move FX", moveFX="Move FX",
@@ -304,18 +335,21 @@ return{
splashFX="Splash FX", splashFX="Splash FX",
shakeFX="Field Sway", shakeFX="Field Sway",
atkFX="Atk. FX", atkFX="Atk. FX",
frame="Render Frame Rate", frame="Render Frame Rate(%)",
text="Line Clear Pop-up", text="Line Clear Pop-up",
score="Score Pop-up", score="Score Pop-up",
warn="Danger Alert", bufferWarn="Buffer Alert",
highCam="Screen Scrolling", showSpike="Spike Counter",
nextPos="Next Preview", nextPos="Next Preview",
fullscreen="Full Screen", highCam="Screen Scrolling",
power="Power Info", warn="Danger Alert",
clickFX="Click FX", clickFX="Click FX",
bg="Background", power="Power Info",
clean="Fast Draw", clean="Fast Draw",
fullscreen="Full Screen",
bg="Background",
}, },
setting_sound={ setting_sound={
title="Sound Settings", title="Sound Settings",
@@ -323,11 +357,11 @@ return{
game="←Game", game="←Game",
graphic="Video→", graphic="Video→",
bgm="BGM",
sfx="SFX", sfx="SFX",
stereo="Stereo",
spawn="Spawn Sounds", spawn="Spawn Sounds",
warn="Warning", warn="Warning",
bgm="BGM",
stereo="Stereo",
vib="Vibration", vib="Vibration",
voc="Voice", voc="Voice",
cv="Voice Pack", cv="Voice Pack",
@@ -376,8 +410,12 @@ return{
setting_touch={ setting_touch={
default="Default", default="Default",
snap="Snap", snap="Snap",
option="Options", save1="Save1",
load1="Load1",
save2="Save2",
load2="Load2",
size="Size", size="Size",
shape="Shape",
}, },
setting_touchSwitch={ setting_touchSwitch={
b1= "Move Left:", b2="Move Right:", b3="Rotate Right:", b4="Rotate Left:", b1= "Move Left:", b2="Move Right:", b3="Rotate Right:", b4="Rotate Left:",
@@ -385,18 +423,17 @@ return{
b9= "Function1:", b10="Function2:", b11="Instant Left:",b12="Instant Right:", b9= "Function1:", b10="Function2:", b11="Instant Left:",b12="Instant Right:",
b13="Sonic Drop:", b14="Down 1:", b15="Down 4:", b16="Down 10:", b13="Sonic Drop:", b14="Down 1:", b15="Down 4:", b16="Down 10:",
b17="Left Drop:", b18="Right Drop:", b19="Left Zangi:", b20="Right Zangi:", b17="Left Drop:", b18="Right Drop:", b19="Left Zangi:", b20="Right Zangi:",
norm="Normal", norm="Normal",
pro="Professional", pro="Professional",
hide="Show Virtual Keys", hide="Show Virtual Keys",
track="Auto Track", icon="Icon",
sfx="SFX", sfx="SFX",
vib="VIB", vib="VIB",
icon="Icon",
tkset="Track Settings",
alpha="Alpha", alpha="Alpha",
},
setting_trackSetting={ track="Auto Track",
VKDodge="Auto Dodge", dodge="Auto Dodge",
}, },
customGame={ customGame={
title="Custom Game", title="Custom Game",
@@ -423,28 +460,28 @@ return{
field="Edit Field (F)", field="Edit Field (F)",
sequence="Edit Sequence (S)", sequence="Edit Sequence (S)",
mission="Edit Mission (M)", mission="Edit Mission (M)",
},
custom_advance={
title="Custom Game",
subTitle="Advance",
nextCount="Next", nextCount="Next",
holdCount="Hold", holdCount="Hold",
infHold="Infinite Hold", infHold="Infinite Hold",
phyHold="In-place Hold", phyHold="In-place Hold",
bone="Bone Blocks",
fieldH="Field Height", fieldH="Field Height",
ospin="O-Spin",
deepDrop="Deep Drop",
visible="Visibility", visible="Visibility",
freshLimit="Lock Reset Limit", freshLimit="Lock Reset Limit",
easyFresh="Normal Lock Reset",
fineKill="100% Finesse",
b2bKill="No B2B break",
opponent="Opponent", opponent="Opponent",
life="Lives", life="Lives",
pushSpeed="Garbage Speed", pushSpeed="Push Speed",
garbageSpeed="Garbage Speed",
bufferLimit="Buffer Limit",
heightLimit="Height Limit",
ospin="O-Spin",
fineKill="100% Finesse",
b2bKill="No B2B break",
easyFresh="Normal Lock Reset",
deepDrop="Deep Drop",
bone="Bone Blocks",
}, },
custom_field={ custom_field={
title="Custom Game", title="Custom Game",
@@ -526,7 +563,7 @@ return{
sound={ sound={
title="SE Room", title="SE Room",
sfx="SFX", sfx="SFX",
voc="VOICE", voc="Voice",
move="Movement", move="Movement",
lock="Lock", lock="Lock",
@@ -552,37 +589,37 @@ return{
_2="Double", _2="Double",
_3="Triple", _3="Triple",
_4="Techrash", _4="Techrash",
z0="Z-spin", z0="Z-Spin",
z1="Z-spin 1", z1="Z-Spin 1",
z2="Z-spin 2", z2="Z-Spin 2",
z3="Z-spin 3", z3="Z-Spin 3",
s0="S-spin", s0="S-Spin",
s1="S-spin 1", s1="S-Spin 1",
s2="S-spin 2", s2="S-Spin 2",
s3="S-spin 3", s3="S-Spin 3",
j0="J-spin", j0="J-Spin",
j1="J-spin 1", j1="J-Spin 1",
j2="J-spin 2", j2="J-Spin 2",
j3="J-spin 3", j3="J-Spin 3",
l0="L-spin", l0="L-Spin",
l1="L-spin 1", l1="L-Spin 1",
l2="L-spin 2", l2="L-Spin 2",
l3="L-spin 3", l3="L-Spin 3",
t0="T-spin", t0="T-Spin",
t1="T-spin 1", t1="T-Spin 1",
t2="T-spin 2", t2="T-Spin 2",
t3="T-spin 3", t3="T-Spin 3",
o0="O-spin", o0="O-Spin",
o1="O-spin 1", o1="O-Spin 1",
o2="O-spin 2", o2="O-Spin 2",
o3="O-spin 3", o3="O-Spin 3",
i0="I-spin", i0="I-Spin",
i1="I-spin 1", i1="I-Spin 1",
i2="I-spin 2", i2="I-Spin 2",
i3="I-spin 3", i3="I-Spin 3",
mini="Mini", mini="Mini",
b2b="B2B", b2b="B2B",
@@ -596,6 +633,7 @@ return{
register="Register", register="Register",
email="E-mail Address", email="E-mail Address",
password="Password", password="Password",
keepPW="Remember me",
login="Log In", login="Log In",
}, },
register={ register={
@@ -636,7 +674,7 @@ return{
app_2048={ app_2048={
reset="Reset", reset="Reset",
blind="Blind", blind="Blind",
tapControl="Tap control", tapControl="Tap controls",
skip="Skip Round", skip="Skip Round",
}, },
@@ -652,15 +690,17 @@ return{
mode="Mode", mode="Mode",
}, },
savedata={ savedata={
exportUnlock="Export Progress", export="Export to clipboard",
exportData="Export Stats", import="Import from clipboard",
exportSetting="Export Settings", unlock="Progress",
exportVK="Export Virtual Key Layout", data="Stats",
setting="Settings",
vk="Virtual Key Layout",
importUnlock="Import Progress", couldSave="Cloud Save (CAUTION: TESTING)",
importData="Import Stats", notLogin="[Login to access cloud save]",
importSetting="Import Settings", upload="Upload to cloud",
importVK="Import Virtual Key Layout", download="Download from cloud",
}, },
error={ error={
console="Console", console="Console",
@@ -682,7 +722,7 @@ return{
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines."}, ['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines."},
['dig_1000l']= {"Dig", "1000L", "Dig 1000 garbage lines."}, ['dig_1000l']= {"Dig", "1000L", "Dig 1000 garbage lines."},
['drought_n']= {"Drought", "100L", "There are no I-pieces."}, ['drought_n']= {"Drought", "100L", "There are no I-pieces."},
['drought_l']= {"Drought", "100L", "W T F"}, ['drought_l']= {"Drought+", "100L", "W T F"},
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with accelerating speed."}, ['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with accelerating speed."},
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon."}, ['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon."},
['solo_e']= {"Battle", "EASY", "Defeat the AI!"}, ['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
@@ -721,20 +761,21 @@ return{
['survivor_h']= {"Survivor", "HARD", "How long can you survive?"}, ['survivor_h']= {"Survivor", "HARD", "How long can you survive?"},
['survivor_l']= {"Survivor", "LUNATIC", "How long can you survive?"}, ['survivor_l']= {"Survivor", "LUNATIC", "How long can you survive?"},
['survivor_u']= {"Survivor", "ULTIMATE", "How long can you survive?"}, ['survivor_u']= {"Survivor", "ULTIMATE", "How long can you survive?"},
['attacker_h']= {"Attacker", "HARD", "Practice Offense!"}, ['attacker_h']= {"Attacker", "HARD", "Practice your offensive skills!"},
['attacker_u']= {"Attacker", "ULTIMATE", "Practice Offense!"}, ['attacker_u']= {"Attacker", "ULTIMATE", "Practice your offensive skills!"},
['defender_n']= {"Defender", "NORMAL", "Practice Defense!"}, ['defender_n']= {"Defender", "NORMAL", "Practice your defensive skills!"},
['defender_l']= {"Defender", "LUNATIC", "Practice Defense!"}, ['defender_l']= {"Defender", "LUNATIC", "Practice your defensive skills!"},
['dig_h']= {"Driller", "HARD", "Digging practice!"}, ['dig_h']= {"Driller", "HARD", "Digging practice!"},
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"}, ['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
['bigbang']= {"Big Bang", "EASY", "All-spin tutorial!\n[Under construction]"}, ['bigbang']= {"Big Bang", "EASY", "All-spin tutorial!\n[Under construction]"},
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos."}, ['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos."},
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos."}, ['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos."},
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear Practice."}, ['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice."},
['pctrain_l']= {"PC Training", "LUNATIC", "Harder Perfect Clear Practice."}, ['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice."},
['pc_n']= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"}, ['pc_n']= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
['pc_h']= {"PC Challenge", "HARD", "Get PCs within 100 lines!"}, ['pc_h']= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
['pc_l']= {"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"}, ['pc_l']= {"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
['pc_inf']= {"Inf. PC Challenge","", "Get PCs as much as you can"},
['tech_n']= {"Tech", "NORMAL", "Try to keep the\nBack-to-Back chain!"}, ['tech_n']= {"Tech", "NORMAL", "Try to keep the\nBack-to-Back chain!"},
['tech_n_plus']= {"Tech", "NORMAL+", "Spins & PCs only."}, ['tech_n_plus']= {"Tech", "NORMAL+", "Spins & PCs only."},
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"}, ['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
@@ -756,6 +797,7 @@ return{
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggi-dug."}, ['infinite_dig']= {"Infinite: Dig", "", "Dig-diggi-dug."},
['sprintFix']= {"Sprint", "NO LEFT/RIGHT"}, ['sprintFix']= {"Sprint", "NO LEFT/RIGHT"},
['sprintLock']= {"Sprint", "NO ROTATIONS"}, ['sprintLock']= {"Sprint", "NO ROTATIONS"},
['sprintSmooth']= {"Sprint", "NO FRICTION"},
['marathon_bfmax']= {"Marathon", "ULTIMATE"}, ['marathon_bfmax']= {"Marathon", "ULTIMATE"},
['custom_clear']= {"Custom", "NORMAL"}, ['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"}, ['custom_puzzle']= {"Custom", "PUZZLE"},
@@ -774,21 +816,25 @@ return{
"1next 1hold!", "1next 1hold!",
"1next 6hold!", "1next 6hold!",
"20G actually is a brand new game rule.", "20G actually is a brand new game rule.",
"40-line Sprint WR: 15.654s by VinceHD", "40-line Sprint WR: 15.557s by Reset",
"6next 1hold!", "6next 1hold!",
"6next 6hold?!", "6next 6hold?!",
"Achievement system coming soon!",
"ALL SPIN!", "ALL SPIN!",
"Am G F G", "Am G F G",
"B2B2B???", "B2B2B???",
"B2B2B2B does not exist..", "B2B2B2B does not exist..",
"B2B2B2B exists?", "B2B2B2B exists?",
"Back-to-Back Techrash, 10 Combo, PC!", "Back-to-Back Techrash, 10 Combo, PC!",
"Be sure to give it your best shot again today!",
"Bridge clear coming soon!", "Bridge clear coming soon!",
"Can you master this modern yet familiar stacker?",
"Certainly within this heart lies my M@STERPIECE.", "Certainly within this heart lies my M@STERPIECE.",
"Changelogs in English can be found on Discord.", "Changelogs in English can be found on Discord.",
"Color clear coming soon!", "Color clear coming soon!",
"COOL!!", "COOL!!",
"Decreasing DAS and ARR is faster but harder to control.", "Decreasing DAS and ARR is faster but harder to control.",
"Did I just see a Back-to-Back-to-Back?",
"Don't let a small glitch ruin your entire day!", "Don't let a small glitch ruin your entire day!",
"Don't look directly at the bugs!", "Don't look directly at the bugs!",
"Enjoy the Techmino rotation system!", "Enjoy the Techmino rotation system!",
@@ -797,15 +843,14 @@ return{
"Got any suggestions? Post them in our Discord!", "Got any suggestions? Post them in our Discord!",
"Headphones recommended for a better experience.", "Headphones recommended for a better experience.",
"Hello world!", "Hello world!",
"if a==true",
"I3 and L3 are the only two unique triminoes.", "I3 and L3 are the only two unique triminoes.",
"if a==true",
"Increase your frame rate for a better experience.", "Increase your frame rate for a better experience.",
"Initial [insert action] system can save you.", "Initial [insert action] system can save you.",
"Is B2B2B2B possible?", "Is B2B2B2B possible?",
"It's possible to finish 40L without left/right button.", "It's possible to finish 40L without left/right button.",
"It's really loading! Not just a cutscene!", "It's really loading! Not just a cutscene!",
"Join our discord!", "Join our discord!",
"l-=-1",
"Let the bass kick!", "Let the bass kick!",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF", "LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"Lua No.1", "Lua No.1",
@@ -816,12 +861,14 @@ return{
"O-Spin Triple!", "O-Spin Triple!",
"OHHHHHHHHHHHHHH", "OHHHHHHHHHHHHHH",
"Online mode is planned - please be patient.", "Online mode is planned - please be patient.",
"Playing good takes some time!",
"Play single-handedly!", "Play single-handedly!",
"Playing good takes some time!",
"Powered by Love2D", "Powered by Love2D",
"Powered by Un..Love2D",
"pps-0.01", "pps-0.01",
"REGRET!!", "REGRET!!",
"Secret number: 626", "Secret number: 626",
"Server down randomly",
"Some requirements to achieve rank S are intentionally set to be difficult for even the best players.", "Some requirements to achieve rank S are intentionally set to be difficult for even the best players.",
"Soon, you'll be able to play against friends and foes all over the world.", "Soon, you'll be able to play against friends and foes all over the world.",
"Split clear coming soon!", "Split clear coming soon!",
@@ -833,7 +880,8 @@ return{
"There are three hidden modes in the game.", "There are three hidden modes in the game.",
"There is a total of 18 different pentominoes.", "There is a total of 18 different pentominoes.",
"There is a total of 7 different tetrominoes.", "There is a total of 7 different tetrominoes.",
"Try using two rotate buttons. All three is better.", "Try using multiple Hold Queues!",
"Try using two rotation buttons. Using all three of them is better.",
"Warning: Programmer Art", "Warning: Programmer Art",
"What about 20 PCs?", "What about 20 PCs?",
"What about 23 PCs in 100 lines?", "What about 23 PCs in 100 lines?",
@@ -842,7 +890,7 @@ return{
"while(false)", "while(false)",
"You are a Grand Master!", "You are a Grand Master!",
"You can connect a keyboard to your phone or tablet!", "You can connect a keyboard to your phone or tablet!",
"You can control with keyboard only in this menu", "You can navigate the menu with a keyboard, but only in this screen.",
"You can open the save directory from the Stats page.", "You can open the save directory from the Stats page.",
"You can perform a spin with 28 of the 29 minoes in this game; the exception being O1.", "You can perform a spin with 28 of the 29 minoes in this game; the exception being O1.",
"You can set the spawning orientation for each tetromino.", "You can set the spawning orientation for each tetromino.",
@@ -850,11 +898,12 @@ return{
{C.C,"Also try 15puzzle!"}, {C.C,"Also try 15puzzle!"},
{C.C,"Also try Minecraft!"}, {C.C,"Also try Minecraft!"},
{C.C,"Also try Minesweeper!"}, {C.C,"Also try Minesweeper!"},
{C.C,"Also try Orzmic!"},
{C.C,"Also try osu!"}, {C.C,"Also try osu!"},
{C.C,"Also try Phigros!"}, {C.C,"Also try Phigros!"},
{C.C,"Also try Rubic's cube!"}, {C.C,"Also try Rubic's cube!"},
{C.C,"Also try Terraria!"}, {C.C,"Also try Terraria!"},
{C.C,"Also try VVVVVVV!"}, {C.C,"Also try VVVVVV!"},
{C.F,"Also try Cultris II!"}, {C.F,"Also try Cultris II!"},
{C.F,"Also try Jstris"}, {C.F,"Also try Jstris"},
{C.F,"Also try NullpoMino!"}, {C.F,"Also try NullpoMino!"},

View File

@@ -1,9 +1,7 @@
return{ return{
fallback=4, fallback=4,
back="Retour",
anykey="Appuyez sur n'importe quelle touche", anykey="Appuyez sur n'importe quelle touche",
sureQuit="Appuyez à nouveau pour sortir", sureQuit="Appuyez à nouveau pour sortir",
newVersion="Merci d'avoir mis le jeu à jour ! Les nouvelles fonctionnalités sont listées ci-dessous.",
httpTimeout="La connexion au réseau ne s'est pas faite à temps.", httpTimeout="La connexion au réseau ne s'est pas faite à temps.",
newDay="[Anti-addiction] Nouveau jour, nouveau commencement !", newDay="[Anti-addiction] Nouveau jour, nouveau commencement !",
playedLong="[Anti-addiction] Vous avez joué pendant un bon bout de temps aujourd'hui. Faites des pauses.", playedLong="[Anti-addiction] Vous avez joué pendant un bon bout de temps aujourd'hui. Faites des pauses.",
@@ -16,7 +14,6 @@ return{
clear={"Simple","Double","Triple","Techrash","Pentacrash","Hexacrash"}, clear={"Simple","Double","Triple","Techrash","Pentacrash","Hexacrash"},
mini="Mini",b2b="B2B ",b3b="B2B2B ", mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Clear", PC="Perfect Clear",HPC="Clear",
hold="RESERVE",next="SUIVANT",
replaying="[Replay]", replaying="[Replay]",
stage="Etape $1", stage="Etape $1",
@@ -56,13 +53,14 @@ return{
saveError="Sauvegarde échouée : ", saveError="Sauvegarde échouée : ",
loadError="Lecture échouée : ", loadError="Lecture échouée : ",
switchSpawnSFX="Activez les effets sonores d'apparition des pièces pour jouer", switchSpawnSFX="Activez les effets sonores d'apparition des pièces pour jouer",
getRank="Rang : ",
needRestart="Fonctionnera dès la prochaine partie", needRestart="Fonctionnera dès la prochaine partie",
exportSuccess="Exporté avec succès", exportSuccess="Exporté avec succès",
importSuccess="Importé avec succès", importSuccess="Importé avec succès",
dataCorrupted="Données corrompues", dataCorrupted="Données corrompues",
-- pasteWrongPlace="Paste at wrong place?",
-- noFile="File not found",
VKTchW="Poids du toucher", VKTchW="Poids du toucher",
VKOrgW="Poids d'origine", VKOrgW="Poids d'origine",
@@ -73,10 +71,9 @@ return{
newRecord="Nouveau record !", newRecord="Nouveau record !",
getNoticeFail="Echec de l'obtention de la notice", getNoticeFail="Echec de l'obtention de la notice",
getVersionFail="Echec d'obtention de la dernière version",
oldVersion="La version $1 est disponible !", oldVersion="La version $1 est disponible !",
-- versionNotMatch="Version do not match!",
-- needUpdate="Newer version required!", -- needUpdate="Newer version required!",
-- noInternet="Not connected to the network",
-- notFinished="Coming soon!", -- notFinished="Coming soon!",
jsonError="Erreur json", jsonError="Erreur json",
@@ -91,19 +88,22 @@ return{
loginFailed="Erreur de connexion", loginFailed="Erreur de connexion",
accessSuccessed="Autorisé avec succès !", accessSuccessed="Autorisé avec succès !",
accessFailed="Autorisation échouée", accessFailed="Autorisation échouée",
wsSuccessed="WebSocket: connecté",
-- wsConnecting="Websocket: Connecting",
wsFailed="WebSocket: connection échouée", wsFailed="WebSocket: connection échouée",
-- wsClose="WebSocket Closed: ", -- wsClose="WebSocket Closed: ",
-- netTimeout="Network connection timeout", -- netTimeout="Network connection timeout",
createRoomTooFast="Vous avez créé un salon trop rapidement !", -- onlinePlayerCount="Online",
createRoomSuccessed="Salon créé avec succès !", createRoomSuccessed="Salon créé avec succès !",
-- started="Playing", -- started="Playing",
joinRoom="a rejoint le salon.", joinRoom="a rejoint le salon.",
leaveRoom="a quitté le salon.", leaveRoom="a quitté le salon.",
-- ready="READY", -- ready="READY",
-- set="SET", -- connStream="CONNECTING",
champion="$1 a gagné", -- waitStream="WAITING",
-- spectating="Spectating",
chatRemain="En ligne : ", chatRemain="En ligne : ",
chatStart="--------Début des logs--------", chatStart="--------Début des logs--------",
chatHistory="-Nouveaux messages en dessous-", chatHistory="-Nouveaux messages en dessous-",
@@ -128,14 +128,7 @@ return{
"Finesse :", "Finesse :",
}, },
radar={"DEF","OFF","ATQ","ENVOYER","SPD","DIG"}, radar={"DEF","OFF","ATQ","ENVOYER","SPD","DIG"},
radarData={ radarData={"D'PM","ADPM","APM","SPM","L'PM","DPM"},
"D'PM",
"ADPM",
"APM",
"SPM",
"L'PM",
"DPM",
},
stat={ stat={
"Nombre de fois lancé :", "Nombre de fois lancé :",
"Nombre de parties :", "Nombre de parties :",
@@ -149,9 +142,9 @@ return{
"PC/HPC :", "PC/HPC :",
"Errs. Finesse/Finesse :", "Errs. Finesse/Finesse :",
}, },
help={ aboutTexts={
"Ceci est un simple jeu de blocs.", "Ceci est un simple jeu de blocs.",
"On y joue comme sur TO/C2/KOS/TGM3 et autres.", "On y joue comme sur C2/IO/JS/WWC/KOS et autres.",
"", "",
"Vous pouvez envoyer des rapports de bogues ou des suggastions via le groupe de test ou l'email du créateur ~", "Vous pouvez envoyer des rapports de bogues ou des suggastions via le groupe de test ou l'email du créateur ~",
"Ce jeu est gratuit et est uniquement disponible via discord.gg/f9pUvkh", "Ce jeu est gratuit et est uniquement disponible via discord.gg/f9pUvkh",
@@ -165,7 +158,7 @@ return{
"", "",
"Programme : MrZ, Particle_G, [FinnTenzor]", "Programme : MrZ, Particle_G, [FinnTenzor]",
"Art : MrZ, ScF, [Gnyar, 旋律星萤, T0722]", "Art : MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Musique : MrZ, ERM, [T0722]", "Musique : MrZ, ERM, [T0722, Aether]",
"Voix & Sons: Miya, Naki, MrZ Performance: 模电, HBM", "Voix & Sons: Miya, Naki, MrZ Performance: 模电, HBM",
"Performance: 模电, HBM", "Performance: 模电, HBM",
"Traduction: User670, MattMayuga, Mizu, Mr.Faq, ScF", "Traduction: User670, MattMayuga, Mizu, Mr.Faq, ScF",
@@ -177,8 +170,8 @@ return{
used=[[ used=[[
Outils utilisés: Outils utilisés:
Beepbox Beepbox
GFIE
Goldwave Goldwave
GFIE
FL Mobile FL Mobile
Libs utilisées: Libs utilisées:
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
@@ -197,7 +190,6 @@ return{
setting="Paramètres", setting="Paramètres",
stat="Statistiques", stat="Statistiques",
-- music="Music & SE", -- music="Music & SE",
-- about="About",
dict="Zictionary", dict="Zictionary",
manual="Manuel", manual="Manuel",
}, },
@@ -219,24 +211,64 @@ return{
quit="Quitter (Q)", quit="Quitter (Q)",
}, },
net_menu={ net_menu={
-- league="Tech League",
ffa="FFA", ffa="FFA",
rooms="Salons", rooms="Salons",
chat="Chat",
-- logout="Log out", -- logout="Log out",
}, },
net_league={
-- match="Find Match",
},
net_rooms={ net_rooms={
-- refreshing="Refreshing Rooms", -- refreshing="Refreshing Rooms",
noRoom="Aucun salon actuellement", noRoom="Aucun salon actuellement",
-- refresh="Refresh", -- refresh="Refresh",
-- new="New Room",
join="Rejoindre", join="Rejoindre",
}, },
net_newRoom={
-- title="Custom room config",
-- roomName="Room name(default to username's room)",
-- roomDescription="Room description",
life="Vie",
-- pushSpeed="Push Speed",
garbageSpeed="Vitesse des lignes indésirables",
visible="Visibilité",
freshLimit="Limite de réinit. du délai de verrouillage",
-- fieldH="Field height",
-- bufferLimit="Buffer Limit",
-- heightLimit="Height Limit",
drop="Délai de chute",
lock="Délai de verrouillage",
wait="Délai d'apparition",
fall="Délai de ligne",
-- capacity="Capacity",
-- create="Create",
ospin="O-spin",
fineKill="100% Finesse",
b2bKill="Sans perte de B2B",
easyFresh="Réinit. de verrouillage normale",
-- deepDrop="Deep Drop",
bone="Crochets",
nextCount="Prévisualisations de pièces",
holdCount="Réserve",
infHold="Réserver une fois",
-- phyHold="Physical Hold",
bg="Arrière-plan",
bgm="Musique",
},
net_game={ net_game={
-- ready="Ready", -- ready="Ready",
-- spectate="Spectate",
-- cancel="Cancel", -- cancel="Cancel",
}, },
net_chat={
send="Envoyer",
},
setting_game={ setting_game={
title="Paramètres du jeu", title="Paramètres du jeu",
@@ -252,7 +284,6 @@ return{
autoPause="Mettre en pause en cas de perte de focus", autoPause="Mettre en pause en cas de perte de focus",
swap="Combinaison de touches (changer le mode d'attaque)", swap="Combinaison de touches (changer le mode d'attaque)",
fine="Son d'erreur de Finesse", fine="Son d'erreur de Finesse",
-- dataSaving="Data saving",
-- simpMode="Simple mode", -- simpMode="Simple mode",
}, },
setting_video={ setting_video={
@@ -277,18 +308,21 @@ return{
splashFX="Effets splash", splashFX="Effets splash",
shakeFX="Tremblements de l'écran", shakeFX="Tremblements de l'écran",
atkFX="Effets d'attaque", atkFX="Effets d'attaque",
frame="Montrer les FPS", frame="Montrer les FPS(%)",
text="Texte d'action", text="Texte d'action",
score="Pop-up de score", score="Pop-up de score",
warn="Alerte de danger", -- bufferWarn="Buffer Alert",
highCam="Vue d'oiseau", -- showSpike="Spike Counter",
nextPos="Prévisualisation de position", nextPos="Prévisualisation de position",
fullscreen="Plein écran", highCam="Vue d'oiseau",
power="Infos d'alimentation", warn="Alerte de danger",
-- clickFX="Click FX", -- clickFX="Click FX",
bg="Arrière-plan", power="Infos d'alimentation",
-- clean="Fast Draw", -- clean="Fast Draw",
fullscreen="Plein écran",
bg="Arrière-plan",
}, },
setting_sound={ setting_sound={
title="Paramètres du son", title="Paramètres du son",
@@ -296,11 +330,11 @@ return{
game="←Jeu", game="←Jeu",
graphic="Vidéo→", graphic="Vidéo→",
bgm="Musique",
sfx="Sons", sfx="Sons",
stereo="Stéréo",
spawn="Apparition", spawn="Apparition",
warn="Alerte de danger", warn="Alerte de danger",
bgm="Musique",
stereo="Stéréo",
vib="Vibration", vib="Vibration",
voc="Voix", voc="Voix",
}, },
@@ -347,8 +381,12 @@ return{
setting_touch={ setting_touch={
default="Par défaut", default="Par défaut",
snap="Snap", snap="Snap",
option="Options", -- save1="Save1",
-- load1="Load1",
-- save2="Save2",
-- load2="Load2",
size="Taille", size="Taille",
-- shape="Shape",
}, },
setting_touchSwitch={ setting_touchSwitch={
b1= "Déplacement vers la gauche :",b2="Déplacement vers la droite:", b1= "Déplacement vers la gauche :",b2="Déplacement vers la droite:",
@@ -358,18 +396,17 @@ return{
b11="Déplacement instantané vers la gauche :",b12="Déplacement instantané vers la droite :", b11="Déplacement instantané vers la gauche :",b12="Déplacement instantané vers la droite :",
b13="Chute sonique :",b14="Descendre de 1 :",b15="Descendre de 4 :",b16="Descendre de 10:", b13="Chute sonique :",b14="Descendre de 1 :",b15="Descendre de 4 :",b16="Descendre de 10:",
b17="Chute à gauche :",b18="Chute à droite :",b19="Zangi Gauche :",b20="Zangi Droite :", b17="Chute à gauche :",b18="Chute à droite :",b19="Zangi Gauche :",b20="Zangi Droite :",
norm="Normal", norm="Normal",
pro="Professionel", pro="Professionel",
hide="Montrer les touches virtuelles", hide="Montrer les touches virtuelles",
track="Auto Track", icon="Icône",
sfx="Sons", sfx="Sons",
vib="Vib.", vib="Vib.",
icon="Icône",
tkset="Paramètres des tracks",
alpha="Alpha", alpha="Alpha",
},
setting_trackSetting={ track="Auto Track",
VKDodge="Auto-esquive", dodge="Auto-esquive",
}, },
customGame={ customGame={
title="Mode personnalisé", title="Mode personnalisé",
@@ -396,28 +433,28 @@ return{
field="Modifier la matrice (F)", field="Modifier la matrice (F)",
sequence="Modifier la séquence (S)", sequence="Modifier la séquence (S)",
mission="Modifier la mission(M)", mission="Modifier la mission(M)",
},
custom_advance={
title="Mode personnalisé",
subTitle="Avancer",
nextCount="Prévisualisations de pièces", nextCount="Prévisualisations de pièces",
holdCount="Réserve", holdCount="Réserve",
infHold="Réserver une fois", infHold="Réserver une fois",
-- phyHold="Physical Hold", -- phyHold="Physical Hold",
bone="Crochets",
-- fieldH="Field height", -- fieldH="Field height",
ospin="O-spin",
-- deepDrop="Deep Drop",
visible="Visibilité", visible="Visibilité",
freshLimit="Limite de réinit. du délai de verrouillage", freshLimit="Limite de réinit. du délai de verrouillage",
easyFresh="Réinit. de verrouillage normale",
fineKill="100% Finesse",
b2bKill="Sans perte de B2B",
opponent="Adversaire", opponent="Adversaire",
life="Vie", life="Vie",
pushSpeed="Vitesse des lignes indésirables", -- pushSpeed="Push Speed",
garbageSpeed="Vitesse des lignes indésirables",
-- bufferLimit="Buffer Limit",
-- heightLimit="Height Limit",
ospin="O-spin",
fineKill="100% Finesse",
b2bKill="Sans perte de B2B",
easyFresh="Réinit. de verrouillage normale",
-- deepDrop="Deep Drop",
bone="Crochets",
}, },
custom_field={ custom_field={
title="Mode personnalisé", title="Mode personnalisé",
@@ -504,6 +541,7 @@ return{
register="Enregistrement", register="Enregistrement",
email="E-mail", email="E-mail",
password="Mot de passe", password="Mot de passe",
-- keepPW="Remember me",
login="Connexion", login="Connexion",
}, },
register={ register={
@@ -564,15 +602,17 @@ return{
qq="QQ du créateur", qq="QQ du créateur",
}, },
savedata={ savedata={
exportUnlock="Exporter les Unlocks", -- export="Export to clipboard",
exportData="Exporter les Données", -- import="Import from clipboard",
exportSetting="Exporter les Paramètres", -- unlock="Progress",
exportVK="Exporter VK", -- data="Stats",
-- setting="Settings",
-- vk="Virtual Key Layout",
importUnlock="Importer les Unlocks", -- couldSave="Cloud Save (need login) (CAUTION: TESTING)",
importData="Importer les Données", -- notLogin="[Login to access cloud save]",
importSetting="Importer les Paramètres", -- upload="Upload to cloud",
importVK="Importer VK", -- download="Download from cloud",
}, },
error={ error={
console="Console", console="Console",
@@ -594,7 +634,7 @@ return{
['dig_400l']= {"Dig", "400L", "Creusez 400 lines"}, ['dig_400l']= {"Dig", "400L", "Creusez 400 lines"},
['dig_1000l']= {"Dig", "1000L", "Creusez 1000 lines"}, ['dig_1000l']= {"Dig", "1000L", "Creusez 1000 lines"},
['drought_n']= {"Drought", "100L", "Pas de pièce I !"}, ['drought_n']= {"Drought", "100L", "Pas de pièce I !"},
['drought_l']= {"Drought", "100L", "WTF ??!!"}, ['drought_l']= {"Drought+", "100L", "WTF ??!!"},
['marathon_n']= {"Marathon", "NORMAL", "Marathon de 200 lignes."}, ['marathon_n']= {"Marathon", "NORMAL", "Marathon de 200 lignes."},
['marathon_h']= {"Marathon", "DIFFICILE", "Marathon de 200 lignes à très haute vitesse"}, ['marathon_h']= {"Marathon", "DIFFICILE", "Marathon de 200 lignes à très haute vitesse"},
['solo_e']= {"Battle", "FACILE", "Battez l'IA !"}, ['solo_e']= {"Battle", "FACILE", "Battez l'IA !"},
@@ -647,6 +687,7 @@ return{
['pc_n']= {"PC Challenge", "NORMAL", "Obtenez un PC dans les prochaines 100 lignes !"}, ['pc_n']= {"PC Challenge", "NORMAL", "Obtenez un PC dans les prochaines 100 lignes !"},
['pc_h']= {"PC Challenge", "DIFFICILE", "Obtenez un PC dans les prochaines 100 lignes !"}, ['pc_h']= {"PC Challenge", "DIFFICILE", "Obtenez un PC dans les prochaines 100 lignes !"},
['pc_l']= {"PC Challenge", "LUNATIQUE", "Obtenez un PC dans les prochaines 100 lignes !"}, ['pc_l']= {"PC Challenge", "LUNATIQUE", "Obtenez un PC dans les prochaines 100 lignes !"},
-- ['pc_inf']= {"Inf. PC Challenge","", "Get PCs as much as you can"},
['tech_n']= {"Tech", "NORMAL", "Gardez le B2B !"}, ['tech_n']= {"Tech", "NORMAL", "Gardez le B2B !"},
['tech_n_plus']= {"Tech", "NORMAL+", "Spin & PC uniquement"}, ['tech_n_plus']= {"Tech", "NORMAL+", "Spin & PC uniquement"},
['tech_h']= {"Tech", "DIFFICILE", "Gardez le B2B !"}, ['tech_h']= {"Tech", "DIFFICILE", "Gardez le B2B !"},
@@ -668,6 +709,7 @@ return{
['infinite_dig']= {"Infini : Dig", "", "Creuser, creuser, creuser."}, ['infinite_dig']= {"Infini : Dig", "", "Creuser, creuser, creuser."},
['sprintFix']= {"Sprint", "Sans gauche/droite"}, ['sprintFix']= {"Sprint", "Sans gauche/droite"},
['sprintLock']= {"Sprint", "Sans rotation"}, ['sprintLock']= {"Sprint", "Sans rotation"},
-- ['sprintSmooth']= {"Sprint", "NO FRICTION"},
['marathon_bfmax']= {"Marathon", "ULTIME"}, ['marathon_bfmax']= {"Marathon", "ULTIME"},
['custom_clear']= {"Perso.", "NORMAL"}, ['custom_clear']= {"Perso.", "NORMAL"},
['custom_puzzle']= {"Perso.", "PUZZLE"}, ['custom_puzzle']= {"Perso.", "PUZZLE"},

View File

@@ -1,10 +1,8 @@
local C=COLOR local C=COLOR
return{ return{
fallback=4, fallback=4,
back="Voltar",
anykey="Pressione qualquer tecla", anykey="Pressione qualquer tecla",
sureQuit="Aparte novamente para sair", sureQuit="Aparte novamente para sair",
newVersion="Obrigado por atualizar! Veja as mudanças abaixo.",
httpTimeout="Conexão de rede expirou", httpTimeout="Conexão de rede expirou",
newDay="[Anti-vício] Novo dia, um começo novo!", newDay="[Anti-vício] Novo dia, um começo novo!",
playedLong="[Anti-vício] Você andou jogando bastante hoje. Certifique-se de fazer pausas.", playedLong="[Anti-vício] Você andou jogando bastante hoje. Certifique-se de fazer pausas.",
@@ -17,7 +15,6 @@ return{
clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash"}, clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash"},
mini="Mini",b2b="B2B ",b3b="B2B2B ", mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Clear", PC="Perfect Clear",HPC="Clear",
hold="HOLD",next="NEXT",
replaying="[Replay]", replaying="[Replay]",
stage="Fase $1", stage="Fase $1",
@@ -56,13 +53,14 @@ return{
saveError="Falha ao salvar:", saveError="Falha ao salvar:",
loadError="Falha ao ler:", loadError="Falha ao ler:",
switchSpawnSFX="Switch on spawn SFX to play", switchSpawnSFX="Switch on spawn SFX to play",
ranks={"D","C","B","A","S"},
needRestart="Funciona após reiniciar", needRestart="Funciona após reiniciar",
exportSuccess="Exportado com sucesso", exportSuccess="Exportado com sucesso",
importSuccess="Importado com sucesso", importSuccess="Importado com sucesso",
dataCorrupted="Data corrompida", dataCorrupted="Data corrompida",
-- pasteWrongPlace="Paste at wrong place?",
-- noFile="File not found",
VKTchW="Peso de toque", VKTchW="Peso de toque",
VKOrgW="Peso da origem", VKOrgW="Peso da origem",
@@ -73,10 +71,9 @@ return{
newRecord="Novo recorde", newRecord="Novo recorde",
getNoticeFail="Não conseguiu ter anúncios", getNoticeFail="Não conseguiu ter anúncios",
getVersionFail="Falha ao detectar uma versão nova",
oldVersion="Versão $1 esta disponível agora!", oldVersion="Versão $1 esta disponível agora!",
-- versionNotMatch="Version do not match!",
-- needUpdate="Newer version required!", -- needUpdate="Newer version required!",
-- noInternet="Not connected to the network",
-- notFinished="Coming soon!", -- notFinished="Coming soon!",
jsonError="Json error", jsonError="Json error",
@@ -91,20 +88,23 @@ return{
loginFailed="Falha na autenticação", loginFailed="Falha na autenticação",
accessSuccessed="Autorizado com sucesso!", accessSuccessed="Autorizado com sucesso!",
accessFailed="Falha na autorização", accessFailed="Falha na autorização",
wsSuccessed="WebSocket: conectado",
-- wsConnecting="Websocket: Connecting",
wsFailed="WebSocket: falha na conexão", wsFailed="WebSocket: falha na conexão",
wsClose="WebSocket closed: ", wsClose="WebSocket closed: ",
-- netTimeout="Network connection timeout", -- netTimeout="Network connection timeout",
-- createRoomTooFast="Create room too fast!", -- onlinePlayerCount="Online",
-- createRoomSuccessed="Room successfully created!", -- createRoomSuccessed="Room successfully created!",
-- started="Playing", -- started="Playing",
joinRoom="Entrou a sala.", joinRoom="Entrou a sala.",
leaveRoom="Saiu da sala.", leaveRoom="Saiu da sala.",
-- ready="READY", -- ready="READY",
-- set="SET", -- connStream="CONNECTING",
-- champion="$1 won", -- waitStream="WAITING",
chatRemain="Online: ", -- spectating="Spectating",
chatRemain="Online",
chatStart="------Começo do log------", chatStart="------Começo do log------",
chatHistory="------Novas mensagens abaixo------", chatHistory="------Novas mensagens abaixo------",
@@ -151,14 +151,7 @@ return{
"Destreza:", "Destreza:",
}, },
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={ radarData={"D'PM","ADPM","APM","SPM","L'PM","DPM"},
"D'PM",
"ADPM",
"APM",
"SPM",
"L'PM",
"DPM",
},
stat={ stat={
"Vezes iniciadas:", "Vezes iniciadas:",
"Jogos:", "Jogos:",
@@ -172,9 +165,9 @@ return{
"PC/HPC:", "PC/HPC:",
"FalhaDestreza/TaxaDestreza:", "FalhaDestreza/TaxaDestreza:",
}, },
help={ aboutTexts={
"Isso é apenas um jogo de blocos, nada de especial.", "Isso é apenas um jogo de blocos, nada de especial.",
"Joga como TO/C2/KOS/TGM3 e outros.", "Joga como C2/IO/JS/WWC/KOS e outros.",
"", "",
"Feito na Love 2D Engine", "Feito na Love 2D Engine",
"Por favor mande bugs ou sugestões para o autor.", "Por favor mande bugs ou sugestões para o autor.",
@@ -189,7 +182,7 @@ return{
"", "",
"Programa: MrZ, Particle_G, [FinnTenzor]", "Programa: MrZ, Particle_G, [FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]", "Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Music: MrZ, ERM, [T0722]", "Music: MrZ, ERM, [T0722, Aether]",
"Voice & Sound: Miya, Naki, MrZ", "Voice & Sound: Miya, Naki, MrZ",
"Performance: 模电, HBM", "Performance: 模电, HBM",
"Traduzir: User670, MattMayuga, Mizu, Mr.Faq, ScF", "Traduzir: User670, MattMayuga, Mizu, Mr.Faq, ScF",
@@ -201,8 +194,8 @@ return{
used=[[ used=[[
Ferramentas usadas: Ferramentas usadas:
Beepbox Beepbox
GFIE
Goldwave Goldwave
GFIE
FL Mobile FL Mobile
Libs used: Libs used:
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
@@ -221,7 +214,6 @@ return{
setting="Config.", setting="Config.",
stat="Stats", stat="Stats",
-- music="Music & SE", -- music="Music & SE",
-- about="About",
dict="Zictionary", dict="Zictionary",
manual="Manual", manual="Manual",
}, },
@@ -247,26 +239,64 @@ return{
quit="Sair (Q)", quit="Sair (Q)",
}, },
net_menu={ net_menu={
-- league="Tech League",
ffa="FFA", ffa="FFA",
rooms="Salas", rooms="Salas",
chat="Chat",
-- logout="Log out", -- logout="Log out",
}, },
net_league={
-- match="Find Match",
},
net_rooms={ net_rooms={
-- refreshing="Refreshing Rooms", -- refreshing="Refreshing Rooms",
noRoom="Nenhuma sala agora", noRoom="Nenhuma sala agora",
-- refresh="Refresh", -- refresh="Refresh",
-- new="New Room(2)", -- new="New Room",
-- new2="New Room(5)",
-- join="Join", -- join="Join",
}, },
net_newRoom={
-- title="Custom room config",
-- roomName="Room name(default to username's room)",
-- roomDescription="Room description",
life="Vidas",
pushSpeed="Garbage Speed",
-- garbageSpeed="Velocidade De Lixo",
visible="Visibilidade",
freshLimit="Limite Reset de Trava",
-- fieldH="Field height",
-- bufferLimit="Buffer Limit",
-- heightLimit="Height Limit",
drop="Delay Queda",
lock="Delay Trava",
wait="Delay Entrada",
fall="Delay Linha",
-- capacity="Capacity",
-- create="Create",
ospin="O-Spin",
fineKill="100% Finesse",
b2bKill="Sem Quebrar B2B",
easyFresh="Reset De Trava Normal",
-- deepDrop="Deep Drop",
bone="Bone Blocks",
nextCount="Prox.",
holdCount="Segurar",
infHold="Segurar Infinito",
-- phyHold="Physical Hold",
bg="Fundo",
bgm="Música",
},
net_game={ net_game={
-- ready="Ready", -- ready="Ready",
-- spectate="Spectate",
-- cancel="Cancel", -- cancel="Cancel",
}, },
net_chat={
send="Mandar",
},
setting_game={ setting_game={
title="Config. de jogo", title="Config. de jogo",
graphic="←Video", graphic="←Video",
@@ -281,7 +311,6 @@ return{
autoPause="Pausar quando foco for perco", autoPause="Pausar quando foco for perco",
swap="Combinação de tecla(Mudar modo de atk)", swap="Combinação de tecla(Mudar modo de atk)",
fine="Som Falha de destreza", fine="Som Falha de destreza",
-- dataSaving="Data saving",
-- simpMode="Simple mode", -- simpMode="Simple mode",
}, },
setting_video={ setting_video={
@@ -290,14 +319,14 @@ return{
game="Jogo→", game="Jogo→",
block="Mostrar bloco", block="Mostrar bloco",
ghost="Fantasma",
center="Centro",
smooth="Queda suave", smooth="Queda suave",
grid="Rede",
upEdge="3D bloco", upEdge="3D bloco",
bagLine="Linha da bolsa", bagLine="Linha da bolsa",
ghost="Fantasma",
grid="Rede",
center="Centro",
lockFX="Nível FX Trava", lockFX="Nível FX Trava",
dropFX="Nível FX Queda", dropFX="Nível FX Queda",
moveFX="Nível FX Mover", moveFX="Nível FX Mover",
@@ -305,18 +334,21 @@ return{
splashFX="Nível FX Splash", splashFX="Nível FX Splash",
shakeFX="Nível Tremida Tabuleiro", shakeFX="Nível Tremida Tabuleiro",
atkFX="Nível FX Atk.", atkFX="Nível FX Atk.",
frame="Render Frame Rate", frame="Render Frame Rate(%)",
text="Texto de ação", text="Texto de ação",
score="Pop-up de pontos", score="Pop-up de pontos",
warn="Alerta de perigo", -- bufferWarn="Buffer Alert",
highCam="Vista Olho-de-pássaro", -- showSpike="Spike Counter",
nextPos="Próxima Pos.", nextPos="Próxima Pos.",
fullscreen="Tela cheia", highCam="Vista Olho-de-pássaro",
power="Informação bateria", warn="Alerta de perigo",
-- clickFX="Click FX", -- clickFX="Click FX",
bg="Fundo", power="Informação bateria",
-- clean="Fast Draw", -- clean="Fast Draw",
fullscreen="Tela cheia",
bg="Fundo",
}, },
setting_sound={ setting_sound={
title="Config. de sons", title="Config. de sons",
@@ -324,11 +356,11 @@ return{
game="←Jogo", game="←Jogo",
graphic="Vídeo→", graphic="Vídeo→",
bgm="BGM",
sfx="SFX", sfx="SFX",
stereo="Stereo",
spawn="Nascida", spawn="Nascida",
warn="Alerta de perigo", warn="Alerta de perigo",
bgm="BGM",
stereo="Stereo",
vib="Vibração", vib="Vibração",
voc="Voz", voc="Voz",
cv="Pacote de voz", cv="Pacote de voz",
@@ -377,8 +409,12 @@ return{
setting_touch={ setting_touch={
default="Default", default="Default",
snap="Encaixo", snap="Encaixo",
option="Opção", -- save1="Save1",
-- load1="Load1",
-- save2="Save2",
-- load2="Load2",
size="Tamanho", size="Tamanho",
-- shape="Shape",
}, },
setting_touchSwitch={ setting_touchSwitch={
b1= "Esquerda:", b2="Direita:", b3="Giro Dir.:", b4="Giro Esq.:", b1= "Esquerda:", b2="Direita:", b3="Giro Dir.:", b4="Giro Esq.:",
@@ -386,18 +422,17 @@ return{
b9= "Função:", b10="Reiniciar Jogo:", b11="Esq. Imediata:",b12="Dir. Imediata:", b9= "Função:", b10="Reiniciar Jogo:", b11="Esq. Imediata:",b12="Dir. Imediata:",
b13="Queda Sonic:", b14="Queda 1:", b15="Queda 4:", b16="Queda 10:", b13="Queda Sonic:", b14="Queda 1:", b15="Queda 4:", b16="Queda 10:",
b17="Queda Esq.:", b18="Queda Dir.:", b19="Zangi Esq.:", b20="Zangi Dir.:", b17="Queda Esq.:", b18="Queda Dir.:", b19="Zangi Esq.:", b20="Zangi Dir.:",
norm="Normal", norm="Normal",
pro="Professional", pro="Professional",
hide="Mostrar tecla virtual", hide="Mostrar tecla virtual",
track="Localizar Auto", icon="Icone",
sfx="SFX", sfx="SFX",
vib="VIB", vib="VIB",
icon="Icone",
tkset="Config. localizacao",
alpha="Transparência", alpha="Transparência",
},
setting_trackSetting={ track="Localizar Auto",
VKDodge="Auto Dodge", dodge="Auto Dodge",
}, },
customGame={ customGame={
title="Jogo person.", title="Jogo person.",
@@ -424,28 +459,28 @@ return{
field="Editar Tab. (F)", field="Editar Tab. (F)",
sequence="Editar Sequência (S)", sequence="Editar Sequência (S)",
mission="Editar Missão (M)", mission="Editar Missão (M)",
},
custom_advance={
title="Jogo Person.",
subTitle="Avançado",
nextCount="Prox.", nextCount="Prox.",
holdCount="Segurar", holdCount="Segurar",
infHold="Segurar Infinito", infHold="Segurar Infinito",
-- phyHold="Physical Hold", -- phyHold="Physical Hold",
bone="Bone Blocks",
-- fieldH="Field height", -- fieldH="Field height",
ospin="O-Spin",
-- deepDrop="Deep Drop",
visible="Visibilidade", visible="Visibilidade",
freshLimit="Limite Reset de Trava", freshLimit="Limite Reset de Trava",
easyFresh="Reset De Trava Normal",
fineKill="100% Finesse",
b2bKill="Sem Quebrar B2B",
opponent="Oponente", opponent="Oponente",
life="Vidas", life="Vidas",
pushSpeed="Velocidade De Lixo", pushSpeed="Garbage Speed",
-- garbageSpeed="Velocidade De Lixo",
-- bufferLimit="Buffer Limit",
-- heightLimit="Height Limit",
ospin="O-Spin",
fineKill="100% Finesse",
b2bKill="Sem Quebrar B2B",
easyFresh="Reset De Trava Normal",
-- deepDrop="Deep Drop",
bone="Bone Blocks",
}, },
custom_field={ custom_field={
title="Jogo Costumizado", title="Jogo Costumizado",
@@ -594,6 +629,7 @@ return{
register="Registrar", register="Registrar",
email="Endereço De Email", email="Endereço De Email",
password="Senha", password="Senha",
-- keepPW="Remember me",
login="Log in", login="Log in",
}, },
register={ register={
@@ -649,15 +685,17 @@ return{
-- mode="Mode", -- mode="Mode",
}, },
savedata={ savedata={
exportUnlock="Exportar progresso", -- export="Export to clipboard",
exportData="Exportar estatística", -- import="Import from clipboard",
exportSetting="Exportar config.", -- unlock="Progress",
exportVK="Exportar layout de hud", -- data="Stats",
-- setting="Settings",
-- vk="Virtual Key Layout",
importUnlock="Importar progresso", -- couldSave="Cloud Save (need login) (CAUTION: TESTING)",
importData="Importar estatística", -- notLogin="[Login to access cloud save]",
importSetting="Importar config.", -- upload="Upload to cloud",
importVK="Importar layout de hud", -- download="Download from cloud",
}, },
error={ error={
console="Console", console="Console",
@@ -679,7 +717,7 @@ return{
['dig_400l']= {"Cave", "400L", "Cave 400 linhas de lixo."}, ['dig_400l']= {"Cave", "400L", "Cave 400 linhas de lixo."},
['dig_1000l']= {"Cave", "1000L", "Cave 1000 linhas de lixo."}, ['dig_1000l']= {"Cave", "1000L", "Cave 1000 linhas de lixo."},
['drought_n']= {"Drought", "100L", "Sem peça I !"}, ['drought_n']= {"Drought", "100L", "Sem peça I !"},
['drought_l']= {"Drought", "100L", "WTF"}, ['drought_l']= {"Drought+", "100L", "WTF"},
['marathon_n']= {"Maratona", "NORMAL", "200-line Maratona com velocidade aumentando."}, ['marathon_n']= {"Maratona", "NORMAL", "200-line Maratona com velocidade aumentando."},
['marathon_h']= {"Maratona", "DIFÍCIL", "200-line Maratona com velocidade alta."}, ['marathon_h']= {"Maratona", "DIFÍCIL", "200-line Maratona com velocidade alta."},
['solo_e']= {"Batalha", "FÁCIL", "Derrote a inteligência!"}, ['solo_e']= {"Batalha", "FÁCIL", "Derrote a inteligência!"},
@@ -732,6 +770,7 @@ return{
['pc_n']= {"Desafio PC", "NORMAL", "Obtenha PCs em 100 linhas!"}, ['pc_n']= {"Desafio PC", "NORMAL", "Obtenha PCs em 100 linhas!"},
['pc_h']= {"Desafio PC", "DIFÍCIL", "Obtenha PCs em 100 linhas!"}, ['pc_h']= {"Desafio PC", "DIFÍCIL", "Obtenha PCs em 100 linhas!"},
['pc_l']= {"Desafio PC", "LUNÁTICO", "Obteha PCs em 100 linhas!"}, ['pc_l']= {"Desafio PC", "LUNÁTICO", "Obteha PCs em 100 linhas!"},
-- ['pc_inf']= {"Inf. PC Challenge","", "Get PCs as much as you can"},
['tech_n']= {"Tech", "NORMAL", "Não quebre o B2B!"}, ['tech_n']= {"Tech", "NORMAL", "Não quebre o B2B!"},
['tech_n_plus']= {"Tech", "NORMAL+", "Apenas spins e PC"}, ['tech_n_plus']= {"Tech", "NORMAL+", "Apenas spins e PC"},
['tech_h']= {"Tech", "HARD", "Keep the B2B chain!"}, ['tech_h']= {"Tech", "HARD", "Keep the B2B chain!"},
@@ -753,6 +792,7 @@ return{
['infinite_dig']= {"Infinito:Cave", "", "Cava, Cava, Cava."}, ['infinite_dig']= {"Infinito:Cave", "", "Cava, Cava, Cava."},
['sprintFix']= {"Sprint", "SEM ESQUERDA/DIREITA"}, ['sprintFix']= {"Sprint", "SEM ESQUERDA/DIREITA"},
['sprintLock']= {"Sprint", "SEM ROTAÇÃO"}, ['sprintLock']= {"Sprint", "SEM ROTAÇÃO"},
-- ['sprintSmooth']= {"Sprint", "NO FRICTION"},
['marathon_bfmax']= {"Maratona", "ULTIMATE"}, ['marathon_bfmax']= {"Maratona", "ULTIMATE"},
['custom_clear']= {"Custom", "NORMAL"}, ['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"}, ['custom_puzzle']= {"Custom", "PUZZLE"},
@@ -772,7 +812,7 @@ return{
"1next 1hold!", "1next 1hold!",
"1next 6hold!", "1next 6hold!",
"Na verdade 20G é uma regra de jogo nova.", "Na verdade 20G é uma regra de jogo nova.",
"40-linhas Sprint WR: 15.654s por VinceHD", "40-lines Sprint WR: 15.557s by Reset",
"6next 1hold!", "6next 1hold!",
"6next 6hold?!", "6next 6hold?!",
"ALL SPIN!", "ALL SPIN!",

View File

@@ -1,9 +1,7 @@
return{ return{
fallback=4, fallback=4,
back="Atrás",
anykey="Pulsa cualquier tecla", anykey="Pulsa cualquier tecla",
sureQuit="Pulsa de nuevo para salir", sureQuit="Pulsa de nuevo para salir",
newVersion="¡Gracias por actualizar! Detalles a continuación:",
httpTimeout="¡Tiempo de espera de conexión agotado!", httpTimeout="¡Tiempo de espera de conexión agotado!",
newDay="[Anti-adicción] ¡Nuevo día, nuevo comienzo!", newDay="[Anti-adicción] ¡Nuevo día, nuevo comienzo!",
playedLong="[Anti-adicción] Estuviste jugando un buen rato hoy. Recuerda descansar de vez en cuando.", playedLong="[Anti-adicción] Estuviste jugando un buen rato hoy. Recuerda descansar de vez en cuando.",
@@ -16,7 +14,6 @@ return{
clear={"Single","Doble","Triple","Techrash","Pentacrash","Hexacrash"}, clear={"Single","Doble","Triple","Techrash","Pentacrash","Hexacrash"},
mini="Mini",b2b="B2B ",b3b="B2B2B ", mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Half Clear", PC="Perfect Clear",HPC="Half Clear",
hold="Reserva",next="Sig.",
replaying="[Repetición]", replaying="[Repetición]",
stage="Nivel $1", stage="Nivel $1",
@@ -51,18 +48,18 @@ return{
ai_fixed="La IA no es compatible con secuencias de piezas prefijadas.", ai_fixed="La IA no es compatible con secuencias de piezas prefijadas.",
ai_prebag="La IA no es compatible con secuencias de piezas personalizadas.", ai_prebag="La IA no es compatible con secuencias de piezas personalizadas.",
ai_mission="La IA no es compatible con misiones personalizadas.", ai_mission="La IA no es compatible con misiones personalizadas.",
settingSaved="Cambios guardados",
saveDone="Datos guardados", saveDone="Datos guardados",
saveError="Error al guardar:", saveError="Error al guardar:",
loadError="Error al cargar:", loadError="Error al cargar:",
switchSpawnSFX="Habilita los sonidos de aparición de las piezas ;)", switchSpawnSFX="Habilita los sonidos de aparición de las piezas ;)",
getRank="Rango obtenido:",
needRestart="Reinicia Techmino para que los cambios tengan efecto.", needRestart="Reinicia Techmino para que los cambios tengan efecto.",
exportSuccess="Exportado con éxito", exportSuccess="Exportado con éxito",
importSuccess="Importado con éxito", importSuccess="Importado con éxito",
dataCorrupted="Los datos están corruptos.", dataCorrupted="Los datos están corruptos.",
-- pasteWrongPlace="Paste at wrong place?",
-- noFile="File not found",
VKTchW="Sens. al tacto", VKTchW="Sens. al tacto",
VKOrgW="Sens. al origen", VKOrgW="Sens. al origen",
@@ -73,10 +70,9 @@ return{
newRecord="¡Nuevo Récord!", newRecord="¡Nuevo Récord!",
getNoticeFail="Error al buscar novedades.", getNoticeFail="Error al buscar novedades.",
getVersionFail="Error al buscar nuevas versiones.",
oldVersion="¡Está disponible la nueva versión $1!", oldVersion="¡Está disponible la nueva versión $1!",
needUpdate="¡Nueva versión requerida!", -- versionNotMatch="Version do not match!",
-- noInternet="Not connected to the network", -- needUpdate="¡Nueva versión requerida!",
notFinished="Próximamente", notFinished="Próximamente",
jsonError="Error en Json", jsonError="Error en Json",
@@ -91,19 +87,22 @@ return{
loginFailed="Error al ingresar", loginFailed="Error al ingresar",
accessSuccessed="¡Autorizado exitoso!", accessSuccessed="¡Autorizado exitoso!",
accessFailed="Error al autorizar", accessFailed="Error al autorizar",
wsSuccessed="WebSocket: conectado",
-- wsConnecting="Websocket: Connecting",
wsFailed="WebSocket: conexión fallida", wsFailed="WebSocket: conexión fallida",
wsClose="WebSocket cerrado: ", wsClose="WebSocket cerrado: ",
waitNetTask="Conectando, espera por favor", -- netTimeout="Network connection timeout",
-- onlinePlayerCount="Online",
createRoomTooFast="¡Creas salas muy rápido, párale we!",
createRoomSuccessed="¡Sala creada con éxito!", createRoomSuccessed="¡Sala creada con éxito!",
-- started="Playing", -- started="Playing",
joinRoom="entró a la sala.", joinRoom="entró a la sala.",
leaveRoom="salió de la sala.", leaveRoom="salió de la sala.",
-- ready="READY", -- ready="READY",
-- set="SET", -- connStream="CONNECTING",
champion="$1 ganó!", -- waitStream="WAITING",
-- spectating="Spectating",
chatRemain="Usuarios en línea: ", chatRemain="Usuarios en línea: ",
chatStart="------Comienzo del historial------", chatStart="------Comienzo del historial------",
chatHistory="------Nuevos mensajes------", chatHistory="------Nuevos mensajes------",
@@ -128,14 +127,7 @@ return{
"Finesse:", "Finesse:",
}, },
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={ radarData={"D'PM","ADPM","APM","SPM","L'PM","DPM"},
"D'PM",
"ADPM",
"APM",
"SPM",
"L'PM",
"DPM",
},
stat={ stat={
"Veces Iniciado:", "Veces Iniciado:",
"Veces Jugado:", "Veces Jugado:",
@@ -149,9 +141,9 @@ return{
"PC/HPC:", "PC/HPC:",
"Err.Fns./RatioFns:", "Err.Fns./RatioFns:",
}, },
help={ aboutTexts={
"Este es simplemente un juego de puzzle ordinario, no pienses de él como un juego promedio.", "Este es simplemente un juego de puzzle ordinario, no pienses de él como un juego promedio.",
"Está inspirado en otros como TO/C2/KoS/TGM3/JS.", "Está inspirado en otros como C2/IO/JS/WWC/KOS.",
"", "",
"Creado con LOVE2D", "Creado con LOVE2D",
"Puedes reportar errores o enviar sugerencias al grupo de testeo del autor o por email ~", "Puedes reportar errores o enviar sugerencias al grupo de testeo del autor o por email ~",
@@ -166,7 +158,7 @@ return{
"", "",
"Programación: MrZ, Particle_G, [FinnTenzor]", "Programación: MrZ, Particle_G, [FinnTenzor]",
"Artistas: MrZ, ScF, [Gnyar, 旋律星萤, T0722]", "Artistas: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Música: MrZ, ERM, [T0722]", "Música: MrZ, ERM, [T0722, Aether]",
"Voces/Sonidos: Miya, Naki, MrZ Performance: 模电, HBM", "Voces/Sonidos: Miya, Naki, MrZ Performance: 模电, HBM",
"Performance: 模电, HBM", "Performance: 模电, HBM",
"Traducción: User670, MattMayuga, Mizu, Mr.Faq, ScF", "Traducción: User670, MattMayuga, Mizu, Mr.Faq, ScF",
@@ -178,8 +170,8 @@ return{
used=[[ used=[[
Herramientas utilizadas: Herramientas utilizadas:
Beepbox Beepbox
GFIE
Goldwave Goldwave
GFIE
FL Mobile FL Mobile
Librerías usadas: Librerías usadas:
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
@@ -198,7 +190,6 @@ return{
setting="Opciones", setting="Opciones",
stat="Estadísticas", stat="Estadísticas",
music="Música y SFX", music="Música y SFX",
about="Acerca del Juego",
dict="Zictionary", dict="Zictionary",
manual="Manual", manual="Manual",
}, },
@@ -224,26 +215,64 @@ return{
quit="Finalizar (Q)", quit="Finalizar (Q)",
}, },
net_menu={ net_menu={
-- league="Tech League",
ffa="FFA", ffa="FFA",
rooms="Salas", rooms="Salas",
chat="Chat",
-- logout="Log out", -- logout="Log out",
}, },
net_league={
-- match="Find Match",
},
net_rooms={ net_rooms={
-- refreshing="Refreshing Rooms", -- refreshing="Refreshing Rooms",
noRoom="No Hay Salas Actualmente", noRoom="No Hay Salas Actualmente",
refresh="Refrescar", refresh="Refrescar",
new="Sala Nueva(2)", -- new="New Room",
new2="Sala Nueva(5)",
join="Unirse", join="Unirse",
}, },
net_newRoom={
-- title="Custom room config",
-- roomName="Room name(default to username's room)",
-- roomDescription="Room description",
life="Vida",
-- pushSpeed="Garbage Speed",
garbageSpeed="Velocidad de Basura",
visible="Visibilidad",
freshLimit="Límite de Reinicio LD",
fieldH="Altura del tablero",
-- bufferLimit="Buffer Limit",
-- heightLimit="Height Limit",
drop="Retraso de Caída",
lock="Retraso de Bloqueo",
wait="Retraso de Spawneo",
fall="Retraso de Línea",
-- capacity="Capacity",
-- create="Create",
ospin="O-Spin",
fineKill="100% Finesse",
b2bKill="No Romper B2B ",
easyFresh="Reinicio de Bloqueo Normal",
deepDrop="Deep Drop",
bone="Bone Block",
nextCount="Siguiente",
holdCount="Reserva",
infHold="Reserva Inft.",
phyHold="Reserva Limit.",
bg="Fundo",
bgm="Música",
},
net_game={ net_game={
ready="Estoy Listo", ready="Estoy Listo",
-- spectate="Spectate",
-- cancel="Cancel", -- cancel="Cancel",
}, },
net_chat={
send="Enviar",
},
setting_game={ setting_game={
title="Ajustes del Juego", title="Ajustes del Juego",
graphic="←Video", graphic="←Video",
@@ -258,7 +287,6 @@ return{
autoPause="Pausar cuando la ventana no está enfocada", autoPause="Pausar cuando la ventana no está enfocada",
swap="Combinación de Teclas (Cambiar Modo de Ataque)", swap="Combinación de Teclas (Cambiar Modo de Ataque)",
fine="Sonido de Error de Finesse", fine="Sonido de Error de Finesse",
-- dataSaving="Data saving",
simpMode="Modo Sencillo", simpMode="Modo Sencillo",
}, },
setting_video={ setting_video={
@@ -282,29 +310,32 @@ return{
splashFX="FX Vis. de Splash", splashFX="FX Vis. de Splash",
shakeFX="Bamboleo del Tablero", shakeFX="Bamboleo del Tablero",
atkFX="FX Vis. de Ataque", atkFX="FX Vis. de Ataque",
frame="Ratio de FPSs", frame="Ratio de FPSs(%)",
text="Texto de Acciones", text="Texto de Acciones",
score="Puntaje en Pantalla", score="Puntaje en Pantalla",
warn="Alerta de Peligro", -- bufferWarn="Buffer Alert",
highCam="Cám. Vista Aérea", -- showSpike="Spike Counter",
nextPos="Ver Spawn de Pza. Sig.", nextPos="Ver Spawn de Pza. Sig.",
fullscreen="Pant. Completa", highCam="Cám. Vista Aérea",
power="Inf. de Batería", warn="Alerta de Peligro",
-- clickFX="Click FX", -- clickFX="Click FX",
bg="Fondo", power="Inf. de Batería",
clean="Fast Draw", clean="Fast Draw",
fullscreen="Pant. Completa",
bg="Fondo",
}, },
setting_sound={ setting_sound={
title="Ajustes de Sonido", title="Ajustes de Sonido",
game="←Juego", game="←Juego",
graphic="Video→", graphic="Video→",
bgm="BGM",
sfx="SFX", sfx="SFX",
stereo="Estéreo",
spawn="Spawn de Pzas.", spawn="Spawn de Pzas.",
warn="Alerta de Peligro", warn="Alerta de Peligro",
bgm="BGM",
stereo="Estéreo",
vib="Vibración", vib="Vibración",
voc="Voces", voc="Voces",
}, },
@@ -350,8 +381,12 @@ return{
setting_touch={ setting_touch={
default="Por Defecto", default="Por Defecto",
snap="Snap", snap="Snap",
option="Opciones", -- save1="Save1",
-- load1="Load1",
-- save2="Save2",
-- load2="Load2",
size="Tamaño", size="Tamaño",
-- shape="Shape",
}, },
setting_touchSwitch={ setting_touchSwitch={
b1= "Mover Izq.:",b2="Mover Der.:",b3="Rotar Der.:",b4="Rotar Izq.:", b1= "Mover Izq.:",b2="Mover Der.:",b3="Rotar Der.:",b4="Rotar Izq.:",
@@ -359,18 +394,17 @@ return{
b9= "Función1:",b10="Función2:",b11="Izq. Instant.:",b12="Der. Instant.:", b9= "Función1:",b10="Función2:",b11="Izq. Instant.:",b12="Der. Instant.:",
b13="Sonic Drop:",b14="Abajo 1:",b15="Abajo 4:",b16="Abajo 10:", b13="Sonic Drop:",b14="Abajo 1:",b15="Abajo 4:",b16="Abajo 10:",
b17="Soltar a Izq.:",b18="Soltar a Der.:",b19="Zangi a Izq.:",b20="Zangi a Der.:", b17="Soltar a Izq.:",b18="Soltar a Der.:",b19="Zangi a Izq.:",b20="Zangi a Der.:",
norm="Normal", norm="Normal",
pro="Profesional", pro="Profesional",
hide="Mostrar Tec. Virtual", hide="Mostrar Tec. Virtual",
track="Música Autom.", icon="Ícono",
sfx="SFX", sfx="SFX",
vib="Vibr.", vib="Vibr.",
icon="Ícono",
tkset="Ajustes de Canción",
alpha="Alpha", alpha="Alpha",
},
setting_trackSetting={ track="Música Autom.",
VKDodge="Autoskip", dodge="Autoskip",
}, },
customGame={ customGame={
title="Juego Personalizado", title="Juego Personalizado",
@@ -397,29 +431,28 @@ return{
field="Editar Tablero (F)", field="Editar Tablero (F)",
sequence="Editar Secuencia (S)", sequence="Editar Secuencia (S)",
mission="Editar Misiones (M)", mission="Editar Misiones (M)",
},
custom_advance={
title="Juego Personalizado",
subTitle="Avanzado",
nextCount="Siguiente", nextCount="Siguiente",
holdCount="Reserva", holdCount="Reserva",
infHold="Reserva Inft.", infHold="Reserva Inft.",
phyHold="Reserva Limit.", phyHold="Reserva Limit.",
bone="Bone Block",
fieldH="Altura del tablero", fieldH="Altura del tablero",
ospin="O-Spin",
deepDrop="Deep Drop",
target="Objetivo",
visible="Visibilidad", visible="Visibilidad",
freshLimit="Límite de Reinicio LD", freshLimit="Límite de Reinicio LD",
easyFresh="Reinicio de Bloqueo Normal",
fineKill="100% Finesse",
b2bKill="No Romper B2B ",
opponent="Oponente", opponent="Oponente",
life="Vida", life="Vida",
pushSpeed="Velocidad de Basura", -- pushSpeed="Garbage Speed",
garbageSpeed="Velocidad de Basura",
-- bufferLimit="Buffer Limit",
-- heightLimit="Height Limit",
ospin="O-Spin",
fineKill="100% Finesse",
b2bKill="No Romper B2B ",
easyFresh="Reinicio de Bloqueo Normal",
deepDrop="Deep Drop",
bone="Bone Block",
}, },
custom_field={ custom_field={
title="Juego Personalizado", title="Juego Personalizado",
@@ -508,6 +541,7 @@ return{
register="Registrarse", register="Registrarse",
email="Correo Elec.", email="Correo Elec.",
password="Contraseña", password="Contraseña",
-- keepPW="Remember me",
login="Entrar", login="Entrar",
}, },
register={ register={
@@ -563,15 +597,17 @@ return{
mode="Modo", mode="Modo",
}, },
savedata={ savedata={
exportUnlock="Exportar Desbloqueos", -- export="Export to clipboard",
exportData="Exportar Récords", -- import="Import from clipboard",
exportSetting="Exportar Ajustes", -- unlock="Progress",
exportVK="Exportar VK", -- data="Stats",
-- setting="Settings",
-- vk="Virtual Key Layout",
importUnlock="Importar Desbloqueos", -- couldSave="Cloud Save (need login) (CAUTION: TESTING)",
importData="Importar Datos", -- notLogin="[Login to access cloud save]",
importSetting="Importar Ajustes", -- upload="Upload to cloud",
importVK="Importar VK", -- download="Download from cloud",
}, },
error={ error={
console="Console", console="Console",
@@ -593,7 +629,7 @@ return{
['dig_400l']= {"Queso", "400L", "Limpia 400 líneas de queso."}, ['dig_400l']= {"Queso", "400L", "Limpia 400 líneas de queso."},
['dig_1000l']= {"Queso", "1000L", "Limpia 1000 líneas de queso."}, ['dig_1000l']= {"Queso", "1000L", "Limpia 1000 líneas de queso."},
['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"}, ['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"},
['drought_l']= {"Sequía", "100L", "Guat de foc..."}, ['drought_l']= {"Sequía+", "100L", "Guat de foc..."},
['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."}, ['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."},
['marathon_h']= {"Maratón", "Difícil", "Maratón de 200 líneas a velocidad máxima."}, ['marathon_h']= {"Maratón", "Difícil", "Maratón de 200 líneas a velocidad máxima."},
['solo_e']= {"VS.", "Fácil", "¡Derrota a la CPU!"}, ['solo_e']= {"VS.", "Fácil", "¡Derrota a la CPU!"},
@@ -645,6 +681,7 @@ return{
['pc_n']= {"Desafío de PCs", "Normal", "¡Consigue los PCs que puedas en 100 líneas!"}, ['pc_n']= {"Desafío de PCs", "Normal", "¡Consigue los PCs que puedas en 100 líneas!"},
['pc_h']= {"Desafío de PCs", "Difícil", "¡Consigue los PCs que puedas en 100 líneas!"}, ['pc_h']= {"Desafío de PCs", "Difícil", "¡Consigue los PCs que puedas en 100 líneas!"},
['pc_l']= {"Desafío de PCs", "Lunático", "¡Consigue los PCs que puedas en 100 líneas!"}, ['pc_l']= {"Desafío de PCs", "Lunático", "¡Consigue los PCs que puedas en 100 líneas!"},
-- ['pc_inf']= {"Inf. PC Challenge","", "Get PCs as much as you can"},
['tech_n']= {"Tech", "Normal", "¡Mantén el B2B!"}, ['tech_n']= {"Tech", "Normal", "¡Mantén el B2B!"},
['tech_n_plus']= {"Tech", "Normal+", "¡Sólo se permiten Spins y PCs!"}, ['tech_n_plus']= {"Tech", "Normal+", "¡Sólo se permiten Spins y PCs!"},
['tech_h']= {"Tech", "Difícil", "¡Mantén el B2B!"}, ['tech_h']= {"Tech", "Difícil", "¡Mantén el B2B!"},
@@ -666,6 +703,7 @@ return{
['infinite_dig']= {"Infinito: Queso", "", "Limpia, limpia, más limpia que tú."}, ['infinite_dig']= {"Infinito: Queso", "", "Limpia, limpia, más limpia que tú."},
['sprintFix']= {"Sprint", "Sin mover a Izq./Der."}, ['sprintFix']= {"Sprint", "Sin mover a Izq./Der."},
['sprintLock']= {"Sprint", "Sin rotar"}, ['sprintLock']= {"Sprint", "Sin rotar"},
-- ['sprintSmooth']= {"Sprint", "NO FRICTION"},
['marathon_bfmax']= {"Maratón", "Supremo"}, ['marathon_bfmax']= {"Maratón", "Supremo"},
['custom_clear']= {"Personalizado", "Normal"}, ['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"}, ['custom_puzzle']= {"Personalizado", "Puzzle"},

View File

@@ -1,8 +1,6 @@
return{ return{
fallback=4, fallback=4,
back="X",
anykey="↓□↓", anykey="↓□↓",
newVersion="&!!!???↓↓",
httpTimeout="e??????x", httpTimeout="e??????x",
atkModeName={"?","( )","!","←→"}, atkModeName={"?","( )","!","←→"},
@@ -12,7 +10,6 @@ return{
clear={"1","2","3","4","5","6"}, clear={"1","2","3","4","5","6"},
mini="v",b2b="^ ",b3b="^^ ", mini="v",b2b="^ ",b3b="^^ ",
PC="#<>#",HPC="<>", PC="#<>#",HPC="<>",
hold="[ ]",next="",
replaying="[R]", replaying="[R]",
stage="::$1::", stage="::$1::",
@@ -47,6 +44,9 @@ return{
exportSuccess="~Out~", exportSuccess="~Out~",
importSuccess="~In~", importSuccess="~In~",
dataCorrupted="XXXXX", dataCorrupted="XXXXX",
pasteWrongPlace="_?X.",
-- noFile="File not found",
VKTchW="Tch↓", VKTchW="Tch↓",
VKOrgW="Org↓", VKOrgW="Org↓",
VKCurW="Cur↓", VKCurW="Cur↓",
@@ -81,11 +81,11 @@ return{
"#<>#/<>:", "#<>#/<>:",
"!#!X/%:", "!#!X/%:",
}, },
help={ aboutTexts={
"□!!~~~,□□□□X", "□!!~~~,□□□□X",
"□!!==*/*/*/*~", "□!!==*/*/*/*/*~",
"", "",
"Powered by LÖVE/love2d", "Powered by LÖVE",
"Any suggestions or bug reports are appreciated!", "Any suggestions or bug reports are appreciated!",
"Make sure to only obtain the game from official sources;", "Make sure to only obtain the game from official sources;",
"We can't make sure you're safe if you got it elsewhere.", "We can't make sure you're safe if you got it elsewhere.",
@@ -101,7 +101,6 @@ return{
setting="_?_", setting="_?_",
stat="=___", stat="=___",
music="~~~ & =><=", music="~~~ & =><=",
about="?",
dict="z", dict="z",
manual="???", manual="???",
}, },
@@ -137,7 +136,6 @@ return{
autoPause="A||", autoPause="A||",
swap="=+=+=", swap="=+=+=",
fine="12 X 21", fine="12 X 21",
dataSaving="XX.",
simpMode=".", simpMode=".",
}, },
setting_video={ setting_video={
@@ -161,18 +159,21 @@ return{
splashFX="↑↑↑~", splashFX="↑↑↑~",
shakeFX="~|~|~", shakeFX="~|~|~",
atkFX="→→~", atkFX="→→~",
frame="|=|", frame="|=|%",
text="ABC", text="ABC",
score="+123", score="+123",
warn="!↑↑↑!", bufferWarn="^+",
highCam="↑__↑", showSpike="→→+",
nextPos="???←", nextPos="???←",
fullscreen="|←→|", highCam="↑__↑",
power="+.", warn="!↑↑↑!",
clickFX="_.~", clickFX="_.~",
bg="__?__", power="+.",
clean="[]→→O", clean="[]→→O",
fullscreen="|←→|",
bg="__?__",
}, },
setting_sound={ setting_sound={
title="(~~)", title="(~~)",
@@ -180,11 +181,11 @@ return{
game="←Game", game="←Game",
graphic="Video→", graphic="Video→",
bgm="#~#",
sfx="#!#", sfx="#!#",
stereo="←~→",
spawn="#[]#", spawn="#[]#",
warn="!↑↑↑!", warn="!↑↑↑!",
bgm="#~#",
stereo="←~→",
vib="=~=", vib="=~=",
voc="~~~", voc="~~~",
}, },
@@ -230,8 +231,12 @@ return{
setting_touch={ setting_touch={
default="$0", default="$0",
snap="_ _", snap="_ _",
option="_?", save1=">1",
load1="1>",
save2=">2",
load2="2>",
size="←→", size="←→",
shape="@?",
}, },
setting_touchSwitch={ setting_touchSwitch={
b1="←:", b2="→:", b3="R→:", b4="←R:", b1="←:", b2="→:", b3="R→:", b4="←R:",
@@ -239,18 +244,17 @@ return{
b9="F1:", b10="F2:", b11="←←:", b12="→→:", b9="F1:", b10="F2:", b11="←←:", b12="→→:",
b13="↓_:", b14="↓1:", b15="↓4:", b16="↓10:", b13="↓_:", b14="↓1:", b15="↓4:", b16="↓10:",
b17="←↓→↓:", b18="→↓↓:", b19="←↓→↓:",b20="→↓←↓:", b17="←↓→↓:", b18="→↓↓:", b19="←↓→↓:",b20="→↓←↓:",
norm="-", norm="-",
pro="+", pro="+",
hide="--?", hide="--?",
track="~=?", icon="@?",
sfx="#!#", sfx="#!#",
vib="=~=", vib="=~=",
icon="@?",
tkset="_~=_",
alpha="+?", alpha="+?",
},
setting_trackSetting={ track="~=?",
VKDodge="←_→", dodge="←_→",
}, },
customGame={ customGame={
title="!@#$%^&*", title="!@#$%^&*",
@@ -277,28 +281,28 @@ return{
field="Edit Field (F)", field="Edit Field (F)",
sequence="Edit Sequence (S)", sequence="Edit Sequence (S)",
mission="Edit Mission (M)", mission="Edit Mission (M)",
},
custom_advance={
title="!@#$%^&*",
subTitle="##",
nextCount="", nextCount="",
holdCount="[ ]", holdCount="[ ]",
infHold="∞*[ ]", infHold="∞*[ ]",
phyHold="P-[ ]", phyHold="P-[ ]",
bone="[]",
fieldH="↑[]↓", fieldH="↑[]↓",
ospin="O→Any",
deepDrop="\\↓↓/",
visible="?=", visible="?=",
freshLimit="@", freshLimit="@",
easyFresh="↓_↓_↓_",
fineKill="12 XX 21",
b2bKill="_1 XX",
opponent="^_^", opponent="^_^",
life="<R>", life="<R>",
pushSpeed="_↑__", pushSpeed="_↑__",
garbageSpeed="#↑↑",
bufferLimit="^↑",
heightLimit="#↑",
ospin="O→Any",
fineKill="12 XX 21",
b2bKill="_1 XX",
easyFresh="↓_↓_↓_",
deepDrop="\\↓↓/",
bone="[]",
}, },
custom_field={ custom_field={
title="!@#$%^&*", title="!@#$%^&*",
@@ -435,6 +439,7 @@ return{
register="Sign up", register="Sign up",
email="@", email="@",
password="*", password="*",
-- keepPW="I",
login="Log in", login="Log in",
}, },
register={ register={

View File

@@ -1,6 +1,5 @@
return{ return{
anykey="您开始了", anykey="您开始了",
newVersion="感谢更新,去看看更新了些啥,别老跑群里问",
httpTimeout="没网或者网不好?", httpTimeout="没网或者网不好?",
playedLong="今天玩很久了,给我注意点", playedLong="今天玩很久了,给我注意点",
playedTooMuch="特么再玩小心眼睛瞎掉,爬", playedTooMuch="特么再玩小心眼睛瞎掉,爬",
@@ -43,10 +42,9 @@ return{
ranks={"","","","",""}, ranks={"","","","",""},
createRoomTooFast="手痒要开这么多房间?",
createRoomSuccessed="创好了", createRoomSuccessed="创好了",
started="开了", started="开了",
champion="神仙是 $1", spectating="看戏中",
stat={ stat={
"开了几次:", "开了几次:",
@@ -83,6 +81,7 @@ return{
text="招式名", text="招式名",
score="跳分", score="跳分",
warn="要死",
highCam="拉镜", highCam="拉镜",
}, },
setting_sound={ setting_sound={
@@ -91,9 +90,9 @@ return{
game="←游戏设置", game="←游戏设置",
graphic="改画面→", graphic="改画面→",
bgm="",
spawn="出块", spawn="出块",
warn="警告", warn="警告",
bgm="",
vib="嗡嗡", vib="嗡嗡",
cv="", cv="",
}, },
@@ -109,12 +108,12 @@ return{
pro="阴间", pro="阴间",
}, },
about={ about={
staff="游戏谁", staff="游戏谁",
his="黑历史", his="黑历史",
qq="QQ对线", qq="QQ对线",
}, },
register={ register={
password2="猜该填啥", password2="懂的",
}, },
sound={ sound={
title="音效室", title="音效室",
@@ -182,9 +181,18 @@ return{
disappear="消失", disappear="消失",
tapFX="动画", tapFX="动画",
}, },
error={ savedata={
console="Console", export="复制走",
quit="Quit", import="粘贴到",
unlock="地图",
data="统计",
setting="设置",
vk="虚拟按键",
couldSave="云存档(测试,炸了别怪我)",
notLogin="[不登录存个锤子]",
upload="上传",
download="下载",
}, },
}, },
modes={ modes={
@@ -202,7 +210,7 @@ return{
['dig_400l']= {"挖掘", "400L", "挖400行"}, ['dig_400l']= {"挖掘", "400L", "挖400行"},
['dig_1000l']= {"挖掘", "1000L", "挖1000行"}, ['dig_1000l']= {"挖掘", "1000L", "挖1000行"},
['drought_n']= {"干旱", "100L", "放轻松,简单得很"}, ['drought_n']= {"干旱", "100L", "放轻松,简单得很"},
['drought_l']= {"干旱", "100L", "有趣的要来了"}, ['drought_l']= {"干旱+", "100L", "有趣的要来了"},
['marathon_n']= {"马拉松", "普通", "休闲模式"}, ['marathon_n']= {"马拉松", "普通", "休闲模式"},
['marathon_h']= {"马拉松", "困难", "休闲模式"}, ['marathon_h']= {"马拉松", "困难", "休闲模式"},
['solo_e']= {"单挑", "简单", "鲨AI"}, ['solo_e']= {"单挑", "简单", "鲨AI"},
@@ -255,6 +263,7 @@ return{
['pc_n']= {"全清挑战", "普通", "100行内刷PC"}, ['pc_n']= {"全清挑战", "普通", "100行内刷PC"},
['pc_h']= {"全清挑战", "困难", "100行内刷PC"}, ['pc_h']= {"全清挑战", "困难", "100行内刷PC"},
['pc_l']= {"全清挑战", "疯狂", "100行内刷PC"}, ['pc_l']= {"全清挑战", "疯狂", "100行内刷PC"},
['pc_inf']= {"无尽全清挑战", "", "你这水平还是先别玩了"},
['tech_n']= {"科研", "普通", "禁止断B2B"}, ['tech_n']= {"科研", "普通", "禁止断B2B"},
['tech_n_plus']= {"科研", "普通+", "仅允许spin与PC"}, ['tech_n_plus']= {"科研", "普通+", "仅允许spin与PC"},
['tech_h']= {"科研", "困难", "禁止断B2B"}, ['tech_h']= {"科研", "困难", "禁止断B2B"},
@@ -273,44 +282,12 @@ return{
['zen']= {"", "200", "不限时200行"}, ['zen']= {"", "200", "不限时200行"},
['ultra']= {"限时打分", "挑战", "2分钟刷分"}, ['ultra']= {"限时打分", "挑战", "2分钟刷分"},
['infinite']= {"无尽", "", "真的有人会玩这个?"}, ['infinite']= {"无尽", "", "真的有人会玩这个?"},
['infinite_dig']= {"无尽:挖掘", "", "闲得慌的话来挖"}, ['infinite_dig']= {"无尽:挖掘", "", "闲得慌来挖"},
['sprintFix']= {"竞速", "无移动"}, ['sprintFix']= {"竞速", "无移动"},
['sprintLock']= {"竞速", "无旋转"}, ['sprintLock']= {"竞速", "无旋转"},
['sprintSmooth']= {"竞速", "无摩擦"},
['marathon_bfmax']= {"马拉松", "极限"}, ['marathon_bfmax']= {"马拉松", "极限"},
['custom_clear']= {"自定义", "普通"}, ['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"}, ['custom_puzzle']= {"自定义", "拼图"},
}, },
getTip={refuseCopy=true,
"100apm?你倒是不用开局定式连续打几把",
"10连pc不是随手?",
"20G很难?是个人都能玩吧。",
"20TSD不难吧。",
"3pps不是人均水平?",
"40行还要40多秒,就这?",
"别会个c4w就以为自己多强,这是基本功罢了。",
"别人只用一只手都能玩,你呢?",
"不会吧不会吧,真的还有人不能随手Tspin?",
"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?",
"还搁这玩手机呢,作业做完了?",
"极限20G不是随手通?",
"叫你多练就多练,想着几天变神仙,当自己是谁?",
"先练基础不听,现在速度没有,Tspin完地形一塌糊涂,开心吗?",
"经典块跟现代块是两个游戏,别拿多少年前水平秀优越,请从头练起。",
"卖弱不是谦虚,请看场合。",
"卖弱是要遭报应的",
"满口PCDT信天翁,还会点别的么?",
"没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?",
"全隐40行全消四很难吗??",
"少玩点,多眨眨眼,不听瞎了别怪我没提醒你",
"设置都看过一遍了吗?明明都有还嫌功能少,谁的问题?",
"谁说一定要强的人才叫卖弱?不是最菜就一定在有人眼中是卖弱",
"双旋和极简尽早学起来…懒得学以后亏的是自己",
"天天催更催更,你咋不来帮忙开发啊,真以为作者很强催催啥都有?",
"天天卖弱,你一定把把150apm吧?",
"问怎么练就好好问,别就一句话怎么变强,鬼知道你现在什么水平",
"一口一个wtcl还不赶紧去练,你是不思进取还是不想好好说话?",
"隐形很难?上电视那个水平一般都打成那样,属实自己不行看不起别人",
"隐形哪难了,你练了吗?没练几个小时在这里说难是嫌葡萄酸?",
"这不是休闲游戏…别怪关卡要求太高,就是你菜,请多练。",
},
} }

View File

@@ -1,9 +1,7 @@
local C=COLOR local C=COLOR
return{ return{
back="返回",
anykey="按任意键继续", anykey="按任意键继续",
sureQuit="再按一次退出", sureQuit="再按一次退出",
newVersion="感谢更新!更新内容如下",
httpTimeout="网络连接超时!", httpTimeout="网络连接超时!",
newDay="新的一天,新的开始~", newDay="新的一天,新的开始~",
playedLong="已经玩很久了!注意休息!", playedLong="已经玩很久了!注意休息!",
@@ -11,12 +9,12 @@ return{
atkModeName={"随机","徽章","击杀","反击"}, atkModeName={"随机","徽章","击杀","反击"},
royale_remain="剩余 $1 名玩家", royale_remain="剩余 $1 名玩家",
powerUp={[0]="000%UP","025%UP","050%UP","075%UP","100%UP"},
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"}, cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
spin="-spin ", spin="-spin ",
clear={"single","double","triple","Techrash","Pentcrash","Hexcrash"}, clear={"single","double","triple","Techrash","Pentcrash","Hexcrash"},
mini="Mini",b2b="B2B ",b3b="B2B2B ", mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Half Clear", PC="Perfect Clear",HPC="Half Clear",
hold="暂存",next="下一个",
replaying="[回放]", replaying="[回放]",
stage="关卡 $1", stage="关卡 $1",
@@ -62,6 +60,8 @@ return{
exportSuccess="导出成功", exportSuccess="导出成功",
importSuccess="导入成功", importSuccess="导入成功",
dataCorrupted="数据损坏", dataCorrupted="数据损坏",
pasteWrongPlace="提醒:可能粘贴错地方了",
noFile="找不到文件",
VKTchW="触摸点权重", VKTchW="触摸点权重",
VKOrgW="原始点权重", VKOrgW="原始点权重",
@@ -72,10 +72,9 @@ return{
newRecord="打破纪录", newRecord="打破纪录",
getNoticeFail="拉取公告失败", getNoticeFail="拉取公告失败",
getVersionFail="检测新版本失败",
oldVersion="最新版本$1可以下载了!", oldVersion="最新版本$1可以下载了!",
needUpdate="请更新游戏!", needUpdate="请更新游戏!",
noInternet="还未连接到网络", versionNotMatch="版本不一致!",
notFinished="暂未完成,敬请期待!", notFinished="暂未完成,敬请期待!",
jsonError="json错误", jsonError="json错误",
@@ -90,19 +89,22 @@ return{
loginFailed="登录失败", loginFailed="登录失败",
accessSuccessed="身份验证成功", accessSuccessed="身份验证成功",
accessFailed="身份验证失败", accessFailed="身份验证失败",
wsSuccessed="WS连接成功",
wsFailed="WS连接失败",
wsClose="WS被断开: ",
netTimeout="网络连接超时",
createRoomTooFast="创建房间太快啦,等等吧", wsConnecting="正在连接",
wsFailed="连接失败",
wsClose="连接被断开: ",
netTimeout="连接超时",
onlinePlayerCount="在线人数",
createRoomSuccessed="创建房间成功!", createRoomSuccessed="创建房间成功!",
started="游戏中", started="游戏中",
joinRoom="进入房间", joinRoom="进入房间",
leaveRoom="离开房间", leaveRoom="离开房间",
ready="各就各位!", ready="各就各位!",
set="预备!", connStream="正在连接",
champion="$1 获胜", waitStream="等待其他人连接",
spectating="观战中",
chatRemain="人数:", chatRemain="人数:",
chatStart="------消息的开头------", chatStart="------消息的开头------",
chatHistory="------以上是历史消息------", chatHistory="------以上是历史消息------",
@@ -150,14 +152,7 @@ return{
"Finesse:", "Finesse:",
}, },
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={ radarData={"D'PM","ADPM","APM","SPM","L'PM","DPM"},
"D'PM",
"ADPM",
"APM",
"SPM",
"L'PM",
"DPM",
},
stat={ stat={
"游戏运行次数:", "游戏运行次数:",
"游戏局数:", "游戏局数:",
@@ -171,9 +166,9 @@ return{
"全/半清:", "全/半清:",
"多余操作/极简率:", "多余操作/极简率:",
}, },
help={ aboutTexts={
"这只是一个普通的方块游戏,请勿称此游戏为某某某方块", "这只是一个普通的方块游戏,请勿将此与某带国家名的事物强行联系",
"TO/C2/KOS/TGM3/JS等方块获得过灵感", "C2/IO/JS/WWC/KOS等方块获得过灵感",
"", "",
"使用LOVE2D引擎", "使用LOVE2D引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~", "错误或者建议请附带截图发送到内测群或者作者邮箱~",
@@ -188,20 +183,20 @@ return{
"", "",
"程序: MrZ, Particle_G, [FinnTenzor]", "程序: MrZ, Particle_G, [FinnTenzor]",
"美术: MrZ, ScF, [Gnyar, 旋律星萤, T0722]", "美术: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"音乐: MrZ, ERM, [T0722]", "音乐: MrZ, ERM, [T0722, Aether]",
"音效/语音: Miya, Naki, MrZ", "音效/语音: Miya, Naki, MrZ",
"演出: 模电, HBM", "演出: 模电, HBM",
"翻译: User670, MattMayuga, Mizu, Mr.Faq, ScF", "翻译: User670, MattMayuga, Mizu, Mr.Faq, ScF",
"", "",
"特别感谢:", "特别感谢:",
"User670, Big_True, Flyz, Farter, 思竣", "User670, Big_True, Flyz, Farter, 思竣",
"T9972, 蕴空之灵, Teatube, [所有内测人员]", "T9972, Teatube, 蕴空之灵, [所有内测人员]",
}, },
used=[[ used=[[
使用工具: 使用工具:
Beepbox Beepbox
GFIE
Goldwave Goldwave
GFIE
FL Mobile FL Mobile
使用库: 使用库:
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
@@ -220,7 +215,6 @@ return{
setting="设置", setting="设置",
stat="统计信息", stat="统计信息",
music="音乐&音效", music="音乐&音效",
about="关于",
dict="小Z词典", dict="小Z词典",
manual="说明书", manual="说明书",
}, },
@@ -246,26 +240,64 @@ return{
quit="退出(Q)", quit="退出(Q)",
}, },
net_menu={ net_menu={
league="Tech League",
ffa="FFA", ffa="FFA",
rooms="房间列表", rooms="房间列表",
chat="聊天室",
logout="退出登录", logout="退出登录",
}, },
net_league={
match="匹配对手",
},
net_rooms={ net_rooms={
refreshing="刷新房间列表中", refreshing="刷新房间列表中",
noRoom="一个房间都没有哎...", noRoom="一个房间都没有哎...",
refresh="刷新", refresh="刷新",
new="创建房间(2)", new="创建房间",
new2="创建房间(5)",
join="加入", join="加入",
}, },
net_newRoom={
title="自定义房间参数",
roomName="房间名(留空默认 用户名's room)",
roomDescription="房间描述",
life="命数",
pushSpeed="上涨速度",
garbageSpeed="垃圾行速度",
visible="能见度",
freshLimit="锁延刷新限制",
fieldH="场地高度",
bufferLimit="缓冲上限",
heightLimit="高度上限",
drop="下落延迟",
lock="锁定延迟",
wait="出块等待",
fall="消行延迟",
capacity="房间容量",
create="创建房间",
ospin="O-spin",
fineKill="强制极简",
b2bKill="强制B2B",
easyFresh="普通刷新锁延",
deepDrop="深降",
bone="骨块",
nextCount="Next",
holdCount="Hold",
infHold="无限Hold",
phyHold="物理Hold",
bg="背景",
bgm="音乐",
},
net_game={ net_game={
ready="准备", ready="准备",
spectate="观战",
cancel="取消", cancel="取消",
}, },
net_chat={
send="发送",
},
setting_game={ setting_game={
title="游戏设置", title="游戏设置",
graphic="←画面设置", graphic="←画面设置",
@@ -280,7 +312,6 @@ return{
autoPause="失去焦点自动暂停", autoPause="失去焦点自动暂停",
swap="组合键切换攻击模式", swap="组合键切换攻击模式",
fine="极简操作提示音", fine="极简操作提示音",
dataSaving="省流模式",
simpMode="简洁模式", simpMode="简洁模式",
}, },
setting_video={ setting_video={
@@ -294,7 +325,7 @@ return{
bagLine="包分界线", bagLine="包分界线",
ghost="阴影不透明度", ghost="阴影不透明度",
grid="网格", grid="网格不透明度",
center="旋转中心不透明度", center="旋转中心不透明度",
lockFX="锁定特效", lockFX="锁定特效",
@@ -304,29 +335,32 @@ return{
splashFX="溅射特效", splashFX="溅射特效",
shakeFX="晃动特效", shakeFX="晃动特效",
atkFX="攻击特效", atkFX="攻击特效",
frame="绘制帧率", frame="绘制帧率(%)",
text="消行文本", text="消行文本",
score="分数动画", score="分数动画",
warn="死亡预警", bufferWarn="缓冲预警",
highCam="超屏视野", showSpike="爆发累计",
nextPos="生成预览", nextPos="生成预览",
fullscreen="全屏", highCam="超屏视野",
power="电量显示", warn="死亡预警",
clickFX="点按特效", clickFX="点按特效",
bg="背景", power="电量显示",
clean="绘制优化", clean="绘制优化",
fullscreen="全屏",
bg="背景",
}, },
setting_sound={ setting_sound={
title="声音设置", title="声音设置",
game="←游戏设置", game="←游戏设置",
graphic="画面设置→", graphic="画面设置→",
bgm="音乐",
sfx="音效", sfx="音效",
stereo="立体声",
spawn="方块生成", spawn="方块生成",
warn="危险警告", warn="危险警告",
bgm="音乐",
stereo="立体声",
vib="振动", vib="振动",
voc="语音", voc="语音",
cv="语音包", cv="语音包",
@@ -375,8 +409,12 @@ return{
setting_touch={ setting_touch={
default="默认组合", default="默认组合",
snap="吸附", snap="吸附",
option="选项", save1="保存1",
load1="读取1",
save2="保存2",
load2="读取2",
size="大小", size="大小",
shape="形状",
}, },
setting_touchSwitch={ setting_touchSwitch={
b1= "左移:", b2="右移:", b3="顺时针旋转:", b4="逆时针旋转:", b1= "左移:", b2="右移:", b3="顺时针旋转:", b4="逆时针旋转:",
@@ -384,18 +422,17 @@ return{
b9= "功能键1:", b10="功能键2:",b11="左瞬移:", b12="右瞬移:", b9= "功能键1:", b10="功能键2:",b11="左瞬移:", b12="右瞬移:",
b13="软降到底:",b14="软降一格:",b15="软降四格:", b16="软降十格:", b13="软降到底:",b14="软降一格:",b15="软降四格:", b16="软降十格:",
b17="落在最左:",b18="落在最右:",b19="列在最左:", b20="列在最右:", b17="落在最左:",b18="落在最右:",b19="列在最左:", b20="列在最右:",
norm="标准", norm="标准",
pro="专业", pro="专业",
hide="显示虚拟按键", hide="显示虚拟按键",
track="按键自动跟踪", icon="图标",
sfx="按键音效", sfx="按键音效",
vib="按键振动", vib="按键振动",
icon="图标",
tkset="跟踪设置",
alpha="不透明度", alpha="不透明度",
},
setting_trackSetting={ track="按键自动跟踪",
VKDodge="自动避让", dodge="自动避让",
}, },
customGame={ customGame={
title="自定义游戏", title="自定义游戏",
@@ -422,28 +459,28 @@ return{
field="场地编辑(F)", field="场地编辑(F)",
sequence="序列编辑(S)", sequence="序列编辑(S)",
mission="任务编辑(M)", mission="任务编辑(M)",
},
custom_advance={
title="自定义游戏",
subTitle="高级",
nextCount="Next", nextCount="Next",
holdCount="Hold", holdCount="Hold",
infHold="无限Hold", infHold="无限Hold",
phyHold="物理Hold", phyHold="物理Hold",
bone="骨块",
fieldH="场地高度", fieldH="场地高度",
ospin="O-spin",
deepDrop="深降",
visible="能见度", visible="能见度",
freshLimit="锁延刷新限制", freshLimit="锁延刷新限制",
easyFresh="普通刷新锁延",
fineKill="强制极简",
b2bKill="强制B2B",
opponent="对手", opponent="对手",
life="命数", life="命数",
pushSpeed="上涨速度", pushSpeed="上涨速度",
garbageSpeed="垃圾行速度",
bufferLimit="缓冲上限",
heightLimit="高度上限",
ospin="O-spin",
fineKill="强制极简",
b2bKill="强制B2B",
easyFresh="普通刷新锁延",
deepDrop="深降",
bone="骨块",
}, },
custom_field={ custom_field={
title="自定义游戏", title="自定义游戏",
@@ -594,6 +631,7 @@ return{
register="注册", register="注册",
email="邮箱", email="邮箱",
password="密码", password="密码",
keepPW="保存密码",
login="登录", login="登录",
}, },
register={ register={
@@ -653,15 +691,17 @@ return{
mode="模式", mode="模式",
}, },
savedata={ savedata={
exportUnlock="导出地图进度", export="导出到剪切板",
exportData="导出统计数据", import="从剪切板导入",
exportSetting="导出设置", unlock="地图进度",
exportVK="导出虚拟按键布局", data="统计数据",
setting="设置",
vk="虚拟按键布局",
importUnlock="导入地图进度", couldSave="云存档(测试功能,谨慎使用)",
importData="导入统计数据", notLogin="[登录以使用云存档]",
importSetting="导入设置", upload="上传到云端",
importVK="导入虚拟按键布局", download="从云端下载",
}, },
error={ error={
console="控制台", console="控制台",
@@ -683,7 +723,7 @@ return{
['dig_400l']= {"挖掘", "400L", "挖掘400行"}, ['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['dig_1000l']= {"挖掘", "1000L", "挖掘1000行"}, ['dig_1000l']= {"挖掘", "1000L", "挖掘1000行"},
['drought_n']= {"干旱", "100L", "你I没了"}, ['drought_n']= {"干旱", "100L", "你I没了"},
['drought_l']= {"干旱", "100L", "后 妈 发 牌"}, ['drought_l']= {"干旱+", "100L", "后 妈 发 牌"},
['marathon_n']= {"马拉松", "普通", "200行加速马拉松"}, ['marathon_n']= {"马拉松", "普通", "200行加速马拉松"},
['marathon_h']= {"马拉松", "困难", "200行高速马拉松"}, ['marathon_h']= {"马拉松", "困难", "200行高速马拉松"},
['solo_e']= {"单挑", "简单", "打败AI"}, ['solo_e']= {"单挑", "简单", "打败AI"},
@@ -736,6 +776,7 @@ return{
['pc_n']= {"全清挑战", "普通", "100行内刷PC"}, ['pc_n']= {"全清挑战", "普通", "100行内刷PC"},
['pc_h']= {"全清挑战", "困难", "100行内刷PC"}, ['pc_h']= {"全清挑战", "困难", "100行内刷PC"},
['pc_l']= {"全清挑战", "疯狂", "100行内刷PC"}, ['pc_l']= {"全清挑战", "疯狂", "100行内刷PC"},
['pc_inf']= {"无尽全清挑战", "", "你能连续做多少PC?"},
['tech_n']= {"科研", "普通", "禁止断B2B"}, ['tech_n']= {"科研", "普通", "禁止断B2B"},
['tech_n_plus']= {"科研", "普通+", "仅允许spin与PC"}, ['tech_n_plus']= {"科研", "普通+", "仅允许spin与PC"},
['tech_h']= {"科研", "困难", "禁止断B2B"}, ['tech_h']= {"科研", "困难", "禁止断B2B"},
@@ -757,6 +798,7 @@ return{
['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"}, ['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"},
['sprintFix']= {"竞速", "无移动"}, ['sprintFix']= {"竞速", "无移动"},
['sprintLock']= {"竞速", "无旋转"}, ['sprintLock']= {"竞速", "无旋转"},
['sprintSmooth']= {"竞速", "无摩擦"},
['marathon_bfmax']= {"马拉松", "极限"}, ['marathon_bfmax']= {"马拉松", "极限"},
['custom_clear']= {"自定义", "普通"}, ['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"}, ['custom_puzzle']= {"自定义", "拼图"},
@@ -789,21 +831,20 @@ return{
"29种块里28个都能spin你敢信?", "29种块里28个都能spin你敢信?",
"3.1415926535897932384 ? ? ?", "3.1415926535897932384 ? ? ?",
"3next 1hold?", "3next 1hold?",
"40行世界纪录:15.654s by VinceHD", "40行世界纪录:15.557s by Reset",
"6236326236327175", "6236326236327175",
"626in1",
"6next 1hold!", "6next 1hold!",
"6next 6hold?!", "6next 6hold?!",
"7宽三SZ架空捐了解一下", "7宽三SZ架空捐了解一下",
"9999in1",
"按钮风格进化史", "按钮风格进化史",
"把手机调到特殊的日期也许会发生什么", "把手机调到特殊的日期也许会发生什么",
"报时机器人:新的一天开始了", "报时机器人:新的一天开始了",
"背景影响游玩?可以去设置关闭", "背景影响游玩?可以去设置关闭",
"本游戏不是产品,是作品(至少目前是…)",
"本游戏的一部分内容是国际合作的!", "本游戏的一部分内容是国际合作的!",
"本游戏的B2B是气槽机制,和传统的开关机制不一样哦", "本游戏的B2B是气槽机制,和传统的开关机制不一样哦",
"本游戏可不是休闲游戏。", "本游戏还在测试中,出各种问题都是有可能的哦",
"本游戏内置了几个休(ying)闲(he)小游戏哦~入口就藏在这个菜单", "本游戏内置了几个休(ying)闲(he)小游戏哦~",
"本游戏在设计的时候受到了大量其他块游甚至一些音游的启发", "本游戏在设计的时候受到了大量其他块游甚至一些音游的启发",
"必须要软降才能到达的位置都会判定为极简操作", "必须要软降才能到达的位置都会判定为极简操作",
"别看攻击效率不高,其实消四还是很强的", "别看攻击效率不高,其实消四还是很强的",
@@ -816,7 +857,8 @@ return{
"彩色消除即将到来!", "彩色消除即将到来!",
"草(日本语)", "草(日本语)",
"成就系统在做了!", "成就系统在做了!",
"触发游戏报错后日志文件会越来越大(不过顶多几十K)", "吃键?真的吗?建议回放看看到底按没按到,按了多久",
"触发游戏报错后日志文件会越来越大(不过顶多几百K)",
"触摸板打osu也很好!", "触摸板打osu也很好!",
"凑数tip什么时候能站起来!", "凑数tip什么时候能站起来!",
"打好块跟学习一样没有捷径,多练。", "打好块跟学习一样没有捷径,多练。",
@@ -828,7 +870,6 @@ return{
"低帧率会降低游戏体验", "低帧率会降低游戏体验",
"点击添加标题", "点击添加标题",
"点击添加副标题", "点击添加副标题",
"点击退出按钮会有极小概率会…",
"电脑游玩自带按键显示~", "电脑游玩自带按键显示~",
"对编程有真·兴趣推荐Lua,安装无脑 语法简单 执行速度快 远离枯燥学校编程(雾", "对编程有真·兴趣推荐Lua,安装无脑 语法简单 执行速度快 远离枯燥学校编程(雾",
"对战游戏不是单机游戏,所以timing在对战里也非常重要!", "对战游戏不是单机游戏,所以timing在对战里也非常重要!",
@@ -841,10 +882,11 @@ return{
"方块默认出现的方向都是重心在下哦", "方块默认出现的方向都是重心在下哦",
"方块能吃吗", "方块能吃吗",
"服务器随时爆炸", "服务器随时爆炸",
"感觉自己明明按键了但是没反应?你真的按到了吗?", "感觉明明按键了但是没反应?你真的按到了吗?",
"感觉自己速度到上限了?试着把das调低一点", "感觉自己速度到上限了?试着把das调低一点",
"感谢群友帮忙想tip", "感谢群友帮忙想tip",
"感谢Orzmic为这个tip显示框提出意见", "感谢Orzmic为这个tip显示框提出意见",
"感谢Phigros提供部分tip模板(",
"刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的", "刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
"刚开始练全隐形可以尽量堆平,留一列消四", "刚开始练全隐形可以尽量堆平,留一列消四",
"隔断消除即将到来!", "隔断消除即将到来!",
@@ -853,12 +895,13 @@ return{
"更小的DAS和ARR拥有更高的操作上限(能控制得了的话)", "更小的DAS和ARR拥有更高的操作上限(能控制得了的话)",
"更新内容在游戏里和群公告都有写!", "更新内容在游戏里和群公告都有写!",
"攻击生效速度(从快到慢):消二/三,消四,spin,高连击", "攻击生效速度(从快到慢):消二/三,消四,spin,高连击",
"官网在做了",
"还能写些什么tip呢", "还能写些什么tip呢",
"好像还没人能用脚打块打到一定水平", "好像还没人能用脚打块打到一定水平",
"好像可以把手机倒过来打场地旋转180...那还是不建议违反规则", "好像可以把手机倒过来打场地旋转180...那还是不建议违反规则",
"很有精神!", "很有精神!",
"混合消除即将到来!", "混合消除即将到来!",
"基础堆叠和挖掘能力非常重要,忽视这两项的人都后悔了(确信)",
"激烈的竞争不应充斥整个游戏",
"即使被顶到天上了也不要放弃,每一行垃圾都有可能成为你的武器", "即使被顶到天上了也不要放弃,每一行垃圾都有可能成为你的武器",
"极简率决定了你大概的速度上限和相等手速下的放块速度", "极简率决定了你大概的速度上限和相等手速下的放块速度",
"假如生活欺骗了你,不要悲伤,不要心急,还有块陪着你", "假如生活欺骗了你,不要悲伤,不要心急,还有块陪着你",
@@ -867,6 +910,7 @@ return{
"健康小贴士:不要熬夜,真的会猝死", "健康小贴士:不要熬夜,真的会猝死",
"健康小贴士:玩游戏多眨眼,不然会干眼病", "健康小贴士:玩游戏多眨眼,不然会干眼病",
"键位是可以自定义的", "键位是可以自定义的",
"键位有可能决定了上限,可能的话还是尽量考虑一下自己的键位是否利于超高速操作",
"觉得移动速度太慢或太快,手感不好?快去设置调整DAS/ARR", "觉得移动速度太慢或太快,手感不好?快去设置调整DAS/ARR",
"开启省流模式后将不会加载用户头像(应该能省不少流吧)", "开启省流模式后将不会加载用户头像(应该能省不少流吧)",
"快去打一把100%极简看看会怎样", "快去打一把100%极简看看会怎样",
@@ -880,23 +924,26 @@ return{
"免费吃鸡方块", "免费吃鸡方块",
"喵!", "喵!",
"魔方也是方块(确信", "魔方也是方块(确信",
"能导致吃键的问题有很多,建议说清楚具体发生了什么并且录视频说明",
"你的双手是为了你的一生服务的,而不是Techmino", "你的双手是为了你的一生服务的,而不是Techmino",
"你今天的人品值是:"..math.random(100), "你今天的人品值是:"..math.random(100),
"你可以从统计页面打开游戏存档目录", "你可以从统计页面打开游戏存档目录",
"你们考虑过Z酱的感受吗?没有!你们只考虑你自己。", "你们考虑过Z酱的感受吗?没有!你们只考虑你自己。",
"你说彩蛋?嗯…算是有,可以找找", "你说彩蛋?嗯…算是有,可以找找",
"你有一个好",
"你知道吗:看主页机器人玩可能比较费电", "你知道吗:看主页机器人玩可能比较费电",
"你知道吗:全程不使用任何旋转键完成40行模式是有可能的", "你知道吗:全程不使用任何旋转键完成40行模式是有可能的",
"你知道吗:全程不使用左右移动键完成40行模式是有可能的", "你知道吗:全程不使用左右移动键完成40行模式是有可能的",
"你知道吗:停留在模式地图界面很费电", "你知道吗:停留在模式地图界面很费电",
"你知道吗:在其他(方块)游戏相关场合提及本游戏是很不礼貌的",
"你准备好了吗?", "你准备好了吗?",
"其实很多时候\"吃键\"是玩家对游戏机制不了解或者自己的操作问题导致的",
"请勿大力敲打设备!敲坏了就没有Techmino玩了", "请勿大力敲打设备!敲坏了就没有Techmino玩了",
"请勿使用三只手游玩", "请勿使用三只手游玩",
"去玩别的方块的时候记得没有Ospin!", "去玩别的方块的时候记得没有Ospin!",
"全球应该没人能全S评价(大爆炸不算)", "全球应该没人能全S评价(大爆炸不算)",
"群友翻译的中文方块百科全书! tetris.huijiwiki.com", "群友翻译的中文方块百科全书! tetris.huijiwiki.com",
"让他三尺又何妨", "让他三尺又何妨",
"如果打开简洁模式那这个菜单就没有彩蛋了",
"如何O-spin: 一秒转626圈(误", "如何O-spin: 一秒转626圈(误",
"三连块只有2种", "三连块只有2种",
"三岁通关困难马拉松", "三岁通关困难马拉松",
@@ -909,6 +956,7 @@ return{
"睡眠不足会引起不可逆的脑损伤(变傻)", "睡眠不足会引起不可逆的脑损伤(变傻)",
"四连块总共7种", "四连块总共7种",
"虽然极简连击和极简率计算看着很怪,但以后你会发现还挺科学!", "虽然极简连击和极简率计算看着很怪,但以后你会发现还挺科学!",
"所有大道理tip都是亲眼目睹后加的,如果觉得多余说明就不是给你看的呀!消消气",
"提前旋转等功能可以用来救命", "提前旋转等功能可以用来救命",
"天哪,我竟然是一条凑数tip", "天哪,我竟然是一条凑数tip",
"退一步海阔天空", "退一步海阔天空",
@@ -917,6 +965,7 @@ return{
"玩得开心的话游戏作者也会很开心哦", "玩得开心的话游戏作者也会很开心哦",
"为了保护玩家们的健康,本游戏有一个临时的简易防沉迷系统!(不过估计你也触发不了/笑)", "为了保护玩家们的健康,本游戏有一个临时的简易防沉迷系统!(不过估计你也触发不了/笑)",
"为什么关卡那么少!因为前一模式成绩连D都没达到,再加把劲吧~", "为什么关卡那么少!因为前一模式成绩连D都没达到,再加把劲吧~",
"为数不多走向世界的国产方块游戏",
"我曾经在极度愤怒的时候15秒消了40行", "我曾经在极度愤怒的时候15秒消了40行",
"我们联合!", "我们联合!",
"我们是不是第一个在方块游戏做tip的?", "我们是不是第一个在方块游戏做tip的?",
@@ -932,6 +981,7 @@ return{
"希望你们都能喜欢Z…哦不是,喜欢Techmino", "希望你们都能喜欢Z…哦不是,喜欢Techmino",
"喜欢本游戏的话可以到应用商…好像没上架呢还", "喜欢本游戏的话可以到应用商…好像没上架呢还",
"享受Tech的特色旋转系统!", "享受Tech的特色旋转系统!",
"向无关人员推荐这个游戏会对本游戏的生存环境造成影响",
"写不出那种很酷的音乐(哭", "写不出那种很酷的音乐(哭",
"旋转不是变形!请尽量灵活利用顺逆时针两个旋转键!", "旋转不是变形!请尽量灵活利用顺逆时针两个旋转键!",
"学会使用两个旋转键,三个更好", "学会使用两个旋转键,三个更好",
@@ -939,7 +989,9 @@ return{
"要盯着bug不放", "要盯着bug不放",
"音乐使用beepbox制作", "音乐使用beepbox制作",
"音游方块是一家(暴论", "音游方块是一家(暴论",
"游戏使用love2d引擎制作", "游戏使用LÖVE引擎制作",
"游戏使用un...LÖVE引擎制作",
"游戏也是一种艺术形式",
"游戏中左下角三个信息分别是分数/时间/极简连击数", "游戏中左下角三个信息分别是分数/时间/极简连击数",
"有建议的话可以把信息反馈给作者~", "有建议的话可以把信息反馈给作者~",
"有三个隐藏模式不能从地图进入,到处找找看吧", "有三个隐藏模式不能从地图进入,到处找找看吧",
@@ -950,10 +1002,11 @@ return{
"众所周知俄罗斯方块是经典编程练手游戏(?", "众所周知俄罗斯方块是经典编程练手游戏(?",
"注意到方块\"旋转\"的时候到底发生了些什么吗?", "注意到方块\"旋转\"的时候到底发生了些什么吗?",
"自定义场地可以画图实现逐页演示", "自定义场地可以画图实现逐页演示",
"总共有300条tip哦", "总共有将近400条tip哦",
"作者40行sub26了", "作者40行sub26了",
"作者电脑上装了10个方块", "作者电脑上装了10个方块",
"作者浏览器收藏夹里有6个方块", "作者浏览器收藏夹里有6个方块",
"做,做碌鸠啊做,打块先啦!",
"做点击特效的时候真没想抄Phigros!想法另有出处,做完了才突然发现好像(", "做点击特效的时候真没想抄Phigros!想法另有出处,做完了才突然发现好像(",
"ALLSPIN!", "ALLSPIN!",
"Am G F G", "Am G F G",
@@ -998,6 +1051,7 @@ return{
"sin2α=2SαCα", "sin2α=2SαCα",
"sofunhowtoget", "sofunhowtoget",
"Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给我们打赞助支持开发哦~", "Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给我们打赞助支持开发哦~",
"STSD必死",
"SΔABC=√(h(h-a)(h-b)(h-c)), h=(a+b+c)/2", "SΔABC=√(h(h-a)(h-b)(h-c)), h=(a+b+c)/2",
"Techmino = Technique + tetromino", "Techmino = Technique + tetromino",
"Techmino 好玩!", "Techmino 好玩!",
@@ -1005,6 +1059,7 @@ return{
"Techmino console了解一下", "Techmino console了解一下",
"Techmino n.铁壳米诺(游戏名)", "Techmino n.铁壳米诺(游戏名)",
"Techmino安卓下载", "Techmino安卓下载",
"Techmino不是工业产品也不是练手程序,是游戏作品(至少目前是,嗯…)",
"Techmino好玩!", "Techmino好玩!",
"Techmino生日不太清楚,那就定在2019.6.26吧", "Techmino生日不太清楚,那就定在2019.6.26吧",
"Techmino也有节日主题了哦", "Techmino也有节日主题了哦",
@@ -1051,19 +1106,13 @@ return{
{C.G,"快捷键: Ctrl+W=关闭当前标签页"}, {C.G,"快捷键: Ctrl+W=关闭当前标签页"},
{C.G,"快捷键: shift+del=永久删除文件 (技术人员别杠)"}, {C.G,"快捷键: shift+del=永久删除文件 (技术人员别杠)"},
{C.G,"GREEN"}, {C.G,"GREEN"},
{C.H,"感谢Phigros提供部分tip模板("},
{C.H,"暂定段位:9"}, {C.H,"暂定段位:9"},
{C.H,"REGRET!!"}, {C.H,"REGRET!!"},
{C.J,"JADE"}, {C.J,"JADE"},
{C.L,"LIME"}, {C.L,"LIME"},
{C.lC,"26连T2来一个?"}, {C.lC,"26连T2来一个?"},
{C.lC,"Xspin",C.Z,"是啥"}, {C.lC,"Xspin",C.Z,"是啥"},
{C.lH,"腱鞘炎警告"}, {C.lP,"秘密数字:626"},
{C.lH,"没学过编曲,音乐都是自己瞎写的,觉得不好听就去设置关了吧"},
{C.lH,"秘密数字:626"},
{C.lH,"你有一个好"},
{C.lH,"STSD必死"},
{C.lH,"Techmino没有抽卡没有氪金,太良心了"},
{C.lP,"Naki",C.Z," 可爱!"}, {C.lP,"Naki",C.Z," 可爱!"},
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"}, {C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},
{C.lS,"茶娘",C.Z," 可爱!"}, {C.lS,"茶娘",C.Z," 可爱!"},
@@ -1104,5 +1153,48 @@ return{
{C.Z,"效率药水",C.H," 效率提升 (8:00)"}, {C.Z,"效率药水",C.H," 效率提升 (8:00)"},
{C.Z,"协调药水",C.H," MD减少 II(1:30)"}, {C.Z,"协调药水",C.H," MD减少 II(1:30)"},
-- "Z酱 可爱!", -- "Z酱 可爱!",
{C.dH,"100apm?你倒是不用开局定式连续打几把"},
{C.dH,"10连pc不是随手?"},
{C.dH,"20G很难?换谁多练练都行吧。"},
{C.dH,"20TSD不是轻松?"},
{C.dH,"3pps不是人均水平?"},
{C.dH,"40行还要40多秒,就这?"},
{C.dH,"别动不动大惊小怪,就这场面谁没见过"},
{C.dH,"别会个c4w就以为自己多强,基本功之一罢了。"},
{C.dH,"别人用跳舞毯打得都比你好"},
{C.dH,"别人只用一只手都能玩,你呢?"},
{C.dH,"不会有人以为S和Z只有两个方向吧"},
{C.dH,"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?"},
{C.dH,"单旋没前途的,别玩了"},
{C.dH,"还搁这玩手机呢,作业做完了?"},
{C.dH,"极限20G不是随手通?"},
{C.dH,"腱鞘炎警告"},
{C.dH,"经典块的水也很深,不要小看经典块玩家"},
{C.dH,"经典块跟现代块是两个游戏,别拿多少年前的水平秀,何况你也没见过厉害的,请从头练起。"},
{C.dH,"经典块和渣方块是两个概念"},
{C.dH,"觉得Techmino好玩是你的幸运,不是你有优越感的理由"},
{C.dH,"卖弱和谦虚不是一回事,请看场合。"},
{C.dH,"满口PCDT信天翁,还会点别的么?"},
{C.dH,"没那水平别天天整什么花里胡哨的,人家玩了几年你想几天赶上?"},
{C.dH,"没学过编曲,音乐都是自己瞎写的,觉得不好听就去设置关了吧"},
{C.dH,"请自己先搞搞清楚再去教别人"},
{C.dH,"全隐40行全消四很难吗??"},
{C.dH,"少玩点游戏,多注意眨眼和休息,瞎了别怪没提醒你"},
{C.dH,"设置都看过一遍了吗?在那提老早就做好了的东西,谁的问题?"},
{C.dH,"谁说一定要强的人才叫卖弱?不是最菜就一定在有人眼中是卖弱"},
{C.dH,"双旋和极简尽早学起来…懒得学以后亏的是自己"},
{C.dH,"说了多练就去多练,想着几天变神仙,当自己是谁?"},
{C.dH,"天天催更催更,你咋不来帮忙开发啊,真以为作者很强催啥都能有?"},
{C.dH,"天天卖弱,你一定把把150apm吧?"},
{C.dH,"问怎么练就好好问,别就一句话怎么变强,鬼知道你现在什么水平"},
{C.dH,"先练基础不听,现在速度没有,Tspin完地形一塌糊涂,开心吗?"},
{C.dH,"一口一个wtcl还不赶紧去练,你是不思进取还是不想好好说话?"},
{C.dH,"隐形很难?上电视那个水平一般都打成那样,属实自己不行看不起别人"},
{C.dH,"隐形哪难了,你练了吗?没专门练几个小时就说难是不是也太没耐心了点"},
{C.dH,"有问题建议先找找是不是自己的问题,那么多人就你事多?"},
{C.dH,"这不是休闲游戏…别怪关卡要求太高,就是你菜,请多练。"},
{C.dH,"这年头不会双旋还敢跟人打对战?"},
{C.dH,"整天卖弱必天打雷劈"},
{C.dH,"Techmino没有抽卡没有氪金没有逼肝,良不良心不言自明"},
} }
} }

View File

@@ -48,14 +48,7 @@ return{
"非极简操作:", "非极简操作:",
}, },
radar={"","","","","",""}, radar={"","","","","",""},
radarData={ radarData={"防/分","守/分","攻/分","送/分","行/分","挖/分"},
"防/分",
"综/分",
"攻/分",
"送/分",
"行/分",
"挖/分",
},
WidgetText={ WidgetText={
mode={ mode={
mod="模组(F1)", mod="模组(F1)",
@@ -79,8 +72,7 @@ return{
}, },
customGame={ customGame={
mod="模组(F1)", mod="模组(F1)",
},
custom_advance={
nextCount="预览个数", nextCount="预览个数",
holdCount="暂存个数", holdCount="暂存个数",
infHold="无限暂存", infHold="无限暂存",
@@ -153,7 +145,7 @@ return{
['dig_400l']= {"挖掘", "400L", "挖掘400行"}, ['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['dig_1000l']= {"挖掘", "1000L", "挖掘1000行"}, ['dig_1000l']= {"挖掘", "1000L", "挖掘1000行"},
['drought_n']= {"干旱", "100行", "你I没了"}, ['drought_n']= {"干旱", "100行", "你I没了"},
['drought_l']= {"干旱", "100行", "后 妈 发 牌"}, ['drought_l']= {"干旱+", "100行", "后 妈 发 牌"},
['marathon_n']= {"马拉松", "普通", "200行加速马拉松"}, ['marathon_n']= {"马拉松", "普通", "200行加速马拉松"},
['marathon_h']= {"马拉松", "困难", "200行高速马拉松"}, ['marathon_h']= {"马拉松", "困难", "200行高速马拉松"},
['solo_e']= {"单挑", "简单", "打败机器人"}, ['solo_e']= {"单挑", "简单", "打败机器人"},
@@ -206,6 +198,7 @@ return{
['pc_n']= {"全清挑战", "普通", "100行内刷全清"}, ['pc_n']= {"全清挑战", "普通", "100行内刷全清"},
['pc_h']= {"全清挑战", "困难", "100行内刷全清"}, ['pc_h']= {"全清挑战", "困难", "100行内刷全清"},
['pc_l']= {"全清挑战", "疯狂", "100行内刷全清"}, ['pc_l']= {"全清挑战", "疯狂", "100行内刷全清"},
['pc_inf']= {"无尽全清挑战", "", "你能连续做多少PC?"},
['tech_n']= {"科研", "普通", "禁止断B2B"}, ['tech_n']= {"科研", "普通", "禁止断B2B"},
['tech_n_plus']= {"科研", "普通+", "仅允许回旋与全清"}, ['tech_n_plus']= {"科研", "普通+", "仅允许回旋与全清"},
['tech_h']= {"科研", "困难", "禁止断B2B"}, ['tech_h']= {"科研", "困难", "禁止断B2B"},
@@ -227,6 +220,7 @@ return{
['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"}, ['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"},
['sprintFix']= {"竞速", "无移动"}, ['sprintFix']= {"竞速", "无移动"},
['sprintLock']= {"竞速", "无旋转"}, ['sprintLock']= {"竞速", "无旋转"},
['sprintSmooth']= {"竞速", "无摩擦"},
['marathon_bfmax']= {"马拉松", "极限"}, ['marathon_bfmax']= {"马拉松", "极限"},
['custom_clear']= {"自定义", "普通"}, ['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"}, ['custom_puzzle']= {"自定义", "拼图"},

View File

@@ -39,7 +39,7 @@ Attack system:
Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher, Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher,
and +2 extra blocking. and +2 extra blocking.
Combos: All damage above will be given a (combo x25%) bonus, or (combo x15% for Single clear) (capped at 12 combo), Combos: All damage above will be given a (combo x25%) bonus, or (combo x15%) for Single clear (capped at 12 combo),
+1 more attack for 3 Combo or more. +1 more attack for 3 Combo or more.
After calculating all above, the damage value will be rounded down then sent After calculating all above, the damage value will be rounded down then sent

View File

@@ -1,3 +1,4 @@
do--title
title={ title={
{ {
53, 60, 53, 60,
@@ -118,7 +119,7 @@ for _,C in next,title do
C[i]=C[i]*.1626 C[i]=C[i]*.1626
end end
end end
end
do--title_fan do--title_fan
title_fan={} title_fan={}
local sin,cos=math.sin,math.cos local sin,cos=math.sin,math.cos
@@ -136,7 +137,6 @@ do--title_fan
end end
end end
end end
do--missionEnum do--missionEnum
missionEnum={ missionEnum={
_1=01,_2=02,_3=03,_4=04, _1=01,_2=02,_3=03,_4=04,
@@ -154,18 +154,13 @@ do--missionEnum
for k,v in next,missionEnum do L[v]=k end for k,v in next,missionEnum do L[v]=k end
for k,v in next,L do missionEnum[k]=v end for k,v in next,L do missionEnum[k]=v end
end end
do--drawableText do--drawableText
local function T(s,t)return love.graphics.newText(getFont(s),t)end local function T(s,t)return love.graphics.newText(getFont(s),t)end
drawableText={ drawableText={
question=T(100,"?"),
small=T(30,"<"),large=T(30,">"),
bpm=T(15,"BPM"),kpm=T(15,"KPM"),
modeName=T(30), modeName=T(30),
anykey=T(40), anykey=T(40),
replaying=T(20), replaying=T(20),
next=T(40),hold=T(40),
win=T(120),lose=T(120), win=T(120),lose=T(120),
finish=T(120), finish=T(120),
gamewin=T(100),gameover=T(100),pause=T(120), gamewin=T(100),gameover=T(100),pause=T(120),
@@ -181,7 +176,6 @@ do--drawableText
noScore=T(45),highScore=T(30), noScore=T(45),highScore=T(30),
} }
end end
do--BLOCKS do--BLOCKS
local O,_=true,false local O,_=true,false
BLOCKS={ BLOCKS={
@@ -244,7 +238,6 @@ do--BLOCKS
end end
end end
end end
do--SCS(spinCenters) do--SCS(spinCenters)
local N1,N2,N3,N4={0,1},{1,0},{1,1},{.5,.5} 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 I1,I2,I3,I4={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}
@@ -293,7 +286,6 @@ do--SCS(spinCenters)
{[0]=D,D,D,D},--O1 {[0]=D,D,D,D},--O1
} }
end end
rankColor={ rankColor={
{.6,.3,.3}, {.6,.3,.3},
{.7,.5,.3}, {.7,.5,.3},
@@ -301,7 +293,6 @@ rankColor={
{.6,.9,1}, {.6,.9,1},
{.95,.95,.5}, {.95,.95,.5},
} }
minoColor={ minoColor={
COLOR.R,COLOR.F,COLOR.O,COLOR.Y,COLOR.L,COLOR.J,COLOR.G,COLOR.A, COLOR.R,COLOR.F,COLOR.O,COLOR.Y,COLOR.L,COLOR.J,COLOR.G,COLOR.A,
COLOR.C,COLOR.N,COLOR.S,COLOR.B,COLOR.V,COLOR.P,COLOR.M,COLOR.W, COLOR.C,COLOR.N,COLOR.S,COLOR.B,COLOR.V,COLOR.P,COLOR.M,COLOR.W,

View File

@@ -77,12 +77,13 @@ return{
{name='c4wtrain_n', x=700, y=-400, size=40,shape=1,icon="pc",unlock={'c4wtrain_l'}}, {name='c4wtrain_n', x=700, y=-400, size=40,shape=1,icon="pc",unlock={'c4wtrain_l'}},
{name='c4wtrain_l', x=900, y=-400, size=40,shape=1,icon="pc"}, {name='c4wtrain_l', x=900, y=-400, size=40,shape=1,icon="pc"},
{name='pctrain_n', x=700, y=-220, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}}, {name='pctrain_n', x=700, y=-250, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
{name='pctrain_l', x=900, y=-220, size=40,shape=1,icon="pc"}, {name='pctrain_l', x=900, y=-250, size=40,shape=1,icon="pc"},
{name='pc_n', x=800, y=-100, size=40,shape=1,icon="pc", unlock={'pc_h'}}, {name='pc_n', x=800, y=-110, size=40,shape=1,icon="pc", unlock={'pc_h'}},
{name='pc_h', x=1000, y=-100, size=40,shape=3,icon="pc", unlock={'pc_l'}}, {name='pc_h', x=950, y=-110, size=40,shape=3,icon="pc", unlock={'pc_l','pc_inf'}},
{name='pc_l', x=1200, y=-100, size=40,shape=2,icon="pc"}, {name='pc_l', x=1100, y=-110, size=40,shape=3,icon="pc"},
{name='pc_inf', x=1100, y=-250, size=40,shape=2,icon="pc"},
{name='tech_n', x=400, y=-150, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h','tech_finesse'}}, {name='tech_n', x=400, y=-150, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h','tech_finesse'}},
{name='tech_n_plus', x=600, y=160, size=40,shape=3,icon="tech", unlock={'tsd_e','backfire_n'}}, {name='tech_n_plus', x=600, y=160, size=40,shape=3,icon="tech", unlock={'tsd_e','backfire_n'}},
@@ -110,10 +111,11 @@ return{
{name='sprintFix'}, {name='sprintFix'},
{name='sprintLock'}, {name='sprintLock'},
{name='sprintSmooth'},
{name='marathon_bfmax'}, {name='marathon_bfmax'},
{name='custom_puzzle'}, {name='custom_puzzle'},
{name='custom_clear'}, {name='custom_clear'},
{name="netBattle"}, {name="netBattle"},
} }

View File

@@ -8,20 +8,18 @@ return{
task=function(P) task=function(P)
while true do while true do
YIELD() YIELD()
if P.control and P.atkBuffer.sum==0 then if P.control and P.atkBufferSum==0 then
local p=#P.atkBuffer+1 local D=P.modeData
local B,D=P.atkBuffer,P.modeData
local t
if D.wave<20 then if D.wave<20 then
t=1500-30*D.wave--1500~900 local t=1500-30*D.wave--1500~900
B[p]= {line=generateLine(P:RND(4,7)),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3})
B[p+1]= {line=generateLine(P:RND(3,8)),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4})
else else
t=900-10*(D.wave-20)--900~600 local t=900-10*(D.wave-20)--900~600
B[p]= {line=generateLine(P:RND(10)),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=4} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=4})
B[p+1]= {line=generateLine(P:RND(4,7)),amount=8,countdown=t,cd0=t,time=0,sent=false,lv=5} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=8,countdown=t,cd0=t,time=0,sent=false,lv=5})
end end
B.sum=B.sum+22 P.atkBufferSum=P.atkBufferSum+22
P.stat.recv=P.stat.recv+22 P.stat.recv=P.stat.recv+22
D.wave=D.wave+1 D.wave=D.wave+1
if D.wave%10==0 then if D.wave%10==0 then

View File

@@ -7,25 +7,24 @@ return{
task=function(P) task=function(P)
while true do while true do
YIELD() YIELD()
if P.control and P.atkBuffer.sum<4 then if P.control and P.atkBufferSum<4 then
local p=#P.atkBuffer+1 local D=P.modeData
local B,D=P.atkBuffer,P.modeData
local s local s
local t=800-10*D.wave--800~700~600~500 local t=800-10*D.wave--800~700~600~500
if D.wave<10 then if D.wave<10 then
B[p]= {line=generateLine(P:RND(5,6)),amount=9,countdown=t,cd0=t,time=0,sent=false,lv=3} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(5,6)),amount=9,countdown=t,cd0=t,time=0,sent=false,lv=3})
B[p+1]= {line=generateLine(P:RND(4,7)),amount=11,countdown=t,cd0=t+62,time=0,sent=false,lv=4} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=11,countdown=t,cd0=t+62,time=0,sent=false,lv=4})
s=20 s=20
elseif D.wave<20 then elseif D.wave<20 then
B[p]= {line=generateLine(P:RND(3,8)),amount=11,countdown=t,cd0=t,time=0,sent=false,lv=4} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=11,countdown=t,cd0=t,time=0,sent=false,lv=4})
B[p+1]= {line=generateLine(P:RND(4,7)),amount=13,countdown=t,cd0=t+62,time=0,sent=false,lv=5} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=13,countdown=t,cd0=t+62,time=0,sent=false,lv=5})
s=24 s=24
else else
B[p]= {line=generateLine(P:RND(2)*9-8),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=5} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(2)*9-8),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=5})
B[p+1]= {line=generateLine(P:RND(3,8)),amount=14,countdown=t+62,cd0=t,time=0,sent=false,lv=5} table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=14,countdown=t+62,cd0=t,time=0,sent=false,lv=5})
s=28 s=28
end end
B.sum=B.sum+s P.atkBufferSum=P.atkBufferSum+s
P.stat.recv=P.stat.recv+s P.stat.recv=P.stat.recv+s
D.wave=D.wave+1 D.wave=D.wave+1
if D.wave%10==0 then if D.wave%10==0 then

View File

@@ -5,7 +5,7 @@ return{
freshLimit=15, freshLimit=15,
dropPiece=function(P) dropPiece=function(P)
if P.lastPiece.atk>0 then if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,60,generateLine(P:RND(10))) P:receive(nil,P.lastPiece.atk,60,generateLine(P.holeRND:random(10)))
end end
if P.stat.atk>=100 then if P.stat.atk>=100 then
P:win('finish') P:win('finish')

View File

@@ -5,7 +5,7 @@ return{
freshLimit=15, freshLimit=15,
dropPiece=function(P) dropPiece=function(P)
if P.lastPiece.atk>0 then if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,30,generateLine(P:RND(10))) P:receive(nil,P.lastPiece.atk,30,generateLine(P.holeRND:random(10)))
end end
if P.stat.atk>=100 then if P.stat.atk>=100 then
P:win('finish') P:win('finish')

View File

@@ -4,7 +4,7 @@ return{
drop=30,lock=60, drop=30,lock=60,
dropPiece=function(P) dropPiece=function(P)
if P.lastPiece.atk>0 then if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,120,generateLine(P:RND(10))) P:receive(nil,P.lastPiece.atk,120,generateLine(P.holeRND:random(10)))
end end
if P.stat.atk>=100 then if P.stat.atk>=100 then
P:win('finish') P:win('finish')

View File

@@ -5,7 +5,7 @@ return{
freshLimit=10, freshLimit=10,
dropPiece=function(P) dropPiece=function(P)
if P.lastPiece.atk>0 then if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,0,generateLine(P:RND(10))) P:receive(nil,P.lastPiece.atk,0,generateLine(P.holeRND:random(10)))
end end
if P.stat.atk>=100 then if P.stat.atk>=100 then
P:win('finish') P:win('finish')

View File

@@ -22,8 +22,11 @@ return{
setFont(75) setFont(75)
mStr(P.stat.row,69,220) mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340) mStr(P.stat.clears[4],69,340)
gc.setColor(1,1,1,.2) gc.push('transform')
gc.draw(IMG.electric,124,106,0,2.6) PLY.draw.applyFieldOffset(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
gc.pop()
end, end,
score=function(P)return{min(P.stat.row,200),P.stat.time}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, scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -23,8 +23,11 @@ return{
setFont(75) setFont(75)
mStr(P.stat.row,69,220) mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340) mStr(P.stat.clears[4],69,340)
gc.setColor(1,1,1,.2) gc.push('transform')
gc.draw(IMG.electric,124,106,0,2.6) PLY.draw.applyFieldOffset(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
gc.pop()
end, end,
score=function(P)return{min(P.stat.row,200),P.stat.time}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, scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -19,8 +19,11 @@ return{
setFont(75) setFont(75)
mStr(P.stat.row,69,220) mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340) mStr(P.stat.clears[4],69,340)
gc.setColor(1,1,1,.2) gc.push('transform')
gc.draw(IMG.electric,124,106,0,2.6) PLY.draw.applyFieldOffset(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
gc.pop()
end, end,
score=function(P)return{min(P.stat.row,200),P.stat.time}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, scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -22,8 +22,11 @@ return{
setFont(75) setFont(75)
mStr(P.stat.row,69,220) mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340) mStr(P.stat.clears[4],69,340)
gc.setColor(1,1,1,.2) gc.push('transform')
gc.draw(IMG.electric,124,106,0,2.6) PLY.draw.applyFieldOffset(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
gc.pop()
end, end,
score=function(P)return{min(P.stat.row,100),P.stat.time}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, scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,

View File

@@ -16,28 +16,26 @@ return{
load=function() load=function()
PLY.newPlayer(1) PLY.newPlayer(1)
if SETTING.sfx_spawn==0 then if SETTING.sfx_spawn==0 then
LOG.print(text.switchSpawnSFX,COLOR.Y) LOG.print(text.switchSpawnSFX,'warn')
end end
end, end,
mesDisp=function(P) mesDisp=function(P)
if not GAME.result then if not GAME.result then
gc.push('transform')
if GAME.replaying then if GAME.replaying then
gc.setColor(.3,.3,.3,.7)
gc.push('transform')
gc.origin() gc.origin()
gc.setColor(.3,.3,.3,.7)
gc.rectangle('fill',0,0,SCR.w,SCR.h) gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.pop()
else else
gc.clear(.26,.26,.26) gc.clear(.2,.2,.2)
--Frame
gc.setColor(.5,.5,.5)
gc.push('transform')
gc.translate(150,0) gc.translate(150,0)
gc.setColor(.5,.5,.5)
--Frame
gc.rectangle('line',-1,-11,302,612)--Boarder gc.rectangle('line',-1,-11,302,612)--Boarder
gc.rectangle('line',301,-3,15,604)--AtkBuffer boarder gc.rectangle('line',301,-3,15,604)--AtkBuffer boarder
gc.rectangle('line',-16,-3,15,604)--B2b bar boarder gc.rectangle('line',-16,-3,15,604)--B2b bar boarder
gc.pop()
end end
gc.pop()
end end
--Figures --Figures

View File

@@ -37,18 +37,18 @@ return{
P.visTime[i]=FREEROW.get(20) P.visTime[i]=FREEROW.get(20)
for x=4,7 do F[i][x]=0 end for x=4,7 do F[i][x]=0 end
end end
if P:RND()<.6 then if P.holeRND:random()<.6 then
local initCell={11,14,12,13,21,24} local initCell={11,14,12,13,21,24}
for _=1,3 do for _=1,3 do
_=rem(initCell,P:RND(#initCell)) _=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20 F[math.floor(_/10)][3+_%10]=20
end end
else else
local initCell={11,12,13,14,21,22,23,24} local initCell={11,12,13,14,21,22,23,24}
rem(initCell,P:RND(5,8)) rem(initCell,P.holeRND:random(5,8))
rem(initCell,P:RND(1,4)) rem(initCell,P.holeRND:random(1,4))
for _=1,6 do for _=1,6 do
_=rem(initCell,P:RND(#initCell)) _=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20 F[math.floor(_/10)][3+_%10]=20
end end
end end

View File

@@ -35,18 +35,18 @@ return{
P.visTime[i]=FREEROW.get(20) P.visTime[i]=FREEROW.get(20)
for x=4,7 do F[i][x]=0 end for x=4,7 do F[i][x]=0 end
end end
if P:RND()<.6 then if P.holeRND:random()<.6 then
local initCell={11,14,12,13,21,24} local initCell={11,14,12,13,21,24}
for _=1,3 do for _=1,3 do
_=rem(initCell,P:RND(#initCell)) _=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20 F[math.floor(_/10)][3+_%10]=20
end end
else else
local initCell={11,12,13,14,21,22,23,24} local initCell={11,12,13,14,21,22,23,24}
rem(initCell,P:RND(5,8)) rem(initCell,P.holeRND:random(5,8))
rem(initCell,P:RND(1,4)) rem(initCell,P.holeRND:random(1,4))
for _=1,6 do for _=1,6 do
_=rem(initCell,P:RND(#initCell)) _=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20 F[math.floor(_/10)][3+_%10]=20
end end
end end

View File

@@ -31,10 +31,10 @@ local function checkClear(P)
D.finished=D.finished+1 D.finished=D.finished+1
if FIELD[D.finished+1]then if FIELD[D.finished+1]then
P.waiting=26 P.waiting=26
for _=#P.field,1,-1 do for i=#P.field,1,-1 do
FREEROW.discard(P.field[_]) FREEROW.discard(P.field[i])
FREEROW.discard(P.visTime[_]) FREEROW.discard(P.visTime[i])
P.field[_],P.visTime[_]=nil P.field[i],P.visTime[i]=nil
end end
setField(P,D.finished+1) setField(P,D.finished+1)
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6) SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6)
@@ -50,24 +50,20 @@ return{
load=function() load=function()
applyCustomGame() applyCustomGame()
local ENV=GAME.modeEnv
ENV.dropPiece=PLY.check_lineReach
for y=1,20 do for y=1,20 do
if notAir(FIELD[1][y])then if notAir(FIELD[1][y])then
--Switch clear sprint mode on --Switch clear sprint mode on
ENV.dropPiece=checkClear GAME.modeEnv.dropPiece=checkClear
break break
end end
end end
PLY.newPlayer(1) PLY.newPlayer(1)
local AItype=ENV.opponent:sub(1,2) local AItype=GAME.modeEnv.opponent:sub(1,2)
local AIlevel=tonumber(ENV.opponent:sub(-1)) local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-1))
if AItype=='9S'then if AItype=='9S'then
ENV.target=nil
PLY.newAIPlayer(2,AIBUILDER('9S',2*AIlevel)) PLY.newAIPlayer(2,AIBUILDER('9S',2*AIlevel))
elseif AItype=='CC'then elseif AItype=='CC'then
ENV.target=nil
PLY.newAIPlayer(2,AIBUILDER('CC',2*AIlevel-1,math.floor(AIlevel*.5+1),true,20000+5000*AIlevel)) PLY.newAIPlayer(2,AIBUILDER('CC',2*AIlevel-1,math.floor(AIlevel*.5+1),true,20000+5000*AIlevel))
end end
@@ -77,12 +73,7 @@ return{
end, end,
mesDisp=function(P) mesDisp=function(P)
setFont(55) setFont(55)
if P.modeData.target>1e10 then
mStr(P.stat.row,69,225) mStr(P.stat.row,69,225)
mText(drawableText.line,69,290) mText(drawableText.line,69,290)
else
local R=P.modeData.target-P.stat.row
mStr(R>=0 and R or 0,69,240)
end
end, end,
} }

View File

@@ -39,10 +39,9 @@ return{
}, },
load=function() load=function()
applyCustomGame() applyCustomGame()
local AItype=GAME.modeEnv.opponent:sub(1,2)
local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-1))
PLY.newPlayer(1) PLY.newPlayer(1)
local ENV=GAME.modeEnv
local AItype=ENV.opponent:sub(1,2)
local AIlevel=tonumber(ENV.opponent:sub(-1))
if AItype=='9S'then if AItype=='9S'then
PLY.newAIPlayer(2,AIBUILDER('9S',2*AIlevel)) PLY.newAIPlayer(2,AIBUILDER('9S',2*AIlevel))
elseif AItype=='CC'then elseif AItype=='CC'then

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