SI_2020/warehouse.py

123 lines
4.3 KiB
Python

from attributes import PackSize
import random
import queue
import itertools
class CategoryData:
def __init__(self, name, passable=False, can_store=True, location='general', pack_size=PackSize.ALL):
self.name = name
self.passable = passable
self.can_store = can_store
self.location = location
self.pack_size = pack_size
def __repr__(self):
return self.name
class Pack:
def __init__(self, size, categ='general'):
self.size = size
self.category = categ
CATEGORY = {
'floor': CategoryData('Floor', True, False), #lava
'rack': CategoryData('Rack', False, True),
# 'freezer': CategoryData('Freezer', False, True, location='cold_room')
}
class Warehouse:
def __init__(self, width, length):
self.width = width
self.height = length
self.tiles = self.generate_map()
self.generate_racks()
# import pdb
# pdb.set_trace()
def __str__(self):
return "Magazyn {}x{}".format(self.width, self.height)
def generate_map(self):
warehouse_tiles = []
categories = list(CATEGORY.keys())
for x in range(self.width):
row = [Tile('floor', x, y) for y in range(self.height)]
warehouse_tiles.append(row)
return warehouse_tiles
def generate_racks(self):
q = queue.Queue()
# import pdb
# pdb.set_trace()
node_x, node_y = random.randrange(1, self.width-1), random.randrange(1, self.height-1)
node = self.tiles[node_x][node_y]
next_node = None
self.tiles[node_x][node_y] = Tile('rack', node_x, node_y)
q.put(node)
import pdb
while not q.empty():
if next_node is not None:
q.put(next_node)
not_rack_nodes = self.get_not_rack_nodes(node_x, node_y)
if len(not_rack_nodes) == 0:
next_node = q.get()
while len(self.get_not_rack_nodes(next_node.x_position, next_node.y_position)) == 0:
if q.empty():
return
next_node = q.get()
else:
current_node = next_node if next_node is not None else node
next_node = random.choice(not_rack_nodes)
self.break_wall(next_node, current_node)
node_x = next_node.x_position
node_y = next_node.y_position
self.tiles[node_x][node_y] = Tile('rack', node_x, node_y)
def get_not_rack_nodes(self, node_x, node_y):
adjacent_tiles = self.get_adjacent_tiles(node_x, node_y)
possible_nodes = [line for line in adjacent_tiles if line.category.name != "Rack"]
return possible_nodes
def get_adjacent_tiles(self, x, y):
x_start = x - 2 if x - 2 >= 0 else 0
x_stop = x + 2 if x + 2 < self.width else self.width-1
y_start = y - 2 if y - 2 >= 0 else 0
y_stop = y + 2 if y + 2 < self.height else self.height - 1
adjacent_tiles = [self.tiles[x_start][y], self.tiles[x_stop][y], self.tiles[x][y_start], self.tiles[x][y_stop]]
return adjacent_tiles
def break_wall(self, next_node, current_node):
wall = self.get_wall(next_node, current_node)
self.tiles[wall.x_position][wall.y_position] = Tile("rack", wall.x_position, wall.y_position)
def get_wall(self, next_node, current_node):
x_relative = 0
y_relative = 0
if next_node.x_position > current_node.x_position:
x_relative = 1
elif next_node.x_position < current_node.x_position:
x_relative = -1
if next_node.y_position > current_node.y_position:
y_relative = 1
elif next_node.y_position < current_node.y_position:
y_relative = -1
wall_x = current_node.x_position + x_relative
wall_y = current_node.y_position + y_relative
wall = self.tiles[wall_x][wall_y]
return wall
class Tile:
def __init__(self, category, x_position, y_position):
self.category = CATEGORY.get(category, CATEGORY['floor'])
self.x_position = x_position
self.y_position = y_position
def __str__(self):
return "Tile type: {} on position ({},{})".format(self.category, self.x_position, self.y_position)
def __repr__(self):
return "Tile type: {} on position ({},{})".format(self.category, self.x_position, self.y_position)