Archipelago/worlds/ladx/LADXR/mapgen/roomgen.py

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