#
# theme: water
# words: drip, stain, flow

g.norefresh()
seed = (1633, 241, 512)

def f1():
	global seed 
	x, y, z = seed

	x = (171 * x) % 30269
	y = (172 * y) % 30307
	z = (170 * z) % 30323
		
	seed = x, y, z
	return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0
 
flowmap = []

for i in range(101):
	flowmap.append([])
	for j in range(101):
		flowmap[i].append(f1()*5+2)



import math
import time

  
def blamRect(buf, x,y,alpha):
	#Should this scale also?
	if alpha < 0:
		#might speed this up
		for i in range(len(buf)):
			for j in range(len(buf[0])):
				g.setPixel(x+i,y+j,buf[i][j])
	else:
		for i in range(len(buf)):
			for j in range(len(buf[0])):
				if buf[i][j] != alpha:
					g.setPixel(x+i,y+j,buf[i][j])


def copyRect(x,y,w,h):
	buf = []
	for i in range(x,x+w):
		buf.append([])
		for j in range(y,y+h):
			buf[-1].append(g.getPixel(i,j))
	return buf

def blur(buf):
	for i in range(1,len(buf)-1):
		for j in range(1,len(buf[0])-1):
			buf[i][j] = (buf[i+1][j] + buf[i-1][j] + buf[i][j+1] + buf[i][j-1] + buf[i][j])/5 
	for i in range(1,len(buf)-1):
		buf[i][0] = (buf[i][0] + buf[i][1] + buf[i-1][0] + buf[i+1][0]) / 4
		buf[i][-1] = (buf[i][-1] + buf[i][-2] + buf[i-1][-1] + buf[i+1][-1]) / 4
	for j in range(1,len(buf[0])-1):
		buf[0][j] = (buf[0][j] + buf[1][j] + buf[0][j-1] + buf[0][j+1]) / 4
		buf[-1][j] = (buf[-1][j] + buf[-2][j] + buf[-1][j-1] + buf[-1][j+1]) / 4
	buf[0][0] = (buf[0][0] + buf[0][1] + buf[1][0]) /3
	buf[0][-1] = (buf[0][-1] + buf[1][-1] + buf[0][-2]) /3
	buf[-1][0] = (buf[-1][0] + buf[-1][1] + buf[-2][0]) /3
	buf[-1][-1] =  (buf[-1][-1] + buf[-2][-1] + buf[-1][-2]) /3
	return buf

def darken(buf, factor):
	for i in range(len(buf)):
		for j in range(len(buf[0])):
			buf[i][j] = int(buf[i][j]*factor)
	return buf   
bleed = {}


while 1:
	minx = 100
	maxx = 0
	miny = 100
	maxy = 0
	time.sleep(0.1)
	if g.getMouse(3):
		x = g.getMouse(1)
		y = g.getMouse(2)
		bleed[(x,y)] = 80 

	for point in bleed.keys():
		if not bleed[point] > 10:
			del(bleed[point])		
			continue 
		x, y = point
		if x < minx:
			minx = x
		if x > maxx:
			maxx = x
		if y < miny:
			miny = y
		if y > miny:
			maxy = y
		if not bleed.has_key((x-1,y)):
			bleed[(x-1,y)] = bleed[point] - flowmap[x-1][y]
		if not bleed.has_key((x,y-1)):
			bleed[(x,y-1)] = bleed[point] - flowmap[x][y-1]
		if not bleed.has_key((x+1,y)):
			bleed[(x+1,y)] = bleed[point] - flowmap[x+1][y]
		if not bleed.has_key((x,y+1)):
			bleed[(x,y+1)] = bleed[point] - flowmap[x][y+1]
		if not bleed.has_key((x+1,y+1)):
			bleed[(x+1,y+1)] = 0.7 * bleed[point] - flowmap[x+1][y+1]
		if not bleed.has_key((x-1,y+1)):
			bleed[(x-1,y+1)] = 0.7* bleed[point] - flowmap[x-1][y+1]
		if not bleed.has_key((x+1,y-1)):
			bleed[(x+1,y-1)] = 0.7*bleed[point] - flowmap[x+1][y-1]
		if not bleed.has_key((x-1,y-1)):
			bleed[(x-1,y-1)] =0.7* bleed[point] - flowmap[x-1][y-1]
		bleed[point] = bleed[point] - flowmap[x][y]
	g.paper(0)
	for point in bleed.keys():
		x,y = point	
		g.setPixel(x,y,int(bleed[point]))
	if minx > maxx - 2:
		continue
	if miny > maxy - 2:
		continue
	buf = copyRect(minx-1,miny-1,maxx+1-minx,maxy+1-miny)
	blur(buf)
	blur(buf)
	blamRect(buf,minx,miny,-1)
	g.refresh()