TUNIC: Error catching for logic bugs in ER (#3082)

This commit is contained in:
Scipio Wright 2024-04-13 18:20:52 -04:00 committed by GitHub
parent 11073dfdac
commit fbeba1e470
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 25 additions and 15 deletions

View File

@ -1,5 +1,5 @@
from typing import Dict, List, Any from typing import Dict, List, Any
from logging import warning
from BaseClasses import Region, Location, Item, Tutorial, ItemClassification from BaseClasses import Region, Location, Item, Tutorial, ItemClassification
from .items import item_name_to_id, item_table, item_name_groups, fool_tiers, filler_items, slot_data_item_names from .items import item_name_to_id, item_table, item_name_groups, fool_tiers, filler_items, slot_data_item_names
from .locations import location_table, location_name_groups, location_name_to_id, hexagon_locations from .locations import location_table, location_name_groups, location_name_to_id, hexagon_locations
@ -123,7 +123,7 @@ class TunicWorld(World):
# Filler items in the item pool # Filler items in the item pool
available_filler: List[str] = [filler for filler in items_to_create if items_to_create[filler] > 0 and available_filler: List[str] = [filler for filler in items_to_create if items_to_create[filler] > 0 and
item_table[filler].classification == ItemClassification.filler] item_table[filler].classification == ItemClassification.filler]
# Remove filler to make room for other items # Remove filler to make room for other items
def remove_filler(amount: int): def remove_filler(amount: int):
for _ in range(0, amount): for _ in range(0, amount):
@ -150,7 +150,7 @@ class TunicWorld(World):
hexagon_goal = self.options.hexagon_goal hexagon_goal = self.options.hexagon_goal
extra_hexagons = self.options.extra_hexagon_percentage extra_hexagons = self.options.extra_hexagon_percentage
items_to_create[gold_hexagon] += int((Decimal(100 + extra_hexagons) / 100 * hexagon_goal).to_integral_value(rounding=ROUND_HALF_UP)) items_to_create[gold_hexagon] += int((Decimal(100 + extra_hexagons) / 100 * hexagon_goal).to_integral_value(rounding=ROUND_HALF_UP))
# Replace pages and normal hexagons with filler # Replace pages and normal hexagons with filler
for replaced_item in list(filter(lambda item: "Pages" in item or item in hexagon_locations, items_to_create)): for replaced_item in list(filter(lambda item: "Pages" in item or item in hexagon_locations, items_to_create)):
filler_name = self.get_filler_item_name() filler_name = self.get_filler_item_name()
@ -184,7 +184,7 @@ class TunicWorld(World):
self.tunic_portal_pairs = {} self.tunic_portal_pairs = {}
self.er_portal_hints = {} self.er_portal_hints = {}
self.ability_unlocks = randomize_ability_unlocks(self.random, self.options) self.ability_unlocks = randomize_ability_unlocks(self.random, self.options)
# stuff for universal tracker support, can be ignored for standard gen # stuff for universal tracker support, can be ignored for standard gen
if hasattr(self.multiworld, "re_gen_passthrough"): if hasattr(self.multiworld, "re_gen_passthrough"):
if "TUNIC" in self.multiworld.re_gen_passthrough: if "TUNIC" in self.multiworld.re_gen_passthrough:
@ -245,17 +245,27 @@ class TunicWorld(World):
continue continue
path_to_loc = [] path_to_loc = []
previous_name = "placeholder" previous_name = "placeholder"
name, connection = paths[location.parent_region] try:
while connection != ("Menu", None): name, connection = paths[location.parent_region]
name, connection = connection except KeyError:
# for LS entrances, we just want to give the portal name # logic bug, proceed with warning since it takes a long time to update AP
if "(LS)" in name: warning(f"{location.name} is not logically accessible for "
name, _ = name.split(" (LS) ") f"{self.multiworld.get_file_safe_player_name(self.player)}. "
# was getting some cases like Library Grave -> Library Grave -> other place "Creating entrance hint Inaccessible. "
if name in portal_names and name != previous_name: "Please report this to the TUNIC rando devs.")
previous_name = name hint_text = "Inaccessible"
path_to_loc.append(name) else:
hint_text = " -> ".join(reversed(path_to_loc)) while connection != ("Menu", None):
name, connection = connection
# for LS entrances, we just want to give the portal name
if "(LS)" in name:
name, _ = name.split(" (LS) ")
# was getting some cases like Library Grave -> Library Grave -> other place
if name in portal_names and name != previous_name:
previous_name = name
path_to_loc.append(name)
hint_text = " -> ".join(reversed(path_to_loc))
if hint_text: if hint_text:
hint_data[self.player][location.address] = hint_text hint_data[self.player][location.address] = hint_text