/game.py
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);

	# No background anims? No problem!
	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

# Hmm. This is sort of braindead, isn't it?
class Game:
	def __init__(self,song):
		self.song = song

	def run(self):
		print "Playing",self.song
		# IIDX is hardcoded for now
		playgame(config.gametypes['IIDX'], self.song)
		return ['fileselect']