home · contact · privacy
Server/py: Fix thing proliferation bug in turn_over().
[plomrogue] / plomrogue-server.py
index a3c8f8fd27e25d0a89a04d3ed64a7938fd54b0e0..5223e4bf0438945036378543b88e31926e7ed80d 100755 (executable)
@@ -465,7 +465,7 @@ def remake_map():
     # 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))
@@ -477,15 +477,16 @@ def update_map_memory(t):
             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"]
@@ -621,21 +622,26 @@ def actor_move(t):
             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]:
@@ -667,15 +673,15 @@ def actor_use(t):
             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):
@@ -814,9 +820,10 @@ def turn_over():
     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"]: