diff --git a/Zframework/dumpTable.lua b/Zframework/dumpTable.lua index 9a48c432..1994d1f6 100644 --- a/Zframework/dumpTable.lua +++ b/Zframework/dumpTable.lua @@ -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 diff --git a/Zframework/file.lua b/Zframework/file.lua index a925dd76..66ca2f30 100644 --- a/Zframework/file.lua +++ b/Zframework/file.lua @@ -28,7 +28,7 @@ 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 diff --git a/Zframework/init.lua b/Zframework/init.lua index 9f3072a0..89491116 100644 --- a/Zframework/init.lua +++ b/Zframework/init.lua @@ -13,14 +13,10 @@ MDRAW=require"Zframework.mDraw" mText=MDRAW.simpX mDraw=MDRAW.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" diff --git a/Zframework/splitStr.lua b/Zframework/splitStr.lua deleted file mode 100644 index fcfbc94c..00000000 --- a/Zframework/splitStr.lua +++ /dev/null @@ -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 \ No newline at end of file diff --git a/Zframework/stringExtend.lua b/Zframework/stringExtend.lua new file mode 100644 index 00000000..e62a3899 --- /dev/null +++ b/Zframework/stringExtend.lua @@ -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 \ No newline at end of file diff --git a/Zframework/tableExtend.lua b/Zframework/tableExtend.lua index fea18fea..8cce81a6 100644 --- a/Zframework/tableExtend.lua +++ b/Zframework/tableExtend.lua @@ -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 \ No newline at end of file diff --git a/Zframework/timeStr.lua b/Zframework/timeStr.lua deleted file mode 100644 index 328ac096..00000000 --- a/Zframework/timeStr.lua +++ /dev/null @@ -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 \ No newline at end of file diff --git a/Zframework/upperChar.lua b/Zframework/upperChar.lua index 68de1dee..e69de29b 100644 --- a/Zframework/upperChar.lua +++ b/Zframework/upperChar.lua @@ -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 \ No newline at end of file diff --git a/Zframework/urlEncode.lua b/Zframework/urlEncode.lua index b6a8188f..e69de29b 100644 --- a/Zframework/urlEncode.lua +++ b/Zframework/urlEncode.lua @@ -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 \ No newline at end of file diff --git a/document/mode.txt b/document/mode.txt index fbee7782..d63f849f 100644 --- a/document/mode.txt +++ b/document/mode.txt @@ -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]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 _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 _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 @@ -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() diff --git a/parts/language/manual_en.lua b/parts/language/manual_en.lua index 3e105d43..b122f45c 100644 --- a/parts/language/manual_en.lua +++ b/parts/language/manual_en.lua @@ -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 diff --git a/parts/language/manual_zh.lua b/parts/language/manual_zh.lua index 37d0902a..a8715d26 100644 --- a/parts/language/manual_zh.lua +++ b/parts/language/manual_zh.lua @@ -1,4 +1,4 @@ -return SPLITSTR([=[ +return STRING.split([=[ 游戏方法: 系统会提供的一个个四连骨牌("方块",总共7种) 玩家需要控制(左右移动和旋转90,180,270度)这些骨牌直到下落到场地底部,锁定 diff --git a/parts/modes/attacker_h.lua b/parts/modes/attacker_h.lua index 0c8d1c69..9f07f1df 100644 --- a/parts/modes/attacker_h.lua +++ b/parts/modes/attacker_h.lua @@ -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[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]=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]=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[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or(a[1]==b[1]and a[2]b[1]or(a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]b[1]or a[1]==b[1]and a[2]10 and"R"or frameLostRate>3 and"Y"or"H"],format(" (%.2f%%)",frameLostRate)}, + {COLOR.Z,STRING.time(S.time),COLOR[frameLostRate>10 and"R"or frameLostRate>3 and"Y"or"H"],format(" (%.2f%%)",frameLostRate)}, format("%d/%d/%d",S.key,S.rotate,S.hold), format("%d %.2fPPS",S.piece,S.piece/S.time), format("%d(%d) %.2fLPM",S.row,S.dig,S.row/S.time*60), diff --git a/parts/scenes/register.lua b/parts/scenes/register.lua index 1a6f0007..bd998b92 100644 --- a/parts/scenes/register.lua +++ b/parts/scenes/register.lua @@ -7,7 +7,7 @@ local function register() local password2=WIDGET.active.password2.value if #username==0 then LOG.print(text.noUsername)return - elseif not legalEmail(email)then + elseif not STRING.simpEmailCheck(email)then LOG.print(text.wrongEmail)return elseif #password==0 or #password2==0 then LOG.print(text.noPassword)return diff --git a/parts/scenes/savedata.lua b/parts/scenes/savedata.lua index a66e91ea..7824ce91 100644 --- a/parts/scenes/savedata.lua +++ b/parts/scenes/savedata.lua @@ -6,7 +6,7 @@ local function dumpCB(T) "string","base64", love.data.compress( "string","zlib", - DUMPTABLE(T) + TABLE.dump(T) ) ) ) diff --git a/parts/scenes/stat.lua b/parts/scenes/stat.lua index 75b26a62..db64a90a 100644 --- a/parts/scenes/stat.lua +++ b/parts/scenes/stat.lua @@ -29,7 +29,7 @@ function scene.sceneInit() item={ S.run, S.game, - TIMESTR(S.time), + STRING.time(S.time), S.key.." "..S.rotate.." "..S.hold, S.piece.." "..S.row.." "..int(S.atk), S.recv.." "..S.off.." "..S.pend, diff --git a/parts/updateLog.lua b/parts/updateLog.lua index c9b8b533..9c2d60b5 100644 --- a/parts/updateLog.lua +++ b/parts/updateLog.lua @@ -1,4 +1,4 @@ -return SPLITSTR([=[ +return STRING.split([=[ 未来模式: 无尽PC挑战; 简单极简练习; 任务生存; 对称; 无摩擦; 连击练习; 拼方形 极简教程/考试; 大爆炸; 音游模式; 跑酷; 术语问答; 养成玩法; 收集向抽奖玩法