Witness: Fix for Witness plando crashes. (#2092)

This commit is contained in:
blastron 2023-08-16 07:03:41 -07:00 committed by GitHub
parent be07634b15
commit e30f364bbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 4 deletions

View File

@ -234,6 +234,11 @@ class WitnessWorld(World):
return slot_data
def create_item(self, item_name: str) -> Item:
# If the player's plando options are malformed, the item_name parameter could be a dictionary containing the
# name of the item, rather than the item itself. This is a workaround to prevent a crash.
if type(item_name) is dict:
item_name = list(item_name.keys())[0]
# this conditional is purely for unit tests, which need to be able to create an item before generate_early
item_data: ItemData
if hasattr(self, 'items') and self.items and item_name in self.items.item_data:

View File

@ -219,17 +219,21 @@ class WitnessPlayerItems:
# regardless of whether or not they actually wind up being manually placed.
for plando_setting in self._world.plando_items[self._player_id]:
if plando_setting.get("from_pool", True):
for item_setting_key in (key for key in ["item", "items"] if key in plando_setting):
for item_setting_key in [key for key in ["item", "items"] if key in plando_setting]:
if type(plando_setting[item_setting_key]) is str:
output.remove(plando_setting[item_setting_key])
output -= {plando_setting[item_setting_key]}
elif type(plando_setting[item_setting_key]) is dict:
output -= {item for item, weight in plando_setting[item_setting_key].items() if weight}
else:
# Assume this is some other kind of iterable.
output -= plando_setting[item_setting_key]
for inner_item in plando_setting[item_setting_key]:
if type(inner_item) is str:
output -= {inner_item}
elif type(inner_item) is dict:
output -= {item for item, weight in inner_item.items() if weight}
# Sort the output for consistency across versions if the implementation changes but the logic does not.
return sorted(output)
return sorted(list(output))
def get_door_ids_in_pool(self) -> List[int]:
"""