home · contact · privacy
Server, plugin: Refactor actor_pickup plugin hooking.
authorChristian Heller <c.heller@plomlompom.de>
Sat, 27 Feb 2016 11:40:47 +0000 (12:40 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 27 Feb 2016 11:40:47 +0000 (12:40 +0100)
plugins/server/PleaseTheIslandGod.py
server/actions.py
server/config/actions.py

index 4b8a7d73db1c4ba268cbe80ff1decec3ac8aedd8..d28e235458ea0439a321f51745239f72117d35e5 100644 (file)
@@ -70,40 +70,25 @@ def ai_hook_pickup_test(t):
         world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]
 
 def actor_pickup(t):
         world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]
 
 def actor_pickup(t):
-    from server.ai import eat_vs_hunger_threshold
     used_slots = len(t["T_CARRIES"])
     if used_slots < world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]:
     used_slots = len(t["T_CARRIES"])
     if used_slots < world_db["ThingTypes"][t["T_TYPE"]]["TT_STORAGE"]:
-        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):
-            lowest_tid = -1
-            eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
-            for iid in ids:
-                tid = world_db["Things"][iid]["T_TYPE"] 
-                if lowest_tid == -1 or tid < lowest_tid:
-                    if (t != world_db["Things"][0] and
-                        (world_db["ThingTypes"][tid]["TT_TOOL"] != "food"
-                         or (world_db["ThingTypes"][tid]["TT_TOOLPOWER"]
-                             <= eat_cost))):
-                        continue
-                    id = iid
-                    lowest_tid = tid
-            world_db["Things"][id]["carried"] = True
-            ty = world_db["Things"][id]["T_TYPE"]
-            if (t != world_db["Things"][0]
-                and world_db["Things"][id]["T_PLAYERDROP"]
-                and world_db["ThingTypes"][ty]["TT_TOOL"] == "food"):
-                score = int(world_db["ThingTypes"][ty]["TT_TOOLPOWER"] / 32)
+        from server.actions import actor_pickup
+        t_picked = actor_pickup(t)
+        if t_picked != None:
+            ty = world_db["ThingTypes"][t_picked["T_TYPE"]]
+            if t != world_db["Things"][0] and t_picked["T_PLAYERDROP"] \
+                    and ty["TT_TOOL"] == "food":
+                score = int(ty["TT_TOOLPOWER"] / 32)
                 world_db["GOD_FAVOR"] += score
                 world_db["GOD_FAVOR"] += score
-                world_db["Things"][id]["T_PLAYERDROP"] = 0
-            t["T_CARRIES"].append(id)
-            if t == world_db["Things"][0]:
-                log("You PICK UP an object.")
+                t_picked["T_PLAYERDROP"] = 0
     elif t == world_db["Things"][0]:
         log("CAN'T pick up object: No storage room to carry more.")
 
     elif t == world_db["Things"][0]:
         log("CAN'T pick up object: No storage room to carry more.")
 
+def actor_pickup_test_hook(t, tid):
+    from server.ai import eat_vs_hunger_threshold
+    tt = world_db["ThingTypes"][tid]
+    return not (t != world_db["Things"][0] and (tt["TT_TOOL"] != "food" or
+            (tt["TT_TOOLPOWER"] <= eat_vs_hunger_threshold(t["T_TYPE"]))))
 
 def actor_drop(t):
     """Make t rop Thing from inventory to ground indexed by T_ARGUMENT."""
 
 def actor_drop(t):
     """Make t rop Thing from inventory to ground indexed by T_ARGUMENT."""
@@ -115,7 +100,6 @@ def actor_drop(t):
             log("You DROP an object.")
             world_db["Things"][id]["T_PLAYERDROP"] = 1
 
             log("You DROP an object.")
             world_db["Things"][id]["T_PLAYERDROP"] = 1
 
-
 def actor_use(t):
     if len(t["T_CARRIES"]):
         id = t["T_CARRIES"][t["T_ARGUMENT"]]
 def actor_use(t):
     if len(t["T_CARRIES"]):
         id = t["T_CARRIES"][t["T_ARGUMENT"]]
@@ -677,6 +661,7 @@ server.config.actions.action_db["actor_move"] = actor_move
 server.config.actions.action_db["actor_pickup"] = actor_pickup
 server.config.actions.action_db["actor_drop"] = actor_drop
 server.config.actions.action_db["actor_use"] = actor_use
 server.config.actions.action_db["actor_pickup"] = actor_pickup
 server.config.actions.action_db["actor_drop"] = actor_drop
 server.config.actions.action_db["actor_use"] = actor_use
+server.config.actions.actor_pickup_test_hook = actor_pickup_test_hook
 
 from server.config.commands import commands_db
 commands_db["TT_ID"] = (1, False, command_ttid)
 
 from server.config.commands import commands_db
 commands_db["TT_ID"] = (1, False, command_ttid)
index dd9d9e7f21c294685d76248b0e02b731b2cdec71..5492dbe97b2f9bbcb62cb79b5cbe4b852b9ba181 100644 (file)
@@ -55,7 +55,7 @@ def actor_move(t):
 
 
 def actor_pickup(t):
 
 
 def actor_pickup(t):
-    """Make t pick up (topmost?) Thing from ground into inventory.
+    """Make t pick up (topmost?) Thing from ground into inventory. Return it.
 
     Define topmostness by how low the thing's type ID is.
     """
 
     Define topmostness by how low the thing's type ID is.
     """
@@ -67,14 +67,16 @@ def actor_pickup(t):
         lowest_tid = -1
         for iid in ids:
             tid = world_db["Things"][iid]["T_TYPE"]
         lowest_tid = -1
         for iid in ids:
             tid = world_db["Things"][iid]["T_TYPE"]
-            if lowest_tid == -1 or tid < lowest_tid:
+            from server.config.actions import actor_pickup_test_hook
+            if (lowest_tid == -1 or tid < lowest_tid) and \
+                    actor_pickup_test_hook(t, tid):
                 id = iid
                 lowest_tid = tid
         world_db["Things"][id]["carried"] = True
         t["T_CARRIES"].append(id)
         if t == world_db["Things"][0]:
                 log("You PICK UP an object.")
                 id = iid
                 lowest_tid = tid
         world_db["Things"][id]["carried"] = True
         t["T_CARRIES"].append(id)
         if t == world_db["Things"][0]:
                 log("You PICK UP an object.")
-
+        return world_db["Things"][id]
 
 def actor_drop(t):
     """Make t rop Thing from inventory to ground indexed by T_ARGUMENT."""
 
 def actor_drop(t):
     """Make t rop Thing from inventory to ground indexed by T_ARGUMENT."""
index 7f3af9a1116b3364552d78a429b002eb147a3632..5af2d75eb722a50c74ec9df7fa969a81026e9404 100644 (file)
@@ -5,6 +5,8 @@
 
 from server.actions import actor_wait, actor_move, actor_pickup, actor_drop, \
     actor_use
 
 from server.actions import actor_wait, actor_move, actor_pickup, actor_drop, \
     actor_use
+
+
 action_db = {
     "actor_wait": actor_wait,
     "actor_move": actor_move,
 action_db = {
     "actor_wait": actor_wait,
     "actor_move": actor_move,
@@ -12,3 +14,4 @@ action_db = {
     "actor_drop": actor_drop,
     "actor_use": actor_use
 }
     "actor_drop": actor_drop,
     "actor_use": actor_use
 }
+actor_pickup_test_hook = lambda x, y: True