diff --git a/LANG/lang_en.lua b/LANG/lang_en.lua index f20ea084..7082464d 100644 --- a/LANG/lang_en.lua +++ b/LANG/lang_en.lua @@ -359,6 +359,11 @@ return{ copy="Copy", paste="Paste", clear="Clear", + + newPage="New Page(N)", + delPage="Del Page(M)", + prevPage="Prev Page", + nextPage="Next Page", pushLine="Add Line(K)", delLine="Del Line(L)", demo="Don't Show ×", diff --git a/LANG/lang_fr.lua b/LANG/lang_fr.lua index 82536c93..cb5fc684 100644 --- a/LANG/lang_fr.lua +++ b/LANG/lang_fr.lua @@ -363,6 +363,11 @@ return{ copy="Copier", paste="Coller", clear="Nettoyer", + + -- newPage="New Page(N)", + -- delPage="Del Page(M)", + -- prevPage="Prev Page", + -- nextPage="Next Page", pushLine="Ajouter ligne (K)", delLine="Supprimer ligne (L)", demo="Masquer les ×", diff --git a/LANG/lang_sp.lua b/LANG/lang_sp.lua index 1f94e3aa..0a943cc0 100644 --- a/LANG/lang_sp.lua +++ b/LANG/lang_sp.lua @@ -362,6 +362,11 @@ return{ copy="Copiar", paste="Pegar", clear="Limpiar", + + -- newPage="New Page(N)", + -- delPage="Del Page(M)", + -- prevPage="Prev Page", + -- nextPage="Next Page", pushLine="Añadir Línea (K)", delLine="Borrar Línea (L)", demo="No Mostrar X", diff --git a/LANG/lang_symbol.lua b/LANG/lang_symbol.lua index 6b703394..7d786123 100644 --- a/LANG/lang_symbol.lua +++ b/LANG/lang_symbol.lua @@ -313,6 +313,11 @@ return{ copy="→__", paste="__→", clear="XXX", + + newPage="+[_](N)", + delPage="x[_](M)", + prevPage="←[_]", + nextPage="[_]→", pushLine="↑↑↑↑↑(K)", delLine="==X==(L)", demo="X ×", diff --git a/LANG/lang_zh.lua b/LANG/lang_zh.lua index a5c88940..47db52cc 100644 --- a/LANG/lang_zh.lua +++ b/LANG/lang_zh.lua @@ -361,6 +361,11 @@ return{ copy="复制", paste="粘贴", clear="清除", + + newPage="新页面(N)", + delPage="删除页面(M)", + prevPage="上一页面", + nextPage="下一页面", pushLine="增加一行(K)", delLine="消除行(L)", demo="不显示×", diff --git a/Zframework/toolfunc.lua b/Zframework/toolfunc.lua index 4d9962ae..8def14e4 100644 --- a/Zframework/toolfunc.lua +++ b/Zframework/toolfunc.lua @@ -534,7 +534,11 @@ end function copyList(org) local L={} for i=1,#org do - L[i]=org[i] + if type(org[i])~="table"then + L[i]=org[i] + else + L[i]=copyList(org[i]) + end end return L end diff --git a/Zframework/widgetList.lua b/Zframework/widgetList.lua index aa43f25b..1671c8d1 100644 --- a/Zframework/widgetList.lua +++ b/Zframework/widgetList.lua @@ -522,13 +522,18 @@ local Widgets={ newButton({name="b23", x=1060, y=290,w=75,color="dRed", code=setPen(23)}),--GB4 newButton({name="b24", x=1140, y=290,w=75,color="dGreen", code=setPen(24)}),--GB5 - newButton({name="any", x=600, y=400, w=120, color="lGrey", font=40,code=setPen(0)}), - newButton({name="space", x=730, y=400, w=120, color="grey", font=65,code=setPen(-1)}), - newButton({name="copy", x=905, y=400, w=120, color="lRed", font=35,code=pressKey("cC")}), - newButton({name="paste", x=1035, y=400, w=120, color="lBlue", font=35,code=pressKey("cV")}), - newButton({name="clear", x=1165, y=400, w=120, color="white", font=40,code=pressKey("delete")}), - newButton({name="pushLine", x=1035, y=530, w=120, color="lYellow",font=20,code=pressKey("k")}), - newButton({name="delLine", x=1165, y=530, w=120, color="lYellow",font=20,code=pressKey("l")}), + newButton({name="any", x=600, y=400,w=120,color="lGrey", font=40,code=setPen(0)}), + newButton({name="space", x=730, y=400,w=120,color="grey", font=65,code=setPen(-1)}), + newButton({name="copy", x=905, y=400,w=120,color="lRed", font=35,code=pressKey("cC")}), + newButton({name="paste", x=1035, y=400,w=120,color="lBlue", font=35,code=pressKey("cV")}), + newButton({name="clear", x=1165, y=400,w=120,color="white", font=40,code=pressKey("delete")}), + + newButton({name="newPage", x=680, y=530,w=90,h=90,color="sky",font=15,code=pressKey("n")}), + newButton({name="delPage", x=780, y=530,w=90,h=90,color="lRed",font=15,code=pressKey("m")}), + newButton({name="prevPage", x=880, y=530,w=90,h=90,color="lGreen",font=15,code=pressKey("sTab"),hide=STPeq("page",1)}), + newButton({name="nextPage", x=980, y=530,w=90,h=90,color="lGreen",font=15,code=pressKey("tab"),hide=function()return sceneTemp.page==#FIELD end}), + newButton({name="pushLine", x=1080, y=530,w=90,h=90,color="lYellow",font=20,code=pressKey("k")}), + newButton({name="delLine", x=1180, y=530,w=90,h=90,color="lYellow",font=20,code=pressKey("l")}), newSwitch({name="demo", x=755, y=640, disp=STPval("demo"),code=STPrev("demo")}), newButton({name="back", x=1140, y=640, w=170,h=80,font=40,code=BACK}), diff --git a/main.lua b/main.lua index 4f38932b..1820a4ce 100644 --- a/main.lua +++ b/main.lua @@ -75,7 +75,7 @@ customEnv={ bg="none", bgm="race" } -FIELD={h=20}for i=1,20 do FIELD[i]={0,0,0,0,0,0,0,0,0,0}end--Field for custom game +FIELD={}--Field(s) for custom game BAG={}--Sequence for custom game MISSION={}--Clearing mission for custom game @@ -108,14 +108,17 @@ CURMODE=nil--Current mode object --Load modules require("Zframework")--Load Zframework + +require("parts/list") +require("parts/default_data") +require("parts/gametoolfunc") + +FIELD[1]=newBoard()--Initialize field[1] + blocks= require("parts/mino") AITemplate= require("parts/AITemplate") freeRow= require("parts/freeRow") -require("parts/list") -require("parts/gametoolfunc") -require("parts/default_data") - TEXTURE=require("parts/texture") SKIN= require("parts/skin") PLY= require("parts/player") diff --git a/modes/custom_clear.lua b/modes/custom_clear.lua index abfee28b..3d43749f 100644 --- a/modes/custom_clear.lua +++ b/modes/custom_clear.lua @@ -1,9 +1,53 @@ local int=math.floor + +local function notAir(L) + for i=1,10 do + if L[i]>0 then return true end + end +end +local function setField(P,page) + local F=FIELD[page] + local height=0 + for y=20,1,-1 do + if notAir(F[y])then + height=y + break + end + end + local t=P.showTime*3 + for y=1,height do + local solid=notAir(F[y]) + P.field[y]=freeRow.get(0,solid) + P.visTime[y]=freeRow.get(t) + if solid then + for x=1,10 do + P.field[y][x]=F[y][x] + end + P.garbageBeneath=P.garbageBeneath+1 + end + end +end +local function checkClear(P) + if P.garbageBeneath==0 then + P.modeData.point=P.modeData.point+1 + if FIELD[P.modeData.point+1]then + P.waiting=26 + for _=#P.field,1,-1 do + freeRow.discard(P.field[_]) + freeRow.discard(P.visTime[_]) + P.field[_],P.visTime[_]=nil + end + setField(P,P.modeData.point+1) + sysFX.newShade(.7,.6,.8,.6,P.x+150*P.size,P.y+60*P.size,300*P.size,610*P.size) + SFX.play("blip_1") + else + P:win("finish") + end + end +end return{ color=color.white, - env={ - dropPiece=PLY.check_lineReach, - }, + env={}, load=function() for k,v in next,customEnv do modeEnv[k]=v @@ -18,6 +62,19 @@ return{ else modeEnv.mission=nil end + local clearmode + if FIELD[1]then + for y=1,20 do + if notAir(FIELD[1][y])then + clearmode=true + end + end + end + if clearmode then + modeEnv.dropPiece=checkClear + else + modeEnv.dropPiece=PLY.check_lineReach + end PLY.newPlayer(1,340,15) local L=modeEnv.opponent if L~=0 then @@ -28,24 +85,8 @@ return{ PLY.newAIPlayer(2,965,360,.5,AITemplate("CC",2*L-11,int(L*.5-1.5),modeEnv.hold,4000*L)) end end - FIELD.h=20 - repeat - for i=1,10 do - if FIELD[FIELD.h][i]>0 then - goto L - end - end - FIELD.h=FIELD.h-1 - until FIELD.h==0 - ::L:: for _,P in next,PLAYERS.alive do - local t=P.showTime*3 - for y=1,FIELD.h do - P.field[y]=freeRow.get(0,true) - P.visTime[y]=freeRow.get(t) - for x=1,10 do P.field[y][x]=FIELD[y][x]end - end - P.garbageBeneath=FIELD.h + setField(P,1) end modeEnv.bg=customEnv.bg modeEnv.bgm=customEnv.bgm diff --git a/modes/custom_puzzle.lua b/modes/custom_puzzle.lua index 7365bcce..3b696824 100644 --- a/modes/custom_puzzle.lua +++ b/modes/custom_puzzle.lua @@ -1,10 +1,11 @@ local gc=love.graphics local int=math.floor local function puzzleCheck(P) + local F=FIELD[P.modeData.point+1] for y=1,20 do local L=P.field[y] for x=1,10 do - local a,b=FIELD[y][x],L and L[x]or 0 + local a,b=F[y][x],L and L[x]or 0 if a~=0 then if a==-1 then if b>0 then return end elseif a<12 then if a~=b then return end @@ -13,8 +14,21 @@ local function puzzleCheck(P) end end end - P.modeData.event=1 - P:win("finish") + P.modeData.point=P.modeData.point+1 + if FIELD[P.modeData.point+1]then + P.waiting=26 + for _=#P.field,1,-1 do + freeRow.discard(P.field[_]) + freeRow.discard(P.visTime[_]) + P.field[_],P.visTime[_]=nil + end + sysFX.newShade(.7,.3,1,.3,P.x+150*P.size,P.y+60*P.size,300*P.size,610*P.size) + SFX.play("reach") + P.modeData.event=0 + else + P.modeData.event=1 + P:win("finish") + end end return{ @@ -47,16 +61,6 @@ return{ PLY.newAIPlayer(2,965,360,.5,AITemplate("CC",2*L-11,int(L*.5-1.5),modeEnv.hold,4000*L)) end end - FIELD.h=20 - repeat - for i=1,10 do - if FIELD[FIELD.h][i]~=0 then - goto L - end - end - FIELD.h=FIELD.h-1 - until FIELD.h==0 - ::L:: modeEnv.bg=customEnv.bg modeEnv.bgm=customEnv.bgm end, @@ -67,8 +71,9 @@ return{ mText(drawableText.line,69,360) if P.modeData.event==0 then local m=puzzleMark - for y=1,FIELD.h do for x=1,10 do - local T=FIELD[y][x] + local F=FIELD[P.modeData.point+1] + for y=1,20 do for x=1,10 do + local T=F[y][x] if T~=0 then gc.draw(m[T],150+30*x-30+dx,70+600-30*y+dy) end diff --git a/parts/gametoolfunc.lua b/parts/gametoolfunc.lua index 073814ac..e2091a25 100644 --- a/parts/gametoolfunc.lua +++ b/parts/gametoolfunc.lua @@ -140,13 +140,23 @@ function pasteSequence(str) return true end -function copyBoard() +function newBoard(f) + if f then + return copyList(f) + else + local F={} + for i=1,20 do F[i]={0,0,0,0,0,0,0,0,0,0}end + return F + end +end +function copyBoard(page) + local F=FIELD[page or 1] local str="" local H=0 for y=20,1,-1 do for x=1,10 do - if FIELD[y][x]~=0 then + if F[y][x]~=0 then H=y goto topFound end @@ -157,7 +167,7 @@ function copyBoard() --Encode field for y=1,H do local S="" - local L=FIELD[y] + local L=F[y] for x=1,10 do S=S..char(L[x]+1) end @@ -165,7 +175,8 @@ function copyBoard() end return data.encode("string","base64",data.compress("string","zlib",str)) end -function pasteBoard(str) +function pasteBoard(str,page) + local F=FIELD[page or 1] local _,__ --Decode @@ -192,7 +203,7 @@ function pasteBoard(str) if __>26 then return end--Illegal blockid _=int(_/32)--Mode id - FIELD[fY][fX]=__ + F[fY][fX]=__ if fX<10 then fX=fX+1 else @@ -205,7 +216,7 @@ function pasteBoard(str) for y=fY,20 do for x=1,10 do - FIELD[y][x]=0 + F[y][x]=0 end end diff --git a/parts/scenes/customGame.lua b/parts/scenes/customGame.lua index a987cca6..beb50b68 100644 --- a/parts/scenes/customGame.lua +++ b/parts/scenes/customGame.lua @@ -82,18 +82,18 @@ function keyDown.customGame(key) end end -local FIELD=FIELD function Pnt.customGame() - --Field + --Field content gc.push("transform") gc.translate(95,290) gc.scale(.5) gc.setColor(1,1,1) gc.setLineWidth(3) gc.rectangle("line",-2,-2,304,604) + local F=FIELD[1] local cross=puzzleMark[-1] for y=1,20 do for x=1,10 do - local B=FIELD[y][x] + local B=F[y][x] if B>0 then gc.draw(blockSkin[B],30*x-30,600-30*y) elseif B==-1 then @@ -102,15 +102,22 @@ function Pnt.customGame() end end gc.pop() - --Sequence - setFont(30) - gc.print(customEnv.sequence,330,510) + --Field setFont(40) + if #FIELD>1 then + gc.setColor(1,1,int(Timer()*6.26)%2) + gc.print("+",275,300) + gc.print(#FIELD-1,300,300) + end + + --Sequence if #BAG>0 then gc.setColor(1,1,int(Timer()*6.26)%2) gc.print("#",330,545) gc.print(#BAG,360,545) end + setFont(30) + gc.print(customEnv.sequence,330,510) --Sequence if #MISSION>0 then diff --git a/parts/scenes/custom_field.lua b/parts/scenes/custom_field.lua index 0634e43f..f36f570d 100644 --- a/parts/scenes/custom_field.lua +++ b/parts/scenes/custom_field.lua @@ -4,16 +4,20 @@ local ms,kb=love.mouse,love.keyboard local setFont=setFont local mStr=mStr -local int=math.floor +local max,min,int=math.max,math.min,math.floor local ins,rem=table.insert,table.remove local sub=string.sub + + +local FIELD=FIELD function sceneInit.custom_field() sceneTemp={ sure=0, pen=1, x=1,y=1, demo=false, + page=1, } end @@ -23,27 +27,27 @@ local penKey={ a=17,s=18,d=19,f=20,g=21,h=22,j=23,k=24, z=0,x=-1, } -local FIELD=FIELD function mouseDown.custom_field(x,y) mouseMove.custom_field(x,y) end function mouseMove.custom_field(x,y) + local S=sceneTemp local sx,sy=int((x-200)/30)+1,20-int((y-60)/30) if sx<1 or sx>10 then sx=nil end if sy<1 or sy>20 then sy=nil end - sceneTemp.x,sceneTemp.y=sx,sy + S.x,S.y=sx,sy if sx and sy and ms.isDown(1,2,3)then - FIELD[sy][sx]=ms.isDown(1)and sceneTemp.pen or ms.isDown(2)and -1 or 0 + FIELD[S.page][sy][sx]=ms.isDown(1)and S.pen or ms.isDown(2)and -1 or 0 end end function wheelMoved.custom_field(_,y) local pen=sceneTemp.pen if y<0 then pen=pen+1 - if pen==8 then pen=9 elseif pen==14 then pen=0 end + if pen==25 then pen=1 end else pen=pen-1 - if pen==8 then pen=7 elseif pen==-1 then pen=13 end + if pen==0 then pen=24 end end sceneTemp.pen=pen end @@ -51,16 +55,18 @@ function touchDown.custom_field(_,x,y) mouseMove.custom_field(x,y) end function touchMove.custom_field(_,x,y) + local S=sceneTemp local sx,sy=int((x-200)/30)+1,20-int((y-60)/30) if sx<1 or sx>10 then sx=nil end if sy<1 or sy>20 then sy=nil end - sceneTemp.x,sceneTemp.y=sx,sy + S.x,S.y=sx,sy if sx and sy then - FIELD[sy][sx]=sceneTemp.pen + FIELD[S.page][sy][sx]=S.pen end end function keyDown.custom_field(key) - local sx,sy,pen=sceneTemp.x,sceneTemp.y,sceneTemp.pen + local S=sceneTemp + local sx,sy,pen=S.x,S.y,S.pen if key=="up"or key=="down"or key=="left"or key=="right"then if not sx then sx=1 end if not sy then sy=1 end @@ -70,30 +76,30 @@ function keyDown.custom_field(key) elseif key=="right"and sx<10 then sx=sx+1 end if kb.isDown("space")then - FIELD[sy][sx]=pen + FIELD[S.page][sy][sx]=pen end elseif key=="delete"then - if sceneTemp.sure>20 then - for y=1,20 do for x=1,10 do FIELD[y][x]=0 end end - sceneTemp.sure=0 + if S.sure>20 then + for y=1,20 do for x=1,10 do FIELD[S.page][y][x]=0 end end + S.sure=0 SFX.play("finesseError",.7) else - sceneTemp.sure=50 + S.sure=50 end elseif key=="space"then if sx and sy then - FIELD[sy][sx]=pen + FIELD[S.page][sy][sx]=pen end elseif key=="escape"then SCN.back() elseif key=="j"then - sceneTemp.demo=not sceneTemp.demo + S.demo=not S.demo elseif key=="k"then - ins(FIELD,1,{21,21,21,21,21,21,21,21,21,21}) - FIELD[21]=nil + ins(FIELD[S.page],1,{21,21,21,21,21,21,21,21,21,21}) + FIELD[S.page][21]=nil SFX.play("blip") elseif key=="l"then - local F=FIELD + local F=FIELD[S.page] for i=20,1,-1 do for j=1,10 do if F[i][j]<=0 then goto L end @@ -107,25 +113,45 @@ function keyDown.custom_field(key) repeat F[#F+1]={0,0,0,0,0,0,0,0,0,0} until#F==20 - SFX.play("clear_4",.8) + SFX.play("clear_3",.8) SFX.play("fall",.8) end elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then - sys.setClipboardText("Techmino Field:"..copyBoard()) + sys.setClipboardText("Techmino Field:"..copyBoard(S.page)) LOG.print(text.copySuccess,color.green) elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then local str=sys.getClipboardText() local p=string.find(str,":")--ptr* if p then str=sub(str,p+1)end - if pasteBoard(str)then + if pasteBoard(str,S.page)then LOG.print(text.pasteSuccess,color.green) else LOG.print(text.dataCorrupted,color.red) end + elseif key=="tab"or key=="sTab"then + if key=="sTab"or kb.isDown("lshift","rshift")then + S.page=max(S.page-1,1) + else + S.page=min(S.page+1,#FIELD) + end + elseif key=="n"then + ins(FIELD,S.page+1,newBoard(FIELD[S.page])) + S.page=S.page+1 + SFX.play("blip_1",.8) + sysFX.newShade(.3,.5,1,.5,200,60,300,600) + elseif key=="m"then + rem(FIELD,S.page) + S.page=max(S.page-1,1) + if not FIELD[1]then + ins(FIELD,newBoard()) + end + sysFX.newShade(.3,1,.5,.5,200,60,300,600) + SFX.play("clear_4",.8) + SFX.play("fall",.8) else pen=penKey[key]or pen end - sceneTemp.x,sceneTemp.y,sceneTemp.pen=sx,sy,pen + S.x,S.y,S.pen=sx,sy,pen end function Tmr.custom_field() @@ -136,48 +162,60 @@ function Pnt.custom_field() local S=sceneTemp local sx,sy=S.x,S.y - --Field gc.translate(200,60) + + --Draw grid gc.setColor(1,1,1,.2) gc.setLineWidth(1) for x=1,9 do gc.line(30*x,0,30*x,600)end for y=0,19 do gc.line(0,30*y,300,30*y)end + + --Draw field gc.setColor(1,1,1) gc.setLineWidth(3) gc.rectangle("line",-2,-2,304,604) gc.setLineWidth(2) local cross=puzzleMark[-1] + local F=FIELD[S.page] for y=1,20 do for x=1,10 do - local B=FIELD[y][x] + local B=F[y][x] if B>0 then gc.draw(blockSkin[B],30*x-30,600-30*y) elseif B==-1 and not S.demo then gc.draw(cross,30*x-30,600-30*y) end end end + + --Draw pen if sx and sy then gc.setLineWidth(2) gc.rectangle("line",30*sx-30,600-30*sy,30,30) end gc.translate(-200,-60) - --Pen + --Draw page + setFont(55) + mStr(S.page,100,510) + mStr(#FIELD,100,600) + gc.rectangle("fill",50,590,100,6) + + --Draw pen color local pen=S.pen if pen>0 then gc.setLineWidth(13) gc.setColor(SKIN.libColor[pen]) - gc.rectangle("line",565,500,70,70) + gc.rectangle("line",545,495,70,70) elseif pen==-1 then gc.setLineWidth(5) gc.setColor(.9,.9,.9) - gc.line(575,510,625,560) - gc.line(575,560,625,510) + gc.line(555,505,605,555) + gc.line(555,555,605,505) end --Confirm reset if S.sure>0 then gc.setColor(1,1,1,S.sure*.02) - gc.draw(drawableText.question,1180,340) + gc.draw(drawableText.question,1145,330) end --Block name