Files
Techmino/parts/scenes/launchpad.lua
2021-11-02 17:21:36 +08:00

286 lines
12 KiB
Lua

local gc=love.graphics
local gc_push,gc_pop=gc.push,gc.pop
local gc_translate=gc.translate
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_rectangle,gc_circle=gc.rectangle,gc.circle
local isDown=love.keyboard.isDown
local int,max,min=math.floor,math.max,math.min
local mStr=GC.mStr
local scene={}
local pad
pad={x=140,y=65,page=1,
func={
function()pad.page=1 end,
function()pad.page=2 end,
function()pad.page=3 end,
function()pad.page=4 end,
function()pad.page=5 end,
function()pad.page=6 end,
function()BGM.seek(0)BGM.play(BGM.nowPlay)end,
function()BGM.stop()end,
},
funcAlpha=TABLE.new(0,8),
alpha={
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
},
{
{
{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_5',func=function()playClearSFX(5)end}},
{samp={tag='clear_6',func=function()playClearSFX(6)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'}},
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {}, {sfx='collect'},{sfx='emit'}, {sfx='blip_1'}},
{{sfx='ren_9'}, {sfx='ren_10'}, {sfx='ren_11'}, {sfx='ren_mega'},{voc='win'}, {voc='lose'}, {sfx='win'}, {sfx='fail'}},
{{sfx='spawn_1'}, {sfx='spawn_2'}, {sfx='spawn_3'}, {sfx='spawn_4'}, {sfx='spawn_5'},{sfx='spawn_6'},{sfx='spawn_7'},{}},
},
{
{{voc='mini'}, {voc='b2b'}, {voc='b3b'}, {voc='perfect_clear'},{voc='half_clear'},{}, {}, {}},
{{voc='zspin'}, {voc='sspin'}, {voc='jspin'}, {voc='lspin'}, {voc='tspin'}, {voc='ospin'}, {voc='ispin'},{}},
{{voc='pspin'}, {voc='qspin'}, {voc='fspin'}, {voc='espin'}, {voc='uspin'}, {voc='vspin'}, {voc='wspin'},{voc='xspin'}},
{{voc='rspin'}, {voc='yspin'}, {voc='nspin'}, {voc='hspin'}, {voc='cspin'}, {}, {}, {}},
{{voc='single'}, {voc='double'},{voc='triple'},{voc='techrash'}, {voc='pentacrash'},{voc='hexacrash'},{}, {}},
{{voc='win'}, {voc='lose'}, {}, {}, {}, {}, {}, {}},
{{voc='welcome'},{voc='bye'}, {}, {}, {}, {}, {}, {}},
{{}, {}, {}, {}, {}, {}, {}, {}},
},
{
{
{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_5',func=function()playClearSFX(5)end}},
{samp={tag='clear_6',func=function()playClearSFX(6)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'}},
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {sfx='blip_1'}, {sfx='warning'}, {sfx='reach'}, {sfx='pc'}},
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {sfx='blip_2'}, {sfx='collect'}, {sfx='emit'}, {}},
{{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}},
{},{},{}
},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
},
{
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
{{},{},{},{},{},{},{},{}},
},
(function()--BGM page
local L=BGM.getList()
local B={}
for y=1,8 do
B[y]={}
for x=1,8 do
local i=8*(y-1)+x
B[y][x]=L[i]and{bgm=L[i]}or{}
end
end
return B
end)(),
}
local showLabel
local function press(x,y)
if x==0 then
pad.func[y]()
pad.funcAlpha[y]=1
else
local k=pad[pad.page][y][x]
if k.samp then k.samp.func()end
if k.sfx then SFX.play(k.sfx,k.vol)end
if k.voc then VOC.play(k.voc)end
if k.bgm then BGM.play(k.bgm)end
pad.alpha[y][x]=1
end
end
function scene.touchDown(x,y)
x,y=int((x-pad.x)/80),int((y-pad.y)/80)
if x>=0 and x<=8 and y>=0 and y<=7 then
press(x,y+1)
end
end
scene.mouseDown=scene.touchDown
function scene.keyDown(key,isRep)
if isRep then return end
if key=="z"or key=="x"then
love.mousepressed(love.mouse.getPosition())
elseif #key==1 then
if("12345678"):find(key,nil,true)then
press(0,tonumber(key))
else
key=("hjkluiop"):find(key,nil,true)
if key then
if isDown("q")then press(key,1)end
if isDown("w")then press(key,2)end
if isDown("e")then press(key,3)end
if isDown("r")then press(key,4)end
if isDown("a")then press(key,5)end
if isDown("s")then press(key,6)end
if isDown("d")then press(key,7)end
if isDown("f")then press(key,8)end
end
end
elseif key=="tab"then
SCN.swapTo('music','none')
elseif key=="space"then
showLabel=not showLabel
elseif key=="escape"then
SCN.back()
end
end
function scene.update(dt)
for y=1,8 do
if pad.funcAlpha[y]>0 then
pad.funcAlpha[y]=max(pad.funcAlpha[y]-dt*2,0)
end
end
for y=1,8 do for x=1,8 do
if pad.alpha[y][x]>0 then
pad.alpha[y][x]=max(pad.alpha[y][x]-dt*4,0)
end
end end
for i=1,8 do
if isDown(("qwerasdf"):sub(i,i))then
local L=pad.alpha[i]
for j=1,8 do
pad.alpha[i][j]=min(L[j]+dt*10,max(L[j],.4))
end
end
end
end
function scene.draw()
local white=COLOR.Z
gc_push('transform')
gc_translate(pad.x,pad.y)
gc_setLineWidth(2)
--Pad frame
gc_setColor(white)
gc_rectangle('line',-3,-3,726,646,2)
--Buttons
for y=1,8 do
gc_setColor(white)
gc_circle('line',40,(y-1)*80+40,34)
if pad.funcAlpha[y]>0 then
gc_setColor(1,1,1,pad.funcAlpha[y]*.7)
gc_circle('fill',40,(y-1)*80+40,34)
end
end
setFont(10)
gc_setColor(white)
for y=1,8 do for x=1,8 do
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.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.voc then gc_rectangle('line',x*80+30,(y-1)*80+30,20,20,1)end
if k.samp then gc_rectangle('fill',x*80+10,(y-1)*80+35,60,5,1)end
if k.bgm then gc_rectangle('fill',x*80+20,(y-1)*80+15,40,5,2)end
end
if pad.alpha[y][x]>0 then
gc_setColor(1,1,1,pad.alpha[y][x]*.7)
gc_rectangle('fill',x*80+2,(y-1)*80+2,76,76,5)
gc_setColor(white)
end
end end
gc_pop()
end
scene.widgetList={
WIDGET.newText{name='title', x=640, y=-5,font=50},
WIDGET.newSlider{name='bgm', x=1000,y=80, lim=130,w=250,disp=SETval('bgm'),code=function(v)SETTING.bgm=v BGM.setVol(SETTING.bgm)end},
WIDGET.newSlider{name='sfx', x=1000,y=150,lim=130,w=250,disp=SETval('sfx'),code=function(v)SETTING.sfx=v SFX.setVol(SETTING.sfx)end},
WIDGET.newSlider{name='voc', x=1000,y=220,lim=130,w=250,disp=SETval('voc'),code=function(v)SETTING.voc=v VOC.setVol(SETTING.voc)end},
WIDGET.newSwitch{name='label',x=1200,y=290,lim=160,disp=function()return showLabel end,code=pressKey"space",},
WIDGET.newButton{name='music',x=1140,y=540,w=170,h=80,font=40,code=pressKey"tab"},
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
}
return scene