Compare commits
21 Commits
pre0.16.5-
...
pre0.16.5-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed011173f6 | ||
|
|
491fcb5860 | ||
|
|
c2d5537d8d | ||
|
|
7d5037ae87 | ||
|
|
07d7714317 | ||
|
|
2cab97f37d | ||
|
|
d184778c9a | ||
|
|
9fd3b3008d | ||
|
|
71aa35b214 | ||
|
|
4443dc9d3e | ||
|
|
839e357301 | ||
|
|
ac56c5a415 | ||
|
|
36e3343341 | ||
|
|
510f7d7513 | ||
|
|
3128eb38c0 | ||
|
|
14ef654612 | ||
|
|
bc5193f95e | ||
|
|
8cbb4a38bc | ||
|
|
fce08c83ef | ||
|
|
018e99f9e6 | ||
|
|
7fe390b34b |
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
4
main.lua
4
main.lua
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
dropPiece=function(P)
|
||||
hook_drop=function(P)
|
||||
if P.lastPiece.row==0 then
|
||||
P:lose()
|
||||
else
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
dropPiece=function(P)
|
||||
hook_drop=function(P)
|
||||
if #PLY_ALIVE>1 then
|
||||
P.control=false
|
||||
local id1=P.sid
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -46,6 +46,6 @@ return{
|
||||
mStr(P.stat.pc,63,340)
|
||||
mText(TEXTOBJ.pc,63,410)
|
||||
end,
|
||||
dropPiece=check,
|
||||
hook_drop=check,
|
||||
task=check,
|
||||
}
|
||||
|
||||
@@ -37,6 +37,6 @@ return{
|
||||
mStr(P.stat.pc,63,340)
|
||||
mText(TEXTOBJ.pc,63,410)
|
||||
end,
|
||||
dropPiece=check,
|
||||
hook_drop=check,
|
||||
task=check,
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
19
parts/eventsets/sprintEff_40.lua
Normal file
19
parts/eventsets/sprintEff_40.lua
Normal 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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -687,6 +687,16 @@ return{
|
||||
"term",
|
||||
"现代方块普遍使用的死亡判定:\n1. 新出现的方块和场地方块有重叠(窒息,Top Out)(c4w比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\n另,Jstris中22行及以上可以理解为消失区,锁定在21行之外的格子会消失。",
|
||||
},
|
||||
{"下落速度",
|
||||
"下落速度 重力 drop speed zhongli gravity",
|
||||
"term",
|
||||
|
||||
@@ -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 /*",
|
||||
|
||||
@@ -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!"},
|
||||
|
||||
@@ -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"},
|
||||
|
||||
@@ -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."},
|
||||
|
||||
@@ -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"},
|
||||
|
||||
@@ -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圈(误",
|
||||
|
||||
@@ -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']= {"单挑", "简单", "打败机器人"},
|
||||
|
||||
@@ -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!"},
|
||||
|
||||
@@ -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"},
|
||||
|
||||
@@ -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'}},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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="费尔特林"},
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -61,7 +61,8 @@ return{
|
||||
noInitSZO=false,
|
||||
|
||||
mesDisp={},
|
||||
dropPiece={},
|
||||
hook_drop={},
|
||||
hook_die={},
|
||||
task={},
|
||||
eventSet="X",
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
新增:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
["apkCode"]=397,
|
||||
["apkCode"]=399,
|
||||
["code"]=1605,
|
||||
["string"]="V0.16.5",
|
||||
["room"]="ver A-0",
|
||||
|
||||
Reference in New Issue
Block a user