From ed0f8031d07fa7fc465904ee2f325a557b40596d Mon Sep 17 00:00:00 2001 From: MrZ_26 Date: Fri, 20 Mar 2020 23:07:50 +0800 Subject: [PATCH] 0.8.13 --- conf.lua | 2 +- document.txt | 6 +- file.lua | 4 +- font.ttf | Bin 972992 -> 973224 bytes language/chi.lua | 32 ++-- language/chi_full.lua | 34 ++-- language/eng.lua | 34 ++-- main.lua | 95 +++++----- modes/classic_fast.lua | 1 + modes/custom_puzzle.lua | 2 +- modes/dig_hard.lua | 2 +- modes/dig_ultimate.lua | 2 +- paint.lua | 143 ++++++++++----- parts/light.lua | 4 +- parts/list.lua | 1 + parts/shader.lua | 2 +- parts/skin.lua | 23 +-- parts/space.lua | 9 +- parts/task.lua | 24 --- player.lua | 225 ++++++++++++++---------- scene.lua | 23 ++- {parts/shader => shader}/glow.cs | 0 {parts/shader => shader}/lightRender.cs | 0 {parts/shader => shader}/shadowMap.cs | 0 texture.lua | 5 +- timer.lua | 44 ++++- toolfunc.lua | 42 ++--- updateLog.lua | 30 +++- widgetList.lua | 128 +++++++------- 29 files changed, 501 insertions(+), 416 deletions(-) rename {parts/shader => shader}/glow.cs (100%) rename {parts/shader => shader}/lightRender.cs (100%) rename {parts/shader => shader}/shadowMap.cs (100%) diff --git a/conf.lua b/conf.lua index a1eaeb2c..3dbeacb0 100644 --- a/conf.lua +++ b/conf.lua @@ -1,4 +1,4 @@ -gameVersion="Alpha V0.8.12" +gameVersion="Alpha V0.8.13" function love.conf(t) t.identity="Techmino"--SaveDir name t.version="11.1" diff --git a/document.txt b/document.txt index 77737b3d..b1aa6472 100644 --- a/document.txt +++ b/document.txt @@ -1,5 +1,5 @@ 游戏方法: - 控制系统提供的一个个四联方块(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话) + 系统会提供的一个个四联骨牌("方块",总共7种),玩家需要控制(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话) 活到最后或者完成目标即胜利. 旋转系统: @@ -16,8 +16,8 @@ spin判定: 特殊消除: spin1/2/3攻击2/4/6,若mini则减半 B2B:加1(techrash/spin1/spin2)或2(spin3)攻击 - B3B:在B2B效果之上再+1攻击和+1额外抵挡 - 连击:0,0,1,1,2,2,3,3,4,4,3…… + B3B:在B2B效果之上消四再加1,spin再加0.5*消行数攻击,二者都+1额外抵挡 + 连击:0,0,1,1,2,2,2,3,3,4,3,2…(后面都是2) 特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文) PC:将上述伤害之和开根号,再+6~10(本局内递增)+2额外抵挡(注:本局消行数>4时会将B2B点数拉满) 根据上述规则计算后,向下取整,攻击打出 diff --git a/file.lua b/file.lua index 98c2ca31..88302205 100644 --- a/file.lua +++ b/file.lua @@ -148,7 +148,9 @@ function loadSetting() local F=FILE.setting if F:open("r")then local s=F:read() - if s:sub(1,6)~="return"then s="return{"..s.."}"end + if s:sub(1,6)~="return"then + s="return{"..s:gsub("\n",",").."}" + end s=loadstring(s) F:close() if s then diff --git a/font.ttf b/font.ttf index 214e8fdd0c7cdb2f31a2cd5d95028e11d2217320..38da24d6544aeff011179dfcaa005a222a42c05b 100644 GIT binary patch delta 20419 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 delta 20178 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 then - for y=1,20 do for x=1,10 do preField[y][x]=0 end end - sceneTemp.sure=0 - else - sceneTemp.sure=50 - end - elseif key=="up"or key=="down"or key=="left"or key=="right"then + if key=="up"or key=="down"or key=="left"or key=="right"then if not sx then sx=1 end if not sy then sy=1 end if key=="up"and sy<20 then sy=sy+1 @@ -433,6 +417,13 @@ function keyDown.draw(key) if kb.isDown("space")then preField[sy][sx]=pen end + elseif key=="delete"then + if sceneTemp.sure>20 then + for y=1,20 do for x=1,10 do preField[y][x]=0 end end + sceneTemp.sure=0 + else + sceneTemp.sure=50 + end elseif key=="space"then if sx and sy then preField[sy][sx]=pen @@ -626,13 +617,12 @@ function touchDown.play(id,x,y) local t=onVirtualkey(x,y) if t then players[1]:pressKey(t) - virtualkeyDown[t]=true - virtualkeyPressTime[t]=10 + virtualkey[t].isDown=true + virtualkey[t].pressTime=10 if setting.VKTrack then local B=virtualkey[t] - --按钮软碰撞(做不来hhh随便做一个,效果还行!) - if setting.VKDodge then - for i=1,#virtualkey do + if setting.VKDodge then--按钮软碰撞(做不来hhh随便做一个,效果还行!) + for i=1,#virtualkey do local b=virtualkey[i] local d=B.r+b.r-((B.x-b.x)^2+(B.y-b.y)^2)^.5--碰撞深度(负数=间隔距离) if d>0 then @@ -644,8 +634,8 @@ function touchDown.play(id,x,y) local O=VK_org[t] local _FW,_CW=setting.VKTchW*.1,1-setting.VKCurW*.1 local _OW=1-_FW-_CW - B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW --按钮自动跟随:手指位置,当前位置,原始位置,权重取决于设置 + B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW end VIB(0) end @@ -677,7 +667,7 @@ function touchMove.play(id,x,y,dx,dy) end function keyDown.play(key) if key=="escape"then - (frame<180 and back or pauseGame)() + (frame<180 and scene.back or pauseGame)() return end local m=keyMap @@ -686,8 +676,8 @@ function keyDown.play(key) if key==m[2*p-1][k]or key==m[2*p][k]then players[p]:pressKey(k) if p==1 then - virtualkeyDown[k]=true - virtualkeyPressTime[k]=10 + virtualkey[k].isDown=true + virtualkey[k].pressTime=10 end return end @@ -700,6 +690,7 @@ function keyUp.play(key) for k=1,20 do if key==m[2*p-1][k]or key==m[2*p][k]then players[p]:releaseKey(k) + if p==1 then virtualkey[k].isDown=false end return end end @@ -713,8 +704,8 @@ function gamepadDown.play(key) if key==m[2*p+7][k]or key==m[2*p+8][k]then players[p]:pressKey(k) if p==1 then - virtualkeyDown[k]=true - virtualkeyPressTime[k]=10 + virtualkey[k].isDown=true + virtualkey[k].pressTime=10 end return end @@ -727,12 +718,12 @@ function gamepadUp.play(key) for k=1,20 do if key==m[2*p+7][k]or key==m[2*p+8][k]then players[p]:releaseKey(k) + if p==1 then virtualkey[k].isDown=false end return end end end end - function wheelMoved.history(x,y) wheelScroll(y) end @@ -851,8 +842,10 @@ function love.mousemoved(x,y,dx,dy,t) if mouseMove[scene.cur]then mouseMove[scene.cur](mx,my,dx,dy) end - if ms.isDown(1)and widget_sel then - widgetDrag(widget_sel,mx,my,dx,dy) + if ms.isDown(1) then + if widget_sel then + widgetDrag(widget_sel,mx,my,dx,dy) + end else widget_sel=nil for _,W in next,Widget[scene.cur]do @@ -900,18 +893,19 @@ function love.touchmoved(id,x,y,dx,dy) touchMove[scene.cur](id,x,y,dx/scr.k,dy/scr.k) end if widget_sel then - widgetDrag(widget_sel,x,y,dx,dy) + if touching then + widgetDrag(widget_sel,x,y,dx,dy) + end else - widget_sel=nil for _,W in next,Widget[scene.cur]do if not(W.hide and W.hide())and W:isAbove(x,y)then widget_sel=W return end end - end - if not widget_sel then - touching=nil + if not widget_sel then + touching=nil + end end end function love.touchreleased(id,x,y) @@ -937,6 +931,7 @@ function love.keypressed(i) if i=="f8"then devMode=0 elseif i=="f9"then devMode=1 elseif i=="f10"then devMode=2 + elseif i=="f11"then devMode=3 elseif devMode==2 then if i=="k"then for i=1,8 do @@ -1086,8 +1081,8 @@ local function love_update(dt) local S=scene.swap S.time=S.time-1 if S.time==S.mid then + scene.init(S.tar,scene.cur) scene.cur=S.tar - scene.init(S.tar) for _,W in next,Widget[S.tar]do W:reset() end--重置控件 @@ -1099,8 +1094,8 @@ local function love_update(dt) scene.swapping=false end end - local i=Tmr[scene.cur] - if i then i(dt)end + local _=Tmr[scene.cur] + if _ then _(dt)end for i=#Task,1,-1 do local T=Task[i] if T.code(T.P,T.data)then @@ -1144,9 +1139,10 @@ local function love_update(dt) end end end + --更新控件 for _,W in next,Widget[scene.cur]do W:update() - end--更新控件 + end end local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5} local FPS=love.timer.getFPS @@ -1167,7 +1163,7 @@ local function love_draw() if mouseShow then local r=Timer()*.5 local R=int(r)%7+1 - local _=blockColor[R] + local _=skin.libColor[setting.skin[R]] gc.setColor(_[1],_[2],_[3],min(1-abs(1-r%1*2),.3)) gc.draw(miniBlock[R],mx,my,Timer()%3.1416*4,20,20,scs[2*R]-.5,#blocks[R][0]-scs[2*R-1]+.5) gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5) @@ -1214,6 +1210,9 @@ local function love_draw() gc.print("Mouse:"..mx.." "..my,5,_-60) gc.print("Voices:"..#voiceQueue,5,_-80) gc.print("Tasks:"..#Task,5,_-100) + if devMode==3 then + love.timer.sleep(.5) + end end--DEV info end love.draw,love.update=NULL,NULL @@ -1325,10 +1324,4 @@ function love.errorhandler(msg) end end -------------------------------------------------------------Reset data relied on setting -for _=1,7 do - blockColor[_]=skin.libColor[setting.skin[_]] -end -for _=8,17 do - blockColor[_]=skin.libColor[_] -end changeLanguage(setting.lang) \ No newline at end of file diff --git a/modes/classic_fast.lua b/modes/classic_fast.lua index 34fa374c..1fd3e938 100644 --- a/modes/classic_fast.lua +++ b/modes/classic_fast.lua @@ -38,6 +38,7 @@ return{ next=1,hold=false, sequence="rnd", freshLimit=0, + face={0,0,2,2,2,0,0}, target=10,dropPiece=check_LVup, bg="rgb",bgm="rockblock", }, diff --git a/modes/custom_puzzle.lua b/modes/custom_puzzle.lua index 1331d368..44887d0d 100644 --- a/modes/custom_puzzle.lua +++ b/modes/custom_puzzle.lua @@ -7,7 +7,7 @@ local function puzzleCheck(P) local a,b=preField[y][x],L and L[x]or 0 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<12 then if a~=b then return end elseif a>7 then if b==0 then return end end end diff --git a/modes/dig_hard.lua b/modes/dig_hard.lua index d28b1e67..c099027d 100644 --- a/modes/dig_hard.lua +++ b/modes/dig_hard.lua @@ -52,6 +52,6 @@ return{ W>=80 and 3 or W>=50 and 2 or W>=20 and 1 or - L>=5 and 0 + P.stat.row>=5 and 0 end, } \ No newline at end of file diff --git a/modes/dig_ultimate.lua b/modes/dig_ultimate.lua index c87ed08b..e8fe6287 100644 --- a/modes/dig_ultimate.lua +++ b/modes/dig_ultimate.lua @@ -51,6 +51,6 @@ return{ W>=80 and 3 or W>=50 and 2 or W>=20 and 1 or - L>=5 and 0 + P.stat.row>=5 and 0 end, } \ No newline at end of file diff --git a/paint.lua b/paint.lua index 240e8dcb..79937a6e 100644 --- a/paint.lua +++ b/paint.lua @@ -1,9 +1,11 @@ local gc=love.graphics local setFont=setFont -local int,ceil,rnd,max,min,sin=math.floor,math.ceil,math.random,math.max,math.min,math.sin +local int,ceil,rnd,abs=math.floor,math.ceil,math.random,math.abs +local max,min,sin=math.max,math.min,math.sin local format=string.format local Timer=love.timer.getTime +local mStr=mStr local scr=scr local scs=require("parts/spinCenters") local modeRankColor={ @@ -57,21 +59,38 @@ local function VirtualkeyPreview() end end local function drawVirtualkey() + local V=virtualkey local a=setting.VKAlpha*.1 - for i=1,#virtualkey do - local B=virtualkey[i] - if B.ava then - local _=virtualkeyDown[i]and gc.setColor(.7,.7,.7,a)or gc.setColor(1,1,1,a)--Dark magic - gc.setLineWidth(B.r*.07) - local ΔY=virtualkeyPressTime[i] - gc.circle("line",B.x,B.y+ΔY,B.r)--Outline circle - if setting.VKIcon then - gc.draw(VKIcon[i],B.x,B.y+ΔY,nil,B.r*.025,nil,18,18) - end--Icon - if ΔY>0 then - gc.setColor(1,1,1,a*ΔY*.1) - gc.circle("line",B.x,B.y,B.r*(1.4-ΔY*.04)) - end--Ripple + if setting.VKIcon then + for i=1,#V do + if V[i].ava then + local B=V[i] + gc.setColor(1,1,1,a) + gc.setLineWidth(B.r*.07) + gc.circle("line",B.x,B.y,B.r)--Button outline + local _=V[i].pressTime + gc.draw(VKIcon[i],B.x,B.y,nil,B.r*.026+_*.08,nil,18,18)--icon + if _>0 then + gc.setColor(1,1,1,a*_*.08) + gc.circle("fill",B.x,B.y,B.r*.94)--Glow + gc.circle("line",B.x,B.y,B.r*(1.4-_*.04))--Ripple + end + end + end + else + for i=1,#V do + if V[i].ava then + local B=V[i] + gc.setColor(1,1,1,a) + gc.setLineWidth(B.r*.07) + gc.circle("line",B.x,B.y,B.r) + local _=V[i].pressTime + if _>0 then + gc.setColor(1,1,1,a*_*.08) + gc.circle("fill",B.x,B.y,B.r*.94) + gc.circle("line",B.x,B.y,B.r*(1.4-_*.04)) + end + end end end end @@ -134,17 +153,18 @@ function Pnt.BG.game5() else gc.clear(0,0,0) end end--Lightning +local miniBlockColor={} function Pnt.BG.game6() local t=1.2-Timer()%10%3%1.2 if t<.3 then gc.clear(t,t,t) else gc.clear(0,0,0) end local R=7-int(Timer()*.5)%7 - local _=blockColor[R] + local _=miniBlockColor[R] gc.setColor(_[1],_[2],_[3],.1) gc.draw(miniBlock[R],640,360,Timer()%3.1416*6,400,400,scs[R][0][2]-.5,#blocks[R][0]-scs[R][0][1]+.5) end--Fast lightning&spining tetromino -local matrixT={}for i=1,20 do matrixT[i]={}for j=1,20 do matrixT[i][j]=love.math.noise(i,j)+2 end end +local matrixT={}for i=1,50 do matrixT[i]={}for j=1,50 do matrixT[i][j]=love.math.noise(i,j)+2 end end function Pnt.BG.matrix() gc.scale(scr.k) gc.clear(.15,.15,.15) @@ -227,8 +247,8 @@ function Pnt.mode() if c then gc.setColor(c) else - c=.5+sin(Timer()*6+_)*.2 - S=S*(.8+c*.5) + c=.5+sin(Timer()*6.26-_)*.2 + S=S*(.9+c*.4) gc.setColor(c,c,c) end if M.shape==1 then--Rectangle @@ -353,7 +373,6 @@ function Pnt.custom() end end end -local blockSkin=blockSkin function Pnt.draw() local sx,sy=sceneTemp.x,sceneTemp.y gc.translate(200,60) @@ -382,17 +401,23 @@ function Pnt.draw() local pen=sceneTemp.pen if pen>0 then gc.setLineWidth(13) - gc.setColor(blockColor[pen]) - gc.rectangle("line",745,460,70,70) + gc.setColor(skin.libColor[pen]) + gc.rectangle("line",565,460,70,70) elseif pen==-1 then gc.setLineWidth(5) gc.setColor(.9,.9,.9) - gc.line(755,470,805,520) - gc.line(755,520,805,470) + gc.line(575,470,625,520) + gc.line(575,520,625,470) end if sceneTemp.sure>0 then gc.setColor(1,1,1,sceneTemp.sure*.02) - gc.draw(drawableText.question,660,11) + gc.draw(drawableText.question,1040,430) + end + setFont(40) + for i=1,7 do + local _=setting.skin[i] + gc.setColor(skin.libColor[_]) + mStr(text.block[i],500+65*_,65) end end function Pnt.play() @@ -463,20 +488,21 @@ function Pnt.play() end function Pnt.pause() Pnt.play() - local _=pauseTimer*.02 - if gameResult then _=_*.6 end - gc.setColor(.15,.15,.15,_) + local T=sceneTemp.timer*.02 + local t=T + if gameResult then t=t*.6 end + gc.setColor(.15,.15,.15,t) gc.push("transform") gc.origin() gc.rectangle("fill",0,0,scr.w,scr.h) gc.pop() setFont(25) - gc.setColor(1,1,1,pauseTimer*.02) + gc.setColor(1,1,1,T) if pauseCount>0 then - _=curMode.pauseLimit and pauseTime>30 - if _ then gc.setColor(1,.4,.4,pauseTimer*.02)end + t=curMode.pauseLimit and pauseTime>30 + if t then gc.setColor(1,.4,.4,T)end gc.print(text.pauseCount..":["..pauseCount.."] "..format("%.2f",pauseTime).."s",110,150) - if _ then gc.setColor(1,1,1,pauseTimer*.02)end + if t then gc.setColor(1,1,1,T)end end for i=1,7 do gc.print(text.pauseStat[i],95,30*i+310) @@ -487,21 +513,15 @@ function Pnt.pause() gc.print(sceneTemp[i],1050,30*i+100) end _=drawableText.modeName - gc.draw(_,120,230) + gc.draw(_,100,230) gc.draw(drawableText.levelName,135+_:getWidth(),230) setFont(35) - mDraw(gameResult and drawableText[gameResult]or drawableText.pause,640,50-10*(5-pauseTimer*.1)^1.5) + mDraw(gameResult and drawableText[gameResult]or drawableText.pause,640,50-10*(5-sceneTemp.timer*.1)^1.5) end function Pnt.setting_game() gc.setColor(1,1,1) mDraw(drawableText.setting_game,640,15) - setFont(33) - mStr("DAS:"..setting.das.."F",340,205) - mStr("ARR:"..setting.arr.."F",660,205) - setFont(22) - mStr(text.softdropdas..setting.sddas.."F",340,323) - mStr(text.softdroparr..setting.sdarr.."F",660,323) - gc.draw(blockSkin[7-int(Timer()*2)%7],720,570,Timer()%6.28319,2,nil,15,15) + gc.draw(blockSkin[int(Timer()*2)%11+1],720,540,Timer()%6.28319,2,nil,15,15) end function Pnt.setting_graphic() gc.setColor(1,1,1) @@ -522,6 +542,41 @@ function Pnt.setting_sound() gc.draw(miya.f4,129,98+3*sin(t*.7)) gc.translate(-x,-y) end +function Pnt.setting_control() + --Testing grid line + gc.setLineWidth(4) + gc.setColor(1,1,1,.4) + gc.line(550,540,950,540) + gc.line(550,580,950,580) + gc.line(550,620,950,620) + for x=590,910,40 do + gc.line(x,530,x,630) + end + gc.setColor(1,1,1) + gc.line(550,530,550,630) + gc.line(950,530,950,630) + + --Texts + gc.draw(drawableText.setting_control,80,50) + setFont(50) + gc.printf(text.preview,320,540,200,"right") + + --Floating number + setFont(30) + local _=setting + mStr(_.das,226+35*_.das,150) + mStr(_.arr,226+35*_.arr,240) + mStr(_.sddas,226+35*_.sddas,330) + mStr(_.sdarr,226+35*_.sdarr,420) + + --Testing O mino + _=blockSkin[setting.skin[6]] + local x=550+40*sceneTemp.pos + gc.draw(_,x,540,nil,40/30) + gc.draw(_,x,580,nil,40/30) + gc.draw(_,x+40,540,nil,40/30) + gc.draw(_,x+40,580,nil,40/30) +end function Pnt.setting_key() local s=sceneTemp local a=.3+sin(Timer()*15)*.1 @@ -582,15 +637,15 @@ function Pnt.setting_skin() local col=#B[1] for i=1,#B do for j=1,col do if B[i][j]then - gc.draw(blockSkin[N],x+30*j,y-30*i) + gc.draw(blockSkin[setting.skin[N]],x+30*j,y-30*i) end end end gc.circle("fill",-15+140*N,350,sin(Timer()*10)+5) end for i=1,5 do - gc.draw(blockSkin[8+i],1110,140+60*i,nil,2) + gc.draw(blockSkin[12+i],1110,140+60*i,nil,2) end - gc.draw(drawableText.blockLayout,80,50) + gc.draw(drawableText.setting_skin,80,50) end function Pnt.setting_touch() gc.setColor(1,1,1) diff --git a/parts/light.lua b/parts/light.lua index 700dddba..b005fb7e 100644 --- a/parts/light.lua +++ b/parts/light.lua @@ -3,8 +3,8 @@ --https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows local gc=love.graphics local C=gc.clear -local shadowMapShader=gc.newShader("parts/shader/shadowMap.cs")--Shader for caculating the 1D shadow map. -local lightRenderShader=gc.newShader("parts/shader/lightRender.cs")--Shader for rendering blurred lights and shadows. +local shadowMapShader=gc.newShader("shader/shadowMap.cs")--Shader for caculating the 1D shadow map. +local lightRenderShader=gc.newShader("shader/lightRender.cs")--Shader for rendering blurred lights and shadows. Lights={}--Lightsource objects local Lights=Lights --Private-- diff --git a/parts/list.lua b/parts/list.lua index 6959f586..cebcb939 100644 --- a/parts/list.lua +++ b/parts/list.lua @@ -32,6 +32,7 @@ color={ darkCyan={0,.6,.6}, darkGrey={.3,.3,.3}, + black={0,0,0}, orange={1,.6,0}, pink={1,0,.6}, grass={.6,1,0}, diff --git a/parts/shader.lua b/parts/shader.lua index de99f13b..32f0f156 100644 --- a/parts/shader.lua +++ b/parts/shader.lua @@ -1,2 +1,2 @@ gc=love.graphics -shader_glow=gc.newShader("parts/shader/glow.cs") \ No newline at end of file +shader_glow=gc.newShader("shader/glow.cs") \ No newline at end of file diff --git a/parts/skin.lua b/parts/skin.lua index b73f98d9..58c1c9e6 100644 --- a/parts/skin.lua +++ b/parts/skin.lua @@ -34,7 +34,7 @@ skin.libColor={ color.purple, color.magenta, color.pink, - color.darkGreen, + color.darkGrey, color.grey, color.lightGrey, color.darkPurple, @@ -70,14 +70,14 @@ function skin.load() gc.setLineWidth(3) for i=1,11 do puzzleMark[i]=C(30,30) - local _=blockColor[i] + local _=skin.libColor[i] gc.setColor(_[1],_[2],_[3],.6) gc.rectangle("line",5,5,20,20) gc.rectangle("line",10,10,10,10) end for i=12,17 do puzzleMark[i]=C(30,30) - gc.setColor(blockColor[i]) + gc.setColor(skin.libColor[i]) gc.rectangle("line",7,7,16,16) end local _=C(30,30) @@ -109,30 +109,17 @@ end function skin.prev(i)--prev skin for [i] local _=setting.skin _[i]=(_[i]-2)%11+1 - skin.adjust(i,_[i]) end function skin.next(i)--next skin for [i] local _=setting.skin _[i]=_[i]%11+1 - skin.adjust(i,_[i]) end function skin.rotate(i)--change direction of [i] setting.face[i]=(setting.face[i]+1)%4 SFX.play("rotate") end function skin.change(i)--change to skin_set[i] - for _=1,7 do - skin.adjust(_,setting.skin[_]) - end - for _=8,13 do - blockSkin[_]=skin.lib[i][_+4] - blockSkinMini[_]=skin.libMini[i][_+4] - end -end -function skin.adjust(i,id)--load color/image/image_mini of [i] from lib - local S=setting.skinSet - blockSkin[i]=skin.lib[S][id] - blockSkinMini[i]=skin.libMini[S][id] - blockColor[i]=skin.libColor[id] + blockSkin=skin.lib[i] + blockSkinMini=skin.libMini[i] end return skin \ No newline at end of file diff --git a/parts/space.lua b/parts/space.lua index 8f146378..ec852ebe 100644 --- a/parts/space.lua +++ b/parts/space.lua @@ -13,8 +13,9 @@ local function newPlanet() planet.y=H*.5+sin(a)*(R+r) planet.vx=-cos(a+rnd()-.5)*.0626 planet.vy=-sin(a+rnd()-.5)*.0626 - planet.R=.7+rnd()*.2 - planet.G=.7+rnd()*.1 + planet.R=.7+rnd()*.22 + planet.G=planet.R+rnd()*.16-.1 + planet.B=.7+rnd()*.2 end local space={}--LIB @@ -50,9 +51,9 @@ function space.draw() if not stars[1]then return end gc.translate(-50,-50) gc.setLineWidth(7) - gc.setColor(planet.R,planet.G,.6,.1626) + gc.setColor(planet.R,planet.G,planet.B,.1626) gc.circle("line",planet.x,planet.y,planet.r+1) - gc.setColor(planet.R,planet.G,.6,.26) + gc.setColor(planet.R,.6,planet.B,.26) gc.circle("fill",planet.x,planet.y,planet.r) gc.setColor(.9,.9,.9) for i=1,2600,5 do diff --git a/parts/task.lua b/parts/task.lua index f831518b..9a369c04 100644 --- a/parts/task.lua +++ b/parts/task.lua @@ -1,19 +1,6 @@ local min=math.min local mini=love.window.isMinimized local task={} -function task.pauseGame() - if not mini()then - pauseTimer=pauseTimer+1 - end - return pauseTimer==50 -end -function task.resumeGame() - pauseTimer=pauseTimer-1 - if pauseTimer==0 then - scene.swapTo("play","none") - return true - end -end function task.finish(P) if scene.cur~="play"then return true end P.endCounter=P.endCounter+1 @@ -81,15 +68,4 @@ function task.bgmFadeIn(_,id) src:setVolume(v) if v>=setting.bgm*.1 then return true end end -function task.settingSaved(_,T) - T[1]=T[1]-1 - if T[1]==0 then - if scene.cur=="main"then - TEXT(text.settingSaved,370,330,28,"appear") - else - TEXT(text.needRestart,1130,130,28,"appear") - end - return true - end -end return task \ No newline at end of file diff --git a/player.lua b/player.lua index 04b22f42..7e9699c0 100644 --- a/player.lua +++ b/player.lua @@ -5,7 +5,6 @@ local ins,rem=table.insert,table.remove local format=string.format local actName=actName--controllings' id local scr=scr--screen camera -local blockSkin,blockSkinMini=blockSkin,blockSkinMini--skinTable -------------------------------------------------- local gameEnv0={ noFly=false, @@ -22,10 +21,11 @@ local gameEnv0={ ospin=true, sequence="bag7", face=NULL, + skin=NULL, pushSpeed=3, block=true, - visible="show",--keepVisible=visile~="show" + visible="show", Fkey=NULL,puzzle=false, freshLimit=1e99,easyFresh=true, fine=false,fineKill=false, @@ -33,7 +33,7 @@ local gameEnv0={ mindas=0,minarr=0,minsdarr=0, bg="none",bgm="race" } -local renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else +local comboAtk={0,0,1,1,2,2,2,3,3,4,3}--2 else local b2bPoint={50,100,180} local b2bATK={3,5,8} local clearSCR={80,200,400} @@ -43,8 +43,8 @@ local spinSCR={--[blockName][row] {220,700,1600},--L {220,700,1600},--J {250,800,1500},--T - {300,1000,2200},--O - {300,1000,1800},--I + {260,900,1800},--O + {300,1200,1700},--I } --B2BMUL:1.2/2.0 --Techrash:1K;MUL:1.3/1.8 @@ -482,23 +482,21 @@ local function Pdraw_demo(P) end end end--Block end - local N=P.hd.color - local _=blockColor[N] - if _ then + local id=P.hd.id + if id>0 then + local _=P.color[id] gc.setColor(_[1],_[2],_[3],.3) - N=miniBlock[N] - gc.draw(N,15,30,nil,16,nil,0,N:getHeight()*.5) + _=miniBlock[P.hd.id] + gc.draw(_,15,30,nil,16,nil,0,_:getHeight()*.5) end - N=1 + local N=1 ::L:: if N<=P.gameEnv.next and P.next[N]then - local n=P.next[N].color - local _=blockColor[n] - if _ then - gc.setColor(_[1],_[2],_[3],.3) - _=miniBlock[n] - gc.draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5) - end + local id=P.next[N].id + local _=P.color[id] + gc.setColor(_[1],_[2],_[3],.3) + _=miniBlock[id] + gc.draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5) N=N+1 goto L end @@ -554,10 +552,11 @@ end local function Pupdate_alive(P,dt) if P.timing then P.stat.time=P.stat.time+dt end if P.keyRec then + local _=frame local v=0 - for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.keyTime[i])end P.keySpeed=P.keySpeed*.99+v*.1 + for i=2,10 do v=v+i*(i-1)*7.2/(_-P.keyTime[i])end P.keySpeed=P.keySpeed*.99+v*.1 v=0 - for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.dropTime[i])end P.dropSpeed=P.dropSpeed*.99+v*.1 + for i=2,10 do v=v+i*(i-1)*7.2/(_-P.dropTime[i])end P.dropSpeed=P.dropSpeed*.99+v*.1 --Update speeds if modeEnv.royaleMode then if P.keyPressing[9]then @@ -586,41 +585,67 @@ local function Pupdate_alive(P,dt) end--Fresh visible time if P.moving<0 then if P.keyPressing[1]then - if -P.moving<=P.gameEnv.das then - P.moving=P.moving-1 - elseif P.waiting==-1 then - local x=P.curX - if P.gameEnv.arr>0 then - P.act.moveLeft(P,true) - else - P.act.insLeft(P,true) + local flag=false + local moving=-P.moving-1--remove sign mark + if movingP.gameEnv.das+P.gameEnv.arr then + moving=P.gameEnv.das + flag=true end end + if flag then + local x=P.curX + if P.gameEnv.arr==0 then + P.act.insLeft(P,true) + else + P.act.moveLeft(P,true) + end + end + if P:ifoverlap(P.cur.bk,P.curX-1,P.curY) and not P.small then + P.fieldOff.vx=-setting.shakeFX*.5 + end + P.moving=-moving-1 else P.moving=0 end elseif P.moving>0 then if P.keyPressing[2]then - if P.moving<=P.gameEnv.das then - P.moving=P.moving+1 - elseif P.waiting==-1 then - local x=P.curX - if P.gameEnv.arr>0 then - P.act.moveRight(P,true) - else - P.act.insRight(P,true) + local flag=false + local moving=P.moving-1--remove sign mark + if movingP.gameEnv.das+P.gameEnv.arr then + moving=P.gameEnv.das + flag=true end end + if flag then + local x=P.curX + if P.gameEnv.arr==0 then + P.act.insRight(P,true) + else + P.act.moveRight(P,true) + end + end + if P:ifoverlap(P.cur.bk,P.curX+1,P.curY) and not P.small then + P.fieldOff.vx=setting.shakeFX*.5 + end + P.moving=moving+1 else P.moving=0 end @@ -654,9 +679,9 @@ local function Pupdate_alive(P,dt) end end if not P.control then goto stop end + if P.waiting==0 then P:freshNext()end if P.waiting>=0 then P.waiting=P.waiting-1 - if P.waiting==-1 then P:freshNext()end goto stop end if P.curY~=P.y_img then @@ -758,7 +783,7 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,mini,combo) end local radius,corner - local a,r,g,b=1,unpack(blockColor[color]) + local a,r,g,b=1,unpack(P.color[color]) if clear>10 then radius=10+3*send+100/(target+4) local t=clear%10 @@ -814,18 +839,6 @@ end -------------------------------------------------- -------------------------------------------------- -local function ifoverlap(P,bk,x,y) - local C=#bk[1] - if x<1 or x+C>11 or y<1 then return true end - if y>#P.field then return end - for i=1,#bk do - if P.field[y+i-1]then - for j=1,C do - if bk[i][j]and P.field[y+i-1][x+j-1]>0 then return true end - end - end - end -end local function solid(P,x,y) if x<1 or x>10 or y<1 then return true end if y>#P.field then return false end @@ -855,6 +868,18 @@ local OspinList={ {222,7,2,-2, 0, true},--I {222,7,2, 0, 0, true},--I }--key,type,dir,dx,dy,ifFix +function player.ifoverlap(P,bk,x,y) + local C=#bk[1] + if x<1 or x+C>11 or y<1 then return true end + if y>#P.field then return end + for i=1,#bk do + if P.field[y+i-1]then + for j=1,C do + if bk[i][j]and P.field[y+i-1][x+j-1]>0 then return true end + end + end + end +end function player.ckfull(P,i) for j=1,10 do if P.field[i][j]<=0 then return end end return true @@ -989,7 +1014,7 @@ end function player.freshgho(P) P.y_img=min(#P.field+1,P.curY) if P.gameEnv._20G or P.keyPressing[7]and P.gameEnv.sdarr==0 then - while not ifoverlap(P,P.cur.bk,P.curX,P.y_img-1)do + while not P:ifoverlap(P.cur.bk,P.curX,P.y_img-1)do P.y_img=P.y_img-1 P.spinLast=false end @@ -1003,7 +1028,7 @@ function player.freshgho(P) P.curY=P.y_img end else - while not ifoverlap(P,P.cur.bk,P.curX,P.y_img-1)do + while not P:ifoverlap(P.cur.bk,P.curX,P.y_img-1)do P.y_img=P.y_img-1 end end @@ -1039,7 +1064,7 @@ function player.spin(P,d,ifpre) end if P.gameEnv.ospin then local x,y=P.curX,P.curY - if y==P.y_img and(solid(P,x-1,y+1)or solid(P,x+2,y+1))and(solid(P,x-1,y)or solid(P,x+2,y))then + if y==P.y_img and((solid(P,x-1,y)or solid(P,x-1,y+1)))and(solid(P,x+2,y)or solid(P,x+2,y+1))then local D=P.spinSeq%100*10+d P.spinSeq=D if D>100 then @@ -1049,7 +1074,7 @@ function player.spin(P,d,ifpre) local id,dir=L[2],L[3] local bk=blocks[id][dir] local x,y=P.curX+L[4],P.curY+L[5] - if not ifoverlap(P,bk,x,y)and ifoverlap(P,bk,x,y+1)and(L[6]or ifoverlap(P,bk,x-1,y)and ifoverlap(P,bk,x+1,y))then + if not P:ifoverlap(bk,x,y)and P:ifoverlap(bk,x,y+1)and(L[6]or P:ifoverlap(bk,x-1,y)and P:ifoverlap(bk,x+1,y))then local C=P.cur C.id=id C.bk=bk @@ -1080,7 +1105,7 @@ function player.spin(P,d,ifpre) local iki=P.RS[P.cur.id][P.dir*10+idir] for i=1,P.freshTime<=1.2*P.gameEnv.freshLimit and #iki or 1 do local x,y=ix+iki[i][1],iy+iki[i][2] - if not ifoverlap(P,icb,x,y)then + if not P:ifoverlap(icb,x,y)then ix=x;iy=y;t=i goto spin end @@ -1098,7 +1123,7 @@ function player.spin(P,d,ifpre) if not ifpre then P:freshgho()end if P.gameEnv.easyFresh or y0>P.curY then P:freshLockDelay()end if P.human then - SFX.play(ifpre and"prerotate"or ifoverlap(P,P.cur.bk,P.curX,P.curY+1)and ifoverlap(P,P.cur.bk,P.curX-1,P.curY)and ifoverlap(P,P.cur.bk,P.curX+1,P.curY)and"rotatekick"or"rotate",nil,getBlockPosition(P)) + SFX.play(ifpre and"prerotate"or P:ifoverlap(P.cur.bk,P.curX,P.curY+1)and P:ifoverlap(P.cur.bk,P.curX-1,P.curY)and P:ifoverlap(P.cur.bk,P.curX+1,P.curY)and"rotatekick"or"rotate",nil,getBlockPosition(P)) end P.stat.rotate=P.stat.rotate+1 end @@ -1111,13 +1136,13 @@ function player.resetBlock(P) P.r,P.c=#P.cur.bk,#P.cur.bk[1] --row/column P.curX=initCenterX[id]-sc[2] P.curY=initCenterY[id]-sc[1]+ceil(P.fieldBeneath/30) - if abs(P.moving)>P.gameEnv.das and not ifoverlap(P,P.cur.bk,P.curX+(P.moving>0 and 1 or -1),P.curY)then + if abs(P.moving)>P.gameEnv.das and not P:ifoverlap(P.cur.bk,P.curX+(P.moving>0 and 1 or -1),P.curY)then P.curX=P.curX+(P.moving>0 and 1 or -1) end --IMS end function player.hold(P,ifpre) - if not P.holded and P.waiting==-1 and P.gameEnv.hold then + if not P.holded and (ifpre or P.waiting==-1) and P.gameEnv.hold then --Finesse check local H,B=P.hd,P.cur if H and H.id==B.id and H.name==B.name then @@ -1142,7 +1167,7 @@ function player.hold(P,ifpre) P:freshgho() P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,max(P.freshTime-5,0) - if ifoverlap(P,P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end + if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end if P.human then SFX.play(ifpre and"prehold"or"hold") @@ -1151,7 +1176,7 @@ function player.hold(P,ifpre) end end function player.getNext(P,n) - P.next[#P.next+1]={bk=blocks[n][P.gameEnv.face[n]],id=n,color=P.gameEnv.bone and 8 or n,name=n} + P.next[#P.next+1]={bk=blocks[n][P.gameEnv.face[n]],id=n,color=P.gameEnv.bone and 12 or P.gameEnv.skin[n],name=n} end --function player.newNext()--check/add new next to next queue,defined when create player function player.freshNext(P) @@ -1163,15 +1188,14 @@ function player.freshNext(P) P.cur=rem(P.next,1) P:newNext() if P.AI_mode=="CC"then BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])end - - P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,0 local _=P.keyPressing - if _[8]then + if P.gameEnv.hold and _[8]then P:hold(true) else P:resetBlock() end --IHS + P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,0 if _[5]then P:spin(2,true) else @@ -1186,7 +1210,7 @@ function player.freshNext(P) end end --IRS - if ifoverlap(P,P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end + if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end P:freshgho() if _[6]then P.act.hardDrop(P)_[6]=false end --IHdS @@ -1214,7 +1238,7 @@ function player.drop(P)--Place piece if c>2 then dospin=dospin+1 end end--三角 ::NTC:: - if P.cur.id~=6 and ifoverlap(P,P.cur.bk,P.curX-1,P.curY)and ifoverlap(P,P.cur.bk,P.curX+1,P.curY)and ifoverlap(P,P.cur.bk,P.curX,P.curY+1)then + if P.cur.id~=6 and P:ifoverlap(P.cur.bk,P.curX-1,P.curY)and P:ifoverlap(P.cur.bk,P.curX+1,P.curY)and P:ifoverlap(P.cur.bk,P.curX,P.curY+1)then dospin=dospin+2 end--卡块 end @@ -1357,7 +1381,7 @@ function player.drop(P)--Place piece cscore=spinSCR[P.cur.name][cc] if P.b2b>1000 then P:showText(text.b3b..text.spin[P.cur.name]..text.clear[cc],0,-30,35,"spin") - send=b2bATK[cc]+1 + send=b2bATK[cc]+.5*cc exblock=exblock+1 cscore=cscore*2 P.stat.b3b=P.stat.b3b+1 @@ -1410,7 +1434,7 @@ function player.drop(P)--Place piece end sendTime=sendTime+25*cmb if cmb>2 then - send=send+(renATK[cmb]or 3) + send=send+(comboAtk[cmb]or 2) P:showText(text.cmb[min(cmb,20)],0,25,15+min(cmb,25)*3,cmb<10 and"appear"or"flicker") cscore=cscore+min(20*cmb,300)*cc end @@ -1551,8 +1575,11 @@ end function player.pressKey(P,i) P.keyPressing[i]=true P.act[actName[i]](P) - if P.alive then - P.keyTime[11]=ins(P.keyTime,1,frame) + if P.control then + if P.keyRec then + ins(P.keyTime,1,frame) + P.keyTime[11]=nil + end P.stat.key=P.stat.key+1 end --ins(rec,{i,frame}) @@ -1560,7 +1587,6 @@ end function player.releaseKey(P,i) if P.keyPressing[i]then P.keyPressing[i]=false - if P.id==1 then virtualkeyDown[i]=false end -- if recording then ins(rec,{-i,frame})end end end @@ -1748,7 +1774,7 @@ function player.act.moveLeft(P,auto) P:changeAtkMode(1) end elseif P.control and P.waiting==-1 then - if not ifoverlap(P,P.cur.bk,P.curX-1,P.curY)then + if not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then P.curX=P.curX-1 local y0=P.curY P:freshgho() @@ -1774,7 +1800,7 @@ function player.act.moveRight(P,auto) P:changeAtkMode(2) end elseif P.control and P.waiting==-1 then - if not ifoverlap(P,P.cur.bk,P.curX+1,P.curY)then + if not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then P.curX=P.curX+1 local y0=P.curY P:freshgho() @@ -1872,10 +1898,10 @@ end function player.act.insLeft(P,auto) if P.gameEnv.nofly then return end local x0,y0=P.curX,P.curY - while not ifoverlap(P,P.cur.bk,P.curX-1,P.curY)do + while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do P.curX=P.curX-1 if not P.small and setting.dropFX>0 then - P:createShade(P.curX+1,P.curY+P.r-1,P.curX+1,P.curY) + P:createShade(P.curX+P.c,P.curY+P.r-1,P.curX+P.c,P.curY) end P:freshgho() end @@ -1894,10 +1920,10 @@ end function player.act.insRight(P,auto) if P.gameEnv.nofly then return end local x0,y0=P.curX,P.curY - while not ifoverlap(P,P.cur.bk,P.curX+1,P.curY)do + while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do P.curX=P.curX+1 if not P.small and setting.dropFX>0 then - P:createShade(P.curX+P.c-1,P.curY+P.r-1,P.curX+P.c-1,P.curY) + P:createShade(P.curX-1,P.curY+P.r-1,P.curX-1,P.curY) end P:freshgho() end @@ -2003,11 +2029,10 @@ function newDemoPlayer(id,x,y,size) pc=0,b2b=0,b3b=0, } P.modeData={point=0,event=0,counter=0} - P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0 - P.dropTime={}for i=1,10 do P.dropTime[i]=-1e5 end P.dropSpeed=0 + P.keyTime={}P.keySpeed=0 + P.dropTime={}P.dropSpeed=0 - P.atker={} - P.strength=0 + P.atker={}P.strength=0 P.field,P.visTime={},{} P.atkBuffer={sum=0} @@ -2026,16 +2051,21 @@ function newDemoPlayer(id,x,y,size) ospin=true, sequence="bag7", face={0,0,0,0,0,0,0}, + skin={1,5,2,8,10,3,7}, pushSpeed=3, block=true, - visible="show",--keepVisible=visile~="show" + visible="show", Fkey=nil,puzzle=false, freshLimit=1e99,easyFresh=true, fine=false,fineKill=false, target=1e99,dropPiece=NULL, mindas=0,minarr=0,minsdarr=0, } + P.color={} + for _=1,7 do + P.color[_]=skin.libColor[P.gameEnv.skin[_]] + end P.cur={bk={{}},id=0,color=0,name=0} P.sc,P.dir,P.r,P.c={0,0},0,0,0 P.curX,P.curY,P.y_img=0,0,0 @@ -2054,9 +2084,9 @@ function newDemoPlayer(id,x,y,size) P:getNext(rem(bag1,rnd(#bag1))) end P.newNext=freshMethod.bag7 - if P.gameEnv.sequence==1 then P.bag={}--Bag7 - elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end--History4 - elseif P.gameEnv.sequence==3 then--Pure random + if P.gameEnv.sequence==1 then P.bag={} + elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end + elseif P.gameEnv.sequence==3 then end P.human=false @@ -2093,7 +2123,7 @@ function newDemoPlayer(id,x,y,size) P.fieldBeneath=0 P.score1,P.b2b1=0,0 P.shade={} - P.bonus={}--texts + P.bonus={} P.dust=clearDust:clone() P.dust:start() @@ -2236,14 +2266,23 @@ function newPlayer(id,x,y,size,AIdata) P.RS=kickList.TRS P.AI_keys={} end + P.gameEnv.face={0,0,0,0,0,0,0} + P.gameEnv.skin={1,5,2,8,10,3,7} else P.human=true P.RS=kickList.TRS players.human=players.human+1 end + P.color={} + for _=1,7 do + P.color[_]=skin.libColor[P.gameEnv.skin[_]] + end + P.showTime=visible_opt[P.gameEnv.visible] P.keepVisible=P.gameEnv.visible=="show" + + P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end P.moving,P.downing=0,0 P.waiting,P.falling=-1,-1 diff --git a/scene.lua b/scene.lua index 1f082c69..6b36a6b9 100644 --- a/scene.lua +++ b/scene.lua @@ -46,12 +46,12 @@ local sceneInit={ sceneTemp=1 end end, - mode=function() + mode=function(org) curBG="none" BGM.play("blank") destroyPlayers() local cam=mapCam - cam.zoomK=scene.swap.tar=="mode"and 5 or 1 + cam.zoomK=org=="main"and 5 or 1 if cam.sel then local M=modes[cam.sel] cam.x,cam.y=M.x*cam.k+180,M.y*cam.k @@ -82,9 +82,10 @@ local sceneInit={ end curBG=modeEnv.bg end, - pause=function() + pause=function(org) local S=players[1].stat sceneTemp={ + timer=org=="play"and 0 or 50, toTime(S.time), S.key.."/"..S.rotate.."/"..S.hold, S.piece.." "..(int(S.piece/S.time*100)*.01).."PPS", @@ -98,7 +99,7 @@ local sceneInit={ S.pc, format("%.3f",S.atk/S.row), S.extraPiece, - format("%.2f",100*max(1-S.extraRate/S.piece,0)), + format("%.2f%%",100*max(1-S.extraRate/S.piece,0)), } end, setting_game=function() @@ -111,6 +112,16 @@ local sceneInit={ sceneTemp={last=0,jump=0}--last sound time,animation count(10→0) curBG="none" end, + setting_control=function() + sceneTemp={ + das=setting.das, + arr=setting.arr, + pos=0, + dir=1, + wait=30, + } + curBG="strap" + end, setting_key=function() sceneTemp={ board=1, @@ -195,8 +206,8 @@ local backFunc={ setting_graphic=function()saveSetting()end, setting_sound= function()saveSetting()end, } -function scene.init(s) - if sceneInit[s]then sceneInit[s]()end +function scene.init(s,org) + if sceneInit[s]then sceneInit[s](org)end end function scene.push(tar,style) if not scene.swapping then diff --git a/parts/shader/glow.cs b/shader/glow.cs similarity index 100% rename from parts/shader/glow.cs rename to shader/glow.cs diff --git a/parts/shader/lightRender.cs b/shader/lightRender.cs similarity index 100% rename from parts/shader/lightRender.cs rename to shader/lightRender.cs diff --git a/parts/shader/shadowMap.cs b/shader/shadowMap.cs similarity index 100% rename from parts/shader/shadowMap.cs rename to shader/shadowMap.cs diff --git a/texture.lua b/texture.lua index 03c0affe..d7124162 100644 --- a/texture.lua +++ b/texture.lua @@ -10,6 +10,7 @@ end local c gc.setDefaultFilter("nearest","nearest") +gc.setColor(1,1,1) local VKI=N("/image/virtualkey.png") VKIcon={} for i=1,#actName do @@ -18,7 +19,6 @@ for i=1,#actName do end miniBlock={} -gc.setColor(1,1,1) for i=1,7 do local b=blocks[i][0] miniBlock[i]=C(#b[1],#b) @@ -74,9 +74,10 @@ drawableText={ custom=T(80), setting_game=T(80),setting_graphic=T(80),setting_sound=T(80), + setting_control=T(70),setting_skin=T(70), + preview=T(40), keyboard=T(25),joystick=T(25), ctrlSetHelp=T(30), - blockLayout=T(70), musicRoom=T(80), nowPlaying=T(50), VKTchW=T(30),VKOrgW=T(30),VKCurW=T(30), diff --git a/timer.lua b/timer.lua index 9bb0768a..6a764610 100644 --- a/timer.lua +++ b/timer.lua @@ -220,8 +220,9 @@ function Tmr.play(dt) end end for i=1,#virtualkey do - if virtualkeyPressTime[i]>0 then - virtualkeyPressTime[i]=virtualkeyPressTime[i]-1 + local _=virtualkey[i] + if _.pressTime>0 then + _.pressTime=_.pressTime-1 end end @@ -235,10 +236,14 @@ function Tmr.play(dt) local P=players[p] if P.keyPressing[1]then if P.moving>0 then P.moving=0 end - P.moving=P.moving-1 + if -P.moving<=P.gameEnv.das then + P.moving=P.moving-1 + end elseif P.keyPressing[2]then if P.moving<0 then P.moving=0 end - P.moving=P.moving+1 + if P.moving<=P.gameEnv.das then + P.moving=P.moving+1 + end else P.moving=0 end @@ -266,6 +271,9 @@ function Tmr.pause(dt) if not gameResult then pauseTime=pauseTime+dt end + if sceneTemp.timer<50 then + sceneTemp.timer=sceneTemp.timer+1 + end end function Tmr.setting_sound() local t=sceneTemp.jump @@ -273,4 +281,32 @@ function Tmr.setting_sound() sceneTemp.jump=t-1 end end +function Tmr.setting_control() + local T=sceneTemp + if T.wait>0 then + T.wait=T.wait-1 + if T.wait==0 then + T.pos=T.pos+T.dir + else + return + end + end + if T.das>0 then + T.das=T.das-1 + else + T.arr=T.arr-1 + if T.arr==0 then + T.pos=T.pos+T.dir + T.arr=setting.arr + elseif T.arr==-1 then + T.pos=T.dir>0 and 8 or 0 + T.arr=setting.arr + end + if T.pos%8==0 then + T.dir=-T.dir + T.wait=20 + T.das=setting.das + end + end +end return Tmr \ No newline at end of file diff --git a/toolfunc.lua b/toolfunc.lua index 3fe6d607..c9dd72be 100644 --- a/toolfunc.lua +++ b/toolfunc.lua @@ -55,9 +55,10 @@ local drawableTextLoad={ "setting_graphic", "setting_sound", "setting_sound", + "setting_control", + "setting_skin", "keyboard","joystick", "ctrlSetHelp", - "blockLayout", "musicRoom", "nowPlaying", "VKTchW","VKOrgW","VKCurW", @@ -97,6 +98,8 @@ function restoreVirtualKey() B.x=O.x B.y=O.y B.r=O.r + B.isDown=false + B.pressTime=0 end if not modeEnv.Fkey then virtualkey[9].ava=false @@ -117,12 +120,9 @@ function copyBoard() for y=1,H do local S="" local L=preField[y] - for x=1,10,2 do - local H=L[x] - local L=L[x+1] - if H<8 then H=H+1 end - if L<8 then L=L+1 end - S=S..char(H*16+L) + for x=1,10 do + local _=L[x]+1 + S=S..char(_) end str=str..S end @@ -132,7 +132,7 @@ end function pasteBoard() local str=love.system.getClipboardText() local fX,fY=1,1--*ptr for Field(r*10+(c-1)) - local _,__ + local _,Bid local p=find(str,":")--ptr* if p then str=sub(str,p+1)end _,str=pcall(data.decode,"string","base64",str) @@ -147,13 +147,12 @@ function pasteBoard() else goto FINISH end end--str end - __=_%16--low4b - _=(_-__)/16--high4b - if _>13 or __>13 then goto ERROR end--illegal blockid - if _<9 then _=_-1 end if __<9 then __=__-1 end - preField[fY][fX]=_;preField[fY][fX+1]=__ - if fX<9 then - fX=fX+2 + __=_%32-1--block id + if __>16 then goto ERROR end--illegal blockid + _=int(_/32)--mode id + preField[fY][fX]=__ + if fX<10 then + fX=fX+1 else if fY==20 then goto FINISH end fX=1;fY=fY+1 @@ -255,9 +254,8 @@ function royaleLevelup() end end function pauseGame() - if pauseTimer==0 then + if not scene.swapping then restartCount=0--Avoid strange darkness - newTask(Event_task.pauseGame) if not gameResult then pauseCount=pauseCount+1 end @@ -273,9 +271,7 @@ function pauseGame() end end function resumeGame() - if pauseTimer==50 then - newTask(Event_task.resumeGame) - end + scene.swapTo("play","none") end function loadGame(M) --rec={} @@ -291,7 +287,6 @@ function loadGame(M) end function resetPartGameData() gameResult=false - pauseTimer=0 frame=150-setting.reTime*15 destroyPlayers() curMode.load() @@ -326,7 +321,6 @@ function resetPartGameData() end function resetGameData() gameResult=false - pauseTimer=0--Pause timer for animation frame=150-setting.reTime*15 garbageSpeed=1 pauseTime=0--Time paused @@ -356,10 +350,6 @@ function resetGameData() restoreVirtualKey() stat.game=stat.game+1 freeRow.reset(30*#players) - for i=1,20 do - virtualkeyDown[i]=X - virtualkeyPressTime[i]=0 - end SFX.play("ready") collectgarbage() end diff --git a/updateLog.lua b/updateLog.lua index 8a373448..5f1831b5 100644 --- a/updateLog.lua +++ b/updateLog.lua @@ -1,23 +1,28 @@ local S=[=[ "Patron"(rmb10+)(ordered by first char): 10元 + 八零哥 Fireboos gggf127 + 金巧 乐↗乐↘ 立斐 仁参 - Sasoric" + Sasoric sfqr 时雪 - T080 - ThTsOd" + ThTsOd 夏小亚 - xin心痕 + 心痕 蕴空之灵 yyangdid ?[D*a] + + Thanks! + Future outlook: New mode: + finesse round-based dig Infinite battle Bigbang @@ -31,16 +36,29 @@ Future outlook: game recording (powerinfo switch) new virtualWidgets like joysticks - splashing block custom sequence + splashing block more FXs & 3d features & animations Encrypt source code(compile to byte code) new AI:task-Z CC smarter(think of garbage buffer) +0.8.13: + new: + a independent page to set DAS/ARR,with an animation for preview + changed: + new virtualkey animation + freer drawing mode(Incompatible with old ver.) + score of spins little changed + combo&b3b attack changed + fixed: + wrong behavior in pause scene + ospin error in 0.8.12 + memory leakage in t49/t99 + new behavior of widgets 0.8.12: new: layout setting:skin system with customizable block color/direction - more information in pause page + more information when pause block has more color(7→11) skin:smooth(MrZ),contrast(MrZ),steel(kulumi),ball(shaw) changed: diff --git a/widgetList.lua b/widgetList.lua index 40a3648e..789c53fe 100644 --- a/widgetList.lua +++ b/widgetList.lua @@ -190,21 +190,28 @@ local Widget={ back= newButton(640, 630,180,60, C.white, 35,scene.back), }, draw={ - block1= newButton(920, 80, 120,120,C.red, 60,setPen(1)), - block2= newButton(1060, 80, 120,120,C.green, 60,setPen(2)), - block3= newButton(1200, 80, 120,120,C.orange, 60,setPen(3)), - block4= newButton(920, 220,120,120,C.blue, 60,setPen(4)), - block5= newButton(1060, 220,120,120,C.magenta, 60,setPen(5)), - block6= newButton(1200, 220,120,120,C.yellow, 60,setPen(6)), - block7= newButton(920, 360,120,120,C.cyan, 60,setPen(7)), - gb1= newButton(1060, 360,120,120,C.darkGrey, 60,setPen(9)), - gb2= newButton(1200, 360,120,120,C.grey, 60,setPen(10)), - gb3= newButton(920, 500,120,120,C.darkPurple, 60,setPen(11)), - gb4= newButton(1060, 500,120,120,C.darkRed, 60,setPen(12)), - gb5= newButton(1200, 500,120,120,C.darkGreen, 60,setPen(13)), - clear= newButton(780, 80, 120,120,C.white, 40,pressKey("delete")), - any= newButton(780, 220,120,120,C.lightGrey, 40,setPen(0)), - space= newButton(780, 360,120,120,C.grey, 65,setPen(-1)), + b1= newButton(500+65*1, 150,58,58,C.red, 30,setPen(1)),--B1 + b2= newButton(500+65*2, 150,58,58,C.orange, 30,setPen(2)),--B2 + b3= newButton(500+65*3, 150,58,58,C.yellow, 30,setPen(3)),--B3 + b4= newButton(500+65*4, 150,58,58,C.grass, 30,setPen(4)),--B4 + b5= newButton(500+65*5, 150,58,58,C.green, 30,setPen(5)),--B5 + b6= newButton(500+65*6, 150,58,58,C.water, 30,setPen(6)),--B6 + b7= newButton(500+65*7, 150,58,58,C.cyan, 30,setPen(7)),--B7 + b8= newButton(500+65*8, 150,58,58,C.blue, 30,setPen(8)),--B8 + b9= newButton(500+65*9, 150,58,58,C.purple, 30,setPen(9)),--B9 + b10= newButton(500+65*10,150,58,58,C.magenta, 30,setPen(10)),--B10 + b11= newButton(500+65*11,150,58,58,C.pink, 30,setPen(11)),--B11 + + b12= newButton(500+65*1, 230,58,58,C.darkGrey, 30,setPen(12)),--Bone + b13= newButton(500+65*2, 230,58,58,C.grey, 30,setPen(13)),--GB1 + b14= newButton(500+65*3, 230,58,58,C.lightGrey, 30,setPen(14)),--GB2 + b15= newButton(500+65*4, 230,58,58,C.darkPurple, 30,setPen(15)),--GB3 + b16= newButton(500+65*5, 230,58,58,C.darkRed, 30,setPen(16)),--GB4 + b17= newButton(500+65*6, 230,58,58,C.darkGreen, 30,setPen(17)),--GB5 + + any= newButton(600, 360,120,120,C.lightGrey, 40,setPen(0)), + space= newButton(730, 360,120,120,C.grey, 65,setPen(-1)), + clear= newButton(1200, 500,120,120,C.white, 40,pressKey("delete")), demo= newSwitch(755, 640,30,function()return sceneTemp.demo end,function()sceneTemp.demo=not sceneTemp.demo end), copy= newButton(920, 640,120,120,C.lightRed, 35,copyBoard), paste= newButton(1060, 640,120,120,C.lightBlue, 35,pasteBoard), @@ -216,60 +223,44 @@ local Widget={ pause={ resume= newButton(640,290,240,100,C.white,30,resumeGame), restart=newButton(640,445,240,100,C.white,33,function() - if pauseTimer==50 then - clearTask("play") - updateStat() - resetGameData() - scene.swapTo("play","none") - end + clearTask("play") + updateStat() + resetGameData() + scene.swapTo("play","none") + end), + setting=newButton(1130,70,180,90,C.lightBlue,35,function() + scene.push()scene.swapTo("setting_sound") end), - setting=newButton(1130,70,180,90,C.lightBlue,35,function()scene.push()scene.swapTo("setting_sound")end), quit= newButton(640,600,240,100,C.white,35,scene.back), }, setting_game={ - graphic=newButton(200,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_graphic")end,nil,"sound"), - sound= newButton(1080,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_sound")end, nil,"reset"), - reset= newButton(100,285,150,80,C.lightRed,18,function() - setting.das,setting.arr=10,2 - setting.sddas,setting.sdarr=0,2 - local _=Widget.setting_game - _.dasU:FX()_.dasD:FX() - _.arrU:FX()_.arrD:FX() - _.sddasU:FX()_.sddasD:FX() - _.sdarrU:FX()_.sdarrD:FX() - end,nil,"dasD"), - dasD= newButton(230,230,50,50,C.white,40,function()setting.das=setting.das-1 ARRcheck()end,function()return setting.das==0 end, "dasU"), - dasU= newButton(450,230,50,50,C.white,40,function()setting.das=setting.das+1 ARRcheck()end,function()return setting.das==30 end, "arrD"), - arrD= newButton(550,230,50,50,C.white,40,function()setting.arr=setting.arr-1 DAScheck()end,function()return setting.arr==0 end, "arrU"), - arrU= newButton(770,230,50,50,C.white,40,function()setting.arr=setting.arr+1 DAScheck()end,function()return setting.arr==15 end, "sddasD"), - sddasD= newButton(230,340,50,50,C.white,40, function()setting.sddas=(setting.sddas-1)%11 end, nil,"sddasU"), - sddasU= newButton(450,340,50,50,C.white,40, function()setting.sddas=(setting.sddas+1)%11 end, nil,"sdarrD"), - sdarrD= newButton(550,340,50,50,C.white,40, function()setting.sdarr=(setting.sdarr-1)%4 end, nil,"sdarrU"), - sdarrU= newButton(770,340,50,50,C.white,40, function()setting.sdarr=(setting.sdarr+1)%4 end, nil,"reTime"), - reTime= newSlider(350,430,300,10,30,nil, SETval("reTime"), SETsto("reTime"), nil,"maxNext"), - maxNext=newSlider(350,500,300,6,30,nil, SETval("maxNext"), SETsto("maxNext"), nil,"autoPause"), - autoPause=newSwitch(350,570,20, SETval("autoPause"), SETrev("autoPause"), nil,"layout"), - layout= newButton(590,570,140,70,C.white,35,function() + graphic=newButton(200,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_graphic")end, nil,"sound"), + sound= newButton(1080,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_sound")end, nil,"ctrl"), + ctrl= newButton(290,220,320,80,C.lightYellow,35,function()scene.push()scene.swapTo("setting_control")end, nil,"key"), + key= newButton(640,220,320,80,C.lightGreen,35,function()scene.push()scene.swapTo("setting_key")end, nil,"touch"), + touch= newButton(990,220,320,80,C.lightBlue,35,function()scene.push()scene.swapTo("setting_touch")end, nil,"reTime"), + reTime= newSlider(350,340,300,10,30,nil, SETval("reTime"), SETsto("reTime"), nil,"maxNext"), + maxNext=newSlider(350,440,300,6,30,nil, SETval("maxNext"), SETsto("maxNext"), nil,"autoPause"), + autoPause=newSwitch(350,540,20, SETval("autoPause"), SETrev("autoPause"), nil,"layout"), + layout= newButton(590,540,140,70,C.white,35,function() scene.push() scene.swapTo("setting_skin") - end,nil,"ctrl"), - ctrl= newButton(1020,230,320,80,C.white,35,function()scene.push()scene.swapTo("setting_key")end, nil,"touch"), - touch= newButton(1020,340,320,80,C.white,35,function()scene.push()scene.swapTo("setting_touch")end,nil,"quickR"), - quickR= newSwitch(1000,430,35, SETval("quickR"), SETrev("quickR"), nil,"swap"), - swap= newSwitch(1000,500,19, SETval("swap"), SETrev("swap"), nil,"fine"), - fine= newSwitch(1000,570,20, SETval("fine"), SETrev("fine"), nil,"back"), + end,nil,"quickR"), + quickR= newSwitch(1050,340,35, SETval("quickR"), SETrev("quickR"), nil,"swap"), + swap= newSwitch(1050,440,19, SETval("swap"), SETrev("swap"), nil,"fine"), + fine= newSwitch(1050,540,20, SETval("fine"), SETrev("fine"), nil,"back"), back= newButton(1140,650,200,80,C.white,40,scene.back, nil,"graphic"), }, setting_graphic={ sound= newButton(200,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_sound")end, nil,"game"), game= newButton(1080,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_game")end, nil,"ghost"), - ghost= newSwitch(310,180,35,SETval("ghost"), SETrev("ghost"), nil,"center"), - center= newSwitch(580,180,35,SETval("center"), SETrev("center"), nil,"smo"), - smo= newSwitch(310,260,25,SETval("smo"), SETrev("smo"), nil,"grid"), - grid= newSwitch(580,260,30,SETval("grid"), SETrev("grid"), nil,"dropFX"), - dropFX= newSlider(310,350,373,5,35,nil,SETval("dropFX"), SETsto("dropFX"), nil,"shakeFX"), - shakeFX=newSlider(310,430,373,5,35,nil,SETval("shakeFX"), SETsto("shakeFX"), nil,"atkFX"), - atkFX= newSlider(310,510,373,5,35,nil,SETval("atkFX"), SETsto("atkFX"), nil,"frame"), + ghost= newSwitch(310,180,35, SETval("ghost"), SETrev("ghost"), nil,"center"), + center= newSwitch(580,180,35, SETval("center"), SETrev("center"), nil,"smo"), + smo= newSwitch(310,260,25, SETval("smo"), SETrev("smo"), nil,"grid"), + grid= newSwitch(580,260,30, SETval("grid"), SETrev("grid"), nil,"dropFX"), + dropFX= newSlider(310,350,373,5,35,nil, SETval("dropFX"), SETsto("dropFX"), nil,"shakeFX"), + shakeFX=newSlider(310,430,373,5,35,nil, SETval("shakeFX"), SETsto("shakeFX"), nil,"atkFX"), + atkFX= newSlider(310,510,373,5,35,nil, SETval("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,SETval("fullscreen"),function() setting.fullscreen=not setting.fullscreen @@ -288,17 +279,28 @@ local Widget={ end end,nil,"back"), back= newButton(1140,650,200,80,C.white,40,scene.back,nil,"sound"), - }, + }, setting_sound={ game= newButton(200,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_game")end, nil,"graphic"), graphic=newButton(1080,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_graphic")end, nil,"sfx"), - sfx= newSlider(180,250,400,10,35,function()SFX.play("blip_1")end, SETval("sfx"), SETsto("sfx"), nil,"bgm"), - bgm= newSlider(750,250,400,10,35,function()BGM.freshVolume()end, SETval("bgm"), SETsto("bgm"), nil,"vib"), - vib= newSlider(180,440,400,5 ,28,function()VIB(1)end, SETval("vib"), SETsto("vib"), nil,"voc"), - voc= newSlider(750,440,400,10,32,function()VOICE("nya")end, SETval("voc"), SETsto("voc"), nil,"stereo"), + sfx= newSlider(180,250,400,10,35,function()SFX.play("blip_1")end, SETval("sfx"), SETsto("sfx"), nil,"bgm"), + bgm= newSlider(750,250,400,10,35,function()BGM.freshVolume()end, SETval("bgm"), SETsto("bgm"), nil,"vib"), + vib= newSlider(180,440,400,5 ,28,function()VIB(1)end, SETval("vib"), SETsto("vib"), nil,"voc"), + voc= newSlider(750,440,400,10,32,function()VOICE("nya")end, SETval("voc"), SETsto("voc"), nil,"stereo"), stereo= newSlider(180,630,400,10,35,function()SFX.play("move",1,-1)SFX.play("lock",1,1)end, SETval("stereo"), SETsto("stereo"),function()return setting.sfx==0 end,"back"), back= newButton(1140,650,200,80,C.white,40,scene.back,nil,"game"), }, + setting_control={ + das= newSlider(226,200,910, 26, 30,nil,SETval("das"), SETsto("das"), nil,"arr"), + arr= newSlider(226,290,525, 15, 30,nil,SETval("arr"), SETsto("arr"), nil,"sddas"), + sddas= newSlider(226,380,350, 10, 30,nil,SETval("sddas"), SETsto("sddas"),nil,"sdarr"), + sdarr= newSlider(226,470,140, 4, 30,nil,SETval("sdarr"), SETsto("sdarr"),nil,"reset"), + reset= newButton(160,580,200, 100,C.lightRed,40,function() + setting.das,setting.arr=10,2 + setting.sddas,setting.sdarr=0,2 + end,nil,"back"), + back= newButton(1140,650,200,80,C.white,40,scene.back,nil,"das"), + }, setting_key={ back=newButton(1140,650,200,80,C.white,45,scene.back), },