88 lines
2.7 KiB
Python
88 lines
2.7 KiB
Python
import logging
|
|
from typing import Set
|
|
|
|
logger = logging.getLogger("Subnautica")
|
|
|
|
from .Locations import lookup_name_to_id as locations_lookup_name_to_id
|
|
from .Items import item_table
|
|
from .Items import lookup_name_to_id as items_lookup_name_to_id
|
|
|
|
from .Regions import create_regions
|
|
from .Rules import set_rules
|
|
|
|
from BaseClasses import Region, Entrance, Location, MultiWorld, Item
|
|
from ..AutoWorld import World
|
|
|
|
|
|
class SubnauticaWorld(World):
|
|
game: str = "Subnautica"
|
|
|
|
item_name_to_id = items_lookup_name_to_id
|
|
location_name_to_id = locations_lookup_name_to_id
|
|
|
|
def generate_basic(self):
|
|
# Link regions
|
|
self.world.get_entrance('Lifepod 5', self.player).connect(self.world.get_region('Planet 4546B', self.player))
|
|
|
|
# Generate item pool
|
|
pool = []
|
|
neptune_launch_platform = None
|
|
for item in item_table:
|
|
for i in range(item["count"]):
|
|
subnautica_item = SubnauticaItem(item["name"], item["progression"], item["id"], player = self.player)
|
|
if item["name"] == "Neptune Launch Platform":
|
|
neptune_launch_platform = subnautica_item
|
|
else:
|
|
pool.append(subnautica_item)
|
|
self.world.itempool += pool
|
|
|
|
# Victory item
|
|
self.world.get_location("Aurora - Captain Data Terminal", self.player).place_locked_item(neptune_launch_platform)
|
|
self.world.get_location("Neptune Launch", self.player).place_locked_item(SubnauticaItem("Victory", True, None, player = self.player))
|
|
|
|
|
|
def set_rules(self):
|
|
set_rules(self.world, self.player)
|
|
|
|
|
|
def create_regions(self):
|
|
create_regions(self.world, self.player)
|
|
|
|
|
|
def generate_output(self, output_directory: str):
|
|
pass
|
|
|
|
|
|
def fill_slot_data(self):
|
|
slot_data = {}
|
|
return slot_data
|
|
|
|
|
|
def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None):
|
|
ret = Region(name, None, name, player)
|
|
ret.world = world
|
|
if locations:
|
|
for location in locations:
|
|
loc_id = locations_lookup_name_to_id.get(location, 0)
|
|
location = SubnauticaLocation(player, location, loc_id, ret)
|
|
ret.locations.append(location)
|
|
if exits:
|
|
for exit in exits:
|
|
ret.exits.append(Entrance(player, exit, ret))
|
|
|
|
return ret
|
|
|
|
|
|
class SubnauticaLocation(Location):
|
|
game: str = "Subnautica"
|
|
|
|
def __init__(self, player: int, name: str, address=None, parent=None):
|
|
super(SubnauticaLocation, self).__init__(player, name, address, parent)
|
|
|
|
|
|
class SubnauticaItem(Item):
|
|
game = "Subnautica"
|
|
|
|
def __init__(self, name, advancement, code, player: int = None):
|
|
super(SubnauticaItem, self).__init__(name, advancement, code, player)
|