# HG changeset patch # User Stefano Rivera # Date 1378556788 -7200 # Node ID d087dfb10896cc72d795198efed023e50dd0d19a # Parent 7079c3214d72069c0485f5b310c68a5487ed3e61 Replace menu and death screen with the starting level diff -r 7079c3214d72 -r d087dfb10896 data/levels/start --- a/data/levels/start Sat Sep 07 14:19:31 2013 +0200 +++ b/data/levels/start Sat Sep 07 14:26:28 2013 +0200 @@ -9,15 +9,31 @@ - level1 - [300, 300] - 180 - classname: Door + classname: ContinueGameDoor - args: - [300, 125] - - '"Assessment authorisation for Pandora Station, pursuant to the ongoing claims investigation" -- just another day at the office.' + - "Assessment authorisation for Pandora Station, pursuant to the ongoing claims investigation" -- just another day at the office. classname: Note - args: - [300, 475] - 'Note to self: Practice using tools and weapons during "that time of the month". We don''t want a repeat of last time. Or the time before.' classname: Note +- args: + - [550, 475] + - Go through this door to restart the game + classname: Note + name: note_restart +- args: + - [550, 550] + - level1 + - [300, 300] + - 90 + classname: RestartGameDoor +- args: + - [650, 300] + - Go through this door to continue the game + classname: Note + name: note_continue lines: [] polygons: 1: diff -r 7079c3214d72 -r d087dfb10896 nagslang/engine.py --- a/nagslang/engine.py Sat Sep 07 14:19:31 2013 +0200 +++ b/nagslang/engine.py Sat Sep 07 14:26:28 2013 +0200 @@ -4,11 +4,10 @@ import pygame.locals as pgl from nagslang import constants -from nagslang.screens.menu import MenuScreen from nagslang.screens.area import AreaScreen -from nagslang.screens.playerdied import PlayerDiedScreen from nagslang.events import ScreenChange from nagslang.world import World +from nagslang.level import Level class Engine(object): @@ -19,14 +18,14 @@ self._dt = 1. / self._fps self._world = World() self._current_screen = None - self._screens = { - 'menu': MenuScreen, - 'dead': PlayerDiedScreen, - } + + self._screens = {} for area_name in AreaScreen.list_areas(): self._screens[area_name] = AreaScreen + starting_area = Level.game_starting_point()[0] + self._world.load() - self.change_screen('menu') + self.change_screen(starting_area) # Dummy resize event, to force us to realise our real size # http://stackoverflow.com/q/16442573/8629 pygame.event.post(pygame.event.Event(pgl.VIDEORESIZE, diff -r 7079c3214d72 -r d087dfb10896 nagslang/game_object.py --- a/nagslang/game_object.py Sat Sep 07 14:19:31 2013 +0200 +++ b/nagslang/game_object.py Sat Sep 07 14:26:28 2013 +0200 @@ -370,6 +370,18 @@ ("angle", "degrees")] +class RestartGameDoor(Door): + def _post_door_event(self, protagonist): + protagonist.world.reset() + super(RestartGameDoor, self)._post_door_event(protagonist) + + +class ContinueGameDoor(Door): + def _post_door_event(self, protagonist): + world = protagonist.world + DoorEvent.post(world.level[0], world.level[1]) + + class PuzzleDoor(BaseDoor): def __init__(self, space, position, destination, dest_pos, angle, key_state): diff -r 7079c3214d72 -r d087dfb10896 nagslang/level.py --- a/nagslang/level.py Sat Sep 07 14:19:31 2013 +0200 +++ b/nagslang/level.py Sat Sep 07 14:26:28 2013 +0200 @@ -27,6 +27,7 @@ class Level(object): + _game_starting_point = None def __init__(self, name, world): self.name = name @@ -74,9 +75,15 @@ @classmethod def game_starting_point(cls): - with resources.get_file('levels', 'meta') as f: - data = load(f) - return (data['starting_level'], data['starting_position']) + if not cls._game_starting_point: + with resources.get_file('levels', 'meta') as f: + data = load(f) + cls._game_starting_point = (data['starting_level'], + tuple(data['starting_position'])) + return cls._game_starting_point + + def is_starting_level(self): + return self.name == self.game_starting_point()[0] def load(self, space): data = self._get_data() diff -r 7079c3214d72 -r d087dfb10896 nagslang/protagonist.py --- a/nagslang/protagonist.py Sat Sep 07 14:19:31 2013 +0200 +++ b/nagslang/protagonist.py Sat Sep 07 14:26:28 2013 +0200 @@ -11,6 +11,7 @@ CMD_TOGGLE_FORM, CMD_ACTION) from nagslang.game_object import ( GameObject, Physicser, Result, Bullet, ClawAttack, make_body) +from nagslang.level import Level from nagslang.mutators import FLIP_H from nagslang.resources import resources from nagslang.events import ScreenChange @@ -340,7 +341,9 @@ # than zero health self.world.load() self.world.deaths += 1 - ScreenChange.post('dead') + level, pos = Level.game_starting_point() + self.set_position(pos) + ScreenChange.post(level) def lose_health(self, amount): if self.in_human_form(): diff -r 7079c3214d72 -r d087dfb10896 nagslang/screens/area.py --- a/nagslang/screens/area.py Sat Sep 07 14:19:31 2013 +0200 +++ b/nagslang/screens/area.py Sat Sep 07 14:26:28 2013 +0200 @@ -8,7 +8,7 @@ COLLISION_TYPE_WALL, COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS, COLLISION_TYPE_FURNITURE, COLLISION_TYPE_WEREWOLF_ATTACK, CMD_TOGGLE_FORM, CMD_ACTION) -from nagslang.events import ScreenChange, DoorEvent +from nagslang.events import ScreenChange, DoorEvent, QuitEvent from nagslang.level import Level from nagslang.screens.base import Screen from nagslang.sound import sound @@ -84,6 +84,7 @@ self.keys = ControlKeys() self._level = Level(self.name, self.world) self._level.load(self.space) + self.game_starting_point = Level.game_starting_point() self._drawables = Drawables() self.add_walls() self._add_collision_handlers() @@ -161,7 +162,16 @@ def handle_event(self, ev): if ev.type == pygame.locals.KEYDOWN: if ev.key == pygame.locals.K_ESCAPE: - ScreenChange.post('menu') + if self._level.is_starting_level(): + QuitEvent.post() + return + room, pos = self.game_starting_point + self.world.load() + self.world.deaths += 1 + ScreenChange.post(room) + self.protagonist.set_position(pos) + self._disable_render = True + return cmd_key = self.keys.get_command_key(ev.key) if cmd_key is not None: self.protagonist.handle_keypress(cmd_key) diff -r 7079c3214d72 -r d087dfb10896 nagslang/screens/menu.py --- a/nagslang/screens/menu.py Sat Sep 07 14:19:31 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -"""Display a menu screen.""" - -import pygame - -from nagslang.screens.base import Screen -from nagslang.events import QuitEvent, ScreenChange -from nagslang.widgets.text import TextWidget, MultiLineWidget - - -class MenuScreen(Screen): - def setup(self): - # Position is hacked later - self.cursor = TextWidget((0, 0), u'\N{Rightwards Arrow}', - colour='red') - self.cursor_pos = 0 - self.options = [ - self.play, - self.restart, - self.quit, - ] - self.widgets = [ - TextWidget((10, 10), 'Menu', fontsize=20), - TextWidget((40, 50), 'Play the game'), - TextWidget((40, 70), 'Start the game from the beginning again'), - TextWidget((40, 90), 'Quit'), - MultiLineWidget((60, 120), self.world.get_formatted_stats()), - self.cursor, - ] - - def handle_event(self, ev): - if ev.type == pygame.locals.KEYDOWN: - if ev.key == pygame.locals.K_ESCAPE: - self.quit() - elif ev.key == pygame.locals.K_DOWN: - self.cursor_pos = (self.cursor_pos + 1) % len(self.options) - elif ev.key == pygame.locals.K_UP: - self.cursor_pos = (self.cursor_pos - 1) % len(self.options) - elif ev.key == pygame.locals.K_RETURN: - self.options[self.cursor_pos]() - - def render(self, surface): - surface.fill(pygame.color.Color(255, 255, 255)) - self.cursor.pos = (10, 50 + 20 * self.cursor_pos) - self.cursor.rect.top = self.cursor.pos[1] - for widget in self.widgets: - widget.draw(surface) - - def play(self): - level_name, pos = self.world.level - self.world.protagonist.set_position(tuple(pos)) - self.world.protagonist.reset() - ScreenChange.post(level_name) - - def restart(self): - self.world.reset() - self.world.save() - self.setup() - - def quit(self): - QuitEvent.post() diff -r 7079c3214d72 -r d087dfb10896 nagslang/screens/playerdied.py --- a/nagslang/screens/playerdied.py Sat Sep 07 14:19:31 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -"""Display a menu screen.""" - -import pygame - -from nagslang.screens.base import Screen -from nagslang.events import ScreenChange -from nagslang.widgets.text import TextWidget, MultiLineWidget - - -class PlayerDiedScreen(Screen): - def setup(self): - # Position is hacked later - self.widgets = [ - TextWidget((10, 10), 'You Died!', fontsize=20), - TextWidget((40, 70), 'Press escape to return to the menu.'), - MultiLineWidget((60, 120), self.world.get_formatted_stats()), - ] - - def handle_event(self, ev): - if ev.type == pygame.locals.KEYDOWN: - if ev.key == pygame.locals.K_ESCAPE: - self.world.protagonist.reset() - self.world.protagonist.set_position((350, 300)) - ScreenChange.post('menu') - - def render(self, surface): - surface.fill(pygame.color.Color(255, 255, 255)) - for widget in self.widgets: - widget.draw(surface) diff -r 7079c3214d72 -r d087dfb10896 nagslang/world.py --- a/nagslang/world.py Sat Sep 07 14:19:31 2013 +0200 +++ b/nagslang/world.py Sat Sep 07 14:26:28 2013 +0200 @@ -68,6 +68,7 @@ with open(fn) as f: data = load(f) data['inventory'] = set(data['inventory']) + data['level'] = (data['level'][0], tuple(data['level'][1])) self.__dict__['_data'].update(data) return True