Compare commits
10 Commits
0e8ddee6c5
...
v0.17.16
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e49f8d428a | ||
|
|
6ece5c5f1f | ||
|
|
b75359472b | ||
|
|
1c190d9544 | ||
|
|
1859e5bb96 | ||
|
|
7e1a5805b3 | ||
|
|
6c63fe0ab7 | ||
|
|
85fc9f660e | ||
|
|
2d12ab3a19 | ||
|
|
efeb24b0f0 |
@@ -803,7 +803,7 @@ function selector:press(x)
|
||||
end
|
||||
end
|
||||
if self.select~=s then
|
||||
self.code(self.list[s])
|
||||
self.code(self.list[s],s)
|
||||
self.select=s
|
||||
self.selText=self.list[s]
|
||||
if self.sound then
|
||||
|
||||
@@ -831,7 +831,7 @@ end
|
||||
|
||||
local ASC
|
||||
do
|
||||
local L={'+0+0','+1+0','+0-1','+1-1','+0-2','+1-2','+2+0','+2-1','+2-2','-1+0','-1-1','+0+1','+1+1','+2+1','-1-2','-2+0','+0+2','+1+2','+2+2','-2-1','-2-2'}
|
||||
local L={'+0+0','+1+0','+0-1','+1-1','+0-2','+1-2','+2+0','+2-1','+2-2','-1+0','-1-1','+0+1','+1+1','+2+1','-1-2','-2+0','+0+2','+1+2','+2+2','-2-1','-2-2','-1+1'}
|
||||
local R=_flipList(L)
|
||||
local F={'+0+0'}
|
||||
local centerPos=TABLE.copy(defaultCenterPos)
|
||||
@@ -870,7 +870,7 @@ end
|
||||
|
||||
local ASC_plus
|
||||
do
|
||||
local L={'+0+0','+1+0','+0-1','+1-1','+0-2','+1-2','+2+0','+2-1','+2-2','-1+0','-1-1','+0+1','+1+1','+2+1','-1-2','-2+0','+0+2','+1+2','+2+2','-2-1','-2-2'}
|
||||
local L={'+0+0','+1+0','+0-1','+1-1','+0-2','+1-2','+2+0','+2-1','+2-2','-1+0','-1-1','+0+1','+1+1','+2+1','-1-2','-2+0','+0+2','+1+2','+2+2','-2-1','-2-2','-1+1'}
|
||||
local R=_flipList(L)
|
||||
local F={'+0+0','-1+0','+1+0','+0-1','-1-1','+1-1','+0-2','-1-2','+1-2','-2+0','+2+0','-2-1','+2-1','-2+1','+2+1','+0+2','-1+2','+1+2'}
|
||||
local centerPos=TABLE.copy(ASC.centerPos)
|
||||
@@ -1078,4 +1078,4 @@ for name,rs in next,RSlist do
|
||||
end
|
||||
end
|
||||
|
||||
return RSlist
|
||||
return RSlist
|
||||
@@ -1,5 +1,5 @@
|
||||
local L={
|
||||
zChan={-- F0000~F003F
|
||||
zChan={-- F0000 - F003F
|
||||
none= 0xF0000,
|
||||
normal= 0xF0001,
|
||||
full= 0xF0002,
|
||||
@@ -15,7 +15,7 @@ local L={
|
||||
angry= 0xF000C,
|
||||
shocked= 0xF000D,
|
||||
ellipses= 0xF000E,
|
||||
sweat_drop= 0xF000F,
|
||||
sweatDrop= 0xF000F,
|
||||
cry= 0xF0010,
|
||||
cracked= 0xF0011,
|
||||
qualified= 0xF0012,
|
||||
@@ -24,7 +24,7 @@ local L={
|
||||
thinking= 0xF0015,
|
||||
spark= 0xF0016,
|
||||
},
|
||||
mino={-- F0040~F007F
|
||||
mino={-- F0040 - F007F
|
||||
Z=0xF0040,
|
||||
S=0xF0041,
|
||||
J=0xF0042,
|
||||
@@ -57,7 +57,7 @@ local L={
|
||||
I2=0xF005B,
|
||||
O1=0xF005C,
|
||||
},
|
||||
icon={-- F0080~F00FF
|
||||
icon={-- F0080 - F00FF
|
||||
menu= 0xF0080,
|
||||
music= 0xF0081,
|
||||
language= 0xF0082,
|
||||
@@ -154,8 +154,12 @@ local L={
|
||||
rewind30= 0xF00DD,
|
||||
foward10= 0xF00DE,
|
||||
foward30= 0xF00DF,
|
||||
fontUp= 0xF00E0,
|
||||
fontDown= 0xF00E1,
|
||||
erase= 0xF00E2,
|
||||
auto= 0xF00E3,
|
||||
},
|
||||
key={-- F0100~F017F
|
||||
key={-- F0100 - F017F
|
||||
macCmd= 0xF0100,
|
||||
macOpt= 0xF0101,
|
||||
macCtrl= 0xF0102,
|
||||
@@ -196,7 +200,7 @@ local L={
|
||||
macPgdnAlt= 0xF0125,
|
||||
iecPower= 0xF0126,
|
||||
},
|
||||
controller={-- F0180~F01FF
|
||||
controller={-- F0180 - F01FF
|
||||
xbox= 0xF0180,
|
||||
lt= 0xF0181,
|
||||
rt= 0xF0182,
|
||||
@@ -236,7 +240,7 @@ local L={
|
||||
psCreate= 0xF01A4,
|
||||
psOption= 0xF01A5,
|
||||
},
|
||||
mahjong={-- F0200~F027F
|
||||
mahjong={-- F0200 - F027F
|
||||
m1= 0xF0200,
|
||||
m2= 0xF0201,
|
||||
m3= 0xF0202,
|
||||
@@ -323,6 +327,67 @@ local L={
|
||||
s1j= 0xF0253,
|
||||
s1jBase= 0xF0254,
|
||||
s1jComb= 0xF0255,
|
||||
},
|
||||
cards={-- F0300 - F070F
|
||||
cardBack= 0xF0300,
|
||||
clubA= 0xF0301,
|
||||
club2= 0xF0302,
|
||||
club3= 0xF0303,
|
||||
club4= 0xF0304,
|
||||
club5= 0xF0305,
|
||||
club6= 0xF0306,
|
||||
club7= 0xF0307,
|
||||
club8= 0xF0308,
|
||||
club9= 0xF0309,
|
||||
club10= 0xF030A,
|
||||
clubJ= 0xF030B,
|
||||
clubC= 0xF030C,
|
||||
clubQ= 0xF030D,
|
||||
clubK= 0xF030E,
|
||||
heartA= 0xF0401,
|
||||
heart2= 0xF0402,
|
||||
heart3= 0xF0403,
|
||||
heart4= 0xF0404,
|
||||
heart5= 0xF0405,
|
||||
heart6= 0xF0406,
|
||||
heart7= 0xF0407,
|
||||
heart8= 0xF0408,
|
||||
heart9= 0xF0409,
|
||||
heart10= 0xF040A,
|
||||
heartJ= 0xF040B,
|
||||
heartC= 0xF040C,
|
||||
heartQ= 0xF040D,
|
||||
heartK= 0xF040E,
|
||||
diamondA= 0xF0501,
|
||||
diamond2= 0xF0502,
|
||||
diamond3= 0xF0503,
|
||||
diamond4= 0xF0504,
|
||||
diamond5= 0xF0505,
|
||||
diamond6= 0xF0506,
|
||||
diamond7= 0xF0507,
|
||||
diamond8= 0xF0508,
|
||||
diamond9= 0xF0509,
|
||||
diamond10= 0xF050A,
|
||||
diamondJ= 0xF050B,
|
||||
diamondC= 0xF050C,
|
||||
diamondQ= 0xF050D,
|
||||
diamondK= 0xF050E,
|
||||
jokerBlack= 0xF050F,
|
||||
clubA= 0xF0601,
|
||||
club2= 0xF0602,
|
||||
club3= 0xF0603,
|
||||
club4= 0xF0604,
|
||||
club5= 0xF0605,
|
||||
club6= 0xF0606,
|
||||
club7= 0xF0607,
|
||||
club8= 0xF0608,
|
||||
club9= 0xF0609,
|
||||
club10= 0xF060A,
|
||||
clubJ= 0xF060B,
|
||||
clubC= 0xF060C,
|
||||
clubQ= 0xF060D,
|
||||
clubK= 0xF060E,
|
||||
jokerWhite= 0xF060F,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -161,8 +161,12 @@ do-- function applySettings()
|
||||
if SETTING.bg=='on' then
|
||||
BG.unlock()
|
||||
BG.setDefault(SETTING.defaultBG)
|
||||
if SETTING.lockBG then
|
||||
BG.lock()
|
||||
elseif reason=='lockBG' then -- Don't load theme too soon!
|
||||
THEME.set(THEME.calculate(),GAME.playing)
|
||||
end
|
||||
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)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
-- Automatically generated by a Python script, from a markdown source file.
|
||||
-- The script can be found here: https://github.com/user670/techmino-dictionary-converter/blob/master/tool.py
|
||||
-- **NOTE TO TRANSLATORS**: In English (and in this file) the symbol ~ (tilde) is commonly used to express "approximately". Some languages use this symbol to express ranges or "from/up to a value", but it is not commonly used in English.
|
||||
return {
|
||||
{"Translator Note 1",
|
||||
"",
|
||||
|
||||
@@ -706,10 +706,10 @@ Một kỹ thuật di chuyển gạch vào vị trí mong muốn với chuỗi p
|
||||
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
|
||||
|
||||
Techmino cũng có finesse rate (%) (tỉ lệ *không* mắc lỗi di chuyển), được tính như sau:
|
||||
- 100% (Hoàn hảo - Perfect) khi số lần nhấn phím bằng hoặc ít hơn mức chuẩn
|
||||
- 50% (Tuyệt vời - Great) khi số lần nhấn phím cao hơn mức chuẩn 1 phím
|
||||
- 25% (Xấu - Bad) khi số lần nhấn phím cao hơn mức chuẩn 2 phím
|
||||
- 0% (Truợt - Miss) khi số lần nhấn phím cao hơn mức chuẩn 3 phím
|
||||
- 100% (Perfect) khi số lần nhấn phím bằng hoặc ít hơn mức chuẩn
|
||||
- 50% (Great) khi số lần nhấn phím cao hơn mức chuẩn 1 phím
|
||||
- 25% (Bad) khi số lần nhấn phím cao hơn mức chuẩn 2 phím
|
||||
- 0% (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 ý:
|
||||
@@ -774,7 +774,7 @@ Phương pháp này lần đầu tiên được tìm thấy bởi Cheez-fish - n
|
||||
{"APL",
|
||||
"nhom05g attackperline efficiency; số hàng tấn công; số hàng đã xóa; độ hiệu quả",
|
||||
"term",
|
||||
"Attack per line (cleared) | Số hàng tấn công / Số hàng đã xóa\n\nCòn được biết với tên \"efficiency\" (độ hiệu quả). Phản ánh độ hiệu quả khi tấn công sau mỗi lần xóa hàng.\nVí dụ Tetris và T-spin có độ hiệu quả cao hơn so với xóa 2 / 3 hàng.",
|
||||
"Attack per line (cleared)\n\tSố hàng tấn công / Số hàng đã xóa\n\nCòn được biết với tên \"efficiency\" (độ hiệu quả). Phản ánh độ hiệu quả khi tấn công sau mỗi lần xóa hàng.\nVí dụ Tetris và T-spin có độ hiệu quả cao hơn so với xóa 2 / 3 hàng.",
|
||||
},
|
||||
{"Tấn công&Phg thủ",
|
||||
"nhom05g attacking defending phòng thủ; tấn công & phòng thủ; tấn công và phòng thủ",
|
||||
@@ -847,7 +847,7 @@ Trong hầu hết các game, tấn công và phòng thủ là tương đương n
|
||||
{"Fin, Neo, Iso",
|
||||
"nhom05i fin neo iso",
|
||||
"pattern",
|
||||
"Tên của 3 kiểu T-spin sử dụng wall-kick table đặc biệt của gạch T. Các game khác nhau có cách phản công khác nhau với loại này: có game tính là Mini-spin, nhưng cũng có game không tính luôn =))).\n\nTrên thực tế chúng không được sử dụng nhiều vì game thường sẽ nerf loại T-spin này; hơn nữa setup của ba loại này khá là phức tạp."
|
||||
"Tên của 3 kiểu T-spin sử dụng wall-kick table đặc biệt của gạch T. Chúng không được sử dụng nhiều trong game bởi vì độ phức tạp và thường hay bị nerf bởi đa số game."
|
||||
},
|
||||
{"Freestyle",
|
||||
"nhom05i",
|
||||
@@ -894,7 +894,7 @@ Trong hầu hết các game, tấn công và phòng thủ là tương đương n
|
||||
{"Back to Back",
|
||||
"nhom05j b2b btb backtoback",
|
||||
"term",
|
||||
"Hay còn gọi là B2B. Xóa 2 hoặc nhiều lần xóa theo kiểu nâng cao (như Tetris hay Spin) liên tiếp (nhưng không được xóa theo kiểu 'bình thường' giữa chừng).\nKhông như combo, Back To Back sẽ không bị mất khi đặt gạch.\n\nỞ Techmino, B2B được tính bằng thanh năng lượng, chứ không tính theo số lần xóa theo kiểu nâng cao.\nCũng trong Techmino, nhiều B2B liên tiếp được tính là Back-to-back-to-back (B3B) (xem mục B2B2B để biết thêm).\n\nTechmino cũng tính cả PC và HPC liên tiếp là B2B và B3B",
|
||||
"Hay còn gọi là B2B. Xóa 2 hoặc nhiều lần xóa theo kiểu nâng cao (như Tetris hay Spin) liên tiếp (nhưng không được kiểu xóa bình thường giữa chừng).\nKhông như combo, Back To Back sẽ không bị mất khi đặt gạch.\n\nỞ Techmino, B2B được tính bằng thanh năng lượng, chứ không tính theo số lần xóa kiểu đặc biệt.\nCũng trong Techmino, nhiều B2B liên tiếp được tính là Back-to-back-to-back (B3B) (xem mục B2B2B để biết thêm).\n\nTechmino cũng tính cả PC và HPC liên tiếp là B2B và B3B",
|
||||
},
|
||||
{"B2B2B",
|
||||
"nhom05j b3b backtobacktoback",
|
||||
@@ -932,13 +932,13 @@ Trong hầu hết các game, tấn công và phòng thủ là tương đương n
|
||||
[[
|
||||
Đây là skin được dùng trong những phiên bản đời đầu của Tetris
|
||||
|
||||
Trước đây, tất cả máy tính đều sử dụng Giao diện Dòng lệnh (Command-Line Interfaces, gần giống như cmd trên Windows, Terminal trên Mac, hay Console trên Linux), cho nên mỗi ô gạch đều được hiển thị dưới dạng 2 ngoặc vuông (như thế này: [ ]).
|
||||
Trước đây, tất cả máy tính đều sử dụng Giao diện Dòng lệnh (Command-Line Interfaces), cho nên mỗi ô gạch đều được hiển thị dưới dạng 2 ngoặc vuông (như thế này: ]]..CHAR.icon.bone..[[).
|
||||
Trông nó nhìn rất giống cục xương, nên đôi khi được gọi là skin bone block (gạch xương).
|
||||
|
||||
Trong Techmino, bone block được mô tả là "một skin gạch duy nhất, lạ mắt mà tất cả các gạch đều sử dụng".
|
||||
Skin khác nhau sẽ có skin bone block khác nhau.
|
||||
|
||||
Cũng trong Techmino nhưng ở tiếng Việt, từ "gạch []" được dùng để chỉ bone block.
|
||||
Cũng trong Techmino nhưng ở tiếng Việt, từ "gạch ]]..CHAR.icon.bone..[[" được dùng để chỉ bone block.
|
||||
]],
|
||||
},
|
||||
{"=[NHÓM 06]=",
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
local C=COLOR
|
||||
|
||||
-- There are some strings, due to game's history, temproary be commented just in case
|
||||
-- If it is not used anymore, it will be removed, in one day…
|
||||
|
||||
return {
|
||||
fallback='en',
|
||||
loadText={
|
||||
@@ -153,11 +150,8 @@ return {
|
||||
noticeNotFound="Không có thông báo",
|
||||
},
|
||||
PlayerManager={
|
||||
-- invalidEmail="Email không hợp lệ",
|
||||
-- playerNotFound="Không tìm thấy người chơi",
|
||||
-- invalidEmailPass="Email hoặc người chơi không hợp lệ",
|
||||
-- emailExists="Email đã tồn tại",
|
||||
-- emailSendError="Lỗi gửi email",
|
||||
playerNotFound="Không tìm thấy người chơi",
|
||||
invalidEmailPass="Email hoặc người chơi không hợp lệ",
|
||||
invalidCode="Mã không hợp lệ",
|
||||
invalidAccessToken="Mã xác thực không hợp lệ",
|
||||
},
|
||||
@@ -181,13 +175,7 @@ return {
|
||||
versionNotMatch="Phiên bản không khớp",
|
||||
notFinished="Sắp ra mắt!",
|
||||
|
||||
-- Deprecated
|
||||
-- noUsername="Vui lòng nhập email của bạn",
|
||||
-- wrongEmail="Địa chỉ email không hợp lệ",
|
||||
-- wrongCode="Mã xác minh không hợp lệ",
|
||||
-- noPassword="Vui lòng nhập mật khẩu của bạn",
|
||||
-- diffPassword="Mật khẩu không đúng",
|
||||
-- checkEmail="Yêu cầu đăng ký đã được gửi.",
|
||||
wrongCode="Mã xác minh không hợp lệ",
|
||||
|
||||
wsFailed="Kết nối WebSocket đã thất bại: $1",
|
||||
wsClose="WebSocket đã đóng: $1",
|
||||
@@ -213,7 +201,7 @@ 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.",
|
||||
tryAnotherBuild="LOI UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.",
|
||||
|
||||
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={
|
||||
@@ -237,7 +225,7 @@ return {
|
||||
noRotation="No Rotation\nKhông thể xoay gạch",
|
||||
noMove="No Movement\nKhông thể di chuyển trái phải",
|
||||
customSeq="Randomizer\nGhi đè trình xáo gạch",
|
||||
pushSpeed="Garbage Speed\nGhi đề tốc độ xuất hiện của hàng rác",
|
||||
pushSpeed="Garbage Speed\nGhi đè tốc độ xuất hiện rác",
|
||||
boneBlock="[ ]\nChơi với skin [ ]",
|
||||
},
|
||||
pauseStat={
|
||||
@@ -539,9 +527,6 @@ C. Tay cầm chơi game (Gamepad):
|
||||
sound="Âm thanh→",
|
||||
style="Trang trí",
|
||||
|
||||
-- ctrl="Cài đặt điều khiển",
|
||||
-- key="Cài đặt bố cục phím",
|
||||
-- touch="Cài đặt cảm ứng",
|
||||
ctrl="Điều chỉnh thg. số", -- ctrl="Điều chỉnh độ nhạy"
|
||||
key="Sửa bố cục bàn phím",
|
||||
touch="Sửa bố cục cảm ứng",
|
||||
@@ -629,7 +614,6 @@ C. Tay cầm chơi game (Gamepad):
|
||||
apply="Chọn",
|
||||
},
|
||||
setting_control={
|
||||
-- title="Cài đặt Điều khiển",
|
||||
title="Điều chỉnh thông số",
|
||||
preview="Xem trước",
|
||||
|
||||
@@ -832,14 +816,6 @@ C. Tay cầm chơi game (Gamepad):
|
||||
paste="Dán mã",
|
||||
submit="Gửi",
|
||||
},
|
||||
-- reset_password={
|
||||
-- title="Đặt lại Mật khẩu",
|
||||
-- send="Gửi mã",
|
||||
-- code="Mã xác nhận",
|
||||
-- password="Mật khẩu",
|
||||
-- password2="Nhập lại Mật khẩu",
|
||||
-- setPW="Đặt mật khẩu",
|
||||
-- },
|
||||
account={
|
||||
title="Tài khoản",
|
||||
},
|
||||
@@ -1083,7 +1059,7 @@ C. Tay cầm chơi game (Gamepad):
|
||||
"Split clear sắp ra mắt!",
|
||||
"Techmino là sự kết hợp giữa \"technique\" và \"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ả!",
|
||||
"Techmino trên Nspire-CX ư? Ừ, nhưng đó là một game khác được viết bởi MrZ!",
|
||||
"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!)",
|
||||
"Những cái tên xuất hiện ở phần nền trong trang Đội Ngũ là danh sách các nhà tài trợ của chúng tôi",
|
||||
"Toàn bộ nhạc game này đã có mặt trên Soundcloud rồi đấy!",
|
||||
@@ -1107,7 +1083,6 @@ C. Tay cầm chơi game (Gamepad):
|
||||
"Bạn có thể mở thư mục chứa dữ liệu từ trang Thống kê",
|
||||
"Bạn có thể thực hiện Spin với tất cả cả miếng gạch trong game này",
|
||||
"Bạn có thể đặt hướng xuất hiện cho từng miếng gạch",
|
||||
"ZS JL T O I",
|
||||
{C.C,"Also try 15puzzle!"},
|
||||
{C.C,"Also try Ballance!"},
|
||||
{C.C,"Also try Minecraft!"},
|
||||
@@ -1143,16 +1118,12 @@ C. Tay cầm chơi game (Gamepad):
|
||||
"Phát âm từ Techmino như thế nào mới đúng?",
|
||||
-- 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?",
|
||||
-- Where to download Techmino?
|
||||
"Tải Techmino ở đâu vậy? Trên GitHub đấy!",
|
||||
-- Techmino's birthday
|
||||
"Ngày sinh nhật của Techmino? Hiện tại (đang giả định) là 26/T6.",
|
||||
-- How to O-spin: Rotate 626 times in one second (mistaken)
|
||||
"Cách O-spin? Nhấn phím xoay 626 lần trong 1 giây (ĐÙA ĐẤY ĐỪNG TIN!)",
|
||||
-- Hope you all like Z... Oh no, like Techmino
|
||||
{"Mình mong các bạn sẽ thích ",C.W,"Z",C.Z,"… Ối! Không phải, thích ",C.G,"Techmino",C.Z," cơ! Nhầm nhầm nhầm!"},
|
||||
-- 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'.
|
||||
@@ -1161,8 +1132,8 @@ C. Tay cầm chơi game (Gamepad):
|
||||
"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!\")",
|
||||
-- O-spin is a lie!
|
||||
{C.Y,"O-spin",C.Z," is a ",C.R,"lie",C.Z,"!"},
|
||||
-- techminohaowan
|
||||
"Hảo Techmino",
|
||||
--
|
||||
@@ -1174,7 +1145,7 @@ 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 tắt nó đi!",
|
||||
"Thông báo tự dưng hiện lên giữa game? Vào cài đặt và 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.",
|
||||
@@ -1187,7 +1158,7 @@ C. Tay cầm chơi game (Gamepad):
|
||||
-- It seems like no one has reached a high level by playing with their feet yet.
|
||||
"Hình như tới giờ chưa ai chơi xếp gạch giỏi bằng chân…",
|
||||
-- Moderate gaming is good for the brain. Addiction to games is harmful. Plan your time
|
||||
"Chơi game vừa phải có thể tốt cho bộ não. Nhưng nếu nghiện thì toeng! Nhớ lập th!ời gian biểu nhé!",
|
||||
"Chơi game vừa phải có thể tốt cho bộ não. Nhưng nếu nghiện thì toang! Nhớ lập thời gian biểu nhé!",
|
||||
-- The ability to dig is extremely important in battles!!!
|
||||
"Khả năng đào xuống (downstacking) của bạn là RẤT QUAN TRỌNG trong chiến đấu!!!",
|
||||
-- Skilled players of the Classic Tetris game are also formidable; don't underestimate them
|
||||
@@ -1197,7 +1168,7 @@ C. Tay cầm chơi game (Gamepad):
|
||||
-- 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 (đã/từng) coi thường hay 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 coi thường hay 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.
|
||||
"Đừng bỏ cuộc khi đống hàng rác đang làm bạn sắp bị top out, bởi bạn có thể biến chúng trở thành đòn phản công.",
|
||||
-- The video shown above is not a recording; it's the robot playing in real-time.
|
||||
@@ -1239,7 +1210,6 @@ C. Tay cầm chơi game (Gamepad):
|
||||
"git stash",
|
||||
"git stash apply",
|
||||
"git submodule update",
|
||||
"git merge --rebase",
|
||||
"git merge --squash",
|
||||
"sudo rm -rf /*",
|
||||
"shutdown /s /t 0", -- Turn off computer completely (no Fast Boot)
|
||||
@@ -1253,26 +1223,25 @@ C. Tay cầm chơi game (Gamepad):
|
||||
{"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."},
|
||||
--
|
||||
-- CHANGELOG
|
||||
{C.lW, "V0.0.091726",": ",C.Z, "Đã thêm hệ thống xoay TRS"},
|
||||
{C.lW, "V0.7.9" ,": ",C.Z, "Đã thêm ",C.yellow,"O-spin"},
|
||||
{C.lW, "V0.7.19" ,": ",C.Z, "Đã thêm hệ thống voice"},
|
||||
{C.lW, "V0.7.22" ,": ",C.Z, "Đã thêm hiệu ứng rơi mượt"},
|
||||
{C.lW, "V0.8.5" ,": ",C.Z, "Đã thêm map và sắp xếp lại các chế độ"},
|
||||
{C.lW, "V0.8.19" ,": ",C.Z, "Đã thêm Pentomino"},
|
||||
{C.lW, "V0.9.0" ,": ",C.Z, "Đã thêm chế độ tự do và khả năng tùy biến chuỗi gạch"},
|
||||
{C.lW, "V0.10.0" ,": ",C.Z, "Đã thêm hệ thống replay"},
|
||||
{C.lW, "V0.11.1" ,": ",C.Z, "Đã thêm Little Z Dictionary (Zictionary)"},
|
||||
{C.lW, "V0.12.2" ,": ",C.Z, "Đã thêm hệ thống mod"},
|
||||
{C.lW, "V0.0.091726",": ",C.Z, "Thêm hệ thống xoay TRS"},
|
||||
{C.lW, "V0.7.9" ,": ",C.Z, "Thêm ",C.yellow,"O-spin"},
|
||||
{C.lW, "V0.7.19" ,": ",C.Z, "Thêm hệ thống voice"},
|
||||
{C.lW, "V0.7.22" ,": ",C.Z, "Thêm hiệu ứng rơi mượt"},
|
||||
{C.lW, "V0.8.5" ,": ",C.Z, "Thêm map và sắp xếp lại các chế độ"},
|
||||
{C.lW, "V0.8.19" ,": ",C.Z, "Thêm Pentomino"},
|
||||
{C.lW, "V0.9.0" ,": ",C.Z, "Thêm chế độ tự do và cho phép tùy biến chuỗi gạch"},
|
||||
{C.lW, "V0.10.0" ,": ",C.Z, "Thêm hệ thống replay"},
|
||||
{C.lW, "V0.11.1" ,": ",C.Z, "Thêm Little Z Dictionary (Zictionary)"},
|
||||
{C.lW, "V0.12.2" ,": ",C.Z, "Thêm hệ thống mod"},
|
||||
{C.lW, "V0.13.0" ,": ",C.Z, "Thử nghiệm chế độ trực tuyến"},
|
||||
{C.lW, "V0.13.2" ,": ",C.Z, "Đã thêm khả năng tùy biến chiều cao bảng"},
|
||||
{C.lW, "V0.13.3" ,": ",C.Z, "Đã thêm console"},
|
||||
{C.lW, "V0.14.5" ,": ",C.Z, "Đã thêm BGM đầu tiên được remix bởi cộng đồng"},
|
||||
{C.lW, "V0.15.5" ,": ",C.Z, "Đã thêm menu replay"},
|
||||
{C.lW, "V0.16.0" ,": ",C.Z, "Đã thêm hệ thống xoay BiRS"},
|
||||
{C.lW, "V0.16.2" ,": ",C.Z, "Đã thêm studio SFX với phong cách hit pad"},
|
||||
{C.lW, "V0.17.0" ,": ",C.Z, "Đã thêm hõ trợ điều khiển bằng joystick"},
|
||||
{C.lW, "V0.13.2" ,": ",C.Z, "Thêm khả năng thay đổi chiều cao bảng"},
|
||||
{C.lW, "V0.13.3" ,": ",C.Z, "Thêm console"},
|
||||
{C.lW, "V0.14.5" ,": ",C.Z, "Thêm BGM đầu tiên được remix bởi cộng đồng"},
|
||||
{C.lW, "V0.15.5" ,": ",C.Z, "Thêm menu replay"},
|
||||
{C.lW, "V0.16.0" ,": ",C.Z, "Thêm hệ thống xoay BiRS"},
|
||||
{C.lW, "V0.16.2" ,": ",C.Z, "Thêm studio SFX với phong cách hit pad"},
|
||||
{C.lW, "V0.17.0" ,": ",C.Z, "Thêm khả năng điều khiển bằng joystick"},
|
||||
{C.lW, "V0.17.3" ,": ",C.Z, "Dừng phát triển Techmino, tập trung phát triển game mới"},
|
||||
{C.lW, "V0.17.12" ,": ",C.Z, "Đã thêm ngôn ngữ tiếng Việt"},
|
||||
--
|
||||
-- MATH FORMULAS
|
||||
"(a+b)²=a²+2ab+b²",
|
||||
@@ -1298,15 +1267,13 @@ C. Tay cầm chơi game (Gamepad):
|
||||
--
|
||||
-- SEA'S JOKE
|
||||
{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 đ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/hoiphuhovietnam"}, -- Tetris Vietnam (TVN)
|
||||
{"\"Tetris Việt Nam\"? Không, đó là \"Hội phụ hồ Việt Nam\""},
|
||||
{C.W,"MrZ ",C.Z,"vẫn chưa biết chọn tên nào để đặt cho từ điển của Techmino. Hiện có 3 tên: \"Zictionary\", \"TetroDictionary\" và \"Little Z Dictionary\""},
|
||||
"Ủa tao nhớ game này tên là xếp hình mà? Ừ thì đúng nhưng để giữ độ đồng nhất và tránh bị cấn mồm thì nên gọi game này là game xếp gạch.",
|
||||
{"Cộng đồng Tetris ",C.R,"Việt ",C.lY,"Nam ",C.Z,": https://discord.gg/jX7BX9g"}, -- Tetris Vietnam (TVN)
|
||||
{"\"Tetris Việt Nam\"? Không, đó là \"Hội phụ hồ Việt Nam\" (https://discord.gg/hoiphuhovietnam)"},
|
||||
"\"Zictionary\" có 2 tên gọi khác, đó là: \"TetroDictionary\" và \"Little Z Dictionary\"",
|
||||
"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 in TVN
|
||||
-- Who will you choose? A girl that can break up to you and make you sad
|
||||
|
||||
@@ -377,6 +377,15 @@ local commands={} do
|
||||
"Usage: openurl [url]",
|
||||
},
|
||||
}
|
||||
commands.viewlog={
|
||||
code=goScene('viewlog'),
|
||||
description="View crash logs",
|
||||
details={
|
||||
"Open the crash logs menu",
|
||||
"",
|
||||
"Usage: viewlog"
|
||||
}
|
||||
}
|
||||
commands.scrinfo={
|
||||
code=function()
|
||||
for _,v in next,SCR.info() do
|
||||
@@ -478,7 +487,9 @@ local commands={} do
|
||||
commands.setbg={
|
||||
code=function(name)
|
||||
if name~="" then
|
||||
if name~=BG.cur then
|
||||
if SETTING.lockBG then
|
||||
log{"Background is currently ",C.R,"locked",C.Z,"! You can unlock it in Video settings."}
|
||||
elseif name~=BG.cur then
|
||||
if BG.set(name) then
|
||||
log(("Background set to '%s'"):format(name))
|
||||
else
|
||||
@@ -502,7 +513,7 @@ local commands={} do
|
||||
code=function(name)
|
||||
if name~="" then
|
||||
if SETTING.noTheme then
|
||||
log{"Theme is ",C.R,"disabled",C.Z,"! Please re-enable it before trying this command again"}
|
||||
log{"Themes are currently ",C.R,"disabled",C.Z,"! You can re-enable it in Video settings."}
|
||||
else
|
||||
if THEME.set(name) then
|
||||
log("Theme set to: "..name)
|
||||
@@ -1153,4 +1164,4 @@ scene.widgetList={
|
||||
inputBox,
|
||||
}
|
||||
|
||||
return scene
|
||||
return scene
|
||||
@@ -98,6 +98,7 @@ function scene.enter()
|
||||
end
|
||||
|
||||
function scene.leave()
|
||||
showingKey=false
|
||||
TABLE.clear(textObj)
|
||||
TABLE.clear(pianoVK)
|
||||
collectgarbage()
|
||||
@@ -217,8 +218,7 @@ generateVKey=function()
|
||||
|
||||
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
|
||||
-- Holding key: self.activateState=activateState and activateState or not activationTime>maxTime and self.activateState or 0 end
|
||||
-- TODO: when the note can be extended longer, this will need remaking
|
||||
if dt then
|
||||
if self.activateState>0 then self.ATV=min(activationTime+dt*60,maxTime)
|
||||
elseif activationTime>0 then self.ATV=max(activationTime-dt*30,0)
|
||||
@@ -238,4 +238,4 @@ generateVKey=function()
|
||||
pianoVK.shift:setObject(CHAR.key.shift)
|
||||
end
|
||||
|
||||
return scene
|
||||
return scene
|
||||
|
||||
@@ -350,7 +350,7 @@ scene.widgetList={
|
||||
WIDGET.newSwitch{name='phyHold', x=560, y=1030,lim=200, disp=CUSval('phyHold'),code=CUSrev('phyHold'),hideF=function() return CUSTOMGAME_LOCAL.customenv.holdCount==0 end},
|
||||
|
||||
-- BG & BGM
|
||||
WIDGET.newSelector{name='bg', x=840, y=1100,w=250,color='Y',list=BG.getList(),disp=CUSval('bg'),code=function(i) CUSTOMGAME_LOCAL.customenv.bg=i BG.set(i) end},
|
||||
WIDGET.newSelector{name='bg', x=840, y=1100,w=250,color='Y',list=BG.getList(),disp=CUSval('bg'),code=function(i) CUSTOMGAME_LOCAL.customenv.bg=i BG.set(i) end,hideF=SETval('lockBG')},
|
||||
WIDGET.newSelector{name='bgm', x=1120,y=1100,w=250,color='Y',list=BGM.getList(),disp=CUSval('bgm'),code=function(i) CUSTOMGAME_LOCAL.customenv.bgm=i BGM.play(i) end},
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ local function _updateContentBox()
|
||||
local _t,t
|
||||
_t,t=pcall(function() return _getList()[listBox.selected].content end)
|
||||
if not _t then t={"???"} end
|
||||
local _w,c=FONT.get(currentFontSize):getWrap(t,840)
|
||||
local _w,c=getFont(currentFontSize):getWrap(t,840)
|
||||
contentBox:setTexts(c)
|
||||
end
|
||||
-- Clear the result
|
||||
@@ -204,13 +204,12 @@ function scene.keyDown(key)
|
||||
elseif key=='f1' then
|
||||
SCN.go(
|
||||
'textReader',nil,
|
||||
(text.dict.helpText:repD(
|
||||
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)
|
||||
):split('\n'),
|
||||
currentFontSize,
|
||||
CHAR.icon.help,CHAR.icon.copy,CHAR.icon.globe,CHAR.key.winMenu),
|
||||
20,
|
||||
'rainbow'
|
||||
)
|
||||
|
||||
@@ -226,7 +225,7 @@ function scene.keyDown(key)
|
||||
-- )
|
||||
-- if not success then
|
||||
-- SFX.play('finesseError_long')
|
||||
-- _,_r=FONT.get(30):getWrap(tostring(_r),1000)
|
||||
-- _,_r=getFont(30):getWrap(tostring(_r),1000)
|
||||
-- MES.new("error","Hotload failed! May need restarting!\n\n"..table.concat(_r,"\n"))
|
||||
-- else
|
||||
-- local lastLscrollPos=listBox.scrollPos
|
||||
@@ -313,12 +312,12 @@ scene.widgetList={
|
||||
WIDGET.newKey{name='link',x=1234,y=520,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=590,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=300,w=60,font=40,fText=CHAR.icon.zoomIn,code=function() _setZoom(5) end},
|
||||
WIDGET.newKey{name='zoomout',x=1234,y=370,w=60,font=40,fText=CHAR.icon.zoomOut,code=function() _setZoom(-5) end},
|
||||
WIDGET.newKey{name='fontup',x=1234,y=300,w=60,font=40,fText=CHAR.icon.fontUp,code=function() _setZoom(5) end},
|
||||
WIDGET.newKey{name='fontdown',x=1234,y=370,w=60,font=40,fText=CHAR.icon.fontDown,code=function() _setZoom(-5) end},
|
||||
WIDGET.newKey{name='resetzoom',x=1234,y=440,w=60,font=40,fText=CHAR.icon.zoomDefault,code=function() _setZoom(0) end},
|
||||
|
||||
WIDGET.newButton{name='back',x=1185,y=60,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene},
|
||||
WIDGET.newKey{name='help',x=1170,y=140,w=200,h=60,font=40,fText=CHAR.controller.xboxY.."/[F1]: "..CHAR.icon.help,code=pressKey'f1'},
|
||||
}
|
||||
-- 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
|
||||
-- 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
|
||||
|
||||
@@ -212,7 +212,7 @@ end
|
||||
scene.widgetList={
|
||||
WIDGET.newButton{name='offline',x=-1200,y=210,w=800,h=100,color='lR',font=45,align='R',edge=30,code=pressKey'1'},
|
||||
WIDGET.newButton{name='qplay', x=-1200,y=330,w=800,h=100,color='lM',font=40,align='R',edge=30,code=pressKey'q'},
|
||||
WIDGET.newButton{name='online', x=-1200,y=450,w=800,h=100,color='lV',font=45,align='R',edge=30,code=pressKey'a'},
|
||||
WIDGET.newButton{name='online', x=-1200,y=450,w=800,h=100,color='D',font=45,align='R',edge=30,code=pressKey'a'},
|
||||
WIDGET.newButton{name='custom', x=-1200,y=570,w=800,h=100,color='lS',font=45,align='R',edge=30,code=pressKey'z'},
|
||||
|
||||
WIDGET.newButton{name='setting',x=2480,y=210,w=800,h=100, color='lO',font=40,align='L',edge=30,code=pressKey'-'},
|
||||
@@ -221,7 +221,7 @@ scene.widgetList={
|
||||
WIDGET.newButton{name='replays',x=2480,y=570,w=800,h=100, color='lC',font=40,align='L',edge=30,code=pressKey','},
|
||||
|
||||
WIDGET.newButton{name='music', x=90,y=80,w=100, color='lY',code=pressKey'2',font=70,fText=CHAR.icon.music},
|
||||
WIDGET.newButton{name='notice', x=210,y=80,w=100, color='lA',code=pressKey'3',font=70,fText=CHAR.key.winMenu},
|
||||
WIDGET.newButton{name='notice', x=210,y=80,w=100, color='D',code=pressKey'3',font=70,fText=CHAR.key.winMenu},
|
||||
WIDGET.newButton{name='lang', x=330,y=80,w=100, color='lN',code=pressKey'4',font=70,fText=CHAR.icon.language},
|
||||
WIDGET.newButton{name='about', x=-110,y=670,w=600,h=70, color='lB',align='R',edge=20,code=pressKey'x',font=50,fText=CHAR.icon.info},
|
||||
WIDGET.newButton{name='manual', x=1390,y=670,w=600,h=70, color='lR',align='L',edge=20,code=pressKey'm',font=50,fText=CHAR.icon.help},
|
||||
|
||||
@@ -165,6 +165,8 @@ function scene.keyDown(key,isRep)
|
||||
SFX.play('clear_3')
|
||||
SYSFX.newShade(1.2,555,200,620,380,.6,.6,.6)
|
||||
end
|
||||
elseif KEY_MAP.keyboard[key]==0 then -- custom restart key
|
||||
scene.keyDown('r')
|
||||
else
|
||||
return true
|
||||
end
|
||||
@@ -187,6 +189,14 @@ end
|
||||
scene.mouseUp=scene.touchUp
|
||||
scene.mouseDown=scene.touchDown
|
||||
|
||||
function scene.gamepadDown(key)
|
||||
if key=='back' then
|
||||
scene.keyDown('escape')
|
||||
elseif KEY_MAP.joystick[key]==0 then
|
||||
scene.keyDown('r')
|
||||
end
|
||||
end
|
||||
|
||||
function scene.update(dt)
|
||||
if not (GAME.result or GAME.replaying) then
|
||||
GAME.pauseTime=GAME.pauseTime+dt
|
||||
|
||||
@@ -135,7 +135,7 @@ scene.widgetList={
|
||||
disp=SETval('lockBG'),
|
||||
code=function()
|
||||
SETTING.lockBG=not SETTING.lockBG
|
||||
applySettings()
|
||||
applySettings('lockBG')
|
||||
end,
|
||||
hideF=function() return SETTING.bg~='on' end
|
||||
},
|
||||
@@ -150,7 +150,7 @@ scene.widgetList={
|
||||
MES.new('warn',text.settingWarn2,6.26)
|
||||
end
|
||||
else
|
||||
THEME.set(THEME.calculate())
|
||||
THEME.set(THEME.calculate(),GAME.playing)
|
||||
WIDGET.setWidgetList(scene.widgetList)
|
||||
end
|
||||
end
|
||||
|
||||
176
parts/scenes/viewlog.lua
Normal file
176
parts/scenes/viewlog.lua
Normal file
@@ -0,0 +1,176 @@
|
||||
local fullLog,currentLogID
|
||||
local logTimeList={}
|
||||
local currentLogText={}
|
||||
|
||||
local gc=love.graphics
|
||||
local min,max=math.min,math.max
|
||||
local scene={}
|
||||
|
||||
local textBox=WIDGET.newTextBox {x= 30,y= 45,w=1000,h=540,font=25,fix=true}
|
||||
local logList=WIDGET.newSelector{x=305,y=640,w= 550,name='list',color='O',fText='Crash log',list={''},disp=function() return '' end,code=function() end}
|
||||
|
||||
local function updateText()
|
||||
currentLogText=fullLog[currentLogID]:split('\n')
|
||||
do
|
||||
local _,wt=getFont(25):getWrap(fullLog[currentLogID],975)
|
||||
textBox:setTexts(wt)
|
||||
end
|
||||
logList.select=currentLogID
|
||||
logList.selText=currentLogText[1]
|
||||
end
|
||||
|
||||
local function noLogFound()
|
||||
local _w=scene.widgetList
|
||||
_w.home.hide=true;_w.list.hide=true
|
||||
_w.endd.hide=true;_w.del .hide=true
|
||||
_w.copy.hide=true;_w.delA.hide=true
|
||||
|
||||
logList.list={''}
|
||||
logList.select=false
|
||||
logList.disp=function() return '' end
|
||||
logList.code=function() end
|
||||
logList:reset()
|
||||
end
|
||||
|
||||
function scene.enter()
|
||||
fullLog=FILE.load('/conf/error.log','-string -canskip') or '/conf/error.log not found'
|
||||
|
||||
if fullLog=='/conf/error.log not found' then noLogFound()
|
||||
else
|
||||
-- Fix data first
|
||||
fullLog=table.concat(fullLog:split('\n\nTraceback'),'\nTraceback'):split('\n\n')
|
||||
|
||||
-- Get timestamps and add into logTimeList for the selector
|
||||
TABLE.reverse(fullLog)
|
||||
for i,d in pairs(fullLog) do logTimeList[i]=d:split('\n')[1] end
|
||||
|
||||
currentLogID=1
|
||||
updateText()
|
||||
|
||||
local _w=scene.widgetList
|
||||
_w.home.hide=false;_w.list.hide=false
|
||||
_w.endd.hide=false;_w.del .hide=false
|
||||
_w.copy.hide=false;_w.delA.hide=false
|
||||
|
||||
logList.list=logTimeList
|
||||
logList.select=false
|
||||
logList.disp=function() return currentLogText[1] end
|
||||
logList.code=function(_,s)
|
||||
if s>currentLogID
|
||||
then scene.keyDown('right')
|
||||
else scene.keyDown('left') end
|
||||
updateText()
|
||||
end
|
||||
logList:reset()
|
||||
end
|
||||
end
|
||||
local deleteOld,deleteAll
|
||||
do
|
||||
local sureTime=-1e99
|
||||
function deleteOld()
|
||||
local function task_redButton()
|
||||
scene.widgetList.del.color=COLOR.Y
|
||||
for _=1,120 do coroutine.yield() end
|
||||
scene.widgetList.del.color=COLOR.dY
|
||||
end
|
||||
|
||||
if TIME()-sureTime<1 then
|
||||
sureTime=-1e99
|
||||
scene.widgetList.del.color=COLOR.dY
|
||||
do
|
||||
local temp=TABLE.sub(TABLE.copy(fullLog),1,25)
|
||||
fullLog=TABLE.copy(temp)
|
||||
temp=table.concat(temp,'\n\n')..'\n\n'
|
||||
|
||||
logTimeList=TABLE.sub(logTimeList,1,25)
|
||||
currentLogID=min(logList.select,25)
|
||||
logList.select=currentLogID
|
||||
logList.list=logTimeList
|
||||
updateText()
|
||||
|
||||
TASK.removeTask_code(task_redButton)
|
||||
FILE.save(temp,'/conf/error.log','-string')
|
||||
end
|
||||
else
|
||||
sureTime=TIME()
|
||||
MES.new('warn',text.sureDelete)
|
||||
TASK.removeTask_code(task_redButton)
|
||||
TASK.new(task_redButton)
|
||||
end
|
||||
end
|
||||
end
|
||||
do
|
||||
local sureTime=-1e99
|
||||
function deleteAll()
|
||||
local function task_redButton()
|
||||
scene.widgetList.delA.color=COLOR.R
|
||||
for _=1,120 do coroutine.yield() end
|
||||
scene.widgetList.delA.color=COLOR.dR
|
||||
end
|
||||
|
||||
if TIME()-sureTime<1 then
|
||||
sureTime=-1e99
|
||||
scene.widgetList.delA.color=COLOR.dR
|
||||
love.filesystem.remove('/conf/error.log')
|
||||
|
||||
noLogFound()
|
||||
TASK.removeTask_code(task_redButton)
|
||||
SCN.swapTo('viewLog','none')
|
||||
else
|
||||
sureTime=TIME()
|
||||
MES.new('warn',text.sureDelete)
|
||||
TASK.removeTask_code(task_redButton)
|
||||
TASK.new(task_redButton)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function scene.wheelMoved(_,y)
|
||||
WHEELMOV(y)
|
||||
end
|
||||
|
||||
function scene.keyDown(key)
|
||||
if key=='left' then
|
||||
currentLogID=math.max(1,currentLogID-1)
|
||||
updateText()
|
||||
elseif key=='right' then
|
||||
currentLogID=math.min(currentLogID+1,#fullLog)
|
||||
updateText()
|
||||
elseif key=='home' then
|
||||
currentLogID=1
|
||||
updateText()
|
||||
elseif key=='end' then
|
||||
currentLogID=#fullLog
|
||||
updateText()
|
||||
elseif key=='up' then
|
||||
textBox:scroll(-5)
|
||||
elseif key=='down' then
|
||||
textBox:scroll(5)
|
||||
elseif key=='pageup' then
|
||||
textBox:scroll(-20)
|
||||
elseif key=='pagedown' then
|
||||
textBox:scroll(20)
|
||||
elseif key=='escape' then
|
||||
SCN.back()
|
||||
end
|
||||
end
|
||||
|
||||
function scene.draw()
|
||||
setFont(40)
|
||||
gc.print(currentLogID..' / '..#fullLog,1000,800)
|
||||
end
|
||||
|
||||
scene.widgetList={
|
||||
textBox,
|
||||
WIDGET.newButton {name='home',x=1140,y= 90,w=170,h=80,sound='click',font=60,fText=CHAR.key.macHome,code=pressKey('home')},
|
||||
WIDGET.newButton {name='endd',x=1140,y=190,w=170,h=80,sound='click',font=60,fText=CHAR.key.macEnd ,code=pressKey('end')},
|
||||
WIDGET.newButton {name='copy',x=1140,y=290,w=170,h=80,sound='click',font=60,fText=CHAR.icon.copy ,code=function()love.system.setClipboardText(table.concat(textBox.texts,'\n'))end,color='lC'},
|
||||
|
||||
logList,
|
||||
|
||||
WIDGET.newKey {name='del' ,x= 710,y=640,w=200,h=80,sound=false, font=30,fText='Clear old' ,color='dY',code=deleteOld},
|
||||
WIDGET.newKey {name='delA',x= 930,y=640,w=200,h=80,sound=false, font=30,fText='DELETE ALL!',color='dR',code=deleteAll},
|
||||
|
||||
WIDGET.newButton {name='back',x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene},
|
||||
}
|
||||
return scene
|
||||
@@ -58,7 +58,7 @@ function THEME.calculate(Y,M,D)
|
||||
)
|
||||
end
|
||||
|
||||
function THEME.set(theme)
|
||||
function THEME.set(theme,keepBGM)
|
||||
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])
|
||||
@@ -99,7 +99,7 @@ function THEME.set(theme)
|
||||
|
||||
THEME.cur=theme
|
||||
BG.set()
|
||||
BGM.play()
|
||||
if not keepBGM then BGM.play() end
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
@@ -5,21 +5,21 @@
|
||||
新增:
|
||||
新模式:拼花-棋盘 (by NOT_A_ROBOT) #999
|
||||
新模式:拼花-反大于号 (by NOT_A_ROBOT) #999
|
||||
新模式:消四挖掘 (从隐藏改为地图可见)
|
||||
新增skip暂存模式
|
||||
新模式:消四挖掘 (by Gompyn) (从隐藏改为地图可见)
|
||||
首次hold致死也会有额外的I_S时间了 (by Gompyn) #1061 #1055
|
||||
暂停界面也可以使用设置的重开键(优先级较低)
|
||||
自定义游戏可以保存录像并回放了 (by Gompyn) #1007
|
||||
支持自定义菜单背景(by Squishy) #1070
|
||||
TAS工具添加自动跳过功能 (by NOT_A_ROBOT) #992
|
||||
越南语词典和帮助 (by Shard Nguyễn, Squishy and TVN community) #1012
|
||||
新增skip暂存模式
|
||||
改动:
|
||||
越南语词典和帮助 (by Shard Nguyễn, Squishy and TVN community) #1012
|
||||
20g段位模式铁门未达标时显示具体信息 (by NOT_A_ROBOT) #985
|
||||
优化科研-操作限制模式的限制规则
|
||||
操作次数限制模式从地图移除,且目标改为消40行(录像将无法正常播放)
|
||||
自定义游戏可以保存录像并回放了 (by Gompyn) #1007
|
||||
自定义场地高度上限改为126 #1045
|
||||
首次hold致死也会有额外的I_S时间了 #1061 #1055
|
||||
操作次数限制模式从地图移除,且目标改为消40行(录像将无法正常播放)
|
||||
降低100行竞速B评价要求 (226s → 260s)
|
||||
回放时模式名称下边不再显示当前模式本地pb
|
||||
调整c4w_n模式排行榜成绩格式改为时间在前
|
||||
自定义场地高度上限改为126 #1045
|
||||
文本层面统一HPC为Half PC
|
||||
删除五连块和三连块模式图标的图片文件
|
||||
场地编辑界面显示隐形块
|
||||
@@ -31,6 +31,7 @@
|
||||
自定义游戏没有正确传递hold开关 #779
|
||||
调整语音音量时测试音频太乱 #823
|
||||
游戏中用f11切换全屏会影响背景 (by Squishy) #603 #1070
|
||||
修卡块旋转音效播放条件错误
|
||||
dropper小程序玩不了
|
||||
词典滚动列表框报错
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
return {
|
||||
["apkCode"]=1715,
|
||||
["code"]=1715,
|
||||
["string"]="V0.17.15",
|
||||
["room"]="ver A-11",
|
||||
["apkCode"]=1716,
|
||||
["code"]=1716,
|
||||
["string"]="V0.17.16",
|
||||
["room"]="ver A-12",
|
||||
["name"]="暂停 Break",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user