string = ""
for key in world_db:
if (dict != type(world_db[key])
- and key != "ALTAR" # #
- and key != "MAP" and key != "WORLD_ACTIVE"):
+ 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"]:
type_id = world_db["Things"][id]["T_TYPE"]
name = world_db["ThingTypes"][type_id]["TT_NAME"]
inventory = inventory + name + "\n"
- # # 7DRL additions: GOD_MOOD, GOD_FAVOR
+ # 7DRL additions: GOD_MOOD, GOD_FAVOR
string = str(world_db["TURN"]) + "\n" + \
str(world_db["GOD_MOOD"]) + "\n" + \
str(world_db["GOD_FAVOR"]) + "\n" + \
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]
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):
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.
still display memory data. On non-player things, erase fovmap and memory.
Dying actors drop all their things.
"""
- # # 7DRL: also decrements God's mood; deaths heavily so
- # # 7DRL: return 1 if death, else 0
+ # 7DRL: Also decrements God's mood; deaths heavily so.
+ # 7DRL: Return 1 if death, else 0.
t["T_LIFEPOINTS"] -= 1
world_db["GOD_MOOD"] -= 1 # #
if 0 == t["T_LIFEPOINTS"]:
return (test, libpr.result_y(), libpr.result_x())
+def enter_altar(): # #
+ """What happens when the player enters the altar."""
+ if world_db["GAME_WON"]:
+ 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
+ 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 "
+ + "a better steward to its inhabitants than me. The "
+ + "island shall miss you when you leave. But you have "
+ + "earned the right to do so. Take this "
+ + world_db["ThingTypes"][world_db["SLIPPERS"]]["TT_NAME"]
+ + " and USE it when you please. It will take you to "
+ + "where you came from. (But do feel free to stay here "
+ + "as long as you like.)\"\n")
+ id = id_setter(-1, "Things")
+ world_db["Things"][id] = new_Thing(world_db["SLIPPERS"],
+ world_db["altar"])
+
+
def actor_wait(t):
"""Make t do nothing (but loudly, if player avatar)."""
if t == world_db["Things"][0]:
def actor_move(t):
"""If passable, move/collide(=attack) thing into T_ARGUMENT's direction."""
- # # 7DRL: Player wounding (worse: killing) others will lower God's favor.
+ # 7DRL: Player wounding (worse: killing) others will lower God's favor.
+ # 7DRL: Player entering the altar triggers enter_altar().
passable = False
move_result = mv_yx_in_dir_legal(chr(t["T_ARGUMENT"]),
t["T_POSY"], t["T_POSX"])
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]): # #
+ enter_altar() # #
elif t == world_db["Things"][0]:
strong_write(io_db["file_out"], "LOG You fail to move " + dir + ".\n")
def actor_use(t):
"""Make t use (for now: consume) T_ARGUMENT-indexed Thing in inventory."""
# TODO: Handle case where T_ARGUMENT matches nothing.
+ # 7DLR: Handle SLIPPERS-type Thing use.
if len(t["T_CARRIES"]):
id = t["T_CARRIES"][t["T_ARGUMENT"]]
type = world_db["Things"][id]["T_TYPE"]
- if world_db["ThingTypes"][type]["TT_CONSUMABLE"]:
+ if type == world_db["SLIPPERS"]: # #
+ if t == world_db["Things"][0]: # #
+ strong_write(io_db["file_out"], "LOG You use the " # #
+ + world_db["ThingTypes"][type]["TT_NAME"] # #
+ + ". It glows in wondrous colors, and emits " # #
+ + "a sound as if from a dying cat. The " # #
+ + "Island God laughs.\n") # #
+ t["T_LIFEPOINTS"] = 1 # #
+ decrement_lifepoints(t) # #
+ elif world_db["ThingTypes"][type]["TT_CONSUMABLE"]:
t["T_CARRIES"].remove(id)
del world_db["Things"][id]
t["T_SATIATION"] += world_db["ThingTypes"][type]["TT_CONSUMABLE"]
marked "." in prol_map. If there are several map cell candidates, one is
selected randomly.
"""
- # # 7DRL: success increments God's mood
- # # 7DRL: Things proliferate only on ":" ground.
+ # 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 = []
On success, decrease satiation score by 32.
"""
- # # 7DRL: Successful heals increment God's mood.
+ # 7DRL: Successful heals increment God's mood.
if t["T_SATIATION"] > 0 \
and t["T_LIFEPOINTS"] < \
world_db["ThingTypes"][t["T_TYPE"]]["TT_LIFEPOINTS"] \
none, they will explore parts of the map unseen since ever or for at least
one turn; if there is nothing to explore, they will simply wait.
"""
- # # 7DRL add: Don't pick up or search things when inventory is full.
+ # 7DRL add: Don't pick up or search things when inventory is full.
t["T_COMMAND"] = [id for id in world_db["ThingActions"]
if world_db["ThingActions"][id]["TA_NAME"] == "wait"][0]
if not get_dir_to_target(t, "f"):
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):
if not wait_action:
print("Ignoring: No thing action with name 'wait' defined.")
return
+ if not world_db["SLIPPERS"] in world_db["ThingTypes"]: # #
+ print("Ignoring: No valid SLIPPERS set.") # #
+ 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"]):
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):
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 must also 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"]:
if 0 == Thing:
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 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])
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.")
+def command_slippers(str_int): # #
+ """Set SLIPPERS, but deactivate world if not in ThingTypes."""
+ val = integer_test(str_int, 0)
+ if None != val:
+ world_db["SLIPPERS"] = val
+ if world_db["WORLD_ACTIVE"] and \
+ world_db["SLIPPERS"] not in world_db["ThingTypes"]:
+ world_db["WORLD_ACTIVE"] = 0
+ print("SLIPPERS matches no known ThingTypes, deactivating world.")
+
+
def test_for_id_maker(object, category):
"""Return decorator testing for object having "id" attribute."""
def decorator(f):
"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),
"TA_EFFORT": (1, False, setter("ThingAction", "TA_EFFORT", 0, 255)),
"TA_NAME": (1, False, command_taname),
"GOD_MOOD": 0, # #
"GOD_FAVOR": 0, # #
"MAP": False,
- "ALTAR": False,
+ "GAME_WON": 0, # #
+ "SLIPPERS": 0, # #
"ThingActions": {},
"ThingTypes": {},
"Things": {}