3 from pygame.locals import *
4 from constants import *
15 def __init__(self,gameconfig,keyfile):
16 self.keyfile = keyfile
17 self.li = BMEListIter(keyfile.bmelist)
18 self.lastdataref = [0,0,0,0,0,0,0,0]
20 for b in self.li.window(1.0):
21 if b.type == BME_TEMPO:
25 self.keymap = gameconfig['keymap']
26 self.jsbuttonmap = gameconfig['jsbuttonmap']
27 self.jsaxismap = gameconfig['jsaxismap']
28 self.timings = gameconfig['timings']
30 def decodekey(self,event):
32 if event.type == KEYDOWN:
33 return (self.keymap[event.key],1)
34 elif event.type == KEYUP:
35 return (self.keymap[event.key],0)
36 elif event.type == JOYBUTTONDOWN:
37 return (self.jsbuttonmap[event.button],1)
38 elif event.type == JOYBUTTONUP:
39 return (self.jsbuttonmap[event.button],0)
40 elif event.type == JOYAXISMOTION:
41 if event.value == 0.0:
42 return (self.jsaxismap[(event.axis,event.value)],0)
44 return (self.jsaxismap[(event.axis,event.value)],1)
50 def adjust_window(self):
51 self.ms_per_beat = 60000.0 / self.bpm
52 self.tstart = 200.0 / self.ms_per_beat
53 self.tlength = 2000.0 / self.ms_per_beat
55 def setproperties(self,properties):
57 self.bpm = properties['bpm']
62 def handle(self,event,t):
63 b = self.keyfile.eval_beatfunc(t)
65 (k,ud) = self.decodekey(event)
71 return (None, properties)
72 self.li.goto(b - self.tstart)
73 bmelist = filter(lambda x: x.key == k, self.li.window(self.tlength,BME_NOTE1))
75 properties['judgement'] = JUDGE_NA
76 return (BMEvent(b,BME_HIT,k,self.lastdataref[k]), properties)
78 # Find the closest bme to our event
87 sd = sd * self.ms_per_beat
90 for bt in self.timings:
92 properties['judgement'] = bt[1]
95 self.lastdataref[k] = cbme.dataref
97 properties['judgement'] = JUDGE_NA
98 return (BMEvent(b,BME_HIT,k,self.lastdataref[k]),properties)
99 properties['accuracy'] = (b - cbme.beat) * self.ms_per_beat
100 return (cbme, properties)