diff --git a/ai.lua b/ai.lua index d2341fc5..639598f6 100644 --- a/ai.lua +++ b/ai.lua @@ -1,12 +1,12 @@ --[[ -HighestBlock -HorizontalTransitions -VerticalTransitions -BlockedCells -Wells -FilledLines -TechrashShape -BlockedWells; + HighestBlock + HorizontalTransitions + VerticalTransitions + BlockedCells + Wells + FilledLines + 4deepShape + BlockedWells; ]] dirCount={1,1,3,3,3,0,1} spinOffset={ @@ -18,7 +18,8 @@ spinOffset={ {0,0,0},--O {2,0,1},--I }for i=1,7 do spinOffset[i][0]=0 end ---[[controlname: +--[[ + controlname: 1~5:mL,mR,rR,rL,rF, 6~9:hD,sD,H,R, 10~12:LL,RR,DD @@ -45,6 +46,7 @@ FCL={ FCL[2]=FCL[1] FCL[4]=FCL[3] FCL[5]=FCL[3] +clearScore={[0]=0,0,10,30,100} function ifoverlapAI(f,bk,x,y) if y<1 then return true end if y>#f then return nil end @@ -63,7 +65,8 @@ function resetField(f0,f,start) end end end -function getScore(field,cb,cx,cy) +function getScore(field,bn,cb,cx,cy) + local score=0 local highest=0 local height=getNewRow() local rough=0 @@ -94,20 +97,28 @@ function getScore(field,cb,cx,cy) end end end + local h1,mh1=0,0 for x=1,9 do local dh=abs(height[x]-height[x]) if dh>1 then rough=rough+min(dh^1.5,10) + elseif dh==1 then + h1=h1+1 + if h1>mh1 then mh1=h1 end + else + h1=0 end end ins(freeRow,height) - return - -highest*5 - -rough*20 - -cy*20 - -#cb*10 - +clear^2*4 - -hole*25 + score= + -cy*20 + -rough*20 + -#cb*10 + +clearScore[clear] + -hole*30 + if #field>6 then score=score-highest*5 end + if mh1>3 then score=score-50-mh1*40 end + return score end function AI_getControls(ctrl) local Tfield={}--test field @@ -137,7 +148,7 @@ function AI_getControls(ctrl) end end end--simulate lock - local score=getScore(Tfield,cb,cx,cy) + local score=getScore(Tfield,bn,cb,cx,cy) if score>best.score then best={bn=bn,x=cx,dir=dir,hold=ifhold==1,score=score} end diff --git a/call&sys.lua b/call&sys.lua index c2a48a5b..39019bd4 100644 --- a/call&sys.lua +++ b/call&sys.lua @@ -339,7 +339,6 @@ function love.keypressed(i) elseif i=="escape"or i=="back"then back() else buttonControl_key(i) end - if i=="f12"then devMode=true end end function love.keyreleased(i) @@ -416,6 +415,7 @@ function love.receiveData(id,data) return nil end function love.draw() + gc.clear() Pnt.BG[curBG]() gc.setColor(1,1,1,.3) for n=1,#BGblock do @@ -435,12 +435,6 @@ function love.draw() end if sceneSwaping then sceneSwaping.draw()end - gc.setColor(0,0,0) - if screenM>0 then - gc.rectangle("fill",0,0,1280,-screenM) - gc.rectangle("fill",0,720,1280,screenM) - end--Draw black side - setFont(20)gc.setColor(1,1,1) gc.print(tm.getFPS(),0,700) if devMode then @@ -449,18 +443,23 @@ function love.draw() end --if gcinfo()>500 then collectgarbage()end end -function love.resize(x,y) - screenK=1280/gc.getWidth() - screenM=(gc.getHeight()*16/9-gc.getWidth())/2 - gc.origin() - gc.scale(1/screenK,1/screenK) - gc.translate(0,screenM) +function love.resize(w,h) + ww,wh=w,h + xOy:release() + ScreenK=h/w>=.5625 and w/1280 or h/720 + xOy=love.math.newTransform(0,0,nil,ScreenK,nil,640,360,nil,nil) + xOy:translate(640,360) + if h/w>=.5625 then + xOy:translate(0,h-w*.5625) + else + xOy:translate(w-h*16/9,0) + end + gc.replaceTransform(xOy) end function love.run() local frameT=Timer() local readyDrawFrame=0 - tm.step() - love.resize(nil,gc.getHeight()) + love.resize(gc.getWidth(),gc.getHeight()) game.load()--System scene Launch math.randomseed(os.time()*626) return function() @@ -480,7 +479,7 @@ function love.run() love.draw() gc.present() end - if not wd.hasFocus()then + if not(wd.hasFocus()or keeprun)then focus=false ms.setVisible(true) if bgmPlaying then bgm[bgmPlaying]:pause()end @@ -495,6 +494,7 @@ function love.run() else tm.sleep(.2) if wd.hasFocus()then + tm.step() focus=true ms.setVisible(false) if bgmPlaying then bgm[bgmPlaying]:play()end diff --git a/conf.lua b/conf.lua index d9705bcd..e0425e96 100644 --- a/conf.lua +++ b/conf.lua @@ -9,7 +9,7 @@ function love.conf(t) t.audio.mixwithsystem=true--Switch on to keep background music playing local W=t.window - W.title="Techmino V0.7.1" + W.title="Techmino V0.7.2" W.icon="/image/icon.png" W.width,W.height=1280,720 W.borderless=X diff --git a/gamefunc.lua b/gamefunc.lua index a5051dbc..c3ffcc0c 100644 --- a/gamefunc.lua +++ b/gamefunc.lua @@ -1,6 +1,5 @@ function resetGameData() players={alive={}} - royaleMode=false loadmode[gamemode]() frame=0 @@ -18,7 +17,7 @@ function resetGameData() freeRow={} collectgarbage() - for i=1,50*#players do + for i=1,40*#players do freeRow[i]={0,0,0,0,0,0,0,0,0,0} end end @@ -42,7 +41,7 @@ function createPlayer(id,x,y,size,AIspeed,data) P.control=false P.timing=false P.time=0 - P.cstat={key=0,piece=0,row=0,atk=0,techrash=0}--Current gamestat + P.cstat={key=0,piece=0,row=0,atk=0,techrash=0,pc=0}--Current gamestat P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0 P.dropTime={}for i=1,10 do P.dropTime[i]=-1e5 end P.dropSpeed=0 @@ -67,14 +66,15 @@ function createPlayer(id,x,y,size,AIspeed,data) P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock P.freshTime=0 P.lastSpin=false + if P.gameEnv.sequence<5 then + local bag1={1,2,3,4,5,6,7} + for i=1,7 do + P.nxt[i]=rem(bag1,rnd(#bag1)) + P.nb[i]=blocks[P.nxt[i]][0] + end--First bag + end - local bag1={1,2,3,4,5,6,7} - for i=1,7 do - P.nxt[i]=rem(bag1,rnd(#bag1)) - P.nb[i]=blocks[P.nxt[i]][0] - end--First bag - - P.freshNext=randomMethod[P.gameEnv.sequence] + P.freshNext=freshMethod[P.gameEnv.sequence] if P.gameEnv.sequence==1 then P.bag={}--Bag7 elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.nxt[i+3]end--History4 elseif P.gameEnv.sequence==3 then--Pure random @@ -237,7 +237,7 @@ function spin(d,ifpre) if bn==6 then freshgho()--May cancel spinLast freshLockDelay() - 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") + SFX(ifpre and"prerotate"or"rotate") if id==1 then stat.rotate=stat.rotate+1 end @@ -297,9 +297,9 @@ function hold(ifpre) end end function drop() - if cy==y_img then - ins(dropTime,1,frame)rem(dropTime,11)--update speed dial - P.waiting=gameEnv.wait + if P.cy==P.y_img then + ins(P.dropTime,1,frame)rem(P.dropTime,11)--update speed dial + P.waiting=P.gameEnv.wait local dospin=bn~=6 and ifoverlap(cb,cx-1,cy)and ifoverlap(cb,cx+1,cy)and ifoverlap(cb,cx,cy+1)and 1 or 0 if bn<6 and spinLast then @@ -318,16 +318,16 @@ function drop() if dospin==0 then dospin=false end lock() local cc,csend,exblock,sendTime=checkrow(cy,r),0,0,0--Currect clear&send&sendTime - local mini=bn~=7 and dospin==1 and cc<3 and cc500 then + if b2b>480 then showText("Techrash B2B2B","fly",70) csend=6 sendTime=80 exblock=exblock+1 - elseif b2b>=100 then + elseif b2b>=30 then showText("Techrash B2B","drive",70) sendTime=70 csend=5 @@ -340,11 +340,11 @@ function drop() P.cstat.techrash=P.cstat.techrash+1 elseif cc>0 then if dospin then - if b2b>500 then + if b2b>480 then showText(spinName[cc][bn].." B2B2B","spin",40) csend=b2bATK[cc]+1 exblock=exblock+1 - elseif b2b>=100 then + elseif b2b>=30 then showText(spinName[cc][bn].." B2B","spin",40) csend=b2bATK[cc] else @@ -354,17 +354,18 @@ function drop() sendTime=20+csend*20 if mini then showText("Mini","drive",40,10) + csend=ceil(csend*.5) sendTime=sendTime+60 - P.b2b=P.b2b+90+10*cc + P.b2b=P.b2b+b2bPoint[cc]*.8 else - P.b2b=P.b2b+70+30*cc + P.b2b=P.b2b+b2bPoint[cc] end SFX(spin_n[cc]) if id==1 then stat.spin=stat.spin+1 end elseif #clearing<#field then - P.b2b=P.b2b-300 + P.b2b=P.b2b-150-cc*50 showText(clearName[cc],"appear",50) csend=cc-1 sendTime=20+csend*20 @@ -374,19 +375,20 @@ function drop() if dospin then showText(spinName[0][bn],"appear",50) SFX("spin_0") - P.b2b=b2b+30 + P.b2b=P.b2b+15 end end if cc>0 and #clearing==#field then showText("Perfect Clear","flicker",70,-80) - csend=csend+5 + csend=csend+min(6+P.cstat.pc,10) exblock=exblock+2 sendTime=sendTime+30 SFX("perfectclear") if cstat.piece>10 then - P.b2b=600 + P.b2b=300 end + P.cstat.pc=P.cstat.pc+1 end csend=csend+(renATK[combo]or 4) @@ -433,10 +435,8 @@ function drop() end end elseif cc==0 then - if P.b2b>450 then - P.b2b=b2b-10 - elseif P.b2b>100 then - P.b2b=max(b2b-6,100) + if P.b2b>480 then + P.b2b=max(P.b2b-40,480) end garbageRelease() end @@ -446,8 +446,8 @@ function drop() P.cstat.piece,P.cstat.row=P.cstat.piece+1,P.cstat.row+cc if P.cstat.row>=gameEnv.target then gameEnv.reach() - if control then SFX("reach")end end + P.spinLast=dospin and cc>0 else P.cy=cy-1 P.spinLast=false diff --git a/list.lua b/list.lua index c7d9c74a..2aa2fa8a 100644 --- a/list.lua +++ b/list.lua @@ -1,3 +1,32 @@ +--[["four name" + Techrash + Techmino + Tequéno + Zestris + Quadruple + Tequeno + Techzino + Tectris +]] +PCbase={ + {3,3,3,0,0,0,0,0,2,2}, + {3,6,6,0,0,0,0,2,2,5}, + {4,6,6,0,0,0,1,1,5,5}, + {4,4,4,0,0,0,0,1,1,5}, + {1,1,0,0,0,0,0,3,3,3}, + {5,1,1,0,0,0,0,6,6,3}, + {5,5,2,2,0,0,0,6,6,4}, + {5,2,2,0,0,0,0,4,4,4}, +} +PClist={--ZSLJTOI + {7,7,4,5},{7,7,6,4},{7,7,2,4},{7,7,1,3},{7,4,1,2},{7,3,5,7},{7,7,5,6},{7,7,5,2}, + {7,5,4,3},{7,5,1,2},{7,1,4,2},{7,4,2,5},{7,6,4,5},{7,5,4,2},{7,5,6,4},{7,5,3,6}, + {7,2,5,6},{7,2,1,3},{7,2,6,4},{7,5,2,7},{7,3,1,5},{7,3,2,5},{7,4,1,5},{7,4,2,5}, + {7,7,3,6},{7,3,7,6},{7,3,6,2},{7,3,7,1},{7,6,4,2},{3,2,7,6},{7,5,3,4},{7,3,6,5}, + {7,3,2,5},{7,4,6,5},{7,6,4,5},{7,5,2,3},{7,3,5,7},{7,3,2,5},{7,3,5,1},{7,5,2,3}, + {3,6,2,5},{3,1,2,5},{3,5,1,2},{4,5,3,2},{4,2,6,5},{6,5,3,2},{1,4,2,5},{1,5,3,6}, + {5,2,6,3},{5,2,1,3},{2,4,1,5},{2,4,5,1},{2,1,4,5},{2,5,4,3},{2,5,6,7},{7,5,4,2}, +} color={ red={1,0,0}, green={0,1,0}, @@ -112,8 +141,8 @@ prevMenu={ main="quit", } -modeID={"sprint","marathon","zen","infinite","solo","death","blind","puzzle","techmino41","asymsolo","gmroll","p2","p3","p4"} -modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","Blind","Puzzle","Techmino 41","Asymmetry solo","GM roll","2P","3P","4P"} +modeID={"sprint","marathon","zen","infinite","solo","death","tsd","blind","pc","techmino41","techmino99","gmroll","p2","p3","p4"} +modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","TSD-only","Blind","PC Puzzle","Techmino41","Techmino99","GM roll","2P","3P","4P"} modeInfo={ sprint="Clear 40 Lines", marathon="Clear 200 Lines", @@ -121,10 +150,11 @@ modeInfo={ infinite="Infinite game,infinite happiness", solo="Beat AI", death="Survive under terrible speed", + tsd="T-spin-double Only!", blind="Invisible board!", - puzzle="Your keyboard broke", + pc="Make as much PCs as you can", techmino41="Melee fight with 40 AIs", - asymsolo=" See-->", + techmino99="Melee fight with 98 AIs", gmroll="Who want to be the grand master?", p2="2 players game", p3="3 players game", @@ -189,6 +219,7 @@ actName_show={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate blockPos={4,4,4,4,4,5,4} renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else renName={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB",} +b2bPoint={50,90,150} b2bATK={3,5,8} spin_n={"spin_1","spin_2","spin_3"} @@ -200,6 +231,9 @@ marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0} death_lock={10,9,9,8,8} death_wait={6,6,5,5,4} death_fall={10,9,8,7,6} +pc_drop={50,40,30,22,16,12,10,8,6,5,4,3,2,1} +pc_lock={50,40,32,25,20,17,15,12,10} +pc_fall={18,16,14,12,10,9,8,7,6,5} snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"} snapLevelValue={1,10,20,40,60,80} @@ -333,10 +367,10 @@ TRS={ [5]={ [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{-1,-1},{0,1}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1},{1,1}}, - [12]={{0,0},{1,0},{1,-1},{0,-1},{-1,-1},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{1,1},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{-1,1},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{0,-1},{1,-1},{0,2},{-1,2}}, + [12]={{0,0},{1,0},{1,-1},{0,-1},{0,2},{1,2},{-1,-1}}, + [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{1,1}}, + [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{-1,1}}, + [32]={{0,0},{-1,0},{-1,-1},{0,-1},{0,2},{-1,2},{1,-1}}, [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, @@ -525,7 +559,7 @@ Text={ "Author:MrZ E-mail:1046101471@qq.com", "Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ", "Tool used:VScode,GFIE,Beepbox,Goldwave", - "Special thanks:farter,teatube,flyz,and YOU!!", + "Special thanks:farter,teatube,flyz,t830,[all test staff] and YOU!!", "Any bugs/suggestions to my E-mail.", }, } \ No newline at end of file diff --git a/main.lua b/main.lua index f81438e0..c2ebfd44 100644 --- a/main.lua +++ b/main.lua @@ -1,4 +1,14 @@ -gc,kb,ms,tc,tm,fs,wd,sys=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window,love.system +lib={ + gc=love.graphics, + kb=love.keyboard, + ms=love.mouse, + tc=love.touch, + tm=love.timer, + fs=love.filesystem, + wd=love.window, + mt=love.math, + sys=love.system, +}for k,v in pairs(lib)do _G[k]=v end lib=nil toN,toS=tonumber,tostring 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 sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char @@ -8,6 +18,7 @@ null=function()end ww,wh=gc.getWidth(),gc.getHeight() Timer=tm.getTime--Easy&Quick to get time! mx,my,mouseShow=-20,-20,false +xOy=love.math.newTransform() focus=true system=sys.getOS() @@ -74,18 +85,16 @@ customSel={ freshLimit=3, opponent=1, } -randomMethod={ +freshMethod={ function() P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1) if #P.nxt<6 then local bag={1,2,3,4,5,6,7} for i=1,7 do ins(P.nxt,rem(bag,rnd(8-i))) + ins(P.nb,blocks[P.nxt[#P.nxt]][0]) end end - for i=6,#P.nxt do - P.nb[i]=blocks[P.nxt[i]][0] - end end, function() P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1) @@ -101,6 +110,38 @@ randomMethod={ repeat i=rnd(7)until i~=P.nxt[5] P.nxt[6],P.nb[6]=i,blocks[i][0] end, + function() + P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1) + if #P.nxt<6 then + local bag={1,2,3,4,5,6,7} + for i=1,7 do + ins(P.nxt,rem(bag,rnd(8-i))) + ins(P.nb,blocks[P.nxt[#P.nxt]][0]) + end + if rnd()>.4 then + ins(P.nxt,5) + ins(P.nb,blocks[5][0]) + end + end + end, + function() + P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1) + if P.cstat.piece%4==0 then + local r=rnd(#PClist) + local P=players[1] + local f=P.cstat.pc%2==0 + for i=1,4 do + local b=PClist[r][i] + if f then + if b<3 then b=3-b + elseif b<5 then b=7-b + end + end + ins(P.nxt,b) + ins(P.nb,blocks[b][0]) + end + end + end, } loadmode={ sprint=function() @@ -176,39 +217,86 @@ loadmode={ curBG="game2" BGM("push") end, - puzzle=function() + tsd=function() modeEnv={ - hold=false, - das=0, - arr=0, - _20G=true, - drop=0, - lock=1e99, - fall=10, - target=40, - reach=Event.gameover.win, + drop=60, + lock=60, + sequence=4, + target=1, + reach=Event.tsd_reach, + freshLimit=10, } createPlayer(1,340,15) - curBG="glow" - BGM("way") + curBG="matrix" + BGM("infinite") + end, + pc=function() + modeEnv={ + next=4, + hold=false, + drop=60, + lock=60, + fall=20, + sequence=5, + target=0, + reach=Event.newPC, + freshLimit=5, + } + createPlayer(1,340,15) + local r=rnd(#PClist) + local P=players[1] + for i=1,4 do + local b=PClist[r][i] + ins(P.nxt,b) + ins(P.nb,blocks[b][0]) + end + Event.newPC() + curBG="matrix" + BGM("infinite") end, techmino41=function() modeEnv={ freshLimit=15, + royaleMode=true, + royale={2,5,10,20}, } - royaleMode=true createPlayer(1,340,15)--Player local n=2 for i=1,4 do for j=1,5 do - createPlayer(n,75*i-48,142*j-130,.19,1+rnd(14)) + createPlayer(n,75*i-48,142*j-130,.19,rnd(15)) n=n+1 end end for i=9,12 do for j=1,5 do - createPlayer(n,75*i+292,142*j-130,.19,1+rnd(14)) + createPlayer(n,75*i+292,142*j-130,.19,rnd(15)) + n=n+1 + end + end--AIs + + curBG="game3" + BGM("race") + end, + techmino99=function() + modeEnv={ + freshLimit=15, + royaleMode=true, + royale={2,6,14,30}, + } + createPlayer(1,340,15)--Player + + local n=2 + for i=1,7 do + for j=1,7 do + createPlayer(n,46*i-36,97*j-72,.135,rnd()<.1 and rnd(4)or rnd(10,20)) + n=n+1 + end + end + for i=15,21 do + for j=1,7 do + createPlayer(n,46*i+264,97*j-72,.135,rnd()<.1 and rnd(4)or rnd(10,20)) n=n+1 end end--AIs @@ -238,17 +326,6 @@ loadmode={ curBG="glow" BGM("push") end, - asymsolo=function() - modeEnv={ - visible=2, - freshLimit=15, - } - createPlayer(1,20,15)--Player - createPlayer(2,660,85,.9,2)--AI - - curBG="game2" - BGM("race") - end, p2=function() modeEnv={ freshLimit=15, @@ -326,10 +403,13 @@ Event={ P.waiting=1e99 P.b2b=0 showText("LOSE","appear",100,nil,true) - if royaleMode and P.lastRecv then + if modeEnv.royaleMode and P.lastRecv then throwBadge(P.id,P.lastRecv,P.badge) players[P.lastRecv].badge=players[P.lastRecv].badge+P.badge+1 - players[P.lastRecv].strength=min(int(players[P.lastRecv].badge*.2),4) + local atker=players[P.lastRecv] + while atker.strength<4 and atker.badge>modeEnv.royale[atker.strength+1]do + atker.strength=atker.strength+1 + end end for i=1,#players.alive do if players.alive[i]==P.id then @@ -354,13 +434,14 @@ Event={ end, }, marathon_reach=function() - local s=int(P.cstat.row*.1) + local s=int(cstat.row*.1) if s>=20 then Event.gameover.win() else gameEnv.drop=marathon_drop[s] if s==18 then gameEnv._20G=true end gameEnv.target=s*10+10 + SFX("reach") end end, death_reach=function() @@ -376,6 +457,32 @@ Event={ SFX("reach") end end, + tsd_reach=function() + P.gameEnv.target=P.gameEnv.target+2 + if not(#clearing==2 and bn==5 and P.spinLast)then + Event.gameover.lose() + end + end, + newPC=function() + local P=players[1] + if #P.field==#P.clearing then + P.counter=P.cstat.piece==0 and 19 or 0 + ins(P.task,Event.task.PC) + local s=P.cstat.pc*.5 + if int(s)==s and s>0 then + P.gameEnv.drop=pc_drop[s]or 0 + P.gameEnv.lock=pc_lock[s]or 10 + P.gameEnv.fall=pc_fall[s]or 5 + if s==15 then + showText("Max speed","appear",80,-120) + else + showText("Speed up","appear",30,-130) + end + end + else + Event.gameover.lose() + end + end, task={ winTrigger=function() Event.gameover.win() @@ -419,6 +526,30 @@ Event={ end end end, + garbagepush=function() + + end, + PC=function() + local P=players[1] + P.counter=P.counter+1 + if P.counter==21 then + gameEnv.target=gameEnv.target+4 + local t=P.cstat.pc%2 + for i=1,4 do + local r=getNewRow() + for j=1,10 do + r[j]=PCbase[4*t+i][j] + end + ins(P.field,1,r) + ins(P.visTime,1,getNewRow(P.showTime)) + end + P.fieldBeneath=P.fieldBeneath+120 + -- P.cy=P.cy+4 + P.y_img=P.y_img+4 + freshgho() + return true + end + end, }, } mesDisp={ @@ -439,11 +570,17 @@ mesDisp={ gc.print("Attack",-100,360) gc.print("Efficiency",-108,472) end, + solo=function() + setFont(50) + mStr(cstat.atk,-75,320) + setFont(20) + gc.print("Attack",-100,360) + end, gmroll=function() - setFont(30) - gc.print("Techrash",-130,390) + setFont(25) + gc.print("Techrash",-120,420) setFont(80) - mStr(cstat.techrash,-75,420) + mStr(cstat.techrash,-75,350) end, marathon=function() setFont(50) @@ -457,9 +594,17 @@ mesDisp={ mStr(gameEnv.target,-75,380) gc.rectangle("fill",-120,376,90,4) end, - puzzle=function() - setFont(75) - mStr(max(40-P.cstat.row,0),-75,280) + tsd=function() + setFont(35) + gc.print("TSD",-105,405) + setFont(80) + mStr((P.gameEnv.target-1)*.5,-75,330) + end, + pc=function() + setFont(25) + gc.print("Perfect Clear",-138,400) + setFont(80) + mStr(cstat.pc,-75,330) end, techmino41=function() gc.draw(badgeIcon,-120,150,nil,1.5) @@ -471,23 +616,23 @@ mesDisp={ gc.print("Attack",-100,360) gc.print("Remain",-105,472) end, + techmino99=function() + gc.draw(badgeIcon,-120,150,nil,1.5) + setFont(50) + gc.print(badge,-65,150) + mStr(cstat.atk,-75,320) + mStr(#players.alive,-75,430) + setFont(20) + gc.print("Attack",-100,360) + gc.print("Remain",-105,472) + end, blind=function() - setFont(30) - gc.print("Rows",-110,220) - gc.print("Techrash",-130,390) + setFont(25) + gc.print("Rows",-100,300) + gc.print("Techrash",-120,420) setFont(80) - mStr(P.cstat.row,-75,250) - mStr(cstat.techrash,-75,420) - end, - solo=function() - gc.print("Attack",-128,365) - setFont(80) - mStr(cstat.atk,-75,300) - end, - asymsolo=function() - gc.print("Attack",-128,365) - setFont(80) - mStr(cstat.atk,-75,300) + mStr(P.cstat.row,-75,230) + mStr(cstat.techrash,-75,350) end, custom=function() if gameEnv.target<1e4 then @@ -559,9 +704,8 @@ stat={ spin=0, } --User Data&User Setting ---------------------------------Wrning!_G __index Ply[n] when chng any playr's elments! +--------------------------------Wrning!_G __index Plyr[n] when chng any playr's val! require("toolfunc") -require("sysfunc") require("gamefunc") require("list") require("texture") diff --git a/paint.lua b/paint.lua index ece766d1..ff1a182f 100644 --- a/paint.lua +++ b/paint.lua @@ -193,7 +193,8 @@ end function Pnt.BG.matrix() for i=0,15 do for j=0,8 do - local t=sin(Timer()*((2.468*i-1.357*j)%3))*.3 + -- local t=sin(Timer()*((2.468*i-1.357*j)%3))*.3 + local t=(sin((mt.noise(i,j)+2)*Timer())+1)*.2 gc.setColor(t,t,t) gc.rectangle("fill",80*i,80*j,80,80) end @@ -214,13 +215,14 @@ end function Pnt.main() gc.setColor(1,1,1) setFont(30) - gc.print("Alpha V0.7.1",370,150) + gc.print("Alpha V0.7.2",370,150) gc.print(system,530,110) gc.draw(titleImage,30,30) end function Pnt.mode() setFont(30) - mStr(modeInfo[modeID[modeSel]],270,300) + gc.setColor(color.white) + mStr(modeInfo[modeID[modeSel]],270,305) setFont(80) gc.setColor(color.grey) mStr(modeName[modeSel],643,283) @@ -283,31 +285,6 @@ function Pnt.play() gc.setColor(1,1,1,min(P.counter,60)*.01) setFont(100) mStr(P.result,150,250) - else - local h=0 - for i=1,#atkBuffer do - local a=atkBuffer[i] - local bar=a.amount*30 - if not a.sent then - if a.countdown>0 then - gc.setColor(attackColor[a.lv][1]) - gc.rectangle("fill",315,600-h,8,-bar+5) - gc.setColor(attackColor[a.lv][2]) - gc.rectangle("fill",315,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0)) - --Timing - else - attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5) - gc.rectangle("fill",315,600-h,8,-bar+5) - --Warning - end - end - h=h+bar - if h>600 then break end - end--Buffer line - - gc.setColor(b2b<100 and color.white or b2b<=480 and color.lightRed or color.lightBlue) - gc.rectangle("fill",-15,600,10,-b2b) - --B2B bar end gc.pop() else @@ -394,12 +371,12 @@ function Pnt.play() if h>600 then break end end--Buffer line - gc.setColor(b2b<100 and color.white or b2b<=500 and color.lightRed or color.lightBlue) + gc.setColor(b2b<40 and color.white or b2b<=480 and color.lightRed or color.lightBlue) gc.rectangle("fill",-17,600,10,-b2b1) gc.setColor(color.red) - gc.rectangle("fill",-23,600-100,16,5) + gc.rectangle("fill",-23,600-40,16,5) gc.setColor(color.blue) - gc.rectangle("fill",-23,600-500,16,5) + gc.rectangle("fill",-23,600-480,16,5) --B2B bar setFont(40) @@ -415,7 +392,7 @@ function Pnt.play() end end--Hold gc.print("Next",336,0) - for N=1,gameEnv.next do + for N=1,min(gameEnv.next,#nxt)do local b=nb[N] for i=1,#b do for j=1,#b[1] do diff --git a/scene.lua b/scene.lua index 13b9d0e6..57b26acc 100644 --- a/scene.lua +++ b/scene.lua @@ -2,17 +2,15 @@ game={} function game.load() scene="load" curBG="none" + keeprun=true loading=1--Loading mode loadnum=1--Loading counter loadprogress=0--Loading bar end -function game.intro() - scene="intro" - curBG="none" -end function game.main() scene="main" curBG="none" + keeprun=false BGM("blank") collectgarbage() end diff --git a/timer.lua b/timer.lua index f9ed2371..68545601 100644 --- a/timer.lua +++ b/timer.lua @@ -190,10 +190,7 @@ function Tmr.play(dt) end end end - P.b2b1=P.b2b1*.93+P.b2b*.07 - if P.b2b>500 then - P.b2b=P.b2b-.06 - end + P.b2b1=P.b2b1*.92+P.b2b*.08 --Alive else P.keySpeed=keySpeed*.96+cstat.key/time*60*.04 diff --git a/toolfunc.lua b/toolfunc.lua index c229771e..fe0e744e 100644 --- a/toolfunc.lua +++ b/toolfunc.lua @@ -15,9 +15,11 @@ function without(t,v) end return true end -function mStr(s,x,y)gc.printf(s,x-500,y,1000,"center")end +function mStr(s,x,y) + gc.printf(s,x-500,y,1000,"center") +end function convert(x,y) - return x*screenK,(y-screenM)*screenK + return xOy:inverseTransformPoint(x,y) end function getNewRow(val) @@ -63,4 +65,204 @@ end function stencil_field_small() gc.rectangle("fill",0,0,300,600) end ---Single use \ No newline at end of file +--Single use + +function sysSFX(s,v) + if setting.sfx then + local n=1 + while sfx[s][n]:isPlaying()do + n=n+1 + if not sfx[s][n]then + sfx[s][n]=sfx[s][n-1]:clone() + sfx[s][n]:seek(0) + end + end + sfx[s][n]:setVolume(v or 1) + sfx[s][n]:play() + end +end +function SFX(s,v) + if setting.sfx and not P.ai then + local n=1 + while sfx[s][n]:isPlaying()do + n=n+1 + if not sfx[s][n]then + sfx[s][n]=sfx[s][n-1]:clone() + sfx[s][n]:seek(0) + break + end + end + sfx[s][n]:setVolume(v or 1) + sfx[s][n]:play() + end +end +function BGM(s) + if setting.bgm and bgmPlaying~=s then + for k,v in pairs(bgm)do v:stop()end + if s then bgm[s]:play()end + bgmPlaying=s + end +end +function gotoScene(s,style) + if not sceneSwaping and s~=scene then + style=style or"deck" + sceneSwaping={ + tar=s,style=style, + time=swap[style][1],mid=swap[style][2], + draw=swap[style].d + } + Buttons.sel=nil + end +end +function startGame(mode) + --rec="" + gamemode=mode + gotoScene("play") +end +function back() + local t=prevMenu[scene] + if type(t)=="string"then + gotoScene(t) + else + t() + end +end +function loadData() + userData:open("r") + --local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n") + local t=string.splitS(userData:read(),"\r\n") + userData:close() + for i=1,#t do + local i=t[i] + if find(i,"=")then + local t=sub(i,1,find(i,"=")-1) + local v=sub(i,find(i,"=")+1) + if 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 + end + end + end +end +function saveData() + local t=table.concat({ + stringPack("run=",stat.run), + stringPack("game=",stat.game), + stringPack("gametime=",stat.gametime), + stringPack("piece=",stat.piece), + stringPack("row=",stat.row), + stringPack("atk=",stat.atk), + stringPack("key=",stat.key), + stringPack("rotate=",stat.rotate), + stringPack("hold=",stat.hold), + stringPack("spin=",stat.spin), + },"\r\n") + --t=love.math.compress(t,"zlib"):getString() + userData:open("w") + userData:write(t) + userData:close() +end +function loadSetting() + userSetting:open("r") + --local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n") + local t=string.splitS(userSetting:read(),"\r\n") + userSetting:close() + for i=1,#t do + local i=t[i] + if find(i,"=")then + local t=sub(i,1,find(i,"=")-1) + local v=sub(i,find(i,"=")+1) + if t=="sfx"or t=="bgm"then + setting[t]=v=="true" + elseif t=="fullscreen"then + setting.fullscreen=v=="true" + love.window.setFullscreen(setting.fullscreen) + elseif t=="bgblock"then + setting.bgblock=v=="true" + elseif t=="keymap"then + v=string.splitS(v,"/") + for i=1,16 do + local v1=string.splitS(v[i],",") + for j=1,#v1 do + setting.keyMap[i][j]=v1[j] + end + end + elseif t=="keylib"then + v=string.splitS(v,"/") + for i=1,4 do + local v1=string.splitS(v[i],",") + for j=1,#v1 do + setting.keyLib[i][j]=toN(v1[j]) + end + for j=1,#setting.keyLib[i]do + local v=setting.keyLib[i][j] + if int(v)~=v or v>=9 or v<=0 then + setting.keyLib[i]={i} + break + end + end + end + elseif t=="virtualkey"then + v=string.splitS(v,"/") + for i=1,9 do + virtualkey[i]=string.splitS(v[i],",") + for j=1,4 do + virtualkey[i][j]=toN(virtualkey[i][j]) + end + end + elseif t=="virtualkeyAlpha"then + setting.virtualkeyAlpha=int(abs(toN(v))) + elseif t=="virtualkeyIcon"then + setting.virtualkeyIcon=v=="true" + elseif t=="virtualkeySwitch"then + setting.virtualkeySwitch=v=="true" + elseif t=="frameMul"then + v=min(max(toN(v)or 100,0),100) + setting.frameMul=v + elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then + v=toN(v)if not v or v<0 then v=0 end + setting[t]=int(v) + elseif t=="ghost"or t=="center"then + setting[t]=v=="true" + end + end + end +end +function saveSetting() + local vk={} + for i=1,9 do + for j=1,4 do + virtualkey[i][j]=int(virtualkey[i][j]+.5) + end--Saving a integer is better? + vk[i]=table.concat(virtualkey[i],",") + end--pre-pack virtualkey setting + local map={} + for i=1,16 do + map[i]=table.concat(setting.keyMap[i],",") + end + local lib={} + for i=1,4 do + lib[i]=table.concat(setting.keyLib[i],",") + end + local t=table.concat({ + stringPack("sfx=",setting.sfx), + stringPack("bgm=",setting.bgm), + stringPack("fullscreen=",setting.fullscreen), + stringPack("bgblock=",setting.bgblock), + stringPack("das=",setting.das), + stringPack("arr=",setting.arr), + stringPack("sddas=",setting.sddas), + stringPack("sdarr=",setting.sdarr), + stringPack("keymap=",table.concat(map,"/")), + stringPack("keylib=",table.concat(lib,"/")), + stringPack("virtualkey=",table.concat(vk,"/")), + stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha), + stringPack("virtualkeyIcon=",setting.virtualkeyIcon), + stringPack("virtualkeySwitch=",setting.virtualkeySwitch), + stringPack("frameMul=",setting.frameMul), + },"\r\n") + --t=love.math.compress(t,"zlib"):getString() + userSetting:open("w") + userSetting:write(t) + userSetting:close() +end \ No newline at end of file