Compare commits

..

21 Commits

Author SHA1 Message Date
MrZ626
ed011173f6 版本推进 2021-11-14 16:53:43 +08:00
MrZ626
491fcb5860 添加缓冲区和消失区两个词条
Co-authored-by: C₂₉H₂₅N₃O₅ <cgu52@wisc.edu>
2021-11-14 16:45:53 +08:00
MrZ626
c2d5537d8d 经典模式添加干旱计数器 close #452 2021-11-14 16:45:50 +08:00
MrZ626
7d5037ae87 竞速-效率显示剩余行数 2021-11-14 12:37:39 +08:00
MrZ626
07d7714317 修正无尽模式标题首字母大小写错误 close #454 2021-11-14 12:19:26 +08:00
MrZ626
2cab97f37d 修复0arr时自动移动时声音特别响 2021-11-14 11:49:41 +08:00
MrZ626
d184778c9a 修正string扩展模块时间转换函数可能出现1分60(截断小数点后两位防止被向上取整) 2021-11-14 11:24:11 +08:00
MrZ626
9fd3b3008d 新增物品数据,每日登录新增加一个zTicket 2021-11-13 22:33:25 +08:00
MrZ626
71aa35b214 修正统计里的日期每次启动都被刷新了导致单日统计时间不对 2021-11-13 17:32:54 +08:00
MrZ626
4443dc9d3e table扩展模块添加一个方法(未来会整理类似数据表更新函数) 2021-11-13 17:29:17 +08:00
MrZ626
839e357301 修改更新历史 2021-11-13 16:31:46 +08:00
MrZ626
ac56c5a415 修改竞速-效率左侧信息栏 2021-11-13 16:23:27 +08:00
MrZ626
36e3343341 TRS的J5和L5新增一个180度踢墙 2021-11-13 16:14:36 +08:00
MrZ626
510f7d7513 版本推进 2021-11-13 05:42:36 +08:00
MrZ626
3128eb38c0 再调整一些模式的bgm 2021-11-13 05:41:27 +08:00
MrZ626
14ef654612 混战模式信息绘制从玩家类移到规则包 2021-11-13 05:21:59 +08:00
MrZ626
bc5193f95e 落块事件改名落块钩子
添加死亡钩子(仅在窒息和超高触发)
堆积模式消行动作挂到死亡钩子上
2021-11-13 05:20:32 +08:00
MrZ626
8cbb4a38bc dropPiece事件改名hook_drop 2021-11-12 23:20:29 +08:00
MrZ626
fce08c83ef 堆积模式移出地图,删除h难度 2021-11-12 21:17:30 +08:00
MrZ626
018e99f9e6 修正改评级文本后tip没改 2021-11-12 16:39:30 +08:00
MrZ626
7fe390b34b 赞助名单添加三位 2021-11-12 16:28:37 +08:00
96 changed files with 280 additions and 252 deletions

View File

@@ -63,9 +63,9 @@ function STRING.time(t)
if t<60 then
return format("%.3f\"",t)
elseif t<3600 then
return format("%d'%05.2f\"",int(t/60),t%60)
return format("%d'%05.2f\"",int(t/60),int(t%60*100)/100)
else
return format("%d:%.2d'%05.2f\"",int(t/3600),int(t/60%60),t%60)
return format("%d:%.2d'%05.2f\"",int(t/3600),int(t/60%60),int(t%60*100)/100)
end
end

View File

@@ -46,6 +46,18 @@ function TABLE.cover(new,old)
end
end
--For all things in new, push to old
function TABLE.coverR(new,old)
for k,v in next,new do
if type(v)=='table'and type(old[k])=='table'then
TABLE.coverR(v,old[k])
else
old[k]=v
end
end
end
--For all things in new if same type in old, push to old
function TABLE.update(new,old)
for k,v in next,new do

View File

@@ -205,7 +205,7 @@ Z.setOnQuit(destroyPlayers)
TABLE.cover (FILE.load('conf/user')or{},USER)
TABLE.cover (FILE.load('conf/unlock')or{},RANKS)
TABLE.update(FILE.load('conf/settings')or{},SETTING)
TABLE.update(FILE.load('conf/data')or{},STAT)
TABLE.coverR(FILE.load('conf/data')or{},STAT)
TABLE.cover (FILE.load('conf/key')or{},KEY_MAP)
TABLE.cover (FILE.load('conf/virtualkey')or{},VK_ORG)
@@ -450,7 +450,7 @@ do
fs.remove('record/round_l.rec')
fs.remove('record/round_u.rec')
end
if STAT.version<1604 then
if RANKS.stack_e then
RANKS.stack_e=nil
RANKS.stack_h=nil
RANKS.stack_u=nil

View File

@@ -353,8 +353,8 @@ do
[21]={'+0+0','-1+0','-1+1','+0+1','-1+2','+0+2','-1-1','+1+0','+0-2','-1-2'},
[32]={'+0+0','-1+0','-1+1','-1-1','+1+0','+0+2','-1+2','+0-2'},
[23]={'+0+0','+1+0','+1-1','+1+1','-1+0','+0-2','+1-2','+0+2'},
[02]={'+0+0','+0-1','+1-1','-1+0','+2-1'},
[20]={'+0+0','+0+1','-1+1','+1+0','-2+1'},
[02]={'+0+0','+0-1','-1-1','+1-1','-1+0','+2-1'},
[20]={'+0+0','+0+1','+1+1','-1+1','+1+0','-2+1'},
[13]={'+0+0','-1+0','-1-1','+0+1','-1-2'},
[31]={'+0+0','+1+0','+1+1','+0-1','+1+2'},
},--J5

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,0,generateLine(P.holeRND:random(10)))
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,120,generateLine(P.holeRND:random(10)))
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,30,generateLine(P.holeRND:random(10)))
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,60,generateLine(P.holeRND:random(10)))
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.row>0 then
for _=1,#P.clearedRow do
local h=#P.field

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.row==0 then
P:lose()
else

View File

@@ -6,7 +6,7 @@ return{
mText(TEXTOBJ.atk,63,243)
mText(TEXTOBJ.eff,63,363)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.atk>=100 then
P:win('finish')
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.garbageBeneath==0 then
local D=P.modeData
D.finished=D.finished+1

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=10 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=100 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=1000 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=20 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=200 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=40 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=400 then
P:win('finish')
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if #PLY_ALIVE>1 then
P.control=false
local id1=P.sid

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.stat.piece%7==0 and #PLY_ALIVE>1 then
P.control=false
local id1=P.sid

View File

@@ -1,3 +1,4 @@
local gc_setColor=love.graphics.setColor
return{
das=16,arr=6,
sddas=6,sdarr=6,
@@ -18,12 +19,24 @@ return{
mStr(r<10 and 9 or r<30 and r or("%02x"):format(r*10-300),63,210)
mText(TEXTOBJ.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
if P.modeData.drought>7 then
if P.modeData.drought<=14 then
gc_setColor(1,1,1,P.modeData.drought/7-1)
else
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
gc_setColor(1,gb,gb)
end
setFont(50)
mStr(P.modeData.drought,63,130)
mDraw(MODES.drought_l.icon,63,200,nil,.5)
end
end,
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
if P.stat.row>=D.target then
if D.target==110 then
P.gameEnv.drop,P.gameEnv.lock=5,5

View File

@@ -1,3 +1,4 @@
local gc_setColor=love.graphics.setColor
return{
das=16,arr=6,
sddas=3,sdarr=3,
@@ -15,14 +16,25 @@ return{
mesDisp=function(P)
setFont(75)
local r=P.modeData.target/10
mStr(r<11 and 18 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
mStr(r<10 and 9 or r<30 and r or("%02x"):format(r*10-300),63,210)
mText(TEXTOBJ.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
if P.modeData.drought>7 then
if P.modeData.drought<=14 then
gc_setColor(1,1,1,P.modeData.drought/7-1)
else
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
gc_setColor(1,gb,gb)
end
setFont(50)
mStr(P.modeData.drought,63,130)
mDraw(MODES.drought_l.icon,63,200,nil,.5)
end
end,
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
if P.stat.row>=D.target then
if D.target==110 then

View File

@@ -1,3 +1,4 @@
local gc_setColor=love.graphics.setColor
return{
das=16,arr=6,
sddas=1,sdarr=1,
@@ -15,14 +16,25 @@ return{
mesDisp=function(P)
setFont(75)
local r=P.modeData.target/10
mStr(r==1 and 29 or("%02x"):format(r*10-20),63,210)
mStr(r<10 and 9 or r<30 and r or("%02x"):format(r*10-300),63,210)
mText(TEXTOBJ.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
if P.modeData.drought>7 then
if P.modeData.drought<=14 then
gc_setColor(1,1,1,P.modeData.drought/7-1)
else
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
gc_setColor(1,gb,gb)
end
setFont(50)
mStr(P.modeData.drought,63,130)
mDraw(MODES.drought_l.icon,63,200,nil,.5)
end
end,
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
if P.stat.row>=D.target then
if D.target==100 then

View File

@@ -3,7 +3,7 @@ return{
setFont(55)
mStr(100-P.stat.dig,63,265)
end,
dropPiece=function(P)
hook_drop=function(P)
for _=1,math.min(10,100-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end

View File

@@ -3,7 +3,7 @@ return{
setFont(55)
mStr(10-P.stat.dig,63,265)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.dig==10 then
P:win('finish')
end

View File

@@ -3,7 +3,7 @@ return{
setFont(55)
mStr(400-P.stat.dig,63,265)
end,
dropPiece=function(P)
hook_drop=function(P)
for _=1,math.min(10,400-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end

View File

@@ -3,7 +3,7 @@ return{
setFont(55)
mStr(40-P.stat.dig,63,265)
end,
dropPiece=function(P)
hook_drop=function(P)
for _=1,math.min(10,40-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end

View File

@@ -11,7 +11,7 @@ return{
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
local flag
local l=P.lastPiece
if P.combo>1 then flag=true;P:showText("2x",0,-220,40,'flicker',.3)end

View File

@@ -10,7 +10,7 @@ return
task=function(P)
P.modeData.target=50
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==50 then
P.gameEnv.drop=.25

View File

@@ -30,7 +30,7 @@ return
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target%300==0 then
P.gameEnv.wait=P.gameEnv.wait-1

View File

@@ -12,7 +12,7 @@ return
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')

View File

@@ -30,7 +30,7 @@ return{
mStr(P.stat.row,63,230)
mStr(P.stat.clears[4],63,340)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.modeData.rankPoint<140-passPoint then--If Less then X
local R=#P.clearedRow
if R>0 then

View File

@@ -8,7 +8,7 @@ return{
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
local c=#P.clearedRow

View File

@@ -12,7 +12,7 @@ return{
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
local c=#P.clearedRow

View File

@@ -14,7 +14,7 @@ return
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')

View File

@@ -12,7 +12,7 @@ return{
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
local c=#P.clearedRow

View File

@@ -13,7 +13,7 @@ return
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
dropPiece=function(P)
hook_drop=function(P)
local p=P.modeData.pt+P.lastPiece.row
if p>=P.modeData.target then
local ENV=P.gameEnv

View File

@@ -5,7 +5,7 @@ return{
mStr(P.stat.pc,63,340)
mText(TEXTOBJ.pc,63,410)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.pc and P.stat.row%4==0 then
P.gameEnv.heightLimit=4
if P.stat.pc%5==0 then

View File

@@ -46,6 +46,6 @@ return{
mStr(P.stat.pc,63,340)
mText(TEXTOBJ.pc,63,410)
end,
dropPiece=check,
hook_drop=check,
task=check,
}

View File

@@ -37,6 +37,6 @@ return{
mStr(P.stat.pc,63,340)
mText(TEXTOBJ.pc,63,410)
end,
dropPiece=check,
hook_drop=check,
task=check,
}

View File

@@ -1,5 +1,24 @@
local gc=love.graphics
local gc_draw,gc_print,gc_setColor=gc.draw,gc.print,gc.setColor
local setFont=setFont
local PLAYERS,PLY_ALIVE=PLAYERS,PLY_ALIVE
return{
mesDisp=function(P)
PLY.draw.drawRoyaleInfo(P)
setFont(35)
mStr(#PLY_ALIVE.."/"..#PLAYERS,63,175)
mStr(P.modeData.ko,80,215)
gc_draw(TEXTOBJ.ko,60-TEXTOBJ.ko:getWidth(),222)
setFont(20)
gc_setColor(1,.5,0,.6)
gc_print(P.badge,103,227)
gc_setColor(.97,.97,.97)
setFont(25)
mStr(text.powerUp[P.strength],63,290)
gc_setColor(1,1,1)
for i=1,P.strength do
gc_draw(IMG.badgeIcon,16*i+6,260)
end
end,
}

View File

@@ -0,0 +1,19 @@
return{
mesDisp=function(P)
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,63,170)
PLY.draw.drawTargetLine(P,r)
setFont(45)
mStr(("%.1f"):format(P.stat.atk),63,270)
mText(TEXTOBJ.atk,63,323)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,370)
mText(TEXTOBJ.eff,63,423)
end,
hook_drop=function(P)
if P.stat.row>=40 then
P:win('finish')
end
end
}

View File

@@ -36,7 +36,7 @@ return{
end
end
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=40 then
P:win('finish')
end

View File

@@ -14,7 +14,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
local F=P.field
for y=1,#F do
local l=F[y]

View File

@@ -7,9 +7,9 @@ return{
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,20,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
hook_die=function(P)
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
if cc>0 then
local h=20-cc-P.garbageBeneath
if h>0 then
P:garbageRise(21,h,2e10-1)

View File

@@ -1,22 +0,0 @@
return{
fieldH=21,
fillClear=false,
mesDisp=function(P)
setFont(60)
mStr(P.stat.row,63,280)
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,18,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
local h=20-cc-P.garbageBeneath-2
if h>0 then
P:garbageRise(21,h,2e10-1)
if P.garbageBeneath>=20 then
P:lose()
end
end
end
end,
}

View File

@@ -7,9 +7,9 @@ return{
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,17,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
hook_die=function(P)
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
if cc>0 then
local h=20-cc-P.garbageBeneath-3
if h>0 then
P:garbageRise(21,h,2e10-1)

View File

@@ -4,7 +4,7 @@ return{
mStr(P.stat.clear[7][4],63,250)
mText(TEXTOBJ.techrash,63,315)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.row>0 and P.lastPiece.row<4 then
P:lose()
end

View File

@@ -8,12 +8,12 @@ return{
PLY.draw.applyField(P)
local L=P.modeData.history
for i=1,#L do
gc.setColor(1,.3,.3,.45-i*.04)
gc.setColor(1,.3,.3,.5-i*.04)
gc.rectangle('fill',30*L[i]-30,0,30,600)
end
PLY.draw.cancelField(P)
end,
dropPiece=function(P)
hook_drop=function(P)
local C=P.lastPiece
if C.row>0 then
if C.row==4 then

View File

@@ -4,7 +4,7 @@ return{
mStr(P.modeData.tsd,63,250)
mText(TEXTOBJ.tsd,63,315)
end,
dropPiece=function(P)
hook_drop=function(P)
local C=P.lastPiece
if C.row>0 then
if C.id==5 and C.row==2 and C.spin then

View File

@@ -13,7 +13,7 @@ return{
PLY.draw.cancelField(P)
end
end,
dropPiece=function(P)
hook_drop=function(P)
local C=P.lastPiece
if C.row>0 then
if C.id==5 and C.row==2 and C.spin then

View File

@@ -8,12 +8,12 @@ return{
PLY.draw.applyField(P)
local L=P.modeData.history
for i=1,#L do
gc.setColor(1,.3,.3,.3-i*.05)
gc.setColor(1,.3,.3,.4-i*.05)
gc.rectangle('fill',30*L[i]-30,0,30,600)
end
PLY.draw.cancelField(P)
end,
dropPiece=function(P)
hook_drop=function(P)
local C=P.lastPiece
if C.row>0 then
if C.id==5 and C.row==2 and C.spin then

View File

@@ -228,6 +228,9 @@ end
--Game
function getItem(itemName,amount)
STAT.item[itemName]=STAT.item[itemName]+(amount or 1)
end
function coin(a,b)
if rnd()<.5 then
return a
@@ -275,9 +278,11 @@ function freshDate(mode)
if STAT.date~=date then
STAT.date=date
STAT.todayTime=0
getItem('zTicket',1)
if not mode:find'q'then
MES.new('info',text.newDay)
end
saveStats()
return true
end
end

View File

@@ -726,6 +726,10 @@ do--Userdata tables
spin=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0,0}end return L end)(),
pc=0,hpc=0,b2b=0,b3b=0,score=0,
lastPlay='sprint_10l',--Last played mode ID
item=setmetatable({},{__index=function(self,k)
self[k]=0
return 0
end}),
date=false,
todayTime=0,
}

View File

@@ -662,6 +662,16 @@ return{
"term",
"Modern Tetris games have three different conditions in which the player tops out:\n1. Block out: when a piece spawned overlaps with the existing blocks in the field;\n2. Lock out: when a piece locks entirely above the skyline;\n3. Garbage out: when the stack exceeds 40 lines in height (often due to incoming garbage).\nTechmino does not check for locking out and garbage out.",
},
{"Buffer zone",
"buffer zone",
"term",
"",--TODO
},
{"Vanish zone",
"vanish zone",
"term",
"",--TODO
},
{"Falling speed",
"fallingspeed",
"term",

View File

@@ -687,6 +687,16 @@ return{
"term",
"现代方块普遍使用的死亡判定:\n1. 新出现的方块和场地方块有重叠窒息Top Outc4w比s4w强的原因因为被打进18行都不会窒息\n2. 方块锁定时完全在场地的外面Block Out\n3. 场地内现存方块总高度大于40。部分游戏可能没有这条判定而是会自动“切除”场地内所有高度大于40的部分Vanish Zone\n\n注:本游戏使用的死亡判定不包含上述的第二条和第三条。",
},
{"缓冲区",
"缓冲区 buffer zone huanchongqu",
"term",
"不是所有游戏都有这个概念指10×20可见场地之上的21~40行。因为垃圾行顶起后两边堆高的方块可能会超出屏幕消行后这些方块要重新回到场地内所以需要保存下来由于程序上要求场地尺寸有限部分游戏可以无限故设定为40一般都够用。\n\n另见“消失区”词条。",
},
{"消失区",
"消失区 vanish zone xiaoshiqu",
"term",
"在缓冲区的基础上指比40行缓冲区还高的区域。\n标准的死亡判定涉及了这个概念在垃圾行升起后如果场地上有任何方块超出了40高的缓冲区也就是达到了消失区时游戏直接结束。\n但事实上这块区域在不同游戏中表现不同甚至有设计者考虑不周导致方块挪到40行以上所以程序没考虑导致方块接触消失区直接报错闪退的游戏。通常出现在玩家堆了c4w然后被打入大量垃圾行时才会考虑这个概念。其他游戏中方块进入消失区可能直接导致游戏结束也有可能会出现一些奇怪的bug。\n\nJstris中22行及以上可以理解为消失区锁定在21行之外的格子会消失。",
},
{"下落速度",
"下落速度 重力 drop speed zhongli gravity",
"term",

View File

@@ -677,9 +677,6 @@ return{
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines"},
['drought_n']= {"Drought", "100L", "No I-pieces available"},
['drought_l']= {"Drought+", "100L", "W T F"},
['stack_e']= {"Stack", "EASY", "Pack them!"},
['stack_h']= {"Stack", "HARD", "Pack them!"},
['stack_u']= {"Stack", "ULTIMATE", "Pack them!"},
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
@@ -752,7 +749,7 @@ return{
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
['zen']= {'Zen', "200", "A 200-line run without a time limit"},
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
['infinite']= {'infinite', "", "Just a sandbox"},
['infinite']= {"Infinite", "", "Just a sandbox"},
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
@@ -834,7 +831,7 @@ return{
"Powered by Un..LÖVE",
"pps-0.01",
"Server down randomly",
"Some requirements to achieve rank S are intentionally set to be difficult for even the best players.",
"Some requirements to achieve rank X are intentionally set to be difficult for even the best players.",
"Soon you'll be able to play against friends and foes all over the world.",
"Split clear coming soon!",
"sudo rm -rf /*",

View File

@@ -636,9 +636,6 @@ return{
['dig_400l']= {"Queso", "400L", "Limpia 400 líneas de queso."},
['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"},
['drought_l']= {"Sequía+", "100L", "Guat de foc..."},
['stack_e']= {"Stack", "Fácil", "¡Sin dejar huecos!"},
['stack_h']= {"Stack", "Difícil", "¡Sin dejar huecos!"},
['stack_u']= {"Stack", "Supremo", "¡Sin dejar huecos!"},
['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."},
['marathon_h']= {"Maratón", "Difícil", "Maratón de 200 líneas a velocidad máxima."},
['solo_e']= {"VS.", "Fácil", "¡Derrota a la CPU!"},

View File

@@ -638,7 +638,6 @@ return{
['drought_n']= {"Drought", "100L", "Pas de pièce I !"},
['drought_l']= {"Drought+", "100L", "WTF ??!!"},
-- ['stack_e']= {"Stack", "FACILE", "Pack them!"},
-- ['stack_h']= {"Stack", "DIFFICILE", "Pack them!"},
-- ['stack_u']= {"Stack", "ULTIME", "Pack them!"},
['marathon_n']= {"Marathon", "NORMAL", "Marathon de 200 lignes."},
['marathon_h']= {"Marathon", "DIFFICILE", "Marathon de 200 lignes à très haute vitesse"},

View File

@@ -668,7 +668,6 @@ return{
['drought_n']= {"Drought", "100L", "Sem peça I !"},
['drought_l']= {"Drought+", "100L", "WTF"},
-- ['stack_e']= {"Stack", "FÁCIL", "Pack them!"},
-- ['stack_h']= {"Stack", "DIFÍCIL", "Pack them!"},
-- ['stack_u']= {"Stack", "ULTIMATE", "Pack them!"},
['marathon_n']= {"Maratona", "NORMAL", "200-line Maratona com velocidade aumentando."},
['marathon_h']= {"Maratona", "DIFÍCIL", "200-line Maratona com velocidade alta."},

View File

@@ -206,9 +206,6 @@ return{fallback='zh',
['dig_400l']= {"挖掘", "400L", "挖400行"},
['drought_n']= {"干旱", "100L", "放轻松,简单得很"},
['drought_l']= {"干旱+", "100L", "有趣的要来了"},
['stack_e']= {"堆叠", "简单", "智力启蒙玩具(确信"},
['stack_h']= {"堆叠", "困难", "智力启蒙玩具(确信"},
['stack_u']= {"堆叠", "极限", "智力启蒙玩具(确信"},
['marathon_n']= {"马拉松", "普通", "休闲模式"},
['marathon_h']= {"马拉松", "困难", "休闲模式"},
['solo_e']= {"单挑", "简单", "鲨AI"},

View File

@@ -681,9 +681,6 @@ return{
['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['drought_n']= {"干旱", "100L", "你I没了"},
['drought_l']= {"干旱+", "100L", "后 妈 发 牌"},
['stack_e']= {"堆积", "简单", "搭积木"},
['stack_h']= {"堆积", "困难", "搭积木"},
['stack_u']= {"堆积", "极限", "搭积木"},
['marathon_n']= {"马拉松", "普通", "200行加速马拉松"},
['marathon_h']= {"马拉松", "困难", "200行高速马拉松"},
['solo_e']= {"单挑", "简单", "打败AI"},
@@ -933,7 +930,7 @@ return{
"请勿大力敲打设备敲坏了就没有Techmino玩了",
"请勿使用三只手游玩",
"去玩别的方块的时候记得没有Ospin",
"全球应该没人能全S评价(大爆炸不算)",
"全球目前应该没人能全X评价(大爆炸不算)",
"群友翻译的中文方块百科全书! tetris.huijiwiki.com",
"让他三尺又何妨",
"如何O-spin: 一秒转626圈(误",

View File

@@ -95,9 +95,6 @@ return{
['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['drought_n']= {"干旱", "100行", "你I没了"},
['drought_l']= {"干旱+", "100行", "后 妈 发 牌"},
['stack_e']= {"堆积", "简单", "搭积木"},
['stack_h']= {"堆积", "困难", "搭积木"},
['stack_u']= {"堆积", "极限", "搭积木"},
['marathon_n']= {"马拉松", "普通", "200行加速马拉松"},
['marathon_h']= {"马拉松", "困难", "200行高速马拉松"},
['solo_e']= {"单挑", "简单", "打败机器人"},

View File

@@ -678,9 +678,6 @@ return{
['dig_400l']= {"挖掘", "400升", "挖400条垃圾线"},
['drought_n']= {"干旱", "100升", "没有工装"},
['drought_l']= {"干旱+", "100升", "搞什么呀"},
['stack_e']= {"堆栈", "容易", "打包!"},
['stack_h']= {"堆栈", "硬的", "打包!"},
['stack_u']= {"堆栈", "终极", "打包!"},
['marathon_n']= {"马拉松赛跑", "正常", "200线加速马拉松"},
['marathon_h']= {"马拉松赛跑", "硬的", "200线高速马拉松"},
['solo_e']= {"战争", "容易", "打败AI"},

View File

@@ -681,9 +681,6 @@ return{
['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['drought_n']= {"乾旱", "100L", "你I沒了"},
['drought_l']= {"乾旱+", "100L", "後 媽 發 牌"},
['stack_e']= {"堆疊", "簡單", "搭積木"},
['stack_h']= {"堆疊", "困難", "搭積木"},
['stack_u']= {"堆疊", "極限", "搭積木"},
['marathon_n']= {"馬拉松", "普通", "200行加速馬拉松"},
['marathon_h']= {"馬拉松", "困難", "200行高速馬拉松"},
['solo_e']= {"單挑", "簡單", "打敗AI"},

View File

@@ -1,7 +1,7 @@
return{
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH','stack_e'}},
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH'}},
{name='sprint_100l', x=-200, y=0, size=50,shape=1,icon="sprint2", unlock={'sprint_400l','drought_n'}},
{name='sprint_400l', x=-400, y=0, size=40,shape=1,icon="sprint3", unlock={'sprint_1000l'}},
{name='sprint_1000l', x=-600, y=0, size=40,shape=1,icon="sprint3"},
@@ -12,10 +12,6 @@ return{
{name='drought_n', x=-400, y=200, size=40,shape=1,icon="drought", unlock={'drought_l'}},
{name='drought_l', x=-600, y=200, size=40,shape=1,icon="drought"},
{name='stack_e', x=-200, y=-400, size=40,shape=1,icon="mess", unlock={'stack_h'}},
{name='stack_h', x=-400, y=-400, size=40,shape=1,icon="mess", unlock={'stack_u'}},
{name='stack_u', x=-600, y=-400, size=40,shape=1,icon="mess"},
{name='dig_10l', x=-200, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_40l'}},
{name='dig_40l', x=-400, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_100l'}},
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_400l'}},

View File

@@ -2,9 +2,9 @@ return{
env={
drop=10,lock=60,
freshLimit=15,
dropPiece={
require'parts.eventsets.backfire_60'.dropPiece,
require'parts.eventsets.checkAttack_100'.dropPiece,
hook_drop={
require'parts.eventsets.backfire_60'.hook_drop,
require'parts.eventsets.checkAttack_100'.hook_drop,
},
mesDisp=function(P)
setFont(60)

View File

@@ -2,9 +2,9 @@ return{
env={
drop=5,lock=45,
freshLimit=15,
dropPiece={
require'parts.eventsets.backfire_30'.dropPiece,
require'parts.eventsets.checkAttack_100'.dropPiece,
hook_drop={
require'parts.eventsets.backfire_30'.hook_drop,
require'parts.eventsets.checkAttack_100'.hook_drop,
},
mesDisp=function(P)
setFont(60)

View File

@@ -1,9 +1,9 @@
return{
env={
drop=30,lock=60,
dropPiece={
require'parts.eventsets.backfire_120'.dropPiece,
require'parts.eventsets.checkAttack_100'.dropPiece,
hook_drop={
require'parts.eventsets.backfire_120'.hook_drop,
require'parts.eventsets.checkAttack_100'.hook_drop,
},
mesDisp=function(P)
setFont(60)

View File

@@ -2,9 +2,9 @@ return{
env={
drop=2,lock=30,
freshLimit=10,
dropPiece={
require'parts.eventsets.backfire_0'.dropPiece,
require'parts.eventsets.checkAttack_100'.dropPiece,
hook_drop={
require'parts.eventsets.backfire_0'.hook_drop,
require'parts.eventsets.checkAttack_100'.hook_drop,
},
mesDisp=function(P)
setFont(60)

View File

@@ -2,7 +2,7 @@ return{
env={
drop=5,lock=30,
freshLimit=15,ospin=false,
dropPiece=require'parts.eventsets.c4wCheck_hard'.dropPiece,
hook_drop=require'parts.eventsets.c4wCheck_hard'.hook_drop,
eventSet='c4wBase',
bg='rgb',bgm='oxygen',
},

View File

@@ -2,7 +2,7 @@ return{
env={
drop=30,lock=60,infHold=true,
freshLimit=15,ospin=false,
dropPiece=require'parts.eventsets.c4wCheck_easy'.dropPiece,
hook_drop=require'parts.eventsets.c4wCheck_easy'.hook_drop,
eventSet='c4wBase',
bg='rgb',bgm='oxygen',
},

View File

@@ -5,9 +5,9 @@ return{
--Switch clear sprint mode on
if #FIELD[1]>0 then
GAME.modeEnv.dropPiece=require'parts.eventsets.checkClearBoard'.dropPiece
GAME.modeEnv.hook_drop=require'parts.eventsets.checkClearBoard'.hook_drop
else
GAME.modeEnv.dropPiece=NULL
GAME.modeEnv.hook_drop=NULL
end
PLY.newPlayer(1)
local AItype=GAME.modeEnv.opponent:sub(1,2)

View File

@@ -4,7 +4,7 @@ local ply_applyField=PLY.draw.applyField
return{
env={
fkey1=function(P)P.modeData.showMark=1-P.modeData.showMark end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
local F=FIELD[D.finished+1]
for y=1,#F do

View File

@@ -30,7 +30,7 @@ return{
drop=1e99,lock=1e99,
infHold=true,
pushSpeed=1.2,
dropPiece=check_rise,
hook_drop=check_rise,
mesDisp=function(P)
setFont(45)
mStr(P.stat.dig,63,190)

View File

@@ -1,7 +1,7 @@
return{
env={
drop=60,lock=60,
eventSet='checkLine_40',
eventSet='sprintEff_40',
bg='bg2',bgm='race',
},
score=function(P)return{P.stat.atk/P.stat.row,P.stat.time}end,

View File

@@ -3,7 +3,7 @@ return{
drop=60,lock=180,
keyCancel={1,2,11,12,17,18,19,20},
eventSet='checkLine_40',
bg='aura',bgm='waterfall',
bg='aura',bgm='there',
},
getRank=function(P)
local L=P.stat.row

View File

@@ -3,7 +3,7 @@ return{
drop=60,lock=180,
keyCancel={3,4,5},
eventSet='checkLine_40',
bg='aura',bgm='waterfall',
bg='aura',bgm='there',
},
getRank=function(P)
local L=P.stat.row

View File

@@ -2,7 +2,7 @@ return{
env={
drop=60,lock=60,
eventSet='sprintSym',
bg='aura',bgm='waterfall',
bg='aura',bgm='there',
},
getRank=function(P)
if P.stat.row<40 then return end

View File

@@ -3,22 +3,8 @@ return{
drop=60,lock=60,
wait=0,fall=50,
garbageSpeed=30,
highCam=false,
seqData={1,2,3,4,5,6,7},
eventSet='stack_e',
bg='blockrain',bgm='there',
},
score=function(P)return{P.stat.row,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines".." "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=175 and 4 or
L>=150 and 3 or
L>=120 and 2 or
L>=90 and 1 or
L>=30 and 0
end,
}

View File

@@ -1,24 +0,0 @@
return{
env={
drop=60,lock=60,
wait=0,fall=50,
highCam=false,
garbageSpeed=30,
seqData={1,2,3,4,5,6,7,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25},
eventSet='stack_h',
bg='blockrain',bgm='there',
},
score=function(P)return{P.stat.row,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines".." "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=80 and 5 or
L>=70 and 4 or
L>=60 and 3 or
L>=50 and 2 or
L>=35 and 1 or
L>=20 and 0
end,
}

View File

@@ -2,23 +2,9 @@ return{
env={
drop=60,lock=60,
wait=0,fall=50,
highCam=false,
garbageSpeed=30,
seqData={8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25},
eventSet='stack_u',
bg='blockrain',bgm='there',
},
score=function(P)return{P.stat.row,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines".." "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=60 and 5 or
L>=50 and 4 or
L>=45 and 3 or
L>=30 and 2 or
L>=20 and 1 or
L>=10 and 0
end,
}

View File

@@ -17,7 +17,7 @@ return{
drop=1e99,lock=60,
freshLimit=15,
fineKill=true,
dropPiece=tech_check_hard,
hook_drop=tech_check_hard,
bg='flink',bgm='infinite',
},
slowMark=true,

View File

@@ -15,7 +15,7 @@ return{
env={
drop=30,lock=60,
freshLimit=15,
dropPiece=tech_check_hard,
hook_drop=tech_check_hard,
eventSet='checkAttack_100',
bg='matrix',bgm='down',
},

View File

@@ -15,7 +15,7 @@ return{
env={
drop=0,lock=60,
freshLimit=15,
dropPiece=tech_check_hard,
hook_drop=tech_check_hard,
eventSet='checkAttack_100',
bg='matrix',bgm='warped',
},

View File

@@ -15,7 +15,7 @@ return{
env={
infHold=true,
drop=1e99,lock=1e99,
dropPiece=tech_check_hard,
hook_drop=tech_check_hard,
eventSet='checkAttack_100',
bg='matrix',bgm='new era',
},

View File

@@ -4,7 +4,7 @@ return{
freshLimit=15,
ospin=false,
eventSet='techrash_n',
bg='matrix',bgm='vapor',
bg='matrix',bgm='magicblock',
},
getRank=function(P)
local T=P.stat.clear[7][4]

View File

@@ -4,7 +4,7 @@ return{
freshLimit=15,
ospin=false,
eventSet='techrash_u',
bg='matrix',bgm='vapor',
bg='matrix',bgm='magicblock',
},
getRank=function(P)
local T=P.stat.clear[7][4]

View File

@@ -118,4 +118,7 @@ return{
{font=25,name="Trebor"},
{font=25,name="[w*o]"},
{font=25,name="蚂蚁"},
{font=25,name="小丘"},
{font=25,name="[*)]"},
{font=25,name="费尔特林"},
}

View File

@@ -16,7 +16,6 @@ local shader_alpha,shader_lighter=SHADER.alpha,SHADER.lighter
local shader_fieldSatur,shader_blockSatur=SHADER.fieldSatur,SHADER.blockSatur
local TEXTOBJ,ENUM_MISSION,BLOCK_COLORS=TEXTOBJ,ENUM_MISSION,BLOCK_COLORS
local PLAYERS,PLY_ALIVE=PLAYERS,PLY_ALIVE
local RCPB={10,33,200,33,105,5,105,60}
local attackColor={
@@ -694,22 +693,6 @@ function draw.drawProgress(s1,s2)
mStr(s2,62,376)
gc_rectangle('fill',15,375,90,4,2)
end
function draw.drawRoyaleInfo(P)
setFont(35)
mStr(#PLY_ALIVE.."/"..#PLAYERS,63,175)
mStr(P.modeData.ko,80,215)
gc_draw(TEXTOBJ.ko,60-TEXTOBJ.ko:getWidth(),222)
setFont(20)
gc_setColor(1,.5,0,.6)
gc_print(P.badge,103,227)
gc_setColor(.97,.97,.97)
setFont(25)
mStr(text.powerUp[P.strength],63,290)
gc_setColor(1,1,1)
for i=1,P.strength do
gc_draw(IMG.badgeIcon,16*i+6,260)
end
end
function draw.norm(P,repMode)
local ENV=P.gameEnv

View File

@@ -61,7 +61,8 @@ return{
noInitSZO=false,
mesDisp={},
dropPiece={},
hook_drop={},
hook_die={},
task={},
eventSet="X",

View File

@@ -303,7 +303,8 @@ local function _applyGameEnv(P)--Finish gameEnv processing
--Apply events
ENV.mesDisp=_mergeFuncTable(ENV.mesDisp,{})
ENV.dropPiece=_mergeFuncTable(ENV.dropPiece,{})
ENV.hook_drop=_mergeFuncTable(ENV.hook_drop,{})
ENV.hook_die=_mergeFuncTable(ENV.hook_die,{})
ENV.task=_mergeFuncTable(ENV.task,{})
--Apply eventSet
@@ -314,7 +315,8 @@ local function _applyGameEnv(P)--Finish gameEnv processing
for k,v in next,eventSet do
if
k=='mesDisp'or
k=='dropPiece'or
k=='hook_drop'or
k=='hook_die'or
k=='task'
then
_mergeFuncTable(v,ENV[k])

View File

@@ -313,10 +313,13 @@ function Player:setRS(RSname)
end
end
function Player:triggerDropEvents()
local L=self.gameEnv.dropPiece
for i=1,#L do
L[i](self)
function Player:_triggerEvent(eventName)
local L=self.gameEnv[eventName]
if L[1]then
for i=1,#L do
L[i](self)
end
return true
end
end
@@ -378,9 +381,22 @@ function Player:garbageRise(color,amount,line)--Release n-lines garbage to field
_=self.dropFX[i]
_[3],_[5]=_[3]+amount,_[5]+amount
end
if #self.field>self.gameEnv.heightLimit then
if
#self.field>self.gameEnv.heightLimit and(
not self:_triggerEvent('hook_die')or
#self.field>self.gameEnv.heightLimit
)
then
self:lock()
self:lose()
end
if #self.field>self.gameEnv.heightLimit then
self:_triggerEvent('hook_die')
if #self.field>self.gameEnv.heightLimit then
self:lose()
end
end
end
local invList={2,1,4,3,5,6,7}
@@ -562,7 +578,7 @@ function Player:changeAtk(R)
self.atking=false
end
end
function Player:freshBlock(mode)--string mode: push/move/fresh/newBlock
function Player:freshBlock(mode,ifTele)--string mode: push/move/fresh/newBlock
local ENV=self.gameEnv
--Fresh ghost
if(mode=='move'or mode=='newBlock'or mode=='push')and self.cur then
@@ -627,7 +643,7 @@ function Player:freshBlock(mode)--string mode: push/move/fresh/newBlock
end
--Play sound if touch ground
if mode=='move'then
if mode=='move'and not ifTele then
self:checkTouchSound()
end
end
@@ -724,7 +740,7 @@ function Player:removeTopClearingFX()
return true
end
end
function Player:checkMission(piece,mission)
function Player:_checkMission(piece,mission)
if mission<5 then
return piece.row==mission and not piece.spin
elseif mission<9 then
@@ -736,6 +752,17 @@ function Player:checkMission(piece,mission)
end
return false
end
function Player:_checkSuffocate()
if
self:ifoverlap(self.cur.bk,self.curX,self.curY)and(
not self:_triggerEvent('hook_die')or
self:ifoverlap(self.cur.bk,self.curX,self.curY)
)
then
self:lock()
self:lose()
end
end
local spawnSFX_name={'spawn_1','spawn_2','spawn_3','spawn_4','spawn_5','spawn_6','spawn_7'}
function Player:resetBlock()--Reset Block's position and execute I*S
@@ -905,10 +932,7 @@ function Player:hold_norm(ifpre)
self:freshBlock('move')
self.dropDelay=ENV.drop
self.lockDelay=ENV.lock
if self:ifoverlap(self.cur.bk,self.curX,self.curY)then
self:lock()
self:lose()
end
self:_checkSuffocate()
end
self.freshTime=int(min(self.freshTime+ENV.freshLimit*.25,ENV.freshLimit*((self.holdTime+1)/ENV.holdCount),ENV.freshLimit))
@@ -971,10 +995,7 @@ function Player:hold_swap(ifpre)
self:freshBlock('move')
self.dropDelay=ENV.drop
self.lockDelay=ENV.lock
if self:ifoverlap(self.cur.bk,self.curX,self.curY)then
self:lock()
self:lose()
end
self:_checkSuffocate()
end
self.freshTime=int(min(self.freshTime+ENV.freshLimit*.25,ENV.freshLimit*((self.holdTime+1)/ENV.holdCount),ENV.freshLimit))
@@ -1044,10 +1065,7 @@ function Player:popNext(ifhold)--Pop nextQueue to hand
self.freshTime=ENV.freshLimit
if self.cur then
if self:ifoverlap(self.cur.bk,self.curX,self.curY)then
self:lock()
self:lose()
end
self:_checkSuffocate()
self:freshBlock('newBlock')
end
@@ -1608,7 +1626,7 @@ do
--Check clearing task
if cc>0 and self.curMission then
if self:checkMission(piece,ENV.mission[self.curMission])then
if self:_checkMission(piece,ENV.mission[self.curMission])then
self.curMission=self.curMission+1
SFX.play('reach')
if self.curMission>#ENV.mission then
@@ -1670,13 +1688,13 @@ do
if finish=='lose'then
self:lose()
else
self:triggerDropEvents()
self:_triggerEvent('hook_drop')
if finish then
self:win(finish)
end
end
else
self:triggerDropEvents()
self:_triggerEvent('hook_drop')
end
end
@@ -2333,7 +2351,9 @@ function Player:revive()
SFX.play('emit')
end
function Player:win(result)
if self.result then return end
if self.result then
return
end
self:_die()
self.result='win'
if GAME.modeEnv.royaleMode then
@@ -2374,8 +2394,7 @@ function Player:lose(force)
if self.life>0 then
self:revive()
return
end
if self.type=='remote'then
elseif self.type=='remote'then
self.waiting=1e99
return
end
@@ -2581,10 +2600,11 @@ 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')
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
@@ -2605,10 +2625,11 @@ 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')
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

View File

@@ -1,18 +1,15 @@
return[=[
未来模式:
任务树; 大爆炸; 拼方形; 限高无尽挖掘; 连击练习; 极简教程/考试
未来小游戏:
Tetro-1010(四/五连块, 2C2N, 若干回合改变重力方向); Tetra-link(桌游)
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 数字记忆; 听声记忆
Tetro-1010(2C2N, 重力); Tetra-link(桌游)
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 记忆
其他未来内容:
组队战; 实时统计数据可视化; 教学关; 从录像继续
重做模式选择UI; 重做模组UI; 加速下落; spike相关统计数据
支持更多手柄; 场地格边缘线; 模式数据分析; 高级自定义序列
等级系统; 成就系统; Domain状态; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统; 无用货币
等级系统; 成就系统; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统; 无用货币与收集向抽奖
可调攻击系统; 更多消除方式; 可调场地宽度; 新联网游戏场景切换逻辑
工程编译到字节码; task-Z(新AI)
收集向抽奖; 自适应UI; 多方块
工程编译到字节码; task-Z(新AI); 自适应UI; 多方块
0.16.5: 新世界 New World
新增:
@@ -22,20 +19,26 @@ return[=[
新增繁中语言,新语言设置菜单布局
新BGM:peak(暂未使用)
新BGM:1989(用于经典模式,by C₂₉H₂₅N₃O₅)
除节奏模式
除节奏模式(之后会有全新音游模式)
移除模式标题的颜色
改动:
移动音效改为触地音效,在方块因重力或旋转触地时也会播放
再调整场地晃动的阻力,看起来更舒服
TRS的J5和L5新增一个180度踢墙
重做全局颜色表(by C₂₉H₂₅N₃O₅)
经典模式添加干旱计数器
重新安排一些模式的BGM
堆积模式移出地图,修改规则可以消超过20行
只在更新后触发自动转换以旧版本模式名存储的数据
再次更换字体
代码:
播放乐器采样更自然并允许超过音源范围
添加死亡事件触发器
修复:
堆积模式超级消除有时报错
词典导出词条保留了替换敏感词的特殊字符
时间转换函数可能输出1分60
0arr时自动移动时声音特别响
0.16.4: 虫洞 Wormhole
新增:

View File

@@ -1,5 +1,5 @@
return{
["apkCode"]=397,
["apkCode"]=399,
["code"]=1605,
["string"]="V0.16.5",
["room"]="ver A-0",