changeset 56:205789321a46

Replace TILE_MAP with richer (but backwards compatible) structure. Record tile number and tile name on tile object.
author Simon Cross <hodgestar@gmail.com>
date Mon, 31 Aug 2009 18:33:33 +0000
parents 3a409e058608
children 08665fa60345
files gamelib/tiles.py
diffstat 1 files changed, 41 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/tiles.py	Mon Aug 31 18:30:02 2009 +0000
+++ b/gamelib/tiles.py	Mon Aug 31 18:33:33 2009 +0000
@@ -4,15 +4,41 @@
 import os
 import imagecache
 
-TILE_MAP = {
-    0: "woodland",
-    1: "grassland",
-    2: "fence",
-    3: "henhouse",
-    4: "chicken",
-}
+class TileMap(object):
+    """Helper class for describing all the game tiles."""
+
+    # number -> (name, image file name)
+    DEFAULT_TILES = {
+        0: ("woodland", "woodland.png"),
+        1: ("grassland", "grassland.png"),
+        2: ("fence", "fence.png"),
+        3: ("henhouse", "grassland.png"),
+        4: ("guardtower", "guardtower.png"),
+    }
+
+    def __init__(self, tiles=None):
+        if tiles is None:
+            tiles = self.DEFAULT_TILES.copy()
+        self._tiles = tiles
+        self._reverse_map = dict((v[0], k) for k, v in self._tiles.iteritems())
 
-REVERSE_TILE_MAP = dict((v, k) for k, v in TILE_MAP.iteritems())
+    def __getitem__(self, n):
+        """Get the string name of tile n."""
+        return self._tiles[n][0]
+
+    def tile_number(self, name):
+        """Return the tile number of the tile with the given name."""
+        return self._reverse_map[name]
+
+    def tiles_for_image(self, image_name):
+        """Return tile numbers associated with the given image name."""
+        for n, (name, image) in self._tiles.iteritems():
+            if image_name == image:
+                yield n
+
+TILE_MAP = TileMap()
+REVERSE_TILE_MAP = TILE_MAP._reverse_map
+
 
 class FarmVid(tilevid.Tilevid):
     """Extension of pgu's TileVid class to handle the complications
@@ -26,12 +52,10 @@
         for dirpath, dirnames, filenames in os.walk(path):
             abstract_dirpath = "/".join(dirpath.split(os.path.sep))
             for filename in filenames:
-                basename, ext = os.path.splitext(filename)
-                if ext != ".png":
-                    continue
-                if basename in REVERSE_TILE_MAP:
-                    n = REVERSE_TILE_MAP[basename]
-                    self.tiles[n] = FarmTile(abstract_dirpath + "/" + filename)
+                image_name = abstract_dirpath + "/" + filename
+                for tile_no in TILE_MAP.tiles_for_image(filename):
+                    tile_name = TILE_MAP[tile_no]
+                    self.tiles[tile_no] = FarmTile(tile_no, tile_name, image_name)
 
     def sun(self, sun_on):
         """Make it night."""
@@ -44,7 +68,9 @@
 
 class FarmTile(vid.Tile):
 
-    def __init__(self, image_name):
+    def __init__(self, tile_no, tile_name, image_name):
+        self.tile_no = tile_no
+        self.tile_name = tile_name
         self.day_image = imagecache.load_image(image_name)
         self.night_image = imagecache.load_image(image_name, ("night",))
         vid.Tile.__init__(self, self.day_image)