def make_quest(world, quest_length, rng=None, rules_per_depth=(), backward=False): state = world if hasattr(world, "state"): state = world.state rng = g_rng.next() if rng is None else rng # Sample a quest according to quest_length. options = ChainingOptions() options.backward = backward options.max_depth = quest_length options.rng = rng options.rules_per_depth = rules_per_depth chain = sample_quest(state, options) return Quest(chain.actions)
def make_game(world_size: int, nb_objects: int, quest_length: int, grammar_flags: Mapping = {}, rngs: Optional[Dict[str, RandomState]] = None) -> Game: """ Make a game (map + objects + quest). Arguments: world_size: Number of rooms in the world. nb_objects: Number of objects in the world. quest_length: Minimum nb. of actions the quest requires to be completed. grammar_flags: Options for the grammar. Returns: Generated game. """ if rngs is None: rngs = {} rng = g_rng.next() rngs['rng_map'] = RandomState(rng.randint(65635)) rngs['rng_objects'] = RandomState(rng.randint(65635)) rngs['rng_quest'] = RandomState(rng.randint(65635)) rngs['rng_grammar'] = RandomState(rng.randint(65635)) # Generate only the map for now (i.e. without any objects) world = make_world(world_size, nb_objects=0, rngs=rngs) # Sample a quest according to quest_length. options = ChainingOptions() options.backward = True options.max_depth = quest_length options.create_variables = True options.rng = rngs['rng_quest'] options.restricted_types = {"r", "d"} chain = sample_quest(world.state, options) quest = Quest(chain.actions) # Set the initial state required for the quest. world.state = chain.initial_state # Add distractors objects (i.e. not related to the quest) world.populate(nb_objects, rng=rngs['rng_objects']) grammar = make_grammar(grammar_flags, rng=rngs['rng_grammar']) game = make_game_with(world, [quest], grammar) return game
def main(): args = parse_args() # Load game for which to sample quests for. game = Game.load(args.game.replace(".ulx", ".json")) options = ChainingOptions() options.backward = False options.max_depth = args.quest_length options.max_breadth = args.quest_breadth options.rules_per_depth = {} options.create_variables = False options.rng = np.random.RandomState(args.seed) # Sample quests. chains = [] for i in range(args.nb_quests): chain = sample_quest(game.world.state, options) chains.append(chain) inform7 = Inform7Game(game) print_chains(chains, inform7) # Convert chains to networkx graph/tree filename_world = pjoin(args.output, "sample_world.png") filename_tree = pjoin(args.output, "sample_tree.svg") filename_graph = pjoin(args.output, "sample_graph.svg") G, labels = build_tree_from_chains(chains, inform7) if len(G) > 0: image = visualize(game) image.save(filename_world) tree = nx.bfs_tree(G, "root") save_graph_to_svg(tree, labels, filename_tree) save_graph_to_svg(G, labels, filename_graph) else: try: os.remove(filename_world) os.remove(filename_tree) os.remove(filename_graph) except: pass