home · contact · privacy
Server/py: Further optimizations by putting stuff into libplomrogue.
authorChristian Heller <c.heller@plomlompom.de>
Mon, 9 Mar 2015 01:45:59 +0000 (02:45 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 9 Mar 2015 01:45:59 +0000 (02:45 +0100)
compile-server.sh
libplomrogue.c
plomrogue-server.py

index 88be995a37a5cdab9a8d1e06e41e2a0b693bef81..5fdc7b21e6639edc5d9a7ccef860e189bf48f466 100755 (executable)
@@ -1,2 +1,2 @@
 #!/bin/sh
-gcc -shared -fPIC -std=c11 -pedantic-errors -Wall -Werror -Wextra -Wformat-security -O3 -o libplomrogue.so libplomrogue.c
+gcc -shared -fPIC -std=c11 -pedantic-errors -Wall -Werror -Wextra -Wformat-security -O3 -o libplomrogue.so libplomrogue.c -lm
index 4002dedefea35a17ffecb8f584b47493c9bd8984..9a4e69a7cdd2158374b16a77102a41b46b69798e 100644 (file)
@@ -1,3 +1,4 @@
+#include <math.h> /* pow() */
 #include <stddef.h> /* NULL */
 #include <stdint.h> /* ?(u)int(8|16|32)_t, ?(U)INT8_(MIN|MAX) */
 #include <stdlib.h> /* free, malloc */
@@ -559,3 +560,40 @@ extern uint8_t dijkstra_map()
     }
     return 0;
 }
+
+extern uint8_t zero_score_map_where_char_on_memdepthmap(char c,
+                                                        char * memdepthmap)
+{
+    if (!score_map)
+    {
+        return 1;
+    }
+    uint32_t map_size = maplength * maplength;
+    uint16_t pos;
+    for (pos = 0; pos < map_size; pos++)
+    {
+        if (c == memdepthmap[pos])
+        {
+            score_map[pos] = 0;
+        }
+    }
+    return 0;
+}
+
+extern void age_some_memdepthmap_on_nonfov_cells(char * memdepthmap,
+                                                     char * fovmap)
+{
+    uint32_t map_size = maplength * maplength;
+    uint16_t pos;
+    for (pos = 0; pos < map_size; pos++)
+    {
+        if ('v' != fovmap[pos])
+        {
+            char c = memdepthmap[pos];
+            if( '0' <= c && '9' > c && !(rrand() % (uint16_t) pow(2, c - 48)))
+            {
+                memdepthmap[pos]++;
+            }
+        }
+    }
+}
index b47c0e6f346f57bc7eb80242c43f6e366498421e..204c131282d512fc20459c78ed32b21dde70a67c 100755 (executable)
@@ -480,13 +480,10 @@ def update_map_memory(t, age_map=True):
         if ord_space == t["T_MEMMAP"][pos]:
             t["T_MEMMAP"][pos] = world_db["MAP"][pos]
     if age_map:
-         for pos in [pos for pos in range(world_db["MAP_LENGTH"] ** 2)
-                     if not ord_v == t["fovmap"][pos]
-                     if ord_0 <= t["T_MEMDEPTHMAP"][pos]
-                     if ord_9 > t["T_MEMDEPTHMAP"][pos]
-                     if not rand.next() % (2 **
-                                           (t["T_MEMDEPTHMAP"][pos] - 48))]:
-            t["T_MEMDEPTHMAP"][pos] += 1
+        maptype = ctypes.c_char * len(t["T_MEMDEPTHMAP"])
+        memdepthmap = maptype.from_buffer(t["T_MEMDEPTHMAP"])
+        fovmap = maptype.from_buffer(t["fovmap"])
+        libpr.age_some_memdepthmap_on_nonfov_cells(memdepthmap, fovmap)
     for mt in [mt for mt in t["T_MEMTHING"]
                if "v" == chr(t["fovmap"][(mt[1] * world_db["MAP_LENGTH"])
                                          + mt[2]])]:
@@ -781,6 +778,14 @@ def get_dir_to_target(t, filter):
     "s": memory map cell with greatest-reachable degree of unexploredness
     """
 
+    def zero_score_map_where_char_on_memdepthmap(c):
+        maptype = ctypes.c_char * len(t["T_MEMDEPTHMAP"])
+        map = maptype.from_buffer(t["T_MEMDEPTHMAP"])
+        test = libpr.zero_score_map_where_char_on_memdepthmap(c, map)
+        if test:
+            raise RuntimeError("No score map allocated for "
+                               "zero_score_map_where_char_on_memdepthmap().")
+
     def set_map_score(pos, score):
         test = libpr.set_map_score(pos, score)
         if test:
@@ -857,9 +862,7 @@ def get_dir_to_target(t, filter):
                        if world_db["ThingTypes"][mt[0]]["TT_CONSUMABLE"]]:
                 set_map_score(mt[1] * world_db["MAP_LENGTH"] + mt[2], 0)
         elif "s" == filter:
-            for i in [i for i in range(world_db["MAP_LENGTH"] ** 2)
-                      if t["T_MEMDEPTHMAP"][i] == mem_depth_c[0]]:
-                set_map_score(i, 0)
+            zero_score_map_where_char_on_memdepthmap(mem_depth_c[0])
 
     def rand_target_dir(neighbors, cmp, dirs):
         candidates = []