Beispiel #1
0
    def main_quest(self):
        if self._main_quest is None:
            from textworld.generator import inform7
            from textworld.generator.text_generation import assign_description_to_quest
            self._main_quest = Quest(actions=GameProgression(self).winning_policy)
            self._main_quest.desc = assign_description_to_quest(self._main_quest, self, self.grammar)
            self._main_quest.commands = inform7.gen_commands_from_actions(self._main_quest.actions, self.infos)

        return self._main_quest
Beispiel #2
0
        def _apply_command(command, game_progression):
            valid_commands = gen_commands_from_actions(game_progression.valid_actions, game.infos)

            for action, cmd in zip(game_progression.valid_actions, valid_commands):
                if command == cmd:
                    game_progression.update(action)
                    return

            raise ValueError("Not a valid command: {}. Expected: {}".format(command, valid_commands))
Beispiel #3
0
def build_tree_from_chains(chains, var_infos):
    G = nx.DiGraph()
    root = "root"
    labels = {}
    for chain in chains:
        commands = [root] + gen_commands_from_actions(chain.actions, var_infos)
        G.add_nodes_from(commands)
        G.add_edges_from(zip(commands[:-1], commands[1:]))
        labels.update(dict(zip(commands, commands)))

    return G, labels
Beispiel #4
0
 def change_grammar(self, grammar: Grammar) -> None:
     """ Changes the grammar used and regenerate all text. """
     from textworld.generator import inform7
     from textworld.generator.text_generation import generate_text_from_grammar
     self.grammar = grammar
     generate_text_from_grammar(self, self.grammar)
     for quest in self.quests:
         # TODO: should have a generic way of generating text commands from actions
         #       insteaf of relying on inform7 convention.
         quest.commands = inform7.gen_commands_from_actions(
             quest.actions, self.infos)
Beispiel #5
0
def _apply_command(command: str, game_progression: GameProgression) -> None:
    """ Apply a text command to a game_progression object.
    """
    valid_commands = gen_commands_from_actions(game_progression.valid_actions,
                                               game_progression.game.infos)

    for action, cmd in zip(game_progression.valid_actions, valid_commands):
        if command == cmd:
            game_progression.update(action)
            return

    raise ValueError("Not a valid command: {}. Expected: {}".format(
        command, valid_commands))
Beispiel #6
0
    def policy_commands(self):
        """ Commands to entered in order to complete the quest. """
        if not hasattr(self, "_policy_commands"):
            if not self._compute_intermediate_reward:
                raise OraclePolicyIsRequiredError("policy_commands")

            self._policy_commands = []
            if self._game_progression.winning_policy is not None:
                winning_policy = self._game_progression.winning_policy
                self._policy_commands = gen_commands_from_actions(
                    winning_policy, self.game_infos)

        return self._policy_commands
Beispiel #7
0
    def admissible_commands(self):
        """ Return the list of admissible commands given the current state. """
        if not hasattr(self, "_admissible_commands"):
            if not self._state_tracking:
                raise StateTrackingIsRequiredError("admissible_commands")

            all_valid_commands = gen_commands_from_actions(
                self._game_progression.valid_actions, self.game_infos)
            # Add single-word commands.
            all_valid_commands.append("look")
            all_valid_commands.append("inventory")
            # TODO: Manually add 'examine <obj>' given objects in the room?
            # To guarantee the order from one execution to another, we sort the commands.
            # Remove any potential duplicate commands (they would lead to the same result anyway).
            self._admissible_commands = sorted(set(all_valid_commands))

        return self._admissible_commands
Beispiel #8
0
    def test_cycle_in_winning_policy(cls):
        M = GameMaker()

        # Create a map.
        # r0
        #  |
        # r1 -- r2
        #  |    |
        # r3 -- r4
        R0 = M.new_room("r0")
        R1 = M.new_room("r1")
        R2 = M.new_room("r2")
        R3 = M.new_room("r3")
        R4 = M.new_room("r4")
        M.set_player(R1)

        M.connect(R0.south, R1.north),
        M.connect(R1.east, R2.west),
        M.connect(R3.east, R4.west)
        M.connect(R1.south, R3.north)
        M.connect(R2.south, R4.north)

        carrot = M.new(type='f', name='carrot')
        R0.add(carrot)

        apple = M.new(type='f', name='apple')
        R2.add(apple)

        commands = ["go north", "take carrot"]
        M.set_quest_from_commands(commands)
        game = M.build()
        game_progression = GameProgression(game)

        def _apply_command(command, game_progression):
            valid_commands = gen_commands_from_actions(game_progression.valid_actions, game.infos)

            for action, cmd in zip(game_progression.valid_actions, valid_commands):
                if command == cmd:
                    game_progression.update(action)
                    return

            raise ValueError("Not a valid command: {}. Expected: {}".format(command, valid_commands))

        _apply_command("go south", game_progression)
        expected_commands = ["go north"] + commands
        winning_commands = gen_commands_from_actions(game_progression.winning_policy, game.infos)
        assert winning_commands == expected_commands, "{} != {}".format(winning_commands, expected_commands)

        _apply_command("go east", game_progression)

        _apply_command("go north", game_progression)
        expected_commands = ["go south", "go west", "go north"] + commands
        winning_commands = gen_commands_from_actions(game_progression.winning_policy, game.infos)
        assert winning_commands == expected_commands, "{} != {}".format(winning_commands, expected_commands)

        _apply_command("go west", game_progression)  # Found shortcut
        expected_commands = commands
        winning_commands = gen_commands_from_actions(game_progression.winning_policy, game.infos)
        assert winning_commands == expected_commands, "{} != {}".format(winning_commands, expected_commands)

        # Quest where player's has to pick up the carrot first.
        commands = ["go east", "take apple", "go west", "go north", "drop apple"]
        M.set_quest_from_commands(commands)
        game = M.build()
        game_progression = GameProgression(game)

        _apply_command("go south", game_progression)
        expected_commands = ["go north"] + commands
        winning_commands = gen_commands_from_actions(game_progression.winning_policy, game.infos)
        assert winning_commands == expected_commands, "{} != {}".format(winning_commands, expected_commands)

        _apply_command("go east", game_progression)
        expected_commands = ["go west", "go north"] + commands
        winning_commands = gen_commands_from_actions(game_progression.winning_policy, game.infos)
        assert winning_commands == expected_commands, "{} != {}".format(winning_commands, expected_commands)

        _apply_command("go north", game_progression)  # Found shortcut
        expected_commands = commands[1:]
        winning_commands = gen_commands_from_actions(game_progression.winning_policy, game.infos)
        assert winning_commands == expected_commands, "{} != {}".format(winning_commands, expected_commands)
Beispiel #9
0
def print_chains(chains, var_infos):
    for i, chain in enumerate(chains):
        commands = gen_commands_from_actions(chain.actions, var_infos)
        print("{:2d}. {}".format(i + 1, " > ".join(commands)))