home · contact · privacy
TCE: Add help texts, improve log texts, minor interface fixes.
[plomrogue] / plugins / server / TheCrawlingEater.py
index 056aa3d420bf16115a1f569fc8235cd79b5e0b02..b456ee7af45a53f71e46f714cad04291da284c01 100644 (file)
@@ -7,9 +7,95 @@ from server.config.world_data import world_db
 
 
 def command_help(str_int):
-    val = integer_test(str_int, 0, 4)
+    val = integer_test(str_int, 0, 9)
     if None != val:
-        log(str_int)
+        if val == 0:
+            log(" ")
+            log("[HELP SCREEN 0: help screen list]")
+            log("0 - this screen")
+            log("1 - key bindings")
+            log("2 - environment 1/3")
+            log("3 - environment 2/3")
+            log("4 - environment 3/3")
+            log("5 - other beings")
+            log("6 - winning")
+            log("7 - restart and replay")
+            log("For more, see ./README or ./README_TCE files.")
+            pass
+        elif val == 1:
+            log(" ")
+            log("[HELP SCREEN 1: key bindings]")
+            log("movement/eating: w/e/d/c/x/s")
+            log("drink: i")
+            log("defecate: o")
+            log("pee: p")
+            log("autopilot: A")
+            log("look mode: l")
+            log("quit: Q")
+            log("help screens: 1/2/3/4/5/6/7/8/9")
+            log("help overview: 0")
+        elif val == 2:
+            log(" ")
+            log("[HELP SCREEN 2: environment 1/3]")
+            log("There is mostly solid matter and fluid. "
+                "'_', '.', ':' are ground, '%', '#', 'X' are walls. "
+                "Less thick ones can be eaten."
+                "Background color indicates fluid concentration. "
+                "'O'/'0' is holes; stepping into them is dangerous."
+                "'-' and '+' are cracks in the ground, and may becomes holes. "
+                "'$' is special places that will change you. "
+                "Learn more in HELP SCREEN 3."
+                )
+        elif val == 3:
+            log(" ")
+            log("[HELP SCREEN 3: environment 2/3]")
+            log("Use the 'l' command to investigate the environment. "
+                "Its cursor will describe the area pointed at by two numbers: "
+                "ground elevation/matter thickness (left), wetness (right). "
+                "You cannot breathe there if the sum of both is > 5. "
+                "Greater ground elevation means slower movement."
+               )
+        elif val == 4:
+            log(" ")
+            log("[HELP SCREEN 4: environment 3/3]")
+            log("Waste will pile up to ground matter an walls. "
+                "Fluid will trickle down into the environment. "
+                "General humidity will sparkle up new fluid on the ground "
+                "level ('_'). "
+                "Only from there can you drink fluid. "
+                "Much fluid on a ground level tile creates potential for "
+                "cracks to appear there. They may be sealed with waste."
+                )
+        elif val == 5:
+            log(" ")
+            log("[HELP SCREEN 5: other beings]")
+            log(" '?' on the memory map indicate sounds of movement. "
+                "You may encounter the sources. They appear as the general "
+                "humidity of the environment grows, grown from its fluids and " 
+                "earth. "
+               )
+        elif val == 6:
+            log(" ")
+            log("[HELP SCREEN 6: winning]")
+            log("Find '$' tiles. Don't dump waste and fluids on fields with "
+                "great elevation and wetness sums. Control ground wetness "
+                "by providing great or small ground space for fluid sparkling " 
+                "up to concentrate in. "
+                "A special kind of hole will only evolve from a 'O' hole that "
+                "is surrounded by six other holes."
+               )
+        elif val == 7:
+            log(" ")
+            log("[HELP SCREEN 7: restart and replay]")
+            log("You can restart in a new game world by running "
+                "./roguelike -n. You can replay a record of your current game"
+                " by running ./roguelike -s."
+                "See file ./README for more details."
+               )
+        else:
+            log(" ")
+            log("No HELP SCREEN defined for this number.")
+            log(" ")
 
 
 def command_ai():
@@ -50,7 +136,7 @@ def play_pee():
             and world_db["Things"][0]["T_LIFEPOINTS"] > 0):
         return
     if world_db["Things"][0]["T_BLADDER"] < 1:
-        log("Nothing to drop from empty bladder.")
+        log("NOTHING to drop from empty bladder.")
         return
     world_db["set_command"]("pee")
 
@@ -63,7 +149,8 @@ def actor_pee(t):
     if not world_db["test_air"](t):
         return
     t["T_BLADDER"] -= 1
-    world_db["wetmap"][t["pos"]] += 1
+    if chr(world_db["MAP"][t["pos"]]) not in "*&":
+        world_db["wetmap"][t["pos"]] += 1
 
 
 def play_drop():
@@ -71,7 +158,7 @@ def play_drop():
             and world_db["Things"][0]["T_LIFEPOINTS"] > 0):
         return
     if world_db["Things"][0]["T_BOWEL"] < 1:
-        log("Nothing to drop from empty bowel.")
+        log("NOTHING to drop from empty bowel.")
         return
     world_db["set_command"]("drop")
 
@@ -87,7 +174,7 @@ def actor_drop(t):
         world_db["MAP"][t["pos"]] = ord("-")
     elif world_db["MAP"][t["pos"]] == ord("-"):
         world_db["MAP"][t["pos"]] = ord("0")
-    else:
+    elif chr(world_db["MAP"][t["pos"]]) not in "*&":
         world_db["MAP"][t["pos"]] += 1
     t["T_BOWEL"] -= 1
 
@@ -112,12 +199,15 @@ def play_move(str_arg):
         if len(hitted) > 0:
             if t["T_STOMACH"] >= 32 and t["T_KIDNEY"] >= 32:
                 if t == world_db["Things"][0]:
-                    log("You're too FULL to suck from another creature.")
+                    log("You're too FULL to suck resources from another creature.")
                 return
             world_db["Things"][0]["T_ARGUMENT"] = d
             world_db["set_command"]("eat")
             return
-        if chr(world_db["MAP"][pos]) in "34":
+        legal_targets = "34"
+        if world_db["GRACE"] >= 8:
+            legal_targets += "5"
+        if chr(world_db["MAP"][pos]) in legal_targets:
             if t["T_STOMACH"] >= 32:
                 if t == world_db["Things"][0]:
                     log("You're too FULL to eat.")
@@ -132,6 +222,32 @@ def play_move(str_arg):
     log("You CAN'T eat your way through there.")
 
 
+def suck_out_creature(t, tid):
+    if t == None:
+        t = world_db["Things"][tid]
+    elif tid == None:
+        tid = next(tid for tid in world_db["Things"]
+                   if world_db["Things"][tid] == t)
+    room_stomach = 32 - world_db["Things"][0]["T_STOMACH"]
+    room_kidney = 32 - world_db["Things"][0]["T_KIDNEY"]
+    if t["T_STOMACH"] > room_stomach:
+        t["T_STOMACH"] -= room_stomach
+        world_db["Things"][0]["T_STOMACH"] = 32
+    else:
+        world_db["Things"][0]["T_STOMACH"] + t["T_STOMACH"]
+        t["T_STOMACH"] = 0
+    if t["T_KIDNEY"] > room_stomach:
+        t["T_KIDNEY"] -= room_stomach
+        world_db["Things"][0]["T_KIDNEY"] = 32
+    else:
+        world_db["Things"][0]["T_KIDNEY"] + t["T_KIDNEY"]
+        t["T_KIDNEY"] = 0
+    hitted_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"]
+    log("You SUCK EVERYTHING from " + hitted_name + ", killing them.")
+    world_db["die"](t, "FOO")
+world_db["suck_out_creature"] = suck_out_creature
+
+
 def actor_eat(t):
     from server.utils import mv_yx_in_dir_legal, rand
     from server.config.world_data import symbols_passable
@@ -147,11 +263,17 @@ def actor_eat(t):
             hit_id = hitted[0]
             hitted_tid = world_db["Things"][hit_id]["T_TYPE"]
             if t == world_db["Things"][0]:
+                if world_db["GRACE"] >= 16:
+                    world_db["suck_out_creature"](None, hit_id)
+                    return
                 hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"]
-                log("You SUCK from " + hitted_name + ".")
+                log("You SUCK resources from " + hitted_name + ".")
             elif 0 == hit_id:
+                if world_db["GRACE"] >= 16:
+                    world_db["suck_out_creature"](t, None)
+                    return
                 hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"]
-                log(hitter_name +" SUCKS from you.")
+                log(hitter_name +" SUCKS resources from you.")
             hitted = world_db["Things"][hit_id]
             if t["T_STOMACH"] < 32:
                 t["T_STOMACH"] = t["T_STOMACH"] + 1
@@ -165,13 +287,17 @@ def actor_eat(t):
         log("You try to EAT, but fail.")
     else:
         height = world_db["MAP"][pos] - ord("0")
-        if t["T_STOMACH"] >= 32 or height == 5:
+        if t["T_STOMACH"] >= 32:
+            return
+        if height == 5 and not \
+                (t == world_db["Things"][0] and world_db["GRACE"] >= 8):
             return
         t["T_STOMACH"] += 1
         if t == world_db["Things"][0]:
             log("You EAT.")
         eaten = (height == 3 and 0 == int(rand.next() % 2)) or \
-                (height == 4 and 0 == int(rand.next() % 5))
+                (height == 4 and 0 == int(rand.next() % 5)) or \
+                (height == 5 and 0 == int(rand.next() % 10))
         if eaten:
             world_db["MAP"][pos] = ord("0")
             if t["T_STOMACH"] > 32:
@@ -194,9 +320,15 @@ def actor_move(t):
             hit_id = hitted[0]
             hitted_tid = world_db["Things"][hit_id]["T_TYPE"]
             if t == world_db["Things"][0]:
+                if world_db["GRACE"] >= 16:
+                    world_db["suck_out_creature"](None, hit_id)
+                    return
                 hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"]
                 log("You BUMP into " + hitted_name + ".")
             elif 0 == hit_id:
+                if world_db["GRACE"] >= 16:
+                    world_db["suck_out_creature"](t, None)
+                    return
                 hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"]
                 log(hitter_name +" BUMPS into you.")
             return
@@ -208,18 +340,35 @@ def actor_move(t):
         world_db["soundmap"][t["pos"]] = ord("9")
         if t == world_db["Things"][0] and world_db["MAP"][t["pos"]] == ord("$"):
             world_db["MAP"][t["pos"]] = ord("0")
-            world_db["GRACE"] += 8
-            log("BOO!")
+            log("You feel a strange AURA from this place.")
+            if world_db["GRACE"] == 0:
+                log("You can now eat ALL walls.")
+            elif world_db["GRACE"] == 8:
+                log("You now have a DEATH touch towards other creatures.")
+            elif world_db["GRACE"] == 16:
+                log("You can now LEVITATE over holes.")
+            elif world_db["GRACE"] == 24:
+                log("You are now READY to leave through a special hole.")
+            elif world_db["GRACE"] == 32:
+                log("You already have all the GRACE you can get.")
+            if world_db["GRACE"] <= 24:
+                world_db["GRACE"] += 8
     elif t == world_db["Things"][0]:
         log("You try to MOVE there, but fail.")
 
 
 def test_hole(t):
-    if world_db["MAP"][t["pos"]] == ord("&"):
-        world_db["die"](t, "YOU WIN, CONGRATULATIONS.")
-        return False
+    if t == world_db["Things"][0]:
+        if world_db["GRACE"] < 32 and world_db["MAP"][t["pos"]] == ord("&"):
+            log("You feel you need more GRACE to leave through this hole.")
+        elif world_db["GRACE"] >= 32 and world_db["MAP"][t["pos"]] == ord("&"):
+            world_db["die"](t, "You FLY through the hole, into your waking life."
+                            "Good bye, and CONGRATULATIONS.")
+            return False
+        if world_db["GRACE"] >= 24:
+            return True
     if chr(world_db["MAP"][t["pos"]]) in "*&":
-        world_db["die"](t, "You FALL in a hole, and die.")
+        world_db["die"](t, "You FALL into a hole, and die.")
         return False
     return True
 world_db["test_hole"] = test_hole
@@ -227,7 +376,7 @@ world_db["test_hole"] = test_hole
 
 def test_air(t):
     if world_db["terrain_fullness"](t["pos"]) > 5:
-        world_db["die"](t, "You SUFFOCATE")
+        world_db["die"](t, "You SUFFOCATE.")
         return False
     return True
 world_db["test_air"] = test_air
@@ -281,7 +430,7 @@ def make_map():
                 ord("0") == world_db["wetmap"][pos]:
             world_db["wetmap"][pos] = ord("3")
             i_water += 1
-    n_altars = 4
+    n_altars = 8
     i_altars = 0
     while (i_altars < n_altars):
         y, x, pos = new_pos()
@@ -297,8 +446,9 @@ def calc_effort(ta, t):
                                          t["T_POSY"], t["T_POSX"])
         if 1 == move_result[0]:
             pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2]
-            narrowness = world_db["MAP"][pos] - ord("0")
-            return 2 ** narrowness
+            if chr(world_db["MAP"][pos]) in "012":
+                narrowness = world_db["MAP"][pos] - ord("0")
+                return 2 ** narrowness
     return 1
 world_db["calc_effort"] = calc_effort
 
@@ -334,6 +484,8 @@ def turn_over():
                     if t["T_PROGRESS"] >= effort:
                         action = action_db["actor_" + ThingAction["TA_NAME"]]
                         action(t)
+                        if t["T_LIFEPOINTS"] <= 0:
+                            continue
                         t["T_COMMAND"] = 0
                         t["T_PROGRESS"] = 0
                     if t["T_BOWEL"] > 16:
@@ -362,17 +514,17 @@ def turn_over():
             elif world_db["MAP"][pos] == ord("$"):
                 height = -3
             if height == -2 and wetness > 1 \
-                    and 0 == rand.next() % ((2 ** 11) / (2 ** wetness)):
+                    and 0 == rand.next() % ((2 ** 10) / (2 ** wetness)):
                 world_db["MAP"][pos] = ord("*")
                 world_db["HUMIDITY"] += wetness
             if height == -1 and wetness > 1 \
-                    and 0 == rand.next() % ((2 ** 10) / (2 ** wetness)):
+                    and 0 == rand.next() % ((2 ** 9) / (2 ** wetness)):
                 world_db["MAP"][pos] = ord("+")
             if height == 0 and wetness > 1 \
-                    and 0 == rand.next() % ((2 ** 9) / (2 ** wetness)):
+                    and 0 == rand.next() % ((2 ** 8) / (2 ** wetness)):
                 world_db["MAP"][pos] = ord("-")
             if ((wetness > 0 and height > 0) or wetness > 1) \
-                and 0 == rand.next() % 5:
+                and 0 == rand.next() % 16:
                 world_db["wetmap"][pos] -= 1
                 world_db["HUMIDITY"] += 1
         if world_db["HUMIDITY"] > 0:
@@ -424,7 +576,7 @@ def turn_over():
                 dirs = "edcxsw"
                 for i in range(len(dirs)):
                     score += libpr.get_neighbor_score(i)
-                if score == 5 or score == 6:
+                if score == 6:
                     world_db["MAP"][pos] = ord("&")
         libpr.free_score_map()
         world_db["TURN"] += 1
@@ -760,7 +912,7 @@ def ai(t):
                         world_db["terrain_fullness"](t["pos"]) <= 3:
                     t["T_COMMAND"] = thing_action_id("drop")
                     return
-                elif world_db["get_dir_to_target"](t, "crack"):
+                elif world_db["get_dir_to_target"](t, "crack")[0]:
                     return
             if need[0] in {"fluid_certain", "fluid_potential"}:
                 if standing_on_fluid(t):