` >@]`|€› ºÀ#Ùà?ÞãZãçvçë‘ìï¬ñóÈõ÷ãúûÿÿÿ @$`0€< HÀTà#iãB~ça”ë©ï ¾óÀÔ÷ßéûÿÿÿ 0ÿÿÿÿÿÿÿÿ2Tv˜ºÜþïÍ«‰gE#2Tv˜ºÜþ2Tv˜ºÜþ÷àààîîàîàîîîîîîîîîîîîîîîîîîî»î¾»»îîîàîîîîë̾»À̉ªÀœ‰™Ê™‰×ªŒŠg¾»»ë»»»»¾»»»î¾»»ë»îÌ™ºËÌ̪ê¬Ê »»» » ‰»ˆª »ÞàÝÐÝíîîîàîÞªš‡eªªhwÝž9ˆÝ»f3î[f4¾Xee¾‰VX»›YWxݽz¸šzІxueVVuhSeˆ©3ƒyª54v—ED4˜w‰ ™ˆÚ˜ˆÚ™©îyëîîØÝîîØÝîîààîîîÞîî­àîÞ­àîîÝîîîîîîîîîîîîîîîÞº«¹[ªªªˆª»jvª»{wí»wwÝî»wÝí¾{ÝÝî¾53Sdw4D‡xWtwU{vwV‰j‡§‰¨˜{§èîxwÚîÚ­îîØÚ히Øí™ˆˆí‰ˆˆˆˆ‰ˆˆˆ™ˆˆˆžˆˆˆî™™ ˆ ˆéˆîˆîéîîîàîàîîîàîîàîîîîîîîîîîîÞîîîîîîîîîîîîîîîîîîîîîîîîîîîîÝíî¾Ýíî¾îîîîîîîîîîîîîîîîîîîîîîîî«zÚîëªÝ»îª½ëî»»îîî»îîîîîîîîîîîîî™ž™™éž™™î™™™îî™éîîžîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîààîîàîàîîîàîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÞÝÝÝîîîîîîîîîîîîîîÝÝíîîîîàîîàîîîîîîîîàîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÞÝÝÝÞÝÝÝîîÝÝîîÝÝîîÝÝÞÝÝÝÞÝÝÝÞÝÝÝÝÝíîÝÝíîÝîîîÝîîîÝîîîÝÝíîÝÝíîÝÝíîîîîîîààîîàîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÞÝîîÞÝîîÞÝîîîîîîîîîîîîîîîîîîîîîîîÝíîîÝíîîÝíîîîîîîîîîîîîîîîîžîîî™îéž™î™ î™™ž™™™™ž ™éîî™îîîààîîàîîîîîîîîàîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîž™îî™™îîžéîîîîîîîîîîîîîîîîîîîîéîîî™îîî™îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîàîàîàîîîîîàîîàîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîàîîîàîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÐÐ ÐÝÐÝÐÐ ÜÐ ÝÝ ÐÝ ÐÐ ÐÝÐÝÐÐ ÐÝÝÝ ÝÝ Ð ÝÐÐ ÝÝ ÐàîîîìÎîîîîîÎîîìîÌÌîàîîÐÝÝ íîîÞîÞíîÝÝÝÝÝÞíÝÐíÞ àîîîìÎîîìÎîîîîîîÎìîàÎìàîîÞîîíîíÞîÞîîíîÞíîàíÞ™™ » » » ™™ Ì Ì Ì ™™ Ý Ý Ý îîîÐÐ ÐÝÐÝÐÐ ÜÐ ÝÝ ÐÝ ÐÐ ÐÝÐÝÐÐ ÐÝÝÝ ÝÝ àîààîîààîîîìÎîîîîîÎîîìîÌÌîàîîÐÝÝ íîîÞîÞíîÝÝÝÝÝÞíÝÐíÞ àîîîìÎîîìÎîîîîîîÎìîàÎìàîîÞîîíîíÞîÞîîíîÞíîàíÞ™™ » » » ™™ Ì Ì Ì ™™ Ý Ý Ý îîîÐÐ ÐÝÐÝÐÐ ÜÐ ÝÝ ÐÝ ÐÐ ÐÝÐÝÐÐ ÐÝÝÝ ÝÝ àîààîîààîîîìÎîîîîîÎîîìîÌÌîàîîÐÝÝ íîîÞîÞíîÝÝÝÝÝÞíÝÐíÞ àîîîìÎîîìÎîîîîîîÎìîàÎìàîîÞîîíîíÞîÞîîíîÞíîàíÞ™™ » » » ™™ Ì Ì Ì ™™ Ý Ý Ý îîî€ >º? " !!"""D4B43C"""3CD!31"!"""""""!""D33D4!"23#D2320!#2"!"#!34D4DD2D! !!"! "!!"""""!D4!$B"!""!"!!!" """""!D!!!""!""!"!!!"""""""3! !!""""4"!""!""B!""!1" !!"""C#D!!""!1"""!D!!B""B"#"""""2DD2"!"""D""AD!!!"""@D#!!"!CDDD"!"!DD""#"!!!!"AD"!"!!"!ADDCD""!D4"""!"!B!"! #!!""!!3DD!!43""!1!"!D!""! 323A "@4D$3!"$3""!"!"2D"" "C2!!!"!#D43!A$C#""!B$"CCD234!4""$!D4"!BCD$""!!"B4C4!#B4C2D"!""4BD" DDD"!""""""CBD#"CDCD134!"""!"2!!#!"BC4"""""!2BDADDD$4A#C""""B24B3CD""""!BDD@CDD$4B"!#!#12DB3DB#!"!""BDD2#!43D4""B$D"3"!D2134B""!#ADCD3"""DDDD"!D!33D"!""!!"!4C$B!""2D4CC3ADD4#!"!!""!""2BD43C!""CDD33CAB$$" !!D""""! """"""22BD3D4""33#D13"!ADD$!!""!""!"""""C3C$DCC3C A4!BD#!"!"!""!"!""DD34DB "1D""" D""!""! """"""""D!!"B!!""B!#!!" !"""""""B""#!"2!3!#B""!""!"""!"""""!"!! "!CD""""!!""""A""""""""B!"!!!"!!DDC""!!!"""B#DB!"""D!"!DA!!""!CDD#"""!!!!B3D4""!"DD""B!! !!!!B4D""""!!""!DCDD"""!D4""!""!!!!" "AD4!!"#!"""C4CD "!44""!!!"!D "!!22D !""!#C!4!!B3#"!" ""!D!1#DD!!""CD31#C$"""1D!"AD"""""D4"#!AB$""!D2$"!0$"""C34#" ADDD"" ""BDC4#! "$""!B!" "!BBDB"""""""1"BDD!2""! "213D"""""!!BD""!21D13""!!""AB"!CD$ AD3C##" #"BBCD!B133D!" """CD333B3C#!""!2DD33CAD$D4!!!D""""!""33D2B22!#D#"" !""3B1C  "#!! 4D$ !!!""DDD1B"1C!"BD#"#$2!"!D$D!$  !!!"""!AD$!D"""D"" 14""""A ""2B"""! """!"BC""3D!!"B "!"!!!!1CD#""2#" D!"!D"!"""ADDD$""!"CD#!3""D4"!"""!"!CD"""!"2#D13B3!""11""!!""CC""2"!"!BD3B4!C""!"""!"D"!" "2D4!""!ADDC4!3C"""!"""!D "! 3DD!"DDD$112C#!""""4!""!C!"DD!""4D241 B3"!B""2"!D!2 D$"#C!B D3DD#!"""BD$""1!DAD#!" 34" "B4DC"!""BD334""!""!BD!D$! " """BDD!4"""DD334!""""1#1BD2!!"" A##D334!""24B4C4!"""!!D$D!"""!"""""0#CD4CD#""332$2!"""""!"" 2""!"2"43DA4C43""""!"""!!#!"""B4C2!"!"!""""2"""""BD!!"2"""!!!"#!""A"B$""""" """"!!"""""!!!"DD4!"""""31!$""!"!!"  D4" $"!"!!""!DD#$"!""A4""!"A$"!A42"1DDD$"!BD$""""$A "  DD"!"!!BDDDD"!!D#""!"@ ""B""""!BDD!"2C#""!"!13"D!1CD1"243"""D""" 2412!!"1DD1!!4B4"""D""""0DD!#A!4"!"!BD#" 4#D"""C""""!"!0$D43!D3!"1B#C! DDD$!""""D!""!D42D"D#""" 411"" $D$#"""""#$"""D4CCB!C4!""""3!1"!#3C$!"""!"BDDDBB3!2"!!C23D$!!""0C$2BB3"D""CDD"2D1CDB!!!  2 D4C4#!"""#4D##!!!4233#""B3D"""BD434DBDC4"""!#DD334"""DD43CDDD!4"  !"""3$D4CD""23DDC"3 "4"!""""""" ""C43D!442D34"!42!!"""!"!!""2DA43BD!$""2""!"!""!!""""2!D""2  "2!2!""!""""!"""""D!"! 4B""!"""!!"""!""2 ""3!"!"0D4"!"""""!#!""!"!""!!D !"""!#!D42!""!!!!!"""CD#D!!""D"""BD!2!""!4D44""""1"2"!!4DD4""!!!D$""AD!""""2BD#""" CD#!""A4DD$2!AD#""1#!"B!"""D3$""""  !D!""BD3D$""!D3""!"B""!!"!DD"!!"0"A!!"C4!"33""!#!!""4!#31BD42D2!D0!"0DD1!22C!"""!!"2#""!AD "D!2 !"!DD$2!D!C"""!B!C!!BD $D3A4!"4BDC#2DD$!""!2B4D4"2CD42D!24!"BD2A"""DDD""""""#CB42" "1DDCD4A34""""A#!#"3C$""""##!DD"ADDD"3!B442!""""B "334""""BBD!AD431D"3#B!"#D2!BD13DB""!" 2$3!$A4C4#"""4D22!!D32CD!"A4C4$"""#433#!13D#""!!""#DD$B"""BD43CDADBD!!!""""""DDB43D"""CCD#3C!B"" !!1BD"""""""""!""D43D4!"23#D23212!ADD!"""!"""#23D$D42C$3C!2!CD"B4"!" """"""DDA$B BB"!"!4""!!" """""!D$!! "B!""4!!!!"""""$""3! 124!""!!"!""!""2!""A"2C34"!!!"""2""!!D!!A""B!CDD""!!""""D""ADB!!""1BD$"""!!"!"DD""!"!!!"1AD#""2""""DD"""!""A!"! "2D""""!43""!!!"!D!""!1#DD!"!"!"43""!"!"2D!" DD4"!"!1$C#""!2#"#AD""!"!!BCD$""!4C4!034" DDD"!"""""2B$BD#""" ""$DD4"""""!2AB4! ""122CD""""!AD#!!"""2DA3CD#!!!!"B !"!D213DB"!"""DC3D""!!" "!"#!D3D#!"!"#!"!"ÝÝÝÝíÝ-íÍÑÝ1B$4"!D"""" """"""!Ð/ÐOß!òÿ#ÿ"ý/2"!ADD#! !""""BðßñÏãÁíþÞïâÏ!14!BD$""!"""BD4B"à/Ââ?ÒÒýÿ"!ÿÎ ÿ="1C"""D"" D##!!!CDDD"""Þ<1Þ-òþÝî!îÝï"A"""A!#  2AD$"""!!DDDD$""!"!"""""13!"B " "B!!""C4DD""!! #!CD#""C3AD"! C!4!"!!!"ACDC""! C"2B""B41,0 @@0``@€€P  `ÀÀpààãã“çç¥ëë·ïïÉóóÛ÷÷íûûÿÿÿ*0ÿÿÿÿÿÿÿÿ2Tv˜ºÜþïÍ«‰gE#2Tv˜ºÜþ2Tv˜ºÜþ! UUUUÕÕ]UÕÝUUÕÝUUÕÕ]UUUUUUUUUUUUUUUUUÜÕ\UÝÝ]UÕÝUUU]UUUUUUUUUUUUUUUUUUÕÕ]UÕÝUUÕÝUUÕÕ]UUUUUUUUUUUUUUUUUU]UUÕÝUUÝÝ]UÝÝ]UU]UUUUUUUUUUUUUUUUUUUUUÕUUU]ÝUÕUÕ]ÝUUÝ]UUÕUUUUUUåîî^îìÎîîîîîÎîîìîÌÌîåîî^UUUUUUUUÕÝÝ]íîîÞîÞíîÝÝÝÝÝÞíÝÕíÞ]UUUUUUUUåîî^îìÎîîìÎîîîîîîÎìîåÎì^UUUUUUUUåîî^ÞîîíîíÞîÞîîíîÞíîåíÞ^UUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUU»[UUU[UU»[UU[UUU»[UUUUUUUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUUÌ\UUU\UUÌ\UU\UUUÌ\UUUUUUUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUUÝ]UUU]UUÝ]UUU]UUÝ]UUUUUUUUUUUUUUî^UUU^UUî^UUU^UUî^UUUUUUUUUUUUUÕÕ]UÕÝUUÕÝUUÕÕ]UUUUUUUUUUUUUUUUUÜÕ\UÝÝ]UÕÝUUU]UUUUUUUUUUUUUUUUUUÕÕ]UÕÝUUÕÝUUÕÕ]UUUUUUUUUUUUUUUUUU]UUÕÝUUÝÝ]UÝÝ]UU]UUUUUUUUUUUUUUUUUUUUUåUUU^îUåUå^îUUî^UUåUUUUUUåîî^îìÎîîîîîÎîîìîÌÌîåîî^UUUUUUUUÕÝÝ]íîîÞîÞíîÝÝÝÝÝÞíÝÕíÞ]UUUUUUUUåîî^îìÎîîìÎîîîîîîÎìîåÎì^UUUUUUUUåîî^ÞîîíîíÞîÞîîíîÞíîåíÞ^UUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUU»[UUU[UU»[UU[UUU»[UUUUUUUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUUÌ\UUU\UUÌ\UU\UUUÌ\UUUUUUUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUUÝ]UUU]UUÝ]UUU]UUÝ]UUUUUUUUUUUUUUî^UUU^UUî^UUU^UUî^UUUUUUUUUUUUUÕÕ]UÕÝUUÕÝUUÕÕ]UUUUUUUUUUUUUUUUUÜÕ\UÝÝ]UÕÝUUU]UUUUUUUUUUUUUUUUUUÕÕ]UÕÝUUÕÝUUÕÕ]UUUUUUUUUUUUUUUUUU]UUÕÝUUÝÝ]UÝÝ]UU]UUUUUUUUUUUUUUUUUUUUUåUUU^îUåUå^îUUî^UUåUUUUUUåîî^îìÎîîîîîÎîîìîÌÌîåîî^UUUUUUUUÕÝÝ]íîîÞîÞíîÝÝÝÝÝÞíÝÕíÞ]UUUUUUUUåîî^îìÎîîìÎîîîîîîÎìîåÎì^UUUUUUUUåîî^ÞîîíîíÞîÞîîíîÞíîåíÞ^UUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUU»[UUU[UU»[UU[UUU»[UUUUUUUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUUÌ\UUU\UUÌ\UU\UUUÌ\UUUUUUUUUUUUUU•UUU™UUU•UUU•UUU™YUUUUUUUUUUUUUUÝ]UUU]UUÝ]UUU]UUÝ]UUUUUUUUUUUUUUî^UUU^UUî^UUU^UUî^UUUUUUUUU$€)>.Ì1-- title: Kaleidoscope -- author: Sakura -- desc: Kaleidoscope -- site: -- license: MIT License (change this to your license of choice) -- version: 0.4 -- script: lua t=0 x=96 center_x=50 triangle_height=50*math.sqrt(3) -- 86.6 center_y=100-triangle_height/3 -- 71.1 function mask_spr(int32,colorkey) local ret=0 for i=0,7 do local c=colorkey*2^(i*4) local m=7*2^(i*4) if ((int32&m)~c)~=0 then ret=ret+int32&m end end return ret end function _if(c,t,f) if c then return t else return f end end m1={} objs={} function BOOT() cls(0) equilateral_tri(100,1) local m=make_mask(0,0,1) m1=invert_mask(m) objs={} for i=1,30 do local sprid=208+rand(0,47) ---math.random(0,47) local scale=rand(10,50)/10 --math.random(10,40)/10 table.insert(objs,{sprid=sprid,scale=scale}) end init_physics() end function avg_xy(o1,o2,o3,o4) return (o1.p[1]+o2.p[1]+o3.p[1]+o4.p[1])/4, (o1.p[2]+o2.p[2]+o3.p[2]+o4.p[2])/4 end scale=0.5 function clip_v(x,min,max) return math.max(math.min(x,max),min) end rotation_angle=0 function ovr_p(i,j,flip) --return math.floor(math.sqrt(math.abs(i)^2+math.abs(j)^2))%5==0 return flip end function OVR() -- circ(0,0,100,10) -- spr(208,0,0,-1,5,0,0,2,2) local tile_range=1.5 local angle=rotation_angle for j=math.floor(-tile_range/scale)-1,math.ceil(tile_range/scale)+1 do for i=math.floor(-tile_range/scale)-1,math.ceil(tile_range/scale)+1 do local x=-center_x local y=-center_y local x1,y1=rotate( 100*scale*i+j*50*scale, triangle_height*j*scale, angle) local x2,y2=rotate( 100*scale*i+j*50*scale, triangle_height*(j+2/3)*scale, angle) if ovr_p(i,j,false) then rot_spr2( 120+(x1+x), 68+(y1+y), math.pi*2/3*(i-j)+angle, 50, (100-100*math.sqrt(3)/6), 1.025*scale, --0.99*scale, 0, false ) end if ovr_p(i,j,true) then rot_spr2( 120+(x+x2), 68+(y+y2), -math.pi*2/3*(i-j)+math.pi+angle, 50, (100-100*math.sqrt(3)/6), 1.025*scale, --0.99*scale, 0, true ) end end end if info_display then info() end end function info() print(string.format("%.1f FPS",calc_fps()), 1,128,_if(dark_mode,15,0)) end dark_mode=false info_display=false bg_color=15 function TIC() if btn(2) then x=x-.3 end if btn(3) then x=x+.3 end if btn(1) then scale=math.max(0.1,scale*0.95) end if btn(0) then scale=math.min(5,scale/0.95) end if btnp(6,12,6) or btnp(7,12,6) then info_display=not info_display end if btnp(4,12,6) or btnp(5,12,6) then dark_mode=not dark_mode; bg_color=_if(dark_mode,0,15) end cls(bg_color) if b==1 then poke(0x03ff8,15) end local bbx1,bby1,bbx2,bby2 for i,o in ipairs(objs) do -- This is the intended code, but fixing it will -- result in a monotonous and boring kaleidoscope -- visual, so I'll leave the bug as is. -- -- local ax,ay=avg_xy(objs2[(i-1)*4+1], -- objs2[(i-1)*4+2], -- objs2[(i-1)*4+3], -- objs2[(i-1)*4+4]) -- clip(0,0,100,100) -- bbx1,bby1,bbx2,bby2= -- rot_spr(o.sprid, -- ax-4,ay-4, -- angle(objs2[(i-1)*4+1].p[1]-objs2[(i-1)*4+2].p[1], -- objs2[(i-1)*4+1].p[2]-objs2[(i-1)*4+2].p[2]), -- 4,4, -- o.scale, -- 0) local ax,ay=avg_xy(objs2[i],objs2[i+1],objs2[i+2],objs2[i+3]) clip(0,0,100,100) bbx1,bby1,bbx2,bby2= rot_spr(o.sprid, ax,ay, angle(objs2[i*3].p[1]-objs2[i*3+1].p[1], objs2[i*3].p[2]-objs2[i*3+1].p[2]), 4,4, o.scale, 0) clip() local max=math.max local min=math.min local floor=math.floor local sqrt=math.sqrt local px=pix for y=clip_v(bby1,0,99),clip_v(bby2,0,99) do local x1=floor((100-y)/sqrt(3)) local x2=100-x1 for x=clip_v(bbx1,x1,x2+1),clip_v(bbx2,x1,x2+1) do local dst=px(x+100,y) dst=_if(dst==bg_color,15,dst) local src=px(x,y) local transmittance=src/15 if src~=bg_color then local v=bg_color if dark_mode then v=8-floor(dst*transmittance+.5)*0.4 else v=floor(dst*transmittance+.5) end px(x+100,y,max(0,min(15,v))) end end end rect(clip_v(bbx1,0,99), clip_v(bby1,0,99), clip_v(bbx2,0,99)-clip_v(bbx1,0,99)+1, clip_v(bby2,0,99)-clip_v(bby1,0,99)+1, bg_color) end paint(100,0,m1,0) copy_to_spr(100,0,100,100) --sync(0,0,true) --cls(clip_v(15-math.floor(scale*3),0,15)) cls(0) local angle=(x/10)+(time()/1000)/10 vbank(0) gradation( math.sin(angle*1.0+math.pi/6*0)+1, math.sin(angle*1.2+math.pi/6*2)+1, math.sin(angle*1.25+math.pi/6*4)+1 ) vbank(1) gradation( math.sin(angle*1.05+math.pi/6*0)+1, math.sin(angle*1.1+math.pi/6*2)+1, math.sin(angle*1.15+math.pi/6*4)+1 ) vbank(0) update(angle) rotation_angle=angle local tile_range=1.5 for j=math.floor(-tile_range/scale)-1,math.ceil(tile_range/scale)+1 do for i=math.floor(-tile_range/scale)-1,math.ceil(tile_range/scale)+1 do local x=-center_x local y=-center_y local x1,y1=rotate( 100*scale*i+j*50*scale, triangle_height*j*scale, angle) local x2,y2=rotate( 100*scale*i+j*50*scale, triangle_height*(j+2/3)*scale, angle) if not ovr_p(i,j,false) then rot_spr2( 120+(x1+x), 68+(y1+y), math.pi*2/3*(i-j)+angle, 50, (100-100*math.sqrt(3)/6), 1.025*scale, --0.99*scale, 0, false ) end if not ovr_p(i,j,true) then rot_spr2( 120+(x+x2), 68+(y+y2), -math.pi*2/3*(i-j)+math.pi+angle, 50, (100-100*math.sqrt(3)/6), 1.025*scale, --0.99*scale, 0, true ) end end end t=t+1 fps_sample[t%10+1]=time() if info_display then info() end end fps_sample={-100,-100,-100,-100,-100,-100,-100,-100,-100,-100} function calc_fps() local latest=fps_sample[t%10+1] local oldest=fps_sample[(t%10-9)%10+1] return 9*1000/(latest-oldest) end function equilateral_tri(side_len,color) tri(0,100,100,100,50,100-100*math.sqrt(3)/2.0,color) end function make_mask(sx,sy,color,w,h) local color=color or 0 local w=w or 100 local h=h or 100 local ret={} ret.w=w ret.h=h for y=0,h-1 do for x=0,w-1 do table.insert(ret,_if(pix(x,y)==color,-1,0)) end end return ret end function invert_mask(mask) local ret={} ret.w,ret.h=mask.w,mask.h for _,v in ipairs(mask) do table.insert(ret,-1-v) end return ret end function paint(x,y,mask,color) for y1=0,mask.h-1 do for x1=0,mask.w-1 do if mask[y1*mask.w+x1+1]~=0 then pix(x1+x,y1+y,color) end end end end function copy_to_spr(sx,sy,w,h) local w=w or 100 local h=h or 100 local pok=poke local pek=peek for y=0,h-1 do local spr_row=y//8 for x=0,w-1,2 do local screen_addr=(y+sy)*120+(x+sx)//2 local spr_col=x//8 local spr_addr=0x4000+(32*16)*spr_row+32*(spr_col) local spr_addr2=spr_addr+4*(y%8)+((x//2)%4) pok(spr_addr2,pek(screen_addr)) end end --sync(0,0,true) -- Weird behavior occurs when taking a screenshot with the F7 key. end function rot_spr(sprid,x,y,angle,cx,cy,scale,chromakey) local angle=angle or 0 local cx=cx or 4 local cy=cy or 4 local scale=scale or 1 local spr_x=sprid%16*8 local spr_y=sprid//16*8 local dx1,dy1=-cx,-cy local dx2,dy2=-cx,8-cy local dx3,dy3=8-cx,8-cy local dx4,dy4=8-cx,-cy local c=math.cos(angle) local s=math.sin(angle) local rx1,ry1=x+cx+(dx1*c-dy1*s)*scale,y+cy+(dx1*s+dy1*c)*scale local rx2,ry2=x+cx+(dx2*c-dy2*s)*scale,y+cy+(dx2*s+dy2*c)*scale local rx3,ry3=x+cx+(dx3*c-dy3*s)*scale,y+cy+(dx3*s+dy3*c)*scale local rx4,ry4=x+cx+(dx4*c-dy4*s)*scale,y+cy+(dx4*s+dy4*c)*scale ttri( rx1,ry1,rx2,ry2,rx3,ry3, spr_x,spr_y,spr_x,spr_y+8,spr_x+8,spr_y+8,0,chromakey ) ttri( rx1,ry1,rx4,ry4,rx3,ry3, spr_x,spr_y,spr_x+8,spr_y,spr_x+8,spr_y+8,0,chromakey ) return math.floor(math.min(rx1,rx2,rx3,rx4)), math.floor(math.min(ry1,ry2,ry3,ry4)), math.ceil(math.max(rx1,rx2,rx3,rx4)), math.ceil(math.max(ry1,ry2,ry3,ry4)) end function rot_spr2(x,y,angle,cx,cy,scale,chromakey,flip) local angle=angle or 0 local cx=cx or 120 local cy=cy or 68 local scale=scale or 1 local flip=flip or false local spr_x=0 local spr_y=0 local dx1,dy1=-cx,-cy local dx2,dy2=-cx,100-cy local dx3,dy3=100-cx,100-cy local dx4,dy4=100-cx,-cy local c=math.cos(angle) local s=math.sin(angle) local rx1,ry1=x+cx+(dx1*c-dy1*s)*scale, y+cy+(dx1*s+dy1*c)*scale local rx2,ry2=x+cx+(dx2*c-dy2*s)*scale, y+cy+(dx2*s+dy2*c)*scale local rx3,ry3=x+cx+(dx3*c-dy3*s)*scale, y+cy+(dx3*s+dy3*c)*scale local rx4,ry4=x+cx+(dx4*c-dy4*s)*scale, y+cy+(dx4*s+dy4*c)*scale if flip then if check_bbox(rx1,ry1,rx2,ry2,rx3,ry3,rx4,ry4) then ttri( rx1,ry1,rx2,ry2,rx3,ry3, cx+(cx-spr_x),spr_y,cx+(cx-spr_x),spr_y+100,cx+(cx-(spr_x+100)),spr_y+100,0,chromakey ) ttri( rx1,ry1,rx4,ry4,rx3,ry3, cx+(cx-spr_x),spr_y,cx+(cx-(spr_x+100)),spr_y,cx+(cx-(spr_x+100)),spr_y+100,0,chromakey ) end else if check_bbox(rx1,ry1,rx2,ry2,rx3,ry3,rx4,ry4) then ttri( rx1,ry1,rx2,ry2,rx3,ry3, spr_x,spr_y,spr_x,spr_y+100,spr_x+100,spr_y+100,0,chromakey ) ttri( rx1,ry1,rx4,ry4,rx3,ry3, spr_x,spr_y,spr_x+100,spr_y,spr_x+100,spr_y+100,0,chromakey ) end end end function check_bbox(rx1,ry1,rx2,ry2,rx3,ry3,rx4,ry4) local x1=math.min(rx1,rx2,rx3,rx4) local y1=math.min(ry1,ry2,ry3,ry4) local x2=math.max(rx1,rx2,rx3,rx4) local y2=math.max(ry1,ry2,ry3,ry4) local ret=x1<240 and x2>=0 and y1<136 and y2>=0 return ret end function rotate(x,y,angle) local c=math.cos(angle) local s=math.sin(angle) return (x*c-y*s),(x*s+y*c) end function init_physics() for i=1,#objs*4 do table.insert(objs2,make_obj(rand(0,239),rand(0,135))) end for i=1,#objs*4,4 do table.insert(sticks,make_stick(objs2[i],objs2[i+1],40)) table.insert(sticks,make_stick(objs2[i],objs2[i+2],40)) table.insert(sticks,make_stick(objs2[i],objs2[i+3],40*math.sqrt(2))) table.insert(sticks,make_stick(objs2[i+1],objs2[i+3],40)) table.insert(sticks,make_stick(objs2[i+2],objs2[i+3],40)) table.insert(sticks,make_stick(objs2[i+1],objs2[i+2],40*math.sqrt(2))) end end objs2={} sticks={} function dist(o1,o2) local dx=o1.p[1]-o2.p[1] local dy=o1.p[2]-o2.p[2] return math.sqrt(dx*dx+dy*dy) end function update(angle) local g={0,1} g[1],g[2]=rotate(0,1,-angle) local sqrt=math.sqrt for i=1,3 do for _,o in ipairs(objs2) do local n=3 for i=1,n do -- This is the intended code, but fixing it will -- result in a monotonous and boring kaleidoscope -- visual, so I'll leave the bug as is. -- wall_bounce(50,100-sqrt(3)*50/3,math.pi*2/n*i,o) wall_bounce(50,66.7,math.pi*2/n*i,o) end end for _,s in ipairs(sticks) do local dx=s.p2.p[1]-s.p1.p[1] local dy=s.p2.p[2]-s.p1.p[2] local d=sqrt(dx*dx+dy*dy) local e=s.d-d local percent=e/d/2 local offset_x=dx*percent local offset_y=dy*percent s.p1.p[1]=s.p1.p[1]-offset_x; s.p1.p[2]=s.p1.p[2]-offset_y; s.p2.p[1]=s.p2.p[1]+offset_x; s.p2.p[2]=s.p2.p[2]+offset_y; end for _,o in ipairs(objs2) do local sx,sy=o.p[1],o.p[2] o.p[1]=o.p[1]+(o.p[1]-o.op[1])+g[1]*0.01*-o.f o.p[2]=o.p[2]+(o.p[2]-o.op[2])+g[2]*0.01*-o.f o.op[1],o.op[2]=sx,sy end end end function make_obj(x,y) -- position,old-position,antigravity-force return {p={x,y},op={x,y},f=rand(-5,5)} end function make_stick(p1,p2,d) return {p1=p1,p2=p2,d=d} end function rand(from,to) return rnd(to-from)+from end seed1=math.floor(tstamp()%1000) seed=seed1 function rnd(n) seed=12345+seed*1103515245%2147483647 return seed%n end function angle(x,y) return (math.atan(y/x)+_if(x<0,math.pi,0))%(math.pi*2) end function wall_bounce(wall_center_x,wall_center_y,wall_angle,obj) local x,y=rotate(obj.p[1]-center_x,obj.p[2]-center_y,-wall_angle) local ox,oy=rotate(obj.op[1]-center_x,obj.op[2]-center_y,-wall_angle) if y>45 then local v1=y-oy local y1=y y=45 oy=y1-v1 end obj.p[1],obj.p[2]=rotate(x,y,wall_angle) obj.op[1],obj.op[2]=rotate(ox,oy,wall_angle) obj.p[1]=obj.p[1]+center_x obj.p[2]=obj.p[2]+center_y obj.op[1]=obj.op[1]+center_x obj.op[2]=obj.op[2]+center_y end function set_color(color_no,r,g,b) local palette=0x3fc0 local color_addr = palette+3*color_no poke(color_addr,r) poke(color_addr+1,g) poke(color_addr+2,b) end function gradation(r,g,b) local m=math.max(r,g,b) local rp,gp,bp=r/m,g/m,b/m for i=0,7 do set_color(i,rp*256*i/8,gp*256*i/8,bp*256*i/8) end local rp1=rp*256*7/8 local gp1=gp*256*7/8 local bp1=bp*256*7/8 for i=8,15 do local d=i-7 -- 0...7 set_color(i, rp1+(255-rp1)*d/8, gp1+(255-gp1)*d/8, bp1+(255-bp1)*d/8 ) end -- sync(0,0,true) end --[[ vbank(1) gradation(1,2,2) sync(0,0,true) exit() ]]