home · contact · privacy
Server, plugin: Refactor make_world modularity.
authorChristian Heller <c.heller@plomlompom.de>
Sat, 27 Feb 2016 01:33:45 +0000 (02:33 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 27 Feb 2016 01:33:45 +0000 (02:33 +0100)
plugins/server/PleaseTheIslandGod.py
server/commands.py
server/config/make_world_helpers.py [new file with mode: 0644]
server/config/misc.py
server/make_world.py
server/world_makable.py [new file with mode: 0644]

index d126c41c0e46bc215be45431ff58f4fd6bd86320..93e69810c160736242531db987eeffb2cacb4e2e 100644 (file)
@@ -9,79 +9,43 @@ from server.utils import mv_yx_in_dir_legal, rand, id_setter
 from server.config.io import io_db
 from server.new_thing import new_Thing
 
-def make_world(seed):
-    from server.update_map_memory import update_map_memory
-    from server.config.misc import make_map_func
-    from server.utils import libpr
-
-    def free_pos(plant=False):
-        i = 0
-        while 1:
-            err = "Space to put thing on too hard to find. Map too small?"
-            while 1:
-                y = rand.next() % world_db["MAP_LENGTH"]
-                x = rand.next() % world_db["MAP_LENGTH"]
-                pos = y * world_db["MAP_LENGTH"] + x;
-                if (not plant
-                    and "." == chr(world_db["MAP"][pos])) \
-                   or ":" == chr(world_db["MAP"][pos]):
-                    break
-                i += 1
-                if i == 65535:
-                    raise SystemExit(err)
-            pos_clear = (0 == len([id for id in world_db["Things"]
-                                   if world_db["Things"][id]["T_LIFEPOINTS"]
-                                   if world_db["Things"][id]["T_POSY"] == y
-                                   if world_db["Things"][id]["T_POSX"] == x]))
-            if pos_clear:
-                break
-        return (y, x)
-
-    rand.seed = seed
-    if world_db["MAP_LENGTH"] < 1:
-        print("Ignoring: No map length >= 1 defined.")
-        return
-    libpr.set_maplength(world_db["MAP_LENGTH"])
-    player_will_be_generated = False
-    playertype = world_db["PLAYER_TYPE"]
-    for ThingType in world_db["ThingTypes"]:
-        if playertype == ThingType:
-            if 0 < world_db["ThingTypes"][ThingType]["TT_START_NUMBER"]:
-                player_will_be_generated = True
-            break
-    if not player_will_be_generated:
-        print("Ignoring: No player type with start number >0 defined.")
-        return
-    wait_action = False
-    for ThingAction in world_db["ThingActions"]:
-        if "wait" == world_db["ThingActions"][ThingAction]["TA_NAME"]:
-            wait_action = True
-    if not wait_action:
-        print("Ignoring beyond SEED_MAP: " +
-              "No thing action with name 'wait' defined.")
-        return
+def pos_test(type, y, x):
+    pos = y * world_db["MAP_LENGTH"] + x;
+    plant = world_db["ThingTypes"][type]["TT_PROLIFERATE"]
+    return (not plant or ":" == chr(world_db["MAP"][pos]))
+
+def world_makable():
+    from server.world_makable import world_makable
+    playertype = world_makable()
     for name in world_db["specials"]:
         if world_db[name] not in world_db["ThingTypes"]:
             print("Ignoring: No valid " + name + " set.")
-            return
-    world_db["Things"] = {}
-    make_map_func()
-    world_db["WORLD_ACTIVE"] = 1
-    world_db["TURN"] = 1
-    for i in range(world_db["ThingTypes"][playertype]["TT_START_NUMBER"]):
-        id = id_setter(-1, "Things")
-        world_db["Things"][id] = new_Thing(playertype, free_pos())
-    if not world_db["Things"][0]["fovmap"]:
-        empty_fovmap = bytearray(b" " * world_db["MAP_LENGTH"] ** 2)
-        world_db["Things"][0]["fovmap"] = empty_fovmap
-    update_map_memory(world_db["Things"][0])
-    for type in world_db["ThingTypes"]:
-        for i in range(world_db["ThingTypes"][type]["TT_START_NUMBER"]):
-            if type != playertype:
-                id = id_setter(-1, "Things")
-                plantness = world_db["ThingTypes"][type]["TT_PROLIFERATE"]
-                world_db["Things"][id] = new_Thing(type, free_pos(plantness))
-    strong_write(io_db["file_out"], "NEW_WORLD\n")
+            return -1
+    return playertype
+
+def make_map():
+    from server.make_map import make_map, is_neighbor, new_pos
+    global rand
+    make_map()
+    length = world_db["MAP_LENGTH"]
+    n_colons = int((length ** 2) / 16)
+    i_colons = 0
+    while (i_colons <= n_colons):
+        single_allowed = rand.next() % 256
+        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, x, pos = new_pos()
+        if (("." == chr(world_db["MAP"][pos]
+             or ":" == chr(world_db["MAP"][pos]))
+            and not is_neighbor((y, x), "X"))):
+            world_db["MAP"][pos] = ord("_")
+            world_db["altar"] = (y, x)
+            altar_placed = True
 
 def thingproliferation(t, prol_map):
     from server.new_thing import new_Thing
@@ -117,30 +81,6 @@ def thingproliferation(t, prol_map):
                 log("The Island God SMILES upon a new-born bear baby.")
                 world_db["GOD_FAVOR"] += 750
 
-def make_map():
-    from server.make_map import make_map, is_neighbor, new_pos
-    global rand
-    make_map()
-    length = world_db["MAP_LENGTH"]
-    n_colons = int((length ** 2) / 16)
-    i_colons = 0
-    while (i_colons <= n_colons):
-        single_allowed = rand.next() % 256
-        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, x, pos = new_pos()
-        if (("." == chr(world_db["MAP"][pos]
-             or ":" == chr(world_db["MAP"][pos]))
-            and not is_neighbor((y, x), "X"))):
-            world_db["MAP"][pos] = ord("_")
-            world_db["altar"] = (y, x)
-            altar_placed = True
-
 def ai(t):
     from server.ai import get_dir_to_target, get_inventory_slot_to_consume, \
         standing_on_food
@@ -802,6 +742,10 @@ commands_db["pickup"] = (0, False, play_pickup)
 import server.config.misc
 server.config.misc.make_map_func = make_map
 server.config.misc.thingproliferation_func = thingproliferation
-server.config.misc.make_world = make_world
 server.config.misc.decrement_lifepoints_func = decrement_lifepoints
 server.config.misc.calc_effort_func = calc_effort
+
+import server.config.make_world_helpers
+server.config.make_world_helpers.pos_test_func = pos_test
+server.config.make_world_helpers.world_makable_func = world_makable
+server.config.make_world_helpers.make_map_func = make_map
index eb8cf1cedcc8f8937a5800f888d7c0740987b879..72018be4006a93a58a94d8e69144fed3004d9466 100644 (file)
@@ -87,8 +87,8 @@ def command_makeworld(seed_string):
     """Call make_world()."""
     val = integer_test(seed_string, 0, 4294967295)
     if None != val:
-        from server.config.misc import make_world_func
-        make_world_func(val)
+        from server.make_world import make_world
+        make_world(val)
 
 
 def command_maplength(maplength_string):
diff --git a/server/config/make_world_helpers.py b/server/config/make_world_helpers.py
new file mode 100644 (file)
index 0000000..21b4239
--- /dev/null
@@ -0,0 +1,10 @@
+# This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3
+# or any later version. For details on its copyright, license, and warranties,
+# see the file NOTICE in the root directory of the PlomRogue source package.
+
+from server.make_map import make_map
+from server.world_makable import world_makable
+
+pos_test_func = lambda a, b, c: True
+make_map_func = make_map
+world_makable_func = world_makable
index bcec1fa99ced52a8833c23927eafa93222d15ff3..05fbe50174db9203629979e0324f92de70e828bd 100644 (file)
@@ -2,14 +2,10 @@
 # or any later version. For details on its copyright, license, and warranties,
 # see the file NOTICE in the root directory of the PlomRogue source package.
 
-from server.make_map import make_map
 from server.thingproliferation import thingproliferation
-from server.make_world import make_world
 from server.decrement_lifepoints import decrement_lifepoints
 from server.calc_effort import calc_effort
 
 decrement_lifepoints_func = decrement_lifepoints
-make_map_func = make_map
 thingproliferation_func = thingproliferation
-make_world_func = make_world
 calc_effort_func = calc_effort
index ad1a84d89033d16878aaf395704600f5a46ef659..23609c686d7a860ae6df4b3bb1761a1191853324 100644 (file)
@@ -3,6 +3,16 @@
 # see the file NOTICE in the root directory of the PlomRogue source package.
 
 
+from server.config.world_data import world_db, symbols_passable
+from server.config.make_world_helpers import make_map_func, \
+    world_makable_func, pos_test_func
+from server.config.io import io_db
+from server.utils import rand, libpr, id_setter
+from server.new_thing import new_Thing
+from server.io import strong_write
+from server.update_map_memory import update_map_memory
+
+
 def make_world(seed):
     """(Re-)build game world, i.e. map, things, to a new turn 1 from seed.
 
@@ -14,15 +24,7 @@ def make_world(seed):
     of ID = world["PLAYER_TYPE"]. Place Things randomly, and actors not on each
     other. Init player's memory map. Write "NEW_WORLD" line to out file.
     """
-    from server.config.world_data import world_db, symbols_passable
-    from server.config.misc import make_map_func
-    from server.config.io import io_db
-    from server.utils import rand, libpr, id_setter
-    from server.new_thing import new_Thing
-    from server.io import strong_write
-    from server.update_map_memory import update_map_memory
-
-    def free_pos():
+    def free_pos(type):
         i = 0
         while 1:
             err = "Space to put thing on too hard to find. Map too small?"
@@ -30,7 +32,7 @@ def make_world(seed):
                 y = rand.next() % world_db["MAP_LENGTH"]
                 x = rand.next() % world_db["MAP_LENGTH"]
                 if chr(world_db["MAP"][y * world_db["MAP_LENGTH"] + x]) in \
-                    symbols_passable:
+                    symbols_passable and pos_test_func(type, y, x):
                     break
                 i += 1
                 if i == 65535:
@@ -44,36 +46,18 @@ def make_world(seed):
                 break
         return (y, x)
 
-    rand.seed = seed 
-    if world_db["MAP_LENGTH"] < 1:
-        print("Ignoring: No map length >= 1 defined.")
+    playertype = world_makable_func()
+    if playertype < 0:
         return
+    rand.seed = seed
     libpr.set_maplength(world_db["MAP_LENGTH"])
-    player_will_be_generated = False
-    playertype = world_db["PLAYER_TYPE"]
-    for ThingType in world_db["ThingTypes"]:
-        if playertype == ThingType:
-            if 0 < world_db["ThingTypes"][ThingType]["TT_START_NUMBER"]:
-                player_will_be_generated = True
-            break
-    if not player_will_be_generated:
-        print("Ignoring: No player type with start number >0 defined.")
-        return
-    wait_action = False
-    for ThingAction in world_db["ThingActions"]:
-        if "wait" == world_db["ThingActions"][ThingAction]["TA_NAME"]:
-            wait_action = True
-    if not wait_action:
-        print("Ignoring beyond SEED_MAP: " +
-              "No thing action with name 'wait' defined.")
-        return
     world_db["Things"] = {}
     make_map_func()
     world_db["WORLD_ACTIVE"] = 1
     world_db["TURN"] = 1
     for i in range(world_db["ThingTypes"][playertype]["TT_START_NUMBER"]):
         id = id_setter(-1, "Things")
-        world_db["Things"][id] = new_Thing(playertype, free_pos())
+        world_db["Things"][id] = new_Thing(playertype, free_pos(playertype))
     if not world_db["Things"][0]["fovmap"]:
         empty_fovmap = bytearray(b" " * world_db["MAP_LENGTH"] ** 2)
         world_db["Things"][0]["fovmap"] = empty_fovmap
@@ -82,5 +66,5 @@ def make_world(seed):
         for i in range(world_db["ThingTypes"][type]["TT_START_NUMBER"]):
             if type != playertype:
                 id = id_setter(-1, "Things")
-                world_db["Things"][id] = new_Thing(type, free_pos())
+                world_db["Things"][id] = new_Thing(type, free_pos(type))
     strong_write(io_db["file_out"], "NEW_WORLD\n")
diff --git a/server/world_makable.py b/server/world_makable.py
new file mode 100644 (file)
index 0000000..c8f1b73
--- /dev/null
@@ -0,0 +1,29 @@
+# This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3
+# or any later version. For details on its copyright, license, and warranties,
+# see the file NOTICE in the root directory of the PlomRogue source package.
+
+
+def world_makable():
+    from server.config.world_data import world_db
+    if world_db["MAP_LENGTH"] < 1:
+        print("Ignoring: No map length >= 1 defined.")
+        return -1 
+    player_will_be_generated = False
+    playertype = world_db["PLAYER_TYPE"]
+    for ThingType in world_db["ThingTypes"]:
+        if playertype == ThingType:
+            if 0 < world_db["ThingTypes"][ThingType]["TT_START_NUMBER"]:
+                player_will_be_generated = True
+            break
+    if not player_will_be_generated:
+        print("Ignoring: No player type with start number >0 defined.")
+        return -1 
+    wait_action = False
+    for ThingAction in world_db["ThingActions"]:
+        if "wait" == world_db["ThingActions"][ThingAction]["TA_NAME"]:
+            wait_action = True
+    if not wait_action:
+        print("Ignoring beyond SEED_MAP: " +
+              "No thing action with name 'wait' defined.")
+        return -1 
+    return playertype