changeset 336:1d487646a4d4

Better key handling, form change delay.
author Jeremy Thurgood <firxen@gmail.com>
date Fri, 06 Sep 2013 12:22:02 +0200
parents 78b805549b4e
children 004e3dd38336
files nagslang/constants.py nagslang/protagonist.py nagslang/screens/area.py
diffstat 3 files changed, 71 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/constants.py	Fri Sep 06 11:48:48 2013 +0200
+++ b/nagslang/constants.py	Fri Sep 06 12:22:02 2013 +0200
@@ -54,3 +54,7 @@
 
 BULLET_DAMAGE = 10
 CLAW_DAMAGE = 5
+
+CMD_TOGGLE_FORM = 'toggle_form'
+CMD_ATTACK = 'attack'
+CMD_ACTION = 'action'
--- a/nagslang/protagonist.py	Fri Sep 06 11:48:48 2013 +0200
+++ b/nagslang/protagonist.py	Fri Sep 06 12:22:02 2013 +0200
@@ -5,7 +5,8 @@
 from nagslang.constants import (
     COLLISION_TYPE_PLAYER, ZORDER_MID, WEREWOLF_SOAK_FACTOR,
     PROTAGONIST_HEALTH_MIN_LEVEL, PROTAGONIST_HEALTH_MAX_LEVEL,
-    NON_GAME_OBJECT_COLLIDERS, BULLET_DAMAGE, CLAW_DAMAGE)
+    NON_GAME_OBJECT_COLLIDERS, BULLET_DAMAGE, CLAW_DAMAGE,
+    CMD_TOGGLE_FORM, CMD_ATTACK, CMD_ACTION)
 from nagslang.events import FireEvent, ClawEvent
 from nagslang.game_object import GameObject, Physicser, make_body
 from nagslang.mutators import FLIP_H
@@ -44,19 +45,37 @@
     HUMAN_FORM = 'human'
     WOLF_FORM = 'wolf'
 
+    CHANGING_SEQUENCE = {
+        # The key is the form we're changing *from*.
+        HUMAN_FORM: (
+            WOLF_FORM, HUMAN_FORM, HUMAN_FORM,
+            WOLF_FORM, HUMAN_FORM, WOLF_FORM,
+            HUMAN_FORM, WOLF_FORM, HUMAN_FORM,
+            WOLF_FORM, HUMAN_FORM, WOLF_FORM,
+            HUMAN_FORM, WOLF_FORM, WOLF_FORM,
+        ),
+        WOLF_FORM: (
+            HUMAN_FORM, WOLF_FORM, WOLF_FORM,
+            HUMAN_FORM, WOLF_FORM, HUMAN_FORM,
+            WOLF_FORM, HUMAN_FORM, WOLF_FORM,
+            HUMAN_FORM, WOLF_FORM, HUMAN_FORM,
+            WOLF_FORM, HUMAN_FORM, HUMAN_FORM,
+        ),
+    }
+
+    zorder = ZORDER_MID
+
     def __init__(self, space, world, position):
-        physicser = self._make_physics(space, position)
-        renderer = self._make_renderer()
+        self.form = self.HUMAN_FORM
+        super(Protagonist, self).__init__(
+            self._make_physics(space, position), self._make_renderer())
+        self.world = world
         self.inventory = {}
-        self.form = self.HUMAN_FORM
+        self.health_level = 100
+
         self.angle = 0
         self.is_moving = False
-        self.world = world
-
-        super(Protagonist, self).__init__(physicser, renderer)
-        self.zorder = ZORDER_MID
-
-        self.health_level = 100
+        self.changing_sequence = []
 
         self.go_human()
 
@@ -165,6 +184,19 @@
         # TODO: Update from saved state.
         return obj
 
+    def handle_keypress(self, key_command):
+        if self.changing_sequence:
+            print "Changing, can't act."
+            return
+        if key_command == CMD_TOGGLE_FORM:
+            self.world.transformations += 1
+            self.toggle_form()
+        if key_command == CMD_ATTACK:
+            self.world.attacks += 1
+            self.attack()
+        if key_command == CMD_ACTION:
+            self.perform_action()
+
     def get_render_angle(self):
         # No image rotation when rendering, please.
         return 0
@@ -200,7 +232,7 @@
         self.impulse_factor = 500
 
     def set_direction(self, dx, dy):
-        if (dx, dy) == (0, 0):
+        if (dx, dy) == (0, 0) or self.changing_sequence:
             self.is_moving = False
             return
         self.is_moving = True
@@ -220,10 +252,14 @@
         self.inventory = old_protagonist.inventory
 
     def toggle_form(self):
-        if self.form == self.WOLF_FORM:
+        for form in self.CHANGING_SEQUENCE[self.form]:
+            self.changing_sequence.extend([form] * 3)
+
+    def _go_to_next_form(self):
+        if self.changing_sequence.pop(0) == self.WOLF_FORM:
+            self.go_werewolf()
+        else:
             self.go_human()
-        else:
-            self.go_werewolf()
 
     def get_current_interactible(self):
         for shape in self.get_space().shape_query(self.get_shape()):
@@ -305,6 +341,8 @@
             self.health_level = PROTAGONIST_HEALTH_MAX_LEVEL
 
     def update(self, dt):
+        if self.changing_sequence:
+            self._go_to_next_form()
         if int(self.lifetime + dt) > int(self.lifetime):
             if self.form == self.WOLF_FORM:
                 self.gain_health(1)
--- a/nagslang/screens/area.py	Fri Sep 06 11:48:48 2013 +0200
+++ b/nagslang/screens/area.py	Fri Sep 06 12:22:02 2013 +0200
@@ -6,7 +6,8 @@
 
 from nagslang.constants import (
     COLLISION_TYPE_WALL, COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS,
-    COLLISION_TYPE_FURNITURE, COLLISION_TYPE_WEREWOLF_ATTACK)
+    COLLISION_TYPE_FURNITURE, COLLISION_TYPE_WEREWOLF_ATTACK,
+    CMD_TOGGLE_FORM, CMD_ATTACK, CMD_ACTION)
 from nagslang.enemies import DeadEnemy
 from nagslang.events import (
     ScreenChange, DoorEvent, FireEvent, EnemyDeathEvent, ClawEvent)
@@ -24,6 +25,13 @@
         (1, 0): set([pygame.locals.K_RIGHT, pygame.locals.K_d]),
     }
 
+    command_keys = {
+        pygame.locals.K_c: CMD_TOGGLE_FORM,
+        pygame.locals.K_z: CMD_ATTACK,
+        pygame.locals.K_LCTRL: CMD_ATTACK,
+        pygame.locals.K_SPACE: CMD_ACTION,
+    }
+
     def __init__(self):
         self.keys_down = set()
 
@@ -47,6 +55,9 @@
                 dy += ty
         return (dx, dy)
 
+    def get_command_key(self, key):
+        return self.command_keys.get(key, None)
+
 
 class Drawables(object):
     def __init__(self):
@@ -151,14 +162,9 @@
         if ev.type == pygame.locals.KEYDOWN:
             if ev.key == pygame.locals.K_ESCAPE:
                 ScreenChange.post('menu')
-            if ev.key == pygame.locals.K_c:
-                self.protagonist.toggle_form()
-                self.world.transformations += 1
-            if ev.key in (pygame.locals.K_z, pygame.locals.K_LCTRL):
-                self.world.attacks += 1
-                self.protagonist.attack()
-            if ev.key == pygame.locals.K_SPACE:
-                self.protagonist.perform_action()
+            cmd_key = self.keys.get_command_key(ev.key)
+            if cmd_key is not None:
+                self.protagonist.handle_keypress(cmd_key)
         elif DoorEvent.matches(ev):
             self.protagonist.set_position(ev.dest_pos)
             if ev.destination != self.name: