alexthescott.bad drain

-- bad drain
-- alexthescott
-- 9/13/21

-- z/x changes direction

p={8,136,2,11,139,3,12,140,1,7}
pal(p,1)

function new_center(col)
	-- circle shrinking effect
	c={}
	c.r=95
	c.col=col
	
	c.new_color=function(self,col)
		self.col=col
	end
	
	c.update=function(self)
		dif=-self.r/50
		self.r+=dif
	end
	
	c.draw=function(self)
		if self.r<12 or self.r\1%2==0 then
			circ(64,64,self.r-4,self.col)
			circ(64,64,self.r-2,self.col)
			circ(64,64,self.r,self.col)
		end
		
		if self.r>10 then
			-- lines towards center
			for i=-2,3 do
				line(i+64,-32,64,64-self.r,self.col)
				line(i+-32,64,64-self.r,64,self.col)
				line(i+64+self.r,64,160,64,self.col)
				line(i+64,160,64,64+self.r,self.col)
				line(i+0,0,64-self.r,64-self.r,self.col)
				line(i+128,0,64+self.r,64-self.r,self.col)
				line(i+0,128,64-self.r,64+self.r,self.col)
				line(i+128,128,64+self.r,64+self.r,self.col)
			end
		end
	end
	
	add(centers,c)
end

function new_particle(c,dir)
	p={}
	p.p={}
	p.c=c
	p.s=4
	p.a=rnd(1)
	p.av=-0.0001*(1+rnd(40)\1)
	p.r=91
	p.rv=1
	p.ra=0.00015*(dir*2-1)
	p.x=64+cos(p.a)*p.r
	p.y=64+sin(p.a)*p.r
	
	p.draw=function(self)
		-- draw trail
		for i=1,#self.p-1 do
			a=self.p[i]
			b=self.p[i+1]
			line(a.x,a.y,b.x,b.y,self.c+1)
		end
		circfill(self.x,self.y,self.s,self.c)
	end
	
	p.update=function(self)
		self.a+=self.av
		self.av+=self.ra
		self.r-=self.rv
		self.x=64+cos(self.a)*self.r
		self.y=64+sin(self.a)*self.r
		
		-- shrink particle circle
		if self.r<25 then
			self.s=1
		elseif self.r<40 then
			self.s=2
		elseif self.r<60 then
			self.s=3
		end
		
		-- add trail points
		local pnt={}
		pnt.x=self.x
		pnt.y=self.y
		add(self.p,pnt)
	end
	
	p.destroy=function(self)
		-- destroy @ center of screen
		if self.x<=65 and self.x>=63
					and self.y<=65 and self.y>=63 then
				del(particles,self)
		end
	end
	
	add(particles,p)
end

function burn()
	for i=1,200 do
		x=(rnd(64)\1)*2
		y=(rnd(64)\1)*2
		x=rnd(128)\1
		y=rnd(128)\1
		
		if x<64 then
			dx=2
		else
			dx=-2
		end
		
		if y<64 then
			dy=2
		else
			dy=-2
		end
		
		pc=pget(x,y)
		if pc%3!=0 then
			circfill(x+dx,y+dy,1,pc+1)
		end
		if rnd(1)<0.4 then
			circ(x,y,2,0)
			pset(x,y,0)
		end
	end
end

particles={}
dir=rnd(2)\1
global_color=1+3*(rnd(3)\1)
fc=0

centers={}
new_center(global_color)

cls()
::♥::
if t()<2 then
	print("bad drain",46,64,global_color)
else
	burn()
	
	fc+=1
	
	if fc%3==0 then
		new_particle(global_color,dir)
	end
	
	if fc%800==0 then
		fc=0
		global_color+=3
		global_color%=9
		new_center(global_color)
		
		if #centers==3 then
			del(centers,centers[1])
		end
		
		if dir==0 then
			dir=1
		else
			dir=0
		end
	end
	
	for p in all(particles) do
		p:draw()
		p:update()
		p:destroy()
	end
	
	for c in all(centers) do
		c:draw()
		c:update()
	end
	
	circfill(64,64,4,0)
	
	if btnp(5) or btnp(4) then
		if dir==0 then
			dir=1
		else
			dir=0
		end
	end
end
flip()
goto ♥