0.11.2:Pong(操作错误导致只能用覆盖文件代替合并分支)(非0.11.2最终版)

This commit is contained in:
MrZ626
2020-10-06 18:09:45 +08:00
parent 71fec8b497
commit 09d78e52f6
39 changed files with 1250 additions and 822 deletions

View File

@@ -28,7 +28,7 @@ BGM.list={
"race","push","way","reason",
"newera","oxygen","infinite","down",
"secret7th","secret8th",
"shining terminal","distortion","far",
"waterfall","shining terminal","distortion","far",
"rockblock","cruelty","final","8-bit happiness","end",
"how feeling",
}

View File

@@ -178,7 +178,7 @@ function love.touchreleased(id,x,y)
end
if(x-lastX)^2+(y-lastY)^2<26 then
if touchClick[SCN.cur]then
touchClick[SCN.cur](x,y,k)
touchClick[SCN.cur](x,y)
end
sysFX.newRipple(.3,x,y,30)
end
@@ -375,17 +375,17 @@ function love.errorhandler(msg)
needDraw=true
elseif E=="focus"then
needDraw=true
elseif E=="touchDown"or E=="keyDown"or E=="mouseDown"then
elseif E=="touchpressed"or E=="keypressed"or E=="mousepressed"then
if count<3 then
count=count+1
SFX.play("ready")
else
local code=loadstring(love.system.getClipboardText())
if code then
if code()then
SFX.play("reach")
end
SFX.play("start")
code()
SFX.play("reach")
else
SFX.play("finesseError")
end
count=0
end

View File

@@ -86,7 +86,7 @@ local langList={
"落在最左:","落在最右:","列在最左:","列在最右:",
},
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载图片ing","加载模式ing","加载乱七八糟的东西ing"},
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载图片ing","加载字体ing","加载模式ing","加载乱七八糟的东西ing"},
pauseStat={
"时间:",
"按键/旋转/暂存:",
@@ -174,6 +174,7 @@ local langList={
setting="设置",
lang="言/A",
music="音乐室",
minigame="小游戏",
quit="退出",
},
mode={
@@ -201,6 +202,8 @@ local langList={
bg="背景",
bgm="音乐",
copy="复制序列+场地+任务",
paste="粘贴序列+场地+任务",
clear="开始-消除",
puzzle="开始-拼图",
@@ -223,9 +226,6 @@ local langList={
life="命数",
pushSpeed="上涨速度",
copy="复制序列+场地+任务",
paste="粘贴序列+场地+任务",
basic="←基本规则",
sequence="序列设置(Tab)→",
back="返回",
@@ -410,6 +410,7 @@ local langList={
minigame={
p15="15 Puzzle",
schulte_G="舒尔特方格",
pong="Pong",
back="返回",
},
p15={
@@ -429,6 +430,10 @@ local langList={
tapFX="点击动画",
back="返回",
},
pong={
reset="重置",
back="返回",
},
help={
dict="小Z词典",
staff="制作人员",
@@ -466,6 +471,11 @@ local langList={
["sprint_10"]= {"竞速", "10L", "消除10行"},
["sprint_20"]= {"竞速", "20L", "消除20行"},
["sprint_40"]= {"竞速", "40L", "消除40行"},
["dig_10"]= {"挖掘", "10L", "挖掘10行"},
["dig_40"]= {"挖掘", "40L", "挖掘40行"},
["dig_100"]= {"挖掘", "100L", "挖掘100行"},
["dig_400"]= {"挖掘", "400L", "挖掘400行"},
["dig_1000"]= {"挖掘", "1000L", "挖掘1000行"},
["sprint_100"]= {"竞速", "100L", "消除100行"},
["sprint_400"]= {"竞速", "400L", "消除400行"},
["sprint_1000"]= {"竞速", "1000L", "消除1000行"},
@@ -520,13 +530,13 @@ local langList={
["pcchallenge_hard"]= {"全清挑战", "困难", "100行内刷PC"},
["pcchallenge_lunatic"]={"全清挑战", "疯狂", "100行内刷PC"},
["tech_normal"]= {"科研", "普通", "禁止断B2B"},
["tech_normal+"]= {"科研", "普通+", "仅允许spin与PC"},
["tech_normal2"]= {"科研", "普通+", "仅允许spin与PC"},
["tech_hard"]= {"科研", "困难", "禁止断B2B"},
["tech_hard+"]= {"科研", "困难+", "仅允许spin与PC"},
["tech_hard2"]= {"科研", "困难+", "仅允许spin与PC"},
["tech_lunatic"]= {"科研", "疯狂", "禁止断B2B"},
["tech_lunatic+"]= {"科研", "疯狂+", "仅允许spin与PC"},
["tech_lunatic2"]= {"科研", "疯狂+", "仅允许spin与PC"},
["tech_finesse"]= {"科研", "极简", "强制最简操作"},
["tech_finesse+"]= {"科研", "极简+", "禁止普通消除,强制最简操作"},
["tech_finesse2"]= {"科研", "极简+", "禁止普通消除,强制最简操作"},
["tsd_easy"]= {"TSD挑战", "简单", "你能连续做几个TSD?"},
["tsd_hard"]= {"TSD挑战", "困难", "你能连续做几个TSD?"},
["tsd_ultimate"]= {"TSD挑战", "极限", "你能连续做几个TSD?"},
@@ -537,7 +547,7 @@ local langList={
["custom_clear"]= {"自定义", "普通", "画点什么然后把它消除!"},
["custom_puzzle"]= {"自定义", "拼图", "画点什么然后把它拼出来吧!"},
["sprintPenta"]= {"竞速", "五联块", "伤脑筋十八块"},
["sprintMPH"]= {"竞速", "MPH", "很经典"},
["sprintMPH"]= {"竞速", "MPH", "纯随机\n无预览\n无暂存"},
},
},
{
@@ -627,7 +637,7 @@ local langList={
"落在最左:","落在最右:","列在最左:","列在最右:",
},
load={[0]="加载完成","正在加载语音","正在加载音乐","正在加载音效","正在加载图片","正在加载模式","正在加载乱七八糟的东西"},
load={[0]="加载完成","正在加载语音","正在加载音乐","正在加载音效","正在加载图片","正在加载字体","正在加载模式","正在加载乱七八糟的东西"},
pauseStat={
"时间:",
"按键/旋转/暂存:",
@@ -713,6 +723,7 @@ local langList={
setting="设置",
lang="言/A",
music="音乐室",
minigame="小游戏",
quit="退出",
},
mode={
@@ -740,6 +751,8 @@ local langList={
bg="背景",
bgm="音乐",
copy="复制序列+场地+任务",
paste="粘贴序列+场地+任务",
clear="开始-消除",
puzzle="开始-拼图",
@@ -762,9 +775,6 @@ local langList={
life="命数",
pushSpeed="上涨速度",
copy="复制序列+场地+任务",
paste="粘贴序列+场地+任务",
basic="←基本规则",
sequence="序列设置(Tab)→",
back="返回",
@@ -949,6 +959,7 @@ local langList={
minigame={
p15="15 Puzzle",
schulte_G="舒尔特方格",
pong="Pong",
back="返回",
},
p15={
@@ -968,6 +979,10 @@ local langList={
tapFX="点击动画",
back="返回",
},
pong={
reset="重置",
back="返回",
},
help={
dict="小Z词典",
staff="制作人员",
@@ -1005,6 +1020,11 @@ local langList={
["sprint_10"]= {"竞速", "10行", "消除10行"},
["sprint_20"]= {"竞速", "20行", "消除20行"},
["sprint_40"]= {"竞速", "40行", "消除40行"},
["dig_10"]= {"挖掘", "10L", "挖掘10行"},
["dig_40"]= {"挖掘", "40L", "挖掘40行"},
["dig_100"]= {"挖掘", "100L", "挖掘100行"},
["dig_400"]= {"挖掘", "400L", "挖掘400行"},
["dig_1000"]= {"挖掘", "1000L", "挖掘1000行"},
["sprint_100"]= {"竞速", "100行", "消除100行"},
["sprint_400"]= {"竞速", "400行", "消除400行"},
["sprint_1000"]= {"竞速", "1000行", "消除1000行"},
@@ -1059,13 +1079,13 @@ local langList={
["pcchallenge_hard"]= {"全清挑战", "困难", "100行内刷全清"},
["pcchallenge_lunatic"]={"全清挑战", "疯狂", "100行内刷全清"},
["tech_normal"]= {"科研", "普通", "禁止断B2B"},
["tech_normal+"]= {"科研", "普通+", "仅允许回旋与全清"},
["tech_normal2"]= {"科研", "普通+", "仅允许回旋与全清"},
["tech_hard"]= {"科研", "困难", "禁止断B2B"},
["tech_hard+"]= {"科研", "困难+", "仅允许回旋与全清"},
["tech_hard2"]= {"科研", "困难+", "仅允许回旋与全清"},
["tech_lunatic"]= {"科研", "疯狂", "禁止断B2B"},
["tech_lunatic+"]= {"科研", "疯狂+", "仅允许spin与PC"},
["tech_lunatic2"]= {"科研", "疯狂+", "仅允许spin与PC"},
["tech_finesse"]= {"科研", "极简", "强制最简操作"},
["tech_finesse+"]= {"科研", "极简+", "禁止普通消除,强制最简操作"},
["tech_finesse2"]= {"科研", "极简+", "禁止普通消除,强制最简操作"},
["tsd_easy"]= {"T2挑战", "简单", "你能连续做几个T旋双清?"},
["tsd_hard"]= {"T2挑战", "困难", "你能连续做几个T旋双清?"},
["tsd_ultimate"]= {"T2挑战", "极限", "你能连续做几个T旋双清?"},
@@ -1076,7 +1096,7 @@ local langList={
["custom_clear"]= {"自定义", "普通", "画点什么然后把它消除!"},
["custom_puzzle"]= {"自定义", "拼图", "画点什么然后把它拼出来吧!"},
["sprintPenta"]= {"竞速", "五联块", "伤脑筋十八块"},
["sprintMPH"]= {"竞速", "纯净", "很经典"},
["sprintMPH"]= {"竞速", "纯净", "纯随机\n无预览\n无暂存"},
},
},
{
@@ -1163,7 +1183,7 @@ local langList={
"Instant Left:","Instant Right:","Sonic Drop:","Down 1:","Down 4:","Down 10:",
"Left Drop:","Right Drop:","Left Zangi:","Right Zangi:",
},
load={[0]="Finished","Loading voice","Loading BGM","Loading SFX","Loading images","Loading modes","Loading other things"},
load={[0]="Finished","Loading voice","Loading BGM","Loading SFX","Loading images","Loading fonts","Loading modes","Loading other things"},
pauseStat={
"Time:",
"Key/Rot./Hold:",
@@ -1249,6 +1269,7 @@ local langList={
setting="Settings",
lang="言/A",
music="Music Room",
minigame="Mini Games",
quit="Exit",
},
mode={
@@ -1276,6 +1297,8 @@ local langList={
bg="Background",
bgm="Music",
copy="Copy Seq+Field+Misn",
paste="Paste Seq+Field+Misn",
clear="Start-Clear",
puzzle="Start-Puzzle",
@@ -1298,9 +1321,6 @@ local langList={
life="Life",
pushSpeed="Garbage Speed",
copy="Copy Seq+Field+Misn",
paste="Paste Seq+Field+Misn",
basic="←Basic",
sequence="SEQ. (Tab)→",
back="Back",
@@ -1485,6 +1505,7 @@ local langList={
minigame={
p15="15 Puzzle",
schulte_G="Schulte Grid",
pong="Pong",
back="Back",
},
p15={
@@ -1504,6 +1525,10 @@ local langList={
tapFX="tap FX",
back="Back",
},
pong={
reset="Restart",
back="Back",
},
help={
dict="little Z",
staff="Staff",
@@ -1541,6 +1566,11 @@ local langList={
["sprint_10"]= {"Sprint", "10L", "Clear 10 lines!"},
["sprint_20"]= {"Sprint", "20L", "Clear 20 lines!"},
["sprint_40"]= {"Sprint", "40L", "Clear 40 lines!"},
["dig_10"]= {"Dig", "10L", "Dig 10 lines"},
["dig_40"]= {"Dig", "40L", "Dig 40 lines"},
["dig_100"]= {"Dig", "100L", "Dig 100 lines"},
["dig_400"]= {"Dig", "400L", "Dig 400 lines"},
["dig_1000"]= {"Dig", "1000L", "Dig 1000 lines"},
["sprint_100"]= {"Sprint", "100L", "Clear 100 lines!"},
["sprint_400"]= {"Sprint", "400L", "Clear 400 lines!"},
["sprint_1000"]= {"Sprint", "1000L", "Clear 1000 lines!"},
@@ -1595,13 +1625,13 @@ local langList={
["pcchallenge_hard"]= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
["pcchallenge_lunatic"]={"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
["tech_normal"]= {"Tech", "NORMAL", "Keep the B2B chain!"},
["tech_normal+"]= {"Tech", "NORMAL+", "Spin & PC only"},
["tech_normal2"]= {"Tech", "NORMAL+", "Spin & PC only"},
["tech_hard"]= {"Tech", "HARD", "Keep the B2B chain!"},
["tech_hard+"]= {"Tech", "HARD+", "Spin & PC only"},
["tech_hard2"]= {"Tech", "HARD+", "Spin & PC only"},
["tech_lunatic"]= {"Tech", "LUNATIC", "Keep the B2B chain!"},
["tech_lunatic+"]= {"Tech", "LUNATIC+", "Spin & PC only"},
["tech_lunatic2"]= {"Tech", "LUNATIC+", "Spin & PC only"},
["tech_finesse"]= {"Tech", "FINESSE", "No finesse faults!"},
["tech_finesse+"]= {"Tech", "FINESSE+", "No normal clears, no finesse faults!"},
["tech_finesse2"]= {"Tech", "FINESSE+", "No normal clears, no finesse faults!"},
["tsd_easy"]= {"TSD Challenge", "EASY", "T-spin-doubles only!"},
["tsd_hard"]= {"TSD Challenge", "HARD", "T-spin-doubles only!"},
["tsd_ultimate"]= {"TSD Challenge", "ULTIMATE", "T-spin-doubles only!"},
@@ -1611,7 +1641,7 @@ local langList={
["infinite_dig"]= {"Infinite: Dig", "", "Dig, dig, dig."},
["custom_clear"]= {"Custom", "NORMAL", "Draw something then clear it!!"},
["custom_puzzle"]= {"Custom", "PUZZLE", "Draw something then stack it!!"},
["sprintPenta"]= {"Sprint", "Pentomino", "Clear 40 lines.\n18 pentominoes in each bag."},
["sprintPenta"]= {"Sprint", "Pentomino", "Clear 40 lines with 18 pentominoes."},
["sprintMPH"]= {"Sprint", "MPH", "Memoriyless\nPreviewless\nHoldless"},
},
},
@@ -1699,7 +1729,7 @@ local langList={
"|←:","→|:","↓_:","↓1:","↓4:","↓10:",
"←↓→↓:","→↓↓:","←↓→↓:","→↓←↓:",
},
load={[0]="___","_vocie_","_BGM_","_SFX_","_images_","_modes_","_???_"},
load={[0]="___","_vocie_","_BGM_","_SFX_","_images_","_fonts_","_modes_","_???_"},
pauseStat={
"~:",
"=/''/[ ]:",
@@ -1785,6 +1815,7 @@ local langList={
setting="_?_",
lang="言/A",
music="~~~",
minigame="^_^",
quit="X",
},
mode={
@@ -1811,6 +1842,8 @@ local langList={
bg="{~}",
bgm="(~)",
copy="Copy Seq+Field+Misn",
paste="Paste Seq+Field+Misn",
clear="Start-Clear",
puzzle="Start-Puzzle",
@@ -1833,9 +1866,6 @@ local langList={
life="<R>",
pushSpeed="_↑_↑_",
copy="Copy Seq+Field+Misn",
paste="Paste Seq+Field+Misn",
basic="←Basic",
sequence="Seq (Tab)→",
back="X",
@@ -2020,6 +2050,7 @@ local langList={
minigame={
p15="15 Puzzle",
schulte_G="Schulte Grid",
pong="Pong",
back="X",
},
p15={
@@ -2039,6 +2070,10 @@ local langList={
tapFX="↓ !",
back="X",
},
pong={
reset="R",
back="X",
},
help={
dict="z",
staff="Orz",
@@ -2074,6 +2109,11 @@ local langList={
["sprint_10"]= {"Sprint", "10L", "Clear 10 lines!"},
["sprint_20"]= {"Sprint", "20L", "Clear 20 lines!"},
["sprint_40"]= {"Sprint", "40L", "Clear 40 lines!"},
["dig_10"]= {"Dig", "10L", "Dig 10 lines"},
["dig_40"]= {"Dig", "40L", "Dig 40 lines"},
["dig_100"]= {"Dig", "100L", "Dig 100 lines"},
["dig_400"]= {"Dig", "400L", "Dig 400 lines"},
["dig_1000"]= {"Dig", "1000L", "Dig 1000 lines"},
["sprint_100"]= {"Sprint", "100L", "Clear 100 lines!"},
["sprint_400"]= {"Sprint", "400L", "Clear 400 lines!"},
["sprint_1000"]= {"Sprint", "1000L", "Clear 1000 lines!"},
@@ -2128,13 +2168,13 @@ local langList={
["pcchallenge_hard"]= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
["pcchallenge_lunatic"]={"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
["tech_normal"]= {"Tech", "NORMAL", "Keep the B2B chain!"},
["tech_normal+"]= {"Tech", "NORMAL+", "Spin & PC only"},
["tech_normal2"]= {"Tech", "NORMAL+", "Spin & PC only"},
["tech_hard"]= {"Tech", "HARD", "Keep the B2B chain!"},
["tech_hard+"]= {"Tech", "HARD+", "Spin & PC only"},
["tech_hard2"]= {"Tech", "HARD+", "Spin & PC only"},
["tech_lunatic"]= {"Tech", "LUNATIC", "Keep the B2B chain!"},
["tech_lunatic+"]= {"Tech", "LUNATIC+", "Spin & PC only"},
["tech_lunatic2"]= {"Tech", "LUNATIC+", "Spin & PC only"},
["tech_finesse"]= {"Tech", "FINESSE", "No finesse faults!"},
["tech_finesse+"]= {"Tech", "FINESSE+", "No normal clears, no finesse faults!"},
["tech_finesse2"]= {"Tech", "FINESSE+", "No normal clears, no finesse faults!"},
["tsd_easy"]= {"TSD Challenge", "EASY", "T-spin-doubles only!"},
["tsd_hard"]= {"TSD Challenge", "HARD", "T-spin-doubles only!"},
["tsd_ultimate"]= {"TSD Challenge", "ULTIMATE", "T-spin-doubles only!"},
@@ -2235,7 +2275,7 @@ local langList={
"落在最左:","落在最右:","列在最左:","列在最右:",
},
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载图片ing","加载模式ing","加载乱七八糟的东西ing"},
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载图片ing","加载字体ing","加载模式ing","加载乱七八糟的东西ing"},
pauseStat={
"时间:",
"按键/旋转/暂存:",
@@ -2320,6 +2360,7 @@ local langList={
setting="设置",
lang="言/A",
music="音乐室",
minigame="小游戏",
quit="退出",
},
mode={
@@ -2347,6 +2388,8 @@ local langList={
bg="背景",
bgm="音乐",
copy="复制序列+场地+任务",
paste="粘贴序列+场地+任务",
clear="开始-消除",
puzzle="开始-拼图",
@@ -2369,9 +2412,6 @@ local langList={
life="命数",
pushSpeed="上涨速度",
copy="复制序列+场地+任务",
paste="粘贴序列+场地+任务",
basic="←基本规则",
sequence="序列设置(Tab)→",
back="返回",
@@ -2556,6 +2596,7 @@ local langList={
minigame={
p15="15 Puzzle",
schulte_G="舒尔特方格",
pong="Pong",
back="返回",
},
p15={
@@ -2575,6 +2616,10 @@ local langList={
tapFX="动画",
back="返回",
},
pong={
reset="重置",
back="返回",
},
help={
dict="小Z词典",
staff="制作人员",
@@ -2612,11 +2657,16 @@ local langList={
["sprint_10"]= {"竞速", "10L", "消10行"},
["sprint_20"]= {"竞速", "20L", "消20行"},
["sprint_40"]= {"竞速", "40L", "消40行"},
["dig_10"]= {"挖掘", "10L", "挖10行"},
["dig_40"]= {"挖掘", "40L", "挖40行"},
["dig_100"]= {"挖掘", "100L", "挖100行"},
["dig_400"]= {"挖掘", "400L", "挖400行"},
["dig_1000"]= {"挖掘", "1000L", "挖1000行"},
["sprint_100"]= {"竞速", "100L", "消100行"},
["sprint_400"]= {"竞速", "400L", "消400行"},
["sprint_1000"]= {"竞速", "1000L", "消1000行"},
["drought_normal"]= {"干旱", "100L", "哟,就不行了?"},
["drought_lunatic"]= {"干旱", "100L", "可牛逼了嗷"},
["drought_normal"]= {"干旱", "100L", "放轻松,简单得很"},
["drought_lunatic"]= {"干旱", "100L", "有趣的要来了"},
["marathon_normal"]= {"马拉松", "普通", "休闲模式"},
["marathon_hard"]= {"马拉松", "困难", "休闲模式"},
["solo_1"]= {"单挑", "简单", "鲨AI"},
@@ -2666,13 +2716,13 @@ local langList={
["pcchallenge_hard"]= {"全清挑战", "困难", "100行内刷PC"},
["pcchallenge_lunatic"]={"全清挑战", "疯狂", "100行内刷PC"},
["tech_normal"]= {"科研", "普通", "禁止断B2B"},
["tech_normal+"]= {"科研", "普通+", "仅允许spin与PC"},
["tech_normal2"]= {"科研", "普通+", "仅允许spin与PC"},
["tech_hard"]= {"科研", "困难", "禁止断B2B"},
["tech_hard+"]= {"科研", "困难+", "仅允许spin与PC"},
["tech_hard2"]= {"科研", "困难+", "仅允许spin与PC"},
["tech_lunatic"]= {"科研", "疯狂", "禁止断B2B"},
["tech_lunatic+"]= {"科研", "疯狂+", "仅允许spin与PC"},
["tech_lunatic2"]= {"科研", "疯狂+", "仅允许spin与PC"},
["tech_finesse"]= {"科研", "极简", "强制最简操作"},
["tech_finesse+"]= {"科研", "极简+", "禁止普通消除,强制最简操作"},
["tech_finesse2"]= {"科研", "极简+", "禁止普通消除,强制最简操作"},
["tsd_easy"]= {"TSD挑战", "简单", "刷T2"},
["tsd_hard"]= {"TSD挑战", "困难", "刷T2"},
["tsd_ultimate"]= {"TSD挑战", "极限", "刷T2"},
@@ -2683,7 +2733,7 @@ local langList={
["custom_clear"]= {"自定义", "普通", "试验场"},
["custom_puzzle"]= {"自定义", "拼图", "宁就是方块艺术家"},
["sprintPenta"]= {"竞速", "五联块", "离谱"},
["sprintMPH"]= {"竞速", "无脑", "听说你反应很快?"},
["sprintMPH"]= {"竞速", "纯净", "听说你反应很快?"},
},
},
}

View File

@@ -91,10 +91,12 @@ function SFX.fplay(s,vol,pos)
S:play()
end
function SFX.reset()
for _,L in next,sfx do
for i=#v,2,-1 do
if not L[i]:isPlaying()then
rem(L,i)
for _,L in next,SFX.list do
if type(L)=="table"then
for i=#L,1,-1 do
if not L[i]:isPlaying()then
rem(L,i)
end
end
end
end

View File

@@ -1,7 +1,6 @@
local gc=love.graphics
local int=math.floor
local format=string.format
local find=string.find
local sub,find,format=string.sub,string.find,string.format
do--setFont
local newFont=gc.setNewFont
@@ -10,33 +9,36 @@ do--setFont
if love.filesystem.getInfo("font.ttf")then
local fontData=love.filesystem.newFile("font.ttf")
function setFont(s)
local f=fontCache[s]
if s~=currentFontSize then
if f then
setNewFont(f)
else
f=newFont(fontData,s)
fontCache[s]=f
setNewFont(f)
if not fontCache[s]then
fontCache[s]=newFont(fontData,s)
end
setNewFont(fontCache[s])
currentFontSize=s
end
return f
end
function getFont(s)
if not fontCache[s]then
fontCache[s]=newFont(fontData,s)
end
return fontCache[s]
end
else
function setFont(s)
local f=fontCache[s]
if s~=currentFontSize then
if f then
setNewFont(f)
else
f=newFont(s)
fontCache[s]=f
setNewFont(f)
if not fontCache[s]then
fontCache[s]=newFont(s)
end
setNewFont(fontCache[s])
currentFontSize=s
end
return f
end
function getFont(s)
if not fontCache[s]then
fontCache[s]=newFont(s)
end
return fontCache[s]
end
end
end
@@ -96,7 +98,7 @@ do--HTTPrequest
url=url,
sink=ltn12.sink.table(data)
}
if not res then
if code~=200 then
LOG.print("NET ERROR: code="..(code or"nil"))
end
return data[1]
@@ -428,7 +430,7 @@ do--json
["{"] = parse_object
}
parse = function(str, idx)
function parse(str, idx)
local chr = str:sub(idx, idx)
local f = char_func_map[chr]
if f then return f(str, idx) end

View File

@@ -12,7 +12,7 @@ local text={
}
function text:reset()
if type(self.text)=="string"then
self.text=gc.newText(setFont(self.font or 30),self.text)
self.text=gc.newText(getFont(self.font or 30),self.text)
end
end
function text:draw()

View File

@@ -142,16 +142,16 @@ local Widgets={
newButton({name="play", x=640,y=600,w=180,h=90, color="lGreen", font=40,code=pressKey("space"),hide=function()return not sceneTemp.pass end}),
},
main={
newButton({name="play", x=150,y=280,w=200,h=160,color="lRed", font=55,code=goScene("mode")}),
newButton({name="setting", x=370,y=280,w=200,h=160,color="lBlue", font=45,code=goScene("setting_game")}),
newButton({name="custom", x=590,y=280,w=200,h=160,color="lOrange",font=43,code=goScene("custom_basic"),hide=function()return not modeRanks.marathon_normal end}),
newButton({name="help", x=150,y=460,w=200,h=160,color="lYellow",font=50,code=goScene("help")}),
newButton({name="stat", x=370,y=460,w=200,h=160,color="lCyan", font=43,code=goScene("stat")}),
newButton({name="qplay", x=590,y=460,w=200,h=160,color="lGreen", font=45,code=function()SCN.push()loadGame(stat.lastPlay,true)end}),
newButton({name="lang", x=150,y=600,w=200,h=80,color="lGreen", font=45,code=goScene("setting_lang")}),
newButton({name="music", x=370,y=600,w=200,h=80,color="lPurple", font=30,code=goScene("music")}),
newButton({name="quit", x=590,y=600,w=200,h=80,color="lGrey", font=45,code=function()VOC.play("bye")SCN.swapTo("quit","slowFade")end}),
newButton({name="minigame", x=780,y=600,w=80, color="black", code=goScene("minigame")}),
newButton({name="play", x=150,y=270,w=200,h=160,color="lRed", font=55,code=goScene("mode")}),
newButton({name="setting", x=370,y=270,w=200,h=160,color="lBlue", font=45,code=goScene("setting_game")}),
newButton({name="custom", x=590,y=270,w=200,h=160,color="lOrange",font=45,code=goScene("custom_basic"),hide=function()return not modeRanks.marathon_normal end}),
newButton({name="help", x=150,y=450,w=200,h=160,color="lYellow",font=50,code=goScene("help")}),
newButton({name="stat", x=370,y=450,w=200,h=160,color="lCyan", font=40,code=goScene("stat")}),
newButton({name="qplay", x=590,y=450,w=200,h=160,color="lGreen", font=45,code=function()SCN.push()loadGame(stat.lastPlay,true)end}),
newButton({name="lang", x=150,y=590,w=200,h=80,color="lGreen", font=45,code=goScene("setting_lang")}),
newButton({name="music", x=370,y=590,w=200,h=80,color="lPurple", font=30,code=goScene("music")}),
newButton({name="quit", x=590,y=590,w=200,h=80,color="lGrey", font=45,code=function()VOC.play("bye")SCN.swapTo("quit","slowFade")end}),
newKey({name="minigame", x=370,y=670,w=200,h=60,color="dGrey", font=30,code=goScene("minigame")}),
},
mode={
newButton({name="start", x=1040,y=655,w=180,h=80,color="white", font=40,code=pressKey("return"),hide=function()return not mapCam.sel end}),
@@ -188,7 +188,9 @@ local Widgets={
newSelector({name="bg", x=1140, y=460, w=220,color="yellow", list=CUSlist.bg, disp=CUSval("bg"), code=function(i)customEnv.bg=i BG.set(i)end}),
newSelector({name="bgm", x=1140, y=540, w=220,color="yellow", list=CUSlist.bgm, disp=CUSval("bgm"), code=function(i)customEnv.bgm=i BGM.play(i)end}),
--Start
--Copy/Paste/Start
newButton({name="copy", x=560, y=530, w=300,h=100, color="lRed", font=25,code=pressKey("cC")}),
newButton({name="paste", x=870, y=530, w=300,h=100, color="lBlue", font=25,code=pressKey("cV")}),
newButton({name="clear", x=560, y=640, w=300,h=100, color="lYellow", font=40,code=pressKey("return")}),
newButton({name="puzzle", x=870, y=640, w=300,h=100, color="lMagenta", font=40,code=pressKey("return2")}),
@@ -200,11 +202,11 @@ local Widgets={
--Rule
newSlider({name="mindas", x=180, y=150,w=400,unit=15,font=25, disp=CUSval("mindas"), code=CUSsto("mindas")}),
newSlider({name="minarr", x=180, y=220,w=400,unit=10,font=25, disp=CUSval("minarr"), code=CUSsto("minarr")}),
newSlider({name="minsdarr", x=180, y=290,w=200,unit=4, font=22, disp=CUSval("minsdarr"),code=CUSsto("minsdarr")}),
newSlider({name="minsdarr", x=180, y=290,w=200,unit=4, font=20, disp=CUSval("minsdarr"),code=CUSsto("minsdarr")}),
newSwitch({name="ospin", x=260, y=380, font=30, disp=CUSval("ospin"), code=CUSrev("ospin")}),
newSwitch({name="noTele", x=260, y=460, font=25, disp=CUSval("noTele"), code=CUSrev("noTele")}),
newSwitch({name="fineKill", x=260, y=530, font=22, disp=CUSval("fineKill"),code=CUSrev("fineKill")}),
newSwitch({name="easyFresh", x=260, y=600, font=18, disp=CUSval("easyFresh"),code=CUSrev("easyFresh")}),
newSwitch({name="fineKill", x=260, y=530, font=20, disp=CUSval("fineKill"),code=CUSrev("fineKill")}),
newSwitch({name="easyFresh", x=260, y=600, font=20, disp=CUSval("easyFresh"),code=CUSrev("easyFresh")}),
newSelector({name="visible", x=800, y=160,w=260,color="lBlue", list=CUSlist.visible, disp=CUSval("visible"), code=CUSsto("visible")}),
newSelector({name="target", x=800, y=260,w=260,color="green", list=CUSlist.target, disp=CUSval("target"), code=CUSsto("target")}),
newSelector({name="freshLimit", x=800, y=360,w=260,color="purple", list=CUSlist.freshLimit,disp=CUSval("freshLimit"),code=CUSsto("freshLimit")}),
@@ -212,10 +214,6 @@ local Widgets={
newSelector({name="life", x=1100, y=260,w=260,color="red", list=CUSlist.life, disp=CUSval("life"), code=CUSsto("life")}),
newSelector({name="pushSpeed", x=1100, y=360,w=260,color="red", list=CUSlist.pushSpeed, disp=CUSval("pushSpeed"),code=CUSsto("pushSpeed")}),
--Copy/Paste
newButton({name="copy", x=560, y=640, w=300,h=100, color="lRed", font=25,code=pressKey("cC")}),
newButton({name="paste", x=870, y=640, w=300,h=100, color="lBlue", font=25,code=pressKey("cV")}),
newButton({name="basic", x=900, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_basic","swipeR")}),
newButton({name="sequence", x=1140, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_seq","swipeL")}),
newButton({name="back", x=1140, y=640, w=170,h=80, color="white", font=40,code=BACK}),
@@ -352,7 +350,7 @@ local Widgets={
newButton({name="setting", x=1120, y=70, w=240,h=90, color="lBlue", font=35,code=pressKey("s")}),
newButton({name="replay", x=640, y=250, w=240,h=100,color="lYellow",font=30,code=pressKey("p"),hide=function()return not(game.result or game.replaying)or #players>1 end}),
newButton({name="resume", x=640, y=367, w=240,h=100,color="lGreen", font=30,code=pressKey("escape")}),
newButton({name="restart", x=640, y=483, w=240,h=100,color="lRed", font=33,code=pressKey("r")}),
newButton({name="restart", x=640, y=483, w=240,h=100,color="lRed", font=35,code=pressKey("r")}),
newButton({name="quit", x=640, y=600, w=240,h=100,color="white", font=35,code=BACK}),
},
setting_game={
@@ -384,12 +382,12 @@ local Widgets={
newSwitch({name="grid", x=700, y=240, disp=SETval("grid"), code=SETrev("grid")}),
newSwitch({name="bagLine", x=700, y=300, disp=SETval("bagLine"), code=SETrev("bagLine")}),
newSlider({name="lockFX", x=350, y=350,w=373,unit=5, font=32,disp=SETval("lockFX"), code=SETsto("lockFX")}),
newSlider({name="dropFX", x=350, y=400,w=373,unit=5, font=32,disp=SETval("dropFX"), code=SETsto("dropFX")}),
newSlider({name="moveFX", x=350, y=450,w=373,unit=5, font=32,disp=SETval("moveFX"), code=SETsto("moveFX")}),
newSlider({name="clearFX", x=350, y=500,w=373,unit=5, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}),
newSlider({name="shakeFX", x=350, y=550,w=373,unit=5, font=32,disp=SETval("shakeFX"), code=SETsto("shakeFX")}),
newSlider({name="atkFX", x=350, y=600,w=373,unit=5, font=32,disp=SETval("atkFX"), code=SETsto("atkFX")}),
newSlider({name="lockFX", x=350, y=350,w=373,unit=5, font=30,disp=SETval("lockFX"), code=SETsto("lockFX")}),
newSlider({name="dropFX", x=350, y=400,w=373,unit=5, font=30,disp=SETval("dropFX"), code=SETsto("dropFX")}),
newSlider({name="moveFX", x=350, y=450,w=373,unit=5, font=30,disp=SETval("moveFX"), code=SETsto("moveFX")}),
newSlider({name="clearFX", x=350, y=500,w=373,unit=5, font=30,disp=SETval("clearFX"), code=SETsto("clearFX")}),
newSlider({name="shakeFX", x=350, y=550,w=373,unit=5, font=30,disp=SETval("shakeFX"), code=SETsto("shakeFX")}),
newSlider({name="atkFX", x=350, y=600,w=373,unit=5, font=30,disp=SETval("atkFX"), code=SETsto("atkFX")}),
newSlider({name="frame", x=350, y=650,w=373,unit=10,font=30,
disp=function()
return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4
@@ -429,8 +427,8 @@ local Widgets={
newSlider({name="stereo", x=180, y=500,w=400, font=35,change=function()SFX.play("move",1,-1)SFX.play("lock",1,1)end,disp=SETval("stereo"),code=SETsto("stereo"),hide=function()return setting.sfx==0 end}),
newSlider({name="spawn", x=180, y=300,w=400, font=30,change=function()SFX.fplay("spawn_"..rnd(7),setting.spawn)end,disp=SETval("spawn"), code=SETsto("spawn")}),
newSlider({name="bgm", x=180, y=400,w=400, font=35,change=function()BGM.freshVolume()end, disp=SETval("bgm"), code=SETsto("bgm")}),
newSlider({name="vib", x=750, y=200,w=400, unit=5, font=28,change=function()VIB(2)end, disp=SETval("vib"), code=SETsto("vib")}),
newSlider({name="voc", x=750, y=300,w=400, font=32,change=function()VOC.play("test")end, disp=SETval("voc"), code=SETsto("voc")}),
newSlider({name="vib", x=750, y=200,w=400, unit=5, font=25,change=function()VIB(2)end, disp=SETval("vib"), code=SETsto("vib")}),
newSlider({name="voc", x=750, y=300,w=400, font=35,change=function()VOC.play("test")end, disp=SETval("voc"), code=SETsto("voc")}),
newButton({name="back", x=1140, y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
setting_control={
@@ -564,7 +562,7 @@ local Widgets={
newSlider({name="sfx", x=800, y=380, w=180, font=40,change=function()SFX.play("virtualKey",setting.VKSFX)end,disp=SETval("VKSFX"),code=SETsto("VKSFX")}),
newSlider({name="vib", x=800, y=460, w=180,unit=2, font=40,change=function()VIB(setting.VKVIB)end,disp=SETval("VKVIB"),code=SETsto("VKVIB")}),
newSwitch({name="icon", x=850, y=300, font=40,disp=SETval("VKIcon"),code=SETrev("VKIcon")}),
newButton({name="tkset", x=1120, y=420, w=240,h=80,color="white",font=32,
newButton({name="tkset", x=1120, y=420, w=240,h=80,color="white",font=30,
code=function()
SCN.go("setting_trackSetting")
end,
@@ -589,8 +587,9 @@ local Widgets={
newButton({name="back", x=640, y=600,w=200,h=80,color="white", font=35,code=BACK}),
},
minigame={
newButton({name="p15", x=640, y=100,w=350,h=120,color="white",font=40,code=goScene("p15")}),
newButton({name="p15", x=240, y=250,w=350,h=120,color="white",font=40,code=goScene("p15")}),
newButton({name="schulte_G",x=640, y=250,w=350,h=120,color="white",font=40,code=goScene("schulte_G")}),
newButton({name="pong", x=1040, y=250,w=350,h=120,color="white",font=40,code=goScene("pong")}),
newButton({name="back", x=1140, y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
p15={
@@ -603,25 +602,28 @@ local Widgets={
newButton({name="back", x=1140,y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
schulte_G={
newButton({name="reset", x=160,y=100,w=180,h=100,color="lGreen", font=40,code=pressKey("r"),hide=function()return sceneTemp.state==0 end}),
newButton({name="reset", x=160,y=100,w=180,h=100,color="lGreen", font=40,code=pressKey("space"),hide=function()return sceneTemp.state==0 end}),
newSlider({name="rank", x=130,y=250,w=150,unit=3,show=false, font=40,disp=function()return sceneTemp.rank-3 end, code=function(v)sceneTemp.rank=v+3 end,hide=function()return sceneTemp.state>0 end}),
newSwitch({name="blind", x=240,y=330,w=60, font=40,disp=function()return sceneTemp.blind end, code=pressKey("q"),hide=function()return sceneTemp.state==1 end}),
newSwitch({name="disappear",x=240,y=420,w=60, font=40,disp=function()return sceneTemp.disappear end, code=pressKey("w"),hide=function()return sceneTemp.state==1 end}),
newSwitch({name="tapFX", x=240,y=510,w=60, font=40,disp=function()return sceneTemp.tapFX end, code=pressKey("e"),hide=function()return sceneTemp.state==1 end}),
newButton({name="back", x=1140,y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
pong={
newKey({name="reset", x=640,y=45,w=150,h=50,color="white", font=35,code=pressKey("r")}),
newKey({name="back", x=640,y=675,w=150,h=50,color="white", font=35,code=BACK}),
},
help={
newButton({name="dict", x=1140, y=410,w=220,h=70,color="white",font=35,code=goScene("dict")}),
newButton({name="staff", x=1140, y=490,w=220,h=70,color="white",font=35,code=goScene("staff")}),
newButton({name="his", x=1140, y=570,w=220,h=70,color="white",font=35,code=goScene("history")}),
newButton({name="qq", x=1140, y=650,w=220,h=70,color="white",font=35,code=function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,hide=mobileHide}),
newButton({name="back", x=640, y=600,w=200,h=80,color="white",font=35,code=BACK}),
newButton({name="back", x=640, y=600,w=170,h=80,color="white",font=35,code=BACK}),
},
dict={
newKey({name="hideKB", x=1050, y=90,w=120,h=120,color="white",font=40,code=pressKey("kb"),hide=function()return not sceneTemp.select end}),
newButton({name="back", x=1190, y=90,w=120,h=120,color="white",font=40,code=BACK}),
newKeyboard({name="kb", x=40, y=280,w=1200,h=420,hide=function()return sceneTemp.select end}),
newKeyboard({name="kb", x=400, y=360,w=840,h=340,hide=function()return not sceneTemp.select or sceneTemp.hideKB end}),
newKey({name="hideKB", x=940,y=70,w=240,h=80,color="white",font=40,code=pressKey("kb"),hide=function()return not sceneTemp.select end}),
newButton({name="back", x=1165,y=70,w=170,h=80,color="white",font=40,code=BACK}),
newKeyboard({name="kb", x=310,y=325,w=940,h=370,hide=function()return sceneTemp.hideKB end}),
},
staff={
newButton({name="back", x=1140, y=640,w=170,h=80,color="white",font=40,code=BACK}),

View File

@@ -1,4 +1,4 @@
gameVersion="Alpha V0.11.1"
gameVersion="Alpha V0.11.2"
love.setDeprecationOutput(false)
function love.conf(t)
t.identity="Techmino"--Saving folder

View File

@@ -1,17 +1,13 @@
return{
{"xinren new noob readme", "help","新人须知","给想入圈的新人:\n两大根本原则:\n1.选手感好的版本(top/jstris/tetrjs/tech),别用编程练习渣版本\n2.踏实打好基础(next预判稳定消四),别只想着炫酷T旋\n两大主要技巧:\n1.熟悉初始位置以及到各个位置的初始操作\n2.提前计算好下一块能放哪\n(推荐阅读)一位块圈dalao给新人的话:www.bilibili.com/read/cv2352939"},
{"harddrop hd", "help","HardDrop","harddrop.com/\n全球俄罗斯方块社区"},
{"harddrop hd wiki", "help","HardDrop wiki","harddrop.com/wiki/Tetris_Wiki\n全球俄罗斯方块社区的百科全书(英文)"},
{"yanjiu study", "other","研究群号","俄罗斯方块·[研究]群号112897780,“中国俄罗斯方块群”"},
{"chafu study", "other","茶服","茶服的添加方法、说明等关于茶服的一切:\n139.199.75.237/tos/home/"},
{"github", "other","Github仓库","github.com/MrZ626/Techmino\nTechmino的github仓库地址,欢迎star"},
{"huiji wiki", "help","灰机wiki","tetris.huijiwiki.com\n俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n当前大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki"},
{"ttt", "game","TTT","139.199.75.237/ttt\n现代方块特殊操作手把手教程【必须有键盘才能玩,建议用电脑】\n推荐能无hold纯消四完成40行挑战的人学习\n内含T-spin、极简、SRS、部分对战定式介绍等教程\n完全吃透了话就可以成为教练啦!!\n在群内可以提示,但请勿发答案,不然题目就没意义了"},
{"ttpc", "game","TTPC","139.199.75.237/ttpc\nSRSbag7方块开局PC教程【手机触屏玩不了】\n推荐完成了ttt的人学习(必须先学会SRS)\n【不包括六巧板等其它PC定式】"},
{"ttpc", "game","TTPC","139.199.75.237/ttpc\nsRSbag7方块开局PC教程【手机触屏玩不了】\n推荐完成了ttt的人学习(必须先学会SRS)\n【不包括六巧板等其它PC定式】"},
{"nazo", "game","NAZO","139.199.75.237/nazo\n各类SRS考试题【手机触屏玩不了】\n推荐能通过ttt的玩家尝试\n内含各种t-spin/all-spin题目,简单到极难题目都有"},
{"kos kingofstackers", "game","KOS","King of Stackers\nkingofstackers.com/games.php\n网页版回合制对战方块点击即玩(可能很卡)"},
{"kos kingofstackers", "game","King of Stackers","King of Stackers\nkingofstackers.com/games.php\n网页版回合制对战方块点击即玩(可能很卡)"},
{"tetrjs", "game","Tetr.js","farter.cn/t\n全平台网页版单机方块点击即玩,有对新人比较友好的全自定义(大多数常用功能),手机只能选几个默认按键组,不能自由摆放。别的都很好"},
{"tl tetralegends", "game","Tetra Legends","tetralegends.app\n电脑端网页版单机方块点击即玩(第一次加载可能很慢),除了手感不够舒适以外功能比较强大,动效很好看,还把很多别的游戏里不可见的机制可视化了,游戏体验很好\n注:包含节奏模式!"},
{"js jstris", "game","Jstris","jstris.jezevec10.com\n全平台网页对战方块点击即玩,(服务器在国外可能很卡)"},
@@ -19,148 +15,189 @@ return{
{"wwc worldwidecombo", "game","World Wide Combo","worldwidecombos.com\n网页全世界匹配制1对1方块点击即玩"},
{"tf tetrisfriends", "game","Tetris Friends","一个已经关服了的网页版方块,曾经是一个不错的对战平台"},
{"t99 tetris99", "game","Tetris99","NS端方块,主玩99人混战的吃鸡模式,战术比重比较大,胜率不只由玩家在平时1v1时的水平决定。也有一些常用单机模式如马拉松等"},
{"ppt puyopuyotetris", "game","Puyopuyo Tetris","NS端方块(有steamPC版但是手感,网络等都不太好),将tetris和puyopuyo两个下落消除游戏放到一个游戏里,二者可以对战,联机单机模式都很多,很有趣"},
{"tgm tetrisgrandmaster", "game","TGM","一个街机平台方块系列,S13/GM等称号出自该系列,可以在win平台运行"},
{"dtet", "game","DTET","一个Win平台方块,基于经典规则加入了20G和一个很强大的旋转系统,手感非常好,但是除了键位都不可自定义,能习惯经典出块方向的玩家可以玩"},
{"hb heboris", "game","Heboris","一个Win平台方块,仿街机,可以模拟多个方块游戏的部分模式"},
{"txm textmaster", "game","Textmaster","一个Win平台方块,包含TGM的所有模式,可以用来练习TGM,手感比真版较好,不足的是world规则不完全一样(如软降到底无锁延,踢墙表有细节不同等)"},
{"dtet", "game","DTET","一个win平台方块,基于经典规则加入了20G和一个很强大的旋转系统,手感非常好,但是除了键位都不可自定义,能习惯经典出块方向的玩家可以玩(就是有点难找到,找到了可能还要自己装缺了的dll文件)"},
{"hb heboris", "game","Heboris","一个win平台方块,仿街机,可以模拟多个方块游戏的部分模式"},
{"txm texmaster", "game","Textmaster","一个win平台方块,包含TGM的所有模式,可以用来练习TGM,手感比真版较好,不足的是world规则不完全一样(如软降到底无锁延,踢墙表有细节不同等)"},
{"top tetris online study", "game","Tetris Online","一个Win平台方块,主要用来6人内对战/单挑/刷每日40L榜/挖掘模式/打机器人。支持自定义das/arr但都不能到0,有一点输入延迟但问题不大,是新人入块圈不错的选择"},
{"te tetriseffect", "game","Tetris Effect","一个Win/ns/ps4平台方块,特效方块游戏,只有单机模式,手感不算太好,想看特效的可以一试,只是去玩方块的不是很建议"},
{"techmino", "game","Techmino","一个Win/安卓/linux/macOS方块,只有单机,但是模式和各种设置都很齐全,适合有一定基础的新人,输入延迟很小,手感很好"},
{"c2 cultris2 cultrisii", "game","Cultris II","一个Win/Linux/macOS平台方块,基于经典规则,但支持自定义das/arr,主玩对战,打法是基于时间的连击,考验玩家速度/wide打法/挖掘"},
{"np nullpomino", "game","Nullpomino","一个Win平台方块,整个游戏自定义程度极高,几乎任何参数都可以自己设置,是一个专业级方块,不太适合新人上手,连菜单都不太好搞清楚"},
{"touhoumino", "game","Touhoumino","块圈玩家自制win平台方块,其实就是一个nullpomino的自带资源包的改版,将东方project元素结合到俄罗斯方块的游戏,好玩但是难度较大,适合有方块基础并且各项能力都较强的玩家游玩(不然都不知道自己怎么死的)"},
{"t99 tetris99", "game","Tetris99","ns端方块,主玩99人混战的吃鸡模式,战术比重比较大,胜率不只由玩家在平时1v1时的水平决定。也有一些常用单机模式如马拉松等"},
{"ppt puyopuyotetris", "game","Puyopuyo Tetris","多平台方块(steamPC版手感,网络等都不太好,不建议购买),将tetris和puyopuyo两个下落消除游戏放到一个游戏里,二者可以对战,联机单机模式都很多,很有趣"},
{"top tetris online study", "game","Tetris Online","一个win平台方块,主要用来6人内对战/单挑/刷每日40L榜/挖掘模式/打机器人。支持自定义das/arr但都不能到0,有一点输入延迟但问题不大,是新人入块圈不错的选择\n\n现在还开着的服务器有:\nTO-P(波兰服,服务器在波兰,可能会卡顿)\nTO-S(研究服,研究群群友自己开的服,很稳定,需要进群注册)\nTO-X(千雪服,VUP星月千雪于20年9月开的服,还处于实验阶段)"},
{"te tetriseffect", "game","Tetris Effect","一个win/ns/ps4平台方块,特效方块游戏,只有单机模式,手感不算太好,想看特效的可以一试,只是去玩方块的不是很建议"},
{"techmino tieke", "game","Techmino","一个win/android/linux/macOS方块,只有单机,但是模式和各种设置都很齐全,适合有一定基础的新人,输入延迟很小,手感很好"},
{"c2 cultris2 cultrisii", "game","Cultris II","一个win/linux/macOS平台方块,基于经典规则,但支持自定义das/arr,主玩对战,打法是基于时间的连击,考验玩家速度/wide打法/挖掘"},
{"np nullpomino", "game","Nullpomino","一个win平台方块,整个游戏自定义程度极高,几乎任何参数都可以自己设置,是一个专业级方块,不太适合新人上手,连菜单都不太好搞清楚"},
{"touhoumino chewan dongfang","game","Touhoumino","块圈玩家自制win平台方块,其实就是一个nullpomino的自带资源包的改版,将东方project元素结合到俄罗斯方块的游戏,好玩但是难度较大,适合有方块基础并且各项能力都较强的玩家游玩(不然都不知道自己怎么死的)"},
{"misamino", "game","Misamino","块圈玩家自制win平台方块,单机1v1,主玩回合制模式,可以自定义ai(自己写的话需要了解接口)"},
{"jj gougou", "game","JJ块","jj棋牌平台下一个休闲游戏,安卓百度“JJ比赛”官网下载平台后可以找到(找不到的话是你没在官网下载或者你是ios系统)。竖屏,输入延迟很小超流畅,可自定义das/arr/20G软降,简单自定义键位,无hold,没有b2b,无攻击缓冲不可抵消,每次攻击上限为4,连击较强,其他同现代方块"},
{"huopin", "game","火拼俄罗斯","腾讯游戏大厅的方块,场地12列,打字的das和arr,1next,无hold,攻击途径只有 消4打3 消3打2,垃圾行为国际象棋棋盘式,几乎不可能挖掘"},
{"huopin qq", "game","火拼俄罗斯","腾讯游戏大厅的方块,场地12列,打字的das和arr,1next,无hold,攻击途径只有 消4打3 消3打2,垃圾行为国际象棋棋盘式,几乎不可能挖掘"},
{"lpm sudu", "term","LPM","Line per Minute,行每分,体现玩家下块速度(TOP中的lpm是用pps换算的,不是字面意思)"},
{"pps sudu", "term","PPS","Piece per Second,块每秒,体现玩家下块速度"},
{"bpm sudu", "term","BPM","Block per Minute,块每分,体现玩家下块速度,别问为什么不是PPM,问就是不知道"},
{"apm gongji", "term","APM","Attack per Minute,攻击每分,玩家每分钟打出的垃圾行数,一定程度体现玩家攻击力"},
{"kpm sudu", "term","KPM","Key per Minute,按键每分,体现玩家按键速度"},
{"kpp", "term","KPP","Key per Piece,按键每块,体现玩家操作是否繁琐,学会极简提升操作效率以减少此数字"},
{"apl xiaolv", "term","APL","Attack per Line,攻击每行,也叫效率,体现玩家攻击的的行利用率"},
{"lpm sudu", "term","LPM","Line per Minute,行每分,体现玩家下块速度(TOP中的lpm是用pps换算的,不是字面意思)"},
{"pps sudu", "term","PPS","Piece per Second,块每秒,体现玩家下块速度"},
{"bpm sudu", "term","BPM","Block per Minute,块每分,体现玩家下块速度,别问为什么不是PPM,问就是不知道"},
{"apm gongji", "term","APM","Attack per Minute,攻击每分,玩家每分钟打出的垃圾行数,一定程度体现玩家攻击力"},
{"kpm sudu", "term","KPM","Key per Minute,按键每分,体现玩家按键速度"},
{"kpp anjian", "term","KPP","Key per Piece,按键每块,体现玩家操作是否繁琐,学会极简提升操作效率以减少此数字"},
{"apl xiaolv", "term","APL","Attack per Line,攻击每行,也叫效率,体现玩家攻击的的行利用率"},
{"pc perfectclear", "term","PC","Perfect Clear(全消),消除场地上所有的方块"},
{"hpc", "term","HPC","PC(全消)的外延,如果去掉消除部分之下的场地后上面部分是一个PC,那么这个消除就是半PC,打出一些攻击(仅Tech中有)"},
{"tss t1", "term","TSS","指T方块spin消1行"},
{"tsd t2", "term","TSD","指T方块spin消2行"},
{"tst t3", "term","TST","指T方块spin消3行"},
{"mtss", "term","MTSS","指T方块mini spin消1行(不同游戏判定不一样)"},
{"mtsd", "term","MTSD","指T方块mini spin消2行(仅部分游戏内存在且判定不一样)"},
{"single", "term","Single","一次消了一行的意思"},
{"double", "term","Double","一次消了两行的意思"},
{"triple", "term","Triple","一次消了三行的意思"},
{"techrash xiaosi", "term","Techrash","一次消了四行的意思(Tech限定)"},
{"tetris xiaosi", "term","Tetris","商标,Tetris游戏名,同时也是别的方块游戏里消四的名字。含义是Tetra(古希腊语 四)+Tennis(作者喜欢的运动)"},
{"pc perfectclear ac", "term","PC","Perfect Clear(全消),消除场地上所有的方块"},
{"hpc clear", "term","HPC","Half-PC,PC(全消)的外延,如果去掉消除部分之下的场地后上面部分是一个PC,那么这个消除就是半PC,打出一些攻击(仅Tech中有)"},
{"tss t1", "term","TSS","T-spin single,指T方块spin消1行"},
{"tsd t2", "term","TSD","T-spin double,指T方块spin消2行"},
{"tst t3", "term","TST","T-spin triple,指T方块spin消3行"},
{"mtss", "term","MTSS","mini T-spin single,指T方块mini spin消1行(不同游戏判定不一样)"},
{"mtsd", "term","MTSD","mini T-spin double,指T方块mini spin消2行(仅部分游戏内存在且判定不一样)"},
{"single xiaoyi", "term","Single","一次消了一行的意思"},
{"double xiaoer", "term","Double","一次消了两行的意思"},
{"triple xiaosan", "term","Triple","一次消了三行的意思"},
{"techrash xiaosi", "term","Techrash","一次消了四行的意思(Tech限定)"},
{"tetris xiaosi", "term","Tetris","商标,Tetris游戏名,同时也是别的方块游戏里消四的名字。含义是Tetra(古希腊语 四)+Tennis(作者喜欢的运动)"},
{"srs", "term","SRS","Super Rotation System,现代方块最常用的旋转系统,每个方块都有一个旋转中心,旋转后如果和场地有重合,会根据旋转的方向进行一些偏移测试,可以让方块钻进入一些特定形状的洞"},
{"nrs", "term","NRS","Nintendo Rotation System"},
{"ars", "term","ARS","Arika/Atari Rotation System"},
{"drs", "term","DRS","DTET Rotation System"},
{"trs", "term","TRS","Techmino Rotation System"},
{"srs rotate", "term","SRS","Super Rotation System,现代方块最常用的旋转系统,每个方块都有一个旋转中心,旋转后如果和场地有重合,会根据旋转的方向进行一些偏移测试,可以让方块钻进入一些特定形状的洞"},
{"nrs rotate", "term","NRS","Nintendo Rotation System"},
{"ars rotate", "term","ARS","Arika/Atari Rotation System"},
{"drs rotate", "term","DRS","DTET Rotation System"},
{"trs rotate", "term","TRS","Techmino Rotation System,Techmino独有的旋转系统,基于SRS设计,修补了一些常见SZ卡死的地形,增加了不少实用踢墙,每个五联块也基本按照SRS的spin逻辑单独设计了踢墙表"},
{"spin", "term","Spin","(部分游戏中)使用旋转将方块卡进不能直接移动进入的位置,在一些规则下有攻击加成"},
{"allspin", "term","Allspin","一种规则,指所有方块的spin都有攻击力,而不止是Tspin才有攻击(Tspin only)"},
{"tspin", "term","Tspin","在官方规则中,当T方块在锁定前的最后一个操作是旋转,并且锁定后旋转中心对应的四个斜角位置有三个不是空气,那么这就是一个Tspin。PS:如果满足一些额外条件会被打上mini标签减少攻击力"},
{"spin", "term","Spin","(部分游戏中)使用旋转将方块卡进不能直接移动进入的位置,在一些规则下有攻击加成"},
{"allspin", "term","Allspin","一种规则,指所有方块的spin都有攻击力,而不止是Tspin才有攻击(Tspin only)"},
{"tspin txuan", "term","Tspin","在官方规则中,当T方块在锁定前的最后一个操作是旋转,并且锁定后旋转中心对应的四个斜角位置有三个不是空气,那么这就是一个Tspin。PS:如果满足一些额外条件会被打上mini标签减少攻击力"},
{"irs initialrotatesystem", "term","IRS","Initial Rotation System,提前旋转系统,提前按下旋转后方块出现就是转好的形状,有时可以避免死亡"},
{"ihs initialholdsystem", "term","IHS","Initial Hold System,提前Hold系统,提前按下hold后直接出现hold里的方块,有时可以避免死亡"},
{"ims initialmovesystem", "term","IMS","Initial Move System,提前移动系统,提前按下移动后方块出现在移动好的位置,有时可以避免死亡"},
{"next", "term","Next","预览功能,指示后边几个块的顺序,思考这块怎么摆可以让后面轻松"},
{"hold", "term","Hold","暂存功能,将手里的方块和hold槽中的交换,用来调整块序,不能连续使用,更容易摆出你想要的形状"},
{"next yulan xiayige", "term","Next","预览功能,指示后边几个块的顺序,思考这块怎么摆可以让后面轻松"},
{"hold zancun", "term","Hold","暂存功能,将手里的方块和hold槽中的交换,用来调整块序,不能连续使用,更容易摆出你想要的形状"},
{"md misdrop", "term","Misdrop","误放,就是不小心放错了地方"},
{"mh mishold", "term","Mishold","误hold,就是不小心按到hold导致失去pc机会等"},
{"sub", "term","sub","在…之下,用于表示成绩,单位一般可不写,比如40行成绩sub30是秒,1000行sub15是分钟,不写项目默认是40L"},
{"mini", "term","mini","附加mini的spin攻击会弱化,用于平衡不同难易度的tspin攻击,判定在不同游戏都不一样,而且大多数很不好理解,建议只记住常见形状即可"},
{"b2b2b b3b", "term","b2b2b","b2b的加强版,缩写b3b,大量b2b后连续b2b会变成b2b2b(b3b),提供更强的攻击(仅Tech中)"},
{"b2b btb backtoback", "term","b2b","Back to Back,连续打出两次特殊消行(spin和消四),中间不夹杂普通消行,可以提供额外的攻击(在tech中b2b为满贯,大满贯是b3b)"},
{"sub", "term","sub","在…之下,用于表示成绩,单位一般可不写,比如40行成绩sub30是秒,1000行sub15是分钟,不写项目默认是40L\n\n例:39.95秒是sub40,40.5秒不是sub40\n请不要使用sub62之类的词,因为sub本身就是表示大约,一分钟左右精确到10就可以了,一般30秒以内的sub才会精确到1秒"},
{"mini", "term","mini","spin附加mini攻击会弱化,用于平衡不同难易度的tspin攻击,判定在不同游戏都不一样,而且大多数很不好理解,建议只记住常见形状即可"},
{"b2b btb backtoback", "term","B2B","Back to Back,连续打出两次特殊消行(spin和消四),中间不夹杂普通消行,可以提供额外的攻击(在tech中b2b为满贯,大满贯是b3b)"},
{"b2b2b b3b", "term","B2B2B","b2b的加强版,缩写b3b,大量b2b后连续b2b会变成b2b2b(b3b),提供更强的攻击(仅Tech中)"},
{"fin neo iso", "term","Fin/Neo/Iso","一种特殊T2的名字,不同的游戏内的攻击可能不一样,没有特殊价值,可以不详细了解"},
{"donate juanzeng", "term","Donate","捐赠,指刻意临时盖住洞去做tspin等操作来实现不断b2b的一类技巧"},
{"gongshou", "term","攻守","通过消除给对手发送垃圾行=攻击\n别人打过来攻击之后用攻击抵消=防御(相杀)\n抵消/吃下所有攻击后打出攻击=反击\n注:大多游戏的攻防是1:1的,4行攻击抵消对手的4行攻击"},
{"s2w", "term","S2W","Side 2 Wide,旁边空2列"},
{"s1w", "term","S1W","Side 1 Wide,旁边空1列"},
{"s3w", "term","S3W","Side 3 Wide,旁边空3列"},
{"c1w", "term","C1W","Center 1 Wide,中间空1列"},
{"c2w", "term","C2W","Center 2 Wide,中间空2列"},
{"c3w", "term","C3W","Center 3 Wide,中间空3列"},
{"s4w", "term","S4W","Side 4 Wide,旁边空四列,连击打法的一种,没有c4w那么不平衡,但是也减少很多游戏乐趣"},
{"c4w", "term","C4W","Center 4 Wide,中间空四列,连击打法的一种,是一种利用游戏机制的不平衡策略(尤其在开局时),可以以弱胜强(所以很不光彩,请自觉不要天天用)"},
{"dt bt qt mt wolfmoon wm dtpc ddpc btpc stsd stmb cspin asc sewer tki god spin lst 狼月 千鸟格子 皇家十字 皇十 雨宫炮 汉堡包 汉堡肉 六巧板 信天翁 鹈鹕 绯红之王", "term","一种定式","详细请到harddrop查询"},
{"side", "term","Side","在场地旁边空出n列的堆叠法,用来制造连击,对于新人是一个不错的进攻方法。但由于起楼的时候可能会被顶死而且总效率不高,导致高端玩家不会单独做wide,更可能会在中局堆好炮并且观察到对手短时间内不会打出伤害的时候可以造,用来大幅加强瞬时火力"},
{"s2w side2wide", "term","S2W","Side 2 Wide,旁边空2列"},
{"s1w side2wide", "term","S1W","Side 1 Wide,旁边空1列"},
{"s3w side2wide", "term","S3W","Side 3 Wide,旁边空3列"},
{"s4w side4wide", "term","S4W","Side 4 Wide,旁边空4列,连击打法的一种,没有c4w那么不平衡,但是也减少很多游戏乐趣"},
{"c1w center1wide", "term","C1W","Center 1 Wide,中间空1列"},
{"c2w center2wide", "term","C2W","Center 2 Wide,中间空2列"},
{"c3w center3wide", "term","C3W","Center 3 Wide,中间空3列"},
{"c4w center4wide", "term","C4W","Center 4 Wide,中间空四列,连击打法的一种,是一种利用游戏机制的不平衡策略(尤其在开局时),可以以弱胜强(所以很不光彩,请自觉不要天天用)"},
{"dt", "term","DT炮", "Double-Triple Cannon,详细请到hd wiki查询"},
{"dtpc", "term","DTPC", "DT炮一个能接PC的分支,详细请到hd wiki查询"},
{"bt", "term","BT炮", "β炮(Beta炮),详细请到hd wiki查询"},
{"btpc", "term","BTPC", "BT炮一个能接PC的分支,详细请到hd wiki查询"},
{"ddpc", "term","DDPC", "Double接Double接PC的开局定式,详细请到hd wiki查询"},
{"qt", "term","QT炮", "QT炮,详细请到hd wiki查询"},
{"mt", "term","MT炮", "Mini-Triple炮,详细请到hd wiki查询"},
{"wolfmoon", "term","狼月炮", "狼月炮,详细请到hd wiki查询"},
{"asc", "term","ASC", "详细请到hd wiki查询"},
{"sewer", "term","Sewer", "详细请到hd wiki查询"},
{"tki", "term","TKI", "TKI开局,有两种解释,详细请到hd wiki查询"},
{"god", "term","God Spin", "God Spin,一个观赏性很强,几乎没有实战意义的开局定式,详细请到hd wiki查询"},
{"stsd", "term","STSD","Super T-spin Double,一种能做两个T2的形状,详细请到hd wiki查询"},
{"stmb", "term","STMB","STMB cave,在高空3宽坑架SZ捐一个T2的形状,详细请到hd wiki查询"},
{"cspin", "term","Cspin","JL脚对脚立起来形成一个C形,缺口做适当的填充后可以打T3+T2,详细请到hd wiki查询"},
{"lst", "term","LST堆叠","一种不断b2b一直做T2的堆叠方法,详细请到hd wiki查询"},
{"yugong", "term","雨宫炮","一种捐T2后可消四的形状,常见于DT的一个分支,详细请到hd wiki查询"},
{"qianniaoge", "term","千鸟格子","一种在小洞上捐一个T2后还能做一个T2的形状,详细请到hd wiki查询"},
{"royale cross huangjiashizi","term","皇家十字","在一个十字形洞口盖屋檐后可以做两个T2,详细请到hd wiki查询"},
{"hamburger hanbaobao", "term","汉堡包","一种边缘捐T不影响消四的堆叠法,详细请到hd wiki查询"},
{"liuqiaoban", "term","六巧板","一种常用于增加中局PC概率的形状,详细请到hd wiki查询"},
{"xintianweng", "term","信天翁","一种高观赏性几乎不浪费T的快节奏强力T2-T3-T2-PC开局,详细请到hd wiki查询"},
{"tihu", "term","鹈鹕","一种类似信天翁的定式,在块序不能信天翁的时候可以用,详细请到hd wiki查询"},
{"feihongzhiwang", "term","绯红之王","在STSD上叠一个T3,详细请到hd wiki查询"},
{"setup dingshi", "term","定式","能称为定式的要尽量满足以下至少2~3条:\n能适应大多数块序\n输出高,尽量不浪费T块\n很多方块无需软降,极简操作数少\n有明确后续,分支尽量少"},
{"63", "term","6-3堆叠法","指左边6列右边3列的堆叠方式。在玩家有足够的计算能力后可以减少堆叠所用的按键数(反之可能甚至会增加),是主流的用于减少操作数的高端40L堆叠方式,原理跟出块位置是中间偏左有关。"},
{"ren combo", "term","连击","从第二次消除起叫1ren/combo"},
{"20g", "term","20G","现代方块的最高下落速度,表观就是方块瞬间到底,不存在中间的下落过程,会让方块无法跨越壕沟/从山谷爬出"},
{"die death siwang", "term","死亡判定","现代方块的死亡判定:\n1.新出现的方块和场地方块有重叠窒息c4w比s4w强的原因,因为被打进18行都不会窒息\n2.方块锁定时完全在场地的外面\n3.所有东西的总高度超出40"},
{"drop speed", "term","下落速度","一般用?G表示方块的下落速度,意思是每一帧方块往下移动多少格子,一秒下落一格就是1/60G(默认60fps),故G是一个很大的单位,20G即为上限"},
{"lock delay", "term","锁延","锁定延迟,方块\"碰到地面→锁定\"之间的时间。经典块仅方块下落一格时刷新倒计时,而现代方块中往往任何操作都将重置该倒计时,所以连续移动和操作可以让方块不马上锁定,拖一会时间(重置次数有限,一般是15)"},
{"finesse", "term","Finesse","极简操作,用最少的按键数将方块移到想去的位置的技术,节约时间和减少misdrop。练习可用jstris的极简错误重开或者techmino中打开极简错误提示,多玩就可以"},
{"das", "term","DAS","das是从\"按下移动键时动了一格\"\"开始自动移动\"之间的时间\narr是\"每次自动移动\"之间的时间\n单位都是 帧,也就是1/60秒\n新人推荐用das=8~10,arr=1~2\n有一定水平想提速用das=4~6,arr=0~1"},
{"das", "term","DAS通俗","打字时按住o,你会看到:Ooooooooooo\n在时间轴上:O-----------o-o-o-o-o-o-o-o-o-o\n-----------就是das长度,-就是arr长度"},
{"arr", "term","ARR","详见das词条"},
{"bag7 7bag", "term","bag7","bag7,一种现代方块的出块方式,开局起每7个块是7种形状各出现一次,如:1234567 1357246 7654321"},
{"his", "term","His出块","一种出块方式,例如his 4 roll 6 (h4r6)就是在随机生成新的next的时候,随机一个跟最后4次生成的next中有一样的,就重新随机,直到已经尝试6次或和那4个都不一样。"},
{"ospin", "term","Ospin","由于O方块旋转后形状不变,只能左右移动,所以经常被卡住,于是方块圈就有了ospin的梗:\n有人做过T99/TF中的O变形的特效视频且广为流传\nT-ex设计的旋转系统可以用spin使O传送进坑\nTech设计的变形系统中可以旋转O来变形/传送进入一些特定形状的洞。"},
{"ospin", "term","Ospin操作表","{111,5,2, 0,-1,0},{111,5,2,-1,-1,0},{111,5,0,-1, 0,0},//T\n{333,5,2,-1,-1,0},{333,5,2, 0,-1,0},{333,5,0, 0, 0,0},//T\n{313,1,2,-1, 0,0},{313,1,2, 0,-1,0},{313,1,2, 0, 0,0},//Z\n{131,2,2, 0, 0,0},{131,2,2,-1,-1,0},{131,2,2,-1, 0,0},//S\n{113,3,2,-1,-1,0},{331,3,0,-1, 0,0},{331,3,2, 0, 0,0},//L\n{331,4,2, 0,-1,0},{113,4,0, 0, 0,0},{113,4,2,-1, 0,0},//J\n{222,7,2,-1, 0,1},{222,7,2,-2, 0,1},{222,7,2, 0, 0,1},//I\n{121,6,0, 1,-1,1},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},//O\n{323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},//O\n//key,id,dir,dx,dy,freeLv(0=unmovable,1=?Unmvb,2=free)"},
{"hypertap", "term","hypertap","快速震动手指,实现比长按更快速+灵活的高速单点移动"},
{"top attack", "term","TOP攻击","消1/2/3/4打0/1/2/4\nTspin攻击为消行数*2,如果符合mini条件则/2\n连击攻击:001122334445+\nb2b攻击+1(如果是T3则+2)\npc攻击+6(该部分攻击aoe直接打出到所有对手,不抵消缓冲槽中的攻击)"},
{"tech attack", "term","Techmino攻击表","攻击系统:\n 普通消除:\n 消<4行打出[消行数-0.5]攻击\n 特殊消除:\n 如果是spin,打出[2*消行数]攻击,\n B2B攻击+[1/1/2/4/8(spin1~5)]\n B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡\n mini减至25%\n 不是spin但是单次消>=4行,打出[消行数]攻击,\n B2B攻击+1\n B3B攻击+50%,+1额外抵挡\n 特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)\n 半全消(\"下方有剩余方块\"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2\n 全消:将上述伤害之和减半,再+8~20(本局内递增2),+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)\n 连击:每次连击给予上述攻击[连击数*25%(如果只消一行就是15%)]的加成,12combo达到上限,连击>=3次时再额外加1攻击\n 根据上述规则计算后,向下取整,攻击打出"},
{"c2", "term","C2序列","七个块初始权重0\n全体乘2再加0~1的随机数,选数字最大的块出,然后将其权重除以3.5,循环"},
{"c2", "term","C2踢墙","左,右,下,左下,右下,左2,右2\n(任何方块的任何旋转都使用这个表)"},
{"duidie stack", "term","堆叠","将方块无缝隙地堆起来"},
{"shuangxuan", "term","双旋","指能够使用顺时针+逆时针两个旋转键的技术,原来要转三下的情况可以反向转一下就够,减少烦琐操作。\n双旋也是学习finesse的必要前提\n另见 三旋"},
{"sanxuan", "term","三旋","指能够使用顺+逆时针+180度旋转三个旋转键的技术,任何方块只需要旋转一次即可。但由于只有部分游戏有180度旋转所以并不通用,而且对速度提升的效果不如双旋显著,不是追求极限速度的玩家可不学"},
{"input delay", "term","输入延迟","所有的操作都会晚一点到达游戏,top、te等游戏比较明显,一般来说不可设置,电脑开启性能模式可能会好一点。效果类似于你拿qq远程控制打fps游戏"},
{"cc coldclear", "term","Cold Clear","一个ai的名字(就跟alphaGo一样)"},
{"zzzbot", "term","ZZZbot","一个ai的名字(就跟alphaGo一样)"},
{"63", "term","6-3堆叠法","指左边6列右边3列的堆叠方式。在玩家有足够的计算能力后可以减少堆叠所用的按键数(反之可能甚至会增加),是主流的用于减少操作数的高端40L堆叠方式,原理跟出块位置是中间偏左有关。"},
{"ren combo", "term","连击","从第二次消除起叫1ren/combo"},
{"20g", "term","20G","现代方块的最高下落速度,表观就是方块瞬间到底,不存在中间的下落过程,会让方块无法跨越壕沟/从山谷爬出"},
{"die death siwang", "term","死亡判定","现代方块的死亡判定:\n1.新出现的方块和场地方块有重叠窒息c4w比s4w强的原因,因为被打进18行都不会窒息\n2.方块锁定时完全在场地的外面\n3.所有东西的总高度超出40"},
{"drop speed", "term","下落速度","一般用?G表示方块的下落速度,意思是每一帧方块往下移动多少格子,一秒下落一格就是1/60G(默认60fps),故G是一个很大的单位,20G即为上限(因为场地就20格)"},
{"lock delay", "term","锁延","锁定延迟,方块<碰到地面→锁定>之间的时间。经典块仅方块下落一格时刷新倒计时,而现代方块中往往任何操作都将重置该倒计时,所以连续移动和操作可以让方块不马上锁定,拖一会时间(重置次数有限,一般是15)"},
{"finesse", "term","Finesse","极简操作,用最少的按键数将方块移到想去的位置的技术,节约时间和减少misdrop。练习可用jstris的极简错误重开或者techmino中打开极简错误提示,多玩就可以"},
{"keyan", "term","科研","常用语,指在低重力的单人模式里减速研究怎么做各种Tspin,本游戏中拓展了含义,用于称呼几乎需要全程spin的游戏模式"},
{"das", "term","DAS","Delay-auto-shift,自动移动延迟,指从<按下移动键时动了一格>到<开始自动移动>之间的时间\nARR则<每次自动移动>之间的时间\n单位都是 帧,也就是1/60秒\n新人推荐用das=8~10,arr=1~2\n有一定水平想提速用das=4~6,arr=0~1"},
{"arr", "term","ARR","Auto-repeat-rate\n详见das词条"},
{"das arr", "term","DAS通俗","打字时按住o,你会看到:Ooooooooooo\n在时间轴上:O-----------o-o-o-o-o-o-o-o-o-o\n-----------就是das长度,-就是arr长度"},
{"bag7bag", "term","bag7","bag7,一种现代方块的出块方式,开局起每7个块是7种形状各出现一次,如:1234567 1357246 7654321"},
{"history", "term","His出块","一种出块方式,例如his 4 roll 6 (h4r6)就是在随机生成新的next的时候,随机一个跟最后4次生成的next中有一样的,就重新随机,直到已经尝试6次或和那4个都不一样。"},
{"ospin", "term","Ospin","由于O方块旋转后形状不变,只能左右移动,所以经常被卡住,于是方块圈就有了ospin的梗:\n有人做过T99/TF中的O变形的特效视频且广为流传\nT-ex设计的旋转系统可以用spin使O传送进坑\nTech设计的变形系统中可以旋转O来变形/传送进入一些特定形状的洞。"},
{"ospin ctrl", "term","Ospin操作","{111,5,2, 0,-1,0},{111,5,2,-1,-1,0},{111,5,0,-1, 0,0},//T\n{333,5,2,-1,-1,0},{333,5,2, 0,-1,0},{333,5,0, 0, 0,0},//T\n{313,1,2,-1, 0,0},{313,1,2, 0,-1,0},{313,1,2, 0, 0,0},//Z\n{131,2,2, 0, 0,0},{131,2,2,-1,-1,0},{131,2,2,-1, 0,0},//S\n{331,3,2, 0,-1,0},{113,3,0, 0, 0,0},{113,3,2,-1, 0,0},//J\n{113,4,2,-1,-1,0},{331,4,0,-1, 0,0},{331,4,2, 0, 0,0},//L\n{222,7,2,-1, 0,1},{222,7,2,-2, 0,1},{222,7,2, 0, 0,1},//I\n{121,6,0, 1,-1,2},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},//O\n{323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},//O\n//keys, ID, dir, dx, dy, freeLevel (0=immovable,1=L+R immovable,2=free)"},
{"hypertap", "term","hypertap","快速震动手指,实现比长按更快速+灵活的高速单点移动"},
{"top attack", "term","TOP攻击表","消1/2/3/4打0/1/2/4\nTspin攻击为消行数*2,如果符合mini条件则/2\n连击攻击:001122334445+\nb2b攻击+1(如果是T3则+2)\npc攻击+6(该部分攻击aoe直接打出到所有对手,不抵消缓冲槽中的攻击)"},
{"tech attack", "term","Techmino攻击表","攻击系统:\n 普通消除:\n 消<4行打出[消行数-0.5]攻击\n 特殊消除:\n 如果是spin,打出[2*消行数]攻击,\n B2B攻击+[1/1/2/4/8(spin1~5)]\n B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡\n mini减至25%\n 不是spin但是单次消>=4行,打出[消行数]攻击,\n B2B攻击+1\n B3B攻击+50%,+1额外抵挡\n 特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)\n 半全消(<下方有剩余方块>的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2\n 全消:将上述伤害之和减半,再+8~20(本局内递增2),+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)\n 连击:每次连击给予上述攻击[连击数*25%(如果只消一行就是15%)]的加成,12combo达到上限,连击>=3次时再额外加1攻击\n 根据上述规则计算后,向下取整,攻击打出"},
{"c2 seq", "term","C2序列","七个块初始权重0\n全体乘2再加0~1的随机数,选数字最大的块出,然后将其权重除以3.5,循环"},
{"c2 kick", "term","C2踢墙","左,右,下,左下,右下,左2,右2\n(任何方块的任何旋转都使用这个表)"},
{"duidie stack", "term","堆叠","将方块无缝隙地堆起来"},
{"shuangxuan", "term","双旋","指能够使用顺时针+逆时针两个旋转键的技术,原来要转三下的情况可以反向转一下就够,减少烦琐操作。\n双旋也是学习finesse的必要前提\n另见 三旋"},
{"sanxuan", "term","三旋","指能够使用顺+逆时针+180度旋转三个旋转键的技术,任何方块只需要旋转一次即可。但由于只有部分游戏有180度旋转所以并不通用,而且对速度提升的效果不如双旋显著,不是追求极限速度的玩家可不学"},
{"drought ganhan", "term","干旱","指长时间不来i方块,但在现代方块使用的bag7出块规则下干旱几乎不可能,平均7块就会有一个i,理论极限两个i最远中间隔12块"},
{"mph", "term","MPH mode","一个游戏模式:\nMemoryless, Previewless, Holdless\n纯随机+无next+无hold,一个非常考验玩家反应速度的模式"},
{"input delay", "term","输入延迟","所有的操作都会晚一点到达游戏,top、te等游戏比较明显,一般来说不可设置,电脑开启性能模式可能会好一点。效果类似于你拿qq远程控制打fps游戏"},
{"cc coldclear", "term","Cold Clear","一个ai的名字(就跟alphaGo一样)"},
{"zzzbot", "term","ZZZbot","一个ai的名字(就跟alphaGo一样)"},
{"yanjiu study", "other","研究群号","俄罗斯方块·[研究]群号112897780,“中国俄罗斯方块群”"},
{"chafu study", "other","茶服","茶服的添加方法、说明等关于茶服的一切:\n139.199.75.237/tos/home/"},
{"github", "other","Github仓库","github.com/MrZ626/Techmino\nTechmino的github仓库地址,欢迎star"},
{"digui", "other","递归","一种算法,详见递归词条"},
{"hebomai hbm", "name","吉备宏纯","一流玩家(在最强大脑上以3:0击败模电)"},
{"amemiya taiyou yugong", "name","雨宫太阳","一流玩家,曾获得PPT的swap模式冠军"},
{"fst firestorm", "name","Firestorm","一流玩家,得过jscup冠军"},
{"wumbo wangbo", "name","Wumbo","一流玩家,有名的爱在对战用c4w"},
{"ajb ajanba", "name","Ajanba","一流玩家,得过jscup冠军"},
{"blink", "name","Blink","一流玩家"},
{"doremy", "name","Doremy","一流玩家,雨宫说他是世界第二"},
{"furea", "name","Furea","一流玩家,ppt的40L WR保持者+ultra WR保持者"},
{"ajanba ajb", "name","Ajanba","一流玩家,得过jscup冠军"},
{"blink", "name","Blink","一流玩家,很强"},
{"doremy 123", "name","Doremy","一流玩家,雨宫说他是世界第二"},
{"firestorm fst", "name","Firestorm","一流玩家,得过jscup冠军"},
{"furea fuleiya jk", "name","Furea","一流玩家,ppt的40L WR保持者+ultra WR保持者"},
{"iljain yijianlian", "name","Iljain","一流玩家,得过C2 rank1"},
{"kazu", "name","Kazu","一流玩家,以熟练md转捐赠闻名"},
{"microblizz", "name","Microblizz","一流玩家,曾经的世界40L WR"},
{"vincehd", "name","Vince","一流玩家,现任世界最速保持者(无延迟方块)"},
{"yakine", "name","Yakine","一流玩家,捐T如喝水,20TSD比你40行还快"},
{"jonas", "name","Jonas","经典块一流玩家,曾经的经典块第一,CTWC4连冠"},
{"joseph", "name","Joseph","经典块一流玩家,CTWC连冠,多项任天堂方块记录保持者"},
{"z xiaoz 626", "name","","这个百科的名字!"},
{"mrz zjiang 026 ddd", "name","MrZ","这个游戏的作者!"},
{"farteryhr pidaye TTT 000","name","Farter","群友,CN块圈元老之一,屁块作者"},
{"electric modian 283", "name","吴淞昊","群友,国内一流高端隐形方块玩家,上过最强大脑"},
{"diao 872", "name","Diao","群友,一流对战选手,得过jscup亚军,ttt冠军,HDO XII冠军"},
{"ditoly icrem kuimei 3055","name","葵妹","群友,被清华劝退现于北大的打块天才jk"},
{"gggf 127", "name","gggf","群友,20G规则国内一流玩家"},
{"miya miaotianmiye", "name","喵田弥夜","群友,vup,喜欢打块的猫猫(Z酱单推),techmino配音之一"},
{"naki anyingnaimu", "name","安樱奈莯","群友,vup,喜欢打块的幽灵,techmino配音之一"},
{"sniraite shege", "name","Snirate","群友,国内一流方块玩家"},
{"mifu swl", "name","Mifu","群友,vup,miya的方块教练"},
{"ttb teatube chanaiye 022","name","四方茶叶","群友,vup,CN块圈发展重要人物"},
{"ykzl yunkongzhiling 196", "name","蕴空之灵","群友,vup,效率之光"},
{"zzz zouzhizhang", "name","奏之章","群友,zzzbot的作者,CN块圈人工智能技术发展重要人物之一"},
{"tty tatianyi 512", "name","他天一","群友,zzz大爷的c2AI贡献者,打块水平国内前列"},
{"wdk windkey fengyaoshi", "name","Windkey","曾经是群友,对战基本只会开局c4w导致风评很差,要学c4w可以看他"},
{"xb 043", "name","","群友,研究群赛事主要主办人"},
{"zxc thtsod guage 655", "name","ZXC","群友,高技术力"},
{"tinko 665", "name","Tinko","群友,高技术力"},
{"koishi zixin", "name","子心","群友,vup,T99国内一流战术型玩家"},
{"mars huoxingge 608", "name","Mars608","群友,拿过ns ppt国区榜首"},
{"xingjiehuixing", "name","星街彗星","vtb,40L单旋sub40"},
{"quanshanyuji", "name","犬山玉姬","vtb,憋〇俄罗斯方块企划的发起人,掀起V圈打块潮流的Vtb"},
{"xiaseji", "name","夏色祭","vtb,憋〇企划的金字塔顶尖"},
{"kazu mdking", "name","Kazu","一流玩家,以熟练md转捐赠闻名"},
{"microblizz", "name","Microblizz","一流玩家,曾经的世界40L WR"},
{"vincehd", "name","Vince","一流玩家,现任世界最速保持者(无延迟方块)"},
{"wumbo wangbo", "name","Wumbo","一流玩家,有名的爱在对战用c4w"},
{"yakine heshui", "name","Yakine","一流玩家,捐T如喝水,20TSD比你40行还快"},
{"z xiaoz 626", "name","小Z","这个百科的名字"},
{"mrz zjiang ddd 026", "name","MrZ","这个游戏的作者"},
{"farteryhr pi TTT 000", "name","Farter","群友,CN块圈元老之一,屁块作者"},
{"sniraite shege 11renpc 024", "name","Snirate","群友,国内一流方块玩家"},
{"ttb teatube chanaiye 022", "name","四方茶叶","群友,vup,CN块圈发展重要人物"},
{"xb 043", "name","xb","群友,研究群赛事主要主办人"},
{"flyz fxg 114", "name","Flyz","群友,高技术力"},
{"gggf kissne 127", "name","gggf","群友,20G规则国内一流玩家"},
{"ykzl yunkongzhiling niao 196","name","蕴空之灵","群友,vup,效率之光"},
{"naki anyingnaimu gui 210", "name","安樱奈莯","群友,vup,喜欢打块的幽灵,techmino配音之一"},
{"zzz zouzhizhang 274", "name","奏之章","群友,zzzbot的作者,CN块圈人工智能技术发展重要人物之一"},
{"electric modian zhunbei 283", "name","吴淞昊","群友,国内一流高端隐形方块玩家,上过最强大脑"},
{"tty tatianyi 512", "name","他天一","群友,zzz大爷的c2AI贡献者之一,打块水平国内前列"},
{"mars huoxingge 608", "name","Mars608","群友,拿过ns ppt国区榜首"},
{"mifu swl nanmaomao 616", "name","Mifu","群友,vup,miya的方块教练"},
{"zxc thtsod flag 655", "name","ZXC","群友,高技术力"},
{"tinko 665", "name","Tinko","群友,高技术力"},
{"722", "name","T722","群友,音乐人"},
{"diao mengxin 872", "name","Diao","群友,一流对战选手,得过jscup亚军,ttt冠军,HDO XII冠军"},
{"sijun 942", "name","思竣","群友,算力极强的思维型选手,目前唯一在全清挑战-疯狂达成25PC的人"},
{"koishi zixin 1934", "name","子心","群友,vup,T99国内一流战术型玩家"},
{"ditoly icrem kuimei jk 3055", "name","葵妹","群友,被清华劝退现于北大的打块天才jk"},
{"lanlv 3182", "name","蓝绿","群友,高技术力,喜欢催更"},
{"miya miaotianmiye mao 7023", "name","喵田弥夜","群友,vup,喜欢打块的猫猫(Z酱单推),techmino配音之一"},
{"wdk windkey fengyaoshi", "name","Windkey","曾经是群友,对战基本只会开局c4w导致风评很差,要学c4w可以看他"},
{"xingjiehuixing", "name","星街彗星","vtb,40L单旋sub40"},
{"quanshanyuji", "name","犬山玉姬","vtb,憋〇俄罗斯方块企划的发起人,掀起V圈打块潮流的Vtb"},
{"xiaseji", "name","夏色祭","vtb,憋〇企划的金字塔顶尖"},
}

View File

@@ -61,7 +61,4 @@ Battle Royale modes:
Custom mode:
You can freely adjust most parameters (not including special effects of other game modes), and you can also draw a field to clear or make a template to build.
In build (puzzle) mode, you can toggle template display with Function key. Cells with a X cannot have blocks; empty cells can be in any state; regular colored cells have to be made of the corresponding block; garbage-colored cells can be any block but not air. Once you make the shape, you will win.
附录Appendix:
ZXC's cool O-spin map:eJxdjQEKADAIAhHu/28e1RK3wBLTEqqCmc0bJeSuYU149/qqLcFtA+sdPY7DF7oPro14qLzp3AGwKgHj
In build (puzzle) mode, you can toggle template display with Function key. Cells with a X cannot have blocks; empty cells can be in any state; regular colored cells have to be made of the corresponding block; garbage-colored cells can be any block but not air. Once you make the shape, you will win.

View File

@@ -157,30 +157,38 @@ do
local R=modeRanks
for k,v in next,R do
if type(k)=="number"then
if Modes[k]and not R[Modes[k].name]then
R[Modes[k].name]=v
end
R[k]=nil
end
end
if R.master_adavnce then
R.master_advance,R.master_adavnce=R.master_adavnce
end
if R["tech_normal+"]then
R.tech_normal2=R["tech_normal+"]
R.tech_hard2=R["tech_hard+"]
R.tech_lunatic2=R["tech_lunatic+"]
R.tech_finesse2=R["tech_finesse+"]
R["tech_normal+"],R["tech_hard+"],R["tech_lunatic+"],R["tech_finesse+"]=nil
end
if not text.modes[stat.lastPlay]then
stat.lastPlay="sprint_10"
end
--Update data file
--Check setting file
local S=setting
if type(S.spawn)~="number"then S.spawn=0 end
if type(S.ghost)~="number"then S.ghost=.3 end
if type(S.center)~="number"then S.center=1 end
if S.bgm>1 then S.bgm=S.bgm*.01 end
if S.sfx>1 then S.sfx=S.sfx*.01 end
if S.voc>1 then S.voc=S.voc*.01 end
if S.stereo>1 then S.stereo=S.stereo*.1 end
if S.VKSFX>1 then S.VKSFX=S.VKSFX*.25 end
if S.VKAlpha>1 then S.VKAlpha=S.VKAlpha*.1 end
if
type(S.block)~="boolean"or
type(S.spawn)~="number"or
type(S.ghost)~="number"or
type(S.center)~="number"or
S.bgm>1 or S.sfx>1 or S.voc>1 or
S.stereo>1 or S.VKSFX>1 or S.VKAlpha>1
then
NOGAME="delSetting"
fs.remove("settings.dat")
end
--Update data file
S=stat
if not S.spin[1][6]then
for i=1,25 do
@@ -192,7 +200,7 @@ do
newVersionLaunch=true
end
if system=="Android"and not setting.fullscreen then
LOG.print("如果你的手机状态栏不消失,请到设置界面开启全屏",300,color.yellow)
LOG.print("如果手机上方状态栏不消失,请到设置界面开启全屏",300,color.yellow)
LOG.print("Switch fullscreen on if titleBar don't disappear",300,color.yellow)
end
end

View File

@@ -1,4 +1,5 @@
local gc=love.graphics
local format=string.format
local function check_LVup(P)
if P.stat.row>=P.gameEnv.target then
P.gameEnv.target=P.gameEnv.target+10

40
modes/dig_10.lua Normal file
View File

@@ -0,0 +1,40 @@
local function check_rise(P)
if P.stat.dig==10 then
P:win()
end
end
return{
color=color.cyan,
env={
pushSpeed=6,
dropPiece=check_rise,
bg="bg1",bgm="way",
},
load=function()
PLY.newPlayer(1,340,15)
local P=players[1]
for _=1,10 do
P:garbageRise(13,1,P:RND(10))
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(10-P.stat.dig,69,335)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.row<10 then return end
local T=P.stat.time
return
T<=7 and 5 or
T<=12 and 4 or
T<=20 and 3 or
T<=40 and 2 or
T<=60 and 1 or
0
end,
}

43
modes/dig_100.lua Normal file
View File

@@ -0,0 +1,43 @@
local function check_rise(P)
for i=1,math.min(8,100-P.stat.dig)-P.garbageBeneath do
P:garbageRise(13,1,P:RND(10))
end
if P.stat.dig==100 then
P:win()
end
end
return{
color=color.green,
env={
pushSpeed=6,
dropPiece=check_rise,
bg="bg2",bgm="way",
},
load=function()
PLY.newPlayer(1,340,15)
local P=players[1]
for _=1,10 do
P:garbageRise(13,1,P:RND(10))
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(100-P.stat.dig,69,335)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.row<10 then return end
local T=P.stat.time
return
T<=120 and 5 or
T<=160 and 4 or
T<=240 and 3 or
T<=360 and 2 or
T<=480 and 1 or
0
end,
}

43
modes/dig_40.lua Normal file
View File

@@ -0,0 +1,43 @@
local function check_rise(P)
for i=1,math.min(8,40-P.stat.dig)-P.garbageBeneath do
P:garbageRise(13,1,P:RND(10))
end
if P.stat.dig==40 then
P:win()
end
end
return{
color=color.lBlue,
env={
pushSpeed=6,
dropPiece=check_rise,
bg="bg1",bgm="way",
},
load=function()
PLY.newPlayer(1,340,15)
local P=players[1]
for _=1,10 do
P:garbageRise(13,1,P:RND(10))
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(40-P.stat.dig,69,335)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.row<10 then return end
local T=P.stat.time
return
T<=50 and 5 or
T<=70 and 4 or
T<=90 and 3 or
T<=120 and 2 or
T<=180 and 1 or
0
end,
}

43
modes/dig_400.lua Normal file
View File

@@ -0,0 +1,43 @@
local function check_rise(P)
for i=1,math.min(8,400-P.stat.dig)-P.garbageBeneath do
P:garbageRise(13,1,P:RND(10))
end
if P.stat.dig==400 then
P:win()
end
end
return{
color=color.orange,
env={
pushSpeed=6,
dropPiece=check_rise,
bg="bg2",bgm="way",
},
load=function()
PLY.newPlayer(1,340,15)
local P=players[1]
for _=1,10 do
P:garbageRise(13,1,P:RND(10))
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(400-P.stat.dig,69,335)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.row<10 then return end
local T=P.stat.time
return
T<=540 and 5 or
T<=720 and 4 or
T<=960 and 3 or
T<=1500 and 2 or
T<=1800 and 1 or
0
end,
}

View File

@@ -1,7 +1,7 @@
local format=string.format
local function check_rise(P)
local L=P.garbageBeneath
if #P.clearedRow==0 then
local L=P.garbageBeneath
if L>0 then
if L<3 then
P:showTextF(text.almost,0,-120,80,"beat",.8)
@@ -9,15 +9,15 @@ local function check_rise(P)
P:showTextF(text.great,0,-120,80,"fly",.8)
end
end
for i=1,8-P.garbageBeneath do
for i=1,8-L do
P:garbageRise(13,1,P:RND(10))
end
else
if P.garbageBeneath==0 then
if L==0 then
P:showTextF(text.awesome,0,-120,80,"beat",.6)
SFX.play("clear")
BG.send(26)
for i=1,8-P.garbageBeneath do
for i=1,8 do
P:garbageRise(13,1,P:RND(10))
end
else

View File

@@ -30,7 +30,7 @@ return{
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.row,69,390)
mStr(P.modeData.event*100+100,69,440)
mStr(P.modeData.point+10,69,440)
gc.rectangle("fill",25,445,90,4)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.green,
env={
@@ -7,7 +5,7 @@ return{
next=0,hold=false,
sequence="rnd",
target=40,dropPiece=PLY.check_lineReach,
bg="aura",bgm="race",
bg="aura",bgm="waterfall",
},
load=function()
PLY.newPlayer(1,340,15)

View File

@@ -1,12 +1,10 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.green,
env={
drop=60,lock=60,
sequence="bag",bag={8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25},
target=40,dropPiece=PLY.check_lineReach,
bg="aura",bgm="race",
bg="aura",bgm="waterfall",
},
load=function()
PLY.newPlayer(1,340,15)

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.cyan,
env={

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.orange,
env={

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.lGrey,
env={

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.lBlue,
env={

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.green,
env={

View File

@@ -1,5 +1,3 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.red,
env={

View File

@@ -150,7 +150,7 @@ local spinOffset={
local FCL={
[1]={
{{11},{11,2},{1},{},{2},{2,2},{12,1},{12}},
{{11,4},{11,3},{11,2,3},{4},{3},{2,3},{2,2,3},{12,4},{12,3}},
{{11,4},{11,3},{1,4},{4},{3},{2,3},{2,2,3},{12,4},{12,3}},
},
[3]={
{{11},{11,2},{1},{},{2},{2,2},{12,1},{12},},

View File

@@ -438,9 +438,9 @@ function resetGameData()
game.seed=rnd(261046101471026)
destroyPlayers()
restoreVirtualKey()
modeEnv=curMode.env
curMode.load()--BG/BGM need redefine in custom,so up here
restoreVirtualKey()
curMode.load()
if modeEnv.task then
for i=1,#players do
players[i]:newTask(modeEnv.task)
@@ -494,8 +494,8 @@ function resetPartGameData(replaying)
end
destroyPlayers()
restoreVirtualKey()
modeEnv=curMode.env
restoreVirtualKey()
curMode.load()
if modeEnv.task then
for i=1,#players do

View File

@@ -1,200 +1,200 @@
local L
if setting.lang==1 or setting.lang==2 then
L={
"ZS JL T O I",
"VVVVVV好玩!",
"uid:225238922",
"Tetralegends也很好玩!",
"tetr.js也很好玩!",
"Tetr.io也很好玩!",
"Techminohaowan",
"Techmino 好玩!",
"STSD必死",
"REGRET!!",
"osu好玩!",
"O spin Triple!",
"Nullpomino也很好玩!",
"Naki 可爱!",
"Miya 可爱!",
"Lua天下第一",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"Let-The-Bass-Kick!",
"l-=-1",
"Jstris也很好玩!",
"fin neo iso 是满足tspin条件的特殊t2的名字",
"e^(pi*i/2)=i",
"e^(pi*i)=-1",
"DT炮=TSD+TST炮",
"Cultris II也很好玩!",
"Ctrl+W=关闭当前标签页",
"Ctrl+Tab=切换标签页",
"Ctrl+F=查找",
"Ctrl+D=复制一份",
"Ctrl+Alt+Z=查看所有qq消息",
"Ctrl+A=全选",
"Ctrl+鼠标滚轮=缩放",
"COOL!!",
"BT炮=beta炮=TCM-β炮",
"backspace=返回上一个文件目录",
"B2B2B2B存在吗?",
"B2B2B???",
"Am G F G",
"Alt+Tab=切换窗口",
"Alt+F4=关闭当前窗口",
"ALLSPIN!",
"注意到\"旋转\"到底对方块做了些什么吗?",
"有疑问? 先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"学会使用两个旋转键, 三个更好",
"新人请千万记住,打好基础,不要太早学那些花里胡哨的。",
"享受Tech的特色旋转系统!",
"无聊翻翻设置是好习惯",
"我的世界好玩!",
"提前旋转等设置可以用来救命",
"泰拉瑞亚好玩!",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"使用love2d引擎制作",
"少女祈祷中",
"扫雷好玩!",
"请不要向对方块不感兴趣的路人推荐此游戏。",
"请不要随意宣传,出了事都怪你们",
"你可以从统计页面打开游戏存档目录",
"魔方好玩!",
"喵!",
"免费吃鸡方块",
"秘密数字:626",
"每个虚拟按键都可以隐藏/显示,尺寸也可调",
"每个块的出现方向可以自定义。",
"没有专业美术的人,程序员审美警告",
"没学过编曲,音乐都是自己凭感觉写的,觉得不好听就设置里关了吧",
"联网还没做呢, 别急",
"键位是可以自定义的。",
"健康小贴士:玩游戏多眨眼,不然会干眼病",
"健康小贴士:不要熬夜,真的会猝死",
"合群了就会消失, 但是消失不代表没有意义",
"更小的DAS和ARR拥有更高的操作上限(前提是你能控制得了)",
"俄罗斯方块环游记也不错!",
"调到特殊的日期也不会发生什么的",
"低帧率会降低游戏体验",
"戴上耳机以获得最佳体验",
"大满贯10连击消四全清!",
"打好块没有捷径,多练。",
"茶娘 可爱!",
"草(日本语)",
"不要在上课时玩游戏!",
"不要随意宣传,不要随意宣传,不要随意宣传",
"不要盯着bug不放",
"不是动画,真的在加载!",
"别问游戏名怎么取的,问就是随便想的",
"本游戏难度上限很高, 做好心理准备。",
"本游戏可不是休闲游戏",
"报时机器人:新的一天开始了",
"626r/s",
"40行世界纪录:15.654s",
"4+4+4+4+2+2+1=17",
"3.1415926535897932384",
"26连T2来一个?",
"20G本质是一套全新的游戏规则",
"20连PC来一个?",
"2+2=Miya",
"2.7182818284590452353",
"15puzzle好玩!",
"11renPC!",
"100行内23PC来一个?",
"1, 2, ⑨!!!!!",
"<方块研究所>有一个Nspire-CX版本!",
"↑↑↓↓←→←→BABA",
"\\196/",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
"\\196/",
"↑↑↓↓←→←→BABA",
"1, 2, ⑨!!!!!",
"100行内23PC来一个?",
"11renPC!",
"15puzzle好玩!",
"2.7182818284590452353",
"2+2=Miya",
"20连PC来一个?",
"20G本质是一套全新的游戏规则",
"26连T2来一个?",
"3.1415926535897932384",
"4+4+4+4+2+2+1=17",
"40行世界纪录:15.654s",
"626r/s",
"报时机器人:新的一天开始了",
"本游戏可不是休闲游戏",
"本游戏难度上限很高,做好心理准备。",
"别问游戏名怎么取的,问就是随便想的",
"不是动画,真的在加载!",
"不要盯着bug不放",
"不要随意宣传,不要随意宣传,不要随意宣传",
"不要在上课时玩游戏!",
"草(日本语)",
"茶娘 可爱!",
"打好块没有捷径,多练。",
"大满贯10连击消四全清!",
"戴上耳机以获得最佳体验",
"低帧率会降低游戏体验",
"调到特殊的日期也不会发生什么的",
"俄罗斯方块环游记也不错!",
"方块研究所 有一个Nspire-CX版本!",
"更小的DAS和ARR拥有更高的操作上限(前提是你能控制得了)",
"合群了就会消失,但是消失不代表没有意义",
"健康小贴士:不要熬夜,真的会猝死",
"健康小贴士:玩游戏多眨眼,不然会干眼病",
"键位是可以自定义的",
"联网还没做呢,别急",
"没学过编曲,音乐都是自己凭感觉写的,觉得不好听就设置里关了吧",
"没有专业美术的人,程序员审美警告",
"每个块的出现方向可以自定义",
"每个虚拟按键都可以隐藏/显示,尺寸也可调",
"秘密数字:626",
"免费吃鸡方块",
"喵!",
"魔方好玩!",
"你可以从统计页面打开游戏存档目录",
"请不要随意宣传,出了事都怪你们",
"请不要向对方块不感兴趣的路人推荐此游戏。",
"扫雷好玩!",
"少女祈祷中",
"使用love2d引擎制作",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"泰拉瑞亚好玩!",
"提前旋转等设置可以用来救命",
"我的世界好玩!",
"无聊翻翻设置是好习惯",
"享受Tech的特色旋转系统!",
"新人请千万记住,打好基础,不要太早学那些花里胡哨的。",
"学会使用两个旋转键,三个更好",
"有建议的话可以把信息反馈给作者~",
"有疑问? 先看设置有没有你想要的",
"注意到\"旋转\"到底对方块做了些什么吗?",
"ALLSPIN!",
"Alt+F4=关闭当前窗口",
"Alt+Tab=切换窗口",
"Am G F G",
"B2B2B???",
"B2B2B2B存在吗?",
"backspace=返回上一个文件目录",
"BT炮=beta炮=TCM-β炮",
"COOL!!",
"Ctrl+鼠标滚轮=缩放",
"Ctrl+A=全选",
"Ctrl+Alt+Z=查看所有qq消息",
"Ctrl+D=复制一份",
"Ctrl+F=查找",
"Ctrl+Tab=切换标签页",
"Ctrl+W=关闭当前标签页",
"Cultris II也很好玩!",
"DT炮=TSD+TST炮",
"e^(pi*i)=-1",
"e^(pi*i/2)=i",
"fin neo iso 是满足tspin条件的特殊t2的名字",
"Jstris也很好玩!",
"l-=-1",
"Let-The-Bass-Kick!",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"Lua天下第一",
"Miya 可爱!",
"Naki 可爱!",
"Nullpomino也很好玩!",
"O spin Triple!",
"osu好玩!",
"Phigros好玩!",
"REGRET!!",
"STSD必死",
"Techmino好玩!",
"Techminohaowan",
"Tetr.io也很好玩!",
"Tetr.js也很好玩!",
"Tetralegends也很好玩!",
"uid:225238922",
"VVVVVV好玩!",
"ZS JL T O I",
-- "Z酱 可爱!",
}
elseif setting.lang==3 then
L={
"ZS JL T O I",
"You can set orientation for each block",
"You can open saving directory from stat. page",
"You are Grand Master",
"wwwwww",
"Who is diao",
"What about 26 TSDs?",
":pog:",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
"\"Free block game with royale mode\"",
"\\jezevec/\\jezevec/\\jezevec/",
"\\osk/\\osk/\\osk/",
"↑↑↓↓←→←→BABA",
"1, 2, ⑨!!!!!",
"11renPC!",
"2.7182818284590452353",
"2^2=Miya",
"20G actually is a brand new game rule",
"225238922 Bilibili cheers!",
"3.1415926535897932384",
"4+4+4+4+2+2+1=17",
"40L WR: 15.654s",
"少女祈禱中",
"ALLSPIN!",
"Also try 15puzzle",
"Also try Cultris II!",
"Also try Jstris!",
"Also try Minecraft",
"Also try Minesweeper",
"Also try Nullpomino!",
"Also try OSU",
"Also try Phigros",
"Also try Rubik's cube",
"Also try Terraria",
"Also try Tetr.io!",
"Also try Tetr.js!",
"Also try Tetralegends",
"Also try VVVVVV!",
"Am G F G",
"Any suggestions to author!",
"B2B2B???",
"Back to Back 10 combo Techrash PC!",
"COOL!!",
"Diao so bully",
"Disappearing doesn't mean useless",
"Do not play game in class!",
"Do not playing too long without having a break!",
"Don't look directly at the bugs!",
"DT cannon=TSD+TST",
"e^(pi*i)=-1",
"e^(pi*i/2)=i",
"Enjoy Tech. Rotation System!",
"Find out what's in the setting!",
"Have you noticed what does \"rotating\" do to block?",
"Headphones for better experience",
"Hello world!",
"Initial Rotation etc. can save your life",
"Is B2B2B2B possible?",
"l-=-1",
"Let-The-Bass-Kick!",
"Lower fps causes lower game experience",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"Lua No.1",
"Miya so cute!",
"Miya:Nya!",
"Not animation,real loading!",
"Nothing will happen when some special day come",
"O spin triple!",
"OHHHHHHHHHHHHHH",
"Only offline game now",
"Powered by love2d",
"REGRET!!",
"Secret num:626",
"Small DAS&ARR can make you faster,if you can control block correctly",
"Switch music off if make you awful",
"Techmino has a Nspire-CX edition!",
"Techmino is so fun!",
"Techmino=Technique+Tetromino",
"This game can be very hard,be mentally perpared",
"This in not a casual game",
"Try to use two rotate button,three better",
"Warning: Programmer Art",
"What about 20 PCs?",
"What about 23 PCs in 100 lines?",
"Warning: Programmer Art",
"Try to use two rotate button,three better",
"This in not a casual game",
"This game can be very hard,be mentally perpared",
"Tetris journey has network battle!",
"Tetralegends is fun!",
"Terraria is fun!",
"Techmino=Technique+Tetromino",
"Techmino is so fun!",
"Techmino has a Nspire-CX edition!",
"Switch music off if make you awful",
"Small DAS&ARR can make you faster,if you can control block correctly",
"Secret num:626",
"Rubik's cube is fun!",
"REGRET!!",
"Powered by love2d",
"Playing too much = taking drugs",
"OSU is fun!",
"Only offline game now",
"OHHHHHHHHHHHHHH",
"O spin triple!",
"Nothing will happen when some special day come",
"Not animation,real loading!",
"Miya:Nya!",
"Miya so cute!",
"Minesweeper is fun!",
"Minecraft is fun!",
"Lua No.1",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"Lower fps causes lower game experience",
"Let-The-Bass-Kick!",
"l-=-1",
"Is B2B2B2B possible?",
"Initial Rotation etc. can save your life",
"Hello world!",
"Headphones for better experience",
"Have you noticed what does \"rotating\" do to block?",
"Find out what's in the setting!",
"Enjoy Tech. Rotation System!",
"e^(pi*i/2)=i",
"e^(pi*i)=-1",
"DT cannon=TSD+TST",
"Don't look directly at the bugs!",
"DO NOT PRESS F10",
"Do not play game in class!",
"Disappearing doesn't mean useless",
"Diao so bully",
"COOL!!",
"Back to Back 10 combo Techrash PC!",
"B2B2B???",
"Any suggestions to author!",
"Am G F G",
"Also try VVVVVV!",
"Also try Tetr.js!",
"Also try Tetr.io!",
"Also try Nullpomino!",
"Also try Jstris!",
"Also try Cultris II!",
"ALLSPIN!",
"少女祈禱中",
"40L WR: 15.654s",
"4+4+4+4+2+2+1=17",
"3.1415926535897932384",
"225238922 Bilibili cheers!",
"20G actually is a brand new game rule",
"2^2=Miya",
"2.7182818284590452353",
"15puzzle is fun!",
"11renPC!",
"1, 2, ⑨!!!!!",
"↑↑↓↓←→←→BABA",
"\\osk/",
"\\jezevec/",
"\"Free block game with royale mode\"",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
":pog:",
"What about 26 TSDs?",
"Who is diao",
"wwwwww",
"You are Grand Master",
"You can open saving directory from stat. page",
"You can set orientation for each block",
"ZS JL T O I",
}
elseif setting.lang==4 then
L={'!','@','#','$','%','^','&','*','(',')','-','=','_','+','[',']','{','}','\\','|',';',':','\'','"',',','<','.','>','/','?'}
@@ -247,34 +247,34 @@ elseif setting.lang==5 then
}
else
L={
"隐形难吗?那个节目上的谁,水平那么菜也打得还行,就是你菜",
"一口一个wtcl还不赶紧去练,你是不思进取还是不想好好说话?",
"我一个滑铲就挖了个11renPC",
"我曾经在极度愤怒的时候15秒消了40行",
"天天F3F3,怕别人不知道你菜?",
"天天卖弱,你一定把把150apm吧?",
"天天催更催更,你咋不来帮忙开发啊,真以为作者很强催催啥都有?",
"设置都看过一遍了吗?明明都能调还嫌这嫌那,可牛逼了您",
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
"人只用一只手都能玩,你呢?",
"全隐40行全消四很难吗??",
"没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?",
"满口PCDT信天翁,还会点别的么?",
"叫你多练消四不听,现在要速度没速度,spin打完地形一塌糊涂,开心了?",
"叫你多练就多练,想着几天变神仙,当自己是谁?",
"极限20G不是随手通?",
"还搁这玩手机呢,作业做完了?",
"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?",
"不会吧不会吧,真的还有人不能随手Tspin?",
"别会个c4w就以为自己多强,这是基本功罢了。",
"60lpm?拍硬降刷的吧。",
"40行还要40多秒,就这?",
"3pps不是人均水平?",
"25TSD不难吧。",
"20G很难?是个人都能玩吧。",
"20连pc不是随手?",
"100apm?定式刷的吧。",
"0202年了,还在玩这种小孩子玩的游戏?",
"100apm?定式刷的吧。",
"20连pc不是随手?",
"20G很难?是个人都能玩吧。",
"25TSD不难吧。",
"3pps不是人均水平?",
"40行还要40多秒,就这?",
"60LPM?拍硬降刷的吧。",
"别会个c4w就以为自己多强,这是基本功罢了。",
"不会吧不会吧,真的还有人不能随手Tspin?",
"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?",
"还搁这玩手机呢,作业做完了?",
"极限20G不是随手通?",
"叫你多练就多练,想着几天变神仙,当自己是谁?",
"叫你多练消四不听,现在要速度没速度,spin打完地形一塌糊涂,开心了?",
"满口PCDT信天翁,还会点别的么?",
"没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?",
"全隐40行全消四很难吗??",
"人只用一只手都能玩,你呢?",
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
"设置都看过一遍了吗?明明都能调还嫌这嫌那,可牛逼了您",
"天天催更催更,你咋不来帮忙开发啊,真以为作者很强催催啥都有?",
"天天卖弱,你一定把把150apm吧?",
"天天F3F3,怕别人不知道你菜?",
"我曾经在极度愤怒的时候15秒消了40行",
"我一个滑铲就挖了个11renPC",
"一口一个wtcl还不赶紧去练,你是不思进取还是不想好好说话?",
"隐形难吗?那个节目上的谁,水平那么菜也打得还行,就是你菜",
}
end
end

View File

@@ -62,9 +62,9 @@ do
{331,3,2, 0,-1,0},{113,3,0, 0, 0,0},{113,3,2,-1, 0,0},--J
{113,4,2,-1,-1,0},{331,4,0,-1, 0,0},{331,4,2, 0, 0,0},--L
{222,7,2,-1, 0,1},{222,7,2,-2, 0,1},{222,7,2, 0, 0,1},--I
{121,6,0, 1,-1,1},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},--O
{121,6,0, 1,-1,2},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},--O
{323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},--O
}--{key,id,dir,dx,dy,freeLv(0=unmovable,1=L/R unmovable,2=free)}
}--{keys, ID, dir, dx, dy, freeLevel (0=immovable,1=L+R immovable,2=free)}
local XspinList={
{{ 1,-1},{ 1, 0},{ 1, 1},{ 1,-2},{ 1, 2}},
{{ 0,-1},{ 0,-2},{ 0, 1},{ 0,-2},{ 0, 2}},
@@ -251,8 +251,8 @@ do
[10]={{ 0,-1},{-1,-1},{ 0, 1},{ 0,-2},{ 1,-2},{ 0, 2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{ 1,-1},{ 0, 1},{ 0, 2},{ 0, 3}},
[30]={{-1, 0},{-1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{-1,-1},{ 0, 1},{ 0, 2},{ 0, 3}},
[12]={{ 1, 0},{ 0,-1},{ 1, 1},{-1, 0},{ 0, 1},{-1,-1}},
[21]={{-1, 0},{ 0,-1},{-1, 1},{ 1, 0},{ 0, 1},{ 1,-1}},
[12]={{ 1, 0},{ 0,-1},{-2, 0},{ 1, 1},{-1, 0},{ 0, 1},{-1,-1}},
[21]={{-1, 0},{ 0,-1},{ 2, 0},{-1, 1},{ 1, 0},{ 0, 1},{ 1,-1}},
[32]={{ 0,-1},{ 1, 0},{ 0, 1},{-1, 0},{-1,-1},{ 0, 2}},
[23]={{ 0,-1},{ 1,-1},{ 0, 1},{ 0,-2},{-1,-2},{ 0, 2}},
[02]={{ 0,-1},{-1, 0}},
@@ -378,9 +378,9 @@ do
for i=2,5 do AIRS[i]=AIRS[1]end
for i=8,25 do AIRS[i]=AIRS[1]end
local NONE={}
for i=1,25 do NONE[i]=ZERO end
end
local NONE={}
for i=1,25 do NONE[i]=ZERO end
return{
TRS=TRS,

View File

@@ -179,7 +179,7 @@ local _={}
for k,v in next,missionEnum do _[v]=k end
for k,v in next,_ do missionEnum[k]=v end
local function T(s,t)return love.graphics.newText(setFont(s),t)end
local function T(s,t)return love.graphics.newText(getFont(s),t)end
drawableText={
question=T(100,"?"),right=T(45,""),
small=T(30,"<"),large=T(30,">"),
@@ -224,10 +224,8 @@ drawableText={
}
do
local N1,N2={0,1},{1,0}
local N3,N4={1,1},{.5,.5}
local I1,I2={-.5,1.5},{1.5,-.5}
local I3,I4={.5,1.5},{1.5,.5}
local N1,N2,N3,N4={0,1},{1,0},{1,1},{.5,.5}
local I1,I2,I3,I4={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}
local V4={1.5,1.5}
local L1,L2={0,2},{2,0}
spinCenters={

View File

@@ -1,12 +1,16 @@
return{
{name="sprint_10", x=0, y=0, size=35,shape=1,icon="sprint", unlock={"sprint_20","sprint_40"}},
{name="sprint_20", x=-300, y=0, size=45,shape=1,icon="sprint", },
{name="sprint_40", x=0, y=-400, size=55,shape=1,icon="sprint", unlock={"sprint_100","marathon_normal","sprintPenta","sprintMPH"}},
{name="sprint_100", x=-200, y=-400, size=45,shape=1,icon="sprint", unlock={"sprint_400","drought_normal"}},
{name="sprint_400", x=-400, y=-400, size=35,shape=1,icon="sprint", unlock={"sprint_1000"}},
{name="sprint_1000", x=-600, y=-400, size=35,shape=1,icon="sprint", },
{name="drought_normal", x=-400, y=-200, size=35,shape=1,icon="noI", unlock={"drought_lunatic"}},
{name="drought_lunatic", x=-600, y=-200, size=35,shape=1,icon="mess", },
{name="sprint_20", x=-200, y=0, size=45,shape=1,icon="sprint", },
{name="sprint_40", x=0, y=-400, size=35,shape=1,icon="sprint", unlock={"dig_10","sprint_100","marathon_normal","sprintPenta","sprintMPH"}},
{name="sprint_100", x=-200, y=-200, size=45,shape=1,icon="sprint", unlock={"sprint_400","drought_normal"}},
{name="drought_normal", x=-400, y=0, size=35,shape=1,icon="noI", unlock={"drought_lunatic"}},
{name="drought_lunatic", x=-600, y=0, size=35,shape=1,icon="mess", },
{name="sprint_400", x=-400, y=-200, size=35,shape=1,icon="sprint", unlock={"sprint_1000"}},
{name="sprint_1000", x=-600, y=-200, size=35,shape=1,icon="sprint", },
{name="dig_10", x=-200, y=-400, size=35,shape=1,icon="dig", unlock={"dig_40"}},
{name="dig_40", x=-400, y=-400, size=35,shape=1,icon="dig", unlock={"dig_100"}},
{name="dig_100", x=-600, y=-400, size=35,shape=1,icon="dig", unlock={"dig_400"}},
{name="dig_400", x=-800, y=-200, size=35,shape=1,icon="dig", },
{name="marathon_normal", x=0, y=-600, size=55,shape=1,icon="flag", unlock={"marathon_hard","solo_1","round_1","blind_easy","classic_fast","survivor_easy","bigbang","zen"}},
{name="marathon_hard", x=0, y=-800, size=45,shape=1,icon="flag", unlock={"master_beginner"}},
{name="solo_1", x=-300, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_2"}},
@@ -17,7 +21,6 @@ return{
{name="techmino49_easy", x=-900, y=-1200, size=35,shape=1,icon="royale", unlock={"techmino49_hard","techmino99_easy"}},
{name="techmino49_hard", x=-900, y=-1400, size=35,shape=1,icon="royale", unlock={"techmino49_ultimate"}},
{name="techmino49_ultimate", x=-900, y=-1600, size=35,shape=1,icon="royale", },
{name="techmino99_easy", x=-1100, y=-1400, size=35,shape=1,icon="royale", unlock={"techmino99_hard"}},
{name="techmino99_hard", x=-1100, y=-1600, size=35,shape=1,icon="royale", unlock={"techmino99_ultimate"}},
{name="techmino99_ultimate", x=-1100, y=-1800, size=35,shape=1,icon="royale", },
@@ -48,10 +51,8 @@ return{
{name="survivor_ultimate", x=1100, y=-600, size=35,shape=1,icon="survivor", },
{name="attacker_hard", x=300, y=-800, size=35,shape=1,icon="attacker", unlock={"attacker_ultimate"}},
{name="attacker_ultimate", x=300, y=-1000, size=35,shape=1,icon="attacker", },
{name="defender_normal", x=500, y=-800, size=35,shape=1,icon="defender", unlock={"defender_lunatic"}},
{name="defender_lunatic", x=500, y=-1000, size=35,shape=1,icon="defender", },
{name="dig_hard", x=700, y=-800, size=35,shape=1,icon="dig", unlock={"dig_ultimate"}},
{name="dig_ultimate", x=700, y=-1000, size=35,shape=1,icon="dig", },
@@ -64,17 +65,17 @@ return{
{name="pcchallenge_normal", x=800, y=-100, size=35,shape=1,icon="pcchallenge", unlock={"pcchallenge_hard"}},
{name="pcchallenge_hard", x=1000, y=-100, size=35,shape=1,icon="pcchallenge", unlock={"pcchallenge_lunatic"}},
{name="pcchallenge_lunatic",x=1200, y=-100, size=35,shape=1,icon="pcchallenge", },
{name="tech_normal", x=400, y=-150, size=35,shape=1,icon="tech", unlock={"tech_normal+","tech_hard","tech_finesse"}},
{name="tech_finesse", x=800, y=50, size=35,shape=1,icon="tech", unlock={"tech_finesse+"}},
{name="tech_finesse+", x=1000, y=50, size=35,shape=1,icon="tech", },
{name="tech_normal+", x=650, y=150, size=35,shape=1,icon="tech", unlock={"tsd_easy"}},
{name="tech_normal", x=400, y=-150, size=35,shape=1,icon="tech", unlock={"tech_normal2","tech_hard","tech_finesse"}},
{name="tech_finesse", x=800, y=50, size=35,shape=1,icon="tech", unlock={"tech_finesse2"}},
{name="tech_finesse2", x=1000, y=50, size=35,shape=1,icon="tech", },
{name="tech_normal2", x=650, y=150, size=35,shape=1,icon="tech", unlock={"tsd_easy"}},
{name="tsd_easy", x=800, y=250, size=35,shape=1,icon="tsd", unlock={"tsd_hard"}},
{name="tsd_hard", x=1000, y=250, size=35,shape=1,icon="tsd", unlock={"tsd_ultimate"}},
{name="tsd_ultimate", x=1200, y=250, size=35,shape=1,icon="tsd", },
{name="tech_hard", x=400, y=50, size=35,shape=1,icon="tech", unlock={"tech_hard+","tech_lunatic"}},
{name="tech_hard+", x=250, y=50, size=35,shape=1,icon="tech", },
{name="tech_lunatic", x=400, y=200, size=35,shape=1,icon="tech", unlock={"tech_lunatic+"}},
{name="tech_lunatic+", x=250, y=200, size=35,shape=1,icon="tech", },
{name="tech_hard", x=400, y=50, size=35,shape=1,icon="tech", unlock={"tech_hard2","tech_lunatic"}},
{name="tech_hard2", x=250, y=50, size=35,shape=1,icon="tech", },
{name="tech_lunatic", x=400, y=200, size=35,shape=1,icon="tech", unlock={"tech_lunatic2"}},
{name="tech_lunatic2", x=250, y=200, size=35,shape=1,icon="tech", },
{name="zen", x=-800, y=-600, size=35,shape=1,icon="zen", unlock={"ultra","infinite","infinite_dig"}},
{name="ultra", x=-1000, y=-400, size=35,shape=1,icon="ultra", },

View File

@@ -58,110 +58,6 @@ local gameEnv0={
local scs=spinCenters
local kickList=require("parts/kickList")
local CCblockID={6,5,4,3,2,1,0}
local freshPrepare={
none=NULL,
bag=function(P)
local bag=P.gameEnv.bag
local L
repeat
L={}for i=1,#bag do L[i]=i end
repeat P:getNext(bag[rem(L,P:RND(#L))])until not L[1]
until #P.next>5
end,
his4=function(P)
local bag=P.gameEnv.bag
local L=#bag
P.his={bag[P:RND(L)],bag[P:RND(L)],bag[P:RND(L)],bag[P:RND(L)]}
for _=1,6 do
local i
local j=0
repeat
i=bag[P:RND(L)]
j=j+1
until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]or j==6
P:getNext(i)
rem(P.his,1)P.his[4]=i
end
end,
rnd=function(P)
local bag=P.gameEnv.bag
local L=#bag
P:getNext(bag[P:RND(L)])
for i=1,5 do
local count=0
local i
repeat
i=bag[P:RND(L)]
count=count+1
until i~=P.next[#P.next].id or count>=L
P:getNext(i)
end
end,
loop=function(P)
local bag=P.gameEnv.bag
repeat
for i=1,#bag do
P:getNext(bag[i])
end
until #P.next>5
end,
fixed=function(P)
local bag=P.gameEnv.bag
for i=1,#bag do
P:getNext(bag[i])
end
end,
}
local freshMethod={
none=NULL,
bag=function(P)
if #P.next<6 then
local bag0,bag=P.gameEnv.bag,{}
for i=1,#bag0 do bag[i]=bag0[i]end
repeat P:getNext(rem(bag,P:RND(#bag)))until not bag[1]
end
end,
his4=function(P)
if #P.next<6 then
local bag=P.gameEnv.bag
local L=#bag
for n=1,4 do
local j,i=0
repeat
i=bag[P:RND(L)]
j=j+1
until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]or j==4
P:getNext(i)
P.his[n]=i
end
end
end,
rnd=function(P)
if #P.next<6 then
local bag=P.gameEnv.bag
local L=#bag
for i=1,4 do
local count=0
local i
repeat
i=bag[P:RND(L)]
count=count+1
until i~=P.next[#P.next].id or count>=L
P:getNext(i)
end
end
end,
loop=function(P)
local bag=P.gameEnv.bag
for i=1,#bag do
P:getNext(bag[i])
end
end,
fixed=function(P)
if P.cur or P.hd then return end
P:lose()
end,
}
--------------------------</Data>--------------------------
--------------------------<LIB>--------------------------
@@ -648,8 +544,7 @@ local function drawHold(P,clr)
end end
end
local Pdraw_norm
do--function Pdraw_norm(P)
local Pdraw_norm do
local attackColor={
{color.dGrey,color.white},
{color.grey,color.white},
@@ -1263,17 +1158,124 @@ local function applyGameEnv(P)--Finish gameEnv processing
if ENV.ghost==0 then ENV.ghost=nil end
if ENV.center==0 then ENV.center=nil end
end
local function prepareSequence(P)--Call freshPrepare and set newNext
local ENV=P.gameEnv
if type(ENV.sequence)=="string"then
freshPrepare[ENV.sequence](P)
P.newNext=freshMethod[ENV.sequence]
else
print(type(ENV.sequence))
print(type(ENV.freshMethod))
assert(type(ENV.sequence)=="function"and type(ENV.freshMethod)=="function","wrong sequence generator code")
ENV.sequence(P)
P.newNext=ENV.freshMethod
local prepareSequence do
local freshPrepare={
none=NULL,
bag=function(P)
local bag=P.gameEnv.bag
local L
repeat
L={}for i=1,#bag do L[i]=i end
repeat P:getNext(bag[rem(L,P:RND(#L))])until not L[1]
until #P.next>5
end,
his4=function(P)
local bag=P.gameEnv.bag
local L=#bag
P.his={bag[P:RND(L)],bag[P:RND(L)],bag[P:RND(L)],bag[P:RND(L)]}
for _=1,6 do
local i
local j=0
repeat
i=bag[P:RND(L)]
j=j+1
until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]or j==6
P:getNext(i)
rem(P.his,1)P.his[4]=i
end
end,
rnd=function(P)
local bag=P.gameEnv.bag
local L=#bag
P:getNext(bag[P:RND(L)])
for i=1,5 do
local count=0
local i
repeat
i=bag[P:RND(L)]
count=count+1
until i~=P.next[#P.next].id or count>=L
P:getNext(i)
end
end,
loop=function(P)
local bag=P.gameEnv.bag
repeat
for i=1,#bag do
P:getNext(bag[i])
end
until #P.next>5
end,
fixed=function(P)
local bag=P.gameEnv.bag
for i=1,#bag do
P:getNext(bag[i])
end
end,
}
local freshMethod={
none=NULL,
bag=function(P)
if #P.next<6 then
local bag0,bag=P.gameEnv.bag,{}
for i=1,#bag0 do bag[i]=bag0[i]end
repeat P:getNext(rem(bag,P:RND(#bag)))until not bag[1]
end
end,
his4=function(P)
if #P.next<6 then
local bag=P.gameEnv.bag
local L=#bag
for n=1,4 do
local j,i=0
repeat
i=bag[P:RND(L)]
j=j+1
until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]or j==4
P:getNext(i)
P.his[n]=i
end
end
end,
rnd=function(P)
if #P.next<6 then
local bag=P.gameEnv.bag
local L=#bag
for i=1,4 do
local count=0
local i
repeat
i=bag[P:RND(L)]
count=count+1
until i~=P.next[#P.next].id or count>=L
P:getNext(i)
end
end
end,
loop=function(P)
local bag=P.gameEnv.bag
for i=1,#bag do
P:getNext(bag[i])
end
end,
fixed=function(P)
if P.cur or P.hd then return end
P:lose()
end,
}
function prepareSequence(P)--Call freshPrepare and set newNext
local ENV=P.gameEnv
if type(ENV.sequence)=="string"then
freshPrepare[ENV.sequence](P)
P.newNext=freshMethod[ENV.sequence]
else
print(type(ENV.sequence))
print(type(ENV.freshMethod))
assert(type(ENV.sequence)=="function"and type(ENV.freshMethod)=="function","wrong sequence generator code")
ENV.sequence(P)
P.newNext=ENV.freshMethod
end
end
end
local function loadAI(P,AIdata)--Load AI params
@@ -1618,6 +1620,7 @@ function player.attack(P,R,send,time,...)
end
end
end
function player.garbageRelease(P)
local n,flag=1
while true do
@@ -1743,7 +1746,7 @@ function player.freshBlock(P,keepGhost,control,system)
local ENV=P.gameEnv
if not keepGhost and P.cur then
P.imgY=min(#P.field+1,P.curY)
if _20G or P.keyPressing[7]and ENV.sdarr==0 then
if P._20G or P.keyPressing[7]and ENV.sdarr==0 then
local _=P.imgY
--Move ghost to bottom
@@ -1830,6 +1833,53 @@ function player.lock(P)
CC_updateField(P)
end
end
local spawnSFX_name={}for i=1,7 do spawnSFX_name[i]="spawn_"..i end
function player.resetBlock(P)
local C=P.cur
local id=C.id
local face=P.gameEnv.face[id]
local sc=scs[id][face]
P.sc=sc --Spin center
P.dir=face --Block direction
P.r,P.c=#C.bk,#C.bk[1] --Row/column
P.curX=int(6-P.c*.5)
local y=21+ceil(P.fieldBeneath/30)
P.curY=y
P.minY=y+sc[2]
local _=P.keyPressing
--IMS
if P.gameEnv.ims and(_[1]and P.movDir==-1 or _[2]and P.movDir==1)and P.moving>=P.gameEnv.das then
local x=P.curX+P.movDir
if not P:ifoverlap(C.bk,x,y)then
P.curX=x
end
end
--IRS
if P.gameEnv.irs then
if _[5]then
P:spin(2,true)
else
if _[3]then
if _[4]then
P:spin(2,true)
else
P:spin(1,true)
end
elseif _[4]then
P:spin(3,true)
end
end
end
--Spawn SFX
if P.human and id<8 then
SFX.fplay(spawnSFX_name[id],setting.spawn)
end
end
function player.spin(P,d,ifpre)
local iki=P.RS[P.cur.id]
if type(iki)=="table"then
@@ -1875,50 +1925,6 @@ function player.spin(P,d,ifpre)
iki(P,d)
end
end
function player.resetBlock(P)
local C=P.cur
local id=C.id
local face=P.gameEnv.face[id]
local sc=scs[id][face]
P.sc=sc --Spin center
P.dir=face --Block direction
P.r,P.c=#C.bk,#C.bk[1] --Row/column
P.curX=int(6-P.c*.5)
local y=21+ceil(P.fieldBeneath/30)
P.curY=y
P.minY=y+sc[2]
local _=P.keyPressing
--IMS
if P.gameEnv.ims and(_[1]and P.movDir==-1 or _[2]and P.movDir==1)and P.moving>=P.gameEnv.das then
local x=P.curX+P.movDir
if not P:ifoverlap(C.bk,x,y)then
P.curX=x
end
end
--IRS
if P.gameEnv.irs then
if _[5]then
P:spin(2,true)
else
if _[3]then
if _[4]then
P:spin(2,true)
else
P:spin(1,true)
end
elseif _[4]then
P:spin(3,true)
end
end
end
--Spawn SFX
if P.human and id<8 then
SFX.fplay("spawn_"..id,setting.spawn)
end
end
function player.hold(P,ifpre)
if not P.holded and (ifpre or P.waiting==-1) and P.gameEnv.hold then
local H,C=P.hd,P.cur
@@ -2096,7 +2102,7 @@ do--player.drop(P)--Place piece
finesseList[1][3],finesseList[1][4],finesseList[7][3],finesseList[7][4]=finesseList[1][1],finesseList[1][2],finesseList[7][1],finesseList[7][2]--"2-phase" SZI
finesseList[2]=finesseList[1]--S=Z
finesseList[4],finesseList[5]=finesseList[3],finesseList[3]--J=L=T
function player.drop(P)--Place piece
function player.drop(P)
local _
local CHN=VOC.getFreeChannel()
P.dropTime[11]=ins(P.dropTime,1,game.frame)--Update speed dial
@@ -2377,7 +2383,7 @@ do--player.drop(P)--Place piece
--Normal clear, reduce B2B point
if not C.special then
P.b2b=max(P.b2b-250,0)
P:showText(text.clear[cc],0,-30,27+cc*3,"appear",(8-cc)*.3)
P:showText(text.clear[cc],0,-30,35,"appear",(8-cc)*.3)
atk=cc-.5
sendTime=20+atk*20
cscore=cscore+clearSCR[cc]
@@ -2390,7 +2396,7 @@ do--player.drop(P)--Place piece
if cmb>=3 then
atk=atk+1
end
P:showText(text.cmb[min(cmb,21)],0,25,15+min(cmb,25)*3,cmb<10 and"appear"or"flicker")
P:showText(text.cmb[min(cmb,21)],0,25,15+min(cmb,15)*5,cmb<10 and"appear"or"flicker")
cscore=cscore+min(50*cmb,500)*(2*cc-1)
end
@@ -2526,7 +2532,7 @@ do--player.drop(P)--Place piece
cscore=int(cscore)
if ENV.score then
P:showText(cscore,(P.curX+P.sc[2]-5.5)*30,(10-P.curY-P.sc[1])*30+P.fieldBeneath+P.fieldUp,int(40-600/(cscore+20)),"score",2)
P:showText(cscore,(P.curX+P.sc[2]-5.5)*30,(10-P.curY-P.sc[1])*30+P.fieldBeneath+P.fieldUp,int(8-120/(cscore+20))*5,"score",2)
end
STAT.score=STAT.score+cscore
STAT.piece=STAT.piece+1
@@ -2575,24 +2581,26 @@ local function gameOver()--Save record
local P=players[1]
R=R(P)--New rank
if R then
if R>0 then LOG.print(text.getRank..text.ranks[R],color.green)end
local r=modeRanks[M.name]--Old rank
local _
local needSave
if R>r then
modeRanks[M.name]=R
_=true
needSave=true
end
if M.unlock then
for i=1,#M.unlock do
local m=M.unlock[i]
local n=Modes[m].name
if not modeRanks[n]then
modeRanks[n]=Modes[m].score and 0 or 6
_=true
if R>0 then
LOG.print(text.getRank..text.ranks[R],color.green)
if M.unlock then
for i=1,#M.unlock do
local m=M.unlock[i]
local n=Modes[m].name
if not modeRanks[n]then
modeRanks[n]=Modes[m].score and 0 or 6
needSave=true
end
end
end
end
if _ then
if needSave then
FILE.saveUnlock()
end
local D=M.score(P)
@@ -2659,7 +2667,7 @@ function player.win(P,result)
gameOver()
TASK.new(TICK.autoPause,{0})
if marking then
P:showTextF(text.marking,0,-226,22,"appear",.4,.0626)
P:showTextF(text.marking,0,-226,25,"appear",.4,.0626)
end
end
P:newTask(TICK.finish)
@@ -2764,7 +2772,7 @@ function player.lose(P)
P:newTask(#players>1 and TICK.lose or TICK.finish)
TASK.new(TICK.autoPause,{0})
if marking then
P:showTextF(text.marking,0,-226,22,"appear",.4,.0626)
P:showTextF(text.marking,0,-226,25,"appear",.4,.0626)
end
else
P:newTask(TICK.lose)
@@ -2786,7 +2794,7 @@ function PLY.check_attackReach(P)
end
--------------------------<\Events>--------------------------
--------------------------<Control>--------------------------
--------------------------<Actions>--------------------------
player.act={}
function player.act.moveLeft(P,auto)
if not auto then
@@ -3045,7 +3053,7 @@ do
A.dropLeft ,A.dropRight, A.zangiLeft,A.zangiRight
}for i=1,20 do A[i]=T[i]end
end
--------------------------</Control>--------------------------
--------------------------</Actions>--------------------------
--------------------------<Generator>--------------------------
function PLY.newDemoPlayer(id,x,y,size)
@@ -3128,6 +3136,7 @@ function PLY.newRemotePlayer(id,x,y,size,actions)
end
function PLY.newAIPlayer(id,x,y,size,AIdata)
local P=newEmptyPlayer(id,x,y,size)
local ENV=P.gameEnv
if P.small then
ENV.text=false

View File

@@ -103,24 +103,6 @@ do--calculator
S.reg=false
local v=tonumber(S.val)
if v==600+26 then S.pass=true
elseif v==022 then EGG("T022.Teatube")
elseif v==024 then EGG("S024.Sniraite")
elseif v==114 then EGG("T114.Flyz")
elseif v==127 then EGG("T127.gggf")
elseif v==196 then EGG("T196.蕴空之灵")
elseif v==210 then EGG("T210.Naki")
elseif v==238 then EGG("T238.模电")
elseif v==274 then EGG("T274.ZZZ")
elseif v==512 then EGG("T512.tatianyi")
elseif v==616 then EGG("T616.Mifu")
elseif v==655 then EGG("T655.ThTsOd")
elseif v==665 then EGG("T665.Tinko")
elseif v==722 then EGG("T0722")
elseif v==872 then EGG("T872.DIAO")
elseif v==942 then EGG("T942.思竣")
elseif v==1905 then EGG("T1905.Rinnya")
elseif v==3182 then EGG("T3182.蓝绿")
elseif v==7023 then EGG("T7023.Miya")
elseif v==190000+6022 then
S.pass,marking=true
LOG.print("\68\69\86\58\87\97\116\101\114\109\97\114\107\32\82\101\109\111\118\101\100","message")
@@ -241,10 +223,10 @@ do--p15
local S=sceneTemp
if S.state<2 then
if not key then
x,y=int((x-320)/160)+1,int((y-40)/160)+1
if S.pathVis then
sysFX.newRipple(.16,x,y,10)
end
x,y=int((x-320)/160)+1,int((y-40)/160)+1
end
local b=S.board
local moves=0
@@ -556,7 +538,9 @@ do--schulte_G
end
function keyDown.schulte_G(key)
local S=sceneTemp
if key=="space"or key=="r"then
if key=="z"or key=="x"then
love.mousepressed(ms.getPosition())
elseif key=="space"then
if sceneTemp.state>0 then
S.board={}
S.time=0
@@ -564,8 +548,6 @@ do--schulte_G
S.state=0
S.progress=0
end
elseif key=="z"or key=="x"then
love.mousepressed(ms.getPosition())
elseif key=="q"then
if S.state==0 then
S.blind=not S.blind
@@ -594,7 +576,6 @@ do--schulte_G
end
end
local fontSize={nil,nil,120,100,80,60}
function Pnt.schulte_G()
local S=sceneTemp
@@ -624,7 +605,7 @@ do--schulte_G
local width=640/rank
local blind=S.state==0 or S.blind and S.state==1 and S.progress>0
gc.setLineWidth(4)
local f=fontSize[rank]
local f=180-rank*20
setFont(f)
for i=1,rank do
for j=1,rank do
@@ -647,6 +628,178 @@ do--schulte_G
end
end
end
do--pong
function sceneInit.pong()
BG.set("none")
BGM.play("way")
sceneTemp={
state=0,
x=640,y=360,
vx=0,vy=0,
ry=0,
p1={
score=0,
y=360,
vy=0,
y0=false,
},
p2={
score=0,
y=360,
vy=0,
y0=false,
},
}
end
local function start()
sceneTemp.state=1
sceneTemp.vx=rnd()>.5 and 6 or -6
sceneTemp.vy=rnd()*6-3
end
function keyDown.pong(key)
local S=sceneTemp
if key=="space"then
if S.state==0 then
start()
end
elseif key=="r"then
S.state=0
S.x,S.y=640,360
S.vx,S.vy=0,0
S.ry=0
S.p1.score,S.p2.score=0,0
elseif key=="w"or key=="s"then
S.p1.y0=false
elseif key=="up"or key=="down"then
S.p2.y0=false
elseif key=="escape"then
SCN.back()
end
end
function touchDown.pong(id,x,y)
touchMove.pong(id,x,y)
if sceneTemp.state==0 then
start()
end
end
function touchMove.pong(id,x,y,dx,dy)
sceneTemp[x<640 and"p1"or"p2"].y0=y
end
--DEBUGGING
function mouseMove.pong(x,y)
sceneTemp[x<640 and"p1"or"p2"].y0=y
end
--Rect Area X:150~1130 Y:20~700
function Tmr.pong()
local S=sceneTemp
--Update pads
local P=S.p1
while P do
if P.y0 then
if P.y>P.y0 then
P.y=max(P.y-8,P.y0,70)
P.vy=-8
elseif P.y<P.y0 then
P.y=min(P.y+8,P.y0,650)
P.vy=8
else
P.vy=P.vy*.5
end
else
if kb.isDown(P==S.p1 and"w"or"up")then P.vy=max(P.vy-1,-8)end
if kb.isDown(P==S.p1 and"s"or"down")then P.vy=min(P.vy+1,8)end
P.y=P.y+P.vy
P.vy=P.vy*.9
if P.y>650 then
P.vy=-P.vy*.5
P.y=650
elseif P.y<70 then
P.vy=-P.vy*.5
P.y=70
end
end
P=P==S.p1 and S.p2
end
--Update ball
local x,y,vx,vy,ry=S.x,S.y,S.vx,S.vy,S.ry
x,y=x+vx,y+vy
if ry~=0 then
if ry>0 then
ry=max(ry-.1,0)
vy=vy-.1
else
ry=min(ry+.1,0)
vy=vy+.1
end
end
if S.state==1 then--Playing
if x<160 or x>1120 then
local P=x<160 and S.p1 or S.p2
local d=y-P.y
if abs(d)<60 then
vx=-vx-(vx>0 and .05 or -.5)
vy=vy+d*.08+P.vy*.5
ry=P.vy
SFX.play("collect")
else
S.state=2
end
end
if y<30 or y>690 then
y=y<30 and 30 or 690
vy,ry=-vy,-ry
SFX.play("collect")
end
elseif S.state==2 then--Game over
if x<-120 or x>1400 or y<-40 or y>760 then
local P=x>1400 and S.p1 or S.p2
P.score=P.score+1
TEXT.show("+1",x>1400 and 470 or 810,226,50,"score")
SFX.play("reach")
S.state=0
x,y=640,360
vx,vy=0,0
end
end
S.x,S.y,S.vx,S.vy,S.ry=x,y,vx,vy,ry
end
function Pnt.pong()
local S=sceneTemp
--Draw score
setFont(100)
gc.setColor(.4,.4,.4)
mStr(S.p1.score,470,20)
mStr(S.p2.score,810,20)
--Draw boundary
gc.setColor(1,1,1)
gc.setLineWidth(6)
gc.line(130,20,1160,20)
gc.line(130,700,1160,700)
--Draw ball & speed line
gc.setColor(1,1,1-abs(S.ry)*.16)
gc.circle("fill",S.x,S.y,10)
gc.setColor(1,1,1,.1)
gc.line(S.x+S.vx*22,S.y+S.vy*22,S.x+S.vx*30,S.y+S.vy*30)
--Draw pads
gc.setColor(1,.8,.8)
gc.rectangle("fill",130,S.p1.y-50,20,100)
gc.setColor(.8,.8,1)
gc.rectangle("fill",1130,S.p2.y-50,20,100)
end
end
do--load
function sceneInit.load()
sceneTemp={
@@ -659,6 +812,7 @@ do--load
#BGM.list,
#SFX.list,
IMG.getCount(),
17,--Fontsize 20~100
#Modes,
1,
},
@@ -697,6 +851,8 @@ do--load
elseif S.phase==4 then
IMG.loadOne(S.cur)
elseif S.phase==5 then
getFont(15+5*S.cur)
elseif S.phase==6 then
local m=Modes[S.cur]--Mode template
local M=require("modes/"..m.name)--Mode file
Modes[m.name],Modes[S.cur]=M
@@ -713,7 +869,7 @@ do--load
end
-- M.icon=gc.newImage("image/modeIcon/"..m.icon..".png")
-- M.icon=gc.newImage("image/modeIcon/custom.png")
elseif S.phase==6 then
elseif S.phase==7 then
--------------------------Loading other little things here
SKIN.load()
stat.run=stat.run+1
@@ -779,13 +935,13 @@ do--intro
for i=1,8 do
sceneTemp.r[i]=rnd(5)
end
local notice=HTTPrequest("http://47.103.200.40/api/notice.php")
local notice=HTTPrequest("http://47.103.200.40/api/notice")
if notice then
LOG.print(notice,"message")
else
LOG.print(text.getNoticeFail,"warn")
end
local newVersion=HTTPrequest("http://47.103.200.40/api/getNewVersion.php")
local newVersion=HTTPrequest("http://47.103.200.40/api/version_check")
if not newVersion then
LOG.print(text.getVersionFail,"warn")
elseif newVersion~=gameVersion then
@@ -799,9 +955,12 @@ do--intro
if k==2 then
VOC.play("bye")
SCN.back()
elseif NOGAME=="delSetting"then
LOG.print("检测到过老版本非法设置数据,设置已经全部重置,请重启游戏完成",600,color.yellow)
LOG.print("Old version detected, setting file deleted, please restart the game",600,color.yellow)
elseif NOGAME=="delCC"then
LOG.print("Please quit the game, then delete CCloader.dll(21KB) in saving folder!",600,color.yellow)
LOG.print("请关闭游戏,然后删除存档文件夹内的 CCloader.dll(21KB) !",600,color.yellow)
LOG.print("Please quit the game, then delete CCloader.dll(21KB) in saving folder!",600,color.yellow)
TASK.new(function(S)
S[1]=S[1]-1
if S[1]==0 then
@@ -990,7 +1149,7 @@ do--mode
end
mapCam.keyCtrl=false
end
function mouseClick.mode(x,y,k)
function mouseClick.mode(x,y)
local cam=mapCam
local _=cam.sel
if not _ or x<920 then
@@ -1034,8 +1193,8 @@ do--mode
end
mapCam.keyCtrl=false
end
function touchClick.mode(x,y,id)
mouseClick.mode(x,y,1)
function touchClick.mode(x,y)
mouseClick.mode(x,y)
end
function keyDown.mode(key)
if key=="return"then
@@ -1246,7 +1405,7 @@ do--mode
elseif s<25 then dy=2
else dy=4
end
setFont(int(26-s*.4))
setFont(int((26-s*.4)/3)*3)
gc.print(t,955,275+dy+25*i)
setFont(10)
_=L[i].date
@@ -2985,38 +3144,38 @@ do--dict
input="",
dict=require("document/dict"),
result={},
select=nil,
title=nil,
select=1,
scroll=0,
lastSearch=nil,
hideKB=1 or system~="Windows",
hideKB=system~="Windows",
}
BG.set("rainbow")
end
local function clearResult()
local S=sceneTemp
local result=S.result
for i=1,#result do rem(result)end
S.select,S.scroll,S.lastSearch=1,0
end
local function search()
clearResult()
local S=sceneTemp
local dict=S.dict
local result=S.result
for i=1,#result do rem(result)end
local first
for i=1,#dict do
local pos=find(dict[i][1],S.input)
local pos=find(dict[i][1],S.input,nil,true)
if pos==1 and not first then
ins(result,1,dict[i])
first=true
elseif pos then
ins(result,dict[i])
end
if first and #result==15 then
break
end
end
if result[1]then
S.select=1
S.title=result[1][3]
else
S.select=nil
S.title=nil
if not result[1]then
S.input=""
end
end
@@ -3029,38 +3188,39 @@ do--dict
elseif key=="up"then
if S.select and S.select>1 then
S.select=S.select-1
if S.select<S.scroll+1 then
S.scroll=S.scroll-1
end
end
elseif key=="down"then
if S.select and S.select<#S.result and S.select<15 then
if S.select and S.select<#(S.result[1]and S.result or S.dict)then
S.select=S.select+1
if S.select>S.scroll+15 then
S.scroll=S.select-15
end
end
elseif key=="kb"then
S.hideKB=not S.hideKB
elseif key=="delete"then
if #S.input>0 then
clearResult()
S.input=""
S.select=nil
S.lastSearch=nil
SFX.play("hold")
end
elseif key=="backspace"then
S.input=sub(S.input,1,-2)
if #S.input==0 then
S.select=nil
S.lastSearch=nil
clearResult()
end
elseif key=="escape"then
if #S.input>0 then
clearResult()
S.input=""
S.select=nil
S.lastSearch=nil
else
SCN.back()
end
elseif key=="return"then
if #S.input<2 then
S.input=""
elseif S.input~=S.lastSearch then
if #S.input>0 and S.input~=S.lastSearch then
search()
if S.result[1]then
SFX.play("reach")
@@ -3084,44 +3244,44 @@ do--dict
gc.setColor(1,1,1)
gc.draw(drawableText.dict,20,5)
gc.setLineWidth(4)
gc.rectangle("line",20,109,726,60)
setFont(40)
gc.print(S.input,35,110)
gc.setLineWidth(4)
gc.rectangle("line",20,109,726,60)
if S.select then
gc.rectangle("line",300,180,958,526)
gc.rectangle("line",20,180,280,526)
gc.setColor(1,1,1)
local text=S.result[S.select][4]
if #text>500 then
setFont(20)
elseif #text>300 then
setFont(24)
else
setFont(28)
end
gc.printf(text,306,180,950)
setFont(30)
gc.setColor(1,1,1,.4+.2*sin(Timer()*4))
gc.rectangle("fill",20,143+35*S.select,280,35)
setFont(30)
for i=1,min(#S.result,15)do
local S=S.result[i]
local y=142+35*i
gc.setColor(0,0,0)
gc.print(S[3],29,y-1)
gc.print(S[3],29,y+1)
gc.print(S[3],31,y-1)
gc.print(S[3],31,y+1)
gc.setColor(typeColor[S[2]])
gc.print(S[3],30,y)
end
local list=S.result[1]and S.result or S.dict
gc.setColor(1,1,1)
local text=list[S.select][4]
if #text>500 then
setFont(20)
elseif #text>300 then
setFont(24)
else
setFont(28)
end
gc.printf(text,306,180,950)
setFont(30)
gc.setColor(1,1,1,.4+.2*sin(Timer()*4))
gc.rectangle("fill",20,143+35*(S.select-S.scroll),280,35)
setFont(30)
for i=1,min(#list,15)do
local y=142+35*i
i=i+S.scroll
local S=list[i]
gc.setColor(0,0,0)
gc.print(S[3],29,y-1)
gc.print(S[3],29,y+1)
gc.print(S[3],31,y-1)
gc.print(S[3],31,y+1)
gc.setColor(typeColor[S[2]])
gc.print(S[3],30,y)
end
gc.setColor(1,1,1)
gc.rectangle("line",300,180,958,526)
gc.rectangle("line",20,180,280,526)
end
end
do--staff

View File

@@ -20,7 +20,7 @@ local S=[=[
aaa222 [**城] cnDD 红桃老给 昭庭玲秋
旋树墩 火花工作室 Cosine 沁音的芝麻王
SuperJH 天上_飞 uiro 宇酱 [W*N]
[Z*.]
Thanks!!!
Future outlook:
@@ -50,36 +50,44 @@ Future outlook:
no fail(∞ lives)
mini games:
2048 (with next/deadly mode)
mine sweeper
tank battle
find difference
sodoku
link-link
pong
自定义游戏允许按各种目的复制数据
地图增加模式图标
物理hold
多hold
多方块
扫雷
坦克大战
找不同
数独
连连看
热更新; 联网游戏
录像保存/导出; 按块回放录像
⑨S机器人调试模式
健康游戏时间提醒;游戏内文档
物理hold; 多hold; 多方块
自定义游戏支持选择旋转系统(C2,DTET,ASC...)
录像保存/导出
热更新
新BGM:water
画图智能画笔
健康游戏时间提醒
多语音包系统
按块回放录像
自定义游戏允许按各种目的复制数据; 画图智能画笔
地图增加模式图标; 多语音包系统
split判定及效果
工程编译到字节码
游戏内文档
方块散落动画
"一键操作"
手机滑动操作
新控件(例如虚拟摇杆)
联网游戏
支持超60帧
task-Z(新AI)
更多画面效果 & 一些3D小玩意
"一键操作"; 手机滑动操作; 特殊控件(例如虚拟摇杆)
方块散落动画; 更多画面效果; 一些3D小玩意; 支持超60帧
task-Z(新AI); 工程编译到字节码
0.11.2: 弹球小游戏 Pong
新内容:
Pong
公开小游戏入口
新BGM:waterfall(用于特种40L)
新模式:挖掘10/40/100/400/1000
改动:
修改查询机制,增加词条,优化词典体验
优化字号使用,字体预加载
减小字体文件体积(9.1M→7.8M)
增加Wspin
修复:
水平移动优先于20G
混战第一把不显示功能键的虚拟按键
Ospin小错误
无评价也能解锁下一关
词典内输入特殊符号报错/查询错误
马拉松-普通目标行数显示错误
9S机器人极简错误
报错界面执行代码无效
0.11.1: 小Z更新 Dictionary Update
新内容: