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

188 lines
6.6 KiB
Python

from BaseClasses import Region
from ..base_classes import D3DLevel
class E2L5(D3DLevel):
name = "Occupied Territory"
levelnum = 4
volumenum = 1
keys = ["Blue", "Red"]
location_defs = [
{"id": 71, "name": "Vent RPG", "type": "sprite", "density": 2},
{"id": 85, "name": "Vent Armor", "type": "sprite", "density": 4},
{
"id": 90,
"name": "MP Center Room Freezethrower",
"type": "sprite",
"density": 5,
},
{"id": 94, "name": "Slime Room Pipebombs 1", "type": "sprite", "density": 3},
{"id": 95, "name": "Monitors Tripmine 1", "type": "sprite", "density": 3},
{"id": 96, "name": "Monitors Tripmine 2", "type": "sprite", "density": 4},
{"id": 97, "name": "MP Center Room Pipebombs", "type": "sprite", "density": 5},
{"id": 110, "name": "Blue Key Card", "type": "sprite", "density": 0},
{"id": 299, "name": "Red Key Card", "type": "sprite", "density": 0},
{
"id": 317,
"name": "Blastdoor Hole Atomic Health",
"type": "sprite",
"density": 2,
},
{"id": 346, "name": "Slime Room Devastator", "type": "sprite", "density": 0},
{"id": 365, "name": "Start Chaingun", "type": "sprite", "density": 0},
{"id": 366, "name": "Start Medkit", "type": "sprite", "density": 4},
{"id": 367, "name": "Corridor Holo Duke", "type": "sprite", "density": 0},
{"id": 369, "name": "MP Battlelord Shrinker", "type": "sprite", "density": 5},
{"id": 370, "name": "Center Room Medkit", "type": "sprite", "density": 0},
{"id": 372, "name": "Start Shotgun", "type": "sprite", "density": 3},
{"id": 373, "name": "Ramp Steroids", "type": "sprite", "density": 4},
{"id": 376, "name": "MP Large Door Jetpack", "type": "sprite", "density": 5},
{"id": 377, "name": "Slime Room Pipebombs 2", "type": "sprite", "density": 4},
{"id": 378, "name": "Monitors Atomic Health", "type": "sprite", "density": 2},
{
"id": 384,
"name": "Hallway Alcove Atomic Health",
"type": "sprite",
"density": 2,
},
{"id": 386, "name": "MP Exit RPG", "type": "sprite", "density": 5},
{
"id": 426,
"name": "Ramp Night Vision Goggles",
"type": "sprite",
"density": 3,
},
{
"id": 427,
"name": "Slime Room Night Vision Goggles",
"type": "sprite",
"density": 4,
},
{
"id": 428,
"name": "Large Door Night Vision Goggles",
"type": "sprite",
"density": 0,
},
{"id": 429, "name": "Start Armor", "type": "sprite", "density": 4},
{"id": 136, "name": "Secret Hallway Alcove", "type": "sector"},
{"id": 185, "name": "Secret Blastdoor Hole", "type": "sector"},
{"id": 225, "name": "Secret Vent", "type": "sector"},
{"id": 238, "name": "Secret Monitors", "type": "sector"},
{"id": 0, "name": "Exit", "type": "exit"},
{"id": 10, "name": "Secret Exit", "type": "exit"},
]
def main_region(self) -> Region:
r = self.rules
ret = self.region(
self.name,
[
"Start Shotgun",
"Start Chaingun",
"Start Armor",
"Start Medkit",
],
)
past_door = self.region(
"Past Door",
[
"Secret Vent",
"Vent RPG",
"Vent Armor",
"Corridor Holo Duke",
"Large Door Night Vision Goggles",
"MP Large Door Jetpack",
"Ramp Steroids",
"Ramp Night Vision Goggles",
"Slime Room Pipebombs 1",
"Slime Room Pipebombs 2",
"Slime Room Devastator",
"Red Key Card",
"Slime Room Night Vision Goggles",
],
)
self.connect(ret, past_door, r.can_open)
blastdoor_secret = self.region(
"Blastdoor Hole", ["Secret Blastdoor Hole", "Blastdoor Hole Atomic Health"]
)
# can't get a clip with only jetpack to work
self.connect(
ret, blastdoor_secret, r.can_crouch | (r.can_jump & r.difficulty("medium"))
)
hallway_alcove = self.region(
"Hallway Drone Alcove",
["Secret Hallway Alcove", "Hallway Alcove Atomic Health"],
)
self.connect(
past_door,
hallway_alcove,
r.jetpack(50)
| r.can_jump & (r.difficulty("hard") | r.can_sprint & r.steroids),
)
battlelord_room = self.region(
"Battlelord Chamber", ["MP Battlelord Shrinker", "Blue Key Card"]
)
self.connect(past_door, battlelord_room, self.red_key)
battlelord_monitors = self.region(
"Behind Monitors",
[
"Monitors Tripmine 1",
"Monitors Tripmine 2",
"Monitors Atomic Health",
"Secret Monitors",
],
)
# Can just jump through the left two-way monitor to enter
self.connect(
battlelord_room,
battlelord_monitors,
(r.jump & (r.difficulty("medium") | r.can_crouch)),
)
center_room = self.region(
"Center Room", ["MP Center Room Freezethrower", "Center Room Medkit"]
)
self.connect(
past_door,
center_room,
self.blue_key | (r.glitched & r.can_crouch & r.steroids),
)
center_room_top = self.region(
"Center Room Top", ["MP Center Room Pipebombs", "MP Exit RPG", "Exit"]
)
# Can hop onto an enemy jumping off the ledge, but this is giga cursed to time
# center_room_top: (r.difficulty("extreme") & r.can_jump)
# secret_exit: (r.difficulty("hard") & r.can_jump)
self.connect(
center_room,
center_room_top,
self.blue_key | r.jetpack(50),
)
secret_exit = self.region("Secret Exit Area", ["Secret Exit"])
self.connect(
center_room,
secret_exit,
r.jetpack(50),
)
#
self.connect(
center_room_top,
secret_exit,
r.jetpack(50)
# jump without sprint is very precise
| (r.jump & (r.difficulty("medium") | r.can_sprint))
| (r.can_sprint & r.steroids),
)
self.restrict("Secret Exit", r.can_use)
self.restrict("Exit", r.can_use)
return ret