def thingproliferation(t, prol_map): """To chance of 1/TT_PROLIFERATE, create t offspring in open neighbor cell. Naturally only works with TT_PROLIFERATE > 0. The neighbor cell must be be marked passable in prol_map. If there are several map cell candidates, one is selected randomly. """ from server.config.world_data import directions_db, world_db, \ thingprol_field_spreadable, thingprol_test_hook, \ thingprol_post_create_hook from server.utils import mv_yx_in_dir_legal, rand, id_setter from server.new_thing import new_Thing prolscore = world_db["ThingTypes"][t["T_TYPE"]]["TT_PROLIFERATE"] if prolscore and (1 == prolscore or 1 == (rand.next() % prolscore)) and \ thingprol_test_hook(t): candidates = [] for key in sorted(directions_db.keys()): mv_result = mv_yx_in_dir_legal(directions_db[key], t["T_POSY"], t["T_POSX"]) c = chr(prol_map[mv_result[1] * world_db["MAP_LENGTH"] + mv_result[2]]) if mv_result[0] and thingprol_field_spreadable(c, t): from server.io import log candidates.append((mv_result[1], mv_result[2])) if len(candidates): i = rand.next() % len(candidates) tid = id_setter(-1, "Things") newT = new_Thing(t["T_TYPE"], (candidates[i][0], candidates[i][1])) world_db["Things"][tid] = newT thingprol_post_create_hook(t)
def actor_move(t): """If passable, move/collide(=attack) thing into T_ARGUMENT's direction. On attack, return 0 on non-kill and TT_LIFEPOINTS of killed type on kill, plus type id of attacked Thing. On move, return mv_yx_in_dir_legal result. """ from server.build_fov_map import build_fov_map from server.config.misc import decrement_lifepoints from server.utils import mv_yx_in_dir_legal from server.config.world_data import directions_db, symbols_passable passable = False move_result = mv_yx_in_dir_legal(chr(t["T_ARGUMENT"]), t["T_POSY"], t["T_POSX"]) if 1 == move_result[0]: pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2] hitted = [ id for id in world_db["Things"] if world_db["Things"][id] != t if world_db["Things"][id]["T_LIFEPOINTS"] if world_db["Things"][id]["T_POSY"] == move_result[1] if world_db["Things"][id]["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 WOUND " + hitted_name + ".") elif 0 == hit_id: hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] log(hitter_name + " WOUNDS you.") decr_test = decrement_lifepoints(world_db["Things"][hit_id]) if decr_test > 0 and t == world_db["Things"][0]: log(hitted_name + " dies.") return decr_test, hitted_tid from server.config.actions import actor_move_attempts_hook if actor_move_attempts_hook(t, move_result, pos): return passable = chr(world_db["MAP"][pos]) in symbols_passable dir = [ dir for dir in directions_db if directions_db[dir] == chr(t["T_ARGUMENT"]) ][0] 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] for id in t["T_CARRIES"]: world_db["Things"][id]["T_POSY"] = move_result[1] world_db["Things"][id]["T_POSX"] = move_result[2] world_db["Things"][id]["pos"] = t["pos"] build_fov_map(t) if t == world_db["Things"][0]: log("You MOVE " + dir + ".") return move_result
def actor_move(t): """If passable, move/collide(=attack) thing into T_ARGUMENT's direction. On attack, return 0 on non-kill and TT_LIFEPOINTS of killed type on kill, plus type id of attacked Thing. On move, return mv_yx_in_dir_legal result. """ from server.build_fov_map import build_fov_map from server.config.misc import decrement_lifepoints from server.utils import mv_yx_in_dir_legal from server.config.world_data import directions_db, symbols_passable passable = False move_result = mv_yx_in_dir_legal(chr(t["T_ARGUMENT"]), t["T_POSY"], t["T_POSX"]) if 1 == move_result[0]: pos = (move_result[1] * world_db["MAP_LENGTH"]) + move_result[2] hitted = [id for id in world_db["Things"] if world_db["Things"][id] != t if world_db["Things"][id]["T_LIFEPOINTS"] if world_db["Things"][id]["T_POSY"] == move_result[1] if world_db["Things"][id]["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 WOUND " + hitted_name + ".") elif 0 == hit_id: hitter_name = world_db["ThingTypes"][t["T_TYPE"]]["TT_NAME"] log(hitter_name +" WOUNDS you.") decr_test = decrement_lifepoints(world_db["Things"][hit_id]) if decr_test > 0 and t == world_db["Things"][0]: log(hitted_name + " dies.") return decr_test, hitted_tid from server.config.actions import actor_move_attempts_hook if actor_move_attempts_hook(t, move_result, pos): return passable = chr(world_db["MAP"][pos]) in symbols_passable dir = [dir for dir in directions_db if directions_db[dir] == chr(t["T_ARGUMENT"])][0] 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] for id in t["T_CARRIES"]: world_db["Things"][id]["T_POSY"] = move_result[1] world_db["Things"][id]["T_POSX"] = move_result[2] world_db["Things"][id]["pos"] = t["pos"] build_fov_map(t) if t == world_db["Things"][0]: log("You MOVE " + dir + ".") return move_result
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] if ord("~") == world_db["MAP"][pos]: log("You can't SWIM.") return from server.config.commands import play_move_attempt_hook if play_move_attempt_hook(t, d, pos): return if chr(world_db["MAP"][pos]) in symbols_passable: world_db["Things"][0]["T_ARGUMENT"] = d set_command("move") return log("You CAN'T move there.")