diff --git a/parts/globalTables.lua b/parts/globalTables.lua index ed6c08d9..6a2d3b43 100644 --- a/parts/globalTables.lua +++ b/parts/globalTables.lua @@ -160,6 +160,7 @@ CUSTOMENV={--gameEnv for cutsom game nextCount=6, holdCount=1, infHold=false, + phyHold=false, --Visual bone=false, diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index d2eb3649..8b7f2e22 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -424,6 +424,7 @@ return{ nextCount="Next", holdCount="Hold", infHold="Infinite Hold", + phyHold="Physical Hold", bone="Bone Blocks", mindas="Min. DAS", diff --git a/parts/language/lang_fr.lua b/parts/language/lang_fr.lua index 23aeeabd..1e09eca0 100644 --- a/parts/language/lang_fr.lua +++ b/parts/language/lang_fr.lua @@ -400,6 +400,7 @@ return{ nextCount="Prévisualisations de pièces", holdCount="Réserve", infHold="Réserver une fois", + -- phyHold="Physical Hold", bone="Crochets", mindas="DAS minimum", diff --git a/parts/language/lang_pt.lua b/parts/language/lang_pt.lua index 1662f8e0..8a2080b9 100644 --- a/parts/language/lang_pt.lua +++ b/parts/language/lang_pt.lua @@ -424,6 +424,7 @@ return{ nextCount="Prox.", holdCount="Segurar", infHold="Segurar Infinito", + -- phyHold="Physical Hold", bone="Bone Blocks", mindas="Min. DAS", diff --git a/parts/language/lang_sp.lua b/parts/language/lang_sp.lua index 5247e282..4c624fe0 100644 --- a/parts/language/lang_sp.lua +++ b/parts/language/lang_sp.lua @@ -400,6 +400,7 @@ return{ nextCount="Siguiente", holdCount="Reserva", -- infHold="Hold Único", + -- phyHold="Physical Hold", bone="Bone Block", mindas="DAS Mínimo", diff --git a/parts/language/lang_symbol.lua b/parts/language/lang_symbol.lua index f9513481..a6df2df0 100644 --- a/parts/language/lang_symbol.lua +++ b/parts/language/lang_symbol.lua @@ -281,6 +281,7 @@ return{ nextCount="→", holdCount="[ ]", infHold="∞*[ ]", + phyHold="P-[ ]", bone="[]", mindas="mDAS", diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index 021dd224..c046b472 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -424,6 +424,7 @@ return{ nextCount="Next", holdCount="Hold", infHold="无限Hold", + phyHold="物理Hold", bone="骨块", mindas="最小DAS", diff --git a/parts/language/lang_zh2.lua b/parts/language/lang_zh2.lua index 75ba8389..6c9e5e5e 100644 --- a/parts/language/lang_zh2.lua +++ b/parts/language/lang_zh2.lua @@ -84,6 +84,7 @@ return{ nextCount="预览个数", holdCount="暂存个数", infHold="无限暂存", + phyHold="物理暂存", mindas="最小首次移动延迟", minarr="最小移动重复延迟", diff --git a/parts/player/gameEnv0.lua b/parts/player/gameEnv0.lua index aee47dc7..2f699427 100644 --- a/parts/player/gameEnv0.lua +++ b/parts/player/gameEnv0.lua @@ -33,7 +33,7 @@ return{ bone=false, fieldH=20, nextCount=6,nextStartPos=1, - holdCount=1,infHold=false, + holdCount=1,infHold=false,phyHold=false, ospin=true,deepDrop=false, RS="TRS", sequence="bag", diff --git a/parts/player/player.lua b/parts/player/player.lua index 3e9ebe05..b3b26b2a 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -624,23 +624,50 @@ function Player.hold(P,ifpre) else--Hold local C,H=P.cur,P.holdQueue[1] - --Finesse check - if H and C and H.id==C.id and H.name==C.name then - P.ctrlCount=P.ctrlCount+1 - elseif P.ctrlCount<=1 then - P.ctrlCount=0 + if P.gameEnv.phyHold and C and not ifpre then--Physical hold + local success + local x,y=P.curX,P.curY + x=x+(#C.bk[1]-#H.bk[1])*.5 + y=y+(#C.bk-#H.bk)*.5 + for X=int(x-.5),ceil(x+.5)do + for Y=int(y),ceil(y)do + if not P:ifoverlap(H.bk,X,Y)then + x,y=X,Y + success=true + goto BREAK + end + end + end + ::BREAK:: + if success then + P.spinLast=false + P.spinSeq=0 + + ins(P.holdQueue,P:getBlock(C.id)) + P.cur=rem(P.holdQueue,1) + P.curX,P.curY=x,y + else + SFX.play("finesseError") + return + end + else--Normal hold + --Finesse check + if H and C and H.id==C.id and H.name==C.name then + P.ctrlCount=P.ctrlCount+1 + elseif P.ctrlCount<=1 then + P.ctrlCount=0 + end + + P.spinLast=false + P.spinSeq=0 + + if C then + ins(P.holdQueue,P:getBlock(C.id)) + end + P.cur=rem(P.holdQueue,1) + + P:resetBlock() end - - P.spinLast=false - P.spinSeq=0 - - if C then - C.bk=BLOCKS[C.id][P.gameEnv.face[C.id]] - ins(P.holdQueue,P:getBlock(C.id)) - end - P.cur=rem(P.holdQueue,1) - - P:resetBlock() P:freshBlock("move") P.dropDelay=P.gameEnv.drop P.lockDelay=P.gameEnv.lock diff --git a/parts/scenes/custom_advance.lua b/parts/scenes/custom_advance.lua index f93ac419..28ece82b 100644 --- a/parts/scenes/custom_advance.lua +++ b/parts/scenes/custom_advance.lua @@ -11,6 +11,7 @@ scene.widgetList={ WIDGET.newSlider{name="nextCount", x=180, y=380,w=200,unit=6, disp=lnk_CUSval("nextCount"),code=lnk_CUSsto("nextCount")}, WIDGET.newSlider{name="holdCount", x=180, y=450,w=200,unit=6, disp=lnk_CUSval("holdCount"),code=lnk_CUSsto("holdCount")}, WIDGET.newSwitch{name="infHold", x=280, y=530, disp=lnk_CUSval("infHold"), code=lnk_CUSrev("infHold"),hide=function()return CUSTOMENV.holdCount==0 end}, + WIDGET.newSwitch{name="phyHold", x=280, y=620, disp=lnk_CUSval("phyHold"), code=lnk_CUSrev("phyHold"),hide=function()return CUSTOMENV.holdCount==0 end}, --Rule WIDGET.newSelector{name="fieldH", x=550, y=520, w=260,color="sky", list={1,2,3,4,6,8,10,15,20,30,50,100},disp=lnk_CUSval("fieldH"),code=lnk_CUSsto("fieldH")},