home · contact · privacy
Server: Optimize thing position calculation.
[plomrogue] / server / io.py
index 65d1c351484b07fbbfeec06add24da55b2bd498b..ad30cc2d1fe892e1fcdf65549d6d5fadb2aad60f 100644 (file)
@@ -167,21 +167,38 @@ def save_world():
 
     def helper(category, id_string, special_keys={}):
         string = ""
-        for id in sorted(world_db[category].keys()):
-            string = string + id_string + " " + str(id) + "\n"
-            for key in sorted(world_db[category][id].keys()):
+        for _id in sorted(world_db[category].keys()):
+            string = string + id_string + " " + str(_id) + "\n"
+            for key in sorted(world_db[category][_id].keys()):
                 if not key in special_keys:
-                    x = world_db[category][id][key]
+                    x = world_db[category][_id][key]
                     argument = quote_escape(x) if str == type(x) else str(x)
                     string = string + key + " " + argument + "\n"
-                elif special_keys[key]:
-                    string = string + special_keys[key](id)
+        return string
+
+    def helper_things():
+        string = ""
+        memmap = mapsetter("T_MEMMAP")
+        memdepthmap = mapsetter("T_MEMDEPTHMAP")
+        for tid in sorted(world_db["Things"].keys()):
+            string += "T_ID " + str(tid) + "\n"
+            t = world_db["Things"][tid]
+            for key in sorted(t.keys()):
+                if key not in {"T_CARRIES", "carried", "fovmap", "T_MEMMAP",
+                               "T_MEMTHING", "T_MEMDEPTHMAP", "pos"}:
+                    argument = t[key]
+                    string += key + " " + (quote_escape(argument) if \
+                            str == type(argument) else str(argument)) + "\n"
+            string += memthing(tid) + memmap(tid) + memdepthmap(tid)
         return string
 
     string = ""
+    for plugin in world_db["PLUGIN"]:
+        string = string + "PLUGIN " + plugin + "\n"
     for key in sorted(world_db.keys()):
-        if (not isinstance(world_db[key], dict)) and key != "MAP" and \
-           key != "WORLD_ACTIVE":
+        if (not isinstance(world_db[key], dict) and
+            not isinstance(world_db[key], list)) and key != "MAP" and \
+           key != "WORLD_ACTIVE" and key[0].isupper():
             string = string + key + " " + str(world_db[key]) + "\n"
     string = string + mapsetter("MAP")()
     string = string + helper("ThingActions", "TA_ID")
@@ -189,15 +206,11 @@ def save_world():
     for id in sorted(world_db["ThingTypes"].keys()):
         string = string + "TT_ID " + str(id) + "\n" + "TT_CORPSE_ID " + \
             str(world_db["ThingTypes"][id]["TT_CORPSE_ID"]) + "\n"
-    string = string + helper("Things", "T_ID",
-                             {"T_CARRIES": False, "carried": False,
-                              "T_MEMMAP": mapsetter("T_MEMMAP"),
-                              "T_MEMTHING": memthing, "fovmap": False,
-                              "T_MEMDEPTHMAP": mapsetter("T_MEMDEPTHMAP")})
-    for id in sorted(world_db["Things"].keys()):
-        if [] != world_db["Things"][id]["T_CARRIES"]:
-            string = string + "T_ID " + str(id) + "\n"
-            for carried in sorted(world_db["Things"][id]["T_CARRIES"]):
+    string += helper_things()
+    for tid in sorted(world_db["Things"].keys()):
+        if [] != world_db["Things"][tid]["T_CARRIES"]:
+            string = string + "T_ID " + str(tid) + "\n"
+            for carried in sorted(world_db["Things"][tid]["T_CARRIES"]):
                 string = string + "T_CARRIES " + str(carried) + "\n"
     string = string + "SEED_RANDOMNESS " + str(rand.seed) + "\n" + \
         "WORLD_ACTIVE " + str(world_db["WORLD_ACTIVE"])
@@ -254,10 +267,10 @@ def obey(command, prefix, replay=False, do_record=False):
                     if world_db["WORLD_ACTIVE"]:
                         save_world()
                     io_db["record_chunk"] = ""
-                    io_db["save_wait"] = time.time()
+                    io_db["save_wait_start"] = time.time()
             io_db["worldstate_updateable"] = world_db["WORLD_ACTIVE"]
     elif 0 != len(tokens):
-        print("Invalid command/argument, or bad number of tokens.")
+        print("Invalid command/argument, or bad number of tokens: " + command)
 
 
 def obey_lines_in_file(path, name, do_record=False):
@@ -273,56 +286,15 @@ def obey_lines_in_file(path, name, do_record=False):
 
 def try_worldstate_update():
     """Write worldstate file if io_db["worldstate_updateable"] is set."""
-    from server.config.commands import commands_db
     if io_db["worldstate_updateable"]:
-
-        def write_map(string, map):
-            for i in range(length):
-                line = map[i * length:(i * length) + length].decode()
-                string = string + line + "\n"
-            return string
-
-        inventory = ""
-        if [] == world_db["Things"][0]["T_CARRIES"]:
-            inventory = "(none)\n"
-        else:
-            for id in world_db["Things"][0]["T_CARRIES"]:
-                type_id = world_db["Things"][id]["T_TYPE"]
-                name = world_db["ThingTypes"][type_id]["TT_NAME"]
-                inventory = inventory + name + "\n"
-        string = str(world_db["TURN"]) + "\n" + \
-            str(world_db["Things"][0]["T_LIFEPOINTS"]) + "\n" + \
-            str(world_db["Things"][0]["T_SATIATION"]) + "\n" + \
-            inventory + "%\n" + \
-            str(world_db["Things"][0]["T_POSY"]) + "\n" + \
-            str(world_db["Things"][0]["T_POSX"]) + "\n" + \
-            str(world_db["MAP_LENGTH"]) + "\n"
-        length = world_db["MAP_LENGTH"]
-        fov = bytearray(b' ' * (length ** 2))
-        ord_v = ord("v")
-        for pos in [pos for pos in range(length ** 2)
-                        if ord_v == world_db["Things"][0]["fovmap"][pos]]:
-            fov[pos] = world_db["MAP"][pos]
-        length = world_db["MAP_LENGTH"]
-        for id in [id for tid in reversed(sorted(list(world_db["ThingTypes"])))
-                      for id in world_db["Things"]
-                      if not world_db["Things"][id]["carried"]
-                      if world_db["Things"][id]["T_TYPE"] == tid
-                      if world_db["Things"][0]["fovmap"][
-                           world_db["Things"][id]["T_POSY"] * length
-                           + world_db["Things"][id]["T_POSX"]] == ord_v]:
-            type = world_db["Things"][id]["T_TYPE"]
-            c = ord(world_db["ThingTypes"][type]["TT_SYMBOL"])
-            fov[world_db["Things"][id]["T_POSY"] * length
-                + world_db["Things"][id]["T_POSX"]] = c
-        string = write_map(string, fov)
-        mem = world_db["Things"][0]["T_MEMMAP"][:]
-        for mt in [mt for tid in reversed(sorted(list(world_db["ThingTypes"])))
-                      for mt in world_db["Things"][0]["T_MEMTHING"]
-                      if mt[0] == tid]:
-             c = world_db["ThingTypes"][mt[0]]["TT_SYMBOL"]
-             mem[(mt[1] * length) + mt[2]] = ord(c)
-        string = write_map(string, mem)
+        string = ""
+        for entry in io_db["worldstate_write_order"]:
+            if entry[1] == "world_int":
+                string += str(world_db[entry[0]]) + "\n"
+            elif entry[1] == "player_int":
+                string += str(world_db["Things"][0][entry[0]]) + "\n"
+            elif entry[1] == "func":
+                string += entry[0]()
         atomic_write(io_db["path_worldstate"], string, delete=False)
         strong_write(io_db["file_out"], "WORLD_UPDATED\n")
         io_db["worldstate_updateable"] = False