Compare commits

...

4 Commits

Author SHA1 Message Date
MrZ_26
ee99943ed9 0.9.1:next音效 2020-07-20 00:06:31 +08:00
MrZ_26
60cbc83313 新tips,修复手机旋屏bug,各种调平,统计数据简化 2020-07-19 21:33:03 +08:00
MrZ_26
74bc1a2544 bug修复,水印修改,20G上级调平 2020-07-18 01:05:10 +08:00
MrZ_26
7b35d69be1 允许用键盘编辑序列 2020-07-17 17:37:48 +08:00
37 changed files with 303 additions and 233 deletions

BIN
SFX/spawn_1.ogg Normal file

Binary file not shown.

BIN
SFX/spawn_2.ogg Normal file

Binary file not shown.

BIN
SFX/spawn_3.ogg Normal file

Binary file not shown.

BIN
SFX/spawn_4.ogg Normal file

Binary file not shown.

BIN
SFX/spawn_5.ogg Normal file

Binary file not shown.

BIN
SFX/spawn_6.ogg Normal file

Binary file not shown.

BIN
SFX/spawn_7.ogg Normal file

Binary file not shown.

View File

@@ -24,7 +24,7 @@ local gc,sys=love.graphics,love.system
local Timer=love.timer.getTime
local int,rnd,max,min=math.floor,math.random,math.max,math.min
local abs=math.abs
local rem=table.remove
local ins,rem=table.insert,table.remove
local scr=scr
local xOy=love.math.newTransform()
@@ -314,6 +314,8 @@ function keyDown.custom(key)
elseif sel==13 then
BGM.play(customRange.bgm[customSel[sel]])
end
elseif key=="q"then
SCN.goto("sequence")
elseif #key==1 then
local T=tonumber(key)
if T and T>=1 and T<=5 then
@@ -328,25 +330,50 @@ function keyDown.custom(key)
end
end
local minoKey={
["1"]=1,["2"]=2,["3"]=3,["4"]=4,["5"]=5,["6"]=6,["7"]=7,
z=1,s=2,j=3,l=4,t=5,o=6,i=7,
p=10,q=11,f=12,e=13,u=15,
v=16,w=17,x=18,r=21,y=22,n=23,h=24,
}
local minoKey2={
["1"]=8,["2"]=9,["3"]=19,["4"]=20,["5"]=14,["7"]=25,
z=8,s=9,t=14,j=19,l=20,i=25
}
function keyDown.sequence(key)
local s=sceneTemp
if key=="left"then
if s.cur>0 then s.cur=s.cur-1 end
elseif key=="right"then
if s.cur<#preBag then s.cur=s.cur+1 end
elseif key=="backspace"then
local C=s.cur
if C>0 then
rem(preBag,C)
s.cur=C-1
if type(key)=="number"then
local C=s.cur+1
ins(preBag,C,key)
s.cur=C
elseif #key==1 then
local i=(kb.isDown("lctrl","lshift","lalt","rctrl","rshift","ralt")and minoKey2 or minoKey)[key]
if i then
local C=s.cur+1
ins(preBag,C,i)
s.cur=C
end
elseif key=="delete"then
if sceneTemp.sure>20 then
preBag={1,2,3,4,5,6,7}
sceneTemp.cur=7
sceneTemp.sure=0
else
sceneTemp.sure=50
else
if key=="left"then
if s.cur>0 then s.cur=s.cur-1 end
elseif key=="right"then
if s.cur<#preBag then s.cur=s.cur+1 end
elseif key=="backspace"then
local C=s.cur
if C>0 then
rem(preBag,C)
s.cur=C-1
end
elseif key=="escape"then
SCN.back()
elseif key=="delete"then
if sceneTemp.sure>20 then
preBag={}
sceneTemp.cur=0
sceneTemp.sure=0
else
sceneTemp.sure=50
end
end
end
end
@@ -428,21 +455,13 @@ function keyDown.draw(key)
end
function mouseDown.setting_sound(x,y,k)
if x>780 and x<980 and y>470 and sceneTemp.jump==0 then
sceneTemp.jump=10
local t=Timer()-sceneTemp.last
local s=sceneTemp
if x>780 and x<980 and y>470 and s.jump==0 then
s.jump=10
local t=Timer()-s.last
if t>1 then
VOC.play((t<1.5 or t>15)and"doubt"or rnd()<.8 and"happy"or"egg")
sceneTemp.last=Timer()
if rnd()<.0626 then
for name,M in next,Modes do
if not modeRanks[name]then
modeRanks[name]=M.score and 0 or 6
end
end
FILE.saveUnlock()
TEXT.show("DEVModes:UNLOCKALL",640,360,50,"stretch",.6)
end
s.last=Timer()
end
end
end
@@ -701,14 +720,16 @@ function keyDown.staff(key,RESET)
if key=="escape"then
SCN.back()
elseif key=="\122"then
if kb.isDown("\109")and kb.isDown("\114")or RESET then
if RESET or kb.isDown("\109")and kb.isDown("\114")then
sceneTemp.ct=sceneTemp.ct+1
if sceneTemp.ct==5 then
TEXT.show("What are you up to?",640,200,40,"appear",.5)
elseif sceneTemp.ct==10 then
TEXT.show("Stop what you are doing.",640,200,40,"flicker",.5)
elseif sceneTemp.ct==20 then
elseif sceneTemp.ct==16 then
TEXT.show("RESET ALL DATA?",640,200,40,"appear",.3,.2)
elseif sceneTemp.ct==20 then
TEXT.show("SURE?????",640,200,40,"beat",.3,.2)
elseif sceneTemp.ct==26 then
local L=love.filesystem.getDirectoryItems("")
for i=1,#L do
@@ -735,6 +756,26 @@ function touchDown.staff(id,x,y)
end
end
function keyDown.stat(key)
if key=="u"and kb.isDown("lshift","rshift")then
touchDown.stat()
end
end
function touchDown.stat(id,x,y)
local s=sceneTemp
s.count=s.count+1
if rnd()<.0626 and s.count>26 then
for name,M in next,Modes do
if not modeRanks[name]then
modeRanks[name]=M.score and 0 or 6
end
end
FILE.saveUnlock()
TEXT.show("DEV:\85\78\76\79\67\75\65\76\76",640,360,60,"stretch",.6)
SFX.play("clear_4")
end
end
function wheelMoved.history(x,y)
wheelScroll(y)
end
@@ -980,7 +1021,11 @@ function love.resize(w,h)
SHADER.warning:send("h",h*scr.dpi)
end
function love.focus(f)
if SCN.cur=="play"and not f and setting.autoPause then pauseGame()end
if f then
TASK.new(TICK.autoResize,{0})
elseif SCN.cur=="play"and setting.autoPause then
pauseGame()
end
end
local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5}
local devColor={

View File

@@ -1,8 +1,8 @@
local langList={
{
anykey="按任意键继续",
newVersion="检测到更新!存档格式可能更新,设置已重置",
marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何视频内声明无效",
newVersion="检测到更新!存档格式已修改",
marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何转述声明无效",
lang="中文",
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -210,7 +210,7 @@ local langList={
set3="无尽(3)",
set4="隐形(4)",
set5="极限(5)",
seq="高级设置",
seq="高级设置(q)",
draw="初始场地编辑",
back="返回",
},
@@ -256,6 +256,7 @@ local langList={
quickR="快速重新开始",
swap="组合键切换攻击模式",
fine="极简操作提示音",
spawn="方块生成音",
back="返回",
},
setting_video={
@@ -442,8 +443,8 @@ local langList={
},
{
anykey="按任意键继续",
newVersion="检测到更新!存档格式可能更新,设置已重置",
marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何视频内声明无效",
newVersion="检测到更新!存档格式已修改",
marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何转述声明无效",
lang="全中文",
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -648,7 +649,7 @@ local langList={
set3="无尽(3)",
set4="隐形(4)",
set5="极限(5)",
seq="高级设置",
seq="高级设置(q)",
draw="初始场地编辑",
back="返回",
},
@@ -694,6 +695,7 @@ local langList={
quickR="快速重新开始",
swap="组合键切换攻击模式",
fine="极简操作提示音",
spawn="方块生成音",
back="返回",
},
setting_video={
@@ -880,8 +882,8 @@ local langList={
},
{
anykey="Press any button",
newVersion="Updating detected! Save format may have been updated, settings reseted",
marking="Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
newVersion="Updating detected! Saving format updated",
marking="Game Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
lang="English",
atkModeName={"Random","Badges","K.O.s","Attackers"},
royale_remain=function(n)return n.." Players Remaining"end,
@@ -1075,7 +1077,7 @@ local langList={
set3="Inf. (3)",
set4="Blind (4)",
set5="Master (5)",
seq="Advanced",
seq="Advanced(q)",
draw="Field Edit",
back="Back",
},
@@ -1121,6 +1123,7 @@ local langList={
quickR="Quick Retry",
swap="Key Combination (Change Atk. Mode)",
fine="Finesse Error Sound",
spawn="Piece Spawning Sound",
back="Back",
},
setting_video={
@@ -1307,8 +1310,8 @@ local langList={
},
{
anykey="↓□↓",
newVersion="&!!! ___/_?_ R",
marking="Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
newVersion="&!!! ___!",
marking="Game Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
lang="?????",
atkModeName={"?","( )","!","←→"},
royale_remain=function(n)return n.."~"end,
@@ -1502,7 +1505,7 @@ local langList={
set3="Inf. (3)",
set4="Blind (4)",
set5="Master (5)",
seq="Advanced",
seq="Advanced(q)",
draw="Field Edit",
back="X",
},

View File

@@ -404,12 +404,9 @@ end
function Pnt.play()
if marking then
setFont(26)
local x=Timer()*46%1680-200
gc.setColor(1,1,1,abs(.26*(1-x/640)))
mStr(text.marking,x,260+62*sin(Timer()))
-- gc.setColor(1,1,1,.0626)
-- mStr(text.marking,260,62+26*sin(Timer()))
-- mStr(text.marking,1100,460+62*sin(Timer()*1.2))
local t=Timer()
gc.setColor(1,1,1,.2+.1*(sin(3*t)+sin(2.6*t)))
mStr(text.marking,190,60+26*sin(t))
end
for p=1,#players do
players[p]:draw()

View File

@@ -118,8 +118,8 @@ function sceneInit.pause(org)
format("%d(%d) %.2fLPM",S.row,S.dig,S.row/S.time*60),
format("%d(%d)",S.atk,S.digatk),
format("%d(%d-%d)",S.pend,S.recv,S.recv-S.pend),
format("%d/%d/%d/%d",S.clear_S[1],S.clear_S[2],S.clear_S[3],S.clear_S[4]),
format("(%d)/%d/%d/%d",S.spin_S[1],S.spin_S[2],S.spin_S[3],S.spin_S[4]),
format("%d/%d/%d/%d",S.clears[1],S.clears[2],S.clears[3],S.clears[4]),
format("(%d)/%d/%d/%d",S.spins[1],S.spins[2],S.spins[3],S.spins[4]),
format("%d(+%d)/%d(%d)",S.b2b,S.b3b,S.pc,S.hpc),
format("%d[%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
},
@@ -223,11 +223,22 @@ function sceneInit.staff()
end
function sceneInit.stat()
local S=stat
local X1,X2,Y1,Y2={0,0,0,0},{0,0,0,0},{},{}
for i=1,7 do
local S,C=S.spin[i],S.clear[i]
Y1[i]=S[1]+S[2]+S[3]+S[4]
Y2[i]=C[1]+C[2]+C[3]+C[4]
for j=1,4 do
X1[j]=X1[j]+S[j]
X2[j]=X2[j]+C[j]
end
end
sceneTemp={
count=0,
chart={
A1=S.spin,A2=S.clear,
X1=S.spin_S,X2=S.clear_S,
Y1=S.spin_B,Y2=S.clear_B,
X1=X1,X2=X2,
Y1=Y1,Y2=Y2,
},
item={
S.run,
@@ -241,7 +252,7 @@ function sceneInit.stat()
format("%d/%.3f%%",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
S.b2b.." "..S.b3b,
S.pc.." "..S.hpc,
}
},
}
for i=1,11 do
sceneTemp.item[i]=text.stat[i].."\t"..sceneTemp.item[i]

View File

@@ -10,6 +10,7 @@ SFX.list={
"virtualKey",
"button","swipe",
"ready","start","win","fail","collect",
"spawn_1","spawn_2","spawn_3","spawn_4","spawn_5","spawn_6","spawn_7",
"move","rotate","rotatekick","hold",
"prerotate","prehold",
"lock","drop","fall",
@@ -38,6 +39,7 @@ end
function SFX.play(s,v,pos)
if setting.sfx==0 then return end
local S=SFX.list[s]--source list
if not S then return end
local n=1
while S[n]:isPlaying()do
n=n+1

View File

@@ -20,7 +20,7 @@ function Tmr.load()
elseif S.phase==5 then
local m=Modes[S.cur]--mode template
local M=require("modes/"..m.name)--mode file
Modes[m.name]=M
Modes[m.name],Modes[S.cur]=M
for k,v in next,m do
M[k]=v
end

View File

@@ -86,7 +86,6 @@ local function nextDir(n) return function()SKIN.rotate(n) end end
local function VKAdisp(n) return function()return VK_org[n].ava end end
local function VKAcode(n) return function()VK_org[n].ava=not VK_org[n].ava end end
local function setLang(n) return function()LANG.set(n)setting.lang=n end end
local function SEQpush(n) return function()local C=sceneTemp.cur+1 ins(preBag,C,n)sceneTemp.cur=C end end
local newButton,newSwitch,newSlider=WIDGET.new.button,WIDGET.new.switch,WIDGET.new.slider
@@ -127,37 +126,37 @@ local Widgets={
set4= newButton(940, 560,260,70, C.lightYellow, 32,pressKey("4")),
set5= newButton(940, 640,260,70, C.lightYellow, 32,pressKey("5")),
seq= newButton(665, 415,162,40, C.lightGreen, 32,function()SCN.goto("sequence")end),
seq= newButton(665, 415,200,40, C.lightGreen, 30,function()SCN.goto("sequence")end),
draw= newButton(150, 80, 220,80, C.white, 35,function()SCN.swapTo("draw")end),
back= newButton(1200, 640,120,120,C.white, 35,BACK),
},
sequence={
Z= newButton(150, 440,90, 90,C.white, 50,SEQpush(1)),
S= newButton(250, 440,90, 90,C.white, 50,SEQpush(2)),
J= newButton(350, 440,90, 90,C.white, 50,SEQpush(3)),
L= newButton(450, 440,90, 90,C.white, 50,SEQpush(4)),
T= newButton(550, 440,90, 90,C.white, 50,SEQpush(5)),
O= newButton(650, 440,90, 90,C.white, 50,SEQpush(6)),
I= newButton(750, 440,90, 90,C.white, 50,SEQpush(7)),
Z= newButton(150, 440,90, 90,C.white, 50,pressKey(1)),
S= newButton(250, 440,90, 90,C.white, 50,pressKey(2)),
J= newButton(350, 440,90, 90,C.white, 50,pressKey(3)),
L= newButton(450, 440,90, 90,C.white, 50,pressKey(4)),
T= newButton(550, 440,90, 90,C.white, 50,pressKey(5)),
O= newButton(650, 440,90, 90,C.white, 50,pressKey(6)),
I= newButton(750, 440,90, 90,C.white, 50,pressKey(7)),
Z5= newButton(150, 540,90, 90,C.white, 50,SEQpush(8)),
S5= newButton(250, 540,90, 90,C.white, 50,SEQpush(9)),
P= newButton(350, 540,90, 90,C.white, 50,SEQpush(10)),
Q= newButton(450, 540,90, 90,C.white, 50,SEQpush(11)),
F= newButton(550, 540,90, 90,C.white, 50,SEQpush(12)),
E= newButton(650, 540,90, 90,C.white, 50,SEQpush(13)),
T5= newButton(750, 540,90, 90,C.white, 50,SEQpush(14)),
U= newButton(850, 540,90, 90,C.white, 50,SEQpush(15)),
V= newButton(950, 540,90, 90,C.white, 50,SEQpush(16)),
W= newButton(150, 640,90, 90,C.white, 50,SEQpush(17)),
X= newButton(250, 640,90, 90,C.white, 50,SEQpush(18)),
J5= newButton(350, 640,90, 90,C.white, 50,SEQpush(19)),
L5= newButton(450, 640,90, 90,C.white, 50,SEQpush(20)),
R= newButton(550, 640,90, 90,C.white, 50,SEQpush(21)),
Y= newButton(650, 640,90, 90,C.white, 50,SEQpush(22)),
N= newButton(750, 640,90, 90,C.white, 50,SEQpush(23)),
H= newButton(850, 640,90, 90,C.white, 50,SEQpush(24)),
I5= newButton(950, 640,90, 90,C.white, 50,SEQpush(25)),
Z5= newButton(150, 540,90, 90,C.white, 50,pressKey(8)),
S5= newButton(250, 540,90, 90,C.white, 50,pressKey(9)),
P= newButton(350, 540,90, 90,C.white, 50,pressKey(10)),
Q= newButton(450, 540,90, 90,C.white, 50,pressKey(11)),
F= newButton(550, 540,90, 90,C.white, 50,pressKey(12)),
E= newButton(650, 540,90, 90,C.white, 50,pressKey(13)),
T5= newButton(750, 540,90, 90,C.white, 50,pressKey(14)),
U= newButton(850, 540,90, 90,C.white, 50,pressKey(15)),
V= newButton(950, 540,90, 90,C.white, 50,pressKey(16)),
W= newButton(150, 640,90, 90,C.white, 50,pressKey(17)),
X= newButton(250, 640,90, 90,C.white, 50,pressKey(18)),
J5= newButton(350, 640,90, 90,C.white, 50,pressKey(19)),
L5= newButton(450, 640,90, 90,C.white, 50,pressKey(20)),
R= newButton(550, 640,90, 90,C.white, 50,pressKey(21)),
Y= newButton(650, 640,90, 90,C.white, 50,pressKey(22)),
N= newButton(750, 640,90, 90,C.white, 50,pressKey(23)),
H= newButton(850, 640,90, 90,C.white, 50,pressKey(24)),
I5= newButton(950, 640,90, 90,C.white, 50,pressKey(25)),
left= newButton(850, 440,90, 90,C.lightGreen, 55,pressKey("left")),
right= newButton(950, 440,90, 90,C.lightGreen, 55,pressKey("right")),
@@ -189,8 +188,8 @@ local Widgets={
space= newButton(730, 360,120,120,C.grey, 65,setPen(-1)),
clear= newButton(1200, 500,120,120,C.white, 40,pressKey("delete")),
demo= newSwitch(755, 640,30,function()return sceneTemp.demo end,function()sceneTemp.demo=not sceneTemp.demo end),
copy= newButton(920, 640,120,120,C.lightRed, 35,copyBoard),
paste= newButton(1060, 640,120,120,C.lightBlue, 35,pasteBoard),
copy= newButton(920, 640,120,120,C.lightRed, 35,function()copyBoard()end),
paste= newButton(1060, 640,120,120,C.lightBlue, 35,function()pasteBoard()end),
custom= newButton(110, 80, 140,80, C.white, 35,function()SCN.goto("custom")end),
back= newButton(1200, 640,120,120,C.white, 35,BACK),
},
@@ -211,20 +210,21 @@ local Widgets={
quit= newButton(640,600,240,100,C.white,35,BACK),
},
setting_game={
graphic=newButton(200,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_video")end, nil,"sound"),
sound= newButton(1080,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_sound")end, nil,"ctrl"),
graphic=newButton(200,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_video")end, nil,"sound"),
sound= newButton(1080,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_sound")end, nil,"ctrl"),
ctrl= newButton(290,220,320,80,C.lightYellow,35,function()SCN.goto("setting_control")end, nil,"key"),
key= newButton(640,220,320,80,C.lightGreen,35,function()SCN.goto("setting_key")end, nil,"touch"),
touch= newButton(990,220,320,80,C.lightBlue,35,function()SCN.goto("setting_touch")end, nil,"reTime"),
reTime= newSlider(350,340,300,10,30,nil, SETval("reTime"), SETsto("reTime"), nil,"maxNext"),
maxNext=newSlider(350,440,300,6,30,nil, SETval("maxNext"), SETsto("maxNext"), nil,"autoPause"),
autoPause=newSwitch(350,540,20, SETval("autoPause"), SETrev("autoPause"), nil,"layout"),
reTime= newSlider(350,340,300,10,30,nil, SETval("reTime"), SETsto("reTime"), nil,"maxNext"),
maxNext=newSlider(350,440,300,6,30,nil, SETval("maxNext"), SETsto("maxNext"), nil,"autoPause"),
autoPause=newSwitch(350,540,20, SETval("autoPause"), SETrev("autoPause"), nil,"layout"),
layout= newButton(590,540,140,70,C.white,35,function()
SCN.goto("setting_skin")
end,nil,"quickR"),
quickR= newSwitch(1050,340,35, SETval("quickR"), SETrev("quickR"), nil,"swap"),
swap= newSwitch(1050,440,19, SETval("swap"), SETrev("swap"), nil,"fine"),
fine= newSwitch(1050,540,20, SETval("fine"), SETrev("fine"), nil,"back"),
quickR= newSwitch(1050,320,35, SETval("quickR"), SETrev("quickR"), nil,"swap"),
swap= newSwitch(1050,400,20, SETval("swap"), SETrev("swap"), nil,"fine"),
fine= newSwitch(1050,480,20, SETval("fine"), SETrev("fine"), nil,"spawn"),
spawn= newSwitch(1050,560,20, SETval("spawn"), SETrev("spawn"), nil,"back"),
back= newButton(1140,650,200,80,C.white,40,BACK, nil,"graphic"),
},
setting_video={
@@ -261,10 +261,10 @@ local Widgets={
setting_sound={
game= newButton(200,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_game")end, nil,"graphic"),
graphic=newButton(1080,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_video")end, nil,"sfx"),
sfx= newSlider(180,250,400,10,35,function()SFX.play("blip_1")end, SETval("sfx"), SETsto("sfx"), nil,"bgm"),
bgm= newSlider(750,250,400,10,35,function()BGM.freshVolume()end, SETval("bgm"), SETsto("bgm"), nil,"vib"),
vib= newSlider(180,440,400,5 ,28,function()VIB(2)end, SETval("vib"), SETsto("vib"), nil,"voc"),
voc= newSlider(750,440,400,10,32,function()VOC.play("nya")end, SETval("voc"), SETsto("voc"), nil,"stereo"),
sfx= newSlider(180,250,400,10,35,function()SFX.play("blip_1")end, SETval("sfx"), SETsto("sfx"), nil,"bgm"),
bgm= newSlider(750,250,400,10,35,function()BGM.freshVolume()end, SETval("bgm"), SETsto("bgm"), nil,"vib"),
vib= newSlider(180,440,400,5 ,28,function()VIB(2)end, SETval("vib"), SETsto("vib"), nil,"voc"),
voc= newSlider(750,440,400,10,32,function()VOC.play("nya")end, SETval("voc"), SETsto("voc"), nil,"stereo"),
stereo= newSlider(180,630,400,10,35,function()SFX.play("move",1,-1)SFX.play("lock",1,1)end, SETval("stereo"), SETsto("stereo"),function()return setting.sfx==0 end,"back"),
back= newButton(1140,650,200,80,C.white,40,BACK,nil,"game"),
},

View File

@@ -1,4 +1,4 @@
gameVersion="Alpha V0.9.0"
gameVersion="Alpha V0.9.1"
function love.conf(t)
t.identity="Techmino"--saving folder
t.version="11.1"

BIN
font.ttf

Binary file not shown.

BIN
image/skin/WTF.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

View File

@@ -29,7 +29,7 @@ scr={x=0,y=0,w=0,h=0,rad=0,k=1}--wid,hei,radius,scale K
customSel={1,22,1,1,7,3,1,1,8,4,1,1,1}
preField={h=20}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
preBag={1,2,3,4,5,6,7}
preBag={}
players={alive={},human=0}
--blockSkin,blockSkinMini={},{}--redefined in SKIN.change
@@ -81,51 +81,8 @@ if fs.getInfo("virtualkey.dat")then FILE.loadVK()end
--update data file
S=stat
if not S.version or S.version=="Alpha V0.8.15"then
S.clear_S={S.clear_1,S.clear_2,S.clear_3,S.clear_4}
S.clear={{},{},{},{},{},{},{}}
local A,B,C,D=int(S.clear_1/7),int(S.clear_2/7),int(S.clear_3/7),S.clear_4
for i=1,7 do
S.clear[i][1]=A
S.clear[i][2]=B
S.clear[i][3]=C
S.clear[i][4]=0
end
S.clear[7][4]=D
for i=1,S.clear_1%7 do S.clear[i][1]=S.clear[i][1]+1 end
for i=1,S.clear_2%7 do S.clear[i][2]=S.clear[i][2]+1 end
for i=1,S.clear_3%7 do S.clear[i][3]=S.clear[i][3]+1 end
S.clear_B={}
for i=1,7 do
S.clear_B[i]=S.clear[i][1]+S.clear[i][2]+S.clear[i][3]+S.clear[i][4]
end
S.spin_S={S.spin_0,S.spin_1,S.spin_2,S.spin_3}
S.spin={{},{},{},{},{},{},{}}
A,B,C,D=int(S.spin_0/7),int(S.spin_1/7),int(S.spin_2/7),int(S.spin_3/7)
for i=1,7 do
S.spin[i][1]=A
S.spin[i][2]=B
S.spin[i][3]=C
S.spin[i][4]=D
end
for i=1,S.spin_0%7 do S.spin[i][1]=S.spin[i][1]+1 end
for i=1,S.spin_1%7 do S.spin[i][2]=S.spin[i][2]+1 end
for i=1,S.spin_2%7 do S.spin[i][3]=S.spin[i][3]+1 end
for i=1,S.spin_3%7 do S.spin[i][4]=S.spin[i][4]+1 end
S.spin_B={}
for i=1,7 do
S.spin_B[i]=S.spin[i][1]+S.spin[i][2]+S.spin[i][3]+S.spin[i][4]
end
S.hpc=S.c
elseif S.version=="Alpha V0.8.16"then
for i=1,6 do
S.clear[7][4]=S.clear[7][4]+S.clear[i][4]
S.clear[i][4]=0
end
end
if not S.clear_B[8]then
S.clear_B,S.clear_S=nil
if not S.clear[1][5]then
for i=1,7 do
S.clear[i][5]=0
S.spin[i][5]=0
@@ -133,21 +90,17 @@ if not S.clear_B[8]then
for i=8,25 do
S.clear[i]={0,0,0,0,0}
S.spin[i]={0,0,0,0,0}
S.spin_B[i]=0
S.clear_B[i]=0
end
S.spin_S[5]=0
S.clear_S[5]=0
end
if S.version=="Alpha V0.8.18"or S.version=="Alpha V0.8.19"then
S.clear[3],S.clear[4]=S.clear[4],S.clear[3]
S.spin[3],S.spin[4]=S.spin[4],S.spin[3]
S.clear_B[3],S.clear_B[4]=S.clear_B[4],S.clear_B[3]
S.spin_B[3],S.spin_B[4]=S.spin_B[4],S.spin_B[3]
end
if S.version=="Alpha V0.8.22"then
if not S.off then
S.off=S.recv-S.pend
end
if S.clear[1][4]>0 then
for i=1,6 do
S.clear[7][4]=S.clear[7][4]+S.clear[i][4]
S.clear[i][4]=0
end
end
while #modeRanks>73 do
table.remove(modeRanks)
end
@@ -162,6 +115,9 @@ if setting.skin[10]==5 then
setting.skin[10],setting.skin[11]=1,5
end
if S.version~=gameVersion then
if S.version then
setting.spawn=true
end
S.version=gameVersion
TEXT.show(text.newVersion,640,200,30,"fly",.3)
end

View File

@@ -45,7 +45,7 @@ return{
mStr(P.modeData.event,-81,110)
setFont(75)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_S[4],-81,340)
mStr(P.stat.clears[4],-81,340)
end,
score=function(P)return{P.modeData.point,P.stat.score}end,
scoreDisp=function(D)return sectionName[int(D[1]*.1)+1].." "..D[2]end,

View File

@@ -18,7 +18,7 @@ return{
mText(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_S[4],-81,340)
mStr(P.stat.clears[4],-81,340)
end,
score=function(P)return{min(P.stat.row or 200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -21,7 +21,7 @@ return{
mText(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_S[4],-81,340)
mStr(P.stat.clears[4],-81,340)
gc.setColor(1,1,1,.2)
gc.draw(IMG.electric,-26,120,0,2.6)
end,

View File

@@ -22,7 +22,7 @@ return{
mText(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_S[4],-81,340)
mStr(P.stat.clears[4],-81,340)
gc.setColor(1,1,1,.2)
gc.draw(IMG.electric,-26,120,0,2.6)
end,

View File

@@ -20,7 +20,7 @@ return{
mText(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_S[4],-81,340)
mStr(P.stat.clears[4],-81,340)
gc.setColor(1,1,1,.2)
gc.draw(IMG.electric,-26,120,0,2.6)
end,

View File

@@ -23,7 +23,7 @@ return{
mText(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_S[4],-81,340)
mStr(P.stat.clears[4],-81,340)
gc.setColor(1,1,1,.2)
gc.draw(IMG.electric,-26,120,0,2.6)
end,

View File

@@ -12,7 +12,7 @@ return{
end
modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1
modeEnv.bag=preBag
if preBag[1]then modeEnv.bag=preBag end
PLY.newPlayer(1,340,15)
local L=modeEnv.opponent
if L~=0 then

View File

@@ -31,7 +31,7 @@ return{
end
modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1
modeEnv.bag=preBag
if preBag[1]then modeEnv.bag=preBag end
modeEnv.target=0
PLY.newPlayer(1,340,15)
local L=modeEnv.opponent

View File

@@ -10,13 +10,19 @@ return{
if not P.next[1] then
local height=freeRow.get(0)
local max=#P.field
for x=1,10 do
local h=max
while P.field[h][x]==0 and h>1 do
h=h-1
if max>0 then
for x=1,10 do
local h=max
while P.field[h][x]==0 and h>1 do
h=h-1
end
height[x]=h
end--get heights
else
for x=1,10 do
height[x]=0
end
height[x]=h
end--get heights
end
height[11]=999
local res={1,1,2,2,3,4}
@@ -27,9 +33,11 @@ return{
end
if d<40 or P.stat.row>2*42 then
A=#res+1
for i=A,A+5 do
res[i]=1
res[i+6]=2
for i=1,4 do
res[A]=1
res[A+1]=2
res[A+2]=6
A=A+3
end
goto END
end

View File

@@ -63,16 +63,16 @@ return{
getRank=function(P)
local S=P.modeData.point
if S==500 then
local L=P.stat.clear_S[4]
local T=P.stat.time
return
L>=30 and 5 or
L>=25 and 4 or
3
T<=118 and 5 or
T<=148 and 4 or
T<=183 and 3 or
2
else
return
S>=426 and 3 or
S>=326 and 2 or
S>=226 and 1 or
S>=300 and 2 or
S>=100 and 1 or
S>=50 and 0
end
end,

View File

@@ -67,7 +67,7 @@ return{
getRank=function(P)
local S=P.modeData.point
if S==500 then
local L=P.stat.clear_S[4]
local L=P.stat.clears[4]
return
L>=30 and 5 or
L>=25 and 4 or

View File

@@ -30,10 +30,10 @@ return{
local T=P.stat.time
return
T<=626 and 5 or
T<=1000 and 4 or
T<=1400 and 3 or
T<=2060 and 2 or
T<=2600 and 1 or
T<=888 and 4 or
T<=1140 and 3 or
T<=1406 and 2 or
T<=1626 and 1 or
0
end,
}

View File

@@ -5,10 +5,11 @@ local s={
ihs=true,irs=true,ims=true,
reTime=4,
maxNext=6,
autoPause=true,
quickR=true,
swap=true,
fine=false,
autoPause=true,
spawn=false,
lang=1,
skinSet=1,
skin={1,5,8,2,10,3,7,1,5,1,5,8,2,10,3,7,10,7,8,2,8,2,1,5,3},
@@ -32,9 +33,11 @@ local s={
powerInfo=false,
--sound
sfx=10,bgm=7,
vib=0,voc=0,
sfx=10,
bgm=7,
stereo=6,
vib=0,
voc=0,
--virtualkey
VKSFX=3,--SFX volume
@@ -60,14 +63,11 @@ s={
piece=0,row=0,dig=0,
atk=0,digatk=0,
send=0,recv=0,pend=0,off=0,
clear={},clear_B={},clear_S={0,0,0,0,0},
spin={},spin_B={},spin_S={0,0,0,0,0},
clear={},spin={},
pc=0,hpc=0,b2b=0,b3b=0,score=0,
lastPlay="sprint_10",--last played mode ID
}
for i=1,25 do
s.clear_B[i]=0
s.spin_B[i]=0
s.clear[i]={0,0,0,0,0}
s.spin[i]={0,0,0,0,0}
end

View File

@@ -109,9 +109,13 @@ end
function mergeStat(stat,delta)
for k,v in next,delta do
if type(v)=="table"then
mergeStat(stat[k],v)
if type(stat[k])=="table"then
mergeStat(stat[k],v)
end
else
stat[k]=stat[k]+v
if stat[k]then
stat[k]=stat[k]+v
end
end
end
end

View File

@@ -2,6 +2,7 @@ local L
if setting.lang==1 or setting.lang==2 then
L={
"ZS JL T O I",
"uid:225238922",
"tetr.js 也很好玩!",
"tetr.io 也很好玩!",
"Techminohaowan",
@@ -11,7 +12,9 @@ if setting.lang==1 or setting.lang==2 then
"osu好玩!",
"O spin Triple!",
"nullpomino 也很好玩!",
"Naki 可爱!",
"Miya:喵!",
"Miya 可爱!",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"Let-The-Bass-Kick!",
"l-=-1",
@@ -31,6 +34,7 @@ if setting.lang==1 or setting.lang==2 then
"有建议的话可以把信息反馈给作者~",
"学会使用两个旋转键, 三个更好",
"享受特色旋转系统!",
"无聊翻翻设置是好习惯",
"我的世界好玩!",
"提前旋转等设置可以用来救命",
"泰拉瑞亚好玩!",
@@ -38,20 +42,23 @@ if setting.lang==1 or setting.lang==2 then
"使用love2d引擎制作",
"少女祈祷中",
"扫雷好玩!",
"哦,我的上帝",
"你可以从统计页面打开游戏存档目录",
"你好 世界!",
"魔方好玩!",
"秘密数字:626",
"每个虚拟按键都可以隐藏/显示",
"每个块的出现方向可以自定义",
"联网还没做呢, 别急",
"键位是可以自定义的",
"合群了就会消失, 但是消失不代表没有意义",
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)",
"俄罗斯方块环游记也不错",
"俄罗斯方块环游记也不错!",
"调到特殊的日期也不会发生什么的",
"低帧率会降低游戏体验",
"戴上耳机以获得最佳体验",
"大满贯10连击消四全清!",
"车车人在此",
"草(日本语)",
"不要在上课时玩游戏!",
"不要盯着bug不放",
@@ -59,9 +66,9 @@ if setting.lang==1 or setting.lang==2 then
"不是动画,真的在加载!",
"本游戏难度上限很高, 做好心理准备",
"本游戏可不是休闲游戏",
"啊这,不会吧不会吧",
"3.1415926535897932384",
"26连T2来一个?",
"225238922 哔哩哔哩 干杯~",
"20G本质是一套全新的游戏规则",
"20连PC来一个?",
"2+2=Miya",
@@ -70,13 +77,15 @@ if setting.lang==1 or setting.lang==2 then
"11renPC!",
"<方块研究所>有一个Nspire-CX版本!",
"↑↑↓↓←→←→BABA",
"\"免费吃鸡方块\"",
'"免费吃鸡方块"',
"(RUR'U')R'FR2U'R'U'(RUR'F')",
}
elseif setting.lang==3 then
L={
"ZS JL T O I",
"You can set orientation for each block",
"You can open saving directory from stat. page",
"You are Grand Master",
"wwwwww",
"Who is diao",
"What about 26 TSDs?",
@@ -101,7 +110,9 @@ elseif setting.lang==3 then
"O spin triple!",
"Nothing will happen when some special day come",
"Not animation,real loading!",
"Naki so cute!",
"Miya:Nya!",
"Miya so cute!",
"Minesweeper is fun!",
"Minecraft is fun!",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
@@ -121,7 +132,6 @@ elseif setting.lang==3 then
"DO NOT PRESS F10",
"Do not play game in class!",
"Disappearing doesn't mean useless",
"diaoyoumei so bully",
"diao so bully",
"COOL!!",
"CLASSIC SEXY RUSSIAN BLOCKS",
@@ -145,7 +155,10 @@ elseif setting.lang==3 then
"11renPC!",
"↑↑↓↓←→←→BABA",
"\"Free block game with royale mode\"",
"/osk/",
"/jezevec/",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
":pog:",
}
elseif setting.lang==4 then
L={'!','@','#','$','%','^','&','*','(',')','-','=','_','+','[',']','{','}','\\','|',';',':','\'','"',',','<','.','>','/','?'}

View File

@@ -309,7 +309,7 @@ local function Pupdate_alive(P,dt)
if P.keyPressing[2]then
if arr>0 then
if mov==das+arr or mov==das then
if P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then
if not P.cur or P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then
mov=das+arr-1
else
P.act.moveRight(P,true)
@@ -334,7 +334,7 @@ local function Pupdate_alive(P,dt)
if P.keyPressing[1]then
if arr>0 then
if mov==das+arr or mov==das then
if P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
if not P.cur or P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
mov=das+arr-1
else
P.act.moveLeft(P,true)
@@ -728,7 +728,7 @@ local function Pdraw_norm(P)
if P.gameEnv.bagLine then
local L=P.gameEnv.bagLen
local C=-P.pieceCount%L--phase
gc.setColor(.5,.5,.5)
gc.setColor(.8,.5,.5)
for i=C,N-1,L do
local y=72*i+36
gc.line(321+P.fieldOff.x,y,441,y)
@@ -1018,15 +1018,14 @@ local function getNewStatTable()
piece=0,row=0,dig=0,
atk=0,digatk=0,
send=0,recv=0,pend=0,off=0,
clear={},clear_B={},clear_S={0,0,0,0,0},
spin={},spin_B={},spin_S={0,0,0,0,0},
clear={},clears={},spin={},spins={},
pc=0,hpc=0,b2b=0,b3b=0,
}
for i=1,25 do
T.clear[i]={0,0,0,0,0}
T.spin[i]={0,0,0,0,0}
T.clear_B[i]=0
T.spin_B[i]=0
T.clears[i]=0
T.spins[i]=0
end
return T
end
@@ -1349,6 +1348,9 @@ function player.hold(P,ifpre)
P:freshgho()
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,max(P.freshTime-5,0)
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
if P.human and setting.spawn then
SFX.play("spawn_"..C.id)
end
end
if P.human then
@@ -1404,6 +1406,9 @@ function player.popNext(P)--pop next queue to hand
end
if _[6]then P.act.hardDrop(P)_[6]=false end--IHdS
if P.human and setting.spawn then
SFX.play("spawn_"..P.cur.id)
end
end
end
function player.drop(P)--Place piece
@@ -1811,12 +1816,10 @@ function player.drop(P)--Place piece
local n=P.cur.name
if dospin then
_=STAT.spin[n] _[cc+1]=_[cc+1]+1--spin[1~25][0~4]
_=STAT.spin_S _[cc+1]=_[cc+1]+1--spin[0~4]
_=STAT.spin_B _[n]=_[n]+1--spin[1~25]
_=STAT.spins _[cc+1]=_[cc+1]+1--spin[0~4]
elseif cc>0 then
_=STAT.clear[n] _[cc]=_[cc]+1--clear[1~25][1~5]
_=STAT.clear_S _[cc]=_[cc]+1--clear[1~5]
_=STAT.clear_B _[n]=_[n]+1--clear[1~25]
_=STAT.clears _[cc]=_[cc]+1--clear[1~5]
end
--Update stat
@@ -1935,6 +1938,9 @@ function player.win(P,result)
if P.human then
gameOver()
TASK.new(TICK.autoPause,{0})
if marking then
P:showTextF(text.marking,0,-226,22,"appear",.4,.0626)
end
end
P:newTask(TICK.finish)
end
@@ -2015,6 +2021,9 @@ function player.lose(P)
gameOver()
P:newTask(#players>1 and TICK.lose or TICK.finish)
TASK.new(TICK.autoPause,{0})
if marking then
P:showTextF(text.marking,0,-226,22,"appear",.4,.0626)
end
else
P:newTask(TICK.lose)
end

View File

@@ -21,6 +21,7 @@ local list={
"text_bone(mrz)",
"colored_bone(mrz)",
"white_bone(mrz)",
"WTF",
}
local SKIN={}
SKIN.lib={}

View File

@@ -1,3 +1,4 @@
local gc=love.graphics
local Tick={}
function Tick.finish(P)
P.endCounter=P.endCounter+1
@@ -69,4 +70,14 @@ function Tick.autoPause(data)
return true
end
end
function Tick.autoResize(data)
data[1]=data[1]+1
if data[1]==62 then
local w,h=gc.getWidth(),gc.getHeight()
if w<h then
love.resize(w,h)
end
return true
end
end
return Tick

View File

@@ -1,23 +1,22 @@
local S=[=[
"Patron"(time ordered,may not accurate):
[rmb100+]:
那没事了(T6300) 加油啊,钉钉动了的大哥哥(T3228)
弥佑瑶 Alan
幽灵3383 靏鸖龘龘
込余 saki
那没事了(T6300) 加油啊,钉钉动了的大哥哥(T3228)
弥佑瑶 Alan 幽灵3383
靏鸖龘龘 込余 saki
[rmb10+]:
八零哥 蕴空之灵 gggf127 dtg
ThTsOd Fireboos 金巧 10元
立斐 Deep_Sea 时雪 yyangdid
sfqr 心痕 Sasoric 夏小亚
仁参 乐↗乐↘ 喜欢c4w的ztcjoin 面包
蠢熏 潘一栗 Lied 星街书婉
祝西 829 e m*12 我永远爱白银诺艾尔(鹏
PCX kagura77 呆喂 GlowingEmbers
轩辕辚 HimuroAki TCV100 tech有养成系统了@7065
HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思 世界沃德
蓝绿 天生的魔法师 琳雨空 T8779.易缄 吃水榴莲
八零哥 蕴空之灵 gggf127 dtg
ThTsOd Fireboos 金巧 10元
立斐 Deep_Sea 时雪 yyangdid
sfqr 心痕 Sasoric 夏小亚 仁参
乐↗乐↘ 喜欢c4w的ztcjoin 面包 蠢熏
潘一栗 Lied 星街书婉 祝西 829
e m*12 我永远爱白银诺艾尔(鹏 PCX
kagura77 呆喂 GlowingEmbers 轩辕辚
HimuroAki TCV100 tech有养成系统了@7065
HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思
世界沃德 蓝绿 天生的魔法师 琳雨空
T8779.易缄 吃水榴莲 诗情画意 星姐阿夸双推Man暗炎
Thanks!!!
Future outlook:
@@ -56,25 +55,30 @@ Future outlook:
2048 (with next (with deadly mode))
mine sweeper
tank battle
time-based-rank for master advanced mode(1:58/228/303/300P/100P)
简易防沉迷系统
full-key control
dragging control
"next" SFX
new layout of player (rectangle so stupid)
touch-drag control
cool backgrounds
'Encrypt'(compile to byte code)
better drop FX
60+ fps supporting
in-game document
lang setting page
game recording
new widgets (joystick etc.)
splashing block
cool backgrounds
more graphic FXs & 3D features & animations
Encrypt source code (compile to byte code)
network game
new AI: task-Z
0.9.1: next piece SFX
new:
next piece spawn SFX
code:
render background to canvas first, not redering each frame
fixed:
error when moving [nothing] when arr>0
error when complete master-advanced
0.9.0: Custom Sequence Update
new:
custom sequence
@@ -82,20 +86,26 @@ Future outlook:
many new tips
more powerful watermark
die animation in non-royale mode
better in-game layout
changed:
mode name shown at the top of screen
faster & harder attacker-ultimate
time-based-rank for master-advanced
little easier to get S in PC challenge (easy mode)
easier to get S in infinite mode, c4w, PC
harder to unlock sprint 400/1000
harder to unlock sprint-400/1000
harder to get high rank of sprint-1000
harder drought-lunatic
code:
file sorted
task system rewrited, now perfect (maybe)
remove scissors/blendMode setting in drawing players
fixed:
screen orientation sometimes error after wake up the phone
hard move won't deactive "spin"
do not clear dead enemies' field
show ghost's center when ghost is off
error when get a PC in drought-lunatic
0.8.24: Bug Fixed
new: