Archipelago/worlds/subnautica/Options.py

117 lines
4.0 KiB
Python
Raw Normal View History

import typing
from Options import Choice, Range, DeathLink, DefaultOnToggle
from .Creatures import all_creatures, Definitions
2021-09-17 02:32:36 +00:00
class SwimRule(Choice):
"""What logic considers ok swimming distances.
Easy: +200 depth from any max vehicle depth.
Normal: +400 depth from any max vehicle depth.
Warning: Normal can expect you to death run to a location (No viable return trip).
Hard: +600 depth from any max vehicle depth.
Warning: Hard may require bases, deaths, glitches, multi-tank inventory or other depth extending means.
Items: Expected depth is extended by items like seaglide, ultra glide fins and capacity tanks.
"""
display_name = "Swim Rule"
option_easy = 0
option_normal = 1
option_hard = 2
option_items_easy = 3
option_items_normal = 4
option_items_hard = 5
@property
def base_depth(self) -> int:
return [200, 400, 600][self.value % 3]
@property
def consider_items(self) -> bool:
return self.value > 2
class EarlySeaglide(DefaultOnToggle):
display_name = "Early Seaglide"
"""Make sure 2 of the Seaglide Fragments are available in or near the Safe Shallows (Sphere 1 Locations)."""
2021-09-17 02:32:36 +00:00
class ItemPool(Choice):
"""Valuable item pool leaves all filler items in their vanilla locations and
creates random duplicates of important items into freed spots."""
display_name = "Item Pool"
2021-09-17 02:32:36 +00:00
option_standard = 0
option_valuable = 1
class Goal(Choice):
"""Goal to complete.
Launch: Leave the planet.
Free: Disable quarantine.
Infected: Reach maximum infection level.
Drive: Repair the Aurora's Drive Core"""
auto_display_name = True
display_name = "Goal"
option_launch = 0
option_free = 1
option_infected = 2
option_drive = 3
def get_event_name(self) -> str:
return {
self.option_launch: "Neptune Launch",
self.option_infected: "Full Infection",
self.option_free: "Disable Quarantine",
self.option_drive: "Repair Aurora Drive"
}[self.value]
2022-07-16 14:45:40 +00:00
class CreatureScans(Range):
"""Place items on specific, randomly chosen, creature scans.
2022-07-16 14:45:40 +00:00
Warning: Includes aggressive Leviathans."""
display_name = "Creature Scans"
range_end = len(all_creatures)
class AggressiveScanLogic(Choice):
"""By default (Stasis), aggressive Creature Scans are logically expected only with a Stasis Rifle.
Containment: Removes Stasis Rifle as expected solution and expects Alien Containment instead.
Either: Creatures may be expected to be scanned via Stasis Rifle or Containment, whichever is found first.
None: Aggressive Creatures are assumed to not need any tools to scan.
Removed: No Creatures needing Stasis or Containment will be in the pool at all.
Note: Containment, Either and None adds Cuddlefish as an option for scans.
Note: Stasis, Either and None adds unhatchable aggressive species, such as Warper.
Note: This is purely a logic expectation, and does not affect gameplay, only placement."""
display_name = "Aggressive Creature Scan Logic"
option_stasis = 0
option_containment = 1
option_either = 2
option_none = 3
option_removed = 4
def get_pool(self) -> typing.List[str]:
if self == self.option_removed:
return Definitions.all_creatures_presorted_without_aggressive_and_containment
elif self == self.option_stasis:
return Definitions.all_creatures_presorted_without_containment
elif self == self.option_containment:
return Definitions.all_creatures_presorted_without_stasis
else:
return Definitions.all_creatures_presorted
2022-07-21 13:39:34 +00:00
class SubnauticaDeathLink(DeathLink):
"""When you die, everyone dies. Of course the reverse is true too.
Note: can be toggled via in-game console command "deathlink"."""
2021-09-17 02:32:36 +00:00
options = {
"swim_rule": SwimRule,
"early_seaglide": EarlySeaglide,
"item_pool": ItemPool,
"goal": Goal,
2022-07-21 13:39:34 +00:00
"creature_scans": CreatureScans,
"creature_scan_logic": AggressiveScanLogic,
2022-07-21 13:39:34 +00:00
"death_link": SubnauticaDeathLink,
2021-09-17 02:32:36 +00:00
}