home · contact · privacy
7DRL: Add first plant growth quest.
[plomrogue] / roguelike-server
index 344ef80355d984171f5cf077a89a988e2f83987e..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")()
@@ -605,6 +606,23 @@ def build_fov_map(t):
         raise RuntimeError("Malloc error in build_fov_Map().")
 
 
+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, 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 "
+                 + "Some objects can be used (such as: eaten) by 'u' if "
+                 + "they are in your inventory. "
+                 + "Use 'UP'/'DOWN' to navigate the inventory.\n")
+    strong_write(io_db["file_out"], "LOG "
+                 + "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):
     """Decrement t's lifepoints by 1, and if to zero, corpse it.
 
@@ -628,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
@@ -668,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 "
@@ -854,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):
@@ -1334,6 +1373,7 @@ def command_makeworld(seed_string):
     according to ThingTypes' TT_START_NUMBERS, with Thing of ID 0 to ThingType
     of ID = world["PLAYER_TYPE"]. Place Things randomly, and actors not on each
     other. Init player's memory map. Write "NEW_WORLD" line to out file.
+    Call log_help().
     """
 
     # def free_pos(plant=False):
@@ -1385,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
@@ -1403,6 +1446,7 @@ def command_makeworld(seed_string):
                 plantness = world_db["ThingTypes"][type]["TT_PROLIFERATE"]  # #
                 world_db["Things"][id] = new_Thing(type, free_pos(plantness))
     strong_write(io_db["file_out"], "NEW_WORLD\n")
+    log_help()
 
 
 def command_maplength(maplength_string):
@@ -1422,9 +1466,10 @@ def command_worldactive(worldactive_string):
     An active world can always be set inactive. An inactive world can only be
     set active with a "wait" ThingAction, and a player Thing (of ID 0), and a
     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"]:
@@ -1444,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'_')  # #
@@ -1453,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])
@@ -1463,6 +1509,7 @@ def command_worldactive(worldactive_string):
                     empty_fovmap = bytearray(b" " * world_db["MAP_LENGTH"] ** 2)
                     world_db["Things"][0]["fovmap"] = empty_fovmap
                 world_db["WORLD_ACTIVE"] = 1
+                log_help()
             else:
                 print("Ignoring: Not all conditions for world activation met.")
 
@@ -1478,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):
@@ -1749,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),
@@ -1763,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),
@@ -1799,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": {}