Mercurial > nagslang
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: