From e9a37a285ab627535c0fe983e1eda815c1d587b5 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sat, 27 Feb 2016 02:33:45 +0100 Subject: [PATCH] Server, plugin: Refactor make_world modularity. --- plugins/server/PleaseTheIslandGod.py | 134 ++++++++------------------- server/commands.py | 4 +- server/config/make_world_helpers.py | 10 ++ server/config/misc.py | 4 - server/make_world.py | 50 ++++------ server/world_makable.py | 29 ++++++ 6 files changed, 97 insertions(+), 134 deletions(-) create mode 100644 server/config/make_world_helpers.py create mode 100644 server/world_makable.py diff --git a/plugins/server/PleaseTheIslandGod.py b/plugins/server/PleaseTheIslandGod.py index d126c41..93e6981 100644 --- a/plugins/server/PleaseTheIslandGod.py +++ b/plugins/server/PleaseTheIslandGod.py @@ -9,79 +9,43 @@ from server.utils import mv_yx_in_dir_legal, rand, id_setter from server.config.io import io_db from server.new_thing import new_Thing -def make_world(seed): - from server.update_map_memory import update_map_memory - from server.config.misc import make_map_func - from server.utils import libpr - - def free_pos(plant=False): - 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"] - pos = y * world_db["MAP_LENGTH"] + x; - if (not plant - and "." == chr(world_db["MAP"][pos])) \ - or ":" == chr(world_db["MAP"][pos]): - break - i += 1 - if i == 65535: - raise SystemExit(err) - 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 +def pos_test(type, y, x): + pos = y * world_db["MAP_LENGTH"] + x; + plant = world_db["ThingTypes"][type]["TT_PROLIFERATE"] + return (not plant or ":" == chr(world_db["MAP"][pos])) + +def world_makable(): + from server.world_makable import world_makable + playertype = world_makable() for name in world_db["specials"]: if world_db[name] not in world_db["ThingTypes"]: print("Ignoring: No valid " + name + " set.") - 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") - plantness = world_db["ThingTypes"][type]["TT_PROLIFERATE"] - world_db["Things"][id] = new_Thing(type, free_pos(plantness)) - strong_write(io_db["file_out"], "NEW_WORLD\n") + return -1 + return playertype + +def make_map(): + from server.make_map import make_map, is_neighbor, new_pos + global rand + make_map() + length = world_db["MAP_LENGTH"] + n_colons = int((length ** 2) / 16) + i_colons = 0 + while (i_colons <= n_colons): + single_allowed = rand.next() % 256 + y, x, pos = new_pos() + if ("." == chr(world_db["MAP"][pos]) + and ((not single_allowed) or is_neighbor((y, x), ":"))): + world_db["MAP"][pos] = ord(":") + i_colons += 1 + altar_placed = False + while not altar_placed: + y, x, pos = new_pos() + if (("." == chr(world_db["MAP"][pos] + or ":" == chr(world_db["MAP"][pos])) + and not is_neighbor((y, x), "X"))): + world_db["MAP"][pos] = ord("_") + world_db["altar"] = (y, x) + altar_placed = True def thingproliferation(t, prol_map): from server.new_thing import new_Thing @@ -117,30 +81,6 @@ def thingproliferation(t, prol_map): log("The Island God SMILES upon a new-born bear baby.") world_db["GOD_FAVOR"] += 750 -def make_map(): - from server.make_map import make_map, is_neighbor, new_pos - global rand - make_map() - length = world_db["MAP_LENGTH"] - n_colons = int((length ** 2) / 16) - i_colons = 0 - while (i_colons <= n_colons): - single_allowed = rand.next() % 256 - y, x, pos = new_pos() - if ("." == chr(world_db["MAP"][pos]) - and ((not single_allowed) or is_neighbor((y, x), ":"))): - world_db["MAP"][pos] = ord(":") - i_colons += 1 - altar_placed = False - while not altar_placed: - y, x, pos = new_pos() - if (("." == chr(world_db["MAP"][pos] - or ":" == chr(world_db["MAP"][pos])) - and not is_neighbor((y, x), "X"))): - world_db["MAP"][pos] = ord("_") - world_db["altar"] = (y, x) - altar_placed = True - def ai(t): from server.ai import get_dir_to_target, get_inventory_slot_to_consume, \ standing_on_food @@ -802,6 +742,10 @@ commands_db["pickup"] = (0, False, play_pickup) import server.config.misc server.config.misc.make_map_func = make_map server.config.misc.thingproliferation_func = thingproliferation -server.config.misc.make_world = make_world server.config.misc.decrement_lifepoints_func = decrement_lifepoints server.config.misc.calc_effort_func = calc_effort + +import server.config.make_world_helpers +server.config.make_world_helpers.pos_test_func = pos_test +server.config.make_world_helpers.world_makable_func = world_makable +server.config.make_world_helpers.make_map_func = make_map diff --git a/server/commands.py b/server/commands.py index eb8cf1c..72018be 100644 --- a/server/commands.py +++ b/server/commands.py @@ -87,8 +87,8 @@ def command_makeworld(seed_string): """Call make_world().""" val = integer_test(seed_string, 0, 4294967295) if None != val: - from server.config.misc import make_world_func - make_world_func(val) + from server.make_world import make_world + make_world(val) def command_maplength(maplength_string): diff --git a/server/config/make_world_helpers.py b/server/config/make_world_helpers.py new file mode 100644 index 0000000..21b4239 --- /dev/null +++ b/server/config/make_world_helpers.py @@ -0,0 +1,10 @@ +# 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. + +from server.make_map import make_map +from server.world_makable import world_makable + +pos_test_func = lambda a, b, c: True +make_map_func = make_map +world_makable_func = world_makable diff --git a/server/config/misc.py b/server/config/misc.py index bcec1fa..05fbe50 100644 --- a/server/config/misc.py +++ b/server/config/misc.py @@ -2,14 +2,10 @@ # 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. -from server.make_map import make_map from server.thingproliferation import thingproliferation -from server.make_world import make_world from server.decrement_lifepoints import decrement_lifepoints from server.calc_effort import calc_effort decrement_lifepoints_func = decrement_lifepoints -make_map_func = make_map thingproliferation_func = thingproliferation -make_world_func = make_world calc_effort_func = calc_effort diff --git a/server/make_world.py b/server/make_world.py index ad1a84d..23609c6 100644 --- a/server/make_world.py +++ b/server/make_world.py @@ -3,6 +3,16 @@ # see the file NOTICE in the root directory of the PlomRogue source package. +from server.config.world_data import world_db, symbols_passable +from server.config.make_world_helpers import make_map_func, \ + world_makable_func, pos_test_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 make_world(seed): """(Re-)build game world, i.e. map, things, to a new turn 1 from seed. @@ -14,15 +24,7 @@ def make_world(seed): 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(): + def free_pos(type): i = 0 while 1: err = "Space to put thing on too hard to find. Map too small?" @@ -30,7 +32,7 @@ def make_world(seed): 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: + symbols_passable and pos_test_func(type, y, x): break i += 1 if i == 65535: @@ -44,36 +46,18 @@ def make_world(seed): break return (y, x) - rand.seed = seed - if world_db["MAP_LENGTH"] < 1: - print("Ignoring: No map length >= 1 defined.") + playertype = world_makable_func() + if playertype < 0: return + rand.seed = seed 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()) + world_db["Things"][id] = new_Thing(playertype, free_pos(playertype)) if not world_db["Things"][0]["fovmap"]: empty_fovmap = bytearray(b" " * world_db["MAP_LENGTH"] ** 2) world_db["Things"][0]["fovmap"] = empty_fovmap @@ -82,5 +66,5 @@ def make_world(seed): 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()) + world_db["Things"][id] = new_Thing(type, free_pos(type)) strong_write(io_db["file_out"], "NEW_WORLD\n") diff --git a/server/world_makable.py b/server/world_makable.py new file mode 100644 index 0000000..c8f1b73 --- /dev/null +++ b/server/world_makable.py @@ -0,0 +1,29 @@ +# 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 world_makable(): + from server.config.world_data import world_db + if world_db["MAP_LENGTH"] < 1: + print("Ignoring: No map length >= 1 defined.") + return -1 + 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 -1 + 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 -1 + return playertype -- 2.30.2