import golly as g 
import random
import os 

g.new("")
fire_cells = set()
removed = set()
added = set()

def add_fire(x, y):
	global fire_cells
	
	if not (x, y) in fire_cells:
		fire_cells.add((x, y))

def fire_crystal_cell(x, y, idx):
	global fire_cells
	global removed
	global added 
	
	if random.random() > 0.1:
		return 
		
	removed.add((x, y))
	
	g.setcell(x, y, idx)
	
	for i in range(-1, 2):
		for j in range(-1, 2):
			if g.getcell(x + i, y + j) == 0:
				g.setcell(x + i, y + j, 255)
				added.add((x + i, y + j))

def crystalize(idx):
	global fire_cells
	global removed
	global added 
	
	added.clear()
	removed.clear()
	
	for x, y in fire_cells:
		fire_crystal_cell(x, y, idx)
		
	for x, y in removed:
		fire_cells.remove((x, y))
		
	for x, y in added:
		fire_cells.add((x, y))
		
def addfire(x):
	g.setrule("S3/B3")
	g.select([ x, 0, 10 , 10])
	g.randfill(100)
	g.setrule("255")
	for i in range(-1, 11):
		g.setcell(x + i, 10, 255)
		g.setcell(x + i, -1, 255)
		g.setcell(x + 10, i, 255)
		g.setcell(x + -1, i, 255)
		
		add_fire(x + i, 10)
		add_fire(x + i, -1)
		add_fire(x + 10, i)
		add_fire(x + -1, i)

def generate():
	global fire_cells
	global removed
	global added 
	
	g.new("")
	fire_cells = set()
	removed = set()
	added = set()
	addfire(0)
	addfire(100)

	for k in range(2, 20):
		for i in range(30):
			crystalize(k)
	g.fit()
	g.update()
	
for i in range(100):
	generate()
	g.save(os.path.join(g.getdir("files"), 'sotchastic_simulation/double/{0}.rle'.format(i)), "rle")
	