This commit is contained in:
Frank DeMarco 2018-01-02 20:26:30 -05:00
parent c84db0d152
commit 6510026050
1 changed files with 62 additions and 31 deletions

93
NS.py
View File

@ -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):