home · contact · privacy
7DRL: Add first plant growth quest.
[plomrogue] / roguelike-server
index f6d2601c64efbb3eb20c73fe9b749f514d4fffac..5c601886facd22777606fa63f8f6f842803ea164 100755 (executable)
@@ -212,6 +212,7 @@ def save_world():
     string = ""
     for key in world_db:
         if (dict != type(world_db[key])
+            and key != "altar"  # #
             and key != "MAP" and key != "WORLD_ACTIVE"):
             string = string + key + " " + str(world_db[key]) + "\n"
     string = string + mapsetter("MAP")()
@@ -608,7 +609,7 @@ def build_fov_map(t):
 def log_help():
     """Send quick usage info to log."""
     strong_write(io_db["file_out"], "LOG "
-                 + "Use 'w'/'e'/'s'/'d'/'x'/'c' to move.\n")
+                 + "Use 'w'/'e'/'s'/'d'/'x'/'c' to move, and 'w' to wait.\n")
     strong_write(io_db["file_out"], "LOG "
                  + "Use 'p' to pick up objects, and 'D' to drop them.\n")
     strong_write(io_db["file_out"], "LOG "
@@ -619,6 +620,7 @@ def log_help():
                  + "Use 'l' to toggle 'look' mode (move an exploration cursor "
                  + "instead of the player over the map).\n")
     strong_write(io_db["file_out"], "LOG See README file for more details.\n")
+    strong_write(io_db["file_out"], "LOG \n")
 
 
 def decrement_lifepoints(t):
@@ -644,6 +646,8 @@ def decrement_lifepoints(t):
         if world_db["Things"][0] == t:
             t["fovmap"] = bytearray(b' ' * (world_db["MAP_LENGTH"] ** 2))
             strong_write(io_db["file_out"], "LOG You die.\n")
+            strong_write(io_db["file_out"],
+                         "LOG See README on how to start over.\n")
         else:
             t["fovmap"] = False
             t["T_MEMMAP"] = False
@@ -684,13 +688,29 @@ def mv_yx_in_dir_legal(dir, y, x):
 
 def enter_altar():  # #
      """What happens when the player enters the altar."""
-     if world_db["GAME_WON"]:
+     if world_db["FAVOR_STAGE"] > 9000:
         strong_write(io_db["file_out"],
                      "LOG You step on a soul-less slab of stone.\n")
         return
      strong_write(io_db["file_out"], "LOG YOU ENTER SACRED GROUND.\n")
-     if world_db["GOD_FAVOR"] > 9000:
-         world_db["GAME_WON"] = 1
+     if world_db["FAVOR_STAGE"] == 0:
+        world_db["FAVOR_STAGE"] = 1
+        strong_write(io_db["file_out"], "LOG The Island God speaks to you: "
+                     + "\"I don't trust you. You intrude on the island's "
+                     + "affairs. I think you're a nuisance at best, and a "
+                     + "danger to my children at worst. I will give you a "
+                     + "chance to lighten my mood, however: For a while now, "
+                     + "I've been trying to spread the plant "
+                     + world_db["ThingTypes"][world_db["PLANT_0"]]["TT_NAME"]
+                     + " (\""
+                     + world_db["ThingTypes"][world_db["PLANT_0"]]["TT_SYMBOL"]
+                     + "\"). I have not been very successful so far. Maybe "
+                     + "you can make yourself useful there. I will count "
+                     + "each further "
+                     + world_db["ThingTypes"][world_db["PLANT_0"]]["TT_NAME"]
+                     + " that grows to your favor.\n")
+     elif world_db["GOD_FAVOR"] > 9000:
+         world_db["FAVOR_STAGE"] = 9001
          strong_write(io_db["file_out"], "LOG The Island God speaks to you: "
                       + "\"You have proven yourself worthy of my respect. "
                       + "You were a good citizen to the island, and sometimes "
@@ -870,6 +890,9 @@ def thingproliferation(t, prol_map):
             newT = new_Thing(t["T_TYPE"], (candidates[i][0], candidates[i][1]))
             world_db["Things"][id] = newT
             world_db["GOD_MOOD"] += 1  # #
+            if (world_db["FAVOR_STAGE"] > 0  # #
+                and t["T_TYPE"] == world_db["PLANT_0"]):
+                world_db["GOD_FAVOR"] += 5
 
 
 def try_healing(t):
@@ -1402,6 +1425,9 @@ def command_makeworld(seed_string):
     if not world_db["SLIPPERS"] in world_db["ThingTypes"]:  # #
         print("Ignoring: No valid SLIPPERS set.")  # #
         return  # #
+    if not world_db["PLANT_0"] in world_db["ThingTypes"]:  # #
+        print("Ignoring: No valid PLANT_0 set.")  # #
+        return  # #
     world_db["Things"] = {}
     make_map()
     world_db["WORLD_ACTIVE"] = 1
@@ -1442,8 +1468,8 @@ def command_worldactive(worldactive_string):
     map. On activation, rebuild all Things' FOVs, and the player's map memory.
     Also call log_help().
     """
-    # 7DRL: altar must be on map, and (valid) SLIPPERS must be set for world
-    # activation.
+    # 7DRL: altar must be on map, and (valid) SLIPPERS and PLANT_0must be set
+    # for world activation.
     val = integer_test(worldactive_string, 0, 1)
     if None != val:
         if 0 != world_db["WORLD_ACTIVE"]:
@@ -1463,6 +1489,7 @@ def command_worldactive(worldactive_string):
                     player_exists = True
                     break
             valid_slippers = world_db["SLIPPERS"] in world_db["ThingTypes"]  # #
+            valid_plant0 = world_db["PLANT_0"] in world_db["ThingTypes"]  # #
             altar_found = False  # #
             if world_db["MAP"]:  # #
                 pos = world_db["MAP"].find(b'_')  # #
@@ -1472,7 +1499,7 @@ def command_worldactive(worldactive_string):
                     world_db["altar"] = (y, x)  # #
                     altar_found = True  # #
             if wait_exists and player_exists and world_db["MAP"] \
-                and altar_found and valid_slippers:  # #
+                and altar_found and valid_slippers and valid_plant0:  # #
                 for id in world_db["Things"]:
                     if world_db["Things"][id]["T_LIFEPOINTS"]:
                         build_fov_map(world_db["Things"][id])
@@ -1498,6 +1525,17 @@ def command_slippers(str_int):  # #
             print("SLIPPERS matches no known ThingTypes, deactivating world.")
 
 
+def command_plant0(str_int):  # #
+    """Set PLANT_0, but deactivate world if not in ThingTypes."""
+    val = integer_test(str_int, 0)
+    if None != val:
+        world_db["PLANT_0"] = val
+        if world_db["WORLD_ACTIVE"] and \
+           world_db["PLANT_0"] not in world_db["ThingTypes"]:
+            world_db["WORLD_ACTIVE"] = 0
+            print("PLANT_0 matches no known ThingTypes, deactivating world.")
+
+
 def test_for_id_maker(object, category):
     """Return decorator testing for object having "id" attribute."""
     def decorator(f):
@@ -1769,8 +1807,9 @@ commands_db = {
     "MAP_LENGTH": (1, False, command_maplength),
     "WORLD_ACTIVE": (1, False, command_worldactive),
     "MAP": (2, False, setter_map("MAP")),
-    "GAME_WON": (1, False, setter(None, "GAME_WON", 0, 1)),  # #
+    "FAVOR_STAGE": (1, False, setter(None, "FAVOR_STAGE", 0, 65535)),  # #
     "SLIPPERS": (1, False, command_slippers),  # #
+    "PLANT_0": (1, False, command_plant0),  # #
     "TA_ID": (1, False, command_taid),
     "TA_EFFORT": (1, False, setter("ThingAction", "TA_EFFORT", 0, 255)),
     "TA_NAME": (1, False, command_taname),
@@ -1783,7 +1822,7 @@ commands_db = {
     "TT_START_NUMBER": (1, False, setter("ThingType", "TT_START_NUMBER",
                                          0, 255)),
     "TT_PROLIFERATE": (1, False, setter("ThingType", "TT_PROLIFERATE",
-                                        0, 255)),
+                                        0, 65535)),
     "TT_LIFEPOINTS": (1, False, setter("ThingType", "TT_LIFEPOINTS", 0, 255)),
     "TT_STORAGE": (1, False, setter("ThingType", "TT_STORAGE", 0, 255)),  # #
     "T_ID": (1, False, command_tid),
@@ -1819,8 +1858,9 @@ world_db = {
     "GOD_MOOD": 0,  # #
     "GOD_FAVOR": 0,  # #
     "MAP": False,
-    "GAME_WON": 0,  # #
+    "FAVOR_STAGE": 0,  # #
     "SLIPPERS": 0,  # #
+    "PLANT_0": 0,  # #
     "ThingActions": {},
     "ThingTypes": {},
     "Things": {}