From f6a1bf0aa76165c104d74fe8dfaf674d3e63b52d Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 22 Feb 2016 23:46:22 +0100 Subject: [PATCH] Server: Make make_world function selectable. --- server/commands.py | 7 +- server/config/misc.py | 2 + server/make_world.py | 86 ++++++++++++++++++++++++ server/update_map_memory.py | 49 ++++++++++++++ server/world.py | 129 +----------------------------------- 5 files changed, 143 insertions(+), 130 deletions(-) create mode 100644 server/make_world.py create mode 100644 server/update_map_memory.py diff --git a/server/commands.py b/server/commands.py index 71094e3..f55400b 100644 --- a/server/commands.py +++ b/server/commands.py @@ -7,7 +7,8 @@ from server.config.world_data import world_db from server.config.io import io_db from server.io import log, strong_write from server.utils import integer_test, id_setter -from server.world import update_map_memory, set_world_inactive, turn_over +from server.world import set_world_inactive, turn_over +from server.update_map_memory import update_map_memory from server.build_fov_map import build_fov_map @@ -83,8 +84,8 @@ def command_makeworld(seed_string): """Call make_world().""" val = integer_test(seed_string, 0, 4294967295) if None != val: - from server.world import make_world - make_world(val) + from server.config.misc import make_world_func + make_world_func(val) def command_maplength(maplength_string): diff --git a/server/config/misc.py b/server/config/misc.py index 89af76f..8d0b6b0 100644 --- a/server/config/misc.py +++ b/server/config/misc.py @@ -4,6 +4,8 @@ from server.make_map import make_map from server.thingproliferation import thingproliferation +from server.make_world import make_world make_map_func = make_map thingproliferation_func = thingproliferation +make_world_func = make_world diff --git a/server/make_world.py b/server/make_world.py new file mode 100644 index 0000000..ad1a84d --- /dev/null +++ b/server/make_world.py @@ -0,0 +1,86 @@ +# 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 make_world(seed): + """(Re-)build game world, i.e. map, things, to a new turn 1 from seed. + + Seed rand with seed. Do more only with a "wait" ThingAction and + world["PLAYER_TYPE"] matching ThingType of TT_START_NUMBER > 0. Then, + world_db["Things"] emptied, call make_map() and set + world_db["WORLD_ACTIVE"], world_db["TURN"] to 1. Build new Things + according to ThingTypes' TT_START_NUMBERS, with Thing of ID 0 to ThingType + 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(): + 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"] + if chr(world_db["MAP"][y * world_db["MAP_LENGTH"] + x]) in \ + symbols_passable: + break + i += 1 + if i == 65535: + raise SystemExit(err) + # Replica of C code, wrongly ignores animatedness of new Thing. + 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 + 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") + world_db["Things"][id] = new_Thing(type, free_pos()) + strong_write(io_db["file_out"], "NEW_WORLD\n") diff --git a/server/update_map_memory.py b/server/update_map_memory.py new file mode 100644 index 0000000..d018e84 --- /dev/null +++ b/server/update_map_memory.py @@ -0,0 +1,49 @@ +# 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 update_map_memory(t, age_map=True): + """Update t's T_MEMMAP with what's in its FOV now,age its T_MEMMEPTHMAP.""" + from server.utils import c_pointer_to_bytearray, libpr + from server.config.world_data import world_db + + def age_some_memdepthmap_on_nonfov_cells(): + # OUTSOURCED FOR PERFORMANCE REASONS TO libplomrogue.so: + # ord_v = ord("v") + # ord_0 = ord("0") + # ord_9 = ord("9") + # 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 + memdepthmap = c_pointer_to_bytearray(t["T_MEMDEPTHMAP"]) + fovmap = c_pointer_to_bytearray(t["fovmap"]) + libpr.age_some_memdepthmap_on_nonfov_cells(memdepthmap, fovmap) + + if not t["T_MEMMAP"]: + t["T_MEMMAP"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2)) + if not t["T_MEMDEPTHMAP"]: + t["T_MEMDEPTHMAP"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2)) + ord_v = ord("v") + ord_0 = ord("0") + for pos in [pos for pos in range(world_db["MAP_LENGTH"] ** 2) + if ord_v == t["fovmap"][pos]]: + t["T_MEMDEPTHMAP"][pos] = ord_0 + t["T_MEMMAP"][pos] = world_db["MAP"][pos] + if age_map: + age_some_memdepthmap_on_nonfov_cells() + t["T_MEMTHING"] = [mt for mt in t["T_MEMTHING"] + if ord_v != t["fovmap"][(mt[1] * world_db["MAP_LENGTH"]) + + mt[2]]] + for id in [id for id in world_db["Things"] + if not world_db["Things"][id]["carried"]]: + type = world_db["Things"][id]["T_TYPE"] + if not world_db["ThingTypes"][type]["TT_LIFEPOINTS"]: + y = world_db["Things"][id]["T_POSY"] + x = world_db["Things"][id]["T_POSX"] + if ord_v == t["fovmap"][(y * world_db["MAP_LENGTH"]) + x]: + t["T_MEMTHING"].append((type, y, x)) diff --git a/server/world.py b/server/world.py index a7efc13..6b03d0a 100644 --- a/server/world.py +++ b/server/world.py @@ -5,55 +5,10 @@ from server.config.world_data import world_db from server.io import log -from server.utils import rand, libpr +from server.utils import rand from server.utils import id_setter -def update_map_memory(t, age_map=True): - """Update t's T_MEMMAP with what's in its FOV now,age its T_MEMMEPTHMAP.""" - from server.utils import c_pointer_to_bytearray - - def age_some_memdepthmap_on_nonfov_cells(): - # OUTSOURCED FOR PERFORMANCE REASONS TO libplomrogue.so: - # ord_v = ord("v") - # ord_0 = ord("0") - # ord_9 = ord("9") - # 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 - memdepthmap = c_pointer_to_bytearray(t["T_MEMDEPTHMAP"]) - fovmap = c_pointer_to_bytearray(t["fovmap"]) - libpr.age_some_memdepthmap_on_nonfov_cells(memdepthmap, fovmap) - - if not t["T_MEMMAP"]: - t["T_MEMMAP"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2)) - if not t["T_MEMDEPTHMAP"]: - t["T_MEMDEPTHMAP"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2)) - ord_v = ord("v") - ord_0 = ord("0") - for pos in [pos for pos in range(world_db["MAP_LENGTH"] ** 2) - if ord_v == t["fovmap"][pos]]: - t["T_MEMDEPTHMAP"][pos] = ord_0 - t["T_MEMMAP"][pos] = world_db["MAP"][pos] - if age_map: - age_some_memdepthmap_on_nonfov_cells() - t["T_MEMTHING"] = [mt for mt in t["T_MEMTHING"] - if ord_v != t["fovmap"][(mt[1] * world_db["MAP_LENGTH"]) - + mt[2]]] - for id in [id for id in world_db["Things"] - if not world_db["Things"][id]["carried"]]: - type = world_db["Things"][id]["T_TYPE"] - if not world_db["ThingTypes"][type]["TT_LIFEPOINTS"]: - y = world_db["Things"][id]["T_POSY"] - x = world_db["Things"][id]["T_POSX"] - if ord_v == t["fovmap"][(y * world_db["MAP_LENGTH"]) + x]: - t["T_MEMTHING"].append((type, y, x)) - - def decrement_lifepoints(t): """Decrement t's lifepoints by 1, and if to zero, corpse it. @@ -120,91 +75,11 @@ def set_world_inactive(): world_db["WORLD_ACTIVE"] = 0 -def make_world(seed): - """(Re-)build game world, i.e. map, things, to a new turn 1 from seed. - - Seed rand with seed. Do more only with a "wait" ThingAction and - world["PLAYER_TYPE"] matching ThingType of TT_START_NUMBER > 0. Then, - world_db["Things"] emptied, call make_map() and set - world_db["WORLD_ACTIVE"], world_db["TURN"] to 1. Build new Things - according to ThingTypes' TT_START_NUMBERS, with Thing of ID 0 to ThingType - 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 symbols_passable - from server.config.misc import make_map_func - - def free_pos(): - 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"] - if chr(world_db["MAP"][y * world_db["MAP_LENGTH"] + x]) in \ - symbols_passable: - break - i += 1 - if i == 65535: - raise SystemExit(err) - # Replica of C code, wrongly ignores animatedness of new Thing. - 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 - world_db["Things"] = {} - make_map_func() - world_db["WORLD_ACTIVE"] = 1 - world_db["TURN"] = 1 - from server.new_thing import new_Thing - 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") - world_db["Things"][id] = new_Thing(type, free_pos()) - from server.config.io import io_db - from server.io import strong_write - strong_write(io_db["file_out"], "NEW_WORLD\n") - - def turn_over(): """Run game world and its inhabitants until new player input expected.""" from server.config.actions import action_db, ai_func from server.config.misc import thingproliferation_func + from server.update_map_memory import update_map_memory id = 0 whilebreaker = False while world_db["Things"][0]["T_LIFEPOINTS"]: -- 2.30.2