Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
self.options = GrammarOptions(options)
self.grammar = OrderedDict()
self.rng = g_rng.next() if rng is None else rng
self.allowed_variables_numbering = self.options.allowed_variables_numbering
self.unique_expansion = self.options.unique_expansion
self.all_expansions = defaultdict(list)
# The current used symbols
self.overflow_dict = OrderedDict()
self.used_names = set(self.options.names_to_exclude)
# Load the grammar associated to the provided theme.
self.theme = self.options.theme
# Load the object names file
path = pjoin(KnowledgeBase.default().text_grammars_path, glob.escape(self.theme) + "*.twg")
files = glob.glob(path)
if len(files) == 0:
raise MissingTextGrammar(path)
for filename in files:
self._parse(filename)
* `'easy'`: rooms are all empty except where the two objects are
placed. Also, connections between rooms have no door.
* `'medium'`: adding closed doors and containers that might need
to be open in order to find the object.
* `'hard'`: adding locked doors and containers (necessary keys
will in the inventory) that might need to be unlocked (and open)
in order to find the object.
options:
For customizing the game generation (see
:py:class:`textworld.GameOptions `
for the list of available options).
Returns:
Generated game.
"""
kb = KnowledgeBase.default()
metadata = {} # Collect infos for reproducibility.
metadata["desc"] = "Treasure Hunter"
metadata["mode"] = mode
metadata["seeds"] = options.seeds
metadata["world_size"] = options.nb_rooms
metadata["quest_length"] = options.quest_length
rngs = options.rngs
rng_map = rngs['map']
rng_objects = rngs['objects']
rng_quest = rngs['quest']
rng_grammar = rngs['grammar']
modes = ["easy", "medium", "hard"]
if mode == "easy":
def gen_commands_from_actions(actions: Iterable[Action], kb: Optional[KnowledgeBase] = None) -> List[str]:
kb = kb or KnowledgeBase.default()
def _get_name_mapping(action):
mapping = kb.rules[action.name].match(action)
return {ph.name: var.name for ph, var in mapping.items()}
commands = []
for action in actions:
command = "None"
if action is not None:
command = kb.inform7_commands[action.name]
command = command.format(**_get_name_mapping(action))
commands.append(command)
return commands
def __init__(self):
self.backward = False
self.min_depth = 1
self.max_depth = 1
self.min_breadth = 1
self.max_breadth = 1
self.min_length = 1
self.max_length = 1
self.subquests = False
self.independent_chains = False
self.create_variables = False
self.kb = KnowledgeBase.default()
self.rng = None
self.rules_per_depth = []
self.restricted_types = frozenset()
def get_failing_constraints(state, kb: Optional[KnowledgeBase] = None):
kb = kb or KnowledgeBase.default()
fail = Proposition("fail", [])
failed_constraints = []
constraints = state.all_applicable_actions(kb.constraints.values())
for constraint in constraints:
if state.is_applicable(constraint):
# Optimistically delay copying the state
copy = state.copy()
copy.apply(constraint)
if copy.is_fact(fail):
failed_constraints.append(constraint)
return failed_constraints
# Objective
if "objective" in game_infos:
result["objective"] = game_infos["objective"]
# Objects
all_items = {}
inventory_items = []
objects = world.objects
# if limit_player_view:
# objects = world.get_visible_objects_in(world.player_room)
# objects += world.get_objects_in_inventory()
# add all items first, in case properties are "out of order"
for obj in objects:
cur_item = GraphItem(obj.type, game_infos[obj.id].name)
cur_item.portable = KnowledgeBase.default().types.is_descendant_of(cur_item.type, "o")
all_items[obj.id] = cur_item
for obj in sorted(objects, key=lambda obj: obj.name):
cur_item = all_items[obj.id]
for attribute in obj.get_attributes():
if action and attribute in action.added:
cur_item.highlight = True
if attribute.name == 'in':
# add object to inventory
if attribute.arguments[-1].type == 'I':
inventory_items.append(cur_item)
elif attribute.arguments[0].name == obj.id:
# add object to containers if same object
all_items[attribute.arguments[1].name].add_content(cur_item)
else:
msg = ("Not enough variation for '{}'. Falling back on using adjective '{}'."
" To avoid this message you can add more variation in the '{}'"
" related grammar files located in '{}'.")
msg = msg.format(symbol, adj, self.theme, KnowledgeBase.default().text_grammars_path)
warnings.warn(msg, textworld.GenerationWarning)
return name, adj, noun
# Still not enough variation for the object we want to name.
if not self.allowed_variables_numbering:
msg = ("Not enough variation for '{}'. You can add more variation"
" in the '{}' related grammar files located in '{}'"
" or turn on the 'include_adj=True' grammar flag."
" In last resort, you could always turn on the"
" 'allowed_variables_numbering=True' grammar flag"
" to append unique number to object name.")
msg = msg.format(symbol, self.theme, KnowledgeBase.default().text_grammars_path)
raise ValueError(msg)
if obj_type not in self.overflow_dict:
self.overflow_dict[obj_type] = []
# Append unique (per type) number to the noun.
suffix = " {}".format(len(self.overflow_dict[obj_type]))
noun += suffix
name += suffix
self.overflow_dict[obj_type].append(name)
return name, adj, noun
def __init__(self, *args, kb: Optional[KnowledgeBase] = None, **kwargs):
super().__init__(*args, **kwargs)
self._kb = kb or KnowledgeBase.default()