def relaxlever(storage, obj, m): storage._go() if not storage._getData('library_relaxlever_pressed')\ and storage._playerInDistance(m.getPlayer().position, obj.rect): ad = GlobalServices.getAudioDevice() ad.play(SOUND, 'pull_switch', VOLUME_SOUND) # Change graphics downswitch = os.path.join(PATH_GRAPHICS_TILES,'switch_down.png') obj.changeImage(downswitch) shelf = m.getObjectByName('shelf') ad.play(SOUND, 'shelf', VOLUME_SOUND) # Re-position the shelf m.removeObject(shelf, True) add_to_map(get_savegame(), OBJECT, 'libraryupstairs', 'shelf',\ pygame.Rect(conv_tile_pixel((47,10), m), conv_tile_pixel((4,6), m)),\ 'libraryupstairs_shelf', 'bigshelf_four.png', True) # Add the next lever (that was behind the moved shelf) add_to_map(get_savegame(), OBJECT, 'libraryupstairs', 'officelever',\ pygame.Rect(conv_tile_pixel((45,11), m), conv_tile_pixel((1,2), m)),\ 'libraryupstairs_officelever', 'switch_up.png', True) storage._accessData() storage._setData('library_relaxlever_pressed', True) storage._halt()
def initMapLoading(self, name): # Check if there are MapProperties for this map by looking into the # savegame dict object. shelf = get_savegame() try: # Dictionary of saved map properties saveds = shelf['saved_maps'] # Properties of this particular map properties = saveds[name] except KeyError: # No properties found properties = None # If this map hasn't been loaded yet, do so and place it inside the map dict if not MapFactory.mapAlreadyLoaded(name): # Map is loading. Change game state and notify other controllers # that a loading process is going on right now self.state = STATE_GAME_MAP_LOADING self.evManager.post(GameStateChangedEvent(self.state)) MapFactory.loadMap(name, properties) else: # If it has already been loaded, change the map on your own # (no need for a 1-frame loading screen, amirite?) m = MapFactory.getMap(name) if properties is not None: m.setInteractives(properties.scripts, properties.objects) method = m.init_method self.changeMap(m, method)
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 save(self, disp=False): # Get the savegame data temp = get_savegame() # Open the "real" shelf (the one the player can load up again)! save = shelve.open(CURRENT_SHELF_FILENAME[0]) # Save persistent data that needs to be stored in order to retrieve the game state. # All data that is used to do that is actually the player's current position, # the current map where this position applies, and the currently playing background # music. # Pre-defined keys for the dict save['player_position'] = self.player.position save['current_map'] = self.currentmap.properties['key_name'] save['player_inventory'] = self.player.inventory save['current_sounds'] = GlobalServices.getAudioDevice().getPlayingSounds() temp['global_overlays'] = get_global_overlays() # Update the persistent map properties for the current map update_persistent_map_properties(self.currentmap, temp) # Copy the rest of the shelf data to the "correct" save file copy_to_shelve(temp, save) # Close the shelves again; that's it! save.close() if disp: # Display the optional success message using the TextRenderer module tr = GlobalServices.getTextRenderer() tr.write("Game saved.", 3)
def officelever(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect): if not storage._getData('library_officelever_pressed'): storage._toggleCutscene(True) ad = GlobalServices.getAudioDevice() ad.play(SOUND, 'pull_switch', VOLUME_SOUND) # Change graphics for this lever downswitch = os.path.join(PATH_GRAPHICS_TILES,'switch_down.png') obj.changeImage(downswitch) # Grab the shelf in atrium.tmx and delete it remove_object_from_map_properties(get_savegame(), 'atrium',\ OBJECT, 'mastershelf', True) # Add the TeleportClickable to that map from src.model.Clickable import TeleportClickable, Clickable tele = TeleportClickable('tpmasterroom',\ pygame.Rect(conv_tile_pixel((24, 4), m),\ conv_tile_pixel( (2, 3), m)),\ None, 'atrium_tpmasterroom', 'doormove6',\ 'masterroom', 32*16, 35*16) add_object_to_map_properties(get_savegame(), 'atrium',\ TELEPORTOBJECT, tele) # Add vandalized painting image painting = get_object_from_map_properties(get_savegame(), 'librarydownstairs','painting') vandalized = os.path.join(PATH_GRAPHICS_TILES, 'vandalizedpainting.png') painting.changeImage(vandalized) update_object_in_map_properties(get_savegame(), 'librarydownstairs', painting) # Add new wall texts on this map and librarydownstairs.tmx add_to_map(get_savegame(), OBJECT, 'libraryupstairs', 'message',\ pygame.Rect(conv_tile_pixel((43,36), m), conv_tile_pixel((14,5), m)),\ 'libraryupstairs_message', 'message_3.png', True) # Add the scare script add_to_map(get_savegame(), SCRIPT, 'libraryupstairs', 'scare',\ pygame.Rect(conv_tile_pixel((38,14), m), conv_tile_pixel((1,6), m)),\ 'libraryupstairs_scare') message4path = os.path.join(PATH_GRAPHICS_TILES, 'message_4.png') message4 = pygame.image.load(message4path).convert_alpha() othermsg = Clickable('message', pygame.Rect(conv_tile_pixel((22,18), m),\ conv_tile_pixel((6,6), m)),\ 'librarydownstairs_message', None, message4, message4path) add_object_to_map_properties(get_savegame(), 'librarydownstairs',\ OBJECT, othermsg) # Toggle this event as "happened" storage._setData('library_officelever_pressed', True) storage._toggleCutscene(False) storage._halt()
def librarykey(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect): tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() ad.play(SOUND, 'pick_key', VOLUME_SOUND) tr.write("Got 'Library Key'", 3, COLOR_GOT_ITEM) m.getPlayer().inventory.add(ItemFactory.create(INVENTORY_ITEM_LIBRARY_KEY, 1)) remove_from_map(get_savegame(), OBJECT, 'mirrorhall', 'librarykey') storage._setData('librarykey_obtained', True) storage._halt()
def newgame(self, name): # Delete the current shelf (if any) self.gh.deleteSavegame(name) # Create a shelf file handle using the given name set_shelf(name) # Initialize an empty dictionary for the saved map properties shelf = get_savegame() shelf['saved_maps'] = {} # Fadeout music GlobalServices.getAudioDevice().stop(AudioDevice.MUSIC, FADEOUT_TIME) # Set the player's start position self.gh.player.setPosition((240, 208)) # Initialize the map loading of the first map self.gh.initMapLoading("bedroom")
def ceilingdoor(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect, 180): GlobalServices.getEventManager().post(ObjectHighlightedEvent(None)) inv = m.getPlayer().inventory tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() storage._toggleCutscene(True) if inv.containsName(INVENTORY_ITEM_LADDER): m.getPlayer().setPosition(conv_tile_pixel((9,15), m)) # Add ladder to this map ad.play(SOUND, '05_attach_ladder', VOLUME_SOUND) from src.model.Clickable import TeleportClickable ladderpath = os.path.join(PATH_GRAPHICS_TILES, 'ladder_vertical.png') laddersurf = pygame.image.load(ladderpath).convert_alpha() ladder = TeleportClickable('tpattic',\ pygame.Rect(conv_tile_pixel((9, 7), m),\ conv_tile_pixel( (2, 7), m)),\ m, None, 'ladder_climb',\ 'attic', 8*16, 17*16, laddersurf,\ ladderpath, True) add_object_to_map_properties(get_savegame(), 'masterroom',\ TELEPORTOBJECT, ladder) remove_from_map(get_savegame(), OBJECT, 'masterroom', 'ceilingdoor') # Reset player blah inv.remove(inv.get(INVENTORY_ITEM_LADDER)) else: tr.write("There is a loft hatch on the ceiling.", 3) storage._wait(3000) tr.write("I need something to get up there.", 3) if not storage._getData('masterroom_ladder_needed'): storage._wait(3000) ad.play(MUSIC, 'bgm_3', VOLUME_MUSIC, -1) storage._setData('masterroom_ladder_needed', True) storage._toggleCutscene(False) storage._halt()
def ladder(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect): tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() if storage._getData('masterroom_ladder_needed'): storage._toggleCutscene(True) tr.write("This ladder should get me up through that loft hatch.", 3) storage._wait(3000) inv = m.getPlayer().inventory inv.add(ItemFactory.create(INVENTORY_ITEM_LADDER, 1)) remove_from_map(get_savegame(), OBJECT, 'rightwing', 'ladder') ad.play(SOUND, 'pick_item', VOLUME_SOUND) tr.write("Got 'Ladder'", 3, COLOR_GOT_ITEM) storage._toggleCutscene(False) GlobalServices.getEventManager().post(ObjectHighlightedEvent(None)) else: tr.write("There is a ladder on the ground. I have no purpose for that right now.", 3) storage._halt()
def leftroomopening(storage, obj, m): storage._go() tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() if storage._getData('flashlight_obtained'): m.getPlayer().stopMoving() storage._toggleCutscene(True) ad.play(SOUND, 'doorclose', VOLUME_SOUND_AMBIENT) storage._wait(1000) tr.write("That noise came from across the hallway. Was it a door opening?", 3) storage._wait(1500) remove_from_map(get_savegame(), SCRIPT, 'righthallway', 'righthallway_leftroomopening') storage._toggleCutscene(False) storage._halt()
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 flashlight(storage, obj, m): storage._go() tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() storage._faceObject(m.getPlayer(), obj) if not storage._playerInDistance(m.getPlayer().position, obj.rect): tr.write("I can't reach that from here.", 3) else: # Bed scare sequence done if storage._getData('bedroom_bedscare_done'): # Add the flashlight to the inventory m.getPlayer().inventory.add(\ ItemFactory.create(INVENTORY_ITEM_FLASHLIGHT, 1)) ad.play(SOUND, 'pick_item', VOLUME_SOUND) tr.write("Got 'Flashlight'", 3, COLOR_GOT_ITEM) # Delete the note from the map m.removeObject(obj) remove_from_map(get_savegame(), OBJECT, 'bedroom', 'bedroom_flashlight') # Set a flag that this script was executed storage._setData('flashlight_obtained', True) # Add the global flashlight overlay, deleting the others flashlight = OverlayFactory.create_flashlight() set_global_overlays([flashlight]) # Add the overlay to this map, too m.clearOverlays() m.addOverlay(flashlight) ad.play(SOUND, 'flashlight_toggle', VOLUME_SOUND) ad.stop(SOUND, 1500, 'insanity_bug3') else: storage._toggleCutscene(True) tr.write("Sometimes I need my flashlight when the power tends to get all freaky.", 3) storage._wait(3000) tr.write("I don't know if that's because the mansion is just old or haunted, though.", 3) storage._toggleCutscene(False) storage._halt()
def load(self, name): # Point the shelf to be used to the additional argument set_shelf(name) # Open the save game shelf s = shelve.open(CURRENT_SHELF_FILENAME[0], "w") # Open the savegame dict s2 = get_savegame() # Set global overlays set_global_overlays(s['global_overlays']) # Copy shelf data to temp dict: exclude persistent stuff # that does not refer to "what the player has done gameplay-wise" copy_to_dict(s, s2, SHELF_PERSISTENT_KEYS) # Fadeout the (menu) music GlobalServices.getAudioDevice().stop(AudioDevice.MUSIC, FADEOUT_TIME) # Set persistently stored information like position and inventory self.gh.player.setPosition(s['player_position']) self.gh.player.setInventory(s['player_inventory']) # Re-play the saved ambient sounds and music GlobalServices.getAudioDevice().playList(s['current_sounds']) # Load the last map # Initialize the loading of testmap (for now) self.gh.initMapLoading(s['current_map']) # Finally, close the shelf again. s.close()
def powercutshort(storage, obj, m): storage._go() ad = GlobalServices.getAudioDevice() tr = GlobalServices.getTextRenderer() if storage._getData('entrancenote_obtained')\ and not storage._getData('rightwing_powershortage'): storage._toggleCutscene(True) p = m.getPlayer() p.stopMoving() storage._setData('rightwing_powershortage', True) ad.play(SOUND, 'drone', VOLUME_SOUND) ad.play(SOUND, 'elec', VOLUME_SOUND) black = OverlayFactory.create_by_color((0,0,0), 0, 255) m.addOverlay(black) storage._wait(1000) m.removeOverlay(black) ad.play(SOUND, '27_spark1', VOLUME_SOUND) storage._wait(100) m.addOverlay(black) storage._wait(1500) m.removeOverlay(black) ad.play(SOUND, '27_spark2', VOLUME_SOUND) storage._wait(50) m.addOverlay(black) storage._wait(20) m.removeOverlay(black) ad.play(SOUND, '27_spark4', VOLUME_SOUND) storage._wait(30) m.addOverlay(black) storage._wait(50) ad.play(SOUND, '27_spark3', VOLUME_SOUND) m.removeOverlay(black) storage._wait(400) m.addOverlay(black) storage._wait(20) m.removeOverlay(black) ad.play(SOUND, '27_spark4', VOLUME_SOUND) storage._wait(30) m.addOverlay(black) ad.play(SOUND, '27_spark3', VOLUME_SOUND) storage._wait(50) fadein = OverlayFactory.create_animated_color((0,0,0), 3000, 0, True, 255, 155) storage._wait(600) m.removeOverlay(black) m.addOverlay(fadein) storage._wait(3000) tr.write("What was that? A... power shortage?", 3) storage._wait(500) p.setDirection([1,0]) storage._wait(500) p.setDirection([1,1]) storage._wait(500) p.setDirection([-1,0]) storage._wait(500) p.setDirection([1,0]) storage._wait(500) p.setDirection([0,-1]) storage._wait(500) tr.write("Keep going, Clyde... it's nothing.", 3) remove_from_map(get_savegame(), SCRIPT, 'rightwing', 'rightwing_powercutshort') add_global_overlay(OverlayFactory.create_by_color((0,0,0), 0, 155)) storage._toggleCutscene(False) storage._halt()
def ending(storage, m): storage._go() GlobalServices.getEventManager().post(ObjectHighlightedEvent(None)) storage._toggleCutscene(True) storage._wait(3000) white = OverlayFactory.create("noise.png", pygame.BLEND_MULT) def static(ms): m.addOverlay(white) ad.play(SOUND, 'noise', VOLUME_SOUND + 0.1, -1) storage._wait(ms) m.removeOverlay(white) ad.stop(SOUND, 0, 'noise') tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() tr.write("W-w-what am I supposed to do now?", 3) storage._wait(1400) static(340) storage._wait(1600) tr.write("I lose track of the sharp edges around me...", 3) storage._wait(2000) towhite = OverlayFactory.create_animated_color((255,255,255),\ 1000, 0, True, 0, 255) m.addOverlay(towhite) storage._wait(1500) player = m.getPlayer() player.setPosition(conv_tile_pixel((8,9), m)) player.setAnimation("kneel") storage._wait(400) fadeout = OverlayFactory.create_animated_color((255,255,255),\ 1000, 0, True, 255, 0) m.addOverlay(fadeout) m.removeOverlay(towhite) storage._wait(3000) tr.write("Did I...", 3) player.setAnimation("walk") storage._wait(800) static(200) storage._wait(600) static(40) storage._wait(600) static(1000) storage._wait(2500) player.setDirection([0,-1]) storage._wait(500) tr.write("It was... me..?", 3) storage._wait(1000) static(500) storage._wait(3000) static(100) storage._wait(1000) ad.play(SOUND, 'pick_item', VOLUME_SOUND) remove_from_map(get_savegame(), OBJECT, 'attic', 'gun') tr.write("I should...", 3) storage._wait(3000) toblack = OverlayFactory.create_animated_color((0,0,0), 2500, 0, True, 0, 255) m.addOverlay(toblack) ad.stop(SOUND, 2750, 'insanity_ear_ring') ad.stop(MUSIC, 2750) storage._wait(3500) ad.play(SOUND, 'gun_cock', VOLUME_SOUND) storage._wait(3500) storage._halt() rollCredits(storage, m)
def _accessData(self): self.s = get_savegame() self.shelfopen = True
def scare(storage, obj, m): storage._go() ad = GlobalServices.getAudioDevice() tr = GlobalServices.getTextRenderer() storage._toggleCutscene(True) # Force the flashlight to point to the right player = m.getPlayer() player.stopMoving() fl = m.getOverlay("_flashlight") # Helper function for looking in a direction def face(direction): fl.point(direction) player.setDirection(string_to_direction(direction)) face("right") # Overlay creation red = OverlayFactory.create_by_color((170, 0, 0), 0, 50) black = OverlayFactory.create_by_color((0, 0, 0), 0, 210) # Show the figure ad.play(SOUND, 'scare_wood_creak_walk2', VOLUME_SOUND) ad.play(SOUND, '24_amb_noise', VOLUME_SOUND_AMBIENT, -1) shadow = m.getShadow() shadow.setPosition(conv_tile_pixel((43, 8), m)) m.addOverlay(red) shadow.setVisible(True) shadow.moveBy((0, 100), 5000) storage._wait(1000) ad.stop(SOUND, 0, '24_amb_noise') ad.play(SOUND, '27_spark3', VOLUME_SOUND) ad.play(SOUND, 'scare_tingeling', VOLUME_SOUND, 0, 1000) m.addOverlay(black) m.removeOverlay(red) shadow.setVisible(False) shadow.setPosition(conv_tile_pixel((43, 14), m)) storage._wait(2000) ad.play(SOUND, 'scare_wood_creak_walk3', VOLUME_SOUND) ad.play(SOUND, 'insanity_baby_cry2', VOLUME_SOUND) ad.play(SOUND, '27_orb_implode', VOLUME_SOUND) ad.play(SOUND, '24_amb_noise', VOLUME_SOUND_AMBIENT, -1) m.addOverlay(red) m.removeOverlay(black) shadow.setVisible(True) shadow.moveBy((-75, 0), 7500) storage._wait(2500) ad.stop(SOUND, 1750, '24_amb_noise') ad.play(SOUND, '27_spark4', VOLUME_SOUND) ad.play(SOUND, 'scare_male_terrified5', VOLUME_SOUND) m.addOverlay(black) m.removeOverlay(red) shadow.setVisible(False) add_to_map(get_savegame(), OBJECT, 'atrium', 'message',\ pygame.Rect(conv_tile_pixel((29,7), m), conv_tile_pixel((8,4), m)),\ 'atrium_message', 'message_1.png', True) storage._wait(1000) m.removeOverlay(black) tr.write("What in the world was that thing?!", 2) face("left") storage._wait(250) face("up-right") storage._wait(250) face("right") storage._wait(100) face("right-down") storage._wait(250) face("right") storage._wait(1150) tr.write("Where did it go?", 2) storage._wait(2000) face("up") tr.write("Did it write... this?", 3) storage._wait(3000) face("right") m.removeObject(obj) storage._toggleCutscene(False) remove_from_map(get_savegame(), OBJECT, 'atrium', 'blockingshelf') storage._setData('atrium_scaredone', True) add_to_map(get_savegame(), OBJECT, 'atrium', 'blockingshelf',\ pygame.Rect(conv_tile_pixel((11,25), m), conv_tile_pixel((2,8), m)),\ 'atrium_blockingshelf', 'bigshelf_right.png', True) storage._halt()