# This all-too-precise replica of the original C code misses iter_limit().
-def update_map_memory(t):
+def update_map_memory(t, age_map=True):
"""Update t's T_MEMMAP with what's in its FOV now,age its T_MEMMEPTHMAP."""
if not t["T_MEMMAP"]:
t["T_MEMMAP"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2))
if " " == chr(t["T_MEMMAP"][pos]):
t["T_MEMMAP"][pos] = world_db["MAP"][pos]
continue
- if ord('0') <= t["T_MEMDEPTHMAP"][pos] \
- and ord('9') >= t["T_MEMDEPTHMAP"][pos] \
+ if age_map and ord('0') <= t["T_MEMDEPTHMAP"][pos] \
+ and ord('9') > t["T_MEMDEPTHMAP"][pos] \
and not rand.next() % (2 ** (t["T_MEMDEPTHMAP"][pos] - 48)):
t["T_MEMDEPTHMAP"][pos] += 1
for mt in [mt for mt in t["T_MEMTHING"]
if "v" == chr(t["fovmap"][(mt[1] * world_db["MAP_LENGTH"])
+ mt[2]])]:
t["T_MEMTHING"].remove(mt)
- for id in world_db["Things"]:
+ 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"]
world_db["Things"][id]["T_POSY"] = move_result[1]
world_db["Things"][id]["T_POSX"] = move_result[2]
build_fov_map(t)
- strong_write(io_db["file_out"], "LOG You move " + dir + ".\n")
- else:
+ if t == world_db["Things"][0]:
+ strong_write(io_db["file_out"], "LOG You move " + dir + ".\n")
+ elif t == world_db["Things"][0]:
strong_write(io_db["file_out"], "LOG You fail to move " + dir + ".\n")
def actor_pick_up(t):
"""Make t pick up (topmost?) Thing from ground into inventory."""
- # Topmostness is actually not defined so far.
+ # Topmostness is actually not defined so far. Picks Thing with highest ID.
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):
- world_db["Things"][ids[0]]["carried"] = True
- t["T_CARRIES"].append(ids[0])
+ highest_id = 0
+ for id in ids:
+ if id > highest_id:
+ highest_id = id
+ world_db["Things"][highest_id]["carried"] = True
+ t["T_CARRIES"].append(highest_id)
if t == world_db["Things"][0]:
strong_write(io_db["file_out"], "LOG You pick up an object.\n")
elif t == world_db["Things"][0]:
t["T_CARRIES"].remove(id)
del world_db["Things"][id]
t["T_SATIATION"] += world_db["ThingTypes"][type]["TT_CONSUMABLE"]
- t["T_LIFEPOINTS"] += 1
- # Wrongly increment HPs is a replica of the original code.
- strong_write(io_db["file_out"], "LOG You consume this object.\n")
- else:
- strong_write(io_db["file_out"], "LOG You try to use this object," +
- "but fail.\n")
- else:
- strong_write(io_db["file_out"], "LOG You try to use an object, but " +
- "you own none.\n")
+ if t == world_db["Things"][0]:
+ strong_write(io_db["file_out"],
+ "LOG You consume this object.\n")
+ elif t == world_db["Things"][0]:
+ strong_write(io_db["file_out"],
+ "LOG You try to use this object, but fail.\n")
+ elif t == world_db["Things"][0]:
+ strong_write(io_db["file_out"],
+ "LOG You try to use an object, but you own none.\n")
def thingproliferation(t):
id = 0
whilebreaker = False
while world_db["Things"][0]["T_LIFEPOINTS"]:
- for id in [id for id in world_db["Things"]]:
- if not id in world_db["Things"]: # Thing may have been consumed
- continue # during turn …
+ for id in [id for id in world_db["Things"]]: # Only what is from start!
+ if not id in world_db["Things"] or \
+ world_db["Things"][id]["carried"]:# Thing may have been consumed
+ continue # or picked up during turn …
Thing = world_db["Things"][id]
if Thing["T_LIFEPOINTS"]:
if not Thing["T_COMMAND"]: