Files
Grinch-AP/worlds/sm/Rules.py
Fabian Dill ecd2675ea8 Tests: check that Regions are reachable (#1034)
* Tests: check that Regions are reachable
try to prevent errors from unconnected/never reachable Regions

* Test region access (#1039)

* Tests: note oot's default unreachable regions

* [SM] Fixed failing testAllStateCanReachEverything (#1087)

* [SM] Fixed failing testAllStateCanReachEverything

- by adding exclusion for Regions used only when corresponding Starting Location is used
- by removing unnecessary VARIA Regions used only for EscapeRando (not supported in AP anyway)

* Update worlds/sm/Regions.py

Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>

* Update worlds/sm/Rules.py

Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>

* Update worlds/sm/Regions.py

Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>

Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>

* Update test/general/TestReachability.py

---------

Co-authored-by: espeon65536 <81029175+espeon65536@users.noreply.github.com>
Co-authored-by: lordlou <87331798+lordlou@users.noreply.github.com>
Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
2023-02-19 23:09:54 +01:00

42 lines
2.0 KiB
Python

from ..generic.Rules import set_rule, add_rule
from graph.vanilla.graph_locations import locationsDict
from graph.graph_utils import vanillaTransitions, getAccessPoint
from logic.logic import Logic
from rom.rom_patches import RomPatches
from utils.doorsmanager import DoorsManager
def evalSMBool(smbool, maxDiff):
return smbool.bool == True and smbool.difficulty <= maxDiff
def add_accessFrom_rule(location, player, accessFrom):
add_rule(location, lambda state: any((state.can_reach(accessName, player=player) and evalSMBool(rule(state.smbm[player]), state.smbm[player].maxDiff)) for accessName, rule in accessFrom.items()))
def add_postAvailable_rule(location, player, func):
add_rule(location, lambda state: evalSMBool(func(state.smbm[player]), state.smbm[player].maxDiff))
def set_available_rule(location, player, func):
set_rule(location, lambda state: evalSMBool(func(state.smbm[player]), state.smbm[player].maxDiff))
def set_entrance_rule(entrance, player, func):
set_rule(entrance, lambda state: evalSMBool(func(state.smbm[player]), state.smbm[player].maxDiff))
def add_entrance_rule(entrance, player, func):
add_rule(entrance, lambda state: evalSMBool(func(state.smbm[player]), state.smbm[player].maxDiff))
def set_rules(world, player):
world.completion_condition[player] = lambda state: state.has('Mother Brain', player)
for key, value in locationsDict.items():
location = world.get_location(key, player)
set_available_rule(location, player, value.Available)
if value.AccessFrom is not None:
add_accessFrom_rule(location, player, value.AccessFrom)
if value.PostAvailable is not None:
add_postAvailable_rule(location, player, value.PostAvailable)
for accessPoint in Logic.accessPoints:
if not accessPoint.Escape:
for key, value1 in accessPoint.intraTransitions.items():
set_entrance_rule(world.get_entrance(accessPoint.Name + "->" + key, player), player, value1)