From: Christian Heller Date: Wed, 9 Sep 2015 03:58:20 +0000 (+0200) Subject: Add forgiving checks for player mistakes. X-Git-Tag: tce~278 X-Git-Url: https://plomlompom.com/repos/%7B%7Bdb.prefix%7D%7D/static/%7B%7Bprefix%7D%7D/%7Broute%7D?a=commitdiff_plain;h=480be993b5518ec204c22353a1c19867842de64a;p=plomrogue Add forgiving checks for player mistakes. --- diff --git a/roguelike-server b/roguelike-server index 30f9337..c727b66 100755 --- a/roguelike-server +++ b/roguelike-server @@ -1194,37 +1194,80 @@ def command_thingshere(str_y, str_x): print("Ignoring: Command only works on existing worlds.") -def play_commander(action, args=False): - """Setter for player's T_COMMAND and T_ARGUMENT, then calling turn_over(). +def set_command(action): + """Set player's T_COMMAND, then call turn_over().""" + id = [x for x in world_db["ThingActions"] + if world_db["ThingActions"][x]["TA_NAME"] == action][0] + world_db["Things"][0]["T_COMMAND"] = id + turn_over() - T_ARGUMENT is set to direction char if action=="wait",or 8-bit int if args. - """ - def set_command(): - id = [x for x in world_db["ThingActions"] - if world_db["ThingActions"][x]["TA_NAME"] == action][0] - world_db["Things"][0]["T_COMMAND"] = id - turn_over() +def play_wait(): + """Try "wait" as player's T_COMMAND.""" + set_command("wait") + + +def play_pickup(): + """Try "pick_up" as player's T_COMMAND".""" + t = world_db["Things"][0] + ids = [id for id in world_db["Things"] if id + if not world_db["Things"][id]["carried"] + if world_db["Things"][id]["T_POSY"] == t["T_POSY"] + if world_db["Things"][id]["T_POSX"] == t["T_POSX"]] + if not len(ids): + log("Nothing to pick up.") + else: + set_command("pick_up") + - def set_command_and_argument_int(str_arg): +def play_drop(str_arg): + """Try "drop" as player's T_COMMAND, int(str_arg) as T_ARGUMENT / slot.""" + t = world_db["Things"][0] + if 0 == len(t["T_CARRIES"]): + log("You have nothing to drop in your inventory.") + else: val = integer_test(str_arg, 0, 255) - if None != val: + if None != val and val < len(t["T_CARRIES"]): world_db["Things"][0]["T_ARGUMENT"] = val - set_command() - - def set_command_and_argument_movestring(str_arg): - if str_arg in directions_db: - world_db["Things"][0]["T_ARGUMENT"] = ord(directions_db[str_arg]) - set_command() + set_command("drop") else: - print("Ignoring: Argument must be valid direction string.") + print("Illegal inventory index.") - if action == "move": - return set_command_and_argument_movestring - elif args: - return set_command_and_argument_int + +def play_use(str_arg): + """Try "use" as player's T_COMMAND, int(str_arg) as T_ARGUMENT / slot.""" + t = world_db["Things"][0] + if 0 == len(t["T_CARRIES"]): + log("You have nothing to use in your inventory.") else: - return set_command + val = integer_test(str_arg, 0, 255) + if None != val and val < len(t["T_CARRIES"]): + id = t["T_CARRIES"][val] + type = world_db["Things"][id]["T_TYPE"] + if not world_db["ThingTypes"][type]["TT_TOOL"] == "food": + log("You can't consume this thing.") + return + world_db["Things"][0]["T_ARGUMENT"] = val + set_command("use") + else: + print("Illegal inventory index.") + + +def play_move(str_arg): + """Try "move" as player's T_COMMAND, str_arg as T_ARGUMENT / direction.""" + t = world_db["Things"][0] + if not str_arg in directions_db: + print("Illegal move direction string.") + return + dir = ord(directions_db[str_arg]) + move_result = mv_yx_in_dir_legal(chr(dir), 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]: + world_db["Things"][0]["T_ARGUMENT"] = dir + set_command("move") + return + log("You can't move there.") def command_seedrandomness(seed_string): @@ -1666,11 +1709,11 @@ commands_db = { "T_MEMTHING": (3, False, command_tmemthing), "T_POSY": (1, False, setter_tpos("Y")), "T_POSX": (1, False, setter_tpos("X")), - "wait": (0, False, play_commander("wait")), - "move": (1, False, play_commander("move")), - "pick_up": (0, False, play_commander("pick_up")), - "drop": (1, False, play_commander("drop", True)), - "use": (1, False, play_commander("use", True)), + "wait": (0, False, play_wait), + "move": (1, False, play_move), + "pick_up": (0, False, play_pickup), + "drop": (1, False, play_drop), + "use": (1, False, play_use), "ai": (0, False, command_ai) } # TODO: Unhandled cases: (Un-)killing animates (esp. player!) with T_LIFEPOINTS.