[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[monsterz] [Patch] Enable keyboard support



Hi,

please find an attached patch which enables basic keyboard support. You
can't change level options yet, but it permits to browse menus and play
without the use of a mouse.

Yours truly, with love

-- 
Jean-Yves Lamoureux
Index: monsterz.py
===================================================================
--- monsterz.py	(revision 137)
+++ monsterz.py	(working copy)
@@ -512,7 +512,23 @@
         self.speed = 1
         self.new_level()
         self.oldticks = pygame.time.get_ticks()
+        self.keyboard_used = False
+        self.keyboard_x = 0
+        self.keyboard_y = 0
 
+    def keyboard_handle(self, key):
+        if (key == K_UP)   and (self.keyboard_y != 0):
+            self.keyboard_y-=1
+        if (key == K_DOWN) and (self.keyboard_y != BOARD_HEIGHT-1):
+            self.keyboard_y+=1
+        if (key == K_LEFT) and (self.keyboard_x != 0):
+            self.keyboard_x-=1
+        if (key == K_RIGHT) and (self.keyboard_x != BOARD_WIDTH-1):
+            self.keyboard_x+=1
+        if (key == K_SPACE) and (self.keyboard_used == True):
+            self.clicks.append((self.keyboard_x,self.keyboard_y)) 
+        self.keyboard_used = True
+        
     def get_random(self, no_special = False):
         if not no_special and randint(0, SPECIAL_FREQ) == 0:
             return ITEM_SPECIAL
@@ -697,6 +713,7 @@
         else:
             timer = 0
         if timer > SCROLL_DELAY / 2:
+            self.keyboard_used = False 
             global_xoff = 0
             yoff = (SCROLL_DELAY - timer) * (SCROLL_DELAY - timer)
             global_yoff = yoff * 50 * 50 / SCROLL_DELAY / SCROLL_DELAY
@@ -728,6 +745,7 @@
                 x, y = data.board2screen((i, j))
             xoff, yoff = self.extra_offset[i][j]
             if self.lost_timer:
+                self.keyboard_used = False;
                 d = LOST_DELAY - self.lost_timer
                 xoff += (i * 2 - 7) * 4 * d / LOST_DELAY
                 yoff += (j * 2 - 7) * 4 * d / LOST_DELAY
@@ -774,6 +792,11 @@
         # Draw selector if necessary
         if self.select:
             system.blit(data.selector, select_coord)
+            
+        # Draw keyboard selector around keyboard position
+        if(self.keyboard_used == True):
+            key_selected = (24 + self.keyboard_x * ITEM_SIZE, 24 + self.keyboard_y * ITEM_SIZE) 
+            system.blit(data.selector, key_selected)
 
     def piece_draw(self, sprite, (x, y)):
         width = ITEM_SIZE
@@ -1160,7 +1183,7 @@
             if self.time <= 0:
                 system.play('laugh')
                 self.select = None
-                self.show_move = False
+                self.show_move = False 
                 self.lost_timer = LOST_DELAY
                 return
         # Handle moves from the AI:
@@ -1376,6 +1399,7 @@
 
     msat = [0] * 4
     marea = None
+    selected_text = 0
     def iterate_menu(self):
         self.generic_draw()
         self.copyright_draw()
@@ -1383,16 +1407,16 @@
         shapes = [2, 3, 4, 0]
         messages = ['NEW GAME', 'HELP', 'SCORES', 'QUIT']
         x, y = data.screen2board(pygame.mouse.get_pos())
-        if y == 4 and 2 <= x <= 5:
+        if (y == 4 and 2 <= x <= 5) or self.selected_text == 0:
             marea = STATUS_NEW
             self.msat[0] = 255
-        elif y == 5 and 2 <= x <= 5:
+        elif y == 5 and 2 <= x <= 5 or self.selected_text == 1:
             marea = STATUS_HELP
             self.msat[1] = 255
-        elif y == 6 and 2 <= x <= 5:
+        elif y == 6 and 2 <= x <= 5 or self.selected_text == 2:
             marea = STATUS_SCORES
             self.msat[2] = 255
-        elif y == 7 and 2 <= x <= 5:
+        elif y == 7 and 2 <= x <= 5 or self.selected_text == 3:
             marea = STATUS_QUIT
             self.msat[3] = 255
         else:
@@ -1421,6 +1445,14 @@
         for event in pygame.event.get():
             if self.generic_event(event):
                 return
+            elif event.type == KEYDOWN and event.key == K_DOWN:
+                if self.selected_text < 3:
+                    self.selected_text+=1
+            elif event.type == KEYDOWN and event.key == K_UP:
+                if self.selected_text >=0:
+                    self.selected_text-=1
+            elif event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_RETURN):
+                self.status = marea
             elif event.type == KEYDOWN and event.key == K_ESCAPE:
                 system.play('whip')
                 self.status = STATUS_QUIT
@@ -1444,6 +1476,8 @@
 
     nsat = [0] * 8
     narea = None
+    selected_text = 0
+
     def iterate_new(self):
         items = settings.get('items')
         difficulty = settings.get('difficulty')
@@ -1451,16 +1485,16 @@
         self.copyright_draw()
         messages = ['CLASSIC', 'PUZZLE', '', 'TRAINING']
         x, y = data.screen2board(pygame.mouse.get_pos())
-        if y == 2 and 1 <= x <= 6:
+        if (y == 2 and 1 <= x <= 6) or self.selected_text==0:
             narea = GAME_CLASSIC
             self.nsat[0] = 255
-        elif y == 3 and 1 <= x <= 5:
+        elif (y == 3 and 1 <= x <= 5) or self.selected_text==1:
             narea = GAME_PUZZLE
             self.nsat[1] = 255
         #elif y == 4 and 1 <= x <= 4:
         #    narea = GAME_QUEST
         #    self.nsat[2] = 255
-        elif y == 5 and 1 <= x <= 4:
+        elif (y == 5 and 1 <= x <= 4) or self.selected_text==2:
             narea = GAME_TRAINING
             self.nsat[3] = 255
         elif (x, y) == (1, 6):
@@ -1532,6 +1566,23 @@
                     if difficulty > 1:
                         settings.set('difficulty', difficulty - 1)
                 return
+            elif event.type == KEYDOWN and event.key == K_DOWN:
+                if self.selected_text < 2:
+                    self.selected_text+=1
+            elif event.type == KEYDOWN and event.key == K_UP:
+                if self.selected_text >=0:
+                    self.selected_text-=1
+            elif event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_RETURN):
+                system.play('whip')
+                self.game = Game(type = narea)
+                self.status = STATUS_GAME
+
+            elif event.type == KEYDOWN and event.key == K_RETURN:
+                system.play('whip')
+                self.game = Game(type = narea)
+                self.status = STATUS_GAME
+                return
+
             elif event.type == MOUSEBUTTONDOWN and narea is not None:
                 system.play('whip')
                 self.game = Game(type = narea)
@@ -1576,8 +1627,16 @@
                     return
                 self.game.lost_timer = -1
                 return
-            elif event.type == KEYDOWN and (event.key == K_p or event.key == K_SPACE) and self.game.lost_timer >= 0:
+            elif event.type == KEYDOWN and (event.key == K_p) and self.game.lost_timer >= 0:
                 self.game.pause()
+            elif event.type == KEYDOWN and (event.key == K_RETURN or event.key == K_SPACE) and self.game.splash:    
+                system.play('whip')
+                self.game.splash = False
+                if self.game.lost_timer == -1:
+                    system.play('whip')
+                    self.status = STATUS_MENU
+            elif event.type == KEYDOWN:
+                self.game.keyboard_handle(event.key)
             elif event.type == MOUSEBUTTONDOWN:
                 x, y = pygame.mouse.get_pos()
                 if self.game.lost_timer >= 0:

Attachment: signature.asc
Description: This is a digitally signed message part