Skip to content

Commit aca96f3

Browse files
authored
Merge pull request #27 from ManualForArchipelago/entrance_rules
New regions.json key: `entrance_rules`. Allows you to make entering a region cost different things based on where you're coming from.
2 parents 876b164 + a9e6d35 commit aca96f3

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

schemas/Manual.regions.schema.json

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,32 @@
3939
"type":"boolean",
4040
"default": false
4141
},
42+
"exit_requires": {
43+
"description": "(Optional) Additional requirements to use a specific connection out of this region.",
44+
"type": "object",
45+
"patternProperties": {
46+
"^[^$].*$": {
47+
"type": ["string", "array"],
48+
"items": {
49+
"$ref": "#/definitions/Require"
50+
}
51+
}
52+
},
53+
"uniqueItems": true
54+
},
55+
"entrance_requires": {
56+
"description": "(Optional) Additional requirements to use a specific connection into this region. This is the same as exit_requires, but from the other side.",
57+
"type": "object",
58+
"patternProperties": {
59+
"^[^$].*$": {
60+
"type": ["string", "array"],
61+
"items": {
62+
"$ref": "#/definitions/Require"
63+
}
64+
}
65+
},
66+
"uniqueItems": true
67+
},
4268
"_comment": {"$ref": "#/definitions/comment"}
4369
}
4470
}
@@ -69,4 +95,4 @@
6995
}
7096
}
7197
}
72-
}
98+
}

src/Rules.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from typing import TYPE_CHECKING, Optional
2-
from worlds.generic.Rules import set_rule
2+
from worlds.generic.Rules import set_rule, add_rule
33
from .Regions import regionMap
44
from .hooks import Rules
55
from BaseClasses import MultiWorld, CollectionState
@@ -234,7 +234,15 @@ def fullLocationOrRegionCheck(state: CollectionState, area: dict):
234234
def fullRegionCheck(state: CollectionState, region=regionMap[region]):
235235
return fullLocationOrRegionCheck(state, region)
236236

237-
set_rule(multiworld.get_entrance(exitRegion.name, player), fullRegionCheck)
237+
add_rule(world.get_entrance(exitRegion.name), fullRegionCheck)
238+
entrance_rules = regionMap[region].get("entrance_requires", {})
239+
for e in entrance_rules:
240+
entrance = world.get_entrance(f'{e}To{region}')
241+
add_rule(entrance, lambda state, rule={"requires": entrance_rules[e]}: fullLocationOrRegionCheck(state, rule))
242+
exit_rules = regionMap[region].get("exit_requires", {})
243+
for e in exit_rules:
244+
exit = world.get_entrance(f'{region}To{e}')
245+
add_rule(exit, lambda state, rule={"requires": exit_rules[e]}: fullLocationOrRegionCheck(state, rule))
238246

239247
# Location access rules
240248
for location in world.location_table:

src/data/regions.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
},
77
"Second Region": {
88
"requires": "|@Characters:1|",
9+
"connects_to": ["Third Region"],
10+
"exit_requires": {
11+
"Third Region": "|@Characters:5|"
12+
}
13+
},
14+
"Third Region": {
915
"connects_to": []
1016
}
11-
}
17+
}

0 commit comments

Comments
 (0)