diff --git a/BGM/race.ogg b/BGM/race.ogg index e046c763..46e7ecee 100644 Binary files a/BGM/race.ogg and b/BGM/race.ogg differ diff --git a/ai.lua b/ai.lua index b5186bc0..b30f6035 100644 --- a/ai.lua +++ b/ai.lua @@ -74,10 +74,10 @@ function getScore(field,cb,cx,cy) end end return - -highest*10 - -rough*10 + -highest*5 + -rough*15 -cy*15 - +clear^1.5*15 + +clear^2*3 -hole*20 end --controlname:mL,mR,rR,rL,rF,hD,sD,H,LL,RR diff --git a/button.lua b/button.lua index fe3a62c1..aec2e830 100644 --- a/button.lua +++ b/button.lua @@ -9,20 +9,24 @@ Buttons={ {x=500,y=540,w=320,h=60,rgb={.5,.5,.5},alpha=0,t="Quit",code=function()gotoScene("quit")end}, }, mode={ - {x=350,y=200,w=220,h=70,rgb={1,1,1},alpha=0,t="Marathon",code=function()startGame("marathon")end}, - {x=350,y=300,w=220,h=70,rgb={1,1,1},alpha=0,t="40 Lines",code=function()startGame("sprint")end}, - {x=650,y=200,w=220,h=70,rgb={1,1,1},alpha=0,t="Zen",code=function()startGame("zen")end}, - {x=650,y=300,w=220,h=70,rgb={1,1,1},alpha=0,t="Battle",code=function()startGame("battle")end}, + {x=200,y=150,w=250,h=70,rgb={1,1,1},alpha=0,t="40 Lines",code=function()startGame("sprint")end}, + {x=500,y=150,w=250,h=70,rgb={1,1,1},alpha=0,t="Zen",code=function()startGame("zen")end}, + {x=200,y=250,w=250,h=70,rgb={1,1,1},alpha=0,t="Marathon",code=function()startGame("marathon")end}, + {x=200,y=350,w=250,h=70,rgb={1,1,1},alpha=0,t="Death",code=function()startGame("death")end}, + {x=500,y=250,w=250,h=70,rgb={1,1,1},alpha=0,t="Tetris 25",code=function()startGame("tetris25")end}, + {x=500,y=350,w=250,h=70,rgb={1,1,1},alpha=0,t="AI Solo",code=function()startGame("solo")end}, + {x=800,y=250,w=250,h=70,rgb={1,1,1},alpha=0,t="Blind",code=function()startGame("blind")end}, + {x=800,y=350,w=250,h=70,rgb={1,1,1},alpha=0,t="Asymmetry Solo",code=function()startGame("asymsolo")end}, {x=500,y=520,w=350,h=80,rgb={1,1,1},alpha=0,t="Back",code=function()gotoScene("main")end}, }, play={ {x=950,y=30,w=80,h=40,rgb={1,1,1},alpha=0,t="Back",code=function()gotoScene("mode")end}, }, setting={ - {x=120,y=80,w=30,h=30,rgb={1,1,1},alpha=0,t="-",code=function()setting.das=(setting.das-1)%41 end,hold=true}, - {x=280,y=80,w=30,h=30,rgb={1,1,1},alpha=0,t="+",code=function()setting.das=(setting.das+1)%41 end,hold=true}, - {x=320,y=80,w=30,h=30,rgb={1,1,1},alpha=0,t="-",code=function()setting.arr=(setting.arr-1)%21 end,hold=true}, - {x=480,y=80,w=30,h=30,rgb={1,1,1},alpha=0,t="+",code=function()setting.arr=(setting.arr+1)%21 end,hold=true}, + {x=120,y=80,w=30,h=30,rgb={1,1,1},alpha=0,t="-",code=function()setting.das=(setting.das-1)%31 end,hold=true}, + {x=280,y=80,w=30,h=30,rgb={1,1,1},alpha=0,t="+",code=function()setting.das=(setting.das+1)%31 end,hold=true}, + {x=320,y=80,w=30,h=30,rgb={1,1,1},alpha=0,t="-",code=function()setting.arr=(setting.arr-1)%16 end,hold=true}, + {x=480,y=80,w=30,h=30,rgb={1,1,1},alpha=0,t="+",code=function()setting.arr=(setting.arr+1)%16 end,hold=true}, {x=200,y=200,w=190,h=40,rgb={1,1,1},alpha=0,t=function()return setting.ghost and"Ghost ON"or"Ghost OFF"end,code=function()setting.ghost=not setting.ghost end}, {x=400,y=200,w=190,h=40,rgb={1,1,1},alpha=0,t=function()return setting.center and"Center ON"or"Center OFF"end,code=function()setting.center=not setting.center end}, @@ -53,8 +57,9 @@ Buttons={ {x=350,y=320,w=210,h=43,rgb={1,1,1},alpha=0,t=function()return setting.key[6]end,code=function()keysetting=6 end}, {x=350,y=370,w=210,h=43,rgb={1,1,1},alpha=0,t=function()return setting.key[7]end,code=function()keysetting=7 end}, {x=350,y=420,w=210,h=43,rgb={1,1,1},alpha=0,t=function()return setting.key[8]end,code=function()keysetting=8 end}, - {x=320,y=500,w=130,h=43,rgb={1,1,1},alpha=0,t="Reset",code=function()setting.key={"left","right","x","z","c","up","down","space","LEFT","RIGHT"}end}, - {x=500,y=500,w=100,h=50,rgb={1,1,1},alpha=0,t="Back",code=function()back()end}, + {x=350,y=470,w=210,h=43,rgb={1,1,1},alpha=0,t=function()return setting.key[9]end,code=function()keysetting=9 end}, + {x=320,y=550,w=130,h=43,rgb={1,1,1},alpha=0,t="Reset",code=function()setting.key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT"}end}, + {x=500,y=550,w=100,h=50,rgb={1,1,1},alpha=0,t="Back",code=function()back()end}, }, help={ {x=500,y=500,w=200,h=60,rgb={1,1,1},alpha=0,t="Back",code=function()back()end}, diff --git a/conf.lua b/conf.lua index a1ada440..c18189d8 100644 --- a/conf.lua +++ b/conf.lua @@ -19,7 +19,7 @@ function love.conf(t) t.window.minheight=300 t.window.fullscreen=X t.window.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) - t.window.vsync=1 + t.window.vsync=0 t.window.msaa=0--The number of samples to use with multi-sampled antialiasing (number) t.window.depth=nil--The number of bits per sample in the depth buffer t.window.stencil=nil--The number of bits per sample in the stencil buffer diff --git a/main.lua b/main.lua index 32567227..477f69af 100644 --- a/main.lua +++ b/main.lua @@ -135,30 +135,30 @@ FX={ stretch=function(t) gc.push("transform") setFont(t.font) - gc.translate(150,250) + gc.translate(150,250+t.dy) gc.setColor(1,1,1,min((30-abs(t.t-30))*.1,1)*(#field>9 and .7 or 1)) if t.t<20 then gc.scale((20-t.t)*.015+1,1)end - mStr(t.text,0,-t.font*.5+t.dy) + mStr(t.text,0,-t.font*.5) gc.pop() end, drive=function(t) gc.push("transform") setFont(t.font) - gc.translate(150,290) + gc.translate(150,290+t.dy) gc.setColor(1,1,1,min((30-abs(t.t-30))*.1,1)*(#field>9 and .7 or 1)) - if t.t<20 then gc.shear((20-t.t)*.03,0)end - mStr(t.text,0,-t.font*.5+t.dy) + if t.t<20 then gc.shear((20-t.t)*.05,0)end + mStr(t.text,0,-t.font*.5) gc.pop() end, spin=function(t) gc.push("transform") setFont(t.font) - gc.translate(150,250) + gc.translate(150,250+t.dy) gc.setColor(1,1,1,min((30-abs(t.t-30))*.1,1)*(#field>9 and .7 or 1)) if t.t<20 then - gc.scale((20-t.t)*.01+1,(20-t.t)*.015+1) + gc.rotate((20-t.t)^2*.0015) end - mStr(t.text,0,-t.font*.5+t.dy) + mStr(t.text,0,-t.font*.5) gc.pop() end, flicker=function(t) @@ -176,8 +176,8 @@ list={ reason={[0]="Escape","Block out","Lock out","Finished","Top out"}, method={"Bag7","His4","Rnd"}, } -actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","toLeft","toRight"} -actName_={"move left","move right","rotate right","rotate left","rotate flip","hard drop","soft drop","hold","toLeft","toRight"} +actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","restart","toLeft","toRight"} +actName_={"move left","move right","rotate right","rotate left","rotate flip","hard drop","soft drop","hold","restart","toLeft","toRight"} name={"Z","S","L","J","T","O","I"} blockPos={4,4,4,4,4,5,4} renATK={[0]=0,0,0,1,1,1,2,2,2,3,3,3} @@ -190,6 +190,7 @@ gameEnv0={ next=6,hold=true, sequence=1,visible=1, _20G=false,target=9e99, + freshLimit=9e99, color={1,5,2,8,10,3,7,13}, key={"left","right","x","z","c","up","down","space","LEFT","RIGHT"}, reach=function()end @@ -226,18 +227,6 @@ randomMethod={ end, } loadmode={ - marathon=function() - modeEnv={ - drop=60, - wait=1, - fall=20, - target=10, - reach=Event.marathon_reach, - } - createPlayer(1,190,20,.8) - curBG="game1" - BGM("way") - end, sprint=function() modeEnv={ wait=1, @@ -262,51 +251,165 @@ loadmode={ curBG="game1" BGM("reason") end, - gm=function() + marathon=function() modeEnv={ drop=60, - wait=10, - fall=5, - target=100, - reach=Event.gm_reach, + wait=1, + fall=20, + target=10, + reach=Event.marathon_reach, + freshLimit=20, + } + createPlayer(1,190,20,.8) + curBG="game1" + BGM("way") + end, + death=function() + modeEnv={ + _20G=true, + drop=0, + lock=10, + wait=6, + fall=10, + target=50, + reach=Event.death_reach, + freshLimit=13, + arr=1, } createPlayer(1,190,20,.8) curBG="game2" BGM("push") end, - battle=function() + tetris25=function() modeEnv={ wait=1, fall=1, } createPlayer(1,240,30,.8)--Player - -- createPlayer(2,580,25,.38,true) - -- createPlayer(3,580,315,.38,true) - --Triple - - -- createPlayer(2,580,140,.6,true) - --Solo - local n=2 - for i=1,3 do - for j=1,7 do - createPlayer(n,75*i-65,80*j-55,.1,true) + for i=1,2 do + for j=1,5 do + createPlayer(n,100*i-65,110*j-75,.15,rnd(4)+1) n=n+1 end end - for i=11,13 do - for j=1,7 do - createPlayer(n,75*i-65,80*j-55,.1,true) + for i=9,10 do + for j=1,5 do + createPlayer(n,100*i-130,110*j-75,.14,rnd(4)+1) n=n+1 end - end + end--AIs + + curBG="game2" + BGM("race") + end, + solo=function() + modeEnv={ + wait=1, + fall=1, + } + createPlayer(1,40,30,.8)--Player + createPlayer(2,560,100,.7,2)--AI + + curBG="game2" + BGM("race") + end, + blind=function() + modeEnv={ + drop=15, + lock=30, + wait=1, + fall=1, + visible=0, + freshLimit=5, + } + createPlayer(1,190,20,.8) + + curBG="game1" + BGM("push") + end, + asymsolo=function() + modeEnv={ + wait=1, + fall=1, + visible=2, + } + createPlayer(1,40,30,.8)--Player + createPlayer(2,560,100,.7,2)--AI curBG="game2" BGM("race") end, } Event={ + gameover={ + win=function() + P.alive=false + P.control=false + P.waiting=1e99 + gameover=0 + for i=1,#visTime do for j=1,10 do + P.visTime[i][j]=1e99 + end end--Make all visible + P.control=false + ins(task,Event.task.win) + end, + lose=function() + P.alive=false + P.control=false + P.waiting=1e99 + gameover=0 + for i=1,#visTime do for j=1,10 do + P.visTime[i][j]=1e99 + end end--Make all visible + for i=1,#players.alive do + if players.alive[i]==P.id then + rem(players.alive,i) + break + end + end + for i=1,#P.atkBuffer do + P.atkBuffer[i].sent=true + P.atkBuffer[i].time=0 + end + ins(task,Event.task.lose) + end, + }, + marathon_reach=function() + local s=int(P.cstat.row*.1) + if s>=20 then + Event.gameover.win() + else + gameEnv.drop=Data.marathon_drop[s] + gameEnv.target=s*10+10 + end + end, + death_reach=function() + if gameEnv.target==50 then + gameEnv.lock=9 + gameEnv.wait=4 + gameEnv.fall=8 + showText("STAGE 2","drive",80,-80) + elseif gameEnv.target==100 then + gameEnv.lock=8 + gameEnv.wait=3 + gameEnv.fall=6 + showText("STAGE 3","drive",80,-80) + elseif gameEnv.target==150 then + gameEnv.lock=7 + gameEnv.wait=3 + gameEnv.fall=5 + showText("STAGE 4","drive",80,-80) + elseif gameEnv.target==200 then + gameEnv.lock=6 + gameEnv.wait=2 + gameEnv.fall=4 + showText("STAGE 5","drive",80,-80) + gameEnv.target=250 + end + gameEnv.target=gameEnv.target+50 + end, task={ win=function() gameover=gameover+1 @@ -338,50 +441,6 @@ Event={ end end, }, - gameover={ - win=function() - P.control=false - P.waiting=1e99 - gameover=0 - for i=1,#visTime do for j=1,10 do - P.visTime[i][j]=1e99 - end end--Make all visible - P.control=false - ins(task,Event.task.win) - end, - lose=function() - P.control=false - P.waiting=1e99 - gameover=0 - for i=1,#visTime do for j=1,10 do - P.visTime[i][j]=1e99 - end end--Make all visible - P.control=false - for i=1,#players.alive do - if players.alive[i]==P.id then - rem(players.alive,i) - break - end - end - for i=1,#P.atkBuffer do - P.atkBuffer[i].sent=true - P.atkBuffer[i].time=0 - end - ins(task,Event.task.lose) - end, - }, - marathon_reach=function() - local s=int(P.cstat.row*.1) - if s>=20 then - Event.gameover.win() - else - gameEnv.drop=Data.marathon_drop[s] - gameEnv.target=s*10+10 - end - end, - gm_reach=function() - - end } Data={ marathon_drop={[0]=60,50,40,30,25,20,18,16,14,12,10,8,7,6,5,4,3,2,1,1}, @@ -391,12 +450,6 @@ Data={ shirase_lare={[0]=0}, } mesDisp={ - marathon=function() - gc.setColor(1,1,1) - setFont(40) - gc.print(format("%0.2f",time),-130,530) - mStr(P.cstat.row.."/"..gameEnv.target,-80,250) - end, sprint=function() gc.setColor(1,1,1) setFont(40) @@ -411,8 +464,30 @@ mesDisp={ setFont(75) mStr(max(200-P.cstat.row,0),-80,280) end, - gm=function()end, - battle=function()end, + marathon=function() + gc.setColor(1,1,1) + setFont(40) + gc.print(format("%0.2f",time),-130,530) + mStr(P.cstat.row.."/"..gameEnv.target,-80,250) + end, + death=function() + gc.setColor(1,1,1) + setFont(40) + gc.print(format("%0.2f",time),-130,530) + mStr(P.cstat.row.."/"..gameEnv.target,-80,250) + end, + tetris25=function() + gc.setColor(1,1,1) + setFont(80) + mStr(#players.alive,-80,440) + setFont(40) + gc.print("Remain",-142,510) + end, + blind=function() + gc.setColor(1,1,1) + setFont(40) + gc.print(P.cstat.row,-80,250) + end, } --Game system Data @@ -422,7 +497,7 @@ setting={ lang="eng", das=5,arr=0, ghost=true,center=true, - key={"left","right","x","z","c","up","down","space","LEFT","RIGHT"}, + key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT"}, color={1,5,2,8,10,3,7,13}, } stat={ @@ -526,21 +601,22 @@ function gotoScene(s,style) } end end -function createPlayer(id,x,y,size,ifAI,data) +function createPlayer(id,x,y,size,AIspeed,data) players[id]={id=id} ins(players.alive,id) local P=players[id] P.index={__index=P} P.x,P.y,P.size=x,y,size - if ifAI then + if AIspeed then P.ai={ controls={}, - controlDelay=2, - controlDelay0=2, + controlDelay=60, + controlDelay0=AIspeed, } end + P.alive=true P.control=false P.time=0 P.cstat={piece=0,row=0,atk=0}--Current gamestat @@ -564,6 +640,7 @@ function createPlayer(id,x,y,size,ifAI,data) P.hn,P.hb,P.holded=0,{{}},false P.nxt,P.nb={},{} P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock + P.freshTime=0 local bag1={1,2,3,4,5,6,7} for i=1,7 do @@ -598,6 +675,7 @@ function startGame(mode) frame=0 count=179 + FX.beam={} for i=1,#PTC.dust do PTC.dust[i]:release()end for i=1,#players do PTC.dust[i]=PTC.dust[0]:clone() @@ -707,7 +785,7 @@ function resetblock() P.r,P.c=#cb,#cb[1] P.cx,P.cy=blockPos[bn],21+ceil(fieldBeneath/30) freshgho() - P.dropDelay,P.lockDelay=gameEnv.drop,gameEnv.lock + P.dropDelay,P.lockDelay,P.freshTime=gameEnv.drop,gameEnv.lock,0 if keyPressing[8]then hold(true)end if keyPressing[3]then spin(1,true)end if keyPressing[4]then spin(-1,true)end @@ -718,9 +796,9 @@ end function pressKey(i,player) P=player or players[1] setmetatable(_G,P.index) - if control then - P.keyPressing[i]=true - if waiting<=0 then + P.keyPressing[i]=true + if alive then + if control and waiting<=0 then act[actName[i]]() if i>2 and i<6 then keyPressing[i]=false end elseif i==1 then @@ -729,9 +807,11 @@ function pressKey(i,player) P.moving=1 end P.cstat.key=stat.key+1;ins(keyTime,1,frame)rem(keyTime,11) - -- if playmode=="recording"then ins(rec,{i,frame})end stat.key=stat.key+1 + elseif i==9 then + act[actName[i]]() end + -- if playmode=="recording"then ins(rec,{i,frame})end end function releaseKey(i,player) P=player or players[1] @@ -760,7 +840,10 @@ function spin(d,ifpre) P.r,P.c=ir,ic P.dir=(dir+d)%4 freshgho() - P.lockDelay=gameEnv.lock + P.freshTime=P.freshTime+1 + if P.freshTime<=gameEnv.freshLimit then + P.lockDelay=gameEnv.lock + end SFX(ifpre and"prerotate"or ifoverlap(cb,cx,cy+1)and ifoverlap(cb,cx-1,cy)and ifoverlap(cb,cx+1,cy)and"rotatekick"or"rotate") stat.rotate=stat.rotate+1 end @@ -775,7 +858,7 @@ function hold(ifpre) P.r,P.c=#cb,#cb[1] P.cx,P.cy=blockPos[bn],21 freshgho() - P.dropDelay,P.lockDelay=gameEnv.drop,gameEnv.lock + P.dropDelay,P.lockDelay,P.freshTime=gameEnv.drop,gameEnv.lock,0 if ifoverlap(cb,cx,cy) then Event.gameover.lose()end P.holded=true SFX(ifpre and"prehold"or"hold") @@ -924,7 +1007,7 @@ mouseDown={} keyDown={} function keyDown.play(key) local k=players[1].gameEnv.key - for i=1,10 do + for i=1,11 do if key==k[i]then pressKey(i,players[1]) break @@ -992,8 +1075,8 @@ function love.draw() setFont(35) drawButton() if mouseShow then - gc.setColor(1,0,0,.6) - gc.circle("fill",mx,my,4) + gc.setColor(1,.5,0,.7) + gc.circle("fill",mx,my,6) end if sceneSwaping then sceneSwaping.draw()end @@ -1006,8 +1089,8 @@ function love.draw() gc.rectangle("fill",1000,0,(ww*600/wh-1000)*.5,600) end--Draw black side - --numFont(10)gc.setColor(1,1,1) - --gc.print(tm.getFPS(),0,590) + numFont(10)gc.setColor(1,1,1) + gc.print(tm.getFPS(),0,590) --if gcinfo()>500 then collectgarbage()end end function love.resize(x,y) @@ -1034,6 +1117,7 @@ function love.focus(f) end end function love.run() + local frameT=Timer() tm.step() love.resize(1000,600) game.load()--Launch @@ -1055,6 +1139,8 @@ function love.run() gc.present() end end + while Timer()-frameT<1/60 do end + frameT=Timer() end end --System callbacks diff --git a/paint.lua b/paint.lua index f9a313c5..ae2603a9 100644 --- a/paint.lua +++ b/paint.lua @@ -75,7 +75,7 @@ function Pnt.play() setmetatable(_G,P.index) gc.push("transform") gc.translate(x,y)gc.scale(size)--Scale - gc.setColor(0,0,0,.7)gc.rectangle("fill",0,0,620,690)--Back + gc.setColor(0,0,0,.8)gc.rectangle("fill",0,0,620,690)--Black Background gc.setLineWidth(3) gc.setColor(1,1,1)gc.rectangle("line",0,0,620,690)--Big frame gc.translate(160,70) @@ -102,6 +102,12 @@ function Pnt.play() end end end end--Ghost + gc.setColor(1,1,1,lockDelay/gameEnv.lock) + for i=1,r do for j=1,c do + if cb[i][j]>0 then + gc.rectangle("fill",30*(j+cx-1)-35,595-30*(i+cy-1),40,40) + end + end end--BlockShade(lockdelay indicator) for i=1,r do for j=1,c do if cb[i][j]>0 then drawPixel(i+cy-1,j+cx-1,gameEnv.color[bn],1) @@ -142,7 +148,7 @@ function Pnt.play() h=h+bar if h>600 then break end end--Buffer line - + setFont(40) if gameEnv.hold then gc.setColor(1,1,1) @@ -179,7 +185,7 @@ function Pnt.play() for i=1,#bonus do bonus[i]:draw() end--Effects - mesDisp[gamemode]()--Draw message + if mesDisp[gamemode]then mesDisp[gamemode]()end--Draw message setFont(45) gc.translate(380,550) gc.setColor(1,1,1) @@ -200,7 +206,7 @@ function Pnt.play() gc.setLineWidth(3) for i=1,#FX.beam do local b=FX.beam[i] - local t=b.t/45 + local t=b.t/30 if t<.25 then t=t*4 gc.setColor(1,1,1,4*t) @@ -225,7 +231,7 @@ end function Pnt.setting2() setFont(30) gc.setColor(1,1,1) - for i=1,8 do + for i=1,9 do gc.printf(actName_[i]..":",80,5+50*i,150,"right") end if keysetting then diff --git a/question note.txt b/question note.txt deleted file mode 100644 index 8c7e9559..00000000 --- a/question note.txt +++ /dev/null @@ -1,2 +0,0 @@ -1.缓冲条位置 -2. \ No newline at end of file diff --git a/timer.lua b/timer.lua index 3f3f8b0f..6c99d6cc 100644 --- a/timer.lua +++ b/timer.lua @@ -60,108 +60,110 @@ function Tmr.play(dt) for p=1,#players do P=players[p] setmetatable(_G,P.index) - if control then P.time=time+dt end + if alive then + if control then P.time=time+dt end - local v=0 - for i=2,10 do v=v+i*(i-1)*7.2/(frame-keyTime[i])end P.keySpeed=keySpeed*.99+v*.1 - v=0 for i=2,10 do v=v+i*(i-1)*7.2/(frame-dropTime[i])end P.dropSpeed=dropSpeed*.99+v*.1 - --Update speeds + local v=0 + for i=2,10 do v=v+i*(i-1)*7.2/(frame-keyTime[i])end P.keySpeed=keySpeed*.99+v*.1 + v=0 for i=2,10 do v=v+i*(i-1)*7.2/(frame-dropTime[i])end P.dropSpeed=dropSpeed*.99+v*.1 + --Update speeds - if P.ai then - P.ai.controlDelay=P.ai.controlDelay-1 - if P.ai.controlDelay==0 then - if #P.ai.controls>0 then - pressKey(P.ai.controls[1],P) - releaseKey(P.ai.controls[1],P) - rem(P.ai.controls,1) - P.ai.controlDelay=P.ai.controlDelay0 - else - AI_getControls(P.ai.controls) - P.ai.controlDelay=2*P.ai.controlDelay0 - end - end - end - - for j=1,#field do for i=1,10 do - if visTime[j][i]>0 then P.visTime[j][i]=visTime[j][i]-1 end - end end - --Fresh visible time - if keyPressing[1]or keyPressing[2]then - P.moving=moving+sgn(moving) - local d=abs(moving)-gameEnv.das - if d>1 then - if gameEnv.arr>0 then - if d%gameEnv.arr==0 then - act[moving>0 and"moveRight"or"moveLeft"](true) + if P.ai then + P.ai.controlDelay=P.ai.controlDelay-1 + if P.ai.controlDelay==0 then + if #P.ai.controls>0 then + pressKey(P.ai.controls[1],P) + releaseKey(P.ai.controls[1],P) + rem(P.ai.controls,1) + P.ai.controlDelay=P.ai.controlDelay0+rnd(3) + else + AI_getControls(P.ai.controls) + P.ai.controlDelay=2*P.ai.controlDelay0 end - else - act[moving>0 and"toRight"or"toLeft"]() end end - else - P.moving=0 - end - if keyPressing[7]then - act.softDrop() - P.downing=downing+1 - else - P.downing=0 - end - if falling>0 then - P.falling=falling-1 - if falling<=0 then - if #field>clearing[1]then SFX("fall")end - for i=1,#clearing do - rem(field,clearing[i]) - rem(visTime,clearing[i]) - end - P.clearing={} - end - elseif waiting>0 then - P.waiting=waiting-1 - if waiting<=0 then - resetblock() - end - else - if cy~=y_img then - if dropDelay>1 then - P.dropDelay=dropDelay-1 - else - drop() - P.dropDelay,P.lockDelay=gameEnv.drop,gameEnv.lock + + for j=1,#field do for i=1,10 do + if visTime[j][i]>0 then P.visTime[j][i]=visTime[j][i]-1 end + end end + --Fresh visible time + if keyPressing[1]or keyPressing[2]then + P.moving=moving+sgn(moving) + local d=abs(moving)-gameEnv.das + if d>1 then + if gameEnv.arr>0 then + if d%gameEnv.arr==0 then + act[moving>0 and"moveRight"or"moveLeft"](true) + end + else + act[moving>0 and"toRight"or"toLeft"]() + end end else - if lockDelay>0 then P.lockDelay=lockDelay-1 - else drop() + P.moving=0 + end + if keyPressing[7]then + act.softDrop() + P.downing=downing+1 + else + P.downing=0 + end + if falling>0 then + P.falling=falling-1 + if falling<=0 then + if #field>clearing[1]then SFX("fall")end + for i=1,#clearing do + rem(field,clearing[i]) + rem(visTime,clearing[i]) + end + P.clearing={} + end + elseif waiting>0 then + P.waiting=waiting-1 + if waiting<=0 then + resetblock() + end + else + if cy~=y_img then + if dropDelay>1 then + P.dropDelay=dropDelay-1 + else + drop() + P.dropDelay,P.lockDelay=gameEnv.drop,gameEnv.lock + end + else + if lockDelay>0 then P.lockDelay=lockDelay-1 + else drop() + end end end - end + end--If alive for i=#bonus,1,-1 do bonus[i].t=bonus[i].t+1 if bonus[i].t>60 then rem(bonus,i)end end for i=#task,1,-1 do if task[i]()then rem(task,i)end - end - for i=#atkBuffer,1,-1 do - local atk=atkBuffer[i] - atk.time=atk.time+1 - if not atk.sent then - if atk.countdown>0 then - atk.countdown=atk.countdown-1 - end - else - if atk.time>20 then - rem(atkBuffer,i) - end - end - end - if fieldBeneath>0 then P.fieldBeneath=fieldBeneath-1 end + end + for i=#atkBuffer,1,-1 do + local atk=atkBuffer[i] + atk.time=atk.time+1 + if not atk.sent then + if atk.countdown>0 then + atk.countdown=atk.countdown-1 + end + else + if atk.time>20 then + rem(atkBuffer,i) + end + end + end + if fieldBeneath>0 then P.fieldBeneath=fieldBeneath-2 end PTC.dust[p]:update(dt) end for i=#FX.beam,1,-1 do FX.beam[i].t=FX.beam[i].t+1 - if FX.beam[i].t>45 then + if FX.beam[i].t>30 then rem(FX.beam,i) end end diff --git a/user_actions.lua b/user_actions.lua index b4863ef9..6df97f0a 100644 --- a/user_actions.lua +++ b/user_actions.lua @@ -4,7 +4,10 @@ act={ if not ifoverlap(cb,cx-1,cy)then P.cx=cx-1 freshgho() - P.lockDelay=gameEnv.lock + P.freshTime=P.freshTime+1 + if P.freshTime<=gameEnv.freshLimit then + P.lockDelay=gameEnv.lock + end if cy==y_img then SFX("move")end end end, @@ -13,7 +16,10 @@ act={ if not ifoverlap(cb,cx+1,cy)then P.cx=cx+1 freshgho() - P.lockDelay=gameEnv.lock + P.freshTime=P.freshTime+1 + if P.freshTime<=gameEnv.freshLimit then + P.lockDelay=gameEnv.lock + end if cy==y_img then SFX("move")end end end, @@ -36,7 +42,9 @@ act={ rotFlip=function()spin(2)end, hold=hold, --Player movements - + restart=function() + startGame(gamemode) + end, down1=function()drop()end, down4=function()for i=1,4 do if cy~=y_img then drop()else break end end end, toDown=function()P.cy,P.lockDelay=y_img,gameEnv.lock end,