is called (and io_db["record_chunk"] written) if 15 seconds have passed
since the last time it was called. The prefix string is inserted into the
server's input message between its beginning 'input ' and ':'. All activity
- is preceded by a server_test() call.
+ is preceded by a server_test() call. Commands that start with a lowercase
+ letter are ignored when world_db["WORLD_ACTIVE"] is False/0.
"""
server_test()
if io_db["verbose"]:
and len(tokens) == commands_db[tokens[0]][0] + 1:
if commands_db[tokens[0]][1]:
commands_db[tokens[0]][2](*tokens[1:])
+ elif tokens[0][0].islower() and not world_db["WORLD_ACTIVE"]:
+ print("Ignoring lowercase-starting commands when world inactive.")
elif replay:
print("Due to replay mode, reading command as 'go on in record'.")
line = io_db["file_record"].readline()
if time.time() > io_db["save_wait"] + 15:
atomic_write(io_db["path_record"], io_db["record_chunk"],
do_append=True)
- save_world()
+ if world_db["WORLD_ACTIVE"]:
+ save_world()
io_db["record_chunk"] = ""
io_db["save_wait"] = time.time()
io_db["worldstate_updateable"] = world_db["WORLD_ACTIVE"]
t["T_MEMMAP"][pos] = world_db["MAP"][pos]
if age_map:
age_some_memdepthmap_on_nonfov_cells()
- for mt in [mt for mt in t["T_MEMTHING"]
- if ord_v == t["fovmap"][(mt[1] * world_db["MAP_LENGTH"])
- + mt[2]]]:
- t["T_MEMTHING"].remove(mt)
+ 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"]
def actor_pick_up(t):
"""Make t pick up (topmost?) Thing from ground into inventory."""
- # Topmostness is actually not defined so far. Picks Thing with highest ID.
+ # Topmostness is actually not defined so far. Picks most nutritious Thing.
ids = [id for id in world_db["Things"] if 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"]]
if len(ids):
- highest_id = 0
+ highest_id = ids[0]
+ nutritious = 0
for id in ids:
- if id > highest_id:
+ type = world_db["Things"][id]["T_TYPE"]
+ if world_db["ThingTypes"][type]["TT_CONSUMABLE"] > nutritious:
+ nutritious = world_db["ThingTypes"][type]["TT_CONSUMABLE"]
highest_id = id
world_db["Things"][highest_id]["carried"] = True
t["T_CARRIES"].append(highest_id)
"LOG You try to use an object, but you own none.\n")
-def thingproliferation(t):
- """To chance of 1/TT_PROLIFERATE, create t offspring in neighbor cell.
+def thingproliferation(t, prol_map):
+ """To chance of 1/TT_PROLIFERATE, create t offspring in open neighbor cell.
- Naturally only works with TT_PROLIFERATE > 0. The neighbor cell must be
- passable and not be inhabited by a Thing of the same type, or, if Thing is
- animate, any other animate Thing. If there are several map cell candidates,
- one is selected randomly.
+ Naturally only works with TT_PROLIFERATE > 0. The neighbor cell must be be
+ marked '.' in prol_map. If there are several map cell candidates, one is
+ selected randomly.
"""
- def test_cell(t, y, x):
- if "." == chr(world_db["MAP"][(y * world_db["MAP_LENGTH"]) + x]):
- for id in [id for id in world_db["Things"]
- if y == world_db["Things"][id]["T_POSY"]
- if x == world_db["Things"][id]["T_POSX"]
- if (t["T_TYPE"] == world_db["Things"][id]["T_TYPE"])
- or (t["T_LIFEPOINTS"] and
- world_db["Things"][id]["T_LIFEPOINTS"])]:
- return False
- return True
- return False
prolscore = world_db["ThingTypes"][t["T_TYPE"]]["TT_PROLIFERATE"]
if prolscore and (1 == prolscore or 1 == (rand.next() % prolscore)):
candidates = []
for dir in [directions_db[key] for key in directions_db]:
mv_result = mv_yx_in_dir_legal(dir, t["T_POSY"], t["T_POSX"])
- if mv_result[0] and test_cell(t, mv_result[1], mv_result[2]):
+ if mv_result[0] and ord('.') == prol_map[mv_result[1]
+ * world_db["MAP_LENGTH"]
+ + mv_result[2]]:
candidates.append((mv_result[1], mv_result[2]))
if len(candidates):
i = rand.next() % len(candidates)
id = 0
whilebreaker = False
while world_db["Things"][0]["T_LIFEPOINTS"]:
+ proliferable_map = world_db["MAP"][:]
+ for id in [id for id in world_db["Things"]
+ if not world_db["Things"][id]["carried"]]:
+ y = world_db["Things"][id]["T_POSY"]
+ x = world_db["Things"][id]["T_POSX"]
+ proliferable_map[y * world_db["MAP_LENGTH"] + x] = ord('X')
for id in [id for id in world_db["Things"]]: # Only what's from start!
if not id in world_db["Things"] or \
world_db["Things"][id]["carried"]: # May have been consumed or
Thing["T_COMMAND"] = 0
Thing["T_PROGRESS"] = 0
hunger(Thing)
- thingproliferation(Thing)
+ thingproliferation(Thing, proliferable_map)
if whilebreaker:
break
world_db["TURN"] += 1
def command_quit():
"""Abort server process."""
if None == opts.replay:
- save_world()
+ if world_db["WORLD_ACTIVE"]:
+ save_world()
atomic_write(io_db["path_record"], io_db["record_chunk"], do_append=True)
raise SystemExit("received QUIT command")
"""Toggle world_db["WORLD_ACTIVE"] if possible.
An active world can always be set inactive. An inactive world can only be
- set active with a "wait" ThingAction, and a player Thing (of ID 0). On
- activation, rebuild all Things' FOVs, and the player's map memory.
+ set active with a "wait" ThingAction, and a player Thing (of ID 0), and a
+ map. On activation, rebuild all Things' FOVs, and the player's map memory.
"""
- # In original version, map existence was also tested (unnecessarily?).
val = integer_test(worldactive_string, 0, 1)
if val:
if 0 != world_db["WORLD_ACTIVE"]:
if 0 == Thing:
player_exists = True
break
- if wait_exists and player_exists:
+ if wait_exists and player_exists and "MAP" in world_db:
for id in world_db["Things"]:
if world_db["Things"][id]["T_LIFEPOINTS"]:
build_fov_map(world_db["Things"][id])