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)))