Compare commits
36 Commits
pre0.16.4-
...
pre0.16.4-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
990659ce91 | ||
|
|
00c602c844 | ||
|
|
9db62ffc39 | ||
|
|
e7c777e502 | ||
|
|
4991e8cea2 | ||
|
|
111d4e991f | ||
|
|
bedfa74a32 | ||
|
|
f6944dc223 | ||
|
|
a34a3051a3 | ||
|
|
0e13883faf | ||
|
|
e8860eda1b | ||
|
|
33ba4820b3 | ||
|
|
5ed0dda8ab | ||
|
|
bd260b2c6f | ||
|
|
aa01ab07f7 | ||
|
|
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
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
20
main.lua
20
main.lua
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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,
|
||||
}
|
||||
21
parts/eventsets/stack_e.lua
Normal file
21
parts/eventsets/stack_e.lua
Normal file
@@ -0,0 +1,21 @@
|
||||
return{
|
||||
fieldH=20,
|
||||
fillClear=false,
|
||||
mesDisp=function(P)
|
||||
setFont(60)
|
||||
mStr(P.stat.row,63,280)
|
||||
mText(TEXTOBJ.line,63,350)
|
||||
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,
|
||||
}
|
||||
21
parts/eventsets/stack_h.lua
Normal file
21
parts/eventsets/stack_h.lua
Normal file
@@ -0,0 +1,21 @@
|
||||
return{
|
||||
fieldH=21,
|
||||
fillClear=false,
|
||||
mesDisp=function(P)
|
||||
setFont(60)
|
||||
mStr(P.stat.row,63,280)
|
||||
mText(TEXTOBJ.line,63,350)
|
||||
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,
|
||||
}
|
||||
21
parts/eventsets/stack_u.lua
Normal file
21
parts/eventsets/stack_u.lua
Normal file
@@ -0,0 +1,21 @@
|
||||
return{
|
||||
fieldH=21,
|
||||
fillClear=false,
|
||||
mesDisp=function(P)
|
||||
setFont(60)
|
||||
mStr(P.stat.row,63,280)
|
||||
mText(TEXTOBJ.line,63,350)
|
||||
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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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="[重播]",
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ return[=[
|
||||
未来模式:
|
||||
任务树; 大爆炸; 拼方形; 限高无尽挖掘; 连击练习; 极简教程/考试
|
||||
未来小游戏:
|
||||
Tetro-1010(四/五连块, 2C2N, 若干回合改变重力方向)
|
||||
Tetra-link(桌游); 噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管
|
||||
Tetro-1010(四/五连块, 2C2N, 若干回合改变重力方向); Tetra-link(桌游)
|
||||
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 数字记忆; 听声记忆
|
||||
其他未来内容:
|
||||
组队战; 实时统计数据可视化; 教学关; 从录像继续
|
||||
重做模式选择UI; 重做模组UI; 加速下落; spike相关统计数据
|
||||
@@ -22,7 +22,9 @@ return[=[
|
||||
等级图标(暂时不能升级)
|
||||
词典支持复制词条方便发给别人
|
||||
修改堆叠模式玩法(自动清除之前记录)
|
||||
添加消7~20和20+的消除文本与消除音效
|
||||
改动:
|
||||
修改TRS的JL踢墙表的0-R和R-0最后几项(可能会导致部分录像无法正常播放)
|
||||
移除组合键切换攻击模式功能,固定为单点切换
|
||||
iOS设备支持三档振动(原来只有一档)
|
||||
微调TRS的R/Y块踢墙表
|
||||
@@ -35,7 +37,6 @@ return[=[
|
||||
词典添加一些词条
|
||||
控制台可以查看日志
|
||||
暂时取消导入存档的版本限制(过早存档请不要导入!只能保证近两三个版本一定能用)
|
||||
修改TRS的JL踢墙表的0-R和R-0最后几项(可能会导致部分录像无法正常播放)
|
||||
代码:
|
||||
SFX模块大升级,支持播放乐器采样
|
||||
整理大量代码
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
["apkCode"]=389,
|
||||
["apkCode"]=391,
|
||||
["code"]=1604,
|
||||
["string"]="V0.16.4",
|
||||
["room"]="ver A-0",
|
||||
|
||||
Reference in New Issue
Block a user