diff --git a/parts/bot/init.lua b/parts/bot/init.lua
index 39a386d4..27d9e60b 100644
--- a/parts/bot/init.lua
+++ b/parts/bot/init.lua
@@ -12,7 +12,7 @@ local baseBot={
function baseBot.update(bot)
local P=bot.P
local keys=bot.keys
- if P.control and P.waiting==-1 then
+ if P.control and P.waiting==0 then
bot.delay=bot.delay-1
if not keys[1]then
if bot.runningThread then
diff --git a/parts/customEnv0.lua b/parts/customEnv0.lua
index 6e50499c..075304d0 100644
--- a/parts/customEnv0.lua
+++ b/parts/customEnv0.lua
@@ -6,6 +6,8 @@ return{
lock=1e99,
wait=0,
fall=0,
+ hang=5,
+ hurry=1e99,
--Control
nextCount=6,
@@ -13,7 +15,6 @@ return{
holdCount=1,
infHold=true,
phyHold=false,
- hang=5,
--Visual
bone=false,
diff --git a/parts/gameTables.lua b/parts/gameTables.lua
index 4230c27e..48e325dc 100644
--- a/parts/gameTables.lua
+++ b/parts/gameTables.lua
@@ -536,13 +536,12 @@ do--Game data tables
ROOMENV={
--Room config
capacity=10,
+ FTLock=true,
--Basic
- drop=30,
- lock=60,
- wait=0,
- fall=0,
- FTLock=true,
+ drop=30,lock=60,
+ wait=0,fall=0,
+ hang=5,hurry=1e99,
--Control
nextCount=6,
diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua
index 21c39b49..40d09f13 100644
--- a/parts/language/lang_en.lua
+++ b/parts/language/lang_en.lua
@@ -296,6 +296,8 @@ return{
lock="Lock Delay",
wait="Entry Delay",
fall="Line Delay",
+ hang="Death Delay",
+ hurry="ARE Interruption",
capacity="Capacity",
create="Create",
@@ -480,6 +482,7 @@ return{
wait="Entry Delay",
fall="Line Delay",
hang="Death Delay",
+ hurry="ARE Interruption",
bg="Background",
bgm="Music",
diff --git a/parts/language/lang_es.lua b/parts/language/lang_es.lua
index 72122ff6..5817a83b 100644
--- a/parts/language/lang_es.lua
+++ b/parts/language/lang_es.lua
@@ -262,6 +262,8 @@ return{
lock="Retraso de Bloqueo",
wait="Retraso de Spawneo",
fall="Retraso de Línea",
+ -- hang="Death Delay",
+ -- hurry="ARE Interruption",
capacity="Capacidad",
create="Crear",
@@ -445,6 +447,7 @@ return{
wait="Retraso de Spawneo",
fall="Retraso de Línea",
-- hang="Death Delay",
+ -- hurry="ARE Interruption",
bg="Fondo",
bgm="Música",
diff --git a/parts/language/lang_fr.lua b/parts/language/lang_fr.lua
index 72625b21..69c13597 100644
--- a/parts/language/lang_fr.lua
+++ b/parts/language/lang_fr.lua
@@ -258,6 +258,8 @@ return{
lock="Délai de verrouillage",
wait="Délai d'apparition",
fall="Délai de ligne",
+ -- hang="Death Delay",
+ -- hurry="ARE Interruption",
-- capacity="Capacity",
-- create="Create",
@@ -446,6 +448,7 @@ return{
wait="Délai d'apparition",
fall="Délai de ligne",
-- hang="Death Delay",
+ -- hurry="ARE Interruption",
bg="Arrière-plan",
bgm="Musique",
diff --git a/parts/language/lang_pt.lua b/parts/language/lang_pt.lua
index a5fe6506..75e67a90 100644
--- a/parts/language/lang_pt.lua
+++ b/parts/language/lang_pt.lua
@@ -284,6 +284,8 @@ return{
lock="Delay Trava",
wait="Delay Entrada",
fall="Delay Linha",
+ -- hang="Death Delay",
+ -- hurry="ARE Interruption",
-- capacity="Capacity",
-- create="Create",
@@ -468,6 +470,7 @@ return{
wait="Delay Entrada",
fall="Delay Linha",
-- hang="Death Delay",
+ -- hurry="ARE Interruption",
bg="Fundo",
bgm="Música",
diff --git a/parts/language/lang_symbol.lua b/parts/language/lang_symbol.lua
index b7f5bb0e..b3b6bb44 100644
--- a/parts/language/lang_symbol.lua
+++ b/parts/language/lang_symbol.lua
@@ -190,6 +190,8 @@ return{
lock="↓_",
wait="→=",
fall="↓=",
+ hang=":(=",
+ hurry="_x",
capacity="<0/?>",
create=">",
@@ -373,6 +375,7 @@ return{
wait="→=",
fall="↓=",
hang=":(=",
+ hurry="_x",
bg="{~}",
bgm="(~)",
diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua
index 9f281e33..c7b2d9f7 100644
--- a/parts/language/lang_zh.lua
+++ b/parts/language/lang_zh.lua
@@ -296,6 +296,8 @@ return{
lock="锁定延迟",
wait="出块等待",
fall="消行延迟",
+ hang="窒息延迟",
+ hurry="ARE打断",
capacity="房间容量",
create="创建",
@@ -479,6 +481,7 @@ return{
wait="出块等待",
fall="消行延迟",
hang="窒息延迟",
+ hurry="ARE打断",
bg="背景",
bgm="音乐",
diff --git a/parts/language/lang_zh_grass.lua b/parts/language/lang_zh_grass.lua
index b72f08d8..d74cdb03 100644
--- a/parts/language/lang_zh_grass.lua
+++ b/parts/language/lang_zh_grass.lua
@@ -294,6 +294,8 @@ return{
lock="锁定延迟",
wait="进入延迟",
fall="线路延迟",
+ hang="毁灭延迟",
+ hurry="是打扰吗",
capacity="容量",
create="创造",
@@ -477,6 +479,7 @@ return{
wait="进入延迟",
fall="线路延迟",
hang="毁灭延迟",
+ hurry="是打扰吗",
bg="背景",
bgm="音乐",
@@ -753,7 +756,7 @@ return{
['infinite_dig']= {"无限:挖掘", "", "挖,挖,挖"},
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
- ['custom_clear']= {"习俗", "正常"} ,
+ ['custom_clear']= {"习俗", "正常"},
['custom_puzzle']= {"习俗", "令人费解的"},
},
}
diff --git a/parts/language/lang_zh_trad.lua b/parts/language/lang_zh_trad.lua
index 6bd5caab..197e9a0c 100644
--- a/parts/language/lang_zh_trad.lua
+++ b/parts/language/lang_zh_trad.lua
@@ -295,6 +295,8 @@ return{
lock="鎖定延遲",
wait="方塊生成等待",
fall="行清除延遲",
+ hang="死亡延遲",
+ hurry="ARE打斷",
capacity="房間容量",
create="創建",
@@ -478,6 +480,7 @@ return{
wait="方塊生成等待",
fall="行清除延遲",
hang="死亡延遲",
+ hurry="ARE打斷",
bg="背景",
bgm="音樂",
diff --git a/parts/player/draw.lua b/parts/player/draw.lua
index 369d2bf2..1e46f12d 100644
--- a/parts/player/draw.lua
+++ b/parts/player/draw.lua
@@ -170,7 +170,7 @@ local function _drawField(P,showInvis)
local V,F=P.visTime,P.field
local start=int((P.fieldBeneath+P.fieldUp)/30+1)
local texture=P.skinLib
- if P.falling==-1 then--Blocks only
+ if P.falling==0 then--Blocks only
if ENV.upEdge then
gc_setShader(shader_lighter)
gc_translate(0,-4)
@@ -782,7 +782,7 @@ function draw.norm(P,repMode)
_drawFXs(P)
--Draw current block
- if P.cur and P.waiting==-1 then
+ if P.cur and P.waiting==0 then
local C=P.cur
local curColor=C.color
@@ -997,7 +997,7 @@ function draw.demo(P)
gc_translate(0,600)
_drawField(P)
_drawFXs(P)
- if P.cur and P.waiting==-1 then
+ if P.cur and P.waiting==0 then
if ENV.ghost then
drawGhost[ENV.ghostType](P.cur.bk,P.curX,P.ghoY,ENV.ghost,P.skinLib,curColor)
end
diff --git a/parts/player/gameEnv0.lua b/parts/player/gameEnv0.lua
index 435e90fc..daf56b06 100644
--- a/parts/player/gameEnv0.lua
+++ b/parts/player/gameEnv0.lua
@@ -3,7 +3,6 @@ return{
dascut=0,dropcut=0,
sddas=2,sdarr=2,
ihs=true,irs=true,ims=true,
- hang=5,FTLock=true,
ghostType='gray',
block=true,ghost=.3,center=1,
@@ -30,6 +29,7 @@ return{
drop=60,lock=60,
wait=0,fall=0,
+ hang=5,hurry=1e99,
bone=false,
lockout=false,
fieldH=20,heightLimit=1e99,
@@ -69,4 +69,5 @@ return{
bg='none',bgm='race',
allowMod=true,
+ FTLock=true,
}
diff --git a/parts/player/init.lua b/parts/player/init.lua
index ff3163bc..d9df0a3f 100644
--- a/parts/player/init.lua
+++ b/parts/player/init.lua
@@ -36,54 +36,6 @@ local function _getNewStatTable()
end
return T
end
-local playerActions={
- Player.act_moveLeft, --1
- Player.act_moveRight, --2
- Player.act_rotRight, --3
- Player.act_rotLeft, --4
- Player.act_rot180, --5
- Player.act_hardDrop, --6
- Player.act_softDrop, --7
- Player.act_hold, --8
- Player.act_func1, --9
- Player.act_func2, --10
- Player.act_insLeft, --11
- Player.act_insRight, --12
- Player.act_insDown, --13
- Player.act_down1, --14
- Player.act_down4, --15
- Player.act_down10, --16
- Player.act_dropLeft, --17
- Player.act_dropRight, --18
- Player.act_zangiLeft, --19
- Player.act_zangiRight,--20
-}
-local function _pressKey(P,keyID)
- if P.keyAvailable[keyID]and P.alive then
- P.keyPressing[keyID]=true
- playerActions[keyID](P)
- P.stat.key=P.stat.key+1
- end
-end
-local function _releaseKey(P,keyID)
- P.keyPressing[keyID]=false
-end
-local function _pressKey_Rec(P,keyID)
- if P.keyAvailable[keyID]and P.alive then
- local L=GAME.rep
- ins(L,P.frameRun)
- ins(L,keyID)
- P.keyPressing[keyID]=true
- playerActions[keyID](P)
- P.stat.key=P.stat.key+1
- end
-end
-local function _releaseKey_Rec(P,keyID)
- local L=GAME.rep
- ins(L,P.frameRun)
- ins(L,32+keyID)
- P.keyPressing[keyID]=false
-end
local function _newEmptyPlayer(id,mini)
local P={id=id}
PLAYERS[id]=P
@@ -92,15 +44,6 @@ local function _newEmptyPlayer(id,mini)
--Inherit functions of Player class
for k,v in next,Player do P[k]=v end
- --Set key/timer event
- if P.id==1 and GAME.recording then
- P.pressKey=_pressKey_Rec
- P.releaseKey=_releaseKey_Rec
- else
- P.pressKey=_pressKey
- P.releaseKey=_releaseKey
- end
-
--Field position
P.swingOffset={--Shake FX
x=0,y=0,
@@ -195,7 +138,7 @@ local function _newEmptyPlayer(id,mini)
]]
P.movDir,P.moving,P.downing=0,0,0--Last move key,DAS charging,downDAS charging
P.dropDelay,P.lockDelay=0,0
- P.waiting,P.falling=-1,-1
+ P.waiting,P.falling=0,0
P.freshTime=0
P.spinLast=false
P.ctrlCount=0--Key press time, for finesse check
diff --git a/parts/player/player.lua b/parts/player/player.lua
index 3da7ed95..d4d66db6 100644
--- a/parts/player/player.lua
+++ b/parts/player/player.lua
@@ -200,7 +200,301 @@ function Player:createBeam(R,send)
end
----------------------------------------------------
+----------------------------------------------------
+function Player:act_moveLeft(auto)
+ if not auto then
+ self.ctrlCount=self.ctrlCount+1
+ end
+ self.movDir=-1
+ if self.control and self.waiting==0 then
+ if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)then
+ self:createMoveFX('left')
+ self.curX=self.curX-1
+ self:freshBlock('move')
+ if not auto then
+ self.moving=0
+ end
+ self.spinLast=false
+ else
+ self.moving=self.gameEnv.das
+ end
+ else
+ self.moving=0
+ end
+end
+function Player:act_moveRight(auto)
+ if not auto then
+ self.ctrlCount=self.ctrlCount+1
+ end
+ self.movDir=1
+ if self.control and self.waiting==0 then
+ if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)then
+ self:createMoveFX('right')
+ self.curX=self.curX+1
+ self:freshBlock('move')
+ if not auto then
+ self.moving=0
+ end
+ self.spinLast=false
+ else
+ self.moving=self.gameEnv.das
+ end
+ else
+ self.moving=0
+ end
+end
+function Player:act_rotRight()
+ if self.control and self.waiting==0 and self.cur then
+ self.ctrlCount=self.ctrlCount+1
+ self:spin(1)
+ self.keyPressing[3]=false
+ end
+end
+function Player:act_rotLeft()
+ if self.control and self.waiting==0 and self.cur then
+ self.ctrlCount=self.ctrlCount+1
+ self:spin(3)
+ self.keyPressing[4]=false
+ end
+end
+function Player:act_rot180()
+ if self.control and self.waiting==0 and self.cur then
+ self.ctrlCount=self.ctrlCount+2
+ self:spin(2)
+ self.keyPressing[5]=false
+ end
+end
+function Player:act_hardDrop()
+ local ENV=self.gameEnv
+ if self.control and self.waiting==0 and self.cur then
+ if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frameself.ghoY then
+ self:createDropFX()
+ self.curY=self.ghoY
+ self.spinLast=false
+ if self.sound then
+ SFX.play('drop',nil,self:getCenterX()*.15)
+ if SETTING.vib>0 then VIB(SETTING.vib+1)end
+ end
+ end
+ if ENV.shakeFX then
+ self.swingOffset.vy=.6
+ self.swingOffset.va=self.swingOffset.va+self:getCenterX()*6e-4
+ end
+ self.lockDelay=-1
+ self.keyPressing[6]=false
+ self:drop()
+ end
+ end
+end
+function Player:act_softDrop()
+ local ENV=self.gameEnv
+ self.downing=1
+ if self.control and self.waiting==0 and self.cur then
+ if self.curY>self.ghoY then
+ self.curY=self.curY-1
+ self:freshBlock('fresh')
+ self.spinLast=false
+ self:checkTouchSound()
+ elseif ENV.deepDrop then
+ local CB=self.cur.bk
+ local y=self.curY-1
+ while self:ifoverlap(CB,self.curX,y)and y>0 do
+ y=y-1
+ end
+ if y>0 then
+ self.ghoY=y
+ self:createDropFX()
+ self.curY=y
+ self:freshBlock('move')
+ SFX.play('swipe')
+ end
+ end
+ end
+end
+function Player:act_hold()
+ if self.control and self.waiting==0 then
+ self:hold()
+ self.keyPressing[8]=false
+ end
+end
+function Player:act_func1()
+ self.gameEnv.fkey1(self)
+end
+function Player:act_func2()
+ self.gameEnv.fkey2(self)
+end
+
+function Player:act_insLeft(auto)
+ if not self.cur then
+ return
+ end
+ local x0=self.curX
+ 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)
+ end
+ if self.curX~=x0 then
+ self.spinLast=false
+ self:checkTouchSound()
+ end
+ if self.gameEnv.shakeFX then
+ self.swingOffset.vx=-1.5
+ end
+ if auto then
+ if self.ctrlCount==0 then
+ self.ctrlCount=1
+ end
+ else
+ self.ctrlCount=self.ctrlCount+1
+ end
+end
+function Player:act_insRight(auto)
+ if not self.cur then
+ return
+ end
+ local x0=self.curX
+ 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)
+ end
+ if self.curX~=x0 then
+ self.spinLast=false
+ self:checkTouchSound()
+ end
+ if self.gameEnv.shakeFX then
+ self.swingOffset.vx=1.5
+ end
+ if auto then
+ if self.ctrlCount==0 then
+ self.ctrlCount=1
+ end
+ else
+ self.ctrlCount=self.ctrlCount+1
+ end
+end
+function Player:act_insDown()
+ if self.cur and self.curY>self.ghoY then
+ local ENV=self.gameEnv
+ self:createDropFX()
+ if ENV.shakeFX then
+ self.swingOffset.vy=.5
+ end
+ self.curY=self.ghoY
+ self.lockDelay=ENV.lock
+ self.spinLast=false
+ self:freshBlock('fresh')
+ self:checkTouchSound()
+ end
+end
+function Player:act_down1()
+ if self.cur and self.curY>self.ghoY then
+ self:createMoveFX('down')
+ self.curY=self.curY-1
+ self:freshBlock('fresh')
+ self.spinLast=false
+ end
+end
+function Player:act_down4()
+ if self.cur and self.curY>self.ghoY then
+ local ghoY0=self.ghoY
+ self.ghoY=max(self.curY-4,self.ghoY)
+ self:createDropFX()
+ self.curY,self.ghoY=self.ghoY,ghoY0
+ self:freshBlock('fresh')
+ self.spinLast=false
+ end
+end
+function Player:act_down10()
+ if self.cur and self.curY>self.ghoY then
+ local ghoY0=self.ghoY
+ self.ghoY=max(self.curY-10,self.ghoY)
+ self:createDropFX()
+ self.curY,self.ghoY=self.ghoY,ghoY0
+ self:freshBlock('fresh')
+ self.spinLast=false
+ end
+end
+function Player:act_dropLeft()
+ if self.cur then
+ self:act_insLeft()
+ self:act_hardDrop()
+ end
+end
+function Player:act_dropRight()
+ if self.cur then
+ self:act_insRight()
+ self:act_hardDrop()
+ end
+end
+function Player:act_zangiLeft()
+ if self.cur then
+ self:act_insLeft()
+ self:act_insDown()
+ self:act_insRight()
+ self:act_hardDrop()
+ end
+end
+function Player:act_zangiRight()
+ if self.cur then
+ self:act_insRight()
+ self:act_insDown()
+ self:act_insLeft()
+ self:act_hardDrop()
+ end
+end
+----------------------------------------------------
+
----------------------------------------------------
+local playerActions={
+ Player.act_moveLeft, --1
+ Player.act_moveRight, --2
+ Player.act_rotRight, --3
+ Player.act_rotLeft, --4
+ Player.act_rot180, --5
+ Player.act_hardDrop, --6
+ Player.act_softDrop, --7
+ Player.act_hold, --8
+ Player.act_func1, --9
+ Player.act_func2, --10
+ Player.act_insLeft, --11
+ Player.act_insRight, --12
+ Player.act_insDown, --13
+ Player.act_down1, --14
+ Player.act_down4, --15
+ Player.act_down10, --16
+ Player.act_dropLeft, --17
+ Player.act_dropRight, --18
+ Player.act_zangiLeft, --19
+ Player.act_zangiRight,--20
+}function Player:pressKey(keyID)
+ if self.keyAvailable[keyID]and self.alive then
+ if self.waiting>self.gameEnv.hurry then
+ self.waiting=self.gameEnv.hurry
+ if self.waiting==0 then self:popNext()end
+ end
+ self.keyPressing[keyID]=true
+ playerActions[keyID](self)
+ self.stat.key=self.stat.key+1
+ if self.id==1 and GAME.recording then
+ local L=GAME.rep
+ ins(L,self.frameRun)
+ ins(L,keyID)
+ end
+ end
+end
+function Player:releaseKey(keyID)
+ self.keyPressing[keyID]=false
+ if self.id==1 and GAME.recording then
+ local L=GAME.rep
+ ins(L,self.frameRun)
+ ins(L,32+keyID)
+ end
+end
function Player:newTask(code,...)
local thread=coroutine.create(code)
assert(resume(thread,self,...))
@@ -719,6 +1013,16 @@ function Player:_removeClearedLines()
FREEROW.discard(rem(self.visTime,h))
end
end
+function Player:_updateFalling(val)
+ self.falling=val
+ if self.falling==0 then
+ local L=#self.clearingRow
+ if self.sound and self.gameEnv.fall>0 and #self.field+L>self.clearingRow[L]then
+ SFX.play('fall')
+ end
+ TABLE.cut(self.clearingRow)
+ end
+end
function Player:removeTopClearingFX()
for i=#self.clearingRow,1,-1 do
if self.clearingRow[i]>#self.field then
@@ -728,7 +1032,7 @@ function Player:removeTopClearingFX()
end
end
if self.clearingRow[1]then
- self.falling=self.gameEnv.fall
+ self:_updateFalling(self.gameEnv.fall)
return false
else
return true
@@ -1004,7 +1308,7 @@ function Player:hold_swap(ifpre)
self.stat.hold=self.stat.hold+1
end
function Player:hold(ifpre)
- if self.holdTime>0 and(ifpre or self.waiting==-1)then
+ if self.holdTime>0 and(ifpre or self.waiting==0)then
if self.gameEnv.holdMode=='hold'then
self:hold_norm(ifpre)
elseif self.gameEnv.holdMode=='swap'then
@@ -1039,9 +1343,9 @@ function Player:popNext(ifhold)--Pop nextQueue to hand
self.spinLast=false
self.ctrlCount=0
- self.cur=rem(self.nextQueue,1)
- self.newNext()
- if self.cur then
+ if self.nextQueue[1]then
+ self.cur=rem(self.nextQueue,1)
+ self.newNext()
self.pieceCount=self.pieceCount+1
local pressing=self.keyPressing
@@ -1251,8 +1555,6 @@ do
piece.centX,piece.centY=self.curX+sc[2],self.curY+sc[1]
piece.frame,piece.autoLock=self.frameRun,autoLock
- self.waiting=ENV.wait
-
--Tri-corner spin check
if self.spinLast then
if C.id<6 then
@@ -1637,6 +1939,9 @@ do
end
end
+ --Fresh ARE
+ self.waiting=ENV.wait
+
--Prevent sudden death if hang>0
if ENV.hang>ENV.wait and self.nextQueue[1]then
local B=self.nextQueue[1]
@@ -1699,6 +2004,8 @@ do
else
self:_triggerEvent('hook_drop')
end
+
+ if self.waiting==0 then self:popNext()end
end
function Player:clearFilledLines(start,height)
@@ -1708,7 +2015,7 @@ do
self:showText(text.clear[min(_cc,21)],0,0,75,'beat',.4)
if _cc>6 then self:showText(text.cleared:gsub("$1",_cc),0,55,30,'zoomout',.4)end
self:_removeClearedLines()
- self.falling=self.gameEnv.fall
+ self:_updateFalling(self.gameEnv.fall)
self.stat.row=self.stat.row+_cc
self.stat.dig=self.stat.dig+_gbcc
self.stat.score=self.stat.score+clearSCR[_cc]
@@ -2014,7 +2321,7 @@ local function update_alive(P)
if P.movDir~=0 then
local das,arr=ENV.das,ENV.arr
local mov=P.moving
- if P.waiting==-1 then
+ if P.waiting==0 then
if P.movDir==1 then
if P.keyPressing[2]then
if arr>0 then
@@ -2099,25 +2406,19 @@ local function update_alive(P)
end
--Falling animation
- if P.falling>=0 then
- P.falling=P.falling-1
- if P.falling>=0 then
+ if P.falling>0 then
+ P:_updateFalling(P.falling-1)
+ if P.falling>0 then
goto THROW_stop
- else
- local L=#P.clearingRow
- if P.sound and ENV.fall>0 and #P.field+L>P.clearingRow[L]then
- SFX.play('fall')
- end
- P.clearingRow={}
end
end
--Update block state
if P.control then
--Try spawn new block
- if P.waiting>=0 then
+ if P.waiting>0 then
P.waiting=P.waiting-1
- if P.waiting<0 then
+ if P.waiting<=0 then
P:popNext()
end
goto THROW_stop
@@ -2238,15 +2539,8 @@ local function update_dead(P)
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
end
- if P.falling>=0 then
- P.falling=P.falling-1
- if P.falling<0 then
- local L=#P.clearingRow
- if P.sound and P.gameEnv.fall>0 and #P.field+L>P.clearingRow[L]then
- SFX.play('fall')
- end
- P.clearingRow={}
- end
+ if P.falling>0 then
+ P:_updateFalling(P.falling-1)
end
if P.b2b1>0 then
P.b2b1=max(0,P.b2b1*.92-1)
@@ -2466,254 +2760,4 @@ function Player:lose(force)
end
--------------------------<\Event>--------------------------
-----------------------------------------------------
-function Player:act_moveLeft(auto)
- if not auto then
- self.ctrlCount=self.ctrlCount+1
- end
- self.movDir=-1
- if self.control and self.waiting==-1 then
- if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)then
- self:createMoveFX('left')
- self.curX=self.curX-1
- self:freshBlock('move')
- if not auto then
- self.moving=0
- end
- self.spinLast=false
- else
- self.moving=self.gameEnv.das
- end
- else
- self.moving=0
- end
-end
-function Player:act_moveRight(auto)
- if not auto then
- self.ctrlCount=self.ctrlCount+1
- end
- self.movDir=1
- if self.control and self.waiting==-1 then
- if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)then
- self:createMoveFX('right')
- self.curX=self.curX+1
- self:freshBlock('move')
- if not auto then
- self.moving=0
- end
- self.spinLast=false
- else
- self.moving=self.gameEnv.das
- end
- else
- self.moving=0
- end
-end
-function Player:act_rotRight()
- if self.control and self.waiting==-1 and self.cur then
- self.ctrlCount=self.ctrlCount+1
- self:spin(1)
- self.keyPressing[3]=false
- end
-end
-function Player:act_rotLeft()
- if self.control and self.waiting==-1 and self.cur then
- self.ctrlCount=self.ctrlCount+1
- self:spin(3)
- self.keyPressing[4]=false
- end
-end
-function Player:act_rot180()
- if self.control and self.waiting==-1 and self.cur then
- self.ctrlCount=self.ctrlCount+2
- self:spin(2)
- self.keyPressing[5]=false
- end
-end
-function Player:act_hardDrop()
- local ENV=self.gameEnv
- if self.control and self.waiting==-1 and self.cur then
- if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frameself.ghoY then
- self:createDropFX()
- self.curY=self.ghoY
- self.spinLast=false
- if self.sound then
- SFX.play('drop',nil,self:getCenterX()*.15)
- if SETTING.vib>0 then VIB(SETTING.vib+1)end
- end
- end
- if ENV.shakeFX then
- self.swingOffset.vy=.6
- self.swingOffset.va=self.swingOffset.va+self:getCenterX()*6e-4
- end
- self.lockDelay=-1
- self:drop()
- self.keyPressing[6]=false
- end
- end
-end
-function Player:act_softDrop()
- local ENV=self.gameEnv
- self.downing=1
- if self.control and self.waiting==-1 and self.cur then
- if self.curY>self.ghoY then
- self.curY=self.curY-1
- self:freshBlock('fresh')
- self.spinLast=false
- self:checkTouchSound()
- elseif ENV.deepDrop then
- local CB=self.cur.bk
- local y=self.curY-1
- while self:ifoverlap(CB,self.curX,y)and y>0 do
- y=y-1
- end
- if y>0 then
- self.ghoY=y
- self:createDropFX()
- self.curY=y
- self:freshBlock('move')
- SFX.play('swipe')
- end
- end
- end
-end
-function Player:act_hold()
- if self.control then
- if self.waiting==-1 then
- self:hold()
- self.keyPressing[8]=false
- end
- end
-end
-function Player:act_func1()
- self.gameEnv.fkey1(self)
-end
-function Player:act_func2()
- self.gameEnv.fkey2(self)
-end
-
-function Player:act_insLeft(auto)
- if not self.cur then
- return
- end
- local x0=self.curX
- 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)
- end
- if self.curX~=x0 then
- self.spinLast=false
- self:checkTouchSound()
- end
- if self.gameEnv.shakeFX then
- self.swingOffset.vx=-1.5
- end
- if auto then
- if self.ctrlCount==0 then
- self.ctrlCount=1
- end
- else
- self.ctrlCount=self.ctrlCount+1
- end
-end
-function Player:act_insRight(auto)
- if not self.cur then
- return
- end
- local x0=self.curX
- 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)
- end
- if self.curX~=x0 then
- self.spinLast=false
- self:checkTouchSound()
- end
- if self.gameEnv.shakeFX then
- self.swingOffset.vx=1.5
- end
- if auto then
- if self.ctrlCount==0 then
- self.ctrlCount=1
- end
- else
- self.ctrlCount=self.ctrlCount+1
- end
-end
-function Player:act_insDown()
- if self.cur and self.curY>self.ghoY then
- local ENV=self.gameEnv
- self:createDropFX()
- if ENV.shakeFX then
- self.swingOffset.vy=.5
- end
- self.curY=self.ghoY
- self.lockDelay=ENV.lock
- self.spinLast=false
- self:freshBlock('fresh')
- self:checkTouchSound()
- end
-end
-function Player:act_down1()
- if self.cur and self.curY>self.ghoY then
- self:createMoveFX('down')
- self.curY=self.curY-1
- self:freshBlock('fresh')
- self.spinLast=false
- end
-end
-function Player:act_down4()
- if self.cur and self.curY>self.ghoY then
- local ghoY0=self.ghoY
- self.ghoY=max(self.curY-4,self.ghoY)
- self:createDropFX()
- self.curY,self.ghoY=self.ghoY,ghoY0
- self:freshBlock('fresh')
- self.spinLast=false
- end
-end
-function Player:act_down10()
- if self.cur and self.curY>self.ghoY then
- local ghoY0=self.ghoY
- self.ghoY=max(self.curY-10,self.ghoY)
- self:createDropFX()
- self.curY,self.ghoY=self.ghoY,ghoY0
- self:freshBlock('fresh')
- self.spinLast=false
- end
-end
-function Player:act_dropLeft()
- if self.cur then
- self:act_insLeft()
- self:act_hardDrop()
- end
-end
-function Player:act_dropRight()
- if self.cur then
- self:act_insRight()
- self:act_hardDrop()
- end
-end
-function Player:act_zangiLeft()
- if self.cur then
- self:act_insLeft()
- self:act_insDown()
- self:act_insRight()
- self:act_hardDrop()
- end
-end
-function Player:act_zangiRight()
- if self.cur then
- self:act_insRight()
- self:act_insDown()
- self:act_insLeft()
- self:act_hardDrop()
- end
-end
-----------------------------------------------------
return Player
diff --git a/parts/scenes/customGame.lua b/parts/scenes/customGame.lua
index 2844dbb5..930190a6 100644
--- a/parts/scenes/customGame.lua
+++ b/parts/scenes/customGame.lua
@@ -17,6 +17,7 @@ local sList={
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
hang={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
+ hurry={0,1,2,3,4,5,6,7,8,10,1e99},
eventSet=EVENTSETS,
holdMode={'hold','swap'},
}
@@ -212,7 +213,8 @@ scene.widgetList={
WIDGET.newSelector{name='lock', x=730,y=410,w=260,color='O',list=sList.lock,disp=CUSval('lock'),code=CUSsto('lock')},
WIDGET.newSelector{name='wait', x=730,y=520,w=260,color='G',list=sList.wait,disp=CUSval('wait'),code=CUSsto('wait')},
WIDGET.newSelector{name='fall', x=730,y=600,w=260,color='G',list=sList.fall,disp=CUSval('fall'),code=CUSsto('fall')},
- WIDGET.newSelector{name='hang', x=730,y=680,w=260,color='G',list=sList.hang,disp=CUSval('hang'),code=CUSsto('hang')},
+ WIDGET.newSelector{name='hurry', x=730,y=680,w=260,color='G',list=sList.hurry,disp=CUSval('hurry'),code=CUSsto('hurry')},
+ WIDGET.newSelector{name='hang', x=730,y=760,w=260,color='G',list=sList.hang,disp=CUSval('hang'),code=CUSsto('hang')},
--Copy / Paste / Start
WIDGET.newButton{name='copy', x=1070,y=300,w=310,h=70,color='lR',font=25,code=pressKey"cC"},
@@ -222,16 +224,16 @@ scene.widgetList={
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=pressKey"escape"},
--Rule set
- WIDGET.newSelector{name='eventSet', x=1050,y=740,w=340,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')},
+ WIDGET.newSelector{name='eventSet', x=1050,y=760,w=340,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')},
--Special rules
- WIDGET.newSwitch{name='ospin', x=850, y=820 ,lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
- WIDGET.newSwitch{name='fineKill', x=850, y=880 ,lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')},
- WIDGET.newSwitch{name='b2bKill', x=850, y=940 ,lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')},
- WIDGET.newSwitch{name='lockout', x=850, y=1000,lim=210,disp=CUSval('lockout'), code=CUSrev('lockout')},
- WIDGET.newSwitch{name='easyFresh', x=1170,y=820 ,lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')},
- WIDGET.newSwitch{name='deepDrop', x=1170,y=880 ,lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')},
- WIDGET.newSwitch{name='bone', x=1170,y=940 ,lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
+ WIDGET.newSwitch{name='ospin', x=850, y=830, lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
+ WIDGET.newSwitch{name='fineKill', x=850, y=890, lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')},
+ WIDGET.newSwitch{name='b2bKill', x=850, y=950, lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')},
+ WIDGET.newSwitch{name='lockout', x=850, y=1010,lim=210,disp=CUSval('lockout'), code=CUSrev('lockout')},
+ WIDGET.newSwitch{name='easyFresh', x=1170,y=830, lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')},
+ WIDGET.newSwitch{name='deepDrop', x=1170,y=890, lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')},
+ WIDGET.newSwitch{name='bone', x=1170,y=950, lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
--Next & Hold
WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=CUSval('holdMode'),code=CUSsto('holdMode')},
diff --git a/parts/scenes/dict.lua b/parts/scenes/dict.lua
index 97deb070..f3e5c7a7 100644
--- a/parts/scenes/dict.lua
+++ b/parts/scenes/dict.lua
@@ -12,7 +12,7 @@ local dict--Dict list
local result--Result Lable
local lastTickInput
-local waiting--Searching animation timer
+local searchWait--Searching animation timer
local selected--Selected option
local scrollPos--Scroll down length
@@ -53,7 +53,7 @@ local function _clearResult()
TABLE.cut(result)
selected=1
scrollPos=0
- waiting,lastSearch=0,false
+ searchWait,lastSearch=0,false
scene.widgetList.copy.hide=false
end
local function _search()
@@ -82,7 +82,7 @@ function scene.sceneInit()
inputBox:clear()
result={}
- waiting=0
+ searchWait=0
selected=1
scrollPos=0
@@ -153,13 +153,13 @@ function scene.update(dt)
if #input==0 then
_clearResult()
else
- waiting=.8
+ searchWait=.8
end
lastTickInput=input
end
- if waiting>0 then
- waiting=waiting-dt
- if waiting<=0 then
+ if searchWait>0 then
+ searchWait=searchWait-dt
+ if searchWait<=0 then
if #input>0 and input~=lastSearch then
_search()
end
@@ -202,7 +202,7 @@ function scene.draw()
gc.rectangle('line',300,180,958,526,5)
gc.rectangle('line',20,180,280,526,5)
- if waiting>0 then
+ if searchWait>0 then
local r=TIME()*2
local R=int(r)%7+1
gc.setColor(1,1,1,1-abs(r%1*2-1))
diff --git a/parts/scenes/net_newRoom.lua b/parts/scenes/net_newRoom.lua
index 8878dc97..39da4ad4 100644
--- a/parts/scenes/net_newRoom.lua
+++ b/parts/scenes/net_newRoom.lua
@@ -20,6 +20,8 @@ local sList={
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
+ hang={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
+ hurry={0,1,2,3,4,5,6,7,8,10,1e99},
eventSet=EVENTSETS,
}
@@ -87,6 +89,8 @@ scene.widgetList={
WIDGET.newSelector{name='lock', x=730,y=410,w=260,color='O',list=sList.lock,disp=ROOMval('lock'),code=ROOMsto('lock')},
WIDGET.newSelector{name='wait', x=730,y=520,w=260,color='G',list=sList.wait,disp=ROOMval('wait'),code=ROOMsto('wait')},
WIDGET.newSelector{name='fall', x=730,y=600,w=260,color='G',list=sList.fall,disp=ROOMval('fall'),code=ROOMsto('fall')},
+ WIDGET.newSelector{name='hurry', x=730,y=680,w=260,color='G',list=sList.hurry,disp=ROOMval('hurry'),code=ROOMval('hurry')},
+ WIDGET.newSelector{name='hang', x=730,y=760,w=260,color='G',list=sList.hang,disp=ROOMval('hang'),code=ROOMval('hang')},
--Capacity & Create & Back
WIDGET.newSelector{name='capacity', x=1070,y=330,w=310,color='lY',list={2,3,4,5,7,10,17,31,49,99},disp=ROOMval('capacity'),code=ROOMsto('capacity')},
@@ -94,16 +98,16 @@ scene.widgetList={
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
--Special rules
- WIDGET.newSwitch{name='ospin', x=850, y=760 ,lim=210,disp=ROOMval('ospin'), code=ROOMrev('ospin')},
- WIDGET.newSwitch{name='fineKill', x=850, y=850 ,lim=210,disp=ROOMval('fineKill'), code=ROOMrev('fineKill')},
- WIDGET.newSwitch{name='b2bKill', x=850, y=940 ,lim=210,disp=ROOMval('b2bKill'), code=ROOMrev('b2bKill')},
+ WIDGET.newSwitch{name='ospin', x=850, y=850, lim=210,disp=ROOMval('ospin'), code=ROOMrev('ospin')},
+ WIDGET.newSwitch{name='fineKill', x=850, y=910, lim=210,disp=ROOMval('fineKill'), code=ROOMrev('fineKill')},
+ WIDGET.newSwitch{name='b2bKill', x=850, y=970, lim=210,disp=ROOMval('b2bKill'), code=ROOMrev('b2bKill')},
WIDGET.newSwitch{name='lockout', x=850, y=1030,lim=210,disp=ROOMval('lockout'), code=ROOMval('lockout')},
- WIDGET.newSwitch{name='easyFresh', x=1170,y=760 ,lim=250,disp=ROOMval('easyFresh'),code=ROOMrev('easyFresh')},
- WIDGET.newSwitch{name='deepDrop', x=1170,y=850 ,lim=250,disp=ROOMval('deepDrop'), code=ROOMrev('deepDrop')},
- WIDGET.newSwitch{name='bone', x=1170,y=940 ,lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
+ WIDGET.newSwitch{name='easyFresh', x=1170,y=850, lim=250,disp=ROOMval('easyFresh'),code=ROOMrev('easyFresh')},
+ WIDGET.newSwitch{name='deepDrop', x=1170,y=910, lim=250,disp=ROOMval('deepDrop'), code=ROOMrev('deepDrop')},
+ WIDGET.newSwitch{name='bone', x=1170,y=970, lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
--Rule set
- WIDGET.newSelector{name='eventSet', x=310,y=880,w=360,color='H',list=sList.eventSet,disp=ROOMval('eventSet'),code=ROOMsto('eventSet')},
+ WIDGET.newSelector{name='eventSet', x=1050,y=760,w=340,color='H',list=sList.eventSet,disp=ROOMval('eventSet'),code=ROOMval('eventSet')},
--Next & Hold
WIDGET.newSlider{name='nextCount', x=140, y=960, lim=130,w=200,unit=6,disp=ROOMval('nextCount'),code=ROOMsto('nextCount')},
diff --git a/parts/scenes/setting_game.lua b/parts/scenes/setting_game.lua
index e481c336..690f0b7f 100644
--- a/parts/scenes/setting_game.lua
+++ b/parts/scenes/setting_game.lua
@@ -31,24 +31,24 @@ function scene.draw()
end
scene.widgetList={
- WIDGET.newText{name='title', x=640,y=15,font=80},
+ WIDGET.newText{name='title', x=640,y=15,font=80},
- WIDGET.newButton{name='graphic', x=200, y=80, w=240,h=80,color='lC',font=35,code=swapScene('setting_video','swipeR')},
- WIDGET.newButton{name='sound', x=1080, y=80, w=240,h=80,color='lC',font=35,code=swapScene('setting_sound','swipeL')},
+ WIDGET.newButton{name='graphic', x=200, y=80, w=240,h=80,color='lC',font=35,code=swapScene('setting_video','swipeR')},
+ WIDGET.newButton{name='sound', x=1080, y=80, w=240,h=80,color='lC',font=35,code=swapScene('setting_sound','swipeL')},
- WIDGET.newButton{name='layout', x=250, y=540, w=200,h=70,font=35,code=goScene'setting_skin'},
+ WIDGET.newButton{name='layout', x=250, y=540, w=200,h=70,font=35,code=goScene'setting_skin'},
- WIDGET.newButton{name='ctrl', x=290, y=220, w=320,h=80,font=35,code=goScene'setting_control'},
- WIDGET.newButton{name='key', x=640, y=220, w=320,h=80,color=MOBILE and'dH',font=35,code=goScene'setting_key'},
- WIDGET.newButton{name='touch', x=990, y=220, w=320,h=80,color=not MOBILE and'dH',font=35,code=goScene'setting_touch'},
- WIDGET.newSlider{name='reTime', x=330, y=320, w=300,lim=180,unit=10,disp=SETval('reTime'), code=SETsto('reTime'),show=function(S)return(.5+S.disp()*.25).."s"end},
- WIDGET.newSelector{name='RS', x=300, y=420, w=300,color='S', disp=SETval('RS'), code=SETsto('RS'),list={'TRS','SRS','SRS_plus','SRS_X','BiRS','ARS_Z','ASC','ASC_plus','C2','C2_sym','Classic','Classic_plus','None','None_plus'}},
- WIDGET.newSelector{name='menuPos', x=980, y=320, w=300,color='O', disp=SETval('menuPos'), code=SETsto('menuPos'),list={'left','middle','right'}},
- WIDGET.newSwitch{name='sysCursor' ,x=1060, y=390, lim=580, disp=SETval('sysCursor'),code=function()SETTING.sysCursor=not SETTING.sysCursor applyCursor()end},
- WIDGET.newSwitch{name='autoPause', x=1060, y=450, lim=580, disp=SETval('autoPause'),code=SETrev('autoPause')},
- WIDGET.newSwitch{name='autoSave', x=1060, y=500, lim=580, disp=SETval('autoSave'), code=SETrev('autoSave')},
- WIDGET.newSwitch{name='autoLogin', x=960, y=580, lim=480, disp=SETval('autoLogin'),code=SETrev('autoLogin')},
- WIDGET.newSwitch{name='simpMode', x=960, y=640, lim=480, disp=SETval('simpMode'),
+ WIDGET.newButton{name='ctrl', x=290, y=220, w=320,h=80,font=35,code=goScene'setting_control'},
+ WIDGET.newButton{name='key', x=640, y=220, w=320,h=80,color=MOBILE and'dH',font=35,code=goScene'setting_key'},
+ WIDGET.newButton{name='touch', x=990, y=220, w=320,h=80,color=not MOBILE and'dH',font=35,code=goScene'setting_touch'},
+ WIDGET.newSlider{name='reTime', x=330, y=320, w=300,lim=180,unit=10,disp=SETval('reTime'), code=SETsto('reTime'),show=function(S)return(.5+S.disp()*.25).."s"end},
+ WIDGET.newSelector{name='RS', x=300, y=420, w=300,color='S', disp=SETval('RS'), code=SETsto('RS'),list={'TRS','SRS','SRS_plus','SRS_X','BiRS','ARS_Z','ASC','ASC_plus','C2','C2_sym','Classic','Classic_plus','None','None_plus'}},
+ WIDGET.newSelector{name='menuPos',x=980, y=320, w=300,color='O', disp=SETval('menuPos'), code=SETsto('menuPos'),list={'left','middle','right'}},
+ WIDGET.newSwitch{name='sysCursor',x=1060, y=390, lim=580, disp=SETval('sysCursor'),code=function()SETTING.sysCursor=not SETTING.sysCursor applyCursor()end},
+ WIDGET.newSwitch{name='autoPause',x=1060, y=450, lim=580, disp=SETval('autoPause'),code=SETrev('autoPause')},
+ WIDGET.newSwitch{name='autoSave', x=1060, y=500, lim=580, disp=SETval('autoSave'), code=SETrev('autoSave')},
+ WIDGET.newSwitch{name='autoLogin',x=960, y=580, lim=480, disp=SETval('autoLogin'),code=SETrev('autoLogin')},
+ WIDGET.newSwitch{name='simpMode', x=960, y=640, lim=480, disp=SETval('simpMode'),
code=function()
SETTING.simpMode=not SETTING.simpMode
for i=1,#SCN.stack,2 do
@@ -58,7 +58,7 @@ scene.widgetList={
end
end
end},
- WIDGET.newButton{name='back', x=1140, y=640, w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
+ WIDGET.newButton{name='back', x=1140, y=640, w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
}
return scene