# HG changeset patch # User Jeremy Thurgood # Date 1378497417 -7200 # Node ID 21c1c329f8e360529e4dba8b07d18e6383173e18 # Parent b5a0081f578473cf049b911e8488cba6cb585511 Automatic weapons. diff -r b5a0081f5784 -r 21c1c329f8e3 nagslang/constants.py --- a/nagslang/constants.py Fri Sep 06 21:37:00 2013 +0200 +++ b/nagslang/constants.py Fri Sep 06 21:56:57 2013 +0200 @@ -60,5 +60,4 @@ ACID_SPEED = 300 CMD_TOGGLE_FORM = 'toggle_form' -CMD_ATTACK = 'attack' CMD_ACTION = 'action' diff -r b5a0081f5784 -r 21c1c329f8e3 nagslang/game_object.py --- a/nagslang/game_object.py Fri Sep 06 21:37:00 2013 +0200 +++ b/nagslang/game_object.py Fri Sep 06 21:56:57 2013 +0200 @@ -126,6 +126,19 @@ if interactible is not None: self.interactible.set_game_object(self) self.remove = False # If true, will be removed from drawables + self._timers = {} + self._active_timers = {} + + def add_timer(self, name, secs): + self._timers[name] = secs + + def start_timer(self, name, secs=None): + if secs is None: + secs = self._timers[name] + self._active_timers[name] = secs + + def check_timer(self, name): + return name in self._active_timers def set_stored_state_dict(self, stored_state): """Override this to set up whatever state storage you want. @@ -159,6 +172,10 @@ def update(self, dt): self.lifetime += dt + for timer in self._active_timers.keys(): + self._active_timers[timer] -= dt + if self._active_timers[timer] <= 0: + self._active_timers.pop(timer) self.renderer.update(dt) def hit(self, weapon): diff -r b5a0081f5784 -r 21c1c329f8e3 nagslang/protagonist.py --- a/nagslang/protagonist.py Fri Sep 06 21:37:00 2013 +0200 +++ b/nagslang/protagonist.py Fri Sep 06 21:56:57 2013 +0200 @@ -8,7 +8,7 @@ COLLISION_TYPE_PLAYER, ZORDER_MID, WEREWOLF_SOAK_FACTOR, PROTAGONIST_HEALTH_MIN_LEVEL, PROTAGONIST_HEALTH_MAX_LEVEL, NON_GAME_OBJECT_COLLIDERS, BULLET_DAMAGE, BULLET_SPEED, CLAW_DAMAGE, - CMD_TOGGLE_FORM, CMD_ATTACK, CMD_ACTION) + CMD_TOGGLE_FORM, CMD_ACTION) from nagslang.events import FireEvent, ClawEvent from nagslang.game_object import GameObject, Physicser, make_body from nagslang.mutators import FLIP_H @@ -78,7 +78,8 @@ self.angle = 0 self.is_moving = False self.changing_sequence = [] - self.change_delay = 0 + self.add_timer('attack_cooldown', 0.2) + self.add_timer('change_delay', 0.1) self.go_human() @@ -187,16 +188,19 @@ # TODO: Update from saved state. return obj + def handle_attack_key_down(self): + if self.changing_sequence or self.check_timer('attack_cooldown'): + return + self.start_timer('attack_cooldown') + self.world.attacks += 1 + self.attack() + 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() @@ -255,7 +259,7 @@ self.inventory = old_protagonist.inventory def toggle_form(self): - if self.change_delay: + if self.check_timer('change_delay'): return self.changing_sequence.extend(self.CHANGING_SEQUENCE[self.form]) @@ -352,9 +356,13 @@ if self.health_level > PROTAGONIST_HEALTH_MAX_LEVEL: self.health_level = PROTAGONIST_HEALTH_MAX_LEVEL + def _decrement_timer(self, timer, dt): + if self._timers[timer] > 0: + self._timers[timer] -= dt + if self._timers[timer] < 0: + self._timers[timer] = 0 + def update(self, dt): - if self.change_delay > 0: - self.change_delay -= 1 if self.changing_sequence: self._go_to_next_form() if int(self.lifetime + dt) > int(self.lifetime): @@ -365,4 +373,4 @@ def force_wolf_form(self): if self.in_human_form() and not self.changing_sequence: self.toggle_form() - self.change_delay = 2 + self.start_timer('change_delay') diff -r b5a0081f5784 -r 21c1c329f8e3 nagslang/screens/area.py --- a/nagslang/screens/area.py Fri Sep 06 21:37:00 2013 +0200 +++ b/nagslang/screens/area.py Fri Sep 06 21:56:57 2013 +0200 @@ -7,7 +7,7 @@ from nagslang.constants import ( COLLISION_TYPE_WALL, COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS, COLLISION_TYPE_FURNITURE, COLLISION_TYPE_WEREWOLF_ATTACK, - CMD_TOGGLE_FORM, CMD_ATTACK, CMD_ACTION) + CMD_TOGGLE_FORM, CMD_ACTION) from nagslang.enemies import DeadEnemy from nagslang.events import ( ScreenChange, DoorEvent, FireEvent, EnemyDeathEvent, ClawEvent) @@ -25,10 +25,10 @@ (1, 0): set([pygame.locals.K_RIGHT, pygame.locals.K_d]), } + attack_keys = set([pygame.locals.K_z, pygame.locals.K_LCTRL]) + 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, } @@ -55,6 +55,9 @@ dy += ty return (dx, dy) + def is_attacking(self): + return bool(self.keys_down & self.attack_keys) + def get_command_key(self, key): return self.command_keys.get(key, None) @@ -233,6 +236,8 @@ def tick_protagonist(self): dx, dy = self.keys.get_direction() self.protagonist.set_direction(dx, dy) + if self.keys.is_attacking(): + self.protagonist.handle_attack_key_down() def tick(self, seconds): super(AreaScreen, self).tick(seconds)