+def command_worldactive(worldactive_string):
+ val = integer_test(worldactive_string, 0, 1)
+ if None != val:
+ if 0 != world_db["WORLD_ACTIVE"]:
+ if 0 == val:
+ set_world_inactive()
+ else:
+ print("World already active.")
+ elif 0 == world_db["WORLD_ACTIVE"]:
+ wait_exists = False
+ for ThingAction in world_db["ThingActions"]:
+ if "wait" == world_db["ThingActions"][ThingAction]["TA_NAME"]:
+ wait_exists = True
+ break
+ player_exists = False
+ for Thing in world_db["Things"]:
+ if 0 == Thing:
+ player_exists = True
+ break
+ altar_found = False
+ if world_db["MAP"]:
+ pos = world_db["MAP"].find(b'_')
+ if pos > 0:
+ y = int(pos / world_db["MAP_LENGTH"])
+ x = pos % world_db["MAP_LENGTH"]
+ world_db["altar"] = (y, x)
+ altar_found = True
+ specials_set = True
+ for name in world_db["specials"]:
+ if world_db[name] not in world_db["ThingTypes"]:
+ specials_set = False
+ if altar_found and wait_exists and player_exists and \
+ world_db["MAP"] and specials_set:
+ for id in world_db["Things"]:
+ if world_db["Things"][id]["T_LIFEPOINTS"]:
+ build_fov_map(world_db["Things"][id])
+ if 0 == id:
+ update_map_memory(world_db["Things"][id], False)
+ if not world_db["Things"][0]["T_LIFEPOINTS"]:
+ empty_fovmap = bytearray(b" " * world_db["MAP_LENGTH"] ** 2)
+ world_db["Things"][0]["fovmap"] = empty_fovmap
+ world_db["WORLD_ACTIVE"] = 1
+ else:
+ print("Ignoring: Not all conditions for world activation met.")
+
+def play_move(str_arg):
+ if action_exists("move"):
+ from server.config.world_data import directions_db, symbols_passable
+ t = world_db["Things"][0]
+ if not str_arg in directions_db:
+ print("Illegal move direction string.")
+ return
+ dir = ord(directions_db[str_arg])
+ from server.utils import mv_yx_in_dir_legal
+ move_result = mv_yx_in_dir_legal(chr(dir), t["T_POSY"], t["T_POSX"])
+ if 1 == move_result[0]:
+ pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2]
+ if ord("~") == world_db["MAP"][pos]:
+ log("You can't SWIM.")
+ return
+ if (ord("X") == world_db["MAP"][pos]
+ or ord("|") == world_db["MAP"][pos]):
+ carries_axe = False
+ for id in t["T_CARRIES"]:
+ type = world_db["Things"][id]["T_TYPE"]
+ if world_db["ThingTypes"][type]["TT_TOOL"] == "axe":
+ world_db["Things"][0]["T_ARGUMENT"] = dir
+ set_command("move")
+ return
+ if chr(world_db["MAP"][pos]) in symbols_passable:
+ world_db["Things"][0]["T_ARGUMENT"] = dir
+ set_command("move")
+ return
+ log("You CAN'T move there.")
+
+def play_use(str_arg):
+ if action_exists("use"):
+ t = world_db["Things"][0]
+ if 0 == len(t["T_CARRIES"]):
+ log("You have NOTHING to use in your inventory.")
+ else:
+ val = integer_test(str_arg, 0, 255)
+ if None != val and val < len(t["T_CARRIES"]):
+ id = t["T_CARRIES"][val]
+ type = world_db["Things"][id]["T_TYPE"]
+ if (world_db["ThingTypes"][type]["TT_TOOL"] == "axe"
+ and t == world_db["Things"][0]):
+ log("To use this item for chopping, move towards a tree "
+ + "while carrying it in your inventory.")
+ return
+ elif (world_db["ThingTypes"][type]["TT_TOOL"] == "carpentry"):
+ pos = t["T_POSY"] * world_db["MAP_LENGTH"] + t["T_POSX"]
+ if (world_db["MAP"][pos] == ord("X")
+ or world_db["MAP"][pos] == ord("|")):
+ log("Can't build when standing on barrier.")
+ return
+ for id in [id for id in world_db["Things"]
+ if not 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"]]:
+ log("Can't build when standing objects.")
+ return
+ wood_id = None
+ for id in t["T_CARRIES"]:
+ type_material = world_db["Things"][id]["T_TYPE"]
+ if (world_db["ThingTypes"][type_material]["TT_TOOL"]
+ == "wood"):
+ wood_id = id
+ break
+ if wood_id == None:
+ log("You can't use a "
+ + world_db["ThingTypes"][type]["TT_NAME"]
+ + " without some wood in your inventory.")
+ return
+ elif type != world_db["SLIPPERS"] and not \
+ world_db["ThingTypes"][type]["TT_TOOL"] == "food":
+ log("You CAN'T consume this thing.")
+ return
+ world_db["Things"][0]["T_ARGUMENT"] = val
+ set_command("use")
+ else:
+ print("Illegal inventory index.")
+
+def specialtypesetter(name): # #
+ def helper(str_int):
+ val = integer_test(str_int, 0)
+ if None != val:
+ world_db[name] = val
+ if world_db["WORLD_ACTIVE"] \
+ and world_db[name] not in world_db["ThingTypes"]:
+ world_db["WORLD_ACTIVE"] = 0
+ print(name + " fits no known ThingType, deactivating world.")
+ return helper
+