From 3ec1e9184be981cb34fa6b981b3d2d66f451b737 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 15 Nov 2025 03:38:33 +0100 Subject: [PATCH] Core: Only error in playthrough generation if game is not beatable (#5430) * Core: Only error in playthrough generation if game is not beatable The current flow of accessibility works like this: ``` if fulfills_accessibility fails: if multiworld can be beaten: log a warning else: raise Exception if playthrough is enabled: if any progression items are not reachable: raise Exception ``` This means that if you do a generation where the game is beatable but some full players' items are not reachable, it doesn't crash on accessibility check, but then crashes on playthrough. This means that **whether it crashes depends on whether you have playthrough enabled or not**. Imo, erroring on something accessibility-related is outside of the scope of create_playthrough. Create_playthrough only needs to care about whether it can fulfill its own goal - Building a minimal playthrough to everyone's victory. The actual accessibility check should take care of the accessibility. * Reword * Simplify sentence --- BaseClasses.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index ee2f73ca51..4d88fde4f3 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1721,9 +1721,10 @@ class Spoiler: logging.debug('The following items could not be reached: %s', ['%s (Player %d) at %s (Player %d)' % ( location.item.name, location.item.player, location.name, location.player) for location in sphere_candidates]) - if any([multiworld.worlds[location.item.player].options.accessibility != 'minimal' for location in sphere_candidates]): - raise RuntimeError(f'Not all progression items reachable ({sphere_candidates}). ' - f'Something went terribly wrong here.') + if not multiworld.has_beaten_game(state): + raise RuntimeError("During playthrough generation, the game was determined to be unbeatable. " + "Something went terribly wrong here. " + f"Unreachable progression items: {sphere_candidates}") else: self.unreachables = sphere_candidates break