0U_U//U_ 02TvͫgE#2Tv2Tv 1"13""33""33""33""33""33""33""33""33""33""33""33@AAAA1RBac""33RRcc""33RRcc""33RRcc""33RRcc""33RRcc""33@AAAA4RBac%%66RRcc%%66RRcc%%66RRcc%%66RRcc%%66RRcc%%66@DDDD4UEdf%%66UUff%%66UUff%%66UUff%%66UUff%%66UUff%%66@@DDDDDDEDDdUEdfUUffUUffUUffUUffUUffUUffUUffUUffUUffUUffUUffp@DDttttEDDduUUffUUffUUffUUffUUffUUffp@GGttttHGGguXXiiXXiiXXiiXXiiXXiiXXiip@GGwwwwHGGgxXXiiXXiiXXiiXXiiXXiiXXiippwwwwwwxwwx!"13##""33##""33##""33##""33##""33##!!12##!!22##!!22##!!22##!!22##!!22##!!12""!!22""!!22""!!22""!!22""!!22""!!"""""""""""""""""""""""!"""""""""""!!!!!!!!!!!!!!!!!!!!!!!!~w~wwwww~ww~wwwwwwwwwwwwwwwwwwhwwwwipwpwwwwwpwwpwwwwwwwwwwwwwwwhwwwwxwxwwwwwxwwxwwwwwwwww www ~w~wwwww~ww~wwwwwwwwwwwwwwwwwwhwwwwxwwwxwnf.ff."i∘6i&ff##xwwwxw`fPffP%i9&if#Sxwnnffn6 㘙0&`"f#S#"xwwwxwnf^ff^%i∘9ሙ&if#S&! ""  """  /Oo pP0?_ `@ ?_ pP0 >?!##""3!"!!3!"33##!33##22!!12!!22""!!33!!2233!!22!"#""!!"""#!"!!3##!33##"""!!2!!!!!12!12!!22!"3!!22""!!""!12####!12#""##!!""!!22!!22""!""22!!!1!"!!2####!!22!"""#1!!""!2!!22""""""!!!!13!!!#!!22""!!"1#!!!""""!!!!!131!12!!"2""!!!33"1311##!!!!!"""13!"33"13!2!12!!""!!"!!1"131!33""3312""!!"""1!"3!133!"33!#2!"!!!!!!!!!!!!"!!31!33!12!!1333##!""!!!!!!!!!!!"1133!33!!22!"!13"1313!123##!"!"!3!"33"13##!22""!!33""3322##"""!!1133""33!##!22""!!!!!!!qqq!1!13!3!"33!122!"#""!qqwwwwwwwwwq!!3!13!33##""""!!!!!!qwwwwwwwwwwwwwtwww!##33!!22""""!!qqwwwwwwwwwwwwwwwwwwDt!33!33##"""!!qwwwwwwwwwwwwwwwwwwwwDGGA13!#!123!!22!""!!!!qqwwwwwwxwwwwwwwwwwwwtttt##"13""##!!AGwwwwxwwwxxwwwwwwwyDGGgDAA!3##2222""!!qqwwwwwwxwwwyxxwwyGGGwDD111!33!""##qGGwwwwwwwwwwwwwywwxywwwttiid13##!122!!22!!ADGGwwwwwwwwwwwxwwwwwwywwwwGgDDDD1!33""#qqqqAqDDwwwwwwwwwwxwwxxwwywwxwwvdi4!12#!!22!!!!GGwGDDADDDqADDDDGGwGGwwwwxwwxxwwwwxIDDDTEdf113"""wDGGwttttttDDDttttttDGGwxwwxyyxwwytttt$6613!#22!!!!!!wwwwwDGGGDtttttDDDGGGwwwwxyywwywwyxIGGEDDdDDff11""GGGGgttttDGGGDGGwttttHGGgyywwwwwwwwwwIGGttttu466!!"22!!!wwwyDGGgttttttttHGGgxyIGGwwwwxwwxwwwwwwHGGgUUffdFaf1!!""GGgIGGwvDGGgHGGguvTXIGGwwwwxwwxxHGGgyuI!1313"""!!xttttIDDtvuvTXIDDttttHGGgxxIGGWiiTffAAAA!33##""XiiHGGgttttIDDTIDDttttHGGgxXXiittttDDDD43313!"!!uEDDdttttttttEDDduXXiyyyHGGgiI4ffRBac133!!TiiXXiiuEDDdEDDduXXiyIDDIGGIDDXXiiuDdf%%66113!!q'qqqtIUUffuuUUfFFDDTttttttttttttIXXiiDDDD66fQRcc1!qqwwwwwwwwwwqdIDDTiiUUffUUffFDDTttttEDDdHGGgEDDdIDDTii4ff!66!13!rwwwwwwwwwwwwwwwwwwwDDDDFTUfFFFTUDDDDEDDduuuDDDDITXiiUEdf6Fcc1#srwwwwwwwwwwwwwwwwwwwwqfEDDdTTEDDduUUffXXiiUUffEDDd%%66166"13swwwwwwwxwwwwwwxwwwwwwwwwwqqAAAAUEdfDDDDDDDDDDDDDDDDUEdfUUffUEdfDDDDiiUUffAAAA13cc""3s!wwwwwwwwxwwwwxwwwwwwwwwwwGGwGtDDDDAfUUff4444UUffUUfFTXiITUfFTUff4%%661336!"swwxwwwwwwwwywwwywwwwwwwwwwwtwwGDDDDAFQUffUEdfUEdfUEdfUEdfUUffUUfFTffUEdfiQUffRBac33!wwwwxwwwwwwwwywwwywwxwwwwwwwwwwwttDDDDDDAATff%%66%%66%%66%%66UUfFTDDDDDDDDDDDDfF!%66!66""333xwwwwxwwxwwwwwwwwwwxyywwwwwwDGGGD4DAAAAfFQUffUUffUUffUUffUUQAAAA444QffffRRccqqxwwwwxxxwwywwwywwwwwwwttttDDdFDAAA4!6!%66%%66%%6QUAAAA4UEdfUEdfUEdfAAAA616!"33qwwwwxwwxywwwywwwwwwwwwwDGGgDD4ABacAAAAQfQUfQUQ1RBac%%66%%66%%66113QccwwwwwwxywwwwywwxwwwwwwwGwDDDDDDaC%661!!RBac%%6FQUfFQUffUUffRBac333s'rwwxwwwwywwyxwwwwwwxxwwttiiDDDDDRccRBac11""3QR!!6!%66""33131swwwwwxwwwwwwwwywwxywwwyyxGwFDDDdDA%66""33"1311"13RR!AAAAAAAAQfQRcc"1313wwwwwwwxwwxwwwwwwywwwywwwwDGGGDDdfDDDDRccRRcc""33"13"13""3!"11!33""33q7swwwwwwwwxxxwwywwwwywwwwwwttttDDff4a!66""33""33""33""3!"Q1RBacRBac1c!"33qwwwwwwwxwwxywwxwwywwxwwwHGGgDdfFQEdfcQRcc""33""33""!"13""3!"3!131!3s'wwwwwwwwxwwwwxwwwwxyudF$66A1!3!"3!"3!"1""3QRQ!3!13swwwwwwwxwwxwwywwwyGDDTiiFDDDAAfF3!!!1"13""!!3q1wwwwwwwwxyxyywwwIGGwttDDDD431"13""3!"1qqwwwwwwwwwwwyywwyywwwwwwywwwwDdiiEDDdaCAAA3"13111""33""!!1sqDGGwwwwwwwwwxwwyywwwwwwywwwwwwxwwIGGHGGgFTEdf3""33"13"13"13""3!"!qADGGwwwwwwwwwwwwwxywwwwwwxwwwwwwxwwxwwwwxffTffAAAAa!"33""33""33""33""!!qADGGwwwwwwGwwwwwwxwwywwwwxwwxxwwyxHGGgXXiiFDDDDff13!33""33""33""3!"!AADDDtwtDGGGwwwwwwwwwwxywwxwwxxywwyyx4ffRBac3!"3!"3!"!!AttDGGGwwwwxwwwwwwwwwwwwwxwwwwywwIGGWiiXXiiDDDDdff!"33!!!!!ADDtDDwwwwHGGwxwwwwxwwyxwwxwwywwwwwwwwI466Qcc12AADDDGGwHGGwxwwwxwwxywwxxywwxwwHGGgiiIDDTiiUEdffF3!##!!!DDDttttxGGGWwwwwxywwwwwwwwxxDDDD%%661!22!12!12!DDDDDtDGGGGWwwwwxwwyywwxwwyxwwXXiiiiEDDdiiUUffAAAA13##"""ADDDGGwttttHGGgxIGGwwwwxyywwyxiyITEdf%%66133!2!!2!!!AQEDDttttHGGgxywwwwxwwyywwwwwwywwyIDDXXiiTffiQUffRBac3!1!AADDDDHGGguXXiyIGGHGGgxywwwwwwxwwwwwwyIGGttttDDDDff!66""33!3!!ADADDDDuXXiyIGGttttxywwwwxwwxxwwIGGttttEDDdXXii4ffffRRcc3"!EDDdXXiIFDDTttttHGGgXXiiIGGxwwxxwwwwHGGguUEdfff166""331"!"!"DDDDUEdFFDDTttttHGGguywwwwxHGGguUUffiiXXii%%66ff"13fQRcc"13"4UUTDDDDEDDduXXiiXXIDDHGGgxyXXiiIUUfff!"33!33""33"UEdFQUDDDDEDDduXXiiFttttxXXiiIDDIQUffQii%%66!33cc""33"%%T4UEdfUUffFTXIDDTEDDdXXiittttXXiiAAAAUUff3313!"33"UUAAAAUEdfUUfFFTXIDDDDDDuXXiiEDDdAAAAff1ii%%66133"13!33"1%%4%%6FQUTDDDDEDDdUUffXXiiuiIXXii4RBacUUff"133!"333!!"1QURBaCQUTDDDDDDDDEDDdUEdfIIIXXiiUUffRBacff""33ii%%66""33!33!!""!%%!AAAA44UEdfUUffUUffXXiIIDDIDDAAAAXXii%%66RRccQUff""3333"13""QRAAAA4UEdfUEdfUUffUUffDDDDDDDDDDDDIQXiiUUff4iiRRccff""33!66""33!33##""!1RBac%%66%%66UUffUUffUUfFQXDDDD4EDDdEDDdRBacXXii%%66QRccff""33"133!"33!1!!RBac%%66UUffUUffUUffUUfF4UEdfUEdfUEdfAAAAiiUUff%%66iiRRcc!33166""33####""!1""33RRcc%%66%%66UUfQUQAAAAUEdf%%66UUffUUff4RRccQXii%%66cc"13cc""33""333!!2"""13RRcc%%66UUfQUfQUQAAAA4%%66UUffUUffUUffRBacQff%%66RRcc133""336!"33##!"""1""33""3QRc!%!Q1RBacUUff%%66UUffUUff%%66RRccff%%66"13cc""33!33""33!122"!"13""3QR!Q1RBac%%66%%66UUffUUffUUffRRcc1ff%%661RRcc""3333""3333##""!""33""!11"13""33RRccUUff%%66UUffUUff%%66"13QRcc"13ff%%66""33c!"33!33""33!!22!"!""3!"11"13"13""33RRcc%%66%%66UUffUUffUUffRRcc""33!66""33RRcc""33!33!"33##""!""!1"13"13""33""33""33""33RRcQUf!%6QUffUUff%%66""33cc""33ff%%66""3333""3!"33!!22""!!"13"""13""33""33""33""33""33RRc!%!QQfQUffRRcc""33166""33QRcc""33!33""##""!#!"1""33""33""33""33""33""3!"QQff%%66""33"13cc""33!33""33!"33""3!!22!!""!"13""33""33""33""33""3!"Q111ffRRcc""33""3366""33cc""33""33""""""3!"3!"3!"3!"3!"!1"13"13"131f!%66""33""33c!"33!33""33""3""!!2!!!""!"!!!!!1"13""33""33""33"13Qcc""33""33!33!12cc""33""""!!!!"13""33""33""33""33""3366""33""3333""33""33""""!!!!!!!"13""33""33""33""33""33""33!cc""33""33!33!!22c!"33""""!!!12"13"13!12"13##""33""33""33""33""33""33"133!"33""33!1233""!33""!!"!12##########""33""33""33""33""33""33""33##!33""33""33!!2233""!##!!22""33""33!!22""33##""33""33""3!"3!"33""33""3333""33!!223""33""!!!"!!2#########""33""3!"3!"!!3!"33##!33""33""!22!!33"""!!3!"3!!22""33#!"!!!33""33!"33""33!!22""33""!##!"!!!3##""3!"33""22!!3""!!!!!!!"!12!!33""!33!!22!!""!!!"!"!"!"""""!"##""##""22!"""""!"!"!"""""""!!22""3""33!!22!!"!!""""!"!"""""""""""!"""!!##"""""""""""""""""!!22""""33!!22!!""""""""""""""""!!#""!!!!22""""""!!!!!!"""!!"""!!qq""""q'!qwwwwwwwq!!"!!""!qwwwwwwwwwwwwwwwq""!!!wwwwwwwwwwwwwwwwwwwwq!!!!""qqwwwwwwwwwwywwwwwwwwwwwww""!qwwwwwwwwwwwwwywwwwwwwwwwwwwwq!""!qwwwwwwxwwxwwwwwwywwwwwwwwwwwwqqwwwxwwxxxwwywwwwwwwywwwwwwwwqqqqq!!qwwwwxyxwwwwywwwywwwwwwwwwwwwwwwwwwwwwwwqqwwwwwwywwyxwwywwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwqq!!!qwwwwwwwwwwwwywwxwwwwywwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwq!!qwwwwwxwwxwwwwwwyxwwywwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwww!qwwxwwxxxwwywwxwwwwyxxwwwwwwwwwwwwwwywwwwwwwwwwwq!!!qwwwxxwwwwxwwywwxxwwxwwwwwwywwwxwwwwwwwwwGqA1!wwwwxwwyxwwwwyyxxxwwwwwwyxwwwwwwwwDDDD112!!qxwwyyxywwxwwywwywwyxxwwywwwwwwwwwGwwtDAA131##!qwwxyywwywwwwwwyxwwwwwwwwywwyxwwwwxwwwwDGGgAA113!13!2!12!!qwwwywwwwwwwwwwyxwwywwxwwxwwwwwwywwyxwwyxwwwwwwww11!33!1""wwwwwwwwxwwxwwywwxwwwwxxxwwwwwwywwyxywwwwwwwGGgDDDD1333"1322xwwwxwwxxwwwwyxwwyxxwwwwwwywwwwwwxwwwwDD4A1313##!"xwwwxxwwywwxywwyxxwwwwwwxwwxwiiDDdf11!33!!" -- title:Abstract Block Waves (Demo) -- author:MypkaMax -- input:keyboard t=0 T=0 sin,cos,abs,rad=math.sin,math.cos,math.abs,math.rad min,max=math.min,math.max back,front=0,31 DT=0 xS=0 yS=0 xD=0 yD=0 noinput=-300 dbg=false anim=false fps60=true fade=32 x=math.random(0,255)y=math.random(0,255) ox=0 oy=0 h1=math.random(0,89)h2=math.random(0,89) function BOOT()memset(0x3fc0,0,48)end function TIC()FS=time() for i=0,7 do if btn(i)then noinput=-300 end end noinput=noinput+1 if noinput<0 then ox=x oy=y else h1=h1-.02 h2=h2+.003 x=ox+256*sin(noinput/1280)y=oy+256*sin(noinput/1024) end if btn(0)then y=y-1 elseif btn(1)then y=y+1 end if btn(2)then x=x-1 elseif btn(3)then x=x+1 end --x,y=cos(t/128)*256,sin(t/128)*128 if btn(4)then h1=h1-4 elseif btn(5)then h1=h1+4 end if btn(6)then h2=h2-4 elseif btn(7)then h2=h2+4 end if keyp(71)then anim=not anim end if keyp(69)then dbg=not dbg end if keyp(67)then fps60=not fps60 end if fade>0 then fade=fade-1 end vbank(0)memset(0x3fc0,0,48) if t==1 then waves() else if t%2==0 then T=t xS=x yS=y cls(1)end back,front=0+t%2*31,31+t%2*31 waves() end if t%2==1 then memcpy(32768,0,16320) end vbank(1)palette() xD,yD=xS//1-x//1,yS//1-y//1 memcpy(0,32768,16320) DT=time()-FS overlay() t=t+1 --Hue shift LUT (stored as map nibbles) --c010f00f10f20f30f40f50f60f70 --c010f80f90fa0fb0fc0fd0fe0ff0 --c010ef0df0cf0bf0af09f08f07f0 --c0106f05f04f03f02f01f00f00f1 --c0100f20f30f40f50f60f70f80f9 --c0100fa0fb0fc0fd0fe0ff0ef0df --c0100cf0bf0af09f08f07f06f05f --c01004f03f02f01f00f10f20f30f --c01040f50f60f70f80f90fa0fb0f --c010c0fd0fe0ff0ff0ef0df0cf0b --c010f0af09f08f07f06f05f04f03 --3010f02f01 end function waves() for j=back,front do for i=0,31 do local I,J=i+x//8,j+y//3 local osc=sin(T/32+(I/6+J/3.2))*5+cos(T/64+(I/6))*3+sin(T/256+(J/4+I/2.4))*2+cos(T/48+(J/5))*6+sin(T/48+(J/2))*2 if osc<5 then map(clmp(4-osc*2,0,19),132,1,3,(-4+i*8+(J%2)*4-x%8)//1,(-4+j*3+osc*3-y%3)//1,0,1)end end end end function overlay() XD,YD=xD//1,yD//1 if fps60 then poke(0x3ff9,XD) poke(0x3ffa,YD) for i=0,1 do rect(-4+i*244+XD,0,4,136,0) rect(0,-4+i*140+YD,240,4,0) rect(i*236+XD,0,4,136,0) rect(0,i*132+YD,240,4,0) end else memset(0x3ff9,0,2) xD,yD=0,0 end for b=-4,3 do XD,YD=xD//1+b%2*240,yD//1+b//2*136 if dbg then for i=0,3 do print(string.format("%.4f ms",DT),3-i%2+XD,3-i//2+YD,i//3*15) print("Press F1 to toggle 30/60 fps scroll\nAt 60 fps, the resolution is slightly lower",3-i%2+XD,123-i//2+YD,i//3*15) end end if anim then for i=0,31 do clip(96+XD,56+i+YD+sin(t/32)*12,64,1) spr(48,104+XD+sin(t/15+i)*4,56+YD+sin(t/32)*12,14,2,0,0,2,2) clip() end for i=0,18 do spr(48,112+XD+cos(i/3+t/24)*48,60+sin(i/3+t/24)*48+YD,14,1,0,0,2,2) end end end end function palette() --Hue shift, intermediate and shade for i=0,2 do local H1,H2=clmp(sin(rad(h1+i*120)),-.5,.5)*256+127,clmp(sin(rad(h2+i*120)),-.5,.5)*256+127 --local H1,H2=peek4(130336+h1%90//1*3+i)*17,peek4(130336+h2%90//1*3+i)*17 for j=0,2 do local S=j*80 poke(65303+j*3+i,clmp(H1-S,0,255)) poke(65312+j*3+i,clmp(.5*(H1+H2)-S,0,255)) poke(65321+j*3+i,clmp(H2-S,0,255)) end end memcpy(0x3fc3,65303,27) memset(16365,255,3) for i=0,47 do poke(0x3fc0+i,clmp(peek(0x3fc0+i)-fade*8,0,255)) end end function clmp(a,l,h) return min(max(a,l),h) end