def teleport(self, source, obj, target, destination): self._go() if self._playerInDistance(source.getPlayer().position, obj.rect): # Play the sound of this TeleportClickable object # (if there is one; could be a door squeaking etc) if hasattr(obj, 'sound'): GlobalServices.getAudioDevice().play(SOUND, obj.sound, 0.8) self.teleport_in_progress = True set_property(PLAYER_MOVEMENT_ENABLED, False) # Save the state of the current map's properties to the persistent shelf # before teleporting to the new map update_persistent_map_properties(source, get_savegame()) dur = 1000 fadeout = OverlayFactory.create_animated_color((0,0,0), dur, 0, True, 0, 255) source.addOverlay(fadeout) self._wait(dur) source.rendering_enabled = False GlobalServices.getEventManager().post(MapChangeRequestEvent((target, destination))) source.removeOverlay(fadeout) source.flushOverlayQueue() set_property(PLAYER_MOVEMENT_ENABLED, True) self.teleport_in_progress = False self._halt()
def note(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect): _lastitem[0] = "note" _lastitem[1] += 1 storage._toggleCutscene(True) ad = GlobalServices.getAudioDevice() # Overlays note = OverlayFactory.create("note_big.png") text = OverlayFactory.create("lastnote.png") m.addOverlay(note) m.addOverlay(text) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Wait for user input storage._pauseUntilClick() # Delete note overlay m.removeOverlay(note) m.removeOverlay(text) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) storage._toggleCutscene(False) set_property(SAVE_ENABLED, False) storage._setData('attic_noteseen', True) storage._halt() checkEnding(storage, m)
def init(storage, m): storage._go() storage._toggleCutscene(True) ad = GlobalServices.getAudioDevice() tr = GlobalServices.getTextRenderer() ad.stop(MUSIC, 5000) ad.stop(SOUND, 5000, 'amb_guardian') # Make the overlay darktrans = OverlayFactory.create_animated_color((20,0,0),\ 5000, 0, True, 0, 220) dark = OverlayFactory.create_by_color((20,0,0), 0, 220) fog = OverlayFactory.create("fog.png", pygame.BLEND_MULT) white = OverlayFactory.create("noise.png", pygame.BLEND_MULT) m.clearOverlays() m.addOverlay(darktrans) m.addOverlay(fog) player = m.getPlayer() shadow = m.getShadow() shadow.setPosition(conv_tile_pixel((8,10),m)) player.setDirection([0,-1]) player.halfSpeed() # Here be dragons storage._wait(5000) m.rendering_enabled = True m.addOverlay(dark) m.removeOverlay(darktrans) ad.play(MUSIC, 'bgm_4', VOLUME_MUSIC, -1) ad.play(SOUND, 'flashlight_toggle', VOLUME_SOUND) storage._wait(2000) tr.write("What is this place?", 3) storage._wait(3000) tr.write("It feels... strangely familiar.", 3) storage._wait(2000) ad.play(SOUND, 'noise', VOLUME_SOUND_AMBIENT + 0.3, -1) m.addOverlay(white) shadow.setVisible(True) storage._wait(300) m.removeOverlay(white) ad.stop(SOUND, 0, 'noise') shadow.setVisible(False) shadow.setPosition(conv_tile_pixel((8,12),m)) storage._wait(1500) m.addOverlay(white) ad.play(SOUND, 'noise', VOLUME_SOUND_AMBIENT + 0.3, -1) shadow.setVisible(True) shadow.moveBy((0, 15), 500) storage._wait(450) m.removeOverlay(white) ad.stop(SOUND, 0, 'noise') shadow.setVisible(False) storage._toggleCutscene(False) set_property(SAVE_ENABLED, False) storage._halt()
def _pauseUntilClick(self): # Set global property that enables the extra behaviour of InputController set_property(CURRENTLY_PAUSING_FOR_CLICK, True) self.waiting = True clicked = False while not clicked: if self.interrupted: raise Storage.Break() pygame.time.wait(self.timestep) # InputController re-sets this flag, so # this loop will notice when it changed if not get_property(CURRENTLY_PAUSING_FOR_CLICK): clicked = True self.waiting = False
def pencil(storage, obj, m): storage._go() tr = GlobalServices.getTextRenderer() if storage._playerInDistance(m.getPlayer().position, obj.rect): _lastitem[0] = "pencil" _lastitem[1] += 1 storage._toggleCutscene(True) if not storage._getData('attic_pencilseen'): tr.write("What appears to be a red marker lies on the table.", 3) storage._wait(3000) tr.write("The messages surely have been written using this marker.", 3) storage._toggleCutscene(False) set_property(SAVE_ENABLED, False) storage._setData('attic_pencilseen', True) storage._halt() checkEnding(storage, m)
def gun(storage, obj, m): storage._go() tr = GlobalServices.getTextRenderer() if storage._playerInDistance(m.getPlayer().position, obj.rect): _lastitem[0] = "gun" _lastitem[1] += 1 storage._toggleCutscene(True) if not storage._getData('attic_handseen'): tr.write("In the center of the table's surface, there is a handgun.", 3) storage._wait(3000) tr.write("It looks like it has been used several times.", 3) else: tr.write("The handgun looks like it has been used several times.", 3) storage._toggleCutscene(False) set_property(SAVE_ENABLED, False) storage._setData('attic_gunseen', True) storage._halt() checkEnding(storage, m)
def hand(storage, obj, m): storage._go() tr = GlobalServices.getTextRenderer() if storage._playerInDistance(m.getPlayer().position, obj.rect): _lastitem[0] = "hand" _lastitem[1] += 1 storage._toggleCutscene(True) if not storage._getData('attic_handseen'): tr.write("There is an imprint of a hand on the wall, drained in paint.", 3) storage._wait(3000) tr.deleteAll() storage._wait(1500) tr.write("...My right hand is a perfect match to the imprint.", 3) storage._toggleCutscene(False) set_property(SAVE_ENABLED, False) storage._setData('attic_handseen', True) storage._halt() checkEnding(storage, m)
def teleport(self, source, target, destination): self._go() self.teleport_in_progress = True set_property(PLAYER_MOVEMENT_ENABLED, False) # Save the state of the current map's properties to the persistent shelf # before teleporting to the new map update_persistent_map_properties(source, get_savegame()) dur = 1000 fadeout = OverlayFactory.create_animated_color((0,0,0), dur, 0, True, 0, 255) source.addOverlay(fadeout) self._wait(dur) source.rendering_enabled = False GlobalServices.getEventManager().post(MapChangeRequestEvent((target, destination))) set_property(PLAYER_MOVEMENT_ENABLED, True) source.removeOverlay(fadeout) self.teleport_in_progress = False self._halt()
def photo(storage, obj, m): storage._go() tr = GlobalServices.getTextRenderer() if storage._playerInDistance(m.getPlayer().position, obj.rect, 100): _lastitem[0] = "photo" _lastitem[1] += 1 storage._toggleCutscene(True) if not storage._getData('attic_photoseen'): tr.write("I know this photo. It was taken two years ago.", 3) storage._wait(3000) photo = OverlayFactory.create("photo.png", 0) m.addOverlay(photo, 0) tr.write("My family... everyone has been crossed out with the same red paint I've seen everywhere.", 4) storage._pauseUntilClick() m.removeOverlay(photo) storage._toggleCutscene(False) set_property(SAVE_ENABLED, False) storage._setData('attic_photoseen', True) storage._halt() checkEnding(storage, m)
def _toggleCutscene(self, enabled): # Set the "CUTSCENE RUNNING" property to the given value. # Afterwards, invert the given value and therefore disable some things. set_property(CUTSCENE_RUNNING, enabled) # If this parameter is True, there is a cutscene # which DISABLES these properties. That's why # this next line makes sense enabled = not enabled set_property(PLAYER_MOVEMENT_ENABLED, enabled) set_property(MOUSE_HIGHLIGHT_ENABLED, enabled) set_property(INVENTORY_OPEN_ENABLED, enabled) set_property(GAME_MENU_OPEN_ENABLED, enabled) set_property(SAVE_ENABLED, enabled) set_property(FLASHLIGHT_MOVEMENT_ENABLED, enabled)
# CS 386