Files
Techmino/parts/scenes/load.lua
2020-12-16 00:08:13 +08:00

271 lines
5.7 KiB
Lua

local gc=love.graphics
local tc=love.touch
local max,min,sin=math.max,math.min,math.sin
local function tick_httpREQ_launch(task)
local time=0
while true do
coroutine.yield()
local response,request_error=client.poll(task)
if response then
local res=json.decode(response.body)
if res then
if response.code==200 then
LOG.print(res.notice,360,COLOR.sky)
if VERSION_CODE>=res.version_code then
LOG.print(text.versionIsNew,360,COLOR.sky)
else
LOG.print(string.gsub(text.versionIsOld,"$1",res.version_name),"warn")
end
else
LOG.print(text.netErrorCode..response.code..": "..res.message,"warn")
end
end
return
elseif request_error then
LOG.print(text.getNoticeFail..": "..request_error,"warn")
return
end
time=time+1
if time>360 then
LOG.print(text.httpTimeout,"message")
return
end
end
end
local function tick_httpREQ_autoLogin(task)
local time=0
while true do
coroutine.yield()
local response,request_error=client.poll(task)
if response then
if response.code==200 then
LOGIN=true
local res=json.decode(response.body)
if res then
LOG.print(text.loginSuccessed)
end
else
LOGIN=false
local err=json.decode(response.body)
if err then
LOG.print(text.loginFailed..": "..text.netErrorCode..response.code.."-"..err.message,"warn")
end
end
return
elseif request_error then
LOG.print(text.loginFailed..": "..request_error,"warn")
return
end
time=time+1
if time>360 then
LOG.print(text.httpTimeout,"message")
return
end
end
end
local scene={}
local time--Animation timer
local phase--Loading stage
local loadCur--Loading timer
local loadTar--Current Loading bar length
local stageLenth--Length of each stage
local studioLogo--Studio logo text object
local skip
function scene.sceneInit()
time=0
phase=0
loadCur=0
loadTar=0
stageLenth={
VOC.getCount(),
BGM.getCount(),
SFX.getCount(),
IMG.getCount(),
17,--Fontsize 20~100
SKIN.getCount(),
#MODES,
1,
1,
}
studioLogo=gc.newText(getFont(80),"26F Studio")
skip=false--If skipped
end
function scene.sceneBack()
love.event.quit()
end
function scene.keyDown(k)
if k=="a"then
skip=true
elseif k=="s"then
skip,MARKING=true
elseif k=="space"then
time=max(time-5,0)
elseif k=="escape"then
SCN.back()
end
end
function scene.touchDown()
if #tc.getTouches()==2 then
skip=true
end
end
function scene.update()
if time==400 then return end
repeat
if phase==0 then
elseif phase==1 then
VOC.loadOne()
elseif phase==2 then
BGM.loadOne()
elseif phase==3 then
SFX.loadOne()
elseif phase==4 then
IMG.loadOne()
elseif phase==5 then
getFont(15+5*loadCur)
elseif phase==6 then
SKIN.loadOne()
elseif phase==7 then
local m=MODES[loadCur]--Mode template
local M=require("parts/modes/"..m.name)--Mode file
MODES[m.name],MODES[loadCur]=M
for k,v in next,m do
M[k]=v
end
M.records=FILE.load("record/"..m.name..".rec")or M.score and{}
-- M.icon=gc.newImage("media/image/modeIcon/"..m.icon..".png")
-- M.icon=gc.newImage("media/image/modeIcon/custom.png")
elseif phase==8 then
local function C(x,y)
local _=gc.newCanvas(x,y)
gc.setCanvas(_)
return _
end
puzzleMark={}
gc.setLineWidth(3)
for i=1,17 do
puzzleMark[i]=C(30,30)
local _=SKIN.libColor[i]
gc.setColor(_[1],_[2],_[3],.6)
gc.rectangle("line",5,5,20,20)
gc.rectangle("line",10,10,10,10)
end
for i=18,24 do
puzzleMark[i]=C(30,30)
gc.setColor(SKIN.libColor[i])
gc.rectangle("line",7,7,16,16)
end
local _=C(30,30)
gc.setColor(1,1,1)
gc.line(5,5,25,25)
gc.line(5,25,25,5)
puzzleMark[-1]=C(30,30)
gc.setColor(1,1,1,.8)
gc.draw(_)
_:release()
gc.setCanvas()
elseif phase==9 then
SKIN.change(SETTING.skinSet)
STAT.run=STAT.run+1
LOADED=true
SFX.play("welcome_sfx")
VOC.play("welcome_voc")
httpRequest(tick_httpREQ_launch,PATH.api..PATH.appInfo)
if USER.auth_token and USER.email then
httpRequest(
tick_httpREQ_autoLogin,
PATH.api..PATH.auth,
"GET",
{["Content-Type"]="application/json"},
json.encode{
email=USER.email,
auth_token=USER.auth_token,
}
)
end
end
if loadTar then
loadCur=loadCur+1
if loadCur>loadTar then
phase=phase+1
loadCur=1
loadTar=stageLenth[phase]
end
end
time=time+1
if time==400 then
SCN.swapTo("intro")
return
end
until not skip
end
function scene.draw()
gc.push("transform")
gc.translate(640,360)
gc.scale(2)
local Y=3250*(sin(-1.5708+min(time,260)/260*3.1416)+1)+200
--Draw 26F Studio logo
if time>200 then
gc.push("transform")
gc.translate(-220,Y-6840)
gc.setColor(.4,.4,.4)
gc.rectangle("fill",0,0,440,260)
local t=TIME()
gc.setColor(COLOR.dCyan)
mDraw(studioLogo,220,Y*.2-1204)
mDraw(studioLogo,220,-Y*.2+1476)
gc.setColor(COLOR.cyan)
mDraw(studioLogo,220+4*sin(t*10),136+4*sin(t*6))
mDraw(studioLogo,220+4*sin(t*12),136+4*sin(t*8))
gc.setColor(COLOR.dCyan)
mDraw(studioLogo,219,137)
mDraw(studioLogo,219,135)
mDraw(studioLogo,221,137)
mDraw(studioLogo,221,135)
gc.setColor(.2,.2,.2)
mDraw(studioLogo,220,136)
gc.pop()
end
--Draw floors
setFont(50)
gc.setLineWidth(4)
for i=1,27 do
if i<26 then
local r,g,b=COLOR.rainbow(i+3.5)
gc.setColor(r*.26,g*.26,b*.26)
gc.rectangle("fill",-220,Y-260*i-80,440,260)
gc.setColor(r*1.6,g*1.6,b*1.6)
gc.printf(i.."F",100,Y-260*i-70,100,"right")
gc.setColor(1,1,1)
gc.rectangle("line",-160,Y-260*i,80,50)
end
gc.line(-220,Y-260*i+180,220,Y-260*i+180)
end
--Draw side line
gc.setColor(1,1,1)
gc.line(-220,Y-80,-220,Y-6840)
gc.line(220,Y-80,220,Y-6840)
gc.pop()
end
return scene