# HG changeset patch # User Jeremy Thurgood # Date 1316251698 -7200 # Node ID 12d67f69e6b2f3c98ec2bc62165cc043648f6609 # Parent 11ee864cd3e3653082b039a8830620845623d29d Support for user levels. diff -r 11ee864cd3e3 -r 12d67f69e6b2 mamba/gamestate.py --- a/mamba/gamestate.py Sat Sep 17 11:02:37 2011 +0200 +++ b/mamba/gamestate.py Sat Sep 17 11:28:18 2011 +0200 @@ -13,6 +13,10 @@ done_levels = set() +def save_path(path): + return os.path.join(options.save_location, *path.split('/')) + + def level_done(level_name): done_levels.add(level_name) save_state() @@ -20,7 +24,7 @@ def load_state(): done_levels.clear() - fn = os.path.join(options.save_location, 'gamestate.json') + fn = save_path('gamestate.json') if os.access(fn, os.R_OK): f = open(fn, 'r') state = json.load(f) @@ -29,7 +33,7 @@ def save_state(): - fn = os.path.join(options.save_location, 'gamestate.json') + fn = save_path('gamestate.json') if not os.path.isdir(options.save_location): os.makedirs(options.save_location) f = open(fn, 'w') @@ -39,6 +43,13 @@ 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[:] diff -r 11ee864cd3e3 -r 12d67f69e6b2 mamba/habitats/mainmenu.py --- a/mamba/habitats/mainmenu.py Sat Sep 17 11:02:37 2011 +0200 +++ b/mamba/habitats/mainmenu.py Sat Sep 17 11:28:18 2011 +0200 @@ -25,6 +25,9 @@ userlevels = TextButton((100, 400), "User Levels") userlevels.add_callback('clicked', self.userlevels_event) self.container.add(userlevels) + networklevels = TextButton((100, 500), "Network Levels") + networklevels.add_callback('clicked', self.networklevels_event) + self.container.add(networklevels) self.container.add_callback(KEYDOWN, self.keydown_event) # Just for debugging cascading containers... @@ -45,6 +48,11 @@ NewHabitatEvent.post(UserLevelMenu()) return True + def networklevels_event(self, ev, widget): + from mamba.habitats.userlevelmenu import NetworkLevelMenu + NewHabitatEvent.post(NetworkLevelMenu()) + return True + def edit_event(self, ev, widget): from mamba.habitats.editor import EditorHabitat NewHabitatEvent.post(EditorHabitat(Level('dev', 'official'))) diff -r 11ee864cd3e3 -r 12d67f69e6b2 mamba/habitats/userlevelmenu.py --- a/mamba/habitats/userlevelmenu.py Sat Sep 17 11:02:37 2011 +0200 +++ b/mamba/habitats/userlevelmenu.py Sat Sep 17 11:28:18 2011 +0200 @@ -1,10 +1,12 @@ """Level menu.""" +import os +import urllib2 + from mamba.habitats.levelmenu import LevelMenu from mamba.level import Level from mamba.constants import LEVEL_SERVER - -import urllib2 +from mamba.gamestate import get_user_levels_dir class UserLevelApi(object): @@ -61,12 +63,32 @@ return self.cache[name] -class UserLevelMenu(LevelMenu): +class NetworkLevelMenu(LevelMenu): API = UserLevelApi("curated") + @property + def level_namespace(self): + self.API.level_namespace + def list_levels(self): return self.API.list_levels() def get_level(self, name): return self.API.get_level(name) + + +class UserLevelMenu(LevelMenu): + + 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 + + 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)