越南语变音字母简化函数改为全unicode版本

限制自定义菜单背景选择范围
微调自定义背景设置ui
整理代码
This commit is contained in:
MrZ_26
2023-12-31 23:32:19 +08:00
parent 19ea76dc4c
commit 3a4fcf6d7b
16 changed files with 140 additions and 133 deletions

48
Zframework/diacritics.txt Normal file
View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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
]], ]],

View File

@@ -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",

View File

@@ -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."},

View File

@@ -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",

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

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

View File

@@ -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()