# HG changeset patch # User Jeremy Thurgood # Date 1316256986 -7200 # Node ID 001c3797a63bd6d984859cfc95dbf1a06902c356 # Parent 20b424c5c1ef0a8cbe0ae6f5aea654918593dcf8 Editor now uses templates and the user level directory. diff -r 20b424c5c1ef -r 001c3797a63b data/levels/blank.txt --- 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 diff -r 20b424c5c1ef -r 001c3797a63b data/levels/templates/blank.txt --- /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 diff -r 20b424c5c1ef -r 001c3797a63b mamba/__main__.py --- 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')) diff -r 20b424c5c1ef -r 001c3797a63b mamba/constants.py --- 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)] diff -r 20b424c5c1ef -r 001c3797a63b mamba/data.py --- 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(): diff -r 20b424c5c1ef -r 001c3797a63b mamba/gamestate.py --- 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) diff -r 20b424c5c1ef -r 001c3797a63b mamba/habitats/editor.py --- 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 diff -r 20b424c5c1ef -r 001c3797a63b mamba/habitats/levelmenu.py --- 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) diff -r 20b424c5c1ef -r 001c3797a63b mamba/habitats/mainmenu.py --- 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): diff -r 20b424c5c1ef -r 001c3797a63b mamba/habitats/userlevelmenu.py --- 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()) diff -r 20b424c5c1ef -r 001c3797a63b mamba/level.py --- 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)