79 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from .map import Map
							 | 
						||
| 
								 | 
							
								from .roomtype.town import Town
							 | 
						||
| 
								 | 
							
								from .roomtype.mountain import Mountain, MountainEgg
							 | 
						||
| 
								 | 
							
								from .roomtype.forest import Forest
							 | 
						||
| 
								 | 
							
								from .roomtype.base import RoomType
							 | 
						||
| 
								 | 
							
								from .roomtype.water import Water, Beach
							 | 
						||
| 
								 | 
							
								import random
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def is_area_clear(the_map: Map, x, y, w, h):
							 | 
						||
| 
								 | 
							
								    for y0 in range(y, y+h):
							 | 
						||
| 
								 | 
							
								        for x0 in range(x, x+w):
							 | 
						||
| 
								 | 
							
								            if 0 <= x0 < the_map.w and 0 <= y0 < the_map.h:
							 | 
						||
| 
								 | 
							
								                if the_map.get(x0, y0).room_type is not None:
							 | 
						||
| 
								 | 
							
								                    return False
							 | 
						||
| 
								 | 
							
								    return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def find_random_clear_area(the_map: Map, w, h, *, tries):
							 | 
						||
| 
								 | 
							
								    for n in range(tries):
							 | 
						||
| 
								 | 
							
								        x = random.randint(0, the_map.w - w)
							 | 
						||
| 
								 | 
							
								        y = random.randint(0, the_map.h - h)
							 | 
						||
| 
								 | 
							
								        if is_area_clear(the_map, x - 1, y - 1, w + 2, h + 2):
							 | 
						||
| 
								 | 
							
								            return x, y
							 | 
						||
| 
								 | 
							
								    return None, None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def setup_room_types(the_map: Map):
							 | 
						||
| 
								 | 
							
								    # Always make the rop row mountains.
							 | 
						||
| 
								 | 
							
								    egg_x = the_map.w // 2
							 | 
						||
| 
								 | 
							
								    for x in range(the_map.w):
							 | 
						||
| 
								 | 
							
								        if x == egg_x:
							 | 
						||
| 
								 | 
							
								            MountainEgg(the_map.get(x, 0))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            Mountain(the_map.get(x, 0))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Add some beach.
							 | 
						||
| 
								 | 
							
								    width = the_map.w if random.random() < 0.5 else random.randint(max(2, the_map.w // 4), the_map.w // 2)
							 | 
						||
| 
								 | 
							
								    beach_x = 0  # current tileset doesn't allow anything else
							 | 
						||
| 
								 | 
							
								    for x in range(beach_x, beach_x+width):
							 | 
						||
| 
								 | 
							
								        # Beach(the_map.get(x, the_map.h - 2))
							 | 
						||
| 
								 | 
							
								        Beach(the_map.get(x, the_map.h - 1))
							 | 
						||
| 
								 | 
							
								    the_map.get(beach_x + width - 1, the_map.h - 1).edge_right.force_solid()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    town_x, town_y = find_random_clear_area(the_map, 2, 2, tries=20)
							 | 
						||
| 
								 | 
							
								    if town_x is not None:
							 | 
						||
| 
								 | 
							
								        for y in range(town_y, town_y + 2):
							 | 
						||
| 
								 | 
							
								            for x in range(town_x, town_x + 2):
							 | 
						||
| 
								 | 
							
								                Town(the_map.get(x, y))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    forest_w, forest_h = 2, 2
							 | 
						||
| 
								 | 
							
								    if random.random() < 0.5:
							 | 
						||
| 
								 | 
							
								        forest_w += 1
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        forest_h += 1
							 | 
						||
| 
								 | 
							
								    forest_x, forest_y = find_random_clear_area(the_map, forest_w, forest_h, tries=20)
							 | 
						||
| 
								 | 
							
								    if forest_x is None:
							 | 
						||
| 
								 | 
							
								        forest_w, forest_h = 2, 2
							 | 
						||
| 
								 | 
							
								        forest_x, forest_y = find_random_clear_area(the_map, forest_w, forest_h, tries=20)
							 | 
						||
| 
								 | 
							
								    if forest_x is not None:
							 | 
						||
| 
								 | 
							
								        for y in range(forest_y, forest_y + forest_h):
							 | 
						||
| 
								 | 
							
								            for x in range(forest_x, forest_x + forest_w):
							 | 
						||
| 
								 | 
							
								                Forest(the_map.get(x, y))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # for n in range(5):
							 | 
						||
| 
								 | 
							
								    #     water_w, water_h = 2, 1
							 | 
						||
| 
								 | 
							
								    #     if random.random() < 0.5:
							 | 
						||
| 
								 | 
							
								    #         water_w, water_h = water_h, water_w
							 | 
						||
| 
								 | 
							
								    #     water_x, water_y = find_random_clear_area(the_map, water_w, water_h, tries=20)
							 | 
						||
| 
								 | 
							
								    #     if water_x is not None:
							 | 
						||
| 
								 | 
							
								    #         for y in range(water_y, water_y + water_h):
							 | 
						||
| 
								 | 
							
								    #             for x in range(water_x, water_x + water_w):
							 | 
						||
| 
								 | 
							
								    #                 Water(the_map.get(x, y))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for y in range(the_map.h):
							 | 
						||
| 
								 | 
							
								        for x in range(the_map.w):
							 | 
						||
| 
								 | 
							
								            if the_map.get(x, y).room_type is None:
							 | 
						||
| 
								 | 
							
								                RoomType(the_map.get(x, y))
							 |