139 lines
3.2 KiB
Lua
139 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.enter()
|
|
reset()
|
|
BG.set('none')
|
|
DiscordRPC.update("Playing Reflect")
|
|
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
|