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