Merge branch 'main' into main

This commit is contained in:
user670
2021-04-22 15:39:42 +08:00
committed by GitHub
157 changed files with 1241 additions and 1084 deletions

10
Zframework/aDraw.lua Normal file
View 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

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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")

View File

@@ -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])

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

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

View File

@@ -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

View 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

View File

@@ -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

View File

@@ -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")

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -45,7 +45,7 @@ function VOC.init(list)
if n==1 then
if not loadVoiceFile(list[i],list[i])then
LOG.print("No VOICE file: "..list[i],5,COLOR.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

View File

@@ -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

View File

@@ -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空掉成绩都不记录

View File

@@ -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

Binary file not shown.

View File

@@ -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")

View File

@@ -4,94 +4,94 @@ local function disableKey(P,key)
end
MODOPT={--Mod options
{no=0,id="NX",name="next",
key="q",x=80,y=230,color="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{}

View File

@@ -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",

View File

@@ -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-极限开局就是高速20G500和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~10arr=1~2\n对自己能力比较自信或者是已经有一定水平想提速推荐用das=4~6arr=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~10arr=1~2\n对自己能力比较自信或者是已经有一定水平想提速推荐用das=4~6arr=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",

View File

@@ -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!"},
}
}

View File

@@ -196,7 +196,6 @@ return{
-- music="Music & SE",
-- about="About",
dict="Zictionary",
lang="言/A",
manual="Manuel",
quit="Quitter",
},

View File

@@ -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!"},
}
}

View File

@@ -197,7 +197,6 @@ return{
music="Música y SFX",
about="Acerca del Juego",
dict="Zictionary",
lang="言/A",
manual="Manual",
quit="Salir",
},

View File

@@ -101,7 +101,6 @@ return{
music="~~~ & =><=",
about="?",
dict="z",
lang="言/A",
manual="???",
quit="X",
},

View File

@@ -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酱 可爱!",
}
}

View File

@@ -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

View File

@@ -1,4 +1,4 @@
return SPLITSTR([=[
return STRING.split([=[
游戏方法:
系统会提供的一个个四连骨牌("方块",总共7种)
玩家需要控制(左右移动和旋转90,180,270度)这些骨牌直到下落到场地底部,锁定

View File

@@ -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,
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,6 +1,6 @@
local format=string.format
return{
color=COLOR.lGray,
color=COLOR.lH,
env={
drop=1e99,lock=1e99,
holdCount=0,

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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