diff --git a/NS.py b/NS.py index ef72eab..e88b478 100644 --- a/NS.py +++ b/NS.py @@ -56,6 +56,7 @@ class NS(Game, Animation): LENGTH = 150 FRONT = 300 STEP = .4 + IDLE_TIMEOUT = 60000 * 5 def __init__(self): Game.__init__(self) @@ -84,6 +85,7 @@ class NS(Game, Animation): sfx[basename(path.split(".")[0])] = SoundEffect(self, path) def reset(self, leave_wipe_running=False): + self.idle_elapsed = 0 self.suppressing_input = False self.title.reset() if not leave_wipe_running: @@ -106,6 +108,7 @@ class NS(Game, Animation): # if self.last_press <= get_ticks() - int(self.get_configuration("input", "buffer")): pressed = True if event.type == KEYDOWN else False lights = self.platform.lights + self.idle_elapsed = 0 if event.key in (K_UP, K_o): lights[NS.LNW].pressed = pressed elif event.key in (K_RIGHT, K_p): @@ -131,6 +134,9 @@ class NS(Game, Animation): self.chemtrails.update() self.boss.update_dialogue() self.wipe.update() + self.idle_elapsed += self.time_filter.get_last_frame_duration() + if self.idle_elapsed >= self.IDLE_TIMEOUT: + self.reset() class Title(GameChild): @@ -245,14 +251,22 @@ class Dialogue(Animation): self.name_box = Sprite(self) self.name_box.add_frame(frame) self.name_box.location.bottomleft = self.avatar_box.location.bottomright + self.speech_channel = None def reset(self): + self.stop_speech() self.halt() self.deactivate() self.first_pressed = False self.first_press_elapsed = 0 + def stop_speech(self): + if self.speech_channel is not None: + self.speech_channel.stop() + self.speech_channel = None + def deactivate(self): + self.stop_speech() self.active = False def activate(self): @@ -281,7 +295,7 @@ class Dialogue(Animation): self.show_all() def show_all(self): - self.speech_channel.stop() + self.stop_speech() self.text_index = len(self.full_text) self.halt() @@ -843,6 +857,7 @@ class Chemtrails(Sprite): boss.health.decrease(4) self.queue_index += 1 boss.last_attack = self.orientation + boss.sword.block() if self.queue_index == len(queue): self.timer.reset() if not boss.is_playing(boss.show_end_dialogue): @@ -1221,6 +1236,7 @@ class Boss(Animation): break self.unbrandished = copy(self.queue) self.brandish_complete = False + self.sword.reset() self.sword.play(self.sword.brandish, play_once=True) self.get_game().chemtrails.challenge() @@ -1245,9 +1261,7 @@ class Boss(Animation): elif self.level_index == 2: self.spoopy.set_frameset(0) self.player_defeated = not win - self.kills += 1 - if self.kills >= 3: - self.get_game().wipe.start(self.transition_to_title) + self.kills += not win self.play(self.show_end_dialogue, delay=3000, play_once=True) def show_end_dialogue(self): @@ -1272,7 +1286,7 @@ class Boss(Animation): def transition_to_battle(self): index = self.level_index + (not self.player_defeated) - if index < 3: + if self.kills < 3 and index < 3: self.start_level(index) else: self.get_game().reset(True) @@ -1321,63 +1335,80 @@ class Boss(Animation): self.advance_prompt.update() -class Sword(Sprite): +class Sword(Animation): def __init__(self, parent): - Sprite.__init__(self, parent) + Animation.__init__(self, parent) image = load(self.get_resource("Sword.png")).convert_alpha() - self.add_frame(image) - for angle in 270, 315, 45: - self.add_frame(rotate(image, angle)) - self.add_frameset([0], name="vertical") - self.add_frameset([1], name="horizontal") - self.add_frameset([2], name="rdiagonal") - self.add_frameset([3], name="ldiagonal") - self.set_frameset("vertical") - self.location.center = self.get_display_surface().get_rect().center + sprites = self.sprites = [] + for _ in xrange(6): + sprite = Sprite(self) + sprite.add_frame(image) + for angle in 270, 315, 45: + sprite.add_frame(rotate(image, angle)) + sprite.add_frameset([0], name="vertical") + sprite.add_frameset([1], name="horizontal") + sprite.add_frameset([2], name="rdiagonal") + sprite.add_frameset([3], name="ldiagonal") + sprite.set_frameset("vertical") + sprite.location.center = self.get_display_surface().get_rect().center + sprites.append(sprite) self.register(self.brandish, self.lower) def reset(self): self.halt(self.brandish) self.halt(self.lower) - self.hide() + self.next_index = 0 + for sprite in self.sprites: + sprite.hide() def brandish(self): - self.unhide() position = self.parent.unbrandished.pop(0) + sprite = self.sprites[self.next_index] + self.next_index += 1 + sprite.unhide() dsr = self.get_display_surface().get_rect() if position in (NS.W, NS.E): - self.set_frameset("vertical") - self.location.centery = dsr.centery - 100 + sprite.set_frameset("vertical") + sprite.location.centery = dsr.centery - 100 if position == NS.W: - self.location.centerx = dsr.centerx - 100 + sprite.location.centerx = dsr.centerx - 100 else: - self.location.centerx = dsr.centerx + 100 + sprite.location.centerx = dsr.centerx + 100 elif position in (NS.N, NS.S): - self.set_frameset("horizontal") - self.location.centerx = dsr.centerx + sprite.set_frameset("horizontal") + sprite.location.centerx = dsr.centerx if position == NS.N: - self.location.centery = dsr.centery - 200 + sprite.location.centery = dsr.centery - 200 else: - self.location.centery = dsr.centery + sprite.location.centery = dsr.centery else: if position == NS.NW: - self.set_frameset("ldiagonal") + sprite.set_frameset("ldiagonal") else: - self.set_frameset("rdiagonal") - self.location.center = dsr.centerx, dsr.centery - 100 + sprite.set_frameset("rdiagonal") + sprite.location.center = dsr.centerx, dsr.centery - 100 self.get_game().sfx["brandish"].play() self.play(self.lower, delay=400, play_once=True) if len(self.parent.unbrandished) > 0: self.play(self.brandish, delay=600, play_once=True) def lower(self): - self.hide() + # self.hide() if len(self.parent.unbrandished) == 0: + self.next_index = 0 self.parent.brandish_complete = True + def block(self): + for sprite in self.sprites: + if not sprite.is_hidden(): + sprite.hide() + break + def update(self): - Sprite.update(self) + Animation.update(self) + for sprite in reversed(self.sprites): + sprite.update() class Health(GameChild):