X-Git-Url: https://plomlompom.com/repos/feed.xml?a=blobdiff_plain;f=plugins%2Fserver%2FTheCrawlingEater.py;h=42f9d11956e696def0bc58ef76df19c1483d399b;hb=7724064e3411909c0156c6dbb24aa1cb94fe021f;hp=125d3f1a9ce77f7813521f22aa4e121d6031f847;hpb=14172a43e85f8f30bcf9fd8df5cfcd7fa83bc14a;p=plomrogue diff --git a/plugins/server/TheCrawlingEater.py b/plugins/server/TheCrawlingEater.py index 125d3f1..42f9d11 100644 --- a/plugins/server/TheCrawlingEater.py +++ b/plugins/server/TheCrawlingEater.py @@ -84,6 +84,17 @@ def play_move(str_arg): 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]: @@ -107,21 +118,26 @@ def actor_eat(t): 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 - # if world_db["Things"][tid]["T_LIFEPOINTS"] - # if world_db["Things"][tid]["T_POSY"] == move_result[1] - # if world_db["Things"][tid]["T_POSX"] == move_result[2]] - #if len(hitted): - # hit_id = hitted[0] - # hitted_tid = world_db["Things"][hit_id]["T_TYPE"] - # if t == world_db["Things"][0]: - # hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"] - # log("You BUMP into " + hitted_name + ".") - # elif 0 == hit_id: - # hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] - # log(hitter_name +" BUMPS into you.") - # return + 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): + hit_id = hitted[0] + hitted_tid = world_db["Things"][hit_id]["T_TYPE"] + if t == world_db["Things"][0]: + hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"] + log("You SUCK from " + hitted_name + ".") + elif 0 == hit_id: + hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] + log(hitter_name +" SUCKS from you.") + hitted = world_db["Things"][hit_id] + if t["T_STOMACH"] < 32: + t["T_STOMACH"] = t["T_STOMACH"] + 1 + hitted["T_STOMACH"] -= 1 + if t["T_KIDNEY"] < 32: + t["T_KIDNEY"] = t["T_KIDNEY"] + 1 + hitted["T_KIDNEY"] -= 1 + return passable = chr(world_db["MAP"][pos]) in symbols_passable if passable and t == world_db["Things"][0]: log("You try to EAT, but fail.") @@ -149,27 +165,26 @@ 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] - #hitted = [tid for tid in world_db["Things"] - # if world_db["Things"][tid] != t - # if world_db["Things"][tid]["T_LIFEPOINTS"] - # if world_db["Things"][tid]["T_POSY"] == move_result[1] - # if world_db["Things"][tid]["T_POSX"] == move_result[2]] - #if len(hitted): - # hit_id = hitted[0] - # hitted_tid = world_db["Things"][hit_id]["T_TYPE"] - # if t == world_db["Things"][0]: - # hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"] - # log("You BUMP into " + hitted_name + ".") - # elif 0 == hit_id: - # hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] - # log(hitter_name +" BUMPS into you.") - # return + 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): + hit_id = hitted[0] + hitted_tid = world_db["Things"][hit_id]["T_TYPE"] + if t == world_db["Things"][0]: + hitted_name = world_db["ThingTypes"][hitted_tid]["TT_NAME"] + log("You BUMP into " + hitted_name + ".") + elif 0 == hit_id: + hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] + log(hitter_name +" BUMPS into you.") + return passable = chr(world_db["MAP"][pos]) in symbols_passable if passable: t["T_POSY"] = move_result[1] t["T_POSX"] = move_result[2] t["pos"] = move_result[1] * world_db["MAP_LENGTH"] + move_result[2] - build_fov_map(t) + #if t != world_db["Things"][0]: + # world_db["Things"][0]["T_MEMMAP"][t["pos"]] = ord("?") elif t == world_db["Things"][0]: log("You try to MOVE there, but fail.") @@ -259,6 +274,7 @@ def turn_over(): from server.io import try_worldstate_update from server.config.io import io_db from server.utils import rand + from server.build_fov_map import build_fov_map while world_db["Things"][0]["T_LIFEPOINTS"]: for tid in [tid for tid in world_db["Things"]]: if not tid in world_db["Things"]: @@ -269,6 +285,7 @@ def turn_over(): continue if not t["T_COMMAND"]: update_map_memory(t) + build_fov_map(t) if 0 == tid: return world_db["ai"](t) @@ -419,6 +436,12 @@ def get_dir_to_target(t, target): from server.utils import rand, libpr, c_pointer_to_bytearray from server.config.world_data import symbols_passable + def get_map_score(pos): + result = libpr.get_map_score(pos) + if result < 0: + raise RuntimeError("No score map allocated for get_map_score().") + return result + def zero_score_map_where_char_on_memdepthmap(c): map = c_pointer_to_bytearray(t["T_MEMDEPTHMAP"]) if libpr.zero_score_map_where_char_on_memdepthmap(c, map): @@ -436,6 +459,11 @@ def get_dir_to_target(t, target): raise RuntimeError("No movement cost map allocated for " "set_movement_cost_map().") + def animates_in_fov(maplength): + return [Thing for Thing in world_db["Things"].values() + if Thing["T_LIFEPOINTS"] and 118 == t["fovmap"][Thing["pos"]] + and (not Thing == t)] + def seeing_thing(): def exists(gen): try: @@ -461,6 +489,9 @@ def get_dir_to_target(t, target): if ord("0") <= 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"]: + return exists(Thing for + Thing in animates_in_fov(world_db["MAP_LENGTH"])) return False def init_score_map(): @@ -488,6 +519,9 @@ def get_dir_to_target(t, target): or world_db["terrain_fullness"](pos) < 5)] elif target == "search": zero_score_map_where_char_on_memdepthmap(mem_depth_c[0]) + elif target in {"hunt", "flee"}: + [set_map_score(Thing["pos"], 0) for + Thing in animates_in_fov(world_db["MAP_LENGTH"])] def rand_target_dir(neighbors, cmp, dirs): candidates = [] @@ -513,13 +547,25 @@ def get_dir_to_target(t, target): dirs = "edcxsw" eye_pos = t["pos"] neighbors = get_neighbor_scores(dirs, eye_pos) - minmax_start = 65535 - 1 + minmax_start = 0 if "flee" == target else 65535 - 1 minmax_neighbor = minmax_start for i in range(len(dirs)): - if minmax_neighbor > neighbors[i]: + if ("flee" == target and get_map_score(t["pos"]) < neighbors[i] and + minmax_neighbor < neighbors[i] and 65535 != neighbors[i]) \ + or ("flee" != target and minmax_neighbor > neighbors[i]): minmax_neighbor = neighbors[i] if minmax_neighbor != minmax_start: dir_to_target = rand_target_dir(neighbors, minmax_neighbor, dirs) + if "flee" == target: + distance = get_map_score(t["pos"]) + fear_distance = 5 + attack_distance = 1 + if not dir_to_target: + if attack_distance >= distance: + dir_to_target = rand_target_dir(neighbors, + distance - 1, dirs) + elif dir_to_target and fear_distance < distance: + dir_to_target = 0 return dir_to_target, minmax_neighbor dir_to_target = False @@ -544,7 +590,9 @@ def get_dir_to_target(t, target): if 1 != move_result[0]: return False, 0 pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2] - if world_db["MAP"][pos] > ord("2"): + hitted = [tid for tid in world_db["Things"] + if world_db["Things"][tid]["pos"] == pos] + if world_db["MAP"][pos] > ord("2") or len(hitted) > 0: action = "eat" t["T_COMMAND"] = [taid for taid in world_db["ThingActions"] if world_db["ThingActions"][taid]["TA_NAME"] @@ -579,6 +627,7 @@ def ai(t): t["T_COMMAND"] = thing_action_id("wait") needs = { + "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, "food": 33 - t["T_STOMACH"], @@ -615,11 +664,15 @@ def ai(t): world_db["get_dir_to_target"](t, "food")[0]: return continue - if world_db["get_dir_to_target"](t, need[0])[0]: - return - elif t["T_STOMACH"] < 32 and \ - need[0] in {"fluid_certain", "fluid_potential"} and \ - world_db["get_dir_to_target"](t, "food")[0]: + if need[0] in {"fluid_certain", "fluid_potential", "food"}: + if world_db["get_dir_to_target"](t, need[0])[0]: + return + elif world_db["get_dir_to_target"](t, "hunt")[0]: + return + elif need[0] != "food" and t["T_STOMACH"] < 32 and \ + world_db["get_dir_to_target"](t, "food")[0]: + return + elif world_db["get_dir_to_target"](t, need[0])[0]: return world_db["ai"] = ai