- @classmethod
- def image(cls, neighbors):
- if cls.IMG is None or cls.TILESET is None:
- raise NotImplementedError()
- return images.load(os.path.join(cls.TILESET, cls.IMG))
-
-class OrientatedTile:
- IMG = None
- TILESET = None
- ANGLE = None
-
- @classmethod
- def image(cls, neighbors):
- if cls.IMG is None or cls.TILESET is None:
- raise NotImplementedError()
- img = images.load(os.path.join(cls.TILESET, cls.IMG))
- if cls.ANGLE:
- img = rotate(img, cls.ANGLE)
- return img
-
-
-class RandomizedTile(Tile):
- IMGDIR = None
- TILESET = None
- ROTATE = None
-
- @classmethod
- def image(cls, neighbors):
- if cls.IMGDIR is None or cls.TILESET is None:
- raise NotImplementedError()
-
- imgdir = os.path.join(os.path.dirname(__file__), '..', 'images',
- cls.TILESET, cls.IMGDIR)
- imgpath = os.path.splitext(random.choice(os.listdir(imgdir)))[0]
- img = images.load(os.path.join(cls.TILESET, cls.IMGDIR, imgpath))
-
- if cls.ROTATE:
- img = rotate(img, 90 * random.randint(0, 3))
-
- return img
-
-class Floor(RandomizedTile):
- IMGDIR = "floor"
-
-class Wall(RandomizedTile):
- IMGDIR = "wall"
-
-class Underground(RandomizedTile):
- IMGDIR = "underground"
-
-class Tunnel(OrientatedTile):
-
- @classmethod
- def image(cls, neighbors):
- connections = [True if 'walk' in x['behaviour'] else False for x in neighbors]
- conn_count = connections.count(True)
- # simple cases
- cls.ANGLE = 0
- if conn_count == 0:
- # return single point tunnel
- cls.IMG = os.path.join('tunnel', 'tunnel_none')
- elif conn_count == 4:
- # crossroads
- cls.IMG = os.path.join('tunnel', 'tunnel_crossroads')
- elif conn_count == 1:
- # 1 point connector, roatated correctly
- cls.IMG = os.path.join('tunnel', 'tunnel_1way')
- # because of the ordering of neighbors, we use this formulation
- for x, angle in zip(connections, (90, 270, 0, 180)):
- if x:
- cls.ANGLE = angle
- break
- elif conn_count == 3:
- # 3 point connector, rotated correctly
- cls.IMG = os.path.join('tunnel', 'tunnel_3way')
- # find the missing connection.
- for x, angle in zip(connections, (0, 180, 270, 90)):
- if not x:
- cls.ANGLE = angle
- break
- elif conn_count == 2:
- # Need to distinguish pass-through or corner, and
- # rotate correctly
- # neighbors is left, right then up, down
- if connections[0] == connections[1]:
- cls.IMG = os.path.join('tunnel', 'tunnel_passthrough')
- if connections[0]:
- cls.ANGLE = 90
- else:
- cls.IMG = os.path.join('tunnel', 'tunnel_corner')
- if connections[0]:
- if connections[2]:
- # left, up
- cls.ANGLE = 90
- else:
- # left, down
- cls.ANGLE = 180
- else:
- if connections[2]:
- # right, up
- cls.ANGLE = 0
- else:
- # right, down
- cls.ANGLE = 270
-
- return super(Tunnel, cls).image(neighbors)
-