diff --git a/ai.lua b/ai.lua index 10f57268..6a2b32e4 100644 --- a/ai.lua +++ b/ai.lua @@ -60,7 +60,7 @@ function resetField(f0,f,start) goto L end for i=start,#f0 do - f[i]=getNewRow() + f[i]=getNewRow(0) for j=1,10 do f[i][j]=f0[i][j] end @@ -69,7 +69,7 @@ end function getScore(field,bn,cb,cx,cy) local score=0 local highest=0 - local height=getNewRow() + local height=getNewRow(0) local clear=0 local hole=0 @@ -124,7 +124,7 @@ function AI_getControls(ctrl) local Tfield={}--test field local field_org=P.field for i=1,#field_org do - Tfield[i]=getNewRow() + Tfield[i]=getNewRow(0) for j=1,10 do Tfield[i][j]=field_org[i][j] end @@ -142,7 +142,7 @@ function AI_getControls(ctrl) end--move to bottom for i=1,#cb do local y=cy+i-1 - if not Tfield[y]then Tfield[y]=getNewRow()end + if not Tfield[y]then Tfield[y]=getNewRow(0)end for j=1,#cb[1]do if cb[i][j]then Tfield[y][cx+j-1]=1 diff --git a/call&sys.lua b/call&sys.lua index da564170..1ebad661 100644 --- a/call&sys.lua +++ b/call&sys.lua @@ -1,16 +1,15 @@ -local gc=love.graphics -local tm=love.timer -local ms=love.mouse -local tc=love.touch +local gc,tm=love.graphics,love.timer +local ms,kb,tc=love.mouse,love.keyboard,love.touch local wd=love.window local setFont=setFont local Timer=tm.getTime -local ww,wh=gc.getWidth(),gc.getHeight() +local scr=scr local xOy=love.math.newTransform() local focus=true local mx,my,mouseShow=-20,-20,false local touching=nil--1st touching ID + local sceneInit={ load=function() curBG="none" @@ -41,6 +40,14 @@ local sceneInit={ curBG="matrix" keeprun=true end, + draw=function() + kb.setKeyRepeat(true) + clearSureTime=0 + pen=1 + sx,sy=1,1 + curBG="none" + keeprun=true + end, play=function() keeprun=false resetGameData() @@ -78,6 +85,7 @@ local sceneInit={ love.event.quit() end, } + BGblockList={}for i=1,16 do BGblockList[i]={v=0}end local BGblock={tm=150,next=7,ct=0} local function getNewBlock() @@ -92,10 +100,9 @@ local function getNewBlock() BGblock.next=BGblock.next%7+1 return t end -local scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{0.5,2.5}} +local scs={{1,2},nil,nil,nil,nil,{1.5,1.5},{0.5,2.5}}for i=2,5 do scs[i]=scs[1]end function onVirtualkey(x,y) - local x,y=xOy:inverseTransformPoint(x,y) local d2,nearest,distance for K=1,#virtualkey do local b=virtualkey[K] @@ -150,11 +157,122 @@ function mouseDown.intro(x,y,k) gotoScene("main") end end +function mouseDown.draw(x,y,k) + mouseMove.draw(x,y) + return sx and sy +end +function mouseDown.setting3(x,y,k) + if k==2 then back()end + x,y=xOy:inverseTransformPoint(x,y) + for K=1,#virtualkey do + local b=virtualkey[K] + if (x-b[1])^2+(y-b[2])^210 then sx=nil end + if sy<1 or sy>20 then sy=nil end + if sx and sy and ms.isDown(1,2)then + preField[sy][sx]=ms.isDown(1)and pen or 0 + end +end +function mouseMove.setting3(x,y,dx,dy) + x,y=xOy:inverseTransformPoint(x,y) + dx,dy=dx*scr.k,dy*scr.k + if sel and ms.isDown(1)then + local b=virtualkey[sel] + b[1],b[2]=b[1]+dx,b[2]+dy + end +end +mouseUp={} +function mouseUp.setting3(x,y,k) + if sel then + local b=virtualkey[sel] + local k=snapLevelValue[snapLevel] + b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k + end +end wheelmoved={} +function wheelmoved.draw(x,y) + if y<0 then + pen=pen+1 + if pen==8 then pen=9 elseif pen==14 then pen=0 end + else + pen=pen-1 + if pen==8 then pen=7 elseif pen==-1 then pen=13 end + end +end function wheelmoved.mode(x,y) modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID) levelSel=ceil(#modeLevel[modeID[modeSel]]*.5) end +touchDown={} +function touchDown.intro(id,x,y) + gotoScene("main") +end +function touchDown.draw(id,x,y) +end +function touchDown.setting3(id,x,y) + for K=1,#virtualkey do + local b=virtualkey[K] + if (x-b[1])^2+(y-b[2])^21 then sy=sy-1 + elseif key=="left"and sx>1 then sx=sx-1 + elseif key=="right"and sx<10 then sx=sx+1 + end + if kb.isDown("space")then + preField[sy][sx]=pen + end + elseif key=="space"then + if sx and sy then + preField[sy][sx]=pen + end + elseif key=="backspace"then + pen=0 + elseif key=="escape"then + back() + else + pen=find("123qwea#sdzxc",key)or pen + end +end function keyDown.setting2(key) if key=="escape"then if keyboardSetting then @@ -237,7 +383,7 @@ function keyDown.setting2(key) end end function keyDown.play(key) - if key=="escape"then back()return end + if key=="escape"then back()end local m=setting.keyMap for p=1,human do local lib=setting.keyLib[p] @@ -346,12 +492,34 @@ function gamepadUp.play(key) end - +function love.mousepressed(x,y,k,t,num) + if t then return end + mouseShow=true + mx,my=xOy:inverseTransformPoint(x,y) + if mouseDown[scene]then + mouseDown[scene](mx,my,k) + elseif k==2 then + back() + end + if k==1 then + if not sceneSwaping and Buttons.sel then + local B=Buttons.sel + B.code() + B.alpha=1 + Buttons.sel=nil + love.mousemoved(x,y,0,0) + sysSFX("button") + end + end +end function love.mousemoved(x,y,dx,dy,t) if t then return end mouseShow=true mx,my=xOy:inverseTransformPoint(x,y) Buttons.sel=nil + if mouseMove[scene]then + mouseMove[scene](mx,my,dx,dy) + end for N,B in next,Buttons[scene]do if not(B.hide and B.hide())then if abs(mx-B.x)=h then scr.w,scr.h=w,h + else scr.w,scr.h=h,w + end + scr.r=h/w + if h/w>=.5625 then + scr.k=w/1280 + scr.x,scr.y=0,(h-w*9/16)*.5 + else + scr.k=h/720 + scr.x,scr.y=(w-h*16/9)*.5,0 + end + xOy=xOy:setTransformation(w*.5,h*.5,nil,scr.k,nil,640,360) + gc.replaceTransform(xOy) + collectgarbage() +end function love.update(dt) --[[ if players then @@ -575,6 +708,7 @@ function love.update(dt) updateButton() end function love.draw() + gc.discard() Pnt.BG[curBG]() gc.setColor(1,1,1,.22) for n=1,#BGblock do @@ -600,31 +734,24 @@ function love.draw() end if sceneSwaping then sceneSwaping.draw()end - if wh/ww>.5625 then - gc.setColor(0,0,0) - gc.rectangle("fill",0,0,1280,ww*9/16-wh) - gc.rectangle("fill",0,720,1280,wh-ww*9/16) - elseif wh/ww<.5625 then - gc.setColor(0,0,0) - gc.rectangle("fill",0,0,wh*16/9-ww,720) - gc.rectangle("fill",1280,0,ww-wh*16/9,720) - end + if scr.r==.5625 then goto L end + if scr.r>.5625 then + gc.setColor(0,0,0) + gc.rectangle("fill",0,0,1280,scr.w*9/16-scr.h) + gc.rectangle("fill",0,720,1280,scr.h-scr.w*9/16) + else + gc.setColor(0,0,0) + gc.rectangle("fill",0,0,scr.h*16/9-scr.w,720) + gc.rectangle("fill",1280,0,scr.w-scr.h*16/9,720) + end + ::L:: setFont(20)gc.setColor(1,1,1) gc.print(tm.getFPS(),5,700) if devMode then gc.print(gcinfo(),5,680) - gc.print(freeRow and #freeRow or 0,5,660) + gc.print(#freeRow or 0,5,660) end end -function love.resize(w,h) - if w>=h then ww,wh=w,h - else ww,wh=h,w - end - screenK=h/w>=.5625 and w/1280 or h/720 - xOy=xOy:setTransformation(w*.5,h*.5,nil,screenK,nil,640,360) - gc.replaceTransform(xOy) - collectgarbage() -end function love.run() local frameT=Timer() local readyDrawFrame=0 diff --git a/conf.lua b/conf.lua index f3345fb2..12295224 100644 --- a/conf.lua +++ b/conf.lua @@ -9,7 +9,7 @@ function love.conf(t) t.audio.mixwithsystem=true--Switch on to keep sysBGM local W=t.window - W.title="Techmino V0.7.13+" + W.title="Techmino V0.7.14" W.icon="/image/icon.png" W.width,W.height=1280,720 W.minwidth,W.minheight=640,360 diff --git a/dataList.lua b/dataList.lua index 0139296a..f9e3f924 100644 --- a/dataList.lua +++ b/dataList.lua @@ -149,13 +149,28 @@ loadmode={ modeEnv[k]=customRange[k][customSel[k]] end modeEnv._20G=modeEnv.drop==-1 + createPlayer(1,340,15) if modeEnv.opponent==0 then - createPlayer(1,340,15) else modeEnv.target=nil - createPlayer(1,340,15) createPlayer(2,965,360,.5,modeEnv.opponent) end + local h=20 + ::R:: + for i=1,10 do + if preField[h][i]>0 then modeEnv.Fkey=true goto L end + end + h=h-1 + if h>0 then goto R end + ::L:: + for _,P in next,players.alive do + local t=P.showTime*3 + for y=1,h do + P.field[y]=getNewRow(0) + P.visTime[y]=getNewRow(t) + for x=1,10 do P.field[y][x]=preField[y][x]end + end + end end, } mesDisp={ @@ -527,7 +542,7 @@ Event_task={ end end if P.endCounter==100 then - for i=1,#P.field do + while P.field[1]do removeRow(P.field) removeRow(P.visTime) end @@ -550,7 +565,7 @@ Event_task={ end end if P.endCounter==100 then - for i=1,#P.field do + while P.field[1]do removeRow(P.field) removeRow(P.visTime) end @@ -666,7 +681,7 @@ Event_task={ if P.counter==21 then local t=P.cstat.pc%2 for i=1,4 do - local r=getNewRow() + local r=getNewRow(0) for j=1,10 do r[j]=PCbase[4*t+i][j] end @@ -1092,6 +1107,7 @@ defaultModeEnv={ { fall=20, royaleMode=true, + Fkey=true, royalePowerup={2,5,10,20}, royaleRemain={30,20,15,10,5}, pushSpeed=2, @@ -1104,6 +1120,7 @@ defaultModeEnv={ { fall=20, royaleMode=true, + Fkey=true, royalePowerup={2,6,14,30}, royaleRemain={75,50,35,20,10}, pushSpeed=2, diff --git a/font.ttf b/font.ttf index 0c259963..67acca09 100644 Binary files a/font.ttf and b/font.ttf differ diff --git a/gamefunc.lua b/gamefunc.lua index 1005cc5e..0821f8c0 100644 --- a/gamefunc.lua +++ b/gamefunc.lua @@ -163,7 +163,14 @@ function resetGameData() frame=0 garbageSpeed=1 pushSpeed=3 - + if players then + for _,P in next,players do if P.id then + while P.field[1]do + removeRow(P.field) + removeRow(P.visTime) + end + end end + end players={alive={}}human=0 modeEnv=defaultModeEnv[curMode.id][curMode.lv]or defaultModeEnv[curMode.id][1] loadmode[curMode.id]() @@ -193,12 +200,11 @@ function resetGameData() virtualkey[i].press=false end stat.game=stat.game+1 - - freeRow={} - collectgarbage() - for i=1,30*#players do - freeRow[i]={0,0,0,0,0,0,0,0,0,0} + local p=60*#players + while freeRow[p]do + rem(freeRow) end + collectgarbage() end function gameStart() sysSFX("start") @@ -224,6 +230,7 @@ function createPlayer(id,x,y,size,AIspeed,data) P.size=P.size*5 else P.centerX,P.centerY=P.x+300*P.size,P.y+670*P.size + P.absFieldPos={P.x+150*P.size,P.y+60*P.size} end if AIspeed then @@ -666,6 +673,7 @@ function spin(d,ifpre) end goto fail ::spin:: + createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY) P.curX,P.curY,P.dir=ix,iy,idir P.sc,P.cur.bk=scs[P.cur.id][idir],icb P.r,P.c=ir,ic @@ -673,7 +681,7 @@ function spin(d,ifpre) freshgho() freshLockDelay() SFX(ifpre and"prerotate"or ifoverlap(P.cur.bk,P.curX,P.curY+1)and ifoverlap(P.cur.bk,P.curX-1,P.curY)and ifoverlap(P.cur.bk,P.curX+1,P.curY)and"rotatekick"or"rotate") - if id==1 then + if P.id==1 then stat.rotate=stat.rotate+1 end ::fail:: @@ -907,7 +915,7 @@ end function lock() for i=1,P.r do local y=P.curY+i-1 - if not P.field[y]then P.field[y],P.visTime[y]=getNewRow(),getNewRow()end + if not P.field[y]then P.field[y],P.visTime[y]=getNewRow(0),getNewRow(0)end for j=1,P.c do if P.cur.bk[i][j]then P.field[y][P.curX+j-1]=P.cur.color @@ -994,7 +1002,7 @@ act={ end end, rotRight=function()spin(1)end, - rotLeft=function()spin(3)end, + rotLeft=function()spin(-1)end, rotFlip=function()spin(2)end, hardDrop=function() if P.keyPressing[9]and setting.swap then @@ -1057,7 +1065,7 @@ act={ local x0=cx ::L::if not ifoverlap(P.cur.bk,P.curX-1,P.curY)then P.curX=P.curX-1 - createShade(P.curX-1,P.curY+P.r-1,P.curX+P.c-1,P.curY) + createShade(P.curX+1,P.curY+P.r-1,P.curX+P.c-1,P.curY) freshgho() goto L end @@ -1067,7 +1075,7 @@ act={ local x0=cx ::L::if not ifoverlap(P.cur.bk,P.curX+1,P.curY)then P.curX=P.curX+1 - createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY) + createShade(P.curX-1,P.curY+P.r-1,P.curX+P.c-1,P.curY) freshgho() goto L end diff --git a/language/chi.lua b/language/chi.lua index 58a8469e..d810dcf7 100644 --- a/language/chi.lua +++ b/language/chi.lua @@ -146,6 +146,24 @@ return{ left="<", right=">", start="开始", + draw="画图(D)", + back="返回", + }, + draw={ + block1="■", + block2="■", + block3="■", + block4="■", + block5="■", + block6="■", + block7="■", + gb1="■", + gb2="■", + gb3="■", + gb4="■", + gb5="■", + erase="×", + clear="清空", back="返回", }, play={ @@ -193,4 +211,4 @@ return{ path="打开存储目录", }, }, -}--中文 \ No newline at end of file +}--中文■ \ No newline at end of file diff --git a/language/eng.lua b/language/eng.lua index 3700768a..ab7ee90f 100644 --- a/language/eng.lua +++ b/language/eng.lua @@ -109,7 +109,7 @@ return{ "Total spin:", }, help={ - "I think you don't need \"help\".", + "I don't think you need \"help\".", "THIS IS ONLY A SMALL BLOCK GAME", "But just play like playing TOP/C2/KOS/TGM3", "Game is not public now,so DO NOT DISTIRBUTE", @@ -146,8 +146,26 @@ return{ left="<", right=">", start="Start", + draw="Draw(D)", back="Back", }, + draw={ + block1="■", + block2="■", + block3="■", + block4="■", + block5="■", + block6="■", + block7="■", + gb1="■", + gb2="■", + gb3="■", + gb4="■", + gb5="■", + erase="×", + clear="clear", + back="back", + }, play={ back="Back", }, diff --git a/list.lua b/list.lua index 8b491074..00c279ae 100644 --- a/list.lua +++ b/list.lua @@ -1,6 +1,6 @@ local gc=love.graphics local sys=love.system - +local fs=love.filesystem actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","swap","restart","insLeft","insRight","insDown"} color={ red={1,0,0}, @@ -31,9 +31,24 @@ color={ orange={1,.6,0}, lightOrange={1,.7,.3}, purple={.5,0,1}, - lightPurple={.7,.3,1}, + lightPurple={.8,.4,1}, + darkPurple={.3,0,.6}, +} +blockColor={ + color.red, + color.green, + color.orange, + color.blue, + color.magenta, + color.yellow, + color.cyan, + color.darkGreen, + color.darkGrey, + color.grey, + color.darkPurple, + color.darkRed, + color.darkGreen, } - sfx={ "button", "ready","start","win","fail","collect", @@ -208,59 +223,84 @@ Buttons={ quit={x=1180,y=620,w=120,h=120,rgb=color.lightGrey,f=50,code=function()gotoScene("quit")end,up="setting",left="help"}, }, mode={ - up={x=1000,y=210,w=200,h=140,rgb=color.white,hide=function()return modeSel==1 end,f=64,code=function()keyDown.mode("up")end}, - down={x=1000,y=430,w=200,h=140,rgb=color.white,hide=function()return modeSel==#modeID end,f=80,code=function()keyDown.mode("down")end}, - left={x=190,y=160,w=100,h=80,rgb=color.white,hide=function()return levelSel==1 end,code=function()keyDown.mode("left")end}, - right={x=350,y=160,w=100,h=80,rgb=color.white,hide=function()return levelSel==#modeLevel[modeID[modeSel]] end,code=function()keyDown.mode("right")end}, - start={x=1000,y=600,w=250,h=100,rgb=color.green,f=50,code=function()loadGame(modeSel,levelSel)end}, - custom={x=270,y=540,w=190,h=85,rgb=color.yellow,code=function()gotoScene("custom")end}, - back={x=640,y=630,w=230,h=90,rgb=color.white,f=45,code=back}, + up= {x=1000, y=210,w=200,h=140,rgb=color.white, f=64, code=function()keyDown.mode("up")end, hide=function()return modeSel==1 end,}, + down= {x=1000, y=430,w=200,h=140,rgb=color.white, f=80, code=function()keyDown.mode("down")end, hide=function()return modeSel==#modeID end,}, + left= {x=190, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("left")end, hide=function()return levelSel==1 end,}, + right={x=350, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("right")end,hide=function()return levelSel==#modeLevel[modeID[modeSel]]end,}, + start={x=1000, y=600,w=250,h=100,rgb=color.green, f=50, code=function() + loadGame(modeSel,levelSel)end}, + custom={x=275, y=420,w=200,h=90, rgb=color.yellow, code=function()gotoScene("custom")end}, + back= {x=640, y=630,w=230,h=90, rgb=color.white, f=45, code=back}, }, custom={ - up={x=1000,y=200,w=100,h=100,rgb=color.white,code=function()optSel=(optSel-2)%#customID+1 end}, - down={x=1000,y=440,w=100,h=100,rgb=color.white,f=50,code=function()optSel=optSel%#customID+1 end}, - left={x=880,y=320,w=100,h=100,rgb=color.white,f=50,code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end}, - right={x=1120,y=320,w=100,h=100,rgb=color.white,f=50,code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end}, - start={x=1000,y=580,w=180,h=80,rgb=color.green,code=function()loadGame(0,1)end}, - back={x=640,y=630,w=180,h=60,rgb=color.white,code=back}, + up= {x=1000, y=220,w=100,h=100,rgb=color.white, code=function()optSel=(optSel-2)%#customID+1 end}, + down= {x=1000, y=460,w=100,h=100,rgb=color.white,f=50, code=function()optSel=optSel%#customID+1 end}, + left= {x=880, y=340,w=100,h=100,rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end}, + right={x=1120, y=340,w=100,h=100,rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end}, + start={x=1000, y=580,w=180,h=80, rgb=color.green, code=function()loadGame(0,1)end}, + draw= {x=1000, y=90, w=190,h=85, rgb=color.cyan, code=function()gotoScene("draw")end}, + back= {x=640, y=630,w=180,h=60, rgb=color.white, code=back}, + }, + draw={ + block1= {x=840, y=80,w=120,h=120, f=65, rgb=color.red, code=function()pen=1 end}, + block2= {x=980, y=80,w=120,h=120, f=65, rgb=color.green, code=function()pen=2 end}, + block3= {x=1120, y=80,w=120,h=120, f=65, rgb=color.orange, code=function()pen=3 end}, + block4= {x=840, y=220,w=120,h=120,f=65, rgb=color.blue, code=function()pen=4 end}, + block5= {x=980, y=220,w=120,h=120,f=65, rgb=color.magenta, code=function()pen=5 end}, + block6= {x=1120, y=220,w=120,h=120,f=65, rgb=color.yellow, code=function()pen=6 end}, + block7= {x=840, y=360,w=120,h=120,f=65, rgb=color.cyan, code=function()pen=7 end}, + gb1= {x=980, y=360,w=120,h=120,f=65, rgb=color.darkGrey, code=function()pen=9 end}, + gb2= {x=1120, y=360,w=120,h=120,f=65, rgb=color.grey, code=function()pen=10 end}, + gb3= {x=840, y=500,w=120,h=120,f=65, rgb=color.darkPurple, code=function()pen=11 end}, + gb4= {x=980, y=500,w=120,h=120,f=65, rgb=color.darkRed, code=function()pen=12 end}, + gb5= {x=1120, y=500,w=120,h=120,f=65, rgb=color.darkGreen, code=function()pen=13 end}, + erase= {x=840, y=640,w=120,h=120,f=70, rgb=color.grey, code=function()pen=0 end}, + clear= {x=1120, y=640,w=120,h=120, rgb=color.white, code=function() + if clearSureTime>0 then + for y=1,20 do for x=1,10 do preField[y][x]=0 end end + clearSureTime=0 + else + clearSureTime=50 + end + end}, + back= {x=1235, y=45, w=80, h=80, f=35, rgb=color.white, code=back}, }, play={ back={x=1235,y=45,w=80,h=80,rgb=color.white,code=back,f=35}, }, setting={--Normal setting - ghost= {x=290, y=90, w=210, h=60, rgb=color.white, code=function()setting.ghost=not setting.ghost end,down="grid",right="center"}, - center= {x=505, y=90, w=210, h=60, rgb=color.white, code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"}, - grid= {x=290, y=160, w=210, h=60, rgb=color.white, code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"}, - swap= {x=505, y=160, w=210, h=60,f=28, rgb=color.white, code=function()setting.swap=not setting.swap end,up="center",down="arrD",left="grid",right="vib"}, - fxs= {x=290, y=230, w=210, h=60, rgb=color.white, code=function()setting.fxs=not setting.fxs end,up="grid",down="dasU",right="fullscreen"}, + ghost= {x=290, y=90, w=210,h=60, rgb=color.white, code=function()setting.ghost=not setting.ghost end,down="grid",right="center"}, + center= {x=505, y=90, w=210,h=60, rgb=color.white, code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"}, + grid= {x=290, y=160,w=210,h=60, rgb=color.white, code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"}, + swap= {x=505, y=160,w=210,h=60,f=28, rgb=color.white, code=function()setting.swap=not setting.swap end,up="center",down="arrD",left="grid",right="vib"}, + fxs= {x=290, y=230,w=210,h=60, rgb=color.white, code=function()setting.fxs=not setting.fxs end,up="grid",down="dasU",right="fullscreen"}, + dasD= {x=210, y=300,w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das-1)%31 end,up="fxs",down="sddasD",right="dasU"}, + dasU= {x=370, y=300,w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das+1)%31 end,up="fxs",down="sddasU",left="dasD",right="arrD"}, + arrD= {x=425, y=300,w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr-1)%16 end,up="swap",down="sdarrD",left="dasU",right="arrU"}, + arrU= {x=585, y=300,w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr+1)%16 end,up="swap",down="sdarrU",left="arrD",right="bgblock"},--3~6 + sddasD= {x=210, y=370,w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="lang",right="sddasU"}, + sddasU= {x=370, y=370,w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"}, + sdarrD= {x=425, y=370,w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"}, + sdarrU= {x=585, y=370,w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"}, - dasD= {x=210, y=300, w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das-1)%31 end,up="fxs",down="sddasD",right="dasU"}, - dasU= {x=370, y=300, w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das+1)%31 end,up="fxs",down="sddasU",left="dasD",right="arrD"}, - arrD= {x=425, y=300, w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr-1)%16 end,up="swap",down="sdarrD",left="dasU",right="arrU"}, - arrU= {x=585, y=300, w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr+1)%16 end,up="swap",down="sdarrU",left="arrD",right="bgblock"},--3~6 - sddasD= {x=210, y=370, w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="lang",right="sddasU"}, - sddasU= {x=370, y=370, w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"}, - sdarrD= {x=425, y=370, w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"}, - sdarrU= {x=585, y=370, w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"}, - - sfx= {x=760, y=90, w=160, h=60, rgb=color.white, code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"}, - bgm= {x=940, y=90, w=160, h=60, rgb=color.white, code=function() + sfx= {x=760,y=90, w=160,h=60,rgb=color.white, code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"}, + bgm= {x=940,y=90, w=160,h=60,rgb=color.white, code=function() BGM() setting.bgm=not setting.bgm BGM("blank") end,down="vib",left="sfx"}, - vib= {x=850, y=160, w=340, h=60, rgb=color.white, code=function() + vib= {x=850,y=160, w=340,h=60,rgb=color.white, code=function() setting.vib=(setting.vib+1)%5 VIB(2) end,up="sfx",down="fullscreen",left="swap"}, - fullscreen= {x=850, y=230, w=340, h=60, rgb=color.white, code=function() + fullscreen= {x=850,y=230, w=340,h=60,rgb=color.white, code=function() setting.fullscreen=not setting.fullscreen love.window.setFullscreen(setting.fullscreen) if not setting.fullscreen then love.resize(gc.getWidth(),gc.getHeight()) end end,up="vib",down="bgblock",left="arrU"}, - bgblock= {x=850, y=300, w=340, h=60, rgb=color.white, code=function() + bgblock= {x=850,y=300, w=340,h=60,rgb=color.white, code=function() setting.bgblock=not setting.bgblock if not setting.bgblock then for i=1,16 do @@ -268,17 +308,17 @@ Buttons={ end end end,up="fullscreen",down="frame",left="sdarrU"}, - frame= {x=850, y=370, w=340, h=60, rgb=color.white, code=function() + frame= {x=850,y=370, w=340,h=60,rgb=color.white, code=function() setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10) if setting.frameMul>100 then setting.frameMul=25 end end,up="bgblock",down="control",left="sdarrU"}, - control= {x=850, y=440, w=340, h=60, rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"}, - touch= {x=850, y=510, w=340, h=60, rgb=color.yellow, code=function()gotoScene("setting3")end,up="control",down="back",left="lang"}, - lang= {x=280, y=510, w=200, h=60, rgb=color.red, code=function() + control= {x=850,y=440, w=340,h=60,rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"}, + touch= {x=850,y=510, w=340,h=60,rgb=color.yellow, code=function()gotoScene("setting3")end,up="control",down="back",left="lang"}, + lang= {x=280,y=510, w=200,h=60,rgb=color.red, code=function() setting.lang=setting.lang%#langName+1 swapLanguage(setting.lang) end,up="sddasD",down="back",right="touch"}, - back= {x=640, y=620, w=300, h=70, rgb=color.white, code=back,up="touch"}, + back= {x=640,y=620, w=300,h=70,rgb=color.white, code=back,up="touch"}, }, setting2={--Control setting back={x=840,y=630,w=180,h=60,rgb=color.white,code=back}, @@ -317,11 +357,11 @@ Buttons={ }, help={ back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="qq"}, - qq={x=980,y=590,w=230,h=60,rgb=color.white,code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left="back"}, + qq={x=980,y=590,w=230,h=60,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left="back"}, }, stat={ back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="path"}, - path={x=980,y=590,w=250,h=60,f=30,rgb=color.white,code=function()sys.openURL("C:/Users/MrZ/AppData/Roaming/LOVE/Techmino")end,left="back"}, + path={x=980,y=590,w=250,h=60,f=30,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL(fs.getSaveDirectory())end,left="back"}, }, sel=nil,--selected button id(integer) } \ No newline at end of file diff --git a/main.lua b/main.lua index 6ffdca2f..07e52cee 100644 --- a/main.lua +++ b/main.lua @@ -1,5 +1,4 @@ -local gc=love.graphics -local tm=love.timer +local gc,tm=love.graphics,love.timer local ms,kb=love.mouse,love.keyboard local fs,sys=love.filesystem,love.system int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi @@ -8,6 +7,7 @@ ins,rem,sort=table.insert,table.remove,table.sort null=function()end system=sys.getOS() +scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1} scene="" bgmPlaying=nil curBG="none" @@ -44,6 +44,7 @@ gameEnv0={ keepVisible=true,visible="show", sequence="bag7", block=true, + Fkey=false, ospin=true, freshLimit=1e99, target=1e99, @@ -64,6 +65,11 @@ customSel={ freshLimit=3, opponent=1, } +preField={}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end +freeRow={} +for i=1,40 do + freeRow[i]={0,0,0,0,0,0,0,0,0,0} +end --Game system Data setting={ ghost=true,center=true, diff --git a/paint.lua b/paint.lua index eba6897b..7b8961be 100644 --- a/paint.lua +++ b/paint.lua @@ -53,12 +53,6 @@ local function stencil_miniTitle() gc.rectangle("fill",unpack(miniTitle_rect[i])) end end -local function stencil_field() - gc.rectangle("fill",0,-10,300,610) -end -local function stencil_field_small() - gc.rectangle("fill",0,0,60,120) -end FX={ flash=0,--Black screen(frame) @@ -187,7 +181,8 @@ end function VirtualkeyPreview() for i=1,#virtualkey do - gc.setColor(1,sel==i and .5 or 1,sel==i and .5 or 1,setting.virtualkeyAlpha*.2) + local c=sel==i and .8 or 1 + gc.setColor(c,c,c,setting.virtualkeyAlpha*.2) local b=virtualkey[i] gc.setLineWidth(b[4]*.07) gc.circle("line",b[1],b[2],b[4]-5) @@ -198,16 +193,18 @@ function drawVirtualkey() local a=setting.virtualkeyAlpha*.2 local P=players[1] for i=1,#virtualkey do - local p,b=virtualkeyDown[i],virtualkey[i] - if p then gc.setColor(.7,.7,.7,a) - else gc.setColor(1,1,1,a) - end - gc.setLineWidth(b[4]*.07) - gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5) - if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end - if virtualkeyPressTime[i]>0 then - gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1) - gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04)) + if i~=9 or modeEnv.Fkey then + local p,b=virtualkeyDown[i],virtualkey[i] + if p then gc.setColor(.7,.7,.7,a) + else gc.setColor(1,1,1,a) + end + gc.setLineWidth(b[4]*.07) + gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5) + if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end + if virtualkeyPressTime[i]>0 then + gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1) + gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04)) + end end end end @@ -247,6 +244,7 @@ function Pnt.BG.strap() end local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=mt.noise(i,j)+2 end end function Pnt.BG.matrix() + gc.clear(.15,.15,.15) for i=0,15 do for j=0,8 do local t=sin(matrixT[i][j]*Timer())*.2+.2 @@ -287,7 +285,7 @@ function Pnt.main() gc.setColor(1,1,1) gc.draw(titleImage,300,30) setFont(30) - gc.print("Alpha V0.7.13+",290,140) + gc.print("Alpha V0.7.14",290,140) gc.print(system,800,110) end function Pnt.mode() @@ -327,6 +325,38 @@ function Pnt.custom() end end end +function Pnt.draw() + gc.translate(200,60) + 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 + gc.setColor(1,1,1) + gc.setLineWidth(3) + gc.rectangle("line",-2,-2,304,604) + for y=1,20 do for x=1,10 do + if preField[y][x]>0 then + drawPixel(y,x,preField[y][x]) + end + end end + if sx and sy then + gc.setLineWidth(2) + gc.rectangle("line",30*sx-30,600-30*sy,30,30) + end + gc.translate(-200,-60) + if clearSureTime>0 then + gc.setColor(1,1,1,clearSureTime*.02) + gc.draw(drawableText.question,1100,570) + end + if pen>0 then + gc.setLineWidth(13) + gc.setColor(blockColor[pen]) + gc.rectangle("line",945,605,70,70) + else + gc.setColor(.8,.8,.8) + gc.draw(drawableText.x,950,560) + end +end function Pnt.play() for p=1,#players do P=players[p] @@ -334,20 +364,22 @@ function Pnt.play() gc.push("transform") gc.translate(P.x,P.y)gc.scale(P.size)--Scale gc.setColor(0,0,0,.4)gc.rectangle("fill",0,0,60,120)--Black Background - gc.stencil(stencil_field_small,"replace",1) gc.translate(0,P.fieldBeneath*.2) - gc.setStencilTest("equal",1) + gc.setScissor(scr.x+P.x*scr.k,scr.y+P.y*scr.k,60*P.size*scr.k,120*P.size*scr.k) gc.setColor(1,1,1,P.result and max(20-P.endCounter,0)*.05 or 1) + local h=#P.clearing for j=int(P.fieldBeneath/30+1),#P.field do - if P.falling<=0 or without(P.clearing,j)then + if j==P.clearing[h]and P.falling>-1 then + h=h-1 + else for i=1,10 do if P.field[j][i]>0 then gc.draw(blockSkinmini[P.field[j][i]],6*i-6,120-6*j) end end end - end - gc.setStencilTest()--In-playField mask + end--Field + gc.setScissor() gc.translate(0,-P.fieldBeneath*.2) gc.setLineWidth(2) gc.setColor(frameColor[P.strength])gc.rectangle("line",-1,-1,62,122)--Draw boarder @@ -380,10 +412,9 @@ function Pnt.play() gc.setColor(1,1,1,.2) for x=1,9 do gc.line(30*x,-10,30*x,600)end for y=0,19 do gc.line(0,30*y,300,30*y)end - end - gc.stencil(stencil_field,"replace", 1) + end--Grid lines gc.translate(0,P.fieldBeneath) - gc.setStencilTest("equal",1) + gc.setScissor(scr.x+P.absFieldPos[1]*scr.k,scr.y+P.absFieldPos[2]*scr.k,300*P.size*scr.k,610*P.size*scr.k) local h=#P.clearing for j=int(P.fieldBeneath/30+1),#P.field do if j==P.clearing[h]and P.falling>-1 then @@ -393,7 +424,7 @@ function Pnt.play() else for i=1,10 do if P.field[j][i]>0 then - gc.setColor(1,1,1,min(P.visTime[j][i],20)*.05) + gc.setColor(1,1,1,min(P.visTime[j][i]*.05,1)) drawPixel(j,i,P.field[j][i]) end end @@ -401,13 +432,13 @@ function Pnt.play() end--Field for i=1,#P.shade do local S=P.shade[i] - gc.setColor(1,1,1,.15+S[1]*.08) + gc.setColor(1,1,1,S[1]*.12) for x=S[3],S[5]do for y=S[6],S[4]do drawPixel(y,x,S[2]) end end - end + end--shade FX if P.waiting==-1 then if P.gameEnv.ghost then gc.setColor(1,1,1,.3) @@ -442,7 +473,7 @@ function Pnt.play() gc.setColor(1,1,1) gc.draw(PTC.dust[p]) --Draw game field - gc.setStencilTest()--In-playField mask + gc.setScissor()--In-playField mask gc.translate(0,-P.fieldBeneath) gc.setLineWidth(3) gc.setColor(1,1,1) diff --git a/texture.lua b/texture.lua index fef78d4d..b17f6b08 100644 --- a/texture.lua +++ b/texture.lua @@ -8,7 +8,6 @@ local function C(x,y) end gc.setDefaultFilter("nearest","nearest") - local blockImg=N("/image/block/1.png") blockSkin,blockSkinmini={},{} for i=1,13 do @@ -26,15 +25,6 @@ for i=1,10 do virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png") end -local blockColor={ - color.red, - color.green, - color.orange, - color.blue, - color.magenta, - color.yellow, - color.cyan, -} gc.setColor(1,1,1) mouseBlock={} for i=1,7 do @@ -92,8 +82,9 @@ background1=N("/image/BG/bg1.jpg") background2=N("/image/BG/bg2.png") groupCode=N("/image/mess/groupcode.png") payCode=N("/image/mess/paycode.png") - drawableText={ + question=T(100,"?"), + x=T(110,"×"), bpm=T(15,"BPM"), kpm=T(15,"KPM"), modeName=T(30), @@ -101,5 +92,4 @@ drawableText={ next=T(40), hold=T(40), } - c=gc.setCanvas() \ No newline at end of file diff --git a/timer.lua b/timer.lua index dd8d49c4..9e67dd0b 100644 --- a/timer.lua +++ b/timer.lua @@ -45,6 +45,9 @@ function Tmr.intro() count=count+1 if count==200 then count=80 end end +function Tmr.draw() + if clearSureTime>0 then clearSureTime=clearSureTime-1 end +end function Tmr.play(dt) frame=frame+1 stat.gametime=stat.gametime+dt diff --git a/toolfunc.lua b/toolfunc.lua index 5891333e..7b9b6fa2 100644 --- a/toolfunc.lua +++ b/toolfunc.lua @@ -1,4 +1,5 @@ local gc=love.graphics +local kb=love.keyboard local setFont=setFont local toN,toS=tonumber,tostring @@ -11,25 +12,18 @@ local function splitS(s,sep) if #s~=0 then goto L end return t end -function without(t,v) - for i=1,#t do - if t[i]==v then return end - end - return true -end function mStr(s,x,y) gc.printf(s,x-300,y,600,"center") end function getNewRow(val) - if not val then val=0 end local t=rem(freeRow) for i=1,10 do - t[i]=val or 0 + t[i]=val end --clear a row and move to active list if #freeRow==0 then - for i=1,20 do + for i=1,10 do ins(freeRow,{0,0,0,0,0,0,0,0,0,0}) end end @@ -177,13 +171,16 @@ function gotoScene(s,style) Buttons.sel=nil end end - local prevMenu={ load=love.event.quit, intro="quit", main="intro", mode="main", custom="mode", + draw=function() + kb.setKeyRepeat(false) + gotoScene("custom") + end, ready="mode", play=function() clearTask("play")