mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
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
|