Improve Tech Finesse Lock and add some other minor things (#950)

* Fix VK and overhang detection in Tech Finesse Lock

* Make Tech Finesse Lock overhang logic more lenient

* Add finesse kill to Tech Finesse Lock
(at this point if you still make a finesse error even after getting limited inputs then you have a huge skill issue)

* Disable O rotation in Tech Finesse Lock if no O-spin
+ Added RS name (RS.name, P.RS.name)
+ Added hook_spawn and hook_hold

* Update Zframework

* Fix weird backfire location
This commit is contained in:
NOT_A_ROBOT
2023-09-19 00:15:16 +07:00
committed by GitHub
parent 337293dbe1
commit 009858e2f8
6 changed files with 205 additions and 29 deletions

View File

@@ -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,
}

View File

@@ -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
}