home · contact · privacy
Server: Don't calculate eat_vs_hunger_threshold more often than needed.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 3 Mar 2016 02:14:08 +0000 (03:14 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 3 Mar 2016 02:14:08 +0000 (03:14 +0100)
plugins/server/PleaseTheIslandGod.py
server/ai.py
server/commands.py
server/config/commands.py
server/io.py
server/world.py

index 2fb0f20cda6b385f32777a3be664dd26cfde67b4..8f658d5b578720dffd88f5ffba174a9e342b0019 100644 (file)
@@ -85,10 +85,10 @@ def actor_pickup(t):
         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"]))))
+            (tt["TT_TOOLPOWER"] <=
+             world_db["ThingTypes"][t["T_TYPE"]]["eat_vs_hunger_threshold"])))
 
 def actor_drop(t):
     from server.actions import actor_drop
index 54bdb6f2d282affbd301ea46f16499aec6422eec..db40625659d00878ef866e467d6973c09ee563e7 100644 (file)
@@ -6,15 +6,6 @@
 from server.config.world_data import world_db
 
 
-def eat_vs_hunger_threshold(thingtype):
-    """Return satiation cost of eating for type. Good food for it must be >."""
-    from server.world import hunger_per_turn
-    hunger_unit = hunger_per_turn(thingtype)
-    actiontype = [id for id in world_db["ThingActions"]
-               if world_db["ThingActions"][id]["TA_NAME"] == "use"][0]
-    return world_db["ThingActions"][actiontype]["TA_EFFORT"] * hunger_unit
-
-
 def get_dir_to_target(t, filter):
     """Try to set T_COMMAND/T_ARGUMENT for move to "filter"-determined target.
 
@@ -34,6 +25,7 @@ def get_dir_to_target(t, filter):
     """
     from server.utils import rand, libpr, c_pointer_to_bytearray
     from server.config.world_data import symbols_passable
+    tt = world_db["ThingTypes"][t["T_TYPE"]]
 
     def zero_score_map_where_char_on_memdepthmap(c):
         # OUTSOURCED FOR PERFORMANCE REASONS TO libplomrogue.so:
@@ -59,10 +51,10 @@ def get_dir_to_target(t, filter):
     def animates_in_fov(maplength):
         return [Thing for Thing in world_db["Things"].values()
                 if Thing["T_LIFEPOINTS"] and not Thing["carried"]
-                    and 118 == t["fovmap"][Thing["pos"]] and not Thing == t]
+                and 118 == t["fovmap"][Thing["pos"]] and not Thing == t]
 
     def good_attack_target(v):
-        eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
+        eat_cost = tt["eat_vs_hunger_threshold"]
         ty = world_db["ThingTypes"][v["T_TYPE"]]
         type_corpse = world_db["ThingTypes"][ty["TT_CORPSE_ID"]]
         if t["T_LIFEPOINTS"] > ty["TT_LIFEPOINTS"] \
@@ -78,7 +70,7 @@ def get_dir_to_target(t, filter):
                        else corpse_type["TT_TOOLPOWER"]
         type = world_db["ThingTypes"][m["T_TYPE"]]
         if t["T_LIFEPOINTS"] < type["TT_LIFEPOINTS"] \
-        and targetness > eat_vs_hunger_threshold(m["T_TYPE"]):
+            and targetness > type["eat_vs_hunger_threshold"]:
             return True
         return False
 
@@ -97,7 +89,7 @@ def get_dir_to_target(t, filter):
             return exists(Thing for Thing in animates_in_fov(maplength)
                                 if good_flee_target(Thing))
         elif t["T_MEMMAP"] and "c" == filter:
-            eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
+            eat_cost = tt["eat_vs_hunger_threshold"]
             ord_blank = ord(" ")
             map_len = world_db["MAP_LENGTH"]
             return exists(mt for mt in t["T_MEMTHING"]
@@ -134,7 +126,7 @@ def get_dir_to_target(t, filter):
             [set_map_score(Thing["pos"], 0) for
              Thing in animates_in_fov(maplen) if good_flee_target(Thing)]
         elif "c" == filter:
-            eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
+            eat_cost = tt["eat_vs_hunger_threshold"]
             ord_blank = ord(" ")
             [set_map_score(mt[1] * maplen + mt[2], 0)
              for mt in t["T_MEMTHING"]
@@ -226,7 +218,8 @@ def get_dir_to_target(t, filter):
 
 def standing_on_food(t):
     """Return True/False whether t is standing on healthy consumable."""
-    eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
+    tt = world_db["ThingTypes"][t["T_TYPE"]]
+    eat_cost = tt["eat_vs_hunger_threshold"]
     for id in [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]["pos"] == t["pos"]
@@ -243,7 +236,8 @@ def get_inventory_slot_to_consume(t):
     cmp_food = -1
     selection = -1
     i = 0
-    eat_cost = eat_vs_hunger_threshold(t["T_TYPE"])
+    tt = world_db["ThingTypes"][t["T_TYPE"]]
+    eat_cost = tt["eat_vs_hunger_threshold"]
     for id in t["T_CARRIES"]:
         type = world_db["Things"][id]["T_TYPE"]
         if world_db["ThingTypes"][type]["TT_TOOL"] == "food" \
index 536e330522a6c98e2c8a8d26856049da79db43a9..97fce9aad9881c3befb75c344b1485c50d67f828 100644 (file)
@@ -7,7 +7,7 @@ from server.config.world_data import world_db
 from server.config.io import io_db
 from server.io import log, strong_write 
 from server.utils import integer_test, id_setter
-from server.world import set_world_inactive, turn_over
+from server.world import set_world_inactive, turn_over, eat_vs_hunger_threshold
 from server.update_map_memory import update_map_memory
 from server.build_fov_map import build_fov_map
 
@@ -300,6 +300,13 @@ def command_ttcorpseid(str_int):
             print("Ignoring: Corpse ID belongs to no known ThignType.")
 
 
+@test_ThingType_id
+def command_ttlifepoints(val_string):
+    setter("ThingType", "TT_LIFEPOINTS", 0, 255)(val_string)
+    tt = world_db["ThingTypes"][command_ttid.id]
+    tt["eat_vs_hunger_threshold"] = eat_vs_hunger_threshold(command_ttid.id)
+
+
 @test_ThingAction_id
 def command_taname(name):
     """Set TA_NAME of selected ThingAction.
@@ -320,6 +327,15 @@ def command_taname(name):
         print("Ignoring: Invalid action name.")
 
 
+@test_ThingAction_id
+def command_taeffort(val_string):
+    setter("ThingAction", "TA_EFFORT", 0, 255)(val_string)
+    if world_db["ThingActions"][command_taid.id]["TA_NAME"] == "use":
+        for ttid in world_db["ThingTypes"]:
+            tt = world_db["ThingTypes"][ttid]
+            tt["eat_vs_hunger_threshold"] = eat_vs_hunger_threshold(ttid)
+
+
 def setter(category, key, min, max=None):
     """Build setter for world_db([category + "s"][id])[key] to >=min/<=max."""
     if category is None:
index ec5583a353a871da18fc9babdfae1d523735bd26..06e6f759cf1b5384957b1cabb89768db2d38fa22 100644 (file)
@@ -9,7 +9,8 @@ from server.commands import command_plugin, command_quit, command_ping, \
     command_taname, command_ttid, command_ttname, command_tttool, \
     command_ttsymbol, command_ttcorpseid, command_tid, command_tcommand, \
     command_ttype, command_tcarries, command_tmemthing, setter_tpos, \
-    play_wait, play_move, play_pickup, play_drop, play_use, command_ai
+    play_wait, play_move, play_pickup, play_drop, play_use, command_ai, \
+    command_ttlifepoints, command_taeffort
 
 
 """Commands database.
@@ -32,7 +33,7 @@ commands_db = {
     "WORLD_ACTIVE": (1, False, command_worldactive),
     "MAP": (2, False, setter_map("MAP")),
     "TA_ID": (1, False, command_taid),
-    "TA_EFFORT": (1, False, setter("ThingAction", "TA_EFFORT", 0, 255)),
+    "TA_EFFORT": (1, False, command_taeffort),
     "TA_NAME": (1, False, command_taname),
     "TT_ID": (1, False, command_ttid),
     "TT_NAME": (1, False, command_ttname),
@@ -44,7 +45,7 @@ commands_db = {
                                          0, 255)),
     "TT_PROLIFERATE": (1, False, setter("ThingType", "TT_PROLIFERATE",
                                         0, 65535)),
-    "TT_LIFEPOINTS": (1, False, setter("ThingType", "TT_LIFEPOINTS", 0, 255)),
+    "TT_LIFEPOINTS": (1, False, command_ttlifepoints),
     "T_ID": (1, False, command_tid),
     "T_ARGUMENT": (1, False, setter("Thing", "T_ARGUMENT", 0, 255)),
     "T_PROGRESS": (1, False, setter("Thing", "T_PROGRESS", 0, 255)),
index ad30cc2d1fe892e1fcdf65549d6d5fadb2aad60f..3e1fb41862e18827fb4ad805e3aab556900c6a99 100644 (file)
@@ -170,7 +170,7 @@ def save_world():
         for _id in sorted(world_db[category].keys()):
             string = string + id_string + " " + str(_id) + "\n"
             for key in sorted(world_db[category][_id].keys()):
-                if not key in special_keys:
+                if key.isupper() and not key in special_keys:
                     x = world_db[category][_id][key]
                     argument = quote_escape(x) if str == type(x) else str(x)
                     string = string + key + " " + argument + "\n"
index a313eae76f916a0b17056a101726bf76dfbbeed8..21d5f67c14e9bb950992ded6e6e2b3cd0e6f3ddf 100644 (file)
@@ -42,6 +42,17 @@ def hunger(t):
         decrement_lifepoints(t)
 
 
+def eat_vs_hunger_threshold(thingtype):
+    """Return satiation cost of eating for type. Good food for it must be >."""
+    hunger_unit = hunger_per_turn(thingtype)
+    try:
+        actiontype = next(taid for taid in world_db["ThingActions"] if
+                          world_db["ThingActions"][taid]["TA_NAME"] == "use")
+    except StopIteration:
+        return 0
+    return world_db["ThingActions"][actiontype]["TA_EFFORT"] * hunger_unit
+
+
 def set_world_inactive():
     """Set world_db["WORLD_ACTIVE"] to 0 and remove worldstate file."""
     from server.io import safely_remove_worldstate_file