import pygame
import thread
from keygraph import *
from keyfile import *
from bmevent import *
from formats import *
from chanman import *
from keyhandler import *
import config
events = []
evlock = thread.allocate_lock()
evrun = 1
t_orig = 0
def event_thread():
global events,evlock,t_orig
while evrun:
e = pygame.event.wait()
t = pygame.time.get_ticks() - t_orig
evlock.acquire()
events.append((t,e))
evlock.release()
def event_thread_start():
global evrun
evrun = 1
thread.start_new_thread(event_thread,())
def event_thread_stop():
global evrun
evrun = 0
pygame.event.post(pygame.event.Event(pygame.NOEVENT,{}))
def get_events():
global events,evlock
evlock.acquire()
eold = events
events = []
evlock.release()
return eold
def playgame(gameconfig,song):
global t_orig
k = kf_load(song)
dm = eval(gameconfig['format'] + '(k)');
cm = ChannelManager(k);
kh = KeyHandler(gameconfig,k);
if not k.bmps:
print "IT'S PEANUT BUTTER JELLY TIME!"
for x in range(0,8):
k.bmps[x] = pygame.transform.scale(pygame.image.load("gfx/banana%d.png" % x).convert(), (256,256))
lastbeat = k.bmelist[-1].beat
i = 0.0
j = 0
while i < lastbeat:
k.add(BMEvent(i,BME_BGA,None,j))
j = (j+1) % 8
i += 0.25
k.sort()
li = BMEListIter(k.bmelist)
reaper_li = BMEListIter(k.bmelist)
t_finish = k.length() + 5000
t_orig = pygame.time.get_ticks()
try:
if k.offset < 0:
t_orig -= int(k.offset * 1000)
except NameError:
pass
b = b_l = k.eval_beatfunc(t_orig)
event_thread_start()
animpic = None
while 1:
t = pygame.time.get_ticks() - t_orig
b = k.eval_beatfunc(t)
print t,b,b_l
db = b - b_l
b_l = b
li.goto(b)
bmelist = li.window(db)
dm.draw(t + 45, bmelist)
for bme in bmelist:
if bme.type == BME_BGM:
cm.play(bme);
if bme.type == BME_TEMPO:
bpm = bme.dataref
kh.setproperties({'bpm': bme.dataref})
for (t,e) in get_events():
r = kh.handle(e,t)
if r:
(hitbme, properties) = r
if hitbme:
cm.play(hitbme)
dm.setproperties(properties)
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
event_thread_stop()
pygame.mixer.stop()
return False
elif e.key == pygame.K_PRINT:
pygame.image.save(screen,"screenshot.bmp")
reaper_li.goto(b - 2.0)
bmelist = reaper_li.window(1.0, BME_NOTE1 | BME_NOTE2)
for bme in bmelist:
dm.setproperties({'judgement': JUDGE_POOR})
bme.type = BME_HIT
if t > t_finish:
event_thread_stop()
return True
class Game:
def __init__(self,song):
self.song = song
def run(self):
print "Playing",self.song
playgame(config.gametypes['IIDX'], self.song)
return ['fileselect']