Merge branch '26F-Studio:main' into main
This commit is contained in:
Submodule Zframework updated: f8059337db...c498582a8c
56
parts/eventsets/tech_finesse_lock.lua
Normal file
56
parts/eventsets/tech_finesse_lock.lua
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
local function onMove(P)
|
||||||
|
if not P.cur then return end
|
||||||
|
P.holdTime=0
|
||||||
|
VK.keys[8].ava=false
|
||||||
|
P.modeData.moveCount=P.modeData.moveCount+1
|
||||||
|
if P.modeData.moveCount>=2 and (P.curY>P.gameEnv.fieldH-2 or P:_roofCheck()) then
|
||||||
|
P.keyAvailable[1]=false
|
||||||
|
P.keyAvailable[2]=false
|
||||||
|
VK.keys[1].ava=false
|
||||||
|
VK.keys[2].ava=false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function onRotate(P)
|
||||||
|
if not P.cur then return end
|
||||||
|
P.holdTime=0
|
||||||
|
VK.keys[8].ava=false
|
||||||
|
P.modeData.rotations=P.modeData.rotations+1
|
||||||
|
if P.modeData.rotations>=2 and not (P.curY>P.gameEnv.fieldH-2 or P:_roofCheck()) then
|
||||||
|
P.keyAvailable[3]=false
|
||||||
|
P.keyAvailable[4]=false
|
||||||
|
P.keyAvailable[5]=false
|
||||||
|
VK.keys[3].ava=false
|
||||||
|
VK.keys[4].ava=false
|
||||||
|
VK.keys[5].ava=false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function resetLock(P)
|
||||||
|
for i=1,8 do
|
||||||
|
P.keyAvailable[i]=true
|
||||||
|
VK.keys[i].ava=true
|
||||||
|
end
|
||||||
|
P.modeData.moveCount=0
|
||||||
|
P.modeData.rotations=0
|
||||||
|
P.holdTime=1
|
||||||
|
end
|
||||||
|
return {
|
||||||
|
arr=0,
|
||||||
|
mesDisp=function(P)
|
||||||
|
setFont(45)
|
||||||
|
GC.mStr(("%d"):format(P.stat.atk),63,190)
|
||||||
|
GC.mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310)
|
||||||
|
mText(TEXTOBJ.atk,63,243)
|
||||||
|
mText(TEXTOBJ.eff,63,363)
|
||||||
|
end,
|
||||||
|
task=function(P)
|
||||||
|
resetLock(P)
|
||||||
|
end,
|
||||||
|
hook_drop=function(P)
|
||||||
|
resetLock(P)
|
||||||
|
if P.stat.atk>=100 then
|
||||||
|
P:win('finish')
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
hook_left_manual=onMove, hook_right_manual=onMove,
|
||||||
|
hook_rotLeft=onRotate, hook_rotRight=onRotate, hook_rot180=onRotate
|
||||||
|
}
|
||||||
@@ -892,7 +892,7 @@ FNNS and {"Support 3",
|
|||||||
{"HisPool generator",
|
{"HisPool generator",
|
||||||
"hisPool history pool",
|
"hisPool history pool",
|
||||||
"term",
|
"term",
|
||||||
"History Pool Randomizer, a derivative of the His generator. It added a \"pool\" mechanism from which the new blocks are spawned, as opposed to the simple random generator used by His. HisPool also increases the probability of spawning a block with the lowest presence.\n\nThis mechanism stabilizes the sequence and ensures that a drought (see entry) doesn't last forever. The stability of HisPool lies between His and Bag.",
|
"History Pool Randomizer, a derivative of the His generator. It added a \"pool\" mechanism from which the new blocks are spawned, as opposed to the simple random generator used by His. HisPool also increases the probability of spawning a block with the lowest presence.\n\nThis mechanism stabilizes the sequence and ensures that a drought (see entry) doesn't last forever. The stability of HisPool lies between His and Bag.",
|
||||||
},
|
},
|
||||||
{"bagES generator",
|
{"bagES generator",
|
||||||
"bages easy start",
|
"bages easy start",
|
||||||
@@ -1256,4 +1256,4 @@ FNNS and {"Support 3",
|
|||||||
"term",
|
"term",
|
||||||
"In Tetris, timing refers to the choice of moments to attack with optimal effort. Good timing can help you to defend yourself while crushing your opponent. However, we recommend new players focus on their own fields and improve their speeds before learning timing.",
|
"In Tetris, timing refers to the choice of moments to attack with optimal effort. Good timing can help you to defend yourself while crushing your opponent. However, we recommend new players focus on their own fields and improve their speeds before learning timing.",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -365,6 +365,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[All other test staff]",
|
"[All other test staff]",
|
||||||
"…And You!",
|
"…And You!",
|
||||||
},
|
},
|
||||||
@@ -853,115 +854,117 @@ C. Gamepad
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
modes={
|
modes={
|
||||||
['sprint_10l']= {"Sprint", "10L", "Clear 10 lines!"},
|
['sprint_10l']= {"Sprint", "10L", "Clear 10 lines!"},
|
||||||
['sprint_20l']= {"Sprint", "20L", "Clear 20 lines!"},
|
['sprint_20l']= {"Sprint", "20L", "Clear 20 lines!"},
|
||||||
['sprint_40l']= {"Sprint", "40L", "Clear 40 lines!"},
|
['sprint_40l']= {"Sprint", "40L", "Clear 40 lines!"},
|
||||||
['sprint_100l']= {"Sprint", "100L", "Clear 100 lines!"},
|
['sprint_100l']= {"Sprint", "100L", "Clear 100 lines!"},
|
||||||
['sprint_400l']= {"Sprint", "400L", "Clear 400 lines!"},
|
['sprint_400l']= {"Sprint", "400L", "Clear 400 lines!"},
|
||||||
['sprint_1000l']= {"Sprint", "1000L", "Clear 1,000 lines!"},
|
['sprint_1000l']= {"Sprint", "1000L", "Clear 1,000 lines!"},
|
||||||
['sprintPenta']= {"Sprint", "PENTOMINO", "40L with the 18 pentominoes"},
|
['sprintPenta']= {"Sprint", "PENTOMINO", "40L with the 18 pentominoes"},
|
||||||
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
|
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
|
||||||
['sprint123']= {"Sprint", "M123", "40L with only monominoes, dominoes, and triminoes"},
|
['sprint123']= {"Sprint", "M123", "40L with only monominoes, dominoes, and triminoes"},
|
||||||
['secret_grade']= {"Secret Grade", "", "Building a zigzag shape by following the guide!"},
|
['secret_grade']= {"Secret Grade", "", "Building a zigzag shape by following the guide!"},
|
||||||
['dig_10l']= {"Dig", "10L", "Dig 10 garbage lines as fast as you can!"},
|
['dig_10l']= {"Dig", "10L", "Dig 10 garbage lines as fast as you can!"},
|
||||||
['dig_40l']= {"Dig", "40L", "Dig 40 garbage lines as fast as you can!"},
|
['dig_40l']= {"Dig", "40L", "Dig 40 garbage lines as fast as you can!"},
|
||||||
['dig_100l']= {"Dig", "100L", "Dig 100 garbage lines as fast as you can!"},
|
['dig_100l']= {"Dig", "100L", "Dig 100 garbage lines as fast as you can!"},
|
||||||
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines as fast as you can!"},
|
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines as fast as you can!"},
|
||||||
['dig_eff_10l']= {"Dig", "EFFICIENCY 10L", "Dig 10 garbage lines with the least pieces!"},
|
['dig_eff_10l']= {"Dig", "EFFICIENCY 10L", "Dig 10 garbage lines with the least pieces!"},
|
||||||
['dig_eff_40l']= {"Dig", "EFFICIENCY 40L", "Dig 40 garbage lines with the least pieces!"},
|
['dig_eff_40l']= {"Dig", "EFFICIENCY 40L", "Dig 40 garbage lines with the least pieces!"},
|
||||||
['dig_eff_100l']= {"Dig", "EFFICIENCY 100L","Dig 100 garbage lines with the least pieces!"},
|
['dig_eff_100l']= {"Dig", "EFFICIENCY 100L","Dig 100 garbage lines with the least pieces!"},
|
||||||
['dig_eff_400l']= {"Dig", "EFFICIENCY 400L","Dig 400 garbage lines with the least pieces!"},
|
['dig_eff_400l']= {"Dig", "EFFICIENCY 400L","Dig 400 garbage lines with the least pieces!"},
|
||||||
['dig_quad_10l']= {"Dig", "TECHRASH 10L", "Dig 10 garbage lines using only techrash!"},
|
['dig_quad_10l']= {"Dig", "TECHRASH 10L", "Dig 10 garbage lines using only techrash!"},
|
||||||
['drought_n']= {"Drought", "100L", "100L but without I blocks"},
|
['drought_n']= {"Drought", "100L", "100L but without I blocks"},
|
||||||
['drought_l']= {"Drought+", "100L", "W. T. F."},
|
['drought_l']= {"Drought+", "100L", "W. T. F."},
|
||||||
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
|
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
|
||||||
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
|
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
|
||||||
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
|
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
|
||||||
['solo_n']= {"Battle", "NORMAL", "Defeat the AI!"},
|
['solo_n']= {"Battle", "NORMAL", "Defeat the AI!"},
|
||||||
['solo_h']= {"Battle", "HARD", "Defeat the AI!"},
|
['solo_h']= {"Battle", "HARD", "Defeat the AI!"},
|
||||||
['solo_l']= {"Battle", "LUNATIC", "Defeat the AI!"},
|
['solo_l']= {"Battle", "LUNATIC", "Defeat the AI!"},
|
||||||
['solo_u']= {"Battle", "ULTIMATE", "Defeat the AI!"},
|
['solo_u']= {"Battle", "ULTIMATE", "Defeat the AI!"},
|
||||||
['techmino49_e']= {"Tech 49", "EASY", "49-player battle.\nThe last one standing wins"},
|
['techmino49_e']= {"Tech 49", "EASY", "49-player battle.\nThe last one standing wins"},
|
||||||
['techmino49_h']= {"Tech 49", "HARD", "49-player battle.\nThe last one standing wins"},
|
['techmino49_h']= {"Tech 49", "HARD", "49-player battle.\nThe last one standing wins"},
|
||||||
['techmino49_u']= {"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins"},
|
['techmino49_u']= {"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins"},
|
||||||
['techmino99_e']= {"Tech 99", "EASY", "99-player battle.\nThe last one standing wins"},
|
['techmino99_e']= {"Tech 99", "EASY", "99-player battle.\nThe last one standing wins"},
|
||||||
['techmino99_h']= {"Tech 99", "HARD", "99-player battle.\nThe last one standing wins"},
|
['techmino99_h']= {"Tech 99", "HARD", "99-player battle.\nThe last one standing wins"},
|
||||||
['techmino99_u']= {"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins"},
|
['techmino99_u']= {"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins"},
|
||||||
['round_e']= {"Turn-Based", "EASY", "Take turns to play against the AI!"},
|
['round_e']= {"Turn-Based", "EASY", "Take turns to play against the AI!"},
|
||||||
['round_n']= {"Turn-Based", "NORMAL", "Take turns to play against the AI!"},
|
['round_n']= {"Turn-Based", "NORMAL", "Take turns to play against the AI!"},
|
||||||
['round_h']= {"Turn-Based", "HARD", "Take turns to play against the AI!"},
|
['round_h']= {"Turn-Based", "HARD", "Take turns to play against the AI!"},
|
||||||
['round_l']= {"Turn-Based", "LUNATIC", "Take turns to play against the AI!"},
|
['round_l']= {"Turn-Based", "LUNATIC", "Take turns to play against the AI!"},
|
||||||
['round_u']= {"Turn-Based", "ULTIMATE", "Take turns to play against the AI!"},
|
['round_u']= {"Turn-Based", "ULTIMATE", "Take turns to play against the AI!"},
|
||||||
['big_n']= {"Big", "NORMAL", "Play in a 5×10 field!"},
|
['big_n']= {"Big", "NORMAL", "Play in a 5×10 field!"},
|
||||||
['big_h']= {"Big", "HARD", "Play in a 5×10 field!"},
|
['big_h']= {"Big", "HARD", "Play in a 5×10 field!"},
|
||||||
['master_n']= {"Master", "NORMAL", "For 20G beginners"},
|
['master_n']= {"Master", "NORMAL", "For 20G beginners"},
|
||||||
['master_h']= {"Master", "HARD", "For 20G pros"},
|
['master_h']= {"Master", "HARD", "For 20G pros"},
|
||||||
['master_m']= {"Master", "M21", "For 20G Masters"},
|
['master_m']= {"Master", "M21", "For 20G Masters"},
|
||||||
['master_final']= {"Master", "FINAL", "20G and beyond"},
|
['master_final']= {"Master", "FINAL", "20G and beyond"},
|
||||||
['master_ph']= {"Master", "PHANTASM", "???"},
|
['master_ph']= {"Master", "PHANTASM", "???"},
|
||||||
['master_g']= {"Master", "GRADED", "Get the highest grade you can!"},
|
['master_g']= {"Master", "GRADED", "Get the highest grade you can!"},
|
||||||
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
|
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
|
||||||
['master_instinct']={"Master", "INSTINCT", "What if the active piece becomes invisible?"},
|
['master_instinct']= {"Master", "INSTINCT", "What if the active piece becomes invisible?"},
|
||||||
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||||
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||||
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||||
['strategy_e_plus']={"Strategy", "EASY+", "Holdless strategy!"},
|
['strategy_e_plus']= {"Strategy", "EASY+", "Holdless strategy!"},
|
||||||
['strategy_h_plus']={"Strategy", "HARD+", "Holdless strategy!"},
|
['strategy_h_plus']= {"Strategy", "HARD+", "Holdless strategy!"},
|
||||||
['strategy_u_plus']={"Strategy", "ULTIMATE+", "Holdless strategy!"},
|
['strategy_u_plus']= {"Strategy", "ULTIMATE+", "Holdless strategy!"},
|
||||||
['blind_e']= {"Invisible", "HALF", "For beginners"},
|
['blind_e']= {"Invisible", "HALF", "For beginners"},
|
||||||
['blind_n']= {"Invisible", "ALL", "For intermediates"},
|
['blind_n']= {"Invisible", "ALL", "For intermediates"},
|
||||||
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
|
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
|
||||||
['blind_l']= {"Invisible", "SUDDEN+", "For professionals"},
|
['blind_l']= {"Invisible", "SUDDEN+", "For professionals"},
|
||||||
['blind_u']= {"Invisible", "?", "Are you ready?"},
|
['blind_u']= {"Invisible", "?", "Are you ready?"},
|
||||||
['blind_wtf']= {"Invisible", "WTF", "You're not ready."},
|
['blind_wtf']= {"Invisible", "WTF", "You're not ready."},
|
||||||
['classic_e']= {"Classic", "EASY", "A low-speed recreation game from the 80s"},
|
['classic_e']= {"Classic", "EASY", "A low-speed recreation game from the 80s"},
|
||||||
['classic_h']= {"Classic", "HARD", "A medium-speed recreation game from the 80s"},
|
['classic_h']= {"Classic", "HARD", "A medium-speed recreation game from the 80s"},
|
||||||
['classic_l']= {"Classic", "LUNATIC", "A high-speed recreation game from the 80s"},
|
['classic_l']= {"Classic", "LUNATIC", "A high-speed recreation game from the 80s"},
|
||||||
['classic_u']= {"Classic", "ULTIMATE", "An extreme-speed recreation game from the 80s"},
|
['classic_u']= {"Classic", "ULTIMATE", "An extreme-speed recreation game from the 80s"},
|
||||||
['survivor_e']= {"Survival", "EASY", "How long can you survive?"},
|
['survivor_e']= {"Survival", "EASY", "How long can you survive?"},
|
||||||
['survivor_n']= {"Survival", "NORMAL", "How long can you survive?"},
|
['survivor_n']= {"Survival", "NORMAL", "How long can you survive?"},
|
||||||
['survivor_h']= {"Survival", "HARD", "How long can you survive?"},
|
['survivor_h']= {"Survival", "HARD", "How long can you survive?"},
|
||||||
['survivor_l']= {"Survival", "LUNATIC", "How long can you survive?"},
|
['survivor_l']= {"Survival", "LUNATIC", "How long can you survive?"},
|
||||||
['survivor_u']= {"Survival", "ULTIMATE", "How long can you survive?"},
|
['survivor_u']= {"Survival", "ULTIMATE", "How long can you survive?"},
|
||||||
['attacker_h']= {"Attacker", "HARD", "Practice your attacking skills!"},
|
['attacker_h']= {"Attacker", "HARD", "Practice your attacking skills!"},
|
||||||
['attacker_u']= {"Attacker", "ULTIMATE", "Practice your attacking skills!"},
|
['attacker_u']= {"Attacker", "ULTIMATE", "Practice your attacking skills!"},
|
||||||
['defender_n']= {"Defender", "NORMAL", "Practice your defensing skills!"},
|
['defender_n']= {"Defender", "NORMAL", "Practice your defensing skills!"},
|
||||||
['defender_l']= {"Defender", "LUNATIC", "Practice your defensing skills!"},
|
['defender_l']= {"Defender", "LUNATIC", "Practice your defensing skills!"},
|
||||||
['dig_h']= {"Driller", "HARD", "Digging practice!"},
|
['dig_h']= {"Driller", "HARD", "Digging practice!"},
|
||||||
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
|
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
|
||||||
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
|
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
|
||||||
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
|
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
|
||||||
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
|
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
|
||||||
['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice"},
|
['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice"},
|
||||||
['pc_n']= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
|
['pc_n']= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
|
||||||
['pc_h']= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
|
['pc_h']= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
|
||||||
['pc_l']= {"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
|
['pc_l']= {"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
|
||||||
['pc_inf']= {"Inf. PC Challenge", "", "Get PCs as much as you can"},
|
['pc_inf']= {"Inf. PC Challenge", "", "Get PCs as much as you can"},
|
||||||
['tech_n']= {"Tech", "NORMAL", "Try to keep the\nBack-to-Back chain!"},
|
['tech_n']= {"Tech", "NORMAL", "Try to keep the\nBack-to-Back chain!"},
|
||||||
['tech_n_plus']= {"Tech", "NORMAL+", "Spins & PCs only"},
|
['tech_n_plus']= {"Tech", "NORMAL+", "Spins & PCs only"},
|
||||||
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
|
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
|
||||||
['tech_h_plus']= {"Tech", "HARD+", "Spins & PCs only"},
|
['tech_h_plus']= {"Tech", "HARD+", "Spins & PCs only"},
|
||||||
['tech_l']= {"Tech", "LUNATIC", "Try to keep the\nBack-to-Back chain!"},
|
['tech_l']= {"Tech", "LUNATIC", "Try to keep the\nBack-to-Back chain!"},
|
||||||
['tech_l_plus']= {"Tech", "LUNATIC+", "Spins & PCs only"},
|
['tech_l_plus']= {"Tech", "LUNATIC+", "Spins & PCs only"},
|
||||||
['tech_finesse']= {"Tech", "FINESSE", "No finesse errors!"},
|
['tech_finesse']= {"Tech", "FINESSE", "No finesse errors!"},
|
||||||
['tech_finesse_f']= {"Tech", "FINESSE+", "No normal clears and finesse errors!"},
|
['tech_finesse_f']= {"Tech", "FINESSE+", "No normal clears and finesse errors!"},
|
||||||
['tsd_e']= {"TSD Challenge", "EASY", "T-Spin Doubles only!"},
|
['tech_finesse_lock']= {"Tech", "FINESSE LOCK", "No finesse errors, combined with limited inputs!"},
|
||||||
['tsd_h']= {"TSD Challenge", "HARD", "T-Spin Doubles only!"},
|
['tech_finesse_lock_f']= {"Tech", "FINESSE+ LOCK", "No normal clears or finesse errors combined with limited inputs!"},
|
||||||
['tsd_u']= {"TSD Challenge", "ULTIMATE", "T-Spin Doubles only!"},
|
['tsd_e']= {"TSD Challenge", "EASY", "T-Spin Doubles only!"},
|
||||||
['backfire_n']= {"Backfire", "NORMAL", "Hold back the backfiring garbage lines"},
|
['tsd_h']= {"TSD Challenge", "HARD", "T-Spin Doubles only!"},
|
||||||
['backfire_h']= {"Backfire", "HARD", "Hold back the backfiring garbage lines"},
|
['tsd_u']= {"TSD Challenge", "ULTIMATE", "T-Spin Doubles only!"},
|
||||||
['backfire_l']= {"Backfire", "LUNATIC", "Hold back the backfiring garbage lines"},
|
['backfire_n']= {"Backfire", "NORMAL", "Hold back the backfiring garbage lines"},
|
||||||
['backfire_u']= {"Backfire", "ULTIMATE", "Hold back the backfiring garbage lines"},
|
['backfire_h']= {"Backfire", "HARD", "Hold back the backfiring garbage lines"},
|
||||||
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
|
['backfire_l']= {"Backfire", "LUNATIC", "Hold back the backfiring garbage lines"},
|
||||||
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40 lines!"},
|
['backfire_u']= {"Backfire", "ULTIMATE", "Hold back the backfiring garbage lines"},
|
||||||
['zen']= {'Zen', "200", "A 200-line run with no time limit"},
|
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
|
||||||
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
|
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40 lines!"},
|
||||||
['infinite']= {"Infinite", "", "Just a sandbox"},
|
['zen']= {'Zen', "200", "A 200-line run with no time limit"},
|
||||||
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
|
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
|
||||||
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
|
['infinite']= {"Infinite", "", "Just a sandbox"},
|
||||||
|
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
|
||||||
|
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
|
||||||
|
|
||||||
['custom_clear']= {"Custom", "NORMAL"},
|
['custom_clear']= {"Custom", "NORMAL"},
|
||||||
['custom_puzzle']= {"Custom", "PUZZLE"},
|
['custom_puzzle']= {"Custom", "PUZZLE"},
|
||||||
},
|
},
|
||||||
getTip={refuseCopy=true,
|
getTip={refuseCopy=true,
|
||||||
":pog:",
|
":pog:",
|
||||||
|
|||||||
@@ -362,6 +362,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[Todo el staff de testeo]",
|
"[Todo el staff de testeo]",
|
||||||
"…Y a ti!",
|
"…Y a ti!",
|
||||||
},
|
},
|
||||||
@@ -897,6 +898,8 @@ return {
|
|||||||
['tech_l_plus']= {"Tech", "Lunático+", "¡Sólo se permiten Spins y PCs!"},
|
['tech_l_plus']= {"Tech", "Lunático+", "¡Sólo se permiten Spins y PCs!"},
|
||||||
['tech_finesse']= {"Tech", "Finesse", "¡No cometas errores de Finesse!"},
|
['tech_finesse']= {"Tech", "Finesse", "¡No cometas errores de Finesse!"},
|
||||||
['tech_finesse_f']= {"Tech", "Finesse+", "Sin errores de finesse,\n¡pero tampoco clears normales!"},
|
['tech_finesse_f']= {"Tech", "Finesse+", "Sin errores de finesse,\n¡pero tampoco clears normales!"},
|
||||||
|
-- ['tech_finesse_lock']= {"Tech", "FINESSE LOCK", "No finesse errors, combined with limited inputs!"},
|
||||||
|
-- ['tech_finesse_lock_f']= {"Tech", "FINESSE+ LOCK", "No normal clears or finesse errors combined with limited inputs!"},
|
||||||
['tsd_e']= {"Desafío de TSD", "Fácil", "¡Sólo se permiten T-Spin Dobles!"},
|
['tsd_e']= {"Desafío de TSD", "Fácil", "¡Sólo se permiten T-Spin Dobles!"},
|
||||||
['tsd_h']= {"Desafío de TSD", "Difícil", "¡Sólo se permiten T-Spin Dobles!"},
|
['tsd_h']= {"Desafío de TSD", "Difícil", "¡Sólo se permiten T-Spin Dobles!"},
|
||||||
['tsd_u']= {"Desafío de TSD", "Supremo", "¡Sólo se permiten T-Spin Dobles!"},
|
['tsd_u']= {"Desafío de TSD", "Supremo", "¡Sólo se permiten T-Spin Dobles!"},
|
||||||
|
|||||||
@@ -341,6 +341,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[All other test staff]",
|
"[All other test staff]",
|
||||||
"…And You!",
|
"…And You!",
|
||||||
},
|
},
|
||||||
@@ -868,6 +869,8 @@ return {
|
|||||||
['tech_l_plus']= {"Tech", "LUNATIQUE+", "Spin & PC uniquement"},
|
['tech_l_plus']= {"Tech", "LUNATIQUE+", "Spin & PC uniquement"},
|
||||||
['tech_finesse']= {"Tech", "FINESSE", "Pas d'erreurs de finesse !"},
|
['tech_finesse']= {"Tech", "FINESSE", "Pas d'erreurs de finesse !"},
|
||||||
['tech_finesse_f']={"Tech", "FINESSE+", "Pas de nettoyages normaux,\nPas d'erreurs de finesse !"},
|
['tech_finesse_f']={"Tech", "FINESSE+", "Pas de nettoyages normaux,\nPas d'erreurs de finesse !"},
|
||||||
|
--['tech_finesse_lock']= {"Tech", "FINESSE LOCK", "No finesse errors, combined with limited inputs!"},
|
||||||
|
--['tech_finesse_lock_f']= {"Tech", "FINESSE+ LOCK", "No normal clears or finesse errors combined with limited inputs!"},
|
||||||
['tsd_e']= {"TSD Challenge", "FACILE", "T-spin doubles uniquement !"},
|
['tsd_e']= {"TSD Challenge", "FACILE", "T-spin doubles uniquement !"},
|
||||||
['tsd_h']= {"TSD Challenge", "DIFFICILE", "T-spin doubles uniquement !"},
|
['tsd_h']= {"TSD Challenge", "DIFFICILE", "T-spin doubles uniquement !"},
|
||||||
['tsd_u']= {"TSD Challenge", "ULTIME", "T-spin doubles uniquement !"},
|
['tsd_u']= {"TSD Challenge", "ULTIME", "T-spin doubles uniquement !"},
|
||||||
|
|||||||
@@ -363,6 +363,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[Semua staf penguji lainnya]",
|
"[Semua staf penguji lainnya]",
|
||||||
"…Dan Anda!",
|
"…Dan Anda!",
|
||||||
},
|
},
|
||||||
@@ -815,115 +816,117 @@ return {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
modes={
|
modes={
|
||||||
['sprint_10l']= {"Balapan", "10L", "Buat 10 baris!"},
|
['sprint_10l']= {"Balapan", "10L", "Buat 10 baris!"},
|
||||||
['sprint_20l']= {"Balapan", "20L", "Buat 20 baris!"},
|
['sprint_20l']= {"Balapan", "20L", "Buat 20 baris!"},
|
||||||
['sprint_40l']= {"Balapan", "40L", "Buat 40 baris!"},
|
['sprint_40l']= {"Balapan", "40L", "Buat 40 baris!"},
|
||||||
['sprint_100l']= {"Balapan", "100L", "Buat 100 baris!"},
|
['sprint_100l']= {"Balapan", "100L", "Buat 100 baris!"},
|
||||||
['sprint_400l']= {"Balapan", "400L", "Buat 400 baris!"},
|
['sprint_400l']= {"Balapan", "400L", "Buat 400 baris!"},
|
||||||
['sprint_1000l']= {"Balapan", "1.000L", "Buat 1.000 baris!"},
|
['sprint_1000l']= {"Balapan", "1.000L", "Buat 1.000 baris!"},
|
||||||
['sprintPenta']= {"Balapan", "PENTOMINO", "40L dengan pentomino!"},
|
['sprintPenta']= {"Balapan", "PENTOMINO", "40L dengan pentomino!"},
|
||||||
['sprintMPH']= {"Balapan", "MPH", "Tanpa ingatan\nTanpa pratinjau\nTanpa simpan"},
|
['sprintMPH']= {"Balapan", "MPH", "Tanpa ingatan\nTanpa pratinjau\nTanpa simpan"},
|
||||||
['sprint123']= {"Balapan", "M123", "40L dengan hanya monomino, domino, dan trimino"},
|
['sprint123']= {"Balapan", "M123", "40L dengan hanya monomino, domino, dan trimino"},
|
||||||
['secret_grade']= {"Secret Grade", "", "Buatlah formasi lubang zigzag, menuruti panduannya!"},
|
['secret_grade']= {"Secret Grade", "", "Buatlah formasi lubang zigzag, menuruti panduannya!"},
|
||||||
['dig_10l']= {"Gali", "10L", "Gali 10 baris!"},
|
['dig_10l']= {"Gali", "10L", "Gali 10 baris!"},
|
||||||
['dig_40l']= {"Gali", "40L", "Gali 40 baris!"},
|
['dig_40l']= {"Gali", "40L", "Gali 40 baris!"},
|
||||||
['dig_100l']= {"Gali", "100L", "Gali 100 baris!"},
|
['dig_100l']= {"Gali", "100L", "Gali 100 baris!"},
|
||||||
['dig_400l']= {"Gali", "400L", "Gali 400 baris!"},
|
['dig_400l']= {"Gali", "400L", "Gali 400 baris!"},
|
||||||
['dig_eff_10l']= {"Gali", "EFISIENSI 10L", "Gali 10 baris!"},
|
['dig_eff_10l']= {"Gali", "EFISIENSI 10L", "Gali 10 baris!"},
|
||||||
['dig_eff_40l']= {"Gali", "EFISIENSI 40L", "Gali 40 baris!"},
|
['dig_eff_40l']= {"Gali", "EFISIENSI 40L", "Gali 40 baris!"},
|
||||||
['dig_eff_100l']= {"Gali", "EFISIENSI 100L","Gali 100 baris!"},
|
['dig_eff_100l']= {"Gali", "EFISIENSI 100L", "Gali 100 baris!"},
|
||||||
['dig_eff_400l']= {"Gali", "EFISIENSI 400L","Gali 400 baris!"},
|
['dig_eff_400l']= {"Gali", "EFISIENSI 400L", "Gali 400 baris!"},
|
||||||
['dig_quad_10l']= {"Gali", "TECHRASH 10L", "Gali 10 baris hanya dengan techrash!"},
|
['dig_quad_10l']= {"Gali", "TECHRASH 10L", "Gali 10 baris hanya dengan techrash!"},
|
||||||
['drought_n']= {"Nasib Buruk", "100L", "Tidak ada blok I..."},
|
['drought_n']= {"Nasib Buruk", "100L", "Tidak ada blok I..."},
|
||||||
['drought_l']= {"Nasib Buruk+", "100L", "Nasib sangat buruk..."},
|
['drought_l']= {"Nasib Buruk+", "100L", "Nasib sangat buruk..."},
|
||||||
['marathon_n']= {"Maraton", "NORMAL", "200-baris maraton dengan kecepatan meningkat"},
|
['marathon_n']= {"Maraton", "NORMAL", "200-baris maraton dengan kecepatan meningkat"},
|
||||||
['marathon_h']= {"Maraton", "SULIT", "200-baris maraton dengan kecepatan tinggi"},
|
['marathon_h']= {"Maraton", "SULIT", "200-baris maraton dengan kecepatan tinggi"},
|
||||||
['solo_e']= {"Tarung", "MUDAH", "Kalahkan AInya!"},
|
['solo_e']= {"Tarung", "MUDAH", "Kalahkan AInya!"},
|
||||||
['solo_n']= {"Tarung", "NORMAL", "Kalahkan AInya!"},
|
['solo_n']= {"Tarung", "NORMAL", "Kalahkan AInya!"},
|
||||||
['solo_h']= {"Tarung", "SULIT", "Kalahkan AInya!"},
|
['solo_h']= {"Tarung", "SULIT", "Kalahkan AInya!"},
|
||||||
['solo_l']= {"Tarung", "GILA", "Kalahkan AInya!"},
|
['solo_l']= {"Tarung", "GILA", "Kalahkan AInya!"},
|
||||||
['solo_u']= {"Tarung", "TERAKHIR", "Kalahkan AInya!"},
|
['solo_u']= {"Tarung", "TERAKHIR", "Kalahkan AInya!"},
|
||||||
['techmino49_e']= {"Tech 49", "MUDAH", "Pertarungan dengan 49 pemain."},
|
['techmino49_e']= {"Tech 49", "MUDAH", "Pertarungan dengan 49 pemain."},
|
||||||
['techmino49_h']= {"Tech 49", "SULIT", "Pertarungan dengan 49 pemain."},
|
['techmino49_h']= {"Tech 49", "SULIT", "Pertarungan dengan 49 pemain."},
|
||||||
['techmino49_u']= {"Tech 49", "TERAKHIR", "Pertarungan dengan 49 pemain."},
|
['techmino49_u']= {"Tech 49", "TERAKHIR", "Pertarungan dengan 49 pemain."},
|
||||||
['techmino99_e']= {"Tech 99", "MUDAH", "Pertarungan dengan 99 pemain."},
|
['techmino99_e']= {"Tech 99", "MUDAH", "Pertarungan dengan 99 pemain."},
|
||||||
['techmino99_h']= {"Tech 99", "SULIT", "Pertarungan dengan 99 pemain."},
|
['techmino99_h']= {"Tech 99", "SULIT", "Pertarungan dengan 99 pemain."},
|
||||||
['techmino99_u']= {"Tech 99", "TERAKHIR", "Pertarungan dengan 99 pemain."},
|
['techmino99_u']= {"Tech 99", "TERAKHIR", "Pertarungan dengan 99 pemain."},
|
||||||
['round_e']= {"Giliran", "MUDAH", "Giliran main melawan AI!"},
|
['round_e']= {"Giliran", "MUDAH", "Giliran main melawan AI!"},
|
||||||
['round_n']= {"Giliran", "NORMAL", "Giliran main melawan AI!"},
|
['round_n']= {"Giliran", "NORMAL", "Giliran main melawan AI!"},
|
||||||
['round_h']= {"Giliran", "SULIT", "Giliran main melawan AI!"},
|
['round_h']= {"Giliran", "SULIT", "Giliran main melawan AI!"},
|
||||||
['round_l']= {"Giliran", "GILA", "Giliran main melawan AI!"},
|
['round_l']= {"Giliran", "GILA", "Giliran main melawan AI!"},
|
||||||
['round_u']= {"Giliran", "TERAKHIR", "Giliran main melawan AI!"},
|
['round_u']= {"Giliran", "TERAKHIR", "Giliran main melawan AI!"},
|
||||||
['big_n']= {"Besar", "NORMAL", "Main dalam tempat main lebih kecil!"},
|
['big_n']= {"Besar", "NORMAL", "Main dalam tempat main lebih kecil!"},
|
||||||
['big_h']= {"Besar", "SULIT", "Main dalam tempat main lebih kecil!"},
|
['big_h']= {"Besar", "SULIT", "Main dalam tempat main lebih kecil!"},
|
||||||
['master_n']= {"Ahli", "NORMAL", "Untuk pemula 20G"},
|
['master_n']= {"Ahli", "NORMAL", "Untuk pemula 20G"},
|
||||||
['master_h']= {"Ahli", "SULIT", "Untuk pro 20G"},
|
['master_h']= {"Ahli", "SULIT", "Untuk pro 20G"},
|
||||||
['master_m']= {"Ahli", "M21", "Untuk jago 20G"},
|
['master_m']= {"Ahli", "M21", "Untuk jago 20G"},
|
||||||
['master_final']= {"Ahli", "TERAKHIR", "Lebih dari 20G"},
|
['master_final']= {"Ahli", "TERAKHIR", "Lebih dari 20G"},
|
||||||
['master_ph']= {"Ahli", "KHAYALAN", "???"},
|
['master_ph']= {"Ahli", "KHAYALAN", "???"},
|
||||||
['master_g']= {"Ahli", "BERTINGKAT", "Dapatkan tingkat tertinggi!"},
|
['master_g']= {"Ahli", "BERTINGKAT", "Dapatkan tingkat tertinggi!"},
|
||||||
['master_ex']= {"Sangat Ahli", "EKSTRA", "Blok tidak kelihatan"},
|
['master_ex']= {"Sangat Ahli", "EKSTRA", "Blok tidak kelihatan"},
|
||||||
['master_instinct']={"Ahli", "INSTINK", "Bagaimana jika blok terkontrol tersembunyi?"},
|
['master_instinct']= {"Ahli", "INSTINK", "Bagaimana jika blok terkontrol tersembunyi?"},
|
||||||
['strategy_e']= {"Strategi", "MUDAH", "Keputusan 20G cepat"},
|
['strategy_e']= {"Strategi", "MUDAH", "Keputusan 20G cepat"},
|
||||||
['strategy_h']= {"Strategi", "SULIT", "Keputusan 20G cepat"},
|
['strategy_h']= {"Strategi", "SULIT", "Keputusan 20G cepat"},
|
||||||
['strategy_u']= {"Strategi", "TERAKHIR", "Keputusan 20G cepat"},
|
['strategy_u']= {"Strategi", "TERAKHIR", "Keputusan 20G cepat"},
|
||||||
['strategy_e_plus']={"Strategi", "MUDAH+", "Mode strategi, tetapi tanpa menyimpan"},
|
['strategy_e_plus']= {"Strategi", "MUDAH+", "Mode strategi, tetapi tanpa menyimpan"},
|
||||||
['strategy_h_plus']={"Strategi", "SULIT+", "Mode strategi, tetapi tanpa menyimpan"},
|
['strategy_h_plus']= {"Strategi", "SULIT+", "Mode strategi, tetapi tanpa menyimpan"},
|
||||||
['strategy_u_plus']={"Strategi", "TERAKHIR+", "Mode strategi, tetapi tanpa menyimpan"},
|
['strategy_u_plus']= {"Strategi", "TERAKHIR+", "Mode strategi, tetapi tanpa menyimpan"},
|
||||||
['blind_e']= {"Tak Terlihat", "MUDAH", "Untuk pemula"},
|
['blind_e']= {"Tak Terlihat", "MUDAH", "Untuk pemula"},
|
||||||
['blind_n']= {"Tak Terlihat", "NORMAL", "Untuk amatir"},
|
['blind_n']= {"Tak Terlihat", "NORMAL", "Untuk amatir"},
|
||||||
['blind_h']= {"Tak Terlihat", "SULIT", "Untuk orang berpengalaman"},
|
['blind_h']= {"Tak Terlihat", "SULIT", "Untuk orang berpengalaman"},
|
||||||
['blind_l']= {"Tak Terlihat", "GILA", "Untuk profesional"},
|
['blind_l']= {"Tak Terlihat", "GILA", "Untuk profesional"},
|
||||||
['blind_u']= {"Tak Terlihat", "???", "Apakah Anda siap?"},
|
['blind_u']= {"Tak Terlihat", "???", "Apakah Anda siap?"},
|
||||||
['blind_wtf']= {"Tak Terlihat", "TERAKHIR", "Anda belum siap"},
|
['blind_wtf']= {"Tak Terlihat", "TERAKHIR", "Anda belum siap"},
|
||||||
['classic_e']= {"Klasik", "MUDAH", "Rekreasi berkecepatan rendah dari tahun 80-an"},
|
['classic_e']= {"Klasik", "MUDAH", "Rekreasi berkecepatan rendah dari tahun 80-an"},
|
||||||
['classic_h']= {"Klasik", "SULIT", "Rekreasi berkecepatan medium dari tahun 80-an"},
|
['classic_h']= {"Klasik", "SULIT", "Rekreasi berkecepatan medium dari tahun 80-an"},
|
||||||
['classic_l']= {"Klasik", "GILA", "Rekreasi berkecepatan medium-tinggi dari tahun 80-an"},
|
['classic_l']= {"Klasik", "GILA", "Rekreasi berkecepatan medium-tinggi dari tahun 80-an"},
|
||||||
['classic_u']= {"Klasik", "TERAKHIR", "Rekreasi berkecepatan tinggi dari tahun 80-an"},
|
['classic_u']= {"Klasik", "TERAKHIR", "Rekreasi berkecepatan tinggi dari tahun 80-an"},
|
||||||
['survivor_e']= {"Bertahan", "MUDAH", "Berapa lama Anda bisa bertahan?"},
|
['survivor_e']= {"Bertahan", "MUDAH", "Berapa lama Anda bisa bertahan?"},
|
||||||
['survivor_n']= {"Bertahan", "NORMAL", "Berapa lama Anda bisa bertahan?"},
|
['survivor_n']= {"Bertahan", "NORMAL", "Berapa lama Anda bisa bertahan?"},
|
||||||
['survivor_h']= {"Bertahan", "SULIT", "Berapa lama Anda bisa bertahan?"},
|
['survivor_h']= {"Bertahan", "SULIT", "Berapa lama Anda bisa bertahan?"},
|
||||||
['survivor_l']= {"Bertahan", "GILA", "Berapa lama Anda bisa bertahan?"},
|
['survivor_l']= {"Bertahan", "GILA", "Berapa lama Anda bisa bertahan?"},
|
||||||
['survivor_u']= {"Bertahan", "TERAKHIR", "Berapa lama Anda bisa bertahan?"},
|
['survivor_u']= {"Bertahan", "TERAKHIR", "Berapa lama Anda bisa bertahan?"},
|
||||||
['attacker_h']= {"Penyerang", "SULIT", "Praktekkan keahlian menyerang Anda!"},
|
['attacker_h']= {"Penyerang", "SULIT", "Praktekkan keahlian menyerang Anda!"},
|
||||||
['attacker_u']= {"Penyerang", "TERAKHIR", "Praktekkan keahlian menyerang Anda!"},
|
['attacker_u']= {"Penyerang", "TERAKHIR", "Praktekkan keahlian menyerang Anda!"},
|
||||||
['defender_n']= {"Pembela", "NORMAL", "Praktekkan keahlian membela Anda!"},
|
['defender_n']= {"Pembela", "NORMAL", "Praktekkan keahlian membela Anda!"},
|
||||||
['defender_l']= {"Pembela", "GILA", "Praktekkan keahlian membela Anda!"},
|
['defender_l']= {"Pembela", "GILA", "Praktekkan keahlian membela Anda!"},
|
||||||
['dig_h']= {"Pembor", "SULIT", "Praktekkan keahlian menggali Anda!"},
|
['dig_h']= {"Pembor", "SULIT", "Praktekkan keahlian menggali Anda!"},
|
||||||
['dig_u']= {"Pembor", "TERAKHIR", "Praktekkan keahlian menggali Anda!"},
|
['dig_u']= {"Pembor", "TERAKHIR", "Praktekkan keahlian menggali Anda!"},
|
||||||
['c4wtrain_n']= {"Latihan C4W", "NORMAL", "Kombo tidak terbatas."},
|
['c4wtrain_n']= {"Latihan C4W", "NORMAL", "Kombo tidak terbatas."},
|
||||||
['c4wtrain_l']= {"Latihan C4W", "GILA", "Kombo tidak terbatas."},
|
['c4wtrain_l']= {"Latihan C4W", "GILA", "Kombo tidak terbatas."},
|
||||||
['pctrain_n']= {"Latihan PC", "NORMAL", "Latihan PC"},
|
['pctrain_n']= {"Latihan PC", "NORMAL", "Latihan PC"},
|
||||||
['pctrain_l']= {"Latihan PC", "GILA", "Latihan PC yang lebih sulit"},
|
['pctrain_l']= {"Latihan PC", "GILA", "Latihan PC yang lebih sulit"},
|
||||||
['pc_n']= {"Tantangan PC", "NORMAL", "Dapatkan PC sampai 100 baris!"},
|
['pc_n']= {"Tantangan PC", "NORMAL", "Dapatkan PC sampai 100 baris!"},
|
||||||
['pc_h']= {"Tantangan PC", "SULIT", "Dapatkan PC sampai 100 baris!"},
|
['pc_h']= {"Tantangan PC", "SULIT", "Dapatkan PC sampai 100 baris!"},
|
||||||
['pc_l']= {"Tantangan PC", "GILA", "Dapatkan PC sampai 100 baris!"},
|
['pc_l']= {"Tantangan PC", "GILA", "Dapatkan PC sampai 100 baris!"},
|
||||||
['pc_inf']= {"Tantangan PC", "TAK TERBATAS", "Dapatkan PC sebanyaknya!"},
|
['pc_inf']= {"Tantangan PC", "TAK TERBATAS", "Dapatkan PC sebanyaknya!"},
|
||||||
['tech_n']= {"Tech", "NORMAL", "Coba jaga deret Back-To-Back!"},
|
['tech_n']= {"Tech", "NORMAL", "Coba jaga deret Back-To-Back!"},
|
||||||
['tech_n_plus']= {"Tech", "NORMAL+", "Hanya Spins & PCs dibolehkan"},
|
['tech_n_plus']= {"Tech", "NORMAL+", "Hanya Spins & PCs dibolehkan"},
|
||||||
['tech_h']= {"Tech", "SULIT", "Coba jaga deret Back-To-Back!"},
|
['tech_h']= {"Tech", "SULIT", "Coba jaga deret Back-To-Back!"},
|
||||||
['tech_h_plus']= {"Tech", "SULIT+", "Hanya Spins & PCs dibolehkan"},
|
['tech_h_plus']= {"Tech", "SULIT+", "Hanya Spins & PCs dibolehkan"},
|
||||||
['tech_l']= {"Tech", "GILA", "Coba jaga deret Back-To-Back!"},
|
['tech_l']= {"Tech", "GILA", "Coba jaga deret Back-To-Back!"},
|
||||||
['tech_l_plus']= {"Tech", "GILA+", "Hanya Spins & PCs dibolehkan"},
|
['tech_l_plus']= {"Tech", "GILA+", "Hanya Spins & PCs dibolehkan"},
|
||||||
['tech_finesse']= {"Tech", "EF. TOMBOL", "Efisiensi tombol harus maksimal!"},
|
['tech_finesse']= {"Tech", "EF. TOMBOL", "Efisiensi tombol harus maksimal!"},
|
||||||
['tech_finesse_f']= {"Tech", "EF. TOMBOL+", "Efisiensi tombol maksimal dan tidak ada garis normal!"},
|
['tech_finesse_f']= {"Tech", "EF. TOMBOL+", "Efisiensi tombol maksimal dan anda tidak boleh membuat baris normal!"},
|
||||||
['tsd_e']= {"Tantangan TSD", "MUDAH", "Hanya T-Spin Double dibolehkan!"},
|
['tech_finesse_lock']= {"Tech", "EF. TBL. TERBATAS", "Jumlah pemencetan tombol terbatas, dan efisiensinya harus maksimal!"},
|
||||||
['tsd_h']= {"Tantangan TSD", "SULIT", "Hanya T-Spin Double dibolehkan!"},
|
['tech_finesse_lock_f']= {"Tech", "EF. TBL.+ TERBATAS", "Jumlah pemencetan tombol terbatas, efisiensi tombol harus maksimal, dan anda tidak boleh membuat baris normal!"},
|
||||||
['tsd_u']= {"Tantangan TSD", "TERAKHIR", "Hanya T-Spin Double dibolehkan!"},
|
['tsd_e']= {"Tantangan TSD", "MUDAH", "Hanya T-Spin Double dibolehkan!"},
|
||||||
['backfire_n']= {"Serangan Balik", "NORMAL", "Tahankan serang baliknya!"},
|
['tsd_h']= {"Tantangan TSD", "SULIT", "Hanya T-Spin Double dibolehkan!"},
|
||||||
['backfire_h']= {"Serangan Balik", "SULIT", "Tahankan serang baliknya!"},
|
['tsd_u']= {"Tantangan TSD", "TERAKHIR", "Hanya T-Spin Double dibolehkan!"},
|
||||||
['backfire_l']= {"Serangan Balik", "GILA", "Tahankan serang baliknya!"},
|
['backfire_n']= {"Serangan Balik", "NORMAL", "Tahankan serang baliknya!"},
|
||||||
['backfire_u']= {"Serangan Balik", "TERAKHIR", "Tahankan serang baliknya!"},
|
['backfire_h']= {"Serangan Balik", "SULIT", "Tahankan serang baliknya!"},
|
||||||
['sprintAtk']= {"Balapan", "100 Serangan", "Kirim 100 baris serangan!"},
|
['backfire_l']= {"Serangan Balik", "GILA", "Tahankan serang baliknya!"},
|
||||||
['sprintEff']= {"Balapan", "Efisiensi", "Kirim lebih banyak serangan sampai 40 baris!"},
|
['backfire_u']= {"Serangan Balik", "TERAKHIR", "Tahankan serang baliknya!"},
|
||||||
['zen']= {"Zen", "200L", "Permainan 200-garis tanpa batas waktu"},
|
['sprintAtk']= {"Balapan", "100 Serangan", "Kirim 100 baris serangan!"},
|
||||||
['ultra']= {"Ultra", "EKSTRA", "Permainan 2 menit. Dapatkan nilai sebanyaknya!"},
|
['sprintEff']= {"Balapan", "Efisiensi", "Kirim lebih banyak serangan sampai 40 baris!"},
|
||||||
['infinite']= {"Tak Terbatas", "", "Bak pasir"},
|
['zen']= {"Zen", "200L", "Permainan 200-garis tanpa batas waktu"},
|
||||||
['infinite_dig']= {"Tak Terbatas: Gali","", "Gali, gali, gali"},
|
['ultra']= {"Ultra", "EKSTRA", "Permainan 2 menit. Dapatkan nilai sebanyaknya!"},
|
||||||
['marathon_inf']= {"Maraton", "TAK TERBATAS", "Maraton tanpa akhir."},
|
['infinite']= {"Tak Terbatas", "", "Bak pasir"},
|
||||||
|
['infinite_dig']= {"Tak Terbatas: Gali","", "Gali, gali, gali"},
|
||||||
|
['marathon_inf']= {"Maraton", "TAK TERBATAS", "Maraton tanpa akhir."},
|
||||||
|
|
||||||
['custom_clear']= {"Tersesuai", "NORMAL"},
|
['custom_clear']= {"Tersesuai", "NORMAL"},
|
||||||
['custom_puzzle']= {"Tersesuai", "TEKA-TEKI"},
|
['custom_puzzle']= {"Tersesuai", "TEKA-TEKI"},
|
||||||
},
|
},
|
||||||
getTip={refuseCopy=true,
|
getTip={refuseCopy=true,
|
||||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
||||||
|
|||||||
@@ -364,6 +364,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[All other test staff]",
|
"[All other test staff]",
|
||||||
"…And You!",
|
"…And You!",
|
||||||
},
|
},
|
||||||
@@ -950,6 +951,8 @@ C. ゲームパッド
|
|||||||
['tech_l_plus']= {"テクニック", "LUNATIC+", "回転入れとパフェだけ!"},
|
['tech_l_plus']= {"テクニック", "LUNATIC+", "回転入れとパフェだけ!"},
|
||||||
['tech_finesse']= {"テクニック", "FINESSE", "最適化!"},
|
['tech_finesse']= {"テクニック", "FINESSE", "最適化!"},
|
||||||
['tech_finesse_f']= {"テクニック", "FINESSE+", "最適化はそのまま、通常line消去禁止!"},
|
['tech_finesse_f']= {"テクニック", "FINESSE+", "最適化はそのまま、通常line消去禁止!"},
|
||||||
|
--['tech_finesse_lock']= {"Tech", "FINESSE LOCK", "No finesse errors, combined with limited inputs!"},
|
||||||
|
--['tech_finesse_lock_f']= {"Tech", "FINESSE+ LOCK", "No normal clears or finesse errors combined with limited inputs!"},
|
||||||
['tsd_e']= {"TSDチャレンジ", "EASY", "TSDだけ!"},
|
['tsd_e']= {"TSDチャレンジ", "EASY", "TSDだけ!"},
|
||||||
['tsd_h']= {"TSDチャレンジ", "HARD", "TSDだけ!"},
|
['tsd_h']= {"TSDチャレンジ", "HARD", "TSDだけ!"},
|
||||||
['tsd_u']= {"TSDチャレンジ", "ULTIMATE", "TSDだけ!"},
|
['tsd_u']= {"TSDチャレンジ", "ULTIMATE", "TSDだけ!"},
|
||||||
|
|||||||
@@ -351,6 +351,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[All other test staff]",
|
"[All other test staff]",
|
||||||
"…And You!",
|
"…And You!",
|
||||||
},
|
},
|
||||||
@@ -887,6 +888,8 @@ return {
|
|||||||
['tech_l_plus']= {"Tech", "LUNÁTICO+", "Apenas spins e PC"},
|
['tech_l_plus']= {"Tech", "LUNÁTICO+", "Apenas spins e PC"},
|
||||||
['tech_finesse']= {"Tech", "FINESSE", "Não erre a destreza!"},
|
['tech_finesse']= {"Tech", "FINESSE", "Não erre a destreza!"},
|
||||||
['tech_finesse_f']= {"Tech", "FINESSE+", "Sem limpas normais,\nnão erre a destreza!"},
|
['tech_finesse_f']= {"Tech", "FINESSE+", "Sem limpas normais,\nnão erre a destreza!"},
|
||||||
|
--['tech_finesse_lock']= {"Tech", "FINESSE LOCK", "No finesse errors, combined with limited inputs!"},
|
||||||
|
--['tech_finesse_lock_f']= {"Tech", "FINESSE+ LOCK", "No normal clears or finesse errors combined with limited inputs!"},
|
||||||
['tsd_e']= {"Desafio TSD", "FÁCIL", "Apenas T-spin-doubles!"},
|
['tsd_e']= {"Desafio TSD", "FÁCIL", "Apenas T-spin-doubles!"},
|
||||||
['tsd_h']= {"Desafio TSD", "DIFÍCIL", "Apenas T-spin-doubles!"},
|
['tsd_h']= {"Desafio TSD", "DIFÍCIL", "Apenas T-spin-doubles!"},
|
||||||
['tsd_u']= {"Desafio TSD", "ULTIMATE", "Apenas T-spin-doubles!"},
|
['tsd_u']= {"Desafio TSD", "ULTIMATE", "Apenas T-spin-doubles!"},
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ return {
|
|||||||
exportSuccess="Đã xuất thành công",
|
exportSuccess="Đã xuất thành công",
|
||||||
importSuccess="Đã nhập thành công",
|
importSuccess="Đã nhập thành công",
|
||||||
dataCorrupted="Dữ liệu bị hỏng",
|
dataCorrupted="Dữ liệu bị hỏng",
|
||||||
pasteWrongPlace="Bạn đã dán ở nhầm nơi rồi",
|
pasteWrongPlace="Bạn có dán đúng nơi không đấy?",
|
||||||
noFile="Thiếu tệp",
|
noFile="Thiếu tệp",
|
||||||
|
|
||||||
nowPlaying="Đang phát:",
|
nowPlaying="Đang phát:",
|
||||||
@@ -115,21 +115,21 @@ return {
|
|||||||
|
|
||||||
-- Server's warn/error messages
|
-- Server's warn/error messages
|
||||||
Techrater={
|
Techrater={
|
||||||
internalError="Lỗi nội bộ",
|
internalError="Lỗi nội bộ\nInternal error",
|
||||||
databaseError="Lỗi cơ sở dữ liệu",
|
databaseError="Lỗi cơ sở dữ liệu\nDatabase error",
|
||||||
invalidFormat="Định dạng không hợp lệ",
|
invalidFormat="Định dạng không hợp lệ\nInvalid format",
|
||||||
invalidArguments="Đối số không hợp lệ",
|
invalidArguments="Đối số không hợp lệ\nInvalid arguments",
|
||||||
tooFrequent="Quá thường xuyên",
|
tooFrequent="Quá thường xuyên\nToo frequent",
|
||||||
notAvailable="Không khả dụng",
|
notAvailable="Không khả dụng\nNot available",
|
||||||
noPermission="Không có quyền",
|
noPermission="Không có quyền\nNo permission",
|
||||||
roomNotFound="Không tìm thấy phòng",
|
roomNotFound="Không tìm thấy phòng\nRoom not found",
|
||||||
|
|
||||||
-- Controllers
|
-- Controllers
|
||||||
WebSocket={
|
WebSocket={
|
||||||
invalidConnection="Kết nối không hợp lệ",
|
invalidConnection="Kết nối không hợp lệ\nInvalid connection",
|
||||||
invalidAction="Hành động không hợp lệ",
|
invalidAction="Hành động không hợp lệ\nInvalid action",
|
||||||
playerNotFound="Không tìm thấy người chơi",
|
playerNotFound="Không tìm thấy người chơi\nPlayer not found",
|
||||||
connectionFailed="Kết nối thất bại",
|
connectionFailed="Kết nối thất bại\nConnection failed",
|
||||||
},
|
},
|
||||||
-- Filters
|
-- Filters
|
||||||
CheckPermission={
|
CheckPermission={
|
||||||
@@ -139,7 +139,7 @@ return {
|
|||||||
ConnectionManager={
|
ConnectionManager={
|
||||||
playerInvalid="Người chơi không hợp lệ",
|
playerInvalid="Người chơi không hợp lệ",
|
||||||
playerNotFound="Không tìm thấy người chơi",
|
playerNotFound="Không tìm thấy người chơi",
|
||||||
connectionReplaced="Đã thay đổi kết nối",
|
connectionReplaced="Đã thay đổi kết nối\nConnection replaced",
|
||||||
},
|
},
|
||||||
NoticeManager={
|
NoticeManager={
|
||||||
noticeNotFound="Không có thông báo",
|
noticeNotFound="Không có thông báo",
|
||||||
@@ -187,7 +187,7 @@ return {
|
|||||||
serverDown="Ối! Server sập! Hãy quay lại sau",
|
serverDown="Ối! Server sập! Hãy quay lại sau",
|
||||||
requestFailed="Yêu cầu thất bại",
|
requestFailed="Yêu cầu thất bại",
|
||||||
|
|
||||||
onlinePlayerCount="Trực tuyến: $1",
|
onlinePlayerCount="$1 người đang trực tuyến",
|
||||||
createRoomSuccessed="Tạo phòng thành công",
|
createRoomSuccessed="Tạo phòng thành công",
|
||||||
playerKicked="$1 đã đá $2 khỏi phòng",
|
playerKicked="$1 đã đá $2 khỏi phòng",
|
||||||
becomeHost="$1 giờ là chủ phòng",
|
becomeHost="$1 giờ là chủ phòng",
|
||||||
@@ -205,8 +205,9 @@ return {
|
|||||||
customBGloadFailed="Định dạng ảnh không được hỗ trợ",
|
customBGloadFailed="Định dạng ảnh không được hỗ trợ",
|
||||||
|
|
||||||
errorMsg="Techmino bị lỗi và cần phải được khởi động lại\nBạn có thể gửi error log để giúp dev sửa game nhanh hơn.",
|
errorMsg="Techmino bị lỗi và cần phải được khởi động lại\nBạn có thể gửi error log để giúp dev sửa game nhanh hơn.",
|
||||||
|
tryAnotherBuild="CO LOI KHI GIAI MA UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.",
|
||||||
|
|
||||||
modInstruction="Hãy chọn mod bạn muốn.\nMod cho phép bạn có thể tùy biến game, nhưng cũng có thể làm game sập.\nĐiểm sẽ không được lưu lại khi dùng mod.",
|
modInstruction="Hãy chọn modifier bạn muốn.\nMod cho phép bạn có thể tùy biến game, nhưng cũng có thể làm game sập.\nKể cả thế, hãy thoải mái và chơi theo cách của bạn!\nBạn có thể dùng bàn phím để chọn mod (giữ Shift để chọn lùi)\nĐiểm sẽ không được lưu lại khi dùng mod.",
|
||||||
modInfo={
|
modInfo={
|
||||||
next="NEXT\nGhi đè số gạch hiển thị ở cột NEXT",
|
next="NEXT\nGhi đè số gạch hiển thị ở cột NEXT",
|
||||||
hold="HOLD\nGhi đè số lượng gạch được giữ ở cột HOLD",
|
hold="HOLD\nGhi đè số lượng gạch được giữ ở cột HOLD",
|
||||||
@@ -215,7 +216,7 @@ return {
|
|||||||
hideBlock="Hide Current Piece\nGạch đang rơi trong bảng sẽ bị tàng hình",
|
hideBlock="Hide Current Piece\nGạch đang rơi trong bảng sẽ bị tàng hình",
|
||||||
hideGhost="No Ghost\nBóng gạch sẽ bị tắt",
|
hideGhost="No Ghost\nBóng gạch sẽ bị tắt",
|
||||||
hidden="Hide Locked Pieces\nGạch sẽ bị ẩn sau một khoảng thời gian",
|
hidden="Hide Locked Pieces\nGạch sẽ bị ẩn sau một khoảng thời gian",
|
||||||
hideBoard="Hide Board\nChe một phần của bảng hay che nguyên bảng",
|
hideBoard="Hide Board\nChe một phần hay nguyên bảng",
|
||||||
flipBoard="Flip Board\nXoay bảng hay lật bảng",
|
flipBoard="Flip Board\nXoay bảng hay lật bảng",
|
||||||
dropDelay="Gravity\nĐiều chỉnh tốc độ rơi của gạch",
|
dropDelay="Gravity\nĐiều chỉnh tốc độ rơi của gạch",
|
||||||
lockDelay="Lock Delay\nGhi đè thời gian chờ khoá của gạch",
|
lockDelay="Lock Delay\nGhi đè thời gian chờ khoá của gạch",
|
||||||
@@ -244,7 +245,7 @@ return {
|
|||||||
"Lỗi di chuyển:",
|
"Lỗi di chuyển:",
|
||||||
},
|
},
|
||||||
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
|
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
|
||||||
radarData={"D’PM","ADPM","APM","SPM","L’PM","DPM"},
|
radarData={"D’PM","ADPM","APM","SPM","L'PM","DPM"},
|
||||||
stat={
|
stat={
|
||||||
"Số lần bật trò chơi:",
|
"Số lần bật trò chơi:",
|
||||||
"Số ván đã chơi:",
|
"Số ván đã chơi:",
|
||||||
@@ -266,9 +267,11 @@ return {
|
|||||||
"Chúng tôi đánh giá cao mọi đề xuất và báo cáo lỗi do các bạn gửi đến",
|
"Chúng tôi đánh giá cao mọi đề xuất và báo cáo lỗi do các bạn gửi đến",
|
||||||
"Hãy đảm bảo trò chơi được tải về từ nguồn chính thức",
|
"Hãy đảm bảo trò chơi được tải về từ nguồn chính thức",
|
||||||
"vì các nguồn khác có thể không an toàn.",
|
"vì các nguồn khác có thể không an toàn.",
|
||||||
|
"Techmino chỉ hỏi quyền được rung điện thoại và kết nối Internet.",
|
||||||
|
"",
|
||||||
"Tác giả KHÔNG CHỊU TRÁCH NHIỆM với bất kỳ bản sửa đổi nào.",
|
"Tác giả KHÔNG CHỊU TRÁCH NHIỆM với bất kỳ bản sửa đổi nào.",
|
||||||
FNNS and "" or "Trò chơi này hoàn toàn miễn phí! Nếu các bạn thích nó, các bạn có thể ủng hộ chúng tôi!",
|
FNNS and "" or "Trò chơi này hoàn toàn miễn phí! Nếu các bạn thích nó, các bạn có thể ủng hộ chúng tôi!",
|
||||||
FNNS and "" or "Kiểm tra Zictionary để có thêm thông tin chi tiết",
|
FNNS and "" or "Để biết t.tin chi tiết, hãy tra Zictionary",
|
||||||
},
|
},
|
||||||
staff={
|
staff={
|
||||||
"ĐƯỢC SÁNG TÁC BỞI MrZ",
|
"ĐƯỢC SÁNG TÁC BỞI MrZ",
|
||||||
@@ -311,11 +314,12 @@ return {
|
|||||||
"(旋律星萤)",
|
"(旋律星萤)",
|
||||||
"(T0722)",
|
"(T0722)",
|
||||||
"",
|
"",
|
||||||
"Minh hoạ",
|
"Hiệu ứng âm thanh & Voice Pack",
|
||||||
"Miya",
|
"Miya",
|
||||||
"Mono",
|
|
||||||
"Xiaoya",
|
"Xiaoya",
|
||||||
"葉枭",
|
"Mono",
|
||||||
|
"MrZ",
|
||||||
|
"Trebor",
|
||||||
"",
|
"",
|
||||||
"Thiết kế âm nhạc",
|
"Thiết kế âm nhạc",
|
||||||
"MrZ",
|
"MrZ",
|
||||||
@@ -370,6 +374,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[cùng với các thành viên thử nghiệm khác]",
|
"[cùng với các thành viên thử nghiệm khác]",
|
||||||
"…và BẠN!",
|
"…và BẠN!",
|
||||||
},
|
},
|
||||||
@@ -387,7 +392,7 @@ return {
|
|||||||
]],
|
]],
|
||||||
support="Hỗ trợ người làm game",
|
support="Hỗ trợ người làm game",
|
||||||
dict={
|
dict={
|
||||||
sizeChanged="Đã đổi cỡ phông: $1",
|
sizeChanged="Đã chỉnh cỡ phông: $1",
|
||||||
sizeReset="Đã đặt lại cỡ phông!",
|
sizeReset="Đã đặt lại cỡ phông!",
|
||||||
helpText=
|
helpText=
|
||||||
[[
|
[[
|
||||||
@@ -474,7 +479,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
},
|
},
|
||||||
net_newRoom={
|
net_newRoom={
|
||||||
title="Cấu hình phòng",
|
title="Cấu hình phòng",
|
||||||
roomName="Tên phòng (Mặc định: “[username]'s room”)",
|
roomName="Tên phòng (Mặc định: \"[username]'s room\")",
|
||||||
password="Mật khẩu",
|
password="Mật khẩu",
|
||||||
description="Mô tả phòng",
|
description="Mô tả phòng",
|
||||||
|
|
||||||
@@ -549,7 +554,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
block="Hiện gạch đang rơi",
|
block="Hiện gạch đang rơi",
|
||||||
smooth="Rơi mượt",
|
smooth="Rơi mượt",
|
||||||
upEdge="Gạch 3D",
|
upEdge="Gạch 3D",
|
||||||
bagLine="Vạch tách Túi gạch",
|
bagLine="Vạch chia túi gạch",
|
||||||
|
|
||||||
ghostType="Loại bóng gạch",
|
ghostType="Loại bóng gạch",
|
||||||
ghost="Độ bóng",
|
ghost="Độ bóng",
|
||||||
@@ -561,7 +566,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
dropFX="H.ứng Thả nhẹ",
|
dropFX="H.ứng Thả nhẹ",
|
||||||
moveFX="H.ứng Di chuyển",
|
moveFX="H.ứng Di chuyển",
|
||||||
clearFX="H.ứng Xóa hàng",
|
clearFX="H.ứng Xóa hàng",
|
||||||
splashFX="H.ứng Gạch “rụng”",
|
splashFX="H.ứng Gạch \"rụng\"",
|
||||||
shakeFX="Độ nảy bảng",
|
shakeFX="Độ nảy bảng",
|
||||||
atkFX="H.ứng Tấn công",
|
atkFX="H.ứng Tấn công",
|
||||||
|
|
||||||
@@ -754,7 +759,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
push="Thêm Hàng (K)",
|
push="Thêm Hàng (K)",
|
||||||
del="Xoá Hàng (L)",
|
del="Xoá Hàng (L)",
|
||||||
|
|
||||||
demo="Không hiện “×”",
|
demo="Không hiện \"×\"",
|
||||||
|
|
||||||
newPg="Trang mới (N)",
|
newPg="Trang mới (N)",
|
||||||
delPg="Xoá trang (M)",
|
delPg="Xoá trang (M)",
|
||||||
@@ -877,136 +882,138 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
modes={
|
modes={
|
||||||
['sprint_10l']= {"Sprint", "10L", "Xoá 10 hàng!"},
|
['sprint_10l']= {"Sprint", "10L", "Xoá 10 hàng!"},
|
||||||
['sprint_20l']= {"Sprint", "20L", "Xoá 20 hàng!"},
|
['sprint_20l']= {"Sprint", "20L", "Xoá 20 hàng!"},
|
||||||
['sprint_40l']= {"Sprint", "40L", "Xoá 40 hàng!"},
|
['sprint_40l']= {"Sprint", "40L", "Xoá 40 hàng!"},
|
||||||
['sprint_100l']= {"Sprint", "100L", "Xoá 100 hàng!"},
|
['sprint_100l']= {"Sprint", "100L", "Xoá 100 hàng!"},
|
||||||
['sprint_400l']= {"Sprint", "400L", "Xoá 400 hàng!"},
|
['sprint_400l']= {"Sprint", "400L", "Xoá 400 hàng!"},
|
||||||
['sprint_1000l']= {"Sprint", "1,000L", "Xoá 1,000 hàng!"},
|
['sprint_1000l']= {"Sprint", "1000L", "Xoá 1000 hàng!"},
|
||||||
['sprintPenta']= {"Sprint", "PENTOMINO", "Xoá 40 hàng với 18 pentomino"},
|
['sprintPenta']= {"Sprint", "PENTOMINO", "Xoá 40 hàng với 18 pentomino"},
|
||||||
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
|
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
|
||||||
['sprint123']= {"Sprint", "M123", "Xoá 40 hàng chỉ với monomino, domino, và trimino"},
|
['sprint123']= {"Sprint", "M123", "Xoá 40 hàng chỉ với monomino, domino, và trimino"},
|
||||||
['secret_grade']= {"Secret Grade", "", "Xây một đường lỗ theo hình dích dắc!"},
|
['secret_grade']= {"Secret Grade", "", "Xây một đường lỗ theo hình dích dắc!"},
|
||||||
['dig_10l']= {"Dig", "10L", "Đào 10 hàng rác càng nhanh càng tốt"},
|
['dig_10l']= {"Dig", "10L", "Đào 10 hàng rác càng nhanh càng tốt"},
|
||||||
['dig_40l']= {"Dig", "40L", "Đào 40 hàng rác càng nhanh càng tốt!"},
|
['dig_40l']= {"Dig", "40L", "Đào 40 hàng rác càng nhanh càng tốt!"},
|
||||||
['dig_100l']= {"Dig", "100L", "Đào 100 hàng rác càng nhanh càng tốt!"},
|
['dig_100l']= {"Dig", "100L", "Đào 100 hàng rác càng nhanh càng tốt!"},
|
||||||
['dig_400l']= {"Dig", "400L", "Đào 400 hàng rác càng nhanh càng tốt!"},
|
['dig_400l']= {"Dig", "400L", "Đào 400 hàng rác càng nhanh càng tốt!"},
|
||||||
['dig_eff_10l']= {"Dig", "EFFICIENCY 10L", "Đào 10 hàng rác càng ít gạch càng tốt!"},
|
['dig_eff_10l']= {"Dig", "EFFICIENCY 10L", "Đào 10 hàng rác càng ít gạch càng tốt!"},
|
||||||
['dig_eff_40l']= {"Dig", "EFFICIENCY 40L", "Đào 40 hàng rác càng ít gạch càng tốt!"},
|
['dig_eff_40l']= {"Dig", "EFFICIENCY 40L", "Đào 40 hàng rác càng ít gạch càng tốt!"},
|
||||||
['dig_eff_100l']= {"Dig", "EFFICIENCY 100L","Đào 100 hàng rác càng ít gạch càng tốt!"},
|
['dig_eff_100l']= {"Dig", "EFFICIENCY 100L","Đào 100 hàng rác càng ít gạch càng tốt!"},
|
||||||
['dig_eff_400l']= {"Dig", "EFFICIENCY 400L","Đào 400 hàng rác càng ít gạch càng tốt!"},
|
['dig_eff_400l']= {"Dig", "EFFICIENCY 400L","Đào 400 hàng rác càng ít gạch càng tốt!"},
|
||||||
['dig_quad_10l']= {"Dig", "TECHRASH 10L", "Đào 10 hàng rác nhưng chỉ dùng techrash!"},
|
['dig_quad_10l']= {"Dig", "TECHRASH 10L", "Đào 10 hàng rác nhưng chỉ dùng techrash!"},
|
||||||
['drought_n']= {"Drought", "100L", "Không có thanh dài"},
|
['drought_n']= {"Drought", "100L", "Không có thanh dài"},
|
||||||
['drought_l']= {"Drought+", "100L", "C L G T"},
|
['drought_l']= {"Drought+", "100L", "C L G T"},
|
||||||
['marathon_n']= {"Marathon", "THƯỜNG", "Xoá 200 hàng với tốc độ nhanh dần"},
|
['marathon_n']= {"Marathon", "THƯỜNG", "Xoá 200 hàng với tốc độ nhanh dần"},
|
||||||
['marathon_h']= {"Marathon", "KHÓ", "Xoá 200 hàng với tốc độ cao"},
|
['marathon_h']= {"Marathon", "KHÓ", "Xoá 200 hàng với tốc độ cao"},
|
||||||
['solo_e']= {"Battle", "DỄ", "Đánh bại AI!"},
|
['solo_e']= {"Battle", "DỄ", "Đánh bại AI!"},
|
||||||
['solo_n']= {"Battle", "THƯỜNG", "Đánh bại AI!"},
|
['solo_n']= {"Battle", "THƯỜNG", "Đánh bại AI!"},
|
||||||
['solo_h']= {"Battle", "KHÓ", "Đánh bại AI!"},
|
['solo_h']= {"Battle", "KHÓ", "Đánh bại AI!"},
|
||||||
['solo_l']= {"Battle", "RẤT KHÓ", "Đánh bại AI!"},
|
['solo_l']= {"Battle", "RẤT KHÓ", "Đánh bại AI!"},
|
||||||
['solo_u']= {"Battle", "THÁCH ĐẤU", "Đánh bại AI!"},
|
['solo_u']= {"Battle", "THÁCH ĐẤU", "Đánh bại AI!"},
|
||||||
['techmino49_e']= {"Tech 49", "DỄ", "Cuộc chiến 49 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
['techmino49_e']= {"Tech 49", "DỄ", "Cuộc chiến 49 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
||||||
['techmino49_h']= {"Tech 49", "KHÓ", "Cuộc chiến 49 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
['techmino49_h']= {"Tech 49", "KHÓ", "Cuộc chiến 49 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
||||||
['techmino49_u']= {"Tech 49", "THÁCH ĐẤU", "Cuộc chiến 49 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
['techmino49_u']= {"Tech 49", "THÁCH ĐẤU", "Cuộc chiến 49 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
||||||
['techmino99_e']= {"Tech 99", "DỄ", "Cuộc chiến 99 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
['techmino99_e']= {"Tech 99", "DỄ", "Cuộc chiến 99 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
||||||
['techmino99_h']= {"Tech 99", "KHÓ", "Cuộc chiến 99 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
['techmino99_h']= {"Tech 99", "KHÓ", "Cuộc chiến 99 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
||||||
['techmino99_u']= {"Tech 99", "THÁCH ĐẤU", "Cuộc chiến 99 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
['techmino99_u']= {"Tech 99", "THÁCH ĐẤU", "Cuộc chiến 99 người.\nNgười trụ lại cuối cùng giành chiến thắng"},
|
||||||
['round_e']= {"Turn-Based", "DỄ", "Chơi theo lượt và đánh bại AI!"},
|
['round_e']= {"Turn-Based", "DỄ", "Chơi theo lượt và đánh bại AI!"},
|
||||||
['round_n']= {"Turn-Based", "THƯỜNG", "Chơi theo lượt và đánh bại AI!"},
|
['round_n']= {"Turn-Based", "THƯỜNG", "Chơi theo lượt và đánh bại AI!"},
|
||||||
['round_h']= {"Turn-Based", "KHÓ", "Chơi theo lượt và đánh bại AI!"},
|
['round_h']= {"Turn-Based", "KHÓ", "Chơi theo lượt và đánh bại AI!"},
|
||||||
['round_l']= {"Turn-Based", "RẤT KHÓ", "Chơi theo lượt và đánh bại AI!"},
|
['round_l']= {"Turn-Based", "RẤT KHÓ", "Chơi theo lượt và đánh bại AI!"},
|
||||||
['round_u']= {"Turn-Based", "THÁCH ĐẤU", "Chơi theo lượt và đánh bại AI!"},
|
['round_u']= {"Turn-Based", "THÁCH ĐẤU", "Chơi theo lượt và đánh bại AI!"},
|
||||||
['big_n']= {"Big", "THƯỜNG", "Chơi với một bảng nhỏ hơn!"},
|
['big_n']= {"Big", "THƯỜNG", "Chơi với một bảng 5 × 10!"},
|
||||||
['big_h']= {"Big", "KHÓ", "Chơi với một bảng nhỏ hơn!"},
|
['big_h']= {"Big", "KHÓ", "Chơi với một bảng 5 × 10!"},
|
||||||
['master_n']= {"Master", "THƯỜNG", "Dành cho người mới chơi 20G"},
|
['master_n']= {"Master", "THƯỜNG", "Dành cho người mới chơi 20G"},
|
||||||
['master_h']= {"Master", "KHÓ", "Dành cho người chơi đã quen 20G"},
|
['master_h']= {"Master", "KHÓ", "Dành cho người chơi đã quen 20G"},
|
||||||
['master_m']= {"Master", "M21", "Dành cho cao thủ 20G"},
|
['master_m']= {"Master", "M21", "Dành cho cao thủ 20G"},
|
||||||
['master_final']= {"Master", "FINAL", "Dành cho các pháp sư 20G"},
|
['master_final']= {"Master", "FINAL", "Dành cho các pháp sư 20G"},
|
||||||
['master_ph']= {"Master", "PHANTASM", "Hả???"},
|
['master_ph']= {"Master", "PHANTASM", "Hả???"},
|
||||||
['master_g']= {"Master", "GRADED", "Lấy điểm cao nhất có thể!"},
|
['master_g']= {"Master", "GRADED", "Lấy điểm cao nhất có thể!"},
|
||||||
['master_ex']= {"GrandMaster", "EXTRA", "Cũng là lấy điểm cao nhất có thể nhưng mà gắt hơn!"},
|
['master_ex']= {"GrandMaster", "EXTRA", "Cũng là lấy điểm cao nhất có thể nhưng mà gắt hơn!"},
|
||||||
['master_instinct']={"Master", "INSTINCT", "Lấy điểm cao nhất có thể nhưng với gạch tàng hình!"},
|
['master_instinct']= {"Master", "INSTINCT", "Lấy điểm cao nhất có thể nhưng với gạch tàng hình!"},
|
||||||
['strategy_e']= {"Strategy", "DỄ", "Quyết định nhanh hoặc là thua"},
|
['strategy_e']= {"Strategy", "DỄ", "Quyết định nhanh hoặc là thua"},
|
||||||
['strategy_h']= {"Strategy", "KHÓ", "Quyết định nhanh hoặc là thua"},
|
['strategy_h']= {"Strategy", "KHÓ", "Quyết định nhanh hoặc là thua"},
|
||||||
['strategy_u']= {"Strategy", "THÁCH ĐẤU", "Quyết định nhanh hoặc là thua"},
|
['strategy_u']= {"Strategy", "THÁCH ĐẤU", "Quyết định nhanh hoặc là thua"},
|
||||||
['strategy_e_plus']={"Strategy", "DỄ+", "Quyết định nhanh và không được Hold!"},
|
['strategy_e_plus']= {"Strategy", "DỄ+", "Quyết định nhanh và không được Hold!"},
|
||||||
['strategy_h_plus']={"Strategy", "KHÓ+", "Quyết định nhanh và không được Hold!"},
|
['strategy_h_plus']= {"Strategy", "KHÓ+", "Quyết định nhanh và không được Hold!"},
|
||||||
['strategy_u_plus']={"Strategy", "THÁCH ĐẤU+", "Quyết định nhanh và không được Hold!"},
|
['strategy_u_plus']= {"Strategy", "THÁCH ĐẤU+", "Quyết định nhanh và không được Hold!"},
|
||||||
['blind_e']= {"Invisible", "DỄ", "Dành cho người mới"},
|
['blind_e']= {"Invisible", "DỄ", "Dành cho người mới"},
|
||||||
['blind_n']= {"Invisible", "THƯỜNG", "Dành cho người đã quen"},
|
['blind_n']= {"Invisible", "THƯỜNG", "Dành cho người đã quen"},
|
||||||
['blind_h']= {"Invisible", "KHÓ", "Dành cho người đã có kinh nghiệm"},
|
['blind_h']= {"Invisible", "KHÓ", "Dành cho người đã có kinh nghiệm"},
|
||||||
['blind_l']= {"Invisible", "KHÓ+", "Dành cho người chơi chuyên nghiệp"},
|
['blind_l']= {"Invisible", "KHÓ+", "Dành cho người chơi chuyên nghiệp"},
|
||||||
['blind_u']= {"Invisible", "?", "Bạn đã sẵn sàng chưa?"},
|
['blind_u']= {"Invisible", "?", "Bạn đã sẵn sàng chưa?"},
|
||||||
['blind_wtf']= {"Invisible", "CLGT?", "Bạn chưa đủ trình cho màn này đâu!"},
|
['blind_wtf']= {"Invisible", "CLGT?", "Bạn chưa đủ trình cho màn này đâu!"},
|
||||||
['classic_e']= {"Classic", "DỄ", "Chế độ cổ điển từ thập niên 80"},
|
['classic_e']= {"Classic", "DỄ", "Chế độ cổ điển từ thập niên 80"},
|
||||||
['classic_h']= {"Classic", "KHÓ", "Chế độ cổ điển từ thập niên 80 với tốc độ cao hơn"},
|
['classic_h']= {"Classic", "KHÓ", "Chế độ cổ điển từ thập niên 80 với tốc độ cao hơn"},
|
||||||
['classic_l']= {"Classic", "RẤT KHÓ", "Chế độ cổ điển từ thập niên 80 với tốc độ rất cao"},
|
['classic_l']= {"Classic", "RẤT KHÓ", "Chế độ cổ điển từ thập niên 80 với tốc độ rất cao"},
|
||||||
['classic_u']= {"Classic", "THÁCH ĐẤU", "Chế độ cổ điển từ thập niên 80 với tốc độ nhanh như chớp"},
|
['classic_u']= {"Classic", "THÁCH ĐẤU", "Chế độ cổ điển từ thập niên 80 với tốc độ nhanh như chớp"},
|
||||||
['survivor_e']= {"Survival", "DỄ", "Bạn có thể trụ được bao lâu?"},
|
['survivor_e']= {"Survival", "DỄ", "Bạn có thể trụ được bao lâu?"},
|
||||||
['survivor_n']= {"Survival", "THƯỜNG", "Bạn có thể trụ được bao lâu?"},
|
['survivor_n']= {"Survival", "THƯỜNG", "Bạn có thể trụ được bao lâu?"},
|
||||||
['survivor_h']= {"Survival", "KHÓ", "Bạn có thể trụ được bao lâu?"},
|
['survivor_h']= {"Survival", "KHÓ", "Bạn có thể trụ được bao lâu?"},
|
||||||
['survivor_l']= {"Survival", "RẤT KHÓ", "Bạn có thể trụ được bao lâu?"},
|
['survivor_l']= {"Survival", "RẤT KHÓ", "Bạn có thể trụ được bao lâu?"},
|
||||||
['survivor_u']= {"Survival", "THÁCH ĐẤU", "Bạn có thể trụ được bao lâu?"},
|
['survivor_u']= {"Survival", "THÁCH ĐẤU", "Bạn có thể trụ được bao lâu?"},
|
||||||
['attacker_h']= {"Attacker", "KHÓ", "Luyện tập kỹ năng tấn công!"},
|
['attacker_h']= {"Attacker", "KHÓ", "Luyện tập kỹ năng tấn công!"},
|
||||||
['attacker_u']= {"Attacker", "THÁCH ĐẤU", "Luyện tập kỹ năng tấn công!"},
|
['attacker_u']= {"Attacker", "THÁCH ĐẤU", "Luyện tập kỹ năng tấn công!"},
|
||||||
['defender_n']= {"Defender", "THƯỜNG", "Luyện tập kỹ năng phòng thủ!"},
|
['defender_n']= {"Defender", "THƯỜNG", "Luyện tập kỹ năng phòng thủ!"},
|
||||||
['defender_l']= {"Defender", "RẤT KHÓ", "Luyện tập kỹ năng phòng thủ!"},
|
['defender_l']= {"Defender", "RẤT KHÓ", "Luyện tập kỹ năng phòng thủ!"},
|
||||||
['dig_h']= {"Driller", "KHÓ", "Luyện tập kỹ năng đào xuống!"},
|
['dig_h']= {"Driller", "KHÓ", "Luyện tập kỹ năng đào xuống!"},
|
||||||
['dig_u']= {"Driller", "THÁCH ĐẤU", "Luyện tập kỹ năng đào xuống!"},
|
['dig_u']= {"Driller", "THÁCH ĐẤU", "Luyện tập kỹ năng đào xuống!"},
|
||||||
['c4wtrain_n']= {"C4W Training", "THƯỜNG", "Combo vô tận"},
|
['c4wtrain_n']= {"C4W Training", "THƯỜNG", "Combo vô tận"},
|
||||||
['c4wtrain_l']= {"C4W Training", "RẤT KHÓ", "Combo vô tận"},
|
['c4wtrain_l']= {"C4W Training", "RẤT KHÓ", "Combo vô tận"},
|
||||||
['pctrain_n']= {"PC Training", "THƯỜNG", "Luyện tập Perfect Clear"},
|
['pctrain_n']= {"PC Training", "THƯỜNG", "Luyện tập Perfect Clear"},
|
||||||
['pctrain_l']= {"PC Training", "RẤT KHÓ", "Luyện tập Perfect Clear nhưng khó hơn"},
|
['pctrain_l']= {"PC Training", "RẤT KHÓ", "Luyện tập Perfect Clear nhưng khó hơn"},
|
||||||
['pc_n']= {"PC Challenge", "THƯỜNG", "Lấy càng nhiều PC càng tốt trong 100 hàng!"},
|
['pc_n']= {"PC Challenge", "THƯỜNG", "Lấy càng nhiều PC càng tốt trong 100 hàng!"},
|
||||||
['pc_h']= {"PC Challenge", "KHÓ", "Lấy càng nhiều PC càng tốt trong 100 hàng!"},
|
['pc_h']= {"PC Challenge", "KHÓ", "Lấy càng nhiều PC càng tốt trong 100 hàng!"},
|
||||||
['pc_l']= {"PC Challenge", "RẤT KHÓ", "Lấy càng nhiều PC càng tốt trong 100 hàng!"},
|
['pc_l']= {"PC Challenge", "RẤT KHÓ", "Lấy càng nhiều PC càng tốt trong 100 hàng!"},
|
||||||
['pc_inf']= {"Inf. PC Challenge", "", "Lấy càng nhiều PC càng tốt"},
|
['pc_inf']= {"Inf. PC Challenge", "", "Lấy càng nhiều PC càng tốt"},
|
||||||
['tech_n']= {"Tech", "THƯỜNG", "Cố gắng không phá B2B!"},
|
['tech_n']= {"Tech", "THƯỜNG", "Cố gắng không phá B2B!"},
|
||||||
['tech_n_plus']= {"Tech", "THƯỜNG+", "Chỉ được clear Spin hoặc PC"},
|
['tech_n_plus']= {"Tech", "THƯỜNG+", "Chỉ được clear Spin hoặc PC"},
|
||||||
['tech_h']= {"Tech", "KHÓ", "Cố gắng không phá B2B!"},
|
['tech_h']= {"Tech", "KHÓ", "Cố gắng không phá B2B!"},
|
||||||
['tech_h_plus']= {"Tech", "KHÓ+", "Chỉ được clear Spin hoặc PC"},
|
['tech_h_plus']= {"Tech", "KHÓ+", "Chỉ được clear Spin hoặc PC"},
|
||||||
['tech_l']= {"Tech", "RẤT KHÓ", "Cố gắng không phá B2B!"},
|
['tech_l']= {"Tech", "RẤT KHÓ", "Cố gắng không phá B2B!"},
|
||||||
['tech_l_plus']= {"Tech", "RẤT KHÓ+", "Chỉ được clear Spin hoặc PC"},
|
['tech_l_plus']= {"Tech", "RẤT KHÓ+", "Chỉ được clear Spin hoặc PC"},
|
||||||
['tech_finesse']= {"Tech", "HOÀN HẢO", "Không được phép có lỗi di chuyển!"},
|
['tech_finesse']= {"Tech", "HOÀN HẢO", "Không được phép có lỗi di chuyển!"},
|
||||||
['tech_finesse_f']= {"Tech", "HOÀN HẢO+", "Không được phép có lỗi di chuyển hoặc loại Xoá hàng thường!"},
|
['tech_finesse_f']= {"Tech", "HOÀN HẢO+", "Không được phép có lỗi di chuyển hoặc loại Xoá hàng thường!"},
|
||||||
['tsd_e']= {"TSD Challenge", "DỄ", "Chỉ được làm T-Spin Double!"}, -- Chỉ được clear…
|
['tech_finesse_lock']= {"Tech", "FINESSE LOCK", "Không được mắc lỗi di chuyển hoặc bạn không thể điều khiển gạch!"},
|
||||||
['tsd_h']= {"TSD Challenge", "KHÓ", "Chỉ được làm T-Spin Double!"},
|
['tech_finesse_lock_f']= {"Tech", "FINESSE+ LOCK", "Không được mắc lỗi di chuyển hoặc bạn không thể điều khiển gạch! Và không thể dùng kiểu xóa thường!"},
|
||||||
['tsd_u']= {"TSD Challenge", "THÁCH ĐẤU", "Chỉ được làm T-Spin Double!"},
|
['tsd_e']= {"TSD Challenge", "DỄ", "Chỉ được làm T-Spin Double!"}, -- Chỉ được clear…
|
||||||
['backfire_n']= {"Backfire", "THƯỜNG", "Sống sót những hàng rác do chính bạn gửi"},
|
['tsd_h']= {"TSD Challenge", "KHÓ", "Chỉ được làm T-Spin Double!"},
|
||||||
['backfire_h']= {"Backfire", "KHÓ", "Sống sót những hàng rác do chính bạn gửi"},
|
['tsd_u']= {"TSD Challenge", "THÁCH ĐẤU", "Chỉ được làm T-Spin Double!"},
|
||||||
['backfire_l']= {"Backfire", "RẤT KHÓ", "Sống sót những hàng rác do chính bạn gửi"},
|
['backfire_n']= {"Backfire", "THƯỜNG", "Sống sót những hàng rác do chính bạn gửi"},
|
||||||
['backfire_u']= {"Backfire", "THÁCH ĐẤU", "Sống sót những hàng rác do chính bạn gửi"},
|
['backfire_h']= {"Backfire", "KHÓ", "Sống sót những hàng rác do chính bạn gửi"},
|
||||||
['sprintAtk']= {"Sprint", "100 Attack", "Gửi 100 hàng!"},
|
['backfire_l']= {"Backfire", "RẤT KHÓ", "Sống sót những hàng rác do chính bạn gửi"},
|
||||||
['sprintEff']= {"Sprint", "Efficiency", "Gửi càng nhiều hàng càng tốt trong 40 hàng"},
|
['backfire_u']= {"Backfire", "THÁCH ĐẤU", "Sống sót những hàng rác do chính bạn gửi"},
|
||||||
['zen']= {'Zen', "200", "Xoá 200 hàng nhưng không có thời gian giới hạn"},
|
['sprintAtk']= {"Sprint", "100 Attack", "Gửi 100 hàng!"},
|
||||||
['ultra']= {'Ultra', "EXTRA", "Lấy càng nhiều điểm càng tốt trong 2 phút"},
|
['sprintEff']= {"Sprint", "Efficiency", "Gửi càng nhiều hàng càng tốt trong 40 hàng"},
|
||||||
['infinite']= {"Infinite", "", "Chỉ là một chế độ tự do"},
|
['zen']= {'Zen', "200", "Xoá 200 hàng nhưng không có thời gian giới hạn"},
|
||||||
['infinite_dig']= {"Infinite: Dig", "", "Đào, đào nữa, đào mãi"},
|
['ultra']= {'Ultra', "EXTRA", "Lấy càng nhiều điểm càng tốt trong 2 phút"},
|
||||||
['marathon_inf']= {"Marathon", "VÔ TẬN", "Marathon không có điểm dừng."},
|
['infinite']= {"Infinite", "", "Chỉ là một chế độ tự do"},
|
||||||
|
['infinite_dig']= {"Infinite: Dig", "", "Đào, đào nữa, đào mãi"},
|
||||||
|
['marathon_inf']= {"Marathon", "VÔ TẬN", "Marathon không có điểm dừng."},
|
||||||
|
|
||||||
['custom_clear']= {"Custom", "NORMAL"},
|
['custom_clear']= {"Custom", "NORMAL"},
|
||||||
['custom_puzzle']= {"Custom", "PUZZLE"},
|
['custom_puzzle']= {"Custom", "PUZZLE"},
|
||||||
},
|
},
|
||||||
getTip={refuseCopy=true,
|
getTip={refuseCopy=true,
|
||||||
-- Lưu ý dành cho những bạn sửa phần này: Nguyên đoạn này là lấy từ bản tiếng Anh
|
-- Lưu ý dành cho những bạn sửa phần này: Nguyên đoạn này là lấy từ bản tiếng Anh
|
||||||
-- Nhưng User670 khi dịch từ tiếng Trung sang đã chọn lược bỏ bớt một số câu
|
-- Nhưng User670 khi dịch từ tiếng Trung sang đã chọn lược bỏ bớt một số câu
|
||||||
":dcgpray:",
|
":dcgpray:",
|
||||||
"Không thể mở “Techmino.app” vì người làm game đã bay màu",
|
"Không thể mở \"Techmino.app\" vì người làm game đã bay màu",
|
||||||
"“Techmino.app” là vi rút đấy. Xoá đi",
|
"\"Techmino.app\" là vi rút đấy. Xoá đi",
|
||||||
"“TechminOS”",
|
"\"TechminOS\"",
|
||||||
"(RUR’U’)R’FR2U’R’U’(RUR’F’)",
|
"(RUR’U’)R’FR2U’R’U’(RUR’F’)",
|
||||||
"\\jezevec/\\jezevec/\\jezevec/",
|
"\\jezevec/\\jezevec/\\jezevec/",
|
||||||
"\\osk/\\osk/\\osk/",
|
"\\osk/\\osk/\\osk/",
|
||||||
"↑↑↓↓←→←→BA",
|
"↑↑↓↓←→←→BA",
|
||||||
"$include<studio.h>",
|
"$include<studio.h>",
|
||||||
"0next 0hold",
|
"0 next 0 hold",
|
||||||
"1next 0hold",
|
"1 next 0 hold",
|
||||||
"1next 1hold!",
|
"1 next 1 hold!",
|
||||||
"1next 6hold!",
|
"1 next 6 hold!",
|
||||||
|
"6 next 1 hold!",
|
||||||
|
"6 next 6 hold?!",
|
||||||
"20G thực chất là một chế độ mới đấy!",
|
"20G thực chất là một chế độ mới đấy!",
|
||||||
"Kỷ lục Sprint 40 hàng: 14.188s (Lurny)",
|
"Kỷ lục Sprint 40 hàng: 14.188s (Lurny)",
|
||||||
"6next 1hold!",
|
|
||||||
"6next 6hold?!",
|
|
||||||
"Rất gần nhưng lại rất xa",
|
"Rất gần nhưng lại rất xa",
|
||||||
"ALL SPIN!",
|
"ALL SPIN!",
|
||||||
"Am G F G",
|
"Am G F G",
|
||||||
@@ -1025,7 +1032,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
"Đừng để những thứ nhỏ nhặt làm bạn nản chí!",
|
"Đừng để những thứ nhỏ nhặt làm bạn nản chí!",
|
||||||
"Đây không phải là lỗi, đây là tính năng!",
|
"Đây không phải là lỗi, đây là tính năng!",
|
||||||
"Hệ thống xoay gạch của Techmino rất đẹp trai!",
|
"Hệ thống xoay gạch của Techmino rất đẹp trai!",
|
||||||
"Em rất tốt nhưng anh rất tiếc…",
|
"Em rất tốt nhưng anh rất tiếc…", -- EXCELLENT! But… let's go better next time
|
||||||
"Đừng quên xem qua phần cài đặt!",
|
"Đừng quên xem qua phần cài đặt!",
|
||||||
"Nếu bạn thấy có vấn đề gì, hãy lên trang GitHub báo lại cho chúng tôi!",
|
"Nếu bạn thấy có vấn đề gì, hãy lên trang GitHub báo lại cho chúng tôi!",
|
||||||
"Game xếp gạch nhưng có thêm chế độ FFA!",
|
"Game xếp gạch nhưng có thêm chế độ FFA!",
|
||||||
@@ -1061,7 +1068,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
"Một số yêu cầu để đạt được rank X là rất khó, kể cả đối với những người giỏi nhất",
|
"Một số yêu cầu để đạt được rank X là rất khó, kể cả đối với những người giỏi nhất",
|
||||||
"Bạn sẽ sớm được chơi với mọi người trên thế giới thôi",
|
"Bạn sẽ sớm được chơi với mọi người trên thế giới thôi",
|
||||||
"Split clear sắp ra mắt!",
|
"Split clear sắp ra mắt!",
|
||||||
"Techmino là sự kết hợp giữa “technique” và “tetromino”",
|
"Techmino là sự kết hợp giữa \"technique\" và \"tetromino\"",
|
||||||
"Hình như mình nghiện Techmino rồi!",
|
"Hình như mình nghiện Techmino rồi!",
|
||||||
"Techmino trên Nspire-CX ư? Có thật đấy! Mà khoan đã, hai game này không giống nhau chút nào cả!",
|
"Techmino trên Nspire-CX ư? Có thật đấy! Mà khoan đã, hai game này không giống nhau chút nào cả!",
|
||||||
"TetroDictionary đã ra mắt (có bản tiếng Việt rồi, nhưng mà hơi bruh, thôi vẫn đủ xài!)",
|
"TetroDictionary đã ra mắt (có bản tiếng Việt rồi, nhưng mà hơi bruh, thôi vẫn đủ xài!)",
|
||||||
@@ -1110,7 +1117,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
{C.N,"Lua",C.Z," No.1"},
|
{C.N,"Lua",C.Z," No.1"},
|
||||||
{C.P,"T-spin!"},
|
{C.P,"T-spin!"},
|
||||||
{C.R,"DMCA là gì?"},
|
{C.R,"DMCA là gì?"},
|
||||||
{C.R,"“Luật sở hữu trí tuệ”"},
|
{C.R,"\"Luật sở hữu trí tuệ\""},
|
||||||
{C.R,"DD",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"D",C.Z," Cannon"},
|
{C.R,"DD",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"D",C.Z," Cannon"},
|
||||||
{C.R,"DT",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z," Cannon"},
|
{C.R,"DT",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z," Cannon"},
|
||||||
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
|
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
|
||||||
@@ -1125,7 +1132,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
-- English UK: /'tɛkminəʊ/; English US: /tɛkminoʊ/
|
-- English UK: /'tɛkminəʊ/; English US: /tɛkminoʊ/
|
||||||
"Techmino phát âm trong tiếng Anh là /'tɛkminəʊ/; còn tiếng Mỹ là /tɛkminoʊ/.",
|
"Techmino phát âm trong tiếng Anh là /'tɛkminəʊ/; còn tiếng Mỹ là /tɛkminoʊ/.",
|
||||||
--
|
--
|
||||||
"Ủa Techmino phải đọc là “Tét-mai-nô” hay là “Tét-mi-nô” vậy?",
|
"Ủa Techmino phải đọc là \"Tét-mai-nô\" hay là \"Tét-mi-nô\" vậy?",
|
||||||
-- Where to download Techmino?
|
-- Where to download Techmino?
|
||||||
"Tải Techmino ở đâu vậy? Trên GitHub đấy!",
|
"Tải Techmino ở đâu vậy? Trên GitHub đấy!",
|
||||||
-- Techmino's birthday
|
-- Techmino's birthday
|
||||||
@@ -1137,14 +1144,14 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
-- 2021 was the year of Techmino's online debut.
|
-- 2021 was the year of Techmino's online debut.
|
||||||
"2021 là năm ra mắt chế độ trực tuyến của Techmino.",
|
"2021 là năm ra mắt chế độ trực tuyến của Techmino.",
|
||||||
-- The Chinese name of this game is 'Block Research Institute'.
|
-- The Chinese name of this game is 'Block Research Institute'.
|
||||||
"Tên chính thức của game là “方块研究所” (Block Research Institute).",
|
"Tên chính thức của game là \"方块研究所\" (Block Research Institute).",
|
||||||
"Một tên khác của game này là “Tiehu Minuo”",
|
"Một tên khác của game này là \"Tiehu Minuo\"",
|
||||||
-- This game is not called Teachmino
|
-- This game is not called Teachmino
|
||||||
"Tên game không phải là Teachmino!",
|
"Tên game không phải là Teachmino!",
|
||||||
--
|
--
|
||||||
"Muốn game có thứ gì đó đặc biệt lúc mở game? Hãy chỉnh đồng hồ trên điện thoại vào một ngày đặc biệt nào đó đi!",
|
"Muốn game có thứ gì đó đặc biệt lúc mở game? Hãy chỉnh đồng hồ trên điện thoại vào một ngày đặc biệt nào đó đi!",
|
||||||
--
|
--
|
||||||
"Trừ khi bạn đang chơi Techmino: “O-spin is a lie!”)",
|
"Trừ khi bạn đang chơi Techmino: \"O-spin is a lie!\")",
|
||||||
-- techminohaowan
|
-- techminohaowan
|
||||||
"Hảo Techmino",
|
"Hảo Techmino",
|
||||||
--
|
--
|
||||||
@@ -1156,14 +1163,14 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
-- "Meow!"
|
-- "Meow!"
|
||||||
"Meow!",
|
"Meow!",
|
||||||
-- Getting popup messages in the middle of a game? Go to settings and disable them.
|
-- Getting popup messages in the middle of a game? Go to settings and disable them.
|
||||||
"Thông báo tự dưng hiện lên giữa game? Vào cài đặt của app tạo ra popup và tắt nó đi.",
|
"Thông báo tự dưng hiện lên giữa game? Vào cài đặt tắt nó đi!",
|
||||||
"Do Not Distrub (Không làm phiền) sẽ là cứu tinh của bạn khi có quá nhiều thông báo cùng làm phiền.",
|
"Hãy bật Do Not Distrub (Không làm phiền) nếu bạn có quá nhiều thông báo.",
|
||||||
-- Don't play with your phone if your homework isn't finished.
|
-- Don't play with your phone if your homework isn't finished.
|
||||||
"Đừng chơi điện thoại khi bài tập về nhà còn chưa hoàn thành.",
|
"Đừng chơi điện thoại khi bài tập về nhà còn chưa hoàn thành.",
|
||||||
-- Enabling vibration on some mobile systems may cause severe lag."
|
-- Enabling vibration on some mobile systems may cause severe lag."
|
||||||
"Bật rung trên điện thoại có thể khiến máy giật lag.",
|
"Bật rung trên điện thoại có thể khiến máy phải thở oxy.",
|
||||||
-- Eat the button? Really? I suggest you play it back to see if you pressed it and how long it took you to press it"
|
-- Eat the button? Really? I suggest you play it back to see if you pressed it and how long it took you to press it"
|
||||||
"Phím không ăn? Giỡn à? Xem lại replay để chắc rằng ông đã nhấn và xem thử mất bao nhiêu thời gian để ông nhấn phím đó.",
|
"Phím không ăn? Đùa à? Xem lại replay để chắc rằng ông đã nhấn và xem thử mất bao nhiêu thời gian để ông nhấn phím đó.",
|
||||||
-- Probably someone will read the tip
|
-- Probably someone will read the tip
|
||||||
"Chắc chắn có người đang đọc cái dòng chữ nhỏ đang chạy ở dưới này.",
|
"Chắc chắn có người đang đọc cái dòng chữ nhỏ đang chạy ở dưới này.",
|
||||||
-- It seems like no one has reached a high level by playing with their feet yet.
|
-- It seems like no one has reached a high level by playing with their feet yet.
|
||||||
@@ -1175,17 +1182,17 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
-- Skilled players of the Classic Tetris game are also formidable; don't underestimate them
|
-- Skilled players of the Classic Tetris game are also formidable; don't underestimate them
|
||||||
"Xếp gạch cổ điển cũng không đơn giản gì như xếp gạch hiện đại đâu. Đừng có mà xem thường những người chơi hệ cổ điển!",
|
"Xếp gạch cổ điển cũng không đơn giản gì như xếp gạch hiện đại đâu. Đừng có mà xem thường những người chơi hệ cổ điển!",
|
||||||
-- Classic Tetris and Modern Tetris are two different games; being skilled in one doesn't mean you'll be skilled in the other. You have to start from scratch.
|
-- Classic Tetris and Modern Tetris are two different games; being skilled in one doesn't mean you'll be skilled in the other. You have to start from scratch.
|
||||||
"Xếp gạch cổ điển và xếp gạch hiện đại là hai thể loại game khác nhau đấy! Giỏi một trong hai không có nghĩa là bạn giỏi cả bên còn lại đâu. Bạn phải học từ đầu đấy! Không đơn giản đâu.",
|
"Xếp gạch cổ điển và xếp gạch hiện đại là hai thể loại game khác nhau đấy! Giỏi một trong hai chưa chắc bạn giỏi cả bên còn lại đâu. Bạn phải học lại từ đầu đấy",
|
||||||
-- To protect the players' well-being, the game has a temporary and simplified anti-addiction system! (But you probably won't trigger it, haha)
|
-- To protect the players' well-being, the game has a temporary and simplified anti-addiction system! (But you probably won't trigger it, haha)
|
||||||
"Để tránh việc người chơi nào đó chơi quá lâu, game đã có hệ thống chống nghiện đơn giản tạm thời (Nhưng bạn có lẽ sẽ không bao giờ kích hoạt chúng đâu, haha)",
|
"Để tránh việc người chơi nào đó chơi quá lâu, game đã có hệ thống chống nghiện đơn giản tạm thời (Nhưng bạn có lẽ sẽ không bao giờ kích hoạt chúng đâu, haha)",
|
||||||
-- Basic stacking and digging skills are crucial; those who neglect these two aspects often regret it (trust me)
|
-- Basic stacking and digging skills are crucial; those who neglect these two aspects often regret it (trust me)
|
||||||
{"Kỹ năng xếp lên vào đào xuống là 2 kỹ năng RẤT quan trọng; những ai coi thường hoặc bỏ bê hai khía cạnh này thường hay bị bón hành súp mặt lờ (tin ",C.W,"MrZ",C.Z," đi!)"},
|
{"Kỹ năng xếp lên vào đào xuống là 2 kỹ năng RẤT quan trọng; những ai (đã/từng) coi thường/bỏ bê hai khía cạnh này thường hay bị bón hành súp mặt lờ (tin ",C.W,"MrZ",C.Z," đi!)"},
|
||||||
-- Even if you're topped out, don't give up; every line of garbage can potentially become your weapon.
|
-- Even if you're topped out, don't give up; every line of garbage can potentially become your weapon.
|
||||||
"Ngay cả khi bạn sắp bị top out, đừng bỏ cuộc; vì từng hàng rác có tiềm năng trở thành vũ khí của bạn!",
|
"Ngay cả khi bạn sắp bị top out, đừng bỏ cuộc; vì từng hàng rác có tiềm năng trở thành vũ khí của bạn!",
|
||||||
-- The video shown above is not a recording; it's the robot playing in real-time.
|
-- The video shown above is not a recording; it's the robot playing in real-time.
|
||||||
"Cái ở trên là replay hả? Không, là AI đang chơi trong thời gian thực đấy!",
|
"Cái ở trên là replay hả? Không, là AI đang chơi trong thời gian thực đấy!",
|
||||||
-- Extended gaming sessions will gradually deteriorate your performance! Remember to take breaks when playing for a long time~
|
-- Extended gaming sessions will gradually deteriorate your performance! Remember to take breaks when playing for a long time~
|
||||||
"Những lần chơi game kéo dài thường xuyên dần dần làm giảm hiệu suất chơi game (trong trường hợp tệ nhất bạn có thể bị stall). Nhớ nghỉ ngơi khi chơi lâu",
|
"THường xuyên chơi game lâu có thể khiến bạn có thể bị đuối sức (cả thể chất và tinh thần, tệ nhất có thể bị stall). Hãy nhớ nghỉ giải lao sau khi chơi lâu nhé!",
|
||||||
-- Be careful of tenosynovitis!
|
-- Be careful of tenosynovitis!
|
||||||
{C.R,"CẢNH BÁO! ",C.Z,"Bệnh viêm bao gân cổ tay!"},
|
{C.R,"CẢNH BÁO! ",C.Z,"Bệnh viêm bao gân cổ tay!"},
|
||||||
-- The button with a question mark in the bottom-right corner is the game manual (assuming you haven't enabled the concise mode).
|
-- The button with a question mark in the bottom-right corner is the game manual (assuming you haven't enabled the concise mode).
|
||||||
@@ -1213,12 +1220,15 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
--
|
--
|
||||||
-- IT JOKES
|
-- IT JOKES
|
||||||
"git clone --recursive https://github.com/26F-Studio/Techmino.git",
|
"git clone --recursive https://github.com/26F-Studio/Techmino.git",
|
||||||
"git merge --rebase",
|
"git commit -m \".\"",
|
||||||
|
"git pull = git fetch + git merge",
|
||||||
|
"git push",
|
||||||
|
"git push -f",
|
||||||
"git stash",
|
"git stash",
|
||||||
"git stash apply",
|
"git stash apply",
|
||||||
"git submodule update",
|
"git submodule update",
|
||||||
"git commit -m \".\"",
|
"git merge --rebase",
|
||||||
"git push -f",
|
"git merge --squash",
|
||||||
"Lua No.1",
|
"Lua No.1",
|
||||||
"sudo rm -rf /*",
|
"sudo rm -rf /*",
|
||||||
"shutdown /s /t 0", -- Turn off computer completely (no Fast Boot)
|
"shutdown /s /t 0", -- Turn off computer completely (no Fast Boot)
|
||||||
@@ -1230,14 +1240,6 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
"Techmino đã đột ngột dừng lại",
|
"Techmino đã đột ngột dừng lại",
|
||||||
-- If you have a real interest in programming, I recommend Lua. Easy installation, simple syntax, and fast execution speed. Stay away from boring school programming (haha)
|
-- If you have a real interest in programming, I recommend Lua. Easy installation, simple syntax, and fast execution speed. Stay away from boring school programming (haha)
|
||||||
{"Nếu bạn thực sự có hứng thú trong lập trình, tôi đề xuất sử dụng Lua. Dễ cài đặt, cú pháp đơn giản, tốc độ thực thi nhanh. Hãy tránh xa những tiết học lập trình chán ngắt ở trên trường luôn đi! (haha) - ",C.W,"MrZ",C.Z," said."},
|
{"Nếu bạn thực sự có hứng thú trong lập trình, tôi đề xuất sử dụng Lua. Dễ cài đặt, cú pháp đơn giản, tốc độ thực thi nhanh. Hãy tránh xa những tiết học lập trình chán ngắt ở trên trường luôn đi! (haha) - ",C.W,"MrZ",C.Z," said."},
|
||||||
-- COLD CLEAR PATH
|
|
||||||
"Đường dẫn của Cold Clear: "..(
|
|
||||||
SYSTEM=='Windows' and "<root>\\CCloader.dll" or
|
|
||||||
SYSTEM=='Linux' and "<root>/CCloader.so" or
|
|
||||||
SYSTEM=='Android' and "<root>/libAndroid/arm64-v8a (hoặc armeabi-v7a)/CCloader.so" or
|
|
||||||
SYSTEM=='OS X' and "<root/CCloader.dylib" or
|
|
||||||
"(… Tui… không biết :3)"
|
|
||||||
),
|
|
||||||
--
|
--
|
||||||
-- CHANGELOG
|
-- CHANGELOG
|
||||||
{C.lW, "V0.0.091726",": ",C.Z, "Đã thêm hệ thống xoay TRS"},
|
{C.lW, "V0.0.091726",": ",C.Z, "Đã thêm hệ thống xoay TRS"},
|
||||||
@@ -1288,11 +1290,11 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
{C.W,"MrZ",C.Z," còn có một biệt danh dễ thương hơn, đó là ",C.W,"Z-Chan"},
|
{C.W,"MrZ",C.Z," còn có một biệt danh dễ thương hơn, đó là ",C.W,"Z-Chan"},
|
||||||
"Có hơn 400 mẹo bạn có thể nhìn thấy ở đây, là cái dòng chữ này, nếu bạn đang chơi Techmino tiếng Trung",
|
"Có hơn 400 mẹo bạn có thể nhìn thấy ở đây, là cái dòng chữ này, nếu bạn đang chơi Techmino tiếng Trung",
|
||||||
|
|
||||||
{C.lSea,"Sea: ",C.Z,"Tui không có đủ mặn để viết joke. Nên một số câu đùa đang chạy ở đây được viết bởi ",C.yellow,"Shard Nguyễn",C.Z,". “Em cảm ơn anh!”"},
|
{C.lSea,"Sea: ",C.Z,"Tui không có đủ mặn để viết joke. Nên một số câu đùa đang chạy ở đây được viết bởi ",C.yellow,"Shard Nguyễn",C.Z,". \"Em cảm ơn anh!\""},
|
||||||
{C.lSea,"Sea: ",C.Z,"Tui đang tự hỏi liệu còn bao nhiêu lỗi tui bỏ sót lúc dịch game không? Tính ra tui đã cập nhật đi cập nhật lại cũng 4-5 lần rồi."},
|
{C.lSea,"Sea: ",C.Z,"Tui đang tự hỏi liệu còn bao nhiêu lỗi tui bỏ sót lúc dịch game không? Tính ra tui đã cập nhật đi cập nhật lại cũng 4-5 lần rồi."},
|
||||||
|
|
||||||
{"Cộng đồng Tetris ",C.R,"Việt ",C.lY,"Nam ",C.Z,": https://discord.gg/jX7BX9g"}, -- Tetris Vietnam
|
{"Cộng đồng Tetris ",C.R,"Việt ",C.lY,"Nam ",C.Z,": https://discord.gg/jX7BX9g"}, -- Tetris Vietnam
|
||||||
{C.W,"MrZ ",C.Z,"vẫn chưa biết chọn tên nào để đặt cho từ điển của Techmino. Hiện có 3 tên: “Zictionary”, “TetroDictionary” và “Little Z Dictionary”"},
|
{C.W,"MrZ ",C.Z,"vẫn chưa biết chọn tên nào để đặt cho từ điển của Techmino. Hiện có 3 tên: \"Zictionary\", \"TetroDictionary\" và \"Little Z Dictionary\""},
|
||||||
"Ủa tao nhớ game này tên là xếp hình mà? Ừ thì đúng nhưng để giữ độ đồng nhất và tránh bị cấn mồm thì nên gọi game này là game xếp gạch.",
|
"Ủa tao nhớ game này tên là xếp hình mà? Ừ thì đúng nhưng để giữ độ đồng nhất và tránh bị cấn mồm thì nên gọi game này là game xếp gạch.",
|
||||||
"Mình xin phép ủng hộ cho player này. Ủng hộ càng nhiều tỉ lệ thắng càng cao!",
|
"Mình xin phép ủng hộ cho player này. Ủng hộ càng nhiều tỉ lệ thắng càng cao!",
|
||||||
{"Aiiiii mua cần phô mai ủng hộ ",C.yellow,"Chủ tiệm phô mai",C.Z," không?"}, -- A joke
|
{"Aiiiii mua cần phô mai ủng hộ ",C.yellow,"Chủ tiệm phô mai",C.Z," không?"}, -- A joke
|
||||||
|
|||||||
@@ -363,6 +363,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[All other test staff]",
|
"[All other test staff]",
|
||||||
"…And You!",
|
"…And You!",
|
||||||
},
|
},
|
||||||
@@ -937,6 +938,8 @@ return {
|
|||||||
['tech_l_plus']= {"科研", "疯狂+", "仅允许spin与PC"},
|
['tech_l_plus']= {"科研", "疯狂+", "仅允许spin与PC"},
|
||||||
['tech_finesse']= {"科研", "极简", "强制最简操作"},
|
['tech_finesse']= {"科研", "极简", "强制最简操作"},
|
||||||
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
|
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
|
||||||
|
['tech_finesse_lock']= {"科研", "极简限制", "限制操作次数"},
|
||||||
|
['tech_finesse_lock_f']={"科研", "极简限制+", "限制操作次数,禁止断B2B"},
|
||||||
['tsd_e']= {"TSD挑战", "简单", "你能连续做几个TSD?"},
|
['tsd_e']= {"TSD挑战", "简单", "你能连续做几个TSD?"},
|
||||||
['tsd_h']= {"TSD挑战", "困难", "你能连续做几个TSD?"},
|
['tsd_h']= {"TSD挑战", "困难", "你能连续做几个TSD?"},
|
||||||
['tsd_u']= {"TSD挑战", "极限", "你能连续做几个TSD?"},
|
['tsd_u']= {"TSD挑战", "极限", "你能连续做几个TSD?"},
|
||||||
|
|||||||
@@ -311,6 +311,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[All other test staff]",
|
"[All other test staff]",
|
||||||
"…And You!",
|
"…And You!",
|
||||||
},
|
},
|
||||||
@@ -854,6 +855,8 @@ return {
|
|||||||
['tech_l_plus']= {"Tech(LunaticP);", "", "仅允许spin与PC"},
|
['tech_l_plus']= {"Tech(LunaticP);", "", "仅允许spin与PC"},
|
||||||
['tech_finesse']= {"Tech(Finesse);", "", "强制最简操作"},
|
['tech_finesse']= {"Tech(Finesse);", "", "强制最简操作"},
|
||||||
['tech_finesse_f']= {"Tech(FinesseF);", "", "禁止普通消除,强制最简操作"},
|
['tech_finesse_f']= {"Tech(FinesseF);", "", "禁止普通消除,强制最简操作"},
|
||||||
|
['tech_finesse_lock']= {"Tech(FineeseLock);","", "限制操作次数"},
|
||||||
|
['tech_finesse_lock_f']={"Tech(FineeseLockF);","", "限制操作次数,禁止断B2B"},
|
||||||
['tsd_e']= {"TSD(Easy);", "", "你能连续做几个TSD?"},
|
['tsd_e']= {"TSD(Easy);", "", "你能连续做几个TSD?"},
|
||||||
['tsd_h']= {"TSD(Hard);", "", "你能连续做几个TSD?"},
|
['tsd_h']= {"TSD(Hard);", "", "你能连续做几个TSD?"},
|
||||||
['tsd_u']= {"TSD(Ultimate);", "", "你能连续做几个TSD?"},
|
['tsd_u']= {"TSD(Ultimate);", "", "你能连续做几个TSD?"},
|
||||||
|
|||||||
@@ -363,6 +363,7 @@ return {
|
|||||||
"huaji2369",
|
"huaji2369",
|
||||||
"Lexitik",
|
"Lexitik",
|
||||||
"Tourahi Anime",
|
"Tourahi Anime",
|
||||||
|
"PopUpWaffles",
|
||||||
"[All other test staff]",
|
"[All other test staff]",
|
||||||
"…And You!",
|
"…And You!",
|
||||||
},
|
},
|
||||||
@@ -907,6 +908,8 @@ return {
|
|||||||
['tech_l_plus']= {"科研", "瘋狂+", "僅允許spin與PC"},
|
['tech_l_plus']= {"科研", "瘋狂+", "僅允許spin與PC"},
|
||||||
['tech_finesse']= {"科研", "finesse", "強制finesse"},
|
['tech_finesse']= {"科研", "finesse", "強制finesse"},
|
||||||
['tech_finesse_f']= {"科研", "finesse+", "禁止普通清除,強制finesse"},
|
['tech_finesse_f']= {"科研", "finesse+", "禁止普通清除,強制finesse"},
|
||||||
|
-- ['tech_finesse_lock']= {"科研", "极简限制", "限制操作次数"},
|
||||||
|
-- ['tech_finesse_lock_f']={"科研", "极简限制+", "限制操作次数,禁止断B2B"},
|
||||||
['tsd_e']= {"TSD挑戰", "簡單", "你能連續做幾個TSD?"},
|
['tsd_e']= {"TSD挑戰", "簡單", "你能連續做幾個TSD?"},
|
||||||
['tsd_h']= {"TSD挑戰", "困難", "你能連續做幾個TSD?"},
|
['tsd_h']= {"TSD挑戰", "困難", "你能連續做幾個TSD?"},
|
||||||
['tsd_u']= {"TSD挑戰", "極限", "你能連續做幾個TSD?"},
|
['tsd_u']= {"TSD挑戰", "極限", "你能連續做幾個TSD?"},
|
||||||
|
|||||||
@@ -1,119 +1,122 @@
|
|||||||
Lối chơi:
|
Lối chơi:
|
||||||
Hệ thống sẽ cung cấp bạn các tetromino (gạch 4 ô),
|
Hệ thống sẽ cấp cho người chơi 7 loại tetromino (gạch 4 ô) bao gồm: Z, S, J, L, I, O, T;
|
||||||
có tổng 7 loại, và người chơi cần điều khiển chúng (di chuyển sang trái và phải; xoay 90, 180, hoặc 270 độ).
|
và người chơi cần điều khiển chúng (di chuyển sang trái và phải; xoay 90 / 180 / 270 độ).
|
||||||
Cứ mỗi hàng được lấp đầy trong bảng bởi các viên gạch, chúng sẽ bị xóa ra khỏi bảng.
|
Cứ mỗi hàng được lấp đầy trong bảng bởi các viên gạch, chúng sẽ bị xóa ra khỏi bảng.
|
||||||
Nếu có đối thủ, đối thủ sẽ bị tấn công mạnh hoặc nhẹ tùy theo số hàng bạn gửi.
|
Nếu có đối thủ, đối thủ sẽ bị tấn công mạnh hoặc nhẹ tùy theo số hàng bạn gửi.
|
||||||
Chơi hết hoặc đạt mục tiêu của cấp độ để thắng.
|
Chơi hết hoặc đạt mục tiêu của cấp độ để thắng.
|
||||||
|
|
||||||
|
|
||||||
Hệ thống xoay gạch:
|
Hệ thống xoay gạch:
|
||||||
Mặc định sẽ sử dụng TRS (Techmino Rotation System - Hệ thống xoay gạch Techmino).
|
Mặc định sẽ sử dụng TRS (Techmino Rotation System — Hệ thống xoay gạch Techmino).
|
||||||
Game cho phép người chơi chọn các hệ thống xoay gạch phổ biến khác (thường không cần thiết)
|
Game cho phép người chơi chọn các hệ thống xoay gạch phổ biến khác (thường không cần thiết)
|
||||||
|
|
||||||
|
|
||||||
Cách phát hiện spin:
|
Cách phát hiện spin: bằng cách sử dụng hệ thống điểm.
|
||||||
Thỏa mãn quy tắc “3 góc” +2 điểm [*]
|
+2 điểm nếu thỏa mãn quy tắc "3 góc"
|
||||||
Thỏa mãn quy tắc “bất động” +2 điểm
|
+2 điểm nếu thỏa mãn quy tắc "bất động"
|
||||||
- Cứ một trong hai điều kiện trên được thỏa mãn, thì sẽ được tính là Spin
|
+1 điểm nếu chưa kiểm tra vị trí kick thứ hai trong bảng kick
|
||||||
|
|
||||||
Nếu việc xoay thỏa mãn ngay vị trí đầu tiên trong bảng đá tường, +1 điểm
|
* Chỉ cần điều kiện 1 hay điều kiện 2 thỏa mãn thì cú xoay đó được tính là Spin *
|
||||||
|
|
||||||
- Spin sẽ là Mini nếu:
|
— Spin sẽ là Mini nếu xảy ra 1 trong 3 điều kiện sau:
|
||||||
Tổng điểm sau khi kiểm tra các quy tắc chỉ được 2 điểm
|
Tổng điểm sau khi kiểm tra các quy tắc chỉ được 2 điểm,
|
||||||
HOẶC
|
Gạch dùng để làm là S, Z, J, L hay T,
|
||||||
Gạch dùng để làm là S, Z, J, L hoặc T vẫn còn tàn dư của gạch đó sau khi xóa hàng.
|
Gạch đó không được xóa hoàn toàn.
|
||||||
|
|
||||||
[*] LƯU Ý: quy tắc “góc sau lưng gạch” có thể ảnh hưởng đến kết quả kiểm tra của quy tắc “3 góc”!
|
|
||||||
|
|
||||||
Hệ thống tấn công:
|
Hệ thống tấn công:
|
||||||
Kiểu xóa Đặc biệt (Special clear):
|
Kiểu xóa Đặc biệt (Special clear):
|
||||||
Kiểu xóa Đặc biệt chỉ trường hợp bạn thực hiện Spin, Techrash/Techrash+, PC/HPC.
|
Kiểu xóa Đặc biệt chỉ trường hợp bạn thực hiện Spin, Techrash, Techrash+ — xóa 5 hàng hoặc hơn, PC, HPC.
|
||||||
Kiểu xóa Đặc biệt có thể sạc đầy thanh B2B.
|
Kiểu xóa Đặc biệt có thể sạc đầy thanh B2B.
|
||||||
|
|
||||||
Kiểu xóa Siêu cấp (Super clear):
|
Kiểu xóa Siêu cấp (Super clear):
|
||||||
Kiểu xóa Siêu cấp chỉ trường hợp bạn thực hiện Kiểu xóa Đặc biệt khi thanh B2B không trống.
|
Là Kiểu xóa Đặc biệt nhưng được thực hiện với B2B hoặc B3B
|
||||||
|
|
||||||
Kiểu xóa Đặc biệt (spin): gửi đòn tấn công (số hàng xóa × 2) hàng,
|
Kiểu xóa Đặc biệt (spin): Gửi gấp đôi số hàng vừa xóa.
|
||||||
- B2B gửi thêm 1/1/2/4/8 cho Spin Đơn/Spin Đôi/Spin Tam/Techrash/Techrash+
|
— B2B gửi thêm 1/1/2/4/8 cho Spin Đơn/Spin Đôi/Spin Tam/Techrash/Techrash+
|
||||||
- B2B2B gửi thêm (số hàng xóa × 0.5) trên B2B và +1 hàng để hủy rác tới
|
— B2B2B gửi thêm (số hàng xóa × 0.5) trên B2B và +1 hàng để đánh chặn
|
||||||
- Mini sẽ bị cắt còn 25% (hệ số × 0.25)
|
— Mini sẽ bị cắt chỉ còn ¼ so với giá trị ban đầu
|
||||||
|
|
||||||
Kiểu xóa Đặc biệt (Techrash/Techrash+ không dùng spin):
|
Kiểu xóa Đặc biệt (Techrash/Techrash+ nhưng không spin):
|
||||||
- B2B gửi thêm 1 hàng
|
— B2B gửi thêm 1 hàng
|
||||||
- B2B2B sẽ boost 50% tấn công và +1 hàng để hủy rác tới
|
— B3B boost 50% tấn công và +1 hàng để đánh chặn
|
||||||
|
|
||||||
Kiểu xóa không Đặc biệt: Single/Double/Triple (Đơn/Đôi/Tam) gửi 1/2/3 hàng
|
Kiểu xóa không Đặc biệt:
|
||||||
|
Single/Double/Triple (Đơn/Đôi/Tam) gửi 0/1/2 hàng
|
||||||
|
|
||||||
Combo (REN):
|
Combo (REN):
|
||||||
Số combo = số lần bạn xóa hàng liên tiếp - 1 (chỉ nhận TỐI ĐA combo 12, từ combo 13 về sau sẽ tính thành combo 12).
|
Lượng sát thương từ combo được tính bằng cách nhân tổng sát thương trước đó (được tính ở trên) nhân với "hệ số combo"
|
||||||
Toàn bộ sát thương kể trên (trừ tấn công từ PC/HPC) nhận thêm bonus (combo × 25%) HOẶC (combo × 15%) nếu chỉ xóa 1 hàng.
|
Hệ số này có giá trị là 25% (hoặc 10% nếu bạn vừa xóa duy nhất 1 hàng) của tổng combo bạn có (tối đa là 12).
|
||||||
+1 hàng để tấn công từ Combo 2 trở đi.
|
Lưu ý: Combo chỉ được bắt đầu tính từ lần xóa thứ 2 liên tiếp, không phải lần xóa đầu.
|
||||||
|
|
||||||
Hemi Perfect Clear (PC mà “vẫn còn gạch ở dưới”).
|
Hemi Perfect Clear (xem trong Zictionary)
|
||||||
Nếu chỉ còn 1 hàng xóa, thì toàn bộ gạch còn lại không phải do người chơi đặt:
|
+4 hàng để tấn công, +2 hàng để đánh chặn
|
||||||
+4 hàng để tấn công, +2 hàng để hủy rác tới
|
|
||||||
|
|
||||||
Perfect Clear (All Clear):
|
Perfect Clear (All Clear): Gửi 8 → 16 hàng rác
|
||||||
- Gửi 8 → 16 hàng rác (6 + 2 * số PC đã làm; tính tối đa 5PC) HOẶC sát thương thường, tùy vào sát thương nào mạnh hơn.
|
PC thứ nhất chỉ gửi 8 hàng rác, các PC sau đó sẽ thêm 2 hàng rác để tấn công (tổng hàng rác có thể gửi tối đa là 16 hàng)
|
||||||
- +2 hàng để hủy rác.
|
|
||||||
|
|
||||||
Sau khi tính toán xong, lượng sát thương sẽ bị làm tròn XUỐNG trước khi gửi.
|
Sau khi tính toán xong, lượng sát thương sẽ bị làm tròn XUỐNG trước khi gửi.
|
||||||
|
|
||||||
|
|
||||||
Thanh Back to Back (B2B):
|
Thanh Back to Back (B2B):
|
||||||
Thanh B2B có giá trị từ 0 tới 1,000. Kiểu xóa đặc biệt là B2B nếu thanh vượt qua vạch 50, B2B2B nếu qua vạch 800.
|
Thanh B2B có giá trị từ 0 tới 1000 điểm.
|
||||||
|
Một người chơi đang ở trạng thái B2B khi thanh có 50 đến 800 điểm.
|
||||||
|
Một người chơi đang ở trang thái B3B khi thanh có hơn 800 điểm.
|
||||||
|
|
||||||
Nếu có hàng được xóa:
|
Nếu có hàng được xóa:
|
||||||
Kiểu xóa đặc biệt:
|
Kiểu xóa đặc biệt:
|
||||||
- Spin Đơn/Đôi/Tam/Techrash/Techrash+ + 50/100/180/800/1000 (×50% nếu là Mini)
|
— Spin Đơn/Đôi/Tam/Techrash/Techrash+ lần lượt cộng thêm 50/100/180/800/1000 (×50% nếu là Mini)
|
||||||
- Techrash/Techrash+ + 150/200/...
|
— Techrash +150 điểm, nếu xóa hơn 4 hàng cùng lúc, mỗi hàng từ hàng thứ 5 trở đi cộng thêm 50 điểm.
|
||||||
- PC nếu số PC làm được trong một ván >4, +800
|
— PC từ thứ 4 trở đi có giá trị 800 điểm
|
||||||
- HPC, +100
|
— HPC cộng thên 100 điểm
|
||||||
Kiểu xóa thường -250
|
Kiểu xóa thường: -250 điểm
|
||||||
|
|
||||||
Nếu không: Spin (0 hàng) +20.
|
Nếu có spin nhưng không có hàng nào được xóa:
|
||||||
LƯU Ý! Thanh B2B không thể sạc qua vạch 800 bằng cách này.
|
— Thanh B2B chỉ có ít hơn 800 điểm: mỗi spin có giá trị 20 điểm
|
||||||
|
— Thanh B2B có nhiều hơn 800 điểm: mỗi spin sẽ trừ đi 40 điểm cho tới khi thanh B2B còn 800 điểm.
|
||||||
|
|
||||||
|
|
||||||
Hệ thống tính điểm:
|
Hệ thống tính điểm:
|
||||||
Cứ chơi càng hay thì điểm càng cao, thế thôi!
|
Hệ thống này không được mô tả ở đây do độ phức tạp của nó, cộng thêm với việc nó có thể thay đổi bất cứ lúc nào.
|
||||||
|
Thành thật mà nói, cứ chơi càng hay thì điểm càng cao.
|
||||||
|
Việc tính điểm cũng độc lập tùy vào từng chế độ.
|
||||||
|
|
||||||
|
|
||||||
Khoảng thời gian chờ trước khi tấn công:
|
Khoảng thời gian chờ trước khi tấn công:
|
||||||
Sát thường từ Đôi và Tam có hiệu lực nhanh nhất;
|
Một đòn sát thương sẽ không có hiệu lực ngay lập tức để người chơi có chút thời gian phản ứng trước khi tràn vào bảng.
|
||||||
Theo sau là Techrash và Spin, chúng thường gửi tấn công chậm hơn;
|
Thời gian chờ của các đòn tấn công như sau, sắp xếp từ nhanh nhất tới lâu nhất:
|
||||||
Combo dài gửi lâu nhất;
|
— Double và Triple (Đôi và Tam) là nhanh nhất
|
||||||
Với B2B và B2B2B, có thể kéo dài thời gian chờ cũng như có thể thêm hàng;
|
— Theo sau là Techrash, Techrash+, spin; Mini, B2B và B3B có thêm thêm chút thời gian chờ nữa.
|
||||||
Minis cũng có thể kéo dài thời gian chờ thêm chút nữa.
|
— Sát thương từ combo có thời gian chờ lâu nhất..
|
||||||
|
|
||||||
|
|
||||||
Phản công:
|
Phản công:
|
||||||
Khi bạn gửi tấn công, nếu có rác trong hàng chờ, thì ưu tiên dùng hàng để hủy rác trước, sau đó mới dùng tới hàng để tấn công sau.
|
Khi một người chơi cố tấn công, hàng dùng để đánh chặn sẽ dùng trước, trước khi dùng tới hàng để tấn công (với tỉ lệ là 1:1)
|
||||||
Tỉ lệ phản công sẽ là 1:1
|
Sát thương được gửi sớm nhất sẽ bị loại bỏ trước.
|
||||||
Bất kỳ hàng nào để phản công không dùng tới sẽ bỏ hết; cuối cùng, số hàng để tấn công còn lại sẽ gửi tới đối thủ.
|
Bất kỳ hàng nào để đánh chặn không dùng tới sẽ bỏ hết, số hàng để tấn công còn lại sẽ gửi tới đối thủ.
|
||||||
|
|
||||||
|
|
||||||
Chế độ Battle Royale:
|
Chế độ Battle Royale:
|
||||||
Một chế độ có nhiều người chơi (AI, không phải người thật) cùng đối đầu trong một phòng!
|
Trong chế độ này, người chơi sẽ phải đối đầu với hàng chục bot trong cùng một lúc
|
||||||
Cứ sau một số người chơi bị loại nhất định, gạch sẽ rơi nhanh hơn, và rác cũng sẽ phát tác sớm hơn và dâng nhanh hơn.
|
Sau khi một lượng bot bị loại, tốc độ rơi tăng dần, thời gian chờ trước khi tấn công giảm, và hàng rác sẽ trồi lên nhanh hơn
|
||||||
Đánh bật đối thủ khác để nhận một huy hiệu và toàn bộ huy hiệu của người chơi để tăng sức mạnh tấn công.
|
Loại một con bot để nhận một huy hiệu và toàn bộ huy hiệu của chúng để tăng sức mạnh tấn công của bạn.
|
||||||
|
|
||||||
Người chơi có thể chọn 1 trong 4 chế độ tấn công sau đây:
|
Người chơi có thể chọn 1 trong 4 chế độ tấn công sau đây:
|
||||||
- Ngẫu nhiên: Cứ mỗi lần tấn công, có 10% khả năng nhắm vào một người chơi ngẫu nhiên.
|
1. Ngẫu nhiên: Cứ mỗi lần tấn công, có 10% khả năng nhắm vào một bot ngẫu nhiên.
|
||||||
- Huy hiệu: Sau khi bạn tấn công/mục tiêu bị chết, tư động ngắm vào người chơi có nhiều huy hiệu nhất.
|
2. Huy hiệu: Sau khi bạn tấn công/mục tiêu bị chết, tư động nhắm vào bot có nhiều huy hiệu nhất.
|
||||||
- K.O.: Nhắm vào người chơi “đang thở máy, đang hấp hối”.
|
3. K.O.s: Nhắm vào bot “đang thở máy, đang hấp hối”. Tự động nhắm lại sau mỗi giây.
|
||||||
- Phản công: tấn công tất cả người chơi đang nhắm vào bạn
|
4. Phản công: tấn công tất cả bot đang nhắm vào bạn. Bạn sẽ gửi tấn công đến tất cả bọn chúng.
|
||||||
Bạn sẽ gửi tấn công đến tất cả bọn họ.
|
Nếu bạn không nhắm vào mục tiêu nào, thì bạn sẽ tấn công một bot ngẫu nhiên (không nhắm)
|
||||||
Nếu bạn không nhắm vào mục tiêu nào, thì bạn sẽ tấn công một người chơi ngẫu nhiên (không nhắm)
|
|
||||||
Khi toàn bộ đối thủ đều bị đá bay, người sống sót cuối cùng sẽ chiến thắng.
|
Người cuối cùng trụ lại thành công sẽ là người chiến thắng sau khi đã loại được toàn bộ đối thủ.
|
||||||
|
|
||||||
|
|
||||||
Chế độ Tự do:
|
Chế độ Tự do:
|
||||||
Bạn có thể tự do tùy chỉnh nhiều thông số (nhưng không bao gồm các hiệu ứng đặc biệt từ các chế độ khác).
|
Bạn có thể tự do tùy chỉnh nhiều thông số (nhưng không bao gồm các hiệu ứng đặc biệt từ các chế độ khác).
|
||||||
Bạn có thể vẽ một cái bảng để tập xóa hoặc làm mẫu để tập build.
|
Bạn có thể vẽ một cái bảng để tập xóa (Clear mode) hoặc tập xây theo mẫu (Puzzle mode)
|
||||||
Ở trong chế độ Build (Puzzle):
|
|
||||||
Nhấn phím F1 để hiện/ẩn mẫu
|
Ở chế độ Puzzle, bạn có thể nhấn F1 để chọn có hiện mẫu hay không. Để thắng được thì toàn bộ…
|
||||||
ô có X thì không được có gạch;
|
ô có X thì không được có gạch;
|
||||||
ô trống thì có thể ở bất kỳ tình trạng nào;
|
ô trống thì có thể ở bất kỳ tình trạng nào;
|
||||||
ô có màu thì gạch đặt vào ô phải khớp màu;
|
ô có màu thì gạch đặt vào ô phải khớp màu;
|
||||||
ô có màu của hàng rác thì có thể là bất kỳ gạch nào nhưng không thể là không khí.
|
ô có màu của hàng rác thì có thể là bất kỳ gạch nào (không phân biệt kiểu gạch) nhưng không thể là không khí.
|
||||||
Một khi bạn làm khớp với mẫu ban đầu, bạn thắng.
|
|
||||||
|
|||||||
212
parts/modes.lua
212
parts/modes.lua
@@ -1,135 +1,137 @@
|
|||||||
return {
|
return {
|
||||||
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
|
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
|
||||||
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
|
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
|
||||||
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH','sprint123','secret_grade'}},
|
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH','sprint123','secret_grade'}},
|
||||||
{name='sprint_100l', x=-400, y=200, size=50,shape=1,icon="sprint2", unlock={'sprint_400l','drought_n'}},
|
{name='sprint_100l', x=-400, y=200, size=50,shape=1,icon="sprint2", unlock={'sprint_400l','drought_n'}},
|
||||||
{name='sprint_400l', x=-600, y=200, size=40,shape=1,icon="sprint3", unlock={'sprint_1000l'}},
|
{name='sprint_400l', x=-600, y=200, size=40,shape=1,icon="sprint3", unlock={'sprint_1000l'}},
|
||||||
{name='sprint_1000l', x=-800, y=200, size=40,shape=1,icon="sprint3"},
|
{name='sprint_1000l', x=-800, y=200, size=40,shape=1,icon="sprint3"},
|
||||||
|
|
||||||
{name='sprint123', x=160, y=-400, size=40,shape=1,icon="sprint_tri"},
|
{name='sprint123', x=160, y=-400, size=40,shape=1,icon="sprint_tri"},
|
||||||
{name='sprintMPH', x=200, y=-260, size=40,shape=3,icon="sprint2"},
|
{name='sprintMPH', x=200, y=-260, size=40,shape=3,icon="sprint2"},
|
||||||
{name='sprintPenta', x=130, y=-140, size=40,shape=3,icon="sprint_pento"},
|
{name='sprintPenta', x=130, y=-140, size=40,shape=3,icon="sprint_pento"},
|
||||||
|
|
||||||
{name='secret_grade', x=-200, y=-400, size=40,shape=1,icon="secret_grade"},
|
{name='secret_grade', x=-200, y=-400, size=40,shape=1,icon="secret_grade"},
|
||||||
|
|
||||||
{name='drought_n', x=-600, y=400, size=40,shape=1,icon="drought", unlock={'drought_l'}},
|
{name='drought_n', x=-600, y=400, size=40,shape=1,icon="drought", unlock={'drought_l'}},
|
||||||
{name='drought_l', x=-800, y=400, size=40,shape=1,icon="drought"},
|
{name='drought_l', x=-800, y=400, size=40,shape=1,icon="drought"},
|
||||||
|
|
||||||
{name='dig_10l', x=-200, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_40l','dig_eff_10l'}},
|
{name='dig_10l', x=-200, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_40l','dig_eff_10l'}},
|
||||||
{name='dig_40l', x=-400, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_100l'}},
|
{name='dig_40l', x=-400, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_100l'}},
|
||||||
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_400l'}},
|
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_400l'}},
|
||||||
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
|
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
|
||||||
|
|
||||||
{name='dig_eff_10l', x=-400, y=0, size=40,shape=1,icon="dig_sprint", unlock={'dig_eff_40l'}},
|
{name='dig_eff_10l', x=-400, y=0, size=40,shape=1,icon="dig_sprint", unlock={'dig_eff_40l'}},
|
||||||
{name='dig_eff_40l', x=-600, y=0, size=40,shape=1,icon="dig_sprint", unlock={'dig_eff_100l'}},
|
{name='dig_eff_40l', x=-600, y=0, size=40,shape=1,icon="dig_sprint", unlock={'dig_eff_100l'}},
|
||||||
{name='dig_eff_100l', x=-800, y=0, size=40,shape=1,icon="dig_sprint", unlock={'dig_eff_400l'}},
|
{name='dig_eff_100l', x=-800, y=0, size=40,shape=1,icon="dig_sprint", unlock={'dig_eff_400l'}},
|
||||||
{name='dig_eff_400l', x=-1000, y=0, size=40,shape=1,icon="dig_sprint"},
|
{name='dig_eff_400l', x=-1000, y=0, size=40,shape=1,icon="dig_sprint"},
|
||||||
|
|
||||||
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','solo_e','round_e','big_n','blind_e','classic_e','survivor_e','c4wtrain_n','pctrain_n','sprintAtk','zen'}},
|
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','solo_e','round_e','big_n','blind_e','classic_e','survivor_e','c4wtrain_n','pctrain_n','sprintAtk','zen'}},
|
||||||
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n','strategy_e'}},
|
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n','strategy_e'}},
|
||||||
|
|
||||||
{name='solo_e', x=-600, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_n'}},
|
{name='solo_e', x=-600, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_n'}},
|
||||||
{name='solo_n', x=-800, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_h'}},
|
{name='solo_n', x=-800, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_h'}},
|
||||||
{name='solo_h', x=-1000, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_l','techmino49_e'}},
|
{name='solo_h', x=-1000, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_l','techmino49_e'}},
|
||||||
{name='solo_l', x=-1200, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_u'}},
|
{name='solo_l', x=-1200, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_u'}},
|
||||||
{name='solo_u', x=-1400, y=-1000, size=40,shape=1,icon="solo"},
|
{name='solo_u', x=-1400, y=-1000, size=40,shape=1,icon="solo"},
|
||||||
|
|
||||||
{name='techmino49_e', x=-1100, y=-1200, size=40,shape=1,icon="t49", unlock={'techmino49_h','techmino99_e'}},
|
{name='techmino49_e', x=-1100, y=-1200, size=40,shape=1,icon="t49", unlock={'techmino49_h','techmino99_e'}},
|
||||||
{name='techmino49_h', x=-1100, y=-1400, size=40,shape=1,icon="t49", unlock={'techmino49_u'}},
|
{name='techmino49_h', x=-1100, y=-1400, size=40,shape=1,icon="t49", unlock={'techmino49_u'}},
|
||||||
{name='techmino49_u', x=-1100, y=-1600, size=40,shape=1,icon="t49"},
|
{name='techmino49_u', x=-1100, y=-1600, size=40,shape=1,icon="t49"},
|
||||||
{name='techmino99_e', x=-1300, y=-1400, size=40,shape=1,icon="t99", unlock={'techmino99_h'}},
|
{name='techmino99_e', x=-1300, y=-1400, size=40,shape=1,icon="t99", unlock={'techmino99_h'}},
|
||||||
{name='techmino99_h', x=-1300, y=-1600, size=40,shape=1,icon="t99", unlock={'techmino99_u'}},
|
{name='techmino99_h', x=-1300, y=-1600, size=40,shape=1,icon="t99", unlock={'techmino99_u'}},
|
||||||
{name='techmino99_u', x=-1300, y=-1800, size=40,shape=1,icon="t99"},
|
{name='techmino99_u', x=-1300, y=-1800, size=40,shape=1,icon="t99"},
|
||||||
|
|
||||||
{name='round_e', x=-600, y=-800, size=40,shape=1,icon="round", unlock={'round_n'}},
|
{name='round_e', x=-600, y=-800, size=40,shape=1,icon="round", unlock={'round_n'}},
|
||||||
{name='round_n', x=-800, y=-800, size=40,shape=1,icon="round", unlock={'round_h'}},
|
{name='round_n', x=-800, y=-800, size=40,shape=1,icon="round", unlock={'round_h'}},
|
||||||
{name='round_h', x=-1000, y=-800, size=40,shape=1,icon="round", unlock={'round_l'}},
|
{name='round_h', x=-1000, y=-800, size=40,shape=1,icon="round", unlock={'round_l'}},
|
||||||
{name='round_l', x=-1200, y=-800, size=40,shape=1,icon="round", unlock={'round_u'}},
|
{name='round_l', x=-1200, y=-800, size=40,shape=1,icon="round", unlock={'round_u'}},
|
||||||
{name='round_u', x=-1400, y=-800, size=40,shape=1,icon="round"},
|
{name='round_u', x=-1400, y=-800, size=40,shape=1,icon="round"},
|
||||||
|
|
||||||
{name='big_n', x=-400, y=-400, size=40,shape=1,icon="big", unlock={'big_h'}},
|
{name='big_n', x=-400, y=-400, size=40,shape=1,icon="big", unlock={'big_h'}},
|
||||||
{name='big_h', x=-600, y=-400, size=40,shape=1,icon="big",},
|
{name='big_h', x=-600, y=-400, size=40,shape=1,icon="big",},
|
||||||
|
|
||||||
{name='master_n', x=0, y=-1000, size=40,shape=1,icon="master", unlock={'master_h','strategy_h'}},
|
{name='master_n', x=0, y=-1000, size=40,shape=1,icon="master", unlock={'master_h','strategy_h'}},
|
||||||
{name='master_h', x=0, y=-1200, size=40,shape=3,icon="master", unlock={'master_final','master_ex','master_ph','master_m','master_g','strategy_u'}},
|
{name='master_h', x=0, y=-1200, size=40,shape=3,icon="master", unlock={'master_final','master_ex','master_ph','master_m','master_g','strategy_u'}},
|
||||||
{name='master_m', x=100, y=-1550, size=40,shape=2,icon="master"},
|
{name='master_m', x=100, y=-1550, size=40,shape=2,icon="master"},
|
||||||
{name='master_final', x=-100, y=-1550, size=40,shape=2,icon="master"},
|
{name='master_final', x=-100, y=-1550, size=40,shape=2,icon="master"},
|
||||||
{name='master_ph', x=-170, y=-1450, size=40,shape=2,icon="master"},
|
{name='master_ph', x=-170, y=-1450, size=40,shape=2,icon="master"},
|
||||||
{name='master_g', x=0, y=-1600, size=40,shape=3,icon="master"},
|
{name='master_g', x=0, y=-1600, size=40,shape=3,icon="master"},
|
||||||
{name='master_ex', x=170, y=-1450, size=40,shape=2,icon="master_ex"},
|
{name='master_ex', x=170, y=-1450, size=40,shape=2,icon="master_ex"},
|
||||||
|
|
||||||
{name='strategy_e', x=-150, y=-1020, size=40,shape=3,icon="master", unlock={'strategy_e_plus'}},
|
{name='strategy_e', x=-150, y=-1020, size=40,shape=3,icon="master", unlock={'strategy_e_plus'}},
|
||||||
{name='strategy_h', x=-150, y=-1150, size=35,shape=3,icon="master", unlock={'strategy_h_plus'}},
|
{name='strategy_h', x=-150, y=-1150, size=35,shape=3,icon="master", unlock={'strategy_h_plus'}},
|
||||||
{name='strategy_u', x=-150, y=-1280, size=30,shape=2,icon="master", unlock={'strategy_u_plus'}},
|
{name='strategy_u', x=-150, y=-1280, size=30,shape=2,icon="master", unlock={'strategy_u_plus'}},
|
||||||
{name='strategy_e_plus',x=-300, y=-1120, size=40,shape=3,icon="master"},
|
{name='strategy_e_plus', x=-300, y=-1120, size=40,shape=3,icon="master"},
|
||||||
{name='strategy_h_plus',x=-300, y=-1250, size=35,shape=3,icon="master"},
|
{name='strategy_h_plus', x=-300, y=-1250, size=35,shape=3,icon="master"},
|
||||||
{name='strategy_u_plus',x=-300, y=-1380, size=30,shape=2,icon="master"},
|
{name='strategy_u_plus', x=-300, y=-1380, size=30,shape=2,icon="master"},
|
||||||
|
|
||||||
{name='blind_e', x=150, y=-700, size=40,shape=1,icon="hidden", unlock={'blind_n','master_instinct'}},
|
{name='blind_e', x=150, y=-700, size=40,shape=1,icon="hidden", unlock={'blind_n','master_instinct'}},
|
||||||
{name='blind_n', x=150, y=-800, size=40,shape=1,icon="hidden", unlock={'blind_h'}},
|
{name='blind_n', x=150, y=-800, size=40,shape=1,icon="hidden", unlock={'blind_h'}},
|
||||||
{name='blind_h', x=150, y=-900, size=35,shape=1,icon="hidden", unlock={'blind_l'}},
|
{name='blind_h', x=150, y=-900, size=35,shape=1,icon="hidden", unlock={'blind_l'}},
|
||||||
{name='blind_l', x=150, y=-1000, size=35,shape=3,icon="hidden2", unlock={'blind_u'}},
|
{name='blind_l', x=150, y=-1000, size=35,shape=3,icon="hidden2", unlock={'blind_u'}},
|
||||||
{name='blind_u', x=150, y=-1100, size=30,shape=3,icon="hidden2", unlock={'blind_wtf'}},
|
{name='blind_u', x=150, y=-1100, size=30,shape=3,icon="hidden2", unlock={'blind_wtf'}},
|
||||||
{name='blind_wtf', x=150, y=-1200, size=25,shape=2,icon="hidden2"},
|
{name='blind_wtf', x=150, y=-1200, size=25,shape=2,icon="hidden2"},
|
||||||
{name='master_instinct',x=285, y=-835, size=40,shape=3,icon="hidden"},
|
{name='master_instinct', x=285, y=-835, size=40,shape=3,icon="hidden"},
|
||||||
|
|
||||||
{name='classic_e', x=-200, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
|
{name='classic_e', x=-200, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
|
||||||
{name='classic_h', x=-300, y=-950, size=40,shape=3,icon="classic", unlock={'classic_l'}},
|
{name='classic_h', x=-300, y=-950, size=40,shape=3,icon="classic", unlock={'classic_l'}},
|
||||||
{name='classic_l', x=-400, y=-1050, size=35,shape=3,icon="classic", unlock={'classic_u'}},
|
{name='classic_l', x=-400, y=-1050, size=35,shape=3,icon="classic", unlock={'classic_u'}},
|
||||||
{name='classic_u', x=-500, y=-1150, size=30,shape=2,icon="classic"},
|
{name='classic_u', x=-500, y=-1150, size=30,shape=2,icon="classic"},
|
||||||
|
|
||||||
{name='survivor_e', x=450, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_n'}},
|
{name='survivor_e', x=450, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_n'}},
|
||||||
{name='survivor_n', x=650, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_h','attacker_h','defender_n','dig_h'}},
|
{name='survivor_n', x=650, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_h','attacker_h','defender_n','dig_h'}},
|
||||||
{name='survivor_h', x=850, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_l'}},
|
{name='survivor_h', x=850, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_l'}},
|
||||||
{name='survivor_l', x=1050, y=-600, size=40,shape=3,icon="survivor", unlock={'survivor_u'}},
|
{name='survivor_l', x=1050, y=-600, size=40,shape=3,icon="survivor", unlock={'survivor_u'}},
|
||||||
{name='survivor_u', x=1250, y=-600, size=40,shape=2,icon="survivor"},
|
{name='survivor_u', x=1250, y=-600, size=40,shape=2,icon="survivor"},
|
||||||
|
|
||||||
{name='attacker_h', x=450, y=-800, size=40,shape=1,icon="attack", unlock={'attacker_u'}},
|
{name='attacker_h', x=450, y=-800, size=40,shape=1,icon="attack", unlock={'attacker_u'}},
|
||||||
{name='attacker_u', x=450, y=-1000, size=40,shape=1,icon="attack"},
|
{name='attacker_u', x=450, y=-1000, size=40,shape=1,icon="attack"},
|
||||||
|
|
||||||
{name='defender_n', x=650, y=-800, size=40,shape=1,icon="defend", unlock={'defender_l'}},
|
{name='defender_n', x=650, y=-800, size=40,shape=1,icon="defend", unlock={'defender_l'}},
|
||||||
{name='defender_l', x=650, y=-1000, size=40,shape=1,icon="defend"},
|
{name='defender_l', x=650, y=-1000, size=40,shape=1,icon="defend"},
|
||||||
|
|
||||||
{name='dig_h', x=850, y=-800, size=40,shape=1,icon="dig", unlock={'dig_u'}},
|
{name='dig_h', x=850, y=-800, size=40,shape=1,icon="dig", unlock={'dig_u'}},
|
||||||
{name='dig_u', x=850, y=-1000, size=40,shape=1,icon="dig"},
|
{name='dig_u', x=850, y=-1000, size=40,shape=1,icon="dig"},
|
||||||
|
|
||||||
{name='c4wtrain_n', x=700, y=-450, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
|
{name='c4wtrain_n', x=700, y=-450, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
|
||||||
{name='c4wtrain_l', x=900, y=-450, size=40,shape=1,icon="pc"},
|
{name='c4wtrain_l', x=900, y=-450, size=40,shape=1,icon="pc"},
|
||||||
|
|
||||||
{name='pctrain_n', x=700, y=-300, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
|
{name='pctrain_n', x=700, y=-300, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
|
||||||
{name='pctrain_l', x=900, y=-300, size=40,shape=1,icon="pc"},
|
{name='pctrain_l', x=900, y=-300, size=40,shape=1,icon="pc"},
|
||||||
|
|
||||||
{name='pc_n', x=800, y=-140, size=40,shape=1,icon="pc", unlock={'pc_h'}},
|
{name='pc_n', x=800, y=-140, size=40,shape=1,icon="pc", unlock={'pc_h'}},
|
||||||
{name='pc_h', x=950, y=-140, size=40,shape=3,icon="pc", unlock={'pc_l','pc_inf'}},
|
{name='pc_h', x=950, y=-140, size=40,shape=3,icon="pc", unlock={'pc_l','pc_inf'}},
|
||||||
{name='pc_l', x=1100, y=-140, size=40,shape=3,icon="pc"},
|
{name='pc_l', x=1100, y=-140, size=40,shape=3,icon="pc"},
|
||||||
{name='pc_inf', x=1100, y=-280, size=40,shape=2,icon="pc"},
|
{name='pc_inf', x=1100, y=-280, size=40,shape=2,icon="pc"},
|
||||||
|
|
||||||
{name='sprintAtk', x=500, y=-280, size=40,shape=1,icon="sprint2", unlock={'sprintEff','tech_n','tech_finesse','tsd_e','backfire_n'}},
|
{name='sprintAtk', x=500, y=-280, size=40,shape=1,icon="sprint2", unlock={'sprintEff','tech_n','tech_finesse','tech_finesse_lock','tsd_e','backfire_n'}},
|
||||||
|
{name='sprintEff', x=360, y=-150, size=40,shape=1,icon="sprint2"},
|
||||||
|
|
||||||
{name='sprintEff', x=360, y=-150, size=40,shape=1,icon="sprint2"},
|
{name='tech_n', x=400, y=20, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h'}},
|
||||||
|
{name='tech_n_plus', x=200, y=-10, size=40,shape=3,icon="tech"},
|
||||||
|
{name='tech_h', x=400, y=170, size=40,shape=1,icon="tech", unlock={'tech_h_plus','tech_l'}},
|
||||||
|
{name='tech_h_plus', x=200, y=140, size=35,shape=3,icon="tech"},
|
||||||
|
{name='tech_l', x=400, y=320, size=40,shape=1,icon="tech", unlock={'tech_l_plus'}},
|
||||||
|
{name='tech_l_plus', x=200, y=290, size=35,shape=3,icon="tech"},
|
||||||
|
|
||||||
{name='tech_n', x=400, y=20, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h'}},
|
{name='tech_finesse', x=850, y=20, size=40,shape=1,icon="tech", unlock={'tech_finesse_f'}},
|
||||||
{name='tech_n_plus', x=200, y=-10, size=40,shape=3,icon="tech"},
|
{name='tech_finesse_f', x=1050, y=20, size=40,shape=1,icon="tech"},
|
||||||
{name='tech_h', x=400, y=170, size=40,shape=1,icon="tech", unlock={'tech_h_plus','tech_l'}},
|
|
||||||
{name='tech_h_plus', x=200, y=140, size=35,shape=3,icon="tech"},
|
|
||||||
{name='tech_l', x=400, y=320, size=40,shape=1,icon="tech", unlock={'tech_l_plus'}},
|
|
||||||
{name='tech_l_plus', x=200, y=290, size=35,shape=3,icon="tech"},
|
|
||||||
|
|
||||||
{name='tech_finesse', x=800, y=20, size=40,shape=1,icon="tech", unlock={'tech_finesse_f'}},
|
{name='tech_finesse_lock', x=850, y=160, size=40,shape=1,icon="tech", unlock={'tech_finesse_lock_f'}},
|
||||||
{name='tech_finesse_f',x=1000, y=20, size=40,shape=1,icon="tech"},
|
{name='tech_finesse_lock_f', x=1050, y=170, size=40,shape=1,icon="tech"},
|
||||||
|
|
||||||
{name='tsd_e', x=720, y=170, size=40,shape=1,icon="tsd", unlock={'tsd_h'}},
|
{name='tsd_e', x=700, y=250, size=40,shape=1,icon="tsd", unlock={'tsd_h'}},
|
||||||
{name='tsd_h', x=960, y=170, size=40,shape=1,icon="tsd", unlock={'tsd_u'}},
|
{name='tsd_h', x=860, y=310, size=40,shape=1,icon="tsd", unlock={'tsd_u'}},
|
||||||
{name='tsd_u', x=1200, y=170, size=40,shape=1,icon="tsd"},
|
{name='tsd_u', x=1050, y=320, size=40,shape=1,icon="tsd"},
|
||||||
|
|
||||||
{name='backfire_n', x=650, y=320, size=40,shape=1,icon="backfire", unlock={'backfire_h'}},
|
{name='backfire_n', x=640, y=420, size=40,shape=1,icon="backfire", unlock={'backfire_h'}},
|
||||||
{name='backfire_h', x=850, y=320, size=40,shape=1,icon="backfire", unlock={'backfire_l'}},
|
{name='backfire_h', x=790, y=470, size=40,shape=1,icon="backfire", unlock={'backfire_l'}},
|
||||||
{name='backfire_l', x=1050, y=320, size=40,shape=3,icon="backfire", unlock={'backfire_u'}},
|
{name='backfire_l', x=930, y=460, size=40,shape=3,icon="backfire", unlock={'backfire_u'}},
|
||||||
{name='backfire_u', x=1250, y=320, size=35,shape=2,icon="backfire"},
|
{name='backfire_u', x=1070, y=450, size=35,shape=2,icon="backfire"},
|
||||||
|
|
||||||
{name='zen', x=-1000, y=-600, size=40,shape=1,icon="zen", unlock={'ultra','infinite','infinite_dig','marathon_inf'}},
|
{name='zen', x=-1000, y=-600, size=40,shape=1,icon="zen", unlock={'ultra','infinite','infinite_dig','marathon_inf'}},
|
||||||
{name='ultra', x=-1200, y=-600, size=40,shape=1,icon="ultra"},
|
{name='ultra', x=-1200, y=-600, size=40,shape=1,icon="ultra"},
|
||||||
{name='infinite', x=-1200, y=-400, size=40,shape=1,icon='infinite'},
|
{name='infinite', x=-1200, y=-400, size=40,shape=1,icon='infinite'},
|
||||||
{name='infinite_dig', x=-1000, y=-400, size=40,shape=1,icon="dig"},
|
{name='infinite_dig', x=-1000, y=-400, size=40,shape=1,icon="dig"},
|
||||||
{name='marathon_inf', x=-800, y=-400, size=40,shape=1,icon="marathon"}
|
{name='marathon_inf', x=-800, y=-400, size=40,shape=1,icon="marathon"}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,13 @@ local function tech_check_hard(P)
|
|||||||
P:win('finish')
|
P:win('finish')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
local function display(P)
|
||||||
|
setFont(45)
|
||||||
|
GC.mStr(("%d"):format(P.stat.atk),63,190)
|
||||||
|
GC.mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310)
|
||||||
|
mText(TEXTOBJ.atk,63,243)
|
||||||
|
mText(TEXTOBJ.eff,63,363)
|
||||||
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
env={
|
env={
|
||||||
@@ -17,6 +24,7 @@ return {
|
|||||||
drop=1e99,lock=60,
|
drop=1e99,lock=60,
|
||||||
freshLimit=15,
|
freshLimit=15,
|
||||||
fineKill=true,
|
fineKill=true,
|
||||||
|
mesDisp=display,
|
||||||
hook_drop=tech_check_hard,
|
hook_drop=tech_check_hard,
|
||||||
bg='flink',bgm='infinite',
|
bg='flink',bgm='infinite',
|
||||||
},
|
},
|
||||||
|
|||||||
28
parts/modes/tech_finesse_lock.lua
Normal file
28
parts/modes/tech_finesse_lock.lua
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
return {
|
||||||
|
env={
|
||||||
|
arr=0,
|
||||||
|
drop=1e99,lock=60,
|
||||||
|
freshLimit=15,
|
||||||
|
bg='flink',bgm='infinite',
|
||||||
|
eventSet='tech_finesse_lock'
|
||||||
|
},
|
||||||
|
slowMark=true,
|
||||||
|
score=function(P) return {P.stat.atk<=100 and math.floor(P.stat.atk) or 100,P.stat.time} end,
|
||||||
|
scoreDisp=function(D) return D[1].." Attack "..STRING.time(D[2]) end,
|
||||||
|
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||||
|
getRank=function(P)
|
||||||
|
local A=P.stat.atk
|
||||||
|
if A>=100 then
|
||||||
|
local T=P.stat.time
|
||||||
|
return
|
||||||
|
T<50 and 5 or
|
||||||
|
T<70 and 4 or
|
||||||
|
T<100 and 3 or
|
||||||
|
2
|
||||||
|
else
|
||||||
|
return
|
||||||
|
A>=60 and 1 or
|
||||||
|
A>=30 and 0
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
}
|
||||||
29
parts/modes/tech_finesse_lock_f.lua
Normal file
29
parts/modes/tech_finesse_lock_f.lua
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
return {
|
||||||
|
env={
|
||||||
|
arr=0,
|
||||||
|
drop=1e99,lock=60,
|
||||||
|
b2bKill=true,
|
||||||
|
freshLimit=15,
|
||||||
|
bg='flink',bgm='infinite',
|
||||||
|
eventSet='tech_finesse_lock',
|
||||||
|
},
|
||||||
|
slowMark=true,
|
||||||
|
score=function(P) return {P.stat.atk<=100 and math.floor(P.stat.atk) or 100,P.stat.time} end,
|
||||||
|
scoreDisp=function(D) return D[1].." Attack "..STRING.time(D[2]) end,
|
||||||
|
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||||
|
getRank=function(P)
|
||||||
|
local A=P.stat.atk
|
||||||
|
if A>=100 then
|
||||||
|
local T=P.stat.time
|
||||||
|
return
|
||||||
|
T<50 and 5 or
|
||||||
|
T<70 and 4 or
|
||||||
|
T<100 and 3 or
|
||||||
|
2
|
||||||
|
else
|
||||||
|
return
|
||||||
|
A>=60 and 1 or
|
||||||
|
A>=30 and 0
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -242,14 +242,28 @@ local function _mergeFuncTable(f,L)
|
|||||||
end
|
end
|
||||||
return L
|
return L
|
||||||
end
|
end
|
||||||
|
local hooks = {
|
||||||
|
'mesDisp',
|
||||||
|
'hook_left',
|
||||||
|
'hook_left_manual',
|
||||||
|
'hook_left_auto',
|
||||||
|
'hook_right',
|
||||||
|
'hook_right_manual',
|
||||||
|
'hook_right_auto',
|
||||||
|
'hook_rotLeft',
|
||||||
|
'hook_rotRight',
|
||||||
|
'hook_rot180',
|
||||||
|
'hook_drop',
|
||||||
|
'hook_die',
|
||||||
|
'task'
|
||||||
|
}
|
||||||
local function _applyGameEnv(P)-- Finish gameEnv processing
|
local function _applyGameEnv(P)-- Finish gameEnv processing
|
||||||
local ENV=P.gameEnv
|
local ENV=P.gameEnv
|
||||||
|
|
||||||
-- Apply events
|
-- Apply events
|
||||||
ENV.mesDisp=_mergeFuncTable(ENV.mesDisp,{})
|
for i=1,#hooks do
|
||||||
ENV.hook_drop=_mergeFuncTable(ENV.hook_drop,{})
|
ENV[hooks[i]]=_mergeFuncTable(ENV[hooks[i]],{})
|
||||||
ENV.hook_die=_mergeFuncTable(ENV.hook_die,{})
|
end
|
||||||
ENV.task=_mergeFuncTable(ENV.task,{})
|
|
||||||
|
|
||||||
-- Apply eventSet
|
-- Apply eventSet
|
||||||
if ENV.eventSet and ENV.eventSet~="X" then
|
if ENV.eventSet and ENV.eventSet~="X" then
|
||||||
@@ -257,12 +271,7 @@ local function _applyGameEnv(P)-- Finish gameEnv processing
|
|||||||
local eventSet=require('parts.eventsets.'..ENV.eventSet)
|
local eventSet=require('parts.eventsets.'..ENV.eventSet)
|
||||||
if eventSet then
|
if eventSet then
|
||||||
for k,v in next,eventSet do
|
for k,v in next,eventSet do
|
||||||
if
|
if TABLE.find(hooks,k) then
|
||||||
k=='mesDisp' or
|
|
||||||
k=='hook_drop' or
|
|
||||||
k=='hook_die' or
|
|
||||||
k=='task'
|
|
||||||
then
|
|
||||||
_mergeFuncTable(v,ENV[k])
|
_mergeFuncTable(v,ENV[k])
|
||||||
elseif type(v)=='table' then
|
elseif type(v)=='table' then
|
||||||
ENV[k]=TABLE.copy(v)
|
ENV[k]=TABLE.copy(v)
|
||||||
|
|||||||
@@ -226,8 +226,10 @@ function Player:act_moveLeft(auto)
|
|||||||
end
|
end
|
||||||
if self.cur then
|
if self.cur then
|
||||||
if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY) then
|
if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY) then
|
||||||
|
self:_triggerEvent('hook_left')
|
||||||
|
self:_triggerEvent('hook_left_'..(auto and 'auto' or 'manual'))
|
||||||
self:createMoveFX('left')
|
self:createMoveFX('left')
|
||||||
self.curX=self.curX-1
|
self.curX=self.curX+self.movDir
|
||||||
self:freshBlock('move')
|
self:freshBlock('move')
|
||||||
if not auto then
|
if not auto then
|
||||||
self.moving=0
|
self.moving=0
|
||||||
@@ -248,8 +250,10 @@ function Player:act_moveRight(auto)
|
|||||||
end
|
end
|
||||||
if self.cur then
|
if self.cur then
|
||||||
if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY) then
|
if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY) then
|
||||||
|
self:_triggerEvent('hook_right')
|
||||||
|
self:_triggerEvent('hook_right_'..(auto and 'auto' or 'manual'))
|
||||||
self:createMoveFX('right')
|
self:createMoveFX('right')
|
||||||
self.curX=self.curX+1
|
self.curX=self.curX+self.movDir
|
||||||
self:freshBlock('move')
|
self:freshBlock('move')
|
||||||
if not auto then
|
if not auto then
|
||||||
self.moving=0
|
self.moving=0
|
||||||
@@ -267,6 +271,7 @@ function Player:act_rotRight()
|
|||||||
if self.cur then
|
if self.cur then
|
||||||
self.ctrlCount=self.ctrlCount+1
|
self.ctrlCount=self.ctrlCount+1
|
||||||
self:spin(1)
|
self:spin(1)
|
||||||
|
self:_triggerEvent('hook_rotRight')
|
||||||
self.keyPressing[3]=false
|
self.keyPressing[3]=false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -275,6 +280,7 @@ function Player:act_rotLeft()
|
|||||||
if self.cur then
|
if self.cur then
|
||||||
self.ctrlCount=self.ctrlCount+1
|
self.ctrlCount=self.ctrlCount+1
|
||||||
self:spin(3)
|
self:spin(3)
|
||||||
|
self:_triggerEvent('hook_rotLeft')
|
||||||
self.keyPressing[4]=false
|
self.keyPressing[4]=false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -283,6 +289,7 @@ function Player:act_rot180()
|
|||||||
if self.cur then
|
if self.cur then
|
||||||
self.ctrlCount=self.ctrlCount+2
|
self.ctrlCount=self.ctrlCount+2
|
||||||
self:spin(2)
|
self:spin(2)
|
||||||
|
self:_triggerEvent('hook_rot180')
|
||||||
self.keyPressing[5]=false
|
self.keyPressing[5]=false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -12,72 +12,220 @@ local keys={
|
|||||||
local lastPlayBGM
|
local lastPlayBGM
|
||||||
local inst
|
local inst
|
||||||
local offset
|
local offset
|
||||||
|
local tempoffset=0
|
||||||
local showingKey
|
local showingKey
|
||||||
local sharpt,flattt=false,false
|
local sharpt,flattt=false,false
|
||||||
|
local virtualKeys={} -- Virtual key set is near the end of the file.
|
||||||
|
local touchPosition={}
|
||||||
|
|
||||||
-- PREPARE VIRTUAL KEYS
|
local scene={}
|
||||||
-- PREPARE VIRTUAL KEYS
|
|
||||||
-- NOTE: I made this list because I want to use WIDGET.draw() and don't need another function
|
-- Set all virtual key's text
|
||||||
-- I will handling the behavior in an other function
|
local function _setNoteName(offset)
|
||||||
local virtualKeys={
|
for k=1,#virtualKeys do
|
||||||
|
local K=virtualKeys[k]
|
||||||
|
local keyName=string.sub(K.name:lower(),4)
|
||||||
|
if keys[keyName] then K:setObject(SFX.getNoteName(keys[keyName]+offset)) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Show virtual key
|
||||||
|
local function _showVirtualKey(switch)
|
||||||
|
if switch~=nil then showingKey=switch else showingKey=not showingKey end
|
||||||
|
for k=1,#virtualKeys do
|
||||||
|
virtualKeys[k].hide=not showingKey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _notHoldCS()
|
||||||
|
tempoffset=0
|
||||||
|
_setNoteName(offset)
|
||||||
|
flattt,sharpt=false,false
|
||||||
|
virtualKeys['keyCtrl'].color,virtualKeys['keyShift'].color=COLOR.Z,COLOR.Z
|
||||||
|
end
|
||||||
|
local function _holdingCtrl()
|
||||||
|
_notHoldCS()
|
||||||
|
virtualKeys['keyCtrl'].color=COLOR.R
|
||||||
|
tempoffset=-1
|
||||||
|
_setNoteName(offset-1)
|
||||||
|
end
|
||||||
|
local function _holdingShift()
|
||||||
|
_notHoldCS()
|
||||||
|
virtualKeys['keyShift'].color=COLOR.R
|
||||||
|
tempoffset=1
|
||||||
|
_setNoteName(offset+1)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Set scene's variables
|
||||||
|
function scene.enter()
|
||||||
|
inst='lead'
|
||||||
|
offset=0
|
||||||
|
lastPlayBGM=BGM.getPlaying()[1]
|
||||||
|
BGM.stop()
|
||||||
|
_notHoldCS()
|
||||||
|
_showVirtualKey(MOBILE and true or false)
|
||||||
|
end
|
||||||
|
|
||||||
|
function scene.mouseDown(x,y,_)
|
||||||
|
-- Behavior for mouse is different than a bit
|
||||||
|
-- Detail: Ctrl/Shift state will be reset after a note is clicked!
|
||||||
|
local lastK
|
||||||
|
if showingKey then
|
||||||
|
for k,K in pairs(virtualKeys) do
|
||||||
|
if K:isAbove(x,y) then K.code(); K:update(1); lastK=string.sub(K.name:lower(),4) end
|
||||||
|
end
|
||||||
|
-- Check if there is a key other than Ctrl/Shift is hold
|
||||||
|
-- if yes then automatically swap Ctrl/Shift state
|
||||||
|
if keys[lastK] then _notHoldCS() end
|
||||||
|
-- Change Shift/Ctrl key's color when shift note temproraily
|
||||||
|
if flattt or sharpt then
|
||||||
|
if flattt then _holdingCtrl() else _holdingShift() end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function scene.multipleTouch() -- Check for every touch keys
|
||||||
|
_notHoldCS()
|
||||||
|
for _,pos in pairs(touchPosition) do
|
||||||
|
local x,y=pos[1],pos[2]
|
||||||
|
for i,currentKey in pairs(virtualKeys) do
|
||||||
|
if not (currentKey.name=="keyCtrl" or currentKey.name=="keyShift") then
|
||||||
|
if currentKey:isAbove(x,y) then currentKey:code(); currentKey:update(1) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if virtualKeys.keyCtrl :isAbove(x,y) then _holdingCtrl()
|
||||||
|
elseif virtualKeys.keyShift:isAbove(x,y) then _holdingShift() end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function scene.touchDown(x,y)
|
||||||
|
table.insert(touchPosition,{x,y})
|
||||||
|
scene.multipleTouch()
|
||||||
|
end
|
||||||
|
function scene.touchUp(x,y)
|
||||||
|
table.remove(touchPosition,TABLE.find(touchPosition,{x,y}))
|
||||||
|
scene.multipleTouch()
|
||||||
|
end
|
||||||
|
|
||||||
|
function scene.keyDown(key,isRep)
|
||||||
|
if not isRep and keys[key] then
|
||||||
|
local note=keys[key]+offset+tempoffset
|
||||||
|
SFX.playSample(inst,note)
|
||||||
|
if showingKey then
|
||||||
|
virtualKeys['key'..key:upper()]:update(1)
|
||||||
|
TEXT.show(SFX.getNoteName(note),math.random(75,1205),math.random(162,260),60,'score',.8)
|
||||||
|
else
|
||||||
|
TEXT.show(SFX.getNoteName(note),math.random(75,1205),math.random(162,620),60,'score',.8)
|
||||||
|
end
|
||||||
|
elseif kb.isDown('lctrl','rctrl') and not isRep then _holdingCtrl()
|
||||||
|
elseif kb.isDown('lshift','rshift') and not isRep then _holdingShift()
|
||||||
|
elseif key=='tab' then
|
||||||
|
inst=TABLE.next(instList,inst)
|
||||||
|
elseif key=='lalt' then
|
||||||
|
offset=math.max(offset-1,-12)
|
||||||
|
if showingKey then _setNoteName(offset) end
|
||||||
|
elseif key=='ralt' then
|
||||||
|
offset=math.min(offset+1,12)
|
||||||
|
if showingKey then _setNoteName(offset) end
|
||||||
|
elseif key=='f5' then _showVirtualKey(not showingKey)
|
||||||
|
elseif key=='escape' then
|
||||||
|
BGM.play(lastPlayBGM)
|
||||||
|
SCN.back()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function scene.keyUp()
|
||||||
|
if not kb.isDown('lctrl','rctrl','lshift','rshift') then _notHoldCS() end
|
||||||
|
end
|
||||||
|
|
||||||
|
function scene.draw()
|
||||||
|
setFont(30)
|
||||||
|
GC.setColor(1,1,1)
|
||||||
|
gc.print(inst.." | "..offset,30,40)
|
||||||
|
|
||||||
|
-- Drawing virtual keys
|
||||||
|
if showingKey then
|
||||||
|
for i,currentKey in pairs(virtualKeys) do
|
||||||
|
currentKey:draw()
|
||||||
|
end
|
||||||
|
gc.setLineWidth(1)
|
||||||
|
gc.setColor(COLOR.Z)
|
||||||
|
gc.line(685.5,297,685.5,642)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function scene.update()
|
||||||
|
for i,currentKey in pairs(virtualKeys) do
|
||||||
|
currentKey:update()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
scene.widgetList={
|
||||||
|
WIDGET.newButton{name='back' ,x=1150,y=60,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=pressKey'escape'},
|
||||||
|
WIDGET.newSwitch{name='showKey' ,x=970 ,y=60,fText='Virtual key (F5)',disp=function() return showingKey end,code=pressKey'f5'},
|
||||||
|
WIDGET.newKey {name='changeIns' ,x=305 ,y=60,w=280,h=60,fText='Change instrument',code=pressKey"tab" ,hideF=function() return not showingKey end},
|
||||||
|
WIDGET.newKey {name='offset-' ,x=485 ,y=60,w=60 ,h=60,fText=CHAR.key.left ,code=pressKey"lalt",hideF=function() return not showingKey end},
|
||||||
|
WIDGET.newKey {name='offset+' ,x=555 ,y=60,w=60 ,h=60,fText=CHAR.key.right ,code=pressKey"ralt",hideF=function() return not showingKey end},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Set virtual keys (seperate from ZFramework)
|
||||||
|
virtualKeys={
|
||||||
-- Number row: 01234567890-= 13
|
-- Number row: 01234567890-= 13
|
||||||
WIDGET.newKey {name='key1' ,x= 75,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'1' },
|
WIDGET.newKey {name='key1' ,x= 75,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('1' ) end},
|
||||||
WIDGET.newKey {name='key2' ,x= 165,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'2' },
|
WIDGET.newKey {name='key2' ,x= 165,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('2' ) end},
|
||||||
WIDGET.newKey {name='key3' ,x= 255,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'3' },
|
WIDGET.newKey {name='key3' ,x= 255,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('3' ) end},
|
||||||
WIDGET.newKey {name='key4' ,x= 345,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'4' },
|
WIDGET.newKey {name='key4' ,x= 345,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('4' ) end},
|
||||||
WIDGET.newKey {name='key5' ,x= 435,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'5' },
|
WIDGET.newKey {name='key5' ,x= 435,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('5' ) end},
|
||||||
WIDGET.newKey {name='key6' ,x= 525,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'6' },
|
WIDGET.newKey {name='key6' ,x= 525,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('6' ) end},
|
||||||
WIDGET.newKey {name='key7' ,x= 615,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'7' },
|
WIDGET.newKey {name='key7' ,x= 615,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('7' ) end},
|
||||||
WIDGET.newKey {name='key8' ,x= 755,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'8' },
|
WIDGET.newKey {name='key8' ,x= 755,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('8' ) end},
|
||||||
WIDGET.newKey {name='key9' ,x= 845,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'9' },
|
WIDGET.newKey {name='key9' ,x= 845,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('9' ) end},
|
||||||
WIDGET.newKey {name='key0' ,x= 935,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'0' },
|
WIDGET.newKey {name='key0' ,x= 935,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('0' ) end},
|
||||||
WIDGET.newKey {name='key-' ,x=1025,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'-' },
|
WIDGET.newKey {name='key-' ,x=1025,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('-' ) end},
|
||||||
WIDGET.newKey {name='key=' ,x=1115,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'=' },
|
WIDGET.newKey {name='key=' ,x=1115,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('=' ) end},
|
||||||
WIDGET.newKey {name='keyBACKSPACE',x=1205,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'backspace'},
|
WIDGET.newKey {name='keyBACKSPACE',x=1205,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('backspace') end},
|
||||||
|
|
||||||
-- Top row: QWERTYUIOP[]\ 13
|
-- Top row: QWERTYUIOP[]\ 13
|
||||||
WIDGET.newKey {name='keyQ' ,x= 75,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'q' },
|
WIDGET.newKey {name='keyQ' ,x= 75,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('q' ) end},
|
||||||
WIDGET.newKey {name='keyW' ,x= 165,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'w' },
|
WIDGET.newKey {name='keyW' ,x= 165,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('w' ) end},
|
||||||
WIDGET.newKey {name='keyE' ,x= 255,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'e' },
|
WIDGET.newKey {name='keyE' ,x= 255,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('e' ) end},
|
||||||
WIDGET.newKey {name='keyR' ,x= 345,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'r' },
|
WIDGET.newKey {name='keyR' ,x= 345,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('r' ) end},
|
||||||
WIDGET.newKey {name='keyT' ,x= 435,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey't' },
|
WIDGET.newKey {name='keyT' ,x= 435,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('t' ) end},
|
||||||
WIDGET.newKey {name='keyY' ,x= 525,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'y' },
|
WIDGET.newKey {name='keyY' ,x= 525,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('y' ) end},
|
||||||
WIDGET.newKey {name='keyU' ,x= 615,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'u' },
|
WIDGET.newKey {name='keyU' ,x= 615,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('u' ) end},
|
||||||
WIDGET.newKey {name='keyI' ,x= 755,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'i' },
|
WIDGET.newKey {name='keyI' ,x= 755,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('i' ) end},
|
||||||
WIDGET.newKey {name='keyO' ,x= 845,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'o' },
|
WIDGET.newKey {name='keyO' ,x= 845,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('o' ) end},
|
||||||
WIDGET.newKey {name='keyP' ,x= 935,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'p' },
|
WIDGET.newKey {name='keyP' ,x= 935,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('p' ) end},
|
||||||
WIDGET.newKey {name='key[' ,x=1025,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'[' },
|
WIDGET.newKey {name='key[' ,x=1025,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('[' ) end},
|
||||||
WIDGET.newKey {name='key]' ,x=1115,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey']' },
|
WIDGET.newKey {name='key]' ,x=1115,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown(']' ) end},
|
||||||
WIDGET.newKey {name='key\\' ,x=1205,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'\\'},
|
WIDGET.newKey {name='key\\' ,x=1205,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('\\') end},
|
||||||
|
|
||||||
-- Home row ASDFGHJKL;''<ENTER> 12
|
-- Home row ASDFGHJKL;''<ENTER> 12
|
||||||
WIDGET.newKey {name='keyA' ,x= 75,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='R',code=pressKey'a' },
|
WIDGET.newKey {name='keyA' ,x= 75,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='R',code=function() scene.keyDown('a' ) end},
|
||||||
WIDGET.newKey {name='keyS' ,x= 165,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='W',code=pressKey's' },
|
WIDGET.newKey {name='keyS' ,x= 165,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='W',code=function() scene.keyDown('s' ) end},
|
||||||
WIDGET.newKey {name='keyD' ,x= 255,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='P',code=pressKey'd' },
|
WIDGET.newKey {name='keyD' ,x= 255,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='P',code=function() scene.keyDown('d' ) end},
|
||||||
WIDGET.newKey {name='keyF' ,x= 345,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='N',code=pressKey'f' },
|
WIDGET.newKey {name='keyF' ,x= 345,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='N',code=function() scene.keyDown('f' ) end},
|
||||||
WIDGET.newKey {name='keyG' ,x= 435,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'g' },
|
WIDGET.newKey {name='keyG' ,x= 435,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('g' ) end},
|
||||||
WIDGET.newKey {name='keyH' ,x= 525,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'h' },
|
WIDGET.newKey {name='keyH' ,x= 525,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('h' ) end},
|
||||||
WIDGET.newKey {name='keyJ' ,x= 615,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='O',code=pressKey'j' },
|
WIDGET.newKey {name='keyJ' ,x= 615,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='O',code=function() scene.keyDown('j' ) end},
|
||||||
WIDGET.newKey {name='keyK' ,x= 755,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='L',code=pressKey'k' },
|
WIDGET.newKey {name='keyK' ,x= 755,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='L',code=function() scene.keyDown('k' ) end},
|
||||||
WIDGET.newKey {name='keyL' ,x= 845,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='G',code=pressKey'l' },
|
WIDGET.newKey {name='keyL' ,x= 845,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='G',code=function() scene.keyDown('l' ) end},
|
||||||
WIDGET.newKey {name='key;' ,x= 935,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='C',code=pressKey';' },
|
WIDGET.newKey {name='key;' ,x= 935,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='C',code=function() scene.keyDown(';' ) end},
|
||||||
WIDGET.newKey {name='key\'' ,x=1025,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'\'' },
|
WIDGET.newKey {name='key\'' ,x=1025,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('\'' ) end},
|
||||||
WIDGET.newKey {name='keyRETURN' ,x=1115,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'return'},
|
WIDGET.newKey {name='keyRETURN' ,x=1115,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('return') end},
|
||||||
|
|
||||||
-- Bottom row ZXCVBNM,./ 10
|
-- Bottom row ZXCVBNM,./ 10
|
||||||
WIDGET.newKey {name='keyZ' ,x= 75,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'z'},
|
WIDGET.newKey {name='keyZ' ,x= 75,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('z') end},
|
||||||
WIDGET.newKey {name='keyX' ,x= 165,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'x'},
|
WIDGET.newKey {name='keyX' ,x= 165,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('x') end},
|
||||||
WIDGET.newKey {name='keyC' ,x= 255,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'c'},
|
WIDGET.newKey {name='keyC' ,x= 255,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('c') end},
|
||||||
WIDGET.newKey {name='keyV' ,x= 345,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'v'},
|
WIDGET.newKey {name='keyV' ,x= 345,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('v') end},
|
||||||
WIDGET.newKey {name='keyB' ,x= 435,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'b'},
|
WIDGET.newKey {name='keyB' ,x= 435,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('b') end},
|
||||||
WIDGET.newKey {name='keyN' ,x= 525,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'n'},
|
WIDGET.newKey {name='keyN' ,x= 525,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('n') end},
|
||||||
WIDGET.newKey {name='keyM' ,x= 615,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'm'},
|
WIDGET.newKey {name='keyM' ,x= 615,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('m') end},
|
||||||
WIDGET.newKey {name='key,' ,x= 755,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey','},
|
WIDGET.newKey {name='key,' ,x= 755,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown(',') end},
|
||||||
WIDGET.newKey {name='key.' ,x= 845,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'.'},
|
WIDGET.newKey {name='key.' ,x= 845,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('.') end},
|
||||||
WIDGET.newKey {name='key/' ,x= 935,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'/'},
|
WIDGET.newKey {name='key/' ,x= 935,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() scene.keyDown('/') end},
|
||||||
|
|
||||||
WIDGET.newKey {name='keyCtrl' ,x=1115,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() flattt=not flattt;sharpt=false end},
|
WIDGET.newKey {name='keyCtrl' ,x=1115,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() if not flattt then _holdingCtrl() else _notHoldCS() end end},
|
||||||
WIDGET.newKey {name='keyShift' ,x=1205,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() sharpt=not sharpt;flattt=false end},
|
WIDGET.newKey {name='keyShift' ,x=1205,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=function() if not sharpt then _holdingShift() else _notHoldCS() end end},
|
||||||
}
|
}
|
||||||
setmetatable(virtualKeys,{__index=function(L,k) for i=1,#L do if L[i].name==k then return L[i] end end end})
|
setmetatable(virtualKeys,{__index=function(L,k) for i=1,#L do if L[i].name==k then return L[i] end end end})
|
||||||
|
|
||||||
@@ -115,127 +263,4 @@ for k=1,#virtualKeys do
|
|||||||
function K:drag() end
|
function K:drag() end
|
||||||
function K:release() end
|
function K:release() end
|
||||||
end
|
end
|
||||||
--/ PREPARE VIRTUAL KEYS
|
|
||||||
--/ PREPARE VIRTUAL KEYS
|
|
||||||
|
|
||||||
local scene={}
|
|
||||||
|
|
||||||
-- Set all virtual key's text
|
|
||||||
local function _setNoteName(offset)
|
|
||||||
for k=1,#virtualKeys do
|
|
||||||
local K=virtualKeys[k]
|
|
||||||
local keyName=string.sub(K.name:lower(),4)
|
|
||||||
if keys[keyName] then K:setObject(SFX.getNoteName(keys[keyName]+offset)) end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- Show virtual key
|
|
||||||
local function _showVirtualKey(switch)
|
|
||||||
if switch~=nil then showingKey=switch else showingKey=not showingKey end
|
|
||||||
for k=1,#virtualKeys do
|
|
||||||
virtualKeys[k].hide=not showingKey
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function _notHoldCS(a)
|
|
||||||
flattt,sharpt=false,false
|
|
||||||
virtualKeys['keyCtrl'].color,virtualKeys['keyShift'].color=COLOR.Z,COLOR.Z
|
|
||||||
if not a then _setNoteName(offset) end
|
|
||||||
end
|
|
||||||
local function _holdingCtrl()
|
|
||||||
_notHoldCS(1)
|
|
||||||
virtualKeys['keyCtrl'].color=COLOR.R
|
|
||||||
_setNoteName(offset-1)
|
|
||||||
end
|
|
||||||
local function _holdingShift()
|
|
||||||
_notHoldCS(1)
|
|
||||||
virtualKeys['keyShift'].color=COLOR.R
|
|
||||||
_setNoteName(offset+1)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Set scene's variables
|
|
||||||
function scene.enter()
|
|
||||||
inst='lead'
|
|
||||||
offset=0
|
|
||||||
lastPlayBGM=BGM.getPlaying()[1]
|
|
||||||
BGM.stop()
|
|
||||||
_notHoldCS()
|
|
||||||
_showVirtualKey(MOBILE and true or false)
|
|
||||||
end
|
|
||||||
|
|
||||||
function scene.touchDown(x,y,_)
|
|
||||||
if showingKey then
|
|
||||||
for k=1,#virtualKeys do
|
|
||||||
local K=virtualKeys[k]
|
|
||||||
if K:isAbove(x,y) then K.code(); K:update(1) end end
|
|
||||||
-- Change Shift/Ctrl key's color when shift note temproraily
|
|
||||||
if flattt or sharpt then
|
|
||||||
if flattt then _holdingCtrl() else _holdingShift() end
|
|
||||||
else _notHoldCS() end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
scene.mouseDown=scene.touchDown
|
|
||||||
scene.mouseUp =scene.touchUp
|
|
||||||
|
|
||||||
function scene.keyDown(key,isRep)
|
|
||||||
if not isRep and keys[key] then
|
|
||||||
local note=keys[key]+offset
|
|
||||||
if kb.isDown('lshift','rshift') or sharpt then note=note+1 end
|
|
||||||
if kb.isDown('lctrl','rctrl') or flattt then note=note-1 end
|
|
||||||
SFX.playSample(inst,note)
|
|
||||||
if showingKey then
|
|
||||||
virtualKeys['key'..key:upper()]:update(1)
|
|
||||||
TEXT.show(SFX.getNoteName(note),math.random(75,1205),math.random(162,260),60,'score',.8)
|
|
||||||
else
|
|
||||||
TEXT.show(SFX.getNoteName(note),math.random(75,1205),math.random(162,620),60,'score',.8)
|
|
||||||
end
|
|
||||||
elseif kb.isDown('lctrl','rctrl') then _holdingCtrl()
|
|
||||||
elseif kb.isDown('lshift','rshift') then _holdingShift()
|
|
||||||
elseif key=='tab' then
|
|
||||||
inst=TABLE.next(instList,inst)
|
|
||||||
elseif key=='lalt' then
|
|
||||||
offset=math.max(offset-1,-12)
|
|
||||||
if showingKey then _setNoteName(offset) end
|
|
||||||
elseif key=='ralt' then
|
|
||||||
offset=math.min(offset+1,12)
|
|
||||||
if showingKey then _setNoteName(offset) end
|
|
||||||
elseif key=='f5' then _showVirtualKey(not showingKey)
|
|
||||||
elseif key=='escape' then
|
|
||||||
BGM.play(lastPlayBGM)
|
|
||||||
SCN.back()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function scene.keyUp()
|
|
||||||
if not kb.isDown('lctrl','rctrl','lshift','rshift') then _notHoldCS() end
|
|
||||||
end
|
|
||||||
|
|
||||||
function scene.draw()
|
|
||||||
setFont(30)
|
|
||||||
GC.setColor(1,1,1)
|
|
||||||
gc.print(inst.." | "..offset,30,40)
|
|
||||||
|
|
||||||
-- Drawing virtual keys
|
|
||||||
if showingKey then
|
|
||||||
for k=1,#virtualKeys do
|
|
||||||
virtualKeys[k]:draw()
|
|
||||||
end
|
|
||||||
gc.setLineWidth(1)
|
|
||||||
gc.setColor(COLOR.Z)
|
|
||||||
gc.line(685.5,297,685.5,642)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function scene.update()
|
|
||||||
-- Call actions
|
|
||||||
for k=1,#virtualKeys do virtualKeys[k]:update() end
|
|
||||||
end
|
|
||||||
|
|
||||||
scene.widgetList={
|
|
||||||
WIDGET.newButton{name='back' ,x=1150,y=60,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=pressKey'escape'},
|
|
||||||
WIDGET.newSwitch{name='showKey' ,x=970 ,y=60,fText='Virtual key (F5)',disp=function() return showingKey end,code=pressKey'f5'},
|
|
||||||
WIDGET.newKey {name='changeIns' ,x=305 ,y=60,w=280,h=60,fText='Change instrument',code=pressKey"tab" ,hideF=function() return not showingKey end},
|
|
||||||
WIDGET.newKey {name='offset-' ,x=485 ,y=60,w=60 ,h=60,fText=CHAR.key.left ,code=pressKey"lalt",hideF=function() return not showingKey end},
|
|
||||||
WIDGET.newKey {name='offset+' ,x=555 ,y=60,w=60 ,h=60,fText=CHAR.key.right ,code=pressKey"ralt",hideF=function() return not showingKey end},
|
|
||||||
}
|
|
||||||
return scene
|
return scene
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ local scene={}
|
|||||||
|
|
||||||
local dict-- Dict list
|
local dict-- Dict list
|
||||||
local result-- Result Lable
|
local result-- Result Lable
|
||||||
|
local localeFile -- Language file name, used for force reload
|
||||||
|
|
||||||
local lastTickInput
|
local lastTickInput
|
||||||
local searchWait-- Searching animation timer
|
local searchWait-- Searching animation timer
|
||||||
@@ -59,25 +60,63 @@ local listBox =WIDGET.newListBox {name='listBox',x=20, y=180,w=280,h=526,font=30
|
|||||||
gc.setColor(1,1,1,.4)
|
gc.setColor(1,1,1,.4)
|
||||||
gc.rectangle('fill',0,0,280,35)
|
gc.rectangle('fill',0,0,280,35)
|
||||||
end
|
end
|
||||||
|
setFont(30)
|
||||||
-- Name & color
|
-- Name & color
|
||||||
GC.shadedPrint(item.title,10,-3,'left',1,COLOR.D,typeColor[item.type])
|
GC.shadedPrint(item.title,10,-3,'left',1,COLOR.D,typeColor[item.type])
|
||||||
end}
|
end}
|
||||||
|
|
||||||
-- Necessary local functions
|
-- Necessary local functions
|
||||||
|
-- Update the infobox
|
||||||
|
local function _updateInfoBox(c)
|
||||||
|
local _t,t
|
||||||
|
if c==nil then
|
||||||
|
if listBox.selected==0 then
|
||||||
|
if text.dict.helpText then
|
||||||
|
_t,t=true,text.dict.helpText:repD(
|
||||||
|
CHAR.key.up,CHAR.key.down,CHAR.key.left,CHAR.key.right,
|
||||||
|
CHAR.controller.dpadU,CHAR.controller.dpadD,CHAR.controller.dpadL,CHAR.controller.dpadR,
|
||||||
|
CHAR.controller.xboxX,CHAR.controller.xboxY,CHAR.controller.xboxA,CHAR.controller.xboxB,
|
||||||
|
CHAR.icon.help,CHAR.icon.copy,CHAR.icon.globe,CHAR.key.winMenu
|
||||||
|
)
|
||||||
|
else -- Fallback
|
||||||
|
listBox.selected=lastSelected
|
||||||
|
scene.widgetList.help.color=COLOR.Z
|
||||||
|
MES.new("error","Cannot found the Help text! Maybe just a mistake?")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
else
|
||||||
|
_t,t=pcall(function() return _getList()[listBox.selected].content end)
|
||||||
|
end
|
||||||
|
if _t then c=t else c={""} end
|
||||||
|
_t,t=nil,nil
|
||||||
|
end
|
||||||
|
local _w,c=FONT.get(currentFontSize):getWrap(c,840)
|
||||||
|
textBox:setTexts(c)
|
||||||
|
end
|
||||||
-- Clear the result
|
-- Clear the result
|
||||||
local function _clearResult()
|
local function _clearResult()
|
||||||
TABLE.cut(result)
|
TABLE.cut(result)
|
||||||
listBox.selected=1
|
listBox.selected,lastSelected,searchWait,lastSearch=1,1,0,false
|
||||||
searchWait,lastSearch=0,false
|
|
||||||
scene.widgetList.copy.hide=false
|
scene.widgetList.copy.hide=false
|
||||||
|
_updateInfoBox()
|
||||||
end
|
end
|
||||||
-- Search through the dictionary
|
-- Search through the dictionary
|
||||||
local function _search()
|
local function _search()
|
||||||
local input=inputBox:getText():lower()
|
local input=inputBox:getText()
|
||||||
|
local pos
|
||||||
_clearResult()
|
_clearResult()
|
||||||
local first
|
local first
|
||||||
|
if dict=='vi' then
|
||||||
|
local success,input=pcall(function() STRING.lowerUTF8(input) end)
|
||||||
|
if not success then input=input:lower() end
|
||||||
|
else
|
||||||
|
input=input:lower() end
|
||||||
for i=1,#dict do
|
for i=1,#dict do
|
||||||
local pos=find(dict[i].title:lower(),input,nil,true) or find(dict[i].keywords:lower(),input,nil,true)
|
if dict=='vi' then
|
||||||
|
pos=find(STRING.lowerUTF8(dict[i].title),input,nil,true) or find(STRING.lowerUTF8(dict[i].keywords),input,nil,true)
|
||||||
|
else
|
||||||
|
pos=find(dict[i].title:lower(),input,nil,true) or find(dict[i].keywords:lower(),input,nil,true)
|
||||||
|
end
|
||||||
if pos==1 and not first then
|
if pos==1 and not first then
|
||||||
ins(result,1,dict[i])
|
ins(result,1,dict[i])
|
||||||
first=true
|
first=true
|
||||||
@@ -90,12 +129,17 @@ local function _search()
|
|||||||
|
|
||||||
if #result>0 then SFX.play('reach') end
|
if #result>0 then SFX.play('reach') end
|
||||||
lastSearch=input
|
lastSearch=input
|
||||||
|
_updateInfoBox()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Jump over n items
|
-- Jump over n items
|
||||||
local function _jumpover(key,n)
|
local function _jumpover(key,n)
|
||||||
local dir=(key=='left' or key=='pageup') and 'up' or 'down'
|
local dir=(key=='left' or key=='pageup') and 'up' or 'down'
|
||||||
for _=1,n or 1 do scene.widgetList.listBox:arrowKey(dir) end
|
for _=1,n or 1 do scene.widgetList.listBox:arrowKey(dir) end
|
||||||
|
|
||||||
|
_updateInfoBox()
|
||||||
|
lastSelected=listBox.selected
|
||||||
|
scene.widgetList.copy.hide=false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Copy the content
|
-- Copy the content
|
||||||
@@ -107,58 +151,20 @@ local function _copy()
|
|||||||
MES.new('info',text.copyDone)
|
MES.new('info',text.copyDone)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Update the infobox
|
-- Changing font size, z=0 --> reset
|
||||||
local function _updateTextBox(c)
|
|
||||||
local _t,t
|
|
||||||
if c==nil then
|
|
||||||
if listBox.selected==0 then
|
|
||||||
if text.dict.helpText then
|
|
||||||
_t,t=true,text.dict.helpText:repD(
|
|
||||||
CHAR.key.up,CHAR.key.down,CHAR.key.left,CHAR.key.right,
|
|
||||||
CHAR.controller.dpadU,CHAR.controller.dpadD,CHAR.controller.dpadL,CHAR.controller.dpadR,
|
|
||||||
CHAR.controller.xboxX,CHAR.controller.xboxY,CHAR.controller.xboxA,CHAR.controller.xboxB,
|
|
||||||
CHAR.icon.help,CHAR.icon.copy,CHAR.icon.globe,CHAR.key.winMenu
|
|
||||||
)
|
|
||||||
else
|
|
||||||
_t,t=true,{
|
|
||||||
"OUCH! I can't seem to find any translated Help text anywhere.",
|
|
||||||
"\nI guess you'll have to switch to English and try again to read it instead!",
|
|
||||||
"\n\nOn another note, you could make an issue on GitHub or send this to Techmino's Discord server.",
|
|
||||||
"\nThe cause? I'm not sure... My guess is that there's something seriously wrong with the language files or the source code of this scene. BUT all the language files have a callback to English, and the original language - Chinese - has a version of the Help text! I'm not entirely certain if it worked or not, though.",
|
|
||||||
"\n\nOh, and it would be nice if you could let us know about it or you can fix it by yourself!",
|
|
||||||
"\n\n-- Sea, the one who rewrote the Zictionary scene and left this message just in case."
|
|
||||||
} end
|
|
||||||
else
|
|
||||||
_t,t=pcall(function() return _getList()[listBox.selected].content end)
|
|
||||||
end
|
|
||||||
if _t then c=t else c={""} end
|
|
||||||
_t,t=nil,nil
|
|
||||||
end
|
|
||||||
local _w,c=FONT.get(currentFontSize):getWrap(c,840)
|
|
||||||
textBox:setTexts(c)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Zoom and reset zoom
|
|
||||||
local function _resetZoom()
|
|
||||||
currentFontSize,textBox.font=25,25
|
|
||||||
textBox.lineH,textBox.capacity=35,math.ceil((textBox.h-10)/35)
|
|
||||||
_updateTextBox()
|
|
||||||
MES.new("check",text.dict.sizeReset,1.26)
|
|
||||||
end
|
|
||||||
local function _setZoom(z)
|
local function _setZoom(z)
|
||||||
if z~=0 then
|
currentFontSize=MATH.clamp(z~=0 and currentFontSize+z or 25,15,40)
|
||||||
currentFontSize=MATH.clamp(currentFontSize+z,15,40)
|
textBox.font=currentFontSize
|
||||||
textBox.font=currentFontSize
|
textBox.lineH=currentFontSize*7/5 -- Recalculate the line's height
|
||||||
textBox.lineH=currentFontSize*7/5 -- Recalculate the line's height
|
textBox.capacity=math.ceil((textBox.h-10)/textBox.lineH)
|
||||||
textBox.capacity=math.ceil((textBox.h-10)/textBox.lineH)
|
_updateInfoBox()
|
||||||
_updateTextBox()
|
MES.new("check",z~=0 and text.dict.sizeChanged:repD(currentFontSize) or text.dict.sizeReset,1.26)
|
||||||
MES.new("check",text.dict.sizeChanged:repD(currentFontSize),1.26)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Reset everything when opening Zictionary
|
-- Reset everything when opening Zictionary
|
||||||
function scene.enter()
|
function scene.enter()
|
||||||
dict=require("parts.language.dict_"..(SETTING.locale:find'zh' and 'zh' or SETTING.locale:find'ja' and 'ja' or SETTING.locale:find'vi' and 'vi' or 'en'))
|
localeFile='parts.language.dict_'..(SETTING.locale:find'zh' and 'zh' or SETTING.locale:find'ja' and 'ja' or SETTING.locale:find'vi' and 'vi' or 'en')
|
||||||
|
dict=require(localeFile)
|
||||||
_scanDict(dict)
|
_scanDict(dict)
|
||||||
|
|
||||||
inputBox:clear()
|
inputBox:clear()
|
||||||
@@ -166,9 +172,9 @@ function scene.enter()
|
|||||||
|
|
||||||
searchWait=0
|
searchWait=0
|
||||||
lastSelected=0
|
lastSelected=0
|
||||||
listBox.selected=1
|
|
||||||
listBox.scrollPos=0
|
|
||||||
lastSearch=false
|
lastSearch=false
|
||||||
|
listBox:setList(_getList())
|
||||||
|
scene.widgetList.help.color=COLOR.Z
|
||||||
|
|
||||||
if not MOBILE then WIDGET.focus(inputBox) end
|
if not MOBILE then WIDGET.focus(inputBox) end
|
||||||
BG.set('rainbow')
|
BG.set('rainbow')
|
||||||
@@ -182,6 +188,8 @@ function scene.wheelMoved(_,y)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function scene.keyDown(key)
|
function scene.keyDown(key)
|
||||||
|
local inputBoxFocus=WIDGET.isFocus(inputBox)
|
||||||
|
|
||||||
-- Switching selected items
|
-- Switching selected items
|
||||||
if key=='up' or key=='down' then
|
if key=='up' or key=='down' then
|
||||||
textBox:scroll(key=='up' and -1 or 1)
|
textBox:scroll(key=='up' and -1 or 1)
|
||||||
@@ -194,10 +202,9 @@ function scene.keyDown(key)
|
|||||||
_copy()
|
_copy()
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif key=='-' or key=='=' then
|
elseif (key=='-' or key=='=' or key=='0') and (inputBox:getText()=="" or not inputBoxFocus) and not MOBILE then
|
||||||
_setZoom((key=='-' or key=='kp-') and -5 or 5)
|
WIDGET.unFocus(true)
|
||||||
elseif key=='0' then
|
_setZoom(key=='0' and 0 or key=='-' and -5 or 5)
|
||||||
_resetZoom()
|
|
||||||
|
|
||||||
elseif key=='application' and listBox.selected>=0 then
|
elseif key=='application' and listBox.selected>=0 then
|
||||||
local url=_getList()[listBox.selected].url
|
local url=_getList()[listBox.selected].url
|
||||||
@@ -207,7 +214,7 @@ function scene.keyDown(key)
|
|||||||
_clearResult()
|
_clearResult()
|
||||||
inputBox:clear()
|
inputBox:clear()
|
||||||
SFX.play('hold')
|
SFX.play('hold')
|
||||||
_updateTextBox()
|
_updateInfoBox()
|
||||||
end
|
end
|
||||||
elseif key=='escape' then
|
elseif key=='escape' then
|
||||||
if inputBox:hasText() then
|
if inputBox:hasText() then
|
||||||
@@ -216,12 +223,40 @@ function scene.keyDown(key)
|
|||||||
SCN.back()
|
SCN.back()
|
||||||
end
|
end
|
||||||
elseif key=='f1' then
|
elseif key=='f1' then
|
||||||
listBox.selected=0
|
-- inputBox:clear()
|
||||||
inputBox:clear()
|
-- _clearResult()
|
||||||
|
listBox.selected=listBox.selected==0 and lastSelected or 0
|
||||||
|
scene.widgetList.help.color=listBox.selected==0 and COLOR.W or COLOR.Z
|
||||||
searchWait=0
|
searchWait=0
|
||||||
_updateTextBox()
|
_updateInfoBox()
|
||||||
|
|
||||||
|
-- ***ONLY USE FOR HOTLOADING ZICTIONARY WHILE IN GAME!***
|
||||||
|
-- ***Please commenting out this code if you don't use***
|
||||||
|
-- elseif key=='f5' then
|
||||||
|
-- local _
|
||||||
|
-- local success,_r=pcall(function()
|
||||||
|
-- package.loaded[localeFile]=nil
|
||||||
|
-- dict=require(localeFile)
|
||||||
|
-- _scanDict(dict)
|
||||||
|
-- end
|
||||||
|
-- )
|
||||||
|
-- if not success then
|
||||||
|
-- SFX.play('finesseError_long')
|
||||||
|
-- _,_r=FONT.get(30):getWrap(tostring(_r),1000)
|
||||||
|
-- MES.new("error","Hotload failed! May need restarting!\n\n"..table.concat(_r,"\n"))
|
||||||
|
-- else
|
||||||
|
-- local lastLscrollPos=listBox.scrollPos
|
||||||
|
-- local lastTscrollPos=textBox.scrollPos
|
||||||
|
-- listBox:setList(_getList())
|
||||||
|
-- if #inputBox:getText()>0 then _search() end
|
||||||
|
-- listBox.selected=lastSelected<#dict and lastSelected or #dict -- In case the last item is removed!
|
||||||
|
-- listBox.scrollPos=lastLscrollPos
|
||||||
|
-- _updateInfoBox()
|
||||||
|
-- textBox.scrollPos=lastTscrollPos
|
||||||
|
-- SFX.play('pc')
|
||||||
|
-- end
|
||||||
else
|
else
|
||||||
if not WIDGET.isFocus(inputBox) then WIDGET.focus(inputBox) end
|
if not inputBoxFocus then WIDGET.focus(inputBox) end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -238,10 +273,7 @@ function scene.gamepadDown(key)
|
|||||||
elseif key=='dpleft' or key=='dpright' then
|
elseif key=='dpleft' or key=='dpright' then
|
||||||
_jumpover(key:gsub('dp',''),Joystick:isGamepadDown('a') and 12)
|
_jumpover(key:gsub('dp',''),Joystick:isGamepadDown('a') and 12)
|
||||||
elseif key=='y' then
|
elseif key=='y' then
|
||||||
listBox.selected=0
|
scene.keyDown('f1')
|
||||||
inputBox:clear()
|
|
||||||
searchWait=0
|
|
||||||
_updateTextBox()
|
|
||||||
elseif key=='back' then
|
elseif key=='back' then
|
||||||
SCN.back()
|
SCN.back()
|
||||||
end
|
end
|
||||||
@@ -264,26 +296,25 @@ function scene.update(dt)
|
|||||||
_search()
|
_search()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if listBox.selected~=lastSelected and listBox.selected~=0 then
|
||||||
if lastSelected~=listBox.selected then
|
if listBox.selected==0 then scene.keyDown('f1') end
|
||||||
_updateTextBox()
|
|
||||||
lastSelected=listBox.selected
|
lastSelected=listBox.selected
|
||||||
scene.widgetList.copy.hide=false
|
scene.widgetList.copy.hide=false
|
||||||
|
_updateInfoBox()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.draw()
|
function scene.draw()
|
||||||
-- Order: list, info, keys
|
|
||||||
-- Draw background
|
-- Draw background
|
||||||
gc.setColor(COLOR.dX)
|
gc.setColor(COLOR.dX)
|
||||||
gc.rectangle('fill',1194,340,80,366,5)
|
gc.rectangle('fill',1194,335,80,370,5)
|
||||||
|
gc.rectangle('fill',1194,180,80,80 ,5) -- Help key
|
||||||
-- Draw outline
|
-- Draw outline
|
||||||
gc.setLineWidth(2)
|
gc.setLineWidth(2)
|
||||||
gc.setColor(COLOR.Z)
|
gc.setColor(COLOR.Z)
|
||||||
gc.rectangle('line',1194,340,80,366,5)
|
gc.rectangle('line',1194,335,80,370,5)
|
||||||
gc.line(1194,560,1274,560)
|
gc.line(1194,555,1274,555)
|
||||||
|
gc.rectangle('line',1194,180,80,80 ,5) -- Help key
|
||||||
setFont(30)
|
|
||||||
|
|
||||||
if searchWait>0 then
|
if searchWait>0 then
|
||||||
local r=TIME()*2
|
local r=TIME()*2
|
||||||
@@ -294,22 +325,22 @@ function scene.draw()
|
|||||||
end
|
end
|
||||||
|
|
||||||
scene.widgetList={
|
scene.widgetList={
|
||||||
WIDGET.newText {name='book', x=20, y=15, font=70,align='L',fText=CHAR.icon.zBook},
|
WIDGET.newText {name='book', x=20, y=15, font=70,align='L',fText=CHAR.icon.zBook},
|
||||||
WIDGET.newText {name='title', x=100, y=15, font=70,align='L'},
|
WIDGET.newText {name='title', x=100, y=15, font=70,align='L'},
|
||||||
listBox,
|
listBox,
|
||||||
inputBox,
|
inputBox,
|
||||||
textBox,
|
textBox,
|
||||||
WIDGET.newKey {name='link', x=1234,y=600,w=60,font=45,fText=CHAR.icon.globe, code=pressKey'application',hideF=function() return not (listBox.selected>0 and _getList()[listBox.selected].url) end},
|
WIDGET.newKey {name='link', x=1234,y=595,w=60,font=45,fText=CHAR.icon.globe, code=pressKey'application',hideF=function() return not (listBox.selected>0 and _getList()[listBox.selected].url) end},
|
||||||
WIDGET.newKey {name='copy', x=1234,y=670,w=60,font=40,fText=CHAR.icon.copy, code=pressKey'cC',hideF=function() return not (listBox.selected>0) end},
|
WIDGET.newKey {name='copy', x=1234,y=665,w=60,font=40,fText=CHAR.icon.copy, code=pressKey'cC',hideF=function() return not (listBox.selected>0) end},
|
||||||
|
|
||||||
WIDGET.newKey {name='zoomin', x=1234,y=380,w=60,font=40,fText="A", code=function() _setZoom(5) end},
|
WIDGET.newKey {name='zoomin', x=1234,y=375,w=60,font=40,fText=CHAR.icon.zoomIn, code=function() _setZoom(5) end},
|
||||||
WIDGET.newKey {name='zoomout', x=1234,y=450,w=60,font=40,fText="a", code=function() _setZoom(-5) end},
|
WIDGET.newKey {name='zoomout', x=1234,y=445,w=60,font=40,fText=CHAR.icon.zoomOut, code=function() _setZoom(-5) end},
|
||||||
WIDGET.newKey {name='resetzoom',x=1234,y=520,w=60,font=25,fText="100%", code=function() _resetZoom() end},
|
WIDGET.newKey {name='resetzoom',x=1234,y=515,w=60,font=40,fText=CHAR.icon.zoomDefault,code=function() _setZoom(0) end},
|
||||||
|
|
||||||
WIDGET.newKey {name='help', x=1234,y=220,w=60,font=40,fText=CHAR.icon.help, code=pressKey'f1'},
|
WIDGET.newKey {name='help', x=1234,y=220,w=60,font=40,fText=CHAR.icon.help, code=pressKey'f1'},
|
||||||
|
|
||||||
WIDGET.newButton{name='back', x=1165,y=60, w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene},
|
WIDGET.newButton{name='back', x=1185,y=60, w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene},
|
||||||
WIDGET.newText {name='buttontip',x=1274,y=110,w=762,h=60,font=40,align='R',fText=CHAR.controller.xboxY.."/[F1]: "..CHAR.icon.help}
|
WIDGET.newText {name='buttontip',x=1274,y=110,w=762,h=60,font=40,align='R',fText=CHAR.controller.xboxY.."/[F1]: "..CHAR.icon.help}
|
||||||
}
|
}
|
||||||
-- NOTE: The gap between Link-Copy, Page, Zoom, Help is 60*1.5-10=80 :) The gap between 2 buttons in one group is 60+10=70
|
-- NOTE: The gap between Link-Copy, Zoom is 60*1.5-10=80 :) The gap between 2 buttons in one group is 60+10=70
|
||||||
return scene
|
return scene
|
||||||
@@ -67,7 +67,7 @@ local function _moveMap(dx,dy)
|
|||||||
local k=_getK()
|
local k=_getK()
|
||||||
local x,y=_getPos()
|
local x,y=_getPos()
|
||||||
if x>1300 and dx<0 or x<-1500 and dx>0 then dx=0 end
|
if x>1300 and dx<0 or x<-1500 and dx>0 then dx=0 end
|
||||||
if y>420 and dy<0 or y<-1900 and dy>0 then dy=0 end
|
if y>620 and dy<0 or y<-1900 and dy>0 then dy=0 end
|
||||||
mapCam.xOy:translate(dx/k,dy/k)
|
mapCam.xOy:translate(dx/k,dy/k)
|
||||||
end
|
end
|
||||||
function scene.wheelMoved(_,dy)
|
function scene.wheelMoved(_,dy)
|
||||||
@@ -308,9 +308,12 @@ function scene.draw()
|
|||||||
gc_setColor(COLOR.lX)
|
gc_setColor(COLOR.lX)
|
||||||
gc_rectangle('fill',920,0,360,720,5)-- Info board
|
gc_rectangle('fill',920,0,360,720,5)-- Info board
|
||||||
gc_setColor(COLOR.Z)
|
gc_setColor(COLOR.Z)
|
||||||
setFont(40)GC.mStr(text.modes[sel][1],1100,5)
|
local modeText=text.modes[sel]
|
||||||
setFont(30)GC.mStr(text.modes[sel][2],1100,50)
|
if modeText then
|
||||||
setFont(25)gc_printf(text.modes[sel][3],920,110,360,'center')
|
setFont(40)GC.mStr(modeText[1],1100,5)
|
||||||
|
setFont(30)GC.mStr(modeText[2],1100,50)
|
||||||
|
setFont(25)gc_printf(modeText[3],920,110,360,'center')
|
||||||
|
end
|
||||||
if M.slowMark then
|
if M.slowMark then
|
||||||
gc_draw(IMG.ctrlSpeedLimit,1230,50,nil,.4)
|
gc_draw(IMG.ctrlSpeedLimit,1230,50,nil,.4)
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user