Files
dockipelago/worlds/duke3d/levels/e3l7.py
Jonathan Tinney 7971961166
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
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

190 lines
7.4 KiB
Python

from BaseClasses import Region
from ..base_classes import D3DLevel
class E3L7(D3DLevel):
name = "Fahrenheit"
levelnum = 6
volumenum = 2
keys = ["Blue", "Red", "Yellow"]
location_defs = [
{"id": 39, "name": "Pool Shotgun", "type": "sprite", "density": 3},
{
"id": 60,
"name": "Building Night Vision Goggles",
"type": "sprite",
"density": 3,
},
{"id": 77, "name": "MP Broadcast Jetpack", "type": "sprite", "density": 5},
{"id": 80, "name": "Building Freezethrower", "type": "sprite", "density": 2},
{"id": 88, "name": "Fire Station Medkit", "type": "sprite", "density": 3},
{"id": 89, "name": "Fire Truck Holo Duke", "type": "sprite", "density": 0},
{"id": 134, "name": "Blue Key Card", "type": "sprite", "density": 0},
{"id": 192, "name": "Window Medkit", "type": "sprite", "density": 3},
{"id": 202, "name": "Passage Armor", "type": "sprite", "density": 1},
{"id": 203, "name": "MP Crates Jetpack", "type": "sprite", "density": 5},
{"id": 259, "name": "Crates Atomic Health", "type": "sprite", "density": 1},
{"id": 268, "name": "Pool Ledge Pipebombs", "type": "sprite", "density": 0},
{"id": 294, "name": "Broadcast Devastator", "type": "sprite", "density": 1},
{"id": 295, "name": "Red Key Card", "type": "sprite", "density": 0},
{"id": 299, "name": "Set Chaingun", "type": "sprite", "density": 3},
{"id": 334, "name": "Wine Rack Medkit", "type": "sprite", "density": 2},
{"id": 335, "name": "Building Steroids", "type": "sprite", "density": 4},
{"id": 344, "name": "Pool Shrinker", "type": "sprite", "density": 4},
{"id": 347, "name": "Broadcast Tripmine", "type": "sprite", "density": 4},
{"id": 348, "name": "Building Tripmine", "type": "sprite", "density": 4},
{"id": 368, "name": "Exit RPG", "type": "sprite", "density": 0},
{"id": 422, "name": "Pool Medkit", "type": "sprite", "density": 4},
{"id": 426, "name": "Fire Station RPG", "type": "sprite", "density": 4},
{
"id": 429,
"name": "Fire Station Atomic Health",
"type": "sprite",
"density": 3,
},
{"id": 430, "name": "Curtain Atomic Health", "type": "sprite", "density": 2},
{"id": 431, "name": "Broadcast Shotgun", "type": "sprite", "density": 1},
{"id": 432, "name": "Yellow Key Card", "type": "sprite", "density": 0},
{"id": 111, "name": "Secret Broadcast", "type": "sector"},
{"id": 133, "name": "Secret Wine Rack", "type": "sector"},
{"id": 176, "name": "Secret Painting", "type": "sector"},
{"id": 179, "name": "Secret Curtain", "type": "sector"},
{"id": 0, "name": "Exit", "type": "exit"},
]
must_dive = True
def main_region(self) -> Region:
r = self.rules
# a big container is in our way
# can't go anywhere at the start, sad
ret = self.region(self.name, [])
# and once we get out, there's still nothing in reach just yet
start_area = self.region("Start Area", [])
# Can jump into the right side of the ceiling to clip out
self.connect(
ret,
start_area,
r.can_open | r.glitched & (r.can_jump | (r.can_crouch & r.sprint)),
)
start_ledges = self.region("Start Ledges", ["Pool Ledge Pipebombs"])
self.connect(start_area, start_ledges, r.jump)
pool = self.region(
"Pool", ["Pool Shotgun", "Pool Shrinker", "Pool Medkit", "Blue Key Card"]
)
self.connect(start_ledges, pool, r.can_dive)
exit_area = self.region("Exit Area", ["Exit RPG", "Exit"])
self.connect(pool, exit_area, self.red_key & r.can_open)
self.restrict("Exit", r.jump & r.explosives & r.can_use)
plaza = self.region("Plaza", ["Passage Armor"])
self.connect(
start_area,
plaza,
(self.blue_key & r.can_open),
)
fire_truck = self.region(
"Fire Truck", ["Fire Station Medkit", "Fire Truck Holo Duke"]
)
# pretty tricky jump off a flying lizard trooper
# extreme variant requires sr50 to make the jump
self.connect(
start_area,
fire_truck,
r.jetpack(50)
| (r.difficulty("hard") & r.can_jump & r.sprint)
| (r.difficulty("extreme") & r.can_jump),
)
# need an enforcer to jump over the fence
self.connect(
fire_truck,
plaza,
r.can_open | r.jetpack(50) | r.difficulty("hard") & r.can_jump,
)
self.connect(plaza, fire_truck, r.can_open | r.jump)
self.restrict("Fire Truck Holo Duke", r.jump)
self.restrict(
"Fire Station Medkit",
r.can_open | r.crouch_jump,
)
plaza_ledges = self.region(
"Plaza ledges",
[
"MP Crates Jetpack",
"Crates Atomic Health",
"Window Medkit",
"Building Tripmine",
"Building Night Vision Goggles",
"Building Steroids",
"Wine Rack Medkit",
"Secret Wine Rack",
],
)
self.connect(plaza, plaza_ledges, r.jump)
secret_painting = self.region(
"Painting", ["Secret Painting", "Building Freezethrower"]
)
self.connect(
plaza_ledges,
secret_painting,
r.can_open | r.glitched & r.sprint & r.can_crouch,
)
fire_station = self.region(
"Fire Station",
["Fire Station RPG", "Fire Station Atomic Health", "Yellow Key Card"],
)
# This one doesn't even require sprinting speed to clip into
# Its also possible to blow up the wall using the explosion from a drone enemy
self.connect(
fire_truck,
fire_station,
r.explosives | (r.jump & r.can_crouch) | r.difficulty("extreme"),
)
self.restrict(
"Yellow Key Card",
r.can_use | r.jetpack(50) | (r.sr50 & r.can_jump),
)
broadcast = self.region(
"Broadcast Building",
[
"Broadcast Tripmine",
"Broadcast Devastator",
],
)
self.connect(fire_truck, broadcast, self.yellow_key & r.can_open)
control_room = self.region(
"Broadcast Control Room",
["Secret Broadcast", "MP Broadcast Jetpack", "Red Key Card"],
)
self.connect(broadcast, control_room, r.can_open)
film_set = self.region(
"Film Set",
["Set Chaingun", "Curtain Atomic Health", "Secret Curtain"],
)
self.connect(broadcast, film_set, r.can_open)
broadcast_top = self.region("Top of Broadcast Building", ["Broadcast Shotgun"])
self.connect(
fire_truck,
broadcast_top,
r.jetpack(50) | (r.difficulty("medium") & r.can_jump),
)
# Roid crouch-clip to get inside the building from the top
self.connect(
broadcast_top, broadcast, r.fast_crouch_jump & r.difficulty("hard")
)
# Door is locked, not that this should ever be a limiting factor on the routing
self.connect(broadcast, broadcast_top, self.yellow_key & r.can_open)
return ret