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
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))
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
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)
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))
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
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
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)
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)))