Save Stair targets.
authorNeil Moore <neil@s-z.org>
Wed, 28 May 2008 07:54:03 +0000 (03:54 -0400)
committerNeil Moore <neil@s-z.org>
Wed, 28 May 2008 07:54:03 +0000 (03:54 -0400)
level.py:
  New class Loc representing a location being exported
  Level constructor: take level id, not filename.
    New member lid.
    The filename is "levels/%s.sav".
    New classmethod Level.generate_id to generate an lid if needed.
  Methods LocationProxy.as_loc to convert to a Loc.
  Up default number of rooms for room maps from 5 to 10.
  Decode "Loc" not "loc" in Level.load_file.

loc.py:
  Method Tile.as_loc to convert to a Loc.
  Stair.export:
    Export the target only if it is a location or proxy.
    Export using as_loc.

roguelike.py:
  Initialize the first Level by lid, not filename.

levels/level*.sav:
  Rename loc to Loc everywhere

level.py
levels/level0.sav
loc.py
roguelike.py

index a894743..75900a3 100644 (file)
--- a/level.py
+++ b/level.py
@@ -9,6 +9,17 @@ import things
 import cacher
 import __main__
 
+class Loc (object):
+    def __init__(self, lid, y, x):
+
+        self.level = lid
+        self.y = y
+        self.x = x
+
+    def __str__(self):
+        return "%s %d %d" % (self.level, self.y, self.x)
+
+
 class LocationProxy (object):
     def __init__(self, level=None, y=None, x=None, locstr=None):
         if locstr:
@@ -21,6 +32,9 @@ class LocationProxy (object):
         self.y = y
         self.x = x
 
+    def as_loc(self):
+        return Loc(self.lvl.lid, self.y, self.x)
+
     def level(self):
         if isinstance(self.lvl, LevelProxy):
             self.lvl = self.lvl.level()
@@ -90,21 +104,31 @@ class Level (object):
     be travelled between via transport points.
     """
     __metaclass__ = cacher.FirstArg
-    
-    def __init__(self, filename=None, height=None, width=None, name=None):
+
+    gen_count = 0
+
+    @classmethod
+    def generate_id(cls):
+        cls.gen_count = cls.gen_count + 1
+        return 'gen%d' % (cls.gen_count,)
+
+    def __init__(self, lid=None, height=None, width=None, name=None):
         self.active_tiles = set()
         self.invalid_tiles = set()
         self.important_repaints = set()
         self.unconnected_stairs = set()
         self.unconnected_drops = []
         self.needs_full_repaint = True
-        self.filename = None
 
-        if filename:
+        if lid:
+            self.lid = lid
+            self.filename = "levels/%s.sav" % (lid,)
             assert height == width == name == None, \
                     "Level constructor specified more than just the filename"
-            self.load_file(open(filename, "r"))
+            self.load_file(open(self.filename, "r"))
         else:
+            self.lid = self.generate_id()
+            self.filename = None
             assert height and width
             self.h = height
             self.w = width
@@ -188,7 +212,7 @@ class Level (object):
                         tx = tx + xdir
                     self.grid[ty][tx] = loc.Floor(self, ty,tx)
 
-    def make_room_map(self, nrooms = 5, nstairs = 2):
+    def make_room_map(self, nrooms = 10, nstairs = 2):
         self.grid = [ [ loc.Wall(self,i,j)
             for j in xrange(self.w) ]
             for i in xrange(self.h) ]
@@ -261,7 +285,7 @@ class Level (object):
                 val = valstr.strip()
             elif typ == "level":
                 val = LevelProxy(valstr.strip())
-            elif typ == "loc":
+            elif typ == "Loc":
                 val = LocationProxy(locstr = valstr.strip())
             else:
                 raise Exception("unknown type %s (val '%s')" % (typ, valstr))
@@ -489,12 +513,12 @@ class Level (object):
 
 
 class LevelProxy (object):
-    def __init__(self, name):
-        self.name = name
+    def __init__(self, lid):
+        self.lid = lid
         self.lvl = None
 
     def level(self):
         if not self.lvl:
-            self.lvl = Level("levels/" + self.name + ".sav")
+            self.lvl = Level(self.lid)
         return self.lvl
 
index b6eab57..ec21a21 100644 (file)
 23 70 flowx float -0.942809041582
 8 80 flowy float +0.916619901538
 8 80 flowx float -0.157134840264
-15 60 tgt loc level1 44 88
+15 60 tgt Loc level1 44 88
 15 60 oneway bool True
-1 71 tgt loc level0 36 9
-36 9 tgt loc level0 1 71
+1 71 tgt Loc level0 36 9
+36 9 tgt Loc level0 1 71
diff --git a/loc.py b/loc.py
index a1eaa09..c809654 100644 (file)
--- a/loc.py
+++ b/loc.py
@@ -151,6 +151,8 @@ class Tile (Location):
         if self.num_creatures() > 0:
             pic = self.top_creature().render(pic)
         return pic
+    def as_loc(self):
+        return level.Loc(self.level().lid, self.y, self.x)
 
 class Floor(Tile):
     "A passable Tile."
@@ -223,7 +225,11 @@ class Stair(Floor):
         return tgt
 
     def export(self):
-        return (">", {'oneway': self.oneway, 'tgt': self.tgt})
+        extras = { 'oneway': self.oneway }
+        if (isinstance(self.tgt, Location) or
+                isinstance(self.tgt, level.LocationProxy)):
+            extras['tgt'] = self.tgt.as_loc()
+        return (">", extras)
 
 class Door(Tile):
     "A Tile that may be opened and closed."
index dcf7ae8..ad9af92 100755 (executable)
@@ -318,7 +318,7 @@ if __name__ == '__main__':
         things.Material.loadall(open("materials/materials.mtl"))
         things.ItemClass.loadall(open("items/items.itm"))
 
-        lvl = level.Level("levels/level0.sav")
+        lvl = level.Level("level0")
         me.place(lvl.loc(min(13, lvl.h - 2), min(2, lvl.w - 2)))
         him.place(lvl.loc(max(2, lvl.h - 5), max(5, lvl.w - 10)))
         ui.set_level(lvl)