Files
Techmino/parts/scenes/launchpad.lua
2024-09-26 02:29:24 +08:00

297 lines
13 KiB
Lua

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 floor,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.set('all','seek',0)BGM.play() 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='touch'},{sfx='lock'},{sfx='drop'},{sfx='fall'},
},
{
{sfx='hold'},{sfx='prehold'},
{samp={tag='clear_1',func=function() playClearSFX(1) end}},
{samp={tag='clear_2',func=function() playClearSFX(2) end}},
{samp={tag='clear_3',func=function() playClearSFX(3) end}},
{samp={tag='clear_4',func=function() playClearSFX(4) end}},
{samp={tag='clear_7',func=function() playClearSFX(7) end}},
{samp={tag='clear_10',func=function() playClearSFX(10) end}},
},
{{sfx='prerotate'}, {sfx='rotate'}, {sfx='rotatekick'}, {}, {voc='single'}, {voc='double'}, {voc='triple'}, {voc='techrash'}},
{{sfx='finesseError'},{sfx='finesseError_long'},{sfx='drop_cancel'},{}, {sfx='spin_0'}, {sfx='spin_1'}, {sfx='spin_2'}, {sfx='spin_3'}},
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {}, {sfx='warn_beep'},{sfx='reach'}, {sfx='pc'}},
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {}, {sfx='collect'}, {sfx='emit'}, {sfx='warn_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='touch'},{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'}},
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {sfx='warn_1'}, {sfx='warn_beep'}, {sfx='reach'}, {sfx='pc'}},
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {sfx='warn_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.enter()
DiscordRPC.update("Playing Launchpad")
end
function scene.touchDown(x,y)
x,y=floor((x-pad.x)/80),floor((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(COLOR.dX)
gc_rectangle('fill',-3,-3,726,646,2)
gc_setColor(white)
gc_rectangle('line',-3,-3,726,646,2)
-- Buttons
for y=1,8 do
gc_setColor(COLOR.dX)
gc_circle('fill',40,(y-1)*80+40,34)
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(COLOR.dX)
for y=1,8 do for x=1,8 do
gc_rectangle('fill',x*80+2,(y-1)*80+2,76,76,5)
end end
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('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('line',x*80+40,(y-1)*80+40,5) end
if k.voc then gc_rectangle('line',x*80+30,(y-1)*80+30,20,20,1) end
if k.samp then gc_rectangle('fill',x*80+10,(y-1)*80+35,60,5,1) end
if k.bgm then gc_rectangle('fill',x*80+20,(y-1)*80+15,40,5,2) end
end
if pad.alpha[y][x]>0 then
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,sound='back',font=60,fText=CHAR.icon.back,code=backScene},
}
return scene