OoT Entrance Randomizer (#125)

Add options:
    "shuffle_grotto_entrances": GrottoEntrances,
    "shuffle_dungeon_entrances": DungeonEntrances,
    "owl_drops": OwlDrops,
    "warp_songs": WarpSongs,
    "spawn_positions": SpawnPositions,
Add Logic Trick:
    "Skip King Zora as Adult with Nothing"
This commit is contained in:
espeon65536
2021-11-11 04:42:08 -05:00
committed by GitHub
parent 80c86f34a4
commit 8eb1f0258c
9 changed files with 949 additions and 34 deletions

View File

@@ -2,6 +2,7 @@ from collections import deque
import logging
from .SaveContext import SaveContext
from .Regions import TimeOfDay
from BaseClasses import CollectionState
from worlds.generic.Rules import set_rule, add_rule, add_item_rule, forbid_item
@@ -42,6 +43,36 @@ class OOTLogic(LogicMixin):
return can_reach
return self.age[player] == age
def _oot_reach_at_time(self, regionname, tod, already_checked, player):
name_map = {
TimeOfDay.DAY: self.day_reachable_regions[player],
TimeOfDay.DAMPE: self.dampe_reachable_regions[player],
TimeOfDay.ALL: self.day_reachable_regions[player].intersection(self.dampe_reachable_regions[player])
}
if regionname in name_map[tod]:
return True
region = self.world.get_region(regionname, player)
if region.provides_time == TimeOfDay.ALL or regionname == 'Root':
self.day_reachable_regions[player].add(regionname)
self.dampe_reachable_regions[player].add(regionname)
return True
if region.provides_time == TimeOfDay.DAMPE:
self.dampe_reachable_regions[player].add(regionname)
return tod == TimeOfDay.DAMPE
for entrance in region.entrances:
if entrance.parent_region.name in already_checked:
continue
if self._oot_reach_at_time(entrance.parent_region.name, tod, already_checked + [regionname], player):
if tod == TimeOfDay.DAY:
self.day_reachable_regions[player].add(regionname)
elif tod == TimeOfDay.DAMPE:
self.dampe_reachable_regions[player].add(regionname)
elif tod == TimeOfDay.ALL:
self.day_reachable_regions[player].add(regionname)
self.dampe_reachable_regions[player].add(regionname)
return True
return False
# Store the age before calling this!
def _oot_update_age_reachable_regions(self, player):
self.stale[player] = False
@@ -62,6 +93,8 @@ class OOTLogic(LogicMixin):
while queue:
connection = queue.popleft()
new_region = connection.connected_region
if new_region is None:
continue
if new_region in rrp:
bc.remove(connection)
elif connection.can_reach(self):