越南语变音字母简化函数改为全unicode版本
限制自定义菜单背景选择范围 微调自定义背景设置ui 整理代码
This commit is contained in:
48
Zframework/diacritics.txt
Normal file
48
Zframework/diacritics.txt
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
Á=A,Ă=A,Ắ=A,Ặ=A,Ằ=A,Ẳ=A,Ẵ=A,Ǎ=A,Â=A,Ấ=A,Ậ=A,Ầ=A,Ẩ=A,Ẫ=A,Ä=A,Ạ=A,À=A,Ả=A,Ā=A,Ą=A,Å=A,Ǻ=A,Ã=A,Æ=AE,Ǽ=AE
|
||||||
|
Ḅ=B,Ɓ=B,ʚ=B,ɞ=B
|
||||||
|
Ć=C,Č=C,Ç=C,Ĉ=C,Ċ=C,Ɔ=C,ʗ=C
|
||||||
|
Ď=D,Ḓ=D,Ḍ=D,Ɗ=D,Ḏ=D,Dz=DZ,Dž=DZ,Đ=D,Ð=D,DZ=DZ,DŽ=DZ
|
||||||
|
É=E,Ĕ=E,Ě=E,Ê=E,Ế=E,Ệ=E,Ề=E,Ể=E,Ễ=E,Ë=E,Ė=E,Ẹ=E,È=E,Ẻ=E,Ē=E,Ę=E,Ẽ=E,Ɛ=E,Ə=E
|
||||||
|
Ƒ=F
|
||||||
|
Ǵ=G,Ğ=G,Ǧ=G,Ģ=G,Ĝ=G,Ġ=G,Ḡ=G,ʛ=G
|
||||||
|
Ḫ=H,Ĥ=H,Ḥ=H,Ħ=H
|
||||||
|
Í=I,Ĭ=I,Ǐ=I,Î=I,Ï=I,İ=I,Ị=I,Ì=I,Ỉ=I,Ī=I,Į=I,Ĩ=I,IJ=IJ
|
||||||
|
Ĵ=J
|
||||||
|
Ķ=K,Ḳ=K,Ƙ=K,Ḵ=K
|
||||||
|
Ĺ=L,Ƚ=L,Ľ=L,Ļ=L,Ḽ=L,Ḷ=L,Ḹ=L,Ḻ=L,Ŀ=L,Lj=Lj,Ł=L,LJ=LJ
|
||||||
|
Ḿ=M,Ṁ=M,Ṃ=M
|
||||||
|
Ń=N,Ň=N,Ņ=N,Ṋ=N,Ṅ=N,Ṇ=N,Ǹ=N,Ɲ=N,Ṉ=N,Nj=Nj,Ñ=N,NJ=NJ
|
||||||
|
Ó=O,Ŏ=O,Ǒ=O,Ô=O,Ố=O,Ộ=O,Ồ=O,Ổ=O,Ỗ=O,Ö=O,Ọ=O,Ő=O,Ò=O,Ỏ=O,Ơ=O,Ớ=O,Ợ=O,Ờ=O,Ở=O,Ỡ=O,Ō=O,Ɵ=O,Ǫ=O,Ø=O,Ǿ=O,Õ=O,Œ=OE,ɶ=Oe
|
||||||
|
Þ=P
|
||||||
|
Ŕ=R,Ř=R,Ŗ=R,Ṙ=R,Ṛ=R,Ṝ=R,Ṟ=R,ʁ=R
|
||||||
|
Ś=S,Š=S,Ş=S,Ŝ=S,Ș=S,Ṡ=S,Ṣ=S,ẞ=S
|
||||||
|
Ť=T,Ţ=T,Ṱ=T,Ț=T,Ṭ=T,Ṯ=T,Ŧ=T,Þ=T,Ð=T
|
||||||
|
Ú=U,Ŭ=U,Ǔ=U,Û=U,Ü=U,Ǘ=U,Ǚ=U,Ǜ=U,Ǖ=U,Ụ=U,Ű=U,Ù=U,Ủ=U,Ư=U,Ứ=U,Ự=U,Ừ=U,Ử=U,Ữ=U,Ū=U,Ų=U,Ů=U,Ũ=U
|
||||||
|
Ẃ=W,Ŵ=W,Ẅ=W,Ẁ=W,ʬ=W
|
||||||
|
Ý=Y,Ŷ=Y,Ÿ=Y,Ẏ=Y,Ỵ=Y,Ỳ=Y,Ƴ=Y,Ỷ=Y,Ȳ=Y,Ỹ=Y
|
||||||
|
Ź=Z,Ž=Z,Ż=Z,Ẓ=Z,Ẕ=Z,Ƶ=Z
|
||||||
|
á=a,ă=a,ắ=a,ặ=a,ằ=a,ẳ=a,ẵ=a,ǎ=a,â=a,ấ=a,ậ=a,ầ=a,ẩ=a,ẫ=a,ä=a,ạ=a,à=a,ả=a,ā=a,ą=a,å=a,ǻ=a,ã=a,æ=a,ǽ=a,ɑ=a,ɐ=a,ɒ=a
|
||||||
|
ḅ=b,ɓ=b,ß=b
|
||||||
|
ć=c,č=c,ç=c,ĉ=c,ɕ=c,ċ=c
|
||||||
|
ď=d,ḓ=d,ḍ=d,ɗ=d,ḏ=d,đ=d,ɖ=d,ʤ=d,dz=d,ʣ=d,ʥ=d,dž=d,ð=d
|
||||||
|
é=e,ĕ=e,ě=e,ê=e,ế=e,ệ=e,ề=e,ể=e,ễ=e,ë=e,ė=e,ẹ=e,è=e,ẻ=e,ē=e,ę=e,ẽ=e,ʒ=e,ǯ=e,ʓ=e,ɘ=e,ɜ=e,ɝ=e,ə=e,ɚ=e,ʚ=e,ɞ=e
|
||||||
|
ƒ=f,ſ=f,ʩ=f,fi=f,fl=f,ʃ=f,ʆ=f,ʅ=f,ɟ=f,ʄ=f
|
||||||
|
ǵ=g,ğ=g,ǧ=g,ģ=g,ĝ=g,ġ=g,ɠ=g,ḡ=g,ɡ=g,ɣ=g
|
||||||
|
ḫ=h,ĥ=h,ḥ=h,ɦ=h,ẖ=h,ħ=h,ɧ=h,ɥ=h,ʮ=h,ʯ=h,ų=h
|
||||||
|
í=i,ĭ=i,ǐ=i,î=i,ï=i,ị=i,ì=i,ỉ=i,ī=i,į=i,ɨ=i,ĩ=i,ɩ=i,ı=i,ij=ij,ɟ=i
|
||||||
|
ǰ=j,ĵ=j,ʝ=j,ȷ=j,ɟ=j,ʄ=j
|
||||||
|
ķ=k,ḳ=k,ƙ=k,ḵ=k,ĸ=k,ʞ=k
|
||||||
|
ĺ=l,ƚ=l,ɬ=l,ľ=l,ļ=l,ḽ=l,ḷ=l,ḹ=l,ḻ=l,ŀ=l,ɫ=l,ɭ=l,ł=l,ƛ=l,ɮ=lz,lj=lj,ʪ=ls,ʫ=lz
|
||||||
|
ḿ=m,ṁ=m,ṃ=m,ɱ=m,ɯ=m,ɰ=m
|
||||||
|
ʼn=n,ń=n,ň=n,ņ=n,ṋ=n,ṅ=n,ṇ=n,ǹ=n,ɲ=n,ṉ=n,ɳ=n,ñ=n,nj=nj,ŋ=n,Ŋ=n
|
||||||
|
ó=o,ŏ=o,ǒ=o,ô=o,ố=o,ộ=o,ồ=o,ổ=o,ỗ=o,ö=o,ọ=o,ő=o,ò=o,ỏ=o,ơ=o,ớ=o,ợ=o,ờ=o,ở=o,ỡ=o,ō=o,ǫ=o,ø=o,ǿ=o,õ=o,ɛ=o,ɔ=o,ɵ=o,ʘ=o,œ=oe
|
||||||
|
ɸ=p,þ=p
|
||||||
|
ʠ=q
|
||||||
|
ŕ=r,ř=r,ŗ=r,ṙ=r,ṛ=r,ṝ=r,ɾ=r,ṟ=r,ɼ=r,ɽ=r,ɿ=r,ɹ=r,ɻ=r,ɺ=r
|
||||||
|
ś=s,š=s,ş=s,ŝ=s,ș=s,ṡ=s,ṣ=s,ʂ=s,ſ=s,ʃ=s,ʆ=s,ß=s,ʅ=s
|
||||||
|
ť=t,ţ=t,ṱ=t,ț=t,ẗ=t,ṭ=t,ṯ=t,ʈ=t,ŧ=t,ʨ=t,ʧ=t,þ=t,ð=t,ʦ=t,ʇ=t
|
||||||
|
ʉ=u,ú=u,ŭ=u,ǔ=u,û=u,ü=u,ǘ=u,ǚ=u,ǜ=u,ǖ=u,ụ=u,ű=u,ù=u,ủ=u,ư=u,ứ=u,ự=u,ừ=u,ử=u,ữ=u,ū=u,ų=u,ů=u,ũ=u,ʊ=u
|
||||||
|
ʋ=v,ʌ=v
|
||||||
|
ẃ=w,ŵ=w,ẅ=w,ẁ=w,ʍ=w
|
||||||
|
ý=y,ŷ=y,ÿ=y,ẏ=y,ỵ=y,ỳ=y,ƴ=y,ỷ=y,ȳ=y,ỹ=y,ʎ=y
|
||||||
|
ź=z,ž=z,ʑ=z,ż=z,ẓ=z,ẕ=z,ʐ=z,ƶ=z
|
||||||
@@ -37,7 +37,7 @@ do-- function STRING.shiftChar(c)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- [LOW PERFORMANCE!]
|
-- [LOW PERFORMANCE!]
|
||||||
local upperData,lowerData,VIdiaData
|
local upperData,lowerData,diaData
|
||||||
function STRING.upperUTF8(str)
|
function STRING.upperUTF8(str)
|
||||||
for _,pair in next,upperData do
|
for _,pair in next,upperData do
|
||||||
str=str:gsub(pair[1],pair[2])
|
str=str:gsub(pair[1],pair[2])
|
||||||
@@ -50,12 +50,8 @@ function STRING.lowerUTF8(str)
|
|||||||
end
|
end
|
||||||
return str
|
return str
|
||||||
end
|
end
|
||||||
--[[
|
function STRING.remDiacritics(str)
|
||||||
[FOR VIETNAMESE ONLY]
|
for _,pair in next,diaData do
|
||||||
Remove all diacritics in strings written in Vietnamese
|
|
||||||
]]
|
|
||||||
function STRING.viRemoveDiacritics(str)
|
|
||||||
for _,pair in next,VIdiaData do
|
|
||||||
str=str:gsub(pair[1],pair[2])
|
str=str:gsub(pair[1],pair[2])
|
||||||
end
|
end
|
||||||
return str
|
return str
|
||||||
@@ -402,43 +398,31 @@ function STRING.unpackTable(t)
|
|||||||
end
|
end
|
||||||
|
|
||||||
do
|
do
|
||||||
local function readF(fname)
|
local function parseFile(fname)
|
||||||
|
local d
|
||||||
if love and love.filesystem and type(love.filesystem.read)=='function' then
|
if love and love.filesystem and type(love.filesystem.read)=='function' then
|
||||||
f=love.filesystem.read(fname)
|
d=love.filesystem.read(fname)
|
||||||
else
|
else
|
||||||
local f=io.open(fname,'r')
|
local f=io.open(fname,'r')
|
||||||
local d=f:read('a')
|
if f then
|
||||||
f:close()
|
d=f:read('a')
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return f
|
|
||||||
end
|
|
||||||
upperData=readF('Zframework/upcaser.txt')
|
|
||||||
lowerData=readF('Zframework/lowcaser.txt')
|
|
||||||
VIdiaData=readF('Zframework/vi_diaractics.txt')
|
|
||||||
|
|
||||||
local function splitData(data)
|
if not d then
|
||||||
for i=1,#data do
|
print("ERROR: Failed to read the data from "..fname)
|
||||||
local pair=STRING.split(data[i],'=')
|
return {}
|
||||||
data[i]=pair
|
|
||||||
end
|
end
|
||||||
return data
|
d=STRING.split(gsub(d,'\n',','),',')
|
||||||
end
|
for i=1,#d do
|
||||||
if upperData then upperData=splitData(STRING.split(gsub(upperData,'\n',','),','))
|
d[i]=STRING.split(d[i],'=')
|
||||||
else
|
end
|
||||||
upperData={}
|
return d
|
||||||
LOG('ERROR: Failed to read the data from Zframework/upcaser.txt')
|
|
||||||
end
|
|
||||||
if lowerData then lowerData=splitData(STRING.split(gsub(lowerData,'\n',','),','))
|
|
||||||
else
|
|
||||||
lowerData={}
|
|
||||||
LOG('ERROR: Failed to read the data from Zframework/lowcaser.txt')
|
|
||||||
end
|
|
||||||
|
|
||||||
if VIdiaData then VIdiaData=splitData(STRING.split(gsub(VIdiaData,'\n',','),','))
|
|
||||||
else
|
|
||||||
VIdiaData={}
|
|
||||||
LOG('ERROR: Failed to read the data from Zframework/vi_diaractics.txt')
|
|
||||||
end
|
end
|
||||||
|
upperData=parseFile('Zframework/upcaser.txt')
|
||||||
|
lowerData=parseFile('Zframework/lowcaser.txt')
|
||||||
|
diaData=parseFile('Zframework/diacritics.txt')
|
||||||
end
|
end
|
||||||
|
|
||||||
return STRING
|
return STRING
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
Á=A,À=A,Ả=A,Ã=A,Ạ=A,Ă=A,Ắ=A,Ằ=A,Ẳ=A,Ẵ=A,Ặ=A,Â=A,Ấ=A,Ầ=A,Ẩ=A,Ẫ=A,Ậ=A
|
|
||||||
á=a,à=a,ả=a,ã=a,ạ=a,ă=a,ắ=a,ằ=a,ẳ=a,ẵ=a,ặ=a,â=a,ấ=a,ầ=a,ẩ=a,ẫ=a,ậ=a
|
|
||||||
Đ=D,đ=d
|
|
||||||
É=E,È=E,Ẻ=E,Ẽ=E,Ẹ=E,Ê=E,Ế=E,Ề=E,Ể=E,Ễ=E,Ệ=E
|
|
||||||
é=e,è=e,ẻ=e,ẽ=e,ẹ=e,ê=e,ế=e,ề=e,ể=e,ễ=e,ệ=e
|
|
||||||
Í=I,Ì=I,Ỉ=I,Ĩ=I,Ị=I
|
|
||||||
í=i,ì=i,ỉ=i,ĩ=i,ị=i
|
|
||||||
Ó=O,Ò=O,Ỏ=O,Õ=O,Ọ=O,Ô=O,Ố=O,Ồ=O,Ổ=O,Ỗ=O,Ộ=O,Ơ=O,Ớ=O,Ờ=O,Ở=O,Ỡ=O,Ợ=O
|
|
||||||
ó=o,ò=o,ỏ=o,õ=o,ọ=o,ô=o,ố=o,ồ=o,ổ=o,ỗ=o,ộ=o,ơ=o,ớ=o,ờ=o,ở=o,ỡ=o,ợ=o
|
|
||||||
Ú=U,Ù=U,Ủ=U,Ũ=U,Ụ=U,Ư=U,Ứ=U,Ừ=U,Ử=U,Ữ=U,Ự=U
|
|
||||||
ú=u,ù=u,ủ=u,ũ=u,ụ=u,ư=u,ứ=u,ừ=u,ử=u,ữ=u,ự=u
|
|
||||||
Ý=Y,Ỳ=Y,Ỷ=Y,Ỹ=Y,Ỵ=Y,ý=y,ỳ=y,ỷ=y,ỹ=y,ỵ=y
|
|
||||||
18
main.lua
18
main.lua
@@ -49,19 +49,15 @@ SCR.setSize(1280,720) -- Initialize Screen size
|
|||||||
BGM.setMaxSources(5)
|
BGM.setMaxSources(5)
|
||||||
VOC.setDiversion(.62)
|
VOC.setDiversion(.62)
|
||||||
|
|
||||||
ChangeButtonColorIfThemeUsed=function()
|
WIDGET.setOnChange(function()
|
||||||
if SCN.cur~='net_game' and SCN.cur~='custom_field' then
|
if SCN.cur=='net_game' or SCN.cur=='custom_field' then return end
|
||||||
local colorList=THEME.getThemeColor()
|
local colorList=THEME.getThemeColor()
|
||||||
if colorList then
|
if colorList then
|
||||||
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
||||||
if W.color then
|
W.color=W.color and colorList[math.random(#colorList)]
|
||||||
W.color=colorList[math.random(#colorList)]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end)
|
||||||
WIDGET.setOnChange(ChangeButtonColorIfThemeUsed)
|
|
||||||
|
|
||||||
-- Create shortcuts
|
-- Create shortcuts
|
||||||
setFont=FONT.set
|
setFont=FONT.set
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ return {
|
|||||||
GC.rectangle('line',0,240,126,80,4)
|
GC.rectangle('line',0,240,126,80,4)
|
||||||
GC.setColor(.98,.98,.98,.4)
|
GC.setColor(.98,.98,.98,.4)
|
||||||
GC.rectangle('fill',0+2,240+2,126-4,80-4,2) -- draw time box
|
GC.rectangle('fill',0+2,240+2,126-4,80-4,2) -- draw time box
|
||||||
|
|
||||||
setFont(45) -- Draw time text
|
setFont(45) -- Draw time text
|
||||||
local t=(P.stat.frame-D.prevSectTime)/60
|
local t=(P.stat.frame-D.prevSectTime)/60
|
||||||
local T=("%.1f"):format(60-t)
|
local T=("%.1f"):format(60-t)
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ do-- function applySettings()
|
|||||||
light={.2,.8},
|
light={.2,.8},
|
||||||
color={-.2,1.2},
|
color={-.2,1.2},
|
||||||
}
|
}
|
||||||
function applySettings(arg)
|
function applySettings(reason)
|
||||||
-- Apply language
|
-- Apply language
|
||||||
text=LANG.get(SETTING.locale)
|
text=LANG.get(SETTING.locale)
|
||||||
WIDGET.setLang(text.WidgetText)
|
WIDGET.setLang(text.WidgetText)
|
||||||
@@ -157,34 +157,33 @@ do-- function applySettings()
|
|||||||
SHADER.fieldSatur:send('k',m[2])
|
SHADER.fieldSatur:send('k',m[2])
|
||||||
|
|
||||||
-- Apply BG
|
-- Apply BG
|
||||||
if not (arg and arg=='fullscreen') then
|
if reason=='fullscreen' then return end
|
||||||
if SETTING.bg=='on' then
|
if SETTING.bg=='on' then
|
||||||
BG.unlock()
|
BG.unlock()
|
||||||
BG.setDefault(SETTING.defaultBG)
|
BG.setDefault(SETTING.defaultBG)
|
||||||
BG.set()
|
BG.set()
|
||||||
if SETTING.lockBG then BG.lock() end
|
if SETTING.lockBG then BG.lock() end
|
||||||
elseif SETTING.bg=='off' then
|
elseif SETTING.bg=='off' then
|
||||||
|
BG.unlock()
|
||||||
|
BG.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
||||||
|
BG.lock()
|
||||||
|
elseif SETTING.bg=='custom' then
|
||||||
|
if love.filesystem.getInfo('conf/customBG') then
|
||||||
|
local res,image=pcall(GC.newImage,love.filesystem.newFile('conf/customBG'))
|
||||||
|
if res then
|
||||||
|
BG.unlock()
|
||||||
|
GC.setDefaultFilter('linear','linear')
|
||||||
|
BG.set('custom',SETTING.bgAlpha,image)
|
||||||
|
GC.setDefaultFilter('nearest','nearest')
|
||||||
|
BG.lock()
|
||||||
|
else
|
||||||
|
MES.new('error',text.customBGloadFailed)
|
||||||
|
end
|
||||||
|
else-- Switch off when custom BG not found
|
||||||
|
SETTING.bg='off'
|
||||||
BG.unlock()
|
BG.unlock()
|
||||||
BG.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
BG.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
||||||
BG.lock()
|
BG.lock()
|
||||||
elseif SETTING.bg=='custom' then
|
|
||||||
if love.filesystem.getInfo('conf/customBG') then
|
|
||||||
local res,image=pcall(GC.newImage,love.filesystem.newFile('conf/customBG'))
|
|
||||||
if res then
|
|
||||||
BG.unlock()
|
|
||||||
GC.setDefaultFilter('linear','linear')
|
|
||||||
BG.set('custom',SETTING.bgAlpha,image)
|
|
||||||
GC.setDefaultFilter('nearest','nearest')
|
|
||||||
BG.lock()
|
|
||||||
else
|
|
||||||
MES.new('error',text.customBGloadFailed)
|
|
||||||
end
|
|
||||||
else-- Switch off when custom BG not found
|
|
||||||
SETTING.bg='off'
|
|
||||||
BG.unlock()
|
|
||||||
BG.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
|
||||||
BG.lock()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -196,7 +195,7 @@ local function getSmallNum(num)
|
|||||||
local str=tostring(num)
|
local str=tostring(num)
|
||||||
local out=""
|
local out=""
|
||||||
for i=1,#str do
|
for i=1,#str do
|
||||||
out=out..smallDigits[tonumber(string.sub(str,i,i))]
|
out=out..smallDigits[tonumber(str:sub(i,i))]
|
||||||
end
|
end
|
||||||
return out
|
return out
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -584,7 +584,7 @@ Tốc độ gạch rơi xuống. Đơn vị là "G".
|
|||||||
Chỉ số hàng gạch rơi xuống trong một khung hình.
|
Chỉ số hàng gạch rơi xuống trong một khung hình.
|
||||||
Con số này luôn đi kèm với giả thiết là game đang chạy ở 60FPS.
|
Con số này luôn đi kèm với giả thiết là game đang chạy ở 60FPS.
|
||||||
|
|
||||||
Ví dụ: gạch di chuyển xuống 1 ô / 60 khung hình (1 ô / giây) thì tốc độ rơi là ¹⁄₆₀ G
|
Ví dụ: gạch di chuyển xuống 1 ô / 60 khung hình (1 ô / giây) thì tốc độ rơi là ¹⁄₆₀ G
|
||||||
|
|
||||||
Tốc độ tối đa của game xếp gạch hiện đại là 20G (bởi vì có 20 hàng trong vùng nhìn thấy được).
|
Tốc độ tối đa của game xếp gạch hiện đại là 20G (bởi vì có 20 hàng trong vùng nhìn thấy được).
|
||||||
|
|
||||||
@@ -712,7 +712,7 @@ Techmino cũng có finesse rate (%) (tỉ lệ *không* mắc lỗi di chuyển)
|
|||||||
- 0% (Truợt - Miss) khi số lần nhấn phím cao hơn mức chuẩn 3 phím
|
- 0% (Truợt - Miss) khi số lần nhấn phím cao hơn mức chuẩn 3 phím
|
||||||
Một Bad hoặc Miss sẽ phá combo finesse.
|
Một Bad hoặc Miss sẽ phá combo finesse.
|
||||||
|
|
||||||
Lưu ý:
|
Lưu ý:
|
||||||
- Finesse thường sẽ không được tính trong một vài tình huống như tốc độ rơi cao, phải sử dụng thả nhẹ hay bảng rất cao. Tuy nhiên, bộ đếm finesse của Techmino vẫn chạy bất chấp ở điều kiện nào (kể cả tốc độ rơi cao như 20G). Do vậy finesse rate thường sẽ không mang ý nghĩa gì trong trường hợp này.
|
- Finesse thường sẽ không được tính trong một vài tình huống như tốc độ rơi cao, phải sử dụng thả nhẹ hay bảng rất cao. Tuy nhiên, bộ đếm finesse của Techmino vẫn chạy bất chấp ở điều kiện nào (kể cả tốc độ rơi cao như 20G). Do vậy finesse rate thường sẽ không mang ý nghĩa gì trong trường hợp này.
|
||||||
- Bạn sẽ không bị mất Finesse khi bạn nhét gạch hay thực hiện Spin vì Techmino chỉ kiểm tra những vị trí không yêu cầu soft drop
|
- Bạn sẽ không bị mất Finesse khi bạn nhét gạch hay thực hiện Spin vì Techmino chỉ kiểm tra những vị trí không yêu cầu soft drop
|
||||||
]],
|
]],
|
||||||
|
|||||||
@@ -589,7 +589,7 @@ C. Gamepad
|
|||||||
bg_off="No B.G.",
|
bg_off="No B.G.",
|
||||||
bg_custom="Custom B.G.",
|
bg_custom="Custom B.G.",
|
||||||
defaultBG="Default B.G.",
|
defaultBG="Default B.G.",
|
||||||
resetDbg="Reset default B.G.",
|
resetDbg="Reset to default",
|
||||||
lockBG="Lock B.G.",
|
lockBG="Lock B.G.",
|
||||||
noTheme="Disable theme",
|
noTheme="Disable theme",
|
||||||
|
|
||||||
|
|||||||
@@ -884,7 +884,7 @@ return {
|
|||||||
-- ['blind_h']= {"Invisible", "INSTANT", "For the experienced"},
|
-- ['blind_h']= {"Invisible", "INSTANT", "For the experienced"},
|
||||||
-- ['blind_l']= {"Invisible", "NO GHOST", "For professionals"},
|
-- ['blind_l']= {"Invisible", "NO GHOST", "For professionals"},
|
||||||
-- ['blind_u']= {"Invisible", "NO FIELD", "Are you ready?"},
|
-- ['blind_u']= {"Invisible", "NO FIELD", "Are you ready?"},
|
||||||
-- ['blind_wtf']= {"Invisible", "VOID", "You're not ready."},
|
-- ['blind_wtf']= {"Invisible", "VOID", "You're not ready."},
|
||||||
['blind_e']= {"A Ciegas", "Parcial", "Para novatos."},
|
['blind_e']= {"A Ciegas", "Parcial", "Para novatos."},
|
||||||
['blind_n']= {"A Ciegas", "Total", "Para jugadores intermedios."},
|
['blind_n']= {"A Ciegas", "Total", "Para jugadores intermedios."},
|
||||||
['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados."},
|
['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados."},
|
||||||
|
|||||||
@@ -600,8 +600,7 @@ C. Tay cầm chơi game (Gamepad):
|
|||||||
bg_off="Không ảnh nền",
|
bg_off="Không ảnh nền",
|
||||||
bg_custom="Ảnh nền tự chọn",
|
bg_custom="Ảnh nền tự chọn",
|
||||||
defaultBG="Nền mặc định",
|
defaultBG="Nền mặc định",
|
||||||
-- resetDbg='Đặt lại →',
|
resetDbg='Đặt lại',
|
||||||
resetDbg="Đặt lại ảnh nền mặc định",
|
|
||||||
lockBG="Khóa ảnh nền",
|
lockBG="Khóa ảnh nền",
|
||||||
noTheme="Tắt theme",
|
noTheme="Tắt theme",
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ Hệ thống tính điểm:
|
|||||||
|
|
||||||
Khoảng thời gian chờ trước khi tấn công:
|
Khoảng thời gian chờ trước khi tấn công:
|
||||||
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.
|
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 như sau, sắp xếp từ nhanh nhất tới lâu nhất:
|
Thời gian chờ của các đòn tấn công như sau, sắp xếp từ nhanh nhất tới lâu nhất:
|
||||||
— Double và Triple (Đôi và Tam) là nhanh 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.
|
— 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..
|
— Sát thương từ combo có thời gian chờ lâu nhất..
|
||||||
@@ -107,14 +107,14 @@ Chế độ Battle Royale:
|
|||||||
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.
|
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.
|
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)
|
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ủ.
|
Người cuối cùng trụ lại thành công sẽ là người chiến thắng sau khi đã loại được toàn bộ đối thủ.
|
||||||
|
|
||||||
|
|
||||||
Chế độ Tự do:
|
Chế độ Tự do:
|
||||||
Bạn có thể tự do tùy chỉnh nhiều thông số (nhưng không bao gồm các hiệu ứng đặc biệt từ các chế độ khác).
|
Bạn có thể tự do tùy chỉnh nhiều thông số (nhưng không bao gồm các hiệu ứng đặc biệt từ các chế độ khác).
|
||||||
Bạn có thể vẽ một cái bảng để tập xóa (Clear mode) hoặc tập xây theo mẫu (Puzzle mode)
|
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 bảng mẫu hay không.
|
Ở chế độ Puzzle, bạn có thể nhấn F1 để chọn có hiện bảng mẫu hay không.
|
||||||
Để thắng được game ở chế độ Puzzle thì toàn bộ…
|
Để thắng được game ở chế độ Puzzle thì toàn bộ…
|
||||||
ô có X thì không được có gạch;
|
ô có X thì không được có gạch;
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ local levels={
|
|||||||
local b=STRING.toBin(a)
|
local b=STRING.toBin(a)
|
||||||
local l=floor(math.log(a,2)+1)
|
local l=floor(math.log(a,2)+1)
|
||||||
for i=1,l do
|
for i=1,l do
|
||||||
drawChar(tonumber(string.sub(b,i,i)),320,420-100*(l-i),.5)
|
drawChar(tonumber(b:sub(i,i)),320,420-100*(l-i),.5)
|
||||||
ins(drawLines,{370,480-100*(l-i),410,440-100*(l-i)})
|
ins(drawLines,{370,480-100*(l-i),410,440-100*(l-i)})
|
||||||
ins(drawLines,{370,440-100*(l-i),410,480-100*(l-i)})
|
ins(drawLines,{370,440-100*(l-i),410,480-100*(l-i)})
|
||||||
drawChar(2,430,420-100*(l-i),.5)
|
drawChar(2,430,420-100*(l-i),.5)
|
||||||
@@ -193,7 +193,7 @@ local levels={
|
|||||||
local b=STRING.toOct(a)
|
local b=STRING.toOct(a)
|
||||||
local l=floor(math.log(a,8)+1)
|
local l=floor(math.log(a,8)+1)
|
||||||
for i=1,l do
|
for i=1,l do
|
||||||
drawChar(tonumber(string.sub(b,i,i)),320,420-100*(l-i),.5)
|
drawChar(tonumber(b:sub(i,i)),320,420-100*(l-i),.5)
|
||||||
ins(drawLines,{370,480-100*(l-i),410,440-100*(l-i)})
|
ins(drawLines,{370,480-100*(l-i),410,440-100*(l-i)})
|
||||||
ins(drawLines,{370,440-100*(l-i),410,480-100*(l-i)})
|
ins(drawLines,{370,440-100*(l-i),410,480-100*(l-i)})
|
||||||
drawChar(8,430,420-100*(l-i),.5)
|
drawChar(8,430,420-100*(l-i),.5)
|
||||||
@@ -212,7 +212,7 @@ local levels={
|
|||||||
local b=STRING.toHex(a)
|
local b=STRING.toHex(a)
|
||||||
local l=floor(math.log(a,16)+1)
|
local l=floor(math.log(a,16)+1)
|
||||||
for i=1,l do
|
for i=1,l do
|
||||||
local c=string.sub(b,i,i)
|
local c=b:sub(i,i)
|
||||||
if ("0123456789"):find(c,nil,true) then
|
if ("0123456789"):find(c,nil,true) then
|
||||||
c=tonumber(c)
|
c=tonumber(c)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ generateVKey=function()
|
|||||||
-- activateState: 0=off, 1=on then off, 2=on
|
-- activateState: 0=off, 1=on then off, 2=on
|
||||||
local activationTime=self.ATV or 0
|
local activationTime=self.ATV or 0
|
||||||
local maxTime=6.2
|
local maxTime=6.2
|
||||||
|
|
||||||
if activateState~=nil then self.activateState=activateState
|
if activateState~=nil then self.activateState=activateState
|
||||||
elseif (self.activateState==1 and activationTime==maxTime) or not self.activateState then self.activateState=0 end
|
elseif (self.activateState==1 and activationTime==maxTime) or not self.activateState then self.activateState=0 end
|
||||||
-- LIKELY NOT POSSIBLE TO DO
|
-- LIKELY NOT POSSIBLE TO DO
|
||||||
|
|||||||
@@ -17,8 +17,7 @@ local lastSearch -- Last searched string
|
|||||||
local lastSelected -- Last selected item
|
local lastSelected -- Last selected item
|
||||||
|
|
||||||
local currentFontSize=25 -- Current font size, default: 25
|
local currentFontSize=25 -- Current font size, default: 25
|
||||||
local needLowerUTF8
|
local utf8postProcess
|
||||||
local isLangVi -- There are special handlings that only for Vietnamese --SweetSea--
|
|
||||||
|
|
||||||
local typeColor={
|
local typeColor={
|
||||||
help=COLOR.Y,
|
help=COLOR.Y,
|
||||||
@@ -45,11 +44,11 @@ local function _scanDict(D)
|
|||||||
for i=1,#D do
|
for i=1,#D do
|
||||||
local O=D[i]
|
local O=D[i]
|
||||||
O.title,O.title_Org=_filter(O[1])
|
O.title,O.title_Org=_filter(O[1])
|
||||||
O.titleLowered=needLowerUTF8 and STRING.lowerUTF8(O.title) or O.title:lower()
|
O.titleLowered=utf8postProcess and STRING.lowerUTF8(O.title) or O.title:lower()
|
||||||
O.titleNoDiaratics=isLangVi and STRING.viRemoveDiacritics(O.titleLowered)
|
O.titleNoDiaratics=utf8postProcess and STRING.remDiacritics(O.titleLowered)
|
||||||
O.keywords=O[2]
|
O.keywords=O[2]
|
||||||
O.keywordsLowered=needLowerUTF8 and STRING.lowerUTF8(O.keywords) or O.keywords:lower()
|
O.keywordsLowered=utf8postProcess and STRING.lowerUTF8(O.keywords) or O.keywords:lower()
|
||||||
O.keywordsNoDiaratics=isLangVi and STRING.viRemoveDiacritics(O.keywordsLowered)
|
O.keywordsNoDiaratics=utf8postProcess and STRING.remDiacritics(O.keywordsLowered)
|
||||||
O.type=O[3]
|
O.type=O[3]
|
||||||
O.content,O.content_Org=_filter(O[4])
|
O.content,O.content_Org=_filter(O[4])
|
||||||
O.url=O[5]
|
O.url=O[5]
|
||||||
@@ -93,9 +92,9 @@ local function _search()
|
|||||||
local pos
|
local pos
|
||||||
local first
|
local first
|
||||||
_clearResult()
|
_clearResult()
|
||||||
input=needLowerUTF8 and STRING.lowerUTF8(input) or input:lower()
|
input=utf8postProcess and STRING.lowerUTF8(input) or input:lower()
|
||||||
for i=1,#dict do
|
for i=1,#dict do
|
||||||
pos=find(dict[i].titleLowered,input,nil,true) or find(dict[i].keywordsLowered,input,nil,true) or isLangVi and (find(dict[i].titleNoDiaratics,input,nil,true) or find(dict[i].keywordsNoDiaratics,input,nil,true))
|
pos=find(dict[i].titleLowered,input,nil,true) or find(dict[i].keywordsLowered,input,nil,true) or utf8postProcess and (find(dict[i].titleNoDiaratics,input,nil,true) or find(dict[i].keywordsNoDiaratics,input,nil,true))
|
||||||
if pos==1 and not first then
|
if pos==1 and not first then
|
||||||
ins(result,1,dict[i])
|
ins(result,1,dict[i])
|
||||||
first=true
|
first=true
|
||||||
@@ -147,9 +146,8 @@ function scene.enter()
|
|||||||
SETTING.locale:find'vi' and 'vi' or
|
SETTING.locale:find'vi' and 'vi' or
|
||||||
'en'
|
'en'
|
||||||
)
|
)
|
||||||
needLowerUTF8=SETTING.locale:find'vi'
|
utf8postProcess=SETTING.locale:find'vi'
|
||||||
isLangVi=SETTING.locale:find'vi' -- DO NOT CHANGE THIS! --SweetSea--
|
|
||||||
|
|
||||||
dict=require(localeFile)
|
dict=require(localeFile)
|
||||||
_scanDict(dict)
|
_scanDict(dict)
|
||||||
|
|
||||||
|
|||||||
@@ -90,8 +90,8 @@ scene.widgetList={
|
|||||||
WIDGET.newSwitch{name='portrait', x=950,y=1150,lim=360,disp=SETval('portrait'), code=function() SETTING.portrait=not SETTING.portrait; saveSettings(); MES.new('warn',text.settingWarn2,6.26) end,hideF=function() return not MOBILE end},
|
WIDGET.newSwitch{name='portrait', x=950,y=1150,lim=360,disp=SETval('portrait'), code=function() SETTING.portrait=not SETTING.portrait; saveSettings(); MES.new('warn',text.settingWarn2,6.26) end,hideF=function() return not MOBILE end},
|
||||||
WIDGET.newSlider{name='msaa', x=950,y=1220,lim=360,w=200,axis={0,4,1},show=_msaaShow,disp=function() return SETTING.msaa==0 and 0 or math.log(SETTING.msaa,2) end,code=function(v) SETTING.msaa=v==0 and 0 or 2^v; saveSettings(); if TASK.lock('warnMessage',6.26) then MES.new('warn',text.settingWarn2,6.26) end end},
|
WIDGET.newSlider{name='msaa', x=950,y=1220,lim=360,w=200,axis={0,4,1},show=_msaaShow,disp=function() return SETTING.msaa==0 and 0 or math.log(SETTING.msaa,2) end,code=function(v) SETTING.msaa=v==0 and 0 or 2^v; saveSettings(); if TASK.lock('warnMessage',6.26) then MES.new('warn',text.settingWarn2,6.26) end end},
|
||||||
|
|
||||||
WIDGET.newKey{name='bg_off', x=680,y=1290,w=200,h=60,code=function() SETTING.bg='off'; applySettings() end},
|
WIDGET.newKey{name='bg_on', x=680,y=1290,w=200,h=60,code=function() SETTING.bg='on' ; applySettings() end},
|
||||||
WIDGET.newKey{name='bg_on', x=900,y=1290,w=200,h=60,code=function() SETTING.bg='on' ; applySettings() end},
|
WIDGET.newKey{name='bg_off', x=900,y=1290,w=200,h=60,code=function() SETTING.bg='off'; applySettings() end},
|
||||||
WIDGET.newKey{name='bg_custom', x=1120,y=1290,w=200,h=60,
|
WIDGET.newKey{name='bg_custom', x=1120,y=1290,w=200,h=60,
|
||||||
code=function()
|
code=function()
|
||||||
if love.filesystem.getInfo('conf/customBG') then
|
if love.filesystem.getInfo('conf/customBG') then
|
||||||
@@ -102,7 +102,7 @@ scene.widgetList={
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
},
|
},
|
||||||
WIDGET.newSlider{name='bgAlpha', x=1020,y=1365,w=200,
|
WIDGET.newSlider{name='bgAlpha', x=800,y=1365,w=420,
|
||||||
axis={0,.8},disp=SETval('bgAlpha'),
|
axis={0,.8},disp=SETval('bgAlpha'),
|
||||||
code=function(v)
|
code=function(v)
|
||||||
SETTING.bgAlpha=v
|
SETTING.bgAlpha=v
|
||||||
@@ -114,9 +114,8 @@ scene.widgetList={
|
|||||||
end,
|
end,
|
||||||
hideF=function() return SETTING.bg=='on' end
|
hideF=function() return SETTING.bg=='on' end
|
||||||
},
|
},
|
||||||
WIDGET.newSelector{name='defaultBG', x=1120,y=1365,w=200,color='G',
|
WIDGET.newSelector{name='defaultBG', x=680,y=1365,w=200,color='G',
|
||||||
limit=370,
|
list={'space','bg1','bg2','rainbow','rainbow2','aura','rgb','glow','matrix','cubes','tunnel','galaxy','quarks','blockfall','blockrain','blockhole','blockspace'},
|
||||||
list=BG.getList(),
|
|
||||||
disp=SETval('defaultBG'),
|
disp=SETval('defaultBG'),
|
||||||
code=function(v)
|
code=function(v)
|
||||||
SETTING.defaultBG=v
|
SETTING.defaultBG=v
|
||||||
@@ -124,7 +123,7 @@ scene.widgetList={
|
|||||||
end,
|
end,
|
||||||
hideF=function() return SETTING.bg~='on' end
|
hideF=function() return SETTING.bg~='on' end
|
||||||
},
|
},
|
||||||
WIDGET.newKey{name='resetDbg',x=900,y=1365,w=200,h=60,font=25,
|
WIDGET.newKey{name='resetDbg',x=870,y=1365,w=140,h=60,font=15,
|
||||||
code=function()
|
code=function()
|
||||||
SETTING.defaultBG='space'
|
SETTING.defaultBG='space'
|
||||||
scene.widgetList.defaultBG:reset()
|
scene.widgetList.defaultBG:reset()
|
||||||
@@ -132,7 +131,7 @@ scene.widgetList={
|
|||||||
end,
|
end,
|
||||||
hideF=function() return SETTING.bg~='on' or SETTING.defaultBG=='space' end
|
hideF=function() return SETTING.bg~='on' or SETTING.defaultBG=='space' end
|
||||||
},
|
},
|
||||||
WIDGET.newSwitch{name='lockBG',x=1170,y=1485,
|
WIDGET.newSwitch{name='lockBG',x=1170,y=1365,lim=200,
|
||||||
disp=SETval('lockBG'),
|
disp=SETval('lockBG'),
|
||||||
code=function()
|
code=function()
|
||||||
SETTING.lockBG=not SETTING.lockBG
|
SETTING.lockBG=not SETTING.lockBG
|
||||||
@@ -141,18 +140,18 @@ scene.widgetList={
|
|||||||
hideF=function() return SETTING.bg~='on' end
|
hideF=function() return SETTING.bg~='on' end
|
||||||
},
|
},
|
||||||
|
|
||||||
WIDGET.newSwitch{name='noTheme',x=1170,y=1545,
|
WIDGET.newSwitch{name='noTheme',x=1170,y=1435,
|
||||||
disp=SETval('noTheme'),
|
disp=SETval('noTheme'),
|
||||||
code=function()
|
code=function()
|
||||||
SETTING.noTheme=not SETTING.noTheme
|
SETTING.noTheme=not SETTING.noTheme
|
||||||
local ct=THEME.calculate()
|
local ct=THEME.calculate()
|
||||||
if SETTING.noTheme and type(ct)=='string' and string.sub(ct,1,6)~='season' then
|
if SETTING.noTheme and type(ct)=='string' and ct:sub(1,6)~='season' then
|
||||||
if TASK.lock('warnMessage',6.26) then
|
if TASK.lock('warnMessage',6.26) then
|
||||||
MES.new('warn',text.settingWarn2,6.26)
|
MES.new('warn',text.settingWarn2,6.26)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
THEME.set(THEME.calculate())
|
THEME.set(THEME.calculate())
|
||||||
ChangeButtonColorIfThemeUsed()
|
WIDGET.setWidgetList(scene.widgetList)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -59,15 +59,9 @@ function THEME.calculate(Y,M,D)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function THEME.set(theme)
|
function THEME.set(theme)
|
||||||
local seasonT={'null','nil','vaccum','space'}
|
if type(theme)=='string' and theme:sub(1,6)=='season' then
|
||||||
-- Note: by default, the background will be 'space' unless user changed
|
BG.setDefault(SETTING.defaultBG)
|
||||||
-- Because 4 seasonal themes are basically the normal theme, not special like others
|
BGM.setDefault(({season1='null',season2='nil',season3='vaccum',season4='space'})[theme])
|
||||||
if type(theme)=='string' and string.sub(theme,1,6)=='season' then
|
|
||||||
local n=tonumber(string.sub(theme,7))
|
|
||||||
if 0<n and n<5 then
|
|
||||||
BG. setDefault(SETTING.defaultBG)
|
|
||||||
BGM.setDefault(seasonT[n])
|
|
||||||
end
|
|
||||||
elseif not SETTING.noTheme then
|
elseif not SETTING.noTheme then
|
||||||
if theme=='xmas' then
|
if theme=='xmas' then
|
||||||
BG.setDefault('snow')
|
BG.setDefault('snow')
|
||||||
@@ -99,7 +93,9 @@ function THEME.set(theme)
|
|||||||
else
|
else
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
else THEME.set(THEME.calculate('0',os.date('%m'),'0')) return end
|
else
|
||||||
|
return THEME.set(THEME.calculate('0',os.date('%m'),'0'))
|
||||||
|
end
|
||||||
|
|
||||||
THEME.cur=theme
|
THEME.cur=theme
|
||||||
BG.set()
|
BG.set()
|
||||||
|
|||||||
Reference in New Issue
Block a user