git.fiddlerwoaroof.com
Raw Blame History
import os
if __name__ == '__main__':
	HOME=os.environ['HOME']
	execfile(os.path.join(HOME, 'python_envs', 'roguelike', 'bin', 'activate_this.py'),
				dict(__file__=os.path.join(HOME, 'python_envs', 'roguelike', 'bin', 'activate_this.py')))

import scipy.signal
import random
#random.seed(2)

import libtcodpy as tc
import numpy as np
import scipy.signal as sig

from src import console
from src import events
from gui import text_display

import random
import bisect

from twisted.internet import reactor
import twisted.internet


WIDTH = 155
HEIGHT = 87

def scale_array(arr, min, max):
	omin, omax = arr.min(), arr.max()
	arr -= omin
	arr *= (max - min)
	arr /= (omax - omin)
	arr += min
	return arr

# For Conway's game of life:
#cm = np.array([[1,1,1],[1,0,1],[1,1,1]])
# For a random neighbour selection:
cm = np.random.random_integers(0,np.random.random_integers(1,3), (3,3))
gens = 0
def change(arr):
	global gens
	gens += 1
	live = arr == 1
	# Finite grid
	#new = sig.convolve2d(arr,cm,'same')
	# Torus
	new = sig.convolve2d(arr,cm,'same', 'wrap')
	arr[live & (new < 2)] = 0
	arr[live & (new > 3)] = 0
	arr[new == 3] = 1

class Application(object):
	def __init__(self):
		self.screen = console.Screen(WIDTH, HEIGHT+5)
		self.console = console.Console(WIDTH, HEIGHT, self.screen)
		self.border = console.Console(WIDTH, 5, self.screen, (0,HEIGHT))
		self.message_console = console.Console(WIDTH-2, 5, self.screen, (1,HEIGHT))
		self.messages = text_display.MessageBox(self.message_console, 5, (22,0), 'msg')
		self.fps_display = text_display.Label(self.message_console, (0,0), None)
		self.generations = text_display.Label(self.message_console, (0,1), None)
		self.rule = text_display.Array2DDisplay(self.message_console, (5,0), None)
		self.rule.associate(cm)

		self.tc_events = events.TCODEventHandler()
		self.events = events.EventHandler()

		tc.sys_set_fps(30)
		self.arr = np.random.random_integers(0,1,(HEIGHT,WIDTH))

	def init(self):
		self.screen.init("test")
		self.border.fill(0,0,64)
		self.border.blit()
		self.message_console.fill(0,0,128)
		self.rule.update()

	def tick(self):
		self.tc_events.tick()
		self.fps_display.set_text('%d', tc.sys_get_fps())
		self.generations.set_text('%d' % gens)
		change(self.arr)
		c = self.arr*255
		tc.console_fill_background(self.console.con, c,c,c)

		self.console.blit()
		self.message_console.blit()
		tc.console_flush()
		if tc.console_is_window_closed():
			reactor.stop()
		else:
			reactor.callLater(0, self.tick)


if __name__ == '__main__':
	app = Application()
	app.init()
	reactor.callWhenRunning(app.tick)
	reactor.run()