03 - Refactor room generation (from inside Leaf/tree to the Level class)
This commit is contained in:
		
							parent
							
								
									e1ee70f495
								
							
						
					
					
						commit
						71641a8ea7
					
				
					 1 changed files with 40 additions and 29 deletions
				
			
		
							
								
								
									
										69
									
								
								03_map.py
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								03_map.py
									
									
									
									
									
								
							| 
						 | 
					@ -24,7 +24,6 @@ class Leaf:
 | 
				
			||||||
        self.height = h
 | 
					        self.height = h
 | 
				
			||||||
        self.left_leaf = None
 | 
					        self.left_leaf = None
 | 
				
			||||||
        self.right_leaf = None
 | 
					        self.right_leaf = None
 | 
				
			||||||
        self.room = None
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def print_leaf(self):
 | 
					    def print_leaf(self):
 | 
				
			||||||
        print('[Leaf]' + str(self.id) + ': (' + str(self.x) + '), (' + str(self.y) + ')' +
 | 
					        print('[Leaf]' + str(self.id) + ': (' + str(self.x) + '), (' + str(self.y) + ')' +
 | 
				
			||||||
| 
						 | 
					@ -63,29 +62,6 @@ class Leaf:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return True
 | 
					        return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def generate_rooms(self, tilemap):
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        :return: generate rooms inside partitioned space
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        if self.left_leaf:
 | 
					 | 
				
			||||||
            self.left_leaf.generate_rooms(tilemap)
 | 
					 | 
				
			||||||
        if self.right_leaf:
 | 
					 | 
				
			||||||
            self.right_leaf.generate_rooms(tilemap)
 | 
					 | 
				
			||||||
        if not self.left_leaf and not self.right_leaf:
 | 
					 | 
				
			||||||
            self.room = self.generate_room(tilemap)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def generate_room(self, tilemap):
 | 
					 | 
				
			||||||
        # Leave space for walls
 | 
					 | 
				
			||||||
        x = random.randint(self.x+1, self.x+2)
 | 
					 | 
				
			||||||
        y = random.randint(self.y+1, self.y+2)
 | 
					 | 
				
			||||||
        w = random.randint(MIN_LEAF_SIZE / 2, self.width-2)
 | 
					 | 
				
			||||||
        h = random.randint(MIN_LEAF_SIZE / 2, self.height-2)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        r = Room(x, y, w, h, self.id)
 | 
					 | 
				
			||||||
        r.draw_map(tilemap)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return r
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Room:
 | 
					class Room:
 | 
				
			||||||
    """ room """
 | 
					    """ room """
 | 
				
			||||||
| 
						 | 
					@ -128,7 +104,10 @@ class Level:
 | 
				
			||||||
        self.tilemap = []
 | 
					        self.tilemap = []
 | 
				
			||||||
        if tile_file:
 | 
					        if tile_file:
 | 
				
			||||||
            self.load_tileset(tile_file)
 | 
					            self.load_tileset(tile_file)
 | 
				
			||||||
        self.tree = self.generate_tree()
 | 
					
 | 
				
			||||||
 | 
					        self.tree = None
 | 
				
			||||||
 | 
					        self.rooms = []
 | 
				
			||||||
 | 
					        self.regenerate()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def load_tileset(self, tile_file):
 | 
					    def load_tileset(self, tile_file):
 | 
				
			||||||
        resource_file = open(tile_file)
 | 
					        resource_file = open(tile_file)
 | 
				
			||||||
| 
						 | 
					@ -151,13 +130,44 @@ class Level:
 | 
				
			||||||
                tree.append(l.left_leaf)
 | 
					                tree.append(l.left_leaf)
 | 
				
			||||||
                tree.append(l.right_leaf)
 | 
					                tree.append(l.right_leaf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return tree
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def generate_rooms(self, leaf, tilemap, room_list):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        generate rooms inside partitioned space
 | 
				
			||||||
 | 
					        :return: a list of generated rooms
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        if leaf.left_leaf:
 | 
				
			||||||
 | 
					            self.generate_rooms(leaf.left_leaf, tilemap, room_list)
 | 
				
			||||||
 | 
					        if leaf.right_leaf:
 | 
				
			||||||
 | 
					            self.generate_rooms(leaf.right_leaf, tilemap, room_list)
 | 
				
			||||||
 | 
					        if not leaf.left_leaf and not leaf.right_leaf:
 | 
				
			||||||
 | 
					            room = self.generate_room(leaf, tilemap)
 | 
				
			||||||
 | 
					            room_list.append(room)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return room_list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def generate_room(self, leaf, tilemap):
 | 
				
			||||||
 | 
					        # Leave space for walls
 | 
				
			||||||
 | 
					        x = random.randint(leaf.x + 1, leaf.x + 2)
 | 
				
			||||||
 | 
					        y = random.randint(leaf.y + 1, leaf.y + 2)
 | 
				
			||||||
 | 
					        w = random.randint(MIN_LEAF_SIZE / 2, leaf.width - 2)
 | 
				
			||||||
 | 
					        h = random.randint(MIN_LEAF_SIZE / 2, leaf.height - 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        r = Room(x, y, w, h, leaf.id)
 | 
				
			||||||
 | 
					        r.draw_map(tilemap)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return r
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def regenerate(self):
 | 
				
			||||||
 | 
					        """" generate a new level """
 | 
				
			||||||
 | 
					        self.tree = self.generate_tree()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # initialize tilemap with road/ground
 | 
					        # initialize tilemap with road/ground
 | 
				
			||||||
        self.tilemap = [[self.TILE_ROAD for y in range(0, self.sizey)] for x in range(0, self.sizex)]
 | 
					        self.tilemap = [[self.TILE_ROAD for y in range(0, self.sizey)] for x in range(0, self.sizex)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # create rooms from partitions
 | 
					        # create rooms from partitions
 | 
				
			||||||
        tree[0].generate_rooms(self.tilemap)
 | 
					        self.rooms = self.generate_rooms(self.tree[0], self.tilemap, [])
 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        return tree
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def draw_map(self):
 | 
					    def draw_map(self):
 | 
				
			||||||
        for y in range(0, self.sizey):
 | 
					        for y in range(0, self.sizey):
 | 
				
			||||||
| 
						 | 
					@ -170,6 +180,7 @@ class Level:
 | 
				
			||||||
                print(self.tilemap[x][y], end="")
 | 
					                print(self.tilemap[x][y], end="")
 | 
				
			||||||
            print("")
 | 
					            print("")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
# main
 | 
					# main
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
| 
						 | 
					@ -187,7 +198,7 @@ def on_key_press(symbol, modifiers):
 | 
				
			||||||
        print('Will quit')
 | 
					        print('Will quit')
 | 
				
			||||||
    if symbol == key.R:
 | 
					    if symbol == key.R:
 | 
				
			||||||
        print('Regeneration')
 | 
					        print('Regeneration')
 | 
				
			||||||
        level.generate_tree()
 | 
					        level.regenerate()
 | 
				
			||||||
        window.invalid = True
 | 
					        window.invalid = True
 | 
				
			||||||
    if symbol == key.D:
 | 
					    if symbol == key.D:
 | 
				
			||||||
        level.dump_tilemap()
 | 
					        level.dump_tilemap()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue