Merge branch 'main' into main
This commit is contained in:
10
Zframework/aDraw.lua
Normal file
10
Zframework/aDraw.lua
Normal file
@@ -0,0 +1,10 @@
|
||||
local printf=love.graphics.printf
|
||||
local draw=love.graphics.draw
|
||||
local aDraw={}
|
||||
function aDraw.str(obj,x,y)printf(obj,x-626,y,1252,"center")end
|
||||
function aDraw.simpX(obj,x,y)draw(obj,x-obj:getWidth()*.5,y)end
|
||||
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
|
||||
return aDraw
|
||||
@@ -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.orange)
|
||||
LOG.print("No BGM file: "..list[i],5,COLOR.O)
|
||||
end
|
||||
if not skip and i~=count then
|
||||
coroutine.yield()
|
||||
|
||||
@@ -4,51 +4,51 @@ local COLOR={
|
||||
orange= {1.0, 0.6, 0.0},
|
||||
yellow= {1.0, 1.0, 0.0},
|
||||
lime= {0.7, 1.0, 0.0},
|
||||
grass= {0.5, 1.0, 0.0},
|
||||
jade= {0.5, 1.0, 0.0},
|
||||
green= {0.0, 1.0, 0.0},
|
||||
aqua= {0.0, 1.0, 0.6},
|
||||
cyan= {0.0, 1.0, 1.0},
|
||||
sky= {0.0, 0.7, 1.0},
|
||||
navy= {0.0, 0.7, 1.0},
|
||||
sea= {0.0, 0.4, 1.0},
|
||||
blue= {0.2, 0.2, 1.0},
|
||||
purple= {0.4, 0.0, 1.0},
|
||||
grape= {0.7, 0.0, 1.0},
|
||||
violet= {0.4, 0.0, 1.0},
|
||||
purple= {0.7, 0.0, 1.0},
|
||||
magenta= {1.0, 0.0, 1.0},
|
||||
pink= {1.0, 0.0, 0.5},
|
||||
wine= {1.0, 0.0, 0.5},
|
||||
|
||||
lRed= {1.0, 0.5, 0.5},
|
||||
lFire= {1.0, 0.7, 0.5},
|
||||
lOrange= {1.0, 0.8, 0.3},
|
||||
lYellow= {1.0, 1.0, 0.5},
|
||||
lLime= {0.8, 1.0, 0.4},
|
||||
lGrass= {0.6, 1.0, 0.4},
|
||||
lJade= {0.6, 1.0, 0.4},
|
||||
lGreen= {0.5, 1.0, 0.5},
|
||||
lAqua= {0.4, 1.0, 0.7},
|
||||
lCyan= {0.5, 1.0, 1.0},
|
||||
lSky= {0.5, 0.8, 1.0},
|
||||
lNavy= {0.5, 0.8, 1.0},
|
||||
lSea= {0.4, 0.7, 1.0},
|
||||
lBlue= {0.7, 0.7, 1.0},
|
||||
lPurple= {0.7, 0.4, 1.0},
|
||||
lGrape= {0.8, 0.4, 1.0},
|
||||
lViolet= {0.7, 0.4, 1.0},
|
||||
lPurple= {0.8, 0.4, 1.0},
|
||||
lMagenta= {1.0, 0.5, 1.0},
|
||||
lPink= {1.0, 0.4, 0.7},
|
||||
lWine= {1.0, 0.4, 0.7},
|
||||
|
||||
dRed= {0.6, 0.0, 0.0},
|
||||
dFire= {0.6, 0.3, 0.0},
|
||||
dOrange= {0.6, 0.4, 0.0},
|
||||
dYellow= {0.6, 0.6, 0.0},
|
||||
dLime= {0.5, 0.6, 0.0},
|
||||
dGrass= {0.3, 0.6, 0.0},
|
||||
dJade= {0.3, 0.6, 0.0},
|
||||
dGreen= {0.0, 0.6, 0.0},
|
||||
dAqua= {0.0, 0.6, 0.4},
|
||||
dCyan= {0.0, 0.6, 0.6},
|
||||
dSky= {0.0, 0.4, 0.6},
|
||||
dNavy= {0.0, 0.4, 0.6},
|
||||
dSea= {0.0, 0.2, 0.6},
|
||||
dBlue= {0.1, 0.1, 0.6},
|
||||
dPurple= {0.2, 0.0, 0.6},
|
||||
dGrape= {0.4, 0.0, 0.6},
|
||||
dViolet= {0.2, 0.0, 0.6},
|
||||
dPurple= {0.4, 0.0, 0.6},
|
||||
dMagenta= {0.6, 0.0, 0.6},
|
||||
dPink= {0.6, 0.0, 0.3},
|
||||
dWine= {0.6, 0.0, 0.3},
|
||||
|
||||
black= {0.0, 0.0, 0.0},
|
||||
dGray= {0.3, 0.3, 0.3},
|
||||
@@ -56,56 +56,67 @@ local COLOR={
|
||||
lGray= {0.8, 0.8, 0.8},
|
||||
white= {1.0, 1.0, 1.0},
|
||||
}
|
||||
local map={
|
||||
R="red", G="green", B="blue", C="cyan", Y="yellow", M="magenta",
|
||||
lR="lRed", lG="lGreen",lB="lBlue", lC="lCyan", lY="lYellow", lM="lMagenta",
|
||||
dR="dRed", dG="dGreen",dB="dBlue", dC="dCyan", dY="dYellow", dM="dMagenta",
|
||||
W="white",
|
||||
}for k,v in next,map do COLOR[k]=COLOR[v]end
|
||||
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",
|
||||
--Remain letter: EIKQTUX
|
||||
}do
|
||||
COLOR[k]=COLOR[v]
|
||||
end
|
||||
setmetatable(COLOR,{__index=function(_,k)
|
||||
error("No color: "..tostring(k))
|
||||
end})
|
||||
|
||||
local list_norm={"red","fire","orange","yellow","i","grass","green","aqua","cyan","sky","sea","blue","purple","grape","magenta","pink"}
|
||||
local len_list_norm=#list_norm
|
||||
local rnd=math.random
|
||||
function COLOR.random_norm()
|
||||
return COLOR[list_norm[rnd(len_list_norm)]]
|
||||
|
||||
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 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 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 len_list_dark=#list_dark
|
||||
function COLOR.random_dark()
|
||||
return COLOR[list_dark[rnd(len_list_dark)]]
|
||||
end
|
||||
end
|
||||
|
||||
local list_bright={"lRed","lFire","lOrange","lYellow","lLime","lGrass","lGreen","lAqua","lCyan","lSky","lSea","lBlue","lPurple","lGrape","lMagenta","lPink"}
|
||||
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","dGrass","dGreen","dAqua","dCyan","dSky","dSea","dBlue","dPurple","dGrape","dMagenta","dPink"}
|
||||
local len_list_dark=#list_dark
|
||||
function COLOR.random_dark()
|
||||
return COLOR[list_dark[rnd(len_list_dark)]]
|
||||
end
|
||||
|
||||
local sin=math.sin
|
||||
function COLOR.rainbow(phase)
|
||||
return
|
||||
sin(phase)*.4+.6,
|
||||
sin(phase+2.0944)*.4+.6,
|
||||
sin(phase-2.0944)*.4+.6
|
||||
end
|
||||
function COLOR.rainbow_light(phase)
|
||||
return
|
||||
sin(phase)*.2+.7,
|
||||
sin(phase+2.0944)*.2+.7,
|
||||
sin(phase-2.0944)*.2+.7
|
||||
end
|
||||
function COLOR.rainbow_dark(phase)
|
||||
return
|
||||
sin(phase)*.2+.4,
|
||||
sin(phase+2.0944)*.2+.4,
|
||||
sin(phase-2.0944)*.2+.4
|
||||
end
|
||||
function COLOR.rainbow_gray(phase)
|
||||
return
|
||||
sin(phase)*.16+.5,
|
||||
sin(phase+2.0944)*.16+.5,
|
||||
sin(phase-2.0944)*.16+.5
|
||||
do--Rainbow generators
|
||||
local sin=math.sin
|
||||
function COLOR.rainbow(phase)
|
||||
return
|
||||
sin(phase)*.4+.6,
|
||||
sin(phase+2.0944)*.4+.6,
|
||||
sin(phase-2.0944)*.4+.6
|
||||
end
|
||||
function COLOR.rainbow_light(phase)
|
||||
return
|
||||
sin(phase)*.2+.7,
|
||||
sin(phase+2.0944)*.2+.7,
|
||||
sin(phase-2.0944)*.2+.7
|
||||
end
|
||||
function COLOR.rainbow_dark(phase)
|
||||
return
|
||||
sin(phase)*.2+.4,
|
||||
sin(phase+2.0944)*.2+.4,
|
||||
sin(phase-2.0944)*.2+.4
|
||||
end
|
||||
function COLOR.rainbow_gray(phase)
|
||||
return
|
||||
sin(phase)*.16+.5,
|
||||
sin(phase+2.0944)*.16+.5,
|
||||
sin(phase-2.0944)*.16+.5
|
||||
end
|
||||
end
|
||||
|
||||
return COLOR
|
||||
@@ -19,6 +19,15 @@ local cmds={
|
||||
dCirc=function(...)gc.circle("line",...)end,
|
||||
fPoly=function(...)gc.polygon("fill",...)end,
|
||||
dPoly=function(...)gc.polygon("line",...)end,
|
||||
|
||||
drArc=function(...)gc.arc("line",...)end,
|
||||
flArc=function(...)gc.arc("fill",...)end,
|
||||
dpArc=function(...)gc.arc("line","pie",...)end,
|
||||
doArc=function(...)gc.arc("line","open",...)end,
|
||||
dcArc=function(...)gc.arc("line","closed",...)end,
|
||||
fpArc=function(...)gc.arc("fill","pie",...)end,
|
||||
foArc=function(...)gc.arc("fill","open",...)end,
|
||||
fcArc=function(...)gc.arc("fill","closed",...)end,
|
||||
}
|
||||
return function(L)
|
||||
gc.push()
|
||||
@@ -28,9 +37,7 @@ return function(L)
|
||||
gc.setColor(1,1,1)
|
||||
gc.setLineWidth(1)
|
||||
for i=3,#L do
|
||||
print(L[i][1])
|
||||
local cmd=cmds[L[i][1]]
|
||||
print(L[i][1])
|
||||
if type(cmd)=="string"then
|
||||
gc[cmd](unpack(L[i],2))
|
||||
else
|
||||
|
||||
@@ -40,7 +40,7 @@ return function(L,t)
|
||||
T=type(v)
|
||||
if T=="number"then v=tostring(v)
|
||||
elseif T=="string"then v="\""..v.."\""
|
||||
elseif T=="table"then v=DUMPTABLE(v,t+1)
|
||||
elseif T=="table"then v=TABLE.dump(v,t+1)
|
||||
elseif T=="boolean"then v=tostring(v)
|
||||
else error("Error data type!")
|
||||
end
|
||||
|
||||
@@ -21,14 +21,14 @@ function FILE.load(name)
|
||||
return s
|
||||
end
|
||||
end
|
||||
LOG.print(name.." "..text.loadError,COLOR.red)
|
||||
LOG.print(name.." "..text.loadError,COLOR.R)
|
||||
end
|
||||
end
|
||||
function FILE.save(data,name,mode)
|
||||
if not mode then mode=""end
|
||||
if type(data)=="table"then
|
||||
if mode:find("l")then
|
||||
data=DUMPTABLE(data)
|
||||
data=TABLE.dump(data)
|
||||
if not data then
|
||||
LOG.print(name.." "..text.saveError.."dump error","error")
|
||||
return
|
||||
@@ -50,7 +50,7 @@ function FILE.save(data,name,mode)
|
||||
F:flush()F:close()
|
||||
if success then
|
||||
if not mode:find("q")then
|
||||
LOG.print(text.saveDone,COLOR.green)
|
||||
LOG.print(text.saveDone,COLOR.G)
|
||||
end
|
||||
else
|
||||
LOG.print(text.saveError..(mes or"unknown error"),"error")
|
||||
|
||||
@@ -8,19 +8,15 @@ LOADLIB=require"Zframework.loadLib"
|
||||
WHEELMOV=require"Zframework.wheelScroll"
|
||||
|
||||
require"Zframework.setFont"
|
||||
MDRAW=require"Zframework.mDraw"
|
||||
mStr=MDRAW.str
|
||||
mText=MDRAW.simpX
|
||||
mDraw=MDRAW.draw
|
||||
ADRAW=require"Zframework.aDraw"
|
||||
mStr=ADRAW.str
|
||||
mText=ADRAW.simpX
|
||||
mDraw=ADRAW.draw
|
||||
|
||||
-- UPPERCHAR=require"Zframework.upperChar"
|
||||
JSON=require"Zframework.json"
|
||||
DUMPTABLE=require"Zframework.dumpTable"
|
||||
URLENCODE=require"Zframework.urlEncode"
|
||||
|
||||
TABLE=require"Zframework.tableExtend"
|
||||
SPLITSTR=require"Zframework.splitStr"
|
||||
TIMESTR=require"Zframework.timeStr"
|
||||
STRING=require"Zframework.stringExtend"
|
||||
|
||||
VIB= require"Zframework.vibrate"
|
||||
SFX= require"Zframework.sfx"
|
||||
@@ -215,11 +211,11 @@ local function noDevkeyPressed(key)
|
||||
elseif key=="f5"then if WIDGET.sel then DBP(WIDGET.sel)end
|
||||
elseif key=="f6"then for k,v in next,_G do DBP(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.yellow)
|
||||
elseif key=="f9"then devMode=1 LOG.print("DEBUG 1",COLOR.yellow)
|
||||
elseif key=="f10"then devMode=2 LOG.print("DEBUG 2",COLOR.yellow)
|
||||
elseif key=="f11"then devMode=3 LOG.print("DEBUG 3",COLOR.yellow)
|
||||
elseif key=="f12"then devMode=4 LOG.print("DEBUG 4",COLOR.yellow)
|
||||
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 devMode==2 then
|
||||
if WIDGET.sel then
|
||||
@@ -249,7 +245,7 @@ function love.keypressed(key)
|
||||
return
|
||||
elseif key=="f8"then
|
||||
devMode=1
|
||||
LOG.print("DEBUG ON",COLOR.yellow)
|
||||
LOG.print("DEBUG ON",COLOR.Y)
|
||||
elseif key=="f11"then
|
||||
switchFullscreen()
|
||||
elseif not SCN.swapping then
|
||||
@@ -281,7 +277,7 @@ function love.joystickremoved(JS)
|
||||
for i=1,#joysticks do
|
||||
if joysticks[i]==JS then
|
||||
rem(joysticks,i)
|
||||
LOG.print("Joystick removed",COLOR.yellow)
|
||||
LOG.print("Joystick removed",COLOR.Y)
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -454,10 +450,10 @@ local WScolor={
|
||||
{.5,.8,1,.7},
|
||||
}
|
||||
local devColor={
|
||||
COLOR.white,
|
||||
COLOR.lMagenta,
|
||||
COLOR.lGreen,
|
||||
COLOR.lBlue,
|
||||
COLOR.Z,
|
||||
COLOR.lM,
|
||||
COLOR.lG,
|
||||
COLOR.lB,
|
||||
}
|
||||
love.draw,love.update=nil--remove default draw/update
|
||||
function love.run()
|
||||
@@ -588,7 +584,7 @@ function love.run()
|
||||
|
||||
--Websocket status
|
||||
gc_push("transform")
|
||||
gc.translate(SCR.w,0)
|
||||
gc.translate(SCR.w,SCR.h-100)
|
||||
gc.scale(SCR.k)
|
||||
for i=1,5 do
|
||||
local status=WS.status(WSnames[i])
|
||||
|
||||
@@ -4,7 +4,7 @@ return function(name,libName)
|
||||
if r1 and r2 then
|
||||
return r2
|
||||
else
|
||||
LOG.print("Cannot load "..name..": "..(r2 or r3),"warn",COLOR.red)
|
||||
LOG.print("Cannot load "..name..": "..(r2 or r3),"warn",COLOR.R)
|
||||
end
|
||||
elseif SYSTEM=="Android"then
|
||||
local fs=love.filesystem
|
||||
@@ -17,25 +17,25 @@ return function(name,libName)
|
||||
if success then
|
||||
libFunc,message=package.loadlib(table.concat({SAVEDIR,libName.Android},"/"),libName.libFunc)
|
||||
if libFunc then
|
||||
LOG.print(name.." lib loaded","warn",COLOR.green)
|
||||
LOG.print(name.." lib loaded","warn",COLOR.G)
|
||||
break
|
||||
else
|
||||
LOG.print("Cannot load "..name..": "..message,"warn",COLOR.red)
|
||||
LOG.print("Cannot load "..name..": "..message,"warn",COLOR.R)
|
||||
end
|
||||
else
|
||||
LOG.print("Write "..name.."-"..platform[i].." to saving failed: "..message,"warn",COLOR.red)
|
||||
LOG.print("Write "..name.."-"..platform[i].." to saving failed: "..message,"warn",COLOR.R)
|
||||
end
|
||||
else
|
||||
LOG.print("Read "..name.."-"..platform[i].." failed","warn",COLOR.red)
|
||||
LOG.print("Read "..name.."-"..platform[i].." failed","warn",COLOR.R)
|
||||
end
|
||||
end
|
||||
if not libFunc then
|
||||
LOG.print("Cannot load "..name,"warn",COLOR.red)
|
||||
LOG.print("Cannot load "..name,"warn",COLOR.R)
|
||||
return
|
||||
end
|
||||
return libFunc()
|
||||
else
|
||||
LOG.print("No "..name.." for "..SYSTEM,"warn",COLOR.red)
|
||||
LOG.print("No "..name.." for "..SYSTEM,"warn",COLOR.R)
|
||||
return
|
||||
end
|
||||
return true
|
||||
|
||||
@@ -39,23 +39,23 @@ function LOG.print(text,T,C)--text,type/time,color
|
||||
local time
|
||||
local his
|
||||
if T=="warn"then
|
||||
C=C or COLOR.yellow
|
||||
C=C or COLOR.Y
|
||||
his=true
|
||||
time=180
|
||||
elseif T=="error"then
|
||||
C=C or COLOR.red
|
||||
C=C or COLOR.R
|
||||
his=true
|
||||
time=210
|
||||
elseif T=="message"then
|
||||
C=C or COLOR.sky
|
||||
C=C or COLOR.N
|
||||
his=true
|
||||
elseif type(T)=="number"then
|
||||
C=C or COLOR.white
|
||||
C=C or COLOR.Z
|
||||
time=T
|
||||
elseif type(T)=="table"then
|
||||
C=T
|
||||
elseif not C then
|
||||
C=COLOR.white
|
||||
C=COLOR.Z
|
||||
end
|
||||
if his then
|
||||
ins(debugMesHistory,SCN.cur..": "..tostring(text))
|
||||
@@ -65,6 +65,6 @@ end
|
||||
function LOG.copy()
|
||||
local str=table.concat(debugMesHistory,"\n")
|
||||
love.system.setClipboardText(str)
|
||||
LOG.print("Log copied",COLOR.blue)
|
||||
LOG.print("Log copied",COLOR.B)
|
||||
end
|
||||
return LOG
|
||||
@@ -1,10 +0,0 @@
|
||||
local printf=love.graphics.printf
|
||||
local draw=love.graphics.draw
|
||||
local mDraw={}
|
||||
function mDraw.str(str,x,y)printf(str,x-626,y,1252,"center")end
|
||||
function mDraw.simpX(str,x,y)draw(str,x-str:getWidth()*.5,y)end
|
||||
function mDraw.simpY(str,x,y)draw(str,x,y-str:getHeight()*.5)end
|
||||
function mDraw.X(str,x,y,a,k)draw(str,x,y,a,k,nil,str:getWidth()*.5,0)end
|
||||
function mDraw.Y(str,x,y,a,k)draw(str,x,y,a,k,nil,0,str:getHeight()*.5)end
|
||||
function mDraw.draw(str,x,y,a,k)draw(str,x,y,a,k,nil,str:getWidth()*.5,str:getHeight()*.5)end
|
||||
return mDraw
|
||||
@@ -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.orange)
|
||||
LOG.print("No SFX file: "..N,5,COLOR.O)
|
||||
end
|
||||
if not skip and i~=count then
|
||||
coroutine.yield()
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
local find,sub=string.find,string.sub
|
||||
return function(s,sep,regex)
|
||||
local L={}
|
||||
local p1,p2=1--start,target
|
||||
if regex then
|
||||
while p1<=#s do
|
||||
p2=find(s,sep,p1)or #s+1
|
||||
L[#L+1]=sub(s,p1,p2-1)
|
||||
p1=p2+#sep
|
||||
end
|
||||
else
|
||||
while p1<=#s do
|
||||
p2=find(s,sep,p1,true)or #s+1
|
||||
L[#L+1]=sub(s,p1,p2-1)
|
||||
p1=p2+#sep
|
||||
end
|
||||
end
|
||||
return L
|
||||
end
|
||||
77
Zframework/stringExtend.lua
Normal file
77
Zframework/stringExtend.lua
Normal file
@@ -0,0 +1,77 @@
|
||||
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"]=")",
|
||||
["`"]="~",["-"]="_",["="]="+",
|
||||
["["]="{",["]"]="}",["\\"]="|",
|
||||
[";"]=":",["'"]="\"",
|
||||
[","]="<",["."]=">",["/"]="?",
|
||||
}
|
||||
function STRING.shiftChar(c)
|
||||
return shiftMap[c]or upper(c)
|
||||
end
|
||||
end
|
||||
|
||||
function STRING.split(s,sep,regex)
|
||||
local L={}
|
||||
local p1,p2=1--start,target
|
||||
if regex then
|
||||
while p1<=#s do
|
||||
p2=find(s,sep,p1)or #s+1
|
||||
L[#L+1]=sub(s,p1,p2-1)
|
||||
p1=p2+#sep
|
||||
end
|
||||
else
|
||||
while p1<=#s do
|
||||
p2=find(s,sep,p1,true)or #s+1
|
||||
L[#L+1]=sub(s,p1,p2-1)
|
||||
p1=p2+#sep
|
||||
end
|
||||
end
|
||||
return L
|
||||
end
|
||||
|
||||
function STRING.simpEmailCheck(e)
|
||||
e=STRING.split(e,"@")
|
||||
if #e~=2 then return false end
|
||||
if e[1]:sub(-1)=="."or e[2]:sub(-1)=="."then return false end
|
||||
local e1,e2=STRING.split(e[1],"."),STRING.split(e[2],".")
|
||||
if #e1*#e2==0 then return false end
|
||||
for _,v in next,e1 do if #v==0 then return false end end
|
||||
for _,v in next,e2 do if #v==0 then return false end end
|
||||
return true
|
||||
end
|
||||
|
||||
function STRING.time(s)
|
||||
if s<60 then
|
||||
return format("%.3f\"",s)
|
||||
elseif s<3600 then
|
||||
return format("%d'%05.2f\"",int(s/60),s%60)
|
||||
else
|
||||
local h=int(s/3600)
|
||||
return format("%d:%.2d'%05.2f\"",h,int(s/60%60),s%60)
|
||||
end
|
||||
end
|
||||
|
||||
do--function STRING.urlEncode(str)
|
||||
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 out=""
|
||||
for i=1,#str do
|
||||
if str:sub(i,i):match("[a-zA-Z0-9]")then
|
||||
out=out..str:sub(i,i)
|
||||
else
|
||||
local b=str:byte(i)
|
||||
out=out.."%"..b16[rshift(b,4)]..b16[b%16]
|
||||
end
|
||||
end
|
||||
return out
|
||||
end
|
||||
end
|
||||
|
||||
return STRING
|
||||
@@ -73,4 +73,60 @@ function TABLE.reIndex(org)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--Dump a simple lua table
|
||||
do--function TABLE.dump(L,t)
|
||||
local find=string.find
|
||||
local tabs={
|
||||
[0]="",
|
||||
"\t",
|
||||
"\t\t",
|
||||
"\t\t\t",
|
||||
"\t\t\t\t",
|
||||
"\t\t\t\t\t",
|
||||
}
|
||||
function dump(L,t)
|
||||
local s
|
||||
if t then
|
||||
s="{\n"
|
||||
else
|
||||
s="return{\n"
|
||||
t=1
|
||||
if type(L)~="table"then
|
||||
return
|
||||
end
|
||||
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,t+1)
|
||||
elseif T=="boolean"then v=tostring(v)
|
||||
else error("Error data type!")
|
||||
end
|
||||
s=s..tabs[t]..k..v..",\n"
|
||||
end
|
||||
return s..tabs[t-1].."}"
|
||||
end
|
||||
TABLE.dump=dump
|
||||
end
|
||||
|
||||
return TABLE
|
||||
@@ -2,8 +2,8 @@ local THEME={
|
||||
cur=false,--Current theme
|
||||
}
|
||||
local themeColor={
|
||||
xmas={COLOR.red,COLOR.white,COLOR.green},
|
||||
sprfes={COLOR.red,COLOR.orange,COLOR.yellow},
|
||||
xmas={COLOR.R,COLOR.Z,COLOR.G},
|
||||
sprfes={COLOR.R,COLOR.O,COLOR.Y},
|
||||
}
|
||||
|
||||
function THEME.calculate(Y,M,D)
|
||||
@@ -48,15 +48,15 @@ function THEME.set(theme)
|
||||
elseif theme=="xmas"then
|
||||
BG.setDefault("snow")
|
||||
BGM.setDefault("xmas")
|
||||
LOG.print("==============",COLOR.red)
|
||||
LOG.print("Merry Christmas!",COLOR.white)
|
||||
LOG.print("==============",COLOR.red)
|
||||
LOG.print("==============",COLOR.R)
|
||||
LOG.print("Merry Christmas!",COLOR.Z)
|
||||
LOG.print("==============",COLOR.R)
|
||||
elseif theme=="sprfes"then
|
||||
BG.setDefault("firework")
|
||||
BGM.setDefault("spring festival")
|
||||
LOG.print(" ★☆☆★",COLOR.red)
|
||||
LOG.print("新年快乐!",COLOR.white)
|
||||
LOG.print(" ★☆☆★",COLOR.red)
|
||||
LOG.print(" ★☆☆★",COLOR.R)
|
||||
LOG.print("新年快乐!",COLOR.Z)
|
||||
LOG.print(" ★☆☆★",COLOR.R)
|
||||
elseif theme=="zday1"then
|
||||
BG.setDefault("lanterns")
|
||||
BGM.setDefault("empty")
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
local int,format=math.floor,string.format
|
||||
return function(s)
|
||||
if s<60 then
|
||||
return format("%.3f\"",s)
|
||||
elseif s<3600 then
|
||||
return format("%d'%05.2f\"",int(s/60),s%60)
|
||||
else
|
||||
local h=int(s/3600)
|
||||
return format("%d:%.2d'%05.2f\"",h,int(s/60%60),s%60)
|
||||
end
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
local upper=string.upper
|
||||
local upperList={
|
||||
["1"]="!",["2"]="@",["3"]="#",["4"]="$",["5"]="%",
|
||||
["6"]="^",["7"]="&",["8"]="*",["9"]="(",["0"]=")",
|
||||
["`"]="~",["-"]="_",["="]="+",
|
||||
["["]="{",["]"]="}",["\\"]="|",
|
||||
[";"]=":",["'"]="\"",
|
||||
[","]="<",["."]=">",["/"]="?",
|
||||
}
|
||||
return function(c)
|
||||
return upperList[c]or upper(c)
|
||||
end
|
||||
@@ -1,14 +0,0 @@
|
||||
local rshift=bit.rshift
|
||||
local b16={[0]="0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}
|
||||
return function(str)
|
||||
local out=""
|
||||
for i=1,#str do
|
||||
if str:sub(i,i):match("[a-zA-Z0-9]")then
|
||||
out=out..str:sub(i,i)
|
||||
else
|
||||
local b=str:byte(i)
|
||||
out=out.."%"..b16[rshift(b,4)]..b16[b%16]
|
||||
end
|
||||
end
|
||||
return out
|
||||
end
|
||||
@@ -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.orange)
|
||||
LOG.print("No VOICE file: "..list[i],5,COLOR.O)
|
||||
end
|
||||
end
|
||||
if not Source[list[i]][1]then Source[list[i]]=nil end
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
local gc=love.graphics
|
||||
local kb=love.keyboard
|
||||
local gc=love.graphics
|
||||
|
||||
local int,abs=math.floor,math.abs
|
||||
local max,min=math.max,math.min
|
||||
local sub,format=string.sub,string.format
|
||||
local ins=table.insert
|
||||
local COLOR=COLOR
|
||||
local setFont,mStr=setFont,mStr
|
||||
local mDraw_X,mDraw_Y=ADRAW.simpX,ADRAW.simpY
|
||||
|
||||
local alignModes={
|
||||
M="center",
|
||||
L="left",
|
||||
R="right",
|
||||
F="justify",
|
||||
local allowNoText={
|
||||
image=true,
|
||||
inputBox=true,
|
||||
textBox=true,
|
||||
}
|
||||
|
||||
local WIDGET={}
|
||||
@@ -25,15 +26,7 @@ local text={
|
||||
type="text",
|
||||
alpha=0,
|
||||
}
|
||||
function text:reset()
|
||||
if type(self.text)=="string"then
|
||||
self.text=gc.newText(getFont(self.font),self.text)
|
||||
elseif type(self.text)~="userdata"or self.text.type(self.text)~="Text"then
|
||||
self.text=gc.newText(getFont(self.font),self.name)
|
||||
self.color=COLOR.dPurple
|
||||
self.font=self.font-10
|
||||
end
|
||||
end
|
||||
function text:reset()end
|
||||
function text:update()
|
||||
if self.hideCon and self.hideCon()then
|
||||
if self.alpha>0 then
|
||||
@@ -47,12 +40,13 @@ function text:draw()
|
||||
if self.alpha>0 then
|
||||
local c=self.color
|
||||
gc.setColor(c[1],c[2],c[3],self.alpha)
|
||||
local obj=self.obj
|
||||
if self.align=="M"then
|
||||
gc.draw(self.text,self.x-self.text:getWidth()*.5,self.y)
|
||||
mDraw_X(obj,self.x,self.y)
|
||||
elseif self.align=="L"then
|
||||
gc.draw(self.text,self.x,self.y)
|
||||
gc.draw(obj,self.x,self.y)
|
||||
elseif self.align=="R"then
|
||||
gc.draw(self.text,self.x-self.text:getWidth(),self.y)
|
||||
gc.draw(obj,self.x-obj:getWidth(),self.y)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -63,7 +57,7 @@ function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,align="M"][,hide
|
||||
y= D.y,
|
||||
|
||||
fText= D.fText,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.white,
|
||||
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,
|
||||
@@ -109,6 +103,13 @@ local button={
|
||||
function button:reset()
|
||||
self.ATV=0
|
||||
end
|
||||
function button:setObject(obj)
|
||||
if type(obj)=="string"or type(obj)=="number"then
|
||||
self.obj=gc.newText(getFont(self.font),obj)
|
||||
elseif obj then
|
||||
self.obj=obj
|
||||
end
|
||||
end
|
||||
function button:isAbove(x,y)
|
||||
local ATV=self.ATV
|
||||
return
|
||||
@@ -150,21 +151,33 @@ function button:draw()
|
||||
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 t=self.text
|
||||
if t then
|
||||
setFont(self.font)
|
||||
local y0=y+h*.5-self.font*.7-ATV*.5
|
||||
gc.setColor(1,1,1,.2+ATV*.05)
|
||||
local edge=self.edge
|
||||
gc.printf(t,x+edge-2,y0-2,w-2*edge,self.align)
|
||||
gc.printf(t,x+edge-2,y0+2,w-2*edge,self.align)
|
||||
gc.printf(t,x+edge+2,y0-2,w-2*edge,self.align)
|
||||
gc.printf(t,x+edge+2,y0+2,w-2*edge,self.align)
|
||||
local obj=self.obj
|
||||
local y0=y+h*.5-ATV*.5
|
||||
gc.setColor(1,1,1,.2+ATV*.05)
|
||||
if self.align=="M"then
|
||||
local x0=x+w*.5
|
||||
mDraw(obj,x0-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)
|
||||
gc.printf(t,x+edge,y0,w-2*edge,self.align)
|
||||
else
|
||||
self.text=self.name or"###"
|
||||
self.color=COLOR.dPurple
|
||||
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,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,y0)
|
||||
end
|
||||
end
|
||||
function button:getInfo()
|
||||
@@ -194,9 +207,9 @@ function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font][,align="M"[,
|
||||
},
|
||||
|
||||
fText= D.fText,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.white,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
font= D.font or 30,
|
||||
align= alignModes[D.align or"M"]or"center",
|
||||
align= D.align or"M",
|
||||
edge= D.edge or 0,
|
||||
code= D.code,
|
||||
hide= D.hide,
|
||||
@@ -213,6 +226,13 @@ local key={
|
||||
function key:reset()
|
||||
self.ATV=0
|
||||
end
|
||||
function key:setObject(obj)
|
||||
if type(obj)=="string"or type(obj)=="number"then
|
||||
self.obj=gc.newText(getFont(self.font),obj)
|
||||
elseif obj then
|
||||
self.obj=obj
|
||||
end
|
||||
end
|
||||
function key:isAbove(x,y)
|
||||
return
|
||||
x>self.x and
|
||||
@@ -244,14 +264,13 @@ function key:draw()
|
||||
gc.setLineWidth(4)
|
||||
gc.rectangle("line",x,y,w,h)
|
||||
|
||||
local t=self.text
|
||||
if t then
|
||||
setFont(self.font)
|
||||
gc.setColor(r,g,b,1.2)
|
||||
gc.printf(t,x+self.edge,y+h*.5-self.font*.7,w-2*self.edge,self.align)
|
||||
else
|
||||
self.text=self.name or"###"
|
||||
self.color=COLOR.dPurple
|
||||
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
|
||||
mDraw_Y(self.obj,x+self.edge,y+h*.5)
|
||||
elseif self.align=="R"then
|
||||
mDraw_Y(self.obj,self.x-self.edge-self.obj:getWidth(),y+h*.5)
|
||||
end
|
||||
end
|
||||
function key:getInfo()
|
||||
@@ -279,9 +298,9 @@ function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,color][,font][,align="M"[,edg
|
||||
},
|
||||
|
||||
fText= D.fText,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.white,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
font= D.font or 30,
|
||||
align= alignModes[D.align or"M"]or"center",
|
||||
align= D.align or"M",
|
||||
edge= D.edge or 0,
|
||||
code= D.code,
|
||||
hide= D.hide,
|
||||
@@ -336,13 +355,10 @@ function switch:draw()
|
||||
gc.setColor(1,1,1,.6+ATV*.05)
|
||||
gc.rectangle("line",x,y,50,50)
|
||||
|
||||
--Text
|
||||
local t=self.text
|
||||
if t then
|
||||
gc.setColor(self.color)
|
||||
setFont(self.font)
|
||||
gc.printf(t,x-412-ATV,y+20-self.font*.7,400,"right")
|
||||
end
|
||||
--Drawable
|
||||
local obj=self.obj
|
||||
gc.setColor(self.color)
|
||||
mDraw_Y(obj,x-12-ATV-obj:getWidth(),y+25)
|
||||
end
|
||||
function switch:getInfo()
|
||||
return format("x=%d,y=%d,font=%d",self.x,self.y,self.font)
|
||||
@@ -363,7 +379,7 @@ function WIDGET.newSwitch(D)--name,x,y[,fText][,color][,font][,disp],code,hide
|
||||
},
|
||||
|
||||
fText= D.fText,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.white,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
font= D.font or 30,
|
||||
disp= D.disp,
|
||||
code= D.code,
|
||||
@@ -461,13 +477,10 @@ function slider:draw()
|
||||
mStr(self:show(),cx,by-30)
|
||||
end
|
||||
|
||||
--Text
|
||||
local t=self.text
|
||||
if t then
|
||||
gc.setColor(self.color)
|
||||
setFont(self.font)
|
||||
gc.printf(t,x-312-ATV,y-self.font*.7,300,"right")
|
||||
end
|
||||
--Drawable
|
||||
local obj=self.obj
|
||||
gc.setColor(self.color)
|
||||
mDraw_Y(obj,x-12-ATV-obj:getWidth(),y)
|
||||
end
|
||||
function slider:getInfo()
|
||||
return format("x=%d,y=%d,w=%d",self.x,self.y,self.w)
|
||||
@@ -520,7 +533,7 @@ function WIDGET.newSlider(D)--name,x,y,w[,fText][,color][,unit][,smooth][,font][
|
||||
},
|
||||
|
||||
fText= D.fText,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.white,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
unit= D.unit or 1,
|
||||
smooth= false,
|
||||
font= D.font or 30,
|
||||
@@ -622,14 +635,11 @@ function selector:draw()
|
||||
end
|
||||
end
|
||||
|
||||
--Text
|
||||
setFont(30)
|
||||
t=self.text
|
||||
if t then
|
||||
gc.setColor(self.color)
|
||||
mStr(self.text,x+w*.5,y+17-21)
|
||||
end
|
||||
--Drawable
|
||||
gc.setColor(self.color)
|
||||
ADRAW.simpX(self.obj,x+w*.5,y+17-21)
|
||||
gc.setColor(1,1,1)
|
||||
setFont(30)
|
||||
mStr(self.selText,x+w*.5,y+43-21)
|
||||
end
|
||||
function selector:getInfo()
|
||||
@@ -689,7 +699,8 @@ function WIDGET.newSelector(D)--name,x,y,w[,fText][,color],list,disp,code,hide
|
||||
},
|
||||
|
||||
fText= D.fText,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.white,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
font= 30,
|
||||
list= D.list,
|
||||
disp= D.disp,
|
||||
code= D.code,
|
||||
@@ -744,11 +755,11 @@ function inputBox:draw()
|
||||
gc.setLineWidth(4)
|
||||
gc.rectangle("line",x,y,w,h)
|
||||
|
||||
--Text
|
||||
--Drawable
|
||||
setFont(self.font)
|
||||
local t=self.text
|
||||
if t then
|
||||
gc.printf(t,x-412,y+h*.5-self.font*.7,400,"right")
|
||||
local obj=self.obj
|
||||
if obj then
|
||||
mDraw_Y(obj,x-12-obj:getWidth(),y+h*.5)
|
||||
end
|
||||
if self.secret then
|
||||
for i=1,#self.value do
|
||||
@@ -1004,7 +1015,15 @@ function WIDGET.setLang(widgetText)
|
||||
for S,L in next,SCN.scenes do
|
||||
if L.widgetList then
|
||||
for _,W in next,L.widgetList do
|
||||
W.text=W.fText or widgetText[S][W.name]
|
||||
local t=W.fText or widgetText[S][W.name]
|
||||
if not t and not allowNoText[W.type]then
|
||||
t=W.name or"##"
|
||||
W.color=COLOR.dV
|
||||
end
|
||||
if type(t)=="string"and W.font then
|
||||
t=gc.newText(getFont(W.font),t)
|
||||
end
|
||||
W.obj=t
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -129,7 +129,7 @@ return{--返回一个table,你也可以在之前定义一些常量或者函数
|
||||
PLY.draw.drawTargetLine(P,r)--使用自带的境界高度线绘制函数
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,--游戏结束时需要保存的本局关键信息
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,--把score返回的数据显示出来的方法
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,--把score返回的数据显示出来的方法
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,--按照时间排序,时间一样就看块数
|
||||
getRank=function(P)--计算评级
|
||||
if P.stat.row<40 then return end--你总得打完40行对吧,否则直接return空掉,成绩都不记录
|
||||
|
||||
2
main.lua
2
main.lua
@@ -267,8 +267,8 @@ do
|
||||
|
||||
for _,v in next,VK_org do
|
||||
if not v.color then
|
||||
autoRestart=true
|
||||
fs.remove("conf/virtualkey")
|
||||
autoRestart=true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
BIN
media/BGM/battle.ogg
Normal file
BIN
media/BGM/battle.ogg
Normal file
Binary file not shown.
@@ -2,14 +2,11 @@ local data=love.data
|
||||
|
||||
local gc=love.graphics
|
||||
local gc_setColor,gc_setLineWidth,gc_setShader=gc.setColor,gc.setLineWidth,gc.setShader
|
||||
local gc_push,gc_pop,gc_origin=gc.push,gc.pop,gc.origin
|
||||
local gc_push,gc_pop,gc_origin,gc_translate=gc.push,gc.pop,gc.origin,gc.translate
|
||||
local gc_draw,gc_rectangle,gc_circle=gc.draw,gc.rectangle,gc.circle
|
||||
local max,int,rnd=math.max,math.floor,math.random
|
||||
local sin=math.sin
|
||||
local sub=string.sub
|
||||
local int,rnd=math.floor,math.random
|
||||
local char,byte=string.char,string.byte
|
||||
local ins,rem=table.insert,table.remove
|
||||
local YIELD=YIELD
|
||||
|
||||
|
||||
|
||||
@@ -257,14 +254,17 @@ function copyQuestArgs()
|
||||
ENV.sequence
|
||||
return str
|
||||
end
|
||||
function pasteQuestArgs(str)
|
||||
if #str<4 then return end
|
||||
local ENV=CUSTOMENV
|
||||
ENV.holdCount= byte(str,1)-48
|
||||
ENV.ospin= byte(str,2)~=90
|
||||
ENV.missionKill= byte(str,3)~=90
|
||||
ENV.sequence= sub(str,4)
|
||||
return true
|
||||
do--function pasteQuestArgs(str)
|
||||
local sub=string.sub
|
||||
function pasteQuestArgs(str)
|
||||
if #str<4 then return end
|
||||
local ENV=CUSTOMENV
|
||||
ENV.holdCount= byte(str,1)-48
|
||||
ENV.ospin= byte(str,2)~=90
|
||||
ENV.missionKill= byte(str,3)~=90
|
||||
ENV.sequence= sub(str,4)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -467,7 +467,6 @@ end
|
||||
|
||||
--Game
|
||||
function generateLine(hole)
|
||||
-- return 2^10-1-2^(hole-1)
|
||||
return 1023-2^(hole-1)
|
||||
end
|
||||
function freshDate(mode)
|
||||
@@ -500,16 +499,6 @@ function legalGameTime()--Check if today's playtime is legal
|
||||
end
|
||||
return true
|
||||
end
|
||||
function legalEmail(e)
|
||||
e=SPLITSTR(e,"@")
|
||||
if #e~=2 then return false end
|
||||
if e[1]:sub(-1)=="."or e[2]:sub(-1)=="."then return false end
|
||||
local e1,e2=SPLITSTR(e[1],"."),SPLITSTR(e[2],".")
|
||||
if #e1*#e2==0 then return false end
|
||||
for _,v in next,e1 do if #v==0 then return false end end
|
||||
for _,v in next,e2 do if #v==0 then return false end end
|
||||
return true
|
||||
end
|
||||
|
||||
function mergeStat(stat,delta)--Merge delta stat. to global stat.
|
||||
for k,v in next,delta do
|
||||
@@ -690,6 +679,7 @@ do--function dumpBasicConfig()
|
||||
end
|
||||
end
|
||||
do--function resetGameData(args)
|
||||
local YIELD=YIELD
|
||||
local function tick_showMods()
|
||||
local time=0
|
||||
while true do
|
||||
@@ -790,36 +780,39 @@ do--function resetGameData(args)
|
||||
collectgarbage()
|
||||
end
|
||||
end
|
||||
function checkWarning()
|
||||
local P1=PLAYERS[1]
|
||||
if P1.alive then
|
||||
if P1.frameRun%26==0 then
|
||||
local F=P1.field
|
||||
local height=0--Max height of row 4~7
|
||||
for x=4,7 do
|
||||
for y=#F,1,-1 do
|
||||
if F[y][x]>0 then
|
||||
if y>height then
|
||||
height=y
|
||||
do--function checkWarning()
|
||||
local max=math.max
|
||||
function checkWarning()
|
||||
local P1=PLAYERS[1]
|
||||
if P1.alive then
|
||||
if P1.frameRun%26==0 then
|
||||
local F=P1.field
|
||||
local height=0--Max height of row 4~7
|
||||
for x=4,7 do
|
||||
for y=#F,1,-1 do
|
||||
if F[y][x]>0 then
|
||||
if y>height then
|
||||
height=y
|
||||
end
|
||||
break
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
GAME.warnLVL0=math.log(height-(P1.gameEnv.fieldH-5)+P1.atkBuffer.sum*.8)
|
||||
end
|
||||
GAME.warnLVL0=math.log(height-(P1.gameEnv.fieldH-5)+P1.atkBuffer.sum*.8)
|
||||
local _=GAME.warnLVL
|
||||
if _<GAME.warnLVL0 then
|
||||
_=_*.95+GAME.warnLVL0*.05
|
||||
elseif _>0 then
|
||||
_=max(_-.026,0)
|
||||
end
|
||||
GAME.warnLVL=_
|
||||
elseif GAME.warnLVL>0 then
|
||||
GAME.warnLVL=max(GAME.warnLVL-.026,0)
|
||||
end
|
||||
local _=GAME.warnLVL
|
||||
if _<GAME.warnLVL0 then
|
||||
_=_*.95+GAME.warnLVL0*.05
|
||||
elseif _>0 then
|
||||
_=max(_-.026,0)
|
||||
if GAME.warnLVL>1.126 and P1.frameRun%30==0 then
|
||||
SFX.fplay("warning",SETTING.sfx_warn)
|
||||
end
|
||||
GAME.warnLVL=_
|
||||
elseif GAME.warnLVL>0 then
|
||||
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)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -933,7 +926,7 @@ do--function 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.sky)
|
||||
LOG.print("Cannot save recording of this mode now!",COLOR.N)
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -987,6 +980,7 @@ do--function drawFWM()
|
||||
--等Techmino发展到一定程度之后会解除这个限制
|
||||
--最后,别把藏在这里的东西截图/复制出去哦~
|
||||
--感谢您对Techmino的支持!!!
|
||||
local sin=math.sin
|
||||
local setFont,TIME,mStr=setFont,TIME,mStr
|
||||
function drawFWM()
|
||||
local t=TIME()
|
||||
@@ -995,6 +989,22 @@ do--function drawFWM()
|
||||
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()
|
||||
function drawSelfProfile()
|
||||
local selfAvatar=USERS.getAvatar(USER.uid)
|
||||
gc_push("transform")
|
||||
gc_translate(1280,0)
|
||||
|
||||
--Draw avatar
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(.3,.3,.3,.8)gc_rectangle("fill",-260,0,260,80)
|
||||
gc_setColor(1,1,1)gc_rectangle("line",-260,0,260,80)
|
||||
gc_rectangle("line",-73,7,66,66,2)
|
||||
gc_draw(selfAvatar,-72,8,nil,.5)
|
||||
|
||||
gc_pop()
|
||||
end
|
||||
end
|
||||
function drawWarning()
|
||||
if SETTING.warn and GAME.warnLVL>0 then
|
||||
gc_push("transform")
|
||||
|
||||
@@ -4,94 +4,94 @@ local function disableKey(P,key)
|
||||
end
|
||||
MODOPT={--Mod options
|
||||
{no=0,id="NX",name="next",
|
||||
key="q",x=80,y=230,color="orange",
|
||||
key="q",x=80,y=230,color="O",
|
||||
list={0,1,2,3,4,5,6},
|
||||
func=function(P,O)P.gameEnv.nextCount=O end,
|
||||
},
|
||||
{no=1,id="HL",name="hold",
|
||||
key="w",x=200,y=230,color="orange",
|
||||
key="w",x=200,y=230,color="O",
|
||||
list={0,1,2,3,4,5,6},
|
||||
func=function(P,O)P.gameEnv.holdCount=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=2,id="FL",name="hideNext",
|
||||
key="e",x=320,y=230,color="aqua",
|
||||
key="e",x=320,y=230,color="A",
|
||||
list={1,2,3,4,5},
|
||||
func=function(P,O)P.gameEnv.nextStartPos=O +1 end,
|
||||
},
|
||||
{no=3,id="IH",name="infHold",
|
||||
key="r",x=440,y=230,color="aqua",
|
||||
key="r",x=440,y=230,color="A",
|
||||
func=function(P)P.gameEnv.infHold=true end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=4,id="HB",name="hideBlock",
|
||||
key="y",x=680,y=230,color="purple",
|
||||
key="y",x=680,y=230,color="V",
|
||||
func=function(P)P.gameEnv.block=false end,
|
||||
},
|
||||
{no=5,id="HG",name="hideGhost",
|
||||
key="u",x=800,y=230,color="purple",
|
||||
key="u",x=800,y=230,color="V",
|
||||
func=function(P)P.gameEnv.ghost=false end,
|
||||
},
|
||||
{no=6,id="HD",name="hidden",
|
||||
key="i",x=920,y=230,color="grape",
|
||||
key="i",x=920,y=230,color="P",
|
||||
list={"easy","slow","medium","fast","none"},
|
||||
func=function(P,O)P.gameEnv.visible=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=7,id="HB",name="hideBoard",
|
||||
key="o",x=1040,y=230,color="grape",
|
||||
key="o",x=1040,y=230,color="P",
|
||||
list={"down","up","all"},
|
||||
func=function(P,O)P.gameEnv.hideBoard=O end,
|
||||
},
|
||||
{no=8,id="FB",name="flipBoard",
|
||||
key="p",x=1160,y=230,color="grass",
|
||||
key="p",x=1160,y=230,color="J",
|
||||
list={"U-D","L-R","180"},
|
||||
func=function(P,O)P.gameEnv.flipBoard=O end,
|
||||
},
|
||||
|
||||
{no=9,id="DT",name="dropDelay",
|
||||
key="a",x=140,y=350,color="red",
|
||||
key="a",x=140,y=350,color="R",
|
||||
list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
|
||||
func=function(P,O)P.gameEnv.drop=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=10,id="LT",name="lockDelay",
|
||||
key="s",x=260,y=350,color="red",
|
||||
key="s",x=260,y=350,color="R",
|
||||
list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
|
||||
func=function(P,O)P.gameEnv.lock=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=11,id="ST",name="waitDelay",
|
||||
key="d",x=380,y=350,color="red",
|
||||
key="d",x=380,y=350,color="R",
|
||||
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
func=function(P,O)P.gameEnv.wait=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=12,id="CT",name="fallDelay",
|
||||
key="f",x=500,y=350,color="red",
|
||||
key="f",x=500,y=350,color="R",
|
||||
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
func=function(P,O)P.gameEnv.fall=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=13,id="LF",name="life",
|
||||
key="j",x=860,y=350,color="yellow",
|
||||
key="j",x=860,y=350,color="Y",
|
||||
list={0,1,2,3,5,10,15,26,42,87,500},
|
||||
func=function(P,O)P.gameEnv.life=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=14,id="FB",name="forceB2B",
|
||||
key="k",x=980,y=350,color="yellow",
|
||||
key="k",x=980,y=350,color="Y",
|
||||
func=function(P)P.gameEnv.b2bKill=true end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=15,id="PF",name="forceFinesse",
|
||||
key="l",x=1100,y=350,color="yellow",
|
||||
key="l",x=1100,y=350,color="Y",
|
||||
func=function(P)P.gameEnv.fineKill=true end,
|
||||
unranked=true,
|
||||
},
|
||||
|
||||
{no=16,id="TL",name="tele",
|
||||
key="z",x=200,y=470,color="lGray",
|
||||
key="z",x=200,y=470,color="lH",
|
||||
func=function(P)
|
||||
P.gameEnv.das,P.gameEnv.arr=0,0
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=0,0
|
||||
@@ -99,7 +99,7 @@ MODOPT={--Mod options
|
||||
unranked=true,
|
||||
},
|
||||
{no=17,id="FX",name="noRotation",
|
||||
key="x",x=320,y=470,color="lGray",
|
||||
key="x",x=320,y=470,color="lH",
|
||||
func=function(P)
|
||||
disableKey(P,3)
|
||||
disableKey(P,4)
|
||||
@@ -108,7 +108,7 @@ MODOPT={--Mod options
|
||||
unranked=true,
|
||||
},
|
||||
{no=18,id="GL",name="noMove",
|
||||
key="c",x=440,y=470,color="lGray",
|
||||
key="c",x=440,y=470,color="lH",
|
||||
func=function(P)
|
||||
disableKey(P,1)disableKey(P,2)
|
||||
disableKey(P,11)disableKey(P,12)
|
||||
@@ -118,19 +118,19 @@ MODOPT={--Mod options
|
||||
unranked=true,
|
||||
},
|
||||
{no=19,id="CS",name="customSeq",
|
||||
key="b",x=680,y=470,color="blue",
|
||||
key="b",x=680,y=470,color="B",
|
||||
list={"bag","his4","c2","rnd","mess","reverb"},
|
||||
func=function(P,O)P.gameEnv.sequence=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=20,id="PS",name="pushSpeed",
|
||||
key="n",x=800,y=470,color="blue",
|
||||
key="n",x=800,y=470,color="B",
|
||||
list={.5,1,2,3,5,15,1e99},
|
||||
func=function(P,O)P.gameEnv.pushSpeed=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=21,id="BN",name="boneBlock",
|
||||
key="m",x=920,y=470,color="blue",
|
||||
key="m",x=920,y=470,color="B",
|
||||
list={"on","off"},
|
||||
func=function(P,O)P.gameEnv.bone=O=="on"end,
|
||||
},
|
||||
@@ -148,44 +148,6 @@ PLY_NET={}
|
||||
FIELD={}--Field(s) for custom game
|
||||
BAG={}--Sequence for custom game
|
||||
MISSION={}--Clearing mission for custom game
|
||||
CUSTOMENV={--gameEnv for cutsom game
|
||||
--Basic
|
||||
drop=60,
|
||||
lock=60,
|
||||
wait=0,
|
||||
fall=0,
|
||||
|
||||
--Control
|
||||
nextCount=6,
|
||||
holdCount=1,
|
||||
infHold=false,
|
||||
phyHold=false,
|
||||
|
||||
--Visual
|
||||
bone=false,
|
||||
|
||||
--Rule
|
||||
sequence="bag",
|
||||
fieldH=20,
|
||||
|
||||
ospin=true,
|
||||
fineKill=false,
|
||||
b2bKill=false,
|
||||
easyFresh=true,
|
||||
deepDrop=false,
|
||||
visible="show",
|
||||
freshLimit=1e99,
|
||||
|
||||
|
||||
opponent="X",
|
||||
life=0,
|
||||
pushSpeed=3,
|
||||
missionKill=false,
|
||||
|
||||
--Else
|
||||
bg="none",
|
||||
bgm="race",
|
||||
}
|
||||
GAME={--Global game data
|
||||
init=false, --If need initializing game when enter scene-play
|
||||
net=false, --If play net game
|
||||
@@ -227,6 +189,47 @@ USER=FILE.load("conf/user")or{--User infomation
|
||||
--Local data
|
||||
xp=0,lv=1,
|
||||
}
|
||||
CUSTOMENV=FILE.load("conf/customEnv")
|
||||
if not CUSTOMENV or CUSTOMENV.version~=VERSION.code then CUSTOMENV={--gameEnv for cutsom game
|
||||
version=VERSION.code,
|
||||
|
||||
--Basic
|
||||
drop=1e99,
|
||||
lock=1e99,
|
||||
wait=0,
|
||||
fall=0,
|
||||
|
||||
--Control
|
||||
nextCount=6,
|
||||
holdCount=1,
|
||||
infHold=true,
|
||||
phyHold=false,
|
||||
|
||||
--Visual
|
||||
bone=false,
|
||||
|
||||
--Rule
|
||||
sequence="bag",
|
||||
fieldH=20,
|
||||
|
||||
ospin=true,
|
||||
fineKill=false,
|
||||
b2bKill=false,
|
||||
easyFresh=true,
|
||||
deepDrop=false,
|
||||
visible="show",
|
||||
freshLimit=1e99,
|
||||
|
||||
|
||||
opponent="X",
|
||||
life=0,
|
||||
pushSpeed=3,
|
||||
missionKill=false,
|
||||
|
||||
--Else
|
||||
bg="none",
|
||||
bgm="infinite",
|
||||
}end
|
||||
SETTING={--Settings
|
||||
--Tuning
|
||||
das=10,arr=2,dascut=0,
|
||||
@@ -331,26 +334,26 @@ keyMap=FILE.load("conf/key")or{--Key setting
|
||||
},
|
||||
}
|
||||
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,color=COLOR.lime},--moveLeft
|
||||
{ava=true, x=320, y=720-200, r=80,color=COLOR.lime},--moveRight
|
||||
{ava=true, x=1280-80, y=720-200, r=80,color=COLOR.red},--rotRight
|
||||
{ava=true, x=1280-200, y=720-80, r=80,color=COLOR.orange},--rotLeft
|
||||
{ava=true, x=1280-200, y=720-320, r=80,color=COLOR.magenta},--rot180
|
||||
{ava=true, x=200, y=720-320, r=80,color=COLOR.cyan},--hardDrop
|
||||
{ava=true, x=200, y=720-80, r=80,color=COLOR.sea},--softDrop
|
||||
{ava=true, x=1280-320, y=720-200, r=80,color=COLOR.yellow},--hold
|
||||
{ava=true, x=1280-80, y=280, r=80,color=COLOR.lRed},--func1
|
||||
{ava=true, x=80, y=280, r=80,color=COLOR.lMagenta},--func2
|
||||
{ava=false, x=100, y=50, r=80,color=COLOR.aqua},--insLeft
|
||||
{ava=false, x=200, y=50, r=80,color=COLOR.aqua},--insRight
|
||||
{ava=true, x=80, y=720-200, r=80,color=COLOR.L},--moveLeft
|
||||
{ava=true, x=320, y=720-200, r=80,color=COLOR.L},--moveRight
|
||||
{ava=true, x=1280-80, y=720-200, r=80,color=COLOR.R},--rotRight
|
||||
{ava=true, x=1280-200, y=720-80, r=80,color=COLOR.O},--rotLeft
|
||||
{ava=true, x=1280-200, y=720-320, r=80,color=COLOR.M},--rot180
|
||||
{ava=true, x=200, y=720-320, r=80,color=COLOR.C},--hardDrop
|
||||
{ava=true, x=200, y=720-80, r=80,color=COLOR.S},--softDrop
|
||||
{ava=true, x=1280-320, y=720-200, r=80,color=COLOR.Y},--hold
|
||||
{ava=true, x=1280-80, y=280, r=80,color=COLOR.lR},--func1
|
||||
{ava=true, x=80, y=280, r=80,color=COLOR.lM},--func2
|
||||
{ava=false, x=100, y=50, r=80,color=COLOR.A},--insLeft
|
||||
{ava=false, x=200, y=50, r=80,color=COLOR.A},--insRight
|
||||
{ava=false, x=300, y=50, r=80,color={COLOR.rainbow(3.5)}},--insDown
|
||||
{ava=false, x=400, y=50, r=80,color={COLOR.rainbow(3.3)}},--down1
|
||||
{ava=false, x=500, y=50, r=80,color={COLOR.rainbow(3.1)}},--down4
|
||||
{ava=false, x=600, y=50, r=80,color={COLOR.rainbow(2.9)}},--down10
|
||||
{ava=false, x=700, y=50, r=80,color=COLOR.lLime},--dropLeft
|
||||
{ava=false, x=800, y=50, r=80,color=COLOR.lLime},--dropRight
|
||||
{ava=false, x=900, y=50, r=80,color=COLOR.laqua},--addToLeft
|
||||
{ava=false, x=1000, y=50, r=80,color=COLOR.laqua},--addToRight
|
||||
{ava=false, x=700, y=50, r=80,color=COLOR.lL},--dropLeft
|
||||
{ava=false, x=800, y=50, r=80,color=COLOR.lL},--dropRight
|
||||
{ava=false, x=900, y=50, r=80,color=COLOR.lA},--addToLeft
|
||||
{ava=false, x=1000, y=50, r=80,color=COLOR.lA},--addToRight
|
||||
}
|
||||
virtualkey={}for i=1,#VK_org do virtualkey[i]={}end--In-game virtualkey layout
|
||||
REPLAY=FILE.load("conf/replay")or{}
|
||||
@@ -47,19 +47,19 @@ return{
|
||||
"ttt tetris trainer tres bien",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single player*\nTetris Trainer Tres-Bien. A hands-on tutorial of advanced techniques in modern Tetris.\nRecommended for players that can complete a 40-line Sprint with all Tetris line clears and no hold.\nCovered topics include T-Spin, finesse, SRS, and some battle setups.\nLinked is translated to Simplified Chinese; original in Japanese.",
|
||||
"http://121.4.147.128/ttt",
|
||||
"http://teatube.ltd/ttt",
|
||||
},
|
||||
{"TTPC",
|
||||
"ttpc tetris perfect clear challenge",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single player*\nTetris Perfect Clear Challenge. The PC opener tutorial for SRS+bag7.\nRecommended for players that have completed TTT. You need to know SRS to play this.\nIncludes only the basic PC opener.\nLinked is translated to Simplified Chinese; original in Japanese.",
|
||||
"http://121.4.147.128/ttpc",
|
||||
"http://teatube.ltd/ttpc",
|
||||
},
|
||||
{"NAZO",
|
||||
"nazo",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single player*\nAll sorts of SRS puzzles. Recommended for players that have completed TTT.\nHas T-Spin and all spin puzzles of all difficulties.\nLinked is translated to Simplified Chinese; original in Japanese.",
|
||||
"http://121.4.147.128/nazo",
|
||||
"http://teatube.ltd/nazo",
|
||||
},
|
||||
|
||||
{"King of Stackers",
|
||||
@@ -228,9 +228,9 @@ return{
|
||||
"Dig/Defend per minute\n\tSometimes can reflect how well a player can survive garbage.",
|
||||
},
|
||||
{"ADPM",
|
||||
"adpm attackdigperminute",
|
||||
"adpm attackdigperminute vs",
|
||||
"term",
|
||||
"Attack&Dig per minute\n\tUsed to compare skill differences between the two players within one match; slightly more accurate than APM.",
|
||||
"Attack&Dig per minute\n\tUsed to compare skill differences between the two players within one match; slightly more accurate than APM.\n\"vs\" in TETR.IO is Atk+Dig per 100s",
|
||||
},
|
||||
{"APL",
|
||||
"apl attackperline efficiency",
|
||||
@@ -772,7 +772,7 @@ return{
|
||||
"tetrisonline servers",
|
||||
"other",
|
||||
"Google \"Tetris Online Poland\" for the Poland server.\nClick \"Open URL\" for information about the Tetris Online Study server.",
|
||||
"http://121.4.147.128/tos",
|
||||
"http://teatube.ltd/tos",
|
||||
},
|
||||
{"Github Repository",
|
||||
"githubrepository sourcecode",
|
||||
|
||||
@@ -42,19 +42,19 @@ return{
|
||||
"教程 ttt",
|
||||
"game",
|
||||
"现代方块特殊操作手把手教程(推荐使用电脑,移动设备需要外接键盘)\n\t推荐能无hold纯消四完成40行挑战的人学习\n\t内含T-spin、极简、SRS、部分对战定式介绍等教程\n\t完全吃透了话就可以成为教练啦!\n注:提供的链接是翻译后挂在茶服的版本",
|
||||
"http://121.4.147.128/ttt",
|
||||
"http://teatube.ltd/ttt",
|
||||
},
|
||||
{"TTPC",
|
||||
"pc教程 ttpc",
|
||||
"game",
|
||||
"SRS+bag7方块游戏开局PC教程(推荐使用电脑,移动设备需要外接键盘)\n\t推荐完成了ttt的人学习(必须先学会SRS)\n\t(不包括六巧板等其它PC定式)\n\n注:提供的链接是翻译后挂在茶服的版本",
|
||||
"http://121.4.147.128/ttpc",
|
||||
"http://teatube.ltd/ttpc",
|
||||
},
|
||||
{"NAZO",
|
||||
"题库 nazo",
|
||||
"game",
|
||||
"各类SRS试题(手机触屏玩不了)\n\t推荐能通过ttt的玩家尝试。\n\t内含各种t-spin/all-spin题目,简单到极难题目都有。\n\n注:提供的链接是翻译后挂在茶服的版本",
|
||||
"http://121.4.147.128/nazo",
|
||||
"http://teatube.ltd/nazo",
|
||||
},
|
||||
|
||||
--游戏(网页)
|
||||
@@ -106,7 +106,7 @@ return{
|
||||
"俄罗斯方块大师 tgm tetrisgrandmaster",
|
||||
"game",
|
||||
"一个街机平台方块系列,S13/GM等称号出自该系列,可以在win平台运行\n\n其中TGM3目前玩得最普遍,部分模式说明:\nMaster:大师模式,有段位评价,拿到更高段位点的要求:非消一的连击和消四,字幕战中消除和通关,每100的前70小于【标准时间,上一个0~70秒数+2】中小的一个,每100总用时不能超过限定值(不然取消上一个方法的加分并反扣点数);到500若没有进标准时间会强制结束游戏(称为铁门);字幕战有两个难度,半隐和全隐,后者必须拿到几乎全部的段位点才能进,消除奖励的段位点也更多。\nShirase:死亡模式,类似于techmino中的20G-极限,开局就是高速20G,500和1000有铁门,500开始底下开始涨垃圾行,1000开始出现骨块,1300通关进入大方块字幕战;段位结算:每通100加1段从S1到S13,如果通关了字幕战就会有金色的S13\n\n更多内容详见链接",
|
||||
"http://121.4.147.128/TGMGUIDE/",
|
||||
"http://teatube.ltd/TGMGUIDE/",
|
||||
},
|
||||
{"DTET",
|
||||
"dtet",
|
||||
@@ -228,9 +228,9 @@ return{
|
||||
"Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力\n\n或:防御(抵消+挖掘)每分",
|
||||
},
|
||||
{"ADPM",
|
||||
"adpm attack defend",
|
||||
"adpm attack defend vs",
|
||||
"term",
|
||||
"Atk+Dig per Minute\n攻击+挖掘每分,用于在同一局游戏内对比玩家间水平差距,比apm更准确一些。\n在TETR.IO中有一个叫vs的数据就是ADPM(调整了比例)",--TODO
|
||||
"Atk+Dig per Minute\n攻击+挖掘每分,用于在同一局游戏内对比玩家间水平差距,比apm更准确一些。\n在TETR.IO中叫vs的数据就是ADPM(调整过比例,具体是Atk+Dig per 100s)",
|
||||
},
|
||||
{"APL",
|
||||
"apl xiaolv",
|
||||
@@ -262,7 +262,7 @@ return{
|
||||
{"Tetris",
|
||||
"tetris xiaosi",
|
||||
"term",
|
||||
"商标,Tetris游戏名,同时也是别的方块游戏里消四行的名字。\n含义是Tetra(古希腊语 四)+Tennis(游戏原作者喜欢的运动)。",
|
||||
"商标,Tetris游戏名,同时也是别的方块游戏里消四行的名字。\n含义是Tetra(古希腊语 四)+Tennis(游戏原作者喜欢的运动)。\n现在版权在TTC(The Tetris Company)手上,任天堂和世嘉开发游戏是TTC授权的,本身并没有版权。",
|
||||
},
|
||||
{"PC",
|
||||
"pc perfectclear ac allclear quanxiao quanqing",
|
||||
@@ -523,12 +523,12 @@ return{
|
||||
{"DAS & ARR",
|
||||
"灵敏度 das arr",
|
||||
"term",
|
||||
"DAS(Delay-auto-shift,延迟自动移动)系统。\n\nDAS,自动移动延迟,指从<按下移动键时动了一格>到<开始自动移动>之间的时间\nARR(Auto-repeat-rate),自动重复速率,指<每次自动移动>之间的时间\n\n单位都是f(帧,1帧=1/60秒)\n新人不会调的话推荐用das=8~10,arr=1~2\n对自己能力比较自信或者是已经有一定水平想提速推荐用das=4~6,arr=0\n(如果是别的游戏单位是ms(毫秒),那么乘16.7就可算出对应的数值)\n\n最佳调整方法:das越小越好,小到玩家依然能精准区分单点/长按为止;arr能0就0,游戏不允许的话就能拉多小拉多小\n\n这套系统也被叫作DAS系统",
|
||||
"DAS(Delay-auto-shift,自动加速延迟)系统。\n\nDAS,具体指从<按下移动键时动了一格>到<开始自动移动>之间的时间\nARR(Auto-repeat-rate),自动重复速率,指<每次自动移动>之间的时间\n\n单位都是f(帧,1帧=1/60秒)\n新人不会调的话推荐用das=8~10,arr=1~2\n对自己能力比较自信或者是已经有一定水平想提速推荐用das=4~6,arr=0\n(如果是别的游戏单位是ms(毫秒),那么乘16.7就可算出对应的数值)\n\n最佳调整方法:das越小越好,小到依然能准确区分单点/长按为止;arr能0就0,游戏不允许的话就能拉多小拉多小\n\n这套系统也被叫作DAS系统",
|
||||
},
|
||||
{"DAS通俗",
|
||||
"das arr",
|
||||
"term",
|
||||
"打字时按住o,你会看到:Ooooooooooo\n在时间轴上:O-----------o-o-o-o-o-o-o-o-o-o\n-----------就是das长度,-就是arr长度",
|
||||
"打字时按住o,你会看到:ooooooooooo\n在时间轴上:o-----------o-o-o-o-o-o-o-o-o-o\n-----------就是das长度,-就是arr长度",
|
||||
},
|
||||
{"DAS打断",
|
||||
"dascut",
|
||||
@@ -781,7 +781,7 @@ return{
|
||||
"茶服 chafu study",
|
||||
"other",
|
||||
"TO-S的添加方法、说明等关于茶服的一切",
|
||||
"http://121.4.147.128/tos",
|
||||
"http://teatube.ltd/tos",
|
||||
},
|
||||
{"Github仓库",
|
||||
"源代码 github sourcecode yuandaima",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
local c=COLOR
|
||||
local C=COLOR
|
||||
return{
|
||||
back="Back",
|
||||
anykey="Press a key!",
|
||||
@@ -219,7 +219,6 @@ return{
|
||||
music="Music & SE",
|
||||
about="About",
|
||||
dict="Zictionary",
|
||||
lang="言/A",
|
||||
manual="Manual",
|
||||
quit="Exit",
|
||||
},
|
||||
@@ -852,30 +851,30 @@ return{
|
||||
"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.",
|
||||
"ZS JL T O I",
|
||||
{c.C,"Also try 15puzzle!"},
|
||||
{c.C,"Also try Minecraft!"},
|
||||
{c.C,"Also try Minesweeper!"},
|
||||
{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 VVVVVV!"},
|
||||
{c.fire,"Also try Cultris II!"},
|
||||
{c.fire,"Also try Jstris"},
|
||||
{c.fire,"Also try NullpoMino!"},
|
||||
{c.fire,"Also try TETR.IO!"},
|
||||
{c.fire,"Also try Tetr.js!"},
|
||||
{c.fire,"Also try Tetra Legends!"},
|
||||
{c.grape,"T-spin!"},
|
||||
{c.gray,"REGRET!!"},
|
||||
{c.lR,"Z ",c.lG,"S ",c.lSea,"J ",c.lOrange,"L ",c.lGrape,"T ",c.lY,"O ",c.lC,"I"},
|
||||
{c.lY,"COOL!!"},
|
||||
{c.R,"\"DMCA abusing\""},
|
||||
{c.R,"\"Intellectual property law\""},
|
||||
{c.R,"DT",c.W," Cannon=",c.grape,"TS",c.R,"D",c.W,"+",c.grape,"TS",c.R,"T",c.W," Cannon"},
|
||||
{c.R,"LrL ",c.G,"RlR ",c.B,"LLr ",c.orange,"RRl ",c.grape,"RRR ",c.grape,"LLL ",c.C,"FFF ",c.Y,"RfR ",c.Y,"RRf ",c.Y,"rFF"},
|
||||
{c.sky,"Lua",c.W," No.1"},
|
||||
{c.W,"What is an ",c.lC,"X-Spin"?},
|
||||
{c.Y,"O-Spin Triple!"},
|
||||
{C.C,"Also try 15puzzle!"},
|
||||
{C.C,"Also try Minecraft!"},
|
||||
{C.C,"Also try Minesweeper!"},
|
||||
{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 VVVVVV!"},
|
||||
{C.fire,"Also try Cultris II!"},
|
||||
{C.fire,"Also try Jstris"},
|
||||
{C.fire,"Also try NullpoMino!"},
|
||||
{C.fire,"Also try TETR.IO!"},
|
||||
{C.fire,"Also try Tetr.js!"},
|
||||
{C.fire,"Also try Tetra Legends!"},
|
||||
{C.purple,"T-spin!"},
|
||||
{C.H,"REGRET!!"},
|
||||
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},
|
||||
{C.lY,"COOL!!"},
|
||||
{C.R,"\"DMCA abusing\""},
|
||||
{C.R,"\"Intellectual property law\""},
|
||||
{C.R,"DT",C.Z," Cannon=",C.purple,"TS",C.R,"D",C.Z,"+",C.purple,"TS",C.R,"T",C.Z," Cannon"},
|
||||
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.orange,"RRl ",C.purple,"RRR ",C.purple,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
|
||||
{C.navy,"Lua",C.Z," No.1"},
|
||||
{C.Z,"What is an ",c.lC,"X-Spin"?},
|
||||
{C.Y,"O-Spin Triple!"},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,7 +196,6 @@ return{
|
||||
-- music="Music & SE",
|
||||
-- about="About",
|
||||
dict="Zictionary",
|
||||
lang="言/A",
|
||||
manual="Manuel",
|
||||
quit="Quitter",
|
||||
},
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
local C=COLOR
|
||||
return{
|
||||
fallback=4,
|
||||
back="Voltar",
|
||||
@@ -219,7 +220,6 @@ return{
|
||||
-- music="Music & SE",
|
||||
-- about="About",
|
||||
dict="Zictionary",
|
||||
lang="言/A",
|
||||
manual="Manual",
|
||||
quit="Saída",
|
||||
},
|
||||
@@ -609,7 +609,7 @@ return{
|
||||
},
|
||||
app_15p={
|
||||
reset="Embaralhar",
|
||||
color="Cor",
|
||||
C="Cor",
|
||||
blind="Cego",
|
||||
slide="Deslizar",
|
||||
pathVis="Mostrar caminho",
|
||||
@@ -843,37 +843,37 @@ return{
|
||||
"Você pode abrir o diretório de save na pagina de Stats.",
|
||||
"Você pode escolher uma orientação pra cada blococan.",
|
||||
"ZS JL T O I",
|
||||
{COLOR.cyan,"Tente também 15puzzle"},
|
||||
{COLOR.cyan,"Tente também Minecraft"},
|
||||
{COLOR.cyan,"Tente também Minesweeper"},
|
||||
{COLOR.cyan,"Tente também osu!"},
|
||||
{COLOR.cyan,"Tente também Phigros"},
|
||||
{COLOR.cyan,"Tente também Rubic's cube"},
|
||||
{COLOR.cyan,"Tente também Terraria"},
|
||||
{COLOR.cyan,"Tente também VVVVVV"},
|
||||
{COLOR.fire,"Tente também Cultris II"},
|
||||
{COLOR.fire,"Tente também Jstris"},
|
||||
{COLOR.fire,"Tente também Nullpomino"},
|
||||
{COLOR.fire,"Tente também Tetr.io"},
|
||||
{COLOR.fire,"Tente também Tetr.js"},
|
||||
{COLOR.fire,"Tente também Tetralegends"},
|
||||
{COLOR.grape,"T-spin!"},
|
||||
{COLOR.gray,"暫定段位:9"},
|
||||
{COLOR.gray,"REGRET!!"},
|
||||
{COLOR.lR,"Z ",COLOR.lG,"S ",COLOR.lSea,"J ",COLOR.lOrange,"L ",COLOR.lGrape,"T ",COLOR.lY,"O ",COLOR.lC,"I"},
|
||||
{COLOR.lY,"LEGAL!!"},
|
||||
{COLOR.R,"\"DMCA abusing\""},
|
||||
{COLOR.R,"\"Intellectual property law\""},
|
||||
{COLOR.R,"DT",COLOR.W," Cannon=",COLOR.grape,"TS",COLOR.R,"D",COLOR.W,"+",COLOR.grape,"TS",COLOR.R,"T",COLOR.W," Cannon"},
|
||||
{COLOR.R,"LrL ",COLOR.G,"RlR ",COLOR.B,"LLr ",COLOR.orange,"RRl ",COLOR.grape,"RRR ",COLOR.grape,"LLL ",COLOR.C,"FFF ",COLOR.Y,"RfR ",COLOR.Y,"RRf ",COLOR.Y,"rFF"},
|
||||
{COLOR.sky,"Lua",COLOR.W," No.1"},
|
||||
{COLOR.W,"What is ",COLOR.lC,"Xspin"},
|
||||
{COLOR.Y,"暫定段位:GM"},
|
||||
{COLOR.Y,"暫定段位:M"},
|
||||
{COLOR.Y,"暫定段位:MK"},
|
||||
{COLOR.Y,"暫定段位:MM"},
|
||||
{COLOR.Y,"暫定段位:MO"},
|
||||
{COLOR.Y,"暫定段位:MV"},
|
||||
{COLOR.Y,"O-spin Triple!"},
|
||||
{C.C,"Tente também 15puzzle"},
|
||||
{C.C,"Tente também Minecraft"},
|
||||
{C.C,"Tente também Minesweeper"},
|
||||
{C.C,"Tente também osu!"},
|
||||
{C.C,"Tente também Phigros"},
|
||||
{C.C,"Tente também Rubic's cube"},
|
||||
{C.C,"Tente também Terraria"},
|
||||
{C.C,"Tente também VVVVVV"},
|
||||
{C.F,"Tente também Cultris II"},
|
||||
{C.F,"Tente também Jstris"},
|
||||
{C.F,"Tente também Nullpomino"},
|
||||
{C.F,"Tente também Tetr.io"},
|
||||
{C.F,"Tente também Tetr.js"},
|
||||
{C.F,"Tente também Tetralegends"},
|
||||
{C.H,"暫定段位:9"},
|
||||
{C.H,"REGRET!!"},
|
||||
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},
|
||||
{C.lY,"LEGAL!!"},
|
||||
{C.N,"Lua",C.Z," No.1"},
|
||||
{C.P,"T-spin!"},
|
||||
{C.R,"\"DMCA abusing\""},
|
||||
{C.R,"\"Intellectual property law\""},
|
||||
{C.R,"DT",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z," Cannon"},
|
||||
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
|
||||
{C.Z,"What is ",C.lC,"Xspin"},
|
||||
{C.Y,"暫定段位:GM"},
|
||||
{C.Y,"暫定段位:M"},
|
||||
{C.Y,"暫定段位:MK"},
|
||||
{C.Y,"暫定段位:MM"},
|
||||
{C.Y,"暫定段位:MO"},
|
||||
{C.Y,"暫定段位:MV"},
|
||||
{C.Y,"O-spin Triple!"},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,7 +197,6 @@ return{
|
||||
music="Música y SFX",
|
||||
about="Acerca del Juego",
|
||||
dict="Zictionary",
|
||||
lang="言/A",
|
||||
manual="Manual",
|
||||
quit="Salir",
|
||||
},
|
||||
|
||||
@@ -101,7 +101,6 @@ return{
|
||||
music="~~~ & =><=",
|
||||
about="?",
|
||||
dict="z",
|
||||
lang="言/A",
|
||||
manual="???",
|
||||
quit="X",
|
||||
},
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
local c=COLOR
|
||||
local C=COLOR
|
||||
return{
|
||||
back="返回",
|
||||
anykey="按任意键继续",
|
||||
@@ -219,7 +219,6 @@ return{
|
||||
music="音乐&音效",
|
||||
about="关于",
|
||||
dict="小Z词典",
|
||||
lang="言/A",
|
||||
manual="说明书",
|
||||
quit="退出",
|
||||
},
|
||||
@@ -1013,91 +1012,91 @@ return{
|
||||
"Z酱累了,Z酱不想更新",
|
||||
"Z酱只是个写代码的,懂什么方块",
|
||||
"Z块等身抱枕来一个(x",
|
||||
{c.aqua,"AQUA"},
|
||||
{c.B,"BLUE"},
|
||||
{c.C,"<PURE ",c.grape,"MEMORY>"},
|
||||
{c.C,"15puzzle好玩!"},
|
||||
{c.C,"魔方好玩!"},
|
||||
{c.C,"扫雷好玩!"},
|
||||
{c.C,"泰拉瑞亚好玩!"},
|
||||
{c.C,"我的世界好玩!"},
|
||||
{c.C,"CYAN"},
|
||||
{c.C,"Orzmic好玩!"},
|
||||
{c.C,"Osu!好玩!"},
|
||||
{c.C,"Phigros好玩!"},
|
||||
{c.C,"VVVVVV好玩!"},
|
||||
{c.fire,"Cultris II也很好玩!"},
|
||||
{c.fire,"FIRE"},
|
||||
{c.fire,"Jstris也很好玩!"},
|
||||
{c.fire,"Nullpomino也很好玩!"},
|
||||
{c.fire,"Tetr.io也很好玩!"},
|
||||
{c.fire,"Tetr.js也很好玩!"},
|
||||
{c.fire,"Tetralegends也很好玩!"},
|
||||
{c.G,"快捷键: Alt+F4=关闭当前窗口"},
|
||||
{c.G,"快捷键: Alt+Tab=切换窗口"},
|
||||
{c.G,"快捷键: backspace=返回上一个文件目录"},
|
||||
{c.G,"快捷键: Ctrl+鼠标滚轮=缩放"},
|
||||
{c.G,"快捷键: Ctrl+A=全选"},
|
||||
{c.G,"快捷键: Ctrl+Alt+Z=查看所有qq消息"},
|
||||
{c.G,"快捷键: Ctrl+D=复制一份"},
|
||||
{c.G,"快捷键: Ctrl+F=查找"},
|
||||
{c.G,"快捷键: Ctrl+Tab=切换标签页"},
|
||||
{c.G,"快捷键: Ctrl+W=关闭当前标签页"},
|
||||
{c.G,"快捷键: shift+del=永久删除文件 (技术人员别杠)"},
|
||||
{c.G,"GREEN"},
|
||||
{c.grape,"GRAPE"},
|
||||
{c.grape,"T-spin!"},
|
||||
{c.grass,"GRASS"},
|
||||
{c.gray,"感谢Phigros提供部分tip模板("},
|
||||
{c.gray,"暂定段位:9"},
|
||||
{c.gray,"REGRET!!"},
|
||||
{c.lime,"LIME"},
|
||||
{c.lC,"26连T2来一个?"},
|
||||
{c.lC,"Xspin",c.W,"是啥"},
|
||||
{c.lGrape,"Naki",c.W," 可爱!"},
|
||||
{c.lGray,"腱鞘炎警告"},
|
||||
{c.lGray,"看起来是个计算器,其实…"},
|
||||
{c.lGray,"没学过编曲,音乐都是自己瞎写的,觉得不好听就去设置关了吧"},
|
||||
{c.lGray,"秘密数字:626"},
|
||||
{c.lGray,"你有一个好"},
|
||||
{c.lGray,"STSD必死"},
|
||||
{c.lGray,"Techmino没有抽卡没有氪金,太良心了"},
|
||||
{c.lR,"Z ",c.lG,"S ",c.lSea,"J ",c.lOrange,"L ",c.lGrape,"T ",c.lY,"O ",c.lC,"I"},
|
||||
{c.lSea,"茶娘",c.W," 可爱!"},
|
||||
{c.lY,"COOL!!"},
|
||||
{c.magenta,"MAGENTA"},
|
||||
{c.orange,"ORANGE"},
|
||||
{c.pink,"PINK"},
|
||||
{c.pink,"uid:225238922"},
|
||||
{c.purple,"PURPLE"},
|
||||
{c.R,"《滥用DMCA》"},
|
||||
{c.R,"《知识产权法》"},
|
||||
{c.R,"本游戏难度上限很高,做好心理准备。"},
|
||||
{c.R,"不要向不感兴趣的路人推荐!!!!!!!!"},
|
||||
{c.R,"不要在上课时玩游戏!"},
|
||||
{c.R,"光敏性癫痫警告"},
|
||||
{c.R,"请在有一定游戏基础之后再学Tspin!不然副作用非常大!"},
|
||||
{c.R,"新人请千万记住,打好基础,不要太早学那些花里胡哨的。"},
|
||||
{c.R,"长时间游戏状态会越来越差!玩久了记得放松一下~"},
|
||||
{c.R,"DD",c.W,"炮=",c.grape,"TS",c.R,"D",c.W,"+",c.grape,"TS",c.R,"D",c.W,"炮"},
|
||||
{c.R,"DT",c.W,"炮=",c.grape,"TS",c.R,"D",c.W,"+",c.grape,"TS",c.R,"T",c.W,"炮"},
|
||||
{c.R,"LrL ",c.G,"RlR ",c.B,"LLr ",c.orange,"RRl ",c.grape,"RRR LLL ",c.C,"FFF ",c.Y,"RfR RRf rFF"},
|
||||
{c.R,"RED"},
|
||||
{c.sea,"SEA"},
|
||||
{c.sky,"Lua",c.W,"天下第一"},
|
||||
{c.sky,"SKY"},
|
||||
{c.W,"1, 2, ",c.C,"⑨",c.W,"!!!!!"},
|
||||
{c.W,"效率药水",c.gray," 效率提升 (8:00)"},
|
||||
{c.W,"协调药水",c.gray," MD减少 II(1:30)"},
|
||||
{c.Y,"暂定段位:GM"},
|
||||
{c.Y,"暂定段位:M"},
|
||||
{c.Y,"暂定段位:MK"},
|
||||
{c.Y,"暂定段位:MM"},
|
||||
{c.Y,"暂定段位:MO"},
|
||||
{c.Y,"暂定段位:MV"},
|
||||
{c.Y,"Miya",c.W," 可爱!"},
|
||||
{c.Y,"O-spin Triple!"},
|
||||
{c.Y,"YELLOW"},
|
||||
{C.A,"AQUA"},
|
||||
{C.B,"BLUE"},
|
||||
{C.C,"<PURE ",C.purple,"MEMORY>"},
|
||||
{C.C,"15puzzle好玩!"},
|
||||
{C.C,"魔方好玩!"},
|
||||
{C.C,"扫雷好玩!"},
|
||||
{C.C,"泰拉瑞亚好玩!"},
|
||||
{C.C,"我的世界好玩!"},
|
||||
{C.C,"CYAN"},
|
||||
{C.C,"Orzmic好玩!"},
|
||||
{C.C,"Osu!好玩!"},
|
||||
{C.C,"Phigros好玩!"},
|
||||
{C.C,"VVVVVV好玩!"},
|
||||
{C.F,"Cultris II也很好玩!"},
|
||||
{C.F,"FIRE"},
|
||||
{C.F,"Jstris也很好玩!"},
|
||||
{C.F,"Nullpomino也很好玩!"},
|
||||
{C.F,"Tetr.io也很好玩!"},
|
||||
{C.F,"Tetr.js也很好玩!"},
|
||||
{C.F,"Tetralegends也很好玩!"},
|
||||
{C.G,"快捷键: Alt+F4=关闭当前窗口"},
|
||||
{C.G,"快捷键: Alt+Tab=切换窗口"},
|
||||
{C.G,"快捷键: backspace=返回上一个文件目录"},
|
||||
{C.G,"快捷键: Ctrl+鼠标滚轮=缩放"},
|
||||
{C.G,"快捷键: Ctrl+A=全选"},
|
||||
{C.G,"快捷键: Ctrl+Alt+Z=查看所有qq消息"},
|
||||
{C.G,"快捷键: Ctrl+D=复制一份"},
|
||||
{C.G,"快捷键: Ctrl+F=查找"},
|
||||
{C.G,"快捷键: Ctrl+Tab=切换标签页"},
|
||||
{C.G,"快捷键: Ctrl+W=关闭当前标签页"},
|
||||
{C.G,"快捷键: shift+del=永久删除文件 (技术人员别杠)"},
|
||||
{C.G,"GREEN"},
|
||||
{C.H,"感谢Phigros提供部分tip模板("},
|
||||
{C.H,"暂定段位:9"},
|
||||
{C.H,"REGRET!!"},
|
||||
{C.jade,"JADE"},
|
||||
{C.lC,"26连T2来一个?"},
|
||||
{C.lC,"Xspin",C.Z,"是啥"},
|
||||
{C.lH,"腱鞘炎警告"},
|
||||
{C.lH,"看起来是个计算器,其实…"},
|
||||
{C.lH,"没学过编曲,音乐都是自己瞎写的,觉得不好听就去设置关了吧"},
|
||||
{C.lH,"秘密数字:626"},
|
||||
{C.lH,"你有一个好"},
|
||||
{C.lH,"STSD必死"},
|
||||
{C.lH,"Techmino没有抽卡没有氪金,太良心了"},
|
||||
{C.L,"LIME"},
|
||||
{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," 可爱!"},
|
||||
{C.lY,"COOL!!"},
|
||||
{C.M,"MAGENTA"},
|
||||
{C.N,"Lua",C.Z,"天下第一"},
|
||||
{C.N,"NAVY"},
|
||||
{C.O,"ORANGE"},
|
||||
{C.P,"PURPLE"},
|
||||
{C.P,"T-spin!"},
|
||||
{C.R,"《滥用DMCA》"},
|
||||
{C.R,"《知识产权法》"},
|
||||
{C.R,"本游戏难度上限很高,做好心理准备。"},
|
||||
{C.R,"不要向不感兴趣的路人推荐!!!!!!!!"},
|
||||
{C.R,"不要在上课时玩游戏!"},
|
||||
{C.R,"光敏性癫痫警告"},
|
||||
{C.R,"请在有一定游戏基础之后再学Tspin!不然副作用非常大!"},
|
||||
{C.R,"新人请千万记住,打好基础,不要太早学那些花里胡哨的。"},
|
||||
{C.R,"长时间游戏状态会越来越差!玩久了记得放松一下~"},
|
||||
{C.R,"DD",C.Z,"炮=",C.purple,"TS",C.R,"D",C.Z,"+",C.purple,"TS",C.R,"D",C.Z,"炮"},
|
||||
{C.R,"DT",C.Z,"炮=",C.purple,"TS",C.R,"D",C.Z,"+",C.purple,"TS",C.R,"T",C.Z,"炮"},
|
||||
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.orange,"RRl ",C.purple,"RRR LLL ",C.C,"FFF ",C.Y,"RfR RRf rFF"},
|
||||
{C.R,"RED"},
|
||||
{C.S,"SEA"},
|
||||
{C.V,"VIOLET"},
|
||||
{C.W,"uid:225238922"},
|
||||
{C.W,"WINE"},
|
||||
{C.Y,"暂定段位:GM"},
|
||||
{C.Y,"暂定段位:M"},
|
||||
{C.Y,"暂定段位:MK"},
|
||||
{C.Y,"暂定段位:MM"},
|
||||
{C.Y,"暂定段位:MO"},
|
||||
{C.Y,"暂定段位:MV"},
|
||||
{C.Y,"Miya",C.Z," 可爱!"},
|
||||
{C.Y,"O-spin Triple!"},
|
||||
{C.Y,"YELLOW"},
|
||||
{C.Z,"1, 2, ",C.C,"⑨",C.Z,"!!!!!"},
|
||||
{C.Z,"效率药水",C.H," 效率提升 (8:00)"},
|
||||
{C.Z,"协调药水",C.H," MD减少 II(1:30)"},
|
||||
-- "Z酱 可爱!",
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
return SPLITSTR([=[
|
||||
return STRING.split([=[
|
||||
Gameplay:
|
||||
The system will provide you with tetrominoes (4-block pieces),
|
||||
with a total of 7 types, and the player needs to control them
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
return SPLITSTR([=[
|
||||
return STRING.split([=[
|
||||
游戏方法:
|
||||
系统会提供的一个个四连骨牌("方块",总共7种)
|
||||
玩家需要控制(左右移动和旋转90,180,270度)这些骨牌直到下落到场地底部,锁定
|
||||
|
||||
@@ -302,7 +302,7 @@ rankColor={
|
||||
}
|
||||
|
||||
minoColor={
|
||||
COLOR.red, COLOR.fire, COLOR.orange, COLOR.yellow, COLOR.lime, COLOR.grass, COLOR.green, COLOR.aqua,
|
||||
COLOR.cyan, COLOR.sky, COLOR.sea, COLOR.blue, COLOR.purple, COLOR.grape, COLOR.magenta, COLOR.pink,
|
||||
COLOR.dGray,COLOR.black,COLOR.lYellow, COLOR.gray, COLOR.lGray, COLOR.dPurple, COLOR.dRed, COLOR.dGreen,
|
||||
COLOR.R,COLOR.F,COLOR.O,COLOR.Y,COLOR.L,COLOR.J,COLOR.G,COLOR.A,
|
||||
COLOR.C,COLOR.N,COLOR.S,COLOR.B,COLOR.V,COLOR.P,COLOR.M,COLOR.W,
|
||||
COLOR.dH,COLOR.D,COLOR.lY,COLOR.H,COLOR.lH,COLOR.dV,COLOR.dR,COLOR.dG,
|
||||
}
|
||||
@@ -49,7 +49,7 @@ return{
|
||||
mText(drawableText.nextWave,69,380)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
mText(drawableText.nextWave,69,380)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -23,7 +23,7 @@ return{
|
||||
mText(drawableText.atk,69,380)
|
||||
end,
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
|
||||
@@ -23,7 +23,7 @@ return{
|
||||
mText(drawableText.atk,69,380)
|
||||
end,
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
|
||||
@@ -22,7 +22,7 @@ return{
|
||||
mText(drawableText.atk,69,380)
|
||||
end,
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
|
||||
@@ -23,7 +23,7 @@ return{
|
||||
mText(drawableText.atk,69,380)
|
||||
end,
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
local format=string.format
|
||||
return{
|
||||
color=COLOR.lGray,
|
||||
color=COLOR.lH,
|
||||
env={
|
||||
drop=1e99,lock=1e99,
|
||||
holdCount=0,
|
||||
|
||||
@@ -20,7 +20,7 @@ return{
|
||||
mStr(P.stat.clears[4],69,340)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -26,7 +26,7 @@ return{
|
||||
gc.draw(IMG.electric,124,106,0,2.6)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
gc.draw(IMG.electric,124,106,0,2.6)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -23,7 +23,7 @@ return{
|
||||
gc.draw(IMG.electric,124,106,0,2.6)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -26,7 +26,7 @@ return{
|
||||
gc.draw(IMG.electric,124,106,0,2.6)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1)
|
||||
if SETTING.sfx_spawn==0 then
|
||||
LOG.print(text.switchSpawnSFX,COLOR.yellow)
|
||||
LOG.print(text.switchSpawnSFX,COLOR.Y)
|
||||
end
|
||||
end,
|
||||
mesDisp=function(P)
|
||||
@@ -55,7 +55,7 @@ return{
|
||||
mStr(P.stat.clears[4],69,340)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,40),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -61,7 +61,7 @@ return{
|
||||
mText(drawableText.maxcmb,69,450)
|
||||
end,
|
||||
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.modeData.maxCombo
|
||||
|
||||
@@ -59,7 +59,7 @@ return{
|
||||
mText(drawableText.maxcmb,69,450)
|
||||
end,
|
||||
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -54,7 +54,7 @@ return{
|
||||
mText(drawableText.rpm,69,380)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -54,7 +54,7 @@ return{
|
||||
mText(drawableText.rpm,69,380)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
mStr(100-P.stat.dig,69,265)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<100 then return end
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
mStr(10-P.stat.dig,69,265)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<10 then return end
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
mStr(400-P.stat.dig,69,265)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<400 then return end
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
mStr(40-P.stat.dig,69,265)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<40 then return end
|
||||
|
||||
@@ -91,7 +91,7 @@ return{
|
||||
mStr(R>=0 and R or 0,69,265)
|
||||
end,
|
||||
score=function(P)return{math.min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -21,7 +21,7 @@ return{
|
||||
mStr(R>=0 and R or 0,69,265)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -36,7 +36,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -66,7 +66,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{P.modeData.pt,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
|
||||
comp=function(a,b)
|
||||
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
|
||||
end,
|
||||
|
||||
@@ -68,7 +68,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{P.modeData.pt,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
|
||||
comp=function(a,b)
|
||||
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
|
||||
end,
|
||||
|
||||
@@ -40,7 +40,7 @@ local function score(P)
|
||||
end
|
||||
|
||||
return{
|
||||
color=COLOR.lGray,
|
||||
color=COLOR.lH,
|
||||
env={
|
||||
noTele=true,
|
||||
das=5,arr=1,
|
||||
@@ -66,7 +66,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{P.modeData.pt,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local S=P.modeData.pt
|
||||
|
||||
@@ -155,7 +155,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{P.result=="WIN"and 260 or P.modeData.pt,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local p=P.modeData.pt
|
||||
|
||||
@@ -6,7 +6,7 @@ return{
|
||||
pushSpeed=5,
|
||||
garbageSpeed=2,
|
||||
noMod=true,
|
||||
bgm={"race","push","secret8th","secret7th","waterfall","oxygen","shining terminal","storm","rockblock","magicblock","cruelty"},
|
||||
bgm={"race","battle","push","secret8th","secret7th","waterfall","oxygen","shining terminal","storm","rockblock","magicblock","cruelty"},
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1)
|
||||
|
||||
@@ -22,7 +22,7 @@ return{
|
||||
mText(drawableText.pc,69,432)
|
||||
end,
|
||||
score=function(P)return{P.stat.pc,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.pc
|
||||
|
||||
@@ -22,7 +22,7 @@ return{
|
||||
mText(drawableText.pc,69,432)
|
||||
end,
|
||||
score=function(P)return{P.stat.pc,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.pc
|
||||
|
||||
@@ -20,7 +20,7 @@ return{
|
||||
mText(drawableText.pc,69,432)
|
||||
end,
|
||||
score=function(P)return{P.stat.pc,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.pc
|
||||
|
||||
@@ -68,7 +68,7 @@ return{
|
||||
mText(drawableText.pc,69,412)
|
||||
end,
|
||||
score=function(P)return{P.stat.pc,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.pc
|
||||
|
||||
@@ -59,7 +59,7 @@ return{
|
||||
mText(drawableText.pc,69,412)
|
||||
end,
|
||||
score=function(P)return{P.stat.pc,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.pc
|
||||
|
||||
@@ -66,7 +66,7 @@ return{
|
||||
gc.circle("line",69,200,30+45*beat)
|
||||
end,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -66,7 +66,7 @@ return{
|
||||
gc.circle("line",69,200,30+45*beat)
|
||||
end,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -72,7 +72,7 @@ return{
|
||||
gc.circle("line",69,200,30+45*beat)
|
||||
end,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -25,7 +25,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("CC",7,1,true,10000))
|
||||
end,
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -25,7 +25,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("CC",7,2,true,16000))
|
||||
end,
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -25,7 +25,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("CC",7,3,true,26000))
|
||||
end,
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -25,7 +25,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("CC",7,1,true,13000))
|
||||
end,
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -25,7 +25,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("CC",7,3,true,40000))
|
||||
end,
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -12,7 +12,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("9S",4))
|
||||
end,
|
||||
score=function(P)return{P.stat.time}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1])end,
|
||||
scoreDisp=function(D)return STRING.time(D[1])end,
|
||||
comp=function(a,b)return a[1]<b[1]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -12,7 +12,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("9S",6))
|
||||
end,
|
||||
score=function(P)return{P.stat.time}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1])end,
|
||||
scoreDisp=function(D)return STRING.time(D[1])end,
|
||||
comp=function(a,b)return a[1]<b[1]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
life=2,
|
||||
drop=60,lock=60,
|
||||
freshLimit=15,
|
||||
bg="bg2",bgm="race",
|
||||
bg="bg2",bgm="battle",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
@@ -12,7 +12,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("CC",6,2,true,30000))
|
||||
end,
|
||||
score=function(P)return{P.stat.time}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1])end,
|
||||
scoreDisp=function(D)return STRING.time(D[1])end,
|
||||
comp=function(a,b)return a[1]<b[1]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -12,7 +12,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("9S",5))
|
||||
end,
|
||||
score=function(P)return{P.stat.time}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1])end,
|
||||
scoreDisp=function(D)return STRING.time(D[1])end,
|
||||
comp=function(a,b)return a[1]<b[1]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
life=2,
|
||||
drop=60,lock=60,
|
||||
freshLimit=15,
|
||||
bg="bg2",bgm="race",
|
||||
bg="bg2",bgm="battle",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
@@ -12,7 +12,7 @@ return{
|
||||
PLY.newAIPlayer(2,AIBUILDER("CC",7,3,true,50000))
|
||||
end,
|
||||
score=function(P)return{P.stat.time}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1])end,
|
||||
scoreDisp=function(D)return STRING.time(D[1])end,
|
||||
comp=function(a,b)return a[1]<b[1]end,
|
||||
getRank=function(P)
|
||||
if P.result=="WIN"then
|
||||
|
||||
@@ -18,7 +18,7 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or(a[1]==b[1]and a[2]<b[2])end,
|
||||
getRank=function(P)
|
||||
if P.stat.row<40 then return end
|
||||
|
||||
@@ -17,7 +17,7 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or(a[1]==b[1]and a[2]<b[2])end,
|
||||
getRank=function(P)
|
||||
if P.stat.row<40 then return end
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
color=COLOR.lGray,
|
||||
color=COLOR.lH,
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
dropPiece=function(P)if P.stat.row>=1000 then P:win("finish")end end, bg="rainbow",bgm="push",
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.row<1000 then return end
|
||||
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.row<100 then return end
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.row<10 then return end
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.row<20 then return end
|
||||
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.row<400 then return end
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.row<40 then return end
|
||||
|
||||
@@ -32,7 +32,7 @@ return{
|
||||
mText(drawableText.wave,69,375)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -38,7 +38,7 @@ return{
|
||||
mText(drawableText.wave,69,375)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
mText(drawableText.wave,69,375)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -37,7 +37,7 @@ return{
|
||||
mText(drawableText.wave,69,375)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -39,7 +39,7 @@ return{
|
||||
mText(drawableText.wave,69,375)
|
||||
end,
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
|
||||
@@ -22,7 +22,7 @@ return{
|
||||
mText(drawableText.eff,69,363)
|
||||
end,
|
||||
score=function(P)return{P.stat.atk<=200 and math.floor(P.stat.atk)or 200,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
|
||||
@@ -34,7 +34,7 @@ return{
|
||||
mText(drawableText.eff,69,363)
|
||||
end,
|
||||
score=function(P)return{P.stat.atk<=200 and math.floor(P.stat.atk)or 200,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
|
||||
@@ -20,7 +20,7 @@ return{
|
||||
mText(drawableText.eff,69,363)
|
||||
end,
|
||||
score=function(P)return{P.stat.atk<=200 and math.floor(P.stat.atk)or 200,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..TIMESTR(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user