home · contact · privacy
7DRL: Let GOD_FAVOR in-/decrements be affected by GOD_MOOD.
[plomrogue] / roguelike-server
index ffc75e664c2bf9676ed46f882498e803ae3f570e..849edee2b9cd9e42c445ed2a6a6bab9c8b84d6c7 100755 (executable)
@@ -12,6 +12,7 @@ import shlex
 import shutil
 import time
 import ctypes
+import math  # #
 
 
 class RandomnessIO:
@@ -587,7 +588,8 @@ def decrement_lifepoints(t):
     t["T_LIFEPOINTS"] -= 1
     world_db["GOD_MOOD"] -= 1  # #
     if 0 == t["T_LIFEPOINTS"]:
-        world_db["GOD_MOOD"] -= 9  # #
+        sadness = world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"]  # #
+        world_db["GOD_MOOD"] -= sadness  # #        
         t["T_TYPE"] = world_db["ThingTypes"][t["T_TYPE"]]["TT_CORPSE_ID"]
         if world_db["Things"][0] == t:
             t["fovmap"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2))
@@ -597,10 +599,30 @@ def decrement_lifepoints(t):
             t["T_MEMMAP"] = False
             t["T_MEMDEPTHMAP"] = False
             t["T_MEMTHING"] = []
-        return 1  # #
+        return sadness  # #
     return 0  # #
 
 
+def add_gods_favor(i): # #
+    """"Add to GOD_FAVOR, multiplied with factor growing log. with GOD_MOOD."""
+    def favor_multiplier(i):
+        x = 100
+        threshold = math.e * x
+        mood = world_db["GOD_MOOD"]
+        if i > 0:
+            if mood > threshold:
+                i = i * math.log(mood / x)
+            elif -mood > threshold:
+                i = i / math.log(-mood / x)
+        elif i < 0:
+            if -mood > threshold:
+                i = i * math.log(-mood / x)
+            if mood > threshold:
+                i = i / math.log(mood / x)
+        return int(i)
+    world_db["GOD_FAVOR"] += favor_multiplier(i)
+
+
 def mv_yx_in_dir_legal(dir, y, x):
     """Wrapper around libpr.mv_yx_in_dir_legal to simplify its use."""
     dir_c = dir.encode("ascii")[0]
@@ -637,14 +659,14 @@ def actor_move(t):
                 hitted_name = world_db["ThingTypes"][hitted_type]["TT_NAME"]
                 strong_write(io_db["file_out"], "LOG You wound " + hitted_name
                                                 + ".\n")
-                world_db["GOD_FAVOR"] -= 1  # #
+                add_gods_favor(-1)  # #
             elif 0 == hit_id:
                 hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"]
                 strong_write(io_db["file_out"], "LOG " + hitter_name +
                                                 " wounds you.\n")
-            test = decrement_lifepoints(world_db["Things"][hit_id])  # #
+            test = decrement_lifepoints(world_db["Things"][hit_id])  # #(test=)
             if test and t == world_db["Things"][0]:  # #
-                world_db["GOD_FAVOR"] -= 10  # #
+                add_gods_favor(-test)  # #
             return
     dir = [dir for dir in directions_db
            if directions_db[dir] == chr(t["T_ARGUMENT"])][0]
@@ -1141,8 +1163,9 @@ def command_ping():
 
 def command_quit():
     """Abort server process."""
-    save_world()
-    atomic_write(io_db["path_record"], io_db["record_chunk"], do_append=True)
+    if None == opts.replay:
+        save_world()
+        atomic_write(io_db["path_record"], io_db["record_chunk"], do_append=True)
     raise SystemExit("received QUIT command")