Merge branch 'main' of https://github.com/26F-Studio/Techmino into main
This commit is contained in:
76
.github/workflows/build.yml
vendored
76
.github/workflows/build.yml
vendored
@@ -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
12
.github/workflows/updateVersion.py
vendored
Normal 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)
|
||||
@@ -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
|
||||
@@ -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={
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)]]
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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{
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
9
conf.lua
9
conf.lua
@@ -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
|
||||
|
||||
@@ -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后执行的函数
|
||||
|
||||
@@ -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)
|
||||
|
||||
103
main.lua
103
main.lua
@@ -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
BIN
media/BGM/exploration.ogg
Normal file
Binary file not shown.
BIN
media/BGM/memory.ogg
Normal file
BIN
media/BGM/memory.ogg
Normal file
Binary file not shown.
BIN
media/BGM/moonbeam.ogg
Normal file
BIN
media/BGM/moonbeam.ogg
Normal file
Binary file not shown.
BIN
media/BGM/space.ogg
Normal file
BIN
media/BGM/space.ogg
Normal file
Binary file not shown.
Binary file not shown.
BIN
media/SFX/connect.ogg
Normal file
BIN
media/SFX/connect.ogg
Normal file
Binary file not shown.
BIN
media/SFX/connected.ogg
Normal file
BIN
media/SFX/connected.ogg
Normal file
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 121 KiB |
BIN
media/image/characters/nakiharu.png
Normal file
BIN
media/image/characters/nakiharu.png
Normal file
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 |
20
parts/ai.lua
20
parts/ai.lua
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
local gc=love.graphics
|
||||
local back={}
|
||||
function back.draw()
|
||||
gc.clear(.3,.3,.3)
|
||||
end
|
||||
return back
|
||||
@@ -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
|
||||
36
parts/backgrounds/league.lua
Normal file
36
parts/backgrounds/league.lua
Normal 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
|
||||
@@ -1,6 +0,0 @@
|
||||
local gc=love.graphics
|
||||
local back={}
|
||||
function back.draw()
|
||||
gc.clear(.95,.95,.95)
|
||||
end
|
||||
return back
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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{}
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
{"蕴空之灵",
|
||||
|
||||
@@ -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段位U,top数据约50L60A TGM3(W)shirase金1300通关\n这个游戏的作者!",
|
||||
"【研究群】「T026」\n40行25.95秒, MPH40行57秒排世界第8(jstris),tetr.io段位X,top数据约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",
|
||||
},
|
||||
{"蕴空之灵",
|
||||
|
||||
@@ -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!"},
|
||||
|
||||
@@ -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"},
|
||||
},
|
||||
|
||||
@@ -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!",
|
||||
|
||||
@@ -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"},
|
||||
|
||||
@@ -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={
|
||||
|
||||
@@ -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还不赶紧去练,你是不思进取还是不想好好说话?",
|
||||
"隐形很难?上电视那个水平一般都打成那样,属实自己不行看不起别人",
|
||||
"隐形哪难了,你练了吗?没练几个小时在这里说难是嫌葡萄酸?",
|
||||
"这不是休闲游戏…别怪关卡要求太高,就是你菜,请多练。",
|
||||
},
|
||||
}
|
||||
@@ -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没有抽卡没有氪金没有逼肝,良不良心不言自明"},
|
||||
}
|
||||
}
|
||||
@@ -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']= {"自定义", "拼图"},
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
249
parts/list.lua
249
parts/list.lua
@@ -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,
|
||||
|
||||
@@ -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"},
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user