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
227 lines
7.6 KiB
Python
227 lines
7.6 KiB
Python
from BaseClasses import Region
|
|
|
|
from ..base_classes import D3DLevel
|
|
|
|
|
|
class E4L7(D3DLevel):
|
|
name = "XXX-Stacy"
|
|
levelnum = 6
|
|
volumenum = 3
|
|
keys = ["Red", "Blue"]
|
|
location_defs = [
|
|
{"id": 8, "name": "Crusher Scuba Gear", "type": "sprite", "density": 0},
|
|
{"id": 29, "name": "Blue Holo Duke", "type": "sprite", "density": 4},
|
|
{"id": 34, "name": "Crate Freezethrower", "type": "sprite", "density": 2},
|
|
{"id": 35, "name": "MP Front Jetpack", "type": "sprite", "density": 5},
|
|
{"id": 37, "name": "Blue Apt. Pipebombs", "type": "sprite", "density": 3},
|
|
{
|
|
"name": "Printer Trashcan Pipebombs",
|
|
"id": 39,
|
|
"type": "sprite",
|
|
"sprite_type": "trashcan",
|
|
"density": 4,
|
|
},
|
|
{"id": 83, "name": "Front Upper Armor", "type": "sprite", "density": 3},
|
|
{"id": 84, "name": "Front Upper Atomic Health", "type": "sprite", "density": 4},
|
|
{"id": 110, "name": "Crusher RPG", "type": "sprite", "density": 3},
|
|
{"id": 112, "name": "Crusher Medkit", "type": "sprite", "density": 4},
|
|
{"id": 165, "name": "Blue Key Card", "type": "sprite", "density": 0},
|
|
{"id": 166, "name": "Cola Tripmine 1", "type": "sprite", "density": 0},
|
|
{"id": 167, "name": "Cola Tripmine 2", "type": "sprite", "density": 3},
|
|
{"id": 170, "name": "Blue Devastator", "type": "sprite", "density": 3},
|
|
{"id": 176, "name": "Outside Pipebombs", "type": "sprite", "density": 0},
|
|
{"id": 177, "name": "Front Chaingun", "type": "sprite", "density": 3},
|
|
{"id": 186, "name": "Front Protective Boots", "type": "sprite", "density": 0},
|
|
{"id": 195, "name": "Blue Secret Shrinker", "type": "sprite", "density": 2},
|
|
{"id": 207, "name": "MP Outside Shotgun", "type": "sprite", "density": 5},
|
|
{"id": 216, "name": "Blue Atomic Health", "type": "sprite", "density": 0},
|
|
{
|
|
"id": 245,
|
|
"name": "Blue Night Vision Goggles",
|
|
"type": "sprite",
|
|
"density": 0,
|
|
},
|
|
{"id": 322, "name": "Blue Medkit", "type": "sprite", "density": 0},
|
|
{"id": 331, "name": "Front Steroids", "type": "sprite", "density": 0},
|
|
{"id": 365, "name": "MP Blue Jetpack", "type": "sprite", "density": 5},
|
|
{"id": 372, "name": "Red Key Card", "type": "sprite", "density": 0},
|
|
{"id": 420, "name": "Blue Shotgun", "type": "sprite", "density": 0},
|
|
{
|
|
"name": "Blue Apt. Trashcan Devastator",
|
|
"id": 528,
|
|
"type": "sprite",
|
|
"sprite_type": "trashcan",
|
|
"density": 4,
|
|
},
|
|
{"id": 591, "name": "Blue Apt. RPG", "type": "sprite", "density": 2},
|
|
{"id": 65, "name": "Secret Blue Area", "type": "sector"},
|
|
{"id": 232, "name": "Secret Crate", "type": "sector"},
|
|
{"id": 265, "name": "Secret Blue Appartment", "type": "sector"},
|
|
{"id": 0, "name": "Exit", "type": "exit"},
|
|
]
|
|
must_dive = True
|
|
events = ["Raise Waterlevel"]
|
|
|
|
def main_region(self) -> Region:
|
|
r = self.rules
|
|
ret = self.region(
|
|
self.name,
|
|
[
|
|
"MP Outside Shotgun",
|
|
"Outside Pipebombs",
|
|
],
|
|
)
|
|
|
|
past_door = self.region(
|
|
"Past Door",
|
|
[
|
|
"Front Protective Boots",
|
|
"Front Chaingun",
|
|
"Front Steroids",
|
|
"MP Front Jetpack",
|
|
"Printer Trashcan Pipebombs",
|
|
],
|
|
)
|
|
self.restrict("Front Protective Boots", r.can_open)
|
|
# This requires a total of 3 tripclips, should this even be in logic?
|
|
self.connect(
|
|
ret,
|
|
past_door,
|
|
r.can_open
|
|
| (
|
|
r.glitched
|
|
& r.tripmine
|
|
& r.fast_sprint
|
|
& r.can_jump
|
|
& r.difficulty("extreme")
|
|
),
|
|
)
|
|
|
|
front_upper = self.region(
|
|
"Front Upper",
|
|
[
|
|
"Front Upper Armor",
|
|
"Front Upper Atomic Health",
|
|
"Blue Key Card",
|
|
],
|
|
)
|
|
self.connect(past_door, front_upper, r.jump)
|
|
|
|
crate_secret = self.region(
|
|
"Crate Secret",
|
|
[
|
|
"Secret Crate",
|
|
"Crate Freezethrower",
|
|
],
|
|
)
|
|
# can't fit with just jetpack
|
|
self.connect(past_door, crate_secret, r.can_jump)
|
|
|
|
blue_key_area = self.region(
|
|
"Blue Key Area",
|
|
[
|
|
"Blue Medkit",
|
|
"Blue Shotgun",
|
|
"MP Blue Jetpack",
|
|
],
|
|
)
|
|
# Special crouch clip with jetpack included.
|
|
self.connect(
|
|
past_door,
|
|
blue_key_area,
|
|
(self.blue_key & r.jump)
|
|
| (
|
|
r.difficulty("hard")
|
|
& (
|
|
r.fast_crouch_jump
|
|
| (r.glitched & r.jump & r.fast_sprint & r.can_crouch)
|
|
)
|
|
),
|
|
)
|
|
|
|
water_control = self.region(
|
|
"Water Control Area",
|
|
[
|
|
"Red Key Card",
|
|
"Blue Holo Duke",
|
|
"Blue Devastator",
|
|
"Blue Atomic Health",
|
|
"Raise Waterlevel",
|
|
],
|
|
)
|
|
self.restrict("Raise Waterlevel", r.can_use)
|
|
self.restrict("Blue Atomic Health", r.can_open)
|
|
self.connect(blue_key_area, water_control, r.can_open | r.can_dive)
|
|
|
|
blue_apt = self.region(
|
|
"Blue Apt.",
|
|
[
|
|
"Secret Blue Appartment",
|
|
"Blue Apt. RPG",
|
|
"Blue Apt. Pipebombs",
|
|
"Blue Apt. Trashcan Devastator",
|
|
],
|
|
)
|
|
# SR50 jump possible for reaching the apartment
|
|
self.connect(blue_key_area, blue_apt, (r.sr50 & r.can_jump) | r.jump)
|
|
|
|
blue_dive = self.region(
|
|
"Blue Dive Area",
|
|
[
|
|
"Blue Night Vision Goggles",
|
|
],
|
|
)
|
|
self.restrict("Blue Night Vision Goggles", r.can_open)
|
|
# Crouchjump through window skips dive and jetpack requirement
|
|
self.connect(
|
|
blue_key_area,
|
|
blue_dive,
|
|
(r.can_dive & (self.event("Raise Waterlevel") | r.jetpack(50)))
|
|
| r.crouch_jump,
|
|
)
|
|
|
|
cola_machine = self.region(
|
|
"Blue Dive Area",
|
|
[
|
|
"Cola Tripmine 1",
|
|
"Cola Tripmine 2",
|
|
],
|
|
)
|
|
self.connect(blue_dive, cola_machine, r.jump)
|
|
|
|
blue_secret = self.region(
|
|
"Secret Blue Area",
|
|
[
|
|
"Blue Secret Shrinker",
|
|
"Secret Blue Area",
|
|
],
|
|
)
|
|
# Clip on top of trashcan and strafe around to secret
|
|
# Either we can lower the water level with use
|
|
# or we got here by not raising it (jetpack)
|
|
self.connect(
|
|
blue_dive,
|
|
blue_secret,
|
|
(r.can_use | r.jetpack(50))
|
|
& (r.jump | (r.sr50 & r.can_open & r.difficulty("hard"))),
|
|
)
|
|
|
|
dive_crusher = self.region(
|
|
"Dive Crusher",
|
|
[
|
|
"Crusher Scuba Gear",
|
|
"Crusher RPG",
|
|
"Crusher Medkit",
|
|
],
|
|
)
|
|
self.connect(blue_dive, dive_crusher, r.can_dive)
|
|
|
|
red_key_area = self.region(
|
|
"Red Key Area",
|
|
[
|
|
"Exit",
|
|
],
|
|
)
|
|
self.connect(blue_dive, red_key_area, self.red_key & r.can_open & r.can_use)
|
|
return ret
|