Add Ori and the Blind Forest

TODO: Mapstone counting, Open, OpenWorld, connection rules, goals
This commit is contained in:
Fabian Dill 2021-07-16 12:41:37 +02:00
parent 20b173453d
commit 5c8a076790
8 changed files with 673 additions and 0 deletions

10
worlds/oribf/Items.py Normal file
View File

@ -0,0 +1,10 @@
# generated by https://github.com/Berserker66/ori_rando_server
# do not edit manually
from typing import Dict
item_table: Dict[str, int] = \
{'EX100': 262144, 'AC': 262145, 'Bash': 262146, 'HC': 262147, 'Plant': 262148, 'MapStone': 262149, 'ChargeFlame': 262150, 'ChargeJump': 262151, 'Climb': 262152, 'MS': 262153, 'Dash': 262154, 'EC': 262155, 'EX200': 262156, 'DoubleJump': 262157, 'EX15': 262158, 'Wind': 262159, 'KS': 262160, 'Water': 262161, 'Glide': 262162, 'Grenade': 262163, 'ForlornKey': 262164, 'CS': 262165, 'Stomp': 262166, 'HoruKey': 262167, 'WallJump': 262168, 'GinsoKey': 262169}
default_pool: Dict[str, int] = \
{'EX100': 53, 'AC': 33, 'Bash': 1, 'HC': 12, 'Plant': 24, 'MapStone': 9, 'ChargeFlame': 1, 'ChargeJump': 1, 'Climb': 1, 'MS': 9, 'Dash': 1, 'EC': 14, 'EX200': 29, 'DoubleJump': 1, 'EX15': 6, 'Wind': 1, 'KS': 40, 'Water': 1, 'Glide': 1, 'Grenade': 1, 'ForlornKey': 1, 'CS': 8, 'Stomp': 1, 'HoruKey': 1, 'WallJump': 1, 'GinsoKey': 1}

262
worlds/oribf/Locations.py Normal file
View File

@ -0,0 +1,262 @@
# generated by https://github.com/Berserker66/ori_rando_server
# do not edit manually
from .Types import *
locations_data = \
{'AboveChargeFlameTreeExp': Location(code=262144, vanilla_item='EX100'),
'AboveChargeJumpAbilityCell': Location(code=262145, vanilla_item='AC'),
'AboveFourthHealth': Location(code=262146, vanilla_item='AC'),
'AboveGrottoTeleporterExp': Location(code=262147, vanilla_item='EX100'),
'BashAreaExp': Location(code=262148, vanilla_item='EX100'),
'BashSkillTree': Location(code=262149, vanilla_item='SKBash'),
'BelowGrottoTeleporterHealthCell': Location(code=262150, vanilla_item='HC'),
'BelowGrottoTeleporterPlant': Location(code=262151, vanilla_item='Plant'),
'BlackrootBoulderExp': Location(code=262152, vanilla_item='EX100'),
'BlackrootMap': Location(code=262153, vanilla_item='MapStone'),
'BlackrootTeleporterHealthCell': Location(code=262154, vanilla_item='HC'),
'ChargeFlameAreaExp': Location(code=262155, vanilla_item='EX100'),
'ChargeFlameAreaPlant': Location(code=262156, vanilla_item='Plant'),
'ChargeFlameSkillTree': Location(code=262157, vanilla_item='SKChargeFlame'),
'ChargeJumpSkillTree': Location(code=262158, vanilla_item='SKChargeJump'),
'ClimbSkillTree': Location(code=262159, vanilla_item='SKClimb'),
'DashAreaAbilityCell': Location(code=262160, vanilla_item='AC'),
'DashAreaMapstone': Location(code=262161, vanilla_item='MS'),
'DashAreaOrbRoomExp': Location(code=262162, vanilla_item='EX100'),
'DashAreaPlant': Location(code=262163, vanilla_item='Plant'),
'DashAreaRoofExp': Location(code=262164, vanilla_item='EX100'),
'DashSkillTree': Location(code=262165, vanilla_item='SKDash'),
'DeathGauntletEnergyCell': Location(code=262166, vanilla_item='EC'),
'DeathGauntletExp': Location(code=262167, vanilla_item='EX100'),
'DeathGauntletRoofHealthCell': Location(code=262168, vanilla_item='HC'),
'DeathGauntletRoofPlant': Location(code=262169, vanilla_item='Plant'),
'DeathGauntletStompSwim': Location(code=262170, vanilla_item='EX200'),
'DeathGauntletSwimEnergyDoor': Location(code=262171, vanilla_item='AC'),
'DoorWarpExp': Location(code=262172, vanilla_item='EX200'),
'DoubleJumpAreaExp': Location(code=262173, vanilla_item='EX100'),
'DoubleJumpSkillTree': Location(code=262174, vanilla_item='SKDoubleJump'),
'FarLeftGumoHideoutExp': Location(code=262175, vanilla_item='EX100'),
'FirstPickup': Location(code=262176, vanilla_item='EX15'),
'ForlornEntranceExp': Location(code=262177, vanilla_item='EX200'),
'ForlornEscape': Location(code=262178, vanilla_item='EVWind'),
'ForlornHiddenSpiderExp': Location(code=262179, vanilla_item='EX100'),
'ForlornKeystone1': Location(code=262180, vanilla_item='KS'),
'ForlornKeystone2': Location(code=262181, vanilla_item='KS'),
'ForlornKeystone3': Location(code=262182, vanilla_item='KS'),
'ForlornKeystone4': Location(code=262183, vanilla_item='KS'),
'ForlornMap': Location(code=262184, vanilla_item='MapStone'),
'ForlornPlant': Location(code=262185, vanilla_item='Plant'),
'FourthHealthCell': Location(code=262186, vanilla_item='HC'),
'FronkeyFight': Location(code=262187, vanilla_item='EX15'),
'FronkeyWalkRoof': Location(code=262188, vanilla_item='EX200'),
'GinsoEscapeExit': Location(code=262189, vanilla_item='EVWater'),
'GinsoEscapeHangingExp': Location(code=262190, vanilla_item='EX100'),
'GinsoEscapeJumpPadExp': Location(code=262191, vanilla_item='EX100'),
'GinsoEscapeProjectileExp': Location(code=262192, vanilla_item='EX100'),
'GinsoEscapeSpiderExp': Location(code=262193, vanilla_item='EX200'),
'GladesGrenadePool': Location(code=262194, vanilla_item='EX200'),
'GladesGrenadeTree': Location(code=262195, vanilla_item='AC'),
'GladesKeystone1': Location(code=262196, vanilla_item='KS'),
'GladesKeystone2': Location(code=262197, vanilla_item='KS'),
'GladesLaser': Location(code=262198, vanilla_item='EC'),
'GladesLaserGrenade': Location(code=262199, vanilla_item='AC'),
'GladesMainPool': Location(code=262200, vanilla_item='EX100'),
'GladesMainPoolDeep': Location(code=262201, vanilla_item='EC'),
'GladesMap': Location(code=262202, vanilla_item='MapStone'),
'GladesMapKeystone': Location(code=262203, vanilla_item='KS'),
'GlideSkillFeather': Location(code=262204, vanilla_item='SKGlide'),
'GrenadeAreaAbilityCell': Location(code=262205, vanilla_item='AC'),
'GrenadeAreaExp': Location(code=262206, vanilla_item='EX100'),
'GrenadeSkillTree': Location(code=262207, vanilla_item='SKGrenade'),
'GrottoEnergyDoorHealthCell': Location(code=262208, vanilla_item='HC'),
'GrottoEnergyDoorSwim': Location(code=262209, vanilla_item='EX100'),
'GrottoHideoutFallAbilityCell': Location(code=262210, vanilla_item='AC'),
'GrottoLasersRoofExp': Location(code=262211, vanilla_item='EX100'),
'GrottoSwampDrainAccessExp': Location(code=262212, vanilla_item='EX100'),
'GrottoSwampDrainAccessPlant': Location(code=262213, vanilla_item='Plant'),
'GroveAboveSpiderWaterEnergyCell': Location(code=262214, vanilla_item='EC'),
'GroveAboveSpiderWaterExp': Location(code=262215, vanilla_item='EX200'),
'GroveAboveSpiderWaterHealthCell': Location(code=262216, vanilla_item='HC'),
'GroveSpiderWaterSwim': Location(code=262217, vanilla_item='EX100'),
'GroveWaterStompAbilityCell': Location(code=262218, vanilla_item='AC'),
'GumoHideoutCrusherExp': Location(code=262219, vanilla_item='EX100'),
'GumoHideoutCrusherKeystone': Location(code=262220, vanilla_item='KS'),
'GumoHideoutEnergyCell': Location(code=262221, vanilla_item='EC'),
'GumoHideoutLeftHangingExp': Location(code=262222, vanilla_item='EX15'),
'GumoHideoutMap': Location(code=262223, vanilla_item='MapStone'),
'GumoHideoutMapstone': Location(code=262224, vanilla_item='MS'),
'GumoHideoutMiniboss': Location(code=262225, vanilla_item='KS'),
'GumoHideoutRedirectAbilityCell': Location(code=262226, vanilla_item='AC'),
'GumoHideoutRedirectEnergyCell': Location(code=262227, vanilla_item='EC'),
'GumoHideoutRedirectExp': Location(code=262228, vanilla_item='EX200'),
'GumoHideoutRedirectPlant': Location(code=262229, vanilla_item='Plant'),
'GumoHideoutRightHangingExp': Location(code=262230, vanilla_item='EX15'),
'GumoHideoutRockfallExp': Location(code=262231, vanilla_item='EX100'),
'GumonSeal': Location(code=262232, vanilla_item='EVForlornKey'),
'HollowGroveMap': Location(code=262233, vanilla_item='MapStone'),
'HollowGroveMapPlant': Location(code=262234, vanilla_item='Plant'),
'HollowGroveMapstone': Location(code=262235, vanilla_item='MS'),
'HollowGroveTreeAbilityCell': Location(code=262236, vanilla_item='AC'),
'HollowGroveTreePlant': Location(code=262237, vanilla_item='Plant'),
'HoruFieldsAbilityCell': Location(code=262238, vanilla_item='AC'),
'HoruFieldsEnergyCell': Location(code=262239, vanilla_item='EC'),
'HoruFieldsHealthCell': Location(code=262240, vanilla_item='HC'),
'HoruFieldsHiddenExp': Location(code=262241, vanilla_item='EX200'),
'HoruFieldsPlant': Location(code=262242, vanilla_item='Plant'),
'HoruL1': Location(code=262243, vanilla_item='CS'),
'HoruL2': Location(code=262244, vanilla_item='CS'),
'HoruL3': Location(code=262245, vanilla_item='CS'),
'HoruL4': Location(code=262246, vanilla_item='CS'),
'HoruL4ChaseExp': Location(code=262247, vanilla_item='EX200'),
'HoruL4LowerExp': Location(code=262248, vanilla_item='EX200'),
'HoruLavaDrainedLeftExp': Location(code=262249, vanilla_item='EX200'),
'HoruLavaDrainedRightExp': Location(code=262250, vanilla_item='EX200'),
'HoruMap': Location(code=262251, vanilla_item='MapStone'),
'HoruR1': Location(code=262252, vanilla_item='CS'),
'HoruR1EnergyCell': Location(code=262253, vanilla_item='EC'),
'HoruR1HangingExp': Location(code=262254, vanilla_item='EX100'),
'HoruR1Mapstone': Location(code=262255, vanilla_item='MS'),
'HoruR2': Location(code=262256, vanilla_item='CS'),
'HoruR3': Location(code=262257, vanilla_item='CS'),
'HoruR3Plant': Location(code=262258, vanilla_item='Plant'),
'HoruR4': Location(code=262259, vanilla_item='CS'),
'HoruR4DrainedExp': Location(code=262260, vanilla_item='EX200'),
'HoruR4LaserExp': Location(code=262261, vanilla_item='EX200'),
'HoruR4StompExp': Location(code=262262, vanilla_item='EX200'),
'HoruTeleporterExp': Location(code=262263, vanilla_item='EX200'),
'IcelessExp': Location(code=262264, vanilla_item='EX100'),
'InnerSwampDrainExp': Location(code=262265, vanilla_item='EX100'),
'InnerSwampEnergyCell': Location(code=262266, vanilla_item='EC'),
'InnerSwampHiddenSwimExp': Location(code=262267, vanilla_item='EX100'),
'InnerSwampStompExp': Location(code=262268, vanilla_item='EX100'),
'InnerSwampSwimLeftKeystone': Location(code=262269, vanilla_item='KS'),
'InnerSwampSwimMapstone': Location(code=262270, vanilla_item='MS'),
'InnerSwampSwimRightKeystone': Location(code=262271, vanilla_item='KS'),
'KuroPerchExp': Location(code=262272, vanilla_item='EX200'),
'LeftGladesExp': Location(code=262273, vanilla_item='EX15'),
'LeftGladesHiddenExp': Location(code=262274, vanilla_item='EX15'),
'LeftGladesKeystone': Location(code=262275, vanilla_item='KS'),
'LeftGladesMapstone': Location(code=262276, vanilla_item='MS'),
'LeftGrottoTeleporterExp': Location(code=262277, vanilla_item='EX200'),
'LeftGumoHideoutExp': Location(code=262278, vanilla_item='EX100'),
'LeftGumoHideoutHealthCell': Location(code=262279, vanilla_item='HC'),
'LeftGumoHideoutLowerPlant': Location(code=262280, vanilla_item='Plant'),
'LeftGumoHideoutSwim': Location(code=262281, vanilla_item='EX100'),
'LeftGumoHideoutUpperPlant': Location(code=262282, vanilla_item='Plant'),
'LeftSorrowAbilityCell': Location(code=262283, vanilla_item='AC'),
'LeftSorrowEnergyCell': Location(code=262284, vanilla_item='EC'),
'LeftSorrowGrenade': Location(code=262285, vanilla_item='EX200'),
'LeftSorrowKeystone1': Location(code=262286, vanilla_item='KS'),
'LeftSorrowKeystone2': Location(code=262287, vanilla_item='KS'),
'LeftSorrowKeystone3': Location(code=262288, vanilla_item='KS'),
'LeftSorrowKeystone4': Location(code=262289, vanilla_item='KS'),
'LeftSorrowPlant': Location(code=262290, vanilla_item='Plant'),
'LostGroveAbilityCell': Location(code=262291, vanilla_item='AC'),
'LostGroveHiddenExp': Location(code=262292, vanilla_item='EX100'),
'LostGroveLongSwim': Location(code=262293, vanilla_item='AC'),
'LostGroveTeleporter': Location(code=262294, vanilla_item='EX100'),
'LowerBlackrootAbilityCell': Location(code=262295, vanilla_item='AC'),
'LowerBlackrootGrenadeThrow': Location(code=262296, vanilla_item='AC'),
'LowerBlackrootLaserAbilityCell': Location(code=262297, vanilla_item='AC'),
'LowerBlackrootLaserExp': Location(code=262298, vanilla_item='EX100'),
'LowerGinsoHiddenExp': Location(code=262299, vanilla_item='EX100'),
'LowerGinsoKeystone1': Location(code=262300, vanilla_item='KS'),
'LowerGinsoKeystone2': Location(code=262301, vanilla_item='KS'),
'LowerGinsoKeystone3': Location(code=262302, vanilla_item='KS'),
'LowerGinsoKeystone4': Location(code=262303, vanilla_item='KS'),
'LowerGinsoPlant': Location(code=262304, vanilla_item='Plant'),
'LowerValleyExp': Location(code=262305, vanilla_item='EX100'),
'LowerValleyMapstone': Location(code=262306, vanilla_item='MS'),
'MistyAbilityCell': Location(code=262307, vanilla_item='AC'),
'MistyEntranceStompExp': Location(code=262308, vanilla_item='EX100'),
'MistyEntranceTreeExp': Location(code=262309, vanilla_item='EX100'),
'MistyFrogNookExp': Location(code=262310, vanilla_item='EX100'),
'MistyGrenade': Location(code=262311, vanilla_item='EX200'),
'MistyKeystone1': Location(code=262312, vanilla_item='KS'),
'MistyKeystone2': Location(code=262313, vanilla_item='KS'),
'MistyKeystone3': Location(code=262314, vanilla_item='KS'),
'MistyKeystone4': Location(code=262315, vanilla_item='KS'),
'MistyMortarCorridorHiddenExp': Location(code=262316, vanilla_item='EX100'),
'MistyMortarCorridorUpperExp': Location(code=262317, vanilla_item='EX100'),
'MistyPlant': Location(code=262318, vanilla_item='Plant'),
'MistyPostClimbAboveSpikePit': Location(code=262319, vanilla_item='EX200'),
'MistyPostClimbSpikeCave': Location(code=262320, vanilla_item='EX100'),
'MoonGrottoStompPlant': Location(code=262321, vanilla_item='Plant'),
'OuterSwampAbilityCell': Location(code=262322, vanilla_item='AC'),
'OuterSwampGrenadeExp': Location(code=262323, vanilla_item='EX200'),
'OuterSwampHealthCell': Location(code=262324, vanilla_item='HC'),
'OuterSwampMortarAbilityCell': Location(code=262325, vanilla_item='AC'),
'OuterSwampMortarPlant': Location(code=262326, vanilla_item='Plant'),
'OuterSwampStompExp': Location(code=262327, vanilla_item='EX100'),
'OutsideForlornCliffExp': Location(code=262328, vanilla_item='EX200'),
'OutsideForlornTreeExp': Location(code=262329, vanilla_item='EX100'),
'OutsideForlornWaterExp': Location(code=262330, vanilla_item='EX100'),
'RazielNo': Location(code=262331, vanilla_item='EX100'),
'RightForlornHealthCell': Location(code=262332, vanilla_item='HC'),
'RightForlornPlant': Location(code=262333, vanilla_item='Plant'),
'SorrowEntranceAbilityCell': Location(code=262334, vanilla_item='AC'),
'SorrowHealthCell': Location(code=262335, vanilla_item='HC'),
'SorrowHiddenKeystone': Location(code=262336, vanilla_item='KS'),
'SorrowLowerLeftKeystone': Location(code=262337, vanilla_item='KS'),
'SorrowMainShaftKeystone': Location(code=262338, vanilla_item='KS'),
'SorrowMap': Location(code=262339, vanilla_item='MapStone'),
'SorrowMapstone': Location(code=262340, vanilla_item='MS'),
'SorrowSpikeKeystone': Location(code=262341, vanilla_item='KS'),
'SpiderSacEnergyCell': Location(code=262342, vanilla_item='EC'),
'SpiderSacEnergyDoor': Location(code=262343, vanilla_item='AC'),
'SpiderSacGrenadeDoor': Location(code=262344, vanilla_item='AC'),
'SpiderSacHealthCell': Location(code=262345, vanilla_item='HC'),
'SpiritCavernsAbilityCell': Location(code=262346, vanilla_item='AC'),
'SpiritCavernsKeystone1': Location(code=262347, vanilla_item='KS'),
'SpiritCavernsKeystone2': Location(code=262348, vanilla_item='KS'),
'SpiritCavernsTopLeftKeystone': Location(code=262349, vanilla_item='KS'),
'SpiritCavernsTopRightKeystone': Location(code=262350, vanilla_item='KS'),
'StompAreaExp': Location(code=262351, vanilla_item='EX100'),
'StompAreaGrenadeExp': Location(code=262352, vanilla_item='EX200'),
'StompAreaRoofExp': Location(code=262353, vanilla_item='EX200'),
'StompSkillTree': Location(code=262354, vanilla_item='SKStomp'),
'Sunstone': Location(code=262355, vanilla_item='EVHoruKey'),
'SunstonePlant': Location(code=262356, vanilla_item='Plant'),
'SwampEntranceAbilityCell': Location(code=262357, vanilla_item='AC'),
'SwampEntrancePlant': Location(code=262358, vanilla_item='Plant'),
'SwampEntranceSwim': Location(code=262359, vanilla_item='EX200'),
'SwampMap': Location(code=262360, vanilla_item='MapStone'),
'SwampTeleporterAbilityCell': Location(code=262361, vanilla_item='AC'),
'TopGinsoLeftLowerExp': Location(code=262362, vanilla_item='EX100'),
'TopGinsoLeftUpperExp': Location(code=262363, vanilla_item='EX100'),
'TopGinsoRightPlant': Location(code=262364, vanilla_item='Plant'),
'UpperGinsoEnergyCell': Location(code=262365, vanilla_item='EC'),
'UpperGinsoLowerKeystone': Location(code=262366, vanilla_item='KS'),
'UpperGinsoRedirectLowerExp': Location(code=262367, vanilla_item='EX100'),
'UpperGinsoRedirectUpperExp': Location(code=262368, vanilla_item='EX100'),
'UpperGinsoRightKeystone': Location(code=262369, vanilla_item='KS'),
'UpperGinsoUpperLeftKeystone': Location(code=262370, vanilla_item='KS'),
'UpperGinsoUpperRightKeystone': Location(code=262371, vanilla_item='KS'),
'UpperSorrowFarLeftKeystone': Location(code=262372, vanilla_item='KS'),
'UpperSorrowFarRightKeystone': Location(code=262373, vanilla_item='KS'),
'UpperSorrowLeftKeystone': Location(code=262374, vanilla_item='KS'),
'UpperSorrowRightKeystone': Location(code=262375, vanilla_item='KS'),
'UpperSorrowSpikeExp': Location(code=262376, vanilla_item='EX100'),
'ValleyEntryAbilityCell': Location(code=262377, vanilla_item='AC'),
'ValleyEntryGrenadeLongSwim': Location(code=262378, vanilla_item='EC'),
'ValleyEntryTreeExp': Location(code=262379, vanilla_item='EX100'),
'ValleyEntryTreePlant': Location(code=262380, vanilla_item='Plant'),
'ValleyForlornApproachGrenade': Location(code=262381, vanilla_item='AC'),
'ValleyForlornApproachMapstone': Location(code=262382, vanilla_item='MS'),
'ValleyMainFACS': Location(code=262383, vanilla_item='AC'),
'ValleyMainPlant': Location(code=262384, vanilla_item='Plant'),
'ValleyMap': Location(code=262385, vanilla_item='MapStone'),
'ValleyRightBirdStompCell': Location(code=262386, vanilla_item='AC'),
'ValleyRightExp': Location(code=262387, vanilla_item='EX100'),
'ValleyRightFastStomplessCell': Location(code=262388, vanilla_item='AC'),
'ValleyRightSwimExp': Location(code=262389, vanilla_item='EX100'),
'ValleyThreeBirdAbilityCell': Location(code=262390, vanilla_item='AC'),
'WallJumpAreaEnergyCell': Location(code=262391, vanilla_item='EC'),
'WallJumpAreaExp': Location(code=262392, vanilla_item='EX200'),
'WallJumpSkillTree': Location(code=262393, vanilla_item='SKWallJump'),
'WaterVein': Location(code=262394, vanilla_item='EVGinsoKey'),
'WilhelmExp': Location(code=262395, vanilla_item='EX200')}
lookup_name_to_id = {location_name: location_data.code for location_name, location_data in locations_data.items()}

12
worlds/oribf/Options.py Normal file
View File

@ -0,0 +1,12 @@
from .RulesData import location_rules
from Options import Toggle
options = {
"open" : Toggle,
"openworld": Toggle
}
for logic_set in location_rules:
if logic_set != "casual-core":
options[logic_set.replace("-", "_")] = Toggle

251
worlds/oribf/Regions.py Normal file
View File

@ -0,0 +1,251 @@
# generated by https://github.com/Berserker66/ori_rando_server
# do not edit manually
locations_by_region = \
{'AboveChargeJumpArea': {'AboveChargeJumpAbilityCell'}, 'BashTree': {'BashAreaExp', 'BashSkillTree'},
'BashTreeDoorClosed': set(), 'BashTreeDoorOpened': set(), 'BelowSunstoneArea': set(),
'BlackrootDarknessRoom': {'DashAreaOrbRoomExp', 'DashAreaAbilityCell', 'DashAreaRoofExp'},
'BlackrootGrottoConnection': {'BlackrootBoulderExp', 'BlackrootMap', 'BlackrootTeleporterHealthCell'},
'ChargeFlameAreaPlantAccess': {'ChargeFlameAreaPlant'}, 'ChargeFlameAreaStump': set(),
'ChargeFlameSkillTreeChamber': {'ChargeFlameSkillTree'}, 'ChargeJumpArea': {'ChargeJumpSkillTree'},
'ChargeJumpDoor': set(), 'ChargeJumpDoorOpen': set(),
'ChargeJumpDoorOpenLeft': {'UpperSorrowSpikeExp', 'UpperSorrowRightKeystone', 'UpperSorrowLeftKeystone',
'UpperSorrowFarRightKeystone', 'UpperSorrowFarLeftKeystone'},
'DashArea': {'DashAreaMapstone', 'DashSkillTree'}, 'DashPlantAccess': {'DashAreaPlant'},
'DeathGauntlet': {'DeathGauntletEnergyCell', 'DeathGauntletStompSwim', 'DeathGauntletExp'},
'DeathGauntletDoor': set(), 'DeathGauntletDoorOpened': set(), 'DeathGauntletMoat': {'DeathGauntletSwimEnergyDoor'},
'DeathGauntletRoof': {'DeathGauntletRoofHealthCell'}, 'DeathGauntletRoofPlantAccess': {'DeathGauntletRoofPlant'},
'DoubleJumpKeyDoor': set(), 'DoubleJumpKeyDoorOpened': {'DoubleJumpSkillTree', 'DoubleJumpAreaExp'},
'ForlornGravityRoom': {'ForlornKeystone2', 'ForlornHiddenSpiderExp', 'ForlornKeystone1'},
'ForlornInnerDoor': {'ForlornEntranceExp'}, 'ForlornKeyDoor': set(), 'ForlornLaserRoom': {'ForlornEscape'},
'ForlornMapArea': {'ForlornMap', 'ForlornKeystone4'},
'ForlornOrbPossession': {'ForlornKeystone2', 'ForlornHiddenSpiderExp', 'ForlornKeystone1', 'ForlornKeystone4',
'ForlornKeystone3'}, 'ForlornOuterDoor': set(), 'ForlornPlantAccess': {'ForlornPlant'},
'ForlornStompDoor': set(), 'ForlornTeleporter': {'ForlornKeystone3'}, 'GinsoEscape': set(),
'GinsoEscapeComplete': {'GinsoEscapeExit', 'GinsoEscapeSpiderExp', 'GinsoEscapeProjectileExp',
'GinsoEscapeJumpPadExp', 'GinsoEscapeHangingExp'}, 'GinsoInnerDoor': set(),
'GinsoMiniBossDoor': {'LowerGinsoKeystone2', 'LowerGinsoKeystone1', 'LowerGinsoKeystone3', 'LowerGinsoKeystone4'},
'GinsoOuterDoor': set(), 'GinsoTeleporter': set(), 'GladesLaserArea': {'GladesLaserGrenade', 'GladesLaser'},
'GladesMain': {'FourthHealthCell', 'GladesMap', 'GladesMapKeystone'}, 'GladesMainAttic': {'AboveFourthHealth'},
'GrenadeArea': {'GrenadeAreaAbilityCell', 'GrenadeAreaExp', 'GrenadeSkillTree'}, 'GrenadeAreaAccess': set(),
'GumoHideout': {'GumoHideoutMapstone', 'GumoHideoutCrusherExp', 'GumoHideoutRightHangingExp',
'GumoHideoutEnergyCell', 'GumoHideoutCrusherKeystone', 'GumoHideoutMap', 'GumoHideoutMiniboss'},
'GumoHideoutRedirectArea': {'GumoHideoutRedirectAbilityCell', 'GumoHideoutRedirectPlant'},
'GumoHideoutRedirectEnergyVault': {'GumoHideoutRedirectExp', 'GumoHideoutRedirectEnergyCell'},
'HollowGrove': {'GroveWaterStompAbilityCell', 'HollowGroveTreeAbilityCell', 'HollowGroveMapPlant',
'HoruFieldsHealthCell', 'HollowGroveMap', 'SwampTeleporterAbilityCell', 'HollowGroveMapstone',
'HollowGroveTreePlant'}, 'HoruBasement': {'DoorWarpExp'}, 'HoruEscapeInnerDoor': set(),
'HoruEscapeOuterDoor': set(), 'HoruFields': set(),
'HoruFieldsPushBlock': {'HoruFieldsEnergyCell', 'HoruFieldsPlant', 'HoruFieldsHiddenExp', 'HoruFieldsAbilityCell'},
'HoruInnerDoor': {'HoruLavaDrainedLeftExp', 'HoruLavaDrainedRightExp'},
'HoruL4CutscenePeg': {'HoruL4', 'HoruL4LowerExp'}, 'HoruL4LavaChasePeg': {'HoruL4ChaseExp'},
'HoruMapLedge': {'HoruMap'}, 'HoruOuterDoor': set(), 'HoruR1CutsceneTrigger': {'HoruR1EnergyCell', 'HoruR1'},
'HoruR1MapstoneSecret': {'HoruR1Mapstone'}, 'HoruR3CutsceneTrigger': {'HoruR3'}, 'HoruR3ElevatorLever': set(),
'HoruR3PlantCove': {'HoruR3Plant'}, 'HoruR4CutsceneTrigger': {'HoruR4DrainedExp', 'HoruR4'},
'HoruR4PuzzleEntrance': {'HoruR4LaserExp'}, 'HoruR4StompHideout': {'HoruR4StompExp'},
'HoruTeleporter': {'HoruTeleporterExp'}, 'Iceless': {'IcelessExp'}, 'InnerSwampAboveDrainArea': set(),
'InnerSwampDrainBroken': {'InnerSwampDrainExp'}, 'InnerSwampSkyArea': {'InnerSwampEnergyCell'}, 'L1': {'HoruL1'},
'L1InnerDoor': set(), 'L1OuterDoor': set(), 'L2': {'HoruL2'}, 'L2InnerDoor': set(), 'L2OuterDoor': set(),
'L3': {'HoruL3'}, 'L3InnerDoor': set(), 'L3OuterDoor': set(), 'L4': set(), 'L4InnerDoor': set(),
'L4OuterDoor': {'HoruLavaDrainedLeftExp'},
'LeftGlades': {'WallJumpAreaEnergyCell', 'LeftGladesHiddenExp', 'WallJumpAreaExp', 'WallJumpSkillTree'},
'LeftGumoHideout': {'FarLeftGumoHideoutExp', 'LeftGumoHideoutUpperPlant'},
'LeftSorrow': {'LeftSorrowAbilityCell', 'LeftSorrowPlant', 'LeftSorrowGrenade'},
'LeftSorrowKeystones': {'LeftSorrowEnergyCell', 'LeftSorrowKeystone1', 'LeftSorrowKeystone2',
'LeftSorrowKeystone4', 'LeftSorrowKeystone3'}, 'LeftSorrowLowerDoor': set(),
'LeftSorrowMiddleDoor': set(), 'LostGrove': {'LostGroveLongSwim'},
'LostGroveExit': {'LostGroveTeleporter', 'LostGroveAbilityCell', 'LostGroveHiddenExp'},
'LowerBlackroot': {'LowerBlackrootAbilityCell', 'LowerBlackrootLaserAbilityCell', 'LowerBlackrootGrenadeThrow',
'LowerBlackrootLaserExp'}, 'LowerChargeFlameArea': {'ChargeFlameAreaExp'},
'LowerGinsoTree': {'LowerGinsoPlant', 'LowerGinsoHiddenExp'},
'LowerLeftGumoHideout': {'LeftGumoHideoutSwim', 'LeftGumoHideoutHealthCell', 'LeftGumoHideoutExp',
'GumoHideoutLeftHangingExp', 'GumoHideoutRightHangingExp', 'LeftGumoHideoutLowerPlant'},
'LowerSorrow': {'SorrowLowerLeftKeystone', 'SorrowHiddenKeystone', 'SorrowEntranceAbilityCell', 'SorrowHealthCell',
'SorrowSpikeKeystone'},
'LowerSpiritCaverns': {'SpiritCavernsKeystone1', 'SpiritCavernsAbilityCell', 'SpiritCavernsKeystone2'},
'LowerValley': {'LowerValleyExp', 'LowerValleyMapstone', 'KuroPerchExp'},
'LowerValleyPlantApproach': {'ValleyMainPlant'}, 'MidSpiritCaverns': set(), 'MiddleSorrow': set(),
'MistyAbove200xp': {'MistyGrenade'}, 'MistyBeforeDocks': set(), 'MistyBeforeMiniBoss': set(),
'MistyEntrance': {'MistyEntranceStompExp', 'MistyEntranceTreeExp'}, 'MistyKeystone3Ledge': {'MistyKeystone3'},
'MistyKeystone4Ledge': {'MistyKeystone4'}, 'MistyMortarSpikeCave': {'MistyPostClimbAboveSpikePit'},
'MistyOrbRoom': {'GumonSeal'}, 'MistyPostClimb': set(),
'MistyPostFeatherTutorial': {'MistyFrogNookExp', 'MistyKeystone1'}, 'MistyPostKeystone1': set(),
'MistyPostLasers': {'MistyPostClimbSpikeCave'}, 'MistyPostMortarCorridor': set(),
'MistyPreClimb': {'ClimbSkillTree'}, 'MistyPreKeystone2': {'MistyKeystone2', 'MistyAbilityCell'},
'MistyPreLasers': set(), 'MistyPreMortarCorridor': {'MistyMortarCorridorUpperExp', 'MistyMortarCorridorHiddenExp'},
'MistyPrePlantLedge': {'MistyPlant'}, 'MistySpikeCave': set(),
'MoonGrotto': {'GrottoEnergyDoorHealthCell', 'GrottoEnergyDoorSwim'},
'MoonGrottoAboveTeleporter': {'LeftGrottoTeleporterExp', 'AboveGrottoTeleporterExp'},
'MoonGrottoBelowTeleporter': {'BelowGrottoTeleporterPlant', 'BelowGrottoTeleporterHealthCell'},
'MoonGrottoStompPlantAccess': {'MoonGrottoStompPlant'},
'MoonGrottoSwampAccessArea': {'GrottoSwampDrainAccessExp', 'GrottoSwampDrainAccessPlant'},
'OuterSwampAbilityCellNook': {'OuterSwampAbilityCell'},
'OuterSwampLowerArea': {'OuterSwampHealthCell', 'OuterSwampStompExp'},
'OuterSwampMortarAbilityCellLedge': {'OuterSwampMortarAbilityCell'},
'OuterSwampMortarPlantAccess': {'OuterSwampMortarPlant'}, 'OuterSwampUpperArea': {'OuterSwampGrenadeExp'},
'OutsideForlorn': {'OutsideForlornTreeExp', 'OutsideForlornWaterExp'},
'OutsideForlornCliff': {'OutsideForlornCliffExp'}, 'R1': {'HoruR1HangingExp'}, 'R1InnerDoor': set(),
'R1OuterDoor': set(), 'R2': {'HoruR2'}, 'R2InnerDoor': set(), 'R2OuterDoor': set(), 'R3': set(),
'R3InnerDoor': set(), 'R3OuterDoor': set(), 'R4': {'HoruR4DrainedExp'}, 'R4InnerDoor': set(),
'R4OuterDoor': {'HoruLavaDrainedRightExp'}, 'RazielNoArea': {'RazielNo'},
'RightForlorn': {'RightForlornPlant', 'RightForlornHealthCell'},
'RightSwamp': {'StompAreaGrenadeExp', 'StompSkillTree', 'StompAreaExp', 'StompAreaRoofExp'},
'SideFallCell': {'GrottoHideoutFallAbilityCell'}, 'SorrowBashLedge': set(),
'SorrowMainShaftKeystoneArea': {'SorrowMainShaftKeystone'}, 'SorrowMapstoneArea': {'SorrowMap', 'SorrowMapstone'},
'SorrowTeleporter': set(), 'SpiderSacArea': {'AboveChargeFlameTreeExp'},
'SpiderSacEnergyNook': {'SpiderSacEnergyCell'},
'SpiderSacTetherArea': {'SpiderSacGrenadeDoor', 'SpiderSacEnergyDoor', 'SpiderSacHealthCell'},
'SpiderWaterArea': {'GroveSpiderWaterSwim', 'GroveAboveSpiderWaterEnergyCell', 'GroveAboveSpiderWaterExp',
'GroveAboveSpiderWaterHealthCell'}, 'SpiritCavernsDoor': set(),
'SpiritCavernsDoorOpened': set(), 'SpiritTreeDoor': set(), 'SpiritTreeDoorOpened': set(),
'SpiritTreeRefined': {'AboveChargeFlameTreeExp'},
'SunkenGladesRunaway': {'FronkeyWalkRoof', 'GladesGrenadePool', 'GladesMainPoolDeep', 'FirstPickup',
'FronkeyFight', 'GladesMainPool', 'GladesKeystone1', 'GladesGrenadeTree',
'GladesKeystone2'}, 'SunstoneArea': {'Sunstone', 'SunstonePlant'},
'Swamp': {'InnerSwampDrainExp', 'SwampMap'}, 'SwampDrainlessArea': {'SwampEntranceAbilityCell'},
'SwampEntryArea': {'SwampEntrancePlant', 'SwampEntranceSwim'}, 'SwampKeyDoorOpened': set(),
'SwampKeyDoorPlatform': {'InnerSwampStompExp'}, 'SwampTeleporter': set(),
'SwampWater': {'InnerSwampSwimRightKeystone', 'InnerSwampSwimMapstone', 'InnerSwampHiddenSwimExp',
'InnerSwampSwimLeftKeystone'},
'TopGinsoTree': {'TopGinsoLeftLowerExp', 'TopGinsoLeftUpperExp', 'TopGinsoRightPlant'},
'UpperGinsoDoorClosed': set(), 'UpperGinsoDoorOpened': set(),
'UpperGinsoRedirectArea': {'BashAreaExp', 'UpperGinsoRedirectUpperExp', 'UpperGinsoRedirectLowerExp'},
'UpperGinsoTree': {'UpperGinsoUpperLeftKeystone', 'UpperGinsoLowerKeystone', 'UpperGinsoRightKeystone',
'UpperGinsoUpperRightKeystone', 'UpperGinsoEnergyCell'}, 'UpperGrotto': {'GrottoLasersRoofExp'},
'UpperLeftGlades': {'LeftGladesKeystone', 'LeftGladesExp', 'LeftGladesMapstone'},
'UpperSorrow': {'UpperSorrowSpikeExp', 'UpperSorrowRightKeystone', 'UpperSorrowLeftKeystone',
'UpperSorrowFarRightKeystone', 'UpperSorrowFarLeftKeystone'},
'UpperSpiritCaverns': {'SpiritCavernsTopRightKeystone', 'SpiritCavernsTopLeftKeystone'},
'ValleyEntry': {'ValleyEntryAbilityCell', 'ValleyThreeBirdAbilityCell'},
'ValleyEntryTree': {'ValleyEntryTreeExp', 'ValleyEntryGrenadeLongSwim'},
'ValleyEntryTreePlantAccess': {'ValleyEntryTreePlant'},
'ValleyForlornApproach': {'ValleyMap', 'ValleyForlornApproachGrenade', 'ValleyForlornApproachMapstone'},
'ValleyMain': {'GlideSkillFeather', 'KuroPerchExp'}, 'ValleyPostStompDoor': {'ValleyRightSwimExp'},
'ValleyRight': set(), 'ValleyStompFloor': set(), 'ValleyStompless': {'KuroPerchExp'},
'ValleyStomplessApproach': {'ValleyRightFastStomplessCell', 'ValleyRightBirdStompCell', 'ValleyRightExp'},
'ValleyTeleporter': set(), 'ValleyThreeBirdLever': {'ValleyThreeBirdAbilityCell', 'ValleyMainFACS'},
'WaterVeinArea': {'WaterVein', 'GumoHideoutRockfallExp'}, 'WilhelmLedge': {'WilhelmExp', 'KuroPerchExp'}}
connectors = \
{'AboveChargeJumpArea': {'SorrowTeleporter', 'ChargeJumpArea'},
'BashTree': {'BashTreeDoorClosed', 'UpperGinsoRedirectArea'}, 'BashTreeDoorClosed': {'BashTreeDoorOpened'},
'BashTreeDoorOpened': {'GinsoMiniBossDoor', 'BashTree'}, 'BelowSunstoneArea': {'SunstoneArea', 'UpperSorrow'},
'BlackrootDarknessRoom': {'DashArea'}, 'BlackrootGrottoConnection': {'SideFallCell'},
'ChargeFlameAreaStump': {'LowerChargeFlameArea', 'ChargeFlameSkillTreeChamber', 'ChargeFlameAreaPlantAccess'},
'ChargeFlameSkillTreeChamber': {'SpiritTreeRefined', 'ChargeFlameAreaStump'},
'ChargeJumpArea': {'AboveChargeJumpArea', 'ChargeJumpDoor'}, 'ChargeJumpDoor': {'ChargeJumpDoorOpen'},
'ChargeJumpDoorOpen': {'ChargeJumpDoorOpenLeft', 'ChargeJumpArea'}, 'ChargeJumpDoorOpenLeft': {'UpperSorrow'},
'DashArea': {'RazielNoArea', 'GrenadeAreaAccess', 'DashPlantAccess'},
'DeathGauntlet': {'DeathGauntletRoofPlantAccess', 'MoonGrotto', 'DeathGauntletMoat', 'MoonGrottoAboveTeleporter',
'DeathGauntletRoof', 'DeathGauntletDoor'}, 'DeathGauntletDoor': {'DeathGauntletDoorOpened'},
'DeathGauntletDoorOpened': {'SunkenGladesRunaway', 'DeathGauntlet', 'DeathGauntletMoat'},
'DeathGauntletRoof': {'DeathGauntlet', 'DeathGauntletRoofPlantAccess'},
'DoubleJumpKeyDoor': {'DoubleJumpKeyDoorOpened'}, 'ForlornGravityRoom': {'ForlornMapArea', 'ForlornInnerDoor'},
'ForlornInnerDoor': {'ForlornGravityRoom', 'ForlornOrbPossession', 'ForlornOuterDoor'},
'ForlornKeyDoor': {'ForlornLaserRoom'}, 'ForlornLaserRoom': {'ForlornStompDoor'},
'ForlornMapArea': {'ForlornGravityRoom', 'ForlornKeyDoor', 'ForlornPlantAccess', 'ForlornTeleporter'},
'ForlornOrbPossession': {'ForlornMapArea', 'ForlornKeyDoor', 'ForlornPlantAccess', 'ForlornInnerDoor'},
'ForlornOuterDoor': {'OutsideForlorn', 'ForlornInnerDoor'}, 'ForlornStompDoor': {'RightForlorn'},
'ForlornTeleporter': {'ForlornMapArea', 'ForlornGravityRoom', 'ForlornOrbPossession'},
'GinsoEscape': {'GinsoEscapeComplete'}, 'GinsoEscapeComplete': {'Swamp'}, 'GinsoInnerDoor': {'LowerGinsoTree'},
'GinsoMiniBossDoor': {'BashTreeDoorClosed'}, 'GinsoOuterDoor': {'GinsoInnerDoor'},
'GinsoTeleporter': {'UpperGinsoDoorClosed', 'TopGinsoTree'}, 'GladesLaserArea': {'MidSpiritCaverns', 'GladesMain'},
'GladesMain': {'LeftGlades', 'SpiritCavernsDoor', 'LowerChargeFlameArea', 'GladesMainAttic', 'GladesLaserArea'},
'GladesMainAttic': {'LowerChargeFlameArea', 'GladesMain'}, 'GrenadeAreaAccess': {'LowerBlackroot', 'GrenadeArea'},
'GumoHideout': {'SideFallCell', 'LeftGumoHideout', 'LowerLeftGumoHideout', 'DoubleJumpKeyDoor'},
'GumoHideoutRedirectArea': {'GumoHideoutRedirectEnergyVault'},
'HollowGrove': {'MoonGrottoStompPlantAccess', 'Iceless', 'SwampTeleporter', 'SpiderWaterArea', 'HoruFields',
'OuterSwampUpperArea'}, 'HoruBasement': {'HoruEscapeOuterDoor'},
'HoruEscapeOuterDoor': {'HoruEscapeInnerDoor'}, 'HoruFields': {'HoruOuterDoor', 'HoruFieldsPushBlock'},
'HoruFieldsPushBlock': {'HollowGrove'},
'HoruInnerDoor': {'HoruBasement', 'R2OuterDoor', 'HoruMapLedge', 'L1OuterDoor', 'L2OuterDoor', 'HoruTeleporter',
'L3OuterDoor', 'R1OuterDoor', 'R4OuterDoor', 'HoruOuterDoor', 'L4OuterDoor', 'R3OuterDoor'},
'HoruL4LavaChasePeg': {'HoruL4CutscenePeg'}, 'HoruOuterDoor': {'HoruFieldsPushBlock', 'HoruInnerDoor'},
'HoruR1CutsceneTrigger': {'LowerGinsoTree'}, 'HoruR1MapstoneSecret': {'HoruR1CutsceneTrigger'},
'HoruR3CutsceneTrigger': {'HoruR3PlantCove'}, 'HoruR3ElevatorLever': {'HoruR3PlantCove', 'HoruR3CutsceneTrigger'},
'HoruR4PuzzleEntrance': {'HoruR4CutsceneTrigger'},
'HoruR4StompHideout': {'HoruR4CutsceneTrigger', 'HoruR4PuzzleEntrance'}, 'HoruTeleporter': {'HoruInnerDoor'},
'Iceless': {'HollowGrove', 'UpperGrotto'}, 'InnerSwampAboveDrainArea': {'InnerSwampDrainBroken'},
'InnerSwampDrainBroken': {'Swamp'}, 'InnerSwampSkyArea': {'SwampKeyDoorPlatform', 'Swamp'}, 'L1InnerDoor': {'L1'},
'L1OuterDoor': {'L1InnerDoor', 'HoruInnerDoor'}, 'L2InnerDoor': {'L2'},
'L2OuterDoor': {'L2InnerDoor', 'HoruInnerDoor'}, 'L3InnerDoor': {'L3'},
'L3OuterDoor': {'L3InnerDoor', 'HoruInnerDoor'}, 'L4': {'HoruL4CutscenePeg', 'HoruL4LavaChasePeg'},
'L4InnerDoor': {'L4'}, 'L4OuterDoor': {'L4InnerDoor', 'HoruInnerDoor'},
'LeftGlades': {'UpperLeftGlades', 'GladesMain'}, 'LeftGumoHideout': {'WaterVeinArea', 'LowerLeftGumoHideout'},
'LeftSorrow': {'LeftSorrowKeystones'}, 'LeftSorrowKeystones': {'LeftSorrowMiddleDoor', 'MiddleSorrow'},
'LeftSorrowLowerDoor': {'LeftSorrow'}, 'LeftSorrowMiddleDoor': {'MiddleSorrow'}, 'LostGrove': {'LostGroveExit'},
'LowerBlackroot': {'LostGrove'}, 'LowerChargeFlameArea': {'ChargeFlameAreaStump', 'GladesMain'},
'LowerGinsoTree': {'R4InnerDoor', 'GinsoMiniBossDoor'},
'LowerLeftGumoHideout': {'LowerBlackroot', 'GumoHideoutRedirectArea'},
'LowerSorrow': {'SorrowMainShaftKeystoneArea', 'SorrowMapstoneArea', 'LeftSorrowLowerDoor', 'LeftSorrow',
'SunstoneArea', 'WilhelmLedge', 'MiddleSorrow'},
'LowerSpiritCaverns': {'SpiritCavernsDoor', 'MidSpiritCaverns', 'GladesLaserArea'},
'LowerValley': {'ValleyThreeBirdLever', 'LowerValleyPlantApproach', 'ValleyTeleporter', 'MistyEntrance'},
'MidSpiritCaverns': {'UpperSpiritCaverns', 'LowerSpiritCaverns', 'GladesLaserArea'},
'MiddleSorrow': {'SorrowMainShaftKeystoneArea', 'LeftSorrowKeystones', 'LeftSorrow', 'LowerSorrow', 'UpperSorrow',
'SunstoneArea'}, 'MistyAbove200xp': {'MistyBeforeMiniBoss'},
'MistyBeforeDocks': {'MistyAbove200xp'}, 'MistyBeforeMiniBoss': {'MistyOrbRoom'},
'MistyEntrance': {'MistyPostFeatherTutorial'}, 'MistyKeystone3Ledge': {'MistyPreLasers'},
'MistyKeystone4Ledge': {'MistyBeforeDocks'}, 'MistyMortarSpikeCave': {'MistyKeystone4Ledge'},
'MistyOrbRoom': {'MistyPreKeystone2'}, 'MistyPostClimb': {'MistySpikeCave'},
'MistyPostFeatherTutorial': {'MistyPostKeystone1'}, 'MistyPostKeystone1': {'MistyPreMortarCorridor'},
'MistyPostLasers': {'MistyMortarSpikeCave'}, 'MistyPostMortarCorridor': {'MistyPrePlantLedge'},
'MistyPreClimb': {'MistyPostClimb', 'ForlornTeleporter', 'RightForlorn'}, 'MistyPreLasers': {'MistyPostLasers'},
'MistyPreMortarCorridor': {'MistyPostMortarCorridor', 'RightForlorn'}, 'MistyPrePlantLedge': {'MistyPreClimb'},
'MistySpikeCave': {'MistyKeystone3Ledge'},
'MoonGrotto': {'MoonGrottoBelowTeleporter', 'MoonGrottoAboveTeleporter', 'WaterVeinArea', 'DeathGauntlet',
'GumoHideout'},
'MoonGrottoAboveTeleporter': {'MoonGrottoSwampAccessArea', 'MoonGrottoBelowTeleporter',
'MoonGrottoStompPlantAccess', 'MoonGrotto', 'DeathGauntletRoof', 'UpperGrotto'},
'MoonGrottoSwampAccessArea': {'InnerSwampAboveDrainArea'}, 'OuterSwampAbilityCellNook': {'InnerSwampSkyArea'},
'OuterSwampLowerArea': {'OuterSwampAbilityCellNook', 'OuterSwampMortarPlantAccess', 'SwampEntryArea',
'OuterSwampMortarAbilityCellLedge', 'UpperGrotto', 'OuterSwampUpperArea'},
'OuterSwampMortarAbilityCellLedge': {'OuterSwampMortarPlantAccess', 'UpperGrotto'},
'OuterSwampUpperArea': {'OuterSwampLowerArea', 'OuterSwampAbilityCellNook', 'GinsoOuterDoor'},
'OutsideForlorn': {'OutsideForlornCliff', 'RightForlorn', 'ForlornOuterDoor'},
'OutsideForlornCliff': {'OutsideForlorn', 'ValleyForlornApproach'}, 'R1': {'HoruR1MapstoneSecret'},
'R1InnerDoor': {'R1'}, 'R1OuterDoor': {'R1InnerDoor', 'L1OuterDoor'}, 'R2InnerDoor': {'R2'},
'R2OuterDoor': {'R2InnerDoor', 'HoruInnerDoor'}, 'R3': {'HoruR3ElevatorLever'}, 'R3InnerDoor': {'R3'},
'R3OuterDoor': {'R3InnerDoor', 'HoruInnerDoor'}, 'R4': {'HoruR4StompHideout'}, 'R4InnerDoor': {'R4'},
'R4OuterDoor': {'R4InnerDoor', 'HoruInnerDoor'}, 'RazielNoArea': {'GumoHideout', 'BlackrootGrottoConnection'},
'SideFallCell': {'LeftGumoHideout', 'GumoHideout'}, 'SorrowBashLedge': {'LowerSorrow'},
'SorrowMainShaftKeystoneArea': {'LowerSorrow'}, 'SorrowMapstoneArea': {'HoruInnerDoor'},
'SorrowTeleporter': {'AboveChargeJumpArea', 'BelowSunstoneArea'},
'SpiderSacArea': {'SpiritTreeRefined', 'SpiderWaterArea', 'SpiderSacTetherArea', 'SpiderSacEnergyNook'},
'SpiderSacEnergyNook': {'ChargeFlameAreaPlantAccess'},
'SpiderSacTetherArea': {'SpiderWaterArea', 'SpiderSacEnergyNook'},
'SpiderWaterArea': {'HollowGrove', 'DeathGauntletRoof', 'SpiderSacEnergyNook', 'SpiderSacArea'},
'SpiritCavernsDoor': {'SpiritCavernsDoorOpened'}, 'SpiritCavernsDoorOpened': {'LowerSpiritCaverns', 'GladesMain'},
'SpiritTreeDoor': {'SpiritTreeDoorOpened'}, 'SpiritTreeDoorOpened': {'SpiritTreeRefined', 'UpperSpiritCaverns'},
'SpiritTreeRefined': {'ChargeFlameAreaStump', 'SpiritTreeDoor', 'ChargeFlameSkillTreeChamber', 'ValleyEntry',
'SpiderSacArea'},
'SunkenGladesRunaway': {'MoonGrotto', 'LowerChargeFlameArea', 'ValleyTeleporter', 'SorrowTeleporter',
'HoruTeleporter', 'GladesMain', 'GinsoTeleporter', 'SwampTeleporter', 'SpiritTreeRefined',
'BlackrootDarknessRoom', 'DeathGauntletDoor', 'ForlornTeleporter'},
'SunstoneArea': {'SorrowTeleporter', 'UpperSorrow'},
'Swamp': {'SwampKeyDoorPlatform', 'SwampDrainlessArea', 'SwampWater'},
'SwampEntryArea': {'SwampDrainlessArea', 'Swamp'}, 'SwampKeyDoorOpened': {'RightSwamp'},
'SwampKeyDoorPlatform': {'SwampKeyDoorOpened', 'InnerSwampSkyArea'},
'SwampTeleporter': {'HollowGrove', 'OuterSwampMortarAbilityCellLedge'}, 'TopGinsoTree': {'GinsoEscape'},
'UpperGinsoDoorClosed': {'UpperGinsoDoorOpened'}, 'UpperGinsoDoorOpened': {'GinsoTeleporter', 'UpperGinsoTree'},
'UpperGinsoRedirectArea': {'UpperGinsoTree', 'BashTree'},
'UpperGinsoTree': {'UpperGinsoDoorClosed', 'UpperGinsoRedirectArea'},
'UpperGrotto': {'MoonGrottoStompPlantAccess', 'Iceless', 'MoonGrottoAboveTeleporter',
'OuterSwampMortarAbilityCellLedge', 'OuterSwampLowerArea'}, 'UpperLeftGlades': {'LeftGlades'},
'UpperSorrow': {'SunstoneArea', 'MiddleSorrow', 'SorrowTeleporter', 'ChargeJumpDoor'},
'UpperSpiritCaverns': {'SpiritTreeDoor', 'MidSpiritCaverns'},
'ValleyEntry': {'ValleyThreeBirdLever', 'ValleyStompFloor', 'ValleyPostStompDoor', 'ValleyEntryTreePlantAccess',
'ValleyEntryTree', 'SpiritTreeRefined'},
'ValleyEntryTree': {'ValleyPostStompDoor', 'ValleyEntryTreePlantAccess'},
'ValleyForlornApproach': {'ValleyStompFloor', 'OutsideForlornCliff'},
'ValleyMain': {'LowerValleyPlantApproach', 'LowerValley', 'MistyEntrance', 'WilhelmLedge', 'ValleyStompless'},
'ValleyPostStompDoor': {'ValleyEntry', 'ValleyRight', 'ValleyEntryTree'},
'ValleyRight': {'ValleyPostStompDoor', 'ValleyStomplessApproach'},
'ValleyStompFloor': {'ValleyThreeBirdLever', 'ValleyEntry', 'ValleyForlornApproach'},
'ValleyStompless': {'LowerValleyPlantApproach', 'ValleyMain', 'LowerValley', 'WilhelmLedge', 'MistyEntrance',
'ValleyStomplessApproach'}, 'ValleyStomplessApproach': {'ValleyRight', 'ValleyStompless'},
'ValleyTeleporter': {'LowerValleyPlantApproach', 'ValleyRight', 'ValleyPostStompDoor', 'LowerValley',
'MistyEntrance', 'ValleyStompless'},
'ValleyThreeBirdLever': {'ValleyStompFloor', 'ValleyEntry', 'LowerValley'},
'WaterVeinArea': {'MoonGrotto', 'LeftGumoHideout', 'LowerLeftGumoHideout'},
'WilhelmLedge': {'ValleyMain', 'SorrowBashLedge', 'ValleyStompless'}}

52
worlds/oribf/Rules.py Normal file
View File

@ -0,0 +1,52 @@
from .RulesData import location_rules
from ..generic.Rules import set_rule
from BaseClasses import Location
# TODO: implement Mapstone counting, Open, OpenWorld, connection rules
def set_rules(world):
temp_base_rule(world.world, world.player)
for logicset in world.logic_sets:
apply_or_ruleset(world.world, world.player, logicset)
tautology = lambda state: True
def add_or_rule_check_first(world, location: str, player: int, conditionsets):
location = world.get_location(location, player)
for set in conditionsets:
if "Free" in set:
location.access_rule = tautology
return
rule = lambda state, conditionsets=conditionsets: any(
state._oribf_has_all(conditionset, player) for conditionset in conditionsets)
if location.access_rule is Location.access_rule:
location.access_rule = rule
else:
old_rule = location.access_rule
location.access_rule = lambda state: rule(state) or old_rule(state)
def temp_base_rule(world, player):
world.completion_condition[player] = lambda state: state._oribf_has_all(
{"Bash", "ChargeFlame", "ChargeJump", "Climb", "Dash", "DoubleJump", "Glide", "Grenade", "Stomp", "WallJump"},
player)
def base_rule(world, player):
if world.logic[player] != 'nologic':
# Victory gets placed on Escaped Horu Event
world.completion_condition[player] = lambda state: state.has('Victory', player)
# Events
# Also add: can complete goal
set_rule(world.get_location("Escaped Horu", player),
lambda state: state.can_reach("HoruEscapeInnerDoor", player)
and state.has_any({"Dash", "Stomp", "ChargeJump", "ChargeFlame"}, player))
def apply_or_ruleset(world, player, rulesetname):
rules = location_rules[rulesetname]
for location, conditionsets in rules.items():
add_or_rule_check_first(world, location, player, conditionsets)

File diff suppressed because one or more lines are too long

5
worlds/oribf/Types.py Normal file
View File

@ -0,0 +1,5 @@
from typing import NamedTuple
class Location(NamedTuple):
code: int
vanilla_item: str

75
worlds/oribf/__init__.py Normal file
View File

@ -0,0 +1,75 @@
from typing import Set
from ..AutoWorld import World, LogicMixin
from .Items import item_table, default_pool
from .Locations import lookup_name_to_id
from .Rules import set_rules, location_rules
from .Regions import locations_by_region, connectors
from .Options import options
from BaseClasses import Region, Item, Location, RegionType, Entrance
class OriBlindForest(World):
game: str = "Ori and the Blind Forest"
topology_present = True
item_names = frozenset(item_table)
location_names = frozenset(lookup_name_to_id)
item_name_to_id = item_table
location_name_to_id = lookup_name_to_id
options = options
def generate_early(self):
logic_sets = {"casual-core"}
for logic_set in location_rules:
if logic_set != "casual-core" and getattr(self.world, logic_set.replace("-", "_")):
logic_sets.add(logic_set)
self.logic_sets = logic_sets
set_rules = set_rules
def create_region(self, name: str):
return Region(name, RegionType.Generic, name, self.player, self.world)
def create_regions(self):
world = self.world
menu = self.create_region("Menu")
world.regions.append(menu)
start = Entrance(self.player, "Start Game", menu)
menu.exits.append(start)
# workaround for now, remove duplicate locations
already_placed_locations = set()
for region_name, locations in locations_by_region.items():
locations -= already_placed_locations
already_placed_locations |= locations
region = self.create_region(region_name)
if region_name == "SunkenGladesRunaway": # starting point
start.connect(region)
region.locations = {Location(self.player, location, lookup_name_to_id[location], region)
for location in locations}
world.regions.append(region)
for region_name, exits in connectors.items():
parent = world.get_region(region_name, self.player)
for exit in exits:
connection = Entrance(self.player, exit, parent)
connection.connect(world.get_region(exit, self.player))
parent.exits.append(connection)
def generate_basic(self):
for item_name, count in default_pool.items():
self.world.itempool.extend([self.create_item(item_name)] * count)
def create_item(self, name: str) -> Item:
return Item(name, not name.startswith("EX"), item_table[name], self.player)
class OriBlindForestLogic(LogicMixin):
def _oribf_has_all(self, items: Set[str], player:int):
return all(self.prog_items[item, player] if type(item) == str
else self.prog_items[item[0], player] >= item[1] for item in items)