Files
dockipelago/worlds/duke3d/levels/e3l1.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

233 lines
9.2 KiB
Python

from BaseClasses import Region
from ..base_classes import D3DLevel
class E3L1(D3DLevel):
name = "Raw Meat"
levelnum = 0
volumenum = 2
keys = ["Blue", "Red"]
location_defs = [
{"id": 78, "name": "Booth Jetpack", "type": "sprite", "density": 3},
{"id": 115, "name": "Start Ledge Chaingun", "type": "sprite", "density": 4},
{
"id": 116,
"name": "Start Ledge Atomic Health",
"type": "sprite",
"density": 1,
},
{"id": 161, "name": "Sushi Belt Atomic Health", "type": "sprite", "density": 1},
{"id": 305, "name": "Sushi Belt Freezethrower", "type": "sprite", "density": 2},
{"id": 308, "name": "Start Pit Atomic Health", "type": "sprite", "density": 0},
{"id": 309, "name": "Start Pit Pipebombs", "type": "sprite", "density": 4},
{"id": 389, "name": "Sushi Belt Steroids", "type": "sprite", "density": 4},
{"id": 452, "name": "Blue Key Card", "type": "sprite", "density": 0},
{"id": 457, "name": "Red Key Card", "type": "sprite", "density": 0},
{"id": 492, "name": "Booth Shotgun", "type": "sprite", "density": 1},
{"id": 497, "name": "Hallway Poster Shrinker", "type": "sprite", "density": 2},
{"id": 499, "name": "Booth Backroom Steroids", "type": "sprite", "density": 0},
{"id": 500, "name": "Booth Medkit", "type": "sprite", "density": 3},
{"id": 524, "name": "Karaoke RPG", "type": "sprite", "density": 0},
{"id": 536, "name": "Stove Jetpack", "type": "sprite", "density": 3},
{"id": 543, "name": "Start Pool Pipebombs", "type": "sprite", "density": 1},
{"id": 561, "name": "Sink Atomic Health", "type": "sprite", "density": 1},
{"id": 564, "name": "Kitchen Armor", "type": "sprite", "density": 0},
{"id": 569, "name": "Kitchen Vent Tripmine", "type": "sprite", "density": 3},
{
"id": 570,
"name": "Sushi Belt Night Vision Goggles",
"type": "sprite",
"density": 3,
},
{"id": 574, "name": "MP Garage Door Shotgun", "type": "sprite", "density": 5},
{"id": 575, "name": "MP Booth Chaingun", "type": "sprite", "density": 5},
{"id": 577, "name": "MP Garage Pool Medkit", "type": "sprite", "density": 5},
{"id": 608, "name": "Start Devastator", "type": "sprite", "density": 0},
{"id": 609, "name": "Start Pool Holo Duke", "type": "sprite", "density": 3},
{
"id": 624,
"name": "Sushi Belt Cupboard Pipebombs",
"type": "sprite",
"density": 2,
},
{"id": 632, "name": "Garage Door Scuba Gear", "type": "sprite", "density": 1},
{"id": 636, "name": "Hallway Armor", "type": "sprite", "density": 0},
{
"id": 656,
"name": "Night Vision Goggles behind Urn",
"type": "sprite",
"density": 3,
},
{"id": 135, "name": "Secret Geisha Wall", "type": "sector"},
{"id": 137, "name": "Secret Hallway Sign", "type": "sector"},
{"id": 161, "name": "Secret Sushi Belt Wall", "type": "sector"},
{"id": 287, "name": "Secret Wine Cabinet", "type": "sector"},
{"id": 332, "name": "Secret Sushi Belt Cupboard", "type": "sector"},
{"id": 338, "name": "Secret Hallway Wall", "type": "sector"},
{"id": 344, "name": "Secret Hallway Poster", "type": "sector"},
{"id": 0, "name": "Exit", "type": "exit"},
]
events = ["Backrooms Switch"]
must_dive = True
def main_region(self) -> Region:
r = self.rules
ret = self.region(
self.name,
[
"Start Devastator",
"Booth Jetpack",
"Booth Shotgun",
"Night Vision Goggles behind Urn",
"Secret Geisha Wall",
],
)
self.restrict("Start Devastator", r.can_open | r.crouch_jump)
self.restrict("Booth Jetpack", r.can_open)
self.restrict(
"Secret Geisha Wall", r.jump | r.can_crouch | r.difficulty("hard")
) # Can crouch into the wall from the sign or step up on an enemy
start_ledge = self.region(
"Start Ledge", ["Start Ledge Chaingun", "Start Ledge Atomic Health"]
)
# Can't seem to make this with SR50 only, can lure liztrooper to step up, easy manip
self.connect(ret, start_ledge, r.sprint | r.jump | r.difficulty("hard"))
start_pool = self.region(
"Start Pool", ["Start Pool Holo Duke", "Start Pool Pipebombs"]
)
self.connect(ret, start_pool, r.can_dive)
start_pit = self.region(
"Start Pit",
[
"Start Pit Atomic Health",
"Start Pit Pipebombs",
],
)
# Can get on these by stepping up over enemies
self.connect(ret, start_pit, r.jump | r.difficulty("hard"))
hallway_sign = self.region(
"Hallway Sign", ["Secret Hallway Sign", "Hallway Armor"]
)
# Item will be picked up if you do the clip down to the club through the wall panel
self.connect(
ret,
hallway_sign,
(r.can_open & r.jump) | (r.fast_crouch_jump & r.difficulty("hard")),
)
hallway_poster = self.region(
"Hallway Poster", ["Secret Hallway Poster", "Hallway Poster Shrinker"]
)
# Can get on these by stepping up over enemies
self.connect(ret, hallway_poster, r.can_use & (r.jump | r.difficulty("hard")))
booths = self.region(
"Booths", ["Booth Medkit", "MP Booth Chaingun", "Secret Hallway Wall"]
)
# If we could trigger the explosion from outside with a clip, could skip the open requirement
self.connect(ret, booths, r.can_open)
self.restrict("Secret Hallway Wall", r.explosives)
booth_backroom = self.region(
"Booth Backroom", ["Backrooms Switch", "Booth Backroom Steroids"]
)
self.connect(
booths,
booth_backroom,
r.can_crouch & r.jump
| (r.difficulty("medium") & r.can_jump & r.jetpack(50)),
) # can get in with just jetpack but we're stuck then, possible to clip out with jump
self.restrict("Backrooms Switch", r.can_use)
hatch_room = self.region(
"Hatching Room",
["Blue Key Card", "MP Garage Door Shotgun", "Garage Door Scuba Gear"],
)
self.connect(ret, hatch_room, self.event("Backrooms Switch"))
garage_pool = self.region(
"Garage Pool", ["MP Garage Pool Medkit", "Red Key Card"]
)
self.connect(hatch_room, garage_pool, r.can_dive)
# clipping from here to the kitchen sink was a EDuke32 only bug, I think
club_room = self.region(
"Club Room",
[
"Karaoke RPG",
# can pick up from outside, no opening doors required
"Sushi Belt Night Vision Goggles",
],
)
self.connect(
ret,
club_room,
(self.blue_key & r.can_open)
| (
r.difficulty("medium")
& ((r.glitched & r.fast_sprint & r.can_crouch) | r.crouch_jump)
),
)
sushi_belt = self.region(
"Sushi Belt", ["Sushi Belt Atomic Health", "Sushi Belt Steroids"]
)
self.connect(club_room, sushi_belt, r.jump) # there might be a way to clip up
sushi_belt_wall = self.region(
"Sushi Belt Wall", ["Secret Sushi Belt Wall", "Sushi Belt Freezethrower"]
)
self.connect(club_room, sushi_belt_wall, r.can_use)
sushi_belt_cupboard = self.region(
"Sushi Belt Cupboard",
["Secret Sushi Belt Cupboard", "Sushi Belt Cupboard Pipebombs"],
)
self.connect(
club_room, sushi_belt_cupboard, r.can_crouch & r.can_use & r.can_open
)
kitchen_vent = self.region("Kitchen Vent", ["Kitchen Vent Tripmine"])
self.connect(club_room, kitchen_vent, r.jump)
kitchen = self.region("Kitchen", ["Kitchen Armor", "Secret Wine Cabinet"])
self.connect(club_room, kitchen, r.can_open)
self.connect(kitchen, club_room, r.can_open)
self.connect(kitchen_vent, kitchen, r.true)
self.connect(kitchen, kitchen_vent, r.can_jump)
self.restrict("Secret Wine Cabinet", r.can_open)
kitchen_ledges = self.region(
"Kitchen Ledges",
[
"Stove Jetpack",
"Sink Atomic Health",
],
)
self.connect(
club_room, kitchen_ledges, r.jump
) # there might be a way to clip up the ledges
self.restrict("Stove Jetpack", r.can_open)
garage = self.region("Garage", ["Exit"])
# Tripclip never disappoints
self.connect(
club_room,
garage,
(self.red_key & r.can_open)
| (
r.difficulty("extreme")
& r.glitched
& r.sprint
& r.tripmine
& r.can_jump
),
)
self.restrict("Exit", r.jump & r.can_use)
return ret