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:
push:
branches: [ ci ]
pull_request:
branches: [ ci ]
branches: [ main, ci ]
jobs:
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
with:
lfs: true
- name: Download love
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
- name: Download ColdClear
run: |
curl -LO https://github.com/26F-Studio/Techmino/releases/download/coldclear/coldclear.zip
7z x coldclear.zip -ocoldclear
move coldclear\win64\cold_clear.dll love-11.3-win64
move coldclear\win64\CCloader.dll love-11.3-win64
curl -OL https://github.com/26F-Studio/cold_clear_ai_love2d_wrapper/releases/download/20210520/win64.zip
7z x win64.zip -ocoldclear
move coldclear\cold_clear.dll love-11.3-win64
move coldclear\CCloader.dll love-11.3-win64
- name: Pack Techmino
shell: cmd
run: |
7z a game.zip BGM document image modes parts SFX VOICE Zframework conf.lua font.ttf main.lua
move game.zip game.love
7z a -tzip game.love document media parts Zframework conf.lua font.ttf main.lua
copy /b love-11.3-win64\love.exe + game.love love-11.3-win64\Techmino.exe
del love-11.3-win64\love.exe
del love-11.3-win64\lovec.exe
- name: Artifact
uses: actions/upload-artifact@v1.0.0
with:
name: Techmino_win64
name: Windows
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.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.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

View File

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

View File

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

View File

@@ -57,10 +57,10 @@ local COLOR={
white= {1.0, 1.0, 1.0},
}
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",
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",
D="black",dH="dGray",H="gray",lH="lGray",Z="white",
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',
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',
--Remain letter: EIKQTUX
}do
COLOR[k]=COLOR[v]
@@ -72,19 +72,19 @@ end})
do--Random generators
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
function COLOR.random_norm()
return COLOR[list_norm[rnd(len_list_norm)]]
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
function COLOR.random_bright()
return COLOR[list_bright[rnd(len_list_bright)]]
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
function COLOR.random_dark()
return COLOR[list_dark[rnd(len_list_dark)]]

View File

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

View File

@@ -21,7 +21,7 @@ function FILE.load(name)
return s
end
end
LOG.print(name.." "..text.loadError,COLOR.R)
LOG.print(name.." "..text.loadError,'error')
end
end
function FILE.save(data,name,mode)
@@ -50,11 +50,39 @@ function FILE.save(data,name,mode)
F:flush()F:close()
if success then
if not mode:find'q'then
LOG.print(text.saveDone,COLOR.G)
LOG.print(text.saveDone,'message')
end
else
LOG.print(text.saveError..(mes or"unknown error"),'error')
LOG.print(debug.traceback(),'error')
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

View File

@@ -3,21 +3,21 @@ EDITING=""
LOADED=false
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"
ADRAW=require"Zframework.aDraw"
mStr=ADRAW.str
mText=ADRAW.simpX
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"
TABLE=require"Zframework.tableExtend"
STRING=require"Zframework.stringExtend"
@@ -45,11 +45,12 @@ THEME= require"Zframework.theme"
local ms,kb=love.mouse,love.keyboard
local gc=love.graphics
local gc_push,gc_pop=gc.push,gc.pop
local gc_discard,gc_present=gc.discard,gc.present
local gc_setColor,gc_draw,gc_rectangle=gc.setColor,gc.draw,gc.rectangle
local gc_print=gc.print
local setFont=setFont
local gc_push,gc_pop,gc_clear=gc.push,gc.pop,gc.clear
local gc_replaceTransform,gc_present=gc.replaceTransform,gc.present
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_draw,gc_line,gc_print=gc.draw,gc.line,gc.print
local setFont,mStr=setFont,mStr
local int,rnd,abs=math.floor,math.random,math.abs
local min,sin=math.min,math.sin
@@ -64,18 +65,27 @@ joysticks={}
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 function updatePowerInfo()
local state,pow=love.system.getPowerInfo()
gc.setCanvas(infoCanvas)gc_push('transform')gc.origin()
gc.clear(0,0,0,.25)
gc.setCanvas(infoCanvas)
gc_push('transform')
gc.origin()
gc_clear(0,0,0,.25)
if state~='unknown'then
gc.setLineWidth(4)
gc_setLineWidth(4)
local charging=state=='charging'
if state=='nobattery'then
gc_setColor(1,1,1)
gc.setLineWidth(2)
gc.line(74,SCR.safeX+5,100,22)
gc_setLineWidth(2)
gc_line(74,SCR.safeX+5,100,22)
elseif pow then
if charging then gc_setColor(0,1,0)
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)
else gc_setColor(1,0,0)
end
gc_rectangle('fill',76,6,pow*.22,14)
gc.rectangle('fill',76,6,pow*.22,14)
if pow<100 then
setFont(15)
gc_setColor(0,0,0)
@@ -95,11 +105,12 @@ local function updatePowerInfo()
gc_print(pow,78,2)
end
end
gc_draw(IMG.batteryImage,73,3)
gc_draw(batteryImg,73,3)
end
setFont(25)
gc_print(os.date("%H:%M"),3,-5)
gc_pop()gc.setCanvas()
gc_pop()
gc.setCanvas()
end
-------------------------------------------------------------
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
if SCN.mouseMove then SCN.mouseMove(mx,my,dx,dy)end
if ms.isDown(1)then
WIDGET.drag(mx,my,dx,dy)
WIDGET.drag(mx,my,dx/SCR.k,dy/SCR.k)
else
WIDGET.cursorMove(mx,my)
end
@@ -145,7 +156,12 @@ function love.mousereleased(x,y,k,touch)
end
function love.wheelmoved(x,y)
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
function love.touchpressed(id,x,y)
@@ -153,6 +169,7 @@ function love.touchpressed(id,x,y)
if SCN.swapping then return end
if not touching then
touching=id
WIDGET.unFocus(true)
love.touchmoved(id,x,y,0,0)
end
x,y=xOy:inverseTransformPoint(x,y)
@@ -164,15 +181,10 @@ function love.touchmoved(_,x,y,dx,dy)
if SCN.swapping then return end
x,y=xOy:inverseTransformPoint(x,y)
if SCN.touchMove then SCN.touchMove(x,y,dx/SCR.k,dy/SCR.k)end
if WIDGET.sel then
if touching then
WIDGET.drag(x,y,dx,dy)
end
else
WIDGET.drag(x,y,dx/SCR.k,dy/SCR.k)
if touching then
WIDGET.cursorMove(x,y)
if not WIDGET.sel then
touching=false
end
if not WIDGET.sel then touching=false end
end
end
function love.touchreleased(id,x,y)
@@ -181,10 +193,9 @@ function love.touchreleased(id,x,y)
if id==touching then
WIDGET.press(x,y,1)
WIDGET.release(x,y)
WIDGET.cursorMove(x,y)
WIDGET.unFocus()
touching=false
if WIDGET.sel and not WIDGET.sel.keepFocus then
WIDGET.sel=false
end
end
if SCN.touchUp then SCN.touchUp(x,y)end
if(x-lastX)^2+(y-lastY)^2<62 then
@@ -197,7 +208,7 @@ local function noDevkeyPressed(key)
if key=="f1"then
PROFILE.switch()
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
for _=1,8 do
local P=PLY_ALIVE[rnd(#PLY_ALIVE)]
@@ -206,19 +217,27 @@ local function noDevkeyPressed(key)
P:lose()
end
end
elseif key=="f4"then if not kb.isDown("lalt","ralt")then LOG.copy()end
elseif key=="f5"then if WIDGET.sel then print(WIDGET.sel)end
elseif key=="f6"then for k,v in next,_G do print(k,v)end
elseif key=="f7"then if love._openConsole then love._openConsole()end
elseif key=="f8"then devMode=nil LOG.print("DEBUG OFF",COLOR.Y)
elseif key=="f9"then devMode=1 LOG.print("DEBUG 1",COLOR.Y)
elseif key=="f10"then devMode=2 LOG.print("DEBUG 2",COLOR.Y)
elseif key=="f11"then devMode=3 LOG.print("DEBUG 3",COLOR.Y)
elseif key=="f12"then devMode=4 LOG.print("DEBUG 4",COLOR.Y)
elseif key=="\\"then _G["\100\114\97\119\70\87\77"]=NULL
elseif key=="f4"and not kb.isDown("lalt","ralt")then
LOG.copy()
elseif key=="f5"then
print(WIDGET.isFocus()or"no widget selected")
elseif key=="f6"then
for k,v in next,_G do print(k,v)end
elseif key=="f7"and love._openConsole then
love._openConsole()
elseif key=="f8"then
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
if WIDGET.sel then
local W=WIDGET.sel
local W=WIDGET.sel
if W then
if key=="left"then W.x=W.x-10
elseif key=="right"then W.x=W.x+10
elseif key=="up"then W.y=W.y-10
@@ -244,9 +263,13 @@ function love.keypressed(key)
return
elseif key=="f8"then
devMode=1
LOG.print("DEBUG ON",COLOR.Y)
LOG.print("DEBUG ON",10)
elseif key=="f11"then
switchFullscreen()
if kb.isDown("lctrl","rctrl")then
_G["\100\114\97\119\70\87\77"]=NULL
else
switchFullscreen()
end
elseif not SCN.swapping then
if SCN.keyDown then
SCN.keyDown(key)
@@ -270,15 +293,14 @@ function love.textinput(texts)
end
function love.joystickadded(JS)
joysticks[#joysticks+1]=JS
ins(joysticks,JS)
LOG.print("Joystick added",'message')
end
function love.joystickremoved(JS)
for i=1,#joysticks do
if joysticks[i]==JS then
rem(joysticks,i)
LOG.print("Joystick removed",COLOR.Y)
return
end
local i=TABLE.find(joysticks,JS)
if i then
rem(joysticks,i)
LOG.print("Joystick removed",'message')
end
end
local keyMirror={
@@ -344,6 +366,7 @@ function love.resize(w,h)
SCR.resize(w,h)
if BG.resize then BG.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("h",h*SCR.dpi)
@@ -387,7 +410,7 @@ function love.errorhandler(msg)
if LOADED and #ERRDATA<3 then
BG.set('none')
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
love.filesystem.append("conf/error.log",
@@ -428,9 +451,9 @@ function love.errorhandler(msg)
SCR.resize(a,b)
end
end
gc.clear(.3,.5,.9)
gc_clear(.3,.5,.9)
gc_push('transform')
gc.replaceTransform(xOy)
gc_replaceTransform(SCR.xOy)
setFont(100)gc_print(":(",100,0,0,1.2)
setFont(40)gc.printf(errorMsg,100,160,SCR.w0-100)
setFont(20)
@@ -446,22 +469,53 @@ function love.errorhandler(msg)
end
end
end
local WS=WS
local WSnames={'app','user','play','stream','chat'}
local WScolor={
{1,.5,.5,.7},
{1,.8,.3,.7},
{1,1,.4,.7},
{.4,1,.7,.7},
{.5,.8,1,.7},
}
love.draw,love.update=nil--remove default draw/update
local devColor={
COLOR.Z,
COLOR.lM,
COLOR.lG,
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()
local love=love
@@ -470,7 +524,6 @@ function love.run()
local TEXTURE,TIME=TEXTURE,TIME
local SETTING,VERSION=SETTING,VERSION
local destroyPlayers=destroyPlayers
local STEP,WAIT=love.timer.step,love.timer.sleep
local FPS,MINI=love.timer.getFPS,love.window.isMinimized
@@ -512,12 +565,12 @@ function love.run()
TASK.update()
WS.update(dt)
VOC.update()
BG.update(dt)--BG animation
BG.update(dt)
SYSFX.update(dt)
WIDGET.update()--Widgets animation
if SCN.update then SCN.update(dt)end--Scene updater
if SCN.swapping then SCN.swapUpdate()end--Scene swapping animation
TEXT.update()--Update global texts animation
WIDGET.update()
if SCN.update then SCN.update(dt)end
if SCN.swapping then SCN.swapUpdate()end
TEXT.update()
LOG.update()
--DRAW
@@ -526,22 +579,14 @@ function love.run()
if FCT>=100 then
FCT=FCT-100
--Draw background
BG.draw()
gc_push('transform')
gc.replaceTransform(xOy)
--Draw scene contents
gc_replaceTransform(SCR.origin)
gc_setColor(1,1,1)
BG.draw()
gc_replaceTransform(SCR.xOy)
if SCN.draw then SCN.draw()end
--Draw widgets
WIDGET.draw()
--Draw Version string
gc_setColor(.8,.8,.8,.4)
setFont(20)
mStr(VERSION.string,640,693)
SYSFX.draw()
TEXT.draw()
--Draw cursor
if mouseShow then
@@ -551,83 +596,75 @@ function love.run()
_=SCS[R][0]
gc_draw(TEXTURE.miniBlock[R],mx,my,time%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5)
gc_setColor(1,1,1)
gc_draw(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
SYSFX.draw()
TEXT.draw()
gc_pop()
--Draw power info.
gc_setColor(1,1,1)
if SETTING.powerInfo then
gc_draw(infoCanvas,SCR.safeX,0,0,SCR.k)
end
--Draw scene swapping animation
if SCN.swapping then
_=SCN.stat
_.draw(_.time)
end
--Draw FPS
setFont(15)
_=SCR.h
gc_setColor(1,1,1)
gc_print(FPS(),SCR.safeX+5,_-20)
--Debug info.
if devMode then
--Left-down infos
gc_setColor(devColor[devMode])
gc_print("MEM "..gcinfo(),SCR.safeX+5,_-40)
gc_print("Lines "..FREEROW.getCount(),SCR.safeX+5,_-60)
gc_print("Cursor "..int(mx+.5).." "..int(my+.5),SCR.safeX+5,_-80)
gc_print("Voices "..VOC.getQueueCount(),SCR.safeX+5,_-100)
gc_print("Tasks "..TASK.getCount(),SCR.safeX+5,_-120)
--Update & draw frame time
ins(frameTimeList,1,dt)rem(frameTimeList,126)
gc_setColor(1,1,1,.3)
for i=1,#frameTimeList do
gc_rectangle('fill',150+2*i,_-20,2,-frameTimeList[i]*4000)
gc_replaceTransform(SCR.xOy_ul)
LOG.draw()
gc_replaceTransform(SCR.origin)
--Draw power info.
if SETTING.powerInfo then
gc_setColor(1,1,1)
gc_draw(infoCanvas,SCR.safeX,0,0,SCR.k)
end
--Websocket status
gc_push('transform')
gc.translate(SCR.w,SCR.h-100)
gc.scale(SCR.k)
for i=1,5 do
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_draw(TEXTURE.ws_dead,-20,20*i-20)
elseif status=='connecting'then
gc_setColor(1,1,1,.5+.3*sin(time*6.26))
gc_draw(TEXTURE.ws_connecting,-20,20*i-20)
elseif status=='running'then
gc_setColor(1,1,1)
gc_draw(TEXTURE.ws_running,-20,20*i-20)
--Draw scene swapping animation
if SCN.swapping then
gc_setColor(1,1,1)
_=SCN.stat
_.draw(_.time)
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
setFont(15)
gc_setColor(1,1,1)
gc_print(FPS(),SCR.safeX+5,-20)
--Debug info.
if devMode then
--Left-down infos
gc_setColor(devColor[devMode])
gc_print("MEM "..gcinfo(),SCR.safeX+5,-40)
gc_print("Lines "..FREEROW.getCount(),SCR.safeX+5,-60)
gc_print("Cursor "..int(mx+.5).." "..int(my+.5),SCR.safeX+5,-80)
gc_print("Voices "..VOC.getQueueCount(),SCR.safeX+5,-100)
gc_print("Tasks "..TASK.getCount(),SCR.safeX+5,-120)
--Update & draw frame time
ins(frameTimeList,1,dt)rem(frameTimeList,126)
gc_setColor(1,1,1,.3)
for i=1,#frameTimeList do
gc.rectangle('fill',150+2*i,-20,2,-frameTimeList[i]*4000)
end
local t1,t2,t3=WS.getTimers(WSnames[i])
gc_setColor(1,1,1,t1)gc_rectangle('fill',-60,20*i,-20,-20)
gc_setColor(0,1,0,t2)gc_rectangle('fill',-40,20*i,-20,-20)
gc_setColor(1,0,0,t3)gc_rectangle('fill',-20,20*i,-20,-20)
end
gc_pop()
--Slow devmode
if devMode==3 then WAIT(.1)
elseif devMode==4 then WAIT(.5)
gc_replaceTransform(SCR.xOy_dr)
--Websocket status
for i=1,6 do
local status=WS.status(WSnames[i])
gc_setColor(1,1,1)
gc.draw(wsBottomImage,-79,20*i-139)
if status=='dead'then
gc_draw(ws_deadImg,-20,20*i-140)
elseif status=='connecting'then
gc_setColor(1,1,1,.5+.3*sin(time*6.26))
gc_draw(ws_connectingImg,-20,20*i-140)
elseif status=='running'then
gc_draw(ws_runningImg,-20,20*i-140)
end
local t1,t2,t3=WS.getTimers(WSnames[i])
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-120,-20,-20)
gc_setColor(1,0,0,t3)gc.rectangle('fill',-20,20*i-120,-20,-20)
end
end
end
LOG.draw()
gc_present()
--SPEED UPUPUP!
if SETTING.cleanCanvas then gc_discard()end
if SETTING.cleanCanvas then gc.discard()end
end
end
@@ -642,6 +679,11 @@ function love.run()
end
end
--Slow devmode
if devMode==3 then WAIT(.1)
elseif devMode==4 then WAIT(.5)
end
--Keep 60fps
_=TIME()-lastFrame
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
setmetatable(L.getTip,tipMeta)
end
--set global name for all back button
for _,v in next,L.WidgetText do
v.back=L.back
end
end
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:
--https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows
local gc=love.graphics
local clear,translate=gc.clear,gc.translate
local setCanvas,setShader=gc.setCanvas,gc.setShader
local render=gc.draw
local clear,gc_translate=gc.clear,gc.translate
local gc_setCanvas,gc_setShader=gc.setCanvas,gc.setShader
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 lightRenderShader=gc.newShader("Zframework/light/lightRender.glsl")--Shader for rendering blurred lights and shadows.
@@ -15,45 +15,40 @@ end
local function setPow(L,pow)
L.size=pow
end
local function destroy(L)
L.blackCanvas:release()
L.shadowCanvas:release()
L.renderCanvas:release()
end
local function draw(L)
local function drawLight(L)
local s=L.size
--Initialization
local r,g,b,a=gc.getColor()
setCanvas(L.blackCanvas)clear()
setCanvas(L.shadowCanvas)clear()
setCanvas(L.renderCanvas)clear()
lightRenderShader:send("xresolution",L.size)
shadowMapShader:send("yresolution",L.size)
gc_setCanvas(L.blackCanvas)clear()
gc_setCanvas(L.shadowCanvas)clear()
gc_setCanvas(L.renderCanvas)clear()
lightRenderShader:send("xresolution",s)
shadowMapShader:send("yresolution",s)
--Get up-left of light
local X=L.x-L.size*.5
local Y=L.y-L.size*.5
local X=L.x-s*.5
local Y=L.y-s*.5
--Render solid
translate(-X,-Y)
gc_translate(-X,-Y)
L.blackCanvas:renderTo(L.blackFn)
translate(X,Y)
gc_translate(X,Y)
--Render shade canvas by solid
setShader(shadowMapShader)
setCanvas(L.shadowCanvas)
render(L.blackCanvas)
gc_setShader(shadowMapShader)
gc_setCanvas(L.shadowCanvas)
gc_draw(L.blackCanvas)
--Render light canvas by shade
setShader(lightRenderShader)
setCanvas(L.renderCanvas)
render(L.shadowCanvas,0,0,0,1,L.size)
gc_setShader(lightRenderShader)
gc_setCanvas(L.renderCanvas)
gc_draw(L.shadowCanvas,0,0,0,1,s)
--Ready to final render
setShader()setCanvas()gc.setBlendMode('add')
gc_setShader()gc_setCanvas()gc.setBlendMode('add')
--Render to screes
gc.setColor(r,g,b,a)
render(L.renderCanvas,X,Y+L.size,0,1,-1)
--Render to screen
gc_draw(L.renderCanvas,X,Y+s,0,1,-1)
--Reset
gc.setBlendMode('alpha')
@@ -61,13 +56,16 @@ end
local LIGHT={}
function LIGHT.draw()
gc_setColor(1,1,1)
for i=1,#Lights do
draw(Lights[i])
drawLight(Lights[i])
end
end
function LIGHT.clear()
for i=#Lights,1,-1 do
Lights[i]:destroy()
Lights[i].blackCanvas:release()
Lights[i].shadowCanvas:release()
Lights[i].renderCanvas:release()
Lights[i]=nil
end
end
@@ -79,11 +77,10 @@ function LIGHT.add(x,y,radius,solidFunc)
blackCanvas=gc.newCanvas(radius,radius),--Solid canvas
shadowCanvas=gc.newCanvas(radius,1),--1D vis-depth canvas
renderCanvas=gc.newCanvas(radius,radius),--Light canvas
blackFn=solidFunc,--Solid draw funcion
blackFn=solidFunc,--Solid draw function
move=move,
setPow=setPow,
destroy=destroy,
}
end
return LIGHT

View File

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

View File

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

View File

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

View File

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

View File

@@ -10,7 +10,19 @@ local SCR={
rad=0, --Radius
k=1, --Scale size
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)
SCR.w0,SCR.h0=w,h
@@ -21,15 +33,29 @@ function SCR.resize(w,h)
SCR.r=h/w
SCR.rad=(w^2+h^2)^.5
SCR.x,SCR.y=0,0
if SCR.r>=SCR.h0/SCR.w0 then
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
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
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.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
function SCR.info()
return{
@@ -41,7 +67,7 @@ function SCR.info()
("W,H : %d, %d"):format(SCR.W,SCR.H),
("safeX,safeY : %d, %d"):format(SCR.safeX,SCR.safeY),
("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
return SCR

View File

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

View File

@@ -1,21 +1,28 @@
local data=love.data
local STRING={}
local int,format=math.floor,string.format
local find,sub,upper=string.find,string.sub,string.upper
do--function STRING.shiftChar(c)
local shiftMap={
["1"]="!",["2"]="@",["3"]="#",["4"]="$",["5"]="%",
["6"]="^",["7"]="&",["8"]="*",["9"]="(",["0"]=")",
["`"]="~",["-"]="_",["="]="+",
["["]="{",["]"]="}",["\\"]="|",
[";"]=":",["'"]="\"",
[","]="<",["."]=">",["/"]="?",
['1']='!',['2']='@',['3']='#',['4']='$',['5']='%',
['6']='^',['7']='&',['8']='*',['9']='(',['0']=')',
['`']='~',['-']='_',['=']='+',
['[']='{',[']']='}',['\\']='|',
[';']=':',['\'']='"',
[',']='<',['.']='>',['/']='?',
}
function STRING.shiftChar(c)
return shiftMap[c]or upper(c)
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)
local L={}
local p1,p2=1--start,target
@@ -57,16 +64,16 @@ function STRING.time(s)
end
end
do--function STRING.urlEncode(str)
do--function STRING.urlEncode(s)
local rshift=bit.rshift
local b16={[0]="0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}
function STRING.urlEncode(str)
local b16={[0]='0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}
function STRING.urlEncode(s)
local out=""
for i=1,#str do
if str:sub(i,i):match("[a-zA-Z0-9]")then
out=out..str:sub(i,i)
for i=1,#s do
if s:sub(i,i):match("[a-zA-Z0-9]")then
out=out..s:sub(i,i)
else
local b=str:byte(i)
local b=s:byte(i)
out=out.."%"..b16[rshift(b,4)]..b16[b%16]
end
end
@@ -74,4 +81,31 @@ do--function STRING.urlEncode(str)
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

View File

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

View File

@@ -75,6 +75,16 @@ function TABLE.clear(G)
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
function TABLE.reIndex(org)
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",
}
function dump(L,t)
local function dump(L,t)
local s
if t then
s="{\n"
@@ -139,4 +149,42 @@ do--function TABLE.dump(L,t)
TABLE.dump=dump
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

View File

@@ -1,8 +1,9 @@
local gc=love.graphics
local gc_getColor,gc_setColor,gc_push,gc_pop,gc_translate,gc_scale,gc_rotate,gc_shear
=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
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 texts={}
@@ -77,7 +78,7 @@ function TEXT.clear()
texts={}
end
function TEXT.show(text,x,y,font,style,spd,stop)
texts[#texts+1]={
ins(texts,{
c=0, --Timer
text=text, --String
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)
stop=stop, --Stop time(sustained text)
draw=textFX[style or'appear']or error("unavailable type:"..style), --Draw method
}
})
end
function TEXT.getText(text,x,y,font,style,spd,stop)--Another version of TEXT.show(), but only return text object, need manual management
return{

View File

@@ -14,6 +14,10 @@ function THEME.calculate(Y,M,D)
M=="12"and math.abs(D-25)<4 and
'xmas'or
--Birthday
M=="06"and D=="06"and
'birth'or
--Spring festival
M<"03"and math.abs((({
--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)
D=="26"and(
M=="01"or M=="02"and'zday1'or
M=="03"or M=="04"and'zday2'or
M=="05"or M=="06"and'zday3'
(M=="01"or M=="02")and'zday1'or
(M=="03"or M=="04")and'zday2'or
(M=="05"or M=="06")and'zday3'
)or
'classic'
@@ -44,19 +48,22 @@ end
function THEME.set(theme)
if theme=='classic'then
BG.setDefault('space')
BGM.setDefault("blank")
BGM.setDefault("space")
elseif theme=='xmas'then
BG.setDefault('snow')
BGM.setDefault('xmas')
LOG.print("==============",COLOR.R)
LOG.print("Merry Christmas!",COLOR.Z)
LOG.print("==============",COLOR.R)
LOG.print("==============")
LOG.print("Merry Christmas!")
LOG.print("==============")
elseif theme=='birth'then
BG.setDefault('firework')
BGM.setDefault('magicblock')
elseif theme=='sprfes'then
BG.setDefault('firework')
BGM.setDefault("spring festival")
LOG.print(" ★☆☆★",COLOR.R)
LOG.print("新年快乐!",COLOR.Z)
LOG.print(" ★☆☆★",COLOR.R)
LOG.print(" ★☆☆★")
LOG.print("新年快乐!")
LOG.print(" ★☆☆★")
elseif theme=='zday1'then
BG.setDefault('lanterns')
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
return function(t)
local L=SETTING.vib

View File

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

View File

@@ -1,21 +1,40 @@
local kb=love.keyboard
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 max,min=math.max,math.min
local sub=string.sub
local ins=table.insert
local setFont,mStr=setFont,mStr
local mDraw_X,mDraw_Y=ADRAW.simpX,ADRAW.simpY
local sub,ins=string.sub,table.insert
local getFont,setFont,mStr=getFont,setFont,mStr
local mDraw,mDraw_X,mDraw_Y=ADRAW.draw,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,
{"setLW",6},
{"line",11,11,29,29},
{"line",11,29,29,11},
{'fRect',16,5,8,3},
{'fRect',8,8,24,3},
{'fRect',11,14,18,21},
}
local sureIcon=DOGC{40,40,
{"setFT",35},
{"mText","?",20,-6},
{'setFT',35},
{'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={}
@@ -33,7 +52,7 @@ local text={
function text:reset()end
function text:update()
if self.hideCon and self.hideCon()then
if self.hideF and self.hideF()then
if self.alpha>0 then
self.alpha=self.alpha-.125
end
@@ -44,17 +63,17 @@ end
function text:draw()
if self.alpha>0 then
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
mDraw_X(self.obj,self.x,self.y)
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
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
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 _={
name= D.name,
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,
font= D.font or 30,
align= D.align or'M',
hideCon=D.hide,
hideF= D.hideF,
}
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)
return _
end
@@ -81,10 +100,10 @@ function image:reset()
end
end
function image:draw()
gc.setColor(1,1,1,self.alpha)
gc.draw(self.img,self.x,self.y,self.ang,self.k)
gc_setColor(1,1,1,self.alpha)
gc_draw(self.img,self.x,self.y,self.ang,self.k)
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 _={
name= 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,
ang= D.ang,
k= D.k,
hideF= D.hideF,
hide= D.hide,
}
for k,v in next,image do _[k]=v end
@@ -126,16 +146,6 @@ end
function button:getCenter()
return self.x+self.w*.5,self.y+self.h*.5
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()
local ATV=self.ATV
if WIDGET.sel==self then
@@ -149,39 +159,39 @@ function button:draw()
local ATV=self.ATV
local c=self.color
local r,g,b=c[1],c[2],c[3]
gc.setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
gc.rectangle('fill',x-ATV,y-ATV,w+2*ATV,h+2*ATV)
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)
if ATV>0 then
gc.setLineWidth(4)
gc.setColor(1,1,1,ATV*.125)
gc.rectangle('line',x-ATV+2,y-ATV+2,w+2*ATV-4,h+2*ATV-4)
gc_setLineWidth(4)
gc_setColor(1,1,1,ATV*.125)
gc_rectangle('line',x-ATV+2,y-ATV+2,w+2*ATV-4,h+2*ATV-4)
end
local obj=self.obj
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
local x0=x+w*.5
mDraw(obj,x0-2,y0-2)
mDraw(obj,x0-2,y0+2)
mDraw(obj,x0+2,y0-2)
mDraw(obj,x0+2,y0+2)
gc.setColor(r*.5,g*.5,b*.5)
mDraw(obj,x0-1.5,y0-1.5)
mDraw(obj,x0-1.5,y0+1.5)
mDraw(obj,x0+1.5,y0-1.5)
mDraw(obj,x0+1.5,y0+1.5)
gc_setColor(r*.5,g*.5,b*.5)
mDraw(obj,x0,y0)
elseif self.align=='L'then
local edge=self.edge
mDraw_Y(obj,x+edge-2,y0-2)
mDraw_Y(obj,x+edge-2,y0+2)
mDraw_Y(obj,x+edge+2,y0-2)
mDraw_Y(obj,x+edge+2,y0+2)
gc.setColor(r*.5,g*.5,b*.5)
mDraw_Y(obj,x+edge-1.5,y0-1.5)
mDraw_Y(obj,x+edge-1.5,y0+1.5)
mDraw_Y(obj,x+edge+1.5,y0-1.5)
mDraw_Y(obj,x+edge+1.5,y0+1.5)
gc_setColor(r*.5,g*.5,b*.5)
mDraw_Y(obj,x+edge,y0)
elseif self.align=='R'then
local x0=x+w-self.edge-obj:getWidth()
mDraw_Y(obj,x0-2,y0-2)
mDraw_Y(obj,x0-2,y0+2)
mDraw_Y(obj,x0+2,y0-2)
mDraw_Y(obj,x0+2,y0+2)
gc.setColor(r*.5,g*.5,b*.5)
mDraw_Y(obj,x0-1.5,y0-1.5)
mDraw_Y(obj,x0-1.5,y0+1.5)
mDraw_Y(obj,x0+1.5,y0-1.5)
mDraw_Y(obj,x0+1.5,y0+1.5)
gc_setColor(r*.5,g*.5,b*.5)
mDraw_Y(obj,x0,y0)
end
end
@@ -190,10 +200,17 @@ function button:getInfo()
end
function button:press(_,_,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
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
local _={
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,
sound= D.sound~=false,
code= D.code,
hideF= D.hideF,
hide= D.hide,
}
for k,v in next,button do _[k]=v end
@@ -264,14 +282,14 @@ function key:draw()
local c=self.color
local r,g,b=c[1],c[2],c[3]
gc.setColor(1,1,1,ATV*.125)
gc.rectangle('fill',x,y,w,h)
gc_setColor(1,1,1,ATV*.1)
gc_rectangle('fill',x,y,w,h)
gc.setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
gc.setLineWidth(4)
gc.rectangle('line',x,y,w,h)
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
gc_setLineWidth(4)
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
mDraw(self.obj,x+w*.5,y+h*.5)
elseif self.align=='L'then
@@ -287,7 +305,7 @@ function key:press(_,_,k)
self.code(k)
if self.sound then SFX.play('key')end
end
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,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
local _={
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',
edge= D.edge or 0,
code= D.code,
hideF= D.hideF,
hide= D.hide,
}
for k,v in next,key do _[k]=v end
@@ -351,22 +370,22 @@ function switch:draw()
--Checked
if ATV>0 then
gc.setColor(1,1,1,ATV*.08)
gc.rectangle('fill',x,y,50,50)
gc_setColor(1,1,1,ATV*.08)
gc_rectangle('fill',x,y,50,50)
end
if self.CHK>0 then
gc.setColor(.9,1,.9,self.CHK/6)
gc.setLineWidth(6)
gc.line(x+5,y+25,x+18,y+38,x+45,y+11)
gc_setColor(.9,1,.9,self.CHK/6)
gc_setLineWidth(6)
gc_line(x+5,y+25,x+18,y+38,x+45,y+11)
end
--Frame
gc.setLineWidth(4)
gc.setColor(1,1,1,.6+ATV*.05)
gc.rectangle('line',x,y,50,50)
gc_setLineWidth(4)
gc_setColor(1,1,1,.6+ATV*.05)
gc_rectangle('line',x,y,50,50)
--Drawable
gc.setColor(self.color)
gc_setColor(self.color)
mDraw_Y(self.obj,x-12-ATV-self.obj:getWidth(),y+25)
end
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,
disp= D.disp,
code= D.code,
hideF= D.hideF,
hide= D.hide,
}
for k,v in next,switch do _[k]=v end
@@ -446,7 +466,7 @@ function slider:update()
self.ATV=atv
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
end
end
@@ -455,41 +475,41 @@ function slider:draw()
local ATV=self.ATV
local x2=x+self.w
gc.setColor(1,1,1,.5+ATV*.06)
gc_setColor(1,1,1,.5+ATV*.06)
--Units
if not self.smooth then
gc.setLineWidth(2)
gc_setLineWidth(2)
for p=0,self.unit do
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
--Axis
gc.setLineWidth(4)
gc.line(x,y,x2,y)
gc_setLineWidth(4)
gc_line(x,y,x2,y)
--Block
local cx=x+(x2-x)*self.pos/self.unit
local bx,by,bw,bh=cx-10-ATV*.5,y-16-ATV,20+ATV,32+2*ATV
gc.setColor(.8,.8,.8)
gc.rectangle('fill',bx,by,bw,bh)
gc_setColor(.8,.8,.8)
gc_rectangle('fill',bx,by,bw,bh)
if ATV>0 then
gc.setLineWidth(2)
gc.setColor(1,1,1,ATV*.16)
gc.rectangle('line',bx+1,by+1,bw-2,bh-2)
gc_setLineWidth(2)
gc_setColor(1,1,1,ATV*.16)
gc_rectangle('line',bx+1,by+1,bw-2,bh-2)
end
if self.TAT>0 and self.show then
setFont(25)
gc.setColor(1,1,1,self.TAT/180)
gc_setColor(1,1,1,self.TAT/180)
mStr(self:show(),cx,by-30)
end
--Drawable
if self.obj then
gc.setColor(self.color)
gc_setColor(self.color)
mDraw_Y(self.obj,x-12-ATV-self.obj:getWidth(),y)
end
end
@@ -510,14 +530,14 @@ function slider:drag(x)
if p~=P then
self.code(P)
end
if self.change and TIME()-self.lastTime>.18 then
if self.change and TIME()-self.lastTime>.26 then
self.lastTime=TIME()
self.change()
end
end
function slider:release(x)
self.lastTime=0
self:drag(x)
self.lastTime=0
end
function slider:arrowKey(isLeft)
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,
disp= D.disp,
code= D.code,
hideF= D.hideF,
hide= D.hide,
show= false,
}
@@ -589,17 +610,15 @@ local selector={
}
function selector:reset()
self.ATV=0
local V=self.disp()
local L=self.list
for i=1,#L do
if L[i]==V then
self.select=i
self.selText=self.list[i]
return
end
local V,L=self.disp(),self.list
local i=TABLE.find(L,V)
if i then
self.select=i
self.selText=self.list[i]
else
self.hide=true
LOG.print("Selector "..self.name.." dead, disp= "..tostring(V),'warn')
end
self.hide=true
LOG.print("Selector "..self.name.." dead, disp= "..tostring(V),'warn')
end
function selector:isAbove(x,y)
return
@@ -628,32 +647,32 @@ function selector:draw()
local w=self.w
local ATV=self.ATV
gc.setColor(1,1,1,.6+ATV*.1)
gc.setLineWidth(3)
gc.rectangle('line',x,y,w,60)
gc_setColor(1,1,1,.6+ATV*.1)
gc_setLineWidth(3)
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
if self.select>1 then
gc.draw(drawableText.small,x+6,y+20)
gc_draw(smallerThen,x+6,y+33)
if ATV>0 then
gc.setColor(1,1,1,ATV*.4*(.5-t))
gc.draw(drawableText.small,x+6-t*40,y+20)
gc.setColor(1,1,1,.2+ATV*.1)
gc_setColor(1,1,1,ATV*.4*(.5-t))
gc_draw(smallerThen,x+6-t*40,y+33)
gc_setColor(1,1,1,.2+ATV*.1)
end
end
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
gc.setColor(1,1,1,ATV*.4*(.5-t))
gc.draw(drawableText.large,x+w-24+t*40,y+20)
gc_setColor(1,1,1,ATV*.4*(.5-t))
gc_draw(largerThen,x+w-26+t*40,y+33)
end
end
--Drawable
gc.setColor(self.color)
gc_setColor(self.color)
ADRAW.simpX(self.obj,x+w*.5,y+17-21)
gc.setColor(1,1,1)
gc_setColor(1,1,1)
setFont(30)
mStr(self.selText,x+w*.5,y+43-21)
end
@@ -666,12 +685,12 @@ function selector:press(x)
if x<self.x+self.w*.5 then
if s>1 then
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
else
if s<#self.list then
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
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 then
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
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
self.code(self.list[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,
disp= D.disp,
code= D.code,
hideF= D.hideF,
hide= D.hide,
}
for k,v in next,selector do _[k]=v end
@@ -735,8 +755,23 @@ local inputBox={
}
function inputBox:reset()
self.ATV=0
if not MOBILE then
kb.setTextInput(true)
end
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
function inputBox:clear()
@@ -764,12 +799,12 @@ function inputBox:draw()
local x,y,w,h=self.x,self.y,self.w,self.h
local ATV=self.ATV
gc.setColor(1,1,1,ATV*.1)
gc.rectangle('fill',x,y,w,h)
gc_setColor(1,1,1,ATV*.1)
gc_rectangle('fill',x,y,w,h)
gc.setColor(1,1,1)
gc.setLineWidth(4)
gc.rectangle('line',x,y,w,h)
gc_setColor(1,1,1)
gc_setLineWidth(4)
gc_rectangle('line',x,y,w,h)
--Drawable
setFont(self.font)
@@ -778,13 +813,13 @@ function inputBox:draw()
end
if self.secret then
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
else
gc.printf(self.value,x+10,y,self.w)
gc_printf(self.value,x+10,y,self.w)
setFont(self.font-10)
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
@@ -793,7 +828,7 @@ function inputBox:getInfo()
end
function inputBox:press()
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)
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,
secret= D.secret==true,
regex= D.regex,
hideF= D.hideF,
hide= D.hide,
}
for k,v in next,inputBox do _[k]=v end
@@ -871,13 +907,14 @@ function textBox:update()
end
function textBox:push(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
else
self.new=true
end
end
function textBox:press(x,y)
if not(x and y)then return end
self:drag(nil,nil,nil,0)
if not self.fix and x>self.x+self.w-40 and y<self.y+40 then
if self.sure>0 then
@@ -890,7 +927,7 @@ function textBox:press(x,y)
end
end
function textBox:drag(_,_,_,dy)
_=self.scrollPix+dy*SCR.dpi
_=self.scrollPix+dy
local sign=_>0 and 1 or -1
while abs(_)>30 do
_=_-30*sign
@@ -923,39 +960,39 @@ function textBox:draw()
end
--Background
gc.setColor(0,0,0,.3)
gc.rectangle('fill',x,y,w,h)
gc_setColor(0,0,0,.4)
gc_rectangle('fill',x,y,w,h)
--Frame
gc.setLineWidth(4)
gc.setColor(1,1,WIDGET.sel==self and 0 or 1)
gc.rectangle('line',x,y,w,h)
gc_setLineWidth(4)
gc_setColor(1,1,WIDGET.sel==self and .8 or 1)
gc_rectangle('line',x,y,w,h)
--Slider
if #texts>cap then
gc.setLineWidth(2)
gc.rectangle('line',x-25,y,20,h)
gc_setLineWidth(2)
gc_rectangle('line',x-25,y,20,h)
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
--Clear button
gc.setColor(1,1,1)
gc_setColor(1,1,1)
if not self.fix then
gc.rectangle('line',x+w-40,y,40,40)
gc.draw(self.sure==0 and clearIcon or sureIcon,x+w-40,y)
gc_rectangle('line',x+w-40,y,40,40)
gc_draw(self.sure==0 and clearIcon or sureIcon,x+w-40,y)
end
--Texts
setFont(self.font)
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
--New message
if self.new and self.scrollPos~=#texts then
gc.setColor(1,TIME()%.4<.2 and 1 or 0,0)
gc.print("v",x+w-25,y+h-40)
gc_setColor(1,TIME()%.4<.2 and 1 or 0,0)
gc_print("v",x+w-25,y+h-40)
end
end
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,
fix= D.fix,
texts= {},
hideF= D.hideF,
hide= D.hide,
}
_.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
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.indexMeta={
__index=function(L,k)
for i=1,#L do
@@ -1007,9 +1046,8 @@ WIDGET.indexMeta={
end
end
}
function WIDGET.set(list)
kb.setTextInput(false)
WIDGET.sel=false
function WIDGET.setWidgetList(list)
WIDGET.unFocus()
WIDGET.active=list or NONE
--Reset all widgets
@@ -1029,6 +1067,10 @@ function WIDGET.set(list)
end
end
end
function WIDGET.setScrollHeight(height)
WIDGET.scrollHeight=height and height or 0
WIDGET.scrollPos=0
end
function WIDGET.setLang(widgetText)
for S,L in next,SCN.scenes do
if L.widgetList then
@@ -1046,60 +1088,81 @@ function WIDGET.setLang(widgetText)
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)
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
WIDGET.sel=W
if not W.hide and W.resCtr and W:isAbove(x,y+WIDGET.scrollPos)then
WIDGET.focus(W)
return
end
end
if WIDGET.sel and not WIDGET.sel.keepFocus then
WIDGET.sel=false
WIDGET.unFocus()
end
end
function WIDGET.press(x,y,k)
local W=WIDGET.sel
if not W then return end
W:press(x,y,k)
if W.hide==true or W.hide and W.hide()then WIDGET.sel=false end
if W then
W:press(x,y and y+WIDGET.scrollPos,k)
if W.hide then WIDGET.unFocus()end
end
end
function WIDGET.drag(x,y,dx,dy)
local W=WIDGET.sel
if not W then return end
if W.type=='slider'or W.type=='textBox'then
W:drag(x,y,dx,dy)
elseif not W:isAbove(x,y)then
WIDGET.sel=false
if WIDGET.sel then
local W=WIDGET.sel
if W.type=='slider'or W.type=='textBox'then
W:drag(x,y+WIDGET.scrollPos,dx,dy)
elseif not W:isAbove(x,y)then
WIDGET.unFocus(true)
end
else
WIDGET.scrollPos=max(min(WIDGET.scrollPos-dy,WIDGET.scrollHeight),0)
end
end
function WIDGET.release(x,y)
local W=WIDGET.sel
if not W then return end
if W.type=='slider'then
W:release(x,y)
if W and W.type=='slider'then
W:release(x,y+WIDGET.scrollPos)
end
end
function WIDGET.keyPressed(k)
local W=WIDGET.sel
if k=="space"or k=="return"then
WIDGET.press()
elseif kb.isDown("lshift","lalt","lctrl")and(k=="left"or k=="right")then
--When hold [↑], control slider with left/right
local W=WIDGET.sel
if W and W.type=='slider'or W.type=='selector'then
W:arrowKey(k=="left")
end
elseif k=="up"or k=="down"or k=="left"or k=="right"then
if not WIDGET.sel then
for _,W in next,WIDGET.active do
if not(W.hide==true or W.hide and W.hide())and W.isAbove then
WIDGET.sel=W
if not W then
for _,w in next,WIDGET.active do
if not w.hide and w.isAbove then
WIDGET.focus(w)
return
end
end
return
end
local W=WIDGET.sel
if not W.getCenter then return end
local WX,WY=W:getCenter()
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"
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
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
for j=1,#L,2 do
local x,y=L[j],L[j+1]
@@ -1125,10 +1188,9 @@ function WIDGET.keyPressed(k)
end
end
if tar then
WIDGET.sel=tar
WIDGET.focus(tar)
end
else
local W=WIDGET.sel
if W and W.type=='inputBox'then
W:keypress(k)
end
@@ -1179,15 +1241,49 @@ end
function WIDGET.update()
for _,W in next,WIDGET.active do
if W.hideF then W.hide=W.hideF()end
if W.update then W:update()end
end
end
function WIDGET.draw()
for _,W in next,WIDGET.active do
if not(W.hide==true or W.hide and W.hide())then
W:draw()
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()
gc_setCanvas(widgetCanvas)
gc_clear(0,0,0,0)
gc_translate(0,-WIDGET.scrollPos)
for _,W in next,WIDGET.active do
if not W.hide then 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
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
return WIDGET

View File

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

View File

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

View File

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

BIN
font.ttf

Binary file not shown.

103
main.lua
View File

@@ -5,7 +5,13 @@
/ / / __// /__ / / / // / / / / // // / / // /_/ /
/_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/
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.mouse.setVisible(false)
--Delete all files from too old version
function CLEAR(root)
for _,name in next,fs.getDirectoryItems(root or"")do
if fs.getRealDirectory(name)==SAVEDIR and fs.getInfo(name).type~='directory'then
fs.remove(name)
end
end
end CLEAR()
--Load modules
require"Zframework"
SCR.setSize(1280,720)--Initialize Screen size
--Delete all naked files (from too old version)
FILE.clear("")
--Create directories
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
--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
SHADER={}
for _,v in next,fs.getDirectoryItems("parts/shaders")do
@@ -68,6 +64,10 @@ for _,v in next,fs.getDirectoryItems("parts/shaders")do
end
end
require"parts.list"
require"parts.globalTables"
require"parts.gametoolfunc"
FREEROW= require"parts.freeRow"
DATA= require"parts.data"
@@ -76,17 +76,17 @@ SKIN= require"parts.skin"
USERS= require"parts.users"
NET= require"parts.net"
VK= require"parts.virtualKey"
PLY= require"parts.player"
netPLY= require"parts.netPlayer"
AIFUNC= require"parts.ai"
AIBUILDER= require"parts.AITemplate"
PLY= require"parts.player"
netPLY= require"parts.netPlayer"
MODES= require"parts.modes"
--Initialize field[1]
FIELD[1]=DATA.newBoard()
--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.swap=false
SETTING.powerInfo=true
@@ -96,19 +96,17 @@ if SETTING.fullscreen then love.window.setFullscreen(true)end
--Initialize image libs
IMG.init{
batteryImage="mess/power.png",
lock="mess/lock.png",
dialCircle="mess/dialCircle.png",
dialNeedle="mess/dialNeedle.png",
lifeIcon="mess/life.png",
badgeIcon="mess/badge.png",
spinCenter="mess/spinCenter.png",
ctrlSpeedLimit="mess/ctrlSpeedLimit.png",
speedLimit="mess/speedLimit.png",
speedLimit="mess/speedLimit.png",--Not used, for future C2-mode
pay1="mess/pay1.png",
pay2="mess/pay2.png",
nakiCH="characters/naki.png",
nakiCH="characters/nakiharu.png",
miyaCH="characters/miya.png",
miyaF1="characters/miya_f1.png",
miyaF2="characters/miya_f2.png",
@@ -161,9 +159,9 @@ SFX.init((function()
local L={}
for _,v in next,fs.getDirectoryItems("media/SFX")do
if fs.getRealDirectory("media/SFX/"..v)~=SAVEDIR then
L[#L+1]=v:sub(1,-5)
table.insert(L,v:sub(1,-5))
else
LOG.print("Dangerous file : %SAVE%/media/SFX/"..v)
LOG.print("Dangerous file : %SAVE%/media/SFX/"..v,'warn')
end
end
return L
@@ -172,9 +170,9 @@ BGM.init((function()
local L={}
for _,v in next,fs.getDirectoryItems("media/BGM")do
if fs.getRealDirectory("media/BGM/"..v)~=SAVEDIR then
L[#L+1]=v:sub(1,-5)
table.insert(L,v:sub(1,-5))
else
LOG.print("Dangerous file : %SAVE%/media/BGM/"..v)
LOG.print("Dangerous file : %SAVE%/media/BGM/"..v,'warn')
end
end
return L
@@ -232,56 +230,34 @@ for _,v in next,fs.getDirectoryItems("parts/scenes")do
LANG.addScene(sceneName)
end
end
LANG.set(SETTING.lang)
--Update data
do
local needSave
local autoRestart
local needSave,autoRestart
if type(STAT.version)~='number'then
STAT.version=0
needSave=true
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 RANKS.pctrain_n then RANKS.pctrain_n=0 end
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
FILE.clear_s("")
end
if STAT.version<1405 then
fs.remove("conf/user")
autoRestart=true
fs.remove('conf/user')
fs.remove('conf/key')
end
SETTING.appLock=nil
for _,v in next,VK_org do v.color=nil end
if STAT.version~=VERSION.code then
newVersionLaunch=true
STAT.version=VERSION.code
CLEAR("lib")
needSave=true
autoRestart=true
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.infinite then RANKS.infinite=6 end
if RANKS.infinite_dig then RANKS.infinite_dig=6 end
@@ -320,4 +296,7 @@ do
if autoRestart then
love.event.quit('restart')
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}},
},
[3]={
{{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},},
{{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},{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}},
{{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}},
},
[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]={
{{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},},
{{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}},
},
}FCL[2],FCL[4],FCL[5]=FCL[1],FCL[3],FCL[3]
local LclearScore={[0]=0,-200,-120,-80,200}
@@ -199,6 +199,8 @@ local function getScore(field,cb,cy)
return score
end
-------------------------------------------------
local BLOCKS=BLOCKS
local CC=CC
return{
['9S']=function(P,keys)
while true do
@@ -270,7 +272,7 @@ return{
--Check if time to change target
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)
end
end
@@ -313,7 +315,7 @@ return{
--Check if time to change target
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)
end
end

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,9 @@
--Blackhole
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 rnd=math.random
local ins,rem=table.insert,table.remove
@@ -37,29 +41,24 @@ function back.update()
end
end
function back.draw()
gc.clear(.1,.1,.1)
gc.push('transform')
gc.origin()
gc.translate(SCR.w/2,SCR.h/2)
gc_clear(.1,.1,.1)
gc_replaceTransform(SCR.xOy_m)
--Squares
gc.setColor(.5,.5,.5)
gc_setColor(1,1,1,.2)
for i=1,#squares do
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
--Blackhole
gc.scale(SCR.rad/1600)
gc.setColor(0,0,0)
gc.circle('fill',0,0,157)
gc.setLineWidth(6)
gc_setColor(.07,.07,.07)
gc_circle('fill',0,0,157)
gc_setLineWidth(6)
for i=0,15 do
gc.setColor(0,0,0,1-i*.0666)
gc.circle('line',0,0,160+6*i)
gc_setColor(.07,.07,.07,1-i*.0666)
gc_circle('line',0,0,160+6*i)
end
gc.scale(1600/SCR.rad)
gc.pop()
end
function back.discard()
squares=nil

View File

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

View File

@@ -41,15 +41,12 @@ function back.update()
end
function back.draw()
gc.clear(.1,.1,.1)
gc.push('transform')
gc.origin()
for i=1,#mino do
local C=mino[i]
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)
end
gc.pop()
end
function back.discard()
mino=nil

View File

@@ -1,5 +1,8 @@
--Space but tetrominoes
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 rnd=math.random
local ins,rem=table.insert,table.remove
@@ -33,22 +36,20 @@ function back.update()
rem(mino,i)
else
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
function back.draw()
gc.clear(.1,.1,.1)
gc.push('transform')
gc.origin()
gc.translate(SCR.w/2,SCR.h/2)
gc_clear(.1,.1,.1)
gc_translate(SCR.cx,SCR.cy)
for i=1,#mino do
local M=mino[i]
local c=M.color
gc.setColor(c[1],c[2],c[3],.4)
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_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)
end
gc.pop()
gc_translate(-SCR.cx,-SCR.cy)
end
function back.discard()
mino=nil

View File

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

View File

@@ -1,6 +1,11 @@
--UUZ's fan
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 max,min,sin=math.max,math.min,math.sin
local ins,rem=table.insert,table.remove
@@ -9,7 +14,7 @@ local back={}
local t
local fan,petal
function back.init()
t=rnd(2600)
t=0
fan=title_fan
petal={}
end
@@ -39,35 +44,34 @@ function back.update()
end
end
function back.draw()
gc.push('transform')
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_clear(.1,.1,.1)
gc.setLineWidth(4)
gc.setColor(.7,.5,.65)
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_replaceTransform(SCR.xOy_m)
gc_translate(0,20*sin(t*.02))
gc.setLineWidth(6)
gc.setColor(.55,.5,.6)
for i=1,8 do
polygon('line',fan[i])
end
gc_setLineWidth(320)
gc_setColor(.9,.6,.9,.1)
gc_arc('line','open',0,420,500,-.8*3.1416,-.2*3.1416)
gc.setLineWidth(2)
gc.setColor(.6,.3,.5)
gc.origin()
gc_setLineWidth(4)
gc_setColor(1,.7,.9,.2)
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
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
gc.pop()
end
function back.discard()
petal=nil

View File

@@ -1,6 +1,9 @@
--Firework
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 ins,rem=table.insert,table.remove
local back={}
@@ -22,7 +25,7 @@ function back.update(dt)
y1=SCR.h*(.15+rnd()*.4),
t=0,
v=.5+rnd(),
color=COLOR.random_bright(),
color=COLOR.random_dark(),
big=rnd()<.1,
})
t=rnd(26,62)
@@ -75,22 +78,19 @@ function back.update(dt)
end
end
function back.draw()
gc.clear(.1,.1,.1)
gc.push('transform')
gc.origin()
gc_clear(.1,.1,.1)
for i=1,#firework do
local F=firework[i]
gc.setColor(F.color)
circle('fill',F.x,F.y,F.big and 8 or 4)
gc_setColor(F.color)
gc_circle('fill',F.x,F.y,F.big and 8 or 4)
end
gc.setLineWidth(3)
gc_setLineWidth(3)
for i=1,#particle do
local P=particle[i]
local c=P.color
gc.setColor(c[1],c[2],c[3],P.t)
line(P.x,P.y,P.x-P.vx*4,P.y-P.vy*4)
gc_setColor(c[1],c[2],c[3],P.t*.4)
gc_line(P.x,P.y,P.x-P.vx*4,P.y-P.vy*4)
end
gc.pop()
end
function back.discard()
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
function back.draw()
gc.clear(.1,.1,.1)
gc.push('transform')
gc.origin()
gc.setColor(1,1,1)
gc.setColor(1,1,1,.2)
local img=IMG.lanterns
for i=1,#lanterns do
local L=lanterns[i]
mDraw(img[int(L.phase*6)+1],L.x,L.y,nil,L.size)
end
gc.pop()
end
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
local _=colorLib[SETTING.skin[R]]
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
return back

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -19,7 +19,7 @@ function back.draw()
gc.clear(.1,.1,.1)
end
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(1.1626,1.26)
if -t%6.26<.1355 then
@@ -28,11 +28,11 @@ function back.draw()
if -t%12.6<.1626 then
gc.rotate(t+5*sin(.26*t)+5*sin(.626*t))
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.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.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.pop()
end

View File

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

View File

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

View File

@@ -1,13 +1,21 @@
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 SETTING,GAME,SCR=SETTING,GAME,SCR
--System
function switchFullscreen()
SETTING.fullscreen=not SETTING.fullscreen
love.window.setFullscreen(SETTING.fullscreen)
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
love.resize(gc.getWidth(),gc.getHeight())
end
@@ -228,7 +236,7 @@ function loadGame(M,ifQuickPlay,ifNet)--Load a mode and go to game scene
if ifNet then
SCN.go('net_game','swipeD')
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')
SFX.play('enter')
end
@@ -236,7 +244,8 @@ function loadGame(M,ifQuickPlay,ifNet)--Load a mode and go to game scene
end
function gameOver()--Save record
if GAME.replaying then return end
FILE.save(STAT,'conf/data')
trySave()
local M=GAME.curMode
local R=M.getRank
if R then
@@ -291,79 +300,98 @@ function gameOver()--Save record
end
end
end
function initPlayerPosition(sudden)--Set initial position for every player
local L=PLY_ALIVE
if not sudden then
for i=1,#L do
L[i]:setPosition(640,#L<=5 and 360 or -62,0)
end
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
if not sudden then
for i=1,#L do
L[i]:setPosition(640,#L<=5 and 360 or -62,0)
end
end
local method=sudden and'setPosition'or'movePosition'
L[1][method](L[1],340,75,1)
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!")
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'
for i=1,#L do L[i][method](L[i],unpack(posList[i]))end
end
end
do--function dumpBasicConfig()
local gameSetting={
--Tuning
"das","arr","dascut","sddas","sdarr",
"ihs","irs","ims","RS","swap",
'das','arr','dascut','sddas','sdarr',
'ihs','irs','ims','RS','swap',
--System
"skin","face",
'skin','face',
--Graphic
"block","ghost","center","bagLine",
"dropFX","moveFX","shakeFX",
"text","highCam","nextPos",
'block','ghost','center','bagLine',
'dropFX','moveFX','shakeFX',
'text','highCam','nextPos',
--Unnecessary graphic
-- "grid","smooth",
-- "lockFX","clearFX","splashFX","atkFX",
-- "score",
-- 'grid','smooth',
-- 'lockFX','clearFX','splashFX','atkFX',
-- 'score',
}
function dumpBasicConfig()
local S={}
@@ -374,7 +402,6 @@ do--function dumpBasicConfig()
end
end
do--function resetGameData(args)
local YIELD=YIELD
local function tick_showMods()
local time=0
while true do
@@ -392,16 +419,16 @@ do--function resetGameData(args)
end
local gameSetting={
--Tuning
"das","arr","dascut","sddas","sdarr",
"ihs","irs","ims","RS","swap",
'das','arr','dascut','sddas','sdarr',
'ihs','irs','ims','RS','swap',
--System
"skin","face",
'skin','face',
--Graphic
"block","ghost","center","smooth","grid","bagLine",
"lockFX","dropFX","moveFX","clearFX","splashFX","shakeFX","atkFX",
"text","score",'warn',"highCam","nextPos",
'block','ghost','center','smooth','grid','bagLine',
'lockFX','dropFX','moveFX','clearFX','splashFX','shakeFX','atkFX',
'text','score','warn','highCam','nextPos',
}
local function copyGameSetting()
local S={}
@@ -416,10 +443,7 @@ do--function resetGameData(args)
end
function resetGameData(args,seed)
if not args then args=""end
if PLAYERS[1]and not GAME.replaying and(PLAYERS[1].frameRun>400 or GAME.result)then
mergeStat(STAT,PLAYERS[1].stat)
STAT.todayTime=STAT.todayTime+PLAYERS[1].stat.time
end
trySave()
GAME.result=false
GAME.warnLVL0=0
@@ -437,6 +461,7 @@ do--function resetGameData(args)
GAME.setting=copyGameSetting()
GAME.rep={}
GAME.recording=true
GAME.statSaved=false
GAME.replaying=false
GAME.rank=0
math.randomseed(TIME())
@@ -444,11 +469,22 @@ do--function resetGameData(args)
destroyPlayers()
GAME.curMode.load()
initPlayerPosition(args:find'q')
freshPlayerPosition(args:find'q')
VK.restore()
if GAME.modeEnv.task then
for i=1,#PLAYERS do
PLAYERS[i]:newTask(GAME.modeEnv.task)
local task=GAME.modeEnv.task
if type(task)=='function'then
for i=1,#PLAYERS do
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
BG.set(GAME.modeEnv.bg)
@@ -467,7 +503,6 @@ do--function resetGameData(args)
GAME.secDangerous=false
GAME.stage=1
end
STAT.game=STAT.game+1
FREEROW.reset(30*#PLAYERS)
TASK.removeTask_code(tick_showMods)
if GAME.setting.allowMod then
@@ -495,7 +530,7 @@ do--function checkWarning()
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
local _=GAME.warnLVL
if _<GAME.warnLVL0 then
@@ -508,7 +543,7 @@ do--function checkWarning()
GAME.warnLVL=max(GAME.warnLVL-.026,0)
end
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
@@ -516,50 +551,33 @@ end
--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()
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 textObject,scaleK,width,offY
function drawSelfProfile()
local selfAvatar=USERS.getAvatar(USER.uid)
gc.push('transform')
gc.translate(1280,0)
gc_push('transform')
gc_replaceTransform(SCR.xOy_ur)
--Draw avatar
gc.setLineWidth(2)
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.rectangle('line',-73,7,66,66,2)
gc.draw(selfAvatar,-72,8,nil,.5)
gc_setLineWidth(2)
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_rectangle('line',-73,7,66,66,2)
gc_draw(selfAvatar,-72,8,nil,.5)
--Draw username
if name~=USERS.getUsername(USER.uid)then
@@ -569,27 +587,50 @@ do--function drawSelfProfile()
scaleK=210/math.max(width,210)
offY=textObject:getHeight()/2
end
gc.draw(textObject,-82,26,nil,scaleK,nil,width,offY)
gc_draw(textObject,-82,26,nil,scaleK,nil,width,offY)
--Draw lv. & xp.
gc.draw(TEXTURE.lvIcon[USER.lv],-295,50)
gc.line(-270,55,-80,55,-80,70,-270,70)
gc.rectangle('fill',-210,55,150*USER.xp/USER.lv/USER.lv,15)
gc_draw(lvIcon[USER.lv],-295,50)
gc_line(-270,55,-80,55,-80,70,-270,70)
gc_rectangle('fill',-210,55,150*USER.xp/USER.lv/USER.lv,15)
gc.pop()
gc_pop()
end
end
function drawWarning()
if SETTING.warn and GAME.warnLVL>0 then
gc.push('transform')
gc.origin()
SHADER.warning:send("level",GAME.warnLVL)
gc.setShader(SHADER.warning)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
gc.pop()
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()
if SETTING.warn and GAME.warnLVL>0 then
gc_push('transform')
gc_origin()
shader_warning:send("level",GAME.warnLVL)
gc_setShader(shader_warning)
gc_rectangle('fill',0,0,SCR.w,SCR.h)
gc_setShader()
gc_pop()
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)
local cache={}
function goScene(name,style)
if not cache[name]then
cache[name]=function()SCN.go(name,style)end
local hash=style and name..style or name
if not cache[hash]then
cache[hash]=function()SCN.go(name,style)end
end
return cache[name]
return cache[hash]
end
end
do--function swapScene(name,style)
local cache={}
function swapScene(name,style)
if not cache[name]then
cache[name]=function()SCN.swapTo(name,style)end
local hash=style and name..style or name
if not cache[hash]then
cache[hash]=function()SCN.swapTo(name,style)end
end
return cache[name]
return cache[hash]
end
end
do--function pressKey(k)
@@ -623,11 +666,14 @@ do--function pressKey(k)
end
end
do--CUS/SETXXX(k)
local c,s=CUSTOMENV,SETTING
function CUSval(k)return function()return c[k]end end
function SETval(k)return function()return s[k]end end
function CUSrev(k)return function()c[k]=not c[k]end end
function SETrev(k)return function()s[k]=not s[k]end end
function CUSsto(k)return function(i)c[k]=i end end
function SETsto(k)return function(i)s[k]=i end end
local CUSTOMENV=CUSTOMENV
function CUSval(k)return function()return CUSTOMENV[k]end end
function ROOMval(k)return function()return ROOMENV[k]end end
function SETval(k)return function()return SETTING[k]end end
function CUSrev(k)return function()CUSTOMENV[k]=not CUSTOMENV[k]end end
function ROOMrev(k)return function()ROOMENV[k]=not ROOMENV[k]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

View File

@@ -164,6 +164,7 @@ GAME={--Global game data
modeEnv=false, --Current gamemode environment
setting={}, --Game settings
rep={}, --Recording list, key,time,key,time...
statSaved=false, --If recording saved
recording=false, --If recording
replaying=false, --If replaying
saved=false, --If recording saved
@@ -183,8 +184,8 @@ ROYALEDATA={
}
--Userdata tables
RANKS=FILE.load("conf/unlock")or{sprint_10l=0}--Ranks of modes
USER=FILE.load("conf/user")or{--User infomation
RANKS=FILE.load('conf/unlock')or{sprint_10l=0}--Ranks of modes
USER=FILE.load('conf/user')or{--User infomation
--Network infos
uid=false,
authToken=false,
@@ -192,6 +193,7 @@ USER=FILE.load("conf/user")or{--User infomation
--Local data
xp=0,lv=1,
}
customEnv0={
version=VERSION.code,
@@ -213,6 +215,8 @@ customEnv0={
--Rule
sequence='bag',
fieldH=20,
heightLimit=1e99,
bufferLimit=1e99,
ospin=true,
fineKill=false,
@@ -226,14 +230,59 @@ customEnv0={
opponent="X",
life=0,
pushSpeed=3,
garbageSpeed=1,
missionKill=false,
--Else
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
--Tuning
das=10,arr=2,dascut=0,
@@ -255,7 +304,6 @@ SETTING={--Settings
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},
dataSaving=false,
--Graphic
block=true,ghost=.3,center=1,
@@ -274,18 +322,20 @@ SETTING={--Settings
text=true,
score=true,
warn=true,
highCam=false,
nextPos=false,
bufferWarn=true,
showSpike=true,
highCam=true,
nextPos=true,
fullscreen=true,
bg=true,
powerInfo=false,
clickFX=true,
warn=true,
--Sound
sfx=1,
sfx_spawn=.3,
sfx_warn=.3,
sfx_spawn=0,
sfx_warn=.4,
bgm=.7,
stereo=.7,
vib=0,
@@ -296,6 +346,7 @@ SETTING={--Settings
VKSFX=.2,--SFX volume
VKVIB=0,--VIB
VKSwitch=false,--If disp
VKSkin=1,--If disp
VKTrack=false,--If tracked
VKDodge=false,--If dodge
VKTchW=.3,--Touch-Pos Weight
@@ -303,9 +354,9 @@ SETTING={--Settings
VKIcon=true,--If disp icon
VKAlpha=.3,
}
local S=FILE.load("conf/settings")
local S=FILE.load('conf/settings')
if S then TABLE.update(S,SETTING)end
S=FILE.load("conf/data")
S=FILE.load('conf/data')
if S then--Statistics
STAT=S
else
@@ -324,7 +375,7 @@ else
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
end
keyMap=FILE.load("conf/key")or{--Key setting
keyMap=FILE.load('conf/key')or{--Key setting
keyboard={
left=1,right=2,x=3,z=4,c=5,
up=6,down=7,space=8,a=9,s=10,
@@ -336,7 +387,7 @@ keyMap=FILE.load("conf/key")or{--Key setting
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=320, y=720-200, r=80},--moveRight
{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=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={
{
[01]={"-1+0","-1+1","+0-2","-1+2","+0+1"},
[10]={"+1+0","+1-1","+0+2","+1-2","+1-2"},
[03]={"+1+0","+1+1","+0-2","+1-1","+1-2"},
[30]={"-1+0","-1-1","+0+2","-1+2","+0-1"},
[12]={"+1+0","+1-1","+0+2","+1+2"},
[21]={"-1+0","-1+1","+0-2","-1-2"},
[32]={"-1+0","-1-1","+0+2","-1+2"},
[23]={"+1+0","+1+1","+0-2","+1-2"},
[02]={"+1+0","-1+0","+0-1","+0+1"},
[20]={"-1+0","+1+0","+0+1","+0-1"},
[13]={"+0-1","+0+1","+0-2"},
[31]={"+0+1","+0-1","+0+2"},
[01]={'-1+0','-1+1','+0-2','-1+2','+0+1'},
[10]={'+1+0','+1-1','+0+2','+1-2','+1-2'},
[03]={'+1+0','+1+1','+0-2','+1-1','+1-2'},
[30]={'-1+0','-1-1','+0+2','-1+2','+0-1'},
[12]={'+1+0','+1-1','+0+2','+1+2'},
[21]={'-1+0','-1+1','+0-2','-1-2'},
[32]={'-1+0','-1-1','+0+2','-1+2'},
[23]={'+1+0','+1+1','+0-2','+1-2'},
[02]={'+1+0','-1+0','+0-1','+0+1'},
[20]={'-1+0','+1+0','+0+1','+0-1'},
[13]={'+0-1','+0+1','+0-2'},
[31]={'+0+1','+0-1','+0+2'},
},--Z
false,--S
{
[01]={"-1+0","-1+1","+1+0","+0-2","+1+1"},
[10]={"+1+0","+1-1","-1+0","+0+2","+1+2"},
[03]={"+1+0","+1+1","+0-2","+1-2","+1-1","+0+1"},
[30]={"-1+0","-1-1","+0+2","-1+2","+0-1","-1+1"},
[12]={"+1+0","+1-1","+1+1","-1+0","+0-1","+0+2","+1+2"},
[21]={"-1+0","-1+1","-1-1","+1+0","+0+1","+0-2","-1-2"},
[32]={"-1+0","-1-1","+1+0","+0+2","-1+2","-1+1"},
[23]={"+1+0","+1-1","-1+0","+1+1","+0-2","+1-2"},
[02]={"-1+0","+1+0","+0-1","+0+1"},
[20]={"+1+0","-1+0","+0+1","+0-1"},
[13]={"+0-1","+0+1","+1+0"},
[31]={"+0+1","+0-1","-1+0"},
[01]={'-1+0','-1+1','+1+0','+0-2','+1+1'},
[10]={'+1+0','+1-1','-1+0','+0+2','+1+2'},
[03]={'+1+0','+1+1','+0-2','+1-2','+1-1','+0+1'},
[30]={'-1+0','-1-1','+0+2','-1+2','+0-1','-1+1'},
[12]={'+1+0','+1-1','+1+1','-1+0','+0-1','+0+2','+1+2'},
[21]={'-1+0','-1+1','-1-1','+1+0','+0+1','+0-2','-1-2'},
[32]={'-1+0','-1-1','+1+0','+0+2','-1+2','-1+1'},
[23]={'+1+0','+1-1','-1+0','+1+1','+0-2','+1-2'},
[02]={'-1+0','+1+0','+0-1','+0+1'},
[20]={'+1+0','-1+0','+0+1','+0-1'},
[13]={'+0-1','+0+1','+1+0'},
[31]={'+0+1','+0-1','-1+0'},
},--J
false,--L
{
[01]={"-1+0","-1+1","+0-2","-1-2","+0+1"},
[10]={"+1+0","+1-1","+0+2","+1+2","+0-1"},
[03]={"+1+0","+1+1","+0-2","+1-2","+0+1"},
[30]={"-1+0","-1-1","+0+2","-1+2","+0-1"},
[12]={"+1+0","+1-1","+0-1","-1-1","+0+2","+1+2"},
[21]={"-1+0","+0-2","-1-2","+1+1"},
[32]={"-1+0","-1-1","+0-1","+1-1","+0+2","-1+2"},
[23]={"+1+0","+0-2","+1-2","-1+1"},
[02]={"-1+0","+1+0","+0+1"},
[20]={"+1+0","-1+0","+0-1"},
[13]={"+0-1","+0+1","+1+0","+0-2","+0+2"},
[31]={"+0-1","+0+1","-1+0","+0-2","+0+2"},
[01]={'-1+0','-1+1','+0-2','-1-2','+0+1'},
[10]={'+1+0','+1-1','+0+2','+1+2','+0-1'},
[03]={'+1+0','+1+1','+0-2','+1-2','+0+1'},
[30]={'-1+0','-1-1','+0+2','-1+2','+0-1'},
[12]={'+1+0','+1-1','+0-1','-1-1','+0+2','+1+2'},
[21]={'-1+0','+0-2','-1-2','+1+1'},
[32]={'-1+0','-1-1','+0-1','+1-1','+0+2','-1+2'},
[23]={'+1+0','+0-2','+1-2','-1+1'},
[02]={'-1+0','+1+0','+0+1'},
[20]={'+1+0','-1+0','+0-1'},
[13]={'+0-1','+0+1','+1+0','+0-2','+0+2'},
[31]={'+0-1','+0+1','-1+0','+0-2','+0+2'},
},--T
function(P,d)
if P.gameEnv.easyFresh then
@@ -179,111 +179,111 @@ do
end
end,--O
{
[01]={"+0+1","+1+0","-2+0","-2-1","+1+2"},
[10]={"+2+0","-1+0","-1-2","+2+1","+0+1"},
[03]={"+0+1","-1+0","+2+0","+2-1","-1+2"},
[30]={"-2+0","+1+0","+1-2","-2+1","+0+1"},
[12]={"-1+0","+2+0","+2-1","+0-1","-1+2"},
[21]={"-2+0","+1+0","+1-2","-2+1","+0+1"},
[32]={"+1+0","-2+0","-2-1","+0-1","+1+2"},
[23]={"+2+0","-1+0","-1-2","+2+1","+0+1"},
[02]={"-1+0","+1+0","+0-1","+0+1"},
[20]={"+1+0","-1+0","+0+1","+0-1"},
[13]={"+0-1","-1+0","+1+0","+0+1"},
[31]={"+0-1","+1+0","-1+0","+0+1"},
[01]={'+0+1','+1+0','-2+0','-2-1','+1+2'},
[10]={'+2+0','-1+0','-1-2','+2+1','+0+1'},
[03]={'+0+1','-1+0','+2+0','+2-1','-1+2'},
[30]={'-2+0','+1+0','+1-2','-2+1','+0+1'},
[12]={'-1+0','+2+0','+2-1','+0-1','-1+2'},
[21]={'-2+0','+1+0','+1-2','-2+1','+0+1'},
[32]={'+1+0','-2+0','-2-1','+0-1','+1+2'},
[23]={'+2+0','-1+0','-1-2','+2+1','+0+1'},
[02]={'-1+0','+1+0','+0-1','+0+1'},
[20]={'+1+0','-1+0','+0+1','+0-1'},
[13]={'+0-1','-1+0','+1+0','+0+1'},
[31]={'+0-1','+1+0','-1+0','+0+1'},
},--I
{
[01]={"-1+0","+0+1","+1+1","+0-3","+0+2","+0+3","-1+2"},
[10]={"+1+0","+0-1","-1-1","+0-2","+0-3","+0+3","+1-2"},
[03]={"+1+0","+0-3","+0+1","+0+2","+0+3","+1+2"},
[30]={"-1+0","+0+1","+0-2","+0-3","+0+3","-1-2"},
[01]={'-1+0','+0+1','+1+1','+0-3','+0+2','+0+3','-1+2'},
[10]={'+1+0','+0-1','-1-1','+0-2','+0-3','+0+3','+1-2'},
[03]={'+1+0','+0-3','+0+1','+0+2','+0+3','+1+2'},
[30]={'-1+0','+0+1','+0-2','+0-3','+0+3','-1-2'},
},--Z5
false,--S5
{
[01]={"-1+0","-1+1","+0-2","-1-2","-1-1","+0+1"},
[10]={"+1+0","+1-1","+0+2","+1+2","+0-1","+1+1"},
[03]={"+1+0","+1+1","+0-2","-1+1"},
[30]={"-1+0","-1-1","+0+2","-1+2"},
[12]={"+1+0","+1-1","+0+2","+1+2","+1+1"},
[21]={"-1+0","-1-1","-1+1","+0-2","-1-2","-1-1"},
[32]={"-1+0","-1-1","-1+1","+0-1","+0+2","-1+2"},
[23]={"+1+0","+1+1","-1+0","+0-2","+1-2"},
[02]={"-1+0","+0-1","+0+1"},
[20]={"+1+0","+0+1","+0-1"},
[13]={"+1+0","+0+1","-1+0"},
[31]={"-1+0","+0-1","+1+0"},
[01]={'-1+0','-1+1','+0-2','-1-2','-1-1','+0+1'},
[10]={'+1+0','+1-1','+0+2','+1+2','+0-1','+1+1'},
[03]={'+1+0','+1+1','+0-2','-1+1'},
[30]={'-1+0','-1-1','+0+2','-1+2'},
[12]={'+1+0','+1-1','+0+2','+1+2','+1+1'},
[21]={'-1+0','-1-1','-1+1','+0-2','-1-2','-1-1'},
[32]={'-1+0','-1-1','-1+1','+0-1','+0+2','-1+2'},
[23]={'+1+0','+1+1','-1+0','+0-2','+1-2'},
[02]={'-1+0','+0-1','+0+1'},
[20]={'+1+0','+0+1','+0-1'},
[13]={'+1+0','+0+1','-1+0'},
[31]={'-1+0','+0-1','+1+0'},
},--P
false,--Q
{
[01]={"-1+0","+1+0","-1+1","+0-2","+0-3"},
[10]={"+1+0","+1-1","-1+0","+0+2","+0+3"},
[03]={"+1+0","+1-1","+0+1","+0-2","+0-3"},
[30]={"-1+1","+1+0","+0-1","+0+2","+0+3"},
[12]={"+1+0","+0-1","-1+0","+0+2"},
[21]={"-1+0","+0+1","+1+0","+0-2"},
[32]={"-1+0","+0+1","-1+1","+1+0","+0+2","-2+0"},
[23]={"+1+0","+1-1","+0-1","-1+0","+0-2","+2+0"},
[02]={"+1+0","-1+0","-1-1"},
[20]={"-1+0","+1+0","+1+1"},
[13]={"+0-1","-1+1","+0+1"},
[31]={"+0-1","+1-1","+0+1"},
[01]={'-1+0','+1+0','-1+1','+0-2','+0-3'},
[10]={'+1+0','+1-1','-1+0','+0+2','+0+3'},
[03]={'+1+0','+1-1','+0+1','+0-2','+0-3'},
[30]={'-1+1','+1+0','+0-1','+0+2','+0+3'},
[12]={'+1+0','+0-1','-1+0','+0+2'},
[21]={'-1+0','+0+1','+1+0','+0-2'},
[32]={'-1+0','+0+1','-1+1','+1+0','+0+2','-2+0'},
[23]={'+1+0','+1-1','+0-1','-1+0','+0-2','+2+0'},
[02]={'+1+0','-1+0','-1-1'},
[20]={'-1+0','+1+0','+1+1'},
[13]={'+0-1','-1+1','+0+1'},
[31]={'+0-1','+1-1','+0+1'},
},--F
false,--E
{
[01]={"+0-1","-1-1","+1+0","+1+1","+0-3","-1+0","+0+2","-1+2"},
[10]={"+1+0","+0-1","-1-1","+0-2","-1+1","+0-3","+1-2","+0+1"},
[03]={"+0-1","+1-1","-1+0","-1+1","+0-3","+1+0","+0+2","+1+2"},
[30]={"-1+0","+0-1","+1-1","+0-2","+1+1","+0-3","-1-2","+0+1"},
[12]={"+1+0","-1+0","+0-2","+0-3","+0+1","-1+1"},
[21]={"+1-1","-1+0","+1+0","+0-1","+0+2","+0+3"},
[32]={"-1+0","+1+0","+0-2","+0-3","+0+1","+1+1"},
[23]={"-1-1","+1+0","-1+0","+0-1","+0+2","+0+3"},
[02]={"+0-1","+0+1","+0+2"},
[20]={"+0-1","+0+1","+0-2"},
[13]={"+1+0","-1+1","-2+0"},
[31]={"-1+0","+1+1","+2+0"},
[01]={'+0-1','-1-1','+1+0','+1+1','+0-3','-1+0','+0+2','-1+2'},
[10]={'+1+0','+0-1','-1-1','+0-2','-1+1','+0-3','+1-2','+0+1'},
[03]={'+0-1','+1-1','-1+0','-1+1','+0-3','+1+0','+0+2','+1+2'},
[30]={'-1+0','+0-1','+1-1','+0-2','+1+1','+0-3','-1-2','+0+1'},
[12]={'+1+0','-1+0','+0-2','+0-3','+0+1','-1+1'},
[21]={'+1-1','-1+0','+1+0','+0-1','+0+2','+0+3'},
[32]={'-1+0','+1+0','+0-2','+0-3','+0+1','+1+1'},
[23]={'-1-1','+1+0','-1+0','+0-1','+0+2','+0+3'},
[02]={'+0-1','+0+1','+0+2'},
[20]={'+0-1','+0+1','+0-2'},
[13]={'+1+0','-1+1','-2+0'},
[31]={'-1+0','+1+1','+2+0'},
},--T5
{
[01]={"-1+0","-1+1","+0-2","-1-2"},
[10]={"+1+0","+1-1","+0+2","+1+2"},
[03]={"+1+0","+1+1","+0-2","+1-2"},
[30]={"-1+0","-1-1","+0-2","-1+2"},
[12]={"+1+0","+1-1","+1+1"},
[21]={"-1-1","-1+1","-1-1"},
[32]={"-1+0","-1-1","-1+1"},
[23]={"+1-1","+1+1","+1-1"},
[02]={"+0+1"},
[20]={"+0-1"},
[13]={"+0-1","+0+1","+1+0"},
[31]={"+0-1","+0+1","-1+0"},
[01]={'-1+0','-1+1','+0-2','-1-2'},
[10]={'+1+0','+1-1','+0+2','+1+2'},
[03]={'+1+0','+1+1','+0-2','+1-2'},
[30]={'-1+0','-1-1','+0-2','-1+2'},
[12]={'+1+0','+1-1','+1+1'},
[21]={'-1-1','-1+1','-1-1'},
[32]={'-1+0','-1-1','-1+1'},
[23]={'+1-1','+1+1','+1-1'},
[02]={'+0+1'},
[20]={'+0-1'},
[13]={'+0-1','+0+1','+1+0'},
[31]={'+0-1','+0+1','-1+0'},
},--U
{
[01]={"+0+1","-1+0","+0-2","-1-2"},
[10]={"+0+1","+1+0","+0-2","+1-2"},
[03]={"+0-1","+0+1","+0+2"},
[30]={"+0-1","+0+1","+0-2"},
[12]={"+0-1","+0+1"},
[21]={"+0-1","+0-2"},
[32]={"+1+0","-1+0"},
[23]={"-1+0","+1+0"},
[02]={"-1+1","+1-1"},
[20]={"+1-1","-1+1"},
[13]={"+1+1","-1-1"},
[31]={"-1-1","+1+1"},
[01]={'+0+1','-1+0','+0-2','-1-2'},
[10]={'+0+1','+1+0','+0-2','+1-2'},
[03]={'+0-1','+0+1','+0+2'},
[30]={'+0-1','+0+1','+0-2'},
[12]={'+0-1','+0+1'},
[21]={'+0-1','+0-2'},
[32]={'+1+0','-1+0'},
[23]={'-1+0','+1+0'},
[02]={'-1+1','+1-1'},
[20]={'+1-1','-1+1'},
[13]={'+1+1','-1-1'},
[31]={'-1-1','+1+1'},
},--V
{
[01]={"+0-1","-1+0","+1+0","+1-1","+0+2"},
[10]={"+0-1","-1-1","+0+1","+0-2","+1-2","+0+2"},
[03]={"+1+0","+1+1","+0-1","+0-2","+0-3","+1-1","+0+1","+0+2","+0+3"},
[30]={"-1+0","-1+1","+0-1","+0-2","+0-3","-1-1","+0+1","+0+2","+0+3"},
[12]={"+1+0","+0-1","-2+0","+1+1","-1+0","+0+1","-1-1"},
[21]={"-1+0","+0-1","+2+0","-1+1","+1+0","+0+1","+1-1"},
[32]={"+0-1","+1+0","+0+1","-1+0","-1-1","+0+2"},
[23]={"+0-1","+1-1","+0+1","+0-2","-1-2","+0+2"},
[02]={"+0-1","-1+0"},
[20]={"+0+1","+1+0"},
[13]={"+0+1","-1+0"},
[31]={"+0-1","+1+0"},
[01]={'+0-1','-1+0','+1+0','+1-1','+0+2'},
[10]={'+0-1','-1-1','+0+1','+0-2','+1-2','+0+2'},
[03]={'+1+0','+1+1','+0-1','+0-2','+0-3','+1-1','+0+1','+0+2','+0+3'},
[30]={'-1+0','-1+1','+0-1','+0-2','+0-3','-1-1','+0+1','+0+2','+0+3'},
[12]={'+1+0','+0-1','-2+0','+1+1','-1+0','+0+1','-1-1'},
[21]={'-1+0','+0-1','+2+0','-1+1','+1+0','+0+1','+1-1'},
[32]={'+0-1','+1+0','+0+1','-1+0','-1-1','+0+2'},
[23]={'+0-1','+1-1','+0+1','+0-2','-1-2','+0+2'},
[02]={'+0-1','-1+0'},
[20]={'+0+1','+1+0'},
[13]={'+0+1','-1+0'},
[31]={'+0-1','+1+0'},
},--W
function(P,d)
if P.type=='human'then SFX.play('rotate',nil,P:getCenterX()*.15)end
@@ -301,89 +301,89 @@ do
P:freshBlock('fresh')
end,--X
{
[01]={"-1+0","-1+1","+0-3","-1+1","-1+2","+0+1"},
[10]={"-1+0","+1-1","+0+3","+1-1","+1-2","+0+1"},
[03]={"+0-1","+1-1","-1+0","+1+1","+0-2","+1-2","+0-3","+1-3","-1+1"},
[30]={"+0+1","-1+1","+1+0","-1-1","+0+2","-1+2","+0+3","-1+3","+1-1"},
[12]={"+1+0","+1-1","+0-1","+1-2","+0-2","+1+1","-1+0","+0+2","+1+2"},
[21]={"-1+0","-1+1","+0+1","-1+2","+0+2","-1-1","+1+0","+0-2","-1-2"},
[32]={"-1+0","-1+1","-1-1","+1+0","+0+2","-1+2","+0-2"},
[23]={"+1+0","+1-1","+1+1","-1+0","+0-2","+1-2","+0+2"},
[02]={"+0-1","+1-1","-1+0","+2-1"},
[20]={"+0+1","-1+1","+1+0","-2+1"},
[13]={"-1+0","-1-1","+0+1","-1-2"},
[31]={"+1+0","+1+1","+0-1","+1+2"},
[01]={'-1+0','-1+1','+0-3','-1+1','-1+2','+0+1'},
[10]={'-1+0','+1-1','+0+3','+1-1','+1-2','+0+1'},
[03]={'+0-1','+1-1','-1+0','+1+1','+0-2','+1-2','+0-3','+1-3','-1+1'},
[30]={'+0+1','-1+1','+1+0','-1-1','+0+2','-1+2','+0+3','-1+3','+1-1'},
[12]={'+1+0','+1-1','+0-1','+1-2','+0-2','+1+1','-1+0','+0+2','+1+2'},
[21]={'-1+0','-1+1','+0+1','-1+2','+0+2','-1-1','+1+0','+0-2','-1-2'},
[32]={'-1+0','-1+1','-1-1','+1+0','+0+2','-1+2','+0-2'},
[23]={'+1+0','+1-1','+1+1','-1+0','+0-2','+1-2','+0+2'},
[02]={'+0-1','+1-1','-1+0','+2-1'},
[20]={'+0+1','-1+1','+1+0','-2+1'},
[13]={'-1+0','-1-1','+0+1','-1-2'},
[31]={'+1+0','+1+1','+0-1','+1+2'},
},--J5
false,--L5
{
[01]={"-1+0","-1+0","-1+1","+1+0","-1+2","-1-1","+0-3","+0+1"},
[10]={"-1+0","+1+0","+1-1","+1+0","+1-2","+1+1","+0+3","+0+1"},
[03]={"+0-1","+1+0","+1-1","-1+0","+1+1","+0-2","+1-2","+0-3","+1-3","-1+1"},
[30]={"+0+1","-1+0","-1+1","+1+0","-1-1","+0+2","-1+2","+0+3","-1+3","+1-1"},
[12]={"+1+0","+1-1","+0-1","+1-2","+0-2","+1+1","-1+0","+0+2","+1+2"},
[21]={"-1+0","-1+1","+0+1","-1+2","+0+2","-1-1","+1+0","+0-2","-1-2"},
[32]={"+0-1","-1+0","-1+1","-1-1","+1+0","+0+2","-1+2","+0-2"},
[23]={"+0+1","+1+0","+1-1","+1+1","-1+0","+0-2","+1-2","+0+2"},
[02]={"+0-1","+1-1","-1+0","+2-1","+0+1"},
[20]={"+0+1","-1+1","+1+0","-2+1","+0-1"},
[13]={"-1+0","-1-1","+0+1","-1-2"},
[31]={"+1+0","+1+1","+0-1","+1+2"},
[01]={'-1+0','-1+0','-1+1','+1+0','-1+2','-1-1','+0-3','+0+1'},
[10]={'-1+0','+1+0','+1-1','+1+0','+1-2','+1+1','+0+3','+0+1'},
[03]={'+0-1','+1+0','+1-1','-1+0','+1+1','+0-2','+1-2','+0-3','+1-3','-1+1'},
[30]={'+0+1','-1+0','-1+1','+1+0','-1-1','+0+2','-1+2','+0+3','-1+3','+1-1'},
[12]={'+1+0','+1-1','+0-1','+1-2','+0-2','+1+1','-1+0','+0+2','+1+2'},
[21]={'-1+0','-1+1','+0+1','-1+2','+0+2','-1-1','+1+0','+0-2','-1-2'},
[32]={'+0-1','-1+0','-1+1','-1-1','+1+0','+0+2','-1+2','+0-2'},
[23]={'+0+1','+1+0','+1-1','+1+1','-1+0','+0-2','+1-2','+0+2'},
[02]={'+0-1','+1-1','-1+0','+2-1','+0+1'},
[20]={'+0+1','-1+1','+1+0','-2+1','+0-1'},
[13]={'-1+0','-1-1','+0+1','-1-2'},
[31]={'+1+0','+1+1','+0-1','+1+2'},
},--R
false,--Y
{
[01]={"-1+0","-1+1","+0+1","+1+0","-1+2","-2+0","+0-2"},
[10]={"+1+0","-1+0","+0-1","+1-1","+1-2","+2+0","+0+2"},
[03]={"-1+0","+1-1","+0-2","+0-3","+1+0","+1-2","+1-3","+0+1","-1+1"},
[30]={"-1+0","+1-1","+1-2","+1+0","+0-2","+1-3","-1+2","+0+3","-1+3"},
[12]={"-1+0","+1-1","-1-1","+1-2","+1+0","+0-2","+1-3","-1+2","+0+3","-1+3"},
[21]={"-1+0","+1-1","+1+1","+0-2","+0-3","+1+0","+1-2","+1-3","+0+1","-1+1"},
[32]={"-1+0","+0-1","-1-2","+1-1","+1+0","+1+1","+0+2","+0+3"},
[23]={"+0-2","+0-3","+1+2","+1+0","+0+1","-1+1","+0-1","+0+2"},
[02]={"-1+0","+0+2","+0-1"},
[20]={"+1+0","+0-2","+0+1"},
[13]={"-1+0","-1-1","+0+1","+1+2"},
[31]={"+1+0","+1+1","+0-1","-1-2"},
[01]={'-1+0','-1+1','+0+1','+1+0','-1+2','-2+0','+0-2'},
[10]={'+1+0','-1+0','+0-1','+1-1','+1-2','+2+0','+0+2'},
[03]={'-1+0','+1-1','+0-2','+0-3','+1+0','+1-2','+1-3','+0+1','-1+1'},
[30]={'-1+0','+1-1','+1-2','+1+0','+0-2','+1-3','-1+2','+0+3','-1+3'},
[12]={'-1+0','+1-1','-1-1','+1-2','+1+0','+0-2','+1-3','-1+2','+0+3','-1+3'},
[21]={'-1+0','+1-1','+1+1','+0-2','+0-3','+1+0','+1-2','+1-3','+0+1','-1+1'},
[32]={'-1+0','+0-1','-1-2','+1-1','+1+0','+1+1','+0+2','+0+3'},
[23]={'+0-2','+0-3','+1+2','+1+0','+0+1','-1+1','+0-1','+0+2'},
[02]={'-1+0','+0+2','+0-1'},
[20]={'+1+0','+0-2','+0+1'},
[13]={'-1+0','-1-1','+0+1','+1+2'},
[31]={'+1+0','+1+1','+0-1','-1-2'},
},--N
false,--H
{
[01]={"+1-1","+1+0","+1+1","+0+1","-1+1","-1+0","-1-1","+0-1","+0-2","-2-1","-2-2","+2+0","+2-1","+2-2","+1+2","+2+2","-1+2","-2+2"},
[10]={"-1+0","-1-1","+0-1","+1-1","-2-2","-2-1","-2+0","-1-2","+0-2","+1-2","+2-2","-1+1","-2+1","-2+2","+1+0","+2+0","+2-1","+0+1","+1-1","+2-2"},
[03]={"-1-1","-1+0","-1+1","-0+1","+1+1","+1+0","+1-1","-0-1","-0-2","+2-1","+2-2","-2+0","-2-1","-2-2","-1+2","-2+2","+1+2","+2+2"},
[30]={"+1+0","+1-1","-0-1","-1-1","+2-2","+2-1","+2+0","+1-2","-0-2","-1-2","-2-2","+1+1","+2+1","+2+2","-1+0","-2+0","-2-1","+0+1","-1-1","-2-2"},
[01]={'+1-1','+1+0','+1+1','+0+1','-1+1','-1+0','-1-1','+0-1','+0-2','-2-1','-2-2','+2+0','+2-1','+2-2','+1+2','+2+2','-1+2','-2+2'},
[10]={'-1+0','-1-1','+0-1','+1-1','-2-2','-2-1','-2+0','-1-2','+0-2','+1-2','+2-2','-1+1','-2+1','-2+2','+1+0','+2+0','+2-1','+0+1','+1-1','+2-2'},
[03]={'-1-1','-1+0','-1+1','-0+1','+1+1','+1+0','+1-1','-0-1','-0-2','+2-1','+2-2','-2+0','-2-1','-2-2','-1+2','-2+2','+1+2','+2+2'},
[30]={'+1+0','+1-1','-0-1','-1-1','+2-2','+2-1','+2+0','+1-2','-0-2','-1-2','-2-2','+1+1','+2+1','+2+2','-1+0','-2+0','-2-1','+0+1','-1-1','-2-2'},
},--I5
{
[01]={"-1+0","-1-1","+1+1","-1+1"},
[10]={"-1+0","+1+0","-1-1","+1+1"},
[03]={"+1+0","+1-1","-1+1","+1+1"},
[30]={"+1+0","-1+0","+1-1","-1+1"},
[01]={'-1+0','-1-1','+1+1','-1+1'},
[10]={'-1+0','+1+0','-1-1','+1+1'},
[03]={'+1+0','+1-1','-1+1','+1+1'},
[30]={'+1+0','-1+0','+1-1','-1+1'},
},--I3
{
[01]={"-1+0","+1+0"},
[10]={"+1+0","-1+0"},
[03]={"+0+1","+0-1"},
[30]={"+0-1","+0+1"},
[12]={"+0+1","+0-1"},
[21]={"+0-1","+0+1"},
[32]={"-1+0","+1+0"},
[23]={"+1+0","-1+0"},
[02]={"+0-1","+1-1","-1-1"},
[20]={"+0+1","-1+1","+1+1"},
[13]={"+0-1","-1-1","+1-1"},
[31]={"+0+1","+1+1","-1+1"},
[01]={'-1+0','+1+0'},
[10]={'+1+0','-1+0'},
[03]={'+0+1','+0-1'},
[30]={'+0-1','+0+1'},
[12]={'+0+1','+0-1'},
[21]={'+0-1','+0+1'},
[32]={'-1+0','+1+0'},
[23]={'+1+0','-1+0'},
[02]={'+0-1','+1-1','-1-1'},
[20]={'+0+1','-1+1','+1+1'},
[13]={'+0-1','-1-1','+1-1'},
[31]={'+0+1','+1+1','-1+1'},
},--C
{
[01]={"-1+0","+0+1"},
[10]={"+1+0","+0+1"},
[03]={"+1+0","+0+1"},
[30]={"-1+0","+0+1"},
[12]={"+1+0","+0+2"},
[21]={"+0-1","-1+0"},
[32]={"-1+0","+0+2"},
[23]={"+0-1","-1+0"},
[02]={"+0-1","+0+1"},
[20]={"+0+1","+0-1"},
[13]={"-1+0","+1+0"},
[31]={"+1+0","-1+0"},
[01]={'-1+0','+0+1'},
[10]={'+1+0','+0+1'},
[03]={'+1+0','+0+1'},
[30]={'-1+0','+0+1'},
[12]={'+1+0','+0+2'},
[21]={'+0-1','-1+0'},
[32]={'-1+0','+0+2'},
[23]={'+0-1','-1+0'},
[02]={'+0-1','+0+1'},
[20]={'+0+1','+0-1'},
[13]={'-1+0','+1+0'},
[31]={'+1+0','-1+0'},
},--I2
nil,--O1
}
@@ -405,14 +405,14 @@ local SRS
do
SRS={
{
[01]={"-1+0","-1+1","+0-2","-1-2"},
[10]={"+1+0","+1-1","+0+2","+1+2"},
[03]={"+1+0","+1+1","+0-2","+1-2"},
[30]={"-1+0","-1-1","+0+2","-1+2"},
[12]={"+1+0","+1-1","+0+2","+1+2"},
[21]={"-1+0","-1+1","+0-2","-1-2"},
[32]={"-1+0","-1-1","+0+2","-1+2"},
[23]={"+1+0","+1+1","+0-2","+1-2"},
[01]={'-1+0','-1+1','+0-2','-1-2'},
[10]={'+1+0','+1-1','+0+2','+1+2'},
[03]={'+1+0','+1+1','+0-2','+1-2'},
[30]={'-1+0','-1-1','+0+2','-1+2'},
[12]={'+1+0','+1-1','+0+2','+1+2'},
[21]={'-1+0','-1+1','+0-2','-1-2'},
[32]={'-1+0','-1-1','+0+2','-1+2'},
[23]={'+1+0','+1+1','+0-2','+1-2'},
[02]={},[20]={},[13]={},[31]={},
},--Z
false,--S
@@ -421,14 +421,14 @@ do
false,--T
noKickSet,--O
{
[01]={"-2+0","+1+0","-2-1","+1+2"},
[10]={"+2+0","-1+0","+2+1","-1-2"},
[12]={"-1+0","+2+0","-1+2","+2-1"},
[21]={"+1+0","-2+0","+1-2","-2+1"},
[23]={"+2+0","-1+0","+2+1","-1-2"},
[32]={"-2+0","+1+0","-2-1","+1+2"},
[30]={"+1+0","-2+0","+1-2","-2+1"},
[03]={"-1+0","+2+0","-1+2","+2-1"},
[01]={'-2+0','+1+0','-2-1','+1+2'},
[10]={'+2+0','-1+0','+2+1','-1-2'},
[12]={'-1+0','+2+0','-1+2','+2-1'},
[21]={'+1+0','-2+0','+1-2','-2+1'},
[23]={'+2+0','-1+0','+2+1','-1-2'},
[32]={'-2+0','+1+0','-2-1','+1+2'},
[30]={'+1+0','-2+0','+1-2','-2+1'},
[03]={'-1+0','+2+0','-1+2','+2-1'},
[02]={},[20]={},[13]={},[31]={},
}--I
}
@@ -441,7 +441,7 @@ end
local C2
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)
C2={
{
@@ -455,8 +455,8 @@ end
local C2sym
do
local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"}
local R={"+0+0","+1+0","-1+0","+0-1","+1-1","-1-1","+2+0","-2+0"}
local L={'+0+0','-1+0','+1+0','+0-1','-1-1','+1-1','-2+0','+2+0'}
local R={'+0+0','+1+0','-1+0','+0-1','+1-1','-1-1','+2+0','-2+0'}
local Z={
[01]=R,[10]=L,[03]=L,[30]=R,

View File

@@ -6,6 +6,12 @@ return{
"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."
},
{"Official website",
"official website homepage",
"help",
"Official website of Techmino!\nYou can modify your profile on it",
"http://home.techmino.org",
},
{"To New Players",
"guide newbie noob",
"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.)",
"https://tetris.huijiwiki.com",
},
{"Applets",
"applets",
"help",
"[Entrance of applets has been moved to console]",
},
--Games
{"TTT",
@@ -95,7 +96,7 @@ return{
{"Nuketris",
"nuketris",
"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",
},
{"WWC",
@@ -184,7 +185,8 @@ return{
{"Falling lightblock",
"fl fallinglightblock",
"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 qq",
@@ -231,7 +233,12 @@ return{
{"SPM",
"spm linessentperminute",
"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 digperminute defendperminute",
@@ -348,7 +355,7 @@ return{
{"NRS",
"nrs nintendorotationsystem",
"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 arikrotationsystem atarirotationsystem",
@@ -363,7 +370,7 @@ return{
{"TRS",
"trs techminorotationsystem",
"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",
@@ -381,11 +388,10 @@ return{
"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.",
},
{"Modern Stack-game",
{"Modern Tetris",
"modern",
"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 initialrotationsystem",
@@ -442,6 +448,11 @@ return{
"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.",
},
{"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",
"sidewell",
"term",
@@ -487,6 +498,11 @@ return{
"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.",
},
{"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",
"63stacking",
"term",
@@ -500,7 +516,7 @@ return{
{"Topping out",
"die death topout toppingout",
"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",
"fallingspeed",
@@ -554,7 +570,7 @@ return{
{"His generator",
"history hisgenerator",
"term",
"A way to generate pieces, notably used in Tetris: The Grand Master games. Every time a random Tetrimino is selected, but if this Tetrimino is the same as one of the few previous pieces, then reroll until a different piece is rolled or until a reroll limit is reached.\nFor example, a \"his 4 roll 6\" (h4r6) generator rerolls when the piece is the same as one of the 4 previous pieces, and rerolls up to 6 times.",--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",
@@ -801,22 +817,42 @@ return{
{"Console",
"console cmd commamd minglinghang kongzhitai",
"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 chongzhi qingkong jiesuo",
"reset unlock",
"command",
"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 chongzhi paihangbang",
{"Reset records",
"reset record",
"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 statistic data chongzhi tongji shuju",
{"Reset key",
"reset virtualkey",
"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
@@ -923,9 +959,9 @@ return{
"The name of this thing... or Zictionary for short.\nUsed to be a chat bot that serves for the same function, and mostly uses the same list of keywords.",
},
{"MrZ",
"mrz626",
"mrz 626",
"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",
},
@@ -965,9 +1001,9 @@ return{
"https://space.bilibili.com/787096",
},
{"gggf",
"gggf kissne",
"xiaoqi kissne gggf",
"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",
},
{"蕴空之灵",

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[点击右下角按钮打开链接]",
"https://bilibili.com/read/cv2352939",
},
{"游戏官网",
"official website homepage guanwang",
"help",
"Techmino的官网!\n可以在上面修改头像和个人信息",
"http://home.techmino.org",
},
{"Tetris Wiki",
"tetris wiki",
"help",
@@ -31,11 +37,6 @@ return{
"俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n目前其大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki",
"https://tetris.huijiwiki.com",
},
{"小程序",
"小程序 applets",
"help",
"[小程序入口已移动至控制台]",
},
--游戏(题库)
{"TTT",
@@ -238,6 +239,11 @@ return{
"term",
"Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力\n\n或:防御(抵消+挖掘)每分",
},
{"RPM",
"rpm receive jieshou",
"term",
"Receive per Minute\n接收每分,即玩家每分钟收到来自对手的垃圾行数。\n一定程度体现玩家被对手施加的压力",
},
{"ADPM",
"adpm attack defend vs",
"term",
@@ -368,7 +374,7 @@ return{
"Techmino Rotation System\nTechmino独有的旋转系统基于SRS设计修补了一些常见SZ卡死的地形增加了不少实用踢墙每个五连块也基本按照SRS的spin逻辑单独设计了踢墙表。",
},
--术语(游戏内名词)
--术语(其他)
{"B2B",
"大满贯 b2b btb backtoback",
"term",
@@ -384,8 +390,6 @@ return{
"term",
"一种特殊T2的名字不同的游戏内的攻击可能不一样没有特殊价值可以不详细了解。",
},
--术语(其他)
{"现代方块",
"现代方块 modern xiandaikuai",
"term",
@@ -446,6 +450,11 @@ return{
"term",
"从第二次消除起叫1ren/combo打出的攻击根据游戏设计的不同也不同",
},
{"Spike",
"spike baofa xingbao",
"term",
"爆发攻击\n指短时间内打出大量的攻击本游戏和TETR.IO中有spike计数器可以看到自己短时间内打出了多少攻击。\n注意网络卡顿导致的累计攻击瞬间释放不算spike。",
},
{"Side",
"连击 ·side",
"term",
@@ -509,7 +518,7 @@ return{
{"死亡判定",
"死亡判定 die death siwang",
"term",
"现代方块普遍使用的死亡判定:\n1.新出现的方块和场地方块有重叠(窒息)(c4w比s4w强的原因因为被打进18行都不会窒息)\n2.方块锁定时完全在场地的外面\n3.所有东西的总高度超出40。\n\n注:本游戏使用的死亡判定不包含上述的第二条并且第三条的40改成42",
"现代方块普遍使用的死亡判定:\n1.新出现的方块和场地方块有重叠(窒息)(c4w比s4w强的原因因为被打进18行都不会窒息)\n2.方块锁定时完全在场地的外面\n3.所有东西的总高度超出40。\n\n注:本游戏使用的死亡判定不包含上述的第二条和第三条",
},
{"下落速度",
"下落速度 drop speed",
@@ -810,22 +819,42 @@ return{
{"控制台",
"console cmd commamd minglinghang kongzhitai",
"command",
"目前进入控制台的方式是在主菜单点特定位置/按键盘某个键数次",
"目前进入控制台的方式是在主菜单 点特定位置/按键盘某个键 数次",
},
{"重置解锁状态",
"reset unlock chongzhi qingkong jiesuo",
{"重置设置",
"reset setting chongzhi qingkong shezhi",
"command",
"前往控制台输入\"rm conf/unlock\"并回车\n需要重启游戏生效,若反悔,刷新任意一个模式在地图上的状态即可恢复文件",
},
{"重置本地排行榜",
"reset chongzhi paihangbang",
"command",
"前往控制台输入\"rm /s record\"并回车\n需要重启游戏生效,若反悔,玩一局并更新模式排行榜即可恢复保存对应模式的单个排行榜文件",
"前往控制台输入\"rm conf/setting\"并回车\n需要重启游戏生效若反悔,进入设置菜单再退出即可恢复文件",
},
{"重置统计数据",
"reset statistic data chongzhi tongji shuju",
"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 xiaoz zictionary tetrodictionary littlez",
"name",
"这个词典的名字!曾经是群里的答疑机器人,此词典数据库沿用机器人问答库~",
"这个词典的名字!曾经是群里的答疑机器人,此词典数据库开始也是沿用机器人问答库~",
},
{"MrZ",
"mrz zjiang ddd 026 t626",
"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",
},
@@ -976,9 +1005,9 @@ return{
"https://space.bilibili.com/787096",
},
{"gggf",
"gggf kissne t127",
"xiaoqi kissne gggf t127",
"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",
},
{"蕴空之灵",

View File

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

View File

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

View File

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

View File

@@ -1,9 +1,7 @@
return{
fallback=4,
back="Atrás",
anykey="Pulsa cualquier tecla",
sureQuit="Pulsa de nuevo para salir",
newVersion="¡Gracias por actualizar! Detalles a continuación:",
httpTimeout="¡Tiempo de espera de conexión agotado!",
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.",
@@ -16,7 +14,6 @@ return{
clear={"Single","Doble","Triple","Techrash","Pentacrash","Hexacrash"},
mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Half Clear",
hold="Reserva",next="Sig.",
replaying="[Repetición]",
stage="Nivel $1",
@@ -51,18 +48,18 @@ return{
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_mission="La IA no es compatible con misiones personalizadas.",
settingSaved="Cambios guardados",
saveDone="Datos guardados",
saveError="Error al guardar:",
loadError="Error al cargar:",
switchSpawnSFX="Habilita los sonidos de aparición de las piezas ;)",
getRank="Rango obtenido:",
needRestart="Reinicia Techmino para que los cambios tengan efecto.",
exportSuccess="Exportado con éxito",
importSuccess="Importado con éxito",
dataCorrupted="Los datos están corruptos.",
-- pasteWrongPlace="Paste at wrong place?",
-- noFile="File not found",
VKTchW="Sens. al tacto",
VKOrgW="Sens. al origen",
@@ -73,10 +70,9 @@ return{
newRecord="¡Nuevo Récord!",
getNoticeFail="Error al buscar novedades.",
getVersionFail="Error al buscar nuevas versiones.",
oldVersion="¡Está disponible la nueva versión $1!",
needUpdate="¡Nueva versión requerida!",
-- noInternet="Not connected to the network",
-- versionNotMatch="Version do not match!",
-- needUpdate="¡Nueva versión requerida!",
notFinished="Próximamente",
jsonError="Error en Json",
@@ -91,19 +87,22 @@ return{
loginFailed="Error al ingresar",
accessSuccessed="¡Autorizado exitoso!",
accessFailed="Error al autorizar",
wsSuccessed="WebSocket: conectado",
-- wsConnecting="Websocket: Connecting",
wsFailed="WebSocket: conexión fallida",
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!",
-- started="Playing",
joinRoom="entró a la sala.",
leaveRoom="salió de la sala.",
-- ready="READY",
-- set="SET",
champion="$1 ganó!",
-- connStream="CONNECTING",
-- waitStream="WAITING",
-- spectating="Spectating",
chatRemain="Usuarios en línea: ",
chatStart="------Comienzo del historial------",
chatHistory="------Nuevos mensajes------",
@@ -128,14 +127,7 @@ return{
"Finesse:",
},
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={
"D'PM",
"ADPM",
"APM",
"SPM",
"L'PM",
"DPM",
},
radarData={"D'PM","ADPM","APM","SPM","L'PM","DPM"},
stat={
"Veces Iniciado:",
"Veces Jugado:",
@@ -149,9 +141,9 @@ return{
"PC/HPC:",
"Err.Fns./RatioFns:",
},
help={
aboutTexts={
"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",
"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]",
"Artistas: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Música: MrZ, ERM, [T0722]",
"Música: MrZ, ERM, [T0722, Aether]",
"Voces/Sonidos: Miya, Naki, MrZ Performance: 模电, HBM",
"Performance: 模电, HBM",
"Traducción: User670, MattMayuga, Mizu, Mr.Faq, ScF",
@@ -178,8 +170,8 @@ return{
used=[[
Herramientas utilizadas:
Beepbox
GFIE
Goldwave
GFIE
FL Mobile
Librerías usadas:
Cold_Clear [MinusKelvin]
@@ -198,7 +190,6 @@ return{
setting="Opciones",
stat="Estadísticas",
music="Música y SFX",
about="Acerca del Juego",
dict="Zictionary",
manual="Manual",
},
@@ -224,26 +215,64 @@ return{
quit="Finalizar (Q)",
},
net_menu={
-- league="Tech League",
ffa="FFA",
rooms="Salas",
chat="Chat",
-- logout="Log out",
},
net_league={
-- match="Find Match",
},
net_rooms={
-- refreshing="Refreshing Rooms",
noRoom="No Hay Salas Actualmente",
refresh="Refrescar",
new="Sala Nueva(2)",
new2="Sala Nueva(5)",
-- new="New Room",
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={
ready="Estoy Listo",
-- spectate="Spectate",
-- cancel="Cancel",
},
net_chat={
send="Enviar",
},
setting_game={
title="Ajustes del Juego",
graphic="←Video",
@@ -258,7 +287,6 @@ return{
autoPause="Pausar cuando la ventana no está enfocada",
swap="Combinación de Teclas (Cambiar Modo de Ataque)",
fine="Sonido de Error de Finesse",
-- dataSaving="Data saving",
simpMode="Modo Sencillo",
},
setting_video={
@@ -282,29 +310,32 @@ return{
splashFX="FX Vis. de Splash",
shakeFX="Bamboleo del Tablero",
atkFX="FX Vis. de Ataque",
frame="Ratio de FPSs",
frame="Ratio de FPSs(%)",
text="Texto de Acciones",
score="Puntaje en Pantalla",
warn="Alerta de Peligro",
highCam="Cám. Vista Aérea",
-- bufferWarn="Buffer Alert",
-- showSpike="Spike Counter",
nextPos="Ver Spawn de Pza. Sig.",
fullscreen="Pant. Completa",
power="Inf. de Batería",
highCam="Cám. Vista Aérea",
warn="Alerta de Peligro",
-- clickFX="Click FX",
bg="Fondo",
power="Inf. de Batería",
clean="Fast Draw",
fullscreen="Pant. Completa",
bg="Fondo",
},
setting_sound={
title="Ajustes de Sonido",
game="←Juego",
graphic="Video→",
bgm="BGM",
sfx="SFX",
stereo="Estéreo",
spawn="Spawn de Pzas.",
warn="Alerta de Peligro",
bgm="BGM",
stereo="Estéreo",
vib="Vibración",
voc="Voces",
},
@@ -350,8 +381,12 @@ return{
setting_touch={
default="Por Defecto",
snap="Snap",
option="Opciones",
-- save1="Save1",
-- load1="Load1",
-- save2="Save2",
-- load2="Load2",
size="Tamaño",
-- shape="Shape",
},
setting_touchSwitch={
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.:",
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.:",
norm="Normal",
pro="Profesional",
hide="Mostrar Tec. Virtual",
track="Música Autom.",
icon="Ícono",
sfx="SFX",
vib="Vibr.",
icon="Ícono",
tkset="Ajustes de Canción",
alpha="Alpha",
},
setting_trackSetting={
VKDodge="Autoskip",
track="Música Autom.",
dodge="Autoskip",
},
customGame={
title="Juego Personalizado",
@@ -397,29 +431,28 @@ return{
field="Editar Tablero (F)",
sequence="Editar Secuencia (S)",
mission="Editar Misiones (M)",
},
custom_advance={
title="Juego Personalizado",
subTitle="Avanzado",
nextCount="Siguiente",
holdCount="Reserva",
infHold="Reserva Inft.",
phyHold="Reserva Limit.",
bone="Bone Block",
fieldH="Altura del tablero",
ospin="O-Spin",
deepDrop="Deep Drop",
target="Objetivo",
visible="Visibilidad",
freshLimit="Límite de Reinicio LD",
easyFresh="Reinicio de Bloqueo Normal",
fineKill="100% Finesse",
b2bKill="No Romper B2B ",
opponent="Oponente",
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={
title="Juego Personalizado",
@@ -508,6 +541,7 @@ return{
register="Registrarse",
email="Correo Elec.",
password="Contraseña",
-- keepPW="Remember me",
login="Entrar",
},
register={
@@ -563,15 +597,17 @@ return{
mode="Modo",
},
savedata={
exportUnlock="Exportar Desbloqueos",
exportData="Exportar Récords",
exportSetting="Exportar Ajustes",
exportVK="Exportar VK",
-- export="Export to clipboard",
-- import="Import from clipboard",
-- unlock="Progress",
-- data="Stats",
-- setting="Settings",
-- vk="Virtual Key Layout",
importUnlock="Importar Desbloqueos",
importData="Importar Datos",
importSetting="Importar Ajustes",
importVK="Importar VK",
-- couldSave="Cloud Save (need login) (CAUTION: TESTING)",
-- notLogin="[Login to access cloud save]",
-- upload="Upload to cloud",
-- download="Download from cloud",
},
error={
console="Console",
@@ -593,7 +629,7 @@ return{
['dig_400l']= {"Queso", "400L", "Limpia 400 líneas de queso."},
['dig_1000l']= {"Queso", "1000L", "Limpia 1000 líneas de queso."},
['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_h']= {"Maratón", "Difícil", "Maratón de 200 líneas a velocidad máxima."},
['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_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_inf']= {"Inf. PC Challenge","", "Get PCs as much as you can"},
['tech_n']= {"Tech", "Normal", "¡Mantén el B2B!"},
['tech_n_plus']= {"Tech", "Normal+", "¡Sólo se permiten Spins y PCs!"},
['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ú."},
['sprintFix']= {"Sprint", "Sin mover a Izq./Der."},
['sprintLock']= {"Sprint", "Sin rotar"},
-- ['sprintSmooth']= {"Sprint", "NO FRICTION"},
['marathon_bfmax']= {"Maratón", "Supremo"},
['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"},

View File

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

View File

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

View File

@@ -1,124 +1,125 @@
title={
{
53, 60,
1035, 0,
964, 218,
660, 218,
391, 1300,
231, 1154,
415, 218,
0, 218,
},
{
716, 290,
1429, 290,
1312, 462,
875, 489,
821, 695,
1148, 712,
1017, 902,
761, 924,
707, 1127,
1106, 1101,
1198, 1300,
465, 1300,
},
{
1516, 287,
2102, 290,
2036, 464,
1598, 465,
1322, 905,
1395, 1102,
1819, 1064,
1743, 1280,
1286, 1310,
1106, 902,
},
{
2179, 290,
2411, 290,
2272, 688,
2674, 666,
2801, 290,
3041, 290,
2693, 1280,
2464, 1280,
2601, 879,
2199, 897,
2056, 1280,
1828, 1280,
},
{
3123, 290,
3480, 290,
3496, 480,
3664, 290,
4017, 294,
3682, 1280,
3453, 1280,
3697, 578,
3458, 843,
3304, 842,
3251, 561,
3001, 1280,
2779, 1280,
},
{
4088, 290,
4677, 290,
4599, 501,
4426, 502,
4219, 1069,
4388, 1070,
4317, 1280,
3753, 1280,
3822, 1068,
3978, 1068,
4194, 504,
4016, 504,
},
{
4747, 290,
4978, 295,
4921, 464,
5186, 850,
5366, 290,
5599, 295,
5288, 1280,
5051, 1280,
5106, 1102,
4836, 709,
4641, 1280,
4406, 1280,
},
{
5814, 290,
6370, 295,
6471, 415,
6238, 1156,
6058, 1280,
5507, 1280,
5404, 1154,
5635, 416,
-- 5814, 290,
-- 5878, 463,
5770, 542,
5617, 1030,
5676, 1105,
5995, 1106,
6100, 1029,
6255, 541,
6199, 465,
5878, 463,
},
}
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
do--title
title={
{
53, 60,
1035, 0,
964, 218,
660, 218,
391, 1300,
231, 1154,
415, 218,
0, 218,
},
{
716, 290,
1429, 290,
1312, 462,
875, 489,
821, 695,
1148, 712,
1017, 902,
761, 924,
707, 1127,
1106, 1101,
1198, 1300,
465, 1300,
},
{
1516, 287,
2102, 290,
2036, 464,
1598, 465,
1322, 905,
1395, 1102,
1819, 1064,
1743, 1280,
1286, 1310,
1106, 902,
},
{
2179, 290,
2411, 290,
2272, 688,
2674, 666,
2801, 290,
3041, 290,
2693, 1280,
2464, 1280,
2601, 879,
2199, 897,
2056, 1280,
1828, 1280,
},
{
3123, 290,
3480, 290,
3496, 480,
3664, 290,
4017, 294,
3682, 1280,
3453, 1280,
3697, 578,
3458, 843,
3304, 842,
3251, 561,
3001, 1280,
2779, 1280,
},
{
4088, 290,
4677, 290,
4599, 501,
4426, 502,
4219, 1069,
4388, 1070,
4317, 1280,
3753, 1280,
3822, 1068,
3978, 1068,
4194, 504,
4016, 504,
},
{
4747, 290,
4978, 295,
4921, 464,
5186, 850,
5366, 290,
5599, 295,
5288, 1280,
5051, 1280,
5106, 1102,
4836, 709,
4641, 1280,
4406, 1280,
},
{
5814, 290,
6370, 295,
6471, 415,
6238, 1156,
6058, 1280,
5507, 1280,
5404, 1154,
5635, 416,
-- 5814, 290,
-- 5878, 463,
5770, 542,
5617, 1030,
5676, 1105,
5995, 1106,
6100, 1029,
6255, 541,
6199, 465,
5878, 463,
},
}
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
end
end
end
do--title_fan
title_fan={}
local sin,cos=math.sin,math.cos
@@ -136,7 +137,6 @@ do--title_fan
end
end
end
do--missionEnum
missionEnum={
_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,L do missionEnum[k]=v end
end
do--drawableText
local function T(s,t)return love.graphics.newText(getFont(s),t)end
drawableText={
question=T(100,"?"),
small=T(30,"<"),large=T(30,">"),
bpm=T(15,"BPM"),kpm=T(15,"KPM"),
modeName=T(30),
anykey=T(40),
replaying=T(20),
next=T(40),hold=T(40),
win=T(120),lose=T(120),
finish=T(120),
gamewin=T(100),gameover=T(100),pause=T(120),
@@ -181,7 +176,6 @@ do--drawableText
noScore=T(45),highScore=T(30),
}
end
do--BLOCKS
local O,_=true,false
BLOCKS={
@@ -244,7 +238,6 @@ do--BLOCKS
end
end
end
do--SCS(spinCenters)
local N1,N2,N3,N4={0,1},{1,0},{1,1},{.5,.5}
local I1,I2,I3,I4={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}
@@ -293,7 +286,6 @@ do--SCS(spinCenters)
{[0]=D,D,D,D},--O1
}
end
rankColor={
{.6,.3,.3},
{.7,.5,.3},
@@ -301,7 +293,6 @@ rankColor={
{.6,.9,1},
{.95,.95,.5},
}
minoColor={
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,

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_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_l', x=900, y=-220, size=40,shape=1,icon="pc"},
{name='pctrain_n', x=700, y=-250, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
{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_h', x=1000, y=-100, size=40,shape=3,icon="pc", unlock={'pc_l'}},
{name='pc_l', x=1200, y=-100, size=40,shape=2,icon="pc"},
{name='pc_n', x=800, y=-110, size=40,shape=1,icon="pc", unlock={'pc_h'}},
{name='pc_h', x=950, y=-110, size=40,shape=3,icon="pc", unlock={'pc_l','pc_inf'}},
{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_plus', x=600, y=160, size=40,shape=3,icon="tech", unlock={'tsd_e','backfire_n'}},
@@ -110,10 +111,11 @@ return{
{name='sprintFix'},
{name='sprintLock'},
{name='sprintSmooth'},
{name='marathon_bfmax'},
{name='custom_puzzle'},
{name='custom_clear'},
{name="netBattle"},
}

View File

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

View File

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

View File

@@ -5,7 +5,7 @@ return{
freshLimit=15,
dropPiece=function(P)
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
if P.stat.atk>=100 then
P:win('finish')

View File

@@ -5,7 +5,7 @@ return{
freshLimit=15,
dropPiece=function(P)
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
if P.stat.atk>=100 then
P:win('finish')

View File

@@ -4,7 +4,7 @@ return{
drop=30,lock=60,
dropPiece=function(P)
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
if P.stat.atk>=100 then
P:win('finish')

View File

@@ -5,7 +5,7 @@ return{
freshLimit=10,
dropPiece=function(P)
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
if P.stat.atk>=100 then
P:win('finish')

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -39,10 +39,9 @@ return{
},
load=function()
applyCustomGame()
local AItype=GAME.modeEnv.opponent:sub(1,2)
local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-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
PLY.newAIPlayer(2,AIBUILDER('9S',2*AIlevel))
elseif AItype=='CC'then

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