Add "exclude" to item links (#497)

This commit is contained in:
CaitSith2 2022-05-11 16:37:18 -07:00 committed by GitHub
parent 977159e572
commit 3f691d6977
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -218,12 +218,14 @@ class MultiWorld():
raise Exception(f"Cannot ItemLink across games. Link: {item_link['name']}") raise Exception(f"Cannot ItemLink across games. Link: {item_link['name']}")
item_links[item_link["name"]]["players"][player] = item_link["replacement_item"] item_links[item_link["name"]]["players"][player] = item_link["replacement_item"]
item_links[item_link["name"]]["item_pool"] &= set(item_link["item_pool"]) item_links[item_link["name"]]["item_pool"] &= set(item_link["item_pool"])
item_links[item_link["name"]]["exclude"] |= set(item_link.get("exclude", []))
else: else:
if item_link["name"] in self.player_name.values(): if item_link["name"] in self.player_name.values():
raise Exception(f"Cannot name a ItemLink group the same as a player ({item_link['name']}) ({self.get_player_name(player)}).") raise Exception(f"Cannot name a ItemLink group the same as a player ({item_link['name']}) ({self.get_player_name(player)}).")
item_links[item_link["name"]] = { item_links[item_link["name"]] = {
"players": {player: item_link["replacement_item"]}, "players": {player: item_link["replacement_item"]},
"item_pool": set(item_link["item_pool"]), "item_pool": set(item_link["item_pool"]),
"exclude": set(item_link.get("exclude", [])),
"game": self.game[player] "game": self.game[player]
} }
@ -232,6 +234,8 @@ class MultiWorld():
pool = set() pool = set()
for item in item_link["item_pool"]: for item in item_link["item_pool"]:
pool |= current_item_name_groups.get(item, {item}) pool |= current_item_name_groups.get(item, {item})
for item in item_link["exclude"]:
pool -= current_item_name_groups.get(item, {item})
item_link["item_pool"] = pool item_link["item_pool"] = pool
for group_name, item_link in item_links.items(): for group_name, item_link in item_links.items():

View File

@ -5,10 +5,9 @@ import numbers
import typing import typing
import random import random
from schema import Schema, And, Or from schema import Schema, And, Or, Optional
from Utils import get_fuzzy_results from Utils import get_fuzzy_results
class AssembleOptions(abc.ABCMeta): class AssembleOptions(abc.ABCMeta):
def __new__(mcs, name, bases, attrs): def __new__(mcs, name, bases, attrs):
options = attrs["options"] = {} options = attrs["options"] = {}
@ -642,6 +641,7 @@ class ItemLinks(OptionList):
{ {
"name": And(str, len), "name": And(str, len),
"item_pool": [And(str, len)], "item_pool": [And(str, len)],
Optional("exclude"): [And(str, len)],
"replacement_item": Or(And(str, len), None) "replacement_item": Or(And(str, len), None)
} }
]) ])
@ -657,6 +657,11 @@ class ItemLinks(OptionList):
if item_name not in world.item_names and item_name not in world.item_name_groups: if item_name not in world.item_names and item_name not in world.item_name_groups:
raise Exception(f"Item {item_name} from item link {link} " raise Exception(f"Item {item_name} from item link {link} "
f"is not a valid item name from {world.game}") f"is not a valid item name from {world.game}")
if "exclude" in link:
for item_name in link["exclude"]:
if item_name not in world.item_names and item_name not in world.item_name_groups:
raise Exception(f"Item {item_name} from item link {link} "
f"is not a valid item name from {world.game}")
if link["replacement_item"] and link["replacement_item"] not in world.item_names: if link["replacement_item"] and link["replacement_item"] not in world.item_names:
raise Exception(f"Item {link['replacement_item']} from item link {link} " raise Exception(f"Item {link['replacement_item']} from item link {link} "
f"is not a valid item name from {world.game}") f"is not a valid item name from {world.game}")