diff --git a/parts/RSlist.lua b/parts/RSlist.lua index 1da08003..0bc79430 100644 --- a/parts/RSlist.lua +++ b/parts/RSlist.lua @@ -1055,7 +1055,8 @@ local RSlist={ None_plus=None_plus, } -for _,rs in next,RSlist do +for name,rs in next,RSlist do + rs.name=name if not rs.centerDisp then rs.centerDisp=TABLE.new(true,29) end if not rs.centerPos then rs.centerPos=defaultCenterPos end if not rs.centerTex then rs.centerTex=defaultCenterTex end diff --git a/parts/eventsets/tech_finesse_lock.lua b/parts/eventsets/tech_finesse_lock.lua index 00429680..763ebcf3 100644 --- a/parts/eventsets/tech_finesse_lock.lua +++ b/parts/eventsets/tech_finesse_lock.lua @@ -1,40 +1,69 @@ -local function onMove(P) - if not P.cur then return end - P.holdTime=0 - VK.keys[8].ava=false - P.modeData.moveCount=P.modeData.moveCount+1 - if P.modeData.moveCount>=2 and (P.curY>P.gameEnv.fieldH-2 or P:_roofCheck()) then - P.keyAvailable[1]=false - P.keyAvailable[2]=false - VK.keys[1].ava=false - VK.keys[2].ava=false +local function lockKey(P,keys) + for _,v in next,keys do + P.keyAvailable[v]=false + VK.keys[v].ava=false + VK.release(v) end end -local function onRotate(P) - if not P.cur then return end - P.holdTime=0 - VK.keys[8].ava=false - P.modeData.rotations=P.modeData.rotations+1 - if P.modeData.rotations>=2 and not (P.curY>P.gameEnv.fieldH-2 or P:_roofCheck()) then - P.keyAvailable[3]=false - P.keyAvailable[4]=false - P.keyAvailable[5]=false - VK.keys[3].ava=false - VK.keys[4].ava=false - VK.keys[5].ava=false +local function unlockKey(P,keys) + for _,v in next,keys do + P.keyAvailable[v]=true + VK.keys[v].ava=true end end +local function lockMovement(P) + lockKey(P,{1,2}) +end +local function lockRotation(P) + lockKey(P,{3,4,5}) +end +local function unlock(P) + if P.cur and P.cur.name==6 and not P.gameEnv.skipOCheck then -- don't unlock rotation if O piece & no O-spin + unlockKey(P,{1,2,6,7}) + return + end + unlockKey(P,{1,2,3,4,5,6,7}) +end local function resetLock(P) - for i=1,8 do - P.keyAvailable[i]=true - VK.keys[i].ava=true - end + unlock(P) + unlockKey(P,{8}) + P.modeData.moveCount=0 P.modeData.rotations=0 P.holdTime=1 end + +local function onMove(P) + if not P.cur then return end + + P.holdTime=0 + lockKey(P,{8}) + + -- return if overhang + if P:_roofCheck() then return end + + P.modeData.moveCount=P.modeData.moveCount+1 + if P.modeData.moveCount>=2 then lockMovement(P) end +end +local function onAutoMove(P) + if P:_roofCheck() then unlock(P) end +end +local function onRotate(P) + if not P.cur then return end + + P.holdTime=0 + lockKey(P,{8}) + + -- return if overhang + if P:_roofCheck() then return end + + P.modeData.rotations=P.modeData.rotations+1 + if P.modeData.rotations>=2 then lockRotation(P) end +end + return { arr=0, + fineKill=true, mesDisp=function(P) setFont(45) GC.mStr(("%d"):format(P.stat.atk),63,190) @@ -44,6 +73,12 @@ return { end, task=function(P) resetLock(P) + local RSname=P.RS.name + P.gameEnv.skipOCheck=( + string.find(RSname,'TRS') or + string.find(RSname,'BiRS') or + string.find(RSname,'ASC') + ) end, hook_drop=function(P) resetLock(P) @@ -51,6 +86,23 @@ return { P:win('finish') end end, + hook_spawn=function(P) + if P.gameEnv.skipOCheck then return end + if P.cur.name==6 then + lockRotation(P) + else + resetLock(P) + end + end, + hook_hold=function(P) + if P.gameEnv.skipOCheck then return end + if P.cur.name==6 then + lockRotation(P) + else + resetLock(P) + end + end, hook_left_manual=onMove, hook_right_manual=onMove, - hook_rotLeft=onRotate, hook_rotRight=onRotate, hook_rot180=onRotate + hook_left_auto=onAutoMove, hook_right_auto=onAutoMove, + hook_rotLeft=onRotate, hook_rotRight=onRotate, hook_rot180=onRotate, } diff --git a/parts/eventsets/tech_finesse_lock_f.lua b/parts/eventsets/tech_finesse_lock_f.lua new file mode 100644 index 00000000..d61c5d28 --- /dev/null +++ b/parts/eventsets/tech_finesse_lock_f.lua @@ -0,0 +1,116 @@ +local function lockKey(P,keys) + for _,v in next,keys do + P.keyAvailable[v]=false + VK.keys[v].ava=false + VK.release(v) + end +end +local function unlockKey(P,keys) + for _,v in next,keys do + P.keyAvailable[v]=true + VK.keys[v].ava=true + end +end +local function lockMovement(P) + lockKey(P,{1,2}) +end +local function lockRotation(P) + lockKey(P,{3,4,5}) +end +local function unlock(P) + if P.cur and P.cur.name==6 and not P.gameEnv.skipOCheck then -- don't unlock rotation if O piece & no O-spin + unlockKey(P,{1,2,6,7}) + return + end + unlockKey(P,{1,2,3,4,5,6,7}) +end +local function resetLock(P) + unlock(P) + unlockKey(P,{8}) + + P.modeData.moveCount=0 + P.modeData.rotations=0 + P.holdTime=1 +end + +local function onMove(P) + if not P.cur then return end + + P.holdTime=0 + lockKey(P,{8}) + + -- return if overhang + if P:_roofCheck() then return end + + P.modeData.moveCount=P.modeData.moveCount+1 + if P.modeData.moveCount>=2 then lockMovement(P) end +end +local function onAutoMove(P) + if P:_roofCheck() then unlock(P) end +end +local function onRotate(P) + if not P.cur then return end + + P.holdTime=0 + lockKey(P,{8}) + + -- return if overhang + if P:_roofCheck() then return end + + P.modeData.rotations=P.modeData.rotations+1 + if P.modeData.rotations>=2 then lockRotation(P) end +end + +return { + arr=0, + fineKill=true, + mesDisp=function(P) + setFont(45) + GC.mStr(("%d"):format(P.stat.atk),63,190) + GC.mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310) + mText(TEXTOBJ.atk,63,243) + mText(TEXTOBJ.eff,63,363) + end, + task=function(P) + resetLock(P) + local RSname=P.RS.name + P.gameEnv.skipOCheck=( + string.find(RSname,'TRS') or + string.find(RSname,'BiRS') or + string.find(RSname,'ASC') + ) + end, + hook_drop=function(P) + resetLock(P) + + local C=P.lastPiece + if C.row>0 then + if not C.special then + P:lose() + return + end + end + if P.stat.atk>=100 then + P:win('finish') + end + end, + hook_spawn=function(P) + if P.gameEnv.skipOCheck then return end + if P.cur.name==6 then + lockRotation(P) + else + resetLock(P) + end + end, + hook_hold=function(P) + if P.gameEnv.skipOCheck then return end + if P.cur.name==6 then + lockRotation(P) + else + resetLock(P) + end + end, + hook_left_manual=onMove, hook_right_manual=onMove, + hook_left_auto=onAutoMove, hook_right_auto=onAutoMove, + hook_rotLeft=onRotate, hook_rotRight=onRotate, hook_rot180=onRotate +} \ No newline at end of file diff --git a/parts/modes/tech_finesse_lock_f.lua b/parts/modes/tech_finesse_lock_f.lua index c59fadcc..6e38ac79 100644 --- a/parts/modes/tech_finesse_lock_f.lua +++ b/parts/modes/tech_finesse_lock_f.lua @@ -5,7 +5,7 @@ return { b2bKill=true, freshLimit=15, bg='flink',bgm='infinite', - eventSet='tech_finesse_lock', + eventSet='tech_finesse_lock_f', }, slowMark=true, score=function(P) return {P.stat.atk<=100 and math.floor(P.stat.atk) or 100,P.stat.time} end, diff --git a/parts/player/init.lua b/parts/player/init.lua index 6fe9bad2..7160617d 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -254,6 +254,8 @@ local hooks = { 'hook_rotRight', 'hook_rot180', 'hook_drop', + 'hook_spawn', + 'hook_hold', 'hook_die', 'task' } diff --git a/parts/player/player.lua b/parts/player/player.lua index d2cb2434..1c180fcc 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -345,6 +345,7 @@ function Player:act_hold() if self.cur then if self:hold() then self.keyPressing[8]=false + self:_triggerEvent('hook_hold') end end end @@ -382,6 +383,7 @@ function Player:act_insLeft(auto) else self.ctrlCount=self.ctrlCount+1 end + if auto then self:_triggerEvent('hook_left_auto') end end function Player:act_insRight(auto) if not self.control then return end @@ -408,6 +410,7 @@ function Player:act_insRight(auto) else self.ctrlCount=self.ctrlCount+1 end + if auto then self:_triggerEvent('hook_right_auto') end end function Player:act_insDown() if not self.control then return end @@ -1495,7 +1498,9 @@ function Player:popNext(ifhold)-- Pop nextQueue to hand self:hold(true,true) else-- Next queue is empty, force lose self:lose(true) + return end + self:_triggerEvent('hook_spawn') end function Player:willDieWith(B) return B and self:ifoverlap(B.bk,self:getSpawnX(B),self:getSpawnY(B))