info@shuvit.org 2 years ago
parent
commit
6974ef5f9f
6 changed files with 1253 additions and 157 deletions
  1. 2
    2
      config.txt
  2. 6
    0
      defender_scores.sco
  3. 35
    3
      lib/FSM.py
  4. 767
    0
      lib/StatesDefender.py
  5. 412
    152
      lib/StatesProg.py
  6. 31
    0
      main.py

+ 2
- 2
config.txt View File

@@ -1,5 +1,5 @@
1
-default_song = phat
2
-theme = red2
1
+default_song = snaps
2
+theme = default
3 3
 title = default
4 4
 bpm = 90
5 5
 volume = 10

+ 6
- 0
defender_scores.sco View File

@@ -0,0 +1,6 @@
1
+name1 = zilla
2
+name2 = robzilla
3
+name3 = zilla
4
+score1 = 1950
5
+score2 = 2050
6
+score3 = 2050

+ 35
- 3
lib/FSM.py View File

@@ -1,6 +1,6 @@
1 1
 
2 2
 import StatesProg
3
-   
3
+import StatesDefender   
4 4
 #====================================
5 5
 class Transition(object):
6 6
     def __init__(self, toState):
@@ -8,7 +8,7 @@ class Transition(object):
8 8
     def Execute(self):
9 9
         pass
10 10
                         
11
-#===================================
11
+#===================================-
12 12
                         
13 13
 class FSM(object):
14 14
     def __init__ (self, character, owner):
@@ -22,6 +22,7 @@ class FSM(object):
22 22
         self.owner = owner
23 23
         self.name = None
24 24
         self.last_state_notes = None
25
+        self.queued_state = None
25 26
         
26 27
     def AddTransition(self, transName, transition):
27 28
         self.transitions[transName] = transition
@@ -88,7 +89,8 @@ class ProgFSM(Char):
88 89
         'Ping', 
89 90
         'Wifi',
90 91
         'Defender',
91
-        'Update'
92
+        'Update',
93
+        'Calculator'
92 94
         ]
93 95
         
94 96
         for s in state_list:
@@ -104,3 +106,33 @@ class ProgFSM(Char):
104 106
 
105 107
 #=================================== 
106 108
         
109
+class DefenderFSM(Char):
110
+    def __init__(self, owner):
111
+        self.FSM = FSM(self, owner)
112
+        self.owner = owner
113
+        
114
+        state_list = [
115
+        'Startup',
116
+        'Intro',
117
+        'Main',
118
+        'BlueFade',
119
+        'GreyFade',
120
+        'GameOver',
121
+        'HighScore',
122
+        'NewHighScore',
123
+        'EnterText'
124
+        ]
125
+        
126
+        for s in state_list:
127
+            self.FSM.AddState(s, getattr(StatesDefender, s)(self.FSM))
128
+            t = 'to' + s
129
+            self.FSM.AddTransition(t, Transition(s))
130
+        
131
+        if self.FSM.curState == None:
132
+            self.FSM.SetState('Startup')
133
+    
134
+    def Execute(self):
135
+        self.FSM.Execute(self.owner)    
136
+
137
+#=================================== 
138
+        

+ 767
- 0
lib/StatesDefender.py View File

@@ -0,0 +1,767 @@
1
+import random
2
+import time
3
+import pygame
4
+import sys
5
+import pyaudio
6
+import wave
7
+import glob
8
+import os
9
+import ast 
10
+from configobj import ConfigObj
11
+from itertools import cycle
12
+
13
+class Game:
14
+	def __init__(self, o):
15
+		self.o = o
16
+		
17
+		self.last_frame_time = time.perf_counter()	
18
+		self.bullets = []
19
+		self.bullet_speed = 80
20
+		self.delta = 0.00001
21
+		self.sidebar_width = 80
22
+		self.gw = o.width - self.sidebar_width
23
+		self.score = 0
24
+		self.time = 0
25
+		self.player = Player(o, self)
26
+		self.enemies = []
27
+		self.birth = pygame.time.get_ticks()
28
+		self.last_enemy_spawn = pygame.time.get_ticks()
29
+		self.enemy_spawn_delay = 2000
30
+		self.explodes = []
31
+		self.explode_speed = 80
32
+		self.hs_name = ""
33
+		self.speed_mult = 1.0
34
+		self.speed_mult_inc = .1
35
+		self.mult_state = 3
36
+		# self.hs_n1 = "billy"
37
+		# self.hs_n2 = "joe"
38
+		# self.hs_n3 = "robzilla"
39
+		# self.hs_s1 = 10
40
+		# self.hs_s2 = 40
41
+		# self.hs_s3 = 100
42
+		self.load_highscore()
43
+		#self.save_highscore()
44
+		self.game_over = False
45
+		
46
+		print('aaay making a game')
47
+
48
+	def update(self):
49
+		self.delta = time.perf_counter() - self.last_frame_time
50
+		self.last_frame_time = time.perf_counter()
51
+		#print(self.delta)
52
+		self.o.draw.rectangle((0, 0, self.o.width, self.o.height), outline=0, fill=self.o.blue)
53
+		#print('playing game ', self.player.posy)
54
+		self.mstime = (pygame.time.get_ticks() - self.birth)
55
+		self.time = int(self.mstime * .001)
56
+		if self.time > self.mult_state:
57
+			self.mult_state += 3
58
+			if self.speed_mult < 2.5:
59
+				self.speed_mult += self.speed_mult_inc
60
+			if self.enemy_spawn_delay > 1000:
61
+				self.enemy_spawn_delay -= 50
62
+			print('....level up ', self.speed_mult)
63
+		#print(self.mstime % 100.0)
64
+		#if self.mstime % 100.0 == 0:
65
+			#print('up level')
66
+			#self.speed_mult += self.speed_mult_inc
67
+		self.enemy_spawner()
68
+		self.draw_bullets()
69
+		self.draw_enemies()
70
+		self.draw_explodes()
71
+		self.player.update(self.delta)
72
+		self.draw_sidebar()
73
+		self.o.update_display(self.o)
74
+
75
+	def draw_bullets(self):
76
+		for x in self.bullets:
77
+			x.check_collision()
78
+			x.update()
79
+			x.draw()
80
+
81
+	def draw_enemies(self):
82
+		for x in self.enemies:
83
+			x.check_collision()
84
+			x.update()
85
+			x.draw()
86
+
87
+	def draw_explodes(self):
88
+		for x in self.explodes:
89
+			#x.check_collision()
90
+			x.update()
91
+			x.draw()
92
+
93
+	def draw_sidebar(self):
94
+		w = self.o.width - self.sidebar_width
95
+		self.o.draw.rectangle((w, 0, self.o.width, self.o.height), outline=0, fill=self.o.light_grey)
96
+		inc = 40
97
+		h = 10
98
+		self.o.center_block("Score", self.o.h2, [w, h, self.o.width, h + 10], self.o.blue)
99
+		h += inc
100
+		self.o.center_block(str(self.score), self.o.h2, [w, 15, self.o.width, h + 10], self.o.blue)
101
+		h += (inc * 2)
102
+		self.o.center_block("Time", self.o.h2, [w, 30, self.o.width, h + 10], self.o.blue)
103
+		h += inc
104
+		self.o.center_block(str(self.time), self.o.h2, [w, 40, self.o.width, h + 10], self.o.blue)
105
+
106
+	def enemy_spawner(self):
107
+		sl = pygame.time.get_ticks() - self.last_enemy_spawn
108
+		if len(self.enemies) < 1 or sl > self.enemy_spawn_delay:
109
+			new_e = Enemy(self.o, self)
110
+			self.enemies.append(new_e)
111
+			self.last_enemy_spawn = pygame.time.get_ticks()
112
+
113
+
114
+	def save_highscore(self):
115
+		base_dir = "/home/pi/zpc_ct/"
116
+		title = "defender_scores"
117
+		fname = base_dir + title + '.sco'
118
+		if os.path.exists(fname):
119
+			os.utime(fname, None)
120
+			print(fname, ' exists')
121
+		else:
122
+			print('make a damn file ', fname)
123
+			open(fname, 'a').close()			
124
+
125
+		self.sconf = ConfigObj(fname)
126
+		self.sconf['name1'] = self.hs_n1
127
+		self.sconf['name2'] = self.hs_n2
128
+		self.sconf['name3'] = self.hs_n3
129
+		self.sconf['score1'] = self.hs_s1
130
+		self.sconf['score2'] = self.hs_s2
131
+		self.sconf['score3'] = self.hs_s3
132
+		
133
+		self.sconf.write()
134
+
135
+	def load_highscore(self):
136
+		base_dir = "/home/pi/zpc_ct/"
137
+		self.sconf = ConfigObj(base_dir + 'defender_scores.sco')
138
+		self.hs_n1 = self.sconf['name1']
139
+		self.hs_n2 = self.sconf['name2']
140
+		self.hs_n3 = self.sconf['name3']
141
+		self.hs_s1 = self.sconf.as_int('score1')
142
+		self.hs_s2 = self.sconf.as_int('score2')
143
+		self.hs_s3 = self.sconf.as_int('score3')
144
+		
145
+
146
+class Player:
147
+	def __init__(self, o, game):
148
+		self.o = o
149
+		self.game = game
150
+		self.width = 28
151
+		self.height = 12
152
+		self.speed = 80
153
+		self.posx = game.gw / 2
154
+		self.posy = o.height - self.height
155
+		
156
+
157
+	def update(self, delta):
158
+		self.check_keys(delta)
159
+		self.draw_player()
160
+		#check position
161
+		#pass
162
+	def draw_player(self):
163
+		hw = self.width / 2
164
+		hh = self.height / 2
165
+		self.o.draw.rectangle(((self.posx - hw), (self.posy - hh), (self.posx + hw), (self.posy + hh)), outline=self.o.light_grey, fill=self.o.light_grey)
166
+		self.o.draw.rectangle(((self.posx - (hw/4)), (self.posy - self.height), (self.posx + (hw/4)), (self.posy + hh)), outline=self.o.light_grey, fill=self.o.light_grey)
167
+
168
+
169
+	def check_keys(self, delta):
170
+		if self.o.keyState[0] == 2:
171
+			if self.posx > 0:
172
+				self.posx -= self.speed * delta
173
+		elif self.o.keyState[3] == 2:
174
+			if self.posx < self.o.width:
175
+				self.posx += self.speed * delta
176
+
177
+		elif self.o.keyState[1] == 1 or self.o.keyState[2] == 1:
178
+			self.game.bullets.append(Bullet(self.o, self.game, self.posx))
179
+
180
+class Bullet:
181
+	def __init__(self, o, game, x):
182
+		self.o = o
183
+		self.game = game
184
+		self.posx = x
185
+		self.posy = 110
186
+		self.width = 3
187
+		self.height = 10
188
+
189
+	def draw(self):
190
+		hw = self.width / 2
191
+		hh = self.height / 2
192
+		self.o.draw.rectangle(((self.posx - hw), (self.posy - hh), (self.posx + hw), (self.posy + hh)), outline=0, fill=self.o.light_grey)		
193
+
194
+	def update(self):
195
+		self.posy -= self.game.bullet_speed * self.game.delta
196
+		if self.posy < 0:
197
+			self.game.bullets.remove(self)
198
+			#print('killing bullet ', len(self.game.bullets))
199
+		self.draw()
200
+
201
+	def check_collision(self):
202
+		pass
203
+
204
+class Enemy:
205
+	def __init__(self, o, game):
206
+		self.o = o
207
+		self.game = game
208
+		self.posx = game.gw / 2
209
+		self.posy = -20
210
+		self.width = 20
211
+		self.height = 15
212
+		self.speed = random.randrange(15, 30) * game.speed_mult
213
+		self.xspeed = random.randrange(0, 30) * game.speed_mult
214
+		self.point_value = 50
215
+
216
+		self.ydir = random.choice([-1, 1])
217
+
218
+	def draw(self):
219
+			hw = self.width / 2
220
+			hh = self.height / 2
221
+			self.o.draw.rectangle(((self.posx - hw), (self.posy - hh), (self.posx + hw), (self.posy + hh)), outline=self.o.light_grey, fill=self.o.light_grey)		
222
+			self.o.draw.rectangle(((self.posx - hw + 5), (self.posy - hh + 10), (self.posx + hw - 5), (self.posy + hh)), outline=self.o.blue, fill=self.o.blue)		
223
+			#eyes
224
+			# self.o.draw.rectangle(((self.posx - 8), (self.posy - 5), (self.posx - 5), (self.posy - 3)), outline=self.o.blue, fill=self.o.blue)		
225
+			# self.o.draw.rectangle(((self.posx + 8), (self.posy - 5), (self.posx + 5), (self.posy - 3)), outline=self.o.blue, fill=self.o.blue)		
226
+
227
+			self.o.draw.rectangle(((self.posx - 8), (self.posy - 4), (self.posx - 2), (self.posy - 3)), outline=self.o.blue, fill=self.o.blue)		
228
+			self.o.draw.rectangle(((self.posx + 8), (self.posy - 4), (self.posx + 2), (self.posy - 3)), outline=self.o.blue, fill=self.o.blue)		
229
+
230
+	def update(self):
231
+		self.posy += self.speed * self.game.delta
232
+		self.posx += (self.xspeed * self.ydir * self.game.delta)
233
+		self.check_collision()
234
+
235
+		if self.posy > self.o.height:
236
+			self.game.enemies.remove(self)
237
+			#print('killing enemy ', len(self.game.enemies))
238
+			self.game.game_over = True
239
+
240
+		if self.posx > (self.game.gw - (self.width / 2)):
241
+			self.ydir = -1
242
+		elif self.posx < (0 + (self.width / 2)):
243
+			self.ydir = 1
244
+
245
+		self.draw()
246
+
247
+	def check_collision(self):
248
+
249
+		for b in self.game.bullets:
250
+			xdist = abs(b.posx - self.posx)
251
+
252
+			if xdist < self.width / 2:
253
+				ydist = abs(b.posy - self.posy)
254
+				if ydist < self.height / 2:
255
+					#print('hit ', xdist)
256
+					self.game.score += self.point_value
257
+					if b in self.game.bullets:
258
+						self.game.bullets.remove(b)
259
+					self.die()
260
+				#else:
261
+					#print('no y hit ', ydist)
262
+			#else:
263
+				#print('no x hit ', xdist)
264
+
265
+	def die(self):
266
+		if self in self.game.enemies:
267
+			self.game.enemies.remove(self)
268
+			#print('enemy shot ', len(self.game.enemies))
269
+			self.game.explodes.append(Explode(self.o, self.game, self.posx, self.posy))
270
+
271
+class Explode:
272
+	def __init__(self, o, game, x, y):
273
+		self.o = o
274
+		self.game = game
275
+		self.posx = x
276
+		self.posy = y
277
+		self.width = 16
278
+		self.height = 14
279
+		self.gap = 5
280
+		self.scale_speed = 80
281
+
282
+	def draw(self):
283
+		hw = self.width / 2
284
+		hh = self.height / 2
285
+		c1 = [self.posx + self.gap, self.posy - self.gap]
286
+		c2 = [self.posx - self.gap, self.posy - self.gap]
287
+		c3 = [self.posx + self.gap, self.posy + self.gap]
288
+		c4 = [self.posx - self.gap, self.posy + self.gap]
289
+		
290
+		self.o.draw.rectangle(((c1[0] - hw), (c1[1] - hh), (c1[0] + hw), (c1[1] + hh)), outline=0, fill=self.o.light_grey)		
291
+		self.o.draw.rectangle(((c2[0] - hw), (c2[1] - hh), (c2[0] + hw), (c2[1] + hh)), outline=0, fill=self.o.light_grey)		
292
+		self.o.draw.rectangle(((c3[0] - hw), (c3[1] - hh), (c3[0] + hw), (c3[1] + hh)), outline=0, fill=self.o.light_grey)		
293
+		self.o.draw.rectangle(((c4[0] - hw), (c4[1] - hh), (c4[0] + hw), (c4[1] + hh)), outline=0, fill=self.o.light_grey)		
294
+
295
+	def update(self):
296
+		#self.posy -= self.game.bullet_speed * self.game.delta
297
+		self.gap += self.game.explode_speed * self.game.delta
298
+		self.width -= self.scale_speed * self.game.delta
299
+		self.height -= self.scale_speed * self.game.delta
300
+		if self.gap > 20:
301
+			self.game.explodes.remove(self)
302
+			print('killing explosion ', len(self.game.explodes))
303
+		self.draw()
304
+
305
+	def check_collision(self):
306
+		pass
307
+
308
+#====================================     
309
+
310
+State = type("State", (object,), {})
311
+#====================================     
312
+class State(object):
313
+	def __init__(self, FSM):
314
+		self.FSM = FSM
315
+		self.timer = 0
316
+		self.startTime = 0
317
+	def Enter(self):
318
+		self.timer = 0
319
+		self.startTime = 0
320
+	def Execute(self):
321
+		print('Executing')
322
+	def Exit(self):
323
+		print('Exiting')
324
+
325
+#==================================== 
326
+
327
+class Example(State):
328
+	def __init__(self,FSM):
329
+		super(Example, self).__init__(FSM)    
330
+		
331
+	def Enter(self):
332
+		self.FSM.stateLife = 1
333
+		super(Example, self).Enter()        
334
+		
335
+	def Execute(self):
336
+		self.FSM.stateLife += 1
337
+		
338
+	def Exit(self):
339
+		pass
340
+
341
+#==================================== 
342
+
343
+class Startup(State):
344
+	def __init__(self,FSM):
345
+		super(Startup, self).__init__(FSM)    
346
+		
347
+	def Enter(self):
348
+		self.FSM.stateLife = 1
349
+		self.birth = time.perf_counter()
350
+		super(Startup, self).Enter()        
351
+		
352
+	def Execute(self):
353
+		print('defender startup state')
354
+		self.FSM.ToTransition('toIntro')
355
+		
356
+	def Exit(self):
357
+		pass
358
+
359
+#==================================== 
360
+			
361
+class Intro(State):
362
+	def __init__(self,FSM):
363
+		super(Intro, self).__init__(FSM)    
364
+		
365
+	def Enter(self):
366
+		self.birth = time.perf_counter()
367
+		o = self.FSM.owner 
368
+		o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
369
+		o.center_block("Welcome To Defender", o.h2, [0, 0, o.width, o.height], o.light_grey)
370
+		o.update_display(0)
371
+		super(Intro, self).Enter()        
372
+		
373
+	def Execute(self):
374
+		#print('doing defender intro ', (time.perf_counter() - self.birth))
375
+		if (time.perf_counter() - self.birth) > 2:
376
+			print('time is up')
377
+			self.FSM.queued_state = "toMain"
378
+			self.FSM.ToTransition('toBlueFade')
379
+			#self.FSM.ToTransition('toMain')
380
+
381
+	def Exit(self):
382
+		pass
383
+
384
+#==================================== 
385
+
386
+#==================================== 
387
+			
388
+class Main(State):
389
+	def __init__(self,FSM):
390
+		super(Main, self).__init__(FSM)    
391
+		
392
+	def Enter(self):
393
+		print('hello defender main')
394
+		o = self.FSM.owner 
395
+		o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
396
+		o.update_display(0)
397
+		self.game = Game(o)
398
+		o.game = self.game
399
+
400
+		super(Main, self).Enter()        
401
+		
402
+	def Execute(self):
403
+		self.game.update()
404
+		if self.game.game_over:
405
+			
406
+			self.FSM.queued_state = "toGameOver"
407
+			self.FSM.ToTransition('toBlueFade')
408
+
409
+	def Exit(self):
410
+		pass
411
+
412
+#==================================== 
413
+
414
+class BlueFade(State):
415
+	def __init__(self,FSM):
416
+		super(BlueFade, self).__init__(FSM)    
417
+		
418
+	def Enter(self):
419
+		self.FSM.stateLife = 1
420
+		self.birth = pygame.time.get_ticks()
421
+		self.last_frame_time = time.perf_counter()	
422
+		self.o = self.FSM.owner 
423
+		self.x = self.o.width / 2
424
+		self.y = self.o.height / 2
425
+		self.xsize = 0.0
426
+		self.ysize = 0.0
427
+
428
+		super(BlueFade, self).Enter()        
429
+		
430
+	def Execute(self):
431
+		self.FSM.stateLife += 1
432
+		self.delta = time.perf_counter() - self.last_frame_time
433
+		self.last_frame_time = time.perf_counter()
434
+
435
+
436
+		self.o.draw.rectangle((self.x - self.xsize, self.y - self.ysize, self.x + self.xsize, self.y + self.ysize), outline=self.o.blue, fill=self.o.blue)
437
+		self.o.update_display(self.o)
438
+		self.xsize += self.delta * 150
439
+		self.ysize += self.delta * 125
440
+		if (pygame.time.get_ticks() - self.birth > 1000):
441
+
442
+			print('get outta fade')
443
+			if self.FSM.queued_state != None:
444
+				ns = self.FSM.queued_state 
445
+				self.FSM.queued_state = None
446
+				self.FSM.ToTransition(ns)	
447
+	def Exit(self):
448
+		pass
449
+
450
+#==================================== 
451
+
452
+
453
+class GreyFade(State):
454
+	def __init__(self,FSM):
455
+		super(GreyFade, self).__init__(FSM)    
456
+		
457
+	def Enter(self):
458
+		self.FSM.stateLife = 1
459
+		self.birth = pygame.time.get_ticks()
460
+		self.last_frame_time = time.perf_counter()	
461
+		self.o = self.FSM.owner 
462
+		self.x = self.o.width / 2
463
+		self.y = self.o.height / 2
464
+		self.xsize = 0.0
465
+		self.ysize = 0.0
466
+
467
+		super(GreyFade, self).Enter()        
468
+		
469
+	def Execute(self):
470
+		self.FSM.stateLife += 1
471
+		self.delta = time.perf_counter() - self.last_frame_time
472
+		self.last_frame_time = time.perf_counter()
473
+
474
+
475
+		self.o.draw.rectangle((self.x - self.xsize, self.y - self.ysize, self.x + self.xsize, self.y + self.ysize), outline=self.o.light_grey, fill=self.o.light_grey)
476
+		self.o.update_display(self.o)
477
+		self.xsize += self.delta * 150
478
+		self.ysize += self.delta * 125
479
+		if (pygame.time.get_ticks() - self.birth > 1000):
480
+
481
+			print('get outta fade')
482
+			if self.FSM.queued_state != None:
483
+				ns = self.FSM.queued_state 
484
+				self.FSM.queued_state = "toMain"
485
+				self.FSM.ToTransition(ns)
486
+		
487
+	def Exit(self):
488
+		pass
489
+
490
+#==================================== 
491
+
492
+class GameOver(State):
493
+	def __init__(self,FSM):
494
+		super(GameOver, self).__init__(FSM)    
495
+		
496
+	def Enter(self):
497
+		self.FSM.stateLife = 1
498
+		self.o = self.FSM.owner 
499
+		self.birth = pygame.time.get_ticks()
500
+
501
+		self.o.draw.rectangle((0, 0, self.o.width, self.o.height), outline=0, fill=self.o.blue)
502
+		self.o.center_block("Game Over", self.o.h2, [0, 0, self.o.width, self.o.height], self.o.light_grey)
503
+		self.o.center_block("Score: " + str(self.o.game.score), self.o.h2, [0, 20, self.o.width, self.o.height + 20], self.o.light_grey)
504
+		self.o.update_display(0)
505
+
506
+		super(GameOver, self).Enter()        
507
+		
508
+	def Execute(self):
509
+		#self.FSM.stateLife += 1
510
+		if self.o.keyState[0] == 1:
511
+			#self.FSM.ToTransition("toMain")
512
+			self.FSM.queued_state = "toMain"
513
+			self.FSM.ToTransition('toBlueFade')
514
+
515
+		if (pygame.time.get_ticks() - self.birth) > 3000:
516
+			if self.o.game.score > self.o.game.hs_s1:
517
+				print('this is a new high score')
518
+				self.FSM.queued_state = "toNewHighScore"
519
+			else:
520
+				print('not a new high score')				
521
+			
522
+				self.FSM.queued_state = "toHighScore"
523
+			self.FSM.ToTransition('toBlueFade')
524
+
525
+
526
+	def Exit(self):
527
+		pass
528
+
529
+#==================================== 
530
+
531
+
532
+class HighScore(State):
533
+	def __init__(self,FSM):
534
+		super(HighScore, self).__init__(FSM)    
535
+		
536
+	def Enter(self):
537
+		#self.FSM.stateLife = 1
538
+		self.o = self.FSM.owner 
539
+
540
+
541
+		self.o.draw.rectangle((0, 0, self.o.width, self.o.height), outline=0, fill=self.o.blue)
542
+		self.o.center_text("HIGH SCORES", self.o.h1, self.o.width, 25, self.o.light_grey)
543
+		self.o.center_text("----------------------", self.o.h2, self.o.width, 55, self.o.light_grey)
544
+
545
+
546
+		#self.o.draw.rectangle((0, 0, self.o.width, self.o.height), outline=0, fill=self.o.blue)
547
+		self.o.center_block(self.o.game.hs_n3 + ': ' + str(self.o.game.hs_s3), self.o.h2, [0, -20, self.o.width, self.o.height-20], self.o.light_grey)
548
+		self.o.center_block(self.o.game.hs_n2 + ': ' + str(self.o.game.hs_s2), self.o.h2, [0, 0, self.o.width, self.o.height], self.o.light_grey)
549
+		self.o.center_block(self.o.game.hs_n1 + ': ' + str(self.o.game.hs_s1), self.o.h2, [0, 20, self.o.width, self.o.height+20], self.o.light_grey)
550
+		self.o.center_block("restart", self.o.h2, [0, 50, self.o.width, self.o.height + 50], self.o.light_grey)
551
+		self.o.update_display(0)
552
+
553
+
554
+		super(HighScore, self).Enter()        
555
+		
556
+	def Execute(self):
557
+		#self.FSM.stateLife += 1
558
+		if self.o.keyState[0] == 1:
559
+			#self.FSM.ToTransition("toMain")
560
+			self.FSM.queued_state = "toMain"
561
+			self.FSM.ToTransition('toBlueFade')
562
+
563
+		
564
+	def Exit(self):
565
+		pass
566
+
567
+#==================================== 
568
+
569
+#==================================== 
570
+			
571
+class NewHighScore(State):
572
+	def __init__(self,FSM):
573
+		super(NewHighScore, self).__init__(FSM)    
574
+		
575
+	def Enter(self):
576
+		self.birth = time.perf_counter()
577
+		o = self.FSM.owner 
578
+		o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
579
+		o.center_block("NEW HIGH SCORE!", o.h2, [0, 0, o.width, o.height], o.light_grey)
580
+		o.update_display(0)
581
+		super(NewHighScore, self).Enter()        
582
+		
583
+	def Execute(self):
584
+		#print('doing defender intro ', (time.perf_counter() - self.birth))
585
+		if (time.perf_counter() - self.birth) > 2:
586
+			print('time is up')
587
+			self.FSM.queued_state = "toEnterText"
588
+			self.FSM.ToTransition('toBlueFade')
589
+			#self.FSM.ToTransition('toMain')
590
+
591
+	def Exit(self):
592
+		pass
593
+
594
+#==================================== 
595
+class EnterText(State):
596
+	def __init__(self,FSM):
597
+		super(EnterText, self).__init__(FSM)    
598
+		
599
+	def Enter(self):
600
+		o = self.FSM.owner 
601
+	
602
+		self.input_string = ""
603
+		
604
+		self.last_action = pygame.time.get_ticks()
605
+		self.caps = False
606
+		self.cur_but = 18
607
+		self.cur_letter = ""
608
+
609
+		self.skips = [7, 3, 11, 12, 13, 14, 15]
610
+		
611
+		self.lc_labels = [["p", "q", "r", "s"], ["t", "u", "v"], ["w", "x", "y", "z"], ["C", "A", "P", "S"], 
612
+				["g", "h", "i"], ["j", "k", "l"], ["m", "n", "o"], ["D", "E", "L"],
613
+				["_", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-"], ["a", "b", "c"], ["d", "e", "f"], ["O", "K"],
614
+				[], [], [], []]
615
+
616
+		self.uc_labels = [["P", "Q", "R", "S"], ["T", "U", "V"], ["W", "X", "Y", "Z"], ["C", "A", "P", "S"], 
617
+				["G", "H", "I"], ["J", "K", "L"], ["M", "N", "O"], ["D", "E", "L"],
618
+				["_", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-"], ["A", "B", "C"], ["D", "E", "F"], ["O", "K"],
619
+				[], [], [], []]
620
+
621
+		self.labels = self.lc_labels
622
+
623
+		#self.songCycle = cycle(self.song)
624
+		#self.curPattern = next(self.songCycle)
625
+
626
+		self.cycles = []
627
+		for l in self.labels:
628
+			self.cycles.append(cycle(l))
629
+
630
+
631
+
632
+		self.draw(o)
633
+		o.update_display(0)
634
+		super(EnterText, self).Enter()        
635
+		
636
+	def Execute(self):
637
+		o = self.FSM.owner 
638
+		y_size = o.height / 4
639
+		if o.keyState[11] == 1:
640
+			if self.input_string != 'blank':
641
+				o.game.hs_name = self.input_string
642
+				#o.bpm = o.sconf['bpm']
643
+				#o.sconf['title'] = self.input_string
644
+				
645
+
646
+				if o.game.score > o.game.hs_s3:
647
+					print('new first')
648
+					o.game.hs_s1 = o.game.hs_s2
649
+					o.game.hs_n1 = o.game.hs_n2
650
+					o.game.hs_s2 = o.game.hs_s3
651
+					o.game.hs_n2 = o.game.hs_n3
652
+					o.game.hs_s3 = o.game.score
653
+					o.game.hs_n3 = o.game.hs_name
654
+
655
+				elif o.game.score > o.game.hs_s2:
656
+					print('new second')
657
+					o.game.hs_s1 = o.game.hs_s2
658
+					o.game.hs_n1 = o.game.hs_n2
659
+					o.game.hs_s2 = o.game.score
660
+					o.game.hs_n2 = o.game.hs_name
661
+				else:
662
+					print('new third')
663
+					o.game.hs_s1 = o.game.score
664
+					o.game.hs_n1 = o.game.hs_name
665
+
666
+				print('new high score saving')
667
+				#o.save_song()
668
+				self.FSM.queued_state = 'toHighScore'		
669
+				self.FSM.ToTransition('toBlueFade')		
670
+				o.game.save_highscore()
671
+
672
+
673
+
674
+		if o.keyState[16] > 0 and o.keyState[17] > 0:
675
+			pass
676
+		else:
677
+			_iter = 0
678
+			for k in o.keyState:
679
+				if k == 1:
680
+					cur_time = pygame.time.get_ticks()
681
+					print(cur_time - self.last_action)
682
+					
683
+					#print('cur letter ', next(self.cycles[_iter]))
684
+					if _iter not in self.skips:
685
+						self.last_action = cur_time
686
+						self.cur_letter = next(self.cycles[_iter])
687
+						self.cur_but = _iter
688
+						self.draw(o)
689
+						o.center_block(self.input_string + self.cur_letter, o.h2, [0, 0, o.width, y_size], o.light_grey)
690
+
691
+					if _iter == 7:
692
+						
693
+						self.input_string = self.input_string[:-1]
694
+						#self.input_string = self.input_string.rstrip(self.input_string[-1])
695
+						print('deleting')
696
+						self.last_action = 100000000
697
+						self.draw(o)
698
+						o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
699
+
700
+					elif _iter == 3:
701
+						print('caps')
702
+						if self.caps:
703
+							self.caps = False
704
+							self.labels = self.lc_labels
705
+
706
+						else:
707
+							self.caps = True
708
+							self.labels = self.uc_labels
709
+						self.draw(o)
710
+						o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
711
+						self.cycles = []
712
+						for l in self.labels:
713
+							self.cycles.append(cycle(l))
714
+
715
+					o.update_display(0)
716
+				_iter += 1
717
+
718
+		cur_time = pygame.time.get_ticks()
719
+		delay = cur_time - self.last_action
720
+		if delay > 1000 and delay < 100000:
721
+			self.input_string += self.cur_letter
722
+			self.last_action = 100000000
723
+			self.reset_cycles()
724
+			self.draw(o)
725
+
726
+			o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
727
+			o.update_display(0)
728
+
729
+	def draw(self, o):
730
+		x_size = o.width / 4
731
+		y_size = o.height / 4
732
+		og_x = 0
733
+		o_x = og_x
734
+		o_y = o.height
735
+		text_padding = 6
736
+		
737
+		_id = 0
738
+		while _id < 16:
739
+			lab = ""
740
+			for i in self.labels[_id]:
741
+				lab += i
742
+
743
+			if _id == 8:
744
+				lab = "_12"
745
+
746
+			o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
747
+			o.center_block(lab, o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
748
+
749
+			o_x = o_x + x_size
750
+			_id += 1
751
+			if _id % 4 == 0:
752
+				o_y -= y_size
753
+				o_x = og_x
754
+		o.draw.rectangle((0, 0, o.width, y_size), outline=0, fill=o.blue)
755
+		
756
+	def reset_cycles(self):
757
+		self.cycles = []
758
+		for l in self.labels:
759
+			self.cycles.append(cycle(l))
760
+
761
+	def Exit(self):
762
+		pass
763
+
764
+#==================================== 
765
+
766
+def timer_event():
767
+	print('timer event level upsssssssssssssssssssssssssss')

+ 412
- 152
lib/StatesProg.py View File

@@ -15,6 +15,7 @@ import random
15 15
 from pathlib import Path
16 16
 import socket
17 17
 import git 
18
+import FSM
18 19
 
19 20
 #====================================     
20 21
 
@@ -183,15 +184,15 @@ def draw_menu1(o):
183 184
 			o.center_block("Vol-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
184 185
 		if _id == 9:
185 186
 			o.center_block("Vol+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
186
-		if _id == 11:
187
-			o.center_block("", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
187
+		#if _id == 11:
188
+			#o.center_block("", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
188 189
 		if _id == 12:
189 190
 			o.center_block("Play", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
190 191
 		if _id == 13:
191 192
 			o.center_block("Stop", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
192
-		if _id == 14:
193
+		if _id == 10:
193 194
 			o.center_block("BPM-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
194
-		if _id == 15:
195
+		if _id == 11:
195 196
 			o.center_block("BPM+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
196 197
 			
197 198
 
@@ -225,17 +226,17 @@ def draw_menu2_sample(o):
225 226
 		if _id == 3:
226 227
 			o.center_block("Load", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
227 228
 
228
-		if _id == 4:
229
+		if _id == 8:
229 230
 			o.center_block("Vol-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
230
-		if _id == 5:
231
+		if _id == 9:
231 232
 			o.center_block("Vol+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
232 233
 		if _id == 6:
233 234
 			o.center_block("Bank-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
234 235
 		if _id == 7:
235 236
 			o.center_block("Bank+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
236
-		if _id == 8:
237
+		if _id == 10:
237 238
 			o.center_block("Pitch-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
238
-		if _id == 9:
239
+		if _id == 11:
239 240
 			o.center_block("Pitch+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
240 241
 
241 242
 
@@ -298,9 +299,9 @@ def draw_menu2_note(o):
298 299
 	   
299 300
 		o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
300 301
 
301
-		if _id == 0:
302
+		if _id == 8:
302 303
 			o.center_block("Vol -", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
303
-		elif _id == 1:
304
+		elif _id == 9:
304 305
 			o.center_block("Vol +", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
305 306
 		elif _id == 12:
306 307
 			if o.patternFollow:
@@ -341,7 +342,18 @@ def draw_menu2_song(o):
341 342
 
342 343
 
343 344
 def menu1_actions(self, o):
345
+	if o.keyState[8] == 4 or o.keyState[8] == 3:
346
+		print('reset repeat from menu')
347
+		o.button_repeater(1,[])
348
+
349
+	if o.keyState[9] == 4 or o.keyState[9] == 3:
350
+		print('reset repeat from menu')
351
+		o.button_repeater(1,[])
352
+
344 353
 	if o.keyState[16] == 2:
354
+		#print('key 8 ', o.keyState[8])
355
+		#o.button_repeater(0, [8,9,14,15])
356
+
345 357
 		if o.keyState[0] == 1:
346 358
 			self.FSM.ToTransition('toMain')
347 359
 		elif o.keyState[1] == 1:
@@ -359,18 +371,32 @@ def menu1_actions(self, o):
359 371
 			play_seq(o, [o.curPattern, 0])
360 372
 		if o.keyState[13] == 1:
361 373
 			o.stop_playback()
362
-		# if o.keyState[6] == 1:
363
-		# 	if o.note_bank > 0:
364
-		# 		o.note_bank -= 1
365
-		# if o.keyState[7] == 1:
366
-		# 	if o.note_bank < 3:
367
-		# 		o.note_bank += 1
374
+
375
+		if o.keyState[8] == 2:
376
+			if (o.repeater_states[8] != None and ((pygame.time.get_ticks() - o.repeater_states[8]) > 500)):
377
+				if o.volume > 0:
378
+					o.volume -= 1
379
+					text_center(o, "Master Volume", str(o.volume))
380
+					o.update_display(0)	
381
+				o.repeater_states[8] = pygame.time.get_ticks()
382
+
368 383
 		if o.keyState[8] == 1:
384
+			o.repeater_states[8] = pygame.time.get_ticks()
369 385
 			if o.volume > 0:
370 386
 				o.volume -= 1
371 387
 				text_center(o, "Master Volume", str(o.volume))
372 388
 				o.update_display(0)
389
+
390
+		if o.keyState[9] == 2:
391
+			if (o.repeater_states[9] != None and ((pygame.time.get_ticks() - o.repeater_states[9]) > 500)):
392
+				if o.volume < 16:
393
+					o.volume += 1
394
+					text_center(o, "Master Volume", str(o.volume))
395
+					o.update_display(0)
396
+				o.repeater_states[9] = pygame.time.get_ticks()
397
+
373 398
 		if o.keyState[9] == 1:
399
+			o.repeater_states[9] = pygame.time.get_ticks()
374 400
 			if o.volume < 16:
375 401
 				o.volume += 1
376 402
 				text_center(o, "Master Volume", str(o.volume))
@@ -378,13 +404,35 @@ def menu1_actions(self, o):
378 404
 		if o.keyState[11] == 1:
379 405
 			#o.save_song()
380 406
 			pass
381
-		if o.keyState[14] == 1:
407
+
408
+		if o.keyState[10] == 2:
409
+			if (o.repeater_states[10] != None and ((pygame.time.get_ticks() - o.repeater_states[10]) > 500)):
410
+				if o.bpm > 60:
411
+					o.bpm = o.bpm - o.bpm_inc
412
+					o.update_bpm()
413
+					text_center(o, "Master BPM", str(o.bpm))
414
+					o.update_display(0)
415
+				o.repeater_states[10] = pygame.time.get_ticks()
416
+
417
+		if o.keyState[10] == 1:
418
+			o.repeater_states[10] = pygame.time.get_ticks()
382 419
 			if o.bpm > 60:
383 420
 				o.bpm = o.bpm - o.bpm_inc
384 421
 				o.update_bpm()
385 422
 				text_center(o, "Master BPM", str(o.bpm))
386 423
 				o.update_display(0)
387
-		if o.keyState[15] == 1:
424
+
425
+		if o.keyState[11] == 2:
426
+			if (o.repeater_states[11] != None and ((pygame.time.get_ticks() - o.repeater_states[11]) > 500)):
427
+				if o.bpm < 240:
428
+					o.bpm = o.bpm + o.bpm_inc
429
+					o.update_bpm()
430
+					text_center(o, "Master BPM", str(o.bpm))
431
+					o.update_display(0)
432
+				o.repeater_states[11] = pygame.time.get_ticks()
433
+
434
+		if o.keyState[11] == 1:
435
+			o.repeater_states[11] = pygame.time.get_ticks()
388 436
 			if o.bpm < 240:
389 437
 				o.bpm = o.bpm + o.bpm_inc
390 438
 				o.update_bpm()
@@ -393,81 +441,159 @@ def menu1_actions(self, o):
393 441
 
394 442
 
395 443
 def menu2_actions_sample(self, o):
444
+	if o.keyState[6] == 4 or o.keyState[6] == 3:
445
+		print('reset repeat from menu')
446
+		o.button_repeater(1,[])
447
+
448
+	if o.keyState[7] == 4 or o.keyState[7] == 3:
449
+		print('reset repeat from menu')
450
+		o.button_repeater(1,[])
451
+
452
+	if o.keyState[8] == 4 or o.keyState[8] == 3:
453
+		print('reset repeat from menu')
454
+		o.button_repeater(1,[])
455
+
456
+	if o.keyState[9] == 4 or o.keyState[9] == 3:
457
+		print('reset repeat from menu')
458
+		o.button_repeater(1,[])
459
+
460
+	if o.keyState[10] == 4 or o.keyState[10] == 3:
461
+		print('reset repeat from menu')
462
+		o.button_repeater(1,[])
463
+
464
+	if o.keyState[11] == 4 or o.keyState[11] == 3:
465
+		print('reset repeat from menu')
466
+		o.button_repeater(1,[])
467
+
396 468
 	if o.keyState[17] == 2:
397 469
 		if o.keyState[0] == 1:
398 470
 			if o.soundSlots[o.eSound].volume > 0:
399 471
 				print('copy')
400 472
 				o.soundClipboard = [o.soundSlots[o.eSound].file, o.soundSlots[o.eSound].volume, o.soundSlots[o.eSound].pitch]
401 473
 				print(o.soundClipboard)
402
-				#text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
403
-				#o.update_display(0)
404
-		elif o.keyState[1] == 1:
405
-			
406
-			print('pasting ', o.soundClipboard)
407
-			
408
-			o.soundSlots[o.eSound].file = o.soundClipboard[0]
409
-			o.soundSlots[o.eSound].volume = o.soundClipboard[1]
410
-			o.soundSlots[o.eSound].pitch = o.soundClipboard[2]
411
-			o.soundSlots[o.eSound].create_sound()
412
-			o.soundSlots[o.eSound].set_pitch()
413
-			
414
-			#s = o.SoundSlot(o.soundClipboard[0], o.eSound, o)
415
-			#s.volume = o.soundClipboard[1]
416
-			#s.pitch = o.soundClipboard[2]
417
-			#s.notes = s.init_notes()
418
-			#o.soundSlots[o.eSound] = s
474
+
475
+		if o.keyState[1] == 1:
476
+			if o.soundClipboard != []:
477
+				print('pasting ', o.soundClipboard)				
478
+				o.soundSlots[o.eSound].file = o.soundClipboard[0]
479
+				o.soundSlots[o.eSound].volume = o.soundClipboard[1]
480
+				o.soundSlots[o.eSound].pitch = o.soundClipboard[2]
481
+				o.soundSlots[o.eSound].create_sound()
482
+				o.soundSlots[o.eSound].set_pitch()
419 483
 			
420
-		elif o.keyState[2] == 1:
484
+		if o.keyState[2] == 1:
421 485
 			print('delete sound ', o.eSound)
422 486
 			o.soundSlots[o.eSound].file = None
423 487
 			o.soundSlots[o.eSound].volume = 16
424 488
 			o.soundSlots[o.eSound].pitch = 0
425
-		elif o.keyState[3] == 1:
489
+		if o.keyState[3] == 1:
426 490
 			print('load')
427 491
 			o.FSM.FSM.ToTransition("toLoadSound")
428 492
 
429
-		elif o.keyState[4] == 1:
493
+		if o.keyState[8] == 2:
494
+			if (o.repeater_states[8] != None and ((pygame.time.get_ticks() - o.repeater_states[8]) > 500)):
495
+				if o.soundSlots[o.eSound].volume > 0:
496
+					o.soundSlots[o.eSound].volume -= 1
497
+					text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
498
+					o.update_display(0)	
499
+				o.repeater_states[8] = pygame.time.get_ticks()
500
+
501
+		if o.keyState[8] == 1:
430 502
 			if o.soundSlots[o.eSound].volume > 0:
431 503
 				o.soundSlots[o.eSound].volume -= 1
432 504
 				text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
433 505
 				o.update_display(0)
506
+			o.repeater_states[8] = pygame.time.get_ticks()
434 507
 
435
-		elif o.keyState[5] == 1:
508
+		if o.keyState[9] == 2:
509
+			if (o.repeater_states[9] != None and ((pygame.time.get_ticks() - o.repeater_states[9]) > 500)):
510
+				if o.soundSlots[o.eSound].volume < 16:
511
+					o.soundSlots[o.eSound].volume += 1
512
+					text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
513
+					o.update_display(0)
514
+				o.repeater_states[9] = pygame.time.get_ticks()
515
+
516
+		if o.keyState[9] == 1:
436 517
 			if o.soundSlots[o.eSound].volume < 16:
437 518
 				o.soundSlots[o.eSound].volume += 1
438 519
 				text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
439 520
 				o.update_display(0)
521
+			o.repeater_states[9] = pygame.time.get_ticks()
440 522
 
441
-		elif o.keyState[6] == 1:
523
+		if o.keyState[6] == 2:
524
+			if (o.repeater_states[6] != None and ((pygame.time.get_ticks() - o.repeater_states[6]) > 500)):
525
+				if o.note_bank > 0:
526
+					o.note_bank -= 1
527
+					text_center(o, "Sound Bank", str(o.note_bank))
528
+					o.update_display(0)
529
+				o.repeater_states[6] = pygame.time.get_ticks()
530
+
531
+		if o.keyState[6] == 1:
442 532
 			if o.note_bank > 0:
443 533
 				o.note_bank -= 1
444 534
 				text_center(o, "Sound Bank", str(o.note_bank))
535
+				o.repeater_states[6] = pygame.time.get_ticks()
445 536
 				o.update_display(0)
446
-		elif o.keyState[7] == 1:
537
+
538
+		if o.keyState[7] == 2:
539
+			if (o.repeater_states[7] != None and ((pygame.time.get_ticks() - o.repeater_states[7]) > 500)):
540
+				if o.note_bank < 3:
541
+					o.note_bank += 1
542
+					text_center(o, "Sound Bank", str(o.note_bank))
543
+					o.update_display(0)
544
+				o.repeater_states[7] = pygame.time.get_ticks()
545
+
546
+		if o.keyState[7] == 1:
447 547
 			if o.note_bank < 3:
448 548
 				o.note_bank += 1
449 549
 				text_center(o, "Sound Bank", str(o.note_bank))
550
+				o.repeater_states[7] = pygame.time.get_ticks()
450 551
 				o.update_display(0)
451 552
 
452
-		elif o.keyState[8] == 1:
553
+		if o.keyState[10] == 2:
554
+			if (o.repeater_states[10] != None and ((pygame.time.get_ticks() - o.repeater_states[10]) > 500)):
555
+				if o.soundSlots[o.eSound].pitch > -10:
556
+					o.soundSlots[o.eSound].pitch -= 1
557
+					text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
558
+					o.soundSlots[o.eSound].set_pitch()
559
+					o.update_display(0)
560
+				o.repeater_states[10] = pygame.time.get_ticks()
561
+
562
+
563
+		if o.keyState[10] == 1:
453 564
 			if o.soundSlots[o.eSound].pitch > -10:
454 565
 				o.soundSlots[o.eSound].pitch -= 1
455 566
 				text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
456 567
 				o.soundSlots[o.eSound].set_pitch()
568
+				o.repeater_states[10] = pygame.time.get_ticks()
457 569
 				o.update_display(0)
458
-		elif o.keyState[9] == 1:
570
+
571
+		if o.keyState[11] == 2:
572
+			if (o.repeater_states[11] != None and ((pygame.time.get_ticks() - o.repeater_states[11]) > 500)):
573
+				if o.soundSlots[o.eSound].pitch < 10:
574
+					o.soundSlots[o.eSound].pitch += 1
575
+					text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
576
+					o.soundSlots[o.eSound].set_pitch()
577
+					o.update_display(0)
578
+				o.repeater_states[11] = pygame.time.get_ticks()
579
+
580
+
581
+		if o.keyState[11] == 1:
459 582
 			if o.soundSlots[o.eSound].pitch < 10:
460 583
 				o.soundSlots[o.eSound].pitch += 1
461 584
 				text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
462 585
 				o.soundSlots[o.eSound].set_pitch()
586
+				o.repeater_states[11] = pygame.time.get_ticks()
463 587
 				o.update_display(0)
464
-		elif o.keyState[12] == 1:
588
+
589
+		if o.keyState[12] == 1:
465 590
 			o.odub = not o.odub
466 591
 			o.undo_buf = []
467 592
 			print('odub now is ', o.odub)
468 593
 			draw_menu2_sample(o)
469 594
 			o.update_display(0)
470
-		elif o.keyState[13] == 1:
595
+
596
+		if o.keyState[13] == 1:
471 597
 			print('undo something')
472 598
 			for i in o.undo_buf:
473 599
 				o.soundSlots[i[0]].notes[i[1]][i[2]][0] = 0
@@ -483,14 +609,9 @@ def menu2_actions_pattern(self, o):
483 609
 				notes = []
484 610
 				for i in s.notes[o.ePattern]:
485 611
 					notes.append([i[0], i[1]])
486
-					#i[0] = 0
487
-					#i[1] = 0
488 612
 				o.patternClipboard.append(notes)
489 613
 				print('adding to clip ', notes)
490
-			# if o.soundSlots[o.eSound].volume > 0:
491
-			# 	o.soundSlots[o.eSound].volume -= 1
492
-			# 	text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
493
-			# 	o.update_display(0)
614
+			
494 615
 		elif o.keyState[1] == 1:
495 616
 			print('paste')
496 617
 			if o.patternClipboard != []:
@@ -503,14 +624,9 @@ def menu2_actions_pattern(self, o):
503 624
 						n += 1
504 625
 					print('added ', o.patternClipboard[p])
505 626
 					p += 1
506
-					
507
-				
508 627
 			else:
509 628
 				print('nothing to paste')
510
-			# if o.soundSlots[o.eSound].volume < 16:
511
-			# 	o.soundSlots[o.eSound].volume += 1
512
-			# 	text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
513
-			# 	o.update_display(0)
629
+			
514 630
 		elif o.keyState[2] == 1:
515 631
 			print('clear')
516 632
 			print(o.soundSlots[o.eSound].notes[o.ePattern])
@@ -518,12 +634,7 @@ def menu2_actions_pattern(self, o):
518 634
 				for i in s.notes[o.ePattern]:
519 635
 					i[0] = 0
520 636
 					i[1] = 0
521
-			#print(o.soundSlots[o.eSound].notes[o.ePattern])
522
-			# if o.soundSlots[o.eSound].pitch > -10:
523
-			# 	o.soundSlots[o.eSound].pitch -= 1
524
-			# 	text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
525
-			# 	o.soundSlots[o.eSound].set_pitch()
526
-			# 	o.update_display(0)
637
+			
527 638
 		elif o.keyState[6] == 1:
528 639
 			if o.pat_bank > 0:
529 640
 				o.pat_bank -= 1
@@ -554,30 +665,56 @@ def menu2_actions_song(self, o):
554 665
 				
555 666
 
556 667
 def menu2_actions_note(self, o):
668
+	if o.keyState[8] == 4 or o.keyState[8] == 3:
669
+		print('reset repeat from menu')
670
+		o.button_repeater(1,[])
671
+
672
+	if o.keyState[9] == 4 or o.keyState[9] == 3:
673
+		print('reset repeat from menu')
674
+		o.button_repeater(1,[])
675
+
557 676
 	if o.keyState[17] == 2:
558
-		if o.keyState[0] == 1:
677
+		
678
+
679
+		if o.keyState[8] == 2:
680
+			if (o.repeater_states[8] != None and ((pygame.time.get_ticks() - o.repeater_states[8]) > 500)):
681
+				if o.note_vol > 0:
682
+					o.note_vol -= 1
683
+					text_center(o, "Note Volume", str(o.note_vol))
684
+					o.update_display(0)		
685
+				o.repeater_states[8] = pygame.time.get_ticks()
686
+
687
+		if o.keyState[8] == 1:
559 688
 			if o.note_vol > 0:
560 689
 				o.note_vol -= 1
561 690
 				text_center(o, "Note Volume", str(o.note_vol))
691
+				o.repeater_states[8] = pygame.time.get_ticks()
562 692
 				o.update_display(0)		
563 693
 
564
-		elif o.keyState[1] == 1:
694
+		if o.keyState[9] == 2:
695
+			if (o.repeater_states[9] != None and ((pygame.time.get_ticks() - o.repeater_states[9]) > 500)):
696
+				if o.note_vol < 16:
697
+					o.note_vol += 1
698
+					text_center(o, "Note Volume", str(o.note_vol))					
699
+					o.update_display(0)
700
+				o.repeater_states[9] = pygame.time.get_ticks()
701
+
702
+		if o.keyState[9] == 1:
565 703
 			if o.note_vol < 16:
566 704
 				o.note_vol += 1
567 705
 				text_center(o, "Note Volume", str(o.note_vol))
706
+				o.repeater_states[9] = pygame.time.get_ticks()
568 707
 				o.update_display(0)
569
-		elif o.keyState[12] == 1:
708
+
709
+		if o.keyState[12] == 1:
570 710
 			if o.patternFollow:
571 711
 				o.patternFollow = False
572 712
 			else:
573 713
 				o.patternFollow = True
574
-			#o.patternFollow != o.patternFollow
714
+
575 715
 			print('pattern follow is ', o.patternFollow)
576 716
 			draw_menu2_note(o)
577
-			o.update_display(0)	
578
-			
579
-			
580
-		
717
+			o.update_display(0)			
581 718
 					
582 719
 
583 720
 def util_command(self, o, command):
@@ -587,6 +724,9 @@ def util_command(self, o, command):
587 724
 		self.FSM.ToTransition('toBall')		
588 725
 	elif command == "Defender":
589 726
 		self.FSM.ToTransition('toDefender')	
727
+	elif command == "Calculator":
728
+		self.FSM.ToTransition('toCalculator')	
729
+
590 730
 	elif command == "Exit":
591 731
 		self.FSM.ToTransition('toExit')		
592 732
 	elif command == "Theme":
@@ -769,6 +909,13 @@ class Main(State):
769 909
 		
770 910
 	def Execute(self):
771 911
 		o = self.FSM.owner 
912
+		
913
+		# if o.keyState[16] == 2:
914
+		# 	o.button_repeater(0, [8,9,14,15])
915
+
916
+		#if o.keyState[17] == 2:
917
+		#	o.button_repeater(0, [4,5,6,7,8,9])
918
+
772 919
 		menu1_actions(self, o)
773 920
 		menu2_actions_sample(self, o)
774 921
 		#self.FSM.ToTransition('toClock')
@@ -784,8 +931,11 @@ class Main(State):
784 931
 			text_box2(o, "BPM", str(o.bpm))
785 932
 			text_box4(o, "Bank", str(o.note_bank))
786 933
 			text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
934
+			o.button_repeater(1, [])
787 935
 			o.update_display(0)
788 936
 
937
+		
938
+
789 939
 
790 940
 		if o.keyState[17] == 1:
791 941
 			draw_menu2_sample(o)
@@ -1547,7 +1697,7 @@ class Util(State):
1547 1697
 		o = self.FSM.owner 
1548 1698
 		o.header_text = "Utilities"
1549 1699
 		o.pub.register("beat", self)
1550
-		self.menu = ["Clock", "Balls", "Defender", "Exit", "Shutdown", "Reboot", "Theme", "Ping", "Wifi", "Update"]
1700
+		self.menu = ["Clock", "Balls", "Defender", "Calculator", "Exit", "Shutdown", "Reboot", "Theme", "Ping", "Wifi", "Update"]
1551 1701
 		self.cur_el = 0
1552 1702
 
1553 1703
 		if o.keyState[16] > 0 or o.keyState[17] > 0:
@@ -2768,30 +2918,10 @@ class Defender(State):
2768 2918
 		super(Defender, self).__init__(FSM)    
2769 2919
 		
2770 2920
 	def Enter(self):
2771
-		self.ball_size = 10
2772
-		self.ballx = self.ball_size
2773
-		self.bally = self.ball_size
2774
-		
2775
-		self.ball_speed = 8
2776
-		self.ball_x_dir = 1
2777
-		self.ball_y_dir = 1
2921
+		o = self.FSM.owner 
2778 2922
 		
2779
-		self.ball2x = self.ball_size + 180
2780
-		self.ball2y = self.ball_size + 70
2781
-	
2782
-		self.ball2_x_dir = -1
2783
-		self.ball2_y_dir = -1
2784
-
2785
-		self.xmult = 1.0
2923
+		self.gameFSM = FSM.DefenderFSM(o)
2786 2924
 
2787
-		o = self.FSM.owner 
2788
-		o.header_text = "Balls"
2789
-		o.pub.register("beat", self)
2790
-		if o.keyState[16] > 0 or o.keyState[17] > 0:
2791
-			pass
2792
-		else:
2793
-			draw_header(o)
2794
-			o.update_display(0)
2795 2925
 		super(Defender, self).Enter()        
2796 2926
 		
2797 2927
 	def Execute(self):
@@ -2800,69 +2930,22 @@ class Defender(State):
2800 2930
 		if o.keyState[16] == 1:
2801 2931
 			draw_menu1(o)
2802 2932
 			o.update_display(0)
2803
-		
2804
-
2805
-		if o.keyState[16] > 0 or o.keyState[17] > 0:
2933
+		elif o.keyState[16] == 4:
2934
+			#draw_header(o)
2935
+			#self.draw_footer(o)
2936
+			#self.draw_main(o)
2937
+			#o.update_display(0)		
2806 2938
 			pass
2807
-		else:			
2808
-			now = datetime.now()
2809
-			current_time = time.strftime("%-I:%M %p")
2810
-
2811
-
2812
-			if self.ballx < (0 + self.ball_size):
2813
-				self.ball_x_dir = 1
2814
-			if self.ballx > (o.width - self.ball_size):
2815
-				self.ball_x_dir = -1
2816
-
2817
-			if self.bally < (0 + self.ball_size):
2818
-				self.ball_y_dir = 1
2819
-			if self.bally > (o.height - self.ball_size):
2820
-				self.ball_y_dir = -1
2821
-
2822
-			# if self.ballx > (o.width - self.ball_size) or self.ballx < (0 + self.ball_size):
2823
-			# 	self.ball_x_dir *= -1
2824
-			# if self.bally > (o.height - self.ball_size) or self.bally < (0 + self.ball_size):
2825
-			# 	self.ball_y_dir *= -1
2826
-
2827
-			self.ballx += self.ball_speed * self.ball_x_dir
2828
-			self.bally += self.ball_speed * self.ball_y_dir
2829
-
2830
-
2831
-			if self.ball2x < (0 + self.ball_size):
2832
-				self.ball2_x_dir = 1
2833
-				self.xmult = random.uniform(.6, 1.2)
2834
-			if self.ball2x > (o.width - self.ball_size):
2835
-				self.ball2_x_dir = -1
2836
-				self.xmult = random.uniform(.6, 1.2)
2837
-
2838
-			if self.ball2y < (0 + self.ball_size):
2839
-				self.ball2_y_dir = 1
2840
-			if self.ball2y > (o.height - self.ball_size):
2841
-				self.ball2_y_dir = -1			
2842
-
2843
-
2844
-			# if self.ball2x > (o.width - self.ball_size) or self.ball2x < (0 + self.ball_size):
2845
-			# 	self.ball2_x_dir *= -1
2846
-			# 	self.xmult = random.uniform(.8, 1.2)
2847
-			# if self.ball2y > (o.height - self.ball_size) or self.ball2y < (0 + self.ball_size):
2848
-			# 	self.ball2_y_dir *= -1
2849 2939
 
2850
-			self.ball2x += (self.ball_speed * self.ball2_x_dir) * self.xmult
2851
-			self.ball2y += (self.ball_speed * self.ball2_y_dir) 
2940
+		if o.keyState[16] > 0 or o.keyState[17] > 0:
2852 2941
 
2853
-			o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
2854
-			
2855
-			o.draw.ellipse((self.ballx - self.ball_size, self.bally - self.ball_size, self.ballx + self.ball_size, self.bally + self.ball_size), fill = o.light_grey, outline =o.light_grey)
2856
-			o.draw.ellipse((self.ball2x - self.ball_size, self.ball2y - self.ball_size, self.ball2x + self.ball_size, self.ball2y + self.ball_size), fill = o.light_grey, outline =o.light_grey)
2857
-			#o.center_block(current_time, o.h3, [0,0,o.width,o.height], o.pink)
2858
-			o.update_display(0)
2859
-		
2860
-	def ReceiveMessage(self, message):
2861
-		o = self.FSM.owner 
2862
-		play_seq(o, message)
2942
+		#if o.keyState[16] > 0:
2943
+			pass
2944
+		else:
2945
+			self.gameFSM.Execute()
2863 2946
 		
2864 2947
 	def Exit(self):
2865
-		self.FSM.owner.pub.unregister("beat", self)        
2948
+		pass
2866 2949
 
2867 2950
 #==================================== 
2868 2951
 #==================================== 
@@ -2923,3 +3006,180 @@ class Update(State):
2923 3006
 		self.FSM.owner.pub.unregister("beat", self)        
2924 3007
 
2925 3008
 #==================================== 
3009
+
3010
+
3011
+
3012
+class Calculator(State):
3013
+	def __init__(self,FSM):
3014
+		super(Calculator, self).__init__(FSM)    
3015
+		
3016
+	def Enter(self):
3017
+		o = self.FSM.owner 
3018
+
3019
+		o.pub.register("beat", self)
3020
+		
3021
+		self.num1 = ''
3022
+		self.num2 = ''
3023
+		self.op = ''
3024
+		self.result = ''
3025
+
3026
+		self.labels = ['.', '0', '=', '/',
3027
+						'1', '2', '3', '*',
3028
+						'4', '5', '6', '-',
3029
+						'7', '8', '9', '+',
3030
+						'7', '8', '9', '+']
3031
+
3032
+		self.draw_main(o)
3033
+		o.update_display(0)
3034
+		print('hi calc')
3035
+
3036
+		super(Calculator, self).Enter()        
3037
+		
3038
+	def Execute(self):
3039
+		o = self.FSM.owner 
3040
+		menu1_actions(self, o)
3041
+		if o.keyState[16] == 1:
3042
+			draw_menu1(o)
3043
+			o.update_display(0)
3044
+		elif o.keyState[16] == 4:		
3045
+			self.draw_main(o)
3046
+			o.update_display(0)
3047
+
3048
+		if o.keyState[16] > 0:
3049
+			pass
3050
+		else:
3051
+			#pass
3052
+		
3053
+			if o.keyState[17] == 1:
3054
+				self.num1 = ''
3055
+				self.num2 = ''
3056
+				self.op = ''
3057
+				self.result = ''
3058
+
3059
+			self.check_keys(o)
3060
+
3061
+	def append_num(self, num):
3062
+		ops = ['+', '-', '*', '/']
3063
+		print('appending num ', num)
3064
+		if num in ops:
3065
+			if self.num1 != '':
3066
+				self.op = num
3067
+		elif num == '=':
3068
+			print('this is that')
3069
+			if self.num2 != '':
3070
+				if self.op == '+':
3071
+					self.result = float(self.num1) + float(self.num2)
3072
+					print(self.result)
3073
+				if self.op == '-':
3074
+					self.result = float(self.num1) - float(self.num2)
3075
+					print(self.result)
3076
+				if self.op == '*':
3077
+					self.result = float(self.num1) * float(self.num2)
3078
+					print(self.result)
3079
+				if self.op == '/':
3080
+					self.result = float(self.num1) / float(self.num2)
3081
+					print(self.result)
3082
+
3083
+		else:
3084
+			if self.result != '':
3085
+				self.num1 = ''
3086
+				self.num2 = ''
3087
+				self.op = ''
3088
+				self.result = ''
3089
+			if self.op == '':
3090
+				self.num1 += num
3091
+				print('---append ', num)
3092
+			else:
3093
+				self.num2 += num
3094
+				print('---append ', num)
3095
+	def check_keys(self, o):
3096
+		_iter = 0
3097
+		for k in o.keyState:
3098
+			if k == 1:
3099
+				if _iter == 0:
3100
+					if ('.' not in self.num1 and self.num2 == '') or (self.num2 != '' and '.' not in self.num2):
3101
+						self.append_num('.')
3102
+				if _iter == 1:
3103
+					self.append_num('0')
3104
+				if _iter == 2:
3105
+					self.append_num('=')
3106
+				if _iter == 3:
3107
+					self.append_num('/')
3108
+				if _iter == 4:
3109
+					self.append_num('1')
3110
+				if _iter == 5:
3111
+					self.append_num('2')
3112
+				if _iter == 6:
3113
+					self.append_num('3')
3114
+				if _iter == 7:
3115
+					self.append_num('*')
3116
+				if _iter == 8:
3117
+					self.append_num('4')
3118
+				if _iter == 9:
3119
+					self.append_num('5')
3120
+				if _iter == 10:
3121
+					self.append_num('6')
3122
+				if _iter == 11:
3123
+					self.append_num('-')
3124
+				if _iter == 12:
3125
+					self.append_num('7')
3126
+				if _iter == 13:
3127
+					self.append_num('8')
3128
+				if _iter == 14:
3129
+					self.append_num('9')
3130
+				if _iter == 15:
3131
+					self.append_num('+')
3132
+
3133
+				self.draw_main(o)
3134
+
3135
+			_iter += 1
3136
+
3137
+	def draw_main(self, o):
3138
+		print('drawing ', self.num1)
3139
+		x_size = o.width / 4
3140
+		y_size = o.height / 5
3141
+		og_x = 0
3142
+		o_x = og_x
3143
+		o_y = o.height
3144
+		text_padding = 6
3145
+		
3146
+		_id = 0
3147
+		while _id < 20:
3148
+			# lab = ""
3149
+			# for i in self.labels[_id]:
3150
+			# 	lab += i
3151
+
3152
+			lab = self.labels[_id]
3153
+
3154
+			o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
3155
+			o.center_block(lab, o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
3156
+
3157
+			o_x = o_x + x_size
3158
+			_id += 1
3159
+			if _id % 4 == 0:
3160
+				o_y -= y_size
3161
+				o_x = og_x
3162
+		o.draw.rectangle((0, 0, o.width, y_size), outline=0, fill=o.blue)
3163
+		#o.center_block('where is my fucking text', o.h2, [0, 0, o.width, y_size], o.light_grey)
3164
+		if self.num1 != '':
3165
+			if self.result != '':
3166
+				o.center_block(str(self.result), o.h2, [0, 0, o.width, y_size], o.light_grey)
3167
+			elif self.num2 != '':
3168
+				o.center_block(str(self.num2), o.h2, [0, 0, o.width, y_size], o.light_grey)
3169
+			elif self.op != '':
3170
+				o.center_block(str(self.op), o.h2, [0, 0, o.width, y_size], o.light_grey)
3171
+			else:
3172
+				o.center_block(str(self.num1), o.h2, [0, 0, o.width, y_size], o.light_grey)
3173
+			print('fucking do something')
3174
+		else:
3175
+			print('num1 is empty')
3176
+		o.update_display(0)
3177
+
3178
+	def ReceiveMessage(self, message):
3179
+		o = self.FSM.owner 
3180
+		play_seq(o, message)
3181
+
3182
+	def Exit(self):
3183
+		self.FSM.owner.pub.unregister("beat", self)
3184
+
3185
+#==================================== 

+ 31
- 0
main.py View File

@@ -179,8 +179,15 @@ class Prog:
179 179
 		self.notes_on = []
180 180
 		self.clear_notes_on()
181 181
 
182
+		self.press_ticks_up = None
183
+		self.press_ticks_down = None
182 184
 
183 185
 		self.pub = observer.Publisher(['beat', 'the joint'])
186
+		self.repeater_states = []
187
+		_iter = 0
188
+		while _iter < 18:
189
+			self.repeater_states.append(None)
190
+			_iter += 1
184 191
 
185 192
 		#self.song_file_name = "default.sng"
186 193
 		self.mconf = ConfigObj("config.txt")
@@ -331,6 +338,30 @@ class Prog:
331 338
 			elif self.keyState[17] == 4:
332 339
 				self.keyState[17] = 0
333 340
 
341
+	def button_repeater(self, state, enables):
342
+		if state == 0:
343
+			pass
344
+			# _iter = 0
345
+			# for b in self.keyState:
346
+			# 	if _iter in enables:
347
+			# 		if b == 2:
348
+			# 			if self.repeater_states[_iter] == None:
349
+			# 				#self.repeater_states[_iter] = pygame.time.get_ticks()
350
+			# 				pass
351
+			# 			else:
352
+			# 				t = pygame.time.get_ticks() - self.repeater_states[_iter]
353
+			# 				if t > 250:
354
+			# 					#self.repeater_states[_iter] = pygame.time.get_ticks()	
355
+			# 					#b = 0
356
+			# 					print('new tick ', _iter, ' ', b)
357
+
358
+			# 	_iter += 1
359
+			#self.repeater_states
360
+		elif state == 1:
361
+			for i in self.repeater_states:
362
+				i = None
363
+			print('reset repeater')
364
+
334 365
 	def update_bpm(self):
335 366
 		bpm = (60000 / self.bpm) / 4
336 367
 		self.half_bpm = bpm / 2

Loading…
Cancel
Save