Merge branch '26F-Studio:main' into main

This commit is contained in:
C₂₉H₂₅N₃O₅
2023-08-28 22:27:54 -05:00
committed by GitHub
24 changed files with 1889 additions and 1602 deletions

View 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
}

View File

@@ -892,7 +892,7 @@ FNNS and {"Support 3",
{"HisPool generator",
"hisPool history pool",
"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 easy start",
@@ -1256,4 +1256,4 @@ FNNS and {"Support 3",
"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.",
},
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -365,6 +365,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[All other test staff]",
"…And You!",
},
@@ -853,115 +854,117 @@ C. Gamepad
},
},
modes={
['sprint_10l']= {"Sprint", "10L", "Clear 10 lines!"},
['sprint_20l']= {"Sprint", "20L", "Clear 20 lines!"},
['sprint_40l']= {"Sprint", "40L", "Clear 40 lines!"},
['sprint_100l']= {"Sprint", "100L", "Clear 100 lines!"},
['sprint_400l']= {"Sprint", "400L", "Clear 400 lines!"},
['sprint_1000l']= {"Sprint", "1000L", "Clear 1,000 lines!"},
['sprintPenta']= {"Sprint", "PENTOMINO", "40L with the 18 pentominoes"},
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
['sprint123']= {"Sprint", "M123", "40L with only monominoes, dominoes, and triminoes"},
['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_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_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_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_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!"},
['drought_n']= {"Drought", "100L", "100L but without I blocks"},
['drought_l']= {"Drought+", "100L", "W. T. F."},
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
['solo_n']= {"Battle", "NORMAL", "Defeat the AI!"},
['solo_h']= {"Battle", "HARD", "Defeat the AI!"},
['solo_l']= {"Battle", "LUNATIC", "Defeat the AI!"},
['solo_u']= {"Battle", "ULTIMATE", "Defeat the AI!"},
['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_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_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"},
['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_h']= {"Turn-Based", "HARD", "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!"},
['big_n']= {"Big", "NORMAL", "Play in a 5×10 field!"},
['big_h']= {"Big", "HARD", "Play in a 5×10 field!"},
['master_n']= {"Master", "NORMAL", "For 20G beginners"},
['master_h']= {"Master", "HARD", "For 20G pros"},
['master_m']= {"Master", "M21", "For 20G Masters"},
['master_final']= {"Master", "FINAL", "20G and beyond"},
['master_ph']= {"Master", "PHANTASM", "???"},
['master_g']= {"Master", "GRADED", "Get the highest grade you can!"},
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
['master_instinct']={"Master", "INSTINCT", "What if the active piece becomes invisible?"},
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
['strategy_e_plus']={"Strategy", "EASY+", "Holdless strategy!"},
['strategy_h_plus']={"Strategy", "HARD+", "Holdless strategy!"},
['strategy_u_plus']={"Strategy", "ULTIMATE+", "Holdless strategy!"},
['blind_e']= {"Invisible", "HALF", "For beginners"},
['blind_n']= {"Invisible", "ALL", "For intermediates"},
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
['blind_l']= {"Invisible", "SUDDEN+", "For professionals"},
['blind_u']= {"Invisible", "?", "Are you ready?"},
['blind_wtf']= {"Invisible", "WTF", "You're not ready."},
['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_l']= {"Classic", "LUNATIC", "A high-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_n']= {"Survival", "NORMAL", "How long can you survive?"},
['survivor_h']= {"Survival", "HARD", "How long can you survive?"},
['survivor_l']= {"Survival", "LUNATIC", "How long can you survive?"},
['survivor_u']= {"Survival", "ULTIMATE", "How long can you survive?"},
['attacker_h']= {"Attacker", "HARD", "Practice your attacking skills!"},
['attacker_u']= {"Attacker", "ULTIMATE", "Practice your attacking skills!"},
['defender_n']= {"Defender", "NORMAL", "Practice your defensing skills!"},
['defender_l']= {"Defender", "LUNATIC", "Practice your defensing skills!"},
['dig_h']= {"Driller", "HARD", "Digging practice!"},
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice"},
['pc_n']= {"PC Challenge", "NORMAL", "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_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_plus']= {"Tech", "NORMAL+", "Spins & PCs only"},
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
['tech_h_plus']= {"Tech", "HARD+", "Spins & PCs only"},
['tech_l']= {"Tech", "LUNATIC", "Try to keep the\nBack-to-Back chain!"},
['tech_l_plus']= {"Tech", "LUNATIC+", "Spins & PCs only"},
['tech_finesse']= {"Tech", "FINESSE", "No finesse errors!"},
['tech_finesse_f']= {"Tech", "FINESSE+", "No normal clears and finesse errors!"},
['tsd_e']= {"TSD Challenge", "EASY", "T-Spin Doubles only!"},
['tsd_h']= {"TSD Challenge", "HARD", "T-Spin Doubles only!"},
['tsd_u']= {"TSD Challenge", "ULTIMATE", "T-Spin Doubles only!"},
['backfire_n']= {"Backfire", "NORMAL", "Hold back the backfiring garbage lines"},
['backfire_h']= {"Backfire", "HARD", "Hold back the backfiring garbage lines"},
['backfire_l']= {"Backfire", "LUNATIC", "Hold back the backfiring garbage lines"},
['backfire_u']= {"Backfire", "ULTIMATE", "Hold back the backfiring garbage lines"},
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40 lines!"},
['zen']= {'Zen', "200", "A 200-line run with no time limit"},
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
['infinite']= {"Infinite", "", "Just a sandbox"},
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
['sprint_10l']= {"Sprint", "10L", "Clear 10 lines!"},
['sprint_20l']= {"Sprint", "20L", "Clear 20 lines!"},
['sprint_40l']= {"Sprint", "40L", "Clear 40 lines!"},
['sprint_100l']= {"Sprint", "100L", "Clear 100 lines!"},
['sprint_400l']= {"Sprint", "400L", "Clear 400 lines!"},
['sprint_1000l']= {"Sprint", "1000L", "Clear 1,000 lines!"},
['sprintPenta']= {"Sprint", "PENTOMINO", "40L with the 18 pentominoes"},
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
['sprint123']= {"Sprint", "M123", "40L with only monominoes, dominoes, and triminoes"},
['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_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_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_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_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!"},
['drought_n']= {"Drought", "100L", "100L but without I blocks"},
['drought_l']= {"Drought+", "100L", "W. T. F."},
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
['solo_n']= {"Battle", "NORMAL", "Defeat the AI!"},
['solo_h']= {"Battle", "HARD", "Defeat the AI!"},
['solo_l']= {"Battle", "LUNATIC", "Defeat the AI!"},
['solo_u']= {"Battle", "ULTIMATE", "Defeat the AI!"},
['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_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_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"},
['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_h']= {"Turn-Based", "HARD", "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!"},
['big_n']= {"Big", "NORMAL", "Play in a 5×10 field!"},
['big_h']= {"Big", "HARD", "Play in a 5×10 field!"},
['master_n']= {"Master", "NORMAL", "For 20G beginners"},
['master_h']= {"Master", "HARD", "For 20G pros"},
['master_m']= {"Master", "M21", "For 20G Masters"},
['master_final']= {"Master", "FINAL", "20G and beyond"},
['master_ph']= {"Master", "PHANTASM", "???"},
['master_g']= {"Master", "GRADED", "Get the highest grade you can!"},
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
['master_instinct']= {"Master", "INSTINCT", "What if the active piece becomes invisible?"},
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
['strategy_e_plus']= {"Strategy", "EASY+", "Holdless strategy!"},
['strategy_h_plus']= {"Strategy", "HARD+", "Holdless strategy!"},
['strategy_u_plus']= {"Strategy", "ULTIMATE+", "Holdless strategy!"},
['blind_e']= {"Invisible", "HALF", "For beginners"},
['blind_n']= {"Invisible", "ALL", "For intermediates"},
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
['blind_l']= {"Invisible", "SUDDEN+", "For professionals"},
['blind_u']= {"Invisible", "?", "Are you ready?"},
['blind_wtf']= {"Invisible", "WTF", "You're not ready."},
['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_l']= {"Classic", "LUNATIC", "A high-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_n']= {"Survival", "NORMAL", "How long can you survive?"},
['survivor_h']= {"Survival", "HARD", "How long can you survive?"},
['survivor_l']= {"Survival", "LUNATIC", "How long can you survive?"},
['survivor_u']= {"Survival", "ULTIMATE", "How long can you survive?"},
['attacker_h']= {"Attacker", "HARD", "Practice your attacking skills!"},
['attacker_u']= {"Attacker", "ULTIMATE", "Practice your attacking skills!"},
['defender_n']= {"Defender", "NORMAL", "Practice your defensing skills!"},
['defender_l']= {"Defender", "LUNATIC", "Practice your defensing skills!"},
['dig_h']= {"Driller", "HARD", "Digging practice!"},
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice"},
['pc_n']= {"PC Challenge", "NORMAL", "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_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_plus']= {"Tech", "NORMAL+", "Spins & PCs only"},
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
['tech_h_plus']= {"Tech", "HARD+", "Spins & PCs only"},
['tech_l']= {"Tech", "LUNATIC", "Try to keep the\nBack-to-Back chain!"},
['tech_l_plus']= {"Tech", "LUNATIC+", "Spins & PCs only"},
['tech_finesse']= {"Tech", "FINESSE", "No finesse errors!"},
['tech_finesse_f']= {"Tech", "FINESSE+", "No normal clears and finesse errors!"},
['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", "EASY", "T-Spin Doubles only!"},
['tsd_h']= {"TSD Challenge", "HARD", "T-Spin Doubles only!"},
['tsd_u']= {"TSD Challenge", "ULTIMATE", "T-Spin Doubles only!"},
['backfire_n']= {"Backfire", "NORMAL", "Hold back the backfiring garbage lines"},
['backfire_h']= {"Backfire", "HARD", "Hold back the backfiring garbage lines"},
['backfire_l']= {"Backfire", "LUNATIC", "Hold back the backfiring garbage lines"},
['backfire_u']= {"Backfire", "ULTIMATE", "Hold back the backfiring garbage lines"},
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40 lines!"},
['zen']= {'Zen', "200", "A 200-line run with no time limit"},
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
['infinite']= {"Infinite", "", "Just a sandbox"},
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"},
['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"},
},
getTip={refuseCopy=true,
":pog:",

View File

@@ -362,6 +362,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[Todo el staff de testeo]",
"…Y a ti!",
},
@@ -897,6 +898,8 @@ return {
['tech_l_plus']= {"Tech", "Lunático+", "¡Sólo se permiten Spins y PCs!"},
['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_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_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!"},

View File

@@ -341,6 +341,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[All other test staff]",
"…And You!",
},
@@ -868,6 +869,8 @@ return {
['tech_l_plus']= {"Tech", "LUNATIQUE+", "Spin & PC uniquement"},
['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_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_h']= {"TSD Challenge", "DIFFICILE", "T-spin doubles uniquement !"},
['tsd_u']= {"TSD Challenge", "ULTIME", "T-spin doubles uniquement !"},

View File

@@ -363,6 +363,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[Semua staf penguji lainnya]",
"…Dan Anda!",
},
@@ -815,115 +816,117 @@ return {
},
},
modes={
['sprint_10l']= {"Balapan", "10L", "Buat 10 baris!"},
['sprint_20l']= {"Balapan", "20L", "Buat 20 baris!"},
['sprint_40l']= {"Balapan", "40L", "Buat 40 baris!"},
['sprint_100l']= {"Balapan", "100L", "Buat 100 baris!"},
['sprint_400l']= {"Balapan", "400L", "Buat 400 baris!"},
['sprint_1000l']= {"Balapan", "1.000L", "Buat 1.000 baris!"},
['sprintPenta']= {"Balapan", "PENTOMINO", "40L dengan pentomino!"},
['sprintMPH']= {"Balapan", "MPH", "Tanpa ingatan\nTanpa pratinjau\nTanpa simpan"},
['sprint123']= {"Balapan", "M123", "40L dengan hanya monomino, domino, dan trimino"},
['secret_grade']= {"Secret Grade", "", "Buatlah formasi lubang zigzag, menuruti panduannya!"},
['dig_10l']= {"Gali", "10L", "Gali 10 baris!"},
['dig_40l']= {"Gali", "40L", "Gali 40 baris!"},
['dig_100l']= {"Gali", "100L", "Gali 100 baris!"},
['dig_400l']= {"Gali", "400L", "Gali 400 baris!"},
['dig_eff_10l']= {"Gali", "EFISIENSI 10L", "Gali 10 baris!"},
['dig_eff_40l']= {"Gali", "EFISIENSI 40L", "Gali 40 baris!"},
['dig_eff_100l']= {"Gali", "EFISIENSI 100L","Gali 100 baris!"},
['dig_eff_400l']= {"Gali", "EFISIENSI 400L","Gali 400 baris!"},
['dig_quad_10l']= {"Gali", "TECHRASH 10L", "Gali 10 baris hanya dengan techrash!"},
['drought_n']= {"Nasib Buruk", "100L", "Tidak ada blok I..."},
['drought_l']= {"Nasib Buruk+", "100L", "Nasib sangat buruk..."},
['marathon_n']= {"Maraton", "NORMAL", "200-baris maraton dengan kecepatan meningkat"},
['marathon_h']= {"Maraton", "SULIT", "200-baris maraton dengan kecepatan tinggi"},
['solo_e']= {"Tarung", "MUDAH", "Kalahkan AInya!"},
['solo_n']= {"Tarung", "NORMAL", "Kalahkan AInya!"},
['solo_h']= {"Tarung", "SULIT", "Kalahkan AInya!"},
['solo_l']= {"Tarung", "GILA", "Kalahkan AInya!"},
['solo_u']= {"Tarung", "TERAKHIR", "Kalahkan AInya!"},
['techmino49_e']= {"Tech 49", "MUDAH", "Pertarungan dengan 49 pemain."},
['techmino49_h']= {"Tech 49", "SULIT", "Pertarungan dengan 49 pemain."},
['techmino49_u']= {"Tech 49", "TERAKHIR", "Pertarungan dengan 49 pemain."},
['techmino99_e']= {"Tech 99", "MUDAH", "Pertarungan dengan 99 pemain."},
['techmino99_h']= {"Tech 99", "SULIT", "Pertarungan dengan 99 pemain."},
['techmino99_u']= {"Tech 99", "TERAKHIR", "Pertarungan dengan 99 pemain."},
['round_e']= {"Giliran", "MUDAH", "Giliran main melawan AI!"},
['round_n']= {"Giliran", "NORMAL", "Giliran main melawan AI!"},
['round_h']= {"Giliran", "SULIT", "Giliran main melawan AI!"},
['round_l']= {"Giliran", "GILA", "Giliran main melawan AI!"},
['round_u']= {"Giliran", "TERAKHIR", "Giliran main melawan AI!"},
['big_n']= {"Besar", "NORMAL", "Main dalam tempat main lebih kecil!"},
['big_h']= {"Besar", "SULIT", "Main dalam tempat main lebih kecil!"},
['master_n']= {"Ahli", "NORMAL", "Untuk pemula 20G"},
['master_h']= {"Ahli", "SULIT", "Untuk pro 20G"},
['master_m']= {"Ahli", "M21", "Untuk jago 20G"},
['master_final']= {"Ahli", "TERAKHIR", "Lebih dari 20G"},
['master_ph']= {"Ahli", "KHAYALAN", "???"},
['master_g']= {"Ahli", "BERTINGKAT", "Dapatkan tingkat tertinggi!"},
['master_ex']= {"Sangat Ahli", "EKSTRA", "Blok tidak kelihatan"},
['master_instinct']={"Ahli", "INSTINK", "Bagaimana jika blok terkontrol tersembunyi?"},
['strategy_e']= {"Strategi", "MUDAH", "Keputusan 20G cepat"},
['strategy_h']= {"Strategi", "SULIT", "Keputusan 20G cepat"},
['strategy_u']= {"Strategi", "TERAKHIR", "Keputusan 20G cepat"},
['strategy_e_plus']={"Strategi", "MUDAH+", "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"},
['blind_e']= {"Tak Terlihat", "MUDAH", "Untuk pemula"},
['blind_n']= {"Tak Terlihat", "NORMAL", "Untuk amatir"},
['blind_h']= {"Tak Terlihat", "SULIT", "Untuk orang berpengalaman"},
['blind_l']= {"Tak Terlihat", "GILA", "Untuk profesional"},
['blind_u']= {"Tak Terlihat", "???", "Apakah Anda siap?"},
['blind_wtf']= {"Tak Terlihat", "TERAKHIR", "Anda belum siap"},
['classic_e']= {"Klasik", "MUDAH", "Rekreasi berkecepatan rendah 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_u']= {"Klasik", "TERAKHIR", "Rekreasi berkecepatan tinggi dari tahun 80-an"},
['survivor_e']= {"Bertahan", "MUDAH", "Berapa lama Anda bisa bertahan?"},
['survivor_n']= {"Bertahan", "NORMAL", "Berapa lama Anda bisa bertahan?"},
['survivor_h']= {"Bertahan", "SULIT", "Berapa lama Anda bisa bertahan?"},
['survivor_l']= {"Bertahan", "GILA", "Berapa lama Anda bisa bertahan?"},
['survivor_u']= {"Bertahan", "TERAKHIR", "Berapa lama Anda bisa bertahan?"},
['attacker_h']= {"Penyerang", "SULIT", "Praktekkan keahlian menyerang Anda!"},
['attacker_u']= {"Penyerang", "TERAKHIR", "Praktekkan keahlian menyerang Anda!"},
['defender_n']= {"Pembela", "NORMAL", "Praktekkan keahlian membela Anda!"},
['defender_l']= {"Pembela", "GILA", "Praktekkan keahlian membela Anda!"},
['dig_h']= {"Pembor", "SULIT", "Praktekkan keahlian menggali Anda!"},
['dig_u']= {"Pembor", "TERAKHIR", "Praktekkan keahlian menggali Anda!"},
['c4wtrain_n']= {"Latihan C4W", "NORMAL", "Kombo tidak terbatas."},
['c4wtrain_l']= {"Latihan C4W", "GILA", "Kombo tidak terbatas."},
['pctrain_n']= {"Latihan PC", "NORMAL", "Latihan PC"},
['pctrain_l']= {"Latihan PC", "GILA", "Latihan PC yang lebih sulit"},
['pc_n']= {"Tantangan PC", "NORMAL", "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_inf']= {"Tantangan PC", "TAK TERBATAS", "Dapatkan PC sebanyaknya!"},
['tech_n']= {"Tech", "NORMAL", "Coba jaga deret Back-To-Back!"},
['tech_n_plus']= {"Tech", "NORMAL+", "Hanya Spins & PCs dibolehkan"},
['tech_h']= {"Tech", "SULIT", "Coba jaga deret Back-To-Back!"},
['tech_h_plus']= {"Tech", "SULIT+", "Hanya Spins & PCs dibolehkan"},
['tech_l']= {"Tech", "GILA", "Coba jaga deret Back-To-Back!"},
['tech_l_plus']= {"Tech", "GILA+", "Hanya Spins & PCs dibolehkan"},
['tech_finesse']= {"Tech", "EF. TOMBOL", "Efisiensi tombol harus maksimal!"},
['tech_finesse_f']= {"Tech", "EF. TOMBOL+", "Efisiensi tombol maksimal dan tidak ada garis normal!"},
['tsd_e']= {"Tantangan TSD", "MUDAH", "Hanya T-Spin Double dibolehkan!"},
['tsd_h']= {"Tantangan TSD", "SULIT", "Hanya T-Spin Double dibolehkan!"},
['tsd_u']= {"Tantangan TSD", "TERAKHIR", "Hanya T-Spin Double dibolehkan!"},
['backfire_n']= {"Serangan Balik", "NORMAL", "Tahankan serang baliknya!"},
['backfire_h']= {"Serangan Balik", "SULIT", "Tahankan serang baliknya!"},
['backfire_l']= {"Serangan Balik", "GILA", "Tahankan serang baliknya!"},
['backfire_u']= {"Serangan Balik", "TERAKHIR", "Tahankan serang baliknya!"},
['sprintAtk']= {"Balapan", "100 Serangan", "Kirim 100 baris serangan!"},
['sprintEff']= {"Balapan", "Efisiensi", "Kirim lebih banyak serangan sampai 40 baris!"},
['zen']= {"Zen", "200L", "Permainan 200-garis tanpa batas waktu"},
['ultra']= {"Ultra", "EKSTRA", "Permainan 2 menit. Dapatkan nilai sebanyaknya!"},
['infinite']= {"Tak Terbatas", "", "Bak pasir"},
['infinite_dig']= {"Tak Terbatas: Gali","", "Gali, gali, gali"},
['marathon_inf']= {"Maraton", "TAK TERBATAS", "Maraton tanpa akhir."},
['sprint_10l']= {"Balapan", "10L", "Buat 10 baris!"},
['sprint_20l']= {"Balapan", "20L", "Buat 20 baris!"},
['sprint_40l']= {"Balapan", "40L", "Buat 40 baris!"},
['sprint_100l']= {"Balapan", "100L", "Buat 100 baris!"},
['sprint_400l']= {"Balapan", "400L", "Buat 400 baris!"},
['sprint_1000l']= {"Balapan", "1.000L", "Buat 1.000 baris!"},
['sprintPenta']= {"Balapan", "PENTOMINO", "40L dengan pentomino!"},
['sprintMPH']= {"Balapan", "MPH", "Tanpa ingatan\nTanpa pratinjau\nTanpa simpan"},
['sprint123']= {"Balapan", "M123", "40L dengan hanya monomino, domino, dan trimino"},
['secret_grade']= {"Secret Grade", "", "Buatlah formasi lubang zigzag, menuruti panduannya!"},
['dig_10l']= {"Gali", "10L", "Gali 10 baris!"},
['dig_40l']= {"Gali", "40L", "Gali 40 baris!"},
['dig_100l']= {"Gali", "100L", "Gali 100 baris!"},
['dig_400l']= {"Gali", "400L", "Gali 400 baris!"},
['dig_eff_10l']= {"Gali", "EFISIENSI 10L", "Gali 10 baris!"},
['dig_eff_40l']= {"Gali", "EFISIENSI 40L", "Gali 40 baris!"},
['dig_eff_100l']= {"Gali", "EFISIENSI 100L", "Gali 100 baris!"},
['dig_eff_400l']= {"Gali", "EFISIENSI 400L", "Gali 400 baris!"},
['dig_quad_10l']= {"Gali", "TECHRASH 10L", "Gali 10 baris hanya dengan techrash!"},
['drought_n']= {"Nasib Buruk", "100L", "Tidak ada blok I..."},
['drought_l']= {"Nasib Buruk+", "100L", "Nasib sangat buruk..."},
['marathon_n']= {"Maraton", "NORMAL", "200-baris maraton dengan kecepatan meningkat"},
['marathon_h']= {"Maraton", "SULIT", "200-baris maraton dengan kecepatan tinggi"},
['solo_e']= {"Tarung", "MUDAH", "Kalahkan AInya!"},
['solo_n']= {"Tarung", "NORMAL", "Kalahkan AInya!"},
['solo_h']= {"Tarung", "SULIT", "Kalahkan AInya!"},
['solo_l']= {"Tarung", "GILA", "Kalahkan AInya!"},
['solo_u']= {"Tarung", "TERAKHIR", "Kalahkan AInya!"},
['techmino49_e']= {"Tech 49", "MUDAH", "Pertarungan dengan 49 pemain."},
['techmino49_h']= {"Tech 49", "SULIT", "Pertarungan dengan 49 pemain."},
['techmino49_u']= {"Tech 49", "TERAKHIR", "Pertarungan dengan 49 pemain."},
['techmino99_e']= {"Tech 99", "MUDAH", "Pertarungan dengan 99 pemain."},
['techmino99_h']= {"Tech 99", "SULIT", "Pertarungan dengan 99 pemain."},
['techmino99_u']= {"Tech 99", "TERAKHIR", "Pertarungan dengan 99 pemain."},
['round_e']= {"Giliran", "MUDAH", "Giliran main melawan AI!"},
['round_n']= {"Giliran", "NORMAL", "Giliran main melawan AI!"},
['round_h']= {"Giliran", "SULIT", "Giliran main melawan AI!"},
['round_l']= {"Giliran", "GILA", "Giliran main melawan AI!"},
['round_u']= {"Giliran", "TERAKHIR", "Giliran main melawan AI!"},
['big_n']= {"Besar", "NORMAL", "Main dalam tempat main lebih kecil!"},
['big_h']= {"Besar", "SULIT", "Main dalam tempat main lebih kecil!"},
['master_n']= {"Ahli", "NORMAL", "Untuk pemula 20G"},
['master_h']= {"Ahli", "SULIT", "Untuk pro 20G"},
['master_m']= {"Ahli", "M21", "Untuk jago 20G"},
['master_final']= {"Ahli", "TERAKHIR", "Lebih dari 20G"},
['master_ph']= {"Ahli", "KHAYALAN", "???"},
['master_g']= {"Ahli", "BERTINGKAT", "Dapatkan tingkat tertinggi!"},
['master_ex']= {"Sangat Ahli", "EKSTRA", "Blok tidak kelihatan"},
['master_instinct']= {"Ahli", "INSTINK", "Bagaimana jika blok terkontrol tersembunyi?"},
['strategy_e']= {"Strategi", "MUDAH", "Keputusan 20G cepat"},
['strategy_h']= {"Strategi", "SULIT", "Keputusan 20G cepat"},
['strategy_u']= {"Strategi", "TERAKHIR", "Keputusan 20G cepat"},
['strategy_e_plus']= {"Strategi", "MUDAH+", "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"},
['blind_e']= {"Tak Terlihat", "MUDAH", "Untuk pemula"},
['blind_n']= {"Tak Terlihat", "NORMAL", "Untuk amatir"},
['blind_h']= {"Tak Terlihat", "SULIT", "Untuk orang berpengalaman"},
['blind_l']= {"Tak Terlihat", "GILA", "Untuk profesional"},
['blind_u']= {"Tak Terlihat", "???", "Apakah Anda siap?"},
['blind_wtf']= {"Tak Terlihat", "TERAKHIR", "Anda belum siap"},
['classic_e']= {"Klasik", "MUDAH", "Rekreasi berkecepatan rendah 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_u']= {"Klasik", "TERAKHIR", "Rekreasi berkecepatan tinggi dari tahun 80-an"},
['survivor_e']= {"Bertahan", "MUDAH", "Berapa lama Anda bisa bertahan?"},
['survivor_n']= {"Bertahan", "NORMAL", "Berapa lama Anda bisa bertahan?"},
['survivor_h']= {"Bertahan", "SULIT", "Berapa lama Anda bisa bertahan?"},
['survivor_l']= {"Bertahan", "GILA", "Berapa lama Anda bisa bertahan?"},
['survivor_u']= {"Bertahan", "TERAKHIR", "Berapa lama Anda bisa bertahan?"},
['attacker_h']= {"Penyerang", "SULIT", "Praktekkan keahlian menyerang Anda!"},
['attacker_u']= {"Penyerang", "TERAKHIR", "Praktekkan keahlian menyerang Anda!"},
['defender_n']= {"Pembela", "NORMAL", "Praktekkan keahlian membela Anda!"},
['defender_l']= {"Pembela", "GILA", "Praktekkan keahlian membela Anda!"},
['dig_h']= {"Pembor", "SULIT", "Praktekkan keahlian menggali Anda!"},
['dig_u']= {"Pembor", "TERAKHIR", "Praktekkan keahlian menggali Anda!"},
['c4wtrain_n']= {"Latihan C4W", "NORMAL", "Kombo tidak terbatas."},
['c4wtrain_l']= {"Latihan C4W", "GILA", "Kombo tidak terbatas."},
['pctrain_n']= {"Latihan PC", "NORMAL", "Latihan PC"},
['pctrain_l']= {"Latihan PC", "GILA", "Latihan PC yang lebih sulit"},
['pc_n']= {"Tantangan PC", "NORMAL", "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_inf']= {"Tantangan PC", "TAK TERBATAS", "Dapatkan PC sebanyaknya!"},
['tech_n']= {"Tech", "NORMAL", "Coba jaga deret Back-To-Back!"},
['tech_n_plus']= {"Tech", "NORMAL+", "Hanya Spins & PCs dibolehkan"},
['tech_h']= {"Tech", "SULIT", "Coba jaga deret Back-To-Back!"},
['tech_h_plus']= {"Tech", "SULIT+", "Hanya Spins & PCs dibolehkan"},
['tech_l']= {"Tech", "GILA", "Coba jaga deret Back-To-Back!"},
['tech_l_plus']= {"Tech", "GILA+", "Hanya Spins & PCs dibolehkan"},
['tech_finesse']= {"Tech", "EF. TOMBOL", "Efisiensi tombol harus maksimal!"},
['tech_finesse_f']= {"Tech", "EF. TOMBOL+", "Efisiensi tombol maksimal dan anda tidak boleh membuat baris normal!"},
['tech_finesse_lock']= {"Tech", "EF. TBL. TERBATAS", "Jumlah pemencetan tombol terbatas, dan efisiensinya harus maksimal!"},
['tech_finesse_lock_f']= {"Tech", "EF. TBL.+ TERBATAS", "Jumlah pemencetan tombol terbatas, efisiensi tombol harus maksimal, dan anda tidak boleh membuat baris normal!"},
['tsd_e']= {"Tantangan TSD", "MUDAH", "Hanya T-Spin Double dibolehkan!"},
['tsd_h']= {"Tantangan TSD", "SULIT", "Hanya T-Spin Double dibolehkan!"},
['tsd_u']= {"Tantangan TSD", "TERAKHIR", "Hanya T-Spin Double dibolehkan!"},
['backfire_n']= {"Serangan Balik", "NORMAL", "Tahankan serang baliknya!"},
['backfire_h']= {"Serangan Balik", "SULIT", "Tahankan serang baliknya!"},
['backfire_l']= {"Serangan Balik", "GILA", "Tahankan serang baliknya!"},
['backfire_u']= {"Serangan Balik", "TERAKHIR", "Tahankan serang baliknya!"},
['sprintAtk']= {"Balapan", "100 Serangan", "Kirim 100 baris serangan!"},
['sprintEff']= {"Balapan", "Efisiensi", "Kirim lebih banyak serangan sampai 40 baris!"},
['zen']= {"Zen", "200L", "Permainan 200-garis tanpa batas waktu"},
['ultra']= {"Ultra", "EKSTRA", "Permainan 2 menit. Dapatkan nilai sebanyaknya!"},
['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_puzzle']= {"Tersesuai", "TEKA-TEKI"},
['custom_clear']= {"Tersesuai", "NORMAL"},
['custom_puzzle']= {"Tersesuai", "TEKA-TEKI"},
},
getTip={refuseCopy=true,
"(RUR'U')R'FR2U'R'U'(RUR'F')",

View File

@@ -364,6 +364,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[All other test staff]",
"…And You!",
},
@@ -950,6 +951,8 @@ C. ゲームパッド
['tech_l_plus']= {"テクニック", "LUNATIC+", "回転入れとパフェだけ!"},
['tech_finesse']= {"テクニック", "FINESSE", "最適化!"},
['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_h']= {"TSDチャレンジ", "HARD", "TSDだけ!"},
['tsd_u']= {"TSDチャレンジ", "ULTIMATE", "TSDだけ!"},

View File

@@ -351,6 +351,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[All other test staff]",
"…And You!",
},
@@ -887,6 +888,8 @@ return {
['tech_l_plus']= {"Tech", "LUNÁTICO+", "Apenas spins e PC"},
['tech_finesse']= {"Tech", "FINESSE", "Nã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_h']= {"Desafio TSD", "DIFÍCIL", "Apenas T-spin-doubles!"},
['tsd_u']= {"Desafio TSD", "ULTIMATE", "Apenas T-spin-doubles!"},

View File

@@ -92,7 +92,7 @@ return {
exportSuccess="Đã xuất thành công",
importSuccess="Đã nhập thành công",
dataCorrupted="Dữ liệu bị hỏng",
pasteWrongPlace="Bạn đã dán ở nhầm nơi rồi",
pasteWrongPlace="Bạn dán đúng nơi không đấy?",
noFile="Thiếu tệp",
nowPlaying="Đang phát:",
@@ -115,21 +115,21 @@ return {
-- Server's warn/error messages
Techrater={
internalError="Lỗi nội bộ",
databaseError="Lỗi cơ sở dữ liệu",
invalidFormat="Định dạng không hợp lệ",
invalidArguments="Đối số không hợp lệ",
tooFrequent="Quá thường xuyên",
notAvailable="Không khả dụng",
noPermission="Không có quyền",
roomNotFound="Không tìm thấy phòng",
internalError="Lỗi nội bộ\nInternal error",
databaseError="Lỗi cơ sở dữ liệu\nDatabase error",
invalidFormat="Định dạng không hợp lệ\nInvalid format",
invalidArguments="Đối số không hợp lệ\nInvalid arguments",
tooFrequent="Quá thường xuyên\nToo frequent",
notAvailable="Không khả dụng\nNot available",
noPermission="Không có quyền\nNo permission",
roomNotFound="Không tìm thấy phòng\nRoom not found",
-- Controllers
WebSocket={
invalidConnection="Kết nối không hợp lệ",
invalidAction="Hành động không hợp lệ",
playerNotFound="Không tìm thấy người chơi",
connectionFailed="Kết nối thất bại",
invalidConnection="Kết nối không hợp lệ\nInvalid connection",
invalidAction="Hành động không hợp lệ\nInvalid action",
playerNotFound="Không tìm thấy người chơi\nPlayer not found",
connectionFailed="Kết nối thất bại\nConnection failed",
},
-- Filters
CheckPermission={
@@ -139,7 +139,7 @@ return {
ConnectionManager={
playerInvalid="Người chơi không hợp lệ",
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={
noticeNotFound="Không có thông báo",
@@ -187,7 +187,7 @@ return {
serverDown="Ối! Server sập! Hãy quay lại sau",
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",
playerKicked="$1 đã đá $2 khỏi phòng",
becomeHost="$1 giờ là chủ phòng",
@@ -205,8 +205,9 @@ return {
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.",
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={
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",
@@ -215,7 +216,7 @@ return {
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",
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",
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",
@@ -244,7 +245,7 @@ return {
"Lỗi di chuyển:",
},
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={"DPM","ADPM","APM","SPM","LPM","DPM"},
radarData={"DPM","ADPM","APM","SPM","L'PM","DPM"},
stat={
"Số lần bật trò 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",
"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.",
"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.",
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={
"ĐƯỢC SÁNG TÁC BỞI MrZ",
@@ -311,11 +314,12 @@ return {
"(旋律星萤)",
"(T0722)",
"",
"Minh hoạ",
"Hiệu ứng âm thanh & Voice Pack",
"Miya",
"Mono",
"Xiaoya",
"葉枭",
"Mono",
"MrZ",
"Trebor",
"",
"Thiết kế âm nhạc",
"MrZ",
@@ -370,6 +374,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[cùng với các thành viên thử nghiệm khác]",
"…và BẠN!",
},
@@ -387,7 +392,7 @@ return {
]],
support="Hỗ trợ người làm game",
dict={
sizeChanged="Đã đổi cỡ phông: $1",
sizeChanged="Đã chỉnh cỡ phông: $1",
sizeReset="Đã đặt lại cỡ phông!",
helpText=
[[
@@ -474,7 +479,7 @@ C. Tay cầm chơi game (Gamepad):
},
net_newRoom={
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",
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",
smooth="Rơi mượt",
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",
ghost="Độ bóng",
@@ -561,7 +566,7 @@ C. Tay cầm chơi game (Gamepad):
dropFX="H.ứng Thả nhẹ",
moveFX="H.ứng Di chuyển",
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",
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)",
del="Xoá Hàng (L)",
demo="Không hiện “×”",
demo="Không hiện \"×\"",
newPg="Trang mới (N)",
delPg="Xoá trang (M)",
@@ -877,136 +882,138 @@ C. Tay cầm chơi game (Gamepad):
},
},
modes={
['sprint_10l']= {"Sprint", "10L", "Xoá 10 hàng!"},
['sprint_20l']= {"Sprint", "20L", "Xoá 20 hàng!"},
['sprint_40l']= {"Sprint", "40L", "Xoá 40 hàng!"},
['sprint_100l']= {"Sprint", "100L", "Xoá 100 hàng!"},
['sprint_400l']= {"Sprint", "400L", "Xoá 400 hàng!"},
['sprint_1000l']= {"Sprint", "1,000L", "Xoá 1,000 hàng!"},
['sprintPenta']= {"Sprint", "PENTOMINO", "Xoá 40 hàng với 18 pentomino"},
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
['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!"},
['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_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_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_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_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_l']= {"Drought+", "100L", "C L G T"},
['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"},
['solo_e']= {"Battle", "DỄ", "Đánh bại AI!"},
['solo_n']= {"Battle", "THƯỜNG", "Đánh bại AI!"},
['solo_h']= {"Battle", "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!"},
['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_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_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"},
['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_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_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_h']= {"Big", "KHÓ", "Chơi với một bảng nhỏ hơn!"},
['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_m']= {"Master", "M21", "Dành cho cao thủ 20G"},
['master_final']= {"Master", "FINAL", "Dành cho các pháp sư 20G"},
['master_ph']= {"Master", "PHANTASM", "Hả???"},
['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_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_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_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_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_n']= {"Invisible", "THƯỜNG", "Dành cho người đã quen"},
['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_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!"},
['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_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"},
['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_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_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_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_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_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_l']= {"C4W Training", "RẤT KHÓ", "Combo vô tận"},
['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"},
['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_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"},
['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_h']= {"Tech", "KHÓ", "Cố gắng không phá B2B!"},
['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_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_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…
['tsd_h']= {"TSD Challenge", "KHÓ", "Chỉ được làm T-Spin Double!"},
['tsd_u']= {"TSD Challenge", "THÁCH ĐẤU", "Chỉ được làm T-Spin Double!"},
['backfire_n']= {"Backfire", "THƯỜNG", "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"},
['backfire_l']= {"Backfire", "RẤT KHÓ", "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"},
['sprintAtk']= {"Sprint", "100 Attack", "Gửi 100 hàng!"},
['sprintEff']= {"Sprint", "Efficiency", "Gửi càng nhiều hàng càng tốt trong 40 hàng"},
['zen']= {'Zen', "200", "Xoá 200 hàng nhưng không có thời gian giới hạn"},
['ultra']= {'Ultra', "EXTRA", "Lấy càng nhiều điểm càng tốt trong 2 phút"},
['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."},
['sprint_10l']= {"Sprint", "10L", "Xoá 10 hàng!"},
['sprint_20l']= {"Sprint", "20L", "Xoá 20 hàng!"},
['sprint_40l']= {"Sprint", "40L", "Xoá 40 hàng!"},
['sprint_100l']= {"Sprint", "100L", "Xoá 100 hàng!"},
['sprint_400l']= {"Sprint", "400L", "Xoá 400 hàng!"},
['sprint_1000l']= {"Sprint", "1000L", "Xoá 1000 hàng!"},
['sprintPenta']= {"Sprint", "PENTOMINO", "Xoá 40 hàng với 18 pentomino"},
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
['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!"},
['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_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_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_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_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_l']= {"Drought+", "100L", "C L G T"},
['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"},
['solo_e']= {"Battle", "DỄ", "Đánh bại AI!"},
['solo_n']= {"Battle", "THƯỜNG", "Đánh bại AI!"},
['solo_h']= {"Battle", "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!"},
['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_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_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"},
['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_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_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 5 × 10!"},
['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_h']= {"Master", "KHÓ", "Dành cho người chơi đã quen 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_ph']= {"Master", "PHANTASM", "Hả???"},
['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_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_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_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_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_n']= {"Invisible", "THƯỜNG", "Dành cho người đã quen"},
['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_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!"},
['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_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"},
['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_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_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_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_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_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_l']= {"C4W Training", "RẤT KHÓ", "Combo vô tận"},
['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"},
['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_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"},
['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_h']= {"Tech", "KHÓ", "Cố gắng không phá B2B!"},
['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_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_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_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!"},
['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_e']= {"TSD Challenge", "DỄ", "Chỉ được làm T-Spin Double!"}, -- Chỉ được clear…
['tsd_h']= {"TSD Challenge", "KHÓ", "Chỉ được làm T-Spin Double!"},
['tsd_u']= {"TSD Challenge", "THÁCH ĐẤU", "Chỉ được làm T-Spin Double!"},
['backfire_n']= {"Backfire", "THƯỜNG", "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"},
['backfire_l']= {"Backfire", "RẤT KHÓ", "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"},
['sprintAtk']= {"Sprint", "100 Attack", "Gửi 100 hàng!"},
['sprintEff']= {"Sprint", "Efficiency", "Gửi càng nhiều hàng càng tốt trong 40 hàng"},
['zen']= {'Zen', "200", "Xoá 200 hàng nhưng không có thời gian giới hạn"},
['ultra']= {'Ultra', "EXTRA", "Lấy càng nhiều điểm càng tốt trong 2 phút"},
['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_puzzle']= {"Custom", "PUZZLE"},
['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"},
},
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
-- Nhưng User670 khi dịch từ tiếng Trung sang đã chọn lược bỏ bớt một số câu
":dcgpray:",
"Không thể mở Techmino.app vì người làm game đã bay màu",
"Techmino.app là vi rút đấy. Xoá đi",
"TechminOS",
"Không thể mở \"Techmino.app\" vì người làm game đã bay màu",
"\"Techmino.app\" là vi rút đấy. Xoá đi",
"\"TechminOS\"",
"(RURU)RFR2URU(RURF)",
"\\jezevec/\\jezevec/\\jezevec/",
"\\osk/\\osk/\\osk/",
"↑↑↓↓←→←→BA",
"$include<studio.h>",
"0next 0hold",
"1next 0hold",
"1next 1hold!",
"1next 6hold!",
"0 next 0 hold",
"1 next 0 hold",
"1 next 1 hold!",
"1 next 6 hold!",
"6 next 1 hold!",
"6 next 6 hold?!",
"20G thực chất là một chế độ mới đấy!",
"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",
"ALL SPIN!",
"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í!",
"Đâ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!",
"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!",
"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!",
@@ -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",
"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!",
"Techmino là sự kết hợp giữa technique” và “tetromino",
"Techmino là sự kết hợp giữa \"technique\"\"tetromino\"",
"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ả!",
"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.P,"T-spin!"},
{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,"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"},
@@ -1125,7 +1132,7 @@ C. Tay cầm chơi game (Gamepad):
-- 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ʊ/.",
--
"Ủ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?
"Tải Techmino ở đâu vậy? Trên GitHub đấy!",
-- 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 là năm ra mắt chế độ trực tuyến của Techmino.",
-- The Chinese name of this game is '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",
"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\"",
-- This game is not called 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!",
--
"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
"Hảo Techmino",
--
@@ -1156,14 +1163,14 @@ C. Tay cầm chơi game (Gamepad):
-- "Meow!"
"Meow!",
-- 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.",
"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.",
"Thông báo tự dưng hiện lên giữa game? Vào cài đặt tắt nó đi!",
"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.
"Đừ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."
"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"
"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
"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.
@@ -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
"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.
"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)
"Để 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)
{"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.
"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.
"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~
"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!
{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).
@@ -1213,12 +1220,15 @@ C. Tay cầm chơi game (Gamepad):
--
-- IT JOKES
"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 apply",
"git submodule update",
"git commit -m \".\"",
"git push -f",
"git merge --rebase",
"git merge --squash",
"Lua No.1",
"sudo rm -rf /*",
"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",
-- 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."},
-- 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
{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ó 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ộ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\"\"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.",
"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

View File

@@ -363,6 +363,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[All other test staff]",
"…And You!",
},
@@ -937,6 +938,8 @@ return {
['tech_l_plus']= {"科研", "疯狂+", "仅允许spin与PC"},
['tech_finesse']= {"科研", "极简", "强制最简操作"},
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
['tech_finesse_lock']= {"科研", "极简限制", "限制操作次数"},
['tech_finesse_lock_f']={"科研", "极简限制+", "限制操作次数禁止断B2B"},
['tsd_e']= {"TSD挑战", "简单", "你能连续做几个TSD"},
['tsd_h']= {"TSD挑战", "困难", "你能连续做几个TSD"},
['tsd_u']= {"TSD挑战", "极限", "你能连续做几个TSD"},

View File

@@ -311,6 +311,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[All other test staff]",
"…And You!",
},
@@ -854,6 +855,8 @@ return {
['tech_l_plus']= {"Tech(LunaticP);", "", "仅允许spin与PC"},
['tech_finesse']= {"Tech(Finesse);", "", "强制最简操作"},
['tech_finesse_f']= {"Tech(FinesseF);", "", "禁止普通消除,强制最简操作"},
['tech_finesse_lock']= {"Tech(FineeseLock);","", "限制操作次数"},
['tech_finesse_lock_f']={"Tech(FineeseLockF);","", "限制操作次数禁止断B2B"},
['tsd_e']= {"TSD(Easy);", "", "你能连续做几个TSD"},
['tsd_h']= {"TSD(Hard);", "", "你能连续做几个TSD"},
['tsd_u']= {"TSD(Ultimate);", "", "你能连续做几个TSD"},

View File

@@ -363,6 +363,7 @@ return {
"huaji2369",
"Lexitik",
"Tourahi Anime",
"PopUpWaffles",
"[All other test staff]",
"…And You!",
},
@@ -907,6 +908,8 @@ return {
['tech_l_plus']= {"科研", "瘋狂+", "僅允許spin與PC"},
['tech_finesse']= {"科研", "finesse", "強制finesse"},
['tech_finesse_f']= {"科研", "finesse+", "禁止普通清除強制finesse"},
-- ['tech_finesse_lock']= {"科研", "极简限制", "限制操作次数"},
-- ['tech_finesse_lock_f']={"科研", "极简限制+", "限制操作次数禁止断B2B"},
['tsd_e']= {"TSD挑戰", "簡單", "你能連續做幾個TSD"},
['tsd_h']= {"TSD挑戰", "困難", "你能連續做幾個TSD"},
['tsd_u']= {"TSD挑戰", "極限", "你能連續做幾個TSD"},

View File

@@ -1,119 +1,122 @@
Lối chơi:
Hệ thống sẽ cung cấp bạn các tetromino (gạch 4 ô),
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 độ).
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;
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.
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.
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)
Cách phát hiện spin:
Thỏa mãn quy tắc 3 góc” +2 điểm [*]
Thỏa mãn quy tắc bất động” +2 điểm
- Cứ một trong hai điều kiện trên được thỏa mãn, thì sẽ được tính là Spin
Cách phát hiện spin: bằng cách sử dụng hệ thống điểm.
+2 điểm nếu thỏa mãn quy tắc "3 góc"
+2 điểm nếu thỏa mãn quy tắc "bất động"
+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:
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 hoặc T vẫn còn tàn dư của gạch đó sau khi xóa hàng.
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,
Gạch dùng để làm là S, Z, J, L hay T,
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:
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 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.
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,
- 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
- Mini sẽ bị cắt còn 25% (hệ số × 0.25)
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+
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 chỉ còn ¼ so với giá trị ban đầu
Kiểu xóa Đặc biệt (Techrash/Techrash+ không dùng spin):
- 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
Kiểu xóa Đặc biệt (Techrash/Techrash+ nhưng không spin):
B2B gửi thêm 1 hàng
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):
Số combo = số lần bạn xóa hàng liên tiếp - 1 (ch nhn TỐI ĐA combo 12, từ combo 13 về sau sẽ tính thành combo 12).
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.
+1 hàng để tấn công từ Combo 2 trở đi.
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"
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).
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”).
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 để hủy rác tới
Hemi Perfect Clear (xem trong Zictionary)
+4 hàng để tấn công, +2 hàng để đánh chặn
Perfect Clear (All Clear):
- 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.
- +2 hàng để hủy rác.
Perfect Clear (All Clear): Gửi 8 → 16 hàng rác
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)
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 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:
Kiểu xóa đặc biệt:
- Spin Đơn/Đôi/Tam/Techrash/Techrash+ + 50/100/180/800/1000 (×50% nếu là Mini)
- Techrash/Techrash+ + 150/200/...
- PC nếu số PC làm được trong một ván >4, +800
- HPC, +100
Kiểu xóa thường -250
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 +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 từ thứ 4 trở đi có giá trị 800 điểm
— HPC cộng thên 100 điểm
Kiểu xóa thường: -250 điểm
Nếu không: Spin (0 hàng) +20.
LƯU Ý! Thanh B2B không thể sạc qua vạch 800 bằng cách này.
Nếu có spin nhưng không có hàng nào được xóa:
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:
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:
Sát thưng từ Đôi và Tam có hiệu lực nhanh nhất;
Theo sau là Techrash và Spin, chúng tờng gửi tấn công chậm hơn;
Combo dài gửi lâu 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;
Minis cũng có thể kéo dài thời gian chờ thêm chút nữa.
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.
Thời gian chờ của các đòn tấn công n sau, sắp xếp từ nhanh nhất tới lâu nhất:
— Double và Triple (Đôi và Tam) là nhanh nhất
— Theo sau là Techrash, Techrash+, spin; Mini, B2B và B3B có thêm thêm chút thời gian chờ nữa.
— Sát thương từ combo có thời gian chờ lâu nhất..
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.
Tỉ lệ phản công sẽ là 1:1
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ủ.
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)
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 để đá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:
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!
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.
Đá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.
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
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
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ẫ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.
- 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.
- K.O.: Nhắm vào người chơi “đang thở máy, đang hấp hối”.
- Phản công: tấn công tất cả người chơi đang nhắm vào bạn
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 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.
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.
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.
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.
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.
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)
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:
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.
Ở trong chế độ Build (Puzzle):
Nhấn phím F1 để hiện/ẩn mẫu
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)
Ở 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;
ô 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 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í.
Một khi bạn làm khớp với mẫu ban đầu, bạn thắng.
ô 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í.

View File

@@ -1,135 +1,137 @@
return {
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH','sprint123','secret_grade'}},
{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_1000l', x=-800, y=200, size=40,shape=1,icon="sprint3"},
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH','sprint123','secret_grade'}},
{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_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='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='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='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_l', x=-800, y=400, size=40,shape=1,icon="drought"},
{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='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_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_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_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_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_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_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_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='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_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='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_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_u', x=-1400, y=-1000, size=40,shape=1,icon="solo"},
{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_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_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_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='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_u', x=-1300, y=-1800, size=40,shape=1,icon="t99"},
{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_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_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='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_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_u', x=-1400, y=-800, size=40,shape=1,icon="round"},
{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_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_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_h', x=-600, y=-400, size=40,shape=1,icon="big",},
{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='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_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_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_ex', x=170, y=-1450, size=40,shape=2,icon="master_ex"},
{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_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_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_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_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_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_u_plus',x=-300, y=-1380, size=30,shape=2,icon="master"},
{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_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_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='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_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_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='master_instinct',x=285, y=-835, size=40,shape=3,icon="hidden"},
{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_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_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='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_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_u', x=-500, y=-1150, size=30,shape=2,icon="classic"},
{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_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='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_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_u', x=1250, y=-600, size=40,shape=2,icon="survivor"},
{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_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_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_u', x=450, y=-1000, size=40,shape=1,icon="attack"},
{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='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_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='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_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='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_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='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_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='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_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_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_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='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_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_finesse', x=850, y=20, size=40,shape=1,icon="tech", unlock={'tech_finesse_f'}},
{name='tech_finesse_f', x=1050, y=20, size=40,shape=1,icon="tech"},
{name='tech_finesse', x=800, y=20, size=40,shape=1,icon="tech", unlock={'tech_finesse_f'}},
{name='tech_finesse_f',x=1000, y=20, size=40,shape=1,icon="tech"},
{name='tech_finesse_lock', x=850, y=160, size=40,shape=1,icon="tech", unlock={'tech_finesse_lock_f'}},
{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_h', x=960, y=170, size=40,shape=1,icon="tsd", unlock={'tsd_u'}},
{name='tsd_u', x=1200, y=170, size=40,shape=1,icon="tsd"},
{name='tsd_e', x=700, y=250, size=40,shape=1,icon="tsd", unlock={'tsd_h'}},
{name='tsd_h', x=860, y=310, size=40,shape=1,icon="tsd", unlock={'tsd_u'}},
{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_h', x=850, y=320, 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_u', x=1250, y=320, size=35,shape=2,icon="backfire"},
{name='backfire_n', x=640, y=420, size=40,shape=1,icon="backfire", unlock={'backfire_h'}},
{name='backfire_h', x=790, y=470, size=40,shape=1,icon="backfire", unlock={'backfire_l'}},
{name='backfire_l', x=930, y=460, size=40,shape=3,icon="backfire", unlock={'backfire_u'}},
{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='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_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='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='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='marathon_inf', x=-800, y=-400, size=40,shape=1,icon="marathon"}
}

View File

@@ -10,6 +10,13 @@ local function tech_check_hard(P)
P:win('finish')
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 {
env={
@@ -17,6 +24,7 @@ return {
drop=1e99,lock=60,
freshLimit=15,
fineKill=true,
mesDisp=display,
hook_drop=tech_check_hard,
bg='flink',bgm='infinite',
},

View 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,
}

View 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,
}

View File

@@ -242,14 +242,28 @@ local function _mergeFuncTable(f,L)
end
return L
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 ENV=P.gameEnv
-- Apply events
ENV.mesDisp=_mergeFuncTable(ENV.mesDisp,{})
ENV.hook_drop=_mergeFuncTable(ENV.hook_drop,{})
ENV.hook_die=_mergeFuncTable(ENV.hook_die,{})
ENV.task=_mergeFuncTable(ENV.task,{})
for i=1,#hooks do
ENV[hooks[i]]=_mergeFuncTable(ENV[hooks[i]],{})
end
-- Apply eventSet
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)
if eventSet then
for k,v in next,eventSet do
if
k=='mesDisp' or
k=='hook_drop' or
k=='hook_die' or
k=='task'
then
if TABLE.find(hooks,k) then
_mergeFuncTable(v,ENV[k])
elseif type(v)=='table' then
ENV[k]=TABLE.copy(v)

View File

@@ -226,8 +226,10 @@ function Player:act_moveLeft(auto)
end
if self.cur 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.curX=self.curX-1
self.curX=self.curX+self.movDir
self:freshBlock('move')
if not auto then
self.moving=0
@@ -248,8 +250,10 @@ function Player:act_moveRight(auto)
end
if self.cur 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.curX=self.curX+1
self.curX=self.curX+self.movDir
self:freshBlock('move')
if not auto then
self.moving=0
@@ -267,6 +271,7 @@ function Player:act_rotRight()
if self.cur then
self.ctrlCount=self.ctrlCount+1
self:spin(1)
self:_triggerEvent('hook_rotRight')
self.keyPressing[3]=false
end
end
@@ -275,6 +280,7 @@ function Player:act_rotLeft()
if self.cur then
self.ctrlCount=self.ctrlCount+1
self:spin(3)
self:_triggerEvent('hook_rotLeft')
self.keyPressing[4]=false
end
end
@@ -283,6 +289,7 @@ function Player:act_rot180()
if self.cur then
self.ctrlCount=self.ctrlCount+2
self:spin(2)
self:_triggerEvent('hook_rot180')
self.keyPressing[5]=false
end
end

View File

@@ -12,72 +12,220 @@ local keys={
local lastPlayBGM
local inst
local offset
local tempoffset=0
local showingKey
local sharpt,flattt=false,false
local virtualKeys={} -- Virtual key set is near the end of the file.
local touchPosition={}
-- PREPARE VIRTUAL KEYS
-- PREPARE VIRTUAL KEYS
-- NOTE: I made this list because I want to use WIDGET.draw() and don't need another function
-- I will handling the behavior in an other function
local virtualKeys={
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()
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
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='key2' ,x= 165,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'2' },
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='key4' ,x= 345,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'4' },
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='key6' ,x= 525,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'6' },
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='key8' ,x= 755,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'8' },
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='key0' ,x= 935,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'0' },
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=1115,y=335,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'=' },
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='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=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=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=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=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=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=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=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=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=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=function() scene.keyDown('-' ) end},
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=function() scene.keyDown('backspace') end},
-- 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='keyW' ,x= 165,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'w' },
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='keyR' ,x= 345,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'r' },
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='keyY' ,x= 525,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'y' },
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='keyI' ,x= 755,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'i' },
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='keyP' ,x= 935,y=425,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'p' },
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=1115,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=pressKey'\\'},
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=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=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=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=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=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=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=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=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=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=function() scene.keyDown('[' ) end},
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=function() scene.keyDown('\\') end},
-- 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='keyS' ,x= 165,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='W',code=pressKey's' },
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='keyF' ,x= 345,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='N',code=pressKey'f' },
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='keyH' ,x= 525,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'h' },
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='keyK' ,x= 755,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='L',code=pressKey'k' },
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='key;' ,x= 935,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='C',code=pressKey';' },
WIDGET.newKey {name='key\'' ,x=1025,y=515,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'\'' },
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='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=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=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=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=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=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=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=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=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=function() scene.keyDown(';' ) end},
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=function() scene.keyDown('return') end},
-- 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='keyX' ,x= 165,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'x'},
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='keyV' ,x= 345,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'v'},
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='keyN' ,x= 525,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'n'},
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='key,' ,x= 755,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=pressKey'.'},
WIDGET.newKey {name='key/' ,x= 935,y=605,w=75 ,h=75,sound=false,font=35,fText='',color='Z',code=pressKey'/'},
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=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=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=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=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=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=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=function() scene.keyDown(',') end},
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=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='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='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() 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})
@@ -115,127 +263,4 @@ for k=1,#virtualKeys do
function K:drag() end
function K:release() 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

View File

@@ -8,6 +8,7 @@ local scene={}
local dict-- Dict list
local result-- Result Lable
local localeFile -- Language file name, used for force reload
local lastTickInput
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.rectangle('fill',0,0,280,35)
end
setFont(30)
-- Name & color
GC.shadedPrint(item.title,10,-3,'left',1,COLOR.D,typeColor[item.type])
end}
-- 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
local function _clearResult()
TABLE.cut(result)
listBox.selected=1
searchWait,lastSearch=0,false
listBox.selected,lastSelected,searchWait,lastSearch=1,1,0,false
scene.widgetList.copy.hide=false
_updateInfoBox()
end
-- Search through the dictionary
local function _search()
local input=inputBox:getText():lower()
local input=inputBox:getText()
local pos
_clearResult()
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
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
ins(result,1,dict[i])
first=true
@@ -90,12 +129,17 @@ local function _search()
if #result>0 then SFX.play('reach') end
lastSearch=input
_updateInfoBox()
end
-- Jump over n items
local function _jumpover(key,n)
local dir=(key=='left' or key=='pageup') and 'up' or 'down'
for _=1,n or 1 do scene.widgetList.listBox:arrowKey(dir) end
_updateInfoBox()
lastSelected=listBox.selected
scene.widgetList.copy.hide=false
end
-- Copy the content
@@ -107,58 +151,20 @@ local function _copy()
MES.new('info',text.copyDone)
end
-- Update the infobox
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
-- Changing font size, z=0 --> reset
local function _setZoom(z)
if z~=0 then
currentFontSize=MATH.clamp(currentFontSize+z,15,40)
textBox.font=currentFontSize
textBox.lineH=currentFontSize*7/5 -- Recalculate the line's height
textBox.capacity=math.ceil((textBox.h-10)/textBox.lineH)
_updateTextBox()
MES.new("check",text.dict.sizeChanged:repD(currentFontSize),1.26)
end
currentFontSize=MATH.clamp(z~=0 and currentFontSize+z or 25,15,40)
textBox.font=currentFontSize
textBox.lineH=currentFontSize*7/5 -- Recalculate the line's height
textBox.capacity=math.ceil((textBox.h-10)/textBox.lineH)
_updateInfoBox()
MES.new("check",z~=0 and text.dict.sizeChanged:repD(currentFontSize) or text.dict.sizeReset,1.26)
end
-- Reset everything when opening Zictionary
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)
inputBox:clear()
@@ -166,9 +172,9 @@ function scene.enter()
searchWait=0
lastSelected=0
listBox.selected=1
listBox.scrollPos=0
lastSearch=false
listBox:setList(_getList())
scene.widgetList.help.color=COLOR.Z
if not MOBILE then WIDGET.focus(inputBox) end
BG.set('rainbow')
@@ -182,6 +188,8 @@ function scene.wheelMoved(_,y)
end
end
function scene.keyDown(key)
local inputBoxFocus=WIDGET.isFocus(inputBox)
-- Switching selected items
if key=='up' or key=='down' then
textBox:scroll(key=='up' and -1 or 1)
@@ -194,10 +202,9 @@ function scene.keyDown(key)
_copy()
end
elseif key=='-' or key=='=' then
_setZoom((key=='-' or key=='kp-') and -5 or 5)
elseif key=='0' then
_resetZoom()
elseif (key=='-' or key=='=' or key=='0') and (inputBox:getText()=="" or not inputBoxFocus) and not MOBILE then
WIDGET.unFocus(true)
_setZoom(key=='0' and 0 or key=='-' and -5 or 5)
elseif key=='application' and listBox.selected>=0 then
local url=_getList()[listBox.selected].url
@@ -207,7 +214,7 @@ function scene.keyDown(key)
_clearResult()
inputBox:clear()
SFX.play('hold')
_updateTextBox()
_updateInfoBox()
end
elseif key=='escape' then
if inputBox:hasText() then
@@ -216,12 +223,40 @@ function scene.keyDown(key)
SCN.back()
end
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
_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
if not WIDGET.isFocus(inputBox) then WIDGET.focus(inputBox) end
if not inputBoxFocus then WIDGET.focus(inputBox) end
return true
end
end
@@ -238,10 +273,7 @@ function scene.gamepadDown(key)
elseif key=='dpleft' or key=='dpright' then
_jumpover(key:gsub('dp',''),Joystick:isGamepadDown('a') and 12)
elseif key=='y' then
listBox.selected=0
inputBox:clear()
searchWait=0
_updateTextBox()
scene.keyDown('f1')
elseif key=='back' then
SCN.back()
end
@@ -264,26 +296,25 @@ function scene.update(dt)
_search()
end
end
if lastSelected~=listBox.selected then
_updateTextBox()
if listBox.selected~=lastSelected and listBox.selected~=0 then
if listBox.selected==0 then scene.keyDown('f1') end
lastSelected=listBox.selected
scene.widgetList.copy.hide=false
_updateInfoBox()
end
end
function scene.draw()
-- Order: list, info, keys
-- Draw background
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
gc.setLineWidth(2)
gc.setColor(COLOR.Z)
gc.rectangle('line',1194,340,80,366,5)
gc.line(1194,560,1274,560)
setFont(30)
gc.rectangle('line',1194,335,80,370,5)
gc.line(1194,555,1274,555)
gc.rectangle('line',1194,180,80,80 ,5) -- Help key
if searchWait>0 then
local r=TIME()*2
@@ -294,22 +325,22 @@ function scene.draw()
end
scene.widgetList={
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='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'},
listBox,
inputBox,
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='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='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=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='zoomout', x=1234,y=450,w=60,font=40,fText="a", 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='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=445,w=60,font=40,fText=CHAR.icon.zoomOut, code=function() _setZoom(-5) 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}
}
-- 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
return scene
-- 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

View File

@@ -67,7 +67,7 @@ local function _moveMap(dx,dy)
local k=_getK()
local x,y=_getPos()
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)
end
function scene.wheelMoved(_,dy)
@@ -308,9 +308,12 @@ function scene.draw()
gc_setColor(COLOR.lX)
gc_rectangle('fill',920,0,360,720,5)-- Info board
gc_setColor(COLOR.Z)
setFont(40)GC.mStr(text.modes[sel][1],1100,5)
setFont(30)GC.mStr(text.modes[sel][2],1100,50)
setFont(25)gc_printf(text.modes[sel][3],920,110,360,'center')
local modeText=text.modes[sel]
if modeText then
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
gc_draw(IMG.ctrlSpeedLimit,1230,50,nil,.4)
end