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
233 lines
7.8 KiB
Python
233 lines
7.8 KiB
Python
from BaseClasses import Region
|
|
|
|
from ..base_classes import D3DLevel
|
|
|
|
|
|
class E3L2(D3DLevel):
|
|
name = "Bank Roll"
|
|
levelnum = 1
|
|
volumenum = 2
|
|
keys = ["Blue", "Red"]
|
|
location_defs = [
|
|
{
|
|
"id": 54,
|
|
"name": "Top of Gears Protective Boots",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{"id": 66, "name": "Start Pipebombs", "type": "sprite", "density": 3},
|
|
{
|
|
"id": 85,
|
|
"name": "Vending Machine Atomic Health",
|
|
"type": "sprite",
|
|
"density": 3,
|
|
},
|
|
{"id": 96, "name": "ATM Chaingun", "type": "sprite", "density": 2},
|
|
{"id": 106, "name": "Pillar Pipebombs", "type": "sprite", "density": 3},
|
|
{"id": 223, "name": "Bank Phone Holo Duke", "type": "sprite", "density": 2},
|
|
{
|
|
"id": 264,
|
|
"name": "Dumpster Trashcan Steroids",
|
|
"type": "sprite",
|
|
"sprite_type": "trashcan",
|
|
"density": 3,
|
|
},
|
|
{"id": 265, "name": "Dumpster Medkit", "type": "sprite", "density": 0},
|
|
{"id": 354, "name": "Top of Gears Jetpack", "type": "sprite", "density": 3},
|
|
{"id": 355, "name": "Red Key Card", "type": "sprite", "density": 0},
|
|
{"id": 424, "name": "Start Shotgun", "type": "sprite", "density": 4},
|
|
{"id": 425, "name": "Start Ledge RPG", "type": "sprite", "density": 0},
|
|
{"id": 440, "name": "Blue Key Card", "type": "sprite", "density": 0},
|
|
{
|
|
"id": 484,
|
|
"name": "Office Painting Devastator",
|
|
"type": "sprite",
|
|
"density": 2,
|
|
},
|
|
{"id": 503, "name": "Bank Painting Jetpack", "type": "sprite", "density": 2},
|
|
{"id": 506, "name": "Office Steroids", "type": "sprite", "density": 4},
|
|
{
|
|
"id": 507,
|
|
"name": "Office Entrance Freezethrower",
|
|
"type": "sprite",
|
|
"density": 1,
|
|
},
|
|
{"id": 511, "name": "Switch Shrinker", "type": "sprite", "density": 1},
|
|
{
|
|
"id": 512,
|
|
"name": "Office Entrance Pipebombs",
|
|
"type": "sprite",
|
|
"density": 3,
|
|
},
|
|
{"id": 516, "name": "Office Ledge Armor", "type": "sprite", "density": 3},
|
|
{
|
|
"id": 517,
|
|
"name": "Office Far Ledge Atomic Health",
|
|
"type": "sprite",
|
|
"density": 0,
|
|
},
|
|
{
|
|
"id": 518,
|
|
"name": "Office Far Ledge Tripmine 1",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{
|
|
"id": 519,
|
|
"name": "Office Far Ledge Tripmine 2",
|
|
"type": "sprite",
|
|
"density": 4,
|
|
},
|
|
{"id": 533, "name": "Exit Medkit", "type": "sprite", "density": 0},
|
|
{"id": 537, "name": "Gear Protective Boots", "type": "sprite", "density": 3},
|
|
{"id": 539, "name": "Gear Atomic Health", "type": "sprite", "density": 2},
|
|
{"id": 17, "name": "Secret Bank Phone", "type": "sector"},
|
|
{"id": 119, "name": "Secret ATM", "type": "sector"},
|
|
{"id": 190, "name": "Secret Office Painting", "type": "sector"},
|
|
{"id": 208, "name": "Secret Bank Painting", "type": "sector"},
|
|
{"id": 235, "name": "Secret Gears Breakable Wall", "type": "sector"},
|
|
{"id": 0, "name": "Exit", "type": "exit"},
|
|
]
|
|
|
|
def main_region(self) -> Region:
|
|
r = self.rules
|
|
ret = self.region(
|
|
self.name,
|
|
[
|
|
"Dumpster Medkit",
|
|
"Start Pipebombs",
|
|
"Start Shotgun",
|
|
"Dumpster Trashcan Steroids",
|
|
"Pillar Pipebombs",
|
|
"Start Ledge RPG",
|
|
# Door opens once automatically, don't need Open to get inside
|
|
"Office Entrance Pipebombs",
|
|
"Office Entrance Freezethrower",
|
|
"Vending Machine Atomic Health",
|
|
],
|
|
)
|
|
self.restrict(
|
|
"Start Ledge RPG",
|
|
r.jetpack(50) | (r.can_jump & r.sprint)
|
|
# need specifically an enforcer to jump up
|
|
| (r.difficulty("hard") & r.can_jump),
|
|
)
|
|
self.restrict("Vending Machine Atomic Health", r.jump)
|
|
|
|
office = self.region(
|
|
"Office", ["Blue Key Card", "Office Steroids", "Office Ledge Armor"]
|
|
)
|
|
self.connect(ret, office, r.can_open | r.jetpack(50))
|
|
|
|
far_ledge = self.region(
|
|
"Office Far Ledge",
|
|
[
|
|
"Office Far Ledge Atomic Health",
|
|
"Office Far Ledge Tripmine 1",
|
|
"Office Far Ledge Tripmine 2",
|
|
],
|
|
)
|
|
self.connect(
|
|
office, far_ledge, r.jump | r.sprint
|
|
) # Can maybe SR50 the gap from the other ledge
|
|
|
|
office_ledges = self.region(
|
|
"Office Ledges",
|
|
[
|
|
"Office Painting Devastator",
|
|
"Secret Office Painting",
|
|
],
|
|
)
|
|
self.connect(office, office_ledges, r.jump)
|
|
|
|
atm = self.region(
|
|
"ATM",
|
|
["ATM Chaingun", "Secret ATM"],
|
|
)
|
|
self.connect(
|
|
ret,
|
|
atm,
|
|
# need double sprint speed to clip without squishing
|
|
(r.can_open | r.glitched & r.fast_sprint & r.can_crouch)
|
|
& (r.jump | (r.difficulty("medium") & r.sprint)),
|
|
) # Can run off the ledge, timing is a bit tricky with steroids + no run
|
|
|
|
bank = self.region("Bank Entrance")
|
|
# Difficult trip clip
|
|
self.connect(
|
|
ret,
|
|
bank,
|
|
(self.blue_key & r.can_open)
|
|
| (
|
|
r.difficulty("extreme")
|
|
& r.glitched
|
|
& r.can_jump
|
|
& r.fast_sprint
|
|
& r.tripmine
|
|
),
|
|
)
|
|
|
|
bank_phone = self.region(
|
|
"Bank Phone Secret",
|
|
[
|
|
"Bank Phone Holo Duke",
|
|
"Secret Bank Phone",
|
|
],
|
|
)
|
|
self.connect(bank, bank_phone, r.jump)
|
|
|
|
bank_painting = self.region(
|
|
"Bank Painting Secret",
|
|
[
|
|
"Secret Bank Painting",
|
|
"Bank Painting Jetpack",
|
|
],
|
|
)
|
|
self.connect(
|
|
bank,
|
|
bank_painting,
|
|
r.jump & (r.can_open | (r.glitched & r.can_crouch & r.sprint)),
|
|
)
|
|
|
|
bank_backroom = self.region("Bank Backroom", ["Switch Shrinker"])
|
|
self.connect(bank, bank_backroom, r.can_open)
|
|
self.restrict("Switch Shrinker", r.jump)
|
|
|
|
gears = self.region(
|
|
"Gear Room",
|
|
["Gear Protective Boots"],
|
|
)
|
|
# the trigger plates are just a bit too tall
|
|
self.connect(bank_backroom, gears, r.jump)
|
|
|
|
top_of_gears = self.region(
|
|
"Top of Gears",
|
|
["Top of Gears Protective Boots", "Top of Gears Jetpack", "Red Key Card"],
|
|
)
|
|
# can SR50 clip onto moving gear without sprint speed
|
|
self.connect(
|
|
gears,
|
|
top_of_gears,
|
|
r.can_open
|
|
| r.jetpack(100)
|
|
| r.glitched & ((r.difficulty("medium") & r.sprint) | r.difficulty("hard")),
|
|
)
|
|
|
|
gears_secret = self.region(
|
|
"Gears Secret", ["Secret Gears Breakable Wall", "Gear Atomic Health"]
|
|
)
|
|
self.connect(gears, gears_secret, r.explosives)
|
|
|
|
vault = self.region("Bank Vault", ["Exit Medkit", "Exit"])
|
|
# Can shoot rockets through the wall corner, precise setup and deadly if you get it wrong
|
|
self.connect(
|
|
bank_backroom,
|
|
vault,
|
|
(self.red_key & r.can_open)
|
|
| (r.glitched & r.difficulty("hard") & (r.rpg | r.devastator)),
|
|
)
|
|
self.connect(gears_secret, vault, r.pipebomb) # Can throw through crack
|
|
self.restrict("Exit", r.can_use)
|
|
|
|
return ret
|