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
303 lines
12 KiB
Python
303 lines
12 KiB
Python
from BaseClasses import Region
|
|
|
|
from ..base_classes import D3DLevel
|
|
|
|
|
|
class E2L8(D3DLevel):
|
|
name = "Dark Side"
|
|
levelnum = 7
|
|
volumenum = 1
|
|
keys = ["Blue", "Yellow"]
|
|
location_defs = [
|
|
{"id": 42, "name": "Overlord Pool Pipebombs", "type": "sprite", "density": 4},
|
|
{
|
|
"id": 156,
|
|
"name": "Beta Wall Atomic Health 1",
|
|
"type": "sprite",
|
|
"density": 2,
|
|
},
|
|
{
|
|
"id": 157,
|
|
"name": "Beta Wall Atomic Health 2",
|
|
"type": "sprite",
|
|
"density": 3,
|
|
},
|
|
{"id": 203, "name": "Overlord Pool Shrinker", "type": "sprite", "density": 3},
|
|
{"id": 206, "name": "Hatching Pipebombs", "type": "sprite", "density": 0},
|
|
{"id": 207, "name": "Surface Pipebombs", "type": "sprite", "density": 0},
|
|
{"id": 211, "name": "Spacesuit RPG", "type": "sprite", "density": 3},
|
|
{"id": 212, "name": "Outlook Devastator", "type": "sprite", "density": 4},
|
|
{"id": 226, "name": "Beta Armor", "type": "sprite", "density": 0},
|
|
{"id": 242, "name": "Beta Pipebombs", "type": "sprite", "density": 0},
|
|
{"id": 247, "name": "Reactor Control Armor", "type": "sprite", "density": 3},
|
|
{"id": 251, "name": "Babes Shotgun", "type": "sprite", "density": 0},
|
|
{"id": 257, "name": "Gamma Vent Atomic Health", "type": "sprite", "density": 3},
|
|
{"id": 261, "name": "Gamma Medkit", "type": "sprite", "density": 0},
|
|
{"id": 265, "name": "Top of Hub Chaingun", "type": "sprite", "density": 0},
|
|
{"id": 266, "name": "Hub Crate RPG", "type": "sprite"},
|
|
{
|
|
"id": 269,
|
|
"name": "Reactor Control Devastator",
|
|
"type": "sprite",
|
|
"density": 0,
|
|
},
|
|
{"id": 342, "name": "Hub Atomic Health 1", "type": "sprite", "density": 2},
|
|
{"id": 343, "name": "Hub Atomic Health 2", "type": "sprite", "density": 3},
|
|
{"id": 347, "name": "Alpha Lab Armor", "type": "sprite", "density": 3},
|
|
{"id": 348, "name": "Alpha Lab Atomic Health", "type": "sprite", "density": 0},
|
|
{"id": 359, "name": "Waste Pool Pipebombs", "type": "sprite", "density": 0},
|
|
{"id": 361, "name": "Alpha Lab Tripmine", "type": "sprite", "density": 4},
|
|
{"id": 363, "name": "Alpha Lab Pipebombs", "type": "sprite", "density": 3},
|
|
{"id": 364, "name": "Alpha Lab Medkit", "type": "sprite", "density": 0},
|
|
{"id": 372, "name": "Start Shotgun", "type": "sprite", "density": 4},
|
|
{
|
|
"id": 374,
|
|
"name": "Crumbling Canyon Atomic Health",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{
|
|
"id": 375,
|
|
"name": "Crumbling Canyon Chaingun",
|
|
"type": "sprite",
|
|
"density": 0,
|
|
},
|
|
{"id": 406, "name": "MP Tank Chaingun", "type": "sprite", "density": 5},
|
|
{"id": 407, "name": "Tank Shrinker", "type": "sprite", "density": 0},
|
|
{"id": 520, "name": "Blue Key Card", "type": "sprite", "density": 0},
|
|
{"id": 790, "name": "Hub Freezethrower", "type": "sprite", "density": 3},
|
|
{"id": 797, "name": "Hub Armor", "type": "sprite", "density": 4},
|
|
{"id": 801, "name": "Alpha Wall Devastator", "type": "sprite", "density": 2},
|
|
{"id": 836, "name": "MP Tank RPG", "type": "sprite", "density": 5},
|
|
{"id": 837, "name": "Alpha Pipebombs", "type": "sprite", "density": 4},
|
|
{"id": 843, "name": "Yellow Key Card", "type": "sprite", "density": 0},
|
|
{"id": 932, "name": "Start Armor", "type": "sprite", "density": 0},
|
|
{
|
|
"id": 952,
|
|
"name": "Outlook Night Vision Goggles",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{"id": 953, "name": "Alpha Lab Steroids", "type": "sprite", "density": 0},
|
|
{"id": 954, "name": "Alpha Lab Holo Duke", "type": "sprite", "density": 3},
|
|
{
|
|
"id": 955,
|
|
"name": "Reactor Control Protective Boots",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{
|
|
"id": 989,
|
|
"name": "Top of Hub Night Vision Goggles",
|
|
"type": "sprite",
|
|
"density": 0,
|
|
},
|
|
{"id": 990, "name": "Top of Hub Armor", "type": "sprite", "density": 4},
|
|
{"id": 991, "name": "MP Start Jetpack", "type": "sprite", "density": 5},
|
|
{
|
|
"id": 992,
|
|
"name": "MP Surface Atomic Health 1",
|
|
"type": "sprite",
|
|
"density": 5,
|
|
},
|
|
{
|
|
"id": 993,
|
|
"name": "MP Surface Atomic Health 2",
|
|
"type": "sprite",
|
|
"density": 5,
|
|
},
|
|
{"id": 994, "name": "MP Surface Steroids", "type": "sprite", "density": 5},
|
|
{"id": 995, "name": "MP Surface Jetpack", "type": "sprite", "density": 5},
|
|
{"id": 996, "name": "MP Surface Shrinker", "type": "sprite", "density": 5},
|
|
{"id": 997, "name": "MP Surface RPG", "type": "sprite", "density": 5},
|
|
{"id": 998, "name": "MP Surface Freezethrower", "type": "sprite", "density": 5},
|
|
{"id": 1007, "name": "Gamma Tripmine 1", "type": "sprite", "density": 3},
|
|
{"id": 1008, "name": "Gamma Shrinker", "type": "sprite", "density": 2},
|
|
{"id": 1009, "name": "Gamma Tripmine 2", "type": "sprite", "density": 4},
|
|
{"id": 1016, "name": "Outlook Atomic Health", "type": "sprite", "density": 0},
|
|
{"id": 1017, "name": "Babes Pipebombs 1", "type": "sprite", "density": 2},
|
|
{"id": 1018, "name": "Babes Pipebombs 2", "type": "sprite", "density": 3},
|
|
{"id": 1019, "name": "Babes Pipebombs 3", "type": "sprite", "density": 4},
|
|
{"id": 352, "name": "Secret Babes Wall", "type": "sector"},
|
|
{"id": 579, "name": "Secret Alpha Lab Tanks", "type": "sector"},
|
|
{"id": 647, "name": "Secret Hub Monitor", "type": "sector"},
|
|
{"id": 675, "name": "Secret Beta Transport Wall", "type": "sector"},
|
|
{"id": 701, "name": "Secret Alpha Cracked Wall", "type": "sector"},
|
|
{"id": 713, "name": "Secret Gamma Monitor", "type": "sector"},
|
|
{"id": 726, "name": "Secret Overlord Overhang", "type": "sector"},
|
|
{"id": 0, "name": "Exit", "type": "exit"},
|
|
{"id": 11, "name": "Secret Exit", "type": "exit"},
|
|
]
|
|
must_dive = True
|
|
|
|
def main_region(self) -> Region:
|
|
r = self.rules
|
|
ret = self.region(
|
|
self.name,
|
|
[],
|
|
)
|
|
past_door = self.region(
|
|
"Past Door",
|
|
[
|
|
"MP Start Jetpack",
|
|
"Start Armor",
|
|
"Start Shotgun",
|
|
"Hub Atomic Health 1",
|
|
"Hub Atomic Health 2",
|
|
"Hub Armor",
|
|
"Hub Freezethrower",
|
|
"Secret Hub Monitor",
|
|
"Alpha Pipebombs",
|
|
],
|
|
)
|
|
self.connect(ret, past_door, r.can_open)
|
|
# can collect the items, but not the secret trigger
|
|
self.restrict("Secret Hub Monitor", r.can_crouch)
|
|
|
|
alpha_transport = self.region(
|
|
"Alpha Transport",
|
|
[
|
|
"Alpha Lab Steroids",
|
|
"Alpha Lab Tripmine",
|
|
"Alpha Lab Medkit",
|
|
"Alpha Lab Holo Duke",
|
|
"Alpha Lab Pipebombs",
|
|
"Secret Alpha Lab Tanks",
|
|
"Crumbling Canyon Atomic Health",
|
|
"Crumbling Canyon Chaingun",
|
|
],
|
|
)
|
|
self.connect(past_door, alpha_transport, r.can_use)
|
|
|
|
alpha_wall = self.region(
|
|
"Alpha Wall", ["Secret Alpha Cracked Wall", "Alpha Wall Devastator"]
|
|
)
|
|
self.connect(past_door, alpha_wall, r.explosives)
|
|
|
|
alpha_lab_tanks = self.region(
|
|
"Alpha Lab Tanks", ["MP Tank Chaingun", "MP Tank RPG", "Tank Shrinker"]
|
|
)
|
|
self.connect(alpha_transport, alpha_lab_tanks, r.can_dive)
|
|
|
|
alpha_lab_backroom = self.region(
|
|
"Alpha Lab Backroom",
|
|
[
|
|
"Blue Key Card",
|
|
"Alpha Lab Armor",
|
|
"Alpha Lab Atomic Health",
|
|
"Waste Pool Pipebombs",
|
|
],
|
|
)
|
|
self.connect(alpha_transport, alpha_lab_backroom, r.jump)
|
|
self.restrict("Waste Pool Pipebombs", r.can_dive)
|
|
|
|
top_of_hub = self.region(
|
|
"Top of Hub",
|
|
[
|
|
"Top of Hub Night Vision Goggles",
|
|
"Top of Hub Armor",
|
|
"Hub Crate RPG",
|
|
"Top of Hub Chaingun",
|
|
"Gamma Tripmine 1",
|
|
"Gamma Tripmine 2",
|
|
],
|
|
)
|
|
self.connect(
|
|
past_door,
|
|
top_of_hub,
|
|
self.blue_key | r.jetpack(50) | (r.difficulty("medium") & r.can_jump),
|
|
)
|
|
self.restrict(
|
|
"Top of Hub Chaingun",
|
|
r.jetpack(50)
|
|
| (r.can_jump & (r.can_sprint | r.steroids | r.difficulty("medium"))),
|
|
)
|
|
|
|
gamma_transport = self.region(
|
|
"Gamma Transport",
|
|
[
|
|
"Gamma Medkit",
|
|
"Gamma Vent Atomic Health", # can just walk in from below
|
|
"Babes Shotgun",
|
|
"Reactor Control Protective Boots",
|
|
"Reactor Control Devastator",
|
|
],
|
|
)
|
|
self.connect(past_door, gamma_transport, r.can_use)
|
|
|
|
gamma_secret = self.region(
|
|
"Gamma Transport Secret", ["Secret Gamma Monitor", "Gamma Shrinker"]
|
|
)
|
|
self.connect(gamma_transport, gamma_secret, r.jump)
|
|
|
|
babes_secret = self.region(
|
|
"Cracked Wall near Babes",
|
|
[
|
|
"Secret Babes Wall",
|
|
"Babes Pipebombs 1",
|
|
"Babes Pipebombs 2",
|
|
"Babes Pipebombs 3",
|
|
],
|
|
)
|
|
self.connect(gamma_transport, babes_secret, r.jump & r.explosives)
|
|
|
|
reactor_control_ledge = self.region(
|
|
"Reactor Control Ledge", ["Reactor Control Armor", "Yellow Key Card"]
|
|
)
|
|
# can get pushed up by enemies after explosion, but a bit annoying
|
|
self.connect(
|
|
gamma_transport, reactor_control_ledge, r.jump | r.difficulty("extreme")
|
|
)
|
|
|
|
beta_pre_transport = self.region(
|
|
"Beta Pre-Transport",
|
|
[
|
|
"Beta Pipebombs",
|
|
],
|
|
)
|
|
self.connect(past_door, beta_pre_transport, self.yellow_key)
|
|
|
|
beta_transport = self.region(
|
|
"Beta Transport",
|
|
[
|
|
"Secret Beta Transport Wall",
|
|
"Beta Wall Atomic Health 1",
|
|
"Beta Wall Atomic Health 2",
|
|
"Beta Armor",
|
|
"Spacesuit RPG",
|
|
"MP Surface Atomic Health 1",
|
|
"MP Surface Atomic Health 2",
|
|
"MP Surface Steroids",
|
|
"MP Surface Jetpack",
|
|
"MP Surface Shrinker",
|
|
"MP Surface RPG",
|
|
"MP Surface Freezethrower",
|
|
"Outlook Night Vision Goggles",
|
|
"Outlook Atomic Health",
|
|
"Outlook Devastator",
|
|
"Surface Pipebombs",
|
|
],
|
|
)
|
|
|
|
self.connect(beta_pre_transport, beta_transport, r.can_use)
|
|
|
|
final_area = self.region(
|
|
"Final Area",
|
|
[
|
|
"Hatching Pipebombs",
|
|
"Overlord Pool Shrinker",
|
|
"Overlord Pool Pipebombs",
|
|
"Exit",
|
|
],
|
|
)
|
|
# can use surrounding enemies to blow up wall, but it's annoying to set up
|
|
self.connect(beta_transport, final_area, r.explosives | r.difficulty("hard"))
|
|
self.restrict("Exit", r.can_dive & r.can_use)
|
|
|
|
secret_exit = self.region(
|
|
"Overlord Overhang", ["Secret Overlord Overhang", "Secret Exit"]
|
|
)
|
|
self.connect(final_area, secret_exit, r.jump)
|
|
self.restrict("Secret Exit", r.can_use)
|
|
return ret
|