2023-04-08 20:52:34 +00:00
|
|
|
from worlds.generic.Rules import set_rule, add_rule
|
2021-11-12 13:00:11 +00:00
|
|
|
|
2023-04-08 20:52:34 +00:00
|
|
|
from .variaRandomizer.graph.vanilla.graph_locations import locationsDict
|
|
|
|
from .variaRandomizer.logic.logic import Logic
|
2021-11-12 13:00:11 +00:00
|
|
|
|
|
|
|
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:
|
2023-02-19 22:09:54 +00:00
|
|
|
if not accessPoint.Escape:
|
|
|
|
for key, value1 in accessPoint.intraTransitions.items():
|
|
|
|
set_entrance_rule(world.get_entrance(accessPoint.Name + "->" + key, player), player, value1)
|