forked from mirror/Archipelago
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
271 lines
10 KiB
Python
271 lines
10 KiB
Python
from BaseClasses import Region
|
|
|
|
from ..base_classes import D3DLevel
|
|
|
|
|
|
class E2L4(D3DLevel):
|
|
name = "Fusion Station"
|
|
levelnum = 3
|
|
volumenum = 1
|
|
keys = []
|
|
location_defs = [
|
|
{"id": 3, "name": "Timed Room Freezethrower", "type": "sprite", "density": 2},
|
|
{"id": 13, "name": "Column Armor", "type": "sprite", "density": 2},
|
|
{
|
|
"id": 18,
|
|
"name": "Start Night Vision Goggles",
|
|
"type": "sprite",
|
|
"density": 3,
|
|
},
|
|
{
|
|
"id": 19,
|
|
"name": "First Level Night Vision Goggles",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{
|
|
"id": 20,
|
|
"name": "Reactor Night Vision Goggles",
|
|
"type": "sprite",
|
|
"density": 0,
|
|
},
|
|
{"id": 46, "name": "Top Floor Chaingun", "type": "sprite", "density": 4},
|
|
{"id": 54, "name": "MP Reactor Holo Duke", "type": "sprite", "density": 5},
|
|
{"id": 111, "name": "Start Atomic Health", "type": "sprite", "density": 3},
|
|
{"id": 135, "name": "Pistons Tripmine 1", "type": "sprite", "density": 4},
|
|
{"id": 136, "name": "Pistons Tripmine 2", "type": "sprite", "density": 4},
|
|
{"id": 139, "name": "Pistons Protective Boots", "type": "sprite", "density": 4},
|
|
{
|
|
"id": 142,
|
|
"name": "Top Ledge Atomic Health 1",
|
|
"type": "sprite",
|
|
"density": 3,
|
|
},
|
|
{
|
|
"id": 143,
|
|
"name": "Top Ledge Atomic Health 2",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{"id": 158, "name": "Red Room Devastator", "type": "sprite", "density": 0},
|
|
{"id": 159, "name": "Top Floor Atomic Health", "type": "sprite", "density": 0},
|
|
{"id": 167, "name": "Top Floor Medkit", "type": "sprite", "density": 4},
|
|
{"id": 210, "name": "Start Armor", "type": "sprite", "density": 4},
|
|
{"id": 253, "name": "Top Ledge Jetpack", "type": "sprite", "density": 0},
|
|
{"id": 696, "name": "Vents Atomic Health", "type": "sprite", "density": 2},
|
|
{"id": 715, "name": "Shotgun behind Babe", "type": "sprite", "density": 0},
|
|
{"id": 718, "name": "Pistons Medkit", "type": "sprite", "density": 3},
|
|
{"id": 720, "name": "Pistons Tripmine 3", "type": "sprite", "density": 4},
|
|
{
|
|
"id": 721,
|
|
"name": "Pistons Night Vision Goggles",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{"id": 722, "name": "Pistons Chaingun", "type": "sprite", "density": 0},
|
|
{"id": 739, "name": "First Level Shrinker", "type": "sprite", "density": 0},
|
|
{"id": 750, "name": "Underwater Pipebombs 1", "type": "sprite", "density": 0},
|
|
{"id": 751, "name": "Underwater Pipebombs 2", "type": "sprite", "density": 3},
|
|
{"id": 756, "name": "Start RPG", "type": "sprite", "density": 0},
|
|
{"id": 759, "name": "MP Floor Jetpack 1", "type": "sprite", "density": 5},
|
|
{"id": 760, "name": "MP Floor Jetpack 2", "type": "sprite", "density": 5},
|
|
{"id": 761, "name": "MP Floor Jetpack 3", "type": "sprite", "density": 5},
|
|
{"id": 762, "name": "MP Floor Jetpack 4", "type": "sprite", "density": 5},
|
|
{"id": 790, "name": "Pistons Atomic Health 1", "type": "sprite", "density": 2},
|
|
{"id": 791, "name": "Pistons Atomic Health 2", "type": "sprite", "density": 4},
|
|
{
|
|
"id": 792,
|
|
"name": "Pistons Tunnel Pipebombs 1",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{
|
|
"id": 793,
|
|
"name": "Pistons Tunnel Pipebombs 2",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{"id": 835, "name": "Top Floor Shotgun", "type": "sprite", "density": 4},
|
|
{"id": 836, "name": "MP Floor RPG", "type": "sprite", "density": 5},
|
|
{"id": 837, "name": "MP Floor Devastator", "type": "sprite", "density": 5},
|
|
{"id": 838, "name": "Slime Hallway Tripmine 1", "type": "sprite", "density": 4},
|
|
{"id": 839, "name": "Slime Hallway Tripmine 2", "type": "sprite", "density": 4},
|
|
{"id": 867, "name": "MP Reactor Pipebombs", "type": "sprite", "density": 5},
|
|
{
|
|
"id": 870,
|
|
"density": 5,
|
|
"name": "MP Floor Protective Boots 1",
|
|
"type": "sprite",
|
|
},
|
|
{
|
|
"id": 871,
|
|
"density": 5,
|
|
"name": "MP Floor Protective Boots 2",
|
|
"type": "sprite",
|
|
},
|
|
{
|
|
"id": 872,
|
|
"density": 5,
|
|
"name": "MP Floor Protective Boots 3",
|
|
"type": "sprite",
|
|
},
|
|
{
|
|
"id": 873,
|
|
"density": 5,
|
|
"name": "MP Floor Protective Boots 4",
|
|
"type": "sprite",
|
|
},
|
|
{"id": 874, "name": "Red Room Steroids", "type": "sprite", "density": 3},
|
|
{"id": 875, "name": "Pistons Ledge Steroids", "type": "sprite", "density": 4},
|
|
{"id": 317, "name": "Secret Top of Vents", "type": "sector"},
|
|
{"id": 374, "name": "Secret Pistons Tunnel", "type": "sector"},
|
|
{"id": 378, "name": "Secret Pistons Tunnel Ledge", "type": "sector"},
|
|
{"id": 384, "name": "Secret Pistons Chamber", "type": "sector"},
|
|
{"id": 405, "name": "Secret Column", "type": "sector"},
|
|
{"id": 409, "name": "Secret Timed Blade Room", "type": "sector"},
|
|
{"id": 416, "name": "Secret Vents Wall", "type": "sector"},
|
|
{"id": 0, "name": "Exit", "type": "exit"},
|
|
]
|
|
must_dive = True
|
|
|
|
def main_region(self) -> Region:
|
|
r = self.rules
|
|
ret = self.region(
|
|
self.name,
|
|
[],
|
|
)
|
|
|
|
past_button = self.region(
|
|
"Past Button",
|
|
[
|
|
"Start Night Vision Goggles",
|
|
"Shotgun behind Babe",
|
|
"Start Armor",
|
|
"Start RPG",
|
|
"Start Atomic Health",
|
|
],
|
|
)
|
|
self.connect(ret, past_button, r.can_use)
|
|
|
|
past_door = self.region(
|
|
"Past Door",
|
|
[
|
|
"MP Floor Jetpack 1",
|
|
"MP Floor Jetpack 2",
|
|
"MP Floor Jetpack 3",
|
|
"MP Floor Jetpack 4",
|
|
"MP Floor Protective Boots 1",
|
|
"MP Floor Protective Boots 2",
|
|
"MP Floor Protective Boots 3",
|
|
"MP Floor Protective Boots 4",
|
|
"MP Floor RPG",
|
|
"MP Floor Devastator",
|
|
],
|
|
)
|
|
self.connect(past_button, past_door, r.can_open)
|
|
|
|
past_elevator = self.region(
|
|
"Past Elevator",
|
|
[
|
|
"Pistons Protective Boots",
|
|
],
|
|
)
|
|
self.connect(past_door, past_elevator, r.can_open)
|
|
|
|
# can just use a piston to clip into the center, no crouch required
|
|
pistons = self.region(
|
|
"Pistons",
|
|
[
|
|
"Pistons Ledge Steroids",
|
|
"Pistons Medkit",
|
|
"Pistons Night Vision Goggles",
|
|
"Pistons Chaingun",
|
|
"Pistons Atomic Health 1",
|
|
"Pistons Atomic Health 2",
|
|
"Pistons Tripmine 1",
|
|
"Pistons Tripmine 2",
|
|
"Pistons Tripmine 3",
|
|
"Secret Pistons Chamber",
|
|
"Secret Pistons Tunnel",
|
|
"Secret Pistons Tunnel Ledge",
|
|
"Pistons Tunnel Pipebombs 1",
|
|
"Pistons Tunnel Pipebombs 2",
|
|
],
|
|
)
|
|
# all of this stuff is on ledges
|
|
self.connect(past_elevator, pistons, r.jump)
|
|
|
|
blade_pool = self.region(
|
|
"Spinning Blade Pool",
|
|
[
|
|
"Underwater Pipebombs 1",
|
|
"Underwater Pipebombs 2",
|
|
"Secret Timed Blade Room",
|
|
"Timed Room Freezethrower",
|
|
],
|
|
)
|
|
# Need to get to the elevator switch, which requires climbing on one of the ledges at least
|
|
self.connect(pistons, blade_pool, r.can_dive & r.can_open & r.can_use)
|
|
|
|
first_level = self.region(
|
|
"First Level Platform",
|
|
[
|
|
"First Level Night Vision Goggles",
|
|
"First Level Shrinker",
|
|
"Column Armor",
|
|
"Secret Column",
|
|
"Secret Top of Vents",
|
|
"Vents Atomic Health",
|
|
"Secret Vents Wall",
|
|
"Slime Hallway Tripmine 1",
|
|
"Slime Hallway Tripmine 2",
|
|
"Red Room Steroids",
|
|
"Red Room Devastator",
|
|
"Reactor Night Vision Goggles",
|
|
"MP Reactor Pipebombs",
|
|
"MP Reactor Holo Duke",
|
|
"Top Floor Medkit",
|
|
"Top Floor Shotgun",
|
|
],
|
|
)
|
|
self.restrict("Column Armor", r.can_open)
|
|
self.connect(blade_pool, first_level, r.can_open)
|
|
# Tripclip to elevator or jetpack
|
|
self.connect(past_door, first_level, r.jetpack(100) & r.can_open)
|
|
self.connect(
|
|
pistons,
|
|
first_level,
|
|
(
|
|
r.glitched
|
|
& r.tripmine
|
|
& r.fast_sprint
|
|
& r.can_jump
|
|
& r.difficulty("extreme")
|
|
),
|
|
)
|
|
self.restrict("Secret Vents Wall", r.explosives)
|
|
# So the logic is correct if we find a way through the piston room without jump
|
|
self.restrict("Secret Top of Vents", r.jump)
|
|
self.restrict("Vents Atomic Health", r.jump)
|
|
|
|
top_floor_ledge = self.region(
|
|
"Top Floor Ledge",
|
|
[
|
|
"Top Ledge Atomic Health 1",
|
|
"Top Ledge Atomic Health 2",
|
|
"Top Ledge Jetpack",
|
|
],
|
|
)
|
|
self.connect(first_level, top_floor_ledge, r.can_sprint | r.jump)
|
|
|
|
top_floor = self.region(
|
|
"Top Floor", ["Top Floor Chaingun", "Top Floor Atomic Health", "Exit"]
|
|
)
|
|
# the full route only requires 50 jetpack fuel, the bypass to first floor uses about 90
|
|
self.connect(
|
|
first_level, top_floor, (r.can_dive & r.jetpack(50)) | r.jetpack(100)
|
|
)
|
|
self.restrict("Exit", r.can_use)
|
|
|
|
return ret
|