Files
Techmino/parts/scenes/app_reflect.lua
2021-12-03 17:15:32 +08:00

138 lines
3.2 KiB
Lua

local gc=love.graphics
local rnd=math.random
local setFont,mStr=FONT.set,GC.mStr
local scene={}
local state
local ct
local s1,s2
local up,winner=true
local function reset()
state=0
ct=20
s1,s2=0,0
end
function scene.sceneInit()
reset()
BG.set('none')
end
function scene.keyDown(key,isRep)
if isRep then return end
if state==0 then
if key=='space'then
reset()
state=1
ct=60
end
elseif state==2 and #key==1 then
key=("qapl"):find(key,nil,true)
if key then
--BEAUTIFUL LOGIC BELOW:
--early = error, [UP-key]==[target is up] = correct sfx, else = wrong sfx
SFX.play(ct>6 and'finesseError'or key%2==1==up and'reach'or'fail')
--(early && P2-key || not early && [P1-key]==[target is up]) = P1 win, else P2 win
if ct>6 and key>2 or ct<=6 and key%4<2==up then
winner=1;s1=s1+1
else
winner=2;s2=s2+1
end
state=3
ct=60
end
end
end
function scene.touchDown(x,y)
scene.keyDown(
state==0 and"space"or
x<640 and
(y<360 and"q"or"a")or
(y<360 and"p"or"l")
)
end
function scene.update()
if state==0 then--Menu
if ct>0 then
ct=ct-1
elseif rnd()<.00626 then
ct=30
end
elseif state==1 then--Waiting
ct=ct-1
if ct==0 then
ct=rnd(26,162)
up=rnd()<.5
state=2
end
elseif state==2 then--Winking
ct=ct-1
if ct==0 then ct=6 end
elseif state==3 then
ct=ct-1
if ct==0 then
if s1==6 or s2==6 then
state=0
else
state=1
end
ct=60
end
end
end
function scene.draw()
--Dividing line
gc.setLineWidth(10)
gc.setColor(1,1,1,.9)
gc.line(640,0,640,720)
gc.setColor(1,1,1,.3)
gc.line(500,360,780,360)
--Help
setFont(100)
mStr("Q",80,100)
mStr("A",80,480)
mStr("P",1200,100)
mStr("L",1200,480)
--Score
setFont(80)
gc.printf(s1,50,300,200)
gc.printf(s2,1030,300,200,'right')
if state==0 then
setFont(40)
mStr(MOBILE and"Touch to Start"or"Press space to Start",640,400)
mStr("Press key on the same side when block appear!",640,500)
if ct>0 then
setFont(100)
gc.setColor(1,1,1,ct/30)
mStr("REFLECT",640,140)
end
elseif state==1 then
gc.setColor(.2,.7,.4,math.min((60-ct)/10,ct/10)*.8)
gc.arc('fill',640,360,260,-1.5708,-1.5708+(ct/60)*6.2832)
elseif state==2 and ct<5 then
gc.setColor(1,ct>2 and 1 or 0,0)
gc.rectangle('fill',640-100,(up and 180 or 540)-100,200,200,10)
elseif state==3 then
local x=(60-ct)*62
gc.setColor(.4,1,.4,ct/100)
if winner==1 then
gc.rectangle('fill',0,0,x,720)
else
gc.rectangle('fill',1280,0,-x,720)
end
end
end
scene.widgetList={
WIDGET.newKey{name='back',x=640,y=675,w=150,h=50,font=40,sound='back',fText=CHAR.icon.back,code=backScene},
}
return scene