Compare commits

..

142 Commits

Author SHA1 Message Date
MrZ626
04faf21764 0.13.3 hotfix 2021-03-15 00:49:20 +08:00
MrZ626
9d4aa9187c 微调英文词典对das cut的说明 2021-03-15 00:38:03 +08:00
user670
344f76b705 Update dict_en.lua (#55) 2021-03-15 00:35:10 +08:00
MrZ626
ea64b9e987 再修改中文词典中dascut的说明 2021-03-15 00:02:16 +08:00
MrZ626
ed8a6c1607 微调中文词典中das cut词条的说明 2021-03-14 23:43:05 +08:00
MrZ626
0899560086 修复物理hold的踢墙错误 2021-03-14 23:37:53 +08:00
MrZ626
32b75cbec3 微调两个小程序的返回按钮功能,修复移动端触屏无法退出dropper 2021-03-14 21:38:14 +08:00
MrZ626
3e25f9c1d7 修复加载界面点空白的地方会触发13号按钮 2021-03-14 21:06:21 +08:00
MrZ626
c46fd84767 词典增加物理hold的说明,英文待补充 2021-03-14 21:04:32 +08:00
MrZ626
a2ccff5959 0.13.3: 科技飞跃 2021-03-14 21:02:07 +08:00
MrZ626
c064b8d0f3 修复重开后虚拟按键失效 2021-03-14 20:24:46 +08:00
MrZ626
3484d35b77 微调中文tip 2021-03-14 19:31:59 +08:00
MrZ626
d8a3e1c97a 略微优化智能画笔的行为 2021-03-14 19:11:40 +08:00
MrZ626
7020bbc55d 修复STAT.lastPlay的更新时机不当 2021-03-14 12:47:16 +08:00
MrZ626
56803fa83b 微调评级字母颜色 2021-03-14 01:33:11 +08:00
MrZ626
030956bdb8 修复键盘可以移动焦点到隐藏的按钮上 2021-03-14 01:31:28 +08:00
MrZ626
835690c609 修复hold代码调整后O变形不保留名字和颜色 2021-03-13 15:12:30 +08:00
MrZ626
1d8e2094e0 调整模式地图右侧信息版面透明度 2021-03-13 11:21:16 +08:00
MrZ626
a6389ce4be 优化小程序refl的ui和触屏控制 2021-03-13 11:15:30 +08:00
MrZ626
a22cc09675 优化小程序ten的手感,外框颜色会变化 2021-03-13 00:58:17 +08:00
MrZ626
17c301c775 再次修复cmd的help命令错误 2021-03-12 18:55:53 +08:00
MrZ626
4ad28a324a 智能画笔按钮改成绿色 2021-03-12 16:53:20 +08:00
MrZ626
12254b5849 调整软件锁进入方法 2021-03-12 16:03:24 +08:00
MrZ626
d178140d7d 更新新版关闭软件锁防止不知道方法进不去 2021-03-12 15:45:59 +08:00
MrZ626
2dfbee784d 简化自定义模式高级设置 2021-03-12 15:40:37 +08:00
MrZ626
29844c5716 自定义场地新增智能画笔 2021-03-12 12:15:37 +08:00
MrZ626
392798d7f5 整理代码 2021-03-12 11:26:10 +08:00
MrZ626
666a3bd6ef 修复主菜单esc键没用 2021-03-12 11:23:53 +08:00
MrZ626
159d1e4e57 cmd初始文字增加一个警告 2021-03-12 00:57:10 +08:00
MrZ626
e90515453a 修改游戏启动时立刻进入cmd的方法 2021-03-12 00:56:58 +08:00
MrZ626
7aa38225fe 优化灯笼背景代码,修改背景说明 2021-03-12 00:50:47 +08:00
MrZ626
cfa6b8cd90 修复物理hold的位置测试顺序不正确 2021-03-12 00:41:49 +08:00
MrZ626
2f6d53a88f 更新词典的小程序入口说明 2021-03-12 00:08:08 +08:00
MrZ626
832d222f5d 镜头移动微调,高处更容易看清 2021-03-11 19:13:51 +08:00
MrZ626
00b4a206ab 更改无尽挖掘的BGM 2021-03-11 18:45:04 +08:00
MrZ626
dd07df9ac0 新增小程序polyforge,以及配套BGM: dream和一个白色背景 2021-03-11 18:36:48 +08:00
MrZ626
974f2b823c 整理代码,关闭大量小程序的按键自动重复 2021-03-11 18:33:57 +08:00
MrZ626
2ebf8f5941 新增小程序:reflect 2021-03-11 02:05:38 +08:00
MrZ626
0fc8d864ea 修改uttt的文件名,之前不知道为什么忘了改 2021-03-10 19:20:56 +08:00
MrZ626
28fd42fdd3 cmd中help命令的解析更清晰 2021-03-10 19:20:28 +08:00
MrZ626
e8c471c059 cmd小程序esc键立即切换焦点到输入栏 2021-03-10 13:36:48 +08:00
MrZ626
d9da71723d 主菜单添加几个快捷键 2021-03-10 13:34:27 +08:00
MrZ626
3ca0f6f9af cmd新增stopbgm命令,rst命令有输出了 2021-03-10 12:49:32 +08:00
MrZ626
f45331d019 整理代码 2021-03-10 12:49:28 +08:00
MrZ626
39e18df6e7 小程序cmd添加playbgm命令 2021-03-10 02:16:14 +08:00
MrZ626
6cb5c1a179 删除三个声音模块中不知道什么时候加的没用的东西 2021-03-10 02:15:45 +08:00
MrZ626
db51b68058 把蓝绿添加到staff名单,调整词条内容 2021-03-10 02:02:01 +08:00
MrZ626
f128527039 修复加载中错误会直接闪退 2021-03-10 02:01:58 +08:00
MrZ626
5694316eac 整理代码 2021-03-10 02:01:52 +08:00
MrZ626
7fdc5729d2 修复地图上菱形模式点击判定尺寸错误 2021-03-10 01:13:46 +08:00
MrZ626
fc1f363a8b 调整require的写法 2021-03-10 00:50:08 +08:00
MrZ626
1545cb2154 简化LANG模块的初始化方法 2021-03-10 00:45:10 +08:00
MrZ626
1e58ef93a4 两个模式图标改为代码绘制 2021-03-09 23:38:08 +08:00
MrZ626
d9dd56f6e2 新增doGC工具函数,三个模式图标改为代码绘制 2021-03-09 23:25:40 +08:00
MrZ626
11d7caa6f6 把旋律星萤添加到staff名单 2021-03-09 12:55:13 +08:00
MrZ626
36c5432c65 再修改地图ui和暂停界面rank显示 2021-03-09 12:54:13 +08:00
MrZ626
940e08ea54 微调中文tip 2021-03-09 00:58:20 +08:00
MrZ626
0de1317d2f 地图UI升级,增加模式图标 2021-03-09 00:52:30 +08:00
MrZ626
d2e6fd2dcc 调整一帧加载资源个数 2021-03-08 20:12:24 +08:00
MrZ626
9527d7c0c2 修复cmd的help问题和scrinfo说明语法 2021-03-08 18:51:31 +08:00
MrZ626
c73e07ecaf 词典添加ParticleG 2021-03-08 18:07:59 +08:00
MrZ626
8058a9385a 微调cmd的注释和部分函数说明 2021-03-08 16:21:31 +08:00
MrZ626
44a859296a 调整cmd小程序的ui和部分交互逻辑 2021-03-08 16:21:31 +08:00
MrZ626
057b36bf5b 小程序cmd添加url指令 2021-03-08 16:21:31 +08:00
MrZ626
3ce669442d 初始化退出场景移出scene模块 2021-03-08 16:21:31 +08:00
MrZ626
bb3de2c396 离开加载动画时按住R可以进入命令行 2021-03-08 15:48:44 +08:00
MrZ626
796bd649c2 FESTIVAL变量改名THEME 2021-03-08 14:33:23 +08:00
MrZ626
30a8444840 加载动画交互优化 2021-03-08 12:59:32 +08:00
MrZ626
fc7695a9f3 修复混战模式极限难度没有20G 2021-03-08 12:43:58 +08:00
MrZ626
d1d2def4b0 修复软件锁按方括号和点击鼠标报错 2021-03-08 12:43:22 +08:00
MrZ626
f17a776c14 cmd整理代码,系统log支持颜色,新增rst命令,修改scrinfo说明 2021-03-08 12:21:07 +08:00
MrZ626
f9b2929a64 使用TABLE.reIndex整理代码 2021-03-08 12:19:46 +08:00
MrZ626
22b4924b63 table扩展模块加入reIndex方法 2021-03-08 12:19:46 +08:00
MrZ626
dfba194108 删除screen模块info方法输出的第一行文字说明 2021-03-08 12:19:45 +08:00
MrZ626
a5f3315037 整理cmd代码,用户代码能访问更多东西并且使用保护模式执行可以返回错误,增加一个解谜要素 2021-03-08 10:34:56 +08:00
user670
02051b5413 Changes to the command "festival" (#54)
- festival no longer takes "flag" as a valid argument
- `festival list` is now accepted, displaying a list of available
  festivals
- festival will now prompt usage, rather than complain about an invalid
  festival, on empty args
- added help for this command
2021-03-08 07:26:12 +08:00
MrZ626
74622c377f 强行切换节日代码移入cmd 2021-03-08 02:17:59 +08:00
MrZ626
d034be1aff 整理代码(user670升级的cmd小程序) 2021-03-08 02:07:48 +08:00
user670
df0be2468e A few changes made to the cmd minigame (#52)
* (Attempt to) mod the command minigame. (It seems to have gonne wrong, don't
merge this)

* Fixed my previous commit. Also fixed the bug in fn command.
2021-03-08 01:56:17 +08:00
MrZ626
ce2bf43eab 主菜单机器人不再发出极简错误提示音 2021-03-08 01:42:25 +08:00
MrZ626
f418a22c42 小游戏改名小程序 2021-03-08 01:40:16 +08:00
MrZ626
bcf1c9c7d4 电梯楼层灯可交互,软件锁回归 2021-03-08 01:31:57 +08:00
MrZ626
ca6d3ba9e2 加载动画添加进楼层效果 2021-03-08 00:20:36 +08:00
MrZ626
0aca743e0c staff表微调 2021-03-08 00:20:12 +08:00
MrZ626
c75edd9af8 新增BGM:venus(用于zen) 2021-03-07 23:44:18 +08:00
MrZ626
e3f3c87c30 shell里的版权声明微调 2021-03-07 23:04:39 +08:00
MrZ626
ccdfce9f88 整理代码,修复旋转时向上踢墙扣两点刷新次数 2021-03-07 22:40:48 +08:00
MrZ626
9cd4bd55a1 修复cmd中fn报错 2021-03-07 22:08:03 +08:00
MrZ626
311a11e1df 升级踢墙表初始化代码,修复部分方块按180度报错 2021-03-07 20:36:26 +08:00
MrZ626
db99ed87a0 新增小游戏(确信):cmd 2021-03-07 20:01:46 +08:00
MrZ626
40f9bb28f5 微调textBox控件的clear方法 2021-03-07 20:01:09 +08:00
MrZ626
c1e36b0669 SCR模块print方法改为info方法 2021-03-07 19:49:08 +08:00
MrZ626
cdfe748f08 允许自定义textBox控件的行间距 2021-03-07 19:48:43 +08:00
MrZ626
1c53d0bea5 整理代码 2021-03-07 16:08:08 +08:00
MrZ626
8b445a49b9 删除计算器的秘密数字功能 2021-03-07 16:04:50 +08:00
MrZ626
c68df20847 计算器地位改为小游戏,软件锁功能取消,未来准备与加载动画合并 2021-03-07 15:19:04 +08:00
MrZ626
7509420d72 小游戏dropper的返回按钮样式微调 2021-03-07 15:07:25 +08:00
MrZ626
db539dafd1 增加一个提示ide加载love api的文件,删除一个多余文件,删除安卓的联网库so文件 2021-03-07 13:47:51 +08:00
MrZ626
b842293563 增加一个提示ide加载love api的文件,删除一个多余文件 2021-03-07 13:41:58 +08:00
MrZ626
3818c32d33 Revert "增加一个ignore文件"
This reverts commit 3bf447cb86.
2021-03-07 13:38:51 +08:00
MrZ626
3bf447cb86 增加一个ignore文件 2021-03-07 13:04:32 +08:00
MrZ626
5f14acf1f2 修复词典的小游戏词条显示不全 2021-03-07 12:57:27 +08:00
MrZ626
ab7e0e31f6 新增小游戏dropper 2021-03-07 12:57:27 +08:00
MrZ626
6dee6e5481 小游戏ten增加竞速开关,操作更灵活并且延迟更小 2021-03-07 12:57:27 +08:00
MrZ626
1fba135b4d 小游戏cannon支持鼠标和触屏操作 2021-03-06 21:02:51 +08:00
MrZ626
c7e7198dc6 新增小游戏:cannon 2021-03-06 20:34:02 +08:00
MrZ626
4aae83c7ad 进入词典后焦点自动切换到输入框 2021-03-06 19:25:42 +08:00
MrZ626
cf61df2acb 整理代码 2021-03-06 17:28:17 +08:00
MrZ626
f866ac1778 微调中文tip 2021-03-06 17:24:41 +08:00
MrZ626
ae3338dc20 新增物理hold 2021-03-06 17:24:27 +08:00
MrZ626
4567f19885 不再支持导入旧版本统计信息,修复导入存档提示信息错误 2021-03-06 15:18:06 +08:00
MrZ626
b667b1e19f 再调整更新存档代码,准备大面积删除旧版本存档 2021-03-06 15:13:08 +08:00
MrZ626
53d28c1346 修复一个老存档转换问题 2021-03-06 14:34:40 +08:00
MrZ626
1b34a13321 简化自定义模式选项,移除部分不必要的参数 2021-03-06 13:41:38 +08:00
MrZ626
b370807de1 微调报错界面后门操作 2021-03-06 00:32:45 +08:00
MrZ626
37fa39b5b8 修复CC爆炸 2021-03-06 00:28:22 +08:00
MrZ626
d824b87b17 修补ws模块 2021-03-05 21:07:50 +08:00
MrZ626
0bf4642f10 降低干旱-L的评级要求 2021-03-05 21:07:37 +08:00
MrZ626
49f79068ae 修复加载动画边界看着不正常 2021-03-05 18:27:39 +08:00
MrZ626
34351cb6d4 修复屏幕尺寸不刚好时加载动画会发生奇怪的事情 2021-03-05 18:23:34 +08:00
MrZ626
37520a9634 显示ai计算的下一块位置 2021-03-05 18:06:02 +08:00
MrZ626
9714ba1113 整理代码,保留cc的原始dest数据 2021-03-05 18:06:02 +08:00
Gompyn
b6cf044441 replace goto with repeat...until in cold-clear 2021-03-05 18:06:02 +08:00
MrZ626
bf7fbb1218 微调cc思考流程 2021-03-05 18:06:01 +08:00
MrZ626
ed66f5b467 中文词典加入更多关键词 2021-03-05 18:06:00 +08:00
MrZ626
38f5ec6393 整理代码 2021-03-05 15:31:58 +08:00
MrZ626
15ecee6767 ai协程化 2021-03-05 15:28:43 +08:00
MrZ626
640403866f 修复一个可能是导致CC报错后程序闪退的问题 2021-03-05 13:06:02 +08:00
MrZ626
25efce87dc 几个绘图用函数mXXX模块化 2021-03-05 13:05:59 +08:00
MrZ626
79bc8f9527 优化加载动画的像素字体的生成代码 2021-03-05 10:15:32 +08:00
MrZ626
0043052057 微调加载动画的像素字体 2021-03-05 09:39:17 +08:00
MrZ626
75f1651042 几个table相关函数独立成TABLE模块 2021-03-05 09:31:19 +08:00
MrZ626
b1ca2c8dda 整理全局函数名以及库的require方法 2021-03-05 01:15:09 +08:00
MrZ626
069b547e58 ws库修补 2021-03-05 01:00:22 +08:00
MrZ626
e5136dd2e5 json库会检测有LOG模块再LOG.print 2021-03-05 00:57:28 +08:00
MrZ626
d58b7a9ff1 全新加载动画与资源加载机制 2021-03-04 18:09:47 +08:00
MrZ626
f192e8c993 新增是否为今日第一次启动的标记 2021-03-04 17:54:02 +08:00
MrZ626
2e9260ace5 freshDate函数会返回是否刷新了存档日期 2021-03-04 17:53:38 +08:00
MrZ626
880b48dc5d 日期刷新移至加载完成时而非刚进入游戏 2021-03-04 17:42:26 +08:00
MrZ626
a3c7a8af26 TEXTURE模块新增一套像素数字 2021-03-04 17:04:26 +08:00
MrZ626
088800c769 SKIN.libColor改名为minoColor并且从SKIN模块移到list 2021-03-04 15:14:50 +08:00
MrZ626
ecf899f610 puzzleMark素材初始化移出load过程 2021-03-04 15:14:36 +08:00
193 changed files with 3000 additions and 1352 deletions

View File

@@ -34,7 +34,7 @@ function BG.setDefault(bg)
end
function BG.set(background)
if not background then background=BG.default end
if not BGs[background]then LOG.print("No BGM file: "..background,10,COLOR.orange)end
if not BGs[background]then LOG.print("No BG file: "..background,10,COLOR.orange)end
if background==BG.cur or not SETTING.bg then return end
BG.discard()
BG.cur=background

View File

@@ -5,7 +5,6 @@ local BGM={
play=NULL,
freshVolume=NULL,
stop=NULL,
reload=NULL,
--nowPlay=[str:playing ID]
--playing=[src:playing SRC]
}

View File

@@ -1,42 +0,0 @@
function copyList(org)
local L={}
for i=1,#org do
if type(org[i])~="table"then
L[i]=org[i]
else
L[i]=copyList(org[i])
end
end
return L
end
function copyTable(org)
local L={}
for k,v in next,org do
if type(v)~="table"then
L[k]=v
else
L[k]=copyTable(v)
end
end
return L
end
function addToTable(G,base)--For all things in G if same type in base, push to base
for k,v in next,G do
if type(v)==type(base[k])then
if type(v)=="table"then
addToTable(v,base[k])
else
base[k]=v
end
end
end
end
function completeTable(G,base)--For all things in G if no val in base, push to base
for k,v in next,G do
if base[k]==nil then
base[k]=v
elseif type(v)=="table"and type(base[k])=="table"then
completeTable(v,base[k])
end
end
end

25
Zframework/doGC.lua Normal file
View File

@@ -0,0 +1,25 @@
local gc=love.graphics
local cmds={
move="translate",
zoom="scale",
rgb="setColor",
wid="setLineWidth",
line="line",
rect="rectangle",
circ="circle",
poly="polygon",
}
return function(L)
gc.push()
local canvas=gc.newCanvas(L[1],L[2])
gc.setCanvas(canvas)
gc.origin()
gc.setColor(1,1,1)
gc.setLineWidth(1)
for i=3,#L do
gc[cmds[L[i][1]]](unpack(L[i],2))
end
gc.setCanvas()
gc.pop()
return canvas
end

View File

@@ -7,7 +7,7 @@ local tabs={
"\t\t\t\t",
"\t\t\t\t\t",
}
function dumpTable(L,t)
return function(L,t)
local s
if t then
s="{\n"
@@ -40,7 +40,7 @@ function dumpTable(L,t)
T=type(v)
if T=="number"then v=tostring(v)
elseif T=="string"then v="\""..v.."\""
elseif T=="table"then v=dumpTable(v,t+1)
elseif T=="table"then v=DUMPTABLE(v,t+1)
elseif T=="boolean"then v=tostring(v)
else error("Error data type!")
end

View File

@@ -13,7 +13,7 @@ function FILE.load(name)
return s()
end
else
local res=json.decode(s)
local res=JSON.decode(s)
if res then
return res
end
@@ -26,13 +26,13 @@ function FILE.save(data,name,mode)
if not mode then mode=""end
name=name
if mode:find("l")then
data=dumpTable(data)
data=DUMPTABLE(data)
if not data then
LOG.print(name.." "..text.saveError.."dump error","error")
return
end
else
data=json.encode(data)
data=JSON.encode(data)
if not data then
LOG.print(name.." "..text.saveError.."json error","error")
return

View File

@@ -1,41 +1,45 @@
SCR= require"Zframework/screen"
COLOR= require"Zframework/color"
SCN= require"Zframework/scene"
LOG= require"Zframework/log"
WS= require"Zframework/websocket"
SCR= require"Zframework.screen"
COLOR= require"Zframework.color"
SCN= require"Zframework.scene"
LOG= require"Zframework.log"
WS= require"Zframework.websocket"
loadLib=require"Zframework/loadLib"
require"Zframework/wheelScroll"
LOADLIB=require"Zframework.loadLib"
WHEELMOV=require"Zframework.wheelScroll"
require"Zframework/setFont"
require"Zframework/mDraw"
require"Zframework.setFont"
MDRAW=require"Zframework.mDraw"
mStr=MDRAW.str
mText=MDRAW.simpX
mDraw=MDRAW.draw
require"Zframework/json"
require"Zframework/dumpTable"
require"Zframework/urlEncode"
-- UPPERCHAR=require"Zframework.upperChar"
JSON=require"Zframework.json"
DUMPTABLE=require"Zframework.dumpTable"
URLENCODE=require"Zframework.urlEncode"
-- require"Zframework/upperChar"
require"Zframework/copyTable"
require"Zframework/splitStr"
require"Zframework/toTime"
TABLE=require"Zframework.tableExtend"
SPLITSTR=require"Zframework.splitStr"
TIMESTR=require"Zframework.timeStr"
VIB= require"Zframework/vibrate"
SFX= require"Zframework/sfx"
VIB= require"Zframework.vibrate"
SFX= require"Zframework.sfx"
LIGHT= require"Zframework/light"
BG= require"Zframework/background"
WIDGET= require"Zframework/widget"
TEXT= require"Zframework/text"
SYSFX= require"Zframework/sysFX"
LIGHT= require"Zframework.light"
DOGC= require"Zframework.doGC"
BG= require"Zframework.background"
WIDGET= require"Zframework.widget"
TEXT= require"Zframework.text"
SYSFX= require"Zframework.sysFX"
IMG= require"Zframework/image"
BGM= require"Zframework/bgm"
VOC= require"Zframework/voice"
IMG= require"Zframework.image"
BGM= require"Zframework.bgm"
VOC= require"Zframework.voice"
LANG= require"Zframework/languages"
TASK= require"Zframework/task"
FILE= require"Zframework/file"
PROFILE=require"Zframework/profile"
LANG= require"Zframework.languages"
TASK= require"Zframework.task"
FILE= require"Zframework.file"
PROFILE=require"Zframework.profile"
local ms,kb=love.mouse,love.keyboard
@@ -376,6 +380,7 @@ function love.errorhandler(msg)
local BGcolor=rnd()>.026 and{.3,.5,.9}or{.62,.3,.926}
local needDraw=true
local count=0
local errorMsg=text and text.errorMsg or"An error has occurred during loading.\nError info has been created, and you can send it to the author."
return function()
love.event.pump()
for E,a,b in love.event.poll()do
@@ -387,17 +392,17 @@ function love.errorhandler(msg)
needDraw=true
elseif E=="focus"then
needDraw=true
elseif E=="touchpressed"and b<100 or E=="mousepressed" and a==2 or E=="keypressed"and a=="space"then
elseif E=="touchpressed"and b<26 or E=="mousepressed" and a==2 or E=="keypressed"and a=="z"then
if count<3 then
count=count+1
SFX.play("ready")
SFX.play("ready",.5)
else
local code=loadstring(love.system.getClipboardText())
if code then
code()
SFX.play("reach")
SFX.play("reach",.5)
else
SFX.play("finesseError")
SFX.play("finesseError",.5)
end
count=0
end
@@ -411,7 +416,7 @@ function love.errorhandler(msg)
gc.replaceTransform(xOy)
gc_draw(errScrShot,100,365,nil,512/errScrShot:getWidth(),288/errScrShot:getHeight())
setFont(100)gc_print(":(",100,40,0,1.2)
setFont(40)gc_printf(text.errorMsg,100,200,SCR.w0-100)
setFont(40)gc_printf(errorMsg,100,200,SCR.w0-100)
setFont(20)
gc_print(SYSTEM.."-"..VERSION_NAME,100,660)
gc_print("scene:"..SCN.cur,400,660)
@@ -461,7 +466,8 @@ function love.run()
love.resize(gc.getWidth(),gc.getHeight())
--Scene Launch
SCN.init(SETTING.appLock and"calculator"or"load")
SCN.push("quit","slowFade")
SCN.init("load")
return function()
local _
@@ -514,7 +520,7 @@ function love.run()
--Draw cursor
if mouseShow then
local R=int((t+1)/2)%7+1
_=SKIN.libColor[SETTING.skin[R]]
_=minoColor[SETTING.skin[R]]
gc_setColor(_[1],_[2],_[3],min(abs(1-t%2),.3))
_=SCS[R][0]
gc_draw(TEXTURE.miniBlock[R],mx,my,t%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5)

View File

@@ -20,9 +20,10 @@
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
-- Editted by MrZ
local ins,char=table.insert,string.char
json = {}
local json = {}
-------------------------------------------------------------------------------
-- Encode
@@ -117,9 +118,8 @@ function json.encode(val)
local a,b=pcall(encode,val)
if a then
return b
else
elseif LOG then
LOG.print(text.jsonError..": "..(b or"uknErr"),"warn")
return
end
end
@@ -348,8 +348,8 @@ function json.decode(str)
local a,b=pcall(decode,str)
if a then
return b
else
elseif LOG then
LOG.print(text.jsonError..": "..(b or"uknErr"),"warn")
return
end
end
end
return json

View File

@@ -1,11 +1,5 @@
local langList,publicText={},{}
local LANG={}
--Call these before call LANG.init()
function LANG.setLangList(list)langList=list end
function LANG.setPublicText(L)publicText=L end
function LANG.init()--Attention, calling this will destory all initializing methods, create a LANG.set()!
function LANG.init(langList,publicText)--Attention, calling this will destory all initializing methods, create a LANG.set()!
local function langFallback(T0,T)
for k,v in next,T0 do
if type(v)=="table"and not v.refuseCopy then--refuseCopy: just copy pointer, not contents
@@ -62,5 +56,4 @@ function LANG.init()--Attention, calling this will destory all initializing meth
end
end
end
return LANG

View File

@@ -1,10 +1,10 @@
local gc=love.graphics
function mStr(s,x,y)
gc.printf(s,x-626,y,1252,"center")
end
function mText(s,x,y)
gc.draw(s,x-s:getWidth()*.5,y)
end
function mDraw(s,x,y,a,k)
gc.draw(s,x,y,a,k,nil,s:getWidth()*.5,s:getHeight()*.5)
end
local printf=love.graphics.printf
local draw=love.graphics.draw
local mDraw={}
function mDraw.str(str,x,y)printf(str,x-626,y,1252,"center")end
function mDraw.simpX(str,x,y)draw(str,x-str:getWidth()*.5,y)end
function mDraw.simpY(str,x,y)draw(str,x,y-str:getHeight()*.5)end
function mDraw.X(str,x,y,a,k)draw(str,x,y,a,k,nil,str:getWidth()*.5,0)end
function mDraw.Y(str,x,y,a,k)draw(str,x,y,a,k,nil,0,str:getHeight()*.5)end
function mDraw.draw(str,x,y,a,k)draw(str,x,y,a,k,nil,str:getWidth()*.5,str:getHeight()*.5)end
return mDraw

View File

@@ -14,7 +14,7 @@ local SCN={
time=false, --Full swap time
draw=false, --Swap draw func
},
stack={"quit","slowFade"},--Scene stack
stack={},--Scene stack
scenes=scenes,

View File

@@ -31,12 +31,17 @@ function SCR.resize(w,h)
SCR.safeX,SCR.safeY,SCR.safeW,SCR.safeH=love.window.getSafeArea()
SCR.xOy:setTransformation(w/2,h/2,nil,SCR.k,nil,SCR.w0/2,SCR.h0/2)
end
function SCR.print()
LOG.print("Screen Info:")
for k,v in next,SCR do
if type(v)=="number"then
LOG.print(k..": "..v)
end
end
function SCR.info()
return{
("w0,h0 : %d, %d"):format(SCR.w0,SCR.h0),
("x,y : %d, %d"):format(SCR.x,SCR.y),
("cx,cy : %d, %d"):format(SCR.cx,SCR.cy),
("ex,ey : %d, %d"):format(SCR.ex,SCR.ey),
("w,h : %d, %d"):format(SCR.w,SCR.h),
("W,H : %d, %d"):format(SCR.W,SCR.H),
("safeX,safeY : %d, %d"):format(SCR.safeX,SCR.safeY),
("safeW,safeH : %d, %d"):format(SCR.safeW,SCR.safeH),
("k,dpi,rad : %d, %d, %.4f"):format(SCR.k,SCR.dpi,SCR.rad),
}
end
return SCR

View File

@@ -4,7 +4,6 @@ local SFX={
play=NULL,
fplay=NULL,
reset=NULL,
reload=NULL,
}
function SFX.init(list)
SFX.init=nil

View File

@@ -1,5 +1,5 @@
local find,sub=string.find,string.sub
function splitStr(s,sep)
return function(s,sep)
local L={}
local p1,p2=1--start,target
while p1<=#s do

View File

@@ -0,0 +1,52 @@
local next,type=next,type
local TABLE={}
function TABLE.shift(org)
local L={}
for i=1,#org do
if type(org[i])~="table"then
L[i]=org[i]
else
L[i]=TABLE.shift(org[i])
end
end
return L
end
function TABLE.copy(org)
local L={}
for k,v in next,org do
if type(v)~="table"then
L[k]=v
else
L[k]=TABLE.copy(v)
end
end
return L
end
function TABLE.add(G,base)--For all things in G if same type in base, push to base
for k,v in next,G do
if type(v)==type(base[k])then
if type(v)=="table"then
TABLE.add(v,base[k])
else
base[k]=v
end
end
end
end
function TABLE.complete(G,base)--For all things in G if no val in base, push to base
for k,v in next,G do
if base[k]==nil then
base[k]=v
elseif type(v)=="table"and type(base[k])=="table"then
TABLE.complete(v,base[k])
end
end
end
function TABLE.reIndex(org)
for k,v in next,org do
if type(v)=="string"then
org[k]=org[v]
end
end
end
return TABLE

View File

@@ -1,5 +1,5 @@
local int,format=math.floor,string.format
function toTime(s)
return function(s)
if s<60 then
return format("%.3fs",s)
elseif s<3600 then

View File

@@ -7,6 +7,6 @@ local upperList={
[";"]=":",["'"]="\"",
[","]="<",["."]=">",["/"]="?",
}
function upperChar(c)
return function(c)
return upperList[c]or upper(c)
end

View File

@@ -1,6 +1,6 @@
local rshift=bit.rshift
local b16={[0]="0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}
function urlEncode(str)
return function(str)
local out=""
for i=1,#str do
if str:sub(i,i):match("[a-zA-Z0-9]")then

View File

@@ -4,7 +4,6 @@ local VOC={
getFreeChannel=NULL,
play=NULL,
update=NULL,
reload=NULL,
}
function VOC.init(list)
VOC.init=nil

View File

@@ -4,8 +4,8 @@ local path="/tech/socket/v1"
local wsThread=[[
-- lua + love2d threading websocket client
-- original pure lua ver. by flaribbit and Particle_G and MrZ_26
-- threading version by MrZ_26
-- Original pure lua ver. by flaribbit and Particle_G and MrZ
-- Threading version by MrZ
local triggerCHN,sendCHN,readCHN=...
@@ -15,11 +15,8 @@ local byte,char=string.byte,string.char
local band,bor,bxor=bit.band,bit.bor,bit.bxor
local shl,shr=bit.lshift,bit.rshift
local SOCK=require"socket".tcp()
local JSON=require"Zframework.json"
local mask_key={1,14,5,14}
local function _send(opcode,message)
@@ -56,29 +53,52 @@ do--Connect
local path=sendCHN:demand()
local body=sendCHN:demand()
SOCK:settimeout(2.6)
local res,err=SOCK:connect(host,port)
if res~=1 then error(res,err)end
if res then
--WebSocket handshake
if not body then body=""end
SOCK:send(
"GET "..path.." HTTP/1.1\r\n"..
"Host: "..host..":"..port.."\r\n"..
"Connection: Upgrade\r\n"..
"Upgrade: websocket\r\n"..
"Content-Type: application/json\r\n"..
"Content-Length: "..#body.."\r\n"..
"Sec-WebSocket-Version: 13\r\n"..
"Sec-WebSocket-Key: osT3F7mvlojIvf3/8uIsJQ==\r\n\r\n"..--secKey
body
)
--WebSocket handshake
if not body then body=""end
SOCK:send(
"GET "..path.." HTTP/1.1\r\n"..
"Host: "..host..":"..port.."\r\n"..
"Connection: Upgrade\r\n"..
"Upgrade: websocket\r\n"..
"Content-Type: application/json\r\n"..
"Content-Length: "..#body.."\r\n"..
"Sec-WebSocket-Version: 13\r\n"..
"Sec-WebSocket-Key: osT3F7mvlojIvf3/8uIsJQ==\r\n\r\n"..--secKey
body
)
readCHN:push("success")
--First line of HTTP
local l=SOCK:receive("*l")
local code=l:find(" "); code=l:sub(code+1,code+3)
if code=="101"then
readCHN:push("success")
else
local ctLen
repeat
l=SOCK:receive("*l")
if not ctLen and l:find"Length"then
ctLen=tonumber(l:match"%d+")
end
until l==""
l=SOCK:receive(ctLen)
local reason=JSON.decode(l)
if reason then reason=reason.message end
readCHN:push(code.."-"..(reason or l))
end
else
readCHN:push(err)
end
SOCK:settimeout(0)
end
while true do
triggerCHN:demond()
triggerCHN:demand()
while sendCHN:getCount()>=2 do
local op=sendCHN:pop()
local message=sendCHN:pop()
@@ -110,7 +130,15 @@ while true do
readCHN:push(op)
if op==8 then--close
SOCK:close()
readCHN:push(string.format("%d-%s",shl(byte(res,1),8)+byte(res,2).."-"..res:sub(3,-3)))
if res:sub(1,4)=="HTTP"then
local code=res:find(" ")
code=res:sub(code+1,code+3)
local res=res:sub(res:find("\n\n")+1)
reason=JSON.decode(res)if reason then reason=reason.message end
readCHN:push(code.."-"..(reason or res))
else
readCHN:push(string.format("%d-%s",shl(byte(res,1),8)+byte(res,2).."-"..res:sub(3,-3)))
end
else
readCHN:push(res)
end
@@ -188,10 +216,16 @@ function WS.update()
for name,ws in next,wsList do
ws.triggerCHN:push(0)
if ws.status=="connecting"then
if ws.readCHN:pop()=="success"then
ws.status="running"
ws.lastPingTime=time
ws.lastPongTime=time
local mes=ws.readCHN:pop()
if mes then
if mes=="success"then
ws.status="running"
ws.lastPingTime=time
ws.lastPongTime=time
else
ws.status="dead"
LOG.print(text.wsFailed,"warn")
end
end
elseif time-ws.lastPingTime>ws.pingInterval then
ws.sendCHN:push(9)

View File

@@ -1,5 +1,5 @@
local floatWheel=0
function wheelScroll(y)
return function(y)
if y>0 then
if floatWheel<0 then floatWheel=0 end
floatWheel=floatWheel+y^1.2

View File

@@ -868,11 +868,9 @@ function textBox:scroll(n)
end
end
function textBox:clear()
if not self.fix then
self.texts={}
self.scrollPos=0
SFX.play("fall")
end
self.texts={}
self.scrollPos=0
SFX.play("fall")
end
function textBox:draw()
local x,y,w,h=self.x,self.y,self.w,self.h
@@ -920,7 +918,7 @@ end
function textBox:getInfo()
return format("x=%d,y=%d,w=%d,h=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h)
end
function WIDGET.newTextBox(D)--name,x,y,w,h[,font][,fix],hide
function WIDGET.newTextBox(D)--name,x,y,w,h[,font][,lineH][,fix],hide
local _={
name= D.name,
@@ -942,11 +940,11 @@ function WIDGET.newTextBox(D)--name,x,y,w,h[,font][,fix],hide
h= D.h,
font= D.font or 30,
fix=D.fix,
texts={},
fix= D.fix,
texts= {},
hide= D.hide,
}
_.lineH=7*(_.font/5)
_.lineH=D.lineH or _.font*7/5
_.capacity=int((D.h-10)/_.lineH)
for k,v in next,textBox do _[k]=v end
@@ -976,11 +974,11 @@ function WIDGET.set(list)
for i=1,#list do
list[i]:reset()
end
if FESTIVAL and SCN.cur~="custom_field"then
if THEME and SCN.cur~="custom_field"then
local c1,c2,c3
if FESTIVAL=="xMas"then
if THEME=="xMas"then
c1,c2,c3=COLOR.red,COLOR.white,COLOR.green
elseif FESTIVAL=="sprFes"then
elseif THEME=="sprFes"then
c1,c2,c3=COLOR.red,COLOR.orange,COLOR.yellow
else
return
@@ -1069,7 +1067,7 @@ function WIDGET.keyPressed(k)
local swap_xy=k=="up"or k=="down"
if swap_xy then WX,WY=WY,WX end -- note that we do not swap them back later
for _,W1 in ipairs(WIDGET.active)do
if W~=W1 and W1.resCtr and not(W.hide==true or W.hide and W.hide())then
if W~=W1 and W1.resCtr and not(W1.hide==true or W1.hide and W1.hide())then
local L=W1.resCtr
for j=1,#L,2 do
local x,y=L[j],L[j+1]

View File

@@ -1,5 +1,5 @@
VERSION_CODE=1302
VERSION_NAME="Alpha V0.13.2"
VERSION_CODE=1303
VERSION_NAME="Alpha V0.13.3"
love.setDeprecationOutput(false)
function love.conf(t)
t.identity="Techmino"--Saving folder

View File

@@ -131,7 +131,7 @@ return{--返回一个table你也可以在之前定义一些常量或者函数
PLY.draw.drawTargetLine(P,r)--使用自带的境界高度线绘制函数
end,
score=function(P)return{P.stat.time,P.stat.piece}end,--游戏结束时需要保存的本局关键信息
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,--把score返回的数据显示出来的方法
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,--把score返回的数据显示出来的方法
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,--按照时间排序,时间一样就看块数
getRank=function(P)--计算评级
if P.stat.row<40 then return end--你总得打完40行对吧否则直接return空掉成绩都不记录

2
love-api for VSCode.lua Normal file
View File

@@ -0,0 +1,2 @@
--Just tell IDE to load love-api, no actual usage
love=require"love"

106
main.lua
View File

@@ -14,12 +14,14 @@ local fs=love.filesystem
NONE={}function NULL()end
DBP=print--Use this in permanent code
TIME=love.timer.getTime
YIELD=coroutine.yield
SYSTEM=love.system.getOS()
MOBILE=SYSTEM=="Android"or SYSTEM=="iOS"
SAVEDIR=fs.getSaveDirectory()
--Global Vars & Settings
LOADED=false
DAILYLAUNCH=false
NOGAME=false
LOGIN=false
EDITING=""
@@ -27,7 +29,7 @@ WSCONN=false
LATEST_VERSION=false
--Festival check within one statement
FESTIVAL=(
THEME=(
--Christmas
os.date"%m"=="12"and math.abs(os.date"%d"-25)<4 and
"Xmas"or
@@ -52,6 +54,7 @@ FESTIVAL=(
false
)
--System setting
math.randomseed(os.time()*626)
love.keyboard.setKeyRepeat(true)
love.keyboard.setTextInput(false)
@@ -70,6 +73,7 @@ end
--Delete some useless files
for _,v in next,{
"client.so",
"cold_clear.dll",
"CCloader.dll",
"tech_u.dat",
@@ -117,20 +121,20 @@ end
--Load modules
require"Zframework"
require"parts/list"
require"parts/globalTables"
require"parts/gametoolfunc"
require"parts.list"
require"parts.globalTables"
require"parts.gametoolfunc"
SCR.setSize(1280,720)--Initialize Screen size
FIELD[1]=newBoard()--Initialize field[1]
AIBUILDER= require"parts/AITemplate"
FREEROW= require"parts/freeRow"
AIBUILDER= require"parts.AITemplate"
FREEROW= require"parts.freeRow"
TEXTURE= require"parts/texture"
SKIN= require"parts/skin"
PLY= require"parts/player"
AIFUNC= require"parts/ai"
MODES= require"parts/modes"
TEXTURE= require"parts.texture"
SKIN= require"parts.skin"
PLY= require"parts.player"
AIFUNC= require"parts.ai"
MODES= require"parts.modes"
--First start for phones
if not fs.getInfo("conf/settings")and MOBILE then
@@ -201,6 +205,7 @@ SKIN.init{
"coloredbone_mrz",
"wtf",
}
--Initialize sound libs
SFX.init((function()
local L={}
@@ -224,7 +229,6 @@ BGM.init((function()
end
return L
end)())
VOC.init{
"zspin","sspin","lspin","jspin","tspin","ospin","ispin",
"single","double","triple","techrash",
@@ -236,29 +240,30 @@ VOC.init{
}
--Initialize language lib
LANG.setLangList{
require"parts/language/lang_zh",
require"parts/language/lang_zh2",
require"parts/language/lang_yygq",
require"parts/language/lang_en",
require"parts/language/lang_fr",
require"parts/language/lang_sp",
require"parts/language/lang_pt",
require"parts/language/lang_symbol",
--1. Add language file to LANG folder;
--2. Require it;
--3. Add a button in parts/scenes/setting_lang.lua;
}
LANG.setPublicText{
block={
"Z","S","J","L","T","O","I",
"Z5","S5","Q","P","F","E",
"T5","U","V","W","X",
"J5","L5","R","Y","N","H","I5",
"I3","C","I2","O1"
LANG.init(
{
require"parts.language.lang_zh",
require"parts.language.lang_zh2",
require"parts.language.lang_yygq",
require"parts.language.lang_en",
require"parts.language.lang_fr",
require"parts.language.lang_sp",
require"parts.language.lang_pt",
require"parts.language.lang_symbol",
--1. Add language file to LANG folder;
--2. Require it;
--3. Add a button in parts/scenes/setting_lang.lua;
},
}
LANG.init()
{
block={
"Z","S","J","L","T","O","I",
"Z5","S5","Q","P","F","E",
"T5","U","V","W","X",
"J5","L5","R","Y","N","H","I5",
"I3","C","I2","O1"
},
}
)
--Load shader files from SOURCE ONLY
SHADER={}
@@ -276,7 +281,7 @@ for _,v in next,fs.getDirectoryItems("parts/backgrounds")do
if fs.getRealDirectory("parts/backgrounds/"..v)~=SAVEDIR then
if v:sub(-3)=="lua"then
local name=v:sub(1,-5)
BG.add(name,require("parts/backgrounds/"..name))
BG.add(name,require("parts.backgrounds."..name))
end
else
LOG.print("Dangerous file : %SAVE%/parts/backgrounds/"..v)
@@ -287,32 +292,33 @@ end
for _,v in next,fs.getDirectoryItems("parts/scenes")do
if fs.getRealDirectory("parts/scenes/"..v)~=SAVEDIR then
local sceneName=v:sub(1,-5)
SCN.add(sceneName,require("parts/scenes/"..sceneName))
SCN.add(sceneName,require("parts.scenes."..sceneName))
LANG.addScene(sceneName)
else
LOG.print("Dangerous file : %SAVE%/parts/scenes/"..v)
end
end
LANG.set(SETTING.lang)
--Update data
do
--Check setting file
if
type(STAT.version)~="number"or
type(SETTING.block)~="boolean"or
type(SETTING.sfx_spawn)~="number"or
type(SETTING.ghost)~="number"or
type(SETTING.center)~="number"or
type(SETTING.grid)~="number"or
#SETTING.skin<29 or
SETTING.bgm>1 or SETTING.sfx>1 or SETTING.voc>1 or
SETTING.stereo>1 or SETTING.VKSFX>1 or SETTING.VKAlpha>1
SETTING.stereo>1 or SETTING.VKSFX>1 or SETTING.VKAlpha>1 or
SETTING.VKCurW>1 or SETTING.VKCurW>1
then
NOGAME=true
fs.remove("conf/settings")
end
freshDate()
if STAT.extraRate then
STAT.finesseRate=5*(STAT.piece-STAT.extraRate)
end
@@ -325,29 +331,27 @@ do
RANKS.sprintFix=nil
RANKS.sprintLock=nil
end
while STAT.version<1205 or SETTING.VKCurW>1 or SETTING.VKCurW>1 do
SETTING.VKCurW=SETTING.VKCurW*.1
SETTING.VKTchW=SETTING.VKTchW*.1
end
if STAT.version<1208 then
SETTING.skinSet=1
end
if STAT.version<1225 then
SETTING.skin={1,7,11,3,14,4,9,1,7,2,6,10,2,13,5,9,15,10,11,3,12,2,16,8,4,10,13,2,8}
end
if STAT.version<1300 then
STAT.lastPlay="sprint_10l"
for _,name in next,fs.getDirectoryItems("replay")do
fs.remove("replay/"..name)
end
end
if STAT.version<1302 then
if RANKS.pctrain_n then RANKS.pctrain_n=0 end
if RANKS.pctrain_l then RANKS.pctrain_l=0 end
fs.remove("conf/user")
NOGAME=true
end
if STAT.version<1303 then
SETTING.appLock=false
end
for _,v in next,VK_org do
if not v.color then
NOGAME=true
@@ -358,8 +362,6 @@ do
if RANKS.infinite then RANKS.infinite=6 end
if RANKS.infinite_dig then RANKS.infinite_dig=6 end
if RANKS.pctrain_n then RANKS.pctrain_n=0 end
if RANKS.pctrain_l then RANKS.pctrain_l=0 end
local needSaveRank
for k in next,RANKS do
@@ -408,13 +410,13 @@ do
end
end
if FESTIVAL=="Xmas"then
if THEME=="Xmas"then
BG.setDefault("snow")
BGM.setDefault("mXmas")
elseif FESTIVAL=="sprFes"then
elseif THEME=="sprFes"then
BG.setDefault("firework")
BGM.setDefault("spring festival")
elseif FESTIVAL=="zDay"then
elseif THEME=="zDay"then
BG.setDefault("lanterns")
BGM.setDefault("overzero")
else

BIN
media/BGM/dream.ogg Normal file

Binary file not shown.

BIN
media/BGM/venus.ogg Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
media/image/modeicon/gm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
media/image/modeicon/pc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,20 +1,13 @@
--[[
HighestBlock
BlockedCells
Wells
FilledLines
4deepShape
BlockedWells
]]
local int,ceil,min,abs,rnd,modf=math.floor,math.ceil,math.min,math.abs,math.random,math.modf
local ins,rem=table.insert,table.remove
local YIELD=YIELD
-- controlname:
-- 1~5:mL,mR,rR,rL,rF,
-- 6~10:hD,sD,H,A,R,
-- 11~13:LL,RR,DD
local blockPos={4,4,4,4,4,5,4}
-------------------------------------------------Cold clear
local _CC=loadLib("CC",{
local _CC=LOADLIB("CC",{
Windows="CCloader",
Linux="CCloader",
Android="libCCloader.so",
@@ -24,23 +17,24 @@ if _CC then
local CCblockID={6,5,4,3,2,1,0}
CC={
getConf= _CC.get_default_config ,--()options,weights
fastWeights=_CC.fast_weights ,--(weights)
fastWeights=_CC.fast_weights ,--(weights)
--setConf= _CC.set_options ,--(options,hold,20g,bag7)
new= _CC.launch_async ,--(options,weights)bot
new= _CC.launch_async ,--(options,weights)bot
addNext= function(bot,id)_CC.add_next_piece_async(bot,CCblockID[id])end ,--(bot,piece)
update= _CC.reset_async ,--(bot,field,b2b,combo)
think= _CC.request_next_move ,--(bot)
getMove= _CC.poll_next_move ,--(bot)success,dest,hold,move
destroy= _CC.destroy_async ,--(bot)
setHold= _CC.set_hold ,--(opt,bool)
setHold= _CC.set_hold ,--(opt,bool)
set20G= _CC.set_20g ,--(opt,bool)
-- setPCLoop= _CC.set_pcloop ,--(opt,bool)
setBag= _CC.set_bag7 ,--(opt,bool)
setBag= _CC.set_bag7 ,--(opt,bool)
setNode= _CC.set_max_nodes ,--(opt,bool)
free= _CC.free ,--(opt/wei)
free= _CC.free ,--(opt/wei)
}
local CC=CC
function CC.updateField(P)
local F,i={},1
for y=1,#P.field do
@@ -90,6 +84,14 @@ if _CC then
end
end
-------------------------------------------------9 Stack setup
--[[Future:
HighestBlock
BlockedCells
Wells
FilledLines
4deepShape
BlockedWells
]]
local dirCount={1,1,3,3,3,0,1}
local FCL={
[1]={
@@ -196,8 +198,10 @@ local function getScore(field,cb,cy)
end
-------------------------------------------------
return{
["9S"]={
function(P,ctrl)
["9S"]=function(P,keys)
while true do
--Thinking
YIELD()
local Tfield={}--Test field
local best={x=1,dir=0,hold=false,score=-1e99}--Best method
local field_org=P.field
@@ -224,22 +228,18 @@ return{
local cy=#Tfield+1
--Move to bottom
while true do
if cy==1 then break end
if not ifoverlapAI(Tfield,cb,cx,cy-1)then
cy=cy-1
else
break
end
while cy>1 and not ifoverlapAI(Tfield,cb,cx,cy-1)do
cy=cy-1
end
--Simulate lock
for i=1,#cb do
local y=cy+i-1
if not Tfield[y]then Tfield[y]=getRow(0)end
local L=Tfield[y]
for j=1,#cb[1]do
if cb[i][j]then
Tfield[y][cx+j-1]=1
L[cx+j-1]=1
end
end
end
@@ -258,73 +258,61 @@ return{
while #Tfield>0 do
discardRow(rem(Tfield,1))
end
local p=#ctrl+1
if best.hold then
ctrl[p]=8
p=p+1
ins(keys,8)
end
local l=FCL[best.bn][best.dir+1][best.x]
for i=1,#l do
ctrl[p]=l[i]
p=p+1
ins(keys,l[i])
end
ctrl[p]=6
return 2
end,
function(P)
ins(keys,6)
--Check if time to change target
YIELD()
if P:RND()<.00126 then
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
end
return 1
end,
},
["CC"]=CC and{
[0]=NULL,
function(P)--Start thinking
if not pcall(CC.think,P.AI_bot)then
LOG.print("CC is dead ("..P.id..")","error")
return 0
end
return 2
end,
function(P,ctrl)--Poll keys
local success,result,dest,hold,move=pcall(CC.getMove,P.AI_bot)
if success then
if result==2 then
ins(ctrl,6)
return 3
elseif result==0 then
for i=1,#dest do
for j=1,#dest[i]do
dest[i][j]=dest[i][j]+1
end
end
end,
["CC"]=CC and function(P,keys)
while true do
--Start thinking
YIELD()
if not pcall(CC.think,P.AI_bot)then break end
--Poll keys
local success,result,dest,hold,move
repeat
YIELD()
success,result,dest,hold,move=pcall(CC.getMove,P.AI_bot)
until not success or result==0 or result==2
if not success then break end
if result==2 then
ins(keys,6)
elseif result==0 then
dest[5],dest[6]=dest[1][1],dest[1][2]
dest[7],dest[8]=dest[2][1],dest[2][2]
dest[1],dest[2]=dest[3][1],dest[3][2]
dest[3],dest[4]=dest[4][1],dest[4][2]
P.AI_dest=dest
if hold then keys[1]=8 end--Hold
while move[1]do
local m=rem(move,1)
if m<4 then
ins(keys,m+1)
elseif not P.AIdata._20G then
ins(keys,13)
end
P.AI_dest=dest
if hold then ctrl[1]=8 end--Hold
while move[1]do
local m=rem(move,1)
if m<4 then
ins(ctrl,m+1)
elseif not P.AIdata._20G then
ins(ctrl,13)
end
end
ins(ctrl,6)
return 3
else
--Stay this stage
return 2
end
else
LOG.print("CC is dead ("..P.id..")","error")
return 0
ins(keys,6)
end
end,
function(P)--Check if time to change target
--Check if time to change target
YIELD()
if P:RND()<.00126 then
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
end
return 1
end,
},
}--AI think stage
end
LOG.print("CC is dead ("..P.id..")","error")
end,
}--AI brains

View File

@@ -1,11 +1,12 @@
--Cool liquid background
--A lantern background which is full of festive atmosphere. Lantern image by ScF
local gc=love.graphics
local int,rnd=math.floor,math.random
local ins,rem=table.insert,table.remove
local mDraw=mDraw
local back={}
local lanterns
local t
function back.init()
lanterns={}
t=0
@@ -40,9 +41,10 @@ function back.draw()
gc.push("transform")
gc.origin()
gc.setColor(1,1,1)
local img=IMG.lanterns
for i=1,#lanterns do
local L=lanterns[i]
mDraw(IMG.lanterns[int(L.phase*6)+1],L.x,L.y,nil,L.size)
mDraw(img[int(L.phase*6)+1],L.x,L.y,nil,L.size)
end
gc.pop()
end

View File

@@ -0,0 +1,6 @@
local gc=love.graphics
local back={}
function back.draw()
gc.clear(.95,.95,.95)
end
return back

View File

@@ -8,7 +8,7 @@ local colorLib
local blocks
local scs
function back.init()
colorLib=SKIN.libColor
colorLib=minoColor
blocks=BLOCKS
scs=SCS
t=rnd()*2600

View File

@@ -86,7 +86,7 @@ end
function newBoard(f)--Generate a new board
if f then
return copyList(f)
return TABLE.shift(f)
else
local F={}
for i=1,20 do F[i]={0,0,0,0,0,0,0,0,0,0}end
@@ -350,7 +350,7 @@ function royaleLevelup()
for _,P in next,PLAYERS.alive do
P.gameEnv.drop=spd
end
if GAME.curMode.name:find("ultimate")then
if GAME.curMode.name:find("_u")then
for i=1,#PLAYERS.alive do
local P=PLAYERS.alive[i]
P.gameEnv.drop=int(P.gameEnv.drop*.3)
@@ -471,12 +471,16 @@ function generateLine(hole)
-- return 2^10-1-2^(hole-1)
return 1023-2^(hole-1)
end
function freshDate()
function freshDate(mode)
if not mode then mode=""end
local date=os.date("%Y/%m/%d")
if STAT.date~=date then
STAT.date=date
STAT.todayTime=0
LOG.print(text.newDay,"message")
if not mode:find("q")then
LOG.print(text.newDay,"message")
end
return true
end
end
function legalGameTime()--Check if today's playtime is legal
@@ -670,14 +674,14 @@ do--function dumpBasicConfig()
for _,key in next,gameSetting do
S[key]=SETTING[key]
end
return data.encode("string","base64",json.encode(S))
return data.encode("string","base64",JSON.encode(S))
end
end
do--function resetGameData(args)
local function tick_showMods()
local time=0
while true do
coroutine.yield()
YIELD()
time=time+1
if time%20==0 then
local M=GAME.mod[time/20]
@@ -706,7 +710,7 @@ do--function resetGameData(args)
local S={}
for _,key in next,gameSetting do
if type(SETTING[key])=="table"then
S[key]=copyList(SETTING[key])
S[key]=TABLE.shift(SETTING[key])
else
S[key]=SETTING[key]
end
@@ -961,8 +965,8 @@ do--function saveRecording()
(USER.name or"Player")
local fileBody=
GAME.seed.."\n"..
json.encode(GAME.setting).."\n"..
json.encode(getModList()).."\n"..
JSON.encode(GAME.setting).."\n"..
JSON.encode(getModList()).."\n"..
dumpRecording(GAME.rep)
--Write file
@@ -1067,7 +1071,7 @@ end
do
--[[
launch:
local res=json.decode(res.body)
local res=JSON.decode(res.body)
if res.message=="OK"then
LOG.print(res.notice,360,COLOR.sky)
if VERSION_CODE>=res.version_code then
@@ -1101,7 +1105,7 @@ do
PATH.http..PATH.user,
"GET",
{["Content-Type"]="application/json"},
json.encode{
JSON.encode{
email=USER.email,
authToken=USER.authToken,
}
@@ -1122,13 +1126,13 @@ do
LOG.print(text.loginSuccessed)
--TODO:getUserInfo
json.encode{
JSON.encode{
email=USER.email,
authToken=USER.authToken,
}
--TODO:getAccessToken
json.encode{
JSON.encode{
email=USER.email,
authToken=USER.authToken,
}
@@ -1146,13 +1150,13 @@ do
PATH.http..PATH.access,
"POST",
{["Content-Type"]="application/json"},
json.encode{
JSON.encode{
email=USER.email,
authToken=USER.authToken,
}
)
else
local err=json.decode(res.body)
local err=JSON.decode(res.body)
if err then
LOG.print(text.httpCode..res.code..": "..err.message,"warn")
end
@@ -1216,7 +1220,7 @@ do
function TICK_WS_app()
while true do
coroutine.yield()
YIELD()
local status=WS.status("app")
if status=="running"then
local message,op=WS.read("app")
@@ -1229,7 +1233,7 @@ do
LOG.print(text.wsClose..message,"warn")
return
else
message=json.decode(message)
message=JSON.decode(message)
end
end
elseif status~="connecting"then
@@ -1239,7 +1243,7 @@ do
end
function TICK_WS_chat()
while true do
coroutine.yield()
YIELD()
local status=WS.status("chat")
if status=="running"then
local message,op=WS.read("chat")
@@ -1252,7 +1256,7 @@ do
LOG.print(text.wsClose..message,"warn")
return
else
message=json.decode(message)
message=JSON.decode(message)
end
end
end

View File

@@ -153,44 +153,33 @@ CUSTOMENV={--gameEnv for cutsom game
wait=0,
fall=0,
--Control
nextCount=6,
nextStartPos=1,
holdCount=1,
infHold=false,
phyHold=false,
--Visual
block=true,
ghost=.3,
center=1,
bagLine=false,
highCam=false,
nextPos=false,
bone=false,
hideBoard=false,
flipBoard=false,
--Rule
mindas=0,
minarr=0,
minsdarr=0,
sequence="bag",
ospin=true,
deepDrop=false,
fieldH=20,
RS="TRS",
noTele=false,
ospin=true,
fineKill=false,
b2bKill=false,
missionKill=false,
easyFresh=true,
deepDrop=false,
visible="show",
target=1e99,
freshLimit=1e99,
opponent="X",
life=0,
garbageSpeed=1,
pushSpeed=3,
missionKill=false,
--Else
bg="none",
@@ -309,7 +298,9 @@ SETTING={--Settings
VKCurW=.4,--Cur-Pos Weight
VKIcon=true,--If disp icon
VKAlpha=.3,
}local S=FILE.load("conf/settings")if S then addToTable(S,SETTING)end
}
local S=FILE.load("conf/settings")
if S then TABLE.add(S,SETTING)end
S=FILE.load("conf/data")
if S then--Statistics
STAT=S

View File

@@ -7,7 +7,9 @@ local noKick,noKick_180,pushZero do
for _,L in next,t do
if type(L)=="table"then
for _,v in next,L do
table.insert(v,1,zero)
if not v[1]or v[1][1]~=0 or v[1][2]~=0 then
table.insert(v,1,zero)
end
end
end
end
@@ -31,6 +33,7 @@ end
local function C_sym(L)--Use this if the block is centrosymmetry, *PTR!!!
L[23]=L[01]L[32]=L[10]
L[21]=L[03]L[12]=L[30]
L[20]=L[02]L[31]=L[13]
end
local function flipList(O)--Use this to copy a symmetry list
if not O then return end
@@ -268,9 +271,9 @@ do
},--W
function(P,d)
if P.type=="human"then SFX.fieldPlay("rotate",nil,P)end
local iki=XspinList[d]
for test=1,#iki do
local x,y=P.curX+iki[test][1],P.curY+iki[test][2]
local kickData=XspinList[d]
for test=1,#kickData do
local x,y=P.curX+kickData[test][1],P.curY+kickData[test][2]
if not P:ifoverlap(P.cur.bk,x,y)then
P.curX,P.curY=x,y
P.spinLast=1
@@ -366,9 +369,7 @@ do
[13]={{-1, 0},{ 1, 0}},
[31]={{ 1, 0},{-1, 0}},
},--I2
{
[01]={},[10]={},[03]={},[30]={},
},--O1
nil,--O1
}
TRS[2]= reflect(TRS[1])--SZ
TRS[4]= reflect(TRS[3])--LJ
@@ -377,9 +378,9 @@ do
TRS[13]=reflect(TRS[12])--FE
TRS[20]=reflect(TRS[19])--L5J5
TRS[22]=reflect(TRS[21])--RY
TRS[24]=reflect(TRS[23])--HN
C_sym(TRS[8])C_sym(TRS[9])
C_sym(TRS[25])C_sym(TRS[26])C_sym(TRS[29])
TRS[24]=reflect(TRS[23])--NH
C_sym(TRS[8])C_sym(TRS[9])--S5Z5
C_sym(TRS[25])C_sym(TRS[26])--I5I3
for i=1,29 do collect(TRS[i])end
pushZero(TRS)
end

View File

@@ -25,6 +25,11 @@ return{
"Chinese: 灰机wiki\nA Chinese Tetris wiki, written by Tetris fans from the Tetris Research community.\nCurrently, most of its pages are translated from Hard Drop Wiki and Tetris Wiki.\n(Link is in Chinese.)",
"https://tetris.huijiwiki.com",
},
{"Applets",
"applets",
"help",
"Type the following codes for some fun applets!\n15-Puzzle: 15p; Schulte Grid: grid\nPong: pong; AtoZ: atoz; 2048: 2048\nCubefield: cube; Just get ten: ten\nUltimate Tic-tac-toe: uttt\nTapping speed test: tap\nDon't touch white: dtw\nCannon: can; Dropper: drp\nCalculater: calc\nReflect: refl\nPolyforge: poly\nCommand Line: cmd",
},
--Games
{"TTT",
@@ -384,7 +389,7 @@ return{
{"Hold",
"hold",
"term",
"Save your current piece for later use, and take out a previously held piece (or next piece in the next queue, if no piece was held) to place instead. You can only perform this once per piece.",
"Save your current piece for later use, and take out a previously held piece (or next piece in the next queue, if no piece was held) to place instead. You can only perform this once per piece.\n\nTechmino Exclusive: Techmino has a \"In-place hold\" feature. When enabled, piece that spawn from the Hold queue will spawn at where your currently-controlling piece is, instead of at the top of the matrix.",
},
{"Misdrop",
"md misdrop",
@@ -411,6 +416,11 @@ return{
"term",
"Attacking: send garbage lines to your opponent by clearing lines.\nDefending: after your opponent send you lines, you offset this garbage by clearing lines.\nCounter attack: Send attack back at your opponent after offseting incoming garbage, or taking the hit then attack back.\nIn most games, garbage offsetting is 1:1, i.e. one attack offsets one incoming garbage.",
},
{"Combo",
"ren combo",
"term",
"Known in Japan as REN.\nConsecutive line clears make up combos. The second line clear in the combo is 1 combo, and the third line clear is 2 combo, and so on.\nUnlike Back to Back, placing a piece that does not clear a line will break the combo.",
},
{"Side well",
"sidewell",
"term",
@@ -461,11 +471,6 @@ return{
"term",
"A way of stacking where you have a 6-block-wide stack on the left, and a 3-block-wide stack on the right.\nFor a skilled player, this method of stacking might reduce the key presses needed for stacking, and is a popular Sprint stacking method. The reason why it works has to do with the fact that pieces spawn with a bias to the left.",
},
{"Combo",
"ren combo",
"term",
"Known in Japan as REN.\nConsecutive line clears make up combos. The second line clear in the combo is 1 combo, and the third line clear is 2 combo, and so on.\nUnlike Back to Back, placing a piece that does not clear a line will break the combo.",
},
{"20G",
"20g",
"term",
@@ -509,11 +514,11 @@ return{
{"DAS cut",
"dascut",
"term",
"本游戏中在放了一个方块后会取消/重置/减小das计时器让自动移动不会立刻生效减少移动键松开晚了导致下一块一出现就立即开始移动的情况\n注:别的游戏中das打断可能和本游戏这个机制有区别仅供参考", },--TODO
"Techmino exclusive: in Techmino, the DAS timer can be cleared or discharged for a short time when player start to control a new piece. This can reduce the case where a piece instantly starts moving if spawned with a direction button held.\n\nOther games may have a similar feature but may function differently.", },
{"SDF",
"sdf softdropfactor",
"term",
"Soft Drop Factor",--TODO
"Soft Drop Factor\n\nA way to define soft drop speed as a multiple of natural falling speed. In guideline games, soft drop is 20x the speed of natural falling, i.e. it has an SDF of 20. Techmino does not use SDF to define soft drop speed.",
},
{"Bag7 generator",
"bag7bag randomgenerator",
@@ -765,11 +770,6 @@ return{
"Techmino's Github repository. Stars are appreciated",
"https://github.com/26F-Studio/Techmino",
},
{"Minigame",
"minigame",
"other",
"Type the following codes in the search bar of this dictionary for some fun minigames!\n\n15-Puzzle: 15p\nSchulte Grid: grid\nPong: pong\nAtoZ: atoz\nUltimate Tic-tac-toe: uttt\nCubefield: cube\n2048: 2048\nJust get ten: ten\nTapping speed test: tap\nDon't touch white: dtw",
},
--English
{"SFX",
@@ -995,6 +995,12 @@ return{
"Tetris Research community member.\nSprint 47.2 seconds, 29TSD in Techmino, 25 All Clears in PC Challenge - Lunatic\nLots of mental computation power.",
"https://space.bilibili.com/403250559",
},
{"Particle_G",
"particleg",
"name",
"Tetris Research community member.\nSprint 59.4 seconds\nThe developer of Techmino backend",
"https://space.bilibili.com/3306106",
},
{"琳雨空",
"linyukong",
"name",
@@ -1013,10 +1019,10 @@ return{
"Tetris Research community member.",
"https://space.bilibili.com/13014410",
},
{"Gompyn",
"lanlv gompyn",
{"蓝绿",
"lanlv gompyn imple lee blari'o blariho",
"name",
"Tetris Research community member.\nTechnical player.",
"Tetris Research community member.\nParticipant of Techmino backend",
},
{"喵田弥夜Miya",
"miya miaotianmiye",

View File

@@ -19,22 +19,27 @@ return{
"俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n当前大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki",
"https://tetris.huijiwiki.com",
},
{"小程序",
"小程序 applets",
"help",
"输入以下词语打开小程序:\n15-Puzzle: 15p; Schulte Grid: grid\nPong: pong; AtoZ: atoz; 2048: 2048\nCubefield: cube; Just get ten: ten\nUltimate Tic-tac-toe: uttt\nTapping speed test: tap\nDon't touch white: dtw\nCannon: can; Dropper: drp\nCalculater: calc\nReflect: refl\nPolyforge: poly\nCommand Line: cmd",
},
--游戏(题库)
{"TTT",
"ttt",
"教程 ttt",
"game",
"现代方块特殊操作手把手教程(推荐使用电脑,移动设备需要外接键盘)\n\t推荐能无hold纯消四完成40行挑战的人学习\n\t内含T-spin、极简、SRS、部分对战定式介绍等教程\n\t完全吃透了话就可以成为教练啦!\n注:提供的链接是翻译后挂在茶服的版本",
"http://121.4.147.128/ttt",
},
{"TTPC",
"ttpc",
"pc教程 ttpc",
"game",
"SRS+bag7方块游戏开局PC教程(推荐使用电脑,移动设备需要外接键盘)\n\t推荐完成了ttt的人学习(必须先学会SRS)\n\t(不包括六巧板等其它PC定式)\n\n注:提供的链接是翻译后挂在茶服的版本",
"http://121.4.147.128/ttpc",
},
{"NAZO",
"nazo",
"题库 nazo",
"game",
"各类SRS试题(手机触屏玩不了)\n\t推荐能通过ttt的玩家尝试。\n\t内含各种t-spin/all-spin题目简单到极难题目都有。\n\n注:提供的链接是翻译后挂在茶服的版本",
"http://121.4.147.128/nazo",
@@ -42,48 +47,43 @@ return{
--游戏(网页)
{"King of Stackers",
"kos kingofstackers",
"回合制 kos kingofstackers",
"game",
"King of Stackers\n网页版回合制对战方块点击即玩(可能很卡)",
"https://kingofstackers.com/games.php",
},
{"Tetr.js",
"tetrjs",
"网页 手机 tetrjs",
"game",
"全平台网页版单机方块点击即玩,有对新人比较友好的全自定义(大多数常用功能),手机只能选几个默认按键组,不能自由摆放。别的都很好",
"http://farter.cn/t",
},
{"Tetra Legends",
"tl tetralegends",
"网页 tl tetralegends",
"game",
"全平台网页版单机方块点击即玩(推荐使用电脑,移动设备需要外接键盘)(第一次加载可能很慢),除了手感不够舒适以外功能比较强大,动效很好看,还把很多别的游戏里不可见的机制可视化了,游戏体验很好。\n\n注:包含节奏模式!\n\n2020年12月基本确定由于各种原因不再继续开发",
"https://tetralegends.app",
},
{"Tetra Online",
"to tetraonline",
"game",
"PC方块打开Steam免费下载即玩开发团队只有Dr.Ocelot和Mine两个人(都没有很多开发经验)UI部分模仿PPT手感故意设计为较慢平时玩无延迟方块的玩家会很不习惯音乐不错攻击特效好看。2020年12月9日收到来自TTC的DCMA警告信于是被迫停止开发在一段时间后关服并下架。",
},
{"Jstris",
"js jstris",
"网页 手机 js jstris",
"game",
"全平台网页对战方块点击即玩(服务器在国外可能很卡)",
"https://jstris.jezevec10.com",
},
{"Tetr.io",
"io tetrio",
"网页 io tetrio",
"game",
"炫酷在线对战方块点击即玩(推荐使用电脑,移动设备需要外接键盘)(服务器在国外,可能超级慢甚至打不开)",
"https://tetr.io",
},
{"World Wide Combo",
"wwc worldwidecombo",
"网页 wwc worldwidecombo",
"game",
"网页全世界匹配制1对1方块点击即玩(服务器在国外可能很卡)",
"https://worldwidecombos.com",
},
{"Tetris Friends",
"tf tetrisfriends",
"网页 tf tetrisfriends",
"game",
"一个已经关服了的网页版方块,曾经是一个不错的对战平台\n现在有人架了私服(怀旧服?)",
"https://notrisfoes.com",
@@ -91,7 +91,7 @@ return{
--游戏(街机/类街机)
{"TGM",
"tgm tetrisgrandmaster",
"俄罗斯方块大师 tgm tetrisgrandmaster",
"game",
"一个街机平台方块系列S13/GM等称号出自该系列可以在win平台运行\n\n其中TGM3目前玩得最普遍部分模式说明:\nMaster:大师模式,有段位评价,拿到更高段位点的要求:非消一的连击和消四字幕战中消除和通关每100的前70小于【标准时间上一个0~70秒数+2】中小的一个每100总用时不能超过限定值(不然取消上一个方法的加分并反扣点数);到500若没有进标准时间会强制结束游戏(称为铁门);字幕战有两个难度,半隐和全隐,后者必须拿到几乎全部的段位点才能进,消除奖励的段位点也更多。\nShirase:死亡模式类似于techmino中的20G-极限开局就是高速20G500和1000有铁门500开始底下开始涨垃圾行1000开始出现骨块1300通关进入大方块字幕战;段位结算:每通100加1段从S1到S13如果通关了字幕战就会有金色的S13\n\n更多内容详见链接",
"http://121.4.147.128/TGMGUIDE/",
@@ -114,7 +114,7 @@ return{
--游戏(PC/主机)
{"Tetris99",
"t99 tetris99",
"吃鸡 t99 tetris99",
"game",
"ns端方块主玩99人混战的吃鸡模式战术比重比较大胜率不只由玩家在平时1v1时的水平决定。也有一些常用单机模式如马拉松等",
},
@@ -128,6 +128,11 @@ return{
"game",
"一个win平台方块主要用来6人内对战/单挑/刷每日40L榜/挖掘模式/打机器人。支持自定义das/arr但都不能到0有一点输入延迟但问题不大是新人入块圈不错的选择。\n\n现在还开着的服务器有:\n\tTO-P(波兰服,服务器在波兰,可能会卡顿)\n\tTO-S(研究服,研究群群友自己开的服,很稳定,需要进群注册)\n\tTO-X(千雪服VUP星月千雪于20年9月开的服还处于实验阶段)",
},
{"Tetra Online",
"to tetraonline",
"game",
"PC方块打开Steam免费下载即玩(现在已经没了)开发团队只有Dr.Ocelot和Mine两个人(都没有很多开发经验)UI部分模仿PPT手感故意设计为较慢平时玩无延迟方块的玩家会很不习惯音乐不错攻击特效好看。2020年12月9日收到来自TTC的DCMA警告信于是被迫停止开发在一段时间后关服并下架。",
},
{"Tetris Effect",
"tec tetriseffectconnect",
"game",
@@ -154,12 +159,12 @@ return{
"块圈玩家自制win平台方块其实就是一个nullpomino的自带资源包的改版将东方project元素结合到俄罗斯方块的游戏好玩但是难度较大适合有方块基础并且各项能力都较强的玩家游玩(不然都不知道自己怎么死的)",
},
{"Misamino",
"misamino",
"回合制 misamino",
"game",
"块圈玩家自制win平台方块单机1v1主玩回合制模式可以自定义ai(自己写的话需要了解接口)",
},
{"JJ块",
"jj gougou",
"手机 jj gougou",
"game",
"jj棋牌平台下一个休闲游戏安卓百度“JJ比赛”官网下载平台后可以找到(找不到的话是你没在官网下载或者你是ios系统)。竖屏输入延迟很小超流畅可自定义das/arr/20G软降简单自定义键位无hold没有b2b无攻击缓冲不可抵消每次攻击上限为4连击较强其他同现代方块",
},
@@ -310,49 +315,49 @@ return{
"(部分游戏中)方块旋转后系统可能会给方块施加的偏移详见SRS词条",
},
{"SRS",
"srs rotate",
"超级旋转系统 srs rotate",
"term",
"Super Rotation System\n现代方块最常用的旋转系统,每个方块都有一个旋转中心,旋转后如果和场地有重合,会根据<从哪个方向转到哪个方向>进行一些偏移测试,可以让方块钻进入一些特定形状的洞。",
},
{"NRS",
"nrs rotate",
"旋转系统 nrs rotate",
"term",
"Nintendo Rotation System",
},
{"ARS",
"ars rotate",
"旋转系统 ars rotate",
"term",
"Arika Rotation System TGM系列使用的旋转系统(3代中的C模式)\n或者\nAtari Rotation System 一个左上对齐旋转系统",
},
{"DRS",
"drs rotate",
"旋转系统 drs rotate",
"term",
"DTET Rotation System",
},
{"TRS",
"trs rotate",
"旋转系统 trs rotate",
"term",
"Techmino Rotation System\nTechmino独有的旋转系统基于SRS设计修补了一些常见SZ卡死的地形增加了不少实用踢墙每个五连块也基本按照SRS的spin逻辑单独设计了踢墙表。",
},
--术语(游戏内名词)
{"mini",
"mini",
"迷你 mini",
"term",
"spin附加mini后攻击会弱化用于平衡不同难易度的tspin攻击判定在不同游戏都不一样而且大多数很不好理解建议只记住常见形状即可。",
},
{"B2B",
"b2b btb backtoback",
"大满贯 b2b btb backtoback",
"term",
"Back to Back\n连续打出两次特殊消行(spin和消四),中间不夹杂普通消行,可以提供额外的攻击(在tech中b2b为满贯大满贯是b3b)",
},
{"B2B2B",
"b2b2b b3b",
"大满贯 b2b2b b3b",
"term",
"b2b的加强版缩写b3b大量b2b后连续b2b会变成b2b2b(b3b),提供更强的攻击(仅Tech中有)",
},
{"Fin/Neo/Iso",
"fin neo iso",
"特殊 fin neo iso",
"term",
"一种特殊T2的名字不同的游戏内的攻击可能不一样没有特殊价值可以不详细了解。",
},
@@ -364,37 +369,37 @@ return{
"现代方块是一个模糊的概念,这里列出一部分\"标准\"规则,满足大部分的都可以认为是现代方块:\n1.可见场地大小是10*20不过上方空间也是存在的上限可以自己定一些游戏用的是40\n2.七种方块从顶部正中间出现(奇数宽方块偏左,高度可以是方块底部或顶部贴着场地顶),同一种方块的朝向(一般是平的面朝下)和颜色都一致\n3.一个合适的随机出块机制(常见的详见bag7词条和his词条)\n4.一个合适的的旋转系统(至少有双旋,详见双旋词条)(比如SRS详见SRS词条)\n5.一个合适的锁定延迟系统,详见锁定延迟词条\n6.一个合适的死亡判定,详见死亡判定词条\n7.有Next系统(一般是3~6个)详见Next词条并且方向和出现时候的方向一致\n8.有Hold系统详见Hold词条\n9.如果有出块延迟和消行延迟那么需要有提前xx系统详见IRS和IHS词条IMS是本游戏特有\n10.有DAS系统负责精密并且快速的左右移动详见DAS词条",
},
{"IRS",
"irs initialrotatesystem",
"提前 irs initialrotatesystem",
"term",
"Initial Rotation System\n提前旋转系统,提前按下旋转后方块出现就是转好的形状,有时可以避免死亡。",
},
{"IHS",
"ihs initialholdsystem",
"提前 ihs initialholdsystem",
"term",
"Initial Hold System\n提前Hold系统提前按下hold后直接出现hold里的方块有时可以避免死亡。",
},
{"IMS",
"ims initialmovesystem",
"提前 ims initialmovesystem",
"term",
"Initial Move System\n提前移动系统,提前按下移动后方块出现在移动好的位置,有时可以避免死亡。",
},
{"Next",
"next yulan xiayige",
"预览 下一个 next yulan xiayige",
"term",
"预览功能,指示后边几个块的顺序。\n提前思考手上这块怎么摆可以让后面轻松是玩家提升的必需技能。",
},
{"Hold",
"hold zancun",
"暂存 交换 hold zancun",
"term",
"暂存功能将手里的方块和hold槽中的交换不能连续使用。\n用来调整块序,更容易摆出你想要的形状。",
"暂存功能将手里的方块和hold槽中的交换不能连续使用。\n用来调整块序,更容易摆出你想要的形状。\n本游戏中有一个“物理hold”机制开启后hold换出的方块会直接出现在当前方块所在的位置",
},
{"Misdrop",
"md misdrop",
"md misdrop",
"term",
"误放,就是不小心放错了地方",
},
{"Mishold",
"mh mishold",
"误hold mh mishold",
"term",
"误hold就是不小心按到hold导致死亡或失去pc机会等",
},
@@ -404,7 +409,7 @@ return{
"在…之下\n用于表示成绩单位一般可不写比如40行成绩sub30是秒1000行sub15是分钟不写项目默认是40L\n\n例:39.95秒是sub4040.5秒不是sub40\n请不要使用sub62之类的词因为sub本身就是表示大约一分钟左右的成绩精确到10就可以了一般30秒以内的sub才会精确到1秒。",
},
{"Donate",
"donate juanzeng",
"捐赠 捐献 donate juanzeng",
"term",
"捐赠\n指刻意临时盖住洞去做tspin等操作来实现不断b2b的一类技巧。",
},
@@ -413,8 +418,13 @@ return{
"term",
"通过消除给对手发送垃圾行=攻击\n别人打过来攻击之后用攻击抵消=防御(相杀)\n抵消/吃下所有攻击后打出攻击=反击\n\n注:大多游戏的攻防是1:1的4行攻击抵消对手的4行攻击",
},
{"连击",
"连击 ren combo",
"term",
"从第二次消除起叫1ren/combo",
},
{"Side",
"side",
"连击 ·side",
"term",
"在场地旁边空出n列的堆叠法\n用来制造连击对于新人是一个不错的进攻方法。但由于起楼的时候可能会被顶死而且总效率不高导致高端玩家不会单独做wide更可能会在中局堆好炮并且观察到对手短时间内不会打出伤害的时候可以造用来大幅加强瞬时火力。",
},
@@ -424,17 +434,17 @@ return{
"Side 1 Wide\n旁边空1列是传统方块游戏里常见的消四打法。\n在现代方块对战中新手可以使用,短时间能打出大量攻击,但在高手场出场率不高,因为效率低,容易被对面一波打死,故只在极少数情况合适的时候用。",
},
{"S2W",
"s2w side2wide",
"连击 ·s2w side2wide",
"term",
"Side 2 Wide\n旁边空2列是常见的连击打法。\n难度很低现代块对战中新手可以使用结合hold可以很轻松地打出大连击。高手场使用不多因为准备时间太长会被对面提前打进垃圾行导致连击数减少效率也没有特别高故一套打完也不一定能杀人。",
},
{"S3W",
"s3w side2wide",
"连击 ·s3w side2wide",
"term",
"Side 3 Wide\n旁边空3列不如2w常见的连击打法。能打出的连击数比2w多但是难度偏大很容易断连。",
},
{"S4W",
"s4w side4wide",
"连击 ·s4w side4wide",
"term",
"Side 4 Wide\n旁边空4列一种连击打法能打出很高的连击并且准备时间比别的wide打法短故动作快的话可以抢在对手打进垃圾之前堆很高然后打出超大连击。\n(因为可能会被提前打死风险挺大所以没有c4w那么不平衡)",
},
@@ -444,22 +454,22 @@ return{
"Center 1 Wide\n中间空1列一种实战里消4同时辅助打TSD的打法需要玩家理解<平衡法>,熟练之后可以轻松消四+T2输出难度也不是特别大。",
},
{"C2W",
"c2w center2wide",
"连击 ·c2w center2wide",
"term",
"Center 2 Wide\n中间空2列一种连击打法",
},
{"C3W",
"c3w center3wide",
"连击 ·c3w center3wide",
"term",
"Center 3 Wide\n中间空3列一种连击打法",
},
{"C4W",
"c4w center4wide",
"连击 ·c4w center4wide",
"term",
"Center 4 Wide\n中间空四列,一种连击打法,能打出很高的连击,利用了大多数专业对战方块游戏的死亡判定机制,可以放心堆高不担心被顶死,然后开始连击。是一种利用游戏机制的不平衡策略(尤其在开局时),观赏性不是很强还可以以弱胜强,成本太低所以成为了部分游戏中约定的类似 禁招 的东西,请在了解情况后再使用,不然可能会被别人骂。\n\n本游戏里做了平衡c4w强度没有别的游戏高而且打的是电脑所以放心用~",
},
{"N-res",
"residual c4w s4w",
"连击 ·residual c4w s4w",
"term",
"N-Residual\nN-剩余指4w连击楼底部留几个方格常用的是3-res和6-res。\n3-res路线少比较好学成功率也很高实战完全够用\n6-res路线多更难用但是计算力很强的话比3res更稳也可以用来完成特殊挑战(比如本游戏的c4w练习要求100连击通关)",
},
@@ -468,13 +478,8 @@ return{
"term",
"指左边6列右边3列的堆叠方式。在玩家有足够的计算能力后可以减少堆叠所用的按键数(反之可能甚至会增加)是主流的用于减少操作数的高端40L堆叠方式原理跟出块位置是中间偏左有关。",
},
{"连击",
"连击 ren combo",
"term",
"从第二次消除起叫1ren/combo",
},
{"20G",
"20g",
"高重力 20g",
"term",
"现代方块的最高下落速度,表观就是方块瞬间到底,不存在中间的下落过程,会让方块无法跨越壕沟/从山谷爬出。",
},
@@ -494,7 +499,7 @@ return{
"方块<碰到地面→锁定>之间的时间。经典块仅方块下落一格时刷新倒计时,而现代方块中往往任何操作都将重置该倒计时,所以连续移动和操作可以让方块不马上锁定,拖一会时间(重置次数有限一般是15)。",
},
{"Finesse",
"finesse jijiancaozuo zuijiancaozuo",
"极简操作 最简操作 finesse jijiancaozuo zuijiancaozuo",
"term",
"极简操作\n用最少的按键数将方块移到想去的位置的技术节约时间和减少misdrop。练习可用jstris的极简错误重开或者techmino中打开极简错误提示多玩就可以。\n\n注意本游戏使用的极简判定系统不是说完全和理论最少操作数一样而是不需要软降就能达到的位置才会按照标准出块方向和你的按键次数执行极简检测故在此不像js存在软降后误杀。但是多了一些新的条件比如【手上和hold一样/已经按了超过3次按键后】再hold后按键次数不重置(让下一块极简失误)。\n极简率计算:\n没有超过标准极简法操作数的为Perfect计100%超出一步为Great计50%超出两步为Bad计25%两步以上为Miss计0%其中Bad和Miss会断连\n\n注:20G下极简系统和0G一样工作所以得到的数值不准确参考价值偏低",
},
@@ -504,7 +509,7 @@ return{
"常用语指在低重力的单人模式里减速研究怎么做各种Tspin本游戏中拓展了含义用于称呼几乎需要全程spin的游戏模式。",
},
{"DAS & ARR",
"das arr",
"灵敏度 das arr",
"term",
"DAS(Delay-auto-shift延迟自动移动)系统。\n\nDAS自动移动延迟指从<按下移动键时动了一格>到<开始自动移动>之间的时间\nARR(Auto-repeat-rate),自动重复速率,指<每次自动移动>之间的时间\n\n单位都是f(帧1帧=1/60秒)\n新人不会调的话推荐用das=8~10arr=1~2\n对自己能力比较自信或者是已经有一定水平想提速推荐用das=4~6arr=0\n(如果是别的游戏单位是ms(毫秒)那么乘16.7就可算出对应的数值)\n\n最佳调整方法:das越小越好小到玩家依然能精准区分单点/长按为止;arr能0就0游戏不允许的话就能拉多小拉多小\n\n这套系统也被叫作DAS系统",
},
@@ -516,45 +521,45 @@ return{
{"DAS打断",
"dascut",
"term",
"本游戏中在放了一个方块后会取消/重置/减小das计时器让自动移动不会立刻生效减少移动键松开晚了导致下一块一出就立即开始移动的情况\n注:别的游戏中das打断可能和本游戏这个机制有区别,仅供参考",
"本游戏中指玩家的操作焦点转移到新方块的瞬间,此时减小(重置)das计时器让自动移动不会立刻生效减少移动键松开晚了导致下一块一出就立即开始移动的情况\n注:其他游戏中das打断机制可能和本游戏有区别,仅供参考",
},
{"SDF",
"sdf softdropfactor",
"软降速度 sdf softdropfactor",
"term",
"Soft Drop Factor软降速度因子(倍率)部分游戏中的软降机制是让重力变为原来的若干倍SDF就是这个倍数。\n基本所有官块和tetr.io使用这个机制本游戏不使用。",
},
{"bag7出块",
"bag7bag",
"bag出块 bag7bag",
"term",
"bag7\n一种现代方块的出块方式开局起每7个块是7种形状各出现一次\n\n例如:\nZSJLTOI OTSLZIJ LTISZOJ",
},
{"His出块",
"history",
"his出块 history",
"term",
"一种出块方式例如his 4 roll 6 (h4r6) 就是在随机生成新的next的时候随机一个跟最后4次生成的next中有一样的就重新随机直到已经尝试6次或和那4个都不一样。",
},
{"Hypertap",
"hypertap",
"超连点 hypertap",
"term",
"快速震动手指,实现比长按更快速+灵活的高速单点移动,主要在经典块的高难度下(因为das不可调而且特别慢高速下很容易md导致失败此时手动连点就比自动移动更快)或者受特殊情况限制不适合用自动移动时使用。会使用这个技术的人被称为Hypertapper",
},
{"TOP攻击表",
"top attack",
"攻击表 top attack",
"term",
"消1/2/3/4打0/1/2/4\nTspin攻击为消行数*2如果符合mini条件则/2\n连击攻击:001122334445+\nb2b攻击+1(如果是T3则+2)\npc攻击+6(该部分攻击aoe直接打出到所有对手不抵消缓冲槽中的攻击)",
},
{"Techmino攻击表",
"tech attack",
"攻击表 tech attack",
"term",
"攻击系统:\n 普通消除:\n 消<4行打出[消行数-0.5]攻击\n 特殊消除:\n 如果是spin打出[2*消行数]攻击,\n B2B攻击+[1/1/2/4/8(spin1~5)]\n B3B攻击在B2B基础上+消行数*0.5+1额外抵挡\n mini减至25%\n 不是spin但是单次消>=4行打出[消行数]攻击,\n B2B攻击+1\n B3B攻击+50%+1额外抵挡\n 特殊消除会增加B2B点数让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)\n 半全消(<下方有剩余方块>的全消如果是I消1行则必须不剩余玩家放置的方块):伤害+2额外抵挡+2\n 全消:将上述伤害之和减半,再+8~20(本局内递增2)+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)\n 连击:每次连击给予上述攻击[连击数*25%(如果只消一行就是15%)]的加成12combo达到上限连击>=3次时再额外加1攻击\n 根据上述规则计算后,向下取整,攻击打出",
},
{"C2序列",
"c2 seq",
"c2序列 seq",
"term",
"七个块初始权重0\n全体乘2再加0~1的随机数选数字最大的块出然后将其权重除以3.5,循环",
},
{"C2踢墙",
"c2 kick",
"c2踢墙 kick",
"term",
"左下右下左2右2\n(任何方块的任何旋转都使用这个表)",
},
@@ -772,11 +777,6 @@ return{
"Techmino的github仓库地址欢迎star",
"https://github.com/26F-Studio/Techmino",
},
{"小游戏",
"小游戏 minigame xiaoyouxi",
"other",
"输入以下词语,小游戏免费玩!\n\n15-Puzzle: 15p\nSchulte Grid: grid\nPong: pong\nAtoZ: atoz\nUltimate Tic-tac-toe: uttt\nCubefield: cube\n2048: 2048\nJust get ten: ten\nTapping speed test: tap\nDon't touch white: dtw",
},
--英文
{"SFX",
@@ -817,7 +817,7 @@ return{
"一流玩家,很强",
},
{"Doremy",
"doremy 123",
"哆来咪 doremy 123",
"name",
"一流玩家,雨宫说他是世界第二",
},
@@ -880,7 +880,7 @@ return{
{"小Z",
"小Z z xiaoz",
"name",
"这个百科的名字!曾经是群里的答疑机器人,此词典数据库也就是沿用了机器人问答库~",
"这个百科的名字!曾经是群里的答疑机器人,此词典数据库也沿用了机器人问答库~",
},
{"MrZ",
"mrz zjiang ddd 026 t626",
@@ -1003,6 +1003,12 @@ return{
"【研究群】「T942」\n40行47.2秒29TSD全清挑战-疯狂25PC\n算力极强的思维型选手,不比速度的许多项目都是世界水平",
"https://space.bilibili.com/403250559",
},
{"Particle_G",
"particleg t1080",
"name",
"【研究群】「T1080」\n40行59.4秒\nTechmino后端(服务器)主要开发人员",
"https://space.bilibili.com/3306106",
},
{"琳雨空",
"琳雨空 linyukong t1505",
"name",
@@ -1016,15 +1022,15 @@ return{
"https://space.bilibili.com/147529",
},
{"ditoly",
"ditoly icrem kuimei jk t3055",
"ditoly icrem kuimei jk t3055",
"name",
"【研究群】「T3055」\n被清华劝退现于北大的打块天才jk\n(好像也被北大劝退了?不知道)",
"https://space.bilibili.com/13014410",
},
{"蓝绿",
"蓝绿 lanlv gompyn t3182",
"蓝绿 lanlv gompyn imple lee blari'o blariho t3182",
"name",
"【研究群】「T3182」\n高技术力,喜欢催更",
"【研究群】「T3182」\n高技术力,参与了Techmino后端开发",
},
{"喵田弥夜",
"喵田弥夜 miya miaotianmiye mao t7023",

View File

@@ -184,15 +184,15 @@ return{
"Author: MrZ E-mail: 1046101471@qq.com",
"Powered by LOVE2D",
"",
"Program: MrZ, Particle_G, [T9972, FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, T0722]",
"Program: MrZ, Particle_G, [蓝绿, FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Music: MrZ, [T0722]",
"Voice & Sound: Miya, Naki, MrZ",
"Test: 思竣 Performance: 模电, HBM",
"Translate: User670, MattMayuga, Mizu, Mr.Faq, ScF",
"",
"Special Thanks:",
"User670, Big_True, Flyz, Farter,",
"User670, Big_True, Flyz, Farter, T9972",
"蕴空之灵, Teatube, [All test staff]",
},
used=[[
@@ -275,9 +275,8 @@ return{
autoPause="Pause when focus is lost",
swap="Key Combination (Change Atk. Mode)",
fine="Finesse Error Sound",
appLock="App Lock (Password: 626)",
appLock="App Lock (Password: 6+26)",
simpMode="Simple mode",
calc="App Lock",
},
setting_video={
title="Video Settings",
@@ -424,21 +423,10 @@ return{
nextCount="Next",
holdCount="Hold",
infHold="Infinite Hold",
block="Draw Block",
ghost="Ghost",
center="Center",
upEdge="3D Block",
bagLine="Bag Line",
highCam="Birds-eye View",
nextPos="Next Preview",
phyHold="In-place Hold",
bone="Bone Blocks",
mindas="Min. DAS",
minarr="Min. ARR",
minsdarr="Min. SDARR",
noTele="No Teleportation",
fieldH="Field height",
RS="Rotation System",
ospin="O-Spin",
deepDrop="Deep Drop",
target="Target",
@@ -457,6 +445,7 @@ return{
any="Erase",
space="×",
smartPen="Smart",
pushLine="Add Line(K)",
delLine="Del Line(L)",
@@ -612,7 +601,7 @@ return{
b3b="B3B",
pc="PC",
},
mg_15p={
app_15p={
reset="Shuffle",
color="Color",
blind="Blind",
@@ -620,34 +609,35 @@ return{
pathVis="Show Path",
revKB="Reverse",
},
mg_schulteG={
app_schulteG={
reset="Reset",
rank="Size",
blind="Blind",
disappear="Hide",
tapFX="Tap FX",
},
mg_pong={
app_pong={
reset="Restart",
},
mg_AtoZ={
app_AtoZ={
level="Level",
keyboard="Keyboard",
reset="Reset",
},
mg_2048={
app_2048={
reset="Reset",
blind="Blind",
tapControl="Tap control",
skip="Skip Round",
},
mg_ten={
app_ten={
reset="Reset",
next="Next",
blind="Blind",
fast="Fast",
},
mg_dtw={
app_dtw={
reset="Reset",
mode="Mode",
},

View File

@@ -5,7 +5,6 @@ return{
sureQuit="Appuyez à nouveau pour sortir",
newVersion="Merci d'avoir mis le jeu à jour ! Les nouvelles fonctionnalités sont listées ci-dessous.",
httpTimeout="La connexion au réseau ne s'est pas faite à temps.",
marking="Créateur du jeu: MrZ_26\nSi vous pouvez voir ceci, cet enregistrement est illégal\nToute explication est fausse et invalide.",
newDay="[Anti-addiction] Nouveau jour, nouveau commencement !",
playedLong="[Anti-addiction] Vous avez joué pendant un bon bout de temps aujourd'hui. Faites des pauses.",
playedTooMuch="[Anti-addiction] Vous avez joué trop longtemps ! Vous ne pouvez plus jouer.",
@@ -163,15 +162,15 @@ return{
"Author: MrZ E-mail: 1046101471@qq.com",
"Powered by LOVE2D",
"",
"Programme : MrZ, Particle_G, [T9972, FinnTenzor]",
"Art : MrZ, ScF, [Gnyar, T0722]",
"Programme : MrZ, Particle_G, [蓝绿, FinnTenzor]",
"Art : MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Musique : MrZ, [T0722]",
"Voix & Sons: Miya, Naki, MrZ Performance: 模电, HBM",
"Test: 思竣 Performance: 模电, HBM",
"Traduction: User670, MattMayuga, Mizu, Mr.Faq, ScF",
"",
"Merci à:",
"User670, Big_True, Flyz, Farter,",
"User670, Big_True, Flyz, Farter, T9972",
"蕴空之灵, Teatube, [All test staff]",
},
used=[[
@@ -251,8 +250,8 @@ return{
autoPause="Mettre en pause en cas de perte de focus",
swap="Combinaison de touches (changer le mode d'attaque)",
fine="Son d'erreur de Finesse",
appLock="Verrouillage d'appli (MDP : 626)",
calc="Verrouillage d'appli",
appLock="Verrouillage d'appli (MDP : 6+26)",
-- simpMode="Simple mode",
},
setting_video={
title="Paramètres vidéo",
@@ -400,21 +399,10 @@ return{
nextCount="Prévisualisations de pièces",
holdCount="Réserve",
infHold="Réserver une fois",
block="Dessiner le bloc",
ghost="Pièce fantôme",
center="Centre",
upEdge="3D bloc",
bagLine="Ligne du Sac",
highCam="Vue d'oiseau",
nextPos="Prévisualisation de position",
-- phyHold="Physical Hold",
bone="Crochets",
mindas="DAS minimum",
minarr="ARR minimum",
minsdarr="SDARR minimum",
noTele="Pas de téléportation",
-- fieldH="Field height",
RS="Système de rotation",
ospin="O-spin",
-- deepDrop="Deep Drop",
target="But",
@@ -433,6 +421,8 @@ return{
any="Effacer",
space="×",
-- smartPen="Smart",
pushLine="Ajouter ligne (K)",
delLine="Supprimer ligne (L)",
@@ -523,7 +513,7 @@ return{
_3="Triple",
_4="Techrash",
},
mg_15p={
app_15p={
reset="Réinitialiser",
color="Couleur",
blind="Aveugler",
@@ -531,33 +521,34 @@ return{
pathVis="Montrer le tracé",
revKB="Inverser",
},
mg_schulteG={
app_schulteG={
reset="Réinitialiser",
rank="Taille",
blind="Aveugler",
disappear="Cacher",
tapFX="Effet quand tapé",
},
mg_pong={
app_pong={
reset="Redémarrer",
},
mg_AtoZ={
app_AtoZ={
level="niveau",
keyboard="Clavier",
reset="Redémarrer",
},
mg_2048={
app_2048={
reset="Réinitialiser",
blind="Aveugler",
tapControl="Contrôle par toucher",
skip="Passer Round",
},
mg_ten={
app_ten={
reset="Réinitialiser",
next="Prévisualisations",
blind="Aveugler",
-- fast="Fast",
},
mg_dtw={
app_dtw={
reset="Réinitialiser",
-- mode="Mode",
},

View File

@@ -184,15 +184,15 @@ return{
"Author: MrZ E-mail: 1046101471@qq.com",
"Powered by LOVE2D",
"",
"Programa: MrZ, Particle_G, [T9972, FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, T0722]",
"Programa: MrZ, Particle_G, [蓝绿, FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Music: MrZ, [T0722]",
"Voice & Sound: Miya, Naki, MrZ",
"Test: 思竣 Performance: 模电, HBM",
"Traduzir: User670, MattMayuga, Mizu, Mr.Faq, ScF",
"",
"Special Thanks:",
"User670, Big_True, Flyz, Farter,",
"User670, Big_True, Flyz, Farter, T9972",
"蕴空之灵, Teatube, [All test staff]",
},
used=[[
@@ -275,9 +275,8 @@ return{
autoPause="Pausar quando foco for perco",
swap="Combinação de tecla(Mudar modo de atk)",
fine="Som Falha de destreza",
appLock="App Lock (Senha: 626)",
appLock="App Lock (Senha: 6+26)",
-- simpMode="Simple mode",
calc="App Lock",
},
setting_video={
title="Config. de vídeo",
@@ -424,21 +423,10 @@ return{
nextCount="Prox.",
holdCount="Segurar",
infHold="Segurar Infinito",
block="Mostrar bloco",
ghost="Fantasma",
center="Centro",
upEdge="3D bloco",
bagLine="Linha De Bolsa",
highCam="Vista Olho-De-Pássaro",
nextPos="Próxima pos.",
-- phyHold="Physical Hold",
bone="Bone Blocks",
mindas="Min. DAS",
minarr="Min. ARR",
minsdarr="Min. SDARR",
noTele="Sem teleporte",
-- fieldH="Field height",
RS="Sistema de rotação",
ospin="O-Spin",
-- deepDrop="Deep Drop",
target="Alvo",
@@ -457,6 +445,7 @@ return{
any="Apagar",
space="×",
-- smartPen="Smart",
pushLine="Add Linha(K)",
delLine="Del Linha(L)",
@@ -612,7 +601,7 @@ return{
b3b="B3B",
pc="PC",
},
mg_15p={
app_15p={
reset="Embaralhar",
color="Cor",
blind="Cego",
@@ -620,33 +609,34 @@ return{
pathVis="Mostrar caminho",
revKB="Reverso",
},
mg_schulteG={
app_schulteG={
reset="Resetar",
rank="Tamanho",
blind="Cego",
disappear="Escond.",
tapFX="FX De Toque",
},
mg_pong={
app_pong={
reset="Reiniciar",
},
mg_AtoZ={
app_AtoZ={
level="Nivel",
keyboard="Teclado",
reset="Reiniciar",
},
mg_2048={
app_2048={
reset="Resetar",
blind="Cego",
-- tapControl="Tap control",
-- skip="Skip Round",
},
mg_ten={
app_ten={
reset="Resetar",
next="Próxima",
blind="Cego",
-- fast="Fast",
},
mg_dtw={
app_dtw={
reset="Resetar",
-- mode="Mode",
},

View File

@@ -164,15 +164,15 @@ return{
"Autor:MrZ Email: 1046101471@qq.com",
"Creado con LOVE2D",
"",
"Programación: MrZ, Particle_G, [T9972, FinnTenzor]",
"Artistas: MrZ, ScF, [Gnyar, T0722]",
"Programación: MrZ, Particle_G, [蓝绿, FinnTenzor]",
"Artistas: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"Música: MrZ, [T0722]",
"Voces/Sonidos: Miya, Naki, MrZ Performance: 模电, HBM",
"Testeo: 思竣 Performance: 模电, HBM",
"Traducción: User670, MattMayuga, Mizu, Mr.Faq, ScF",
"",
"Agradecimientos:",
"User670, Big_True, Flyz, Farter,",
"User670, Big_True, Flyz, Farter, T9972",
"蕴空之灵, Teatube, [Todo el Staff de Testeo]",
},
used=[[
@@ -255,9 +255,8 @@ return{
autoPause="Pausar cuando la ventana no está enfocada",
swap="Combinación de Teclas (Cambiar Modo de Ataque)",
fine="Sonido de Error de Finesse",
appLock="Bloqueo de App (Contraseña: 626)",
appLock="Bloqueo de App (Contraseña: 6+26)",
-- simpMode="Simple mode",
calc="Bloqueo de App",
},
setting_video={
title="Ajustes de Video",
@@ -400,21 +399,10 @@ return{
nextCount="Siguiente",
holdCount="Reserva",
-- infHold="Hold Único",
block="Dibujar Bloques",
ghost="Fantasma",
center="Centrar",
upEdge="3D Bloques",
bagLine="Línea de Bag de Pzas.",
highCam="Vista Aérea",
nextPos="Nro. de Pzas. Siguientes",
-- phyHold="Physical Hold",
bone="Bone Block",
mindas="DAS Mínimo",
minarr="ARR Mínimo",
minsdarr="SDARR Mínimo",
noTele="Sin Teleport",
-- fieldH="Field height",
-- RS="Rotation System",
ospin="O-Spin",
-- deepDrop="Deep Drop",
target="Objetivo",
@@ -529,7 +517,7 @@ return{
_3="Triple",
_4="Techrash",
},
mg_15p={
app_15p={
reset="Mezclar",
color="Color",
blind="A ciegas",
@@ -537,33 +525,34 @@ return{
pathVis="Mostrar Movs.",
revKB="Deshacer",
},
mg_schulteG={
app_schulteG={
reset="Reiniciar",
rank="Tamaño",
blind="A ciegas",
disappear="No mostrar",
tapFX="Sonido al pulsar",
},
mg_pong={
app_pong={
reset="Reiniciar",
},
mg_AtoZ={
app_AtoZ={
-- level="Level",
-- keyboard="Keyboard",
reset="Reiniciar",
},
mg_2048={
app_2048={
reset="Reiniciar",
blind="A ciegas",
-- tapControl="Tap control",
-- skip="Skip Round",
},
mg_ten={
app_ten={
reset="Reiniciar",
next="Siguiente",
blind="A ciegas",
-- fast="Fast",
},
mg_dtw={
app_dtw={
reset="Reiniciar",
-- mode="Mode",
},

View File

@@ -135,9 +135,8 @@ return{
autoPause="A||",
swap="=+=+=",
fine="12 X 21",
appLock="?XX(=626)",
-- simpMode="_",
calc="?XX",
appLock="?XX(=6+26)",
simpMode=".",
},
setting_video={
title="{~~}",
@@ -281,21 +280,10 @@ return{
nextCount="",
holdCount="[ ]",
infHold="∞*[ ]",
block="==↓==",
ghost="__↓__",
center="+",
upEdge="[]`",
bagLine="123|123",
highCam="↑__↑",
nextPos="???←",
phyHold="P-[ ]",
bone="[]",
mindas="mDAS",
minarr="mARR",
minsdarr="msdARR",
noTele="X→→X",
fieldH="↑[]↓",
RS="''?",
ospin="O→Any",
deepDrop="\\↓↓/",
target="&=",
@@ -314,6 +302,8 @@ return{
any="_",
space="×",
smartPen="~",
pushLine="↑↑↑↑↑(K)",
delLine="==X==(L)",
@@ -456,7 +446,7 @@ return{
b3b="^^",
pc="#<>#",
},
mg_15p={
app_15p={
reset="!@#$%",
color="~~~",
blind="???",
@@ -464,33 +454,34 @@ return{
pathVis="--==>",
revKB="Reverse",
},
mg_schulteG={
app_schulteG={
reset="!@#$%",
rank="←?→",
blind="???",
disappear="=X=",
tapFX="↓ !",
},
mg_pong={
app_pong={
reset="R",
},
mg_AtoZ={
app_AtoZ={
level="_ _ _",
keyboard="[##]",
reset="R",
},
mg_2048={
app_2048={
reset="R",
blind="???",
tapControl="_↓",
skip=">>",
},
mg_ten={
app_ten={
reset="R",
next="",
blind="???",
fast="~~→",
},
mg_dtw={
app_dtw={
reset="R",
mode="?",
},

View File

@@ -70,7 +70,6 @@ return{
ctrl="改控制",
key="改键位",
touch="改触屏",
calc="家长锁",
},
setting_video={
title="改画面",
@@ -169,7 +168,7 @@ return{
b3b="很牛逼",
pc="消干净了",
},
mg_15p={
app_15p={
reset="打乱",
color="",
blind="",
@@ -177,7 +176,7 @@ return{
pathVis="路径显示",
revKB="键盘反向",
},
mg_schulteG={
app_schulteG={
reset="重开",
rank="尺寸",
blind="",

View File

@@ -185,15 +185,15 @@ return{
"作者:MrZ 邮箱:1046101471@qq.com",
"使用LOVE2D引擎",
"",
"程序: MrZ, Particle_G, [T9972, FinnTenzor]",
"美术: MrZ, ScF, [Gnyar, T0722]",
"程序: MrZ, Particle_G, [蓝绿, FinnTenzor]",
"美术: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
"音乐: MrZ, [T0722]",
"音效/语音: Miya, Naki, MrZ",
"测试: 思竣 演出: 模电, HBM",
"翻译: User670, MattMayuga, Mizu, Mr.Faq, ScF",
"",
"特别感谢:",
"User670, Big_True, Flyz, Farter,",
"User670, Big_True, Flyz, Farter, T9972",
"蕴空之灵, Teatube, [所有内测人员]",
},
used=[[
@@ -276,9 +276,8 @@ return{
autoPause="失去焦点自动暂停",
swap="组合键切换攻击模式",
fine="极简操作提示音",
appLock="软件锁(密码626)",
appLock="软件锁(密码6+26)",
simpMode="简洁模式",
calc="软件锁",
},
setting_video={
title="画面设置",
@@ -424,21 +423,10 @@ return{
nextCount="Next",
holdCount="Hold",
infHold="无限Hold",
block="方块可见",
ghost="阴影透明度",
center="中心透明度",
upEdge="3D方块",
bagLine="包分界线",
highCam="超屏视野",
nextPos="生成预览",
phyHold="物理Hold",
bone="骨块",
mindas="最小DAS",
minarr="最小ARR",
minsdarr="最小软降ARR",
noTele="禁止瞬移",
fieldH="场地高度",
RS="旋转系统",
ospin="O-spin",
deepDrop="穿墙软降",
target="目标行数",
@@ -457,6 +445,8 @@ return{
any="不定",
space="×",
smartPen="智能",
pushLine="增加一行(K)",
delLine="消除行(L)",
@@ -611,7 +601,7 @@ return{
b3b="B3B",
pc="PC",
},
mg_15p={
app_15p={
reset="打乱",
color="颜色",
blind="盲打",
@@ -619,37 +609,38 @@ return{
pathVis="路径显示",
revKB="键盘反向",
},
mg_schulteG={
app_schulteG={
reset="重来",
rank="尺寸",
blind="盲打",
disappear="消失",
tapFX="点击动画",
},
mg_pong={
app_pong={
reset="重置",
},
mg_AtoZ={
app_AtoZ={
level="关卡",
keyboard="键盘",
reset="重置",
},
mg_UTTT={
app_UTTT={
reset="重置",
},
mg_2048={
app_2048={
reset="重置",
blind="盲打",
tapControl="点击操作",
skip="跳过回合",
},
mg_ten={
app_ten={
reset="重置",
next="预览",
blind="盲打",
fast="速打",
},
mg_dtw={
app_dtw={
reset="重置",
mode="模式",
},
@@ -804,7 +795,7 @@ return{
"触摸板打osu也很好!",
"凑数tip什么时候能站起来!",
"打好块跟学习一样没有捷径,多练。",
"大概还是有人会看tips",
"大概还是有人会看tip的",
"大满贯10连击消四全清!",
"戴上耳机以获得最佳体验",
"单手也能玩!",
@@ -817,6 +808,7 @@ return{
"对战游戏不是单机游戏,所以timing在对战里也非常重要!",
"多年小游戏玩家表示痛恨假加载,启动动画主要是在加载资源",
"多hold现代块又回来了!",
"物理hold了解一下",
"发现有个\"隐形\"皮肤了吗",
"方块不能吃",
"方块教会我们,合群了就会消失,...",
@@ -824,7 +816,7 @@ return{
"服务器随时爆炸",
"感觉自己明明按键了但是没反应?你真的按到了吗?",
"感觉自己速度到上限了?试着把das调低一点",
"感谢群友帮忙想tips",
"感谢群友帮忙想tip",
"感谢Orzmic为这个tip显示框提供灵感",
"刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
"刚开始练全隐形可以尽量堆平,留一列消四",
@@ -865,7 +857,6 @@ return{
"你今天的人品值是:0.26",
"你今天的人品值是:0",
"你今天的人品值是:12.7",
"你今天的人品值是:14.06",
"你今天的人品值是:22",
"你今天的人品值是:26",
"你今天的人品值是:28.3",
@@ -874,13 +865,15 @@ return{
"你今天的人品值是:62.6",
"你今天的人品值是:87.2",
"你今天的人品值是:89.5",
"你今天的人品值是:99.9",
"你今天的人品值是:9999%",
"你今天的人品值是:"..math.random(100),
"你可以从统计页面打开游戏存档目录",
"你们考虑过Z酱的感受吗?没有!你们只考虑你自己。",
"你知道吗,全程不使用左右移动键完成40行模式是有可能的",
"你知道吗:看主页机器人玩可能比较费电",
"你知道吗:全程不使用任何旋转键完成40行模式是有可能的",
"你知道吗:全程不使用左右移动键完成40行模式是有可能的",
"你知道吗:停留在模式地图界面很费电",
"你准备好了吗?",
"请不要一直看主页机器人玩,可能比较费电",
"请勿大力敲打设备!敲坏了就没有Techmino玩了",
"请勿使用三只手游玩",
"去玩别的方块的时候记得没有Ospin!",
@@ -898,10 +891,9 @@ return{
"挖掘能力在对战里非常非常非常重要!!!!",
"玩到一半弹出消息框?快去设置禁止弹窗",
"为了保护玩家们的健康,本游戏有一个临时的简易防沉迷系统!(不过估计你也触发不了/笑)",
"为了防止误触,玩到一半重开需要长按重开键",
"为什么关卡那么少!因为前一模式成绩连D都没达到,再加把劲吧~",
"我曾经在极度愤怒的时候15秒消了40行",
"我们是不是第一个在方块游戏做tips的?",
"我们是不是第一个在方块游戏做tip的?",
"我是一条凑数tip",
"我也不知道分数有啥用应该只是好看的,建议别管他,只看关卡要求你做啥",
"我也是一条凑数tip",
@@ -994,7 +986,7 @@ return{
{c.C,"泰拉瑞亚好玩!"},
{c.C,"我的世界好玩!"},
{c.C,"CYAN"},
{c.C,"Orzmic好玩!不过还没出"},
{c.C,"Orzmic好玩!"},
{c.C,"Osu!好玩!"},
{c.C,"Phigros好玩!"},
{c.C,"VVVVVV好玩!"},
@@ -1020,7 +1012,7 @@ return{
{c.grape,"T-spin!"},
{c.grass,"GRASS"},
{c.grey,"俄罗斯方块环游记也不错!"},
{c.grey,"感谢Phigros提供部分tips模板("},
{c.grey,"感谢Phigros提供部分tip模板("},
{c.grey,"暂定段位:9"},
{c.grey,"REGRET!!"},
{c.lame,"LAME"},
@@ -1059,8 +1051,8 @@ return{
{c.sky,"Lua",c.W,"天下第一"},
{c.sky,"SKY"},
{c.W,"1, 2, ",c.C,"",c.W,"!!!!!"},
{c.W,"效率药水",c.grey,"效率提升 (8:00)"},
{c.W,"协调药水",c.grey,"MD减少 II(1:30)"},
{c.W,"效率药水",c.grey," 效率提升 (8:00)"},
{c.W,"协调药水",c.grey," MD减少 II(1:30)"},
{c.water,"WATER"},
{c.Y,"暂定段位:GM"},
{c.Y,"暂定段位:M"},

View File

@@ -84,10 +84,7 @@ return{
nextCount="预览个数",
holdCount="暂存个数",
infHold="无限暂存",
mindas="最小首次移动延迟",
minarr="最小移动重复延迟",
minsdarr="最小软降重复延迟",
phyHold="物理暂存",
},
music={
bgm="音乐",

View File

@@ -1,4 +1,4 @@
return splitStr([=[
return SPLITSTR([=[
Gameplay:
The system will provide you with tetrominoes (4-block pieces),
with a total of 7 types, and the player needs to control them

View File

@@ -1,4 +1,4 @@
return splitStr([=[
return SPLITSTR([=[
游戏方法:
系统会提供的一个个四连骨牌("方块",总共7种)
玩家需要控制(左右移动和旋转90,180,270度)这些骨牌直到下落到场地底部,锁定

View File

@@ -230,17 +230,6 @@ do--SCS(spinCenters)
}
end
do--BLOCKS
local function RotCW(B)
local N={}
local r,c=#B,#B[1]--row,col
for x=1,c do
N[x]={}
for y=1,r do
N[x][y]=B[y][c-x+1]
end
end
return N
end
local O,_=true,false
BLOCKS={
--Tetramino
@@ -282,20 +271,58 @@ do--BLOCKS
--Dot
{{O}}, --O1
}
local function RotCW(B)
local N={}
local r,c=#B,#B[1]--row,col
for x=1,c do
N[x]={}
for y=1,r do
N[x][y]=B[y][c-x+1]
end
end
return N
end
for i=1,#BLOCKS do
local B=BLOCKS[i]
BLOCKS[i]={[0]=B}
B=RotCW(B)BLOCKS[i][1]=B
B=RotCW(B)BLOCKS[i][2]=B
B=RotCW(B)BLOCKS[i][3]=B
for j=1,3 do
B=RotCW(B)
BLOCKS[i][j]=B
end
end
end
rankColor={
COLOR.dRed, --D
COLOR.dOrange, --C
COLOR.lYellow, --B
COLOR.lBlue, --A
COLOR.lCyan, --S
COLOR.lGreen, --Special
{.6,.3,.3},
{.7,.5,.3},
{.9,.7,.5},
{.6,.9,1},
{.95,.95,.5},
}
minoColor={
COLOR.red,
COLOR.fire,
COLOR.orange,
COLOR.yellow,
COLOR.lame,
COLOR.grass,
COLOR.green,
COLOR.water,
COLOR.cyan,
COLOR.sky,
COLOR.sea,
COLOR.blue,
COLOR.purple,
COLOR.grape,
COLOR.magenta,
COLOR.pink,
COLOR.dGrey,
COLOR.black,
COLOR.lYellow,
COLOR.grey,
COLOR.lGrey,
COLOR.dPurple,
COLOR.dRed,
COLOR.dGreen,
}

View File

@@ -1,21 +1,21 @@
return{
{name="sprint_10l", x=0, y=0, size=40,shape=1,icon="sprint", unlock={"sprint_20l","sprint_40l"}},
{name="sprint_20l", x=-200, y=0, size=50,shape=1,icon="sprint"},
{name="sprint_40l", x=0, y=-300, size=40,shape=1,icon="sprint", unlock={"dig_10l","sprint_100l","marathon_n","sprintPenta","sprintMPH"}},
{name="sprint_100l", x=-200, y=-200, size=50,shape=1,icon="sprint", unlock={"sprint_400l","drought_n"}},
{name="sprint_400l", x=-400, y=-200, size=40,shape=1,icon="sprint", unlock={"sprint_1000l"}},
{name="sprint_1000l", x=-600, y=-200, size=40,shape=1,icon="sprint"},
{name="sprint_10l", x=0, y=0, size=40,shape=1,icon="sprint1", unlock={"sprint_20l","sprint_40l"}},
{name="sprint_20l", x=-200, y=0, size=50,shape=1,icon="sprint1"},
{name="sprint_40l", x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={"dig_10l","sprint_100l","marathon_n","sprintPenta","sprintMPH"}},
{name="sprint_100l", x=-200, y=-200, size=50,shape=1,icon="sprint2", unlock={"sprint_400l","drought_n"}},
{name="sprint_400l", x=-400, y=-200, size=40,shape=1,icon="sprint3", unlock={"sprint_1000l"}},
{name="sprint_1000l", x=-600, y=-200, size=40,shape=1,icon="sprint3"},
{name="sprintPenta", x=210, y=-370, size=40,shape=3,icon="sprint"},
{name="sprintMPH", x=210, y=-230, size=40,shape=3,icon="sprint"},
{name="sprintPenta", x=210, y=-370, size=40,shape=3,icon="tech"},
{name="sprintMPH", x=210, y=-230, size=40,shape=3,icon="tech"},
{name="drought_n", x=-400, y=0, size=40,shape=1,icon="noI", unlock={"drought_l"}},
{name="drought_n", x=-400, y=0, size=40,shape=1,icon="drought", unlock={"drought_l"}},
{name="drought_l", x=-600, y=0, size=40,shape=1,icon="mess"},
{name="dig_10l", x=-200, y=-400, size=40,shape=1,icon="dig", unlock={"dig_40l"}},
{name="dig_40l", x=-400, y=-400, size=40,shape=1,icon="dig", unlock={"dig_100l"}},
{name="dig_100l", x=-600, y=-400, size=40,shape=1,icon="dig", unlock={"dig_400l"}},
{name="dig_400l", x=-800, y=-200, size=40,shape=1,icon="dig"},
{name="dig_10l", x=-200, y=-400, size=40,shape=1,icon="dig_sprint", unlock={"dig_40l"}},
{name="dig_40l", x=-400, y=-400, size=40,shape=1,icon="dig_sprint", unlock={"dig_100l"}},
{name="dig_100l", x=-600, y=-400, size=40,shape=1,icon="dig_sprint", unlock={"dig_400l"}},
{name="dig_400l", x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
{name="marathon_n", x=0, y=-600, size=60,shape=1,icon="marathon",unlock={"marathon_h","rhythm_e","solo_e","round_e","blind_e","classic_fast","survivor_e","bigbang","zen"}},
{name="marathon_h", x=0, y=-800, size=50,shape=1,icon="marathon",unlock={"master_beginner"}},
@@ -26,12 +26,12 @@ return{
{name="solo_l", x=-1200,y=-1000,size=40,shape=1,icon="solo", unlock={"solo_u"}},
{name="solo_u", x=-1400,y=-1000,size=40,shape=1,icon="solo"},
{name="techmino49_e", x=-1100,y=-1200,size=40,shape=1,icon="royale", unlock={"techmino49_h","techmino99_e"}},
{name="techmino49_h", x=-1100,y=-1400,size=40,shape=1,icon="royale", unlock={"techmino49_u"}},
{name="techmino49_u", x=-1100,y=-1600,size=40,shape=1,icon="royale"},
{name="techmino99_e", x=-1300,y=-1400,size=40,shape=1,icon="royale", unlock={"techmino99_h"}},
{name="techmino99_h", x=-1300,y=-1600,size=40,shape=1,icon="royale", unlock={"techmino99_u"}},
{name="techmino99_u", x=-1300,y=-1800,size=40,shape=1,icon="royale"},
{name="techmino49_e", x=-1100,y=-1200,size=40,shape=1,icon="t49", unlock={"techmino49_h","techmino99_e"}},
{name="techmino49_h", x=-1100,y=-1400,size=40,shape=1,icon="t49", unlock={"techmino49_u"}},
{name="techmino49_u", x=-1100,y=-1600,size=40,shape=1,icon="t49"},
{name="techmino99_e", x=-1300,y=-1400,size=40,shape=1,icon="t99", unlock={"techmino99_h"}},
{name="techmino99_h", x=-1300,y=-1600,size=40,shape=1,icon="t99", unlock={"techmino99_u"}},
{name="techmino99_u", x=-1300,y=-1800,size=40,shape=1,icon="t99"},
{name="round_e", x=-600, y=-800, size=40,shape=1,icon="round", unlock={"round_n"}},
{name="round_n", x=-800, y=-800, size=40,shape=1,icon="round", unlock={"round_h"}},
@@ -43,20 +43,20 @@ return{
{name="master_advance", x=0, y=-1200,size=40,shape=3,icon="master", unlock={"master_final","GM","master_phantasm"}},
{name="master_final", x=0, y=-1600,size=40,shape=2,icon="master"},
{name="master_phantasm",x=-150, y=-1500,size=40,shape=2,icon="master"},
{name="GM", x=150, y=-1500,size=40,shape=2,icon="master"},
{name="GM", x=150, y=-1500,size=40,shape=2,icon="gm"},
{name="rhythm_e", x=-350, y=-1000,size=40,shape=1,icon="rhythm", unlock={"rhythm_h"}},
{name="rhythm_h", x=-350, y=-1200,size=40,shape=3,icon="rhythm", unlock={"rhythm_u"}},
{name="rhythm_u", x=-350, y=-1400,size=40,shape=2,icon="rhythm"},
{name="blind_e", x=150, y=-700, size=40,shape=1,icon="blind", unlock={"blind_n"}},
{name="blind_n", x=150, y=-800, size=40,shape=1,icon="blind", unlock={"blind_h"}},
{name="blind_h", x=150, y=-900, size=35,shape=1,icon="blind", unlock={"blind_l"}},
{name="blind_l", x=150, y=-1000,size=35,shape=3,icon="blind", unlock={"blind_u"}},
{name="blind_u", x=150, y=-1100,size=35,shape=3,icon="blind", unlock={"blind_wtf"}},
{name="blind_wtf", x=150, y=-1200,size=35,shape=2,icon="blind"},
{name="blind_e", x=150, y=-700, size=40,shape=1,icon="hidden", unlock={"blind_n"}},
{name="blind_n", x=150, y=-800, size=40,shape=1,icon="hidden", unlock={"blind_h"}},
{name="blind_h", x=150, y=-900, size=35,shape=1,icon="hidden", unlock={"blind_l"}},
{name="blind_l", x=150, y=-1000,size=35,shape=3,icon="hidden", unlock={"blind_u"}},
{name="blind_u", x=150, y=-1100,size=35,shape=3,icon="hidden", unlock={"blind_wtf"}},
{name="blind_wtf", x=150, y=-1200,size=35,shape=2,icon="hidden"},
{name="classic_fast", x=-150, y=-950,size=40,shape=2,icon="classic"},
{name="classic_fast", x=-150, y=-950, size=40,shape=2,icon="classic"},
{name="survivor_e", x=300, y=-600, size=40,shape=1,icon="survivor",unlock={"survivor_n"}},
{name="survivor_n", x=500, y=-600, size=40,shape=1,icon="survivor",unlock={"survivor_h","attacker_h","defender_n","dig_h"}},
@@ -64,21 +64,21 @@ return{
{name="survivor_l", x=900, y=-600, size=40,shape=3,icon="survivor",unlock={"survivor_u"}},
{name="survivor_u", x=1100, y=-600, size=40,shape=2,icon="survivor"},
{name="attacker_h", x=300, y=-800, size=40,shape=1,icon="attacker",unlock={"attacker_u"}},
{name="attacker_u", x=300, y=-1000,size=40,shape=1,icon="attacker"},
{name="attacker_h", x=300, y=-800, size=40,shape=1,icon="attack", unlock={"attacker_u"}},
{name="attacker_u", x=300, y=-1000,size=40,shape=1,icon="attack"},
{name="defender_n", x=500, y=-800, size=40,shape=1,icon="defender",unlock={"defender_l"}},
{name="defender_l", x=500, y=-1000,size=40,shape=1,icon="defender"},
{name="defender_n", x=500, y=-800, size=40,shape=1,icon="defend", unlock={"defender_l"}},
{name="defender_l", x=500, y=-1000,size=40,shape=1,icon="defend"},
{name="dig_h", x=700, y=-800, size=40,shape=1,icon="dig", unlock={"dig_u"}},
{name="dig_u", x=700, y=-1000,size=40,shape=1,icon="dig"},
{name="bigbang", x=400, y=-400, size=50,shape=1,icon="bigbang", unlock={"c4wtrain_n","pctrain_n","tech_n"}},
{name="c4wtrain_n", x=700, y=-400, size=40,shape=1,icon="c4wtrain",unlock={"c4wtrain_l"}},
{name="c4wtrain_l", x=900, y=-400, size=40,shape=1,icon="c4wtrain"},
{name="c4wtrain_n", x=700, y=-400, size=40,shape=1,icon="pc",unlock={"c4wtrain_l"}},
{name="c4wtrain_l", x=900, y=-400, size=40,shape=1,icon="pc"},
{name="pctrain_n", x=700, y=-220, size=40,shape=1,icon="pctrain", unlock={"pctrain_l","pc_n"}},
{name="pctrain_l", x=900, y=-220, size=40,shape=1,icon="pctrain"},
{name="pctrain_n", x=700, y=-220, size=40,shape=1,icon="pc", unlock={"pctrain_l","pc_n"}},
{name="pctrain_l", x=900, y=-220, size=40,shape=1,icon="pc"},
{name="pc_n", x=800, y=-100, size=40,shape=1,icon="pc", unlock={"pc_h"}},
{name="pc_h", x=1000, y=-100, size=40,shape=3,icon="pc", unlock={"pc_l"}},
@@ -101,7 +101,7 @@ return{
{name="zen", x=-800, y=-600, size=40,shape=1,icon="zen", unlock={"ultra","infinite","infinite_dig"}},
{name="ultra", x=-1000,y=-400, size=40,shape=1,icon="ultra"},
{name="infinite", x=-800, y=-400, size=40,shape=1,icon="infinite"},
{name="infinite_dig", x=-1000,y=-600, size=40,shape=1,icon="infinite"},
{name="infinite_dig", x=-1000,y=-600, size=40,shape=1,icon="dig"},
{name="sprintFix"},
{name="sprintLock"},

View File

@@ -24,7 +24,7 @@ return{
dropPiece=score,
task=function(P)
while true do
coroutine.yield()
YIELD()
if P.stat.time>=53.5 then
P.modeData.point=min(P.modeData.point+16,80)
P.modeData.event=sectionName[int(P.modeData.point*.1)+1]

View File

@@ -7,7 +7,7 @@ return{
pushSpeed=2,
task=function(P)
while true do
coroutine.yield()
YIELD()
if P.control and SCN.cur=="play"and P.atkBuffer.sum==0 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
@@ -49,7 +49,7 @@ return{
mText(drawableText.nextWave,69,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.event

View File

@@ -6,7 +6,7 @@ return{
freshLimit=15,
task=function(P)
while true do
coroutine.yield()
YIELD()
if P.control and SCN.cur=="play"and P.atkBuffer.sum<4 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
@@ -60,7 +60,7 @@ return{
mText(drawableText.nextWave,69,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.event

View File

@@ -21,7 +21,7 @@ return{
mStr(P.stat.clears[4],69,340)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -27,7 +27,7 @@ return{
gc.draw(IMG.electric,124,106,0,2.6)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -28,7 +28,7 @@ return{
gc.draw(IMG.electric,124,106,0,2.6)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -24,7 +24,7 @@ return{
gc.draw(IMG.electric,124,106,0,2.6)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -27,7 +27,7 @@ return{
gc.draw(IMG.electric,124,106,0,2.6)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -56,7 +56,7 @@ return{
mStr(P.stat.clears[4],69,340)
end,
score=function(P)return{min(P.stat.row,40),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -60,7 +60,7 @@ return{
mText(drawableText.maxcmb,69,450)
end,
score=function(P)return{min(P.modeData.point,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Combo "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.modeData.point

View File

@@ -58,7 +58,7 @@ return{
mText(drawableText.maxcmb,69,450)
end,
score=function(P)return{min(P.modeData.point,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Combo "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -57,12 +57,12 @@ return{
mStr(P.stat.row,69,225)
mText(drawableText.line,69,290)
if P.modeData.event==0 then
local m=puzzleMark
local mark=TEXTURE.puzzleMark
local F=FIELD[P.modeData.point+1]
for y=1,20 do for x=1,10 do
local T=F[y][x]
if T~=0 then
gc.draw(m[T],150+30*x-30+dx,600-30*y+dy)
gc.draw(mark[T],150+30*x-30+dx,600-30*y+dy)
end
end end
end

View File

@@ -9,7 +9,7 @@ return{
pushSpeed=2,
task=function(P)
while true do
coroutine.yield()
YIELD()
if P.control and SCN.cur=="play"then
local D=P.modeData
D.counter=D.counter+1
@@ -55,7 +55,7 @@ return{
mText(drawableText.rpm,69,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.event

View File

@@ -9,7 +9,7 @@ return{
pushSpeed=1,
task=function(P)
while true do
coroutine.yield()
YIELD()
if P.control and SCN.cur=="play"then
local D=P.modeData
D.counter=D.counter+1
@@ -55,7 +55,7 @@ return{
mText(drawableText.rpm,69,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.event

View File

@@ -27,7 +27,7 @@ return{
mStr(100-P.stat.dig,69,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<100 then return end

View File

@@ -24,7 +24,7 @@ return{
mStr(10-P.stat.dig,69,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<10 then return end

View File

@@ -27,7 +27,7 @@ return{
mStr(400-P.stat.dig,69,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<400 then return end

View File

@@ -27,7 +27,7 @@ return{
mStr(40-P.stat.dig,69,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<40 then return end

View File

@@ -6,7 +6,7 @@ return{
freshLimit=15,
task=function(P)
while true do
coroutine.yield()
YIELD()
if P.control and SCN.cur=="play"then
local D=P.modeData
D.counter=D.counter+1

View File

@@ -5,7 +5,7 @@ return{
freshLimit=15,
task=function(P)
while true do
coroutine.yield()
YIELD()
if P.control and SCN.cur=="play"then
local D=P.modeData
D.counter=D.counter+1

View File

@@ -107,15 +107,15 @@ return{
mStr(R>=0 and R or 0,69,265)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=100 then
local T=P.stat.time
return
T<=100 and 5 or
T<=120 and 4 or
T<=110 and 5 or
T<=126 and 4 or
T<=160 and 3 or
T<=240 and 2 or
1

View File

@@ -21,7 +21,7 @@ return{
mStr(R>=0 and R or 0,69,265)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -33,7 +33,7 @@ return{
infHold=true,
dropPiece=check_rise,
pushSpeed=1.2,
bg="wing",bgm="infinite",
bg="wing",bgm="dream",
},
load=function()
PLY.newPlayer(1)

View File

@@ -6,7 +6,7 @@ return{
env={
noTele=true,
wait=8,fall=20,
target=10,dropPiece=function (P)
target=10,dropPiece=function(P)
if P.combo>1 or P.b2b>0 or P.lastPiece.row>1 then
if P.combo>1 then P:showText("2x",0,-220,40,"flicker",.3)end
if P.b2b>0 then P:showText("spin",0,-160,40,"flicker",.3)end

View File

@@ -37,7 +37,7 @@ return{
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -33,7 +33,7 @@ return{
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row

View File

@@ -63,7 +63,7 @@ return{
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,

View File

@@ -65,7 +65,7 @@ return{
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,

View File

@@ -62,7 +62,7 @@ return{
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local S=P.modeData.point

Some files were not shown because too many files have changed in this diff Show More