diff --git a/BGM/blank.ogg b/BGM/blank.ogg index 8f86f2b9..eb8f33b1 100644 Binary files a/BGM/blank.ogg and b/BGM/blank.ogg differ diff --git a/class.lua b/class.lua index 8d56f4f6..6fc8139a 100644 --- a/class.lua +++ b/class.lua @@ -70,7 +70,7 @@ function button:draw() end end function button:getInfo() - print(format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x,self.y,self.w,self.h,self.font)) + print(format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font)) end local switch={type="switch"} diff --git a/conf.lua b/conf.lua index a8ad05dd..2677dbd5 100644 --- a/conf.lua +++ b/conf.lua @@ -1,4 +1,5 @@ -gameVersion="Alpha V0.7.28" +math.randomseed(os.time()) +gameVersion="Alpha V0.7.30" function love.conf(t) t.identity="Techmino"--Save directory name t.version="11.1" @@ -9,7 +10,12 @@ function love.conf(t) t.audio.mixwithsystem=true--Switch on to keep sysBGM local W=t.window - W.title=math.random()>.01 and "Techmino "..gameVersion or"MrZ NB!" + if math.random()>.26 then + W.title="Techmino "..gameVersion + else + math.randomseed(tonumber(os.date("%Y%j"))) + W.title="Your lucky number today:"..math.random(100,626) + end 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 1fc07f93..4535fe47 100644 --- a/dataList.lua +++ b/dataList.lua @@ -63,252 +63,251 @@ local function AITemplate(type,speedLV,next,hold,node) } end end -loadmode={ - sprint=function() - newPlayer(1,340,15) - end, - marathon=function() - newPlayer(1,340,15) - end, - master=function() - newPlayer(1,340,15) - end, - classic=function() - newPlayer(1,340,15) - end, - zen=function() - newPlayer(1,340,15) - end, - infinite=function() - newPlayer(1,340,15) - if curMode.lv==2 then - pushSpeed=1 - for i=1,5 do - players[1]:garbageRise(10,1,rnd(10)) - end - end - end, - solo=function() - newPlayer(1,340,15) - if curMode.lv==1 then - newPlayer(2,965,360,.5,AITemplate("9S",3)) - elseif curMode.lv==2 then - newPlayer(2,965,360,.5,AITemplate("CC",2,2,false,10000)) - elseif curMode.lv==3 then - newPlayer(2,965,360,.5,AITemplate("9S",6)) - elseif curMode.lv==4 then - newPlayer(2,965,360,.5,AITemplate("CC",5,2,true,20000)) - elseif curMode.lv==5 then - newPlayer(2,965,360,.5,AITemplate("9S",9)) - elseif curMode.lv==6 then - newPlayer(2,965,360,.5,AITemplate("CC",8,3,true,30000)) - elseif curMode.lv==7 then - newPlayer(2,965,360,.5,AITemplate("9S",10)) - elseif curMode.lv==8 then - newPlayer(2,965,360,.5,AITemplate("CC",9,3,true,40000)) - elseif curMode.lv==9 then - newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,80000)) - end - end, - round=function() - newPlayer(1,340,15) - if curMode.lv==1 then - newPlayer(2,965,360,.5,AITemplate("9S",10)) - elseif curMode.lv==2 then - newPlayer(2,965,360,.5,AITemplate("CC",10,2,false,10000)) - elseif curMode.lv==3 then - newPlayer(2,965,360,.5,AITemplate("CC",10,3,true,30000)) - elseif curMode.lv==4 then - newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,60000)) - elseif curMode.lv==5 then - newPlayer(2,965,360,.5,AITemplate("CC",10,6,true,100000)) - end - garbageSpeed=1e4 - end, - tsd=function() - newPlayer(1,340,15) - end, - blind=function() - newPlayer(1,340,15) - end, - dig=function() - newPlayer(1,340,15) +loadmode={} +function loadmode.sprint() + newPlayer(1,340,15) +end +function loadmode.marathon() + newPlayer(1,340,15) +end +function loadmode.master() + newPlayer(1,340,15) +end +function loadmode.classic() + newPlayer(1,340,15) +end +function loadmode.zen() + newPlayer(1,340,15) +end +function loadmode.infinite() + newPlayer(1,340,15) + if curMode.lv==2 then pushSpeed=1 - end, - survivor=function() - newPlayer(1,340,15) - pushSpeed=curMode.lv>2 and 2 or 1 - end, - defender=function() - newPlayer(1,340,15) - if curMode.lv==1 then - pushSpeed=1 - elseif curMode.lv==2 then - pushSpeed=2 + for _=1,5 do + players[1]:garbageRise(10,1,rnd(10)) end - end, - attacker=function() - newPlayer(1,340,15) - if curMode.lv==1 then - pushSpeed=2 + end +end +function loadmode.solo() + newPlayer(1,340,15) + if curMode.lv==1 then + newPlayer(2,965,360,.5,AITemplate("9S",3)) + elseif curMode.lv==2 then + newPlayer(2,965,360,.5,AITemplate("CC",2,2,false,10000)) + elseif curMode.lv==3 then + newPlayer(2,965,360,.5,AITemplate("9S",6)) + elseif curMode.lv==4 then + newPlayer(2,965,360,.5,AITemplate("CC",5,2,true,20000)) + elseif curMode.lv==5 then + newPlayer(2,965,360,.5,AITemplate("9S",9)) + elseif curMode.lv==6 then + newPlayer(2,965,360,.5,AITemplate("CC",8,3,true,30000)) + elseif curMode.lv==7 then + newPlayer(2,965,360,.5,AITemplate("9S",10)) + elseif curMode.lv==8 then + newPlayer(2,965,360,.5,AITemplate("CC",9,3,true,40000)) + elseif curMode.lv==9 then + newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,80000)) + end +end +function loadmode.round() + newPlayer(1,340,15) + if curMode.lv==1 then + newPlayer(2,965,360,.5,AITemplate("9S",10)) + elseif curMode.lv==2 then + newPlayer(2,965,360,.5,AITemplate("CC",10,2,false,10000)) + elseif curMode.lv==3 then + newPlayer(2,965,360,.5,AITemplate("CC",10,3,true,30000)) + elseif curMode.lv==4 then + newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,60000)) + elseif curMode.lv==5 then + newPlayer(2,965,360,.5,AITemplate("CC",10,6,true,100000)) + end + garbageSpeed=1e4 +end +function loadmode.tsd() + newPlayer(1,340,15) +end +function loadmode.blind() + newPlayer(1,340,15) +end +function loadmode.dig() + newPlayer(1,340,15) + pushSpeed=1 +end +function loadmode.survivor() + newPlayer(1,340,15) + pushSpeed=curMode.lv>2 and 2 or 1 +end +function loadmode.defender() + newPlayer(1,340,15) + if curMode.lv==1 then + pushSpeed=1 + elseif curMode.lv==2 then + pushSpeed=2 + end +end +function loadmode.attacker() + newPlayer(1,340,15) + if curMode.lv==1 then + pushSpeed=2 + end +end +function loadmode.tech() + newPlayer(1,340,15) +end +function loadmode.c4wtrain() + newPlayer(1,340,15) + local P=players[1] + local F=P.field + for i=1,24 do + F[i]=getNewRow(10) + P.visTime[i]=getNewRow(20) + for x=4,7 do F[i][x]=0 end + end + local r=rnd(6) + if r==1 then F[1][5],F[1][4],F[2][4]=10,10,10 + elseif r==2 then F[1][6],F[1][7],F[2][7]=10,10,10 + elseif r==3 then F[1][4],F[2][4],F[2][5]=10,10,10 + elseif r==4 then F[1][7],F[2][7],F[2][6]=10,10,10 + elseif r==5 then F[1][4],F[1][5],F[1][6]=10,10,10 + elseif r==6 then F[1][7],F[1][6],F[1][5]=10,10,10 + end +end +function loadmode.pctrain() + newPlayer(1,340,15) + Event.newPC(players[1]) +end +function loadmode.pcchallenge() + newPlayer(1,340,15) +end +function loadmode.techmino49() + newPlayer(1,340,15) + local LV=curMode.lv + if LV==3 then players[1].gameEnv.drop=15 end + local L={}for i=1,49 do L[i]=true end + local t=system~="Windows"and 0 or 2*LV + while t>0 do + local r=rnd(2,49) + if L[r]then L[r],t=false,t-1 end + end + local min,max + if LV==1 then min,max=4,6 + elseif LV==2 then min,max=4,8 + elseif LV==3 then min,max=8,10 + end + local n=2 + for i=1,4 do for j=1,6 do + if L[n]then + newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(min,max))) + else + newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) end - end, - tech=function() - newPlayer(1,340,15) - end, - c4wtrain=function() - newPlayer(1,340,15) - local P=players[1] - local F=P.field - for i=1,24 do - F[i]=getNewRow(10) - P.visTime[i]=getNewRow(20) - for x=4,7 do F[i][x]=0 end + n=n+1 + end end + for i=9,12 do for j=1,6 do + if L[n]then + newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(min,max))) + else + newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) end - local r=rnd(6) - if r==1 then F[1][5],F[1][4],F[2][4]=10,10,10 - elseif r==2 then F[1][6],F[1][7],F[2][7]=10,10,10 - elseif r==3 then F[1][4],F[2][4],F[2][5]=10,10,10 - elseif r==4 then F[1][7],F[2][7],F[2][6]=10,10,10 - elseif r==5 then F[1][4],F[1][5],F[1][6]=10,10,10 - elseif r==6 then F[1][7],F[1][6],F[1][5]=10,10,10 + n=n+1 + end end +end +function loadmode.techmino99() + newPlayer(1,340,15) + local LV=curMode.lv + if LV==3 then players[1].gameEnv.drop=15 end + local L={}for i=1,100 do L[i]=true end + local t=system~="Windows"and 0 or 1+3*LV + while t>0 do + local r=rnd(2,99) + if L[r]then L[r],t=false,t-1 end + end + local min,max + if LV==1 then min,max=4,6 + elseif LV==2 then min,max=4,8 + elseif LV==3 then min,max=8,10 + end + local n=2 + for i=1,7 do for j=1,7 do + if L[n]then + newPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(min,max))) + else + newPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) end - end, - pctrain=function() - newPlayer(1,340,15) - Event.newPC(players[1]) - end, - pcchallenge=function() - newPlayer(1,340,15) - end, - techmino49=function() - newPlayer(1,340,15) - local LV=curMode.lv - if LV==3 then players[1].gameEnv.drop=15 end - local L={}for i=1,49 do L[i]=true end - local t=system~="Windows"and 0 or 2*LV - while t>0 do - local r=rnd(2,49) - if L[r]then L[r],t=false,t-1 end + n=n+1 + end end + for i=15,21 do for j=1,7 do + if L[n]then + newPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(min,max))) + else + newPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) end - local min,max - if LV==1 then min,max=4,6 - elseif LV==2 then min,max=4,8 - elseif LV==3 then min,max=8,10 + n=n+1 + end end +end +function loadmode.drought() + newPlayer(1,340,15) +end +function loadmode.hotseat() + if curMode.lv==1 then + newPlayer(1,20,15) + newPlayer(2,650,15) + elseif curMode.lv==2 then + newPlayer(1,20,100,.65) + newPlayer(2,435,100,.65) + newPlayer(3,850,100,.65) + elseif curMode.lv==3 then + newPlayer(1,25,160,.5) + newPlayer(2,335,160,.5) + newPlayer(3,645,160,.5) + newPlayer(4,955,160,.5) + end +end +function loadmode.custom() + for i=1,#customID do + local k=customID[i] + modeEnv[k]=customRange[k][customSel[i]] + end + modeEnv._20G=modeEnv.drop==0 + modeEnv.oncehold=customSel[6]==1 + if curMode.lv==2 then + modeEnv.target=0 + end + newPlayer(1,340,15) + local L=modeEnv.opponent + if L~=0 then + modeEnv.target=nil + if L<10 then + newPlayer(2,965,360,.5,AITemplate("9S",2*L)) + else + newPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10))) end - local n=2 - for i=1,4 do for j=1,6 do - if L[n]then - newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(min,max))) - else - newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) - end - n=n+1 - end end - for i=9,12 do for j=1,6 do - if L[n]then - newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(min,max))) - else - newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) - end - n=n+1 - end end - end, - techmino99=function() - newPlayer(1,340,15) - local LV=curMode.lv - if LV==3 then players[1].gameEnv.drop=15 end - local L={}for i=1,100 do L[i]=true end - local t=system~="Windows"and 0 or 1+3*LV - while t>0 do - local r=rnd(2,99) - if L[r]then L[r],t=false,t-1 end - end - local min,max - if LV==1 then min,max=4,6 - elseif LV==2 then min,max=4,8 - elseif LV==3 then min,max=8,10 - end - local n=2 - for i=1,7 do for j=1,7 do - if L[n]then - newPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(min,max))) - else - newPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) - end - n=n+1 - end end - for i=15,21 do for j=1,7 do - if L[n]then - newPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(min,max))) - else - newPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) - end - n=n+1 - end end - end, - drought=function() - newPlayer(1,340,15) - end, - hotseat=function() - if curMode.lv==1 then - newPlayer(1,20,15) - newPlayer(2,650,15) - elseif curMode.lv==2 then - newPlayer(1,20,100,.65) - newPlayer(2,435,100,.65) - newPlayer(3,850,100,.65) - elseif curMode.lv==3 then - newPlayer(1,25,160,.5) - newPlayer(2,335,160,.5) - newPlayer(3,645,160,.5) - newPlayer(4,955,160,.5) - end - end, - custom=function() - for i=1,#customID do - local k=customID[i] - modeEnv[k]=customRange[k][customSel[i]] - end - modeEnv._20G=modeEnv.drop==0 - modeEnv.oncehold=customSel[6]==1 - if curMode.lv==2 then - modeEnv.target=0 - end - newPlayer(1,340,15) - local L=modeEnv.opponent - if L~=0 then - modeEnv.target=nil - if L<10 then - newPlayer(2,965,360,.5,AITemplate("9S",2*L)) - else - newPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10))) + end + preField.h=20 + repeat + for i=1,10 do + if preField[preField.h][i]>0 or curMode.lv==2 and preField[preField.h][i]==-1 then + goto L end end - preField.h=20 - repeat - for i=1,10 do - if preField[preField.h][i]>0 or curMode.lv==2 and preField[preField.h][i]==-1 then - goto L - end - end - preField.h=preField.h-1 - until preField.h==0 - ::L:: - if curMode.lv==1 then - for _,P in next,players.alive do - local t=P.showTime*3 - for y=1,preField.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 + preField.h=preField.h-1 + until preField.h==0 + ::L:: + if curMode.lv==1 then + for _,P in next,players.alive do + local t=P.showTime*3 + for y=1,preField.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 - modeEnv.bg=customRange.bg[customSel[12]] - modeEnv.bgm=customRange.bgm[customSel[13]] - end, -} + end + modeEnv.bg=customRange.bg[customSel[12]] + modeEnv.bgm=customRange.bgm[customSel[13]] +end -------------------------------------------------- Event={null=NULL} function Event.reach_winCheck(P) @@ -809,7 +808,7 @@ function Event_task.defender_normal(P) local t=360-P.modeData.event*2 if P.counter>=t then P.counter=0 - for i=1,3 do + for _=1,3 do P.atkBuffer[#P.atkBuffer+1]={pos=rnd(2,9),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1} end P.atkBuffer.sum=P.atkBuffer.sum+3 @@ -839,7 +838,7 @@ function Event_task.defender_lunatic(P) local t=240-2*P.modeData.event if P.counter>=t then P.counter=0 - for i=1,4 do + for _=1,4 do P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2} end P.atkBuffer.sum=P.atkBuffer.sum+4 @@ -944,9 +943,7 @@ function Event_task.PC(P) ins(P.visTime,1,getNewRow(20)) end P.fieldBeneath=P.fieldBeneath+120 - for i=1,#P.clearing do - P.clearing[i]=P.clearing[i]+4 - end + P.curY=P.curY+4 P:freshgho() return true end diff --git a/default_data.lua b/default_data.lua new file mode 100644 index 00000000..25b031d2 --- /dev/null +++ b/default_data.lua @@ -0,0 +1,95 @@ +setting={ + das=10,arr=2, + sddas=0,sdarr=2, + quickR=true,swap=true, + fine=false, + --game + + ghost=true,center=true, + smo=true,grid=false, + dropFX=3, + shakeFX=3, + atkFX=3, + frameMul=100, + -- + fullscreen=false, + bg=true, + bgblock=true, + lang=1, + skin=1, + --graphic + + sfx=8,bgm=6, + vib=3,voc=0, + --sound + + keyMap={ + {"left","right","x","z","c","up","down","space","tab","r"}, + {},{},{},{},{},{},{}, + --keyboard + {"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder"}, + {},{},{},{},{},{},{}, + --joystick + }, + VKSwitch=true, + VKTrack=true,--If tracked + VKTchW=3,--Touch Weight + VKCurW=4,--CurPos Weight + VKIcon=true, + VKAlpha=3, + --control +} +local L=setting.keyMap +for i=1,#L do + for j=1,20 do + if not L[i][j]then + L[i][j]="" + end + end +end +stat={ + run=0,game=0,time=0, + extraPiece=0,extraRate=0, + key=0,rotate=0,hold=0,piece=0,row=0, + atk=0,send=0,recv=0,pend=0, + clear_1=0,clear_2=0,clear_3=0,clear_4=0, + spin_0=0,spin_1=0,spin_2=0,spin_3=0, + b2b=0,b3b=0,pc=0,score=0, +} +--Things related to virtualkey +function restoreVirtualKey() + for i=1,#VK_org do + local B,O=virtualkey[i],VK_org[i] + B.ava=O.ava + B.x=O.x + B.y=O.y + B.r=O.r + end +end +local O,_=true,false +VK_org={--Original set,for restore VK' position + {ava=O,x=80, y=720-200, r=80},--moveLeft + {ava=O,x=320, y=720-200, r=80},--moveRight + {ava=O,x=1280-80, y=720-200, r=80},--rotRight + {ava=O,x=1280-200, y=720-80, r=80},--rotLeft + {ava=O,x=1280-200, y=720-320, r=80},--rotFlip + {ava=O,x=200, y=720-320, r=80},--hardDrop + {ava=O,x=200, y=720-80, r=80},--softDrop + {ava=O,x=1280-320, y=720-200, r=80},--hold + {ava=O,x=1280-80, y=280, r=80},--func + {ava=O,x=80, y=280, r=80},--restart + {ava=_,x=100, y=50, r=80},--insLeft + {ava=_,x=200, y=50, r=80},--insRight + {ava=_,x=300, y=50, r=80},--insDown + {ava=_,x=400, y=50, r=80},--down1 + {ava=_,x=500, y=50, r=80},--down4 + {ava=_,x=600, y=50, r=80},--down10 + {ava=_,x=700, y=50, r=80},--dropLeft + {ava=_,x=800, y=50, r=80},--dropRight + {ava=_,x=900, y=50, r=80},--addToLeft + {ava=_,x=1000, y=50, r=80},--addToRight +} +virtualkey={} +for i=1,#VK_org do + virtualkey[i]={} +end \ No newline at end of file diff --git a/document.txt b/document.txt index ecf438a3..2eb5ea00 100644 --- a/document.txt +++ b/document.txt @@ -1,31 +1,89 @@ -攻击系统: -消1/2/3/4攻击0/1/2/4 -spin1/2/3攻击2/4/6,若mini则减半 -b2b:增加1~2(tetris)/1~3(spin)攻击 -b3b:满b2b效果+1额外抵挡 -PC:其它攻击与6~8(本局内递增)取高+2额外抵挡 -连击:0,0,1,1,2,2,3,3,4,4,3…… +游戏方法: + 控制系统提供的一个个方块,每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话) + 完成当前游戏模式中的目标或者是活到最后即算胜利. + +旋转系统: + 使用Techmino专属旋转系统,细节不赘述 + +spin判定: + 结合了不可移动判定和三角判定,是否为mini也与这二者有关,细节不赘述 + +攻击系统: + 消1/2/3/4攻击0/1/2/4 + spin1/2/3攻击2/4/6,若mini则减半 + b2b:增加1~2(tetris)/1~3(spin)攻击 + b3b:满b2b效果+1额外抵挡 + PC:其它攻击与6~8(本局内递增)取高+2额外抵挡 + 连击:0,0,1,1,2,2,3,3,4,4,3…… + +back to back(B2B)点数说明: + B2B点数的范围在0~1200 + 在40及以上特殊消除时B2B,在1000以上特殊消除时B3B,1200封顶 + 消四+100 + 空spin加20,不超过1000 + spin1~3+50/100/180 (mini*.5) + 普通消除-250 + 1000以上空放一块-40(不减到低于1000) + +攻击延迟: + 消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢 + b2b或者b3b增加攻击力的同时也会减缓一点生效速度,mini大幅减缓生效速度 + +抵消逻辑: + 发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击 + 没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手 -抵消逻辑:发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力抵消受到的攻击,多余的攻击力会发送给对手,没有用上的额外抵挡会被丢弃。 - - -攻击延迟:消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢,b2b或者b3b增加攻击力的同时也会减缓一点生效时间,mini大幅增加生效时间。 - - -back to back点数说明:取值范围0~1200 -在40及以上特殊消除时b2b,在1000以上特殊消除时b3b,1200封顶 -消四+100 -空spin加20,不超过1000 -spin1~3+50/100/180 (mini*.5) -普通消除-250 -1000以上空放一块-40(不减到低于1000) - - -吃鸡模式: -许多玩家同时进行一局游戏(其它的是AI,不是真人),坚持到最后的玩家胜利。随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加。淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力。 -玩家可选四个攻击模式: -1.随机:每次攻击后10%随机锁定一个玩家 -2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家 -3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新) -4.反击:攻击所有锁定自己的玩家(AOE),若无则伏击随机玩家 \ No newline at end of file +模式说明: + 竞速: + 用你最快的速度消除40行(据难度而定)吧! + 马拉松: + 根据总消行数,速度会逐渐加快,消除两百行吧!(easy和hard就是normal开始和结束的速度,消除200行不加速) + 大师: + 马拉松进化版,如果觉得马拉松太简单了久玩这个吧,每一个难度都是一层境界,L难度和U难度攒到500点数通关,final难度为上级者专属游戏模式,不建议游玩. + 经典: + 使用低速控制设置在高速下落时尽可能消除更多的行,没有通关目标.(到90有"彩蛋") + 禅: + 闲得无聊,只是想单纯地打打块地时候可以玩此模式,无重力消除200行. + 无尽: + 无尽模式,边上会显示玩家的消行数和攻击效率,适合科研(术语). + 单挑: + 和一个电脑玩家单挑,带加号的和最后一个模式是超强机器人(仅限Windows平台),试试你能稳定打败多难的对手吧! + 回合制: + 玩法同单挑模式,只不过只有当一个人放下一个方块后另一个人才能放下一块. + 仅TSD: + 这个模式中,玩家必须用TSD(T spin double)的方式消除,否则直接判负,你能连续打出多少个TSD呢? + 隐形: + 根据不同难度,场地内(甚至当前方块)会隐形,看看你能活多久吧!(GM难度为类似TGM3的GM Roll,用于上级者练习) + 挖掘: + 每隔一定时间,系统会向场地的低端添加一行垃圾行,间隔会随着波数增加而越来越短,你能顶住几波呢? + 生存: + 每隔一定时间,系统会向玩家的垃圾缓冲槽中添加垃圾行,释放速度和间隔会随着波数增加而越来越短,玩家可以将其抵消也可以让其释放,尽可能活更久的时间. + 防守: + 系统会向玩家的垃圾缓冲槽中添加难消除的垃圾行,释放速度和间隔会随着波数增加而越来越短,玩家要尽量抵消他们来让自己存活更久. + 进攻: + 当玩家的攻击缓冲槽空时,系统会向玩家的垃圾缓冲槽中添加大量的垃圾行(高难度下后期甚至会远超过20),释放速度和间隔都会随着波数增加而越来越短,垃圾上涨速度也会提升.赶紧在其释放之前将攻击抵消到不会一下致命的量! + 科研: + 玩家只被允许做特殊消除(spin/全消/消四),在带+的难度中不允许消四,U难度下玩家甚至只被允许每一个方块都使用最简操作控制,任何违反规则的行为都会判负. + C4W练习:(或者说是4w练习) + 系统直接提供给玩家"留4列"的场地,玩家可以自由练习4w消除,该技巧在某些时候实战很有用.(需要学会spin,否则意义不是很大) + 全清训练: + 系统会连续给玩家提供"标准开局PC套路"的场地和四个方块(不允许使用hold),玩家需要一直完成PC,否则判负. + 全清挑战: + 在消除一百行的限制内,你能全清几次? + 49人混战: + 许多玩家同时进行一局游戏(其它的是AI,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力. + 玩家可选四个攻击模式: + 1.随机:每次攻击后10%随机挑选一个玩家锁定 + 2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家 + 3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新) + 4.反击:攻击所有锁定自己的玩家(AOE),若无则伏击随机玩家 + 坚持到最后的玩家就是胜利者. + 99人混战: + 同49人混战,只是增加到了99名玩家,难度系数也有调整,对设备的要求也较高. + 干旱: + 系统提供的方块序列变得奇怪了!你能消除100行不死吗,或者,多快? + 多人: + 使用键盘或者多个手柄(也许?) + 自定义: + 玩家可以自由调整下落速度等等几乎大多数设置(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来玩方块拼图.在拼图模式下,按功能键切换是否显示提示模板.其中打"X"的格子不允许有方块,空的格子可以是任何状态,玩家能获得的七种普通方块必须完全符合,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利. \ No newline at end of file diff --git a/font.ttf b/font.ttf index 4acf3443..d0847576 100644 Binary files a/font.ttf and b/font.ttf differ diff --git a/image/block.png b/image/block.png index 09ce8f7d..4a515122 100644 Binary files a/image/block.png and b/image/block.png differ diff --git a/image/icon.png b/image/icon.png index 072f3c27..07d507da 100644 Binary files a/image/icon.png and b/image/icon.png differ diff --git a/image/virtualkey.png b/image/virtualkey.png new file mode 100644 index 00000000..f83ee12f Binary files /dev/null and b/image/virtualkey.png differ diff --git a/image/virtualkey/func.png b/image/virtualkey/func.png deleted file mode 100644 index 74429fb7..00000000 Binary files a/image/virtualkey/func.png and /dev/null differ diff --git a/image/virtualkey/hardDrop.png b/image/virtualkey/hardDrop.png deleted file mode 100644 index 96a1736b..00000000 Binary files a/image/virtualkey/hardDrop.png and /dev/null differ diff --git a/image/virtualkey/hold.png b/image/virtualkey/hold.png deleted file mode 100644 index 9f508b77..00000000 Binary files a/image/virtualkey/hold.png and /dev/null differ diff --git a/image/virtualkey/moveLeft.png b/image/virtualkey/moveLeft.png deleted file mode 100644 index f6d0f020..00000000 Binary files a/image/virtualkey/moveLeft.png and /dev/null differ diff --git a/image/virtualkey/moveRight.png b/image/virtualkey/moveRight.png deleted file mode 100644 index 60a4da65..00000000 Binary files a/image/virtualkey/moveRight.png and /dev/null differ diff --git a/image/virtualkey/restart.png b/image/virtualkey/restart.png deleted file mode 100644 index fcdf67ac..00000000 Binary files a/image/virtualkey/restart.png and /dev/null differ diff --git a/image/virtualkey/rotFlip.png b/image/virtualkey/rotFlip.png deleted file mode 100644 index 7b2ecf1b..00000000 Binary files a/image/virtualkey/rotFlip.png and /dev/null differ diff --git a/image/virtualkey/rotLeft.png b/image/virtualkey/rotLeft.png deleted file mode 100644 index fc9f3259..00000000 Binary files a/image/virtualkey/rotLeft.png and /dev/null differ diff --git a/image/virtualkey/rotRight.png b/image/virtualkey/rotRight.png deleted file mode 100644 index eab71b04..00000000 Binary files a/image/virtualkey/rotRight.png and /dev/null differ diff --git a/image/virtualkey/softDrop.png b/image/virtualkey/softDrop.png deleted file mode 100644 index 6ea68e1b..00000000 Binary files a/image/virtualkey/softDrop.png and /dev/null differ diff --git a/language/chi.lua b/language/chi.lua index cbdb4cc9..f6a83646 100644 --- a/language/chi.lua +++ b/language/chi.lua @@ -1,4 +1,13 @@ local BK="返回" +local actName={ + "左移:","右移:", + "顺时针旋转:","逆时针旋转:","180°旋转:", + "硬降:","软降:", + "暂存:","功能键:", + "重新开始:", + "左瞬移:","右瞬移:","软降到底:","软降一格:","软降四格:","软降十格:", + "落在最左:","落在最右:","列在最左:","列在最右:", +} return{ atkModeName={"随机","徽章","击杀","反击"}, royale_remain=function(n)return"剩余 "..n.." 名玩家"end, @@ -67,8 +76,11 @@ return{ setting_sound="声音设置", musicRoom="音乐室", nowPlaying="正在播放:", + VKTchW="触摸点权重", + VKOrgW="原始点权重", + VKCurW="当前点权重", - actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"}, + actName=actName, modeName={ [0]="自定义", "竞速","马拉松","大师","经典","禅","无尽","单挑","回合制","仅TSD","隐形", @@ -128,6 +140,8 @@ return{ "使用love2d引擎制作", "有疑问?先看设置有没有你想要的", "有建议的话可以把信息反馈给作者~", + "不要按F8", + "秘密代码:626", "CLASSIC SEXY RUSSIAN BLOCKS", "LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI }, @@ -149,7 +163,8 @@ return{ "B2B数:", "PC数:", "效率:", - "多余操作:" + "多余操作:", + "最简操作率:", }, help={ "好像也没啥好帮助的吧?就当是关于了", @@ -210,11 +225,11 @@ return{ start1="消除开始", start2="拼图开始", draw="画图(D)", - set1="40行", - set2="1v1", - set3="无尽", - set4="隐形", - set5="极限", + set1="40行(1)", + set2="1v1(2)", + set3="无尽(3)", + set4="隐形(4)", + set5="极限(5)", back=BK, }, draw={ @@ -283,16 +298,32 @@ return{ voc="语音", back=BK, }, - setting_control={ + setting_key={ back=BK, }, setting_touch={ - hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end, + hide="显示虚拟按键", + track="按键自动跟踪", + tkset="跟踪设置", default="默认组合", snap=function()return text.snapLevelName[snapLevel]end, - alpha=function()return setting.virtualkeyAlpha.."0%"end, + alpha=function()return setting.VKAlpha.."0%"end, icon="图标", size="大小", + toggle="开关", + back=BK, + }, + setting_touchSwitch={ + b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4], + b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8], + b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12], + b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16], + b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20], + norm="标准", + pro="专业", + back=BK, + }, + setting_trackSetting={ back=BK, }, help={ diff --git a/language/chi_full.lua b/language/chi_full.lua index 9d80cda4..4134c6e3 100644 --- a/language/chi_full.lua +++ b/language/chi_full.lua @@ -1,4 +1,13 @@ local BK="返回" +local actName={ + "左移:","右移:", + "顺时针旋转:","逆时针旋转:","180°旋转:", + "硬降:","软降:", + "暂存:","功能键:", + "重新开始:", + "左瞬移:","右瞬移:","软降到底:","软降一格:","软降四格:","软降十格:", + "落在最左:","落在最右:","列在最左:","列在最右:", +} return{ atkModeName={"随机","徽章","击杀","反击"}, royale_remain=function(n)return"剩余 "..n.." 名玩家"end, @@ -67,8 +76,11 @@ return{ setting_sound="声音设置", musicRoom="音乐室", nowPlaying="正在播放:", + VKTchW="触摸点权重", + VKOrgW="原始点权重", + VKCurW="当前点权重", - actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"}, + actName=actName, modeName={ [0]="自定义", "竞速","马拉松","大师","经典","禅","无尽","单挑","回合制","仅TSD","隐形", @@ -128,6 +140,8 @@ return{ "使用love2d引擎制作", "有疑问?先看设置有没有你想要的", "有建议的话可以把信息反馈给作者~", + "不要按F8", + "秘密代码:626", "CLASSIC SEXY RUSSIAN BLOCKS", "LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI }, @@ -149,7 +163,8 @@ return{ "满贯数:", "全清数:", "效率:", - "多余操作:" + "多余操作:", + "最简操作率:", }, help={ "好像也没啥好帮助的吧?就当是关于了", @@ -210,11 +225,11 @@ return{ start1="消除开始", start2="拼图开始", draw="画图(D)", - set1="40行", - set2="1v1", - set3="无尽", - set4="隐形", - set5="极限", + set1="40行(1)", + set2="1v1(2)", + set3="无尽(3)", + set4="隐形(4)", + set5="极限(5)", back=BK, }, draw={ @@ -284,16 +299,32 @@ return{ voc="语音", back=BK, }, - setting_control={ + setting_key={ back=BK, }, setting_touch={ - hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end, + hide="显示虚拟按键", + track="按键自动跟踪", + tkset="跟踪设置", default="默认组合", snap=function()return text.snapLevelName[snapLevel]end, - alpha=function()return setting.virtualkeyAlpha.."0%"end, + alpha=function()return setting.VKAlpha.."0%"end, icon="图标", size="大小", + toggle="开关", + back=BK, + }, + setting_touchSwitch={ + b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4], + b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8], + b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12], + b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16], + b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20], + norm="标准", + pro="专业", + back=BK, + }, + setting_trackSetting={ back=BK, }, help={ diff --git a/language/eng.lua b/language/eng.lua index cfecd9e0..ccad2fab 100644 --- a/language/eng.lua +++ b/language/eng.lua @@ -1,4 +1,11 @@ local BK="Back" +local actName={ + "Move Left:","Move Right:", + "Rotate Right:","Rotate Left:","Rotate Flip:", + "Hard Drop:","Soft Drop:","Hold:","Function:","Restart:", + "Instant Left:","Instant Right:","Ins Down:","Down 1:","Down 4:","Down 10:", + "Left Drop:","Right Drop:","Left INS:","Right INS:", +} return{ atkModeName={"Random","Badges","K.O.s","Counters"}, royale_remain=function(n)return n.." Players Remain"end, @@ -67,8 +74,11 @@ return{ setting_sound="Sound setting", musicRoom="Music Room", nowPlaying="Now Playing:", + VKTchW="Touch weight", + VKOrgW="Origion weight", + VKCurW="CurPos weight", - actName={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip:","Hard Drop:","Soft Drop:","Hold:","Function:","Restart:","Instant Left:","Instant Right:","Ins Down:"}, + actName=actName, modeName={ [0]="Custom", "Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","Round","TSD-only","Blind", @@ -128,6 +138,8 @@ return{ "Powered by love2d", "Find out what's in the setting!", "Any suggestions to author!", + "DO NOT PRESS F8", + "Secret code:626", "Techmino=Technique+Tetromino", "CLASSIC SEXY RUSSIAN BLOCKS", "LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI @@ -150,7 +162,8 @@ return{ "B2B:", "PC:", "Efficiency:", - "Fineese:" + "Finesse error:", + "Finesse rate:", }, help={ "I don't think you need \"help\".", @@ -211,11 +224,11 @@ Lib used: start1="Clear Start", start2="Puzzle Start", draw="Draw(D)", - set1="40L", - set2="1v1", - set3="infinite", - set4="blind", - set5="master", + set1="40L(1)", + set2="1v1(2)", + set3="infinite(3)", + set4="blind(4)", + set5="master(5)", back=BK, }, draw={ @@ -253,7 +266,7 @@ Lib used: sdarrD="-",sdarrU="+", quickR="Quick restart", swap="Combo key to change ATK mode", - fine="Fineese error SFX", + fine="Finesse error SFX", ctrl="Key Setting", touch="Touch Setting", back=BK, @@ -284,16 +297,32 @@ Lib used: voc="VOC", back=BK, }, - setting_control={ + setting_key={ back=BK, }, setting_touch={ - hide=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end, + hide="Show Virtual Key", + track="Auto track", + tkset="Track setting", default="Defaults", snap=function()return text.snapLevelName[snapLevel]end, - alpha=function()return setting.virtualkeyAlpha.."0%"end, + alpha=function()return setting.VKAlpha.."0%"end, icon="Icon", size="Size", + toggle="Toggle", + back=BK, + }, + setting_touchSwitch={ + b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4], + b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8], + b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12], + b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16], + b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20], + norm="Normal", + pro="Professioanl", + back=BK, + }, + setting_trackSetting={ back=BK, }, help={ diff --git a/list.lua b/list.lua index 3725d7e0..125e0db9 100644 --- a/list.lua +++ b/list.lua @@ -1,6 +1,13 @@ local mobile=system=="Android"or system=="iOS" - -actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","func","restart","insLeft","insRight","insDown"} +actName={ + "moveLeft","moveRight", + "rotRight","rotLeft","rotFlip", + "hardDrop","softDrop", + "hold","func", + "restart", + "insLeft","insRight","insDown","down1","down4","down10", + "dropLeft","dropRight","addLeft","addRight",--Super contorl system +} color={ red={1,0,0}, green={0,1,0}, @@ -203,65 +210,76 @@ for i=1,7 do blocks[i+7]=blocks[i]end local virtualkeySet={ { - {80,720-200,6400,80},--moveLeft - {320,720-200,6400,80},--moveRight - {1280-80,720-200,6400,80},--rotRight - {1280-200,720-80,6400,80},--rotLeft - {1280-200,720-320,6400,80},--rotFlip - {200,720-320,6400,80},--hardDrop - {200,720-80,6400,80},--softDrop - {1280-320,720-200,6400,80},--hold - {1280-80,280,6400,80},--func - {80,280,6400,80},--restart - },--Farter's set 3 + {1, 80, 720-200, 80},--moveLeft + {2, 320, 720-200, 80},--moveRight + {3, 1280-80, 720-200, 80},--rotRight + {4, 1280-200, 720-80, 80},--rotLeft + {5, 1280-200, 720-320, 80},--rotFlip + {6, 200, 720-320, 80},--hardDrop + {7, 200, 720-80, 80},--softDrop + {8, 1280-320, 720-200, 80},--hold + {9, 1280-80, 280, 80},--func + {10,80, 280, 80},--restart + },--Farter's set,thanks { - {1280-320,720-200,6400,80},--moveLeft - {1280-80,720-200,6400,80},--moveRight - {200,720-80,6400,80},--rotRight - {80,720-200,6400,80},--rotLeft - {200,720-320,6400,80},--rotFlip - {1280-200,720-320,6400,80},--hardDrop - {1280-200,720-80,6400,80},--softDrop - {320,720-200,6400,80},--hold - {80,280,6400,80},--func - {1280-80,280,6400,80},--restart - },--Mirrored farter's set 3 + {1, 1280-320, 720-200, 80},--moveLeft + {2, 1280-80, 720-200, 80},--moveRight + {3, 200, 720-80, 80},--rotRight + {4, 80, 720-200, 80},--rotLeft + {5, 200, 720-320, 80},--rotFlip + {6, 1280-200, 720-320, 80},--hardDrop + {7, 1280-200, 720-80, 80},--softDrop + {8, 320, 720-200, 80},--hold + {9, 80, 280, 80},--func + {10,1280-80, 280, 80},--restart + + },--Mirrored farter's set,sknaht { - {80,720-80,6400,80},--moveLeft - {240,720-80,6400,80},--moveRight - {1280-240,720-80,6400,80},--rotRight - {1280-400,720-80,6400,80},--rotLeft - {1280-240,720-240,6400,80},--rotFlip - {1280-80,720-80,6400,80},--hardDrop - {1280-80,720-240,6400,80},--softDrop - {1280-80,720-400,6400,80},--hold - {80,360,6400,80},--func - {80,80,6400,80},--restart - },--Author's set + {1, 80, 720-80, 80},--moveLeft + {2, 240, 720-80, 80},--moveRight + {3, 1280-240, 720-80, 80},--rotRight + {4, 1280-400, 720-80, 80},--rotLeft + {5, 1280-240, 720-240, 80},--rotFlip + {6, 1280-80, 720-80, 80},--hardDrop + {7, 1280-80, 720-240, 80},--softDrop + {8, 1280-80, 720-400, 80},--hold + {9, 80, 360, 80},--func + {10,80, 80, 80},--restart + },--Author's set,not recommend { - {1280-400,720-80,6400,80},--moveLeft - {1280-80,720-80,6400,80},--moveRight - {240,720-80,6400,80},--rotRight - {80,720-80,6400,80},--rotLeft - {240,720-240,6400,80},--rotFlip - {1280-240,720-240,6400,80},--hardDrop - {1280-240,720-80,6400,80},--softDrop - {1280-80,720-240,6400,80},--hold - {80,720-240,6400,80},--func - {80,320,6400,80},--restart + {1, 1280-400, 720-80, 80},--moveLeft + {2, 1280-80, 720-80, 80},--moveRight + {3, 240, 720-80, 80},--rotRight + {4, 80, 720-80, 80},--rotLeft + {5, 240, 720-240, 80},--rotFlip + {6, 1280-240, 720-240, 80},--hardDrop + {7, 1280-240, 720-80, 80},--softDrop + {8, 1280-80, 720-240, 80},--hold + {9, 80, 720-240, 80},--func + {10,80, 320, 80},--restart },--Keyboard set { - {1200-370,40,1600,40},--moveLeft - {1200-280,40,1600,40},--moveRight - {1200-530,40,1600,40},--rotRight - {1200-610,40,1600,40},--rotLeft - {1200-450,40,1600,40},--rotFlip - {1200-50,40,1600,40},--hardDrop - {1200-130,40,1600,40},--softDrop - {1200-210,40,1600,40},--hold - {1200-690,40,1600,40},--func - {1200-770,40,1600,40},--restart - },--PC key feedback + {10,70, 50,27},--restart + {9, 130, 50,27},--func + {4, 190, 50,27},--rotLeft + {3, 250, 50,27},--rotRight + {5, 310, 50,27},--rotFlip + {1, 370, 50,27},--moveLeft + {2, 430, 50,27},--moveRight + {8, 490, 50,27},--hold + {7, 550, 50,27},--softDrop1 + {6, 610, 50,27},--hardDrop + {11,670, 50,27},--insLeft + {12,730, 50,27},--insRight + {13,790, 50,27},--insDown + {14,850, 50,27},--down1 + {15,910, 50,27},--down4 + {16,970, 50,27},--down10 + {17,1030, 50,27},--dropLeft + {18,1090, 50,27},--dropRight + {19,1150, 50,27},--addLeft + {20,1210, 50,27},--addRight + },--PC key feedback(top&in a row) } local customSet={ {20,20,1,1,7,1,1,1,3,4,1,2,3}, @@ -277,69 +295,79 @@ local function useDefaultSet(n) curBG=customRange.bg[customSel[12]] BGM(customRange.bgm[customSel[13]]) end +local function VKAdisp(n) + return function() + return VK_org[n].ava + end +end +local function VKAcode(n) + return function() + VK_org[n].ava=not VK_org[n].ava + end +end Widget={ load={},intro={},quit={}, main={ - play= newButton(150,280,200,160,color.red, 60,function()gotoScene("mode")end, nil,"setting"), - setting=newButton(370,280,200,160,color.lightBlue, 50,function()gotoScene("setting_game")end, nil,"music"), - music= newButton(590,280,200,160,color.lightPurple,37,function()gotoScene("music")end, nil,"help"), - help= newButton(150,460,200,160,color.yellow, 55,function()gotoScene("help")end, nil,"stat"), - stat= newButton(370,460,200,160,color.cyan, 48,function()gotoScene("stat")end, nil,"qplay"), - qplay= newButton(540,415,100,70,color.lightGreen, 28,function()loadGame(modeSel,levelSel)end, nil,"lang"), + play= newButton(150,280,200,160,color.red, 60,function()scene.push()scene.swapTo("mode")end, nil,"setting"), + setting=newButton(370,280,200,160,color.lightBlue, 50,function()scene.push()scene.swapTo("setting_game")end, nil,"music"), + music= newButton(590,280,200,160,color.lightPurple,37,function()scene.push()scene.swapTo("music")end, nil,"help"), + help= newButton(150,460,200,160,color.yellow, 55,function()scene.push()scene.swapTo("help")end, nil,"stat"), + stat= newButton(370,460,200,160,color.cyan, 48,function()scene.push()scene.swapTo("stat")end, nil,"qplay"), + qplay= newButton(540,415,100,70,color.lightGreen, 28,function()scene.push()loadGame(modeSel,levelSel)end, nil,"lang"), lang= newButton(590,505,200,70,color.lightRed, 50,function() setting.lang=setting.lang%#langName+1 swapLanguage(setting.lang) end,nil,"quit"), - quit= newButton(370,620,280,100,color.lightGrey, 60,function()gotoScene("quit")end, nil,"play"), + quit= newButton(370,620,280,100,color.lightGrey, 60,function()scene.swapTo("quit")end, nil,"play"), }, mode={ - up= newButton(1000,210,200,140,color.white, 80,function()love.keypressed("up")end,function()return modeSel==1 end), - down= newButton(1000,430,200,140,color.white, 80,function()love.keypressed("down")end,function()return modeSel==#modeID end), - left= newButton(190, 160,100,80, color.white,40,function()love.keypressed("left")end,function()return levelSel==1 end), - right= newButton(350, 160,100,80, color.white,40,function()love.keypressed("right")end,function()return levelSel==#modeLevel[modeID[modeSel]]end), - start= newButton(1000,600,250,100,color.green, 50,function()loadGame(modeSel,levelSel)end), - custom= newButton(275, 420,200,90, color.yellow,40,function()gotoScene("custom")end), - back= newButton(640, 630,230,90, color.white,45,back), + up= newButton(1000, 210,200,140,color.white, 80,function()love.keypressed("up")end,function()return modeSel==1 end), + down= newButton(1000, 430,200,140,color.white, 80,function()love.keypressed("down")end,function()return modeSel==#modeID end), + left= newButton(190, 160,100,80, color.white, 40,function()love.keypressed("left")end,function()return levelSel==1 end), + right= newButton(350, 160,100,80, color.white, 40,function()love.keypressed("right")end,function()return levelSel==#modeLevel[modeID[modeSel]]end), + start= newButton(1000, 600,250,100,color.green, 50,function()scene.push()loadGame(modeSel,levelSel)end), + custom= newButton(275, 420,200,90, color.yellow, 40,function()scene.push()scene.swapTo("custom")end), + back= newButton(640, 630,230,90, color.white, 45,scene.back), }, music={ - bgm= newSlider(760,80,400,8,40,nil,function()return setting.bgm end,function(i)setting.bgm=i;BGM(bgmPlaying)end), - up= newButton(1100,200,120,120,color.white,60,function()love.keypressed("up")end), - play= newButton(1100,340,120,120,color.white,40,function()love.keypressed("space")end,function()return setting.bgm==0 end), - down= newButton(1100,480,120,120,color.white,60,function()love.keypressed("down")end), - back= newButton(640, 630,230,90, color.white,45,back), + bgm= newSlider(760, 80,400,8,40,nil,function()return setting.bgm end,function(i)setting.bgm=i;BGM(bgmPlaying)end), + up= newButton(1100, 200,120,120,color.white,60,function()love.keypressed("up")end), + play= newButton(1100, 340,120,120,color.white,40,function()love.keypressed("space")end,function()return setting.bgm==0 end), + down= newButton(1100, 480,120,120,color.white,60,function()love.keypressed("down")end), + back= newButton(640, 630,230,90, color.white,45,scene.back), }, custom={ - up= newButton(1000,220,100,100,color.white, 50,function()sel=(sel-2)%#customID+1 end), - down= newButton(1000,460,100,100,color.white, 50,function()sel=sel%#customID+1 end), + up= newButton(1000, 220,100,100,color.white, 50,function()sel=(sel-2)%#customID+1 end), + down= newButton(1000, 460,100,100,color.white, 50,function()sel=sel%#customID+1 end), left= newButton(880, 340,100,100,color.white, 50,function()love.keypressed("left")end), - right= newButton(1120,340,100,100,color.white, 50,function()love.keypressed("right")end), - start1= newButton(880, 580,220,70, color.green, 40,function()loadGame(0,1)end), - start2= newButton(1120,580,220,70, color.lightPurple, 40,function()loadGame(0,2)end), - draw= newButton(1000,90, 190,85, color.cyan, 40,function()gotoScene("draw")end), + right= newButton(1120, 340,100,100,color.white, 50,function()love.keypressed("right")end), + start1= newButton(880, 580,220,70, color.green, 40,function()scene.push()loadGame(0,1)end), + start2= newButton(1120, 580,220,70, color.lightPurple, 40,function()scene.push()loadGame(0,2)end), + draw= newButton(1000, 90, 190,85, color.cyan, 40,function()scene.push()scene.swapTo("draw")end), set1= newButton(640, 160,240,75, color.lightRed, 40,function()useDefaultSet(1)end), set2= newButton(640, 250,240,75, color.lightRed, 40,function()useDefaultSet(2)end), set3= newButton(640, 340,240,75, color.lightRed, 40,function()useDefaultSet(3)end), set4= newButton(640, 430,240,75, color.lightRed, 40,function()useDefaultSet(4)end), set5= newButton(640, 520,240,75, color.lightRed, 40,function()useDefaultSet(5)end), - back= newButton(640, 630,180,60, color.white, 40,back), + back= newButton(640, 630,180,60, color.white, 40,scene.back), }, draw={ - any= newButton(700, 80, 120,120,color.lightGrey, 45,function()pen=0 end), - block1= newButton(840, 80, 120,120,color.red, 65,function()pen=1 end), - block2= newButton(980, 80, 120,120,color.green, 65,function()pen=2 end), - block3= newButton(1120,80, 120,120,color.orange, 65,function()pen=3 end), - block4= newButton(840, 220,120,120,color.blue, 65,function()pen=4 end), - block5= newButton(980, 220,120,120,color.magenta, 65,function()pen=5 end), - block6= newButton(1120,220,120,120,color.yellow, 65,function()pen=6 end), - block7= newButton(840, 360,120,120,color.cyan, 65,function()pen=7 end), - gb1= newButton(980, 360,120,120,color.darkGrey, 65,function()pen=9 end), - gb2= newButton(1120,360,120,120,color.grey, 65,function()pen=10 end), - gb3= newButton(840, 500,120,120,color.darkPurple, 65,function()pen=11 end), - gb4= newButton(980, 500,120,120,color.darkRed, 65,function()pen=12 end), - gb5= newButton(1120,500,120,120,color.darkGreen, 65,function()pen=13 end), - space= newButton(840, 640,120,120,color.grey, 70,function()pen=-1 end), - clear= newButton(1120,640,120,120,color.white, 45,function()love.keypressed("delete")end), - back= newButton(1235,45, 80, 80, color.white, 35,back), + block1= newButton(920, 80, 120,120,color.red, 65,function()pen=1 end), + block2= newButton(1060, 80, 120,120,color.green, 65,function()pen=2 end), + block3= newButton(1200, 80, 120,120,color.orange, 65,function()pen=3 end), + block4= newButton(920, 220,120,120,color.blue, 65,function()pen=4 end), + block5= newButton(1060, 220,120,120,color.magenta, 65,function()pen=5 end), + block6= newButton(1200, 220,120,120,color.yellow, 65,function()pen=6 end), + block7= newButton(920, 360,120,120,color.cyan, 65,function()pen=7 end), + gb1= newButton(1060, 360,120,120,color.darkGrey, 65,function()pen=9 end), + gb2= newButton(1200, 360,120,120,color.grey, 65,function()pen=10 end), + gb3= newButton(920, 500,120,120,color.darkPurple, 65,function()pen=11 end), + gb4= newButton(1060, 500,120,120,color.darkRed, 65,function()pen=12 end), + gb5= newButton(1200, 500,120,120,color.darkGreen, 65,function()pen=13 end), + clear= newButton(780, 80, 120,120,color.white, 45,function()love.keypressed("delete")end), + any= newButton(780, 220,120,120,color.lightGrey, 45,function()pen=0 end), + space= newButton(780, 360,120,120,color.grey, 70,function()pen=-1 end), + back= newButton(1200, 640,120,120,color.white, 40,scene.back), }, play={ pause= newButton(1235,45,80,80,color.white,30,pauseGame), @@ -350,15 +378,15 @@ Widget={ clearTask("play") updateStat() resetGameData() - gotoScene("play","none") + scene.swapTo("play","none") end), - quit= newButton(640,600,240,100,color.white,50,back), + quit= newButton(640,600,240,100,color.white,50,scene.back), }, setting_game={ - graphic=newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_graphic")end, nil,"sound"), - sound= newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_sound")end, nil,"dasD"), - dasD= newButton(180,230,50,50,color.white,40,function()setting.das=(setting.das-1)%31 end,nil,"dasU"), - dasU= newButton(400,230,50,50,color.white,40,function()setting.das=(setting.das+1)%31 end,nil,"arrD"), + graphic=newButton(200,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_graphic")end, nil,"sound"), + sound= newButton(1080,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_sound")end, nil,"dasD"), + dasD= newButton(180,230,50,50,color.white,40,function()setting.das=(setting.das-1)%31 end, nil,"dasU"), + dasU= newButton(400,230,50,50,color.white,40,function()setting.das=(setting.das+1)%31 end, nil,"arrD"), arrD= newButton(500,230,50,50,color.white,40,function() setting.arr=(setting.arr-1)%16 if setting.arr>setting.das then @@ -382,13 +410,13 @@ Widget={ quickR= newSwitch(560,430,40,function()return setting.quickR end,function()setting.quickR=not setting.quickR end, nil,"swap"), swap= newSwitch(560,510,25,function()return setting.swap end,function()setting.swap=not setting.swap end, nil,"fine"), fine= newSwitch(560,590,25,function()return setting.fine end,function()setting.fine=not setting.fine end, nil,"ctrl"), - ctrl= newButton(1020,230,320,80,color.white,40,function()gotoScene("setting_control")end, nil,"touch"), - touch= newButton(1020,340,320,80,color.white,40,function()gotoScene("setting_touch")end, nil,"back"), - back= newButton(1160,600,160,160,color.white,55,back,nil,"graphic"), + ctrl= newButton(1020,230,320,80,color.white,40,function()scene.push()scene.swapTo("setting_key")end, nil,"touch"), + touch= newButton(1020,340,320,80,color.white,40,function()scene.push()scene.swapTo("setting_touch")end, nil,"back"), + back= newButton(1160,600,160,160,color.white,55,scene.back,nil,"graphic"), }, setting_graphic={ - sound= newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_sound")end, nil,"game"), - game= newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_game")end, nil,"ghost"), + sound= newButton(200,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_sound")end, nil,"game"), + game= newButton(1080,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_game")end, nil,"ghost"), ghost= newSwitch(310,180,40,function()return setting.ghost end, function()setting.ghost= not setting.ghost end, nil,"center"), center= newSwitch(580,180,40,function()return setting.center end, function()setting.center= not setting.center end, nil,"smo"), smo= newSwitch(310,260,25,function()return setting.smo end, function()setting.smo= not setting.smo end, nil,"grid"), @@ -412,65 +440,110 @@ Widget={ setting.skin=setting.skin%8+1 changeBlockSkin(setting.skin) end,nil,"back"), - back= newButton(1160,600,160,160,color.white,55,back,nil,"sound"), + back= newButton(1160,600,160,160,color.white,55,scene.back,nil,"sound"), }, setting_sound={ - game= newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_game")end, nil,"graphic"), - graphic=newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_graphic")end, nil,"sfx"), + game= newButton(200,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_game")end, nil,"graphic"), + graphic=newButton(1080,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_graphic")end, nil,"sfx"), sfx=newSlider(180,250,400,8,40,function()SFX("blip_1")end, function()return setting.sfx end,function(i)setting.sfx=i end,nil,"bgm"), bgm=newSlider(750,250,400,8,40,function()BGM(bgmPlaying or"blank")end, function()return setting.bgm end,function(i)setting.bgm=i end,nil,"vib"), vib=newSlider(180,440,400,5,40,function()VIB(1)end, function()return setting.vib end,function(i)setting.vib=i end,nil,"voc"), voc=newSlider(750,440,400,8,40,function()VOICE("nya")end, function()return setting.voc end,function(i)setting.voc=i end,nil,"back"), - back=newButton(1160,600,160,160,color.white,55,back,nil,"game"), + back=newButton(1160,600,160,160,color.white,55,scene.back,nil,"game"), }, - setting_control={ - back=newButton(840,630,180,60,color.white,40,back), + setting_key={ + back=newButton(1140,650,200,80,color.white,50,scene.back), }, setting_touch={ - hide= newButton(640,210,500,80,color.white,45,function() - setting.virtualkeySwitch=not setting.virtualkeySwitch - end), - default=newButton(450,310,170,80,color.white,40,function() - for K=1,#virtualkey do - local b,b0=virtualkey[K],virtualkeySet[defaultSel][K] - b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4] - end--Default virtualkey + hide= newSwitch(810,140,45,function()return setting.VKSwitch end,function()setting.VKSwitch=not setting.VKSwitch end), + track= newSwitch(810,220,45,function()return setting.VKTrack end,function()setting.VKTrack=not setting.VKTrack end), + tkset= newButton(450,220,170,80,color.white,30,function() + scene.push() + scene.swapTo("setting_trackSetting") + end,function()return not setting.VKTrack end), + default=newButton(450,320,170,80,color.white,40,function() + local D=virtualkeySet[defaultSel] + for i=1,#VK_org do + VK_org[i].ava=false + end + for n=1,#D do + local T=D[n] + if T[1]then + local B=VK_org[n] + B.ava=true + B.x,B.y,B.r=T[2],T[3],T[4] + end + end--Replace keys defaultSel=defaultSel%5+1 end), - snap= newButton(640,310,170,80,color.white,40,function() + snap= newButton(640,320,170,80,color.white,40,function() snapLevel=snapLevel%6+1 end), - alpha= newButton(830,310,170,80,color.white,45,function() - setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%11 + --VK=T,70,50,27/T,130,50,27/T,190,50,27/T,250,50,27/T,310,50,27/T,370,50,27/T,430,50,27/T,490,50,27/T,550,50,27/T,610,50,27/T,670,50,27/T,730,50,27/T,790,50,27/T,850,50,27/T,910,50,27/T,970,50,27/T,739,789,897/T,1090,50,27/T,1150,50,27/T,1210,50,27 + alpha= newButton(830,320,170,80,color.white,45,function() + setting.VKAlpha=(setting.VKAlpha+1)%11 --Adjust virtualkey alpha end), - icon= newButton(450,410,170,80,color.white,45,function() - setting.virtualkeyIcon=not setting.virtualkeyIcon + icon= newButton(495,420,260,80,color.white,45,function() + setting.VKIcon=not setting.VKIcon --Switch virtualkey icon end), - size= newButton(830,410,170,80,color.white,45,function() + size= newButton(785,420,260,80,color.white,45,function() if sel then - local b=virtualkey[sel] - b[4]=b[4]+10 - if b[4]==150 then b[4]=40 end - b[3]=b[4]^2 + local B=VK_org[sel] + B.r=B.r+10 + if B.r>=150 then B.r=B.r-110 end end end), - back= newButton(640,410,170,80,color.white,45,back), + toggle= newButton(495,520,260,80,color.white,45,function() + scene.push() + scene.swapTo("setting_touchSwitch") + end), + back= newButton(785,520,260,80,color.white,45,scene.back), + }, + setting_touchSwitch={ + b1= newSwitch(300,80, 40,VKAdisp(1),VKAcode(1)), + b2= newSwitch(300,140, 40,VKAdisp(2),VKAcode(2)), + b3= newSwitch(300,200, 40,VKAdisp(3),VKAcode(3)), + b4= newSwitch(300,260, 40,VKAdisp(4),VKAcode(4)), + b5= newSwitch(300,320, 40,VKAdisp(5),VKAcode(5)), + b6= newSwitch(300,380, 40,VKAdisp(6),VKAcode(6)), + b7= newSwitch(300,440, 40,VKAdisp(7),VKAcode(7)), + b8= newSwitch(300,500, 40,VKAdisp(8),VKAcode(8)), + b9= newSwitch(300,560, 40,VKAdisp(9),VKAcode(9)), + b10= newSwitch(300,620, 40,VKAdisp(10),VKAcode(10)), + b11= newSwitch(760,80, 40,VKAdisp(11),VKAcode(11)), + b12= newSwitch(760,140, 40,VKAdisp(12),VKAcode(12)), + b13= newSwitch(760,200, 40,VKAdisp(13),VKAcode(13)), + b14= newSwitch(760,260, 40,VKAdisp(14),VKAcode(14)), + b15= newSwitch(760,320, 40,VKAdisp(15),VKAcode(15)), + b16= newSwitch(760,380, 40,VKAdisp(16),VKAcode(16)), + b17= newSwitch(760,440, 40,VKAdisp(17),VKAcode(17)), + b18= newSwitch(760,500, 40,VKAdisp(18),VKAcode(18)), + b19= newSwitch(760,560, 40,VKAdisp(19),VKAcode(19)), + b20= newSwitch(760,620, 40,VKAdisp(20),VKAcode(20)), + norm= newButton(1080,150,240,80,color.white,50,function()for i=1,20 do VK_org[i].ava=i<11 end end), + pro= newButton(1080,300,240,80,color.white,40,function()for i=1,20 do VK_org[i].ava=true end end), + back= newButton(1080,600,240,80,color.white,50,scene.back), + }, + setting_trackSetting={ + VKTchW= newSlider(140,310,1000,10,40,nil,function()return setting.VKTchW end,function(i)setting.VKTchW=i;setting.VKCurW=math.max(setting.VKCurW,i)end), + VKCurW= newSlider(140,370,1000,10,40,nil,function()return setting.VKCurW end,function(i)setting.VKCurW=i;setting.VKTchW=math.min(setting.VKTchW,i)end), + back= newButton(1080,600,240,80,color.white,50,scene.back), }, help={ - his= newButton(1050,520,230,60,color.white,40,function()gotoScene("history")end,nil,"back"), + his= newButton(1050,520,230,60,color.white,40,function()scene.push()scene.swapTo("history")end,nil,"back"), qq= newButton(1050,600,230,60,color.white,40,function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end, function()return mobile end,"his"), - back= newButton(640, 600,180,60,color.white,40,back,nil,"qq"), + back= newButton(640, 600,180,60,color.white,40,scene.back,nil,"qq"), }, history={ prev= newButton(1155,170,180,180,color.white,70,function()love.keypressed("up")end,function()return sel==1 end), next= newButton(1155,400,180,180,color.white,70,function()love.keypressed("down")end,function()return sel==#updateLog-22 end), - back= newButton(1155,600,180,90,color.white,40,back), + back= newButton(1155,600,180,90,color.white,40,scene.back), }, stat={ path= newButton(980,620,250,60,color.white,30,function()love.system.openURL(love.filesystem.getSaveDirectory())end,function()return mobile end,"back"), - back= newButton(640,620,180,60,color.white,40,back,nil,"path"), + back= newButton(640,620,180,60,color.white,40,scene.back,nil,"path"), }, } for S,L in next,Widget do diff --git a/main.lua b/main.lua index a39e39c4..8b00bf97 100644 --- a/main.lua +++ b/main.lua @@ -14,21 +14,26 @@ NULL=function()end system=sys.getOS() local xOy=love.math.newTransform() local mx,my,mouseShow=-20,-20,false -local touching--1st touching ID +local touching--第一触摸ID -modeSel,levelSel=1,3--Initialize mode selection +local devMode=0 +modeSel,levelSel=1,3--初始模式选择 players={alive={},human=0} scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1} local scr=scr -scene="" curBG="none" bgmPlaying=nil voiceQueue={free=0} -local devMode=0 +virtualkeyDown,virtualkeyPressTime={},{} +for i=1,20 do + virtualkeyDown[i]=X + virtualkeyPressTime[i]=0 +end kb.setKeyRepeat(true) kb.setTextInput(false) ms.setVisible(false) +--Application Vars ------------------------------------------------------------- local Fonts={} function setFont(s) @@ -50,96 +55,9 @@ for i=1,10 do preField[i]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}end for i=11,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end freeRow={L=40}for i=1,40 do freeRow[i]={0,0,0,0,0,0,0,0,0,0}end --Game system Vars -setting={ - das=10,arr=2, - sddas=0,sdarr=2, - quickR=true,swap=true, - fine=false, - --game - - ghost=true,center=true, - smo=true,grid=false, - dropFX=3, - shakeFX=3, - atkFX=3, - frameMul=100, - -- - fullscreen=false, - bg=true, - bgblock=true, - lang=1, - skin=1, - --graphic - - sfx=8,bgm=6, - vib=3,voc=0, - --sound - - keyMap={ - {"left","right","x","z","c","up","down","space","tab","r","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""},--keyboard - {"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""}, - {"","","","","","","","","","","","",""},--joystick - }, - virtualkey={ - {80,720-80,6400,80}, --moveLeft - {240,720-80,6400,80}, --moveRight - {1280-240,720-80,6400,80}, --rotRight - {1280-400,720-80,6400,80}, --rotLeft - {1280-240,720-240,6400,80}, --rotFlip - {1280-80,720-80,6400,80}, --hardDrop - {1280-80,720-240,6400,80}, --softDrop - {1280-80,720-400,6400,80}, --hold - {80,80,6400,80}, --restart - }, - virtualkeyAlpha=3, - virtualkeyIcon=true, - virtualkeySwitch=false, - --control -} -stat={ - run=0,game=0,time=0, - extraPiece=0,extraRate=0, - key=0,rotate=0,hold=0,piece=0,row=0, - atk=0,send=0,recv=0,pend=0, - clear_1=0,clear_2=0,clear_3=0,clear_4=0, - spin_0=0,spin_1=0,spin_2=0,spin_3=0, - b2b=0,b3b=0,pc=0,score=0, -} -virtualkey={ - {80,720-80,6400,80},--moveLeft - {240,720-80,6400,80},--moveRight - {1280-240,720-80,6400,80},--rotRight - {1280-400,720-80,6400,80},--rotLeft - {1280-240,720-240,6400,80},--rotFlip - {1280-80,720-80,6400,80},--hardDrop - {1280-80,720-240,6400,80},--softDrop - {1280-80,720-400,6400,80},--hold - {80,360,6400,80},--func - {80,80,6400,80},--restart - --[[ - {x=0,y=0,r=0},--toLeft - {x=0,y=0,r=0},--toRight - {x=0,y=0,r=0},--toDown - ]] - -} -virtualkeyDown={X,X,X,X,X,X,X,X,X,X} -virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0} ---User datas&settings ------------------------------------------------------------- +scene=require("scene") +require("default_data") require("class") require("ai") require("toolfunc") @@ -202,100 +120,14 @@ local function getNewBlock() FX_BGblock.next=FX_BGblock.next%7+1 return t end -local sceneInit={ - load=function() - loading=1--Loading mode - loadnum=1--Loading counter - loadprogress=0--Loading bar(0~1) - loadTip=text.tips[rnd(#text.tips)] - end, - intro=function() - count=0 - BGM("blank") - updatePowerInfo() - end, - main=function() - modeEnv={} - if not players[1]then - newDemoPlayer(1,900,35,1.1) - end--create demo player - collectgarbage() - end, - music=function() - if bgmPlaying then - for i=1,#musicID do - if musicID[i]==bgmPlaying then - sel=i - return - end - end - else - sel=1 - end - end, - mode=function() - curBG="none" - destroyPlayers() - BGM("blank") - end, - custom=function() - sel=sel or 1 - destroyPlayers() - curBG=customRange.bg[customSel[12]] - BGM(customRange.bgm[customSel[13]]) - end, - draw=function() - curBG="none" - clearSureTime=0 - pen,sx,sy=1,1,1 - end, - play=function() - kb.setKeyRepeat(false) - restartCount=0 - if needResetGameData then - resetGameData() - needResetGameData=nil - end - end, - pause=function() - end, - setting_game=function() - curBG="none" - end, - setting_control=function() - curBoard=1 - keyboardSet=1 - joystickSet=1 - keyboardSetting=false - joystickSetting=false - end, - setting_touch=function() - curBG="game1" - defaultSel=1 - sel=nil - snapLevel=1 - end, - help=function() - curBG="none" - end, - history=function() - updateLog=require"updateLog" - curBG="lightGrey" - sel=1 - end, - quit=function() - love.timer.sleep(.3) - love.event.quit() - end, -} local function onVirtualkey(x,y) - local d2,nearest,distance + local d1,nearest,distance for K=1,#virtualkey do local b=virtualkey[K] - d2=(x-b[1])^2+(y-b[2])^2 - if d21 then + keyboardSet=keyboardSet-1 + SFX("move",.5) + end elseif key=="down"then - keyboardSet=min(keyboardSet+1,13) + if keyboardSet<20 then + keyboardSet=keyboardSet+1 + SFX("move",.5) + end elseif key=="left"then - curBoard=max(curBoard-1,1) + if curBoard>1 then + curBoard=curBoard-1 + SFX("rotate",.5) + end elseif key=="right"then - curBoard=min(curBoard+1,8) + if curBoard<8 then + curBoard=curBoard+1 + SFX("rotate",.5) + end end end -function gamepadDown.setting_control(key) +function gamepadDown.setting_key(key) if key=="back"then if joystickSetting then joystickSetting=false + SFX("error",.5) else - back() + scene.back() end elseif joystickSetting then for l=9,16 do - for y=1,12 do + for y=1,20 do if setting.keyMap[l][y]==key then setting.keyMap[l][y]="" end end end setting.keyMap[8+curBoard][joystickSet]=key + SFX("reach",.5) joystickSetting=false elseif key=="start"then joystickSetting=true + SFX("lock",.5) elseif key=="up"then - joystickSet=max(joystickSet-1,1) + if joystickSet>1 then + joystickSet=joystickSet-1 + SFX("move",.5) + end elseif key=="down"then - joystickSet=min(joystickSet+1,12) + if joystickSet<20 then + joystickSet=joystickSet+1 + SFX("move",.5) + end elseif key=="left"then - curBoard=max(curBoard-1,1) + if curBoard>1 then + curBoard=curBoard-1 + SFX("rotate",.5) + end elseif key=="right"then - curBoard=min(curBoard+1,8) + if curBoard<8 then + curBoard=curBoard+1 + SFX("rotate",.5) + end end end function mouseDown.setting_touch(x,y,k) - if k==2 then back()end - for K=1,#virtualkey do - local b=virtualkey[K] - if (x-b[1])^2+(y-b[2])^20 then + b.x=b.x+(b.x-B.x)*d*b.r*.00005 + b.y=b.y+(b.y-B.y)*d*b.r*.00005 + end + end + --按钮软碰撞(做不来hhh随便做一个,效果还行!) + local O=VK_org[t] + local _FW,_CW=setting.VKTchW*.1,1-setting.VKCurW*.1 + local _OW=1-_FW-_CW + B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW + --按钮自动跟随:手指位置,当前位置,原始位置,权重取决于设置 + end VIB(0) end end end function touchUp.play(id,x,y) - if setting.virtualkeySwitch then + if setting.VKSwitch then local t=onVirtualkey(x,y) if t then players[1]:releaseKey(t) @@ -631,26 +525,28 @@ function touchUp.play(id,x,y) end end function touchMove.play(id,x,y,dx,dy) - if setting.virtualkeySwitch then + if setting.VKSwitch then local l=tc.getTouches() for n=1,#virtualkey do - local b=virtualkey[n] + local B=virtualkey[n] for i=1,#l do local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i])) - if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end + if(x-B.x)^2+(y-B.y)^2<=B.r^2 then + goto nextButton + end end players[1]:releaseKey(n) - ::L:: + ::nextButton:: end end end function keyDown.play(key) - if key=="escape"and not sceneSwaping then + if key=="escape"and not scene.swapping then return(frame<180 and back or pauseGame)() end local m=setting.keyMap for p=1,players.human do - for k=1,12 do + for k=1,20 do if key==m[2*p-1][k]or key==m[2*p][k]then players[p]:pressKey(k) return @@ -661,7 +557,7 @@ end function keyUp.play(key) local m=setting.keyMap for p=1,players.human do - for k=1,12 do + for k=1,20 do if key==m[2*p-1][k]or key==m[2*p][k]then players[p]:releaseKey(k) return @@ -670,10 +566,10 @@ function keyUp.play(key) end end function gamepadDown.play(key) - if key=="back"then back()return end + if key=="back"then scene.back()return end local m=setting.keyMap for p=1,players.human do - for k=1,12 do + for k=1,20 do if key==m[2*p+7][k]or key==m[2*p+8][k]then players[p]:pressKey(k) return @@ -684,7 +580,7 @@ end function gamepadUp.play(key) local m=setting.keyMap for p=1,players.human do - for k=1,12 do + for k=1,20 do if key==m[2*p+7][k]or key==m[2*p+8][k]then players[p]:releaseKey(k) return @@ -702,7 +598,7 @@ function keyDown.history(key) elseif key=="down"then sel=min(sel+5,#updateLog-22) elseif key=="escape"then - back() + scene.back() end end ------------------------------------------------------------- @@ -742,10 +638,10 @@ local function widgetControl_key(i) if widget_sel then widget_sel=kb.isDown("lshift")and widget_sel.prev or widget_sel.next or widget_sel else - widget_sel=select(2,next(Widget[scene])) + widget_sel=select(2,next(Widget[scene.cur])) end elseif i=="space"or i=="return"then - if not sceneSwaping and widget_sel then + if not scene.swapping and widget_sel then widgetPress(widget_sel) end else @@ -770,10 +666,10 @@ local function widgetControl_gamepad(i) if widget_sel then widget_sel=i=="dpup"and widget_sel.prev or widget_sel.next or widget_sel else - widget_sel=select(2,next(Widget[scene])) + widget_sel=select(2,next(Widget[scene.cur])) end elseif i=="start"then - if not sceneSwaping and widget_sel then + if not scene.swapping and widget_sel then local W=widget_sel if W.hide and W.hide()then widget_sel=nil end if W.type=="button"then @@ -791,15 +687,16 @@ local function widgetControl_gamepad(i) end end function love.mousepressed(x,y,k,t,num) + if devMode>0 then print(x,y)end if t then return end mx,my=xOy:inverseTransformPoint(x,y) - if mouseDown[scene]then - mouseDown[scene](mx,my,k) + if mouseDown[scene.cur]then + mouseDown[scene.cur](mx,my,k) elseif k==2 then - back() + scene.back() end if k==1 then - if widget_sel and not sceneSwaping then + if widget_sel and not scene.swapping then widgetPress(widget_sel,mx,my) end end @@ -809,14 +706,14 @@ function love.mousemoved(x,y,dx,dy,t) if t then return end mx,my=xOy:inverseTransformPoint(x,y) dx,dy=dx/scr.k,dy/scr.k - if mouseMove[scene]then - mouseMove[scene](mx,my,dx,dy) + if mouseMove[scene.cur]then + mouseMove[scene.cur](mx,my,dx,dy) end if ms.isDown(1)and widget_sel then widgetDrag(widget_sel,mx,my,dx,dy) else widget_sel=nil - for _,W in next,Widget[scene]do + for _,W in next,Widget[scene.cur]do if not(W.hide and W.hide())and W:isAbove(mx,my)then widget_sel=W return @@ -828,12 +725,12 @@ end function love.mousereleased(x,y,k,t,num) if t then return end mx,my=xOy:inverseTransformPoint(x,y) - if mouseUp[scene]then - mouseUp[scene](mx,my,k) + if mouseUp[scene.cur]then + mouseUp[scene.cur](mx,my,k) end end function love.wheelmoved(x,y) - if wheelmoved[scene]then wheelmoved[scene](x,y)end + if wheelmoved[scene.cur]then wheelmoved[scene.cur](x,y)end end function love.touchpressed(id,x,y) @@ -842,20 +739,20 @@ function love.touchpressed(id,x,y) touching=id love.touchmoved(id,x,y,0,0) end - if touchDown[scene]then - touchDown[scene](id,xOy:inverseTransformPoint(x,y)) + if touchDown[scene.cur]then + touchDown[scene.cur](id,xOy:inverseTransformPoint(x,y)) end end function love.touchmoved(id,x,y,dx,dy) x,y=xOy:inverseTransformPoint(x,y) - if touchMove[scene]then - touchMove[scene](id,x,y,dx/scr.k,dy/scr.k) + if touchMove[scene.cur]then + touchMove[scene.cur](id,x,y,dx/scr.k,dy/scr.k) end if widget_sel then widgetDrag(widget_sel,x,y,dx,dy) else widget_sel=nil - for _,W in next,Widget[scene]do + for _,W in next,Widget[scene.cur]do if not(W.hide and W.hide())and W:isAbove(x,y)then widget_sel=W return @@ -870,13 +767,13 @@ function love.touchreleased(id,x,y) x,y=xOy:inverseTransformPoint(x,y) if id==touching then touching=nil - if widget_sel and not sceneSwaping then + if widget_sel and not scene.swapping then widgetPress(widget_sel,x,y) end widget_sel=nil end - if touchUp[scene]then - touchUp[scene](id,x,y) + if touchUp[scene.cur]then + touchUp[scene.cur](id,x,y) end end function love.keypressed(i) @@ -910,14 +807,14 @@ function love.keypressed(i) end end else - if keyDown[scene]then keyDown[scene](i) - elseif i=="escape"or i=="back"then back() + if keyDown[scene.cur]then keyDown[scene.cur](i) + elseif i=="escape"then scene.back() else widgetControl_key(i) end end end function love.keyreleased(i) - if keyUp[scene]then keyUp[scene](i)end + if keyUp[scene.cur]then keyUp[scene.cur](i)end end local keyMirror={ @@ -930,20 +827,20 @@ local keyMirror={ } function love.gamepadpressed(joystick,i) mouseShow=false - if gamepadDown[scene]then gamepadDown[scene](i) - elseif keyDown[scene]then keyDown[scene](keyMirror[i]or i) - elseif i=="back"then back() + if gamepadDown[scene.cur]then gamepadDown[scene.cur](i) + elseif keyDown[scene.cur]then keyDown[scene.cur](keyMirror[i]or i) + elseif i=="back"then scene.back() else widgetControl_gamepad(i) end end function love.gamepadreleased(joystick,i) - if gamepadUp[scene]then gamepadUp[scene](i) + if gamepadUp[scene.cur]then gamepadUp[scene.cur](i) end end --[[ function love.joystickpressed(js,k)end -function love.joystickaxis(js,axis,valend -function love.joystickhat(js,hat,dirend +function love.joystickaxis(js,axis,val)end +function love.joystickhat(js,hat,dir)end function love.sendData(data)end function love.receiveData(id,data)end ]] @@ -964,7 +861,7 @@ function love.resize(w,h) gc.replaceTransform(xOy) end function love.focus(f) - if system~="Android" and not f and scene=="play"then pauseGame()end + if system~="Android" and not f and scene.cur=="play"then pauseGame()end end function love.update(dt) -- if players then for k,v in pairs(players[1])do @@ -990,28 +887,25 @@ function love.update(dt) FX_BGblock.tm=rnd(20,30) end end - if sceneSwaping then - sceneSwaping.time=sceneSwaping.time-1 - if sceneSwaping.time==sceneSwaping.mid then - for k,W in next,Widget[scene]do - if W.type=="button"then - W.alpha=0 - end--Reset widgets' alpha - end + if scene.swapping then + local S=scene.swap + S.time=S.time-1 + if S.time==S.mid then + scene.cur=S.tar + scene.init(S.tar) widget_sel=nil - scene=sceneSwaping.tar - if sceneInit[scene] then sceneInit[scene]()end - --scene swapped! - elseif sceneSwaping.time==0 then - sceneSwaping=nil + --此时场景切换 + end + if S.time==0 then + scene.swapping=false end end - if Tmr[scene]then - Tmr[scene](dt) + if Tmr[scene.cur]then + Tmr[scene.cur](dt) end for i=#Task,1,-1 do local T=Task[i] - if(not T.P or T.P and scene=="play")and T.code(T.P,T.data)then + if T.code(T.P,T.data)then rem(Task,i) end end @@ -1042,8 +936,8 @@ function love.update(dt) end end end - -- for k,W in next,Widget[scene]do - -- end--update Widgets + -- for k,W in next,Widget[scene.cur]do + -- end--更新控件 end local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5} local FPS=love.timer.getFPS @@ -1059,9 +953,9 @@ function love.draw() gc.draw(img,FX_BGblock[n].x+(j-1)*30*size,FX_BGblock[n].y+(i-1)*30*size,nil,size) end end end - end - if Pnt[scene]then Pnt[scene]()end - for k,W in next,Widget[scene]do + end--Draw BG falling blocks + if Pnt[scene.cur]then Pnt[scene.cur]()end + for k,W in next,Widget[scene.cur]do if not(W.hide and W.hide())then W:draw() end @@ -1070,7 +964,7 @@ function love.draw() local r=Timer()*.5 gc.setColor(1,1,1,min(1-math.abs(1-r%1*2),.3)) r=int(r)%7+1 - gc.draw(mouseBlock[r],mx,my,Timer()%3.1416*4,20,20,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5) + gc.draw(miniBlock[r],mx,my,Timer()%3.1416*4,20,20,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5) gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5) gc.setColor(1,1,1)gc.circle("fill",mx,my,3) end--Awesome mouse! @@ -1085,27 +979,27 @@ function love.draw() gc.setColor(1,1,1,1-S[2]/S[3]) local r=(10*S[2]/S[3])^1.2 gc.rectangle("line",S[4]-r,S[5]-r,S[6]+2*r,S[7]+2*r) - --Ripple + --按钮波纹 elseif S[1]==1 then gc.setColor(S[4],S[5],S[6],1-S[2]/S[3]) gc.rectangle("fill",S[7],S[8],S[9],S[10],2) - --Shade + --开关/滑条残影 end end--sysFXs - if sceneSwaping then - sceneSwaping.draw() - end--Swaping animation + if scene.swapping then + scene.swap.draw(scene.swap.time) + end--Swapping animation if scr.r~=.5625 then gc.setColor(0,0,0) if scr.r>.5625 then local d=(scr.h-scr.w*9/16)*.5/scr.k gc.rectangle("fill",0,0,1280,-d) gc.rectangle("fill",0,720,1280,d) - else--high + else--高窗口 local d=(scr.w-scr.h*16/9)*.5/scr.k gc.rectangle("fill",0,0,-d,720) gc.rectangle("fill",1280,0,d,720) - end--wide + end--扁窗口 end--Black side setFont(20) gc.setColor(1,1,1) @@ -1121,12 +1015,12 @@ function love.draw() end function love.run() local T=love.timer - local lastFrame,lastUpdatePowerInfo=T.getTime(),T.getTime() + local lastFrame,lastFreshPow=T.getTime(),T.getTime() local readyDrawFrame=0 local mini=love.window.isMinimized local PUMP,POLL=love.event.pump,love.event.poll love.resize(gc.getWidth(),gc.getHeight()) - scene="load"sceneInit.load()--System Launch + scene.init("load")--Scene Launch return function() PUMP() for N,a,b,c,d,e in POLL()do @@ -1149,14 +1043,14 @@ function love.run() gc.present() end end - repeat - if Timer()-lastUpdatePowerInfo>5 then - updatePowerInfo() - lastUpdatePowerInfo=Timer() - end - until Timer()-lastFrame>.013 - T.sleep(.002) + while Timer()-lastFrame<.0158 do + T.sleep(.001) + end lastFrame=Timer() + if Timer()-lastFreshPow>5 then + updatePowerInfo() + lastFreshPow=Timer() + end end end @@ -1168,8 +1062,9 @@ end if fs.getInfo("usersetting")then loadSetting() elseif system=="Android"or system=="iOS" then - setting.virtualkeySwitch=true setting.swap=false +else + setting.VKSwitch=false end math.randomseed(os.time()*626) swapLanguage(setting.lang) diff --git a/paint.lua b/paint.lua index 8c888ab5..3df30516 100644 --- a/paint.lua +++ b/paint.lua @@ -51,7 +51,9 @@ local function dataOpt(i) elseif i==14 then return format("%0.2f",stat.atk/stat.row) elseif i==15 then - return stat.extraPiece.."["..(int(stat.extraRate/stat.piece*10000)*.01).."%]" + return stat.extraPiece + elseif i==16 then + return max(100-int(stat.extraRate/stat.piece*10000)*.01,0).."%" end end local statOptL={ @@ -177,29 +179,36 @@ local function drawAtkPointer(x,y) gc.circle("line",x,y,30*(1+a),6) end local function VirtualkeyPreview() - for i=1,#virtualkey do - local c=sel==i and .8 or 1 - gc.setColor(c,c,c,setting.virtualkeyAlpha*.1) - local b=virtualkey[i] - gc.setLineWidth(b[4]*.07) - gc.circle("line",b[1],b[2],b[4]-5) - if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,b[4]*.025,nil,18,18)end + if setting.VKSwitch then + for i=1,#VK_org do + local B=VK_org[i] + if B.ava then + local c=sel==i and .6 or 1 + gc.setColor(c,1,c,setting.VKAlpha*.1) + gc.setLineWidth(B.r*.07) + gc.circle("line",B.x,B.y,B.r) + if setting.VKIcon then gc.draw(VKIcon[i],B.x,B.y,nil,B.r*.025,nil,18,18)end + end + end end end local function drawVirtualkey() - local a=setting.virtualkeyAlpha*.1 + local a=setting.VKAlpha*.1 for i=1,#virtualkey do 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)) + local B=virtualkey[i] + if B.ava then + local _=virtualkeyDown[i]and gc.setColor(.7,.7,.7,a)or gc.setColor(1,1,1,a)--Dark magic + gc.setLineWidth(B.r*.07) + local ΔY=virtualkeyPressTime[i] + gc.circle("line",B.x,B.y+ΔY,B.r)--Outline circle + if setting.VKIcon then + gc.draw(VKIcon[i],B.x,B.y+ΔY,nil,B.r*.025,nil,18,18) + end--Icon + if ΔY>0 then + gc.setColor(1,1,1,a*ΔY*.1) + gc.circle("line",B.x,B.y,B.r*(1.4-ΔY*.04)) + end--Ripple end end end @@ -272,7 +281,7 @@ function Pnt.BG.game6() end gc.setColor(.3,.3,.3) local r=7-int(Timer()*.5)%7 - gc.draw(mouseBlock[r],640,360,Timer()%3.1416*6,400,400,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5) + gc.draw(miniBlock[r],640,360,Timer()%3.1416*6,400,400,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5) end--Fast lightning&spining tetromino local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=love.math.noise(i,j)+2 end end function Pnt.BG.matrix() @@ -413,12 +422,12 @@ function Pnt.draw() gc.translate(-200,-60) if clearSureTime>0 then gc.setColor(1,1,1,clearSureTime*.02) - gc.draw(drawableText.question,1100,570) + gc.draw(drawableText.question,760,11) end if pen>0 then gc.setLineWidth(13) gc.setColor(blockColor[pen]) - gc.rectangle("line",945,605,70,70) + gc.rectangle("line",746,460,70,70) elseif pen==-1 then gc.setLineWidth(5) gc.setColor(.9,.9,.9) @@ -453,7 +462,7 @@ function Pnt.play() gc.pop() end--FX animation gc.setColor(1,1,1) - if setting.virtualkeySwitch then drawVirtualkey()end + if setting.VKSwitch then drawVirtualkey()end if modeEnv.royaleMode then for i=1,#FX_badge do local b=FX_badge[i] @@ -501,9 +510,9 @@ function Pnt.pause() gc.print(text.stat[i+3],110,30*i+270) gc.print(dataOpt(i),305,30*i+270) end - for i=9,15 do + for i=9,16 do gc.print(text.stat[i+3],860,30*i+30) - gc.print(dataOpt(i),1000,30*i+30) + gc.print(dataOpt(i),1050,30*i+30) end setFont(40) if system~="Android"then @@ -532,40 +541,54 @@ function Pnt.setting_sound() gc.setColor(1,1,1) mDraw(drawableText.setting_sound,640,15) end -function Pnt.setting_control() +function Pnt.setting_key() local a=.3+sin(Timer()*15)*.1 - if keyboardSetting then - gc.setColor(1,.5,.5,a) - else - gc.setColor(.9,.9,.9,a) - end - gc.rectangle("fill",240,40*keyboardSet-10,200,40) - if joystickSetting then - gc.setColor(1,.5,.5,a) - else - gc.setColor(.9,.9,.9,a) - end - gc.rectangle("fill",440,40*joystickSet-10,200,40) + if keyboardSetting then gc.setColor(1,.3,.3,a)else gc.setColor(1,.7,.7,a)end + gc.rectangle("fill", + keyboardSet<11 and 240 or 840, + 45*keyboardSet+20-450*int(keyboardSet/11), + 200,45 + ) + if joystickSetting then gc.setColor(.3,.3,.1,a)else gc.setColor(.7,.7,1,a)end + gc.rectangle("fill", + joystickSet<11 and 440 or 1040, + 45*joystickSet+20-450*int(joystickSet/11), + 200,45 + ) + --Selection rect + + gc.setColor(1,.3,.3) + mDraw(drawableText.keyboard,340,35) + mDraw(drawableText.keyboard,940,35) + gc.setColor(.3,.3,1) + mDraw(drawableText.joystick,540,35) + mDraw(drawableText.joystick,1140,35) gc.setColor(1,1,1) - setFont(25) - for y=1,13 do - mStr(text.actName[y],150,40*y-5) - for x=1,2 do - mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y-3) + setFont(31) + for N=1,20 do + if N<11 then + gc.printf(text.actName[N],47,45*N+22,180,"right") + mStr(setting.keyMap[curBoard][N],340,45*N+22) + mStr(setting.keyMap[curBoard+8][N],540,45*N+22) + else + gc.printf(text.actName[N],647,45*N-428,180,"right") + mStr(setting.keyMap[curBoard][N],940,45*N-428) + mStr(setting.keyMap[curBoard+8][N],1040,45*N-428) end - gc.line(40,40*y-10,640,40*y-10) end - for x=1,4 do - gc.line(200*x-160,30,200*x-160,550) + gc.setLineWidth(2) + for x=40,1240,200 do + gc.line(x,65,x,515) + end + for y=65,515,45 do + gc.line(40,y,1240,y) end - gc.line(40,550,640,550) - mDraw(drawableText.keyboard,340,0) - mDraw(drawableText.joystick,540,0) - gc.draw(drawableText.ctrlSetHelp,50,620) setFont(40) - gc.print("P"..int(curBoard*.5+.5).."/P4",420,560) - gc.print(curBoard.."/8",580,560) + gc.print("Player:",170,590) + gc.print(int(curBoard*.5+.5),300,590) + gc.print(curBoard.."/8",580,590) + gc.draw(drawableText.ctrlSetHelp,50,650) end function Pnt.setting_touch() VirtualkeyPreview() @@ -581,6 +604,12 @@ function Pnt.setting_touch() end end end +function Pnt.setting_trackSetting() + gc.setColor(1,1,1) + mDraw(drawableText.VKTchW,140+50*setting.VKTchW,260) + mDraw(drawableText.VKOrgW,140+50*setting.VKTchW+50*setting.VKCurW,320) + mDraw(drawableText.VKCurW,640+50*setting.VKCurW,380) +end function Pnt.help() setFont(30) gc.setColor(1,1,1) diff --git a/player.lua b/player.lua index 19a83639..05ba3bf9 100644 --- a/player.lua +++ b/player.lua @@ -192,7 +192,7 @@ local TMP1={ TMP1[2]=TMP1[1] TMP1[4]=TMP1[3] TMP1[5]=TMP1[3] -local fineeseCtrlPar=TMP1 +local finesseCtrlPar=TMP1 TMP1,TMP2,TMP3,TMP4=nil----------release local CCblockID={4,3,5,6,1,2,0} local freshMethod={ @@ -516,7 +516,7 @@ function newDemoPlayer(id,x,y,size) P.ctrlCount=0 local bag1={1,2,3,4,5,6,7} - for i=1,7 do + for _=1,7 do P:newNext(rem(bag1,rnd(#bag1))) end P.freshNext=freshMethod.bag7 @@ -628,28 +628,28 @@ function newPlayer(id,x,y,size,AIdata) P.freshTime=0 P.spinLast,P.lastClear=false,nil P.spinSeq=0--for Ospin,each digit mean a spin - P.ctrlCount=0--key press time,for fineese check + P.ctrlCount=0--key press time,for finesse check P.his={rnd(7),rnd(7),rnd(7),rnd(7)} local s=P.gameEnv.sequence if s=="bag7"or s=="his4"then local bag1={1,2,3,4,5,6,7} - for i=1,7 do + for _=1,7 do P:newNext(rem(bag1,rnd(#bag1))) end elseif s=="rnd"then - for i=1,6 do + for _=1,6 do local r=rnd(7) P:newNext(r) end elseif s=="drought1"then local bag1={1,2,3,4,5,6} - for i=1,6 do + for _=1,6 do P:newNext(rem(bag1,rnd(#bag1))) end elseif s=="drought2"then local bag1={1,2,3,4,6,6} - for i=1,6 do + for _=1,6 do P:newNext(rem(bag1,rnd(#bag1))) end end @@ -1139,15 +1139,13 @@ function player.draw(P) if P.gameEnv.hold then mDraw(drawableText.hold,-82,-10) - if P.holded then gc.setColor(.6,.6,.6)end - for i=1,#P.hd.bk do - local B=P.hd.bk - for j=1,#B[1]do - if B[i][j]then - drawPixel(i+17.5-#B*.5,j-2.7-#B[1]*.5,P.hd.color) - end + if P.holded then gc.setColor(.6,.5,.5)end + local B=P.hd.bk + for i=1,#B do for j=1,#B[1]do + if B[i][j]then + drawPixel(i+17.5-#B*.5,j-2.7-#B[1]*.5,P.hd.color) end - end + end end end--Hold gc.setColor(1,1,1) mDraw(drawableText.next,381,-10) @@ -1264,7 +1262,20 @@ function player.demoDraw(P) end end end--Block end - ::E:: + gc.setColor(1,1,1,.3) + local N=miniBlock[P.hd.id] + if N then + gc.draw(N,15,30,nil,16,nil,0,N:getHeight()*.5) + end + local N=1 + ::L:: + if N<=P.gameEnv.next and P.next[N]then + local p=miniBlock[P.next[N].id] + gc.draw(p,285,40*N-10,nil,16,nil,p:getWidth(),p:getHeight()*.5) + N=N+1 + goto L + end + --Next gc.setColor(1,1,1) gc.draw(PTC.dust[P.id]) gc.translate(-P.fieldOffX,-P.fieldOffY) @@ -1377,8 +1388,8 @@ local function checkrow(P,start,height)--(cy,r) c=c+1 if not P.small then local S=PTC.dust[P.id] - for k=1,120 do - S:setPosition(rnd(300),600-30*h+rnd(30)) + for _=1,100 do + S:setPosition(rnd(300),630-30*(h+c)+rnd(30)) S:emit(2) end end @@ -1403,11 +1414,15 @@ end function player:fineError(rate) self.stat.extraPiece=self.stat.extraPiece+1 self.stat.extraRate=self.stat.extraRate+rate - if self.gameEnv.fineKill then - SFX("error_long") + if self.human then + if self.gameEnv.fineKill then + SFX("error_long") + Event.lose(self) + elseif setting.fine then + SFX("error") + end + elseif self.gameEnv.fineKill then Event.lose(self) - else - SFX("error") end end function player:garbageSend(R,send,time,...) @@ -1482,9 +1497,9 @@ function player:freshTarget() self:changeAtk(randomTarget(self)) end elseif self.atkMode==2 then - self:changeAtk(P~=mostBadge and mostBadge or secBadge or randomTarget(self)) + self:changeAtk(self~=mostBadge and mostBadge or secBadge or randomTarget(self)) elseif self.atkMode==3 then - self:changeAtk(P~=mostDangerous and mostDangerous or secDangerous or randomTarget(self)) + self:changeAtk(self~=mostDangerous and mostDangerous or secDangerous or randomTarget(self)) elseif self.atkMode==4 then for i=1,#self.atker do if not self.atker[i].alive then @@ -1728,7 +1743,7 @@ function player:spin(d,ifpre) end function player:hold(ifpre) if not self.holded and self.waiting==-1 and self.gameEnv.hold then - --Fineese check + --Finesse check local H,B=self.hd,self.cur if H and H.id==B.id and H.name==B.name then self:fineError(1.5) @@ -1780,7 +1795,7 @@ function player:resetblock() if self.AI_mode=="CC"then BOT.addNext(self.AI_bot,CCblockID[self.next[self.AIdata.next].id])end self.sc,self.dir=scs[self.cur.id][0],0--spin center/direction self.r,self.c=#self.cur.bk,#self.cur.bk[1]--row/column - self.curX,self.curY=blockPos[self.cur.id],21+ceil(self.fieldBeneath/30)-self.r+min(int(#self.field*.2),2) + self.curX,self.curY=blockPos[self.cur.id],21+ceil(self.fieldBeneath/30)+min(int(#self.field*.15)-self.r,0)--初始高度:7格+1,14格+2(非I) self.dropDelay,self.lockDelay,self.freshTime=self.gameEnv.drop,self.gameEnv.lock,0 if self.keyPressing[8]then self:hold(true)end @@ -1840,8 +1855,9 @@ function player:drop()--(Place piece) dospin=false end - if self.gameEnv.fine then - if self.curY>18 then goto 通过测试 end + --极简检测 + if self.curY>18 then goto 通过测试 end--高处易误判 + do local y0=self.curY local x,c=self.curX,self.c local B=self.cur.bk @@ -1868,14 +1884,16 @@ function player:drop()--(Place piece) dir=dir-2 end end--SZI的逆态视为顺态 - local R,I=self.ctrlCount,fineeseCtrlPar[id][dir][self.curX]--Real key/Ideal key + local R,I=self.ctrlCount,finesseCtrlPar[id][dir][self.curX]--Real key/Ideal key local d=R-I if d<=0 then goto 通过测试 end - if I==0 then I=.67 end - self:fineError(R/I) - end--极简检测 + if I==0 then I=1 end + local rate=R/I + if rate>2.5 then rate=2.5 end + self:fineError(rate) + end ::通过测试:: if cc>0 then @@ -2240,19 +2258,6 @@ function player.act.restart(P) resetPartGameData() end end -function player.act.insDown(P) - if P.curY~=P.y_img then - if not P.small then - if setting.dropFX>0 then - P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) - end - if setting.shakeFX>0 then - P.fieldOffY=2*setting.shakeFX - end - end - P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false - end -end function player.act.insLeft(P,auto) local x0,y0=P.curX,P.curY while not ifoverlap(P,P.cur.bk,P.curX-1,P.curY)do @@ -2295,6 +2300,19 @@ function player.act.insRight(P,auto) P.ctrlCount=P.ctrlCount+1 end end +function player.act.insDown(P) + if P.curY~=P.y_img then + if not P.small then + if setting.dropFX>0 then + P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) + end + if setting.shakeFX>0 then + P.fieldOffY=2*setting.shakeFX + end + end + P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false + end +end function player.act.down1(P) if P.curY~=P.y_img then P.curY=P.curY-1 @@ -2302,7 +2320,7 @@ function player.act.down1(P) end end function player.act.down4(P) - for i=1,4 do + for _=1,4 do if P.curY~=P.y_img then P.curY=P.curY-1 P.spinLast=false @@ -2311,5 +2329,35 @@ function player.act.down4(P) end end end -function player.act.quit(P)P:lose()end +function player.act.down10(P) + for _=1,10 do + if P.curY~=P.y_img then + P.curY=P.curY-1 + P.spinLast=false + else + break + end + end +end +function player.act.dropLeft(P) + P.act.insLeft(P) + P.act.hardDrop(P) +end +function player.act.dropRight(P) + P.act.insRight(P) + P.act.hardDrop(P) +end +function player.act.addLeft(P) + P.act.insLeft(P) + P.act.insDown(P) + P.act.insRight(P) + P.act.hardDrop(P) +end +function player.act.addRight(P) + P.act.insRight(P) + P.act.insDown(P) + P.act.insLeft(P) + P.act.hardDrop(P) +end + -------------------------------------------------- \ No newline at end of file diff --git a/scene.lua b/scene.lua new file mode 100644 index 00000000..1df70662 --- /dev/null +++ b/scene.lua @@ -0,0 +1,199 @@ +local scene={ + cur="load",--Current scene + swapping=false,--ifSwapping + swap={ + tar=nil, --Swapping target + style=nil, --Swapping target + mid=nil, --Loading point + time=nil, --Full swap time + draw=nil, --Swap draw + }, + seq={"quit","slowFade"},--Back sequence +} +local sceneInit={ + quit=love.event.quit, + load=function() + loading=1--Loading mode + loadnum=1--Loading counter + loadprogress=0--Loading bar(0~1) + loadTip=text.tips[math.random(#text.tips)] + end, + intro=function() + count=0 + BGM("blank") + end, + main=function() + curBG="none" + BGM("blank") + destroyPlayers() + modeEnv={} + if not players[1]then + newDemoPlayer(1,900,35,1.1) + end--create demo player + collectgarbage() + end, + music=function() + if bgmPlaying then + for i=1,#musicID do + if musicID[i]==bgmPlaying then + sel=i + return + end + end + else + sel=1 + end + end, + mode=function() + curBG="none" + BGM("blank") + destroyPlayers() + end, + custom=function() + sel=sel or 1 + destroyPlayers() + curBG=customRange.bg[customSel[12]] + BGM(customRange.bgm[customSel[13]]) + end, + draw=function() + curBG="none" + clearSureTime=0 + pen,sx,sy=1,1,1 + end, + play=function() + love.keyboard.setKeyRepeat(false) + restartCount=0 + if needResetGameData then + resetGameData() + needResetGameData=nil + end + end, + pause=function() + end, + setting_game=function() + curBG="none" + end, + setting_key=function() + curBoard=1 + keyboardSet=1 + joystickSet=1 + keyboardSetting=false + joystickSetting=false + end, + setting_touch=function() + curBG="game2" + defaultSel=1 + sel=nil + snapLevel=1 + end, + setting_touchSwitch=function() + curBG="matrix" + end, + help=function() + curBG="none" + end, + history=function() + updateLog=require"updateLog" + curBG="lightGrey" + sel=1 + end, + quit=function() + love.timer.sleep(.3) + love.event.quit() + end, +} +local swapDeck_data={ + {4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1}, + {1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2}, + {3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2}, + {2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4}, + {7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5}, + {3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6}, + {2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7}, + {5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8}, + {7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8}, +}--Block id [ZSLJTOI] ,dir,x,y +local gc=love.graphics +local swap={ + none={1,0,NULL}, + flash={8,1,function()gc.clear(1,1,1)end}, + fade={30,15,function(t) + local t=t>15 and 2-t/15 or t/15 + gc.setColor(0,0,0,t) + gc.rectangle("fill",0,0,1280,720) + end}, + slowFade={120,40,function(t) + local t=t>40 and 1.5-t/80 or t/40 + gc.setColor(0,0,0,t) + gc.rectangle("fill",0,0,1280,720) + end}, + deck={50,8,function(t) + gc.setColor(1,1,1) + if t>8 then + local t=t<15 and 15 or t + for i=1,51-t do + local bn=swapDeck_data[i][1] + local b=blocks[bn][swapDeck_data[i][2]] + local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4] + for y=1,#b do for x=1,#b[1]do + if b[y][x]then + gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3) + end + end end + end + end + if t<17 then + gc.setColor(1,1,1,1-(t>8 and t-8 or 8-t)*.125) + gc.rectangle("fill",0,0,1280,720) + end + end}, +}--Scene swapping animations +local backFunc={ + load=love.event.quit, + pause=function() + love.keyboard.setKeyRepeat(true) + updateStat() + saveData() + clearTask("play") + end, + setting_game=function() + saveSetting() + end, +} +function scene.init(s) + if sceneInit[s]then sceneInit[s]()end +end +function scene.push(tar,style) + if not scene.swapping then + local m=#scene.seq + scene.seq[m+1]=tar or scene.cur + scene.seq[m+2]=style or"fade" + end +end +function scene.swapTo(tar,style) + local S=scene.swap + if not scene.swapping and tar~=scene.cur then + scene.swapping=true + if not style then style="fade"end + S.tar=tar + S.style=style + S.time=swap[style][1] + S.mid=swap[style][2] + S.draw=swap[style][3] + widget_sel=nil + if style~="none"then SFX("swipe")end + end +end +function scene.back() + if not scene.swapping then + if backFunc[scene.cur] then backFunc[scene.cur]()end + --func when scene end + local m=#scene.seq + if m>0 then + scene.swapTo(scene.seq[m-1],scene.seq[m]) + scene.seq[m],scene.seq[m-1]=nil + --Poll&Back to preScene + end + end +end +return scene \ No newline at end of file diff --git a/texture.lua b/texture.lua index 1d693cd3..ba96b56b 100644 --- a/texture.lua +++ b/texture.lua @@ -1,5 +1,6 @@ local gc=love.graphics local N,c=gc.newImage +local int=math.floor local function T(s,t)return gc.newText(setFont(s),t)end local function C(x,y) c=gc.newCanvas(x,y) @@ -15,16 +16,18 @@ for i=1,13 do blockSkinmini[i]=C(6,6) end -virtualkeyIcon={} -for i=1,10 do - virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png") +local VKI=N("/image/virtualkey.png") +VKIcon={} +for i=1,#actName do + VKIcon[i]=C(36,36) + gc.draw(VKI,(i-1)%5*-36,int((i-1)*.2)*-36) end gc.setColor(1,1,1) -mouseBlock={} +miniBlock={} for i=1,7 do local b=blocks[i][0] - mouseBlock[i]=C(#b[1],#b) + miniBlock[i]=C(#b[1],#b) gc.setColor(blockColor[i]) for y=1,#b do for x=1,#b[1]do if b[y][x]then @@ -68,9 +71,12 @@ drawableText={ custom=T(80), setting_game=T(80),setting_graphic=T(80),setting_sound=T(80), keyboard=T(25),joystick=T(25), - ctrlSetHelp=T(25), + ctrlSetHelp=T(30), musicRoom=T(80), nowPlaying=T(50), warning=T(30), + VKTchW=T(30), + VKOrgW=T(30), + VKCurW=T(30), } -c=gc.setCanvas() \ No newline at end of file +gc.setCanvas() \ No newline at end of file diff --git a/timer.lua b/timer.lua index 63b08533..48967181 100644 --- a/timer.lua +++ b/timer.lua @@ -47,7 +47,7 @@ function Tmr.load() loadnum=loadnum+1 if loadnum==48 then stat.run=stat.run+1 - gotoScene("intro","none") + scene.swapTo("intro","none") end end end diff --git a/toolfunc.lua b/toolfunc.lua index a7aa4ec5..dc9d979a 100644 --- a/toolfunc.lua +++ b/toolfunc.lua @@ -73,12 +73,15 @@ local drawableTextLoad={ "next","hold", "pause","finish", "custom", - "setting_game","setting_graphic","setting_sound", + "setting_game", + "setting_graphic", + "setting_sound", "keyboard","joystick", "ctrlSetHelp", "musicRoom", "nowPlaying", "warning", + "VKTchW","VKOrgW","VKCurW", } function swapLanguage(l) text=require("language/"..langID[l]) @@ -194,103 +197,12 @@ function BGM(s) end end -local swapDeck_data={ - {4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1}, - {1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2}, - {3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2}, - {2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4}, - {7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5}, - {3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6}, - {2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7}, - {5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8}, - {7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8}, -}--Block id [ZSLJTOI] ,dir,x,y -local swap={ - none={2,1,d=NULL}, - flash={8,1,d=function()gc.clear(1,1,1)end}, - fade={30,15,d=function() - local t=1-abs(sceneSwaping.time*.06667-1) - gc.setColor(0,0,0,t) - gc.rectangle("fill",0,0,1280,720) - end}, - deck={50,8,d=function() - local t=sceneSwaping.time - gc.setColor(1,1,1) - if t>8 then - local t=max(t,15) - for i=1,51-t do - local bn=swapDeck_data[i][1] - local b=blocks[bn][swapDeck_data[i][2]] - local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4] - for y=1,#b do for x=1,#b[1]do - if b[y][x]then - gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3) - end - end end - end - end - if t<17 then - gc.setColor(1,1,1,(8-abs(t-8))*.125) - gc.rectangle("fill",0,0,1280,720) - end - end}, -}--Scene swapping animations -function gotoScene(s,style) - if not sceneSwaping and s~=scene then - style=style or"fade" - sceneSwaping={ - tar=s,style=style, - time=swap[style][1],mid=swap[style][2], - draw=swap[style].d - } - widget_sel=nil - if style~="none"then - SFX("swipe") - end - end -end function updateStat() local S=players[1].stat for k,v in next,S do stat[k]=stat[k]+S[k] end end -local prevMenu={ - load=love.event.quit, - intro="quit", - main="intro", - music="main", - mode="main", - custom="mode", - draw="custom", - play=function() - kb.setKeyRepeat(true) - updateStat() - saveData() - clearTask("play") - gotoScene(curMode.id~="custom"and"mode"or"custom","deck") - end, - setting_game=function() - saveSetting() - gotoScene("main") - end, - setting_control="setting_game", - setting_touch= "setting_game", - help="main", - history="help", - stat="main", -} -prevMenu.pause=prevMenu.play -prevMenu.setting_graphic=prevMenu.setting_game -prevMenu.setting_sound=prevMenu.setting_game -function back() - local t=prevMenu[scene] - if type(t)=="string"then - gotoScene(t) - else - t() - end -end function randomTarget(P) if #players.alive>1 then @@ -380,10 +292,10 @@ function pauseGame() end end end - gotoScene("pause","none") + scene.swapTo("pause","none") end function resumeGame() - gotoScene("play","fade") + scene.swapTo("play","fade") end function loadGame(mode,level) --rec={} @@ -391,7 +303,7 @@ function loadGame(mode,level) drawableText.modeName:set(text.modeName[mode]) drawableText.levelName:set(modeLevel[modeID[mode]][level]) needResetGameData=true - gotoScene("play","deck") + scene.swapTo("play","deck") end function resetPartGameData() frame=30 @@ -407,9 +319,7 @@ function resetPartGameData() players[i]:changeAtk(randomTarget(players[i])) end end - for i=1,#virtualkey do - virtualkey[i].press=false - end + restoreVirtualKey() collectgarbage() end function resetGameData() @@ -451,14 +361,16 @@ function resetGameData() garbageSpeed=.3 pushSpeed=2 end - for i=1,#virtualkey do - virtualkey[i].press=false - end + restoreVirtualKey() stat.game=stat.game+1 local m,p=#freeRow,40*#players+1 while freeRow[p]do m,freeRow[m]=m-1 end + for i=1,20 do + virtualkeyDown[i]=X + virtualkeyPressTime[i]=0 + end freeRow.L=#freeRow SFX("ready") collectgarbage() @@ -473,6 +385,8 @@ function gameStart() end end + + local dataOpt={ "run","game","time", "extraPiece","extraRate", @@ -485,9 +399,6 @@ local dataOpt={ function loadData() userData:open("r") local t=userData:read() - if not find(t,"spin")then - t=love.data.decompress("string","zlib",t) - end t=splitS(t,"\r\n") userData:close() for i=1,#t do @@ -515,12 +426,10 @@ function saveData() userData:write(t) userData:close() end + function loadSetting() userSetting:open("r") local t=userSetting:read() - if not find(t,"virtual")then - t=love.data.decompress("string","zlib",t) - end t=splitS(t,"\r\n") userSetting:close() for i=1,#t do @@ -534,12 +443,16 @@ function loadSetting() elseif t=="fullscreen"then setting.fullscreen=v=="true" love.window.setFullscreen(setting.fullscreen) - elseif t=="virtualkeyAlpha"then - setting.virtualkeyAlpha=min(int(abs(toN(v))),10) elseif + --三个触摸设置项 + t=="VKTchW"or t=="VKCurW"or t=="VKAlpha" + then + setting.VKTchW=min(int(abs(toN(v))),10) + elseif + --开关设置们 t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="quickR"or t=="fine"or t=="bgblock"or t=="smo"or - t=="virtualkeyIcon"or t=="virtualkeySwitch" + t=="VKSwitch"or t=="VKTrack"or t=="VKIcon" then setting[t]=v=="true" elseif t=="frameMul"then @@ -561,14 +474,15 @@ function loadSetting() setting.keyMap[i][j]=v1[j] end end - elseif t=="virtualkey"then + elseif t=="VK"then v=splitS(v,"/") - for i=1,10 do + local SK + for i=1,#v do if v[i]then - virtualkey[i]=splitS(v[i],",") - for j=1,4 do - virtualkey[i][j]=toN(virtualkey[i][j]) - end + SK=splitS(v[i],",") + local K=VK_org[i] + K.ava=SK[1]=="T" + K.x,K.y,K.r=toN(SK[2]),toN(SK[3]),toN(SK[4]) end end end @@ -598,17 +512,21 @@ local saveOpt={ "sfx","bgm", "vib","voc", - "virtualkeyAlpha", - "virtualkeyIcon", - "virtualkeySwitch", + "VKSwitch", + "VKTrack", + "VKIcon", + "VKAlpha", } function saveSetting() - local vk={} - for i=1,10 do - for j=1,4 do - virtualkey[i][j]=int(virtualkey[i][j]+.5) - end--Saving a integer is better? - vk[i]=concat(virtualkey[i],",") + local vk={}--virtualkey table + for i=1,#VK_org do + local V=VK_org[i] + vk[i]=concat({ + V.ava and"T"or"F", + int(V.x+.5), + int(V.y+.5), + V.r, + },",") end--pre-pack virtualkey setting local map={} for i=1,16 do @@ -616,11 +534,10 @@ function saveSetting() end local t={ "keymap="..toS(concat(map,"/")), - "virtualkey="..toS(concat(vk,"/")), + "VK="..toS(concat(vk,"/")), } for i=1,#saveOpt do - t[i+2]=saveOpt[i].."="..toS(setting[saveOpt[i]]) - --not always i+2! + t[#t+1]=saveOpt[i].."="..toS(setting[saveOpt[i]]) end t=concat(t,"\r\n") userSetting:open("w") diff --git a/updateLog.lua b/updateLog.lua index 7057aeb1..2d9e501e 100644 --- a/updateLog.lua +++ b/updateLog.lua @@ -4,16 +4,16 @@ Patron(rmb10+): [D*a]? Future outlook: Normal Things: + in-game setting(scene-sequence system) + powerinfo switch + splashing block ajustable next count bag line in all mode - force fineese mode highscore of most modes custom block color/direction - custom sequence - virtual key switch(all keys) + custom block sequence combo mode - infinite c4w mode - any screen size + auto GUI in any screen size CC smarter(think of gaebage buffer) fineese/bigbang mode & easier CTWC new AI:task-Z @@ -24,8 +24,18 @@ Future outlook: infinite 1v1 square mode more FXs & 3d features & animations +0.7.29: + auto-tracking virtual key,adjustable parameters! + can switch on/off virtuakeys + add 7 more key + better finesse rate calculating + block generating position on Y-axis changed + new icon for android + can use preset in custom mode with keyboard + adjusted GUI + many bug fixed 0.7.28: - add fineese check + add fineese check(almost useful) code optimized 0.7.27: super O transform system