home · contact · privacy
Client: Change look mode cursor visualization.
[plomrogue] / roguelike-server
index d7d3b098f0cbb74ac15694d1d499081182856409..887bf7e1ca468dd7d42879dffbf9515728c77c46 100755 (executable)
@@ -211,10 +211,13 @@ def save_world():
 
     string = ""
     for key in world_db:
-        if dict != type(world_db[key]) \
-           and key != "MAP" and key != "WORLD_ACTIVE":
+        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")()
+    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"]:
@@ -427,6 +430,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.
 
     def is_neighbor(coordinates, type):
         y = coordinates[0]
@@ -475,6 +479,17 @@ def make_map():
             world_db["MAP"][pos] = ord("X")
             i_trees += 1
     # This all-too-precise replica of the original C code misses iter_limit().
+    n_colons = int((length ** 2) / 16)  # #
+    i_colons = 0  # #
+    while (i_colons <= n_colons):  # #
+        single_allowed = rand.next() % 256  # #
+        y = rand.next() % length  # #
+        x = rand.next() % length  # #
+        pos = (y * length) + x  # #
+        if ("." == chr(world_db["MAP"][pos])  # #
+          and ((not single_allowed) or is_neighbor((y, x), ":"))):  # #
+            world_db["MAP"][pos] = ord(":")  # #
+            i_colons += 1  # #
 
 
 def update_map_memory(t, age_map=True):
@@ -657,8 +672,9 @@ def actor_move(t):
                                      t["T_POSY"], t["T_POSX"])
     if 1 == move_result[0]:
         pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2]
-        passable = "." == chr(world_db["MAP"][pos]) or \
-                   ":" == chr(world_db["MAP"][pos])  # #
+        passable = ("." == chr(world_db["MAP"][pos]) or
+                    ":" == chr(world_db["MAP"][pos]) or # #
+                    "_" == chr(world_db["MAP"][pos])) # #
         hitted = [id for id in world_db["Things"]
                   if world_db["Things"][id] != t
                   if world_db["Things"][id]["T_LIFEPOINTS"]
@@ -775,14 +791,16 @@ def thingproliferation(t, prol_map):
     selected randomly.
     """
     # # 7DRL: success increments God's mood
+    # # 7DRL: Things proliferate only on ":" ground.
     prolscore = world_db["ThingTypes"][t["T_TYPE"]]["TT_PROLIFERATE"]
     if prolscore and (1 == prolscore or 1 == (rand.next() % prolscore)):
         candidates = []
         for dir in [directions_db[key] for key in directions_db]:
             mv_result = mv_yx_in_dir_legal(dir, t["T_POSY"], t["T_POSX"])
-            if mv_result[0] and  ord(".") == prol_map[mv_result[1]
-                                                      * world_db["MAP_LENGTH"]
-                                                      + mv_result[2]]:
+            if mv_result[0] and ord(":") == prol_map[mv_result[1]  # #
+            # if mv_result[0] and ord(".") == prol_map[mv_result[1]
+                                                     * world_db["MAP_LENGTH"]
+                                                     + mv_result[2]]:
                 candidates.append((mv_result[1], mv_result[2]))
         if len(candidates):
             i = rand.next() % len(candidates)
@@ -1271,7 +1289,8 @@ def command_makeworld(seed_string):
     other. Init player's memory map. Write "NEW_WORLD" line to out file.
     """
 
-    def free_pos():
+    # def free_pos(plant=False):
+    def free_pos(plant=False):  # #
         i = 0
         while 1:
             err = "Space to put thing on too hard to find. Map too small?"
@@ -1279,7 +1298,8 @@ def command_makeworld(seed_string):
                 y = rand.next() % world_db["MAP_LENGTH"]
                 x = rand.next() % world_db["MAP_LENGTH"]
                 pos = y * world_db["MAP_LENGTH"] + x;
-                if "." == chr(world_db["MAP"][pos]) \
+                if (not plant  # #
+                    and "." == chr(world_db["MAP"][pos])) \
                    or ":" == chr(world_db["MAP"][pos]):  # #
                     break
                 i += 1
@@ -1317,6 +1337,9 @@ 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"]):
@@ -1330,10 +1353,23 @@ def command_makeworld(seed_string):
         for i in range(world_db["ThingTypes"][type]["TT_START_NUMBER"]):
             if type != playertype:
                 id = id_setter(-1, "Things")
-                world_db["Things"][id] = new_Thing(type, free_pos())
+                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.")
+
+
 def command_maplength(maplength_string):
     """Redefine map length. Invalidate map, therefore lose all things on it."""
     val = integer_test(maplength_string, 1, 256)
@@ -1352,8 +1388,9 @@ def command_worldactive(worldactive_string):
     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.
     """
+    # 7DRL: Altar position must also be set for world activation.
     val = integer_test(worldactive_string, 0, 1)
-    if val:
+    if None != val:
         if 0 != world_db["WORLD_ACTIVE"]:
             if 0 == val:
                 set_world_inactive()
@@ -1370,7 +1407,8 @@ def command_worldactive(worldactive_string):
                 if 0 == Thing:
                     player_exists = True
                     break
-            if wait_exists and player_exists and world_db["MAP"]:
+            if wait_exists and player_exists and world_db["MAP"] \
+                and  world_db["ALTAR"]:  # #
                 for id in world_db["Things"]:
                     if world_db["Things"][id]["T_LIFEPOINTS"]:
                         build_fov_map(world_db["Things"][id])
@@ -1655,6 +1693,7 @@ 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),  # #
     "TA_ID": (1, False, command_taid),
     "TA_EFFORT": (1, False, setter("ThingAction", "TA_EFFORT", 0, 255)),
     "TA_NAME": (1, False, command_taname),
@@ -1703,6 +1742,7 @@ world_db = {
     "GOD_MOOD": 0,  # #
     "GOD_FAVOR": 0,  # #
     "MAP": False,
+    "ALTAR": False,
     "ThingActions": {},
     "ThingTypes": {},
     "Things": {}