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)) |