All pastes #69620 Raw Edit

Someone

public text v1 · immutable
#69620 ·published 2006-06-23 05:17 UTC
rendered paste body
COPY = "(c)2006 phil hassey - gpl"
import array, wave, cStringIO, random, base64, math, zlib
import pygame
from pygame.locals import *
MIX_FREQ = 22050
FPS = 40
SW,SH = 640,432
TW,TH = 16,16
WIDTH,HEIGHT = 40,24
TMP,BKGR,WALL,BLOCK,PLAYER,B,SUPER_B,E1,E2,CRAZY_B = -1,0,1,2,3,4,5,6,7,8
POINTS = {B:25,SUPER_B:75,CRAZY_B:125,E1:50,E2:50}
LEVELS = [[3,0,0],[6,0,0],[6,1,0],[6,2,0]]
LEVELS.extend([[6+(v+2)/3,3+(v+1)/3,v/3] for v in xrange(0,95)])

def ft(f,l): return [float(f*v)/MIX_FREQ for v in xrange(0,int(l*MIX_FREQ))]
def t_sin(t): return [math.sin(v*math.pi*2.0) for v in t]
def t_square(t): return [float(1-int((v%1.0)/0.5)*2) for v in t]
def t_rand(t): return [float(random.randrange(-1000,1000))/1000.0 for v in t]
def t_saw(t): return [((v+0.5)%1.0)*2.0-1.0 for v in t]
def t_tri(t): return [abs(((v-0.25)%1.0)-0.5)*4.0-1.0 for v in t]
def sa(si,a,d,s,r):
	a,d,r = int(a*MIX_FREQ),int(d*MIX_FREQ),int(r*MIX_FREQ)
	so,l,n = [],len(si),0.0
	ms = si; so.extend([ms[n]*n/a for n in xrange(0,a)])
	ds = 1.0-s
	ms = ms[a:]; so.extend([ms[n]*(1.0-ds*n/d) for n in xrange(0,d)])
	ms = ms[d:]; so.extend([v*s for v in ms[:len(ms)-r]])
	ms = ms[-r:]; so.extend([ms[n]*s*(r-n)/r for n in xrange(0,r)])
	return so
def ts_fm(t,s,m): return [t[n]+s[n]*m for n in xrange(0,len(t))]
class _sound:
	def set_volume(u,v): pass
	def play(u): pass
def snd_gen_basic(f,l,
		m_wave,m_fmul,m_a,m_d,m_s,m_r,m_level,
		c_wave,c_fmul,c_a,c_d,c_s,c_r,c_level):
	waves = [t_sin,t_square,t_saw,t_tri,t_rand]
	m = sa(waves[m_wave](ft(f*m_fmul,l)),m_a,m_d,m_s,m_r)
	return [v*c_level for v in sa(waves[c_wave](ts_fm(ft(f*c_fmul,l),m,m_level)), c_a,c_d,c_s,c_r)]
def smp_to_snd(so):
	if not pygame.mixer.get_init(): return _sound()
	samples = [int(v*32767) for v in so]
	stream = cStringIO.StringIO()
	f = wave.open(stream,'w')
	f.setnchannels(1)
	f.setsampwidth(2)
	f.setframerate(MIX_FREQ)
	f.writeframes(array.array('h',samples).tostring())
	f.close()
	stream.seek(0)
	return pygame.mixer.Sound(stream)
def txt2freq(n):
	freqs = [440.00,493.92,261.64,293.68,329.64,349.24,392.00]
	let,axe,okt = n.upper()
	freq = freqs[ord(let)-ord('A')]
	if axe == "\x23": freq *= (2**(1.0/12.0))
	freq *= 2**(int(okt)-4)
	return freq
def tune_render(game):
	stream = cStringIO.StringIO()
	f = wave.open(stream,"w")
	f.setnchannels(1)
	f.setsampwidth(2)
	f.setframerate(MIX_FREQ)
	notes = {}
	mul = 32767/4
	chunk = int(0.1*MIX_FREQ)
	so = [0 for n in xrange(0,chunk*4)]
	cnt = 5
	for _p in PATTS:
		game.count(str(cnt))
		cnt -= 1
		for _r in xrange(0,128):
			for _i,_t in _p:
				_n = TDATA[_r][_t]
				if _n != '':
					key = _i,_n
					if key not in notes:
						notes[key] = snd = snd_gen_basic(txt2freq(_n),*INS[_i][1:])
						for n in xrange(0,len(snd)): snd[n] = int(snd[n]*mul)
					snd = notes[key]
					for n in xrange(0,len(snd)): so[n] += snd[n]
			f.writeframes(array.array('h',so[0:chunk]).tostring())
			so = so[chunk:]
			so.extend([0 for n in xrange(0,chunk)])
	f.close()
	stream.seek(0)
	return pygame.mixer.Sound(stream)

TILES_IMG = """iVBORw0KGgoAAAANSUhEUgAAAJAAAAAQCAMAAADOKAZSAAAAkFBMVEUAAQAGCBwdCCAaFgMzCwwWGFAiLwoBOzFqExRbEluSERFYMQe0BwYAXko+ObAVdxeUIJa2CbrcGBcAe2JIRNKBUAKaSAPkAOWqTwAAknZaUP+HbAJUV/8HrA0wki63ZirhS0sE2Q54cv/kQuC9gQfhT+GzmAXlenrhbeBF3ULig+Owsq7Zxyjk1QCU5ZL7/fmXFvauAAACvUlEQVRIx83Wa3OqQAwG4BWwChW5VZFWVESsiHb//787b5JdLy1nysdm2qDjdnjcZEOV+harldput6uVvRb3yIoiVEPDfRm4sPvvGwNaKubYaxEKJgzJY0Hjt/HjHwUpYubZty9lVVVlGQ3xjDrl+wmF7/iqG/1YsFwq8ch1KZjQeCbGs94/iKazlGMWyPuoar9axDBR19V5ntd1DVPX/b7ecEJxCWj8vt+vbyJvpvUOobWIokprAmldloNAjdbn8wm57gPdu0euTx4BYX8Agkj2N9VK6c9PylS1l4pewYNcuvg8xld3lOKi0PrXw/HwajLCz2ll01BOnF7QUxdlxiNVC60HILNHUwZhgwiELSofQShanJ/OTaI4+9Ttl8v1enCPlEmUMKiuGRT3gZ67KLMe7u3QeggkojTd3UsWuKpsv7RuuWRoI9zw1FCDSIbnQKCL5CODzigWAjlJfi+xOV7c20UxUc77/gZar0cM+txJBEHgEai1QU2Un3GzJuGMDeCtuV5Nxg3y5kzWmlf1gL6NoVUmW1PIPqGHnPkbxZyCumiW7nZPoOrm2WxohxqSxJx93iGSLDh/MKixoDjuAX0bQ6uMB2Jm6jbhGWRB3NV3UDANqIfaFt3APxGB/LqpY99JGniohzyq1cI7Im+p55MaIKW1InYv6HEM8RySjuYsp8yA5JRhKBrQdBpMAWIRxSbicx8D4iifM8XicFzglH18yCmLIZL1cS/oxxwSjjlnZg4xaGzHUDqT/QEIx96lYvE8iqLW/f0GTlLX8goTu//Y2/7hXGQ/5hCL5uP7oEYQhz2AYI/KzQaeYaPaJxFKhv3pOfXq3j+SnzwWNBrPH76LJ6KACsalIlCEBtoMe7zS5IypXr7qB0n/mC4KJwiiIOPXPhKfHoJewKLbw9WNQCojd+h/Bk6c3Ob4n4t/ZNtuJJTTDocAAAAASUVORK5CYII="""
FONTIMG = """iVBORw0KGgoAAAANSUhEUgAAAMAAAAAwAQMAAAB9gOddAAAABlBMVEUAAAD///+l2Z/dAAAB5klEQVQ4y53TsW7bMBAA0DNchB0O4ppBcH/BQBYNAtxPSf5AQPdQRYYsRvxLZ2jwQpi/QKNrB3bjQJi9k2JZajwEJQhb5oOOvuMRNsqbXTSHZLaIsO4Q5GcL/BWySzLtO8gzATxt12SREOgC1mI3A/wIeAuyi7x01r7bJYa8Fdj3kHwh8MulAqp8BHtEYjg5DDw18KfGOjj47f4b+uwcb4Zap+ASgyR4OkSpgeMSoFZxgL4kr/FZRa6Ht5aO/dIwJI5OI0iQYXA9OpQxAM0BRoCb8PRWLkfg6HkXB9io+O26+bbMh1QUeLLWvITnyzoErD3VWuOPN/uHKHyEh8KGf8FOYNw86ORd4iptuFBE1wSDiv4QuUorLhTRtSSG1uY1dCqYXWIbt4Ds13zsnZbu4mhXoEdun3tOnggfuE+mANQDfB7MPhkXc4tGTffwTf6ZuNszlfllAnsfAtQa6o5kfhLsLcheUuNaZarzFAwF7iCt+XrVPGE6lg5Q/ijSdJVTUq5FfQYoPXz9PsIKoFjw1bkDqBq4fxz7ZyUv8U1jaCqxy5FgD4WAL8XGs1KRQcMZFsy+vJ7VOyQBniMMofhCSahlq8ZQw+b9Y1MpWLYT4Aj9Y9XcwaKlWYIcSnOCXwDaeUl6mJXkL1K+ideEVtW4AAAAAElFTkSuQmCC"""
HELP = """eNqFkUsOgjAUReddxR3qhCiEmDgsRbqNWhswUUv4GHH1loItKEZGPQ33817BcFSibmqswhilPt/MUQlZrAmAbYCEglH0XxjA0AiRBUoIUtRtqSpns1u0AaWD0No4iAYgFkxUOt5bmoDNGo9OvASk/2tWSIob1KO86JPa/y/DGHM50/wZMLD/ZXonggwqz81W4s2P5WbT5Wafy8UgL0QjC+i7mao5X/0cOMDPYbL8HOBGzSEr8ezc02x/PjGftuDfLWY+/UbrqxIVOt2+uxhR4rtwmvgunL4ARwODxw=="""
INS = [
[32.4,0.18,1,3,0.03,0.0,1.0,0.09,4.7,1,1,0.01,0.12,0.54,0.03,1.0],
[396.9,0.26,3,4,0.09,0.0,1.0,0.0,0.9,0,1,0.01,0.03,0.83,0.12,1.0],
[10.0,0.17,0,4,0.04,0.04,0.1,0.06,10.0,0,1,0.0,0.0,1.0,0.09,1.0],
[828.1,0.45,0,5,0.1,0.0,1.0,0.22,5.6,0,1,0.01,0.08,0.56,0.22,1.0],
[250.0,0.2,2,0.5,0.0,0.0,1.0,0.2,0.8,1,0.5,0.0,0.0,1.0,0.05,0.3],
[48.4,0.2,2,0.5,0.0,0.0,1.0,0.0,0.4,0,0.5,0.02,0.04,0.71,0.08,0.7],
[250.0,0.1,4,1,0.0,0.0,1.0,0.0,9.9,0,1,0.0,0.02,0.14,0.06,0.5],
[250.0,0.1,2,2,0.0,0.0,1.0,0.0,0.8,3,0.5,0.02,0.04,0.7,0.04,0.5],
]
IEXPLODE, IHATCH, ISMASH, ISCREAM = 0,1,2,3
IM,IB,IH,IS = 4,5,6,7
TUNE = """eNrtVbsOwyAM3PkNZpY+Z4OBn+LjC4jQ4LqBsjViQNgKx/lirLPqFqy6BqPucX8E3eYi5EjHVSPRALqnyY0B836MsQRjWYxP9FskyL1DSsZ4jvUY+ZseHxe0ecFAxQBT2/92JqnFcgbjF5/3mrPqnWwxTvYxSHhwgseyGCc3PTE6UWfONjN6ojYgGD+hxw3oIZq/9PSzP/R1grpUvfQf2KJnj+kC6AjgBAlf2HtszBqbZTXLapbVnNZqcMJqRmrTEy+AWg2wmGOrSTxQcmBedLrHtJOSeXoYypOmoochkxKQ5dm7zVO8AFmXnfA="""
TDATA = [[v for v in line.split("|")] for line in zlib.decompress(base64.b64decode(TUNE)).split("\n")]
PATTS = [
	( (IM,0), (IB,1), ),
	( (IM,4), (IB,5), (IH,6), ),
	( (IM,0), (IB,1), (IH,2), (IS,3), ),
	( (IM,4), (IH,6), (IS,7), ),
	( (IH,2), (IS,3), ),
	( (IB,5), (IS,7), ),
	]

def rr(a,b,step=1): return random.randrange(a,b,step)
def rand(): return rr(0,65536)
def sign(v):
	if v < 0: return -1
	if v > 0: return 1
	return 0
class Player:
	def __init__(u,x,y,live):
		u.x,u.y,u.live = x,y,live
		u.frame = 0
class L:
	def __init__(u,game):
		u.g = game
	def init(u):
		layer = u.layer = [[0 for x in xrange(0,WIDTH)] for y in range(0,HEIGHT)]
		beasts = u.beasts = []
		for y in range(0,HEIGHT):
			for x in range(0,WIDTH):
				layer[y][x] = BKGR
				if rand()%40 < 12:
					layer[y][x] = BLOCK
				if rand()%1000 < 8:
					layer[y][x] = WALL
		for x in range(0,WIDTH):
			layer[0][x] = WALL
			layer[HEIGHT-1][x] = WALL
		for y in range(0,HEIGHT):
			layer[y][0] = WALL
			layer[y][WIDTH-1] = WALL
		x,y = WIDTH/2,HEIGHT/2
		for yy in (-1,0,1):
			for xx in (-1,0,1):
				layer[y+yy][x+xx] = TMP
		u.player = Player(x,y,1)
		l = LEVELS[u.g.level_n]
		for i in range(0,l[0]):
			beasts.append(u.add(B))
		for i in range(0,l[1]):
			beasts.append(u.add(SUPER_B))
		for i in range(0,l[2]):
			beasts.append(u.add(E1))
		for y in range(0,HEIGHT):
			for x in range(0,WIDTH):
				if layer[y][x] == TMP:
					layer[y][x] = BKGR
		img = u.g.image
		tiles = u.tiles = []
		for x in xrange(0,img.get_width(),TW):
			tiles.append(img.subsurface(x,0,TW,TH))
		u.frame = 0
		u.first = 1
	def paint(u,z):
		z.fill((0,0,0xaa))
		s = z.subsurface(0,16,TW*WIDTH,TH*HEIGHT)
		layer = u.layer
		tiles = u.tiles
		for y in xrange(0,HEIGHT):
			for x in xrange(0,WIDTH):
				s.blit(tiles[layer[y][x]],(x*TW,y*TH))
		px,py = u.player.x,u.player.y
		for x,y in u.beasts:
			v = layer[y][x]
			if v not in (B,SUPER_B,CRAZY_B): continue
			dx,dy = px-x,py-y
			if abs(dx) > 2*abs(dy): dy = 0
			if abs(dy) > 2*abs(dx): dx = 0
			dx,dy = sign(dx),sign(dy)
			s.fill((255,255,255),(x*TW+4,y*TH+4,2,2))
			s.fill((255,255,255),(x*TW+10,y*TH+4,2,2))
			s.fill((0,0,0),(x*TW+4+dx,y*TH+4+dy,2,2))
			s.fill((0,0,0),(x*TW+10+dx,y*TH+4+dy,2,2))
		if u.player.live:
			s.blit(tiles[PLAYER],(u.player.x*TW,u.player.y*TH))
		fnt = u.g.font
		for y,text in [(0,'score: %05d   --= beast =--   level: %02d'%(max(0,u.g.score),u.g.level_n+1)),(SH-32,"f1 - help  f2 - music  pgup/pgdn - level"),(SH-16," pyweek 64k - "+COPY)]:
			z.blit(u.g.font.render(text),(0,y))
		pygame.display.flip()
		if u.first:
			u.first = 0
			return Pause(u.g,"get ready!",u)
	def add(u,i):
		c = TMP
		while c != BKGR:
			x,y = rr(1,WIDTH),rr(1,HEIGHT)
			c = u.layer[y][x]
		u.layer[y][x] = i
		return x,y
	def event(u,e):
		if e.type is KEYDOWN:
			if e.key in (K_UP,K_DOWN,K_LEFT,K_RIGHT):
				u.player.frame = 0
		if e.type is KEYDOWN and e.key == K_ESCAPE:
			return Prompt(u.g,"quit? y/n",Quit(u.g),u)
	def repaint(u):
		u._paint = 1
	def loop(u):
		if u.player.live == 0:
			u.g.sfx[ISCREAM].play()
			return Prompt(u.g,"try again? y/n",Reset(u.g,u.g.level_n,L(u.g)),Quit(u.g))
		if not len(u.beasts):
			u.g.level_n = min(len(LEVELS)-1,u.g.level_n+1)
			return Pause(u.g,'good job!',L(u.g))
		if u.player.frame%4 == 0:
			u.loop_player()
			u.repaint()
		u.beasts_clean()
		if u.frame%32 == 0:
			u.loop_beasts()
			u.repaint()
		u.beasts_clean()
		u.frame += 1
		u.player.frame += 1
		if (u.frame%120) == 0:
			u.g.score -= 1
	def loop_player(u):
		p = u.player
		x,y = p.x,p.y
		if u.layer[y][x] != BKGR: p.live = 0
		if not p.live: return
		keys = pygame.key.get_pressed()
		dx = -keys[K_LEFT] + keys[K_RIGHT]
		dy = -keys[K_UP] + keys[K_DOWN]
		if (dx,dy) == (0,0): return
		x,y = x+dx,y+dy
		v = u.layer[y][x]
		if v in (WALL,E1,E2):
			return
		elif v in (B,SUPER_B,CRAZY_B):
			p.live = 0
			return
		elif v in (BKGR,):
			p.x,p.y = x,y
			return
		elif v in (BLOCK,):
			if u.push(x,y,dx,dy,1):
				p.x,p.y = x,y
				return
	def move(u,ox,oy,nx,ny):
		v = u.layer[oy][ox]
		u.layer[oy][ox] = BKGR
		u.layer[ny][nx] = v
	def beasts_clean(u):
		while u.beasts.count(None): u.beasts.remove(None)
	def loop_beasts(u):
		layer = u.layer
		beasts = u.beasts
		px,py = u.player.x,u.player.y
		n = 0
		for x,y in beasts[:]:
			ox,oy = x,y
			v = layer[y][x]
			if (x,y) == (px,py): u.player.live = 0
			if v == B:
				if rr(0,2) == 0: dx,dy = rr(-1,2),rr(-1,2)
				else: dx,dy = sign(px-x),sign(py-y)
				x,y = x+dx,y+dy
				if layer[y][x] == BKGR:
					u.move(ox,oy,x,y)
					beasts[n] = x,y
			elif v == SUPER_B:
				if u.is_surrounded(x,y) and (rand()%10) == 0:
					u.g.sfx[IEXPLODE].play()
					beasts[n] = None
					layer[y][x] = BKGR
					for dy in (-1,0,1):
						for dx in (-1,0,1):
							if (dx,dy) != (0,0) and layer[y+dy][x+dx] == BLOCK:
								layer[y+dy][x+dx] = B
								beasts.append((x+dx,y+dy))
				else:
					if rr(0,2) == 0: dx,dy = rr(-1,2),rr(-1,2)
					else: dx,dy = sign(px-x),sign(py-y)
					x,y = x+dx,y+dy
					if layer[y][x] == BKGR:
						u.move(ox,oy,x,y)
						beasts[n] = x,y
			elif v == E1:
				if rand()%15 == 0:
					u.g.sfx[IHATCH].play()
					layer[y][x] = E2
			elif v == E2:
				if rand()%15 == 0:
					u.g.sfx[IHATCH].play()
					layer[y][x] = CRAZY_B
			elif v == CRAZY_B:
				if rr(0,2) == 0: dx,dy = rr(-1,2),rr(-1,2)
				else: dx,dy = sign(px-x),sign(py-y)
				x,y = x+dx,y+dy
				if u.push(x,y,dx,dy):
					u.move(ox,oy,x,y)
					beasts[n] = x,y
			n += 1
	def is_surrounded(u,x,y):
		for dy in (-1,0,1):
			for dx in (-1,0,1):
				if (dx,dy) != (0,0):
					if u.layer[y+dy][x+dx] == BKGR: return 0
		return 1
	def push(u,x,y,dx,dy,m=0):
		if (dx,dy) == (0,0): return 0
		ox,oy = x,y
		layer = u.layer
		beasts = u.beasts
		while layer[y][x] == BLOCK:
			x,y = x+dx,y+dy
		n = layer[y][x]
		if n == WALL: return 0
		elif n in (B,E1,E2,CRAZY_B):
			if layer[y+dy][x+dx] == BKGR: return 0
		elif n == SUPER_B:
			if not u.is_surrounded(x,y): return 0
		layer[oy][ox] = BKGR
		layer[y][x] = BLOCK
		if n in (B,SUPER_B,E1,E2,CRAZY_B):
			u.g.sfx[ISMASH].play()
			layer[y][x] = BLOCK
			u.beasts[u.beasts.index((x,y))] = None
			u.g.score += POINTS[n]*m
		return 1

class ImageFont:
	def __init__(u,image,size,hints):
		x,y = 0,0
		tw,th = u.scale = size
		chars = u.chars = {}
		for c in hints:
			img = image.subsurface(x,y,tw,th)
			chars[c] = img
			x += tw
			if x >= image.get_width(): x,y = 0,y+th
	def render(u,text):
		tw,th = u.scale
		size = len(text)*tw,th
		s = pygame.Surface(size).convert_alpha()
		s.fill((0,0,0,0))
		x = 0
		for c in text:
			if c in u.chars:
				s.blit(u.chars[c],(x,0))
				x += tw
		return s

class Help:
	def __init__(u,game,next):
		u.g,u.next = game,next
	def paint(u,z):
		u.bkgr = z.convert()
		z.fill((0,0,0xaa))
		img = u.g.fnt2.render("help")
		z.blit(img,((SW-img.get_width())/2,4))
		y = 44
		for text in zlib.decompress(base64.b64decode(HELP)).split("\n"):
			img = u.g.font.render(text)
			z.blit(img,(16,y))
			y += 16
		pygame.display.flip()
	def event(u,e):
		if e.type is KEYDOWN and e.key == K_RETURN:
			pygame.display.get_surface().blit(u.bkgr,(0,0))
			return u.next
class Quit:
	def __init__(u,game):
		u.g = game
	def init(u):
		u.g.quit = 1
class Reset:
	def __init__(u,game,level_n,next):
		u.g,u.level_n,u.next = game,level_n,next
	def init(u):
		u.g.level_n = u.level_n
		u.g.score = 0
		return u.next
class Prompt:
	def __init__(u,game,text,yes,no):
		u.g,u.text,u.yes,u.no = game,text,yes,no
	def paint(u,z):
		u.bkgr = z.convert()
		img = u.g.fnt2.render(u.text)
		x,y = (SW-img.get_width())/2,(SH-img.get_height())/2
		z.blit(img,(x,y))
		pygame.display.flip()
	def event(u,e):
		z = pygame.display.get_surface()
		if e.type is KEYDOWN and e.key == K_y:
			z.blit(u.bkgr,(0,0))
			return u.yes
		if e.type is KEYDOWN and e.key == K_n:
			z.blit(u.bkgr,(0,0))
			return u.no
class Pause:
	def __init__(u,game,text,next):
		u.g,u.text,u.next = game,text,next
	def paint(u,z):
		u.bkgr = z.convert()
		img = u.g.fnt2.render(u.text)
		x,y = (SW-img.get_width())/2,(SH-img.get_height())/2
		z.blit(img,(x,y))
		pygame.display.flip()
	def event(u,e):
		if e.type is KEYDOWN and e.key == K_RETURN:
			pygame.display.get_surface().blit(u.bkgr,(0,0))
			return u.next

class Game:
	def fnc(u,f,v=None):
		s = u.state
		if not hasattr(s,f): return 0
		f = getattr(s,f)
		if v != None: r = f(v)
		else: r = f()
		if r != None:
			u.state = r
			u.state._paint = 1
			return 1
		return 0
	def run(u,state,z=None):
		u.quit = 0
		u.state = state
		if z != None: u.z = z
		u.init()
		while not u.quit:
			u.loop()
	def loop(u):
		s = u.state
		if not hasattr(s,'_init') or s._init:
			s._init = 0
			if u.fnc('init'): return
		else:
			if u.fnc('loop'): return
		if not hasattr(s,'_paint') or s._paint:
			s._paint = 0
			if u.fnc('paint',u.z): return
		else:
			if u.fnc('update',u.z): return
		for e in pygame.event.get():
			if not u.event(e):
				if u.fnc('event',e): return
		u.tick()
		return
	def init(u):
		u.full = 0
		u.level_n = 0
		u.score = 0
		u.quit = 0
		u.mute = 0
		z = u.z = pygame.display.set_mode((SW,SH))
		pygame.display.set_caption("beast - alt-enter: full s"+"creen")
		pygame.mouse.set_visible(0)
		try:
			pygame.mixer.init(MIX_FREQ, -16, 0, 128)
		except: pass
		hints = """abcdefghijklmno_pqrstuvwxyz_ABCD0123456789__EFGH:-()!?.<>/\+=__ """
		img = pygame.image.load(cStringIO.StringIO(base64.b64decode(FONTIMG))).convert()
		img2 = pygame.Surface((img.get_width()*16/12,img.get_height()*16/12)).convert()
		for y in xrange(0,img.get_height(),12):
			for x in xrange(0,img.get_width(),12):
				img2.blit(img.subsurface(x,y,12,12),(x*16/12+2,y*16/12+2))
		img = img2
		c = [ (min(255,0xaa+v*16),min(255,0x55+v*12),v*16) for v in xrange(0,16)]
		for y in xrange(1,img.get_height()-1):
			for x in xrange(1,img.get_width()-1):
				ok = 0
				for dx,dy in [(-1,-1),(0,-1),(1,-1),(-1,0),(0,0),(1,0),(-1,1),(0,1),(1,1)]:
					if img.get_at((x+dx,y+dy))[0]: ok = 1
				if ok and img.get_at((x,y))[0]:
					img.set_at((x,y),c[y%16])
				elif ok:
					img.set_at((x,y),(0,0,8))
		img.set_colorkey((0,0,0))
		u.image = pygame.image.load(cStringIO.StringIO(base64.b64decode(TILES_IMG))).convert()
		img.blit(u.image.subsurface(16,0,64,16),(192,16))
		img.blit(u.image.subsurface(80,0,64,16),(192,32))
		u.font = ImageFont(img,(16,16),hints)
		u.fnt2 = ImageFont(pygame.transform.scale(img,(512,128)),(32,32),hints)
		u.fnt3 = ImageFont(pygame.transform.scale(img,(256*6,64*6)),(16*6,16*6),hints)
		u.count('')
		u.sfx = [smp_to_snd(snd_gen_basic(*INS[n])) for n in xrange(0,4)]
		for snd in u.sfx:
			snd.set_volume(0.35)
		pygame.time.wait(0)
		u.nt = pygame.time.get_ticks()
		u.frame = 0
		u.music = None
		if pygame.mixer.get_init():
			u.music = tune_render(u)
			u.music.play(-1)
		u.count('')
		tmp = z.convert()
		m = 60
		for n in xrange(0,m):
			z.blit(pygame.transform.scale(tmp.subsurface(n*SW/2/m,n*SH/2/m,SW-n*SW/m,SH-n*SH/m),(SW,SH)),(0,0))
			pygame.display.flip()
			u.tick()
	def count(u,v):
		z = u.z
		z.fill((0,0,0xaa))
		img = u.fnt3.render("beast")
		z.blit(img,((SW-img.get_width())/2,(SH-img.get_height())/2))
		img = u.fnt3.render(v)
		z.blit(img,((SW-img.get_width())/2,(SH/2+(SH/2-img.get_height())/2)))
		img = u.font.render("please wait...")
		z.blit(img,((SW-img.get_width())/2,SH-img.get_height()-4))
		pygame.display.flip()
	def tick(u):
		ct = pygame.time.get_ticks()
		if ct < u.nt:
			pygame.time.wait(u.nt-ct)
			u.nt+=1000/FPS
		else: u.nt = ct+1000/FPS
		u.frame += 1
	def event(u,e):
		if e.type is QUIT:
			u.quit = 1
			return 1
		if e.type is KEYDOWN and e.key == K_RETURN and (pygame.key.get_mods()&(KMOD_LALT|KMOD_RALT))!=0:
			u.full ^= 1
			tmp = u.z.convert()
			u.z = pygame.display.set_mode((SW,SH),u.full*FULLSCREEN)
			u.z.blit(tmp,(0,0))
			pygame.display.flip()
			return 1
		if e.type is KEYDOWN and e.key == K_F2:
			u.mute ^= 1
			if u.music:
				u.music.set_volume(1-u.mute)
			return 1
		if e.type is KEYDOWN and e.key == K_PAGEUP:
			u.state = Reset(u,min(len(LEVELS)-1,u.level_n + 1),L(u))
			return 1
		if e.type is KEYDOWN and e.key == K_PAGEDOWN:
			u.state = Reset(u,max(0,u.level_n - 1),L(u))
			return 1
		if e.type is KEYDOWN and e.key == K_F1 and u.state.__class__ != Help:
			u.state = Help(u,u.state)
			return 1
g = Game()
g.run(Help(g,L(g)))