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