# -*- coding: UTF-8 -*-
from Rect import Rect
from Tile import Tile
from Door import Door
import uuid, random
[docs]class Room(Rect):
""" Room in dungeon.
Once instantiated, it is filled with Tile.
"""
def __init__(self, x, y, width, height, tmp_kind = None):
super(Room, self).__init__(x, y, width, height)
self.id = str(uuid.uuid4())
self.tiles = []
self.doors = []
self.walls = []
self.has_road = False
""" Whther the at least one of the road, or not."""
self.north_road_id = None
""" The road id on north side. If not exist, None."""
self.south_road_id = None
""" The road id on south side. If not exist, None."""
self.east_road_id = None
""" The road id on east side. If not exist, None."""
self.west_road_id = None
""" The road id on west side. If not exist, None."""
self._fill_tiles(tmp_kind)
self._make_door()
self._wrap_walls()
def _fill_tiles(self, tmp_kind):
for col in range(self.x, self.ax + 1):
for row in range(self.y, self.ay + 1):
self.tiles.append(Tile(col , row, tmp_kind))
def _wrap_walls(self):
# 4隅が重複するが問題ないので気にしなくて良い
# 上辺
start = self.x - 1
end = self.ax + 1
row = self.y - 1
for col in range(start, end + 1):
self.walls.append(Tile(col , row, Tile.WALL))
# 下辺
start = self.x - 1
end = self.ax + 1
row = self.ay + 1
for col in range(start, end + 1):
self.walls.append(Tile(col , row, Tile.WALL))
# 左辺
west_door = self.get_west_door()
start = self.y - 1
end = self.ay + 1
col = self.x - 1
for row in range(start, end + 1):
self.walls.append(Tile(col , row, Tile.WALL))
# 右辺
east_door = self.get_east_door()
start = self.y - 1
end = self.ay + 1
col = self.ax + 1
for row in range(start, end + 1):
self.walls.append(Tile(col , row, Tile.WALL))
[docs] def get_tile(self, x, y):
""" Get a tile from Room.
:param x: potision x.
:param y: potision y.
:rtype: Tile class.
:return: Return tile. if it does not exist, return None.
"""
for tile in self.tiles:
if tile.x == x and tile.y == y:
return tile
else:
return None
[docs] def set_tile(self, x, y, new_tile):
""" Set a tile to Room.
:param x: potision x.
:param y: potision y.
:param new_tile: new Tile
"""
for index, tile in enumerate(self.tiles):
if tile.x == x and tile.y == y:
self.tiles[index] = new_tile
[docs] def has_tile(self, x, y):
""" Whether holds the tile.
:param x: potision x.
:param y: potision y.
:rtype: Booean
:return: Return True, if holds the tile. Otherwise Fasle.
"""
if (self.x - 1 <= x and x <= self.ax + 1) and \
(self.y - 1 <= y and y <= self.ay + 1):
return True
else:
return False
[docs] def get_door(self, x, y):
""" Get a door from Room.
:param x: potision x.
:param y: potision y.
:rtype: Door class.
:return: Return door. if it does not exist, return None.
"""
for door in self.doors:
if door.x == x and door.y == y:
return door
else:
return None
[docs] def has_door(self, door):
""" Whether holds the door.
:param x: potision x.
:param y: potision y.
:rtype: Booean
:return: Return True, if holds the tile. Otherwise Fasle.
"""
if door.kind != Tile.DOOR:
return False
for room_door in self.doors:
if room_door.x == door.x and room_door.y == door.y:
return True
else:
return False
[docs] def get_wall(self, x, y):
""" Get a wall from Room.
:param x: potision x.
:param y: potision y.
:rtype: Tile class.
:return: Return tile. if it does not exist, return None.
"""
for wall in self.walls:
if wall.x == x and wall.y == y:
return wall
else:
return None
def _make_door(self):
#上辺
dx = random.randint(self.x + 1, self.ax - 1)
dy = self.y
door = Door(dx, dy, Door.NORTH)
self.set_tile(dx, dy, door)
self.doors.append(door)
#下辺
dx = random.randint(self.x + 1, self.ax - 1)
dy = self.ay
door = Door(dx, dy, Door.SOUTH)
self.set_tile(dx, dy, door)
self.doors.append(door)
#右辺
dx = self.ax
dy = random.randint(self.y + 1, self.ay - 1)
door = Door(dx, dy, Door.EAST)
self.set_tile(dx, dy, door)
self.doors.append(door)
#左辺
dx = self.x
dy = random.randint(self.y + 1, self.ay - 1)
door = Door(dx, dy, Door.WEST)
self.set_tile(dx, dy, door)
self.doors.append(door)
[docs] def get_north_door(self):
""" Get a door on the north side.
:rtype: Door
:return: Return Door.
"""
for door in self.doors:
if door.y == self.y:
return door
[docs] def get_south_door(self):
""" Get a door on the south side.
:rtype: Door
:return: Return Door.
"""
for door in self.doors:
if door.y == self.ay:
return door
[docs] def get_east_door(self):
""" Get a door on the east side.
:rtype: Door
:return: Return Door.
"""
for door in self.doors:
if door.x == self.ax:
return door
[docs] def get_west_door(self):
""" Get a door on the west side.
:rtype: Door
:return: Return Door.
"""
for door in self.doors:
if door.x == self.x:
return door