diff --git a/conf.lua b/conf.lua index 29391acc..06f141c8 100644 --- a/conf.lua +++ b/conf.lua @@ -1,5 +1,5 @@ math.randomseed(os.time()) -gameVersion="Alpha V0.8.0" +gameVersion="Alpha V0.8.1" function love.conf(t) t.identity="Techmino"--Save directory name t.version="11.1" diff --git a/dataList.lua b/dataList.lua index 6bd1e856..dc139330 100644 --- a/dataList.lua +++ b/dataList.lua @@ -452,6 +452,9 @@ end Event_task={} function Event_task.finish(P) P.endCounter=P.endCounter+1 + if scene.cur~="play"then + return true + end if P.endCounter>120 then pauseGame() return true @@ -472,7 +475,7 @@ function Event_task.lose(P) removeRow(P.field) removeRow(P.visTime) end - if #players==1 then + if #players==1 and scene=="play"then pauseGame() end return true @@ -796,14 +799,14 @@ modes.sprint={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(55) local r=max(P.gameEnv.target-P.stat.row,0) mStr(r,-82,265) if r<21 and r>0 then gc.setLineWidth(4) gc.setColor(1,r>10 and 0 or rnd(),.5) - gc.line(0,600-30*r,300,600-30*r) + gc.line(dx,600-30*r+dy,300+dx,600-30*r+dy) end end, } @@ -829,7 +832,7 @@ modes.marathon={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(45) mStr(P.stat.row,-82,320) mStr(P.gameEnv.target,-82,370) @@ -870,7 +873,7 @@ modes.master={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(45) mStr(P.modeData.point,-82,320) mStr((P.modeData.event+1)*100,-82,370) @@ -894,7 +897,7 @@ modes.classic={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(75) local r=P.gameEnv.target*.1 mStr(r<11 and 18 or r<22 and r+8 or r==22 and"00"or r==23 and"0a"or format("%x",r*10-220),-82,210) @@ -918,7 +921,7 @@ modes.zen={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(70) mStr(max(200-P.stat.row,0),-82,280) end, @@ -947,7 +950,7 @@ modes.infinite={ end end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(45) mStr(P.stat.atk,-82,310) mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420) @@ -988,7 +991,7 @@ modes.solo={ newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,80000)) end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) end, } @@ -1017,7 +1020,7 @@ modes.round={ end garbageSpeed=1e4 end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) end, } @@ -1042,7 +1045,7 @@ modes.tsd={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(75) mStr(P.modeData.event,-82,330) mDraw(drawableText.tsd,-82,407) @@ -1093,6 +1096,7 @@ modes.blind={ _20G=true, drop=0,lock=15, wait=10,fall=15, + next=3, visible="fast", freshLimit=15, dropPiece="GM_score", @@ -1106,7 +1110,7 @@ modes.blind={ players[1].modeData.event="M7" end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) mDraw(drawableText.line,-82,300) mDraw(drawableText.techrash,-82,420) if curMode.lv==6 then @@ -1140,7 +1144,7 @@ modes.dig={ newPlayer(1,340,15) pushSpeed=1 end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(65) mStr(P.modeData.event,-82,310) mDraw(drawableText.wave,-82,375) @@ -1189,7 +1193,7 @@ modes.survivor={ newPlayer(1,340,15) pushSpeed=curMode.lv>2 and 2 or 1 end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(65) mStr(P.modeData.event,-82,310) mDraw(drawableText.wave,-82,375) @@ -1221,7 +1225,7 @@ modes.defender={ pushSpeed=2 end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(55) mStr(P.modeData.event,-82,200) mStr(P.modeData.point,-82,320) @@ -1253,7 +1257,7 @@ modes.attacker={ pushSpeed=2 end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(55) mStr(P.modeData.event,-82,200) mStr( @@ -1322,7 +1326,7 @@ modes.tech={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(45) mStr(P.stat.atk,-82,310) mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420) @@ -1367,7 +1371,7 @@ modes.c4wtrain={ elseif r==6 then F[1][7],F[1][6],F[1][5]=10,10,10 end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(45) mStr(max(100-P.stat.row,0),-82,220) mStr(P.combo,-82,310) @@ -1405,7 +1409,7 @@ modes.pctrain={ newPlayer(1,340,15) Event.newPC(players[1]) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(75) mStr(P.stat.pc,-82,330) mDraw(drawableText.pc,-82,412) @@ -1441,10 +1445,10 @@ modes.pcchallenge={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(45) mStr(max(100-P.stat.row,0),-82,250) - + setFont(75) mStr(P.stat.pc,-82,350) mDraw(drawableText.pc,-82,432) @@ -1504,7 +1508,7 @@ modes.techmino49={ n=n+1 end end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(35) mStr(#players.alive.."/49",-82,175) mStr(P.ko,-70,215) @@ -1568,7 +1572,7 @@ modes.techmino99={ n=n+1 end end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(35) mStr(#players.alive.."/99",-82,175) mStr(P.ko,-70,215) @@ -1607,7 +1611,7 @@ modes.drought={ load=function() newPlayer(1,340,15) end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(70) mStr(max(100-P.stat.row,0),-82,280) end, @@ -1636,7 +1640,7 @@ modes.hotseat={ newPlayer(4,955,160,.5) end end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) end, } @@ -1694,7 +1698,7 @@ modes.custom={ modeEnv.bg=customRange.bg[customSel[12]] modeEnv.bgm=customRange.bgm[customSel[13]] end, - mesDisp=function(P) + mesDisp=function(P,dx,dy) setFont(55) if P.gameEnv.puzzle or P.gameEnv.target>1e10 then mStr(P.stat.row,-82,225) @@ -1703,21 +1707,11 @@ modes.custom={ mStr(max(P.gameEnv.target-P.stat.row,0),-82,240) end if P.gameEnv.puzzle and P.modeData.event==0 then - gc.setLineWidth(3) + local m=puzzleMark for y=1,preField.h do for x=1,10 do - local B=preField[y][x] - if B>7 then - gc.setColor(blockColor[B]) - gc.rectangle("line",30*x-23,607-30*y,16,16) - elseif B>0 then - local c=blockColor[B] - 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==-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) + local T=preField[y][x] + if T~=0 then + gc.draw(m[T],30*x-30+dx,600-30*y+dy) end end end end diff --git a/default_data.lua b/default_data.lua index e4bcb109..8b7bdfdc 100644 --- a/default_data.lua +++ b/default_data.lua @@ -8,10 +8,10 @@ setting={ ghost=true,center=true, smo=true,grid=false, dropFX=3, - shakeFX=1, + shakeFX=2, atkFX=3, frameMul=100, - -- + fullscreen=false, bg=true, bgblock=true, diff --git a/image/mess/charge.png b/image/mess/charge.png deleted file mode 100644 index 785d3ce6..00000000 Binary files a/image/mess/charge.png and /dev/null differ diff --git a/image/mess/power.png b/image/mess/power.png index 64321f98..83a812be 100644 Binary files a/image/mess/power.png and b/image/mess/power.png differ diff --git a/list.lua b/list.lua index d09ed432..88b3eccb 100644 --- a/list.lua +++ b/list.lua @@ -211,7 +211,6 @@ local virtualkeySet={ {8, 320, 720-200, 80},--hold {9, 80, 280, 80},--func {10,1280-80, 280, 80},--restart - },--Mirrored farter's set,sknaht { {1, 80, 720-80, 80},--moveLeft @@ -454,13 +453,13 @@ Widget={ setting_graphic={ sound= newButton(200,80,240,80,C.lightGreen,35,function()scene.swapTo("setting_sound")end, nil,"game"), game= newButton(1080,80,240,80,C.lightGreen,35,function()scene.swapTo("setting_game")end, nil,"ghost"), - ghost= newSwitch(310,180,35,SETdisp("ghost"), SETdisp("ghost"), nil,"center"), - center= newSwitch(580,180,35,SETdisp("center"), SETdisp("center"), nil,"smo"), - smo= newSwitch(310,260,25,SETdisp("smo"), SETdisp("smo"), nil,"grid"), - grid= newSwitch(580,260,30,SETdisp("grid"), SETdisp("grid"), nil,"dropFX"), - dropFX= newSlider(310,350,373,3,35,nil,SETdisp("dropFX"), SETsto("dropFX"), nil,"shakeFX"), - shakeFX=newSlider(310,430,373,3,35,nil,SETdisp("shakeFX"), SETsto("shakeFX"), nil,"atkFX"), - atkFX= newSlider(310,510,373,3,35,nil,SETdisp("atkFX"), SETsto("atkFX"), nil,"frame"), + ghost= newSwitch(310,180,35,SETdisp("ghost"), SETrev("ghost"), nil,"center"), + center= newSwitch(580,180,35,SETdisp("center"), SETrev("center"), nil,"smo"), + smo= newSwitch(310,260,25,SETdisp("smo"), SETrev("smo"), nil,"grid"), + grid= newSwitch(580,260,30,SETdisp("grid"), SETrev("grid"), nil,"dropFX"), + dropFX= newSlider(310,350,373,5,35,nil,SETdisp("dropFX"), SETsto("dropFX"), nil,"shakeFX"), + shakeFX=newSlider(310,430,373,5,35,nil,SETdisp("shakeFX"), SETsto("shakeFX"), nil,"atkFX"), + atkFX= newSlider(310,510,373,5,35,nil,SETdisp("atkFX"), SETsto("atkFX"), nil,"frame"), frame= newSlider(310,590,373,10,35,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,180,40,SETdisp("fullscreen"),function() setting.fullscreen=not setting.fullscreen @@ -486,7 +485,7 @@ Widget={ bgm= newSlider(750,250,400,10,35,function()BGM(bgmPlaying or"blank")end, SETdisp("bgm"), SETsto("bgm"), nil,"vib"), vib= newSlider(180,440,400,5 ,35,function()VIB(1)end, SETdisp("vib"), SETsto("vib"), nil,"voc"), voc= newSlider(750,440,400,10,35,function()VOICE("nya")end, SETdisp("voc"), SETsto("voc"), nil,"stereo"), - stereo= newSlider(180,630,400,10,35,function()SFX("move",1,-1)SFX("lock",1,1)end, SETdisp("stereo"), SETsto("stereo"),nil,"back"), + stereo= newSlider(180,630,400,10,35,function()SFX("move",1,-1)SFX("lock",1,1)end, SETdisp("stereo"), SETsto("stereo"),function()return setting.sfx==0 end,"back"), back=newButton(1160,600,160,160,C.white,50,scene.back,nil,"game"), }, setting_key={ diff --git a/main.lua b/main.lua index efa99e71..80538bc1 100644 --- a/main.lua +++ b/main.lua @@ -17,7 +17,7 @@ local mx,my,mouseShow=-20,-20,false local touching--第一触摸ID local devMode=0 -modeSel,levelSel=1,3--初始模式选择 +modeSel,levelSel=1,3--初始模式选择(saved in setting) players={alive={},human=0} scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1} local scr=scr @@ -75,38 +75,39 @@ require("player") ------------------------------------------------------------- local powerInfoCanvas,updatePowerInfo if sys.getPowerInfo()~="unknown"then - powerInfoCanvas=gc.newCanvas(147,22) - updatePowerInfo=function() + powerInfoCanvas=gc.newCanvas(108,27) + function updatePowerInfo() local state,pow=sys.getPowerInfo() if state~="unknown"then gc.setCanvas(powerInfoCanvas)gc.push("transform")gc.origin() - gc.clear(0,0,0,.3) + gc.clear(0,0,0,.25) gc.setLineWidth(4) - setFont(20) - local charging - if state~="battery"then - gc.setColor(1,1,1) - if state=="nobattery"then - gc.setLineWidth(2) - gc.line(61.5,.5,83.5,22.5) - elseif state=="charging"or state=="charged"then - gc.draw(chargeImage,84,3) - end + local charging=state=="charging" + gc.setColor(1,1,1) + if state=="nobattery"then + gc.setLineWidth(2) + gc.line(74,5,99,22) end - if pow then + if pow<100 then if charging then gc.setColor(0,1,0) elseif pow>50 then gc.setColor(1,1,1) elseif pow>26 then gc.setColor(1,1,0) elseif pow<26 then gc.setColor(1,0,0) - else gc.setColor(.5,0,1)--special~ + else gc.setColor(.5,0,1) end - ::L:: - gc.rectangle("fill",61,6,pow*.15,10) + gc.rectangle("fill",76,6,pow*.22,14) + setFont(14) + gc.setColor(0,0,0) + gc.print(pow,77,2) + gc.print(pow,77,4) + gc.print(pow,79,2) + gc.print(pow,79,4) gc.setColor(1,1,1) - gc.draw(batteryImage,58,3) - gc.print(pow.."%",94,-3) + gc.draw(batteryImage,73,3) + gc.print(pow,78,3) end - gc.print(os.date("%H:%M",os.time()),2,-3) + setFont(25) + gc.print(os.date("%H:%M",os.time()),3,-5) gc.pop()gc.setCanvas() end end @@ -314,6 +315,14 @@ function touchMove.draw(id,x,y,dx,dy) preField[sy][sx]=pen end end +local penKey={ + ["1"]=1,["2"]=2,["3"]=3, + q=4, w=5, e=6, + a=7, s=9, d=10, + z=11, x=12, c=13, + tab=0, backspace=0, + lshift=-1, lalt=-1, +} function keyDown.draw(key) if key=="delete"then if clearSureTime>15 then @@ -337,14 +346,10 @@ function keyDown.draw(key) if sx and sy then preField[sy][sx]=pen end - elseif key=="tab"then - pen=-1 - elseif key=="backspace"or key=="lalt"then - pen=0 elseif key=="escape"then scene.back() else - pen=string.find("123qwea#sdzxc",key)or pen + pen=penKey[key]or pen end end @@ -857,6 +862,7 @@ function love.lowmemory() collectgarbage() end function love.resize(w,h) + love.timer.sleep(.26) scr.w,scr.h,scr.r=w,h,h/w if scr.r>=.5625 then scr.k=w/1280 @@ -1035,6 +1041,7 @@ function love.draw() gc.setColor(1,1,1) gc.print(FPS(),5,700) if devMode>0 then + love.timer.sleep(.2) gc.setColor(1,devMode==2 and .5 or 1,1) gc.print("Tasks:"..#Task,5,600) gc.print("Voices:"..#voiceQueue,5,620) @@ -1077,7 +1084,7 @@ function love.run() T.sleep(.001) end lastFrame=Timer() - if Timer()-lastFreshPow>5 then + if Timer()-lastFreshPow>1 then updatePowerInfo() lastFreshPow=Timer() end @@ -1085,12 +1092,11 @@ function love.run() ::END:: end -local fs=love.filesystem -userData,userSetting=fs.newFile("userdata"),fs.newFile("usersetting") -if fs.getInfo("userdata")then +userData,userSetting=love.filesystem.newFile("userdata"),love.filesystem.newFile("usersetting") +if love.filesystem.getInfo("userdata")then loadData() end -if fs.getInfo("usersetting")then +if love.filesystem.getInfo("usersetting")then loadSetting() elseif system=="Android"or system=="iOS" then setting.swap=false diff --git a/paint.lua b/paint.lua index b371c6ae..da6d7ad1 100644 --- a/paint.lua +++ b/paint.lua @@ -228,15 +228,16 @@ function Pnt.BG.matrix() end function Pnt.load() + local L=loading gc.setLineWidth(4) gc.setColor(1,1,1,.5) - gc.rectangle("fill",300,330,loadprogress*680,60,5) + gc.rectangle("fill",300,330,L[2]/L[3]*680,60,5) gc.setColor(1,1,1) gc.rectangle("line",300,330,680,60,5) setFont(35) - mStr(text.load[loading],640,335) + mStr(text.load[L[1]],640,335) setFont(25) - mStr(loadTip,640,400) + mStr(L[4],640,400) end function Pnt.intro() gc.stencil(stencil_miniTitle,"replace",1) @@ -339,13 +340,13 @@ function Pnt.draw() gc.setLineWidth(3) gc.rectangle("line",-2,-2,304,604) gc.setLineWidth(2) + local cross=puzzleMark[-1] for y=1,20 do for x=1,10 do local B=preField[y][x] if B>0 then gc.draw(blockSkin[B],30*x-30,600-30*y) elseif B==-1 then - 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) + gc.draw(cross,30*x-30,600-30*y) end end end if sx and sy then @@ -360,12 +361,12 @@ function Pnt.draw() if pen>0 then gc.setLineWidth(13) gc.setColor(blockColor[pen]) - gc.rectangle("line",746,460,70,70) + gc.rectangle("line",745,460,70,70) elseif pen==-1 then gc.setLineWidth(5) gc.setColor(.9,.9,.9) - gc.line(960,620,1000,660) - gc.line(960,660,1000,620) + gc.line(755,470,805,520) + gc.line(755,520,805,470) end end function Pnt.play() @@ -376,12 +377,13 @@ function Pnt.play() for i=1,#FX_attack do local A=FX_attack[i] gc.push("transform") - 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 + local a=(A.t<10 and A.t*.05 or A.t>50 and 6-A.t*.1 or 1)*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) + local len=#L + for i=1,len,2 do + gc.setColor(A.r,A.g,A.b,.4*a*i/len) gc.translate(L[i],L[i+1]) gc.rotate(A.t*.1) gc.circle("fill",0,0,A.rad,A.corner) @@ -489,7 +491,7 @@ function Pnt.setting_key() 200,45 ) --Selection rect - + gc.setColor(1,.3,.3) mDraw(drawableText.keyboard,340,35) mDraw(drawableText.keyboard,940,35) diff --git a/player.lua b/player.lua index 91d63edb..4b7f9b61 100644 --- a/player.lua +++ b/player.lua @@ -306,7 +306,7 @@ function newDemoPlayer(id,x,y,size) wait=10,fall=20, next=6,hold=true,oncehold=true, sequence="bag7", - + block=true, visible="show", Fkey=NULL,puzzle=false,ospin=true, @@ -576,7 +576,7 @@ function player.update(P,dt) if x~=P.curX then P.moving=P.moving+P.gameEnv.arr-1 elseif not P.small then - P.fieldOff.vx=-setting.shakeFX*.8 + P.fieldOff.vx=-setting.shakeFX*.5 end end else @@ -596,7 +596,7 @@ function player.update(P,dt) if x~=P.curX then P.moving=P.moving-P.gameEnv.arr+1 elseif not P.small then - P.fieldOff.vx=setting.shakeFX*.8 + P.fieldOff.vx=setting.shakeFX*.5 end end else @@ -615,7 +615,7 @@ function player.update(P,dt) P.act.insDown(P) end if not P.small then - P.fieldOff.vy=setting.shakeFX*.5 + P.fieldOff.vy=setting.shakeFX*.3 end end else @@ -707,31 +707,20 @@ function player.update(P,dt) end for i=#P.shade,1,-1 do local S=P.shade[i] - S[1]=S[1]-1+setting.dropFX*.25 + S[1]=S[1]-1+setting.dropFX*.15 if S[1]<=0 then rem(P.shade,i) end end - + if setting.shakeFX>0 then local O=P.fieldOff - O.vx,O.vy=O.vx*.8-abs(O.x)^1.2*(O.x>0 and .08 or -.08),O.vy*.8-abs(O.y)^1.2*(O.y>0 and .08 or -.08) + O.vx,O.vy=O.vx*.8-abs(O.x)^1.2*(O.x>0 and .1 or -.1),O.vy*.8-abs(O.y)^1.2*(O.y>0 and .1 or -.1) O.x,O.y=O.x+O.vx,O.y+O.vy + if abs(O.x)<1 then O.x=0 end + if abs(O.y)<1 then O.y=0 end end--field shaking - - for i=#P.bonus,1,-1 do - local t=P.bonus[i] - t.c=t.c+t.spd - if t.stop then - if t.c>t.stop then - t.c=t.stop - end - end - if t.c>60 then - rem(P.bonus,i) - end - end - + updateText(P.bonus) for i=#P.atkBuffer,1,-1 do local A=P.atkBuffer[i] A.time=A.time+1 @@ -954,13 +943,7 @@ function player.draw_norm(P) mStr(int(count/60+1),0,0) gc.pop() end--Draw starting counter - for i=1,#P.bonus do - local t=P.bonus[i] - local p=t.c - gc.setColor(1,1,1,p<.2 and p*5 or p<.8 and 1 or 5-p*5) - setFont(t.font) - t:draw() - end--Bonus texts + drawTexts(P.bonus)--Bonus texts setFont(25) gc.setColor(1,1,1) mStr(format("%.2f",P.stat.time),-82,518)--Time @@ -972,7 +955,7 @@ function player.draw_norm(P) drawDial(405,575,P.keySpeed) --Speed dials gc.setColor(1,1,1) - modes[curMode.id].mesDisp(P)--Other messages + modes[curMode.id].mesDisp(P,P.fieldOff.x,P.fieldOff.y)--Other messages if modeEnv.royaleMode then if P.atkMode then gc.setColor(1,.8,0,P.swappingAtkMode*.02) @@ -1104,13 +1087,7 @@ function player.draw_demo(P) gc.setColor(1,1,1) gc.draw(PTC.dust[P.id]) gc.translate(-P.fieldOff.x,-P.fieldOff.y) - for i=1,#P.bonus do - local t=P.bonus[i] - local p=t.c - gc.setColor(1,1,1,p<.2 and p*5 or p<.8 and 1 or 5-p*5) - setFont(t.font) - t:draw() - end + drawTexts(P.bonus) gc.pop() end -------------------------------------------------- @@ -1155,10 +1132,10 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,mini,combo) g=.6+g*.4 b=.6+b*.4 else + corner=20 r=.8+r*.2 g=.8+g*.2 b=.8+b*.2 - corner=20 end else if combo>3 then @@ -1180,10 +1157,10 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,mini,combo) x=x1,y=y1,--current pos x1=x1,y1=y1,--start pos x2=x2,y2=y2,--end pos - rad=radius*(setting.atkFX+2)*.2, + rad=radius*(setting.atkFX+3)*.12, corner=corner, type=type==1 and"fill"or"line", - r=r,g=g,b=b,a=a*(setting.atkFX+1)*.25, + r=r,g=g,b=b,a=a*(setting.atkFX+5)*.1, t=0, drag={},--Afterimage coordinate list } @@ -1388,7 +1365,7 @@ function player.freshgho(P) if setting.dropFX>0 then P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) end - P.fieldOff.vy=setting.shakeFX*.8 + P.fieldOff.vy=setting.shakeFX*.5 end P.curY=P.y_img end @@ -1687,7 +1664,7 @@ function player.drop(P)--Place piece end ::L1:: end - + P:lock() local CHN=getFreeVoiceChannel() local cc,send,exblock=checkrow(P,P.curY,P.r),0,0--Currect clear&send&sendTime @@ -1739,7 +1716,7 @@ function player.drop(P)--Place piece if cc==4 then cscore=1000 if P.b2b>1000 then - P:showText(text.techrashB3B,0,-30,70,"fly") + P:showText(text.techrashB3B,0,-30,50,"fly") send=6 sendTime=100 exblock=exblock+1 @@ -1749,7 +1726,7 @@ function player.drop(P)--Place piece VOICE("b3b",CHN) end elseif P.b2b>=50 then - P:showText(text.techrashB2B,0,-30,70,"drive") + P:showText(text.techrashB2B,0,-30,50,"drive") sendTime=80 send=5 cscore=cscore*1.3 @@ -1796,7 +1773,7 @@ function player.drop(P)--Place piece sendTime=20+send*20 if mini then P:showText(text.mini,0,-80,35,"appear") - send=ceil(send*.5) + send=send*.5 sendTime=sendTime+60 cscore=cscore*.5 P.b2b=P.b2b+b2bPoint[cc]*.5 @@ -1870,7 +1847,6 @@ function player.drop(P)--Place piece --ATK statistics if exblock then exblock=int(exblock*(1+P.strength*.25))end send=send*(1+P.strength*.25) - if mini then send=send*.8 end send=int(send) --Badge Buff if send==0 then goto L end @@ -2078,7 +2054,7 @@ function player.act.hardDrop(P) P.curY=P.y_img P.spinLast=false if not P.small then - P.fieldOff.vy=setting.shakeFX + P.fieldOff.vy=setting.shakeFX*.6 end if P.human then SFX("drop",nil,getBlockDirection(P)) @@ -2132,7 +2108,7 @@ function player.act.insLeft(P,auto) if P.gameEnv.easyFresh or y0~=P.curY then P:freshLockDelay()end end if not P.small then - P.fieldOff.vx=-setting.shakeFX*.8 + P.fieldOff.vx=-setting.shakeFX*.5 end if auto then if P.ctrlCount==0 then P.ctrlCount=1 end @@ -2153,7 +2129,7 @@ function player.act.insRight(P,auto) if P.gameEnv.easyFresh or y0~=P.curY then P:freshLockDelay()end end if not P.small then - P.fieldOff.vx=setting.shakeFX*.8 + P.fieldOff.vx=setting.shakeFX*.5 end if auto then if P.ctrlCount==0 then P.ctrlCount=1 end @@ -2167,6 +2143,7 @@ function player.act.insDown(P) if setting.dropFX>0 then P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) end + P.fieldOff.vy=setting.shakeFX*.5 end P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false end diff --git a/scene.lua b/scene.lua index 1a5da8db..3ab07fe8 100644 --- a/scene.lua +++ b/scene.lua @@ -13,10 +13,12 @@ local scene={ 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)] + loading={ + 1,--Loading mode + 1,--Loading counter + #voiceName,--Loading bar lenth(current) + text.tips[math.random(#text.tips)],--tip + } end, intro=function() count=0 @@ -124,19 +126,19 @@ local swapDeck_data={ }--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) + none={1,0,nil,NULL}, + flash={8,1,nil,function()gc.clear(1,1,1)end}, + fade={30,15,"swipe",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={180,90,function(t) + slowFade={180,90,nil,function(t) local t=t>90 and 2-t/90 or t/90 gc.setColor(0,0,0,t) gc.rectangle("fill",0,0,1280,720) end}, - deck={50,8,function(t) + deck={50,8,nil,function(t) gc.setColor(1,1,1) if t>8 then local t=t<15 and 15 or t @@ -189,11 +191,12 @@ function scene.swapTo(tar,style) 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] + local swap=swap[style] + S.time=swap[1] + S.mid=swap[2] + if swap[3]then SFX(swap[3])end + S.draw=swap[4] widget_sel=nil - if style~="none"then SFX("swipe")end end end function scene.back() diff --git a/sound.lua b/sound.lua index 972b3d50..420884a7 100644 --- a/sound.lua +++ b/sound.lua @@ -27,7 +27,6 @@ function SFX(s,v,pos) end end S:setVolume((v or 1)*setting.sfx*.1) - print((v or 1)*setting.sfx*.1) S:play() end end diff --git a/text.lua b/text.lua index eb4a67be..f3ba4c86 100644 --- a/text.lua +++ b/text.lua @@ -1,6 +1,8 @@ local gc=love.graphics local rnd=math.random local mStr=mStr +local rem=table.remove + local textFX={} function textFX.appear(t) mStr(t.text,t.x,t.y-t.font*.7) @@ -56,22 +58,20 @@ function textFX.beat(t) end function getTEXT(text,x,y,font,style,spd,stop) return{ - c=0, --counter - - text=text, --string - x=x or 0, --x - y=y or 0, --y - font=font or 40, --font - spd=(spd or 1)/60, --timing speed - stop=stop, --timing stop - - draw=textFX[style]or error("unavailable type:"..style), --draw method + c=0, + text=text, + x=x or 0, + y=y or 0, + font=font or 40, + spd=(spd or 1)/60, + stop=stop, + draw=textFX[style]or error("unavailable type:"..style), } -end +end--another version of TEXT() function TEXT(text,x,y,font,style,spd,stop) texts[#texts+1]={ c=0, --timer - text=text or"NaN", --string + text=text, --string x=x or 0, --x y=y or 0, --y font=font or 40, --font @@ -79,4 +79,27 @@ function TEXT(text,x,y,font,style,spd,stop) stop=stop, --stop time(sustained text) draw=textFX[style]or error("unavailable type:"..style), --draw method } +end +function updateText(list) + for i=#list,1,-1 do + local t=list[i] + t.c=t.c+t.spd + if t.stop then + if t.c>t.stop then + t.c=t.stop + end + end + if t.c>60 then + rem(list,i) + end + end +end +function drawTexts(list) + for i=1,#list do + local t=list[i] + local p=t.c + gc.setColor(1,1,1,p<.2 and p*5 or p<.8 and 1 or 5-p*5) + setFont(t.font) + t:draw() + end end \ No newline at end of file diff --git a/texture.lua b/texture.lua index 5340f00a..61adef9d 100644 --- a/texture.lua +++ b/texture.lua @@ -1,12 +1,13 @@ local gc=love.graphics -local N,c=gc.newImage +local N=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) + local c=gc.newCanvas(x,y) gc.setCanvas(c) return c end +local c gc.setDefaultFilter("nearest","nearest") blockImg=N("/image/block.png") @@ -36,15 +37,38 @@ for i=1,7 do end end end +puzzleMark={} +gc.setLineWidth(3) +for i=1,13 do + puzzleMark[i]=C(30,30) + if i>7 then + gc.setColor(blockColor[i]) + gc.rectangle("line",7,7,16,16) + else + local c=blockColor[i] + gc.setColor(c[1],c[2],c[3],.6) + gc.rectangle("line",5,5,20,20) + gc.rectangle("line",10,10,10,10) + end +end +c=C(30,30) +gc.setColor(1,1,1) +gc.line(5,5,25,25) +gc.line(5,25,25,5) +puzzleMark[-1]=C(30,30) +gc.setColor(1,1,1,.9) +gc.draw(c) +c:release() + PTC={dust={}}--Particle systems -C(6,6) +c=C(6,6) gc.clear(1,1,1) PTC.dust0=gc.newParticleSystem(c,1000) +c:release() PTC.dust0:setParticleLifetime(.2,.3) PTC.dust0:setEmissionRate(0) PTC.dust0:setLinearAcceleration(-1500,-200,1500,200) PTC.dust0:setColors(1,1,1,.5,1,1,1,0) -c:release() --Dust particles gc.setDefaultFilter("linear","linear") @@ -55,7 +79,6 @@ dialNeedle=N("/image/mess/dialNeedle.png") badgeIcon=N("/image/mess/badge.png") spinCenter=N("/image/mess/spinCenter.png") batteryImage=N("/image/mess/power.png") -chargeImage=N("/image/mess/charge.png") background1=N("/image/BG/bg1.jpg") background2=N("/image/BG/bg2.png") @@ -76,7 +99,7 @@ drawableText={ nextWave=T(30,"Next"), combo=T(20,"Combo"), mxcmb=T(20,"Max Combo"), - pc=T(22,"Perfect Clear"), + pc=T(20,"Perfect Clear"), ko=T(25,"KO"), modeName=T(30),levelName=T(30), @@ -84,7 +107,7 @@ drawableText={ win=T(120),finish=T(120), lose=T(120),pause=T(120), - + custom=T(80), setting_game=T(80),setting_graphic=T(80),setting_sound=T(80), keyboard=T(25),joystick=T(25), diff --git a/timer.lua b/timer.lua index a66ddd8e..e8f10c91 100644 --- a/timer.lua +++ b/timer.lua @@ -6,46 +6,41 @@ local ins,rem=table.insert,table.remove local Tmr={} function Tmr.load() local t=Timer() + local L=loading ::R:: - if loading==1 then - 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/#voiceName - loadnum=loadnum+1 - else - loading=2 - loadnum=1 + if L[1]==1 then + local N=voiceName[L[2]] + for i=1,#voiceList[N]do + local V=voiceList[N][i] + voiceBank[V]={love.audio.newSource("VOICE/"..V..".ogg","static")} end - elseif loading==2 then - if loadnum<=#bgm then - local N=bgm[loadnum] - bgm[N]=love.audio.newSource("/BGM/"..N..".ogg","stream") - bgm[N]:setLooping(true) - bgm[N]:setVolume(0) - loadprogress=loadnum/#bgm - loadnum=loadnum+1 - else + L[2]=L[2]+1 + if L[2]>L[3]then + L[1],L[2],L[3]=2,1,#bgm + end + elseif L[1]==2 then + local N=bgm[L[2]] + bgm[N]=love.audio.newSource("/BGM/"..N..".ogg","stream") + bgm[N]:setLooping(true) + bgm[N]:setVolume(0) + L[2]=L[2]+1 + if L[2]>L[3]then for i=1,#bgm do bgm[i]=nil end - loading=3 - loadnum=1 + L[1],L[2],L[3]=3,1,#sfx end - elseif loading==3 then - if loadnum<=#sfx then - sfx[sfx[loadnum]]={love.audio.newSource("/SFX/"..sfx[loadnum]..".ogg","static")} - loadprogress=loadnum/#sfx - loadnum=loadnum+1 - else - for i=1,#sfx do sfx[i]=nil end - loading=4 - loadnum=1 + elseif L[1]==3 then + local S=sfx[L[2]] + sfx[S]={love.audio.newSource("/SFX/"..S..".ogg","static")} + L[2]=L[2]+1 + if L[2]>L[3]then + for i=1,L[2]do sfx[i]=nil end + L[1],L[2],L[3]=4,1,1 SFX("welcome",.2) end - elseif loading==4 then - loadnum=loadnum+1 - if loadnum==48 then + else + L[2]=L[2]+1 + L[3]=L[2] + if L[2]>50 then stat.run=stat.run+1 scene.swapTo("intro","none") end @@ -68,7 +63,7 @@ function Tmr.play(dt) local b=FX_attack[i] b.t=b.t+1 if b.t>50 then - b.rad=b.rad*1.08+.2 + b.rad=b.rad*1.05+.1 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 @@ -76,12 +71,12 @@ function Tmr.play(dt) end if b.t<60 then local L=FX_attack[i].drag - if #L==6*setting.atkFX then + if #L==4*setting.atkFX then rem(L,1)rem(L,1) end ins(L,b.x)ins(L,b.y) else - for i=1,#FX_attack do + for i=i,#FX_attack do FX_attack[i]=FX_attack[i+1] end end diff --git a/toolfunc.lua b/toolfunc.lua index 43275962..40052f05 100644 --- a/toolfunc.lua +++ b/toolfunc.lua @@ -326,7 +326,6 @@ function gameStart() end - local dataOpt={ "run","game","time", "extraPiece","extraRate", @@ -406,11 +405,19 @@ function loadSetting() v=toN(v)if not v or v<0 then v=0 end setting[t]=int(v) elseif t=="dropFX"or t=="shakeFX"or t=="atkFX"then - setting[t]=toN(v:match("[0123]"))or 0 + setting[t]=toN(v:match("[012345]"))or 0 elseif t=="lang"then setting[t]=toN(v:match("[123]"))or 1 elseif t=="skin"then setting[t]=toN(v:match("[12345678]"))or 1 + elseif t=="modesel"then + local t=toN(v) + if not(t or modes[modeID[t]])then + t=1 + end + modeSel=t + elseif t=="levelsel"then + levelSel=toN(v) elseif t=="keymap"then v=splitS(v,"/") for i=1,16 do @@ -433,6 +440,9 @@ function loadSetting() end end end + if not modes[modeID[modeSel]].level[levelSel]then + levelSel=1 + end end local saveOpt={ "das","arr", @@ -457,7 +467,7 @@ local saveOpt={ "sfx","bgm", "vib","voc", "stereo", - + "VKSwitch", "VKTrack", "VKDodge", @@ -482,6 +492,8 @@ function saveSetting() map[i]=concat(setting.keyMap[i],",") end local t={ + "modesel="..modeSel, + "levelsel="..levelSel, "keymap="..toS(concat(map,"/")), "VK="..toS(concat(vk,"/")), } diff --git a/updateLog.lua b/updateLog.lua index 38ff531d..d2dea799 100644 --- a/updateLog.lua +++ b/updateLog.lua @@ -27,6 +27,11 @@ Future outlook: infinite 1v1 square mode more FXs & 3d features & animations +0.8.1: + more FX level + better battery info displaying + 3 next in GMroll + bug fixed 0.8.0: remake text system more details