home · contact · privacy
Server, plugin: Refactor map making.
authorChristian Heller <c.heller@plomlompom.de>
Sat, 27 Feb 2016 00:28:52 +0000 (01:28 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 27 Feb 2016 00:28:52 +0000 (01:28 +0100)
plugins/server/PleaseTheIslandGod.py
server/make_map.py

index f750a28017d3154a275b4ff43a17938f7c7a5c39..d126c41c0e46bc215be45431ff58f4fd6bd86320 100644 (file)
@@ -85,7 +85,7 @@ def make_world(seed):
 
 def thingproliferation(t, prol_map):
     from server.new_thing import new_Thing
-    global directions_db, mv_yx_in_dir_legal
+    global directions_db, mv_yx_in_dir_legal, rand
     prolscore = world_db["ThingTypes"][t["T_TYPE"]]["TT_PROLIFERATE"]
     if prolscore and \
       (world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"] == 0 or
@@ -118,70 +118,22 @@ def thingproliferation(t, prol_map):
                 world_db["GOD_FAVOR"] += 750
 
 def make_map():
+    from server.make_map import make_map, is_neighbor, new_pos
     global 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))
+    make_map()
     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
-        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
-            world_db["MAP"][pos] = ord(".")
-    n_trees = int((length ** 2) / 16)
-    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
-        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
     n_colons = int((length ** 2) / 16)
     i_colons = 0
     while (i_colons <= n_colons):
         single_allowed = rand.next() % 256
-        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), ":"))):
             world_db["MAP"][pos] = ord(":")
             i_colons += 1
     altar_placed = False
     while not altar_placed:
-        y = rand.next() % length
-        x = rand.next() % length
-        pos = (y * length) + x
+        y, x, pos = new_pos()
         if (("." == chr(world_db["MAP"][pos]
              or ":" == chr(world_db["MAP"][pos]))
             and not is_neighbor((y, x), "X"))):
index 979238362d1d88bc2daa8b14872aad88faaab7a4..2edbb5b0b0bda1a6f02e65839d366be5a0a45a0b 100644 (file)
@@ -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().