84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
import typing
|
|
|
|
from Options import Choice, Range, DeathLink
|
|
from .Creatures import all_creatures, Definitions
|
|
|
|
|
|
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"
|
|
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]
|
|
|
|
|
|
class CreatureScans(Range):
|
|
"""Place items on specific, randomly chosen, creature scans.
|
|
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
|
|
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
|
|
|
|
|
|
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"."""
|
|
|
|
|
|
options = {
|
|
"item_pool": ItemPool,
|
|
"goal": Goal,
|
|
"creature_scans": CreatureScans,
|
|
"creature_scan_logic": AggressiveScanLogic,
|
|
"death_link": SubnauticaDeathLink,
|
|
}
|