0,]']>S}Wup8d%qy)6o;]AsVl3 = <;:9 8 76543 2 100 1_2!34:567O8:9w: ; <= >k߿|yvsq p ̀ ̀ ΀ππππππππππ{|y v s qppppp΀p΀p΀p΀pp I nbR|L<|yvsqpππππππππππ @  S  S  S  S  S  S"BAB BBAB ABRABBAA&t!Ff gFFI gbR Ha@AB&@"6HB@A&tA!)gb ObP 0@P`pp`" ! "!B!A"R ! "*@B'@!@AR"A$@I gI g#@I gI g&Q@``@ &R@`SS`@ &T@`" ! "!B "`@ "R bb ! "*@B'@!@AR bbP$p`P@0 q`@ &r@`ss`@ &u@`$ d@I g I g#@I gI gfppppp````PPPP@@@@0000       00@)@@@PPP```ppp@@@@@    ** E h*g** E c*gJ** E h*g** E c*JgcDcDc#FcMCHcMC#Id IK#MNKI#K@ Fppqq** E h*g* * E c *gJ** E h*g** E cJJg** E h*g* * E c *gJ** E h*g* * E c J Jgcccdc#FcHcIcHc#Fc IK#MNKI#HDlLlllllllllLFlL l@#Il ll@#Gl ll@#DlEl L@lLllllllllLlFlL l@#Il ll@#Gl ll@#Dl L l@llFl @#I @#G @#D l@llFl @#I @#G @#D l @** E h*g** E c*gJ** E h*g** E*** E h*g* * E c *gJ** E h*g* * E *Ff ig&#D&#D&#D&#D&Cd#$#$#$ppppn#```PP^$P@@@@>#000  .$ !""qpppp````PPPP@@@@0000    JF  &)&&B  00@@VAP``ppBBBAB ABR    6A000@@@@VBPPP````ppppBAA&t!@FIFFA!p`P@0 6+;A1( 44 {470, 0}, -- ? {470, 2}, -- @ } scrollTexts = { "" .."?With love from? " .." " .." 7 " .." 1 " .." 1207032037 7720070 " .." 11 1 11 11 111 1 " .." 11 1 16041 115036 " .." 11 9 11 1 11 11 " .." 99 99 504900490 " .." " .." " .." " , "" .." Greetings goto " .." -------------- " .." " .."Brainless Institute " .." Fisk Kompaniet " .." NewCore " .." NoCrew " .." ICE " .." " .." and XiA " .." --- " .." " } function isNaN(value) return value ~= value end function strict() local declared_globals = {} setmetatable(_G, { __newindex = function(_, name, value) if not declared_globals[name] then error("Attempt to create global variable '" .. name .. "'", 2) end rawset(_G, name, value) end, __index = function(_, name) if not declared_globals[name] then trace("Attempt to access undeclared global variable '" .. name .. "'", 2) end return nil end }) end -- Function to explicitly declare globals function declare_global(name, value) declared_globals[name] = true rawset(_G, name, value) end function btime(n) return n*60/bpm end function nrow(tm) return floor(4*bpm*tm/60) end function vec2(x,y) return {x,y} end function vec3(x,y,z) return {x,y,z} end vec3_0 = vec3(0,0,0) vec3_1 = vec3(1,1,1) vec3_127 = vec3(127,127,127) vec3_255 = vec3(255,255,255) sshapes = { { -- FlatFish r0 = 0.75, r1_0 = vec3(0.7 , 0.3 , 0.2), r1_1 = vec3(2 , 1 , 1 ), r2_0 = vec3(100 , 100 , 20 ), r2_1 = vec3(2 , 1 , 1 ), }, { -- Saucer r0 = 1.25, r1_0 = vec3(0.2, 1.7, 1.7), r1_1 = vec3(0.2, 1 , 1 ), r2_0 = vec3(0.5, 0.2, 0.2), r2_1 = vec3(1 , 1 , 1 ), }, { -- Rose r0 = 1, r1_0 = vec3(0.2, 1.7, 1.7), r1_1 = vec3(7 , 1 , 1 ), r2_0 = vec3(0.2, 1.7, 1.7), r2_1 = vec3(7 , 1 , 1 ), }, { -- Lantern r0 = 1.75, r1_0 = vec3(0.2 , 1.7 , 1.7), r1_1 = vec3(20 , 1 , 1 ), r2_0 = vec3(0.5 , 0.2 , 0.2), r2_1 = vec3(6 , 1 , 1 ), }, { -- HexBox r0 = 0.75, r1_0 = vec3(60 , 25 , 25 ), r1_1 = vec3(6 , 1 , 1 ), r2_0 = vec3(250, 100, 100), r2_1 = vec3(6 , 1 , 1 ), }, { -- Hedgehog r0 = 0.75, r1_0 = vec3(60 , 25 , 25 ), r1_1 = vec3(100, 1 , 1 ), r2_0 = vec3(250, 100, 100), r2_1 = vec3(40 , 1 , 1 ), }, } function round(a) return floor(a+0.5) end function fract(a) return a-floor(a) end function clamp(a,b,c) return min(max(a,b),c) end function step(a,b) if a < b then return 0 else return 1 end end function smoothstep(a,b,c) local t = clamp((c-a)/(b-a),0,1) return t*t*(3-2*t) end function hash(co) return fract(sin(co*12.9898) * 13758.5453) end function snare(tm) local ftm = 1.-fract(0.75+tm*bpm/60*0.5) ftm = ftm*ftm*ftm*ftm return ftm end function snare2(tm) local ftm = 1.-fract(0.5+tm*bpm/60*0.5) ftm = ftm*ftm*ftm*ftm return ftm end function mix(a,b,x) return a+(b-a)*x end function srnd() return -1+2*rnd() end function sign(a) if a < 0 then return -1 else return 1 end end function vec4(x,y,z,w) return {x,y,z,w} end function srnd2() return vec2(srnd(), srnd()) end function srnd3() return vec3(srnd(), srnd(), srnd()) end function vxyz(a) return vec3(a[1],a[2],a[3]) end function vyzx(a) return vec3(a[2],a[3],a[1]) end function vzxy(a) return vec3(a[3],a[1],a[2]) end function vbtime(a) local v = {} for i=1,#a do v[i] = btime(a[i]) end return v end function vdot(a,b) local sum = 0 for i=1,#a do sum = sum+a[i]*b[i] end return sum end function vcross3(a,b) return { a[2] * b[3] - a[3] * b[2], a[3] * b[1] - a[1] * b[3], a[1] * b[2] - a[2] * b[1], } end function vmul(a,b) local v = {} for i=1,#a do v[i] = a[i]*b[i] end return v end function vadd(a,b) local v = {} for i=1,#a do v[i] = a[i]+b[i] end return v end function vsub(a,b) local v = {} for i=1,#a do v[i] = a[i]-b[i] end return v end function vabs(a) local v = {} for i=1,#a do v[i] = abs(a[i]) end return v end function vsqrt(a) local v = {} for i=1,#a do v[i] = sqrt(a[i]) end return v end function vsign(a) local s local v = {} for i=1,#a do v[i] = sign(a[i]) end return v end function vlength(a) return sqrt(vdot(a,a)) end function vnormalize(a) local l,v l = vlength(a) v = {} for i=1,#a do v[i] = a[i]/l end return v end function vmix(a,b,x) local v = {} for i=1,#a do v[i] = mix(a[i],b[i],x) end return v end function vmax(a,b) local v = {} for i=1,#a do s = 1 v[i] = max(a[i],b[i]) end return v end function vmin(a,b) local v = {} for i=1,#a do s = 1 v[i] = min(a[i],b[i]) end return v end function vclamp(a,b,c) local v = {} for i=1,#a do v[i] = clamp(a[i],b[i],c[i]) end return v end function vround(a) local v = {} for i=1,#a do v[i] = round(a[i]) end return v end function palette(a) local r,g,b r = round(0.5*(sin(a)+1)) g = round(0.5*(sin(a+1)+1)) b = round(0.5*(sin(a+2)+1)) return vround(vmul((vec3(r,g,b)),vec3_255)) end function hsv2rgb_approx(h,s,v) local r,g,b,htau,ss,vv ss = clamp(s,0,1) vv = 0.5*v htau = h*tau r = vv*(cos(htau)*ss+2-ss) g = vv*(cos(htau+4)*ss+2-ss) b = vv*(cos(htau+2)*ss+2-ss) return vround( vmul(vclamp( vec3(r,g,b),vec3_0,vec3_1), vec3_255)) end function r(th, n, q) return pow(pow(abs(1/q[2]*cos(q[1]*th*0.25)), n[2]) + pow(abs(1/q[2]*sin(q[1]*th*0.25)), n[2]), -1/n[1]) end function supershape(p2, f, t, m) local p = vec2((p2[1]-0.5)*tau,(p2[2]-0.5)*pi) local r0 = mix(f.r0, t.r0, m) local r1_0 = vmix(f.r1_0 , t.r1_0, m) local r1_1 = vmix(f.r1_1 , t.r1_1, m) local r2_0 = vmix(f.r2_0 , t.r2_0, m) local r2_1 = vmix(f.r2_1 , t.r2_1, m) local r1 = r(p[1], r1_0, r1_1); local r2 = r(p[2], r2_0, r2_1); return vec3( r0*r1*cos(p[1])*r2*cos(p[2]) , r0*r1*sin(p[1])*r2*cos(p[2]) , r0*r2*sin(p[2]) ) end function sphere(p,r) return vlength(p)-r end function ssphere4(p,r) local p2 p2 = vmul(p,p) return pow(vdot(p2,p2),0.25)-r end function torus(p, t) local q,px,py,pz,tx,ty px = p[1] py = p[2] pz = p[3] tx = t[1] ty = t[2] q = vec2(vlength(vec2(px,pz))-tx,py) return vlength(q)-ty end function mirror(tm) local screen,from,to,ii screen = 0x0000 for i=0,25 do ii = i/25 local f = round((2-0.5*ii*ii)*i) from = 120*(110-f) from = round(from+5*sqrt(ii)*sin(3*ii+tm)) to = 120*(i+110) memcpy(0x0000+to,0x0000+from,120) end end function starScroller(tm,yoff) local mz,px,py,pc,layer,p if not(yoff) then yoff = 0 end -- Stars for i=#layers,1,-1 do mz = -2/(2+i)*tm*60 layer = layers[i] for j=1,#layer do p = layer[j] px = p[1] py = p[2] pc = p[3] px = round(px+mz)%240 pix(px,py+yoff,pc) end end end function snareEffect(s) local tmp,save tmp = round(16-4*s) if s > 0.25 then --[[ save = peek4(0x3FF0*2+12) poke4(0x3FF0*2+12,tmp) spr(344,25,12,5,3,0,0,8,4) poke4(0x3FF0*2+12,save) ]] print("Impulse!",0,44,tmp,0,5) end end function sky(fade) local ii,i,f,save for i=0,50 do ii = i/50 f = fract(10.*ii) lineCol4[i] = hsv2rgb_approx(-0.5+ii,0.5+sqrt(f),mix(1.5,0,f*f*fade)) lineCol12[i] = hsv2rgb_approx(0.58,0.2,mix(1.1,-0.2,ii+(i%2)*0.2)*fade) end lineCol4[51] = standardPalette[4] lineCol12[51] = standardPalette[12] for i=0,99 do ii = i/100 ii = smoothstep(0.5,1,ii) lineCol[i] = hsv2rgb_approx(0.68-0.3*ii,1.5-ii,(ii+0.15)*fade) end for i=100,136 do ii = (i-100)/50 lineCol[i] = hsv2rgb_approx(0.68-0.05*ii,0.9,ii*fade) end fade = sqrt(fade) lineCol[99] = vmul(vec3(fade,fade,fade),vec3_255) end function appearPos(tm) local a = tm return { sin(tm*0.707)*80+120, sin(tm)*52+52, } end function writer(tm,btm,sel) local flip = 32 btm = btm local stm = btm/flip local nstm = floor(stm) local cstm = stm-nstm local fos = 0.9 local fo = max(cstm-0.95, 0)*20 fo = fo*fo*2 local scrollText = scrollTexts[sel] local bix=448 if scrollText then local sl = string.len(scrollText) local atm= flip*nstm local tyani = round(fract(btm*0.5))+fo*138 local save = peek4(0x3FF0*2+12) for y=0,11 do for x=0,19 do local ix = (x+y*20)%sl+1 local ch = string.byte(scrollText,ix) local uch= ch & ~0x20 local six= nil local srot = 0 if ch == 45 then six = 464 elseif ch >= 48 and ch <= 64 then local sk = specialKeys[ch-47] six = sk[1] srot = sk[2] elseif uch >= 65 and 90 >= uch then six = 480 + uch-65 end local etm = atm+6 if btm > atm and six then if btm < (atm+0.1) then bix = 449 end local tx = x*9+30 local ty = y*9+4+tyani local lx = tx local ly = ty if btm= 30 then cls(12+r-30) end end function starScrollerScreen(n,r,s,tm,ltm) local sp,sx,sy,etm,i,j,spd,nor spd = vec2(-220,120) nor = vnormalize(spd) starScroller(tm) for j=0,3 do etm= max(tm-btime(9)-j*15/bpm,0) sp = 450+(4*etm)%2 sx = 244+spd[1]*etm sy = spd[2]*etm+40*j*nor[2] for i=0,3 do line( sx-25*nor[1]*i, sy-25*nor[2]*i, sx-25*nor[1]*(i+1), sy-25*nor[2]*(i+1), 4-i ) end spr(sp,sx-3,sy-3,5) end end function dolphinScreen(n,r,s,tm,ltm) starScroller(tm) local col,yoff,text,x,i,s2 col = 11 yoff = round(120-10*ltm) -- yoff = -20 spr(0,60,yoff,5,1,0,0,16,12) s2 = snare2(tm) if s2 > 0.75 then spr(round(451-clamp((s2-0.75)*4,0,1)),105,yoff+73,5) end yoff = yoff + 116 line (30,yoff-10,210,yoff-10,12) for i=1,#impulseTexts do text,x,col = table.unpack(impulseTexts[i]) -- print(text,x+1,yoff-7+i*8,8) print(text,x,yoff-8+i*8,col) end -- line (120,0,120,110,12) if r >= 158 then cls(12+r-158) end end function bobsScreen(n,r,s,tm,ltm,e) local a,c1,c2,s1,s2,z,yoff,points,zbuffer local i,px,py,pz,pc,tmp,zz,mz,izbuffer,sr local etm,si,p starScroller(tm) snareEffect(s) etm = btime(e) a = ltm c1 = cos(a) s1 = sin(a) c2 = cos(a*1.234) s2 = sin(a*1.234) a = ltm*bpm/60/8 si = floor(a) a = tau*a yoff = 130*smoothstep(0.5,1,cos(a)) points = shapes[si%#shapes+1] zbuffer = {} sr = (40+20*s) for i=1,#points do p = points[i] px = p[1] py = p[2] pz = p[3] pc = p[4] tmp= c1*px+s1*py py = -s1*px+c1*py px = tmp tmp= c2*py+s2*pz pz = -s2*py+c2*pz py = tmp table.insert(zbuffer, {px,py,pz,pc}) end table.sort( zbuffer, function(a,b) return a[3] > b[3] end) for i,p in ipairs(zbuffer) do px,py,pz,pc = table.unpack(p) mz = 4/(4+pz) px = px*mz py = py*mz px = 120-4+px*sr py = 68-4+py*sr+yoff spr(pc,px,py,5) end end mountainLayers = { {50,16,8*15,0}, {40,9 ,3 ,1}, {30,8 ,8*15,0}, {20,10,2 ,1}, {10,0 ,8*15,0}, {5 ,12,1 ,1}, } function smokestack(tm,x,y) local i,dt,dx,dy,et,h0,h1 local dtm,ftm,c,h,r,col,ntm et = 20 dt = bpm/60/4 dtm= tm/dt ntm= floor(dtm) ftm= dtm-ntm dx = -10 dy = -2 for i=et,0,-1 do c = i-ntm h0=hash(c+456) h1=hash(c+123) r = round(0.125*i+mix(1,3,h0)) col = max(12,round( -0.125*i +mix(15,13,h1) )) circ( round(x+i*dt*dx), round(y+(ftm+i)*dt*dy), r, col ) end end function parallaxScreen(n,r,s,tm,ltm,e,args) local i,msz,x,y,yoff,bx,by,mlayer,spd,dist,tz,zs,bsz,myoff,bt local cx,ch0,ch1,ch2,fi,fo,etm,bt1,bt2,bt3 bt1= btime(1) bt2= btime(2) bt3= btime(3) etm= btime(e) fi = smoothstep(bt1,0,ltm) fo = smoothstep(etm-bt2,etm,tm) zs = 30 myoff = 50-100*(fi+fo) starScroller(tm,-112*fo) circ(200,myoff,30,12) circ(200-4,myoff+4,30,0) spr(256,20+ltm*5,myoff-50,5,1,0,0,10,5) for i=1,#mountainLayers do mlayer = mountainLayers[i] dist = mlayer[1] bx = mlayer[2] by = mlayer[3] bt = mlayer[4] tz = zs/(zs+dist) msz = round(100*tz) bsz = 2*msz-10 yoff = round(96+18*tz)-dist*tz+100*(fo+smoothstep(bt3,bt1,ltm-dist*0.02)) spd = tz if bt == 0 then x = -bsz*fract(0.5*tm*spd) y = 0 while (x < 240) do ttri( x,yoff+y, x+msz,yoff-msz, x+msz*2,yoff+y, bx,by, bx,by+8, bx+8,by+8, 0 ) x = x + bsz end else x = -bsz*(0.5*ltm*spd) for i=0,13 do cx = floor((-x+20*i)/20)*20 ch0 = hash(cx+by) ch1 = fract(8667*ch0) cx = cx+ x circ(cx,yoff,tz*mix(15,30, ch0),bx) end end end x = floor(ltm*12-100) y = 102+30*(fi+fo) smokestack(ltm,x+140,y-2) line(0,y+8,240,y+8,14) spr(232,x+120,y,5,1,0,0,3,1) spr(229,x+96,y,5,1,0,0,3,1) spr(229,x+72,y,5,1,0,0,3,1) spr(229,x+48,y,5,1,0,0,3,1) writer(tm,ltm*2*bpm/60,1) end function triArea(px0, py0, px1, py1, px2, py2) local area = ( (px0 * (py1 - py2) + px1 * (py2 - py0) + px2 * (py0 - py1)) / 2 ) return area end glenzShapes = {} glenzLightDir = vnormalize(vec3(-1,1,2)) function glenzScreen(n,r,s,tm,ltm,e,args) local a,c1,s1,c2,s2,c3,s3,i,tmp,tz,col,ta local p0,px0,py0,pz0 local p1,px1,py1,pz1 local p2,px2,py2,pz2 local n0,nx0,ny0,nz0 local l0,lx0,ly0,l,lx,ly,lz local dif,sz,f,etm,si,yoff local faces,face,sr,zbuffer,_ starScroller(tm) snareEffect(s) sr = 60+20*s zbuffer = {} l = glenzLightDir lx = l[1] ly = l[2] lz = l[3] etm = btime(e) a = ltm c1 = cos(a) s1 = sin(a) c2 = cos(a*1.234) s2 = sin(a*1.234) a = ltm*bpm/60/8 si = floor(a) a = tau*a yoff = 150*smoothstep(0.5,1,cos(a)) faces = glenzShapes[si%#shapes+1] for i=1,#faces do face= faces[i] col = face[5] p0 = face[1] px0 = p0[1] py0 = p0[2] pz0 = p0[3] tmp = c1*px0+s1*py0 py0 =-s1*px0+c1*py0 px0 = tmp tmp = c2*py0+s2*pz0 pz0 =-s2*py0+c2*pz0 py0 = tmp tz = 4/(pz0+4) px0 = px0*sr*tz+120 py0 = py0*sr*tz+50 p1 = face[2] px1 = p1[1] py1 = p1[2] pz1 = p1[3] tmp = c1*px1+s1*py1 py1 =-s1*px1+c1*py1 px1 = tmp tmp = c2*py1+s2*pz1 pz1 =-s2*py1+c2*pz1 py1 = tmp tz = 4/(pz1+4) px1 = px1*sr*tz+120 py1 = py1*sr*tz+50 p2 = face[3] px2 = p2[1] py2 = p2[2] pz2 = p2[3] tmp = c1*px2+s1*py2 py2 =-s1*px2+c1*py2 px2 = tmp tmp = c2*py2+s2*pz2 pz2 =-s2*py2+c2*pz2 py2 = tmp tz = 4/(pz2+4) px2 = px2*sr*tz+120 py2 = py2*sr*tz+50 ta = triArea(px0,py0,px1,py1,px2,py2) if ta > 0 then n0 = face[4] nx0 = n0[1] ny0 = n0[2] nz0 = n0[3] tmp = c1*nx0+s1*ny0 ny0 =-s1*nx0+c1*ny0 nx0 = tmp tmp = c2*ny0+s2*nz0 nz0 =-s2*ny0+c2*nz0 ny0 = tmp dif = max(nx0*lx+ny0*ly+nz0*lz,0) sz = min(min(pz0,pz1),pz2) table.insert(zbuffer,{ sz, px0,py0,px1,py1,px2,py2, col+min(3,round(4*(dif))) }) end end table.sort( zbuffer, function(a,b) return a[1] > b[1] end) for i,f in ipairs(zbuffer) do _,px0,py0,px1,py1,px2,py2,col=table.unpack(f) tri(px0,py0+yoff,px1,py1+yoff,px2,py2+yoff,col) line(px0,py0+yoff,px1,py1+yoff,1) -- line(px1,py1,px2,py2,1) -- line(px0,py0,px2,py2,1) end end function twistScreen(n,r,s,tm,ltm,e,args) starScroller(tm) local r,off,x,y,z,col,colmap local scra,spra,distr,distx,a,w local xx,fi,fo,bt4,etm etm = btime(e) bt4 = btime(4) fi = smoothstep(bt4,0,ltm) fo = smoothstep(etm-bt4,etm,tm) for w=1,3 do colmap = twistColmap[w] for z=0,110 do a = ltm+z/120+w distx = round(48*cos(a)+80)-200*(fi+fo) distr = 36+round(20*sin(a)-48*smoothstep(-0.5,0.5,sin(ltm))) r = round(distr)%48 off = 64*(336 + (r//8)*16)+(r%8)*8 scra = 0x0000+240*z spra = 0x4000*2+off for y=0,7 do for x=0,7 do xx = distx+x+8*y col = peek4(spra+x+64*y) if xx >= 0 and not (col == 5) then poke4(scra+xx,colmap[col]) end end end end end writer(tm,ltm*2*bpm/60,2) end function tanh_approx(x) local x2 = x*x return clamp(x*(27 + x2)/(27+9*x2), -1, 1) end function apollianScreen(n,r,s,tm,ltm,e,args) starScroller(tm) -- snareEffect(s) local scale,i,px,py,pz,r2,s,d local a,c1,s1,c2,s2,dlimit,bt2,fi,fo,etm,f local tmp,k,spx etm = btime(e) bt2 = btime(2) fi = smoothstep(0,bt2,ltm) fo = smoothstep(etm,etm-bt2,tm) lineOff = round(mix(-50,30, fi*fo)) bt2 = btime(4) fi = smoothstep(0,bt2,ltm) fo = smoothstep(etm,etm-bt2,tm) s = 1.5 a = ltm*0.25 c1 = cos(a) s1 = sin(a) c2 = cos(a*1.234) s2 = sin(a*1.234) f = fi*fo dlimit = 0.005*f for x=0,99 do spx = -1+x*0.02 spx = tanh_approx(spx) for y=0,110 do px = spx py = -1+y*0.02 px = px*0.5 py = py*0.5 pz = 0.3*(c1+s2) tmp= c1*px+s1*pz pz = -s1*px+c1*pz px = tmp tmp= c2*py+s2*pz pz = -s2*py+c2*pz py = tmp scale = 1 for i=0,2 do px = -1+2*fract(0.5*px+0.5) py = -1+2*fract(0.5*py+0.5) pz = -1+2*fract(0.5*pz+0.5) r2 = px*px+py*py+pz*pz k = s/r2 px = k*px py = k*py pz = k*pz scale = scale*k end scale = 1/scale if abs(pz)*scale < dlimit then pix(x+70,y,11) pix(68-x,y,3) pix(270-x,y,5) end if abs(py)*scale < dlimit then pix(x+70,y,10) pix(68-x,y,2) pix(270-x,y,6) end if abs(px)*scale < dlimit then pix(x+70,y,9) pix(68-x,y,1) pix(270-x,y,7) end end end if f > 0.33 then line(69,0,69,110,2) line(170,0,170,110,6) end spr(344,55,-16+lineOff,5,2,0,0,8,3) end function fadeOutScreen(n,r,s,tm,ltm,e,args) local etm,fade,yoff etm = 60/bpm*6 sky(smoothstep(etm,btime(2),ltm)) yoff = 39+25*smoothstep(btime(2),0,ltm) print("Code" ,0,50+yoff,3) print("Lance" ,0,58+yoff,4) print("Pixels" ,100,50+yoff,6) print("GlimGlam",100,58+yoff,5) print("Music" ,206,50+yoff,10) print("Virgill ",206,58+yoff,11) end function exitScreen(n,r,s,tm,ltm,e,args) exit() end script = { {0 , fadeInScreen , nil , "fadeInScreen" }, {8 , starScrollerScreen, nil , "starScrollerScreen"}, {12 , dolphinScreen , nil , "dolphinScreen" }, {40 , glenzScreen , nil , "glenzScreen" , {"'Glenz' Vector" , "Pretend it's a torus" }}, {56 , bobsScreen , nil , "bobsScreen" , {"Rotating 3D BOBs", "Every demo needs some" }}, {72 , apollianScreen , nil , "apollianScreen" , {"Uhm,math I guess", "We think it's fractal" }}, {88 , twistScreen , nil , "twistScreen" , {"Our Greetings" , "This demo is canonical" }}, {104, parallaxScreen , nil , "parallaxScreen" , {"Parallax scroll" , "So many parallax layers" }}, {120, fadeOutScreen , nil , "fadeOutScreen" }, {128, exitScreen , nil , "exitScreen" }, {129, exitScreen , nil , "exitScreen" }, } effectiveScript = { } function intro(tm) local w,t,s,e e = 16 if (tm > e+6) then cls(0) return elseif (tm > e+3) then cls(0) if (floor(2*tm)%2) == 0 then rectb(2,2,238,36,2) end print("Software Failure. Press left mouse button to continue.",12,8,2,0,1,1) print("Dude Zoning Out #0BADBEEF.#FACEB00B",12,24,2) return end tm = min(tm,e) cls(8) print("Impulse welcomes you to a",75,23,0,0,1,1) print("Impulse welcomes you to a",74,22,13,0,1,1) print("Blunderous Bit-Blasting Bonanza",37,31,0) print("Blunderous Bit-Blasting Bonanza",36,30,12) print("Music 'ripped' from Timeline 2 and created by amazing",15,59,0,0,1,1) print("Music 'ripped' from Timeline 2 and created by amazing",14,58,13,0,1,1) print("Virgill",104,67,0) print("Virgill",103,66,tm*8+12) print("Precalculating...",91,101,0,0,1,1) print("Precalculating...",90,100,13,0,1,1) s = (floor(math.exp(0.25*tm)-1)%#introTexts)+1 t = introTexts[s] w = print(t,0,-8,13) print(t,(241-w)/2,109,0) print(t,(240-w)/2,108,12) if tm >= e then for i=0,2 do spr(436,i*16,68-8,5,1,0,0,2,2) end end end function TIC() local b,s,r,n,tm,ltm,tmp,current,args,e local i,w,glenzInfo,fi,fo,bt1,etm,itm itm = 24 vbank(0) bt1 = btime(1) tm= time()/1000 -- tm=tm+24 if tm < itm then poke(0x3FFB,11) intro(tm) return end poke(0x3FFB,0) if not musicStarted then musicStarted = true music(0) end cls(0) tm= tm-itm r = nrow(tm) n = r//4 current = effectiveScript[n] args = current[3] e = current[0] ltm = tm-current[1]*60/bpm s = snare(tm) etm = btime(e) fi = smoothstep(bt1,0,ltm) fo = smoothstep(etm-bt1,etm,tm) if false then print(string.format("%s", current[4]),0,0) print(string.format("Beat %d", n),0,6) print(string.format("EBeat %d", e),0,12) print(string.format("Row %d", r),0,18) print(string.format("Time %0.2f", tm),0,24) print(string.format("LTime %0.2f", ltm),0,30) print(string.format("Fade %0.2f,%0.2f", fi,fo),0,36) end lineOff = NaN current[2](n,r,s,tm,ltm,e,args) glenzInfo = current[5] if glenzInfo then tmp = btime(1) for i=1,#glenzInfo do tmp = nil if i > 1 then tmp = 1 end w = print(glenzInfo[i],0,-8,12,0,1,tmp) print(glenzInfo[i],221-w,20*(fi+fo)+110-6*(#glenzInfo-i+1),15,0,1,tmp) print(glenzInfo[i],220-w,20*(fi+fo)+109-6*(#glenzInfo-i+1),11+i,0,1,tmp) end end mirror(tm) end function BDR(l) if not musicStarted then return end local col,v if l == 0 then for i=0,15 do col = standardPalette[i] poke(0x3FC0+i*3,col[1]) poke(0x3FC1+i*3,col[2]) poke(0x3FC2+i*3,col[3]) end end if l == 115 then for i=0,15 do col = reflectionPalette[i] poke(0x3FC0+i*3,col[1]) poke(0x3FC1+i*3,col[2]) poke(0x3FC2+i*3,col[3]) end end col = lineCol[l] if col then poke(0x3FC0, col[1]) poke(0x3FC1, col[2]) poke(0x3FC2, col[3]) end if not (isNaN(lineOff)) then col = lineCol4[l-lineOff] if col then poke(0x3FC0+4*3, col[1]) poke(0x3FC1+4*3, col[2]) poke(0x3FC2+4*3, col[3]) end col = lineCol12[l-lineOff] if col then poke(0x3FC0+12*3, col[1]) poke(0x3FC1+12*3, col[2]) poke(0x3FC2+12*3, col[3]) end end end function setupScript() local current,idx,beat,next current = script[1] next = script[2] idx = 3 beat = 0 while current and next do current[0] = next[1] while beat < next[1] do effectiveScript[beat] = current beat = beat + 1 end current = next next = script[idx] idx = idx+1 end end function setupShapes() local function df0(p) local d,d0,d1,t t = vec2(0.9,0.1) d0 = abs(sphere(p, 0.4))-0.1 d1 = torus(p,t) d = min(d0,d1) return vec2(d,d0-0.01) end local function df1(p) local d,d0,d1 d0 = ssphere4(p,0.8) d1 = sphere(p,0.9) d = max(d0,-d1) return vec2(d,d1-0.05) end local function df2(p) local d0,p0,s0 p0 = p s0 = vsign(p0) p0 = vabs(p0) p0 = vsub(p0,vec3(0.5,0.5,0.5)) d0 = abs(ssphere4(p0,0.2))-0.1 return vec2(d0,s0[1]*s0[2]*s0[3]) end local function df3(p) local d0,d1,d2,d d0 = vlength(vec2(p[1],p[2])) d1 = vlength(vec2(p[1],p[3])) d2 = vlength(vec2(p[2],p[3])) d = min(d0,d1) d = min(d, d2) d = d - 0.2 return vec2(d,d+0.01) end local dfs = {df0,df1,df2,df3} local x,y,i, sshape,points,dim,iter local p,d,df,etm etm = time()+1000 for i=1,#dfs do iter = 0 df = dfs[i] points = {} while #points < 900 do iter = iter + 1 if time() > etm then error("Generating points are too slow") end p = srnd3() d = df(p) if d[1] < 0 then p[4] = balli if (d[2] < 0) then p[4] = balli+1 end table.insert(points, p) end end table.insert(shapes, points) end end function setupStarLayers() local i,j,layer,px,py,pc,tmp for i=1,3 do layer = {} for j=1,100 do px = round(240*rnd()) py = round((100-10*i)*rnd()) tmp= rnd() if tmp > 0.2 then pc = 12+i elseif tmp > 0.05 then pc = 12-i else pc = 4-i end layer[j]=vec3(px,py,pc) end layers[i]=layer end end function setupPalettes() local i,col for i=0,15 do col = vec3( peek(0x3FC0+3*i) ,peek(0x3FC1+3*i) ,peek(0x3FC2+3*i) ) standardPalette[i] = col reflectionPalette[i] = vec3( round(col[1]*0.7) ,round(col[2]*0.6) ,round(col[3]*0.9) ) end end function setupTwist() local colmap colmap = {} colmap[8]=7 colmap[13]=5 colmap[14]=6 colmap[15]=7 table.insert(twistColmap,colmap) colmap = {} colmap[8]=8 colmap[13]=10 colmap[14]=9 colmap[15]=8 table.insert(twistColmap,colmap) colmap = {} colmap[8]=1 colmap[13]=3 colmap[14]=2 colmap[15]=1 table.insert(twistColmap,colmap) end function setupGlenzShapes() local x,y,xx,yy,i,j,k, sshape,points,dim,iter local p,d,df,v0,v1,faces local faceDefs,faceDef,face,c faceDefs = { {{0,0},{0,1},{1,1}}, {{1,0},{0,0},{1,1}}, } local function flatFace1(s,m,c) local sgn, amp sgn = sign(s) amp = abs(s) return { m(vec3( amp, amp, s)), m(vec3( sgn*amp,-sgn*amp, s)), m(vec3(-sgn*amp, sgn*amp, s)), m(vec3( 0, 0,-sgn)), c } end local function flatFace2(s,m,c) local sgn, amp sgn = sign(s) amp = abs(s) return { m(vec3( -amp, -amp, s)), m(vec3(-sgn*amp, sgn*amp, s)), m(vec3( sgn*amp,-sgn*amp, s)), m(vec3( 0, 0,-sgn)), c } end faces = { flatFace1( 0.6,vxyz,1), flatFace2( 0.6,vxyz,1), flatFace1(-0.6,vxyz,1), flatFace2(-0.6,vxyz,1), flatFace1( 0.6,vyzx,1), flatFace2( 0.6,vyzx,1), flatFace1(-0.6,vyzx,1), flatFace2(-0.6,vyzx,1), flatFace1( 0.6,vzxy,1), flatFace2( 0.6,vzxy,1), flatFace1(-0.6,vzxy,1), flatFace2(-0.6,vzxy,1), } table.insert(glenzShapes, faces) for i=1,#sshapes do sshape = sshapes[i] faces = {} dim = 16 for x=0,(dim-1) do for y=0,(dim-1) do for j=1,#faceDefs do faceDef = faceDefs[j] face = {} for j=1,#faceDef do c = faceDef[j] xx = (x+c[1])/dim yy = (y+c[2])/dim p = supershape(vec2(xx,yy),sshape, sshape, 0) -- p = vec3(p[3],p[1],p[2]) face[j] = p end v0 = vnormalize(vsub(face[2],face[1])) v1 = vnormalize(vsub(face[3],face[1])) face[4] = vcross3(v0,v1) face[5] = 1+8*((x+y)%2) table.insert(faces,face) end end end table.insert(glenzShapes, faces) end end function init() -- Enable strict mode -- strict() local col,df,points,d,p,iter,layer,px,py,pc,ii local xx,yy,ssharp,dim,tmp setupScript() setupPalettes() setupGlenzShapes() setupTwist() setupShapes() setupStarLayers() sky(1) cls(0) end init()