X-Git-Url: https://plomlompom.com/repos/?p=plomrogue;a=blobdiff_plain;f=server%2Fmake_map.py;h=2edbb5b0b0bda1a6f02e65839d366be5a0a45a0b;hp=979238362d1d88bc2daa8b14872aad88faaab7a4;hb=9daa8b8d01b9b2f9295dc51e94ceb524c278fe68;hpb=4c0441f280e772656245c23252b9fd49976db1b5 diff --git a/server/make_map.py b/server/make_map.py index 9792383..2edbb5b 100644 --- a/server/make_map.py +++ b/server/make_map.py @@ -3,6 +3,39 @@ # see the file NOTICE in the root directory of the PlomRogue source package. +from server.config.world_data import world_db +from server.utils import rand + + +def is_neighbor(coordinates, type): + y = coordinates[0] + x = coordinates[1] + length = world_db["MAP_LENGTH"] + ind = y % 2 + diag_west = x + (ind > 0) + diag_east = x + (ind < (length - 1)) + pos = (y * length) + x + if (y > 0 and diag_east + and type == chr(world_db["MAP"][pos - length + ind])) \ + or (x < (length - 1) + and type == chr(world_db["MAP"][pos + 1])) \ + or (y < (length - 1) and diag_east + and type == chr(world_db["MAP"][pos + length + ind])) \ + or (y > 0 and diag_west + and type == chr(world_db["MAP"][pos - length - (not ind)])) \ + or (x > 0 + and type == chr(world_db["MAP"][pos - 1])) \ + or (y < (length - 1) and diag_west + and type == chr(world_db["MAP"][pos + length - (not ind)])): + return True + return False + +def new_pos(): + length = world_db["MAP_LENGTH"] + y = rand.next() % length + x = rand.next() % length + return y, x, (y * length) + x + def make_map(): """(Re-)make island map. @@ -12,40 +45,12 @@ def make_map(): to land. The cycle ends when a land cell is due to be created at the map's border. Then put some trees on the map (TODO: more precise algorithm desc). """ - from server.config.world_data import world_db - from server.utils import rand - - def is_neighbor(coordinates, type): - y = coordinates[0] - x = coordinates[1] - length = world_db["MAP_LENGTH"] - ind = y % 2 - diag_west = x + (ind > 0) - diag_east = x + (ind < (length - 1)) - pos = (y * length) + x - if (y > 0 and diag_east - and type == chr(world_db["MAP"][pos - length + ind])) \ - or (x < (length - 1) - and type == chr(world_db["MAP"][pos + 1])) \ - or (y < (length - 1) and diag_east - and type == chr(world_db["MAP"][pos + length + ind])) \ - or (y > 0 and diag_west - and type == chr(world_db["MAP"][pos - length - (not ind)])) \ - or (x > 0 - and type == chr(world_db["MAP"][pos - 1])) \ - or (y < (length - 1) and diag_west - and type == chr(world_db["MAP"][pos + length - (not ind)])): - return True - return False - world_db["MAP"] = bytearray(b'~' * (world_db["MAP_LENGTH"] ** 2)) length = world_db["MAP_LENGTH"] add_half_width = (not (length % 2)) * int(length / 2) world_db["MAP"][int((length ** 2) / 2) + add_half_width] = ord(".") while (1): - y = rand.next() % length - x = rand.next() % length - pos = (y * length) + x + y, x, pos = new_pos() if "~" == chr(world_db["MAP"][pos]) and is_neighbor((y, x), "."): if y == 0 or y == (length - 1) or x == 0 or x == (length - 1): break @@ -54,11 +59,8 @@ def make_map(): i_trees = 0 while (i_trees <= n_trees): single_allowed = rand.next() % 32 - y = rand.next() % length - x = rand.next() % length - pos = (y * length) + x + y, x, pos = new_pos() if "." == chr(world_db["MAP"][pos]) \ and ((not single_allowed) or is_neighbor((y, x), "X")): world_db["MAP"][pos] = ord("X") i_trees += 1 - # This all-too-precise replica of the original C code misses iter_limit().