Starting the implementation of the new map generator
This commit is contained in:
		
							
								
								
									
										51
									
								
								squirrelbattle/mapgeneration/broguelike.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								squirrelbattle/mapgeneration/broguelike.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
# Copyright (C) 2020 by ÿnérant, eichhornchen, nicomarg, charlse
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
from enum import auto, Enum
 | 
			
		||||
from random import choice, random, randint
 | 
			
		||||
 | 
			
		||||
from ..interfaces import Map, Tile
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DEFAULT_PARAMS = {
 | 
			
		||||
        "width" : 80,
 | 
			
		||||
        "height" : 40,
 | 
			
		||||
        "tries" : 600,
 | 
			
		||||
        "max_rooms" : 99,
 | 
			
		||||
        "cross_room" : 1,
 | 
			
		||||
        "corridor" : .8,
 | 
			
		||||
        "min_v_corridor" : 
 | 
			
		||||
        "max_v_corridor" : 
 | 
			
		||||
        "min_h_corridor" :
 | 
			
		||||
        "max_h_corridor" : 
 | 
			
		||||
        "large_circular_room" : .10,
 | 
			
		||||
        "circular_holes" : .5,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Generator:
 | 
			
		||||
    def __init__(self, params: dict = DEFAULT_PARAMS):
 | 
			
		||||
        self.params = params
 | 
			
		||||
 | 
			
		||||
    def createCircularRoom(self):
 | 
			
		||||
        if random() < self.params["large_circular_room"]:
 | 
			
		||||
            r = randint(5, 10)**2
 | 
			
		||||
        else:
 | 
			
		||||
            r = randint(2, 4)**2
 | 
			
		||||
 | 
			
		||||
        room = []
 | 
			
		||||
        height = 2*r+2+self.params["max_h_corridor"]
 | 
			
		||||
        width = 2*r+2+self.params["max_v_corridor"]
 | 
			
		||||
        make_hole = random() < self.params["circular_holes"]
 | 
			
		||||
        if make_hole:
 | 
			
		||||
            r2 = randint(3, r-3)
 | 
			
		||||
        for i in range(height):
 | 
			
		||||
            room.append([])
 | 
			
		||||
            d = (i-height//2)**2
 | 
			
		||||
            for j in range(width):
 | 
			
		||||
                if d + (j-width//2)**2 < r**2 and \
 | 
			
		||||
                        (not(make_hole) or d + (j-width//2)**2 >= r2**2):
 | 
			
		||||
                    room[-1].append(Tile.FLOOR)
 | 
			
		||||
                else:
 | 
			
		||||
                    room[-1].append(Tile.EMPTY)
 | 
			
		||||
        return room
 | 
			
		||||
@@ -116,7 +116,7 @@ class Generator:
 | 
			
		||||
                if grid[y][x] == Tile.FLOOR:
 | 
			
		||||
                    grid[y][x] = Tile.WALL
 | 
			
		||||
        for y in range(height):
 | 
			
		||||
            for y in [0, width-1]:
 | 
			
		||||
            for x in [0, width-1]:
 | 
			
		||||
                if grid[y][x] == Tile.FLOOR:
 | 
			
		||||
                    grid[y][x] = Tile.WALL
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user