home · contact · privacy
7DRL: Don't save world_db["altar"].
[plomrogue] / roguelike-server
index d4e1cd10a636b709a258749a65260f26bad6a4de..4de557c205b9f0d9bbd8a7a532025deb9a735bf5 100755 (executable)
@@ -212,12 +212,10 @@ 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"):
+            and key != "altar"  # #
+            and key != "MAP" and key != "WORLD_ACTIVE"):
             string = string + key + " " + str(world_db[key]) + "\n"
     string = string + mapsetter("MAP")()
-    string = (string + "ALTAR " + str(world_db["ALTAR"][0]) + " "  # #
-                                + str(world_db["ALTAR"][1]) + "\n")  # #
     string = string + helper("ThingActions", "TA_ID")
     string = string + helper("ThingTypes", "TT_ID", {"TT_CORPSE_ID": False})
     for id in world_db["ThingTypes"]:
@@ -430,7 +428,7 @@ def make_map():
     to land. The cycle ends when a land cell is due to be created at the map's
     border. Then put some trees on the map (TODO: more precise algorithm desc).
     """
-    # 7DRL: Also add some ":" cells as land to which plants may proliferate.
+    # 7DRL: Also add some ":" cells, and (not surrounded by trees!) "_" altar.
 
     def is_neighbor(coordinates, type):
         y = coordinates[0]
@@ -490,6 +488,17 @@ def make_map():
           and ((not single_allowed) or is_neighbor((y, x), ":"))):  # #
             world_db["MAP"][pos] = ord(":")  # #
             i_colons += 1  # #
+    altar_placed = False  # #
+    while not altar_placed:  # #
+        y = rand.next() % length  # #
+        x = rand.next() % length  # #
+        pos = (y * length) + x  # #
+        if (("." == chr(world_db["MAP"][pos]  # #
+             or ":" == chr(world_db["MAP"][pos]))
+            and not is_neighbor((y, x), 'X'))):  # #
+            world_db["MAP"][pos] = ord("_")  # #
+            world_db["altar"] = (y, x)  # #
+            altar_placed = True  # #
 
 
 def update_map_memory(t, age_map=True):
@@ -597,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.
 
@@ -620,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
@@ -679,7 +707,7 @@ def enter_altar():  # #
                       + "as long as you like.)\"\n")
          id = id_setter(-1, "Things")
          world_db["Things"][id] = new_Thing(world_db["SLIPPERS"],
-                                            world_db["ALTAR"])
+                                            world_db["altar"])
 
 
 def actor_wait(t):
@@ -732,8 +760,8 @@ def actor_move(t):
         build_fov_map(t)
         if t == world_db["Things"][0]:
             strong_write(io_db["file_out"], "LOG You move " + dir + ".\n")
-            if (move_result[1] == world_db["ALTAR"][0] and  # #
-                move_result[2] == world_db["ALTAR"][1]):  # #
+            if (move_result[1] == world_db["altar"][0] and  # #
+                move_result[2] == world_db["altar"][1]):  # #
                 enter_altar()  # #
     elif t == world_db["Things"][0]:
         strong_write(io_db["file_out"], "LOG You fail to move " + dir + ".\n")
@@ -1326,6 +1354,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):
@@ -1379,9 +1408,6 @@ def command_makeworld(seed_string):
         return  # #
     world_db["Things"] = {}
     make_map()
-    world_db["ALTAR"] = free_pos()  # #
-    world_db["MAP"][world_db["ALTAR"][0] * world_db["MAP_LENGTH"]  # #
-                    + world_db["ALTAR"][1]] = ord("_")  # #
     world_db["WORLD_ACTIVE"] = 1
     world_db["TURN"] = 1
     for i in range(world_db["ThingTypes"][playertype]["TT_START_NUMBER"]):
@@ -1398,18 +1424,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")
-
-
-def command_altar(str_y, str_x):  # #
-    """Set position of Island God's altar."""
-    y = integer_test(str_y, 0, 255)
-    x = integer_test(str_x, 0, 255)
-    if None != y and None != x:
-        if y < world_db["MAP_LENGTH"] and x < world_db["MAP_LENGTH"]:
-            world_db["ALTAR"] = (y, x)
-            world_db["MAP"][y * world_db["MAP_LENGTH"] + x] = ord("_")
-        else:
-            print("Ignoring: Position is outside of map.")
+    log_help()
 
 
 def command_maplength(maplength_string):
@@ -1429,8 +1444,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 position and (valid) SLIPPERS must be set for world activation.
+    # 7DRL: altar must be on map, and (valid) SLIPPERS must be set for world
+    # activation.
     val = integer_test(worldactive_string, 0, 1)
     if None != val:
         if 0 != world_db["WORLD_ACTIVE"]:
@@ -1450,8 +1467,16 @@ def command_worldactive(worldactive_string):
                     player_exists = True
                     break
             valid_slippers = world_db["SLIPPERS"] in world_db["ThingTypes"]  # #
+            altar_found = False  # #
+            if world_db["MAP"]:  # #
+                pos = world_db["MAP"].find(b'_')  # #
+                if pos > 0:  # #
+                    y = int(pos / world_db["MAP_LENGTH"])  # #
+                    x = pos % world_db["MAP_LENGTH"]  # #
+                    world_db["altar"] = (y, x)  # #
+                    altar_found = True  # #
             if wait_exists and player_exists and world_db["MAP"] \
-                and  world_db["ALTAR"] and valid_slippers:  # #
+                and altar_found and valid_slippers:  # #
                 for id in world_db["Things"]:
                     if world_db["Things"][id]["T_LIFEPOINTS"]:
                         build_fov_map(world_db["Things"][id])
@@ -1461,6 +1486,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.")
 
@@ -1472,8 +1498,6 @@ def command_slippers(str_int):  # #
         world_db["SLIPPERS"] = val
         if world_db["WORLD_ACTIVE"] and \
            world_db["SLIPPERS"] not in world_db["ThingTypes"]:
-            print(world_db["ThingTypes"])
-            print(":::" + str(world_db["SLIPPERS"]))
             world_db["WORLD_ACTIVE"] = 0
             print("SLIPPERS matches no known ThingTypes, deactivating world.")
 
@@ -1749,7 +1773,6 @@ commands_db = {
     "MAP_LENGTH": (1, False, command_maplength),
     "WORLD_ACTIVE": (1, False, command_worldactive),
     "MAP": (2, False, setter_map("MAP")),
-    "ALTAR": (2, False, command_altar),  # #
     "GAME_WON": (1, False, setter(None, "GAME_WON", 0, 1)),  # #
     "SLIPPERS": (1, False, command_slippers),  # #
     "TA_ID": (1, False, command_taid),
@@ -1764,7 +1787,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),
@@ -1800,7 +1823,6 @@ world_db = {
     "GOD_MOOD": 0,  # #
     "GOD_FAVOR": 0,  # #
     "MAP": False,
-    "ALTAR": False,  # #
     "GAME_WON": 0,  # #
     "SLIPPERS": 0,  # #
     "ThingActions": {},