X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plugins%2Fserver%2FTheCrawlingEater.py;h=b456ee7af45a53f71e46f714cad04291da284c01;hb=7efda459942e6180a2767069b07f9af1fa8bb8ec;hp=082a05b4222f4b084dd5ffa6dd6d33775a28ef69;hpb=14db6b45621e35493ec2ea4b07d39acd3f41a45b;p=plomrogue diff --git a/plugins/server/TheCrawlingEater.py b/plugins/server/TheCrawlingEater.py index 082a05b..b456ee7 100644 --- a/plugins/server/TheCrawlingEater.py +++ b/plugins/server/TheCrawlingEater.py @@ -6,39 +6,139 @@ from server.config.world_data import world_db +def command_help(str_int): + val = integer_test(str_int, 0, 9) + if None != val: + if val == 0: + log(" ") + log("[HELP SCREEN 0: help screen list]") + log("0 - this screen") + log("1 - key bindings") + log("2 - environment 1/3") + log("3 - environment 2/3") + log("4 - environment 3/3") + log("5 - other beings") + log("6 - winning") + log("7 - restart and replay") + log("For more, see ./README or ./README_TCE files.") + pass + elif val == 1: + log(" ") + log("[HELP SCREEN 1: key bindings]") + log("movement/eating: w/e/d/c/x/s") + log("drink: i") + log("defecate: o") + log("pee: p") + log("autopilot: A") + log("look mode: l") + log("quit: Q") + log("help screens: 1/2/3/4/5/6/7/8/9") + log("help overview: 0") + elif val == 2: + log(" ") + log("[HELP SCREEN 2: environment 1/3]") + log("There is mostly solid matter and fluid. " + "'_', '.', ':' are ground, '%', '#', 'X' are walls. " + "Less thick ones can be eaten." + "Background color indicates fluid concentration. " + "'O'/'0' is holes; stepping into them is dangerous." + "'-' and '+' are cracks in the ground, and may becomes holes. " + "'$' is special places that will change you. " + "Learn more in HELP SCREEN 3." + ) + elif val == 3: + log(" ") + log("[HELP SCREEN 3: environment 2/3]") + log("Use the 'l' command to investigate the environment. " + "Its cursor will describe the area pointed at by two numbers: " + "ground elevation/matter thickness (left), wetness (right). " + "You cannot breathe there if the sum of both is > 5. " + "Greater ground elevation means slower movement." + ) + elif val == 4: + log(" ") + log("[HELP SCREEN 4: environment 3/3]") + log("Waste will pile up to ground matter an walls. " + "Fluid will trickle down into the environment. " + "General humidity will sparkle up new fluid on the ground " + "level ('_'). " + "Only from there can you drink fluid. " + "Much fluid on a ground level tile creates potential for " + "cracks to appear there. They may be sealed with waste." + ) + elif val == 5: + log(" ") + log("[HELP SCREEN 5: other beings]") + log(" '?' on the memory map indicate sounds of movement. " + "You may encounter the sources. They appear as the general " + "humidity of the environment grows, grown from its fluids and " + "earth. " + ) + elif val == 6: + log(" ") + log("[HELP SCREEN 6: winning]") + log("Find '$' tiles. Don't dump waste and fluids on fields with " + "great elevation and wetness sums. Control ground wetness " + "by providing great or small ground space for fluid sparkling " + "up to concentrate in. " + "A special kind of hole will only evolve from a 'O' hole that " + "is surrounded by six other holes." + ) + elif val == 7: + log(" ") + log("[HELP SCREEN 7: restart and replay]") + log("You can restart in a new game world by running " + "./roguelike -n. You can replay a record of your current game" + " by running ./roguelike -s." + "See file ./README for more details." + ) + else: + log(" ") + log("No HELP SCREEN defined for this number.") + log(" ") + + +def command_ai(): + if not (world_db["WORLD_ACTIVE"] + and world_db["Things"][0]["T_LIFEPOINTS"] > 0): + return + world_db["ai"](world_db["Things"][0]) + world_db["turn_over"]() + + def play_drink(): - if action_exists("drink") and world_db["WORLD_ACTIVE"]: - pos = world_db["Things"][0]["pos"] - if not (chr(world_db["MAP"][pos]) == "0" - and world_db["wetmap"][pos] > ord("0")): - log("NOTHING to drink here.") - return - elif world_db["Things"][0]["T_KIDNEY"] >= 32: - log("You're too FULL to drink more.") - return - world_db["set_command"]("drink") + if not (action_exists("drink") and world_db["WORLD_ACTIVE"] + and world_db["Things"][0]["T_LIFEPOINTS"] > 0): + return + pos = world_db["Things"][0]["pos"] + if not (chr(world_db["MAP"][pos]) in "0-+" + and world_db["wetmap"][pos] > ord("0")): + log("NOTHING to drink here.") + return + elif world_db["Things"][0]["T_KIDNEY"] >= 32: + log("You're too FULL to drink more.") + return + world_db["set_command"]("drink") def actor_drink(t): pos = t["pos"] - if chr(world_db["MAP"][pos]) == "0" and \ + if chr(world_db["MAP"][pos]) in "0-+" and \ world_db["wetmap"][pos] > ord("0") and t["T_KIDNEY"] < 32: if world_db["Things"][0] == t: log("You DRINK.") t["T_KIDNEY"] += 1 world_db["wetmap"][pos] -= 1 - if world_db["wetmap"][pos] == ord("0"): - world_db["MAP"][pos] = ord("0") - elif t == world_db["Things"][0]: - log("YOU FAIL TO DRINK " + str(world_db["MAP"][pos] - ord("0"))) def play_pee(): - if action_exists("pee") and world_db["WORLD_ACTIVE"]: - if world_db["Things"][0]["T_BLADDER"] < 1: - log("Nothing to drop from empty bladder.") - return - world_db["set_command"]("pee") + if not (action_exists("pee") and world_db["WORLD_ACTIVE"] + and world_db["Things"][0]["T_LIFEPOINTS"] > 0): + return + if world_db["Things"][0]["T_BLADDER"] < 1: + log("NOTHING to drop from empty bladder.") + return + world_db["set_command"]("pee") def actor_pee(t): @@ -49,15 +149,18 @@ def actor_pee(t): if not world_db["test_air"](t): return t["T_BLADDER"] -= 1 - world_db["wetmap"][t["pos"]] += 1 + if chr(world_db["MAP"][t["pos"]]) not in "*&": + world_db["wetmap"][t["pos"]] += 1 def play_drop(): - if action_exists("drop") and world_db["WORLD_ACTIVE"]: - if world_db["Things"][0]["T_BOWEL"] < 1: - log("Nothing to drop from empty bowel.") - return - world_db["set_command"]("drop") + if not (action_exists("drop") and world_db["WORLD_ACTIVE"] + and world_db["Things"][0]["T_LIFEPOINTS"] > 0): + return + if world_db["Things"][0]["T_BOWEL"] < 1: + log("NOTHING to drop from empty bowel.") + return + world_db["set_command"]("drop") def actor_drop(t): @@ -67,47 +170,82 @@ def actor_drop(t): log("You DROP waste.") if not world_db["test_air"](t): return - world_db["MAP"][t["pos"]] += 1 + if world_db["MAP"][t["pos"]] == ord("+"): + world_db["MAP"][t["pos"]] = ord("-") + elif world_db["MAP"][t["pos"]] == ord("-"): + world_db["MAP"][t["pos"]] = ord("0") + elif chr(world_db["MAP"][t["pos"]]) not in "*&": + world_db["MAP"][t["pos"]] += 1 t["T_BOWEL"] -= 1 def play_move(str_arg): - """Try "move" as player's T_COMMAND, str_arg as T_ARGUMENT / direction.""" - if action_exists("move") and world_db["WORLD_ACTIVE"]: - from server.config.world_data import directions_db, symbols_passable - t = world_db["Things"][0] - if not str_arg in directions_db: - print("Illegal move direction string.") - return - d = ord(directions_db[str_arg]) - from server.utils import mv_yx_in_dir_legal - move_result = mv_yx_in_dir_legal(chr(d), t["T_POSY"], t["T_POSX"]) - if 1 == move_result[0]: - pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2] - hitted = [tid for tid in world_db["Things"] - if world_db["Things"][tid]["T_POSY"] == move_result[1] - if world_db["Things"][tid]["T_POSX"] == move_result[2]] - if len(hitted) > 0: - if t["T_STOMACH"] >= 32 and t["T_KIDNEY"] >= 32: - if t == world_db["Things"][0]: - log("You're too FULL to suck from another creature.") - return - world_db["Things"][0]["T_ARGUMENT"] = d - world_db["set_command"]("eat") - return - if chr(world_db["MAP"][pos]) in "34": - if t["T_STOMACH"] >= 32: - if t == world_db["Things"][0]: - log("You're too FULL to eat.") - return - world_db["Things"][0]["T_ARGUMENT"] = d - world_db["set_command"]("eat") + if not (action_exists("move") and world_db["WORLD_ACTIVE"] + and world_db["Things"][0]["T_LIFEPOINTS"] > 0): + return + from server.config.world_data import directions_db, symbols_passable + t = world_db["Things"][0] + if not str_arg in directions_db: + print("Illegal move direction string.") + return + d = ord(directions_db[str_arg]) + from server.utils import mv_yx_in_dir_legal + move_result = mv_yx_in_dir_legal(chr(d), t["T_POSY"], t["T_POSX"]) + if 1 == move_result[0]: + pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2] + hitted = [tid for tid in world_db["Things"] + if world_db["Things"][tid]["T_POSY"] == move_result[1] + if world_db["Things"][tid]["T_POSX"] == move_result[2]] + if len(hitted) > 0: + if t["T_STOMACH"] >= 32 and t["T_KIDNEY"] >= 32: + if t == world_db["Things"][0]: + log("You're too FULL to suck resources from another creature.") return - if chr(world_db["MAP"][pos]) in symbols_passable: - world_db["Things"][0]["T_ARGUMENT"] = d - world_db["set_command"]("move") + world_db["Things"][0]["T_ARGUMENT"] = d + world_db["set_command"]("eat") + return + legal_targets = "34" + if world_db["GRACE"] >= 8: + legal_targets += "5" + if chr(world_db["MAP"][pos]) in legal_targets: + if t["T_STOMACH"] >= 32: + if t == world_db["Things"][0]: + log("You're too FULL to eat.") return - log("You CAN'T eat your way through there.") + world_db["Things"][0]["T_ARGUMENT"] = d + world_db["set_command"]("eat") + return + if chr(world_db["MAP"][pos]) in symbols_passable: + world_db["Things"][0]["T_ARGUMENT"] = d + world_db["set_command"]("move") + return + log("You CAN'T eat your way through there.") + + +def suck_out_creature(t, tid): + if t == None: + t = world_db["Things"][tid] + elif tid == None: + tid = next(tid for tid in world_db["Things"] + if world_db["Things"][tid] == t) + room_stomach = 32 - world_db["Things"][0]["T_STOMACH"] + room_kidney = 32 - world_db["Things"][0]["T_KIDNEY"] + if t["T_STOMACH"] > room_stomach: + t["T_STOMACH"] -= room_stomach + world_db["Things"][0]["T_STOMACH"] = 32 + else: + world_db["Things"][0]["T_STOMACH"] + t["T_STOMACH"] + t["T_STOMACH"] = 0 + if t["T_KIDNEY"] > room_stomach: + t["T_KIDNEY"] -= room_stomach + world_db["Things"][0]["T_KIDNEY"] = 32 + else: + world_db["Things"][0]["T_KIDNEY"] + t["T_KIDNEY"] + t["T_KIDNEY"] = 0 + hitted_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] + log("You SUCK EVERYTHING from " + hitted_name + ", killing them.") + world_db["die"](t, "FOO") +world_db["suck_out_creature"] = suck_out_creature def actor_eat(t): @@ -125,11 +263,17 @@ def actor_eat(t): hit_id = hitted[0] hitted_tid = world_db["Things"][hit_id]["T_TYPE"] if t == world_db["Things"][0]: + if world_db["GRACE"] >= 16: + world_db["suck_out_creature"](None, hit_id) + return hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"] - log("You SUCK from " + hitted_name + ".") + log("You SUCK resources from " + hitted_name + ".") elif 0 == hit_id: + if world_db["GRACE"] >= 16: + world_db["suck_out_creature"](t, None) + return hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] - log(hitter_name +" SUCKS from you.") + log(hitter_name +" SUCKS resources from you.") hitted = world_db["Things"][hit_id] if t["T_STOMACH"] < 32: t["T_STOMACH"] = t["T_STOMACH"] + 1 @@ -143,13 +287,17 @@ def actor_eat(t): log("You try to EAT, but fail.") else: height = world_db["MAP"][pos] - ord("0") - if t["T_STOMACH"] >= 32 or height == 5: + if t["T_STOMACH"] >= 32: + return + if height == 5 and not \ + (t == world_db["Things"][0] and world_db["GRACE"] >= 8): return t["T_STOMACH"] += 1 if t == world_db["Things"][0]: log("You EAT.") eaten = (height == 3 and 0 == int(rand.next() % 2)) or \ - (height == 4 and 0 == int(rand.next() % 5)) + (height == 4 and 0 == int(rand.next() % 5)) or \ + (height == 5 and 0 == int(rand.next() % 10)) if eaten: world_db["MAP"][pos] = ord("0") if t["T_STOMACH"] > 32: @@ -172,9 +320,15 @@ def actor_move(t): hit_id = hitted[0] hitted_tid = world_db["Things"][hit_id]["T_TYPE"] if t == world_db["Things"][0]: + if world_db["GRACE"] >= 16: + world_db["suck_out_creature"](None, hit_id) + return hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"] log("You BUMP into " + hitted_name + ".") elif 0 == hit_id: + if world_db["GRACE"] >= 16: + world_db["suck_out_creature"](t, None) + return hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] log(hitter_name +" BUMPS into you.") return @@ -184,13 +338,37 @@ def actor_move(t): t["T_POSX"] = move_result[2] t["pos"] = move_result[1] * world_db["MAP_LENGTH"] + move_result[2] world_db["soundmap"][t["pos"]] = ord("9") + if t == world_db["Things"][0] and world_db["MAP"][t["pos"]] == ord("$"): + world_db["MAP"][t["pos"]] = ord("0") + log("You feel a strange AURA from this place.") + if world_db["GRACE"] == 0: + log("You can now eat ALL walls.") + elif world_db["GRACE"] == 8: + log("You now have a DEATH touch towards other creatures.") + elif world_db["GRACE"] == 16: + log("You can now LEVITATE over holes.") + elif world_db["GRACE"] == 24: + log("You are now READY to leave through a special hole.") + elif world_db["GRACE"] == 32: + log("You already have all the GRACE you can get.") + if world_db["GRACE"] <= 24: + world_db["GRACE"] += 8 elif t == world_db["Things"][0]: log("You try to MOVE there, but fail.") def test_hole(t): - if world_db["MAP"][t["pos"]] == ord("-"): - world_db["die"](t, "You FALL in a hole, and die.") + if t == world_db["Things"][0]: + if world_db["GRACE"] < 32 and world_db["MAP"][t["pos"]] == ord("&"): + log("You feel you need more GRACE to leave through this hole.") + elif world_db["GRACE"] >= 32 and world_db["MAP"][t["pos"]] == ord("&"): + world_db["die"](t, "You FLY through the hole, into your waking life." + "Good bye, and CONGRATULATIONS.") + return False + if world_db["GRACE"] >= 24: + return True + if chr(world_db["MAP"][t["pos"]]) in "*&": + world_db["die"](t, "You FALL into a hole, and die.") return False return True world_db["test_hole"] = test_hole @@ -198,7 +376,7 @@ world_db["test_hole"] = test_hole def test_air(t): if world_db["terrain_fullness"](t["pos"]) > 5: - world_db["die"](t, "You SUFFOCATE") + world_db["die"](t, "You SUFFOCATE.") return False return True world_db["test_air"] = test_air @@ -211,7 +389,8 @@ def die(t, message): t["T_MEMMAP"][t["pos"]] = ord("@") log(message) else: - world_db["MAP"][t["pos"]] = ord("5") + if world_db["MAP"][t["pos"]] != ord("$"): + world_db["MAP"][t["pos"]] = ord("5") world_db["HUMILITY"] = t["T_KIDNEY"] + t["T_BLADDER"] + \ (world_db["wetmap"][t["pos"]] - ord("0")) world_db["wetmap"][t["pos"]] = 0 @@ -251,6 +430,13 @@ def make_map(): ord("0") == world_db["wetmap"][pos]: world_db["wetmap"][pos] = ord("3") i_water += 1 + n_altars = 8 + i_altars = 0 + while (i_altars < n_altars): + y, x, pos = new_pos() + if ord("0") == world_db["MAP"][pos]: + world_db["MAP"][pos] = ord("$") + i_altars += 1 def calc_effort(ta, t): @@ -260,8 +446,9 @@ def calc_effort(ta, t): t["T_POSY"], t["T_POSX"]) if 1 == move_result[0]: pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2] - narrowness = world_db["MAP"][pos] - ord("0") - return 2 ** narrowness + if chr(world_db["MAP"][pos]) in "012": + narrowness = world_db["MAP"][pos] - ord("0") + return 2 ** narrowness return 1 world_db["calc_effort"] = calc_effort @@ -297,6 +484,8 @@ def turn_over(): if t["T_PROGRESS"] >= effort: action = action_db["actor_" + ThingAction["TA_NAME"]] action(t) + if t["T_LIFEPOINTS"] <= 0: + continue t["T_COMMAND"] = 0 t["T_PROGRESS"] = 0 if t["T_BOWEL"] > 16: @@ -314,14 +503,28 @@ def turn_over(): world_db["die"](t, "You DIE of hunger.") elif t["T_KIDNEY"] <= 0: world_db["die"](t, "You DIE of dehydration.") - for pos in range(world_db["MAP_LENGTH"] ** 2): + mapsize = world_db["MAP_LENGTH"] ** 2 + for pos in range(mapsize): wetness = world_db["wetmap"][pos] - ord("0") height = world_db["MAP"][pos] - ord("0") - if height == 0 and wetness > 0 \ - and 0 == rand.next() % ((2 ** 13) / (2 ** wetness)): + if world_db["MAP"][pos] == ord("-"): + height = -1 + elif world_db["MAP"][pos] == ord("+"): + height = -2 + elif world_db["MAP"][pos] == ord("$"): + height = -3 + if height == -2 and wetness > 1 \ + and 0 == rand.next() % ((2 ** 10) / (2 ** wetness)): + world_db["MAP"][pos] = ord("*") + world_db["HUMIDITY"] += wetness + if height == -1 and wetness > 1 \ + and 0 == rand.next() % ((2 ** 9) / (2 ** wetness)): + world_db["MAP"][pos] = ord("+") + if height == 0 and wetness > 1 \ + and 0 == rand.next() % ((2 ** 8) / (2 ** wetness)): world_db["MAP"][pos] = ord("-") - if ((wetness > 0 and height != 0) or wetness > 1) \ - and 0 == rand.next() % 5: + if ((wetness > 0 and height > 0) or wetness > 1) \ + and 0 == rand.next() % 16: world_db["wetmap"][pos] -= 1 world_db["HUMIDITY"] += 1 if world_db["HUMIDITY"] > 0: @@ -343,8 +546,8 @@ def turn_over(): pos = y * world_db["MAP_LENGTH"] + x break positions_to_wet = [] - for pos in range(world_db["MAP_LENGTH"] ** 2): - if world_db["MAP"][pos] == ord("0") \ + for pos in range(mapsize): + if chr(world_db["MAP"][pos]) in "0-+" \ and world_db["wetmap"][pos] < ord("5"): positions_to_wet += [pos] while world_db["HUMIDITY"] > 0 and len(positions_to_wet) > 0: @@ -353,23 +556,35 @@ def turn_over(): world_db["wetmap"][pos] += 1 positions_to_wet.remove(pos) world_db["HUMIDITY"] -= 1 - for pos in range(world_db["MAP_LENGTH"] ** 2): + for pos in range(mapsize): if world_db["soundmap"][pos] > ord("0"): world_db["soundmap"][pos] -= 1 + from server.utils import libpr + libpr.init_score_map() + def set_map_score(pos, score): + test = libpr.set_map_score(pos, score) + if test: + raise RuntimeError("No score map allocated for set_map_score().") + [set_map_score(pos, 1) for pos in range(mapsize) + if world_db["MAP"][pos] == ord("*")] + for pos in range(mapsize): + if world_db["MAP"][pos] == ord("*"): + if libpr.ready_neighbor_scores(pos): + raise RuntimeError("No score map allocated for " + + "ready_neighbor_scores.()") + score = 0 + dirs = "edcxsw" + for i in range(len(dirs)): + score += libpr.get_neighbor_score(i) + if score == 6: + world_db["MAP"][pos] = ord("&") + libpr.free_score_map() world_db["TURN"] += 1 io_db["worldstate_updateable"] = True try_worldstate_update() world_db["turn_over"] = turn_over -def command_ai(): - """Call ai() on player Thing, then turn_over().""" - from server.ai import ai - if world_db["WORLD_ACTIVE"]: - ai(world_db["Things"][0]) - world_db["turn_over"]() - - def set_command(action): """Set player's T_COMMAND, then call turn_over().""" tid = [x for x in world_db["ThingActions"] @@ -461,12 +676,6 @@ def write_wetmap(): return write_map(visible_wetmap, world_db["MAP_LENGTH"]) -def command_ai(): - if world_db["WORLD_ACTIVE"]: - world_db["ai"](world_db["Things"][0]) - world_db["turn_over"]() - - def get_dir_to_target(t, target): from server.utils import rand, libpr, c_pointer_to_bytearray @@ -518,13 +727,16 @@ def get_dir_to_target(t, target): if t["fovmap"] == ord("v") if world_db["MAP"][pos] == ord("0") if world_db["wetmap"][pos] > ord("0")) + elif target == "crack" and t["T_MEMMAP"]: + return exists(pos for pos in range(mapsize) + if t["T_MEMMAP"][pos] == ord("-")) elif target == "fluid_potential" and t["T_MEMMAP"] and t["fovmap"]: return exists(pos for pos in range(mapsize) if t["T_MEMMAP"][pos] == ord("0") if t["fovmap"] != ord("v")) - elif target == "space_big" and t["T_MEMMAP"] and t["fovmap"]: + elif target == "space" and t["T_MEMMAP"] and t["fovmap"]: return exists(pos for pos in range(mapsize) - if ord("0") <= t["T_MEMMAP"][pos] <= ord("2") + if ord("-") <= t["T_MEMMAP"][pos] <= ord("2") if (t["fovmap"] != ord("v") or world_db["terrain_fullness"](pos) < 5)) elif target in {"hunt", "flee"} and t["fovmap"]: @@ -539,7 +751,7 @@ def get_dir_to_target(t, target): mapsize = world_db["MAP_LENGTH"] ** 2 test = libpr.TCE_init_score_map() [set_map_score(pos, 65535) for pos in range(mapsize) - if chr(t["T_MEMMAP"][pos]) in "5-"] + if chr(t["T_MEMMAP"][pos]) in "5*&"] set_movement_cost_map() if test: raise RuntimeError("Malloc error in init_score_map().") @@ -551,13 +763,16 @@ def get_dir_to_target(t, target): if t["fovmap"] == ord("v") if world_db["MAP"][pos] == ord("0") if world_db["wetmap"][pos] > ord("0")] + elif target == "crack" and t["T_MEMMAP"]: + [set_map_score(pos, 0) for pos in range(mapsize) + if t["T_MEMMAP"][pos] == ord("-")] elif target == "fluid_potential" and t["T_MEMMAP"] and t["fovmap"]: [set_map_score(pos, 0) for pos in range(mapsize) if t["T_MEMMAP"][pos] == ord("0") if t["fovmap"] != ord("v")] elif target == "space" and t["T_MEMMAP"] and t["fovmap"]: [set_map_score(pos, 0) for pos in range(mapsize) - if ord("0") <= t["T_MEMMAP"][pos] <= ord("2") + if ord("-") <= t["T_MEMMAP"][pos] <= ord("2") if (t["fovmap"] != ord("v") or world_db["terrain_fullness"](pos) < 5)] elif target == "search": @@ -649,8 +864,12 @@ world_db["get_dir_to_target"] = get_dir_to_target def terrain_fullness(pos): - return (world_db["MAP"][pos] - ord("0")) + \ - (world_db["wetmap"][pos] - ord("0")) + wetness = world_db["wetmap"][pos] - ord("0") + if chr(world_db["MAP"][pos]) in "-+": + height = 0 + else: + height = world_db["MAP"][pos] - ord("0") + return wetness + height world_db["terrain_fullness"] = terrain_fullness @@ -673,6 +892,7 @@ def ai(t): t["T_COMMAND"] = thing_action_id("wait") needs = { + "fix_cracks": 24, "flee": 24, "safe_pee": (world_db["terrain_fullness"](t["pos"]) * t["T_BLADDER"]) / 4, "safe_drop": (world_db["terrain_fullness"](t["pos"]) * t["T_BOWEL"]) / 4, @@ -686,6 +906,14 @@ def ai(t): needs.reverse() for need in needs: if need[1] > 0: + if need[0] == "fix_cracks": + if world_db["MAP"][t["pos"]] == ord("-") and \ + t["T_BOWEL"] > 0 and \ + world_db["terrain_fullness"](t["pos"]) <= 3: + t["T_COMMAND"] = thing_action_id("drop") + return + elif world_db["get_dir_to_target"](t, "crack")[0]: + return if need[0] in {"fluid_certain", "fluid_potential"}: if standing_on_fluid(t): t["T_COMMAND"] = thing_action_id("drink") @@ -703,7 +931,7 @@ def ai(t): if test[0]: if test[1] < 5: return - elif world["terrain_fullness"](t["pos"]) < 5: + elif world_db["terrain_fullness"](t["pos"]) < 5: t["T_COMMAND"] = thing_action_id(action_name) return if t["T_STOMACH"] < 32 and \ @@ -730,9 +958,10 @@ io_db["worldstate_write_order"] += [["T_BOWEL", "player_int"]] io_db["worldstate_write_order"] += [["T_BLADDER", "player_int"]] io_db["worldstate_write_order"] += [[write_wetmap, "func"]] io_db["worldstate_write_order"] += [[write_soundmap, "func"]] +io_db["worldstate_write_order"] += [["GRACE", "world_int"]] import server.config.world_data server.config.world_data.symbols_hide = "345" -server.config.world_data.symbols_passable = "012-" +server.config.world_data.symbols_passable = "012-+*&$" server.config.world_data.thing_defaults["T_STOMACH"] = 16 server.config.world_data.thing_defaults["T_BOWEL"] = 0 server.config.world_data.thing_defaults["T_KIDNEY"] = 16 @@ -743,11 +972,14 @@ if not "NEW_SPAWN" in world_db: world_db["NEW_SPAWN"] = 0 if not "HUMIDITY" in world_db: world_db["HUMIDITY"] = 0 +if not "GRACE" in world_db: + world_db["GRACE"] = 0 io_db["hook_save"] = save_maps import server.config.make_world_helpers server.config.make_world_helpers.make_map = make_map from server.config.commands import commands_db commands_db["THINGS_HERE"] = (2, True, lambda x, y: None) +commands_db["HELP"] = (1, False, command_help) commands_db["ai"] = (0, False, command_ai) commands_db["move"] = (1, False, play_move) commands_db["eat"] = (1, False, play_move) @@ -757,6 +989,7 @@ commands_db["drink"] = (0, False, play_drink) commands_db["pee"] = (0, False, play_pee) commands_db["use"] = (1, False, lambda x: None) commands_db["pickup"] = (0, False, lambda: None) +commands_db["GRACE"] = (1, False, setter(None, "GRACE", 0, 255)) commands_db["NEW_SPAWN"] = (1, False, setter(None, "NEW_SPAWN", 0, 255)) commands_db["HUMIDITY"] = (1, False, setter(None, "HUMIDITY", 0, 65535)) commands_db["T_STOMACH"] = (1, False, setter("Thing", "T_STOMACH", 0, 255))