changeset 402:001c3797a63b

Editor now uses templates and the user level directory.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 17 Sep 2011 12:56:26 +0200
parents 20b424c5c1ef
children 4e9a30da79e1
files data/levels/blank.txt data/levels/templates/blank.txt mamba/__main__.py mamba/constants.py mamba/data.py mamba/gamestate.py mamba/habitats/editor.py mamba/habitats/levelmenu.py mamba/habitats/mainmenu.py mamba/habitats/userlevelmenu.py mamba/level.py
diffstat 11 files changed, 94 insertions(+), 85 deletions(-) [+]
line wrap: on
line diff
--- a/data/levels/blank.txt	Sat Sep 17 11:45:24 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-Empty Level
-lab
-test.ogg
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-X......................................X
-X......................................X
-X......................................X
-X......................................E
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-X......................................X
-XXeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/levels/templates/blank.txt	Sat Sep 17 12:56:26 2011 +0200
@@ -0,0 +1,34 @@
+Empty Level
+lab
+test.ogg
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+X......................................X
+X......................................X
+X......................................X
+X......................................E
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+X......................................X
+XXeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+end
--- a/mamba/__main__.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/__main__.py	Sat Sep 17 12:56:26 2011 +0200
@@ -7,7 +7,7 @@
 from mamba.constants import SCREEN, NAME
 from mamba.options import options, parse_args, check_args
 from mamba.engine import Engine
-from mamba.gamestate import load_state, load_levels
+from mamba.gamestate import load_state
 from mamba.sound import SoundSystem
 from mamba.habitats.mainmenu import MainMenu
 from mamba.habitats.levelmenu import LevelMenu
@@ -35,7 +35,6 @@
     pygame.display.set_caption(NAME)
 
     load_state()
-    load_levels()
 
     if options.edit:
         start = EditorHabitat(Level(options.level, 'official'))
--- a/mamba/constants.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/constants.py	Sat Sep 17 12:56:26 2011 +0200
@@ -29,7 +29,7 @@
 COLOR = 'black'
 
 # Special level directory files
-RESERVED_NAMES = ['index', 'blank']
+RESERVED_NAMES = ['index']
 
 # Directions
 UP, DOWN, LEFT, RIGHT = [(0, -1), (0, 1), (-1, 0), (1, 0)]
--- a/mamba/data.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/data.py	Sat Sep 17 12:56:26 2011 +0200
@@ -12,24 +12,28 @@
 
 import pygame
 
+from mamba.gamestate import save_path
+
 
 data_py = os.path.abspath(os.path.dirname(__file__))
 data_dir = os.path.normpath(os.path.join(data_py, '..', 'data'))
 
 
-def filepath(filename):
+def filepath(filename, is_user_dir=False):
     '''Determine the path to a file in the data directory.
     '''
     filename = os.path.join(*filename.split('/'))
+    if is_user_dir:
+        return os.path.join(save_path(filename))
     return os.path.join(data_dir, filename)
 
 
-def load_file(filename, mode='rb'):
+def load_file(filename, mode='rb', is_user_dir=False):
     '''Open a file in the data directory.
 
     "mode" is passed as the second arg to open().
     '''
-    return open(os.path.join(data_dir, filename), mode)
+    return open(filepath(filename, is_user_dir), mode)
 
 
 IMAGES = {}
@@ -66,13 +70,27 @@
     return os.path.isdir(os.path.join(data_dir, 'tiles', tileset))
 
 
-def check_level_exists(level):
+def check_level_exists(level, level_dir, is_user_dir=False):
     return os.path.isfile(os.path.join(data_dir, 'levels', '%s.txt' % level))
 
 
-def get_level_list():
-    files = [os.path.splitext(x) for x in os.listdir(filepath('levels'))]
-    return [x[0] for x in files if x[1] == '.txt']
+def get_official_levels():
+    f = open(filepath('levels/index.txt'))
+    levels = []
+    for line in f.readlines():
+        line = line.strip()
+        if line and line[0] != '#':
+            levels.append(line)
+    return levels
+
+
+def get_level_list(level_dir, is_user_dir=False):
+    level_dir = filepath(level_dir, is_user_dir)
+    if is_user_dir:
+        if not os.path.isdir(level_dir):
+            os.makedirs(level_dir)
+    files = [os.path.splitext(x) for x in os.listdir(level_dir)]
+    return [name for name, ext in files if ext == '.txt']
 
 
 def get_tileset_list():
--- a/mamba/gamestate.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/gamestate.py	Sat Sep 17 12:56:26 2011 +0200
@@ -5,7 +5,6 @@
 except ImportError:
     import simplejson as json  # pyflakes:ignore
 
-from mamba.data import filepath
 from mamba.options import options
 
 
@@ -41,19 +40,3 @@
         'done_levels': list(done_levels),
     }, f)
     f.close()
-
-
-def get_user_levels_dir():
-    levels_dir = save_path('user_levels')
-    if not os.path.isdir(levels_dir):
-        os.makedirs(levels_dir)
-    return levels_dir
-
-
-def load_levels():
-    f = open(filepath('levels/index.txt'))
-    del levels[:]
-    for line in f.readlines():
-        line = line.strip()
-        if line and line[0] != '#':
-            levels.append(line)
--- a/mamba/habitats/editor.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/habitats/editor.py	Sat Sep 17 12:56:26 2011 +0200
@@ -16,7 +16,7 @@
 from mamba.widgets.editsprite import EditSpriteBox
 from mamba.level import Level, Tileset, TILE_MAP, THING_MAP, InvalidMapError
 from mamba.data import (check_level_exists, get_level_list, get_tileset_list,
-        get_track_list)
+        get_track_list, load_file)
 from mamba.constants import (SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS,
         RESERVED_NAMES)
 
@@ -201,6 +201,8 @@
             message = MessageBox((300, 300), 'Please enter a name')
         elif self.level.level_name in RESERVED_NAMES:
             message = MessageBox((300, 300), 'Reserved level name')
+        elif '/' in self.level.level_name:
+            message = MessageBox((300, 300), 'Illegal level name')
         try:
             self.level.validate_level()
         except InvalidMapError, error:
@@ -210,32 +212,39 @@
             self.container.add(message)
             message.grab_focus()
             return
-        self.level.save_level()
+        self.level.save_level('user_levels', is_user_dir=True)
         self.refresh_display()
         return True
 
     def new(self, ev, widget):
-        self.load_level(ev, widget, 'blank')
-        return True
+        return self.load(ev, widget, 'levels', subdir='templates')
 
-    def load(self, ev, widget):
+    def load(self, ev, widget, level_dir=None, is_user_dir=False, subdir=''):
+        if level_dir is None:
+            level_dir = 'user_levels'
+            is_user_dir = True
         self.container.paused = True
-        levels = get_level_list()
+        levels = get_level_list('/'.join([level_dir, subdir]), is_user_dir)
         load_list = []
         for level_name in levels:
             if level_name in RESERVED_NAMES:
                 continue
+            if subdir:
+                level_name = '/'.join([subdir, level_name])
             load_button = TextButton((0, 0), level_name)
-            load_button.add_callback('clicked', self.load_level, level_name)
+            load_button.add_callback(
+                'clicked', self.load_level, level_name, level_dir, is_user_dir)
             load_list.append(load_button)
         load_dialog = ListBox((200, 200), 'Select Level', load_list, 6)
         self.container.add(load_dialog)
         load_dialog.grab_focus()
         return True
 
-    def load_level(self, ev, widget, level_name):
+    def load_level(self, ev, widget, level_name, level_dir, is_user_dir):
         try:
-            new_level = Level(level_name, 'official')
+            source = load_file("%s/%s.txt" % (level_dir, level_name),
+                               is_user_dir=is_user_dir)
+            new_level = Level(level_name, 'user', source.read())
         except (IOError, InvalidMapError, pygame.error), error:
             message = MessageBox((300, 300),
                     'Loading Level Failed: %s' % error, color='red')
@@ -353,7 +362,7 @@
             # importance of the reserved names means we use a different
             # message
             message = MessageBox((300, 300), 'Reserved level name')
-        elif check_level_exists(new_name):
+        elif check_level_exists(new_name, 'user_levels', is_user_dir=True):
             message = MessageBox((300, 300), 'Name already in use')
         if message:
             self.container.paused = True
--- a/mamba/habitats/levelmenu.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/habitats/levelmenu.py	Sat Sep 17 12:56:26 2011 +0200
@@ -4,7 +4,8 @@
 
 from mamba.constants import ESCAPE_KEYS
 from mamba.engine import Habitat, NewHabitatEvent
-from mamba.gamestate import levels, done_levels
+from mamba.gamestate import done_levels
+from mamba.data import get_official_levels
 from mamba.level import Level
 from mamba.widgets.base import GridContainer
 from mamba.widgets.levelbutton import LevelButton
@@ -33,7 +34,7 @@
         self.update_buttons()
 
     def list_levels(self):
-        return levels
+        return get_official_levels()
 
     def get_level(self, name):
         return Level(name, self.level_namespace)
--- a/mamba/habitats/mainmenu.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/habitats/mainmenu.py	Sat Sep 17 12:56:26 2011 +0200
@@ -52,7 +52,8 @@
 
     def edit_event(self, ev, widget):
         from mamba.habitats.editor import EditorHabitat
-        NewHabitatEvent.post(EditorHabitat(Level('dev', 'official')))
+        NewHabitatEvent.post(EditorHabitat(Level('templates/blank',
+                                                 'template')))
         return True
 
     def quit_keydown_event(self, ev, widget):
--- a/mamba/habitats/userlevelmenu.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/habitats/userlevelmenu.py	Sat Sep 17 12:56:26 2011 +0200
@@ -1,12 +1,11 @@
 """Level menu."""
 
-import os
 import urllib2
 
 from mamba.habitats.levelmenu import LevelMenu
 from mamba.level import Level
 from mamba.constants import LEVEL_SERVER
-from mamba.gamestate import get_user_levels_dir
+from mamba.data import get_level_list, load_file
 
 
 class UserLevelApi(object):
@@ -83,12 +82,8 @@
     level_namespace = "user"
 
     def list_levels(self):
-        levels_dir = get_user_levels_dir()
-        levels = [os.path.splitext(fn)[0] for fn in os.listdir(levels_dir)
-                  if fn.lower().endswith('.txt')]
-        return levels
+        return get_level_list('user_levels', is_user_dir=True)
 
     def get_level(self, name):
-        levels_dir = get_user_levels_dir()
-        source = open(os.path.join(levels_dir, name + '.txt')).read()
-        return Level(name, self.level_namespace, source)
+        source = load_file('user_levels/%s.txt' % (name,), is_user_dir=True)
+        return Level(name, self.level_namespace, source.read())
--- a/mamba/level.py	Sat Sep 17 11:45:24 2011 +0200
+++ b/mamba/level.py	Sat Sep 17 12:56:26 2011 +0200
@@ -129,9 +129,12 @@
             self.tiles = old_tiles
             self.tiles_ascii = old_tiles_ascii
 
-    def save_level(self):
+    def save_level(self, level_dir=None, is_user_dir=False):
         """Save the current state of the level"""
-        save_file = load_file('levels/%s.txt' % (self.level_name,), 'wb')
+        if level_dir is None:
+            level_dir = 'levels'
+        file_path = '%s/%s.txt' % (level_dir, self.level_name)
+        save_file = load_file(file_path, 'wb', is_user_dir=is_user_dir)
         save_file.write('%s\n' % self.name)
         save_file.write('%s\n' % self.tileset.name)
         save_file.write('%s\n' % self.background_track)