越南语变音字母简化函数改为全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
|
||||
|
||||
-- [LOW PERFORMANCE!]
|
||||
local upperData,lowerData,VIdiaData
|
||||
local upperData,lowerData,diaData
|
||||
function STRING.upperUTF8(str)
|
||||
for _,pair in next,upperData do
|
||||
str=str:gsub(pair[1],pair[2])
|
||||
@@ -50,12 +50,8 @@ function STRING.lowerUTF8(str)
|
||||
end
|
||||
return str
|
||||
end
|
||||
--[[
|
||||
[FOR VIETNAMESE ONLY]
|
||||
Remove all diacritics in strings written in Vietnamese
|
||||
]]
|
||||
function STRING.viRemoveDiacritics(str)
|
||||
for _,pair in next,VIdiaData do
|
||||
function STRING.remDiacritics(str)
|
||||
for _,pair in next,diaData do
|
||||
str=str:gsub(pair[1],pair[2])
|
||||
end
|
||||
return str
|
||||
@@ -402,43 +398,31 @@ function STRING.unpackTable(t)
|
||||
end
|
||||
|
||||
do
|
||||
local function readF(fname)
|
||||
local function parseFile(fname)
|
||||
local d
|
||||
if love and love.filesystem and type(love.filesystem.read)=='function' then
|
||||
f=love.filesystem.read(fname)
|
||||
d=love.filesystem.read(fname)
|
||||
else
|
||||
local f=io.open(fname,'r')
|
||||
local d=f:read('a')
|
||||
f:close()
|
||||
if f then
|
||||
d=f:read('a')
|
||||
f:close()
|
||||
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)
|
||||
for i=1,#data do
|
||||
local pair=STRING.split(data[i],'=')
|
||||
data[i]=pair
|
||||
if not d then
|
||||
print("ERROR: Failed to read the data from "..fname)
|
||||
return {}
|
||||
end
|
||||
return data
|
||||
end
|
||||
if upperData then upperData=splitData(STRING.split(gsub(upperData,'\n',','),','))
|
||||
else
|
||||
upperData={}
|
||||
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')
|
||||
d=STRING.split(gsub(d,'\n',','),',')
|
||||
for i=1,#d do
|
||||
d[i]=STRING.split(d[i],'=')
|
||||
end
|
||||
return d
|
||||
end
|
||||
upperData=parseFile('Zframework/upcaser.txt')
|
||||
lowerData=parseFile('Zframework/lowcaser.txt')
|
||||
diaData=parseFile('Zframework/diacritics.txt')
|
||||
end
|
||||
|
||||
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)
|
||||
VOC.setDiversion(.62)
|
||||
|
||||
ChangeButtonColorIfThemeUsed=function()
|
||||
if SCN.cur~='net_game' and SCN.cur~='custom_field' then
|
||||
local colorList=THEME.getThemeColor()
|
||||
if colorList then
|
||||
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
||||
if W.color then
|
||||
W.color=colorList[math.random(#colorList)]
|
||||
end
|
||||
end
|
||||
WIDGET.setOnChange(function()
|
||||
if SCN.cur=='net_game' or SCN.cur=='custom_field' then return end
|
||||
local colorList=THEME.getThemeColor()
|
||||
if colorList then
|
||||
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
||||
W.color=W.color and colorList[math.random(#colorList)]
|
||||
end
|
||||
end
|
||||
end
|
||||
WIDGET.setOnChange(ChangeButtonColorIfThemeUsed)
|
||||
end)
|
||||
|
||||
-- Create shortcuts
|
||||
setFont=FONT.set
|
||||
|
||||
@@ -175,7 +175,7 @@ return {
|
||||
GC.rectangle('line',0,240,126,80,4)
|
||||
GC.setColor(.98,.98,.98,.4)
|
||||
GC.rectangle('fill',0+2,240+2,126-4,80-4,2) -- draw time box
|
||||
|
||||
|
||||
setFont(45) -- Draw time text
|
||||
local t=(P.stat.frame-D.prevSectTime)/60
|
||||
local T=("%.1f"):format(60-t)
|
||||
|
||||
@@ -115,7 +115,7 @@ do-- function applySettings()
|
||||
light={.2,.8},
|
||||
color={-.2,1.2},
|
||||
}
|
||||
function applySettings(arg)
|
||||
function applySettings(reason)
|
||||
-- Apply language
|
||||
text=LANG.get(SETTING.locale)
|
||||
WIDGET.setLang(text.WidgetText)
|
||||
@@ -157,34 +157,33 @@ do-- function applySettings()
|
||||
SHADER.fieldSatur:send('k',m[2])
|
||||
|
||||
-- Apply BG
|
||||
if not (arg and arg=='fullscreen') then
|
||||
if SETTING.bg=='on' then
|
||||
BG.unlock()
|
||||
BG.setDefault(SETTING.defaultBG)
|
||||
BG.set()
|
||||
if SETTING.lockBG then BG.lock() end
|
||||
elseif SETTING.bg=='off' then
|
||||
if reason=='fullscreen' then return end
|
||||
if SETTING.bg=='on' then
|
||||
BG.unlock()
|
||||
BG.setDefault(SETTING.defaultBG)
|
||||
BG.set()
|
||||
if SETTING.lockBG then BG.lock() end
|
||||
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.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.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
||||
BG.lock()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -196,7 +195,7 @@ local function getSmallNum(num)
|
||||
local str=tostring(num)
|
||||
local out=""
|
||||
for i=1,#str do
|
||||
out=out..smallDigits[tonumber(string.sub(str,i,i))]
|
||||
out=out..smallDigits[tonumber(str:sub(i,i))]
|
||||
end
|
||||
return out
|
||||
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.
|
||||
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).
|
||||
|
||||
@@ -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
|
||||
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.
|
||||
- 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_custom="Custom B.G.",
|
||||
defaultBG="Default B.G.",
|
||||
resetDbg="Reset default B.G.",
|
||||
resetDbg="Reset to default",
|
||||
lockBG="Lock B.G.",
|
||||
noTheme="Disable theme",
|
||||
|
||||
|
||||
@@ -884,7 +884,7 @@ return {
|
||||
-- ['blind_h']= {"Invisible", "INSTANT", "For the experienced"},
|
||||
-- ['blind_l']= {"Invisible", "NO GHOST", "For professionals"},
|
||||
-- ['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_n']= {"A Ciegas", "Total", "Para jugadores intermedios."},
|
||||
['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_custom="Ảnh nền tự chọn",
|
||||
defaultBG="Nền mặc định",
|
||||
-- resetDbg='Đặt lại →',
|
||||
resetDbg="Đặt lại ảnh nền mặc định",
|
||||
resetDbg='Đặt lại',
|
||||
lockBG="Khóa ảnh nền",
|
||||
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:
|
||||
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
|
||||
— 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..
|
||||
@@ -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.
|
||||
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 (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.
|
||||
Để thắng được game ở chế độ Puzzle thì toàn bộ…
|
||||
ô có X thì không được có gạch;
|
||||
|
||||
@@ -174,7 +174,7 @@ local levels={
|
||||
local b=STRING.toBin(a)
|
||||
local l=floor(math.log(a,2)+1)
|
||||
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,440-100*(l-i),410,480-100*(l-i)})
|
||||
drawChar(2,430,420-100*(l-i),.5)
|
||||
@@ -193,7 +193,7 @@ local levels={
|
||||
local b=STRING.toOct(a)
|
||||
local l=floor(math.log(a,8)+1)
|
||||
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,440-100*(l-i),410,480-100*(l-i)})
|
||||
drawChar(8,430,420-100*(l-i),.5)
|
||||
@@ -212,7 +212,7 @@ local levels={
|
||||
local b=STRING.toHex(a)
|
||||
local l=floor(math.log(a,16)+1)
|
||||
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
|
||||
c=tonumber(c)
|
||||
else
|
||||
|
||||
@@ -214,7 +214,7 @@ generateVKey=function()
|
||||
-- activateState: 0=off, 1=on then off, 2=on
|
||||
local activationTime=self.ATV or 0
|
||||
local maxTime=6.2
|
||||
|
||||
|
||||
if activateState~=nil then self.activateState=activateState
|
||||
elseif (self.activateState==1 and activationTime==maxTime) or not self.activateState then self.activateState=0 end
|
||||
-- LIKELY NOT POSSIBLE TO DO
|
||||
|
||||
@@ -17,8 +17,7 @@ local lastSearch -- Last searched string
|
||||
local lastSelected -- Last selected item
|
||||
|
||||
local currentFontSize=25 -- Current font size, default: 25
|
||||
local needLowerUTF8
|
||||
local isLangVi -- There are special handlings that only for Vietnamese --SweetSea--
|
||||
local utf8postProcess
|
||||
|
||||
local typeColor={
|
||||
help=COLOR.Y,
|
||||
@@ -45,11 +44,11 @@ local function _scanDict(D)
|
||||
for i=1,#D do
|
||||
local O=D[i]
|
||||
O.title,O.title_Org=_filter(O[1])
|
||||
O.titleLowered=needLowerUTF8 and STRING.lowerUTF8(O.title) or O.title:lower()
|
||||
O.titleNoDiaratics=isLangVi and STRING.viRemoveDiacritics(O.titleLowered)
|
||||
O.titleLowered=utf8postProcess and STRING.lowerUTF8(O.title) or O.title:lower()
|
||||
O.titleNoDiaratics=utf8postProcess and STRING.remDiacritics(O.titleLowered)
|
||||
O.keywords=O[2]
|
||||
O.keywordsLowered=needLowerUTF8 and STRING.lowerUTF8(O.keywords) or O.keywords:lower()
|
||||
O.keywordsNoDiaratics=isLangVi and STRING.viRemoveDiacritics(O.keywordsLowered)
|
||||
O.keywordsLowered=utf8postProcess and STRING.lowerUTF8(O.keywords) or O.keywords:lower()
|
||||
O.keywordsNoDiaratics=utf8postProcess and STRING.remDiacritics(O.keywordsLowered)
|
||||
O.type=O[3]
|
||||
O.content,O.content_Org=_filter(O[4])
|
||||
O.url=O[5]
|
||||
@@ -93,9 +92,9 @@ local function _search()
|
||||
local pos
|
||||
local first
|
||||
_clearResult()
|
||||
input=needLowerUTF8 and STRING.lowerUTF8(input) or input:lower()
|
||||
input=utf8postProcess and STRING.lowerUTF8(input) or input:lower()
|
||||
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
|
||||
ins(result,1,dict[i])
|
||||
first=true
|
||||
@@ -147,9 +146,8 @@ function scene.enter()
|
||||
SETTING.locale:find'vi' and 'vi' or
|
||||
'en'
|
||||
)
|
||||
needLowerUTF8=SETTING.locale:find'vi'
|
||||
isLangVi=SETTING.locale:find'vi' -- DO NOT CHANGE THIS! --SweetSea--
|
||||
|
||||
utf8postProcess=SETTING.locale:find'vi'
|
||||
|
||||
dict=require(localeFile)
|
||||
_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.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=900,y=1290,w=200,h=60,code=function() SETTING.bg='on' ; 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_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,
|
||||
code=function()
|
||||
if love.filesystem.getInfo('conf/customBG') then
|
||||
@@ -102,7 +102,7 @@ scene.widgetList={
|
||||
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'),
|
||||
code=function(v)
|
||||
SETTING.bgAlpha=v
|
||||
@@ -114,9 +114,8 @@ scene.widgetList={
|
||||
end,
|
||||
hideF=function() return SETTING.bg=='on' end
|
||||
},
|
||||
WIDGET.newSelector{name='defaultBG', x=1120,y=1365,w=200,color='G',
|
||||
limit=370,
|
||||
list=BG.getList(),
|
||||
WIDGET.newSelector{name='defaultBG', x=680,y=1365,w=200,color='G',
|
||||
list={'space','bg1','bg2','rainbow','rainbow2','aura','rgb','glow','matrix','cubes','tunnel','galaxy','quarks','blockfall','blockrain','blockhole','blockspace'},
|
||||
disp=SETval('defaultBG'),
|
||||
code=function(v)
|
||||
SETTING.defaultBG=v
|
||||
@@ -124,7 +123,7 @@ scene.widgetList={
|
||||
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()
|
||||
SETTING.defaultBG='space'
|
||||
scene.widgetList.defaultBG:reset()
|
||||
@@ -132,7 +131,7 @@ scene.widgetList={
|
||||
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'),
|
||||
code=function()
|
||||
SETTING.lockBG=not SETTING.lockBG
|
||||
@@ -141,18 +140,18 @@ scene.widgetList={
|
||||
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'),
|
||||
code=function()
|
||||
SETTING.noTheme=not SETTING.noTheme
|
||||
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
|
||||
MES.new('warn',text.settingWarn2,6.26)
|
||||
end
|
||||
else
|
||||
THEME.set(THEME.calculate())
|
||||
ChangeButtonColorIfThemeUsed()
|
||||
WIDGET.setWidgetList(scene.widgetList)
|
||||
end
|
||||
end
|
||||
},
|
||||
|
||||
@@ -59,15 +59,9 @@ function THEME.calculate(Y,M,D)
|
||||
end
|
||||
|
||||
function THEME.set(theme)
|
||||
local seasonT={'null','nil','vaccum','space'}
|
||||
-- Note: by default, the background will be 'space' unless user changed
|
||||
-- Because 4 seasonal themes are basically the normal theme, not special like others
|
||||
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
|
||||
if type(theme)=='string' and theme:sub(1,6)=='season' then
|
||||
BG.setDefault(SETTING.defaultBG)
|
||||
BGM.setDefault(({season1='null',season2='nil',season3='vaccum',season4='space'})[theme])
|
||||
elseif not SETTING.noTheme then
|
||||
if theme=='xmas' then
|
||||
BG.setDefault('snow')
|
||||
@@ -99,7 +93,9 @@ function THEME.set(theme)
|
||||
else
|
||||
return
|
||||
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
|
||||
BG.set()
|
||||
|
||||
Reference in New Issue
Block a user