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:
parent
b6ab91fe4b
commit
81b9a53a37
|
@ -355,6 +355,16 @@ class KH2FormRules(KH2Rules):
|
||||||
RegionName.Master: lambda state: self.multi_form_region_access(),
|
RegionName.Master: lambda state: self.multi_form_region_access(),
|
||||||
RegionName.Final: lambda state: self.final_form_region_access(state)
|
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:
|
def final_form_region_access(self, state: CollectionState) -> bool:
|
||||||
"""
|
"""
|
||||||
|
@ -388,12 +398,15 @@ class KH2FormRules(KH2Rules):
|
||||||
for region_name in drive_form_list:
|
for region_name in drive_form_list:
|
||||||
if region_name == RegionName.Summon and not self.world.options.SummonLevelLocationToggle:
|
if region_name == RegionName.Summon and not self.world.options.SummonLevelLocationToggle:
|
||||||
continue
|
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
|
# 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)
|
region = self.multiworld.get_region(region_name, self.player)
|
||||||
# if region_name in form_region_rules
|
# if region_name in form_region_rules
|
||||||
if region_name != RegionName.Summon:
|
if region_name != RegionName.Summon:
|
||||||
for entrance in region.entrances:
|
for entrance in region.entrances:
|
||||||
entrance.access_rule = self.form_region_rules[region_name]
|
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:
|
for loc in region.locations:
|
||||||
loc.access_rule = self.form_rules[loc.name]
|
loc.access_rule = self.form_rules[loc.name]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue