From ea3fb8d09e330051292795316f1ed0d3647e9885 Mon Sep 17 00:00:00 2001 From: Imple Lee <80144331+ImpleLee@users.noreply.github.com> Date: Mon, 20 Nov 2023 23:36:38 +0800 Subject: [PATCH 1/3] split freshBlock into 4 methods --- parts/RSlist.lua | 6 +-- parts/eventsets/sprintMD.lua | 4 +- parts/eventsets/stack_e.lua | 2 +- parts/eventsets/stack_u.lua | 2 +- parts/player/player.lua | 101 ++++++++++++++++++----------------- 5 files changed, 60 insertions(+), 55 deletions(-) diff --git a/parts/RSlist.lua b/parts/RSlist.lua index 04ef63c6..c5fbdd18 100644 --- a/parts/RSlist.lua +++ b/parts/RSlist.lua @@ -170,7 +170,7 @@ do },-- T function(P,d) if P.gameEnv.easyFresh then - P:freshBlock('fresh') + P:freshBlockDelay() end if P.gameEnv.ospin then local x,y=P.curX,P.curY @@ -203,7 +203,7 @@ do C.dir=dir P.spinLast=2 P.stat.rotate=P.stat.rotate+1 - P:freshBlock('move') + P:freshMoveBlock() C.spinSeq=nil return end @@ -681,7 +681,7 @@ do local t=P.freshTime if not ifpre then - P:freshBlock('move') + P:freshMoveBlock() end if fdy>0 and P.freshTime==t and P.curY~=P.imgY then P.freshTime=P.freshTime-1 diff --git a/parts/eventsets/sprintMD.lua b/parts/eventsets/sprintMD.lua index 55793ceb..ddb66b52 100644 --- a/parts/eventsets/sprintMD.lua +++ b/parts/eventsets/sprintMD.lua @@ -15,13 +15,13 @@ return { if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY) then P:createMoveFX('left') P.curX=P.curX-1 - P:freshBlock('move') + P:freshMoveBlock() end elseif r==2 then if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY) then P:createMoveFX('left') P.curX=P.curX-1 - P:freshBlock('move') + P:freshMoveBlock() end elseif r==3 then P:act_rotRight() diff --git a/parts/eventsets/stack_e.lua b/parts/eventsets/stack_e.lua index 155a71db..3b43e5fd 100644 --- a/parts/eventsets/stack_e.lua +++ b/parts/eventsets/stack_e.lua @@ -26,7 +26,7 @@ return { P.garbageBeneath=P.garbageBeneath-bonus end end - P:freshBlock('push') + P:freshBlockGhost() end end, } \ No newline at end of file diff --git a/parts/eventsets/stack_u.lua b/parts/eventsets/stack_u.lua index c04a389f..869e6f5e 100644 --- a/parts/eventsets/stack_u.lua +++ b/parts/eventsets/stack_u.lua @@ -26,7 +26,7 @@ return { P.garbageBeneath=P.garbageBeneath-bonus end end - P:freshBlock('push') + P:freshBlockGhost() end end, } \ No newline at end of file diff --git a/parts/player/player.lua b/parts/player/player.lua index 606d203c..1b30e5e5 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -214,7 +214,7 @@ function Player:_deepDrop() self.ghoY=y self:createDropFX() self.curY=y - self:freshBlock('move') + self:freshMoveBlock() SFX.play('swipe') end end @@ -230,7 +230,7 @@ function Player:act_moveLeft(auto) self:_triggerEvent('hook_left_'..(auto and 'auto' or 'manual')) self:createMoveFX('left') self.curX=self.curX+self.movDir - self:freshBlock('move') + self:freshMoveBlock() if not auto then self.moving=0 end @@ -254,7 +254,7 @@ function Player:act_moveRight(auto) self:_triggerEvent('hook_right_'..(auto and 'auto' or 'manual')) self:createMoveFX('right') self.curX=self.curX+self.movDir - self:freshBlock('move') + self:freshMoveBlock() if not auto then self.moving=0 end @@ -367,7 +367,7 @@ function Player:act_insLeft(auto) while not self:ifoverlap(self.cur.bk,self.curX-1,self.curY) do self:createMoveFX('left') self.curX=self.curX-1 - self:freshBlock('move',true) + self:freshMoveBlock(true) end if self.curX~=x0 then self.spinLast=false @@ -391,7 +391,7 @@ function Player:act_insRight(auto) while not self:ifoverlap(self.cur.bk,self.curX+1,self.curY) do self:createMoveFX('right') self.curX=self.curX+1 - self:freshBlock('move',true) + self:freshMoveBlock(true) end if self.curX~=x0 then self.spinLast=false @@ -417,7 +417,7 @@ function Player:act_insDown() self.curY=self.ghoY self.lockDelay=ENV.lock self.spinLast=false - self:freshBlock('fresh') + self:freshBlockDelay() self:checkTouchSound() end end @@ -427,7 +427,7 @@ function Player:act_down1() if self.curY>self.ghoY then self:createMoveFX('down') self.curY=self.curY-1 - self:freshBlock('fresh') + self:freshBlockDelay() self.spinLast=false elseif self.gameEnv.deepDrop then self:_deepDrop() @@ -442,7 +442,7 @@ function Player:act_down4() self.ghoY=max(self.curY-4,self.ghoY) self:createDropFX() self.curY,self.ghoY=self.ghoY,ghoY0 - self:freshBlock('fresh') + self:freshBlockDelay() self.spinLast=false elseif self.gameEnv.deepDrop then self:_deepDrop() @@ -457,7 +457,7 @@ function Player:act_down10() self.ghoY=max(self.curY-0,self.ghoY) self:createDropFX() self.curY,self.ghoY=self.ghoY,ghoY0 - self:freshBlock('fresh') + self:freshBlockDelay() self.spinLast=false elseif self.gameEnv.deepDrop then self:_deepDrop() @@ -747,7 +747,7 @@ function Player:garbageRise(color,amount,line)-- Release n-lines garbage to fiel for i=1,#self.clearingRow do self.clearingRow[i]=self.clearingRow[i]+amount end - self:freshBlock('push') + self:freshBlockGhost() for i=1,#self.lockFX do _=self.lockFX[i] _[2]=_[2]-30*amount-- Shift 30px per line cleared @@ -789,7 +789,7 @@ function Player:pushLineList(L,mir)-- Push some lines to field self.curY=self.curY+l self.ghoY=self.ghoY+l end - self:freshBlock('push') + self:freshBlockGhost() end function Player:pushNextList(L,mir)-- Push some nexts to nextQueue for i=1,#L do @@ -947,10 +947,9 @@ function Player:changeAtk(R) self.atking=false end end -function Player:freshBlock(mode,ifTele)-- string mode: push/move/fresh/newBlock +function Player:freshBlockGhost() local ENV=self.gameEnv - -- Fresh ghost - if (mode=='move' or mode=='newBlock' or mode=='push') and self.cur then + if self.cur then local CB=self.cur.bk self.ghoY=min(#self.field+1,self.curY) if self._20G or ENV.sdarr==0 and self.keyPressing[7] and self.downing>=ENV.sddas then @@ -980,42 +979,48 @@ function Player:freshBlock(mode,ifTele)-- string mode: push/move/fresh/newBlock end end end - - -- Fresh delays - if mode=='move' or mode=='newBlock' or mode=='fresh' then - local d0,l0=ENV.drop,ENV.lock - local C=self.cur - local sc=C.RS.centerPos[C.id][C.dir] - if ENV.easyFresh then +end +function Player:freshBlockDelay(keepFreshTime) + local ENV=self.gameEnv + local d0,l0=ENV.drop,ENV.lock + local C=self.cur + local sc=C.RS.centerPos[C.id][C.dir] + if ENV.easyFresh then + if self.lockDelay0 then + if not keepFreshTime then + self.freshTime=self.freshTime-1 + end + self.lockDelay=l0 + self.dropDelay=d0 + end + if self.curY+sc[1]0 then - if mode~='newBlock' then - self.freshTime=self.freshTime-1 - end - self.lockDelay=l0 - self.dropDelay=d0 - end - if self.curY+sc[1]0 then - self.freshTime=self.freshTime-1 - self.dropDelay=d0 - self.lockDelay=l0 - end - end end end - +end +function Player:freshMoveBlock(ifTele) + self:freshBlockGhost() + self:freshBlockDelay() -- Play sound if touch ground - if mode=='move' and not ifTele then + if not ifTele then self:checkTouchSound() end end +function Player:freshNewBlock() + self:freshBlockGhost() + self:freshBlockDelay(true) +end function Player:lock() local CB=self.cur.bk for i=1,#CB do @@ -1207,7 +1212,7 @@ function Player:spin(d,ifpre) local idir=(C.dir+d)%4 kickData=kickData[C.dir*10+idir] if not kickData then - self:freshBlock('move') + self:freshMoveBlock() SFX.play(ifpre and 'prerotate' or 'rotate',nil,self:getCenterX()*.15) return end @@ -1228,7 +1233,7 @@ function Player:spin(d,ifpre) -- Fresh ghost and freshTime local t=self.freshTime if not ifpre then - self:freshBlock('move') + self:freshMoveBlock() end if kickData[test][2]>0 and self.freshTime==t and self.curY~=self.imgY then self.freshTime=self.freshTime-1 @@ -1254,7 +1259,7 @@ function Player:spin(d,ifpre) elseif kickData then kickData(self,d) else - self:freshBlock('move') + self:freshMoveBlock() SFX.play(ifpre and 'prerotate' or 'rotate',nil,self:getCenterX()*.15) end end @@ -1325,7 +1330,7 @@ function Player:hold_norm(ifpre) self:resetBlock() end - self:freshBlock('move') + self:freshMoveBlock() self.dropDelay=ENV.drop self.lockDelay=ENV.lock self:_checkSuffocate() @@ -1403,7 +1408,7 @@ function Player:hold_swap(ifpre) self:resetBlock() end - self:freshBlock('move') + self:freshMoveBlock() self.dropDelay=ENV.drop self.lockDelay=ENV.lock self:_checkSuffocate() @@ -1483,7 +1488,7 @@ function Player:popNext(ifhold)-- Pop nextQueue to hand if self.cur then self:_checkSuffocate() - self:freshBlock('newBlock') + self:freshNewBlock() end -- IHdS @@ -2638,7 +2643,7 @@ local function update_alive(P,dt) end P.spinLast=false - P:freshBlock('fresh') + P:freshBlockDelay() P:checkTouchSound() else P.lockDelay=P.lockDelay-1 @@ -2842,7 +2847,7 @@ function Player:revive() self.life=self.life-1 self.fieldBeneath=0 self.b2b=0 - self:freshBlock('push') + self:freshBlockGhost() for i=1,h do self:createClearingFX(i) From 3219da77e9f305b42359f0fb654523f5f090afa2 Mon Sep 17 00:00:00 2001 From: Imple Lee <80144331+ImpleLee@users.noreply.github.com> Date: Tue, 21 Nov 2023 15:07:28 +0800 Subject: [PATCH 2/3] refactor freshBlockDelay --- parts/player/player.lua | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/parts/player/player.lua b/parts/player/player.lua index 1b30e5e5..dc1512ce 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -980,33 +980,23 @@ function Player:freshBlockGhost() end end end -function Player:freshBlockDelay(keepFreshTime) +function Player:freshBlockDelay(keepFreshTimeInEasyFresh) local ENV=self.gameEnv local d0,l0=ENV.drop,ENV.lock local C=self.cur local sc=C.RS.centerPos[C.id][C.dir] - if ENV.easyFresh then - if self.lockDelay0 then - if not keepFreshTime then - self.freshTime=self.freshTime-1 - end - self.lockDelay=l0 - self.dropDelay=d0 - end - if self.curY+sc[1]0 then - self.freshTime=self.freshTime-1 - self.dropDelay=d0 - self.lockDelay=l0 - end - end + local goDown=self.curY+sc[1]0 + local easyFresh=ENV.easyFresh + if easyFresh and (shouldRefresh or goDown) or goDown and shouldRefresh then + self.dropDelay=d0 + self.lockDelay=l0 + end + if shouldRefresh and (easyFresh and not keepFreshTimeInEasyFresh or not easyFresh and goDown) then + self.freshTime=self.freshTime-1 end end function Player:freshMoveBlock(ifTele) From 2604d034fe1b220fb952fa6ba13c11c09b36cdb7 Mon Sep 17 00:00:00 2001 From: Imple Lee <80144331+ImpleLee@users.noreply.github.com> Date: Tue, 21 Nov 2023 15:10:37 +0800 Subject: [PATCH 3/3] add early return in freshBlockGhost --- parts/player/player.lua | 47 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/parts/player/player.lua b/parts/player/player.lua index dc1512ce..f2ff2bac 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -948,35 +948,34 @@ function Player:changeAtk(R) end end function Player:freshBlockGhost() + if not self.cur then return end local ENV=self.gameEnv - if self.cur then - local CB=self.cur.bk - self.ghoY=min(#self.field+1,self.curY) - if self._20G or ENV.sdarr==0 and self.keyPressing[7] and self.downing>=ENV.sddas then - local _=self.ghoY + local CB=self.cur.bk + self.ghoY=min(#self.field+1,self.curY) + if self._20G or ENV.sdarr==0 and self.keyPressing[7] and self.downing>=ENV.sddas then + local _=self.ghoY - -- Move ghost to bottom - while not self:ifoverlap(CB,self.curX,self.ghoY-1) do - self.ghoY=self.ghoY-1 - end + -- Move ghost to bottom + while not self:ifoverlap(CB,self.curX,self.ghoY-1) do + self.ghoY=self.ghoY-1 + end - -- Cancel spinLast - if _~=self.ghoY then - self.spinLast=false - end + -- Cancel spinLast + if _~=self.ghoY then + self.spinLast=false + end - -- Create FX if dropped - if self.curY>self.ghoY then - self:createDropFX() - if ENV.shakeFX then - self.swingOffset.vy=.5 - end - self.curY=self.ghoY - end - else - while not self:ifoverlap(CB,self.curX,self.ghoY-1) do - self.ghoY=self.ghoY-1 + -- Create FX if dropped + if self.curY>self.ghoY then + self:createDropFX() + if ENV.shakeFX then + self.swingOffset.vy=.5 end + self.curY=self.ghoY + end + else + while not self:ifoverlap(CB,self.curX,self.ghoY-1) do + self.ghoY=self.ghoY-1 end end end