diff --git a/BGM/8-bit happiness.ogg b/BGM/8-bit happiness.ogg index 794e38f6..c73fc8a3 100644 Binary files a/BGM/8-bit happiness.ogg and b/BGM/8-bit happiness.ogg differ diff --git a/BGM/blank.ogg b/BGM/blank.ogg index 4d12965a..8f86f2b9 100644 Binary files a/BGM/blank.ogg and b/BGM/blank.ogg differ diff --git a/BGM/cruelty.ogg b/BGM/cruelty.ogg index 2fdb8dfd..8bb9443c 100644 Binary files a/BGM/cruelty.ogg and b/BGM/cruelty.ogg differ diff --git a/BGM/end.ogg b/BGM/end.ogg index e89b77ac..c1be403c 100644 Binary files a/BGM/end.ogg and b/BGM/end.ogg differ diff --git a/BGM/final.ogg b/BGM/final.ogg index 554009a9..2f94525c 100644 Binary files a/BGM/final.ogg and b/BGM/final.ogg differ diff --git a/BGM/infinite.ogg b/BGM/infinite.ogg index 613970ca..e39369f3 100644 Binary files a/BGM/infinite.ogg and b/BGM/infinite.ogg differ diff --git a/BGM/newera.ogg b/BGM/newera.ogg index afc07959..0f68b302 100644 Binary files a/BGM/newera.ogg and b/BGM/newera.ogg differ diff --git a/BGM/push.ogg b/BGM/push.ogg index aeaf51e4..2d29cb25 100644 Binary files a/BGM/push.ogg and b/BGM/push.ogg differ diff --git a/BGM/race.ogg b/BGM/race.ogg index e8548faa..5276fdfe 100644 Binary files a/BGM/race.ogg and b/BGM/race.ogg differ diff --git a/BGM/reason.ogg b/BGM/reason.ogg index 6a2cf560..05b5f4ef 100644 Binary files a/BGM/reason.ogg and b/BGM/reason.ogg differ diff --git a/BGM/rockblock.ogg b/BGM/rockblock.ogg index 16843419..842382cb 100644 Binary files a/BGM/rockblock.ogg and b/BGM/rockblock.ogg differ diff --git a/BGM/secret7th.ogg b/BGM/secret7th.ogg index 2747238c..1d3e3001 100644 Binary files a/BGM/secret7th.ogg and b/BGM/secret7th.ogg differ diff --git a/BGM/secret8th.ogg b/BGM/secret8th.ogg index ac3c049f..88137880 100644 Binary files a/BGM/secret8th.ogg and b/BGM/secret8th.ogg differ diff --git a/BGM/shining terminal.ogg b/BGM/shining terminal.ogg index 346ecc0f..17f8dc1d 100644 Binary files a/BGM/shining terminal.ogg and b/BGM/shining terminal.ogg differ diff --git a/BGM/way.ogg b/BGM/way.ogg index 57542671..db6f3fe3 100644 Binary files a/BGM/way.ogg and b/BGM/way.ogg differ diff --git a/class.lua b/class.lua index 221bdfce..233f90bc 100644 --- a/class.lua +++ b/class.lua @@ -1,4 +1,6 @@ +local gc=love.graphics local rem=table.remove +local format=string.format Task={} function Task:update() if(not self.P or self.P and scene=="play")and self:code(self.P,self.data)then @@ -42,21 +44,139 @@ function clearTask(opt) end end -function newButton(x,y,w,h,color,font,code,hide,up,down,left,right) - return{ - type="button", - x=x-w*.5,y=y-h*.5,w=w,h=h, - color=color,font=font, - code=code,hide=hide, - up=up,down=down,left=left,right=right, - } +local a={a=1,b=2} +local x,y=pairs(a) +assert(x==next) +assert(y==a) +--java王宇翔 +local button,switch,slider={type="button"},{type="switch"},{type="slider"}--WIDGET OBJECT LIB +function newButton(x,y,w,h,color,font,code,hide,N) + local _={ + x=x-w*.5,y=y-h*.5, + w=w,h=h, + color=color, + font=font, + code=code, + hide=hide, + next=N, + }for k,v in next,button do _[k]=v end return _ end -function newSlider(x,y,w,unit,color,font,code,hide,up,down,left,right) - return{ - type="slider", - x=x,y=y,w=w,unit=unit, - color=color,font=font, - code=code,hide=hide, - up=up,down=down,left=left,right=right, - } +function button:ifAbove(x,y) + return x>self.x and xself.y and yself.x and xself.y-20 and yself.x-10 and xself.y-20 and y0 do local r=rnd(2,49) if L[r]then L[r],t=false,t-1 end - until t==0 + end local min,max if LV==1 then min,max=3,5 elseif LV==2 then min,max=4,8 @@ -225,11 +225,11 @@ loadmode={ 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=2*int(LV^2.5) - repeat + 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 - until t==0 + end local min,max if LV==1 then min,max=3,5 elseif LV==2 then min,max=4,9 @@ -318,7 +318,7 @@ loadmode={ mesDisp={ --Default:font=35,white sprint=function() - setFont(65) + setFont(60) local r=max(P.gameEnv.target-P.stat.row,0) mStr(r,-82,265) if r<21 and r>0 then @@ -415,7 +415,7 @@ mesDisp={ end, c4wtrain=function() setFont(50) - mStr(max(200-P.stat.row,0),-82,220) + mStr(max(100-P.stat.row,0),-82,220) mStr(P.combo,-82,310) mStr(P.modeData.point,-82,400) setFont(20) @@ -479,7 +479,7 @@ mesDisp={ if P.gameEnv.puzzle or P.gameEnv.target>1e10 then setFont(25) mStr("Rows",-82,290) - setFont(65) + setFont(60) mStr(P.stat.row,-82,225) else setFont(60) @@ -497,7 +497,7 @@ mesDisp={ gc.setColor(c[1],c[2],c[3],.6) gc.rectangle("line",30*x-25,605-30*y,20,20) gc.rectangle("line",30*x-20,610-30*y,10,10) - elseif B==0 then + elseif B==-1 then gc.setColor(1,1,1,.4) gc.line(30*x-25,605-30*y,30*x-5,625-30*y) gc.line(30*x-25,625-30*y,30*x-5,605-30*y) @@ -653,50 +653,49 @@ Event={ P.modeData.point=P.modeData.point+s if P.modeData.point%100==99 then SFX("blip_1") - elseif P.modeData.point>100*P.modeData.event+100 then + elseif P.modeData.point>=100*(P.modeData.event+1)then local s=P.modeData.event+1;P.modeData.event=s--level up! - showText(P,text.stage(s),"fly",80,-120) local E=P.gameEnv local mode=curMode.lv if mode==1 then - curBG=s==2 and"game1"or s==3 and"game2"or s==4 and"game3"or s==5 and"game4" + curBG=s==1 and"game1"or s==2 and"game2"or s==3 and"game3"or s==4 and"game4" E.lock=rush_lock[s] E.wait=rush_wait[s] E.fall=rush_fall[s] E.das=10-s - if s==3 then P.gameEnv.arr=2 end - if s==5 then P.gameEnv.bone=true end + if s==2 then P.gameEnv.arr=2 end + if s==4 then P.gameEnv.bone=true end elseif mode==2 then - curBG=s==2 and"game3"or s==3 and"game4"or s==4 and"game5"or s==5 and"game6" + curBG=s==1 and"game3"or s==2 and"game4"or s==3 and"game5"or s==4 and"game6" E.lock=death_lock[s] E.wait=death_wait[s] E.fall=death_fall[s] - E.das=int(7.3-s*.4) - if s==4 then P.gameEnv.bone=true end + E.das=int(6.9-s*.4) + if s==3 then P.gameEnv.bone=true end + end + if s==5 then + P.modeData.point,P.modeData.event=500,4 + Event.win() + else + showText(P,text.stage(s),"fly",80,-120) end SFX("reach") end end, master_score_hard=function() local c=#P.clearing - if P.modeData.point%100<60 then - P.modeData.point=P.modeData.point+(c<3 and c+1 or c==3 and 5 or 7)--[1]2 3 5 7 - if P.modeData.point%100>59 then SFX("blip_1")end - return + if c==0 then return end + local s + if P.lastClear<10 then + s=c else - if c==0 then return end - local s - if P.lastClear<10 then - s=c-1--0,1,2,X - else - s=int(c^1.45)--1,2,4,7 - end - if P.combo>9 then s=s+3 - elseif P.combo>4 then s=s+2 - elseif P.combo>2 then s=s+1 - end - P.modeData.point=P.modeData.point+s + s=c<3 and c+1 or c<5 and 6 or 10 end + if P.combo>9 then s=s+2 + elseif P.combo>4 then s=s+1 + end + P.modeData.point=P.modeData.point+s + if P.modeData.point%100==99 then SFX("blip_1")end if int(P.modeData.point*.01)>P.modeData.event then local s=P.modeData.event+1;P.modeData.event=s--level up! showText(P,text.stage(s),"fly",80,-120) @@ -794,7 +793,7 @@ Event={ if P.combo>P.modeData.point then P.modeData.point=P.combo end - if P.stat.row>=200 then + if P.stat.row>=100 then Event.win() end end @@ -803,7 +802,7 @@ Event={ if P.curY+P.r>5-P.stat.row%4+#P.clearing then Event.lose() end - if P.stat.piece%4==0 and #P.field==#P.clearing then + if P.stat.piece%4==0 and #P.field==0 then P.modeData.event=P.modeData.event==0 and 1 or 0 local r=rnd(#PClist) local f=P.modeData.event==0 @@ -838,7 +837,15 @@ Event={ local L=P.field[y] for x=1,10 do local a,b=preField[y][x],L and L[x]or 0 - if a~=0 and(a==0 and b>0 or a<8 and a~=b or a>7 and b==0)then return end + if a~=0 then + if a==-1 then + if b>0 then return end + elseif a<8 then + if a~=b then return end + elseif a>7 then + if b==0 then return end + end + end end end P.modeData.event=1 @@ -945,7 +952,7 @@ Event_task={ local R=(P.modeData.event%3<2 and 1 or 3) P.atkBuffer.sum=P.atkBuffer.sum+R P.stat.recv=P.stat.recv+R - if P.modeData.event==45 then showText(P,text.maxspeed,"appear",100,-140,.6)end + if P.modeData.event==60 then showText(P,text.maxspeed,"appear",100,-140,.6)end P.counter=0 P.modeData.event=P.modeData.event+1 end @@ -1130,27 +1137,18 @@ Event_task={ end, bgmFadeOut=function(self,_,id) - bgm[id]:setVolume(max(bgm[id]:getVolume()-.03,0)) - if bgm[id]:getVolume()==0 then + local v=bgm[id]:getVolume()-.025*setting.bgm*.125 + bgm[id]:setVolume(v>0 and v or 0) + if v<=0 then bgm[id]:stop() return true end end, bgmFadeIn=function(self,_,id) - bgm[id]:setVolume(min(bgm[id]:getVolume()+.03,1)) - if bgm[id]:getVolume()==1 then return true end + local v=min(bgm[id]:getVolume()+.025*setting.bgm*.125,setting.bgm*.125) + bgm[id]:setVolume(v) + if v>=setting.bgm*.125 then return true end end, - bgmWarp=function(self) - if bgmPlaying then - self.data=self.data-1 - if self.data==0 then - self.data=rnd(120,180) - bgm[bgmPlaying]:seek(max(bgm[bgmPlaying]:tell()-1,0)) - end - else - return true - end - end } local Fkey_func={ royale=function() @@ -1301,7 +1299,6 @@ defaultModeEnv={ { oncehold=false, drop=1e99,lock=1e99, - freshLimit=15, dropPiece=Event.tsd_reach, ospin=false, bg="matrix",bgm="reason", diff --git a/font.ttf b/font.ttf index fa708b47..3a771f6e 100644 Binary files a/font.ttf and b/font.ttf differ diff --git a/gamefunc.lua b/gamefunc.lua index c1e71ecf..8e35f10f 100644 --- a/gamefunc.lua +++ b/gamefunc.lua @@ -53,83 +53,113 @@ local scs={ {[0]={1.5,1.5},{1.5,1.5},{1.5,1.5},{1.5,1.5},}, {[0]={0.5,2.5},{2.5,0.5},{1.5,2.5},{2.5,1.5}}, } +local ORG={0,0} local TRS={ [1]={ - [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}}, - [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}}, - [12]={{0,0},{1,0},{1,-1},{0,1},{-1,0},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{1,0},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{-1,1},{0,2},{-1,2}}, - [30]={{0,0},{-1,0},{-1,-1},{0,-1},{0,2},{-1,2}}, - [03]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2},{0,1}}, - [02]={{0,0},{1,0},{-1,0},{0,-1},{0,1}}, - [20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,-1},{0,1},{-1,0}}, - [31]={{0,0},{0,1},{0,-1},{1,0}}, - },--Z/J + [01]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2},{0,1} }, + [10]={ORG,{1,0}, {1,-1}, {0,2}, {1,2}, {0,-1} }, + [03]={ORG,{1,0}, {1,1}, {0,-2}, {1,-1}, {1,-2} }, + [30]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2}, {0,-1}}, + [12]={ORG,{1,0}, {1,-1}, {0,2}, {1,2} }, + [21]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2} }, + [32]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2} }, + [23]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2} }, + [02]={ORG,{1,0}, {-1,0}, {0,-1}, {0,1} }, + [20]={ORG,{-1,0}, {1,0}, {0,1}, {0,-1} }, + [13]={ORG,{0,-1}, {0,1}, {-1,0}, {0,-2} }, + [31]={ORG,{0,1}, {0,-1}, {1,0}, {0,2} }, + },--Z [2]={ - [01]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}}, - [10]={{0,0},{1,0},{1,-1},{0,-1},{0,2},{1,2}}, - [12]={{0,0},{1,0},{1,-1},{1,1},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{-1,0},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{0,1},{1,0},{0,2},{-1,2}}, - [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1},{-1,1}}, - [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{1,-1},{0,1}}, - [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, - [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,1},{0,-1},{1,0}}, - [31]={{0,0},{0,-1},{0,1},{-1,0}}, - },--S/L + [01]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-1},{-1,-2} }, + [10]={ORG,{1,0}, {1,-1}, {0,2}, {1,2}, {0,-1}}, + [03]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2}, {0,1} }, + [30]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2}, {0,-1} }, + [12]={ORG,{1,0}, {1,-1}, {0,2}, {1,2} }, + [21]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2} }, + [32]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2} }, + [23]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2} }, + [02]={ORG,{-1,0}, {1,0}, {0,-1}, {0,1} }, + [20]={ORG,{1,0}, {-1,0}, {0,1}, {0,-1} }, + [13]={ORG,{0,1}, {0,-1}, {-1,0}, {0,2} }, + [31]={ORG,{0,-1}, {0,1}, {1,0}, {0,-2} }, + },--S + [3]={ + [01]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2},{0,1}, {-1,-1} }, + [10]={ORG,{1,0}, {1,-1}, {0,2}, {1,2}, {0,-1}, {1,1} }, + [03]={ORG,{1,0}, {1,1}, {0,-2}, {-1,1} }, + [30]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2} }, + [12]={ORG,{1,0}, {1,-1}, {0,2}, {1,2}, {1,1} }, + [21]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2},{-1,-1} }, + [32]={ORG,{-1,0}, {-1,-1},{1,0}, {0,2}, {-1,2} }, + [23]={ORG,{1,0}, {1,1}, {-1,0}, {0,-2}, {1,-2} }, + [02]={ORG,{1,0}, {-1,0}, {0,-1}, {0,1} }, + [20]={ORG,{-1,0}, {1,0}, {0,1}, {0,-1} }, + [13]={ORG,{0,1}, {1,0}, {0,-1} }, + [31]={ORG,{0,-1}, {-1,0}, {0,1} }, + },--L + [4]={ + [01]={ORG,{-1,0}, {-1,1}, {0,-2}, {1,1} }, + [10]={ORG,{1,0}, {1,-1}, {0,2}, {1,2} }, + [03]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2}, {0,1}, {1,-1} }, + [30]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2}, {0,-1}, {-1,1} }, + [12]={ORG,{1,0}, {1,-1}, {-1,0}, {0,2}, {1,2} }, + [21]={ORG,{-1,0}, {-1,1}, {1,0}, {0,-2}, {-1,-2} }, + [32]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2}, {-1,1} }, + [23]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2}, {1,-1} }, + [02]={ORG,{-1,0}, {1,0}, {0,-1}, {0,1} }, + [20]={ORG,{1,0}, {-1,0}, {0,1}, {0,-1} }, + [13]={ORG,{0,-1}, {1,0}, {0,1} }, + [31]={ORG,{0,1}, {-1,0}, {0,-1} }, + },--J [5]={ - [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{-1,-1}}, - [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1},{1,1}}, - [12]={{0,0},{1,0},{1,-1},{0,-1},{0,2},{1,2},{-1,-1}}, - [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{1,1}}, - [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{-1,1}}, - [32]={{0,0},{-1,0},{-1,-1},{0,-1},{0,2},{-1,2},{1,-1}}, - [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, - [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, - [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, - [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}}, - [31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}}, - }, + [01]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2},{-1,-1} }, + [10]={ORG,{1,0}, {1,-1}, {0,2}, {1,2}, {0,-1}, {1,1}}, + [03]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2} }, + [30]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2}, {0,-1} }, + [12]={ORG,{1,0}, {1,-1}, {0,-1}, {0,2}, {1,2}, {-1,-1}}, + [21]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2},{1,1} }, + [32]={ORG,{-1,0}, {-1,-1},{0,-1}, {0,2}, {-1,2}, {1,-1}}, + [23]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2}, {-1,1} }, + [02]={ORG,{-1,0}, {1,0}, {0,1} }, + [20]={ORG,{1,0}, {-1,0}, {0,-1} }, + [13]={ORG,{0,-1}, {0,1}, {1,0}, {0,-2}, {0,2}}, + [31]={ORG,{0,-1}, {0,1}, {-1,0}, {0,-2}, {0,2}}, + },--T + [6]={},--O(special) [7]={ - [01]={{0,0},{0,1},{1,0},{-2,0},{-2,-1},{1,2}}, - [03]={{0,0},{0,1},{-1,0},{2,0},{2,-1},{-1,2}}, - [10]={{0,0},{2,0},{-1,0},{-1,-2},{2,1},{0,2}}, - [30]={{0,0},{-2,0},{1,0},{1,-2},{-2,1},{0,2}}, - [12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}}, - [32]={{0,0},{1,0},{-2,0},{1,-2},{-2,-1}}, - [21]={{0,0},{-2,0},{1,0},{1,-2},{-2,1}}, - [23]={{0,0},{2,0},{-1,0},{-1,-2},{2,1}}, - [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, - [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}}, - [31]={{0,0},{1,0},{-1,0}}, + [01]={ORG,{0,1}, {1,0}, {-2,0}, {-2,-1},{1,2} }, + [03]={ORG,{0,1}, {-1,0}, {2,0}, {2,-1}, {-1,2} }, + [10]={ORG,{2,0}, {-1,0}, {-1,-2},{2,1}, {0,2} }, + [30]={ORG,{-2,0}, {1,0}, {1,-2}, {-2,1}, {0,2} }, + [12]={ORG,{-1,0}, {2,0}, {-1,2}, {2,-1} }, + [32]={ORG,{1,0}, {-2,0}, {1,-2}, {-2,-1} }, + [21]={ORG,{-2,0}, {1,0}, {1,-2}, {-2,1} }, + [23]={ORG,{2,0}, {-1,0}, {-1,-2},{2,1} }, + [02]={ORG,{-1,0}, {1,0}, {0,-1}, {0,1} }, + [20]={ORG,{1,0}, {-1,0}, {0,1}, {0,-1} }, + [13]={ORG,{0,-1}, {-1,0}, {1,0}, {0,1} }, + [31]={ORG,{1,0}, {-1,0}}, } -}TRS[3],TRS[4]=TRS[2],TRS[1] +} local AIRS={{ - [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, - [10]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, - [12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, - [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, - [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, + [01]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2} }, + [10]={ORG,{1,0}, {1,-1}, {0,2}, {1,2} }, + [03]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2} }, + [30]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2} }, + [12]={ORG,{1,0}, {1,-1}, {0,2}, {1,2} }, + [21]={ORG,{-1,0}, {-1,1}, {0,-2}, {-1,-2} }, + [32]={ORG,{-1,0}, {-1,-1},{0,2}, {-1,2} }, + [23]={ORG,{1,0}, {1,1}, {0,-2}, {1,-2} }, }}for i=2,6 do AIRS[i]=AIRS[1]end AIRS[7]={ - [01]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}}, - [10]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}}, - [12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}}, - [21]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}}, - [23]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}}, - [32]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}}, - [30]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}}, - [03]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}}, + [01]={ORG,{-2,0}, {1,0}, {-2,-1},{1,2} }, + [10]={ORG,{2,0}, {-1,0}, {2,1}, {-1,-2} }, + [12]={ORG,{-1,0}, {2,0}, {-1,2}, {2,-1} }, + [21]={ORG,{1,0}, {-2,0}, {1,-2}, {-2,1} }, + [23]={ORG,{2,0}, {-1,0}, {2,1}, {-1,-2} }, + [32]={ORG,{-2,0}, {1,0}, {-2,-1},{1,2} }, + [30]={ORG,{1,0}, {-2,0}, {1,-2}, {-2,1} }, + [03]={ORG,{-1,0}, {2,0}, {-1,2}, {2,-1} }, } local CCblockID={4,3,5,6,1,2,0} local function newNext(n) @@ -367,8 +397,8 @@ function resetGameData() curBG=modeEnv.bg BGM(modeEnv.bgm) - FX.badge={} - FX.attack={} + FX_badge={} + FX_attack={} for _,v in next,PTC.dust do v:release() end @@ -463,7 +493,7 @@ function createPlayer(id,x,y,size,AIdata) end end--reset current game settings P.cur={bk={{}},id=0,color=0,name=0} - P.sc,P.dir,P.r,P.c={0,0},0,0,0 + P.sc,P.dir,P.r,P.c=ORG,0,0,0 P.curX,P.curY,P.y_img=0,0,0 P.hold={bk={{}},id=0,color=0,name=0} P.holded=false @@ -491,7 +521,7 @@ function createPlayer(id,x,y,size,AIdata) newNext(rem(bag1,rnd(#bag1))) end elseif s=="drought2"then - local bag1={1,2,3,4,6} + local bag1={1,2,3,4,6,6} for i=1,6 do newNext(rem(bag1,rnd(#bag1))) end @@ -562,7 +592,7 @@ function createPlayer(id,x,y,size,AIdata) end function showText(P,text,type,font,dy,spd,inf) if not P.small then - P.bonus[#P.bonus+1]={t=0,text=text,draw=FX[type],font=font,dy=dy or 0,speed=spd or 1,inf=inf} + P.bonus[#P.bonus+1]={t=0,text=text,draw=textFX[type],font=font,dy=dy or 0,speed=spd or 1,inf=inf} end end local function createBeam(S,R,send,time,target,color,clear,spin,mini,combo) @@ -616,18 +646,22 @@ local function createBeam(S,R,send,time,target,color,clear,spin,mini,combo) radius=radius*.4 a=.35 end - FX.attack[#FX.attack+1]={ - x1=x1,y1=y1, - x2=x2,y2=y2, - rad=radius, + FX_attack[#FX_attack+1]={ + x=x1,y=y1,--current pos + x1=x1,y1=y1,--start pos + x2=x2,y2=y2,--end pos + rad=radius*(setting.atkFX+2)*.2, corner=corner, type=type==1 and"fill"or"line", - r=r,g=g,b=b,a=a*(setting.fxs+1)*.25, + r=r,g=g,b=b,a=a*(setting.atkFX+1)*.25, t=0, + drag={},--Afterimage coordinate list } end local function garbageSend(S,R,send,time,...) - createBeam(S,R,send,time,...) + if setting.atkFX>0 then + createBeam(S,R,send,time,...) + end R.lastRecv=S if R.atkBuffer.sum<20 then local B=R.atkBuffer @@ -645,7 +679,7 @@ local function garbageSend(S,R,send,time,...) time=0, sent=false, lv=min(int(send^.69),5), - }--Sorted insert + }--Sorted insert(by time) B.sum=B.sum+send R.stat.recv=R.stat.recv+send if R.human then @@ -655,21 +689,19 @@ local function garbageSend(S,R,send,time,...) end local function garbageRelease() local flag - while true do + ::L:: local A=P.atkBuffer[1] if A and A.countdown<=0 and not A.sent then garbageRise(8+A.lv,A.amount,A.pos) P.atkBuffer.sum=P.atkBuffer.sum-A.amount A.sent,A.time=true,0 P.stat.pend=P.stat.pend+A.amount - for i=1,#P.atkBuffer do - P.atkBuffer[i]=P.atkBuffer[i+1] - end flag=true else - break + goto E end - end + goto L + ::E:: if flag and P.AI_mode=="CC"then CC_updateField(P)end end function garbageRise(color,amount,pos) @@ -699,7 +731,7 @@ local function ifoverlap(bk,x,y) end end end local function ckfull(i) - for j=1,10 do if P.field[i][j]==0 then return end end + for j=1,10 do if P.field[i][j]<=0 then return end end return true end local function checkrow(start,height)--(cy,r) @@ -738,9 +770,13 @@ function freshgho() goto L end if P.curY>P.y_img then - if P.human and setting.fxs>0 then - createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) - P.fieldOffY=2*setting.fxs + if P.human then + if setting.dropFX>0 then + 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+1 + end end P.curY=P.y_img end @@ -752,7 +788,8 @@ function freshgho() end end local function freshLockDelay() - if P.lockDelay0 then + if P.human and setting.dropFX>0 then createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY) end local y0=P.curY P.curX,P.curY,P.dir=ix,iy,idir P.sc,P.cur.bk=scs[P.cur.id][idir],icb P.r,P.c=ir,ic - P.spinLast=t==2 and d==2 and 0 or 1 + P.spinLast=t==2 and 0 or 1 if not ifpre then freshgho()end if P.gameEnv.easyFresh or y0>P.curY then freshLockDelay()end if P.human then @@ -903,7 +940,7 @@ function resetblock() freshgho() if P.keyPressing[6]then act.hardDrop()P.keyPressing[6]=false end end -function drop() +function drop()--Place piece P.dropTime[11]=ins(P.dropTime,1,frame)--update speed dial P.waiting=P.gameEnv.wait local dospin=0 @@ -924,23 +961,28 @@ function drop() end--Immobile end lock() + local CHN=getFreeVoiceChannel() local cc,send,exblock=checkrow(P.curY,P.r),0,0--Currect clear&send&sendTime if cc>0 then P.falling=P.gameEnv.fall end local cscore,sendTime=0,0 local mini - if P.spinLast and cc>0 and dospin>0 then - dospin=dospin+P.spinLast - end - if not P.spinLast then - dospin=false - elseif cc==0 then - if dospin==0 then - dospin=false + if P.spinLast then + if cc>0 then + if dospin>0 then + dospin=dospin+P.spinLast + if dospin<2 then + mini=P.cur.id<6 and cc<3 and cc0 then @@ -955,16 +997,16 @@ function drop() cscore=cscore*1.8 P.stat.b3b=P.stat.b3b+1 if P.human then - VOICE("b3b") + VOICE("b3b",CHN) end - elseif P.b2b>=40 then + elseif P.b2b>=50 then showText(P,text.techrashB2B,"drive",80,-30) sendTime=80 send=5 cscore=cscore*1.3 P.stat.b2b=P.stat.b2b+1 if P.human then - VOICE("b2b") + VOICE("b2b",CHN) end else showText(P,text.techrash,"stretch",80,-30) @@ -975,7 +1017,7 @@ function drop() P.lastClear=74 P.stat.clear_4=P.stat.clear_4+1 if P.human then - VOICE("tts") + VOICE("tts",CHN) end elseif cc>0 then local clearKey=clear_n @@ -988,15 +1030,15 @@ function drop() cscore=cscore*2 P.stat.b3b=P.stat.b3b+1 if P.human then - VOICE("b3b") + VOICE("b3b",CHN) end - elseif P.b2b>=40 then + elseif P.b2b>=50 then showText(P,text.b2b..text.spin[P.cur.name]..text.clear[cc],"spin",40,-30) send=b2bATK[cc] cscore=cscore*1.2 P.stat.b2b=P.stat.b2b+1 if P.human then - VOICE("b2b") + VOICE("b2b",CHN) end else showText(P,text.spin[P.cur.name]..text.clear[cc],"spin",50,-30) @@ -1008,9 +1050,9 @@ function drop() send=ceil(send*.5) sendTime=sendTime+60 cscore=cscore*.5 - P.b2b=P.b2b+b2bPoint[cc]*.8 + P.b2b=P.b2b+b2bPoint[cc]*.5 if P.human then - VOICE("mini") + VOICE("mini",CHN) end else P.b2b=P.b2b+b2bPoint[cc] @@ -1019,8 +1061,8 @@ function drop() clearKey=spin_n if P.human then SFX(spin_n[cc]) - VOICE(blockName[P.cur.name]) - VOICE("spin_") + VOICE(blockName[P.cur.name],CHN) + VOICE("spin_",CHN) end elseif #P.field>0 then P.b2b=max(P.b2b-250,0) @@ -1032,7 +1074,7 @@ function drop() end P.stat[clearKey[cc]]=P.stat[clearKey[cc]]+1 if P.human then - VOICE(clearName[cc]) + VOICE(clearName[cc],CHN) end end send=send+(renATK[P.combo]or 3) @@ -1051,7 +1093,7 @@ function drop() P.lastClear=P.cur.id*10+5 if P.human then SFX("perfectclear") - VOICE("pc") + VOICE("pc",CHN) end end if P.combo>2 then @@ -1144,8 +1186,8 @@ function drop() P.stat.spin_0=P.stat.spin_0+1 if P.human then SFX("spin_0") - VOICE(blockName[P.cur.name]) - VOICE("spin") + VOICE(blockName[P.cur.name],CHN) + VOICE("spin",CHN) end cscore=cscore+30 end @@ -1247,9 +1289,13 @@ act={ P.keyPressing[6]=false elseif P.control and P.waiting==-1 then if P.curY~=P.y_img then - if P.human and setting.fxs>0 then - createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) - P.fieldOffY=2*setting.fxs+1 + if P.human then + if setting.dropFX>0 then + 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+1 + end end P.curY=P.y_img P.spinLast=false @@ -1285,7 +1331,7 @@ act={ P.gameEnv.Fkey() end, restart=function() - if frame<180 then + if not setting.holdR or frame<180 then clearTask("play") resetPartGameData() end @@ -1293,28 +1339,30 @@ act={ insDown=function() if P.curY~=P.y_img then - if P.human and setting.fxs>0 then - createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) + if P.human then + if setting.dropFX>0 then + 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 - if P.human and setting.fxs>0 then - P.fieldOffY=2*setting.fxs - end end end, insLeft=function() local x0,y0=P.curX,P.curY ::L::if not ifoverlap(P.cur.bk,P.curX-1,P.curY)then P.curX=P.curX-1 - if P.human and setting.fxs>0 then + if P.human and setting.dropFX>0 then createShade(P.curX+1,P.curY+P.r-1,P.curX+1,P.curY) end freshgho() goto L end if x0~=P.curX then - if P.human and setting.fxs>0 then - P.fieldOffX=-2*setting.fxs + if P.human and setting.shakeFX>0 then + P.fieldOffX=-2*setting.shakeFX end if P.gameEnv.easyFresh or y0~=P.curY then freshLockDelay()end end @@ -1323,15 +1371,15 @@ act={ local x0,y0=P.curX,P.curY ::L::if not ifoverlap(P.cur.bk,P.curX+1,P.curY)then P.curX=P.curX+1 - if P.human and setting.fxs>0 then + if P.human and setting.dropFX>0 then createShade(P.curX+P.c-1,P.curY+P.r-1,P.curX+P.c-1,P.curY) end freshgho() goto L end if x0~=P.curX then - if P.human and setting.fxs>0 then - P.fieldOffX=2*setting.fxs + if P.human and setting.shakeFX>0 then + P.fieldOffX=2*setting.shakeFX end if P.gameEnv.easyFresh or y0~=P.curY then freshLockDelay()end end diff --git a/image/icon.png b/image/icon.png index 5750e687..bf564693 100644 Binary files a/image/icon.png and b/image/icon.png differ diff --git a/image/mess/title.png b/image/mess/title.png index a5a5aba1..07d48602 100644 Binary files a/image/mess/title.png and b/image/mess/title.png differ diff --git a/image/mess/title_colored.png b/image/mess/title_colored.png new file mode 100644 index 00000000..b94c7c6a Binary files /dev/null and b/image/mess/title_colored.png differ diff --git a/language/chi.lua b/language/chi.lua index d3db3278..89d54ba7 100644 --- a/language/chi.lua +++ b/language/chi.lua @@ -1,4 +1,3 @@ -local SWC={[true]="开",[false]="关"} local BK="返回" return{ atkModeName={"随机","徽章","击杀","反击"}, @@ -26,7 +25,7 @@ return{ lose="失败", pause="暂停", finish="结束", - pauseTime="暂停时间", + pauseCount="暂停统计", custom="自定义游戏", customOption={ @@ -115,14 +114,20 @@ return{ "适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活", "合群了就会消失,但是消失不代表没有意义", "学会使用两个旋转键,三个更好", - "更小的DAS和ARR拥有更高的操作上限", + "更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)", "注意到\"旋转\"到底对方块做了些什么吗?", - "20G是一套全新的游戏规则", + "20G本质是一套全新的游戏规则", "不要在上课时玩游戏!", "本游戏难度上限很高,做好心理准备", "方块可以不是个休闲游戏", "调到特殊的日期也不会发生什么的", "3.1415926535897932384", + "2.7182818284590452353", + "Let-The-Bass-Kick!", + "使用love2d引擎制作", + "哪里不舒服的话先看看设置有没有你想要改的", + "有建议的话可以把信息反馈给作者~", + "本游戏不叫铁壳米诺", }, stat={ "游戏运行次数:", @@ -158,7 +163,8 @@ return{ }, support="支持作者", group="官方QQ群", - ButtonText={ + warning="禁 止 私 自 传 播", + WidgetText={ main={ qplay="快速开始", play="开始", @@ -178,7 +184,7 @@ return{ back=BK, }, music={ - bgm=function()return"音乐:"..SWC[setting.bgm]end, + bgm="BGM", up="↑", play="播放", down="↓", @@ -221,39 +227,54 @@ return{ pause="暂停", }, pause={ - resume="继续", + resume= "继续", restart="重新开始", - quit="退出", + quit= "退出", }, setting={ - ghost=function()return"阴影:"..SWC[setting.ghost]end, - center=function()return"旋转中心:"..SWC[setting.center]end, - grid=function()return"网格:"..SWC[setting.grid]end, - swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end, - fxs=function()return setting.fxs>0 and"特效等级:"..setting.fxs or"特效:关"end, - bg=function()return"背景:"..SWC[setting.bg]end, + game= "游戏设置", + graphic="画面设置", + sound= "声音设置", + ctrl= "控制设置", + touch= "触屏设置", + lang= function()return langName[setting.lang]end, + back= "保存&返回", + }, + setting_game={ dasD="-",dasU="+", arrD="-",arrU="+", sddasD="-",sddasU="+", sdarrD="-",sdarrU="+", - ctrl="控制设置", - touch="触摸设置", - lang=function()return langName[setting.lang]end, - sfx=function()return"音效:"..SWC[setting.sfx]end, - bgm=function()return"音乐:"..SWC[setting.bgm]end, - vib=function()return "震动:"..setting.vib end, - voc=function()return"语音:"..SWC[setting.voc]end, - fullscreen=function()return"全屏:"..SWC[setting.fullscreen]end, - bgblock=function()return"背景动画:"..SWC[setting.bgblock]end, - frame=function()return"绘制帧:"..setting.frameMul.."%"end, - skin="皮肤", - smo=function()return"平滑下落:"..SWC[setting.smo]end, - back="保存&返回", - }, - setting2={ + holdR="长按重新开始", + swap="组合键切换攻击模式", back=BK, }, - setting3={ + setting_graphic={ + ghost="阴影", + grid="网格", + center="旋转中心", + skin="皮肤", + bg="背景", + bgblock="背景动画", + smo="平滑下落", + dropFX="下落特效等级", + shakeFX="晃动特效等级", + atkFX="攻击特效等级", + fullscreen="全屏", + frame="绘制帧率", + back=BK, + }, + setting_sound={ + sfx="音效", + bgm="音乐", + vib="震动", + voc="语音", + back=BK, + }, + setting_control={ + back=BK, + }, + setting_touch={ hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end, default="默认组合", snap=function()return text.snapLevelName[snapLevel]end, @@ -268,8 +289,8 @@ return{ back=BK, }, history={ - prev="←", - next="→", + prev="↑", + next="↓", back=BK, }, stat={ diff --git a/language/chi_full.lua b/language/chi_full.lua index 2f1e8233..0896cafe 100644 --- a/language/chi_full.lua +++ b/language/chi_full.lua @@ -1,4 +1,3 @@ -local SWC={[true]="开",[false]="关"} local BK="返回" return{ atkModeName={"随机","徽章","击杀","反击"}, @@ -26,7 +25,7 @@ return{ lose="失败", pause="暂停", finish="结束", - pauseTime="暂停时间", + pauseCount="暂停统计", custom="自定义游戏", customOption={ @@ -115,14 +114,20 @@ return{ "适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活", "合群了就会消失,但是消失不代表没有意义", "学会使用两个旋转键,三个更好", - "更小的DAS和ARR拥有更高的操作上限", + "更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)", "注意到\"旋转\"到底对方块做了些什么吗?", - "20G是一套全新的游戏规则", + "20G本质是一套全新的游戏规则", "不要在上课时玩游戏!", "本游戏难度上限很高,做好心理准备", "方块可以不是个休闲游戏", "调到特殊的日期也不会发生什么的", "3.1415926535897932384", + "2.7182818284590452353", + "Let-The-Bass-Kick!", + "使用love2d引擎制作", + "哪里不舒服的话先看看设置有没有你想要改的", + "有建议的话可以把信息反馈给作者~", + "郑重声明本游戏不叫[铁壳米诺]", }, stat={ "游戏运行次数:", @@ -158,7 +163,8 @@ return{ }, support="支持作者", group="官方QQ群", - ButtonText={ + warning="禁 止 私 自 传 播", + WidgetText={ main={ qplay="快速开始", play="开始", @@ -178,7 +184,7 @@ return{ back=BK, }, music={ - bgm=function()return"音乐:"..SWC[setting.bgm]end, + bgm="BGM", up="↑", play="播放", down="↓", @@ -221,39 +227,54 @@ return{ pause="暂停", }, pause={ - resume="继续", + resume= "继续", restart="重新开始", - quit="退出", + quit= "退出", }, setting={ - ghost=function()return"阴影:"..SWC[setting.ghost]end, - center=function()return"旋转中心:"..SWC[setting.center]end, - grid=function()return"网格:"..SWC[setting.grid]end, - swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end, - fxs=function()return setting.fxs>0 and"特效等级:"..setting.fxs or"特效:关"end, - bg=function()return"背景:"..SWC[setting.bg]end, + game= "游戏设置", + graphic="画面设置", + sound= "声音设置", + ctrl= "控制设置", + touch= "触屏设置", + lang= function()return langName[setting.lang]end, + back= "保存&返回", + }, + setting_game={ dasD="-",dasU="+", arrD="-",arrU="+", sddasD="-",sddasU="+", sdarrD="-",sdarrU="+", - ctrl="控制设置", - touch="触摸设置", - lang=function()return langName[setting.lang]end, - sfx=function()return"音效:"..SWC[setting.sfx]end, - bgm=function()return"音乐:"..SWC[setting.bgm]end, - vib=function()return "震动:"..setting.vib end, - voc=function()return"语音:"..SWC[setting.voc]end, - fullscreen=function()return"全屏:"..SWC[setting.fullscreen]end, - bgblock=function()return"背景动画:"..SWC[setting.bgblock]end, - frame=function()return"绘制帧:"..setting.frameMul.."%"end, - skin="皮肤", - smo=function()return"平滑下落:"..SWC[setting.smo]end, - back="保存&返回", - }, - setting2={ + holdR="长按重新开始", + swap="组合键切换攻击模式", back=BK, }, - setting3={ + setting_graphic={ + ghost="阴影", + grid="网格", + center="旋转中心", + skin="皮肤", + bg="背景", + bgblock="背景动画", + smo="平滑下落", + dropFX="下落特效等级", + shakeFX="晃动特效等级", + atkFX="攻击特效等级", + fullscreen="全屏", + frame="绘制帧率", + back=BK, + }, + setting_sound={ + sfx="音效", + bgm="音乐", + vib="震动", + voc="语音", + back=BK, + }, + setting_control={ + back=BK, + }, + setting_touch={ hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end, default="默认组合", snap=function()return text.snapLevelName[snapLevel]end, @@ -268,8 +289,8 @@ return{ back=BK, }, history={ - prev="←", - next="→", + prev="↑", + next="↓", back=BK, }, stat={ diff --git a/language/eng.lua b/language/eng.lua index dcb28250..17cbce43 100644 --- a/language/eng.lua +++ b/language/eng.lua @@ -1,4 +1,3 @@ -local SWC={[true]="ON",[false]="OFF"} local BK="Back" return{ atkModeName={"Random","Badges","K.O.s","Counters"}, @@ -26,7 +25,7 @@ return{ lose="LOSE", pause="PAUSE", finish="FINISH", - pauseTime="Pause time", + pauseCount="Pause Count", custom="Custom Game", customOption={ @@ -115,14 +114,20 @@ return{ "Playing too much = taking drugs", "Disappearing doesn't mean useless", "Try to use two rotate button,three better", - "Small DAS&ARR can make you faster,if you can adapt to it", + "Small DAS&ARR can make you faster,if you can control block correctly", "Have you noticed what does \"rotating\" do to block?", - "20G is a brand new game rule", + "20G actually is a brand new game rule", "Do not play game in class!", "This game can be very hard,be mentally perpared", "This in not a casual game", "Nothing will happen when some special day come", "3.1415926535897932384", + "2.7182818284590452353", + "Let-The-Bass-Kick!", + "Powered by love2d", + "Find out what's in the setting!", + "Any suggestions to author!~", + "Techmino=Technique+tetromino", }, stat={ "Games run:", @@ -158,7 +163,8 @@ return{ }, support="Support Author", group="Official QQ Group", - ButtonText={ + warning="DO NOT DISTRIBUTE", + WidgetText={ main={ qplay="Qplay", play="Play", @@ -178,7 +184,7 @@ return{ back=BK, }, music={ - bgm=function()return"BGM:"..SWC[setting.bgm]end, + bgm="BGM", up="↑", play="Play", down="↓", @@ -226,34 +232,49 @@ return{ quit="Quit", }, setting={ - ghost=function()return"Ghost:"..SWC[setting.ghost]end, - center=function()return"Center:"..SWC[setting.center]end, - grid=function()return"Grid:"..SWC[setting.grid]end, - swap=function()return setting.swap and"Swap:comboKey"or"Swap:loop"end, - fxs=function()return setting.fxs>0 and"FX level:"..setting.fxs or"NO FX"end, - bg=function()return"BG:"..SWC[setting.bg]end, + game= "Game Settings", + graphic="Graphic Settings", + sound= "Sound Settings", + ctrl= "Control Settings", + touch= "Touch Settings", + lang= function()return langName[setting.lang]end, + back= "Save&Back", + }, + setting_game={ dasD="-",dasU="+", arrD="-",arrU="+", sddasD="-",sddasU="+", sdarrD="-",sdarrU="+", - ctrl="Control settings", - touch="Touch settings", - lang=function()return langName[setting.lang]end, - sfx=function()return"SFX:"..SWC[setting.sfx]end, - bgm=function()return"BGM:"..SWC[setting.bgm]end, - voc=function()return"VOC:"..SWC[setting.voc]end, - vib=function()return "VIB:"..setting.vib end, - fullscreen=function()return"Fullscreen:"..SWC[setting.fullscreen]end, - bgblock=function()return"BG animation:"..SWC[setting.bgblock]end, - frame=function()return"FrameDraw:"..setting.frameMul.."%"end, - skin="Skin", - smo=function()return"SmoothDrop:"..SWC[setting.smo]end, - back="Save&Back", - }, - setting2={ + holdR="Hold R to restart", + swap="Combo key to change ATK mode", back=BK, }, - setting3={ + setting_graphic={ + ghost="Ghost", + grid="Grid", + center="Center", + skin="Skin", + bg="Background", + bgblock="BG animation", + smo="Smoooth drop", + dropFX="Drop FX level", + shakeFX="Shake FX level", + atkFX="ATK FX level", + fullscreen="Fullscreen", + frame="drawFPS", + back=BK, + }, + setting_sound={ + sfx="SFX", + bgm="BGM", + vib="VIB", + voc="VOC", + back=BK, + }, + setting_control={ + back=BK, + }, + setting_touch={ hide=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end, default="Defaults", snap=function()return text.snapLevelName[snapLevel]end, @@ -268,8 +289,8 @@ return{ back=BK, }, history={ - prev="←", - next="→", + prev="↑", + next="↓", back=BK, }, stat={ diff --git a/list.lua b/list.lua index 6941d85e..b98774a4 100644 --- a/list.lua +++ b/list.lua @@ -82,14 +82,14 @@ bgm={ "shining terminal", "end", } -voiceList={ +voiceBank={} +voiceName={ "Z","S","L","J","T","O","I", "single","double","triple","tts", "spin","spin_","mini","b2b","b3b","pc", "win","lose","voc_nya","nya", } -voiceBank={} -voice={ +voiceList={ Z={"Z_1","Z_2"}, S={"S_1","S_2"}, J={"J_1","J_2"}, @@ -271,7 +271,7 @@ local customSet={ {18,20,1,1,7,1,1,1,8,3,8,3,3}, {22,22,1,1,7,3,1,1,8,4,1,7,7}, {20,20,1,1,7,1,1,3,8,3,1,7,8}, - {23,11,8,11,4,1,2,1,8,3,1,4,9}, + {1,11,8,11,4,1,2,1,8,3,1,4,9}, } local function useDefaultSet(n) for i=1,#customSet[n]do @@ -284,62 +284,62 @@ Widget={ load={}, intro={}, main={ - qplay= newButton(160, 300,150,150,color.lightRed, 40,function()loadGame(modeSel,levelSel)end, nil, nil, "stat", nil, "play" ), - play= newButton(380, 300,240,240,color.red, 70,function()gotoScene("mode")end, nil, nil, "stat", "qplay", "setting" ), - setting=newButton(640, 300,240,240,color.lightBlue,55,function()gotoScene("setting")end, nil, nil, "stat", "play", "music" ), - music= newButton(900, 300,240,240,color.lightCyan,42,function()gotoScene("music")end, nil, nil, "help", "setting", "quit" ), - stat= newButton(640, 560,240,240,color.cyan, 55,function()gotoScene("stat")end, nil, "setting", nil, "play", "help" ), - help= newButton(900, 560,240,240,color.yellow, 55,function()gotoScene("help")end, nil, "music", nil, "stat", "quit" ), - quit= newButton(1180, 620,120,120,color.lightGrey,50,function()gotoScene("quit")end, nil, "music", nil, "help", nil ), + qplay= newButton(160, 300,150,150,color.lightRed, 40,function()loadGame(modeSel,levelSel)end, nil,"play"), + play= newButton(380, 300,240,240,color.red, 70,function()gotoScene("mode")end, nil,"setting"), + setting=newButton(640, 300,240,240,color.lightBlue,55,function()gotoScene("setting")end, nil,"music"), + music= newButton(900, 300,240,240,color.lightCyan,42,function()gotoScene("music")end, nil,"stat"), + stat= newButton(640, 560,240,240,color.cyan, 55,function()gotoScene("stat")end, nil,"help"), + help= newButton(900, 560,240,240,color.yellow, 55,function()gotoScene("help")end, nil,"quit"), + quit= newButton(1180,620,120,120,color.lightGrey,50,function()gotoScene("quit")end, nil,"qplay"), }, 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), + 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), + 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), }, music={ - bgm= newButton(1100, 80, 160,80, color.white,40,function()BGM()setting.bgm=not setting.bgm end), - up= newButton(1100, 200, 120,120,color.white,60,function()love.keypressed("up")end, function()return not setting.bgm end), - play= newButton(1100, 340, 120,120,color.white,40,function()love.keypressed("space")end, function()return not setting.bgm end), - down= newButton(1100, 480, 120,120,color.white,60,function()love.keypressed("down")end, function()return not setting.bgm 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,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), - 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), - 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), + 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), + 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), }, 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), + 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), }, play={ pause= newButton(1235,45,80,80,color.white,30,pauseGame), @@ -354,74 +354,82 @@ Widget={ end), quit= newButton(640,600,240,100,color.white,50,back), }, - setting={--Normal setting - ghost= newButton(290, 90, 210,60,color.white,40,function()setting.ghost=not setting.ghost end, nil, nil, "grid", nil, "center" ), - center= newButton(505, 90, 210,60,color.white,40,function()setting.center=not setting.center end, nil, nil, "swap", "ghost", "sfx" ), - grid= newButton(290, 160,210,60,color.white,40,function()setting.grid=not setting.grid end, nil, "ghost", "fxs", nil, "swap" ), - swap= newButton(505, 160,210,60,color.white,28,function()setting.swap=not setting.swap end, nil, "center", "bg", "grid", "vib" ), - fxs= newButton(290, 230,210,60,color.white,40,function()setting.fxs=(setting.fxs+1)%4 end, nil, "grid", "dasU", nil, "bg" ), - bg= newButton(505, 230,210,60,color.white,40,function()setting.bg=not setting.bg end, nil, "swap", "arrD", "fxs", "fullscreen" ), - dasD= newButton(210, 300,50, 50,color.white,40,function()setting.das=(setting.das-1)%31 end, nil, "fxs", "sddasD", nil, "dasU" ), - dasU= newButton(370, 300,50, 50,color.white,40,function()setting.das=(setting.das+1)%31 end, nil, "fxs", "sddasU", "dasD", "arrD" ), - arrD= newButton(425, 300,50, 50,color.white,40,function() + setting={ + game= newButton(640,100,320,70,color.white,40,function()gotoScene("setting_game") end,nil,"graphic"), + graphic=newButton(640,180,320,70,color.white,40,function()gotoScene("setting_graphic") end,nil,"sound"), + sound= newButton(640,260,320,70,color.white,40,function()gotoScene("setting_sound") end,nil,"ctrl"), + ctrl= newButton(640,340,320,70,color.white,40,function()gotoScene("setting_control") end,nil,"touch"), + touch= newButton(640,420,320,70,color.white,40,function()gotoScene("setting_touch") end,nil,"lang"), + lang= newButton(640,500,320,70,color.red,40,function() + setting.lang=setting.lang%#langName+1 + swapLanguage(setting.lang) + end,nil,"back"), + back= newButton(640,620,300,70,color.white,40,back, nil,"game"), + }, + setting_game={ + dasD= newButton(150,120,50,50,color.white,40,function()setting.das=(setting.das-1)%31 end, nil,"dasU"), + dasU= newButton(370,120,50,50,color.white,40,function()setting.das=(setting.das+1)%31 end, nil,"arrD"), + arrD= newButton(450,120,50,50,color.white,40,function() setting.arr=(setting.arr-1)%16 if setting.arr>setting.das then setting.das=setting.arr - Widget.setting.dasU.alpha,Widget.setting.dasD.alpha=1,1 + Widget.setting_game.dasU:FX() SFX("blip_1",.4) end - end,nil,"bg","sdarrD","dasU","arrU"), - arrU= newButton(585, 300,50, 50,color.white,40,function() + end,nil,"arrU"), + arrU= newButton(670,120,50,50,color.white,40,function() setting.arr=(setting.arr+1)%16 if setting.arr>setting.das then setting.das=setting.arr - Widget.setting.dasU.alpha,Widget.setting.dasD.alpha=1,1 + Widget.setting_game.dasU:FX() SFX("blip_1",.4) end - end,nil,"bg","sdarrU","arrD","bgblock"), - sddasD= newButton(210, 370,50, 50,color.white,40,function()setting.sddas=(setting.sddas-1)%11 end, nil, "dasD", "ctrl", nil, "sddasU" ), - sddasU= newButton(370, 370,50, 50,color.white,40,function()setting.sddas=(setting.sddas+1)%11 end, nil, "dasU", "ctrl", "sddasD", "sdarrD" ), - sdarrD= newButton(425, 370,50, 50,color.white,40,function()setting.sdarr=(setting.sdarr-1)%4 end, nil, "arrD", "ctrl", "sddasU", "sdarrU" ), - sdarrU= newButton(585, 370,50, 50,color.white,40,function()setting.sdarr=(setting.sdarr+1)%4 end, nil, "arrU", "ctrl", "sdarrD", "frame" ), - - ctrl= newButton(340,440, 310,60,color.green,40, function()gotoScene("setting2")end, nil, "sddasU", "touch", "lang", "skin" ), - touch= newButton(340,510, 310,60,color.yellow,40, function()gotoScene("setting3")end, nil, "ctrl", "back", nil, "lang" ), - lang= newButton(580,510, 150,60,color.red,40, function() - setting.lang=setting.lang%#langName+1 - swapLanguage(setting.lang) - end,nil,"sdarrU","back","touch","skin"), - - sfx= newButton(760,90, 160,60,color.white,40, function()setting.sfx=not setting.sfx end, nil, nil, "vib", "center", "bgm" ), - bgm= newButton(940,90, 160,60,color.white,40, function()BGM()setting.bgm=not setting.bgm BGM("blank")end, nil, nil, "voc", "sfx", nil ), - vib= newButton(760,160, 160,60,color.white,40, function()setting.vib=(setting.vib+1)%6 VIB(1)end, nil, "sfx", "fullscreen", "swap", "voc" ), - voc= newButton(940,160, 160,60,color.white,40, function()setting.voc=not setting.voc end, nil, "sfx", "fullscreen", "vib", nil ), - fullscreen= newButton(850,230, 340,60,color.white,40, function() + end,nil,"sddasD"), + sddasD= newButton(150,230,50,50,color.white,40,function()setting.sddas=(setting.sddas-1)%11 end, nil,"sddasU"), + sddasU= newButton(370,230,50,50,color.white,40,function()setting.sddas=(setting.sddas+1)%11 end, nil,"sdarrD"), + sdarrD= newButton(450,230,50,50,color.white,40,function()setting.sdarr=(setting.sdarr-1)%4 end, nil,"sdarrU"), + sdarrU= newButton(670,230,50,50,color.white,40,function()setting.sdarr=(setting.sdarr+1)%4 end, nil,"holdR"), + holdR= newSwitch(510,330,40,function()return setting.holdR end,function()setting.holdR=not setting.holdR end, nil,"swap"), + swap= newSwitch(510,420,25,function()return setting.swap end,function()setting.swap=not setting.swap end, nil,"back"), + back= newButton(640,620,300,70,color.white,40,back,nil,"dasD"), + }, + setting_graphic={ + ghost= newSwitch(310,90,40, function()return setting.ghost end, function()setting.ghost= not setting.ghost end, nil,"center"), + center= newSwitch(580,90,40, function()return setting.center end, function()setting.center= not setting.center end, nil,"smo"), + smo= newSwitch(310,170,25, function()return setting.smo end, function()setting.smo= not setting.smo end, nil,"grid"), + grid= newSwitch(580,170,40, function()return setting.grid end, function()setting.grid= not setting.grid end, nil,"dropFX"), + dropFX= newSlider(310,260,373,3,40,nil,function()return setting.dropFX end, function(i)setting.dropFX=i end, nil,"shakeFX"), + shakeFX=newSlider(310,340,373,3,40,nil,function()return setting.shakeFX end, function(i)setting.shakeFX=i end, nil,"atkFX"), + atkFX= newSlider(310,420,373,3,40,nil,function()return setting.atkFX end, function(i)setting.atkFX=i end, nil,"frame"), + frame= newSlider(310,500,373,10,40,nil,function()return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4 end,function(i)setting.frameMul=i<5 and 5*i+20 or 10*i end,nil,"fullscreen"), + fullscreen=newSwitch(990,90,40,function()return setting.fullscreen end,function() setting.fullscreen=not setting.fullscreen love.window.setFullscreen(setting.fullscreen) if not setting.fullscreen then love.resize(gc.getWidth(),gc.getHeight()) end - end,nil,"vib","bgblock","bg",nil), - bgblock= newButton(850,300, 340,60,color.white,40, function() - setting.bgblock=not setting.bgblock--if not setting.bgblock then for i=1,16 do BGblockList[i].v=3*BGblockList[i].v end end - end,nil,"fullscreen","frame","arrU",nil), - frame= newButton(850,370, 340,60,color.white,40, function() - setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10) - if setting.frameMul>100 then setting.frameMul=25 end - end,nil,"bgblock","skin","sdarrU",nil), - skin= newButton(740,440, 120,60,color.white,40, function() + end,nil,"bg"), + bg= newSwitch(990,170,40,function()return setting.bg end,function()setting.bg=not setting.bg end, nil,"bgblock"), + bgblock=newSwitch(990,250,40,function()return setting.bgblock end,function() + setting.bgblock=not setting.bgblock--if not setting.bgblock then for i=1,16 do FX_BGblock.list[i].v=3*FX_BGblock.list[i].v end end + end,nil,"skin"), + skin= newButton(950,450,120,60,color.white,40,function() setting.skin=setting.skin%6+1 changeBlockSkin(setting.skin) - end,nil,"frame","back","ctrl","smo"), - smo= newButton(920,440, 200,60,color.white,27, function() - setting.smo=not setting.smo - end,nil,"frame","back","skin",nil), - back= newButton(640,620, 300,70,color.white,40, back,nil,nil,"lang",nil,nil), + end,nil,"back"), + back= newButton(600,620,300,70,color.white,40,back,nil,"ghost"), }, - setting2={--Control setting + setting_sound={ + sfx=newSlider(180,150,400,8,40,function()SFX("blip_1")end, function()return setting.sfx end,function(i)setting.sfx=i end,nil,"bgm"), + bgm=newSlider(750,150,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,340,400,5,40,function()VIB(1)end, function()return setting.vib end,function(i)setting.vib=i end,nil,"voc"), + voc=newSlider(750,340,400,8,40,function()VOICE("nya")end, function()return setting.voc end,function(i)setting.voc=i end,nil,"back"), + back=newButton(640,620,300,70,color.white,40,back,nil,"sfx"), + }, + setting_control={ back=newButton(840,630,180,60,color.white,40,back), }, - setting3={--Touch setting + setting_touch={ hide= newButton(640,210,500,80,color.white,45,function() setting.virtualkeySwitch=not setting.virtualkeySwitch end), @@ -454,18 +462,25 @@ Widget={ back= newButton(640,410,170,80,color.white,45,back), }, help={ - his= newButton(1050, 520,230,60,color.white,40,function()gotoScene("history")end, nil, nil, "qq", "back", nil), - qq= newButton(1050, 600,230,60,color.white,40,function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end, function()return mobile end,"his", nil, "back", nil), - back= newButton(640, 600,180,60,color.white,40,back, nil, "his", nil, nil, "qq"), + his= newButton(1050,520,230,60,color.white,40,function()gotoScene("history")end,nil,"back"), + qq= newButton(1050,600,230,60,color.white,40,function()sys.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"), }, history={ - prev= newButton(75, 320,100,300,color.white,40,function()love.keypressed("left")end,function()return sel==1 end), - next= newButton(1205, 320,100,300,color.white,40,function()love.keypressed("right")end,function()return sel==#updateLog end), - back= newButton(640, 640,200,70, color.white,40,back), + 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), }, stat={ - path= newButton(980,590,250,60,color.white,30,function()sys.openURL(fs.getSaveDirectory())end,function()return mobile end,nil,nil,"back",nil), - back= newButton(640,590,180,60,color.white,40,back,nil,nil,nil,nil,"path"), + path= newButton(980,590,250,60,color.white,30,function()sys.openURL(fs.getSaveDirectory())end,function()return mobile end,"back"), + back= newButton(640,590,180,60,color.white,40,back,nil,"path"), }, - sel=nil,--selected widget id -} \ No newline at end of file +} +for S,L in next,Widget do + for N,W in next,L do + if W.next then + W.next,L[W.next].prev=L[W.next],W + end + end +end +widget_sel=nil--selected widget object \ No newline at end of file diff --git a/main.lua b/main.lua index 0a84931d..b07dc790 100644 --- a/main.lua +++ b/main.lua @@ -1,3 +1,8 @@ +--[[ +第一次搞这么大的工程~参考价值不是很大 +如果你有时间并且也热爱俄罗斯方块的话,来看代码或者帮助优化的话当然欢迎! +(顺便,不经允许直接盗用代码的先死个妈) +]] local love=love local gc,tm=love.graphics,love.timer local ms,kb,tc=love.mouse,love.keyboard,love.touch @@ -6,21 +11,21 @@ local int,abs,rnd,max,min=math.floor,math.abs,math.random,math.max,math.min local find,format=string.find,string.format local ins,rem=table.insert,table.remove local Timer=tm.getTime --- sort=table.sort - local F=false null=function()end ------------------------------------------------------------- system=sys.getOS() +local mobile=system=="Android"or system=="iOS" local xOy=love.math.newTransform() local mx,my,mouseShow=-20,-20,false local touching--1st touching ID -scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1}local scr=scr +scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1} +local scr=scr scene="" -bgmPlaying=nil curBG="none" -voicePlaying={} +bgmPlaying=nil +voiceQueue={free=0} local devMode=0 kb.setKeyRepeat(true) @@ -48,18 +53,27 @@ 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={ - ghost=true,center=true, - grid=false,swap=true, - fxs=3,bg=true, das=10,arr=2, sddas=0,sdarr=2, - lang=1, + holdR=true, + swap=true, + --game + ghost=true,center=true, + smo=true,grid=false, + dropFX=3, + shakeFX=3, + atkFX=3, + frameMul=100, - sfx=true,bgm=true, - vib=3,voc=false, fullscreen=false, + bg=true, bgblock=true, - skin=1,smo=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","","",""}, {"","","","","","","","","","","","",""}, @@ -92,7 +106,7 @@ setting={ virtualkeyAlpha=3, virtualkeyIcon=true, virtualkeySwitch=false, - frameMul=100, + --control } stat={ run=0,game=0,time=0, @@ -133,10 +147,8 @@ require("dataList") require("texture") local Tmr=require("timer") local Pnt=require("paint") ---Requires +--Modules ------------------------------------------------------------- -local BGblockList={}for i=1,16 do BGblockList[i]={v=0}end -local BGblock={tm=150,next=7,ct=0} local powerInfoCanvas,updatePowerInfo if sys.getPowerInfo()~="unknown"then powerInfoCanvas=gc.newCanvas(147,22) @@ -177,15 +189,15 @@ if sys.getPowerInfo()~="unknown"then end end local function getNewBlock() - BGblock.ct=BGblock.ct+1 - if BGblock.ct==17 then BGblock.ct=1 end - local t=BGblockList[BGblock.ct] - t.bn,t.size=BGblock.next,2+3*rnd() + FX_BGblock.ct=FX_BGblock.ct+1 + if FX_BGblock.ct==17 then FX_BGblock.ct=1 end + local t=FX_BGblock.list[FX_BGblock.ct] + t.bn,t.size=FX_BGblock.next,2+3*rnd() t.b=blocks[t.bn][rnd(0,3)] t.x=rnd(-#t.b[1]*t.size*30+100,1180) t.y=-#t.b*30*t.size t.v=t.size*(1+rnd()) - BGblock.next=BGblock.next%7+1 + FX_BGblock.next=FX_BGblock.next%7+1 return t end local sceneInit={ @@ -202,12 +214,19 @@ local sceneInit={ end, main=function() modeSel,levelSel=modeSel or 1,levelSel or 3 - BGM("blank") collectgarbage() end, music=function() - sel=1 - BGM() + 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" @@ -239,14 +258,17 @@ local sceneInit={ setting=function() curBG="none" end, - setting2=function() + setting_game=null, + setting_graphic=null, + setting_sound=null, + setting_control=function() curBoard=1 keyboardSet=1 joystickSet=1 keyboardSetting=false joystickSetting=false end,--Control settings - setting3=function() + setting_touch=function() curBG="game1" defaultSel=1 sel=nil @@ -260,7 +282,7 @@ local sceneInit={ history=function() updateLog=require"updateLog" curBG="lightGrey" - sel=2 + sel=1 end, quit=function() love.event.quit() @@ -279,47 +301,25 @@ local function onVirtualkey(x,y) end return nearest end -local function buttonControl_key(i) - if i=="up"or i=="down"or i=="left"or i=="right"then - if Widget.sel then - Widget.sel=Widget[scene][Widget.sel[i]]or Widget.sel - else - Widget.sel=select(2,next(Widget[scene])) - end - elseif i=="space"or i=="return"then - if not sceneSwaping and Widget.sel then - local W=Widget.sel - if W.type=="button"then - W.alpha=1 - W.code() - if W.hide and W.hide()then Widget.sel=nil end - SFX("button") - VOICE("nya") - end - end - end -end -local function buttonControl_gamepad(i) - if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then - if Widget.sel then - Widget.sel=Widget[scene][Widget.sel[i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]]or Widget.sel - else - Widget.sel=select(2,next(Widget[scene])) - end - elseif i=="start"then - if not sceneSwaping and Widget.sel then - local W=Widget.sel - if W.type=="button"then - W.alpha=1 - W.code() - if W.hide and W.hide()then Widget.sel=nil end - SFX("button") - VOICE("nya") - end - end - end -end ------------------------------------------------------------- +local floatWheel=0 +local function wheelScroll(y) + if y>0 then + if floatWheel<0 then floatWheel=0 end + floatWheel=floatWheel+y^1.2 + elseif y<0 then + if floatWheel>0 then floatWheel=0 end + floatWheel=floatWheel-(-y)^1.2 + end + while floatWheel>=1 do + love.keypressed("up") + floatWheel=floatWheel-1 + end + while floatWheel<=-1 do + love.keypressed("down") + floatWheel=floatWheel+1 + end +end local mouseDown,mouseMove,mouseUp,wheelmoved={},{},{},{} local touchDown,touchUp,touchMove={},{},{} local keyDown,keyUp={},{} @@ -343,9 +343,8 @@ function keyDown.intro(key) end function wheelmoved.mode(x,y) - if y>0 then keyDown.mode("up") - elseif y<0 then keyDown.mode("down") - end + wheelScroll(y) + end function keyDown.mode(key) if key=="down"then @@ -495,7 +494,7 @@ function keyDown.draw(key) end end -function keyDown.setting2(key) +function keyDown.setting_control(key) if key=="escape"then if keyboardSetting then keyboardSetting=false @@ -524,7 +523,7 @@ function keyDown.setting2(key) curBoard=min(curBoard+1,8) end end -function gamepadDown.setting2(key) +function gamepadDown.setting_control(key) if key=="back"then if joystickSetting then joystickSetting=false @@ -554,7 +553,7 @@ function gamepadDown.setting2(key) end end -function mouseDown.setting3(x,y,k) +function mouseDown.setting_touch(x,y,k) if k==2 then back()end for K=1,#virtualkey do local b=virtualkey[K] @@ -563,20 +562,20 @@ function mouseDown.setting3(x,y,k) end end end -function mouseMove.setting3(x,y,dx,dy) +function mouseMove.setting_touch(x,y,dx,dy) if sel and ms.isDown(1)then local b=virtualkey[sel] b[1],b[2]=b[1]+dx,b[2]+dy end end -function mouseUp.setting3(x,y,k) +function mouseUp.setting_touch(x,y,k) if sel then local b=virtualkey[sel] local k=snapLevelValue[snapLevel] b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k end end -function touchDown.setting3(id,x,y) +function touchDown.setting_touch(id,x,y) for K=1,#virtualkey do local b=virtualkey[K] if (x-b[1])^2+(y-b[2])^21 then sel=sel-1 end - elseif key=="right"then - if sel<#updateLog then sel=sel+1 end + if key=="up"then + sel=max(sel-5,1) + elseif key=="down"then + sel=min(sel+5,#updateLog-22) elseif key=="escape"then back() end end - ------------------------------------------------------------- - +local function widgetPress(W,x,y) + if W.hide and W.hide()then widget_sel=nil end + if W.type=="button"then + W.code() + W:FX() + SFX("button") + VOICE("nya") + elseif W.type=="switch"then + W.code() + W:FX() + SFX("move",.6) + elseif W.type=="slider"then + if not x then return end + local p=W.disp() + W.code(xW.x+W.w and W.unit or int((x-W.x)*W.unit/W.w+.5)) + if p==W.disp()then return end + W:FX(p) + if W.change then W.change()end + end +end +local function widgetDrag(W,x,y,dx,dy) + if W.type=="slider"then + local p=W.disp() + W.code(xW.x+W.w and W.unit or int((x-W.x)*W.unit/W.w+.5)) + if p==W.disp()then return end + W:FX(p) + if W.change then W.change()end + elseif not W:ifAbove(x,y)then + widget_sel=nil + end +end +local function widgetControl_key(i) + if i=="tab"then + 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])) + end + elseif i=="space"or i=="return"then + if not sceneSwaping and widget_sel then + widgetPress(widget_sel) + end + else + if widget_sel then + local W=widget_sel + if W.type=="slider"then + if i=="left"then + if W.disp()>0 then W.code(W.disp()-1)end + elseif i=="right"then + if W.disp()W.x and mxW.y and myW.x and xW.y and y720 then rem(BGblock,i)end + -- end end--check player data flew + for i=#sysFX,1,-1 do + local S=sysFX[i] + S[2]=S[2]+1 + if S[2]==S[3]then + for i=i,#sysFX do + sysFX[i]=sysFX[i+1] + end + end + end + for i=#FX_BGblock,1,-1 do + FX_BGblock[i].y=FX_BGblock[i].y+FX_BGblock[i].v + if FX_BGblock[i].y>720 then rem(FX_BGblock,i)end end if setting.bgblock then - BGblock.tm=BGblock.tm-1 - if BGblock.tm==0 then - BGblock[#BGblock+1]=getNewBlock() - BGblock.tm=rnd(20,30) + FX_BGblock.tm=FX_BGblock.tm-1 + if FX_BGblock.tm==0 then + FX_BGblock[#FX_BGblock+1]=getNewBlock() + FX_BGblock.tm=rnd(20,30) end end if sceneSwaping then @@ -923,7 +993,7 @@ function love.update(dt) W.alpha=0 end--Reset widgets' alpha end - Widget.sel=nil + widget_sel=nil scene=sceneSwaping.tar sceneInit[scene]() --scene swapped! @@ -937,59 +1007,55 @@ function love.update(dt) for i=#Task,1,-1 do Task[i]:update() end - if voicePlaying[1]then - if not voicePlaying[1]:isPlaying()then - rem(voicePlaying,1) + for i=1,#voiceQueue do + local Q=voiceQueue[i] + if #Q>0 then + if type(Q[1])=="userdata"then + if not Q[1]:isPlaying()then + for i=1,#Q do + Q[i]=Q[i+1] + end + end--play next when stop + else + local n=1 + local L=voiceBank[Q[1]] + ::L::if L[n]:isPlaying()then + n=n+1 + if not L[n]then + L[n]=L[n-1]:clone() + L[n]:seek(0) + goto quit + end + goto L + end::quit:: + Q[1]=L[n] + Q[1]:setVolume(setting.voc*.125) + Q[1]:play() + --load voice with string + end end - if voicePlaying[1] and not voicePlaying[1]:isPlaying()then voicePlaying[1]:play()end end - for k,W in next,Widget[scene]do - if W.type=="button"then - local t=W==Widget.sel and .4 or 0 - W.alpha=abs(W.alpha-t)>.02 and(W.alpha+(W.alphat then W.alpha=W.alpha-.02 elseif W.alpha.5625 then @@ -1013,24 +1099,21 @@ function love.draw() gc.rectangle("fill",1280,0,d,720) end--wide end--Black side - gc.setColor(1,1,1) - if powerInfoCanvas and scene~="draw"then - gc.draw(powerInfoCanvas) - end setFont(20) gc.print(tm.getFPS(),5,700) if devMode>0 then - if devMode==2 then - gc.setColor(1,1,0) - end - gc.print(mx.." "..my,5,640) - gc.print(#freeRow.."/"..freeRow.L,5,660) - gc.print(gcinfo(),5,680) + gc.setColor(1,1,devMode==2 and 0 or 1) + gc.print("Tasks:"..#Task,5,600) + gc.print("Voices:"..#voiceQueue,5,620) + gc.print("Mouse:"..mx.." "..my,5,640) + gc.print("Free Row:"..#freeRow.."/"..freeRow.L,5,660) + gc.print("Cache used:"..gcinfo(),5,680) end end function love.run() local lastFrame,lastUpdatePowerInfo=Timer(),Timer() local readyDrawFrame=0 + local T=love.timer local PUMP,POLL=love.event.pump,love.event.poll love.resize(gc.getWidth(),gc.getHeight()) scene="load"sceneInit.load()--System Launch @@ -1040,8 +1123,8 @@ function love.run() if N=="quit"then destroyPlayers()return 0 elseif love[N]then love[N](a,b,c,d,e)end end - tm.step() - love.update(tm.getDelta()) + T.step() + love.update(T.getDelta()) if not wd.isMinimized()then readyDrawFrame=readyDrawFrame+setting.frameMul if readyDrawFrame>=100 then @@ -1056,7 +1139,7 @@ function love.run() lastUpdatePowerInfo=Timer() end until Timer()-lastFrame>.0133 - tm.sleep(.003) + T.sleep(.003) lastFrame=Timer() end end @@ -1067,7 +1150,7 @@ if fs.getInfo("userdata")then end if fs.getInfo("usersetting")then loadSetting() -elseif system=="Android" or system=="iOS"then +elseif mobile then setting.virtualkeySwitch=true setting.swap=false end diff --git a/paint.lua b/paint.lua index 15db7712..8ac94304 100644 --- a/paint.lua +++ b/paint.lua @@ -106,12 +106,12 @@ local function stencil_miniTitle() end end -FX={ - flash=0,--Black screen(frame) - shake=0,--Screen shake(frame) - attack={},--Attack beam - badge={},--badge thrown - +FX_BGblock={tm=150,next=7,ct=0,list={{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},{v=0},}}--Falling tetrominos on background +FX_attack={}--Attack beam +FX_badge={}--Badge thrown +sysFX={} +FX_ripple={}--Ripple&SqrShade +textFX={ appear=function(t,a) setFont(t.font) gc.setColor(1,1,1,a) @@ -332,17 +332,17 @@ function Pnt.intro() end function Pnt.main() gc.setColor(1,1,1) - gc.draw(titleImage,280,30,nil,1.3) - setFont(30) - gc.print(gameVersion,290,125) - gc.print(system,845,95) + gc.draw(coloredTitleImage,280,30,nil,1.3) + gc.draw(drawableText.warning,570,128) setFont(35) + gc.print(gameVersion,290,125) + gc.print(system,840,95) mStr(modeLevel[modeID[modeSel]][levelSel],160,180) mStr(text.modeName[modeSel],160,380) end function Pnt.mode() gc.setColor(1,1,1) - gc.draw(titleImage,810,30) + gc.draw(titleImage,830,30) setFont(40) gc.setColor(modeLevelColor[modeLevel[modeID[modeSel]][levelSel]]or color.white) mStr(modeLevel[modeID[modeSel]][levelSel],270,215) @@ -368,29 +368,37 @@ function Pnt.music() gc.draw(drawableText.musicRoom,20,20) gc.setColor(1,1,1) gc.draw(drawableText.musicRoom,22,23) - gc.draw(drawableText.nowPlaying,490,110) + gc.draw(drawableText.nowPlaying,490,390) setFont(35) for i=1,#musicID do gc.print(musicID[i],50,90+30*i) end - setFont(50) - gc.setColor(sin(Timer()*.5)*.2+.8,sin(Timer()*.7)*.2+.8,sin(Timer())*.2+.8) - mStr(bgmPlaying or"",630,180) + gc.draw(titleImage,640,310,nil,1.5,nil,206,35) + if bgmPlaying then + setFont(50) + gc.setColor(sin(Timer()*.5)*.2+.8,sin(Timer()*.7)*.2+.8,sin(Timer())*.2+.8) + mStr(bgmPlaying or"",630,460) + local t=-Timer()%2.3/2 + if t<1 then + gc.setColor(1,1,1,t) + gc.draw(coloredTitleImage,640,310,nil,1.5+.1-.1*t,1.5+.3-.3*t,206,35) + end + end end function Pnt.custom() gc.setColor(1,1,1,.3+sin(Timer()*8)*.2) - gc.rectangle("fill",25,95+40*sel,465,40) + gc.rectangle("fill",25,95+40*sel,480,40) gc.setColor(.8,.8,.8)gc.draw(drawableText.custom,20,20) gc.setColor(1,1,1)gc.draw(drawableText.custom,22,23) setFont(40) for i=1,#customID do local k=customID[i] local y=90+40*i - gc.printf(text.customOption[k],30,y,320,"right") + gc.printf(text.customOption[k],15,y,320,"right") if text.customVal[k]then - gc.print(text.customVal[k][customSel[i]],350,y) + gc.print(text.customVal[k][customSel[i]],335,y) else - gc.print(customRange[k][customSel[i]],350,y) + gc.print(customRange[k][customSel[i]],335,y) end end end @@ -698,32 +706,32 @@ function Pnt.play() end end--Draw players gc.setLineWidth(5) - for i=1,#FX.attack do - local A=FX.attack[i] + for i=1,#FX_attack do + local A=FX_attack[i] gc.push("transform") - local a=A.a - if A.t<20 then - gc.translate(A.x1,A.y1) - a=a*A.t*.05 - elseif A.t<80 then - local t=((A.t-20)*.016667)t=(3-2*t)*t*t - gc.translate(A.x1*(1-t)+A.x2*t,A.y1*(1-t)+A.y2*t) - else - gc.translate(A.x2,A.y2) - a=a*(5-A.t*.05) - end - gc.rotate(A.t*.1) + local a=A.t<10 and A.a*A.t*.05 or A.t>50 and A.a*(6-A.t*.1)or A.a gc.setColor(A.r,A.g,A.b,a*.5) gc.circle("line",0,0,A.rad,A.corner) + local L=A.drag + for i=1,#L,2 do + gc.setColor(A.r,A.g,A.b,a*i*.05) + gc.translate(L[i],L[i+1]) + gc.rotate(A.t*.1) + gc.circle("fill",0,0,A.rad,A.corner) + gc.rotate(-A.t*.1) + gc.translate(-L[i],-L[i+1]) + end gc.setColor(A.r,A.g,A.b,a) + gc.translate(A.x,A.y) + gc.rotate(A.t*.1) gc.circle("fill",0,0,A.rad,A.corner) gc.pop() end gc.setColor(1,1,1) if setting.virtualkeySwitch then drawVirtualkey()end if modeEnv.royaleMode then - for i=1,#FX.badge do - local b=FX.badge[i] + for i=1,#FX_badge do + local b=FX_badge[i] gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1) if b.t<10 then gc.draw(badgeIcon,b[1]-14,b[2]-14) @@ -751,9 +759,9 @@ function Pnt.play() end end if restartCount>0 then - gc.setColor(1,.7,.7,.5+restartCount*.02) - gc.arc("fill",640,360,735,-1.5708,restartCount*0.3696-1.5708) - gc.setColor(0,0,0,restartCount/17) + -- gc.setColor(1,.7,.7,.5+restartCount*.02) + -- gc.arc("fill",640,360,735,-1.5708,restartCount*0.3696-1.5708) + gc.setColor(0,0,0,restartCount/20) gc.rectangle("fill",0,0,1280,720) end end @@ -764,7 +772,7 @@ function Pnt.pause() gc.setColor(1,1,1,pauseTimer*.02) setFont(30) if pauseCount>0 then - gc.print(text.pauseTime..":["..pauseCount.."] "..format("%0.2f",pauseTime).."s",110,150) + gc.print(text.pauseCount..":["..pauseCount.."] "..format("%0.2f",pauseTime).."s",110,150) end for i=1,7 do gc.print(text.stat[i+3],110,30*i+270) @@ -777,21 +785,24 @@ function Pnt.pause() setFont(40) if system~="Android"then mStr(text.space.."/"..text.enter,640,335) - gc.print("ESC",610,509) + gc.print("ESC",610,506) end mDraw(gamefinished and drawableText.finish or drawableText.pause,640,60-10*(5-pauseTimer*.1)^1.5) end -function Pnt.setting() +function Pnt.setting_game() gc.setColor(1,1,1) - setFont(35) - mStr("DAS:"..setting.das,290,278) - mStr("ARR:"..setting.arr,506,278) - setFont(21) - mStr(text.softdropdas..setting.sddas,290,357) - mStr(text.softdroparr..setting.sdarr,506,357) - gc.draw(blockSkin[7-int(Timer()*2)%7],820,480,nil,2) + setFont(40) + mStr("DAS:"..setting.das,260,95) + mStr("ARR:"..setting.arr,560,95) + setFont(28) + mStr(text.softdropdas..setting.sddas,260,213) + mStr(text.softdroparr..setting.sdarr,560,213) end -function Pnt.setting2() +function Pnt.setting_graphic() + gc.setColor(1,1,1) + gc.draw(blockSkin[7-int(Timer()*2)%7],1020,420,nil,2) +end +function Pnt.setting_control() local a=.3+sin(Timer()*15)*.1 if keyboardSetting then gc.setColor(1,.5,.5,a) @@ -826,7 +837,7 @@ function Pnt.setting2() gc.print("P"..int(curBoard*.5+.5).."/P4",420,560) gc.print(curBoard.."/8",580,560) end -function Pnt.setting3() +function Pnt.setting_touch() VirtualkeyPreview() local d=snapLevelValue[snapLevel] if d>=10 then @@ -846,7 +857,7 @@ function Pnt.help() for i=1,11 do gc.printf(text.help[i],140,15+43*i,1000,"center") end - gc.draw(titleImage,250,600,.2,1+.05*sin(Timer()*2),nil,212,35) + gc.draw(titleImage,250,600,.2,1+.05*sin(Timer()*2),nil,206,35) gc.setLineWidth(5) gc.rectangle("line",17,17,260,260) gc.rectangle("line",1077,17,186,186) @@ -865,15 +876,17 @@ function Pnt.stat() gc.print(text.stat[i],400,30*i-5) gc.print(statOpt(i),720,30*i-5) end - gc.draw(titleImage,260,600,.2+.07*sin(Timer()*3),nil,nil,212,35) + gc.draw(titleImage,260,600,.2+.07*sin(Timer()*3),nil,nil,206,35) end function Pnt.history() gc.setColor(.2,.2,.2,.7) - gc.rectangle("fill",150,35,980,530) + gc.rectangle("fill",30,45,1000,632) gc.setColor(1,1,1) gc.setLineWidth(4) - gc.rectangle("line",150,35,980,530) + gc.rectangle("line",30,45,1000,632) setFont(25) - gc.print(updateLog[sel],160,40) + for i=0,min(22,#updateLog-sel)do + gc.print(updateLog[sel+i],40,50+27*(i)) + end end return Pnt \ No newline at end of file diff --git a/texture.lua b/texture.lua index be77d4cb..8784c350 100644 --- a/texture.lua +++ b/texture.lua @@ -46,6 +46,7 @@ c:release() gc.setDefaultFilter("linear","linear") titleImage=N("/image/mess/title.png") +coloredTitleImage=N("/image/mess/title_colored.png") dialCircle=N("/image/mess/dialCircle.png") dialNeedle=N("/image/mess/dialNeedle.png") badgeIcon=N("/image/mess/badge.png") @@ -69,5 +70,6 @@ drawableText={ setting2Help=T(25), musicRoom=T(80), nowPlaying=T(50), + warning=T(30), } c=gc.setCanvas() \ No newline at end of file diff --git a/timer.lua b/timer.lua index eeb802c8..9c13356d 100644 --- a/timer.lua +++ b/timer.lua @@ -8,12 +8,12 @@ load=function() local t=Timer() ::R:: if loading==1 then - if loadnum<=#voiceList then - local N=voiceList[loadnum] - for i=1,#voice[N]do - voice[N][i]=love.audio.newSource("VOICE/"..voice[N][i]..".ogg","static") + if loadnum<=#voiceName then + local N=voiceName[loadnum] + for i=1,#voiceList[N]do + voiceBank[voiceList[N][i]]={love.audio.newSource("VOICE/"..voiceList[N][i]..".ogg","static")} end - loadprogress=loadnum/#voiceList + loadprogress=loadnum/#voiceName loadnum=loadnum+1 else loading=2 @@ -60,20 +60,34 @@ end, play=function(dt) frame=frame+1 stat.time=stat.time+dt - for i=#FX.attack,1,-1 do - local b=FX.attack[i] + for i=#FX_attack,1,-1 do + local b=FX_attack[i] b.t=b.t+1 - local t0=b.t*.025--t in [0,1] - local t=(sin(1.5*(2*t0-1))+1)*.5 - if t0==1 then - rem(FX.attack,i) + if b.t>50 then + b.rad=b.rad*1.08+.2 + b.x,b.y=b.x2,b.y2 + elseif b.t>10 then + local t=((b.t-10)*.025)t=(3-2*t)*t*t + b.x,b.y=b.x1*(1-t)+b.x2*t,b.y1*(1-t)+b.y2*t + end + if b.t<60 then + local L=FX_attack[i].drag + if #L==10 then + rem(L,1)rem(L,1) + end + ins(L,b.x)ins(L,b.y) + else + for i=1,#FX_attack do + FX_attack[i]=FX_attack[i+1] + end end end - for i=#FX.badge,1,-1 do - local b=FX.badge[i] + + for i=#FX_badge,1,-1 do + local b=FX_badge[i] b.t=b.t+1 if b.t==60 then - rem(FX.badge,i) + rem(FX_badge,i) end end for i=1,#virtualkey do @@ -81,18 +95,6 @@ play=function(dt) virtualkeyPressTime[i]=virtualkeyPressTime[i]-1 end end - local E=#FX.attack - for i=E,1,-1 do - local A=FX.attack[i] - A.t=A.t+1 - if A.t>=100 then - for j=i,E do - FX.attack[j]=FX.attack[j+1] - end--remove [i] - elseif A.t>80 then - A.rad=A.rad*1.08+.2 - end - end if frame<180 then if frame==179 then @@ -116,7 +118,7 @@ play=function(dt) return elseif players[1].keyPressing[10]then restartCount=restartCount+1 - if restartCount>17 then + if restartCount>20 then clearTask("play") updateStat() resetGameData() @@ -298,7 +300,7 @@ play=function(dt) end for i=#P.shade,1,-1 do local S=P.shade[i] - S[1]=S[1]-1+setting.fxs*.25 + S[1]=S[1]-1+setting.dropFX*.25 if S[1]<=0 then rem(P.shade,i) end @@ -322,14 +324,14 @@ play=function(dt) end for i=#P.atkBuffer,1,-1 do - local atk=P.atkBuffer[i] - atk.time=atk.time+1 - if not atk.sent then - if atk.countdown>0 then - atk.countdown=atk.countdown-garbageSpeed + local A=P.atkBuffer[i] + A.time=A.time+1 + if not A.sent then + if A.countdown>0 then + A.countdown=max(A.countdown-garbageSpeed,0) end else - if atk.time>20 then + if A.time>20 then rem(P.atkBuffer,i) end end diff --git a/toolfunc.lua b/toolfunc.lua index 7ee47972..850cd1cd 100644 --- a/toolfunc.lua +++ b/toolfunc.lua @@ -24,7 +24,6 @@ end function mDraw(s,x,y) gc.draw(s,x-s:getWidth()*.5,y) end - function destroyPlayers() if players then for _,P in next,players do if P.id then @@ -75,16 +74,13 @@ local drawableTextLoad={ "setting2Help", "musicRoom", "nowPlaying", + "warning", } function swapLanguage(l) text=require("language/"..langID[l]) - Widget.sel=nil for S,L in next,Widget do for N,W in next,L do - if W.type=="button"then - W.alpha=0 - W.text=text.ButtonText[S][N] - end + W.text=text.WidgetText[S][N] end end gc.push("transform") @@ -109,6 +105,7 @@ function changeBlockSkin(n) n=n-1 gc.push("transform") gc.origin() + gc.setColor(1,1,1) for i=1,13 do gc.setCanvas(blockSkin[i]) gc.draw(blockImg,30-30*i,-30*n) @@ -126,7 +123,7 @@ function VIB(t) end end function SFX(s,v) - if setting.sfx then + if setting.sfx>0 then local n=1 ::L::if sfx[s][n]:isPlaying()then n=n+1 @@ -137,20 +134,32 @@ function SFX(s,v) end goto L end::quit:: - sfx[s][n]:setVolume(v or 1) + sfx[s][n]:setVolume((v or 1)*setting.sfx*.125) sfx[s][n]:play() end end -function VOICE(s,n) - if setting.voc then - voicePlaying[#voicePlaying+1]=voice[s][n or rnd(#voice[s])] - if #voicePlaying==1 then - voicePlaying[1]:play() +function getFreeVoiceChannel() + local i=#voiceQueue + for i=1,i do + if #voiceQueue[i]==0 then return i end + end + voiceQueue[i+1]={} + return i+1 +end +function VOICE(s,chn) + if setting.voc>0 then + if chn then + voiceQueue[chn][#voiceQueue[chn]+1]=voiceList[s][rnd(#voiceList[s])] + --添加到[chn] + else + local P=#voiceQueue + voiceQueue[P+1]={voiceList[s][rnd(#voiceList[s])]} + --新建[chn] end end end function BGM(s) - if setting.bgm then + if setting.bgm>0 then if bgmPlaying~=s then if bgmPlaying then newTask(Event_task.bgmFadeOut,nil,bgmPlaying)end for i=#Task,1,-1 do @@ -167,8 +176,19 @@ function BGM(s) end bgmPlaying=s else - if bgmPlaying then bgm[bgmPlaying]:play()end + if bgmPlaying then + local v=setting.bgm*.125 + bgm[bgmPlaying]:setVolume(v) + if v>0 then + bgm[bgmPlaying]:play() + else + bgm[bgmPlaying]:pause() + end + end end + elseif bgmPlaying then + bgm[bgmPlaying]:pause() + bgmPlaying=nil end end @@ -221,7 +241,7 @@ function gotoScene(s,style) time=swap[style][1],mid=swap[style][2], draw=swap[style].d } - Widget.sel=nil + widget_sel=nil if style~="none"then SFX("swipe") end @@ -253,8 +273,11 @@ local prevMenu={ saveSetting() gotoScene("main") end, - setting2="setting", - setting3="setting", + setting_game= "setting", + setting_graphic="setting", + setting_sound= "setting", + setting_control="setting", + setting_touch= "setting", help="main", history="help", stat="main", @@ -339,8 +362,8 @@ function loadSetting() local p=find(t[i],"=") if p then local t,v=sub(t[i],1,p-1),sub(t[i],p+1) - if t=="sfx"or t=="bgm"or t=="bgblock"or t=="voc"then - setting[t]=v=="true" + if t=="sfx"or t=="bgm"or t=="voc"then + setting[t]=toN(v:match("[012345678]"))or setting[t] elseif t=="vib"then setting.vib=toN(v:match("[012345]"))or 0 elseif t=="fullscreen"then @@ -366,6 +389,8 @@ function loadSetting() end elseif t=="virtualkeyAlpha"then setting.virtualkeyAlpha=min(int(abs(toN(v))),10) + elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="bg"or t=="bgblock"or t=="smo"then + setting[t]=v=="true" elseif t=="virtualkeyIcon"or t=="virtualkeySwitch"then setting[t]=v=="true" elseif t=="frameMul"then @@ -373,9 +398,7 @@ function loadSetting() elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then v=toN(v)if not v or v<0 then v=0 end setting[t]=int(v) - elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="bg"or t=="smo"then - setting[t]=v=="true" - elseif t=="fxs"then + elseif t=="dropFX"or t=="shakeFX"or t=="atkFX"then setting[t]=toN(v:match("[0123]"))or 0 elseif t=="lang"then setting[t]=toN(v:match("[123]"))or 1 @@ -386,22 +409,30 @@ function loadSetting() end end local saveOpt={ - "ghost","center", - "grid","swap", - "fxs","bg", "das","arr", "sddas","sdarr", + "holdR", + "swap", + + "ghost","center", + "smo","grid", + "dropFX", + "shakeFX", + "atkFX", + "frameMul", + + "fullscreen", + "bg", + "bgblock", "lang", + "skin", "sfx","bgm", "vib","voc", - "fullscreen", - "bgblock", - "skin","smo", + "virtualkeyAlpha", "virtualkeyIcon", "virtualkeySwitch", - "frameMul", } function saveSetting() local vk={} diff --git a/updateLog.lua b/updateLog.lua index dedabba8..7d1c54db 100644 --- a/updateLog.lua +++ b/updateLog.lua @@ -1,11 +1,13 @@ -return{ -[=[Future outlook: - Brand New GUI: - custom restart method +local S=[=[ +Future outlook: + GUI: + highscore of most modes custom block color/direction custom sequence virtual key switch(all keys) Normal Things: + new cooler attack FX + combo mode demo play at main menu any screen size CC smarter(think of gaebage buffer) @@ -17,9 +19,10 @@ return{ Encrypt source code(JIT to byte code) infinite 1v1 square mode - more FXs & 3d features & animations]=],[=[ -0.7.23: - remake all BGM! + more FXs & 3d features & animations +0.7.24(0.7.23): + REMAKE ALL BGM! + more settings with brand new GUI! new mode:Master-Final new modes:attacker & defender(not survivor!) add restart button when pause @@ -27,7 +30,8 @@ return{ change falling animation new GUI details louder sound - code optimized & many bugs fixed]=],[=[ + code optimized + many bugs fixed 0.7.22: scoring system smooth dropping @@ -46,7 +50,7 @@ return{ 0.7.21: new title image more GUI details - many bugs fixed]=],[=[ + many bugs fixed 0.7.20: add music room change block/space apperance in draw mode @@ -63,7 +67,7 @@ return{ add 2 new block skins new difficulty in infinite mode new background/sound effect in master mode - bug fixed]=],[=[ + bug fixed 0.7.18: 3 new block skins!(one skin origional by Miya(nya~)) better restarting(to prevent mistakenly touching) @@ -79,7 +83,7 @@ return{ adjust difficulty of PC train mode adjust vibrate level for mobile devices little optimized - bugs fixed]=],[=[ + bugs fixed 0.7.16: bugs fixed change rules of custom puzzle mode @@ -92,7 +96,7 @@ return{ can pause game with animation change icon of "Functional key" speed optimized - bugs fixed]=],[=[ + bugs fixed 0.7.14: drawing mode in custom game can adjust virtual keys with mouse @@ -103,7 +107,7 @@ return{ little game rule change bugs fixed(AI control error) 0.7.13: - Chniese game name:方块研究所 + Chinese game name:方块研究所 SUPER COOL instant moving effect new b2b bar style & animation new transition animation @@ -111,7 +115,7 @@ return{ adjust delay algorithm(probably cause controlfeel changing,please reset your DAS setting) code reconstructed bugs fixed(error when seq=his,size of custom oppo) - debug key change to F8]=],[=[ + debug key change to F8 0.7.12: AI learned to switch attack mode seperate master mode from marathon mode @@ -124,7 +128,7 @@ return{ grid switch swap target by combo key/press some Chinese translaton editted - [reconstruct event system]]=],[=[ + [reconstruct event system] 0.7.11: some Chinese translaton editted add bone block in 2 hardest marathon(new block-fresh system) @@ -135,7 +139,7 @@ return{ clearer attacking pointer fix 6 next in classic mode add QR code in help page - change some detials]=],[=[ + change some detials 0.7.10: 更完全的中文翻译 add Classic mode @@ -148,7 +152,7 @@ return{ change rotate system change BGM&BG set code optimized - fix bugs]=],[=[ + fix bugs 0.7.8: GPU usage decreased much more than before add virtual key animation @@ -163,7 +167,7 @@ return{ combine some modes change some GUI more SFXs - fix bugs]=],[=[ + fix bugs 0.7.6: new font add DIFFICULTY selection @@ -175,7 +179,7 @@ return{ better GUI&change speed&BGM in royale mode more FXs in royale mode fix all attacking bug of royale mode - change sequence of TSD-only mode to bag7]=],[=[ + change sequence of TSD-only mode to bag7 0.7.5: reduce difficuly of PC training mode,and add more patterns reduce difficuly of death mode @@ -189,7 +193,7 @@ return{ change game icon adjust GUI of royale mode change sequence of TSD-only mode - royale mode use LESS GPU]=],[=[ + royale mode use LESS GPU 0.7.4: add a lot of bugs 0.7.3: @@ -205,5 +209,15 @@ return{ remove non-sense s/z spin double GUI position editted grid BG changed - smarter AI]=] -} \ No newline at end of file + smarter AI +]=] +local find,sub=string.find,string.sub +local L,n,p={},1,1 +local eof=#S +repeat + p1=find(S,"\n",p) + L[n]=sub(S,p,p1-1) + n=n+1 + p=p1+1 +until p1==eof +return L \ No newline at end of file