KH2: Add missing indirect conditions for Final region access (#3923)

* KH2: Add missing indirect conditions for Final region access

Entrances to the Final region require being able to reach any one of a
number of locations, but for a location to be reachable, its parent
region must also be reachable, so indirect conditions must be added for
these regions.

* Use World.get_location

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

* Use World.get_location, for real this time

---------

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
This commit is contained in:
Mysteryem 2024-12-03 01:51:10 +00:00 committed by GitHub
parent b6ab91fe4b
commit 81b9a53a37
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 13 additions and 0 deletions

View File

@ -355,6 +355,16 @@ class KH2FormRules(KH2Rules):
RegionName.Master: lambda state: self.multi_form_region_access(),
RegionName.Final: lambda state: self.final_form_region_access(state)
}
# Accessing Final requires being able to reach one of the locations in final_leveling_access, but reaching a
# location requires being able to reach the region the location is in, so an indirect condition is required.
# The access rules of each of the locations in final_leveling_access do not check for being able to reach other
# locations or other regions, so it is only the parent region of each location that needs to be added as an
# indirect condition.
self.form_region_indirect_condition_regions = {
RegionName.Final: {
self.world.get_location(location).parent_region for location in final_leveling_access
}
}
def final_form_region_access(self, state: CollectionState) -> bool:
"""
@ -388,12 +398,15 @@ class KH2FormRules(KH2Rules):
for region_name in drive_form_list:
if region_name == RegionName.Summon and not self.world.options.SummonLevelLocationToggle:
continue
indirect_condition_regions = self.form_region_indirect_condition_regions.get(region_name, ())
# could get the location of each of these, but I feel like that would be less optimal
region = self.multiworld.get_region(region_name, self.player)
# if region_name in form_region_rules
if region_name != RegionName.Summon:
for entrance in region.entrances:
entrance.access_rule = self.form_region_rules[region_name]
for indirect_condition_region in indirect_condition_regions:
self.multiworld.register_indirect_condition(indirect_condition_region, entrance)
for loc in region.locations:
loc.access_rule = self.form_rules[loc.name]