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

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