Compare commits
24 Commits
pre0.17.1-
...
pre0.17.2-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7a2124bb6 | ||
|
|
9399938be0 | ||
|
|
195f9b2c46 | ||
|
|
d7546e5f41 | ||
|
|
888909b48c | ||
|
|
d68f732884 | ||
|
|
5243ed0c6b | ||
|
|
856c490a2b | ||
|
|
5e9dcc27aa | ||
|
|
3f129a9585 | ||
|
|
e682ff1de5 | ||
|
|
2c064d5809 | ||
|
|
e0573382e8 | ||
|
|
5a514ce495 | ||
|
|
ba4fb00c85 | ||
|
|
ab02d2063f | ||
|
|
a6c87d3a1a | ||
|
|
f15541db4a | ||
|
|
dadd09d25a | ||
|
|
a7dea4dafe | ||
|
|
34ac5eed93 | ||
|
|
89134d4f07 | ||
|
|
58d068b776 | ||
|
|
dacefb2b01 |
4
.gitmodules
vendored
4
.gitmodules
vendored
@@ -1,3 +1,3 @@
|
||||
[submodule "Zframework"]
|
||||
path = Zframework
|
||||
url = git@github.com:26F-Studio/Zframework.git
|
||||
path = Zframework
|
||||
url = git@github.com:26F-Studio/Zframework.git
|
||||
|
||||
4
main.lua
4
main.lua
@@ -51,8 +51,8 @@ local _LOADTIME_=TIME()
|
||||
--Load modules
|
||||
Z=require'Zframework'
|
||||
FONT.load{
|
||||
norm='parts/fonts/proportional.ttf',
|
||||
mono='parts/fonts/monospaced.ttf',
|
||||
norm='parts/fonts/proportional.otf',
|
||||
mono='parts/fonts/monospaced.otf',
|
||||
}
|
||||
FONT.setDefault('norm')
|
||||
FONT.setFallback('norm')
|
||||
|
||||
BIN
media/effect/chiptune/achievement.ogg
Normal file
BIN
media/effect/chiptune/achievement.ogg
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -38,7 +38,7 @@ return{
|
||||
local D=P.modeData
|
||||
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
||||
if P.stat.row>=D.target then
|
||||
if D.target==110 then
|
||||
if D.target==100 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=2,2
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=2,2
|
||||
SFX.play('warn_1')
|
||||
|
||||
38
parts/eventsets/classic_l.lua
Normal file
38
parts/eventsets/classic_l.lua
Normal file
@@ -0,0 +1,38 @@
|
||||
return{
|
||||
das=16,arr=6,
|
||||
sddas=2,sdarr=2,
|
||||
irs=false,ims=false,
|
||||
drop=2,
|
||||
lock=2,
|
||||
wait=10,
|
||||
fall=25,
|
||||
freshLimit=0,
|
||||
fieldH=19,
|
||||
nextCount=1,holdCount=0,
|
||||
RS='Classic',
|
||||
sequence='rnd',
|
||||
noTele=true,
|
||||
keyCancel={5,6},
|
||||
mesDisp=function(P)
|
||||
setFont(75)
|
||||
local r=P.modeData.target*.1
|
||||
mStr(r<11 and 19 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
|
||||
mText(drawableText.speedLV,63,290)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
end,
|
||||
dropPiece=function(P)
|
||||
local D=P.modeData
|
||||
if P.stat.row>=D.target then
|
||||
D.target=D.target+10
|
||||
if D.target==200 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=1,1
|
||||
SFX.play('blip_1')
|
||||
else
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
296
parts/eventsets/master_g.lua
Normal file
296
parts/eventsets/master_g.lua
Normal file
@@ -0,0 +1,296 @@
|
||||
local gc=love.graphics
|
||||
local regretDelay=-1
|
||||
local int_grade=0
|
||||
local grade_points=0
|
||||
local int_grade_boosts={0,1,2,3,4,5,5,6,6,7,7,7,8,8,8,9,9,9,10,11,12,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26}
|
||||
local gradeList={
|
||||
"9","8","7","6","5","4","3","2","1",
|
||||
"S1","S2","S3","S4","S5","S6","S7","S8","S9",
|
||||
"m1","m2","m3","m4","m5","m6","m7","m8","m9",
|
||||
"M","MK","MV","MO","MM-","MM","MM+","GM-","GM","GM+","TM-","TM","TM+"
|
||||
}
|
||||
local spd_lvl=0
|
||||
local cools=0
|
||||
local regrets=0
|
||||
local prevSectTime=0
|
||||
local isInRoll=false
|
||||
local rollGrades=0
|
||||
local cool_time={3120,3120,2940,2700,2700,2520,2520,2280,2280,0}
|
||||
local reg_time= {5400,4500,4500,4080,3600,3600,3000,3000,3000,3000}
|
||||
local prevDrop70=false --determines if previous piece has level less than __70
|
||||
local nextSpeedUp=false --determines if the next section speed should be boosted by 100
|
||||
local isInRollTrans=false
|
||||
local function getGrav(l)
|
||||
return
|
||||
l<30 and 64 or
|
||||
l<35 and 43 or
|
||||
l<40 and 32 or
|
||||
l<50 and 26 or
|
||||
l<60 and 21 or
|
||||
l<70 and 16 or
|
||||
l<80 and 8 or
|
||||
l<90 and 6 or
|
||||
l<120 and 4 or
|
||||
l<160 and 3 or
|
||||
l<200 and 2 or
|
||||
l<220 and 64 or
|
||||
l<230 and 8 or
|
||||
l<233 and 4 or
|
||||
l<236 and 3 or
|
||||
l<243 and 2 or
|
||||
l<300 and 1 or
|
||||
l<360 and 0.5 or
|
||||
l<450 and 0.25 or
|
||||
0
|
||||
end
|
||||
local function getLock(l)
|
||||
return
|
||||
l<900 and 30 or
|
||||
l<1100 and 19 or
|
||||
15
|
||||
end
|
||||
local function getWait(l)
|
||||
return
|
||||
l<700 and 23 or
|
||||
l<800 and 16 or
|
||||
l<1000 and 12 or
|
||||
l<1100 and 7 or
|
||||
6
|
||||
end
|
||||
local function getFall(l)
|
||||
return
|
||||
l<500 and 25 or
|
||||
l<600 and 18 or
|
||||
l<700 and 12 or
|
||||
l<800 and 8 or
|
||||
4
|
||||
end
|
||||
local function getDas(l)
|
||||
return
|
||||
l<500 and 10 or
|
||||
l<900 and 8 or
|
||||
6
|
||||
end
|
||||
local function getGrade()
|
||||
if int_grade==nil then int_grade=0 end
|
||||
if rollGrades==nil then rollGrades=0 end
|
||||
return gradeList[math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList)]
|
||||
end
|
||||
local function addGrade(row, cmb, lvl) -- IGS = internal grade system
|
||||
if row<1 then return end
|
||||
local pts=0
|
||||
local cmb_mult=1.0
|
||||
local lvl_mult=math.floor(lvl/250)+1
|
||||
|
||||
if row==1 then
|
||||
pts=int_grade<5 and 10 or int_grade<10 and 5 or 2
|
||||
cmb_mult=1.0
|
||||
elseif row==2 then
|
||||
pts=int_grade<3 and 20 or int_grade<6 and 15 or int_grade<10 and 10 or 12
|
||||
cmb_mult=cmb==1 and 1 or cmb<4 and 1.2 or cmb<8 and 1.4 or cmb<10 and 1.5 or 2.0
|
||||
elseif row==3 then
|
||||
pts=int_grade==0 and 40 or int_grade<4 and 30 or int_grade<7 and 20 or int_grade<10 and 15 or 13
|
||||
cmb_mult=cmb==1 and 1 or cmb<10 and 1+(cmb+2)*0.1 or 2
|
||||
else
|
||||
pts=int_grade==0 and 50 or int_grade<5 and 40 or 30
|
||||
cmb_mult=cmb==1 and 1 or cmb==2 and 1.5 or cmb<6 and (0.2*cmb)+1.2 or cmb<10 and (0.1*cmb)+1.7 or 3
|
||||
end
|
||||
|
||||
grade_points=grade_points+(pts*cmb_mult*lvl_mult)
|
||||
if grade_points>=100 then
|
||||
grade_points=0
|
||||
int_grade=int_grade+1
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
drop=64,
|
||||
lock=30,
|
||||
wait=23,
|
||||
fall=25,
|
||||
noTele=true,
|
||||
das=16,arr=1,
|
||||
minsdarr=1,
|
||||
ihs=true,irs=true,ims=false,
|
||||
RS='SRS_plus',
|
||||
mesDisp=function(P)
|
||||
gc.setColor(1,1,1,1)
|
||||
setFont(45)
|
||||
mText(TEXTOBJ.grade,63,180)
|
||||
setFont(60)
|
||||
mStr(getGrade(),63,110)
|
||||
if isInRoll then
|
||||
setFont(20)
|
||||
mStr(("%.1f"):format(rollGrades),63,208)
|
||||
gc.setLineWidth(2)
|
||||
gc.setColor(.98,.98,.98,.8)
|
||||
gc.rectangle('line',0,240,126,80,4)
|
||||
gc.setColor(.98,.98,.98,.4)
|
||||
gc.rectangle('fill',0+2,240+2,126-4,80-4,2)
|
||||
setFont(45)
|
||||
local t=(P.stat.frame-prevSectTime)/60
|
||||
local T=("%.1f"):format(60-t)
|
||||
gc.setColor(COLOR.dH)
|
||||
mStr(T,65,250)
|
||||
t=t/60
|
||||
gc.setColor(1.7*t,2.3-2*t,.3)
|
||||
mStr(T,63,248)
|
||||
else
|
||||
setFont(20)
|
||||
mStr(grade_points,63,208)
|
||||
setFont(45)
|
||||
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
|
||||
end
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
local D=P.modeData
|
||||
|
||||
local c=#P.clearedRow
|
||||
|
||||
if cools>8 and isInRoll then
|
||||
rollGrades=rollGrades+(c==4 and 1 or 0.1*c)
|
||||
return
|
||||
elseif isInRoll then
|
||||
rollGrades=rollGrades+(c==4 and 0.26 or 0.04*c)
|
||||
return
|
||||
end
|
||||
|
||||
if c==0 and D.pt+1>=D.target then return end
|
||||
local s=c<3 and c+1 or c==3 and 5 or 7
|
||||
if P.combo>7 then s=s+2
|
||||
elseif P.combo>3 then s=s+1
|
||||
end
|
||||
|
||||
addGrade(c,P.combo,D.pt)
|
||||
|
||||
D.pt=D.pt+s
|
||||
spd_lvl=spd_lvl+1
|
||||
|
||||
P.gameEnv.drop=getGrav(spd_lvl)
|
||||
|
||||
if(P.gameEnv.drop==0) then
|
||||
P:set20G(true)
|
||||
end
|
||||
|
||||
if D.pt%100>70 and not prevDrop70 then
|
||||
if P.stat.frame-prevSectTime < cool_time[math.ceil(D.pt/100)] then
|
||||
cools=cools+1
|
||||
P:_showText("COOL!",0,-120,80,'fly',.8)
|
||||
nextSpeedUp=true
|
||||
end
|
||||
prevDrop70=true
|
||||
end
|
||||
|
||||
if D.pt+1==D.target then
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
spd_lvl=nextSpeedUp and spd_lvl+100 or spd_lvl
|
||||
nextSpeedUp=false
|
||||
prevDrop70=false
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
E.lock=getLock(spd_lvl)
|
||||
E.wait=getWait(spd_lvl)
|
||||
E.fall=getFall(spd_lvl)
|
||||
E.das=getDas(spd_lvl)
|
||||
|
||||
if P.stat.frame-prevSectTime > reg_time[math.ceil(s)] then
|
||||
regrets=regrets+1
|
||||
regretDelay=60
|
||||
end
|
||||
prevSectTime=P.stat.frame
|
||||
if s==2 then
|
||||
BG.set('rainbow')
|
||||
elseif s==4 then
|
||||
BG.set('rainbow2')
|
||||
elseif s==5 then
|
||||
if P.stat.frame>420*60 then
|
||||
D.pt=500
|
||||
P:win('finish')
|
||||
return
|
||||
else
|
||||
BG.set('glow')
|
||||
BGM.play('secret7th remix')
|
||||
end
|
||||
elseif s==6 then
|
||||
BG.set('lightning')
|
||||
elseif s>9 then
|
||||
if cools>8 then
|
||||
E.lockFX=E.lockFX>1 and 1 or E.lockFX
|
||||
P:setInvisible(5)
|
||||
else
|
||||
P:setInvisible(300)
|
||||
end
|
||||
D.pt=999
|
||||
P.waiting=240
|
||||
BGM.stop()
|
||||
isInRollTrans=true
|
||||
return
|
||||
end
|
||||
D.target=D.target<900 and D.target+100 or 999
|
||||
P:stageComplete(s)
|
||||
SFX.play('reach')
|
||||
end
|
||||
end,
|
||||
task=function(P)
|
||||
regretDelay=-1
|
||||
P.modeData.pt=0
|
||||
P.modeData.target=100
|
||||
int_grade=0
|
||||
grade_points=0
|
||||
rollGrades=0
|
||||
spd_lvl=0
|
||||
cools=0
|
||||
regrets=0
|
||||
prevSectTime=0
|
||||
isInRoll=false
|
||||
isInRollTrans=false
|
||||
prevDrop70=false
|
||||
nextSpeedUp=false
|
||||
local decayRate={125,80,80,50,45,45,45,40,40,40,40,40,30,30,30,20,20,20,20,20,15,15,15,15,15,15,15,15,15,15,10,10,10,9,9,9,8,8,8,7,7,7,6}
|
||||
local decayTimer=0
|
||||
while true do
|
||||
YIELD()
|
||||
P.modeData.grade=getGrade()
|
||||
P.modeData.gradePts=math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList)
|
||||
if regretDelay>-1 then
|
||||
regretDelay=regretDelay-1
|
||||
if regretDelay==-1 then P:_showText("REGRET!!",0,-120,80,'beat',.8) end
|
||||
end
|
||||
if isInRollTrans then
|
||||
if P.waiting>=220 then
|
||||
--Make field invisible
|
||||
for y=1,#P.field do for x=1,10 do
|
||||
P.visTime[y][x]=P.waiting-220
|
||||
end end
|
||||
elseif P.waiting==190 then
|
||||
TABLE.cut(P.field)
|
||||
TABLE.cut(P.visTime)
|
||||
elseif P.waiting==180 then
|
||||
playReadySFX(3,3)
|
||||
elseif P.waiting==120 then
|
||||
playReadySFX(2,1)
|
||||
elseif P.waiting==60 then
|
||||
playReadySFX(1,1)
|
||||
elseif P.waiting==1 then
|
||||
playReadySFX(0,1)
|
||||
isInRollTrans=false
|
||||
isInRoll=true
|
||||
BGM.play('hope')
|
||||
BG.set('blockspace')
|
||||
prevSectTime=P.stat.frame
|
||||
end
|
||||
end
|
||||
if P.waiting<=0 and grade_points>0 and not isInRoll then
|
||||
decayTimer=decayTimer+1
|
||||
if decayTimer>=decayRate[math.min(int_grade+1,#decayRate)] then
|
||||
decayTimer=0
|
||||
grade_points=grade_points-1
|
||||
end
|
||||
elseif isInRoll and P.stat.frame>=prevSectTime+3600 then
|
||||
rollGrades=rollGrades+(cools>8 and 1.6 or 0.5)
|
||||
P:win('finish')
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
BIN
parts/fonts/Japan.otf
Normal file
BIN
parts/fonts/Japan.otf
Normal file
Binary file not shown.
BIN
parts/fonts/Monospaced.otf
Normal file
BIN
parts/fonts/Monospaced.otf
Normal file
Binary file not shown.
BIN
parts/fonts/Proportional.otf
Normal file
BIN
parts/fonts/Proportional.otf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1364
parts/language/dict_ja.lua
Normal file
1364
parts/language/dict_ja.lua
Normal file
File diff suppressed because it is too large
Load Diff
@@ -143,7 +143,6 @@ return{
|
||||
customBGloadFailed="Unsupport image format for custom background",
|
||||
|
||||
errorMsg="Techmino ran into a problem and needs to restart.\nYou can send the error log to the developers.",
|
||||
tryAnotherBuild="[Invalid UTF-8] If you are on Windows, try downloading Techmino-win32 or Techmino-win64 (different from what you are using now).",
|
||||
|
||||
modInstruction="Choose your modifiers!\nMods allow you to change the game,\nbut they may also crash the game.\nScores will not be saved when using mods.",
|
||||
modInfo={
|
||||
|
||||
@@ -563,7 +563,7 @@ return{
|
||||
pro="アドバンス",
|
||||
icon="アイコン",
|
||||
sfx="効果音",
|
||||
vib="VIB",
|
||||
vib="振動",
|
||||
alpha="Alpha",
|
||||
|
||||
track="オートトラック",
|
||||
@@ -681,7 +681,7 @@ return{
|
||||
title="ミュージックルーム",
|
||||
bgm="音楽",
|
||||
sfx="効果音",
|
||||
voc="VOC",
|
||||
voc="ボイス",
|
||||
music="曲",
|
||||
label="ラベル",
|
||||
},
|
||||
@@ -957,22 +957,22 @@ getTip={refuseCopy=true,
|
||||
"マルチプレイで遊ぼう! あなたの常識が壊されるでしょう",
|
||||
"メニューをシンプルモードにした場合、イースターエッグがなくなります",
|
||||
"ローディング中! シーンチェンジの間だけじゃないです!",
|
||||
"Z推薦[01]東方原作ゲームをやってみよう!",
|
||||
"Z推薦[02]Minecraftをやってみよう!",
|
||||
"Z推薦[03]Osu!をやってみよう!",
|
||||
"Z推薦[04]Quatrackをやってみよう!",
|
||||
"Z推薦[05]Terrariaをやってみよう!",
|
||||
"Z推薦[06]Celesteをやってみよう!",
|
||||
"Z推薦[07]グーの惑星をやってみよう!",
|
||||
"Z推薦[08]Orzmicをやってみよう!",
|
||||
"Z推薦[09]Puyo Puyoをやってみよう!",
|
||||
"Z推薦[10]Phigrosをやってみよう!",
|
||||
"Z推薦[11]VVVVVVをやってみよう!",
|
||||
"Z推薦[12]Ballanceをやってみよう!",
|
||||
"Z推薦[13]Zumaをやってみよう!",
|
||||
"Z推薦[14]ルービックキューブをやってみよう!",
|
||||
"Z推薦[15]15puzzleをやってみよう!",
|
||||
"Z推薦[16]Minesweeperをやってみよう!",
|
||||
"Zのおすすめ[01]東方原作ゲームをやってみよう!",
|
||||
"Zのおすすめ[02]Minecraftをやってみよう!",
|
||||
"Zのおすすめ[03]Osu!をやってみよう!",
|
||||
"Zのおすすめ[04]Quatrackをやってみよう!",
|
||||
"Zのおすすめ[05]Terrariaをやってみよう!",
|
||||
"Zのおすすめ[06]Celesteをやってみよう!",
|
||||
"Zのおすすめ[07]グーの惑星をやってみよう!",
|
||||
"Zのおすすめ[08]Orzmicをやってみよう!",
|
||||
"Zのおすすめ[09]Puyo Puyoをやってみよう!",
|
||||
"Zのおすすめ[10]Phigrosをやってみよう!",
|
||||
"Zのおすすめ[11]VVVVVVをやってみよう!",
|
||||
"Zのおすすめ[12]Ballanceをやってみよう!",
|
||||
"Zのおすすめ[13]Zumaをやってみよう!",
|
||||
"Zのおすすめ[14]ルービックキューブをやってみよう!",
|
||||
"Zのおすすめ[15]15puzzleをやってみよう!",
|
||||
"Zのおすすめ[16]Minesweeperをやってみよう!",
|
||||
{C.H,"REGRET!!"},
|
||||
{C.lP,"Secret Number: 626"},
|
||||
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Gameplay:
|
||||
The system will provide you with tetrominoes (4-block pieces),
|
||||
with a total of 7 types, and the player needs to control them
|
||||
(move left and right, rotate 90, 180 or 270 degrees).
|
||||
(move left and right, rotate 90, 180, or 270 degrees).
|
||||
each row filled with the field will be cleared.
|
||||
If there is an opponent, an attack will be sent depending on the line clear type
|
||||
Play until the end or achieve the level's goal to win.
|
||||
@@ -18,30 +18,49 @@ Spin detection:
|
||||
- The Spin is a Mini if it only has 2 points; the piece is one of S, Z, J, L, T; AND the line clear did not clear the entire piece.
|
||||
|
||||
Attack system:
|
||||
Normal line clears (1 to 3 lines):
|
||||
Sends (lines cleared -0.5) attack
|
||||
Special line clears:
|
||||
Spin sends (lines cleared x2) attack,
|
||||
- B2B sends extra 1/1/2/4/8 for Spin Single/Double/Triple/Techrash/Techrash+
|
||||
- B2B2B sends (lines cleared x0.5), and +1 extra blocking
|
||||
- Minis reduces the attack to 25% (x0.25 multiplier)
|
||||
Non-Spin Techrash/Techrash+ sends (lines cleared) attack,
|
||||
- B2B sends 1 additional line
|
||||
- B2B2B will have an attack boost of 50% and +1 extra blocking
|
||||
Special clear:
|
||||
A special clear refers to a situation where you perform a spin, Techrash (or clear more than four lines at a time), PC, or HPC. Special clears can elevate the B2B gauge.
|
||||
Super clear:
|
||||
A super clear refers to a situation where you perform a special clear when the B2B gauge is not empty.
|
||||
|
||||
Special line clears will the increase B2B gauge, making later special line clears have either a B2B or B2B2B bonus (see below)
|
||||
Special clears (spins):
|
||||
sends (lines cleared ×2) attack,
|
||||
- B2B sends extra 1/1/2/4/8 for Spin Single/Double/Triple/Techrash/Techrash+
|
||||
- B2B2B sends (lines cleared ×0.5), and +1 extra blocking
|
||||
- Minis reduces the attack to 25% (×0.25 multiplier)
|
||||
|
||||
Combos: All damage above will be given a (combo x25%) bonus, or (combo x15%) for Single clear (capped at 12 combo),
|
||||
+1 more attack for 3 Combo or more.
|
||||
Special clears (Techrash/techrash+ without spins):
|
||||
- B2B sends 1 additional line
|
||||
- B2B2B will have an attack boost of 50% and +1 extra blocking
|
||||
|
||||
Non-special clears:
|
||||
send (attack-0.5) attack.
|
||||
|
||||
Combos (REN):
|
||||
The numbers of the combos are equal to (the numbers you clear lines consecutively –1). All damage above (except attack from PC/HPC) will be given a (combo ×25%) bonus, or (combo ×15%) for Single clear (capped at 12 combo), +1 more attack for 3 Combo or more.
|
||||
|
||||
Hemi Perfect Clear (a P.C. "with blocks left below". If it's an I clearing 1 line, the remaining blocks must not be player-placed):
|
||||
Attack +4, Extra Blocking +2
|
||||
- Attack +4, Extra Blocking +2
|
||||
|
||||
Perfect Clear (aka All Clear):
|
||||
Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher,
|
||||
and +2 extra blocking.
|
||||
Perfect Clear (All Clear):
|
||||
- Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher, and +2 extra blocking.
|
||||
|
||||
After calculating all above, the damage value will be rounded down then sent
|
||||
After calculating all the above, the damage value will be rounded down and sent.
|
||||
|
||||
|
||||
Back to Back (B2B) gauge:
|
||||
The B2B gauge ranges from 0 to 1,000. Special line clears are B2B if the gauge is >=50, B2B2B if >800.
|
||||
|
||||
Line cleared:
|
||||
Special clears:
|
||||
- Spin Single/Double/Triple/Techrash/Techrash+ + 50/100/180/800/1000 (×50% if Mini)
|
||||
- Techrash/Techrash+ + 150/200/...
|
||||
- PC when lines cleared in this round >4, +800
|
||||
- HPC, +100
|
||||
- A regular line clear -250
|
||||
|
||||
No lines cleared:
|
||||
- Spin (0 lines) +20. Do note that the B2B gauge cannot exceed 800 using this method.
|
||||
|
||||
Score system:
|
||||
The better you play, the higher the score.
|
||||
@@ -54,37 +73,27 @@ Attack delay:
|
||||
Minis will greatly increase the delay.
|
||||
|
||||
Countering:
|
||||
When you send attacks, if there is garbage in queue,
|
||||
When you send attacks, if there is garbage in the queue,
|
||||
extra blocking will be used first, then attack, countering the earliest attack at a 1:1 ratio.
|
||||
Any extra blocking you didn't use will be discarded, and finally the remaining attack power will be sent to your opponent.
|
||||
|
||||
Back to Back (B2B) gauge:
|
||||
The B2B gauge ranges from 0 to 1,000. Special line clears are B2B if the gauge is >=50, B2B2B if >800.
|
||||
A regular line clear -250
|
||||
Spin Single/Double/Triple/Techrash/Techrash+ + 50/100/180/800/1000 (x50% if Mini)
|
||||
Techrash/Techrash+ + 150/200/...
|
||||
PC when lines cleared in this round >4, +800
|
||||
Hemi-PC, +100
|
||||
Spin (0 lines) +20. Do note that the B2B gauge cannot exceed 800 using this method.
|
||||
When gauge is above 800, a drop without clearing lines decreases it by 40, but cannot drop below 800
|
||||
Any extra blocking you didn't use will be discarded, and finally, the remaining attack power will be sent to your opponent.
|
||||
|
||||
Battle Royale modes:
|
||||
Many players play a game at the same time (against AI bots, not real players).
|
||||
As players get eliminated, blocks fall faster, and garbage take effect faster, as well as rise faster.
|
||||
As players get eliminated, blocks fall faster, and garbage takes effect faster, as well as rises faster.
|
||||
Eliminate other players to gain a badge and the player's badge to increase your attack power.
|
||||
Players can choose between four attack modes:
|
||||
1. Random: Every time you attack, 10% chance to lock onto a random player.
|
||||
2. Badges: After you attack or when your target dies, lock onto the player with the most badges.
|
||||
3. KOs: After you attack or when your target dies, lock onto the player with the highest field. (Refreshes every second)
|
||||
4. Attackers: attack all players locking onto yourself.
|
||||
Your attack will be sent to all of them. If you are not targetted, you attack a random player (not locking).
|
||||
Your attack will be sent to all of them. If you are not targeted, you attack a random player (not locking).
|
||||
When all opponents have been eliminated, the last player in the match is the winner.
|
||||
|
||||
Custom mode:
|
||||
You can freely adjust most parameters (not including special effects of other game modes).
|
||||
You can also draw a field to clear or make a template to build.
|
||||
In build (puzzle) mode, you can toggle template display with Function key:
|
||||
Cells with a X cannot have blocks;
|
||||
Cells with an X cannot have blocks;
|
||||
empty cells can be in any state;
|
||||
regular colored cells have to be made of the corresponding block;
|
||||
garbage-colored cells can be any block but not air.
|
||||
|
||||
62
parts/language/manual_ja.txt
Normal file
62
parts/language/manual_ja.txt
Normal file
@@ -0,0 +1,62 @@
|
||||
ゲームプレイ:
|
||||
システムから与えられた全7種類のテトロミノ
|
||||
(4ブロックで構成されたピース) をプレイヤーが操作します,
|
||||
(主に左右移動と90°, 180°, 270°回転で)。
|
||||
各行がブロックで埋め尽くされるとその行列のブロックが消えます。
|
||||
相手が居る場合, ラインの消し方等で攻撃と火力が異なります。
|
||||
勝利する為にはそのレベルの目標達成もしくは最後までプレイする必要があります。
|
||||
|
||||
回転システム:
|
||||
初期設定はTRS (Techmino Rotation System) で設定されています。
|
||||
プレイヤーは他の一般的な回転システムも使う事ができます (基本的には変えなくても大丈夫)。
|
||||
|
||||
スピンの検出:
|
||||
「3コーナ」ルールを満たした時 +2点
|
||||
「インモービル (Immobile)」 ルールを満たした時 +2点
|
||||
- 上のどちらかを満たした時, スピンが確定します。
|
||||
|
||||
もし回転システムがキックテーブルから2番チェック (2nd check) を採用していなかった場合 +1点
|
||||
- もしスピンの合計点が2点しかない場合は「ミニ」扱いになります;ミノがS, Z, J, L, Tのいずれかで, ラインクリア時にそのミノを全て消せなかった場合のみ。
|
||||
|
||||
Attack system:
|
||||
[TODO]
|
||||
Back to Back (B2B) gauge:
|
||||
[TODO]
|
||||
|
||||
スコアシステム:
|
||||
上手くプレイすれば, スコアも上がります。
|
||||
|
||||
攻撃遅延システム:
|
||||
ダブル, トリプルの攻撃が一番早く効果が出ます;
|
||||
その次にゆっくりとした攻撃を送るTechrash, スピン等, の効果が出ます;
|
||||
高いコンボ数の攻撃が飛躍的に遅いです;
|
||||
B2BやB2B2B等は, 送るライン数が増えれば増えるほど遅くなります;
|
||||
ミニ系の攻撃は攻撃自体の効果を大幅に遅らせます。
|
||||
|
||||
カウンター:
|
||||
攻撃を送る際, もしお邪魔ゲージにお邪魔がある場合,
|
||||
追加相殺がまず使われ, その次に攻撃自体とお邪魔を1対1の割合でお邪魔の相殺に当てます。
|
||||
使わなかった追加相殺は破棄され、残った攻撃のパワーは相手に送られます。
|
||||
|
||||
バトルロイヤルモード:
|
||||
沢山のプレイヤーが同時にゲームをプレイします (対AIです, 本物の人ではありません)。
|
||||
人数が減れば減るほど、ミノの落下速度は加速していき、お邪魔の効果が早く出る同時にせり上がる速度も上がります。
|
||||
他のプレイヤーを倒してバッジを得て、そしてそのバッジであなた自身の攻撃力を上げましょう。
|
||||
プレイヤーは4つの攻撃モードから選ぶことができます:
|
||||
1: ランダム: 毎回攻撃を送る際, 10%の確率で他のプレイヤーに照準を合わせます。
|
||||
2: バッジ狙い: 攻撃を送った後もしくは標的が落とされた場合, バッジの数が一番多いプレイヤーに照準を合わせます。
|
||||
3. トドメ撃ち: 攻撃を送った後もしくは標的が落とされた場合, 各プレイヤの中からフィールドの高さが一番高いプレイヤーに照準を合わせます。
|
||||
(毎秒更新されます)
|
||||
4. カウンター: あなたに照準を向けられてるプレイヤー全員に照準を同時に向けます。
|
||||
あなたの攻撃は照準を向けてるプレイヤー全てに送られます。照準をあなたに向けられていない場合、ランダムにプレイヤーを攻撃します (プレイヤー照準固定無し)
|
||||
全てのプレイヤーが落とされた場合, 最後のプレイヤーが勝者となります。
|
||||
|
||||
カスタムモード:
|
||||
殆どの変数を自由に変えられます (他のゲームモードの特殊エフェクトを除いて)。
|
||||
更に消す為のフィールドを描いたりまたは積み上げる為のテンプレも作れます。
|
||||
ビルド (パズル) モードの場合, テンプレの表示をファンクションキーで操作できます:
|
||||
X印の場所にはブロックは置けない;
|
||||
無印の場所は何来ても構わない;
|
||||
色付きの場所にはその色に合わせてのミノブロックを置かないいけない;
|
||||
おじゃまミノ色の場所にはあるブロックが来てる扱いで空きスペースではない。
|
||||
形を整えた後に, 勝ち判定となります。
|
||||
@@ -15,21 +15,48 @@ spin判定:
|
||||
--如果分数只有2,方块是SZJLT之一,并且没有把当前方块整个消除那么就是mini
|
||||
|
||||
攻击系统:
|
||||
普通消除:
|
||||
消<4行打出[消行数-0.5]攻击
|
||||
特殊消除:
|
||||
如果是spin,打出[2*消行数]攻击,
|
||||
B2B攻击+[1/1/2/4/8(spin1~5)]
|
||||
B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡
|
||||
mini减至25%
|
||||
不是spin但是单次消>=4行,打出[消行数]攻击,
|
||||
B2B攻击+1
|
||||
B3B攻击+50%,+1额外抵挡
|
||||
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
|
||||
连击:每次连击给予上述攻击[连击数*25%(上限12连)(如果只消一行就是15%)]的加成,>=3次时再额外加1攻击
|
||||
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+4,额外抵挡+2
|
||||
全消:全消伤害为8~16(本局内递增2),和上述其他伤害取大,然后+2额外抵挡
|
||||
根据上述规则计算后,向下取整,攻击打出
|
||||
概念说明[高级消除]:
|
||||
spin/消四及以上,会受到B2B(点数>=50)或B3B(点数>800)加成
|
||||
反之称为低级消除
|
||||
概念说明[特殊消除]:
|
||||
spin/消四及以上/pc/hpc,可以增加B2B点数
|
||||
反之称为普通消除
|
||||
|
||||
高级消除(spin):
|
||||
打出[2*消行数]攻击,然后
|
||||
- B2B攻击+[1/1/2/4/8/14(spin1~6)]
|
||||
- B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡
|
||||
- mini减至25%
|
||||
高级消除(非spin但是消四及以上):
|
||||
打出[消行数]攻击,然后
|
||||
- B2B攻击+1
|
||||
- B3B攻击+50%,+1额外抵挡
|
||||
低级消除:
|
||||
打出[消行数-0.5]攻击
|
||||
连击:
|
||||
(注:连击数为连续消除次数-1)
|
||||
把上述高级消除/低级消除的攻击直接乘以"连击倍率", 公式为 "连击倍率"=[连击数(上限12)]*[消一行以上25%,只消一行15%]
|
||||
如果消除>=3次时再额外加1攻击
|
||||
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):
|
||||
伤害+4,额外抵挡+2
|
||||
全消:
|
||||
伤害为8~16(本局内递增2),和上述其他伤害取大,+2额外抵挡
|
||||
计算完成后,向下取整,攻击打出
|
||||
|
||||
back to back(B2B)点数说明:
|
||||
B2B点数的范围在0~1000
|
||||
|
||||
落块后消行了:
|
||||
特殊消除:
|
||||
spin1~5:+[50/100/180/800/1000](mini变为原来50%)
|
||||
消四/五/六:+[150/200/...]
|
||||
本局内消行数>4时全消:+800
|
||||
半全消:+100
|
||||
普通消除:
|
||||
-250
|
||||
落块后没消行:
|
||||
空spin:+20
|
||||
点数在800以上会-40(不低于800)
|
||||
|
||||
分数系统:
|
||||
分数计算系统非常复杂,而且随时可能更改所以不写在这里,并且计算只跟消除方式等信息有关,和模式设定无关
|
||||
@@ -42,16 +69,6 @@ spin判定:
|
||||
发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击
|
||||
没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手
|
||||
|
||||
back to back(B2B)点数说明:
|
||||
B2B点数的范围在0~1000,在点数>=50时进行特殊消除为B2B,>800时特殊消除为B3B
|
||||
普通消除:-250
|
||||
spin1~5:+[50/100/180/800/1000](mini变为原来50%)
|
||||
消四/五/六:+[150/200/...]
|
||||
本局内消行数>4时全消:+800
|
||||
半全消:+100
|
||||
空spin:+20,此法得到的点数不能超过800
|
||||
当点数在800以上时空放一块-40(不低于800)
|
||||
|
||||
混战模式说明:
|
||||
许多玩家同时进行一局游戏(对手都是AI,不是真人).
|
||||
随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.
|
||||
|
||||
33
parts/modes/master_g.lua
Normal file
33
parts/modes/master_g.lua
Normal file
@@ -0,0 +1,33 @@
|
||||
return{
|
||||
env={
|
||||
freshLimit=15,
|
||||
fieldH=19,
|
||||
sequence="bagES",
|
||||
eventSet='master_g',
|
||||
bg='bg2',bgm='secret7th',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)
|
||||
if not tonumber(P.modeData.grade) then
|
||||
return{P.modeData.grade,P.stat.time}
|
||||
else
|
||||
return{"Grade "..tostring(P.modeData.grade),P.stat.time}
|
||||
end
|
||||
end,
|
||||
scoreDisp=function(D) return D[1].." "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])end,
|
||||
getRank=function(P)
|
||||
local G=P.modeData.gradePts
|
||||
return
|
||||
G>=39 and 5 or -- TM+
|
||||
G>=31 and 4 or -- MM- - TM
|
||||
G>=25 and 3 or -- m8 - MO
|
||||
G>=18 and 2 or -- m1-m7
|
||||
G>=9 and 1 or -- S1-S9
|
||||
0
|
||||
|
||||
-- Table of grades vs values
|
||||
-- 9 8 7 6 5 4 3 2 1 S1 S2 S3 S4 S5 S6 S7 S8 S9 m1 m2 m3 m4 m5 m6 m7 m8 m9 M MK MV MO MM- MM MM+ GM- GM GM+ TM- TM TM+
|
||||
-- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
||||
end,
|
||||
}
|
||||
@@ -217,11 +217,11 @@ function Player:_deepDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_moveLeft(auto)
|
||||
self.movDir=-1
|
||||
if not self.control then return end
|
||||
if not auto then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=-1
|
||||
if self.cur then
|
||||
if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)then
|
||||
self:createMoveFX('left')
|
||||
@@ -239,11 +239,11 @@ function Player:act_moveLeft(auto)
|
||||
end
|
||||
end
|
||||
function Player:act_moveRight(auto)
|
||||
self.movDir=1
|
||||
if not self.control then return end
|
||||
if not auto then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=1
|
||||
if self.cur then
|
||||
if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)then
|
||||
self:createMoveFX('right')
|
||||
@@ -1798,30 +1798,15 @@ do
|
||||
self.b2b=self.b2b+cc*50-50
|
||||
piece.special=true
|
||||
else
|
||||
piece.special=false
|
||||
end
|
||||
if self.sound and(cc~=1 or dospin)then
|
||||
VOC.play(clearVoice[cc],CHN)
|
||||
end
|
||||
|
||||
--PC/HPC check
|
||||
if clear and cc>=#C.bk then
|
||||
if CY==1 then
|
||||
piece.pc=true
|
||||
piece.special=true
|
||||
elseif cc>1 or self.field[#self.field].garbage then
|
||||
piece.hpc=true
|
||||
piece.special=true
|
||||
end
|
||||
end
|
||||
|
||||
--Normal clear,reduce B2B point
|
||||
if not piece.special then
|
||||
self.b2b=max(self.b2b-250,0)
|
||||
self:showText(text.clear[cc],0,-30,35,'appear',(8-cc)*.3)
|
||||
atk=cc-.5
|
||||
sendTime=20+int(atk*20)
|
||||
cscore=cscore+clearSCR[cc]
|
||||
piece.special=false
|
||||
end
|
||||
|
||||
if self.sound and(cc~=1 or dospin)then
|
||||
VOC.play(clearVoice[cc],CHN)
|
||||
end
|
||||
|
||||
--Combo bonus
|
||||
@@ -1835,35 +1820,45 @@ do
|
||||
cscore=cscore+min(50*cmb,500)*(2*cc-1)
|
||||
end
|
||||
|
||||
--PC/HPC effect
|
||||
if piece.pc then
|
||||
self:showText(text.PC,0,-80,50,'flicker')
|
||||
atk=max(atk,min(8+Stat.pc*2,16))
|
||||
exblock=exblock+2
|
||||
sendTime=sendTime+120
|
||||
if Stat.row+cc>4 then
|
||||
self.b2b=self.b2b+800
|
||||
cscore=cscore+300*min(6+Stat.pc,10)
|
||||
else
|
||||
--PC/HPC
|
||||
if clear and cc>=#C.bk then
|
||||
if CY==1 then
|
||||
piece.pc=true
|
||||
piece.special=true
|
||||
self:showText(text.PC,0,-80,50,'flicker')
|
||||
atk=max(atk,min(8+Stat.pc*2,16))
|
||||
exblock=exblock+2
|
||||
sendTime=sendTime+120
|
||||
if Stat.row+cc>4 then
|
||||
self.b2b=self.b2b+800
|
||||
cscore=cscore+300*min(6+Stat.pc,10)
|
||||
else
|
||||
cscore=cscore+626
|
||||
end
|
||||
Stat.pc=Stat.pc+1
|
||||
if self.sound then
|
||||
SFX.play('pc')
|
||||
VOC.play('perfect_clear',CHN)
|
||||
end
|
||||
elseif cc>1 or self.field[#self.field].garbage then
|
||||
piece.hpc=true
|
||||
piece.special=true
|
||||
self:showText(text.HPC,0,-80,50,'fly')
|
||||
atk=atk+4
|
||||
exblock=exblock+2
|
||||
sendTime=sendTime+60
|
||||
self.b2b=self.b2b+100
|
||||
cscore=cscore+626
|
||||
Stat.hpc=Stat.hpc+1
|
||||
if self.sound then
|
||||
SFX.play('pc')
|
||||
VOC.play('half_clear',CHN)
|
||||
end
|
||||
end
|
||||
Stat.pc=Stat.pc+1
|
||||
if self.sound then
|
||||
SFX.play('pc')
|
||||
VOC.play('perfect_clear',CHN)
|
||||
end
|
||||
elseif piece.hpc then
|
||||
self:showText(text.HPC,0,-80,50,'fly')
|
||||
atk=atk+4
|
||||
exblock=exblock+2
|
||||
sendTime=sendTime+60
|
||||
self.b2b=self.b2b+100
|
||||
cscore=cscore+626
|
||||
Stat.hpc=Stat.hpc+1
|
||||
if self.sound then
|
||||
SFX.play('pc')
|
||||
VOC.play('half_clear',CHN)
|
||||
end
|
||||
end
|
||||
|
||||
if not piece.special then
|
||||
self.b2b=max(self.b2b-250,0)
|
||||
end
|
||||
|
||||
if self.b2b>1000 then
|
||||
|
||||
@@ -76,7 +76,7 @@ local function _search()
|
||||
end
|
||||
|
||||
function scene.sceneInit()
|
||||
dict=require("parts.language.dict_"..(SETTING.locale:find'zh'and'zh'or'en'))
|
||||
dict=require("parts.language.dict_"..(SETTING.locale:find'zh'and'zh'or SETTING.locale:find'ja'and'ja'or'en'))
|
||||
_scanDict(dict)
|
||||
|
||||
inputBox:clear()
|
||||
|
||||
@@ -1,20 +1,22 @@
|
||||
return[=[
|
||||
未来小游戏:
|
||||
Tetro-1010(2C2N, 重力)
|
||||
Tetra-link(桌游)
|
||||
坦克大战; 扫雷; 接水管
|
||||
其他未来内容:
|
||||
模式包系统; 新模组系统; 加速下落; spike相关统计数据
|
||||
实时统计数据可视化; 教学关脚本语言; 从录像继续
|
||||
等级系统; 场地格边缘线; 模式数据分析; 高级自定义序列
|
||||
成就系统; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
|
||||
组队战; 方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统
|
||||
更自由的攻击系统; 更多消除方式; 可调场地宽度;
|
||||
task-Z(新AI); 自适应UI; 新联网游戏场景切换逻辑
|
||||
未来计划:
|
||||
R E M A K E
|
||||
|
||||
g0.17.2: 0.17.2
|
||||
新增:
|
||||
改动:
|
||||
完善当前的攻击系统,进入稳定状态
|
||||
更新说明书的攻击系统章节
|
||||
代码:
|
||||
完善字体并换用OTF
|
||||
修复:
|
||||
倒计时时不能充das #610
|
||||
几个音效的音量不太对 #572
|
||||
master_g模式的一些细节问题
|
||||
|
||||
0.17.1: 苏醒 Wake Up
|
||||
新增:
|
||||
全新模式选择界面(未完善,未来会增加更多便利功能)
|
||||
新模式:master_g(NOT_A_ROBOT移植)
|
||||
新皮肤:pixel(by C₂₉H₂₅N₃O₅)
|
||||
新语言:Bahasa Indonesia(by NOT_A_ROBOT)
|
||||
新语言:日本語(by sakurw & Airun & 幽灵3383)
|
||||
@@ -59,6 +61,7 @@ return[=[
|
||||
PC时最后一块若非特殊消除会先扣除b2b点数
|
||||
录像界面导入导出按钮隐藏状态错误
|
||||
登录界面读取本地账号密码数据错误
|
||||
经典-困难模式切换速度的时机错误
|
||||
回合制开关玩家控制的问题
|
||||
策略堆叠模式评级标准不当
|
||||
云存档/读档的一处小问题
|
||||
|
||||
10
version.lua
10
version.lua
@@ -1,7 +1,7 @@
|
||||
return{
|
||||
["apkCode"]=427,
|
||||
["code"]=1701,
|
||||
["string"]="V0.17.1",
|
||||
["room"]="ver A-3",
|
||||
["name"]="苏醒 Wake Up",
|
||||
["apkCode"]=431,
|
||||
["code"]=1702,
|
||||
["string"]="V0.17.2",
|
||||
["room"]="ver A-6",
|
||||
["name"]="0.17.2",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user