changeset 437:d087dfb10896

Replace menu and death screen with the starting level
author Stefano Rivera <stefano@rivera.za.net>
date Sat, 07 Sep 2013 14:26:28 +0200
parents 7079c3214d72
children b9c152fb1111
files data/levels/start nagslang/engine.py nagslang/game_object.py nagslang/level.py nagslang/protagonist.py nagslang/screens/area.py nagslang/screens/menu.py nagslang/screens/playerdied.py nagslang/world.py
diffstat 9 files changed, 63 insertions(+), 104 deletions(-) [+]
line wrap: on
line diff
--- 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:
--- 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,
--- 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):
--- 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()
--- 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():
--- 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)
--- 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()
--- 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)
--- 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