local gc=love.graphics local int,ceil,rnd=math.floor,math.ceil,math.random local max,min,sin=math.max,math.min,math.sin local ins,rem=table.insert,table.remove local function NULL(...)end local SCR=SCR local BGvars={_G=_G,SHADER=SHADER} local BG local back={} back.none={ draw=function() gc.clear(.15,.15,.15) end, } back.grey={ draw=function() gc.clear(.3,.3,.3) end, } back.glow={ init=function() t=rnd()*2600 end, update=function(dt) t=t+dt end, draw=function() local t=(sin(t*.5)+sin(t*.7)+sin(t*.9+1)+sin(t*1.5)+sin(t*2+10))*.08 gc.clear(t,t,t) end, }--Light-dark back.rgb={ init=function() t=rnd()*2600 end, update=function(dt) t=t+dt end, draw=function() gc.clear( sin(t*1.2)*.15+.2, sin(t*1.5)*.15+.2, sin(t*1.9)*.15+.2 ) end, }--Changing pure color back.flink={ init=function() t=rnd()*2600 end, update=function(dt) t=t+dt end, draw=function() local t=.13-t%3%1.9 if t<.2 then gc.clear(t,t,t) else gc.clear(0,0,0) end end, }--Flash after random time local wingColor={ {0., .9, .9,.626}, {.3, 1., .3,.626}, {.9, .9, 0.,.626}, {1., .5, 0.,.626}, {1., .3, .3,.626}, {.5, 0., 1.,.626}, {.3, .3, 1.,.626}, {0., .9, .9,.626}, } back.wing={ init=function() gc.setDefaultFilter("linear","linear") bar=gc.newCanvas(41,1) gc.setCanvas(bar) gc.push("transform") gc.origin() for x=0,20 do gc.setColor(1,1,1,x/11) gc.rectangle("fill",x,0,1,1) gc.rectangle("fill",41-x,0,1,1) end gc.pop() gc.setCanvas() BG.resize() end, resize=function() crystal={} W,H=SCR.w,SCR.h for i=1,16 do crystal[i]={ x=i<9 and W*.05*i or W*.05*(28-i), y=H*.1, a=0, va=0, f=i<9 and .012-i*.0005 or .012-(17-i)*.0005 } end end, update=function() for i=1,16 do local B=crystal[i] B.a=B.a+B.va B.va=B.va*.986-B.a*B.f end end, draw=function() gc.clear(.06,.06,.06) local sy=H*.8 for i=1,8 do gc.setColor(wingColor[i]) local B=crystal[i] gc.draw(bar,B.x,B.y,B.a,1,sy,20,0) B=crystal[17-i] gc.draw(bar,B.x,B.y,B.a,1,sy,20,0) end end, event=function(level) for i=1,8 do local B=crystal[i] B.va=B.va+.001*level*(1+rnd()) B=crystal[17-i] B.va=B.va-.001*level*(1+rnd()) end end, discard=function() bar,crystal=nil end, }--Flandre's wing back.fan={ init=function() fan=_G.title_fan t=rnd(2600) petal={} BG.resize() end, resize=function() CX,CY=SCR.w/2,SCR.h/2 W,H=SCR.w,SCR.h end, update=function() t=t+1 if t%10==0 then ins(petal,{ x=SCR.w*rnd(), y=0, vy=2+rnd()*2, vx=rnd()*2-.5, rx=4+rnd()*4, ry=4+rnd()*4, }) end for i=#petal,1,-1 do local P=petal[i] P.y=P.y+P.vy if P.y>H then rem(petal,i) else P.x=P.x+P.vx P.vx=P.vx+rnd()*.01 P.rx=max(min(P.rx+rnd()-.5,10),2) P.ry=max(min(P.ry+rnd()-.5,10),2) end end end, draw=function() gc.push("transform") gc.translate(CX,CY+20*sin(t*.02)) gc.scale(SCR.k) gc.clear(.1,.1,.1) gc.setLineWidth(320) gc.setColor(.3,.2,.3) gc.arc("line","open",0,420,500,-.8*3.1416,-.2*3.1416) gc.setLineWidth(4) gc.setColor(.7,.5,.65) gc.arc("line","open",0,420,660,-.799*3.1416,-.201*3.1416) gc.arc("line","open",0,420,340,-.808*3.1416,-.192*3.1416) gc.line(-281,224,-530,30.5) gc.line(281,224,530,30.5) gc.setLineWidth(6) gc.setColor(.55,.5,.6) local F=fan for i=1,8 do gc.polygon("line",F[i]) end gc.setLineWidth(2) gc.setColor(.6,.3,.5) gc.origin() for i=1,#petal do local P=petal[i] gc.ellipse("fill",P.x,P.y,P.rx,P.ry) end gc.pop() end, discard=function() petal=nil end, } back.welcome={ init=function() t=rnd()*2600 txt=gc.newText(_G.getFont(80),"Welcome To Techmino") end, resize=function() W,H=SCR.w,SCR.h end, update=function(dt) t=t+dt end, draw=function() if -t%13.55<.1 then gc.clear(.2+.1*sin(t),.2+.1*sin(1.26*t),.2+.1*sin(1.626*t)) else gc.clear(.1,.1,.1) end gc.push("transform") gc.replaceTransform(_G.xOy) gc.translate(640,360) if -t%18.26<1 then gc.scale(6.26) gc.translate(-t*400%800-400,0) else gc.scale(1.1626,1.26) end if -t%12.6<.1 then gc.translate(60*sin(t*.26),100*sin(t*.626)) end if -t%16.26<.1 then gc.rotate(t+5*sin(.26*t)+5*sin(.626*t)) end gc.setColor(.3,.6,.7) gc.draw(txt,-883*.5+4*sin(t*.7942),-110*.5+4*sin(t*.7355)) gc.setColor(.6,.8,1) gc.draw(txt,-883*.5+2*sin(t*.77023),-110*.5+2*sin(t*.7026)) gc.setColor(1,1,1) gc.draw(txt,-883*.5+3*sin(t*.7283),-110*.5+3*sin(t*.7626)) gc.pop() end, } back.aura={ init=function() t=rnd()*2600 BG.resize(SCR.w,SCR.h) end, resize=function(_,h) SHADER.aura:send("w",SCR.W) SHADER.aura:send("h",h*SCR.dpi) end, update=function(dt) t=t+dt end, draw=function() SHADER.aura:send("t",t) gc.setShader(SHADER.aura) gc.rectangle("fill",0,0,SCR.w,SCR.h) gc.setShader() end, }--Cool liquid background back.bg1={ init=function() t=rnd()*2600 BG.resize() end, resize=function() SHADER.gradient1:send("w",SCR.W) end, update=function(dt) t=t+dt end, draw=function() SHADER.gradient1:send("t",t) gc.setShader(SHADER.gradient1) gc.rectangle("fill",0,0,SCR.w,SCR.h) gc.setShader() end, }--Horizonal red-blue gradient back.bg2={ init=function() t=rnd()*2600 BG.resize(nil,SCR.h) end, resize=function(_,h) SHADER.gradient2:send("h",h*SCR.dpi) end, update=function(dt) t=t+dt end, draw=function() SHADER.gradient2:send("t",t) gc.setShader(SHADER.gradient2) gc.rectangle("fill",0,0,SCR.w,SCR.h) gc.setShader() end, }--Vertical red-green gradient back.rainbow={ init=function() t=rnd()*2600 BG.resize(SCR.w,SCR.h) end, resize=function(_,h) SHADER.rgb1:send("w",SCR.W) SHADER.rgb1:send("h",h*SCR.dpi) end, update=function(dt) t=t+dt end, draw=function() SHADER.rgb1:send("t",t) gc.setShader(SHADER.rgb1) gc.rectangle("fill",0,0,SCR.w,SCR.h) gc.setShader() end, }--Colorful RGB back.rainbow2={ init=function() t=rnd()*2600 BG.resize(SCR.w,SCR.h) end, resize=function(_,h) SHADER.rgb2:send("w",SCR.W) SHADER.rgb2:send("h",h*SCR.dpi) end, update=function(dt) t=t+dt end, draw=function() SHADER.rgb2:send("t",t) gc.setShader(SHADER.rgb2) gc.rectangle("fill",0,0,SCR.w,SCR.h) gc.setShader() end, }--Blue RGB back.lightning={ init=function() t=rnd()*2600 end, update=function(dt) t=t+dt end, draw=function() local t=2.5-t%20%6%2.5 if t<.3 then gc.clear(t,t,t) else gc.clear(0,0,0) end end, }--Lightning local blocks=require("parts/mino") local scs={.5,1.5,.5,1.5,.5,1.5,.5,1.5,.5,1.5,1,1,0,2} back.lightning2={ init=function() t=rnd()*2600 colorLib=_G.SKIN.libColor colorSet=_G.SETTING.skin blockImg=_G.TEXTURE.miniBlock end, update=function(dt) t=t+dt end, draw=function() local R=7-int(t*.5%7) local T=1.2-t%10%3%1.2 if T<.3 then gc.clear(T,T,T) else gc.clear(0,0,0) end local _=colorLib[colorSet[R]] gc.setColor(_[1],_[2],_[3],.12) gc.draw(blockImg[R],640,360,t%3.1416*6,400,400,scs[2*R],#blocks[R][0]-scs[2*R-1]) end, }--Fast lightning + spining tetromino local matrixT={}for i=1,50 do matrixT[i]={}for j=1,50 do matrixT[i][j]=love.math.noise(i,j)+2 end end back.matrix={ init=function() t=rnd()*2600 end, update=function(dt) t=t+dt end, draw=function() gc.clear(.15,.15,.15) gc.push("transform") local k=SCR.k gc.scale(k) local Y=ceil(SCR.h/80/k) for x=1,ceil(SCR.w/80/k)do for y=1,Y do gc.setColor(1,1,1,sin(x+matrixT[x][y]*t)*.1+.1) gc.rectangle("fill",80*x,80*y,-80,-80) end end gc.pop() end, } back.space={ init=function() stars={} W,H=SCR.w+20,SCR.h+20 BG.resize(SCR.w,SCR.h) end, resize=function() local S=stars for i=1,1260,5 do local s=rnd(26,40)*.1 S[i]=s*SCR.k --Size S[i+1]=rnd(W)-10 --X S[i+2]=rnd(H)-10 --Y S[i+3]=(rnd()-.5)*.01*s --Vx S[i+4]=(rnd()-.5)*.01*s --Vy end end, update=function() local S=stars --Star moving for i=1,1260,5 do S[i+1]=(S[i+1]+S[i+3])%W S[i+2]=(S[i+2]+S[i+4])%H end end, draw=function() gc.clear(.2,.2,.2) if not stars[1]then return end gc.translate(-10,-10) gc.setColor(.8,.8,.8) for i=1,1260,5 do local s=stars local x,y=s[i+1],s[i+2] s=s[i] gc.rectangle("fill",x,y,s,s) end gc.translate(10,10) end, discard=function() stars=nil end, } --Make BG vars invisible for _,bg in next,back do if bg.init then setfenv(bg.init ,BGvars)end if bg.resize then setfenv(bg.resize ,BGvars)end if bg.update then setfenv(bg.update ,BGvars)end if bg.draw then setfenv(bg.draw ,BGvars)end if bg.event then setfenv(bg.event ,BGvars)end if bg.discard then setfenv(bg.discard ,BGvars)end end BG={ cur="none", init=NULL, resize=NULL, update=NULL, draw=back.none.draw, event=NULL, discard=NULL, } function BG.send(data) if BG.event then BG.event(data) end end function BG.set(bg) if bg==BG.cur or not SETTING.bg then return end BG.discard() if not back[bg]then LOG.print("No BG called"..bg,"warn") return end BG.cur=bg bg=back[bg] BG.init=bg.init or NULL BG.resize=bg.resize or NULL BG.update=bg.update or NULL BG.draw=bg.draw or NULL BG.event=bg.event or NULL BG.discard=bg.discard or NULL BG.init() end return BG