128 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			128 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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # A large amount of this area can be covered by single jump, floating platforms, web trampolines, and goggles.
							 | 
						||
| 
								 | 
							
								    main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 63)
							 | 
						||
| 
								 | 
							
								    main_area.add_cell_locations([78, 84])
							 | 
						||
| 
								 | 
							
								    main_area.add_fly_locations([327765, 393301, 196693, 131157])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # This is a virtual region describing what you need to DO to get the Dark Crystal power cell,
							 | 
						||
| 
								 | 
							
								    # rather than describing where each of the crystals ARE, because you can destroy them in any order,
							 | 
						||
| 
								 | 
							
								    # and you need to destroy ALL of them to get the cell.
							 | 
						||
| 
								 | 
							
								    dark_crystals = JakAndDaxterRegion("Dark Crystals", player, multiworld, level_name, 0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # can_fight = The underwater crystal in dark cave.
							 | 
						||
| 
								 | 
							
								    # Roll Jump = The underwater crystal across a long dark eco pool.
							 | 
						||
| 
								 | 
							
								    # The rest of the crystals can be destroyed with yellow eco in main_area.
							 | 
						||
| 
								 | 
							
								    dark_crystals.add_cell_locations([79], access_rule=lambda state:
							 | 
						||
| 
								 | 
							
								                                     can_fight(state, player)
							 | 
						||
| 
								 | 
							
								                                     and state.has_all(("Roll", "Roll Jump"), player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dark_cave = JakAndDaxterRegion("Dark Cave", player, multiworld, level_name, 5)
							 | 
						||
| 
								 | 
							
								    dark_cave.add_cell_locations([80])
							 | 
						||
| 
								 | 
							
								    dark_cave.add_fly_locations([262229], access_rule=lambda state: can_free_scout_flies(state, player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    robot_cave = JakAndDaxterRegion("Robot Cave", player, multiworld, level_name, 0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Need double jump for orbs.
							 | 
						||
| 
								 | 
							
								    scaffolding_level_zero = JakAndDaxterRegion("Robot Scaffolding Level 0", player, multiworld, level_name, 12)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    scaffolding_level_one = JakAndDaxterRegion("Robot Scaffolding Level 1", player, multiworld, level_name, 53)
							 | 
						||
| 
								 | 
							
								    scaffolding_level_one.add_fly_locations([85])  # Shootable.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    scaffolding_level_two = JakAndDaxterRegion("Robot Scaffolding Level 2", player, multiworld, level_name, 4)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Using the blue eco from the pole course, you can single jump to the scout fly up here.
							 | 
						||
| 
								 | 
							
								    scaffolding_level_three = JakAndDaxterRegion("Robot Scaffolding Level 3", player, multiworld, level_name, 29)
							 | 
						||
| 
								 | 
							
								    scaffolding_level_three.add_cell_locations([81])
							 | 
						||
| 
								 | 
							
								    scaffolding_level_three.add_fly_locations([65621])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    pole_course = JakAndDaxterRegion("Pole Course", player, multiworld, level_name, 18)
							 | 
						||
| 
								 | 
							
								    pole_course.add_cell_locations([82])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # You only need combat to fight through the spiders, but to collect the orb crates,
							 | 
						||
| 
								 | 
							
								    # you will need the yellow eco vent unlocked.
							 | 
						||
| 
								 | 
							
								    spider_tunnel = JakAndDaxterRegion("Spider Tunnel", player, multiworld, level_name, 4)
							 | 
						||
| 
								 | 
							
								    spider_tunnel.add_cell_locations([83])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    spider_tunnel_crates = JakAndDaxterRegion("Spider Tunnel Orb Crates", player, multiworld, level_name, 12)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    main_area.connect(dark_crystals)
							 | 
						||
| 
								 | 
							
								    main_area.connect(robot_cave)
							 | 
						||
| 
								 | 
							
								    main_area.connect(dark_cave, rule=lambda state:
							 | 
						||
| 
								 | 
							
								                      can_fight(state, player)
							 | 
						||
| 
								 | 
							
								                      and (state.has("Double Jump", player)
							 | 
						||
| 
								 | 
							
								                           or state.has_all(("Crouch", "Crouch Jump"), player)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    robot_cave.connect(main_area)
							 | 
						||
| 
								 | 
							
								    robot_cave.connect(pole_course)                 # Nothing special required.
							 | 
						||
| 
								 | 
							
								    robot_cave.connect(scaffolding_level_one)       # Ramps lead to level 1.
							 | 
						||
| 
								 | 
							
								    robot_cave.connect(spider_tunnel)               # Web trampolines (bounce twice on each to gain momentum).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    pole_course.connect(robot_cave)                 # Blue eco platform down.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    scaffolding_level_one.connect(robot_cave)       # All scaffolding (level 1+) connects back by jumping down.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Elevator, but the orbs need double jump or jump kick.
							 | 
						||
| 
								 | 
							
								    scaffolding_level_one.connect(scaffolding_level_zero, rule=lambda state:
							 | 
						||
| 
								 | 
							
								                                  state.has_any(("Double Jump", "Jump Kick"), player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Narrow enough that enemies are unavoidable.
							 | 
						||
| 
								 | 
							
								    scaffolding_level_one.connect(scaffolding_level_two, rule=lambda state: can_fight(state, player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    scaffolding_level_zero.connect(scaffolding_level_one)           # Elevator.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    scaffolding_level_two.connect(robot_cave)                       # Jump down.
							 | 
						||
| 
								 | 
							
								    scaffolding_level_two.connect(scaffolding_level_one)            # Elevator.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Elevator, but narrow enough that enemies are unavoidable.
							 | 
						||
| 
								 | 
							
								    scaffolding_level_two.connect(scaffolding_level_three, rule=lambda state: can_fight(state, player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    scaffolding_level_three.connect(robot_cave)                     # Jump down.
							 | 
						||
| 
								 | 
							
								    scaffolding_level_three.connect(scaffolding_level_two)          # Elevator.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    spider_tunnel.connect(robot_cave)                               # Back to web trampolines.
							 | 
						||
| 
								 | 
							
								    spider_tunnel.connect(main_area)                                # Escape with jump pad.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Requires yellow eco switch.
							 | 
						||
| 
								 | 
							
								    spider_tunnel.connect(spider_tunnel_crates, rule=lambda state: state.has("Yellow Eco Switch", player))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(main_area)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(dark_crystals)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(dark_cave)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(robot_cave)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(scaffolding_level_zero)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(scaffolding_level_one)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(scaffolding_level_two)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(scaffolding_level_three)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(pole_course)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(spider_tunnel)
							 | 
						||
| 
								 | 
							
								    world.level_to_regions[level_name].append(spider_tunnel_crates)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # 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 = 200 // world.orb_bundle_size
							 | 
						||
| 
								 | 
							
								        for bundle_index in range(bundle_count):
							 | 
						||
| 
								 | 
							
								            amount = world.orb_bundle_size * (bundle_index + 1)
							 | 
						||
| 
								 | 
							
								            orbs.add_orb_locations(13,
							 | 
						||
| 
								 | 
							
								                                   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
							 |