Compare commits

...

55 Commits

Author SHA1 Message Date
MrZ_26
a7a2124bb6 版本推进 2022-01-20 13:27:23 +08:00
sakurw
9399938be0 Update lang_ja.lua (#616) 2022-01-20 13:10:39 +08:00
C₂₉H₂₅N₃O₅
195f9b2c46 字体格式转换为OTF (#615)
* 字体格式转换为OTF

**HERE COMES THE OPENTYPE**
* 更改几个自定义图标的样式
2022-01-20 13:10:11 +08:00
C₂₉H₂₅N₃O₅
d7546e5f41 更新英文说明书 (#614) 2022-01-20 01:39:21 +08:00
NOT_A_ROBOT
888909b48c Re-add classic_l (#612) 2022-01-19 23:46:36 +08:00
MrZ_26
d68f732884 重写说明书的攻击和b2b点数段落,英文和日文需要重翻 2022-01-19 23:43:08 +08:00
MrZ_26
5243ed0c6b 再整理落块后结算顺序 2022-01-19 23:04:46 +08:00
MrZ_26
856c490a2b 再修正master_g的一些细节 2022-01-19 20:02:30 +08:00
MrZ_26
5e9dcc27aa 再更新所有的音效文件 2022-01-19 19:46:27 +08:00
NOT_A_ROBOT
3f129a9585 Fix crash bug on graded master when reaching a very high internal grade 2 (#611)
* Fix crash bug on graded master when reaching a very high internal grade 2
2022-01-19 19:45:59 +08:00
MrZ_26
e682ff1de5 提前修改好更新历史和版本号 2022-01-19 18:46:40 +08:00
MrZ_26
2c064d5809 修复倒计时时不能充das close #610 2022-01-19 18:43:08 +08:00
MrZ_26
e0573382e8 更新manual关于攻击系统的说明 2022-01-19 18:38:57 +08:00
MrZ_26
5a514ce495 修正master_g的规则 2022-01-19 18:10:15 +08:00
MrZ_26
ba4fb00c85 版本推进 2022-01-19 03:51:53 +08:00
MrZ_26
ab02d2063f 修正刚刚合并的日文翻译pr的相关小问题,可以用了 2022-01-19 03:50:07 +08:00
MrZ_26
a6c87d3a1a 替换一处缩进为空格 2022-01-19 03:48:07 +08:00
MrZ_26
f15541db4a master_g模式的cool和regret强制使用英文 2022-01-19 03:48:07 +08:00
Airun
dadd09d25a Done with manual_jp.txt (#605)
* Added draft for jp files (editing)

* Manual_JP.txt Done
2022-01-19 03:47:28 +08:00
C₂₉H₂₅N₃O₅
a7dea4dafe 紧急更新字体 (#606)
* 麻将字符采用立直麻将式命名

* 补上两个缺少的符号
2022-01-19 03:47:10 +08:00
MrZ_26
34ac5eed93 版本推进 2022-01-19 02:43:08 +08:00
MrZ_26
89134d4f07 整理刚增加的模式的代码 2022-01-19 02:43:08 +08:00
NOT_A_ROBOT
58d068b776 Add graded Master mode (#594) 2022-01-19 02:21:34 +08:00
NOT_A_ROBOT
dacefb2b01 classic_h 0.5G now starts on lvl19 (#601)
resolves #598
2022-01-15 22:28:37 +08:00
MrZ_26
efe4f5a210 版本推进 2022-01-15 19:36:26 +08:00
MrZ_26
000188ac86 修正pc是特殊消除但还是会扣因为最后是普通消除的b2b点数 2022-01-15 17:09:17 +08:00
MrZ_26
de6814bd34 修正说明书攻击系统一处顺序问题 2022-01-15 17:07:27 +08:00
MrZ_26
fac020db8c 新增一个赞助者 2022-01-15 15:51:12 +08:00
MrZ_26
d4ec3eefbb 控制台#代码环境微调 2022-01-14 01:02:57 +08:00
MrZ_26
d43e58f450 跟进调整GC模块用法 2022-01-14 01:02:40 +08:00
MrZ_26
6e9bf97d89 更新框架 2022-01-14 01:01:04 +08:00
MrZ_26
e41aefd17c 再更新staff表的翻译人员 2022-01-12 16:56:45 +08:00
MrZ_26
d96c5ca0fa 修改mini方块的实现 2022-01-12 16:24:18 +08:00
MrZ_26
4953abbb8c 更新字体
Co-authored-by: C₂₉H₂₅N₃O₅ <cgu52@wisc.edu>
2022-01-12 13:06:56 +08:00
MrZ_26
637e1a7602 staff表添加一个翻译人员 2022-01-12 12:43:33 +08:00
MrZ_26
55cc3c48be 更新日语翻译
Co-authored-by: YL3383
2022-01-12 12:43:28 +08:00
Airun
d7d9e60b1e Update lang_ja.lua (#592)
Little Fixes
2022-01-10 18:08:45 +08:00
MrZ_26
61218bb942 微调一些语言相关 2022-01-09 18:04:12 +08:00
MrZ_26
d24888cff5 加载完成后也会更新保存一下统计数据 2022-01-08 20:08:49 +08:00
MrZ_26
79cf1cf238 游戏服务器域名设置移到main最后 2022-01-07 18:17:22 +08:00
MrZ_26
1aa0d4927f 版本推进 2022-01-06 17:42:19 +08:00
MrZ_26
59ded87cee 框架跟进 2022-01-06 17:38:11 +08:00
C₂₉H₂₅N₃O₅
6496dc824c 麻将字符采用立直麻将式命名 (#587) 2022-01-06 17:36:59 +08:00
Airun
6c7aff8fd5 Update lang_ja.lua (#590)
Co-authored-by: MrZ_26 <1046101471@qq.com>
2022-01-06 17:35:58 +08:00
sakurw
ed171186a3 Update lang_ja.lua (#589) 2022-01-06 17:32:01 +08:00
MrZ_26
e3a1c9114a 超级消除也会增加b2b点数了 close #585 2022-01-05 22:59:23 +08:00
MrZ_26
4ba05ae80c 暴力修复回合制开关玩家控制的问题(开始摆烂,准备重构) 2022-01-05 19:58:19 +08:00
C₂₉H₂₅N₃O₅
30a700d0be 更新法律信息 (#584)
* 修改日语文件的小错误

* 新增麻将字符 and more

* 字体新增麻将字符
* 字体加入自动hint
* 微调几个表情包

* 更新法律信息

* 更新一个标点符号小问题
2022-01-05 19:39:34 +08:00
NOT_A_ROBOT
d2ba8b5aa9 Add Mono+do+trimino sprint mode (#578) 2022-01-05 14:35:25 +08:00
NOT_A_ROBOT
db17575ca3 Revert commit 58b8f354e0 (#577) 2022-01-05 14:34:40 +08:00
MrZ626
a0596acfde 修改安卓版本号 2022-01-05 14:33:18 +08:00
MrZ626
6954ed06a6 修复主菜单开关全屏会让快速开始按钮文本错误 close #566 2022-01-05 14:31:36 +08:00
Imple Lee
00919c1067 cc techmino-alize (#579)
this should only be used with imple/techmino-alize branch
on 26F-Studio/cold_clear_ai_love2d_wrapper
2022-01-05 12:57:54 +08:00
NOT_A_ROBOT
ceb77e46c3 Fix some spelling/grammar mistakes on Console app (#576) 2022-01-05 12:51:16 +08:00
Trebor Huang
ae15281db0 Allow Zframework to be checked out (#580)
* Allow checkout Zframework

* Propagate changes to all workflows

* Fix indentation

* Decide to be `recursive`

* Remove unnecessary checkouts

* Remove unnecessary recursive checkouts
2022-01-05 12:50:43 +08:00
98 changed files with 2560 additions and 613 deletions

View File

@@ -4,7 +4,6 @@ description: 'Check for obvious errors.'
runs:
using: "composite"
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/build-love
with:
file-path: Techmino.love
@@ -21,4 +20,4 @@ runs:
uses: GabrielBB/xvfb-action@v1
with:
run: |
./dest/love Techmino.love --test
./dest/love Techmino.love --test

View File

@@ -31,6 +31,8 @@ jobs:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/automatic-test
build-windows:
@@ -38,6 +40,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -60,6 +64,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -78,6 +84,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -103,6 +111,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -131,6 +141,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -159,6 +171,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -192,6 +206,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-love
with:

View File

@@ -41,6 +41,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-windows
with:
@@ -62,6 +64,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-windows
with:
@@ -83,6 +87,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-linux
with:
@@ -99,6 +105,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-android
with:
@@ -121,6 +129,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-macos
with:
@@ -148,6 +158,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-ios
with:

View File

@@ -33,6 +33,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -55,6 +57,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -73,6 +77,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -98,6 +104,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
@@ -125,6 +133,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}

4
.gitmodules vendored
View File

@@ -1,3 +1,3 @@
[submodule "Zframework"]
path = Zframework
url = git@github.com:26F-Studio/Zframework.git
path = Zframework
url = git@github.com:26F-Studio/Zframework.git

View File

@@ -1,4 +1,4 @@
TECHMINO © 2019-2021 26F Studio. Some rights reserved.
TECHMINO © 20192022 26F Studio. Some rights reserved.
TECHMINO and "26F Studio" are trademarks of 26F Studio. The TECHMINO game and source code are under a GNU Lesser General Public License Version 3.
@@ -6,13 +6,13 @@ TECHMINO and "26F Studio" are trademarks of 26F Studio. The TECHMINO game and so
"Tetris" is the registered trademark of The Tetris Holding, LLC, licensed to The Tetris Company, Inc. TECHMINO is not a fan game of Tetris. TECHMINO and 26F Studio are not affiliated with Tetris Holding, LLC or The Tetris Company, Inc. in any way.
Powered by LÖVE, © 2006-2021 LÖVE Development Team.
Powered by LÖVE, © 20062022 LÖVE Development Team.
Lua is free software distributed under the terms of the MIT license. Copyright © 1994-2021 by Lua.org, PUC-Rio.
Lua is free software distributed under the terms of the MIT license. Copyright © 19942022 by Lua.org, PUC-Rio.
SIMPLE LOVE LIGHTS is under a MIT License. Created by Dylan Hunn.
json.lua is copyrighted by rxi. © 2021 rxi.
json.lua is copyrighted by rxi. © 2022 rxi.
IBM Plex is copyrighted by the International Business Machines Corporation. IBM and IBM Plex are trademarks of IBM Corp, registered in many jurisdictions worldwide. IBM Plex is licensed under the SIL Open Font License, Version 1.1.
@@ -23,7 +23,7 @@ Source Han Sans is copyrighted by Adobe Inc. Source Han Sans and Adobe are regis
JetBrains Mono is copyrighted by the JetBrains Mono Project authors. JetBrains Mono is a trademark of JetBrains s.r.o. JetBrains Mono is licensed under the SIL Open Font License, Version 1.1.
"PlayStation", "PS", "PlayStation Family Mark", "PS logo", "DualSense" and "Play Has No Limits" are registered trademarks or trademarks of Sony Interactive Entertainment Inc. "SONY" is a registered trademark of Sony Corporation. © 2021 Sony Interactive Entertainment LLC.
"PlayStation", "PS", "PlayStation Family Mark", "PS logo", "DualSense" and "Play Has No Limits" are registered trademarks or trademarks of Sony Interactive Entertainment Inc. "SONY" is a registered trademark of Sony Corporation. © 2022 Sony Interactive Entertainment LLC.
"Windows", the Windows logo, "Xbox", Xbox logo, and "Microsoft" are registered trademarks of Microsoft Corporation in the United States of America and other countries or regions.
@@ -32,20 +32,20 @@ JetBrains Mono is copyrighted by the JetBrains Mono Project authors. JetBrains M
The Apple logo, "Apple Inc.," iOS, iPadOS, macOS, iPhone, and Mac are registered trademarks of Apple Inc. in the United States of America and other countries or regions.
"EA" and "Electronic Arts" are registered trademarks of Electronic Arts Inc. © 2021 Electronic Arts Inc.
"EA" and "Electronic Arts" are registered trademarks of Electronic Arts Inc. © 2022 Electronic Arts Inc.
SEGA and the SEGA logo are registered trademarks of Sega Corporation. © 2021 Sega Corporation.
SEGA and the SEGA logo are registered trademarks of Sega Corporation. © 2022 Sega Corporation.
Oculus Quest is a registered trademark of Facebook Technologies, LLC. © Meta Platforms, Inc.
"Nintendo" is a registered trademarks of Nintendo Co., Ltd. © 2021 Nintendo Co., Ltd.
"Nintendo" is a registered trademarks of Nintendo Co., Ltd. © 2022 Nintendo Co., Ltd.
N3TWORK is a registered trademark of N3TWORK Inc. © 2021 N3TWORK Inc.
N3TWORK is a registered trademark of N3TWORK Inc. © 2022 N3TWORK Inc.
GoldWave is a registered trademark of GoldWave, Inc.
Linux is a registered trademark of Linus Torvalds.
Touhou Project © Team Shanghai Alice 2002-2021.
Touhou Project © Team Shanghai Alice 20022022.
All other trademarks, logos, and copyrights are the properties of their respective owners.

View File

@@ -51,8 +51,8 @@ local _LOADTIME_=TIME()
--Load modules
Z=require'Zframework'
FONT.load{
norm='parts/fonts/proportional.ttf',
mono='parts/fonts/monospaced.ttf',
norm='parts/fonts/proportional.otf',
mono='parts/fonts/monospaced.otf',
}
FONT.setDefault('norm')
FONT.setFallback('norm')
@@ -159,7 +159,7 @@ do--Z.setCursor
_=BLOCK_COLORS[SETTING.skin[R]]
gc_setColor(_[1],_[2],_[3],min(abs(1-time%2),.3))
_=DSCP[R][0]
gc_draw(TEXTURE.miniBlock[R],x,y,time%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5)
gc_draw(TEXTURE.miniBlock[R],x,y,time%3.14159265359*4,8,8,2*_[2]+1,2*(#BLOCKS[R][0]-_[1])-1)
gc_setColor(1,1,1)
gc_draw(ms.isDown(1)and holdImg or normImg,x,y,nil,nil,nil,8,8)
end
@@ -683,3 +683,4 @@ if TABLE.find(arg,'--test')then
love.event.quit(1)
end)
end
WS.switchHost('101.43.110.22','10026','/tech/socket/v1')

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -20,7 +20,7 @@ function back.update()
color=BLOCK_COLORS[SETTING.skin[r]],
x=SCR.w*rnd(),
y=SCR.h*-.05,
k=SCR.rad/100,
k=SCR.rad/200,
ang=rnd()*6.2832,
vy=.5+rnd()*.4,
vx=rnd()*.4-.2,

View File

@@ -47,7 +47,7 @@ function back.draw()
local M=mino[i]
local c=M.color
gc_setColor(c[1],c[2],c[3],.2)
gc_draw(M.block,M.d*cos(M.ang),M.d*sin(M.ang),M.rotate,(18*M.d/SCR.rad)^1.6,nil,M.block:getWidth()/2,M.block:getHeight()/2)
gc_draw(M.block,M.d*cos(M.ang),M.d*sin(M.ang),M.rotate,(12*M.d/SCR.rad)^1.6,nil,M.block:getWidth()/2,M.block:getHeight()/2)
end
gc_translate(-SCR.cx,-SCR.cy)
end

View File

@@ -6,7 +6,6 @@ local back={}
local t
local colorLib=BLOCK_COLORS
local blocks=BLOCKS
local scs=RSlist.TRS.centerPos
function back.init()
t=rnd()*2600
end
@@ -21,6 +20,6 @@ function back.draw()
end
local _=colorLib[SETTING.skin[R]]
gc.setColor(_[1],_[2],_[3],.12)
gc.draw(TEXTURE.miniBlock[R],SCR.cx,SCR.cy,t%3.1416*6,400*SCR.k,nil,scs[R][0][2]+.5,#blocks[R][0]-scs[R][0][1]-.5)
gc.draw(TEXTURE.miniBlock[R],SCR.cx,SCR.cy,t%3.1416*6,200*SCR.k,nil,2*DSCP[R][0][2]+1,2*(#blocks[R][0]-DSCP[R][0][1])-1)
end
return back

View File

@@ -58,6 +58,8 @@ function bot_cc:thread()
local m=rem(move,1)
if m<4 then
ins(keys,m+1)
elseif m==5 then
ins(keys, 5)
elseif not self.data._20G then
ins(keys,13)
end

View File

@@ -83,7 +83,7 @@ end
function BOT.new(P,data)
local bot={P=P,data=data}
if data.type=="CC"then
P:setRS('SRS')
P:setRS('TRS')
bot.keys={}
bot.bufferedNexts={}
bot.delay=data.delay

View File

@@ -213,89 +213,89 @@ local L={
psOption= 0xF01A5,
},
mahjong={--F0200~F027F
wan1= 0xF0200,
wan2= 0xF0201,
wan3= 0xF0202,
wan4= 0xF0203,
wan5= 0xF0204,
wan6= 0xF0205,
wan7= 0xF0206,
wan8= 0xF0207,
wan9= 0xF0208,
tiao1= 0xF0209,
tiao2= 0xF020A,
tiao3= 0xF020B,
tiao4= 0xF020C,
tiao5= 0xF020D,
tiao6= 0xF020E,
tiao7= 0xF020F,
tiao8= 0xF0210,
tiao9= 0xF0211,
tong1= 0xF0212,
tong2= 0xF0213,
tong3= 0xF0214,
tong4= 0xF0215,
tong5= 0xF0216,
tong6= 0xF0217,
tong7= 0xF0218,
tong8= 0xF0219,
tong9= 0xF021A,
east= 0xF021B,
south= 0xF021C,
west= 0xF021D,
north= 0xF021E,
center= 0xF021F,
fortune= 0xF0220,
soap= 0xF0221,
fortuneAlt= 0xF0222,
soapAlt= 0xF0223,
spring= 0xF0224,
summer= 0xF0225,
autumn= 0xF0226,
winter= 0xF0227,
plum= 0xF0228,
orchid= 0xF0229,
chry= 0xF022A,
bamboo= 0xF022B,
wan5Red= 0xF022C,
tiao5Red= 0xF022D,
tong5Red= 0xF022E,
wan1Base= 0xF022F,
wan2Base= 0xF0230,
wan3Base= 0xF0231,
wan4Base= 0xF0232,
wan5Base= 0xF0233,
wan6Base= 0xF0234,
wan7Base= 0xF0235,
wan8Base= 0xF0236,
wan9Base= 0xF0237,
wanComb= 0xF0238,
tiao1Base= 0xF0239,
tiao1Comb= 0xF023A,
tiao5Base= 0xF023B,
tiao5Comb= 0xF023C,
tiao7Base= 0xF023D,
tiao7Comb= 0xF023E,
tiao9Base= 0xF023F,
tiao9Comb= 0xF0240,
tong2Base= 0xF0241,
tong2Comb= 0xF0242,
tong3Base= 0xF0243,
tong3Comb1= 0xF0244,
tong3Comb2= 0xF0245,
tong4Base= 0xF0246,
tong4Comb= 0xF0247,
tong5Base= 0xF0248,
tong5Comb1= 0xF0249,
tong5Comb2= 0xF024A,
tong6Base= 0xF024B,
tong6Comb= 0xF024C,
tong7Base= 0xF024D,
tong7Comb= 0xF024E,
tong9Base= 0xF024F,
tong9Comb1= 0xF0250,
tong9Comb2= 0xF0251,
frameComb= 0xF0252,
m1= 0xF0200,
m2= 0xF0201,
m3= 0xF0202,
m4= 0xF0203,
m5= 0xF0204,
m6= 0xF0205,
m7= 0xF0206,
m8= 0xF0207,
m9= 0xF0208,
s1= 0xF0209,
s2= 0xF020A,
s3= 0xF020B,
s4= 0xF020C,
s5= 0xF020D,
s6= 0xF020E,
s7= 0xF020F,
s8= 0xF0210,
s9= 0xF0211,
p1= 0xF0212,
p2= 0xF0213,
p3= 0xF0214,
p4= 0xF0215,
p5= 0xF0216,
p6= 0xF0217,
p7= 0xF0218,
p8= 0xF0219,
p9= 0xF021A,
ton= 0xF021B,
nan= 0xF021C,
sha= 0xF021D,
pe= 0xF021E,
chun= 0xF021F,
hatsu= 0xF0220,
haku= 0xF0221,
hatsuAlt= 0xF0222,
hakuAlt= 0xF0223,
haru= 0xF0224,
natsu= 0xF0225,
aki= 0xF0226,
fuyu= 0xF0227,
ume= 0xF0228,
ran= 0xF0229,
kiku= 0xF022A,
take= 0xF022B,
m5Red= 0xF022C,
s5Red= 0xF022D,
p5Red= 0xF022E,
m1Base= 0xF022F,
m2Base= 0xF0230,
m3Base= 0xF0231,
m4Base= 0xF0232,
m5Base= 0xF0233,
m6Base= 0xF0234,
m7Base= 0xF0235,
m8Base= 0xF0236,
m9Base= 0xF0237,
mComb= 0xF0238,
s1Base= 0xF0239,
s1Comb= 0xF023A,
s5Base= 0xF023B,
s5Comb= 0xF023C,
s7Base= 0xF023D,
s7Comb= 0xF023E,
s9Base= 0xF023F,
s9Comb= 0xF0240,
p2Base= 0xF0241,
p2Comb= 0xF0242,
p3Base= 0xF0243,
p3Comb1= 0xF0244,
p3Comb2= 0xF0245,
p4Base= 0xF0246,
p4Comb= 0xF0247,
p5Base= 0xF0248,
p5Comb1= 0xF0249,
p5Comb2= 0xF024A,
p6Base= 0xF024B,
p6Comb= 0xF024C,
p7Base= 0xF024D,
p7Comb= 0xF024E,
p9Base= 0xF024F,
p9Comb1= 0xF0250,
p9Comb2= 0xF0251,
frameComb= 0xF0252,
}
}

View File

@@ -38,7 +38,7 @@ return{
local D=P.modeData
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
if P.stat.row>=D.target then
if D.target==110 then
if D.target==100 then
P.gameEnv.drop,P.gameEnv.lock=2,2
P.gameEnv.sddas,P.gameEnv.sdarr=2,2
SFX.play('warn_1')

View File

@@ -0,0 +1,38 @@
return{
das=16,arr=6,
sddas=2,sdarr=2,
irs=false,ims=false,
drop=2,
lock=2,
wait=10,
fall=25,
freshLimit=0,
fieldH=19,
nextCount=1,holdCount=0,
RS='Classic',
sequence='rnd',
noTele=true,
keyCancel={5,6},
mesDisp=function(P)
setFont(75)
local r=P.modeData.target*.1
mStr(r<11 and 19 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
mText(drawableText.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
end,
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
local D=P.modeData
if P.stat.row>=D.target then
D.target=D.target+10
if D.target==200 then
P.gameEnv.drop,P.gameEnv.lock=1,1
SFX.play('blip_1')
else
SFX.play('reach')
end
end
end,
}

View File

@@ -0,0 +1,296 @@
local gc=love.graphics
local regretDelay=-1
local int_grade=0
local grade_points=0
local int_grade_boosts={0,1,2,3,4,5,5,6,6,7,7,7,8,8,8,9,9,9,10,11,12,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26}
local gradeList={
"9","8","7","6","5","4","3","2","1",
"S1","S2","S3","S4","S5","S6","S7","S8","S9",
"m1","m2","m3","m4","m5","m6","m7","m8","m9",
"M","MK","MV","MO","MM-","MM","MM+","GM-","GM","GM+","TM-","TM","TM+"
}
local spd_lvl=0
local cools=0
local regrets=0
local prevSectTime=0
local isInRoll=false
local rollGrades=0
local cool_time={3120,3120,2940,2700,2700,2520,2520,2280,2280,0}
local reg_time= {5400,4500,4500,4080,3600,3600,3000,3000,3000,3000}
local prevDrop70=false --determines if previous piece has level less than __70
local nextSpeedUp=false --determines if the next section speed should be boosted by 100
local isInRollTrans=false
local function getGrav(l)
return
l<30 and 64 or
l<35 and 43 or
l<40 and 32 or
l<50 and 26 or
l<60 and 21 or
l<70 and 16 or
l<80 and 8 or
l<90 and 6 or
l<120 and 4 or
l<160 and 3 or
l<200 and 2 or
l<220 and 64 or
l<230 and 8 or
l<233 and 4 or
l<236 and 3 or
l<243 and 2 or
l<300 and 1 or
l<360 and 0.5 or
l<450 and 0.25 or
0
end
local function getLock(l)
return
l<900 and 30 or
l<1100 and 19 or
15
end
local function getWait(l)
return
l<700 and 23 or
l<800 and 16 or
l<1000 and 12 or
l<1100 and 7 or
6
end
local function getFall(l)
return
l<500 and 25 or
l<600 and 18 or
l<700 and 12 or
l<800 and 8 or
4
end
local function getDas(l)
return
l<500 and 10 or
l<900 and 8 or
6
end
local function getGrade()
if int_grade==nil then int_grade=0 end
if rollGrades==nil then rollGrades=0 end
return gradeList[math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList)]
end
local function addGrade(row, cmb, lvl) -- IGS = internal grade system
if row<1 then return end
local pts=0
local cmb_mult=1.0
local lvl_mult=math.floor(lvl/250)+1
if row==1 then
pts=int_grade<5 and 10 or int_grade<10 and 5 or 2
cmb_mult=1.0
elseif row==2 then
pts=int_grade<3 and 20 or int_grade<6 and 15 or int_grade<10 and 10 or 12
cmb_mult=cmb==1 and 1 or cmb<4 and 1.2 or cmb<8 and 1.4 or cmb<10 and 1.5 or 2.0
elseif row==3 then
pts=int_grade==0 and 40 or int_grade<4 and 30 or int_grade<7 and 20 or int_grade<10 and 15 or 13
cmb_mult=cmb==1 and 1 or cmb<10 and 1+(cmb+2)*0.1 or 2
else
pts=int_grade==0 and 50 or int_grade<5 and 40 or 30
cmb_mult=cmb==1 and 1 or cmb==2 and 1.5 or cmb<6 and (0.2*cmb)+1.2 or cmb<10 and (0.1*cmb)+1.7 or 3
end
grade_points=grade_points+(pts*cmb_mult*lvl_mult)
if grade_points>=100 then
grade_points=0
int_grade=int_grade+1
end
end
return{
drop=64,
lock=30,
wait=23,
fall=25,
noTele=true,
das=16,arr=1,
minsdarr=1,
ihs=true,irs=true,ims=false,
RS='SRS_plus',
mesDisp=function(P)
gc.setColor(1,1,1,1)
setFont(45)
mText(TEXTOBJ.grade,63,180)
setFont(60)
mStr(getGrade(),63,110)
if isInRoll then
setFont(20)
mStr(("%.1f"):format(rollGrades),63,208)
gc.setLineWidth(2)
gc.setColor(.98,.98,.98,.8)
gc.rectangle('line',0,240,126,80,4)
gc.setColor(.98,.98,.98,.4)
gc.rectangle('fill',0+2,240+2,126-4,80-4,2)
setFont(45)
local t=(P.stat.frame-prevSectTime)/60
local T=("%.1f"):format(60-t)
gc.setColor(COLOR.dH)
mStr(T,65,250)
t=t/60
gc.setColor(1.7*t,2.3-2*t,.3)
mStr(T,63,248)
else
setFont(20)
mStr(grade_points,63,208)
setFont(45)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end
end,
hook_drop=function(P)
local D=P.modeData
local c=#P.clearedRow
if cools>8 and isInRoll then
rollGrades=rollGrades+(c==4 and 1 or 0.1*c)
return
elseif isInRoll then
rollGrades=rollGrades+(c==4 and 0.26 or 0.04*c)
return
end
if c==0 and D.pt+1>=D.target then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
addGrade(c,P.combo,D.pt)
D.pt=D.pt+s
spd_lvl=spd_lvl+1
P.gameEnv.drop=getGrav(spd_lvl)
if(P.gameEnv.drop==0) then
P:set20G(true)
end
if D.pt%100>70 and not prevDrop70 then
if P.stat.frame-prevSectTime < cool_time[math.ceil(D.pt/100)] then
cools=cools+1
P:_showText("COOL!",0,-120,80,'fly',.8)
nextSpeedUp=true
end
prevDrop70=true
end
if D.pt+1==D.target then
SFX.play('warn_1')
elseif D.pt>=D.target then--Level up!
spd_lvl=nextSpeedUp and spd_lvl+100 or spd_lvl
nextSpeedUp=false
prevDrop70=false
s=D.target/100
local E=P.gameEnv
E.lock=getLock(spd_lvl)
E.wait=getWait(spd_lvl)
E.fall=getFall(spd_lvl)
E.das=getDas(spd_lvl)
if P.stat.frame-prevSectTime > reg_time[math.ceil(s)] then
regrets=regrets+1
regretDelay=60
end
prevSectTime=P.stat.frame
if s==2 then
BG.set('rainbow')
elseif s==4 then
BG.set('rainbow2')
elseif s==5 then
if P.stat.frame>420*60 then
D.pt=500
P:win('finish')
return
else
BG.set('glow')
BGM.play('secret7th remix')
end
elseif s==6 then
BG.set('lightning')
elseif s>9 then
if cools>8 then
E.lockFX=E.lockFX>1 and 1 or E.lockFX
P:setInvisible(5)
else
P:setInvisible(300)
end
D.pt=999
P.waiting=240
BGM.stop()
isInRollTrans=true
return
end
D.target=D.target<900 and D.target+100 or 999
P:stageComplete(s)
SFX.play('reach')
end
end,
task=function(P)
regretDelay=-1
P.modeData.pt=0
P.modeData.target=100
int_grade=0
grade_points=0
rollGrades=0
spd_lvl=0
cools=0
regrets=0
prevSectTime=0
isInRoll=false
isInRollTrans=false
prevDrop70=false
nextSpeedUp=false
local decayRate={125,80,80,50,45,45,45,40,40,40,40,40,30,30,30,20,20,20,20,20,15,15,15,15,15,15,15,15,15,15,10,10,10,9,9,9,8,8,8,7,7,7,6}
local decayTimer=0
while true do
YIELD()
P.modeData.grade=getGrade()
P.modeData.gradePts=math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList)
if regretDelay>-1 then
regretDelay=regretDelay-1
if regretDelay==-1 then P:_showText("REGRET!!",0,-120,80,'beat',.8) end
end
if isInRollTrans then
if P.waiting>=220 then
--Make field invisible
for y=1,#P.field do for x=1,10 do
P.visTime[y][x]=P.waiting-220
end end
elseif P.waiting==190 then
TABLE.cut(P.field)
TABLE.cut(P.visTime)
elseif P.waiting==180 then
playReadySFX(3,3)
elseif P.waiting==120 then
playReadySFX(2,1)
elseif P.waiting==60 then
playReadySFX(1,1)
elseif P.waiting==1 then
playReadySFX(0,1)
isInRollTrans=false
isInRoll=true
BGM.play('hope')
BG.set('blockspace')
prevSectTime=P.stat.frame
end
end
if P.waiting<=0 and grade_points>0 and not isInRoll then
decayTimer=decayTimer+1
if decayTimer>=decayRate[math.min(int_grade+1,#decayRate)] then
decayTimer=0
grade_points=grade_points-1
end
elseif isInRoll and P.stat.frame>=prevSectTime+3600 then
rollGrades=rollGrades+(cools>8 and 1.6 or 0.5)
P:win('finish')
end
end
end,
}

View File

@@ -6,7 +6,7 @@ return{
mText(TEXTOBJ.pc,63,410)
end,
hook_drop=function(P)
if P.lastPiece.pc and P.stat.row%4==0 then
if P.lastPiece.pc then
P.gameEnv.heightLimit=4
if P.stat.pc%5==0 then
P.gameEnv.drop=math.max(P.gameEnv.drop-1,1)

BIN
parts/fonts/Japan.otf Normal file

Binary file not shown.

BIN
parts/fonts/Monospaced.otf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -119,6 +119,18 @@ do--function applySettings()
color={-.2,1.2},
}
function applySettings()
--Apply language
text=LANG.get(SETTING.locale)
WIDGET.setLang(text.WidgetText)
for k,v in next,TEXTOBJ do
if rawget(text,k)then
v:set(text[k])
end
end
--Apply cursor
love.mouse.setVisible(SETTING.sysCursor)
--Apply fullscreen
love.window.setFullscreen(SETTING.fullscreen)
love.resize(gc.getWidth(),gc.getHeight())
@@ -147,18 +159,6 @@ do--function applySettings()
SHADER.fieldSatur:send('b',m[1])
SHADER.fieldSatur:send('k',m[2])
--Apply language
text=LANG.get(SETTING.locale)
WIDGET.setLang(text.WidgetText)
for k,v in next,TEXTOBJ do
if rawget(text,k)then
v:set(text[k])
end
end
--Apply cursor
love.mouse.setVisible(SETTING.sysCursor)
--Apply BG
if SETTING.bg=='on'then
BG.unlock()

1364
parts/language/dict_ja.lua Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -116,9 +116,9 @@ return{
noPassword="Please enter your password",
diffPassword="Passwords don't match",
registerRequestSent="A sign up request has been sent.",
registerSuccessed="Sign up successful!",
loginSuccessed="You are now logged in!",
accessSuccessed="Access granted",
registerOK="Sign up successful!",
loginOK="You are now logged in!",
accessOK="Access granted",
wsConnecting="Websocket connecting…",
wsFailed="WebSocket connection failed",
@@ -143,7 +143,6 @@ return{
customBGloadFailed="Unsupport image format for custom background",
errorMsg="Techmino ran into a problem and needs to restart.\nYou can send the error log to the developers.",
tryAnotherBuild="[Invalid UTF-8] If you are on Windows, try downloading Techmino-win32 or Techmino-win64 (different from what you are using now).",
modInstruction="Choose your modifiers!\nMods allow you to change the game,\nbut they may also crash the game.\nScores will not be saved when using mods.",
modInfo={
@@ -276,6 +275,8 @@ return{
"C₂₉H₂₅N₃O₅",
"NOT_A_ROBOT",
"sakurw",
"Airun",
"幽灵3383",
"",
"Performances",
"Electric283",

View File

@@ -105,9 +105,9 @@ return{
noPassword="Por favor ingresa una contraseña",
diffPassword="Las contraseñas no coinciden",
registerRequestSent="Petición de registro enviada con éxito",
registerSuccessed="¡Registro exitoso!",
loginSuccessed="¡Ingreso con éxito!",
accessSuccessed="¡Autorizado exitoso!",
registerOK="¡Registro exitoso!",
loginOK="¡Ingreso con éxito!",
accessOK="¡Autorizado exitoso!",
wsConnecting="Websocket Conectando",
wsFailed="WebSocket conexión fallida",

View File

@@ -106,9 +106,9 @@ return{
noPassword="Entrez votre mot de passe",
diffPassword="Les mots de passe ne se correspondent pas",
-- registerRequestSent="Registration request sent",
registerSuccessed="Enregistré avec succès !",
loginSuccessed="Connecté avec succès !",
accessSuccessed="Autorisé avec succès !",
registerOK="Enregistré avec succès !",
loginOK="Connecté avec succès !",
accessOK="Autorisé avec succès !",
-- wsConnecting="Websocket Connecting",
wsFailed="WebSocket connection échouée",
@@ -242,6 +242,8 @@ return{
"C₂₉H₂₅N₃O₅",
"NOT_A_ROBOT",
"sakurw",
"Airun",
"幽灵3383",
"",
"Performance",
"Electric283",

View File

@@ -117,9 +117,9 @@ return{
noPassword="Silahkan masukki kata sandi Anda",
diffPassword="Kata sandi tidak sama",
registerRequestSent="Permintaan daftar telah terkirim.",
registerSuccessed="Pendaftaran sukses!",
loginSuccessed="Anda sekarang tergabung!",
accessSuccessed="Akses diberikan",
registerOK="Pendaftaran sukses!",
loginOK="Anda sekarang tergabung!",
accessOK="Akses diberikan",
wsConnecting="Menghubungkan websocket…",
wsFailed="Koneksi websocket gagal",
@@ -277,6 +277,8 @@ return{
"C₂₉H₂₅N₃O₅",
"NOT_A_ROBOT",
"sakurw",
"Airun",
"幽灵3383",
"",
"Pertunjukan",
"Electric283",

File diff suppressed because it is too large Load Diff

View File

@@ -104,9 +104,9 @@ return{
noPassword="Insira sua senha ",
diffPassword="Senhas não combinam",
-- registerRequestSent="Registration request sent",
registerSuccessed="Registrado com sucesso!",
loginSuccessed="Logado com sucesso!",
accessSuccessed="Autorizado com sucesso!",
registerOK="Registrado com sucesso!",
loginOK="Logado com sucesso!",
accessOK="Autorizado com sucesso!",
-- wsConnecting="Websocket Connecting",
wsFailed="WebSocket falha na conexão",
@@ -264,6 +264,8 @@ return{
"C₂₉H₂₅N₃O₅",
"NOT_A_ROBOT",
"sakurw",
"Airun",
"幽灵3383",
"",
"Performance",
"Electric283",

View File

@@ -116,9 +116,9 @@ return{
noPassword="请填写密码",
diffPassword="两次密码不一致",
registerRequestSent="注册请求已发送",
registerSuccessed="注册成功!",
loginSuccessed="登录成功",
accessSuccessed="身份验证成功",
registerOK="注册成功!",
loginOK="登录成功",
accessOK="身份验证成功",
wsConnecting="正在连接",
wsFailed="连接失败",
@@ -275,6 +275,9 @@ return{
"ScF",
"C₂₉H₂₅N₃O₅",
"NOT_A_ROBOT",
"sakurw",
"Airun",
"幽灵3383",
"",
"Performances",
"Electric283",

View File

@@ -114,9 +114,9 @@ return{
noPassword="输入您的密码",
diffPassword="密码不匹配",
registerRequestSent="已发送注册请求",
registerSuccessed="注册成功!",
loginSuccessed="您现在已登录!",
accessSuccessed="允许访问",
registerOK="注册成功!",
loginOK="您现在已登录!",
accessOK="允许访问",
wsConnecting="双向通信连接",
wsFailed="双向通信连接失败",
@@ -273,6 +273,9 @@ return{
"氟化钪",
"蛋白激酶G抑制剂",
"不是机器人",
"萨库尔",
"爱伦",
"幽灵3383",
"",
"性能",
"电动283",

View File

@@ -116,9 +116,9 @@ return{
noPassword="請輸入密碼",
diffPassword="密碼不匹配",
registerRequestSent="已發送註冊請求",
registerSuccessed="註冊成功!",
loginSuccessed="登錄成功",
accessSuccessed="身份認證成功",
registerOK="註冊成功!",
loginOK="登錄成功",
accessOK="身份認證成功",
wsConnecting="正在連接……",
wsFailed="連接失敗",
@@ -276,6 +276,8 @@ return{
"C₂₉H₂₅N₃O₅",
"NOT_A_ROBOT",
"sakurw",
"Airun",
"幽灵3383",
"",
"Performances",
"Electric283",

View File

@@ -1,7 +1,7 @@
Gameplay:
The system will provide you with tetrominoes (4-block pieces),
with a total of 7 types, and the player needs to control them
(move left and right, rotate 90, 180 or 270 degrees).
(move left and right, rotate 90, 180, or 270 degrees).
each row filled with the field will be cleared.
If there is an opponent, an attack will be sent depending on the line clear type
Play until the end or achieve the level's goal to win.
@@ -18,29 +18,49 @@ Spin detection:
- The Spin is a Mini if it only has 2 points; the piece is one of S, Z, J, L, T; AND the line clear did not clear the entire piece.
Attack system:
Normal line clears (1 to 3 lines):
Sends (lines cleared -0.5) attack
Special line clears:
Spin sends (lines cleared x2) attack,
- B2B sends extra 1/1/2/4/8 for Spin Single/Double/Triple/Techrash/Techrash+
- B2B2B sends (lines cleared x0.5), and +1 extra blocking
- Minis reduces the attack to 25% (x0.25 multiplier)
Non-Spin Techrash/Techrash+ sends (lines cleared) attack,
- B2B sends 1 additional line
- B2B2B will have an attack boost of 50% and +1 extra blocking
Special clear:
A special clear refers to a situation where you perform a spin, Techrash (or clear more than four lines at a time), PC, or HPC. Special clears can elevate the B2B gauge.
Super clear:
A super clear refers to a situation where you perform a special clear when the B2B gauge is not empty.
Special line clears will the increase B2B gauge, making later special line clears have either a B2B or B2B2B bonus (see below)
Special clears (spins):
sends (lines cleared ×2) attack,
- B2B sends extra 1/1/2/4/8 for Spin Single/Double/Triple/Techrash/Techrash+
- B2B2B sends (lines cleared ×0.5), and +1 extra blocking
- Minis reduces the attack to 25% (×0.25 multiplier)
Special clears (Techrash/techrash+ without spins):
- B2B sends 1 additional line
- B2B2B will have an attack boost of 50% and +1 extra blocking
Non-special clears:
send (attack-0.5) attack.
Combos (REN):
The numbers of the combos are equal to (the numbers you clear lines consecutively 1). All damage above (except attack from PC/HPC) will be given a (combo ×25%) bonus, or (combo ×15%) for Single clear (capped at 12 combo), +1 more attack for 3 Combo or more.
Hemi Perfect Clear (a P.C. "with blocks left below". If it's an I clearing 1 line, the remaining blocks must not be player-placed):
Attack +4, Extra Blocking +2
- Attack +4, Extra Blocking +2
Perfect Clear (aka All Clear):
Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher,
and +2 extra blocking.
Perfect Clear (All Clear):
- Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher, and +2 extra blocking.
Combos: All damage above will be given a (combo x25%) bonus, or (combo x15%) for Single clear (capped at 12 combo),
+1 more attack for 3 Combo or more.
After calculating all above, the damage value will be rounded down then sent
After calculating all the above, the damage value will be rounded down and sent.
Back to Back (B2B) gauge:
The B2B gauge ranges from 0 to 1,000. Special line clears are B2B if the gauge is >=50, B2B2B if >800.
Line cleared:
Special clears:
- Spin Single/Double/Triple/Techrash/Techrash+ + 50/100/180/800/1000 (×50% if Mini)
- Techrash/Techrash+ + 150/200/...
- PC when lines cleared in this round >4, +800
- HPC, +100
- A regular line clear -250
No lines cleared:
- Spin (0 lines) +20. Do note that the B2B gauge cannot exceed 800 using this method.
Score system:
The better you play, the higher the score.
@@ -53,37 +73,27 @@ Attack delay:
Minis will greatly increase the delay.
Countering:
When you send attacks, if there is garbage in queue,
When you send attacks, if there is garbage in the queue,
extra blocking will be used first, then attack, countering the earliest attack at a 1:1 ratio.
Any extra blocking you didn't use will be discarded, and finally the remaining attack power will be sent to your opponent.
Back to Back (B2B) gauge:
The B2B gauge ranges from 0 to 1,000. Special line clears are B2B if the gauge is >=50, B2B2B if >800.
A regular line clear -250
Spin Single/Double/Triple/Techrash/Techrash+ + 50/100/180/800/1000 (x50% if Mini)
Techrash/Techrash+ + 150/200/...
PC when lines cleared in this round >4, +800
Hemi-PC, +100
Spin (0 lines) +20. Do note that the B2B gauge cannot exceed 800 using this method.
When gauge is above 800, a drop without clearing lines decreases it by 40, but cannot drop below 800
Any extra blocking you didn't use will be discarded, and finally, the remaining attack power will be sent to your opponent.
Battle Royale modes:
Many players play a game at the same time (against AI bots, not real players).
As players get eliminated, blocks fall faster, and garbage take effect faster, as well as rise faster.
As players get eliminated, blocks fall faster, and garbage takes effect faster, as well as rises faster.
Eliminate other players to gain a badge and the player's badge to increase your attack power.
Players can choose between four attack modes:
1. Random: Every time you attack, 10% chance to lock onto a random player.
2. Badges: After you attack or when your target dies, lock onto the player with the most badges.
3. KOs: After you attack or when your target dies, lock onto the player with the highest field. (Refreshes every second)
4. Attackers: attack all players locking onto yourself.
Your attack will be sent to all of them. If you are not targetted, you attack a random player (not locking).
Your attack will be sent to all of them. If you are not targeted, you attack a random player (not locking).
When all opponents have been eliminated, the last player in the match is the winner.
Custom mode:
You can freely adjust most parameters (not including special effects of other game modes).
You can also draw a field to clear or make a template to build.
In build (puzzle) mode, you can toggle template display with Function key:
Cells with a X cannot have blocks;
Cells with an X cannot have blocks;
empty cells can be in any state;
regular colored cells have to be made of the corresponding block;
garbage-colored cells can be any block but not air.

View File

@@ -0,0 +1,62 @@
ゲームプレイ:
システムから与えられた全7種類のテトロミ
(4ブロックで構成されたピース) をプレイヤーが操作します,
(主に左右移動と90°, 180°, 270°回転で)。
各行がブロックで埋め尽くされるとその行列のブロックが消えます。
相手が居る場合, ラインの消し方等で攻撃と火力が異なります。
勝利する為にはそのレベルの目標達成もしくは最後までプレイする必要があります。
回転システム:
初期設定はTRS (Techmino Rotation System) で設定されています。
プレイヤーは他の一般的な回転システムも使う事ができます (基本的には変えなくても大丈夫)。
スピンの検出:
「3コーナ」ルールを満たした時 +2点
「インモービル (Immobile)」 ルールを満たした時 +2点
- 上のどちらかを満たした時, スピンが確定します。
もし回転システムがキックテーブルから2番チェック (2nd check) を採用していなかった場合 +1点
- もしスピンの合計点が2点しかない場合は「ミニ」扱いになりますがS, Z, J, L, Tのいずれかで, ラインクリア時にそのミノを全て消せなかった場合のみ。
Attack system:
[TODO]
Back to Back (B2B) gauge:
[TODO]
スコアシステム:
上手くプレイすれば, スコアも上がります。
攻撃遅延システム:
ダブル, トリプルの攻撃が一番早く効果が出ます;
その次にゆっくりとした攻撃を送るTechrash, スピン等, の効果が出ます;
高いコンボ数の攻撃が飛躍的に遅いです;
B2BやB2B2B等は, 送るライン数が増えれば増えるほど遅くなります;
ミニ系の攻撃は攻撃自体の効果を大幅に遅らせます。
カウンター:
攻撃を送る際, もしお邪魔ゲージにお邪魔がある場合,
追加相殺がまず使われ, その次に攻撃自体とお邪魔を1対1の割合でお邪魔の相殺に当てます。
使わなかった追加相殺は破棄され、残った攻撃のパワーは相手に送られます。
バトルロイヤルモード:
沢山のプレイヤーが同時にゲームをプレイします (対AIです, 本物の人ではありません)。
人数が減れば減るほど、ミノの落下速度は加速していき、お邪魔の効果が早く出る同時にせり上がる速度も上がります。
他のプレイヤーを倒してバッジを得て、そしてそのバッジであなた自身の攻撃力を上げましょう。
プレイヤーは4つの攻撃モードから選ぶことができます:
1: ランダム: 毎回攻撃を送る際, 10%の確率で他のプレイヤーに照準を合わせます。
2: バッジ狙い: 攻撃を送った後もしくは標的が落とされた場合, バッジの数が一番多いプレイヤーに照準を合わせます。
3. トドメ撃ち: 攻撃を送った後もしくは標的が落とされた場合, 各プレイヤの中からフィールドの高さが一番高いプレイヤーに照準を合わせます。
(毎秒更新されます)
4. カウンター: あなたに照準を向けられてるプレイヤー全員に照準を同時に向けます。
あなたの攻撃は照準を向けてるプレイヤー全てに送られます。照準をあなたに向けられていない場合、ランダムにプレイヤーを攻撃します (プレイヤー照準固定無し)
全てのプレイヤーが落とされた場合, 最後のプレイヤーが勝者となります。
カスタムモード:
殆どの変数を自由に変えられます (他のゲームモードの特殊エフェクトを除いて)。
更に消す為のフィールドを描いたりまたは積み上げる為のテンプレも作れます。
ビルド (パズル) モードの場合, テンプレの表示をファンクションキーで操作できます:
X印の場所にはブロックは置けない;
無印の場所は何来ても構わない;
色付きの場所にはその色に合わせてのミノブロックを置かないいけない;
おじゃまミノ色の場所にはあるブロックが来てる扱いで空きスペースではない。
形を整えた後に, 勝ち判定となります。

View File

@@ -15,21 +15,48 @@ spin判定:
--如果分数只有2,方块是SZJLT之一,并且没有把当前方块整个消除那么就是mini
攻击系统:
普通消除:
消<4行打出[消行数-0.5]攻击
特殊消除:
如果是spin,打出[2*消行数]攻击,
B2B攻击+[1/1/2/4/8(spin1~5)]
B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡
mini减至25%
不是spin但是单次消>=4行,打出[消行数]攻击,
B2B攻击+1
B3B攻击+50%,+1额外抵挡
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+4,额外抵挡+2
全消:全消伤害为8~16(本局内递增2),和上述其他伤害取大,然后+2额外抵挡
连击:每次连击给予上述攻击[连击数*25%(上限12连)(如果只消一行就是15%)]的加成,>=3次时再额外加1攻击
根据上述规则计算后,向下取整,攻击打出
概念说明[高级消除]:
spin/消四及以上,会受到B2B(点数>=50)或B3B(点数>800)加成
反之称为低级消除
概念说明[特殊消除]:
spin/消四及以上/pc/hpc,可以增加B2B点数
反之称为普通消除
高级消除(spin):
打出[2*消行数]攻击,然后
- B2B攻击+[1/1/2/4/8/14(spin1~6)]
- B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡
- mini减至25%
高级消除(非spin但是消四及以上):
打出[消行数]攻击,然后
- B2B攻击+1
- B3B攻击+50%,+1额外抵挡
低级消除:
打出[消行数-0.5]攻击
连击:
(注:连击数为连续消除次数-1)
把上述高级消除/低级消除的攻击直接乘以"连击倍率", 公式为 "连击倍率"=[连击数(上限12)]*[消一行以上25%,只消一行15%]
如果消除>=3次时再额外加1攻击
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):
伤害+4,额外抵挡+2
全消:
伤害为8~16(本局内递增2),和上述其他伤害取大,+2额外抵挡
计算完成后,向下取整,攻击打出
back to back(B2B)点数说明:
B2B点数的范围在0~1000
落块后消行了:
特殊消除:
spin1~5:+[50/100/180/800/1000](mini变为原来50%)
消四/五/六:+[150/200/...]
本局内消行数>4时全消:+800
半全消:+100
普通消除:
-250
落块后没消行:
空spin:+20
点数在800以上会-40(不低于800)
分数系统:
分数计算系统非常复杂,而且随时可能更改所以不写在这里,并且计算只跟消除方式等信息有关,和模式设定无关
@@ -42,16 +69,6 @@ spin判定:
发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击
没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手
back to back(B2B)点数说明:
B2B点数的范围在0~1000,在点数>=50时进行特殊消除为B2B,>800时特殊消除为B3B
普通消除:-250
spin1~5:+[50/100/180/800/1000](mini变为原来50%)
消四/五/六:+[150/200/...]
本局内消行数>4时全消:+800
半全消:+100
空spin:+20,此法得到的点数不能超过800
当点数在800以上时空放一块-40(不低于800)
混战模式说明:
许多玩家同时进行一局游戏(对手都是AI,不是真人).
随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.

33
parts/modes/master_g.lua Normal file
View File

@@ -0,0 +1,33 @@
return{
env={
freshLimit=15,
fieldH=19,
sequence="bagES",
eventSet='master_g',
bg='bg2',bgm='secret7th',
},
slowMark=true,
score=function(P)
if not tonumber(P.modeData.grade) then
return{P.modeData.grade,P.stat.time}
else
return{"Grade "..tostring(P.modeData.grade),P.stat.time}
end
end,
scoreDisp=function(D) return D[1].." "..STRING.time(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 G=P.modeData.gradePts
return
G>=39 and 5 or -- TM+
G>=31 and 4 or -- MM- - TM
G>=25 and 3 or -- m8 - MO
G>=18 and 2 or -- m1-m7
G>=9 and 1 or -- S1-S9
0
-- Table of grades vs values
-- 9 8 7 6 5 4 3 2 1 S1 S2 S3 S4 S5 S6 S7 S8 S9 m1 m2 m3 m4 m5 m6 m7 m8 m9 M MK MV MO MM- MM MM+ GM- GM GM+ TM- TM TM+
-- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
end,
}

22
parts/modes/sprint123.lua Normal file
View File

@@ -0,0 +1,22 @@
return{
env={
drop=60,lock=60,
sequence='bag',seqData={26,27,28,29},
eventSet='checkLine_40',
bg='bg2',bgm='race',
},
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(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.row<40 then return end
local T=P.stat.time
return
T<=42 and 5 or
T<=62 and 4 or
T<=104 and 3 or
T<=130 and 2 or
T<=160 and 1 or
0
end,
}

View File

@@ -467,14 +467,14 @@ function NET.updateWS_user()
SCN.back()
end
end
MES.new('check',text.loginSuccessed)
MES.new('check',text.loginOK)
--Get self infos
NET.getUserInfo(USER.uid)
NET.unlock('wsc_user')
elseif res.action==0 then--Get accessToken
NET.accessToken=res.accessToken
MES.new('check',text.accessSuccessed)
MES.new('check',text.accessOK)
NET.wsconn_play()
elseif res.action==1 then--Get userInfo
USERS.updateUserData(res.data)

View File

@@ -130,4 +130,5 @@ return{
{font=25,name="江江江江17"},
{font=25,name="TetraCepra"},
{font=25,name="爱抢姐姐布丁的芙兰酱(CHNO)"},
{font=25,name="你的忘机已上羡"},
}

View File

@@ -782,7 +782,7 @@ function draw.norm(P,repMode)
_drawFXs(P)
--Draw current block
if P.alive and P.cur then
if P.alive and P.control and P.cur then
local C=P.cur
local curColor=C.color
@@ -1021,7 +1021,7 @@ function draw.demo(P)
local _=BLOCK_COLORS[skinSet[id]]
gc_setColor(_[1],_[2],_[3],.3)
_=blockImg[id]
gc_draw(_,15,40*N-10,nil,16,nil,0,_:getHeight()*.5)
gc_draw(_,15,40*N-10,nil,8,nil,0,_:getHeight()*.5)
N=N+1
end
@@ -1032,7 +1032,7 @@ function draw.demo(P)
local _=BLOCK_COLORS[skinSet[id]]
gc_setColor(_[1],_[2],_[3],.3)
_=blockImg[id]
gc_draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5)
gc_draw(_,285,40*N-10,nil,8,nil,_:getWidth(),_:getHeight()*.5)
N=N+1
end

View File

@@ -217,10 +217,11 @@ function Player:_deepDrop()
end
end
function Player:act_moveLeft(auto)
self.movDir=-1
if not self.control then return end
if not auto then
self.ctrlCount=self.ctrlCount+1
end
self.movDir=-1
if self.cur then
if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)then
self:createMoveFX('left')
@@ -238,10 +239,11 @@ function Player:act_moveLeft(auto)
end
end
function Player:act_moveRight(auto)
self.movDir=1
if not self.control then return end
if not auto then
self.ctrlCount=self.ctrlCount+1
end
self.movDir=1
if self.cur then
if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)then
self:createMoveFX('right')
@@ -259,6 +261,7 @@ function Player:act_moveRight(auto)
end
end
function Player:act_rotRight()
if not self.control then return end
if self.cur then
self.ctrlCount=self.ctrlCount+1
self:spin(1)
@@ -266,6 +269,7 @@ function Player:act_rotRight()
end
end
function Player:act_rotLeft()
if not self.control then return end
if self.cur then
self.ctrlCount=self.ctrlCount+1
self:spin(3)
@@ -273,6 +277,7 @@ function Player:act_rotLeft()
end
end
function Player:act_rot180()
if not self.control then return end
if self.cur then
self.ctrlCount=self.ctrlCount+2
self:spin(2)
@@ -280,6 +285,7 @@ function Player:act_rot180()
end
end
function Player:act_hardDrop()
if not self.control then return end
local ENV=self.gameEnv
if self.cur then
if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then
@@ -305,6 +311,7 @@ function Player:act_hardDrop()
end
end
function Player:act_softDrop()
if not self.control then return end
self.downing=0
if self.cur then
if self.curY>self.ghoY then
@@ -325,6 +332,7 @@ function Player:act_softDrop()
end
end
function Player:act_hold()
if not self.control then return end
if self.cur then
if self:hold()then
self.keyPressing[8]=false
@@ -332,13 +340,16 @@ function Player:act_hold()
end
end
function Player:act_func1()
if not self.control then return end
self.gameEnv.fkey1(self)
end
function Player:act_func2()
if not self.control then return end
self.gameEnv.fkey2(self)
end
function Player:act_insLeft(auto)
if not self.control then return end
if not self.cur then
return
end
@@ -364,6 +375,7 @@ function Player:act_insLeft(auto)
end
end
function Player:act_insRight(auto)
if not self.control then return end
if not self.cur then
return
end
@@ -389,6 +401,7 @@ function Player:act_insRight(auto)
end
end
function Player:act_insDown()
if not self.control then return end
if self.cur and self.curY>self.ghoY then
local ENV=self.gameEnv
self:createDropFX()
@@ -403,6 +416,7 @@ function Player:act_insDown()
end
end
function Player:act_down1()
if not self.control then return end
if self.cur then
if self.curY>self.ghoY then
self:createMoveFX('down')
@@ -415,6 +429,7 @@ function Player:act_down1()
end
end
function Player:act_down4()
if not self.control then return end
if self.cur then
if self.curY>self.ghoY then
local ghoY0=self.ghoY
@@ -429,6 +444,7 @@ function Player:act_down4()
end
end
function Player:act_down10()
if not self.control then return end
if self.cur then
if self.curY>self.ghoY then
local ghoY0=self.ghoY
@@ -443,18 +459,21 @@ function Player:act_down10()
end
end
function Player:act_dropLeft()
if not self.control then return end
if self.cur then
self:act_insLeft()
self:act_hardDrop()
end
end
function Player:act_dropRight()
if not self.control then return end
if self.cur then
self:act_insRight()
self:act_hardDrop()
end
end
function Player:act_zangiLeft()
if not self.control then return end
if self.cur then
self:act_insLeft()
self:act_insDown()
@@ -463,6 +482,7 @@ function Player:act_zangiLeft()
end
end
function Player:act_zangiRight()
if not self.control then return end
if self.cur then
self:act_insRight()
self:act_insDown()
@@ -1778,19 +1798,15 @@ do
self.b2b=self.b2b+cc*50-50
piece.special=true
else
piece.special=false
end
if self.sound and(cc~=1 or dospin)then
VOC.play(clearVoice[cc],CHN)
end
--Normal clear,reduce B2B point
if not piece.special then
self.b2b=max(self.b2b-250,0)
self:showText(text.clear[cc],0,-30,35,'appear',(8-cc)*.3)
atk=cc-.5
sendTime=20+int(atk*20)
cscore=cscore+clearSCR[cc]
piece.special=false
end
if self.sound and(cc~=1 or dospin)then
VOC.play(clearVoice[cc],CHN)
end
--Combo bonus
@@ -1807,6 +1823,8 @@ do
--PC/HPC
if clear and cc>=#C.bk then
if CY==1 then
piece.pc=true
piece.special=true
self:showText(text.PC,0,-80,50,'flicker')
atk=max(atk,min(8+Stat.pc*2,16))
exblock=exblock+2
@@ -1822,9 +1840,9 @@ do
SFX.play('pc')
VOC.play('perfect_clear',CHN)
end
piece.pc=true
piece.special=true
elseif cc>1 or self.field[#self.field].garbage then
piece.hpc=true
piece.special=true
self:showText(text.HPC,0,-80,50,'fly')
atk=atk+4
exblock=exblock+2
@@ -1836,11 +1854,13 @@ do
SFX.play('pc')
VOC.play('half_clear',CHN)
end
piece.hpc=true
piece.special=true
end
end
if not piece.special then
self.b2b=max(self.b2b-250,0)
end
if self.b2b>1000 then
self.b2b=1000
elseif self.b2b==0 and ENV.b2bKill then
@@ -2057,6 +2077,11 @@ do
if _cc>6 then self:showText(text.cleared:gsub("$1",_cc),0,55,30,'zoomout',.4)end
self:_removeClearedLines()
self:_updateFalling(self.gameEnv.fall)
if _cc>=4 then
self.b2b=min(self.b2b+_cc*50-50,1000)
else
self.b2b=max(self.b2b-250,0)
end
self.stat.row=self.stat.row+_cc
self.stat.dig=self.stat.dig+_gbcc
self.stat.score=self.stat.score+clearSCR[_cc]

View File

@@ -10,7 +10,7 @@ local function log(str)outputBox:push(str)end
_SCLOG=log
log{C.lP,"Techmino Console"}
log{C.lC,"©2021 26F Studio some rights reserved"}
log{C.lC,"© Copyright 20192022 26F Studio. Some rights reserved."}
log{C.dR,"WARNING: DO NOT RUN ANY CODE THAT YOU DON'T UNDERSTAND."}
local history,hisPtr={"?"}
@@ -124,7 +124,7 @@ local commands={}do
tree(path..name.."/",subName,depth+1)
end
else
log("Unkown item type: %s (%s)"):format(name,info.type)
log("Unknown item type: %s (%s)"):format(name,info.type)
end
end
commands.tree={
@@ -181,7 +181,7 @@ local commands={}do
elseif info.type=='directory'then
recursiveDelDir(path)
else
log("Unkown item type: %s (%s)"):format(name,info.type)
log("Unknown item type: %s (%s)"):format(name,info.type)
end
end
end
@@ -207,7 +207,7 @@ local commands={}do
elseif info.type=='directory'then
(recursive and recursiveDelDir or delDir)(name)
else
log("Unkown item type: %s (%s)"):format(name,info.type)
log("Unknown item type: %s (%s)"):format(name,info.type)
end
else
log{C.R,("No file called '%s'"):format(name)}
@@ -745,7 +745,7 @@ local commands={}do
elseif code=="7126"then
sumode=true
log{C.Y,"* SU MODE ON - DO NOT RUN ANY CODES IF YOU DO NOT KNOW WHAT THEY DO *"}
log{C.Y,"* Use function _SCLOG(message) to print message here *"}
log{C.Y,"* Use the _SCLOG(message) function to print into this console *"}
log{C.Y,"* 最高权限模式开启, 请不要执行任何自己不懂确切含义的代码 *"}
log{C.Y,"* 使用_SCLOG(信息)函数在控制台打印信息 *"}
else
@@ -976,7 +976,7 @@ local userG={
-- collectgarbage=collectgarbage,
math={},string={},table={},bit={},coroutine={},
debug={"No way."},package={"No way."},io={"No way."},os={"No way."},
debug={},package={},io={},os={},
}
function userG.print(...)
local args,L={...},{}
@@ -999,6 +999,11 @@ TABLE.complete(string,userG.string)userG.string.dump=nil
TABLE.complete(table,userG.table)
TABLE.complete(bit,userG.bit)
TABLE.complete(coroutine,userG.coroutine)
local dangerousLibMeta={__index=function()error("No way.")end}
setmetatable(userG.debug,dangerousLibMeta)
setmetatable(userG.package,dangerousLibMeta)
setmetatable(userG.io,dangerousLibMeta)
setmetatable(userG.os,dangerousLibMeta)
--Puzzle box
local first_key={}
@@ -1122,7 +1127,7 @@ function scene.keyDown(key)
end
if #res>1 then
log(">Commands start with '"..str.."' :")
log(">Commands that start with '"..str.."' :")
table.sort(res)
for i=1,#res do log{COLOR.lH,res[i]}end
elseif #res==1 then

View File

@@ -76,7 +76,7 @@ local function _search()
end
function scene.sceneInit()
dict=require("parts.language.dict_"..(SETTING.locale:find'zh'and'zh'or'en'))
dict=require("parts.language.dict_"..(SETTING.locale:find'zh'and'zh'or SETTING.locale:find'ja'and'ja'or'en'))
_scanDict(dict)
inputBox:clear()
@@ -207,7 +207,7 @@ function scene.draw()
local r=TIME()*2
local R=int(r)%7+1
gc.setColor(1,1,1,1-abs(r%1*2-1))
gc.draw(TEXTURE.miniBlock[R],821,140,TIME()*10%6.2832,15,15,DSCP[R][0][2]+.5,#BLOCKS[R][0]-DSCP[R][0][1]-.5)
gc.draw(TEXTURE.miniBlock[R],821,140,TIME()*10%6.2832,7,7,2*DSCP[R][0][2]+1,2*(#BLOCKS[R][0]-DSCP[R][0][1])-1)
end
end

View File

@@ -113,6 +113,7 @@ local loadingThread=coroutine.wrap(function()
VOC.play('welcome')
THEME.fresh()
LOADED=true
saveStats()
Z.setPowerInfo(SETTING.powerInfo)
return'finish'
end)

View File

@@ -27,8 +27,7 @@ function scene.sceneInit()
scrollX=tipLength
--Set quick-play-button text
local qpModeName=text.modes[STAT.lastPlay]and text.modes[STAT.lastPlay][1]or"["..STAT.lastPlay.."]"
scene.widgetList[2]:setObject(text.WidgetText.main.qplay..": "..qpModeName)
scene.resize()
--Create demo player
destroyPlayers()
@@ -38,6 +37,11 @@ function scene.sceneInit()
PLAYERS[1]:setPosition(520,140,.8)
end
function scene.resize()
local qpModeName=text.modes[STAT.lastPlay]and text.modes[STAT.lastPlay][1]or"["..STAT.lastPlay.."]"
scene.widgetList[2]:setObject(text.WidgetText.main.qplay..": "..qpModeName)
end
function scene.mouseDown(x,y)
if x>=400 and x<=880 and y>=10 and y<=110 then
enterConsole()

View File

@@ -281,7 +281,7 @@ function scene.draw()
gc.push('transform')
gc.scale((3-2*timer2)*timer2)
gc.setColor(.97,.97,.97,timer2*(.5+.3*sin(TIME()*6.26)))
GC.regularPolygon('line',0,0,120,6,8)
GC.regRoundPolygon('line',0,0,120,6,8)
gc.setColor(chartColor[1],chartColor[2],chartColor[3],timer2*.626)
for i=1,9,2 do
gc.polygon('fill',0,0,val[i],val[i+1],val[i+2],val[i+3])
@@ -350,13 +350,13 @@ scene.widgetList={
WIDGET.newKey{name='quit', x=290,y=540,w=300,h=70,code=pressKey'q'},
WIDGET.newKey{name='tas', x=290,y=620,w=240,h=50,code=pressKey't',hideF=function()return not SETTING.allowTAS or GAME.tasUsed or GAME.result or GAME.replaying end},
WIDGET.newKey{name='page_prev',x=500,y=390,w=70,code=pressKey'tab',
fText=GC.DO{70,70,{'setLW',2}, {'dRPol',33,35,32,3,6,3.142},{'dRPol',45,35,32,3,6,3.142}},
fShade=GC.DO{70,70,{'setCL',1,1,1,.4},{'draw',GC.DO{70,70,{'setCL',1,1,1,1},{'fRPol',33,35,32,3,6,3.142},{'fRPol',45,35,32,3,6,3.142}}}},
fText=GC.DO{70,70,{'setLW',2}, {'dRRPol',33,35,32,3,6,3.142},{'dRRPol',45,35,32,3,6,3.142}},
fShade=GC.DO{70,70,{'setCL',1,1,1,.4},{'draw',GC.DO{70,70,{'setCL',1,1,1,1},{'fRRPol',33,35,32,3,6,3.142},{'fRRPol',45,35,32,3,6,3.142}}}},
hideF=function()return PLAYERS[1].frameRun<=180 end,
},
WIDGET.newKey{name='page_next',x=1230,y=390,w=70,code=pressKey'Stab',
fText=GC.DO{70,70,{'setLW',2}, {'dRPol',37,35,32,3,6},{'dRPol',25,35,32,3,6}},
fShade=GC.DO{70,70,{'setCL',1,1,1,.4},{'draw',GC.DO{70,70,{'setCL',1,1,1,1},{'fRPol',37,35,32,3,6},{'fRPol',25,35,32,3,6}}}},
fText=GC.DO{70,70,{'setLW',2}, {'dRRPol',37,35,32,3,6},{'dRRPol',25,35,32,3,6}},
fShade=GC.DO{70,70,{'setCL',1,1,1,.4},{'draw',GC.DO{70,70,{'setCL',1,1,1,1},{'fRRPol',37,35,32,3,6},{'fRRPol',25,35,32,3,6}}}},
hideF=function()return PLAYERS[1].frameRun<=180 end,
},
WIDGET.newKey{name='replay', x=865,y=165,w=200,h=40,font=25,code=pressKey'p',hideF=function()return not(GAME.result or GAME.replaying)or #PLAYERS>1 end},

View File

@@ -16,10 +16,10 @@ do
gc.setColor(1,1,1)
for i=1,29 do
local b=BLOCKS[i][0]
TEXTURE.miniBlock[i]=NSC(#b[1],#b)
TEXTURE.miniBlock[i]=NSC(#b[1]*2,#b*2)
for y=1,#b do for x=1,#b[1]do
if b[y][x]then
gc.rectangle('fill',x-1,#b-y,1,1)
gc.rectangle('fill',2*(x-1),2*(#b-y),2,2)
end
end end
end

View File

@@ -1,33 +1,40 @@
return[=[
未来小游戏:
Tetro-1010(2C2N, 重力)
Tetra-link(桌游)
坦克大战; 扫雷; 接水管
其他未来内容:
模式包系统; 新模组系统; 加速下落; spike相关统计数据
实时统计数据可视化; 教学关脚本语言; 从录像继续
等级系统; 场地格边缘线; 模式数据分析; 高级自定义序列
成就系统; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
组队战; 方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统
更自由的攻击系统; 更多消除方式; 可调场地宽度;
task-Z(新AI); 自适应UI; 新联网游戏场景切换逻辑
未来计划:
R E M A K E
g0.17.2: 0.17.2
新增:
改动:
完善当前的攻击系统,进入稳定状态
更新说明书的攻击系统章节
代码:
完善字体并换用OTF
修复:
倒计时时不能充das #610
几个音效的音量不太对 #572
master_g模式的一些细节问题
0.17.1: 苏醒 Wake Up
新增:
新模式选择界面(未完善,未来会增加更多便利功能)
新模式:master_g(NOT_A_ROBOT移植)
新皮肤:pixel(by C₂₉H₂₅N₃O₅)
新语言:Bahasa Indonesia(by NOT_A_ROBOT)
新语言:日本語(by sakurw)
新语言:日本語(by sakurw & Airun & 幽灵3383)
新小程序:Stopwatch, Mahjong(无和牌检测)
新模式:1~3连块40行(by NOT_A_ROBOT) #578
新BGM:lounge(暂未使用, by Hailey (cudsys) & MrZ)
更强的CC(会主动allspin了, by Gompyn) #579
改动:
修改选择模式音效
优化皮肤设置页面交互效果
移除yygq语言
重做staff表
更新字体
移除yygq语言
优化皮肤设置页面交互效果
换新miya立绘,给不同立绘添加不同点击动画
由于一些无关紧要的小原因暂时移除一个语音包
略微降低master-h模式骨块出现后的难度
超级消除也会增加b2b点数了 #585
两行pc还是会重置限制线吧 #577
重做关于页面,微调设置菜单
TRS的N/H添加一个踢墙
词条标题必定可以被搜索
@@ -47,14 +54,19 @@ return[=[
修复:
BGM模块资源管理问题导致的一些音频bug #557
自定义场地界面按超过第三个的鼠标键会报错
主菜单开关全屏会让快速开始按钮文本错误 #566
经典模式h和u难度没有干旱计数器 #546
自定义场地16号色的方块名位置显示错误
联网对战结算的l'pm公式错写成lpm的
PC时最后一块若非特殊消除会先扣除b2b点数
录像界面导入导出按钮隐藏状态错误
登录界面读取本地账号密码数据错误
经典-困难模式切换速度的时机错误
回合制开关玩家控制的问题
策略堆叠模式评级标准不当
云存档/读档的一处小问题
部分场景文本重叠问题
说明书的一处小问题
deepdrop坏了
混战模式坏了

View File

@@ -11,7 +11,7 @@ for i=1,29 do
local img=TEXTURE.miniBlock[i]
defaultAvatar[i]=GC.DO{128,128,
{'clear',.1,.1,.1},
{'draw',img,63,63,.2,30,30,img:getWidth()/2,img:getHeight()/2},
{'draw',img,63,63,.2,15,15,img:getWidth()/2,img:getHeight()/2},
}
end
local errorAvatar=GC.DO{128,128,

View File

@@ -1,7 +1,7 @@
return{
["apkCode"]=425,
["code"]=1701,
["string"]="V0.17.1",
["room"]="ver A-3",
["name"]="苏醒 Wake Up",
["apkCode"]=431,
["code"]=1702,
["string"]="V0.17.2",
["room"]="ver A-6",
["name"]="0.17.2",
}