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 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)
Example #3
0
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
Example #4
0
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
Example #5
0
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.")
Example #6
0
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.")