Add "exclude" to item links (#497)
This commit is contained in:
parent
977159e572
commit
3f691d6977
|
@ -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():
|
||||||
|
|
|
@ -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}")
|
||||||
|
|
Loading…
Reference in New Issue