Witness: Fix 2 generation crashes (#2043)
* Fix for error in get_early_items when removing plandoed items. * Fix Early Caves * Remove unnecessary list() call * Update worlds/witness/items.py Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com> --------- Co-authored-by: blastron <blastron@mac.com> Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
This commit is contained in:
parent
a99a407c41
commit
cf37a69e53
|
@ -128,6 +128,7 @@ class WitnessWorld(World):
|
||||||
item_pool.pop(inventory_item_name)
|
item_pool.pop(inventory_item_name)
|
||||||
else:
|
else:
|
||||||
item_pool[inventory_item_name] -= 1
|
item_pool[inventory_item_name] -= 1
|
||||||
|
self.multiworld.push_precollected(self.create_item(inventory_item_name))
|
||||||
|
|
||||||
if len(item_pool) > pool_size:
|
if len(item_pool) > pool_size:
|
||||||
error_string = "The Witness world has too few locations ({num_loc}) to place its necessary items " \
|
error_string = "The Witness world has too few locations ({num_loc}) to place its necessary items " \
|
||||||
|
|
|
@ -3,7 +3,7 @@ Defines progression, junk and event items for The Witness
|
||||||
"""
|
"""
|
||||||
import copy
|
import copy
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Optional, Dict, List
|
from typing import Optional, Dict, List, Set
|
||||||
|
|
||||||
from BaseClasses import Item, MultiWorld, ItemClassification
|
from BaseClasses import Item, MultiWorld, ItemClassification
|
||||||
from .Options import get_option_value, is_option_enabled, the_witness_options
|
from .Options import get_option_value, is_option_enabled, the_witness_options
|
||||||
|
@ -197,36 +197,36 @@ class WitnessPlayerItems:
|
||||||
"""
|
"""
|
||||||
Returns items that are ideal for placing on extremely early checks, like the tutorial gate.
|
Returns items that are ideal for placing on extremely early checks, like the tutorial gate.
|
||||||
"""
|
"""
|
||||||
output: List[str] = []
|
output: Set[str] = set()
|
||||||
if "shuffle_symbols" not in the_witness_options.keys() \
|
if "shuffle_symbols" not in the_witness_options.keys() \
|
||||||
or is_option_enabled(self._world, self._player_id, "shuffle_symbols"):
|
or is_option_enabled(self._world, self._player_id, "shuffle_symbols"):
|
||||||
if get_option_value(self._world, self._player_id, "shuffle_doors") > 0:
|
if get_option_value(self._world, self._player_id, "shuffle_doors") > 0:
|
||||||
output = ["Dots", "Black/White Squares", "Symmetry"]
|
output = {"Dots", "Black/White Squares", "Symmetry"}
|
||||||
else:
|
else:
|
||||||
output = ["Dots", "Black/White Squares", "Symmetry", "Shapers", "Stars"]
|
output = {"Dots", "Black/White Squares", "Symmetry", "Shapers", "Stars"}
|
||||||
|
|
||||||
if is_option_enabled(self._world, self._player_id, "shuffle_discarded_panels"):
|
if is_option_enabled(self._world, self._player_id, "shuffle_discarded_panels"):
|
||||||
if get_option_value(self._world, self._player_id, "puzzle_randomization") == 1:
|
if get_option_value(self._world, self._player_id, "puzzle_randomization") == 1:
|
||||||
output.append("Arrows")
|
output.add("Arrows")
|
||||||
else:
|
else:
|
||||||
output.append("Triangles")
|
output.add("Triangles")
|
||||||
|
|
||||||
# Replace progressive items with their parents.
|
# Replace progressive items with their parents.
|
||||||
output = [StaticWitnessLogic.get_parent_progressive_item(item) for item in output]
|
output = {StaticWitnessLogic.get_parent_progressive_item(item) for item in output}
|
||||||
|
|
||||||
# Remove items that are mentioned in any plando options. (Hopefully, in the future, plando will get resolved
|
# Remove items that are mentioned in any plando options. (Hopefully, in the future, plando will get resolved
|
||||||
# before create_items so that we'll be able to check placed items instead of just removing all items mentioned
|
# before create_items so that we'll be able to check placed items instead of just removing all items mentioned
|
||||||
# regardless of whether or not they actually wind up being manually placed.
|
# regardless of whether or not they actually wind up being manually placed.
|
||||||
for plando_setting in self._world.plando_items[self._player_id]:
|
for plando_setting in self._world.plando_items[self._player_id]:
|
||||||
if plando_setting.get("from_pool", True):
|
if plando_setting.get("from_pool", True):
|
||||||
if "item" in plando_setting and type(plando_setting["item"]) is str:
|
for item_setting_key in (key for key in ["item", "items"] if key in plando_setting):
|
||||||
output.remove(plando_setting["item"])
|
if type(plando_setting[item_setting_key]) is str:
|
||||||
elif "items" in plando_setting:
|
output.remove(plando_setting[item_setting_key])
|
||||||
if type(plando_setting["items"]) is dict:
|
elif type(plando_setting[item_setting_key]) is dict:
|
||||||
output -= [item for item, weight in plando_setting["items"].items() if weight]
|
output -= {item for item, weight in plando_setting[item_setting_key].items() if weight}
|
||||||
else:
|
else:
|
||||||
# Assume this is some other kind of iterable.
|
# Assume this is some other kind of iterable.
|
||||||
output -= plando_setting["items"]
|
output -= plando_setting[item_setting_key]
|
||||||
|
|
||||||
# Sort the output for consistency across versions if the implementation changes but the logic does not.
|
# Sort the output for consistency across versions if the implementation changes but the logic does not.
|
||||||
return sorted(output)
|
return sorted(output)
|
||||||
|
|
|
@ -157,7 +157,7 @@ class WitnessPlayerLogic:
|
||||||
if StaticWitnessLogic.all_items[item_name].category in [ItemCategory.DOOR, ItemCategory.LASER]:
|
if StaticWitnessLogic.all_items[item_name].category in [ItemCategory.DOOR, ItemCategory.LASER]:
|
||||||
panel_hexes = cast(DoorItemDefinition, StaticWitnessLogic.all_items[item_name]).panel_id_hexes
|
panel_hexes = cast(DoorItemDefinition, StaticWitnessLogic.all_items[item_name]).panel_id_hexes
|
||||||
for panel_hex in panel_hexes:
|
for panel_hex in panel_hexes:
|
||||||
if panel_hex in self.DOOR_ITEMS_BY_ID:
|
if panel_hex in self.DOOR_ITEMS_BY_ID and item_name in self.DOOR_ITEMS_BY_ID[panel_hex]:
|
||||||
self.DOOR_ITEMS_BY_ID[panel_hex].remove(item_name)
|
self.DOOR_ITEMS_BY_ID[panel_hex].remove(item_name)
|
||||||
|
|
||||||
if adj_type == "Starting Inventory":
|
if adj_type == "Starting Inventory":
|
||||||
|
|
Loading…
Reference in New Issue