Compare commits

...

47 Commits

Author SHA1 Message Date
ParticleG
86edeb1e0c - Fix wrong upload file suffix 2021-11-04 16:12:48 +08:00
Particle_G
53b1852f28 Rel ios test (#427)
* - Test Release note

* - Test ios changelog

* - Finish touching
2021-11-04 04:01:12 +08:00
MrZ626
e3c385693b 修改更新历史和build号 2021-11-03 19:45:23 +08:00
MrZ626
572c0fbfa1 调整方块朝向菜单彩蛋模式进入方式 2021-11-03 19:43:36 +08:00
MrZ626
bbdf71167a 调整录像回放菜单按钮尺寸 2021-11-03 19:14:43 +08:00
MrZ626
2136ccd9a2 更新词典中的一些玩家信息 2021-11-03 15:46:46 +08:00
MrZ626
2131aea575 玩家类添加一个目标线绘制函数
堆叠模式添加需要填满的高度线
2021-11-03 15:41:13 +08:00
MrZ626
32b21c7d29 修改更新历史 2021-11-03 13:37:58 +08:00
MrZ626
8f6f6f316f 微调倒计时动画 2021-11-03 13:33:44 +08:00
MrZ626
66f9ac2791 修复无尽挖掘开局垃圾行可能会在同一列 2021-11-03 13:21:51 +08:00
MrZ626
ac0ba90438 修复wing背景颜色配置问题 2021-11-03 13:21:37 +08:00
MrZ626
990659ce91 修改更新历史和build号 2021-11-03 02:42:38 +08:00
MrZ626
00c602c844 再调整超级消除音效
调整launchpad
2021-11-03 02:40:21 +08:00
MrZ626
9db62ffc39 调整堆叠模式平衡 2021-11-03 02:33:31 +08:00
MrZ626
e7c777e502 超级消除有分数了
再调整超级消除的声音
2021-11-02 22:17:44 +08:00
MrZ626
4991e8cea2 优化堆叠模式体验,微调难度和评级 2021-11-02 20:15:23 +08:00
MrZ626
111d4e991f 微调单次超大消除相关的文本和效果 2021-11-02 19:37:50 +08:00
MrZ626
bedfa74a32 整理代码 2021-11-02 19:34:46 +08:00
MrZ626
f6944dc223 微调test模块 2021-11-02 17:39:23 +08:00
MrZ626
a34a3051a3 Merge remote-tracking branch 'tech/ci-autotest' into HEAD 2021-11-02 17:39:13 +08:00
MrZ626
0e13883faf 修改更新历史和build号 2021-11-02 17:21:36 +08:00
MrZ626
e8860eda1b 消除超过6行时部分语言会小字显示消的行数 2021-11-02 17:21:36 +08:00
MrZ626
33ba4820b3 音效室补充消除音效 2021-11-02 17:21:36 +08:00
MrZ626
5ed0dda8ab 修改一处中文语言里的BGM忘了改 2021-11-02 17:21:36 +08:00
MrZ626
bd260b2c6f 消除所有填满行的函数整理为玩家类的clearFilledLines方法
添加消7~20和20+的消除文本与消除音效
播放消n音效打包为函数移至gameFuncs文件
2021-11-02 17:21:36 +08:00
MrZ626
aa01ab07f7 英文词典补充一条翻译
Co-authored-by: C29H25N3O5 <a1228465111@163.com>
2021-11-02 17:21:35 +08:00
Trebor-Huang
c009893377 New part in Zframework 2021-11-01 10:14:09 +08:00
Trebor-Huang
3ae128d4c3 Revert init.lua 2021-11-01 10:00:39 +08:00
Trebor-Huang
cb2164c21d Fix string bug 2021-11-01 09:57:12 +08:00
Trebor-Huang
951b7407fc Keep up the pace 2021-11-01 09:52:41 +08:00
Trebor Huang
5a1fd0ca4d Correct semantic merge 2021-11-01 01:43:05 +08:00
Trebor Huang
f4b85e0dbb Merge branch 'main' into ci-autotest 2021-10-31 23:51:40 +08:00
Trebor-Huang
c38bceb87e Yay it works 2021-10-31 23:38:15 +08:00
Trebor-Huang
2569e8844e Test dummy failure 2021-10-31 23:36:44 +08:00
Trebor-Huang
e42fa8351e Can't get xvfb to return the correct value? 2021-10-31 23:35:12 +08:00
Trebor-Huang
9582a625ff Add shell 2021-10-31 23:20:33 +08:00
Trebor-Huang
81abb06f7b Add shell 2021-10-31 23:19:04 +08:00
Trebor-Huang
7cfea0eebe Try using composite 2021-10-31 23:15:57 +08:00
Trebor-Huang
01c2bfe955 Remove uneccesary needs 2021-10-31 22:51:12 +08:00
Trebor-Huang
70242e6a07 Add some more utils 2021-10-31 21:23:54 +08:00
Trebor-Huang
c1edba974f Maybe update first 2021-10-31 20:47:23 +08:00
Trebor-Huang
546b3f230d Prepare PulseAudio 2021-10-31 20:45:23 +08:00
Trebor-Huang
14593eb487 Okay ubuntu doesn't allow gui either 2021-10-31 20:27:03 +08:00
Trebor-Huang
838621a3ae Try without xvfb first 2021-10-31 20:23:34 +08:00
Trebor-Huang
283d4a5fce Test xvfb 2021-10-31 20:04:54 +08:00
Trebor-Huang
490cf44132 Change iOS ci condition 2021-10-31 19:41:36 +08:00
Trebor-Huang
9dcbd86fc3 Implement auto test 2021-10-31 19:03:05 +08:00
37 changed files with 361 additions and 153 deletions

View File

@@ -0,0 +1,24 @@
name: 'Automatic Test'
description: 'Check for obvious errors.'
runs:
using: "composite"
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/build-love
with:
file-path: Techmino.love
- name: Download love
shell: bash
run: |
curl -L https://github.com/love2d/love/releases/download/11.3/love-11.3-linux-x86_64.tar.gz | tar xz
- name: Prepare PulseAudio
shell: bash
run: |
sudo apt-get update
sudo apt-get install pulseaudio pulseaudio-utils pavucontrol alsa-oss alsa-utils -y
- name: Run automated test
uses: GabrielBB/xvfb-action@v1
with:
run: |
./dest/love Techmino.love --test

View File

@@ -27,6 +27,12 @@ jobs:
echo "::set-output name=code::$(lua .github/workflows/getVersion.lua -code)"
echo "::set-output name=commit::$(git rev-parse --short ${{ GITHUB.SHA }})"
automatic-test:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/automatic-test
build-windows:
runs-on: windows-latest
needs: get-info
@@ -121,6 +127,7 @@ jobs:
build-iOS:
runs-on: macos-latest
if: (!startsWith( github.ref , 'refs/heads/ci-')) || startsWith( github.ref , 'refs/heads/ci-ios-')
needs: get-info
steps:
- uses: actions/checkout@v2

View File

@@ -1,22 +1,23 @@
if arg[1]=="-apkCode"then
local arg=arg[1]
if arg=="-apkCode"then
local code=require"version".apkCode
print(code)
elseif arg[1]=="-code"then
elseif arg=="-code"then
local str=require"version".code
print(str)
elseif arg[1]=="-name"then
elseif arg=="-name"then
local str=require"version".string
print(str)
elseif arg[1]=="-release"then
elseif arg=="-release"then
local str=require"version".string:gsub("V","",1)
print(str)
elseif arg[1]=="-updateTitle"then
elseif arg=="-updateTitle"then
local note=require"parts.updateLog"
local p1=note:find("\n%d")+1
local p2=note:find("\n",p1)-1
note=note:sub(p1,p2)
print(note)
elseif arg[1]=="-updateNote"then
elseif arg=="-updateNote"then
local note=require"parts.updateLog"
local p1=note:find("\n",note:find("\n%d")+1)+1
local p2=note:find("\n%d",p1+1)

View File

@@ -14,6 +14,7 @@ jobs:
code: ${{ steps.actual-get-info.outputs.code }}
release: ${{ steps.actual-get-info.outputs.release }}
updateTitle: ${{ steps.actual-get-info.outputs.updateTitle }}
updateNote: ${{ steps.actual-get-info.outputs.updateNote }}
commit: ${{ steps.actual-get-info.outputs.commit }}
steps:
- uses: actions/checkout@v2
@@ -23,11 +24,16 @@ jobs:
- name: Get Version
id: actual-get-info
run: |
UPDATE_NOTE=$(lua .github/workflows/getVersion.lua -updateNote)
UPDATE_NOTE="${UPDATE_NOTE//'%'/'%25'}"
UPDATE_NOTE="${UPDATE_NOTE//$'\n'/'%0A'}"
UPDATE_NOTE="${UPDATE_NOTE//$'\r'/'%0D'}"
echo "::set-output name=name::$(lua .github/workflows/getVersion.lua -name)"
echo "::set-output name=apkCode::$(lua .github/workflows/getVersion.lua -apkCode)"
echo "::set-output name=code::$(lua .github/workflows/getVersion.lua -code)"
echo "::set-output name=release::$(lua .github/workflows/getVersion.lua -release)"
echo "::set-output name=updateTitle::$(lua .github/workflows/getVersion.lua -updateTitle)"
echo "::set-output name=updateNote::$UPDATE_NOTE"
echo "::set-output name=commit::$(git rev-parse --short ${{ GITHUB.SHA }})"
build-windows-x64:
@@ -160,7 +166,7 @@ jobs:
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.macOS.zip
files: Techmino.a${{ needs.get-info.outputs.release }}.macOS.dmg
build-iOS:
runs-on: macos-latest
@@ -176,7 +182,7 @@ jobs:
APPLE_API_ISSUER: '${{ secrets.APPLE_API_ISSUER }}'
APPLE_API_KEY: '${{ secrets.APPLE_API_KEY }}'
APPLE_APP_BUILD: '${{ needs.get-info.outputs.code }}.0.${{ github.run_number }}.${{ github.run_attempt }}'
APPLE_APP_CHANGELOG: '${{ github.event.commits[0].message }}'
APPLE_APP_CHANGELOG: '${{ needs.get-info.outputs.updateNote }}'
APPLE_APP_ID: '${{ secrets.APPLE_APP_ID }}'
APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
APPLE_APP_PROFILE: '${{ secrets.APPLE_APP_PROFILE }}'
@@ -216,16 +222,8 @@ jobs:
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Install lua
run: |
sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install lua5.3 -y
- name: Get ReleaseNote
run: |
lua .github/workflows/getVersion.lua -updateNote > updateNote.txt
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
body_path: updateNote.txt
body: ${{ needs.get-info.outputs.updateNote }}

View File

@@ -9,6 +9,8 @@ TABLE= require'Zframework.tableExtend'
STRING= require'Zframework.stringExtend'
PROFILE= require'Zframework.profile'
JSON= require'Zframework.json'
TEST= require'Zframework.test'
do--Add pcall & MES for JSON lib
local encode,decode=JSON.encode,JSON.decode
JSON.encode=function(val)

12
Zframework/test.lua Normal file
View File

@@ -0,0 +1,12 @@
local TEST={}
--Wait for the scene swapping animation to finish
function TEST.switchSCN()
while SCN.swapping do YIELD()end
end
function TEST.wait(frames)
for _=1,frames do YIELD()end
end
return TEST

View File

@@ -592,22 +592,22 @@ if TABLE.find(arg,'--test')then
TASK.new(function()
while not LOADED do YIELD()end
print("\27[92m\27[1mAutomatic Test Started\27[0m")
LOG("\27[92m\27[1mAutomatic Test Started\27[0m")
BGM.setVol(0)SFX.setVol(0)
love.keypressed('space')
while SCN.swapping do YIELD()end
TEST.switchSCN()
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
LOG("Scanning mode: "..mode.name)
loadGame(mode.name,true)
TEST.switchSCN()
SCN.back()
while SCN.swapping do YIELD()end
TEST.switchSCN()
end
end
print("\27[92m\27[1mAutomatic Test Passed :)\27[0m")
for _=1,60 do YIELD()end
LOG("\27[92m\27[1mAutomatic Test Passed :)\27[0m")
TEST.wait(60)
love.event.quit(0)
end)
TASK.new(function()
@@ -615,8 +615,8 @@ if TABLE.find(arg,'--test')then
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
LOG("\27[91m\27[1mAutomatic Test Failed :(\27[0m\nThe error message is:\n"..table.concat(ERRDATA[1].mes,"\n").."\27[91m\nAborting\27[0m")
TEST.wait(60)
love.event.quit(1)
end)
end

View File

@@ -61,7 +61,7 @@ function back.draw()
gc.setColor(wingColor[i])
local B=crystals[i]
gc.draw(crystal_img,B.x,B.y,B.a,k,k,21,0)
B=crystals[17-i]
B=crystals[8+i]
gc.draw(crystal_img,B.x,B.y,B.a,-k,k,21,0)
end
end

View File

@@ -1,21 +0,0 @@
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

@@ -1,22 +0,0 @@
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

@@ -0,0 +1,22 @@
return{
fieldH=20,
fillClear=false,
mesDisp=function(P)
setFont(60)
mStr(P.stat.row,63,280)
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,20,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
local h=20-cc-P.garbageBeneath
if h>0 then
P:garbageRise(21,h,2e10-1)
if P.garbageBeneath>=20 then
P:lose()
end
end
end
end,
}

View File

@@ -0,0 +1,22 @@
return{
fieldH=21,
fillClear=false,
mesDisp=function(P)
setFont(60)
mStr(P.stat.row,63,280)
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,18,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
local h=20-cc-P.garbageBeneath-2
if h>0 then
P:garbageRise(21,h,2e10-1)
if P.garbageBeneath>=20 then
P:lose()
end
end
end
end,
}

View File

@@ -0,0 +1,22 @@
return{
fieldH=21,
fillClear=false,
mesDisp=function(P)
setFont(60)
mStr(P.stat.row,63,280)
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,17,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
local h=20-cc-P.garbageBeneath-3
if h>0 then
P:garbageRise(21,h,2e10-1)
if P.garbageBeneath>=20 then
P:lose()
end
end
end
end,
}

View File

@@ -10,6 +10,7 @@ local int,rnd=math.floor,math.random
local SETTING,GAME,SCR=SETTING,GAME,SCR
local PLAYERS=PLAYERS
local playSFX=SFX.play
@@ -173,6 +174,38 @@ function royaleLevelup()
end
end
end
--Sound shortcuts
function playClearSFX(cc)
if cc<=0 or cc%1~=0 then return end
if cc<=4 then
playSFX('clear_'..cc)
elseif cc<=6 then
playSFX('clear_4')
elseif cc<=12 then
playSFX('clear_4',.8)
if cc<=9 then
Snd('bass','A3','E4')
else
Snd('bass','A3','E4','A4')
end
elseif cc<=16 then
playSFX('clear_5',.7)
if cc<=14 then
Snd('bass',.8,'A3','E4')Snd('lead','A4','E5')
else
Snd('bass',.8,'A3','G4')Snd('lead','B4','G5')
end
else
playSFX('clear_6',.6)
if cc==17 then Snd('bass',.8,'A3','A4')Snd('lead','E5','G5')
elseif cc==18 then Snd('bass',.7,'A4')Snd('lead',.8,'C4','G5')Snd('bell','D5')
elseif cc==19 then Snd('bass',.7,'A4')Snd('lead',.8,'A4','E5')Snd('bell','B5')
elseif cc==20 then Snd('bass',.7,'A4')Snd('lead',.8,'A4','E4')Snd('bell','D5','B5','G6')
else Snd('bass',.7,'A4')Snd('lead',.8,'A4','E4')Snd('bell','B5','E6','A6')
end
end
end
function playReadySFX(i)
if i==3 then
Snd('bass','A3')
@@ -364,7 +397,7 @@ function loadGame(mode,ifQuickPlay,ifNet)--Load a mode and go to game scene
local modeText=text.modes[mode]or{"["..MODES[mode].name.."]",""}
TEXTOBJ.modeName:set(modeText[1].." "..modeText[2])
SCN.go('game',ifQuickPlay and'swipeD'or'fade_togame')
SFX.play('enter')
playSFX('enter')
end
end
end
@@ -428,7 +461,7 @@ function gameOver()--Save record
P:_showText(text.newRecord,0,-100,100,'beat',.5)
if SETTING.autoSave and DATA.saveReplay()then
GAME.saved=true
SFX.play('connected')
playSFX('connected')
MES.new('check',text.saveDone)
end
end

View File

@@ -958,7 +958,7 @@ return{
{"Mew",
"mew tieba forum",
"help",
"",--TODO
"The Mew forum owned by Chinese Tetris Research Community, and was founded in the second half of 2021. Mew is a Chinese social media that can be thought of a combination of Discord and Reddit, with many channels in a big community. Users can chat in the channels or submit posts to the channel. Mew also has a function called \"Library\" which allows storing documentations systematically. The Tetris Mew forum is currently under construction and not too much contents are available (2/Nov/2021).",
"https://mew.fun/n/tetris",
},
{"Tetris OL Servers",
@@ -1066,7 +1066,7 @@ return{
{"Furea",
"furea fuleiya jk",
"name",
"(ふれあ)\n\nOne of the top players.\nWorld record holder of Puyo Puyo Tetris's Sprint mode and Ultra mode.",
"(ふれあ)\n\nOne of the top players.\nWorld record holder of Puyo Puyo Tetris's Ultra mode.",
},
{"Iljain",
"iljain yijianlian",
@@ -1193,7 +1193,7 @@ return{
{"他天一",
"tty tatianyi hydrofierus",
"name",
"(Tā Tiān Yī)\n\nTetris Research community member.\nPersonal bests: Sprint 22.72 seconds, U rank on Tetr.io.\nOne of the top players of Tetris in China.",
"(Tā Tiān Yī)\n\nTetris Research community member.\nPersonal bests: Sprint 21.908 seconds, U rank on Tetr.io.\nOne of the top players of Tetris in China.",
"https://space.bilibili.com/3895759",
},
{"Mars608",
@@ -1205,7 +1205,7 @@ return{
{"Mifu",
"mifu swl nanmaomao",
"name",
"Originally known as swl.\nPersonal bests: Sprint 32 seconds, Tetris Research community member.\nMiya's Tetris coach. Miya made an animated character art for him called Mifu, meaning \"Miya's Shifu\".",
"Originally known as swl.\nPersonal bests: Sprint 28.445 seconds, Tetris Research community member.\nMiya's Tetris coach. Miya made an animated character art for him called Mifu, meaning \"Miya's Shifu\".",
"https://space.bilibili.com/109356367",
},
{"ZXC",
@@ -1247,7 +1247,7 @@ return{
{"琳雨空",
"linyukong",
"name",
"(Lín Yǔ Kong)\n\nTetris Research community member.\nSprint 38.3 seconds, S Rank in pentomino mode and Blind-WTF (world No.1)",
"(Lín Yǔ Kong)\n\nTetris Research community member.\nSprint 38.3 seconds, Highest Rank in pentomino mode and Blind-WTF (world No.1)",
"https://space.bilibili.com/263909369",
},
{"子心Koishi",

View File

@@ -1101,12 +1101,12 @@ return{
{"Furea",
"furea fuleiya jk",
"name",
"一流玩家PPT的40L和Ultra的WR保持者。",
"一流玩家PPT的Ultra的WR保持者。",
},
{"Iljain",
"iljain yijianlian",
"name",
"一流玩家得过C2 Rank1",
"一流玩家得过C2 Rank1",
},
{"Jonas",
"jonas",
@@ -1225,7 +1225,7 @@ return{
{"他天一",
"他天一 tty tatianyi hydrofierus t512",
"name",
"【研究群】「T512」\n其他名称Hydrofierus\n40L 22.72sio段位X\nC2/SRS对战水平国内一流\n常用定式tki 开局pc",
"【研究群】「T512」\n其他名称Hydrofierus\n40L 21.908sio段位X\nC2/SRS对战水平国内一流\n常用定式tki 开局pc",
"https://space.bilibili.com/3895759",
},
{"Mars608",
@@ -1237,7 +1237,7 @@ return{
{"Mifu",
"mifu swl nanmaomao t616",
"name",
"【研究群】「T616」\n40L 32s\nvupmiya的哥哥",
"【研究群】「T616」\n40L 28.445s\nvupmiya的哥哥",
"https://space.bilibili.com/109356367",
},
{"ZXC",
@@ -1285,7 +1285,7 @@ return{
{"琳雨空",
"琳雨空 linyukong t1505",
"name",
"【研究群】「T1505」\n40L 38.3s,五连块S,黑屏隐形S(世界首位)",
"【研究群】「T1505」\n40L 38.3s,五连块最高评级,黑屏隐形最高评级(世界首位)",
"https://space.bilibili.com/263909369",
},
{"子心",

View File

@@ -21,7 +21,8 @@ return{
powerUp={[0]="+000%","+025%","+050%","+075%","+100%"},
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!!","15 Combo!!","16 Combo!!","17 Combo!!!","18 Combo!!!","19 Combo!!!","MEGACMB"},
spin="-spin",
clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash"},
clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash","Heptacrash","Octacrash","Nonacrash","Decacrash","Undecacrash","Dodecacrash","Tridecacrash","Tetradecacrash","Pentadecacrash","Hexadecacrash","Heptadecacrash","Octadecacrash","Nonadecacrash","Ultracrash","Impossicrash"},
cleared="$1 lines",
mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Hemi-Perfect Clear",
replaying="[Replay]",

View File

@@ -10,7 +10,8 @@ return{
royale_remain="$1 Jugadores Restantes",
cmb={nil,"Combo de 1","Combo de 2","Combo de 3","Combo de 4","Combo de 5","Combo de 6","Combo de 7","Combo de 8","Combo de 9","¡Combo de 10!","¡Combo de 11!","¡Combo de 12!","¡Combo de 13!","¡Combo de 14!","¡Combo de 15!","¡Combo de 16!","¡Combo de 17!","¡Combo de 18!","¡Combo de 19!","MEGACOMBO"},
spin="-spin",
clear={"Single","Doble","Triple","Techrash","Pentacrash","Hexacrash"},
clear={"Single","Doble","Triple","Techrash","Pentacrash","Hexacrash","Heptacrash","Octacrash","Nonacrash","Decacrash","Undecacrash","Dodecacrash","Tridecacrash","Tetradecacrash","Pentadecacrash","Hexadecacrash","Heptadecacrash","Octadecacrash","Nonadecacrash","Ultracrash","Impossicrash"},
-- cleared="$1 lines",
mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Half Clear",
replaying="[Repetición]",

View File

@@ -10,7 +10,8 @@ return{
royale_remain="$1 Joueurs restants",
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!!","15 Combo!!","16 Combo!!","17 Combo!!!","18 Combo!!!","19 Combo!!!","MEGACMB"},
spin="-spin",
clear={"Simple","Double","Triple","Techrash","Pentacrash","Hexacrash"},
clear={"Simple","Double","Triple","Techrash","Pentacrash","Hexacrash","Heptacrash","Octacrash","Nonacrash","Decacrash","Undecacrash","Dodecacrash","Tridecacrash","Tetradecacrash","Pentadecacrash","Hexadecacrash","Heptadecacrash","Octadecacrash","Nonadecacrash","Ultracrash","Impossicrash"},
-- cleared="$1 lines",
mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Clear",
replaying="[Replay]",

View File

@@ -11,7 +11,8 @@ return{
royale_remain="$1 Jogadores restantes",
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!!","15 Combo!!","16 Combo!!","17 Combo!!!","18 Combo!!!","19 Combo!!!","MEGACMB"},
spin="-spin",
clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash"},
clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash","Heptacrash","Octacrash","Nonacrash","Decacrash","Undecacrash","Dodecacrash","Tridecacrash","Tetradecacrash","Pentadecacrash","Hexadecacrash","Heptadecacrash","Octadecacrash","Nonadecacrash","Ultracrash","Impossicrash"},
-- cleared="$1 lines",
mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Clear",
replaying="[Replay]",

View File

@@ -5,7 +5,8 @@ return{
royale_remain="$1 ~",
cmb={nil,"!","!!","!!!","!!!!","!!!!!","!!!!!!","!!!!!!!","!!!!!!!!","!!!!!!!!!","!!!!!!!!!!","!!!!!!!!!!!","!!!!!!!!!!!!","!!!!!!!!!!!!!","!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!!!",},
spin=" ~",
clear={"1","2","3","4","5","6"},
clear={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","20+"},
cleared="",
mini="v",b2b="^ ",b3b="^^ ",
PC="#<>#",HPC="<>",
replaying="[R]",

View File

@@ -15,7 +15,8 @@ return{fallback='zh',
royale_remain="剩 $1 人",
cmb={nil,"1连","2连","3连","4连","5连","6连","7连","8连","9连","10连!","11连!","12连!","13连!","14连!","15连!","16连!","17连!","18连!","19连!","Very 连"},
spin="",
clear={"消一","消二","消三","消四","卧槽","离谱"},
clear={"消一","消二","消三","消四","消五","消六","消七","消八","消九","消十","消十一","消十二","消十三","消十四","消十五","消十六","消十七","消十八","消十九","消二十","消超二十"},
cleared="",
mini="",b2b="牛逼",b3b="很牛逼",
PC="消干净了",HPC="消了半截",

View File

@@ -21,7 +21,8 @@ return{
powerUp={[0]="000%UP","025%UP","050%UP","075%UP","100%UP"},
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo","11 Combo","12 Combo","13 Combo","14 Combo","15 Combo","16 Combo","17 Combo","18 Combo","19 Combo","MEGACMB"},
spin="-spin",
clear={"single","double","triple","Techrash","Pentacrash","Hexacrash"},
clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash","Heptacrash","Octacrash","Nonacrash","Decacrash","Undecacrash","Dodecacrash","Tridecacrash","Tetradecacrash","Pentadecacrash","Hexadecacrash","Heptadecacrash","Octadecacrash","Nonadecacrash","Ultracrash","Impossicrash"},
cleared="$1 lines",
mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Half Clear",
replaying="[回放]",
@@ -556,7 +557,7 @@ return{
arrow="",
now="正在播放:",
bgm="BGM",
bgm="音乐",
sound="音效室",
},
launchpad={

View File

@@ -1,7 +1,8 @@
return{
cmb={nil,"1连击","2连击","3连击","4连击","5连击","6连击","7连击","8连击","9连击","10连击!","11连击!","12连击!","13连击!","14连击!","15连击!","16连击!","17连击!","18连击!","19连击!","巨型连击"},
spin="型回旋",
clear={"单清","双清","三清","四清","五清","六清"},
clear={"单清","双清","三清","四清","五清","六清","七清","八清","九清","十清","十一清","十二清","十三清","十四清","十五清","十六清","十七清","十八清","十九清","二十清","超二十清"},
cleared="",
mini="迷你",b2b="满贯",b3b="大满贯",
PC="场地全清",HPC="场地半清",

View File

@@ -22,7 +22,8 @@ return{
powerUp={[0]="+000%","+025%","+050%","+075%","+100%"},
cmb={nil,"1连击","2连击","3连击","4连击","5连击","6连击","7连击","8连击","9连击","10连击","11连击","12连击","13连击","14连击","15连击","16连击","17连击","18连击","19连击","巨大连击"},
spin="-旋转",
clear={"单身的","双重的","三倍的","技术崩溃","五角碰撞","六面体碎裂"},
clear={"单身的","双重的","三倍的","技术崩溃","五角碰撞","六面体碎裂","七冲击","八度碰撞","非碰撞","十点崩溃","不祥","十二面体碰撞","三十年代的崩溃","十四烷","十五烷碰撞","十六进制","七烷酸","十八进制崩溃","非十进制碰撞","超级崩溃","冒牌货"},
cleared="",
mini="迷你",b2b="背靠背",b3b="背靠背靠背",
PC="清清楚楚",HPC="半完美清晰",
replaying="[重播]",

View File

@@ -47,7 +47,7 @@ return{
PLY.newPlayer(1)
local P1=PLAYERS[1]
for _=1,8 do
P1:garbageRise(13,1,generateLine(P1.holeRND:random(10)))
P1:garbageRise(13,1,P1:getHolePos())
end
P1.fieldBeneath=0
end,

View File

@@ -6,7 +6,7 @@ return{
garbageSpeed=30,
highCam=false,
seqData={1,2,3,4,5,6,7},
eventSet='stack_100',
eventSet='stack_e',
bg='blockrain',bgm='there',
},
score=function(P)return{P.stat.row,P.stat.time}end,
@@ -16,10 +16,10 @@ return{
local L=P.stat.row
return
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
L>=175 and 4 or
L>=150 and 3 or
L>=120 and 2 or
L>=90 and 1 or
L>=30 and 0
end,
}

View File

@@ -3,11 +3,10 @@ return{
env={
drop=60,lock=60,
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},
eventSet='stack_50',
eventSet='stack_h',
bg='blockrain',bgm='there',
},
score=function(P)return{P.stat.row,P.stat.time}end,
@@ -20,7 +19,7 @@ return{
L>=70 and 4 or
L>=60 and 3 or
L>=50 and 2 or
L>=40 and 1 or
L>=35 and 1 or
L>=20 and 0
end,
}

View File

@@ -3,11 +3,10 @@ return{
env={
drop=60,lock=60,
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},
eventSet='stack_50',
eventSet='stack_u',
bg='blockrain',bgm='there',
},
score=function(P)return{P.stat.row,P.stat.time}end,

View File

@@ -627,20 +627,29 @@ local function _drawStartCounter(time)
time=179-time
gc_push('transform')
gc_translate(300,300)
local r,g,b
local num=int(time/60)+1
local d=time%60
if num==3 then
gc_setColor(.7,.8,.98)
r,g,b=.7,.8,.98
if d>45 then gc_rotate((d-45)^2*.00355)end
elseif num==2 then
gc_setColor(.98,.85,.75)
r,g,b=.98,.85,.75
if d>45 then gc_scale(1+(d/15-3)^2,1)end
elseif num==1 then
gc_setColor(1,.7,.7)
r,g,b=1,.7,.7
if d>45 then gc_scale(1,1+(d/15-3)^2)end
end
if d<20 then gc_scale((d/20)^.4)end
setFont(100)
gc_setColor(r,g,b,d/60)
gc_push('transform')
gc_scale((1.5-d/60*.6)^1.5)
mStr(num,0,-70)
gc_pop()
gc_setColor(r,g,b)
gc_scale(min(d/20,1)^.4)
mStr(num,0,-70)
gc_pop()
end
@@ -649,16 +658,26 @@ local draw={}
draw.drawGhost=drawGhost
draw.applyField=_applyField
draw.cancelField=_cancelField
function draw.drawTargetLine(P,r)
if r<=20+(P.fieldBeneath+P.fieldUp+10)/30 and r>0 then
function draw.drawTargetLine(P,h)
if h<=20+(P.fieldBeneath+P.fieldUp+10)/30 and h>0 then
gc_setLineWidth(3)
gc_setColor(1,r>10 and 0 or .2+.8*rnd(),.5)
gc_setColor(1,h>10 and 0 or .2+.8*rnd(),.5)
_applyField(P)
r=600-30*r
h=600-30*h
if P.falling~=-1 then
r=r-#P.clearingRow*(P.gameEnv.smooth and(P.falling/(P.gameEnv.fall+1))^1.6*30 or 30)
h=h-#P.clearingRow*(P.gameEnv.smooth and(P.falling/(P.gameEnv.fall+1))^1.6*30 or 30)
end
gc_line(0,r,300,r)
gc_line(0,h,300,h)
_cancelField()
end
end
function draw.drawMarkLine(P,h,r,g,b,a)
if h<=20+(P.fieldBeneath+P.fieldUp+10)/30 and h>0 then
gc_setLineWidth(4)
gc_setColor(r,g,b,a)
_applyField(P)
h=600-30*h
gc_line(0,h,300,h)
_cancelField()
end
end

View File

@@ -621,7 +621,7 @@ function Player:lock()
end
end
function Player:checkClear(field,start,height,CB,CX)
function Player:_checkClear(field,start,height,CB,CX)
local cc,gbcc=0,0
for i=1,height do
local h=start+i-2
@@ -653,7 +653,7 @@ function Player:checkClear(field,start,height,CB,CX)
end
return cc,gbcc
end
function Player:roofCheck()
function Player:_roofCheck()
local CB=self.cur.bk
for x=1,#CB[1]do
local y=#CB
@@ -672,7 +672,7 @@ function Player:roofCheck()
end
return false
end
function Player:removeClearedLines()
function Player:_removeClearedLines()
for i=#self.clearedRow,1,-1 do
local h=self.clearedRow[i]
if self.field[h].garbage then
@@ -710,7 +710,7 @@ function Player:checkMission(piece,mission)
return false
end
local spawnSFX_name={}for i=1,7 do spawnSFX_name[i]='spawn_'..i end
local spawnSFX_name={'spawn_1','spawn_2','spawn_3','spawn_4','spawn_5','spawn_6','spawn_7'}
function Player:resetBlock()--Reset Block's position and execute I*S
local C=self.cur
local sc=C.RS.centerPos[C.id][C.dir]
@@ -1062,8 +1062,17 @@ function Player:cancel(N)--Cancel Garbage
end
return off
end
do--Player.drop(self)--Place piece
local clearSCR={80,200,400}--Techrash:1K; B2Bmul:1.3/1.8
--Player.drop(self)--Place piece
--Player:clearFilledLines(start,height)
do
local clearSCR=setmetatable({--B2Bmul:1.3/1.8
80,200,400,1000,--1~4
1500,2000,2300,2600,3000,3400,--5~10
3800,4200,4600,5000,5500,6000,--11~16
6500,7000,7500,8000,--17~20
10000,11500,13000,14500,16000--21~25
},{__index=function(self,k)self[k]=20000 return 20000 end})
local spinSCR={
{200,750,1300,2000},--Z
{200,750,1300,2000},--S
@@ -1083,7 +1092,6 @@ do--Player.drop(self)--Place piece
local spinVoice={'zspin','sspin','jspin','lspin','tspin','ospin','ispin','zspin','sspin','pspin','qspin','fspin','espin','tspin','uspin','vspin','wspin','xspin','jspin','lspin','rspin','yspin','nspin','hspin','ispin','ispin','cspin','ispin','ospin'}
local clearVoice={'single','double','triple','techrash','pentacrash','hexacrash'}
local spinSFX={[0]='spin_0','spin_1','spin_2'}
local clearSFX={'clear_1','clear_2','clear_3','clear_4','clear_5','clear_6'}
local renSFX={}for i=1,11 do renSFX[i]='ren_'..i end
local finesseList={
{
@@ -1241,7 +1249,7 @@ do--Player.drop(self)--Place piece
--Check line clear
if self.gameEnv.fillClear then
local _cc,_gbcc=self:checkClear(self.field,CY,#CB,CB,CX)
local _cc,_gbcc=self:_checkClear(self.field,CY,#CB,CB,CX)
cc,gbcc=cc+_cc,gbcc+_gbcc
end
@@ -1272,10 +1280,10 @@ do--Player.drop(self)--Place piece
end
--Finesse: roof check
local finesse=CY>ENV.fieldH-2 or self:roofCheck()
local finesse=CY>ENV.fieldH-2 or self:_roofCheck()
--Remove rows need to be cleared
self:removeClearedLines()
self:_removeClearedLines()
--Cancel top clearing FX & get clear flag
clear=self:removeTopClearingFX()
@@ -1370,7 +1378,7 @@ do--Player.drop(self)--Place piece
VOC.play(spinVoice[C.name],CHN)
end
elseif cc>=4 then
cscore=cc==4 and 1000 or cc==5 and 1500 or 2000
cscore=clearSCR[cc]
if self.b2b>800 then
self:showText(text.b3b..text.clear[cc],0,-30,50,'fly')
atk=4*cc-10
@@ -1519,7 +1527,7 @@ do--Player.drop(self)--Place piece
--SFX & Vibrate
if self.sound then
SFX.play(clearSFX[cc])
playClearSFX(cc)
SFX.play(renSFX[min(cmb,11)],.75)
if cmb>14 then
SFX.play('ren_mega',(cmb-10)*.1)
@@ -1650,6 +1658,21 @@ do--Player.drop(self)--Place piece
self:triggerDropEvents()
end
end
function Player:clearFilledLines(start,height)
local _cc,_gbcc=self:_checkClear(self.field,start,height)
if _cc>0 then
playClearSFX(_cc)
self:showText(text.clear[min(_cc,21)],0,0,75,'beat',.4)
if _cc>6 then self:showText(text.cleared:gsub("$1",_cc),0,55,30,'zoomout',.4)end
self:_removeClearedLines()
self.falling=self.gameEnv.fall
self.stat.row=self.stat.row+_cc
self.stat.dig=self.stat.dig+_gbcc
self.stat.score=self.stat.score+clearSCR[cc]
end
return _cc,_gbcc
end
end
function Player:loadAI(data)--Load AI params
self.bot=BOT.new(self,data)
@@ -2283,7 +2306,7 @@ function Player:revive()
SYSFX.newShade(1.4,self.fieldX,self.fieldY,300*self.size,610*self.size)
SYSFX.newRectRipple(2,self.fieldX,self.fieldY,300*self.size,610*self.size)
SYSFX.newRipple(2,self.x+(475+25*(self.life<3 and self.life or 0)+12)*self.size,self.y+(595+12)*self.size,20)
SFX.play('clear_3')
playClearSFX(3)
SFX.play('emit')
end
function Player:win(result)

View File

@@ -44,7 +44,15 @@ pad={x=140,y=65,page=1,
{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='hold'},{sfx='prehold'},
{samp={tag='clear_1',func=function()playClearSFX(1)end}},
{samp={tag='clear_2',func=function()playClearSFX(2)end}},
{samp={tag='clear_3',func=function()playClearSFX(3)end}},
{samp={tag='clear_4',func=function()playClearSFX(4)end}},
{samp={tag='clear_7',func=function()playClearSFX(7)end}},
{samp={tag='clear_10',func=function()playClearSFX(10)end}},
},
{{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'}},
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {}, {sfx='warning'},{sfx='reach'}, {sfx='pc'}},
@@ -63,8 +71,22 @@ pad={x=140,y=65,page=1,
{{}, {}, {}, {}, {}, {}, {}, {}},
},
{
{{}, {}, {}, {}, {sfx='move'}, {sfx='lock'}, {sfx='drop'}, {sfx='fall'},},
{{sfx='hold'}, {sfx='prehold'},{}, {}, {sfx='clear_1'}, {sfx='clear_2'}, {sfx='clear_3'}, {sfx='clear_4'},},
{
{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'},
{samp={tag='clear_1',func=function()playClearSFX(1)end}},
{samp={tag='clear_2',func=function()playClearSFX(2)end}},
{samp={tag='clear_3',func=function()playClearSFX(3)end}},
{samp={tag='clear_4',func=function()playClearSFX(4)end}},
{samp={tag='clear_7',func=function()playClearSFX(7)end}},
{samp={tag='clear_10',func=function()playClearSFX(10)end}},
},
{{voc='mini'}, {voc='b2b'}, {voc='b3b'}, {voc='perfect_clear'}, {voc='half_clear'}, {sfx='finesseError'}, {sfx='finesseError_long'}, {sfx='drop_cancel'},},
{{voc='zspin'}, {voc='sspin'}, {voc='jspin'}, {voc='lspin'}, {voc='tspin'}, {voc='ospin'}, {voc='ispin'}, {}},
{{voc='single'}, {voc='double'}, {voc='triple'},{voc='techrash'}, {sfx='ren_mega', vol=0.25},{sfx='ren_mega', vol=0.5},{sfx='ren_mega', vol=0.75},{sfx='ren_mega'}},
@@ -73,9 +95,34 @@ pad={x=140,y=65,page=1,
{{sfx='ren_9'}, {sfx='ren_10'}, {sfx='ren_11'},{sfx='ren_mega'}, {voc='win'}, {voc='lose'}, {sfx='win'}, {sfx='fail'}},
},
{
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{
{samp={tag='clear_1',func=function()playClearSFX(1)end}},
{samp={tag='clear_2',func=function()playClearSFX(2)end}},
{samp={tag='clear_3',func=function()playClearSFX(3)end}},
{samp={tag='clear_4',func=function()playClearSFX(4)end}},
{samp={tag='clear_5',func=function()playClearSFX(5)end}},
{samp={tag='clear_6',func=function()playClearSFX(6)end}},
{samp={tag='clear_7',func=function()playClearSFX(7)end}},
{samp={tag='clear_8',func=function()playClearSFX(8)end}},
},
{
{samp={tag='clear_9',func=function()playClearSFX(9)end}},
{samp={tag='clear_10',func=function()playClearSFX(10)end}},
{samp={tag='clear_11',func=function()playClearSFX(11)end}},
{samp={tag='clear_12',func=function()playClearSFX(12)end}},
{samp={tag='clear_13',func=function()playClearSFX(13)end}},
{samp={tag='clear_14',func=function()playClearSFX(14)end}},
{samp={tag='clear_15',func=function()playClearSFX(15)end}},
{samp={tag='clear_16',func=function()playClearSFX(16)end}},
},
{
{samp={tag='clear_17',func=function()playClearSFX(17)end}},
{samp={tag='clear_18',func=function()playClearSFX(18)end}},
{samp={tag='clear_19',func=function()playClearSFX(19)end}},
{samp={tag='clear_20',func=function()playClearSFX(20)end}},
{samp={tag='clear_20+',func=function()playClearSFX(21)end}},
{},{},{}
},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
@@ -206,12 +253,12 @@ function scene.draw()
gc_rectangle('line',x*80+2,(y-1)*80+2,76,76,5)
local k=pad[pad.page][y][x]
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.sfx then mStr(k.sfx,x*80+40,y*80-30)gc_circle('line',x*80+40,(y-1)*80+40,5)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.sfx then gc_circle('line',x*80+40,(y-1)*80+40,5)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

View File

@@ -23,9 +23,9 @@ local loadingThread=coroutine.wrap(function()
end
YIELD()
YIELD('loadSFX')SFX.load('media/effect/'..SETTING.sfxPack..'/')
YIELD('loadSample')SFX.loadSample{name='bass',path='media/sample/bass',base='A2'}
YIELD('loadSample')SFX.loadSample{name='lead',path='media/sample/lead',base='A3'}
YIELD('loadSample')SFX.loadSample{name='bell',path='media/sample/bell',base='A4'}
YIELD('loadSample')SFX.loadSample{name='bass',path='media/sample/bass',base='A2'}--A2~A4
YIELD('loadSample')SFX.loadSample{name='lead',path='media/sample/lead',base='A3'}--A3~A5
YIELD('loadSample')SFX.loadSample{name='bell',path='media/sample/bell',base='A4'}--A4~A6
YIELD('loadVoice')VOC.load('media/vocal/'..SETTING.vocPack..'/')
YIELD('loadFont')for i=1,17 do getFont(15+5*i)end

View File

@@ -152,8 +152,8 @@ end
scene.widgetList={
listBox,
WIDGET.newButton{name='export',x=200,y=640,w=70,color='lG',code=pressKey"cC",font=50,fText=CHAR.icon.export},
WIDGET.newButton{name='import',x=300,y=640,w=70,color='lN',code=pressKey"cV",font=50,fText=CHAR.icon.import},
WIDGET.newButton{name='export',x=180,y=640,w=140,h=80,color='lG',code=pressKey"cC",font=50,fText=CHAR.icon.export},
WIDGET.newButton{name='import',x=350,y=640,w=140,h=80,color='lN',code=pressKey"cV",font=50,fText=CHAR.icon.import},
WIDGET.newButton{name='play', x=700,y=640,w=170,h=80,color='lY',code=pressKey"return",font=65,fText=CHAR.icon.play},
WIDGET.newButton{name='delete',x=850,y=640,w=80,h=80,color='lR',code=pressKey"delete",font=50,fText=CHAR.icon.trash},
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},

View File

@@ -5,10 +5,15 @@ local sin=math.sin
local selRS
local minoRot={0,0,0,0,0,0,0}
local minoRot0={}
local selEggMode
local playEgg=WIDGET.newButton{name='playEgg', x=1140,y=540,w=140,h=65,color='lP',font=60,fText=CHAR.icon.rankZ,code=function()loadGame(selEggMode,true)end}
local scene={}
function scene.sceneInit()
selEggMode=false
scene.widgetList.playEgg.hide=true
BG.set()
selRS=RSlist[SETTING.RS]
for i=1,7 do
@@ -59,14 +64,18 @@ end
local function _nextDir(i)
SETTING.face[i]=(SETTING.face[i]+1)%4
minoRot0[i]=minoRot0[i]+1.5707963
if not GAME.playing then
if not selEggMode and not GAME.playing then
if minoRot0[5]>62 then
loadGame('marathon_bfmax',true)
selEggMode='marathon_bfmax'
playEgg.color=COLOR.dR
elseif minoRot0[6]>62 then
loadGame('techrash_n',true)
selEggMode='techrash_n'
playEgg.color=COLOR.lP
elseif minoRot0[7]>62 then
loadGame('techrash_u',true)
selEggMode='techrash_u'
playEgg.color=COLOR.lY
end
playEgg.hide=not selEggMode
end
SFX.play('rotate')
end
@@ -115,6 +124,7 @@ scene.widgetList={
SFX.play('hold')
end},
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
playEgg,
}
return scene

View File

@@ -2,8 +2,8 @@ return[=[
未来模式:
任务树; 大爆炸; 拼方形; 限高无尽挖掘; 连击练习; 极简教程/考试
未来小游戏:
Tetro-1010(四/五连块, 2C2N, 若干回合改变重力方向)
Tetra-link(桌游); 噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管
Tetro-1010(四/五连块, 2C2N, 若干回合改变重力方向); Tetra-link(桌游)
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 数字记忆; 听声记忆
其他未来内容:
组队战; 实时统计数据可视化; 教学关; 从录像继续
重做模式选择UI; 重做模组UI; 加速下落; spike相关统计数据
@@ -22,25 +22,27 @@ return[=[
等级图标(暂时不能升级)
词典支持复制词条方便发给别人
修改堆叠模式玩法(自动清除之前记录)
添加消7~20和20+的消除文本与消除音效
改动:
暂时取消导入存档的版本限制(过早存档请不要导入!只能保证近两三个版本一定能用)
修改TRS的JL踢墙表的0-R和R-0最后几项和R/Y块的踢墙表(会导致部分录像无法正常播放)
移除组合键切换攻击模式功能,固定为单点切换
iOS设备支持三档振动(原来只有一档)
微调TRS的R/Y块踢墙表
调整模式地图右下角区域
移除极简评级的颜色
添加legals页面
应用更多定制字体
微调倒计时动画
修改wing背景
计算器可以弹琴了
词典添加一些词条
控制台可以查看日志
暂时取消导入存档的版本限制(过早存档请不要导入!只能保证近两三个版本一定能用)
修改TRS的JL踢墙表的0-R和R-0最后几项(可能会导致部分录像无法正常播放)
控制台可以查看运行日志
微调部分彩蛋模式进入方法
代码:
SFX模块大升级,支持播放乐器采样
整理大量代码
修复:
iOS上概率卡掉第一个触摸导致不能玩
无尽挖掘开局垃圾行可能会在同一列
生成AI玩家时没刷新20G开关
小程序uttt和calc的问题
"就这"语言的词典是英文

View File

@@ -1,5 +1,5 @@
return{
["apkCode"]=389,
["apkCode"]=392,
["code"]=1604,
["string"]="V0.16.4",
["room"]="ver A-0",