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 startAmbientSounds(self): for s in self.ambient_sounds: kind = s[0] key = s[1][0] vol = s[1][1] loop = s[1][2] fadein = s[1][3] GlobalServices.getAudioDevice().play(kind, key, vol, loop, fadein)
def switchToMainMenu(self): # Pause all things GlobalServices.getAudioDevice().stopAll() # Close and delete the temporary shelf reset_savegame() # Delete the Map cache as well MapFactory.clearMaps() # Change state self.state = STATE_MAIN_MENU self.evManager.post(GameStateChangedEvent(self.state))
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 handle(self, event): # FullscreenToggleRequestEvent if isinstance(event, FullscreenToggleRequestEvent): # Order the Game menu to check if that's possible self.gh.fullscreenToggleRequest() # InventoryToggleEvent: Order the closing of the inventory dialog elif isinstance(event, InventoryToggleEvent): GlobalServices.getAudioDevice().play(SOUND, "journal_close", VOLUME_SOUND) # Change game state self.gh.state = STATE_GAME_RUNNING self.gh.evManager.post(GameStateChangedEvent(self.gh.state)) # MouseMotionEvent: Check with the inventory if the mouse has highlighted an item elif isinstance(event, MouseMotionEvent): item = self.gh.player.inventory.checkForItemHighlight(event.object) self.gh.evManager.post(InventoryItemHighlightedEvent(item))
def tpatrium(storage, m, obj): storage._go() ad = GlobalServices.getAudioDevice() tr = GlobalServices.getTextRenderer() retval = False if storage._playerInDistance(m.getPlayer().position, obj.rect): # Key if storage._getData('atrium_open'): retval = True else: inventory = m.getPlayer().inventory if inventory.containsName(INVENTORY_ITEM_ATRIUM_KEY): storage._toggleCutscene(True) ad.play(SOUND, "pick_key", VOLUME_SOUND) tr.write("I can use the atrium key here.", 3) storage._wait(3000) key = inventory.get(INVENTORY_ITEM_ATRIUM_KEY) key.subQty(1) storage._setData('atrium_open', True) storage._toggleCutscene(False) retval = True else: ad.play(SOUND, "lockeddoor", VOLUME_SOUND) tr.write("The door to the atrium... it's locked? That's weird, it shouldn't be.", 3) storage._halt() return retval
def checkEnding(storage, m): storage._go() ad = GlobalServices.getAudioDevice() ad.stop(SOUND, 0, 'insanity_ear_ring') ad.play(SOUND, 'insanity_ear_ring', (0.02*_lastitem[1]), -1, 0) # Check if the ending has been reached if storage._getData('attic_photoseen')\ and storage._getData('attic_handseen')\ and storage._getData('attic_noteseen')\ and storage._getData('attic_gunseen')\ and storage._getData('attic_pencilseen'): storage._halt() ending(storage, m) else: # Add a random scare if necessary if _lastitem[1] % 2 == 0: white = OverlayFactory.create("noise.png", pygame.BLEND_MULT) storage._wait(1000) shadow = m.getShadow() shadow.setPosition(conv_tile_pixel((random.randrange(3,12),\ random.randrange(7,11)),m)) m.addOverlay(white) shadow.setVisible(True) ad.play(SOUND, 'noise', VOLUME_SOUND + 0.1, -1) storage._wait(300) m.removeOverlay(white) ad.stop(SOUND, 0, 'noise') shadow.setVisible(False) storage._halt()
def switch(storage, obj, m): storage._go() tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() if storage._playerInDistance(m.getPlayer().position, obj.rect): if storage._getData('guestroom_switch_pressed'): tr.write("I pulled the lever. It won't budge now.", 3) else: storage._toggleCutscene(True) tr.write("It's... a lever?", 3) storage._wait(3000) if storage._getData('guestroom_foundshelf'): tr.write("Does this do something with the hinges on that bookshelf?", 3) storage._wait(3000) ad.play(SOUND, 'pull_switch', VOLUME_SOUND) # Change graphics downswitch = os.path.join(PATH_GRAPHICS_TILES,'switch_down.png') obj.changeImage(downswitch) shelfchange = os.path.join(PATH_GRAPHICS_TILES,'shelf_atriumkey_inside.png') shelf_object = m.getObjectByName('keyshelf') shelf_object.changeImage(shelfchange, True) ad.play(SOUND, 'shelf', VOLUME_SOUND) storage._setData('guestroom_switch_pressed', True) storage._toggleCutscene(False) else: tr.write("I can't reach that from here.", 3) storage._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 __init__(self): # Initialize via superclass constructor ViewInterface.__init__(self) # Write out the logo and menu items using the TextRenderer module self.writeTexts() # Menu item highlighted by the user, or "None" self.mouseover = None # BG image self.bg = pygame.transform.smoothscale( pygame.image.load(os.path.join(PATH_GRAPHICS_SPRITES, "main_menu_bg.png")), (SCREEN_WIDTH, SCREEN_HEIGHT) ).convert() # Title image self.title = pygame.image.load(os.path.join(PATH_GRAPHICS_SPRITES, "title.png")) # Load menu stuff. First, Boolean if it is open self.loadmenu_open = False tr = GlobalServices.getTextRenderer() self.loadmenu_caption = tr.writeAsSurface("Where do you want to pick up?", COLOR_TEXT, FONTSTYLE_CAPTION) back = tr.writeAsSurface("Back", COLOR_TEXT, FONTSTYLE_CAPTION) self.menu_backbutton = (back, pygame.Rect((500, 20), back.get_rect().size)) # The list of save game folders to choose from self.loadmenu_saves = [] # New game menu stuff. Boolean if it is open self.newgame_open = False self.newgame_caption = tr.writeAsSurface( "Enter a save game name. Proceed with Enter...", COLOR_TEXT, FONTSTYLE_CAPTION ) # List of characters that make up the save game name self.newgame_name = [] self.newgame_surf = tr.writeAsSurface("_") # Play BGM self.ad = GlobalServices.getAudioDevice() self.ad.play(MUSIC, "maincredit", VOLUME_MUSIC + 0.2, -1)
def note(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect): # Cutscene toggle: Disable user input storage._toggleCutscene(True) tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() tr.deleteAll() # Overlays note = OverlayFactory.create("note_big.png") togray = OverlayFactory.create_animated_color((0,0,0), 1000, 0, True, 0, 200) m.addOverlay(note) m.addOverlay(togray) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Text of the note y = 140 ofs = 18 tr.write("Who would have done something like this?!",\ 0, COLOR_TEXT, (100, y + (ofs*0))) tr.write("My little girl... you shouldn't have had to suffer through this.",\ 0, COLOR_TEXT, (100, y + (ofs*1))) tr.write("After I found your lifeless body, I took it to your most favourite place.",\ 0, COLOR_TEXT, (100, y + (ofs*2))) tr.write("Surely you will find peace among there.",\ 0, COLOR_TEXT, (100, y + (ofs*3))) tr.write("I looked at your picture today.",\ 0, COLOR_TEXT, (100, y + (ofs*5))) tr.write("I do not know if it is just me, but your mother's expression changed.",\ 0, COLOR_TEXT, (100, y + (ofs*6))) tr.write("There she sits, to your right, and what appears to be a sole tear runs down her cheek.",\ 0, COLOR_TEXT, (100, y + (ofs*7))) tr.write("Can a painting feel emotions?",\ 0, COLOR_TEXT, (100, y + (ofs*9))) tr.write("Now I am surely being silly.",\ 0, COLOR_TEXT, (100, y + (ofs*10))) tr.write("I will miss you, big sister.",\ 0, COLOR_TEXT, (100, y + (ofs*11))) tr.write("- J",\ 0, COLOR_TEXT, (100, y + (ofs*13))) # Wait for user input storage._pauseUntilClick() GlobalServices.getEventManager().post(ObjectHighlightedEvent(None)) # Delete note overlay m.removeOverlay(note) m.removeOverlay(togray) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Delete texts tr.deleteAll() storage._toggleCutscene(False) storage._halt()
def tpmasterroom(storage, m, obj): storage._go() retval = True if not storage._getData('atrium_masterroom_firstentered'): storage._toggleCutscene(True) tr = GlobalServices.getTextRenderer() tr.write("The lever in the library has moved the shelf out of the way.", 3) storage._wait(3000) tr.write("This means that I can enter the master office.", 3) storage._wait(3000) tr.write("I'm barely awake right now. What does all of this mean?", 3) storage._wait(3000) m.getPlayer().setDirection([0,1]) m.getOverlay("_flashlight").point("down") tr.deleteAll() storage._wait(2000) m.getPlayer().setDirection([0,-1]) m.getOverlay("_flashlight").point("up") tr.write("...", 3) storage._wait(3000) storage._toggleCutscene(False) ad = GlobalServices.getAudioDevice() ad.stop(MUSIC, 5000) storage._setData('atrium_masterroom_firstentered', True) storage._halt() return retval
def tplibrary(storage, m, obj): storage._go() retval = False tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() if storage._playerInDistance(m.getPlayer().position, obj.rect): if storage._getData('library_open'): retval = True else: inventory = m.getPlayer().inventory if inventory.containsName(INVENTORY_ITEM_LIBRARY_KEY): storage._toggleCutscene(True) ad.play(SOUND, "pick_key", VOLUME_SOUND) tr.write("The library key fits into the lock.", 3) storage._wait(3000) key = inventory.get(INVENTORY_ITEM_LIBRARY_KEY) key.subQty(1) storage._setData('library_open', True) storage._toggleCutscene(False) retval = True else: ad.play(SOUND, "lockeddoor", VOLUME_SOUND) tr.write("The door is locked. 'Library' is spelt on the door frame.", 3) storage._halt() return retval
def tpstorage(storage, m, obj): storage._go() tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() inv = m.getPlayer().inventory retval = False if storage._playerInDistance(m.getPlayer().position, obj.rect): if storage._getData('storage_open'): retval = True elif inv.containsName(INVENTORY_ITEM_STORAGE_KEY): storage._toggleCutscene(True) ad.play(SOUND, "keypickup", VOLUME_SOUND) tr.write("I can use the storage key here.", 3) storage._wait(3000) key = inv.get(INVENTORY_ITEM_STORAGE_KEY) key.subQty(1) storage._setData('storage_open', True) storage._toggleCutscene(False) retval = True else: ad.play(SOUND, "lockeddoor", VOLUME_SOUND) tr.write("The storage has been locked for as long as I can remember. I have never been in there.", 4) retval = False storage._halt() return retval
def dronesound(storage, obj, m): storage._go() if storage._getData('rightwing_powershortage'): remove_from_map(storage.s, SCRIPT, m.properties['key_name'], 'dronesound') ad = GlobalServices.getAudioDevice() ad.play(SOUND, 'drone', VOLUME_SOUND_AMBIENT, 0, 1500) black = OverlayFactory.create_by_color((0,0,0), 0, 255) storage._wait(3000) m.addOverlay(black) ad.play(SOUND, '27_spark3', VOLUME_SOUND) storage._wait(50) m.removeOverlay(black) ad.play(SOUND, '27_spark1', VOLUME_SOUND) storage._wait(100) m.addOverlay(black) ad.play(SOUND, '27_spark4', VOLUME_SOUND) storage._wait(50) m.removeOverlay(black) ad.play(SOUND, '27_spark2', VOLUME_SOUND) storage._wait(1750) m.addOverlay(black) ad.play(SOUND, '27_spark1', VOLUME_SOUND) storage._wait(100) m.removeOverlay(black) ad.play(SOUND, '27_spark3', VOLUME_SOUND) storage._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 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 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 checkForObjectHighlight(self, mouseevent): if self.renderer is not None: # Translate into world coordinates mpos = mouseevent.pos wcoords = self.renderer.get_world_pos(self._cLayer, mpos[0], mpos[1]) # Check for collision with Clickable objects for obj in self.objects: if obj.rect.collidepoint(wcoords): # If the found object is not already the highlighted one, # play a "hover" sound effect and return the object. # (This way, the sound only plays once instead of infinitely) if obj is not self.highlighted_object: GlobalServices.getAudioDevice().play(SOUND, "object_hover", VOLUME_SOUND) self.highlighted_object = obj return obj self.highlighted_object = None return None
def sfx(storage, obj, m): storage._go() ad = GlobalServices.getAudioDevice() ad.play(SOUND, 'general_thunder2', VOLUME_SOUND) storage._wait(2400) ad.play(SOUND, 'general_thunder7', VOLUME_SOUND) m.removeObject(obj) storage._halt()
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 switch(storage, obj, m, index): # (Extra "index" parameter depicts the # of the switch that was triggered # from 1 (far left) to 5 (far right)) storage._go() if not storage._getData('lefthallway_puzzle_solved'): if storage._playerInDistance(m.getPlayer().position, obj.rect): ad = GlobalServices.getAudioDevice() # Initialize the persistent representation of this puzzle if it doesn't exist yet states = storage._getData('lefthallway_switches') if states is None: # -1: down, 0: middle, 1: up states = [0, 0, 0, 0, 0] # Change the state of the switch that was passed in # (subtract 1 from the index b/c computer scientists love to start at 0!) state = states[index-1] state += 1 if state > 1: state = -1 states[index-1] = state storage._setData('lefthallway_switches', states) # Change graphic for that switch if state == -1: image = 'switch_down.png' elif state == 0: image = 'switch_mid.png' else: image = 'switch_up.png' gfx = os.path.join(PATH_GRAPHICS_TILES, image) ad.play(SOUND, 'pull_switch', VOLUME_SOUND) obj.changeImage(gfx) # Solution to the switch puzzle (from left to right): # up down down up up # (The gender of the five people on the portrait # are mapped to the positioning of the switches. # The encoding of gender is hinted at in the abandoned chamber.) solution = [1, -1, -1, 1, 1] if states == solution: # Puzzle solved storage._toggleCutscene(True) ad.play(SOUND, 'doorstop3', VOLUME_SOUND) lastdir = m.getPlayer().getDirection() m.getPlayer().setDirection(string_to_direction("up-right")) storage._wait(250) ad.play(SOUND, '07_pick_lock', VOLUME_SOUND) storage._wait(500) tr = GlobalServices.getTextRenderer() tr.write("Something has happened. I think this is the correct combination.", 3) m.getPlayer().setDirection(string_to_direction(lastdir)) storage._setData('lefthallway_puzzle_solved', True) storage._toggleCutscene(False) storage._halt()
def tpupperbalcony(storage, source, obj): storage._go() retval = False tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() if storage._playerInDistance(source.getPlayer().position, obj.rect): ad.play(SOUND, "lockeddoor", VOLUME_SOUND) tr.write("The door won't budge.", 3) storage._halt() return retval
def officenote(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect): # Cutscene toggle: Disable user input storage._toggleCutscene(True) tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() tr.deleteAll() # Overlays note = OverlayFactory.create("note_big.png") togray = OverlayFactory.create_animated_color((0,0,0), 1000, 0, True, 0, 200) m.addOverlay(note) m.addOverlay(togray) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Text of the note y = 150 ofs = 18 tr.write("The doctor's said that everything is going to be fine.",\ 0, COLOR_TEXT, (100, y + (ofs*0))) tr.write("I won't give my offspring away only because your senile self",\ 0, COLOR_TEXT, (100, y + (ofs*1))) tr.write("blames everything on him! How dare you speak those insults!",\ 0, COLOR_TEXT, (100, y + (ofs*2))) tr.write("Cly has NOTHING to do with any of the disappearances of our family.",\ 0, COLOR_TEXT, (100, y + (ofs*3))) tr.write("I mean, God, why do you keep saying that?! Haven't you heard",\ 0, COLOR_TEXT, (100, y + (ofs*4))) tr.write("the inspector's words? He's innocent!",\ 0, COLOR_TEXT, (100, y + (ofs*5))) tr.write("I took your key to where you wrongfully locked my son, you monster.",\ 0, COLOR_TEXT, (100, y + (ofs*7))) tr.write("This will be hard to forgive, father.",\ 0, COLOR_TEXT, (100, y + (ofs*8))) tr.write("- M",\ 0, COLOR_TEXT, (100, y + (ofs*10))) # Wait for user input storage._pauseUntilClick() GlobalServices.getEventManager().post(ObjectHighlightedEvent(None)) # Delete note overlay m.removeOverlay(note) m.removeOverlay(togray) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Delete texts tr.deleteAll() 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 noise(storage, obj, m): storage._go() m.removeObject(obj) ad = GlobalServices.getAudioDevice() ad.play(SOUND, 'scare_whine_loop1', VOLUME_SOUND) storage._wait(1000) ad.play(SOUND, 'amb_guardian', VOLUME_SOUND_AMBIENT, -1, 3000) storage._wait(3000) ad.play(SOUND, 'scare_animal_squeal1', VOLUME_SOUND) storage._wait(4500) ad.play(SOUND, 'scare_tingeling_rev2', VOLUME_SOUND) storage._halt()
def rollCredits(storage, m): storage._go() m.rendering_enabled = False m.clearOverlays() ad = GlobalServices.getAudioDevice() tr = GlobalServices.getTextRenderer() x = 125 pos = SCREEN_HEIGHT/2 ofs = 28 ad.play(MUSIC, 'credits', VOLUME_MUSIC + 0.1) tl = OverlayFactory.create("title.png", 0) m.addOverlay(tl) storage._wait(5000) m.removeOverlay(tl) storage._wait(1000) tr.write("Created by Marcel Schnelle", 0, COLOR_TEXT, (x, pos + ofs*0), FONTSTYLE_CAPTION, False) tr.write("at California State University, Fullerton", 0, COLOR_TEXT, (x, pos + ofs*1), FONTSTYLE_CAPTION, False) tr.write("for 'Introduction to Game Design & Production'", 0, COLOR_TEXT, (x, pos + ofs*2), FONTSTYLE_CAPTION, False) tr.write("(Fall 2012)", 0, COLOR_TEXT, (x, pos + ofs*3), FONTSTYLE_CAPTION, False) storage._wait(10000) tr.deleteAll() storage._wait(1000) tr.write("Story by Anna Martje Geudert", 0, COLOR_TEXT, (x, pos + ofs*0), FONTSTYLE_CAPTION, False) storage._wait(5000) tr.deleteAll() storage._wait(1000) tr.write("Resources gathered from", 0, COLOR_TEXT, (x, pos + ofs*0), FONTSTYLE_CAPTION, False) tr.write("Celianna", 0, COLOR_TEXT, (x, pos + ofs*1), FONTSTYLE_CAPTION, False) tr.write("Enterbrain", 0, COLOR_TEXT, (x, pos + ofs*2), FONTSTYLE_CAPTION, False) tr.write("Kaz", 0, COLOR_TEXT, (x, pos + ofs*3), FONTSTYLE_CAPTION, False) tr.write("Lunarea", 0, COLOR_TEXT, (x, pos + ofs*4), FONTSTYLE_CAPTION, False) tr.write("Mack", 0, COLOR_TEXT, (x, pos + ofs*5), FONTSTYLE_CAPTION, False) storage._wait(10000) tr.deleteAll() storage._wait(1000) tr.write("And the games", 0, COLOR_TEXT, (x, pos + ofs*0), FONTSTYLE_CAPTION, False) tr.write("'Cry of Fear'", 0, COLOR_TEXT, (x, pos + ofs*1), FONTSTYLE_CAPTION, False) tr.write("'Amnesia: The Dark Descent'", 0, COLOR_TEXT, (x, pos + ofs*2), FONTSTYLE_CAPTION, False) storage._wait(7500) tr.deleteAll() storage._wait(1000) tr.write("Inspired by", 0, COLOR_TEXT, (x, pos + ofs*0), FONTSTYLE_CAPTION, False) tr.write("Mark Fischbach", 0, COLOR_TEXT, (x, pos + ofs*1), FONTSTYLE_CAPTION, False) storage._wait(7500) tr.deleteAll() storage._wait(1000) tr.write("Thanks for playing!", 0, COLOR_TEXT, (x, pos + ofs*0), FONTSTYLE_CAPTION, False) ad.stop(MUSIC, 7500) storage._wait(7500) tr.deleteAll() storage._wait(2000) storage._halt() GlobalServices.getEventManager().post(MainMenuSwitchRequestEvent())
def hintnote(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect): # Cutscene toggle: Disable user input storage._toggleCutscene(True) tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() tr.deleteAll() # Overlays note = OverlayFactory.create("note_big.png") togray = OverlayFactory.create_animated_color((0,0,0), 1000, 0, True, 0, 200) m.addOverlay(note) m.addOverlay(togray) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Text of the note y = 200 ofs = 18 tr.write("Claire:",\ 0, COLOR_TEXT, (100, y + (ofs*0))) tr.write("You know that I had to seal the master's bedroom for a reason, right?",\ 0, COLOR_TEXT, (100, y + (ofs*2))) tr.write("It is not at all because of personal disapproval or anything like that.",\ 0, COLOR_TEXT, (100, y + (ofs*3))) tr.write("Please understand that it is for our own good, and safety.",\ 0, COLOR_TEXT, (100, y + (ofs*4))) tr.write("Please do not try to unlock it. Trust me on this one.",\ 0, COLOR_TEXT, (100, y + (ofs*5))) tr.write("- J",\ 0, COLOR_TEXT, (100, y + (ofs*7))) # Wait for user input storage._pauseUntilClick() GlobalServices.getEventManager().post(ObjectHighlightedEvent(None)) # Delete note overlay m.removeOverlay(note) m.removeOverlay(togray) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Delete texts tr.deleteAll() storage._toggleCutscene(False) storage._halt()
def handle(self, event): # Handle tick and quit events first super(GameViewHandler, self).handle(event) # Map changed event: Order the current view to change the rendered map if isinstance(event, MapChangedEvent): self.v.currentView.setCurrentMap(event.object) # Object highlighted event: Notify the view to render the appropriate rectangle for the highlighted object elif isinstance(event, ObjectHighlightedEvent): self.v.currentView.setHighlightedObject(event.object) # Mouse click event. Check if the user has clicked on a region of interest elif isinstance(event, MouseClickEvent): # Get the clicked-on object clickedobj = self.v.currentView.getHighlightedObject() # If it is not none, post an object interaction event, so that the # ObjectEngine may execute the object's behaviour if clickedobj is not None: GlobalServices.getAudioDevice().play(SOUND, "object_click", VOLUME_SOUND) self.v.evManager.post(ObjectInteractionEvent(clickedobj)) # Save event. Order the current view (GameView) to capture a screenshot and save # it in the current save game's folder elif isinstance(event, SaveEvent): self.v.currentView.saveScreenshot()
def relaxnote(storage, obj, m): storage._go() if storage._playerInDistance(m.getPlayer().position, obj.rect): # Cutscene toggle: Disable user input storage._toggleCutscene(True) tr = GlobalServices.getTextRenderer() ad = GlobalServices.getAudioDevice() tr.deleteAll() # Overlays note = OverlayFactory.create("note_big.png") togray = OverlayFactory.create_animated_color((0,0,0), 1000, 0, True, 0, 200) m.addOverlay(note) m.addOverlay(togray) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Text of the note y = 150 ofs = 18 tr.write("This boy is getting out of hand!",\ 0, COLOR_TEXT, (100, y + (ofs*0))) tr.write("He seems to be less and less certifiably sane, to put it in fancy terms.",\ 0, COLOR_TEXT, (100, y + (ofs*2))) tr.write("I have locked him in his room after what he did to aunt Sophie.",\ 0, COLOR_TEXT, (100, y + (ofs*3))) tr.write("This has nothing to do with bad manners anymore, Marnie!",\ 0, COLOR_TEXT, (100, y + (ofs*4))) tr.write("The child is vile and struck by evil, I tell you. Why won't you listen to me, Marnie?",\ 0, COLOR_TEXT, (100, y + (ofs*5))) tr.write("This, this is not your child anymore. Please be reasonable and get help.",\ 0, COLOR_TEXT, (100, y + (ofs*6))) tr.write("- Harold",\ 0, COLOR_TEXT, (100, y + (ofs*8))) # Wait for user input storage._pauseUntilClick() GlobalServices.getEventManager().post(ObjectHighlightedEvent(None)) # Delete note overlay m.removeOverlay(note) m.removeOverlay(togray) # Play sound ad.play(SOUND, 'journal_page', VOLUME_SOUND) # Delete texts tr.deleteAll() storage._toggleCutscene(False) storage._halt()