132 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from .region_base import JakAndDaxterRegion | ||
|  | from ..options import EnableOrbsanity | ||
|  | from typing import TYPE_CHECKING | ||
|  | if TYPE_CHECKING: | ||
|  |     from .. import JakAndDaxterWorld | ||
|  | from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level | ||
|  | 
 | ||
|  | 
 | ||
|  | def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: | ||
|  |     multiworld = world.multiworld | ||
|  |     options = world.options | ||
|  |     player = world.player | ||
|  | 
 | ||
|  |     main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 9) | ||
|  | 
 | ||
|  |     muse_course = JakAndDaxterRegion("Muse Course", player, multiworld, level_name, 21) | ||
|  |     muse_course.add_cell_locations([23]) | ||
|  |     muse_course.add_fly_locations([327708], access_rule=lambda state: can_free_scout_flies(state, player)) | ||
|  | 
 | ||
|  |     zoomer = JakAndDaxterRegion("Zoomer", player, multiworld, level_name, 32) | ||
|  |     zoomer.add_cell_locations([27, 29]) | ||
|  |     zoomer.add_fly_locations([393244]) | ||
|  | 
 | ||
|  |     ship = JakAndDaxterRegion("Ship", player, multiworld, level_name, 10) | ||
|  |     ship.add_cell_locations([24]) | ||
|  |     ship.add_fly_locations([131100], access_rule=lambda state: can_free_scout_flies(state, player)) | ||
|  | 
 | ||
|  |     far_side = JakAndDaxterRegion("Far Side", player, multiworld, level_name, 16) | ||
|  | 
 | ||
|  |     # In order to even reach this fly, you must use the seesaw or crouch jump. | ||
|  |     far_side_cliff = JakAndDaxterRegion("Far Side Cliff", player, multiworld, level_name, 5) | ||
|  |     far_side_cliff.add_fly_locations([28], access_rule=lambda state: can_free_scout_flies(state, player)) | ||
|  | 
 | ||
|  |     # To carry the blue eco fast enough to open this cache, you need to break the bone bridges along the way. | ||
|  |     far_side_cache = JakAndDaxterRegion("Far Side Orb Cache", player, multiworld, level_name, 15) | ||
|  |     far_side_cache.add_cache_locations([11072], access_rule=lambda state: can_fight(state, player)) | ||
|  | 
 | ||
|  |     barrel_course = JakAndDaxterRegion("Barrel Course", player, multiworld, level_name, 10) | ||
|  |     barrel_course.add_fly_locations([196636], access_rule=lambda state: can_free_scout_flies(state, player)) | ||
|  | 
 | ||
|  |     # 14 orbs for the boxes you can only break with the cannon. | ||
|  |     cannon = JakAndDaxterRegion("Cannon", player, multiworld, level_name, 14) | ||
|  |     cannon.add_cell_locations([26], access_rule=lambda state: can_fight(state, player)) | ||
|  | 
 | ||
|  |     upper_approach = JakAndDaxterRegion("Upper Arena Approach", player, multiworld, level_name, 6) | ||
|  |     upper_approach.add_fly_locations([65564, 262172], access_rule=lambda state: | ||
|  |                                      can_free_scout_flies(state, player)) | ||
|  | 
 | ||
|  |     lower_approach = JakAndDaxterRegion("Lower Arena Approach", player, multiworld, level_name, 7) | ||
|  |     lower_approach.add_cell_locations([30]) | ||
|  | 
 | ||
|  |     arena = JakAndDaxterRegion("Arena", player, multiworld, level_name, 5) | ||
|  |     arena.add_cell_locations([25], access_rule=lambda state: can_fight(state, player)) | ||
|  | 
 | ||
|  |     main_area.connect(muse_course)             # TODO - What do you need to chase the muse the whole way around? | ||
|  |     main_area.connect(zoomer)                  # Run and jump down. | ||
|  |     main_area.connect(ship)                    # Run and jump. | ||
|  |     main_area.connect(lower_approach)          # Run and jump. | ||
|  | 
 | ||
|  |     # Need to break the bone bridge to access. | ||
|  |     main_area.connect(upper_approach, rule=lambda state: can_fight(state, player)) | ||
|  | 
 | ||
|  |     muse_course.connect(main_area)             # Run and jump down. | ||
|  | 
 | ||
|  |     # The zoomer pad is low enough that it requires Crouch Jump specifically. | ||
|  |     zoomer.connect(main_area, rule=lambda state: state.has_all(("Crouch", "Crouch Jump"), player)) | ||
|  | 
 | ||
|  |     ship.connect(main_area)                    # Run and jump down. | ||
|  |     ship.connect(far_side)                     # Run and jump down. | ||
|  |     ship.connect(barrel_course)                # Run and jump (dodge barrels). | ||
|  | 
 | ||
|  |     far_side.connect(ship)                     # Run and jump. | ||
|  |     far_side.connect(arena)                    # Run and jump. | ||
|  | 
 | ||
|  |     # Only if you can use the seesaw or Crouch Jump from the seesaw's edge. | ||
|  |     far_side.connect(far_side_cliff, rule=lambda state: | ||
|  |                      state.has("Jump Dive", player) | ||
|  |                      or state.has_all(("Crouch", "Crouch Jump"), player)) | ||
|  | 
 | ||
|  |     # Only if you can break the bone bridges to carry blue eco over the mud pit. | ||
|  |     far_side.connect(far_side_cache, rule=lambda state: can_fight(state, player)) | ||
|  | 
 | ||
|  |     far_side_cliff.connect(far_side)           # Run and jump down. | ||
|  | 
 | ||
|  |     barrel_course.connect(cannon)              # Run and jump (dodge barrels). | ||
|  | 
 | ||
|  |     cannon.connect(barrel_course)              # Run and jump (dodge barrels). | ||
|  |     cannon.connect(arena)                      # Run and jump down. | ||
|  |     cannon.connect(upper_approach)             # Run and jump down. | ||
|  | 
 | ||
|  |     upper_approach.connect(lower_approach)     # Jump down. | ||
|  |     upper_approach.connect(arena)              # Jump down. | ||
|  | 
 | ||
|  |     # One cliff is accessible, but only via Crouch Jump. | ||
|  |     lower_approach.connect(upper_approach, rule=lambda state: state.has_all(("Crouch", "Crouch Jump"), player)) | ||
|  | 
 | ||
|  |     # Requires breaking bone bridges. | ||
|  |     lower_approach.connect(arena, rule=lambda state: can_fight(state, player)) | ||
|  | 
 | ||
|  |     arena.connect(lower_approach)              # Run. | ||
|  |     arena.connect(far_side)                    # Run. | ||
|  | 
 | ||
|  |     world.level_to_regions[level_name].append(main_area) | ||
|  |     world.level_to_regions[level_name].append(muse_course) | ||
|  |     world.level_to_regions[level_name].append(zoomer) | ||
|  |     world.level_to_regions[level_name].append(ship) | ||
|  |     world.level_to_regions[level_name].append(far_side) | ||
|  |     world.level_to_regions[level_name].append(far_side_cliff) | ||
|  |     world.level_to_regions[level_name].append(far_side_cache) | ||
|  |     world.level_to_regions[level_name].append(barrel_course) | ||
|  |     world.level_to_regions[level_name].append(cannon) | ||
|  |     world.level_to_regions[level_name].append(upper_approach) | ||
|  |     world.level_to_regions[level_name].append(lower_approach) | ||
|  |     world.level_to_regions[level_name].append(arena) | ||
|  | 
 | ||
|  |     # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always | ||
|  |     # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. | ||
|  |     if options.enable_orbsanity == EnableOrbsanity.option_per_level: | ||
|  |         orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) | ||
|  | 
 | ||
|  |         bundle_count = 150 // world.orb_bundle_size | ||
|  |         for bundle_index in range(bundle_count): | ||
|  |             amount = world.orb_bundle_size * (bundle_index + 1) | ||
|  |             orbs.add_orb_locations(4, | ||
|  |                                    bundle_index, | ||
|  |                                    access_rule=lambda state, level=level_name, orb_amount=amount: | ||
|  |                                    can_reach_orbs_level(state, player, world, level, orb_amount)) | ||
|  |         multiworld.regions.append(orbs) | ||
|  |         main_area.connect(orbs) | ||
|  | 
 | ||
|  |     return main_area |