changeset 399:12d67f69e6b2

Support for user levels.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 17 Sep 2011 11:28:18 +0200
parents 11ee864cd3e3
children 03db0d517ac3
files mamba/gamestate.py mamba/habitats/mainmenu.py mamba/habitats/userlevelmenu.py
diffstat 3 files changed, 46 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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[:]
--- 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')))
--- 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)