home · contact · privacy
Server: Optimize thing position calculation.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 3 Mar 2016 01:04:49 +0000 (02:04 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 3 Mar 2016 01:04:49 +0000 (02:04 +0100)
server/actions.py
server/ai.py
server/commands.py
server/decrement_lifepoints.py
server/io.py
server/new_thing.py
server/update_map_memory.py
server/worldstate_write_helpers.py

index 7222ad871cea7c0f3153cf8a61833dff6691d02d..4dc470b69d068ad5173946ae9ec2d62eb114dc53 100644 (file)
@@ -55,9 +55,11 @@ def actor_move(t):
     if passable:
         t["T_POSY"] = move_result[1]
         t["T_POSX"] = move_result[2]
+        t["pos"] = move_result[1] * world_db["MAP_LENGTH"] + move_result[2]
         for id in t["T_CARRIES"]:
             world_db["Things"][id]["T_POSY"] = move_result[1]
             world_db["Things"][id]["T_POSX"] = move_result[2]
+            world_db["Things"][id]["pos"] = t["pos"]
         build_fov_map(t)
         if t == world_db["Things"][0]:
             log("You MOVE " + dir + ".")
@@ -71,8 +73,7 @@ def actor_pickup(t):
     """
     ids = [id for id in world_db["Things"] if world_db["Things"][id] != t
            if not world_db["Things"][id]["carried"]
-           if world_db["Things"][id]["T_POSY"] == t["T_POSY"]
-           if world_db["Things"][id]["T_POSX"] == t["T_POSX"]]
+           if world_db["Things"][id]["pos"] == t["pos"]]
     if len(ids):
         lowest_tid = -1
         for iid in ids:
index 661d3022acefdeba50460ff4134d4adf3c61084f..71961a33c401d3ec6d5be95318d61f811f43f6f9 100644 (file)
@@ -59,14 +59,18 @@ def get_dir_to_target(t, filter):
     def animates_in_fov(maplength):
         return [Thing for Thing in world_db["Things"].values()
                 if Thing["T_LIFEPOINTS"] and not Thing["carried"]
-                   and not Thing == t and 118 == t["fovmap"][Thing["T_POSY"] *
-                   maplength + Thing["T_POSX"]]]
+                   and not Thing == t and 118 == t["fovmap"][Thing["pos"]]]
+
+    #def animates_in_fov_gen(maplength):
+    #    return (Thing for Thing in world_db["Things"].values()
+    #            if Thing["T_LIFEPOINTS"] and not Thing["carried"]
+    #               and not Thing == t and 118 == t["fovmap"][Thing["pos"]])
 
     def good_attack_target(v):
         eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
-        type = world_db["ThingTypes"][v["T_TYPE"]]
-        type_corpse = world_db["ThingTypes"][type["TT_CORPSE_ID"]]
-        if t["T_LIFEPOINTS"] > type["TT_LIFEPOINTS"] \
+        ty = world_db["ThingTypes"][v["T_TYPE"]]
+        type_corpse = world_db["ThingTypes"][ty["TT_CORPSE_ID"]]
+        if t["T_LIFEPOINTS"] > ty["TT_LIFEPOINTS"] \
         and type_corpse["TT_TOOL"] == "food" \
         and type_corpse["TT_TOOLPOWER"] > eat_cost:
             return True
@@ -129,10 +133,10 @@ def get_dir_to_target(t, filter):
         set_cells_passable_on_memmap_to_65534_on_scoremap()
         maplen = world_db["MAP_LENGTH"]
         if "a" == filter:
-            [set_map_score(Thing["T_POSY"] * maplen + Thing["T_POSX"], 0) for
+            [set_map_score(Thing["pos"], 0) for
              Thing in animates_in_fov(maplen) if good_attack_target(Thing)]
         elif "f" == filter:
-            [set_map_score(Thing["T_POSY"] * maplen + Thing["T_POSX"], 0) for
+            [set_map_score(Thing["pos"], 0) for
              Thing in animates_in_fov(maplen) if good_flee_target(Thing)]
         elif "c" == filter:
             eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
@@ -145,12 +149,12 @@ def get_dir_to_target(t, filter):
         elif "s" == filter:
             zero_score_map_where_char_on_memdepthmap(mem_depth_c[0])
         if "f" == filter:
-            [set_map_score(Thing["T_POSY"] * maplen + Thing["T_POSX"], 65535)
-             for Thing in animates_in_fov(maplen) if get_map_score(
-              Thing["T_POSY"] * maplen + Thing["T_POSX"])]
+            [set_map_score(Thing["pos"], 65535)
+             for Thing in animates_in_fov(maplen)
+             if get_map_score(Thing["pos"])]
         elif "a" != filter:
-            [set_map_score(Thing["T_POSY"] * maplen + Thing["T_POSX"],
-             65535) for Thing in animates_in_fov(maplen)]
+            [set_map_score(Thing["pos"], 65535)
+             for Thing in animates_in_fov(maplen)]
 
     def rand_target_dir(neighbors, cmp, dirs):
         candidates = []
@@ -174,7 +178,7 @@ def get_dir_to_target(t, filter):
         import math
         dir_to_target = False
         dirs = "edcxsw"
-        eye_pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"]
+        eye_pos = t["pos"]
         neighbors = get_neighbor_scores(dirs, eye_pos)
         minmax_start = 0 if "f" == filter else 65535 - 1
         minmax_neighbor = minmax_start
@@ -230,8 +234,7 @@ def standing_on_food(t):
     eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
     for id in [id for id in world_db["Things"] if world_db["Things"][id] != t
                if not world_db["Things"][id]["carried"]
-               if world_db["Things"][id]["T_POSY"] == t["T_POSY"]
-               if world_db["Things"][id]["T_POSX"] == t["T_POSX"]
+               if world_db["Things"][id]["pos"] == t["pos"]
                if world_db["ThingTypes"][world_db["Things"][id]["T_TYPE"]]
                   ["TT_TOOL"] == "food"
                if world_db["ThingTypes"][world_db["Things"][id]["T_TYPE"]]
index 7755f880fdb78d1489894c8212466fdac958d3a8..536e330522a6c98e2c8a8d26856049da79db43a9 100644 (file)
@@ -57,8 +57,7 @@ def command_thingshere(str_y, str_x):
                               for id in world_db["Things"]
                               if not world_db["Things"][id]["carried"]
                               if world_db["Things"][id]["T_TYPE"] == tid
-                              if y == world_db["Things"][id]["T_POSY"]
-                              if x == world_db["Things"][id]["T_POSX"]]:
+                              if pos == world_db["Things"][id]["pos"]]:
                     type = world_db["Things"][id]["T_TYPE"]
                     name = world_db["ThingTypes"][type]["TT_NAME"]
                     strong_write(io_db["file_out"], name + "\n")
@@ -403,7 +402,9 @@ def setter_tpos(axis):
         val = integer_test(str_int, 0, 255)
         if None != val:
             if val < world_db["MAP_LENGTH"]:
-                world_db["Things"][command_tid.id]["T_POS" + axis] = val
+                t = world_db["Things"][command_tid.id]
+                t["T_POS" + axis] = val
+                t["pos"] = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"]
                 if world_db["WORLD_ACTIVE"] \
                    and world_db["Things"][command_tid.id]["T_LIFEPOINTS"]:
                     build_fov_map(world_db["Things"][command_tid.id])
@@ -442,8 +443,7 @@ def play_pickup():
         t = world_db["Things"][0]
         ids = [tid for tid in world_db["Things"] if tid
                if not world_db["Things"][tid]["carried"]
-               if world_db["Things"][tid]["T_POSY"] == t["T_POSY"]
-               if world_db["Things"][tid]["T_POSX"] == t["T_POSX"]]
+               if world_db["Things"][tid]["pos"] == t["pos"]]
         from server.config.commands import play_pickup_attempt_hook
         if not len(ids):
              log("NOTHING to pick up.")
index b8cab9740abd995b4e8938c61644b079c06a45ca..d3043deb273e3e5b084ec533a102231397f26160 100644 (file)
@@ -17,8 +17,6 @@ def decrement_lifepoints(t):
         live_tid = t["T_TYPE"]
         for tid in t["T_CARRIES"]:
             t["T_CARRIES"].remove(tid)
-            world_db["Things"][tid]["T_POSY"] = t["T_POSY"]
-            world_db["Things"][tid]["T_POSX"] = t["T_POSX"]
             world_db["Things"][tid]["carried"] = False
         t["T_TYPE"] = world_db["ThingTypes"][t["T_TYPE"]]["TT_CORPSE_ID"]
         if world_db["Things"][0] == t:
index bb5d3ac13e7661feb6bfd3b7f2594038759c6772..ad30cc2d1fe892e1fcdf65549d6d5fadb2aad60f 100644 (file)
@@ -185,7 +185,7 @@ def save_world():
             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"}:
+                               "T_MEMTHING", "T_MEMDEPTHMAP", "pos"}:
                     argument = t[key]
                     string += key + " " + (quote_escape(argument) if \
                             str == type(argument) else str(argument)) + "\n"
index 84bc5917d15ec5abc385fd080579088e0c357504..5c48177307d26fef4edf6f0092c353aab624ff5d 100644 (file)
@@ -16,6 +16,7 @@ def new_Thing(_type, pos=(0, 0)):
     thing["T_TYPE"] = _type
     thing["T_POSY"] = pos[0]
     thing["T_POSX"] = pos[1]
+    thing["pos"] = thing["T_POSY"] * world_db["MAP_LENGTH"] + thing["T_POSX"]
     if world_db["WORLD_ACTIVE"] and thing["T_LIFEPOINTS"]:
         build_fov_map(thing)
     return thing
index cd5323c0b6e6e0c3f06429ca8c232a4f7947e1af..003e0cf54778f8f16aeb1fd65f58b2cace242961 100644 (file)
@@ -56,5 +56,4 @@ def update_map_memory(t, age_map=True):
      if not world_db["Things"][id]["carried"]
      if not world_db["ThingTypes"][world_db["Things"][id]["T_TYPE"]]
                                                               ["TT_LIFEPOINTS"]
-     if ord_v == t["fovmap"][(world_db["Things"][id]["T_POSY"] * maplength)
-                                       + world_db["Things"][id]["T_POSX"]]]
+     if ord_v == t["fovmap"][world_db["Things"][id]["pos"]]]
index 8ec4b354bc2707a80de03d2117d2e65a366bd58d..cda1bfcea13c23a83db13ecfc5a8d6ae8961fec3 100644 (file)
@@ -37,12 +37,10 @@ def write_fov_map():
                   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]:
+                       world_db["Things"][id]["pos"]] == 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
+        fov[world_db["Things"][id]["pos"]] = c
     return write_map(fov, length)
 
 def write_mem_map():