Compare commits

...

20 Commits

Author SHA1 Message Date
MrZ626
684cb90a7d 修改堆叠模式玩法(自动清除之前记录)
修改更新历史和build号
2021-11-02 03:38:43 +08:00
MrZ626
172101ed55 整理玩家类代码,再分离出一个方法 2021-11-02 02:27:08 +08:00
MrZ626
98b5914726 移除机翻语言的tips 2021-11-02 02:15:34 +08:00
MrZ626
d1518e7ba4 词典新增研究群下属mew词条 2021-11-02 00:31:43 +08:00
MrZ626
72d4faa52a 微调进控制台音效力度 2021-11-01 21:56:57 +08:00
MrZ626
862dcbf806 准备&开始音效改为函数整理到gameFuncs文件里
launchpad可以执行任意函数,添加准备-开始音效
2021-11-01 20:30:04 +08:00
MrZ626
3db28f5136 再修正ci替换版本号的问题 2021-11-01 17:33:42 +08:00
MrZ626
f9e37f3c6a 修正ci替换版本号的小问题 2021-11-01 17:24:47 +08:00
MrZ626
457681e6ec 中英tips调整 2021-11-01 16:26:34 +08:00
MrZ626
904bcf6852 版本号改为0.16.4,移除@DEV标记(需要测试) 2021-11-01 15:52:23 +08:00
MrZ626
e21e57ff84 添加tip命令方便看tips 2021-11-01 14:51:40 +08:00
MrZ626
562a69831a 给中英tip排序 2021-11-01 14:32:26 +08:00
C29H25N3O5
706a683540 修正标点, .gitignore添加几个文件类型 2021-11-01 14:13:08 +08:00
C29H25N3O5
8e2aee5e84 再改语言文件 2021-11-01 14:13:08 +08:00
MrZ626
f68facbe0e 检测到启动参数有--test时启动测试脚本(需要更多测试)
Co-authored-by: Trebor Huang <41145779+Trebor-Huang@users.noreply.github.com>
2021-11-01 03:41:19 +08:00
MrZ626
5535366bb1 TASK模块创建任务第一次执行的时候也用assert保证错误被捕捉 2021-11-01 03:23:00 +08:00
Imple Lee
d75b709f23 Move Python code from updateVersion.py into action.ymls directly (#423)
* test python3

* try use `python` instead of `python3`

* use `update-version` everywhere

* fix variable injection

* fix python2vs3

* move `updateVersion.py` into action files
2021-11-01 02:12:32 +08:00
MrZ626
0a15011ec7 修复模式目录下非完整模式文件也会被当成模式加载 2021-10-31 02:03:54 +08:00
ParticleG
f7dfe1d869 - Re-enable other workflows 2021-10-31 00:39:54 +08:00
ParticleG
5e9c9cb5fa - Try use discordrb 2021-10-31 00:39:52 +08:00
31 changed files with 456 additions and 511 deletions

View File

@@ -59,11 +59,41 @@ runs:
shell: bash
run: |
7z a -tzip love-android/app/src/main/assets/game.love libAndroid
- name: update Android information
shell: python
run: |
if '${{ inputs.type }}' == 'Release':
appName = 'Techmino'
packageName = 'org.love2d.MrZ.Techmino'
edition = 'release'
elif '${{ inputs.type }}' == 'Snapshot':
appName = 'Techmino_Snapshot'
packageName = 'org.love2d.MrZ.Techmino.Snapshot'
edition = 'snapshot'
with open('./love-android/app/src/main/AndroidManifest.xml', "r+", encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@appName', appName)\
.replace('@edition', edition)
file.seek(0)
file.truncate()
file.write(data)
with open("./love-android/app/build.gradle", "r+", encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@packageName', packageName)\
.replace('@versionCode', '${{ inputs.apkCode }}')\
.replace('@versionName', '${{ inputs.name }}')\
.replace('@storePassword', '${{ inputs.KEY_STORE_PASSWORD }}')\
.replace('@keyAlias', '${{ inputs.ALIAS }}')\
.replace('@keyPassword', '${{ inputs.KEY_PASSWORD }}')
file.seek(0)
file.truncate()
file.write(data)
- name: Build Techmino
shell: bash
run: |
echo "${{ inputs.SIGNING_KEY }}" | base64 -d > love-android/app/android.keystore
python3 .github/workflows/updateVersion.py -T Android${{ inputs.type }} -C ${{ inputs.apkCode }} -N ${{ inputs.name }} -S ${{ inputs.KEY_STORE_PASSWORD }} -A ${{ inputs.ALIAS }} -K ${{ inputs.KEY_PASSWORD }}
chmod 777 love-android/gradlew
cd love-android/
./gradlew assembleRelease

View File

@@ -40,6 +40,9 @@ inputs:
FASTLANE_DISCORD_WEBHOOK:
required: true
description: "Fastlane Discord webhook"
FASTLANE_ACTION_ID:
required: true
description: "Fastlane Action ID"
FASTLANE_MATCH_PWD:
required: true
description: "Fastlane Match description password"
@@ -71,6 +74,7 @@ runs:
lane: '${{ inputs.type }}'
subdirectory: 'Techmino-iOS/platform/xcode'
env:
ACTION_ID: '${{ inputs.FASTLANE_ACTION_ID }}'
API_ID: '${{ inputs.APPLE_API_ID }}'
API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
API_KEY: '${{ inputs.APPLE_API_KEY }}'

View File

@@ -59,12 +59,22 @@ runs:
MATCH_PASSWORD: '${{ inputs.FASTLANE_MATCH_PWD }}'
MATCH_TOKEN: '${{ inputs.FASTLANE_MATCH_TOKEN }}'
- name: Modify template
shell: python
run: |
import datetime
from io import open
thisYear = str(datetime.datetime.today().year)
with open('./.github/build/macOS/info.plist.template', 'r', encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@versionName', '${{ inputs.name }}'[1:])\
.replace('@thisYear', thisYear)\
.replace('@bundleId', '${{ inputs.APPLE_APP_IDENTIFIER }}')
with open('./Techmino-macOS/Techmino.app/Contents/info.plist', 'w+', encoding='utf-8') as file:
file.write(data)
- name: Pack
shell: bash
run: |
python3 .github/workflows/updateVersion.py -T macOS \
-N ${{ inputs.name }} \
-B ${{ inputs.APPLE_APP_IDENTIFIER }}
mv Techmino.love Techmino-macOS/Techmino.app/Contents/Resources
mv CCloader.dylib Techmino-macOS/Techmino.app/Contents/Frameworks
mv ${{ inputs.icon }} Techmino-macOS/Techmino.app/Contents/Resources/iconfile.icns

View File

@@ -30,6 +30,18 @@ runs:
with:
url: http://www.angusj.com/resourcehacker/resource_hacker.zip
- uses: ./.github/actions/build-love
- name: update Windows template
shell: python
run: |
Version = '${{ inputs.version }}'.replace('V', '')
FileVersion = (f"{Version.replace('.', ',')},0")
with open('./.github/build/Windows/Techmino.rc.template', 'r', encoding='utf8') as file:
data = file.read()
data = data\
.replace('@FileVersion', FileVersion)\
.replace('@Version', Version)
with open('Techmino.rc', 'w+', encoding='utf8') as file:
file.write(data)
- name: Pack Techmino
shell: pwsh
run: |
@@ -42,7 +54,6 @@ runs:
del .\love\readme.txt
move .\cold_clear.dll .\love
move .\CCloader.dll .\love
python .\.github\workflows\updateVersion.py -T Windows -N ${{ inputs.version }}
cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action delete -mask ICONGROUP,,'
cmd /c '.\ResourceHacker.exe -open .\Techmino.rc -save .\Techmino.res -action compile'
cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action addoverwrite -res "${{ inputs.icon }}" -mask ICONGROUP,1,'

View File

@@ -1,12 +0,0 @@
name: 'update for a snapshot'
description: 'common update logic for snapshot'
inputs:
commit:
required: true
runs:
using: "composite"
steps:
- shell: bash
run: |
python3 .github/workflows/updateVersion.py -T Conf
python3 .github/workflows/updateVersion.py -T Version -H ${{ inputs.commit }}

View File

@@ -0,0 +1,37 @@
name: 'update version'
description: 'common update logic for snapshot and release'
inputs:
commit:
required: false
type:
required: true
runs:
using: "composite"
steps:
- shell: python
name: update snapshot saving folder
run: |
from io import open
if '${{ inputs.type }}'.lower() != 'snapshot':
exit(0)
with open('conf.lua', 'r+', encoding='utf-8') as file:
data = file.read()
data = data.replace("t.identity='Techmino'--Saving folder", "t.identity='Techmino_Snapshot'--Saving folder")
file.seek(0)
file.truncate()
file.flush()
file.write(data)
- shell: python
run: |
from io import open
import re
with open('version.lua', 'r+', encoding='utf-8') as file:
commitHash = '${{ inputs.commit }}'
if commitHash != '':
commitHash = '@' + commitHash[0:4]
data = file.read()
data = re.sub('(\d)"', r'\1' + commitHash + '"', data, 1)
file.seek(0)
file.truncate()
file.flush()
file.write(data)

View File

@@ -32,9 +32,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
@@ -53,9 +54,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-linux
with:
icon: .github/build/Linux/icon_snapshot.png
@@ -70,9 +72,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-android
with:
type: Snapshot
@@ -94,9 +97,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-macos
with:
name: ${{ needs.get-info.outputs.name }}
@@ -120,9 +124,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-ios
with:
name: ${{ needs.get-info.outputs.name }}
@@ -137,6 +142,7 @@ jobs:
APPLE_APP_PROFILE: '${{ secrets.APPLE_APP_PROFILE }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_ACTION_ID: '${{ github.run_id }}'
FASTLANE_DISCORD_WEBHOOK: '${{ secrets.FASTLANE_DISCORD_WEBHOOK }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'

View File

@@ -5,10 +5,10 @@ elseif arg[1]=="-code"then
local str=require"version".code
print(str)
elseif arg[1]=="-name"then
local str=require"version".string:gsub("@DEV","")
local str=require"version".string
print(str)
elseif arg[1]=="-release"then
local str=require"version".string:gsub("V","",1):gsub("@DEV","")
local str=require"version".string:gsub("V","",1)
print(str)
elseif arg[1]=="-updateTitle"then
local note=require"parts.updateLog"

View File

@@ -35,9 +35,7 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Update Version
run: |
python .\.github\workflows\updateVersion.py -T Version
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
@@ -58,9 +56,7 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Update Version
run: |
python .\.github\workflows\updateVersion.py -T Version
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win32.zip
@@ -81,9 +77,7 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Update Version
run: |
python3 .github/workflows/updateVersion.py -T Version
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-linux
with:
file-path: Techmino.a${{ needs.get-info.outputs.release }}.AppImage
@@ -99,9 +93,7 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Update Version
run: |
python3 .github/workflows/updateVersion.py -T Version
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-android
with:
type: Release
@@ -123,9 +115,7 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Update Version
run: |
python3 .github/workflows/updateVersion.py -T Version
- uses: ./.github/actions/update-version
- name: remove media
run: |
rm -rf media/music media/effect media/vocal
@@ -150,9 +140,7 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Update Version
run: |
python3 .github/workflows/updateVersion.py -T Version
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-macos
with:
name: ${{ needs.get-info.outputs.name }}
@@ -179,9 +167,7 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
with:
commit: ${{ needs.get-info.outputs.commit }}
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-ios
with:
name: ${{ needs.get-info.outputs.name }}
@@ -196,6 +182,7 @@ jobs:
APPLE_APP_PROFILE: '${{ secrets.APPLE_APP_PROFILE }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_ACTION_ID: '${{ github.run_id }}'
FASTLANE_DISCORD_WEBHOOK: '${{ secrets.FASTLANE_DISCORD_WEBHOOK }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
@@ -214,9 +201,7 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Update Version
run: |
python3 .github/workflows/updateVersion.py -T Version
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-love
with:
file-path: Techmino.a${{ needs.get-info.outputs.release }}.love

View File

@@ -33,9 +33,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
@@ -54,9 +55,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-linux
with:
icon: .github/build/Linux/icon_snapshot.png
@@ -71,9 +73,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-android
with:
type: Snapshot
@@ -95,9 +98,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-macos
with:
name: ${{ needs.get-info.outputs.name }}
@@ -121,9 +125,10 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-ios
with:
name: ${{ needs.get-info.outputs.name }}
@@ -138,6 +143,7 @@ jobs:
APPLE_APP_PROFILE: '${{ secrets.APPLE_APP_PROFILE }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_ACTION_ID: '${{ github.run_id }}'
FASTLANE_DISCORD_WEBHOOK: '${{ secrets.FASTLANE_DISCORD_WEBHOOK }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'

View File

@@ -1,100 +0,0 @@
import argparse
import re
def updateConf(): #更新存档位置
with open('conf.lua', 'r+', encoding='utf-8') as file:
data = file.read()
data = data.replace("t.identity='Techmino'--Saving folder", "t.identity='Techmino_Snapshot'--Saving folder")
file.seek(0)
file.truncate()
file.flush()
file.write(data)
def updateVersion(args): #更新版本号
with open('version.lua', 'r+', encoding='utf-8') as file:
data = file.read()
if args.Hash != False:
data = data.replace('@DEV', f'@{args.Hash[0:4]}')
else:
data = data.replace('@DEV', '')
file.seek(0)
file.truncate()
file.flush()
file.write(data)
def updateMacOS(args): #更新macOS打包信息
import datetime
thisYear = str(datetime.datetime.today().year)
with open('./.github/build/macOS/info.plist.template', 'r', encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@versionName', args.Name[1:])\
.replace('@thisYear', thisYear)\
.replace('@bundleId', args.Bundle)
with open('./Techmino-macOS/Techmino.app/Contents/info.plist', 'w+', encoding='utf-8') as file:
file.write(data)
def updateWindows(args): #更新Windows打包信息
Version = (args.Name).replace('V', '')
FileVersion = (f"{Version.replace('.', ',')},0")
with open('./.github/build/Windows/Techmino.rc.template', 'r', encoding='utf8') as file:
data = file.read()
data = data\
.replace('@FileVersion', FileVersion)\
.replace('@Version', Version)
with open('Techmino.rc', 'w+', encoding='utf8') as file:
file.write(data)
def updateAndroid(args, edition): #更新Android打包信息
if edition == 'Release':
appName = 'Techmino'
packageName = 'org.love2d.MrZ.Techmino'
edition = 'release'
elif edition == 'Snapshot':
appName = 'Techmino_Snapshot'
packageName = 'org.love2d.MrZ.Techmino.Snapshot'
edition = 'snapshot'
with open('./love-android/app/src/main/AndroidManifest.xml', "r+", encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@appName', appName)\
.replace('@edition', edition)
file.seek(0)
file.truncate()
file.write(data)
with open("./love-android/app/build.gradle", "r+", encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@packageName', packageName)\
.replace('@versionCode', args.Code)\
.replace('@versionName', args.Name)\
.replace('@storePassword', args.Store)\
.replace('@keyAlias', args.Alias)\
.replace('@keyPassword', args.Key)
file.seek(0)
file.truncate()
file.write(data)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='用于CI更新程序各类信息')
parser.add_argument('-T', '--Type', type=str, help = '更新的种类')
parser.add_argument('-B', '--Bundle', type=str, help = '应用包名')
parser.add_argument('-H', '--Hash', type=str, default = False, help = 'Github提交Hash')
parser.add_argument('-C', '--Code', type=str, default = False, help = 'versionCode')
parser.add_argument('-N', '--Name', type=str, default = False, help = 'versionName')
parser.add_argument('-S', '--Store', type=str, default = False, help = 'storePassword')
parser.add_argument('-A', '--Alias', type=str, default = False, help = 'keyAlias')
parser.add_argument('-K', '--Key', type=str, default = False, help = 'keyPassword')
args = parser.parse_args()
if args.Type == 'Conf':
updateConf()
elif args.Type == 'Version':
updateVersion(args)
elif args.Type == 'Windows':
updateWindows(args)
elif args.Type == 'macOS':
updateMacOS(args)
elif args.Type == 'AndroidRelease':
updateAndroid(args, 'Release')
elif args.Type == 'AndroidSnapshot':
updateAndroid(args, 'Snapshot')

7
.gitignore vendored
View File

@@ -1,3 +1,8 @@
.vscode
libAndroid
*.ini
*.ini
.DS_Store
Thumbs.db
Icon?
.Trash
.file

View File

@@ -23,7 +23,7 @@ function TASK.update(dt)
end
function TASK.new(code,...)
local thread=coroutine.create(code)
resume(thread,...)
assert(resume(thread,...))
if status(thread)~='dead'then
tasks[#tasks+1]={
thread=thread,

View File

@@ -382,8 +382,11 @@ end
for _,v in next,fs.getDirectoryItems('parts/modes')do
if isSafeFile('parts/modes/'..v)and not MODES[v:sub(1,-5)]then
local M={name=v:sub(1,-5)}
TABLE.complete(require('parts.modes.'..M.name),M)
MODES[M.name]=M
local modeData=require('parts.modes.'..M.name)
if modeData.env then
TABLE.complete(modeData,M)
MODES[M.name]=M
end
end
end
@@ -440,6 +443,14 @@ do
fs.remove('record/round_l.rec')
fs.remove('record/round_u.rec')
end
if STAT.version<1604 then
RANKS.stack_e=nil
RANKS.stack_h=nil
RANKS.stack_u=nil
fs.remove('record/stack_e.rec')
fs.remove('record/stack_h.rec')
fs.remove('record/stack_u.rec')
end
if RANKS.stack_20l then
RANKS.stack_20l=nil
RANKS.stack_40l=nil
@@ -576,3 +587,36 @@ table.sort(REPLAY,function(a,b)return a.fileName>b.fileName end)
table.insert(_LOADTIMELIST_,("Initialize Data: %.3fs"):format(TIME()-_LOADTIME_))
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i])end
if TABLE.find(arg,'--test')then
TASK.new(function()
while not LOADED do YIELD()end
print("\27[92m\27[1mAutomatic Test Started\27[0m")
BGM.setVol(0)SFX.setVol(0)
love.keypressed('space')
while SCN.swapping do YIELD()end
for k,mode in next,MODES do
if k~='netBattle'then
print("Scanning mode: "..mode.name)
loadGame(mode.name.."a",true)
while SCN.swapping do YIELD()end
SCN.back()
while SCN.swapping do YIELD()end
end
end
print("\27[92m\27[1mAutomatic Test Passed :)\27[0m")
for _=1,60 do YIELD()end
love.event.quit(0)
end)
TASK.new(function()
while true do
YIELD()
if ERRDATA[1]then break end
end
print("\27[91m\27[1mAutomatic Test Failed :(\27[0m\nThe error message is:\n"..table.concat(ERRDATA[1].mes,"\n").."\27[91m\nAborting\27[0m")
for _=1,60 do YIELD()end
love.event.quit(1)
end)
end

View File

@@ -0,0 +1,21 @@
return{
fillClear=false,
dropPiece=function(P)
if #P.field>P.gameEnv.fieldH then
local cc=P:checkClear(P.field,P.garbageBeneath+1,#P.field-P.garbageBeneath)
if cc>0 then
SFX.play('clear_'..math.min(cc,6))
P:showText(text.clear[cc]or cc.."-crash",0,0,60,'beat',.4)
P:removeClearedLines()
P.falling=P.gameEnv.fall
P.stat.row=P.stat.row+cc
end
if P.gameEnv.fieldH-cc-P.garbageBeneath>0 then
P:garbageRise(21,P.gameEnv.fieldH-cc-P.garbageBeneath,2e10-1)
if P.garbageBeneath>=P.gameEnv.fieldH then
P:lose()
end
end
end
end,
}

View File

@@ -0,0 +1,22 @@
return{
fillClear=false,
dropPiece=function(P)
if #P.field>P.gameEnv.fieldH then
local cc=P:checkClear(P.field,P.garbageBeneath+1,#P.field-P.garbageBeneath)
if cc>0 then
SFX.play('clear_'..math.min(cc,6))
P:showText(text.clear[cc]or cc.."-crash",0,0,60,'beat',.4)
P:removeClearedLines()
P.falling=P.gameEnv.fall
P.stat.row=P.stat.row+cc
end
local h=math.ceil((P.gameEnv.fieldH-cc-P.garbageBeneath)/2)
if h>0 then
P:garbageRise(21,h,2e10-1)
if P.garbageBeneath>=P.gameEnv.fieldH then
P:lose()
end
end
end
end,
}

View File

@@ -173,7 +173,25 @@ function royaleLevelup()
end
end
end
function playReadySFX(i)
if i==3 then
Snd('bass','A3')
Snd('lead','A4')
elseif i==2 then
Snd('bass','F3')
Snd('lead','A4')
Snd('lead','D5')
elseif i==1 then
Snd('bass','G3')
Snd('lead','B4')
Snd('lead','E5')
elseif i==0 then
Snd('bass','A3')
Snd('lead','A4')
Snd('lead','E5')
Snd('lead','A5')
end
end
--Game
@@ -622,8 +640,7 @@ do--function resetGameData(args)
if GAME.setting.allowMod then
TASK.new(task_showMods)
end
Snd('bass','A3')
Snd('lead','A4')
playReadySFX(3)
collectgarbage()
end
end

View File

@@ -405,10 +405,10 @@ return{
"term",
"In most cases, it's a meme.\nThe shape and position of the O Tetromino (a.k.a. the Square) does not change upon rotation, thus making it lack interesting spins/kicks that other Tetrominoes have, or be stuck in a place unable to get out.\nAs a joke, some people have made heavily edited videos or even programmed games where the O pieces can change shape and \"spin\" into different positions.\nTechmino also supports O-Spin in most modes.",
},
{"Rotation Systems",--Editted
{"Rotation Systems",
"wallkick rotationsystem",
"term",
"Systems that determine how pieces rotate.\n\nRotation systems usually handle two things: basic rotation and kicks.\n\nBasic rotation refers to how pieces rotate in an open area. Because rotating pieces on their geometric center will usually cause the piece to be misaligned from the grid, rotation systems need to specify alternative rotation centers or rotation offsets to align rotated pieces back to the grid.\n\nKicks refer to offsets applied if the rotated piece overlaps with the border of the matrix or other blocks. While older games, like the ones on NES and Gameboy, lack kicks, people soon realized that if a piece is too close to the wall, the floor or other pieces, the piece can (unintuitively) fail to rotate due to overlapping. Games started to implement systems that allow pieces close to walls/floors to rotate, and move them away from the wall/floor into a valid position (\"kicking off the wall/floor\"), and such movements, or offsets used in said movements, are referred to as (wall/floor) kicks.\n\nWhile Super Rotation System (SRS) is the current standard for modern official Tetris games, older games and unofficial games may have their own rotation systems, implementing different basic rotations and kicks.",
"Systems that determine how the pieces rotate.\n\nIn modern Tetris games, tetrominoes can rotate on a specfic rotation center (but this may be absent in some games). If the minoes overlap with the walls or the field, the system would attempt to perform some offsets (a process known as \"wall-kicking\"). Wall kicks allow minoes to move into in specific-shaped holes.",
},
{"ARS",
"ars arikrotationsystem atarirotationsystem",
@@ -445,10 +445,10 @@ return{
"term",
"Nintendo Rotation System\nThe rotation system used in the Tetris games on the NES and Game Boy.\nIt has two mirrored versions; the left-handed version is used on Game Boy, and the right-handed version on the NES.",
},
{"SRS",--Editted
{"SRS",
"srs superrotationsystem",
"term",
"Super Rotation System\nThe rotation system used in modern, official Tetris games.\nEach Tetromino has a rotation center for the piece to rotate around. Should a Tetromino overlap with the wall, floor or another mino on the field after rotation, a few offset positions will be checked, allowing pieces to kick off walls and floors. This also allows pieces to rotate into openings that are otherwise unreachable.\n\nMany unofficial games implement some modification of this rotation system that adds a kick for 180 spins. In Techmino, such a modification is called SRS+.",
"Super Rotation System, the most widely used rotation system by modern Tetris games, and is the foundation of many self-made rotation systems. There are four orientations for each tetromino, and they can rotate clockwise or counterclockwise (But without 180° rotations). Should a Tetromino overlap with the wall, floor or other minoes on the field after rotation, a few offset positions will be checked, allowing pieces to kick off walls and floors. You can look up the details of the wall kick table on Tetris Wiki.",
},
{"TRS",
"trs techminorotationsystem",
@@ -943,24 +943,30 @@ return{
},
--Other
{"Github Repository",
"githubrepository sourcecode",
"other",
"Techmino's Github repository. Stars are appreciated.",
"https://github.com/26F-Studio/Techmino",
},
{"Communities",
"community communities",
"other",
"Join Tetris communities and talk with other players!\n\nChina: [QQ] Tetris Research: 112897780\nGlobal: [Discord] Hard Drop: discord.gg/harddrop (click \"Open URL\").",
"https://discord.gg/harddrop"
},
{"Mew",
"mew tieba forum",
"help",
"",--TODO
"https://mew.fun/n/tetris",
},
{"Tetris OL Servers",
"tetrisonline servers",
"other",
"Google \"Tetris Online Poland\" for the Poland server.\nClick \"Open URL\" for information about the Tetris Online Study server.",
"http://teatube.ltd/tos",
},
{"Github Repository",
"githubrepository sourcecode",
"other",
"Techmino's Github repository. Stars are appreciated.",
"https://github.com/26F-Studio/Techmino",
},
--Savedata managing
{"Console",

View File

@@ -974,23 +974,29 @@ return{
},
--其他
{"GitHub仓库",
"源代码 github git sourcecode yuandaima",
"other",
"Techmino的GitHub仓库地址欢迎Star",
"https://github.com/26F-Studio/Techmino",
},
{"研究群",
"研究群 yanjiu study",
"other",
"俄罗斯方块·[研究]群QQ号112897780“中国俄罗斯方块总群”",
},
{"Mew据点",
"mew tieba forum",
"help",
"研究群下属的mew据点类似贴吧或者discord的服务器2021年下半年建立是discord和贴吧的结合体可以在同一个大社区的各个频道实时聊天也可以发帖以主题交流同时还有一个叫图书馆的功能方便各种方块资料整理还在建设中目前没多少内容2021.11,2",
"https://mew.fun/n/tetris",
},
{"茶服",
"茶服 chafu study",
"other",
"TO-S的添加方法、说明等关于茶服的一切",
"http://teatube.ltd/tos",
},
{"GitHub仓库",
"源代码 github git sourcecode yuandaima",
"other",
"Techmino的GitHub仓库地址欢迎Star",
"https://github.com/26F-Studio/Techmino",
},
--存档管理
{"控制台",

View File

@@ -760,20 +760,20 @@ return{
['custom_puzzle']= {"Custom", "PUZZLE"},
},
getTip={refuseCopy=true,
'Free-to-play block stacking game with a Battle Royale mode!',
'Have you noticed what "rotating" does do to a block?',
":pog:",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
"\"Example App\" cannot be opened because the developer cannot be verified.",
"\"Techmino.app\" cannot be opened because the developer cannot be verified.",
"\"Techmino.app\" will damage your computer. You should move it to the Bin.",
"\"TechminOS\"",
"\\jezevec/\\jezevec/\\jezevec/",
"\\osk/\\osk/\\osk/",
"↑↑↓↓←→←→BA",
"$include<studio.h>",
"0next 0hold",
"0next 0hold.",
"1next 0hold",
"1next 1hold!",
"1next 6hold!",
"20G actually is a brand new game rule.",
"20G actually is a brand new game rule!",
"40-line Sprint WR: 14.915s by Reset_",
"6next 1hold!",
"6next 6hold?!",
@@ -782,7 +782,6 @@ return{
"Am G F G",
"B2B2B???",
"B2B2B2B does not exist.",
"B2B2B2B exists?",
"Back-to-Back Techrash, 10 Combo, PC!",
"Be sure to give it your best shot again today!",
"Bridge clear coming soon!",
@@ -792,49 +791,60 @@ return{
"Color clear coming soon!",
"Decreasing DAS and ARR makes your game faster but harder to control.",
"Did I just see a Back-to-Back-to-Back?",
"Does B2B2B2B exists?",
"Don't let a small glitch ruin your entire day!",
"Don't look directly at the bugs!",
"Enjoy the Techmino rotation system!",
"Excellent, but let's go better next time…",
"Find out what's in the settings!",
"Found any bugs? Open up an issue in our GitHub page!",
"Free-to-play block stacking game with a Battle Royale mode!",
"git commit",
"git push -f",
"Got any suggestions? Post them in our Discord!",
"Have you noticed what \"rotating\" does do to a block?",
"Headphones recommended for a better experience.",
"Hello world!",
"I3 and L3 are the only two unique tetrominoes.",
"hello world",
"I3 and L3 are the only two unique triminoes.",
"if a==true",
"Increase your frame rate for a better experience.",
"Initial [insert action] system can save you.",
"Is B2B2B2B possible?",
"It's possible to finish 40L without left/right button.",
"It is loading! Not just a cutscene!",
"It's possible to finish 40L without left/right buttons.",
"It's possible to finish 40L without rotation buttons.",
"Join our Discord!",
"l-=-1",
"Let the bass kick!",
"Low frame rates reduce your gaming experience.",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"Lua No.1",
"Mix clear coming soon!",
"Most of the button icons are realized by using self-drawn glyphs in the Unicode Private Use Area.",
"Music of this game is made using Beepbox.",
"Music too distracting? You can turn it off.",
"No easter eggs in this menu if you have the simplistic style turned on!",
"O-Spin Triple!",
"OHHHHHHHHHHHHHH",
"Online mode is planned - please be patient.",
"Online mode is planned please be patient.",
"Play single-handedly!",
"Playing good takes some time!",
"Powered by LÖVE",
"Powered by Un..LÖVE",
"pps-0.01",
"Secret number: 626",
"Server down randomly",
"Some requirements to achieve rank S are intentionally set to be difficult for even the best players.",
"Soon you'll be able to play against friends and foes all over the world.",
"Split clear coming soon!",
"Surely loading! Not just a cutscene!",
"sudo rm -rf /*",
"Techmino = Technique + Tetromino",
"Techmino has a Nspire-CX edition!",
"Techmino is so fun!",
"Techmino.app will damage your computer. You should move it to the Bin.",
"TetroDictionary is now available in English.",
"The names that appeared in the background of the Staff page is a list of our sponsors.",
"The stacker future is yours in Techmino!",
"There are four hidden modes in the game.",
"There are several hidden modes in the game that cannot be entered using the map.",
"There is a total of 18 different pentominoes.",
"There is a total of 7 different tetrominoes.",
"Try using multiple Hold Queues!",
@@ -846,10 +856,12 @@ return{
"What is this cheap UI & music smh",
"while(false)",
"You are a Grand Master!",
"You can connect a keyboard to your phone or tablet!",
"You are welcome to help us to make BGMs and SFXs!",
"You can connect a keyboard to your phone or tablet (not functional on iOS though).",
"You can customize the key mappings in settings!",
"You can navigate the menu with a keyboard, but only in this screen.",
"You can open the save directory from the Stats page.",
"You can perform a spin with 28 of the 29 minos in this game; the exception being O1.",
"You can perform a spin with 28 of the 29 minoes in this game; the exception being O1.",
"You can set the spawning orientation for each tetromino.",
"ZS JL T O I",
{C.C,"Also try 15puzzle!"},
@@ -858,16 +870,20 @@ return{
{C.C,"Also try Orzmic!"},
{C.C,"Also try osu!"},
{C.C,"Also try Phigros!"},
{C.C,"Also try Puyo Puyo!"},
{C.C,"Also try Rubik's cube!"},
{C.C,"Also try Terraria!"},
{C.C,"Also try Touhou Project!"},
{C.C,"Also try VVVVVV!"},
{C.H,"REGRET!!"},
{C.lP,"Secret number: 626"},
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},
{C.lY,"COOL!!"},
{C.N,"Lua",C.Z," No.1"},
{C.P,"T-spin!"},
{C.R,"\"DMCA abusing\""},
{C.R,"\"Intellectual property law\""},
{C.R,"DD",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"D",C.Z," Cannon"},
{C.R,"DT",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z," Cannon"},
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
{C.Y,"O-Spin Triple!"},

View File

@@ -767,6 +767,8 @@ return{
"……合群了就会消失不合群世界毁灭指game over",
"……,合群了就会消失,但消失不代表没有意义",
"……,没有对比就没有伤害",
"“Techmino.app”将对您的电脑造成伤害。您应该将它移到废纸篓。",
"“TechminOS”",
"(a+b)³=a³+3a²b+3ab²+b³",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
"《按钮风格进化史》",
@@ -778,10 +780,9 @@ return{
"《游戏的意义》",
"《知识的力量》",
"《主题曲进化史》",
"\"TechminOS\"",
"↑↑↓↓←→←→BA",
"$include<studio.h>",
"0next 0hold",
"0next 0hold.",
"11renPC",
"1next 0hold",
"1next 1hold",
@@ -843,7 +844,7 @@ return{
"多年小游戏玩家表示痛恨假加载,启动动画主要是在加载资源",
"多hold现代块又回来了",
"俄罗斯方块完全可以作为电竞游戏",
"发现有个\"隐形\"皮肤了吗",
"发现有个“隐形”皮肤了吗",
"发现Bug可以去GitHub上开个issue反馈",
"方块不能吃",
"方块不是你生活的全部,适当走出去看看",
@@ -907,7 +908,6 @@ return{
"每个块的颜色可以自定义",
"每个虚拟按键都可以隐藏/显示,尺寸也可调",
"免费吃鸡方块",
"“Techmino.app”将对您的电脑造成伤害。您应该将它移到废纸篓。",
"喵!",
"魔方也是方块(确信",
"能导致吃键的问题有很多,建议说清楚具体发生了什么并且录视频说明",
@@ -926,7 +926,7 @@ return{
"你知道吗:O-Spin是在0.8.20 (Fantastic Global Update II)中诞生的",
"你知道吗:TRS旋转系统的最初形态在0.0.091726版本就存在了",
"你准备好了吗?",
"其实很多时候\"吃键\"是玩家对游戏机制不了解或者自己的操作问题导致的",
"其实很多时候“吃键”是玩家对游戏机制不了解或者自己的操作问题导致的",
"其实S和Z有四个方向(状态),虽然看起来只有两个",
"请谨慎向没有方块经验的玩家推荐,会对本游戏的生存环境造成影响,感谢配合。",
"请勿大力敲打设备敲坏了就没有Techmino玩了",
@@ -944,7 +944,7 @@ return{
"使用固定堆叠方法达成20TSD难度很低",
"试试用跳舞毯打块",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"手机玩也可以外接键盘哦",
"手机玩也可以外接键盘哦(iOS除外)",
"首页的机器人可能会不小心把自己给玩死",
"术语不认识?去右边那个词典里查查吧",
"水平是随着时间一点点提升的,不是几天几星期就能玩好的哦",
@@ -1005,7 +1005,7 @@ return{
"震惊我只是一条凑数tip吗",
"众所周知俄罗斯方块是经典编程练手游戏(",
"众所周知mac不能拿来玩游戏",
"注意到方块\"旋转\"的时候到底发生了些什么吗?",
"注意到方块“旋转”的时候到底发生了些什么吗?",
"自定义场地可以画图实现逐页演示",
"自己不确定的问题尽量不要教别人哦",
"总共有400多条tip哦",
@@ -1030,18 +1030,18 @@ return{
"e^(πi)=-1",
"e^(πi/2)=i",
"e^(πi/4)=(1+i)/√2",
"Farter:\"成天被夸赞'好玩'的\"",
"Farter:\"可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的\"",
"Farter:\"论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(\"",
"Farter:\"民间微创新\"",
"Farter:\"民间音le与图案\"",
"Farter:\"民间游戏设计\"",
"Farter:\"是方块爱好者研究平台\"",
"Farter:\"是方块萌新入坑接收器\"",
"Farter:\"是居家旅行装逼必备\"",
"Farter:\"是民间UI动效艺术作品\"",
"Farter:\"是一滩散乱的代码组成的蜜汁结构\"",
"Farter:\"它是现在的techmino已发布版本\"",
"Farter:成天被夸赞'好玩'的",
"Farter:可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的",
"Farter:论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(",
"Farter:民间微创新",
"Farter:民间音lè与图案",
"Farter:民间游戏设计",
"Farter:是方块爱好者研究平台",
"Farter:是方块萌新入坑接收器",
"Farter:是居家旅行装逼必备",
"Farter:是民间UI动效艺术作品",
"Farter:是一滩散乱的代码组成的蜜汁结构",
"Farter:它是现在的techmino已发布版本",
"fin neo iso 是满足tspin条件的特殊t2的名字",
"git commit",
"git push -f",
@@ -1052,7 +1052,6 @@ return{
"Let-The-Bass-Kick",
"MrZ是谁啊",
"pps-0.01",
"sudo rm -rf /*",
"S△ABC=√(h(h-a)(h-b)(h-c))h=(a+b+c)/2",
"shutdown -h now",
"sin(α+β)=SαCβ+SβCα",
@@ -1062,6 +1061,7 @@ return{
"sofunhowtoget",
"Staff名单里飘过的是赞助榜单喜欢本游戏的话可以给我们打赞助支持开发哦~",
"STSD必死",
"sudo rm -rf /*",
"Techmino = Technique + tetromino",
"Techmino 好玩!",
"Techmino 濂界帺锛",
@@ -1084,8 +1084,6 @@ return{
"Z酱累了Z酱不想更新",
"Z酱只是个写代码的懂什么方块",
"Z块等身抱枕来一个(x",
{C.A,"AQUA"},
{C.B,"BLUE"},
{C.C,"<PURE ",C.P,"MEMORY>"},
{C.C,"15puzzle好玩"},
{C.C,"东方Project好玩"},
@@ -1093,49 +1091,22 @@ return{
{C.C,"噗哟噗哟好玩!"},
{C.C,"扫雷好玩!"},
{C.C,"Celeste好玩"},
{C.C,"CYAN"},
{C.C,"Minecraft好玩"},
{C.C,"Orzmic好玩"},
{C.C,"Osu 好玩!"},
{C.C,"Osu! 好玩!"},
{C.C,"Phigros好玩"},
{C.C,"Terraria好玩"},
{C.C,"VVVVVV好玩"},
{C.G,"GREEN"},
{C.G,"mac快捷键: Cmd+[=返回上一级目录"},
{C.G,"mac快捷键: Cmd+A=全选"},
{C.G,"mac快捷键: Cmd+F=查找"},
{C.G,"mac快捷键: Cmd+Option+Delete=永久删除文件 (技术人员别杠)"},
{C.G,"mac快捷键: Cmd+Q=退出程序"},
{C.G,"mac快捷键: Control+↑=打开调度中心"},
{C.G,"mac快捷键: Cmd+Tab=切换App"},
{C.G,"mac快捷键: Cmd+W=关闭当前窗口"},
{C.G,"mac快捷键: Cmd+Z=撤销"},
{C.G,"win快捷键: Alt+F4=关闭当前窗口"},
{C.G,"win快捷键: Alt+Tab=切换窗口"},
{C.G,"win快捷键: backspace=返回上一级目录"},
{C.G,"win快捷键: Ctrl+鼠标滚轮=缩放"},
{C.G,"win快捷键: Ctrl+A=全选"},
{C.G,"win快捷键: Ctrl+Alt+Z=查看所有qq消息"},
{C.G,"win快捷键: Ctrl+F=查找"},
{C.G,"win快捷键: Ctrl+Tab=切换标签页"},
{C.G,"win快捷键: Ctrl+W=关闭当前标签页"},
{C.G,"win快捷键: shift+del=永久删除文件 (技术人员别杠)"},
{C.H,"暂定段位:9"},
{C.H,"REGRET"},
{C.J,"JADE"},
{C.L,"LIME"},
{C.H,"REGRET!!"},
{C.lC,"Xspin",C.Z,"是啥"},
{C.lP,"口〇口",C.Z," 可爱!"},
{C.lP,"秘密数字:626"},
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},
{C.lS,"茶娘",C.Z," 可爱!"},
{C.lY,"COOL"},
{C.M,"MAGENTA"},
{C.N,"Lua",C.Z,"天下第一"},
{C.N,"NAVY"},
{C.O,"ORANGE"},
{C.P,"PURPLE"},
{C.P,"T-spin"},
{C.P,"T-spin!"},
{C.R,"《滥用DMCA》"},
{C.R,"《知识产权法》"},
{C.R,"本游戏难度上限很高,做好心理准备。"},
@@ -1148,11 +1119,7 @@ return{
{C.R,"DD",C.Z,"炮=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"D",C.Z,""},
{C.R,"DT",C.Z,"炮=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z,""},
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR LLL ",C.C,"FFF ",C.Y,"RfR RRf rFF"},
{C.R,"RED"},
{C.S,"SEA"},
{C.V,"VIOLET"},
{C.W,"uid:225238922"},
{C.W,"WINE"},
{C.Y,"暂定段位:GM"},
{C.Y,"暂定段位:M"},
{C.Y,"暂定段位:MK"},
@@ -1161,7 +1128,6 @@ return{
{C.Y,"暂定段位:MV"},
{C.Y,"Miya",C.Z," 可爱!"},
{C.Y,"O-spin Triple"},
{C.Y,"YELLOW"},
{C.Z,"12",C.C,"",C.Z,""},
{C.Z,"效率药水",C.H," 效率提升 (8:00)"},
{C.Z,"协调药水",C.H," MD减少 II(1:30)"},

View File

@@ -760,114 +760,4 @@ return{
['custom_clear']= {"习俗", "正常"} ,
['custom_puzzle']= {"习俗", "令人费解的"},
},
getTip={refuseCopy=true,
'免费玩积木游戏与战斗皇家模式!',
'你注意到什么了吗?"旋转的"去一个街区有什么用?',
":pog:",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
"\\jezevec/\\jezevec/\\jezevec/",
"\\osk/\\osk/\\osk/",
"↑↑↓↓←→←→文学士",
"$包括<工作室.哈>",
"0下一个0等待",
"1下一个0等待",
"1下一个1等待",
"1下一个6等待",
"20克实际上是一个全新的游戏规则",
"40直线冲刺世界纪录:14.915秒重置_",
"6下一个1等待",
"6下一个6等一下",
"成就系统即将推出!",
"所有自旋!",
"上午 G F G",
"背靠背靠背???",
"背靠背靠背靠背不存在",
"背靠背靠背靠背存在吗?",
"背靠背技术崩溃10连击个人电脑",
"今天一定要再次尽你最大的努力!",
"桥很快就清了!",
"你能熟练掌握这个现代而又熟悉的堆垛机吗?",
"在不谐和上可以找到英语的变更日志",
"颜色很快就会清晰!",
"降低直连式存储和抗共振环速度更快,但更难控制",
"我刚才看到的是背靠背靠背吗?",
"不要让一个小故障毁掉你的一天!",
"不要直接看虫子!",
"享受技术米诺旋转系统!",
"太好了,但下次我们要做得更好",
"找出设置中的内容!",
"有什么建议吗?在我们的不谐和中发布它们!",
"建议佩戴耳机以获得更好的体验",
"你好,世界!",
"I3和L3是仅有的两种独特的三聚体",
"如果a==真",
"提高帧速率以获得更好的体验",
"初始[插入操作]系统可以节省您的时间",
"无需左/右按钮即可完成40升",
"它真的在加载!不仅仅是一个剪贴画!",
"加入我们的纷争吧!",
"让贝斯踢!",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"路亚一号",
"快来了!",
"这个游戏的音乐是使用Beepbox制作的",
"音乐太让人分心了?你可以把它关掉",
"如果您启用了简单化样式,则此菜单中没有复活节彩蛋!",
"旋转三倍!",
"哦哦哦哦哦哦哦哦",
"已计划在线模式-请耐心等待",
"单枪匹马!",
"玩得好需要一些时间!",
"被爱冲昏头脑",
"由联合国...LÖVE为动力",
"pps-0.01",
"秘密号码:626",
"服务器随机停机",
"一些达到S级的要求被故意设定为即使是最好的球员也很难达到",
"很快,你就可以和全世界的朋友和敌人比赛了",
"马上就来!",
"技术米诺=技术+特特罗米诺",
"技术米诺有一个Nspire CX版本",
"太有趣了!",
"四联词典现在有英文版本",
"在技术米诺,堆垛机的未来属于您!",
"游戏中有四种隐藏模式",
"总共有18种不同的五分音符",
"总共有7种不同的河豚",
"尝试使用多个等待队列!",
"尝试使用两个旋转按钮。使用这三种方法会更好",
"警告:程序员艺术",
"20件怎么样",
"100条生产线23件怎么样",
"26个热关断怎么样",
"这个便宜的界面和音乐是什么",
"当(假)",
"你是大师!",
"您可以将键盘连接到手机或平板电脑!",
"您可以使用键盘浏览菜单,但仅限于此屏幕",
"您可以从统计数据页面打开保存目录",
"在这个游戏中你可以用29个米诺中的28个进行旋转;例外情况是O1",
"您可以为每个四格拼板设置繁殖方向",
"ZS JL T O I",
{C.C,"也试试15拼图"},
{C.C,"还试试我的世界!"},
{C.C,"也试试扫雷艇!"},
{C.C,"也试试奥兹米奇!"},
{C.C,"也试试俄亥俄州立大学!"},
{C.C,"也试试菲格罗斯!"},
{C.C,"也试试魔方!"},
{C.C,"也试试特拉里亚!"},
{C.C,"也试试VVVVVV"},
{C.H,"后悔!!!"},
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},
{C.lY,"凉爽!!!"},
{C.N,"Lua",C.Z,"第一"},
{C.P,"旋转!"},
{C.R,"\"滥用数字千年版权法\""},
{C.R,"\"知识产权法\""},
{C.R,"DT",C.Z,"大炮=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z,"大炮"},
{C.R,"月球接收实验室",C.G,"RlR",C.B,"最后贷款人",C.O,"区域铁路线",C.P,"存款准备金率",C.P,"微光",C.C,"熔丝制造",C.Y,"自由罗斯科电台",C.Y,"雨林基金会基金",C.Y,"雨林基金会基金"},
{C.Y,"旋转三倍!"},
{C.Z,"什么?",C.lC,"Xspin"},
}
}

View File

@@ -1,36 +1,25 @@
local function getHoleCount(P)
local hole=0
for x=1,10 do
for y=1,100 do
if not P:solid(x,y)then
hole=hole+1
end
end
end
return hole
end
return{
color=COLOR.cyan,
env={
drop=60,lock=60,
fieldH=100,
highCam=true,
fillClear=false,
wait=0,fall=50,
garbageSpeed=30,
highCam=false,
seqData={1,2,3,4,5,6,7},
mesDisp=function(P)PLY.draw.drawTargetLine(P,100)end,
eventSet='stack_100',
bg='blockrain',bgm='there',
},
score=function(P)return{getHoleCount(P),P.stat.time}end,
scoreDisp=function(D)return D[1].." Holes".." "..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,
score=function(P)return{P.stat.row,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines".." "..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 H=getHoleCount(P)
local L=P.stat.row
return
H==0 and 5 or
H<=1 and 4 or
H<=2 and 3 or
H<=5 and 2 or
H<=10 and 1 or
H<=26 and 0
L>=200 and 5 or
L>=180 and 4 or
L>=160 and 3 or
L>=130 and 2 or
L>=100 and 1 or
L>=70 and 0
end,
}

View File

@@ -1,36 +1,26 @@
local function getHoleCount(P)
local hole=0
for x=1,10 do
for y=1,98 do
if not P:solid(x,y)then
hole=hole+1
end
end
end
return hole
end
return{
color=COLOR.magenta,
env={
drop=60,lock=60,
fieldH=100,
highCam=true,
fillClear=false,
wait=0,fall=50,
fieldH=21,
highCam=false,
garbageSpeed=30,
seqData={1,2,3,4,5,6,7,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},
mesDisp=function(P)PLY.draw.drawTargetLine(P,98)end,
eventSet='stack_50',
bg='blockrain',bgm='there',
},
score=function(P)return{getHoleCount(P),P.stat.time}end,
scoreDisp=function(D)return D[1].." Holes".." "..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,
score=function(P)return{P.stat.row,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines".." "..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 H=getHoleCount(P)
local L=P.stat.row
return
H==0 and 5 or
H<=2 and 4 or
H<=4 and 3 or
H<=10 and 2 or
H<=26 and 1 or
H<=62 and 0
L>=80 and 5 or
L>=70 and 4 or
L>=60 and 3 or
L>=50 and 2 or
L>=40 and 1 or
L>=20 and 0
end,
}
}

View File

@@ -1,36 +1,26 @@
local function getHoleCount(P)
local hole=0
for x=1,10 do
for y=1,97 do
if not P:solid(x,y)then
hole=hole+1
end
end
end
return hole
end
return{
color=COLOR.yellow,
env={
drop=60,lock=60,
fieldH=100,
highCam=true,
fillClear=false,
wait=0,fall=50,
fieldH=21,
highCam=false,
garbageSpeed=30,
seqData={8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25},
mesDisp=function(P)PLY.draw.drawTargetLine(P,97)end,
eventSet='stack_50',
bg='blockrain',bgm='there',
},
score=function(P)return{getHoleCount(P),P.stat.time}end,
scoreDisp=function(D)return D[1].." Holes".." "..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,
score=function(P)return{P.stat.row,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines".." "..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 H=getHoleCount(P)
local L=P.stat.row
return
H<=2 and 5 or
H<=5 and 4 or
H<=10 and 3 or
H<=26 and 2 or
H<=62 and 1 or
H<=126 and 0
L>=60 and 5 or
L>=50 and 4 or
L>=45 and 3 or
L>=30 and 2 or
L>=20 and 1 or
L>=10 and 0
end,
}
}

View File

@@ -622,37 +622,36 @@ function Player:lock()
end
function Player:checkClear(field,start,height,CB,CX)
local cc=0
if self.gameEnv.fillClear then
for i=1,height do
local h=start+i-2
local cc,gbcc=0,0
for i=1,height do
local h=start+i-2
--Bomb trigger (optional, must with CB)
if CB and h>0 and field[h]and self.clearedRow[cc]~=h then
for x=1,#CB[1]do
if CB[i][x]and field[h][CX+x-1]==19 then
cc=cc+1
self.clearingRow[cc]=h-cc+1
self.clearedRow[cc]=h
break
end
--Bomb trigger (optional, must with CB)
if CB and h>0 and field[h]and self.clearedRow[cc]~=h then
for x=1,#CB[1]do
if CB[i][x]and field[h][CX+x-1]==19 then
cc=cc+1
self.clearingRow[cc]=h-cc+1
self.clearedRow[cc]=h
break
end
end
h=h+1
--Row filled
for x=1,10 do
if field[h][x]<=0 then
goto CONTINUE_notFull
end
end
cc=cc+1
ins(self.clearingRow,h-cc+1)
ins(self.clearedRow,h)
::CONTINUE_notFull::
end
h=h+1
--Row filled
for x=1,10 do
if field[h][x]<=0 then
goto CONTINUE_notFull
end
end
cc=cc+1
if field[h].garbage then gbcc=gbcc+1 end
ins(self.clearingRow,h-cc+1)
ins(self.clearedRow,h)
::CONTINUE_notFull::
end
return cc
return cc,gbcc
end
function Player:roofCheck()
local CB=self.cur.bk
@@ -673,14 +672,30 @@ function Player:roofCheck()
end
return false
end
function Player:removeClearedLines()
for i=#self.clearedRow,1,-1 do
local h=self.clearedRow[i]
if self.field[h].garbage then
self.garbageBeneath=self.garbageBeneath-1
end
FREEROW.discard(rem(self.field,h))
FREEROW.discard(rem(self.visTime,h))
end
end
function Player:removeTopClearingFX()
for i=#self.clearingRow,1,-1 do
if self.clearingRow[i]>#self.field then
rem(self.clearingRow)
else
return
break
end
end
if self.clearingRow[1]then
self.falling=self.gameEnv.fall
return false
else
return true
end
end
function Player:checkMission(piece,mission)
if mission<5 then
@@ -1225,7 +1240,10 @@ do--Player.drop(self)--Place piece
end
--Check line clear
cc=cc+self:checkClear(self.field,CY,#CB,CB,CX)
if self.gameEnv.fillClear then
local _cc,_gbcc=self:checkClear(self.field,CY,#CB,CB,CX)
cc,gbcc=cc+_cc,gbcc+_gbcc
end
--Create clearing FX
for i=1,cc do
@@ -1257,25 +1275,10 @@ do--Player.drop(self)--Place piece
local finesse=CY>ENV.fieldH-2 or self:roofCheck()
--Remove rows need to be cleared
if cc>0 then
for i=cc,1,-1 do
_=self.clearedRow[i]
if self.field[_].garbage then
self.garbageBeneath=self.garbageBeneath-1
gbcc=gbcc+1
end
FREEROW.discard(rem(self.field,_))
FREEROW.discard(rem(self.visTime,_))
end
end
self:removeClearedLines()
--Cancel top clearing FX
self:removeTopClearingFX()
if self.clearingRow[1]then
self.falling=ENV.fall
else
clear=true
end
--Cancel top clearing FX & get clear flag
clear=self:removeTopClearingFX()
--Finesse check (control)
local finePts
@@ -1888,24 +1891,11 @@ local function update_alive(P)
P.frameRun=P.frameRun+1
if P.frameRun<=180 then
if P.frameRun==60 then
if P.id==1 then
Snd('bass','F3')
Snd('lead','A4')
Snd('lead','D5')
end
if P.id==1 then playReadySFX(2)end
elseif P.frameRun==120 then
if P.id==1 then
Snd('bass','G3')
Snd('lead','B4')
Snd('lead','E5')
end
if P.id==1 then playReadySFX(1)end
elseif P.frameRun==180 then
if P.id==1 then
Snd('bass','A3')
Snd('lead','A4')
Snd('lead','E5')
Snd('lead','A5')
end
if P.id==1 then playReadySFX(0)end
P.control=true
P.timing=true
P:popNext()

View File

@@ -799,6 +799,12 @@ local commands={}do
"Usage: tas <on|off>",
},
}
commands.tip={
code=function()
log(text.getTip())
end,
description="Show a random tip",
}
--Network
commands.switchhost={

View File

@@ -37,7 +37,13 @@ pad={x=140,y=65,page=1,
{0,0,0,0,0,0,0,0},
},
{
{{}, {}, {}, {}, {sfx='move'}, {sfx='lock'}, {sfx='drop'}, {sfx='fall'},},
{
{samp={tag='ready3',func=function()playReadySFX(3)end}},
{samp={tag='ready2',func=function()playReadySFX(2)end}},
{samp={tag='ready1',func=function()playReadySFX(1)end}},
{samp={tag='start',func=function()playReadySFX(0)end}},
{sfx='move'},{sfx='lock'},{sfx='drop'},{sfx='fall'},
},
{{sfx='hold'}, {sfx='prehold'}, {}, {}, {sfx='clear_1'},{sfx='clear_2'},{sfx='clear_3'},{sfx='clear_4'}},
{{sfx='prerotate'}, {sfx='rotate'}, {sfx='rotatekick'}, {}, {voc='single'}, {voc='double'}, {voc='triple'}, {voc='techrash'}},
{{sfx='finesseError'},{sfx='finesseError_long'},{sfx='drop_cancel'},{}, {sfx='spin_0'}, {sfx='spin_1'}, {sfx='spin_2'}, {sfx='spin_3'}},
@@ -108,6 +114,7 @@ local function press(x,y)
pad.funcAlpha[y]=1
else
local k=pad[pad.page][y][x]
if k.samp then k.samp.func()end
if k.sfx then SFX.play(k.sfx,k.vol)end
if k.voc then VOC.play(k.voc)end
if k.bgm then BGM.play(k.bgm)end
@@ -201,10 +208,12 @@ function scene.draw()
if showLabel then
if k.sfx then mStr(k.sfx,x*80+40,y*80-30)gc_circle('fill',x*80+40,(y-1)*80+40,6)end
if k.voc then mStr(k.voc,x*80+40,y*80-17)gc_rectangle('line',x*80+30,(y-1)*80+30,20,20,1)end
if k.samp then mStr(k.samp.tag,x*80+40,y*80-30)gc_rectangle('fill',x*80+10,(y-1)*80+35,60,5,1)end
if k.bgm then mStr(k.bgm,x*80+40,y*80-78)gc_rectangle('fill',x*80+20,(y-1)*80+15,40,5,2)end
else
if k.sfx then gc_circle('fill',x*80+40,(y-1)*80+40,6)end
if k.voc then gc_rectangle('line',x*80+30,(y-1)*80+30,20,20,1)end
if k.samp then gc_rectangle('fill',x*80+10,(y-1)*80+35,60,5,1)end
if k.bgm then gc_rectangle('fill',x*80+20,(y-1)*80+15,40,5,2)end
end
if pad.alpha[y][x]>0 then

View File

@@ -14,10 +14,10 @@ local widgetX0={
}
local enterConsole=coroutine.wrap(function()
while true do
Snd('bell',.3,'A4',.5,'E5',1,coin('A5','B5'))YIELD()
Snd('bell',.3,'A4',.5,'F5',1,coin('C6','D6'))YIELD()
Snd('bell',.3,'A4',.5,'G5',1,coin('E6','G6'))YIELD()
Snd('bell',.3,'A4',.5,'A5',1,'A6')SFX.play('ren_mega')SCN.go('app_console')YIELD()
Snd('bell',.6,'A4',.7,'E5',1,coin('A5','B5'))YIELD()
Snd('bell',.6,'A4',.7,'F5',1,coin('C6','D6'))YIELD()
Snd('bell',.6,'A4',.7,'G5',1,coin('E6','G6'))YIELD()
Snd('bell',.6,'A4',.7,'A5',1,'A6')SFX.play('ren_mega')SCN.go('app_console')YIELD()
end
end)
function scene.sceneInit()

View File

@@ -7,20 +7,21 @@ return[=[
其他未来内容:
组队战; 实时统计数据可视化; 教学关; 从录像继续
重做模式选择UI; 重做模组UI; 加速下落; spike相关统计数据
更好的手柄支持; 场地格边缘线; 模式数据分析; 高级自定义序列
支持更多手柄; 场地格边缘线; 模式数据分析; 高级自定义序列
等级系统; 成就系统; Domain状态; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
可调场地宽度; 可调攻击系统; 更多消除方式(隔断/架空/混合/彩色/穿墙)
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统; 复杂的攻击系统
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统; 无用货币
可调攻击系统; 更多消除方式; 可调场地宽度
工程编译到字节码; task-Z(新AI)
无用货币; 收集向抽奖; 自适应UI; 多方块
收集向抽奖; 自适应UI; 多方块
0.16.3: 虫洞 Wormhole
0.16.4: 虫洞 Wormhole
新增:
新连击音效
新准备&开始音效
Next槽上方显示序列模式标记
等级图标(暂时不能升级)
词典支持复制词条方便发给别人
修改堆叠模式玩法(自动清除之前记录)
改动:
移除组合键切换攻击模式功能,固定为单点切换
iOS设备支持三档振动(原来只有一档)

View File

@@ -1,7 +1,7 @@
return{
["apkCode"]=388,
["code"]=1603,
["string"]="V0.16.3@DEV",
["apkCode"]=389,
["code"]=1604,
["string"]="V0.16.4",
["room"]="ver A-0",
["name"]="虫洞 Wormhole",
}