Compare commits
55 Commits
pre0.16.4-
...
v0.16.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
86edeb1e0c | ||
|
|
53b1852f28 | ||
|
|
e3c385693b | ||
|
|
572c0fbfa1 | ||
|
|
bbdf71167a | ||
|
|
2136ccd9a2 | ||
|
|
2131aea575 | ||
|
|
32b21c7d29 | ||
|
|
8f6f6f316f | ||
|
|
66f9ac2791 | ||
|
|
ac0ba90438 | ||
|
|
990659ce91 | ||
|
|
00c602c844 | ||
|
|
9db62ffc39 | ||
|
|
e7c777e502 | ||
|
|
4991e8cea2 | ||
|
|
111d4e991f | ||
|
|
bedfa74a32 | ||
|
|
f6944dc223 | ||
|
|
a34a3051a3 | ||
|
|
0e13883faf | ||
|
|
e8860eda1b | ||
|
|
33ba4820b3 | ||
|
|
5ed0dda8ab | ||
|
|
bd260b2c6f | ||
|
|
aa01ab07f7 | ||
|
|
684cb90a7d | ||
|
|
172101ed55 | ||
|
|
98b5914726 | ||
|
|
d1518e7ba4 | ||
|
|
72d4faa52a | ||
|
|
862dcbf806 | ||
|
|
3db28f5136 | ||
|
|
f9e37f3c6a | ||
|
|
c009893377 | ||
|
|
3ae128d4c3 | ||
|
|
cb2164c21d | ||
|
|
951b7407fc | ||
|
|
5a1fd0ca4d | ||
|
|
f4b85e0dbb | ||
|
|
c38bceb87e | ||
|
|
2569e8844e | ||
|
|
e42fa8351e | ||
|
|
9582a625ff | ||
|
|
81abb06f7b | ||
|
|
7cfea0eebe | ||
|
|
01c2bfe955 | ||
|
|
70242e6a07 | ||
|
|
c1edba974f | ||
|
|
546b3f230d | ||
|
|
14593eb487 | ||
|
|
838621a3ae | ||
|
|
283d4a5fce | ||
|
|
490cf44132 | ||
|
|
9dcbd86fc3 |
24
.github/actions/automatic-test/action.yml
vendored
Normal file
24
.github/actions/automatic-test/action.yml
vendored
Normal 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
|
||||
5
.github/actions/update-version/action.yml
vendored
5
.github/actions/update-version/action.yml
vendored
@@ -27,9 +27,10 @@ runs:
|
||||
import re
|
||||
with open('version.lua', 'r+', encoding='utf-8') as file:
|
||||
commitHash = '${{ inputs.commit }}'
|
||||
commitHash = commitHash[0:4] if commitHash != '' else '????'
|
||||
if commitHash != '':
|
||||
commitHash = '@' + commitHash[0:4]
|
||||
data = file.read()
|
||||
data = re.sub('(\d)"', r'\1@' + commitHash + '"', data)
|
||||
data = re.sub('(\d)"', r'\1' + commitHash + '"', data, 1)
|
||||
file.seek(0)
|
||||
file.truncate()
|
||||
file.flush()
|
||||
|
||||
7
.github/workflows/dev.yml
vendored
7
.github/workflows/dev.yml
vendored
@@ -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
|
||||
|
||||
13
.github/workflows/getVersion.lua
vendored
13
.github/workflows/getVersion.lua
vendored
@@ -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)
|
||||
|
||||
20
.github/workflows/release.yml
vendored
20
.github/workflows/release.yml
vendored
@@ -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 }}
|
||||
|
||||
@@ -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
12
Zframework/test.lua
Normal 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
|
||||
28
main.lua
28
main.lua
@@ -443,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
|
||||
@@ -584,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()
|
||||
@@ -607,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
|
||||
|
||||
@@ -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
|
||||
|
||||
22
parts/eventsets/stack_e.lua
Normal file
22
parts/eventsets/stack_e.lua
Normal 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,
|
||||
}
|
||||
22
parts/eventsets/stack_h.lua
Normal file
22
parts/eventsets/stack_h.lua
Normal 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,
|
||||
}
|
||||
22
parts/eventsets/stack_u.lua
Normal file
22
parts/eventsets/stack_u.lua
Normal 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,
|
||||
}
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -174,6 +175,56 @@ function royaleLevelup()
|
||||
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')
|
||||
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
|
||||
@@ -346,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
|
||||
@@ -410,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
|
||||
@@ -622,8 +673,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
|
||||
|
||||
@@ -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",
|
||||
"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",
|
||||
"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",
|
||||
@@ -1060,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",
|
||||
@@ -1187,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",
|
||||
@@ -1199,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",
|
||||
@@ -1241,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",
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
--存档管理
|
||||
{"控制台",
|
||||
@@ -1095,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",
|
||||
@@ -1219,7 +1225,7 @@ return{
|
||||
{"他天一",
|
||||
"他天一 tty tatianyi hydrofierus t512",
|
||||
"name",
|
||||
"【研究群】「T512」\n其他名称:Hydrofierus\n40L 22.72s,io段位X\nC2/SRS对战水平国内一流\n常用定式:tki 开局pc",
|
||||
"【研究群】「T512」\n其他名称:Hydrofierus\n40L 21.908s,io段位X\nC2/SRS对战水平国内一流\n常用定式:tki 开局pc",
|
||||
"https://space.bilibili.com/3895759",
|
||||
},
|
||||
{"Mars608",
|
||||
@@ -1231,7 +1237,7 @@ return{
|
||||
{"Mifu",
|
||||
"mifu swl nanmaomao t616",
|
||||
"name",
|
||||
"【研究群】「T616」\n40L 32s\nvup,miya的哥哥",
|
||||
"【研究群】「T616」\n40L 28.445s\nvup,miya的哥哥",
|
||||
"https://space.bilibili.com/109356367",
|
||||
},
|
||||
{"ZXC",
|
||||
@@ -1279,7 +1285,7 @@ return{
|
||||
{"琳雨空",
|
||||
"琳雨空 linyukong t1505",
|
||||
"name",
|
||||
"【研究群】「T1505」\n40L 38.3s,五连块S,黑屏隐形S(世界首位)",
|
||||
"【研究群】「T1505」\n40L 38.3s,五连块最高评级,黑屏隐形最高评级(世界首位)",
|
||||
"https://space.bilibili.com/263909369",
|
||||
},
|
||||
{"子心",
|
||||
|
||||
@@ -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]",
|
||||
|
||||
@@ -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]",
|
||||
|
||||
@@ -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]",
|
||||
|
||||
@@ -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]",
|
||||
|
||||
@@ -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]",
|
||||
|
||||
@@ -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="消了半截",
|
||||
|
||||
|
||||
@@ -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={
|
||||
|
||||
@@ -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="场地半清",
|
||||
|
||||
|
||||
@@ -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="[重播]",
|
||||
@@ -760,163 +761,4 @@ return{
|
||||
['custom_clear']= {"习俗", "正常"} ,
|
||||
['custom_puzzle']= {"习俗", "令人费解的"},
|
||||
},
|
||||
getTip={refuseCopy=true,
|
||||
"免费玩积木游戏与战斗皇家模式!",
|
||||
"你注意到什么了吗?\"旋转的\"去一个街区有什么用?",
|
||||
":pog:",
|
||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
||||
"\"技术米诺.app\"不能打开,因为开发人员无法证实。",
|
||||
"\\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连击,个人电脑!",
|
||||
"今天一定要再次尽你最大的努力!",
|
||||
"桥很快就清了!",
|
||||
"你能熟练掌握这个现代而又熟悉的堆垛机吗?",
|
||||
"我的杰作就在这颗心里。",
|
||||
"在不谐和上可以找到英语的变更日志",
|
||||
"颜色很快就会清晰!",
|
||||
"降低直连式存储和抗共振环速度更快,但更难控制",
|
||||
"我刚才看到的是背靠背靠背吗?",
|
||||
"不要让一个小故障毁掉你的一天!",
|
||||
"不要直接看虫子!",
|
||||
"享受技术米诺旋转系统!",
|
||||
"太好了,但下次我们要做得更好",
|
||||
"找出设置中的内容!",
|
||||
"有虫子吗? 在我们的GitHub页面上打开一个问题!",
|
||||
"git提交",
|
||||
"git推-f",
|
||||
"有什么建议吗?在我们的不谐和中发布它们!",
|
||||
"建议佩戴耳机以获得更好的体验",
|
||||
"你好,世界!",
|
||||
"I3和L3是仅有的两种独特的三聚体",
|
||||
"如果a==真",
|
||||
"提高帧速率以获得更好的体验",
|
||||
"初始[插入操作]系统可以节省您的时间",
|
||||
"无需左/右按钮即可完成40升",
|
||||
"没有旋转按钮也可以完成40升",
|
||||
"它真的在加载!不仅仅是一个剪贴画!",
|
||||
"sudo rm -rf /*",
|
||||
"加入我们的纷争吧!",
|
||||
"l-=-1",
|
||||
"让贝斯来踢!",
|
||||
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
|
||||
"低帧率减少你的游戏体验",
|
||||
"路亚一号",
|
||||
"快来了!",
|
||||
"大多数按钮图标是通过在Unicode私人使用地区中使用自绘制的符号来实现的",
|
||||
"这个游戏的音乐是使用Beepbox制作的",
|
||||
"音乐太让人分心了?你可以把它关掉",
|
||||
"如果您启用了简单化样式,则此菜单中没有复活节彩蛋!",
|
||||
"旋转三倍!",
|
||||
"哦哦哦哦哦哦哦哦!",
|
||||
"已计划在线模式-请耐心等待",
|
||||
"单枪匹马!",
|
||||
"玩得好需要一些时间!",
|
||||
"被爱冲昏头脑",
|
||||
"由联合国...LÖVE为动力",
|
||||
"pps-0.01",
|
||||
"服务器随机停机",
|
||||
"一些达到S级的要求被故意设定为即使是最好的球员也很难达到",
|
||||
"很快,你就可以和全世界的朋友和敌人比赛了",
|
||||
"马上就来!",
|
||||
"技术米诺=技术+特特罗米诺",
|
||||
"技术米诺有一个Nspire CX版本!",
|
||||
"技术米诺太有趣了!",
|
||||
"\"技术米诺.app\"会损坏你的电脑。你应该把它移到垃圾桶里。",
|
||||
"\"TechminOS\"",
|
||||
"四联词典现在有英文版本",
|
||||
"出现在员工页面后台的名字是我们赞助商的名单",
|
||||
"在技术米诺,堆垛机的未来是你的!",
|
||||
"在游戏中有许多隐藏的模式, 不能使用地图进入",
|
||||
"总共有18种不同的五分音符",
|
||||
"总共有7种不同的河豚",
|
||||
"尝试使用多个等待队列!",
|
||||
"尝试使用两个旋转按钮。使用这三种方法会更好",
|
||||
"警告:程序员艺术",
|
||||
"20件怎么样?",
|
||||
"100条生产线23件怎么样?",
|
||||
"26个热关断怎么样?",
|
||||
"这个便宜的界面和音乐是什么",
|
||||
"当(假)",
|
||||
"你是大师!",
|
||||
"欢迎您帮助我们制作血糖监测和特效!",
|
||||
"你可以把键盘连接到你的手机或平板电脑上(虽然在iOS上没有这个功能)",
|
||||
"可以在设置中自定义键映射!",
|
||||
"您可以将键盘连接到手机或平板电脑!",
|
||||
"您可以使用键盘浏览菜单,但仅限于此屏幕",
|
||||
"您可以从统计数据页面打开保存目录",
|
||||
"在这个游戏中,你可以用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,"也试试特拉里亚!"},
|
||||
{C.C,"也试试土后项目!"},
|
||||
{C.C,"也试试VVVVVV!"},
|
||||
{C.G,"绿色"},
|
||||
{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 =你打开应用程序之间切换"},
|
||||
{C.G,"Mac快捷键:Cmd-W=关闭前窗口"},
|
||||
{C.G,"Mac快捷键:Cmd-Z=取消上一条命令"},
|
||||
{C.G,"Mac快捷键:Cmd-,=打开前面应用程序的首选项"},
|
||||
{C.G,"Windows快捷键:Alt+F4=关闭活动窗口"},
|
||||
{C.G,"Windows快捷键:Alt+Tab=在窗口之间切换"},
|
||||
{C.G,"Windows快捷键:Backspace=转到前一个文件夹"},
|
||||
{C.G,"Windows快捷键:Ctrl+鼠标滚轮=缩放"},
|
||||
{C.G,"Windows快捷键:Ctrl+A=选择所有项目"},
|
||||
{C.G,"Windows快捷键:Ctrl+F=查找项目"},
|
||||
{C.G,"Windows快捷键:Ctrl+Tab=在选项卡之间切换"},
|
||||
{C.G,"Windows快捷键:Ctrl+W=关闭活动选项卡"},
|
||||
{C.G,"Windows快捷键:shift+del=永久删除文件"},
|
||||
{C.J,"玉石"},
|
||||
{C.L,"酸橙"},
|
||||
{C.lP,"秘密号码: 626"},
|
||||
{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.M,"品红色"},
|
||||
{C.N,"Lua",C.Z,"第一"},
|
||||
{C.N,"海军"},
|
||||
{C.O,"橙子"},
|
||||
{C.P,"紫色"},
|
||||
{C.P,"旋转!"},
|
||||
{C.R,"\"滥用数字千年版权法\""},
|
||||
{C.R,"\"知识产权法\""},
|
||||
{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,"月球接收实验室",C.G,"RlR",C.B,"最后贷款人",C.O,"区域铁路线",C.P,"存款准备金率",C.P,"微光",C.C,"熔丝制造",C.Y,"自由罗斯科电台",C.Y,"雨林基金会基金",C.Y,"雨林基金会基金"},
|
||||
{C.R,"红色"},
|
||||
{C.S,"海洋"},
|
||||
{C.V,"紫罗兰"},
|
||||
{C.W,"葡萄酒"},
|
||||
{C.Y,"旋转三倍!"},
|
||||
{C.Y,"黄色"},
|
||||
{C.Z,"什么?",C.lC,"Xspin?"},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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_e',
|
||||
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>=175 and 4 or
|
||||
L>=150 and 3 or
|
||||
L>=120 and 2 or
|
||||
L>=90 and 1 or
|
||||
L>=30 and 0
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -1,36 +1,25 @@
|
||||
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,
|
||||
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_h',
|
||||
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>=35 and 1 or
|
||||
L>=20 and 0
|
||||
end,
|
||||
}
|
||||
}
|
||||
@@ -1,36 +1,25 @@
|
||||
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,
|
||||
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_u',
|
||||
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,
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -621,40 +621,39 @@ function Player:lock()
|
||||
end
|
||||
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
|
||||
function Player:_checkClear(field,start,height,CB,CX)
|
||||
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()
|
||||
function Player:_roofCheck()
|
||||
local CB=self.cur.bk
|
||||
for x=1,#CB[1]do
|
||||
local y=#CB
|
||||
@@ -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
|
||||
@@ -695,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]
|
||||
@@ -1047,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
|
||||
@@ -1068,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={
|
||||
{
|
||||
@@ -1225,7 +1248,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
|
||||
@@ -1254,28 +1280,13 @@ 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
|
||||
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
|
||||
@@ -1367,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
|
||||
@@ -1516,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)
|
||||
@@ -1647,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)
|
||||
@@ -1888,24 +1914,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()
|
||||
@@ -2293,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)
|
||||
|
||||
@@ -37,8 +37,22 @@ pad={x=140,y=65,page=1,
|
||||
{0,0,0,0,0,0,0,0},
|
||||
},
|
||||
{
|
||||
{{}, {}, {}, {}, {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}},
|
||||
},
|
||||
{{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'}},
|
||||
@@ -57,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'}},
|
||||
@@ -67,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}},
|
||||
{},{},{}
|
||||
},
|
||||
{{},{},{},{},{},{},{},{}},
|
||||
{{},{},{},{},{},{},{},{}},
|
||||
{{},{},{},{},{},{},{},{}},
|
||||
@@ -108,6 +161,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
|
||||
@@ -199,12 +253,14 @@ 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
|
||||
end
|
||||
if pad.alpha[y][x]>0 then
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,17 +2,17 @@ return[=[
|
||||
未来模式:
|
||||
任务树; 大爆炸; 拼方形; 限高无尽挖掘; 连击练习; 极简教程/考试
|
||||
未来小游戏:
|
||||
Tetro-1010(四/五连块, 2C2N, 若干回合改变重力方向)
|
||||
Tetra-link(桌游); 噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管
|
||||
Tetro-1010(四/五连块, 2C2N, 若干回合改变重力方向); Tetra-link(桌游)
|
||||
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 数字记忆; 听声记忆
|
||||
其他未来内容:
|
||||
组队战; 实时统计数据可视化; 教学关; 从录像继续
|
||||
重做模式选择UI; 重做模组UI; 加速下落; spike相关统计数据
|
||||
更好的手柄支持; 场地格边缘线; 模式数据分析; 高级自定义序列
|
||||
支持更多手柄; 场地格边缘线; 模式数据分析; 高级自定义序列
|
||||
等级系统; 成就系统; Domain状态; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
|
||||
可调场地宽度; 可调攻击系统; 更多消除方式(隔断/架空/混合/彩色/穿墙)
|
||||
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统; 复杂的攻击系统
|
||||
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统; 无用货币
|
||||
可调攻击系统; 更多消除方式; 可调场地宽度
|
||||
工程编译到字节码; task-Z(新AI)
|
||||
无用货币; 收集向抽奖; 自适应UI; 多方块
|
||||
收集向抽奖; 自适应UI; 多方块
|
||||
|
||||
0.16.4: 虫洞 Wormhole
|
||||
新增:
|
||||
@@ -21,25 +21,28 @@ return[=[
|
||||
Next槽上方显示序列模式标记
|
||||
等级图标(暂时不能升级)
|
||||
词典支持复制词条方便发给别人
|
||||
修改堆叠模式玩法(自动清除之前记录)
|
||||
添加消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的问题
|
||||
"就这"语言的词典是英文
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
["apkCode"]=388,
|
||||
["apkCode"]=392,
|
||||
["code"]=1604,
|
||||
["string"]="V0.16.4",
|
||||
["room"]="ver A-0",
|
||||
|
||||
Reference in New Issue
Block a user