From 455db0213bfd97aff1a6309c9c53f6701c3fce84 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 9 Mar 2015 02:45:59 +0100 Subject: [PATCH] Server/py: Further optimizations by putting stuff into libplomrogue. --- compile-server.sh | 2 +- libplomrogue.c | 38 ++++++++++++++++++++++++++++++++++++++ plomrogue-server.py | 23 +++++++++++++---------- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/compile-server.sh b/compile-server.sh index 88be995..5fdc7b2 100755 --- a/compile-server.sh +++ b/compile-server.sh @@ -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 diff --git a/libplomrogue.c b/libplomrogue.c index 4002ded..9a4e69a 100644 --- a/libplomrogue.c +++ b/libplomrogue.c @@ -1,3 +1,4 @@ +#include /* pow() */ #include /* NULL */ #include /* ?(u)int(8|16|32)_t, ?(U)INT8_(MIN|MAX) */ #include /* 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]++; + } + } + } +} diff --git a/plomrogue-server.py b/plomrogue-server.py index b47c0e6..204c131 100755 --- a/plomrogue-server.py +++ b/plomrogue-server.py @@ -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 = [] -- 2.30.2