From 2436a2d0bf8ca4823566a24f856f228c430be272 Mon Sep 17 00:00:00 2001 From: MrZ_26 Date: Tue, 4 Feb 2020 19:25:11 +0800 Subject: [PATCH] =?UTF-8?q?0.190727=CE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BGblock.lua | 14 ++++ TRS.lua | 10 ++- ai.lua | 31 +++++-- button.lua | 76 ++++++++--------- control.lua | 40 +++++---- game_scene.lua | 1 - image/attack_1.png | Bin 0 -> 404 bytes image/attack_2.png | Bin 0 -> 882 bytes image/attack_3.png | Bin 0 -> 973 bytes image/block.png | Bin 5297 -> 5868 bytes main.lua | 199 +++++++++++++++++++++++++++++++-------------- paint.lua | 82 +++++++++---------- timer.lua | 42 +++++++--- 13 files changed, 314 insertions(+), 181 deletions(-) create mode 100644 BGblock.lua create mode 100644 image/attack_1.png create mode 100644 image/attack_2.png create mode 100644 image/attack_3.png diff --git a/BGblock.lua b/BGblock.lua new file mode 100644 index 00000000..d60deb9c --- /dev/null +++ b/BGblock.lua @@ -0,0 +1,14 @@ +local count=0 +BGblockList={}for i=1,16 do BGblockList[i]={}end + +function getNewBlock() + count=count+1 + if count==17 then count=1 end + local t=BGblockList[count] + t.bn,t.size=rnd(7),2+3*rnd() + t.b=blocks[t.bn][rnd(0,3)] + t.x=rnd(-#t.b[1]*t.size*30+100,1180) + t.y=-#t.b*30*t.size + t.v=t.size*(1+rnd()) + return t +end \ No newline at end of file diff --git a/TRS.lua b/TRS.lua index 9d596cc1..ca55fcf6 100644 --- a/TRS.lua +++ b/TRS.lua @@ -8,7 +8,15 @@ blocks={ {[0]={{1,1,1,1}},{{1},{1},{1},{1}},{{1,1,1,1}},{{1},{1},{1},{1}}},--I } do - scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{.5,2.5}} + scs={ + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1.5,1.5},{1.5,1.5},{1.5,1.5},{1.5,1.5},}, + {[0]={.5,2.5},{2.5,0.5},{1.5,2.5},{2.5,1.5}}, + } TRS={ [1]={ [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}}, diff --git a/ai.lua b/ai.lua index 39763049..2785d9d9 100644 --- a/ai.lua +++ b/ai.lua @@ -18,6 +18,20 @@ spinOffset={ {0,0,0},--O {2,0,1},--I }for i=1,7 do spinOffset[i][0]=0 end + + +local count=0 +RowFree={}for i=1,16 do RowFree[i]={}end +function getNewRow(len) + count=count+1 + if count==17 then count=1 end + for i=1,len do + RowFree[count][i]=0 + end + return RowFree[count] +end +--Cache manage + function ifoverlapAI(field,bk,x,y) if x<1 or x+#bk[1]>11 or y<1 then return true end if y>#field then return nil end @@ -25,20 +39,24 @@ function ifoverlapAI(field,bk,x,y) if field[y+i-1]and bk[i][j]>0 and field[y+i-1][x+j-1]>0 then return true end end end end -function resetField(f0,start) +function resetField(f0,start,ifOrigion) while field[start]do rem(field,start) end for i=start,#f0 do - field[i]={} - for j=1,10 do - field[i][j]=f0[i][j] + if ifOrigion then + field[i]=f0[i] + else + field[i]={} + for j=1,10 do + field[i][j]=f0[i][j] + end end end end function getScore(field,cb,cx,cy) local highest=0 - local height={} + local height=getNewRow(0) local rough=0 local clear=0 local hole=0 @@ -101,7 +119,7 @@ function AI_getControls(ctrl) end--move to bottom for i=1,#cb do local y=cy+i-1 - if not field[y]then field[y]={0,0,0,0,0,0,0,0,0,0}end + if not field[y]then field[y]=getNewRow(10)end for j=1,#cb[1]do if cb[i][j]~=0 then field[y][cx+j-1]=1 @@ -116,6 +134,7 @@ function AI_getControls(ctrl) end end end--ifHold + resetField(field_org,cy,true)--True reset,no temp pointer cb,cx,cy=cb_org,cx_org,cy_org if best.hold then diff --git a/button.lua b/button.lua index f496220e..a6f29e66 100644 --- a/button.lua +++ b/button.lua @@ -2,57 +2,57 @@ Buttons={ load={}, intro={}, main={ - {x=240,y=300,w=320,h=60,rgb=color.red,t="Play",code=function()gotoScene("mode")end}, - {x=240,y=380,w=320,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end}, - {x=155,y=460,w=150,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end}, - {x=325,y=460,w=150,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end}, - {x=240,y=540,w=320,h=60,rgb=color.grey,t="Quit",code=function()gotoScene("quit")end}, + {x=250,y=300,w=330,h=60,rgb=color.red,t="Play",code=function()gotoScene("mode")end,down=2}, + {x=250,y=380,w=330,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end,up=1,down=3}, + {x=165,y=460,w=160,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end,up=2,down=5,right=4}, + {x=335,y=460,w=160,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end,up=2,down=5,left=3}, + {x=250,y=540,w=330,h=60,rgb=color.grey,t="Quit",code=function()gotoScene("quit")end,up=3}, }, mode={ - {x=330,y=140,w=280,h=70,rgb=color.white,t="40 Lines",code=function()startGame("sprint")end}, - {x=640,y=140,w=280,h=70,rgb=color.white,t="Zen",code=function()startGame("zen")end}, - {x=950,y=140,w=280,h=70,rgb=color.white,t="GM Roll",code=function()startGame("gmroll")end}, - {x=330,y=250,w=280,h=70,rgb=color.white,t="Marathon",code=function()startGame("marathon")end}, - {x=330,y=360,w=280,h=70,rgb=color.white,t="Death",code=function()startGame("death")end}, - {x=640,y=250,w=280,h=70,rgb=color.white,t="Tetris 25",code=function()startGame("tetris25")end}, - {x=640,y=360,w=280,h=70,rgb=color.white,t="AI Solo",code=function()startGame("solo")end}, - {x=950,y=250,w=280,h=70,rgb=color.white,t="Blind",code=function()startGame("blind")end}, - {x=950,y=360,w=280,h=70,rgb=color.white,t="Asymmetry Solo",code=function()startGame("asymsolo")end}, - {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()gotoScene("main")end}, + {x=330,y=140,w=280,h=70,rgb=color.white,t="40 Lines",code=function()startGame("sprint")end,down=4,right=2}, + {x=640,y=140,w=280,h=70,rgb=color.white,t="Zen",code=function()startGame("zen")end,down=5,left=1,right=3}, + {x=950,y=140,w=280,h=70,rgb=color.white,t="GM Roll",code=function()startGame("gmroll")end,down=6,left=2}, + {x=330,y=250,w=280,h=70,rgb=color.white,t="Marathon",code=function()startGame("marathon")end,up=1,down=7,right=5}, + {x=640,y=250,w=280,h=70,rgb=color.white,t="Tetris 25",code=function()startGame("tetris25")end,up=2,down=8,left=4,right=6}, + {x=950,y=250,w=280,h=70,rgb=color.white,t="Blind",code=function()startGame("blind")end,up=3,down=9,left=5}, + {x=330,y=360,w=280,h=70,rgb=color.white,t="Death",code=function()startGame("death")end,up=4,down=10,right=8}, + {x=640,y=360,w=280,h=70,rgb=color.white,t="AI Solo",code=function()startGame("solo")end,up=5,down=10,right=9,left=7}, + {x=950,y=360,w=280,h=70,rgb=color.white,t="Asymmetry Solo",code=function()startGame("asymsolo")end,up=6,down=10,left=8}, + {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()gotoScene("main")end,up=8}, }, play={ - {x=1230,y=30,w=80,h=40,rgb=color.white,t="Back",code=function()gotoScene("mode")end}, }, setting={ - {x=330,y=100,w=200,h=60,rgb=color.white,t=function()return setting.ghost and"Ghost ON"or"Ghost OFF"end,code=function()setting.ghost=not setting.ghost end}, - {x=540,y=100,w=200,h=60,rgb=color.white,t=function()return setting.center and"Center ON"or"Center OFF"end,code=function()setting.center=not setting.center end}, - {x=870,y=100,w=340,h=60,rgb=color.white,t=function()return setting.sfx and"Disable SFX"or"Enable SFX"end,code=function()setting.sfx=not setting.sfx end}, - {x=870,y=180,w=340,h=60,rgb=color.white,t=function()return setting.bgm and"Disable BGM"or"Enable BGM"end,code=function()BGM()setting.bgm=not setting.bgmBGM("blank")end}, + {x=330,y=100,w=200,h=60,rgb=color.white,t=function()return setting.ghost and"Ghost ON"or"Ghost OFF"end,code=function()setting.ghost=not setting.ghost end,down=6,right=2}, + {x=540,y=100,w=200,h=60,rgb=color.white,t=function()return setting.center and"Center ON"or"Center OFF"end,code=function()setting.center=not setting.center end,down=6,left=1,right=3}, + {x=870,y=100,w=340,h=60,rgb=color.white,t=function()return setting.sfx and"Disable SFX"or"Enable SFX"end,code=function()setting.sfx=not setting.sfx end,down=4,left=2}, + {x=870,y=180,w=340,h=60,rgb=color.white,t=function()return setting.bgm and"Disable BGM"or"Enable BGM"end,code=function()BGM()setting.bgm=not setting.bgm;BGM("blank")end,up=3,down=5,left=2}, {x=870,y=260,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Disable fullscreen"or"Enable fullscreen"end, code=function() setting.fullscreen=not setting.fullscreen love.window.setFullscreen(setting.fullscreen) - end + end, + up=4,down=7,left=6 }, - {x=390,y=250,w=320,h=60,rgb=color.white,t="Advanced settings",code=function()gotoScene("setting2")end}, - {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, + {x=435,y=250,w=320,h=60,rgb=color.white,t="Advanced settings",code=function()gotoScene("setting2")end,up=1,down=7,right=5}, + {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end,up=6}, }, setting2={ - {x=850,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.das=(setting.das-1)%31 end,hold=true}, - {x=1210,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.das=(setting.das+1)%31 end,hold=true}, - {x=1260,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.arr=(setting.arr-1)%16 end,hold=true}, - {x=1430,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.arr=(setting.arr+1)%16 end,hold=true}, - {x=420,y=70,w=190,h=45,rgb=color.white,t=function()return setting.key[1]end,code=function()keysetting=1 end}, - {x=420,y=130,w=190,h=45,rgb=color.white,t=function()return setting.key[2]end,code=function()keysetting=2 end}, - {x=420,y=190,w=190,h=45,rgb=color.white,t=function()return setting.key[3]end,code=function()keysetting=3 end}, - {x=420,y=250,w=190,h=45,rgb=color.white,t=function()return setting.key[4]end,code=function()keysetting=4 end}, - {x=420,y=310,w=190,h=45,rgb=color.white,t=function()return setting.key[5]end,code=function()keysetting=5 end}, - {x=420,y=370,w=190,h=45,rgb=color.white,t=function()return setting.key[6]end,code=function()keysetting=6 end}, - {x=420,y=430,w=190,h=45,rgb=color.white,t=function()return setting.key[7]end,code=function()keysetting=7 end}, - {x=420,y=490,w=190,h=45,rgb=color.white,t=function()return setting.key[8]end,code=function()keysetting=8 end}, - {x=420,y=550,w=190,h=45,rgb=color.white,t=function()return setting.key[9]end,code=function()keysetting=9 end}, - {x=420,y=630,w=120,h=55,rgb=color.white,t="Reset",code=function()setting.key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT"}end}, - {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end}, + {x=420,y=70,w=190,h=45,rgb=color.white,t=function()return setting.key[1]end,code=function()keysetting=1 end,down=2,right=10}, + {x=420,y=130,w=190,h=45,rgb=color.white,t=function()return setting.key[2]end,code=function()keysetting=2 end,up=1,down=3,right=10}, + {x=420,y=190,w=190,h=45,rgb=color.white,t=function()return setting.key[3]end,code=function()keysetting=3 end,up=2,down=4,right=10}, + {x=420,y=250,w=190,h=45,rgb=color.white,t=function()return setting.key[4]end,code=function()keysetting=4 end,up=3,down=5,right=10}, + {x=420,y=310,w=190,h=45,rgb=color.white,t=function()return setting.key[5]end,code=function()keysetting=5 end,up=4,down=6,right=10}, + {x=420,y=370,w=190,h=45,rgb=color.white,t=function()return setting.key[6]end,code=function()keysetting=6 end,up=5,down=7,right=10}, + {x=420,y=430,w=190,h=45,rgb=color.white,t=function()return setting.key[7]end,code=function()keysetting=7 end,up=6,down=8,right=10}, + {x=420,y=490,w=190,h=45,rgb=color.white,t=function()return setting.key[8]end,code=function()keysetting=8 end,up=7,down=9,right=10}, + {x=420,y=550,w=190,h=45,rgb=color.white,t=function()return setting.key[9]end,code=function()keysetting=9 end,up=8,down=14,right=15}, + {x=745,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.das=(setting.das-1)%31 end,hold=true,left=1,right=11,down=15}, + {x=910,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.das=(setting.das+1)%31 end,hold=true,left=10,right=12,down=15}, + {x=960,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.arr=(setting.arr-1)%16 end,hold=true,left=11,right=13,down=15}, + {x=1125,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.arr=(setting.arr+1)%16 end,hold=true,left=12,down=15}, + {x=420,y=630,w=120,h=55,rgb=color.white,t="Reset",code=function()for i=1,#setting.key do setting.key[i]=gameEnv0.key[i] end end,up=9,right=15}, + {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end,left=9,up=9}, }, help={ {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, diff --git a/control.lua b/control.lua index d7cb601e..4ffeafc8 100644 --- a/control.lua +++ b/control.lua @@ -5,7 +5,7 @@ function love.mousemoved(x,y) local B=Buttons[scene][i] if not(B.hide and B.hide())then if abs(mx-B.x)WVoPbuD*EnFXSpf(U zqa;2IVKyMf_ggngbH7A3}miHx@tALDDFxh|^kyjh*Cdmn7m%FHg4b%lqDU_wETf zg8|sU6(9pl0S1#XA7}$Dpb5B^0x%0K0gJ#*6`O>$fuBGX_y!zVDl>P0*T4#p1x!Gy zm&6!-A7}vEzz5)@3uqB|#MNt0C=}H5QIq3|AJ^ct4)7J&?NW9F$Wkc4>NA+mPKGe2 z0bf4BX+7I56-yPc9nd5KF!vu!2GH(Kmqep0CaZ_jur1vkFPO@Hu&Ov;-vF?*FTH;Y zhX)mMxhkgVAdv`#T}t&ap?qCj3Oe32t>yxS*&=V=U6fPAdI9xk>F}V!&fa${HZeF- zst^OJGtL+I%;B@jLja1Q8t?I}Nco2?m#bp2L5nF&_OLm*6g@6^Jm$&pnM@`h0wlto z)i22&Gpz;&KQP(DWra3na{NvO=8Qa&$JlIQu#90ky2m4wMOc$E*xqeUXj4YA#vjUp zWSNq19auw9##SLAhUGvKIkWmH6XGJNL1xN8NiCEFObIku75$W@Iz&}wVnOwS>CdLr zr62^TUu6MhG7Ts_m;uYAqiitHVW8r{3|K}_nbiLq4X9*b2Gf*QWl{%92B2Q4(0Z%_ zN2aoIn26mN(^(Hq>nc=|ag>c(Wy16S1Sl?^N4WS~Z@vN$!xf{Ia@kw#@nrL6@u zGL@Z?Pqfbr0Hxj?naTvNY9Rz=a@1w=GqBDXACZ)B*}_J|sZ8H7b~;&n=J1%uW>d8g z`BZyD4shAR<2gPqo}blGrtcVA%>_EVAj1X*_f!j;-fRqf+W0)B=`83}rtcUFvqe?_ zJM$9La1e$Jx5`qv(H1%qmr~&S(=?r+$-nej7TgYsp&oeDHiR<2FFlq0@m~}#R3>`? zbw?uJ`So^pCp;R6eq>bfMx*=7Qy6?pIllmh<63anPIKe>SHD&RaMW0)ZK**~71-vq zF4V<;QUfbbf!S6VnnKQy0dA=o(QP$_uqKovH#)Eq|Jz9KFL;q;YV6#*o&W#<07*qo IM6N<$f`l=9tpET3 literal 0 HcmV?d00001 diff --git a/image/attack_3.png b/image/attack_3.png new file mode 100644 index 0000000000000000000000000000000000000000..885ed0906d19339ce84592648efeda7f3f77dff4 GIT binary patch literal 973 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 diff --git a/main.lua b/main.lua index 78bbe166..0bb64880 100644 --- a/main.lua +++ b/main.lua @@ -50,6 +50,10 @@ Texts={ "Total block used:", "Total rows cleared:", "Total lines sent:", + "Total key pressed:", + "Total rotate:", + "Total hold:", + "Total spin:", }, help={ "I think you don't need \"help\".", @@ -193,6 +197,22 @@ color={ white={1,1,1}, grey={.6,.6,.6}, } +attackColor={ + {color.red,color.yellow}, + {color.red,color.cyan}, + {color.blue,color.white}, + animate={ + function(t) + gc.setColor(1,t,0) + end, + function(t) + gc.setColor(1-t,t,t) + end, + function(t) + gc.setColor(t,t,1) + end, + } +} -- for k,v in pairs(color) do -- v[1],v[2],v[3]=255*v[1],255*v[2],255*v[3] -- end @@ -203,9 +223,12 @@ clearName={"Single","Double","Triple"} actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","restart","toLeft","toRight"} actName_show={"move left","move right","rotate right","rotate left","rotate flip","hard drop","soft drop","hold","restart","toLeft","toRight"} blockPos={4,4,4,4,4,5,4} -renATK={[0]=0,0,0,1,1,1,2,2,2,3,3,3}--4 else +renATK={[0]=0,0,0,1,1,2,2,3,3,3}--4 else b2bATK={3,5,8} require("TRS")--load block&TRS kick + +marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0} + gameEnv0={ das=6,arr=1, ghost=true,center=true, @@ -415,7 +438,7 @@ Event={ if s>=20 then Event.gameover.win() else - gameEnv.drop=Data.marathon_drop[s] + gameEnv.drop=marathon_drop[s] if s==18 then gameEnv._20G=true end gameEnv.target=s*10+10 end @@ -466,71 +489,63 @@ Event={ gameover=gameover+1 if gameover%3==0 then local j=gameover/3 - if j<=#field then + if field[j]then for i=1,10 do if field[j][i]>0 then field[j][i]=13 end end + else + return true end end - if gameover>80 then - return true - end end, }, } -Data={ - marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0}, - shirase_drop={[0]=0}, - shirase_lock={[0]=0}, - shirase_are={[0]=0}, - shirase_lare={[0]=0}, -} mesDisp={ --Default:font=40,white sprint=function() setFont(75) - mStr(max(40-P.cstat.row,0),-76,280) + mStr(max(40-P.cstat.row,0),-75,280) end, zen=function() setFont(75) - mStr(max(200-P.cstat.row,0),-76,280) + mStr(max(200-P.cstat.row,0),-75,280) end, gmroll=function() setFont(35) gc.print("Tetris",-120,390) setFont(80) - mStr(cstat.tetris,-77,420) + mStr(cstat.tetris,-75,420) end, marathon=function() - mStr(P.cstat.row.."/"..gameEnv.target,-76,250) + mStr(P.cstat.row.."/"..gameEnv.target,-75,250) end, death=function() - mStr(P.cstat.row.."/"..gameEnv.target,-76,250) + mStr(P.cstat.row.."/"..gameEnv.target,-75,250) end, tetris25=function() - gc.print("Remain",-142,510) - gc.print("Attack",-132,365) + gc.print("Remain",-140,450) + gc.print("Attack",-130,305) setFont(80) - mStr(#players.alive,-77,440) - mStr(cstat.atk,-77,300) + mStr(#players.alive,-75,380) + mStr(cstat.atk,-75,240) end, blind=function() setFont(35) gc.print("Rows",-115,220) gc.print("Tetris",-120,390) setFont(80) - mStr(P.cstat.row,-77,250) - mStr(cstat.tetris,-77,420) + mStr(P.cstat.row,-75,250) + mStr(cstat.tetris,-75,420) end, solo=function() - gc.print("Attack",-132,365) + gc.print("Attack",-130,365) setFont(80) - mStr(cstat.atk,-77,300) + mStr(cstat.atk,-75,300) end, asymsolo=function() gc.print("Attack",-132,365) setFont(80) - mStr(cstat.atk,-77,300) + mStr(cstat.atk,-75,300) end, } --Game system Data @@ -621,6 +636,7 @@ function gotoScene(s,style) time=swap[style][1],mid=swap[style][2], draw=swap[style].d } + Buttons.sel=nil end end function resetGameData() @@ -636,6 +652,7 @@ function resetGameData() PTC.dust[i]:start() end stat.game=stat.game+1 + collectgarbage() end function startGame(mode) --rec="" @@ -679,7 +696,7 @@ function loaddata() setting[t]=v elseif t=="ghost"or t=="center"then setting[t]=v=="true" - elseif t=="run"or t=="game"or t=="gametime"or t=="piece"or t=="row"or t=="atk"or t=="key"then + elseif t=="run"or t=="game"or t=="gametime"or t=="piece"or t=="row"or t=="atk"or t=="key"or t=="rotate"or t=="hold"or t=="spin"then v=toN(v)if not v or v<0 then v=0 end stat[t]=v --Statistics @@ -701,6 +718,9 @@ function savedata() t=t..stringPack("row=",stat.row) t=t..stringPack("atk=",stat.atk) t=t..stringPack("key=",stat.key) + t=t..stringPack("rotate=",stat.rotate) + t=t..stringPack("hold=",stat.hold) + t=t..stringPack("spin=",stat.spin) t=t..stringPack("das=",setting.das) t=t..stringPack("arr=",setting.arr) t=t..stringPack("keyset=",string.concat(setting.key)) @@ -773,7 +793,8 @@ function createPlayer(id,x,y,size,AIspeed,data) P.fieldBeneath=0 P.combo=0 - P.b2b=false + P.b2b=0 + P.b2b1=0 P.task={} P.bonus={} @@ -781,9 +802,16 @@ end function showText(text,type,font,dy) ins(P.bonus,{t=0,text=text,draw=FX[type],font=font,dy=dy or 0}) end -function createBeam(s,r)--Player id +function createBeam(s,r,level)--Player id s,r=players[s],players[r] - ins(FX.beam,{s.x+308*s.size,s.y+680*s.size,r.x+308*r.size,r.y+680*r.size,t=0}) + ins(FX.beam,{ + s.x+(30*(cx+sc[2]-1)-30+15+150)*s.size, + s.y+(600-30*(cy+sc[1]-1)+15+70)*s.size, + r.x+308*r.size, + r.y+450*r.size, + t=0, + lv=level, + }) end function freshgho() if not P.gameEnv._20G then @@ -822,8 +850,8 @@ function checkrow(s,num)--(cy,r) ins(clearing,1,i) P.falling=gameEnv.fall c=c+1--row cleared+1 - for k=1,1000 do - PTC.dust[P.id]:setPosition(rnd(0,300),600-30*i+rnd(30)) + for k=1,250 do + PTC.dust[P.id]:setPosition(rnd(300),600-30*i+rnd(30)) PTC.dust[P.id]:emit(1) end end end @@ -838,7 +866,7 @@ function resetblock() P.holded=false P.spinLast=false P.freshNext() - P.sc={scs[bn][1],scs[bn][2]}P.dir=0 + P.sc,P.dir=scs[bn][0],0 P.r,P.c=#cb,#cb[1] P.cx,P.cy=blockPos[bn],21+ceil(fieldBeneath/30) P.dropDelay,P.lockDelay,P.freshTime=gameEnv.drop,gameEnv.lock,0 @@ -846,7 +874,7 @@ function resetblock() if keyPressing[3]then spin(1,true)end if keyPressing[4]then spin(-1,true)end if keyPressing[5]then spin(2,true)end - if ifoverlap(cb,cx,cy)then Event.gameover.lose()end + if ifoverlap(cb,cx,cy)then lock()Event.gameover.lose()end freshgho() if keyPressing[6]then act.hardDrop()P.keyPressing[6]=false end end @@ -865,8 +893,11 @@ function pressKey(i,player) elseif i==2 then P.moving=1 end - P.cstat.key=P.cstat.key+1;ins(keyTime,1,frame)rem(keyTime,11) - stat.key=stat.key+1 + + ins(keyTime,1,frame)rem(keyTime,11) + cstat.key=cstat.key+1 + if not player then stat.key=stat.key+1 end + --Key count end -- if playmode=="recording"then ins(rec,{i,frame})end end @@ -909,12 +940,12 @@ function hold(ifpre) P.hb,P.cb=blocks[hn][0],hb if bn==0 then freshNext()end - P.sc={scs[bn][1],scs[bn][2]}P.dir=0 + P.sc,P.dir=scs[bn][0],0 P.r,P.c=#cb,#cb[1] P.cx,P.cy=blockPos[bn],21+ceil(fieldBeneath/30) freshgho() P.dropDelay,P.lockDelay,P.freshTime=gameEnv.drop,gameEnv.lock,0 - if ifoverlap(cb,cx,cy) then Event.gameover.lose()end + if ifoverlap(cb,cx,cy) then lock()Event.gameover.lose()end P.holded=true SFX(ifpre and"prehold"or"hold") stat.hold=stat.hold+1 @@ -944,35 +975,46 @@ function drop() P.combo=P.combo+1--combo=0 is under if cc==4 then - if b2b then + if b2b>480 then + showText("Tetris B2B2B","fly",70) + csend=7 + elseif b2b>=100 then showText("Tetris B2B","drive",70) csend=5 else showText("Tetris","stretch",80) csend=4 - P.b2b=true end + P.b2b=P.b2b+100 sendTime=120 P.cstat.tetris=P.cstat.tetris+1 elseif cc>0 then if dospin then local t=blockName[bn].." spin "..clearName[cc] - if b2b then + if b2b>480 then + t=t.." B2B2B" + showText(t,"spin",40) + csend=b2bATK[cc]+1 + elseif b2b>=100 then t=t.." B2B" showText(t,"spin",40) csend=b2bATK[cc] - sendTime=csend*40 else showText(t,"spin",50) csend=2*cc - sendTime=csend*30 - P.b2b=true end - if mini then showText("Mini","drive",40,10)sendTime=sendTime+30 end + sendTime=csend*35 + if mini then + showText("Mini","drive",40,10) + sendTime=sendTime+60 + P.b2b=P.b2b+90+10*cc + else + P.b2b=P.b2b+80+20*cc + end SFX("spin_"..cc) stat.spin=stat.spin+1 - else - P.b2b=false + elseif #clearing<#field then + P.b2b=P.b2b-400 showText(clearName[cc],"appear",50) csend=cc-1 sendTime=20+csend*20 @@ -982,13 +1024,16 @@ function drop() if dospin then showText(blockName[bn].." spin","appear",50) SFX("spin_0") + P.b2b=b2b+30 end end + if cc>0 and #clearing==#field then - showText("Perfect Clear","flicker",70,-60) + showText("Perfect Clear","flicker",70) csend=csend+6 - sendTime=sendTime+90 + sendTime=sendTime+30 SFX("perfectclear") + P.b2b=b2b+100 end csend=csend+(renATK[combo]or 4) sendTime=sendTime+20*combo @@ -996,6 +1041,13 @@ function drop() SFX("clear_"..cc) SFX("ren_"..min(combo,11)) end + + if b2b<0 then + P.b2b=0 + elseif b2b>600 then + P.b2b=600 + end + if csend>0 then if mini then csend=int(csend*.7)end --mini attack decrease @@ -1040,11 +1092,12 @@ function lock() end function garbageSend(sender,send,time) local pos,r=rnd(10) + local level=send<4 and 1 or send<7 and 2 or 3 repeat r=players.alive[rnd(#players.alive)] until r~=P.id - createBeam(sender,r) - ins(players[r].atkBuffer,{pos,amount=send,countdown=time,cd0=time,time=0,sent=false}) + createBeam(sender,r,level) + ins(players[r].atkBuffer,{pos,amount=send,countdown=time,cd0=time,time=0,sent=false,lv=level}) sort(players[r].atkBuffer,sortByTime) end function garbageRelease() @@ -1102,6 +1155,7 @@ function keyUp.play(key) end wheelmoved={} +require("BGblock")--BG block module require("ai")--AI module require("timer")--Timer require("paint")--Paint @@ -1114,20 +1168,16 @@ function love.update(dt) for k,v in pairs(players[1])do if rawget(_G,k)then print(k)end end - end--variables flew debugging]] + end--check player data flew(debugging) + ]] for i=#BGblock,1,-1 do BGblock[i].y=BGblock[i].y+BGblock[i].v - if BGblock[i].y>720 then rem(BGblock[i])end + if BGblock[i].y>720 then rem(BGblock,i)end end BGblock.ct=BGblock.ct-1 if BGblock.ct==0 then - local t={bn=rnd(7),size=2+3*rnd()} - t.b=blocks[t.bn][rnd(0,3)] - t.x=rnd(-#t.b[1]*t.size*30+100,1180) - t.y=-#t.b*30*t.size - t.v=t.size*(1+rnd()) - ins(BGblock,t) - BGblock.ct=rnd(20,40) + ins(BGblock,getNewBlock()) + BGblock.ct=rnd(20,30) end --Background blocks update @@ -1202,6 +1252,7 @@ function love.draw() numFont(20)gc.setColor(1,1,1) gc.print(tm.getFPS(),0,700) + gc.print(gcinfo(),0,670) --if gcinfo()>500 then collectgarbage()end end function love.resize(x,y) @@ -1282,12 +1333,34 @@ do--Particle PTC={dust={}}--Particle systems c=gc.newCanvas(6,6)gc.setCanvas(c) gc.clear(1,1,1) - PTC.dust[0]=gc.newParticleSystem(c,10000) + PTC.dust[0]=gc.newParticleSystem(c,1000) PTC.dust[0]:setParticleLifetime(.2,.3) PTC.dust[0]:setEmissionRate(0) PTC.dust[0]:setLinearAcceleration(-1500,-200,1500,200) - PTC.dust[0]:setColors(1,1,1,.4,1,1,1,0) + PTC.dust[0]:setColors(1,1,1,.5,1,1,1,0) + c:release() --Dust particles + + PTC.attack={} + PTC.attack[1]=gc.newParticleSystem(gc.newImage("/image/attack_1.png"),200) + PTC.attack[1]:setParticleLifetime(.25) + PTC.attack[1]:setEmissionRate(0) + PTC.attack[1]:setSpin(10) + PTC.attack[1]:setColors(1,1,1,.7,1,1,1,0) + + PTC.attack[2]=gc.newParticleSystem(gc.newImage("/image/attack_2.png"),200) + PTC.attack[2]:setParticleLifetime(.3) + PTC.attack[2]:setEmissionRate(0) + PTC.attack[2]:setSpin(8) + PTC.attack[2]:setColors(1,1,1,.7,1,1,1,0) + + PTC.attack[3]=gc.newParticleSystem(gc.newImage("/image/attack_3.png"),200) + PTC.attack[3]:setParticleLifetime(.4) + PTC.attack[3]:setEmissionRate(0) + PTC.attack[3]:setSpin(6) + PTC.attack[3]:setColors(1,1,1,.7,1,1,1,0) + --Attack particles + gc.setCanvas() end c=nil diff --git a/paint.lua b/paint.lua index a16ebf15..fa986339 100644 --- a/paint.lua +++ b/paint.lua @@ -37,7 +37,7 @@ function drawButton() for i=1,#Buttons[scene]do local B=Buttons[scene][i] if not(B.hide and B.hide())then - local t=B==Buttons.sel and .3 or 0 + local t=i==Buttons.sel and .3 or 0 B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alphat then B.alpha=B.alpha-.02 elseif B.alpha0 then - gc.setColor(1,0,0) - gc.rectangle("fill",302,600-h,8,-bar+5) - gc.setColor(1,1,0) - gc.rectangle("fill",302,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0)) + gc.setColor(attackColor[a.lv][1]) + gc.rectangle("fill",305,600-h,8,-bar+5) + gc.setColor(attackColor[a.lv][2]) + gc.rectangle("fill",305,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0)) --Timing else - gc.setColor(1,(sin((Timer()-i)*20)+1)*.5,0) - gc.rectangle("fill",302,600-h,8,-bar+5) + attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5) + gc.rectangle("fill",305,600-h,8,-bar+5) --Warning end else - gc.setColor(1,0,0) + gc.setColor(attackColor[a.lv][1]) bar=bar*(20-a.time)*.05 - gc.rectangle("fill",302,600-h,8,-bar+5) + gc.rectangle("fill",305,600-h,8,-bar+5) --Disappear end h=h+bar if h>600 then break end end--Buffer line + gc.setColor(1,1,1) + gc.rectangle("fill",-15,600,10,-b2b1) + gc.setColor(1,.4,.4) + gc.rectangle("line",-20,600-100,15,2) + gc.setColor(.4,.4,1) + gc.rectangle("line",-20,600-480,15,2) + --B2B bar + setFont(40) if gameEnv.hold then gc.setColor(1,1,1) @@ -251,30 +259,17 @@ function Pnt.play() --Speed dials gc.pop() end--Draw players - gc.setLineWidth(3) - for i=1,#FX.beam do - local b=FX.beam[i] - local t=b.t/30 - if t<.25 then - t=t*4 - gc.setColor(1,1,1,4*t) - gc.line(b[1],b[2],b[1]+t*(b[3]-b[1]),b[2]+t*(b[4]-b[2])) - elseif t<.75 then - gc.setColor(1,1,1) - gc.line(b[1],b[2],b[3],b[4]) - else - t=4*t-3 - gc.setColor(1,1,1,4-4*t) - gc.line(b[1]+t*(b[3]-b[1]),b[2]+t*(b[4]-b[2]),b[3],b[4]) - end + gc.setColor(1,1,1) + for i=1,3 do + gc.draw(PTC.attack[i]) end setmetatable(_G,nil) end function Pnt.setting2() setFont(35) gc.setColor(1,1,1) - mStr("DAS:"..setting.das,330,72) - mStr("ARR:"..setting.arr,545,72) + mStr("DAS:"..setting.das,830,72) + mStr("ARR:"..setting.arr,1045,72) gc.setColor(1,1,1) for i=1,9 do gc.printf(actName_show[i]..":",100,60*i-8,200,"right") @@ -295,7 +290,7 @@ end function Pnt.stat() setFont(30) gc.setColor(1,1,1) - for i=1,6 do + for i=1,10 do gc.print(Text.stat[i],250,20+40*i) end @@ -305,5 +300,10 @@ function Pnt.stat() gc.print(stat.piece,600,180) gc.print(stat.row,600,220) gc.print(stat.atk,600,260) + gc.print(stat.key,600,300) + gc.print(stat.rotate,600,340) + gc.print(stat.hold,600,380) + gc.print(stat.spin,600,420) + gc.draw(img.title[setting.lang],180,600,.2,.7+.05*sin(Timer()*2),nil,140,100) end \ No newline at end of file diff --git a/timer.lua b/timer.lua index 72524ca0..1d8494e8 100644 --- a/timer.lua +++ b/timer.lua @@ -40,6 +40,21 @@ end function Tmr.play(dt) frame=frame+1 stat.gametime=stat.gametime+dt + + for i=#FX.beam,1,-1 do + local b=FX.beam[i] + b.t=b.t+1 + local t=b.t*.025 + PTC.attack[b.lv]:setPosition(b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t-100*(4*t*(1-t))) + PTC.attack[b.lv]:emit(1) + if t==1 then + rem(FX.beam,i) + end + end + for i=1,3 do + PTC.attack[i]:update(dt) + end + -- Update attack beam if count then count=count-1 if count==0 then @@ -57,8 +72,20 @@ function Tmr.play(dt) elseif count%60==0 then SFX("ready") end - return nil - end--Start counting + + if count then + for p=1,#players do + P=players[p] + setmetatable(_G,P.index) + if keyPressing[1]or keyPressing[2]then + P.moving=moving+sgn(moving) + else + P.moving=0 + end + end + return nil + end + end--Start counting,include pre-das for p=1,#players do P=players[p] setmetatable(_G,P.index) @@ -139,6 +166,7 @@ function Tmr.play(dt) end end end + if P.b2b>480 then P.b2b=P.b2b-1 end else--Alive P.keySpeed=keySpeed*.96+cstat.key/time*60*.04 P.dropSpeed=dropSpeed*.96+cstat.piece/time*60*.04 @@ -156,8 +184,7 @@ function Tmr.play(dt) end--Rows cleared drop for j=1,#field do for i=1,10 do if visTime[j][i]<20 then P.visTime[j][i]=visTime[j][i]+.5 end - end end - --Make field visible + end end--Make field visible end--Dead for i=#bonus,1,-1 do bonus[i].t=bonus[i].t+1 @@ -180,13 +207,8 @@ function Tmr.play(dt) end end if fieldBeneath>0 then P.fieldBeneath=fieldBeneath-2 end + P.b2b1=P.b2b1*.95+P.b2b*.05 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>30 then - rem(FX.beam,i) - end - end setmetatable(_G,nil) end \ No newline at end of file